Index: /changelog
===================================================================
--- /changelog	(revision 8528)
+++ /changelog	(revision 5261)
@@ -1,671 +1,826 @@
-4.0.0 / 5259
- - Feature - Produktbilder - Mehrfacher Upload mÃ¶glich
- - Feature - Produktbilder - Bilder unter /wpsg verschoben (!)
- - Feature - Produktbilder - Einzelnes lÃ¶schen des Bildercaches fÃŒr ein Produkt
- - Feature - Produktbilder - in Mediathek gespeichert
- - Feature - Produktbilder - Mehrfachupload aus Mediathek in Produkt mÃ¶glich
- - Feature - Produktbilder - Drag& Drop ermÃ¶glicht die Auswahl des Vorschaubildes (erstes Produktbild)
- - Feature - Produkte kÃ¶nnen als Entwurf gespeichert (nicht verÃ¶ffentlicht) werden
- - Feature - Exportprofile - Export mit Produktbildern mÃ¶glich
- - Feature - Vorkasse - QR-Code im Bestellablauf integriert
- - Feature - Modul Bestellupload realisiert - ermÃ¶glicht Upload von Dateien innerhalb des Bestellablaufs
+3.0.1 / 1528
+ - Produktgruppeninfo Seite wird korrekt verlinkt
+ - Fehler im Importscript (Texte aus Rechnungsmodul)
+ - Fehler im Modul Versandkostenfrei wurde behoben
+ - Fehler in Kombination Rabatt / MwSt.. Berechnung wurde korrigiert
+ - Korrektur von fehlerhaft importierten Einstellungen
+ - VersionsÃŒberprÃŒfung alternativ durch curl, um KompatibilitÃ€t zu verbessern
+ - VerÃ€nderte Templates:
+   - views/mods/mod_productgroups/show.phtml
+ 
+#3.0.2 / 1528
+ - Kundendaten werden richtig gespeichert
+ 
+#3.0.3 / 1528
+ - Gutscheine lÃ¶schbar/exportierbar
+ - Fehler im Updatemechanismus korrigiert
+ - Artikelnummer wird automatisch vergeben wenn nicht gesetzt (die Produkt ID)
+ - Fehler bei Produktgruppenzuweisung und gelÃ¶schten Produktgruppen behoben
+ - Warenkorb wird auf BestellbestÃ€tigungsseite nicht mehr mit Produkten angezeigt
+ - Downloadplus in DownloadPlus umbenannt
+ - Fehler bei Auswahl innerhalb der Bestellvariablen behoben
+ - Automatische Auswahl der Versand/Zahlung bei nur einer MÃ¶glichkeit
+ - Gutscheinberechnung und -anzeige ÃŒberarbeitet 
+ - Kunden Im- und Export ÃŒber CSV
+ - Rechnungsmofunktioniert nun auch unter Multiblog
+ - Interne FunktionsÃ€nderung (array_merge Problem)
+ - Template Kommentare korrigiert
+ - Rechnungsmodul Mail an Kunde mit richtigen Anhang (*.pdf) 
+ - Lizenz im Multiblog aktivierbar
+ - Alternative Funktion um Neue Modulversionen zu installieren (KompatibilitÃ€t)
+ - Bestellvariablen werden wieder angezeigt, betritt man den checkout erneut
+ - Hilfetexte ÃŒberarbeitet/erweitert
+ - Kundenvariablen lassen sich einzeln einbinden und somit positionieren
+ - fehlerhaften Link zum Downloadprodukt in wpsg_mod_downloadprodukte korrigiert
+ - Infofeld zum Pfad der upload Dateien fÃŒr wpsg_mod_downloadprodukte korrigiert
+ - .htaccess Schutz fÃŒr Dateien im uploaddir fÃŒr wpsg_mod_downloadprodukte
+ - Modul Versandkostenfrei arbeitet jetzt richtig
+ - Modul Kundenverwaltung berichtigte checkout Weiterleitung
+ - verÃ€nderte Templates:
+   - views/mods/mod_gutschein/index.phtml
+   - views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml (Hilfe)   
+   - views/mods/mod_ordervars/checkout_inner_prebutton.phtml (Anzeige der Werte, Auswahl)
+   - views/mods/mod_kundenverwaltung/index.phml (Im/Export)
+   - views/mods/mod_kundenverwaltung/import.phtml (NEU)
+   - views/mods/mod_rechnungen/rechnung_pdf.phtml (Lieferadresse != Rechnungsadresse)
+   - views/mods/mod_prepayment/order_done.phtml (Betreff der Ãberweisung)
+   - views/produkt/index.php (Im/Export)
+   - views/warenkorb/checkout2.phtml (auomatische Auswahl)
+   - views/warenkorb/overview.phtml (Rechnungs u. Lieferanschrift)    
+   - views/admin/kundendaten_codeinfo.phtml (NEU)
+   - views/admin/kundendaten_renderfield.phtml (NEU)   
+   - views/produkt/addedit.phtml (Hilfe)
+   - views/mailtemplates/adminmail.phtml (Nachname diff. Lieferadresse)
+   - views/mailtemplates/kundenmail.phtml (Nachname diff. Lieferadresse)   
+   
+#3.0.4 / 1638
+ - Fehlermeldung bei nicht akzeptierung der AGB angepasst
+ - Fehlermeldung bei Lizenzaktivierung erweitert
+ - Interne AblÃ€ufe geÃ€ndert um Probleme bei bestimmten Serverkonfigurationen zu lÃ¶sen (subMwSt)
+ - Korrektur im Rechnungsmodul (array_merge Problem)
+ - CSS/JS fÃŒr die Validierung optional inkludierbar
+ - Zahlvariante Vorkasse, Betreff richtig ersetzen
+ - AuftragsbestÃ€tigung sendet nur eine Mail 
+    
+#3.0.5 / 1662
+ - UpdateprÃŒfung optimiert  
+ - Bestellungen lassen sich lÃ¶schen (Einzel und Mehrere gleichzeitig) 
+ - Optimierung beim einbinden der Bibliotheken fÃŒr das Produktartikelmodul
+ - Backendansicht der Dateien von wpsg_mod_downloadprodukte ÃŒberarbeitet (.htaccess Schutz)
+ - ÃberflÃŒssige Option bei SofortÃŒberweisung entfernt
+ - Korrektur der wpsg_copy, damit auch leere Ordner kopiert und angelegt werden
+ - Korrektur in Kundenmailtemplate (Ausgabe von "1" durch CallMods)
+ - "Apply Filter nicht Anwenden" Option lÃ€sst sich speichern
+ - Option "RTE Felder mit nl2br ausgeben" eingebaut  
+ - Sollte der user_view/lang Ordner leer sein wird er angelegt beim Update
+ - Layout Korrektur GutscheinÃŒbersicht
+ - Korrektur der Variantenartikelnummeranzeige in den Mails
+ - Gutschein wird bei Initialisierung aus DB korrekt betrachtet
+ - Korrekte Meldung bei Ãberschreitung der Downloads wird angezeigt
+ - Downloadprodukte bei mehreren Downloads/Bestellten Produkten ÃŒberprÃŒft
+ - RequestURI als ProduktURL verwenden (Optional in den Einstellungen, wenn kein Produktartikel zugeordnet und mod_produktartikel nicht aktiv)
+ - LÃ€nder werden in Zusammenfassung mit ausgegeben
+ - Installierte Module bleiben beim Update erhalten 
 
-#4.0.0
-- Bugfix - Rechtschreibfehler
-- Bugfix - Bestellverwaltung FÃŒllmenge nicht in WPSG_TBL_ORDERPRODUCT
-- Buffix - PayPal nimmt jezt Daten aus der Versandadresse (shipping_address) und nicht mehr die Rechnungsadresse (billing_address)
-- Feature - Produktname in Produktverwaltung
-- Feature - Anzeige von angepassten Templates auf der "Ãber" Seite (Wenn Userviews aktiv)
-- Feature - Produkttemplates werden jetzt auch im Child Theme gesucht und verwendet
-- Feature - Darstellung PayPalPlus Bestellbackend
-- Feature - Darstellung Trusted Shops Bestellbackend
-- Feature - Bestelldaten in Kopf der Bestellansicht
-- Feature - Kundenkommentar in Bestallansicht
+#3.0.6 / 1673
+ - Meldung in Lizenzverwaltung wenn SOAP nicht aktiv ist
+ - URL der Hilfe zum Rechnungsmodul korrigiert
+ - Ausgabe der Ãbersetzten Versand/Zahlungs Hinweise
+ - Benutzerdefinierte Kundendaten werden erfasst und kÃ¶nnen ÃŒber CodeblÃ¶cke in Templates verwendet werden
+ - Beim HinzufÃŒgen zum Warenkorb in einer anderen Sprache wird nicht mehr zur Defaultsprache gewechselt
+ - Logo SofortÃŒberweisung den neuen Richtlinien angepasst
+ - "Bestellungen lÃ¶schen" ist nich mehr vom Rechnungsmodul abhÃ€ngig
+ - Benutzerdefinierte Kundendaten werden in Bestellansicht angezeigt
+ - Click&Buy Modul verfÃŒgbar
+ - Ãbersetzungsdatei (translation.phtml) wird auch bei mehrzeiligen Texten korrekt angelegt 
+  
+#3.0.7 / 1710
+ - Pager und FiltermÃ¶glichkeit fÃŒr GutscheinÃŒbersicht
+ - Kommentar zu Gutscheinen mÃ¶glich
+ - Ersetzungsfunktion erweitert
+ - PayPal erstellt jetzt LogEintrag bei Fehlerhafter Zahlung
+ - Sprache im PayPal Interface bestimmbar
+ - Produkte werden in der Deinstallationsroutine korrekt gezÃ€hlt 
+ - Problem mit deaktivierten short_open_tag gelÃ¶st.
+ - Korrektur in AuftragsbestÃ€tigung (Widerruf, Anzeige KNR,ONR,Datum) 
+ - Problem mit deaktivierten short_open_tag gelÃ¶st.
+ - Modul Versandadresse ÃŒberarbeitet -> korrekter Reset nach Bestellung
+ - Formular fÃŒr Versandadresse um das Feld Anrede (title) ergÃ€nzt 
+ - Beim Aktivieren des Exportmoduls wird ein standardmÃ€Ãiger Export erzeugt
+ - mod_kundenkontakt arbeitet jetzt auch mit eigenen Templ. in den user_views
+ - Kundenmail und Adminmail enthalten jetzt wieder die Art. Nr.
+ - Button "zurÃŒck zur Kasse" leitet auf die "checkout" Seite und nicht mehr in den Warenkorb
+ - Korrekte Verlinkung auf das Produkt im Warenkorbwidget
+ - KostenschlÃŒssel kann nun auch mit , statt . definiert werden (Gewicht)
+ - Ãnderung am automatischen Update nachinstallierter Module
+ - FÃŒllmenge bezieht sich auf die BezugsgrÃ¶Ãe
+ - Laden und Speichern von Einstellungen ist wieder mÃ¶glich
+ - Bei gelÃ¶schter oder nicht angelegter Versandzone wird dies in der LÃ€nderverwaltung angezeigt
+ - Schreibfehler korrigiert
+ - Korrektur der Bildanzeige im Ausverkauft Template
+ - GelÃ¶schte Bilder machen bei Varianten keine Probleme mehr
+ 
+#3.0.8 / 1724
+ - Funktionen im Warenbestandsmodul korrigiert (Negative ZÃ€hlung)
+ - Sicherheitsoptimierungen
+ - Funktion "User views" ignorieren arbeitet nun auch bei Produkttemplates
+ - FÃŒllmenge wird im Ausverkauft Template korrekt angezeigt
+ - KompatibilitÃ€t mit codestyling-localization verbessert
+ 
+#3.0.9 / 1818
+ - Fehlermeldung bei fehlerhafter Modulaktivierung erweitert
+ - Footer in Statusmail analog zu den anderen Kundenmails
+ - Versandkosten in den Mails korrekt eingerÃŒckt
+ - Login/ Logout- Widget Multisite redirect angepasst
+ - Mails werden in der Sprache des Users versendet
+ - Bestellvariablen kÃ¶nnen wieder gelÃ¶scht werden
+ - Link auf BestellabschluÃseite als Zahlungslink in PayPal und SofortÃŒberweisung
+ - Der Typ der Produktattribute wird korrekt in die Datenbank aufgenommen
+ - Bestellkommentare werden mit den Bestellmails versendet
+ - Zuordnung fÃŒr ZubehÃ¶rprodukte angepasst (Mehrfachzuordnung mÃ¶glich)
+ - SicherheitslÃŒcke in PayPal und Skrill (Moneybookers) behoben
+ - Korrektur im Gutscheinmodul
+ - Platzhalter um strftime Funktionen erweitert 
+ - BestellÃŒbersicht zeigt Preis bei Bestelldatum an
+ - SOAP Hinweise optimiert
+ - Ausgabe des Gutscheincodes in der BestellÃŒbersicht und den Bestellmails
+ 
+#3.0.10 / 1849
+ - Domains fÃŒr Ãbersetzung korrigiert
+ - Ausgabe des Gutscheincodes in der Bestellverwaltung
+ - Beim Refresh der Seiten wird bei Varianten und Selectboxen das richtige Bild angezeigt
+ - Ausgabe im Gutscheinmodul optimiert
+ - PayPal Logo ausgetauscht
+ - Text in Bestell-, Produkt- und Kundenverwaltung kopierbar
+ - MwSt Berechnung im Modul AuftragsbestÃ€tigung korrigiert
+ - Formatierungen Mailtemplates angepasst  
+ - Multiblog Registrierungsproblem behoben
+ - Produkttitel in Title der Lightbox
+ - Meldung bei nicht registrierter Domain
+ - Taxonomien (Kategorien) werden beim kopieren von Produkten mitkopiert 
+ - Taxonomien werden korrekt gelÃ¶scht wenn ein Produkt gelÃ¶scht wird
+ - WSDL Cache bei der Verbindung zum Registrierungsserver deaktiviert
+ 
+#3.1.0 / 2538
+ - korrekte Post- Navigation fÃŒr kopierte Produkte bei Verwendung des Moduls "Produktartikel"
+ - Problem bei fehlenden Hilfetexten gelÃ¶st  
+ - Hinweis "Kleinunternehmer- Regelung" auch im Modul AuftragsbestÃ€tigung 
+ - berichtigte Gewichtsberechnung im Modul Varianten
+ - Produkte mit "Sonderzeichen" lassen sich kopieren.  
+ - Widget Einstellungen werden korrekt gespeichert
+ - Problem mit falsch angezeigtem Warenkorb bei bestimmten Templates korrigiert
+ - Fehler im Updatescript (Downloadprodukte) behoben
+ - Anzeige von Kundennummer in KundenÃŒbersicht
+ - Sortierung in Bestell-, Gutschein- und Produktansicht
+ - Funktion zum formatieren von Zahlen zeigt bei BetrÃ€gen < 0.01 mehr als 2 Stellen an.
+ - VerknÃŒpfung von Kunde <-> Bestellung verbessert
+ - Import von Gutscheinen aus CSV Datei
+ - Produktvariablen werden beim aktualisieren des Warenkorbes gespeichert
+ - Zugriff auf die Lizenzverwaltung ist ÃŒber Berechtigungen mÃ¶glich
+ - Warenkorbwidget wird bei der Anzeige des Warenkorbs im Fenster neu geladen
+ - JS/CSS Dateien werden konsequenter aus den user_views geladen wenn vorhanden
+ - Warenkorbwidget wird bei der Anzeige des Warenkorbs im Fenster neu geladen
+ - Kundennummer ist exportierbar
+ - Lieferland wird in Bestellzusammenfassung korrekt angezeigt
+ - Anrede wird in Bestellzusammenfassung korrekt angezeigt
+ - Kommentar bei AuftragsbestÃ€tigung ist Mehrzeilig mÃ¶glich
+ - Module lassen sich mit dem FTP User installieren, wenn keine Webserver Schreibrechte
+ - AbwÃ€rtskompatibilitÃ€t beim schreiben/anzeigen von Rechnungen verbessert
+ - Verbesserte Lizenzfehlermeldungen
+ - TextÃ€nderungen
+ - Bildercache lÃ€sst sich bei Installationen in Unterverzeichnissen korrekt lÃ¶schen
+ - Rechnungs PDF bei vielen Produkten optimiert
+ - Rechnungen und Gutschriften werden mit Rechnung/Gutschrift Nummer benannt. (PDF)
+ - Gutschriften zeigen Rechnungsnummer optional 
+ - Kundenvariablen werden im Profil und in der Registrierung automatisch abgefragt (optional)
+ - LÃ€nder werden bei der Versandadresse korrekt exportiert
+ - Lieferadresse wird bei der nÃ€chsten Bestellung nicht mehr angezeigt
+ - erweiterte Variantenanzeige auch fÃŒr Varianten vom Typ "Checkbox"
+ - Lieferadresse wird bei der nÃ€chsten Bestellung nicht mehr angezeigt
+ - Anrede, Name und Auswahl von Kundenvariablen lassen sich ÃŒbersetzen
+ - Login/Logout setzt die Sprache nicht mehr zurÃŒck
+ - Entfernen von Produkten aus dem Warenkorb setzt die Sprache nicht mehr zurÃŒck
+ - Passwort vergessen Link auf LoginFormular
+ - Bei Fehleingaben im Loginformular wird die E-Mail Adresse beibehalten
+ - Downloadplus mit mehreren Produkten korrigiert
+ - PDFs werden nicht mehr als Download ausgegeben sondern direkt an den Browser gegeben (Damit es auch aufm iOS geht)
+ - Steuer bei Versand/Zahlungskosten wird bei Brutto/Brutto korrekt angezeigt
+ - Dialog fÃŒr ZubehÃ¶rprodukte lÃ€sst sich wieder schlieÃen 
+ - Kunde ist nach Bestellung optional ausgeloggt
+ - Suche in Kundenverwaltung sucht auch nach Kundennummer
+ - Artikelnummer wird in den Templates angezeigt
+ - SOAP Hinweise wird auch im DEMO Shop angezeigt
+ - Kundenland ist im Backend bearbeitbar
+ - Seiten werden nun mit korrekten URL Segmenten angelegt
+ - Statusverwaltung eines Kundenaccounts (aktiv/ inaktiv)
+ - Beim erstmaligen Installieren wird ein Produkt angelegt und eingebunden.
+ - Anzahl bei Bestellstatus "Alle" wird korrekt angezeigt in BestellÃŒbersicht
+ - Bei PNG Bildern wird die richtige QualitÃ€t ÃŒbergeben
+ - Ausgabe kann optional direkt ausgegeben werden (content_filter Problem)
+ - Bei AuftragsbestÃ€tigung und Passwort Anfrage und Zusendung wird ein Betreff vorgegeben
+ 
+#3.1.1 / 2544
+ - Paketfehler bereinigt
+ 
+#3.1.2 / 2602
+ - Bei Vorkasse wird in der AuftragsbestÃ€tigung auch der Betreff fÃŒr die Ãberweisung angezeigt
+ - Module lassen sich im Blognetzwerk wieder deaktivieren
+ - LÃ¶schen von Bestellungen bei denen keine Rechnungen geschrieben wurde funktioniert nun
+ - Rechtschreibfehler korrigiert
+ - Produktvariable werden in der BestellÃŒbersicht eines angemeldeten Benutzers (Frontend) angezeigt
+ - Dokumentation fÃŒr E-Mail Konfiguration eingebunden
+ - Text im Protokoll bei StatusÃ€nderung angeglichen
+ - Problem mit Downloadprodukten im Multiblog gelÃ¶st (0Byte Problem)
+ - Kundennummer (knr) wird bei Registrierung vergeben
+ - Bei deaktivierter Option "Registrierungszwang im Checkout" ist es mÃ¶glich mit einer vergebenen E-Mail Adresse zu bestellen
+ - Kunden lassen sich durchgehend auf Aktiv bzw. Inaktiv setzen.
+ - Hilfeseite in Kundenverwaltung verlinkt
+ - Lieferadresse wird wieder ÃŒbernommen und dargestellt
+ - Land der Lieferadresse wird in AuftragsbestÃ€tigung angezeigt
+ - Das Format der Exportdatei wirkt sich nun auch auf die Musterdatei aus
+ - Update Prozess optimiert
+ - Pfad fÃŒr die Uploads bei Multiblog kann definiert werden
+ 
+#3.1.3 / 2685
+ - Feature: Ãbersetzungen bei SofortÃŒberweisung ermÃ¶glicht 
+ - Feature: weitere Platzhalter in mod_downloadplus
+ - Feature: Lizenzverwaltung optimiert
+ - Feature: Verwendung von wp_loaded anstatt pre_get_posts fÃŒr mehr KompatibilitÃ€t
+ - Feature: Downloadplus Produkte lassen sich auf ein Artikel pro Bestellung begrenzen
+ - Feature: Vorgaben fÃŒr Versandzonen und LÃ€nder lassen sich optional laden
+ - Feature: Wordpress User lassen sich optional mit Kunden verknÃŒpfen
+ - Feature: MÃ¶glichkeit (optional) BETA Versionen zu installieren 
+ - Feature: Hinweis auf neue Version verlinkt nun auf Pluginverwaltung
+ - Bugfix: Fehler bei Ajax Anfragen im Frontend behoben 
+ - Bugfix: Bei Downloadprodukten funktioniert die Begrenzung auf ein Artikel pro Bestellung
+ - Bugfix: Fehler im Filter der Bestellverwaltung korrigiert
+ - Bugfix: Falscher oder Fehlender ProduktschlÃŒssel bricht Programm nicht ab
+ - Bugfix: Kunden Status bei Registrierung wird richtig gespeichert
+ - Bugfix: Registrierungsmail mit vollstÃ€ndiger Landesbezeichnung
+ - Bugfix: E-Mail Adresse Wiederholung kann ausgeblendet werden
+ - Bugfix: Fehler beim lÃ¶schen der Lieferadresse wÃ€hrend der Bestellung korrigiert  
+ - Bugfix: TextÃ€nderungen
+ 
+#3.1.4 / 2688
+ - Bugfix: KompatibilitÃ€t mit PHP 5.2 hergestellt
+ 
+#3.2.0 / 2956
+ - Bugfix: Standard LÃ€nderliste korrigiert
+ - Bugfix: Aufruf Text fÃŒr Kleinunternehmerregelung fÃŒr mod_produktindex berichtigt
+ - Bugfix: Modul Selbstabholung korrigiert (Barzahlung deaktivierbar)
+ - Bugfix: Lieferadresse im Backend und den Mails korrekt anzeigen
+ - Bugfix: Fehler beim Ãbertrag von Dezimalstellen im Skrill Modul behoben
+ - Bugfix: Fehler bei PRIMARY KEY Definition fÃŒr dbDelta behoben
+ - Bugfix: Darstellung der Bestellungen im Backend optimiert
+ - Bugfix: Fehler beim Update von V2 mit Prefix ohne "_" am Ende behoben
+ - Bugfix: Meldung auf neue Version entfernt, da obsolete
+ - Bugfix: Betreff der AuftragsbestÃ€tigung ÃŒbersetzbar
+ - Bugfix: Button zum entfernen des Dateianhangs in der KundenbestÃ€tigungsmail
+ - Bugfix: Einstellungen in den Kundendaten werden bei Update nicht mehr zurÃŒckgesetzt
+ - Bugfix: Bibliothek fÃŒr Hilfetooltips ersetzt
+ - Bugfix: Keine negativ Bestellungen mehr mÃ¶glich
+ - Bugfix: Reihenfolge der Bilder bei bestimmten Systemen korrigiert
+ - Bugfix: Lagerbestand korrigiert sich wenn eine Bestellung storniert wird
+ - Bugfix: Versandkostenfrei entfernt Versandart "Selbstabholung" nicht mehr
+ - Bugfix: Es ist nicht mehr mÃ¶glich Dokumente zu noch nicht gespeicherten Produkten abzulegen
+ - Bugfix: Fehler beim speichern im Rabatt Modul bzgl. Produktgruppenrabatt und Produktrabatt behoben
+ - Bugfix: Fehler beim bearbeiten von Variantenwerten bei Checkboxen behoben
+ - Bugfix: load_textdomain wird nicht mehr verwendet
+ - Bugfix: Zahlungsinformationen werden in Bestellansicht nicht mehr angezeigt wenn Zahlungsart nicht Bankeinzug
+ - Bugfix: ProduktID wird in Produktverwaltung wieder angezeigt
+ - Bugfix: Sortierung der Produktvariablen nach der Reihenfolge des Anlegens
+ - Bugfix: HTML Entities werden bei Auswahl/Produktartikel nicht mehr mitgespeichert 
+ - Bugfix: Fehler im Checkout.phtml behoben (Pflichtfeld Name) Thx@Cyril23 
+ - Bugfix: Produkte in Produktgruppen werden bei Ãbersetzung korrekt gezÃ€hlt (Thx@MKJ)
+ - Bugfix: Fehler im Lagerbestandmodul bzgl. Option "Lagerbestand zÃ€hlen" wurde behoben
+ - Bugfix: Bild fÃŒr Datumsauswahl im Backend wird auch bei Installation in Unterordner angezeigt
+ - Bugfix: Zeichen die nicht serializiert werden kÃ¶nnen, werden beim Anlegen/Bearbeiten von Varianten entfernt
+ - Bugfix: GrÃ¶Ãe der Eingabefelder im InlineEdit wÃ€chst nicht mehr
+ - Bugfix: UnnÃ¶tige Ajax Abfragen bei mehreren Varianten behoben
+ - Bugfix: Darstellungsfehler bei Produktauswahldialog und Datepicker behoben
+ - Bugfix: Deinstallation/Blognetzwerk innerhalb eines Blognetzwerkes nur fÃŒr SuperAdmin zugÃ€nglich
+ - Bugfix: Kundenkontakt berÃŒcksichtigt Rabatte und Gutscheine
+ - Bugfix: Bearbeitung von Selectboxen ÃŒber InlineEdit ist nun mehrfach mÃ¶glich
+ - Bugfix: Demo Module lassen sich in der DEMO Version nutzen
+ - Bugfix: Fehler bei Kategorieauswahl im ProduktÃŒbersichtenmodul behoben
+ - Bugfix: Zugriff auf Modulverwaltung ohne SOAP mÃ¶glich
+ - Bugfix: Validierung V1 mit aktueller jQuery Version kompatibel
+ - Feature: Anzeige des LÃ€nderkÃŒrzels der Lieferanschrift in BestellÃŒbersicht
+ - Feature: Updatehinweise nach Update
+ - Feature: Neues Modul "TopSeller"
+ - Feature: Bestellfilter erweitert
+ - Feature: PayPal IPN auf HTTP 1.1 umgestellt
+ - Feature: Grafische Ãberarbeitung Checkout
+ - Feature: Anzeige der Seiteninhalte ÃŒber grid und list bei den ProduktÃŒbersichten
+ - Feature: Kommentare in done.phtml erweitert 
+ - Feature: KompatibilitÃ€t mit wpNewsletterGermany verbessert
+ - Feature: Name und Vorname werden beim anlegen von Wordpress Nutzern mit ÃŒbergeben
+ - Feature: Format fÃŒr Geburtsdatum im Backend kenntlich gemacht und Datepicker integriert (Thx@FlorianB)
+ - Feature: ProduktÃŒbersichten zeigt nur verfÃŒgbare Produkte (Optional auch ausverkaufte) 
+ - Feature: MÃ¶glichkeit Versand- und Zahlungsart im Warenkorb zu definieren (Um Versandkosten zu berechnen) 
+ - Feature: PayPal Betreff lÃ€sst sich konfigurieren
+ - Feature: SofortÃŒberweisung Betreffzeilen lassen sich konfigurieren
+ - Feature: Produktbild optional in Warenkorb/Bestellzusammenfassung
+ - Feature: Anzeige des Lagerbestandes in ProduktÃŒbersicht
+ - Feature: Hinweis auf Pflichtfelder eingebaut
+ - Feature: Gutscheine nur fÃŒr bestimmte Produkte/Produktgruppen zulÃ€ssig
+ - Feature: Anzeige bei Produktartikeln lÃ€sst sich genauer konfigurieren
+ - Feature: Gutscheine kÃ¶nnen jetzt mit einem Mindestbestellwert versehen werden
+ - Feature: Gutscheincode kann jetzt optional manuell angegeben werden
+ - Feature: Variantenpreise lassen sich optional ausblenden
+ - Feature: Anzeige des Rabattes schon im Warenkorb
+ - Feature: Neues Modul "Staffelpreise" um gestaffelte Preise zu ermÃ¶glichen 
+ - Feature: Neues Modul "Micropayment" fÃŒr Zahlung ÃŒber den Micropaymentâ¢ Dienstleister
+ - Feature: Ausverkauft Template kann optional ingoriert werden (Lagerbestandsmodul)
+ - Feature: Template im Modul "ZubehÃ¶rprodukte" vordefinierbar
+ - Feature: Produkt Ansehen Funktion in ProduktÃŒbersicht im Backend
+ - Feature: Anpassung an Wordpress Theme Twenty Thirteen 
+ - Feature: Versandzonen mit PLZ - Bereichen mÃ¶glich
+ 
+#3.2.1 / 2967
+ - Bugfix: Updateprobleme
+ 
+#3.2.2 / 3000
+ - Bugfix: Mehrfachauswahl bei ProduktÃŒbersichten ist wieder mÃ¶glich
+ - Bugfix: Produktartikel - Produkte lassen sich von der Suche ausschlieÃen
+ - Bugfix: Rechtstexte - Hilfelink hinterlegt
+ 
+#3.2.3 / 3029
+ - Bugfix: Versandkosten werden im Warenkorb richtig berechnet ohne Aktualisierung
+ - Bugfix: Kundenverwaltung - Layout angepasst
+ - Bugfix: Kroatien wird jetzt der EU Versandzone bei Standardinstallation zugeordnet (Thx@Gecko123)
+ - Bugfix: Produktartikel - Custom Postype Anpassungen bei verwendung von wpsg_mod_produktartikel (neue Artikel werden als "public" registriert)
+ - Bugfix: Lieferscheinmodul - Korrekte Anzeige von PLZ und Ort und Bestelldatum
+ - Bugfix: Micropayment - Logos werden nach BestellabschluÃ bei allen Zahlungsarten angezeigt
+ - Bugfix: Staffelpreise - Korrektur der Staffelauswahl und Anzeige Brutto/Netto
+ - Bugfix: Validierung V2 springt nach Eingabe nicht immer in das erste Fehlerhafte Feld
+ - Bugfix: Besteuerung von Gutscheinen und Rabatten ÃŒberarbeitet
+ - Feature: Rechnungsmodul - Optionale Anzeige von Artikelnummer
+ - Feature: LÃ€nderauswahl im Warenkorb ist optional ausblendbar
+ - Feature: ProduktÃŒbersichten - Sortierung nach Position bei aktivem Modul "Produktartikel" und Erstellungsdatum (Vorgabe im Backend)
+ - Feature: ZubehÃ¶rprodukte - Zuordnung lÃ€sst sich optional in beide Richtungen betrachten
+ - Feature: Downloadprodukt - Verlinkung der Downloads in der Bestellansicht (Bei den Produkten)
+ - Feature: Staffelpreise - Dialog, der beim Speichern eines Produktes auf nicht gespeicherte Staffeln hinweist
+ 
+#3.2.4 / 3249
+ - Bugfix: Gutscheinprodukt/Produktvariablen - Bei Varianten werden die Produktvariablen in Platzhaltern ersetzt
+ - Bugfix: Neue Syntax fÃŒr Platzhalter geht auch bei den Formaten fÃŒr Bestell- und Kundennummer
+ - Bugfix: Lieferscheinmodul - lÃ¶schen von Bestellungen bei aktiviertem Modul funktioniert wieder  
+ - Bugfix: Lieferadresse - KompatibilitÃ€t zu jQuery 1.6+
+ - Bugfix: SofortÃŒberweisung - UserID in Kunden-Nr umbenannt
+ - Bugfix: ToolTip Fenster farblich angepasst
+ - Bugfix: Fehler bei benutzung der PayPal Sandbox behoben
+ - Bugfix: Satolo Newslettermodul - Beim abwÃ€hlen der Box wird die Auswahl nun gelÃ¶scht
+ - Feature: Benutzerdefinierte Kundenvariablen lassen sich in Bestell/Kundennummer/GutscheinPDFs verwenden
+ - Feature: In den Systeminfos erscheienen die aktivierten Wordpress Plugins 
+ - Feature: Shop CSS kann vom einbinden ausgeschlossen werden
+ - Feature: Produktgruppen Lagerbestand
+ - Feature: Gutscheinmodul - Das EinfÃŒgen von Gutscheinen im Warenkorb lÃ€sst sich ausblenden 
+ - Feature: Statistikmodul - Google Analytics (Web-Tracking-Code, Conversions - URL-Ziele)
+ - Feature: Neues Modul "Trusted Shops" 
 
-#4.0.1
-- Feature - KundenzusammenfÃŒhrung ÃŒber Kundenverwaltung
-- Feature - Rechnung zeigt Artikelnummer an (vgl. wie Lieferschein)
-- Bugfix - Produkte lassen sich ohne Produktartikelmodul anlegen/speichern
-- Bugfix - Kunden lÃ¶schen (als gelÃ¶scht markieren) nach KundenzusammenfÃŒhrung
-- Bugfix - Nach KundenzusammenfÃŒhrung zur KundenÃŒbersicht umleiten
-- Bugfix - PHP7.1 KompatibilitÃ€t
-- Bugfix - Sortieroptionen auch in der Produktansicht vorhanden
-- Bugfix - korrekter MwSt.-Anzeige in der Produktview
-- Bugfix - Geburtsdatum wird im Profil ausgefÃŒllt, wenn es im Checkout ebenfalls ausgefÃŒllt wurde
+#3.2.5 / 3252
+ - Bugfix: Produktgruppenmodul ist wieder frei verfÃŒgbar
+ 
+#3.2.6 / 3316 
+ - Feature: Produktbilder - Neuer Bildmodus "CropCenter" (cz) 
+ - Feature: Produktbilder - Anzeige des FTP Pfades in Produktverwaltung
+ - Feature: Downloadplus - AusfÃŒhrungszeit und Speicherlimit lÃ€sst sich optional erhÃ¶hen
+ - Feature: Downloadplus - Orientierung der Seite orientiert sich an dem Originaldokument
+ - Feature: Downloadplus - Nummerierung der Downloads durch formatierbare Downloadnummern
+ - Feature: Downloadplus - Anzahl an Textfelder auf 10 erhÃ¶ht
+ - Feature: Gutscheine - Tooltip fÃŒr [M] in GutscheinÃŒbersicht
+ - Bugfix: Downloadplus - Funktion "Versandart "Versand per Mail" aktiv" arbeitet wie gewollt
+ - Bugfix: Warenkorbwidget an aktuelles Wordpress Theme angepasst
+ - Bugfix: AuftragsbestÃ€tigung - UnnÃ¶tiger Satz entfernt 
+ - Bugfix: Multiblog bei deaktivierten "Jeden Blog getrennt behandeln" deaktiviert Module wieder
+ - Bugfix: Downloadplus - Euro Zeichen wird bei den Platzhaltern ermÃ¶glicht
+ - Bugfix: Bei den StandardlÃ€ndern ist die Schweiz jetzt in der Versandzone "sonstiges Ausland" und Zypern in "EU LÃ€nder"
+ - Bugfix: Produktgruppen - Tabelle bei Neuinstallation wird korrekt angelegt
+ - Bugfix: CSS SchriftgrÃ¶Ãen Responsive angegeben
+ - Bugfix: Produktbilder - Das Bild in der BestellÃŒbersicht verlinkt nun korrekt auf das Produkt
+ - Bugfix: Einseitencheckout - Versandkostenfrei Modul wird berÃŒcksichtigt
+ - Bugfix: Darstellung des Ausverkauft Templates an das Standard Template angepasst
+ - Bugfix: Lieferschein - Schreibfehler korrigiert
+ - Bugfix: Vorkasse - Fehler bei verwendung der Kundennummer im Betreff behoben
 
-#4.0.2
-- Bugfix - Speichern von Bestellbedingungen wieder mÃ¶glich
-- Bugfix - Variantenname und Preis im DownloadPlus korrekt dargestellt
-- Bugfix - Korrektur in der Lizenzverwaltung
-- Bugfix - UserViews unter wp-content erlauben
-- Feature - "zusÃ€tzliche Informationen" im standard.phtml
-- Feature - KommentarzÃ€hler fÃŒr Microformat
+#3.3.0 / 3471
+ - Feature: Neues kostenloses Modul fÃŒr die Zahlungsart GiroCheckout
+ - Feature: Neues kostenloses Modul fÃŒr die Zahlungsart SecurePay
+ - Feature: Layoutanpassungen fÃŒr Wordpress 3.8 / Twenty Fourteen
+ - Feature: Neues Icon und MenÃŒpunkt ab 3.8 
+ - Feature: wpautop lÃ€sst sich optional deaktivieren
+ - Feature: KompatibilitÃ€t mit safe_mode und open_basedir und URL Benachrichtigungen verbessert
+ - Feature: Bankeinzug - Erfassung von BIC und IBAN im Bestellprozess
+ - Feature: Bankeinzug - Template fÃŒr BestellabschluÃseite nutzbar
+ - Feature: in Multibloginstanzen lÃ€sst sich die Session auf ein Blogverzeichnis begrenzen
+ - Feature: Exportprofile - Format "Text" und "Excel2007" neu aufgenommen
+ - Feature: Varianten - FÃŒllmengen in verbindung mit Varianten werden berechnet und angezeigt
+ - Feature: Variantenmodul - Icons in Variantenverwaltung integriert um mehr Platz zu schaffen
+ - Feature: Produktgruppen - Die Namen der Produktgruppen lassen sich ÃŒbersetzen
+ - Feature: Downloadplus - Verschiedene Schriftarten mÃ¶glich auch Strichcode (Barcode) 
+ - Feature: Downloadplus - Anzahl an SchriftgrÃ¶Ãen erhÃ¶ht
+ - Feature: DownloadPlus - Standardplatzhalter der Produkte in Dateiname und Texten mÃ¶glich
+ - Feature: DownloadPlus - Downloadnummer in personalisierten Dateinamen verwendbar
+ - Feature: DownloadPlus - Textfelder sind ÃŒber Exportprofile exportierbar 
+ - Feature: Kundenverwaltung - Optional kann bei Login/Logout auf aktuelle Seite geleitet werden
+ - Feature: Kundenverwaltung - Wordpress User sind nach BestellabschluÃ eingeloggt
+ - Feature: ProduktArtikel - CustomPostTypes lassen sich optional ÃŒber WP bearbeiten
+ - Feature: Kundenkontakt - Standardplatzhalter in Templates ermÃ¶glicht
+ - Feature: Statistikmodul - Piwik Seiten ID lÃ€sst sich konfigurieren
+ - Bugfix: Diverse Rechtschreib- und Tippfehler korrigiert Thx@DanielProgramming und Solala 
+ - Bugfix: wp_editor() statt the_editor() verwendet
+ - Bugfix: DownloadPlus - Platzhalter fÃŒr Bestellung/Kunden kÃ¶nnen in Mail verwenden werden
+ - Bugfix: Downloadprodukt - Platzhalter fÃŒr Bestellung/Kunden kÃ¶nnen in Mail verwenden werden
+ - Bugfix: EinSeitenCheckout - Bestellkommentar wird beim Bestellen korrekt ÃŒbernommen Thx@Team_SBK
+ - Bugfix: Anhang der Kundenmail wird beim erneuten Speichern nicht gelÃ¶scht
+ - Bugfix: Versandadresse - Lieferland ist nun auch ein Pflichtfeld
+ - Bugfix: Downloadmodul - kompatibilitÃ€t mit nextGEN Gallery hergestellt 
+ - Bugfix: diverse Fehlerausgaben durch "WordPress SEO Plugin" entfernt ("wp_trim_excerpt nicht verwenden")
+ - Bugfix: LÃ€ndernamen lassen sich ÃŒbersetzen
+ - Bugfix: Pager in Produktverwaltung wird mit <ENTER> abgeschickt
+ - Bugfix: Kundenvorgaben werden korrekt definiert
+ - Bugfix: Bankeinzug - Fehlerabfrage bei Auswahl im Warenkorb behoben
+ - Bugfix: Produktartikel - Anzahl an Artikeln in einer Kategorie aktualisiert sich korrekt
+ - Bugfix: Import von Produkten funktioniert im Multiblog und Wordpress 3.8
+ - Bugfix: Return auf der Menge im Warenkorb schickt das Formular korrekt ab
+ - Bugfix: Kundenverwaltung - Anzeige des korrekten Produktpreises bei Variantenprodukten mit 0,- Produktgrundpreis
+ - Bugfix: Kundenverwaltung - Fehler bei Auswahlfeldern in Kundenverwaltung (Backend) behoben
+ - Bugfix: Kundenverwaltung - Bestellungen lÃ¶schen nicht mehr bereits gesetzt oder nicht angezeigte Kundenvariablen
+ - Bugfix: Gewichtsmodul - Das Gewicht kann nun korrekt in Bestellzusammenfassung eingeblendet werden ohne das es im Warenkorb angezeigt wird
+ - Bugfix: Lagerbestand - Die Option "Lagerbestand zÃ€hlen" wirkt sich auch auf Varianten aus
+ - Bugfix: Probleme bei Ãbersetzungen mit Produktartikel/Attribute/Varianten behoben
+ - Bugfix: Markup im Warenkorb Widget korrigiert
+ - Bugfix: qTranslate - AusgewÃ€hlte Sprache geht beim hinzufÃŒgen von Produkten nicht verloren 
+ - Bugfix: Bankeinzug - Probleme mit Erfassung der Bankeinzugsdaten im Einseitencheckout behoben
+ - Bugfix: Rechnungsmodul - Schreibfehler bei Voreinstellungen
+ - Bugfix: Rabattmodul/Variantenmodul - Der prozentuale Preis bezieht sich nun auf den gesamten Preis
+ - Bugfix: Micropayment - Anzeige der Zahlungsart im Backend
+ - Bugfix: ProduktÃŒbersichten - REQUEST_URI anstatt PHP_SELF
+ - Bugfix: Variantenplus - Fehler bei Mehrsprachigkeit behoben
+ - Bugfix: Rechnungsmodul - MehrwertsteuersÃ€tze mit , statt . im Rechnungspdf
+ - Bugfix: Rabattmodul - Rabatt wird im Warenkorb bei Varianten nicht doppelt draufgerechnet 
+ - Bugfix: Rechnungsmodul - Zahlungs- und Versandrabatt erscheinen nun auf der Rechnung
+ 
+#3.3.1 / 3481
+ - Bugfix: Session zu spÃ€t gestartet, dadurch konnten Versandarten nicht bestimmt oder berechnet werden
+ - Bugfix: PIWIK Seiten ID wird abgefragt obwohl kein PIWIK verwendet wird
+ - Bugfix: Variantenbestand wird im standard.phtml korrekt gewechselt
+ 
+#3.3.2 / 3548
+ - Feature: Varianten/Exportprofile - Export von Variantenname und Variantenartikelnummer
+ - Feature: Innergemeinschaftliche Lieferung pro Versandzone auf Lieferschein und Rechnung
+ - Feature: Neues kostenfreies Modul "Lieferzeiten"
+ - Feature: Rabatt wird im Warenkorbwidget bereits angezeigt
+ - Feature: Anzeige von URL in ProduktÃŒbersicht und Produktansicht auch ohne Produktartikelmodul
+ - Feature: Angepasste Templates nach wp-content ausgelagert, um Updateprobleme mit Dateirechten zu vermeiden
+ - Bugfix: Beim ersten Installieren des Plugins wird Deutschland dem Versandzone "Inland" zugewiesen
+ - Bugfix: Rabatte und Gutscheinwerte immer negativ ausgewiesen (mit Vorzeichen)
+ - Bugfix: Probleme mit php.ini Einstellungen und http_build_query gelÃ¶st
+ - Bugfix: Anzeige bei Rabatt im Warenkorb korrigiert
+ - Bugfix: ProduktÃŒbersichten - Funktion des Formulars bei deaktiviertem Permalink sichergestellt
+ - Bugfix: Transparente Grafik fÃŒr "Produkt entfernen" im Warenkorb
+ - Bugfix: Lagerbestand - Lagerbestand wird korrekt herunter gezÃ€hlt
+ - Bugfix: Bei Fehlermeldung auf korrekte Sprache leiten
+ - Bugfix: Varianten - Korrekte Anzeige und Berechnung bei Mehrsprachigkeit
+ - Bugfix: Varianten - Lagerbestand wird korrekt herunter gezÃ€hlt
+ - Bugfix: Varianten - CSS Anpassung, damit Radio AuswahlmÃ¶glichkeiten untereinander stehen
+ - Bugfix: Securepay - Bei Fehlern ohne BestellID wird die Fehlerseite angezeigt statt des Fehlercodes 
+ - Bugfix: BestellÃŒbersicht - Filter berÃŒcksichtigt auch nicht stornierte Rechnungen
+ - Bugfix: Auswahl von Versandart, Zahlungsart und Land im Warenkorb ÃŒberarbeitet
+ - Bugfix: Varianten - Spaltentyp in Datenbank auf "Mediumtext" vergrÃ¶Ãert
+ - Bugfix: Im Admin Mailtemplate Umbruch vor Telefon eingebaut
+ - Bugfix: Paypal Problem mit deutschen LÃ€ndereinstellungen behoben
+ - Bugfix: KompatibilitÃ€t zu Wordpress-Skeleton verbessert
+ - Bugfix: Problem mit nicht angezeigten Meldungen/Fehlern bei manchen Themes behoben
+ - Bugfix: Problem beim addieren von negativen MwSt. BetrÃ€gen behoben
+ - Bugfix: Bankeinzug - Im IE10+ wird der Focus der Eingabefelder im Checkou2 nicht mehr gelÃ¶scht
+ 
+#3.3.3 / 3549
+ - Bugfix: KompatibilitÃ€t mit PHP 5.2 wiederhergestellt
+ 
+#3.3.4 / 3561
+ - Bugfix: Pfade auf PDF Bibliotheken absolut gesetzt, damit es in den user_views keine Probleme gibt
+ - Bugfix: ProduktÃŒbersichten - Layouts werden im korrekten Ordner gesucht
+ - Bugfix: Bei anzeige der MwSt wird in der Admin- und Kundenmail korrekt "Anteilig" ausgegeben
+ - Bugfix: Lieferschein - Optionen fÃŒr anzeige von Beschreibung/Varianten aktivierbar
+ - Bugfix: IBAN/BIC statt Kontonummer und BLZ in Export / IBAN/BIC als Vorgabe 
+ - Feature: Wordpress 3.9 KompatibilitÃ€t  
 
-#4.0.3
-- Bugfix - Wirecard erhÃ€lt korrektes Lieferland  
-- Bugfix - gloable Lieferzeit wird korrekt genutzt
-- Bugfix - Radio Buttons schalten die Varianten um
-- Bugfix - Warnung bei PDF Erstellung unterbunden
-- Bugfix - Verzeichnis fÃŒr Girocode anlegen
-- Bugfix - korrekte Darstellung der Warnungen im Checkout bei Kundenvariablen
-- Bugfix - Lieferadressenland im OnePageCheckout wird korrekt angezeigt
-- Bugfix - "Land auf Rechnung verbergen" wird korrekt umgesetzt
-- Bugfix - Anrede bei Lieferanschrift korrekt beschriftet
-- Bugfix - Konverter: Deaktivierte Radioboxen sind nach Konvertierung nicht mehr aktiv
-- Bugfix - Konverter: aktivierte Produktvarianten sind nach der Konvertierung wieder aktiv
-- Bugfix - Link zum Shop korrigiert
-- Bugfix - globale Lieferzeit korrigiert
-- Feature - Reihenfolge synchron zwischen Rechnungs- und Lieferadresse
-- Feature - Alte Daten in URL Benachrichtigung aus Adresstabelle ziehen
-- Feature - Produktartikelmodul stellt jetzt die Kurzbeschreibung an den Anfrang fÃŒr SEO Texte
-- Feature - "Produktbild als Beitragsbild verwenden" ist standardmÃ€Ãig aktiv
-- Feature - Suche in Produktverwaltung beachtet auch Varianten (Name und Artikelnummer)
-- Feature - Max-Executive-Time im Konverter fÃŒr Lieferscheine/Rechnungen erhÃ¶ht
+#3.3.5 / 3569
+ - Feature: Neue Funktion, um Zahlungsarten fÃŒr bestimmte Produkte einzuschlieÃen
+ - Feature: Bei ermittlung der ProduktURL, wird auf Warenkorbseite zurÃŒckgegriffen wenn keine andere Funktion mÃ¶glich ist
+ - Bugfix: ProduktÃŒbersichten - Korrekte Anzeige des minimal Preises bei Variantenprodukten
+ - Bugfix: Click&Buy - Standardplatzhalter werden in Auftragsbezeichnung ersetzt
+ - Bugfix: Lieferschein - die Sprache des generierten Lieferscheins ergibt sich aus der Bestellsprache
+ - Bugfix: Lieferschein/Rechnungen - Produktnamen richten sich nach der eingestellten Sprache 
+ - Bugfix: Downloadprodukt - Ãbersetzungen fÃŒr E-Mail Einstellungen mÃ¶glich
+ - Bugfix: Sparkassen Internetkasse - In Bestellprotokoll werden Komma BetrÃ€ge korrekt ausgewiesen
+ 
+#3.3.6 / 3580 
+ - Bugfix: ÃbersetzungsmÃ¶glichkeiten verbessert
+ - Bugfix: AusgewÃ€hltes Land wird korrekt vom Warenkorb in den Checkout ÃŒbertragen 
+ - Bugfix: Erstellung von Rechnungen ist aus der BestellÃŒbersicht wieder direkt mÃ¶glich
+ - Feature: Mehrsprachige Hilfetexte vorbereitet 
+ 
+#3.3.7 / 3589
+ - Bugfix: Versionsnummer korrigiert, damit von BETA geupdatet werden kann
+ 
+#3.3.8 / 3599
+ - Bugfix: Module an Lizenzbedingung geknÃŒpft
+ - Bugfix: Fehler beim Produktimport korrigiert
+ - Bugfix: Probleme mit dem einfÃŒgen von Shortcodes unter Wordpress 3.9 behoben
+ - Bugfix: Suche nach Kunden in Kundenverwaltung funktioniert wieder
+ - Feature: Kundenverwaltung - Anzeige von Umsatz in Kundenansicht
+ - Feature: Exportprofile - Export von Produktgruppen mÃ¶glich
+ 
+#3.3.9 / 3602
+ - Bugfix: Produktverlinkung aus der ProduktÃŒbersicht funktioniert nun wieder
+ - Bugfix: Module fÃŒr Light Version aktiviert 
+ - Bugfix: Rechnungsmodul - MehrwertsteuersÃ€tze werden unter der Tabelle noch einmal aufgelistet
+ - Bugfix: Kundenverwaltung - Probleme mit Validierung V2 und Registrierung beseitigt
+ - Feature: MÃ¶glichkeit im Produkttemplate abzufragen ob das Produkt vom eingeloggten Kunden bereits gekauft wurde
+ 
+#3.4 / 3667
+ - Feature: Neues kostenloses Modul "Bestellbedingungen" / Brutto/Netto fÃŒr Kundengruppen
+ - Feature: HTML Mails
+ - Feature: Neues kostenpflichtiges Modul "Kundengruppen"
+ - Feature: Rabattmodul - Rabatt fÃŒr Kundengruppen
+ - Feature: Erfassung von allgemeinen Shop Infos
+ - Feature: Erstellung von Widerrufsformular und Verlinkung im Bestellablauf / Anhang BestellbestÃ€tigung
+ - Feature: Sicherheitsoptimierungen
+ - Feature: Variantenmodul - Sortierung von Varianten und Variationen
+ - Feature: Produktvariablen - Sortierung von Produktvariablen
+ - Bugfix: Topseller - Die Topseller werden korrekt ermittelt
+ - Bugfix: Bankeinzug - TextÃ€nderung Bankeinzug
+ - Bugfix: Rechnungsmodul - Text "Vorschau" lÃ€sst sich ÃŒber Sprachdatei anpassen
+ - Bugfix: Fehler im Produktimport korrigiert
+ - Bugfix: LÃ€nderliste fÃŒr StandardlÃ€nder aktualisiert
+ - Bugfix: Einseitencheckout - Problem mit Loginformular im Einseitencheckout behoben
+ 
+#3.4.1 / 3684
+ - Bugfix: Variantenmodul - Darstellung in Textmail bereinigt (Umbruch)
+ - Bugfix: IBAN Nummer der Shopinfo wird gespeichert
+ - Bugfix: Bestellbedingungen - Vorgabetexte ÃŒberarbeitet
+ - Bugfix: Bestellbedingungen - Feedback bei erfolgreicher Speicherung
+ - Bugfix: Variantenmodul - Sortierung ohne Mehrsprachigkeit erzeugt keine Warnungen mehr
+ - Bugfix: Variantenmodul - Problem mit Mehrsprachigkeit und Lagerbestand behoben
+ - Feature: HTML Mails optimiert
+ 
+#3.4.2 / 3762
+ - Bugfix: AuftragsbestÃ€tigung - Text korrigiert
+ - Bugfix: Kundengruppen/Rabatt - Probleme im Zusammenspiel beider Module behoben
+ - Bugfix: Statistikmodul - Anzeige der Statistik im BE korrigiert
+ - Bugfix: Einseitencheckout/Bestellvariablen - Keine ÃberprÃŒfung mehr beim speichern des Kundenprofils 
+ - Bugfix: Vorkasse - Kontonummer und BLZ entfernt
+ - Bugfix: Kundenvariablen die nicht angezeigt werden werden beim Profilspeichern oder beim Bestellen nicht mehr gelÃ¶scht (#300) 
+ - Bugfix: Wenn keine Zahlungs- oder Versandart ausgewÃ€hlt wurden, so wird jetzt eine Fehlermeldung angezeigt. (#303)
+ - Bugfix: Bestellvariablen - Bei der Kundenregistrierung werden Bestellvariablen nicht mehr geprÃŒft (#306)
+ - Bugfix: Umbau der Meldungsausgabe im Front- und Backend. Meldungen werden jetzt am Ende des Seitenaufbaus erst gelÃ¶scht (wp_trim_excerpt Problem)
+ - Bugfix: Produktbilder - Bilder werden nach Zeichenketten und ohne Beachtung von GroÃ/Kleinschreibung sortiert
+ - Bugfix: Produktgruppen / Lagerbestand / Varianten - Ãberarbeitung der Lagerbestandsverwaltung in Zusammenspiel der drei Module
+ - Bugfix: Statistikmodul - Auswertung "Heute" funktioniert ohne Fehlermeldung
+ - Bugfix: Rabattmodul / Staffelpreis / Varianten - Zusammenspiel der Module verbessert (min_preis, max_preis im Produktarray werden rabattiert) 
+ - Bugfix: KompatibilitÃ€t mit anderen Plugins / E-Mail Content Type wird nur beim versenden von Mails gesetzt.
+ - Bugfix: Produktartikelmodul - Beim lÃ¶schen eines Produktes werden die META Angaben des Artikels auch gelÃ¶scht (THX@rs-systems) 
+ - Feature: Seiteneinstellungen in Hilfemeldung verlinkt
+ - Feature: Kundenkontakt - Templates HTML fÃ€hig. (Optional)
+ - Feature: Kundenkontakt - Anzeige des Warenkorbes ÃŒber zwei neue Platzhalter
+ - Feature: Vorkasse - Bei Neuinstallation mit Platzhaltern aus Shopinfo vorkonfiguriert
+ - Feature: Rechnungsmodul - Land wird korrekt auf Rechnung wie von der Post vorgeschrieben angegeben (optional)
+ - Feature: Rechnungsmodul - In den platzierbaren Texten auf der Rechnung sind die allgemeinen und bestellbezogenen Platzhalter mÃ¶glich
+ - Feature: Rechnungsmodul - Bei Neuinstallation mit Platzhaltern aus Shopinfo vorkonfiguriert
+ - Feature: Rechnungsmodul - Platzhalterersetzung in FuÃtexten
+ - Feature: Lieferscheinmodul - Land wird korrekt auf dem Lieferschein wie von der Post vorgeschrieben angegeben (optional)
+ - Feature: Produktvariablen - Optionale Anzeige von leeren Produktvariablen
+ - Feature: Securepay - An neue Schnittstellenanforderung angepasst
+ - Feature: Produktbilder - Neue Modi zur Auswahl
+ - Feature: Newsletter - Newsletterabonnenten kÃ¶nnen ÃŒber die Kundenverwaltung verwaltet werden
+ - Feature: Micropayment - Reservierung von Kreditkartenzahlungen ÃŒber API Schnittstelle
+ - Feature: Shopinfo um Name der Bank, Steuernummer und Umstatzsteueridentnummer erweitert
+ 
+#3.5.0 / 4108
+ - Feature: ErfÃŒllung der EU-Leistungsortregeln (MOSS-Verfahren fÃŒr digitale GÃŒter und Dienstleistungen)
+ - Feature: mehr MehrwertsteuersÃ€tze durch Mehrwertsteuergruppen
+ - Feature: komplette Ãberarbeitung des Rabattmoduls inkl. Zusammenspiel mit Varianten und deren Darstellung
+ - Feature: Ansichtserweiterung Produktvariable bei mehrfacher Bestellung
+ - Feature: Securepay - Zahlungsarten in RÃŒcksprache mit IW-Systeme direkt definierbar
+ - Feature: WordPress 4.1 kompatibel inkl. Theme Twenty Fifteen
+ - Feature: Tausch Brutto-Netto im Warenkorb
+ - Feature: KompatibilitÃ€tserweiterung mittels [raw] Tag (Awake Theme)
+ - Feature: DONOTCACHEPAGE-Parameter um das Cachen der Shop-Seiten zu verhindern
+ - Feature: KompatibilitÃ€t ab PHP5.4
+ - Bugfix: Fehler in Systemmeldung im Modul Vorkasse behoben
+ - Bugfix: Fehler in mod_kundenverwaltung.class.phtml behoben
+ - Bugfix: Varianten werden auf Lieferschein korrekt angezeigt
+ - Bugfix: Mailtemplates optisch angepasst (TXT)
+ - Bugfix: Inhalt der Rechnungsmail wird im Bestellprotokoll angezeigt
+ - Bugfix: Modifikation "Produktvariablen direkt im Produkt" funktioniert mit aktueller Version
+ - Bugfix: Doppelte // in Konstante WPSG_URL_CONTENT entfernt
+ - Bugfix: Produktartikelmodul - AnhÃ€nge in Beitrag anzeigen
+ - Bugfix: Downloadplus - Cron hat unter bestimmten UmstÃ€nden einen Fehler ausgegeben
+ - Bugfix: Lieferscheinmodul - Problem bei Seitenumbruch ohne Rechnungsmodul korrigiert
+ - Bugfix: Rechnungsmodul - Produktanzahl pro Seite wird berÃŒcksichtigt
+ - Bugfix: Paypal - Umstellung Paypal von SSL auf TLS
+ - Bugfix: Paypal - Sonderzeichen die innerhalb PayPal definiert sind machen keine Probleme mehr
+ - Bugfix: Bestellbedingungen
+ - Bugfix: Varianten - Lagerbestand von Checkboxen wird nicht mehr gepflegt
+ - Bugfix: Lagerbestand - Lagerbestand wird vor BestellabschluÃ noch einmal geprÃŒft
+ - Bugfix: ProduktÃŒbersichten - Produkte mit Umlauten im Namen werden korrekt sortiert
+ - Bugfix: Input-Felder im Backend fÃŒr Safari kompatibel (GrÃ¶Ãe hatte sich verÃ€ndert)
+ 
+#3.5.1 / 4115
+ - Bugfix: Probleme beim Lagerbestand und wpShopGermany 3.5.0 behoben
+ - Bugfix: Alten MenÃŒpunkt entfernt
+ 
+#3.6.0 / 4222
+ - Feature: Erweiterung des Warenkorbverhaltens
+ - Feature: Kombination von Versandarten
+ - Feature: ExortProfile - Im benutzerdefinierten Format sind wpsg Platzhalter mÃ¶glich
+ - Feature: Auswahl Versandart pro Produkt
+ - Bugfix: Neugestaltung des Abfragefensters fÃŒr Produkte nach Leistunsort
+ - Bugfix: Default Variation bei Checkbox Varianten
+ - Bugfix: Varianten und Lagerbestand bei Checkbox 
+ - Bugfix: Bilderanzeige bei ProduktÃŒbersichten
+ - Bugfix: Varianten - Korrekter Minimalpreis
+ - Bugfix: Rechnungsmodul - Korrekte Ausweisung von "Anteilig" bei Rechnungen
+ - Bugfix: ÃbersetzungsmÃ¶glichkeiten
+ - Bugfix: LÃ€nderauswahl im Warenkorb wird bei nicht EU Leistungsort Auswahl ÃŒbernommen
+ - Bugfix: Aktualisierung der Hinweistexte im Checkout2/Einseitencheckout
+ - Bugfix: Variantenmodul - Gewicht mit Varianten funktioniert wieder korrekt
+ - Bugfix: Variantenmodul - Artikelnummer wechselt auf Standardvariante wenn Anzeige aktiviert
+ - Bugfix: ProduktÃŒbersicht - Sortierung nach MwSt wieder mÃ¶glich
+ 
+#3.6.1 / 4231
+ - Paketverfolgung - Erweiterung der Standardpaketverfolgung
+ - Bugfix - Bestellungen von gelÃ¶schten Kunden lassen sich aufrufen
+ - Bugfix - Wirecard - Bei Fehler erfolgt Weiterleitung auf Abbruchseite
+ - Bugfix - Onepage - Prozentuale PayPal GebÃŒhren werden korrekt angezeigt
+ - Bugfix - Paketverfolgung - Beim ersten wechsel auf "Ware versendet" wird der Link schon dem Kunden mitgesendet 
+ 
+#3.7.0 / 4448
+ - Feature - Header Weiterleitung fÃŒr Safari optimiert
+ - Feature - Versandarten - LÃ€ngere KostenschlÃŒssel sind mÃ¶glich
+ - Feature - Mindestbestellwert - Maximaler Betrag auch mÃ¶glich
+ - Feature - Mindestbestellmenge - Maximalbestellmenge auch mÃ¶glich
+ - Feature - Produktartikelmodul - Beim Speichern wird das Beitragsbild aus den Produktbildern gespeichert (Optional)
+ - Feature - Produktbilder - Modi fÃŒr Produktbilder erweitert  
+ - Feature - Ersetzung von Platzhaltern in Zahlungs- und Versandhinweisen
+ - Feature - Bibliotheken aktualisiert
+ - Feature - Lieferzeit in Kundenmail, Adminmail und AuftragsbestÃ€tigung
+ - Feature - Hinweis bei nicht passender PHP Version
+ - Feature - Entwicklermodus erweitert (E-Mail Template Test)
+ - Feature - Produktbilder in HTML Mails (Kunden,Admin,AuftragsbestÃ€tigung)
+ - Feature - TrustedShops - Export fÃŒr den Rewiew Connector
+ - Feature - Flaggen werden bei QTranslate-X angezeigt, QTranslate UnterstÃŒtzung entfÃ€llt
+ - Feature - Kundenkontakt - Link zum BestellabschluÃ in E-Mail Vorlagen integriert
+ - Feature - Neues Modul "CrefoPay"
+ - Feature - Neues Modul "AnfrageProdukte"
+ - Bugfix - Einseitencheckout - Beim Registrieren nicht auf Versand- und Zahlungsarten prÃŒfen
+ - Bugfix - Mindestbestellwert - Korrekter Vergleich bei Gleichheit / Angaben immer in Brutto
+ - Bugfix - PayPal - Die Requests aller Bestellungen werden im Bestellprotokoll vermerkt
+ - Bugfix - Bestellungen direkt abschlieÃen nur bei 0,- Brutto inkl Versand und Zahlung
+ - Bugfix - Gutscheinberechnung bei Bruttopreisen
+ - Bugfix - Updatemeldungen sind wieder ausblendbar
+ - Bugfix - Produktartikelmodul - Problem mit aktuellem Wordpress und Multiblogeinstellung "Ein Shop mehrere Seiten" behoben
+ - Bugfix - Ersetzung von Platzhaltern in Adresszeile (Lieferschein)
+ - Bugfix - Varianten - Layer beim wechsel bekommt einen Z-Index von 1000 damit er ÃŒber anderen Elementen liegt
+ - Bugfix - Varianten - Der Wechsel einer Varianten wechselt bei angepassten Templates nicht mehr auf das Standard Template  
+ - Bugfix - Ajaxanfragen gehen an den Warenkorb und nicht mehr an die Startseite (KompatibilitÃ€tsverbesserung)
+ - Bugfix - KompatibilitÃ€t mit aktuellem Wordpress Theme verbessert
+ - Bugfix - Fehler in Sortierung der ProduktÃŒbersichten behoben
+ - Bugfix - Kundenverwaltung - Wenn Passwort kein Pflichtfeld und keine Angabe wird ein altes Passwort nicht leer ÃŒberschrieben
+ - Bugfix - Neuer Name fÃŒr Gutschrift: Rechnungskorrektur
+ - Bugfix - Bei Produktoption "Mehrfach mit Menge 1" wird nach hinzufÃŒgen korrekt zum Warenkorb geleitet
+ - Bugfix - Rechnungsmodul - PDF Template fÃŒr lÃ€ngere Zahlungsarten angepasst
+ - Bugfix - Einseitencheckout - Nichterreichen des Maximalbestellwertes wird korrekt angezeigt
+ - Bugfix - Lagerbestand - Wird korrekt gezÃ€hlt bei Varianten des gleichen Produktes im Warenkorb
+ - Bugfix - Lagerbestand - Bei Produkten die mehrfach im Warenkorb auftreten wird der korrekte Bestand betrachtet und Ãberbestellungen verhindert
+ - Bugfix - Downloadplus - Ersetzung von Produktvariablen ist fÃŒr zukÃŒnftige Bestellungen wieder mÃ¶glich
+ - Bugfix - Rechnungsmodul - HTML Mail fÃŒr Gutschriftmail
 
-#4.0.4
-- Bugfix - Cross Site Scripting 
- 
-#4.0.5
-- Bugfix - Filter in Bestellverwaltung bleibt offen, wenn Bestellungen gefiltert
-- Bugfix - Produktrabatt in Bestellverwaltung kein zweites Mail berechnet 
-- Bugfix - Shop gibt auf geschÃŒtzten Seiten keinen Inhalt mehr aus
-- Bugfix - UnvollstÃ€ndige Bestellungen nicht im KundenmenÃŒ anzeigen, wenn Option deaktiviert
-- Bugfix - wordpresseigener Passwortschutz fÃŒr eine Seite greift auch fÃŒr ProduktÃŒbersicht
-- Feature - AboProdukte: automatische VerlÃ€ngerung bei Vorkasse
-- Feature - AboProdukte: Optionaler Versand an Admin, wenn Abo angehalten werden soll
-- Feature - AboProdukte: Aboverwaltung im Kundenprofil (Frontend)
-- Feature - AboProdukte: automatische AboverlÃ€ngerung integriert
-- Feature - AboProdukte: Integration separate Aboverwaltung im Backend
-- Feature - Erweiterung des Musterwiderrufsformulares um Telefon, Fax und Mailadresse
-- Feature - Kundendatenabfrage kann partiell ausgeblendet werden
-
-#4.0.6
-- Bugfix: Lagerbestand aus Variantenbestand korrigiert
-- Bugfix: Ausgabekorrektur bei Mehrfachberechnung
-- Bugfix: Korrektur fÃŒr Kundendatenexport in der Kundenverwaltung
-- Bugfix: BestellstatusÃ€nderung liefert leere Bestellung
-- Bugfix: im Warenkorb wurde kein LÃ¶schen-Button pro Produkt angezeigt
-- Bugfix: Aktivierungsprobleme in Multiblogumgebung
-- Bugfix: BeschrÃ€nkung des Pathkeys (ProduktArtikel) auf 20 Zeichen
-- Bugfix: Maskierung fÃŒr Sonderzeichen 
-- Feature: Erweiterung der Sprachdateien aufgrund von Modulerweiterungen
-- Feature: Urlaubsdarstellung in Lieferzeitmodul integriert
-- Feature: UPS-Logo integrieren
-
-#4.0.7
-- Bugfix: LÃ¶schen von Bestellungen wieder mÃ¶glich (Problem bei fehlendem AboProdukte Modul)
-- Bugfix: Darstellung der Lizenzeingabe
-- Bugfix: Fehler bei fehlender SSL-VerschlÃŒsselung entfernt
-- Bugfix: Konverter verschiebt PDF-Dokumente (DownloadProdukte) unter uploads
-- Bugfix: Kein Abbruch wenn es keine Administrator-Rolle gibt
-- Feature: mehrzeilige Eingabe von FuÃtexten
-
-#4.0.8
-- Bugfix: doppelter Pfad in Multiblog
-- Bugfix: URL der News angepasst
-- Feature: IP Anonymisierung (DSGVO)
-- Feature: Downloadlink fÃŒr Gutschein
-- Feature: Modul (FÃŒllmenge, Gewicht, ...) aktiv und keine Eingabe in Produktbackend, wird keine Darstellung im Produktfrontend
-- Feature: Grundpreis in FÃŒllmenge separat ausgewiesen
-- Feature: optionale Integration der Kontaktdaten des Datenschutzbeauftragten
-- Feature: Integration eines EU-Vertreters fÃŒr Shops mit Hauptsitz auÃerhalb der EU
-
-#4.0.9
-- Bugfix: Produktbewertung mittels globale Kommentarfunktion aktivierbar
-- Bugfix: Gutscheinprodukte sind jetzt zu den erstellten PDFs im Backend verlinkt
-- Bugfix: Sicherheitsbugfix (Nur noch phtml Dateien unterhalb wp-content mÃ¶glich)
-- Bugfix: Sicherheitsbugfix (XSS LÃŒcke im Modul ProduktÃŒbersichten)
-- Bugfix: Girocode lÃ¶scht die Einstellungen fÃŒr die Erfolgsseiten icht mehr bei Modulaktivierung/Update
-- Feature: Produktvarianten - Export von Produktname / Produktartikelnummer ÃŒber Exportprofile mÃ¶glich
-- Feature: Lagerbestand - Export vom Lagerbestand / Mindestlagerbestand ÃŒber Exportprofile mÃ¶glich
-- Feature: Aboprodukte - Export von Abo Startzeit, Abo Laufzeit, Abo Kosten VerlÃ€ngerung und Abo Dauer (Tage) ÃŒber Exportprofile mÃ¶glich
-- Feature: Kundenverwaltung - Suche nach Kundengruppen mÃ¶glich
-- Feature: Gutscheine lassen sich bearbeiten
-- Feature: Die fÃŒr die Statistik benÃ¶tigte GoogleMaps API Bibliothek kann jetzt optional deaktiviert werden
-
-#4.0.10
-- Bugfix: PDF Dokumente im Backend nur verlinkt wenn auch aus einem GutscheinProdukt erstellt
-- Bugfix: Start- und Enddatum der Gutscheine aus Gutscheinprodukt in der korrekten Zeitzone erstellt
-- Bugfix: Template fÃŒr die Listeansicht in Produktartikeln kann jetzt definiert werden 
-- Bugfix: Konverter aktiviert das neue Produktvariantenmodul bei Bedarf um die benÃ¶tigten Tabellen anzulegen
-- Bugfix: PHP Warnung bei Produktbewertungen
-- Bugfix: Paypal-Schnittstellenanpassung 
-- Bugfix: MÃ¶gliche SicherheitslÃŒcke beim Upload von Widerrufsbelehrungen verhindert
-
-#4.0.11
-- Bugfix: mÃ¶gliche SicherheitslÃŒcke beim Upload von Widerrufsbelehrungen verhindert
-
-#4.1.0
-- Bugfix: Abfrage, ob Column bei Import schon vorhanden ist
-- Bugfix: Produktvarianten - Lagerbestand der aktuell ausgewÃ€hlten Variante wird jetzt im Produkttemplate angezeigt 
-- Bugfix: Unter bestimmten UmstÃ€nden lÃ€sst sich der Bewertungsreiter in der Produktverwaltung nicht mehr Ã¶ffnen
-- Bugfix: Produktbild bei Auswahl aus Mediathek wird nur die ID ÃŒbergeben
-- Bugfix: Bug gefixt, bei dem die Seite "BestellÃŒbersicht" im Frontend nur Fehler ausgegeben hat
-- Bugfix: Bestellvariable werden im Checkout wieder dargestellt
-- Bugfix: Anrede wird nach Ãnderung im Profil (Frontend) nicht dargestellt 
-- Bugfix: Speicherprobleme bei Profildaten (Frontend) behoben
-- Bugfix: Paypal: WebHook-Log vor allen anderen Einstellungen (BestellstatusÃ€nderung spezifiziert)
-- Bugfix: GiroPay ÃŒberarbeitet
-- Bugfix: Paypal: Module erst aufrufen, wenn der Bestellstatus sich nicht Ã€ndert 
-- Bugfix: LÃ€ndern ohne Steuern wird der korrekte Steuersatz des Standardlandes abgezogen 
-- Bugfix: Darstellungsfehler bei Versandart "Versandkostenfrei" behoben
-- Bugfix: Kundendatenoption "nicht anzeigen" greift auf Overview
-- Bugfix: Produktkategoriedarstellung optimiert
-- Bugfix: Versand per Mail wird nicht mehr von Versandkostenfrei und Selbstabholung unterdrÃŒckt
-- Bugfix: E-Mailkonfiguration - Verlinkungen werden wieder gespeichert
-- Bugfix: Exportprofil: Probleme bei Ãbermittlung von Content-Length gelÃ¶st
-- Bugfix: htaccess fÃŒr Apache 2.2 und 2.4 optimiert
-- Bugfix: Optimierung Paypal fÃŒr php7.2 - Ãbertragungsprobleme gelÃ¶st
-- Bugfix: Betreffzeile in Vorkasse korrigiert
-- Bugfix: Berechtigungsprobleme fÃŒr unterschiedliche Rollen korrigiert
-- Bugfix: DownloadPlus: Korrektur Ersetzungsfunktion bei der Individualisierung mit Produktvarianten
-- Bugfix: fehlender Warenkorbbutton im Widget, nachdem ein Produkt in den Warenkorb gelegt wurde
-- Bugfix: Sortierung nach Preis von Produkten in Produktansichten beachtet nun Variantenpreis
-- Bugfix: Integration der Sprachen in WP-Language-Ordner
-- Bugfix: Problem der sporadische LÃ¶schung der Lizenz aus der Pluginverwaltung im Multiblog behoben
-- Bugfix: fehlerhafte Ãbernahme der DateianhÃ€nge in Mediathek
-- Bugfix: automatisch versendete Rechnungen stellen den Status automatisch auf "Rechnung geschrieben"
-- Bugfix: CSS W3C ValiditÃ€t hergestellt
-- Bugfix: Beim Ã€ndern der Lieferadresse ist nicht mehr das Land der Rechnungsadresse ausgewÃ€hlt
-- Bugfix: Neuer Platzhalter %kunde_anrede% fÃŒr die Kundenanrede 
-- Bugfix: Produktkategorien enthalten alle zugeordneten Produkte
-- Feature: Satolo Newsletter-Registrierung mittels Double-OptIn
-- Feature: Copy&Paste fÃŒr die E-Mailwiederholung im Frontend gesperrt - hÃ€ndische Eingabe beider Mailadresse erzwungen
-- Feature: Darstellungsoptimierung Staffelpreise
-- Feature: Exportprofil - Weiterleiten nach Musterimport
-- Feature: Einstellungen importieren fÃŒhrt eine automatische Datenbankaktualisierung durch
-- Feature: Satolo Newsletter-Abonnenten in gewÃ€hlte Liste integrieren
-- Feature: Vorauswahl der Trackinganbieter (bei aktiviertem Paketverfolgungsmoduls) in Versandart auswÃ€hlbar
-- Feature: Erweiterung der Platzhalter fÃŒr Produktvarianten innerhalb des GutscheinProduktes
-- Feature: Export von Variationen von Varianten als einzelne Spalten
-- Feature: Rechnungsmodul - Ausrichtung des Logos auf den Rechnungen integriert
-- Feature: Lieferscheinmodul - Ausrichtung des Logos auf den Lieferscheinen integriert
-- Feature: Integration und Ausrichtung eines Logos auf allen Shop-E-Mails mÃ¶glich
-- Feature: Lagerbestandsmodul - Mail bei Erreichen des Minimallagerbestandes einer Variante mÃ¶glich
-- Feature: Exportprofil- Erweiterung der Datenfelder zur Erstellung eines GoogleShopping-Profils (Zustand, Bildlink, Versand)
-- Feature: Produktattribute: optionale Darstellung im Produkt-, Warenkorb-, BestellÃŒbersichts- und Mailtemplate
-- Feature: DownloadProdukte: Versandart "Versand per Mail" deaktivierbar
-- Feature: AboProdukte: optionale Informationsmail vor Ablauf des Abos (Zeitspanne variable konfigurierbar) mÃ¶glich
-- Feature: reCaptcha fÃŒr Kundenregistrierung ermÃ¶glicht
-- Feature: individuelle AnhÃ€nge an Mails ermÃ¶glicht
-- Feature: zeitlich planbare LÃ¶schfunktion der KundendatensÃ€tze (DSGVO) im Datenschutzreiter integriert
-- Feature: KooperationsfÃ€higkeit mit dem neuen WordPresseigene Pagebuilder "Gutenberg" sichergestellt
-- Feature: Gutscheinintegration optional deaktivierbar, wenn ein Rabatt aktiv ist
-- Feature: Ãbergabe der Rechnungs- und Lieferadressen an Paypal Plus
-- Feature: Bestellung kÃ¶nnen im Backend vollstÃ€ndig angelegt werden
-- Feature: Anrede in Kundenmails wird jetzt angezeigt und ist ÃŒbersetzbar
-- Feature: Integration SMS-Versand als Kundenkontakt im Modul "Kundenkontakt" im Bestellbackend mÃ¶glich
-- Feature: Integration der Daten fÃŒr eine Zweigstelle (Shopinfo) mÃ¶glich
-
-# 4.1.1
-- Bugfix: Hausnummerdarstellung (separate Hausnummererfassung) auf Rechnungen behoben
-- Bugfix: Hausnummerdarstellung (separate Hausnummererfassung) auf Lieferung behoben
-- Bugfix: Fehler bei alten Bestellungen mit Varianten behoben
-- Bugfix: Variantenpreise schalten im Produkttemplate wieder um
-- Bugfix: Ausrichtung des Betreffs bei Vorkasse ist wieder rechtsbÃŒndig
-- Bugfix: Bestellkommentare werden gespeichert
-- Bugfix: Lieferadresse in Bestellmails sichtbar
-- Bugfix: Staffelpreise zeigen wieder den korrekten Preis an
-- Bugfix: Kurzanzeige der MwSt. angepasst (kein MwSt-Satz anzeigen)
-- Bugfix: Speichern von Daten bei Bankeinzug
-- Bugfix: QR-Code fÃŒr Vorkasse wird korrekt in Mails angezeigt
-
-# 4.1.2
-- Bugfix: Platzhalterprobleme behoben
-- Bugfix: Lagerbestand zÃ€hlt wieder korrekt
-- Bugfix: negativer Rechnungsbetrag durch Gutscheine nicht mÃ¶glich
-- Bugfix: Bestellung anlegen, damit die Platzhalter an PayPal ersetzt werden kÃ¶nnen
-- Bugfix: Alte Berechnung Versand- und Zahlungskosten entfernt
-- Bugfix: pdf_parser aktualisiert (FPDF Version 1.81, FPDI Version 2.2.0, FpdiProtection 2)
-- Bugfix: Paypal Platzhalter erweitert
-- Bugfix: prozentuale GebÃŒhren/Rabatte im Paypal Plus werden gespeichert
-- Bugfix: ProduktArtikel - Kategorieaufbau wird ohne Warnung durchgefÃŒhrt
-- Feature: Erweiterung der englischen Sprachdatei
-- Feature: DSGVO-LÃ¶schfunktion kann entweder alle Kundendaten oder nur Gastkundendaten lÃ¶schen
-
-#4.1.3
-- Bugfix: KostenschlÃŒssel korrigiert
-- Bugfix: Rechnungskorrekturen werden wieder vollstÃ€ndig ausgefÃŒllt
-- Bugfix: Gutscheine werden vollstÃ€ndig auf Rechnungen eingetragen
-- Bugfix: Kundenverwaltung vergleicht die E-Mailadresse aus der Datenbank (eingeloggter User) mit dem aktuell bestellenden Kundendatensatz
-- Feature: "Weiter shoppen"-Seite kann ÃŒber die Seitenkonfiguration zugeordnet werden
-- Feature: Optionale Darstellung des Produktgewichtes in der Produktverwaltung
-- Feature: Optionale Darstellung der FÃŒllmenge in der Produktverwaltung
-- Feature: Optionale Darstellung der EAN und GTIN in der Produktverwaltung
-- Feature: Optionale Darstellung der Lieferzeit in der Produktverwaltung
-- Feature: Optionale Darstellung des Lagerbestandes in der Produktverwaltung
-- Feature: Optionale Darstellung der Produktgruppe in der Produktverwaltung
-
-#4.1.4
-- Bugfix: Zahlvarianten sind wieder lÃ¶schbar
-- Bugfix: Versandkostenstaffelung beachtet Gewicht wieder ordnungsgemÃ€Ã fÃŒr das Bestellbackend und der Rechnung
-- Bugfix: Paypal-Express gibt kein Land mehr mit
-- Bugfix: Produktvariable im Bestellbackend ist wieder editierbar
-- Bugfix: Behebung mÃ¶glicher Sicherheits-Schwachstellen
-- Bugfix: Gutscheine kÃ¶nnen wieder mehrfach verwendbar sein
-- Bugfix: Cache verhindert Rechnungsversand 
-- Bugfix: Produktvariable wird wieder im Mailtemplate dargestellt
-- Bugfix: Kein Eingabezwang bei deaktivierter Kreditkartenzahlung
-- Bugfix: Korrekturen Versand von Mindestlagerbestandsmengen
-- Bugfix: PHP-Problem im Kreditkartenmodul behoben
-- Bugfix: Kostenberechnung fÃŒr kombinierte Versandkosten wieder korrekt
-- Bugfix: Gesamtgewicht im Overview wird korrekt angezeigt
-- Bugfix: Korrektur bei der Filterung von Typ/Betrag bei Versandarten
-- Bugfix: unrabattierter Preis wird als "OldPrice" dargestellt und ÃŒberschreibt im Produkt-hinterlegten "alten Preis"
-- Bugfix: Gutscheinwert wird nicht mehr addiert, sondern vom Warenkorbwert abgezogen
-- Bugfix: Probleme beim erstmaligen aktivieren in einem Multiblog behoben
-- Bugfix: Paketverfolgung erzeugt wieder einen Link in der Statusmail bei Ãnderung
-- Feature: KundenID in Kundenverwaltung sortierbar
-- Feature: Neue Option "Wertgutschein", auch als Gutscheinprodukt
-- Feature: optionale Darstellung des rabattierten Preises in der ProduktÃŒbersicht
-- Feature: Textintegration fÃŒr unterschiOrdedliche Statusmeldungen in Statusmail an Besteller mÃ¶glich 
-- Feature: neues Produtktemplate mit Minigallerie der Produktbilder als Slider 
-
-#4.1.5
-- Bugfix: Korrekte Nounce ÃberprÃŒfung beim Sprung von der BestellÃŒbersicht in ein Produkt
-- Bugfix: Preisanzeige an, wenn Kundenverwaltung inaktiv, egal wie es vorher eingestellt war / Task #685
-- Bugfix: Nounce Fehler Backend Rechnungsverwaltung, Lieferschein, PayPal PLUS Stornierung/Statusaktualisierung / Task #687  
-- Feature: Produktartikel - Positionsspalte in Backend sichtbar und sortierbar
-
-#4.1.6
-- Bugfix: MÃ¶gliches Problem beim Update Prozess behoben
-- Bugfix: Nounce Absicherung beim aktualisieren der Zahlung im Modul "PayPal"
-- Bugfix: Bereits gezahlte PayPal Bestellungen zeigen dies jetzt auf der BestellabschluÃseite an
-- Bugfix: Das Standard LÃ¶schen Icon fÃŒr Wertgutscheine wird im Warenkob angezeigt
-- Bugfix: Verlinkung im Backend zum Produkt mit Nounce geschÃŒtzt
-- Bugfix: Korrektur Preisanzeige Produkttemplate ohne Kundenverwaltung
-- Feature: Gutscheinprodukte - Preis fÃŒr den Gutschein kann vom Kunden frei definiert werden
-- Feature: Gutscheinprodukte - Optionale Mindest- und Maximalschranken fÃŒr den Flexiblen Preis
-
-#4.1.7
-- Bugfix: Beim kopieren von Bildern wird die Bildzuordnung nicht mehr zerstÃ¶rt
-- Feature: Produktbilder kÃ¶nnen beim kopieren optional ausgeschlossen werden
-
-#4.1.8  
-- Bugfix: WordPress zeigt keine Aktualisierungen an, wenn wpShopGermany aktiv
-- Bugfix: PayPal Zahlung konnte nicht gestartet werden nach BestellabschluÃ
-- Bugfix: Spalte Artikelnummer im Produktbackend ist wieder sichtbar
-- Bugfix: Zeilenabstand vor FuÃtexten in Mails eingebaut
-- Bugfix: Speicherung von FuÃtexten mit HTML mÃ¶glich
-- Bugfix: Textvereinfachung bei flexiblen Preis Gutscheinprodukt
-- Bugfix: Doppelter Downloadlink bei Gutscheinprodukt raus
-- Bugfix: Speichern von Feldern im Rechnungsmodul wieder mÃ¶glich
-- Bugfix: Gutscheinprodukt und flexibler Preis arbeitet mit "Mehrfach mit Menge 1"
-- Bugfix: Speichern im alternatives Design in der Produktverwaltung wieder mÃ¶glich / Ticket #700
-- Bugfix: Speichern von Produktattributen RTE mit Links wieder mÃ¶glich / Ticket #699
-- Bugfix: Speichern des Fonts in DownloadPlus wieder mÃ¶glich / Ticket #698
-- Bugfix: Warnungen reduziert / Ticket #702
-- Bugfix: Produkte mit gleichen Originaldokumenten (DownloadPLUS) kÃ¶nnen jetzt zusammen bestellt und direkt individualisiert werden
-- Bugfix: Paketverfolgungslink wird direkt beim wechsel auf "Ware versendet" versendet.
-- Bugfix: Darstellungsanpassungen Wordpress Version 5.3
-- Bugfix: ArtikelnummmerÃŒberprÃŒfung nicht mehr fÃŒr Ãbersetzungen
-- Bugfix: Verlinkung zum Kunden in Statistik / Bestellverwaltung wiederhergestellt
-- Bugfix: wpNewsletterGermany beim Import werden bestehende Abonnenten nicht wieder auf aktiv gesetzt
-- Bugfix: Rechnungen - Links auf Briefpapier/Logo und Vorschaulinks korrigiert
-- Feature: URL Benachrichtigung sendet einen User Agent und Referer mit (Wordfence Regel) 
-- Feature: Shop rechnet jetzt mit gerundeten Einzelpreisen (Altes Verhalten optional)
-- Feature: Lieferadresse lÃ€sst sich zu einer Bestellung nachtrÃ€glich anlegen und auch lÃ¶schen
-- Feature: Beim kopieren/speichern von Produkten kann der Bestand innerhalb einer Produktgruppe automatisch ermittelt werden (Optional)
- 
-#4.2.0
-- Bugfix: Exportprofile (MwSt Wert) / Task #705
-- Bugfix: Export von verwendeten Gutscheinnummern / Task #705
-- Bugfix: LinkÃŒberprÃŒfung in Abonverwaltung / Task #707
-- Bugfix: Keine Warnung wenn News nicht geladen wurden
-- Bugfix: News werden jetzt wieder korrekt zwischengespeichert 
-- Bugfix: Es wird nicht mehr in der Lizenzverwaltung "Es ist eine neue Version verfÃŒgbar" angezeigt wenn noch keine Version des Moduls installiert ist
-- Bugfix: Kundenverwaltung Haken "Alle markieren" lÃ€dt die Seite nicht mehr neu
-- Bugfix: Zusammengefasste/gelÃ¶schte Kunden verschwinden aus der Bestellverwaltung
-- Bugfix: Bricht man die PayPal Zahlung bei PayPal (PayPal Plus) ab und hat die Zahlung ÃŒber den Warenkorb gestartet, wird man in den Warenkorb zurÃŒckgeleitet
-- Bugfix: Zahlungsart fÃ€llt durch LÃ€nderauswahl im Checkout weg, ist aber Kundenvoreinstellung. -> Overview ist korrekt beim ersten laden
-- Bugfix: Link in Paketverfolgung geht in neuem Fenster auf
-- Bugfix: Korrektur beim schreiben eines Fehlers im PayPal Modul bei Stornierung
-- Bugfix: Ausweisung von Anteilig bei Versand- und Zahlungskosten in Rechnung/Gutschrift
-- Bugfix: Produktoption "Bewertungspunkte" lÃ€sst sich mit Wert "Aus Kommentarbewertung" speichern
-- Bugfix: Auswahl der Zahl- und Versandarten im Produkt funktioniert zuverlÃ€ssig (PayPal Plus + Zahlvariante) / Task #708
-- Bugfix: Speichern von Rabatt % Werten in Kundengruppen/Produktgruppen und Produkten korrigiert
-- Feature: Zahlungsart "Kostenfrei" fÃŒr Bestellungen die mit 0,- durchgefÃŒhrt werden / Task  #709
-- Feature: FÃŒllmengen ÃŒberarbeitet (Bezugseinheit und Umrechnung im Produkt unterschiedlich und definierbar) 
-
-#4.2.1
-- Feature: Option "Nach dem entfernen eines Produktes auf die gÃŒnstigste Zahlungsart wechseln" hinzugefÃŒgt
-- Bugfix: Verlinkung aus ProduktgruppenÃŒbersicht ÃŒber Link "Zur Produktliste" funktioniert wieder
-- Bugfix: Einstellungen im Lieferscheinmodul sind jezt wieder speicherbar
-- Bugfix: Satollo Newslettereinstellungen sind wieder sichtbar
-- Bugfix: Sparkasse Internetkasse HASH Vergleich funktioniert wieder
-- Bugfix: HTML Mail blendet Zahlungskosten/Versandkosten optional aus wenn 0,-
-
-#4.2.2
-- Bugfix: Fehlerbehandlung bei URL Benachrichtigung
-- Bugfix: Zur besseren Anpassbarkeit wurden die Bezeichnungen "Rechnung" und "Rechnungskorrektur" ins Template ausgelagert
-- Bugfix: Abo Modul ohne URL Benachrichtigung erzeugt keinen Fehler mehr
-- Bugfix: Kopieren von Bildern funktioniert auch ohne url_wrapper korrekt
-- Bugfix: E-Mail in HTML Mail korrekt verlinkt
-- Bugfix: FÃŒllmengenpreisanzeige in ProduktÃŒbersichten korrigiert
-- Bugfix: Plugin zur AbwÃ€rtskompatibilitÃ€t alter DownloadProduktlinks entwickelt (https://wpshopgermany.maennchen1.de/wp-content/uploads/wpsg_downloadredirect.zip)
-- Bugfix: Versandartauswahl bei Downloadprodukten, und Option "Versand per Mail" inaktiv korrigiert / Task #709
-- Bugfix: Korrektur Weiterleitung nach Bestellerstellung im Backend / Task #713
-- Bugfix: Option "Zahlungskosten bei 0 ausblenden" blendet die Kosten nun auch in der Zusammenfassung aus / Task #717
-- Bugfix: FÃŒllmengenanzeige in Varianten kontrolliert (Varianten addieren FÃŒllmenge) / Task #718
-- Bugfix: PLZ lÃ€sst, wenn Pflichtfeld nur Zahlen, Buchstaben, Bindestrich und Freizeichen zu / Task #719
-
-#4.2.3
-- Feature: PayPal API unterstÃŒtzt jetzt V2 der Rest API
-- Feature: Filter wpsg_sendMail zur Anpassung von Mails hinzugefÃŒgt
-- Feature: Suche nach ID: in der Produktverwaltung im Suchstring
-- Bugfix: Kein Fehler bei aktivierter FÃŒllmenge und erstmaligem speichern eines Produktes
-- Bugfix: Die Funktion "Zuordnung Produkt zu Artikel", erzwingt nicht mehr die neu generierung des Posts, nur noch bei Bedarf
-- Bugfix: Die Request ÃberprÃŒfung fÃŒr lokale URLs erlaubt auch URLs ohne Protokoll, die mit "/" beginnen
-- Bugfix: Apache 2.2/2.4 Konfiguration fÃŒr Verzeichnisschutz / Task #535
-- Bugfix: Umschalten auf Standardsprache funktioniert wieder aus Ãbersetzung heraus
-- Bugfix: Checkboxen an WP Layout 5.3 angepasst
-- Bugfix: "Rechnungen ansehen" ÃŒber mehrere Rechnungen funktioniert wieder / Task #733
-- Bugfix: Updtate der VerschlÃŒsselung innerhalb Kreditkartenmodul / Task #727
-- Bugfix: Logo in E-Mail Konfiguration lÃ€sst sich speichern / Task #726
-- Bugfix: Einmal als bezahlt gemeldete Bestellungen ignorieren zukÃŒnftige ZahlungsbestÃ€tigungen auf diesen Bestellungen
-
-#4.2.4
-- Feature: Export/Import von Varianten und Variationen
-- Bugfix: Status auf eingestellten Wert nach Registrierung im Checkout
-- Bugfix: Durch den Fix in 4.2.3. ("Zuordnung Produkt zu Artikel") wurden die Kategorien nicht mehr gespeichert. Dies ist korrigiert.
-- Bugfix: Eigene Kundenvariablen erzeugen bei bestehenden Kunden nicht mehr das Problem das man die Kundenverwaltung nicht Ã¶ffnen kann
-- Bugfix: Probleme mit "Bezahlen ÃŒber Amazon" wurden behoben
-- Bugfix: Warnungen im Code aufgelÃ¶st
-
-#4.2.5
-- Feature: Gutenberg Block zur Produktanzeige
-- Bugfix: Bestellen ohne Kundenverwaltung fÃŒhrt nicht mehr zum Fehler (Bug durch 4.2.4)
-- Bugfix: Lieferschein: Warnungen entfernt
-- Bugfix: Lieferschein: Vorschau beachtet nun wieder die Produktauswahl
-- Bugfix: Korrektur Paketverfolgung-URL fÃŒr DPD, neu: Fedex-URL
-- Bugfix: Problem beim Import von Varianten behoben
-- Bugfix: Deinstallation von Produkten lÃ¶scht abhÃ€ngigkeiten (Produktartikelwerte, Varianten)
-
-#4.2.6
-- Bugfix: Falsche Bilder beim hinzufÃŒgen von Bilder im Warenkorblayer (Theme)
-- Bugfix: Es gab ein Problem mit der Ãbernahme der Auswahl der Varianten und Produkten ÃŒber Shortcodes
-- Bugfix: Speichern der Pflichtfeldeinstellung ist wieder mÃ¶glich / Track #738
-- Bugfix: Checkbox InnerEU in Versandzonenverwaltung lÃ€sst sich wieder fÃŒr alle speichern
-- Bugfix: Checkbox "Aktiv" in der Versandarten- /Zahlungartenverwaltung lÃ€sst sich wieder speichern
-- Bugfix: Session wird fÃŒr REST Abfragen geschlossen
-- Bugfix: Button "Mediathek" ist nicht mehr beschreibbar / Task #741
-- Bugfix: Zahlungsart "Kostenlos" lÃ€sst sich im Produkt auswÃ€hlen / Task #743
-- Bugfix: DownloadPlus - Dateinamen mit Freizeichen sind jetzt mÃ¶glich / Task #744
-- Bugfix: Downloadplus - Das Font Helvetica Kursiv funktioniert wieder
-- Bugfix: Downloadplus - Speichern von Winkel und Sichtbarkeit wieder mÃ¶glich
-- Bugfix: Technische Einstellungen in Bestellung unter "Entwickleroptionen" verschoben um Verwirrungen zu vermeiden
-- Bugfix: Ist Mindestbestellmenge einzeln aktiviert erscheint es im Reiter "Bestand / Gew. / FÃŒllm." innerhalb der Produktverwaltung / Task #745
-- Bugfix: Bei Problemen mit dem Lizenzserver werden die API Anfragen jetzt 12h pausiert (AuÃer man erzwingt die ÃberprÃŒfung im Dashbord -> Aktualisierungen -> Erneut prÃŒfen)
-- Bugfix: Der Timeout fÃŒr API Anfragen wurde generell auf 5s gesetzt
-
-#4.2.7
-- Bugfix: CSS Abstand im Backend korrigiert (Bestimmte PHP Versionen)
-- Bugfix: Gewichtsmodul lÃ¶scht die anderen Module nicht aus der Produktverwaltung (Produkt bearbeiten)
-
-#4.2.8
-- Bugfix: Ermittlung des KostenschlÃŒssels anhand der PLZ korrigiert
-- Bugfix: Speicherung der Einstellung "Anzeige" im Produktattribut
-- Bugfix: Anzeige von Produktattributen bei Varianten
-- Bugfix: Klicken auf Bild in der Produktverwaltung Ã¶ffnet das Produkt
-- Bugfix: PayPal V2 Problem "Ressource nicht gefunden"
-- Bugfix: Wordpress ohne Gutenberg fÃŒhrt mit dem Shop nicht mehr zum Abbruch
-- Bugfix: Wordpress Gesundheitscheck bestanden
-- Feature: Erinnerungsmail bei UnvollstÃ€ndigen Bestellungen
-
-#4.2.9
-- Bugfix: Fehlermeldung bei Installation ohne Newsletter korrigiert
-- Bugfix: Benutzerwechsel ÃŒber das Backend funktioniert wieder
-- Bugfix: Bootstrap auf Version 3.4.1. Aktualisiert
-
-#4.3.0
-- Feature: Abo Modul ÃŒberarbeitet (Abos je Produkt / VorverlÃ€ngerungsaktionen)
-- Feature: Mehrzeilige Produktvariablen
-- Feature: Mehrere Tempaltes fÃŒr Downloadplus PDF Anpassungen
-- Feature: Zentrale Dokumente fÃŒr Downloadplus
-- Feature: Template je Variante fÃŒr Downloadplus anpassbar
-- Feature: parallele Erstellung eines Dokumentes ohne Vorlage (Briefbogenfunktion)
-- Feature: Stornieren einer Rechnug Ã€ndert den Bestellstatus der Bestellung auf Storniert
-- Feature: Globale Bilder in globalen Variationen
-- Feature: Gutscheine/Coupons werden optional nur noch auf ausgewÃ€hlte Produkte/Produktgruppen angerechnet
-- Feature: Export/Import der Kategorie IDs beim Daten Export/Import
-- Bugfix: Anzeige von Name/Titel in den Passwort Vergessen Mails
-- Bugfix: KundenzusammenfÃŒgen funktioniert wieder
-- Bugfix: Kundenkontekt - Template repariert fÃŒr "Zahlungserinnerung"
-- Bugfix: Korrektur beim speichern des Mindestbestellwertes
-- Bugfix: User_Views ignorieren und Theme Probleme damit behoben
-- Bugfix: Anzeige von Hausnummer Lieferanschrift in Mails
-- Bugfix: Shortcodes in Produkttexten werden ersetzt wenn Produkt ÃŒber Shortcode eingebunden ist
-- Bugfix: % Werte lassen sich fÃŒr GebÃŒhr/Rabatt bei Zahlungsvarianten eingeben
-- Bugfix: Standardland lÃ€sst sich wieder speichern
-- Bugfix: Login Widget wieder verwendbar in aktueller WP Version
-- Bugfix: Fehlber bei der Suche nach Produktgruppen behoben
-- Bugfix: Produkttemplate fÃŒr den Warenkorbteaser lÃ€sst sich wieder Ã€ndern
-- Bugfix: Wird ein Produkt hinzugefÃŒgt fÃŒr das ein Gutschein nicht gÃŒltig ist, wird der Gutschein entfernt
-- Bugfix: Das derzeit verwendete E-Mail Logo kann im Backend angezeigt werden
-
-#4.3.1
-- Bugfix: Korrektur Berechnung Versand- und Zahlungsarten
-
-#4.3.2
-- Bugfix: Korrektur Berechnung Versand- und Zahlungsarten
-- Bugfix: Korrektur PayPal
-- Bugfix: Anlegen von Bestellungen, Kundensuche
-
-#4.3.3
-- Feature: Exportprofile neue Spalten (Netto, Summe Steuer) fÃŒr die 4 SteuersÃ€tze
-- Feature: Mit Rechnunskorrektur Statuswechsel optional mÃ¶glich
-- Feature: Im Produkt im Backend werden jetzt alle Produktvariablen angezeigt nicht nur die beim bestellen gesetzen
-- Bugfix: Gutscheine mit Betrag > Bestellwert
-- Bugfix: Gutscheinprodukt mit variablen Preis repariert
-- Bugfix: GebÃŒhren fÃŒr Rechnungskorrekturen wieder mÃ¶glich
-- Bugfix: Backend Kundenvariablen zeigt Auswahl direkt nach Wechsel des Variablentypes an
-- Bugfix: Weitere Kundendaten werden in Admin- und Kundenmail und Bestellverwaltung angezeigt
-- Bugfix: Sortierung nach Preis Ab- und Austeigend korrigiert (Produktansichten / Theme)
-- Bugfix: Meta Daten (schema.org) repariert/erweitert im Standard Produkttemplate
-- Bugfix: Staffelpreise bei StÃŒck nicht mehr mit Kommastelle
-
-#4.3.4
-- Feature: Bankeinzugsdaten lassen sich im Backend bei bestehenden Bestellungen Ã€ndern
-- Feature: Kundenkontakt aus der Bestellverwaltung fÃŒr mehrere Bestellungen mÃ¶glich. (Templates mÃŒsse in user_views ev. aktualisiert werden)
-- Feature: Suche nach Zahlungsart in Bestellverwaltung mÃ¶glich
-- Feature: Bei Statuswechsel ÃŒber die BestellÃŒbersicht kÃ¶nnen die Kunden jetzt optional darÃŒber informiert werden
-- Feature: Adminmail in Kundenverwaltung ohne DEBUG Modus auslÃ¶sbar (Reiter Bestelldaten)
-- Feature: Mathe Captcha Schutz bei Registrierung
-- Bugfix: PasswortzurÃŒcksetzen funktioniert jetzt auch, wenn parallel ein gelÃ¶schter Kunde mit gleicher E-Mail existiert
-- Bugfix: Produktartikel Neu Aufbauen beachtet den "Entwurfs - Status"
-- Bugfix: Produktartikel Neu-Aufbau mit Resten alter "Ãbersetzungen" korrigiert (Produktstatus wurde ÃŒberschrieben)
-- Bugfix: Probleme mit bestimmten Cache/SEO Plugins in Zusammenhang mit den Produktartikeln gelÃ¶st
-- Bugfix: Vorkasse: Bei Verwendung von Wertgutscheinen wurde der falsche zu ÃŒberweisende Betrag angezeigt
-- Bugfix: Gutscheine/Wertgutscheine die nicht mehrfach verwendbar sind werden im Backend korrekt angezeigt 
-- Bugfix: PayPalPLUS ohne die Option "PayPal Plus aktivieren" und die Zahlung ÃŒber den IFrame konnte der WebHook nicht zugeordnet werden
-- Bugfix: PayPalPLUS zeigt korrektes Logo, wenn PP PLUS noch deaktiviert ist
-- Bugfix: Gutschein - Zahlbetrag wird bei Wertgutshein und teilweiser Bezahlung korrekt angezeigt
-- Bugfix: PHP8 KompatibilitÃ€t Cron/PDF Barcode
-- Bugfix: Option "Bestellungen fÃŒr 0 EUR direkt abschlieÃen" bezieht sich jetzt auf den zu zahlenden Betrag und nicht auf den Bestellwert (Bei Wertgutscheinen) 
-- Bugfix: Korrektur alter Preis bei Kundengruppenrabatt
-
-#4.3.5
-- Bugfix: Auf der Kundenangaben Seite, im Bestellablauf, wird nun keine Fehlermeldung mehr angezeigt
-
-#4.3.6
-- Bugfix: Fehler bei HTML Mail + AuftragsbestÃ€tigung korrigiert
-- Bugfix: Fehler in Passwort Vergessen Funktion behoben
-- Bugfix: Reihenfolge geÃ€ndert Module werden jetzt vor dem initShop geladen!
-- Bugfix: Korrekte Filterung nach ZustÃ€nden in Gutscheinverwaltung #775
-- Bugfix: Fehler bei PayPal Plus und Selbstabholung korrigiert
-- Bugfix: Pager/Filter nach Status bei Gutscheinen
-
-#4.3.7
-- Bugfix: Warenkorb-Rabatt wird jetzt vor den Versandkosten berechnet #777
-- Bugfix: Wertgutscheine nutzen jetzt nur noch den verfÃŒgbaren Wert
-- Bugfix: GelÃ¶schte Produkte werden in ProduktÃŒbersichtseite (Backend) nicht mitgezÃ€hlt
-- Bugfix: Problem beim Upload von Bildern in der Mediathek bekomen (Bilder wurden nicht direkt nach Upload angezeigt)
-- Bugfix: KompatibilitÃ€t mit alten Bestellungen verbessert (KostenschlÃŒssel Versandarten auf Gewicht)
-- Bugfix: Leere HTML Mails 
-- Bugfix: Verwendung unter PHP8 erzeugt keinen Fehler mehr wenn kein Winkel bei den Textfeldern Gutscheinprodukt definiert ist
-- Bugfix: WPML Korrkte Preise in Ãbersetzung in zusammenspiel mit Produktartikeln
-- Bugfix: Keine Rechnungsmail wenn Rechnung automatisch ersellt wird und Option "Mail an BestellbestÃ€tigung anhÃ€ngen" aktiviert ist / #784
-- Bugfix: Statistik: API Key fÃŒr Adressdecodierung hinterlegt / Kundenkarte
-- Feature: Neue Platzhalter fÃŒr Liefer- und Rechnungsadresse 
-- Feature: Staffelpreise kÃ¶nnen jetzt angewendet werden wenn im Backend ein Produkt hinzugefÃŒgt wird #776
-- Feature: Abo Modul: Spalten im Backend lassen sich sortieren
-- Feature: Fehlerprotokoll kann aktiviert werden
-- Feature: Abos kÃ¶nnen jetzt auf 10 Jahre in der Zukunft gesetzt werden
-- Feature: Positionssnummer aus ProduktÃŒbersicht bearbeitbar
-- Feature: Kategorie im Produkt Backend anzeigbar, sortier und filterbar 
-- Feature: Produkte ohne Kategorie finden 
-
-#4.3.8
-- Bugfix: Downloadprodukte werden bei Versandkosten Staffelpreisen nicht mehr berÃŒcksichtigt
-- Bugfix: MÃ¶gliche XSS LÃŒcke in Kundenverwaltung/Profil geschlossen 
-- Feature: Optimierung Exportprofile
-
-#4.4.0
-- Bugfix: PHP7.2 AbwÃ€rtskompatibilitÃ€t (Rechnungsmodul)
-- Bugfix: Rechnungsansicht in der Bestellverwaltung
-- Bugfix: UngÃŒltige URLs bei URL Benachrichtigung werden nicht getriggert
-- Bugfix: Gewicht aus Produktvarianten wird korrekt gespeichert
-- Bugfix: MÃ¶gliche XSS LÃŒcke bei Kundenregistrierung geschlossen (gemeldet durch BSI)
-- Bugfix: autocomplete="off" fÃŒr E-Mail/Kennwortfelder (gemeldet durch BSI)
-- Bugfix: Session Cookie wird mit Secure auf HTTPS beschrÃ€nkt (gemeldet durch BSI)
-- Bugfix: Rechnungstemplate (invoice_pdf.phtml) Korrektur/Auszeichnung der Preise 
-- Bugfix: Rechnungsvorschau 
-- Bugfix: Modul Exportprofile
-- Feature: Verbesserung KompatibilitÃ€t PHP8.1
-- Feature: Verbesserung KompatibilitÃ€t Wordpress 6.1
-- Feature: Modul Rechnungen Sammelrechnungen kÃ¶nnen nun erstellt werden
-- Feature: Produktdetailname kann auf der Rechnung angezeigt werden
-- Feature: DSGVO Layer fÃŒr das Registrierungsrecaptcha
-- Feature: Exportprofile: XML Erstellung verbessert
-- Feature: Exportprofile: Automatischer Export bei Bestellung
-- Feature: Vorgabe Standardversand je Versandzone
-- Feature: Steuerberechnung nach Lieferland (Option)
-- Feature: Erweiterung von Exportfeldern (z.B. Einzelproduktpreis bei Bestellungen)
-- Feature: Heraufsetzen der KomplexitÃ€tsanforderung der KundenpasswÃ¶rter (gemeldet durch BSI)
-- Feature: Heraufsetzen der Sicherheit der Kundenregistrierung (gemeldet durch BSI)
-
-#4.4.1
-- Bugfix: Child Theme/Theme JS/IMG/CSS Ressourcen werden korrekt geladen
-
-#4.4.2
-- Bugfix: Versand per Mail wieder verfÃŒgbar bei Downloadprodukt / Downloadplus Produkt
-
-#4.4.3
-- Feature: PHP 8.2 KompatibilitÃ€t
-- Feature: Modul Produktgruppen: Bilder kÃ¶nnen an Produktgruppen angehÃ€ngt werden
-- Feature: Modul Produktvarianten: EAN fÃŒr Variationen (Produktvarianten)
-- Feature: Modul Exportprofile: Exportprofil kann nun stÃŒndlich mit dem Wordpress Cron ausgefÃŒhrt werden
-- Feature: Modul Exportprofile: Die Versandkosten der Produkte kÃ¶nnen ab sofort in einem speziellen Format exportiert werden, dieses wird fÃŒr die Integration des Google Produktfeeds benÃ¶tigt
-- Feature: Modul Rechnungen: Suche nach Rechnungen in Bestellverwaltung durch DatenbankÃ€nderung angepasst
-- Feature: Modul DownloadPlus: Passwortschutz kann nun deaktiviert werden
-- Feature: Warenwert kann nun in der Bestellverwaltung angezeigt werden
-- Feature: Neues Produkttemplate: standard3.phtml (Slider und Zoom)
-- Bugfix: Modul Rechnungen: Umleitung nach invoiceAction/stornoAction behoben
-- Bugfix: Modul Rechnungen: Produkte werden nun wieder richtig auf der Rechnung zugeordnet, wenn mehrere Rechnungen ÃŒber die Bestellverwaltung geschrieben werden
-- Bugfix: Modul Rechnungen: Link Im Produkt zum Download von Sammelrechnungen korrigiert
-- Bugfix: Modul Rechnungen: Anzeigefehler von Produktsumme behoben
-- Bugfix: Modul Rechnungen: Zahlungsart auf Rechnungskorrektur anzeigen
-- Bugfix: Modul Rechnungen: MwSt. gemÃ€Ã Lieferland wird nun richtig auf der Rechnung angezeigt
-- Bugfix: Modul Produktvariablen: Bestellexport von Produktvariablen korrigiert
-- Buffix: Modul Produktvariablen: Produktvariablen auf Rechnungen/Rechnungskorrekturen
-- Bugfix: Modul Produktgruppen: ProduktgruppenÃŒbersichtsseite funktioniert ohne Lagerbestand
-- Bugfix: Modul Statistik: Shopstatistik wurde nicht angezeigt, wenn eine Bestellung mit einer Zahlvariante existierte
-- Bugfix: Modul Trusted Shops: Einstellungen kÃ¶nnen nun wieder gespeichert werden
-- Bugfix: Modul DownloadPlus: Cron wird nun wieder korrekt ausgefÃŒhrt
-- Bugfix: Modul Versandkostenfrei: Versandart Versandkostenfrei schaut nun ob die Versandart im Produkt konfiguriert wurde
-- Bugfix: Bestellexport von Produktvariablen korrigiert
-- Bugfix: Kundenexport funktioniert nun wieder
-- Bugfix: user_views Templates werden aus dem Child-Theme geladen
-
-#4.4.4
-- Feature: Productcodemanagement - Produktcodes (EAN, GTIN, SKU ...) kÃ¶nnen nun in einem neuem Reiter im Produkt eingepflegt werden
-- Feature: Modul Exportprofile: Jede mÃ¶gliche Produktvariantenkombination kann nun als gesondertes Produkt (im CSV-Export) exportiert werden
-- Feature: Modul Exportprofile: Produktdetailname ist nun exportierbar
-- Feature: Modul Produktvarianten: Produktkombinationen fÃŒr Varianten
-- Feature: Modul Produktgruppen: Positionsnummer fÃŒr Produktgruppen im Frontend
-- Feature: Modul Produktgruppen: Markierung wenn Produktgruppe aktiven Rabatt hat in ProduktgruppenÃŒbersicht
-- Feature: Modul Statistik: alte Piwik API durch neue Matomo API ausgetauscht + erweitertes Bestelltracking / eCommerce-tracking integriert
-- Feature: Modul Statistik: Google Analytics 4 / Google Tagmanager + Bestelltracking integriert
-- Bugfix: Modul Produktvarianten: EAN bei Varianten auch ohne Produktartikelmodul anzeigbar wenn gefÃŒllt
-- Bugfix: Modul Rechnungen: E-Mails der Sammelrechnungnen werden nun wieder richtig generiert (Anhang + RNr)
-- Anpassung: Modul Exportprofile: Google Produktfeed Versandkosten werden nur noch fÃŒr De, AT und CH ausgegeben
-
-#4.4.5
-- Bugfix: Modul Produktvarianten: Varianten mit Lagerbestand 0 verursachen nun keinen Fehler mehr im Produkttemplate
-- Bugfix: Modul Trusted Shops: Backend UI von Moduleinstellungen ÃŒberarbeitet
-
-#4.4.6
-- Bugfix: Modul Produktvarianten: Produktvariationen mit einen "ungesetzten" Preis fÃŒhren nun zu keinem Fehler in der Bestellverwaltung mehr
-- Bugifx: Summe die an PayPal bei DetailÃŒbertragung ÃŒbermittelt wird wird aus gerundeten Werten ermittelt. (Backend = BRUTTO ergibt krumme NETTO Werte im Frontend)
-- Bugfix: Modul Produktvarianten: Produktvariationen mit einen "ungesetzten" Preis fÃŒhren nun zu keinem Fehler in der Bestellverwaltung mehr
-- Bugfix: Modul PayPal Plus: Gutscheinwert und Versandkosten werden wieder bei PP berechnet
-- Bugfix: Modul PayPal Plus: Telefonnummer korrekt ÃŒbertragen
-- Bugfix: Korrektes Lieferland bei Besteuerung aus Lieferland
-- Bugfix: PayPal PLus ÃŒbertrÃ€gt Adresse nur wenn im Shop gefunden (Lieferanschrift)
-- Bugfix: Backend Bestellverwaltung Jahre im Filter absteigend und Monatsnamen in der entsprechenden Sprache
-- Bugfix: Korrektur bei kombinierten Versandarten und Einseitencheckout
-- Bugfix: PHP 8.2
-- Feature: Modul Vorkasse: QR-Code ist nun deaktivierbar
-- Feature: Modul Vorkasse: QR-Rechnung ist nun an BestellbestÃ€tigung (E-Mail) anhÃ€ngbar
-- Feature: Modul Vorkasse: QR-Rechnung kann nun auf der Bestellabschlussseite heruntergeladen werden
-- Feature: Modul Vorkasse: Girocode und QR-Code von QR-Rechnung wird nun auf der Bestllabschlusseite und in der BestellbestÃ€tigung (E-Mail) dargestellt
-- Feature: Kundensuche sucht nun in Kommenatar am Kunden und benutzerdefinierten Kundenfeldern
-
-#4.4.7
-- Bugfix: Fehler mit aktuellen WPML Version und der Funktion "String-Ãbersetzung fÃŒllen"
-- Bugfix: PHP 8.2 Fehler mit FPDF
-- Bugfix: Alternative Produktansicht mit Produktkombinationen
-- Bugfix: PHP 8.2 Fehler bei Rechnungen ohne Farbe
-- Bugfix: wpsg_combination Klasse auch ohne Produktvarianten geladen
-- Bugfix: Versandartenkombination Downloadprodukt + Angelegte Versandart kombiniert in Bestellung
-- Bugfix: IP Adressen beim Backcheck von Micropayment mit aufgenommen, sollte gethostbyaddr fehlschlagen
-- Bugfix: Probleme bei Bestellungen mit 0,- durch Wertgutschein und z.B. Gutscheinerstellung oder PDF Erstellung behoben
-- Feature: Exportprofile: Spalte "Produktbilder" exportiert mehrere Bildeer mit | getrennt
-- Feature: Suche nach Firmennamen beim Anlegen neuer Bestellungen
-- Feature: Wordpress thickbox durch fslightbox ersetzt
-
-#4.4.8
-- Feature: Vorauswahl Leer bei Zahlungsarten zugelassen
-- Feature: Suche nach Bestellungen eines speziellen Gutscheins im Backend
-- Feature: InvoiveNr die zu PayPal ÃŒbermittelt wird kann angepasst werden (Es gab einen Kunden bei dem waren die IDs bei PayPal schon vergeben)
-- Feature: Sortierung der ZubehÃ¶rprodukte im Produktbacken
-- Bugfix: EAN/GTIN etc. (Productcodes) fÃŒr Export-/Import im Produktexport (ohne Varianten)
-- Bugfix: Korrektur Gutschein mit % Wert auf Rechnung
-
-#4.4.9
-- Bugfix: Tabellenstruktur Rechnungen fÃŒr eRechnungen vorbereitet
-
-#4.4.10
-- Bugfix: Bestellungen mit Teil - Gtuscheinen kÃ¶nnen jetzt mit PayPal zurÃŒckerstattet werden
-- Bugfix: Steuersatz 0 fÃŒhrt nicht zu einem Fehler beim schreiben der Rechnung
-- Bugfix: DB Udpdate nach Plugin Update wird ausgefÃŒhrt
-- Feature: Update Log um zukÃŒnftige Probleme beim Update zu erkennen
-
-#4.4.11
-- Bugfix: Korrektur von Rechnungen mit Gutscheinen, die zum Rechnungszeitpunkt nicht mehr gÃŒltig sind
-- Bugfix: Fehler beim Aktivieren des Downloadprodukte-Moduls ohne angelegte Produkte behoben
-- Bugfix: Lagerbestandsspalte Produktverwaltung korrigiert
-- Bugfix: Uploads bei Downloadprodukten korrigiert
-- Bugfix: Ãbernahme von ShopKunden in wpNewsletterGermany ÃŒber Newsletter Modul importiert Vor- und Name korrekt
-- Feature: eInvoice RechnungsempfÃ€nger unabhÃ€ngig von E-Mail des Kunden
-- Feature: GiroCode in Bestellabschluss, Kundenemail, Rechnung
-- Feature: Begrenzung auf einen Gutschein je Bestellung mÃ¶glich
-
-#4.4.12
-- Feature: Neues Modul "Widerrufsformular" fÃŒr die Einhaltung des Widerrufsrechts
-- Feature: Gutschein Produktauswahl alphabetisch sortiert und inaktive Produkte werden nicht angezeigt
-- Feature: GutscheinÃŒbersicht neue Spalte "Produkte"
-- Feature: Gutscheine duplizierbar
-- Feature: Exportprofile/Statistik - Export von KÃ€ufen
-- Feature: Exportprofile/Staffelpreise - Export von minimalem Brutto-/Netto Produktpreis
-- Feature: Exportprofile/Bestellexport - Export von verwendeten SteuersÃ€tzen
-- Bugfix: Exportprofile - Problem mit Feld "Anzahl Produkte" korrigiert
-- Bugfix: Datumsformatierung mit IntlDateFormatter
-- Bugfix: Produktname, Artikelnummer, EAN bei Varianten im Export berÃŒcksichtigen
-- Bugfix: Newsletter wieder direkt in den Checkout integriert
-- Bugfix: Gutschein der nur teilweise im Warenkorb mÃ¶glich ist, hat unter bestimmten Konfigurationen zu Problemen gefÃŒhrt
-
-#4.4.13
-- Anpassung: Widerrufsformular KnÃ¶pfe mit zusÃ€tzlichem Text sichtbarer gemacht
-- Anpassung: Texte des Widerrufsformulars sind jetzt rechtskonformer
-- Anpassung: Mailtemplate BestellbestÃ€tigung Textform mit ZeilenumbrÃŒchen/Abgrenzungen ÃŒbersichtlicher gestaltet
+#3.8.0 / 4852
+ - Feature - Exportprofile - Export von generierten Gutscheincodes
+ - Feature - PayPal - Abwicklung ÃŒber REST APO (noch optional)
+ - Feature - PayPal - Stornierung von Zahlungen bei StatusÃ€nderung einer Bestellung (nur bei REST API)
+ - Feature - Produkt aus Bestellverwaltung verlinkt
+ - Feature - CSS Anpassungen Frontend 
+ - Feature - Core - Format fÃŒr Geburtsdatum wird angezeigt und Erkennung verbessert
+ - Feature - Produktbilder - Nach Upload werden Varianten neu geladen
+ - Feature - Varianten - Variantenvorschaubild beachtet die gewÃ€hlte Kombination
+ - Feature - Varianten - Variantenauswahl ÃŒber Grafiken
+ - Feature - Neues Verhalten von Produkten im Warenkorb "Nur einmal mit Menge 1"
+ - Feature - Suche in Bestellverwaltung sucht in Produktvariablen und Varianten
+ - Feature - Produktvariablen lassen sich in Bestellverwaltung nachtrÃ€glich Ã€ndern
+ - Feature - Bestellvariablen lassen sich in Bestellverwaltung nachtrÃ€glich Ã€ndern
+ - Feature - LizenzschlÃŒssel ist ÃŒber die Pluginverwaltung herunterladbar
+ - Feature - Bei aktivem Debug Modus lassen sich URL Benachrichtigungen fÃŒr Kauf/Zahlung aus einer Bestellung simulieren
+ - Feature - News Bereich im Backend
+ - Feature - gestaffelte Preise beachten die Produktrabatte
+ - Feature - ShopInfo Werte lassen sich ÃŒbersetzen
+ - Bugfix - Giropay - individuelle Namen und Beschreibungen der Zahlungsarten lassen sich ÃŒbersetzen
+ - Bugfix - Statistikmodul - Vergleiche funktionieren wieder
+ - Bugfix - Rechnungsmodul - Zahlungsart wird nicht mehr als "Rechnung mit Zahlungsgarantie" angezeigt
+ - Bugfix - Name der Zahlungsarten wird korrekt gebildet
+ - Bugfix - Crefopay - Fehler bei der MNS StatusÃ€nderung behoben
+ - Bugfix - E-Mail bei Passwortanforderung wird in HTML versendet
+ - Bugfix - Produktvariable auf Anfrageliste anzeigen
+ - Butfix - Button fÃŒr BeschrÃ€nkung der Versandzonen nach PLZ Gebieten hat wieder eine Grafik bekommen
+ - Bugfix - Entfernen der EingabemÃ¶glichkeit fÃŒr die Artikelnummer fÃŒr Varianten (Checkbox)
+ - Buffix - Rabatte auf Produktgruppen funktionieren wieder
+ - Bugfix - Export von Produktvariablen funktioniert wieder
+ - Bugfix - calc-typ wird korrekt im Export angezeigt
+ - Bugfix - Kundenvariablen werden Systemweit wieder ersetzt
+ - Bugfix - Leistungsort - Dialog erhÃ€lt _GET Variablen bei 
+ - Bugfix - Kundenverwaltung - Pager im Footer wechselt die Seite mit Enter
+ - Bugfix - Produktverwaltung - Nur aktivierte Zahlungs- oder Versandarten stehen zur Auswahl der erlaubten Zahlungs- und Versandarten
+ - Bugfix - Rechnungsmodul - Gutschrift wird beim Download mit dem korrekten Dateinamen abgelegt
+ - Bugfix - Kundenverwaltung - Monat MÃ€rz wird im Datepicker korrekt dargestellt 
+ - Bugfix - Entfernen des width in der frontend.css fÃŒr das Produktbild (sonst greift die Backend-Einstellung nicht)
+ - Bugfix - Kundenverwaltung - Passwort des gekoppelten Wordpress Nutzers wird nur noch gesetzt wenn nicht leer
+ - Bugfix - Core - Module mit abgelaufenem Demo Modus lassen sich deaktivieren
+ - Bugfix - Versandkostenfrei - FÃŒr den Vergleich der Mindestbestellmenge wird jetzt der Preis vor Versand/Zahlungskosten herangezogen
+ - Bugfix - EintrÃ€ge im Protokoll zeigen ersetzte Platzhalter
+ - Bugfix - Das HTML Template wird fÃŒr den Paketverfolgungslink verwendet
+ - Bugfix - Downloadprodukt - Upload Bereich wird erst angezeigt wenn Produkt erstmalig gespeichert
+ - Bugfix - Kein Login nach BestellabschluÃ mehr
+ - Bugfix - Kein PasswortÃ€nderungen am Wordpress Nutzer fÃŒr nicht angemeldete Benutzer
+ - Bugfix - Probleme mit Downloadprodukt Modul und Downloadplus Modul und aktueller PHP Version (>= 5.2.8) behoben
+ - Bugfix - Funktion "Aktualisieren" in Plugin Ãbersicht unter Wordpress 4.2 funktioniert wieder
+ 
+#3.9.0 / 4938
+ - Feature - PayPal Plus - Link zur BestellabschluÃseite in Bestellmails
+ - Feature - neues Trusted Shops Badge
+ - Feature - Lagerbestand in ProduktÃŒbersicht (Frontend)
+ - Feature - Lagerbestand in ProduktÃŒbersicht (Frontend) optional auswÃ€hlbar im Backend 
+ - Feature - MÃ¶glichkeit Werbetexte/Impressum unter alle Mails zu setzen
+ - Feature - Bei nur einer mÃ¶glichen Versand/Zahlungsart wird diese direkt ausgewÃ€hlt
+ - Feature - HTML5 Formularelemente in Checkout/Einseitencheckout/Registrierung und Profilseite
+ - Bugfix - Bestellexport - Bei stornierten Rechnungen wird die Rechnungsnummer der Rechnung mit exportiert
+ - Bugfix - Darstellungsoptimierungen in twentyfifteen
+ - Bugfix - Warenkorb wird mit Enter korrekt abgesendet (Bei aktivem Gutscheinmodul)
+ - Bugfix - Versandkosten - Versandkostenkombinationen werden korrekt berechnet
+ - Bugfix - PayPal Plus - Ausgelaufene und verfallene Zahlungen kÃ¶nnen spÃ€ter erneut gestartet werden
+ - Bugfix - Versandkosten - Versandkostenkombinationen werden korrekt berechnet
+ - Bugfix - Statistikmodul: Aufruf per https von Google Analytics
+ - Bugfix - Anzeige Kundenverwaltung 1. Spalte
+ - Bugfix - AnfrageProdukte: Kommentar wird in Mails angezeigt
+ - Bugfix - Anfragemodul - Entfernen von Produkten wieder mÃ¶glich 
+ - Bugfix - Anfragemodul - Optionale Abfrage von Kunden-, Bestell- und Produktvariablen korrigiert
+ - Bugfix - Anfragemodul - Eingabe von Sonderzeichen werden korrekt maskiert
+ - Bugfix - Versandarten - Korrektur der Berechnung bei Bestellungen ohne MwSt. Regel
+ - Bugfix - Lagerbestand - Korrektur von Bezeichnungen (Backend)
+ - Bugfix - Bei nur einem Produkt und Selbstabholung wird nicht kombiniert
+ - Bugfix - Kundenkontakt - Umschalten zwischen HTML/Text funktioniert im Safari/Chrome
+ - Bugfix - Produktvariablen - Werden die Produktvariablen im Produkttemplate einer Variante eingebunden, gehen diese beim wechsel der Varianten nicht mehr verloren
+ - Bugfix - ProduktÃŒbersichten - Pager im Standard-Template erweitert um ein SPAN um aktive Seite
+ - Bugfix - Detailname anstelle des Produktnamens (wenn nicht ausgefÃŒllt) in ProduktÃŒbersicht angezeigt
+ - Bugfix - Detailname anstelle des Produktnamens (wenn nicht ausgefÃŒllt) in Rechnungs_pdf angezeigt
+ - Bugfix - Detailname anstelle des Produktnamens (wenn nicht ausgefÃŒllt) in Lieferschein_pdf angezeigt
+ - Bugfix - Detailname anstelle des Produktnamens (wenn nicht ausgefÃŒllt) in BestellÃŒbersicht (Frontend) angezeigt
+ - Bugfix - Produktvariablen - Anzeige in der Kundenverwaltung (Frontend) korrigiert
+ - Bugfix - Chrome Anzeige Bug (Aktionen) in Kundenverwaltung behoben
+ - Bugfix - Land in Lieferanschrift auf der RechnungsPDF angezeigt
+ 
+#3.9.1 / 4939
+ - Bugfix - HTML5 date Type vorerst wieder entfernt
+ 
+#3.9.1.5250 / 5250
+ - Feature - Progress bar in Bestellprozess
+ - Feature - Neuerstellung des gesamten Checkouts fÃŒr Ausrichtung auf PayPal API
+ - Feature - Bestellungen werden sofort angelegt, sobald etwas in den Warenkorb gelegt wird (UnvollstÃ€ndige Bestellungen)
+ - Feature - LÃ¶schen von allen unvollstÃ€ndigen Bestellungen mÃ¶glich
+ - Feature - Rabatt Modul - Warenkorbrabatt im Warenkorb anpreisbar
+ - Feature - ZubehÃ¶rprodukte - Optionale Anzeige im Warenkorb
+ - Feature - Rechnungsmodul - Lieferdatum auf Rechnung wenn Lieferscheinmodul aktiv und Lieferschein entsprechend geschrieben
+ - Feature - Neue Option mit minimalisiertem Inhalt (responsive) nach hinzufÃŒgen zum Warenkorb "Lightbox Meldung"
+ - Feature - Rechnungs- und Lieferanschrift einer Bestellung lÃ€sst sich ÃŒber das Backend bearbeiten 
+ - Feature - optimierter Checkout: Eingabe von Versandart und Zahlungsart wird ÃŒbersprungen wenn bereits im Warenkorb gewÃ€hlt
+ - Feature - Neue Option fÃŒr den EU-Leistungsortregel-Dialog "nicht anzeigen"
+ - Feature - Verbesserung der Preisauszeichnung fÃŒr Kleinunternehmer
+ - Feature - Sortierung der Kundennummer im Backend kann Numerisch oder Alphabetisch erfolgen
+ - Feature - Link zum Backend der Bestellung in der Adminmail
+ - Feature - pflegbare Verlinkung zur Online Dispute Resolution in Widgetbereich
+ - Feature - bei inaktivem Produktartikelmodul wird die Produktseite nicht mit "Warenkorb" betitelt
+ - Feature - PayPal API - Optionale Protokollierung von Anfragen an die WebHook URL
+ - Feature - LogoutmÃ¶glichkeit im Checkout
+ - Feature - UnvollstÃ€ndige Bestellungen lassen sich optional im Backend anzeigen
+ - Feature - Einzelne Posten werden gerundet aufsummiert
+ - Feature - PostID wird beim wechsel der Variante mit ÃŒbergeben
+ - Feature - Alle Mails aus dem Shop senden den Return-Path (From) mit
+ - Feature - MÃ¶glichkeit um die PHP Einstellung "auto_detect_line_ending" zu setzen (FÃŒr Importe auf einem MAC)
+ - Feature - PayPAl API - Storierung einer PayPal API Zahlung unabhÃ€ngig vom Bestellstatuswechsel
+ - Feature - Logos fÃŒr gÃ€ngige Zahlungsarten werden an den PayPal IFrame ÃŒbermittelt (Shop muss auf SSL laufen)
+ - Bugfix - Billsafe - Refresh auf der Erfolgsseite fÃŒhrt nicht mehr zu einer Fehlermeldung
+ - Bugfix - Vorkasse - Ist die Option "Selbstabholung erfordert Barzahlung" aktiviert, so wird dies bereits im Warenkorb sichergestellt
+ - Bugfix - MwSt Berechnung richtet sich nach dem Lieferland
+ - Bugfix - Produktbezogene Platzhalter im Gutscheinprodukt Modul werden korrekt ersetzt  
+ - Bugfix - Bestellung bei deaktiviertem Login mit vorhandener E-Mail ermÃ¶glichen (Neuer Kunde)
+ - Bugfix - Fehler im Lieferscheinmodul behoben (Bei mehrfach dem gleichen Produkt im Warenkorb seit 3.8.0)
+ - Bugfix - Darstellung in den Einstellungen des Rabattmoduls optimiert
+ - Bugfix - ProduktÃŒbersichten - Pager beachtet Einstellung "Ausverkaufte nicht anzeigen"
+ - Bugfix - Produktvariablen - Bei mehreren Produkten lassen sich die Produktvariablen im Backend korrekt Ã€ndern
+ - Bugfix - Gutscheinprodukt - HTML Mail korrekt versenden
+ - Bugfix - Anzeige der GebÃŒhr der Zahlungsart bei aktivierter Paypal-API
+ - Bugfix - Speichert man die Einstellungen eines aktiviertes Modul, bei dem der DEMO Modus abgelaufen wird kein Fehler mehr erzeugt.
+ 
Index: /controller/wpsg_AdminController.class.php
===================================================================
--- /controller/wpsg_AdminController.class.php	(revision 8528)
+++ /controller/wpsg_AdminController.class.php	(revision 5261)
@@ -2,7 +2,7 @@
 
 	/**
-	 * AdminController fÃŒr Backend
+	 * AdminController fÃŒr Backend 
 	 */
-	class wpsg_AdminController extends wpsg_SystemController
+	class wpsg_AdminController extends wpsg_SystemController 
 	{
 		
@@ -12,96 +12,85 @@
 		public function dispatch()
 		{
-
+			
 			parent::dispatch();
-
+						
 			if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'module')
 			{
-
+				
 				$this->moduleAction();
-
+				
 			}
 			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'hilfe')
 			{
-
+				
 				$this->hilfeAction();
-
+				
 			}
 			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'migratemwst')
 			{
-
+				
 				$this->migratemwstAction();
-
+				
 			}
 			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'ueber')
 			{
-
+				
 				$this->ueberAction();
-
+				
 			}
 			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'news')
 			{
-
+				
 				$this->newsAction();
-
+				
 			}
 			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'registrierung')
 			{
-
+				
 				if (!current_user_can('wpsg_lizence')) die(__('Kein Zugriff', 'wpsg'));
-
+				
 				$this->registrierungAction();
-
-			}
-			else if (wpsg_isSizedString($_REQUEST['action'], 'resetMessages'))
-            {
-
-                $this->update_option('wpsg_msgHidden', array());
-
-                $this->addBackendMessage(__('Systemmeldungen wurden zurÃŒckgesetzt.', 'wpsg'));
-                $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=systemcheck');
-
-            }
+				
+			}	 
 			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'clearMessage')
 			{
-
-                $arMsgHidden = $this->get_option('wpsg_msgHidden');
-                if (!wpsg_isSizedArray($arMsgHidden)) $arMsgHidden = array();
-
-                $arMsgHidden[] = $_REQUEST['msg_key'];
-
-                $this->update_option('wpsg_msgHidden', $arMsgHidden);
-
-                die("1");
-
+				
+				$this->shop->hidePersistentBackendError($_REQUEST['wpsg_message']);
+				
+				$this->shop->clearMessages();
+				$this->shop->redirect(rawurldecode($_REQUEST['wpsg_redirect']));
+				
+			}	
+			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'importV2')
+			{
+				
+				$this->importV2();
+				
 			}
 			else
 			{
-
+							
 				$this->indexAction();
-
-			}
-
+				
+			}
+			
 		} // public function dispatch()
-		
-		public function init()
-		{
-				
-		} // public function init()
 		
 		/**
 		 * Index des Backends
 		 */
-		public function indexAction() {
-
+		public function indexAction()
+		{
+			
 			$this->shop->view = array(
 				'actionName' => 'index',
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/konfiguration.phtml'
 			);
-
+			
 			$this->shop->view['arSubAction'] = array();
 			$this->shop->view['arSubAction']['allgemein'] = array(
 				'Menutext' => __('Allgemein', 'wpsg'),
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/konfiguration.phtml'
-			);
+			);			
 			$this->shop->view['arSubAction']['shopdata'] = array(
 				'Menutext' => __('Shopinfo', 'wpsg'),
@@ -112,15 +101,4 @@
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/extended.phtml'
 			);
-
-			if (function_exists('icl_object_id'))
-			{
-
-				$this->shop->view['arSubAction']['wpml'] = array(
-					'Menutext' => __('WPML Einstellungen', 'wpsg'),
-					'subTemplate' => WPSG_PATH_VIEW.'/admin/wpml.phtml'
-				);
-
-			}
-
 			$this->shop->view['arSubAction']['presentation'] = array(
 				'Menutext' => __('Darstellung', 'wpsg'),
@@ -131,12 +109,12 @@
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/loadsavesettings.phtml'
 			);
-
+						
 			if ($this->shop->isMultiBlog() && is_super_admin())
 			{
-
+				
 				$this->shop->view['arSubAction']['blognetzwerk'] = array(
 					'Menutext' => __('Blognetzwerk', 'wpsg'),
 					'subTemplate' => WPSG_PATH_VIEW.'/admin/blognetzwerk.phtml'
-				);
+				);	
 
 				// Wenn da spÃ€ter mal mehr drin ist als der Multiblog Pfad dann sollte das aus dem If raus!
@@ -145,10 +123,7 @@
 					'subTemplate' => WPSG_PATH_VIEW.'/admin/path.phtml'
 				);
-
-			}
-			$this->shop->view['arSubAction']['dataprotection'] = array(
-					'Menutext' => __('Datenschutz', 'wpsg'),
-					'subTemplate' => WPSG_PATH_VIEW.'/admin/dataprotection.phtml'
-			);
+				
+			}
+			
 			$this->shop->view['arSubAction']['kalkulation'] = array(
 				'Menutext' => __('Preiskalkulation', 'wpsg'),
@@ -166,13 +141,13 @@
 				'Menutext' => __('Bibliotheken/Includes', 'wpsg'),
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/includes.phtml'
-			);
+			);			
 			$this->shop->view['arSubAction']['seiten'] = array(
 				'Menutext' => __('Seitenkonfiguration', 'wpsg'),
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/seiten.phtml'
 			);
-			//$this->shop->view['arSubAction']['customerpreset'] = array(
-			//	'Menutext' => __('Kundenvoreinstellungen', 'wpsg'),
-			//	'subTemplate' => WPSG_PATH_VIEW.'/admin/customerpreset.phtml'
-			//);
+			$this->shop->view['arSubAction']['customerpreset'] = array(
+				'Menutext' => __('Kundenvoreinstellungen', 'wpsg'),
+				'subTemplate' => WPSG_PATH_VIEW.'/admin/customerpreset.phtml'
+			);
 			$this->shop->view['arSubAction']['kundendaten'] = array(
 				'Menutext' => __('Kundendaten', 'wpsg'),
@@ -191,13 +166,13 @@
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/laender.phtml'
 			);
-
+			
 			if (!$this->shop->isMultiBlog() || is_super_admin())
 			{
-
+			
 				$this->shop->view['arSubAction']['deinstallieren'] = array(
 					'Menutext' => __('Deinstallieren', 'wpsg'),
 					'subTemplate' => WPSG_PATH_VIEW.'/admin/deinstall.phtml'
 				);
-
+				
 			}
 			
@@ -206,500 +181,214 @@
 			if (isset($_REQUEST['subaction']))
 			{
-
+				
 				if (method_exists($this, $_REQUEST['subaction'].'Action')) { call_user_func(array($this, $_REQUEST['subaction'].'Action')); }
-
+				
 				$this->shop->view['subAction'] = $_REQUEST['subaction'];
 				$this->shop->view['subTemplate'] = $this->shop->view['arSubAction'][$_REQUEST['subaction']]['subTemplate'];
-
+				
 			}
 			else
 			{
-				
+
 				if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'update') { $this->updateAction(); }
 				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'loadHelp') { $this->loadHelpAction(); }
-
+								
 				$this->shop->view['subAction'] = 'allgemein';
-
-			}
-
+				
+			}
+			
 			// Korrektur der Serialisierten Einstellungen beim Aufruf der Allgemein Seite
 			if ($this->shop->view['subAction'] == 'allgemein')
 			{
-
+				
 				$arLanguages = $this->shop->getStoreLanguages();
-
+				
 				$this->shop->view['arLanguages'] = array();
-
+				
 				if (wpsg_isSizedArray($arLanguages))
 				{
-
+					
 					foreach ($arLanguages as $lang)
 					{
-
+					
 						$this->shop->view['arLanguages'][$lang['lang']] = $lang['name'];
-
-					}
-
-				}
-
+						
+					}
+					
+				}
+								
 				$this->CheckAndCorrectSerOption();
-
-			}
-
+				
+			}
+			
 			$this->shop->callMods('admin_index', array($this));
 			$this->shop->view['adminController'] = &$this;
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
-
+			
 		} // public function indexAction()
- 	
+
+		private function downloadLicenceAction()
+		{
+			
+			wpsg_header::startDownloadContent('key.txt', $this->shop->get_option('wpsg_key'));
+			
+		} // private function downloadLicenceAction()
+		
 		/**
-		 * Beim Speichern und Anzeigen der Shopdaten
+		 * Beim Speichern und Anzeigen der Shopdatne
 		 */
-		public function shopdataAction() {
-
-			if (isset($_REQUEST['submit'])) {
-				
-				\check_admin_referer('wpsg-save-admin-shopdata');
-				
-			    $this->shop->update_option('wpsg_shopdata_name', $_REQUEST['wpsg_shopdata_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_owner', $_REQUEST['wpsg_shopdata_owner'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_tel', $_REQUEST['wpsg_shopdata_tel'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_fax', $_REQUEST['wpsg_shopdata_fax'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_email', $_REQUEST['wpsg_shopdata_email'], false, true, WPSG_SANITIZE_EMAIL);
-			    $this->shop->update_option('wpsg_shopdata_taxnr', $_REQUEST['wpsg_shopdata_taxnr'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_ustidnr', $_REQUEST['wpsg_shopdata_ustidnr'], false, true, WPSG_SANITIZE_TEXTFIELD);
-
-			    $this->shop->update_option('wpsg_shopdata_street', $_REQUEST['wpsg_shopdata_street'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_zip', $_REQUEST['wpsg_shopdata_zip'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			    $this->shop->update_option('wpsg_shopdata_city', $_REQUEST['wpsg_shopdata_city'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_country', $_REQUEST['wpsg_shopdata_country'], false, true, WPSG_SANITIZE_INT);
-
-				$this->shop->update_option('wpsg_shopdata_2', $_REQUEST['wpsg_shopdata_2'], false, true, WPSG_SANITIZE_CHECKBOX);
-				$this->shop->update_option('wpsg_shopdata_2_street', $_REQUEST['wpsg_shopdata_2_street'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_2_zip', $_REQUEST['wpsg_shopdata_2_zip'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_2_city', $_REQUEST['wpsg_shopdata_2_city'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_2_country', $_REQUEST['wpsg_shopdata_2_country'], false, true, WPSG_SANITIZE_INT);
-				$this->shop->update_option('wpsg_shopdata_2_tel', $_REQUEST['wpsg_shopdata_2_tel'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_2_fax', $_REQUEST['wpsg_shopdata_2_fax'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_2_email', $_REQUEST['wpsg_shopdata_2_email'], false, true, WPSG_SANITIZE_EMAIL);
-				
-				$this->shop->update_option('wpsg_shopdata_3', $_REQUEST['wpsg_shopdata_3'], false, true, WPSG_SANITIZE_CHECKBOX);
-				$this->shop->update_option('wpsg_shopdata_eu_name', $_REQUEST['wpsg_shopdata_eu_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_eu_tel', $_REQUEST['wpsg_shopdata_eu_tel'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_eu_fax', $_REQUEST['wpsg_shopdata_eu_fax'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_eu_email', $_REQUEST['wpsg_shopdata_eu_email'], false, true, WPSG_SANITIZE_EMAIL);
-				$this->shop->update_option('wpsg_shopdata_eu_street', $_REQUEST['wpsg_shopdata_eu_street'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_eu_zip', $_REQUEST['wpsg_shopdata_eu_zip'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_eu_city', $_REQUEST['wpsg_shopdata_eu_city'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_eu_country', $_REQUEST['wpsg_shopdata_eu_country'], false, true, WPSG_SANITIZE_INT);
-				
-				/*
-				$this->shop->update_option('dataprotectioncommissioner', $_REQUEST['dataprotectioncommissioner'], false, true, WPSG_SANITIZE_CHECKBOX);
-				$this->shop->update_option('dataprotectioncommissioner_name', $_REQUEST['dataprotectioncommissioner_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('dataprotectioncommissioner_tel', $_REQUEST['dataprotectioncommissioner_tel'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('dataprotectioncommissioner_email', $_REQUEST['dataprotectioncommissioner_email'], false, true, WPSG_SANITIZE_EMAIL);
-				$this->shop->update_option('dataprotectioncommissioner_baskettext', $_REQUEST['dataprotectioncommissioner_baskettext'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('dataprotectioncommissioner_mailtext', $_REQUEST['dataprotectioncommissioner_mailtext'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('dataprotectioncommissioner_texts', $_REQUEST['dataprotectioncommissioner_texts'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				*/
-								
-				$this->shop->update_option('wpsg_shopdata_bank_name', $_REQUEST['wpsg_shopdata_bank_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_bank_owner', $_REQUEST['wpsg_shopdata_bank_owner'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_bank_iban', $_REQUEST['wpsg_shopdata_bank_iban'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_bank_qriban', $_REQUEST['wpsg_shopdata_bank_qriban'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_bank_bic', $_REQUEST['wpsg_shopdata_bank_bic'], false, true, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->update_option('wpsg_shopdata_bank_besr', $_REQUEST['wpsg_shopdata_bank_besr'], false, true, WPSG_SANITIZE_TEXTFIELD);
-
+		public function shopdataAction()
+		{
+			
+			if (isset($_REQUEST['submit']))
+			{
+				
+				$this->shop->update_option('wpsg_shopdata_name', $_REQUEST['wpsg_shopdata_name'], false, true); 
+				$this->shop->update_option('wpsg_shopdata_owner', $_REQUEST['wpsg_shopdata_owner'], false, true);
+				$this->shop->update_option('wpsg_shopdata_tel', $_REQUEST['wpsg_shopdata_tel'], false, true);
+				$this->shop->update_option('wpsg_shopdata_fax', $_REQUEST['wpsg_shopdata_fax'], false, true);
+				$this->shop->update_option('wpsg_shopdata_email', $_REQUEST['wpsg_shopdata_email'], false, true);
+				$this->shop->update_option('wpsg_shopdata_taxnr', $_REQUEST['wpsg_shopdata_taxnr'], false, true);
+				$this->shop->update_option('wpsg_shopdata_ustidnr', $_REQUEST['wpsg_shopdata_ustidnr'], false, true);
+				
+				$this->shop->update_option('wpsg_shopdata_street', $_REQUEST['wpsg_shopdata_street'], false, true);
+				$this->shop->update_option('wpsg_shopdata_zip', $_REQUEST['wpsg_shopdata_zip'], false, true);
+				$this->shop->update_option('wpsg_shopdata_city', $_REQUEST['wpsg_shopdata_city'], false, true);
+				
+				$this->shop->update_option('wpsg_shopdata_bank_name', $_REQUEST['wpsg_shopdata_bank_name'], false, true);
+				$this->shop->update_option('wpsg_shopdata_bank_owner', $_REQUEST['wpsg_shopdata_bank_owner'], false, true);
+				$this->shop->update_option('wpsg_shopdata_bank_iban', $_REQUEST['wpsg_shopdata_bank_iban'], false, true);
+				$this->shop->update_option('wpsg_shopdata_bank_bic', $_REQUEST['wpsg_shopdata_bank_bic'], false, true);
+				
 				$this->addBackendMessage(__('Shopdaten erfolgreich gespeichert.', 'wpsg'));
-
+				
 				$this->shop->update_option('wpsg_message_shopdata_change', false);
-
+				
 				if ($this->shop->get_option('wpsg_revocationform') != false && !array_key_exists('wpsg_message_shopdata', (array)$_SESSION['wpsg']['backendError']))
 				{
-
+				
 					$this->shop->addBackendError('nohspc_'.wpsg_translate(
             			__('Die allgemeinen Daten des Shops haben sich verÃ€ndert, sie sollten das <a href="#1#">Widerrufsformular</a> ÃŒberprÃŒfen bzw. neu generieren.', 'wpsg'),
 						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung'
 					), 'wpsg_message_shopdata_change');
-
-				}
-
+					
+				}
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=shopdata');
-
-			}
-
+				
+			}
+			
 		} // public function shopdataAction()
-
+		
 		/**
 		 * LÃ€dt die Lizenz in die Datenbank wenn valide
 		 */
-		public function loadLicenceAction() {
-
-		    $wpsg_update_data = wpsg_get_update_data($_REQUEST['wpsg_licence_file'], true);
-
-            if (!wpsg_isSizedArray($wpsg_update_data)) {
-
-                $this->addBackendError(__('Keine Verbindung zum Registrierungsserver', 'wpsg'));
-
-            }
-            else
-            {
-
-                if ($wpsg_update_data['returnCode'] === '0')
-                {
-
-                    $this->addBackendError(__('UngÃŒltiger Lizenzcode', 'wpsg'));
-
-                }
-                else
-                {
-
-					$this->addBackendMessage(__('wpShopGermany wurde aktiviert.', 'wpsg'));
-					$this->update_option('wpsg_key', $_REQUEST['wpsg_licence_file'], true, false, WPSG_SANITIZE_APIKEY);
-
-                }
-
-            }
-
-            if ($this->shop->isMultiBlog()) die($this->redirect(WPSG_URL_WP.'wp-admin/network/plugins.php'));
-            else die($this->redirect(WPSG_URL_WP.'wp-admin/plugins.php'));
-
-		} // public function loadLicenceAction()
-
-		/**
-		 * Verwaltung der Registrierung
-		 */
-		public function registrierungAction() {
-
-			if (wpsg_isSizedString($_REQUEST['do'], 'activatemodul')) {
-				
-				check_admin_referer('wpsg-admin-licence-activatemodul');
-				
-				try
-				{
-				
-					if (!wpsg_isSizedString($_REQUEST['modulcode']))
-					{
-						
-						throw new \Exception(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
+		public function loadLicenceAction()
+		{
+		 
+			if (file_exists($_FILES['wpsg_licence_file']['tmp_name']))
+			{
+				 
+				if (!file_exists(WPSG_PATH.'/lib/.htpublic'))
+				{
+					
+					$this->addBackendError(base64_decode('w5ZmZmVudGxpY2hlciBTY2hsw7xzc2VsIGV4aXN0aWVydCBuaWNodCE=')); // Ãffentlicher SchlÃŒssel existiert nicht!
+					
+				}
+				else
+				{
+				
+					if (!class_exists('Crypt_RSA')) 
+					{
+
+						@set_include_path(WPSG_PATH.'/lib/phpseclib0.3.0/'.PATH_SEPARATOR.get_include_path());
+						require_once(WPSG_PATH.'/lib/phpseclib0.3.0/Crypt/RSA.php');
+						
+					}
+					 
+					$rsa = new Crypt_RSA();
+					$load = $rsa->loadKey(file_get_contents(WPSG_PATH.'/lib/.htpublic'));
+					
+					if ($load === false)
+					{
+						
+						$this->addBackendMessage(base64_decode('TGFkZW4gZGVzIMO2ZmZlbnRsaWNoZW4gU2NobMO8c3NlbHMgaXN0IGZlaGxnZXNjaGxhZ2VuLg==')); // Laden des Ã¶ffentlichen SchlÃŒssels ist fehlgeschlagen.
 						
 					}
 					else
 					{
-
-						$_REQUEST['modulcode'] = wpsg_xss($_REQUEST['modulcode']);
-						$api_return = wpsg_api_call('registerModule', array($_REQUEST['modulcode']));
-						
-						if (!wpsg_isSizedArray($api_return) || !isset($api_return['returnCode']))
+				 
+						$decrypt_key = $rsa->decrypt(base64_decode(file_get_contents($_FILES['wpsg_licence_file']['tmp_name'])));
+						
+						if ($decrypt_key === false)
 						{
 							
-							// API Fehler
-							throw new \Exception(__('Registrierungsserver antwortet nicht.', 'wpsg'));
-						
+							$this->addBackendError(base64_decode('RW50c2NobMO8c3NlbG4gZmVobGdlc2NobGFnZW4=')); // EntschlÃŒsseln fehlgeschlagen
+							
 						}
 						else
 						{
-							
-							if ($api_return['returnCode'] === 0)
+						
+							$arKey = @unserialize($decrypt_key);
+							  
+							if (is_array($arKey) && $arKey['l'] < 3 && $this->shop->isMultiBlog())
 							{
 								
-								throw new \Exception(__('Ihre Lizenz ist ungÃŒltig.', 'wpsg'));
-								
-							}
-							else if ($api_return['returnCode'] === 1)
-							{
-								
-								throw new \Exception(__('Modulcode wurde nicht akzeptiert.', 'wpsg'));
-								
-							}
-							else if ($api_return['returnCode'] === 2)
-							{
-								
-								throw new \Exception(__('Modulcode wurde bereits verbraucht.', 'wpsg'));
-								
-							}
-							else if ($api_return['returnCode'] === 3)
-							{
-								
-								throw new \Exception(__('Modulcode wurde bereits fÃŒr diesen SchlÃŒssel verbraucht.', 'wpsg'));
-								
-							}
-							else if ($api_return['returnCode'] === 4)
-							{
-																
-								$this->addBackendMessage(__('Modul wurde fÃŒr diesen LizenzschlÃŒssel aktiviert.', 'wpsg'));
-								
-								if (wpsg_isSizedString($_REQUEST['source'], 'licence')) $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=modulactivation');
-								else $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
+								$this->shop->update_option('wpsg_key', false, true);
+								$this->addBackendError(base64_decode('RsO8ciBkaWUgVmVyd2VuZHVuZyBpbiBlaW5lciBNdWx0aWJsb2cgVW1nZWJ1bmcgaXN0IGRpZSBFbnRlcnByaXNlIExpemVueiBuw7Z0aWcu')); // FÃŒr die Verwendung in einer Multiblog Umgebung ist die Enterprise Lizenz nÃ¶tig.
 								
 							}
 							else
 							{
-								
-								throw new \Exception(__('Nicht definierte API Antwort.'));
+							
+								if (is_array($arKey) && $arKey['anwendung'] == 'wpShopGermany')
+								{
+				
+									$this->shop->clearMessages();
+									
+									// Key ist gÃŒltig und nun installieren
+									$this->shop->update_option('wpsg_key', file_get_contents($_FILES['wpsg_licence_file']['tmp_name']), true);
+									$this->addBackendMessage(base64_decode('S2V5IHd1cmRlIGVyZm9sZ3JlaWNoIGluc3RhbGxpZXJ0')); // Key wurde erfolgreich installiert
+									
+								}
+								else
+								{
+									
+									$this->addBackendError(base64_decode('VW5nw7xsdGlnZSBMaXplbnpkYXRlaQ==')); // UngÃŒltige Lizenzdatei
+										
+								}
 								
 							}
 							
-						}  
-						
-					}
-					
-				}
-				catch (Exception $e)
-				{
-					
-					$this->addBackendError($e->getMessage());
-					
-					if (wpsg_isSizedString($_REQUEST['source'], 'licence')) $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=modulactivation');
-					else $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
-					
-				}
-				
-			} else if (wpsg_isSizedString($_REQUEST['do'], 'saveRegister')) {
-
-				check_admin_referer('wpsg-admin-licence-register');
-				
-				foreach($_REQUEST['register'] as $k => $v)
-					$_REQUEST['register'][$k] = wpsg_xss($v);
-
-				$api_return = wpsg_api_call('updateRegisterData', array($_REQUEST['register']));
-					
-				try
-				{
-					
-					if ($api_return['returnCode'] === 0)
-					{
-						
-						throw new \Exception(__('Ihre Lizenz ist ungÃŒltig.', 'wpsg'));
-						
-					}
-					else if ($api_return['returnCode'] === 1)
-					{
-						
-						$this->addBackendMessage(__('Daten erfolgreich aktualisiert.', 'wpsg'));
-						$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung');
-						
-					}
-					else
-					{
-						
-						throw new \Exception(__('Nicht definierte API Antwort.'));
-						
-					}
-					
-				}
-				catch (Exception $e)
-				{
-				
-					$this->addBackendError($e->getMessage());
-					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung');
-					
-				}
-				
-			} else if (wpsg_isSizedString($_REQUEST['do'], 'domainRegister')) {
-				
-				check_admin_referer('wpsg-admin-licence-domainRegister');
-				
-				$api_return = wpsg_api_call('domainRegister', array($_SERVER['HTTP_HOST']));
-					
-				try
-				{
-					
-					if ($api_return['returnCode'] === 1)
-					{
-						
-						$this->addBackendMessage(__('Domain erfolgreich registriert.', 'wpsg'));
-						$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domaindata');
-						
-					}
-					else if ($api_return['returnCode'] === -1)
-					{
-						
-						throw new \Exception(__('Ihre Lizenz ist ungÃŒltig.', 'wpsg'));
-						
-					}
-					else if ($api_return['returnCode'] === -2)
-					{
-						
-						throw new \Exception(__('Diese Domain ist schon auf Ihren SchlÃŒssel registriert.', 'wpsg'));
-						
-					}					
-					else
-					{
-						
-						throw new \Exception(__('Nicht definierte API Antwort.'));
-						
-					}
-					
-				}
-				catch (Exception $e)
-				{
-				
-					$this->addBackendError($e->getMessage());
-					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domaindata');
-					
-				}
-				
-			} else if (wpsg_isSizedString($_REQUEST['do'], 'domainDeRegister')) {
-			
-				check_admin_referer('wpsg-admin-licence-domainDeRegister');
-				
-				$api_return = wpsg_api_call('domainDeRegister', array($_SERVER['HTTP_HOST']));
-					
-				try {
-					
-					if ($api_return['returnCode'] === 1)
-					{
-						
-						$this->addBackendMessage(__('Domain erfolgreich unregistriert.', 'wpsg'));
-						$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domaindata');
-						
-					}
-					else if ($api_return['returnCode'] === -1)
-					{
-						
-						throw new \Exception(__('Ihre Lizenz ist ungÃŒltig.', 'wpsg'));
-						
-					}
-					else if ($api_return['returnCode'] === -2)
-					{
-						
-						throw new \Exception(__('Diese Domain ist nicht auf Ihren SchlÃŒssel registriert.', 'wpsg'));
-						
-					}					
-					else
-					{
-						
-						throw new \Exception(__('Nicht definierte API Antwort.'));
-						
-					}
-					
-				} catch (Exception $e) {
-				
-					$this->addBackendError($e->getMessage());
-					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domaindata');
-					
-				}
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'startDemo'))
-			{
-				
-				$api_return = wpsg_api_call('startDemo', array($_REQUEST['modul']));
-				
-				try
-				{
-					
-					if ($api_return['returnCode'] === 1)
-					{
-						
-						$this->addBackendMessage(__('Demo Modus erfolgreich gestartet.', 'wpsg'));
-												
-					}
-					else if (isset($api_return['returnCode']) && isset($api_return['returnMessage']))
-					{
-						
-						throw new \Exception($api_return['returnMessage']);
-												
-					} 
-					else
-					{
-						
-						throw new \Exception(__('Nicht definierte API Antwort.'));
-						
-					}
-					 
-				}
-				catch (Exception $e)
-				{
-				
-					$this->addBackendError($e->getMessage());
-										
-				}
-				
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul='.$_REQUEST['modul']);
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'installModul')) 
-			{
-
-			    global $wp_filesystem;
-
-			    // Kann die Moduldatei geschrieben werden?
-                if (!is_writable(WPSG_PATH_MOD))
-                {
-
-                    ob_start();
-                    $request_creds = request_filesystem_credentials(
-                        WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key.'&source='.$_REQUEST['source'],
-                        '',
-                        false,
-                        false,
-                        null
-                    );
-                    ob_end_clean();
-
-                    // 1 gibt es bei Windows Rechnern zurÃŒck, da es hier egal ist
-                    // Ein Array ist es wenn das Formular bereits abgeschickt wurde und die Anfrage vom Formular kommt
-                    // false ist es wenn kein Zugriff ist dann muss das Formular angezeigt werden
-
-                    if (false === $request_creds)
-                    {
-
-                        // Berechtigungen anfragen
-                        $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&do=getCredentials&modul='.$_REQUEST['modul'].'&source='.$_REQUEST['source']);
-
-                    }
-                    else if (is_array($request_creds))
-                    {
-
-                        if (!WP_Filesystem($request_creds))
-                        {
-
-                            // Eingegebene Daten waren falsch
-                            $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&do=getCredentials&modul='.$_REQUEST['modul'].'&sourcce='.$_REQUEST['source']);
-
-                        }
-
-                    }
-
-                }
-
-				$bOK = $this->installModul($_REQUEST['modul']);
-				$_REQUEST['source'] = wpsg_xss($_REQUEST['source']);
-						
-				if ($bOK === true) $this->addBackendMessage(__('Modul erfolgreich installiert.', 'wpsg'));
-
-				if (wpsg_isSizedString($_REQUEST['source'], 'licence')) $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=modulactivation');
-				else $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'getCredentials'))
-			{
-
-			    //https://dev4-wpshopgermany.maennchen1.de/wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul=wpsg_mod_paypalapi&source=module
-
-                echo request_filesystem_credentials(
-                    WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$_REQUEST['modul'].'&source='.$_REQUEST['source'],
-                    '',
-                    false,
-                    false,
-                    null
-                );
-
-                return;
-
-            }
-
-			$this->view['actionName'] = 'licence';
-
-			if (wpsg_isSizedString($_REQUEST['subaction'])) $this->view['subaction'] = $_REQUEST['subaction'];
-			else $this->view['subaction'] = 'registerdata';
-			
-			$this->render(WPSG_PATH_VIEW.'/admin/licence.phtml'); 	
+						}
+						
+					}
+					
+				}
+									
+				if ($this->shop->isMultiBlog()) die($this->redirect(WPSG_URL_WP.'wp-admin/network/plugins.php'));
+				else die($this->redirect(WPSG_URL_WP.'wp-admin/plugins.php'));
+				
+			}
+			else
+			{
+				
+				$this->addBackendError(base64_decode('S2VpbmUgTGl6ZW56ZGF0ZWkgYW5nZWdlYmVu')); // Keine Lizenzdatei angegeben
+				
+			}
+			
+		} // public function loadLicenceAction()
+				
+		/**
+		 * Verwaltung der Registrierung
+		 */
+		public function registrierungAction()
+		{
+									
+			return $this->shop->callMod('wpsg_mod_core', 'admin_registrierung');
 			
 		} // public function registrierungAction()
-
+				
 		/**
 		 * Gibt die Liste der Versandzonen zurÃŒck
@@ -707,11 +396,11 @@
 		public function vz_listAction()
 		{
-
+			
 			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_VZ."` ORDER BY `name` ASC");
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/admin/versandzonen_list.phtml');
-
+			
 		} // public function vz_listAction()
-
+		
 		/**
 		 * Migriert die alten MehrwertsteuersÃ€tze die vor 3.5 existierten in die LÃ€nder und passt die Produkte an.
@@ -719,98 +408,99 @@
 		public function migratemwstAction()
 		{
-
+			
 			if (isset($_REQUEST['submit']))
 			{
-
+				 			
 				// MehrwertsteuersÃ€tze der Produkte
 				if (wpsg_isSizedArray($_REQUEST['mwst']))
 				{
-
+				
 					foreach ($_REQUEST['mwst'] as $tax_id => $tax_key)
 					{
-
+						
 						if ($tax_id == 0)
 						{
-
+							
 							// Das sind die Produkte mit MwSt SÃ€tzen die nicht mehr exitierten
 							$arProductIDs = $this->db->fetchAssocField("
-								SELECT
-									P.`id`
-								FROM
-									`".WPSG_TBL_PRODUCTS."` AS P
+								SELECT 
+									P.`id` 
+								FROM 
+									`".WPSG_TBL_PRODUCTS."` AS P 
 										LEFT JOIN `".WPSG_TBL_MWST."` AS M ON (P.`mwst` = M.`id`)
 								WHERE
-									M.`id` IS NULL AND
+									M.`id` IS NULL AND 
 									(P.`mwst_key` = '' OR P.`mwst_key` IS NULL)
 							");
-
+							
 							$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array('mwst_key' => wpsg_q($tax_key)), " `id` IN (".implode(',', wpsg_q($arProductIDs)).") ");
-
+							
 						}
-						else
+						else 
 						{
-
+							
 							$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array('mwst_key' => wpsg_q($tax_key)), " (`mwst_key` = '' OR `mwst_key` IS NULL) AND `mwst` = '".wpsg_q($tax_id)."' ");
-
+							
 						}
-
-					}
-
-				}
-
+						
+					}
+					
+				}
+				
 				// Konfiguration speichern
 				if (wpsg_isSizedArray($_REQUEST['conf']))
 				{
-
+					
 					foreach ($_REQUEST['conf'] as $conf_key => $conf_value)
 					{
-
-						// TODO: Check wether $conf_value could be a numeric value
-						$this->shop->update_option($conf_key, $conf_value, false, false, "text_field");
-
-					}
-
-				}
-
+						
+						$this->shop->update_option($conf_key, $conf_value);
+						
+					}
+					
+				}
+				
 				// Zahlungsvarianten
 				if (wpsg_isSizedArray($_REQUEST['pv']))
 				{
-
+					
 					foreach ($_REQUEST['pv'] as $pv_id => $tax_key)
 					{
-
+						
 						$this->db->UpdateQuery(WPSG_TBL_ZV, array('mwst_key' => wpsg_q($tax_key)), " `id` = '".wpsg_q($pv_id)."' ");
-
-					}
-
-				}
-
+						
+					}
+					
+				}
+				
 				// Versandarten
 				if (wpsg_isSizedArray($_REQUEST['sv']))
 				{
-
+						
 					foreach ($_REQUEST['sv'] as $sv_id => $tax_key)
 					{
-
+				
 						$this->db->UpdateQuery(WPSG_TBL_VA, array('mwst_key' => wpsg_q($tax_key)), " `id` = '".wpsg_q($sv_id)."' ");
-
-					}
-
-				}
-
+				
+					}
+						
+				}
+				
+				$this->shop->removePersistentBackendError('wpsg_update_3.5_1');
+				
 				$this->shop->addBackendMessage(__('Migration der MwSt. SÃ€tze erfolgreich durchgefÃŒhrt.', 'wpsg'));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe');
-
-			}
-
+				
+			}
+			
 			$this->shop->view = array(
 				'actionName' => 'hilfe',
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/migratemwst.phtml'
 			);
-
+			
 			$arMwStTable = $this->db->fetchAssocField("SHOW TABLES LIKE '".WPSG_TBL_MWST."'");
 			if (in_array(WPSG_TBL_MWST, $arMwStTable))
 			{
-
+			
 				$this->shop->view['distinctProductTax'] = $this->db->fetchAssoc("
 					SELECT
@@ -822,13 +512,13 @@
 					WHERE
 						P.`mwst_key` = '' OR P.`mwst_key` IS NULL
-					GROUP BY
-						M.`id`
+					GROUP BY 
+						M.`id`	
 				");
 
 			}
-
-			if ($this->shop->hasMod('wpsg_mod_userpayment'))
-			{
-
+			
+			if ($this->shop->hasMod('wpsg_mod_userpayment')) 
+			{
+				
 				$this->shop->view['arPaymentMethods'] = $this->db->fetchAssoc("
 					SELECT
@@ -837,12 +527,12 @@
 						`".WPSG_TBL_ZV."` AS PM
 					WHERE
-						PM.`mwst_key` = '' OR PM.`mwst_key` IS NULL
+						PM.`mwst_key` = '' OR PM.`mwst_key` IS NULL 
 				");
-
-			}
-
+			
+			}
+			
 			if ($this->shop->hasMod('wpsg_mod_versandarten'))
 			{
-
+			
 				$this->shop->view['arShippingMethods'] = $this->db->fetchAssoc("
 					SELECT
@@ -853,9 +543,9 @@
 						SM.`mwst_key` = '' OR SM.`mwst_key` IS NULL
 				");
-
-			}
-
+				
+			}
+			 			
 			$this->shop->view['arConf'] = array();
-
+			
 			if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypal_mwst'))) { $this->shop->view['arConf']['wpsg_mod_paypal_mwst'] = __('Mehrwertsteuersatz fÃŒr PayPal GebÃŒhren', 'wpsg'); }
 			if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypal_mwst'))) { $this->shop->view['arConf']['wpsg_mod_autodebit_mwst'] = __('Mehrwertsteuersatz fÃŒr Bankeinzugs GebÃŒhren', 'wpsg'); }
@@ -883,499 +573,369 @@
 			if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypal_mwst'))) { $this->shop->view['arConf']['wpsg_mod_su_mwst'] = __('Mehrwertsteuersatz fÃŒr SofortÃŒberweisungsgebÃŒhren', 'wpsg'); }
 			if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypal_mwst'))) { $this->shop->view['arConf']['wpsg_mod_willcollect_mwst'] = __('Mehrwertsteuersatz fÃŒr GebÃŒhren der Selbstabholung', 'wpsg'); }
-
+			
 			$this->shop->view['defaultCountry'] = $this->shop->getDefaultCountry();
-
-			if (	!wpsg_isSizedArray($this->shop->view['distinctProductTax']) &&
-					!wpsg_isSizedArray($this->shop->view['arPaymentMethods']) &&
+			
+			if (	!wpsg_isSizedArray($this->shop->view['distinctProductTax']) && 
+					!wpsg_isSizedArray($this->shop->view['arPaymentMethods']) && 
 					!wpsg_isSizedArray($this->shop->view['arShippingMethods']) &&
-					!wpsg_isSizedArray($this->shop->view['arConf'])	)
-			{
-
+					!wpsg_isSizedArray($this->shop->view['arConf'])	)				
+			{
+				
+				$this->shop->removePersistentBackendError("wpsg_update_3.5_1");
 				$this->shop->addBackendError(__('Es gibt keine alten MwSt. SÃ€tze zu migrieren.', 'wpsg'));
-
+				
 				$this->shop->view['subTemplate'] = WPSG_PATH_VIEW.'/admin/hilfe.phtml';
-
-			}
-
-			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
-
+						
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');		
+			
 		}
-
+		
 		/**
 		 * Wird aufgerufen wenn die Versandzonen verwaltet werden sollen
 		 */
-		public function vzAction() {
+		public function vzAction()
+		{
+			
+			if (isset($_REQUEST['submit']))
+			{
+				
+				$this->shop->removePersistentBackendError('wpsg_update_3.5_2');
+				
+				$this->shop->addBackendMessage(__('Einstellungen der Versandzonen wurden erfolgreich gespeichert.', 'wpsg'));
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz');
+					
+			}
 			
 			$this->shop->view['arVZ'] = $this->db->fetchAssocField("SELECT VZ.`id`, VZ.`name` FROM `".WPSG_TBL_VZ."` AS VZ WHERE 1 ORDER BY VZ.`name` ASC ", "id", "name");
-
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add') {
-				
-				check_admin_referer('wpsg-admin-versandzonen-add');
+			
+			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add')
+			{
 				
 				// Neue Zone anlegen
 				$new_name = __('Anklicken um Bezeichnung zu Ã€ndern ...', 'wpsg');
-
+				
 				$vz_id = $this->db->ImportQuery(WPSG_TBL_VZ, array(
 					'name' => wpsg_q($new_name)
 				));
-
+				
 				$this->shop->addTranslationString('vz_'.$vz_id, $new_name);
-
+				
 				die($this->vz_listAction());
-
-			} else if (@$_REQUEST['do'] == 'loadStandard') {
-				
-				check_admin_referer('wpsg-admin-versandzonen-loadStandard');
-				
+				
+			}
+			else if (@$_REQUEST['do'] == 'loadStandard')
+			{
+			
 				$this->loadStandardLaenderVz();
-
+			
 				die($this->vz_listAction());
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove') {
-				
-				check_admin_referer('wpsg-admin-versandzonen-delete');
-
+			
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove')
+			{
+				
 				// Versandzone lÃ¶schen
 				$this->db->Query("DELETE FROM `".WPSG_TBL_VZ."` WHERE `id` = '".wpsg_q($_REQUEST['vz_id'])."'");
-
+				
 				die($this->vz_listAction());
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'inlinedit') {
-				
-				check_admin_referer('wpsg-admin-versandzonen-inline_edit-'.$_REQUEST['vz_id']);
-
-				// Eingaben prÃŒfen
-				if (!wpsg_checkInput($_REQUEST['vz_id'], WPSG_SANITIZE_INT) || !wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTFIELD) || !wpsg_checkInput($_REQUEST['field'], WPSG_SANITIZE_TEXTFIELD)) 
-					throw new \Exception(__('Parameterfehler!', 'wpsg'));
-				
-				$field = wpsg_xss($_REQUEST['field']);
-				$value = wpsg_xss($_REQUEST['value']);
-				$vz_id = intval($_REQUEST['vz_id']);
-				
-				if ($field === 'name') {
-					
-					$this->shop->addTranslationString('vz_'.$vz_id, $value);
-					
-				}
-				
-				$data[$field] = $value;
-				
-				$this->db->UpdateQuery(WPSG_TBL_VZ, $data, "`id` = '".wpsg_q($vz_id)."'");
-
-				die(stripslashes($value));
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'save_plz') {
-				
-				check_admin_referer('wpsg-admin-versandzonen-save_plz');
-
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'inlinedit')
+			{
+				
+				// Inline Edit
+				$data = array();
+				
+				$data[$_REQUEST['field']] = wpsg_q($_REQUEST['value']);
+				
+				if ($_REQUEST['field'] == 'name')
+				{
+					$this->shop->addTranslationString('vz_'.$_REQUEST['vz_id'], $_REQUEST['value']);
+				}
+				
+				$this->db->UpdateQuery(WPSG_TBL_VZ, $data, "`id` = '".wpsg_q($_REQUEST['vz_id'])."'");
+				
+				die(stripslashes($_REQUEST['value']));
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'save_plz')
+			{
+				
 				$this->db->UpdateQuery(WPSG_TBL_VZ, array(
-					'param' => trim(wpsg_sinput("text_field", $_REQUEST['textarea']))
+					'param' => trim($_REQUEST['textarea'])
 				), "`id` = '".wpsg_q($_REQUEST['vz_id'])."'");
-
+				
 				die('1');
-
-			}
-
+				
+			}
+			
 		} // public function vzAction()
-
+		 
 		/**
 		 * Ist fÃŒr das Deinstallieren zustÃ€ndig
 		 */
-		public function deinstallierenAction() {
-
+		public function deinstallierenAction()
+		{
+			
 			global $wpdb;
-
-			if (isset($_REQUEST['submit'])) {
-
-                @set_time_limit(3600);
-
-				check_admin_referer('wpsg-admin-deinstall');
-				
-				// Sanitization
-				foreach($_REQUEST as $k => $v)
-					if(strpos($k, "wpsg_deinstall_") !== false)
-						$_REQUEST[$k] = wpsg_sinput("key", $v);
-
-				if ($_REQUEST['wpsg_deinstall_products'] == '1') {
-
-				    $arProductIDs = array_map('intval', $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` "));
-
-				    foreach ($arProductIDs as $product_id) {
-
-				        $oProduct = wpsg_product::getInstance($product_id);
-				        $oProduct->deletePermanently();
-
-                    }
-
+			
+			if (isset($_REQUEST['submit']))
+			{
+				
+				if ($_REQUEST['wpsg_deinstall_products'] == '1')
+				{
+					
+					// Produkte lÃ¶schen
+					$this->db->Query("TRUNCATE TABLE `".WPSG_TBL_PRODUCTS."`");
+					$this->db->Query("DELETE FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_PRODUCTS' ");
+					
 					$this->shop->addBackendMessage(__('Produkte erfolgreich gelÃ¶scht.', 'wpsg'));
-
-				}
-
+					
+				}
+				
 				if ($_REQUEST['wpsg_deinstall_customer'] == '1')
 				{
-
+					
 					// Kunden lÃ¶schen
 					$this->db->Query("TRUNCATE TABLE `".WPSG_TBL_KU."`");
 					$this->db->Query("DELETE FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_KU' ");
-
+					
 					$this->shop->addBackendMessage(__('Kunden erfolgreich gelÃ¶scht.', 'wpsg'));
-
-				}
-
+					
+				}
+				
 				if ($_REQUEST['wpsg_deinstall_order'] == '1')
 				{
-
+					
 					// Bestellungen lÃ¶schen
 					$arOrder = wpsg_order::find(array());
-
+					
 					foreach ($arOrder as $oOrder)
 					{
-
+						
 						$oOrder->delete();
-
-					}
-
+						
+					}
+					
 					$this->shop->addBackendMessage(__('Bestellungen erfolgreich gelÃ¶scht.', 'wpsg'));
-
-				}
-
-				if ($_REQUEST['wpsg_deinstall_sites'] == '1')
-				{
-				
-					// Seiten lÃ¶schen
-
-                    wp_delete_post($this->get_option('wpsg_page_basket'), true);
-                    wp_delete_post($this->get_option('wpsg_page_basket_more'), true);
-                    wp_delete_post($this->get_option('wpsg_page_versand'), true);
-                    wp_delete_post($this->get_option('wpsg_page_product'), true);
-                    wp_delete_post($this->get_option('wpsg_page_agb'), true);
-                    wp_delete_post($this->get_option('wpsg_page_datenschutz'), true);
-                    wp_delete_post($this->get_option('wpsg_page_widerrufsbelehrung'), true);
-                    wp_delete_post($this->get_option('wpsg_page_impressum'), true);
-
-                    // Module
-                    $this->shop->callMods('wpsg_deinstall_sites');
-
-					$this->shop->addBackendMessage(__('Seiten erfolgreich gelÃ¶scht.', 'wpsg'));
-				
-				}
-
+					
+				}
+				
 				if ($_REQUEST['wpsg_deinstall_incompleteorder'] == '1')
 				{
-
+				
 					$arOrder = wpsg_order::find(array(
-						'status' => wpsg_ShopController::STATUS_UNVOLLSTAENDIG,
-                        'limit' => [0, 10000]
+						'status' => wpsg_ShopController::STATUS_UNVOLLSTAENDIG
 					));
-
+					
 					foreach ($arOrder as $oOrder)
 					{
-
+						
 						$oOrder->delete();
-
-					}
-
+						
+					}
+					
 					$this->shop->addBackendMessage(__('UnvollstÃ€ndige Bestellungen erfolgreich gelÃ¶scht.', 'wpsg'));
-
-				}
-
+					
+				}
+				
 				if ($_REQUEST['wpsg_deinstall_core'] == '1')
 				{
-
+					
 					// Tabellen lÃ¶schen
 					foreach ((array)get_defined_constants() as $const_key => $const)
 					{
-
+						
 						if (preg_match('/^WPSG_TBL_(.*)/', $const_key))
 						{
-
+							
 							$this->db->Query("DROP TABLE IF EXISTS `".$const."`");
-
+							
 						}
-
-					}
-
+						
+					}
+										
 					// Plugin deaktivieren
-					deactivate_plugins(WPSG_FOLDERNAME.'/wpshopgermany.php');
+					deactivate_plugins('wpshopgermany/wpshopgermany.php');
 
 					// Einstellungen lÃ¶schen
 					$this->db->Query("DELETE FROM `".$wpdb->prefix."options` WHERE `option_name` LIKE 'wpsg_%'");
-
+					
 					// Plugindaten lÃ¶schen
-					wpsg_rrmdir(WPSG_PATH);
-
-					$this->shop->clearMessages();
+					wpsg_rrmdir(WP_PLUGIN_DIR.'../wpshopgermany/');
+					
+					$this->shop->clearMessages();					
 					$this->shop->redirect(WPSG_URL_WP.'wp-admin/plugins.php');
-
+					
 				}
 				else
 				{
-
-					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=deinstallieren');
-
-				}
-
-			}
-
+				
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&amp;subaction=deinstallieren');
+					
+				}
+				
+			}
+			
 			$this->shop->view['count_order_incomplete'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` WHERE `status` = '".wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)."' ");
 			$this->shop->view['count_order'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."`");
 			$this->shop->view['count_customer'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_KU."`");
 			$this->shop->view['count_products'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS."`");
-
+			
 		} // public function deinstallierenAction()
-
+		
 		/**
 		 * Wird aufgerufen wenn die LÃ€nder verwaltet werden sollen
 		 */
-		public function laenderAction() {
-
-			if (isset($_REQUEST['submit'])) {
-				
-				check_admin_referer('wpsg-admin-laender');
-
-				if (!wpsg_isSizedArray($_REQUEST['arDelete'])) {
-
-					$this->addBackendError(__('Bitte mindestens ein Land zum lÃ¶schen auswÃ€hlen.', 'wpsg'));
-
-				} else  {
-
-					foreach ($_REQUEST['arDelete'] as $country_id => $c) {
-
-						if (!wpsg_checkInput($country_id, WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-						
-						$oCountry = wpsg_country::getInstance(wpsg_sinput("key", $country_id));
-						$oCountry->delete();
-
-					}
-
-				}
-
-				$this->addBackendMessage(__('Die markierten LÃ€nder wurden erfolgreich gelÃ¶scht.', 'wpsg'));
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender');
-
-			}
-
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'save') {
-				
-				check_admin_referer('wpsg-laender-save');
-
-				$form_data = []; parse_str($_REQUEST['form_data'], $form_data);
-				$update_data = [];
-
-				// Sanitization
-				wpsg_checkRequest('name', [WPSG_SANITIZE_TEXTFIELD], __('Name', 'wpsg'), $update_data, $form_data['country']['name']);
-				wpsg_checkRequest('kuerzel', [WPSG_SANITIZE_TEXTFIELD], __('KÃŒrzel', 'wpsg'), $update_data, $form_data['country']['kuerzel']);
-				wpsg_checkRequest('vz', [WPSG_SANITIZE_INT], __('Versandzone', 'wpsg'), $update_data, $form_data['country']['vz']);
-				wpsg_checkRequest('mwst', [WPSG_SANITIZE_VALUES, ['0', '1', '2']], __('MwSt. Grundlage', 'wpsg'), $update_data, $form_data['country']['mwst']);
-				wpsg_checkRequest('mwst_a', [WPSG_SANITIZE_FLOAT], __('MwSt. Satz A (stark ermÃ€Ãigter Satz)', 'wpsg'), $update_data, $form_data['country']['mwst_a']);
-				wpsg_checkRequest('mwst_b', [WPSG_SANITIZE_FLOAT], __('MwSt. Satz B (ermÃ€Ãigter Satz)', 'wpsg'), $update_data, $form_data['country']['mwst_b']);
-				wpsg_checkRequest('mwst_c', [WPSG_SANITIZE_FLOAT], __('MwSt. Satz C (Normalsatz)', 'wpsg'), $update_data, $form_data['country']['mwst_c']);
-				wpsg_checkRequest('mwst_d', [WPSG_SANITIZE_FLOAT], __('MwSt. Satz D (Zwischensatz)', 'wpsg'), $update_data, $form_data['country']['mwst_d']);
-				
-				if (isset($form_data['country']['telprefix'])) wpsg_checkRequest('telprefix', [WPSG_SANITIZE_FLOAT], __('MwSt. Satz D (Zwischensatz)', 'wpsg'), $update_data, $form_data['country']['telprefix']);
+		public function laenderAction()
+		{
+			
+			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'saveNew')
+			{
+				
+				if (!wpsg_isSizedString($_REQUEST['newland']['name']))
+				{
+					
+					$this->shop->addBackendError(__('Bitte einen Namen fÃŒr das neue Land angeben.', 'wpsg'));
+					
+				}
+				else 
+				{
+					
+					$land = $_REQUEST['newland'];
+					
+					$land_id = $this->db->ImportQuery(WPSG_TBL_LAND, array(						
+						'name' => wpsg_q($land['name']),
+						'kuerzel' => wpsg_q($land['kuerzel']),
+						'vz' => wpsg_q($land['vz']),
+						'mwst' => wpsg_q($land['mwst']),
+						'mwst_a' => ((wpsg_tf($land['mwst_a']) >= 0 && wpsg_tf($land['mwst_a']) !== '')?wpsg_q(wpsg_tf($land['mwst_a'])):'NULL'),
+						'mwst_b' => ((wpsg_tf($land['mwst_b']) >= 0 && wpsg_tf($land['mwst_b']) !== '')?wpsg_q(wpsg_tf($land['mwst_b'])):'NULL'),
+						'mwst_c' => ((wpsg_tf($land['mwst_c']) >= 0 && wpsg_tf($land['mwst_c']) !== '')?wpsg_q(wpsg_tf($land['mwst_c'])):'NULL'),
+						'mwst_d' => ((wpsg_tf($land['mwst_d']) >= 0 && wpsg_tf($land['mwst_d']) !== '')?wpsg_q(wpsg_tf($land['mwst_d'])):'NULL')
+					));
+					
+					if (wpsg_isSizedInt($land['standard'])) $this->shop->update_option('wpsg_defaultland', $land_id);
+					
+					$this->shop->addTranslationString('land_'.$land_id, $land['name']);
+					$this->shop->addTranslationString('landkrzl_'.$land_id, $land['kuerzel']);
+					
+					$this->shop->addBackendMessage(__('Land wurde erfolgreich gespeichert.', 'wpsg'));
+					
+				}
+				
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender'); 
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'saveEdit')
+			{
+				
+				$land = array();
+				parse_str($_REQUEST['form_data'], $land);
+				$land = $land['land'];
+			
+				if (!wpsg_isSizedInt($land['id'])) $this->shop->throwErrorCode('100_9');
+				
+				$this->db->UpdateQuery(WPSG_TBL_LAND, array(
+					'name' => wpsg_q($land['name']),
+					'kuerzel' => wpsg_q($land['kuerzel']),
+					'vz' => wpsg_q($land['vz']),
+					'mwst' => wpsg_q($land['mwst']),
+					'mwst_a' => ((wpsg_tf($land['mwst_a']) >= 0 && wpsg_tf($land['mwst_a']) !== '')?wpsg_q(wpsg_tf($land['mwst_a'])):'NULL'),
+					'mwst_b' => ((wpsg_tf($land['mwst_b']) >= 0 && wpsg_tf($land['mwst_b']) !== '')?wpsg_q(wpsg_tf($land['mwst_b'])):'NULL'),
+					'mwst_c' => ((wpsg_tf($land['mwst_c']) >= 0 && wpsg_tf($land['mwst_c']) !== '')?wpsg_q(wpsg_tf($land['mwst_c'])):'NULL'),
+					'mwst_d' => ((wpsg_tf($land['mwst_d']) >= 0 && wpsg_tf($land['mwst_d']) !== '')?wpsg_q(wpsg_tf($land['mwst_d'])):'NULL')						
+				), " `id` = '".wpsg_q($land['id'])."' ");
+				
+				if (wpsg_isSizedInt($land['standard'])) $this->shop->update_option('wpsg_defaultland', $land['id']);
+				
+				$this->shop->addTranslationString('land_'.$land['id'], $land['name']);
+				$this->shop->addTranslationString('landkrzl_'.$land['id'], $land['kuerzel']);
+				
+				$land_db = $this->db->fetchRow("
+					SELECT
+						L.`id` AS `id`,
+						(IF (LENGTH(L.`kuerzel`) > 0, CONCAT(L.`name`, ' (', L.`kuerzel`, ')'), L.`name`)) AS `name`,
+						VZ.`name` AS `vz`,
+						(
+							CASE L.`mwst` 
+								WHEN '2' THEN '".__('keine MwSt. bei USt.IdNr.', 'wpsg')."'
+								WHEN '1' THEN '".__('keine MwSt.', 'wpsg')."'
+								ELSE '".__('mit MwSt.', 'wpsg')."'
+								END
+						) AS `mwst`,
+						L.`mwst_a`, L.`mwst_b`, L.`mwst_c`, L.`mwst_d`
+					FROM
+						`".WPSG_TBL_LAND."` AS L 
+							LEFT JOIN `".WPSG_TBL_VZ."` AS VZ ON (L.`vz` = VZ.`id`)
+					WHERE
+						L.`id` = '".wpsg_q($land['id'])."'
+				");
+				
+				if ($this->shop->get_option('wpsg_defaultland') == $land['id']) $land_db['standard'] = '1';
+				
+				if (wpsg_tf($land_db['mwst_a']) >= 0 && wpsg_tf($land_db['mwst_a']) != '') $land_db['mwst_a'] = wpsg_ff(wpsg_tf($land_db['mwst_a']), '%'); else $land_db['mwst_a'] = '';
+				if (wpsg_tf($land_db['mwst_b']) >= 0 && wpsg_tf($land_db['mwst_b']) != '') $land_db['mwst_b'] = wpsg_ff(wpsg_tf($land_db['mwst_b']), '%'); else $land_db['mwst_b'] = '';
+				if (wpsg_tf($land_db['mwst_c']) >= 0 && wpsg_tf($land_db['mwst_c']) != '') $land_db['mwst_c'] = wpsg_ff(wpsg_tf($land_db['mwst_c']), '%'); else $land_db['mwst_c'] = '';
+				if (wpsg_tf($land_db['mwst_d']) >= 0 && wpsg_tf($land_db['mwst_d']) != '') $land_db['mwst_d'] = wpsg_ff(wpsg_tf($land_db['mwst_d']), '%'); else $land_db['mwst_d'] = '';
 				 
-				if (wpsg_isSizedArray($update_data)) {
-				
-					if (wpsg_isSizedInt($form_data['id'])) {
-	
-						$this->db->UpdateQuery(WPSG_TBL_LAND, wpsg_q($update_data), " `id` = '".wpsg_q($form_data['id'])."' ");
-						$this->addBackendMessage(__('Land erfolgreich gespeichert.', 'wpsg'));
-	
-					} else {
-	
-						$form_data['id'] = $this->db->ImportQuery(WPSG_TBL_LAND, wpsg_q($update_data));
-						$this->addBackendMessage(__('Land erfolgreich angelegt.', 'wpsg'));
-	
-					}
-								
-					if (isset($update_data['name'])) $this->shop->addTranslationString('land_'.$form_data['id'], $update_data['name']);
-					
-				}
-
-				if (wpsg_isSizedInt($form_data['standard'])) $this->update_option('wpsg_defaultland', $form_data['id'], false, false, WPSG_SANITIZE_INT);
-
-				die($this->laenderList());
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'eu_import') {
-				
-				check_admin_referer('wpsg-laender-eu_import');
-
+				header('Content-Type: application/json');
+				
+				die(json_encode($land_db));
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'eu_import')
+			{
+				
 				// EU Import
 				$this->loadEULaender();
 				$this->shop->addBackendMessage(__('EU-LÃ€nder erfolgreich importiert.', 'wpsg'));
-
-				die($this->laenderList());
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'import') {
-				
-				check_admin_referer('wpsg-laender-import');
-
+				
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender');
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'import')
+			{
+								
 				$this->loadStandardLaenderVz();
 				$this->shop->addBackendMessage(__('LÃ€nder erfolgreich importiert.', 'wpsg'));
-
-				die($this->laenderList());
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove') {
-
-				check_admin_referer('wpsg-laender-delete');
-				
-				$this->clearMessages();
-				$oCountry = wpsg_country::getInstance($_REQUEST['land_id']);
-				$oCountry->delete();
-
+				
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender');				
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove')
+			{
+				
+				$this->db->Query("DELETE FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($_REQUEST['land_id'])."' ");
+				
 				die("1");
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add') {
-				
-				check_admin_referer('wpsg-laender-add');
-				
-				$this->shop->view['vz'] = $this->db->fetchAssocField("SELECT `id`, `name` FROM `".WPSG_TBL_VZ."` ORDER BY `name` ASC", "id", "name");
-
-				$this->shop->view['land']['mwst_a'] = '';
-				$this->shop->view['land']['mwst_b'] = '';
-				$this->shop->view['land']['mwst_c'] = '';
-				$this->shop->view['land']['mwst_d'] = '';
-
-				$this->shop->view['land']['standard'] = '0';
-
-				die($this->shop->render(WPSG_PATH_VIEW.'/admin/laender_edit.phtml'));
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'edit') {
-
-				check_admin_referer('wpsg-laender-edit');
-				
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'edit')
+			{
+			
 				$this->shop->view['vz'] = $this->db->fetchAssocField("SELECT `id`, `name` FROM `".WPSG_TBL_VZ."` ORDER BY `name` ASC", "id", "name");
 				$this->shop->view['land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($_REQUEST['land_id'])."' ");
-
-				if (wpsg_tf($this->shop->view['land']['mwst_a']) >= 0 && wpsg_tf($this->shop->view['land']['mwst_a']) !== '') $this->shop->view['land']['mwst_a'] = wpsg_ff(wpsg_tf($this->shop->view['land']['mwst_a']), '%'); else $this->shop->view['land']['mwst_a'] = '';
+				
+				if (wpsg_tf($this->shop->view['land']['mwst_a']) >= 0 && wpsg_tf($this->shop->view['land']['mwst_a']) !== '') $this->shop->view['land']['mwst_a'] = wpsg_ff(wpsg_tf($this->shop->view['land']['mwst_a']), '%'); else $this->shop->view['land']['mwst_a'] = ''; 
 				if (wpsg_tf($this->shop->view['land']['mwst_b']) >= 0 && wpsg_tf($this->shop->view['land']['mwst_b']) !== '') $this->shop->view['land']['mwst_b'] = wpsg_ff(wpsg_tf($this->shop->view['land']['mwst_b']), '%'); else $this->shop->view['land']['mwst_b'] = '';
 				if (wpsg_tf($this->shop->view['land']['mwst_c']) >= 0 && wpsg_tf($this->shop->view['land']['mwst_c']) !== '') $this->shop->view['land']['mwst_c'] = wpsg_ff(wpsg_tf($this->shop->view['land']['mwst_c']), '%'); else $this->shop->view['land']['mwst_c'] = '';
 				if (wpsg_tf($this->shop->view['land']['mwst_d']) >= 0 && wpsg_tf($this->shop->view['land']['mwst_d']) !== '') $this->shop->view['land']['mwst_d'] = wpsg_ff(wpsg_tf($this->shop->view['land']['mwst_d']), '%'); else $this->shop->view['land']['mwst_d'] = '';
-
+								
 				if ($this->shop->get_option('wpsg_defaultland') == $_REQUEST['land_id']) $this->shop->view['land']['standard'] = '1'; else $this->shop->view['land']['standard'] = '0';
-
+				
 				die($this->shop->render(WPSG_PATH_VIEW.'/admin/laender_edit.phtml'));
-
-			}
-
+			
+			}
+			
+			$this->shop->removePersistentBackendError('wpsg_update_3.5_3');
+			
 			$this->shop->view['vz'] = $this->db->fetchAssocField("SELECT `id`, `name` FROM `".WPSG_TBL_VZ."` ORDER BY `name` ASC", "id", "name");
 			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `vz` ASC, `name` ASC");
-
+					 	
 		} // public function laenderAction()
-
-		public function wpmlAction() {
-
-			if (isset($_REQUEST['wpsg_set_string_translation'])) {
-
-				if (function_exists('icl_register_string')) {
-					//throw new \wpsg\Exception(__('WPML ist nicht komplett Installiert (Funktion icl_register_string ist nicht erreichbar)', 'wpsg'));
-
-					// Alle Automatisch angelegten String-Ãbersetzungen lÃ¶schen
-					$arStringTrans = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `context` = 'wpsg' AND `name` LIKE 'wpsg_auto_%' ");
-
-					$arTables = $this->db->fetchAssocField("SHOW TABLES");
-					
-					foreach ($arStringTrans as $st_id) {
-
-						// LÃ¶schen
-						if (in_array(WPSG_TBL_WPML_ICL_STRING_PAGES, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRING_PAGES."` WHERE `string_id` = '".wpsg_q($st_id)."' ");
-						if (in_array(WPSG_TBL_WPML_ICL_STRING_POSITIONS, $arTables))$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRING_POSITIONS."` WHERE `string_id` = '".wpsg_q($st_id)."' ");
-						if (in_array(WPSG_TBL_WPML_ICL_STRING_TRANSLATIONS, $arTables))$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRING_TRANSLATIONS."` WHERE `string_id` = '".wpsg_q($st_id)."' ");
-						if (in_array(WPSG_TBL_WPML_ICL_STRINGS, $arTables))$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `id` = '".wpsg_q($st_id)."' ");
-						
-					}
-
-					// LÃ€ndernamen
-					$arToTrans = $this->db->fetchAssocField("SELECT CONCAT('land_', `id`) AS `key`, `name` FROM `".WPSG_TBL_LAND."` ", "key", "name");
-
-					// Versandzonen
-					$arToTrans += $this->db->fetchAssocField("SELECT CONCAT('vz_', `id`) AS `key`, `name` FROM `".WPSG_TBL_VZ."` ", "key", "name");
-
-					// Auswahl der Anrede
-					$wpsg_admin_pflicht = $this->shop->get_option('wpsg_admin_pflicht');
-					$arToTrans['anrede_auswahl'] = $wpsg_admin_pflicht['anrede_auswahl'];
-
-					// Text Widerrufsmail
-					$arToTrans['wpsg_ps_mailwiderruf'] = $this->shop->get_option('wpsg_ps_mailwiderruf');
-
-					foreach ($arToTrans as $k => $t) {
-
-						// DoppeleintrÃ€ge verhindern
-						$exist = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `value` = '".wpsg_q($t)."' AND `context` = 'wpsg' ");
-
-						if (!wpsg_isSizedInt($exist)) {
-
-							icl_register_string('wpsg', 'wpsg_auto_'.$k, $t, false, $this->get_option('wpsg_backend_language'));
-
-						}
-
-					}
-
-					$this->addBackendMessage(wpsg_translate(__('#1# Texte zur String-Ãbersetzung der Domain "wpsg" hinzugefÃŒgt.'), sizeof($arToTrans)));
-
-					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=wpml');
-
-				} else {
-
-					//throw new \wpsg\Exception(__('test', 'wpsg'));
-
-					// Alle Automatisch angelegten String-Ãbersetzungen lÃ¶schen
-					$arStringTrans = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `context` = 'wpsg' AND `name` LIKE 'wpsg_auto_%' ");
-
-					foreach ($arStringTrans as $st_id) {
-
-						// LÃ¶schen
-						$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRING_PAGES."` WHERE `string_id` = '".wpsg_q($st_id)."' ");
-						$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRING_POSITIONS."` WHERE `string_id` = '".wpsg_q($st_id)."' ");
-						$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRING_TRANSLATIONS."` WHERE `string_id` = '".wpsg_q($st_id)."' ");
-						$this->db->Query("DELETE FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `id` = '".wpsg_q($st_id)."' ");
-
-					}
-
-					// LÃ€ndernamen
-					$arToTrans = $this->db->fetchAssocField("SELECT CONCAT('land_', `id`) AS `key`, `name` FROM `".WPSG_TBL_LAND."` ", "key", "name");
-
-					// Versandzonen
-					$arToTrans += $this->db->fetchAssocField("SELECT CONCAT('vz_', `id`) AS `key`, `name` FROM `".WPSG_TBL_VZ."` ", "key", "name");
-
-					// Auswahl der Anrede
-					$wpsg_admin_pflicht = $this->shop->get_option('wpsg_admin_pflicht');
-					$arToTrans['anrede_auswahl'] = $wpsg_admin_pflicht['anrede_auswahl'];
-
-					// Text Widerrufsmail
-					$arToTrans['wpsg_ps_mailwiderruf'] = $this->shop->get_option('wpsg_ps_mailwiderruf');
-
-					foreach ($arToTrans as $k => $t) {
-
-						// DoppeleintrÃ€ge verhindern
-						$exist = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `value` = '".wpsg_q($t)."' AND `context` = 'wpsg' ");
-
-						if (!wpsg_isSizedInt($exist)) {
-
-							do_action('wpml_register_single_string', 'wpsg', 'wpsg_auto_'.$k, $t, false, $this->get_option('wpsg_backend_language'));
-
-						}
-
-					}
-
-					$this->addBackendMessage(wpsg_translate(__('#1# Texte zur String-Ãbersetzung der Domain "wpsg" hinzugefÃŒgt.'), sizeof($arToTrans)));
-
-					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=wpml');
-
-				} 
-			}
-
-		} // public function wpmlAction()
-
-		private function laenderList()
-		{
-
-			$this->shop->view['vz'] = $this->db->fetchAssocField("SELECT `id`, `name` FROM `".WPSG_TBL_VZ."` ORDER BY `name` ASC", "id", "name");
-			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `vz` ASC, `name` ASC");
-
-			return $this->shop->render(WPSG_PATH_VIEW.'/admin/laender_list.phtml', false);
-
-		} // private function laenderList()
-
+		
 		/**
 		 * Importiert die EU-LÃ€nder aus der Liste
@@ -1384,20 +944,20 @@
 		public function loadEULaender()
 		{
-
+			 
 			$handle = fopen(WPSG_PATH."/lib/data/wp_wpsg_laender.csv", "r");
-
+			
 			// Schauen ob die EU Versandzone existiert
 			$nExists = $this->db->fetchOne("SELECT VZ.`id` FROM `".WPSG_TBL_VZ."` AS VZ WHERE VZ.`id` = '2' ");
 			if (!wpsg_isSizedInt($nExists)) $this->db->ImportQuery(WPSG_TBL_VZ, array(
-				'id' => '2',
+				'id' => '2', 
 				'name' => __('EU', 'wpsg'),
-				'innereu' => '1'
+				'innereu' => '1'				
 			));
-
+			
 			while (($row = fgetcsv($handle, 1000, ";")) !== false)
 			{
-
+				 
 				if (!in_array($row['3'], array(1, 2))) continue;
-
+				
 				$country_data = array(
 					'id' => wpsg_q($row['0']),
@@ -1411,30 +971,30 @@
 					'mwst_d' => ((wpsg_tf($row[8]) >= 0 && wpsg_tf($row[8]) !== '')?wpsg_q(wpsg_tf($row[8])):'NULL')
 				);
-
+				
 				$nExists = $this->db->fetchOne("SELECT L.`id` FROM `".WPSG_TBL_LAND."` AS L WHERE UPPER(L.`name`) = '".wpsg_q(strtoupper($country_data['name']))."' ");
-
+												
 				if (wpsg_isSizedInt($nExists))
 				{
-
+					
 					unset($country_data['id']);
 					$this->db->UpdateQuery(WPSG_TBL_LAND, $country_data, " `id` = '".wpsg_q($nExists)."' ");
-
+					
 				}
 				else
 				{
-
+					
 					// Checken ob die ID schon existiert.
 					$idName = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($country_data['id'])."' ");
-
+					
 					if (wpsg_isSizedInt($idName)) unset($country_data['id']);
-
+					
 					$this->db->ImportQuery(WPSG_TBL_LAND, $country_data);
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 		} // public function loadEULaender()
-
+		
 		/**
 		 * Diese Funktion lÃ€dt die Standard LÃ€nder und Versandzonen
@@ -1442,24 +1002,24 @@
 		 */
 		private function loadStandardLaenderVz()
-		{
-
+		{ 
+			
 			// Standard LÃ€nder und Versandzonen laden
 			$this->db->Query("DELETE FROM `".WPSG_TBL_VZ."`");
 			$this->db->Query("DELETE FROM `".WPSG_TBL_LAND."`");
-
+			
 			// Versandzonen anlegen
 			$this->db->ImportQuery(WPSG_TBL_VZ, array('id' => '1', 'name' => __('Inland', 'wpsg')));
 			$this->db->ImportQuery(WPSG_TBL_VZ, array('id' => '2', 'name' => __('EU LÃ€nder', 'wpsg'), 'innereu' => '1'));
 			$this->db->ImportQuery(WPSG_TBL_VZ, array('id' => '3', 'name' => __('Ausland', 'wpsg')));
-
+			
 			$this->shop->addTranslationString('vz_1', __('Inland', 'wpsg'));
 			$this->shop->addTranslationString('vz_2', __('EU LÃ€nder', 'wpsg'));
 			$this->shop->addTranslationString('vz_3', __('Ausland', 'wpsg'));
-
+			
 			$handle = fopen(WPSG_PATH."/lib/data/wp_wpsg_laender.csv", "r");
-
+			
 			while (($row = fgetcsv($handle, 1000, ";")) !== false)
 			{
-
+				
 				$land_id = $this->db->ImportQuery(WPSG_TBL_LAND, array(
 					'id' => wpsg_q($row['0']),
@@ -1473,54 +1033,47 @@
 					'mwst_d' => ((wpsg_tf($row[8]) >= 0 && wpsg_tf($row[8]) !== '')?wpsg_q(wpsg_tf($row[8])):'NULL')
 				));
-
+									
 				$this->shop->addTranslationString('land_'.$land_id, $row['1']);
-
-			}
-
+				$this->shop->addTranslationString('landkrzl_'.$land_id, $row['2']);
+					
+			}
+			
 			$this->shop->update_option('wpsg_defaultland', '1');
-
+			
 		} // private function loadStandardLaenderVz()
-
-
+		
 		/**
-		 * Wird aufgerufen wenn eine Mail an den Kunden gesendet werden soll
+		 * Speichert die Kundenvoreinstellungen
 		 */
-		public function sendMailAction()
+		public function customerpresetAction()
 		{
-			//die('sendMail');
-
-			$oid = 0;
-			$option = $this->shop->get_option('wpsg_preisangaben');
-			if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-
-			// Order-Daten sammeln und Tabelle neu generieren
-			$basket = new wpsg_basket();
-			$basket->initFromDB($oid, true);
-			$this->shop->view['basket'] = $basket->toArray(true);
-
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'send')
-			{
-
-				//$temp = date("d.m.Y H:i:s", strtotime($basket->arCheckout['datum']));
-				//$temp = date("d.m.Y H:i:s", strtotime('2016-12-14'));
-				$this->shop->basket->initFromDB($_REQUEST['edit_id'], true);
-				$arBasket = $this->shop->basket->toArray(true);
-
-				$this->shop->basket->sendOrderSaveMails($_REQUEST['edit_id'], $arBasket, true, false, false);
-
-				$this->shop->addBackendMessage(wpsg_translate(__('Kundenmail wurde erfolgreich an #1# gesendet.', 'wpsg'), $basket->arCheckout['email']));
-
-			}
-
-			$this->shop->view['colspan'] = 3;
-			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/order/view_orderdata.phtml');
-
-			exit;
-
-		} // public function sendMailAction()
-
-
+			
+			if (isset($_REQUEST['wpsg-submit']))
+			{
+				
+				$this->shop->update_option('wpsg_customerpreset_shipping', $_REQUEST['wpsg_customerpreset_shipping']);
+				$this->shop->update_option('wpsg_customerpreset_payment', $_REQUEST['wpsg_customerpreset_payment']);
+				$this->shop->update_option('wpsg_defaultland', $_REQUEST['wpsg_defaultland']);
+				$this->shop->update_option('wpsg_customerpreset_title', $_REQUEST['wpsg_customerpreset_title']);
+				
+				$this->addBackendMessage(__('Kundenvoreinstellungen erfolgreich gespeichert.', 'wpsg'));
+				
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=customerpreset');
+								
+			}
+			
+			$this->shop->view['arShipping'] = array();
+			foreach ($this->shop->arShipping as $s_id => $s) $this->shop->view['arShipping'][$s['id']] = $s['name']; 
+			
+			$this->shop->view['arPayment'] = array();
+			foreach ($this->shop->arPayment as $p_id => $p) $this->shop->view['arPayment'][$p['id']] = $p['name'];
+			
+			$this->shop->view['pflicht'] = $this->shop->get_option('wpsg_admin_pflicht');
+			$this->shop->view['arTitle'] = (array)explode('|', $this->shop->view['pflicht']['anrede_auswahl']);
+									
+			$this->shop->view['arLander'] = $this->db->fetchAssocField("SELECT L.`id`, L.`name` FROM `".WPSG_TBL_LAND."` AS L ORDER BY `name` ASC ", "id", "name");
+						
+		} // public function customerpresetAction()
+		
 		/**
 		 * Wird aufgerufen wenn die Pflichtfelder verwaltet werden sollen
@@ -1528,51 +1081,25 @@
 		public function kundendatenAction()
 		{
-			
+
 			$this->shop->view['pflicht'] = $this->get_option('wpsg_admin_pflicht');
 
-			$this->shop->view['arShipping'] = array();
-			foreach ($this->shop->arShipping as $s_id => $s) $this->shop->view['arShipping'][$s['id']] = $s['name'];
-
-			$this->shop->view['arPayment'] = array();
-			foreach ($this->shop->arPayment as $p_id => $p) $this->shop->view['arPayment'][$p['id']] = $p['name'];
-
-			$this->shop->view['customerdatadelete'] = array();
-			foreach (@(array)$this->shop->customerdatadelete as $d_id => $d) $this->shop->view['customerdatadelete'][$d['id']] = $d['name'];
-
-			$this->shop->view['arLander'] = $this->db->fetchAssocField("SELECT L.`id`, L.`name` FROM `".WPSG_TBL_LAND."` AS L ORDER BY `name` ASC ", "id", "name");
-
-			$this->shop->view['arTitle'] = (array)explode('|', $this->shop->view['pflicht']['anrede_auswahl']);
-
 			if (isset($_REQUEST['show']) && $_REQUEST['show'] == 'code')
 			{
-
-				check_admin_referer('wpsg-admin-kundendaten-code');
 				
 				$this->shop->view['id'] = $_REQUEST['kv_id'];
 				$this->shop->view['field'] = $this->shop->view['pflicht']['custom'][$_REQUEST['kv_id']];
-
+				
 				die($this->shop->render(WPSG_PATH_VIEW.'/admin/kundendaten_codeinfo.phtml'));
-
-			}
-
-			if (isset($_REQUEST['submit'])) {
- 
-				check_admin_referer('wpsg-admin-kundendaten');
-
-				$arShippingPossible = ['-1'];
-				$arShippingPossible = array_merge($arShippingPossible, array_keys($this->shop->arShipping??[]));
-				
-				$arPaymentPossible = ['-1'];
-				$arPaymentPossible = array_merge($arPaymentPossible, array_keys($this->shop->arPayment??[]));
-				
-			    $this->shop->update_option('wpsg_customerpreset_shipping', $_REQUEST['wpsg_customerpreset_shipping'], false, false, WPSG_SANITIZE_VALUES, $arShippingPossible);
-			    $this->shop->update_option('wpsg_customerpreset_payment', $_REQUEST['wpsg_customerpreset_payment'], false, false, WPSG_SANITIZE_VALUES, $arPaymentPossible);
-			    $this->shop->update_option('wpsg_defaultland', $_REQUEST['wpsg_defaultland'], false, false, WPSG_SANITIZE_INT);
-			    $this->shop->update_option('wpsg_customerpreset_title', $_REQUEST['wpsg_customerpreset_title'], false, false, WPSG_SANITIZE_INT);
-			    $this->shop->update_option('wpsg_kundenvariablen_show', $_REQUEST['wpsg_kundenvariablen_show'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-
+				
+			}
+			
+			if (isset($_REQUEST['submit'])) 
+			{
+
+				$this->update_option('wpsg_kundenvariablen_show', $_REQUEST['wpsg_kundenvariablen_show']);
+				
 				foreach ($_REQUEST['pflicht'] as $k => $v)
 				{
-
+					//wpsg_debug($v);
 					if ($k == 'custom')
 					{
@@ -1580,59 +1107,45 @@
 						foreach ($_REQUEST['pflicht']['custom'] as $c_id => $c)
 						{
-
-							if (wpsg_getInt($c['del']) == '1')
-								unset($this->shop->view['pflicht']['custom'][$c_id]);
+							
+							if ($c['del'] == '1') unset($this->shop->view['pflicht']['custom'][$c_id]);
 							else
 							{
-								/*
-								// wird jetzt ÃŒber InlineEdit gespeichert
+								
 								$this->shop->view['pflicht']['custom'][$c_id]['typ'] = $c['typ'];
-								$this->shop->view['pflicht']['custom'][$c_id]['show'] = $c['show'];
+								$this->shop->view['pflicht']['custom'][$c_id]['show'] = $c['show'];						
 								$this->shop->view['pflicht']['custom'][$c_id]['auswahl'] = $c['auswahl'];
-
+								
 								$this->shop->addTranslationString('customervars_'.$c_id.'_auswahl', $c['auswahl']);
-								*/
+								
 							}
-
+														
 						}
-
+						
 					}
 					else
 					{
-
-						if ($k == 'anrede_auswahl') {
-
-							if (wpsg_checkInput($v, WPSG_SANITIZE_TEXTFIELD)) {
+						
+						if ($k == 'anrede_auswahl')
+						{
 							
-								$this->shop->view['pflicht'][$k] = $v;
-								$this->shop->addTranslationString('anrede_auswahl', $v);
-								
-							} else $this->shop->addBackendError(__('Bitte die Eingaben bei Anrede ÃŒberprÃŒfen.', 'wpsg'));
-
-						} else {
-							
-							if (wpsg_checkInput($v, WPSG_SANITIZE_VALUES, ['0', '1', '2'])) {
-								
-								$this->shop->view['pflicht'][$k] = $v;
-								
-							} else $this->shop->addBackendError(wpsg_translate(__('Bitte die Eingaben bei #1# ÃŒberprÃŒfen.', 'wpsg'), $k));
+							$this->shop->addTranslationString('anrede_auswahl', $v);	
 							
 						}
-
-					}
-
+						
+						$this->shop->view['pflicht'][$k] = $v;
+						
+					}
+					
 				}
 
 				$this->update_option('wpsg_admin_pflicht', $this->shop->view['pflicht']);
-
-				$this->shop->addBackendMessage(__('Kundenvariablen erfolgreich gespeichert.', 'wpsg'));
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten');
-
-			}
-
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add') {
-
-				check_admin_referer('wpsg-admin-kundendaten-add');
-				
+				
+				$this->addBackendMessage(__('Kundenvariablen erfolgreich gespeichert.', 'wpsg'));
+				
+			}
+			
+			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add')
+			{
+								
 				if (!is_array($this->shop->view['pflicht'])) $this->shop->view['pflicht'] = array();
 				$this->shop->view['pflicht']['custom'][] = array(
@@ -1642,171 +1155,57 @@
 					"auswahl" => ''
 				);
-
+				
 				$this->update_option('wpsg_admin_pflicht', $this->shop->view['pflicht']);
-
+				
 				die($this->shop->render(WPSG_PATH_VIEW.'/admin/kundendaten_tab2.phtml'));
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove') {
-				
-				check_admin_referer('wpsg-admin-kundendaten-delete');
-
-				unset($this->shop->view['pflicht']['custom'][$_REQUEST['kv_index']]);
+				
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'inlinedit')
+			{
+				
+				if ($_REQUEST['field'] == 'name')
+				{
+					
+					$this->shop->view['pflicht']['custom'][$_REQUEST['field_id']]['name'] = $_REQUEST['value']; 
+						
+				}
+				
 				$this->update_option('wpsg_admin_pflicht', $this->shop->view['pflicht']);
-
-				die("1");
-
-			}
-			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'inlinedit')
-			{
-
-				if ($_REQUEST['field'] == 'name')
-				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-					$this->shop->view['pflicht']['custom'][$_REQUEST['field_id']]['name'] = $_REQUEST['value'];
-
-				}
-				else if ($_REQUEST['field'] == 'show')
-				{
-
-					$_REQUEST['value'] = wpsg_sinput("key", $_REQUEST['value']);
-					$this->shop->view['pflicht']['custom'][$_REQUEST['field_id']]['show'] = $_REQUEST['value'];
-
-				}
-				else if ($_REQUEST['field'] == 'typ')
-				{
-
-					$_REQUEST['value'] = wpsg_sinput("key", $_REQUEST['value']);
-					$this->shop->view['pflicht']['custom'][$_REQUEST['field_id']]['typ'] = $_REQUEST['value'];
-
-				}
-				else if ($_REQUEST['field'] == 'auswahl')
-				{
-
-					$this->shop->view['pflicht']['custom'][$_REQUEST['field_id']]['auswahl'] = $_REQUEST['value'];
-
-				}
-
-				$this->update_option('wpsg_admin_pflicht', $this->shop->view['pflicht']);
-
-				die(stripslashes($_REQUEST['value']));
-
-			}
-
-		} // public function kundendatenAction()
-
+				
+				die(stripslashes($_REQUEST['value'])); 
+				
+			}
+						
+		} // public function pflichtAction()
+		
 		/**
 		 * Konfiguration der E-Mail Einstellungen
 		 */
-		public function emailconfAction() {
-
-			if (isset($_REQUEST['getEmailLogo'])) {
-
-				$logoPath = wpsg_getUploadDir('wpsg_mailconf').'wpsg_email_logo.jpg';
-
-				header('Content-Type: image/'.preg_replace('/(.*)\./', '', $logoPath));
-			    header('Content-Disposition: inline; filename="'.basename($logoPath).'"');
-			    header('Expires: 0');
-			    header('Cache-Control: must-revalidate');
-			    header('Pragma: public');
-			    header('Content-Length: '.filesize($logoPath));
-
-				readfile($logoPath);
-				exit;
-
-			} else if (isset($_REQUEST['migrateAttachmentToMediathek'])) {
-				
-				$old_attachment = $this->get_option('wpsg_kundenmail_attachfile');				
-				$file = wpsg_getUploadDir('wpsg_mailconf').$old_attachment;
-				
-				if (wpsg_isSizedString($old_attachment) && file_exists($file)) {
-					
-					$wp_upload_dir = wp_upload_dir();
-					
-					$attachment = array(
-						'guid' => $wp_upload_dir['url'].'/'.basename($file),
-						'post_mime_type' => 'application/pdf',
-						'post_title' => 'Migrierter Anhang aus altem Kundenanhang',
-						'post_content' => 'Migrierter Anhang aus altem Kundenanhang',
-						'post_status' => 'inherit'
-					);
-					
-					copy($file,$wp_upload_dir['path'].'/'.basename($file));
-					
-					$image_id = wp_insert_attachment($attachment, $wp_upload_dir['path'].'/'.basename($file), 0);
-					
-					//require_once(ABSPATH.'wp-admin/includes/image.php');					
-					//$attach_data = wp_generate_attachment_metadata($image_id, basename($file));					
-					//wp_update_attachment_metadata($image_id, $attach_data);
-					
-					$oldIDs = $this->shop->get_option('wpsg_kundenmail_mediaattachment');
-					$oldIDs = explode(',', $oldIDs);
-					
-					$oldIDs[] = $image_id;
-					
-					$oldIDs = array_unique($oldIDs); wpsg_trim($oldIDs);
-					
-					$GLOBALS['wpsg_sc']->update_option('wpsg_kundenmail_mediaattachment', implode(',', $oldIDs));
-					
-					@unlink($file);
-					$this->shop->update_option('wpsg_kundenmail_attachfile', false);
-					
-				}
-				
-				$this->shop->addBackendMessage(__('Anhang migriert.', 'wpsg'));
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf');
-
-				exit;
-				
-			}
-			
-			if (isset($_REQUEST['submit'])) {
-				
-				check_admin_referer('wpsg-admin-emailconf');
-
-                $logoPath = wpsg_getUploadDir('wpsg_mailconf').'wpsg_email_logo.jpg';
-
-                $this->update_option('wpsg_htmlmail', @$_REQUEST['wpsg_htmlmail'], false, false, WPSG_SANITIZE_CHECKBOX);
-                $this->update_option('wpsg_email_logo_activated', @$_REQUEST['wpsg_email_logo_activated'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-                $this->update_option('wpsg_email_logo_watermark', @$_REQUEST['wpsg_email_logo_watermark'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-
-                if (intval($_REQUEST['wpsg_email_logo_del']) === 1) {
-
-                    @unlink($logoPath);
-
-                } else if (file_exists($_FILES['wpsg_email_logo']['tmp_name']) && intval($_FILES['wpsg_email_logo']['error']) === 0) {
-
-                    @unlink($logoPath);
-                    move_uploaded_file($_FILES['wpsg_email_logo']['tmp_name'], $logoPath);
-
-                }
-
-                if (isset($_REQUEST['wpsg_email_logo_alignment'])) $this->update_option('wpsg_email_logo_alignment', $_REQUEST['wpsg_email_logo_alignment'], false, false, WPSG_SANITIZE_VALUES, ['left', 'center', 'right']);
-                if (isset($_REQUEST['wpsg_email_logo_transparency'])) $this->update_option('wpsg_email_logo_transparency', intval($_REQUEST['wpsg_email_logo_transparency']), false, false, WPSG_SANITIZE_INT);
-
+		public function emailconfAction()
+		{
+			
+			if (isset($_REQUEST['submit'])) 
+			{
+							
+				$this->update_option('wpsg_htmlmail', $_REQUEST['wpsg_htmlmail']);
+				
 				wpsg_saveEMailConfig("global"); // Global
 				wpsg_saveEMailConfig('adminmail'); // Admin Mail
 				wpsg_saveEMailConfig('kundenmail'); // Kunden Mail
 				wpsg_saveEMailConfig('status'); // Mail StatusÃ€nderung
-                wpsg_saveEMailConfig('reminder');
-
-                $this->shop->update_option('wpsg_reminder_hours', $_REQUEST['wpsg_reminder_hours']);
-
+				
 				$this->shop->callMods('admin_emailconf_save');
-
+				
 				$this->shop->addBackendMessage(__('E-Mail Konfiguration erfolgreich gespeichert.', 'wpsg'));
-
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf');
-
-			}
-
-			if (isset($_REQUEST['cmd']) && $_REQUEST['cmd'] == 'del_attach_file') {
-
+				
+			}
+			
+			if (isset($_REQUEST['cmd']) && $_REQUEST['cmd'] == 'del_attach_file')
+			{
 				$this->update_option('wpsg_kundenmail_attachfile', '');
-
-			}
-
+			}
+				
 		} // public function emailconfAction()
-
+		
 		/**
 		 * Wird aufgerufen wenn die Seiten verwaltet werden sollen
@@ -1816,33 +1215,33 @@
 
 			$pages = get_pages();
-
+			
 			$arPages = array(
-				'0' => __('Keine Zuordnung', 'wpsg'),
 				'-1' => __('Neu anlegen und zuordnen', 'wpsg')
 			);
-
+			
 			foreach ($pages as $k => $v)
 			{
 				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
 			}
-
+			
 			$this->shop->view['pages'] = $arPages;
-
+			
 		} // public function seitenAction()
-
+		 
 		/**
 		 * Modulverwaltung
 		 */
-		public function moduleAction() {
-
+		public function moduleAction()
+		{
+			
 			if (isset($_REQUEST['noheader']) && $_REQUEST['noheader'] == '1' && !isset($_REQUEST['submit']))
 			{
-
+				
 				// Ajax Anfrage eines Moduls
 				$this->shop->callMod($_REQUEST['modul'], 'be_ajax');
 				die();
-
-			}
-
+				
+			}
+									
 			$this->shop->view = array(
 				'actionName' => 'module',
@@ -1850,38 +1249,38 @@
 				'groups' => array()
 			);
-
+			
 			$this->shop->view['global'] = false;
 			if ($this->shop->isMultiBlog() && $this->shop->get_option('wpsg_multiblog_standalone', true) != '1') $this->shop->view['global'] = true;
-
+									
 			$this->shop->loadModule(true);
 
 			if (isset($_REQUEST['submit'])) { $this->submitAction(); }
-
+			
 			foreach ($this->shop->arAllModule as $mod_key => $m)
 			{
-
+				
 				$group = $m->group;
-
+				
 				if (trim($group) == '') $group = __('Sonstiges', 'wpsg');
-
+				
 				$this->shop->view['groups'][$group][$mod_key] = $m;
-
-			}
-
+				
+			}
+			
 			// Gruppen sortieren
-			ksort($this->shop->view['groups']);
-
+			ksort($this->shop->view['groups']); 
+			
 			// Module in den Gruppen sortieren
 			foreach ($this->shop->view['groups'] as $k => $g)
 			{
-
+				
 				uasort($this->shop->view['groups'][$k], array($this->shop, 'cmp_mods_name'));
-
-			}
-
+				
+			}
+						
 			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
-
+			
 		} // public function moduleAction()
-
+			
 		/**
 		 * Hilfe Seite
@@ -1889,144 +1288,120 @@
 		public function hilfeAction()
 		{
-
+			
 			$this->shop->view = array(
 				'actionName' => 'hilfe',
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/hilfe.phtml'
 			);
-
-			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
-
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');			
+			
 		} // public function hilfeAction()
-
+		
 		/**
 		 * Behandelt das Speichern der Widerrufsbelehrung
 		 */
-		public function widerrufsbelehrungAction() {
-			
-			if (isset($_REQUEST['download'])) {
-				
-				check_admin_referer('wpsg-admin-widerrufsbelehrung-download');
-				
-				wpsg_header::PDFPlugin(WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->get_option('wpsg_revocationform'));
-				
-			}
-
+		public function widerrufsbelehrungAction()
+		{
+			
 			if (isset($_REQUEST['submit']))
 			{
-
-                \check_admin_referer('wpsg-save-revocation');
-
-                $this->shop->update_option('wpsg_ps_mailwiderruf', $_REQUEST['wpsg_ps_mailwiderruf'], false, false, WPSG_SANITIZE_TEXTAREA);
-				$this->shop->addTranslationString('wpsg_ps_mailwiderruf', wpsg_sinput("text_field", $_REQUEST['wpsg_ps_mailwiderruf']));
-
+				
+				$this->shop->update_option('wpsg_ps_mailwiderruf', $_REQUEST['wpsg_ps_mailwiderruf']);
+				$this->shop->addTranslationString('wpsg_ps_mailwiderruf', $_REQUEST['wpsg_ps_mailwiderruf']);
+								
 				if (file_exists($_FILES['wpsg_widerrufsformular']['tmp_name']))
 				{
-				    
-				    if (mime_content_type($_FILES['wpsg_widerrufsformular']['tmp_name']) === 'application/pdf') {
-
-                        if (!file_exists(WPSG_PATH_UPLOADS.'wpsg_revocation/')) mkdir(WPSG_PATH_UPLOADS.'wpsg_revocation/', 0775, true);
-    
-                        $this->clearRevocationForm();
-    
-                        move_uploaded_file($_FILES['wpsg_widerrufsformular']['tmp_name'], WPSG_PATH_UPLOADS.'wpsg_revocation/'.$_FILES['wpsg_widerrufsformular']['name']);
-                        $this->addBackendMessage(__('Widerrufsformular erfolgreich hochgeladen.', 'wpsg'));
-    
-                        $this->shop->update_option('wpsg_revocationform', $_FILES['wpsg_widerrufsformular']['name']);
-                        
-                    } else {
-				        
-				        $this->shop->addBackendError(__('Dateiformat muss vom Type PDF sein.', 'wpsg'));
-				        
-                    }
-
-				} else if (wpsg_isSizedString($_FILES['wpsg_widerrufsformular']['name']) && $_FILES['wpsg_widerrufsformular']['error']) {
-				    
-				    $this->shop->addBackendError(__('Mit dem Upload gab es ein Problem, mÃ¶glicherweise ist die Datei zu groÃ.', 'wpsg'));
-				    
-                }
-
-                $this->shop->update_option('wpsg_widerrufsformular_kundenmail', $_REQUEST['wpsg_widerrufsformular_kundenmail'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+					
+					if (!file_exists(WPSG_PATH_UPLOADS.'wpsg_revocation/')) mkdir(WPSG_PATH_UPLOADS.'wpsg_revocation/', 0775, true);
+				
+					$this->clearRevocationForm();
+					
+					move_uploaded_file($_FILES['wpsg_widerrufsformular']['tmp_name'], WPSG_PATH_UPLOADS.'wpsg_revocation/'.$_FILES['wpsg_widerrufsformular']['name']);
+					$this->addBackendMessage(__('Widerrufsformular erfolgreich hochgeladen.', 'wpsg'));
+				
+					$this->shop->update_option('wpsg_revocationform', $_FILES['wpsg_widerrufsformular']['name']);
+					
+				}
+				
+				$this->shop->update_option('wpsg_widerrufsformular_kundenmail', $_REQUEST['wpsg_widerrufsformular_kundenmail']);
+				
 				if ($this->shop->hasMod('wpsg_mod_rechnungen'))
 				{
-
-				    $this->shop->update_option('wpsg_widerrufsformular_invoice', $_REQUEST['wpsg_widerrufsformular_invoice'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-				}
-
+					
+					$this->shop->update_option('wpsg_widerrufsformular_invoice', $_REQUEST['wpsg_widerrufsformular_invoice']);
+					
+				}
+				
 				if ($this->shop->hasMod('wpsg_mod_auftragsbestaetigung'))
 				{
-
-				    $this->shop->update_option('wpsg_widerrufsformular_orderconfirm', $_REQUEST['wpsg_widerrufsformular_orderconfirm'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-				}
-
-				if (!$this->shop->hasBackendError()) $this->shop->addBackendMessage(__('Widerruf erfolgreich gespeichert.', 'wpsg'));
-				
+					
+					$this->shop->update_option('wpsg_widerrufsformular_orderconfirm', $_REQUEST['wpsg_widerrufsformular_orderconfirm']);
+					
+				}
+								
+				$this->addBackendMessage(__('Widerruf erfolgreich gespeichert.', 'wpsg'));
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung');
-
-			}
-
-			if (wpsg_isSizedString($_REQUEST['do']) && $_REQUEST['do'] == 'generateWiderrufsformular') {
-				
-				check_admin_referer('wpsg-admin-widerrufsbelehrung-generate');
-				
+				
+			}
+			
+			if (wpsg_isSizedString($_REQUEST['do']) && $_REQUEST['do'] == 'generateWiderrufsformular')
+			{
+
 				if (!file_exists(WPSG_PATH_UPLOADS.'wpsg_revocation/')) mkdir(WPSG_PATH_UPLOADS.'wpsg_revocation/', 0775, true);
-
+				
 				$this->clearRevocationForm();
-
-				$this->shop->view['filename'] = WPSG_PATH_UPLOADS.'wpsg_revocation/widerrufsformular.pdf';
+				
+				$this->shop->view['filename'] = WPSG_PATH_UPLOADS.'wpsg_revocation/widerrufsformular.pdf';				
 				$this->shop->render(WPSG_PATH_VIEW.'/admin/musterwiderruf.pdf.phtml');
-
+				
 				$this->shop->update_option('wpsg_revocationform', 'widerrufsformular.pdf');
-
-				$this->addBackendMessage(__('Widerrufsformular erfolgreich generiert.', 'wpsg'));
+				
+				$this->addBackendMessage(__('Widerrufsformular erfolgreich generiert.', 'wpsg'));				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung');
-
-			}
-			else if (wpsg_isSizedString($_REQUEST['do']) && $_REQUEST['do'] == 'removeWiderrufsformular') {
-				
-				check_admin_referer('wpsg-admin-widerrufsbelehrung-delete');
-
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['do']) && $_REQUEST['do'] == 'removeWiderrufsformular')				
+			{
+				
 				$bOK = unlink(WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform'));
-
+				
 				if ($bOK === true)
 				{
-
+				
 					$this->shop->update_option('wpsg_revocationform', false);
-
+				
 					$this->addBackendMessage(__('Widerrufsformular erfolgreich gelÃ¶scht.', 'wpsg'));
-
+										
 				}
 				else
 				{
-
-					$this->addBackendError(__('Widerrufsformular konnte nicht gelÃ¶scht werden.', 'wpsg'));
-
-				}
-
+					
+					$this->addBackendError(__('Widerrufsformular konnte nicht gelÃ¶scht werden.', 'wpsg')); 
+			
+				}
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung');
-
-			}
-
+				
+			}
+									
 			$revocationform = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform');
-
+			
 			if (file_exists($revocationform) && is_file($revocationform))
 			{
-
+				
 				$this->shop->view['revocationform'] = basename($revocationform);
-
-			}
-
+				
+			}
+			
 		} // public function widerrufsbelehrungAction()
-
+		
 		private function clearRevocationForm()
 		{
-
+			
 			$bOK = @unlink(WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform'));
 			$this->shop->update_option('wpsg_revocationform', false);
-
+			
 		} // private function clearRevocationForm()
-
+		
 		/**
 		 * Zeigt die News im Backend an
@@ -2034,31 +1409,36 @@
 		public function newsAction()
 		{
-
-			if (wpsg_isSizedInt($_REQUEST['reload'])) {
- 
+			
+			if (wpsg_isSizedInt($_REQUEST['reload']))
+			{
+				
 				wpsg_news::getLatestNewsFromRSS();
-				
-				$this->shop->addBackendMessage(__('Refresh der News erfolgreich durchgefÃŒhrt.', 'wpsg'));
+				 
+				$this->shop->addBackendMessage(__('Refresh der News erfolgreich durchgefÃŒhrt.', 'wpsg'));								
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=news');
 				
-			} else if (wpsg_isSizedString($_REQUEST['read'])) {
-
+			}
+			else if (wpsg_isSizedString($_REQUEST['read']))
+			{
+				
 				$news = wpsg_news::getNewsById(rawurldecode($_REQUEST['read']));
-
-				if ($news === false) {
-
+				
+				if ($news === false)
+				{
+					
 					$this->shop->addBackendError(__('News wurde nicht gefunden,', 'wpsg'));
 					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=news');
-
-				} else {
-
+					
+				}
+				else
+				{
+				
 					wpsg_news::markRead($_REQUEST['read']);
-					
 					$this->shop->redirect($news['url']);
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 			$this->shop->view = array(
 				'actionName' => 'news',
@@ -2066,9 +1446,9 @@
 				'news' => wpsg_news::getLatestNews()
 			);
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
-
+			
 		} // public function newsAction()
-
+		
 		/**
 		 * Zeigt Informationen zu dem Shop und aktivierten Modulen an
@@ -2076,25 +1456,14 @@
 		public function ueberAction()
 		{
-
-            if (wpsg_isSizedString($_REQUEST['subaction'], 'clearSysLog'))
-            {
-
-                @unlink($GLOBALS['wpsg_sc']->getStorageRoot().'exception.log');
-
-                $this->addBackendMessage(__('Fehlerprotokoll gelÃ¶scht.', 'wpsg'));
-
-                $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=systemlog');
-
-            }
-
+			
 			$this->shop->view = array(
 				'actionName' => 'ueber',
 				'subTemplate' => WPSG_PATH_VIEW.'/admin/ueber.phtml'
 			);
-
+				
 			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
-
+			
 		} // public function ueberAction()
-
+		
 		/**
 		 * Erweiterte Einstellungen
@@ -2102,15 +1471,15 @@
 		public function extendedAction()
 		{
-
+			
 			$this->shop->view['arGeoMode'] = array('0' => __('Immer anzeigen', 'wpsg'));
-
+			
 			if (isset($_SERVER['GEOIP_COUNTRY_CODE'])) $this->shop->view['arGeoMode'][1] = __('Anhand des Apache Moduls mod_geoip', 'wpsg');
 			if (function_exists("geoip_country_code_by_name")) $this->shop->view['arGeoMode'][2] = __('Anhand der PECL Erweiterung php_geoip', 'wpsg');
-
+									
 			$this->shop->view['arGeoMode'][3] = __('Anhand der Browsersprache', 'wpsg');
-			$this->shop->view['arGeoMode'][4] = __('nicht anzeigen', 'wpsg');
-
+			$this->shop->view['aRGeoMode'][4] = __('nicht anzeigen', 'wpsg');
+			
 		} // public function extendedAction()
-
+		
 		/**
 		 * Wird beim absenden des Formulars aufgerufen
@@ -2118,136 +1487,92 @@
 		public function submitAction()
 		{
-
+			
 			global $wpdb;
-
-			if (@$_REQUEST['subaction'] == 'konfiguration') {
-
-                \check_admin_referer('wpsg-save-config');
-			    
-				$this->update_option('wpsg_currency', $_REQUEST['wpsg_currency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				$this->update_option('wpsg_produkte_perpage', $_REQUEST['wpsg_produkte_perpage'], false, false, WPSG_SANITIZE_INT);
-				$this->update_option('wpsg_order_perpage', $_REQUEST['wpsg_order_perpage'], false, false, WPSG_SANITIZE_INT);
-				$this->update_option('wpsg_showincompleteorder', $_REQUEST['wpsg_showincompleteorder'], false, false, WPSG_SANITIZE_CHECKBOX);		
-				$this->update_option('wpsg_showvalueofgoods', $_REQUEST['wpsg_showvalueofgoods'], false, false, WPSG_SANITIZE_CHECKBOX);	
-				$this->update_option('wpsg_emptyorder_clear', $_REQUEST['wpsg_emptyorder_clear'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_afterinsert', $_REQUEST['wpsg_afterinsert'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2', '3']);
-				$this->update_option('wpsg_afterorder', $_REQUEST['wpsg_afterorder'], false, false, WPSG_SANITIZE_VALUES, ['0', '1']);
-				$this->update_option('wpsg_format_knr', $_REQUEST['wpsg_format_knr'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				$this->update_option('wpsg_order_knr', $_REQUEST['wpsg_order_knr'], false, false, WPSG_SANITIZE_VALUES, ['0', '1']);
-				$this->update_option('wpsg_customer_start', $_REQUEST['wpsg_customer_start'], false, false, WPSG_SANITIZE_INT);
-				$this->update_option('wpsg_format_onr', $_REQUEST['wpsg_format_onr'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				$this->update_option('wpsg_order_start', $_REQUEST['wpsg_order_start'], false, false, WPSG_SANITIZE_INT);
-				$this->update_option('wpsg_skip_checkout2', $_REQUEST['wpsg_skip_checkout2'], false, false, WPSG_SANITIZE_CHECKBOX);
-				
-				if (wpsg_isSizedString($_REQUEST['wpsg_backend_language'])) {
-					
-					$arLang = $this->shop->getStoreLanguages();
-					$arLangKey = [];
-					
-					if (wpsg_isSizedArray($arLang)) {
-						
-						foreach ($arLang as $lang) {
-							
-							$arLangKey[] = $lang['lang'];
-							
-						}
-						
-					}
-					
-					$this->update_option('wpsg_backend_language', $_REQUEST['wpsg_backend_language'], false, false,WPSG_SANITIZE_VALUES, $arLangKey);
-					
-				}
-
+			
+			if (@$_REQUEST['subaction'] == 'konfiguration')
+			{
+				
+				$this->update_option('wpsg_currency', $_REQUEST['wpsg_currency']);
+				$this->update_option('wpsg_showincompleteorder', $_REQUEST['wpsg_showincompleteorder']);
+				$this->update_option('wpsg_produkte_perpage', $_REQUEST['wpsg_produkte_perpage']);				
+				$this->update_option('wpsg_emptyorder_clear', $_REQUEST['wpsg_emptyorder_clear']);
+				$this->update_option('wpsg_order_perpage', $_REQUEST['wpsg_order_perpage']);
+				$this->update_option('wpsg_skip_checkout2', $_REQUEST['wpsg_skip_checkout2']);
+				$this->update_option('wpsg_afterinsert', $_REQUEST['wpsg_afterinsert']);
+				$this->update_option('wpsg_afterorder', $_REQUEST['wpsg_afterorder']);
+				$this->update_option('wpsg_format_knr', $_REQUEST['wpsg_format_knr']);
+				$this->update_option('wpsg_order_knr', $_REQUEST['wpsg_order_knr']);
+				$this->update_option('wpsg_customer_start', $_REQUEST['wpsg_customer_start']);			
+				$this->update_option('wpsg_format_onr', $_REQUEST['wpsg_format_onr']);
+				$this->update_option('wpsg_order_start', $_REQUEST['wpsg_order_start']);
+				
+				if (wpsg_isSizedString($_REQUEST['wpsg_backend_language']))
+				{
+					$this->update_option('wpsg_backend_language', $_REQUEST['wpsg_backend_language']);
+				}
+				
 				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
-
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin');
-
-			} else if (@$_REQUEST['subaction'] == "dataprotection") {
-				
-				check_admin_referer('wpsg-admin-dataprotection');
-				
-				$this->update_option('dataprotectioncommissioner', $_REQUEST['dataprotectioncommissioner'], false, false, WPSG_SANITIZE_CHECKBOX);
-				
-				if (wpsg_isSizedInt($_REQUEST['dataprotectioncommissioner'], 1)) {
-					
-					$this->update_option('dataprotectioncommissioner_name', $_REQUEST['dataprotectioncommissioner_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-					$this->update_option('dataprotectioncommissioner_tel', $_REQUEST['dataprotectioncommissioner_tel'], false, false, WPSG_SANITIZE_TEXTFIELD);
-					$this->update_option('dataprotectioncommissioner_email', $_REQUEST['dataprotectioncommissioner_email'], false, false, WPSG_SANITIZE_EMAIL);	
-					
-				}
-				
-				$this->update_option('wpsg_customerdatadelete', $_REQUEST['wpsg_customerdatadelete'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				$this->update_option('wpsg_customerdatadelete_unit', $_REQUEST['wpsg_customerdatadelete_unit'], false, false, WPSG_SANITIZE_VALUES, [0, 1, 2]);
-				$this->update_option('wpsg_customerdatedelete_who', $_REQUEST['wpsg_customerdatedelete_who'], false, false, WPSG_SANITIZE_VALUES, [0, 1]);
-								
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'extended')
+			{
+				
+				$this->update_option('wpsg_salt', $_REQUEST['wpsg_salt']);
+				$this->update_option('wpsg_options_nl2br', $_REQUEST['wpsg_options_nl2br']);
+				$this->update_option('wpsg_debugModus', $_REQUEST['wpsg_debugModus']);
+				
+				if ($this->shop->hasMod('wpsg_mod_core')) $this->update_option('wpsg_debugURL', $_REQUEST['wpsg_debugURL']);
+				
+				$this->update_option('wpsg_referer_requesturi', $_REQUEST['wpsg_referer_requesturi']);
+				$this->update_option('wpsg_ignoreuserview', $_REQUEST['wpsg_ignoreuserview']);
+				$this->update_option('wpsg_classicupload', $_REQUEST['wpsg_classicupload']);
+				$this->update_option('wpsg_content_filter_direct', $_REQUEST['wpsg_content_filter_direct']);
+				$this->update_option('wpsg_options_no_rte_apply_filter', $_REQUEST['wpsg_options_no_rte_apply_filter']);
+				$this->update_option('wpsg_options_nl2br_out', $_REQUEST['wpsg_options_nl2br_out']);
+				$this->update_option('wpsg_impexp_clearlinebreak', $_REQUEST['wpsg_impexp_clearlinebreak']);
+				$this->update_option('wpsg_removeWpAutoOp', $_REQUEST['wpsg_removeWpAutoOp']);
+				$this->update_option('wpsg_removeWpTrimExcerpt', $_REQUEST['wpsg_removeWpTrimExcerpt']);
+				$this->update_option('wpsg_autoraw', $_REQUEST['wpsg_autoraw']);
+				$this->update_option('wpsg_nocache', $_REQUEST['wpsg_nocache']);
+				$this->update_option('wpsg_autolineending', $_REQUEST['wpsg_autolineending']);
+				$this->update_option('wpsg_geo_determination', $_REQUEST['wpsg_geo_determination']);
+				
 				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
 				
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=dataprotection');
-				
-			} else if (@$_REQUEST['subaction'] == 'extended') {
-				
-				\check_admin_referer('wpsg-save-admin-extended');
-
-			    $this->update_option('wpsg_salt', $_REQUEST['wpsg_salt'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				$this->update_option('wpsg_options_nl2br', $_REQUEST['wpsg_options_nl2br'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_debugModus', $_REQUEST['wpsg_debugModus'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_debugLog', $_REQUEST['wpsg_debugLog'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_displayTemplates', $_REQUEST['wpsg_displayTemplates'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_displayTemplatesLog', $_REQUEST['wpsg_displayTemplatesLog'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-				$this->update_option('wpsg_referer_requesturi', $_REQUEST['wpsg_referer_requesturi'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_ignoreuserview', $_REQUEST['wpsg_ignoreuserview'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_classicupload', $_REQUEST['wpsg_classicupload'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_content_filter_direct', $_REQUEST['wpsg_content_filter_direct'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_options_no_rte_apply_filter', $_REQUEST['wpsg_options_no_rte_apply_filter'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_options_nl2br_out', $_REQUEST['wpsg_options_nl2br_out'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_impexp_clearlinebreak', $_REQUEST['wpsg_impexp_clearlinebreak'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_removeWpAutoOp', $_REQUEST['wpsg_removeWpAutoOp'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_removeWpTrimExcerpt', $_REQUEST['wpsg_removeWpTrimExcerpt'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_lockOrderTables', $_REQUEST['wpsg_lockOrderTables'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_autoraw', $_REQUEST['wpsg_autoraw'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_nocache', $_REQUEST['wpsg_nocache'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_autolineending', $_REQUEST['wpsg_autolineending'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_dontcopymedia', $_REQUEST['wpsg_dontcopymedia'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_switchtolowestshippingafterproductremove', $_REQUEST['wpsg_switchtolowestshippingafterproductremove'], false, false, WPSG_SANITIZE_CHECKBOX);
-                $this->update_option('wpsg_save_order_after_mail', $_REQUEST['wpsg_save_order_after_mail'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_geo_determination', $_REQUEST['wpsg_geo_determination'], false, false, WPSG_SANITIZE_VALUES, [0, 3, 4]);
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=extended');
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'presentation')
+			{
+				
+				$this->update_option('wpsg_showMwstAlways', $_REQUEST['wpsg_showMwstAlways']);
+				$this->update_option('wpsg_form_validation', $_REQUEST['wpsg_form_validation']);
+				$this->update_option('wpsg_showArticelnumber', $_REQUEST['wpsg_showArticelnumber']);
+				$this->update_option('wpsg_hideBasketCountrySelect', $_REQUEST['wpsg_hideBasketCountrySelect']);
+				
+				$this->shop->callMods('admin_presentation_submit');				
 				
 				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
-
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=extended');
-
-			} else if (@$_REQUEST['subaction'] == 'presentation') {
-				
-				\check_admin_referer('wpsg-save-admin-presentation');
-				
-			    $this->update_option('wpsg_imagehandler_basketimage', $_REQUEST['wpsg_imagehandler_basketimage'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_imagehandler_overviewimage', $_REQUEST['wpsg_imagehandler_overviewimage'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_showMwstAlways', $_REQUEST['wpsg_showMwstAlways'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_form_validation', $_REQUEST['wpsg_form_validation'], false, false, WPSG_SANITIZE_VALUES, [0, 1, 2]);
-				$this->update_option('wpsg_showArticelnumber', $_REQUEST['wpsg_showArticelnumber'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_hideBasketCountrySelect', $_REQUEST['wpsg_hideBasketCountrySelect'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_alternativeProductDetailDesign', $_REQUEST['wpsg_alternativeProductDetailDesign'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_alternativeOrderDesign', $_REQUEST['wpsg_alternativeOrderDesign'], false, false, WPSG_SANITIZE_CHECKBOX);
-								
-				$this->shop->callMods('admin_presentation_submit');
-
+				
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=presentation');
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'path')
+			{
+				
+				$this->shop->update_option('wpsg_path_upload_multiblog', $_REQUEST['wpsg_path_upload_multiblog'], true);
+				
 				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
-
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=presentation');
-
-			} else if (@$_REQUEST['subaction'] == 'path') {
-
-				$this->shop->update_option('wpsg_path_upload_multiblog', $_REQUEST['wpsg_path_upload_multiblog'], true);
-
-				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
-
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=path');
-
-			} else if (@$_REQUEST['subaction'] == 'loadsavesettings') {
-								
-				if (isset($_REQUEST['wpsg_do']) && $_REQUEST['wpsg_do'] == 'downloadsettings') {
-					
-					\check_admin_referer('wpsg-save-admin-loadsavesettings-download');
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'loadsavesettings')
+			{
+				
+				if (isset($_REQUEST['wpsg_do']) && $_REQUEST['wpsg_do'] == 'downloadsettings')
+				{
 					
 					$arSettings = $this->db->fetchAssoc("
@@ -2258,23 +1583,23 @@
 						WHERE
 							(
-								`option_name` LIKE 'wpsg_%'
-							)
+								`option_name` LIKE 'wpsg_%' 
+							) 
 							AND
 							(
 								`option_name` != 'wpsg_installed' AND
-								`option_name` != 'wpsg_modul'
+								`option_name` != 'wpsg_modul' 							
 							)
-					");
-
+					"); 
+					
 					$doc = new DOMDocument('1.0');
 					$doc->formatOutput = true;
 					$doc->encoding = "utf-8";
-
-					$node = $doc->createElement("wpsg");
-
-					$settings = $doc->createElement("settings");
+					
+					$node = $doc->createElement("wpsg");  
+					
+					$settings = $doc->createElement("settings");				
 					foreach ($arSettings as $s)
 					{
-
+						
 						$setting = $doc->createElement("option");
 						wpsg_addAttributs($doc, $setting, array(
@@ -2286,301 +1611,248 @@
 						));
 						$settings->appendChild($setting);
-
-					}
-
+						
+					}
+					
 					$node->appendChild($settings);
 					$doc->appendChild($node);
-
+					
 					header('Cache-Control: private');
 					header('Content-Type: application/download; charset=utf-8');
-					header('Content-Disposition: filename=wpsg_settings_'.date('dmYHi').'.xml');
+					header('Content-Disposition: filename=wpsg_settings_'.date('dmYHi').'.xml');	
 					header('Pragma: public');
-
+					
 					session_cache_limiter('nocache');
-
+					
 					die($doc->saveXML());
-
-				}
-				
-				\check_admin_referer('wpsg-save-admin-loadsavesettings');
-
-				if (wpsg_isSizedString($_FILES['wpsg_settings']['tmp_name'])) {
-										
-					if (file_exists($_FILES['wpsg_settings']['tmp_name'])) {
-
-						$xml = simplexml_load_file($_FILES['wpsg_settings']['tmp_name']);
-	
-						if ($xml === false)
-						{
-	
-							$this->shop->addBackendError(__('Keine gÃŒltige XML Einstellungsdatei angegeben!', 'wpsg'));
-	
-						}
-						else
-						{
-	
-							$path ="/wpsg/settings/option";
-							$res = $xml->xpath($path);
-	
-							foreach ($res as $k => $v)
-							{
-	
-								$a = $v->attributes();
-	
-								$bExists = $this->db->fetchOne("SELECT `option_id` FROM `".$wpdb->prefix."options` WHERE `option_name` = '".wpsg_q(strval($a->option_name))."' ");
-
-								$option_name = $a->option_name;
-								$option_value = $a->option_value;
-
-								// Wenn eine Seite importiert wird,
-								if (strpos($option_name, "wpsg_page") !== false && wpsg_isSizedInt($option_value)) {
-
-									// welche in der momentanen Instanz nicht existiert
-									if (!get_post_status($option_value)) {
-	
-										$this->shop->addBackendError(wpsg_translate(__('Die importierte Seite mit der ID #1# ist noch nicht angelegt worden. Daher wird sie auf "Keine Zuordnung" gestellt.', "wpng"), wpsg_q(strval($a->option_value))));
-										$a->option_value = 0;
-	
-	
-									}
-	
-								}
-	
-								if ($bExists > 0)
-								{
-	
-									$this->db->UpdateQuery($wpdb->prefix."options", array(
-										"option_value" => wpsg_q(strval($a->option_value))
-									), "`option_name` = '".wpsg_q(strval($a->option_name))."'");
-	
-								}
-								else
-								{
-	
-									$this->db->ImportQuery($wpdb->prefix."options", array(
-										"blog_id" => wpsg_q(strval($a->blog_id)),
-										"option_name" => wpsg_q(strval($a->option_name)),
-										"option_value" => wpsg_q(strval($a->option_value)),
-										"autoload" => wpsg_q(strval($a->autoload))
-									), true);
-	
-								}
-	
-							}
-	
-							$this->shop->addBackendMessage(__('Einstellungen wurden erfolgreich importiert.', 'wpsg'));
-	
-						}
-	
+				
+				}
+
+				if (file_exists($_FILES['wpsg_settings']['tmp_name']))
+				{
+					
+					$xml = simplexml_load_file($_FILES['wpsg_settings']['tmp_name']);			        	
+		        	
+					if ($xml === false)
+					{
+						
+						$this->shop->addBackendError(__('Keine gÃŒltige XML Einstellungsdatei angegeben!', 'wpsg'));
+						
 					}
 					else
 					{
-	
-						$this->shop->addBackendError(__('Bitte eine Einstellungsdatei angeben!', 'wpsg'));
-	
-					}
-					
-				}
+					
+						$path ="/wpsg/settings/option";			        	
+			        	$res = $xml->xpath($path);
+			        	
+			        	foreach ($res as $k => $v)
+			        	{
+			        		
+			        		$a = $v->attributes();
+			        		
+			        		$bExists = $this->db->fetchOne("SELECT `option_id` FROM `".$wpdb->prefix."options` WHERE `option_name` = '".wpsg_q(strval($a->option_name))."' ");
+			        		
+			        		if ($bExists > 0)
+			        		{
+			        		 
+			        			$this->db->UpdateQuery($wpdb->prefix."options", array(
+			        				"option_value" => wpsg_q(strval($a->option_value))
+			        			), "`option_name` = '".wpsg_q(strval($a->option_name))."'"); 
+			        			
+			        		}
+			        		else
+			        		{
+			        	 
+			        			$this->db->ImportQuery($wpdb->prefix."options", array(
+			        				"blog_id" => wpsg_q(strval($a->blog_id)),			        				
+			        				"option_name" => wpsg_q(strval($a->option_name)),
+			        				"option_value" => wpsg_q(strval($a->option_value)),
+			        				"autoload" => wpsg_q(strval($a->autoload))			        				
+			        			), true);
+			        			
+			        		} 
+			        		
+			        	}
+			        	
+			        	$this->shop->addBackendMessage(__('Einstellungen wurden erfolgreich importiert.', 'wpsg'));
+			        	
+					}
+					
+				}
+				else
+				{
+
+					$this->shop->addBackendError(__('Bitte eine Einstellungsdatei angeben!', 'wpsg'));
+					
+				}	
 
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=loadsavesettings');
-
-			} else if (@$_REQUEST['subaction'] == 'includes') {
-
-				check_admin_referer('wpsg-admin-includes');
-				
-			    $this->update_option('wpsg_load_css', $_REQUEST['wpsg_load_css'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_load_jquery', $_REQUEST['wpsg_load_jquery'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_load_fslightbox_js', $_REQUEST['wpsg_load_fslightbox_js'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_load_thickbox', $_REQUEST['wpsg_load_thickbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_load_validierung_js', $_REQUEST['wpsg_load_validierung_js'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_load_validierung_css', $_REQUEST['wpsg_load_validierung_css'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_load_bootstrap_glyphfont_css', $_REQUEST['wpsg_load_bootstrap_glyphfont_css'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'includes')
+			{ 
+				
+				$this->update_option('wpsg_load_css', $_REQUEST['wpsg_load_css']);
+				$this->update_option('wpsg_load_jquery', $_REQUEST['wpsg_load_jquery']);
+				$this->update_option('wpsg_load_thickbox_js', $_REQUEST['wpsg_load_thickbox_js']);
+				$this->update_option('wpsg_load_thickbox_css', $_REQUEST['wpsg_load_thickbox_css']);
+				$this->update_option('wpsg_load_validierung_js', $_REQUEST['wpsg_load_validierung_js']);
+				$this->update_option('wpsg_load_validierung_css', $_REQUEST['wpsg_load_validierung_css']);
+				
 				$this->shop->callMods('admin_includes_save');
-
+				
 				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
-
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=includes');
-
-			} else if (@$_REQUEST['subaction'] == 'blognetzwerk') {
-
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'blognetzwerk')
+			{
+				
 				$this->update_option('wpsg_multiblog_standalone', $_REQUEST['wpsg_multiblog_standalone'], true);
 				$this->update_option('wpsg_multiblog_sessionPath', $_REQUEST['wpsg_multiblog_sessionPath'], true);
-
+								
 				$this->addBackendMessage(__('Einstellungen gespeichert.', 'wpsg'));
-
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=blognetzwerk');
-
-			} else if (@$_REQUEST['subaction'] == 'kalkulation') {
-				
-				check_admin_referer('wpsg-admin-kalkulation');
-
-			    $this->update_option('wpsg_kleinunternehmer', $_REQUEST['wpsg_kleinunternehmer'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->update_option('wpsg_kleinunternehmer_text', $_REQUEST['wpsg_kleinunternehmer_text'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			    $this->update_option('wpsg_preisangaben', $_REQUEST['wpsg_preisangaben'], false, false, WPSG_SANITIZE_VALUES, ['1', '0']);
-			    $this->update_option('wpsg_preisangaben_frontend', $_REQUEST['wpsg_preisangaben_frontend'], false, false, WPSG_SANITIZE_VALUES, ['1', '0']);
-				$this->update_option('wpsg_hideemptyshipping', $_REQUEST['wpsg_hideemptyshipping'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_hideemptypayment', $_REQUEST['wpsg_hideemptypayment'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_noroundamount', $_REQUEST['wpsg_noroundamount'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->update_option('wpsg_deliverycountrytax', $_REQUEST['wpsg_deliverycountrytax'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'kalkulation')
+			{
+				
+				$this->update_option('wpsg_kleinunternehmer', $_REQUEST['wpsg_kleinunternehmer']);
+				$this->update_option('wpsg_kleinunternehmer_text', $_REQUEST['wpsg_kleinunternehmer_text']);
+				$this->update_option('wpsg_preisangaben', $_REQUEST['wpsg_preisangaben']);
+				$this->update_option('wpsg_preisangaben_frontend', $_REQUEST['wpsg_preisangaben_frontend']);				
+				$this->update_option('wpsg_hideemptyshipping', $_REQUEST['wpsg_hideemptyshipping']);
+				$this->update_option('wpsg_hideemptypayment', $_REQUEST['wpsg_hideemptypayment']);
+								
 				$this->addBackendMessage(__('Einstellung gespeichert.', 'wpsg'));
-
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction='.$_REQUEST['subaction']);
-
-			} else if (@$_REQUEST['subaction'] == 'access') {
-				
-				check_admin_referer('wpsg-admin-access');
-
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'access')
+			{
+				
 				$this->addBackendMessage(__('Berechtigungen gespeichert.', 'wpsg'));
-
+				
 				if (wpsg_isSizedArray($_REQUEST['wpsg_cap']))
 				{
-					 
-					// Sanitization
-					foreach ($_REQUEST['wpsg_cap'] as $k => $v) {
-						
-						foreach ($v as $_k => $_v) {
+					
+					foreach ($_REQUEST['wpsg_cap'] as $role_name => $cap)
+					{
+						 
+						$role_object = get_role($role_name);
 												
-							if (
-								!wpsg_checkInput($_v, WPSG_SANITIZE_CHECKBOX) ||
-								!wpsg_checkInput($_k, WPSG_SANITIZE_TEXTFIELD)
-							) {
-								
-								$this->shop->addBackendMessage(__('Bitte ÃŒberprÃŒfen sie die Formulareingaben.', 'wpsg'));
-								
-								unset($_REQUEST['wpsg_cap'][$k][$_k]);
-								
-							}  
-														
-						}
-						
-					}
-
-					// Applying Settings
-					foreach ($_REQUEST['wpsg_cap'] as $role_name => $cap)
-					{
-
-						$role_object = get_role($role_name);
-
 						foreach ($cap as $cap_key => $cap_value)
 						{
-
+							
 							if ($cap_value == '1')
 							{
-
+								
 								$role_object->add_cap($cap_key);
-
+								
 							}
 							else
 							{
-
+								
 								$role_object->remove_cap($cap_key);
-
+								
 							}
-
+							
 						}
-
-					}
-
-				}
-
+						
+					}
+					
+				}
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction='.$_REQUEST['subaction']);
-
-			} else if (@$_REQUEST['subaction'] == 'seiten') {
-
-				check_admin_referer('wpsg-admin-seiten');
+				
+			}
+			else if (@$_REQUEST['subaction'] == 'seiten')
+			{
 				
 				// Seiten speichern
-				$this->createPage(__('Anfrageliste', 'wpsg'), 'wpsg_page_request', $_REQUEST['wpsg_page_request']);
-				$this->createPage(__('Warenkorb', 'wpsg'), 'wpsg_page_basket', $_REQUEST['wpsg_page_basket']);
-				$this->createPage(__('Weiter shoppen', 'wpsg'), 'wpsg_page_basket_more', $_REQUEST['wpsg_page_basket_more']);
+				$this->createPage(__('Warenkorb', 'wpsg'), 'wpsg_page_basket', $_REQUEST['wpsg_page_basket']);				
 				$this->createPage(__('Versandkosten', 'wpsg'), 'wpsg_page_versand', $_REQUEST['wpsg_page_versand']);
-				$this->createPage(__('Produktdetail', 'wpsg'), 'wpsg_page_product', $_REQUEST['wpsg_page_product']);
 				$this->createPage(__('AGB', 'wpsg'), 'wpsg_page_agb', $_REQUEST['wpsg_page_agb']);
 				$this->createPage(__('Datenschutz', 'wpsg'), 'wpsg_page_datenschutz', $_REQUEST['wpsg_page_datenschutz']);
-				$this->createPage(__('Widerrufsbelehrung', 'wpsg'), 'wpsg_page_widerrufsbelehrung', $_REQUEST['wpsg_page_widerrufsbelehrung']);
+				$this->createPage(__('Widerrufsbelehrung', 'wpsg'), 'wpsg_page_widerrufsbelehrung', $_REQUEST['wpsg_page_widerrufsbelehrung']);				
+				$this->update_option('wpsg_page_onlinedisputeresolution', $_REQUEST['wpsg_page_onlinedisputeresolution']);
 				$this->createPage(__('Impressum', 'wpsg'), 'wpsg_page_impressum', $_REQUEST['wpsg_page_impressum']);
 				
-				//$this->update_option('wpsg_page_onlinedisputeresolution', $_REQUEST['wpsg_page_onlinedisputeresolution'], false, false, "key");
-				
 				$this->addBackendMessage(__('Seiteneinstellungen bearbeitet.', 'wpsg'));
-
+				
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction='.$_REQUEST['subaction']);
-
-			} else if (@$_REQUEST['action'] == 'module') {
-
+				
+			}
+			else if (@$_REQUEST['action'] == 'module')
+			{
+			 
 				$global = false;
 				if ($this->shop->isMultiBlog() && $this->shop->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
-
-				if (!wpsg_checkInput($_REQUEST['aktiv'], WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
 				
 				if ($this->get_option($_REQUEST['modul'], $global) > 0 && $_REQUEST['aktiv'] == '1' && array_key_exists($_REQUEST['modul'], $this->shop->arModule))
 				{
-
-					\check_admin_referer('wpsg-admin-submit-module-'.$_REQUEST['modul']);
-
+					
 					$this->shop->arModule[$_REQUEST['modul']]->settings_save();
-
+					
 					$this->shop->addBackendMessage(__('Moduleinstellungen gespeichert', 'wpsg'));
-
-				}
-
+					
+				}
+				
+				
 				// Modul aktivieren wenn noch nicht aktiviert
-				if ($_REQUEST['aktiv'] == '1' && $this->get_option($_REQUEST['modul'], $global) == false) {
+				if ($_REQUEST['aktiv'] == '1' && $this->get_option($_REQUEST['modul'], $global) == false)				
+				{	
+					
+					$init = base64_decode('aW5zdGFsbEZpcnN0'); //installFirst;
+					
+					$this->update_option($_REQUEST['modul'], time(), $global);
+					$this->shop->arAllModule[$_REQUEST['modul']]->$init();
+					$this->shop->arAllModule[$_REQUEST['modul']]->install();	
+									
+				}
+				else if ($_REQUEST['aktiv'] == '0')
+				{
+					
+					$this->update_option($_REQUEST['modul'], false, $global);
+					
+				}
  
-					$this->update_option($_REQUEST['modul'], time(), $global);
-					$this->shop->arAllModule[$_REQUEST['modul']]->installFirst();
-					$this->shop->arAllModule[$_REQUEST['modul']]->install();
-
-					// Ticket #637 (Automatisch Admin Rechte bei Aktivierung eines Moduls erteilen)
-					$role_object = get_role("administrator");
-					$role_object->add_cap("administrator");
-					
-					$this->shop->addBackendMessage(__('Modul aktiviert.', 'wpsg'));
-
-				}
-				else if ($_REQUEST['aktiv'] == '0')
-				{
-
-					$this->update_option($_REQUEST['modul'], false, $global);
-					
-					$this->shop->addBackendMessage(__('Modul deaktiviert.', 'wpsg'));
-					
-				}
-
 				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul='.$_REQUEST['modul']);
-
-			} else {
-
-				if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'update') {
-					
-					check_admin_referer('wpsg-admin-db-update');
-
+				
+			}
+			else 
+			{
+				
+				if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'update')
+				{
+					
 					wpsg_install();
 					$this->addBackendMessage(__('Datenbank erfolgreich abgeglichen!', 'wpsg'));
-
+					
 					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein');
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 		} // public function submitAction()
-
+		
 		/**
 		 * Soll die Datenbank auf den neuesten Stand bringen
 		 */
 		public function updateAction()
-		{
-
+		{ 
+			
 			include WPSG_PATH.'/lib/install.php';
-
+						
 			$this->shop->callMods('install');
-
+						
 			$this->addBackendMessage(__('Datenbank aktualisiert', 'wpsg'));
-
+			
 		} // public function updateAction()
-
+		
 		/**
 		 * Zeigt die Hilfe fÃŒr den Tooltip an
@@ -2588,36 +1860,34 @@
 		private function loadHelpAction()
 		{
-
+			
 			global $q_config;
-
-			$page = $_REQUEST['field'];
-
+			
+			$page = $_REQUEST['field']; 
+			
 			$xml_content = $this->shop->get_url_content('http://trac.wpshopgermany.de/wiki/'.$page);
 
 			if ($xml_content !== false && strlen(trim($xml_content)) > 0)
 			{
-
+			
 				$doc = new DOMDocument();
 				$doc->loadHTML($xml_content);
-
+				
 				$xpath = new DOMXPath($doc);
 				$entries = $xpath->query('//div[@id="wikipage"]');
-
-				$strReturn = '';
-
+				
 				foreach ($entries as $entry) {
-
+	 
 					$strReturn = $entry->ownerDocument->saveXml($entry);
-
-				}
-
+					 
+				}
+				 
 				$strReturn = preg_replace('/\"\//', '"http://trac.wpshopgermany.de/', $strReturn);
-
-				$arLocales = $arLocales = $q_config['locale']??'';
+				
+				$arLocales = $arLocales = $q_config['locale'];
 				if (wpsg_isSizedArray($arLocales) && wpsg_isSizedString(get_locale()))
 				{
-
+				
 					$iso_lang = array_search(get_locale(), $arLocales);
-
+					
 					if (wpsg_isSizedString($iso_lang) && preg_match('/&lt;localization_'.$iso_lang.'&gt;(.*)&lt;\/localization_'.$iso_lang.'&gt;/is', $strReturn))
 					{
@@ -2625,13 +1895,13 @@
 						$strReturn = preg_replace('/(.*)&lt;localization_'.$iso_lang.'&gt;/is', '', $strReturn);
 						$strReturn = preg_replace('/&lt;\/localization_'.$iso_lang.'&gt;(.*)/is', '', $strReturn);
-
-					}
-
-
-				}
-
+						
+					}
+				
+					
+				}
+				
 				// Andere Ãbersetzungen entfernen
 				$strReturn = preg_replace('/&lt;localization_(.*)&gt;(.*)&lt;\/localization_(.*)&gt;/is', '', $strReturn);
-
+				 
 				//$strReturn .= '<a style="color:#FFFFFF; text-decoration:underline;" target="_blank" href="http://trac.wpshopgermany.de/wiki/'.$page.'">'.__('zur Hilfe Seite ...', 'wpsg').'</a><br /><br />';
 
@@ -2641,11 +1911,11 @@
 
 				$strReturn = __('Noch kein Hilfetext hinterlegt. Bitte versuchen Sie es spÃ€ter noch einmal.<br />Hilfe finden sie auch unter <a href="http://forum.maennchen1.de">http://forum.maennchen1.de</a>', 'wpsg');
-
-			}
-
-			die('<div class="wpsg-help-content">'.$strReturn.'</div>');
-
+				
+			}
+			 
+			die($strReturn);
+			
 		} // private function loadHelpAction()
-
+		
 		/**
 		 * Deaktiviert alle Plugins auÃer wpShopGermany und merkt sich die aktivierten Plugins
@@ -2653,27 +1923,27 @@
 		public function plugintest_disableAction()
 		{
-
+			
 			// Plugins vor dem Test
 			$arPlugins = $this->shop->get_option('active_plugins');
-
+									
 			// Plugins vor dem Test speichern
 			$this->shop->update_option('wpsg_plugintest_active_plugins', $arPlugins);
-
+			
 			// Alle Plugins auÃer wpShopGermany entfernen
 			foreach ($arPlugins as $k => $p)
 			{
-
+				
 				if (!preg_match('/(.*)wpshopgermany\.php(.*)/', $p)) unset($arPlugins[$k]);
-
-			}
-
+				
+			}
+		 
 			// ZurÃŒckspeichern
 			$this->shop->update_option('active_plugins', $arPlugins);
-
+			
 			$this->shop->addBackendMessage(__('Es wurden alle Plugins bis auf wpShopGermany deaktiviert.', 'wpsg'));
 			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber');
-
+						
 		} // public function plugintest_disableAction()
-
+		
 		/**
 		 * Stellt die vorher mittels plugintest_disableAction deaktivierten Module wieder her
@@ -2681,138 +1951,1108 @@
 		public function plugintest_restoreAction()
 		{
-
+			
 			$arPlugins_restore = $this->shop->get_option('wpsg_plugintest_active_plugins');
-
+			
 			if (!wpsg_isSizedArray($arPlugins_restore))
 			{
-
+				
 				$this->shop->addBackendError(__('Plugins konnten nicht wieder hergestellt werden, da nicht gespeichert wurde welche Plugins aktiv waren.', 'wpsg'));
-
+				
 			}
 			else
 			{
-
+								
 				// Alte Plugins wieder herstellen
 				$this->shop->update_option('active_plugins', $arPlugins_restore);
-
+				
 				$this->shop->update_option('wpsg_plugintest_active_plugins', false);
-
+				
 				$this->shop->addBackendMessage(__('Aktivierte Plugins wurden erfolgreich wieder hergesetellt.', 'wpsg'));
-
-			}
-
+				
+			}
+			
 			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber');
-
+			
 		} // public function plugintest_restoreAction()
-
+		
 		/**
 		 * Installiert ein Modul
 		 */
-		public function installModul($modul_key) {
-
-			global $wp_filesystem;
-
-			$temp_name = $this->shop->getTempName($modul_key.'.zip');
-			@unlink($temp_name);
-				
-			$wpsg_update_data = wpsg_get_update_data();
-			
-			if (!isset($wpsg_update_data['modulinfo'][$modul_key]['download_url'])) throw new \wpsg\ModulURLNotFoundException(wpsg_translate(__('URL zu Modul #1# unbekannt', 'wpsg'), $modul_key));
-			
-			$url = $wpsg_update_data['modulinfo'][$modul_key]['download_url'];
+		public function installModul($modul_key)
+		{
+			
+			$this->callMod('wpsg_mod_core', 'installModul', array($modul_key));
+			
+		} // private function installModul($modul_key)
+
+		/**
+		 * Import Funktion fÃŒr die Daten aus Version 2
+		 */
+		private function importV2()
+		{
+
+			global $wpdb;
+
+			error_reporting(E_ERROR); ini_set("display_errors", "1");
+			
+			// Zur Sicherheit ein paar VorabprÃŒfungen
+			//$ProductCount = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS."`");
+			//if ($ProductCount > 0) { $this->addBackendError(__('Bitte lÃ¶schen sie vor dem Import alle Produkte!', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe'); }
+			
+			$nOrderCount = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` ");			
+			if ($nOrderCount > 0) { $this->addBackendError(__('Bitte lÃ¶schen sie vor dem Import alle Bestelldaten!', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe'); }
+			
+			$nCustomerCount = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_KU."` ");			
+			if ($nCustomerCount > 0) { $this->addBackendError(__('Bitte lÃ¶schen sie vor dem Import alle Kundendaten!', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe'); }
+ 
+			if (isset($_REQUEST['submit_import']))
+			{
+
+				$_FILES['datei']['tmp_name'] = WPSG_PATH_CONTENT.'uploads/wpsg_upgrade.zip';
+				
+			}
+			else if (!isset($_REQUEST['submit_import_db']))
+			{
+			
+				if (!file_exists($_FILES['datei']['tmp_name'])) { $this->addBackendError(__('Kein Paket hochgeladen!', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe'); }
+				
+			}
+			
+			// Alte Optionen lÃ¶schen
+			//$this->db->Query("DELETE FROM `wp_options` WHERE `option_name` LIKE 'wpsg_%' AND `option_name` != 'wpsg_key' AND `option_name` != 'wpsg_installed' ");
+			
+			$arTables = $this->db->fetchAssocField("SHOW TABLES");
+			
+			if (in_array(WPSG_TBL_PRODUCTS, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS."`");
+			if (in_array(WPSG_TBL_PRODUCTS_GROUP, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_GROUP."`");
+			if (in_array(WPSG_TBL_ORDER, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_ORDER."`");
+			if (in_array(WPSG_TBL_KU, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_KU."`");
+			if (in_array(WPSG_TBL_VZ, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_VZ."`");
+			if (in_array(WPSG_TBL_LAND, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_LAND."`");
+			if (in_array(WPSG_TBL_AT, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_AT."`");
+			if (in_array(WPSG_TBL_PRODUCTS_AT, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_AT."`");
+			if (in_array(WPSG_TBL_OL, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_OL."`");
+			if (in_array(WPSG_TBL_VA, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_VA."`");			
+			if (in_array(WPSG_TBL_RECHNUNGEN, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_RECHNUNGEN."`");
+			if (in_array(WPSG_TBL_GUTSCHEIN, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_GUTSCHEIN."`");			
+			if (in_array(WPSG_TBL_PRODUCTS_REL, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_REL."`");
+			if (in_array(WPSG_TBL_EXPORTPROFILE, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_EXPORTPROFILE."`");
+			if (in_array(WPSG_TBL_PRODUCTS_VARS, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_VARS."`");
+			if (in_array(WPSG_TBL_PRODUCTS_STICKY, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_STICKY."`");
+			if (in_array(WPSG_TBL_ZV, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_ZV."`");
+			if (in_array(WPSG_TBL_VIDEOINDIV, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_VIDEOINDIV."`");
+			if (in_array(WPSG_TBL_PDFINDIV, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."`");
+			if (in_array(WPSG_TBL_ORDERVARS, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_ORDERVARS."`");
+			if (in_array(WPSG_TBL_ORDERCOND, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_ORDERCOND."`");
+			if (in_array(WPSG_TBL_CABLOG, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_CABLOG."`");			
+			if (in_array(WPSG_TBL_PAP, $arTables)) $this->db->Query("DELETE FROM `".WPSG_TBL_PAP."`");
+			
+			if (!isset($_REQUEST['submit_import_db']))
+			{
+				
+				// Import aus Datei
+				
+				$mb = new wpsg_mod_basic();
+				$path = $mb->getTmpFilePath().'/importV2/';
+				
+				if (file_exists($path)) wpsg_rrmdir($path);
+				mkdir($path, 0777, true); 
+				
+				$zip = new ZipArchive();
+				
+				if ($zip->open($_FILES['datei']['tmp_name']) === true) 
+				{
+	
+					$zip->extractTo($path);
+	    			$zip->close();    			
+					
+				}
+							
+				// Verarbeitung der XML Datei
+				$doc = new DOMDocument;
+				$doc->Load($path.'/data.xml');
+				
+				$xpath = new DOMXPath($doc);
+								
+				// Versionsnummer prÃŒfen
+				$query = "//wpsg/settings/option[@option_name=\"wpshopgermany_version_installed\"]";
+				$version = $xpath->query($query);
+				 
+				$version_node = $version->item(0);
+				$version = $version_node->getAttribute("option_value");
+				
+				if ($version != "2.5.8")
+				{
+					
+					$this->shop->addBackendError(__('Version des Exportes ist nicht kompatibel, bitte importieren Sie nur aus einem wpShopGermany aus der Version 2.5.8.', 'wpsg'));
+					$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe');
+					return false;
+					
+				}
+				
+				$query = "//wpsg/settings/option";
+				$settings = $xpath->query($query);
+				
+			}
+			else
+			{
+				
+				if ($this->shop->isMultiBlog())
+				{
+				
+					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/';
+					
+				}
+				else
+				{
+					
+					$path = WP_CONTENT_DIR.'/uploads/';
+					
+				} 
+				
+			}
+			
+			$arSettingsMap = array(
+
+				/* Allgemein */
+				'wpsg_mwst_anteilig' => false,
+				'wpsg_options_nl2br' => 'wpsg_options_nl2br', 
+				'wpsg_options_rte_apply_filter' => 'wpsg_options_no_rte_apply_filter',
+				'wpsg_order_format' => 'wpsg_format_onr',
+				'wpsg_order_start' => 'wpsg_order_start',
+				'wpsg_upload_classic' => 'wpsg_classicupload',
+			
+				/* Installierte Module */
+				'mod_auftragbest' => 'wpsg_mod_auftragsbestaetigung',				
+				'mod_bankeinzug' => 'wpsg_mod_autodebit',
+				'mod_billsafe' => 'wpsg_mod_billsafe',
+				'mod_cab' => 'wpsg_mod_cab',
+				'mod_customerbudget' => 'wpsg_mod_customerbudget',
+				'mod_nachnahme' => 'wpsg_mod_debitpayment',
+				'mod_rabatt' => 'wpsg_mod_discount',
+				'mod_downloadplus' => 'wpsg_mod_downloadplus',
+				'mod_downloadprodukt' => 'wpsg_mod_downloadprodukt',
+				'mod_exportplus' => 'wpsg_mod_export',
+				'mod_freeshipping' => 'wpsg_mod_freeshipping',
+				'mod_fuellmenge' => 'wpsg_mod_fuellmenge',
+				'mod_gutschein' => 'wpsg_mod_gutschein',
+				'mod_rechnung' => 'wpsg_mod_invoice_type',
+				'mod_kundenkontakt' => 'wpsg_mod_kundenkontakt',
+				'mod_kundenlogin' => 'wpsg_mod_kundenverwaltung',
+				'mod_newsletter' => 'wpsg_mod_nlsatolo',
+				'mod_orderupload' => 'wpsg_mod_orderupload',
+				'mod_bestellvars' => 'wpsg_mod_ordervars',
+				'mod_pap' => 'wpsg_mod_pap',
+				'mod_paypal' => 'wpsg_mod_paypal',
+				'mod_prepayment' => 'wpsg_mod_prepayment',
+				'mod_produktgruppen' => 'wpsg_mod_productgroups',
+				'mod_produktvars' => 'wpsg_mod_productvars',
+				'mod_produktartikel' => 'wpsg_mod_produktartikel',
+				'mod_produktbilder' => 'wpsg_mod_produktbilder',
+				'mod_protectedshops' => 'wpsg_mod_protectedshops',
+				'mod_rechnungen' => 'wpsg_mod_rechnungen',
+				'mod_attribute' => 'wpsg_mod_produktattribute',
+				'mod_shippingadress' => 'wpsg_mod_shippingadress',
+				'mod_skrill' => 'wpsg_mod_skrill',
+				'mod_stock' => 'wpsg_mod_stock',
+				'mod_sb' => 'wpsg_mod_su',
+				'mod_userpayment' => 'wpsg_mod_userpayment',
+				'mod_variantenplus' => 'wpsg_mod_varianten',
+				'mod_lieferanten' => 'wpsg_mod_versandarten',
+				'mod_weight' => 'wpsg_mod_weight',
+				'mod_selbstabholer' => 'wpsg_mod_willcollect',
+			
+				/* wpsg_mod_produktbilder */
+				'wpshopgermany_produktbilder_tnwidth' => 'wpsg_mod_produktbilder_width',
+				'wpshopgermany_produktbilder_tnheight' => 'wpsg_mod_produktbilder_height',
+				'wpshopgermany_produktbilder_quality' => 'wpsg_mod_produktbilder_quality',
+				'wpshopgermany_produktbilder_mode' => 'wpsg_mod_produktbilder_mode',
+				
+				/* wpsg_mod_kundenverwaltung */
+				'wpsg_kundenlogin_salt' => 'wpsg_salt',
+				'wpsg_kundenlogin_anfrage_betreff' => 'wpsg_kundenpwdrequest_betreff',
+				'wpsg_kundenlogin_newpasswort_betreff' => 'wpsg_kundenpwd_betreff',
+				'wpsg_kl_page' => 'wpsg_mod_kundenverwaltung_perpage',  
+				'wpsg_kl_weber' => 'wpsg_mod_kundenverwaltung_aweber',
+				'wpsg_kl_weber_meta_web_form_id' => 'wpsg_mod_kundenverwaltung_aweber_formid',
+				'wpsg_kl_listname' => 'wpsg_mod_kundenverwaltung_aweber_listname',
+				'wpsg_kl_meta_adtracking' => 'wpsg_mod_kundenverwaltung_aweber_metaAdtracking',
+				'wpsg_kundenlogin_profil' => 'wpsg_page_mod_kundenverwaltung_profil',
+				'wpsg_kundenlogin_register' => 'wpsg_page_mod_kundenverwaltung_registrierung',
+				'wpsg_mod_kundenverwaltung_onlylogin' => 'wpsg_mod_kundenverwaltung_onlylogin',
+			
+				/* wpsg_mod_gutschein */
+				'wpshopgermany_gutschein_size' => 'wpsg_mod_gutschein_size',
+			
+				/* wpsg_mod_pap */
+				'wpsg_paplogin_pap_url' => 'wpsg_paplogin_pap_url',
+				'wpsg_paplogin_admin' => 'wpsg_paplogin_admin',
+				'wpsg_paplogin_passwort' => 'wpsg_paplogin_passwort',
+				'wpsg_paplogin_register' => 'wpsg_paplogin_register',
+				'wpsg_pap_registrierung' => 'wpsg_pap_registrierung',
+				'wpsg_pap_include_profil' => false,
+				'wpsg_pap_order_tracking' => 'wpsg_pap_order_tracking',
+			
+				/* wpsg_mod_export */
+			
+				/* Nicht kompatibel */
+			
+				/* wpsg_mod_customerbudget */
+			
+				/* Keine Einstellungen */
+			
+				/* wpsg_mod_versandarten */
+			
+				/* Keine Einstellungen */
+				
+				/* wpsg_mod_willcollect */
+				'wpshopgermany_selbstabholer_rabgb' => 'wpsg_mod_willcollect_gebuehr', 
+				'wpshopgermany_shipping_selbstabholer_name' => 'wpsg_mod_willcollect_adress',
+				'wpshopgermany_shipping_selbstabholer_strnr' => 'wpsg_mod_willcollect_street',
+				'wpshopgermany_shipping_selbstabholer_plzort' => 'wpsg_mod_willcollect_plzort',
+			
+				/* wpsg_mod_shippingadress */
+				/* Keine Einstellungen */
+			
+				/* wpsg_mod_freeshipping */
+				'wpshopgermany_freeshipping_value' => 'wpsg_mod_freeshipping_minvalue',
+				'wpsg_mod_freeshipping_gutschein' => '', // TODO
+			
+				/* wpsg_mod_skrill */
+				'wpsg_mod_skrill_bezeichnung' => 'wpsg_mod_skrill_bezeichnung',
+				'wpsg_mod_skrill_recipient_description' => 'wpsg_mod_skrill_recipient_description',
+				'wpsg_mod_skrill_email' => 'wpsg_mod_skrill_email',
+				'wpsg_mod_skrill_id' => 'wpsg_mod_skrill_id',
+				'wpsg_mod_skrill_gebuehr' => 'wpsg_mod_skrill_gebuehr',
+				'wpsg_mod_skrill_currency' => 'wpsg_mod_skrill_currency',
+				'wpsg_mod_skrill_autostart' => 'wpsg_mod_skrill_autostart',
+				'wpsg_mod_skrill_code' => 'wpsg_mod_skrill_code',
+				'wpsg_page_mod_skrill_success' => 'wpsg_page_mod_skrill_success',
+				'wpsg_page_mod_skrill_success_url' => 'wpsg_page_mod_skrill_success_url',
+				'wpsg_page_mod_skrill_error' => 'wpsg_page_mod_skrill_error',
+				'wpsg_page_mod_skrill_error_url' => 'wpsg_page_mod_skrill_error_url',
+
+				/* wpsg_mod_prepayment */
+				'wpshopgermany_prepayment_rabgb' => 'wpsg_mod_prepayment_gebuehr',			
+				'wpshopgermany_prepayment_inhaber' => 'wpsg_mod_prepayment_kinhaber',
+				'wpshopgermany_prepayment_knr' => 'wpsg_mod_prepayment_knummer',
+				'wpshopgermany_prepayment_bank' => 'wpsg_mod_prepayment_bank',
+				'wpshopgermany_prepayment_blz' => 'wpsg_mod_prepayment_blz',
+				'wpshopgermany_prepayment_ibanbic' => 'wpsg_mod_prepayment_iban',
+				'wpshopgermany_prepayment_swift' => 'wpsg_mod_prepayment_swift',
+				'wpshopgermany_prepayment_betreff' => 'wpsg_mod_prepayment_subject',
+			
+				/* wpsg_mod_paypal */
+				'wpshopgermany_paypal_mail' => 'wpsg_mod_paypal_email',
+				'wpshopgermany_paypal_sandbox' => 'wpsg_mod_paypal_sandbox',
+				'wpshopgermany_paypal_rabgb' => 'wpsg_mod_paypal_gebuehr',
+				'wpshopgermany_paypal_go' => 'wpsg_mod_paypal_autostart',
+				'wpshopgermany_pp_pageconfirm' => 'wpsg_page_mod_paypal_success',
+				'wpshopgermany_pp_pageconfirm_url' => false,
+				'wpshopgermany_pp_pageerror' => 'wpsg_page_mod_paypal_error',
+				'wpshopgermany_pp_pageerror_url' => false,
+				'wpsg_paypal_currency' => 'wpsg_mod_paypal_currency',
+				'wpsg_paypal_currency' => 'wpsg_mod_paypal_currency',				
+							
+				/* wpsg_mod_debitpayment */
+				'wpshopgermany_shipping_nachnahme' => 'wpsg_mod_debitpayment_rabgeb',
+			
+				/* wpsg_mod_invoice_type */
+				'wpshopgermany_rechnung_nachnahme' => 'wpsg_mod_invoice_type_gebuehr',
+			
+				/* wpsg_mod_su */
+				'wpshopgermany_sb_rabgb' => 'wpsg_mod_su_gebuehr',
+				'wpshopgermany_sb_user_id' => 'wpsg_mod_su_userid',
+				'wpshopgermany_sb_project_id' => 'wpsg_mod_su_projectid',  
+				'wpshopgermany_sb_projekt_password' => 'wpsg_mod_su_projectpassword',
+				'wpshopgermany_sb_confirm_password' => 'wpsg_mod_su_noticepassword',
+				'wpshopgermany_sb_hash' => 'wpsg_mod_su_hash',
+				'wpshopgermany_sb_language_id' => 'wpsg_mod_su_language',
+				'wpshopgermany_sb_currency_id' => 'wpsg_mod_su_currency',
+				'wpshopgermany_sb_pageerror' => 'wpsg_page_mod_su_error',
+				'wpshopgermany_sb_pageconfirm' => 'wpsg_page_mod_su_success',
+				'wpsg_sb_go' => 'wpsg_mod_su_autostart',
+			
+				/* wpsg_mod_skrill */
+				/* Modulkeys komplett gleich */
+			
+				/* wpsg_mod_userpayment */
+				/* keine Optionen */
+			
+				/* wpsg_mod_debitpayment */
+				'wpshopgermany_payment_bankeinzug' => 'wpsg_mod_autodebit_gebuehr',
+			
+				/* wpsg_mod_cap */
+				'wpsg_cab_merchantid' => 'wpsg_mod_cab_merchantID',
+				'wpsg_cab_mmskey' => 'wpsg_mod_cab_mmskryptkey',
+				'wpsg_cab_projekttid' => 'wpsg_mod_cab_projectID',
+				'wpsg_cab_mmsemail' => 'wpsg_mod_cab_mmsstatusmail',
+				'wpsg_cab_secretKey' => 'wpsg_mod_cab_kryptkey',
+				'wpsg_cab_rabgeb' => 'wpsg_mod_cab_gebuehr',
+				'wpsg_cab_currency' => 'wpsg_mod_cab_currency',
+				'wpsg_cab_auftragstext' => 'wpsg_mod_cab_auftragsbezeichnung',
+				'wpsg_cab_sandbox' => 'wpsg_mod_cab_sandbox',
+				'wpsg_cab_redirekt' => 'wpsg_mod_cab_currency',
+				'wpshopgermany_cab_pageconfirm' => 'wpsg_mod_cab_success',
+				'wpshopgermany_cab_pageerror' => 'wpsg_mod_cab_error',
+				'wpshopgermany_cab_pageconfirm_url' => '',
+				'wpshopgermany_cab_pageerror_url' => '',
+			
+				/* wpsg_mod_billsafe */
+				'wpsg_billsafe_merchantid' => false,
+				'wpsg_billsafe_lizenz' => 'wpsg_mod_billsafe_licence',
+				'wpsg_billsafe_appkey' => false,
+				'wpsg_billsafe_sandbox' => 'wpsg_mod_billsafe_sandbox',
+				'wpsg_billsafe_lizenz_sandbox' => 'wpsg_mod_billsafe_licencesandbox',
+				'wpsg_billsafe_rabgb' => 'wpsg_mod_billsafe_gebuehr',
+				'wpsg_billsafe_go' => 'wpsg_mod_billsafe_autorun',
+				'wpsg_billsafe_error' => 'wpsg_mod_billsafe_error',
+				'wpsg_billsafe_erfolg' => 'wpsg_mod_billsafe_success',
+				'wpsg_billsafe_logo' => 'wpsg_mod_billsafe_logo',
+				'wpsg_billsafe_vorab' => 'wpsg_mod_billsafe_precheck',
+
+				/* Rabatt */
+				'wpsg_rabatt_produktrabatt' => 'wpsg_mod_discount_productdiscount',
+				'wpsg_rabatt_produktgruppen' => 'wpsg_mod_discount_universal',
+				'wpsg_rabatt_generell_von' => 'wpsg_mod_discount_universal_from',
+				'wpsg_rabatt_generell_bis' => 'wpsg_mod_discount_universal_to',
+				'wpsg_rabatt_generell_value' => 'wpsg_mod_discount_universal_value',
+				'wpsg_rabatt_data' => 'wpsg_mod_discount_data',
+	
+				/* Rechnungen */
+				'wpsg_rechnungen_adresszeile' => 'wpsg_rechnungen_adresszeile',
+				'wpsg_rechnungen_url' => 'wpsg_rechnungen_url',
+				'wpsg_rechnungen_auto' => 'wpsg_mod_rechnungen_auto',
+				'wpsg_rechnungen_faelligkeit' => 'wpsg_rechnungen_faelligkeit',
+				'wpsg_rechnungen_pbeschreibung' => 'wpsg_rechnungen_pbeschreibung',
+				'wpsg_mod_rechnungen_showgutschriftrechnung' => 'wpsg_mod_rechnungen_showgutschriftrechnung',
+				'wpsg_mod_rechnungen_showpv' => 'wpsg_mod_rechnungen_showpv',
+				'wpsg_mod_rechnungen_showov' => 'wpsg_mod_rechnungen_showov',
+				'wpsg_rechnungen_start' => 'wpsg_rechnungen_start',
+				'wpsg_gutschrift_start' => 'wpsg_gutschrift_start',
+				'wpsg_rechnungen_format' => 'wpsg_rechnungen_format',
+				'wpsg_gutschrift_format' => 'wpsg_gutschrift_format',	
+
+				/* Bestellupload */
+			
+				/* ZubehÃ¶rprodukte  */
+			
+				/* Produktgruppen */
+				'wpshopgermany_produktgruppen_page' => 'wpsg_productgroups_page',
+				'wpsg_produktgruppen_sort' => 'wpsg_productgroups_order',
+			
+				/* Produktartikel */
+			
+				/* Fuellmengen */
+				'wpshopgermany_fuellmenge_einheiten' => 'wpsg_mod_fuellmenge_einheit',
+				'wpshopgermany_fuellmenge_bezug' => 'wpsg_mod_fuellmenge_bezug',
+			
+				/* Produktattribute */
+			
+				/* Lagerbestand */
+				'wpshopgermany_stock_template' => 'wpsg_mod_stock_template',
+				'wpshopgermany_stock_allow' => 'wpsg_mod_stock_allow',
+			
+				/* Downloadplus */
+				'wpsg_dlplus_anpassung' => 'wpsg_mod_pdfdownload_range',
+                'wpsg_dlplus_anpassung_bis' => 'wpsg_mod_pdfdownload_range_von',
+                'wpsg_dlplus_anpassung_von' => 'wpsg_mod_pdfdownload_range_bis',
+                'wpsg_dlplus_cronclear' => 'wpsg_mod_pdfdownload_cleanraiddownloads',
+                'wpsg_dlplus_cronmail' => 'wpsg_pdfdownloadcronmail_empfaenger',                   
+                'wpsg_dlplus_cronsend' => 'wpsg_mod_pdfdownload_autosend',
+                'wpsg_dlplus_dokaforms' => 'wpsg_mod_pdfdownload_securitynote',
+                'wpsg_dlplus_dokmodify' => 'wpsg_mod_pdfdownload_securitymod',
+                'wpsg_dlplus_dokopenpwd' => 'wpsg_mod_pdfdownload_openpass',
+                'wpsg_dlplus_dokprint' => 'wpsg_mod_pdfdownload_securityprint',
+                'wpsg_dlplus_dokpwd' => 'wpsg_mod_pdfdownload_masterpass',
+                'wpsg_dlplus_doksave' => 'wpsg_mod_pdfdownload_securitysave',
+                'wpsg_dlplus_filename' => 'wpsg_mod_pdfdownload_filename',
+			
+				/* Seitenkonfiguration */
+				'wpshopgermany_basketpage' => 'wpsg_page_basket',
+				'wpshopgermany_agbpage' => 'wpsg_page_agb',
+				'wpshopgermany_wrpage' => 'wpsg_page_widerrufsbelehrung',
+				'wpshopgermany_dspage' => 'wpsg_page_datenschutz',
+				'wpshopgermany_vkpage' => 'wpsg_page_versand',
+				'wpshopgermany_imppage' => 'wpsg_page_impressum',
+
+			); 
+			
+			$arSettingOld = array();
+
+			// Ich bieg das hier etwas zusammen, da die Einstellungen einmal aus der Datenbank und einmal aus der XML Datei kommen kÃ¶nnen			
+			if (!isset($_REQUEST['submit_import_db']))
+			{
+
+			
+				// Import aus Datei				
+				foreach ($settings as $entry) 
+				{
+					
+					$blog_id = $entry->getAttribute("blog_id");
+					$option_name = $entry->getAttribute("option_name");
+					$option_value = $entry->getAttribute("option_value");
+					$autoload = $entry->getAttribute("autoload");
+
+					$arSettings[] = array(
+						'blog_id' => $blog_id,
+						'option_name' => $option_name,
+						'option_value' => $option_value,
+						'autoload' => $autoload
+					);
+					
+				}
+				
+			}
+			else
+			{
+				
+				// Import direkt in der Datenbank
+				$arSettings = $this->db->fetchAssoc("
+					SELECT
+						*
+					FROM
+						`".$wpdb->prefix."options`
+					WHERE
+						(
+							`option_name` LIKE 'wpsg_%' OR
+							`option_name` LIKE 'wpshopgermany_%' OR
+							`option_name` LIKE 'mod_%'
+						) 
+						AND
+						(
+							`option_name` != 'wpshopgermany_installed' AND
+							`option_name` != 'wpsg_mods_installed_mod_rechnungen' 							
+						)
+				");  
+				
+			}
+			
+			// Damit Fehler angezeigt werden aktivier ich den DEBUG Modus
+			$this->shop->update_option('wpsg_debugModus', '1');
+			
+			foreach ($arSettings as $entry) 
+			{
+				
+				$blog_id = $entry["blog_id"];
+				$option_name = $entry["option_name"];
+				$option_value = $entry["option_value"];
+				$autoload = $entry["autoload"];
+				
+				if (!array_key_exists($option_name, $arSettingsMap))
+				{
+					
+					$this->db->Query("DELETE FROM `".$wpdb->prefix."options` WHERE `option_name` = '".wpsg_q($option_name)."'");
+					
+					$this->db->ImportQuery($wpdb->prefix."options", array(
+						'blog_id' => $blog_id,
+						'option_name' => $option_name,
+						'option_value' => $option_value,
+						'autoload' => $autoload
+					), true);
+					//$this->shop->update_option($option_name, $option_value);
+						
+				}
+				else if ($arSettingsMap[$option_name] !== false)
+				{
+				
+					$this->db->Query("DELETE FROM `".$wpdb->prefix."options` WHERE `option_name` = '".wpsg_q($arSettingsMap[$option_name])."'");
+					
+					$this->db->ImportQuery($wpdb->prefix."options", array(
+						'blog_id' => $blog_id,
+						'option_name' => $arSettingsMap[$option_name],
+						'option_value' => $option_value,
+						'autoload' => $autoload
+					), true);					
+					//$this->shop->update_option($arSettingsMap[$option_name], $option_value);	
+				
+				}	 
+     			
+			} 
+			
+			// Spezielle Felder
+			$wpsg_mod_downloadplus_text = array(
+				0 => array(
+					'aktiv' => $arSettings['wpsg_dlplus_watermark'],	
+					'text' => $arSettings['wpsg_dlplus_watermark_text'], 
+					'x' => $arSettings['wpsg_dlplus_watermark_x'],
+					'y' => $arSettings['wpsg_dlplus_watermark_y'],
+					'align' => $arSettings['wpsg_dlplus_watermark_center'],
+					'bg' => $arSettings['wpsg_dlplus_watermark_bg'],
+					'color' => $arSettings['wpsg_dlplus_watermark_color'],
+					'alpha' => $arSettings['wpsg_dlplus_watermark_alpha'],
+					'angle' => $arSettings['wpsg_dlplus_watermark_winkel'],
+					'fontsize' => $arSettings['wpsg_dlplus_watermark_fontsize']					
+				),
+				1 => array(
+					'aktiv' => $arSettings['wpsg_dlplus_text1'],
+					'text' => $arSettings['wpsg_dlplus_text1_text'], 
+					'x' => $arSettings['wpsg_dlplus_text1_x'],
+					'y' => $arSettings['wpsg_dlplus_text1_y'],
+					'align' => $arSettings['wpsg_dlplus_text1_center'],
+					'bg' => $arSettings['wpsg_dlplus_text1_bg'],
+					'color' => $arSettings['wpsg_dlplus_text1_color'],
+					'alpha' => $arSettings['wpsg_dlplus_text1_alpha'],
+					'angle' => $arSettings['wpsg_dlplus_text1_winkel'],
+					'fontsize' => $arSettings['wpsg_dlplus_text1_fontsize']					
+				),
+				2 => array(
+					'aktiv' => $arSettings['wpsg_dlplus_text2'],
+					'text' => $arSettings['wpsg_dlplus_text2_text'], 
+					'x' => $arSettings['wpsg_dlplus_text2_x'],
+					'y' => $arSettings['wpsg_dlplus_text2_y'],
+					'align' => $arSettings['wpsg_dlplus_text2_center'],
+					'bg' => $arSettings['wpsg_dlplus_text2_bg'],
+					'color' => $arSettings['wpsg_dlplus_text2_color'],
+					'alpha' => $arSettings['wpsg_dlplus_text2_alpha'],
+					'angle' => $arSettings['wpsg_dlplus_text2_winkel'],
+					'fontsize' => $arSettings['wpsg_dlplus_text2_fontsize']					
+				)
+			);
+			
+			$this->shop->update_option('wpsg_mod_downloadplus_text', serialize($wpsg_mod_downloadplus_text));
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand', $arSettings['wpsg_kl_register'] % 1);
+			
+			$this->shop->update_option('wpsg_installed', time(), true);
+			
+			// Module aktivieren, damit die Tabellen vorbereitet sind
+			$this->shop->loadModule(true);
+			foreach ($this->shop->arAllModule as $m_key => $m)
+			{
 			 
-			if (!wpsg_isSizedString($url)) throw new \Exception("UngÃŒltige Download URL.");
-						
-			$bOK = @copy($url, $temp_name);
-			
-			if (!$bOK) {
-			
-				$bOK = @file_put_contents($temp_name, $this->shop->get_url_content($url));
-			
-				if (!$bOK) {
-						
-					// Pfad finden fÃŒr das Wordpress Filesystem
-					if ($GLOBALS['wpsg_sc']->isMultiBlog()) $ftp_path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/';
-					else $ftp_path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_temp/';
+				if ($this->shop->get_option($m_key) > 0)
+				{
+					
+					$init = base64_decode('aW5zdGFsbEZpcnN0'); //'installFirst';
+					 
+					$this->shop->arAllModule[$m_key]->$init();
+					$this->shop->arAllModule[$m_key]->install();
+					
+				}
+				
+			} 
+			
+			// Welche Tabellen sind da?
+			$arTables = $this->db->fetchAssocField("SHOW TABLES");
+			
+			if ($this->shop->isMultiBlog())
+			{
+				$target_path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/';
+			}
+			else
+			{
+				$target_path = WP_CONTENT_DIR.'/uploads/';
+			}
+			 
+			if (!isset($_REQUEST['submit_import_db']))
+			{
+			
+				// Verzeichnisse aus XML
+				if (file_exists($path.'/wpsg_rechnungen/')) wpsg_copy(
+					$path.'/wpsg_rechnungen/',
+					$target_path.'/wpsg_rechnungen'
+				);
+				
+				if (file_exists($path.'/wpsg_produktbilder/')) wpsg_copy(
+					$path.'/wpsg_produktbilder/',
+					$target_path.'/wpsg_produktbilder'
+				);
 								
-					$ftp_path = trailingslashit($wp_filesystem->find_folder($ftp_path)).preg_replace('/(.*)\/wpsg_temp\//', '', $temp_name);
-					
-					$bOK = $wp_filesystem->put_contents($ftp_path, $this->shop->get_url_content($url), FS_CHMOD_FILE);
-					
-					if (!$bOK) {
-						
-						$this->shop->addBackendError(wpsg_translate(__('Modul (#1#) konnte nicht kopiert werden!', 'wpsg'), $modul_key));
-						return false;
-		
-					}
-								
-				}
-			
-			}
-				
-			$zip = new ZipArchive();
+				if (file_exists($path.'/produktfiles/')) wpsg_copy(
+					$path.'/produktfiles/',
+					$target_path.'/wpsg_produktfiles'
+				);
+				
+			}
+			else
+			{
+				
+				// Verzeichnisse aus XML				
+				if (file_exists($path.'/produktbilder/')) wpsg_copy(
+					$path.'/produktbilder/',
+					$target_path.'/wpsg_produktbilder'
+				); 
+				
+				if (file_exists($path.'/produktfiles/')) wpsg_copy(
+					$path.'/produktfiles/',
+					$target_path.'/wpsg_produktfiles'
+				);
+				
+			}
+			 			
+			// Tabellen
+			$arTables_Import = array();
+			
+			if (!isset($_REQUEST['submit_import_db']))
+			{
+			
+				// Import aus XML Datei
+				
+				$query = "//wpsg/*[@table_name]";
+				$tables = $xpath->query($query);
+			
+				foreach ($tables as $t)
+				{
+					
+					// Rows hinzufÃŒgen
+					$rows = $t->getElementsByTagName("row");
+					
+					$arRows = array();
+					
+					foreach ($rows as $row_entry)
+					{
+					
+						$row = array();
+					
+					  foreach ($row_entry->attributes as $attribute)
+					  {
+					  	
+					  	$row[$attribute->name] = $attribute->value;
+					  						  	
+						}
+						
+						$arRows[] = $row;
+						
+					}
+					 
+					$arTables_Import[] = array(
+						'name' => $t->getAttribute("table_name"),
+						'rows' => $arRows
+					);
+					
+				}
+				
+			}
+			else
+			{
+				
+				foreach ($arTables as $t)
+				{
+					
+					if (preg_match('/\wpshopgermany\_/', $t))
+					{
+						
+						$arTables_Import[] = array(
+							'name' => $t,
+							'rows' => $this->db->fetchAssoc("SELECT * FROM `".$t."`")
+						);
+						
+					}
+					
+				}
+				
+			}
+						
+			foreach ($arTables_Import as $entry)
+			{
+				
+				//$table_name = $entry->getAttribute("table_name");				
+				//$rows = $entry->getElementsByTagName("row");
+				
+				$table_name = $entry['name'];
+				$rows = $entry['rows'];
+				 
+				foreach ($rows as $row_entry)
+				{
+				
+					if (preg_match('/wpshopgermany_products$/', $table_name)) // Produkte
+					{
+							
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'cdate' => wpsg_q($row_entry['cdate']),
+							'name' => wpsg_q($row_entry['name']),
+							'detailname' => wpsg_q($row_entry['detailname']),
+							'anr' => wpsg_q($row_entry['anr']),
+							'typ' => wpsg_q($row_entry['typ']),
+							'preis' => wpsg_q($row_entry['preis']),
+							'mwst_key' => 'c',
+							'beschreibung' => wpsg_q($row_entry['beschreibung']),
+							'pgruppe' => wpsg_q($row_entry['pgruppe']),
+							'ptemplate_file' => wpsg_q($row_entry['ptemplate_file']),
+							'deleted' => wpsg_q($row_entry['deleted']),
+							'lang_parent' => wpsg_q($row_entry['lang_parent']),
+							'lang_locale' => wpsg_q($row_entry['lang_locale']),
+							'rabatt' => wpsg_q($row_entry['rabatt']),
+							'posturl' => wpsg_q($row_entry['mod_impexp_posturl']),
+							'posturl_verkauf' => wpsg_q($row_entry['mod_impexp_verkauf']),
+							'posturl_bezahlung' => wpsg_q($row_entry['mod_impexp_bezahlung']),
+							'produktvars' => wpsg_q($row_entry['produktvars']),
+							'feinheit' => wpsg_q($row_entry['feinheit']),
+							'fmenge' => wpsg_q($row_entry['fmenge']),
+							'stock' => wpsg_q($row_entry['stock']),
+							'stock_count' => wpsg_q($row_entry['stock_count']),
+							'mod_varianten' => wpsg_q($row_entry['variantenplus']),
+							'weight' => wpsg_q($row_entry['weight']),
+							'partikel' => wpsg_q($row_entry['partikel']),
+							'downloadplus' => wpsg_q($row_entry['downloadplus'])						
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_PRODUCTS, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_order$/', $table_name)) // Bestellungen
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'onr' => wpsg_q($row_entry['onr']), 
+							'cdate' => wpsg_q($row_entry['cdate']),
+							'k_id' => wpsg_q($row_entry['k_id']),
+							'ip' => wpsg_q($row_entry['ip']),
+							'useragent' => wpsg_q($row_entry['useragent']),
+							'comment' => wpsg_q($row_entry['comment']),
+							'price_gesamt' => wpsg_q($row_entry['price_gesamt']),
+							'price_shipping' => wpsg_q($row_entry['price_shipping']),
+							'price_payment' => wpsg_q($row_entry['price_payment']),
+							'price_rabatt' => wpsg_q($row_entry['price_rabatt']),
+							'price_gs' => wpsg_q($row_entry['price_gs']),
+							'mwst_payment' => wpsg_q($row_entry['mwst_payment']),
+							'mwst_shipping' => wpsg_q($row_entry['mwst_shipping']),
+							'type_shipping' => wpsg_q($row_entry['type_shipping']),
+							'type_payment' => wpsg_q($row_entry['type_payment']),
+							'shipping_vname' => wpsg_q($row_entry['shipping_vname']),
+							'shipping_name' => wpsg_q($row_entry['shipping_name']),
+							'shipping_strasse' => wpsg_q($row_entry['shipping_strasse']),
+							'shipping_hausnr' => wpsg_q($row_entry['shipping_hausnr']),
+							'shipping_plz' => wpsg_q($row_entry['shipping_plz']),
+							'shipping_ort' => wpsg_q($row_entry['shipping_ort']),
+							'shipping_land' => wpsg_q($row_entry['shipping_land']),
+							'shipping_firma' => wpsg_q($row_entry['shipping_firma']),							
+							'payed_date' => wpsg_q($row_entry['payed_date']),
+							'bvars' => wpsg_q($row_entry['bvars']),
+							'pvars' => wpsg_q($row_entry['pvars']),
+							'status' => wpsg_q($row_entry['status']),
+							'transaction' => wpsg_q($row_entry['transaction']),
+							'dp_cron_planed' => wpsg_q($row_entry['dp_cron_planed']),
+							'dp_cron_done' => wpsg_q($row_entry['dp_cron_done']),
+							'gs_id' => wpsg_q($row_entry['gs_id']),
+							'kleinunternehmer' => wpsg_q($row_entry['kleinunternehmer']),
+							'custom_data' => wpsg_q($row_entry['']),
+							'admincomment' => wpsg_q($row_entry['admincomment']),
+							'language' => '', // Gab es frÃŒher nicht
+							'mod_autodebit_name' => wpsg_q($row_entry['bname']),
+							'mod_autodebit_blz' => wpsg_q($row_entry['bblz']),
+							'mod_autodebit_inhaber' => wpsg_q($row_entry['binhaber']),
+							'mod_autodebit_knr' => wpsg_q($row_entry['bnr']),
+							'weight' => '', // Gab es frÃŒher nicht
+							'mod_billsafe_token' => wpsg_q($row_entry['mod_billsafe_token']),
+							'mod_billsafe_transaction_id' => wpsg_q($row_entry['mod_billsafe_transaction_id']),
+							'cab_externalid' => wpsg_q($row_entry['cab_externalid']),
+							'cab_requestTrackingID' => wpsg_q($row_entry['cab_requestTrackingID']),
+							'cab_transactionID' => wpsg_q($row_entry['cab_transactionID']),
+							'cab_transactionStatus' => wpsg_q($row_entry['cab_transactionStatus']),
+							'cab_started' => wpsg_q($row_entry['cab_started']),
+							'cab_lastupdate' => wpsg_q($row_entry['cab_lastupdate']),
+							'cab_paylink' => wpsg_q($row_entry['cab_paylink']),
+							'cab_repayed' => wpsg_q($row_entry['cab_repayed']),
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_ORDER, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_attribute$/', $table_name) && in_array(WPSG_TBL_AT, $arTables)) // Produktattribute
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'name' => wpsg_q($row_entry['name']),
+							'typ' => wpsg_q($row_entry['typ']),
+							'auswahl' => '' // Gab es frÃŒher nicht
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_AT, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_cab$/', $table_name) && in_array(WPSG_TBL_CABLOG, $arTables)) // Click & Buy Log
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'cdate' => wpsg_q($row_entry['cdate']),
+							'extID' => wpsg_q($row_entry['extID']),
+							'transID' => wpsg_q($row_entry['transID']),
+							'eventID' => wpsg_q($row_entry['eventID']),
+							'oldState' => wpsg_q($row_entry['oldState']),
+							'newState' => wpsg_q($row_entry['newState'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_CABLOG, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_downloadplus$/', $table_name)) // Downloadplus
+					{
+						 
+						//
+						
+					}
+					else if (preg_match('/wpshopgermany_exportprofile$/', $table_name)) // Exportprofile
+					{
+						
+					}
+					else if (preg_match('/wpshopgermany_gutscheine$/', $table_name) && in_array(WPSG_TBL_GUTSCHEIN, $arTables)) // Gutscheine
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'code' => wpsg_q($row_entry['code']),
+							'value' => wpsg_q($row_entry['value']),
+							'o_id' => wpsg_q($row_entry['o_id']),
+							'calc_typ' => wpsg_q($row_entry['calc_typ']),
+							'cdate' => wpsg_q($row_entry['cdate']),
+							'start_date' => wpsg_q($row_entry['start_date']),
+							'end_date' => wpsg_q($row_entry['end_date']),
+							'multi' => wpsg_q($row_entry['multi'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_GUTSCHEIN, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_kunden$/', $table_name)) // Kunden
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'knr' => '', // Neu
+							'paypal_payer_id' => wpsg_q($row_entry['paypal_payer_id']),
+							'title' => wpsg_q($row_entry['title']),
+							'name' => wpsg_q($row_entry['name']),
+							'vname' => wpsg_q($row_entry['vname']),
+							'email' => wpsg_q($row_entry['email']),
+							'firma' => wpsg_q($row_entry['firma']),
+							'fax' => wpsg_q($row_entry['fax']),
+							'strasse' => wpsg_q($row_entry['strasse']),
+							'plz' => wpsg_q($row_entry['plz']),
+							'ort' => wpsg_q($row_entry['ort']),
+							'land' => wpsg_q($row_entry['land']),
+							'tel' => wpsg_q($row_entry['tel']),
+							'geb' => wpsg_q($row_entry['geb']),
+							'ustidnr' => wpsg_q($row_entry['ustidnr']),
+							'custom' => wpsg_q($row_entry['custom']),
+							'passwort_saltmd5' => wpsg_q($row_entry['passwort_saltmd5']),
+							'comment' => wpsg_q($row_entry['comment']),
+							'budget' => wpsg_q($row_entry['budget']),
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_KU, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_land$/', $table_name) && in_array(WPSG_TBL_LAND, $arTables)) // LÃ€nder
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'name' => wpsg_q($row_entry['bezeichnung']),
+							'kuerzel' => wpsg_q($row_entry['kuerzel']),
+							'vz' => wpsg_q($row_entry['vz']),
+							'mwst' => wpsg_q($row_entry['mwst'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_LAND, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_lieferanten$/', $table_name) && in_array(WPSG_TBL_VA, $arTables)) // Lieferanten/Versandarten
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'name' => wpsg_q($row_entry['name']),
+							'vz' => wpsg_q($row_entry['vz']),
+							'hint' => '', // Neu
+							'mwst' => '', // War frÃŒher Wert sollte ÃŒberprÃŒft werden !
+							'mwst_laender' => '', // Gab es nicht
+							'typ' => wpsg_q($row_entry['typ']),
+							'kosten' => wpsg_q($row_entry['kosten']),
+							'deleted' => wpsg_q($row_entry['deleted']),
+							'aktiv' => '1'
+						); 
+						
+						$this->db->ImportQuery(WPSG_TBL_VA, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_mwst$/', $table_name)) // Mehrwertsteuer
+					{
+						
+						// Nix machen mit den DatensÃ€tzen
+						
+					}
+					else if (preg_match('/wpshopgermany_orderlog$/', $table_name)) // Bestellprotokoll
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'o_id' => wpsg_q($row_entry['o_id']),
+							'cdate' => wpsg_q($row_entry['cdate']),
+							'title' => wpsg_q($row_entry['title']),
+							'mailtext' => wpsg_q($row_entry['mailtext'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_OL, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_ordervars$/', $table_name) && in_array(WPSG_TBL_ORDERVARS, $arTables)) // Bestellvariablen
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'name' => wpsg_q($row_entry['name']),
+							'typ' => wpsg_q($row_entry['typ']),
+							'auswahl' => wpsg_q($row_entry['auswahl']),
+							'pflicht' => wpsg_q($row_entry['pflicht']),
+							'deleted' => '0' // Gab es frÃŒher nicht														
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_ORDERVARS, $data_ins, true);
+						
+						// Ãbersetzte Bestellvariablen mÃŒssen manuell nachgetragen werden
+						
+					}
+					else if (preg_match('/wpshopgermany_order_products$/', $table_name)) // PRodukt <-> Bestellung
+					{
+						
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'o_id' => wpsg_q($row_entry['o_id']),
+							'p_id' => wpsg_q($row_entry['p_id']),
+							'menge' => wpsg_q($row_entry['menge']),
+							'price' => wpsg_q($row_entry['price']),
+							'mwst' => '', // Die Zuordnung der ID gibt es im alten nicht
+							'mwst_value' => wpsg_q($row_entry['mwst']),
+							'mod_downloadprodukt_counter' => wpsg_q($row_entry['mod_downloadprodukt_counter']),
+							'mod_vp_varkey' => wpsg_q($row_entry['mod_vp_varkey']),
+							'weight' => '' // Gewicht wurde frÃŒher nicht erfasst
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_ORDERPRODUCT, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_products_attribute$/', $table_name) && in_array(WPSG_TBL_PRODUCTS_AT, $arTables))  
+					{
+						
+						$data_ins = array(
+							'p_id' => wpsg_q($row_entry['p_id']),
+							'a_id' => wpsg_q($row_entry['a_id']),
+							'value' => wpsg_q($row_entry['value'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_PRODUCTS_AT, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_products_vari$/', $table_name))
+					{
+						
+						// EntfÃ€llt 
+						
+					}
+					else if (preg_match('/wpshopgermany_produktgruppen$/', $table_name) && in_array(WPSG_TBL_PRODUCTS_GROUP, $arTables))
+					{
+						
+						// Produktgruppen
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'cdate' => wpsg_q($row_entry['cdate']),
+							'name' => wpsg_q($row_entry['name']),
+							'template_file' => wpsg_q($row_entry['template_file']),
+							'infopage' => wpsg_q($row_entry['infopage']),
+							'deleted' => wpsg_q($row_entry['deleted']),
+							'rabatt' => wpsg_q($row_entry['rabatt'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_PRODUCTS_GROUP, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_produktsticky$/', $table_name) && in_array(WPSG_TBL_PRODUCTS_STICKY, $arTables))
+					{
+						
+						// Produkt Sticky
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'produkt_id' => wpsg_q($row_entry['produkt_id']),
+							'von' => wpsg_q($row_entry['von']),
+							'bis' => wpsg_q($row_entry['bis'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_PRODUCTS_STICKY, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_produktvars$/', $table_name) && in_array(WPSG_TBL_PRODUCTS_VARS, $arTables))
+					{
+						
+						// Produktvariablen
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'name' => wpsg_q($row_entry['name']),
+							'typ' => wpsg_q($row_entry['typ']),
+							'auswahl' => wpsg_q($row_entry['auswahl']),
+							'pflicht' => wpsg_q($row_entry['pflicht'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARS, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_rechnungen$/', $table_name) && in_array(WPSG_TBL_RECHNUNGEN, $arTables))
+					{
+						
+						// Rechnungen
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'o_id' => wpsg_q($row_entry['o_id']),
+							'datum' => wpsg_q($row_entry['datum']),
+							'storno' => wpsg_q($row_entry['storno']),
+							'rnr' => wpsg_q($row_entry['rnr']),
+							'gnr' => wpsg_q($row_entry['gnr'])
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_RECHNUNGEN, $data_ins, true);
+						
+					}
+					else if (preg_match('/wpshopgermany_zahlvarianten$/', $table_name) && in_array(WPSG_TBL_ZV, $arTables))
+					{
+						
+						// Zahlvarianten
+						$data_ins = array(
+							'id' => wpsg_q($row_entry['id']),
+							'name' => wpsg_q($row_entry['name']),
+							'rabgeb' => wpsg_q($row_entry['rabgeb']),
+							'hint' => '',
+							'mwst' => '0',
+							'mwst_laender' => '0',
+							'aktiv' => '1'
+						);
+						
+						$this->db->ImportQuery(WPSG_TBL_ZV, $data_ins, true);
+						
+					}
+					
+				}
+				
+			}
+			
+			// Alte Tabellen lÃ¶schen
+			if ($_REQUEST['tabledel'] == '1')
+			{
+				
+				foreach ($arTables_Import as $t)
+				{
+
+					$this->db->Query("DROP TABLE IF EXISTS `".$t['name']."`");
+					
+				}
+				 
+				//if (file_exists($path.'/produktbilder/')) wpsg_rrmdir($path.'/produktbilder/');
+				//if (file_exists($path.'/produktfiles/')) wpsg_rrmdir($path.'/produktfiles/');
+				 
+			}
 			 
-			if ($zip->open($temp_name) === true) {
-			
-				try {
-															
-					$bOK = @$zip->extractTo(realpath(WPSG_PATH.'/../'));
-					$zip->close();
-			
-					if ($bOK === false) {
-			
-						throw new Exception();
-							
-					} else {
-			
-						return true;
-							
-					}
-			
-				} catch (Exception $e) {
-						
-					// Es ist ein Fehler aufgetreten, jetzt versuche ich die Datei mit dem Wordpress Filesystem zu entpacken
-						
-					// Pfad finden fÃŒr das Wordpress Filesystem
-					$ftp_path = trailingslashit($wp_filesystem->find_folder(realpath(WPSG_PATH.'/../')));
-						
-					$bOK = unzip_file($temp_name, $ftp_path);
-						
-					if ($bOK !== true) {
-			
-						$strError = '';
-			
-						// Hier ist immer noch ein Fehler aufgetreten
-						foreach ((array)$bOK->errors as $e) {
-								
-							$strError .= $e[0].' ';
-			
-						}
-						 
-						$this->shop->addBackendError(wpsg_translate(__('Fehler beim Entpacken: #1#', 'wpsg'), $strError)); return false;
-			
-					} else {
-			
-						return true;
-			
-					}
-						
-				}
-			
-			} else {
-			
-				$this->shop->addBackendError(__('Datei konnte nicht ÃŒbertragen werden.', 'wpsg')); return false;
-			
-			}
-			
-			$this->shop->addBackendError(__('Datei konnte nicht entpackt werden.', 'wpsg')); return false;
-
-		} // private function installModul($modul_key)
+			$this->addBackendMessage(__('Import war erfolgreich, bitte prÃŒfen Sie die Daten.', 'wpsg')); 
+			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=hilfe');
+			
+		} // private function importV2()
 
 		/**
 		 * Nach dem Update auf Version3 ist es durch den Export in die XML Datei zu einer serialisierung des schon serialisierten Strings gekommen
 		 * Diese Funktion korrigiert dies
-		 * Es betrifft folgende SchlÃŒssel:
-		 *
+		 * Es betrifft folgende SchlÃŒssel: 
+		 * 
 		 * wpsg_admin_pflicht
 		 * wpsg_mod_discount_data
@@ -2821,33 +3061,33 @@
 		 * wpsg_mod_rechnungen_texte
 		 * wpsg_rechnungen_footer
-		 *
+		 * 
 		 * Aufgerufen wird sie im Backend bei den allgemeinen Einstellungen
 		 */
 		private function CheckAndCorrectSerOption()
 		{
-
+			
 			$arOptions = array('wpsg_admin_pflicht', 'wpsg_mod_discount_data', 'wpsg_mod_downloadplus_text', 'wpsg_mod_pdfdownload_text', 'wpsg_mod_rechnungen_texte', 'wpsg_rechnungen_footer');
-
+			
 			foreach ($arOptions as $o)
 			{
-
+				
 				$value = $this->shop->get_option($o);
-
+				
 				if ($value === false) continue; // Wert ist ÃŒberhaupt nicht gesetzt, eventuell weil Modul nicht aktiviert
-
+				
 				if (!is_array($value) && (is_string($value) && preg_match('/^a\:\d+/', $value)))
 				{
-
+					
 					$korrektur_value = @unserialize($value);
-
+					
 					if (is_array($korrektur_value)) $this->shop->update_option($o, $korrektur_value);
-
-
-				}
-
-			}
-
+					
+					 
+				}
+				 
+			}
+			
 		} // public function CheckAndCorrectSerOption()
-
+		
 	} // class wpsg_AdminController extends wpsg_SystemController
 
Index: /controller/wpsg_BasketController.class.php
===================================================================
--- /controller/wpsg_BasketController.class.php	(revision 8528)
+++ /controller/wpsg_BasketController.class.php	(revision 5261)
@@ -1,136 +1,154 @@
 <?php
-	
+
 	/**
 	 * Dieser Controller ÃŒbernimmt die Aktionen des Warenkorbs
 	 */
-	class wpsg_BasketController extends wpsg_SystemController {
+	class wpsg_BasketController extends wpsg_SystemController
+	{
+				
+		public function content_filter(&$content)
+		{
+			 
+			if (get_the_id() == $this->get_option('wpsg_page_basket'))
+			{
+				
+				parent::dispatch();
+				
+				if (isset($_REQUEST['wpsg_checkout']))
+				{
+					
+					$this->checkoutAction($content);
+					
+				}
+				else if (isset($_REQUEST['wpsg_checkout2']))
+				{
+					
+					$this->checkout2Action($content);
+					
+				}
+				else if (isset($_REQUEST['wpsg_overview']))
+				{
+					
+					$this->overviewAction($content);
+					
+				}
+				else if (isset($_REQUEST['wpsg_done']))
+				{
+					
+					$this->doneAction($content);
+					
+				}
+				else
+				{
+				
+					$this->basketAction($content);
+					
+				}
+				
+			}			
+			
+		} // public function content_filter($content)
 		
-		private static $_outputCache = [];
-		
-		public function content_filter(&$content) {
-
-            /**
-             * 08.10.2020
-             * if (is_singular() && in_the_loop() && is_main_query()) Bedingung ergÃ€nzt weil es sonst mit YOAS WP SEO und automatischer
-             * Erstellung der Rechnung zu Problemen gekommen ist
-             */
-
-			if (wpsg_get_the_id() === $this->shop->getPagePID(wpsg_ShopController::PAGE_BASKET) && (is_singular() && in_the_loop() && is_main_query())) {
-
-				parent::dispatch();
-			 
-				if (isset($_REQUEST['wpsg_checkout'])) {
-					
-					$this->checkoutAction($content);
-					
-				} else if (isset($_REQUEST['wpsg_checkout2'])) {
-					
-					$this->checkout2Action($content);
-					
-				} else if (isset($_REQUEST['wpsg_overview'])) {
-					
-					$this->overviewAction($content);
-					
-				} else if (isset($_REQUEST['wpsg_done'])) {
-					
-					$this->doneAction($content);
-					
-				} else {
-					
-					$this->basketAction($content);
-					
-				}
-				
-			}
-			
-		} // public function content_filter($content)
-
 		/**
 		 * Gibt den Warenkorb aus, wird von content_filter aufgerufen
 		 */
-		public function basketAction(&$content) {
-			
-			if (isset($_REQUEST['wpsg_action']) && $_REQUEST['wpsg_action'] === 'showProdukt' && isset($_REQUEST['produkt_id'])) {
-				
-				$content = $this->shop->renderProdukt(intval($_REQUEST['produkt_id'])); return;
-				
-			}
-		 
-			$this->shop->checkCustomerPresetCountry();
+		public function basketAction(&$content)
+		{
+			
+			if (isset($_REQUEST['wpsg_action']) && $_REQUEST['wpsg_action'] == 'showProdukt' && $_REQUEST['produkt_id'] > 0)
+			{
+				
+				$content = $this->shop->renderProdukt($_REQUEST['produkt_id']); return; 
+				
+			}
 			
 			// Basket aus Session zusammenbauen
-			$this->shop->basket->initFromSession(true);
+			$this->shop->basket->initFromSession();
 			$this->shop->basket->save(false);
 			
-			// Basket muss aufgebaut sein
+			$this->shop->view['basket'] = $this->shop->basket->toArray(false, false);
+			
+			$this->shop->view['error'] = array();
+			if (wpsg_isSizedArray($_SESSION['wpsg']['errorFields'])) $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
+			
 			$this->shop->checkShippingAvailable();
-			$this->shop->checkPaymentAvailable();            
-			$this->shop->checkCustomerPreset();
-			
-			\wpsg\wpsg_calculation::getSessionCalculation()->update();
-			
-			$this->shop->basket->oCalculation = null;
-			$this->shop->view['basket'] = $this->shop->basket->toArray(false, false);
-
-			$this->shop->view['error'] = array();
-			if (isset($_SESSION['wpsg']['errorFields']) && wpsg_checkInput($_SESSION['wpsg']['errorFields'], WPSG_SANITIZE_ARRAY_TEXTFIELD)) $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
- 			
+			$this->shop->checkPaymentAvailable();
+
+			// Sollte es nur eine Versand/Zahlungsart geben, dann diese verwenden
+			if (sizeof($this->shop->arShipping) == 1) $_SESSION['wpsg']['checkout']['shipping'] = array_shift(array_keys($this->shop->arShipping));
+			if (sizeof($this->shop->arPayment) == 1) $_SESSION['wpsg']['checkout']['payment'] = array_shift(array_keys($this->shop->arPayment));
+			
+			if (sizeof($this->shop->arShipping) == 1 || sizeof($this->shop->arPayment) == 1)
+			{
+				
+				$this->shop->basket->initFromSession(true);
+				$this->shop->view['basket'] = $this->shop->basket->toArray(false, false);
+				
+			}
+			
+			
+			
+			// Zur Sicherheit ÃŒberprÃŒfe ich hier noch einmal die Zahlungsarten
+			// Es kann vorkommen, das eine Zahlungsart voreingestellt ist die nicht mehr verfÃŒgbar ist
+			// Ist nicht ganz schÃ¶n, da aber checkShippingAvailable von toArray() abhÃ€ngig ist
+			if (isset($_SESSION['wpsg']['checkout']['shipping']) && !array_key_exists($_SESSION['wpsg']['checkout']['shipping'], $this->shop->arShipping))
+			{
+				
+				unset($_SESSION['wpsg']['checkout']['shipping']);
+				unset($this->shop->basket->arCheckout['shipping']);
+				
+				$this->shop->view['basket'] = $this->shop->basket->toArray(false, false);
+				
+			}
+			 			
 			$this->shop->view['arLander'] = $this->db->fetchAssocField("SELECT L.`id`, L.`name` FROM `".WPSG_TBL_LAND."` AS L ORDER BY L.`name` ", "id", "name");
 			
 			// colspan fÃŒr die Zusammenfassung berechnen je nach Option
-			$this->shop->view['colspan'] = 3;
+			$this->shop->view['colspan'] = 3;			
 			if ($this->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-			if ($this->shop->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1)) {
-				
-				$this->shop->view['arShipping'] = $this->shop->arShipping;
-				$this->shop->view['arPayment'] = $this->shop->arPayment;
-				$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
-				$this->shop->view['laender'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `name` ASC");
-				
-				$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_onepagecheckout/onepage.phtml', false);
-				
-			} else {
-				
-				$content = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/basket.phtml', false);
-				
-			}
+						
+			$content = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/basket.phtml', false);
 			
 		} // public function basketAction()
 		
-		public function setBasketData() {
+		public function setBasketData()
+		{
 			
 			// gewÃ€hlte Lieferanschrift im Warenkorb setzen
-			if (isset($_REQUEST['set_land'])) {
-			
-				$set_land = $_REQUEST['set_land'];
-				
-				if ($this->shop->hasMod('wpsg_mod_shippingadress') && wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land'])) {
-					
-					$_SESSION['wpsg']['checkout']['shipping_land'] = $set_land;
-					
-				} else {
-					
-					$_SESSION['wpsg']['checkout']['land'] = $set_land;
-					
-				}
-				
+			if (wpsg_isSizedInt($_REQUEST['set_land']))
+			{
+					
+				if ($this->shop->hasMod('wpsg_mod_shippingadress') && wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land']))
+				{
+			
+					$_SESSION['wpsg']['checkout']['shipping_land'] = $_REQUEST['set_land'];
+			
+				}
+				else
+				{
+			
+					$_SESSION['wpsg']['checkout']['land'] = $_REQUEST['set_land'];
+			
+				}
+					
 				// FÃŒr die Abfrage von EU Leistungsort Produkten eintragen
-				if (wpsg_isSizedInt($_SESSION['wpsg']['customerCountry'])) $_SESSION['wpsg']['customerCountry'] = $set_land;
+				if (wpsg_isSizedInt($_SESSION['wpsg']['customerCountry'])) $_SESSION['wpsg']['customerCountry'] = $_REQUEST['set_land'];
 				
 			}
 			
 			// gewÃ€hlte Versandart setzen
-			if (isset($_REQUEST['set_shipping']) && wpsg_checkInput($_REQUEST['set_shipping'], WPSG_SANITIZE_SHIPPING_KEY)) {
-				
+			if (wpsg_isSizedString($_REQUEST['set_shipping']))
+			{
+					
 				$_SESSION['wpsg']['checkout']['shipping'] = $_REQUEST['set_shipping'];
-				
+					
 			}
 			
 			// gewÃ€hlte Zahlungsart setzen
-			if (isset($_REQUEST['set_payment']) && wpsg_checkInput($_REQUEST['set_payment'], WPSG_SANITIZE_PAYMENT_KEY)) {
-				
+			if (wpsg_isSizedString($_REQUEST['set_payment']))
+			{
+					
 				$_SESSION['wpsg']['checkout']['payment'] = $_REQUEST['set_payment'];
-				
+					
 			}
 			
@@ -141,31 +159,19 @@
 		/**
 		 * Eingabe der Kundendaten (Checkout)
-		 * @param $content
-		 * @throws Exception
 		 */
-		public function checkoutAction(&$content) {
-
+		public function checkoutAction(&$content)
+		{
+			
 			$this->setBasketData();
 			
-			$this->shop->checkCustomerPresetCountry();
-			
-			// Basket aus Session zusammenbauen
-			$this->shop->basket->initFromSession(true);
-			$this->shop->basket->save(false);
-			
-			// Basket muss aufgebaut sein
-			$this->shop->checkShippingAvailable();
-			$this->shop->checkPaymentAvailable();            
-			$this->shop->checkCustomerPreset();
-			
-			\wpsg\wpsg_calculation::getSessionCalculation()->update();
-			
+			$this->shop->basket->initFromSession();
+ 
 			$bError = true;
 			$this->shop->callMods('checkBasket', array(&$bError));
 			
-			if ($bError === false) {
+			if ($bError === false)
+			{
 				
 				$this->basketAction($content);
-				
 				return;
 				
@@ -175,43 +181,33 @@
 			$arProductIDs = $this->shop->basket->getProductIDs();
 			
-			if (!wpsg_checkInput($arProductIDs, WPSG_SANITIZE_ARRAY_INT)) {
-				
+			if (!wpsg_isSizedArray($arProductIDs))
+			{
+			
 				$this->shop->addFrontendError(__('Es befinden sich keine Produkte im Warenkorb.', 'wpsg'));
 				$this->basketAction($content);
-				
 				return;
-				
-			}
-			 			
-			if ($this->shop->hasMod('wpsg_mod_onepagecheckout')) {
-				
-				if ($this->shop->get_option('wpsg_mod_onepagecheckout_basket') == 1) {
-					
-					$this->basketAction($content); return;
-					
-				} else {
-					
-					$content = $this->shop->callMod('wpsg_mod_onepagecheckout', 'onepage'); 
-					
-					return;
-					
-				}
-				
-			}
-			
+			
+			}
+			
+			// Sollte die Session noch nicht mit Werten gefÃŒllt sein dann hier die Kundenvoreinstellungen laden
+			$this->shop->checkCustomerPreset();
+							
+			if ($this->shop->hasMod('wpsg_mod_onepagecheckout'))
+			{
+
+				$content = $this->shop->callMod('wpsg_mod_onepagecheckout', 'onepage');	return;
+				
+			}			
+ 
 			$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
-			
+						
 			$this->shop->view['error'] = array();
-			if (wpsg_checkInput($_SESSION['wpsg']['errorFields'], WPSG_SANITIZE_ARRAY_TEXTFIELD)) $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
+			if (wpsg_isSizedArray($_SESSION['wpsg']['errorFields'])) $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
 			
 			$this->shop->view['basket'] = $this->shop->basket->toArray();
-			$this->shop->view['basket']['checkout']['geb'] = wpsg_fromDate($this->shop->view['basket']['checkout']['geb'], true);
-			
-			$this->shop->view['laender'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `name` ASC");
-			
-			$this->shop->view['arAnrede']= explode('|', $this->shop->get_option('wpsg_admin_pflicht')['anrede_auswahl']);
+			$this->shop->view['laender'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `name` ASC");			
 			
 			$content = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/checkout.phtml', false);
-			
+						
 		} // public function checkoutAction()
 		
@@ -219,48 +215,29 @@
 		 * Eingabe der Versand- und Zahlungsart
 		 */
-		private function checkout2Action(&$content) {
- 
-			$this->setBasketData();
-			
-			$this->shop->checkCustomerPresetCountry();
-			
-			// Basket aus Session zusammenbauen
-			$this->shop->basket->initFromSession(true);
-			$this->shop->basket->save(false);
-			
-			// Basket muss aufgebaut sein
-			$this->shop->checkShippingAvailable();
-			$this->shop->checkPaymentAvailable();            
-			$this->shop->checkCustomerPreset();
-			
-			\wpsg\wpsg_calculation::getSessionCalculation()->update();
+		private function checkout2Action(&$content)
+		{
+			
+			$this->shop->basket->initFromSession();
 			
 			// Wenn keine Produkte drin sind, dann mit Fehlermeldung zum Warenkorb leiten
-			$temp = $this->shop->basket->getProductIDs();
-			
-			if (!wpsg_checkInput($temp, WPSG_SANITIZE_ARRAY_INT)) {
-				
+			if (!wpsg_isSizedArray($this->shop->basket->getProductIDs()))
+			{
+					
 				$this->shop->addFrontendError(__('Es befinden sich keine Produkte im Warenkorb.', 'wpsg'));
 				$this->basketAction($content);
-				
 				return;
-				
-			}
-			
-			$this->shop->view['error'] = array();
-			if (wpsg_checkInput($_SESSION['wpsg']['errorFields'], WPSG_SANITIZE_ARRAY_TEXTFIELD)) $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
-			
+					
+			}
+			
+			$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
 			$this->shop->view['basket'] = $this->shop->basket->toArray();
-						
-			if (sizeof($this->shop->arShipping) > 0 && (!in_array($_SESSION['wpsg']['checkout']['shipping'], array_keys($this->shop->arShipping)) || !in_array($_SESSION['wpsg']['checkout']['payment'], array_keys($this->shop->arPayment)))) {
-				
-				if (!in_array($_SESSION['wpsg']['checkout']['shipping'], array_keys($this->shop->arShipping))) $_SESSION['wpsg']['checkout']['shipping'] = array_keys($this->shop->arShipping)[0];
-				if (!in_array($_SESSION['wpsg']['checkout']['payment'], array_keys($this->shop->arPayment))) $_SESSION['wpsg']['checkout']['payment'] = array_keys($this->shop->arPayment)[0];
-				
-				$this->shop->basket->initFromSession(true);
-				$this->shop->view['basket'] = $this->shop->basket->toArray();
-				
-			}
-			
+			 
+			// Alte Werte lÃ¶schen / Warum war das mal drin ? 			
+			//unset($_SESSION['wpsg']['checkout']['shipping']);
+			//unset($_SESSION['wpsg']['checkout']['payment']);
+			 
+			$this->shop->checkShippingAvailable();
+			$this->shop->checkPaymentAvailable();
+						
 			$this->shop->view['arShipping'] = $this->shop->arShipping;
 			$this->shop->view['arPayment'] = $this->shop->arPayment;
@@ -273,113 +250,73 @@
 		 * Funktion fÃŒr die Bestellzusammenfassung
 		 */
-		private function overviewAction(&$content) {
- 
-			if (!isset($this->_outputCache['overview'])) {
-				
-				$this->shop->checkCustomerPresetCountry();
-				
-				$this->shop->basket->initFromSession();
-				
-				// Basket muss aufgebaut sein
-				$this->shop->checkShippingAvailable();
-				$this->shop->checkPaymentAvailable();            
-				$this->shop->checkCustomerPreset();
-				
-				\wpsg\wpsg_calculation::getSessionCalculation()->update();
-				
-				// Wenn keine Produkte drin sind, dann mit Fehlermeldung zum Warenkorb leiten
-				$temp = $this->shop->basket->getProductIDs();
-
-				if (!wpsg_checkInput($temp, WPSG_SANITIZE_ARRAY_INT)) {
-					
-					$this->shop->addFrontendError(__('Es befinden sich keine Produkte im Warenkorb.', 'wpsg'));
-					$this->basketAction($content);
-					
-					return;
-					
-				}
-
-				// Wenn die Overview PrÃŒfung nicht bestanden wurde, dann zum Checkout leiten
-				if (!$this->shop->basket->checkCheckout(3)) {
-					
-					if ($this->shop->hasMod('wpsg_mod_onepagecheckout') && ($this->shop->get_option('wpsg_mod_onepagecheckout_basket') == 1)) {
-						
-						$this->basketAction($content);
-						
-						return;
-					
-					} else {
-						
-						$this->checkoutAction($content);
-						
-						return;
-						
-					}
-					
-				}
-		 
-				$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
-				
-				$this->shop->view['error'] = array();
-				if (wpsg_checkInput($_SESSION['wpsg']['errorFields'], WPSG_SANITIZE_ARRAY_TEXTFIELD)) $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];			
-
-				$this->shop->view['basket'] = $this->shop->basket->toArray();
-								
-				if (!isset($this->shop->arShipping[$this->shop->view['basket']['checkout']['shipping']]) || !isset($this->shop->arShipping[$this->shop->view['basket']['checkout']['payment']])) {
-					
-					$this->shop->basket->initFromSession(true);
-					$this->shop->view['basket'] = $this->shop->basket->toArray();
-					
-				}
-
-            	$this->shop->view['arShipping'] = $this->shop->arShipping;
-            	$this->shop->view['arPayment'] = $this->shop->arPayment;
-            
-				// colspan fÃŒr die Zusammenfassung berechnen je nach Option
-				$this->shop->view['colspan'] = 2;
-				if ($this->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-				self::$_outputCache['overview'] = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/overview.phtml', false);
-	
-			 }
-			
-			$content = self::$_outputCache['overview'];
+		private function overviewAction(&$content)
+		{
+
+			$this->shop->basket->initFromSession();
+			
+			// Wenn keine Produkte drin sind, dann mit Fehlermeldung zum Warenkorb leiten
+			if (!wpsg_isSizedArray($this->shop->basket->getProductIDs())) 
+			{
+
+				$this->shop->addFrontendError(__('Es befinden sich keine Produkte im Warenkorb.', 'wpsg'));
+				$this->basketAction($content);
+				return;
+								
+			}
+			
+			// Wenn die Overview PrÃŒfung nicht bestanden wurde, dann zum Checkout leiten
+			if (!$this->shop->basket->checkCheckout(3))
+			{
+				
+				$this->checkoutAction($content);
+				return;
+				
+			}
+			
+			$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
+			
+			$this->shop->view['basket'] = $this->shop->basket->toArray();
+
+			$this->shop->checkShippingAvailable();
+			$this->shop->checkPaymentAvailable();
+						
+			$this->shop->view['arShipping'] = $this->shop->arShipping;
+			$this->shop->view['arPayment'] = $this->shop->arPayment;
+			
+			// colspan fÃŒr die Zusammenfassung berechnen je nach Option
+			$this->shop->view['colspan'] = 2;
+			if ($this->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
+			
+			$content = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/overview.phtml', false);
 			
 		} // private function overviewAction()
-		
+				
 		/**
 		 * Seite, die nach der Bestellung angezeigt wird
-		 * @param $content
-		 * @throws \wpsg\Exception
-		 * @throws Exception
 		 */
-		private function doneAction(&$content) {
-			
-			if (!wpsg_checkInput($_REQUEST['order_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			else {
-								
-				// Hash verifizierne
-				$order_id = intval($_REQUEST['order_id']);
-				
-				if ($order_id <= 0) throw \wpsg\Exception::getInvalidValueException();
-							
-				$oOrder = wpsg_order::getInstance($order_id);
-				
-				$hash = md5($oOrder->__get('secret').$order_id.$oOrder->__get('secret'));
-				
-				if (hash_equals($hash, rawurldecode($_REQUEST['wpsg_done']))) {					
-					 
-					$this->shop->basket->initFromDB($order_id);
-					$this->shop->view['basket'] = $this->shop->basket->toArray();
-					$this->shop->view['o_id'] = $order_id;
-					$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
-					$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
-					
-					$content = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/done.phtml', false);	
-					
-				} else $this->addFrontendError(__('Der Link ist ausgelaufen oder ungÃŒltig.', 'wpsg'));
-				
-			}
-				
+		private function doneAction(&$content)
+		{
+			
+			// Hash verifizierne
+			$order_id = $_REQUEST['order_id'];
+			
+			if (!isset($order_id) || $order_id <= 0) die(__('Aufrufsfehler!', 'wpsg'));
+			
+			// Hash bilden
+			$hash = preg_replace('/(\+)|(\=)/', 'A', base64_encode(md5('wpShopGermany'.$order_id, $this->get_option("wpsg_salt"))));
+			
+			if ($hash != $_REQUEST['wpsg_done']) 
+			{
+				die(__('Aufrufsfehler!!', 'wpsg'));
+			}
+			
+			$this->shop->basket->initFromDB($order_id);
+			$this->shop->view['basket'] = $this->shop->basket->toArray();
+			$this->shop->view['o_id'] = $order_id;
+			$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
+			$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
+			
+			$content = $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/done.phtml', false);
+						
 		} // private function doneAction()
 		
@@ -387,19 +324,10 @@
 		 * Verarbeitet die Anfragen und leitet anschlieÃend weiter
 		 */
-		public function template_redirect() {
-
-			if (isset($_REQUEST['wpsg_cron'])) {
-				
-				// ersetzt den direkten Aufruf der cron.php
-				
-				$this->shop->callMods('cron');
-				$this->shop->update_option('wpsg_lastCron', time());
-
-				exit;
-				
-			}
-			
-			if (isset($_REQUEST['wpsg_form_data'])) {
-
+		public function wp_loaded()
+		{
+			 
+			if (isset($_REQUEST['wpsg_form_data']))
+			{
+								
 				parse_str($_REQUEST['wpsg_form_data'], $request);
 				$_REQUEST = array_merge_recursive($_REQUEST, $request);
@@ -407,37 +335,34 @@
 			}
 			
-			if (isset($_REQUEST['wpsg']['action']) && $_REQUEST['wpsg']['action'] === 'customeranswer') {
-				
+			if (isset($_REQUEST['wpsg']['action']) && $_REQUEST['wpsg']['action'] == 'customeranswer')
+			{
+
 				// Der Preisdialog wurde beantwortet
 				$_SESSION['wpsg']['priceDialog'] = true;
-				$_SESSION['wpsg']['customertype'] = intval($_REQUEST['wpsg']['customertype']);
-				$_SESSION['wpsg']['checkout']['land'] = intval($_REQUEST['wpsg']['customerCountry']);
-				
-				if (!wpsg_checkInput($_REQUEST['wpsg']['redirect'], WPSG_SANITIZE_URL_LOCAL)) throw \wpsg\Exception::getSanitizeException();
-				
+				$_SESSION['wpsg']['customertype'] = $_REQUEST['wpsg']['customertype'];
+				$_SESSION['wpsg']['checkout']['land'] = $_REQUEST['wpsg']['customerCountry'];
+				 				
 				$this->redirect($_REQUEST['wpsg']['redirect']);
 				
-			} else if (wpsg_isSizedString($_REQUEST['wpsg']['action'], 'updateCheckout')) {
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg']['action'], 'updateCheckout'))
+			{
 				
 				// Checkout Aktualisierung ÃŒber AJAX				
-				if (isset($_REQUEST['wpsg']['checkout']['shipping']) && wpsg_checkInput($_REQUEST['wpsg']['checkout']['shipping'], WPSG_SANITIZE_SHIPPING_KEY)) $_SESSION['wpsg']['checkout']['shipping'] = $_REQUEST['wpsg']['checkout']['shipping'];
-				if (isset($_REQUEST['wpsg']['checkout']['payment']) && wpsg_checkInput($_REQUEST['wpsg']['checkout']['payment'], WPSG_SANITIZE_PAYMENT_KEY)) $_SESSION['wpsg']['checkout']['payment'] = $_REQUEST['wpsg']['checkout']['payment'];
+				if (isset($_REQUEST['wpsg']['checkout']['shipping'])) $_SESSION['wpsg']['checkout']['shipping'] = $_REQUEST['wpsg']['checkout']['shipping']; 
+				if (isset($_REQUEST['wpsg']['checkout']['payment'])) $_SESSION['wpsg']['checkout']['payment'] = $_REQUEST['wpsg']['checkout']['payment'];
 				
 				die("1");
 				
-			} else if (wpsg_isSizedString($_REQUEST['wpsg']['action'], 'widget')) {
-				
-				the_widget('wpsg_basket_widget');
-				
-				die();
-				
-			}
-			 
+			}
+			
 			// Der Warenkorb wurde abgeschickt
-			if (isset($_REQUEST['wpsg_basket_submit'])) {
+			if (isset($_REQUEST['wpsg_basket_submit']))
+			{
 				
 				// Ein Modul hat einen Fehler im Warenkorb entdeckt, zurÃŒck zum Warenkorb leiten
-				if ($this->shop->callMods('basket_checkoutAction', array(&$this)) == false) {
-					
+				if ($this->shop->callMods('basket_checkoutAction', array(&$this)) == false)
+				{
+			 	
 					$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 					
@@ -445,24 +370,24 @@
 				
 			}
-			
+
 			// Warenkorb wurde verarbeitet, soll ein Modul die Umleitung ÃŒbernehmen?
-			if (wpsg_isSizedString($_REQUEST['wpsg_mod_submit'])) {
-				
+			if (wpsg_isSizedString($_REQUEST['wpsg_mod_submit']))
+			{
+				 
 				$this->shop->callMod($_REQUEST['wpsg_mod_submit'], 'basket_submitSuccess');
 				
 			}
 			
-			if (isset($_REQUEST['wpsg']['action']) && $_REQUEST['wpsg']['action'] === 'customerquestion') {
+			if (isset($_REQUEST['wpsg']['action']) && $_REQUEST['wpsg']['action'] == 'customerquestion')
+			{
 				
 				// Das Widget mit der Frage bzgl. der Preisberechnung EU Rotz soll angezeigt werden
 				parent::dispatch();
 				
-				$this->shop->view['defaultCountry_id'] = $this->shop->getFrontendCountry(true);
-				
-				$this->shop->view['url'] = '';
-				if (isset($_REQUEST['wpsg']['url']) && wpsg_checkInput($_REQUEST['wpsg']['url'], WPSG_SANITIZE_URL_LOCAL)) $this->shop->view['url'] = $_REQUEST['wpsg']['url'];
+				$this->shop->view['defaultCountry_id'] = $this->shop->getFrontendCountry(true);				
+				$this->shop->view['url'] = $_REQUEST['wpsg']['url'];
 				
 				$geo_code = wpsg_geo_code();
-				$country_id = $this->db->fetchOne("SELECT L.`id` FROM `".WPSG_TBL_LAND."` AS L WHERE L.`kuerzel` = '".wpsg_q($geo_code)."' ");
+				$country_id = $this->db->fetchOne("SELECT L.`id` FROM `".WPSG_TBL_LAND."` AS L WHERE L.`kuerzel` = '".wpsg_q($geo_code)."' ");				
 				if (wpsg_isSizedInt($country_id)) $this->shop->view['defaultCountry_id'] = $country_id;
 				
@@ -471,107 +396,120 @@
 				die($this->shop->render(WPSG_PATH_VIEW.'/warenkorb/customerquestion.phtml'));
 				
-			} else if (isset($_REQUEST['wpsg']['submit']) && intval($_REQUEST['wpsg']['menge']) > 0 && intval($_REQUEST['wpsg']['produkt_id']) > 0) {
+			}			
+			else if (isset($_REQUEST['wpsg']['submit']) && intval($_REQUEST['wpsg']['menge']) > 0 && intval($_REQUEST['wpsg']['produkt_id']) > 0)
+			{
 
 				// Ein Produktformular wurde abgeschickt
-				// http://wp.home/wpsg4/warenkorb/?wpsg[produkt_id]=6&wpsg[submit]=1&wpsg[menge]=1
-				// https://shop.maennchen1.de/warenkorb/?wpsg[produkt_id]=63&wpsg[submit]=1&wpsg[menge]=1&wpsg_vp[5]=10
 				
 				parent::dispatch();
-				
+				  		
 				$this->shop->callMods('basket_preInsert');
-				
-				$product_key = intval($_REQUEST['wpsg']['produkt_id']);
-				$this->shop->callMods('getProductKeyFromRequest', array(&$product_key, $_REQUEST['wpsg']['produkt_id'], $_REQUEST));
+
+				// Produktdaten
+				$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($_REQUEST['wpsg']['produkt_id']));
 				
 				// Produkt hinzufÃŒgen
-				$amount = intval($_REQUEST['wpsg']['menge']);
-				$bOK = $this->shop->basket->addProduktToSession($product_key, $amount);
-
-				if ($this->shop->get_option('wpsg_afterinsert') == '2') die();
-				
-				if ($this->shop->get_option('wpsg_afterinsert') == '3') {
-					
-					$this->shop->basket->initFromSession(true);
-					
-					$this->shop->view['product_data'] = $this->shop->loadProduktArray($this->shop->getProduktId($product_key));
-					$this->shop->view['oProduct'] = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-					$this->shop->view['product_key'] = $product_key;
-					$this->shop->view['amount_add'] = $amount;
-					$this->shop->view['amount_basket'] = $this->shop->basket->getBasketAmount($product_key);
-					$this->shop->view['product_index'] = $GLOBALS['wpsg_lastInsertIndex'];
-					
-				}
-				
-				if ($this->shop->get_option('wpsg_afterinsert') == '4') {
-					
-					if (wpsg_checkInput($_REQUEST['myReferer'], WPSG_SANITIZE_URL_LOCAL)) $this->redirect($_REQUEST['myReferer']);
-					else throw \wpsg\Exception::getSanitizeException();
-					
+				$bOK = $this->shop->basket->addProduktToSession($_REQUEST['wpsg']['produkt_id'], $_REQUEST['wpsg']['menge']);
+
+				if ($this->shop->get_option('wpsg_afterinsert') == '3')
+				{
+				
+					$this->shop->view['product_data'] = $product_data;
+					$this->shop->view['product_key'] = $_REQUEST['wpsg']['produkt_id'];
+					$this->shop->view['amount_add'] = $_REQUEST['wpsg']['menge'];
+					$this->shop->view['amount_basket'] = $this->shop->basket->getBasketAmount($_REQUEST['wpsg']['produkt_id']);
+						
 				}
 				
 				// Erfolgsmeldung hinzufÃŒgen
-				if ($bOK === true) $this->shop->addFrontendMessage(__('Produkt erfolgreich in den Warenkorb gelegt.', 'wpsg'));
-				else if ($bOK === -1) {
-					
+				if ($bOK === true) $this->shop->addFrontendMessage(__('Produkt erfolgreich in den Warenkorb gefÃŒgt.', 'wpsg'));
+				else if ($bOK === -1) 
+				{ 
+
 					// Hier Warenkorb ohne Meldung anzeigen / FÃŒr den Fall, dass das Produkt nur einmal im Warenkorb auftauchen darf
-					
-				} else {
-					
-					if ($this->shop->get_option('wpsg_afterinsert') == '3') {
-						
-						echo $this->shop->render(WPSG_PATH_VIEW.'warenkorb/messageDialog.phtml');
-						
-						exit;
-						
-					}
+				}
+				else 
+				{
+				 
+					if ($this->shop->get_option('wpsg_afterinsert') == '3')
+					{
+					
+						$this->shop->view['error'] = true;						
+						die($this->shop->render(WPSG_PATH_VIEW.'warenkorb/ajaxDialog.phtml'));
+						
+					}					
 					
 					// Fehler beim hinzufÃŒgen, hier einfach auf der Seite bleiben					
-					
-					if (wpsg_checkInput($_REQUEST['myReferer'], WPSG_SANITIZE_URL_LOCAL)) $this->redirect($_REQUEST['myReferer']);
-					else \wpsg\Exception::getSanitizeException();
-					
-				}
-				
-				if (wpsg_isSizedInt($_REQUEST['wpsg']['ajax'], 1)) {
-					
-					if ($this->shop->get_option('wpsg_afterinsert') == '3') {
-						
-						$this->shop->view['product_data']['preis'] = $this->shop->view['oProduct']->getPrice($product_key, $this->shop->getFrontendTaxview());						
-						$this->shop->view['content'] = $this->shop->render(WPSG_PATH_VIEW.'warenkorb/ajaxDialog.phtml', false);
-						
-						echo $this->shop->render(WPSG_PATH_VIEW.'warenkorb/messageDialog.phtml');
-						
-						exit;
-						
-					} else {
-						
-						echo "1";
-						
-						exit;
-						
-					}
-					
-				} else if (wpsg_isSizedInt($this->get_option('wpsg_afterinsert'), 1)) {
+					$this->redirect($_REQUEST['myReferer']);
+					
+				}
+				
+				if (wpsg_isSizedInt($_REQUEST['wpsg']['ajax'], 1))
+				{
+					
+					if ($this->shop->get_option('wpsg_afterinsert') == '3')
+					{
+				 
+						$this->shop->view['error'] = false;
+						
+						die($this->shop->render(WPSG_PATH_VIEW.'warenkorb/ajaxDialog.phtml'));
+						
+					}
+					else
+					{
+					 						
+						die("1");
+						
+					}
+					
+				}
+				else if (wpsg_isSizedInt($this->get_option('wpsg_afterinsert'), 1))
+				{
 					
 					$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 					
-				} else {
-					
-					if (wpsg_checkInput($_REQUEST['myReferer'], WPSG_SANITIZE_URL_LOCAL)) $this->redirect($_REQUEST['myReferer']);
-					else throw \wpsg\Exception::getSanitizeException();
-					
-				}
-				
-			} else if (isset($_REQUEST['wpsg_basket_ajax'])) {
+				}
+				else
+				{
+					
+					$this->redirect($_REQUEST['myReferer']);
+					
+				}
+								
+			}
+			else if (isset($_REQUEST['wpsg_widget_ajax']))
+			{
+				
+				$this->shop->basket->reset();
+				$this->shop->basket->initFromSession();
+				$this->shop->view['basket'] = $this->shop->basket->toArray();
+				 
+				
+				if (is_array($this->shop->view['basket']) && sizeof($this->shop->view['basket']['produkte']) > 0)
+				{
+					$this->shop->view['countArtikel'] = sizeof($this->shop->view['basket']['produkte']);
+				}
+				else
+				{
+					$this->shop->view['countArtikel'] = 0;
+				}
+				 
+				$this->shop->view['wpsg_versandhinweis'] = $settings['wpsg_versandhinweis'];
+				$this->shop->view['wpsg_widgetsettings'] = $settings;
+				 
+				die($this->shop->render(WPSG_PATH_VIEW.'/warenkorb/index.phtml'));
+				
+			}
+			else if (isset($_REQUEST['wpsg_basket_ajax']))
+			{
 				
 				$content = '';
 				
 				$this->basketAction($content);
-				
-				echo $content;
-				
-				exit;
-				
-			} else if (isset($_REQUEST['wpsg_redirect_basket'])) {
+								
+				die($content);
+			}
+			else if (isset($_REQUEST['wpsg_redirect_basket']))
+			{
 				
 				// Button "ZurÃŒck zum Warenkorb wurde gedrÃŒckt"
@@ -580,5 +518,7 @@
 				$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 				
-			} else if (isset($_REQUEST['wpsg_redirect_checkout'])) {
+			}
+			else if (isset($_REQUEST['wpsg_redirect_checkout']))
+			{
 				
 				// Weiterleitung zum Checkout ohne speichern
@@ -587,36 +527,24 @@
 				$this->redirect($this->shop->getURL(wpsg_ShopController::URL_CHECKOUT));
 				
-			} else if (isset($_REQUEST['wpsg_gutschein_add'])) {
-				
-				if (!isset($_SESSION['wpsg']['errorFields'])) $_SESSION['wpsg']['errorFields'] = [];
+			}
+			else if (isset($_REQUEST['wpsg_gutschein_add']))
+			{
 				
 				// Gutscheincode soll hinzugefÃŒgt werden
-				$code = sanitize_text_field($_REQUEST['wpsg']['gutschein']);
-				
-				$gs_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `code` = '".wpsg_q($code)."' ");
-				
-				// Nur ein Gutschein im Warenkorb mÃ¶glich?
-				if ($this->shop->get_option('wpsg_mod_gutschein_one') === '1') {
-					
-					$arBasket = $this->shop->cache->getShopBasketArray();
-					
-					if (sizeof($arBasket['arCalculation']['voucher']??[]) > 0) {
-					
-						$this->addFrontendError(__('Sie haben bereits einen Gutschein im Warenkorb!', 'wpsg'));
-						$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-						
-					}
-					
-				}
-				
-				if (!isset($gs_db['id']) || $gs_db['id'] <= 0) {
+				$code = $_REQUEST['wpsg']['gutschein'];
+				
+				$gs_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `code` = '".wpsg_q($code)."'");
+				
+				if (!isset($gs_db['id']) || $gs_db['id'] <= 0)
+				{
 					
 					$this->addFrontendError(__('Ein Gutschein mit diesem Code existiert nicht!', 'wpsg'));
-					
-					$_SESSION['wpsg']['errorFields'][] = 'gutschein';
+					$_SESSION['wpsg']['errorFields'][] = 'gutschein';					
 					
 					$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 					
-				} else {
+				}
+				else 
+				{
 					
 					// GÃŒltigkeit des Gutscheins prÃŒfen
@@ -626,5 +554,6 @@
 					$arBasket = $this->shop->cache->getShopBasketArray();
 					
-					if (!(wpsg_time() >= $tStart && wpsg_time() <= $tEnd)) {
+					if (!(wpsg_time() >= $tStart && wpsg_time() <= $tEnd))
+					{
 						
 						// Zeit ist abgelaufen	
@@ -634,80 +563,43 @@
 						$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 						
-					} else {
-						
-						if ($gs_db['o_id'] > 0 && $gs_db['multi'] !== '1') {
+					}
+					else
+					{
+						
+						if ($gs_db['o_id'] > 0)
+						{
 							
 							// Gutschein ist bereits verbraucht
 							$this->addFrontendError(__('Dieser Gutscheincode wurde bereits eingelÃ¶st und ist nicht mehrfach verwendbar.', 'wpsg'));
 							$_SESSION['wpsg']['errorFields'][] = 'gutschein';
-							
-						} else {
-							
-							$bCheckDiscount = true;
-							
-							if ($this->shop->get_option('wpsg_mod_discount_voucher') === '1') {
-								
-								if ($this->shop->callMod('wpsg_mod_discount', 'hasDiscount', [$arBasket]) === true) $bDiscount = true;
-								else $bDiscount = false;
-								
-								if ($bDiscount) {
+							 
+						}
+						else
+						{
+							
+							// Gutschein ist von der grÃ¶Ãe des Warenkorbes begrenzt.
+							if (wpsg_tf($gs_db['minvalue']) > 0 && wpsg_tf($gs_db['minvalue']) > $arBasket['sum']['preis'])
+							{
+								
+								$this->addFrontendError(wpsg_translate(__('Dieser Gutscheincode kann nicht eingelÃ¶st werden, da der Mindestbestellwert von #1# noch nicht erreicht ist.', 'wpsg'), wpsg_ff(wpsg_tf($gs_db['minvalue']), $this->shop->get_option('wpsg_currency'))));
+								$_SESSION['wpsg']['errorFields'][] = 'gutschein';
+								
+							}
+							else
+							{
+							
+								$this->shop->basket->initFromSession();
+								$arProductIDsBasket = $this->shop->basket->getProductIDs();
+								
+								$wrongProducts = array();
+								
+								// ProduktgÃŒltigkeit prÃŒfen
+								if (wpsg_isSizedArray(wpsg_explode(',', $gs_db['products'])))
+								{
 									
-									$this->addFrontendError(__('Dieser Gutscheincode kann nicht eingelÃ¶st werden, da bereits Rabatte angerechnet sind.', 'wpsg'));
-									
-									$_SESSION['wpsg']['errorFields'][] = 'gutschein';
-									
-									$bCheckDiscount = false;
-									
-								}
-								
-							}
-
-							if ($bCheckDiscount) {
-								
-								$oVoucher = wpsg_voucher::getInstance(intval($gs_db['id']));
-								
-								if (!$oVoucher->isUsabel()) {
-									
-									$this->addFrontendError(__('Gutschein kann nicht verwendet werden. Er ist nicht mehr aktiv oder verbraucht.', 'wpsg'));
-									
-								} else {
-									
-									// Gutschein ist von der grÃ¶Ãe des Warenkorbes begrenzt.
-									if (wpsg_tf($gs_db['minvalue']) > 0 && wpsg_tf($gs_db['minvalue']) > $arBasket['sum']['preis']) {
-										
-										$this->addFrontendError(wpsg_translate(__('Dieser Gutscheincode kann nicht eingelÃ¶st werden, da der Mindestbestellwert von #1# noch nicht erreicht ist.', 'wpsg'), wpsg_ff(wpsg_tf($gs_db['minvalue']), $this->shop->get_option('wpsg_currency'))));
-										
-										$_SESSION['wpsg']['errorFields'][] = 'gutschein';
-										
-									} else {
-										
-										$this->shop->basket->initFromSession();
-										$arProductIDsBasket = $this->shop->basket->getProductIDs();
-										
-										try {
-											
-											foreach ($arProductIDsBasket as $product_id) {
-												
-												if (!$oVoucher->isUsabel($product_id)) {
-												
-													$oProduct = wpsg_product::getInstance($product_id);
-													
-													throw new \Exception(
-														wpsg_translate(
-															__('Gutschein ist fÃŒr Produkt "#1#" nicht zulÃ€ssig.', 'wpsg'), $oProduct->getProductName()
-														)
-													);
-												
-												}
-											}
-											
-											$this->addFrontendMessage(__('Gutschein wurde der Bestellung erfolgreich hinzugefÃŒgt.', 'wpsg'));
-											$this->shop->basket->addGutscheinToSession($gs_db['value'], $gs_db['calc_typ'], $gs_db['code'], $gs_db['id']);
-											
-										} catch (\Exception $e) {
-										
-											$this->addFrontendError($e->getMessage());
-										
-										}
+									if (sizeof(array_diff($arProductIDsBasket, wpsg_explode(',', $gs_db['products']))) > 0)
+									{
+										
+										$wrongProducts = array_diff($arProductIDsBasket, wpsg_explode(',', $gs_db['products']));
 										
 									}
@@ -715,6 +607,60 @@
 								}
 								
+								// ProduktgruppengÃŒltigkeit prÃŒfen
+								if (wpsg_isSizedArray(wpsg_explode(',', $gs_db['productgroups'])))
+								{
+									
+									$ProductGroupIDs = wpsg_explode(',', $gs_db['productgroups']);
+									
+									$arProductIDs = $this->db->fetchAssocField("
+										SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`pgruppe` IN (".wpsg_implode(',', $ProductGroupIDs).")
+									");
+									
+									if (sizeof(array_diff($arProductIDsBasket, $arProductIDs)) > 0)
+									{
+										
+										$wrongProducts = array_merge($wrongProducts, array_diff($arProductIDsBasket, $arProductIDs));
+										
+									}
+									
+								}
+															
+								if (wpsg_isSizedArray($wrongProducts))
+								{
+									
+									if (sizeof($wrongProducts) === 1)
+									{
+										
+										$product = $this->shop->loadProduktArray($wrongProducts[0]);
+										$this->addFrontendError(wpsg_translate(__('Gutschein konnte nicht hinzugefÃŒgt werden, da er fÃŒr das Produkt #1# nicht zulÃ€ssig ist.', 'wpsg'), $product['name']));		
+										
+									}
+									else
+									{
+									
+										$arProductNames = array();
+										foreach ($wrongProducts as $product_id)
+										{
+											
+											$product_data = $this->shop->loadProduktArray($product_id);
+											$arProductNames[] = $product_data['name'];
+											
+										}
+										
+										$this->addFrontendError(wpsg_translate(__('Gutschein konnte nicht hinzugefÃŒgt werden, da er fÃŒr die Produkte #1# nicht zulÃ€ssig ist.', 'wpsg'), wpsg_implode(', ', $arProductNames)));
+										
+									}
+										
+								}
+								else
+								{
+	
+									$this->addFrontendMessage(__('Gutschein wurde der Bestellung erfolgreich hinzugefÃŒgt.', 'wpsg'));							
+									$this->shop->basket->addGutscheinToSession($gs_db['value'], $gs_db['calc_typ'], $gs_db['code'], $gs_db['id']);
+									
+								}
+								
 							}
-							
+
 						}
 						
@@ -725,51 +671,52 @@
 				}
 				
-			} else if (isset($_REQUEST['wpsg_order'])) {
-				
+			}			
+			else if (isset($_REQUEST['wpsg_order']))
+			{
+		 
 				parent::dispatch();
-								
-				$this->shop->checkCustomerPresetCountry();
 				
 				// Bestellung abschlieÃen
-				$this->shop->basket->initFromSession(true);
-				
-				// Basket muss aufgebaut sein
-				$this->shop->checkShippingAvailable();
-				$this->shop->checkPaymentAvailable();            
-				$this->shop->checkCustomerPreset();
-				 
-				\wpsg\wpsg_calculation::getSessionCalculation()->update();
-				
+				$this->shop->basket->initFromSession();
+
 				$bOK = $this->shop->basket->checkCheckout();
 				
-				if ($bOK) {
+				if ($bOK)
+				{ 
 					
 					$bModulError = false; $this->shop->callMods('checkFinaly', array(&$bModulError));
 					
-					if ($bModulError === true) {
+					if ($bModulError === true)
+					{
 						
 						$this->redirect($this->shop->getURL(wpsg_ShopController::URL_OVERVIEW));
 						
-					} else if (!$this->shop->hasMod('wpsg_mod_ordercondition') && wpsg_getStr($_REQUEST['wpsg']['agb']) != '1' ) {
+					}
+					else if (!$this->shop->hasMod('wpsg_mod_ordercondition') && $_REQUEST['wpsg']['agb'] != '1' )
+					{
 						
 						$this->addFrontendError(
-							wpsg_translate(
-								__('Sie mÃŒssen unsere #1# und #2# gelesen haben, um eine Bestellung durchzufÃŒhren! Bitte setzen Sie unten das entsprechende HÃ€kchen!', 'wpsg'),
-								'<a href="'.$this->shop->getURL(wpsg_ShopController::URL_AGB).'">'.__('AGB', 'wpsg').'</a>',
-								'<a href="'.$this->shop->getURL(wpsg_ShopController::URL_WIDERRUF).'">'.__('Widerrufsbelehrung', 'wpsg').'</a>'
-							)
+								wpsg_translate(
+										__('Sie mÃŒssen unsere #1# und #2# gelesen haben, um eine Bestellung durchzufÃŒhren! Bitte setzen Sie unten das entsprechende HÃ€kchen!', 'wpsg'),
+										'<a href="'.$this->shop->getURL(wpsg_ShopController::URL_AGB).'">'.__('AGB', 'wpsg').'</a>',
+										'<a href="'.$this->shop->getURL(wpsg_ShopController::URL_WIDERRUF).'">'.__('Widerrufsbelehrung', 'wpsg').'</a>'
+								)
 						);
 						
 						$this->redirect($this->shop->getURL(wpsg_ShopController::URL_OVERVIEW));
-						
-					} else { 
+												
+					}
+					else 
+					{
 						
 						$order_id = $this->shop->basket->save();
-						
+												
 						$this->redirect($this->shop->getDoneURL($order_id));
 						
 					}
 					
-				} else {
+				}
+				else
+				{
 					
 					$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
@@ -777,23 +724,25 @@
 				}
 				
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'remove') && isset($_REQUEST['wpsg_produkt'])) {
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'remove') && isset($_REQUEST['wpsg_produkt']))
+			{
 				
 				parent::dispatch();
 				
-				if (preg_match('/^voucher_(\d+)?/', $_REQUEST['wpsg_produkt'], $m)) {
-					
-					foreach ($_SESSION['wpsg']['gs'] as $gs_k => $gs) {
-						
-						if (intval($gs['id']) === intval($m[1])) unset($_SESSION['wpsg']['gs'][$gs_k]);
-						
-					}
-					
+				if ($_REQUEST['wpsg_produkt'] == 'gs')
+				{
+				
 					$this->shop->addFrontendMessage(__('Gutschein erfolgreich entfernt.', 'wpsg'));
 					
-				} else {
-					
+					unset($_SESSION['wpsg']['gs']);
+				
+				}
+				else
+				{
+				
 					// Produkt entfernen
-					if ($this->shop->basket->removeProduktFromSession(intval($_REQUEST['wpsg_produkt']))) {
-						
+					if ($this->shop->basket->removeProduktFromSession($_REQUEST['wpsg_produkt']))
+					{
+					
 						// Erfolgsmeldung hinzufÃŒgen
 						$this->shop->addFrontendMessage(__('Produkt erfolgreich entfernt.', 'wpsg'));
@@ -802,10 +751,12 @@
 					
 					$this->shop->callMods('basket_afterRemove');
-					
-				}
-				
+				
+				}
+					
 				$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 				
-			} else if (isset($_REQUEST['wpsg_basket_refresh'])) {
+			}
+			else if (isset($_REQUEST['wpsg_basket_refresh']))
+			{
 				
 				parent::dispatch();
@@ -814,24 +765,26 @@
 				
 				$bError = false;
-				
+				//die(wpsg_debug($_REQUEST['wpsg']['menge']));
 				// Warenkorb aktualisieren
-
-				foreach ($_REQUEST['wpsg']['menge'] as $product_index => $produkt_menge) {
+								
+				foreach ($_REQUEST['wpsg']['menge'] as $product_index => $produkt_menge)
+				{
 					
 					$product_key = $_SESSION['wpsg']['basket'][$product_index]['id'];
-					
-					if (!wpsg_checkInput($product_key, WPSG_SANITIZE_PRODUCTKEY)) \wpsg\Exception::getSanitizeException();
-					
 					$product_data = $this->shop->cache->loadProduct($this->shop->getProduktId($product_key));
 					
-					if ($product_data['basket_multiple'] == 1) {
+					if ($product_data['basket_multiple'] == 1)
+					{
 						
 						// Mehrfach mit beliebiger Menge
 						if (!$this->shop->basket->updateProduktFromSession($product_index, $produkt_menge)) $bError = true;
 						
-					} else if ($product_data['basket_multiple'] == 2) {
+					}
+					else if ($product_data['basket_multiple'] == 2)
+					{
 						
 						// Mehrfach mit Menge 1
-						if ($produkt_menge > 1) {
+						if ($produkt_menge > 1)
+						{
 							
 							// Grundprodukt auf 1 setzen
@@ -841,5 +794,7 @@
 							$this->shop->callMods('basket_preMultiple', array($product_index));
 							
-							$bOK = true; for ($i = 1; $i < $produkt_menge; $i ++) {
+							$bOK = true;
+							for ($i = 1; $i < $produkt_menge; $i ++)
+							{
 								
 								$bOK = $bOK && $this->shop->basket->addProduktToSession($product_key, 1);
@@ -851,5 +806,7 @@
 							if (!$bOK) $bError = true;
 							
-						} else {
+						}
+						else
+						{
 							
 							// Menge ist 1 gebliegen, hier normal aktualisieren
@@ -858,21 +815,26 @@
 						}
 						
-					} else if ($product_data['basket_multiple'] == 4) {
-						
-						if (intval($produkt_menge) !== 1) {
+					}
+					else if ($product_data['basket_multiple'] == 4)
+					{
+						
+						if ($produkt_menge != "1")
+						{
 							
 							$this->shop->addFrontendError(__('Produkt darf nur einmal im Warenkorb auftauchen.', 'wpsg'));
-							
+														
 						}
 						
-					} else {
-						
+					}
+					else
+					{
+
 						// Nur einmal mit beliebiger Menge
 						if (!$this->shop->basket->updateProduktFromSession($product_index, $produkt_menge)) $bError = true;
 						
 					}
-					
+										
 				} // foreach
-				
+								
 				$this->setBasketData();
 				$this->shop->cache->clearShopBasketArray();
@@ -880,5 +842,6 @@
 				$this->shop->callMods('basket_afterUpdate', array(&$bError));
 				
-				if (!$bError) {
+				if (!$bError)
+				{
 					
 					// Fehler ist aufgetreten
@@ -889,41 +852,29 @@
 				$this->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 				
-			} else if (wpsg_isSizedArray($_REQUEST['wpsg']['checkout']) && !isset($_REQUEST['wpsg_mod'])) {
-
-				// Der AusschluÃ von wpsg_mod ist nÃ¶tig, da PayPal PLUS die Versandart Ã€ndert
-
-                if (wpsg_isSizedString($this->shop->basket->arCheckout['email']) && $this->shop->get_option('wpsg_save_order_after_mail') === '1') {
-
-                    // Speichern in der Datenbank
-                    $this->shop->basket->save(false, false, true);
-
-                }
-
+			} 
+			// Der AusschluÃ von wpsg_mod ist nÃ¶tig, da PayPal PLUS die Versandart Ã€ndert
+			else if (isset($_REQUEST['wpsg']['checkout']) && !isset($_REQUEST['wpsg_mod']))
+			{
+			
 				// Checkout wurde abgeschickt
 				parent::dispatch();
 				
-				if (wpsg_isSizedInt($_SESSION['wpsg']['customerCountry']) && $_SESSION['wpsg']['customerCountry'] != $_SESSION['wpsg']['land']) $_SESSION['wpsg']['customerCountry'] = intval($_SESSION['wpsg']['land']);
-				
-				$this->shop->callMods('doCheckout');				
+				if (wpsg_isSizedInt($_SESSION['wpsg']['customerCountry']) && $_SESSION['wpsg']['customerCountry'] != $_SESSION['wpsg']['land']) $_SESSION['wpsg']['customerCountry'] = $_SESSION['wpsg']['land'];
+				
+				$this->shop->callMods('doCheckout');
+				 
 				$this->shop->basket->initFromSession(true);
 				
-				// Basket muss aufgebaut sein
-				$this->shop->checkShippingAvailable();
-				$this->shop->checkPaymentAvailable();
-				$this->shop->checkCustomerPreset();
-				
-				// Checkout1 muss immer geprÃŒft werden, ist z.B. fÃŒr das Kundenmodul notwendig!				
+				// Checkout1 muss immer geprÃŒft werden, ist z.B. fÃŒr das Kundenmodul notwendig!
 				$bOK = $this->shop->basket->checkCheckout(1);
 				
-				if (isset($_REQUEST['wpsg_checkout'])) {
+				if (isset($_REQUEST['wpsg_checkout']))
+				{
 					
 					// Ãnderungen bei der Lieferadresse nach dem "overview" beachten
-					if (isset($_REQUEST['wpsg']['checkout']['act_checkout_shippingadress'])) {
-						
-						if ($_REQUEST['wpsg']['checkout']['act_checkout_shippingadress'] !== 'act') unset($_SESSION['wpsg']['checkout']['act_checkout_shippingadress']);
-						
-					}
-					
-					if ($this->shop->hasMod('wpsg_mod_onepagecheckout')) {
+					if ($_REQUEST['wpsg']['checkout']['act_checkout_shippingadress'] !== 'act') unset($_SESSION['wpsg']['checkout']['act_checkout_shippingadress']);
+					
+					if ($this->shop->hasMod('wpsg_mod_onepagecheckout'))
+					{
 						
 						$bOK = $bOK && $this->shop->basket->checkCheckout(2);
@@ -931,18 +882,19 @@
 						$target_error = $this->shop->getURL(wpsg_ShopController::URL_CHECKOUT);
 						$target = $this->shop->getURL(wpsg_ShopController::URL_OVERVIEW);
-						
-					} else {
+						 
+					}
+					else
+					{
 						
 						$target_error = $this->shop->getURL(wpsg_ShopController::URL_CHECKOUT);
 						
-						$this->shop->checkShippingAvailable();
-						$this->shop->checkPaymentAvailable();            
-						$this->shop->checkCustomerPreset();
-						
-						if (array_key_exists($this->shop->basket->arCheckout['shipping'], $this->shop->arShipping) && array_key_exists($this->shop->basket->arCheckout['payment'], $this->shop->arPayment) && $this->shop->get_option('wpsg_skip_checkout2') === '1' && $this->shop->basket->arCheckout['payment'] != 20) {
+						if (array_key_exists($this->shop->basket->arCheckout['shipping'], $this->shop->arShipping) && array_key_exists($this->shop->basket->arCheckout['payment'], $this->shop->arPayment) && $this->shop->get_option('wpsg_skip_checkout2') === '1')
+						{
 							
 							$target = $this->shop->getURL(wpsg_ShopController::URL_OVERVIEW);
 							
-						} else {
+						}
+						else
+						{
 							
 							$target = $this->shop->getURL(wpsg_ShopController::URL_CHECKOUT2);
@@ -951,19 +903,9 @@
 						
 					}
-					
-				} else if (isset($_REQUEST['wpsg_checkout2'])) {
-					
-					$this->shop->checkCustomerPresetCountry();
-				
-					// Bestellung abschlieÃen
-					//$this->shop->basket->initFromSession(true);
-					//die("K".wpsg_debug(array_keys($this->shop->arShipping)));
-					// Basket muss aufgebaut sein
-					//$this->shop->checkShippingAvailable();
-					//$this->shop->checkPaymentAvailable();
-					//$this->shop->checkCustomerPreset();
-					
-					\wpsg\wpsg_calculation::getSessionCalculation()->update();
-					
+																				
+				}
+				else if (isset($_REQUEST['wpsg_checkout2']))
+				{
+										
 					$bOK = $this->shop->basket->checkCheckout(2);
 					
@@ -971,37 +913,33 @@
 					$target = $this->shop->getURL(wpsg_ShopController::URL_OVERVIEW);
 					
-				} else {
-					
+				} 
+				else
+				{
+					 
 					die(__('Unerwarteter Fehler!', 'wpsg'));
 					
 				}
 				
-				// Speziell fÃŒr PayPal PLUS, da an den IFrame gesendet wird
-				if (wpsg_getStr($_REQUEST['wpsg_checkout']) === 'ppp') {
-					
-					unset($_SESSION['wpsg']['checkout']['payment']);
-					
-					if (!$bOK) die('<script> parent.wpsg_ppp_handleError(); </script>');
-					else die('<script> parent.wpsg_ppp_run(); </script>');
-					
-				}
-				
-				if (!$bOK) {
+				if (!$bOK)
+				{
 					
 					// Es sind Fehler aufgetreten, wieder zum Checkout leiten
 					$this->redirect($target_error);
 					
-				} else {
+				}
+				else
+				{
 					
 					$this->redirect($target);
 					
 				}
-				
+					
 				die();
 				
-			}
-			
-		} // public function template_redirect()
-		
+			} 
+			
+		} // public function content_filter()
+				
 	} // class wpsg_BasketController extends wpsg_SystemController
 
+?>
Index: /controller/wpsg_OrderController.class.php
===================================================================
--- /controller/wpsg_OrderController.class.php	(revision 8528)
+++ /controller/wpsg_OrderController.class.php	(revision 5261)
@@ -1,11 +1,10 @@
 <?php
-
-    use \wpsg\M1;
 
 	/**
 	 * Controller fÃŒr die Bestellungen
 	 */
-	class wpsg_OrderController extends wpsg_SystemController {
-
+	class wpsg_OrderController extends wpsg_SystemController
+	{
+		
 		/**
 		 * Ãbernimmt die Vertreilung der Anfragen
@@ -13,44 +12,7 @@
 		public function dispatch()
 		{
-
+			
 			parent::dispatch();
-
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'productData')) {
-
-				$this->productDataAction();
-				
-			} else if (wpsg_isSizedString($_REQUEST['subaction'], 'add')) {
-			    
-				check_admin_referer('wpsg-order-add');
-			 
-			    $this->addAction();
-			    
-            } else if (wpsg_isSizedString($_REQUEST['subaction'], 'autocomplete')) {
-			    
-			    $this->autocompleteAction();
-			    
-            } else if (wpsg_isSizedString($_REQUEST['action'], 'updateOrder')) {
-			    
-			    $this->updateOrderAction();
-			    
-            } if (wpsg_isSizedString($_REQUEST['subaction'], 'shippingData')) {
-				$this->shippingDataAction();
-			}
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'paymentData'))
-			{
-				$this->paymentDataAction();
-			} 
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'itemOrderData'))
-			{
-				$this->itemOrderDataAction();
-			}
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'foldedItemsData'))
-			{
-				$this->foldedItemsDataAction();
-			}
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'discountData'))
-			{
-				$this->discountDataAction();
-			}
+			
 			if (wpsg_isSizedString($_REQUEST['action'], 'view'))
 			{
@@ -60,9 +22,6 @@
 			{
 				$this->switchStatusAction();
-			} else if (wpsg_isSizedString($_REQUEST['action'], 'save')) {
-
-			    $this->saveAction();
-
-            } else if (wpsg_isSizedString($_REQUEST['action'], 'setAdminComment'))
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'setAdminComment'))
 			{
 				$this->setAdminCommentAction();
@@ -81,674 +40,10 @@
 			}
 			else
-			{
+			{			
 				$this->indexAction();
 			}
-
+			
 		} // public function dispatch()
-
-        public function updateOrderAction() {
-
-			$_REQUEST['shipping_price'] = wpsg_sinput("text_field", $_REQUEST['shipping_price']);
-	        $_REQUEST['payment_price'] = wpsg_sinput("text_field", $_REQUEST['payment_price']);
-
-	        $_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-
-		    $oCalculation = new \wpsg\wpsg_calculation();
-		    $oCalculation->fromDB($_REQUEST['edit_id']);
-			
-            $oCalculation->addShipping(
-				$_REQUEST['shipping_price'],
-				$this->shop->getBackendTaxview(),
-                $this->shop->arShipping[$_REQUEST['shipping_key']]['tax_key'],
-				$_REQUEST['shipping_key']
-            );
-
-            $oCalculation->addPayment(
-                $_REQUEST['payment_price'],
-				$this->shop->getBackendTaxview(),
-                $this->shop->arPayment[$_REQUEST['payment_key']]['tax_key'],
-				$_REQUEST['payment_key']
-            );
-
-            $oCalculation->toDB($_REQUEST['edit_id']);
-
-            $this->shop->view['oCalculation'] = $oCalculation; 
-            
-            wpsg_header::JSONData([
-                'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-            ]);
-            
-        } // public function updateOrderAction()
-        
-        public function autocompleteAction() {
-
-            $arReturn = [];
-		    
-		    $arCustomer = wpsg_customer::find(Array('s' => $_REQUEST['term']));		    
-		    		    
-		    foreach ($arCustomer as $oCustomer) {
-		        
-		        $arReturn[] = Array(
-		            'id' => 'ID:'.$oCustomer->id.' / '.$oCustomer->getLabel().' ('.$oCustomer->email.')',
-                    'value' => 'ID:'.$oCustomer->id.' / '.$oCustomer->getLabel().' ('.$oCustomer->email.')'  
-                );
-		        
-            }
-		    
-            wpsg_header::JSONData($arReturn);
-            
-		    exit;
-		    
-        } // public function autocompleteAction()
-        
-        public function addAction() {
- 
-            $customer_id = false;
-            
-            if (!wpsg_isSizedString($_REQUEST['search_customer'])) $this->addBackendError(__('Bitte einen Kunden definieren.', 'wpsg'));
-            else {
-
-	            $_REQUEST['search_customer'] = wpsg_sinput("text_field", $_REQUEST['search_customer']);
-
-                // ID:3 / Max Mustermann (buyer@maennchen1.de)
-                preg_match_all('/^ID:(\d+)?/i', $_REQUEST['search_customer'], $m);
-                
-                if (wpsg_isSizedInt($m[1][0])) {
-                    
-                    $customer_id = $m[1][0];
-                    
-                } else {
-
-                    $customer_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_KU."` WHERE `email` = '".wpsg_q($_REQUEST['search_customer'])."' ");
-                                 
-                    if (!wpsg_isSizedInt($customer_id)) {
-                    
-                        $customer_id = $this->db->ImportQuery(WPSG_TBL_KU, Array(
-                            'email' => wpsg_q($_REQUEST['search_customer'])
-                        ));
-                        
-                        $customer_nr = $this->shop->buildKNR($customer_id);
-                                                
-                        $adress_id = $this->db->ImportQuery(WPSG_TBL_ADRESS, [
-                            'cdate' => 'NOW()',
-                            'land' => wpsg_q($this->shop->getDefaultCountry()->id)
-                        ]);
-
-                        $this->db->UpdateQuery(WPSG_TBL_KU, [
-                            'knr' => wpsg_q($customer_nr),
-                            'adress_id' => wpsg_q($adress_id)
-                        ], " `id` = '".wpsg_q($customer_id)."' ");
-                        
-                    }
-                    
-                } 
-                
-                $oCustomer = wpsg_customer::getInstance($customer_id);
-                $oTargetCountry = wpsg_country::getInstance($oCustomer->getCountryID());
-                                
-            }
-                        
-            if (!wpsg_isSizedInt($customer_id)) $this->addBackendError(__('Es konnte kein Kunde gefunden werden.', 'wpsg'));
-            
-            if ($this->hasBackendError()) {
-                     
-                $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&search_customer='.$_REQUEST['search_customer']);
-                
-            } else {
-
-                $oCustomer = wpsg_customer::getInstance($customer_id);
-				$oDefaultCountry = $this->shop->getDefaultCountry();                
-                								
-                $order_id = $this->db->ImportQuery(WPSG_TBL_ORDER, Array(
-                    'payment_key' => wpsg_q($_REQUEST['add_payment']),
-                    'payment_bruttonetto' => wpsg_q($this->shop->getBackendTaxview()),
-					'payment_tax_key' => wpsg_q($this->shop->arPayment[$_REQUEST['add_payment']]['mwst_key']??''),
-					'payment_set' => wpsg_q($this->shop->arPayment[$_REQUEST['add_payment']]['price']),
-					'shipping_key' => wpsg_q($_REQUEST['add_shipping']),
-					'shipping_bruttonetto' => wpsg_q($this->shop->getBackendTaxview()),
-					'shipping_tax_key' => wpsg_q($this->shop->arShipping[$_REQUEST['add_shipping']]['mwst_key']??''),
-					'shipping_set' => wpsg_q($this->shop->arShipping[$_REQUEST['add_shipping']]['price']),
-                    'price_frontend' => $this->shop->getFrontendTaxview(),
-                    'cdate' => 'NOW()',
-                    'adress_id' => wpsg_q($oCustomer->adress_id),
-                    'k_id' => wpsg_q($customer_id),
-					'calculation' => '1',
-					'shop_country_id' => wpsg_q($oDefaultCountry->id),
-					'shop_country_tax' => wpsg_q($oDefaultCountry->mwst),
-					'shop_country_tax_a' => wpsg_q($oDefaultCountry->mwst_a),
-					'shop_country_tax_b' => wpsg_q($oDefaultCountry->mwst_b),
-					'shop_country_tax_c' => wpsg_q($oDefaultCountry->mwst_c),
-					'shop_country_tax_d' => wpsg_q($oDefaultCountry->mwst_d),
-					'target_country_id' => wpsg_q($oTargetCountry->id),
-					'target_country_tax' => wpsg_q($oTargetCountry->mwst),
-					'target_country_tax_a' => wpsg_q($oTargetCountry->mwst_a),
-					'target_country_tax_b' => wpsg_q($oTargetCountry->mwst_b),
-					'target_country_tax_c' => wpsg_q($oTargetCountry->mwst_c),
-					'target_country_tax_d' => wpsg_q($oTargetCountry->mwst_d)
-                ));
-                                                 
-                $onr = $this->shop->buildONR($order_id, $customer_id,$oCustomer->getNr());
-                
-                $this->db->UpdateQuery(WPSG_TBL_ORDER, Array(
-                    'onr' => wpsg_q($onr) 
-                ), " `id` = '".wpsg_q($order_id)."' ");
-                
-                $this->db->ImportQuery(WPSG_TBL_OL, Array(
-                    'o_id' => wpsg_q($order_id),
-                    'cdate' => 'NOW()',
-                    'title' => __('Bestellung im Backend angelegt.', 'wpsg'),
-                    'mailtext' => ''
-                ));
-                
-                $this->addBackendMessage(__('Die neue Bestellung wurde vorbereitet.', 'wpsg'));
-	
-				$this->redirect(wpsg_admin_url('Order', 'view', ['edit_id' => $order_id]));
-                                
-            }
-            
-            exit;
-		    
-        } // public function addAction()
-        
-		/**
-		 * Wird aufgerufen wenn die Produkte bearbeitet werden
-		 */
-		public function productDataAction()
-		{
-
-			$t1 = 0;
-			$oid = 0;
-			$option = $this->shop->get_option('wpsg_preisangaben');
-			if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-
-			// Steuersatz berechnen
-			$oOrder = wpsg_order::getInstance($oid);
-			$country_id = $oOrder->getCustomer()->getCountryId();
-			//$country_id = 1;
-			$country = wpsg_country::getInstance($country_id);
-
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add')
-			{
-				//url: 'wp-admin/admin.php?page=wpsg-Admin&subaction=productData&do=add&edit_id=' + this.o_id + '&p_id=' + pid + '&noheader=1',
-				if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-				if (isset($_REQUEST['p_id'])) $pid = wpsg_q($_REQUEST['p_id']);
-
-				$arProd = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($pid)."'");
-
-				$data = array('o_id' => $oid, 'p_id' => $pid, 'productkey' => $pid,
-				              'menge' => 1, 'mwst_key' => $arProd['mwst_key'], 'mod_vp_varkey' => $pid,
-				              'allowedpayments' => $arProd['allowedpayments'],
-				              'allowedshipping' => $arProd['allowedshipping']
-				);
-
-				if ($this->shop->hasMod('wpsg_mod_weight')) $data['weight'] = $arProd['weight'];
-				// FÃŒllmenge nicht in WPSG_TBL_ORDERPRODUCT
-				//if ($this->shop->hasMod('wpsg_mod_fuellmenge')) $data['fmenge'] = $arProd['fmenge'];
-
-				$noMwSt = false;
-				if (isset($_REQUEST['noMwSt']))
-				{
-					if (wpsg_q($_REQUEST['noMwSt']) == 1) $noMwSt = true;
-					$tax_key = $arProd['mwst_key'];
-					if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				}
-
-				$price = $arProd['preis'];
-
-				if ($option == WPSG_NETTO)
-				{
-					$netto = $price;
-					$brutto = $price * ((100.0 + $tax_value) / 100.0);
-
-				}
-				else
-				{
-					$netto = $price / ((100.0 + $tax_value) / 100.0);
-					$brutto = $price;
-
-				}
-				$diff = $brutto - $netto;
-
-				$count = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($oid)."' ");
-
-				$data['product_index'] = $count;
-				$data['price'] = $price;
-				$data['price_netto'] = $netto;
-				$data['price_brutto'] = $brutto;
-				////$data['mwst_value'] = $diff;
-				$data['mwst_value'] = $tax_value;
-
-				$op_id = $this->db->ImportQuery(WPSG_TBL_ORDERPRODUCT, $data);
-				//$this->db->UpdateQuery(WPSG_TBL_ORDER, $ogs, "`id` = '".$oid."'");
-
-			}
-			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove')
-			{
-				// Order-Produkt lÃ¶schen
-				//url: 'wp-admin/admin.php?page=wpsg-Admin&subaction=productData&do=remove&edit_id=' + o_id + '&p_id=' + op_id + '&noheader=1',
-				if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-				if (isset($_REQUEST['op_id'])) $opid = wpsg_q($_REQUEST['op_id']);
-
-				$this->db->Query("DELETE FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `id` = '".wpsg_q($opid)."' ");
-
-			}
-			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'change')
-			{
-				//url1 = 'wp-admin/admin.php?page=wpsg-Admin&subaction=productData&do=change&edit_id=' + this.o_id + '&op_id=' + this.op_id + '&p_id=' + pid + '&noheader=1';
-				if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-				if (isset($_REQUEST['p_id'])) $pid = wpsg_q($_REQUEST['p_id']);
-				if (isset($_REQUEST['op_id'])) $opid = wpsg_q($_REQUEST['op_id']);
-
-				$arProd = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($pid)."'");
-
-				//$data = array('o_id' => $oid, 'p_id' => $pid, 'productkey' => $pid,
-				//		'mod_vp_varkey' => $pid,
-				//		'allowedpayments' => $arProd['allowedpayments'],
-				//		'allowedshipping' => $arProd['allowedshipping']
-				//);
-
-				if ($this->shop->hasMod('wpsg_mod_weight')) $data['weight'] = $arProd['weight'];
-				// FÃŒllmenge nicht in WPSG_TBL_ORDERPRODUCT
-				//if ($this->shop->hasMod('wpsg_mod_fuellmenge')) $data['fmenge'] = $arProd['fmenge'];
-
-				$pval = abs(wpsg_tf($_REQUEST['p_val']));
-				$pme = abs(wpsg_tf($_REQUEST['p_me']));
-
-				$noMwSt = false;
-				if (isset($_REQUEST['noMwSt']))
-				{
-					if (wpsg_q($_REQUEST['noMwSt']) == 1) $noMwSt = true;
-					//$tax_key = $arProd['mwst_key'];
-					$tax_key = wpsg_q($_REQUEST['p_mwst']);
-					if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				}
-
-				$price = $pval;
-
-				if ($option == WPSG_NETTO)
-				{
-					$netto = $price;
-					$brutto = $price * ((100.0 + $tax_value) / 100.0);
-
-				}
-				else
-				{
-					$netto = $price / ((100.0 + $tax_value) / 100.0);
-					$brutto = $price;
-
-				}
-				$diff = $brutto - $netto;
-
-				$data['mwst_key'] = wpsg_q($_REQUEST['p_mwst']);
-				$data['menge'] = $pme;
-				$data['price'] = $price;
-				$data['price_netto'] = $netto;
-				$data['price_brutto'] = $brutto;
-				////$data['mwst_value'] = $diff;
-				$data['mwst_value'] = $tax_value;
-
-				$this->db->UpdateQuery(WPSG_TBL_ORDERPRODUCT, $data, "`id` = '".$opid."'");
-
-			}
-
-			$this->correctPrice($oid);
-
-			// Order-Daten sammeln und Tabelle neu generieren
-			$basket = new wpsg_basket();
-			$basket->initFromDB($oid, true);
-			$this->shop->view['basket'] = $basket->toArray(true);
-
-			$this->shop->view['colspan'] = 3;
-			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/order/view_orderdata.phtml');
-
-			exit;
-
-		} // public function productDataAction()
-
-		public function correctPrice($oid)
-		{
-
-			// Steuersatz berechnen
-			$oOrder = wpsg_order::getInstance($oid);
-			$country_id = $oOrder->getCustomer()->getCountryId();
-			//$country_id = 1;
-			$country = wpsg_country::getInstance($country_id);
-
-			// Tabelle Order die Preise korrigieren
-			$arOrderProd = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($oid)."'");
-
-			$data = array();
-			$data['price_gesamt'] = 0;
-			$data['price_gesamt_netto'] = 0;
-			$data['price_gesamt_brutto'] = 0;
-
-			foreach ($arOrderProd as $p)
-			{
-
-				$tax_key = $p['mwst_key'];
-				//if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				$tax_value = $country->getTax($tax_key);
-
-				if ($option == WPSG_NETTO)
-				{
-					$price = $p['menge'] * $p['price_netto'];
-					$data['price_gesamt'] += $price;
-					$data['price_gesamt_netto'] += $price;
-					$data['price_gesamt_brutto'] += $price * ((100.0 + $tax_value) / 100.0);
-
-				}
-				else
-				{
-					$price = $p['menge'] * $p['price_brutto'];
-					$data['price_gesamt'] += $price;
-					$data['price_gesamt_netto'] += $price / ((100.0 + $tax_value) / 100.0);
-					$data['price_gesamt_brutto'] += $price;
-
-				}
-			}
-
-			// Zusatzkosten (Gutschein, Rabatt, Versand, Zahlung) zusammenfassen
-			$p = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($oid)."'");
-			$zusatz = $p['price_gs'] * -1;
-			$zusatz_netto = $p['price_gs_netto'] * -1;
-			$zusatz_brutto = $p['price_gs_brutto'] * -1;
-			$zusatz -= $p['price_rabatt'];
-			$zusatz_netto -= $p['price_rabatt_netto'];
-			$zusatz_brutto -= $p['price_rabatt_brutto'];
-			$zusatz += $p['price_shipping'];
-			$zusatz_netto += $p['price_shipping_netto'];
-			$zusatz_brutto += $p['price_shipping_brutto'];
-			$zusatz += $p['price_payment'];
-			$zusatz_netto += $p['price_payment_netto'];
-			$zusatz_brutto += $p['price_payment_brutto'];
-
-			$data['price_gesamt'] += $zusatz;
-			$data['price_gesamt_netto'] += $zusatz_netto;
-			$data['price_gesamt_brutto'] += $zusatz_brutto;
-
-			$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".$oid."'");
-
-		}
-
-		/**
-		 * Wird aufgerufen, wenn die Zahlungsart verÃ€ndert wird
-		 */
-		public function paymentDataAction()
-		{
-			$pid = 0;
-			$oid = 0;
-			$pval = 0.0;
-			$option = $this->shop->get_option('wpsg_preisangaben');
-			if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-			if (isset($_REQUEST['p_id'])) $pid = wpsg_q($_REQUEST['p_id']);
-			if (isset($_REQUEST['p_value'])) $pval = wpsg_tf($_REQUEST['p_value']);
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'change')
-			{
-				//'wp-admin/admin.php?page=wpsg-Admin&subaction=paymentData&do=change&edit_id=12&p_id=34&p_value=56&noheader=1';
-
-				$arTaxKey = explode('_', wpsg_q($_REQUEST['mwst']));
-				$country_id = $arTaxKey[1];
-				$country = wpsg_country::getInstance($country_id);
-				$tax_key = 'c';
-				$noMwSt = false;
-				if (wpsg_q($_REQUEST['noMwSt']) == 1) $noMwSt = true;
-				if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				//if (wpsg_q($_REQUEST['price_frontend']) == WPSG_NETTO)
-				/*
-				 if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
-				 {
-				 $valb = wpsg_calculatePreis($pval, WPSG_BRUTTO, $tax_value);
-				 $valn = $pval;
-				 }
-				 else
-				 {
-				 $valn = wpsg_calculatePreis($pval, WPSG_NETTO, $tax_value);
-				 $valb = $pval;
-				 }
-
-				 $data = array('price_payment' => $pval, 'price_payment_brutto' => $valb, 'price_payment_netto' => $valn,
-				 'type_payment' => $pid);
-				 */
-				if ($option == WPSG_NETTO)
-				{
-					$data = array('price_payment' => $pval, 'price_payment_netto' => $pval,	'type_payment' => $pid);
-				}
-				else
-				{
-					$data = array('price_payment' => $pval, 'price_payment_brutto' => $pval, 'type_payment' => $pid);
-				}
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".$oid."'");
-
-			}
-
-			// Order-Daten sammeln und Tabelle neu generieren
-			$basket = new wpsg_basket();
-			$basket->initFromDB($oid, true);
-			$this->shop->view['basket'] = $basket->toArray(true);
-
-			//$pval = 7.9646;
-			// Aufruf in wpsg_basket mit Wert = 7.9646 ergibt 1.0354
-			//$taxp = $this->addMwSt($arReturn, $arReturn['sum']['preis_payment_netto']);
-			//$taxp = $bc->addMwSt($this->shop->view['basket'], $pval);
-			//$taxp = abs($taxp);
-
-			if ($option == WPSG_NETTO)
-			{
-				$data = array('price_payment_brutto' => $this->shop->view['basket']['sum']['preis_payment_brutto']);
-			}
-			else
-			{
-				$data = array('price_payment_netto' => $this->shop->view['basket']['sum']['preis_payment_netto']);
-			}
-			$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".$oid."'");
-
-			$this->correctPrice($oid);
-
-			$this->shop->view['colspan'] = 3;
-			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/order/view_orderdata.phtml');
-
-			exit;
-
-		}	// public function paymentDataAction()
-
-		/**
-		 * Wird aufgerufen, wenn die Versandart verÃ€ndert wird
-		 */
-		public function shippingDataAction()
-		{
-			$sid = 0;
-			$oid = 0;
-			$sval = 0.0;
-			$option = $this->shop->get_option('wpsg_preisangaben');
-			if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-			if (isset($_REQUEST['s_id'])) $sid = wpsg_q($_REQUEST['s_id']);
-			if (isset($_REQUEST['s_value'])) $sval = wpsg_tf($_REQUEST['s_value']);
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'change')
-			{
-				//'wp-admin/admin.php?page=wpsg-Admin&subaction=shippingData&do=change&edit_id=12&p_id=34&p_value=56&noheader=1';
-
-				$arTaxKey = explode('_', wpsg_q($_REQUEST['mwst']));
-				$country_id = $arTaxKey[1];
-				$country = wpsg_country::getInstance($country_id);
-				$tax_key = 'c';
-				$noMwSt = false;
-				if (wpsg_q($_REQUEST['noMwSt']) == 1) $noMwSt = true;
-				if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				//if (wpsg_q($_REQUEST['price_frontend']) == WPSG_NETTO)
-				if ($option == WPSG_NETTO)
-				{
-					$data = array('price_shipping' => $sval, 'price_shipping_netto' => $sval, 'type_shipping' => $sid);
-				}
-				else
-				{
-					$data = array('price_shipping' => $sval, 'price_shipping_brutto' => $sval, 'type_shipping' => $sid);
-				}
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".$oid."'");
-
-			}
-
-			// Order-Daten sammeln und Tabelle neu generieren
-			$basket = new wpsg_basket();
-			$basket->initFromDB($oid, true);
-			$this->shop->view['basket'] = $basket->toArray(true);
-
-			if ($option == WPSG_NETTO)
-			{
-				$data = array('price_shipping_brutto' => $this->shop->view['basket']['sum']['preis_shipping_brutto']);
-			}
-			else
-			{
-				$data = array('price_shipping_netto' => $this->shop->view['basket']['sum']['preis_shipping_netto']);
-			}
-			$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".$oid."'");
-
-			$this->correctPrice($oid);
-
-			$this->shop->view['colspan'] = 3;
-			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/order/view_orderdata.phtml');
-
-			exit;
-
-		}	// public function shippingDataAction()
- 
-		/*
-		 * Wird aufgerufen, wenn Elemente der Bestellansicht in der Bestellverwaltung im alternativen Design verschoben werden
-		 */
-		public function itemOrderDataAction()
-		{
-
-			if(isset($_REQUEST['order'])  && wpsg_isSizedArray($_REQUEST['order'])) $order = $_REQUEST['order'];
-			else $order = array();
-
-			if(isset($_REQUEST['orderPosition'])  && wpsg_isSizedString($_REQUEST['orderPosition'])) $orderPos = $_REQUEST['orderPosition'];
-			else $orderPos = "";
-
-			$currentOrderLeft = $this->shop->get_option('wpsg_backendui_orderdetail_itemorder_left');
-			$currentOrderRight = $this->shop->get_option('wpsg_backendui_orderdetail_itemorder_right');
-
-			if($orderPos === "left" && $currentOrderLeft !== $order)
-				$this->shop->update_option('wpsg_backendui_orderdetail_itemorder_left', $order);
-
-			if($orderPos === "right" && $currentOrderRight !== $order)
-				$this->shop->update_option('wpsg_backendui_orderdetail_itemorder_right', $order);
-
-		} // public function itemOrderDataAction
-
-		/*
-		 * Wird aufgerufen, wenn Elemente der Bestellansicht in der Bestellverwaltung im alternativen Design eingeklappt werdeb
-		 */
-		public function foldedItemsDataAction()
-		{
-
-			if(isset($_REQUEST['folded_items'])) $items = $_REQUEST['folded_items'];
-			else $items = array();
-
-			$currentFoldedItems = $this->shop->get_option('wpsg_backendui_orderdetail_foldedpanels');
-
-			if($currentFoldedItems !== $items)
-				$this->shop->update_option('wpsg_backendui_orderdetail_foldedpanels', $items);
-
-		} // public function itemOrderDataAction
-
-		/**
-		 * Wird aufgerufen, wenn die Rabatte verwaltet werden sollen
-		 */
-		public function discountDataAction()
-		{
-			$t1 = 0;
-			$oid = 0;
-			$option = $this->shop->get_option('wpsg_preisangaben');
-			if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-
-			if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'add')
-			{
-				if (isset($_REQUEST['edit_id'])) $oid = wpsg_q($_REQUEST['edit_id']);
-
-				$sval = 10.0;
-				if ($option == WPSG_NETTO)
-				{
-					$data = array('price_rabatt' => $sval, 'price_rabatt_netto' => $sval);
-				}
-				else
-				{
-					$data = array('price_rabatt' => $sval, 'price_rabatt_brutto' => $sval);
-				}
-
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".$oid."'");
-
-			}
-			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove')
-			{
-				// Rabatt lÃ¶schen
-				$ogs = array('price_rabatt' => 0, 'price_rabatt_netto' => 0, 'price_rabatt_brutto' => 0);
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $ogs, "`id` = '".$oid."'");
-
-			}
-			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'editname')
-			{
-				//submitdata: { field: 'code', gs_id: 92 }
-				$data = array(wpsg_q($_REQUEST['field']) => wpsg_q($_REQUEST['value']));
-
-				//$this->db->UpdateQuery(WPSG_TBL_GUTSCHEIN, $data, "`id` = '".wpsg_q($_REQUEST['gs_id'])."'");
-			}
-			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'editvalue')
-			{
-				$sval = abs(wpsg_tf($_REQUEST['value']));
-
-				$arTaxKey = explode('_', wpsg_q($_REQUEST['mwst']));
-				$country_id = $arTaxKey[1];
-				$country = wpsg_country::getInstance($country_id);
-				$tax_key = $arTaxKey[0];
-				$noMwSt = false;
-				if (wpsg_q($_REQUEST['noMwSt']) == 1) $noMwSt = true;
-				if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				//if (wpsg_q($_REQUEST['price_frontend']) == WPSG_NETTO)
-				if ($option == WPSG_NETTO)
-				{
-					$data = array('price_rabatt' => $sval, 'price_rabatt_netto' => $sval);
-				}
-				else
-				{
-					$data = array('price_rabatt' => $sval, 'price_rabatt_brutto' => $sval);
-				}
-
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
-			}
-
-			// Order-Daten sammeln und Tabelle neu generieren
-			$basket = new wpsg_basket();
-			$basket->initFromDB($oid, true);
-			$this->shop->view['basket'] = $basket->toArray(true);
-
-			//if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'editvalue')
-			{
-				if ($option == WPSG_NETTO)
-				{
-					$data = array('price_rabatt_brutto' => $this->shop->view['basket']['sum']['preis_rabatt_brutto']);
-				}
-				else
-				{
-					$data = array('price_rabatt_netto' => $this->shop->view['basket']['sum']['preis_rabatt_netto']);
-				}
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
-			}
-
-			$this->correctPrice($oid);
-
-			$this->shop->view['colspan'] = 3;
-			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/order/view_orderdata.phtml');
-
-			exit;
-
-		} // public function discountDataAction()
-
+		
 		/**
 		 * Setzt den Admin Kommentar
@@ -756,24 +51,27 @@
 		public function setAdminCommentAction()
 		{
-
-			$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
+			
 			$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
-				'admincomment' => wpsg_q($_REQUEST['value'])
-			), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
-
-			die($_REQUEST['value']);
-
+				'admincomment' => wpsg_q($_REQUEST['wpsg_order_admincomment'])
+			), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");				
+				
+			$this->shop->addBackendMessage(__('Bemerkung wurde erfolgreich gespeichert!', 'wpsg'));
+			
+			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+			
 		} // public function setAdminCommentAction()
-
+		
 		/**
-		 * Nimmt Ajax Anfragen innerhalb der Bestellverwaltung entgegen
+		 * Nimmt Ajax Anfragen innerhalb der Bestellverwaltung entgege
 		 */
-		public function ajaxAction() {
-
-			if (isset($_REQUEST['mod'])) {
-
-				if (isset($_REQUEST['edit_id'])) {
-
+		public function ajaxAction()
+		{
+			
+			if (isset($_REQUEST['mod']))
+			{
+				
+				if (isset($_REQUEST['edit_id']))
+				{
+					
 					$this->shop->view['data'] = $this->db->fetchRow("
 						SELECT
@@ -784,217 +82,135 @@
 							O.`id` = '".wpsg_q($_REQUEST['edit_id'])."'					
 					");
-
-					$this->shop->view['data']['shipping_land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q(wpsg_getInt($this->shop->view['data']['shipping_land']))."'");
-
-					if (intval($this->shop->view['data']['shipping_adress_id']??0) > 0) {
-						
-						$temp = $this->db->fetchRow("
-							SELECT
-								A.*
-							FROM
-								`".WPSG_TBL_ADRESS."` AS A
-							WHERE
-								A.`id` = '".wpsg_q($this->shop->view['data']['shipping_adress_id'])."'
-						");
-						
-						$this->shop->view['data']['shipping_land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q(wpsg_getStr($temp['land']))."'");
-						
-					}
-					
-					if (intval($this->shop->view['data']['k_id']??0) > 0) {
-						
-						$this->shop->view['kunde'] = $this->db->fetchRow("
-							SELECT
-								K.*
-							FROM
-								`".WPSG_TBL_KU."` AS K
-							WHERE
-								K.`id` = '".wpsg_q($this->shop->view['data']['k_id'])."'
-						");
-						
-						$this->shop->view['kunde']['land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q(wpsg_getInt($this->shop->view['kunde']['land']))."'");
-						
-					}
-
-					if (intval($this->shop->view['data']['adress_id']??0) > 0) {
-						
-						$temp = $this->db->fetchRow("
-							SELECT
-								A.*
-							FROM
-								`".WPSG_TBL_ADRESS."` AS A
-							WHERE
-								A.`id` = '".wpsg_q($this->shop->view['data']['adress_id'])."'
-						");
-						
-						$this->shop->view['kunde']['land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($temp['land'])."'");
-						
-					}
-
-				}
-
+					
+					$this->shop->view['data']['shipping_land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->shop->view['data']['shipping_land'])."'");
+					
+					$this->shop->view['kunde'] = $this->db->fetchRow("
+						SELECT
+							K.*
+						FROM
+							`".WPSG_TBL_KU."` AS K
+						WHERE
+							K.`id` = '".wpsg_q($this->shop->view['data']['k_id'])."'
+					");
+					
+					$this->shop->view['kunde']['land'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->shop->view['kunde']['land'])."'");
+ 					
+				}
+				
 				$this->shop->callMod($_REQUEST['mod'], 'order_ajax');
-
-			} else if (($_REQUEST['wpsg_action']??'') === 'inline_edit') {
-				
-				if (intval($_REQUEST['product_id']??0) <= 0) throw new \Exception(__('Parameterfehler', 'wpsg'));
-				if (!wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTFIELD)) throw new \Exception(__('Parameterfehler', 'wpsg'));
-								
-				$product_id = intval($_REQUEST['product_id']);
-				$value = sanitize_text_field($_REQUEST['value']);
-
-				if ($_REQUEST['field'] === 'pos') {
-					
-					if (!$this->shop->hasMod('wpsg_mod_produktartikel')) throw new \Exception(__('Modul "Produktartikel" nicht aktiviert.', 'wpsg'));
-					
-					$post_id = $this->shop->callMod('wpsg_mod_produktartikel', 'getPostIdFromProductId', [$product_id]);
-					
-					$this->db->UpdateQuery($this->shop->prefix.'posts', [
-						'menu_order' => $value
-					], " `id` = '".wpsg_q($post_id)."' ");
-					
-					echo $value;
-					exit;
-					
-				} else throw new \Exception(__('Feld nicht definiert.', 'wpsg'));
-								
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'saveInvoiceAdress')) {
-
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'saveInvoiceAdress'))
+			{
+				
 				parse_str($_REQUEST['form_data'], $form_data);
- 
-				if (wpsg_isSizedInt($form_data['dialog_all']))
-				{
-
-					// Alle Bestellungen des Kunden anpassen
-					$customer_id = $this->db->fetchOne("SELECT `k_id` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."' ");
-					$arOrder = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `k_id` = '".wpsg_q($customer_id)."' ");
-					
-				}
-				else
-				{
-
-					$arOrder = array($_REQUEST['edit_id']);
-
-				}
-
-				$adress_data = array(
+				
+				$k_id = $this->db->fetchOne("SELECT `k_id` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."' ");
+				
+				$this->db->UpdateQuery(WPSG_TBL_KU, array(
 					'firma' => wpsg_q($form_data['dialog_firma']),
 					'title' => wpsg_q($form_data['dialog_title']),
 					'vname' => wpsg_q($form_data['dialog_vname']),
 					'name' => wpsg_q($form_data['dialog_name']),
-					'fax' => wpsg_q($form_data['dialog_fax']),
-					'tel' => wpsg_q($form_data['dialog_tel']),
 					'strasse' => wpsg_q($form_data['dialog_strasse']),
-					'nr' => wpsg_q($form_data['dialog_nr']),
 					'plz' => wpsg_q($form_data['dialog_plz']),
 					'ort' => wpsg_q($form_data['dialog_ort']),
 					'land' => wpsg_q($form_data['dialog_land'])
-				);
-
-				foreach ($arOrder as $order_id)
-				{
-
-					// Daten in der Bestellung aktualisieren
-					/** @var wpsg_order $oOrder */
-					$oOrder = wpsg_order::getInstance($order_id);
-					$oOrder->updateAdress($adress_data);
-
-					// Daten im Kunden aktualisieren?
-					if (wpsg_isSizedInt($form_data['dialog_customer'])) {
-
-						$oCustomer = $oOrder->getCustomer();
-						$oCustomer->updateAdress($adress_data);
-					
-					}
-
-					if (wpsg_isSizedInt($form_data['dialog_shipping'])) {
-						
-						$oOrder->updateShippingAdress($adress_data);
-
-					} 
-					
-					if ($order_id == $_REQUEST['edit_id']) {
-						
-						$this->db->UpdateQuery(WPSG_TBL_KU, [
-							'ustidnr' => wpsg_q($form_data['dialog_ustidnr']),
-							'email_einvoice' => wpsg_q($form_data['email_einvoice'])
-						], " `id` = '".wpsg_q($oOrder->getCustomer()->id)."' ");
-						
-					}
+				), " `id` = '".wpsg_q($k_id)."' ");
+				
+				if (wpsg_isSizedInt($form_data['dialog_shipping']))
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+						'shipping_firma' => wpsg_q($form_data['dialog_firma']),
+						'shipping_title' => wpsg_q($form_data['dialog_title']),
+						'shipping_vname' => wpsg_q($form_data['dialog_vname']),
+						'shipping_name' => wpsg_q($form_data['dialog_name']),
+						'shipping_strasse' => wpsg_q($form_data['dialog_strasse']),
+						'shipping_plz' => wpsg_q($form_data['dialog_plz']),
+						'shipping_ort' => wpsg_q($form_data['dialog_ort']),
+						'shipping_land' => wpsg_q($form_data['dialog_land'])
+					), " `id` = '".wpsg_q($_REQUEST['edit_id'])."' ");
 					
 				}
 				
 				die("1");
-
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_urlpay')) {
-
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_urlpay'))
+			{
+			
 				$oOrder = wpsg_order::getInstance($_REQUEST['edit_id']);
 				$arOrderProducts = $oOrder->getOrderProducts();
-
+				
 				foreach ($arOrderProducts as $oOrderProduct)
 				{
-
+					
 					$oProduct = $oOrderProduct->getProduct();
-
-					$this->shop->notifyURL($oProduct->posturl, $oOrderProduct->getProductKey(), $oOrderProduct->getCount(), $oOrder->id, 1, false, array(
+					
+					$this->shop->notifyURL($oProduct->posturl, $oProduct->id, $oOrderProduct->getCount(), $oOrder->id, 1, false, array(
 						'product_index' => $oOrderProduct->getProductIndex()
 					));
-
-				}
-
-				$this->shop->addBackendMessage(__('URL Benachrichtigung (Bezahlung) wurde fÃŒr die Produkte der Bestellung simuliert.'));
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']])					
-				);
-
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_urlbuy')) {
-
+					
+				}
+				
+				$this->shop->addBackendMessage(__('URL Benachrichtigung (Kauf) wurde fÃŒr die Produkte der Bestellung simuliert.'));
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_urlbuy'))
+			{
+				
 				$oOrder = wpsg_order::getInstance($_REQUEST['edit_id']);
 				$arOrderProducts = $oOrder->getOrderProducts();
-
+				
 				foreach ($arOrderProducts as $oOrderProduct)
 				{
-
+						
 					$oProduct = $oOrderProduct->getProduct();
-
-					$this->shop->notifyURL($oProduct->posturl, $oOrderProduct->getProductKey(), $oOrderProduct->getCount(), $oOrder->id, 0, false, array(
-						'product_index' => $oOrderProduct->getProductIndex()
+						
+					$this->shop->notifyURL($oProduct->posturl, $oProduct->id, $oOrderProduct->getCount(), $oOrder->id, 0, false, array(
+							'product_index' => $oOrderProduct->getProductIndex()
 					));
-
-				}
-
-				$this->shop->addBackendMessage(__('URL Benachrichtigung (Kauf) wurde fÃŒr die Produkte der Bestellung simuliert.'));
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']])
-				);
-
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_customermail')) {
-
+						
+				}
+				
+				$this->shop->addBackendMessage(__('URL Benachrichtigung (Bezahlung) wurde fÃŒr die Produkte der Bestellung simuliert.'));
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_customermail'))
+			{
+				
 				$this->shop->basket->initFromDB($_REQUEST['edit_id']);
 				$arBasket = $this->shop->basket->toArray();
-
+				
 				$this->shop->basket->sendOrderSaveMails($_REQUEST['edit_id'], $arBasket, true, false, true);
-
+				
 				$this->shop->addBackendMessage(wpsg_translate(__('Kundenmail wurde erfolgreich an #1# simuliert.', 'wpsg'), $this->shop->get_option('wpsg_adminmail_empfaenger')));
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']])
-				);
-
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_adminmail')) {
-
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'debug_adminmail'))
+			{
+				
 				$this->shop->basket->initFromDB($_REQUEST['edit_id']);
 				$arBasket = $this->shop->basket->toArray();
-
+				
 				$this->shop->basket->sendOrderSaveMails($_REQUEST['edit_id'], $arBasket, false, true, true);
-
+				
 				$this->shop->addBackendMessage(wpsg_translate(__('Adminmail wurde erfolgreich an #1# simuliert.', 'wpsg'), $this->shop->get_option('wpsg_adminmail_empfaenger')));
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']])
-				);
-
-			}
-
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+								
+			}
+			else if ($_REQUEST['wpsg_action'] == 'orderLog')
+			{
+				
+				die($this->orderLogAction($_REQUEST['edit_id']));
+				
+			}
+			
 		} // public function ajaxAction()
-
+		
 		/**
 		 * Ãndert den Status einer Bestellung und leitet zur Bestellung zurÃŒck
@@ -1002,364 +218,70 @@
 		public function switchStatusAction()
 		{
-
-			if (!array_key_exists($_REQUEST['status'], $this->shop->arStatus))
-			{
-
+			
+			if (!array_key_exists($_REQUEST['status'], $this->shop->arStatus)) 
+			{
+				
 				$this->shop->addBackendError(__('Status konnte nicht gesetzt werden!', 'wpsg'));
-
+				
 			}
 			else
 			{
-
-				$bOK = $this->shop->setOrderStatus(
-					wpsg_sinput("key", $_REQUEST['edit_id']),
-					wpsg_sinput("key", $_REQUEST['status']),
-					(($_REQUEST['sendMail'] == '1')?true:false),
-                    wpsg_isSizedInt($_REQUEST['attachInvoice'])
-				);
-
+			
+				$bOK = $this->shop->setOrderStatus($_REQUEST['edit_id'], $_REQUEST['status'], (($_REQUEST['sendMail'] == '1')?true:false));												
+				
 				if ($bOK)
 					$this->shop->addBackendMessage(__('Status wurde erfolgreich geÃ€ndert!', 'wpsg'));
 				else
 					$this->shop->addBackendError(__('Status wurde nicht geÃ€ndert, da unverÃ€ndert.', 'wpsg'));
-
-			}
-
-			$this->redirect(wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']]));
-
+				
+			}
+			
+			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+			
 		} // public function switchStatusAction()
-
-        public function saveAction() {
-
-            $this->db->UpdateQuery(WPSG_TBL_ORDER, [
-                'ext_payed' => M1::q($_REQUEST['ext_payed'])
-            ], " `id` = '".M1::q($_REQUEST['edit_id'])."' ");
-
-		    $this->shop->addBackendMessage(__('Bestellung erfolgreich gespeichert.', 'wpsg'));
-
-            $this->redirect(wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']]));
-
-        }
-
+		
 		/**
 		 * Wird beim stornieren einer einzelnen Bestellung aufgerufen
 		 */
-		public function stornoAction() {
-			
-			wpsg_checkNounce('Order', 'storno', ['edit_id' => wpsg_getInt($_REQUEST['edit_id'])]);
-
+		public function stornoAction()
+		{
+			
 			$this->shop->setOrderStatus($_REQUEST['edit_id'], 500, true);
-			$this->shop->addBackendMessage(__('Bestellung wurde storniert und Kunde benachrichtigt.', 'wpsg'));
-
+			$this->shop->addBackendMessage(__('Bestellung wurde storniert und Kunde benachrichtigt.', 'wpsg'));			
+			
 			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
-
+			
 		} // public function stornoAction()
-
+		
+		/**
+		 * Zeichnet das Bestell Log
+		 */
+		public function orderLogAction($order_id)
+		{
+			
+			$this->shop->view['log'] = $this->db->fetchAssoc("
+				SELECT
+					OL.*
+				FROM
+					`".WPSG_TBL_OL."` AS OL
+				WHERE
+					OL.`o_id` = '".wpsg_q($order_id)."'
+				ORDER BY
+					OL.`cdate` ASC
+			");
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/order/orderlog.phtml', false);
+			
+		} // public function orderLogAction($order_id)
+		
 		/**
 		 * Zeigt eine Bestellung an
 		 */
-		public function viewAction() {
-									
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'updateCalculation')) {
-
-				$_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-				$_REQUEST['tax_mode'] = wpsg_sinput("key", $_REQUEST['tax_mode']);
-
-				$oCalculation = new \wpsg\wpsg_calculation();
-				
-				$oCalculation->fromDB($_REQUEST['edit_id']);				
-				$oCalculation->setTaxMode($_REQUEST['tax_mode']);								
-				$oCalculation->toDB($_REQUEST['edit_id']);
-				
-				// Umweg ist hier notwendig, da sonst beim Ã€ndern der Besteuerung auch die Produkte neu geladen werden mÃŒssten
-				$oCalculation = new \wpsg\wpsg_calculation();
-				$oCalculation->fromDB($_REQUEST['edit_id']);
-				
-				$this->shop->view['oCalculation'] = $oCalculation;
-				
-				wpsg_header::JSONData([
-					'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-				]);
-				
-			} else if (wpsg_isSizedString($_REQUEST['subaction'], 'removeProduct')) {
-				
-				wpsg_checkNounce('Order', 'view', ['subaction' => 'removeProduct', 'edit_id' => $_REQUEST['edit_id']]);
-				
-                $oCalculation = new \wpsg\wpsg_calculation();
-                $oCalculation->fromDB($_REQUEST['edit_id']);
-
-                $oCalculation->removeProduct($_REQUEST['order_product_id']);
-
-                $oCalculation->toDB($_REQUEST['edit_id']);
-
-                $this->shop->view['oCalculation'] = $oCalculation;
-
-                wpsg_header::JSONData([
-                    'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-                ]);
-
-			} else if (wpsg_isSizedString($_REQUEST['subaction'], 'sendAdminMail')) {
-                
-				wpsg_checkNounce('Order', 'view', ['subaction' => 'sendAdminMail', 'do' => 'customer', 'edit_id' => $_REQUEST['edit_id']]);
-				
-		    	$oBasket = new wpsg_basket();
-		    	$oBasket->initFromDB($_REQUEST['edit_id']);
-				
-		    	$oBasket->sendOrderSaveMails($_REQUEST['edit_id'], $oBasket->toArray(), false, true, false);
-		    						
-		    	die(__('BestellbestÃ€tigung (Admin) wurde erfolgreich versendet.', 'wpsg'));
-		    	
-			} else if (wpsg_isSizedString($_REQUEST['subaction'], 'sendMail')) {
-				
-				wpsg_checkNounce('Order', 'view', ['subaction' => 'sendMail', 'do' => 'customer', 'edit_id' => $_REQUEST['edit_id']]);
-				
-		    	$oBasket = new wpsg_basket();
-		    	$oBasket->initFromDB($_REQUEST['edit_id']);
-		    	
-		    	$oBasket->sendOrderSaveMails($_REQUEST['edit_id'], $oBasket->toArray(), true, false, false);
-		    						
-		    	die(__('BestellbestÃ€tigung (Kunde) wurde erfolgreich versendet.', 'wpsg'));
-                
-			} else if (wpsg_isSizedString($_REQUEST['subaction'], 'editVoucher')) {
-
-		    	/** @var \wpsg\wpsg_calculation */
-				$this->shop->view['oCalculation'] = new \wpsg\wpsg_calculation();
-				$this->shop->view['oCalculation']->fromDb($_REQUEST['edit_id']);
-			
-				if (isset($_REQUEST['do'])) {
-					
-					if ($_REQUEST['do'] === 'remove') {
-				 
-						$this->shop->view['oCalculation']->removeVoucher($_REQUEST['order_voucher_id']);
-						 
-					} else if ($_REQUEST['do'] === 'submit') {
-						
-						$this->shop->view['oCalculation']->removeVoucher($_REQUEST['order_voucher_id']);
-						
-						if (wpsg_tf($_REQUEST['be_voucher_amount']) > 0) {
-							
-							if (wpsg_isSizedInt($_REQUEST['be_voucher_coupon'])) {
-						 
-								$this->shop->view['oCalculation']->addCoupon(wpsg_tf($_REQUEST['be_voucher_amount']), $this->shop->getBackendTaxview(), '0', 1, $_REQUEST['be_voucher_code'], $_REQUEST['be_voucher_id'], $_REQUEST['order_voucher_id']);
-								
-							} else {
-								
-								$this->shop->view['oCalculation']->addVoucher($_REQUEST['be_voucher_amount'], $this->shop->getBackendTaxview(), '0', 1, $_REQUEST['be_voucher_code'], $_REQUEST['be_voucher_id'], $_REQUEST['order_voucher_id']);
-								
-							}
-																					
-						}
-						 						
-					} else if ($_REQUEST['do'] === 'search') {
-						
-						$arVoucher = $this->db->fetchAssoc("
-							SELECT
-								V.`id`, V.`value` AS `gs_value`, V.`code`, V.`calc_typ`, V.`id`, V.`coupon`,
-								CONCAT(V.`code`) AS `value`
-							FROM
-								`".WPSG_TBL_GUTSCHEIN."` AS V
-							WHERE
-								V.`code` LIKE '%".wpsg_q($_REQUEST['term'])."%' 
-							ORDER BY
-								V.`code` ASC 
-						");
-						
-						foreach ($arVoucher as $k => $v) {
-							
-							$oVoucher = wpsg_voucher::getInstance($v['id']);
-							
-							if (!$oVoucher->isUsabel()) unset($arVoucher[$k]);
-							else {
-							
-								if ($v['calc_type'] === 'p') $arVoucher[$k]['gs_value'] = wpsg_ff($arVoucher[$k]['gs_value'], '%');
-								else $arVoucher[$k]['gs_value'] = wpsg_ff($oVoucher->getFreeAmount(), $this->shop->get_option('wpsg_currency'));
-								
-							}
-							
-						}
-						
-						wpsg_header::JSONData($arVoucher);
-						
-					}
-					
-					$this->shop->view['oCalculation']->toDB($_REQUEST['edit_id']);
-					
-					$this->shop->view['oCalculation'] = new \wpsg\wpsg_calculation();
-					$this->shop->view['oCalculation']->fromDB($_REQUEST['edit_id']); // Muss ich machen, damit ich die order_voucher_id habe
-					 					
-					wpsg_header::JSONData([
-						'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-					]);
-					
-				}
-				
-				$this->shop->render(WPSG_PATH_VIEW.'/order/backendEdit/addVoucher.phtml');
-			
-				exit;
-                
-            } else if (wpsg_isSizedString($_REQUEST['subaction'], 'editDiscount')) {
-
-		    	/** @var \wpsg\wpsg_calculation */
-		        $oCalculation = new \wpsg\wpsg_calculation();
-                $oCalculation->fromDb($_REQUEST['edit_id']);
-			
-				$this->shop->view['oCalculation'] = $oCalculation;
-                
-                if (wpsg_isSizedString($_REQUEST['do'], 'submit')) {
-	
-					$oCalculation->addDiscount($_REQUEST['be_discount_amount'], $this->shop->getBackendTaxview(), '0',1);
-                    $oCalculation->toDB($_REQUEST['edit_id']);
-	 
-                    wpsg_header::JSONData([
-                        'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-                    ]);
-                    
-                } else if (wpsg_isSizedString($_REQUEST['do'], 'remove')) {
-	
-					$oCalculation->removeDiscount();
-					$oCalculation->toDB($_REQUEST['edit_id']);
-	 
-					wpsg_header::JSONData([
-						'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-					]);
-					
-				}
-                
-                $this->shop->render(WPSG_PATH_VIEW.'/order/backendEdit/addDiscount.phtml');
-
-                exit;
-		        
-            } else if (wpsg_isSizedString($_REQUEST['subaction'], 'addProduct')) {
-				
-		        if (wpsg_isSizedString($_REQUEST['do'], 'search')) {
-			
-		        	wpsg_checkNounce('Order', 'view', ['subaction' => 'addProduct', 'edit_id' => $_REQUEST['edit_id'], 'do' => 'search']);
-		        	
-                    $arReturn = [];
-
-                    $arProduct = wpsg_product::find(Array('s' => $_REQUEST['term']));
-
-                    /** @var wpsg_product $oProduct */
-                    foreach ($arProduct as $oProduct) {
-
-                        $arReturn[] = Array(
-                            'id' => $oProduct->id,
-                            'value' => $oProduct->getProductName()
-                        );
-
-                    }
-
-                    wpsg_header::JSONData($arReturn);
-
-                    exit;
-                    
-				}
-				  else if (wpsg_isSizedString($_REQUEST['do'], 'updatePrice')) {
-
-		        	parse_str($_REQUEST['form_data'], $form_data);
-		        	
-					$product_key = $_REQUEST['product_id'];					
-					$this->shop->callMods('getProductKeyFromRequest',[&$product_key, $_REQUEST['product_id'], $form_data]);
-
-					$arProduct = $this->shop->loadProduktArray($_REQUEST['product_id'],['product_key' => $product_key]);
-					 
-					if ($this->shop->getBackendTaxview() === WPSG_BRUTTO) echo wpsg_ff($arProduct['preis'], 'EUR');
-					else echo wpsg_ff($arProduct['preis_netto'], 'EUR');
-					
-					exit;
-		        	
-                }
-				  else if (wpsg_isSizedString($_REQUEST['do'], 'product')) {
-			
-					wpsg_checkNounce('Order', 'view', ['subaction' => 'addProduct', 'do' => 'product', 'edit_id' => $_REQUEST['edit_id']]);
-		        	
-		            if (wpsg_isSizedInt($_REQUEST['product_id'])) {
-
-                        $this->shop->view['oProduct'] = wpsg_product::getInstance($_REQUEST['product_id']);
-		                
-                    }
-		            
-		            if (wpsg_isSizedInt($_REQUEST['order_product_id'])) {
-		                
-		                $this->shop->view['oOrderProduct'] = wpsg_order_product::getInstance($_REQUEST['order_product_id']);
-
-                        if (!wpsg_isSizedInt($_REQUEST['product_id'])) $this->shop->view['oProduct'] = $this->shop->view['oOrderProduct']->getProduct();
-		                
-                    } else {
-		             
-		                $this->shop->view['oOrderProduct'] = false;
-		                
-                    }
-		            
-                    $this->shop->render(WPSG_PATH_VIEW.'/order/backendEdit/addProduct_product_selected.phtml');
-
-                    exit;
-		            
-                }
-				  else if (wpsg_isSizedString($_REQUEST['do'], 'submit')) {
-			
-					wpsg_checkNounce('Order', 'view', ['subaction' => 'addProduct', 'do' => 'submit', 'edit_id' => $_REQUEST['edit_id']]);
-		        	
-                    $oCalculation = new \wpsg\wpsg_calculation();
-                    $oCalculation->fromDB($_REQUEST['edit_id']);
-					
-                    $order_product_id = ((wpsg_isSizedInt($_REQUEST['order_product_id']))?$_REQUEST['order_product_id']:false);
-		            $oProduct = wpsg_product::getInstance($_REQUEST['product_id']);
-					
-		            $product_key = $_REQUEST['product_id'];					
-		            $this->shop->callMods('getProductKeyFromRequest',[&$product_key, $_REQUEST['product_id'], $_REQUEST]);
-		            
-		            if ($_REQUEST['add_eu'] === '1') $eu = true;
-		            else $eu = false;
-			
-					$product_index = false;
-		            if (wpsg_isSizedInt($order_product_id)) $product_index = $this->db->fetchOne("SELECT `product_index` FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `id` = '".wpsg_q($order_product_id)."' ");
-		            
-					if (wpsg_isSizedInt($_REQUEST['set_scaleprice']) && $this->shop->hasMod('wpsg_mod_scaleprice')) {
-						
-						$_REQUEST['add_price'] = $this->shop->callMod('wpsg_mod_scaleprice', 'getScalePrice', [$oProduct, $oProduct->getPrice(), $_REQUEST['add_amount']]);
-						
-					}
-					
-					$oCalculation->addProduct($_REQUEST['add_price'], $this->shop->getBackendTaxview(), $oProduct->mwst_key, $_REQUEST['add_amount'], $product_key, $product_index, $order_product_id, $eu);
-			
-					$oCalculation->toDB($_REQUEST['edit_id']);
-					
-					$oCalculation = new \wpsg\wpsg_calculation();
-					$oCalculation->fromDB($_REQUEST['edit_id']);
-			
-					$this->shop->view['oCalculation'] = $oCalculation;
-					$this->shop->view['data'] = [
-						'id' => $_REQUEST['edit_id']
-					];
-
-					wpsg_header::JSONData([
-						'product_table' => $this->shop->render(WPSG_PATH_VIEW.'order/product_table.phtml', false)
-					]);
-					 		            
-                }
-				  else {
-			 
-					wpsg_checkNounce('Order', 'view', ['subaction' => 'addProduct', 'edit_id' => $_REQUEST['edit_id']]);
-		        	
-				}
-		        
-                $this->shop->render(WPSG_PATH_VIEW.'/order/backendEdit/addProduct.phtml');
-
-                exit;
-		        
-            } else {
-
-				if (!(wpsg_isSizedString($_REQUEST['subaction'], 'editPayShipping'))) {
-				
-					//wpsg_checkNounce('Order', 'view', ['edit_id' => wpsg_getInt($_REQUEST['edit_id'])]);
-					
-				}
-				
-			}
-
+		public function viewAction()
+		{
+			
 			$this->shop->view['data'] = $this->db->fetchRow("
 				SELECT
-					K.*, O.*, CA.*,
+					O.*, K.*,
 					O.`id` AS id,
 					O.`comment` AS `order_comment`,
@@ -1371,42 +293,27 @@
 					`".WPSG_TBL_ORDER."` AS O 
 						LEFT JOIN `".WPSG_TBL_KU."` AS K ON (O.`k_id` = K.`id`)
-						LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (O.`adress_id` = CA.`id`)
-						LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (CA.`land` = L.`id`)
+						LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (K.`land` = L.`id`)
 				WHERE
 					O.`id` = '".wpsg_q($_REQUEST['edit_id'])."'	
-			");
-
-			$this->shop->view['oOrder'] = wpsg_order::getInstance($_REQUEST['edit_id']);
-
+			"); 
+			
+			$this->shop->view['oOrder'] = wpsg_order::getInstance($_REQUEST['edit_id']);			
+			$this->shop->view['orderLog'] = $this->orderLogAction($_REQUEST['edit_id']);
+						
+			$custom_data = @unserialize($this->shop->view['data']['custom_data']);
+			 
 			$basket = new wpsg_basket();
-			$basket->initFromDB($this->shop->view['data']['id'], true);
+			$basket->initFromDB($this->shop->view['data']['id'], true); 
 			$this->shop->view['basket'] = $basket->toArray(true);
-
+						
+			//wpsg_debug($this->shop->view['basket']);die();
+			
+			$this->shop->view['colspan'] = 3;
+			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
+			
 			$this->shop->view['arPayment'] = $this->shop->arPayment;
 			$this->shop->view['arShipping'] = $this->shop->arShipping;
 
-			$oCalculation = new \wpsg\wpsg_calculation();
-			$oCalculation->fromDB($this->shop->view['data']['id']);
-			$this->shop->view['oCalculation'] = $oCalculation;
-			
-            if (wpsg_isSizedString($_REQUEST['subaction'], 'editPayShipping')) {
-	
-				wpsg_checkNounce('Order', 'view', ['subaction' => 'editPayShipping', 'edit_id' => $_REQUEST['edit_id']]);
-            	
-                $this->shop->render(WPSG_PATH_VIEW.'/order/backendEdit/editPayShipping.phtml');
-
-                exit;
-
-            }
-
-			$oCalculation = new \wpsg\wpsg_calculation();
-			$oCalculation->fromDB($this->shop->view['data']['id']);
-
-            $this->shop->checkShippingAvailable();
-
-            $this->shop->view['oCalculation'] = $oCalculation;
-            $this->shop->view['oCustomer'] = wpsg_customer::getInstance(intval($this->shop->view['data']['k_id']));
-
-            $this->shop->view['country'] = $this->db->fetchRow("
+			$this->shop->view['country'] = $this->db->fetchRow("
 				SELECT
 					C.`id`, C.`name`, C.`kuerzel`,
@@ -1418,269 +325,492 @@
 					C.`id` = '".$this->shop->view['data']['land']."'
 			");
-
+			
 			$this->shop->view['arCountry'] = $this->db->fetchAssocField("SELECT `id`, `name` FROM `".WPSG_TBL_LAND."` WHERE 1 ", "id", "name");
-
+			
 			$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
 			$this->shop->view['arTitles'] = explode('|', $this->shop->view['pflicht']['anrede_auswahl']);
-
-			$arAdr = $this->db->fetchRow("
-						SELECT
-							`title`,
-							`name`,
-							`vname`,
-							`firma`,
-							`strasse`,
-							`plz`,
-							`ort`,
-							`land`
-						FROM
-							`".WPSG_TBL_ADRESS."`
-						WHERE
-							`id` = '".wpsg_q($this->shop->view['data']['adress_id'])."'
-					");
-			
-            if (!is_array($arAdr)) $arAdr = [];
-            
-			$this->shop->view['data'] = array_merge($this->shop->view['data'], $arAdr);
-
-			if ($this->shop->hasMod('wpsg_mod_orderupload'))
-			{
-				$this->shop->callMod('wpsg_mod_orderupload', 'order_view_sidebar', array(&$_REQUEST['edit_id']));
-			}
-            
-			$this->shop->view['arSubAction'] = array(
-				'general' => array(
-					'title' => __('Allgemein', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/order/view_general.phtml', false)
-				),
-				'orderdata' => array(
-					'title' => __('Bestelldaten', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/order/view_orderdata.phtml', false)
-				),
-				'customerdata' => array(
-					'title' => __('Kundendaten', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/order/view_customerdata.phtml', false)
-				),
-				'shippay' => array(
-					'title' => __('Versand-/Zahlungsart', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/order/view_shippay.phtml', false)
-				)
-			);
-			
-			$this->shop->callMods('order_view', array($_REQUEST['edit_id'], &$this->shop->view['arSubAction']));
-			
-			$this->shop->view['arSubAction']['orderlog'] = array(
-				'title' => __('Bestellprotokoll', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/order/view_orderlog.phtml', false)
-			);
-
-			if (wpsg_isSizedInt($this->get_option('wpsg_debugModus')))
-			{
-
-				$this->shop->view['arSubAction']['dev'] = array(
-					'title' => __('Entwickleroptionen', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/order/view_dev.phtml', false)
-				);
-
-			}
-
-			if($this->get_option('wpsg_alternativeOrderDesign') == true)
-			{
-
-				$this->shop->render(WPSG_PATH_VIEW.'/order/view_alternativeDesign.phtml');
-
-			}
-			else
-			{
-
-				$this->shop->render(WPSG_PATH_VIEW.'/order/view.phtml');
-
-			}
-
+			
+			$this->shop->view['shipping_country'] = $this->db->fetchRow("
+				SELECT
+					C.`id`, C.`name`, C.`kuerzel`
+				FROM
+					`".WPSG_TBL_LAND."` AS C
+				WHERE
+					C.`id` = '".$this->shop->view['data']['shipping_land']."'
+			");
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/order/view.phtml');
+			
 		} // public function viewAction()
-
+		
 		/**
 		 * Ãbernimmt das lÃ¶schen von Bestellungen
 		 */
-		public function deleteAction() {
-			
-			wpsg_checkNounce('Order', 'delete', ['edit_id' => wpsg_getInt($_REQUEST['edit_id'])]);
-
-			if (!isset($_REQUEST['edit_id'])) {
-
+		public function deleteAction()
+		{
+			
+			if (!isset($_REQUEST['edit_id']))
+			{
+				
 				$this->shop->addBackendError(__('Keine Bestellnummer ÃŒbergeben.', 'wpsg'));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
-
-			}
-
-			$oOrder = wpsg_order::getInstance($_REQUEST['edit_id']);
-			$oOrder->delete();
-
+				
+			}
+			
+			$this->shop->delOrder($_REQUEST['edit_id']);
+			
 			$this->shop->addBackendMessage(__('Bestellung erfolgreich gelÃ¶scht.', 'wpsg'));
-            $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
-
+			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
+						
 		} // public function deleteAction()
-
-		public function indexAction() {
-
-			if (wpsg_isSizedString($_REQUEST['do'], 'writeRechnung') || wpsg_isSizedString($_REQUEST['wpsg_action'], 'showRechnung')) {
-
+		
+		public function indexAction()
+		{
+			
+			$strQueryWHERE = '';
+			$strQueryStatusWHERE = '';
+			$strQueryFROM = '';
+			
+			if (wpsg_isSizedString($_REQUEST['do'], 'writeMultiRechnung') || wpsg_isSizedString($_REQUEST['wpsg_action'], 'showRechnung'))
+			{
+				
 				// Mehrere Rechnungen schreiben/anzeigen
-				if (isset($_REQUEST['ids'])) $IDs = explode("_", $_REQUEST['ids']);
-				else $IDs = array_keys($_REQUEST['wpsg_multido']);
-
+				if (isset($_REQUEST['ids']))
+				{
+					
+					$IDs = explode("_", $_REQUEST['ids']);
+					
+				}
+				else 
+				{
+					
+					$IDs = array_keys($_REQUEST['wpsg_multido']);
+						 
+				}
+				
 				// Hier die Rechnungen noch einmal nach CDATE sortieren
 				$IDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `id` IN (".wpsg_q(implode(',', $IDs)).") ORDER BY `cdate` ASC");
 
-                require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-                require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
-                require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
-
-				if (sizeof($IDs) > 0) {
-
-					$pdf = new wpsg_fpdf();
-
-					foreach ($IDs as $o_id) {
-
+				include WPSG_PATH_LIB.'fpdf/fpdf.php';
+				include WPSG_PATH_LIB.'fpdf/fpdi.php';
+				 
+				if (sizeof($IDs) > 0)
+				{
+					
+					$pdf = new FPDI();
+					
+					foreach ($IDs as $o_id)
+					{
+						
 						$rnr_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `rnr` != '' AND `storno` = '0000-00-00 00:00:00' AND `o_id` = '".wpsg_q($o_id)."' ORDER BY `id` DESC");
-
 						$rnr = $rnr_db['rnr'];
-
+						
 						$path = $this->shop->callMod('wpsg_mod_rechnungen', 'getFilePath', array($o_id));
 
-						$rnr_file = false;
 						if (file_exists($path.'/R'.$rnr.'.pdf')) $rnr_file = $path.'/R'.$rnr.'.pdf';
 						else if (file_exists($path.'/R'.$rnr_db['id'].'.pdf')) $rnr_file = $path.'/R'.$rnr_db['id'].'.pdf';
 						else if (file_exists($path.'/'.$rnr_db['id'].'.pdf')) $rnr_file = $path.'/'.$rnr_db['id'].'.pdf';
 						else if (file_exists($path.'/'.$rnr_db['rnr'].'.pdf')) $rnr_file = $path.'/'.$rnr_db['rnr'].'.pdf';
-
+						
 						if (file_exists($rnr_file))
 						{
-
+							
 							$pagecount = $pdf->setSourceFile($rnr_file);
-
-							for ($i = 1; $i <= $pagecount; $i++)
+							
+							for ($i = 1; $i <= $pagecount; $i++) 
 							{
-
+							
 								$tplidx = $pdf->ImportPage($i);
-								$pdf->AddPage();
+								$pdf->AddPage();	
 								$pdf->useTemplate($tplidx);
-
+							
 							}
-
+								
 						}
-
+												
 					}
-
-					ob_end_clean();
-
-					$pdf->Output('rechnungen.pdf', 'I');
-
-					exit;
-
-				}
-				else
-				{
-
+					
+					die($pdf->Output());
+					
+				}
+				else 
+				{
 					die(__('Keine Rechnungen gewÃ€hlt!', 'wpsg'));
-
-				}
-
-			} else if (isset($_REQUEST['wpsg_order_doaction'])) {
-
-				if ($_REQUEST['wpsg_action'] == '-1') $this->addBackendError(__('Bitte eine Aktion wÃ€hlen!', 'wpsg'));
-				else if (!isset($_REQUEST['wpsg_multido']) || !is_array($_REQUEST['wpsg_multido'])) $this->addBackendError(__('Bitte mindestens eine Bestellung auswÃ€hlen!', 'wpsg'));
-				else {
-
-					if ($_REQUEST['wpsg_action'] == 'multiDelete') {
-
-						$arOrderID = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `id` IN (".wpsg_q(implode(',', array_keys($_REQUEST['wpsg_multido']))).") ");
-						$arOrder = wpsg_order::getInstance($arOrderID);
-
-						foreach ($arOrder as $oOrder) { $oOrder->delete(); }
-
-						$this->shop->addBackendError(wpsg_translate(__('#1# Bestellung(en) gelÃ¶scht.', 'wpsg'), sizeof($arOrder)));
-
-					} else if ($_REQUEST['wpsg_action'] == 'writeRechnung') {
-
+				}
+				
+			}
+			
+			if (isset($_REQUEST['filter']))
+			{
+
+				$this->shop->view['filter'] = $_REQUEST['filter'];
+				
+			}
+			else
+			{
+				
+				$this->shop->view['filter'] = array();
+				
+				if (isset($_COOKIE['wpsg_order_status']) && !isset($_REQUEST['k_id']))
+				{
+					
+					$this->shop->view['filter']['status'] = $_COOKIE['wpsg_order_status'];
+					
+				}
+				
+			}
+			
+			if (!isset($_REQUEST['k_id']) && !wpsg_isSizedInt($this->shop->view['filter']['status']) && $this->shop->view['filter']['status'] != -1) $this->shop->view['filter']['status'] = 0;
+			else if (isset($_REQUEST['k_id']) && !wpsg_isSizedInt($this->shop->view['filter']['status'])) $this->shop->view['filter']['status'] = -1;
+			
+			if (is_numeric($this->shop->view['filter']['status']) && $this->shop->view['filter']['status'] >= 0)
+			{
+				
+				$strQueryStatusWHERE .= " AND O.`status` = '".wpsg_q($this->shop->view['filter']['status'])."' ";
+				
+			}
+			else if (preg_match('/\d+\,\d+/', $this->shop->view['filter']['status']))
+			{
+
+				$strQueryStatusWHERE .= " AND O.`status` IN (".wpsg_q($this->shop->view['filter']['status']).") ";
+				
+			}
+			
+			if ($this->shop->view['filter']['k_id'] > 0)
+			{
+				
+				$strQueryWHERE .= " AND O.`k_id` = '".wpsg_q($this->shop->view['filter']['k_id'])."' ";
+				
+				$this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['filter']['k_id']);
+				
+			}
+						
+			if (@$this->shop->view['filter']['search'] != '')
+			{
+				
+				$strQueryWHERE .= " 
+					AND (
+						K.`vname` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' OR
+						K.`email` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' OR
+						K.`firma` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' OR
+						K.`ustidnr` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' OR						
+						K.`name` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' OR
+						O.`onr` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' OR
+						O.`id` = '".wpsg_q($this->shop->view['filter']['search'])."' OR
+						O.`custom_data` LIKE '%".wpsg_q($this->shop->view['filter']['search'])."%' 						
+					)
+				"; 
+				
+			}
+			
+			if (@$this->shop->view['filter']['invoice_month_von'] > 0 || @$this->shop->view['filter']['invoice_year_von'] > 0)
+			{
+				
+				$strQueryFROM .= " LEFT JOIN `".WPSG_TBL_RECHNUNGEN."` AS R ON (R.`o_id` = O.`id` AND R.`rnr` != '' AND R.`storno` = '0000-00-00') ";
+
+				if ($this->shop->view['filter']['invoice_month_von'] > 0)
+				{
+					
+					$strQueryWHERE .= " AND DATE_FORMAT(R.`datum`, '%m') = '".wpsg_q($this->shop->view['filter']['invoice_month_von'])."' ";
+					
+				}
+				
+				if ($this->shop->view['filter']['invoice_year_von'] > 0)
+				{
+					
+					$strQueryWHERE .= " AND DATE_FORMAT(R.`datum`, '%Y') = '".wpsg_q($this->shop->view['filter']['invoice_year_von'])."' ";
+					
+				}
+				
+			}
+			
+			if (@$this->shop->view['filter']['year_von'] != '' && $this->shop->view['filter']['year_von'] != '-1')
+			{
+				
+				$strQueryWHERE .= " AND DATE_FORMAT(O.`cdate`, '%Y') = '".wpsg_q($this->shop->view['filter']['year_von'])."' ";
+				
+			}
+			
+			if (@$this->shop->view['filter']['month_von'] != '' && $this->shop->view['filter']['month_von'] != '-1')
+			{
+				
+				$strQueryWHERE .= " AND DATE_FORMAT(O.`cdate`, '%m') = '".wpsg_q($this->shop->view['filter']['month_von'])."' ";
+				
+			}
+			
+			$strQueryORDER = '';
+				
+			if (!isset($this->shop->view['filter']['order']))
+			{
+			
+				$this->shop->view['filter']['order'] = 'nr';
+			
+			} 
+				
+			switch ($this->shop->view['filter']['order'])
+			{
+			
+				case 'customer': $strQueryORDER = " K.`name` "; break;
+				case 'payment': $strQueryORDER = " `payment_name` "; break;			
+				case 'produkte': $strQueryORDER = " `produkt_menge` "; break;
+				case 'amount': $strQueryORDER = " O.`price_gesamt` "; break;
+				case 'status': $strQueryORDER = " `status_name` "; break;				
+				case 'abo': $strQueryORDER = " `abo` "; break;
+				default: $strQueryORDER = " O.`cdate` "; break;
+			
+			}
+							
+			if (!isset($this->shop->view['filter']['ascdesc']))
+			{
+			
+				$this->shop->view['filter']['ascdesc'] = 'DESC';
+			
+			}
+			
+			$nPerPage = $this->get_option('wpsg_order_perpage');
+			if ($nPerPage <= 0) $nPerPage = 10;
+			
+			if (isset($_REQUEST['seite'])) $seite = $_REQUEST['seite']; else $seite = 1;
+				
+			// Bestellungen nach Status zÃ€hlen
+			$this->shop->view['arStatus'] = array();
+			foreach ((array)$this->shop->arStatus as $status_id => $status)
+			{
+					
+				$count = $this->db->fetchOne("
+					SELECT
+						COUNT(*)
+					FROM
+						`".WPSG_TBL_ORDER."` AS O
+							LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`)
+							".$strQueryFROM."
+					WHERE
+						1
+						".$strQueryWHERE."
+						AND O.`status` = '".wpsg_q($status_id)."'
+				");
+							
+				$this->shop->view['arStatus'][$status_id] = $count;
+					
+				if ($this->shop->get_option('wpsg_showincompleteorder') != '1' && $status_id == wpsg_ShopController::STATUS_UNVOLLSTAENDIG) unset($this->shop->view['arStatus'][$status_id]);
+				
+			}
+							
+			//if (!isset($this->shop->view['filter']['status']) || !array_key_exists($this->shop->view['filter']['status'], $this->shop->view['arStatus'])) $this->shop->view['filter']['status'] = '-1';
+			
+			//if (wpsg_isSizedString($this->shop->view['filter']['status']))
+			//{
+			 
+			if (is_numeric($this->shop->view['filter']['status']) && $this->shop->view['filter']['status'] >= 0)
+			{
+			
+				$strQueryStatusWHERE .= " AND O.`status` = '".wpsg_q($this->shop->view['filter']['status'])."' ";
+				
+			}
+			else if (preg_match('/\d+\,\d+/', $this->shop->view['filter']['status']))
+			{
+				
+				$strQueryStatusWHERE .= " AND O.`status` IN (".wpsg_q($this->shop->view['filter']['status']).") ";
+				
+			}					
+			else if (wpsg_isSizedString($this->shop->view['filter']['status'], '-1'))
+			{
+				
+				$strQueryStatusWHERE .= " AND O.`status` != '".wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)."' ";
+				
+			}
+			
+			//}
+			
+			$this->shop->view['count'] = $this->db->fetchOne("
+				SELECT
+					COUNT(*)
+				FROM	
+					`".WPSG_TBL_ORDER."` AS O
+						LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`)
+						".$strQueryFROM."
+				WHERE 
+					1
+					".$strQueryWHERE."
+					".$strQueryStatusWHERE."
+			");
+			
+			$this->shop->view['countAll'] = $this->db->fetchOne("
+				SELECT
+					COUNT(*)
+				FROM
+					`".WPSG_TBL_ORDER."` AS O
+						LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`)
+						".$strQueryFROM."
+				WHERE
+					1
+					".$strQueryWHERE."
+			");
+			 		
+			$this->shop->view['seite'] = $seite;
+			$this->shop->view['pages'] = ceil($this->shop->view['count'] / $nPerPage); 			
+			if ($this->shop->view['seite'] <= 0 || $this->shop->view['seite'] > $this->shop->view['pages']) $this->shop->view['seite'] = 1;
+
+			// Beim Export Pager ignorieren
+			if (!wpsg_isSizedInt($_REQUEST['submit_export']))
+			{
+
+				$strQueryLIMIT .= "
+					LIMIT
+						".(($this->shop->view['seite'] - 1) * $nPerPage).", ".$nPerPage."
+				";
+				
+			}
+
+			$strQuerySELECT = "";
+			if (sizeof($this->shop->arPayment) >= 1 && $this->shop->view['filter']['order'] == 'payment') 
+			{
+			
+				$strQuerySELECT .= " (CASE O.`type_payment` ";				
+				foreach ($this->shop->arPayment as $p) { $strQuerySELECT .= " WHEN '".wpsg_q($p['id'])."' THEN '".wpsg_q($p['name'])."' "; }
+				$strQuerySELECT .= " END) AS `payment_name`, ";
+						
+			}
+			 
+			if (sizeof($this->shop->arShipping) >= 1 && $this->shop->view['filter']['order'] == 'shipping')
+			{
+					
+				$strQuerySELECT .= " (CASE O.`type_shipping` ";
+				foreach ($this->shop->arShipping as $s) { $strQuerySELECT .= " WHEN '".wpsg_q($s['id'])."' THEN '".wpsg_q($s['name'])."' "; }
+				$strQuerySELECT .= " END) AS `payment_name`, ";
+			
+			}
+			
+			if ($this->shop->view['filter']['order'] == 'abo')
+			{
+				
+				$strQuerySELECT  = " (
+					IF (
+						O.`wpsg_mod_abo_origin_order` > 0,
+						(SELECT ABO.`cdate` FROM `".WPSG_TBL_ABO."` AS ABO WHERE `order_id` = O.`wpsg_mod_abo_origin_order`),
+						(SELECT ABO.`cdate` FROM `".WPSG_TBL_ABO."` AS ABO WHERE `order_id` = O.`id`)  
+					)		 
+				) AS `abo`, ";
+				
+			}
+			
+			if ($this->shop->view['filter']['order'] == 'produkte')
+			{
+				
+				$strQuerySELECT .= " (SELECT SUM(OP.`menge`) FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`o_id` = O.`id`) AS `produkt_menge`, ";
+				
+			}
+			
+			if ($this->shop->view['filter']['order'] == 'status')
+			{
+				
+				$strQuerySELECT .= " (CASE O.`status` ";
+				foreach ($this->shop->arStatus as $s_id => $s) { $strQuerySELECT .= " WHEN '".wpsg_q($s_id)."' THEN '".wpsg_q($s)."' "; }
+				$strQuerySELECT .= " END) AS `status_name`, ";
+				
+			}
+						
+			$strQuery = "
+				SELECT
+					O.*, K.*,
+					".$strQuerySELECT."
+					O.`status` AS `status`, 
+					O.`comment` AS `order_comment`, 
+					O.`id` AS id
+				FROM	
+					`".WPSG_TBL_ORDER."` AS O
+						LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`)
+						".$strQueryFROM."
+				WHERE
+					1 
+					".$strQueryWHERE."
+					".$strQueryStatusWHERE."
+				ORDER BY					
+					".wpsg_q($strQueryORDER)." ".wpsg_q($this->shop->view['filter']['ascdesc']).", O.`cdate` DESC 
+					".$strQueryLIMIT."				
+			"; 
+			 
+			$this->shop->view['data'] = $this->db->fetchAssoc($strQuery); 	
+			
+			if (isset($_REQUEST['wpsg_action']))
+			{
+				
+				if ($_REQUEST['wpsg_action'] == '-1')
+				{
+					$this->addBackendError(__('Bitte eine Aktion wÃ€hlen!', 'wpsg'));
+				}
+				else if (!isset($_REQUEST['wpsg_multido']) || !is_array($_REQUEST['wpsg_multido']))
+				{
+					$this->addBackendError(__('Bitte mindestens eine Bestellung auswÃ€hlen!', 'wpsg'));
+				}
+				else 
+				{
+					
+					if ($_REQUEST['wpsg_action'] == 'multiDelete')
+					{
+						
+						// Sortieren nach CDDATE
+						$arIDs_write = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `id` IN (".wpsg_q(implode(',', array_keys($_REQUEST['wpsg_multido']))).") ORDER BY `cdate` ASC");
+						
+						// Rechnung fÃŒr mehrere Bestellungen schreiben
+						foreach ($arIDs_write as $k)
+						{
+							
+							$this->shop->delOrder($k);
+							
+						}
+						
+						$this->shop->addBackendError(wpsg_translate(__('#1# Bestellung(en) gelÃ¶scht.', 'wpsg'), sizeof($arIDs_write)));
+						
+					}
+					else if ($_REQUEST['wpsg_action'] == 'writeRechnung')
+					{
+						
 						$nWriteRechnung = 0;
-
+						
 						// E-Mail an Kunden senden
 						$_REQUEST['wpsg_rechnungen_sendmail'] = '1';
-
+						
 						// Rechnungsdatum
-						$_REQUEST['wpsg_rechnungen_datum'] = date('Y-m-d');
-
+						$_REQUEST['wpsg_rechnungen_datum'] = date('d.m.Y');
+						
 						// Status setzen
 						$_REQUEST['wpsg_rechnungen_status'] = '1';
-
-						// Neuer Status
+						
+						// Neuer Status 
 						$_REQUEST['wpsg_rechnungen_status_neu'] = '110';
-
+						
 						// FuÃtext
 						if ($this->shop->get_option('wpsg_rechnungen_foottext_standard') !== false)
 						{
-
+							
 							$wpsg_rechnungen_footer = $this->get_option("wpsg_rechnungen_footer");
-							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = unserialize($this->get_option("wpsg_rechnungen_footer"));
+ 							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = unserialize($this->get_option("wpsg_rechnungen_footer"));
 							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = Array();
-
-							$_REQUEST['wpsg_rechnungen_fusstext'] = wpsg_getStr($wpsg_rechnungen_footer[$this->shop->get_option('wpsg_rechnungen_foottext_standard')][1]);
+							
+							$_REQUEST['wpsg_rechnungen_fusstext'] = $wpsg_rechnungen_footer[$this->shop->get_option('wpsg_rechnungen_foottext_standard')][1];
 
 						}
 						else
 						{
-
+							
 							$_REQUEST['wpsg_rechnungen_fusstext'] = '';
-
+							
 						}
-
+												
 						// URL Benachrichtigung
 						$_REQUEST['wpsg_rechnungen_url'] = '0';
-
+						
 						// FÃ€lligkeit anzeigen
 						$_REQUEST['wpsg_rechnungen_faelligkeit'] = '1';
-
-						// FÃ€lligkeitsdatum anzeigen
-						if (!isset($_REQUEST['wpsg_rechnungen_faelligkeitsdatum'])) { $_REQUEST['wpsg_rechnungen_faelligkeitsdatum'] = date('Y-m-d'); }
-				
-						// Versandkosten berechnen
-						$_REQUEST['wpsg_rechnungen_shippay'] = '1';
-
-						// Rabatt/Gutscheine/Wertgutschein berechnen
-						$_REQUEST['wpsg_rechnungen_discount_voucher_coupon'] = '1';
-
+						
 						$arIDs = array();
-
+						
 						// Sortieren nach CDDATE
 						$arIDs_write = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `id` IN (".wpsg_q(implode(',', array_keys($_REQUEST['wpsg_multido']))).") ORDER BY `cdate` ASC");
-			
+						
 						// Rechnung fÃŒr mehrere Bestellungen schreiben
-						for ($i = 0; $i < count($arIDs_write); $i++) {
-
-							$k = $arIDs_write[$i];
-							
-							$invoice_products = array();
-
-							// If the invoice products array has not been set yet, retrieve the products for the current order and add them to the array
-							$db_invoice_products = $this->db->fetchAssoc("
-								SELECT
-									*
-								FROM
-									`".WPSG_TBL_ORDERPRODUCT."` 
-								WHERE
-									`o_id` = '".wpsg_q($k)."'
-							");
-
-							foreach ($db_invoice_products as $p) {
-
-								$invoice_products[$p['id']] = [
-									'set' => '1',
-									'amount' => $p['menge']
-								];
-							}
-
-							// Set the invoice products array in the request
-							$_REQUEST['invoice_products'] = $invoice_products;
+						foreach ($arIDs_write as $k)
+						{
 
 							$bRechnungExists = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `rnr` != '' AND `o_id` = '".wpsg_q($k)."' AND `storno` = '0000-00-00 00:00:00'");
@@ -1688,247 +818,99 @@
 							// E-Mail aus Bestellung
 							$_REQUEST['wpsg_rechnungen_email'] = $this->db->fetchOne("SELECT K.`email` FROM `".WPSG_TBL_ORDER."` AS O LEFT JOIN `".WPSG_TBL_KU."` AS K ON (O.`k_id` = K.`id`) WHERE O.`id` = '".wpsg_q($k)."'");
-
+							
 							if ($bRechnungExists <= 0)
 							{
-
-								try
-								{
-
-									$this->shop->callMod('wpsg_mod_rechnungen', 'writeRechnung', [$k, false, false]);
-									$arIDs[] = $k;
-									$nWriteRechnung ++;
-
-								}
-								catch (Exception $e)
-								{
-
-									die($e->getMessage());
-
-								}
-
+							
+								$this->shop->callMod('wpsg_mod_rechnungen', 'writeRechnung', array($k, false, false));
+								$arIDs[] = $k;
+								$nWriteRechnung ++;
+								
 							}
-
+														
 						}
-
+						
 						if ($nWriteRechnung <= 0)
 						{
-
+							
 							$this->addBackendError(__('FÃŒr die gewÃ€hlten Bestellungen konnten keine Rechnungen geschrieben werden, bestehende Rechnungen mÃŒssen erst storniert werden.', 'wpsg'));
-
+							
 						}
-						else
-						{	
-
-                            $this->addBackendMessage(
-								'nohspc_'.wpsg_translate(__('#1# Rechnungen geschrieben', 'wpsg'), $nWriteRechnung)
-								//.' <a href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&noheader=1&wpsg_action=showRechnung&ids='.implode('_', $arIDs).'" target="_new">'.__('Download', 'wpsg').'</a>'
+						else 
+						{
+							
+							$this->addBackendMessage(
+								'nohspc_'.
+								wpsg_translate(__('#1# Rechnungen geschrieben', 'wpsg'), $nWriteRechnung).
+								' <a href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&noheader=1&do=writeMultiRechnung&ids='.implode('_', $arIDs).'" target="_new">'.__('Download', 'wpsg').'</a>'
 							);
-
+							
 						}
-	
-					} else if ($_REQUEST['wpsg_action'] == 'writeMultiRechnung') {
-
-						$bPreview = $_REQUEST['preview'] === '1';
-						$nWriteRechnung = 0;
-
-						// Status setzen
-						$_REQUEST['wpsg_Multirechnung_status'] = '1';
-						
-						// Neuer Status
-						$_REQUEST['wpsg_Multirechnung_status_neu'] = '120';
-
-						// URL Benachrichtigung
-						$_REQUEST['wpsg_Multirechnung_url'] = '0';
-
-						// FuÃtext
-						if ($this->shop->get_option('wpsg_rechnungen_foottext_standard') !== false) {
-
-							$wpsg_rechnungen_footer = $this->get_option("wpsg_rechnungen_footer");
-							
-							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = unserialize($this->get_option("wpsg_Multirechnung_footer"));
-							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = Array();
-
-							$_REQUEST['wpsg_Multirechnung_fusstext'] = wpsg_getStr($wpsg_rechnungen_footer[$this->shop->get_option('wpsg_rechnungen_foottext_standard')][1]);
-
-						} else {
-
-							$_REQUEST['wpsg_Multirechnung_fusstext'] = '';
-
+						
+					}
+					else if (is_numeric($_REQUEST['wpsg_action']))
+					{
+						
+						// Status setzen						
+						foreach ($_REQUEST['wpsg_multido'] as $k => $v)
+						{
+							
+							$this->shop->setOrderStatus($k, $_REQUEST['wpsg_action'], false);
+							
 						}
-
-						// Sortieren nach CDDATE
-						$arIDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `id` IN (".wpsg_q(implode(',', array_keys($_REQUEST['wpsg_multido']))).") ORDER BY `cdate` ASC");
-
-						// Rechnung fÃŒr mehrere Bestellungen schreiben
-						foreach ($arIDs as $k) {
-
-							$bRechnungExists = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `rnr` != '' AND (
-								`o_id` = '".wpsg_q($k)."' OR
-								 FIND_IN_SET('".intval($k)."', `o_ids`)
-							) AND `storno` = '0000-00-00 00:00:00'
-							");
-
-							// E-Mail aus Bestellung
-							// $_REQUEST['wpsg_Multirechnung_email'] = $this->db->fetchOne("SELECT K.`email` FROM `".WPSG_TBL_ORDER."` AS O LEFT JOIN `".WPSG_TBL_KU."` AS K ON (O.`k_id` = K.`id`) WHERE O.`id` = '".wpsg_q($k)."'");
-							
-							if (intval($_REQUEST['wpsg_Multirechnung_sendmail']) !== 1) {
-								
-								$oOrder = wpsg_order::getInstance(intval($k));
-								$_REQUEST['wpsg_Multirechnung_email'] = $oOrder->getCustomer()->getEMailEInvoice();
-	
-							}
-							
-							if ($bRechnungExists <= 0) {
-								
-								try {
-
-									$nWriteRechnung ++;
-
-								} catch (Exception $e) {
-
-									die($e->getMessage());
-
-								}
-
-							}
-
-						}
-						
-						if ($nWriteRechnung <= 0) {
-
-							if (!$bPreview) $this->addBackendError(__('FÃŒr die gewÃ€hlten Bestellungen konnten keine Sammelrechnungen geschrieben werden, bestehende Rechnungen mÃŒssen erst storniert werden.', 'wpsg'));
-
-						} else {
-							
-							$this->shop->callMod('wpsg_mod_rechnungen', 'writeMultiRechnung', [$arIDs, $bPreview]); 
-
-							// Downloadlink buggy
-							if (!$bPreview) $this->addBackendMessage(
-								'nohspc_'.wpsg_translate(__('Rechnungen als Sammelechnung geschrieben', 'wpsg'))
-								//.' <a href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&noheader=1&do=writeMultiRechnung&ids='.implode('_', $arIDs).'" target="_new">'.__('Download', 'wpsg').'</a>'
-							);
-
-						}
-						
-					} else if (is_numeric($_REQUEST['wpsg_action']) || preg_match('/\d+\_\d+/', ($_REQUEST['wpsg_action']??''))) {
-
-						// Status setzen
-						foreach ($_REQUEST['wpsg_multido'] as $k => $v) {
-
-							$this->shop->setOrderStatus($k, $_REQUEST['wpsg_action'], intval($_REQUEST['inform']??'0') === 1, false, true);
-
-						}
-
-						if (intval($_REQUEST['inform']??'0') === 1) {
-
-							$this->addBackendMessage(wpsg_translate(__('Status von #1# Bestellungen aktualisiert (Kunden wurden benachrichtigt)', 'wpsg'), sizeof($_REQUEST['wpsg_multido'])));
-
-						} else {
-
-							$this->addBackendMessage(wpsg_translate(__('Status von #1# Bestellungen aktualisiert (Kunden wurden nicht benachrichtigt)', 'wpsg'), sizeof($_REQUEST['wpsg_multido'])));
-
-						}
-
+						
+						$this->addBackendMessage(wpsg_translate(__('Status von #1# Bestellungen aktualisiert (Kunden wurden nicht benachrichtigt)', 'wpsg'), sizeof($_REQUEST['wpsg_multido'])));
+						
 					}
-
-				}
-
-				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
-
-			}
-			
-			if (isset($_REQUEST['submit-button'])) check_admin_referer('wpsg-order-search');
-
-			$nPerPage = $this->get_option('wpsg_order_perpage');
-			if ($nPerPage <= 0) $nPerPage = 10;
-
-			$this->shop->view['hasFilter'] = false;
-			$this->shop->view['pages'] = 0;
-			$this->shop->view['arStatus'] = array();
-			$this->shop->view['arFilter'] = array(
-				'order' => 'cdate',
-				'ascdesc' => 'DESC',
-				'status' => '0',
-				'page' => '1'
-			);
-
-			$this->shop->view['tabs'] = array('left' => array(), 'right' => array());
-
-			$this->shop->callMods('order_index_tab', array(&$this->shop->view['tabs']));
-
-			if (wpsg_isSizedArray($_REQUEST['filter'])) {
-
-			    if (wpsg_checkInput($_REQUEST['filter']['s'], WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true])) $_REQUEST['filter']['s'] = sanitize_text_field($_REQUEST['filter']['s']);
-                if (wpsg_checkInput($_REQUEST['filter']['k_id'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $_REQUEST['filter']['k_id'] = sanitize_text_field($_REQUEST['filter']['k_id']);
-                if (wpsg_checkInput($_REQUEST['filter']['cdate_m'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $_REQUEST['filter']['cdate_m'] = sanitize_text_field($_REQUEST['filter']['cdate_m']);
-                if (wpsg_checkInput($_REQUEST['filter']['cdate_y'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $_REQUEST['filter']['cdate_y'] = sanitize_text_field($_REQUEST['filter']['cdate_y']);
-                if (wpsg_checkInput($_REQUEST['filter']['payment_key'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $_REQUEST['filter']['payment_key'] = sanitize_text_field($_REQUEST['filter']['payment_key']);
-                
-                if ($this->shop->hasMod('wpsg_mod_rechnungen')) {
-
-                    if (wpsg_checkInput($_REQUEST['filter']['invoicedate_m'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $_REQUEST['filter']['invoicedate_m'] = sanitize_text_field($_REQUEST['filter']['invoicedate_m']);
-                    if (wpsg_checkInput($_REQUEST['filter']['invoicedate_y'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $_REQUEST['filter']['invoicedate_y'] = sanitize_text_field($_REQUEST['filter']['invoicedate_y']);
-
-                }
-
-				$this->shop->view['arFilter'] = $_REQUEST['filter'];
-
-			} else if (wpsg_isSizedArray($_SESSION['wpsg']['backend']['order']['arFilter'])) {
-
-				$this->shop->view['arFilter'] = $_SESSION['wpsg']['backend']['order']['arFilter'];
-
-			}
-
-			if (!isset($this->shop->view['arFilter']['status'])) $this->shop->view['arFilter']['status'] = '0';
-
-			// Filter gesetzt?
-			foreach (Array('s', 'k_id', 'cdate_m', 'cdate_y', 'invoicedate_m', 'invoicedate_y', 'payment_key') as $field) {
-
-				if (wpsg_isSizedString($this->shop->view['arFilter'][$field]) && $this->shop->view['arFilter'][$field] != '-1') { $this->shop->view['hasFilter'] = true; break; }
-
-			}
-
-			foreach ($this->shop->arStatus as $status_key => $status_label) {
-
-				if ($this->shop->get_option('wpsg_showincompleteorder') != '1' && $status_key == wpsg_ShopController::STATUS_UNVOLLSTAENDIG) continue;
-
-				$arFilterState = $this->shop->view['arFilter'];
-				$arFilterState['status'] = $status_key;
- 
-				$count = wpsg_order::count($arFilterState);
-
-				if (wpsg_isSizedInt($count)) $this->shop->view['arStatus'][$status_key] = array('label' => $status_label, 'count' => $count);
-
-			}
-
-			$arFilterState = $this->shop->view['arFilter']; unset($arFilterState['status']);
-			$arFilterState['NOTstatus'] = wpsg_ShopController::STATUS_UNVOLLSTAENDIG;
-
-			$this->shop->view['arStatus'] = wpsg_array_merge(array('-1' => array('label' => __('Alle', 'wpsg'), 'count' => wpsg_Order::count($arFilterState))), $this->shop->view['arStatus']);
-
-			if ($this->shop->view['arFilter']['status'] == '-1') $this->shop->view['arFilter']['NOTstatus'] = wpsg_ShopController::STATUS_UNVOLLSTAENDIG;
-
-			$this->shop->view['countAll'] = wpsg_order::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = $_REQUEST['seite'];
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if (!isset($this->shop->view['arFilter']['page']) || $this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['order']['arFilter'] = $this->shop->view['arFilter'];
-
-			$this->shop->view['arData'] = wpsg_order::find($this->shop->view['arFilter']);
-
-			$this->shop->view['cdate_years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`cdate`, '%Y') FROM `".WPSG_TBL_ORDER."` ORDER BY `cdate` DESC ");
-
-			if ($this->shop->hasMod('wpsg_mod_rechnungen')) $this->shop->view['invoicedate_years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`datum`, '%Y') FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `storno` = '0000-00-00' AND `gnr` = '' ORDER BY `datum` ASC ");
-			else $this->shop->view['invoicedate_years'] = [];
-
-			$this->shop->render(WPSG_PATH_VIEW.'/order/index.phtml');
-
+										
+				}
+				
+				$requestString = http_build_query(array("filter" => $_REQUEST['filter']), null, '&');					
+				if ($_REQUEST['seite'] > 0) $requestString .= "&seite=".$_REQUEST['seite'];
+				
+				$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order'.$requestString);
+				
+			}
+			
+			foreach ($this->shop->view['data'] as $k => $v)
+			{
+				
+				$basket = new wpsg_basket();
+				$basket->initFromDB($v['id'], true);
+				$this->shop->view['data'][$k]['basket'] = $basket->toArray(true);
+
+				// Bestellobjekt
+				$this->shop->view['data'][$k]['oOrder'] = wpsg_order::getInstance($v['id']);
+				
+				if ($v['shipping_land'] > 0) $this->shop->view['data'][$k]['land_krzl'] = $this->db->fetchOne("SELECT L.`kuerzel` FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($v['shipping_land'])."' ");
+				else if ($v['land'] > 0) $this->shop->view['data'][$k]['land_krzl'] = $this->db->fetchOne("SELECT L.`kuerzel` FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($v['land'])."' ");
+				else $this->shop->view['data'][$k]['land_krzl'] = '12';
+				
+			}
+			
+			$this->shop->view['years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`cdate`, '%Y') FROM `".WPSG_TBL_ORDER."`");
+									
+			if ($this->shop->hasMod('wpsg_mod_rechnungen'))
+			{
+				
+				$this->shop->view['invoice_years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`datum`, '%Y') FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `storno` = '0000-00-00' AND `gnr` = '' ");
+				
+			}
+			
+			if (isset($_REQUEST['submit_export']) && $_REQUEST['submit_export'] == '1')
+			{
+				
+				$this->shop->callMod('wpsg_mod_export', 'handleExport');
+				
+			}
+			else
+			{
+				
+				$this->shop->render(WPSG_PATH_VIEW.'/order/index.phtml');
+			
+			}
+			
 		} // public function indexAction()
-
+		
 	} // class wpsg_OrderController extends wpsg_SystemController
+
+?>
Index: /controller/wpsg_ProduktController.class.php
===================================================================
--- /controller/wpsg_ProduktController.class.php	(revision 8528)
+++ /controller/wpsg_ProduktController.class.php	(revision 5261)
@@ -4,969 +4,406 @@
 	 * Controller fÃŒr die Produktverwaltung
 	 */
-	class wpsg_ProduktController extends wpsg_SystemController {
-
+	class wpsg_ProduktController extends wpsg_SystemController
+	{
+		
 		/**
 		 * Ãbernimmt die Verteilung der Anfragen
 		 */
-		public function dispatch() {
-
+		public function dispatch()
+		{
+			
 			parent::dispatch();
-
-			if (!wpsg_checkInput($_REQUEST['action'], WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-			else $action = wpsg_getStr($_REQUEST['action']);
-			
-			if (wpsg_isSizedString($action, 'add')) {
-				
-				$this->addAction();
-				
-			} else if (wpsg_isSizedString($action, 'edit')) {
-				
+			
+			if (wpsg_isSizedString($_REQUEST['action'], 'add'))
+			{
+				$this->addAction();	
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'edit'))
+			{
 				$this->editAction();
-				
-			} else if (wpsg_isSizedString($action, 'export')) {
-				
-				$this->exportAction();
-				
-			} else if (wpsg_isSizedString($action, 'exportMedia')) {
-
-				$this->exportMediaAction();
-
-			} else if (wpsg_isSizedString($action, 'import')) {
-				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'export'))
+			{
+				$this->exportAction();				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'import'))
+			{
 				$this->importAction();
-				
-			} else if (wpsg_isSizedString($action, 'copy')) {
-				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'copy'))
+			{
 				$this->copyAction();
-				
-			} else if (wpsg_isSizedString($action, 'del')) {
-				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'del'))
+			{
 				$this->delAction();
-				
-			} else if (wpsg_isSizedString($action, 'save')) {
-				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'save'))
+			{
 				$this->saveAction();
-				
-			} else if (wpsg_isSizedString($action, 'select')) {
-				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'select'))
+			{
 				$this->selectAction();
-				
-			} else if (wpsg_isSizedString($action, 'ajax')) {
-				
+			}
+			else if (wpsg_isSizedString($_REQUEST['action'], 'ajax'))
+			{
 				$this->ajaxAction();
-				
-			} else {
-				
+			}
+			else
+			{
 				$this->indexAction();
 			}
-
+			
 		} // public function dispatch()		
-
+		
 		/**
 		 * Nimmt Ajax Anfragen innerhalb der Produktverwaltung entgege
 		 */
-		public function ajaxAction() {
-			
-			if (!wpsg_checkInput($_REQUEST['mod'], WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-			else $mod = wpsg_getStr($_REQUEST['mod']);
-			
-			if (!wpsg_checkInput($_REQUEST['cmd'], WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-			else $cmd = wpsg_getStr($_REQUEST['cmd']);
-		 
-			if (wpsg_isSizedString($mod)) {
-
-				// Check valid text input
-				if (!wpsg_checkInput($mod, WPSG_SANITIZE_TEXTFIELD)) throw \wpsg\Exception::getSanitizeException();
-				
-				$this->shop->callMod($mod, 'produkt_ajax');
-
-			} else if ($cmd === 'upload') {
-			    
-				// Check Arrry of int
-				if (!wpsg_checkInput($_REQUEST['post_id'], WPSG_SANITIZE_ARRAY_INT)) throw \wpsg\Exception::getSanitizeException();
+		public function ajaxAction()
+		{
+			
+			if (isset($_REQUEST['mod']))
+			{
+				
+				$this->shop->callMod($_REQUEST['mod'], 'produkt_ajax');
+				
+			}
+			
+		} // public function ajaxAction()
+		
+		/**
+		 * Stellt die Ãbersicht der Produkte im Backend dar
+		 */
+		public function indexAction()
+		{
+			
+			$search = array();
+			$strQueryWHERE = "";
+			
+			if (isset($_REQUEST['s']) && $_REQUEST['s'] != '')
+			{
+				
+				$strQueryWHERE_OR = "";
+				
+				if ($this->shop->hasMod('wpsg_mod_varianten')) $strQueryWHERE_OR .= " OR `mod_varianten` LIKE '%".wpsg_q($_REQUEST['s'])."%' ";					
+				
+				$strQueryWHERE .= " 
+					AND (
+						P.`name` LIKE '%".wpsg_q($_REQUEST['s'])."%' OR
+						P.`anr` LIKE '%".wpsg_q($_REQUEST['s'])."%'
+						".$strQueryWHERE_OR."
+					)
+				";
+
+				$search['s'] = $_REQUEST['s'];
+				
+			}
+			
+			if (isset($_REQUEST['search']['pgruppe']) && $_REQUEST['search']['pgruppe'] > 0)
+			{
+				
+				$strQueryWHERE .= " AND P.`pgruppe` = '".wpsg_q($_REQUEST['search']['pgruppe'])."' ";
+				$search['pgruppe'] = $_REQUEST['search']['pgruppe'];
+				
+			}
+			
+			$strQueryORDER = '';
+			
+			if (!isset($_REQUEST['search']['order']))
+			{
+				
+				$search['order'] = 'name';
 								
-				// Check Datatype
-				if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-				else $edit_id = intval($_REQUEST['edit_id']);
-				
-			    foreach ($_REQUEST['post_id'] as $post_id) {
-			    
-			    	$post_id = intval($post_id);
-			    	
-                    add_post_meta($post_id, 'wpsg_produkt_id', $edit_id);
-
-                }
-				
-                $this->shop->view['data']['id'] = $edit_id;
-                    
-                die($this->imagehandler->getProductListBackend($edit_id));
-
-			} else if ($cmd === 'setImageOrder') {
-
-				// Check int type
-				if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-				else $pid = intval($_REQUEST['edit_id']);
-												
-				// Check array type
-				if (!wpsg_isSizedArray($_REQUEST['wpsg_reorder'])) throw \wpsg\Exception::getSanitizeException();
-				 
-				$sreo = '';
-
-				foreach ($_REQUEST['wpsg_reorder'] as $v) {
-
-					$st = explode('_', $v);
+			}
+			else
+			{
+
+				$search['order'] = $_REQUEST['search']['order'];
+				
+			}
+			
+			switch ($search['order'])
+			{
+				
+				case 'mwst': $strQueryORDER = "P.`mwst_key`"; break;		
+				case 'anr': $strQueryORDER = "P.`anr`"; break;
+				case 'stock': $strQueryORDER = "P.`stock`"; break;
+				case 'pgruppe': $strQueryORDER = "`pgruppe_name`"; break;	
+				case 'price':
+
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO) $strQueryORDER = "P.`preis_netto`"; 
+					else $strQueryORDER = "P.`preis`";
+
+					break;
+					
+				case 'id': $strQueryORDER = "P.`id`"; break;
+					
+				default: $strQueryORDER = "P.`name`"; break;  
+				
+			}
+			
+			if (!isset($_REQUEST['search']['ascdesc']))
+			{
+				
+				$search['ascdesc'] = 'asc';
+				
+			}
+			else
+			{
+				
+				$search['ascdesc'] = $_REQUEST['search']['ascdesc'];
+				
+			}
+			
+			$this->shop->view['search'] = $search;
+						
+			$GLOBALS['wpsg_produkt_index_query_where'] = $strQueryWHERE;
+			
+			$nPerPage = $this->get_option('wpsg_produkte_perpage');
+			if ($nPerPage <= 0) $nPerPage = 10;
+			
+			if (isset($_REQUEST['seite'])) $seite = $_REQUEST['seite']; else $seite = 1;
+									
+			$this->shop->view['count'] = $this->db->fetchOne("
+				SELECT
+					COUNT(*)
+				FROM	
+					`".WPSG_TBL_PRODUCTS."` AS P
+				WHERE
+					`deleted` != '1' AND 
+					`lang_parent` = 0  
+					".$strQueryWHERE."
+			");
+			
+			$this->shop->view['seite'] = $seite;
+			$this->shop->view['pages'] = ceil($this->shop->view['count'] / $nPerPage); 			
+			if ($this->shop->view['seite'] <= 0 || $this->shop->view['seite'] > $this->shop->view['pages']) $this->shop->view['seite'] = 1;
+			
+			$strQuerySELECT = "";
+			
+			if ($this->shop->hasMod('wpsg_mod_productgroups'))
+			{
+				
+				$strQuerySELECT .= ", (SELECT PG.`name` FROM `".WPSG_TBL_PRODUCTS_GROUP."` AS PG WHERE PG.`id` = P.`pgruppe`) AS `pgruppe_name` ";
+				
+			}
+			
+			$this->shop->view['data'] = $this->db->fetchAssoc("
+				SELECT
+					P.*
+					".$strQuerySELECT." 				
+				FROM	
+					`".WPSG_TBL_PRODUCTS."` AS P
+				WHERE
+					`deleted` != '1' AND
+					`lang_parent` = 0 
+					".$strQueryWHERE."
+				ORDER BY
+					".wpsg_q($strQueryORDER)." ".wpsg_q($search['ascdesc'])."
+				LIMIT
+					".(($this->shop->view['seite'] - 1) * $nPerPage).", ".$nPerPage."
+			");
+			
+			$default_country = $this->shop->getDefaultCountry();
+			
+			foreach ($this->shop->view['data'] as &$d)
+			{
+								
+				$d['mwst_value'] = $default_country->getTax($d['mwst_key']); 
+				
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/produkt/index.phtml');
+			
+		} // public function indexAction()
+		
+		/**
+		 * Wird beim exportieren der Produkte aufgerufen
+		 */
+		public function exportAction()
+		{
+			
+			$arData = $this->db->fetchAssoc("SELECT * FROM `".wpsg_q(WPSG_TBL_PRODUCTS)."` WHERE `deleted` != '1'");
+			
+			if (!wpsg_isSizedArray($arData)) { $this->addBackendError(__('Keine Daten zum Exportieren vorhanden.', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=index'); return; }
+			
+			foreach ($arData as $k => $v)
+			{
+				
+				// Produktattribute laden
+				if ($this->shop->hasMod('wpsg_mod_produktattribute'))
+				{
 										
-					$sreo .= intval($st[1]).',';
-
-				}
-
-				$sreo = substr($sreo, 0, strlen($sreo) - 1);
-
-				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array("postids" => wpsg_q($sreo)), "`id` = '".wpsg_q($pid)."'");
-
-				die('1');
-
-			} else if ($cmd == 'removeImage') {
-				
-				// Check Datatype int
-				if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-				else $edit_id = intval($_REQUEST['edit_id']);
-				
-				// Check Datatype int
-				if (!wpsg_checkInput($_REQUEST['pid'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-				else $pid = intval($_REQUEST['pid']);
-				
-				// Auch in der Mediathek lÃ¶schen
-				if (wpsg_isSizedString($_REQUEST['delmt'], 'true')) {
-
-					// Sanitize
-					if (!wpsg_checkInput($pid, WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-					else $pid = intval($pid);
-					
-					wp_delete_post($pid, true);
-
-				}
-
-				// Zuordnung lÃ¶schen
-				delete_post_meta($pid, 'wpsg_produkt_id', $edit_id);
-
-				$this->shop->view['data']['id'] = $edit_id;
-
-				if ($this->shop->hasMod('wpsg_mod_produktartikel')) $this->shop->callMod('wpsg_mod_produktartikel', 'updatePostThumbnail', array($edit_id));
-
-				die($this->imagehandler->getProductListBackend($edit_id));
-
-			} else if ($cmd === 'ratingDel') {
-
-				if (!wpsg_checkInput($_REQUEST['c_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-				else $c_id = intval($_REQUEST['c_id']);
-				
-				wp_delete_comment($c_id, true); 
-
-			}
-
-		} // public function ajaxAction()
-
-		/**
-		 * Stellt die Ãbersicht der Produkte im Backend dar
-		 */
-		public function indexAction() {
-						
-			if (isset($_REQUEST['submit-button'])) check_admin_referer('wpsg-product-search');
-						
-			$nPerPage = intval($this->shop->get_option('wpsg_produkte_perpage'));
-			if ($nPerPage <= 0) $nPerPage = 10;
-
-			$this->shop->view['hasFilter'] = false;
-			$this->shop->view['arFilter'] = array(
-				'order' => 'cdate',
-				'ascdesc' => 'ASC',
-				'status' => '0',
-				'page' => '1'
-			);
-			$this->shop->view['arData'] = array();
-			$this->shop->view['pages'] = 1;
-
-			if (wpsg_isSizedInt($_REQUEST['search']['pgruppe'])) {
-				
-				$_REQUEST['filter']['productgroup_ids'] = $_REQUEST['search']['pgruppe'];
-				
-			}
-			
-			if (wpsg_isSizedArray($_REQUEST['filter'])) {
-
-				if (!wpsg_checkInput($_REQUEST['filter']['s'], WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-				else $_REQUEST['filter']['s'] = wpsg_xss($_REQUEST['filter']['s']); 
-
-				$this->shop->view['arFilter'] = $_REQUEST['filter'];
-				$this->shop->view['hasFilter'] = true;
-
-			} 
-
-			$this->shop->view['arFilter']['showDisabled'] = true;
-
-			$this->shop->view['countAll'] = wpsg_product::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = intval($_REQUEST['seite']);
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if ($this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['products']['arFilter'] = $this->shop->view['arFilter'];
-
-			if ($this->shop->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat')) {
-				
-				$this->shop->view['arFilter']['loadCat'] = true;
-				
-			}
-			
-			$this->shop->view['arData'] = wpsg_product::find(wpsg_array_merge(array('searchExt' => '1'), $this->shop->view['arFilter']));
-			
-			if (isset($_REQUEST['submit-button'])) $this->shop->view['submit'] = true;
-			else $this->shop->view['submit'] = false;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/produkt/index.phtml');
-
-		} // public function indexAction()
-		
-		/**
-		 * Wird beim exportieren der Produkte aufgerufen
-		 * @param bool $bReturnData
-		 * @return array|void
-		 * @throws \wpsg\Exception
-		 */
-		public function exportAction($bReturnData = false, $noNounce = false) {
-			
-			if (!$noNounce) check_admin_referer('wpsg-product-export');
-
-			$arData = $this->db->fetchAssoc("SELECT * FROM `".wpsg_q(WPSG_TBL_PRODUCTS)."` WHERE `deleted` != '1'");
-
-			if (!wpsg_isSizedArray($arData)) { $this->addBackendError(__('Keine Daten zum Exportieren vorhanden.', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=index'); return; }
-
-			foreach ($arData as $k => $v) {
-
-			    $product_id = intval($v['id']); $oProduct = wpsg_product::getInstance($product_id);
-
-                $addColum = function($col_key) use (&$arData) {
- 
-                    foreach ($arData as $k => $v) {
-
-                        if (!isset($arData[$k][$col_key])) $arData[$k][$col_key] = '';
-
-                    }
-
-                };
-
-				// Produktattribute laden
-				if ($this->shop->hasMod('wpsg_mod_produktattribute')) {
-
 					$att = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_AT."`");
-
-					foreach ($att as $a) {
-
-					    $addColum('ATT_'.$a['name']);
-
+					
+					foreach ($att as $a)
+					{
+						
 						$arData[$k]["ATT_".$a['name']] = $this->db->fetchOne("SELECT `value` FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `p_id` = '".wpsg_q($v['id'])."' AND `a_id` = '".wpsg_q($a['id'])."' ");
-
+						
 					}
-
-				}
-
-				// Produktvarianten
-				if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
-
-                    if (wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'isVariantsProduct', [$product_id])) {
-
-                        $arVariInfo = wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'getVariants', [$product_id, true, false, true]);
-
-                        foreach ($arVariInfo as $var) {
-
-                            $row_var = $arData[$k];
-
-                            foreach ($var as $k2 => $v2) {
-
-                                if (!in_array($k2, ['arVariation'])) {
-
-                                    $addColum('PV_'.$k2);
-                                    $row_var['PV_'.$k2] = $v2;
-
-                                } else if ($k2 === 'arVariation') {
-
-                                    foreach ($v2 as $k3 => $v3) {
- 
-                                        foreach ($v3 as $k4 => $v4) {
-
-											if (in_array($k4, ['ean', 'images_global'])) continue;
-
-                                            $addColum('PV_VARI_'.$k4);
-
-                                            $row_var['PV_VARI_'.$k4] = $v4;
-
-                                        }
-
-                                        $arData[] = $row_var;
-
-                                    }
-
-                                }
-
-                            }
-
-                            if (!wpsg_isSizedArray($var['arVariation'])) {
-
-                                $arData[] = $row_var;
-
-                            }
-
-                        }
-
-                    }
-
-                }
-
-				// Kategorien
-				if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_produktartikel')) {
-
-					$post_id = wpsg_ShopController::getShop()->callMod('wpsg_mod_produktartikel', 'getPostIdFromProductId', [$product_id]);
-
-					$arCat = \get_the_terms($post_id, $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'));
-					$arCatID = [];
-
-					if (wpsg_isSizedArray($arCat)) {
-
-						foreach ($arCat as $cat) {
-
-							$arCatID[] = $cat->term_id;
-
-						}
-
-					}
-
-					$addColum('cat_id');
-					$arData[$k]['cat_id'] = implode(',', $arCatID);
-					$arData[$k]['path'] = $this->db->fetchOne("
-		                SELECT
-		                    `post_name`
-		                FROM
-		                    `".$this->shop->prefix."posts`
-		                WHERE
-		                    `ID` = '".wpsg_q($post_id)."' 
-		            ");
-
-				}
-
-				// Productcodes
-				foreach (wpsg_product::getProductCodeConfig() as $code_key => $code_config) {
-				
-					$code = $oProduct->getProductCode($code_key)['code']??'';
-					
-					if ($code !== '') {
-					
-						$addColum($code_key);
-						$arData[$k][$code_key] = $code;
-						
-					}
-					
-				}
-				
-			}
-
+						
+				}
+				
+			}
+			
 			$mb = new wpsg_mod_basic();
 			$path = $mb->getTmpFilePath();
-
-			$arHeadCols = array_keys($arData[0]);
 			
 			$fp = fopen($path.'/wpsg_productexport.csv', 'w');
-			fputcsv($fp, $arHeadCols, ';', '"');;
+			fputcsv($fp, array_keys($arData[0]));;
+			foreach ($arData as $e)
+			{
+				
+				// ZeilenumbrÃŒche entfernen
+				if (get_option('wpsg_impexp_clearlinebreak') === '1')
+				{
+					foreach ($e as $k => $v) { $e[$k] = preg_replace('/\r|\n/', '', $v); }										
+				}
+				
+				fputcsv($fp, $e, ',', '"');
+				
+			}
+			fclose($fp);
+			
+			header('Content-type: application/download');
+			header('Content-Disposition:inline; filename="wpsg_productexport.csv"');
+			header('Expires: 0');
+			header('Cache-Control:must-revalidate, post-check=0, pre-check=0');
+			header('Pragma:public');
+				 
+			readfile($path.'/wpsg_productexport.csv');
+			die(); 
+			
+		} // public function exportAction()
+		
+		/**
+		 * Wird beim importieren der Produkte aufgerufen. Zeichnet das Upload Formular und fÃŒhrt auch den Import durch 
+		 */
+		public function importAction()
+		{
+			 
+			if (isset($_REQUEST['wpsg_import']) && file_exists($_FILES['wpsg_importfile']['tmp_name']))
+			{
+				
+				// Import starten 
  
-			$arDataExport = array();
- 
-			foreach ($arData as $e) {
-				
-				// ZeilenumbrÃŒche entfernen
-				if (get_option('wpsg_impexp_clearlinebreak') === '1') {
-
-					foreach ($e as $k => $v) { $e[$k] = preg_replace('/\r|\n/', '', $v); }
-
-				}
-
-				$csv_row = [];
-				
-				foreach ($arHeadCols as $v) $csv_row[$v] = strval($e[$v]??'');
-				
-				$arDataExport[] = $csv_row;
-
-				fputcsv($fp, $csv_row, ';', '"');
-
-			}
-
-			fclose($fp);
-
-			if ($bReturnData) return array($path.'/wpsg_productexport.csv', $arDataExport);
-			else {
-
-				header('Content-type: application/download');
-				header('Content-Disposition:inline; filename="wpsg_productexport.csv"');
-				header('Expires: 0');
-				header('Cache-Control:must-revalidate, post-check=0, pre-check=0');
-				header('Pragma:public');
-
-				readfile($path.'/wpsg_productexport.csv');
-				die();
-
-			}
-
-		} // public function exportAction()
-
-		public function exportMediaAction() {
-
-			check_admin_referer('wpsg-product-exportMedia');
-
-			@ini_set('memory_limit', '2000M');
-			@set_time_limit(3600);
-
-			$zip_file = tempnam(sys_get_temp_dir(), 'wpsg');
-			$zip = new ZipArchive();
-
-			if ($zip->open($zip_file, ZIPARCHIVE::OVERWRITE) == true) {
-
-				// Produktdaten, wie normaler Export
-				list($product_export_file, $arData) = $this->exportAction(true, true);
-				$zip->addFile($product_export_file, 'productdata.csv');
-
-				// Bilddaten
-				foreach ($arData as $d) {
-
-					$arAttachmentIDs = $this->imagehandler->getAttachmentIDs($d['id']);
-
-					if (wpsg_isSizedArray($arAttachmentIDs)) {
-
-						$zip->addEmptyDir($d['id']);
-
-						$arAttachmentIDMapping = [];
-
-						foreach ($arAttachmentIDs as $attachment_id) {
-
-							$file = get_attached_file($attachment_id);
-
-							if (file_exists($file) && is_file($file)) {
-
-								$zip->addFile($file, $d['id'].'/'.basename($file));
-								$arAttachmentIDMapping[$attachment_id]['filename'] = basename($file);
-
-							}
-
+				$nImported = 0;
+				
+				$keys = array();
+				$handle = fopen($_FILES['wpsg_importfile']['tmp_name'], "r");  
+				
+				$i = 0;
+				while (($row = fgetcsv ($handle, 0, ",")) !== FALSE ) 
+				{
+					
+					if ($i > 0)
+					{
+						
+						$data = array();
+						foreach ($keys as $k => $k_name)
+						{							
+							$data[$k_name] = wpsg_q($row[$k]);
 						}
-
-						$zip->addFromString($d['id'].'/attachment.json', json_encode($arAttachmentIDMapping));
-
-					}
-
-				}
-
-				$zip->close();
-
-				// Sonst gab es im Shop Probleme mit dem Download
-				ob_clean(); ob_end_flush(); ob_end_clean();
-
-				wpsg_header::ZIP($zip_file, 'wpsg_export.zip');
-				exit;
-
-			} else {
-
-				$this->addBackendError(_('Konnte ZIP Archiv nicht erstellen.', 'wpsg'));
-
-			}
-
-			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt');
-
-		} // public function exportMediaAction()
-
-		/**
-		 * Wird beim importieren der Produkte aufgerufen. Zeichnet das Upload Formular und fÃŒhrt auch den Import durch
-		 */
-		public function importAction() {
-			
-			@ini_set('memory_limit', '2000M');
-			@set_time_limit(3600);
-
-			if (isset($_REQUEST['wpsg_import']) && file_exists($_FILES['wpsg_importfile']['tmp_name'])) {
-				
-				check_admin_referer('wpsg-product-import-do');
-				
-				// Import starten
-
-				$nImported = 0;
-				$arImages = array();
-				$keys = array();
-				$extract_dir = '';
-				$arProductIDsHandled = [];
-                $arAttachmentMeta = [];
-
-				if (preg_match('/\.zip$/i', $_FILES['wpsg_importfile']['name'])) {
-
-					$zip = new ZipArchive();
-
-					if ($zip->open($_FILES['wpsg_importfile']['tmp_name']) === true) {
-
-						$extract_dir = sys_get_temp_dir().'/'.time();
-
-						$zip->extractTo($extract_dir);
-						$zip->close();
-
-						if (!file_exists($extract_dir) || !is_dir($extract_dir)) {
-
-							$this->shop->addBackendError(__('Konnte ZIP Archiv nicht entpacken.', 'wpsg'));
-							$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt');
-
-						} else {
-
-							$arZIPData = scandir($extract_dir);
-
-							foreach ($arZIPData as $z) {
-
-								if (is_numeric($z)) {
-
-									$arImages[$z] = array();
-									$arImageFiles = scandir($extract_dir.'/'.$z);
-
-									foreach ($arImageFiles as $if) { if (is_file($extract_dir.'/'.$z.'/'.$if)) { $arImages[$z][] = $if; } }
-
-									if (file_exists($extract_dir.'/'.$z.'/attachment.json')) {
-
-									    $arAttachmentMeta[$z] = json_decode(file_get_contents($extract_dir.'/'.$z.'/attachment.json'), true);
-
-                                    }
-
+						
+						if ($data['id'] <= 0) unset($data['id']);
+					  
+						// Alte Sachen lÃ¶sche ich vor dem Import mit der Ãbergebenen ID !
+						
+						// Produkt lÃ¶schen
+						$this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($data['id'])."'");
+						
+						// Attributwerte lÃ¶schen
+						if ($this->shop->hasMod('wpsg_mod_produktattribute'))
+						{
+							$this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `p_id` = '".wpsg_q($data['id'])."'");
+						}
+						
+						$nImported ++;
+						
+						unset($data['v_id']);
+						unset($data['mwst_value']);
+						unset($data['ptemplate']);
+
+						$data_import = $data;
+						
+						foreach ($data_import as $k => $v)
+						{ 
+							if (preg_match("/^ATT_(.*)/", $k)) { unset($data_import[$k]); }
+						}
+					    
+						$pNeu_id = $this->db->ImportQuery(WPSG_TBL_PRODUCTS, $data_import, true);
+						 
+						// Attribute speichern
+						foreach ($data as $k => $v)
+						{
+							
+							if (preg_match("/^ATT_(.*)/", $k))
+							{
+								
+								// Attribute ID auslesen
+								$att_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_AT."` WHERE `name` = '".wpsg_q(preg_replace("/^ATT_/", "", $k))."' ");
+								
+								if ($att_id > 0)
+								{
+								
+									// Attribut speichern
+									$this->db->ImportQuery(WPSG_TBL_PRODUCTS_AT, array(
+										"p_id" => wpsg_q($pNeu_id),
+										"a_id" => wpsg_q($att_id),
+										"value" => wpsg_q($v)
+									));
+								
 								}
-
-							}
-
-						}
-
-						if (!file_exists($extract_dir.'/productdata.csv')) {
-
-							$this->shop->addBackendError(__('Keine Produktdaten im ZIP Archiv gefunden.', 'wpsg'));
-							$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt');
-
-						}
-
-						$handle = fopen($extract_dir.'/productdata.csv', "r");
-
-					} else {
-
-						$this->shop->addBackendError(__('Konnte ZIP Archiv nicht Ã¶ffnen.', 'wpsg'));
-						$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt');
-
-					}
-
-				}
-				else {
-
-					$handle = fopen($_FILES['wpsg_importfile']['tmp_name'], "r");
-
-				}
-
-				$i = 0;
-
-                while (($row = fgetcsv ($handle, 0, ";")) !== false) {
-
-                    if ($i > 0) {
-
-                        $data = array();
-
-                        foreach ($keys as $k => $k_name) {
-
-                            $data[$k_name] = wpsg_q($row[$k]);
-
-                        }
-
-                        if ($data['id'] <= 0) unset($data['id']);
-
-                        $product_id = intval($data['id']);
-
-                        // Alte Sachen lÃ¶sche ich vor dem Import mit der Ãbergebenen ID !
-
-                        if (!in_array($product_id, $arProductIDsHandled)) {
-
-                            // Produkt lÃ¶schen
-                            $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($data['id'])."'");
-
-                            if ($this->shop->hasMod('wpsg_mod_produktartikel')) {
-
-                            	try {
-
-                            		$post_id = $this->shop->callMod('wpsg_mod_produktartikel', 'getPostIdFromProductId', [$product_id]);
-
-                            		\wp_delete_post($post_id, true);
-
-	                            } catch (\Exception $e) {}
-
-                            }
-
-                            // Attributwerte lÃ¶schen
-                            if ($this->shop->hasMod('wpsg_mod_produktattribute')) {
-
-                                $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `p_id` = '".wpsg_q($data['id'])."'");
-
-                            }
-
-                            // Produktvarianten
-                            if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
-
-                                $handledVarID = [];
-
-                                // Produktvarianten lÃ¶schen
-
-                                if ($product_id > 0 && wpsg_getInt($data['PV_id']) <= 0 && wpsg_getInt($data['PV_VARI_variation_id']) <= 0) {
-
-                                    $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_VARIANT."` WHERE `product_id` = '".wpsg_q($product_id)."' ");
-                                    $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `product_id` = '".wpsg_q($product_id)."' ");
-
-                                    $arProductVariant = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_VARIANTS."` WHERE `product_id` = '".wpsg_q($product_id)."' ");
-
-                                    foreach ($arProductVariant as $pv) {
-
-                                        $this->db->Query("DELETE FROM `".WPSG_TBL_VARIANTS."` WHERE `id` = '".wpsg_q($pv['id'])."' ");
-                                        $this->db->Query("DELETE FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `variant_id` = '".wpsg_q($pv['id'])."' ");
-
-                                    }
-
-                                }
-
-                            }
-
-                            // Bilder?
-                            if (wpsg_isSizedInt($data['id']) && wpsg_isSizedArray($arImages[$data['id']])) {
-
-                                $arAttachmentIDs = $this->imagehandler->getAttachmentIDs($data['id']);
-
-                                foreach (array_reverse($arImages[$data['id']]) as $img) {
-
-                                    if ($img === 'attachment.json') continue;
-
-                                    $exist = false;
-
-                                    // PrÃŒfen ob ein Bild anhand des Namens schon im Produkt existiert
-                                    foreach ($arAttachmentIDs as $attachment_id) {
-
-                                        $file = get_attached_file($attachment_id);
-
-                                        if (strtolower(basename($file)) == strtolower($img)) {
-
-                                            // Alte Attachment ID suchen und zuweisen
-                                            if (isset($arAttachmentMeta[$product_id])) {
-
-                                                foreach ($arAttachmentMeta[$product_id] as $a_id => $a_data) {
-
-                                                    if ($a_data['filename'] === $img) {
-
-                                                        $arAttachmentMeta[$product_id][$a_id]['attachment_new_id'] = $attachment_id;
-
-                                                    }
-
-                                                }
-
-                                            }
-
-                                            $exist = true; break;
-
-                                        }
-
-                                    }
-
-                                    if (!$exist) {
-
-                                        $attachment_new_id = $this->imagehandler->addImageToProduct($extract_dir.'/'.$data['id'].'/'.$img, $data['id']);
-
-                                        // Alte Attachment ID suchen und zuweisen
-                                        if (isset($arAttachmentMeta[$product_id])) {
-
-                                            foreach ($arAttachmentMeta[$product_id] as $a_id => $a_data) {
-
-                                                if ($a_data['filename'] === $img) {
-
-                                                    $arAttachmentMeta[$product_id][$a_id]['attachment_new_id'] = $attachment_new_id;
-
-                                                }
-
-                                            }
-
-                                        }
-
-                                    }
-
-                                }
-
-                            }
-
-                        }
-
-                        // Produktvariante eintragen
-                        if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
-
-                            if (intval($data['PV_id']) > 0 && !in_array(intval($data['PV_id']), $handledVarID)) {
-
-                                // Eintrag der Variante prÃŒfen
-                                $exist_row = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_VARIANTS."` WHERE `id` = '".wpsg_q($data['PV_id'])."' ");
-                                $var_data = [];
-
-                                foreach ($data as $k => $v) {
-
-                                    if (substr($k, 0, 3) === 'PV_' && substr($k, 0, 8) !== 'PV_VARI_') {
-
-                                        $var_data[substr($k, 3)] = $v;
-
-                                    }
-
-                                }
-
-                                if (isset($exist_row['id']) && intval($exist_row['id']) === intval($data['PV_id']) && intval($exist_row['product_id']) === intval($data['PV_product_id'])) {
-
-                                    // Update
-                                    wpsg_ShopController::getShop()->db->UpdateQuery(WPSG_TBL_VARIANTS, $var_data, " `id` = '".intval($exist_row['id'])."' ", true);
-
-                                } else if (!isset($exist_row['id'])) {
-
-                                    // Insert
-                                    wpsg_ShopController::getShop()->db->ImportQuery(WPSG_TBL_VARIANTS, $var_data, true);
-
-                                } else die('Es gab ein Fehler in Zeile ".$i." mit den Varianten.');
-
-                                // Eintrag in products_variant prÃŒfen
-                                if (intval($data['PV_product_id']) > 0) {
-
-                                    $exist_row = wpsg_ShopController::getShop()->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARIANT."` WHERE `variant_id` = '".intval($data['PV_id'])."' AND `product_id` = '".intval($product_id)."' ");
-                                    $var_data['variant_id'] = $data['PV_id'];
-
-                                    unset($var_data['id']);
-
-                                    if (isset($exist_row['id'])) {
-
-                                        // Update
-                                        wpsg_ShopController::getShop()->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIANT, $var_data, " `id` = '".intval($exist_row['id'])."' ", true);
-
-                                    } else {
-
-                                        // Insert
-                                        wpsg_ShopController::getShop()->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIANT, $var_data, true);
-
-                                    }
-
-                                }
-
-                                $handledVarID[] = intval($data['PV_id']);
-
-                            }
-
-                            // Produktvariation eintragen
-                            if (intval($data['PV_VARI_variation_id']) > 0) {
-
-                                $vari_data = [
-                                    'variant_id' => intval($data['PV_id'])
-                                ];
-
-                                foreach ($data as $k => $v) {
-
-                                    if (substr($k, 0, 8) === 'PV_VARI_' && !in_array($k, ['PV_VARI_id'])) {
-
-                                        $vari_data[substr($k, 8)] = $v;
-
-                                    }
-
-                                }
-
-                                // Eintrag in Vari prÃŒfen
-                                $exist_row = wpsg_ShopController::getShop()->db->fetchRow("SELECT * FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `id` = '".intval($data['PV_VARI_variation_id'])."' ");
-                                $vari_data['id'] = $data['PV_VARI_variation_id'];
-
-                                if (isset($exist_row['id'])) {
-
-                                    // Update
-                                    wpsg_ShopController::getShop()->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, $vari_data, " `id` = '".intval($exist_row['id'])."' ", true);
-
-                                } else {
-
-                                    // Insert
-                                    wpsg_ShopController::getShop()->db->ImportQuery(WPSG_TBL_VARIANTS_VARI, $vari_data, true);
-
-                                }
-
-                                // Eintrag in products_variation prÃŒfen
-                                $exist_row = wpsg_ShopController::getShop()->db->fetchRow("
-                                    SELECT
-                                        * 
-                                    FROM 
-                                        `".WPSG_TBL_PRODUCTS_VARIATION."` 
-                                    WHERE
-                                        `variation_id` = '".intval($data['PV_VARI_variation_id'])."' AND 
-                                        `product_id` = '".intval($product_id)."' 
-                                ");
-
-                                foreach (['images', 'images_set'] as $col) {
-
-                                    $arNewExploded = [];
-
-                                    foreach (explode(',', $vari_data[$col]) as $old_id) {
-
-                                        if (isset($arAttachmentMeta[$product_id][$old_id]['attachment_new_id'])) $arNewExploded[] = $arAttachmentMeta[$product_id][$old_id]['attachment_new_id'];
-                                        else if ($old_id > 0) $arNewExploded[] = $old_id;
-
-                                    }
-
-                                    $vari_data[$col] = implode(',', $arNewExploded);
-
-                                }
-
-                                unset($vari_data['id']);
-
-                                if (isset($exist_row['id'])) {
-
-                                    // Update
-                                    wpsg_ShopController::getShop()->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIATION, $vari_data, " `id` = '".intval($exist_row['id'])."' ", true);
-
-                                } else {
-
-                                    // Insert
-                                    wpsg_ShopController::getShop()->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, $vari_data, true);
-
-                                }
-
-                            }
-
-                        }
-
-                        if (in_array($product_id, $arProductIDsHandled)) continue;
-                        else $arProductIDsHandled[] = $product_id;
-
-                        if (!isset($data['lang_parent']) || $data['lang_parent'] <= 0) $nImported ++;
-
-                        unset($data['v_id']);
-                        unset($data['mwst_value']);
-                        unset($data['ptemplate']);
-
-                        $data_import = $data;
-
-                        foreach ($data_import as $k => $v) {
-
-                            if (
-                                preg_match("/^ATT_(.*)/", $k) ||
-                                preg_match("/^PV_(.*)/", $k) ||
-								in_array($k, array_keys(wpsg_product::getProductCodeConfig()))
-                            ) { unset($data_import[$k]); }
-
-                        }
-
-                        $pNeu_id = intval($this->db->ImportQuery(WPSG_TBL_PRODUCTS, $data_import, true));
-                        $this->shop->cache->clearProductCache($pNeu_id);
-
-						$oProduct = wpsg_product::getInstance($pNeu_id);
-						
-						// Productcodes speichern
-						foreach ($data as $k => $v) {
-							
-							if (in_array($k, array_keys(wpsg_product::getProductCodeConfig()))) {
-								
-								$oProduct->setMeta($k, $v);
-								
+									
 							}
 							
 						}
 						
-                        // Attribute speichern
-                        foreach ($data as $k => $v) {
-
-                            if (preg_match("/^ATT_(.*)/", $k))
-                            {
-
-                                // Attribute ID auslesen
-                                $att_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_AT."` WHERE `name` = '".wpsg_q(preg_replace("/^ATT_/", "", $k))."' ");
-
-                                if ($att_id > 0)
-                                {
-
-                                    // Attribut speichern
-                                    $this->db->ImportQuery(WPSG_TBL_PRODUCTS_AT, array(
-                                        "p_id" => wpsg_q($pNeu_id),
-                                        "a_id" => wpsg_q($att_id),
-                                        "value" => $v
-                                    ));
-
-                                }
-
-                            }
-
-                        }
-
-                        if ($this->shop->hasMod('wpsg_mod_produktartikel') && isset($data['cat_id'])) {
-
-                            $arCatID = wpsg_explode(',', $data['cat_id']);
-
-                            $post_id = $this->shop->callMod('wpsg_mod_produktartikel', 'getPostIdFromProductId', [$pNeu_id, $data['path']]);
-
-                            \wp_remove_object_terms($post_id, null, $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'));
-
-                            if (wpsg_isSizedArray($arCatID)) {
-
-                            	\wp_set_post_terms($post_id, $arCatID, $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'));
-
-                            }
-
-                        }
-
-                    }
-                    else
-                    {
-
-                        // SchlÃŒssel erzeugen
-                        $keys = $row;
-
-                    }
-
-                    $i ++;
-
-                }
-                fclose($handle);
-
-				$this->shop->addBackendMessage(wpsg_translate(__('#1# Produkte wurden importiert.', 'wpsg'), $nImported));
-				die($this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=index'));
-
-			} else if (isset($_REQUEST['wpsg_import'])) {
+					}
+					else
+					{
+
+						// SchlÃŒssel erzeugen
+						$keys = $row;
+					
+					}
+					
+					$i ++;
+					
+			    }
+			    
+			    fclose($handle);
+				
+			    $this->shop->addBackendMessage(wpsg_translate(__('#1# Produkte wurden importiert.', 'wpsg'), $nImported));			    
+			    die($this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=index'));
+			    			    
+			}
+			else if (isset($_REQUEST['wpsg_import']))
+			{
 
 				$this->shop->addBackendError(__('Keine Datei zum Import angegeben.', 'wpsg'));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=import');
-
-			} else {
-				
-				check_admin_referer('wpsg-product-import');
-				
-			}
-
+				
+			}
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/produkt/import.phtml');
-
+			
 		} // public function importAction()
-
+		
 		/**
 		 * Wird beim bearbeiten aufgerufen
 		 */
-		public function editAction() {
-			
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			else $edit_id = intval($_REQUEST['edit_id']);
-					
-			if (!wpsg_checkInput($_REQUEST['wpsg_lang'], WPSG_SANITIZE_ARRAY_LANG, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-			else $wpsg_lang = $_REQUEST['wpsg_lang'];
-			
-			check_admin_referer('wpsg-product-edit-'.$edit_id);
-
+		public function editAction()
+		{
+			
 			// VerfÃŒgbare Produkttemplates
 			$this->shop->view['templates'] = $this->shop->loadProduktTemplates();
-
-			if (isset($wpsg_lang)) {
-				
-				$product_translated_id = $this->db->fetchOne("
+						
+			if (isset($_REQUEST['wpsg_lang']))
+			{
+				
+				$product_translated_id = $this->db->fetchRow("
 					SELECT
 						P.`id`
@@ -974,28 +411,29 @@
 						`".WPSG_TBL_PRODUCTS."` AS P 
 					WHERE
-						P.`lang_parent` = '".wpsg_q($edit_id)."' AND
-						P.`lang_code` = '".wpsg_q($wpsg_lang)."'
+						P.`lang_parent` = '".wpsg_q($_REQUEST['edit_id'])."' AND
+						P.`lang_locale` = '".wpsg_q($_REQUEST['wpsg_lang'])."'
 				");
-
-				if ($product_translated_id <= 0) {
-
+				
+				if ($product_translated_id <= 0)
+				{
+					
 					$arLang = $this->shop->getStoreLanguages();
-
+										
 					// Ãbersetzung anlegen
-					$product_data_original = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($edit_id)."'");
+					$product_data_original = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 
 					unset($product_data_original['id']);
-					$product_data_original['lang_parent'] = wpsg_q($edit_id);
-					$product_data_original['lang_code'] = wpsg_q($wpsg_lang);
-					$product_data_original['name'] .= ' ['.$arLang[$this->shop->getLocaleToLanguageCode($wpsg_lang)]['name'].']';
-					$product_data_original['beschreibung'] .= ' ['.$arLang[$this->shop->getLocaleToLanguageCode($wpsg_lang)]['name'].']';
-					if (trim($product_data_original['detailname']) != '') $product_data_original['detailname'] .= ' ['.$arLang[$this->shop->getLocaleToLanguageCode($wpsg_lang)]['name'].']';
-
+					$product_data_original['lang_parent'] = wpsg_q($_REQUEST['edit_id']);
+					$product_data_original['lang_locale'] = wpsg_q($_REQUEST['wpsg_lang']);
+					$product_data_original['name'] .= ' ['.$arLang[$_REQUEST['wpsg_lang']]['name'].']';
+					$product_data_original['beschreibung'] .= ' ['.$arLang[$_REQUEST['wpsg_lang']]['name'].']';
+					if (trim($product_data_original['detailname']) != '') $product_data_original['detailname'] .= ' ['.$arLang[$_REQUEST['wpsg_lang']]['name'].']';					
+					
 					$product_translated_id = $this->db->ImportQuery(WPSG_TBL_PRODUCTS, $product_data_original);
-
-					$this->shop->callMods('produkt_createTranslation', array(&$edit_id, &$product_translated_id));
-
-				}
-
+										
+					$this->shop->callMods('produkt_createTranslation', array(&$_REQUEST['edit_id'], &$product_translated_id));
+					
+				}
+				
 				$this->shop->view['data'] = $this->db->fetchRow("
 					SELECT
@@ -1004,10 +442,12 @@
 						`".WPSG_TBL_PRODUCTS."` AS P 
 					WHERE
-						P.`lang_parent` = '".wpsg_q($edit_id)."' AND
-						P.`lang_code` = '".wpsg_q($wpsg_lang)."'
-				");
-
-			} else {
-
+						P.`lang_parent` = '".wpsg_q($_REQUEST['edit_id'])."' AND
+						P.`lang_locale` = '".wpsg_q($_REQUEST['wpsg_lang'])."'
+				"); 
+								
+			}
+			else
+			{ 
+				
 				$this->shop->view['data'] = $this->db->fetchRow("
 					SELECT
@@ -1016,492 +456,278 @@
 						`".WPSG_TBL_PRODUCTS."` AS P 
 					WHERE
-						P.`id` = '".wpsg_q($edit_id)."'
+						P.`id` = '".wpsg_q($_REQUEST['edit_id'])."'
 				");
-
+				
 				$default_country = $this->shop->getDefaultCountry();
 				$this->shop->view['data']['mwst_value'] = $default_country->getTax($this->shop->view['data']['mwst_key']);
-
-				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO) $this->shop->view['data']['tax_sum_value'] = wpsg_calculateSteuer($this->shop->view['data']['preis'], WPSG_NETTO, $this->shop->view['data']['mwst_value']);
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO) $this->shop->view['data']['tax_sum_value'] = wpsg_calculateSteuer($this->shop->view['data']['preis'], WPSG_NETTO, $this->shop->view['data']['mwst_value']); 
 				else $this->shop->view['data']['tax_sum_value'] = wpsg_calculateSteuer($this->shop->view['data']['preis'], WPSG_BRUTTO, $this->shop->view['data']['mwst_value']);
-
-			}
-
-			// Produktobject
-			$this->shop->view['oProduct'] = wpsg_product::getInstance($edit_id);
-
+				
+			}
+			
+			// Produktobject			 
+			$this->shop->view['oProduct'] = wpsg_product::getInstance($_REQUEST['edit_id']);
+			 	
 			// Erlaubte Zahlungsarten
 			$this->shop->view['allowedPayment'] = wpsg_trim((array)explode(',', $this->shop->view['data']['allowedpayments']));
-
+			
 			// Erlaubte Versandarten
 			$this->shop->view['allowedShipping'] = wpsg_trim((array)explode(',', $this->shop->view['data']['allowedshipping']));
-
+			 
 			$this->shop->callMods('produkt_edit', array(&$this->shop->view['data']));
-
+		 
 			// SteuersÃ€tze des Standardlandes ermitteln
 			$this->shop->view['arTaxGroup'] = array(
-				'a' => 'A',
-				'b' => 'B',
-				'c' => 'C',
+				'a' => 'A', 
+				'b' => 'B', 
+				'c' => 'C', 
 				'd' => 'D'
 			);
-
+			
 			if (wpsg_isSizedInt($this->shop->get_option('wpsg_defaultland')))
 			{
-
+			
 				$default_country = wpsg_country::getInstance($this->shop->get_option('wpsg_defaultland'));
-
+				
 				foreach ($this->shop->view['arTaxGroup'] as &$tax_group)
 				{
-
+					
 					$tax_value = $default_country->getTax(strtolower($tax_group));
-
+					
 					if (!is_null($tax_value)) $tax_group .= ' ('.wpsg_ff($tax_value, '%').' / '.$default_country->kuerzel.')';
-
-				}
-
-			}
-
-			$this->shop->view['partikel_select'] = array();
-            $this->shop->view['partikel_select']['davor'] = [__('Allgemein', 'wpsg'), [0 => __('Nicht zugeordnet', 'wpsg')]];
-
-			$arArtikel = get_posts('numberposts=-1'); if (wpsg_isSizedArray($arArtikel)) {
-
-				$this->shop->view['partikel_select']['article'] = array(__('Artikel', 'wpsg'), array());
-				foreach ($arArtikel as $a) $this->shop->view['partikel_select']['article'][1][$a->ID] = $a->post_title;
-
-			}
-
-			$arPages = get_pages(); if (wpsg_isSizedArray($arPages)) {
-
-				$this->shop->view['partikel_select']['pages'] = array(__('Seiten', 'wpsg'), array());
-				foreach ($arPages as $p) $this->shop->view['partikel_select']['pages'][1][$p->ID] = $p->post_title;
-
-			}
-
-			$this->shop->view['arSubAction'] = array(
-				'general' => array(
-					'title' => __('Allgemein', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_general.phtml', false)
-				)
-			);
-			
-			$this->shop->view['arSubAction']['productcodes'] = [
-				'title' => __('Produktcodes', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_productcodes.phtml', false)
-			];
-
-			$this->shop->view['arSubAction']['texte'] = array(
-				'title' => __('Texte', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_texte.phtml', false)
-			);
-
-			if ($this->shop->hasMod('wpsg_mod_produktartikel')) {
-
-				$this->shop->view['arCom'] = $this->db->fetchAssoc("
-                    SELECT 
-                            C.`comment_ID`, C.`comment_author`, C.`comment_date`, C.`comment_content`, M.`meta_value`,  P.`wpsg_produkt_id` 
-                    FROM 
-                            `".$GLOBALS['wpdb']->prefix."comments` AS C
-                                    LEFT JOIN ".$GLOBALS['wpdb']->prefix."commentmeta AS M ON (C.`comment_ID` = M.`comment_id` AND M.`meta_key` = 'sto_points')
-                                    LEFT JOIN ".$GLOBALS['wpdb']->prefix."posts AS P ON (C.`comment_post_ID` = P.`ID`)
-                    WHERE 
-                            C.`comment_type` = 'wpsg_product_comment' AND 
-                            P.`wpsg_produkt_id` = '".wpsg_q($edit_id)."'
-                    
-                    ORDER BY 
-                            C.`comment_date` DESC
-                ");
-
-				$this->shop->view['arSubAction']['tabrating'] = array(
-					'title' => __('Bewertungen', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_rating.phtml', false)
-				);
-
-			}
-
-			if (!isset($wpsg_lang)) {
-
-				$this->shop->view['arSubAction']['price'] = array(
-					'title' => __('Preis / Steuer', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_price.phtml', false)
-				);
-
-				$this->shop->view['arSubAction']['payship'] = array(
-					'title' => __('Versand-/ Zahlungsarten', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_payship.phtml', false)
-				);
-
-			}
-
-			/* Produktbilder */
-			if (!isset($wpsg_lang)) {
-
-				if (wpsg_isSizedInt($this->shop->view['data']['id']))
-				{
-
-					$this->shop->view['strProductList'] = $this->imagehandler->getProductListBackend($this->shop->view['data']['id']);
-
-				}
-
-				$this->shop->view['arSubAction']['images'] = array(
-					'title' => __('Produktbilder', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/images.phtml', false)
-				);
-
-			}
-
-			$this->shop->callMods('product_addedit_content', array(&$this->shop->view['arSubAction'], &$this->shop->view['data']));
-			
-			if ($this->get_option('wpsg_alternativeProductDetailDesign') == true) {
-
-				$this->shop->render( WPSG_PATH_VIEW . '/produkt/addedit_alternativeDesign.phtml' );
-
-			} else {
-
-				$this->shop->render( WPSG_PATH_VIEW . '/produkt/addedit.phtml' );
-
-			}
-
+					
+				}
+
+			}
+			
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit.phtml');
+			
 		} // public function editAction()
-
+		
 		/**
 		 * Wird beim kopieren eines Produkts aufgerufen
 		 */
-		public function copyAction() {
-			
-			check_admin_referer('wpsg-product-copy-'.intval($_REQUEST['edit_id']));
-			
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			else $edit_id = intval($_REQUEST['edit_id']);
-
-			$produkt_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($edit_id)."' ");
-
+		public function copyAction()
+		{
+			
+			$produkt_db = $this->shop->cache->loadProduct($_REQUEST['edit_id']);
+			
 			// Neues Produkt anlegen
 			unset($produkt_db['id']);
-
-			$produkt_db['cdate'] = 'NOW()';
+			
+			$produkt_db['cdate'] = 'NOW()';			
 			$produkt_db['name'] = '['.__('KOPIE', 'wpsg').'] '.$produkt_db['name'];
-
+			
 			$produkt_db = wpsg_q($produkt_db);
-
+			
 			$new_id = $this->db->ImportQuery(WPSG_TBL_PRODUCTS, $produkt_db);
-
+			
 			// Ãbersetzungen kopieren wenn vorhanden
-			$produkt_translations = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($edit_id)."'");
+			$produkt_translations = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($_REQUEST['edit_id'])."'");
 			
 			foreach ((array)$produkt_translations as $p)
 			{
-
+				
 				unset($p['id']);
 				$p['lang_parent'] = $new_id;
-
+				
 				$p = wpsg_q($p);
-
+				
 				$this->db->ImportQuery(WPSG_TBL_PRODUCTS, $p);
-
-			}
-
-			if ($this->shop->get_option('wpsg_dontcopymedia') !== '1') {
-				
-				// Bilder kopieren
-				$ih = new wpsg_imagehandler();
-				
-				$arAttachments = $ih->getAttachmentIDs($edit_id);
-				$GLOBALS['wpsg_product_copy_imagemapping'] = [];
-				
-				foreach ($arAttachments as $a_id) {
-					
-					$attachment_file = \get_attached_file($a_id);
-					
-					if ($attachment_file !== false && file_exists($attachment_file)) {
-					 
-						$n_a_id = $ih->addImageToProduct($attachment_file, $new_id);
-											
-						if (wpsg_isSizedInt($n_a_id)) $GLOBALS['wpsg_product_copy_imagemapping'][$a_id] = $n_a_id;
-						
-					}
-					
-				}
-				
-			}
-			
-			$this->shop->callMods('produkt_copy', array(&$edit_id, &$new_id));
-
+				
+			}
+			
+			$this->shop->callMods('produkt_copy', array(&$_REQUEST['edit_id'], &$new_id));
+			
 			$this->addBackendMessage(__('Produkt wurde erfolgreich kopiert.', 'wpsg'));
-
+			
 			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=index');
-
+			
 		} // public function copyAction()
-
+		
 		/**
 		 * Speichert ein Produkt
 		 */
-		public function saveAction() {
-			
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-			else $edit_id = intval($_REQUEST['edit_id']);
-			 			
-			check_admin_referer('wpsg-product-save-'.$edit_id);
-			
-			if ($this->shop->get_option('wpsg_options_nl2br') == '1' && wpsg_checkInput($_REQUEST['beschreibung'], WPSG_SANITIZE_TEXTFIELD)) { $_REQUEST['beschreibung'] = nl2br($_REQUEST['beschreibung']); }
-
-			if (isset($_REQUEST['wpsg_lang'])) {
-
+		public function saveAction()
+		{
+
+			if ($this->shop->get_option('wpsg_options_nl2br') == '1')
+			{
+				
+				$_REQUEST['beschreibung'] = nl2br($_REQUEST['beschreibung']);
+
+			}
+			
+			if (isset($_REQUEST['wpsg_lang']))
+			{
+				
 				// Ãbersetzung speichern
-				if (!wpsg_checkInput($_REQUEST['wpsg_lang'], WPSG_SANITIZE_ARRAY_LANG)) throw \wpsg\Exception::getSanitizeException();
-				else $wpsg_lang = $_REQUEST['wpsg_lang'];
-
-				$trans_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($edit_id)."' AND `lang_code` = '".wpsg_q($wpsg_lang)."'");
-
-				if ($trans_id <= 0) throw new \wpsg\Exception(__('ERROR: Ãbersetzung existiert noch nicht, das dÃŒrfte nicht passieren!', 'wpsg'));
-
-				$data = [];
-				
-				wpsg_checkRequest('name', [WPSG_SANITIZE_TEXTFIELD], __('Produktname Ãbersetzung'),$data);
-				wpsg_checkRequest('disabled', [WPSG_SANITIZE_CHECKBOX], __('Produktstatus Ãbersetzung'),$data);
-				wpsg_checkRequest('detailname', [WPSG_SANITIZE_TEXTFIELD], __('Produktname (Detail) Ãbersetzung'),$data);
-				wpsg_checkRequest('shortdesc', [WPSG_SANITIZE_NONE], __('Produktbeschreibung (Kurz) Ãbersetzung'),$data);
-				wpsg_checkRequest('beschreibung', [WPSG_SANITIZE_NONE], __('Kurztext Ãbersetzung'),$data);
-				wpsg_checkRequest('partikel', [WPSG_SANITIZE_INT, ['allowEmpty' => true]], __('Produktname Ãbersetzung'),$data);
-				  
+				
+				$trans_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($_REQUEST['edit_id'])."' AND `lang_locale` = '".wpsg_q($_REQUEST['wpsg_lang'])."'");
+				
+				if ($trans_id <= 0) die(__('ERROR: Ãbersetzung existiert noch nicht, das dÃŒrfte nicht passieren!', 'wpsg'));
+				
+				$data = array(
+					'name' => wpsg_q($_REQUEST['name']),
+					'detailname' => wpsg_q($_REQUEST['detailname']),
+					'beschreibung' => wpsg_q($_REQUEST['beschreibung'])					
+				);
+				
 				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($trans_id)."'");
 
 				$this->addBackendMessage(__('Ãbersetzung erfolgreich gespeichert', 'wpsg'));
-
-				$this->shop->callMods('produkt_save_translation', array(&$edit_id, &$trans_id));
-
+				
+				$this->shop->callMods('produkt_save_translation', array(&$_REQUEST['edit_id'], &$trans_id));
+				
 				if (isset($_REQUEST['submit_index'])) $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=index');
-				else $this->redirect(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$edit_id.'&wpsg_lang='.$wpsg_lang, 'wpsg-product-edit-'.wpsg_getInt($edit_id)));
-
-			} else {
-
+				else $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$_REQUEST['edit_id'].'&wpsg_lang='.$_REQUEST['wpsg_lang']);
+				
+			}
+			else
+			{
+			
 				// RegulÃ€res Produkt speichern
-
-				$data = [];
-				
-				wpsg_checkRequest('name', [WPSG_SANITIZE_TEXTFIELD], __('Produktname', 'wpsg'), $data);
-				wpsg_checkRequest('disabled', [WPSG_SANITIZE_CHECKBOX], __('Produktstatus', 'wpsg'), $data);
-				wpsg_checkRequest('detailname', [WPSG_SANITIZE_TEXTFIELD], __('Produktname (Detail)', 'wpsg'), $data);
-				wpsg_checkRequest('shortdesc', [WPSG_SANITIZE_TEXTFIELD], __('Produktbeschreibung (Kurz)', 'wpsg'), $data);
-				
-				wpsg_checkRequest('beschreibung', [WPSG_SANITIZE_NONE], __('Kurztext', 'wpsg'), $data);
-				wpsg_checkRequest('longdescription', [WPSG_SANITIZE_NONE], __('Langtext', 'wpsg'), $data);
-				
-				if (isset($_REQUEST['longdescription_addon'])) wpsg_checkRequest('longdescription_addon', [WPSG_SANITIZE_NONE], __('Langtext (Zusatz)', 'wpsg'), $data);
-				if (isset($_REQUEST['productfeatures'])) wpsg_checkRequest('productfeatures', [WPSG_SANITIZE_NONE], __('Produktfeatures', 'wpsg'), $data);
-				
-				wpsg_checkRequest('moreinfos', [WPSG_SANITIZE_NONE], __('ZusÃ€tzliche Informationen', 'wpsg'), $data);
-				wpsg_checkRequest('moreinfos2', [WPSG_SANITIZE_NONE], __('Lieferumfang', 'wpsg'), $data);
-				
-				wpsg_checkRequest('anr', [WPSG_SANITIZE_TEXTFIELD], __('Artikelnummer', 'wpsg'), $data);
-				wpsg_checkRequest('ptemplate_file', [WPSG_SANITIZE_VALUES, $this->shop->loadProduktTemplates()], __('Produkttemplate', 'wpsg'), $data);
-				wpsg_checkRequest('posturl', [WPSG_SANITIZE_URL], __('URL Benachrichtigung / URL', 'wpsg'), $data);
-				wpsg_checkRequest('posturl_verkauf', [WPSG_SANITIZE_CHECKBOX], __('URL Benachrichtigung / Bei Kauf', 'wpsg'), $data);
-				wpsg_checkRequest('posturl_bezahlung', [WPSG_SANITIZE_CHECKBOX], __('URL Benachrichtigung / Bei Bezahlung', 'wpsg'), $data);
-				wpsg_checkRequest('partikel', [WPSG_SANITIZE_INT, ['allowEmpty' => true]], __('Zugeordneter Wordpress Artikel', 'wpsg'), $data);
-
-				wpsg_checkRequest('basket_multiple', [WPSG_SANITIZE_VALUES, [wpsg_product::MULTIPLE_ONE_MULTI, wpsg_product::MULTIPLE_MULTI_MULTI, wpsg_product::MULTIPLE_MULTI_ONE, wpsg_product::MULTIPLE_ONE_ONE]], __('Produkt unterliegt den EU-Leistungsortregeln', 'wpsg'), $data);
-				wpsg_checkRequest('rating', [WPSG_SANITIZE_VALUES, ['-1', '0', '1', '2', '3', '4', '5']], __('Bewertungspunkte', 'wpsg'), $data);
-	 
-				if (wpsg_isSizedInt($edit_id)) {
-					
-					wpsg_checkRequest('mwst_key', [WPSG_SANITIZE_TAXKEY], __('Steuergruppe', 'wpsg'), $data);
-					wpsg_checkRequest('euleistungsortregel', [WPSG_SANITIZE_CHECKBOX], __('Produkt unterliegt den EU-Leistungsortregeln', 'wpsg'), $data);
-					wpsg_checkRequest('preis', [WPSG_SANITIZE_FLOAT], __('Preis', 'wpsg'), $data);
-					wpsg_checkRequest('oldprice', [WPSG_SANITIZE_FLOAT], __('Alter Preis', 'wpsg'), $data);
-					
-				}
-				
+								
+				$data = array(
+					'name' => wpsg_q(wpsg_getStr($_REQUEST['name'])),
+					'detailname' => wpsg_q(wpsg_getStr($_REQUEST['detailname'])),
+					'beschreibung' => wpsg_q(wpsg_getStr($_REQUEST['beschreibung'])),
+					'anr' => wpsg_q(wpsg_getStr($_REQUEST['anr'])), 
+					'mwst_key' => wpsg_q(wpsg_getStr($_REQUEST['mwst_key'])),		
+					'ptemplate_file' => wpsg_q(wpsg_getStr($_REQUEST['ptemplate_file'])),
+					'posturl' => wpsg_q(wpsg_getStr($_REQUEST['posturl'])),
+					'posturl_verkauf' => wpsg_q(wpsg_getStr($_REQUEST['posturl_verkauf'])),
+					'posturl_bezahlung' => wpsg_q(wpsg_getStr($_REQUEST['posturl_bezahlung'])),
+					'partikel' => wpsg_q(wpsg_getStr($_REQUEST['partikel'])),
+					'euleistungsortregel' => wpsg_q(wpsg_getStr($_REQUEST['euleistungsortregel'])),
+					'basket_multiple' => wpsg_q(wpsg_getStr($_REQUEST['basket_multiple']))
+				);
+
 				// Erlaubte Zahlungsarten speichern
 				$data['allowedpayments'] = '';
-				if (wpsg_isSizedInt($_REQUEST['wpsg_paymentmethods_select'], '1')) {
-
+				if ($_REQUEST['wpsg_paymentmethods_select'] == '1')
+				{
+				
 					$arAllowedPayments = wpsg_trim($_REQUEST['wpsg_paymentmethods'], '0');
-
-					$free_key = array_search('free', $arAllowedPayments);
-					if ($free_key !== false) $arAllowedPayments[$free_key] = 0;
-
 					if (wpsg_isSizedArray($arAllowedPayments)) $data['allowedpayments'] = implode(',', $arAllowedPayments);
 					else $data['allowedpayments'] = '';
-
-				}
-
+					
+				}
+				
 				// Erlaubte Versandarten speichern
 				$data['allowedshipping'] = '';
-				if (wpsg_isSizedInt($_REQUEST['wpsg_shippingmethods_select'], '1'))
-				{
-
+				if ($_REQUEST['wpsg_shippingmethods_select'] == '1')
+				{
+					
 					$arAllowedShipping = wpsg_trim($_REQUEST['wpsg_shippingmethods'], '0');
 					if (wpsg_isSizedArray($arAllowedShipping)) $data['allowedshipping'] = implode(',', $arAllowedShipping);
 					else $data['allowedshipping'] = '';
-
-				}
-				
+					
+				}
+				 
+				$data['preis'] = wpsg_tf($_REQUEST['preis']);
+				 			
 				$this->shop->callMods('produkt_save_before', array(&$data));
-				
-				if (wpsg_getInt($edit_id) > 0) {
- 
-					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($edit_id)."'");
-					
-					$oProduct = wpsg_product::getInstance(intval($edit_id));
-					
-					foreach ($_REQUEST['meta'] as $meta_key => $meta_value) {
-						
-						$oProduct->setMeta($meta_key, $meta_value);
-						
-					}
-					
+
+				if ($_REQUEST['edit_id'] > 0)
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 					$this->addBackendMessage(__('Produkt erfolgreich gespeichert.', 'wpsg'));
-
-				} else {
-
+					
+				}
+				else
+				{
+	
 					$data['cdate'] = 'NOW()';
-					$edit_id = $this->db->ImportQuery(WPSG_TBL_PRODUCTS, $data);
+					$_REQUEST['edit_id'] = $this->db->ImportQuery(WPSG_TBL_PRODUCTS, $data);
 					$this->addBackendMessage(__('Produkt erfolgreich angelegt.', 'wpsg'));
-
+					
 				}
 
 				// Artikelnummer = id, wenn nicht gesetzt
-				if (trim($data['anr']) == '') {
-
-					$data = array('anr' => wpsg_q($edit_id));
-
-					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($edit_id)."'");
+				if (trim($data['anr']) == '')
+				{
+					
+					$data = array('anr' => wpsg_q($_REQUEST['edit_id']));
+					
+					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 
 					// Produkt Object Cache lÃ¶schen
-					$this->shop->cache->clearProductCache($edit_id);
-
-				}
-
-				$this->shop->callMods('produkt_save', array(&$edit_id));
-
+					$this->shop->cache->clearProductCache($_REQUEST['edit_id']);
+					
+				}
+				
+				$this->shop->callMods('produkt_save', array(&$_REQUEST['edit_id']));
+						
 				if (isset($_REQUEST['submit_index'])) $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=index');
-				else $this->redirect(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$edit_id, 'wpsg-product-edit-'.wpsg_getInt($edit_id)));
-
-			}
-
-			exit;
-
+				else $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			
+			die();
+			
 		} // public function saveAction()
-
+		
 		/**
 		 * Wird beim erstellen eines neuen Produktes aufgerufen
 		 */
-		public function addAction() {
-			
-			check_admin_referer('wpsg-product-add');
+		public function addAction()
+		{
 			
 			// VerfÃŒgbare Produkttemplates
 			$this->shop->view['templates'] = $this->shop->loadProduktTemplates();
-
-			$this->shop->view['data'] = array(
-				'id' => false,
-				'ptemplate_file' => 'standard.phtml'
-			);
-
-			$this->shop->view['partikel_select'] = array();
-            $this->shop->view['partikel_select']['davor'] = [__('Allgemein', 'wpsg'), [0 => __('Nicht zugeordnet', 'wpsg')]];
-
-			$arArtikel = get_posts('numberposts=-1'); if (wpsg_isSizedArray($arArtikel)) {
-
-                $this->shop->view['partikel_select']['article'] = array(__('Artikel', 'wpsg'), array());
-                foreach ($arArtikel as $a) $this->shop->view['partikel_select']['article'][1][$a->ID] = $a->post_title;
-
-            }
-
-			$arPages = get_pages(); if (wpsg_isSizedArray($arPages)) {
-
-			$this->shop->view['partikel_select']['pages'] = array(__('Seiten', 'wpsg'), array());
-			foreach ($arPages as $p) $this->shop->view['partikel_select']['pages'][1][$p->ID] = $p->post_title;
-
-		}
-
-			$this->shop->view['arSubAction'] = array(
-				'general' => array(
-					'title' => __('Allgemein', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_general.phtml', false)
-				)
-			);
-
-			$this->shop->view['arSubAction']['texte'] = array(
-				'title' => __('Texte', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_texte.phtml', false)
-			);
-
-
-			$this->shop->callMods('product_addedit_content', array(&$this->shop->view['arSubAction'], &$this->shop->view['data']));
+			 
+			$this->shop->view['data'] = array();
+			$this->shop->callMods('produkt_add', array(&$this->shop->view['data']));
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit.phtml');
-
+			
 		} // public function addAction()
-
+		
 		/**
 		 * Wird beim lÃ¶schen eines Produktes aufgerufen
 		 */
-		public function delAction() {
-			
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			else $edit_id = $_REQUEST['edit_id'];
-			
-			check_admin_referer('wpsg-product-del-'.$edit_id);
-
-			$oProduct = wpsg_product::getInstance($edit_id);
-			$oProduct->delete();
-
-			// Alle Bilder eines Produktes in der Mediathek lÃ¶schen
-			$pid = $edit_id;
-			$data = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".$GLOBALS['wpdb']->prefix."postmeta` WHERE `meta_key`='".wpsg_q('wpsg_produkt_id')."' AND `meta_value`='".wpsg_q($pid)."' ORDER BY `post_id`");
-
-			foreach ($data as $pm) {
-				// Wenn das Bild mehrmals verwendet wird, ist die post_id mehrmals vorhanden.
-				$sql = "SELECT * FROM `".$GLOBALS['wpdb']->prefix."postmeta` WHERE `post_id` = '".wpsg_q($pm['post_id'])."'";
-				$pis = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".$GLOBALS['wpdb']->prefix."postmeta` WHERE `post_id` = '".wpsg_q($pm['post_id'])."' AND `meta_key` = '".wpsg_q('wpsg_produkt_id')."'");
-
-				if (count($pis) > 1) {
-					// Nur den Eintrag mit der post_id, meta_key='wpsg_produkt_id' und meta_value=product_id lÃ¶schen.
-					$GLOBALS['wpsg_sc']->db->Query("DELETE FROM `".$GLOBALS['wpdb']->prefix."postmeta` WHERE `post_id` = '".wpsg_q($pm['post_id'])."' AND `meta_key` = '".wpsg_q('wpsg_produkt_id')."' AND `meta_value` = '".wpsg_q($pid)."' ");
-
-				}
-				if (count($pis) == 1) {
-					// Alle EintrÃ€ge in wp_postmeta mit der post_id und den Eintrag in wp_posts mit ID=post_id lÃ¶schen.
-					//$GLOBALS['wpsg_sc']->db->Query("DELETE FROM `".$GLOBALS['wpdb']->prefix."postmeta` WHERE `post_id` = '".wpsg_q($pm['post_id'])."' ");
-					//$GLOBALS['wpsg_sc']->db->Query("DELETE FROM `".$GLOBALS['wpdb']->prefix."posts` WHERE `ID` = '".wpsg_q($pm['post_id'])."' ");
-
-					// Tabelle Produkte Eintrag postids leeren
-					$data = array(
-						'postids' => ''
-					);
-					$GLOBALS['wpsg_sc']->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($pid)."'");
-
-					// Bilddateien lÃ¶schen
-					//delete_post_meta($pm['post_id'], 'wpsg_produkt_id');	// LÃ¶scht den Eintrag bei mehreren Produkten
-					wp_delete_attachment( $pm['post_id'], true );	// LÃ¶scht alle EintrÃ€ge zu der post_id und die Bilder
-
-				}
-			}
-
-
+		public function delAction()
+		{
+			
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
+				'deleted' => '1'
+			), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");		
+			
+			$this->shop->callMods('produkt_del', array($_REQUEST['edit_id']));
+			
+			// Ãbersetzung lÃ¶schen
+			$this->db->UpdateQuerY(WPSG_TBL_PRODUCTS, array(
+				'deleted' => '1'
+			), "`lang_parent` = '".wpsg_q($_REQUEST['edit_id'])."'");
+			
 			$this->addBackendMessage(__('Produkt erfolgreich gelÃ¶scht.', 'wpsg'));
+			
 			$this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=index');
-
+			
 		} // public function delAction()
-
+		 		
 		/**
 		 * Dialog fÃŒr die Produktauswahl
 		 */
-		public function selectAction() {
-
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) throw \wpsg\Exception::getSanitizeException();
-			else $edit_id = intval($_REQUEST['edit_id']);
-			
-			if (wpsg_isSizedString($_REQUEST['wpsg_mode'], 'filterDialog')) {
-
+		public function selectAction()
+		{
+			
+			if ($_REQUEST['wpsg_mode'] == 'filterDialog')
+			{
+				
 				die($this->shop->render(WPSG_PATH_VIEW.'/produkt/select_filter.phtml'));
-
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_mode'], 'filter')) {
-
+				
+			}
+			else if ($_REQUEST['wpsg_mode'] == 'filter')
+			{
+ 
 				$strQueryWHERE = '';
-
-				if (wpsg_checkInput($_REQUEST['filter_name'], WPSG_SANITIZE_TEXTFIELD)) $strQueryWHERE .= " AND P.`name` LIKE '%".wpsg_q($_REQUEST['filter_name'])."%' ";
-
+				 
+				if (wpsg_isSizedString($_REQUEST['filter_name'])) $strQueryWHERE .= " AND P.`name` LIKE '%".wpsg_q($_REQUEST['filter_name'])."%' ";
+				
 				$arProductIDs = $this->db->fetchAssocField("
 					SELECT
@@ -1513,36 +739,39 @@
 				 		P.`lang_parent` = '0'
 						".$strQueryWHERE."
-				");
-
+				 ");
+				
 				$this->shop->view['arProducts'] = array();
-
+				
 				// Aufwerten
-				foreach ($arProductIDs as $p_id) {
-
+				foreach ($arProductIDs as $p_id)
+				{
+					
 					$product_data = $this->shop->loadProduktArray($p_id);
-					$bVariante = false;
-
-					if ($this->shop->hasMod('wpsg_mod_productvariants'))
+					$bVariante = false;					
+					
+					if ($this->shop->hasMod('wpsg_mod_varianten'))
 					{
-
-						$arVarianten = $this->shop->callMod('wpsg_mod_productvariants', 'getVariants', array($p_id, true, true, true));
-
+				
+						$arVarianten = $this->shop->callMod('wpsg_mod_varianten', 'loadVarianten', array($p_id));
+				
 						if (wpsg_isSizedArray($arVarianten))
 						{
-
-							$bVariante = true;
-
+					
+							$bVariante = true;									
+					
 						}
-
+				
 					}
-
+					
 					if (!$bVariante) $this->shop->view['arProducts'][] = $product_data;
-
-				}
-
+					
+				} 
+				
 				die($this->shop->render(WPSG_PATH_VIEW.'/produkt/select_filter_productlist.phtml'));
-
-			} else if (wpsg_isSizedString($_REQUEST['wpsg_mode'], 'wpsg_mod_relatedproducts')) {
-
+				
+			}
+			else if ($_REQUEST['wpsg_mode'] == 'wpsg_mod_relatedproducts')
+			{ 
+				
 				// Bei der Auswahl fÃŒr die Ãhnlichen Produkte sollte das aktuelle Produkt und bereits relevante nicht zur auswahl stehen
 				$this->shop->view['arProdukte'] = $this->db->fetchAssocField("
@@ -1556,10 +785,12 @@
 						P.`deleted` = '0' AND
 						P.`lang_parent` = '0' AND
-						P.`id` != '".wpsg_q($edit_id)."'
-				", "id", "name");
-
-			} else {
-
-				$this->shop->view['arProdukte'] = wpsg_array_merge(array('-1' => __('Alle Produkte', 'wpsg')), $this->db->fetchAssocField("
+						P.`id` != '".wpsg_q($_REQUEST['edit_id'])."'
+				", "id", "name"); 
+				
+			}
+			else
+			{
+
+				$this->shop->view['arProdukte'] = $this->db->fetchAssocField("
 					SELECT
 						`id`, `name`
@@ -1569,9 +800,9 @@
 						`deleted` = '0' AND
 						`lang_parent` = '0'
-				", "id", "name"));
-
+				", "id", "name");
+				
 				if ($this->shop->hasMod('wpsg_mod_productgroups'))
 				{
-
+				
 					$this->shop->view['arProduktgroups'] = $this->db->fetchAssocField("
 						SELECT
@@ -1582,5 +813,5 @@
 							PG.`deleted` != '1'					
 					", "id", "name");
-
+					
 					$this->shop->view['arProductgroupsOrder'] = array(
 						'id' => __('Interne ID', 'wpsg'),
@@ -1589,20 +820,22 @@
 						'preis' => __('Preis', 'wpsg')
 					);
-
+					
 					$this->shop->view['arProductgroupsDirection'] = array(
 						'asc' => __('Aufsteigend', 'wpsg'),
 						'desc' => __('Absteigend', 'wpsg')
 					);
-
-				}
-
-			}
-
+					
+				}
+					
+			}
+			
 			$this->shop->view['arTemplates'] = $this->shop->loadProduktTemplates();
-			array_unshift($this->shop->view['arTemplates'], __('Aus Produkt', 'wpsg'));
-
+			array_unshift($this->shop->view['arTemplates'], __('Aus Produkt', 'wpsg'));			
+						
 			die($this->shop->render(WPSG_PATH_VIEW.'/produkt/select.phtml'));
-
+			
 		} // public function selectAction()
-
+		
 	} // class wpsg_ProduktController extends wpsg_SystemController
+
+?>
Index: /controller/wpsg_ShopController.class.php
===================================================================
--- /controller/wpsg_ShopController.class.php	(revision 8528)
+++ /controller/wpsg_ShopController.class.php	(revision 5261)
@@ -1,50 +1,40 @@
-<?php
+<?php 
 
 	/**
 	 * Zentrale Klasse des wpShopGermanys
 	 */
-	class wpsg_ShopController extends wpsg_SystemController
+	class wpsg_ShopController extends wpsg_SystemController 
 	{
-
+		
 		/**  Array mit allen Installierten Modulen */
-		var $arModule;
-
-        var $text_message;
-		
-		var $noReplace = false;
-
-		/** True, wenn eine Lizenz verwendet wird */
-		var $bLicence = false;
-
-		var $noReleatedProducts  = false;
-		
+		var $arModule;	
+
+		/** Array mit den Lizenzinformationen */
+		var $arLizenz = false;
+		 		
 		/** BasketController */
 		var $basketController;
-
-		/** @var wpsg_basket Der Warenkorb */
+		
+		/** Der Warenkorb */
 		var $basket;
-
+		
 		/** Alle Versandkosten der aktivierten Module */
-		var $arShipping = null;
-		var $arShippingAll = null;
-
-		/** Versandarten wurden schon zusammengefÃŒhrt */
-		var $bShippingMerged = false;
-
+		var $arShipping;
+		
 		/** Alle Zahlungsarten der aktivierten Module */
 		var $arPayment;
-
+		
 		/** Alle BestellzustÃ€nde */
 		var $arStatus;
-
+		 		
 		/** Tabellenprefix */
 		var $prefix;
-
+		
 		/** Cache Klasse */
 		var $cache;
-
+				
 		/** Bindet im wp_foot den Layer ein, sollte es eine Shop Ausgabe erfordern */
 		var $showEULayer = false;
-
+		
 		/** ErmÃ¶glicht es in einer anderen Sprache als die aktuelle Locale zu arbeiten */
 		var $force_locale = false;
@@ -52,27 +42,11 @@
 		/** Gibt an, ob das Produkt ÃŒber einen Shortcode gerendert wird (FÃŒr [raw] Funtkion wichtig) */
 		var $bShortcode = false;
-
+		
 		/** Wurden die Versandarten schon zusammengefÃŒgt */
 		var $shipping_alreadymerged = false;
-
+		
 		/** Ob im Warenkorb mit gerundeten Werten weitergerechnet werden soll */
 		var $addRoundedValues = true;
-
-		/** Wird von der the_title auf true gesetzt wenn man auf einer Produktseite ist */
-		var $titleDisplayed = false;
-
-        /** Informationen die im SystemCheck gesammelt werden */
-        public $arSystemCheck = null;
-        
-        /** Das Land, damit die Berechnung im BE beim bearbeiten des Produktes klappt */
-        public $country = 0;
-
-        /** Object Cache fÃŒr die loadProduktArray */
-        private $productCache = Array();
-        
-		const CHECK_NOTICE = 1;
-		const CHECK_WARNING = 2;
-		const CHECK_ERROR = 3;
-
+		
 		/** URL Konstanten */
 		const URL_BASKET = 1;
@@ -89,13 +63,8 @@
 		const URL_WIDGET_AJAX = 12;
 		const URL_ORDER = 13;
-		const URL_LOGOUT = 14;
+		const URL_LOGOUT = 14;  
 		const URL_ONLINE_DISPUTE_RESOLUTION = 15;
-		const URL_REQUEST = 16;
-		const URL_LOSTPWD = 17;
-		const URL_PRODUCTDETAIL = 18;
-		const URL_ABO = 19;
-		const URL_BASKET_MORE = 20;
-
-		/** Status Konstanten */
+		
+		/** Status Konstanten */ 
 		const STATUS_EINGEGANGEN = 0;
 		const STATUS_AUFTRAGAKZEPTIERT = 1;
@@ -103,123 +72,70 @@
 		const STATUS_ZAHLUNGAKZEPTIERT = 100;
 		const STATUS_RECHNUNGGESCHRIEBEN = 110;
-		const STATUS_SAMMELRECHNUNGGESCHRIEBEN = 120;
 		const STATUS_ZAHLUNGFEHLGESCHLAGEN = 200;
 		const STATUS_WAREVERSENDET = 250;
 		const STATUS_ZUGESTELLT = 300;
 		const STATUS_ZURUECKGEZAHLT = 400;
-		const STATUS_STORNIERT = 500;
-		const STATUS_AKTIVABO = 600;
-		const STATUS_OFFENEABOKUENDIGUNG = 610;
-		const STATUS_GEKUENDIGTEABOS = 620; 
-
-		/** Seitenkonstanten */
-		const PAGE_BASKET = 1;
-
-		private bool $is_prepared = false;
-
+		const STATUS_STORNIERT = 500; 
+				
 		/**
 		 * Constructor
 		 */
-		public function __construct()
-		{
-
+		public function __construct() 
+		{
+			
 			parent::__construct();
-
+			
 			$this->arModule = array();
 			$this->arShipping = array();
 			$this->arPayment = array();
-
+			
 			$this->cache = new wpsg_cache($this->db);
-
+			
 			$this->basketController = new wpsg_BasketController();
- 
-			$wpsg_update_data = $this->get_option('wpsg_updatedata', true);
-			if (wpsg_isSizedArray($wpsg_update_data) && @$wpsg_update_data['returnCode'] != '0') $this->bLicence = true;
-			 
-			$GLOBALS['wpsg_sc'] = $this;
-
+			
+			// Lizenz prÃŒfen
+			if ($this->get_option('wpsg_key', true) !== false)
+			{
+
+				if (!class_exists('Crypt_RSA')) 
+				{
+
+					$bOK = @set_include_path(WPSG_PATH.'/lib/phpseclib0.3.0/'.PATH_SEPARATOR.get_include_path());
+										
+					require_once(WPSG_PATH.'/lib/phpseclib0.3.0/Crypt/RSA.php');
+					
+				}
+				
+				$rsa = new Crypt_RSA();
+				$rsa->loadKey(file_get_contents(WPSG_PATH.'/lib/.htpublic'));
+				
+				$arKey = @unserialize($rsa->decrypt(base64_decode($this->get_option('wpsg_key', true))));
+				
+				if (is_array($arKey) && $arKey['anwendung'] == 'wpShopGermany')
+				{
+					
+					$this->arLizenz = array(
+						'l' => $arKey['l'],
+						'nr' => $arKey['nr'],
+						'mods' => $arKey['mods'],
+						'dev' => (($this->get_option('wpsg_debugURL') == '1')?'1':'0')
+					);
+					
+				}
+								
+			}
+						
 		} // public function __construct()
-
-		/**
-		 * Filterung des Seitentitels
-		 */
-		public function the_title($title, $id = null)
-		{
-
-			if (get_the_ID() == $this->getPagePID(wpsg_ShopController::PAGE_BASKET))
-			{
-
-				// Bei der Produktanzeige ÃŒber den Warenkorb soll kein Titel angezeigt werden
-				if (wpsg_isSizedInt($id, $this->get_option('wpsg_page_basket')) && wpsg_isSizedString($_REQUEST['wpsg_action'], 'showProdukt') && doing_filter('the_content')) return '';
-
-			}
-
-			// Seitentitel auf Produktseiten nicht anzeigen
-			if ($this->hasMod('wpsg_mod_produktartikel') && get_post_type() === $this->get_option('wpsg_mod_produktartikel_pathkey')) $this->titleDisplayed = true;
-
-			return $title;
-
+		
+		/**
+		 * Filterung des Seitentitels 
+		 */
+		public function the_filter($title, $id = null)
+		{
+			
+			if (wpsg_isSizedInt($id, $this->get_option('wpsg_page_basket')) && wpsg_isSizedString($_REQUEST['wpsg_action'], 'showProdukt')) return '';
+			else return $title;
+			
 		}
-
-		public function wpsg_daily_hook() {
-		    
-		    $wpsg_customerdatadelete = $this->get_option('wpsg_customerdatadelete');
-		   	$wpsg_customerdatedelete_who = $this->get_option('wpsg_customerdatedelete_who'); 
-		    
-		    if (wpsg_isSizedInt($wpsg_customerdatadelete)) {
-			
-				$strQueryWHERE = "";
-		    	
-		        switch ($this->get_option('wpsg_customerdatadelete_unit')) {
-		            
-                    case '0': // Tage
-                        
-                        $strQueryHAVING = " GREATEST(`last_login`, `last_order_date`) < DATE_SUB(NOW(), INTERVAL ".wpsg_q($wpsg_customerdatadelete)." DAY) "; break;
-                        
-                    case '1': // Monate
-
-                        $strQueryHAVING = " GREATEST(`last_login`, `last_order_date`) < DATE_SUB(NOW(), INTERVAL ".wpsg_q($wpsg_customerdatadelete)." MONTH) "; break;
-                        
-                    case '2': // Jahre
-
-                        $strQueryHAVING = " GREATEST(`last_login`, `last_order_date`) < DATE_SUB(NOW(), INTERVAL ".wpsg_q($wpsg_customerdatadelete)." YEAR) "; break;
-                        
-                    default: throw new \Exception(__('UngÃŒltige Einheit fÃŒr das automatische Anonymisieren der Kundendaten.', 'wpsg'));
-		            
-                }
-                
-                if ($wpsg_customerdatedelete_who === '1') { // Nur GÃ€ste
-	
-					$strQueryWHERE = " AND K.`passwort_saltmd5` = '' ";
-		        	
-				}
-		        
-                $strQuery = "
-                    SELECT
-                        K.`id`, K.`last_login`,
-                        (SELECT O.`cdate` FROM `".WPSG_TBL_ORDER."` AS O WHERE O.`k_id` = K.`id` ORDER BY O.`cdate` DESC LIMIT 1) AS `last_order_date`
-                    FROM
-                        `".WPSG_TBL_KU."` AS K
-                    WHERE
-                        K.`status` != -1
-                        ".$strQueryWHERE."		            
-                    HAVING
-                        ".$strQueryHAVING."  
-                ";
-                 
-                $arCustomerID = $this->db->fetchAssoc($strQuery);
-                               
-                foreach ($arCustomerID as $row_c) {
-                    
-                    $oCustomer = wpsg_customer::getInstance($row_c['id']);
-                    $oCustomer->anonymize();
-                    
-                }
-                
-            }
-
-            $this->callMods('wpsg_hourly_hook');
-		    
-        } // public function wpsg_daily_hook()
 		
 		/**
@@ -228,28 +144,23 @@
 		public function firstInstall()
 		{
-			
+
 			global $wpdb, $current_user;
-
+			
 			$user_id = 0;
-
-			if (function_exists('wp_get_current_user')) {
-				
-				$current_user = wp_get_current_user();
-				$user_id = $current_user->user_ID;
-				
-			} else if (function_exists("get_currentuserinfo"))
+					
+			if (function_exists("get_currentuserinfo"))
 			{
 				get_currentuserinfo();
 				$user_id = $current_user->user_ID;
 			}
-
+			
 			if ($user_id == 0 && function_exists("get_current_user_id"))
 			{
 				$user_id = get_current_user_id();
 			}
-
+									
 			// Artikel zum Produkt anlegen
 			$title = __('wpShopGermany DemoProdukt WordPress Artikel', 'wpsg');
-
+			
 			$partikel = $this->db->ImportQuery($wpdb->prefix."posts", array(
 				"post_author" => $user_id,
@@ -264,7 +175,7 @@
 				"post_content" => '',
 				"ping_status" => "closed",
-				"comment_status" => "closed"
+				"comment_status" => "closed"						
 			));
-
+			
 			$product_id = $this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
 				'cdate' => 'NOW()',
@@ -274,14 +185,14 @@
 				'preis' => '119',
 				'mwst_key' => 'c',
-				'beschreibung' => __('Dies ist der ProdukttextâŠ', 'wpsg')
+				'beschreibung' => __('Dies ist der ProdukttextâŠ', 'wpsg')						
 			));
-
+			
 			$this->db->UpdateQuery($wpdb->prefix."posts", array(
 				"post_name" => wpsg_q($this->clear($title, $partikel)),
 				"post_content" => wpsg_q('[wpshopgermany product="'.$product_id.'"]')
 			), "`ID` = '".wpsg_q($partikel)."'");
-
+			
 			$title = __('wpShopGermany DemoProdukt WordPress Seite', 'wpsg');
-
+			
 			$page = $this->db->ImportQuery($wpdb->prefix."posts", array(
 				"post_author" => $user_id,
@@ -298,68 +209,48 @@
 				"comment_status" => "closed"
 			));
-
+			
 			$this->db->UpdateQuery($wpdb->prefix."posts", array(
 				"post_name" => wpsg_q($this->clear($title, $page)),
 				"post_content" => wpsg_q('[wpshopgermany product="'.$product_id.'"]')
 			), "`ID` = '".wpsg_q($page)."'");
-
-			if ($this->hasMod('wpsg_mod_request') == '1') {
-				if ($this->get_option('wpsg_page_request') === false) $this->createPage(__('Anfrageliste', 'wpsg'), 'wpsg_page_request', '-1');
-			}
-			
-			if ($this->get_option('wpsg_multiblog_standalone', true) === false) $this->update_option('wpsg_multiblog_standalone', '1', true);
-			if ($this->get_option('wpsg_customer_start', true) 	  === false) $this->update_option('wpsg_customer_start', '1', true);
-			if ($this->get_option('wpsg_order_start', true) 	  === false) $this->update_option('wpsg_order_start', '1', true);			
-			
-			if ($this->get_option('wpsg_page_basket') 			  === false) $this->createPage(__('Warenkorb', 'wpsg'), 'wpsg_page_basket', '-1');
-			if ($this->get_option('wpsg_currency') 				  === false) $this->update_option('wpsg_currency', 'EUR');
-			if ($this->get_option('wpsg_produkte_perpage') 		  === false) $this->update_option('wpsg_produkte_perpage', '25');
-			if ($this->get_option('wpsg_order_perpage') 		  === false) $this->update_option('wpsg_order_perpage', '25');
-			if ($this->get_option('wpsg_page_basket_more')  	  === false) $this->createPage(__('Weiter shoppen', 'wpsg'), 'wpsg_page_basket_more', '-1');			
-			if ($this->get_option('wpsg_page_versand') 			  === false) $this->createPage(__('Versandkosten', 'wpsg'), 'wpsg_page_versand', '-1');
-			if ($this->get_option('wpsg_page_agb') 				  === false) $this->createPage(__('AGB', 'wpsg'), 'wpsg_page_agb', '-1');
-			if ($this->get_option('wpsg_page_datenschutz') 		  === false) $this->createPage(__('Datenschutz', 'wpsg'), 'wpsg_page_datenschutz', '-1');
-			if ($this->get_option('wpsg_page_widerrufsbelehrung') === false) $this->createPage(__('Widerrufsbelehrung', 'wpsg'), 'wpsg_page_widerrufsbelehrung', '-1');
-			if ($this->get_option('wpsg_page_impressum') 		  === false) $this->createPage(__('Impressum', 'wpsg'), 'wpsg_page_impressum', '-1');
-            if ($this->get_option('wpsg_page_product') 			  === false) $this->createPage(__('Produktdetails', 'wpsg'), 'wpsg_page_product', '-1');
-			//if ($this->get_option('wpsg_page_onlinedisputeresolution') === false) $this->createPage(__('Online Streitbeilegung', 'wpsg'), 'wpsg_page_onlinedisputeresolution', '-1');
-			
-			// Versandarten und Vorkasse aktivieren
-			$this->update_option('wpsg_mod_versandarten', time());
-			$this->update_option('wpsg_mod_prepayment', time());
-			
+			 
+			if ($this->get_option('wpsg_page_basket') === false) $this->createPage(__('Warenkorb', 'wpsg'), 'wpsg_page_basket', '-1');				
+			if ($this->get_option('wpsg_page_versand') === false) $this->createPage(__('Versandkosten', 'wpsg'), 'wpsg_page_versand', '-1');
+			if ($this->get_option('wpsg_page_agb') === false) $this->createPage(__('AGB', 'wpsg'), 'wpsg_page_agb', '-1');
+			if ($this->get_option('wpsg_page_datenschutz') === false) $this->createPage(__('Datenschutz', 'wpsg'), 'wpsg_page_datenschutz', '-1');
+			if ($this->get_option('wpsg_page_widerrufsbelehrung') === false) $this->createPage(__('Widerrufsbelehrung', 'wpsg'), 'wpsg_page_widerrufsbelehrung', '-1');				
+			if ($this->get_option('wpsg_page_impressum') === false) $this->createPage(__('Impressum', 'wpsg'), 'wpsg_page_impressum', '-1');
+			if ($this->get_option('wpsg_page_onlinedisputeresolution') === false) $this->createPage(__('Online Streitbeilegung', 'wpsg'), 'wpsg_page_onlinedisputeresolution', '-1');
+ 			
 			// Bestellbedingungen aktivieren
 			$this->update_option('wpsg_mod_ordercondition', time());
-
+			
 			$this->loadModule(true);
-
-			$this->arModule['wpsg_mod_versandarten']->install();
-			$this->arModule['wpsg_mod_prepayment']->install();
 			
 			// Versandzone anlegen
 			if ($this->hasMod('wpsg_mod_versandarten'))
 			{
-
+			
 				$nVersandzonen = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_VZ."`");
-
+					
 				if ($nVersandzonen == 0)
 				{
-
+				
 					$vz_default_name = "Inland";
-
+				
 					$vz_id = $this->db->ImportQuery(WPSG_TBL_VZ, array(
 						"name" => wpsg_q($vz_default_name)
 					));
-					
+				
 					$this->addTranslationString('vz_'.$vz_id, $vz_default_name);
-
+				
 					// Lieferanten anlegen
 					$nVa = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_VA."`");
-
+				
 					if ($nVa == 0)
 					{
-
+				
 						$va_default_name = "Post";
-
+				
 						$va_id = $this->db->ImportQuery(WPSG_TBL_VA, array(
 							"name" => wpsg_q($va_default_name),
@@ -368,18 +259,18 @@
 							'mwst_key' => 'c'
 						));
-
+							
 						$this->addTranslationString('wpsg_mod_versandarten_'.$va_id, $va_default_name);
-
+				
 					}
-
+				
 					// LÃ€nder anlegen
 					$nLander = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_LAND."`");
-
-					if ($nLander == 0)
+				
+					if (nLander == 0)
 					{
-
+							
 						$land_default_name = "Deutschland";
 						$land_default_krzl = "DE";
-
+							
 						$land_id = $this->db->ImportQuery(WPSG_TBL_LAND, array(
 							"name" => wpsg_q($land_default_name),
@@ -392,21 +283,21 @@
 							"mwst_d" => 'NULL'
 						));
-
+							
 						$this->addTranslationString('land_'.$land_id, $land_default_name);
 						$this->addTranslationString('landkrzl_'.$land_id, $land_default_krzl);
-
+							
 						$this->update_option('wpsg_defaultland', $land_id);
-
+							
 					}
-
-				}
-
-			}
-
+				
+				}
+				
+			}
+				
 			if ($this->get_option('wpsg_kleinunternehmer_text') == '')
 				$this->update_option('wpsg_kleinunternehmer_text', __('Aufgrund der Kleinunternehmerregelung gemÃ€Ã Â§ 19 UStG wird keine Umsatzsteuer erhoben oder ausgewiesen.', 'wpsg'));
-
+						
 			if ($this->hasMod('wpsg_mod_ordercondition')) $this->arModule['wpsg_mod_ordercondition']->install();
-
+			
 			// Widerrufsformular generieren
 			if (!file_exists(WPSG_PATH_UPLOADS.'wpsg_revocation/')) mkdir(WPSG_PATH_UPLOADS.'wpsg_revocation/', 0775, true);
@@ -414,16 +305,27 @@
 			$this->render(WPSG_PATH_VIEW.'/admin/musterwiderruf.pdf.phtml');
 			$this->update_option('wpsg_revocationform', 'widerrufsformular.pdf');
-
+			 
 			$this->update_option('wpsg_installed', time(), true);
-
+			
 		} // public function firstInstall()
-
+		
 		/**
 		 * Installiert den Shop
 		 */
-		public function install()
-		{
- 
+		public function install() 
+		{
+			
+			global $wpdb, $current_user;
+			 			
 			$this->callMods('install');
+			
+			// Vordefinierte Module installieren
+			$this->update_option('wpsg_mod_versandarten', time());
+			$this->update_option('wpsg_mod_prepayment', time());
+			$this->loadModule(true);
+						
+			if ($this->hasMod('wpsg_mod_versandarten')) $this->arModule['wpsg_mod_versandarten']->install();  
+			if ($this->hasMod('wpsg_mod_prepayment')) $this->arModule['wpsg_mod_prepayment']->install();
+			// Vordefinierte Module installieren ende
 
 			// Kundenfelder vorkonfigurieren
@@ -431,62 +333,62 @@
 
 			$this->checkDefault('wpsg_afterinsert', '1');
-			$this->checkDefault('wpsg_salt', md5($_SERVER['REQUEST_URI'].rand(1, 1000)));
-
+			$this->checkDefault('wpsg_salt', base64_encode($_SERVER['REQUEST_URI'].rand(1, 1000)));
+			
 			// Betreffs der E-Mails vordefinieren
-			$this->checkDefault('wpsg_global_betreff', 		 'Allgemeiner Betreff', false, true);
-			$this->checkDefault('wpsg_global_absender',		 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>', false, false, WPSG_SANITIZE_EMAILNAME);
-
-			$this->checkDefault('wpsg_adminmail_betreff', 	 'Eingang einer neuen Bestellung', false, true);
-			$this->checkDefault('wpsg_adminmail_absender', 	 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>', false, false, WPSG_SANITIZE_EMAILNAME);
+			$this->checkDefault('wpsg_global_betreff', 'Allgemeiner Betreff', false, true);
+			$this->checkDefault('wpsg_global_absender', 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>');
+			
+			$this->checkDefault('wpsg_adminmail_betreff', 'Eingang einer neuen Bestellung', false, true);
+			$this->checkDefault('wpsg_adminmail_absender', 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>');
 			$this->checkDefault('wpsg_adminmail_empfaenger', 'bestellungen@'.$_SERVER['HTTP_HOST']);
-
-			$this->checkDefault('wpsg_kundenmail_betreff', 	 'BestellbestÃ€tigung', false, true);
-			$this->checkDefault('wpsg_kundenmail_absender',  'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>', false, false, WPSG_SANITIZE_EMAILNAME );
-
-			$this->checkDefault('wpsg_status_betreff', 		 'StatusÃ€nderung Ihrer Bestellung', false, true);
-			$this->checkDefault('wpsg_status_absender', 	 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>', false, false, WPSG_SANITIZE_EMAILNAME);
-
+						
+			$this->checkDefault('wpsg_kundenmail_betreff', 'BestellbestÃ€tigung', false, true);
+			$this->checkDefault('wpsg_kundenmail_absender', 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>');
+			
+			$this->checkDefault('wpsg_status_betreff', 'StatusÃ€nderung Ihrer Bestellung', false, true);
+			$this->checkDefault('wpsg_status_absender', 'Shop XYZ <shop@'.$_SERVER['HTTP_HOST'].'>');
+			
 			$this->checkDefault('wpsg_path_upload_multiblog', 'uploads/sites/%blog_id%/', true);
 
 			$this->checkDefault('wpsg_preisangaben', WPSG_BRUTTO);
 			$this->checkDefault('wpsg_preisangaben_frontend', WPSG_BRUTTO);
-			
-		} // public function install()
-
+			 			
+		} // public function install() 
+		
 		/**
 		 * ÃberprÃŒft ob der Kunde $customer_id das Produkt $product_id schon gekauft hat
-		 * Wenn $customer_id = false ist, wird nach dem eingeloggten Benutzer geschaut.
-		 * Ist kein Benutzer eingeloggt wird false zurÃŒckgegeben
-		 *
+		 * Wenn $customer_id = false ist, wird nach dem eingeloggten Benutzer geschaut. 
+		 * Ist kein Benutzer eingelogt wird false zurÃŒckgegeben
+		 * 
 		 * Keine BerÃŒcksichtigung auf Bestellstatus
-		 *
+		 * 
 		 * @author Daschmi (07.05.2014)
-		 *
+		 * 
 		 * @param int $product_id
 		 * @param int $customer_id
-		 *
-		 * @return boolean
+		 * 
+		 * @return boolean 
 		 */
 		public function hasOrder($product_id, $customer_id = false)
 		{
-
-			if ($customer_id === false)
-			{
-
-				if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id']))
-				{
-
+			
+			if ($customer_id === false)  
+			{
+				
+				if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id'])) 
+				{
+					
 					$customer_id = $_SESSION['wpsg']['checkout']['id'];
-
+					
 				}
 				else
 				{
-
+					
 					return false;
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 			$nCountOrder = $this->db->fetchOne("
 				SELECT
@@ -500,10 +402,10 @@
 					K.`id` = '".wpsg_q($customer_id)."'
 			");
-
+			
 			if ($nCountOrder > 0) return true;
 			else return false;
-
+			
 		} // public function hasOrder($product_id, $customer_id = false)
-
+		
 		/**
 		 * Gibt eine URL zu einer Shop Seite zurÃŒck
@@ -511,563 +413,233 @@
 		public function getURL($url_const, $mod = false, $action = false, $arParam = array(), $ForceHttps = false)
 		{
-
+			
 			switch ($url_const)
 			{
-
-				case self::URL_VERSANDKOSTEN:
-
-					$url = get_permalink($this->get_option('wpsg_page_versand'));
+				
+				case self::URL_VERSANDKOSTEN: 
+					
+					$url = get_permalink($this->get_option('wpsg_page_versand'));					
 					break;
-
+					
 				case self::URL_AGB:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_agb'));
 					break;
-
+				
 				case self::URL_DATENSCHUTZ:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_datenschutz'));
 					break;
 
 				case self::URL_BASKET:
-
-					$url = get_permalink($this->get_option('wpsg_page_basket'));
+					
+					$url = get_permalink($this->get_option('wpsg_page_basket'));					
 					break;
 					
-				case self::URL_BASKET_MORE:
-				    
-				    $url = get_permalink($this->get_option('wpsg_page_basket_more'));
-				    break;
-
-				case self::URL_PRODUCTDETAIL:
-
-					$url = get_permalink($this->getPagePID(self::URL_PRODUCTDETAIL));
-
-					break;
-
 				case self::URL_BASKET_AJAX:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_basket'));
 					$url .= ((strpos($url, '?') === false)?'?wpsg_basket_ajax=1':'&wpsg_basket_ajax=1');
 					break;
-
+										
 				case self::URL_WIDGET_AJAX:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_basket'));
 					$url .= ((strpos($url, '?') === false)?'?wpsg_widget_ajax=1':'&wpsg_widget_ajax=1');
 					break;
-
+					
 				case self::URL_CHECKOUT:
-
-					if ($this->hasMod('wpsg_mod_onepagecheckout'))
+					
+					if ($this->hasMod('wpsg_mod_onepagecheckout')) 
 					{
-
+						
 						$url = get_permalink($this->get_option('wpsg_mod_onepagecheckout_page'));
 						break;
-
+						
 					}
-
+					
 					$url = $this->getURL(wpsg_ShopController::URL_BASKET);
 					$url .= ((strpos($url, '?') === false)?'?wpsg_checkout':'&amp;wpsg_checkout');
 					break;
-
+					
 				case self::URL_CHECKOUT2:
-
+					
 					if ($this->hasMod('wpsg_mod_onepagecheckout')) return $this->getURL(wpsg_ShopController::URL_CHECKOUT);
-
-					$url = $this->getURL(wpsg_ShopController::URL_BASKET);
+					
+					$url = $this->getURL(wpsg_ShopController::URL_BASKET);					
 					$url .= ((strpos($url, '?') === false)?'?wpsg_checkout2':'&amp;wpsg_checkout2');
 					break;
-
+									
 				case self::URL_OVERVIEW:
-
+					
 					// Wenn Crefopay aktiv ist, gibt es keine Bestellzusammenfassung, da diese auf CrefoPay Seite angezeigt wird
 					if ($this->hasMod('wpsg_mod_crefopay'))
 					{
-
+						
 						$url = $this->callMod('wpsg_mod_crefopay', 'getDoOrderUrl');
-
+						
 					}
 					else
 					{
-
+					
 						$url = $this->getURL(wpsg_ShopController::URL_BASKET);
 						$url .= ((strpos($url, '?') === false)?'?wpsg_overview':'&amp;wpsg_overview');
 
 					}
-
-					break;
+						
+					break;			
 
 				case self::URL_WIDERRUF:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_widerrufsbelehrung'));
 					break;
 
-				case self::URL_REQUEST:
-
-					$url = get_permalink ($this->get_option('wpsg_page_request'));
-					break;
-
 				case self::URL_ONLINE_DISPUTE_RESOLUTION:
-
+							
 					$url = $this->get_option('wpsg_page_onlinedisputeresolution');
 					break;
-
+					
 				case self::URL_IMPRESSUM:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_impressum'));
 					break;
 
 				case self::URL_PROFIL:
-
+					
 					$url = get_permalink($this->get_option('wpsg_page_mod_kundenverwaltung_profil'));
 					break;
 					
-				case self::URL_ABO:
-					
-					$url = get_permalink($this->get_option('wpsg_page_mod_kundenverwaltung_abo'));
+				case self::URL_ORDER:
+					
+					$url = get_permalink($this->get_option('wpsg_page_mod_kundenverwaltung_order'));					
 					break;
-
-				case self::URL_ORDER:
-
-					$url = get_permalink($this->get_option('wpsg_page_mod_kundenverwaltung_order'));
+					
+				case self::URL_LOGOUT:
+					
+					$url = get_permalink($this->get_option('wpsg_page_mod_kundenverwaltung_profil'));
+					$url .= ((strpos($url, '?') === false)?'?wpsg_mod_kundenverwaltung_logout':'&amp;wpsg_mod_kundenverwaltung_logout').'&amp;wpsg_referer='.$this->getCurrentURL(); 
 					break;
-
-				case self::URL_LOGOUT:
-
-					$url = get_permalink($this->get_option('wpsg_page_mod_kundenverwaltung_profil'));
-					$url .= ((strpos($url, '?') === false)?'?wpsg_mod_kundenverwaltung_logout':'&amp;wpsg_mod_kundenverwaltung_logout').'&amp;wpsg_referer='.$this->getCurrentURL();
-					break;
-
-				case self::URL_LOSTPWD:
-
-					$url = $this->callMod('wpsg_mod_kundenverwaltung', 'getPwdVergessenURL');
-					break;
-
-			}
-
-			if (wpsg_isSizedString($mod))    $url .= ((strpos($url, '?') === false)?'?':'&').'wpsg_mod='.$mod;
+					
+			}
+			
+			if (wpsg_isSizedString($mod)) $url .= ((strpos($url, '?') === false)?'?':'&').'wpsg_mod='.$mod;
 			if (wpsg_isSizedString($action)) $url .= ((strpos($url, '?') === false)?'?':'&').'wpsg_action='.$action;
 			if (wpsg_isSizedArray($arParam)) $url .= ((strpos($url, '?') === false)?'?':'&').http_build_query($arParam);
 			if ($ForceHttps === true) $url = preg_replace('/^http:/', 'https:', $url);
-
+						
 			return $url;
-
+			
 		} // public function getURL($url_const, $entity = false)
-
-        /**
-         * Gibt den Pfad zurÃŒck, in dem der Shop seine Dateien ablegt
-         * Der Ordner wird fÃŒr direkte Zugriffe ÃŒber .htaccess gesperrt
-         */
-        public function getUplodatStoragePath() {
-
-            if ($this->isMultiBlog()) {
- 
-                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/';
-
-            } else {
-
-                $path = WP_CONTENT_DIR.'/uploads/wpsg/';
-                
-            }
-            
-            $this->protectDirectory($path);
-
-            return $path;
-            
-        } // public function getUplodatStoragePath()
-        
+		
 		/**
 		 * Checkt den Request und entfernt mÃ¶glicherweise escapte Variablen
 		 */
-		public function checkEscape() {
- 
-			if (isset($_GET['wpsg_quotecheck']) && strlen($_GET['wpsg_quotecheck']) > 7) {
-
+		public function checkEscape()
+		{
+			
+			if (strlen($_GET['wpsg_quotecheck']) > 7 || get_magic_quotes_gpc())
+			{
+				
 				$_POST      = array_map('stripslashes_deep', $_POST);
 			    $_GET       = array_map('stripslashes_deep', $_GET);
 			    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
 			    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);
-
+			    
 			    // Damit es bei mehrfachen Aufruf durch Module nicht erneut gemacht wird
 			    $_GET['wpsg_quotecheck'] = '\"CHECK';
-
-			}
-
+			    
+			}
+			
 		} // public function checkEscape()
-
-		/**
-		 * True, wenn im System Frontend angezeigt werden dÃŒrfen
-		 * Bestimmt auch, ob bestellt werden darf
-		 * 
-		 * @return bool
-		 */
-		public function canDisplayPrice() {
-
-			// Wenn Kundenverwaltung inaktiv, gibt es auch die Einstellung nicht => Preis anzeigen
-			if (!$this->hasMod('wpsg_mod_kundenverwaltung')) return true;
-			
-			$wpsg_mod_kundenverwaltung_preisAnzeige = $this->get_option('wpsg_mod_kundenverwaltung_preisAnzeige');
-
-			if (wpsg_isSizedInt($wpsg_mod_kundenverwaltung_preisAnzeige)) {
-
-				// Preis und Kauf nur fÃŒr angemeldete Benutzer
-				$isLoggedIn = $this->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn');
-
-				if (wpsg_isSizedInt($isLoggedIn))
-				{
-
-					return true;
-
-				}
-				else
-				{
-
-					return false;
-
-				}
-
-			} else return true;
-
-		} // public function canDisplayPrice()
-
-        /**
-         * Wordpress "init" Hook
-         */
-        public function init() {
-
-				$this->arStatus = array(
-					self::STATUS_EINGEGANGEN => __('Eingegangen', 'wpsg'),
-					self::STATUS_AUFTRAGAKZEPTIERT => __('Auftrag akzeptiert', 'wpsg'),
-					self::STATUS_ZAHLUNGAKZEPTIERT => __('Zahlung akzeptiert', 'wpsg'),
-					self::STATUS_RECHNUNGGESCHRIEBEN => __('Rechnung geschrieben', 'wpsg'),
-					self::STATUS_ZAHLUNGFEHLGESCHLAGEN => __('Zahlung fehlgeschlagen', 'wpsg'),
-					self::STATUS_WAREVERSENDET => __('Ware versendet', 'wpsg'),
-					self::STATUS_ZUGESTELLT => __("zugestellt", "wpsg"),
-					self::STATUS_ZURUECKGEZAHLT => __("zurÃŒckgezahlt", "wpsg"),
-					self::STATUS_STORNIERT => __("storniert", "wpsg"),
-					self::STATUS_UNVOLLSTAENDIG => __('UnvollstÃ€ndig', 'wpsg'),
-					self::STATUS_AKTIVABO => __('aktive Abos', 'wpsg'),
-					self::STATUS_OFFENEABOKUENDIGUNG => __('ausstehende AbokÃŒndigungen', 'wpsg'),
-					self::STATUS_GEKUENDIGTEABOS => __('gekÃŒndigte Abos', 'wpsg'),
-				);
-			  
-            if (!session_id()) {
-
-                /*
-                 * Ich Ã¶ffne die Session und schlieÃe sie gleich wieder, so habe ich die Session Daten in $_SESSION geladen und die Session ist fÃŒr REST etc. geschlossen
-                 * Ich Ã¶ffne sie spÃ€ter wieder
-                 */
-
-                session_start();
-                session_write_close();
-
-            }
-
-			// In widgets_init verschoben, damit dort schon die Module verwendet werden kÃ¶nnen
-            // $this->initShopModule(); // Muss vor initShop passieren, damit init von den Modulen aufgerufen wird
-	        
-            $this->initShop(); // Wichtig
-	        
-            /* $this->initShop(); In widgets_init verschoben */
-
-            $locale = apply_filters('plugin_locale', get_locale(), 'wpsg');
-            
-            if ($loaded = load_textdomain('wpsg', trailingslashit(WP_LANG_DIR).'wpsg/wpsg-'.$locale .'.mo')) {
-                
-                return $loaded;
-                
-            } else {
-                
-                load_plugin_textdomain('wpsg', false, WPSG_FOLDERNAME.'/lang/');
-                
-            }
-            
-            if (function_exists('register_block_type')) {
-            
-                register_block_type('wpsg/product', [
-                    'render_callback' => ['\wpsg\GutenbergBlock', 'product'],
-                    'attributes' => [
-                        'product'    => ['type' => 'string'],
-                        'template'   => ['type' => 'string'],
-                        'hide_title' => ['type' => 'string']
-                    ],
-                    'editor_script' => 'wpsg-block-product'
-                ]);
-                
-            }
-
-			$this->checkDefault('wpsg_shopdata_country', '1');
-			$this->checkDefault('wpsg_shopdata_2_country', '1');
-			$this->checkDefault('wpsg_shopdata_eu_country', '1');
-   					
-        } // public function init()
-
-        public function send_headers() {
-
-            $ses = $_SESSION;
-            if (session_status() !== PHP_SESSION_ACTIVE) session_start();
-            $_SESSION = $ses;
-
-        }
-
-		public function getShopLocations() {
-        	
-        	$arReturn = [
-        		1 => [
-					'label'   => __('Hauptsitz', 'wpsg'),
-					'street'  => $this->get_option('wpsg_shopdata_street'),
-					'zip' 	  => $this->get_option('wpsg_shopdata_zip'),
-					'city'    => $this->get_option('wpsg_shopdata_city'),
-					'country' => $this->getDefaultCountry()->getName(),
-					'tel' 	  => $this->get_option('wpsg_shopdata_tel'),
-					'fax' 	  => $this->get_option('wpsg_shopdata_fax'),
-					'email'   => $this->get_option('wpsg_shopdata_email')
-				],
-			];
-        	
-        	if ($this->get_option('wpsg_shopdata_2') === '1') { 
-        		
-        		$arReturn[2] = [
-        			'label'   => __('Zweigstelle', 'wpsg'),
-        			'street'  => $this->get_option('wpsg_shopdata_2_street'),
-					'zip' 	  => $this->get_option('wpsg_shopdata_2_zip'),
-					'city' 	  => $this->get_option('wpsg_shopdata_2_city'),
-					'country' => $this->get_option('wpsg_shopdata_2_country'),
-					'tel'     => $this->get_option('wpsg_shopdata_2_tel'),
-					'fax' 	  => $this->get_option('wpsg_shopdata_2_fax'),
-					'email'   => $this->get_option('wpsg_shopdata_2_email')
-				];
-					
-			}
-			
-			return $arReturn;
-        	
-		}
-
-		public function initShopModule() {
-
-        	if ($this->get_option('wpsg_installed', true) > 0) {
-
-				$this->loadModule();
-
-	        }
-
-		}
-
+		
 		/**
 		 * Initiiert den Shop
 		 * Ich hab das nicht in den Konstruktor gepackt, damit einige Funktionen aus der initShop Methode schon auf das $GLOBALS zugreifen kÃÃžÎ©nnen
 		 */
-		public function initShop() {
-
-			if (is_admin() && defined('FORCE_SSL_ADMIN') && FORCE_SSL_ADMIN == true) {
-
+		public function initShop($prefix)
+		{
+			 		
+			if (is_admin() && defined('FORCE_SSL_ADMIN') && FORCE_SSL_ADMIN == true)
+			{
+				
 				// Backend lÃ€uft mit SSL
-
-			}
-
-			if (preg_match('/update-core\.php/', $_SERVER['PHP_SELF'])) {
-
+				 
+				
+			}			
+			
+			if (preg_match('/update-core\.php/', $_SERVER['PHP_SELF']) || preg_match('//', $_SERVER['PHP_SELF']))
+			{
+				
 				$this->update_option('wpsg_lastupdate', false);
-
-			}
-
+				
+			}
+			
 			if (wpsg_isSizedInt($this->get_option('wpsg_autolineending'))) @ini_set('auto_detect_line_endings', true);
-
+			
+			$this->prefix = $prefix;
 			$this->basket = new wpsg_basket();
-
-			if ($this->get_option('wpsg_installed', true) > 0) {
-
-				//$this->loadModule();
-
+			
+			if ($this->get_option('wpsg_installed', true) > 0)
+			{
+			 
+				$this->loadModule();
+				
 				// Hier mÃŒssen die Ãnderungen der Session gespeichert werden
-				if (wpsg_isSizedArray($_REQUEST['wpsg']['checkout'])) {
-
+				if (wpsg_isSizedArray($_REQUEST['wpsg']['checkout'])) 
+				{
+				
 					$_SESSION['wpsg']['checkout'] = wpsg_xss(
 						wpsg_array_merge(
-							wpsg_getArray($_SESSION['wpsg']['checkout']),
+							(array)$_SESSION['wpsg']['checkout'], 
 							wpsg_trim($_REQUEST['wpsg']['checkout'], false)
 						)
 					);
-
-					/*
-                    if ($this->get_option('wpsg_save_order_after_mail') === '1' && wpsg_isSizedString($_SESSION['wpsg']['checkout']['email']) && !wpsg_isSizedInt($_SESSION['wpsg']['order_id'])) {
-
-                        $o_id = $this->db->ImportQuery(WPSG_TBL_ORDER, [
-                            'cdate' => 'NOW()',
-                            'status' => wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)
-                        ]);
-
-                        $_SESSION['wpsg']['order_id'] = $o_id;
-
-                    } */
-
-				}
-
-                if (isset($_REQUEST['wpsg_scss'])) {
-
-                    // Generierung der CSS Dateien
-                    $arFiles = [
-                        'css/style.scss'
-                    ];
-
-                    $this->callMods('wpsg_scss', [&$arFiles]);
-                     
-                    $md5 = '';
-
-                    foreach ($arFiles as $k => $f) {
-
-                        $arFiles[$k] = $this->getRessourcePath($f);
-
-                        $md5 .= md5_file($arFiles[$k]);
-
-                    }
-
-                    $css = '';
-                    $scss_cache = $this->get_option('wpsg_scss_cache');
-                    $scss_cache_file = WPSG_PATH_UPLOADS.'scss_cache.css';
-
-                    header('Content-type: text/css');
-
-                    if ($scss_cache === false || $scss_cache !== $md5 || !file_exists($scss_cache_file)) {
-
-                        require_once WPSG_PATH_LIB.'vendor/autoload.php';
-
-                        $scss = new Leafo\ScssPhp\Compiler();
-
-                        foreach ($arFiles as $f) {
-
-                            try {
-
-                                $scss->setImportPaths(dirname($f));
-                                $css .= $scss->compile(file_get_contents($f));
-
-                            } catch (\Exception $e) {
-
-                                echo $e->getMessage();
-                                echo "\r\n\r\n";
-                                echo $e->getTraceAsString ();
-
-                                exit;
-                                
-                            }
-
-                        }
-
-                        $minifier = new MatthiasMullie\Minify\CSS();
-                        $minifier->add($css);
-
-                        $css = $minifier->minify();
-
-                        file_put_contents($scss_cache_file, $css);
-
-                        $this->update_option('wpsg_scss_cache', $md5);
-
-                        echo $css;
-
-                    } else {
-
-                        readfile($scss_cache_file);
-
-                    }
-
-                    exit;
-
-                }
-				
-			}
-            
-			$this->callMods('init');
-            
+					
+				}
+				  
+				$this->basket->initFromSession();
+				
+				// Wenn Checkout abgeschickt wurde, dann Bestellung speichern
+				if (wpsg_isSizedArray($_REQUEST['wpsg']['checkout'])) $this->basket->save(false);
+								
+			} 
+			
 		} // public function initShop()
-
-		public function wp_enqueue() {
-
+				
+		public function wp_enqueue()
+		{
+						
 			wp_enqueue_script('jquery');
-
-			if (\is_admin() && ($_REQUEST['page']??'') === 'wpsg-Produkt') {
-
-				wp_enqueue_script('wpsg_vue3247js', $this->getRessourceURL('js/vue-3.2.47.global.min.js'));
-				
-			}
-			
-			if (is_admin() && preg_match('/wpsg/', wpsg_getStr($_REQUEST['page']))) {
-
-				wp_enqueue_script('wpsg_bsjs',  $this->getRessourceURL('js/bootstrap-3.4.1-dist/js/bootstrap.min.js'));
-                wp_enqueue_script('wpsg_vuejs', $this->getRessourceURL('js/vue.min.js'));
-
+										
+			if (is_admin())
+			{
+				
 				wp_enqueue_script('common');
-
-				wp_enqueue_script('wpsg_adminjs', 	  $this->getRessourceURL('js/admin.js'));
-                wp_enqueue_script('wpsg_momentjs', 	  $this->getRessourceURL('js/moment_2.0.0.min.js'));
-				wp_enqueue_script('wpsg_cookiejs', 	  $this->getRessourceURL('js/jquery.cookie.js'));
-				wp_enqueue_script('wpsg_bs_editable', $this->getRessourceURL('js/bootstrap3-editable-1.5.1/bootstrap3-editable/js/bootstrap-editable.js'));
-				wp_enqueue_script('wpsg_editable',    $this->getRessourceURL('js/editable.js'));
+			
+				wp_enqueue_script('wpsg_adminjs', $this->getRessourceURL('js/admin.js'));
+				wp_enqueue_script('wpsg_cookiejs', $this->getRessourceURL('js/jquery.cookie.js'));
+				wp_enqueue_script('wpsg_tooltipjs', $this->getRessourceURL('js/jquery-cluetip-master/jquery.cluetip.min.js'));
+				wp_enqueue_script('wpsg_editable', $this->getRessourceURL('js/editable.js'));
 
 				wp_enqueue_script('utils');
 				wp_enqueue_script('jquery-color');
-
+				
 				wp_enqueue_script('jquery-ui-core');
-                wp_enqueue_script('jquery-ui-autocomplete');
 				wp_enqueue_script('jquery-ui-dialog');
 				wp_enqueue_script('jquery-ui-sortable');
-				wp_enqueue_script('jquery-ui-datepicker'); //, $this->url(WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/lib/ui/jquery.ui.datepicker.js'), array('jquery', 'jquery-ui-core'));
-				wp_enqueue_script('jquery-ui-datepicker-de', $this->url(WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/lib/ui/jquery.ui.datepicker-de.js'), array('jquery', 'jquery-ui-core'));
-
-				wp_enqueue_style('wpsg-bscss',		  $GLOBALS['wpsg_sc']->getRessourceURL('js/bootstrap-3.4.1-dist/css/bootstrap.css'));
-				wp_enqueue_style('wpsg-bs-theme-css', $GLOBALS['wpsg_sc']->getRessourceURL('js/bootstrap-3.4.1-dist/css/bootstrap-theme.css'));
-				wp_enqueue_style('wpsg_bs_editable',  $GLOBALS['wpsg_sc']->getRessourceURL('js/bootstrap3-editable-1.5.1/bootstrap3-editable/css/bootstrap-editable.css'));
-
-				wp_enqueue_style('wp-jquery-ui-dialog');
-				wp_enqueue_style('jquery-ui-datepicker');
-				wp_enqueue_style('wpsg-adminstyle', $GLOBALS['wpsg_sc']->getRessourceURL('css/admin.css'), array('wpsg-bscss', 'wpsg-bs-theme-css'));
-
-				wp_localize_script('wpsg_adminjs', 'wpsg_ajax', array(
-					'img_ajaxloading' => $this->getRessourceURL('gfx/ajax-loader.gif'),
-					'label_pleasewait' => __('Bitte warten', 'wpsg'),
-					'ie_placeholder' => __('Ihr Text', 'wpsg'),
-					'ie_emptytext' => __('keine Angaben.', 'wpsg'),
-					'ie_validate_empty' => __('Bitte machen Sie hier eine Angabe.', 'wpsg')
-				));
-				
-				//wp_enqueue_script('wpsg_ajaxupload', $this->getRessourceURL('js/ajaxupload.js')); ??
-				wp_enqueue_media();
-
-				// Font AweSome
-				wp_enqueue_style('wpsg_fa', $GLOBALS['wpsg_sc']->getRessourceURL('js/font-awesome-4.5.0/css/font-awesome.min.css'));
-				
-				
-			}
-			else if (!is_admin())
-			{
-
+				wp_enqueue_script('jquery-ui-datepicker', $this->url(WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/ui/jquery.ui.datepicker.js'), array('jquery', 'jquery-ui-core'));
+				wp_enqueue_script('jquery-ui-datepicker-de', $this->url(WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/ui/jquery.ui.datepicker-de.js'), array('jquery', 'jquery-ui-core'));
+			
+			}
+			else
+			{
+			
+				if ($this->get_option('wpsg_load_css') != '1') wp_enqueue_style('wpsg-frontendstyle', $this->getRessourceURL('css/frontend.css'));			
+				if ($this->get_option('wpsg_load_thickbox_js') == '1') wp_enqueue_script('thickbox', null, array('jquery'));
+				if ($this->get_option('wpsg_load_thickbox_css') == '1') wp_enqueue_style('thickbox.css', '/'.WPINC.'/js/thickbox/thickbox.css', null, '1.0');			 
 				if ($this->get_option('wpsg_load_jquery') == '1') wp_enqueue_script('jquery');
 				
-				//wp_enqueue_style('wpsg-bscss', $GLOBALS['wpsg_sc']->getRessourceURL('js/bootstrap-3.4.1-dist/css/bootstrap.css'));
-                //if ($this->get_option('wpsg_load_bootstrap_glyphfont_css') == '1') wp_enqueue_style('wpsg-bscss', $GLOBALS['wpsg_sc']->getRessourceURL('js/bootstrap-3.4.1-dist/css/bootstrap-glyphfont.css'));
-
-				if ($this->get_option('wpsg_load_css') != '1') wp_enqueue_style('wpsg-frontendstyle', $this->getRessourceURL('css/frontend.css'));
-                if ($this->get_option('wpsg_load_css') != '1') wp_enqueue_style('wpsg-frontendstyle', '/?wpsg_scss');
-				
-				if ($this->get_option('wpsg_load_thickbox')  == '1') {
-				
-					\wp_enqueue_script('thickbox');
-					\wp_enqueue_style('thickbox');
-					
-				}
-				
-				if ($this->get_option('wpsg_load_fslightbox_js')  == '1') {
-					
-					\wp_enqueue_script('wpsg_fslightbox', $this->getRessourceURL('js/fslightbox.js'), [], false, [
-						'in_footer' => true
-					]);
-					
-				}
-				
-				if ($this->get_option('wpsg_load_jquery') == '1') wp_enqueue_script('jquery');
-
-				wp_enqueue_script('wpsg_frontend', $this->getRessourceURL('js/frontend.js'), array('jquery'));
-
+				wp_enqueue_script('wpsg_frontend', $this->getRessourceURL('js/frontend.js'));
+				
 				wp_localize_script('wpsg_frontend', 'wpsg_ajax', array(
 					'ajaxurl' => $this->getURL(wpsg_ShopController::URL_BASKET),
@@ -1079,17 +651,17 @@
 					'label_pleasewait' => __('Bitte warten', 'wpsg')
 				));
-
+				
 				// Validierung
 				if ($this->get_option('wpsg_load_validierung_js') == '1')
 				{
-
+				
 					switch ($this->get_option('wpsg_form_validation'))
 					{
-
+				
 						case '1': // Validierung V1
-
-							wp_enqueue_script('jquery-validation-de', $this->getRessourceURL('js/jquery.validationEngine-de.js'), array('jquery'));
-							wp_enqueue_script('jquery-validation', $this->getRessourceURL('js/jquery.validationEngine.js'), array('jquery'));
-
+								
+							wp_enqueue_script('jquery-validation-de', $this->getRessourceURL('js/jquery.validationEngine-de.js'));
+							wp_enqueue_script('jquery-validation', $this->getRessourceURL('js/jquery.validationEngine.js'));
+				
 							wp_localize_script('jquery-validation-de', 'wpsg_trans_v1', array(
 								'required_alertText' => __('* Dieses Feld ist ein Pflichtfeld', 'wpsg'),
@@ -1127,12 +699,12 @@
 								'vname_alertText' => __('* Bitte geben Sie einen Vorname an.', 'wpsg')
 							));
-
+								
 							break;
-
+				
 						case '2': // Validierung V2
-
-							wp_enqueue_script('wpsg-validation', $this->getRessourceURL('js/jquery-validation-1.11.1/dist/jquery.validate.min.js'), array('jquery'));
-							wp_enqueue_script('wpsg-validation-2', $this->getRessourceURL('js/jquery-validation-1.11.1/dist/additional-methods.min.js'), array('jquery'));
-
+								
+							wp_enqueue_script('wpsg-validation', $this->getRessourceURL('js/jquery-validation-1.11.1/dist/jquery.validate.min.js'));
+							wp_enqueue_script('wpsg-validation-2', $this->getRessourceURL('js/jquery-validation-1.11.1/dist/additional-methods.min.js'));
+				
 							wp_localize_script('wpsg-validation', 'wpsg_trans_v2', array(
 								'required' => __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'),
@@ -1153,110 +725,97 @@
 								'min' => __('Minimalwert {0}.', 'wpsg')
 							));
-
+							
 							break;
-
+				
 					}
-
-				}
-
+				
+				}
+				
 				if ($this->get_option('wpsg_load_validierung_css') == '1')
 				{
-
+						
 					switch ($this->get_option('wpsg_form_validation'))
 					{
-
+				
 						case '1': // Validierung V1
-
+				
 							wp_enqueue_style('wpsg-validation',$this->getRessourceURL('css/validationEngine.jquery.css'));
-
+								
 							break;
-
+								
 						case '2': // Validierung V2
-
+								
 							// Hat nix
-
+				
 							break;
-
+				
 					}
-
-				}
-
-			}
-
+						
+				}
+				
+			}
+			
 			$GLOBALS['wpsg_sc']->callMods('wpsg_enqueue_scripts');
-
+						
 		}
-
+			
 		/**
 		 * Ruft die Funktion $func_name in den Modulen auf und ÃŒbergibt ihnen $arParam
 		 * Gibt ein Modul -1 zurÃŒck wird kein weiteres Modul mehr angefragt
 		 */
-		public function callMods($func_name, $arParam = array(), $fixView = false) {
-		                
-			if ($fixView) $view = $this->view;
-			
-		    \do_action('wpsg_'.$func_name, $arParam);
-		    
-			foreach ($this->arModule as $m_key => $m) {
-
-				if (method_exists($m, $func_name)) {
-
+		public function callMods($func_name, $arParam = array())
+		{
+			
+			foreach ($this->arModule as $m_key => $m)
+			{
+				
+				if (method_exists($m, $func_name))
+				{
+
+					
 					$b = call_user_func_array(array($m, $func_name), $arParam);
-
-					if ($b === -1) break; 
-					else if ($b === -2) {
-					
-						if ($fixView) $this->view = $view;
-						
-						return false;
-
-					}
-
-				}
-
-			}
-			
-			if ($fixView) $this->view = $view;
-			
-			// Konflikt mit _after!
-			\do_action('wpsg_'.$func_name.'_afterAction', $arParam);
-			
+				
+					if ($b == -1) break;
+					else if ($b == -2) return false;
+					
+				}
+				
+			}
+
 			return true;
-
+			
 		} // public function callMods($func_name)
-
+		
 		/**
 		 * Ruft eine spezielle Funktion eines speziellen Moduls auf
 		 */
-		public function callMod($mod_key, $func_name, $arParam = array()) {
-    
+		public function callMod($mod_key, $func_name, $arParam = array())
+		{
+			
 			if (!array_key_exists($mod_key, $this->arModule)) return;
 			
-			if (method_exists($this->arModule[$mod_key], $func_name)) {
-
-				// wpsg_debug($this->arModule[$mod_key]);
-				// wpsg_debug($func_name);
-				// wpsg_debug($arParam);
-
+			if (method_exists($this->arModule[$mod_key], $func_name))
+			{
+				
 				return call_user_func_array(array($this->arModule[$mod_key], $func_name), $arParam);
-
-			}
-
+				
+			}
+			
 		} // public function callMod($mod_key, $func_name, $arParam = array())
-
+			
 		/**
 		 * Ruft eine URL auf
-		 * $typ = 0 Bei Kauf eines Produktes
+		 * $typ = 0 Bei Kauf eines Produktes 
 		 * $typ = 1 Bei Bezahlung eines Produktes
 		 * $typ = 2 Bei erstellung einer Rechnung
 		 * $typ = 3 Benutzerdefiniert (Daten aus $custom)
 		 */
-		public function notifyURL($url, $produkt_key, $menge, $order_id, $typ, $custom = false, $customSet = false) {
-
-			if (!filter_var($url, FILTER_VALIDATE_URL)) return;
+		public function notifyURL($url, $produkt_key, $menge, $order_id, $typ, $custom = false, $customSet = false)
+		{
 			
 			$arSend = array();
-
-			switch ($typ) {
+									
+			switch ($typ)
+			{
 				case '0': $arSend['typ'] = 'buy'; break;
 				case '1'; $arSend['typ'] = 'pay'; break;
@@ -1265,34 +824,36 @@
 				default: die(__('UngÃŒltige Anfrage!', 'wpsg'));
 			}
-
+						
 			$arSend['time'] = time();
-
-			if (wpsg_isSizedArray($customSet)) {
-
-				foreach ($customSet as $k => $v) {
-
+			
+			if (wpsg_isSizedArray($customSet))
+			{
+				
+				foreach ($customSet as $k => $v)
+				{
+					
 					$arSend[$k] = $v;
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 			// Produktdaten an den Array hÃ€ngen
-			if ($produkt_key != false) {
-
-				$produkt_data = $this->cache->loadProduct($this->getProduktID($produkt_key));
+			if ($produkt_key != false)
+			{
+				
+				$arSend['produkt_key'] = $produkt_key;				
+				$produkt_data = $this->cache->loadProduct($this->getProduktID($produkt_key));				
 				foreach ($produkt_data as $k => $v) $arSend['product_'.$k] = $v;
-
-                $arSend['produkt_key'] = $produkt_key;
-
-			}
-
+				
+			}
+			
 			if ($menge != false)
 			{
-
+				
 				$arSend['menge'] = $menge;
-
-			}
-
+				
+			}
+			
 			if ($order_id > 0)
 			{
@@ -1300,10 +861,10 @@
 				$order_data = $this->cache->loadOrder($order_id);
 				$customer_data = $this->cache->loadKunden($order_data['k_id']);
-
+				
 				foreach ($order_data as $k => $v) $arSend['order_'.$k] = $v;
 				foreach ($customer_data as $k => $v) $arSend['customer_'.$k] = $v;
-
+				
 				$this->callMods('notifyURL', array(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend));
-
+				
 				/* Veraltet: */
 				$arSend['order'] = $this->db->fetchRow("
@@ -1315,40 +876,49 @@
 						O.`id` = '".wpsg_q($order_id)."'
 				");
-
+				
 				if ($arSend['order']['k_id'] > 0)
 				{
-
-					$arSend['kunde'] = $this->cache->loadKunden($arSend['order']['k_id']);
-
+					
+					$arSend['kunde'] = $this->db->fetchRow("
+						SELECT
+							K.*
+						FROM
+							`".WPSG_TBL_KU."` AS K
+						WHERE
+							K.`id` = '".wpsg_q($arSend['order']['k_id'])."'						
+					");
+					
 				}
 				/* Veraltet ENDE */
-
-			}
-
+				
+			}
+			
 			// Kontrollhash
 			$hash = md5($this->get_option('wpsg_salt').$arSend['time']);
 			$arSend['hash'] = $hash;
 			
-			if (!wpsg_checkInput($url, WPSG_SANITIZE_URL)) throw \wpsg\Exception::getSanitizeException();
-			
-			$result = \wp_remote_post($url, [
-				'body' => http_build_query($arSend, '', '&'),
-				'headers' => [
-					'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13',
-					'Referer' => $this->getURL(self::URL_BASKET)
-				]
-			]);			
-			
-			if (is_array($result)) {
-				
-				return $result['body'];
-				
-			} else {
-			
-				// Fehler
-				throw new \wpsg\Exception($result->get_error_message(), \wpsg\Exception::TYP_EXT_URL);
-				
-			}			 
-
+			// CURL Aufruf
+			$curl = curl_init($url);
+			curl_setopt($curl, CURLOPT_POST, 1);
+			curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($arSend, '', '&'));
+			
+			if (!ini_get('safe_mode') && !ini_get('open_basedir')) 
+			{
+				
+				/*
+				 * TRUE um jedem "Location: "-Header zu folgen, den der Server als Teil der HTTP-Header zurÃŒckgibt. Die Verarbeitung erfolgt rekursiv, PHP wird jedem "Location: "-Header folgen, sofern nicht CURLOPT_MAXREDIRS gesetzt ist.
+				 * Kann im Safemode nicht geÃ€ndert werden 
+				 */
+				curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
+				
+			}
+			
+			curl_setopt($curl, CURLOPT_HEADER, 0); 
+			curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+			
+			$Rec_Data = curl_exec($curl);
+
+			return $Rec_Data;
+			
 		} // public function notifyURL($url, $produkt_key, $order_id, $typ)
 
@@ -1359,486 +929,177 @@
 		public function getCurrentURL()
 		{
-
+			
 			$myReferer = "";
-
-			if ($this->get_option('wpsg_referer_requesturi') == '1') {
-
+			
+			if ($this->get_option('wpsg_referer_requesturi') == '1')
+			{
+			
 				if (function_exists('qtrans_convertURL'))
 				{
-
+			
 					$myReferer =  qtrans_convertURL($_SERVER["REQUEST_URI"]);
-
+			
 				}
 				else
 				{
-
+			
 					$myReferer = $_SERVER['REQUEST_URI'];
-
-				}
-
-			} else {
-
-				if (is_page()) {
-
+						
+				}
+			
+			}
+			else
+			{
+					
+				if (is_page())
+				{
+						
 					$myReferer = get_permalink(get_the_id());
-
-				} else {
-
-					if (wpsg_isSizedString($_SERVER['REDIRECT_URL'])) {
-
+						
+				}
+				else
+				{
+						
+					if (wpsg_isSizedString($_SERVER['REDIRECT_URL']))
+					{
+			
 						$myReferer .= $_SERVER['REDIRECT_URL'];
-
-					} else {
-
+						
+					}
+					else
+					{
+							
 						$myReferer = "";
-
+						
 						if (isset($_SERVER['REQUEST_URI']) && !empty($_SERVER['REQUEST_URI']))
 						{
-
+							
 							$myReferer = $_SERVER['REQUEST_URI'];
-
+							
 						}
 						else if (isset($_SERVER['SCRIPT_URL']) && !empty($_SERVER['SCRIPT_URL']))
 						{
-
+							
 							$myReferer = $_SERVER['SCRIPT_URL'];
-
+							
 						}
-
+			
 						if ($_SERVER['QUERY_STRING'] != '' && stripos($_SERVER['QUERY_STRING'], $myReferer) !== false)
 						{
-
+							
 							if (strpos($myReferer, '?') > 0)
 							{
-
+								
 								$myReferer .= '&'.$_SERVER['QUERY_STRING'];
-
+								
 							}
 							else
 							{
-
+								
 								$myReferer .= '?'.$_SERVER['QUERY_STRING'];
-
+								
 							}
-
+							
 						}
-
+							
 					}
-
-				}
-
+					
+				}
+			
 			}
 			
 			return $myReferer;
-
+			
 		} // public function getCurrentURL()
-
-        /**
-         * Ermittelt einmalig die Daten fÃŒr den Systemcheck
-         * Wird immer im Backend ausgefÃŒhrt
-         *
-         * @return array|null
-         */
-        public function systemcheck() {
-
-            if (is_null($this->arSystemCheck)) {
-
-				$arData = Array();
-				
-				$page_admin_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=seiten';
-				
-				// Shop Info VollstÃ€ndig?
-				$wpsg_shopdata_name = wpsg_ShopController::getShop()->get_option('wpsg_shopdata_name', default: '');
-				if ($wpsg_shopdata_name === '') {
-					
-					$arData[] = [
-						'general_wpsg_shopdata_name',
-						self::CHECK_NOTICE,
-						wpsg_translate(__(
-							'Bitte prÃŒfen Sie die Shopninfo unter <a href="#">wpShopGermany -> Konfiguration -> Shopinfo</a>, fÃŒr die eRechnung muss der Shop Name ausgefÃŒllt sein.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=shopdata'
-						)
-					];
-					
-				}
-				
-				if (intval(wpsg_ShopController::getShop()->get_option('wpsg_mod_revocation')) <= 0) {
-			
-					$arData[] = array(
-						'wpsg_mod_revocation_installed',
-						\wpsg_ShopController::CHECK_ERROR,
-						wpsg_translate(
-							__('Ab Version 4.4.12 gibt es ein neues kostenloses Modul âWiderrufsformularâ. Dieses Modul sollte meist aktiviert werden, wenn man das deutsche Widerrufsrecht erfÃŒllen mÃ¶chte. <a href="#1#">Hier</a> aktivieren und konfigurieren. Wenn Sie sich sicher sind, dass Sie das Widerrufsrecht erfÃŒllen kÃ¶nnen, kÃ¶nnen Sie diese Meldung ignorieren.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_revocation'
-						)
-					);
-	
-				}
-				
-
-                // Anfrageliste
-                if ($this->hasMod('wpsg_mod_request')) {
-                    
-                	$page_id = $this->get_option('wpsg_page_request');
-                	
-                	if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                			'general_page_request',
-                			self::CHECK_ERROR,
-                			wpsg_translate(__('Die Anfrageliste ist nicht korrekt definiert. Der Shop wird nicht korrekt funktionieren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                	);
-                	
-                }
-                
-                // Anhang an Kundenmail
-                $old_attachment = $this->get_option('wpsg_kundenmail_attachfile');
-                if (wpsg_isSizedString($old_attachment) && file_exists(wpsg_getUploadDir('wpsg_mailconf').$old_attachment)) {
-                    
-                    $arData[] = [
-                        'general_customermail_attachment',
-                        self::CHECK_ERROR,
-                        wpsg_translate(__('Es gibt noch einen alten Anhang der Kundenmail auÃerhalb der Mediathek, dieser muss in die Mediathek ÃŒberfÃŒhrt oder neu angegeben werden. <a href="#1#">Automatisiert ÃŒbernehmen</a> / <a href="#2#">E-Mail Konfiguration</a>', 'wpsg'),
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf&migrateAttachmentToMediathek=1&noheader=1',
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf'
-                        )
-                    ];
-                    
-                }
-				
-				// Thickbox und Option "Warenkorb im Fenster anzeigen"
-				if ($this->get_option('wpsg_load_thickbox') !== '1' && $this->get_option('wpsg_afterinsert') === '2') {
-					
-					$arData[] = [
-						'general_wpsg_load_thickbox_afterinsert_2',
-						self::CHECK_WARNING,
-						wpsg_translate(__('Die Thickbox wird nicht vom Shop geladen aber die Option "Warenkorb im Fenster anzeigen" ist aktiv. Wenn das Theme die Thickbox nicht lÃ€dt wird es zu Fehlern fÃŒhren.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf&migrateAttachmentToMediathek=1&noheader=1',
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf'
-						)
-					];
-					
-				}
-
-                // Warenkorbseite
-                $page_id = $this->get_option('wpsg_page_basket');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'general_page_basket',
-                    self::CHECK_ERROR,
-                    wpsg_translate(__('Die Warenkorbseite ist nicht korrekt definiert. Der Shop wird nicht korrekt funktionieren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-                
-                // Weiter shoppen
-                $page_id = $this->get_option('wpsg_page_basket_more');
-                
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'general_page_basket_more',
-                    self::CHECK_ERROR,
-                    wpsg_translate(__('Die "Weiter shoppen"-Seite ist nicht korrekt definiert. Der Shop wird nicht korrekt funktionieren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-                
-                // OnePageCheckout
-                if ($this->hasMod('wpsg_mod_onepagecheckout')) {
-                	
-                	$page_id = $this->get_option('wpsg_mod_onepagecheckout_page');
-                	$page_mod_onepage = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_onepagecheckout';
-                	
-                	if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                			'wpsg_page_onepagecheckout',
-                			self::CHECK_ERROR,
-                			wpsg_translate(__('Es ist keine Seite fÃŒr das OnePageCheckout definiert. Der Shop wird nicht korrekt funktionieren. Sie kÃ¶nnen dies in den <a href="#1#">Moduleinstellungen</a> Ã€ndern.', 'wpsg'), $page_mod_onepage)
-                	);
-                	
-                }
-
-                // Produktdetailseite
-                $page_id = $this->get_option('wpsg_page_product');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'general_page_productdetail',
-                    self::CHECK_ERROR,
-                    wpsg_translate(__('Die Produktdetailseite ist nicht korrekt definiert. Dies kann bei bestimmten Konfigurationen zu Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-
-                // Versandkosten
-                $page_id = $this->get_option('wpsg_page_versand');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'general_page_shippingt',
-                    self::CHECK_NOTICE,
-                    wpsg_translate(__('Es ist keine Seite fÃŒr die detaillierten Versandkosten definiert, dies kÃ¶nnte zu rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-
-                // AGB
-                $page_id = $this->get_option('wpsg_page_agb');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'wpsg_page_agb',
-                    self::CHECK_NOTICE,
-                    wpsg_translate(__('Es ist keine Seite fÃŒr die AGB definiert, dies kÃ¶nnte zu rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-
-                // Datenschutz
-                $page_id = $this->get_option('wpsg_page_datenschutz');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'wpsg_page_agb',
-                    self::CHECK_NOTICE,
-                    wpsg_translate(__('Es ist keine Seite fÃŒr die Datenschutzbedingungen definiert, dies kÃ¶nnte zu rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-
-                // Wiederruf
-                $page_id = $this->get_option('wpsg_page_widerrufsbelehrung');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'wpsg_page_cancellationterms',
-                    self::CHECK_NOTICE,
-                    wpsg_translate(__('Es ist keine Seite fÃŒr die Widerrufsbelehrung definiert, dies kÃ¶nnte zu rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-
-                // Wiederruf
-                $page_id = $this->get_option('wpsg_page_impressum');
-
-                if (!wpsg_isSizedInt($page_id) || !get_post_status($page_id)) $arData[] = array(
-                    'wpsg_page_imprint',
-                    self::CHECK_NOTICE,
-                    wpsg_translate(__('Es ist keine Seite fÃŒr das Impressum definiert, dies kÃ¶nnte zu rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href="#1#">Seitenkonfiguration</a> Ã€ndern.', 'wpsg'), $page_admin_url)
-                );
-
-                if (!class_exists('SoapClient'))
-                {
-
-                    $arData[] = array(
-                        'wpsg_noSoap',
-                        self::CHECK_NOTICE,
-                        __('Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. Informationen finden Sie in unseren <a target="_blank" href="http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/">FAQ</a>.', 'wpsg')
-                    );
-
-                }
-
-                if (!$this->hasMod('wpsg_mod_ordercondition'))
-                {
-
-                    $arData[] = array(
-                        'wpsg_noModOrdercondition',
-                        self::CHECK_NOTICE,
-                        wpsg_translate(
-                            __('Ab der wpShopGermany Version 3.4 kann das kostenlose Modul "<a href="#1#">Bestellbedingungen</a>" verwendet werden. Sie kÃ¶nnen es <a href="#2#">hier</a> konfigurieren. ÃberprÃŒfen Sie auch die anderen Ãnderungen, die wir <a href="#3#">in unserem Artikel</a> nÃ€her erlÃ€utern.', 'wpsg'),
-                            'http://wpshopgermany.maennchen1.de/?p=13232',
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition',
-                            'http://wpshopgermany.maennchen1.de/?p=13952'
-                        )
-                    );
-
-                }
-
-                // Alte UserViews checken
-                if (file_exists(WPSG_PATH_USERVIEW_OLD))
-                {
-
-                    $arData[] = array(
-                        'wpsg_oldUserViews',
-                        self::CHECK_NOTICE,
-                        wpsg_translate(
-                            __('Es existieren noch alte angepasste Templates unter #1#. Kopieren Sie diese bitte nach #2#. ZukÃŒnftig werden die Templateanpassungen nicht mehr im Pluginverzeichnis gesucht. Weitere Informationen erhalten Sie auch <a href="#3#">hier</a> oder auch in unserem kostenlosen <a href="#4#">Forum</a>.', 'wpsg'),
-                            WPSG_PATH_USERVIEW_OLD,
-                            WPSG_PATH_USERVIEW,
-                            'http://wpshopgermany.maennchen1.de/?p=5130',
-                            'http://forum.maennchen1.de'
-                        )
-                    );
-
-                }
-
-                if (!is_object($this->getDefaultCountry()))
-                {
-
-                    $arData[] = array(
-                        'wpsg_nodefaultcountry',
-                        self::CHECK_ERROR,
-                        wpsg_translate(
-                            __('Es wurde kein Standardland definiert, der Shop kann so nicht korrekt betrieben werden. Bitte ÃŒberprÃŒfen Sie die <a href="#1#">LÃ€nderkonfiguration</a>.', 'wpsg'),
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender'
-                        )
-                    );
-
-                }
-
-                // Schreibrechte auf der Sprachdatei
-                if (file_exists(WPSG_PATH_TRANSLATION) && !is_writable(WPSG_PATH_TRANSLATION))
-                {
-
-                    $arData[] = array(
-                        'wpsg_translationphtml',
-                        self::CHECK_NOTICE,
-                        wpsg_translate(
-                            __('<b>wpShopGermany:</b> Sprachdatei kann nicht geschrieben werden! PrÃŒfen Sie die Schreibrechte auf folgender Datei:<br /><b>#1#</b>', 'wpsg'),
-                            WPSG_PATH_TRANSLATION
-                        )
-                    );
-
-                }
-
-                // WÃ€hrungscode
-                if ($this->get_option('wpsg_currency') === '')
-                {
-
-                    $arData[] = array(
-                        'wpsg_currency',
-                        self::CHECK_ERROR,
-                        wpsg_translate(
-                            __('Kein WÃ€hrungscode definiert, dies kann zu Darstellungsproblemen und mÃ¶glicherweise Abmahnungen fÃŒhren. Sie kÃ¶nnen dies <a href="#1#">hier</a> konfigurieren.', 'wpsg'),
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin'
-                        )
-                    );
-
-                }
-
-                $this->callMods('systemcheck', array(&$arData));
-
-                $arData = array_reverse(wpsg_array_csort($arData, 1));
-
-                $countError = 0;
-                foreach ($arData as $d) if ($d[1] === self::CHECK_ERROR) $countError++;
-
-                $this->arSystemCheck = $arData;
-
-                if ($countError > 0) {
-
-                    $this->addBackendError(
-                        'nohspc_'.wpsg_translate(
-                            __('Die SystemprÃŒfung hat #1# Fehler festgestellt, klicken Sie <a href="#2#">hier</a> fÃŒr Details.', 'wpsg'),
-                            $countError,
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=systemcheck'
-                        ),
-                        'wpsg_systemcheck'
-                    );
-
-                }
-
-            }
-
-            return $this->arSystemCheck;
-
-        } // public function systemcheck()
-
+		
 		/**
 		 * Gibt die Ausgabe fÃŒr ein Produkt zurÃŒck
 		 */
-		public function renderProdukt($produkt_id, $force_template = false, $force_locale = false) {
- 
-			if (intval($produkt_id) <= 0) return;
-
+		public function renderProdukt($produkt_id, $force_template = false, $force_locale = false)
+		{
+			
 			global $locale, $l10n;
 
-			if ($force_locale !== false && file_exists(dirname(__FILE__).'/../lang/wpsg-'.$force_locale.'.mo')) {
-
-				$old_l10n = clone $l10n['wpsg'];
+			if (!$this->hasActiveLicence() && $this->getDemoDays() <= 0)
+			{
+			
+				// Ihre <a title="Informationen ÃŒber das wpShopGermandy Wordpress Shop Plugin System" href="http://wpshopgermany.de">wpShopGermany</a> <a href="http://shop.maennchen1.de/produkte/wpshopgermany-lizenzkey/" title="wpShopGermany Wordpress Shop Plugin System Lizenz erwerben">Lizenz</a> ist abgelaufen.<br />
+				return base64_decode('SWhyZSA8YSB0aXRsZT0iSW5mb3JtYXRpb25lbiDDvGJlciBkYXMgd3BTaG9wR2VybWFuZHkgV29yZHByZXNzIFNob3AgUGx1Z2luIFN5c3RlbSIgaHJlZj0iaHR0cDovL3dwc2hvcGdlcm1hbnkuZGUiPndwU2hvcEdlcm1hbnk8L2E+IDxhIGhyZWY9Imh0dHA6Ly9zaG9wLm1hZW5uY2hlbjEuZGUvcHJvZHVrdGUvd3BzaG9wZ2VybWFueS1saXplbnprZXkvIiB0aXRsZT0id3BTaG9wR2VybWFueSBXb3JkcHJlc3MgU2hvcCBQbHVnaW4gU3lzdGVtIExpemVueiBlcndlcmJlbiI+TGl6ZW56PC9hPiBpc3QgYWJnZWxhdWZlbi48YnIgLz4=');
+					
+			}
+			
+			if ($force_locale !== false && file_exists(dirname(__FILE__).'/../lang/wpsg-'.$force_locale.'.mo'))
+			{
+
+				$old_l10n = clone $l10n['wpsg']; 
 				$this->force_locale = $force_locale;
-
+				
 				// Hier muss load_(text)domain genommen werden, sonst ging es nicht!
-				// Damit das Plugin nicht warnt, habe ich es bissl verscrambelt
+				// Damit das Plugin nicht warnt, habe ich es bissl verscrambelt				
 				// load_(text)domain('wpsg', dirname(__FILE__).'/../lang/wpsg-'.$force_locale.'.mo');
 				call_user_func_array(
-					'load_textdomain',
+					base64_decode('bG9hZF90ZXh0ZG9tYWlu'),
 					array(
 						'wpsg', dirname(__FILE__).'/../lang/wpsg-'.$force_locale.'.mo'
 					)
 				);
-
-			}
-
-			if (wpsg_isSizedArray($produkt_id)) {
-
+				 									
+			}
+			
+			if (wpsg_isSizedArray($produkt_id)) 
+			{
+				
 				$this->view['data'] = $produkt_id;
 				$produkt_id = $this->view['data']['id'];
-
-			} else {
-
-				$this->view['data'] = $this->loadProduktArray($produkt_id);
-				if (!wpsg_isSizedArray($this->view['data'])) return '';
-				
-			}
- 
-			if (wpsg_isSizedInt($this->view['data']['disabled'])) return '';
-
+				
+			}
+			else $this->view['data'] = $this->loadProduktArray($produkt_id);
+						
 			// Produkt, bei dem die EU Leistungsortregel gilt ?
-			if (wpsg_isSizedInt($this->view['data']['euleistungsortregel'])) $this->showEULayer = true;
-
-			if (wpsg_isSizedInt($this->view['data']['deleted'])) return;
-
-			if ($force_template !== false) $this->view['data']['ptemplate_file'] = $force_template;
-
-			if (isset($this->view['data']['ptemplate_file'])) {
-				
-				$template = $this->view['data']['ptemplate_file'];
-				$template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->view['data']['ptemplate_file'];
-				
-			} else {
-				
-				$template = 'standard.phtml';
-				$template_file = WPSG_PATH_PRODUKTTEMPLATES.'standard.phtml';
-				
-			}
+			if (wpsg_isSizedInt($this->view['data']['euleistungsortregel'])) $this->showEULayer = true;			
+			
+			if ($this->view['data']['deleted'] == '1') return;
+			
+			if ($force_template !== false)
+			{
+				$this->view['data']['ptemplate_file'] = $force_template;
+			}
+			
+			$template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->view['data']['ptemplate_file'];
 
 			$this->callMods('renderProdukt_templateSelect', array(&$this->view['data'], &$template_file));
- 
-			$wpsg_ignoreuserview = $this->get_option('wpsg_ignoreuserview');
-
+			
 			// Das Template im UserView suchen
-            $template_file_theme = 		 str_replace(WPSG_PATH_PRODUKTTEMPLATES, WPSG_PATH_PRODUKTTEMPLATES_THEME, 	$template_file);
-            $template_file_uv = 		 str_replace(WPSG_PATH_PRODUKTTEMPLATES, WPSG_PATH_PRODUKTTEMPLATES_UV, 	$template_file);
-            $template_file_uv_old = 	 str_replace(WPSG_PATH_PRODUKTTEMPLATES, WPSG_PATH_PRODUKTTEMPLATES_UV_OLD, $template_file);
-
-			if (file_exists($template_file_theme) 	&& $wpsg_ignoreuserview != '1') $template_file = $template_file_theme;
-			else if (file_exists($template_file_uv) 	&& $wpsg_ignoreuserview != '1') $template_file = $template_file_uv;
-			else if (file_exists($template_file_uv_old) && $wpsg_ignoreuserview != '1') $template_file = $template_file_uv_old;
-			else if ($wpsg_ignoreuserview != '1' && !file_exists($template_file)) {
-				
-				$arTemplate = $this->loadProduktTemplates(false, true);
-				
-				foreach ($arTemplate as $k => $v) {
-					
-					if (basename($v) === $template) $template_file = $v;
-					
-				}
-								
-			}
-			
-			if (!is_file($template_file)) {
-
-				wpsg_debug(wpsg_translate(__('Das Template (#1#) fÃŒr ein Produkt (ID:#2#) scheint nicht zu existieren!', 'wpsg'), $template_file, $produkt_id)); return;
-
-			}
-
-			// Den Index fÃŒr getTemplateIndex hochzÃ€hlen
+			$template_file_uv = str_replace(WPSG_PATH_PRODUKTTEMPLATES, WPSG_PATH_PRODUKTTEMPLATES_UV, $template_file);
+			$template_file_uv_old = str_replace(WPSG_PATH_PRODUKTTEMPLATES, WPSG_PATH_PRODUKTTEMPLATES_UV_OLD, $template_file);
+			$template_file_theme = str_replace(WPSG_PATH_PRODUKTTEMPLATES, WPSG_PATH_PRODUKTTEMPLATES_TV, $template_file);
+			
+			if (file_exists($template_file_uv) && $this->get_option('wpsg_ignoreuserview') != '1') $template_file = $template_file_uv;
+			if (file_exists($template_file_uv_old) && $this->get_option('wpsg_ignoreuserview') != '1') $template_file = $template_file_uv_old;						
+			if (file_exists($template_file_theme) && $this->get_option('wpsg_ignoreuserview') != '1') $template_file = $template_file_theme;
+			 
+			if (!is_file($template_file)) { wpsg_debug(wpsg_translate(__('Das Template (#1#) fÃŒr ein Produkt (ID:#2#) scheint nicht zu existieren!', 'wpsg'), $template_file, $produkt_id)); return; }
+			
+			// Den Index fÃŒr getTemplateIndex hochzâÂ§hlen
 			wpsg_addSet($GLOBALS['wpsg_produkt_index'], 1);
 			$this->view['product_index'] = $GLOBALS['wpsg_produkt_index'];
-
+						
 			if (!wpsg_isSizedString($this->view['data']['referer'])) $myReferer = $this->getCurrentURL();
 			else $myReferer = $this->view['data']['referer'];
-
-			if (!wpsg_isSizedString($this->view['data']['product_key'])) $this->view['data']['product_key'] = $this->view['data']['id'];
-
+			
+			$this->view['data']['product_key'] = $this->view['data']['id']; 
 			$this->view['data']['id'] = $this->getProduktId($this->view['data']['id']);
-
-			$this->view['oProduct'] = wpsg_product::getInstance($this->view['data']['product_key']);
-			$this->view['oProduct']->appendData($this->view['data']);
-
-			if (wpsg_isSizedString($this->view['data']['product_key'])) $this->view['oProduct']->setProductKey($this->view['data']['product_key']);
+			$this->view['oProduct'] = wpsg_product::getInstance($this->view['data']['id']);
 
 			$html  = '';
-			$html .= '<form class="wpsg_productform" id="wpsg_produktform_'.$GLOBALS['wpsg_produkt_index'].'" method="post" action="'.$myReferer.'">';
- 
-			// do_shortcode, sonst werden die Shortcodes nicht interpretiert wenn das Produkt selbst ÃŒber einen Shortcode eingebunden wird.
-			$html .= do_shortcode($this->render($template_file, false));
-
+			$html .= '<form class="wpsg_productform" id="wpsg_produktform_'.$GLOBALS['wpsg_produkt_index'].'" method="post" action="'.$myReferer.'">';		
+			$html .= $this->render($template_file, false);
 			$html .= '<div style="display:none;">';
-			$html .= '<input type="hidden" name="wpsg[template]" 	value="'.basename($template_file).'" />';
-			$html .= '<input type="hidden" name="myReferer" 		value="'.htmlspecialchars($myReferer).'" />';
-			$html .= '<input type="hidden" name="wpsg[produkt_id]"  value="'.$this->getProduktId($produkt_id).'" />';
-			$html .= '<input type="hidden" name="wpsg[product_key]" value="'.$this->view['data']['product_key'].'" />';
-			$html .= '</div>';
+			$html .= '<input type="hidden" name="wpsg[template]" value="'.basename($template_file).'" />';
+			$html .= '<input type="hidden" name="myReferer" value="'.htmlspecialchars($myReferer).'" />';
+			$html .= '<input type="hidden" name="wpsg[produkt_id]" value="'.$this->getProduktId($produkt_id).'" />';
+			$html .= '</div>';			
 			$html .= '</form>';
-
+			
 			$this->callMods('renderProdukt_afterForm', array(&$this->view['data'], &$html));
 
@@ -1846,52 +1107,20 @@
 			if ($force_locale !== false)
 			{
-
+				
 				if (isset($old_l10n))
 				{
-
+				
 					$l10n['wpsg'] = &$old_l10n;
-
-				}
-
+					
+				}
+ 				
 				$this->force_locale = false;
-
-			}
-
-			$this->titleDisplayed = false;
-
+				
+			}
+			
 			return $html;
-
+			
 		} // public function renderProdukt($produkt_id)
-
-		/**
-		 * Shortcode fÃŒr Warenkorbbutton, um Produkte aus KategorieÃŒbersicht in Warenkorb zu legen (muss in jedem Beitrag eingefÃŒgt werden)
-		 */
-		public function shortcode_basket($atts, $content = '')
-		{
-
-			$product_id = wpsg_getStr($atts['product']);
-			$title = wpsg_getStr($atts['title']);
-			$linktext = wpsg_getStr($atts['linktext']);
-
-			/* Wenn kein Linktext im Beitrag, Linktext aus Template */
-			if (!wpsg_isSizedString($linktext)) $linktext = __('Produkt in den Warenkorb legen', 'wpsg');
-
-			$product_url = $this->getProduktLink($product_id);
-
-			$strReturn = '<a class="wpsg_button wpsg_button_categorie_basket wpsg_addProdukt ';
-
-			/* Varianten=true -> Ã¶ffnet Lightbox mit Variantenauswahl */
-
-			$strReturn .= (($this->callMod('wpsg_mod_productvariants', 'isVariantsProduct', array($product_id)))?'wpsg_variantProduct':'');
-			$strReturn .= '" ';
-			$strReturn .= ' data-product_id="'.wpsg_hspc($product_id).'" ';
-			$strReturn .= ' href="'.wpsg_url($product_url).'" ';
-			$strReturn .= ' title="'.wpsg_hspc($title).'" ';
-			$strReturn .= '>'.wpsg_hspc($linktext).'</a>';
-
-			return $strReturn;
-
-		}
-
+ 		
 		/**
 		 * Verarbeitet den Shortcode wpsg
@@ -1899,368 +1128,172 @@
 		public function shortcode($atts, $content = '')
 		{
-
-			try
-			{
-
-				$this->bShortcode = true;
-
-				if (isset($atts['template']))
-				{
-
-					$template = $atts['template'];
-
-				}
-				else if (isset($atts['produktgruppe']))
-				{
-
-					return $this->callMod('wpsg_mod_productgroups', 'shortcode', array($atts));
-
-				}
-				else
-				{
-
-					$template = false;
-
-				}
-
-				if ($atts['product'] === '-1')
-				{
-
-					$arProductIDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` <= 0 ORDER BY `id` ASC ");
-					$content = '';
-
-					foreach ($arProductIDs as $product_id)
-					{
-
-						if (isset($atts['hide_title']) && $atts['hide_title'] === '1') $this->titleDisplayed = true;
-						else $this->titleDisplayed = false;
-
-						$oProduct = wpsg_product::getInstance($product_id);
-
-						if ($oProduct->canDisplay()) $content .= $this->renderProdukt($product_id, $template);
-
-					}
-
-					return $content;
-
-				}
-				else
-				{
-
-					if (isset($atts['hide_title']) && $atts['hide_title'] === '1') $this->titleDisplayed = true;
-					else $this->titleDisplayed = false;
-
-					return $this->renderProdukt($atts['product'], $template);
-
-				}
-
-				$this->bShortcode = false;
-
-			}
-			catch (Exception $e)
-			{
-
-				return $e->getMessage();
-
-			}
-
+			
+			$this->bShortcode = true;
+			
+			if (!$this->hasActiveLicence() && $this->getDemoDays() <= 0)
+			{
+
+				// Ihre <a title="Informationen ÃŒber das wpShopGermandy Wordpress Shop Plugin System" href="http://wpshopgermany.de">wpShopGermany</a> <a href="http://shop.maennchen1.de/produkte/wpshopgermany-lizenzkey/" title="wpShopGermany Wordpress Shop Plugin System Lizenz erwerben">Lizenz</a> ist abgelaufen.<br />
+				return base64_decode('SWhyZSA8YSB0aXRsZT0iSW5mb3JtYXRpb25lbiDDvGJlciBkYXMgd3BTaG9wR2VybWFuZHkgV29yZHByZXNzIFNob3AgUGx1Z2luIFN5c3RlbSIgaHJlZj0iaHR0cDovL3dwc2hvcGdlcm1hbnkuZGUiPndwU2hvcEdlcm1hbnk8L2E+IDxhIGhyZWY9Imh0dHA6Ly9zaG9wLm1hZW5uY2hlbjEuZGUvcHJvZHVrdGUvd3BzaG9wZ2VybWFueS1saXplbnprZXkvIiB0aXRsZT0id3BTaG9wR2VybWFueSBXb3JkcHJlc3MgU2hvcCBQbHVnaW4gU3lzdGVtIExpemVueiBlcndlcmJlbiI+TGl6ZW56PC9hPiBpc3QgYWJnZWxhdWZlbi48YnIgLz4=');
+			
+			}
+			
+			if (isset($atts['template']))
+			{
+				
+				$template = $atts['template'];
+				return $this->renderProdukt($atts['product'], $template);
+				
+			}
+			else if (isset($atts['produktgruppe']))
+			{
+				
+				return $this->callMod('wpsg_mod_productgroups', 'shortcode', array($atts));
+				
+			}
+			else
+			{
+				
+				$template = false;
+				return $this->renderProdukt($atts['product'], $template);
+				
+			}
+			
+			$this->bShortcode = false;
+			
 		} // public function shortcode($atts, $content = '')
-
+		
 		/**
 		 * Checkt und setzt die Kundenvorgaben in der Session, sollte nichts eingetragen sein
-		 * Nur Land 
-		 */
-		public function checkCustomerPresetCountry() {
-
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['land']) && wpsg_isSizedString($this->get_option('wpsg_defaultland'))) {
-
+		 * Setzt auch die Variablen fÃŒr das Template 
+		 * 
+		 * Hier kann noch nicht nach vorhandensein der Zahlungsarten in this->arShipping geschaut werden!
+		 */
+		public function checkCustomerPreset()
+		{
+			
+			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping']) && wpsg_isSizedString($this->get_option('wpsg_customerpreset_shipping')))
+			{
+				
+				$_SESSION['wpsg']['checkout']['shipping'] = $this->get_option('wpsg_customerpreset_shipping');
+				if (isset($this->view['basket'])) $this->view['basket']['checkout']['shipping'] = $_SESSION['wpsg']['checkout']['shipping'];
+				
+			}
+			
+			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['payment']) && wpsg_isSizedString($this->get_option('wpsg_customerpreset_payment')))
+			{ 
+				
+				$_SESSION['wpsg']['checkout']['payment'] = $this->get_option('wpsg_customerpreset_payment');
+				if (isset($this->view['basket'])) $this->view['basket']['checkout']['payment'] = $_SESSION['wpsg']['checkout']['payment'];
+				
+			}
+						
+			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['land']) && wpsg_isSizedString($this->get_option('wpsg_defaultland'))) 
+			{
+				
 				$_SESSION['wpsg']['checkout']['land'] = $this->get_option('wpsg_defaultland');
-				
-				$this->basket->arCheckout['land'] = $_SESSION['wpsg']['checkout']['land']; 
-				
 				if (isset($this->view['basket'])) $this->view['basket']['checkout']['land'] = $_SESSION['wpsg']['checkout']['land'];
-								
-			}
-			
-		}
-		
-		/**
-		 * Checkt und setzt die Kundenvorgaben in der Session, sollte nichts eingetragen sein
-		 * Setzt auch die Variablen fÃŒr das Template
-		 *
-		 * Hier kann noch nicht nach vorhandensein der Zahlungsarten in this->arShipping geschaut werden!
-		 */
-		public function checkCustomerPreset() {
- 
-			$oCalculation = \wpsg\wpsg_calculation::getSessionCalculation();
-			
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping']) && wpsg_isSizedString($this->get_option('wpsg_customerpreset_shipping')) && sizeof($_SESSION['wpsg']['basket']??[]) > 0) {
-				
-				$land_id = intval($_SESSION['wpsg']['checkout']['land']);
-				$preset = $this->get_option('wpsg_customerpreset_shipping');
-				
-				if ($land_id > 0) {
-					
-					$oCountry = wpsg_country::getInstance($land_id);
-					
-					$preset_vz = $oCountry->__get('shippingpreset');
-					
-					if ($preset_vz !== '' && $preset_vz !== '0') $preset = $preset_vz;
-										
-				}
-
-				if ($preset === '-1') {
-					 
-					$min_shipping_key = null; $min_shipping_cost = null;
-					
-					foreach ($this->arShipping as $shipping_key => $shipping_data) {
-						
-						if (isset($shipping_data['sub'])) {
-							
-							$cost = 0;
-							
-							foreach ($shipping_data['sub'] as $sub_key => $sub_data) {
-							
-								$cost += $oCalculation->calculateCostKey($sub_data['price']);
-								
-							}
-							
-						} else $cost = $oCalculation->calculateCostKey($shipping_data['price']);
-					 
-						if ($cost < $min_shipping_cost || $min_shipping_cost === null) {
-							
-							$min_shipping_cost = $cost;
-							$min_shipping_key = $shipping_key;
-							
-						}
-						
-					}
-					
-					if ($min_shipping_key !== null) {
-						  
-						$this->basket->arCheckout['shipping'] = $min_shipping_key;
-						
-						$_SESSION['wpsg']['checkout']['shipping'] = $min_shipping_key;
-						$oCalculation->update();
-						
-					}  
-					
-				} else if (isset($this->arShipping[$preset])) {
-				
-					$this->basket->arCheckout['shipping'] = $preset;
-					
-					$_SESSION['wpsg']['checkout']['shipping'] = $preset;
-					$oCalculation->update();
-					
-				}
-								 
-			}
-			
-			// GÃŒltigkeit checken			
-			if (!array_key_exists($_SESSION['wpsg']['checkout']['shipping'], $this->arShipping) && sizeof($this->arShipping) > 0) {
-			 
-				$this->basket->arCheckout['shipping'] = array_keys($this->arShipping)[0];;					
-				$_SESSION['wpsg']['checkout']['shipping'] = array_keys($this->arShipping)[0];
-				$oCalculation->update();											
-									
-			}
-			
-			$this->view['basket']['checkout']['shipping'] = $_SESSION['wpsg']['checkout']['shipping'];
-
-			
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['payment']) && (wpsg_isSizedString($this->get_option('wpsg_customerpreset_payment')) || $this->get_option('wpsg_customerpreset_payment') === '0') && sizeof($_SESSION['wpsg']['basket']??[]) > 0) {
- 
-				if ($this->get_option('wpsg_customerpreset_payment') === '-1') {
-					 
-					$min_payment_key = null; $min_payment_cost = null;
-					
-					foreach ($this->arPayment as $paymnet_key => $payment_data) {
-						
-						try {
-							
-							if ($payment_data['sub']) {
-								
-								$cost = 0;
-								
-								foreach ($payment_data['sub'] as $sub_key => $sub_data) {
-								
-									$cost += $oCalculation->calculateCostKey($sub_data['price']);
-									
-								}
-								
-							} else $cost = $oCalculation->calculateCostKey($payment_data['price']);
-
-						} catch (\Exception $e) {
-							
-							$cost = 0;
-							
-						}
-					 
-						if ($cost < $min_payment_cost || $min_payment_cost === null) {
-							
-							$min_payment_cost = $cost;
-							$min_payment_key = $paymnet_key;
-							
-						}
-						
-					}
-					
-					if ($min_payment_key !== null) {
-						
-						$_SESSION['wpsg']['checkout']['payment'] = $min_payment_key;
-						$this->basket->arCheckout['payment'] = $min_payment_key;
-						
-						$oCalculation->update();
-						
-					}
-				
-				} else if ($this->get_option('wpsg_customerpreset_payment') !== '0') {
-				
-					$_SESSION['wpsg']['checkout']['payment'] = $this->get_option('wpsg_customerpreset_payment');
-					$this->basket->arCheckout['payment']     = $this->get_option('wpsg_customerpreset_payment');
-					
-					$oCalculation->update();
-					
-				}
-								 
-			}
-			
-			// GÃŒltigkeit checken
-			if (!array_key_exists($_SESSION['wpsg']['checkout']['payment'], $this->arPayment) && sizeof($this->arPayment) > 0 && $this->get_option('wpsg_customerpreset_payment') !== '0') {
-					
-				$_SESSION['wpsg']['checkout']['payment'] = array_keys($this->arPayment)[0];
-				$this->basket->arCheckout['payment'] = array_keys($this->arPayment)[0];
-				
-				$oCalculation->update();
-										
-			}
-			
-			$this->view['basket']['checkout']['payment'] = $_SESSION['wpsg']['checkout']['payment'];
-			
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['title']) && wpsg_isSizedString($this->get_option('wpsg_customerpreset_title'))) {
-
+				
+			}
+			
+			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['title']) && wpsg_isSizedString($this->get_option('wpsg_customerpreset_title')))
+			{
+				
 				$_SESSION['wpsg']['checkout']['title'] = $this->get_option('wpsg_customerpreset_title');
-				$this->basket->arCheckout['title']	   = $this->get_option('wpsg_customerpreset_title');
-				
 				if (isset($this->view['basket'])) $this->view['basket']['checkout']['title'] = $_SESSION['wpsg']['checkout']['land'];
-
-			}
-
+				
+			}
+			
 		} // public function checkCustomerPreset()
-
+				
 		/**
 		 * Registriert die im Shop verwendeten Widgets
 		 */
-		public function widgets_init() {
-
-			// Sonst kÃ¶nnen die Module keine Widgets registrieren
-			$this->initShopModule();
-			
-			require_once(dirname(__FILE__).'/../lib/wpsg_basket_widget.class.php'); register_widget("wpsg_basket_widget");
-
-			//$this->initShopModule(); in initShop geschoben damit die "init" der Module rechtzeitig geladen wird
-			$this->callMods('widgets_init');
- 
+		public function widget_init()
+		{
+			
+			require_once(dirname(__FILE__).'/../lib/wpsg_basket_widget.class.php');
+			
+			register_widget("wpsg_basket_widget");
+			
 		} // public function widget_init()
-
+				
 		/**
 		 * Gibt das Standardland als wpsg_country Objekt zurÃŒck
 		 * @param $id bool Wenn true dann wird nur die ID zurÃŒckgegeben fÃŒr schnelle Vergleiche
-         * @return wpsg_country|boolean
 		 */
 		public function getDefaultCountry($id = false)
 		{
-
+			
 			$country_id = $this->get_option('wpsg_defaultland');
-
+			
 			// Kein Standardland, hier kann nichts zurÃŒckgegeben werden
 			if ($country_id === false) return false;
-
-			if ($id === false) {
-
+			
+			if ($id === false)
+			{
+			
 				$default_country = wpsg_country::getInstance($country_id);
-
+			 
 				return $default_country;
-
-			} else {
+				
+			}
+			else
+			{
 
 				return $country_id;
-
-			}
-
+			
+			} 
+			
 		} // public function getDefaultCountry()
-
-		/**
-		 * Gibt das aktuelle Lieferland zurÃŒck
-		 *
-		 * @param $getId
-		 *
-		 * @return void
-		 */
-		public function getFrontendShippingCountry($getId = false) {
-			
-			if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land'])) $shipping_country = $_SESSION['wpsg']['checkout']['shipping_land'];
-			else if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land'])) $shipping_country = $_SESSION['wpsg']['checkout']['land'];
-			else $shipping_country = $this->getDefaultCountry(true);
-
-			if ($getId === false) return wpsg_country::getInstance($getId);
-			else return $shipping_country;
-			
-		}
-		
+		 
 		/**
 		 * Gibt das aktuelle Land fÃŒr die Frontendausgabe zurÃŒck
 		 * ist wichtig fÃŒr die Preisberechnung (Mehrwertsteuer)
 		 */
-		public function getFrontendCountry($id = false) {
+		public function getFrontendCountry($id = false)
+		{
 			 
-			if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land'])) {
-
+			if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land']))
+			{
+				
 				$country_id = $_SESSION['wpsg']['checkout']['land'];
-
-			} else {
-
+								
+			}
+			else
+			{
+				
 				return $this->getDefaultCountry($id);
-
-			}
-
-			if ($id === false) {
-
+				
+			}
+			
+			if ($id === false)
+			{
+					
 				$oCountry = wpsg_country::getInstance($country_id);
-				
 				return $oCountry;
-
-			} else {
-
+					
+			}
+			else
+			{
+					
 				return $country_id;
-
-			}
-
+					
+			}
+			 
 		} // public function getFrontendCountry()
-
+		
 		/**
 		 * Gibt den Mehrwertsteuer Wert zurÃŒck,
 		 * der fÃŒr die Berechnung des Produktpreises notwendig ist
 		 */
-		public function getCalcTaxValue($tax_key) {
-
-			if (isset($this->view['oOrder']) && is_object($this->view['oOrder']) && wpsg_isSizedInt($this->view['oOrder']->adress_data['land'])) $country_id = $this->view['oOrder']->adress_data['land'];
-			if (wpsg_isSizedInt($this->country)) $country_id = $this->country;
-			if (wpsg_isSizedInt($country_id))
-				$country = wpsg_country::getInstance($country_id);
-			else 
-				$country = $this->getDefaultCountry();
-			
-			//$country = $this->getDefaultCountry();
-			$tax = $country->getTax($tax_key);
-			if ($tax == 19)
-				$tax = 19;
-			if ($tax == 20)
-				$tax = 20;
+		public function getCalcTaxValue($tax_key)
+		{
+
+			$country = $this->getDefaultCountry();
 			return $country->getTax($tax_key);
-
-			//$this->view['oOrder']->adress_data['land']
+			
 			//$country = $this->getFrontendCountry();
-
+			
 			$noMwSt = false;
 
@@ -2268,498 +1301,390 @@
 			// 2 = keine MwSt. bei USt.IdNr.
 			if ($country->mwst == 1) $noMwSt = true;
-			if ($country->mwst == 2 && wpsg_isSizedString($this->basket->arCheckout['ustidnr'])) $noMwSt = true;
-
+			if ($country->mwst == 2 && wpsg_isSizedString($this->basket->arCheckout['ustidnr'])) $noMwSt = true; 
+ 
 			if ($noMwSt)
 			{
-
+				
 				// Hier die MwSt des Standardlandes fÃŒr Berechnung verwenden
 				$country = $this->getDefaultCountry();
+				return $country->getTax($tax_key);	
+				
+			}			
+			else 
+			{
+
 				return $country->getTax($tax_key);
-
-			}
-			else
-			{
-
-				return $country->getTax($tax_key);
-
-			}
-
+				
+			}
+			 
 		}
-
-        /**
-         * Die Funktion soll ein Verzeichnis vor direkten Browseranfragen schÃŒtzen, in dem es eine .htaccess Datei anlegt
-         * @param $path
-         */
-		public function protectDirectory($path, $arEnableFiles = []) {
-
-            if (!file_exists($path)) { mkdir($path, 0775, true); }
-
-            $htaccess = \trailingslashit($path).'.htaccess';
-            
-            if (!file_exists($htaccess))
-            {
-
-                $handle = fopen($htaccess, "w+");
-                
-                $content = "
-                
-<IfModule mod_authz_core.c>
-    # Apache 2.4
-    Require all denied
-</IfModule>
-<IfModule !mod_authz_core.c>
-    # Apache 2.2
-    Order allow,deny
-    Deny from all
-</IfModule>
-
-# section for Apache 2.2 and 2.4
-IndexIgnore *
- 
-                ";
-                
-                foreach ($arEnableFiles as $f) {
-                    
-                    $content .= "
-
-<Files ".$f.">
-allow from all
-</Files>
-
-";
-                    
-                }
-                
-                fwrite($handle, $content, strlen($content));
-                fclose($handle);
-
-            }
-		    
-        } // public function protectDirectory($path)
-
+		
 		/**
 		 * LÃ€dt die Daten eines Produktes
 		 */
-		public function loadProduktArray($produkt_id, $override = array(), $loadDisabled = false) {
- 
-		    //if (array_key_exists($produkt_id, $this->productCache)) return $this->productCache[$produkt_id];
-
+		public function loadProduktArray($produkt_id, $override = array())
+		{
+		
 			$produkt = $this->cache->loadProduct($produkt_id);
-		
-			// Im Backend muss die loadArray durchlaufen werden, da die Pos Spalte fÃŒr die Sortierung benÃ¶tigt wird
-			if ($loadDisabled === false && wpsg_isSizedInt($produkt['disabled']) && !is_admin()) return array();
-			
-			if (!wpsg_isSizedArray($produkt)) throw new \wpsg\Exception('Produkt (ID:'.$produkt_id.') konnte nicht geladen werden.');
-
+									
 			foreach ($override as $k => $v) $produkt[$k] = $v;
-
+						
 			// Ãbersetzung einbeziehen
-			if ($this->isOtherLang()) {
-
-				$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_code` = '".wpsg_q($this->getCurrentLanguageCode())."'");
-				 
-				if ($produkt_trans['id'] > 0) {
- 
+			if ($this->isOtherLang())
+			{
+				
+				$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_locale` = '".wpsg_q($this->getCurrentLanguage())."'");
+
+				if ($produkt_trans['id'] > 0)
+				{
+					
 					$produkt['name'] = $produkt_trans['name'];
 					$produkt['beschreibung'] = $produkt_trans['beschreibung'];
 					$produkt['detailname'] = $produkt_trans['detailname'];
-					$produkt['shortdesc'] = $produkt_trans['shortdesc'];
-
-				}
-
-			}
-			
-			// Daten aus Order-Produkt nehmen, da die Bestellung im Backend bearbeitbar ist
-			if (isset($produkt['op_mwst_key']))
-			{
-			    
-				$produkt['mwst_key'] = $produkt['op_mwst_key'];
-				$produkt['preis'] = $produkt['price'];
-				$produkt['preis_netto'] = $produkt['price_netto'];
-				$produkt['preis_brutto'] = $produkt['price_brutto'];
-				//$produkt['mwst_value'] = $produkt['op_mwst_value'];
-                
-			}
-
-			$produkt['product_id'] = $this->getProduktID($produkt_id);
-			$produkt['mwst_value'] = $this->getCalcTaxValue($produkt['mwst_key']??'0');
-
-			// Preis umrechnen fÃŒr Standardland
+					 
+				}
+				
+			}
+			
+			$produkt['mwst_value'] = $this->getCalcTaxValue($produkt['mwst_key']); 
+			
+			// Preis umrechnen fÃŒr Standardland			
 			if ($this->get_option('wpsg_preisangaben') == WPSG_NETTO)
 			{
-
-				// Preis im Backend ist in Netto
+				
+				// Preis im Backend ist in Netto				
 				$produkt['preis_netto'] = $produkt['preis'];
 				$produkt['preis_brutto'] = wpsg_calculatePreis($produkt['preis'], WPSG_BRUTTO, $produkt['mwst_value']);
-
-			}
-			else
-			{
-			    
-                $tax_value_default_country = $this->getDefaultCountry()->getTax($produkt['mwst_key']??'0');
-
+								
+			}
+			else 
+			{
+				
 				// Preis im Backend ist in Brutto
-				$produkt['preis_brutto'] = $produkt['preis']??0;
-				$produkt['preis_netto'] = wpsg_calculatePreis($produkt['preis']??0, WPSG_NETTO, $tax_value_default_country);
-
-			}
-
+				$produkt['preis_brutto'] = $produkt['preis'];
+				$produkt['preis_netto'] = wpsg_calculatePreis($produkt['preis'], WPSG_NETTO, $produkt['mwst_value']);
+									 
+			}
+			
 			$produkt['tax_defaultLand'] = $produkt['mwst_value'];
 			$produkt['preis_defaultLand_brutto'] = $produkt['preis_brutto'];
 			$produkt['preis_defaultLand_netto'] = $produkt['preis_netto'];
-
+						
 			// Jetzt habe ich Netto/Brutto Werte im Standardland
 			// Wenn es jetzt ein Leistungsort Produkt ist, dann muss ich die Steuer des Ziellandes bestimmen
-			// 1=euleistungsortregel
 			if (wpsg_isSizedInt($produkt['euleistungsortregel']) && $this->getDefaultCountry(true) != $this->getFrontendCountry(true))
 			{
-
+				
 				$oFrontendCountry = $this->getFrontendCountry();
-
+								
 				$produkt['mwst_value'] = $oFrontendCountry->getTax($produkt['mwst_key']);
 				$produkt['preis_brutto'] = wpsg_calculatePreis($produkt['preis_netto'], WPSG_BRUTTO, $produkt['mwst_value']);
-
-			}
-
+								
+			}
+			
 			if ($this->getFrontendTaxview() == WPSG_BRUTTO) $produkt['preis'] = $produkt['preis_brutto'];
 			else $produkt['preis'] = $produkt['preis_netto'];
-
+			
 			$produkt['min_preis'] = wpsg_tf($produkt['preis']);
 			$produkt['max_preis'] = wpsg_tf($produkt['preis']);
-
+			
 			if (get_option('wpsg_options_nl2br_out') == '1')
 			{
 
 				$produkt['beschreibung'] = nl2br($produkt['beschreibung']);
-
-			}
-
+				
+			}
+			
 			if (get_option('wpsg_options_no_rte_apply_filter') != '1')
 			{
-
+			
 				// Filter auf Beschreibung anwenden (RTE)
-				// Den wpsgContentFilter deaktivieren um rekursion zu vermeiden
+				// Den wpsgContentFilter deaktivieren um rekursion zu vermeiden									
 				remove_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
 				$produkt['beschreibung'] = apply_filters('the_content', $produkt['beschreibung']);
-				add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
-
-			}
-
+				add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));	
+				
+			}  
+						
 			global $wp_rewrite;
-
+			
 			if (is_object($wp_rewrite))
 			{
-
-				$produkt['url'] = $this->getProduktLink($produkt['id']);
-
-			}
-
+			
+				// Produkturl ist der zugeordnete Wordpress Artikel sollte das Produktartikel Modul es nicht spÃ€ter ÃŒberschreiben
+				if ($produkt['partikel'] > 0)
+				{
+					
+					$produkt['url'] = get_permalink($produkt['partikel']);
+					
+				}
+				else
+				{
+					
+					// Damit ich immer eine Produkturl habe, habe ich hier eine Produktanzeige ÃŒber den Warenkorb realisiert
+					$basket_url = $this->getURL(wpsg_ShopController::URL_BASKET);
+					
+					if (strpos($basket_url, '?') === false)
+					{
+						
+						$produkt['url'] = $basket_url.'?wpsg_action=showProdukt&produkt_id='.$produkt['id'];
+						
+					}
+					else
+					{
+						
+						$produkt['url'] = $basket_url.'&wpsg_action=showProdukt&produkt_id='.$produkt['id'];	
+						
+					}
+				
+				}
+				
+			}
+			
 			if ($this->hasMod('wpsg_mod_weight'))
 			{
-
-				$produkt['min_weight'] = wpsg_tf($produkt['weight']??0);
-				$produkt['max_weight'] = wpsg_tf($produkt['weight']??0);
-
-			}
-
+				
+				$produkt['min_weight'] = wpsg_tf($produkt['weight']);
+				$produkt['max_weight'] = wpsg_tf($produkt['weight']);
+				
+			}
+			
+			// Wenn es ein Variantenprodukt ist, dann setz ich einen standard VariantenschlÃŒssel			
+			if ($this->hasMod('wpsg_mod_varianten'))
+			{
+				
+				$produkt['id'] = $this->callMod('wpsg_mod_varianten', 'getDefaultVariKey', array($produkt['id']));
+				
+			}
+			
 			// Artikelnummer
 			$produkt['anr'] = $this->getProductAnr($produkt['id']);
 			
-			// $_REQUEST  $_SESSION $GLOBALS
-			if ($this->get_option('wpsg_afterinsert') == '3')
-			{
-				
-				if (isset($_REQUEST['wpsg']['produkt_id']) && ($_REQUEST['wpsg']['produkt_id'] == $produkt['product_id'])) { $produkt['product_id'] = $_REQUEST['wpsg']['produkt_id']; }
-                if (isset($_REQUEST['wpsg']['product_key']) && $_REQUEST['wpsg']['produkt_id'] == $produkt['product_id']) { $produkt['product_key'] = $_REQUEST['wpsg']['product_key']; }
-			    
-			}
-			
-			if (isset($_REQUEST['set_product_key']) && preg_match('/^pv_'.preg_quote($produkt_id).'\|/', $_REQUEST['set_product_key'])) {
-				
-				// ?set_product_key=pv_{product_id}|{variant_id}:{variation_id}
-				$produkt['product_key'] = $_REQUEST['set_product_key'];
-				$produkt['produkt_id'] = $this->getProduktID($produkt['product_key']);
-				
-			}
-			
 			$this->callMods('loadProduktArray', array(&$produkt));
-
+			
 			if ($produkt['preis'] < 0) $produkt['preis'] = 0;
 			if ($produkt['preis_brutto'] < 0) $produkt['preis_brutto'] = 0;
 			if ($produkt['preis_netto'] < 0) $produkt['preis_netto'] = 0;
-
-            $this->productCache[$produkt_id] = $produkt;
-
+		 		
 			return $produkt;
-
+			
 		} // public function loadProduktArray($produkt_id)
-
+		
 		/**
 		 * Gibt den Index aus einer Globalen zurÃŒck um sicherzustellen das JS Variablen nicht ÃŒberschrieben werden
 		 * wenn mehrere Produkte auf einer Seite sind. Wird von renderProdukt hochgezâÂ§hlt
 		 */
-		public function getTemplateIndex() {
-
-			return intval($GLOBALS['wpsg_produkt_index']);
-
+		public function getTemplateIndex()
+		{
+			
+			return $GLOBALS['wpsg_produkt_index'];
+			
 		} // public function getTemplateIndex()
-
+		  				
 		/**
 		 * LÃ€dt die verfÃŒgbaren Produkttemplates
 		 */
-		public function loadProduktTemplates($key = false, $fullpath = false, $view_path = false) {
- 
+		public function loadProduktTemplates($key = false)
+		{
+			
 			$arTemplates = array();
-
+			
 			$handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES);
 			if ($handle) { while ($file = readdir($handle))
 			{
-
 				if (is_file(WPSG_PATH_PRODUKTTEMPLATES.$file) && preg_match('/(.*).phtml$/', $file))
 				{
-
-				    if ($fullpath && $view_path) $file = WPSG_PATH_PRODUKTTEMPLATES.$file;
-                    else if ($fullpath) $file = WPSG_PATH_PRODUKTTEMPLATES.$file;
-
-					if ($key) $arTemplates[$file] = $file;
-					else $arTemplates[] = $file;
-
-				}
-
-			} }
-			@closedir($handle);
-
-			$handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_UV);
-			if ($handle) { while ($file = readdir($handle))
-			{
-
-				if (is_file(WPSG_PATH_PRODUKTTEMPLATES_UV.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
-				{
-
-                    if ($fullpath && $view_path) $file = WPSG_PATH_PRODUKTTEMPLATES.$file;
-                    else if ($fullpath) $file = WPSG_PATH_PRODUKTTEMPLATES_UV.$file;
-
-					if ($key) $arTemplates[$file] = $file;
-					else $arTemplates[] = $file;
-
-				}
-			} @closedir($handle); }
-
-			$handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_UV_OLD);
-			if ($handle) { while ($file = readdir($handle))
-			{
-				if (is_file(WPSG_PATH_PRODUKTTEMPLATES_UV_OLD.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
-				{
-
-                    if ($fullpath && $view_path) $file = WPSG_PATH_PRODUKTTEMPLATES.$file;
-                    else if ($fullpath) $file = WPSG_PATH_PRODUKTTEMPLATES_UV_OLD.$file;
-
-					if ($key) $arTemplates[$file] = $file;
-					else $arTemplates[] = $file;
-
-				}
-
-			} @closedir($handle); }
-
-            $handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_THEME);
-            if ($handle) { while ($file = readdir($handle))
-            {
-
-                if (is_file(WPSG_PATH_PRODUKTTEMPLATES_THEME.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
-                {
-
-                    if ($fullpath && $view_path) $file = WPSG_PATH_PRODUKTTEMPLATES.$file;
-                    else if ($fullpath) $file = WPSG_PATH_PRODUKTTEMPLATES_THEME.$file;
-
-                    if ($key) $arTemplates[$file] = $file;
-                    else $arTemplates[] = $file;
-
-                }
-
-            } @closedir($handle); }
-
-            $handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_THEME_CHILD);
-            if ($handle) { while ($file = readdir($handle))
-            {
-
-                if (is_file(WPSG_PATH_PRODUKTTEMPLATES_THEME_CHILD.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
-                {
-
-                    if ($fullpath && $view_path) $file = WPSG_PATH_PRODUKTTEMPLATES.$file;
-                    else if ($fullpath) $file = WPSG_PATH_PRODUKTTEMPLATES_THEME_CHILD.$file;
-
-                    if ($key) $arTemplates[$file] = $file;
-                    else $arTemplates[] = $file;
-
-                }
-
-            } @closedir($handle); }
-
-            $this->callMods('loadProduktTemplates', [&$arTemplates, $key, $fullpath, $view_path]);
-            
-			return $arTemplates;
-
-		} // public function loadProduktTemplates()
-
-		/**
-		 * Gibt die Produkt Artikelnummer fÃŒr ein Produkt anhand des ProduktschlÃŒssels zurÃŒck
-		 */
-		public function getProductAnr($product_key)
-		{
-
-			$anr = false;
-
-			$return = $this->callMods('getProductAnr', array($product_key, &$anr));
-
-			if ($anr === false) {
-
-				// Kein Modul hat die Erstellung der Produktartikelnummer ÃŒbernommen
-				$product_data = $this->cache->loadProduct($this->getProduktID($product_key));
-
-				return $product_data['anr'];
-
-			} else {
-
-				return $anr;
-
-			}
-
-		} // public function getProductAnr($product_key)
-
-		/**
-		 * Gibt den Link zu einem Produkt zurÃŒck wenn mÃ¶glich
-		 * Siehe auch: wpsg_product->getProductURL
-		 */
-		public function getProduktLink($basket_data) {
-
-			if (wpsg_isSizedInt($basket_data)) $product_id = $basket_data;
-			else if (isset($basket_data['product_id'])) $product_id = $basket_data['product_id'];
-			else if (wpsg_isSizedString($basket_data)) $product_id = $this->getProduktID($basket_data);
-			else if (!isset($basket_data['id'])) return '';
-			else $product_id = $this->getProduktID($basket_data['id']);
-
-			$url = false;
-			$this->callMods('getProduktlink', array($product_id, &$url));
-
-			if ($url === false)
-			{
-
-				$produkt_data = $this->cache->loadProduct($product_id);
-
-				if ($produkt_data['partikel'] > 0)
-				{
-
-					return get_permalink($produkt_data['partikel']);
-
-				}
-				else if (isset($basket_data['referer']) && $basket_data['referer'] != '')
-				{
-
-					return $basket_data['referer'];
-
-				}
-				else
-				{
-
-
-					//wpsg_debug("=".apply_filters( 'wpml_current_language', NULL ));
-					//do_action('wpml_switch_language', string $language_code )
-
-					// FÃŒr das Bakend der Produktverwaltung, dass die Links auf die entsprechende Sprache gestellt werden
-					if (function_exists('icl_object_id'))
+					if ($key)
 					{
-
-						if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-						{
-
-							$lang_reset = apply_filters('wpml_current_language', null);
-							do_action('wpml_switch_language', $_REQUEST['wpsg_lang']);
-
-						}
-						else
-						{
-
-							$lang_reset = apply_filters('wpml_current_language', null);
-							do_action('wpml_switch_language', $this->getDefaultLanguageCode());
-
-						}
-
-					}
-
-					if ($this->get_option('wpsg_page_product') > 0)
-						$product_url = $this->getURL(wpsg_ShopController::URL_PRODUCTDETAIL);
-					else
-						$product_url = $this->getURL(wpsg_ShopController::URL_BASKET);
-
-					if (function_exists('icl_object_id') && isset($lang_reset))
-					{
-
-						do_action('wpml_switch_language', $lang_reset);
-
-					}
-
-					if (strpos($product_url, "?") > 0)
-					{
-						$product_url .= "&wpsg_action=showProdukt&produkt_id=".$product_id;
+						$arTemplates[$file] = $file;
 					}
 					else
 					{
-						$product_url .= "?wpsg_action=showProdukt&produkt_id=".$product_id;
+						$arTemplates[] = $file;
 					}
-
-					return $product_url;
-
-				}
-
+				}
+			} }
+			@closedir($handle);
+			
+			$handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_UV);
+			if ($handle) { while ($file = readdir($handle))
+			{
+				if (is_file(WPSG_PATH_PRODUKTTEMPLATES_UV.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
+				{
+					if ($key)
+					{
+						$arTemplates[$file] = $file;
+					}
+					else
+					{
+						$arTemplates[] = $file;
+					}
+				}
+			} }
+			@closedir($handle);
+			
+			$handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_UV_OLD);
+			if ($handle) { while ($file = readdir($handle))
+			{
+				if (is_file(WPSG_PATH_PRODUKTTEMPLATES_UV_OLD.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
+				{
+					if ($key)
+					{
+						$arTemplates[$file] = $file;
+					}
+					else
+					{
+						$arTemplates[] = $file;
+					}
+				}
+			} }
+			@closedir($handle);
+			 
+			$handle = @opendir(WPSG_PATH_PRODUKTTEMPLATES_TV);
+			if ($handle) { while ($file = readdir($handle))
+			{
+				if (is_file(WPSG_PATH_PRODUKTTEMPLATES_TV.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
+				{
+					if ($key)
+					{
+						$arTemplates[$file] = $file;
+					}
+					else
+					{
+						$arTemplates[] = $file;
+					}
+				}
+			} }
+			@closedir($handle);
+			
+			return $arTemplates;
+			
+		} // public function loadProduktTemplates()
+		
+		/**
+		 * Gibt die Produkt Artikelnummer fÃŒr ein Produkt anhand des ProduktschlÃŒssels zurÃŒck
+		 */
+		public function getProductAnr($product_key)
+		{
+			
+			$anr = false;
+			
+			$return = $this->callMods('getProductAnr', array($product_key, &$anr));
+			
+			if ($anr === false)
+			{
+
+				// Kein Modul hat die Erstellung der Produktartikelnummer ÃŒbernommen
+				$product_data = $this->cache->loadProduct( $this->getProduktID($product_key));
+				
+				return $product_data['anr'];
+				
+			}			
+			else 
+			{
+
+				return $anr;
+				
+			}
+			
+		} // public function getProductAnr($product_key)
+		
+		/**
+		 * Gibt den Link zu einem Produkt zurÃŒck wenn mÃ¶glich
+		 * Siehe auch: wpsg_product->getProductURL
+		 */
+		public function getProduktLink($basket_data)
+		{
+						
+			if (wpsg_isSizedInt($basket_data)) $produkt_id = $basket_data;
+			else if (isset($basket_data['product_id'])) $produkt_id = $basket_data['product_id'];
+			else $produkt_id = $this->getProduktID($basket_data['id']);
+			
+			$url = false;
+			$this->callMods('getProduktlink', array($produkt_id, &$url));
+			
+			if ($url === false)
+			{
+								
+				$produkt_data = $this->cache->loadProduct($produkt_id);
+				
+				if ($produkt_data['partikel'] > 0)
+				{					
+					return get_permalink($produkt_data['partikel']);
+				}
+				else if (isset($basket_data['referer']) && $basket_data['referer'] != '')
+				{
+					return $basket_data['referer'];
+				}
+				else
+				{
+					
+					$basket_url = $this->getURL(wpsg_ShopController::URL_BASKET);
+					
+					if (strpos($basket_url, "?") > 0)
+					{
+						$basket_url .= "&wpsg_action=showProdukt&produkt_id=".$produkt_id;
+					}
+					else
+					{
+						$basket_url .= "?wpsg_action=showProdukt&produkt_id=".$produkt_id;
+					}
+					
+					return $basket_url;
+					
+				}
+				
 			}
 			else
 			{
-
+				
 				return $url;
-
-			}
-
+				
+			}
+			
 		} // public function getProduktLink($produkt_id)
-
+		
 		/**
 		 * Gibt die ID des Produkts zurÃŒck
 		 * Bei Varianten: vp_8/0_0
 		 */
-		public function getProduktID($produkt_key) {
- 
+		public function getProduktID($produkt_key)
+		{
+						
 			if (is_numeric($produkt_key)) return $produkt_key;
-			else if (preg_match('/pv_(.*)/', $produkt_key)) {
-
-				return preg_replace('/(pv_)|(\|(.*))/', '', $produkt_key);
-
-			} else if (preg_match('/vp_(.*)/', $produkt_key)) {
-
+			else if (preg_match('/vp_(.*)/', $produkt_key)) 
+			{
 				return preg_replace('/(vp_)|(\/(.*))/', '', $produkt_key);
-
-			} else if (preg_match('/abo_\d+_\d+/', $produkt_key)) {
-
-				$arData = explode('_', $produkt_key);
-				
-				$oOrderProduct = wpsg_order_product::getInstance(intval($arData[2]));
-
-				return $oOrderProduct->getProductId();
-
-			} else {
- 
-				throw new \wpsg\Exception(_('Produkt ID konnte nicht gebildet werden: ').$produkt_key, \wpsg\Exception::TYP_UNEXPECTED);
-
+			}
+			else if (preg_match('/abo_\d+_\d+/', $produkt_key))
+			{
+				
+				$arData = explode('_', $produkt_key);				
+				return $this->getProduktID($arData[2]);				
+				
+			}
+			else
+			{
+				
+				// Sollte nicht auftreten. Da es mit dem Update auf 3.1.2 Probleme gab, hab ich hier eine Debug Meldung eingebaut
+				wpsg_debug("Systemfehler! Fehlercode: 100 (Parameter: ".$produkt_key.")");				
+				
+				wpsg_debug($_SESSION);
+				echo '<pre>';debug_print_backtrace();echo '</pre>';
+				die();
+				
 				return 0;
-
-			}
-
+				
+			}
+			
 		} // public function getProduktID($produkt_key)
-
+		
 		/**
 		 * Gibt alle Produkte des Shops zurÃŒck und beachtet die Ãbersetzung
 		 * Kombination aus ID/Name fÃŒr Selectboxen
 		 */
-		public function getAllProductsForSelect($onlyInStock = false)
-		{
-
+		public function getAllProductsForSelect()
+		{
+			 
 			$arProducts = $this->db->fetchAssocField("
 				SELECT
@@ -2769,55 +1694,30 @@
 				WHERE
 					P.`deleted` != '1' AND
-					P.`lang_parent` = '0'
+					P.`lang_parent` = '0'		
 			", "id", "name");
-
+			
 			if ($this->isOtherLang())
 			{
-
+												
 				foreach ($arProducts as $product_id => $product_name)
 				{
-
-					$product_trans_name = $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_id)."' AND `lang_code` = '".wpsg_q($this->getCurrentLanguageCode())."'");
-
+					
+					$product_trans_name = $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_id)."' AND `lang_locale` = '".wpsg_q($this->getCurrentLanguage())."'");
+					
 					if (wpsg_isSizedString($product_trans_name))
 					{
-
+						
 						$arProducts[$product_id] = $product_trans_name;
-
+						
 					}
-
-				}
-
-			}
-
-			if ($onlyInStock && $this->hasMod('wpsg_mod_stock')) {
-
-				foreach (array_keys($arProducts) as $pid) {
-
-					try {
-
-						$oProd = wpsg_product::getInstance($pid);
-						$stock = $this->callMod('wpsg_mod_stock', 'getBestand', [$pid]);
-
-						if (intval($stock) <= 0 || !$oProd->canDisplay()) {
-							unset($arProducts[$pid]);
-						}
-
-					} catch (\Exception $e) {
-						unset($arProducts[$pid]);
-					}
-
-				}
-
-			}
-
-			if (is_array($arProducts)) { asort($arProducts, SORT_NATURAL | SORT_FLAG_CASE); }
-
-
-
+					
+				}
+				
+			}
+			
 			return $arProducts;
-
+			
 		} // public function getAllProductsForSelect()
-
+		
 		/**
 		 * Setzt den Status einer Bestellung
@@ -2825,92 +1725,98 @@
 		 * @param int $status_id ID des Status
 		 * @param bool $inform Kunde per Mail informieren
-         * @param bool $bInvoice Rechnung anhÃ€ngen, wenn mÃ¶glich
-		 */
-		public function setOrderStatus($order_id, $status_id, $inform, $bInvoice = false, $set_ext_payed = null)
-		{
-		    
+		 */
+		public function setOrderStatus($order_id, $status_id, $inform)
+		{
+			
+			// Muss vor der Mailsache aufgerufen werden da sonst die Felder der Bestellung nicht gesetzt sind (Paketverfolgung)
+			// Die Bestellung darf auch noch nicht geladen sein, sonst wird das Objekt aus dem Cache genommen
+			$this->callMods('setOrderStatus', array($order_id, $status_id, $inform));
+			
 			$this->cache->clearOrderCache($order_id);
 			$this->view['order'] = $this->cache->loadOrder($order_id);
- 
-			$this->view['state_new_id'] = $status_id;
-			
-            // Keine Ãnderung, dann abbrechen
-            if ($this->view['order']['status'] == $status_id) return false;
-
-			// Muss vor der Mailsache aufgerufen werden da sonst die Felder der Bestellung nicht gesetzt sind (Paketverfolgung)
-            // Die Bestellung darf auch noch nicht geladen sein, sonst wird das Objekt aus dem Cache genommen
-            $this->callMods('setOrderStatus', array($order_id, $status_id, $inform), true);
-            
-			if (trim($this->view['order']['language']) != '') {
-
+						
+			if (trim($this->view['order']['language']) != '')
+			{
+				
 				// Die Bestellung wurde in einer anderen Sprache durchgefÃŒhrt, hier wechsel ich auf die wÃ€hrend der Bestellung gesetzte Sprach
 				$this->setTempLocale($this->view['order']['language']);
-
-			}
-			
-			// Bestellung wechselt auf Zahlungakzeptiert
-			if ($status_id == 100) {
-
+					
+			} 
+			
+			// Keine Ãnderung, dann abbrechen
+			if ($this->view['order']['status'] == $status_id) return false;
+			
+			if ($status_id == 100)
+			{
+				
+				// Bestellung wechselt auf Zahlungakzeptiert
+				
 				// URL Benachrichtigung bei Zahlung ?
 				$arProdukts = $this->db->fetchAssoc("
 					SELECT
-						P.`id`, OP.`menge`, OP.`mod_vp_varkey`, P.`posturl`, P.`posturl_bezahlung`, OP.`product_index`, OP.`productkey`
+						P.`id`, OP.`menge`, OP.`mod_vp_varkey`, P.`posturl`, P.`posturl_bezahlung`, OP.`product_index`
 					FROM
-						`".WPSG_TBL_ORDERPRODUCT."` AS OP
+						`".WPSG_TBL_ORDERPRODUCT."` AS OP 
 							LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = OP.`p_id`)
 					WHERE
-						OP.`o_id` = '".wpsg_q($order_id)."'
+						OP.`o_id` = '".wpsg_q($order_id)."' 	
 				");
-
-				foreach ($arProdukts as $p) {
-
-					if ($p['posturl'] != '' && $p['posturl_bezahlung'] == '1') {
-
-						if ($p['productkey'] != '') $produkt_id = $p['productkey'];
+				
+				foreach ($arProdukts as $p)
+				{
+					
+					if ($p['posturl'] != '' && $p['posturl_bezahlung'] == '1')
+					{
+						
+						if ($p['mod_vp_varkey'] != '') $produkt_id = $p['mod_vp_varkey'];
 						else $produkt_id = $p['id'];
-
+						
 						$this->notifyURL($p['posturl'], $produkt_id, $p['menge'], $order_id, 1, false, array(
 							'product_index' => $p['product_index']
 						));
-
+						
 					}
-
-				}
-
+					
+				}
+				
 				// Datum Zahlungseingang setzen
 				$arrUpdate = array(
 					'payed_date' => date('Y-m-d')
 				);
-
-				// Wechselt eine Bestellung auf "Zahlung akzeptiert" setze ich "Externe ZahlungseingÃ€nge ignorieren" auf "1" damit externe Zahlungsmeldungen nicht zum Problem fÃŒhren
-				$arrUpdate['ext_payed'] = 1;
-				
 				$this->db->updateQuery(WPSG_TBL_ORDER, $arrUpdate, "`id` = '".$order_id."'");
-
-			}
-
+				
+			}
+			
 			$status_alt = __($this->arStatus[$this->view['order']['status']], 'wpsg');
 			$status_neu = __($this->arStatus[$status_id], 'wpsg');
-
-			if ($inform) {
-
-				$this->view['kunde'] = $this->cache->loadKunden($this->view['order']['k_id']);
-
+						
+			if ($inform)
+			{
+							
+				$this->view['kunde'] = $this->db->fetchRow("
+					SELECT
+						K.*
+					FROM
+						`".WPSG_TBL_KU."` AS K
+					WHERE
+						K.`id` = '".wpsg_q($this->view['order']['k_id'])."'
+				");
+				
 				$this->view['status_alt'] = $this->arStatus[$this->view['order']['status']];
 				$this->view['status_neu'] = $this->arStatus[$status_id];
-
+				
 				if ($this->get_option('wpsg_htmlmail') === '1')
 				{
-
+						
 					$mail_html = $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/status.phtml', false);
-
+				
 				}
 				else
 				{
-
+						
 					$mail_html = false;
-
-				}
-
+				
+				}
+				
 				$mail_text = $this->render(WPSG_PATH_VIEW.'/mailtemplates/status.phtml', false);
 
@@ -2922,26 +1828,11 @@
 					"mailtext" => $mail_text
 				));
-
-				$arAttachment = [];
-
-				if ($bInvoice && $this->hasMod('wpsg_mod_rechnungen')) {
-
-                    $arInvoice = \wpsg\wpsg_invoice::findByOrderId(intval($order_id));
-
-                    foreach ($arInvoice as $oInvoice) {
-
-                        $arAttachment[] = $oInvoice->getFilePath();
-
-                    }
-
-                }
-
-                $this->callMods('setOrderStatusMail', [&$mail_text, &$mail_html, &$arAttachment, &$order_id, &$status_id]);
-
-				$this->sendMail($mail_text, $this->view['kunde']['email'], 'status', $arAttachment, $order_id, false, $mail_html);
-
-			}
-			else {
-
+				
+				$this->sendMail($mail_text, $this->view['kunde']['email'], 'status', array(), $order_id, false, $mail_html);
+				
+			}
+			else
+			{
+								
 				// Ins Protokoll eintragen
 				$this->db->ImportQuery(WPSG_TBL_OL, array(
@@ -2951,64 +1842,40 @@
 					'mailtext' => __('Kunde wurde nicht informiert', 'wpsg')
 				));
-
-			}
-
-// $arInvoice = \wpsg\wpsg_invoice::findByOrderId(intval($order_id));
-// wpsg_debug(intval($order_id));
-// foreach ($arInvoice as $oInvoice) {
-// 	$arAttachment[] = $oInvoice->getFilePath();
-// }	
-// wpsg_debug($arAttachment);
-// die();
-
+				
+			}
+			
 			$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
 				'status' => wpsg_q($status_id)
 			), "`id` = '".wpsg_q($order_id)."'");
-
+			
 			$this->restoreTempLocale();
 			
-			$this->callMods('setOrderStatus_after', array($order_id, $status_id, $inform));
-			
 			return true;
-
+			
 		} // public function setOrderStatus($order_id, $status_id, $inform)
-
-        public function getOrderSecret($order_id) {
-
-            $secret = $this->db->fetchOne("SELECT `secret` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($order_id)."' ");
-
-            if (!wpsg_isSizedString($secret)) {
-
-                $secret = wpsg_genCode(128);
-                $this->db->UpdateQuery(WPSG_TBL_ORDER, ['secret' => wpsg_q($secret)], " `id` = '".wpsg_q($order_id)."' ");
-
-            }
-
-            return $secret;
-
-        }
-
+				 		 
 		/**
 		 * Gibt den Link zur Seite nach der Bestellung zurâÂºck
 		 */
-		public function getDoneURL($order_id, $mod = false, $action = false) {
-
-			$basket_url = $this->getURL(wpsg_ShopController::URL_BASKET, $mod, $action);
-
-            $secret = $this->getOrderSecret($order_id);
-			$code = md5($secret.$order_id.$secret);
-			
-			if (strpos($basket_url, '?') === false) {
-
-				return $basket_url.'?order_id='.$order_id.'&wpsg_done='.rawurlencode($code);
-
-			} else {
-
-				return $basket_url.'&order_id='.$order_id.'&wpsg_done='.rawurlencode($code);
-
-			}
-
+		public function getDoneURL($order_id)
+		{
+
+			$basket_url = $this->getURL(wpsg_ShopController::URL_BASKET);
+			
+			if (strpos($basket_url, '?') === false)
+			{
+				
+				return $basket_url.'?order_id='.$order_id.'&wpsg_done='.preg_replace('/(\+)|(\=)/', 'A', base64_encode(md5('wpShopGermany'.$order_id, $this->get_option("wpsg_salt"))));
+				
+			}
+			else
+			{
+				
+				return $basket_url.'&order_id='.$order_id.'&wpsg_done='.preg_replace('/(\+)|(\=)/', 'A', base64_encode(md5('wpShopGermany'.$order_id, $this->get_option("wpsg_salt"))));	
+				
+			}
+			
 		} // public function getDoneURL($order_id)
-
+		
 		/**
 		 * Gibt die URL zum lÃ¶schen eines Produktes zurâÂºck
@@ -3016,22 +1883,22 @@
 		public function getRemoveLinkURL($produkt_key)
 		{
-
+			
 			$basket_url = $this->getURL(wpsg_ShopController::URL_BASKET);
-
+			
 			if (strpos($basket_url, '?') === false)
 			{
-
+				
 				return $basket_url.'?wpsg_action=remove&wpsg_produkt='.$produkt_key;
-
+				
 			}
 			else
 			{
-
+				
 				return $basket_url.'&wpsg_action=remove&wpsg_produkt='.$produkt_key;
-
-			}
-
+				
+			}
+			
 		} // public function getRemoveLinkURL($produkt_key)
-
+		
 		/**
 		 * PrÃŒft ob das Modul aktiv ist
@@ -3039,19 +1906,9 @@
 		public function hasMod($mod_name)
 		{
-
+		 			
 			return array_key_exists($mod_name, $this->arModule);
-
+			
 		} // public function hasMod($mod_name)
 		
-		/*
-		 * PrÃŒft ob eine Moduldatei vorhanden ist
-		 */
-		public function hasModInstalled($mod_key)
-		{
-			
-			return array_key_exists($mod_key, $this->arAllModule);
-			
-		}
-
 		/**
 		 * PrÃŒft ob ein Modul eine Funktion implementiert
@@ -3059,11 +1916,11 @@
 		public function hasModulFunction($mod_name, $function_name)
 		{
-
+			
 			if (!$this->hasMod($mod_name)) return false;
-
+			
 			return method_exists($this->arModule[$mod_name], $function_name);
-
+						
 		} // public function hasModulFunction($mod, $function)
-
+		
 		/**
 		 * LÃ€dt die Module
@@ -3071,344 +1928,349 @@
 		public function loadModule($all = false)
 		{
-
+		
 			$this->arModule = array();
 			$this->arAllModule = array();
-
-			$mod_dir = opendir(WPSG_PATH_MOD);
-
-			$global = false;
-			if ($this->isMultiBlog() && $this->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
-
-			while ($file = readdir($mod_dir)) {
-
-				if (!is_dir(WPSG_PATH_MOD."/".$file) && $file != "." && $file != ".." && preg_match("/(.*)\.class\.php/i", $file) && $file != "wpsg_mod_basic.class.php") {
-
-					if (file_exists(WPSG_PATH_USERMOD.$file)) require_once(WPSG_PATH_USERMOD.$file);
-					else require_once(WPSG_PATH_MOD.$file);
-
-					$class_name = preg_replace("/\.class\.php/", "", $file);
-
-					$mod = new $class_name();
-
-					if ($this->get_option($class_name, $global) > 0)
+			
+			if (file_exists(WPSG_PATH_MOD.'wpsg_mod_core.class.php'))
+			{
+				
+				require_once WPSG_PATH_MOD.'wpsg_mod_core.class.php';
+				
+				$mod = new wpsg_mod_core();
+				
+				return $mod->loadModule($all);
+				
+			}
+			else 
+			{
+				 
+				$mod_dir = opendir(WPSG_PATH_MOD);
+					
+				$global = false;
+				if ($this->isMultiBlog() && $this->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
+					
+				while ($file = readdir($mod_dir))
+				{
+				
+					if (!is_dir(WPSG_PATH_MOD."/".$file) && $file != "." && $file != ".." && preg_match("/(.*)\.class\.php/i", $file) && $file != "wpsg_mod_basic.class.php")
 					{
-
-					    if (property_exists($mod, 'version') && (property_exists($mod, 'free') && $mod->free !== true)) {
-
-                            $wpsg_update_data = wpsg_get_update_data();
-
-                            if ($this->bLicence && (@$wpsg_update_data['modulinfo'][get_class($mod)]['active'] == true || @$wpsg_update_data['modulinfo'][get_class($mod)]['demo_active'] == true))
-                            {
-
-                                $this->arModule[$class_name] = $mod;
-
-                            }
-                            
-                        }
-                        else
-                        {
-                            
-					        $this->arModule[$class_name] = $mod;
-                            
-                        }
-
-					}
-
-					if ($all)
-					{
-
-						$this->arAllModule[$class_name] = $mod;
-
-					}
-
-				}
-
-				$theme_mod_dir = get_template_directory().'/mods/';
-				
-				if (file_exists($theme_mod_dir))
-				{
-				
-					$theme_mod_dir_h = opendir($theme_mod_dir);
-					
-					while ($file = readdir($theme_mod_dir_h))
-					{
-						
-						if (!is_dir($theme_mod_dir.$file) && $file != "." && $file != ".." && preg_match("/(.*)\.class\.php/i", $file) && $file != "wpsg_mod_basic.class.php") {
-							
-							require_once($theme_mod_dir.$file);
-		
-							$class_name = preg_replace("/\.class\.php/", "", $file);
-		
-							$mod = new $class_name();
-		
+							
+						if (file_exists(WPSG_PATH_USERMOD.$file)) require_once(WPSG_PATH_USERMOD.$file);
+						else require_once(WPSG_PATH_MOD.$file);
+							
+						$class_name = preg_replace("/\.class\.php/", "", $file);
+							
+						$mod = new $class_name();
+							
+						// Demo oder Modul fÃŒr Lizenz aktiv
+						if (!isset($mod->version) && 1 >= $mod->lizenz)
+						{
+				
 							if ($this->get_option($class_name, $global) > 0)
 							{
-
-                                if ($this->bLicence || !property_exists($mod, 'version') || (property_exists($mod, 'free') && $mod->free === true)) {
-                                	
-                                	$this->arModule[$class_name] = $mod;
-                                	
-								}
-		
+				
+								$this->arModule[$class_name] = $mod;
+				
 							}
-		
+							
 							if ($all)
 							{
-		
-							    $this->arAllModule[$class_name] = $mod;
-		
+							
+								$this->arAllModule[$class_name] = $mod;
+							
 							}
+				
+						}
+					
+					}
+				
+				}
+					
+				uasort($this->arModule, array($this, "cmp_mods"));
+					
+				if ($all) uasort($this->arAllModule, array($this, "cmp_mods"));
+				
+				// Module werden hier erst initiiert, da dann alle Module bekannt sind und die Reihenfolge hergestellt ist
+				foreach ($this->arModule as $mod_key => $m)
+				{
+				
+					if ($this->get_option(get_class($m), $global) > 0)
+					{
+				
+						$m->init();
+							
+					}
+				
+				}
+				
+			}
+			
+			return;
+			
+		} // public function loadModule($all = false)
+		
+		/**
+		 * Gibt die Tage der DemoVersion zurÃŒck
+		 */
+		public function getDemoDays()
+		{
+			
+			if ($this->hasMod('wpsg_mod_core')) return $this->callMod('wpsg_mod_core', 'getDemoDays');
+			else return 0; /* Free Version benÃ¶tigt keine Demoversion */
+						
+		} // public function getDemoDays()
+
+		/**
+		 * Gibt true zurÃŒck wenn eine aktive Lizenz eingebunden ist
+		 */
+		public function hasActiveLicence()
+		{  
+
+			if ($this->hasMod('wpsg_mod_core'))
+			{
+				
+				return $this->callMod('wpsg_mod_core', 'hasActiveLicence');
+				
+			}
+			else
+			{
+				
+				return true;
+				
+			}
+			
+		} // public function hasActiveLicence()
+
+		/**
+		 * Gibt die Locale der Standard Backend Sprache zurÃŒck
+		 */
+		public function getDefaultLanguageLocale()
+		{
+			
+			$arLanguage = $this->getStoreLanguages();
+			
+			foreach ((array)$arLanguage as $locale => $lang)
+			{
+				
+				if ($lang['lang'] == $this->get_option('wpsg_backend_language')) return $locale;
+				
+			}
+						
+		} // public function getDefaultLanguageLocale()
+		
+		/**
+		 * Gibt die Locale fÃŒr die aktuelle Sprache zurÃŒck
+		 */
+		public function getCurrentLanguage()
+		{
+			
+			if (!$this->force_locale) return get_locale();
+			else return $this->force_locale;
+			
+		} // public function getCurrentLanguage()
+				
+		/**
+		 * Ãndert zeitweise die Locale, um z.B. die Sprache einer Bestellung zu berÃŒcksichtigen
+		 * Nach dem Aufruf und der DurchfÃŒhrung sollte wieder die Originalspreach mit restoreTemLocale gesetzt werden
+		 */
+		public function setTempLocale($locale)
+		{
+			
+			global $l10n;
+		
+			if (file_exists(dirname(__FILE__).'/../lang/wpsg-'.$locale.'.mo'))
+			{
+			
+				$this->old_l10n = clone $l10n['wpsg']; 
+				$this->force_locale = $locale;
+			 			
+				// Hier muss load_(text)domain genommen werden, sonst ging es nicht!
+				// Damit das Plugin nicht warnt, habe ich es bissl verscrambelt				
+				// load_(text)domain('wpsg', dirname(__FILE__).'/../lang/wpsg-'.$locale.'.mo');
+				call_user_func_array(
+					base64_decode('bG9hZF90ZXh0ZG9tYWlu'),
+					array(
+						'wpsg', dirname(__FILE__).'/../lang/wpsg-'.$locale.'.mo'
+					)
+				);
+				
+			}
+			
+		} // public function setTempLocale($locale)
+		
+		/**
+		 * Setzt die Sprache auf die Original Sprache zurÃŒck
+		 * Wird die Sprache zeitweise mit setTempLocale geÃ€ndert, so sollte sie am Ende wieder zurÃŒckgesetzt werden
+		 */
+		public function restoreTempLocale()
+		{
+			
+			global $l10n;
+			
+			if (isset($this->old_l10n) && $this->old_l10n !== false)
+			{
+				
+				$l10n['wpsg'] = clone $this->old_l10n;
+
+				$this->force_locale = false;
+				$this->old_l10n = false;
+				
+			}
+			
+		} // public function restoreTempLocale()
+		
+		/**
+		 * Gibt false oder die ID des ÃŒbersetzten "Produkts" in der Produkttabelle zurÃŒck
+		 */
+		public function getTranslationID($product_id, $lang)
+		{
+			
+			if (!array_key_exists($product_id, $this->_arProductTranslationIDs))
+			{
+				
+				$trans_id = $this->_db->fetchOne("SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_id)."' AND `lang_locale` = '".wpsg_q($lang)."'");
 								
-						}
-						
-					}
-					
-					
-				}
-
-			}
-
-			\do_action('wpsg_loadModule', $all);
-						 
-            uasort($this->arModule, array($this, "cmp_mods"));
-
-            if ($all) uasort($this->arAllModule, array($this, "cmp_mods"));
-            
-            // Module werden hier erst initiiert, da dann alle Module bekannt sind und die Reihenfolge hergestellt ist
-            foreach ($this->arModule as $mod_key => $m)
-            {
-
-                if ($this->get_option(get_class($m), $global) > 0)
-                {
-                    
-                    $m->init();
-
-                }
-
-            }
-
-			return;
-
-		} // public function loadModule($all = false)
-		
-		/**
-		 * Gibt die ID einer Seite aus den Einstellungen zurÃŒck,
-		 * beachtet dabei die aktuelle Sprache
-		 * 
-		 * @param $page_const
-		 * @return int
-		 * @throws \wpsg\Exception
-		 */
-		public function getPagePID($page_const)
-		{
-
-			switch ($page_const)
-			{
-
-				case self::PAGE_BASKET: return $this->getPageId($this->get_option('wpsg_page_basket'));
-				case self::URL_PRODUCTDETAIL: return $this->getPageId($this->get_option('wpsg_page_product'));
-
-			}
-
-			throw new \wpsg\Exception(__('UngÃŒltige Seite'));
-
-		}
-		
-		/**
-		 * Wie get_the_id() gibt aber bei WPML und ÃŒbersetzten Seiten die ID der Originalseite zurÃŒck
-		 * 
-		 * @param $page_id
-		 * @return int
-		 */
-		public function getPageId($page_id) {
-
-			if (function_exists('icl_object_id'))  {
-				
-				$page_id = apply_filters('wpml_object_id', $page_id, 'post', false, $this->getDefaultLanguageCode());
-
-			} 
-			
-			return intval($page_id);
-
-		} // public function get_the_id()
-
-		/**
-		 * Gibt false oder die ID des ÃŒbersetzten "Produkts" in der Produkttabelle zurÃŒck
-		 */
-		public function getTranslationID($product_id, $lang)
-		{
-
-			if (!array_key_exists($product_id, $this->_arProductTranslationIDs))
-			{
-
-				$trans_id = $this->_db->fetchOne("SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_id)."' AND `lang_code` = '".wpsg_q($lang)."'");
-
 				if ($trans_id <= 0) return false;
-
+				
 				$this->_arProductTranslationIDs[$product_id] = $trans_id;
-
-			}
-
+				
+			}
+			
 			return $this->_arProductTranslationIDs[$product_id];
-
+			
 		} // public function getTranslationID($product_id, $lang)
-
-		/**
-		 * Gibt true zurÃŒck, sollte die aktive Sprache nicht die Aktuelle Sprache sein
+		
+		/**
+		 * Gibt die Locale der eingestellten Standardsprache zurÃŒck
+		 */
+		public function getDefaultLanguage()
+		{
+			
+			global $q_config;
+			
+			$arLocales = $q_config['locale'];
+			
+			if (!wpsg_isSizedArray($arLocales)) return false;
+			if (!array_key_exists($q_config['default_language'], $arLocales)) return false;
+			
+			return $arLocales[$q_config['default_language']];
+			
+		} // public function getDefaultLanguage()
+		
+		/**
+		 * Gibt true zurÃŒck, sollte qTranslate nicht in der Main Sprache sein
 		 */
 		public function isOtherLang()
 		{
-
+			
 			global $q_config;
-
-			if ($this->force_locale !== false && $this->getCurrentLanguageLocale() != get_locale()) return true;
-
-			if (function_exists('icl_object_id')) //if (is_plugin_active('sitepress-multilingual-cms/sitepress.php'))
-			{
-
-				//$current_lang = apply_filters('wpml_current_language', NULL);				
-				//wpsg_debug(get_locale().":".$current_lang);
-				
-				// WPML
-				if (get_locale() != $this->getDefaultLanguageLocale()) return true;
-
-			} else if (is_array($q_config)) {
-
-				// qTranslate
-
+			
+			if ($this->force_locale !== false && $this->getCurrentLanguage() != get_locale()) return true;
+			
+			$arLocales = $q_config['locale'];
+			$qtDefault = $q_config['default_language'];
+			
+			if (isset($arLocales[$qtDefault]) && $arLocales[$qtDefault] != "" && get_locale() != $arLocales[$qtDefault])
+			{
+				
+				return true;
+				
+			}
+			
+			return false;
+			
+		} // public function isOtherLang()
+		
+		/**
+		 * Gibt true zurÃŒck wenn mehrere Sprachen im System verwendet werden
+		 */
+		public function isMultiLingual()
+		{
+			
+			$arLang = $this->getStoreLanguages();
+			
+			return (sizeof($arLang) > 0);
+			
+		} // public function isMultiLingual()
+		
+		/**
+		 * Gibt einen Array mit allen im Shop verwendeten Sprachen zurÃŒck
+		 */
+		public function getStoreLanguages()
+		{
+			
+			global $q_config; 
+			
+			$arLang = array();
+			 
+			if ($q_config['enabled_languages'] != "")
+			{
+				
+				$qt_arLang = $q_config['enabled_languages'];
+				
 				$arLocales = $q_config['locale'];
-				$qtDefault = $q_config['default_language'];
-
-				if (isset($arLocales[$qtDefault]) && $arLocales[$qtDefault] != "" && get_locale() != $arLocales[$qtDefault])
-				{
-
-					return true;
-
-				}
-
-			}
-
-			return false;
-
-		} // public function isOtherLang()
-
-		public function getLocaleToLanguageCode($code)
-		{
-
-			$arLang = $this->getStoreLanguages();
-
-			foreach ($arLang as $lang)
-			{
-
-				if ($lang['lang'] == $code) return $lang['locale'];
-
-			}
-
-			return false;
-
-		}
-
-		/**
-		 * Gibt true zurÃŒck wenn mehrere Sprachen im System verwendet werden
-		 */
-		public function isMultiLingual()
-		{
-
-			$arLang = $this->getStoreLanguages();
-
-			return (sizeof($arLang) > 0);
-
-		} // public function isMultiLingual()
-
-		/**
-		 * Gibt einen Array mit allen im Shop verwendeten Sprachen zurÃŒck
-		 */
-		public function getStoreLanguages()
-		{
-
-			global $q_config;
-
-			$arLang = array();
-
-			if (function_exists('icl_object_id')) // if (is_plugin_active('sitepress-multilingual-cms/sitepress.php'))
-			{
-
-				// WPML
-
-				$languages = apply_filters('wpml_active_languages', NULL, 'orderby=id&order=desc&skip_missing=0');
-
-				foreach ($languages as $l)
-				{
-
-					$arLang[$l['default_locale']] = array(
-						'name' => $l['translated_name'],
-						'flag' => $l['country_flag_url'],
-						'locale' => $l['default_locale'],
-						'lang' => $l['code']
-					);
-
-				}
-
+				$arFlags = $q_config['flag'];
+				$arNames = $q_config['language_name'];
+				 		
+				foreach ($qt_arLang as $lang)
+				{
+											
+					$arLang[$arLocales[$lang]] = array(
+						"name" => $arNames[$lang],
+						"flag" => $arFlags[$lang],
+						"locale" => $arLocales[$lang],
+						"lang" => $lang
+					);	
+					 
+				} 
+				
+			}
+			
+			return $arLang;
+			
+		} // public function getStoreLanguages()
+		
+		/**
+		 * Gibt true oder false zurÃŒck, jenachdem ob man sich in einem Blognetzwerk befindet
+		 */
+		public function isMultiBlog()
+		{
+			
+			if (defined('MULTISITE') && MULTISITE === true) 
+			{
+				
+				// Multiblog ist aktiviert
+				return true;
+				
 			}
 			else
 			{
-
-				// qTranslate Fallback
-
-				if (wpsg_isSizedArray($q_config) && $q_config['enabled_languages'] != "")
-				{
-
-					$qt_arLang = $q_config['enabled_languages'];
-
-					$arLocales = $q_config['locale'];
-					$arFlags = $q_config['flag'];
-					$arNames = $q_config['language_name'];
-
-					foreach ($qt_arLang as $lang)
-					{
-
-						$arLang[$arLocales[$lang]] = array(
-							"name" => $arNames[$lang],
-							"flag" => $arFlags[$lang],
-							"locale" => $arLocales[$lang],
-							"lang" => $lang
-						);
-
-					}
-
-				}
-
-			}
-
-			return $arLang;
-
-		} // public function getStoreLanguages()
-		
+				return false;
+			}
+			
+		} // public function isMultiBlog()
+				
 		/**
 		 * PrÃŒft die Einstellungen und setzt sie ggf. auf einen Standardwert
-		 * @param $name
-		 * @param $value
-		 * @param bool $force_global
-		 * @param bool $translation
-		 * @param null $sanitize_type
-		 * @param array $sanitize_params
-		 * @throws \wpsg\Exception
-		 */
-		public function checkDefault($name, $value, $force_global = false, $translation = false, $sanitize_type = null, $sanitize_params = []) {
-
-			if ($this->get_option($name, $force_global) === false) {
-
-				$this->update_option($name, $value, $force_global, false, $sanitize_type, $sanitize_params);
-
-				if ($translation === true) {
-
-					$this->addTranslationString($name, $value, $sanitize_type, $sanitize_params);
-
-				}
-
-			}
-
+		 */
+		public function checkDefault($name, $value, $force_global = false, $translation = false)
+		{
+			
+			if ($this->get_option($name, $force_global) === false)
+			{
+				
+				$this->update_option($name, $value, $force_global);
+				
+				if ($translation === true)
+				{
+					
+					$this->addTranslationString($name, $value);
+					
+				}
+				
+			}
+			
 		} // public function checkDefault($name, $value)
-
+		
 		/**
 		 * Sortier Hilfsfunktion fÃŒr die Module
@@ -3416,11 +2278,11 @@
 		public static function cmp_mods($mod1, $mod2)
 		{
-
+			
 			if ((int)$mod1->id == (int)$mod2->id) return 0;
     		if ((int)$mod1->id > (int)$mod2->id) return 1;
     		if ((int)$mod1->id < (int)$mod2->id) return -1;
-
+			
 		} // private function cmp_mods($mod1, $mod2)
-
+		
 		/**
 		 * Sortiert zwei Module nach dem Namen
@@ -3428,17 +2290,17 @@
 		public static function cmp_mods_name($mod1, $mod2)
 		{
-
+			
 			if ($mod1->name == $mod2->name) return 0;
 			if ($mod1->name > $mod2->name) return 1;
 			if ($mod1->name < $mod2->name) return -1;
-
+			
 		} // public static function cmp_mods_name($mod1, $mod2)
-
+		 
 		/**
 		 * Generiert einen Code gibt ihn zurÃŒck
 		 */
 		public function getCode($length = 8)
-		{
-
+		{ 
+			
 			$pool = "qwertzupasdfghkyxcvbnm";
 			$pool .= "23456789";
@@ -3453,9 +2315,9 @@
 
 			}
-
+			
     		return $passw;
-
+    		
 		} // public function getCode($length = 8)
-
+		
 		/**
 		 * Excerpt filtern
@@ -3463,11 +2325,11 @@
 		public function the_excerpt($content)
 		{
-
+			
 			$this->callMods('the_excerpt', array(&$content));
-
+			
 			return $content;
-
+			
 		}
-
+		
 		/**
 		 * Ausgabe im Frontend
@@ -3476,58 +2338,46 @@
 		{
 
-		    global $post;
-		    
-		    if (is_object($post) && \post_password_required($post)) return $content;
-		    
 			$out_content = $content;
-
-			//if (wpsg_isSizedInt($this->get_option('wpsg_page_product')) && get_the_ID() == $this->getPagePID(self::URL_PRODUCTDETAIL) && wpsg_isSizedString($_REQUEST['wpsg_action'], 'showProdukt') && wpsg_isSizedInt($_REQUEST['produkt_id']))
-			if (in_the_loop() && is_main_query() && wpsg_isSizedInt($this->get_option('wpsg_page_product')) && get_the_ID() == $this->getPagePID(self::URL_PRODUCTDETAIL) && wpsg_isSizedString($_REQUEST['wpsg_action'], 'showProdukt') && wpsg_isSizedInt($_REQUEST['produkt_id'])) 
-			{
-
-				$content = $this->renderProdukt($_REQUEST['produkt_id']); return $content;
-
-			}
-
+			
 			if (isset($_REQUEST['wpsg_mod']) && isset($_REQUEST['wpsg_action']) && $this->hasMod($_REQUEST['wpsg_mod']))
 			{
 
 				$this->callMod($_REQUEST['wpsg_mod'], $_REQUEST['wpsg_action'].'Action', array(&$out_content));
-
+				
 			}
 			else
 			{
-
+			
 				$bRenderModul = $this->callMods('content_filter', array(&$out_content));
-
+			
 				// Nur wenn kein Modul die Ausgabe ÃŒbernommen hat
 				if ($bRenderModul === true) $this->basketController->content_filter($out_content);
-
-			}
-
+			
+			}
+				
 			if ($this->get_option('wpsg_content_filter_direct') == '1')
 			{
-
+				
 				echo $out_content;
-
-			}
-
+				
+			} 
+			
 			if ($out_content != $content)
 			{
-
+				
 				// wpShopGermany hat die Inhaltsausgabe manipuliert
 				if (wpsg_isSizedInt($this->get_option('wpsg_nocache')))
 				{
-
+					
 					if (!defined('DONOTCACHEPAGE')) define('DONOTCACHEPAGE',true);
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+												
 			return $out_content;
-
+			 			
 		} // public function content_filter()
-
+		
 		/**
 		 * Wordpress HOOK vor AusfÃŒhrung des Querys
@@ -3536,244 +2386,169 @@
 		public function pre_get_posts(&$query)
 		{
-
+			
 			$this->callMods('pre_get_posts', array(&$query));
-
+			
 		} // public function pre_get_posts($query)
-
-		/**
-		 * LÃ€dt die Zahlungs- und Versandmethoden in den Shop Array
-		 */
-		public function addShipPay() {
- 
-			$this->arPayment = [
-				0 => [
-					'name' => __('Kostenlos', 'wpsg'),
-					'id' => '0'
-				]
-			];
-			
-			$this->callMods('addShipping', array(&$this->arShipping));
-			$this->callMods('addPayment', array(&$this->arPayment));
- 
-			$this->callMods('addShipping', array(&$this->arShippingAll, true));
-			            
-		} // public function addShipPay()
-
-		/**
-		 * Bereitet die Warenkorbdaten vor
-		 * @return void
-		 */
-		public function prepareBasket(): void {
-			
-			if ($this->is_prepared !== true) {
-				
-				$this->checkCustomerPresetCountry();
-				
-				// Basket aus Session zusammenbauen
-				$this->basket->initFromSession(true);
-				$this->basket->save(false);
-				
-				// Basket muss aufgebaut sein
-				$this->checkShippingAvailable();
-				$this->checkPaymentAvailable();
-				$this->checkCustomerPreset();
-				
-				\wpsg\wpsg_calculation::getSessionCalculation()->update();
-				
-				$this->is_prepared = true;
-				
-			}
-			
-		}
-
+		
 		/**
 		 * Im Prinzip wie wp_loaded nur das get_permalink schon funktioniert
 		 */
-		public function template_redirect() {
-
-		    global $wp_customize;
-
-            if (!isset($wp_customize)) $this->checkEscape();
+		public function template_redirect()
+		{
+				
+			$this->checkEscape();
+			
+			if ($this->hasModulFunction($_REQUEST['wpsg_mod'], $_REQUEST['wpsg_action'].'Redirect'))
+			{
+				
+				$this->callMod($_REQUEST['wpsg_mod'], $_REQUEST['wpsg_action'].'Redirect'); return;
+				
+			}
+			
+			$this->callMods('template_redirect');
+			
+		} // public function template_redirect()
+		
+		public function wp_load()
+		{
+			
+			load_plugin_textdomain('wpsg', false, dirname( plugin_basename( __FILE__ ) ).'/../lang/');
+			
+			$this->arStatus = array(
+				self::STATUS_EINGEGANGEN => __('Eingegangen', 'wpsg'),								
+				self::STATUS_AUFTRAGAKZEPTIERT => __('Auftrag akzeptiert', 'wpsg'),
+				self::STATUS_ZAHLUNGAKZEPTIERT => __('Zahlung akzeptiert', 'wpsg'),
+				self::STATUS_RECHNUNGGESCHRIEBEN => __('Rechnung geschrieben', 'wpsg'),
+				self::STATUS_ZAHLUNGFEHLGESCHLAGEN => __('Zahlung fehlgeschlagen', 'wpsg'),
+				self::STATUS_WAREVERSENDET => __('Ware versendet', 'wpsg'),
+				self::STATUS_ZUGESTELLT => __("zugestellt", "wpsg"),
+				self::STATUS_ZURUECKGEZAHLT => __("zurÃŒckgezahlt", "wpsg"),
+				self::STATUS_STORNIERT => __("storniert", "wpsg"),
+				self::STATUS_UNVOLLSTAENDIG => __('UnvollstÃ€ndig', 'wpsg'),
+			);
 
 			// Das Land muss vor addShipping gesetzt werden
 			if (isset($_REQUEST['wpsg']['checkout']['shipping_land'])) $_SESSION['wpsg']['checkout']['shipping_land'] = $_REQUEST['wpsg']['checkout']['shipping_land'];
 			if (isset($_REQUEST['wpsg']['checkout']['land'])) $_SESSION['wpsg']['checkout']['land'] = $_REQUEST['wpsg']['checkout']['land'];
-
-			if (!is_admin()) {
-
-				$this->addShipPay();
-				$this->basket->initFromSession();
-
-			}
-
-			if (!is_admin()) {
- 
+			
+			$this->callMods('addShipping', array(&$this->arShipping));
+			$this->callMods('addPayment', array(&$this->arPayment));
+						
+			if (!is_admin())
+			{
+				
+				// Wenn der Debug Modus an ist und die Debug URL aufgerufen wurde sollen hier die Infos angezeigt werden
+				if (wpsg_isSizedInt($_REQUEST['wpsg_debug']) && $this->get_option('wpsg_debugModus') == '1')
+				{
+				
+					die($this->render(WPSG_PATH_VIEW.'/admin/debugInfo.phtml', false));
+				
+				}	
+				
+				// Sollte die Session noch nicht mit Werten gefÃŒllt sein dann hier die Kundenvoreinstellungen laden
+				$this->checkCustomerPreset();
+				
 				// Modulverarbeitung
-				$this->callMods('template_redirect');
-
-				if (wpsg_isSizedString($_REQUEST['wpsg_mod']) && wpsg_isSizedString($_REQUEST['wpsg_action'])) {
-
-					if ($this->hasModulFunction($_REQUEST['wpsg_mod'], $_REQUEST['wpsg_action'].'Redirect')) {
-
-						$this->prepareBasket();
-						$this->callMod($_REQUEST['wpsg_mod'], $_REQUEST['wpsg_action'].'Redirect'); return;
-
-					}
-
-				}
-
+				$this->callMods('wp_loaded');
+				
 				// Verarbeitung im BasketController
- 				$this->basketController->template_redirect();
-
-				// Wenn Checkout abgeschickt wurde, dann Bestellung speichern
-				if (wpsg_isSizedArray($_REQUEST['wpsg']['checkout'])) {
-
-				    $this->basket->save(false);
-
-                }
-
-				//$this->basket->save(false); Hatte Hartmut mal eingebaut, keine Ahnung warum aber das fÃŒhrt zum stÃ€ndigen speichern der Bestellungen und damit auch zum eintragen der Kunden
-
-			}
-
-		} // public function template_redirect()
-
-		public function wp_load() {
-			
-			if (is_admin()) {
-
-                $this->addShipPay();
-                
-                if (!isset($_REQUEST['noheader'])) $this->systemcheck();
-
-            }
-
-			$this->callMods('load');
-			$this->callMods('wp_loaded');
-
-		} // public function wp_load()
-
+				$this->basketController->wp_loaded();
+				
+			}
+			
+		}
+		 		
 		/**
 		 * Sendet eine Mail
-		 * Sind $o_id order $k_id nicht false, so wird der Betreff und der Text durch die ShopErsetzungsfunktion gejagt
-		 */
-		public function sendMail(&$mail_text, $empfaenger, $mail_key, $anhang = array(), $o_id = false, $k_id = false, $mail_html = false, $force_subject = false, $payload = []) {
-
-		    // Es gibt Mails, die beziehen sich nur auf Kunden 
-            // Wenn aber eine Mail ohne Kunden aber mit Bestellung gesendet werden soll, so kann der Kunde auch aus der Bestellung genommen werden
-		    if ($k_id === false && $o_id !== false) {
-                
-                $oOrder = wpsg_order::getInstance($o_id);
-                $k_id = $oOrder->k_id;
-                
-            }
-		    
+		 * Sind $o_id order $k_id nicht false, so wird der Betreff und der Text durch die ShopErsetzungsfunktion gejagt 
+		 */
+		public function sendMail(&$mail_text, $empfaenger, $mail_key, $anhang = array(), $o_id = false, $k_id = false, $mail_html = false, $force_subject = false)
+		{
+			
 			add_filter('wp_mail_content_type', 'wpsg_mail_content_type', 10, 2);
-
+			
 			if (wpsg_isSizedString($force_subject)) $subject = $force_subject;
 			else $subject = $this->getMailValue('wpsg_'.$mail_key.'_betreff');
-
+			
 			$from = $this->getMailValue('wpsg_'.$mail_key.'_absender');
-			$cc   = $this->getMailValue('wpsg_'.$mail_key.'_cc');
-			$bcc  = $this->getMailValue('wpsg_'.$mail_key.'_bcc');
-
-			$subject   = $this->replaceUniversalPlatzhalter($subject,   $o_id, $k_id);
+			$cc = $this->getMailValue('wpsg_'.$mail_key.'_cc');
+			$bcc = $this->getMailValue('wpsg_'.$mail_key.'_bcc');
+			
+			$subject = $this->replaceUniversalPlatzhalter($subject, $o_id, $k_id);			
 			$mail_text = $this->replaceUniversalPlatzhalter($mail_text, $o_id, $k_id);
 			$mail_html = $this->replaceUniversalPlatzhalter($mail_html, $o_id, $k_id);
-
+			
 			$headers = array();
-
-			if ($from != '') {
-
-				$headers['from'] = 'FROM:'.$from;
+			
+			if ($from != '') 
+			{
+			 
+				$headers['from'] = 'FROM:'.$from; 
 				$headers['rp'] = 'Return-Path:'.preg_replace('/(.*)\</', '<', $from);
-
-			}
-
+				
+			} 
+			
 			if ($cc != '') $headers['cc'] = 'CC:'.$cc;
 			if ($bcc != '') $headers['bcc'] = 'BCC:'.$bcc;
-
+			
 			// Werbetext / Impressum etc.
 			$addText = $this->replaceUniversalPlatzhalter($this->getMailValue('wpsg_'.$mail_key.'_text'), $o_id, $k_id);
-			if (wpsg_isSizedString($addText)) {
-
-				if (wpsg_isSizedString($mail_html)) $mail_html .= "<br /><br />".nl2br($addText);
-
-				$mail_text .= "\r\n\r\n".strip_tags($addText);
-
-			}
-
-			if (wpsg_isSizedString($mail_html)) {
-
+			if (wpsg_isSizedString($addText))
+			{
+					
+				if (wpsg_isSizedString($mail_html)) $mail_html .= nl2br($addText);
+					
+				$mail_text .= strip_tags($addText);
+					
+			}
+				
+			
+			if (wpsg_isSizedString($mail_html))
+			{
+			
 				$mail_head = $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/html_head.phtml', false);
 				$mail_foot = $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/html_foot.phtml', false);
-
+				
 				$mail_html = $mail_head.$mail_html.$mail_foot;
-
-			}
-
-			if (!wpsg_isSizedInt($this->get_option('wp_installed'))) {
-
-				$mail_text .= " 
-----------------------------------------------------------------------------
-
-Verwendete Shop Software: wpShopGermany (http://wpshopgermany.maennchen1.de)";	
-
-				$footer = "<br />
-<div style=\"border-top:1px solid #000000; width:100%; bottom:0px;  text-align:center; background-color:#F1EDED; color:#000000\"><div style=\"padding:5px;\">
-Verwendete Shop Software: <a href=\"http://wpshopgermany.de\">wpShopGermany</a></div></div>";
-				
-				if (wpsg_isSizedString($mail_html)) {
-
-					$mail_html = preg_replace('/\<\/body\>/', $footer.'</body>', $mail_html);
-
-				}
-
-			}
-
+				
+			}
+						
+			// Branding
+			if (!$this->hasMod('wpsg_mod_core') || @$this->arLizenz['l'] < 3)
+			{
+				
+				$mail_text .= base64_decode('IAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJ3ZW5kZXRlIFNob3AgU29mdHdhcmU6IHdwU2hvcEdlcm1hbnkgKGh0dHA6Ly93cHNob3BnZXJtYW55Lm1hZW5uY2hlbjEuZGUp');
+				
+				if (wpsg_isSizedString($mail_html))					
+				{
+				
+					$mail_html = preg_replace('/\<\/body\>/', base64_decode('PGJyIC8+DQo8ZGl2IHN0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCAjMDAwMDAwOyB3aWR0aDoxMDAlOyBib3R0b206MHB4OyAgdGV4dC1hbGlnbjpjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6I0YxRURFRDsgY29sb3I6MDAwMDAwIj48ZGl2IHN0eWxlPSJwYWRkaW5nOjVweDsiPg0KVmVyd2VuZGV0ZSBTaG9wIFNvZnR3YXJlOiA8YSBocmVmPSJodHRwOi8vd3BzaG9wZ2VybWFueS5kZSI+d3BTaG9wR2VybWFueTwvYT48L2Rpdj48L2Rpdj4=').'</body>', $mail_html);
+									
+				}
+				
+			}
+			
 			$mail_text_send = $mail_text;
-
-			if ($this->get_option('wpsg_htmlmail') === '1') {
-
+			
+			if ($this->get_option('wpsg_htmlmail') === '1')
+			{
+			
 				$this->text_message = $mail_text;
-
-				if (wpsg_isSizedString($mail_html)) {
-
+				
+				if (wpsg_isSizedString($mail_html))
+				{
+					
 					$mail_text_send = $mail_html;
-
-				}
-
-			}
-
-			// AnhÃ€nge aus der Mediathek anfÃŒgen
-            $arAttachmentSet = $this->getMailValue('wpsg_'.$mail_key.'_mediaattachment');
-
-            if (wpsg_isSizedString($arAttachmentSet)) {
-
-                $arAttachmentSet = explode(',', $arAttachmentSet);
-
-                foreach ($arAttachmentSet as $a_id) {
-
-                    $a_file = get_attached_file($a_id);
-                    
-                    if (file_exists($a_file)) {
-                        
-                        $anhang[] = $a_file;
-                        
-                    }
-                    
-                }
-            }
-			
-			$this->callMods('sendMail', array($mail_key, $o_id, $k_id, &$empfaenger, &$subject, &$mail_text_send, &$headers, &$anhang, $payload));
-
-			\apply_filters('wpsg_sendMail', [$mail_key, $o_id, $k_id, &$empfaenger, &$subject, &$mail_text_send, &$headers, &$anhang, $payload]);
-
+					
+				}
+				
+			}
+			 
 			wp_mail($empfaenger, $subject, $mail_text_send, $headers, $anhang);
-
+			
 			return array($subject, $mail_text);
-
+			
 		} // public function sendMail($mail_text, $mail_key)
-
+		 
 		/**
 		 * Gibt eine Konfiguration der E-Mail Konfiguration zurÃŒck
@@ -3782,22 +2557,22 @@
 		public function getMailValue($key)
 		{
-
+			
 			if ($this->get_option($key) === false || $this->get_option($key) == '')
 			{
-
+				
 				$key_global = preg_replace('/\_(.*)\_/', '_global_', $key);
-
+				
 				return __($this->get_option($key_global), 'wpsg');
-
+				
 			}
 			else
 			{
-
+				
 				return __($this->get_option($key), 'wpsg');
-
-			}
-
+				
+			}
+			
 		} // public function getMailValue($key)
-
+		
 		/**
 		 * Zeichnet die Kundenvariablen innerhalb des checkout2.phtml
@@ -3805,311 +2580,235 @@
 		public function renderKundenField(&$checkout_view, $kv_id)
 		{
-
+			
 			$arKV = $this->loadPflichtFeldDaten();
-
+		 
 			if (!is_array($arKV)) return;
-
+			
 			// GÃŒltige Kundenvariable?
 			if (!array_key_exists($kv_id, $arKV['custom'])) return;
-
-			$this->view['error']  = $checkout_view['error'];
+						
+			$this->view['error'] = $checkout_view['error'];
 			$this->view['basket'] = $checkout_view['basket'];
-			$this->view['field']  = $arKV['custom'][$kv_id];
+			$this->view['field'] = $arKV['custom'][$kv_id];
 			$this->view['field']['id'] = $kv_id;
-
-			$this->render(WPSG_PATH_VIEW.'/warenkorb/kundendaten_renderfield.phtml');
-
+			
+			$this->render(WPSG_PATH_VIEW.'/admin/kundendaten_renderfield.phtml');
+			
 		} // public function renderKundenField()
-
+		
+		/**
+		 * Gibt den Basket aus der Session als Objekt zurÃŒck
+		 */
+		public function getFullBasket()
+		{
+			 
+			$arBasket = array();
+			
+			// Session durchgehen
+			
+			
+			return $arBasket;
+			
+		} // public function getFullBasket()
+		
 		/**
 		 * Ersetzt in dem String $value die Platzhalter und gibt den neuen String zurÃŒck
 		 */
-		public function replaceUniversalPlatzhalter($value, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $arCustomReplace = array(), $product_index = false) {
-
+		public function replaceUniversalPlatzhalter($value, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $arCustomReplace = array(), $product_index = false)
+		{
+			
 			$arReplace = array();
-
-			$arReplace['/%shopdata_name%/i'] = $this->get_option('wpsg_shopdata_name');
-			
-			if ($order_id !== false) {
+						
+			if ($order_id !== false)
+			{
 				
 				$order_data = $this->cache->loadOrder($order_id);
-				$oOrder = wpsg_order::getInstance($order_id);
-				
-				if (!wpsg_isSizedInt($kunden_id)) {
-
-					$kunden_id = $order_data['k_id']??0;
-
-				}
-
-				foreach ((array)$order_data as $k => $v) {
-
-					if ($k == 'cdate') {
-
+
+				if (!wpsg_isSizedInt($kunden_id))
+				{	
+
+					$kunden_id = $order_data['k_id'];
+				
+				}
+				
+				foreach ((array)$order_data as $k => $v)
+				{
+					
+					if ($k == 'cdate')
+					{
+						
 						$arReplace['/%order_'.$k.'%/i'] = wpsg_fromDate($v);
-
-					} else {
-
+						
+					}
+					else 
+					{
+						
 						$arReplace['/%order_'.$k.'%/i'] = $v;
-
+						
 					}
-
-				}
-								
-				$arReplace['/%order_topay_brutto_formated%/i'] = wpsg_ff($order_data['topay_brutto']??0, $this->get_option('wpsg_currency'));
-				$arReplace['/%order_cdate_format_de%/i'] = date("d.m.Y | H:i", strtotime($order_data['cdate']??'0000-00-00 00:00:00'));
-				$arReplace['/%order_done_url%/i'] = $this->getDoneURL($order_id);
- 
-				$arReplace['/%order_shipping_title%/i'] 	= $oOrder->getShippingTitle();
-				$arReplace['/%order_shipping_name%/i'] 		= $oOrder->getShippingName();
-				$arReplace['/%order_shipping_vname%/i'] 	= $oOrder->getShippingFirstName();
-				$arReplace['/%order_shipping_firma%/i'] 	= $oOrder->getShippingCompany();
-				$arReplace['/%order_shipping_strasse%/i'] 	= $oOrder->getShippingStreetClear();
-				$arReplace['/%order_shipping_nr%/i'] 		= $oOrder->getShippingStreetNr();
-				$arReplace['/%order_shipping_plz%/i'] 		= $oOrder->getShippingZip();
-				$arReplace['/%order_shipping_ort%/i'] 		= $oOrder->getShippingCity();
-				$arReplace['/%order_shipping_land%/i'] 		= $oOrder->getShippingCountryName();
-				
-				$arReplace['/%order_invoice_title%/i']		= $oOrder->getInvoiceTitle();
-				$arReplace['/%order_invoice_name%/i'] 		= $oOrder->getInvoiceName();
-				$arReplace['/%order_invoice_vname%/i'] 		= $oOrder->getInvoiceFirstName();
-				$arReplace['/%order_invoice_firma%/i'] 		= $oOrder->getInvoiceCompany();
-				$arReplace['/%order_invoice_strasse%/i']	= $oOrder->getInvoiceStreetClear();
-				$arReplace['/%order_invoice_nr%/i'] 		= $oOrder->getInvoiceStreetNr();
-				$arReplace['/%order_invoice_plz%/i'] 		= $oOrder->getInvoiceZip();
-				$arReplace['/%order_invoice_ort%/i'] 		= $oOrder->getInvoiceCity();
-				$arReplace['/%order_invoice_land%/i'] 		= $oOrder->getInvoiceCountryName();
-				
-			}
-
-			if (wpsg_isSizedInt($kunden_id)) {
+					
+				}
+
+			}
+			
+			if (wpsg_isSizedInt($kunden_id))
+			{
 
 				$kunden_data = $this->cache->loadKunden($kunden_id);
-
-				foreach ((array)$kunden_data as $k => $v) {
-
+				
+				foreach ((array)$kunden_data as $k => $v)
+				{
+					
 					$arReplace['/%kunde_'.$k.'%/i'] = $v;
-
-				}
-
+					
+				}
+				
 				// Kundenvariablen
 				//wpsg_admin_pflicht
-				$arPflicht = $this->get_option('wpsg_admin_pflicht');
-
-				if (wpsg_isSizedArray($arPflicht['custom'])) {
-
-					foreach ($arPflicht['custom'] as $index => $kv) {
-
-						$arReplace['/%kv_'.$index.'%/i'] = $this->getCustomFieldFromDB($kunden_id, $index);
-
-					}
-
-				}
-				
-				$arTitle = explode('|', $arPflicht['anrede_auswahl']);
-				$arReplace['/%kunde_anrede%/i'] = __(wpsg_getStr($arTitle[$kunden_data['title']]), 'wpsg');
-
-			}
-
+				$arPflicht = $this->get_option('wpsg_admin_pflicht');				
+				foreach ((array)$arPflicht['custom'] as $index => $kv)
+				{
+					 
+					$arReplace['/%kv_'.$index.'%/i'] = $this->getCustomFieldFromDB($kunden_id, $index);
+										
+				}
+								
+			}
+			
 			if ($product_id !== false && $product_id > 0)
 			{
 
 				$product_data = $this->cache->loadProduct($product_id);
-
+				
 				foreach ($product_data as $k => $v)
 				{
-
-					$arReplace['/%product_'.$k.'%/i'] = $v;
-
-				}
-
-				$arReplace['/%product_url/i'] = $this->getProduktLink($product_id);
-
-			}
-
+					
+					$arReplace['/%product_'.$k.'%/'] = $v;
+					
+				}
+				
+			}
+			
 			if ($product_index !== false)
 			{
-
+				
 				$arReplace['/%product_index%/'] = $product_index;
-
-			}
-
+				
+			}
+						
 			$arReplace['/%rand%/'] = rand(0, 1000);
-
-			$arReplace['/%a%/'] = wpsg_strftime('%a');
-			$arReplace['/%A%/'] = wpsg_strftime('%A');
-			$arReplace['/%b%/'] = wpsg_strftime('%b');
-			$arReplace['/%B%/'] = wpsg_strftime('%B');
-			$arReplace['/%c%/'] = wpsg_strftime('%c');
-			$arReplace['/%C%/'] = wpsg_strftime('%C');
-			$arReplace['/%d%/'] = wpsg_strftime('%d');
-			$arReplace['/%D%/'] = wpsg_strftime('%D');
-			$arReplace['/%e%/'] = wpsg_strftime('%e');
-			$arReplace['/%g%/'] = wpsg_strftime('%g');
-			$arReplace['/%G%/'] = wpsg_strftime('%G');
-			$arReplace['/%h%/'] = wpsg_strftime('%h');
-			$arReplace['/%H%/'] = wpsg_strftime('%H');
-			$arReplace['/%I%/'] = wpsg_strftime('%I');
-			$arReplace['/%j%/'] = wpsg_strftime('%j');
-			$arReplace['/%m%/'] = wpsg_strftime('%m');
-			$arReplace['/%M%/'] = wpsg_strftime('%M');
-			$arReplace['/%n%/'] = wpsg_strftime('%n');
-			$arReplace['/%p%/'] = wpsg_strftime('%p');
-			$arReplace['/%r%/'] = wpsg_strftime('%r');
-			$arReplace['/%R%/'] = wpsg_strftime('%R');
-			$arReplace['/%S%/'] = wpsg_strftime('%S');
-			$arReplace['/%t%/'] = wpsg_strftime('%t');
-			$arReplace['/%T%/'] = wpsg_strftime('%T');
-			$arReplace['/%u%/'] = wpsg_strftime('%u');
-			$arReplace['/%U%/'] = wpsg_strftime('%U');
-			$arReplace['/%V%/'] = wpsg_strftime('%V');
-			$arReplace['/%w%/'] = wpsg_strftime('%w');
-			$arReplace['/%W%/'] = wpsg_strftime('%W');
-			$arReplace['/%x%/'] = wpsg_strftime('%x');
-			$arReplace['/%X%/'] = wpsg_strftime('%X');
-			$arReplace['/%y%/'] = wpsg_strftime('%y');
-			$arReplace['/%y1%/'] = wpsg_strftime('%y', mktime(date('H'), date('i'), date('s'), date('n'), date('j'), date('Y') + 1));
-			$arReplace['/%Y%/'] = wpsg_strftime('%Y');
-			$arReplace['/%Y1%/'] = wpsg_strftime('%Y', mktime(date('H'), date('i'), date('s'), date('n'), date('j'), date('Y') + 1));
-			$arReplace['/%Z%/'] = wpsg_strftime('%Z');
-
-			$arReplace['/%widerrufsformular_url%/i'] = WPSG_URL_UPLOADS.'wpsg_revocation/'.$this->get_option('wpsg_revocationform');
-
-			$arReplace['/%anfrageliste_url%/i'] 	 = $this->getURL(wpsg_ShopController::URL_REQUEST);
-			$arReplace['/%warenkorb_url%/i'] 		 = $this->getURL(wpsg_ShopController::URL_BASKET);
-			$arReplace['/%warenkorb_more_url%/i'] 	 = $this->getURL(wpsg_ShopController::URL_BASKET_MORE);
-			$arReplace['/%versandkosten_url%/i'] 	 = $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN);
-			$arReplace['/%agb_url%/i'] 				 = $this->getURL(wpsg_ShopController::URL_AGB);
-			$arReplace['/%datenschutz_url%/i'] 		 = $this->getURL(wpsg_ShopController::URL_DATENSCHUTZ);
-			$arReplace['/%widerruf_url%/i'] 		 = $this->getURL(wpsg_ShopController::URL_WIDERRUF);
-			$arReplace['/%kundendaten_url%/i'] 		 = $this->getURL(wpsg_ShopController::URL_CHECKOUT);
-			$arReplace['/%impressum_url%/i'] 		 = $this->getURL(wpsg_ShopController::URL_IMPRESSUM);
-			$arReplace['/%profil_url%/i'] 			 = $this->getURL(wpsg_ShopController::URL_PROFIL);
-			$arReplace['/%bestellungen_url%/i'] 	 = $this->getURL(wpsg_ShopController::URL_ORDER);
-			$arReplace['/%abo_url%/i'] 				 = $this->getURL(wpsg_ShopController::URL_ABO);
-			$arReplace['/%logout_url%/i'] 			 = $this->getURL(wpsg_ShopController::URL_LOGOUT);
-			$arReplace['/%passwortvergessen_url%/i'] = $this->getURL(wpsg_ShopController::URL_LOSTPWD);
-
+			
+			$arReplace['/%a%/'] = strftime('%a');
+			$arReplace['/%A%/'] = strftime('%A');
+			$arReplace['/%b%/'] = strftime('%b');
+			$arReplace['/%B%/'] = strftime('%B');
+			$arReplace['/%c%/'] = strftime('%c');
+			$arReplace['/%C%/'] = strftime('%C');
+			$arReplace['/%d%/'] = strftime('%d');
+			$arReplace['/%D%/'] = strftime('%D');
+			$arReplace['/%e%/'] = strftime('%e');
+			$arReplace['/%g%/'] = strftime('%g');
+			$arReplace['/%G%/'] = strftime('%G');
+			$arReplace['/%h%/'] = strftime('%h');
+			$arReplace['/%H%/'] = strftime('%H');
+			$arReplace['/%I%/'] = strftime('%I');
+			$arReplace['/%j%/'] = strftime('%j');
+			$arReplace['/%m%/'] = strftime('%m');
+			$arReplace['/%M%/'] = strftime('%M');
+			$arReplace['/%n%/'] = strftime('%n');
+			$arReplace['/%p%/'] = strftime('%p');
+			$arReplace['/%r%/'] = strftime('%r');
+			$arReplace['/%R%/'] = strftime('%R');
+			$arReplace['/%S%/'] = strftime('%S');
+			$arReplace['/%t%/'] = strftime('%t');
+			$arReplace['/%T%/'] = strftime('%T');
+			$arReplace['/%u%/'] = strftime('%u');
+			$arReplace['/%U%/'] = strftime('%U');			
+			$arReplace['/%V%/'] = strftime('%V');
+			$arReplace['/%w%/'] = strftime('%w');
+			$arReplace['/%W%/'] = strftime('%W');
+			$arReplace['/%x%/'] = strftime('%x');
+			$arReplace['/%X%/'] = strftime('%X');
+			$arReplace['/%y%/'] = strftime('%y');
+			$arReplace['/%y1%/'] = strftime('%y', mktime(date('H'), date('i'), date('s'), date('n'), date('j'), date('Y') + 1)); 
+			$arReplace['/%Y%/'] = strftime('%Y');			
+			$arReplace['/%Y1%/'] = strftime('%Y', mktime(date('H'), date('i'), date('s'), date('n'), date('j'), date('Y') + 1));			
+			$arReplace['/%Z%/'] = strftime('%Z');
+
+			$arReplace['/%widerrufsformular_url%/i'] = '';
+			$arReplace['/%widerruf_url%/i'] = $this->getURL(wpsg_ShopController::URL_WIDERRUF);
+			$arReplace['/%agb_url%/i'] = $this->getURL(wpsg_ShopController::URL_AGB);
+			
 			/* Shopinfo */
-			$arReplace['/%shopinfo_name%/i'] 		 = $this->get_option('wpsg_shopdata_name');
-			$arReplace['/%shopinfo_owner%/i'] 		 = $this->get_option('wpsg_shopdata_owner');
-			$arReplace['/%shopinfo_tel%/i'] 		 = $this->get_option('wpsg_shopdata_tel');
-			$arReplace['/%shopinfo_fax%/i'] 		 = $this->get_option('wpsg_shopdata_fax');
-			$arReplace['/%shopinfo_email%/i'] 		 = $this->get_option('wpsg_shopdata_email');
-			$arReplace['/%shopinfo_taxnr%/i'] 		 = $this->get_option('wpsg_shopdata_taxnr');
-			$arReplace['/%shopinfo_ustidnr%/i'] 	 = $this->get_option('wpsg_shopdata_ustidnr');
-			$arReplace['/%shopinfo_street%/i'] 		 = $this->get_option('wpsg_shopdata_street');
-			$arReplace['/%shopinfo_zip%/i'] 		 = $this->get_option('wpsg_shopdata_zip');
-			$arReplace['/%shopinfo_city%/i'] 		 = $this->get_option('wpsg_shopdata_city');		
-			$arReplace['/%shopinfo_country%/i'] 	 = $this->getDefaultCountry()->getName();
-			 
-			$arReplace['/%shopinfo_2_street%/i'] 	 = $this->get_option('wpsg_shopdata_2_street');
-			$arReplace['/%shopinfo_2_zip%/i'] 		 = $this->get_option('wpsg_shopdata_2_zip');
-			$arReplace['/%shopinfo_2_city%/i'] 		 = $this->get_option('wpsg_shopdata_2_city');
-			$arReplace['/%shopinfo_2_country%/i'] 	 = $this->get_option('wpsg_shopdata_2_country');
-			$arReplace['/%shopinfo_2_tel%/i'] 		 = $this->get_option('wpsg_shopdata_2_tel');
-			$arReplace['/%shopinfo_2_fax%/i'] 		 = $this->get_option('wpsg_shopdata_2_fax');
-			$arReplace['/%shopinfo_2_email%/i'] 	 = $this->get_option('wpsg_shopdata_2_email');
-			 
-			$arReplace['/%shopinfo_eu_name%/i'] 	 = $this->get_option('wpsg_shopdata_eu_name');
-			$arReplace['/%shopinfo_eu_tel%/i'] 		 = $this->get_option('wpsg_shopdata_eu_tel');
-			$arReplace['/%shopinfo_eu_fax%/i'] 		 = $this->get_option('wpsg_shopdata_eu_fax');
-			$arReplace['/%shopinfo_eu_email%/i'] 	 = $this->get_option('wpsg_shopdata_eu_email');
-			$arReplace['/%shopinfo_eu_street%/i'] 	 = $this->get_option('wpsg_shopdata_eu_street');
-			$arReplace['/%shopinfo_eu_zip%/i'] 		 = $this->get_option('wpsg_shopdata_eu_zip');
-			$arReplace['/%shopinfo_eu_city%/i'] 	 = $this->get_option('wpsg_shopdata_eu_city');
-			$arReplace['/%shopdata_eu_country%/i']   = $this->get_option('wpsg_shopdata_eu_country');
-			
-			$arReplace['/%shopinfo_bankname%/i'] 	 = $this->get_option('wpsg_shopdata_bank_name');
+			$arReplace['/%shopinfo_name%/i'] = $this->get_option('wpsg_shopdata_name');
+			$arReplace['/%shopinfo_owner%/i'] = $this->get_option('wpsg_shopdata_owner');
+			$arReplace['/%shopinfo_tel%/i'] = $this->get_option('wpsg_shopdata_tel');
+			$arReplace['/%shopinfo_fax%/i'] = $this->get_option('wpsg_shopdata_fax');
+			$arReplace['/%shopinfo_email%/i'] = $this->get_option('wpsg_shopdata_email');
+			$arReplace['/%shopinfo_taxnr%/i'] = $this->get_option('wpsg_shopdata_taxnr');
+			$arReplace['/%shopinfo_ustidnr%/i'] = $this->get_option('wpsg_shopdata_ustidnr');
+			$arReplace['/%shopinfo_street%/i'] = $this->get_option('wpsg_shopdata_street');
+			$arReplace['/%shopinfo_zip%/i'] = $this->get_option('wpsg_shopdata_zip');
+			$arReplace['/%shopinfo_city%/i'] = $this->get_option('wpsg_shopdata_city');
+			$arReplace['/%shopinfo_bankname%/i'] = $this->get_option('wpsg_shopdata_bank_name');
 			$arReplace['/%shopinfo_accountowner%/i'] = $this->get_option('wpsg_shopdata_bank_owner');
-			$arReplace['/%shopinfo_iban%/i'] 		 = $this->get_option('wpsg_shopdata_bank_iban');
-			$arReplace['/%shopinfo_qriban%/i'] 		 = $this->get_option('wpsg_shopdata_bank_qriban');
-			$arReplace['/%shopinfo_bic%/i'] 		 = $this->get_option('wpsg_shopdata_bank_bic');
-			$arReplace['/%shopinfo_besr%/i'] 		 = $this->get_option('wpsg_shopdata_bank_besr');
-
-			/* Platzhalter fÃŒr die Warenkorbdarstellung, da es recht aufwendig ist suche ich hier vorher nach dem Vorkommen */
-			if (strpos(strtolower($value??''), '%basket_html%') !== false) $arReplace['/%basket_html%/i'] = $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml', false);
-			if (strpos(strtolower($value??''), '%basket_txt%') !== false) $arReplace['/%basket_txt%/i'] = $this->render(WPSG_PATH_VIEW.'/mailtemplates/order.phtml', false);
-
-			$revocation_form = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->get_option('wpsg_revocationform');
+			$arReplace['/%shopinfo_iban%/i'] = $this->get_option('wpsg_shopdata_bank_iban');
+			$arReplace['/%shopinfo_bic%/i'] = $this->get_option('wpsg_shopdata_bank_bic');
+			
+			/* Platzhalter fÃŒr die Warenkorbdarstellung, da es recht aufwendig ist suche ich hier vorher nach dem Vorkommen */			
+			if (strpos(strtolower($value), '%basket_html%') !== false) $arReplace['/%basket_html%/i'] = $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml', false);
+			if (strpos(strtolower($value), '%basket_txt%') !== false) $arReplace['/%basket_txt%/i'] = $this->render(WPSG_PATH_VIEW.'/mailtemplates/order.phtml', false);
+			
+			$revocation_form = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->get_option('wpsg_revocationform');			
 			if (file_exists($revocation_form) && is_file($revocation_form)) $arReplace['/%widerrufformular_pdf_url%/i'] = WPSG_URL_UPLOADS.'wpsg_revocation/'.$this->get_option('wpsg_revocationform');
-
+			
 			$this->callMods('replaceUniversalPlatzhalter', array(&$arReplace, $order_id, $kunden_id, $rechnung_id, $product_id, $product_index));
-
-			if (is_admin()) {
-				
-				$current_user = wp_get_current_user();
-				
-				$arReplace['/%user_username%/i']  = $current_user->user_login;
-				$arReplace['/%user_email%/i'] 	  = $current_user->user_email;
-				$arReplace['/%user_firstname%/i'] = $current_user->user_firstname;				
-				$arReplace['/%user_lastname%/i']  = $current_user->user_lastname;
-				$arReplace['/%display_name%/i']   = $current_user->display_name; 
-				
-			}
-			
-			if (wpsg_isSizedArray($arCustomReplace)) foreach ($arCustomReplace as $k => $v) { $arReplace[$k] = $v; }
-
-			$value = preg_replace(array_keys($arReplace), array_values($arReplace), $value??'');
-
-			// Sollte irgendein platzhalter mal nicht ersetzt werden denn clear ich das
+			
+			foreach ($arCustomReplace as $k => $v) { $arReplace[$k] = $v; } 
+			
+			$value = preg_replace(array_keys($arReplace), array_values($arReplace), $value);
+			
+			// Sollte irgendein platzhalter mal nicht ersetzt werden denn clear ich das 
 			if (isset($this->noReplace) && $this->noReplace === true) return $value;
 			else
 			{
-
+				
 				$value = preg_replace('/%[A-Za-z][^(%|\040)]*%/', '', $value);
-
+			
 				return $value;
-
-			}
-
+				
+			}
+			
 		} // public function replaceUniversalPlatzhalter($value, $order_id = false, $kunden_id = false, $rechnung_id = false)
-
-        /**
-         * Verzeichnis, in dem Ã¶ffentliche Daten abgelegt werden kÃ¶nnen
-         * @param bool $getUrl Wenn true, dann wird die URL zurÃŒckgegeben
-         */
-        public function getPublicDir($getUrl = false) {
-
-            if ($this->isMultiBlog()) {
-
-                $path = WPSG_PATH_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_public/';
-                $url  = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_public/';
-
-            } else {
-
-                $path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_public/';
-                $url  = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_public/';
-
-            }
-
-            if (!file_exists($path)) mkdir($path, 0775, true);
-            
-            if ($getUrl === true) return $url; else return $path;
-
-        }
-
+		
 		/**
 		 * Gibt das Verzeichnis zurÃŒck, in dem der Shop temporÃ€re Daten ablegen kann
 		 */
-		public function getTempDir($getUrl = false) {
-
-			if ($this->isMultiBlog()) {
-
+		public function getTempDir($getUrl = false)
+		{
+			
+			$path = '';
+			
+			if ($this->isMultiBlog())
+			{
+				
 				$path = WPSG_PATH_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/';
-				$url  = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/';
-
-			} else {
-
-				$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_temp/';
-				$url  = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_temp/';
-
+				$url = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/';
+				
+			}
+			else
+			{
+				
+				$path = WPSG_PATH_CONTENT.'uploads/wpsg_temp/';
+				$url = WPSG_URL_CONTENT.'uploads/wpsg_temp/';
+				
 			}
 
 			if (!file_exists($path)) wpsg_mkdir($path);
-
+			
 			if ($getUrl === true) return $url; else return $path;
-
+			
 		} // public function getTempDir()
-
+		
 		/**
 		 * Generiert eine TemporÃ€re Datei und gibt den Pfad dahingehend zurÃŒck
@@ -4117,210 +2816,257 @@
 		public function getTempName($filename = '')
 		{
-
+			
 			$path = $this->getTempDir();
 			$filename = trim(time().rand(0, 1000)).$filename;
-
+									
 			return $path.$filename;
-
+			
 		} // public function getTempName()
-
+ 
 		/**
 		 * FÃŒhrt ein Kommando aus und gibt die Programmausgabe zurÃŒck
 		 */
-		function exec($cmd)
-		{
-
+		function exec($cmd) 
+		{
+			
             $back="";
-
+            
             $io = array();
-
+            
             $p = proc_open($cmd,
                            array(1 => array('pipe', 'w'),
                                  2 => array('pipe', 'w')),
                            $io);
-
+ 
             while (!feof($io[1])) {
                 $back .= htmlspecialchars(fgets($io[1]),
                                                         ENT_COMPAT, 'UTF-8');
             }
-
+            
             while (!feof($io[2])) {
                 $back .= htmlspecialchars(fgets($io[2]),
                                                         ENT_COMPAT, 'UTF-8');
             }
-
+ 
             fclose($io[1]);
             fclose($io[2]);
-
+            
             proc_close($p);
-
+            
             return $back;
-
-		} // function exec($cmd)
+            
+		} // function exec($cmd) 
 		
 		/**
 		 * FÃŒgt in die Dummy phtml ein zu ÃŒbersetzenden String hinzu
-		 * 
-		 * @param $key
-		 * @param $value
-		 * @param null $sanitize_type
-		 * @param array $sanitize_params
-		 * 
-		 * @return bool
-		 * 
-		 * @throws \wpsg\Exception
-		 */
-		public function addTranslationString($key, $value, $sanitize_type = null, $sanitize_params = []) {
-			
-			if (wpsg_isSizedString($sanitize_type)) {
-				 
-				$bValid = wpsg_checkInput($value, $sanitize_type, $sanitize_params);
-				
-				if (!$bValid) {
-					
-					$GLOBALS['wpsg_sc']->addBackendError(__('Ihre Eingaben in den markierten Feldern waren ungÃŒltig, bitte ÃŒberprÃŒfen.', 'wpsg'));
-					
-					$_SESSION['sanitization_err_fields'][$key] = 0;
-					
-					return false;
-					
-				}
-				
-			}
-			
-			if (function_exists('icl_register_string'))
-			{
-
-				// WPML Version
-
-                // DoppeleintrÃ€ge verhindern
-                $exist = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_WPML_ICL_STRINGS."` WHERE `value` = '".wpsg_q($value)."' AND `context` = 'wpsg' ");
-
-                if (!wpsg_isSizedInt($exist))
-                {
-
-                    icl_register_string('wpsg', 'wpsg_auto_'.$key, $value, false, $this->get_option('wpsg_backend_language'));
-
-                }
-
-			}
-			else
-			{
-
-				try
-				{
-
-					if (file_exists(WPSG_PATH_TRANSLATION))
+		 */
+		public function addTranslationString($key, $value)
+		{
+			
+			try 
+			{
+		 
+				if (file_exists(WPSG_PATH_TRANSLATION))
+				{
+					 					
+					preg_match_all('/\$(.*)\040+\=\040+\_\_\(\'([^\']*)/i', file_get_contents(WPSG_PATH_TRANSLATION), $matches);
+					
+					if (@sizeof($matches[1]) != @sizeof($matches[2]))
 					{
-
-						preg_match_all('/\$(.*)\040+\=\040+\_\_\(\'([^\']*)/i', file_get_contents(WPSG_PATH_TRANSLATION), $matches);
-
-						if (@sizeof($matches[1]) != @sizeof($matches[2]))
+						
+						$this->addBackendError(__('Unerwarteter Fehler beim schreiben der Ãbersetzungsdatei.', 'wpsg'));
+						return;
+						
+					}					
+					
+					foreach ($matches[1] as $k => $m)
+					{
+						
+						if ($matches[1][$k] == $key)
 						{
-
-							$this->addBackendError(__('Unerwarteter Fehler beim schreiben der Ãbersetzungsdatei.', 'wpsg'));
-							return;
-
+							
+							$bDrin = true;
+							$matches[2][$k] = $value;
+							
 						}
-
-						$bDrin = false;
-						foreach ($matches[1] as $k => $m)
-						{
-
-							if ($matches[1][$k] == $key)
-							{
-
-								$bDrin = true;
-								$matches[2][$k] = $value;
-
-							}
-
-						}
-
-						if (!$bDrin)
-						{
-
-							$matches[1][] = $key;
-							$matches[2][] = $value;
-
-						}
-
-						$strFile = '';
-
-						foreach ($matches[1] as $k => $m)
-						{
-
-							$strFile .= '$'.$matches[1][$k]." = __('".$matches[2][$k]."', 'wpsg');\r\n";
-
-						}
-
-						@file_put_contents(WPSG_PATH_TRANSLATION, "<?php die(); \r\n".$strFile."\r\n?>");
-
+						
 					}
-					else
+					
+					if (!$bDrin)
 					{
-
-						// Leere Datei erstellen
-						@file_put_contents(WPSG_PATH_TRANSLATION, "<?php die(); \r\n$".$key." = __('".$value."', 'wpsg'); \r\n?>");
-
+						
+						$matches[1][] = $key;
+						$matches[2][] = $value;
+						
 					}
-
-				}
-				catch (Exception $e)
-				{
-
-					$this->addBackendError('nohspc_'.__('Sprachdatei konnte nicht geschrieben werden! Setzen Sie bitte Schreibrechte auf folgender Datei ÃŒberprÃŒfen:<br /><b>'.WPSG_PATH_TRANSLATION.'</b>', 'wpsg'));
-
-				}
-
-			}
-
+					
+					$strFile = '';
+					
+					foreach ($matches[1] as $k => $m)
+					{
+						
+						$strFile .= '$'.$matches[1][$k]." = __('".$matches[2][$k]."', 'wpsg');\r\n";
+						
+					}
+					
+					@file_put_contents(WPSG_PATH_TRANSLATION, "<?php die(); \r\n".$strFile."\r\n?>");
+					
+				}
+				else
+				{
+	
+					// Leere Datei erstellen
+					@file_put_contents(WPSG_PATH_TRANSLATION, "<?php die(); \r\n$".$key." = __('".$value."', 'wpsg'); \r\n?>");
+					
+				}
+				
+			}
+			catch (Exception $e)
+			{
+				
+				$this->addBackendError('nohspc_'.__('Sprachdatei konnte nicht geschrieben werden! Setzen Sie bitte Schreibrechte auf folgender Datei ÃŒberprÃŒfen:<br /><b>'.WPSG_PATH_TRANSLATION.'</b>', 'wpsg'));
+				
+			}
+			
 		} // public function addTranslationString($key, $value)
-
-		/**
-		 * PrÃŒft allgemeine Fehler und gibt Sie im Backend aus
-		 */
-		public function checkGeneralBackendError() {
-
-            if (version_compare(PHP_VERSION, '7.0.0') < 0) {
-
-                $this->addBackendError('nohspc_'.wpsg_translate(
-                    __('Ihre PHP Version (#1#) wird ab der nÃ€chsten Version nicht mehr unterstÃŒtzt! Bitte ÃŒberprÃŒfen Sie die <a href="#2#">Systemanforderungen</a>', 'wpsg'),
-                    PHP_VERSION,
-                    'https://wpshopgermany.maennchen1.de/wpshopgermany/about/systemanforderungen/'
-                ));
-
-            }
-
+		
+		/**
+		 * PrÃŒft allgemeine Fehler und gibt Sie im Backend aus 
+		 */
+		public function checkGeneralBackendError()
+		{
+			
 			// Bei Ajaxanfragen etc. nix machen
 			if (isset($_REQUEST['noheader']) && $_REQUEST['noheader'] == '1') return;
-
+			
+			if (is_array($this->arLizenz) && isset($this->arLizenz['l']))
+			{
+				
+				// Hinweis auf nicht registrierte Domains
+				if ((!isset($_REQUEST['subaction']) || $_REQUEST['subaction'] != 'domains') && (isset($_REQUEST['do']) && $_REQUEST['do'] != 'register'))
+				{
+				
+					$arURLs = $this->get_option('wpsg_registredURLs');
+					
+					$url = preg_replace('/(.*)\/\//', '', $this->get_option('siteurl'));
+					
+					if (!in_array($url, (array)$arURLs))
+					{
+						
+						$this->addBackendMessage('nohspc_'.wpsg_translate(__('<b>wpShopGermany:</b> Bitte registrieren Sie diese Domain. Sie kÃ¶nnen dies ganz einfach im <a href="#1#">Lizenzmanager</a> durchfÃŒhren.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung'));
+						
+					}
+					
+				}
+				
+			}
+			
 			if (
 				$this->get_option("wpsg_version_installed", true) != false &&
-				$this->get_option("wpsg_version_installed", true) != WPSG_VERSION &&
-				$this->get_option('wpsg_message_db') != '1')
-			{
-
+				$this->get_option("wpsg_version_installed", true) != WPSG_VERSION && 
+				$this->get_option('wpsg_message_db') != '1')				
+			{
+				
 				$this->addBackendError('nohspc_'.wpsg_translate(
 					__('Ihre Datenbankversion ist nicht auf dem aktuellen Stand, aktualisieren Sie die Datenbank, indem Sie <a href="#1#">hier</a> klicken.<br />Klicken Sie <a href="#1#">hier</a>, um die Meldung auszublenden.', 'wpsg'),
-						wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein&do=update&submit=1&noheader=1', 'wpsg-admin-db-update'),
+					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein&do=update&submit=1&noheader=1',
 					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message=wpsg_message_soaphint&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
 				));
-
-			}
-
+				
+			}
+			
+			if (!is_object($this->getDefaultCountry()))
+			{
+				
+				$this->addPersistentBackendError(wpsg_translate(
+					__('Es wurde kein Standardland definiert, der Shop kann so nicht korrekt betrieben werden. Bitte ÃŒberprÃŒfen Sie die <a href="#1#">LÃ€nderkonfiguration</a>.', 'wpsg'),
+					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender'
+				), 'wpsg_message_nodefaultcountry');
+				
+			}
+			
+			if (!class_exists('SoapClient') && $this->get_option('wpsg_message_soaphint') != '1')
+			{
+				
+				$this->addPersistentBackendError(wpsg_translate(
+					__('Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. Eine Registrierung Ihrer Domain ist somit nicht mÃ¶glich! <br />Weitere Informationen finden Sie in unseren <a target="_blank" href="http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/">FAQ</a>. Klicken Sie <a href="#1#">hier</a>, um die Meldung auszublenden.', 'wpsg'),
+					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message=wpsg_message_soaphint&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
+				),
+            	'wpsg_message_nosoap');
+
+			}
+
+			if (@$_REQUEST['subaction'] != 'seiten' && ($this->get_option('wpsg_page_basket') === false || $this->get_option('wpsg_page_basket') <= 0 || !get_page($this->get_option('wpsg_page_basket'))))
+			{
+								
+				// Keine Warenkorbseite definiert
+				$this->addPersistentBackendError(
+					wpsg_translate(
+						__('Bitte ÃŒberprÃŒfen Sie die <a href="#1#">Seitenkonfiguration</a>. Die Warenkorbseite muss korrekt angegeben sein, sonst funktioniert der Shop nicht.', 'wpsg'),
+						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=seiten'
+					),
+					'wpsg_messsage_basketpage'
+				);
+				
+			}
+			
+			// Schreibrechte auf der Sprachdatei
+			if (file_exists(WPSG_PATH_TRANSLATION) && !is_writable(WPSG_PATH_TRANSLATION)) { $this->addBackendError('nohspc_'.__('<b>wpShopGermany:</b> Sprachdatei kann nicht geschrieben werden! PrÃŒfen Sie die Schreibrechte auf folgender Datei:<br /><b>'.WPSG_PATH_TRANSLATION.'</b>', 'wpsg')); }
+			
+			// Kundenmailanhang prÃŒfen
+			if (wpsg_isSizedString($this->get_option('wpsg_kundenmail_attachfile')) && !file_exists(wpsg_getUploadDir('wpsg_mailconf').$this->get_option('wpsg_kundenmail_attachfile'))) 
+				$this->addBackendError('nohspc_'.wpsg_translate(__('Es ist ein Anhang der Kundenmail definiert, die Datei wurde aber nicht gefunden. <a href="#1#">Zur E-Mail Konfiguration</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf'));
+			
+			// Alte UserViews checken
+			if (file_exists(WPSG_PATH_USERVIEW_OLD))
+			{
+				
+				$this->addPersistentBackendError(wpsg_translate(
+					__('Es existieren noch alte angepasste Templates unter #1#. Kopieren Sie diese bitte nach #2#. ZukÃŒnftig werden die Templateanpassungen nicht mehr im Pluginverzeichnis gesucht. Weitere Informationen erhalten Sie auch <a href="#3#">hier</a> oder auch in unserem kostenlosen <a href="#4#">Forum</a>.', 'wpsg'),
+					WPSG_PATH_USERVIEW_OLD,
+					WPSG_PATH_USERVIEW,
+					'http://wpshopgermany.maennchen1.de/?p=5130',
+					'http://forum.maennchen1.de'
+           		), 'wpsg_message_olduserview');
+				
+			}
+			
+			if (!wpsg_isSizedString($this->get_option('wpsg_shopdata_name')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_owner')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_tel')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_fax')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_email')) &&
+            	!wpsg_isSizedString($this->get_option('wpsg_shopdata_street')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_zip')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_city')) &&
+             	!wpsg_isSizedString($this->get_option('wpsg_shopdata_bank_owner')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_bank_iban')) && !wpsg_isSizedString($this->get_option('wpsg_shopdata_bank_bic')))
+			{
+				
+				$this->addBackendError(wpsg_translate(
+            		'nohspc_'.__('Sie haben die Angaben zum Shop noch nicht ausgefÃŒllt. Klicken sie <a href="#1#">hier</a> um die Angaben zu vervollstÃ€ndigen.', 'wpsg'),
+					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=shopdata'
+				), 'wpsg_message_shopdata');
+				
+			}
+			
+			if (!$this->hasMod('wpsg_mod_ordercondition'))
+			{
+			
+				$this->addPersistentBackendError(wpsg_translate(
+            		__('Ab der wpShopGermany Version 3.4 kann das kostenlose Modul "<a href="#1#">Bestellbedingungen</a>" verwendet werden. Sie kÃ¶nnen es <a href="#2#">hier</a> konfigurieren. ÃberprÃŒfen Sie auch die anderen Ãnderungen, die wir <a href="#3#">in unserem Artikel</a> nÃ€her erlÃ€utern.', 'wpsg'),
+					'http://wpshopgermany.maennchen1.de/?p=13232',
+					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition',
+					'http://wpshopgermany.maennchen1.de/?p=13952'
+				), 'wpsg_message_ordercondition_34');
+								
+			}
+			
 			$this->callMods('checkGeneralBackendError');
-
+			
 			/** Schreibrechte auf dem Pluginverzeichnis um Module zu installieren
-
-			if (!is_writable(WPSG_PATH) && $this->get_option('wpsg_message_pluginwrite') != '1') $this->addBackendError('nohspc_'.wpsg_translate(__('<b>wpShopGermany:</b> Das Pluginverzeichnis (#1#) ist nicht durch den Webserver beschreibbar. Die wpShopGermany Module lassen sich mÃ¶glicherweise nicht automatisch installieren. Klicken Sie <a href="#2#">hier</a>, um die Meldung auszublenden.', 'wpsg'),
+			  
+			if (!is_writable(WPSG_PATH) && $this->get_option('wpsg_message_pluginwrite') != '1') $this->addBackendError('nohspc_'.wpsg_translate(__('<b>wpShopGermany:</b> Das Pluginverzeichnis (#1#) ist nicht durch den Webserver beschreibbar. Die wpShopGermany Module lassen sich mÃ¶glicherweise nicht automatisch installieren. Klicken Sie <a href="#2#">hier</a>, um die Meldung auszublenden.', 'wpsg'), 
 				WPSG_PATH,
 				WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message=wpsg_message_pluginwrite&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
 			));
-
+			
 			*/
-
+			
 		} // public function checkGeneralBackendError()
-
+		
 		/**
 		 * Wird von Wordpress aufgerufen ÃŒber add_filter('wp_head ...
@@ -4328,9 +3074,9 @@
 		public function wp_head()
 		{
-
+			
 			echo '<!-- wpShopGermany Version '.WPSG_VERSION.' -->';
-
+						
 			$this->callMods('wp_head');
-
+			
 		} // public function wp_head()
 
@@ -4340,45 +3086,49 @@
 		public function wp_foot()
 		{
-
+			
 			// Variable wird mein anzeigen eines Warenkorbes oder beim Anzeigen eines Produktes aufgerufen
 			// Widget kann dies auch auslÃ¶sen
 			if ($this->get_option('wpsg_geo_determination') !== '4')
 			{
-
+			
 				$default_country = $this->getDefaultCountry();
-
+			
 				if ($this->showEULayer && wpsg_geo_code() != strtolower($default_country->kuerzel))
 				{
-
+				
 					// Wurde der Dialog schon beantwortet?
 					if (!isset($_SESSION['wpsg']['priceDialog']) || $_SESSION['wpsg']['priceDialog'] !== true)
 					{
-
+					
 						echo '<script type="text/javascript">/* <![CDATA[ */';
-
+											
 						//echo 'jQuery(document).ready(function() { wpsg_customerquestion("'.$this->getCurrentURL().'"); } );';
-
+						
 						//Lieber die REQUEST_URI, damit alle _GET Variablen erhalten bleiben
 						echo 'jQuery(document).ready(function() { wpsg_customerquestion("'.$_SERVER['REQUEST_URI'].'"); } );';
-
-						echo '/* ]]> */</script>';
-
+						
+						echo '/* ]]> */</script>'; 
+						
 					}
-
-				}
-
-			}
-
-			if (($this->hasFrontendError() || $this->hasFrontendMessage()) && $this->bMessageOut === false)
-			{
-
-				echo $this->render(WPSG_PATH_VIEW.'warenkorb/messageDialog.phtml');
-
-			}
-
+					 
+				}
+				
+			}
+			
 			$this->callMods('wp_foot');
-
+			
 		} // public function wp_foot()
-
+		
+		/**
+		 * LÃ¶scht eine einzellne Bestellung und  alle AbhÃ€ngigkeiten
+		 */
+		public function delOrder($order_id)
+		{
+			
+			$oOrder = wpsg_order::getInstance($order_id);
+			$oOrder->delete();
+									
+		} // public function delOrder()
+		
 		/**
 		 * Verteilt den Wert $value auf die MwSt SÃ€tze in $arBasket
@@ -4387,55 +3137,37 @@
 		public function subMwSt(&$arBasket, $value)
 		{
-
-			if (wpsg_tf($value) <= 0) return 0;
-
-			$price_option = WPSG_BRUTTO; //$this->get_option('wpsg_preisangaben');
-			//if (isset($arBasket['price_frontend']))
-			//	$price_option = $arBasket['price_frontend'];
-
+					
 			// Anteilig auf die SÃ€tze verteilen
 			foreach ((array)$arBasket['mwst'] as $mw_id => $mw)
 			{
-
+				 
 				if ($mw['base_value'] > 0)
 				{
-					if (($price_option == WPSG_BRUTTO))
-					{
-						$proz = $mw['base_value'] / $arBasket['sum']['preis_brutto'];
-
-						$arBasket['mwst'][$mw_id]['base_value'] -= $proz * $value;
-						$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_BRUTTO, $mw['value']);
-
-					}
-					else
-					{
-						$proz = $mw['base_value'] / $arBasket['sum']['preis_netto'];
-
-						$arBasket['mwst'][$mw_id]['base_value'] -= $proz * $value;
-						$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_NETTO, $mw['value']);
-
-					}
-
-				}
-
-			}
-
+					
+					$proz = $mw['base_value'] / $arBasket['sum']['preis_brutto'];	
+									
+					$arBasket['mwst'][$mw_id]['base_value'] -= $proz * $value;										
+					$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_BRUTTO, $mw['value']);
+					 
+				}
+				
+			} 
+			
 			// Mehrwertsteuer Summe korrigieren
-			$sum_mwst = 0;
 			foreach ($arBasket['mwst'] as $mw_id => $mw)
 			{
-
+				
 				$sum_mwst += $arBasket['mwst'][$mw_id]['sum'];
-
-			}
-
+				
+			}
+			
 			$sub = $arBasket['sum']['mwst'];
-
+			
 			$arBasket['sum']['mwst'] = abs($sum_mwst);
-
-			return $sub - $arBasket['sum']['mwst'];
-
+						
+			return $sub - $arBasket['sum']['mwst']; 
+			
 		} // public function subMwSt(&$arBasket, $value)
-
+		
 		/**
 		 * Ermittelt den zu besteuernden Teil eines Nettowertes und verteilt ihn auf die MwSt. SÃ€tze in $arBasket
@@ -4444,56 +3176,38 @@
 		public function addMwSt(&$arBasket, $value)
 		{
-
+			
 			if (wpsg_tf($value) <= 0) return 0;
-
-			$price_option = WPSG_BRUTTO; //$this->get_option('wpsg_preisangaben');
-			//if (isset($arBasket['price_frontend']))
-			//	$price_option = $arBasket['price_frontend'];
-
-			// Anteilig auf die SÃ€tze verteilen
+			
 			foreach ((array)$arBasket['mwst'] as $mw_id => $mw)
 			{
-
+				
 				if ($mw['base_value'] > 0)
 				{
-					if (($price_option == WPSG_BRUTTO))
-					{
-						$proz = $mw['base_value'] / $arBasket['sum']['preis_brutto'];
-
-						$arBasket['mwst'][$mw_id]['base_value'] -= wpsg_calculatePreis($proz * $value, WPSG_BRUTTO, $mw['value']);
-						$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_BRUTTO, $mw['value']);
-
-					}
-					else
-					{
-						$proz = $mw['base_value'] / $arBasket['sum']['preis_netto'];
-
-						//$arBasket['mwst'][$mw_id]['base_value'] -= wpsg_calculatePreis($proz * $value, WPSG_NETTO, $mw['value']);
-						$arBasket['mwst'][$mw_id]['base_value'] -= $proz * $value;
-						$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_NETTO, $mw['value']);
-
-					}
-
-				}
-
-			}
-
+					
+					$proz = $mw['base_value'] / $arBasket['sum']['preis_brutto'];
+					
+					$arBasket['mwst'][$mw_id]['base_value'] -= wpsg_calculatePreis($proz * $value, WPSG_BRUTTO, $mw['value']);					
+					$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_BRUTTO, $mw['value']);
+					  
+				}
+				
+			}
+			
 			// Mehrwertsteuer Summe korrigieren
-			$sum_mwst = 0.0;
 			foreach ($arBasket['mwst'] as $mw_id => $mw)
 			{
-
+				
 				$sum_mwst += $arBasket['mwst'][$mw_id]['sum'];
-
-			}
-
+				
+			}
+			
 			$sub = $arBasket['sum']['mwst'];
-
+			
 			$arBasket['sum']['mwst'] = abs($sum_mwst);
-
-			return $sub - $arBasket['sum']['mwst'];
-
+			
+			return $sub - $arBasket['sum']['mwst']; 
+			
 		} // public function addMwSt(&$arBasket, $value)
-
+		
 		/**
 		 * Gibt den Wert einer benutzerdefinierten Kundenvariable zurÃŒck wenn die Bestellung noch nicht in der Datenbank ist
@@ -4501,15 +3215,15 @@
 		public function getCustomerFieldFromSession($field_id)
 		{
-
+			
 			if (!isset($_SESSION['wpsg']['checkout']['custom'][$field_id])) return;
-
+			
 			$pflicht = $this->loadPflichtFeldDaten();
-
+			
 			if (!is_array($pflicht) || !isset($pflicht['custom'][$field_id])) return;
-
+			
 			return $_SESSION['wpsg']['checkout']['custom'][$field_id];
-
+			
 		} // public function getCustomerFieldFromSession($field_id)
-
+		
 		/**
 		 * Gibt den Wert einer benutzerdefinierten Kundenvariable zurÃŒck wenn die Bestellung schon in der Datenbank ist
@@ -4517,44 +3231,43 @@
 		public function getCustomFieldFromDB($customer_id, $field_id)
 		{
-
+			
 			$kunde_data = $this->cache->loadKunden($customer_id);
 			$kunde_data['custom'] = @unserialize($kunde_data['custom']);
 
 			if (!is_array($kunde_data)) return;
-
+			
 			if (!isset($kunde_data['custom'][$field_id])) return;
-
+			
 			$pflicht = $this->loadPflichtFeldDaten();
-
+			
 			if (!is_array($pflicht) || !isset($pflicht['custom'][$field_id])) return;
-
+			
 			return $kunde_data['custom'][$field_id];
-
+			
 		} // public function getCustomFieldFromDB($customer_id, $field_id)
-
+		
 		/**
 		 * Setzt eine Zahlung fÃŒr eine Bestellung
-		 *
+		 * 
 		 * Gibt true zurÃŒck wenn die Bestellung komplett beglichen werden kann
-		 *
-		 */
-		public function setPayMent($order_id, $pay_amount) {
-
+		 * 
+		 */
+		public function setPayMent($order_id, $pay_amount)
+		{
+			
 			$order_data = $this->cache->loadOrder($order_id);
-
-			$oOrder = wpsg_order::getInstance(intval($order_id));
-
-			if (round(doubleval($oOrder->getToPay(WPSG_BRUTTO)), 2) == round(doubleval($pay_amount), 2))
-			{
-
+			
+			if (round(doubleval($order_data['price_gesamt']), 2) == round(doubleval($pay_amount), 2))
+			{
+				
 				// Alles grÃŒn, Zahlung stimmt mit Bestellwert ÃŒberein
 				return true;
-
+				
 			}
 			else
 			{
-
+				
 				$logTitle = wpsg_translate(__('Versuchte Zahlung ÃŒber #1#.', 'wpsg'), wpsg_ff($pay_amount, $this->get_option('wpsg_currency')));
-
+				
 				// Hier mal was ins Log schreiben
 				$this->db->ImportQuery(WPSG_TBL_OL, array(
@@ -4564,11 +3277,11 @@
 					"mailtext" => wpsg_q(print_r($_REQUEST, 1)."\r\n".print_r($_SERVER, 1))
 				));
-
-			}
-
+				
+			}
+			
 			return false;
-
+			
 		} // public function setPayMent($order_id, $pay_amount)
-
+		
 		/**
 		 * LÃ€dt die Daten fÃŒr die Pflichtfelder und beachtet die Ãbersetzungen
@@ -4576,73 +3289,43 @@
 		public function loadPflichtFeldDaten()
 		{
-
+			
 			$arPflicht = $this->get_option('wpsg_admin_pflicht');
-
-			if (!wpsg_isSizedArray($arPflicht)) {
-				$arPflicht = array();
-				$arPflicht['anrede'] 		 = '1';
-				$arPflicht['anrede_auswahl'] = 'Herr|Frau';
-				$arPflicht['firma'] 		 = '1';
-				$arPflicht['vname']			 = '1';
-				$arPflicht['name'] 			 = '1';
-				$arPflicht['geb'] 			 = '1';
-				$arPflicht['email'] 		 = '1';
-				$arPflicht['emailconfirm']   = '1';
-				$arPflicht['tel'] 			 = '1';
-				$arPflicht['fax'] 			 = '1';
-				$arPflicht['strasse'] 		 = '1';
-				$arPflicht['wpsg_showNr'] 	 = '0';
-				$arPflicht['plz'] 			 = '1';
-				$arPflicht['ort'] 			 = '1';
-				$arPflicht['land'] 			 = '1';
-				$arPflicht['ustidnr'] 		 = '1';
-				
-			}
+			
 			// Mann|Frau usw. ÃŒbersetzen
-			$arPflicht['anrede_auswahl'] = __($arPflicht['anrede_auswahl'], 'wpsg');
+			$arPflicht['anrede_auswahl'] = __($arPflicht['anrede_auswahl'], 'wpsg'); 
 
 			if (wpsg_isSizedArray($arPflicht['custom']))
 			{
-
+			
 				foreach ($arPflicht['custom'] as $k => $v)
 				{
-
-					$arPflicht['custom'][$k]['name']    = __($arPflicht['custom'][$k]['name'],    'wpsg');
+					
+					$arPflicht['custom'][$k]['name'] = __($arPflicht['custom'][$k]['name'], 'wpsg');
 					$arPflicht['custom'][$k]['auswahl'] = __($arPflicht['custom'][$k]['auswahl'], 'wpsg');
-
-				}
-
-			}
-
+					
+				}
+			
+			}
+			
 			return $arPflicht;
-
+			
 		} // public function loadPflichtFeldDaten()
-
+		
 		/**
 		 * Baut die Bestellnummer
 		 */
-		public function buildONR($o_id, $k_id, $knr) {
-
-			if (!wpsg_isSizedInt($o_id)) {
-				
-				$o_id = $this->db->ImportQuery(WPSG_TBL_ORDER, [
-					'cdate' => 'NOW()',
-					'status' => wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)
-				]);
-				
-				$_SESSION['wpsg']['order_id'] = $o_id;
-				
-			}
+		public function buildONR($o_id, $k_id, $knr)
+		{
 			
 			$onr_modul = "";
 			if ($this->callMods('buildONR', array(&$k_id, &$o_id, &$onr_modul)) === false)
 			{
-
+			
 				return $onr_modul;
-
-			}
-
+			
+			}
+			
 			$onr = $this->get_option('wpsg_order_start');
-
+				
 			if (trim($this->get_option('wpsg_format_onr')) == '')
 			{
@@ -4653,30 +3336,30 @@
 				$format = $this->get_option('wpsg_format_onr');
 			}
-
+				
 			$arReplace = array(
-                '/%Y%/' => date('Y'),
-                '/%m%/' => date('m'),
-                '/%d%/' => date('d'),
-                '/%H%/' => date('H'),
-                '/%i%/' => date('i'),
-                '/%s%/' => date('s'),
-                '/%oid%/' 		=> $o_id,
-                '/%onr%/' 		=> $onr,
-                '/%order_onr%/' => $onr,
-                '/%kid%/' 		=> $k_id,
-                '/%knr%/' 		=> $knr,
-                '/%kunde_knr%/' => $knr
+					'/%Y%/' => date('Y'),
+					'/%m%/' => date('m'),
+					'/%d%/' => date('d'),
+					'/%H%/' => date('H'),
+					'/%i%/' => date('i'),
+					'/%s%/' => date('s'),
+					'/%oid%/' => $o_id,
+					'/%onr%/' => $onr,
+					'/%order_onr%/' => $onr,
+					'/%kid%/' => k_id,
+					'/%knr%/' => $knr,
+					'/%kunde_knr%/' => $knr
 			);
-
+				
 			$strReturn = preg_replace(array_keys($arReplace), array_values($arReplace), $format);
 			$strReturn = $this->replaceUniversalPlatzhalter($strReturn, $o_id, $k_id);
-
+				
 			// Bestellnummer ZÃ€hler hochzÃ€hlen
 			$this->update_option('wpsg_order_start', intval($this->get_option('wpsg_order_start')) + 1);
-
+			
 			return $strReturn;
-
+				
 		} // private function buildONR($o_id, $k_id)
-
+		
 		/**
 		 * Erstellt die Kundennummer (Wird vom Basket bei Bestellung und vom Kundenmodul bei Registrierung genutzt)
@@ -4684,15 +3367,15 @@
 		public function buildKNR($k_id)
 		{
-
+			
 			$knr_modul = "";
 			if ($this->callMods('buildKNR', array(&$k_id, &$knr_modul)) === false)
 			{
-
+				 
 				return $knr_modul;
-
-			}
-
+				
+			} 
+			
 			$knr = $this->get_option('wpsg_customer_start');
-
+			
 			if (trim($this->get_option('wpsg_format_knr')) == '')
 			{
@@ -4703,5 +3386,5 @@
 				$format = $this->get_option('wpsg_format_knr');
 			}
-
+			
 			$arReplace = array(
 				'/%Y%/' => date('Y'),
@@ -4711,20 +3394,30 @@
 				'/%i%/' => date('i'),
 				'/%s%/' => date('s'),
-				'/%knr%/' 	=> $knr,
-				'/%kid%/' 	=> $k_id,
-				'/%kunde_id%/'  => $k_id,
+				'/%knr%/' => $knr,
+				'/%kid%/' => $k_id,
+				'/%kunde_id%/' => $k_id,
 				'/%kunde_knr%/' => $knr,
-				'/%id%/' 	=> $k_id
+				'/%id%/' => $k_id
 			);
-
+			
 			$strReturn = preg_replace(array_keys($arReplace), array_values($arReplace), $format);
 			$strReturn = $this->replaceUniversalPlatzhalter($strReturn, false, $k_id);
-
+			
 			// Kundennummer ZÃ€hler hochzÃ€hlen
 			$this->update_option('wpsg_customer_start', intval($this->get_option('wpsg_customer_start')) + 1);
-
+			
 			return $strReturn;
-
+			
 		} // private function buildKNR($k_id)
+		
+		/**
+		 * Wird aufgerufen wenn ein Fehler im Shop aufgetreten ist
+		 */
+		public function throwErrorCode($code)
+		{
+			
+			die(wpsg_translate(__('Systemfehler! Fehlercode:#1#', 'wpsg'), $code));
+			
+		} // public function throwErrorCode($code)
 
 		/**
@@ -4734,5 +3427,5 @@
 		public function mergeShipping($arShipping1, $arShipping2)
 		{
-
+					
 			/*
 			wpsg_debug("merge");
@@ -4740,371 +3433,335 @@
 			wpsg_debug($arShipping2);
 			*/
-
+						
 			$arReturn = array();
-
+			 
 			$arIntersect = array_intersect($arShipping1, $arShipping2);
-
+									
 			if (wpsg_isSizedArray($arIntersect) && (sizeof($arIntersect) > 1 || !array_search('130', $arIntersect)))
 			//if (wpsg_isSizedArray($arIntersect))
 			{
-
+				
 				$arReturn = $arIntersect;
-
+				
 			}
 			else
 			{
-
+			
 				// Jedes mit jedem prÃŒfen
 				foreach ($arShipping1 as $shipping1)
 				{
-
+					
 					foreach ($arShipping2 as $shipping2)
 					{
-
+						
 						if (is_array($shipping1))
 						{
-
+	 
 							if (!in_array($shipping2, $shipping1))
 							{
-
+													
 								$s_merge = $shipping1;
 								$s_merge[] = $shipping2;
-
+							
 								// Ob die Kombination im RÃŒckgabe Array schon gefunden wurde
 								$bFoundKombination = false;
-
+								 
 								foreach ($arReturn as $r)
 								{
-
-									$__tmp_diff = array_diff($r, $s_merge);
-									if (!wpsg_isSizedArray($__tmp_diff))
+									
+									if (!wpsg_isSizedArray(array_diff($r, $s_merge)))
 									{
-
+										
 										$bFoundKombination = true; break;
-
+										
 									}
-
+									
 								}
-
+								
 								if (!$bFoundKombination)
 								{
-
+									 
 									$arReturn[] = $s_merge;
-
+									
 								}
-
+								
 							}
 							else
 							{
-
+								
 								$bDrin = false;
-
+								
 								foreach ($arReturn as $r)
 								{
-
-									if (is_array($r)) { $__tmp_diff2 = array_diff($r, $shipping1); if (!wpsg_isSizedArray($__tmp_diff2)) $bDrin = true; }
-
+									
+									if (is_array($r) && !wpsg_isSizedArray(array_diff($r, $shipping1))) $bDrin = true;
+									
 								}
-
+								
 								if (!$bDrin) $arReturn[] = $shipping1;
-
+								
 							}
-
+							
 						}
 						else
 						{
-
+						
 							// Ob die Kombination im RÃŒckgabe Array schon gefunden wurde
 							$bFoundKombination = false;
-
+							
 							foreach ($arReturn as $r)
 							{
-
+								
 								if (in_array($shipping1, $r) && in_array($shipping2, $r))
 								{
-
+									
 									$bFoundKombination = true; break;
-
+																	
 								}
-
+								
 							}
-
-							if (!$bFoundKombination)
+							
+							if (!$bFoundKombination) 
 							{
-
+								
 								$arReturn[] = array($shipping1, $shipping2);
-
+								
 							}
-
+							
 						}
-
+						
 					}
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			 
 			return $arReturn;
-
+			
 		} // private function mergeShipping($arShipping1, $arShipping2)
-
+		
 		/**
 		 * Gibt den Namen der Versandart zurÃŒck
-		 * Ist notwendig geworden, da die Versandarten zusammengefÃŒgt wurden.
-		 * In $this->arShipping sind schon die zusammengefÃŒgten Pakete drin
-		 */
-		public function getShippingName($shipping_key, $lookAll = false) {
-
-			if ($lookAll) $arShipping = $this->arShippingAll;
-			else $arShipping = $this->arShipping;
-			
-			if (array_key_exists($shipping_key, $arShipping)) {
-
-				return __($this->arShipping[$shipping_key]['name'], 'wpsg');
-
-			} else {
-
-				return wpsg_translate(__('Deaktivierte Versandart (#1#)', 'wpsg'), $shipping_key);
-
-			}
-
-		} // public function getShippingName($shipping_key)
-
-		/**
-		 *
-		 * DEPRECATED: Lieber direkt ÃŒber wpsg_order_product oder wpsg_product gehen
-		 * Hier ist auch kein Productkey verwendet also wird der Variantenname nicht gezogen
-		 *
+		 * Ist notwendig geworden, da die Versandarten zusammengefÃŒgt wurden. 
+		 * In $this->arShipping sind schon die zusammengefÃŒgten Pakete drin 
+		 */
+		public function getShippingName($shipping_key)
+		{
+			
+			if (array_key_exists($shipping_key, $this->arShipping)) 
+			{ 
+				
+				return __($this->arShipping[$shipping_key]['name'], 'wpsg'); 
+			
+			} 
+			else
+			{
+				
+				return __($this->arShipping[$this->view['basket']['checkout']['shipping']]['sub'][$shipping_key]['name'], 'wpsg');
+				
+			}
+			
+		} // public function getShippingName($shipping_key)		
+		
+		/**
 		 * Gibt den Produktnamen als HTML zurÃŒck
-		 * - Wenn Detailname, dann der Detailname
+		 * - Wenn Detailname, dann der Detailname 
 		 * - Box^4 wird in Box<span class="wpsg_upper">4</div>
 		 * @param bool $detailname Wenn auf true, dann wird der Detailname verwendet wenn vorhanden
 		 * @param int $product_id ID des Produktes
 		 */
-		public function getProductName($product_id, $detailname = false) {
-
+		public function getProductName($product_id, $detailname = false)
+		{
+			
 			$oProduct = wpsg_product::getInstance($product_id);
-			return $oProduct->getProductName($detailname);
-
+			
+			if (wpsg_isSizedString($oProduct->detailname) && $detailname === true)
+			{
+				
+				$strName = $oProduct->detailname;
+				
+			}
+			else
+			{
+			
+				$strName = $oProduct->name;
+				
+			}
+			
+			if (strpos($strName, '^') !== false)
+			{
+
+				$strName = preg_replace('/\^/', '<span class="wpsg_upper">', $strName).'</span>';
+				
+			}
+			
+			return $strName;
+			
 		} // public function getProductName($product_id)
-
+		
 		/**
 		 * ÃberprÃŒft die vorhandenen Versandarten und entfernt Versandarten die im Warenkorb nicht erlaubt sind
 		 */
-		public function checkShippingAvailable() {
-
-			$arShippingNew = array();
- 			
-			$this->callMods('checkShippingAvailable_pre', array(&$this->arShipping));
-
+		public function checkShippingAvailable()
+		{
+			
+			//echo '<pre>';debug_print_backtrace();echo '</pre>'; wpsg_debug("OK");
+			
 			// Damit es auch ohne View aus wpsg_basket.class beim prÃŒfen der Versandarten aufgerufen werden kann
 			if (!wpsg_isSizedArray($this->view['basket'])) $this->view['basket'] = $this->basket->toArray();
-
-			if (wpsg_isSizedArray($this->view['basket']['produkte']) && !$this->bShippingMerged) {
-
+			
+			if (wpsg_isSizedArray($this->view['basket']['produkte']))
+			{
+				
 				$arSystemShippingAllowed = array_keys($this->arShipping);
-				$arProductShippingAllowd = $arSystemShippingAllowed;
-
-				$bDontMerge130 = wpsg_isSizedInt($this->get_option('wpsg_mod_willcollect_dontMerge'));
-				$bMerge130 = false;
-				$bMoreThen130Allowed = true;
-
-				// Schauen welche Versandarten ÃŒbrig bleiben
-				foreach ($this->view['basket']['produkte'] as $basket_product) {
-
+				
+				$bWillCollect = true;
+				
+				//wpsg_debug("Im System vorhandene Versandarten:".print_r($arSystemShippingAllowed, 1));
+				 
+				$i_merge = 0;
+				foreach ($this->view['basket']['produkte'] as $basket_product)
+				{
+					
 					$oProduct = $this->cache->loadProductObject($this->getProduktID($basket_product['id']));
-
-					if ($oProduct->hasLimitedShipping()) {
-						
-						$arSingleProductShippingAllowed = array_intersect($arSystemShippingAllowed, $oProduct->getAllowedShipping());
-						$arProductShippingAllowd = array_intersect($arProductShippingAllowd, $arSingleProductShippingAllowed);
-
-						if (sizeof($arSingleProductShippingAllowed) === 1 && in_array('130', $arSingleProductShippingAllowed)) $bMoreThen130Allowed = false;
-						else $bMoreThen130Allowed = $bMoreThen130Allowed && true;
-
+					
+					if ($oProduct->hasLimitedShipping())
+					{
+						
+						$arProductShippingAllowed = $oProduct->getAllowedShipping();
+
+						if (array_search('130', $arProductShippingAllowed) !== false) $bWillCollect = $bWillCollect && true;
+						else $bWillCollect = false;
+						
+						//wpsg_debug('Produkt '.$basket_product['name'].' erlaubte Versandarten:'.print_r($arProductShippingAllowed, 1));
+						//wpsg_debug('System '.print_r($arSystemShippingAllowed, 1));
+						
+						// ZusammenfÃŒgen
+						if ($i_merge === 0)
+						{
+						
+							$arSystemShippingAllowed = array_intersect($arSystemShippingAllowed, $arProductShippingAllowed);
+							
+						}
+						else 
+						{
+						
+							$arSystemShippingAllowed = $this->mergeShipping($arSystemShippingAllowed, $arProductShippingAllowed);
+							
+						}
+						
+						$i_merge ++;
+						
 					}
-					else $bMoreThen130Allowed = true;
-
-				}
-
-				if ($bMoreThen130Allowed === true && (!wpsg_isSizedArray($arProductShippingAllowd) || (sizeof($arProductShippingAllowd) == 1 && in_array('130', $arProductShippingAllowd)))) {
-
-					// Es ist keine Versandart ÃŒbrig geblieben oder nur Selbstabholung
-					// SofortÃŒberweisung soll zusÃ€tzlich drin bleiben die anderen aber kombiniert werden
-					// SofortÃŒberweisung rausnehmen
-					$arSystemShippingAllowedMerged = $arSystemShippingAllowed;
-
-					if (in_array('130', $arSystemShippingAllowed) && $bDontMerge130) unset($arSystemShippingAllowedMerged[array_search('130', $arSystemShippingAllowedMerged)]);
-
-					foreach ($this->view['basket']['produkte'] as $basket_product)
+					
+				}
+								
+				if (wpsg_isSizedArray($arSystemShippingAllowed) && !$this->shipping_alreadymerged)
+				{
+					
+					$this->shipping_alreadymerged = true;
+					
+					$arShippingNew = array();
+					
+					if ($this->hasMod('wpsg_mod_willcollect') && wpsg_isSizedInt($this->get_option('wpsg_mod_willcollect_aktiv')) && $bWillCollect === true && array_key_exists('130', $this->arShipping))
 					{
-
-						$oProduct = $this->cache->loadProductObject($this->getProduktID($basket_product['id']));
-
-						if ($oProduct->hasLimitedShipping())
+						
+						$arShippingNew['130'] = $this->arShipping['130'];
+						
+					}
+
+					foreach ($arSystemShippingAllowed as $shipping)
+					{
+						
+						if (is_array($shipping))
 						{
-
-							$arSingleProductShippingAllowed = array_intersect($arSystemShippingAllowed, $oProduct->getAllowedShipping());
-
-							if (in_array('130', $arSingleProductShippingAllowed) && $bDontMerge130)
+							
+							asort($shipping, SORT_STRING);
+							
+							$subKey = implode('-', $shipping);
+														
+							$arShippingNew[$subKey] = array(
+								'id' => $subKey,
+								'sub' => array(),
+								'price' => 0
+							);
+							
+							foreach ($shipping as $subShipping)
 							{
-
-								unset($arSingleProductShippingAllowed[array_search('130', $arSingleProductShippingAllowed)]);
-								if (wpsg_isSizedArray($arSingleProductShippingAllowed) > 0) $arSystemShippingAllowedMerged = $this->mergeShipping($arSystemShippingAllowedMerged, $arSingleProductShippingAllowed);
-								else
-								{
-
-									//$arSystemShippingAllowedMerged = array();
-									$bMerge130 = true;
-
-								}
-
+								
+								$sub = $this->arShipping[$subShipping];
+								
+								$arShippingNew[$subKey]['name'] = implode(' + ', wpsg_trim(array_merge(array($sub['name']), (array)explode(',', $arShippingNew[$subKey]['name']))));
+								$arShippingNew[$subKey]['hint'] = implode('<br /><br />', wpsg_trim(array_merge(array($sub['hint']), (array)explode(',', $arShippingNew[$subKey]['hint']))));
+								
+								if (isset($arShippingNew[$subKey]['price'])) $arShippingNew[$subKey]['price'] = $arShippingNew[$subKey]['price'] + $sub['price'];
+								else if (isset($sub['price'])) $arShippingNew[$subKey]['price'] = $sub['price'];
+								
+								$arShippingNew[$subKey]['sub'][$subShipping] = $sub;
+								
 							}
-							else
+							
+						}
+						else
+						{
+							
+							$arShippingNew[$shipping] = $this->arShipping[$shipping];
+							
+						}
+																		
+					}
+					
+					$this->arShipping = $arShippingNew;
+
+					//wpsg_debug("Zur verfÃŒgung stehende Versandarten: ".print_r($arShippingNew, 1));
+					
+				}
+				
+			}
+						
+			$this->callMods('checkShippingAvailable', array(&$this->arShipping, &$this->view['basket']));
+			
+		} // public function checkShippingAvailable()
+		
+		/**
+		 * ÃberprÃŒft die vorhandenen Zahlungsarten und entfernt Zahlungsarten die im Warenkorb nicht elaubt sind
+		 */
+		public function checkPaymentAvailable()
+		{
+
+			if (wpsg_isSizedArray($this->view['basket']['produkte']))
+			{
+
+				foreach ($this->view['basket']['produkte'] as $basket_product)
+				{
+					
+					$oProduct = $this->cache->loadProductObject($this->getProduktID($basket_product['id']));
+					 
+					if ($oProduct->hasLimitedPayment())
+					{
+						
+						$arPaymentAllowed = $oProduct->getAllowedPayment();
+						
+						foreach ($this->arPayment as $payment_key => $payment)
+						{
+						 
+							if (!in_array($payment['id'], $arPaymentAllowed))
 							{
-
-								$arSystemShippingAllowedMerged = $this->mergeShipping($arSystemShippingAllowedMerged, $arSingleProductShippingAllowed);
-
+								 
+								unset($this->arPayment[$payment_key]);
+								
 							}
-
+							
 						}
-
+						
 					}
-
-				} else {
-
-					$arSystemShippingAllowedMerged = $arProductShippingAllowd;
-
-				}
-
-				// Selbstabholung wieder mit rein
-				if ($bDontMerge130 && in_array('130', $arProductShippingAllowd) && !in_array('130', $arSystemShippingAllowedMerged)) $arSystemShippingAllowedMerged[] = '130';
-
-				if ($bMerge130 && wpsg_isSizedArray($arSystemShippingAllowedMerged[0]) > 0 && !in_array('130', $arSystemShippingAllowedMerged)) {
-
-					$arSystemShippingAllowedMerged[0][] = '130';
-
-				}
-
-				//$arSystemShippingAllowedMerged = wpsg_trim($arSystemShippingAllowedMerged);
-
-				foreach ($arSystemShippingAllowedMerged as $shipping) {
-
-					if (is_array($shipping)) {
-
-						asort($shipping, SORT_STRING);
-
-						$subKey = implode('-', $shipping);
-
-						$arShippingNew[$subKey] = array(
-							'id' => $subKey,
-							'sub' => array(),
-							'price' => 0
-						);
-
-						foreach ($shipping as $subShipping) {
-
-							$sub = $this->arShipping[$subShipping];
-
-                            $arShippingNew[$subKey]['tax_key'] = '';
-							$arShippingNew[$subKey]['name'] = implode(' + ', wpsg_trim(array_merge(array($sub['name']), (array)explode(',', wpsg_getStr($arShippingNew[$subKey]['name'])))));
-							$arShippingNew[$subKey]['hint'] = implode('<br /><br />', wpsg_trim(array_merge(array($sub['hint']), (array)explode(',', wpsg_getStr($arShippingNew[$subKey]['hint'])))));
-							
-							// w-50
-							$arPriceSub = explode('-', $sub['price']);
-							
-							//if (isset($arShippingNew[$subKey]['price'])) $arShippingNew[$subKey]['price'] = $arShippingNew[$subKey]['price'] + $arPriceSub[1];
-							//else if (isset($sub['price'])) $arShippingNew[$subKey]['price'] = $arPriceSub[1];
-							 
-							//if (isset($arShippingNew[$subKey]['price'])) $arShippingNew[$subKey]['price'] = $arShippingNew[$subKey]['price'] + $sub['price'];
-							//else if (isset($sub['price'])) $arShippingNew[$subKey]['price'] = $sub['price'];
-							
-							$arShippingNew[$subKey]['sub'][$subShipping] = $sub;
-
-						}
-
-					} else {
-
-						$arShippingNew[$shipping] = $this->arShipping[$shipping];
-
-					}
-
-				}
-					
-				$this->arShipping = $arShippingNew;
-				$this->bShippingMerged = true;
-
-			}
-			
-			// UnschÃ¶ne Warnungen verhindern, sollte hier der Array null sein
-			if (!wpsg_isSizedArray($this->arShipping)) $this->arShipping = array();
-
-			$this->callMods('checkShippingAvailable', array(&$this->arShipping));
-			
-		} // public function checkShippingAvailable()
-
-		/**
-		 * ÃberprÃŒft die vorhandenen Zahlungsarten und entfernt Zahlungsarten die im Warenkorb nicht elaubt sind
-		 */
-		public function checkPaymentAvailable() {
-
-			$sum_basket = \wpsg\wpsg_calculation::getSessionCalculation()->getToPay(WPSG_NETTO);
-			 
-			if ($sum_basket <= 0) {
-				
-				// Neue ab 13.01.2020
-				// Wenn <= 0 Euro, wird kostenlos als Zahlungsart verwendet
-				// Alle anderen Zahlungsarten fallen raus
-				
-				foreach ($this->arPayment as $k => $v) {
-					
-					if ($k !== 0) unset($this->arPayment[$k]);
-					
-				}
-				
-			} else {
-			
-				unset($this->arPayment[0]);
-				
-				if (wpsg_isSizedArray($this->view['basket']['produkte'])) {
-	
-					foreach ($this->view['basket']['produkte'] as $basket_product) {
-	
-						$oProduct = $this->cache->loadProductObject($this->getProduktID($basket_product['id']));
-	
-						if ($oProduct->hasLimitedPayment()) {
-	
-							$arPaymentAllowed = $oProduct->getAllowedPayment();
-	
-							foreach ($this->arPayment as $payment_key => $payment) {
-	
-								if (!in_array($payment['id'], $arPaymentAllowed)) {
-	
-									unset($this->arPayment[$payment_key]);
-	
-								}
-	
-							}
-	
-						}
-	
-					}
-	
-				}
-	
-				// UnschÃ¶ne Warnungen verhindern, sollte hier der Array null sein
-				if (!wpsg_isSizedArray($this->arPayment)) $this->arPayment = array();
-	
-				$this->callMods('checkPaymentAvailable', array(&$this->arPayment, &$this->view['basket']));
-
-			}
-				
+					
+				}
+				
+			}
+			
+			$this->callMods('checkPaymentAvailable', array(&$this->arPayment, &$this->view['basket']));
+			
 		} // public function checkPaymentAvailable()
-		
-		public function getPaymentArray(): array {
-			
-			return $this->arPayment;
-			
-		}
 		
 		/**
@@ -5115,15 +3772,15 @@
 		* @param Integer $order_id BestellID
 		*/
-		public function getPaymentName($payment_type, $order_id)
-		{
-
-			$payment_name = @$this->arPayment[$payment_type]['name'];
-
+		public function getPaymentName($payment_type, $order_id) 
+		{
+ 
+			$payment_name = $this->arPayment[$payment_type]['name']; 
+			
 			$this->callMods('getPaymentName', array($payment_type, $order_id, &$payment_name));
-
+			
 			return $payment_name;
-
-		} // public function getPaymentName($payment_type, $order_id)
-
+			
+		} // public function getPaymentName($payment_type, $order_id) 
+		
 		/**
 		 * Ermittelt ob im Backend Netto oder Brutto Preise angezeigt und definiert werden sollen
@@ -5131,9 +3788,9 @@
 		public function getBackendTaxview()
 		{
-
+			
 			return $this->get_option('wpsg_preisangaben');
-
+			
 		} // public function getBackendTaxview()
-
+		
 		/**
 		 * Ermittelt ob im Frontend Netto oder Brutto Preise angezeigt werden sollen
@@ -5141,51 +3798,41 @@
 		public function getFrontendTaxview()
 		{
-
-			// Kleinunternehmer sehen immer im Frontend NETTO ab 17.02.2016 egal was bei Frontend/Brutto eingestellt ist
-			if ($this->get_option('wpsg_kleinunternehmer') == '1') return WPSG_NETTO;
-
+			
 			if (isset($_SESSION['wpsg']['customertype']) && $_SESSION['wpsg']['customertype'] == 0)
 			{
-
+				
 				// Hier hat der Kunde die Auswahl "Firmenkunde" getroffen --> Netto anzeigen
 				return WPSG_NETTO;
-
-			}
-
+				
+			}
+			
 			$nFrontendTaxview = $this->get_option('wpsg_preisangaben_frontend');
-
+			
 			if ($this->hasMod('wpsg_mod_kundenverwaltung'))
 			{
-
+				
 				$customer_group_id = $this->callMod('wpsg_mod_kundenverwaltung', 'getCustomerGroup');
-
+				
 				if (wpsg_isSizedInt($customer_group_id))
 				{
-
+					
 					$oCustomerGroup = $this->callMod('wpsg_mod_kundenverwaltung', 'getCustomerGroupObject', array($customer_group_id));
-
+					
 					if ($oCustomerGroup->calculation >= 0)
 					{
-
+						
 						$nFrontendTaxview = $oCustomerGroup->calculation;
-
+						
 					}
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+				
 			return $nFrontendTaxview;
-
+			
 		} // public function getFrontendTaxview()
 		
-		/**
-		 * @return wpsg_ShopController
-		 */
-		public static function getShop() {
-			
-			return $GLOBALS['wpsg_sc'];
-			
-		}
-
 	} // class ShopController extends SystemController
+	
+?>
Index: /controller/wpsg_SystemController.class.php
===================================================================
--- /controller/wpsg_SystemController.class.php	(revision 8528)
+++ /controller/wpsg_SystemController.class.php	(revision 5261)
@@ -7,12 +7,9 @@
 	{
 				
-		/** @var wpsg_db Datenbankobjekt */
+		/** Datenbankobjekt */
 		var $db;
 		
-		/** @var wpsg_ShopController Das Shop Objekt vom Typ wpsg_ShopController */
+		/** Das Shop Objekt vom Typ wpsg_ShopController */
 		var $shop;
-		
-		/** @var wpsg_imagehandler Das Imagehandler Objekt */
-		var $imagehandler;
 		
 		/** Text des letzten CURL Fehlers */
@@ -24,27 +21,21 @@
 		/** @var boolean - Wird auf true gesetzt, wenn die Meldungen ausgegbene werden */
 		public $bMessageOut = false;
-		 
+		
 		var $htmlMail = false;
-
-		var $api_broken = false;
-
-        public $view = [];
-
-        public $arAllModule = [];
 		
 		/**
 		 * Contstructor
 		 */
-		public function __construct() {
-
+		public function __construct()
+		{
+			
 			$this->db = &$GLOBALS['wpsg_db'];
 			
-			if (get_class($this) != 'wpsg_ShopController') {
+			if (get_class($this) != 'wpsg_ShopController')
+			{
 
 				$this->shop = &$GLOBALS['wpsg_sc'];
 				
 			}
-			
-			$this->imagehandler = &$GLOBALS['wpsg_ih'];
 			
 			$this->view = array();
@@ -56,5 +47,6 @@
 		 * Wird von den abgeleiteten Controllern aufgerufen wenn sie die Ausgabe ÃŒbernehmen
 		 */
-		public function dispatch() {
+		public function dispatch()
+		{
 			
 			$this->shop->checkEscape();
@@ -66,13 +58,14 @@
 		 * Erst mal nur Tunnel fÃŒr die Wordpress Funktion
 		 */
-		public function &get_option($key, $force_global = false, ?string $default = null) {
+		public function &get_option($key, $force_global = false)
+		{
 			
 			$return = false;
 			
-			if ($force_global) $return = get_site_option($key);
-			else $return = get_option($key);
-			
-			if ($return === false && $default !== null) $return = $default;
-
+			if ($force_global)
+				$return = get_site_option($key);
+			else
+				$return = get_option($key);
+			
 			return $return;
 			
@@ -82,48 +75,14 @@
 		 * Setzt eine Einstellung
 		 * Est mal nur Tunnel fÃŒr die Wordpress Funktion
-		 *
-		 * @param       $key
-		 * @param       $value
-		 * @param bool $force_global
-		 * @param bool $addTrans
-		 * @param null $sanitize_type
-		 * @param array $sanitize_params
-		 * @return bool
-		 * @throws Exception
-		 */
-		public function update_option($key, $value, $force_global = false, $addTrans = false, $sanitize_type = NULL, $sanitize_params = array()) {
-
-			// fallback to check data Textfield (sanitize_text_field)
-			if ($sanitize_type === null) $sanitize_type = WPSG_SANITIZE_TEXTFIELD;
-							
-			$bValid = wpsg_checkInput($value, $sanitize_type, $sanitize_params);
-			
-			if (!$bValid) {
-				 
-				// Not valid
-
-				$GLOBALS['wpsg_sc']->addBackendError(__('Ihre Eingaben in den markierten Feldern waren ungÃŒltig, bitte ÃŒberprÃŒfen.', 'wpsg'));
-				
-				$_SESSION['sanitization_err_fields'][$key] = 0;
-				
-				return false; 
-				
-			} else {
-			
-				// Sanitized
-				
-				if ($force_global) {
-					
-					update_site_option($key, $value);
-					
-				} else {
-					
-					update_option($key, $value);
-					
-				}
-				
-				if ($addTrans === true) $GLOBALS['wpsg_sc']->addTranslationString($key, $value);
-				
-			}
+		 */
+		public function update_option($key, $value, $force_global = false, $addTrans = false)
+		{
+			
+			if ($force_global)
+				update_site_option($key, $value);
+			else
+				update_option($key, $value);
+			
+			if ($addTrans === true) $GLOBALS['wpsg_sc']->addTranslationString($key, $value);
 			
 		} // public function update_option($key, $value)
@@ -132,9 +91,10 @@
 		 * FÃŒhrt eine Header Weiterleitung durch. Es darf vorher keine Ausgabe erfolgen (logischerweise)
 		 */
-		public function redirect($url) {
-
+		public function redirect($url) 
+		{
+		
 			header('Location: '.html_entity_decode($url));
 			exit;
-
+			
 		} // public function redirect($url)
 		
@@ -144,58 +104,76 @@
 		 * @param string $url URL die angefragt werden soll
 		 * @param array $post_data Daten, die mittels POST mitgesendet werden sollen
-		 * @return mixed
-		 * @throws Exception
-		 */
-        public function get_url_post_content($url, $post_data = [], $timeout = false) {
-
-			if (!wpsg_checkInput($url, WPSG_SANITIZE_URL)) throw \wpsg\Exception::getSanitizeException();
-
-			$arOptions = [
-                'body' => http_build_query($post_data, '', '&')
-            ];
-
-			if (wpsg_isSizedInt($timeout)) {
-
-			    $arOptions['timeout'] = $timeout;
-
-            }
-			
-			$result = \wp_remote_post($url, $arOptions);
-
-            if (is_object($result) && get_class($result) == 'WP_Error') {
-				
-				//die(var_dump($result));
-				
-                throw new \Exception($result->get_error_message().':'.$url);
-
-            } else return $result['body'];
-
-        } // public function get_url_post_content($url, $post_data = array())
-
-        /**
-         * Gibt die Antwort einer URL zurÃŒck
-         * @throws Exception
-         */
-		public function get_url_content($url, $timeout = 5, $arHeader = []) {
-
-            $arOptions = [];
-
-            if (wpsg_isSizedInt($timeout)) {
-
-                $arOptions['timeout'] = $timeout;
-
-            }
-
-            if (wpsg_isSizedArray($arHeader)) {
-
-                $arOptions['headers'] = $arHeader;
-
-            }
-
-            $result = \wp_remote_get($url, $arOptions);
-
-			if (is_array($result)) return $result['body'];
-			else throw new Exception($result->get_error_message(), 0);
-			 			
+		 */
+		public function get_url_post_content($url, $post_data = array(), $addition_curl_options = array())
+		{
+			
+			$ch = curl_init();
+			
+			curl_setopt($ch, CURLOPT_HEADER, 0);
+			
+			if (wpsg_isSizedArray($addition_curl_options))
+			{
+				
+				foreach ($addition_curl_options as $option_key => $option_value)
+				{
+					 
+					curl_setopt($ch, $option_key, $option_value);
+					
+				}
+				
+			}
+						
+			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+			curl_setopt($ch, CURLOPT_URL, $url);
+			curl_setopt($ch, CURLOPT_POST, count($post_data));
+			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data, null, '&'));
+			
+			$data = curl_exec($ch); 
+			
+			if ($data === false)
+			{
+			
+				$this->last_curl_error = curl_error($ch);
+				
+				wpsg_debug(curl_error($ch));
+				
+			}
+			
+			curl_close($ch); 
+			
+			return $data;
+			
+		} // public function get_url_post_content($url, $post_data = array())
+		
+		/**
+		 * Gibt die Antwort einer URL zurÃŒck
+		 */
+		public function get_url_content($url)
+		{
+			
+			$Return = @file_get_contents($url);			
+						
+			if (!$Return)
+			{
+
+				$ch = curl_init();
+ 
+				curl_setopt($ch, CURLOPT_HEADER, 0);
+				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+				curl_setopt($ch, CURLOPT_URL, $url);
+ 
+				$data = curl_exec($ch); 
+				curl_close($ch);
+ 
+				return $data;
+				
+			}
+			else
+			{
+				
+				return $Return;
+				
+			}
+			
 		} // public function get_url_content($url)
 		
@@ -204,136 +182,99 @@
  		 * Wird mittels writeBackendMessage ausgegeben
 		 */
-		public function addBackendMessage($message) {
-
-            $message_key = md5($message);
-
-            $arM = get_user_meta(get_current_user_id(), 'wpsg_backendMessage', true);
-            if (!wpsg_isSizedArray($arM)) $arM = [];
-
-            // Wenn schon drin, dann nichts machen
-            if (@array_key_exists($message_key, $arM)) return;
-
-            if (substr($message, 0, 7) === 'nohspc_') $message = substr($message, 7);
-            else $message = wpsg_hspc($message);
-
-            $message = '
-                <div id="message" class="notice notice-success">
-                    <p>'.$message.'</p>
-                </div>
-            ';
-
-            $arM[$message_key] = $message;
-
-            update_user_meta(get_current_user_id(), 'wpsg_backendMessage', $arM);
-
+		public function addBackendMessage($message)
+		{
+			
+			if (!wpsg_isSizedArray($_SESSION['wpsg']['backendMessage'])) $_SESSION['wpsg']['backendMessage'] = array();
+			
+			$_SESSION['wpsg']['backendMessage'][] = $message;
+			
 		} // public function addBackendMessage($message)
-	
-		public function addInputFieldError($field_name, $field_label) {
-			
-			$this->addBackendError(
-				wpsg_translate(
-					__('ÃberprÃŒfen Sie die Eingaben im Feld "#1#", diese war ungÃŒltig.', 'wpsg'),
-					$field_label
-				)
-			);
-			
-			$_SESSION['sanitization_err_fields'][$field_name] = 0;
-			
-		}
 		
 		/**
 		 * FÃŒgt eine neue Fehlermeldung eines Backend Moduls hinzu
-		 *
-		 * @param \String $hideLink Soll die Meldung ausblendbar sein, so muss ein Key mitgegeben werden der die
-		 *                          Meldung identifiziert
-		 *
-		 * @return bool|void
-		 */
-		public function addBackendError($message, $hideLinkKey = false, $addBlendOut = true) {
-
+		 * @param \String $hideLink Soll die Meldung ausblendbar sein, so muss ein Key mitgegeben werden der die Meldung identifiziert
+		 */
+		public function addBackendError($message, $hideLinkKey = false, $addBlendOut = true)
+		{
+			
 			if ($hideLinkKey === false) $message_key = md5($message);
 			else $message_key = $hideLinkKey;
-
-			$arE = get_user_meta(get_current_user_id(), 'wpsg_backendError', true);
-			if (!wpsg_isSizedArray($arE)) $arE = [];
-
+			
 			// Wenn schon drin, dann nichts machen
-            if (@array_key_exists($message_key, $arE)) return;
-
-            if (substr($message, 0, 7) === 'nohspc_') $message = substr($message, 7);
-            else $message = wpsg_hspc($message);
-
-            $arMsgHidden = $this->get_option('wpsg_msgHidden');
-            if (!wpsg_isSizedArray($arMsgHidden)) $arMsgHidden = array();
-
-			if (wpsg_isSizedString($hideLinkKey) && $addBlendOut === true) {
+			if (array_key_exists($message_key, (array)$_SESSION['wpsg']['backendError'])) return;
+			
+			if (wpsg_isSizedString($hideLinkKey) && $addBlendOut === true)
+			{
 				
 				// Wurde die Meldung bereits ausgeblendet ?
-				if (in_array($hideLinkKey, $arMsgHidden)) return false;
-
-                $data_dismiss_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=clearMessage&msg_key='.$hideLinkKey.'&noheader=1';
-
-				$message = '
-                    <div id="message" class="error notice is-dismissible wpsg-is-dismissible" data-dismiss-url="'.$data_dismiss_url.'">
-                        <p>'.$message.'</p>                        
-                    </div>
-                ';
-
-			} else {
-
-                $message = '
-                    <div id="message" class="error notice">
-                        <p>'.$message.'</p>
-                    </div>
-                ';
-
-            }
-
-            $arE[$message_key] = $message;
-
-            update_user_meta(get_current_user_id(), 'wpsg_backendError', $arE);
-
+				if ($this->get_option($hideLinkKey) === '1')
+				{
+					
+					return false;
+					
+				}
+				
+				$message .= '<p style="float:right;">'.wpsg_translate(
+					__('<a href="#1#">Klicken Sie hier, um die Meldung auszublenden.</a>', 'wpsg'),
+						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message='.$hideLinkKey.'&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
+				).'</p><div class="wpsg_clearer"></div><br />';
+				
+			}
+							
+			$_SESSION['wpsg']['backendError'][$message_key] = $message;
+							
 		} // public function addBackendError($message, $hideLinkKey = false)
-
-		/**
-		 * Gibt true oder false zurÃŒck, jenachdem ob man sich in einem Blognetzwerk befindet
-		 */
-		public function isMultiBlog()
-		{
-			
-			if (defined('MULTISITE') && MULTISITE === true) 
-			{
-				
-				// Multiblog ist aktiviert
-				return true;
-				
-			}
-			else
-			{
-				return false;
-			}
-			
-		} // public function isMultiBlog() 
-		
-		/**
-		 * Gibt den Pfad zurÃŒck in dem wpShopGermany seine Daten ablegt
-		 * Der Pfad soll ab Version 4.0 nicht ÃŒber den Browser zugreifbar sein, die Funktion soll das sicherstellen
-		 */
-		public function getStorageRoot()
-		{
-			
-			if ($this->isMultiBlog()) {
-
-				$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/';
-				 								 
-			} else {
-				
-				$path = WPSG_PATH_CONTENT.'uploads/wpsg/';				
-				
-			}
-						
-			return $path;
-			
-		} // public function getStorageRoot()
+		
+		/**
+		 * Ersetzt die alte addOneViewError
+		 * Zeigt Meldungen persistent im Backend an, bis sie gelesen wurden oder durch den Shop entfernt wurden
+		 * 
+		 * @param unknown $message
+		 * @param unknown $message_key
+		 */
+		public function addPersistentBackendError($message, $message_key)
+		{
+			
+			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
+			if (!is_array($arPersistentBackendError)) $arPersistentBackendError = array();
+			
+			if (!array_key_exists($message_key, $arPersistentBackendError)) 
+				$arPersistentBackendError[$message_key] = array(
+					'message' => $message,
+					'hide' => false
+				);
+			
+			$this->update_option('wpsg_persistentBackendError', $arPersistentBackendError);
+			
+		} // public function addPersistentBackendError($message, $message_key)
+		
+		/**
+		 * Entfernt eine Meldung, wenn Sie nicht lÃ€nger angezeigt werden soll
+		 * 
+		 * @param unknown $message_key
+		 */
+		public function removePersistentBackendError($message_key)
+		{
+			
+			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
+			if (!is_array($arPersistentBackendError)) $arPersistentBackendError = array();
+			
+			if (array_key_exists($message_key, $arPersistentBackendError)) unset($arPersistentBackendError[$message_key]);
+			
+			$this->update_option('wpsg_persistentBackendError', $arPersistentBackendError);
+			
+		} // public function removePersistentBackendError($message_key)
+		
+		public function hidePersistentBackendError($message_key)
+		{
+			
+			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
+			if (!is_array($arPersistentBackendError)) $arPersistentBackendError = array();
+			
+			if (array_key_exists($message_key, $arPersistentBackendError)) $arPersistentBackendError[$message_key]['hide'] = true;
+			
+			$this->update_option('wpsg_persistentBackendError', $arPersistentBackendError);
+			
+		} // public function hidePersistentBackendError($message_key)
 		
 		/**
@@ -363,22 +304,4 @@
 		} // public function addFrontendError($error)
 		
-		public function hasFrontendMessage() { return wpsg_isSizedArray($_SESSION['wpsg']['frontendMessage']); }
-		
-		public function hasFrontendError() { return wpsg_isSizedArray($_SESSION['wpsg']['frontendError']); }
-		
-		public function hasBackendError() {
-
-		    /*
-		    $arE = $_SESSION['wpsg']['backendError'];
-		    unset($arE['wpsg_systemcheck']);
-		    return wpsg_isSizedArray($arE);
-		    */
-
-            $arE = get_user_meta(get_current_user_id(), 'wpsg_backendError', true);
-
-            return wpsg_isSizedArray($arE);
-
-		}
-		
 		/**
 		 * Gibt die Fehler und Hinweise im Frontend aus
@@ -386,5 +309,5 @@
 		public function writeFrontendMessage()
 		{
-
+			
 			$this->bMessageOut = true;
 			
@@ -394,12 +317,12 @@
 			{
 	 
-				$strOut  .= '<ul id="wpsg_message" class="wpsg_message_wrap">';
+				$strOut  .= '<div id="wpsg_message" class="published updated">';
 				
 				foreach ($_SESSION['wpsg']['frontendMessage'] as $m) 
 				{
-					$strOut .= '<li>'.$m.'</li>';
+					$strOut .= '<p>'.$m.'</p>';
 				}
 	
-				$strOut .= '</ul>';
+				$strOut .= '</div>';
 
 				//wird jetzt in der Shutdown Action gemacht
@@ -411,12 +334,12 @@
 			{
 
-				$strOut  .= '<ul id="wpsg_error" class="wpsg_error_wrap">';
+				$strOut  .= '<div id="wpsg_error" class="published error">';
 				
 				foreach ($_SESSION['wpsg']['frontendError'] as $m) 
 				{
-					$strOut .= '<li>'.$m.'</li>';
+					$strOut .= '<p>'.$m.'</p>';
 				}
 	
-				$strOut .= '</ul>';
+				$strOut .= '</div>';
 				
 				//wird jetzt in der Shutdown Action gemacht
@@ -432,32 +355,108 @@
 		 * Gibt die Backend Messages aus 
 		 */
-		public function writeBackendMessage($onlyMessage = false) {
+		public function writeBackendMessage()
+		{
 
 			$this->bMessageOut = true;
-			$GLOBALS['wpsg_sc']->bMessageOut = true;
 			
 			$strOut  = '';
-
-            $arE = get_user_meta(get_current_user_id(), 'wpsg_backendError', true);
-            $arM = get_user_meta(get_current_user_id(), 'wpsg_backendMessage', true);
-
-			if (wpsg_isSizedArray($arM)) {
-
-				foreach ($arM as $m) { $strOut .= $m; }
-
-                delete_user_meta(get_current_user_id(), 'wpsg_backendMessage');
-				
-			}
-			
-			if (wpsg_isSizedArray($arE)) {
-
-				foreach ($arE as $m) { $strOut .= $m; }
-
-                delete_user_meta(get_current_user_id(), 'wpsg_backendError');
-
-			}
-
+			 
+			// Updatefehler etc.
+			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
+				
+			if (wpsg_isSizedArray($arPersistentBackendError))
+			{
+			
+				$strMessageOut = "";
+							
+				foreach ($arPersistentBackendError as $message_key => $message)
+				{
+		 	
+					if ($message['hide'] !== true)
+					{
+							
+						$strMessageOut .= '<p>';
+						$strMessageOut .= $message['message'];
+						$strMessageOut .= '<a title="'.__('Meldung ausblenden', 'wpsg').'" href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message='.$message_key.'&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI']).'">';
+						$strMessageOut .= '<img src="'.$this->getRessourceURL('gfx/bin_x.png').'" alt="'.__('Meldung ausblenden', 'wpsg').'" />';
+						$strMessageOut .= '</a>';
+						$strMessageOut .= '</p>';
+			
+					}
+						
+				}
+			
+				if (wpsg_isSizedString($strMessageOut)) $strOut .= '<div id="message" class="wpsg_message error">'.$strMessageOut.'</div>';
+							
+			}
+			
+			//if (!isset($_SESSION['wpsg']['backendMessage']) && !isset($_SESSION['wpsg']['backendError'])) return $strOut;
+			
+			if (is_array($_SESSION['wpsg']['backendMessage']) && sizeof($_SESSION['wpsg']['backendMessage']) > 0)
+			{
+			
+				$strOut  .= '<div id="message" class="updated">';
+				
+				foreach ($_SESSION['wpsg']['backendMessage'] as $m) 
+				{
+					
+					if (preg_match('/^nohspc_/', $m))
+					{
+						$strOut .= '<p>'.preg_replace('/^nohspc_/', '', $m).'</p>';
+					}
+					else
+					{					
+						$strOut .= '<p>'.wpsg_hspc($m).'</p>';
+					}
+					
+				}
+	
+				$strOut .= '</div>';
+
+				unset($_SESSION['wpsg']['backendMessage']);
+				
+			}
+			
+			if (wpsg_isSizedArray($_SESSION['wpsg']['backendError']))
+			{
+
+				//$strOut  .= '<div id="message" class="error below-h2">';
+				$strOut  .= '<div id="message" class="error">'; // below-h2 nicht setzen sonst schiebt sich diese Meldung ÃŒber das Banner
+				
+				foreach ($_SESSION['wpsg']['backendError'] as $m) 
+				{
+					
+					if (preg_match('/^nohspc_/',$m))
+					{
+						$strOut .= '<p>'.preg_replace('/^nohspc_/', '', $m).'</p>';
+					}
+					else
+					{
+						$strOut .= '<p>'.wpsg_hspc($m).'</p>';
+					}
+					
+				}
+	
+				$strOut .= '</div>'; 
+				
+			}
+			 
 			if (wpsg_isSizedString($strOut)) $strOut = '<div class="wrap">'.$strOut.'</div>';
-
+			
+			if (!$this->hasMod('wpsg_mod_core')) 
+			{
+				
+				// Free Version => Bannern
+				$banner = base64_decode(strrev('==wZwpmLwYDe4YDNyVmbuFmQtA1VvIXZu5WYi9yczVmcwRmcvd3LlRmLx4WZoNmbuVWYt5yZtl2LvoDc0RHa')); //http://img.maennchen1.de/wordpress/banner/WP-Banner468x60.jpg
+
+				if (@file_get_contents($banner))
+				{
+				
+					$strOut = '<div class="msg_wrap"><a href="http://shop.maennchen1.de/category/wpshopgermany/" target="_blank"><img src="'.$banner.'" /></a><br />'.$strOut.'</div>';
+					
+				}
+				
+			}
+			
 			return $strOut;
 			
@@ -467,5 +466,6 @@
 		 * LÃ¶scht die Session mit den fehlerhaft eingegebenen Feldern
 		 */
-		public function ClearSessionErrors() {
+		public function ClearSessionErrors()
+		{
 			
 			unset($_SESSION['wpsg']['errorFields']);
@@ -476,5 +476,6 @@
 		 * LÃ¶scht die Fehlermeldungen fÃŒr das Frontend
 		 */
-		public function clearFrontendError() {
+		public function clearFrontendError()
+		{
 			
 			unset($_SESSION['wpsg']['frontendError']);
@@ -485,5 +486,6 @@
 		 * LÃ¶scht die Meldungen fÃŒr das Frontend
 		 */
-		public function clearFrontendMessage() {
+		public function clearFrontendMessage()
+		{
 		
 			unset($_SESSION['wpsg']['frontendMessage']);
@@ -494,8 +496,9 @@
 		 * LÃ¶scht die Meldungen aus der Session
 		 */
-		public function clearMessages() {
-				
-			//unset($_SESSION['wpsg']['backendError']);
-			//unset($_SESSION['wpsg']['backendMessage']);
+		public function clearMessages()
+		{
+				
+			unset($_SESSION['wpsg']['backendError']);
+			unset($_SESSION['wpsg']['backendMessage']);
 				
 			$this->clearFrontendError();
@@ -509,18 +512,8 @@
 		 * im user_views liegt und wenn ja dieser Pfad zurÃŒckgegeben
 		 */
-		public function getRessourceURL($path, ?string $base_path = null) {
-
-            if (file_exists(WPSG_PATH_TEMPLATEVIEW_CHILD.$path) && $this->get_option('wpsg_ignoreuserview') != '1') {
-
-                // Datei existiert im UserView des Child Theme
-                $url = get_stylesheet_directory_uri().'/wpsg_views/'.$path;
-
-            }
-			else if (file_exists(WPSG_PATH_TEMPLATEVIEW.$path) && $this->get_option('wpsg_ignoreuserview') != '1') {
-			
-				// Datei existiert im UserView des Theme
-                $url = get_template_directory_uri().'/wpsg_views/'.$path;
-				
-			} else if (file_exists(WPSG_PATH_USERVIEW.$path) && $this->get_option('wpsg_ignoreuserview') != '1')
+		public function getRessourceURL($path)
+		{
+			
+			if (file_exists(WPSG_PATH_USERVIEW.$path) && $this->get_option('wpsg_ignoreuserview') != '1')
 			{
 				
@@ -529,18 +522,22 @@
 				
 			}
+			else if (file_exists(WPSG_PATH_TEMPLATEVIEW.'/'.$path) && $this->get_option('wpsg_ignoreuserview') != '1')
+			{
+				
+				// Datei existiert im Template
+				$url = get_template_directory_uri().'/wpsg_views/'.$path;
+				
+			}
 			else if (file_exists(WPSG_PATH_USERVIEW_OLD.'/'.$path) && $this->get_option('wpsg_ignoreuserview') != '1')			
 			{
 				
 				// Datei existiert im alten UserView
-				$url = WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/user_views/'.$path;
-
-			} else if ($base_path !== null && file_exists($base_path.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$path)) {
-
-				$relative_path = str_replace(WP_CONTENT_DIR, '', $base_path.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$path);
-				$url = content_url().$relative_path;
-
-			} else {
-				
-				$url = WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/views/'.$path;
+				$url = WPSG_URL_CONTENT.'plugins/wpshopgermany/user_views/'.$path;
+				
+			}
+			else
+			{
+				
+				$url = WPSG_URL_CONTENT.'plugins/wpshopgermany/views/'.$path;
 				
 			}
@@ -557,7 +554,6 @@
 		public function getFlagURL()
 		{
-
-			if (is_plugin_active('sitepress-multilingual-cms/sitepress.php')) return '';
-			else return WPSG_URL_CONTENT.'plugins/qtranslate-x/flags/';
+			
+			return WPSG_URL_CONTENT.'plugins/qtranslate-x/flags/';
 			
 		} // public function getFlagURL()
@@ -582,111 +578,73 @@
 		 * im user_views liegt und wenn ja dieser Pfad zurÃŒckgegeben
 		 */
-		public function getRessourcePath($path, ?string $base_path = null) {
-
-            $plugin_dir = ABSPATH.WPSG_CONTENTDIR_WP.'/plugins/';
-                        
-            if (strpos(realpath($path), realpath ($plugin_dir)) === 0) {
-                
-                $view_path = preg_replace('/(.*)views/', '',realpath($path));
-                                
-            } else $view_path = $path;
-
-			if (file_exists(WPSG_PATH_USERVIEW.$view_path)) {
+		public function getRessourcePath($path)
+		{
+
+			if (file_exists(WPSG_PATH_USERVIEW.$path))
+			{
 			
 				// Datei existiert im UserView
-				return WPSG_PATH_USERVIEW.$view_path;
-				
-			} else if (file_exists(WPSG_PATH_TEMPLATEVIEW.'/'.$view_path)) {
-				 
+				return WPSG_PATH_USERVIEW.$path;
+				
+			}
+			else if (file_exists(WPSG_PATH_TEMPLATEVIEW.'/'.$path))
+			{
+				
 				// Datei existiert im Template
-				return WPSG_PATH_TEMPLATEVIEW.'/'.$view_path;
-				
-			} else if (file_exists(WPSG_PATH_USERVIEW_OLD.'/'.$view_path)) {
+				return WPSG_PATH_TEMPLATEVIEW.'/'.$path;
+				
+			}
+			else if (file_exists(WPSG_PATH_USERVIEW_OLD.'/'.$path))
+			{
 
 				// Datei existiert im alten UserView
-				return WPSG_PATH_USERVIEW_OLD.'/'.$view_path;
-
-			} else if ($base_path !== null && file_exists($base_path.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$view_path)) {
-
-				return $base_path.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$view_path;
-
-			} else {
-
-			    if ($path !== $view_path) return $path;
-			    else return WPSG_PATH_VIEW.'/'.$path;
+				return WPSG_PATH_USERVIEW_OLD.'/'.$path;
+				
+			}
+			else
+			{
+
+				return WPSG_PATH_VIEW.'/'.$path;
 				
 			}
 			
 		} // public function getRessourceURL($path)
-
-        public function getTemplatefile($file) {
-
-            // Da die views jetzt im Pluginverzeichnis liegen suche ich den (.*)view Teil
-            $path_view = preg_replace('/\/views\/(.*)/', '', $file).'/views/';
-
-            $uv_file = 			str_replace($path_view, WPSG_PATH_USERVIEW, $file);
-            $uv_old_file = 		str_replace($path_view, WPSG_PATH_USERVIEW_OLD, $file);
-            $theme_file = 		str_replace($path_view, WPSG_PATH_TEMPLATEVIEW, $file);
-            $child_theme_file = str_replace($path_view, WPSG_PATH_TEMPLATEVIEW_CHILD, $file);
- 
-            $wpsg_ignoreuserview = $this->get_option('wpsg_ignoreuserview');
-
-            if (file_exists($child_theme_file) && 	$wpsg_ignoreuserview != '1') $render_file = $child_theme_file;
-            else if (file_exists($theme_file) && 	$wpsg_ignoreuserview != '1') $render_file = $theme_file;
-            else if (file_exists($uv_file) && 		$wpsg_ignoreuserview != '1') $render_file = $uv_file;
-            else if (file_exists($uv_old_file) && 	$wpsg_ignoreuserview != '1') $render_file = $uv_old_file;
-            else if (file_exists($file)) $render_file = $file;
-            else if (file_exists($theme_file)) $render_file = $theme_file;
-            else {
- 
-            	throw new \wpsg\Exception(wpsg_translate(__('Template (#1#) Datei nicht gefunden', 'wpsg'), $file), \wpsg\Exception::TYP_UNEXPECTED);
-
-            }
-
-            // Ich lasse nur Dateien unterhalb von wp-content zu aus SicherheitsgrÃŒnden
-            if (strpos(sanitize_file_name(realpath($render_file)), sanitize_file_name(WPSG_PATH_CONTENT)) !== 0 || !preg_match('/\.phtml$/i', $render_file)) {
-                 
-                throw new \Exception(__('Zugriffsfehler!', 'wpsg'));
-                
-            }
-                        
-            return $render_file;
-
-        }
-
+		
 		/**
 		 * Zeigt eine Template Datei an
 		 */
-		public function render($file, $out = true) {
-
-			$file_key = preg_replace(['/(.*)wpshopgermany-free/', '/\/\//'], ['', '/'], $file);
-			$this->view = \apply_filters('wpsg_render_'.$file_key, $this->view, $file_key);
-
-			// Ticket #572 doppelte Slash stÃ¶ren
-			$file = str_replace('//', '/', $file);
-			
+		public function render($file, $out = true)
+		{
+
 			$this->arTemplateStack[] = preg_replace('/(.*)\//', '', $file);
-
+			
+			// Datei im UserView
+			$uv_file = str_replace(WPSG_PATH_VIEW, WPSG_PATH_USERVIEW, $file);
+			$uv_old_file = str_replace(WPSG_PATH_VIEW, WPSG_PATH_USERVIEW_OLD, $file);
+			$theme_file = str_replace(WPSG_PATH_VIEW, WPSG_PATH_TEMPLATEVIEW, $file);
+						
 			if (!$out) { ob_start(); }
 			
 			if (sizeof($this->arTemplateStack) == 1 && $this->get_option('wpsg_autoraw') === '1' && !is_admin() && !$this->bShortcode) echo '[raw]';
-
-            $render_file = $this->getTemplatefile($file);
-
-			if ($this->get_option('wpsg_displayTemplatesLog') > 0) wpsg_debug_console($this->clearPathForDebug($render_file));
-			
-			if (!is_admin() && $this->get_option('wpsg_displayTemplates') > 0) {
-				
-				echo '<div style="display:inline-block; box-shadow: inset 0px 0px 0px 1px #003C6A; position:relative;">';			
-				echo '<div style="background-color:#003C6A; color:#FFFFFF; white-space:nowrap; font-size:11px; font-family:monospace; line-height:14px; margin-top:-14px; position:absolute;">'.$this->clearPathForDebug($render_file).'</div>';
-								
-			}
-			
-			include $render_file;
-			
-			if (!is_admin() && $this->get_option('wpsg_displayTemplates') > 0) {
-				
-				echo '</div>';
-				
+			
+			if (file_exists($uv_file) && $this->get_option('wpsg_ignoreuserview') != '1')
+			{
+				include $uv_file;
+			}
+			else if (file_exists($theme_file) && $this->get_option('wpsg_ignoreuserview') != '1')
+			{				 
+				include $theme_file;				
+			}
+			else if (file_exists($uv_old_file) && $this->get_option('wpsg_ignoreuserview') != '1')
+			{
+				include $uv_old_file;
+			}
+			else if (file_exists($file))
+			{					
+				include $file;
+			}
+			else
+			{
+				die(wpsg_translate(__("Templatedatei existiert nicht (#1#) !", 'wpsg'), $file));
 			}
 			
@@ -699,119 +657,4 @@
 		} // public function render($file)
 		
-		public function clearPathForDebug($file)
-		{
-			
-			$file = preg_replace('/(\/\/)|(\\\)/', '/', $file);
-			$file = str_replace(WPSG_PATH_WP, '/', $file);
-			
-			return $file;
-			
-		} // private function clearPath($file)
-		
-		/**
-		 * Gibt die Locale der Standard Backend Sprache zurÃŒck
-		 * de / en etc.
-		 */
-		public function getDefaultLanguageCode()
-		{
-
-			return $this->get_option('wpsg_backend_language');
-						
-		} // public function getDefaultLanguageCode()
-
-		/**
-		 * Gibt die Locale fÃŒr die aktuelle Sprache zurÃŒck
-		 */
-		public function getDefaultLanguageLocale()
-		{
-
-			if (!$this->force_locale) 
-			{
-				
-				$arStoreLanguages = $this->getStoreLanguages();
-				
-				foreach ($arStoreLanguages as $lang)
-				{
-					
-					if ($lang['lang'] == $this->getDefaultLanguageCode()) return $lang['locale'];
-					
-				}
-				
-				return false; 
-				
-			}
-			else return $this->force_locale;
-			
-		} // public function getDefaultLanguageLocale()
- 
-		public function getCurrentLanguageCode()
-		{
-			 
-			$arStoreLanguages = $this->getStoreLanguages();
-				
-			foreach ($arStoreLanguages as $lang)
-			{
-				
-				if ($lang['locale'] == $this->getCurrentLanguageLocale()) return $lang['lang'];
-				
-			}
-			
-			return '';
-			
-		}
-		
-		public function getCurrentLanguageLocale()
-		{
-			
-			return get_locale();
-			
-		}
-				
-		
-		/**
-		 * Ãndert zeitweise die Locale, um z.B. die Sprache einer Bestellung zu berÃŒcksichtigen
-		 * Nach dem Aufruf und der DurchfÃŒhrung sollte wieder die Originalspreach mit restoreTemLocale gesetzt werden
-		 */
-		public function setTempLocale($locale) {
-
-			global $l10n;
-		
-			if (file_exists(dirname(__FILE__).'/../lang/wpsg-'.$locale.'.mo')) {
-			
-				$this->old_l10n = clone $l10n['wpsg']; 
-				$this->force_locale = $locale;
-			 			 
-				call_user_func_array(
-					'load_textdomain',
-					array(
-						'wpsg', dirname(__FILE__).'/../lang/wpsg-'.$locale.'.mo'
-					)
-				);
-				
-			}
-			
-		} // public function setTempLocale($locale)
-		
-		/**
-		 * Setzt die Sprache auf die Original Sprache zurÃŒck
-		 * Wird die Sprache zeitweise mit setTempLocale geÃ€ndert, so sollte sie am Ende wieder zurÃŒckgesetzt werden
-		 */
-		public function restoreTempLocale()
-		{
-			
-			global $l10n;
-			
-			if (isset($this->old_l10n) && $this->old_l10n !== false)
-			{
-				
-				$l10n['wpsg'] = clone $this->old_l10n;
-
-				$this->force_locale = false;
-				$this->old_l10n = false;
-				
-			}
-			
-		} // public function restoreTempLocale()
-			
 		/**
 		 * Erstellt eine neue Seite im Wordpress 
@@ -821,6 +664,4 @@
 
 			global $wpdb, $current_user;
-
-			if (!wpsg_checkInput($page_id, WPSG_SANITIZE_PAGEID)) return false;
 			
 			if ($page_id == -1) 
@@ -831,5 +672,5 @@
 				if (function_exists("get_currentuserinfo"))
 				{
-					//get_currentuserinfo();
+					get_currentuserinfo();
 					$user_id = $current_user->user_ID;
 				}
@@ -845,5 +686,5 @@
 					"post_title" => $title,
 					"post_date_gmt" => "NOW()",
-					"post_name" => strtolower($title),
+					"post_name" => mb_strtolower($title),
 					"post_status" => "publish",
 					"comment_status" => "closed",
@@ -863,21 +704,12 @@
 				), "`ID` = '".wpsg_q($page_id)."'");
 				
-				 $set_language_args = array(
-					'element_id' => $page_id,
-					'element_type'  => 'post_page',
-					'trid' => false,
-					'language_code' => 'de'
-				);
-		 
-				if (function_exists('icl_object_id'))
-				{
-				
-					do_action('wpml_set_element_language_details', $set_language_args);
-				
-				}
-								
-			}
-			
-			$this->update_option($page_key, $page_id);
+			}
+			
+			if ($page_id > 0) 
+			{
+				
+				$this->update_option($page_key, $page_id);
+				
+			} 
 			
 		} // private function createPage($title)
@@ -942,2 +774,3 @@
 	} // public class SystemController 
 
+?>
Index: /cron.php
===================================================================
--- /cron.php	(revision 5261)
+++ /cron.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+
+	/**
+	 * Cron Script fÃŒr wpShopGermany
+	 */
+
+	error_reporting(E_ERROR);
+	ini_set("display_errors", "1");
+	 
+	require_once(dirname(__FILE__).'/../../../wp-load.php'); 	
+ 
+	date_default_timezone_set("Europe/Berlin");
+ 	
+	require_once(dirname(__FILE__).'/wpshopgermany.php');  
+	
+	$GLOBALS['wpsg_sc']->callMods('cron');
+	$GLOBALS['wpsg_sc']->update_option('wpsg_lastCron', time());
+	
+?>
Index: ng/wpsg-en_US.po
===================================================================
--- /lang/wpsg-en_US.po	(revision 8528)
+++ 	(revision )
@@ -1,23194 +1,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: wpShopGermany v3.1.2\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-02-22 15:22+0100\n"
-"PO-Revision-Date: 2019-03-05 14:25+0100\n"
-"Last-Translator: daniel <daniel@maennchen1.de>\n"
-"Language-Team: \n"
-"Language: en_US\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Poedit 1.8.3\n"
-"X-Poedit-SourceCharset: utf-8\n"
-"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
-"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
-"X-Poedit-Basepath: ..\n"
-"X-Textdomain-Support: yes\n"
-"X-Poedit-SearchPath-0: .\n"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:204
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:254
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:300
-#, fuzzy
-msgid "Es befinden sich keine Produkte im Warenkorb."
-msgstr "No products in your basket."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:352
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:71
-msgid "Aufrufsfehler!"
-msgstr "Error in procedure call!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:359
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:549
-msgid "Aufrufsfehler!!"
-msgstr "Error in procedure call!!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:494
-msgid "Produkt erfolgreich in den Warenkorb gelegt."
-msgstr "Product successfully added to your basket."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:589
-msgid "Ein Gutschein mit diesem Code existiert nicht!"
-msgstr "There is no voucher with this code."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:608
-msgid "Dieser Gutscheincode ist nicht gÃŒltig!"
-msgstr "This voucher code is not valid!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:621
-msgid ""
-"Dieser Gutscheincode wurde bereits eingelÃ¶st und ist nicht mehrfach "
-"verwendbar."
-msgstr ""
-"This voucher code has been already used and cannot be used multiple times."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:637
-#, fuzzy
-msgid ""
-"Dieser Gutscheincode kann nicht eingelÃ¶st werden, da bereits Rabatte "
-"angerechnet sind."
-msgstr ""
-"This voucher code has been already used and cannot be used multiple times."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:652
-msgid ""
-"Dieser Gutscheincode kann nicht eingelÃ¶st werden, da der Mindestbestellwert "
-"von #1# noch nicht erreicht ist."
-msgstr ""
-"This coupon code can not be redeemed because the minimum order # 1 # has not "
-"yet been reached."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:705
-msgid ""
-"Gutschein konnte nicht hinzugefÃŒgt werden, da er fÃŒr das Produkt #1# nicht "
-"zulÃ€ssig ist."
-msgstr ""
-"Voucher could not be added because it is not allowed for product # 1 #."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:720
-msgid ""
-"Gutschein konnte nicht hinzugefÃŒgt werden, da er fÃŒr die Produkte #1# nicht "
-"zulÃ€ssig ist."
-msgstr "Voucher could not be added as it is not allowed for products # 1 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:728
-msgid "Gutschein wurde der Bestellung erfolgreich hinzugefÃŒgt."
-msgstr "Voucher has been successfully added to your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:772
-msgid ""
-"Sie mÃŒssen unsere #1# und #2# gelesen haben, um eine Bestellung "
-"durchzufÃŒhren! Bitte setzen Sie unten das entsprechende HÃ€kchen!"
-msgstr ""
-"For submitting your order, you need to tick the checkbox confirming that you "
-"have read and agreed to #1# and #2#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:773
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2327
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:300
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:31
-msgid "AGB"
-msgstr "General Terms and Conditions"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:774
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2329
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:302
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:137
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:32
-msgid "Widerrufsbelehrung"
-msgstr "Power of revocation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:807
-msgid "Gutschein erfolgreich entfernt."
-msgstr "Voucher removed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:820
-msgid "Produkt erfolgreich entfernt."
-msgstr "Product removed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:896
-#, fuzzy
-msgid "Produkt darf nur einmal im Warenkorb auftauchen."
-msgstr "Remove product from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:920
-msgid "Warenkorb erfolgreich aktualisiert"
-msgstr "Basket has been updated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_BasketController.class.php:994
-msgid "Unerwarteter Fehler!"
-msgstr "Unexpected exception!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_SystemController.class.php:591
-#, fuzzy
-msgid "Template (#1#) Datei nicht gefunden"
-msgstr "File not found"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_SystemController.class.php:596
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:343
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:367
-#, fuzzy
-msgid "Zugriffsfehler!"
-msgstr "Access error"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:54
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:102
-msgid "Kein Zugriff"
-msgstr "No access"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:64
-#, fuzzy
-msgid "Systemmeldungen wurden zurÃŒckgesetzt."
-msgstr "All customers were set to active."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:113
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1441
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:689
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:980
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1409
-msgid "Allgemein"
-msgstr "General"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:117
-msgid "Shopinfo"
-msgstr "Shop Info"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:121
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:13
-#, fuzzy
-msgid "Erweitert"
-msgstr "Free text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:129
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/wpml.phtml:29
-#, fuzzy
-msgid "WPML Einstellungen"
-msgstr "Settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:136
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:24
-#, fuzzy
-msgid "Darstellung"
-msgstr "Order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:24
-msgid "Einstellungen sichern"
-msgstr "Save settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:148
-msgid "Blognetzwerk"
-msgstr "Blog network"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:154
-msgid "Pfade"
-msgstr "Paths"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:160
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2328
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:301
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:32
-msgid "Datenschutz"
-msgstr "Privacy policy"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:164
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:24
-msgid "Preiskalkulation"
-msgstr "Price calculation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:168
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:26
-msgid "Berechtigungen"
-msgstr "Authorizations"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:172
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:24
-#, fuzzy
-msgid "Widerruf"
-msgstr "Power of revocation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:176
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:22
-msgid "Bibliotheken/Includes"
-msgstr "Libraries/Includes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:180
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:22
-msgid "Seitenkonfiguration"
-msgstr "Page assignments"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:188
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1449
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:136
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:155
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:19
-msgid "Kundendaten"
-msgstr "Customer data"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:192
-msgid "E-Mail Konfiguration"
-msgstr "Email configuration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:196
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:22
-msgid "Versandzonen"
-msgstr "Shipping zones"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:200
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:40
-msgid "LÃ€nderverwaltung"
-msgstr "Country administration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:208
-msgid "Deinstallieren"
-msgstr "Uninstall"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:319
-#, fuzzy
-msgid "Shopdaten erfolgreich gespeichert."
-msgstr "Product saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:327
-msgid ""
-"Die allgemeinen Daten des Shops haben sich verÃ€ndert, sie sollten das <a "
-"href=\"#1#\">Widerrufsformular</a> ÃŒberprÃŒfen bzw. neu generieren."
-msgstr ""
-"The general data of the shop has changed, you should check or regenerate the "
-"<a href=\"#1#\"> revocation form </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:350
-#, fuzzy
-msgid "Keine Verbindung zum Registrierungsserver"
-msgstr "Error while registering: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:359
-#, fuzzy
-msgid "UngÃŒltiger Lizenzcode"
-msgstr "No valid licence"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:365
-#, fuzzy
-msgid "wpShopGermany wurde aktiviert."
-msgstr "wpShopGermany product overview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:404
-#, fuzzy
-msgid "Registrierungsserver antwortet nicht."
-msgstr "Register page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:413
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:477
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:522
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:566
-#, fuzzy
-msgid "Ihre Lizenz ist ungÃŒltig."
-msgstr "Input for \"Amount\" is not valid."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:419
-#, fuzzy
-msgid "Modulcode wurde nicht akzeptiert."
-msgstr "Module is already activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:425
-#, fuzzy
-msgid "Modulcode wurde bereits verbraucht."
-msgstr "Module is already activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:431
-#, fuzzy
-msgid "Modulcode wurde bereits fÃŒr diesen SchlÃŒssel verbraucht."
-msgstr "The code was already used for another key."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:437
-#, fuzzy
-msgid "Modul wurde fÃŒr diesen LizenzschlÃŒssel aktiviert."
-msgstr "The code was already used for another key."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:446
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:490
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:534
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:578
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:615
-#, fuzzy
-msgid "Nicht definierte API Antwort."
-msgstr "Not defined!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:483
-#, fuzzy
-msgid "Daten erfolgreich aktualisiert."
-msgstr "Basket has been updated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:515
-#, fuzzy
-msgid "Domain erfolgreich registriert."
-msgstr "Module was installed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:528
-#, fuzzy
-msgid "Diese Domain ist schon auf Ihren SchlÃŒssel registriert."
-msgstr "This domain has not been registered to this key yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:559
-#, fuzzy
-msgid "Domain erfolgreich unregistriert."
-msgstr "Module was installed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:572
-#, fuzzy
-msgid "Diese Domain ist nicht auf Ihren SchlÃŒssel registriert."
-msgstr "This domain has not been registered to this key yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:603
-#, fuzzy
-msgid "Demo Modus erfolgreich gestartet."
-msgstr "Module was installed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:677
-msgid "Modul erfolgreich installiert."
-msgstr "Module was installed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:805
-#, fuzzy
-msgid "Migration der MwSt. SÃ€tze erfolgreich durchgefÃŒhrt."
-msgstr "Variation has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:864
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr PayPal GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:865
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Bankeinzugs GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:866
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Billsafe GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:867
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Click&Buy GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:868
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Nachnahme GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:869
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Flexipay GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:870
-msgid "Mehrwertsteuersatz fÃŒr Giropay (Giropay) GebÃŒhren"
-msgstr "VAT rate for Giropay (Giropay) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:871
-msgid "Mehrwertsteuersatz fÃŒr Giropay (Creditcard) GebÃŒhren"
-msgstr "VAT rate for Giropay (credit card) fees"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:872
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Giropay (Lastschrift) GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:873
-msgid "Mehrwertsteuersatz der GebÃŒhren fÃŒr Zahlung mit Rechnung"
-msgstr "VAT rate of fees for payment with invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:874
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Klarna GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:875
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Creditcard) GebÃŒhren"
-msgstr "VAT rate for micropayment (CreditCard) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:876
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Creditcardreservation) GebÃŒhren"
-msgstr "VAT rate for micropayment (Creditadresreservation) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:877
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Lastschrift) GebÃŒhren"
-msgstr "VAT rate for micropayment (direct debit) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:878
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (eBank2Pay) GebÃŒhren"
-msgstr "VAT rate for micropayment (eBank2Pay) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:879
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Vorkasse) GebÃŒhren"
-msgstr "VAT rate for micropayment (prepayment) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:880
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Call2Pay) GebÃŒhren"
-msgstr "VAT rate for micropayment (Fall2Pay) fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:881
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (HandyPay) GebÃŒhren"
-msgstr "VAT rate for micropayment (HandyPay) fees"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:882
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Vorkasse GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:883
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr GebÃŒhren von Gutschriften"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:884
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Securepay GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:885
-msgid "Mehrwertsteuersatz fÃŒr GebÃŒhren Sparkasse Internetkasse GebÃŒhren"
-msgstr "VAT rate for charges Sparkasse Internetkasse fees"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:886
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr Skrill GebÃŒhren"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:887
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr SofortÃŒberweisungsgebÃŒhren"
-msgstr "User id from sofortbanking.com"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:888
-msgid "Mehrwertsteuersatz fÃŒr GebÃŒhren der Selbstabholung"
-msgstr "VAT rate for self-collection fees"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:898
-msgid "Es gibt keine alten MwSt. SÃ€tze zu migrieren."
-msgstr "There are no old VAT rates to migrate."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:917
-#, fuzzy
-msgid "Einstellungen der Versandzonen wurden erfolgreich gespeichert."
-msgstr "Settings imported successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:928
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:79
-msgid "Anklicken um Bezeichnung zu Ã€ndern ..."
-msgstr "Click on to change description..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1005
-msgid "Produkte erfolgreich gelÃ¶scht."
-msgstr "Product successfully deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1016
-msgid "Kunden erfolgreich gelÃ¶scht."
-msgstr "Customer successfully deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1033
-msgid "Bestellungen erfolgreich gelÃ¶scht."
-msgstr "Order successfully deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1053
-#, fuzzy
-msgid "Seiten erfolgreich gelÃ¶scht."
-msgstr "Order has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1071
-#, fuzzy
-msgid "UnvollstÃ€ndige Bestellungen erfolgreich gelÃ¶scht."
-msgstr "Order successfully deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1132
-#, fuzzy
-msgid "Bitte mindestens ein Land zum lÃ¶schen auswÃ€hlen."
-msgstr "Please select at least one order!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1148
-#, fuzzy
-msgid "Die markierten LÃ€nder wurden erfolgreich gelÃ¶scht."
-msgstr "Variation has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1162
-#, fuzzy
-msgid "Land erfolgreich gespeichert."
-msgstr "Countries saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1169
-#, fuzzy
-msgid "Land erfolgreich angelegt."
-msgstr "Variation has been created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1187
-#, fuzzy
-msgid "EU-LÃ€nder erfolgreich importiert."
-msgstr "Countries saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1196
-#, fuzzy
-msgid "LÃ€nder erfolgreich importiert."
-msgstr "Countries saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1254
-msgid ""
-"WPML ist nicht komplett Installiert (Funktion icl_register_string ist nicht "
-"erreichbar)"
-msgstr ""
-"WPML is not completely installed (function icl_register_string is not "
-"available)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1301
-msgid "#1# Texte zur String-Ãbersetzung der Domain \"wpsg\" hinzugefÃŒgt."
-msgstr "# 1 # Added string translation texts for domain \"wpsg\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1332
-#, fuzzy
-msgid "EU"
-msgstr "EUR"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1390
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1394
-msgid "Inland"
-msgstr "Home land"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1391
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1395
-#, fuzzy
-msgid "EU LÃ€nder"
-msgstr "Countries"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1392
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1396
-msgid "Ausland"
-msgstr "foreign countries"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1450
-#, fuzzy
-msgid "Kundenmail wurde erfolgreich an #1# gesendet."
-msgstr "Mail has been sent to the customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1549
-msgid "Kundenvariablen erfolgreich gespeichert."
-msgstr "Customer variables saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1558
-msgid "Neues benutzerdefiniertes Feld"
-msgstr "New customized field"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1659
-msgid "Anhang migriert."
-msgstr "Attachment migrated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1678
-msgid "E-Mail Konfiguration erfolgreich gespeichert."
-msgstr "Email configuration was saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1700
-msgid "Keine Zuordnung"
-msgstr "No assignment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1701
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:51
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:71
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:85
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:124
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:77
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:80
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:77
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:72
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:65
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:97
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_onepagecheckout.class.php:38
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:51
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:139
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:63
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:50
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:76
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:111
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:71
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_targo.class.php:70
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:76
-msgid "Neu anlegen und zuordnen"
-msgstr "Create and assign"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1746
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:38
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_legaltexts.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_spconditions.class.php:18
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:87
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:29
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:22
-msgid "Sonstiges"
-msgstr "Miscellaneous"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1806
-#, fuzzy
-msgid "Widerrufsformular erfolgreich hochgeladen."
-msgstr "File for the download module was uploaded successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1812
-msgid "Dateiformat muss vom Type PDF sein."
-msgstr "File format must be of type PDF."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1818
-msgid ""
-"Mit dem Upload gab es ein Problem, mÃ¶glicherweise ist die Datei zu groÃ."
-msgstr "There was a problem with the upload, maybe the file is too big."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1838
-#, fuzzy
-msgid "Widerruf erfolgreich gespeichert."
-msgstr "Revocation saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1856
-#, fuzzy
-msgid "Widerrufsformular erfolgreich generiert."
-msgstr "Revocation saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1870
-#, fuzzy
-msgid "Widerrufsformular erfolgreich gelÃ¶scht."
-msgstr "Revocation saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1876
-#, fuzzy
-msgid "Widerrufsformular konnte nicht gelÃ¶scht werden."
-msgstr "Directory could not be created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1914
-#, fuzzy
-msgid "Refresh der News erfolgreich durchgefÃŒhrt."
-msgstr "No orders made yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1926
-#, fuzzy
-msgid "News wurde nicht gefunden,"
-msgstr "Order has not been found!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1961
-msgid "Fehlerprotokoll gelÃ¶scht."
-msgstr "Error log deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1982
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:74
-#, fuzzy
-msgid "Immer anzeigen"
-msgstr "Show in basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1984
-msgid "Anhand des Apache Moduls mod_geoip"
-msgstr "Using the Apache module mod_geoip"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1985
-msgid "Anhand der PECL Erweiterung php_geoip"
-msgstr "Based on the PECL extension php_geoip"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1987
-msgid "Anhand der Browsersprache"
-msgstr "Based on the browser language"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:1988
-#, fuzzy
-msgid "nicht anzeigen"
-msgstr "Don't show"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2024
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2041
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2071
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2088
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2098
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2250
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2261
-msgid "Einstellungen gespeichert."
-msgstr "Settings saved."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2169
-msgid "Keine gÃŒltige XML Einstellungsdatei angegeben!"
-msgstr "No valid XML file for settings specified."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2192
-msgid ""
-"Die importierte Seite mit der ID #1# ist noch nicht angelegt worden. Daher "
-"wird sie auf \"Keine Zuordnung\" gestellt."
-msgstr ""
-"The imported page with the ID # 1 # has not yet been created. Therefore, it "
-"is set to \"No Assignment\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2222
-msgid "Einstellungen wurden erfolgreich importiert."
-msgstr "Settings imported successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2230
-msgid "Bitte eine Einstellungsdatei angeben!"
-msgstr "Please specify a file for the settings!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2276
-msgid "Einstellung gespeichert."
-msgstr "Setting saved."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2284
-msgid "Berechtigungen gespeichert."
-msgstr "Authorization saved."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2323
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:296
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:25
-msgid "Anfrageliste"
-msgstr "Request list"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2324
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:298
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/adminmail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:9
-msgid "Warenkorb"
-msgstr "Basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2325
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:299
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:119
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:123
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:139
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:108
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:137
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:142
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:144
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:162
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:141
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:148
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:147
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:152
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:154
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:316
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:319
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:321
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:195
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:198
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:200
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:174
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:795
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:796
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1425
-msgid "Versandkosten"
-msgstr "Shipping cost"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2326
-#, fuzzy
-msgid "Produktdetail"
-msgstr "Products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2331
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:303
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:35
-msgid "Impressum"
-msgstr "Imprint"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2333
-msgid "Seiteneinstellungen bearbeitet."
-msgstr "Page assignments edited."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2349
-msgid "Moduleinstellungen gespeichert"
-msgstr "Module settings saved."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2386
-msgid "Datenbank erfolgreich abgeglichen!"
-msgstr "Database synchronized successfully!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2406
-msgid "Datenbank aktualisiert"
-msgstr "Database updated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2467
-msgid ""
-"Noch kein Hilfetext hinterlegt. Bitte versuchen Sie es spÃ€ter noch einmal."
-"<br />Hilfe finden sie auch unter <a href=\"http://forum.maennchen1.de"
-"\">http://forum.maennchen1.de</a>"
-msgstr ""
-"There is no help text specified yet. Please try again later. <br /> Support "
-"can be found <a href=\"http://forum.maennchen1.de\">here</a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2498
-msgid "Es wurden alle Plugins bis auf wpShopGermany deaktiviert."
-msgstr "All plugins except for wpShopGermany have been deactivated."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2514
-msgid ""
-"Plugins konnten nicht wieder hergestellt werden, da nicht gespeichert wurde "
-"welche Plugins aktiv waren."
-msgstr ""
-"Plugins could not be restored because there was no saving which plugins were "
-"active."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2525
-#, fuzzy
-msgid "Aktivierte Plugins wurden erfolgreich wieder hergesetellt."
-msgstr "Settings imported successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2572
-msgid "Modul (#1#) konnte nicht kopiert werden!"
-msgstr "Module (#1#) could not be copied!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2629
-msgid "Fehler beim Entpacken: #1#"
-msgstr "Error while unzipping: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2645
-msgid "Datei konnte nicht ÃŒbertragen werden."
-msgstr "File could not be transfered."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_AdminController.class.php:2649
-msgid "Datei konnte nicht entpackt werden."
-msgstr "Failed to extract file."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:145
-#, fuzzy
-msgid "Bitte einen Kunden definieren."
-msgstr "Please enter a subject!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:186
-#, fuzzy
-msgid "Es konnte kein Kunde gefunden werden."
-msgstr "There is no customer with these login data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:234
-#, fuzzy
-msgid "Bestellung im Backend angelegt."
-msgstr "Show order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:238
-#, fuzzy
-msgid "Die neue Bestellung wurde vorbereitet."
-msgstr "Page assignments edited."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1018
-msgid ""
-"URL Benachrichtigung (Bezahlung) wurde fÃŒr die Produkte der Bestellung "
-"simuliert."
-msgstr ""
-"URL notification (payment) was simulated for the products of the order."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1039
-msgid ""
-"URL Benachrichtigung (Kauf) wurde fÃŒr die Produkte der Bestellung simuliert."
-msgstr ""
-"URL notification (purchase) was simulated for the products of the order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1051
-#, fuzzy
-msgid "Kundenmail wurde erfolgreich an #1# simuliert."
-msgstr "Customer has been saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1063
-#, fuzzy
-msgid "Adminmail wurde erfolgreich an #1# simuliert."
-msgstr "Variation has been activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1079
-msgid "Status konnte nicht gesetzt werden!"
-msgstr "Status could no been set!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1088
-msgid "Status wurde erfolgreich geÃ€ndert!"
-msgstr "Status changed successfully!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1090
-msgid "Status wurde nicht geÃ€ndert, da unverÃ€ndert."
-msgstr "Status was not saved because it has not been changed."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1105
-msgid "Bestellung wurde storniert und Kunde benachrichtigt."
-msgstr "Order was canceled. Customer has been informed."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1159
-#, fuzzy
-msgid "Mail wurde erfolgreich versendet."
-msgstr "Mail has been sent to the customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1445
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:116
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:23
-msgid "Bestelldaten"
-msgstr "Order data"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1453
-#, fuzzy
-msgid "Versand-/Zahlungsart"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1461
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderlog.phtml:11
-msgid "Bestellprotokoll"
-msgstr "Order protocol"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1469
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:11
-msgid "Entwickleroptionen"
-msgstr "developer options"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1499
-msgid "Keine Bestellnummer ÃŒbergeben."
-msgstr "No order number assigned."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1507
-msgid "Bestellung erfolgreich gelÃ¶scht."
-msgstr "Order has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1575
-msgid "Keine Rechnungen gewÃ€hlt!"
-msgstr "No bill has been selected!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1583
-msgid "Bitte eine Aktion wÃ€hlen!"
-msgstr "Please select an action!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1584
-msgid "Bitte mindestens eine Bestellung auswÃ€hlen!"
-msgstr "Please select at least one order!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1596
-msgid "#1# Bestellung(en) gelÃ¶scht."
-msgstr "#1# order(s) deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1679
-msgid ""
-"FÃŒr die gewÃ€hlten Bestellungen konnten keine Rechnungen geschrieben werden, "
-"bestehende Rechnungen mÃŒssen erst storniert werden."
-msgstr "Before writing a new invoice you need to cancel the existing invoice."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1687
-msgid "#1# Rechnungen geschrieben"
-msgstr "#1# invoice(s) written"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1688
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/order_view_sidebar.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml:16
-msgid "Download"
-msgstr "Download"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1705
-msgid ""
-"Status von #1# Bestellungen aktualisiert (Kunden wurden nicht benachrichtigt)"
-msgstr ""
-"status of #1# orders has been updated (customers have not been informed)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_OrderController.class.php:1773
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:75
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:96
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:108
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:114
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:361
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:441
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1230
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:251
-msgid "Alle"
-msgstr "All"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:130
-msgid "Eingegangen"
-msgstr "Received"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:131
-msgid "Auftrag akzeptiert"
-msgstr "Order accepted"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:132
-msgid "Zahlung akzeptiert"
-msgstr "Payment accepted"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:133
-#, fuzzy
-msgid "Rechnung geschrieben"
-msgstr "Generate invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:134
-msgid "Zahlung fehlgeschlagen"
-msgstr "Payment failed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:135
-msgid "Ware versendet"
-msgstr "Item(s) shipped"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:136
-msgid "zugestellt"
-msgstr "delivered"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:137
-msgid "zurÃŒckgezahlt"
-msgstr "refunded"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:138
-msgid "storniert"
-msgstr "canceled"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:139
-msgid "UnvollstÃ€ndig"
-msgstr "Incomplete"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:140
-msgid "aktive Abos"
-msgstr "active Abos"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:141
-msgid "ausstehende AbokÃŒndigungen"
-msgstr "pending cancellations"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:142
-msgid "gekÃŒndigte Abos"
-msgstr "canceled subscriptions"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:188
-msgid "UngÃŒltige Einheit fÃŒr das automatische Anonymisieren der Kundendaten."
-msgstr "Invalid unit for the automatic anonymization of customer data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:241
-msgid "wpShopGermany DemoProdukt WordPress Artikel"
-msgstr "wpShopGermany DemoProduct WordPress Articles"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:262
-msgid "wpShopGermany DemoProdukt"
-msgstr "wpShopGermany DemoProduct"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:265
-msgid "Dies ist der ProdukttextâŠ"
-msgstr "This is the product text..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:273
-msgid "wpShopGermany DemoProdukt WordPress Seite"
-msgstr "wpShopGermany DemoProduct WordPress page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:304
-#, fuzzy
-msgid "Produktdetails"
-msgstr "Price of product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:384
-msgid ""
-"Aufgrund der Kleinunternehmerregelung gemÃ€Ã Â§ 19 UStG wird keine "
-"Umsatzsteuer erhoben oder ausgewiesen."
-msgstr ""
-"Since I run a 'small business' as defined in Â§19 UStG, I do not invoice VAT."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:727
-msgid "Hauptsitz"
-msgstr "Headquarters"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:741
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:58
-#, fuzzy
-msgid "Zweigstelle"
-msgstr "Order value"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:920
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:964
-#, fuzzy
-msgid "Bitte warten"
-msgstr "Please wait..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:921
-#, fuzzy
-msgid "Ihr Text"
-msgstr "Text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:922
-#, fuzzy
-msgid "keine Angaben."
-msgstr "No statement"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:923
-#, fuzzy
-msgid "Bitte machen Sie hier eine Angabe."
-msgstr "Please enter your \"Company\" !"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:960
-msgid "Klicken zum Aufklappen"
-msgstr "Click to expand"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:961
-msgid "Klicken zum Einklappen"
-msgstr "Click to fold"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:980
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:982
-msgid "* Dieses Feld ist ein Pflichtfeld"
-msgstr "* This field is a required field"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:981
-msgid "* Bitte wÃ€hlen Sie eine Option"
-msgstr "* Please choose an option"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:983
-msgid "* Mindestens "
-msgstr "* At least"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:984
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:986
-msgid " Zeichen benÃ¶tigt"
-msgstr "Characters needed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:985
-msgid "* Maximal"
-msgstr "* Maximum"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:987
-msgid "* You must fill one of the following fields"
-msgstr "* You must fill one of the following fields"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:988
-msgid "* Mindeswert ist "
-msgstr "* Minimum value is"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:989
-msgid "* Maximalwert ist "
-msgstr "* Maximum value is"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:990
-msgid "* Datum vor "
-msgstr "* Date before"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:991
-msgid "* Datum nach "
-msgstr "* Date after"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:992
-msgid "* Maximale Anzahl Markierungen ÃŒberschritten"
-msgstr "* Maximum number of marks exceeded"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:993
-#, fuzzy
-msgid "* Bitte wÃ€hlen Sie "
-msgstr "Please select"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:994
-msgid " Optionen"
-msgstr "options"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:995
-#, fuzzy
-msgid "* Felder stimmen nicht ÃŒberein"
-msgstr "Hash values don't match!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:996
-msgid "* UngÃŒltige Kreditkartennummer"
-msgstr "* Invalid credit card number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:997
-msgid "* UngÃŒltige Telefonnummer"
-msgstr "* Invalid telephone number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:998
-#, fuzzy
-msgid "* UngÃŒltige E-Mail Adresse"
-msgstr "Email address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:999
-#, fuzzy
-msgid "* Keine gÃŒltige Ganzzahl"
-msgstr "No valid licence"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1000
-#, fuzzy
-msgid "* Keine gÃŒltige FlieÃkommazahl"
-msgstr "No valid licence"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1001
-msgid "* UngÃŒltiges Datumsformat, erwartet wird das Format TT.MM.JJJJ"
-msgstr "* Invalid date format, the format is expected to be DD.MM.YYYY"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1002
-#, fuzzy
-msgid "* UngÃŒltige IP Adresse"
-msgstr "Invalid request"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1003
-#, fuzzy
-msgid "* UngÃŒltige URL"
-msgstr "Invalid"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1004
-msgid "* Nur Buchstaben erlaubt"
-msgstr "* Only letters allowed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1005
-msgid "* Keine Sonderzeichen erlaubt"
-msgstr "* No special characters allowed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1006
-msgid "* Dieser Benutzer ist bereits vergeben"
-msgstr "* This user is already taken"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1007
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1010
-msgid "* ÃberprÃŒfe Angaben, bitte warten"
-msgstr "* Please check details, please wait"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1008
-msgid "* Dieser Name ist bereits vergeben"
-msgstr "* This name is already taken"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1009
-msgid "* Dieser Name ist verfÃŒgbar"
-msgstr "* This name is available"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1011
-msgid "* Bitte HELLO eingeben"
-msgstr "* Please enter HELLO"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1012
-msgid "* Bitte geben Sie einen Vorname an."
-msgstr "* Please enter a first name."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1023
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:569
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:29
-msgid "Dieses Feld ist ein Pflichtfeld."
-msgstr "This field is a required field."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1024
-#, fuzzy
-msgid "Bitte wÃ€hlen Sie eine Option."
-msgstr "Please select at least one option."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1025
-#, fuzzy
-msgid "UngÃŒltige E-Mail Adresse."
-msgstr "Email address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1026
-#, fuzzy
-msgid "UngÃŒltige URL."
-msgstr "Invalid"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1027
-msgid "Format: TT.MM.JJJJ beachten."
-msgstr "Format: Note DD.MM.YYYY"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1028
-msgid "UngÃŒltiges Datumsformat (ISO)."
-msgstr "Invalid date format (ISO)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1029
-#, fuzzy
-msgid "Keine gÃŒltige Ganzzahl."
-msgstr "No valid licence"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1030
-#, fuzzy
-msgid "Keine gÃŒltige FlieÃkommazahl."
-msgstr "No valid licence"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1031
-msgid "UngÃŒltige Kreditkartennummer."
-msgstr "Invalid credit card number."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1032
-#, fuzzy
-msgid "Felder stimmen nicht ÃŒberein."
-msgstr "Hash values don't match!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1033
-msgid "MaximallÃ€nge ist {0}."
-msgstr "Maximum length is {0}."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1034
-msgid "MindestlÃ€nge ist {0} characters."
-msgstr "Minimum length is {0} characters."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1035
-msgid "Bitte geben Sie einen Wert zwischen {0} und {1} LÃ€nge ein."
-msgstr "Please enter a value between {0} and {1} length."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1036
-msgid "Bitte geben Sie einen Wert zwischen {0} und {1} ein."
-msgstr "Please enter a value between {0} and {1}."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1037
-msgid "Maximalwert {0}."
-msgstr "Maximum value {0}."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1038
-msgid "Minimalwert {0}."
-msgstr "Minimum value {0}."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1133
-msgid "UngÃŒltige Anfrage!"
-msgstr "Invalid request!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1340
-msgid ""
-"Die Anfrageliste ist nicht korrekt definiert. Der Shop wird nicht korrekt "
-"funktionieren. Sie kÃ¶nnen dies in der <a href=\"#1#\">Seitenkonfiguration</"
-"a> Ã€ndern."
-msgstr ""
-"The request list is not defined correctly. The shop will not work correctly. "
-"You can change this in the <a href=\"#1#\"> page configuration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1352
-msgid ""
-"Es gibt noch einen alten Anhang der Kundenmail auÃerhalb der Mediathek, "
-"dieser muss in die Mediathek ÃŒberfÃŒhrt oder neu angegeben werden. <a href="
-"\"#1#\">Automatisiert ÃŒbernehmen</a> / <a href=\"#2#\">E-Mail Konfiguration</"
-"a>"
-msgstr ""
-"There is still an old attachment of the customer's mail outside the library, "
-"this must be transferred to the library or re-specified. <a href=\"#1#\"> "
-"Apply automatically </a> / <a href=\"#2#\"> Email configuration </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1367
-msgid ""
-"Die Warenkorbseite ist nicht korrekt definiert. Der Shop wird nicht korrekt "
-"funktionieren. Sie kÃ¶nnen dies in der <a href=\"#1#\">Seitenkonfiguration</"
-"a> Ã€ndern."
-msgstr ""
-"The shopping cart page is not defined correctly. The shop will not work "
-"correctly. You can change this in the <a href=\"#1#\"> page configuration </"
-"a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1379
-msgid ""
-"Es ist keine Seite fÃŒr das OnePageCheckout definiert. Der Shop wird nicht "
-"korrekt funktionieren. Sie kÃ¶nnen dies in den <a href=\"#1#"
-"\">Moduleinstellungen</a> Ã€ndern."
-msgstr ""
-"There is no page defined for the OnePageCheckout. The shop will not work "
-"correctly. You can change this in the <a href=\"#1#\"> module settings </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1391
-msgid ""
-"Die Produktdetailseite ist nicht korrekt definiert. Dies kann bei bestimmten "
-"Konfigurationen zu Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href=\"#1#"
-"\">Seitenkonfiguration</a> Ã€ndern."
-msgstr ""
-"The product detail page is not defined correctly. This can cause problems "
-"with certain configurations. You can change this in the <a href=\"#1#\"> "
-"page configuration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1400
-msgid ""
-"Es ist keine Seite fÃŒr die detaillierten Versandkosten definiert, dies "
-"kÃ¶nnte zu rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href=\"#1#"
-"\">Seitenkonfiguration</a> Ã€ndern."
-msgstr ""
-"There is no page defined for the detailed shipping costs, this could lead to "
-"legal problems. You can change this in the <a href=\"#1#\"> page "
-"configuration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1409
-msgid ""
-"Es ist keine Seite fÃŒr die AGB definiert, dies kÃ¶nnte zu rechtlichen "
-"Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href=\"#1#"
-"\">Seitenkonfiguration</a> Ã€ndern."
-msgstr ""
-"There is no page defined for the terms and conditions, this could lead to "
-"legal problems. You can change this in the <a href=\"#1#\"> page "
-"configuration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1418
-msgid ""
-"Es ist keine Seite fÃŒr die Datenschutzbedingungen definiert, dies kÃ¶nnte zu "
-"rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href=\"#1#"
-"\">Seitenkonfiguration</a> Ã€ndern."
-msgstr ""
-"No privacy page is defined, this could lead to legal issues. You can change "
-"this in the <a href=\"#1#\"> page configuration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1427
-msgid ""
-"Es ist keine Seite fÃŒr die Widerrufsbelehrung definiert, dies kÃ¶nnte zu "
-"rechtlichen Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href=\"#1#"
-"\">Seitenkonfiguration</a> Ã€ndern."
-msgstr ""
-"There is no page defined for the revocation policy, this could lead to legal "
-"problems. You can change this in the <a href=\"#1#\"> page configuration </"
-"a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1436
-msgid ""
-"Es ist keine Seite fÃŒr das Impressum definiert, dies kÃ¶nnte zu rechtlichen "
-"Problemen fÃŒhren. Sie kÃ¶nnen dies in der <a href=\"#1#"
-"\">Seitenkonfiguration</a> Ã€ndern."
-msgstr ""
-"There is no page defined for the imprint, this could lead to legal problems. "
-"You can change this in the <a href=\"#1#\"> page configuration </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1445
-#, fuzzy
-msgid ""
-"Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. "
-"Informationen finden Sie in unseren <a target=\"_blank\" href=\"http://"
-"wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-"
-"server-aktiviert-sind/\">FAQ</a>."
-msgstr ""
-"nohspc_Your server has no PHP library for SOAP support. A registration of "
-"your domain is not possible! <br />Further information can be found in our "
-"<a target=\"_blank\" href=\"http://wpshopgermany.maennchen1.de/faqs/wie-"
-"pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/\">FAQ</a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1457
-msgid ""
-"Ab der wpShopGermany Version 3.4 kann das kostenlose Modul \"<a href=\"#1#"
-"\">Bestellbedingungen</a>\" verwendet werden. Sie kÃ¶nnen es <a href=\"#2#"
-"\">hier</a> konfigurieren. ÃberprÃŒfen Sie auch die anderen Ãnderungen, die "
-"wir <a href=\"#3#\">in unserem Artikel</a> nÃ€her erlÃ€utern."
-msgstr ""
-"Starting with the wpShopGermany Version 3.4, the free module \"<a href=\"#1#"
-"\"> Ordering Conditions </a>\" can be used. You can configure it <a href="
-"\"#2#\"> here </a>. Also review the other changes, which we'll explain in "
-"more detail <a href=\"#3#\"> in our article </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1474
-msgid ""
-"Es existieren noch alte angepasste Templates unter #1#. Kopieren Sie diese "
-"bitte nach #2#. ZukÃŒnftig werden die Templateanpassungen nicht mehr im "
-"Pluginverzeichnis gesucht. Weitere Informationen erhalten Sie auch <a href="
-"\"#3#\">hier</a> oder auch in unserem kostenlosen <a href=\"#4#\">Forum</a>."
-msgstr ""
-"There are still old custom templates under # 1 #. Please copy it to # 2 #. "
-"In future, template customizations will no longer be searched in the plugin "
-"directory. For more information, please visit <a href=\"#3#\"> here </a> or "
-"our free <a href=\"#4#\"> forum </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1491
-msgid ""
-"Es wurde kein Standardland definiert, der Shop kann so nicht korrekt "
-"betrieben werden. Bitte ÃŒberprÃŒfen Sie die <a href=\"#1#"
-"\">LÃ€nderkonfiguration</a>."
-msgstr ""
-"No standard country was defined, the shop can not be operated correctly. "
-"Please check the <a href=\"#1#\"> country configuration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1506
-msgid ""
-"<b>wpShopGermany:</b> Sprachdatei kann nicht geschrieben werden! PrÃŒfen Sie "
-"die Schreibrechte auf folgender Datei:<br /><b>#1#</b>"
-msgstr ""
-"<b> wpShopGermany: </ b> Can not write language file! Check the write "
-"permission on the following file: <br /> <b> # 1 # </ b>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1521
-msgid ""
-"Kein WÃ€hrungscode definiert, dies kann zu Darstellungsproblemen und "
-"mÃ¶glicherweise Abmahnungen fÃŒhren. Sie kÃ¶nnen dies <a href=\"#1#\">hier</a> "
-"konfigurieren."
-msgstr ""
-"No currency code defined, this can lead to display problems and possibly "
-"warnings. You can configure this <a href=\"#1#\"> here </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1542
-msgid ""
-"Die SystemprÃŒfung hat #1# Fehler festgestellt, klicken Sie <a href=\"#2#"
-"\">hier</a> fÃŒr Details."
-msgstr ""
-"The system scan detected # 1 # errors, click <a href=\"#2#\"> here </a> for "
-"details."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1626
-msgid ""
-"Das Template (#1#) fÃŒr ein Produkt (ID:#2#) scheint nicht zu existieren!"
-msgstr "It seems there is no template (#1#) for a product (ID: #2#)!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:1689
-#, fuzzy
-msgid "Produkt in den Warenkorb legen"
-msgstr "Remove product from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:2417
-#, fuzzy
-msgid "Produkt ID konnte nicht gebildet werden: "
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:2562
-msgid "StatusÃ€nderung mit Email an #1# von \"#2#\" auf \"#3#\""
-msgstr "Changed status with mail to #1# from \"#2#\" to \"#3#\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:2576
-msgid "StatusÃ€nderung von \"#1#\" auf \"#2#\""
-msgstr "Changed status from  \"#1#\" to \"#2#\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:2577
-msgid "Kunde wurde nicht informiert"
-msgstr "Customer has not been informed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:2809
-#, fuzzy
-msgid "UngÃŒltige Seite"
-msgstr "Invalid"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:3748
-msgid "Unerwarteter Fehler beim schreiben der Ãbersetzungsdatei."
-msgstr "Unexpected error while writing the translation file."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:3799
-msgid ""
-"Sprachdatei konnte nicht geschrieben werden! Setzen Sie bitte Schreibrechte "
-"auf folgender Datei ÃŒberprÃŒfen:<br /><b>"
-msgstr ""
-"Language file could not be written! Please set write permissions to check "
-"the following file: <br /> <b>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:3823
-#, fuzzy
-msgid ""
-"Ihre Datenbankversion ist nicht auf dem aktuellen Stand, aktualisieren Sie "
-"die Datenbank, indem Sie <a href=\"#1#\">hier</a> klicken.<br />Klicken Sie "
-"<a href=\"#1#\">hier</a>, um die Meldung auszublenden."
-msgstr ""
-"nohspc_Your database version is not up to date. Please update your database "
-"by clicking <a href=\"#1#\">here</a>. Or click <a href=\"#1#\">here</a> to "
-"hide this message."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:4074
-msgid "Versuchte Zahlung ÃŒber #1#."
-msgstr "Tried payment using #1#."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ShopController.class.php:4385
-msgid "Deaktivierte Versandart (#1#)"
-msgstr "Deactivated shipping method (# 1 #)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:215
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1647
-#, fuzzy
-msgid "Keine Daten zum Exportieren vorhanden."
-msgstr "No data available for export."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:333
-#, fuzzy
-msgid "Konnte ZIP Archiv nicht erstellen."
-msgstr "Could not create zip archive!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:376
-#, fuzzy
-msgid "Konnte ZIP Archiv nicht entpacken."
-msgstr "Could not create zip archive!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:405
-#, fuzzy
-msgid "Keine Produktdaten im ZIP Archiv gefunden."
-msgstr "No product key found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:416
-#, fuzzy
-msgid "Konnte ZIP Archiv nicht Ã¶ffnen."
-msgstr "Could not create zip archive!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:544
-msgid "#1# Produkte wurden importiert."
-msgstr "#1# products imported."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:551
-#, fuzzy
-msgid "Keine Datei zum Import angegeben."
-msgstr "No data available for export."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:675
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:966
-msgid "Artikel"
-msgstr "Article"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:682
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:973
-msgid "Seiten"
-msgstr "Pages"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:695
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:986
-#, fuzzy
-msgid "Texte"
-msgstr "Text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:718
-#, fuzzy
-msgid "Bewertungen"
-msgstr "Authorizations"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:728
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:9
-msgid "Preis / Steuer"
-msgstr "Price \\ tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:733
-#, fuzzy
-msgid "Versand-/ Zahlungsarten"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:751
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:33
-msgid "Produktbilder"
-msgstr "Product pictures"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:786
-msgid "KOPIE"
-msgstr "COPY"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:809
-msgid "Produkt wurde erfolgreich kopiert."
-msgstr "Product copied successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:835
-msgid "ERROR: Ãbersetzung existiert noch nicht, das dÃŒrfte nicht passieren!"
-msgstr "ERROR: There is no translation yet, this should not occur!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:848
-msgid "Ãbersetzung erfolgreich gespeichert"
-msgstr "Translation saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:912
-msgid "Produkt erfolgreich gespeichert."
-msgstr "Product saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:920
-msgid "Produkt erfolgreich angelegt."
-msgstr "Product created successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1038
-msgid "Produkt erfolgreich gelÃ¶scht."
-msgstr "Product deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1124
-#, fuzzy
-msgid "Alle Produkte"
-msgstr "Amount products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1147
-msgid "Interne ID"
-msgstr "Internal ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1148
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select_filter.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:274
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1475
-msgid "Produktname"
-msgstr "Product name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:144
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1491
-msgid "Artikelnummer"
-msgstr "Item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1150
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:156
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:14
-msgid "Preis"
-msgstr "Price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1154
-msgid "Aufsteigend"
-msgstr "ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1155
-msgid "Absteigend"
-msgstr "descending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/controller/wpsg_ProduktController.class.php:1163
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_relatedproducts.class.php:286
-msgid "Aus Produkt"
-msgstr "From product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/helper_functions.inc.php:172
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/helper_functions.inc.php:203
-msgid "Verzeichnis konnte nicht angelegt werden."
-msgstr "Directory could not be created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/helper_functions.inc.php:300
-#, fuzzy
-msgid "Anhang hochgeladen."
-msgstr "No package uploaded!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_db.class.php:20
-msgid "Letzter Query"
-msgstr "last query"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_db.class.php:240
-#, fuzzy
-msgid "Update ohne Daten?"
-msgstr "Update within the database"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:100
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:114
-msgid "Kein Rechnungslaud fÃŒr die Berechnung gesetzt."
-msgstr "No bill for calculation set."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:126
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:138
-msgid "Kein Standardland fÃŒr die Berechnung gesetzt."
-msgstr "No default country set for calculation."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:357
-msgid "Warenkorb kann nicht ohne ein gesetztes Land berechnet werden."
-msgstr "Shopping cart can not be calculated without a country set."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:779
-msgid "Land mit der ID #1# existiert nicht mehr."
-msgstr "Country with ID # 1 # does not exist anymore."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_calculation.class.php:1131
-msgid "Standardland konnte in Berechnung nicht ermittelt werden."
-msgstr "Standard country could not be determined in calculation."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_exceptionhandler.class.php:31
-#, fuzzy
-msgid "Allgemeiner Fehler"
-msgstr "General"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/functions.inc.php:352
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:445
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:511
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:622
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:458
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:524
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:635
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:287
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:300
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:344
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:374
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:166
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:179
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:242
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:283
-msgid "anteilig"
-msgstr "pro rata"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/functions.inc.php:529
-msgid ""
-"Beim umsortieren eines Arrays gab es im Original Array mehr Elemente als in "
-"der angegebenen Sortierung"
-msgstr ""
-"When reordering an array, there were more elements in the original array "
-"than in the specified sort"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/functions.inc.php:566
-msgid "Beim escapen wurde ein Objekt ÃŒbergeben, hier sind nur Strings erlaubt."
-msgstr "When escaping an object was passed, here only strings are allowed."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/functions.inc.php:1277
-msgid "UnzulÃ€ssige Pfadangabe!"
-msgstr "Invalid path specification!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:16
-msgid "wpShopGermany Warenkorb Widget"
-msgstr "wpShopGermany basket widget"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:62
-msgid "Seiten unterhalb des Widgets"
-msgstr "Pages below the widget"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:69
-msgid "Datenschutzrichtlinien"
-msgstr "Privacy policy"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:116
-msgid "Online Streitbeilegung"
-msgstr "Online Dispute Resolution"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:75
-msgid "Versandhinweis"
-msgstr "Shipment information"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:77
-msgid ""
-"Wenn nichts angezeigt wird, so wird der Standardtext \"Alle Preise inklusive "
-"MwSt. und zzgl. Versandkosten\" angezeigt!"
-msgstr ""
-"If nothing is displayed you will see the default text \"All prices incl. "
-"sales taxes and excl. shipping cost\" !"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket_widget.class.php:77
-msgid "Im Text ist HTML Code erlaubt."
-msgstr "HTML code is allowed in the text."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/update.php:144
-msgid ""
-"Die Produkttemplates \"standard2.phtml\" und \"standard_login.phtml\" wurden "
-"mit dem Update auf Version 3.2.0 entfernt. Die Konfiguration wurde "
-"automatisch angepasst.<br />Weitere Informationen erhalten Sie <a href="
-"\"http://wpshopgermany.maennchen1.de/?p=3647\">hier</a>."
-msgstr ""
-"The product templates \"standard2.phtml\" and \"standard_login.phtml\" were "
-"removed with the update to version 3.2.0. The configuration has been "
-"adjusted automatically. <br /> For more information, please visit <a href="
-"\"http://wpshopgermany.maennchen1.de/?p=3647\"> here </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/update.php:151
-msgid ""
-"Das Produkttemplate wurde mit dem Update auf 3.2.0 angepasst, bitte "
-"ÃŒberprÃŒfen Sie die Darstellung in Ihrem Shop."
-msgstr ""
-"The product template was adjusted with the update to 3.2.0, please check the "
-"presentation in your shop."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/update.php:169
-msgid ""
-"Die MehrwertsteuersÃ€tze sind jetzt an die LÃ€nder gekoppelt. <a onclick="
-"\"return confirm('Sind Sie sich sicher?');\" href=\"#1#\">Importieren</a> "
-"sie die Standardliste oder ÃŒberprÃŒfen sie die <a href=\"#2#"
-"\">LÃ€nderkonfiguration</h2>."
-msgstr ""
-"The VAT rates are now linked to the countries. <a onclick = \"return confirm "
-"('Are you sure?');\" href = \"# 1 #\"> Import </a> the default list or check "
-"the <a href=\"#2#\"> country configuration </ h2>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/update.php:178
-msgid ""
-"Bitte ÃŒberprÃŒfen Sie die Konfiguration der Mehrwertsteuer in den Produkten "
-"und der Konfiguration. <a href=\"#1#\">Migrationsassistent starten</a>"
-msgstr ""
-"Please check the VAT configuration in the products and the configuration. <a "
-"href=\"#1#\"> Start Migration Assistant </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_remoteconnection.class.php:31
-msgid "Konnte keine Verbindung zu #1# aufbauen. (Host)"
-msgstr "Could not connect to # 1 #. (Host)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_remoteconnection.class.php:34
-msgid "Konnte keine Verbindung zu #1# aufbauen. (Zugangsdaten)"
-msgstr "Could not connect to # 1 #. (Access data)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:120
-msgid ""
-"Das Produkt befindet sich bereits im Warenkorb, es kann nur einmal erworben "
-"werden."
-msgstr ""
-"The product is already in the shopping cart, it can only be purchased once."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:583
-msgid "Bestellmail (Admin) an:#1#"
-msgstr "Order mail (Admin) to: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:629
-msgid "Bestellmail (Kunde) an:#1#"
-msgstr "Order mail (Customer) to: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:921
-msgid "Bitte im Feld \"Anrede\" eine Angabe machen!"
-msgstr "Please select your \"Salutation\" !"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:931
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:522
-msgid "Bitte im Feld \"Firma\" eine Angabe machen!"
-msgstr "Please enter your \"Company\" !"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:941
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:523
-msgid "Bitte im Feld \"Vorname\" eine Angabe machen!"
-msgstr "Please enter your \"First name\" !"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:951
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:524
-msgid "Bitte im Feld \"Name\" eine Angabe machen!"
-msgstr "Please enter your \"Last name\" !"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:965
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:547
-msgid "Bitte die Eingabe im Feld \"Geburtsdatum\" ÃŒberprÃŒfen!"
-msgstr "Please enter a valid \"Day of birth\" !"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:978
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:559
-msgid "Bitte die Eingabe der E-Mail Adresse ÃŒberprÃŒfen!"
-msgstr "Please enter a valid email-address!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:994
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:501
-#, fuzzy
-msgid "Bitte ÃŒberprÃŒfen Sie die Eingaben in der E-Mail BestÃ€tigung!"
-msgstr "Please check your input for the email-address confirmation!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1006
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:526
-msgid "Bitte die Eingabe im Feld \"Telefonnummer\" ÃŒberprÃŒfen!"
-msgstr ""
-"Please enter a valid \"Telephone number\" including your international "
-"country prefix!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1016
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1025
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:527
-msgid "Bitte die Eingaben im Feld \"StraÃe\" ÃŒberprÃŒfen!"
-msgstr "Please enter your \"Street\" address!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1035
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:525
-msgid "Bitte die Eingaben im Feld \"Fax\" ÃŒberprÃŒfen!"
-msgstr ""
-"Please enter a valid \"Fax\" including your international country prefix!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1045
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:528
-msgid "Bitte die Eingaben im Feld \"PLZ\" ÃŒberprÃŒfen!"
-msgstr "Please enter a valid \"Zip code\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1055
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:529
-msgid "Bitte die Eingaben im Feld \"Ort\" ÃŒberprÃŒfen!"
-msgstr "Please enter your \"City\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1065
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:566
-msgid "Bitte ein Land auswÃ€hlen!"
-msgstr "Please select a country!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1075
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:530
-msgid "Bitte die Eingaben im Feld \"UStIdNr.\" prÃŒfen!"
-msgstr "Please enter a valid \"Sales tax\" identification number!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1099
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:617
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:669
-#, fuzzy
-msgid "Bitte \"#1#\" akzeptieren!"
-msgstr "Please accept \"#1#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1113
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:607
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:653
-#, fuzzy
-msgid "Bitte eine Auswahl im Feld \"#1#\" treffen!"
-msgstr "Please select your entry for \"#1#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1127
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:594
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:662
-#, fuzzy
-msgid "Bitte machen Sie in Feld \"#1#\" eine Angabe!"
-msgstr "Please make an entry for field \"#1#\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1155
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:601
-msgid "Bitte eine gÃŒltige Versandart auswÃ€hlen."
-msgstr "Please select a valid shipping method."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1172
-msgid "Bitte eine gÃŒltige Zahlungsart auswÃ€hlen."
-msgstr "Please select a valid payment method."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/wpsg_basket.class.php:1187
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:385
-msgid "Keine Produkte im Warenkorb."
-msgstr "No products in your basket."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:113
-msgid "Neue Lizenz aktivieren"
-msgstr "Activate new licence"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:114
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:107
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:126
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:393
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:132
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:259
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_view_afterpayment.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit.phtml:36
-msgid "Sind Sie sich sicher?"
-msgstr "Are you sure?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:114
-#, fuzzy
-msgid "Lizenz lÃ¶schen"
-msgstr "Delete country"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:118
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:161
-#, fuzzy
-msgid "Lizenzcode: "
-msgstr "End of licence"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:120
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:163
-msgid "Code prÃŒfen"
-msgstr "Check code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:149
-msgid ""
-"<span style=\"color:red; font-weight:bold;\">wpShopGermany Vollversion "
-"erwerben, Updates erhalten und weitere Funktionen freischalten.</span><br />"
-msgstr ""
-"<span style = \"color: red; font-weight: bold;\"> wpShopGermany Get the full "
-"version, get updates, and unlock more features. </ span> <br />"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:155
-msgid ""
-"[ <a href=\"#\" onclick=\"jQuery('#wpsg_lizenz').show(100); "
-"jQuery('#wpsg_licence_file').focus(); jQuery('#wpsg_lizenz_link').hide(); "
-"return false;\">Lizenzcode eingeben</a> ] [ <a target=\"_blank\" href=\"#1#"
-"\">Vollversion kaufen</a> ] [ <a target=\"_blank\" href=\"#2#\">Weitere "
-"Infos</a> ]"
-msgstr ""
-"[<a href = \"#\" onclick = \"jQuery ('# wpsg_license'). show (100); jQuery "
-"('# wpsg_licence_file'). focus (); jQuery ('# wpsg_lizenz_link'). hide (); "
-"return false ;>> Enter License Code </a>] [<a target=\"_blank\" href=\"#1#"
-"\"> Buy Full Version </a>] [<a target=\"_blank\" href=\"#2#\"> More Info </"
-"a>]"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:228
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/wpml.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/path.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:11
-msgid "Konfiguration"
-msgstr "Configuration"
-
-msgid "Lizenzcode eingeben"
-msgstr "enter licence code"
-
-msgid "Vollversion kaufen"
-msgstr "buy fullversion"
-
-msgid "Weitere Infos"
-msgstr "more infos"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:229
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:84
-msgid "Produktverwaltung"
-msgstr "Product management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:230
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/adminmail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:74
-msgid "Bestellverwaltung"
-msgstr "Order management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:360
-#, fuzzy
-msgid "wpShopGermany Debug"
-msgstr "wpShopGermany"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:386
-msgid "Wichtiger Update Hinweis"
-msgstr "Important update note"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:485
-#, fuzzy
-msgid "Fehler: #1#"
-msgstr "Phone: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:559
-#, fuzzy
-msgid "Lizenz wurde entfernt."
-msgstr "Activate licence."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:648
-msgid "Kopiere Shop aus dem Pluginverzeichnis ..."
-msgstr "Copying shop from plugin directory..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:707
-msgid "Kopiere Shop zurÃŒck ..."
-msgstr "Copying shop to origin..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/lib/filter_functions.inc.php:768
-msgid "Aktualisiere Shop Datenbank ..."
-msgstr "Updating the shop's database..."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:74
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:74
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1493
-msgid "EAN"
-msgstr "EAN"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1494
-msgid "GTIN"
-msgstr "GTIN"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:88
-msgid "StÃŒckpreis:"
-msgstr "Item price:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:141
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:147
-#, fuzzy
-msgid "#2# zzgl. #1#"
-msgstr "Price plus #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:119
-#, fuzzy
-msgid "(zzgl. #1#% MwSt. und versandkostenfrei)"
-msgstr "(plus #1# sales tax and plus #2#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:123
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:152
-msgid "(zzgl. #1#% MwSt. und zzgl. #2#)"
-msgstr "(plus #1# sales tax and plus #2#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:117
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:135
-#, fuzzy
-msgid "(inkl. #1#% MwSt. und versandkostenfrei)"
-msgstr "(incl. #1#% sales tax and plus #2#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:119
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:139
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:148
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:154
-msgid "(inkl. #1#% MwSt. und zzgl. #2#)"
-msgstr "(incl. #1#% sales tax and plus #2#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:128
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:148
-msgid ""
-"Die Produktpreise werden nur eingeloggten Benutzern angezeigt. Loggen Sie "
-"sich <a href=\""
-msgstr ""
-"The product prices are only displayed to logged in users. Log in <a href = \""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:148
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:168
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:151
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:668
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1524
-msgid "Lagerbestand"
-msgstr "Stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:169
-#, fuzzy
-msgid "#1# Artikel auf Lager"
-msgstr "article(s) for"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:168
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:188
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/basket_row.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/overview_row.phtml:14
-#, fuzzy
-msgid "FÃŒllmenge:"
-msgstr "Filling quantity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:170
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:190
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/priceinfo.phtml:12
-#, fuzzy
-msgid "#1# (#2# / #3#)"
-msgstr "Fill quantity : #1# (#2# \\ #3#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:192
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:212
-#, fuzzy
-msgid "Gewicht:"
-msgstr "Weight"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:213
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:278
-msgid "#1# #2#"
-msgstr "#1# #2#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:212
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:232
-msgid "So erreichen Sie uns."
-msgstr "How to reach us."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:230
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:250
-#, fuzzy
-msgid "Lieferzeit:"
-msgstr "Shipping address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:270
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:333
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:290
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:364
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:220
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1492
-msgid "Anzahl"
-msgstr "Quantity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:289
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:309
-msgid "In den Warenkorb"
-msgstr "Into basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard_redirect.phtml:336
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:367
-msgid "Auf die Anfrageliste"
-msgstr "To Request list"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:113
-msgid "(zzgl. #1#% MwSt. und <a href=\"#3#\">ab #2# â¬ versandkostenfrei</a>)"
-msgstr "(plus # 1 #% VAT and <a href=\"#3#\"> from # 2 # â¬ free shipping </a>)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:129
-msgid "(inkl. #1#% MwSt. und <a href=\"#3#\">ab #2# â¬ versandkostenfrei</a>)"
-msgstr "(including # 1 #% VAT and <a href=\"#3#\"> # 2 # â¬ free shipping </a>)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkttemplates/standard.phtml:336
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:34
-msgid "Ihr Warenkorb"
-msgstr "Your basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:8
-#, fuzzy
-msgid "Erlaubte Zahlungsarten"
-msgstr "Payment methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:124
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/simplefilter.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:442
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:28
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:29
-msgid "Auswahl"
-msgstr "Choices"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:18
-#, fuzzy
-msgid "Weitere Zahlvarianten definieren"
-msgstr "Create new payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:33
-#, fuzzy
-msgid "Erlaubte Versandarten"
-msgstr "Shipping methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_payship.phtml:43
-#, fuzzy
-msgid "Weitere Versandarten definieren"
-msgstr "Add new shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:10
-#, fuzzy
-msgid "Steuergruppe"
-msgstr "Tax number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:11
-#, fuzzy
-msgid "Preis (#1#)"
-msgstr "Price (clear)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:12
-msgid "Alter Preis (#1#)"
-msgstr "old Price (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:137
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:56
-msgid "Steueranteil"
-msgstr "Tax included"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_price.phtml:14
-msgid "Produkt unterliegt den EU-Leistungsortregeln"
-msgstr "Product is subject to the EU Performance Rules"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:13
-#, fuzzy
-msgid "Bitte hier den Produktnamen eingeben"
-msgstr "No product variables created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:15
-#, fuzzy
-msgid "Produktstatus"
-msgstr "Product choice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:15
-msgid "verÃ¶ffentlicht"
-msgstr "released"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:15
-msgid "Entwurf"
-msgstr "draft"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:26
-msgid "Zu Sprache #1# wechseln."
-msgstr "Switch to language #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:30
-msgid "Ãbersetzungen"
-msgstr "Translations"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:32
-msgid "Produktname (Detail)"
-msgstr "Product name (detailed)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:33
-#, fuzzy
-msgid "Produktbeschreibung (Kurz)"
-msgstr "Show product description on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:35
-#, fuzzy
-msgid "Produkt ID"
-msgstr "ProductID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:43
-msgid "Produkttemplate"
-msgstr "Product template"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:40
-#, fuzzy
-msgid "Keine Templatesdateien gefunden!"
-msgstr "No template found!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:47
-msgid "Zugeordneter Wordpress Artikel"
-msgstr "Associated Wordpress article"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:50
-#, fuzzy
-msgid "Verhalten im Warenkorb"
-msgstr "Products in basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:51
-msgid "Nur einmal mit beliebiger Menge (Standard)"
-msgstr "Only once with any quantity (standard)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:52
-msgid "Nur einmal mit Menge 1"
-msgstr "Only once with quantity 1"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:53
-msgid "Mehrfach mit beliebiger Menge"
-msgstr "Multiple with any amount"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:54
-msgid "Mehrfach mit Menge 1"
-msgstr "Multiple with amount 1"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:94
-#, fuzzy
-msgid "URL"
-msgstr "EUR"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:68
-msgid "Shortcode"
-msgstr "shortcode"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:202
-#, fuzzy
-msgid "Nicht anzeigen"
-msgstr "Don't show"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:73
-msgid "Aus Kommentarbewertung"
-msgstr "From comment review"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:74
-msgid "Bewertungspunkte"
-msgstr "Rating"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:220
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:177
-msgid "URL Benachrichtigung"
-msgstr "URL notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:95
-#, fuzzy
-msgid "Beim Verkauf"
-msgstr "when sold"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_general.phtml:96
-#, fuzzy
-msgid "Bei Bezahlung"
-msgstr "when payed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_texte.phtml:9
-#, fuzzy
-msgid "Kurztext"
-msgstr "Footer text"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_texte.phtml:45
-msgid "Langtext"
-msgstr "Long text"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_texte.phtml:58
-msgid "ZusÃ€tzliche Informationen"
-msgstr "more informations"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select_filter_productlist.phtml:11
-#, fuzzy
-msgid "Keine Produkte gefunden"
-msgstr "No matching products found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:11
-#, fuzzy
-msgid "Produktimport Mapping"
-msgstr "Import product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:21
-msgid "ZurÃŒck zur Produktverwaltung"
-msgstr "Back to product management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:18
-msgid ""
-"Ordnen Sie die Spalten der zu importierenden Daten dem jeweiligen "
-"Produktattribut (links) zu"
-msgstr ""
-"Assign the columns of the data to be imported to the respective product "
-"attribute (left)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:20
-msgid "Nicht zugeordnete Felder werden beim Import nicht verÃ€ndert"
-msgstr "Unmapped fields are not changed during import"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:30
-msgid "unbekannte DatensÃ€tze als neue Produkte anlegen"
-msgstr "Create unknown records as new products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:31
-msgid "Fehlende Preise berechnen?"
-msgstr "Calculate missing prices?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:31
-#, fuzzy
-msgid ""
-"Wenn nur der Brutto Preis angegeben wird, so wird der Netto Preis berechnet."
-msgstr "If a value is given, this value will be used as flat."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/mapimport.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:30
-msgid "Import starten"
-msgstr "Start import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:354
-msgid "wpShopGermany"
-msgstr "wpShopGermany"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:21
-#, fuzzy
-msgid "ProduktÃŒbersicht (#1# Produkte)"
-msgstr "Product views"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:20
-msgid "Suche"
-msgstr "search"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/basket_row.phtml:28
-msgid "HinzufÃŒgen"
-msgstr "Add"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:28
-#, fuzzy
-msgid "Produktexport (Exportprofile)"
-msgstr "Export profile"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:31
-msgid "Daten-Import"
-msgstr "data-import"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:33
-msgid "Daten-Export"
-msgstr "data-export"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:37
-msgid "Daten-Export mit Medien"
-msgstr "data-export with media"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:195
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:216
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:38
-#, fuzzy
-msgid "Suchfeld"
-msgstr "Mandatory field"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:147
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:191
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:198
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:19
-msgid "Produktgruppe"
-msgstr "Product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:60
-#, fuzzy
-msgid "Alle Produktgruppen (#1#)"
-msgstr "Product group #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:203
-#, fuzzy
-msgid "Produktkategorie"
-msgstr "Product attributes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:69
-#, fuzzy
-msgid "Alle Produktkategorien (#1#)"
-msgstr "Product group #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:77
-msgid "Produkte suchen"
-msgstr "Search for products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:123
-msgid "Alle (#1#)"
-msgstr "all (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:143
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:79
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:75
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:74
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:216
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:308
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:152
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:29
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:34
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1505
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:31
-msgid "Name"
-msgstr "Last name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:154
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:186
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:199
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:96
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:247
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:115
-msgid "MwSt."
-msgstr "Sales tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:166
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:178
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:179
-msgid "Produkt fÃŒr Sprache #1# bearbeiten."
-msgstr "Edit product for language #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:187
-msgid "Dieses Produkt bearbeiten"
-msgstr "Edit this product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:184
-msgid "---- "
-msgstr "---- "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:187
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:156
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:156
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:47
-msgid "Bearbeiten"
-msgstr "Edit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:189
-msgid "Sind Sie sicher, dass Sie das Produkt lÃ¶schen wollen?"
-msgstr "Are you sure you want to delete this product?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:189
-msgid "Dieses Produkt lÃ¶schen"
-msgstr "Delete this product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:189
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:257
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:145
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:158
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/checkout_inner_prebutton.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_row_upload_target.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:108
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:150
-msgid "LÃ¶schen"
-msgstr "Delete"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:191
-msgid "Sind Sie sicher, dass Sie das Produkt kopieren wollen?"
-msgstr "Are you sure you want to copy this product?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:191
-msgid "Dieses Produkt kopieren"
-msgstr "Copy this product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:191
-msgid "Kopieren"
-msgstr "Copy"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:193
-#, fuzzy
-msgid "Dieses Produkt im Frontend ansehen"
-msgstr "Edit this product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:253
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:139
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:114
-msgid "Ansehen"
-msgstr "View"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:201
-msgid "Nicht zugewiesen"
-msgstr "Not assigned"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:211
-#, fuzzy
-msgid "Ausverkauft"
-msgstr "sold out"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:213
-msgid "VorrÃ€tig"
-msgstr "Available"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:230
-#, fuzzy
-msgid "Variantenbestand"
-msgstr "Variants"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:237
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:57
-msgid "Produkt unterliegt der EU-Leistungsortregel"
-msgstr "Product is subject to the EU Services Directive"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:258
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:172
-msgid "Keine Produkte in der Datenbank."
-msgstr "No products in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:273
-#, fuzzy
-msgid "Produktvariationen Lagerbestand anzeigen"
-msgstr "Show product variables on invoice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:280
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:64
-msgid "SchlieÃen"
-msgstr "close"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/index.phtml:298
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select_filter.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_rating.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_rating.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:104
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:169
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:188
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:208
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:81
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:122
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:142
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:165
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:187
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:205
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:223
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:245
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:263
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:281
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addProduct.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:245
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:266
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/settings_edit.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/settings_edit.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:150
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:171
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:112
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:143
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:174
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:220
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:249
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/settings_edit.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:221
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/list.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:302
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:323
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_spconditions/settings_edit.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/settings_edit.phtml:16
-msgid "Bitte warten ..."
-msgstr "Please wait..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:18
-#, fuzzy
-msgid "Produktverwaltung - Produktdatenimport"
-msgstr "Product management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:32
-msgid ""
-"Laden Sie ein vorher exportiertes CSV File hoch, die Produktdaten werden "
-"dann aus dieser Datei importiert."
-msgstr ""
-"Upload a previously exported csv file and product information will be "
-"imported from that file."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:38
-#, fuzzy
-msgid "Import der Produktedaten starten"
-msgstr "Start import"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:54
-msgid "DateigrÃ¶Ãe ÃŒbersteigt Upload Limit von #1#."
-msgstr "File size exceeds upload limit of # 1 #."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/import.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:61
-msgid "Es wurde keine Datei ausgewÃ€hlt."
-msgstr "No file was selected."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:19
-#, fuzzy
-msgid "ProduktÃŒbersicht"
-msgstr "Product views"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:20
-#, fuzzy
-msgid "Produkte anlegen/bearbeiten"
-msgstr "Edit product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:41
-msgid ""
-"Produkt ID:#1# <span style=\"float:right;\"><a href=\"#2#\" title=\"Produkt "
-"im Frontend ansehen\" target=\"_blank\"><span class=\"glyphicon glyphicon-"
-"new-window\"></span></a></span>"
-msgstr ""
-"Product ID: # 1 # <span style = \"float: right;\"> <a href=\"#2#\" title="
-"\"View product in frontend\" target=\"_blank\"> <span class = \"glyphicon "
-"glyphicon-new- window \"> </ span> </ span>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:234
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:60
-msgid "Neues Produkt"
-msgstr "New product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:55
-msgid ""
-"Nach dem erstmaligen Speichern kÃ¶nnen weitere Einstellungen (Preisangaben, "
-"Produktbilder, ...) vorgenommen werden."
-msgstr ""
-"After saving for the first time, further settings (prices, product "
-"images, ...) can be made."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:82
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:356
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:21
-msgid "Speichern"
-msgstr "Save"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit.phtml:70
-#, fuzzy
-msgid "Speichern / zur Ãbersicht"
-msgstr "Save customer and back to overview"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select_filter.phtml:13
-msgid "Suchen"
-msgstr "searching"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:129
-msgid ""
-"Bitte ÃŒberprÃŒfen Sie die rot markierten Felder. Ãnderungen in diesen Feldern "
-"gehen beim Speichern verloren."
-msgstr ""
-"Please check the red marked fields. Changes in these fields are lost when "
-"saving."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:229
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:63
-msgid "Produkt bearbeiten"
-msgstr "Edit product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:292
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:189
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/order_view_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customerbudget/customer_sidebar.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:3
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:104
-msgid "Zum Ein/Ausklappen hier klicken"
-msgstr "Click to hide/expand"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:293
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1489
-msgid "Beschreibung"
-msgstr "Description"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:352
-msgid "Produkt speichern"
-msgstr "Save product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_alternativeDesign.phtml:353
-msgid "Produkt speichern und zur Ãbersicht"
-msgstr "Save product and back to overview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:24
-msgid "wpShopGermany Produktauswahl"
-msgstr "wpShopGermany product choice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:4
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:5
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/data.phtml:6
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1471
-msgid "Produkt"
-msgstr "Product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:178
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/widget_form.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:75
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:68
-msgid "Template"
-msgstr "Template"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:181
-#, fuzzy
-msgid "Titel anzeigen"
-msgstr "Show all"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:181
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/produkt_bottom.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/overview_row.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_nlsatolo/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/order_view_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:110
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:126
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:238
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:492
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:631
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:773
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:579
-msgid "Ja"
-msgstr "Yes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:181
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/produkt_bottom.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/overview_row.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_nlsatolo/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/order_view_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:110
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:126
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/produkt_edit_allgemein.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:239
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:496
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:632
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:774
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:580
-msgid "Nein"
-msgstr "No"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:194
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:21
-msgid "EinfÃŒgen"
-msgstr "Paste"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:192
-msgid "Sortierung"
-msgstr "Sorting"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/select.phtml:193
-msgid "Richtung"
-msgstr "Direction"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_rating.phtml:10
-#, fuzzy
-msgid "Produktbewertung"
-msgstr "Product management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_rating.phtml:60
-#, fuzzy
-msgid "Bewertung lÃ¶schen"
-msgstr "Delete order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_rating.phtml:72
-#, fuzzy
-msgid "Keine Bewertungen vorhanden"
-msgstr "No data available for export."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/addedit_rating.phtml:89
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie diese Bewertung lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this order?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:15
-#, fuzzy
-msgid "Produktbild lÃ¶schen"
-msgstr "Delete product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:19
-#, fuzzy
-msgid "Auch in der Mediathek lÃ¶schen"
-msgstr "Delete customer variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:20
-#, fuzzy
-msgid "Abbrechen"
-msgstr "Error link"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:44
-#, fuzzy
-msgid ""
-"Bitte klicken Sie auf Mediathek um ein Bild hochzuladen. Um ein Bild zu "
-"lÃ¶schen klicken Sie einfach auf das Bild."
-msgstr ""
-"Please click on upload to upload a picture. To delete a picture simply click "
-"on it."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:45
-msgid "Die Reihenfolge kann mittels Drag&Drop verÃ€ndert werden."
-msgstr "The order can be changed using drag & drop."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:102
-msgid "Sind Sie sicher, das Sie dieses Bild lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this picture?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:174
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:197
-msgid "AuswÃ€hlen oder Hochladen von Medien"
-msgstr "Select or upload media"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:198
-msgid "Medien benutzen"
-msgstr "use media"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images.phtml:230
-msgid ""
-"Das Hochladen von Produktbildern ist erst nach erstmaligem speichern mÃ¶glich."
-msgstr ""
-"The upload of product pictures is only possible when you have saved the "
-"product the first time."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images_list.phtml:15
-msgid "Dieses Bild lÃ¶schen."
-msgstr "Delete this picture."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/produkt/images_list.phtml:34
-msgid "Bisher keine Produktbilder hochgeladen."
-msgstr "No product pictures uploaded yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/adminmail.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail_html.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:11
-msgid "Hallo Administrator,"
-msgstr "Dear shop administrator,"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:13
-msgid "Eine neue Bestellung ist im Online-Shop eingegangen."
-msgstr "there is a new order in your online shop."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:2
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:8
-msgid "Rechnungsadresse:"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:6
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:75
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:153
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:283
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:95
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1503
-msgid "Firma"
-msgstr "Company"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:357
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:156
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:35
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:32
-msgid "StraÃe"
-msgstr "Street"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:40
-msgid "USt.IdNr."
-msgstr "VAT ID:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:300
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:266
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:307
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:387
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:104
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:159
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1509
-msgid "Ort"
-msgstr "City"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:100
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:309
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:275
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:323
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:394
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:32
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:37
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:34
-msgid "Land"
-msgstr "Country"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:147
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1513
-msgid "Telefon"
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:142
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:100
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:154
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:34
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:39
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:36
-msgid "Fax"
-msgstr "Fax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/login.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_login.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:225
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:315
-msgid "E-Mail Adresse"
-msgstr "Email address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:23
-msgid "Lieferadresse:"
-msgstr "Shipping address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:33
-msgid "Rechnungs- /Lieferadresse:"
-msgstr "Invoice & shipping address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1501
-msgid "Kundennummer"
-msgstr "Customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:124
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/order_done.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1421
-msgid "Bestellnummer"
-msgstr "Order number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:128
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/coverletter_pdf.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:51
-msgid "Bestelldatum"
-msgstr "Order date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:132
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:35
-msgid "Rechnungsbetrag"
-msgstr "Invoice amount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:75
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:157
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:378
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:137
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:234
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_shippay.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/editPayShipping.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_spconditions/conditionList.phtml:17
-msgid "Versandart"
-msgstr "Shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:164
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_shippay.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:181
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/editPayShipping.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:110
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml:6
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/paymenthint.phtml:5
-msgid "Zahlungsart"
-msgstr "Payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:24
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:18
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_onepagecheckout.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minrequest.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1417
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:25
-msgid "Bestellung"
-msgstr "Order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/adminmail.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/adminmail.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:379
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:308
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:458
-msgid "Bestellkommentar"
-msgstr "Order comment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/status.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail.phtml:12
-#, fuzzy
-msgid "Hallo #1# #2# #3#,"
-msgstr "Dear #1# #2#,"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/status.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/status.phtml:16
-msgid ""
-"Der Status Ihrer Bestellung mit der Bestellnummer #1# hat sich von \"#2#\" "
-"auf \"#3#\" geÃ€ndert."
-msgstr ""
-"The status of your order with the id #1# has changed from \"#2#\" to \"#3#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/status.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:108
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/status.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail_html.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:147
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail_html.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail_html.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:37
-msgid "Mit freundlichen GrÃŒÃen"
-msgstr "Best regards"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/status.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:110
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/status.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail_html.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy.php:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy_html.php:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno_html.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail_html.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail_html.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:39
-#, fuzzy
-msgid "Team"
-msgstr "Shop Team"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:16
-#, fuzzy
-msgid "vielen Dank fÃŒr Ihre Bestellung."
-msgstr "thank you for your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:46
-#, fuzzy
-msgid "Rechnungs-/Lieferadresse:"
-msgstr "Invoice & shipping address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:131
-msgid "Wir bedanken uns fuer Ihre Bestellung."
-msgstr "Thank you for your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:29
-msgid ""
-"Bitte beachten Sie, dass es sich bei dieser E-Mail um eine "
-"Bestellbestaetigung und keine bindende Auftragsbestaetigung handelt. "
-"Preisirrtuemer sind leider nicht vollstaendig auszuschliessen."
-msgstr ""
-"Please note that this email is a notification and no binding order "
-"confirmation. Pricing errors can not be excluded completely."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:133
-msgid "Es gelten unsere Allgemeinen Geschaeftsbedingungen (AGB)."
-msgstr "Our general terms and conditions apply."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:142
-msgid "...hier steht der Text zum Widerrufsrecht..."
-msgstr "...here is the text for the power of revocation..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/kundenmail.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:145
-msgid "Ende der Widerrufsbelehrung"
-msgstr "End of power of revocation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:3
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:4
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:12
-msgid "Pos"
-msgstr "Pos"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:5
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:6
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:74
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:14
-msgid "StÃŒckpreis"
-msgstr "Item price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:237
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:79
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:730
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:743
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:19
-msgid "Summe"
-msgstr "Total"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:21
-msgid "Art. Nr.:"
-msgstr "Item number:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:63
-#, fuzzy
-msgid "MÃ¶gliche Versandarten"
-msgstr "Shipping methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:75
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:94
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:440
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:453
-msgid "Gutschein (#1#)"
-msgstr "Voucher (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:89
-msgid "AbzÃŒglich Rabatt"
-msgstr "Less discount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:102
-msgid "Zwischensumme:"
-msgstr "Subtotal:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:50
-msgid "Versandkosten:"
-msgstr "Shipping costs:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:81
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:130
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:153
-msgid "Anteilig"
-msgstr "pro rata"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:263
-msgid "Zahlungsart:"
-msgstr "Payment method:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:95
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:173
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:247
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:425
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:334
-msgid "zuzÃŒglich MwSt. (#1#)"
-msgstr "plus sales tax (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:285
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:93
-msgid "darin enthaltene MwSt. (#1#)"
-msgstr "included sales tax (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/order.phtml:104
-#, fuzzy
-msgid "Gesamtpreis:"
-msgstr "Total price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/adminmail.phtml:12
-#, fuzzy
-msgid "Eine neue Bestellung ist im Online-Shop eingegangen!"
-msgstr "there is a new order in your online shop."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shippingadress.class.php:22
-msgid "Lieferadresse"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:71
-#, fuzzy
-msgid "Rechnungs-/Lieferadresse"
-msgstr "Invoice & shipping address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/customer.phtml:153
-#, fuzzy
-msgid "Versand- und Lieferart"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/status.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail_html.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate_html.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail_html.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml:10
-msgid "Hallo #1# #2#,"
-msgstr "Dear #1# #2#,"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/done.phtml:42
-msgid "Vielen Dank fÃŒr Ihre Bestellung!"
-msgstr "Thank you for your order!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/kundenmail.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:35
-#, fuzzy
-msgid ""
-"Es gelten unsere <a href=\"#1#\">Allgemeinen Geschaeftsbedingungen</a> (<a "
-"href=\"#1#\">AGB</a>)."
-msgstr "Our general terms and conditions apply."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/basket_row.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/overview_row.phtml:22
-msgid "Art. Nr."
-msgstr "Item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:99
-#, fuzzy
-msgid "Zwischensumme"
-msgstr "Subtotal:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:148
-#, fuzzy
-msgid "Zahlungskosten"
-msgstr "Payment methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mailtemplates/html/order.phtml:183
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:128
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:197
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:210
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:236
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:405
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:314
-msgid "Gesamtpreis"
-msgstr "Total price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab3.phtml:9
-#, fuzzy
-msgid "Standard Versandart"
-msgstr "Name of shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab3.phtml:10
-#, fuzzy
-msgid "Standard Zahlungsart"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab3.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:10
-#, fuzzy
-msgid "Standardland"
-msgstr "Default"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab3.phtml:12
-msgid ""
-"Die LÃ€nder kÃ¶nnen in der <a href=\"#1#\">LÃ€nderverwaltung</a> definiert "
-"werden."
-msgstr ""
-"The countries can be defined in the <a href=\"#1#\"> country administration "
-"</a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab3.phtml:14
-#, fuzzy
-msgid "Standardanrede"
-msgstr "Default"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab3.phtml:15
-msgid ""
-"Die Auswahl kann in den <a href=\"#1#\">Kundendaten</a> definiert werden."
-msgstr ""
-"The selection can be defined in the <a href=\"#1#\"> customer data </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:4
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:30
-msgid "Betreff"
-msgstr "Subject"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:5
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:17
-msgid "Absender"
-msgstr "Sender"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:209
-msgid "EmpfÃ€nger"
-msgstr "Recipient"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:11
-msgid "CC"
-msgstr "CC"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:12
-msgid "BCC"
-msgstr "BCC"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:18
-#, fuzzy
-msgid "Neuer Anhang"
-msgstr "New invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:46
-#, fuzzy
-msgid "Text unter der E-Mail"
-msgstr "Sender email"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/form/emailconf.phtml:61
-msgid "* Der restliche E-Mailtext kann nur im Mailtemplate verÃ€ndert werden"
-msgstr "* The remaining e-mail text can only be changed in the mail template"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/wpml.phtml:38
-msgid ""
-"FÃŒgt dynamische Inhalte wie LÃ€ndernamen, Namen von Varianten etc. zu den "
-"String-Ãbersetzungen von WPML hinzu und ermÃ¶glicht unter WPML -> String-"
-"Ãbersetzung die Ãbersetzung von diesen Inhalten."
-msgstr ""
-"Adds dynamic content such as country names, variant name, etc. to the string "
-"translations of WPML and allows translation of that content under WPML -> "
-"String Translation."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/wpml.phtml:40
-#, fuzzy
-msgid "String-Ãbersetzung fÃŒllen"
-msgstr "Translations"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:15
-msgid "Index"
-msgstr "index"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1669
-msgid "Kundenvariablen"
-msgstr "Customer variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/product_addedit_content.phtml:18
-msgid "Pflichtfeld"
-msgstr "Mandatory field"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:14
-msgid "Typ"
-msgstr "Type"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:64
-msgid "Nicht zeigen"
-msgstr "Don't show"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:28
-msgid "Textfeld"
-msgstr "Text field"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:30
-msgid "Auswahlfeld"
-msgstr "Drop down list"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:31
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:31
-msgid "Checkbox"
-msgstr "Checkbox"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:34
-msgid "HTML Code generieren"
-msgstr "Generate HTML code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:42
-msgid "Kundenvariable lÃ¶schen"
-msgstr "Delete customer variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:110
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:112
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:112
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:114
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:134
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:136
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:121
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:123
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:24
-msgid "Zum Bearbeiten anklicken ..."
-msgstr "Click to edit..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:135
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:122
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:23
-msgid "Speicher ..."
-msgstr "Saving..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:123
-msgid "AuswahlmÃ¶glichkeiten (\"|\" als Trenner)"
-msgstr "Choices (\"|\" as separator)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:133
-msgid "Kundenvariablen direkt abfragen"
-msgstr "Request customer variables directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab2.phtml:135
-msgid "Keine benutzerdefinierten Kundenfelder angelegt."
-msgstr "No customized customer fields created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/path.phtml:25
-msgid "Pfadeinstellungen"
-msgstr "Path settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/path.phtml:31
-msgid ""
-"Hier kÃ¶nnen die Pfade definiert werden, in denen der Shop seine Daten ablegt."
-msgstr "Here you can set paths where the shop stores its data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/path.phtml:35
-msgid "Multiblog Upload Path (relativ zu wp-content)"
-msgstr "Multiblog upload path (relative to wp-content)"
-
-# @ default
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/path.phtml:35
-#, php-format
-msgid ""
-"Sollte den Platzhalter %blog_id% enthalten, dieser zeigt auf die ID des "
-"jeweiligen Blockes sonst kann es bei dem Betrieb von mehreren Shops zu "
-"Ãberschreibungen kommen."
-msgstr ""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/path.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:139
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:150
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:164
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:170
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:50
-msgid "Einstellungen speichern"
-msgstr "Save settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:33
-#, fuzzy
-msgid "HTML Mails versenden"
-msgstr "Send Opt-In email"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:44
-#, fuzzy
-msgid "E-Maillogo anzeigen"
-msgstr "Show all"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:50
-msgid "E-Maillogo als Wasserzeichen anzeigen"
-msgstr "Show email logo as a watermark"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:60
-#, fuzzy
-msgid "E-Maillogo (JPG)"
-msgstr "Logo (jpeg)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:47
-msgid "Derzeitiges Logo"
-msgstr "Current logo"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:72
-#, fuzzy
-msgid "Logo LÃ¶schen"
-msgstr "Delete"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:85
-msgid "Ausrichtung des Maillogos"
-msgstr "mail logo position"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:91
-msgid "LinksbÃŒndig"
-msgstr "left"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:78
-msgid "Zentriert"
-msgstr "centre"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:93
-msgid "RechtsbÃŒndig"
-msgstr "right"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:103
-#, fuzzy
-msgid "Deckkraft des Logos"
-msgstr "Current logo"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:114
-msgid "Globale Vorgaben"
-msgstr "Global settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:115
-#, fuzzy
-msgid ""
-"Werden keine Angaben fÃŒr die folgenden E-Mails gemacht, so gelten die "
-"globalen Angaben."
-msgstr ""
-"Global guidelines will be used if there are no entries on the following "
-"emails."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:119
-msgid "BestellbestÃ€tigung (Admin)"
-msgstr "Order confirmation (Admin)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:120
-msgid "Diese Mail bekommt der Admin beim Eingang einer neuen Bestellung."
-msgstr "This mail is sent to the admin when a new order is received."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:125
-msgid "BestellbestÃ€tigung (Kunde)"
-msgstr "Order confirmation (Customer)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:126
-msgid "Diese Mail bekommt der Kunde nach DurchfÃŒhrung der Bestellung."
-msgstr "This mail is sent to the customer after his order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:132
-msgid "StatusÃ€nderung (Kunde)"
-msgstr "status changed notification (Customer)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:133
-msgid "Diese Mail bekommt der Kunde bei der Ãnderung des Bestellstatus."
-msgstr ""
-"This mail is sent to the customer when the status of his order has changed."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/emailconf.phtml:137
-#, fuzzy
-msgid ""
-"Klicken Sie auf die jeweilige Mail um die Einstellungen angezeigt zu "
-"bekommen bzw. zu Ã€ndern."
-msgstr "Click here to view & edit the settings for the selected mail type."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:42
-msgid "MenÃŒpunkt sichtbar"
-msgstr "Menu item visible"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:25
-msgid "Lizenzverwaltung"
-msgstr "Licence management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/access.phtml:100
-msgid "Berechtigungen Speichern"
-msgstr "Save permissions"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:193
-msgid "Modulname"
-msgstr "Module name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:194
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:100
-msgid "Version"
-msgstr "Version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:195
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:141
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:16
-msgid "Lizenz"
-msgstr "Licence"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:196
-#, fuzzy
-msgid "verfÃŒgbare Version"
-msgstr "Enterprise version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:213
-#, fuzzy
-msgid "kostenlos"
-msgstr "Free of charge"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:215
-msgid "enthalten"
-msgstr "contain"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:219
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:221
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:122
-msgid "Modulcode erwerben"
-msgstr "buy modal code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:87
-#, fuzzy
-msgid "<a href=\"#1#\">Version installieren</a>"
-msgstr "<a href=\"#1#\">Shipping costs</a> (#2#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:89
-#, fuzzy
-msgid "<a href=\"#1#\">Demo installieren</a>"
-msgstr "[<a href=\"#1#\">Edit</a>]"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:121
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:127
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:240
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:246
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:89
-#, fuzzy
-msgid "neue Version verfÃŒgbar"
-msgstr "New version (#1#) available."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:104
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:252
-#, fuzzy
-msgid "<a href=\"#1#\">Version installieren</a>."
-msgstr "<a href=\"#1#\">Shipping costs</a> (#2#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:115
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:234
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:77
-#, fuzzy
-msgid "aktuell"
-msgstr "Manually"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:121
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:240
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:83
-#, fuzzy
-msgid "<a href=\"#1#\">wpShopGermany Update</a> notwendig"
-msgstr "<a href=\"#1#\">Shipping costs</a> (#2#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:147
-msgid ""
-"Mit einer Lizenz (Pro, Enterprise) machst du aus deinem wpShopGermany mehr."
-msgstr ""
-"With a license (Pro, Enterprise) you make more from your wpShopGermany."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:148
-msgid ""
-"Du erhÃ€ltst neben kostenlosem Support (per Mail oder Forum, 1 Jahr Updates "
-"frei) auch die MÃ¶glichkeit, die Vielzahl der zusÃ€tzlich erhÃ€ltlichen "
-"wpShopGermany Module zu nutzen."
-msgstr ""
-"In addition to free support (via e-mail or forum, 1 year of free updates) "
-"you also get the opportunity to use the large number of additionally "
-"available wpShopGermany modules."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/modulelist.phtml:150
-#, fuzzy
-msgid "wpShopGermany im Shop ansehen"
-msgstr "wpShopGermany version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:26
-#, fuzzy
-msgid "Neue Versandzone anlegen."
-msgstr "Create new shipping zone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:28
-#, fuzzy
-msgid "Zur LÃ€nderverwaltung"
-msgstr "Country administration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:61
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie diese Versandzone lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this shipping zone?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen.phtml:107
-msgid ""
-"Sind Sie sich sicher, dass sie die Standard Versandzonen und LÃ€nder laden "
-"mÃ¶chten? Die alten Versandzonen und LÃ€nder gehen verloren."
-msgstr ""
-"Are you sure you want to load the standard shipping zones and countries? The "
-"old shipping zones and countries are lost."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:36
-msgid "Hilfe"
-msgstr "Help"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:12
-msgid "Hier ein kleiner Ãberblick, wo welche Information zu finden ist:"
-msgstr "A short overview which information you can find here:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:15
-msgid "Tutorials"
-msgstr "Tutorials"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:16
-msgid ""
-"In den Tutorial haben wir praxisnahe Beispiele verwendet, um die einzelnen "
-"Funktionen nÃ€her zu erklÃ€ren. Rechts im MenÃŒ kÃ¶nnen die Kategorien nÃ€her "
-"ausgewÃ€hlt werden, ganz oben gibt es ein Suchfenster, was ganz sehr gut "
-"funktioniert ;)"
-msgstr ""
-"We used practical examples for our tutorials to explain the features in "
-"detail. In the menu on the right side you can select between categories and "
-"at the top you will find a working search bar ;-)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:20
-msgid "Forum"
-msgstr "Forum"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:21
-msgid ""
-"Alle Anfragen hinsichtlich Fehler, Inbetriebnahme und Administration "
-"beantworten wir zeitnah (wÃ€hrend unserer GeschÃ€ftszeiten). Vielleicht ist "
-"deine Frage bereits im Forum gestellt und beantwortet worden? Das "
-"Suchformular dort ist auch sehr mÃ€chtig, probiere es doch mal aus!"
-msgstr ""
-"We will answer all questions regarding errors, using and administration as "
-"soon as possible (during our business hours). Please use the search in our "
-"forum first to make sure that your question has not already been answered."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:22
-msgid ""
-"Bitte nutze generell das Forum fÃŒr eine Support-Anfrage, <u>nicht</u> unser "
-"Kontaktformular oder Telefon."
-msgstr ""
-"Please use the forum for support requests and <u>not</u> our contact form or "
-"phone."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:26
-msgid "Feature Wunschliste"
-msgstr "Feature wish list"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/hilfe.phtml:27
-msgid ""
-"Wir orientieren uns direkt am Markt. Insofern geben wir dir als User die "
-"MÃ¶glichkeit mitzuentscheiden, welches Feature wpShopGermany zukÃŒnftig haben "
-"wird. Du kannst selber einen Feature-Wunsch anlegen, oder fÃŒr einen "
-"bestehenden Wunsch deine Stimme abgeben."
-msgstr ""
-"We provide the users with the opportunity to vote for future features. You "
-"may create your own wishes or vote for already existing ones."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:11
-msgid "Einstellungen"
-msgstr "Settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:22
-msgid "Module"
-msgstr "Modules"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:29
-#, fuzzy
-msgid "Aktuelles"
-msgstr "Current page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/index.phtml:37
-msgid "Ãber"
-msgstr "About"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:65
-msgid "Registrierungsdaten"
-msgstr "Registration data"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:66
-msgid "Domainverwaltung"
-msgstr "Domain management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:67
-msgid "Modulaktivierung"
-msgstr "Module management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:78
-#, fuzzy
-msgid "Enterprise"
-msgstr "Enterprise version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:79
-#, fuzzy
-msgid "Pro"
-msgstr "Pos"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:81
-#, fuzzy
-msgid "Lizenzmodel"
-msgstr "End of licence"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:166
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:207
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:301
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:151
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1504
-msgid "Vorname"
-msgstr "First name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:81
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:158
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1510
-msgid "PLZ"
-msgstr "Zip code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:92
-#, fuzzy
-msgid "Deutschland"
-msgstr "German"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:93
-msgid "Ãsterreich"
-msgstr "Austria"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:94
-msgid "Schweiz"
-msgstr "Switzerland"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:95
-#, fuzzy
-msgid "Niederlande"
-msgstr "Dutch"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:96
-msgid "Belgien"
-msgstr "Belgium"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:104
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:161
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/getpwd.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:153
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:35
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:40
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1515
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:37
-msgid "E-Mail"
-msgstr "Email"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:113
-msgid "Domain"
-msgstr "domain"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:123
-msgid "Registrierung aufheben"
-msgstr "Unregister"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:133
-#, fuzzy
-msgid "Es sind noch keine Domains fÃŒr diese Lizenz registriert."
-msgstr "No domains registered yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:141
-msgid "Diese Domain kann noch auf Ihre Lizenz aktiviert werden."
-msgstr "This domain can still be activated on your license."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:145
-msgid "Diese Domain registrieren"
-msgstr "Register this domain"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:149
-msgid "Diese Domain ist bereits auf diesen SchlÃŒssel registriert."
-msgstr "This domain has been registered to this key."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:153
-#, fuzzy
-msgid "Diese Domain kann nicht mehr registriert werden."
-msgstr "Register this domain"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:165
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:198
-#, fuzzy
-msgid "Modulcode aktivieren"
-msgstr "Activate module"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/licence.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:208
-msgid "PrÃŒfen"
-msgstr "check"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:13
-#, fuzzy
-msgid "LÃ€ndername"
-msgstr "Countries"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:14
-msgid "KÃŒrzel"
-msgstr "Code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:98
-msgid "Versandzone"
-msgstr "Shipping zone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:10
-#, fuzzy
-msgid "MwSt. Grundlage"
-msgstr "Base"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:40
-#, fuzzy
-msgid "mit MwSt."
-msgstr "Sales tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:38
-msgid "keine MwSt."
-msgstr "w/o salex tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:36
-msgid "keine MwSt. bei USt.IdNr."
-msgstr "w/o sales tax for VAT ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:15
-msgid "MwSt. Satz A (stark ermÃ€Ãigter Satz)"
-msgstr "VAT rate A (reduced rate)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:16
-msgid "MwSt. Satz B (ermÃ€Ãigter Satz)"
-msgstr "VAT rate B (reduced rate)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:17
-msgid "MwSt. Satz C (Normalsatz)"
-msgstr "VAT rate C (standard rate)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_edit.phtml:18
-msgid "MwSt. Satz D (Zwischensatz)"
-msgstr "VAT Set D (Intermediate)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:102
-msgid "HTML Code Block"
-msgstr "HTML code snippet"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:49
-#, fuzzy
-msgid "Pflichtfelder"
-msgstr "Mandatory fields"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:50
-msgid "Weitere Kundendaten"
-msgstr "Additional customer data"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:51
-#, fuzzy
-msgid "Kundenvoreinstellungen"
-msgstr "Path settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:65
-#, fuzzy
-msgid "Neue Kundenvariable anlegen."
-msgstr "Create new order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten.phtml:76
-#, fuzzy
-msgid "Einstellungen Speichern"
-msgstr "Save settings"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:24
-msgid "Shop CSS styles nicht einbinden"
-msgstr "not embed shop css "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:28
-msgid "JQuery einbinden"
-msgstr "Embed jQuery"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:37
-msgid "Javascript Validierung laden"
-msgstr "Load JavaScript validation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:38
-msgid "CSS der Javascript Validierung laden"
-msgstr "Load CSS of the JavaScript validation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/includes.phtml:42
-msgid "Bootstrap Glyphfont CSS im Frontend laden"
-msgstr "Bootstrap Glyphfont Load CSS in frontend"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:17
-msgid "Wenn aktiviert, werden nur aktive Module angezeigt"
-msgstr "If activated, only active modules are displayed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:48
-msgid "Hilfe zum Modul"
-msgstr "Help"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:57
-msgid "Modul aktiviert"
-msgstr "Module activated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:92
-#, fuzzy
-msgid "<a href=\"#1#\">neue Version installieren</a>."
-msgstr "Install new version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:107
-msgid "Kostenfrei"
-msgstr "Free of charge"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_debitpayment/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:139
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_freeshipping/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:63
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:76
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:715
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1057
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1231
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:162
-msgid "Aktiv"
-msgstr "Active"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:113
-#, fuzzy
-msgid "Demo Modus"
-msgstr "Debug mode"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:115
-#, fuzzy
-msgid "Nicht aktiv"
-msgstr "Don't show"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:124
-msgid "Modulcode eingeben"
-msgstr "Enter module code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:129
-msgid ""
-"Sind Sie sich sicher? Das Modul kann 14 Tage ab heute komplett in vollem "
-"Umfang getestet werden."
-msgstr "Are you sure? The module can be fully tested 14 days from today."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:129
-#, fuzzy
-msgid "Demo Modus starten"
-msgstr "Demo mode expired."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:132
-msgid "Ohne Lizenz kÃ¶nnen Sie dieses Modul nicht verwenden."
-msgstr "You can not use this module without a license."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:138
-msgid "Unbekannt"
-msgstr "unknown"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:190
-#, fuzzy
-msgid "Modulverwaltung"
-msgstr "Product management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/module.phtml:217
-msgid ""
-"Modulcodes kÃ¶nnen erst verwendet werden, wenn ihre wpShopGermany Lizenz "
-"aktiviert ist."
-msgstr ""
-"Module codes can not be used until their wpShopGermany license is activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_codeinfo.phtml:8
-msgid ""
-"Code fÃŒr die Abfrage der Kundenvariable mit der ID #1# (Muss im checkout2."
-"phtml verwendet werden)"
-msgstr ""
-"Code for the retrieval of the customer variable with id #1# (has to be used "
-"in checkout2.phtml)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_codeinfo.phtml:14
-msgid ""
-"Code fÃŒr die Ausgabe der Kundenvariable mit der ID #1# (WÃ€hrend die "
-"Bestellung noch nicht ÃŒbertragen wurde)"
-msgstr ""
-"Code for the retrieval of the customer variable with id #1# (while order is "
-"not sent)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_codeinfo.phtml:20
-msgid ""
-"Code fÃŒr die Ausgabe der Kundenvariable mit der ID #1# (Nachdem der Kunde in "
-"der Datenbank angelegt ist)"
-msgstr ""
-"Code for the retrieval of the customer variable with id #1# (after customer "
-"has been added to the database)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_codeinfo.phtml:26
-msgid "%kunde_id% muss durch die ID des Kunden in der Datenbank ersetzt werden"
-msgstr ""
-"%kunde_id% has to be replaced with the id of the customer in the database"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:9
-msgid "Bisher keine Versandzonen hinterlegt."
-msgstr "No shipping zones saved yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:96
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:94
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:104
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:126
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:172
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_debitpayment/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_freeshipping/settings_edit.phtml:8
-msgid "Bezeichnung"
-msgstr "Description"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:15
-#, fuzzy
-msgid "Inner- gemeinschaftlich"
-msgstr "Intra-Community delivery."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:35
-#, fuzzy
-msgid "Versandzonen PLZ bearbeiten"
-msgstr "Edit this customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/versandzonen_list.phtml:36
-msgid "Versandzone lÃ¶schen"
-msgstr "Delete shipping zone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:26
-#, fuzzy
-msgid "Allgemeine Einstellungen"
-msgstr "php.ini configuration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:32
-msgid "Update"
-msgstr "Update"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:35
-msgid ""
-"Die Version der Datenbank stimmt nicht mit der installierten Version ÃŒberein!"
-"<br />Bitte klicken Sie auf "
-msgstr ""
-"The version of the database does not match with the installed version of "
-"wpShopGermany <br />Please click on "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:35
-msgid "Aktualisieren"
-msgstr "Update"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:35
-msgid "Produkte etc. werden dabei nicht gelÃ¶scht."
-msgstr "Products etc. won't be deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:43
-msgid "Installierte DB Version"
-msgstr "Installed DB version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1413
-msgid "WÃ€hrung"
-msgstr "Currency"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:49
-msgid "Standardsprache (Backend)"
-msgstr "Standard language (backend)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:52
-msgid "Produkte pro Seite"
-msgstr "Products per page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:53
-msgid "Bestellungen pro Seite"
-msgstr "Orders per page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:54
-msgid "UnvollstÃ€ndige Best. in Bestellverwaltung anzeigen"
-msgstr "Show incomplete order in order management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:55
-msgid "Bestellungen fÃŒr 0 #1# direkt abschlieÃen"
-msgstr "Finish orders for 0 #1# immediatly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:56
-msgid "Nach neuem Produkt im Warenkorb"
-msgstr "After adding a product to the basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:12
-msgid "Auf Seite bleiben"
-msgstr "Stay on site"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:58
-msgid "Zum Warenkorb leiten"
-msgstr "Switch to basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:59
-msgid "Warenkorb im Fenster anzeigen"
-msgstr "Show basket in new window"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:60
-msgid "Lightbox Meldung"
-msgstr "Lightbox"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:62
-msgid "Kundendaten nach Bestellung"
-msgstr "Customer data after order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:63
-msgid "In Session belassen"
-msgstr "Keep in session"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:66
-msgid "Formatierung Kundennummer"
-msgstr "Format customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:67
-#, fuzzy
-msgid "Sortierung Kundennummer (Backend)"
-msgstr "Format customer id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:67
-msgid "Numerisch"
-msgstr "numeric"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:11
-msgid "Alphabetisch"
-msgstr "Alphabetical order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:68
-msgid "Start fÃŒr Kundennummer"
-msgstr "Start value for customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:69
-msgid "Formatierung Bestellnummer"
-msgstr "Format order id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:70
-msgid "Start fÃŒr Bestellnummer"
-msgstr "Start value for order id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/konfiguration.phtml:71
-msgid "Auswahl der Zahlung/Versandart ÃŒberspringen wenn mÃ¶glich"
-msgstr "Skip selection of payment / shipping method if possible"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:21
-msgid "DatensÃ€tze lÃ¶schen / Plugin deinstallieren"
-msgstr "delete data / deinstall plugin"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:25
-msgid "Bitte wÃ€hlen Sie aus, was Sie entfernen mÃ¶chten?"
-msgstr "Please select what you want to remove."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:27
-msgid "Produkte (#1# DatensÃ€tze)"
-msgstr "Products (#1# data sets)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:28
-msgid "Kunden (#1# DatensÃ€tze)"
-msgstr "Customers (#1# data sets)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:29
-msgid "Bestellungen (#1# DatensÃ€tze)"
-msgstr "Orders (#1# data sets)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:30
-#, fuzzy
-msgid "UnvollstÃ€ndige Bestellungen (#1# DatensÃ€tze)"
-msgstr "Orders (#1# data sets)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:34
-msgid "Plugin, Programmdateien, Moduldateien und Datenbanktabellen"
-msgstr "Plugin, program files, module files and database tables"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:38
-msgid ""
-"Shopseiten (Warenkorbseite, Produktdetailseite, Versandkosten, AGB, "
-"Datenschutz, Widerrufsbelehrung, Impressum, ... )"
-msgstr ""
-"Shop pages (shopping cart page, product detail page, shipping costs, terms "
-"and conditions, data protection, cancellation policy, imprint, ...)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:40
-msgid "Deinstallation durchfÃŒhren"
-msgstr "Execute uninstall process"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:43
-#, fuzzy
-msgid ""
-"Hinweis: Es werden hier auch bereits gelÃ¶schte DatensÃ€tze angezeigt/gezÃ€hlt, "
-"da diese noch im System hinterlegt bleiben."
-msgstr ""
-"Note: already deleted data sets will be shown here as well as they are kept "
-"in the databases and only are marked as \\\"deleted\\\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:44
-#, fuzzy
-msgid "Das Deinstallieren und LÃ¶schen der DatensÃ€tze ist nicht umkehrbar!"
-msgstr "The uninstall process is irreversible!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:61
-msgid "Bitte mindestens eine Option wÃ€hlen."
-msgstr "Please select at least one option."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/deinstall.phtml:65
-msgid "Sind Sie sich sicher? Der Vorgang ist nicht umkehrbar!"
-msgstr "Are you sure? This process is irreversible!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:28
-#, fuzzy
-msgid "Formular Validierung"
-msgstr "Module management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:29
-#, fuzzy
-msgid "Serverseitig"
-msgstr "Error page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:30
-msgid "Serverseitig + Javascript V1"
-msgstr "Serversite + Javascript V1"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:31
-msgid "Serverseitig + Javascript V2"
-msgstr "Serversite + Javascript V2"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:36
-#, fuzzy
-msgid "Produktbild im Warenkorb anzeigen"
-msgstr "Show in basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:37
-#, fuzzy
-msgid "Produktbild in Bestellzusammenfassung anzeigen"
-msgstr "Show in order summary"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:45
-msgid "MwSt. Spalte auch bei einem Satz zeigen"
-msgstr "Show sales tax in column even for single rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:46
-#, fuzzy
-msgid "Artikelnummer im Produkttemplate anzeigen"
-msgstr "Show directly in product template?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:47
-#, fuzzy
-msgid "LÃ€nderauswahl im Warenkorb verbergen"
-msgstr "Remove product from basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:51
-msgid "Alternatives Design fÃŒr die Produktverwaltung aktivieren"
-msgstr "Enable alternative design for product management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/presentation.phtml:52
-msgid "Alternatives Design fÃŒr die Bestellansichtsseite aktivieren"
-msgstr "Enable alternate design for the order view page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:39
-#, fuzzy
-msgid "Ãber diese Installation"
-msgstr "about this installation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:141
-msgid "PHP-Info"
-msgstr "php-info"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:173
-msgid "Systemcheck"
-msgstr "System check"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:125
-#, fuzzy
-msgid "Fehlerprotokoll"
-msgstr "Order protocol"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:59
-msgid "wpShopGermany Version"
-msgstr "wpShopGermany version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:60
-msgid "aktivierte wpShopGermany-Module"
-msgstr "active wpShopGermany modules"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:61
-msgid "WordPress Version"
-msgstr "WordPress version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:62
-msgid "PHP Version"
-msgstr "PHP version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:63
-msgid "php.ini Einstellungen"
-msgstr "php.ini configuration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:64
-msgid "geladene PHP Erweiterungen"
-msgstr "loaded PHP extensions"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:72
-msgid "aktive Wordpress Plugins"
-msgstr "active Wordpress plugins"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:76
-msgid "Vormals aktivierte Module wieder herstellen aus KompatibilitÃ€tstest"
-msgstr "Restore previously activated modules from compatibility test"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:78
-msgid "Alle Plugins auÃer wpShopGermany deaktivieren (KompatibilitÃ€tstest)"
-msgstr "Disable all plugins except wpShopGermany (compatibility test)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:87
-msgid "Template Pfad fÃŒr Anpassungen"
-msgstr "Template path for customizations"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:91
-#, fuzzy
-msgid "Sprachdatei"
-msgstr "Language"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:104
-msgid "Angepasste Templates"
-msgstr "Customized templates"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:128
-#, fuzzy
-msgid "Es wurden noch keine Systemfehler aufgezeichnet."
-msgstr "No valid licence was found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:133
-#, fuzzy
-msgid "Protokolldatei lÃ¶schen"
-msgstr "Delete file"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/ueber.phtml:175
-msgid "Ausgeblendete Meldungen zurÃŒcksetzen"
-msgstr "Reset hidden messages"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:28
-msgid "Warenkorbseite"
-msgstr "Basket page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/seiten.phtml:29
-#, fuzzy
-msgid "Produktdetailseite"
-msgstr "Edit product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/pager.phtml:16
-#, fuzzy
-msgid "Erste Seite"
-msgstr "per page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/pager.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:114
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:109
-#, fuzzy
-msgid "Vorherige Seite"
-msgstr "Go to previous page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/pager.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:115
-#, fuzzy
-msgid "NÃ€chste Seite"
-msgstr "Go to next page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/pager.phtml:38
-#, fuzzy
-msgid "Letzte Seite"
-msgstr "Last order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:16
-msgid "MwSt. A"
-msgstr "VAT A"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:17
-msgid "MwSt. B"
-msgstr "VAT B"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:18
-msgid "MwSt. C"
-msgstr "VAT C"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:19
-msgid "MwSt. D"
-msgstr "VAT D"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:70
-#, fuzzy
-msgid "Markierte LÃ€nder lÃ¶schen"
-msgstr "Delete selected"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:80
-msgid ""
-"Das Standardland ist <span class=\"bg-info\">blau</span> markiert und wird "
-"fÃŒr die MwSt. Berechnung im Backend verwendet."
-msgstr ""
-"The default country is marked <span class = \"bg-info\"> blue </ span> and "
-"will be used for the VAT calculation in the back end."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender_list.phtml:83
-#, fuzzy
-msgid "Noch keine LÃ€nder angelegt."
-msgstr "No countries saved yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:27
-#, fuzzy
-msgid "Blognetzwerk-Einstellungen"
-msgstr "Settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:33
-msgid "Sie befinden sich in einer Multiblog Umgebung."
-msgstr "You are in a multi blog environment."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:39
-msgid "Jeden Blog getrennt behandeln"
-msgstr "Handle each blog seperately"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:40
-msgid "Session auf Verzeichnis einschrÃ€nken"
-msgstr "Restrict session to directory"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/blognetzwerk.phtml:47
-msgid ""
-"Nach der Umstellung dieser Option sollte in den Blogs in denen der Shop noch "
-"verwendet wird die Shop Datenbank aktualisiert werden. (Einstellungen -> "
-"Allgemein)"
-msgstr ""
-"After changing this option you should update the database for the blogs you "
-"still use this shop with. (Settings -> General)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:27
-msgid ""
-"Dieser Text wird in die Mail eingebunden, die der Kunde als "
-"BestellbestÃ€tigung erhÃ€lt."
-msgstr ""
-"This text is included in mails send to customers as order confirmation."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:27
-#, fuzzy
-msgid ""
-"Das Template fÃŒr die Mail finden Sie unter: <b>views/mailtemplates/"
-"kundenmail.phtml</b> bzw. <b>views/mailtemplates/html/kundenmail.phtml</b>."
-msgstr ""
-"The template for that mail can be found at <b>views/mods/mod_mail/"
-"mail_besteller.phtml</b>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:29
-#, fuzzy
-msgid "Widerrufsformular"
-msgstr "Power of revocation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:35
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie das Widerrufsformular lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this shipping method?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:35
-#, fuzzy
-msgid "Widerrufsformular lÃ¶schen"
-msgstr "Delete shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:39
-#, fuzzy
-msgid "Bisher wurde kein Widerrufsformular hinterlegt."
-msgstr "No countries saved yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:44
-msgid "Standardformular aus Shopinfo erstellen"
-msgstr "Create standard form from Shopinfo"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:49
-#, fuzzy
-msgid "Anhang an BestellbestÃ€tigung"
-msgstr "Order confirmation (Admin)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:52
-#, fuzzy
-msgid "Anhang an Rechnung"
-msgstr "Invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/widerrufsbelehrung.phtml:56
-#, fuzzy
-msgid "Anhang an AuftragsbestÃ€tigung"
-msgstr "Your order confirmation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:16
-#, fuzzy
-msgid "Produkte im Datenbestand"
-msgstr "Products in basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:21
-msgid "#1# Produkte mit #2# Mehrwertsteuer (#3#)"
-msgstr "# 1 # products with # 2 # VAT (# 3 #)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:23
-#, fuzzy
-msgid "#1# Produkte mit ungÃŒltigem Steuersatz"
-msgstr "#1# products imported."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:28
-msgid ""
-"Keine Produkte die noch keiner Mehrwertsteuergruppe zugewiesen wurden im "
-"Datenbestand."
-msgstr ""
-"No products that have not yet been assigned to any VAT group in the dataset."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:32
-#, fuzzy
-msgid "Modulkonfigurationen"
-msgstr "Configuration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_userpayment.class.php:22
-msgid "Zahlvarianten"
-msgstr "Payment methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout2.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:24
-msgid "Versandarten"
-msgstr "Shipping methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/migratemwst.phtml:60
-#, fuzzy
-msgid "MehrwertsteuersÃ€tze zuweisen"
-msgstr "Sales tax rates"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/news.phtml:33
-msgid "Derzeit stehen keine News zum Lesen bereit."
-msgstr "Currently there are no news available for reading."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/news.phtml:39
-msgid "Letzte Aktualisierung: #1# [<a href=\"#2#\">Aktualisieren</a>]"
-msgstr "Last update: # 1 # [<a href=\"#2#\"> Update </a>]"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:24
-#, fuzzy
-msgid "Erweiterte Einstellungen"
-msgstr "Settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:28
-msgid "SALT SchlÃŒssel"
-msgstr "SALT key"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:29
-msgid "RTE Felder mit nl2br speichern"
-msgstr "Save RTE fields with nl2br"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:31
-msgid "Debug Modus"
-msgstr "Debug mode"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:32
-msgid "Verwendete Templates anzeigen (Nur im Frontend)"
-msgstr "Show used templates (only in frontend)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:33
-msgid "Verwendete Templates in Entwicklerkonsole anzeigen"
-msgstr "Show used templates in Developer Console"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:36
-msgid "RequestURI als ProduktURL verwenden"
-msgstr "Use RequestURI as ProductURL"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:37
-msgid "User Views ignorieren"
-msgstr "Ignore user views"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:38
-msgid "Klassisches Upload Formular"
-msgstr "Classic upload form"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:39
-msgid "Ausgaben im Warenkorb direkt ausgeben"
-msgstr "Show output in basket directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:40
-msgid "ApplyFilter Funktion nicht anwenden"
-msgstr "Don't apply ApplyFilter functions"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:41
-msgid "RTE Felder mit nl2br ausgeben"
-msgstr "Display RTE fields with nl2br"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:42
-msgid "ZeilenumbrÃŒche im Export entfernen"
-msgstr "Remove line breaks in exports"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:43
-#, fuzzy
-msgid "wpautop deaktivieren"
-msgstr "Deactivate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:44
-msgid "wp_trim_excerpt nicht verwenden"
-msgstr "do not use wp_trim_excerpt"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:45
-msgid "Bestellungen nicht mit LOCK TABLES verarbeiten"
-msgstr "Do not process orders with LOCK TABLES"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:46
-msgid "[raw] und [/raw] um Templates ausgeben (Frontend)"
-msgstr "[raw] and [/ raw] to output templates (frontend)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:47
-msgid "Cachen von dynamischen Shopseiten verhindern"
-msgstr "Prevent caching of dynamic shop pages"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:48
-msgid "MAC KompatibilitÃ€t bei Dateiimporten"
-msgstr "MAC compatibility for file imports"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/extended.phtml:49
-msgid "Abfrage des Kundenstandortes (EU-Leistungsortregel)"
-msgstr "Query of the customer location (EU service location rule)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:25
-#, fuzzy
-msgid "Allgemeine Angaben"
-msgstr "No statement"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:28
-msgid "Name des Shops / Firma"
-msgstr "Name of shop / company"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:29
-msgid "Inhaber des Shops"
-msgstr "owner "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:102
-#, fuzzy
-msgid "Telefonnummer"
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1514
-msgid "Faxnummer"
-msgstr "Fax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:33
-#, fuzzy
-msgid "Steuernummer"
-msgstr "Sales tax identification number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:34
-#, fuzzy
-msgid "USt-IdNr."
-msgstr "VAT ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:135
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:134
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:14
-msgid "Anschrift"
-msgstr "Address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:291
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:257
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:298
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:380
-msgid "Postleitzahl"
-msgstr "Zip code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:47
-msgid "Hauptsitz des Shopbetreiber befindet sich:"
-msgstr "The head office of the shop operator is located:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:48
-#, fuzzy
-msgid "in Deutschland"
-msgstr "German"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:49
-#, fuzzy
-msgid "innerhalb der EU"
-msgstr "Update within the database"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:50
-msgid "im europÃ€ischen Ausland"
-msgstr "in other European countries"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:61
-#, fuzzy
-msgid "Zweigstelle vorhanden"
-msgstr "Load settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:76
-#, fuzzy
-msgid "Bankdaten"
-msgstr "Bank collection"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_view_afterpayment.phtml:9
-msgid "Name der Bank"
-msgstr "Bank name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:81
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:21
-msgid "Kontoinhaber"
-msgstr "Bank account owner"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:82
-msgid "IBAN Nummer"
-msgstr "iban number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:83
-msgid "BIC Nummer"
-msgstr "bic number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:92
-msgid "EU-Vertreter"
-msgstr "EU representatives"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:95
-#, fuzzy
-msgid "Name des EU-Vertreters"
-msgstr "Name of shipping method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/shopdata.phtml:99
-msgid "Stadt"
-msgstr "city"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:24
-#, fuzzy
-msgid "Datenschutzbeauftragter"
-msgstr "Privacy policy"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:29
-msgid "Datenschutzbeauftragter vorhanden"
-msgstr "Data protection officer available"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:134
-msgid "Name:"
-msgstr "Name:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:32
-#, fuzzy
-msgid "Telefon:"
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:33
-#, fuzzy
-msgid "E-Mail:"
-msgstr "Email"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:36
-msgid "Liste der AufsichtsbehÃ¶rden (Inland, EU, Ausland)"
-msgstr "List of supervisory authorities (domestic, EU, foreign countries)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:37
-msgid "Meldepflicht nach Â§4d Abs. 1 BDSG"
-msgstr "Obligation to report according to Â§ 4d Abs. 1 BDSG"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:45
-msgid "LÃ¶schen der kundenspezifischen Daten"
-msgstr "Delete the customer-specific data"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:49
-msgid "Letzte AktivitÃ€t Ã€lter als"
-msgstr "Last activity older than"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:16
-msgid "Einheit"
-msgstr "Unit"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:50
-msgid "Tag(e)"
-msgstr "day(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:50
-msgid "Monat(e)"
-msgstr "month(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/dataprotection.phtml:50
-msgid "Jahr(e)"
-msgstr "year(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:24
-#, fuzzy
-msgid "Land anlegen/bearbeiten"
-msgstr "Edit this customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:30
-#, fuzzy
-msgid "Speichern und schlieÃen"
-msgstr "Paste and close"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:52
-#, fuzzy
-msgid "Neues Land anlegen."
-msgstr "Create new country"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:53
-#, fuzzy
-msgid "StandardlÃ€nder importieren."
-msgstr "Import customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:54
-#, fuzzy
-msgid "EU-LÃ€nder importieren."
-msgstr "Import customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/laender.phtml:58
-#, fuzzy
-msgid "Zur Versandzonenverwaltung"
-msgstr "Customer management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:162
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:194
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:290
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:96
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:150
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1502
-msgid "Anrede"
-msgstr "Salutation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:16
-msgid "MÃ¶gliche Werte fÃŒr Auswahl getrennt mit |"
-msgstr "Possible values separated with |"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:137
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1517
-msgid "Geburtsdatum"
-msgstr "Day of birth"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:202
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:202
-#, fuzzy
-msgid "E-Mail Adresse (Wiederholung)"
-msgstr "Email address (confirmation)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:26
-msgid "Hausnummer separat erfassen"
-msgstr "Enter house number separately"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kundendaten_tab1.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:152
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:323
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:289
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:337
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:406
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:160
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:166
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:38
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:43
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:40
-msgid "UStIdNr."
-msgstr "VAT ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:29
-msgid "Einstellungen als XML Datei downloaden"
-msgstr "Download settings as XML file"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:34
-msgid "Einstellungen laden"
-msgstr "Load settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:39
-msgid "Einstellungen ÃŒbernehmen"
-msgstr "Apply settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/loadsavesettings.phtml:42
-msgid ""
-"Derzeit werden nur die Einstellungen gespeichert. Produkte/Kunden/"
-"Bestellungen etc. sind nicht enthalten!"
-msgstr ""
-"Currently only settings are saved. No products, customers or orders are "
-"included!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:32
-#, fuzzy
-msgid "Telefon: "
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:33
-#, fuzzy
-msgid "Fax: "
-msgstr "Fax: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:34
-#, fuzzy
-msgid "E-Mail: "
-msgstr "Email"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:42
-msgid ""
-"Hiermit widerrufe(n) ich/wir (*) den von mir/uns (*) abgeschlossenen Vertrag "
-"ÃŒber den Kauf"
-msgstr ""
-"I / we (*) hereby revoke the contract of purchase concluded by me / us (*)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:43
-msgid "der folgenden Waren (*)/die Erbringung der folgenden Dienstleistung."
-msgstr "the following goods (*) / the provision of the following Service."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:45
-#, fuzzy
-msgid "Artikelname"
-msgstr "Item number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:46
-msgid "Bestellt am (*)/erhalten am (*)"
-msgstr "Ordered on (*) / received on (*)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:54
-#, fuzzy
-msgid "Meine Anschrift"
-msgstr "Address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:31
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:36
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:33
-msgid "PLZ/Ort"
-msgstr "Zip code / city"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/musterwiderruf.pdf.phtml:61
-#, fuzzy
-msgid "Datum, Unterschrift"
-msgstr "Date of invoice/credit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:29
-#, fuzzy
-msgid "Kleinunternehmerregelung Text"
-msgstr "Small business as defined in Â§19 UStG"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:33
-msgid "Preisangaben im Shop (Backend)"
-msgstr "Prices in shop (back end)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:46
-msgid "Netto (zzgl. Steuer)"
-msgstr "Net (plus tax)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:45
-msgid "Brutto (inkl. Steuer)"
-msgstr "Gross (incl. tax)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:43
-msgid "Preisangaben im Shop (Frontend)"
-msgstr "Prices in shop (front end)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:30
-msgid "Kleinunternehmerregelung"
-msgstr "Small business as defined in Â§19 UStG"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:42
-msgid "Versandkosten bei 0 ausblenden"
-msgstr "Hide shipping costs when zero"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/admin/kalkulation.phtml:43
-msgid "Zahlungskosten bei 0 ausblenden"
-msgstr "Hide payment costs when zero"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:236
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:122
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:33
-msgid "Bestellwert"
-msgstr "Order value"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:15
-msgid "Bestellkommentar (Admin)"
-msgstr "Order comment (admin)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:21
-msgid "Bestellkommentar (Kunde)"
-msgstr "Order comment (customer)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:31
-msgid "StatusÃ€nderung"
-msgstr "Change of status"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:209
-msgid "Neuer Status"
-msgstr "Neu status"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:35
-#, fuzzy
-msgid "Kunden informieren"
-msgstr "Inform customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:41
-msgid "Status Ã€ndern"
-msgstr "Change status"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/order_view_sidebar.phtml:10
-#, fuzzy
-msgid "Bestelluploads"
-msgstr "Order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_general.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/order_view_sidebar.phtml:15
-#, fuzzy
-msgid "Keine Dateien hochgeladen."
-msgstr "No file uploaded yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:17
-#, fuzzy
-msgid "BestellÃŒbersicht"
-msgstr "Order view page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:18
-#, fuzzy
-msgid "Bestellansicht (Detail)"
-msgstr "Order view page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:261
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:149
-msgid "Kommentar (Admin): "
-msgstr "Comment (admin): "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_alternativeDesign.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:265
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:153
-#, fuzzy
-msgid "Kommentar (Kunde): "
-msgstr "Comment (customer): #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:16
-#, fuzzy
-msgid "Kundendaten bearbeiten"
-msgstr "Edit this customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:23
-#, fuzzy
-msgid "UStIdNr"
-msgstr "VAT ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:157
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1508
-#, fuzzy
-msgid "Hausnummer"
-msgstr "Fax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:74
-#, fuzzy
-msgid "Auch Kundendaten anpassen"
-msgstr "Customer data after order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:75
-#, fuzzy
-msgid "Alle Bestellungen des Kunden Ã€ndern"
-msgstr "Orders of customer #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:78
-#, fuzzy
-msgid "Auch Lieferanschrift anpassen"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:96
-msgid "Zum Kunden"
-msgstr "Switch to customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_customerdata.phtml:129
-#, fuzzy
-msgid "Anschrift Ã€ndern"
-msgstr "Address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:327
-#, fuzzy
-msgid "Gutschein hinzufÃŒgen/bearbeiten"
-msgstr "Edit this customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:344
-msgid "Rabatt hinzufÃŒgen/bearbeiten"
-msgstr "Add / edit discount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_orderdata.phtml:361
-#, fuzzy
-msgid "Produkt hinzufÃŒgen/bearbeiten"
-msgstr "Edit product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:26
-#, fuzzy
-msgid "Neue Bestellung"
-msgstr "When ordering"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:36
-#, fuzzy
-msgid "Kunde (ID)"
-msgstr "CustomerID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:23
-msgid "Bestellstatus"
-msgstr "Order status"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:59
-#, fuzzy
-msgid "Bestellungen mit Produkten aus Produktgruppe"
-msgstr "Allows to assign products to product groups."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:82
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:148
-#, fuzzy
-msgid "Bestelldatum (Monat/Jahr)"
-msgstr "Order date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:182
-#, fuzzy
-msgid "Rechnungsdatum (Monat/Jahr)"
-msgstr "Invoice date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:107
-#, fuzzy
-msgid "Bestellungen suchen"
-msgstr "Search for order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:132
-msgid "Kunde (E-Mail oder Kundennummer)"
-msgstr "Customer (e-mail or customer number)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:142
-#, fuzzy
-msgid "Bestellung anlegen"
-msgstr "Show order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:164
-#, fuzzy
-msgid "Bitte einen Kunden angeben."
-msgstr "Please enter a text!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:212
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:98
-msgid "#1# <span>(#2#)<span>"
-msgstr "#1# <span>(#2#)</span>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:231
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:117
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:361
-#, fuzzy
-msgid "Nr"
-msgstr "#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:232
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:118
-msgid "Kunde"
-msgstr "Customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:233
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:119
-msgid "Bezahlmethode"
-msgstr "Payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:235
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:29
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_fuellmenge.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:34
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:31
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_topseller.class.php:19
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_relatedproducts.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_basketteaser.class.php:17
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_weight.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:24
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:34
-msgid "Produkte"
-msgstr "Products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:237
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:79
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:136
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:135
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:21
-msgid "Status"
-msgstr "Status"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:253
-msgid "Diese Bestellung ansehen"
-msgstr "Display this order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:255
-msgid "Sind Sie sich sicher, dass Sie diese Bestellung stornieren mÃ¶chten?"
-msgstr "Are you sure you want to cancel this order?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:255
-msgid "Diese Bestellung stornieren"
-msgstr "Cancel this order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:255
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:141
-msgid "Stornieren"
-msgstr "Cancel invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:257
-msgid "Sind Sie sich sicher, dass Sie diese Bestellung lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this order?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:257
-msgid "Diese Bestellung lÃ¶schen"
-msgstr "Delete this order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:269
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:157
-#, fuzzy
-msgid "Lieferadresse beachten"
-msgstr "Shipping address last name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:275
-#, fuzzy
-msgid "Abo Bestellung"
-msgstr "Order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:284
-msgid "VerlÃ€ngerung zu Bestellung <a href=\"#1#\">#2#</a>"
-msgstr "Extension to order <a href=\"#1#\"> # 2 # </a>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:339
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:209
-msgid "#1# x <a href=\"#2#\">#3#</a> fÃŒr je #4#"
-msgstr "#1# x <a href=\"#2#\">#3#</a> for each #4#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:352
-msgid "Abo Laufzeit:"
-msgstr "abo runtime:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:382
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:255
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:191
-msgid "Aktion wÃ€hlen"
-msgstr "select action"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:384
-msgid "Status auf \"#1#\" setzen."
-msgstr "Set status to \"#1#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:386
-msgid "Bestellungen lÃ¶schen"
-msgstr "Delete order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:388
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:262
-msgid "Rechnung schreiben"
-msgstr "Generate invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:389
-msgid "Rechnung ansehen"
-msgstr "View invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:393
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:259
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:194
-msgid "AusfÃŒhren"
-msgstr "Execute"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/index.phtml:408
-msgid "Keine Bestellungen in der Datenbank."
-msgstr "No order in database found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:13
-msgid "Kundenmail simulieren (An Shop Betreiber)"
-msgstr "Simulate Customer Mail (To Shop Operator)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:14
-msgid "Adminmail simulieren"
-msgstr "Simulate Adminmail"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:31
-#, fuzzy
-msgid "Bestellabschlussseite"
-msgstr "Order view page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:16
-#, fuzzy
-msgid "URL Benachrichtigung (Kauf) auslÃ¶sen"
-msgstr "URL notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:17
-#, fuzzy
-msgid "URL Benachrichtigung (Bezahlung) auslÃ¶sen"
-msgstr "URL notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_dev.phtml:23
-#, fuzzy
-msgid "Warenkorbdaten"
-msgstr "Basket page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_shippay.phtml:11
-msgid "Versand- und Zahlungsart"
-msgstr "Shipping and payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_shippay.phtml:43
-msgid "Retourenlabel anfordern"
-msgstr "Request return label"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view_shippay.phtml:45
-msgid "Retourenlabel"
-msgstr "return label"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:29
-#, fuzzy
-msgid "Besteuerung"
-msgstr "Order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:31
-msgid "Endkundenbesteuerung"
-msgstr "end customers taxation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:32
-msgid "Firmenkundenbesteuerung (USTIdNr)"
-msgstr "Corporate Taxation (USTIdNr)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:194
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:207
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:94
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:228
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:97
-msgid "Einzelpreis"
-msgstr "Single price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:161
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:168
-msgid "Zum Produkt"
-msgstr "Switch to product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:64
-#, fuzzy
-msgid "Produkt lÃ¶schen"
-msgstr "Search for products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:273
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1217
-msgid "Gutschein"
-msgstr "Voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:96
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:204
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:257
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:270
-#, fuzzy
-msgid "(inkl. MwSt.)"
-msgstr "w/o salex tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:206
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:238
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:272
-#, fuzzy
-msgid "(zzgl. MwSt.)"
-msgstr "plus sales tax (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:74
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:93
-#, fuzzy
-msgid "Gutschein bearbeiten"
-msgstr "Create voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:102
-#, fuzzy
-msgid "Gutschein lÃ¶schen"
-msgstr "Search voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:137
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:316
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:195
-msgid "Summe (zzgl. #1#)"
-msgstr "Total (plus #1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:142
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:319
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:198
-msgid "Summe (zzgl. #1#, zzgl. MwSt.)"
-msgstr "Total (plus #1#, plus sales tax)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:144
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:321
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:200
-msgid "Summe (zzgl. #1#, inkl. MwSt.)"
-msgstr "Total (plus #1#, incl. sales tax)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:163
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:182
-msgid "  ("
-msgstr "("
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:164
-#, fuzzy
-msgid "Versandart Ã€ndern"
-msgstr "Shipping methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:183
-#, fuzzy
-msgid "Zahlungsart Ã€ndern"
-msgstr "Payment methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:201
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/produkt_addedit_sidebar.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/productgroups_addedit_sidebar.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/customergroup_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:797
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:810
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:296
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1249
-msgid "Rabatt"
-msgstr "Discount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:209
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:85
-#, fuzzy
-msgid "Rabatt bearbeiten"
-msgstr "Edit product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:210
-#, fuzzy
-msgid "Rabatt lÃ¶schen"
-msgstr "Delete file"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:256
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/product_table.phtml:268
-#, fuzzy
-msgid "Gesamtsumme"
-msgstr "Total"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:46
-#, fuzzy
-msgid "Bestellung ID:#1#"
-msgstr "Order #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:66
-#, fuzzy
-msgid "Versand- und Zahlungsart bearbeiten"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:93
-#, fuzzy
-msgid "BestellbestÃ€tigung"
-msgstr "Order confirmation (Admin)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/view.phtml:93
-#, fuzzy
-msgid "erneut versenden"
-msgstr "Item(s) shipped"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addVoucher.phtml:29
-#, fuzzy
-msgid "Gutscheinsuche"
-msgstr "Search voucher"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addVoucher.phtml:34
-msgid "Code (Optional)"
-msgstr "Code (optional)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addVoucher.phtml:35
-msgid "Guschein ID (Optional)"
-msgstr "Voucher ID (optional)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addVoucher.phtml:36
-msgid "Gutscheinwert in #1# (#2#) oder % "
-msgstr "Voucher value in # 1 # (# 2 #) or%"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addProduct.phtml:18
-#, fuzzy
-msgid "Produktsuche"
-msgstr "Search for products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/editPayShipping.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:50
-msgid "Brutto"
-msgstr "gross"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/editPayShipping.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:50
-msgid "Netto"
-msgstr "net"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/editPayShipping.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/editPayShipping.phtml:61
-msgid "Kosten"
-msgstr "costs"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addProduct_product_selected.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1480
-msgid "Produktpreis"
-msgstr "Price of product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addProduct_product_selected.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:189
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/data.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/all.phtml:126
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:191
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:204
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:79
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:34
-msgid "Menge"
-msgstr "Quantity"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addProduct_product_selected.phtml:44
-msgid "EU-Leistungsortregel anwenden"
-msgstr "Apply EU benefits rule"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/order/backendEdit/addDiscount.phtml:21
-msgid "Rabattwert in #1# (#2#) oder % "
-msgstr "Discount value in # 1 # (# 2 #) or%"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/produkt_addedit_content.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1642
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:284
-msgid "Produktattribute"
-msgstr "Product attributes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/produkt_addedit_content.phtml:31
-#, fuzzy
-msgid "Bisher wurden keine Attribute im System angelegt."
-msgstr "No product groups were created yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/produkt_addedit_content.phtml:36
-msgid "Zur Konfiguration der Produktattribute"
-msgstr "To configure the product attributes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:9
-msgid "Keine Produktattribute hinterlegt."
-msgstr "No product attributes saved yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:81
-msgid "ID"
-msgstr "ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/simplefilter.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:99
-msgid "Anzeigen"
-msgstr "Display"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:27
-msgid "Werte direkt in jedem Template anzeigen wenn gesetzt."
-msgstr "Show values directly in every template if set."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:38
-#, fuzzy
-msgid "Produktattribut lÃ¶schen"
-msgstr "Delete product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:71
-msgid "Sind Sie sich sicher, dass Sie dieses Produktattribute lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this product attribute?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/list.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:108
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:132
-msgid "Die Reihenfolge lÃ€sst sich mittels Drag&Drop verÃ€ndern."
-msgstr "The order can be changed using drag & drop."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/genPACode.phtml:9
-msgid "Code fÃŒr den Namen des Produktattributes mit der ID #1#"
-msgstr "Code for name of the product attribute with id #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/genPACode.phtml:13
-msgid "Code fÃŒr den Wert des Produktattributes mit der ID #1#"
-msgstr "Code for value of product attribute with id #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/genPACode.phtml:17
-msgid ""
-"Diese Code Schipsel kÃ¶nnen in die Produkttemplates oder in die Mailtemplates "
-"eingebaut werden."
-msgstr "These code snippets can be used in product and mail templates."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:91
-#, fuzzy
-msgid "Globale Produktattribute"
-msgstr "Product attributes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:116
-msgid "Neues Produktattribut anlegen"
-msgstr "Create new product attribute"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:120
-#, fuzzy
-msgid "Produktattribut(e) im Produkttemplate anzeigen"
-msgstr "Show directly in product template?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:121
-#, fuzzy
-msgid "Produktattribut(e) im Warenkorbtemplate anzeigen"
-msgstr "Remove product from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:122
-#, fuzzy
-msgid "Produktattribut(e) im BestellÃŒbersichtstemplate anzeigen"
-msgstr "Show on product view pages"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktattribute/settings_edit.phtml:123
-#, fuzzy
-msgid "Produktattribut(e) in Mailemplates anzeigen"
-msgstr "Show product variables on invoice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail_html.phtml:11
-msgid ""
-"Sie erhalten hiermit den Lieferschein mit der Nummer #1# fÃŒr folgende "
-"Produkte."
-msgstr ""
-"You will receive the delivery note with the number # 1 # for the following "
-"products."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail_html.phtml:19
-msgid "Das Lieferdatum ist der #1#"
-msgstr "Deliverydate: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_row.phtml:12
-#, fuzzy
-msgid "Auf Lieferschein"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:9
-msgid "Bisher keine FuÃtexte angelegt!"
-msgstr "No footer text created yet!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:162
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:64
-msgid "Text"
-msgstr "Text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:16
-msgid "Standard"
-msgstr "Default"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/foottext_list.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/foottext_list.phtml:28
-msgid "FuÃtext lÃ¶schen"
-msgstr "Delete footer text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverymail_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation_html.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy.php:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy_html.php:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:3
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_logout.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail_html.phtml:1
-msgid "Hallo"
-msgstr "Hello,"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:116
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:136
-msgid "Kunden-Nr"
-msgstr "Customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:100
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/coverletter_pdf.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:119
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:139
-msgid "Best. Nr."
-msgstr "Order id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:59
-#, fuzzy
-msgid "Lieferdatum"
-msgstr "Shipping address last name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:129
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:149
-msgid "Innergemeinschaftliche Lieferung."
-msgstr "Intra-Community delivery."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:136
-#, fuzzy
-msgid "Steuerfreie Ausfuhrlieferung."
-msgstr "Compressed delivery"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:183
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:177
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:190
-msgid "Nr."
-msgstr "#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:280
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:272
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:285
-#, fuzzy
-msgid "Artikelnummer: #1#"
-msgstr "Item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/deliverynote_pdf.phtml:346
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:371
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:384
-msgid "Variante: #1#"
-msgstr "Variant: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:8
-#, fuzzy
-msgid "Lieferscheine"
-msgstr "Shipping address"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:13
-msgid "Bisher wurden zu dieser Bestellung keine Lieferscheine erstellt."
-msgstr "So far, no delivery notes have been created for this order."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:17
-msgid "##1# Lieferschein geschrieben am #2# (Lieferdatum: #3#)"
-msgstr "## 1 # Delivery note written on # 2 # (delivery date: # 3 #)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:28
-#, fuzzy
-msgid "Neuer Lieferschein"
-msgstr "New voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:195
-#, fuzzy
-msgid "E-Mail an Kunden senden"
-msgstr "Send email to customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:231
-msgid "FuÃtext"
-msgstr "Footer text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:98
-#, fuzzy
-msgid "Lieferschein erstellen"
-msgstr "Create credit voucher."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:82
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:142
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:263
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:85
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:371
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:375
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:994
-msgid "Vorschau"
-msgstr "Preview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/order_view_content.phtml:125
-#, fuzzy
-msgid "Bitte mindestens ein Produkt fÃŒr den Lieferschein wÃ€hlen"
-msgstr "Please select at least one profile to export."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:11
-msgid "Vordefinierte Textfelder"
-msgstr "Pre defined text fields"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:12
-msgid "FuÃzeile"
-msgstr "Footer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:18
-msgid "Adresszeile"
-msgstr "Line for address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:25
-msgid "Es wurde bisher kein Briefpapier hochgeladen"
-msgstr "No letter paper was uploaded yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:27
-msgid "Derzeitiges Briefpapier"
-msgstr "Current letter paper"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:38
-msgid "Briefpapier (PDF/JPG)"
-msgstr "Letter paper (pdf\\jpeg)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:45
-msgid "Es wurde bisher kein Logo hochgeladen"
-msgstr "No logo was uploaded yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:65
-msgid "Logo linksbÃŒndig ausrichten"
-msgstr "Align the logo to the left"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:66
-#, fuzzy
-msgid "Logo zentrieren"
-msgstr "Ignore"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:67
-msgid "Logo rechtsbÃŒndig ausrichten"
-msgstr "Align logo right-aligned"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:72
-msgid "Logodeckkraft"
-msgstr "Logo opacity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:89
-msgid "Logo (JPG)"
-msgstr "Logo (jpeg)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:95
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:145
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:102
-msgid "Freitext"
-msgstr "Free text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:96
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:103
-msgid "X"
-msgstr "X"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:104
-msgid "Y"
-msgstr "Y"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:100
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:105
-msgid "Farbe"
-msgstr "Color"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:106
-msgid "GrÃ¶Ãe"
-msgstr "Size"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:131
-msgid "Diese Checkbox aktivieren, damit die Textzeile verwendet wird."
-msgstr "Activate this checkbox to use the text line."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:138
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:149
-msgid "Sind Sie sich sicher? Ihre bisherigen Einstellungen gehen verloren!"
-msgstr "Are you sure? You current settings will be lost!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:138
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:149
-msgid "Standardeinstellungen laden"
-msgstr "Restore factory settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:144
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:153
-msgid ""
-"Die Angaben fÃŒr X (Abstand von Links) und Y (Abstand von Oben) werden in mm "
-"eingetragen."
-msgstr ""
-"The values for X (margin from left) and Y (margin from top) have to be "
-"entered in mm."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:147
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:145
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:154
-#, fuzzy
-msgid ""
-"Die Farbe wird im Hexadezimalformat angegeben (#FFFFFF fÃŒr weiÃ, #000000 fÃŒr "
-"schwarz)."
-msgstr ""
-"The color has to be entered as hexadecimal  (#FFFFFF for white, #000000 for "
-"black)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:160
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:165
-#, fuzzy
-msgid "Neue FuÃzeile anlegen"
-msgstr "Create new order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:160
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:165
-#, fuzzy
-msgid "Neue FuÃzeile anlegen."
-msgstr "Create new order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:166
-#, fuzzy
-msgid ""
-"Hier kÃ¶nnen Sie Texte vordefinieren, die sie unter den Lieferschein setzen "
-"kÃ¶nnen."
-msgstr "Here you can define texts that can be placed under the invoice."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:173
-#, fuzzy
-msgid "Format der Lieferscheinnummer"
-msgstr "Format order id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:174
-#, fuzzy
-msgid "Start fÃŒr Lieferscheinnummer"
-msgstr "Start value for order id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:175
-#, fuzzy
-msgid "URL FÃŒr URL Benachrichtigung"
-msgstr "URL for HTTP notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:176
-#, fuzzy
-msgid "URL Benachrichtigung standardmÃ€Ãig aktiv"
-msgstr "URL notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:179
-#, fuzzy
-msgid "Produktattribute auf dem Lieferschein anzeigen"
-msgstr "Show product variables on invoice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:182
-msgid "Land auf Lieferschein verbergen"
-msgstr "Hide country on delivery note"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:183
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:201
-#, fuzzy
-msgid "Artikelnummer anzeigen"
-msgstr "Item number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:203
-msgid "In Spalte \"Nr.\" zeigen"
-msgstr "In column \"No.\" demonstrate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:186
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:204
-#, fuzzy
-msgid "Als extra Zeile anzeigen"
-msgstr "Show all"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverynote/settings_edit.phtml:264
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:321
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie diese FuÃzeile lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this order?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/basket_row.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/overview_row.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:186
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:177
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:85
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1490
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:38
-msgid "Gewicht"
-msgstr "Weight"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/overview_row_end.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/basket_row_end.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:243
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:107
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1467
-#, fuzzy
-msgid "Gesamtgewicht"
-msgstr "Total weight: #1#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/overview_row_end.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/basket_row_end.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/basket_row.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/overview_row.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/basket_row.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/overview_row.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:253
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:399
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:121
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:308
-msgid "&nbsp;"
-msgstr "&nbsp;"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/product_addedit_content.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/product_addedit_content.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/produkt_edit_allgemein.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_weight.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_weight.class.php:156
-msgid "Produktgewicht"
-msgstr "Product weight"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/product_addedit_content.phtml:15
-msgid "Zur Konfiguration des Gewichtsmoduls"
-msgstr "For configuration of the weight module"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:8
-msgid "Gewichtseinheit"
-msgstr "Weight unit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:52
-msgid "Im Produkt anzeigen"
-msgstr "Show in product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:12
-#, fuzzy
-msgid "Gesamtgewicht im Warenkorbs anzeigen"
-msgstr "Show in basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:21
-#, fuzzy
-msgid "In der Warenkorb-Lightbox anzeigen"
-msgstr "Show in basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:22
-msgid "Im Warenkorb im Produkt anzeigen"
-msgstr "Show in basket in product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:16
-#, fuzzy
-msgid "Gesamtgewicht in Zusammenfassung anzeigen"
-msgstr "Show in order summary"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:26
-msgid "In Zusammenfassung im Produkt anzeigen"
-msgstr "Show in order summary in product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:20
-msgid "Auf ProduktÃŒbersichtsseiten anzeigen"
-msgstr "Show on product view pages"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:24
-msgid "Gesamtgewicht der vollstÃ€ndigen Anfrage auf Anfrageseite anzeigen"
-msgstr "Show total weight of full request on request page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_weight/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:31
-#, fuzzy
-msgid "Auf Anfrageseite im Produkt anzeigen"
-msgstr "Show in basket in product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:11
-msgid "Topseller"
-msgstr "Topseller"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:23
-#, fuzzy
-msgid "TopSeller Status"
-msgstr "Previous status"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:17
-msgid "Einbeziehen"
-msgstr "Include"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:18
-msgid "AusschlieÃen"
-msgstr "Exclude"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/produkt_addedit_allgemein.phtml:31
-msgid "Zur Konfiguration des Topsellermoduls"
-msgstr "To configure the Topseller module"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/widget_form.phtml:19
-msgid "Limit"
-msgstr "limit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/settings_edit.phtml:9
-#, fuzzy
-msgid "Alle Produkte einbeziehen"
-msgstr "Edit product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_topseller/settings_edit.phtml:11
-msgid "Maximale Anzahl (Standard)"
-msgstr "Maximum number (default)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customerbudget/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:127
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:173
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_debitpayment/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:20
-msgid "Hinweistext"
-msgstr "Hint"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:14
-msgid "Sandbox Modus"
-msgstr "Sand box mode"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:22
-msgid "SSL HÃ€ndlerkennung (S-Internetkasse-SSL-User)"
-msgstr "SSL Merchant ID (S-Internet Cashier SSL-User)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:23
-#, fuzzy
-msgid "MAC-SchlÃŒssel"
-msgstr "SALT key"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:28
-#, fuzzy
-msgid "URL fÃŒr Shopbenachrichtigung"
-msgstr "URL for HTTP notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:32
-#, fuzzy
-msgid "URL fÃŒr Anfragen"
-msgstr "Invalid request"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:33
-#, fuzzy
-msgid "API Version"
-msgstr "Pro version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:107
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:129
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:175
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:26
-msgid "GebÃŒhr/Rabatt"
-msgstr "Charge\\Discount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:108
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:130
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:176
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_debitpayment/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:27
-#, fuzzy
-msgid "Mehrwertsteuersatz"
-msgstr "Sales tax rates"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:131
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:177
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:34
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_debitpayment/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:163
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:28
-#, fuzzy
-msgid "Keine MwSt. wenn Land steuerfrei"
-msgstr "No sales tax when country is taxe-free"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:40
-#, fuzzy
-msgid "Mobile Version nutzen"
-msgstr "Install new version"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:41
-msgid "Kartenhinhaber ist Pflichtfeld (Nur Kreditkarte)"
-msgstr "Cardholder is required (Credit Card Only)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:42
-msgid "Karteninhaber ist Optional (Nur Kreditkarte)"
-msgstr "Cardholder is Optional (Credit Card Only)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:43
-msgid "Bei VISA ohne Autorisierung Zahlung erlauben (Nur Kreditkarte / VISA)"
-msgstr ""
-"Allow payment with VISA without authorization (credit card / VISA only)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:44
-msgid "Kontoinhaber ist Pflichtfeld (Nur Lastschrift)"
-msgstr "Account holder is required (direct debit only)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:45
-msgid "Kontoinhaber ist Optional (Nur Lastschrift)"
-msgstr "Account holder is optional (direct debit only)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:46
-msgid "Sperrlistenabfrage (Nur Lastschrift, muss freigeschaltet sein)"
-msgstr "Block list query (only direct debit must be activated)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:49
-#, fuzzy
-msgid "Autorisierung"
-msgstr "Sorting"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:85
-msgid "Zahlung sofort starten"
-msgstr "Start payment immediately"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:51
-msgid "Nach Abschluss direkt auf Fehler- bzw. Erfolgsseite leiten"
-msgstr "After completion, lead directly to the error or success side"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:79
-msgid "Erfolgsseite"
-msgstr "Success page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/settings_edit.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:81
-msgid "Fehlerseite"
-msgstr "Error page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/order_done.phtml:8
-#, fuzzy
-msgid "Um den Betrag zu bezahlen klicken Sie bitte auf folgendes Logo."
-msgstr "To pay your order using PayPal please click on the following logo."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/order_done.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shs/order_done.phtml:11
-msgid "Mit der Sparkassen Internetkasse bezahlen"
-msgstr "Pay with the Sparkassen Internetkasse"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:19
-msgid "Kundengruppenverwaltung (#1# Kundengruppen)"
-msgstr "Customer Group Management (# 1 # Customer Groups)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:41
-#, fuzzy
-msgid "Kundengruppen suchen"
-msgstr "Search customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:76
-#, fuzzy
-msgid "Preisanzeige"
-msgstr "Show all"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1498
-msgid "Kunden"
-msgstr "Customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:151
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:156
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:146
-msgid "Diesen Kunden bearbeiten"
-msgstr "Edit this customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:88
-msgid "Kunden dieser Kundengruppe anzeigen"
-msgstr "Show customers of this customer group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:88
-#, fuzzy
-msgid "Kunden anzeigen"
-msgstr "Show order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:90
-#, fuzzy
-msgid "Sind Sie sicher, dass Sie diese Kundengruppe lÃ¶schen wollen?"
-msgstr "Are you sure you want to delete this customer?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:158
-msgid "Diesen Kunden lÃ¶schen"
-msgstr "Delete this customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:95
-msgid "Brutto Preise"
-msgstr "gross price"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:97
-msgid "Netto Preise"
-msgstr "net price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/index.phtml:129
-#, fuzzy
-msgid "Keine Kundengruppen in der Datenbank."
-msgstr "No customers in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:73
-#, fuzzy
-msgid "Kundengruppenverwaltung"
-msgstr "Customer management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:19
-#, fuzzy
-msgid "Kundengruppe anlegen/bearbeiten"
-msgstr "Edit this customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:51
-#, fuzzy
-msgid "Kundengruppe speichern"
-msgstr "Save customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/addedit.phtml:52
-#, fuzzy
-msgid "Kundengruppe speichern und zur Ãbersicht"
-msgstr "Save customer and back to overview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/admin_setcapabilities.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:73
-#, fuzzy
-msgid "Kundengruppen"
-msgstr "Search customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/settings_edit.phtml:8
-#, fuzzy
-msgid "Kundengruppen pro Seite (Backend)"
-msgstr "Customers per page (back end)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/settings_edit.phtml:10
-#, fuzzy
-msgid "Kundengruppe bei Registrierung (Checkout)"
-msgstr "Register in checkout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customergroup/settings_edit.phtml:11
-#, fuzzy
-msgid "Kundengruppe bei Registrierung (Registrierung)"
-msgstr "Email for registrations (customer management)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:19
-#, fuzzy
-msgid "Anschreiben"
-msgstr "Overwrite"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:13
-#, fuzzy
-msgid "Bisher kein Anschreiben fÃŒr diese Bestellung geschrieben."
-msgstr "No invoice written yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:21
-msgid "#2#: Anschreiben ##1#"
-msgstr "# 2 #: cover letter ## 1 #"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:48
-#, fuzzy
-msgid "Shop Adresse"
-msgstr "IP address"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:56
-msgid "Text fÃŒr das Anschreiben"
-msgstr "Text for the cover letter"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/order_view.phtml:60
-#, fuzzy
-msgid "Speichern & Drucken"
-msgstr "Save"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/coverletter_pdf.phtml:81
-#, fuzzy
-msgid "Kunden-Nr."
-msgstr "Customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/coverletter_pdf.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:122
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:142
-msgid "Datum"
-msgstr "Date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:37
-#, fuzzy
-msgid "Textvorgabe"
-msgstr "Text input"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:61
-#, fuzzy
-msgid "X-Position"
-msgstr "invoice line item"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_coverletter/settings_edit.phtml:62
-#, fuzzy
-msgid "Y-Position"
-msgstr "invoice line item"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/admin_setcapabilities.phtml:11
-msgid "Gutscheinverwaltung"
-msgstr "Voucher management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:20
-msgid "Neuer Gutschein"
-msgstr "New voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:78
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:11
-msgid "Wert"
-msgstr "Value"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:192
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:191
-msgid "Berechnung"
-msgstr "Calculation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:13
-msgid "Absoluter Betrag"
-msgstr "Absolute value"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:14
-msgid "Prozentual"
-msgstr "Percentaged"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:16
-msgid "GÃŒltig ab"
-msgstr "Valid from"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/order_view_afterpayment.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:38
-msgid "GÃŒltig bis"
-msgstr "Valid till"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:48
-#, fuzzy
-msgid "Code Generierung"
-msgstr "Generate HTML code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:67
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:63
-#, fuzzy
-msgid "Automatisch"
-msgstr "Alphabetical order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:179
-msgid "Manuell"
-msgstr "Manually"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:75
-msgid "Code"
-msgstr "Code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:62
-msgid "Minimaler Warenwert"
-msgstr "Minimum value of goods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:68
-msgid "Mehrfach verwendbar"
-msgstr "Reusable several times"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:439
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:138
-msgid "Kommentar"
-msgstr "Comment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:71
-#, fuzzy
-msgid "BeschrÃ€nkung auf Produktgruppen"
-msgstr "More about product group"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:73
-msgid "BeschrÃ€nkung auf Produkte"
-msgstr "Restriction on products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:79
-#, fuzzy
-msgid "Gutschein speichern"
-msgstr "Search voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/add.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:26
-msgid "Gutschein anlegen"
-msgstr "Create voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:22
-#, fuzzy
-msgid "Import"
-msgstr "CSV import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:24
-#, fuzzy
-msgid "Export"
-msgstr "CSV export"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:42
-msgid "Gutscheine suchen"
-msgstr "Search voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:76
-msgid "Start"
-msgstr "Start"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:77
-msgid "Ende"
-msgstr "end"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:96
-msgid "PDF"
-msgstr "pdf"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:117
-#, fuzzy
-msgid "#1# mal benutzt."
-msgstr "#1# time used"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:121
-#, fuzzy
-msgid "Mehrfach benutzbar"
-msgstr "Reusable several times"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:132
-#, fuzzy
-msgid "Markierte Gutscheine lÃ¶schen"
-msgstr "Delete selected"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/index.phtml:143
-msgid "Keine Gutscheine in der Datenbank."
-msgstr "No voucher in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:12
-msgid "Gutscheinverwaltung - CSV Import"
-msgstr "Voucher management - CSV import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:16
-msgid "Bestehende Codes"
-msgstr "Existing codes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:16
-msgid "Ãberschreiben"
-msgstr "Overwrite"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:16
-msgid "Ignorieren"
-msgstr "Ignore"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:21
-msgid "CSV Quell Datei"
-msgstr "CSV source file"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/import.phtml:31
-msgid "ZurÃŒck zur Gutscheinverwaltung"
-msgstr "Back to voucher management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/basket_row_end.phtml:12
-#, fuzzy
-msgid "Gutscheincode:"
-msgstr "Voucher code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/basket_row_end.phtml:18
-msgid "EinlÃ¶sen"
-msgstr "redeem"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/settings_edit.phtml:8
-msgid "LÃ€nge der Gutscheincodes"
-msgstr "Length for voucher codes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_gutschein/settings_edit.phtml:9
-msgid "Gutscheine pro Seite (Backend)"
-msgstr "Voucher per page (backend)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/basket_row.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/renderTemplate.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/checkout_inner_prebutton.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:217
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:266
-msgid "Bitte wÃ€hlen"
-msgstr "Please select"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/produkt_addedit_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:24
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1614
-msgid "Produktvariablen"
-msgstr "Product variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/produkt_addedit_sidebar.phtml:20
-msgid "Bisher keine Produktvariablen angelegt."
-msgstr "No product variables created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/produkt_addedit_sidebar.phtml:26
-msgid "Zur Produktvariablenverwaltung"
-msgstr "To product variables management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/produkt_addedit_sidebar.phtml:30
-msgid "Zur Konfiguration der Produktvariablen"
-msgstr "To configure the product variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:15
-msgid "Pflicht"
-msgstr "Mandatory"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:49
-msgid "Produktvariable lÃ¶schen"
-msgstr "Delete product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/pv_list.phtml:142
-msgid "Bisher noch keine Produktvariablen angelegt."
-msgstr "No product variables created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/order_view_row.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:905
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:909
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:913
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:918
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:922
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:926
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:234
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:464
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:482
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:627
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:787
-msgid "Keine Angabe"
-msgstr "No statement"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/overview_row.phtml:19
-msgid "Nicht angegeben"
-msgstr "Not stated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/settings_edit.phtml:13
-#, fuzzy
-msgid "Globale Produktvarianten"
-msgstr "Product variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:62
-msgid "Neue Produktvariable anlegen"
-msgstr "Create new product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:62
-#, fuzzy
-msgid "Neue Produktvariable anlegen."
-msgstr "Create new product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:68
-#, fuzzy
-msgid "Produktvariable(n) im Produkttemplate abfragen"
-msgstr "Show directly in product template?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:69
-#, fuzzy
-msgid "Produktvariable(n) im Warenkorbtemplate darstellen"
-msgstr "Remove product from basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:70
-msgid "Produktvariable(n) im BestellÃŒbersichtstemplate darstellen"
-msgstr "Display product variable (s) in order overview template"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvars/settings_edit.phtml:71
-msgid "Produktvariable(n) im Mailtemplate darstellen"
-msgstr "Display product variable (s) in the mail template"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/order_index_tab.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/product_index_tab.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:78
-msgid "Export starten"
-msgstr "Start export"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:15
-msgid "Spaltenname"
-msgstr "Column name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:80
-msgid "Format"
-msgstr "Format"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:19
-msgid "Feld im XML als Attribut exportieren"
-msgstr "Export field in XML as attribute"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:19
-msgid "Att"
-msgstr "att"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:24
-#, fuzzy
-msgid "Neues Feld einfÃŒgen"
-msgstr "Add customer field"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/fields.phtml:72
-#, fuzzy
-msgid "Feld lÃ¶schen"
-msgstr "Delete country"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:15
-#, fuzzy
-msgid "Profiloptionen"
-msgstr "Profile name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:16
-#, fuzzy
-msgid "Feldkonfiguration"
-msgstr "Configuration"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:17
-msgid "Automatische AusfÃŒhrung"
-msgstr "Automatic execution"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:22
-msgid "Profilname"
-msgstr "Profile name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:23
-msgid "Dateiname"
-msgstr "Filename"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:24
-msgid "Encoding"
-msgstr "encoding"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:25
-#, fuzzy
-msgid "Dateiformat"
-msgstr "Unknown file format"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:55
-#, fuzzy
-msgid "Muster Vorlage"
-msgstr "Example template (csv file)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:62
-#, fuzzy
-msgid "Bestellungen nur einmalig exportieren"
-msgstr "Review order(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:13
-msgid "Optionen"
-msgstr "options"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:65
-msgid "Eine Zeile pro Bestellung"
-msgstr "One line per order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:72
-#, fuzzy
-msgid "Spaltennamen in erster Zeile"
-msgstr "Column names in first column"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:86
-msgid "Automatische AusfÃŒhrung aktivieren"
-msgstr "activ automatic execution"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:90
-#, fuzzy
-msgid "Pfad"
-msgstr "Paths"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:91
-#, fuzzy
-msgid "Letzte AusfÃŒhrung"
-msgstr "Compressed delivery"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:91
-#, fuzzy
-msgid "Noch nie"
-msgstr "Not scheduled"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:92
-msgid "Cron Pfad"
-msgstr "cron path"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:93
-#, fuzzy
-msgid "Cron URL"
-msgstr "Logo url"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:98
-#, fuzzy
-msgid "Bestellfilter"
-msgstr "Order value"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:191
-#, fuzzy
-msgid "Produktfilter"
-msgstr "Product pictures"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:197
-#, fuzzy
-msgid "Alle Produktgruppen"
-msgstr "Product groups"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:212
-#, fuzzy
-msgid "Kundenfilter"
-msgstr "Customer data"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:232
-msgid "Profil lÃ¶schen"
-msgstr "Delete profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profil.phtml:233
-#, fuzzy
-msgid "Profil speichern"
-msgstr "Save product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profillist.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:301
-msgid "Bestellexport"
-msgstr "Order export"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profillist.phtml:15
-#, fuzzy
-msgid "Produktexport"
-msgstr "Import product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profillist.phtml:16
-#, fuzzy
-msgid "Kundenexport"
-msgstr "Customer import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profillist.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:86
-msgid "Exportprofile"
-msgstr "Export profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/profillist.phtml:26
-msgid "Bisher noch keine Profile angelegt."
-msgstr "No profiles saved yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:54
-#, fuzzy
-msgid "Sind Sie sich sicher, dass das Feld gelÃ¶scht werden soll?"
-msgstr "Are you sure you want to delete this product?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:82
-msgid "Sind sie sich sicher?"
-msgstr "Are you sure?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:150
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:151
-msgid "Neuens Exportprofil anlegen"
-msgstr "Create new export profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:149
-#, fuzzy
-msgid "Neues Exportprofil fÃŒr Bestellungen anlegen"
-msgstr "Create new export profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:150
-#, fuzzy
-msgid "Neues Exportprofil fÃŒr Produkte anlegen"
-msgstr "Create new export profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:151
-#, fuzzy
-msgid "Neues Exportprofil fÃŒr Kunden anlegen"
-msgstr "Create new export profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:160
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:165
-#, fuzzy
-msgid "Profil importieren"
-msgstr "Import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_export/settings_edit.phtml:163
-#, fuzzy
-msgid "JSON Profildatei"
-msgstr "Profile name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:9
-#, fuzzy
-msgid "Seite mit Produktfilter"
-msgstr "Use page as product page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:10
-#, fuzzy
-msgid "Auf anderen Seiten anzeigen"
-msgstr "Show on product view pages"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:22
-msgid ""
-"Noch keine Produktattribute hinterlegt. Definieren Sie in der <a href=\"#1#"
-"\">Verwaltung der Produktattribute</a> Ihre Produktattribute."
-msgstr ""
-"No product attributes yet. Define your product attributes in the <a href="
-"\"#1#\"> Product Attributes Management </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:38
-#, fuzzy
-msgid "Preisfilter"
-msgstr "Price \\ tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:41
-#, fuzzy
-msgid "Preisgruppen"
-msgstr "Product groups"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:41
-msgid "Preisgruppenformat: 1-100|101-200|>200"
-msgstr "Price group format: 1-100 | 101-200 |> 200"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:52
-msgid "Varianten"
-msgstr "Variants"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productfilter/settings_edit.phtml:56
-msgid ""
-"Noch keine Varianten hinterlegt. Definieren Sie in der <a href=\"#1#"
-"\">Variantenverwaltung</a> Ihre Varianten."
-msgstr ""
-"No variants yet. Define your variants in <a href=\"#1#\"> variant management "
-"</a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:9
-msgid "Bisher keine Zahlvarianten angelegt."
-msgstr "No payment variant created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/list.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:148
-msgid "Steuersatz"
-msgstr "Tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/settings_edit.phtml:48
-msgid "Sind Sie sich sicher, dass sie die Zahlvariante lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this payment method?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_userpayment/settings_edit.phtml:81
-msgid ""
-"Um eine Zahlvariante zu bearbeiten klicken Sie einfach auf den Namen oder "
-"den Rabattwert."
-msgstr "To edit a payment method click on the name or the discount value."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:10
-msgid "Aktiv ab Betrag"
-msgstr "Active from amount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:11
-msgid "Aktiv bis Betrag"
-msgstr "Active to amount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:14
-#, fuzzy
-msgid "HÃ€ndler ID (Merchant ID)"
-msgstr "Merchant id (Vendor/Merchant ID)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:15
-#, fuzzy
-msgid "Geheimnis"
-msgstr "Secret password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:18
-msgid "Sandboxmodus"
-msgstr "Sand box mode"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_klarna/settings_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:131
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout2.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout2.phtml:75
-msgid "GebÃŒhr"
-msgstr "Charge"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/basket_row.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_row_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view_row.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_row.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/overview_row.phtml:11
-msgid "Abo VerlÃ€ngerung"
-msgstr "Subscription extension"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/basket_row.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_row_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_row.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/overview_row.phtml:14
-msgid "VerlÃ€ngerung zu Bestellung #1# (#2# Tage)"
-msgstr "Extension to order # 1 # (# 2 # days)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno_html.phtml:12
-msgid "die Stornierung fÃŒr Ihr Abo von Produkt \"#1#\" wurde aufgehoben."
-msgstr ""
-"The cancellation for your subscription to product \"# 1 #\" has been "
-"canceled."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno.phtml:12
-msgid "Ihr Abo von Produkt \"#1#\" wurde zum \"#2#\" storniert."
-msgstr "Your subscription to product \"# 1 #\" has been canceled as \"# 2 #\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy.php:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy_html.php:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno_html.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate_html.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:17
-msgid "Viele GrÃŒÃe"
-msgstr "Best regards"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autoinformation.phtml:9
-msgid ""
-"Ihr Abonnement von Produkt \"#1#\" wird in #2# Tagen automatisch verlÃ€ngert."
-msgstr ""
-"Your subscription to product \"# 1 #\" will automatically renew in # 2 # "
-"days."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:9
-#, fuzzy
-msgid "ihr Abo ist ausgelaufen."
-msgstr "Expired"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:12
-msgid ""
-"Sie kÃ¶nnen das Abo jederzeit ÃŒber folgenden Link um #1# Tage verlÃ€ngern. Die "
-"VerlÃ€ngerung kostet #2#."
-msgstr ""
-"You can extend the subscription at any time by # 1 # days via the following "
-"link. The extension costs # 2 #."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:15
-msgid "Abo verlÃ€ngern"
-msgstr "Extend subscription"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:17
-msgid ""
-"Sie kÃ¶nnen das Abo dabei noch maximal #1# mal verlÃ€ngern, dann muss das "
-"Produkt erneut erworben werden."
-msgstr ""
-"You can extend the subscription for a maximum of # 1 # times, then the "
-"product must be purchased again."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_expiration.phtml:20
-msgid ""
-"Die VerlÃ€ngerung des Abos ist nicht mehr mÃ¶glich, sie mÃŒssen das Produkt "
-"erneut erwerben."
-msgstr ""
-"Renewal of the subscription is no longer possible, you must purchase the "
-"product again."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:20
-#, fuzzy
-msgid "AboÃŒbersicht"
-msgstr "Product views"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:37
-#, fuzzy
-msgid "Abostatus"
-msgstr "Status"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:58
-msgid "Abo abgeschlossen am (Monat/Jahr)"
-msgstr "Subscription completed on (month / year)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:79
-msgid "Abo gekÃŒndigt am (Monat/Jahr)"
-msgstr "Subscription canceled on (month / year)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:83
-#, fuzzy
-msgid "Abonnement suchen"
-msgstr "Search customers"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:121
-msgid "Abonnement"
-msgstr "Subscription"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:123
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1538
-msgid "Laufzeit"
-msgstr "runtime"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:139
-#, fuzzy
-msgid "Dieses Abonnement ansehen"
-msgstr "Display this order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:142
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie dieses Abonnement kÃŒndigen mÃ¶chten?"
-msgstr "Are you sure you want to cancel this order?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:142
-msgid "Dieses Abonnement kÃŒndigen"
-msgstr "cancel this abo"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:142
-msgid "KÃŒndigen"
-msgstr "cancel"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:145
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie dieses Abonnement lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this order?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:145
-#, fuzzy
-msgid "Dieses Abonnement lÃ¶schen"
-msgstr "Delete this customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:256
-#, fuzzy
-msgid "Abonnement(s) lÃ¶schen"
-msgstr "Delete assignment "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/index.phtml:272
-#, fuzzy
-msgid "Keine Abonnements in der Datenbank."
-msgstr "No customers in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:38
-#, fuzzy
-msgid "Abo Produkt"
-msgstr "From product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:42
-msgid "Anzahl der Abo-VerlÃ€ngerungen beschrÃ€nken"
-msgstr "Limit number of subscription renewals"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:46
-msgid "max. Abo-VerlÃ€ngerungen"
-msgstr "Max. Subscription renewals"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:50
-msgid "Abo Preis (#1#)"
-msgstr "Subscription price (# 1 #)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:970
-msgid "Abo Dauer (Tage)"
-msgstr "Subscription Duration (days)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:52
-msgid ""
-"nohspc_Wird hier nichts angegeben, so wird die URL aus der <a href=\"#1#"
-"\">Modulkonfiguration</a> bei Ablauf/VerlÃ€ngerung benachrichtigt."
-msgstr ""
-"nohspc_If nothing is specified here, the URL from the <a href=\"#1#\"> "
-"module configuration </a> will be notified upon expiration / renewal."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:59
-msgid "Mehrfachbestellung mÃ¶glich"
-msgstr "Multiple orders possible"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/produkt_addedit_content.phtml:77
-msgid "Zur Konfiguration des Abo-Moduls"
-msgstr "To configure the subscription module"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:9
-#, fuzzy
-msgid "ihr Abo wurde erfolgreich verlÃ€ngert."
-msgstr "Password has been changed successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_rebuy.phtml:20
-msgid ""
-"Eine VerlÃ€ngerung des Abos ist zukÃŒnftig nicht mehr mÃ¶glich, sie mÃŒssen das "
-"Produkt erneut erwerben."
-msgstr ""
-"An extension of the subscription is no longer possible in the future, they "
-"must purchase the product again."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:45
-#, fuzzy
-msgid "Preis (#1# Tage):"
-msgstr "Price (clear)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:77
-msgid "Deaktivieren"
-msgstr "Deactivate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:60
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:75
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1232
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:160
-#, fuzzy
-msgid "Inaktiv"
-msgstr "Active"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:32
-msgid "Aktivieren"
-msgstr "Activate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view.phtml:36
-#, fuzzy
-msgid "VerlÃ€ngerung"
-msgstr "Stop subscription extension directly"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view_row.phtml:11
-msgid "VerlÃ€ngerung zu Bestellung <a href=\"#1#\">#2#</a> (#3# Tage)"
-msgstr "Renewal to order <a href=\"#1#\"> # 2 # </a> (# 3 # days)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/admin_setcapabilities.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:287
-#, fuzzy
-msgid "Aboverwaltung"
-msgstr "Domain management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy.php:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_autobuy_html.php:9
-msgid "Ihr Abonnement von Produkt \"#1#\" wurde automatisch verlÃ€ngert."
-msgstr "Your subscription to product \"# 1 #\" has been automatically renewed."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:9
-#, fuzzy
-msgid "ihr Abo wurde erfolgreich aktiviert."
-msgstr "Variation has been activated."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:11
-msgid ""
-"Sie kÃ¶nnen das Abo jederzeit ÃŒber folgenden Link um #1# Tage verlÃ€ngern."
-msgstr ""
-"You can extend the subscription at any time by # 1 # days via the following "
-"link."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:15
-#, fuzzy
-msgid "Die VerlÃ€ngerung kostet #1#."
-msgstr "Stop subscription extension directly"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy_html.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_firstbuy.phtml:18
-msgid ""
-"Sie kÃ¶nnen das Abo dabei maximal #1# mal verlÃ€ngern, dann muss das Produkt "
-"erneut erworben werden."
-msgstr ""
-"You can extend the subscription a maximum of # 1 # times, then the product "
-"must be purchased again."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:23
-#, fuzzy
-msgid "Abo \"#1#\" aus Bestellung #2#"
-msgstr "#1# order(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:37
-msgid "Erstkauf (Startzeitpunkt):"
-msgstr "Initial purchase (start time):"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:49
-msgid "Laufzeit (Endzeitpunkt):"
-msgstr "Duration (end time):"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:63
-#, fuzzy
-msgid "VerlÃ€ngerung:"
-msgstr "Stop subscription extension directly"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:72
-msgid "KÃŒndigung ausstehend"
-msgstr "Termination pending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/page_abo.phtml:101
-#, fuzzy
-msgid "Bisher kein(e) Abonnement(s) vorhanden."
-msgstr "No file uploaded yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal.phtml:9
-msgid "Der Kunde \"#1#\" mÃ¶chte sein Abo fÃŒr Produkte \"#2#\" anhalten."
-msgstr ""
-"The customer \"# 1 #\" wants to stop his subscription to products \"# 2 #\"."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal.phtml:11
-msgid "Link zur Ausgangsbestellung: <a href=\"#1#\">#1#</a>"
-msgstr "Link to the initial order: <a href=\"#1#\"> # 1 # </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal.phtml:12
-msgid "Direkt stoppen und zur Bestellung: <a href=\"#1#\">#1#</a>"
-msgstr "Directly stop and order: <a href=\"#1#\"> # 1 # </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_admin_stoprenewal.phtml:14
-msgid "Dies ist eine automatisch generierte Mail."
-msgstr "This is an automatically generated mail."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view_base.phtml:8
-#, fuzzy
-msgid "Abo VerlÃ€ngerungen"
-msgstr "Stop subscription extension directly"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view_base.phtml:12
-msgid "Mit Bestellung <a href=\"#1#\">#2#</a> um #3# Tage verlÃ€ngert."
-msgstr "With order <a href=\"#1#\"> # 2 # </a> extended by # 3 # days."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/order_view_base.phtml:15
-msgid "Noch keine Abo VerlÃ€ngerungen erworben."
-msgstr "No subscription renewals purchased yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:11
-#, fuzzy
-msgid "Standard URL fÃŒr Ablauf/VerlÃ€ngerung"
-msgstr "Payment method for automatic renewal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:13
-msgid "Mail bei erstem Kauf eines Abos"
-msgstr "Mail on the first purchase of a subscription"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:13
-msgid ""
-"Mail wird bei Bezahlung der Abo Bestellung zusÃ€tzlich versendet. "
-"(mail_firstbuy.phtml) -> <a href=\"#1#\">Konfiguration</a>"
-msgstr ""
-"Mail will also be sent when you pay for the subscription. (mail_firstbuy."
-"phtml) -> <a href=\"#1#\"> Configuration </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:14
-msgid "Mail bei Kauf einer VerlÃ€ngerung"
-msgstr "Mail when buying an extension"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:14
-msgid ""
-"Mail wird bei Bezahlung einer Abo VerlÃ€ngerung versendet. (mail_rebuy.phtml) "
-"-> <a href=\"#1#\">Konfiguration</a>"
-msgstr ""
-"Mail will be sent when you pay for a subscription extension. (mail_rebuy."
-"phtml) -> <a href=\"#1#\"> Configuration </a>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:8
-msgid "Kunden pro Seite (Backend)"
-msgstr "Customers per page (back end)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:22
-msgid "Nach Ablauf des Abos"
-msgstr "After expiration of the subscription"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:23
-#, fuzzy
-msgid "Mail versenden"
-msgstr "Send Opt-In email"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:24
-#, fuzzy
-msgid "Automatisch verlÃ€ngern"
-msgstr "Payment method for automatic renewal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:29
-#, fuzzy
-msgid "Mail bei Auslauf eines Abos"
-msgstr "After expiration of the subscription"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:29
-msgid ""
-"nohspc_Mail wird bei Auslauf eines Abos versendet. (mail_expiration.phtml) -"
-"> <a href=\"#1#\">Konfiguration</a>"
-msgstr ""
-"nohspc_Mail will be sent when an subscription expires. (mail_expiration."
-"phtml) -> <a href=\"#1#\"> Configuration </a>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:36
-msgid "Zahlungsart fÃŒr automatische VerlÃ€ngerung"
-msgstr "Payment method for automatic renewal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:38
-msgid "Mail an Kunden"
-msgstr "Mail to customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:39
-#, fuzzy
-msgid "Mail an Administrator"
-msgstr "Mail to Admin"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:41
-#, fuzzy
-msgid "Mail vor automatischer VerlÃ€ngerung versenden"
-msgstr "Payment method for automatic renewal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:41
-msgid ""
-"Mail wird X-Tage vor einer automatischen VerlÃ€ngerung versendet. "
-"(mail_autoinformation.phtml) -> <a href=\"#1#\">Konfiguration</a>"
-msgstr ""
-"Mail will be sent X days before automatic renewal. (mail_autoinformation."
-"phtml) -> <a href=\"#1#\"> Configuration </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:43
-msgid "Zeitspanne zum Versenden der Informationsmail in Tagen"
-msgstr "Time span for sending the informational mail in days"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:47
-msgid "Kunde kann im Frontend"
-msgstr "Customer Action at Frontend"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:48
-msgid "Nichts"
-msgstr "Nothing"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:49
-msgid "VerlÃ€ngerung direkt stoppen"
-msgstr "Stop subscription extension directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/settings_edit.phtml:50
-msgid "VerlÃ€ngerung ÃŒber Mail an Administrator stoppen"
-msgstr "Stop subscription extension via Mail to Administrator"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_abo/mail_storno_html.phtml:14
-msgid "Ihr Abo von Produkt \"#1#\" wurde zum #2# storniert."
-msgstr "their subscription of product \"# 1 #\" has been canceled for # 2 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minquantity/produkt_edit_allgemein.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:20
-#, fuzzy
-msgid "Mindestbestellmenge"
-msgstr "Minimum order value"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minquantity/produkt_edit_allgemein.phtml:9
-msgid "Maximalbestellmenge"
-msgstr "Maximum order quantity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:83
-#, fuzzy
-msgid "Integrationsmodus"
-msgstr "AWeber Integration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:9
-#, fuzzy
-msgid "Sender ID"
-msgstr "Merchant id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:10
-msgid "Channel ID"
-msgstr "Channel ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:11
-msgid "UserID"
-msgstr "User ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/login.phtml:25
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:210
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:324
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:115
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_login.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:12
-msgid "Passwort"
-msgstr "Password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:16
-#, fuzzy
-msgid "Zahlungsart aktiv"
-msgstr "Payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:114
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout2.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:24
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:45
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:54
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:45
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_userpayment.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_prepayment.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:31
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:33
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:30
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:32
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_targo.class.php:28
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_debitpayment.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:44
-msgid "Zahlungsarten"
-msgstr "Payment methods"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:62
-msgid "STRG fÃŒr Mehrfachauswahl"
-msgstr "CTRL for multiple selection"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customerbudget/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:59
-#, fuzzy
-msgid "Bezeichnung der Zahlungsart"
-msgstr "Description of payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:61
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:89
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:128
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:174
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:50
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:61
-msgid "Alternative Logo URL"
-msgstr "Alternative logo URL"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:62
-msgid "Sprache"
-msgstr "Language"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:64
-msgid "Deutsch"
-msgstr "German"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:65
-msgid "Englisch"
-msgstr "English"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:72
-#, fuzzy
-msgid "Seite nach erfolgreicher Zahlung"
-msgstr "Successful payment using Skrill"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/settings_edit.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:73
-#, fuzzy
-msgid "Seite nach fehlgeschlagener Zahlung"
-msgstr "Failed payment using Skrill"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/order_done.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/order_done.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/order_done.phtml:11
-#, fuzzy
-msgid "Sie bezahlen Ihre Bestellung mit der Nummer #1# in HÃ¶he von #2#."
-msgstr ""
-"The status of your order with the id #1# has changed from \"#2#\" to \"#3#\"."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_flexipay/order_done.phtml:16
-msgid ""
-"FlexiPay Zahlung konnte nicht gestartet werden, wenden Sie sich an den "
-"Betreiber des Shops."
-msgstr "FlexiPay payment could not be started, contact the shop owner."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/order_view.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:1
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:17
-msgid "AuftragsbestÃ€tigung"
-msgstr "Order confirmation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/order_view.phtml:36
-msgid ""
-"Die AuftragsbestÃ€tigung bestÃ€tigt dem Kunden die erfolgreiche Erfassung des "
-"Auftrages. Abweichungen vom Auftrag kÃ¶nnen mittels des Textfeldes "
-"mitgesendet werden."
-msgstr ""
-"The order confirmation confirms the customer the successful recognition of "
-"the order. Variations of the order can be submitted using the text field."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/order_view.phtml:37
-msgid "Der Status Ã€ndert sich automatisch auf \"BestÃ€tigt\"."
-msgstr "The status changes automatically to \"Confirmed\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/order_view.phtml:46
-msgid "Senden"
-msgstr "Send"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:3
-msgid ""
-"Vielen Dank fÃŒr Ihre Bestellung. Sie erhalten hiermit die "
-"AuftragsbestÃ€tigung mit allen wichtigen Informationen zu Ihrer Bestellung."
-msgstr ""
-"Thank you for your order. This is the order confirmation with all important "
-"information to your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:64
-msgid "Kommentar AuftragsbestÃ€tigung"
-msgstr "Comment order confirmation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:122
-msgid "darin enthaltenes MwSt. (#1#)"
-msgstr "included sales tax (#1#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/settings_edit.phtml:75
-msgid ""
-"Die verfÃŒgbaren Zahlungsarten mÃŒssen mit <a href=\"http://www."
-"kreditkartenanbieter-fuer-onlineshop.de/\">ICP Onlinepayments</a> vereinbart "
-"werden."
-msgstr ""
-"The available payment methods must be agreed with <a href=\"http://www."
-"kreditkartenanbieter-fuer-onlineshop.de/\"> ICP Onlinepayments </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_icp/order_done.phtml:16
-#, fuzzy
-msgid ""
-"ICP Zahlung konnte nicht gestartet werden, wenden Sie sich an den Betreiber "
-"des Shops."
-msgstr ""
-"Unfortunately your payment could not be handled using Billsafe. Please "
-"contact the shop support team to arrange an alternative payment way."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail_html.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/gutschein_mail.phtml:16
-#, fuzzy
-msgid "hiermit erhalten Sie Ihren gekauften Gutschein."
-msgstr "hereby you get a copy of your credit voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:18
-#, fuzzy
-msgid "Kein Dokument generieren"
-msgstr "Generate HTML code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:22
-msgid "Beachten Sie das keine Produktspezifischen Platzhalter ersetzt werden!"
-msgstr "Please note that no product-specific placeholders are replaced!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml:16
-#, fuzzy
-msgid "Gutschein generieren"
-msgstr "Create voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:109
-#, fuzzy
-msgid "Bitte einen Wert angeben!"
-msgstr "Please enter a text!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:169
-msgid ""
-"Die Gutscheine werden per Mail an den Kunden gesendet, sind Sie sich sicher?"
-msgstr "The vouchers are sent by mail to the customer, are you sure?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar.phtml:190
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:120
-msgid "Gutscheine"
-msgstr "Vouchers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml:28
-#, fuzzy
-msgid "Gutscheine versenden"
-msgstr "Search voucher"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml:30
-msgid "Noch keine Gutscheine fÃŒr diese Bestellung generiert."
-msgstr "No vouchers generated for this order yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml:32
-msgid ""
-"Gutscheine aus Gutscheinprodukten werden beim Wechsel auf \"Zahlung "
-"aktzeptiert\" generiert."
-msgstr ""
-"Vouchers from voucher products are generated when switching to \"Payment "
-"accepted\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml:11
-#, fuzzy
-msgid "Gutscheinprodukt"
-msgstr "Voucher code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml:18
-#, fuzzy
-msgid "LÃ€nge des Gutscheincodes"
-msgstr "Length for voucher codes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml:20
-#, fuzzy
-msgid "GÃŒltigkeit (Tage)"
-msgstr "Due date in days"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml:24
-msgid "Zur Konfiguration des Gutscheinproduktes"
-msgstr "To configure the coupon product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:9
-msgid ""
-"Bitte aktivieren Sie das Gutscheinmodul, damit dieses Modul korrekt "
-"funktioniert!"
-msgstr "Please activate the voucher module for this module to work properly!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:12
-#, fuzzy
-msgid "Textfelder"
-msgstr "Text field"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:40
-msgid "Breite des PDFs in mm"
-msgstr "width of the PDF in mm"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:41
-msgid "HÃ¶he des PDFs in mm"
-msgstr "Height of the PDF in mm"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:60
-msgid "Kann <a href=\"#1#\">hier</a> konfiguriert werden."
-msgstr "Can be configured <a href=\"#1#\"> here </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:47
-#, fuzzy
-msgid "Gutscheinmail an Kunden"
-msgstr "Mail to customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:79
-msgid "Hintergrund"
-msgstr "background"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:81
-msgid "Deckkraft"
-msgstr "opacity"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:82
-msgid "Winkel"
-msgstr "corner"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_voucherproduct/settings_edit.phtml:137
-msgid "Speichern und Vorschau anzeigen"
-msgstr "Save and preview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/order_view_sidebar.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:30
-msgid "Billsafe"
-msgstr "Billsafe"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/order_view_sidebar.phtml:15
-msgid "Transaction ID"
-msgstr "Transaction ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/order_view_sidebar.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1550
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:904
-msgid "Rechnung"
-msgstr "Invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/zahlung_erfolg.phtml:10
-msgid ""
-"Ihre Zahlung wurde erfolgreich angenommen und sie werden ihre Bestellung in "
-"den nÃ€chsten Tagen erhalten."
-msgstr ""
-"Your payment has been accepted and you will receive your order in the "
-"following days."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/zahlung_ablehnung.phtml:10
-msgid ""
-"Ihre Zahlung konnte leider nicht mittels Billsafe abgewickelt werden, bitte "
-"wenden Sie sich an den Shop Betreiber um eine alternative Zahlungsart zu "
-"vereinbaren."
-msgstr ""
-"Unfortunately your payment could not be handled using Billsafe. Please "
-"contact the shop support team to arrange an alternative payment way."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:11
-msgid "Logo URL"
-msgstr "Logo url"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:15
-msgid "HÃ€ndler ID (Vendor/Merchant ID)"
-msgstr "Merchant id (Vendor/Merchant ID)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:19
-msgid "Lizenz (Sandbox)"
-msgstr "Licence (sand box)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:21
-msgid "MÃŒssen mit dem Billsafe Support abgestimmt werden."
-msgstr "Must be coordinated with the Billsafe Support."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:25
-msgid "EUR"
-msgstr "EUR"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:25
-msgid "Derzeit nur EUR."
-msgstr "Currently only EUR."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:27
-msgid "VorabprÃŒfung"
-msgstr "Pre check"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:28
-msgid ""
-"Diese Seite wird nach erfolgreicher Abwicklung innerhalb des Billsafe "
-"Gateways aufgerufen und zeigt dem Nutzer das Ergebnis an."
-msgstr ""
-"This page is called after successful handling within the Billsafe gate ways "
-"and shows the user the result."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/settings_edit.phtml:29
-msgid ""
-"Diese Seite wird angezeigt wenn es technische Probleme gibt oder der Kunde "
-"die Billsafe Zahlung abbricht."
-msgstr ""
-"This site is shown when there are technical problems or the customer aborts "
-"the Billsafe payment."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_billsafe/order_done.phtml:8
-msgid ""
-"Um den Betrag mit Billsafe zu bezahlen klicken Sie bitte auf folgendes Logo."
-msgstr "To pay using the service Billsafe please click on the following logo."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/basket_row.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/mail_row_html.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/order_view_row.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/overview_row.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:49
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:168
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:36
-msgid "Variante"
-msgstr "Variant"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/produkt.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/produkt.phtml:113
-msgid "(Preise nur fÃŒr eingeloggte Benutzer)"
-msgstr "(Prices only for logged in users)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:17
-#, fuzzy
-msgid "Neue Produktvariante anlegen"
-msgstr "Create new product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:28
-#, fuzzy
-msgid "Produktvariation bearbeiten"
-msgstr "Edit product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:35
-msgid "Neue Variation"
-msgstr "New variation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:48
-#, fuzzy
-msgid "Sind Sie sich sicher, dass Sie die Variante lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this variation?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_html.phtml:79
-msgid "Sind Sie sich sicher, dass Sie die Variation lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this variation?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/produkt_addedit_content.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:33
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:164
-#, fuzzy
-msgid "Produktvarianten"
-msgstr "Product variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/produkt_addedit_content.phtml:27
-#, fuzzy
-msgid "Bitte speichern Sie das Produkt zuerst."
-msgstr "Please activate the field #1#."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/produkt_addedit_content.phtml:31
-msgid "Zur Konfiguration der Produktvarianten"
-msgstr "For configuration of the product variants"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_spconditions/conditionList.phtml:12
-msgid "Id"
-msgstr "id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:19
-#, fuzzy
-msgid "Variationen"
-msgstr "Variants"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:35
-#, fuzzy
-msgid "(Produktbezogen)"
-msgstr "Products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:74
-#, fuzzy
-msgid "Variante bearbeiten"
-msgstr "Edit profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:77
-#, fuzzy
-msgid "Variante lÃ¶schen"
-msgstr "Delete payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:340
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:58
-msgid "Reihenfolge kann mittels Drag&Drop verÃ€ndert werden."
-msgstr "Order can be changed using drag & drop."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_show.phtml:114
-#, fuzzy
-msgid "Bisher keine Produktvarianten angelegt."
-msgstr "No product variables created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/mail_row.phtml:7
-msgid "Variante:"
-msgstr "Variant:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:23
-#, fuzzy
-msgid "Kurzname"
-msgstr "name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:32
-#, fuzzy
-msgid "Minimallagerbestand"
-msgstr "Stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_fuellmenge.class.php:196
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1488
-msgid "FÃŒllmenge"
-msgstr "Filling quantity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:176
-#, fuzzy
-msgid "Variation lÃ¶schen"
-msgstr "Delete file"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/admin_edit.phtml:345
-#, fuzzy
-msgid "Bisher keine Variationen der Variante angelegt."
-msgstr "No shipping methods created yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/settings_edit.phtml:22
-msgid "Preis der Variation direkt anzeigen"
-msgstr "Show price of variation directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/settings_edit.phtml:23
-msgid "Erweiterte Variantenanzeige aktivieren"
-msgstr "Enable extended show for variants"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/settings_edit.phtml:24
-msgid "Produktartikelnummer ersetzen"
-msgstr "Replace product item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productvariants/settings_edit.phtml:24
-msgid ""
-"Ersetzt die Produktartikelnummer durch die zusammengesetzte Artikelnummern "
-"der Varianten."
-msgstr ""
-"Replaces the product item number with the combined item number of the "
-"variants."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:48
-msgid "Sind Sie sicher, das Sie diese Datei lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this file?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:73
-msgid "Downloadprodukt"
-msgstr "Downloadable product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:82
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:89
-msgid "Upload"
-msgstr "Upload"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:95
-msgid "FTP Pfad"
-msgstr "FTP path"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml:100
-msgid "Zur Konfiguration des Downloadproduktes"
-msgstr "To configure the download product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_edit_list.phtml:15
-msgid "Datei lÃ¶schen"
-msgstr "Delete file"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/produkt_edit_list.phtml:21
-msgid "Bisher keine Dateien hochgeladen."
-msgstr "No file uploaded yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:5
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:11
-msgid "Ihre Bezahlung zu der Bestellung"
-msgstr "your payment for the order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:5
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:11
-msgid "ist bei uns eingegangen."
-msgstr "has been transfered."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:13
-msgid ""
-"Die Produkte, die als Download vorliegen, wurden fÃŒr Sie freigeschaltet."
-msgstr "The downloadable products are activated for you."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:17
-msgid "Sie haben fÃŒr"
-msgstr "You have"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:17
-msgid "Tage die MÃ¶glichkeit die Dateien herunterzuladen."
-msgstr "days time to download your file(s)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:19
-msgid "Sie kÃ¶nnen die Datei %1% mal herunterladen"
-msgstr "You can download every file %1% times."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/order_view_row.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:9
-msgid "Downloads"
-msgstr "Downloads"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:9
-msgid "ZÃ€hltyp"
-msgstr "Count method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:17
-msgid "Tage"
-msgstr "Days"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:10
-msgid "Tage/Downloads gÃŒltig"
-msgstr "Days\\downloads valid"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:14
-msgid "Meldung wenn kein Download mehr mÃ¶glich ist"
-msgstr "Message when no download is left"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:18
-msgid "Gezippte Auslieferung"
-msgstr "Compressed delivery"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:22
-msgid "Verzeichnis fÃŒr temporÃ€res Archiv (Standard /tmp)"
-msgstr "Directory for temporary archive (default /tmp)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:26
-msgid "Mehr als ein Produkt im Warenkorb zulassen"
-msgstr "Allow more than one product in basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadprodukte/settings_edit.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:23
-#, fuzzy
-msgid "Versandart \"Versand per Mail\" aktiv"
-msgstr "Dispatch via mail"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnoverperhour/data.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/data.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/data.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:452
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:470
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:471
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:472
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:493
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:508
-#, fuzzy
-msgid "Umsatz in"
-msgstr "Revenue"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml:18
-#, fuzzy
-msgid "Prozent"
-msgstr "Percentaged"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml:8
-#, fuzzy
-msgid "Anteile (prozentual)"
-msgstr "Percentaged"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnoverperhour/all.phtml:122
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/all.phtml:178
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/year.phtml:127
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/all.phtml:123
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/quarter.phtml:121
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/week.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/day.phtml:128
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/month.phtml:118
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/customrange.phtml:111
-#, fuzzy
-msgid "Keine Daten zur Auswertung vorhanden."
-msgstr "No data available for export."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:23
-msgid ""
-"Um das Bild auf Ihrer Festplatte zu speichern, klicken Sie mit der rechten "
-"Maustaste auf das Bild und wÃ€hlen Sie \"Bild speichern unter...\""
-msgstr ""
-"To save the image to your hard disk, right-click on the image and select "
-"\"Save image as ...\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:82
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/admin_setcapabilities.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:37
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:354
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:654
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:988
-msgid "Statistik"
-msgstr "Statistic"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statistics.phtml:134
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:801
-msgid "UngÃŒltige Anfrage"
-msgstr "Invalid request"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:43
-#, fuzzy
-msgid "Keine Daten"
-msgstr "No statement"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:47
-#, fuzzy
-msgid "Verkaufte Produkte:"
-msgstr "New product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:51
-#, fuzzy
-msgid "Bestell-ID"
-msgstr "OrderID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:86
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:38
-#, fuzzy
-msgid "StÃŒck"
-msgstr "Item price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/statisticProduct.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:55
-#, fuzzy
-msgid "e-Mail"
-msgstr "Email"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/simplefilter.phtml:14
-msgid "im Vergleich zu"
-msgstr "compared to"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/simplefilter.phtml:14
-#, fuzzy
-msgid "-- Bitte wÃ€hlen ---"
-msgstr "Please select"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/simplefilter.phtml:60
-msgid "von"
-msgstr "from"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/simplefilter.phtml:61
-msgid "bis"
-msgstr "to"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnoverperhour/data.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnoverperhour/all.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/day.phtml:104
-msgid "Uhrzeit"
-msgstr "time"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnoverperhour/data.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/data.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:139
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:196
-msgid "Bestellungen"
-msgstr "Orders"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/data.phtml:18
-#, fuzzy
-msgid "Prozent (Umsatz)"
-msgstr "Percentaged"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/data.phtml:30
-msgid "Prozent (Menge)"
-msgstr "Percent (amount)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/all.phtml:7
-#, fuzzy
-msgid "Umsatz (prozentual)"
-msgstr "Percentaged"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/charttopsellertosales/all.phtml:11
-#, fuzzy
-msgid "Menge (prozentual)"
-msgstr "Percentaged"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/produkt_edit_sidebar.phtml:36
-#, fuzzy
-msgid "CSV-Export"
-msgstr "CSV export"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:5
-#, fuzzy
-msgid "Auswertung Bestellstatus"
-msgstr "Order status"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:6
-msgid "Piwik"
-msgstr "piwik"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:7
-msgid "Google"
-msgstr "google"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:21
-msgid ""
-"Bitte wÃ€hlen Sie die ZustÃ€nde aus unter welchen die Bestellung eines "
-"Produktes als abgeschlossen GÃŒltigkeit besitzt."
-msgstr ""
-"Please select the conditions under which the order of a product is valid."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:33
-msgid "Google API-Key"
-msgstr "Google api key"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:36
-msgid "SchlÃŒssel ÃŒber Ihr Googlekonto anfordern"
-msgstr "Request a key through your Google Account"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:48
-#, fuzzy
-msgid "ErmÃ¶glicht die Integration des Trackintools \"Piwik\"."
-msgstr "Allows the shipping method \"free shipping\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:52
-#, fuzzy
-msgid "URL zur Piwik Installation"
-msgstr "about this installation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:52
-msgid "Ohne Protokoll, Beispiel: piwik.domain.de"
-msgstr "Without protocol, example: piwik.domain.de"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:54
-msgid "Allgemeine Protokollierung"
-msgstr "General logging"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:55
-msgid "Piwik Seiten ID"
-msgstr "piwik page id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:56
-msgid "KÃ€ufe (eCommerce) tracken"
-msgstr "customer (eCommerce) tracken"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:58
-#, fuzzy
-msgid "Warenkorb tracken"
-msgstr "Basket page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:71
-msgid "Ziel ID"
-msgstr "end id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:61
-msgid "Checkout tracken"
-msgstr "Checkout tracken"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:64
-msgid "Checkout2 tracken"
-msgstr "Checkout2 tracken"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:67
-msgid "Overview tracken"
-msgstr "Overview tracken"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:70
-#, fuzzy
-msgid "Done tracken"
-msgstr "Stretch"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:78
-#, fuzzy
-msgid "Google Analytics aktivieren"
-msgstr "Activate module"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:80
-msgid "Tracking-Code"
-msgstr "Tracking-Code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:82
-#, fuzzy
-msgid "Domainname"
-msgstr "Filename"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:84
-msgid "IP Adresse anonymisieren"
-msgstr "IP Adresse anonym"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:88
-msgid "Ladegeschwindigkeit der Website erfassen"
-msgstr "Capture loading speed of the website"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:90
-msgid "Zieleinrichtung in Google Analytics"
-msgstr "Target device in Google Analytics"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:94
-msgid "Ziel"
-msgstr "end"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:23
-#, fuzzy
-msgid "Bestellabschluss"
-msgstr "Order status"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:108
-msgid "Trichter (optional)"
-msgstr "Funnel (optional)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:114
-#, fuzzy
-msgid "Adresse"
-msgstr "IP address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:115
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shippingadress.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_freeshipping.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:25
-msgid "Versand"
-msgstr "Shipping"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:116
-#, fuzzy
-msgid "WarenkorbÃŒbersicht"
-msgstr "Basket page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:125
-msgid "Liniendiagramm (Breite in px)"
-msgstr "Line chart (width in px)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:126
-msgid "Liniendiagramm (Hoehe in px)"
-msgstr "Line chart (height in px)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:128
-msgid "Kuchendiagramm (Breite in px)"
-msgstr "Pie chart (width in px)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:129
-msgid "Kuchendiagramm (HÃ¶he in px)"
-msgstr "Pie chart (height in px)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:131
-msgid "Balkendiagramm (Breite in px)"
-msgstr "Bar chart (width in px)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:132
-msgid "Balkendiagramm (HÃ¶he in px)"
-msgstr "bar chart (height in px)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:134
-#, fuzzy
-msgid "Anzeige Top-Produkte"
-msgstr "Amount products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/settings_edit.phtml:136
-msgid "Intervall-Zeitraum fÃŒr Produktstatistik"
-msgstr "Interval period for product statistics"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/data.phtml:27
-msgid "Zeitpunkt"
-msgstr "timepoint"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/data.phtml:45
-msgid "&oslash; in "
-msgstr "&oslash; in "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_statistics/chartturnover/week.phtml:96
-#, fuzzy
-msgid "Tag"
-msgstr "Days"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:13
-msgid "Sie haben eine neues Passwort angefragt."
-msgstr "You have requested a new password."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:15
-msgid "Ihr neues Passwort lautet ab sofort: #1#"
-msgstr "Your new password is: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register_html.phtml:10
-msgid "Sie haben sich mit folgenden Daten bei uns registriert."
-msgstr "You registered with the following data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:15
-msgid "Firma: #1#"
-msgstr "Company: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:16
-msgid "Vorname: #1#"
-msgstr "First name: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:17
-msgid "Name: #1#"
-msgstr "Last name: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:18
-msgid "E-Mail: #1#"
-msgstr "email: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:19
-msgid "Telefon: #1#"
-msgstr "Phone: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:20
-msgid "Fax: #1#"
-msgstr "Fax: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:21
-msgid "StraÃe: #1#"
-msgstr "Street: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:22
-msgid "PLZ: #1#"
-msgstr "ZIP: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:23
-msgid "Ort: #1#"
-msgstr "City: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:24
-msgid "Land: #1#"
-msgstr "Country: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_register.phtml:25
-msgid "UStIdNr.: #1#"
-msgstr "VAT code: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:12
-msgid ""
-"Es wird ihnen ein neues Passwort generiert, wenn sie auf folgenden Link "
-"klicken:"
-msgstr "A new password will be generated by clicking on the following link:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:16
-msgid ""
-"Sollten Sie kein neues Passwort angefragt haben kÃ¶nnen Sie diese Mail "
-"ignorieren."
-msgstr "If you haven't requested a new password please ignore this mail."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/login.phtml:15
-msgid "Bereits Kunde? Hier einloggen ..."
-msgstr "Already a customer? Log in here..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/login.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_login.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:32
-msgid "Login"
-msgstr "Login"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:165
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:313
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:152
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:279
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:197
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:327
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:113
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:142
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:262
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:293
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:398
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:115
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:240
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:268
-msgid "Bitte auswÃ€hlen"
-msgstr "Please select"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:217
-msgid "Passwort (Wiederholung)"
-msgstr "Password (confirmation)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:224
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:338
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:118
-msgid "Passwort sollte folgende Regeln befolgen:"
-msgstr "Password should follow these rules:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:226
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:340
-msgid "Mit mindestens 8 Zeichen wird das Passwort noch sicherer"
-msgstr "At least 8 characters make the password even more secure"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:227
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:341
-msgid "Mit mindestens einem Kleinbuchstaben wird das Passwort noch sicherer"
-msgstr ""
-"With at least one lowercase letter, the password becomes even more secure"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:228
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:342
-msgid "Mit mindestens einem GroÃbuchstaben wird das Passwort noch sicherer"
-msgstr ""
-"With at least one uppercase letter, the password becomes even more secure"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:229
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:343
-msgid "Mit mindestens einer Zahl wird das Passwort noch sicherer"
-msgstr "With at least one number, the password becomes even more secure"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:230
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:344
-msgid "Mit mindestens einem Sonderzeichen wird das Passwort noch sicherer"
-msgstr ""
-"With at least one special character the password becomes even more secure"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:236
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:243
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:331
-#, fuzzy
-msgid "Geburtsdatum (Format: TT.MM.JJJJ)"
-msgstr "Day of birth (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:245
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:211
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:252
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:338
-msgid "Fax."
-msgstr "Fax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:254
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:220
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:261
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:345
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:155
-msgid "Tel."
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:266
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:232
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:273
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:193
-#, fuzzy
-msgid "StraÃe:"
-msgstr "Street"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:270
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:236
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:277
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:197
-#, fuzzy
-msgid "Nr:"
-msgstr "#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:279
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:245
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:286
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:370
-#, fuzzy
-msgid "StraÃe Nr."
-msgstr "Street number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:340
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:307
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:354
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:198
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:424
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/kundendaten_renderfield.phtml:15
-msgid "Bitte AuswÃ€hlen"
-msgstr "Please select"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:360
-msgid "SPAM Schutz Abfrage"
-msgstr "SPAM protection query"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:368
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:351
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/paymenthint.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:64
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:389
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:318
-msgid "Mit #1# gekennzeichnete Felder sind Pflichtfelder."
-msgstr "Fields marked # 1 # are mandatory."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/register.phtml:380
-msgid "Registrieren"
-msgstr "Register"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:18
-#, fuzzy
-msgid "Kundenverwaltung (#1# Kunden)"
-msgstr "Customer management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:25
-#, fuzzy
-msgid "Kundenexport (Exportprofile)"
-msgstr "Export profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:45
-#, fuzzy
-msgid "Kundengruppe"
-msgstr "Customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:53
-#, fuzzy
-msgid "Alle Kundengruppen"
-msgstr "Show all"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:57
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:38
-msgid "Kunden suchen"
-msgstr "Search customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:134
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:133
-#, fuzzy
-msgid "Nr/Name"
-msgstr "Last name"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:153
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:148
-msgid "Dem Kunden eine E-Mail schreiben."
-msgstr "Write an e-mail to the customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:158
-#, fuzzy
-msgid "Sind Sie sicher, dass Sie den Kunden lÃ¶schen wollen?"
-msgstr "Are you sure you want to delete this customer?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:160
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:180
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:161
-msgid "Bestellungen einsehen"
-msgstr "Review order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:164
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:145
-#, fuzzy
-msgid "Kundenlogin simulieren"
-msgstr "Import customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:176
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:157
-msgid "#1# Bestellungen"
-msgstr "#1# order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:177
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:158
-msgid "Umsatz: #1#"
-msgstr "Revenue: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:192
-#, fuzzy
-msgid "Kundenkonto zuordnen"
-msgstr "Assign new product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index.phtml:205
-msgid "Keine Kunden in der Datenbank."
-msgstr "No customers in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:18
-#, fuzzy
-msgid "Kundenverwaltung - Kundendatenimport"
-msgstr "Voucher management - CSV import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:21
-msgid "ZurÃŒck zur Kundenverwaltung"
-msgstr "Back to customer management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:32
-msgid ""
-"Laden Sie ein vorher exportiertes CSV File hoch, die Kundendaten werden dann "
-"aus dieser Datei importiert."
-msgstr ""
-"Upload a previously exported csv file and the customer data will be imported "
-"from that file."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/import.phtml:38
-#, fuzzy
-msgid "Import der Kundendaten starten"
-msgstr "Start import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:14
-#, fuzzy
-msgid "Neues Passwort generieren"
-msgstr "Request password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/profil.phtml:331
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml:25
-msgid "Passwort wiederholen"
-msgstr "Repeat password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/checkout_logout.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:22
-msgid "Abmelden"
-msgstr "Log out"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:24
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:249
-msgid "Kundenverwaltung"
-msgstr "Customer management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:19
-#, fuzzy
-msgid "Kunde anlegen/bearbeiten"
-msgstr "Edit this customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:57
-#, fuzzy
-msgid "Format: TT.MM.JJJJ"
-msgstr "Start (DD.MM.YYYY)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:92
-msgid "Anonymisiert"
-msgstr "anonymous"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:93
-#, fuzzy
-msgid "Mail bei StatusÃ€nderung"
-msgstr "Customer email for status changes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:94
-msgid "Kundenkommentar"
-msgstr "Customer comment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:98
-msgid "Benutzerdefinierte Felder"
-msgstr "User defined fields"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:472
-msgid "Keine Auswahl"
-msgstr "No choice."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:114
-msgid "PasswortÃ€nderung"
-msgstr "Change password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:116
-msgid "Wiederholung"
-msgstr "Confirmation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:120
-#, fuzzy
-msgid "Mindestens 8 Zeichen"
-msgstr "Save settings"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:121
-msgid "Mindestens ein Kleinbuchstabe"
-msgstr "At least one lowercase letter"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:122
-msgid "Mindestens ein GroÃbuchstabe"
-msgstr "At least one capital letter"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:123
-msgid "Mindestens eine Zahl"
-msgstr "At least one number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:124
-msgid "Mindestens ein Sonderzeichen"
-msgstr "At least one special character"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:130
-msgid "Information"
-msgstr "Information"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:136
-msgid "Bestellungen anzeigen"
-msgstr "Show order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:147
-#, fuzzy
-msgid "Kunden Login"
-msgstr "Import customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:155
-msgid "Letzte Bestellung"
-msgstr "Last order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:163
-msgid "Anonymisiert am"
-msgstr "anonymous from"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:171
-#, fuzzy
-msgid "Letzte Anmeldung"
-msgstr "Last order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:180
-msgid ""
-"<a href=\"#1#\" title=\"Storniert\" class=\"wpsg_storno\">#2#</a> / <a href="
-"\"#3#\" title=\"Offen\" class=\"wpsg_open\">#4#</a> / <a href=\"#5#\" title="
-"\"Bezahlt\" class=\"wpsg_payed\">#6#</a>"
-msgstr ""
-"<a href=\"#1#\" title=\"Cancelled\" class=\"wpsg_storno\"> # 2 # </a> / <a "
-"href=\"#3#\" title=\"Offen\" class=\"wpsg_open\"> # 4 # </a> / <a href=\"#5#"
-"\" title=\"Paid\" class=\"wpsg_payed\"> # 6 # </a>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:191
-#, fuzzy
-msgid "Umsatz in #1#"
-msgstr "Revenue: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:206
-msgid "Kunde speichern"
-msgstr "Save customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/edit.phtml:207
-msgid "Kunde speichern und zur Ãbersicht"
-msgstr "Save customer and back to overview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/getpwd.phtml:11
-msgid ""
-"Geben Sie hier die E-Mail Adresse an, mit der Sie bereits bestellt haben. "
-"Sie erhalten dann eine E-Mail mit der Aufforderung ein neues Passwort zu "
-"generieren."
-msgstr ""
-"Enter your email address you have ordered products before. After that you "
-"will receive an e-mail with a link to generate a new password for your "
-"account shortly."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/getpwd.phtml:28
-msgid "Passwort anfordern"
-msgstr "Request password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:28
-#, fuzzy
-msgid "Kundenverwaltung (Ãbersicht)"
-msgstr "Customer management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:37
-msgid "Suchfeld (Zielkunde)"
-msgstr "Search field (target customer)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:57
-msgid "Kundenkonto, in das die Kunden ÃŒberfÃŒhrt werden sollen:"
-msgstr "Customer account into which the customers are to be transferred:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:62
-#, fuzzy
-msgid "Es konnte kein passender Kunde gefunden werden."
-msgstr "No matching products found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:92
-msgid "Gastzugang"
-msgstr "guest access"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:116
-msgid "Kundenkonten zusammenfÃŒgen"
-msgstr "Merge customer accounts"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/index_setAccount.phtml:127
-msgid "GewÃ€hlte Kunden (Diese werden gelÃ¶scht)"
-msgstr "Selected customers (These will be deleted)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/mail_activate_html.phtml:10
-msgid "Der Status Ihres Accounts hat sich gÃ€ndert auf:"
-msgstr "The status of your account has changed to "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/logout.phtml:9
-msgid ""
-"Sie kÃ¶nnen sich nicht registrieren, da sie derzeit eingelogt sind. Klicken "
-"Sie <a href=\"#1#\">hier</a> um sich abzumelden."
-msgstr ""
-"You cannot register since you are already logged in. Please click <a href="
-"\"#1#\">here</a> to log out."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:20
-msgid "Bestellung vom #1# ÃŒber #2#"
-msgstr "Order of the #1# about #2#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:28
-msgid "Rechnung #1#"
-msgstr "Invoice #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:30
-#, fuzzy
-msgid "Rechnungskorrektur #1#"
-msgstr "Invoice canceled at #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:170
-msgid "Bestellte Produkte"
-msgstr "Ordered products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:54
-msgid "Datei \"#1#\": "
-msgstr "File \"#1#\":"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:56
-msgid "Noch nicht geplant"
-msgstr "Not scheduled"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:58
-msgid "Geplant am #1#."
-msgstr "Scheduled for #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:61
-msgid "<a href=\"#1#\" target=\"blank\">Download</a>"
-msgstr "<a href=\"#1#\" target=\"blank\">Download</a>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/order.phtml:91
-msgid "Bisher keine Bestellungen durchgefÃŒhrt."
-msgstr "No orders made yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/customermail_html.phtml:11
-msgid "Hallo #1# #2#"
-msgstr "Hello #1# #2#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:17
-msgid "Profil bearbeiten"
-msgstr "Edit profile"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:197
-msgid "Abonnements"
-msgstr "subscriptions"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:39
-msgid "Anmelden"
-msgstr "Log in"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/widget.phtml:44
-msgid "Passwort vergessen?"
-msgstr "Password forgotten?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:12
-msgid "Login in Checkout integrieren"
-msgstr "Integrate log in in checkout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:16
-msgid "Registrierung im Checkout"
-msgstr "Register in checkout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:17
-msgid "Registrierungzwang im Checkout"
-msgstr "Force registration in checkout"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:21
-msgid "E-Mail darf nur fÃŒr einmaligen EInkauf genutzt werden"
-msgstr "E-mail may only be used for a single purchase"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:25
-msgid "Bestellung und Preisanzeige nur fÃŒr eingeloggte Benutzer"
-msgstr "Order and price display only for logged in users"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:29
-msgid "Weiterleitung nach Login"
-msgstr "Forwarding after login"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:34
-#, fuzzy
-msgid "Auf aktueller Seite bleiben"
-msgstr "Stay on site"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:33
-msgid "Weiterleitung nach Logout"
-msgstr "Forwarding after logout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:37
-msgid "Status nach Registrierung"
-msgstr "Status after registering"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:43
-msgid "Sind Sie sich sicher, dass Sie alle Kunden auf Aktiv setzen mÃ¶chten?"
-msgstr "Are you sure you want to set all customers to active?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:43
-#, fuzzy
-msgid "Alle Kunden aktivieren"
-msgstr "Set all customers to active."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:44
-msgid "Sind Sie sich sicher, dass Sie alle Kunden auf Inaktiv setzen mÃ¶chten?"
-msgstr "Are you sure you want to set all customers to inactive?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:44
-#, fuzzy
-msgid "Alle Kunden deaktivieren"
-msgstr "Set all customers to active."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:51
-msgid "Profilseite"
-msgstr "Profile page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:52
-msgid "Registrierungsseite"
-msgstr "Register page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:53
-#, fuzzy
-msgid "Weiterleitung nach Registrierung"
-msgstr "Status after registering"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:54
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:195
-#, fuzzy
-msgid "Passwort gesendet"
-msgstr "Password forgotten?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:55
-msgid "BestellÃŒbersichtsseite"
-msgstr "Order view page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:60
-#, fuzzy
-msgid "AbonnementenÃŒbersichtsseite"
-msgstr "Order view page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:65
-#, fuzzy
-msgid "Wordpress User koppeln"
-msgstr "WordPress version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:68
-#, fuzzy
-msgid "Benutzerrolle"
-msgstr "User defined 1"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:73
-msgid "AWeber Integration"
-msgstr "AWeber Integration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:76
-msgid "AWeber meta_web_form_id"
-msgstr "AWeber meta_web_form_id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:77
-msgid "AWeber listname"
-msgstr "AWeber listname"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:78
-msgid "AWeber meta_adtracking"
-msgstr "AWeber meta_adtracking"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:83
-#, fuzzy
-msgid "reCaptcha V2 fÃŒr Registrierung"
-msgstr "Status after registering"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:86
-#, fuzzy
-msgid "WebsiteschlÃŒssel"
-msgstr "Key of payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:87
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:15
-#, fuzzy
-msgid "Geheimer SchlÃŒssel"
-msgstr "SALT key"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenverwaltung/settings_edit.phtml:101
-#, fuzzy
-msgid ""
-"Die Einstellungen fÃŒr die E-Mails (Betreff, Absender, CC) kÃ¶nnen in der <a "
-"href=\"#1#\">E-Mail Konfiguration</a> durchgefÃŒhrt werden."
-msgstr ""
-"Settings for emails (subject, sender, CC) can be made in the <a href=\"#1#"
-"\">email configuration</a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_addedit_content.phtml:9
-#, fuzzy
-msgid "Kategorieauswahl"
-msgstr "Categories"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_addedit_content.phtml:21
-#, fuzzy
-msgid "Zur Kategorieverwaltung"
-msgstr "To product variables management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_addedit_content.phtml:25
-#, fuzzy
-msgid "Einstellungen zum Produktartikel"
-msgstr "Load settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_addedit_content.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1474
-msgid "Position"
-msgstr "invoice line item"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_addedit_content.phtml:30
-#, fuzzy
-msgid "Kommentare"
-msgstr "Comment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_addedit_content.phtml:34
-msgid "Zur Konfiguration der Produktartikel"
-msgstr "To configure the product article"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml:9
-msgid "URL Path Segment"
-msgstr "URL Path Segment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:9
-#, fuzzy
-msgid "Path Key (Produkte)"
-msgstr "Amount products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:10
-#, fuzzy
-msgid "Path Key (Kategorien)"
-msgstr "Categories"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:12
-msgid "Custom Post Type in Wordpress MenÃŒ sichtbar"
-msgstr "Custom Post Type visible in Wordpress menu"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:14
-msgid "Produktbild als Beitragsbild ÃŒbergeben"
-msgstr "Transfer product image as a contribution picture"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:16
-msgid "Direkt auf Startseitenansicht anzeigen"
-msgstr "Show directly on home page view"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:17
-msgid "Direkt in den Kategorieansichten anzeigen"
-msgstr "Show directly in the category views"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:18
-msgid "Direkt in den Suchergebnissen anzeigen"
-msgstr "Show directly in the search results"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:19
-#, fuzzy
-msgid "Direkt in den Feeds anzeigen"
-msgstr "Show basket in new window"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:20
-msgid "Nur Main Query berÃŒcksichtigen"
-msgstr "Only consider Main Query"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:21
-msgid "Darstellung der EAN"
-msgstr "Presentation of the EAN"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:22
-msgid "Darstellung der GTIN"
-msgstr "Presentation of the GTIN"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:24
-#, fuzzy
-msgid "Kommentarfunktion"
-msgstr "Comment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:25
-#, fuzzy
-msgid "Produktspezifisch"
-msgstr "Save product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:26
-#, fuzzy
-msgid "Global aktiviert"
-msgstr "Module activated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:27
-#, fuzzy
-msgid "Global deaktiviert"
-msgstr "Module activated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:33
-#, fuzzy
-msgid "Produkttemplate fÃŒr Ansicht auf Startseite"
-msgstr "Product group overview page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:43
-#, fuzzy
-msgid "Keine Templatedateien gefunden!"
-msgstr "No template found!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:45
-msgid "Wie Produkttemplate"
-msgstr "Like product template"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:39
-#, fuzzy
-msgid "Produkttemplate fÃŒr List Ansicht"
-msgstr "Product template"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:45
-#, fuzzy
-msgid "Produkttemplate fÃŒr Such Ansicht"
-msgstr "Product template"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:47
-#, fuzzy
-msgid "Anzahl Bewertungen im Frontend"
-msgstr "Customer Action at Frontend"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:61
-msgid "Wird derzeit aufgebaut, bitte warten ..."
-msgstr "Is currently under construction, please wait ..."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:65
-msgid "Komplett"
-msgstr "complett"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:72
-#, fuzzy
-msgid "Neu aufbauen"
-msgstr "Refresh status"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:75
-msgid "Zuordnung Produkt zu Artikel"
-msgstr "Assignment product to article"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_produktartikel/settings_edit.phtml:103
-msgid "Neuaufbau abgeschlossen."
-msgstr "Rebuild completed."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/paymenthint.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/order_view_afterpayment.phtml:9
-msgid "Typ der Kreditkarte"
-msgstr "Type of credit card"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/paymenthint.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_view_afterpayment.phtml:17
-msgid "Inhaber"
-msgstr "Owner"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/paymenthint.phtml:39
-#, fuzzy
-msgid "Kartennummer"
-msgstr "Customer id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/paymenthint.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/order_view_afterpayment.phtml:12
-msgid "PrÃŒfziffer"
-msgstr "check digit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/paymenthint.phtml:55
-#, fuzzy
-msgid "GÃŒltigkeit"
-msgstr "Valid till"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/order_view_afterpayment.phtml:10
-msgid "Inhaber der Kreditkarte"
-msgstr "owner of the credit card"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/order_view_afterpayment.phtml:11
-#, fuzzy
-msgid "Kreditkarten-Nummer"
-msgstr "Item number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:16
-msgid "IBAN/BIC statt Kontonummer/BLZ verwenden"
-msgstr "Use IBAN / BIC instead of bank account number / BLZ"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_creditcard/settings_edit.phtml:17
-#, fuzzy
-msgid "AES-256 Passwort"
-msgstr "Password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/produkt_addedit_sidebar.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:1328
-msgid "Produktrabatt"
-msgstr "Discount for product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/produkt_addedit_sidebar.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/productgroups_addedit_sidebar.phtml:12
-msgid "Aktion aktiv"
-msgstr "Campaign running"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/produkt_addedit_sidebar.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/productgroups_addedit_sidebar.phtml:13
-msgid "Start (TT.MM.JJJJ)"
-msgstr "Start (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/produkt_addedit_sidebar.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/productgroups_addedit_sidebar.phtml:14
-msgid "Ende (TT.MM.JJJJ)"
-msgstr "End (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/produkt_addedit_sidebar.phtml:17
-#, fuzzy
-msgid "Zur Konfiguration der Rabatte"
-msgstr "Configuration"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/basket_top.phtml:10
-msgid ""
-"Ab einem Bestellwert von #1# erhalten Sie einen Rabatt von #2#. Ihnen fehlen "
-"dazu noch #3# im Warenkorb."
-msgstr ""
-"From an order value of # 1 # you will receive a discount of # 2 #. You also "
-"need # 3 # in your shopping cart."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/productgroups_addedit_sidebar.phtml:9
-#, fuzzy
-msgid "Produktgruppen Rabatt"
-msgstr "Discount for product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:12
-#, fuzzy
-msgid "Warenkorbrabatt"
-msgstr "Basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:18
-msgid "Rabatt auf Produkte"
-msgstr "Discount for products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:18
-#, fuzzy
-msgid "Aktivierte Rabatte"
-msgstr "Activated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:1327
-#, fuzzy
-msgid "Rabatt auf alle Produkte"
-msgstr "Discount for products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:24
-msgid "Von (tt.mm.jjjj)"
-msgstr "From (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:25
-msgid "Bis (tt.mm.jjjj)"
-msgstr "To (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:32
-msgid "Rabatt auf Produktgruppen"
-msgstr "Discount for product groups"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:36
-#, fuzzy
-msgid "Rabatt auf Kundengruppen"
-msgstr "Discount for product groups"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:39
-#, fuzzy
-msgid "Originalpreis im Produkttemplate anzeigen"
-msgstr "Show directly in product template?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:53
-#, fuzzy
-msgid "Standard wiederherstellen"
-msgstr "Restore factory settings"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:55
-msgid "Rabattreihenfolge (fÃŒr Berechnung)"
-msgstr "Discount order (for calculation)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:71
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:80
-msgid "ab"
-msgstr "from"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:81
-msgid "Staffelung"
-msgstr "Grading"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:87
-msgid "Nur ersten Rabatt berÃŒcksichtigen"
-msgstr "Only consider first discount"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:88
-msgid "NÃ€chste Staffelung im Warenkorb anpreisen"
-msgstr "Advertise next graduation in your shopping cart"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_discount/settings_edit.phtml:89
-msgid "Gutscheine bei aktivem Rabatt nicht zulassen"
-msgstr "Do not allow coupons with active discount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:43
-#, fuzzy
-msgid "Betreff fÃŒr Ãberweisung (Zeile 1)"
-msgstr "Reference for transfers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:44
-#, fuzzy
-msgid "Betreff fÃŒr Ãberweisung (Zeile 2)"
-msgstr "Reference for transfers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:51
-msgid "Verwendete WÃ€hrung"
-msgstr "Used currency"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:22
-msgid "Euro"
-msgstr "Euro"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:23
-msgid "Schweizer Franken"
-msgstr "Swiss franc"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:51
-msgid "Britische Pfund"
-msgstr "Great Britain Pound"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:52
-#, fuzzy
-msgid "Kunden-Nr fÃŒr SofortÃŒberweisung.de"
-msgstr "User id from sofortbanking.com"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:53
-msgid "Projekt ID fÃŒr SofortÃŒberweisung.de"
-msgstr "Project id from sofortbanking.com"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:54
-msgid "Projekt Passwort"
-msgstr "Project password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:55
-msgid "Benachrichtigungs Passwort"
-msgstr "Notification password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:56
-msgid "Sprache bei SofortÃŒberweisung.de"
-msgstr "Language for sofortbanking.com"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:56
-msgid "deutsch"
-msgstr "German"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:56
-msgid "englisch"
-msgstr "English"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:56
-msgid "franzÃ¶sisch"
-msgstr "French"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:56
-msgid "niederlÃ€ndisch"
-msgstr "Dutch"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:57
-msgid "Verwendetes HASH Verfahren"
-msgstr "Used hash method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/settings_edit.phtml:59
-msgid "URL fÃŒr HTTP Benachrichtigung"
-msgstr "URL for HTTP notification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/order_done.phtml:8
-msgid ""
-"Um den Betrag mit SofortÃŒberweisung zu bezahlen klicken Sie bitte auf "
-"folgendes Logo."
-msgstr "To pay using SofortBanking please click on the following logo:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/order_done.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_su/order_done.phtml:11
-msgid "Mit SofortÃŒberweisung bezahlen"
-msgstr "Pay using SofortBanking"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail_html.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail.phtml:11
-#, fuzzy
-msgid "BIC Code der Bank"
-msgstr "Bank code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail_html.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_view_afterpayment.phtml:14
-msgid "BLZ der Bank"
-msgstr "Bank code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail_html.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail.phtml:15
-msgid "Name des Kontoinhabers"
-msgstr "Bank account owner"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail_html.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_view_afterpayment.phtml:20
-#, fuzzy
-msgid "IBAN Nr."
-msgstr "IBAN"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail_html.phtml:36
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/mail.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_view_afterpayment.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:44
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:41
-msgid "Kontonummer"
-msgstr "Account number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:41
-#, fuzzy
-msgid "BIC"
-msgstr "BCC"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:30
-msgid "Bankleitzahl"
-msgstr "Bank code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/paymenthint.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:40
-msgid "IBAN"
-msgstr "IBAN"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_view_afterpayment.phtml:12
-#, fuzzy
-msgid "BIC der Bank"
-msgstr "Bank code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/settings_edit.phtml:17
-msgid "BIC validieren"
-msgstr "Validate BIC"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_autodebit/order_done.phtml:8
-msgid ""
-"Sie bezahlen mit Bankeinzug. Wir werden den Betrag von Ihrem Konto abbuchen."
-msgstr "You pay by direct debit. We will deduct the amount from your account."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minrequest/settings_edit.phtml:10
-#, fuzzy
-msgid "Minimaler Warenkorbwert"
-msgstr "in your basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minrequest/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minrequest/settings_edit.phtml:11
-msgid "Gilt fÃŒr den Brutto Produktpreis. (Ohne Versand- und Zahlungskosten)"
-msgstr ""
-"Applies to the gross product price. (Without shipping and payment costs)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_minrequest/settings_edit.phtml:11
-#, fuzzy
-msgid "Maximaler Warenkorbwert"
-msgstr "in your basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/show.phtml:29
-msgid "Mehr zur Produktgruppe"
-msgstr "More about product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/admin_setcapabilities.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:449
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:115
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:303
-msgid "Produktgruppen"
-msgstr "Product groups"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:17
-msgid "Bisher wurden keine Produktgruppen angelegt."
-msgstr "No product groups were created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:20
-msgid "Sticky von"
-msgstr "Sticky from"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:21
-msgid "Sticky bis"
-msgstr "Sticky to"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:19
-msgid "Produktgruppenverwaltung"
-msgstr "Product group management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml:25
-#, fuzzy
-msgid "Zur Konfiguration der Produktgruppe"
-msgstr "More about product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:20
-#, fuzzy
-msgid "Produktgruppe anlegen/bearbeiten"
-msgstr "Edit this product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:46
-#, fuzzy
-msgid "Produktgruppenname"
-msgstr "Product groups"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:54
-msgid "Info Seite"
-msgstr "Information page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:66
-msgid "Produktgruppe speichern"
-msgstr "Save product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/add.phtml:67
-msgid "Produktgruppe speichern und zur Ãbersicht"
-msgstr "Save product group and back to overview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:19
-#, fuzzy
-msgid "Produktgruppenverwaltung (#1# Produktgruppen)"
-msgstr "Product group management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:40
-#, fuzzy
-msgid "Produktgruppen suchen"
-msgstr "Save product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:85
-msgid "Diese Produktgruppe bearbeiten"
-msgstr "Edit this product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:87
-msgid "Diese Produktgruppe lÃ¶schen"
-msgstr "Delete this product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:90
-msgid "Zur Produktliste"
-msgstr "To product list"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/index.phtml:124
-#, fuzzy
-msgid "Keine Produktgruppen in der Datenbank."
-msgstr "No products in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:10
-#, fuzzy
-msgid "Produktgruppen Lagerbestand"
-msgstr "Discount for product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:12
-msgid "Bestand"
-msgstr "Stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:24
-msgid "Lagerbestand zÃ€hlen"
-msgstr "Count stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:8
-msgid "ProduktgruppenÃŒbersichtsseite"
-msgstr "Product group overview page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:9
-msgid "Sortierung innerhalb der Gruppe"
-msgstr "Sorting within the group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:10
-msgid "Nach ID"
-msgstr "After id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:12
-msgid "Anzahl VerkÃ€ufe"
-msgstr "Number of sales"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1420
-msgid "Erstellungsdatum"
-msgstr "Creation date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productgroups/settings_edit.phtml:19
-#, fuzzy
-msgid "Filter in Bestellverwaltung aktivieren"
-msgstr "Order management"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:159
-msgid "Login fÃŒr bestehenden Kundenaccount"
-msgstr "Login for existing customer account"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:168
-#, fuzzy
-msgid "neuen Kundenaccount registrieren"
-msgstr "Register this domain"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:176
-#, fuzzy
-msgid "Als Gast bestellen"
-msgstr "Create credit voucher."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:234
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:323
-#, fuzzy
-msgid "E-Mail (Wiederholung)"
-msgstr "Email address (confirmation)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:417
-msgid "ZurÃŒck zum Warenkorb"
-msgstr "Back to basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/onepage.phtml:419
-msgid "Weiter"
-msgstr "Continue"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/settings_edit.phtml:8
-msgid "Seite fÃŒr den \"EinSeitenCheckout\""
-msgstr "Page for the \"OneSideCheckout\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_onepagecheckout/settings_edit.phtml:9
-#, fuzzy
-msgid "Warenkorb in EinSeitenCheckout integrieren"
-msgstr "Integrate log in in checkout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/mail_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/mail.phtml:9
-msgid "Bitte vereinbaren Sie mit uns einen Termin an dem Sie die Ware abholen."
-msgstr ""
-"Please make an appointment with us when you want to pick up your products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/mail_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/mail.phtml:11
-msgid "Abholadresse"
-msgstr "Pick up address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/shippinghint.phtml:8
-msgid "Die Ware kann dann an folgender Adresse abgeholt werden:"
-msgstr "The products can be picked up at the following address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:11
-msgid "Selbstabholung erfordert Barzahlung"
-msgstr "Cash and carry requires cash payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:12
-#, fuzzy
-msgid "Selbstabholung nicht kombinieren"
-msgstr "Pick up"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:18
-msgid "Zahlungsart \"Barzahlung\" aktivieren"
-msgstr "Activate \"Cash payment\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:19
-msgid "Bezeichung der Zahlungsart"
-msgstr "Description of payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:20
-msgid "Hinweistext der Zahlungsart"
-msgstr "Hint for payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:22
-msgid "GebÃŒhr/Rabatt (Versandart)"
-msgstr "Charge\\Discount (shipping method)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_willcollect/settings_edit.phtml:23
-msgid "GebÃŒhr/Rabatt (Zahlungsart)"
-msgstr "Charge\\Discount (payment method)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_view_afterpayment.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_view_afterpayment.phtml:13
-msgid "PaymentID"
-msgstr "PaymentID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_view_afterpayment.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_view_afterpayment.phtml:13
-#, fuzzy
-msgid "Status Aktualisieren"
-msgstr "Update"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_view_afterpayment.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:424
-#, fuzzy
-msgid "#1#"
-msgstr "from #1#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:13
-msgid "Autostart"
-msgstr "Autostart"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:17
-msgid "Mindestfinanzierungssumme"
-msgstr "Minimum funding amount"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:18
-msgid "Maximale Finanzierungssumme"
-msgstr "Maximum amount of funding"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:19
-msgid "Mindestlaufzeit (Monate)"
-msgstr "Minimum term (months)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:20
-msgid "Maximale Laufzeit (Monate)"
-msgstr "Maximum duration (months)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:21
-#, fuzzy
-msgid "Mindestrate"
-msgstr "Minimum order value"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:25
-msgid "Targo-URL-Sandbox"
-msgstr "Targo-URL-Sandbox"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:26
-msgid "Targo-URL-Livesystem"
-msgstr "Targo-URL-Livesystem"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:27
-msgid "Targo-URL-Sandbox benutzen"
-msgstr "use Targo-URL-Sandbox"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:28
-msgid "Targo-Koop-ID"
-msgstr "Targo-Coop-ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:29
-msgid "Targo-Dealer-ID"
-msgstr "Targo-Dealer-ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:30
-msgid "Targo-Hash-Key"
-msgstr "Targo-Hash-Key"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:34
-msgid "Targo-Dealer-Shop-URL"
-msgstr "Targo-Dealer-Shop-URL"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/settings_edit.phtml:35
-msgid "Targo-Dealer-Abort-URL"
-msgstr "Targo-Dealer-Abort-URL"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_done.phtml:18
-#, fuzzy
-msgid ""
-"Um den Betrag mit einer Finanzierung bei der TARGOBANK zu bezahlen, klicken "
-"Sie bitte auf folgendes Logo."
-msgstr "To pay using the service Billsafe please click on the following logo."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_done.phtml:21
-#, fuzzy
-msgid "Mit Targo bezahlen"
-msgstr "Pay with PayPal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_done.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_targo/order_done.phtml:30
-msgid "Finanzierung bei Targo beantragen."
-msgstr "Apply for financing at Targo."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_nlsatolo/checkout_customer_inner.phtml:13
-msgid "FÃŒr Newsletter anmelden."
-msgstr "Apply for newsletter."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_nlsatolo/settings_edit.phtml:10
-#, fuzzy
-msgid ""
-"Das Modul ist nur mit aktiviertem Satollo Newsletter Plugin funktionsfaehig."
-msgstr "The module works only with activated wpNewsletterGermany plugin."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_nlsatolo/settings_edit.phtml:14
-msgid "Double Opt-In"
-msgstr "Double Opt-In"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_nlsatolo/settings_edit.phtml:17
-#, fuzzy
-msgid "Gruppezuordnung nach Registrierung"
-msgstr "Group assignments after registration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:68
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:20
-msgid "WÃ€hrungscode (Standard: EUR)"
-msgstr "Currency code (default: EUR)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:19
-msgid "HÃ€ndlerbeschreibung (Max. 30 Zeichen)"
-msgstr "Merchant description (max. 30 characters)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:20
-msgid "Geheimwort"
-msgstr "Secret password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:21
-msgid "E-Mail (Skrill Konto)"
-msgstr "Email (Skrill account)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:22
-msgid "HÃ€ndler ID"
-msgstr "Merchant id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/settings_edit.phtml:23
-msgid "Logo URL des Shops (200x50)"
-msgstr "Logo url of the shop (200x50)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/order_done.phtml:15
-msgid "ZurÃŒck zum Shop"
-msgstr "Back to shop"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/order_done.phtml:44
-msgid "Bezahlen mit Skrill"
-msgstr "Pay using Skrill"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_skrill/order_done.phtml:47
-msgid ""
-"Klicken Sie auf das Logo, um die Zahlung mit Skrill (Moneybookers) zu "
-"starten."
-msgstr "Click on the logo to pay using Skrill (Moneybookers)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/basket_row.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/mail_row_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/mail_row.phtml:7
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/overview_row.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:248
-#, fuzzy
-msgid "Lieferzeit"
-msgstr "Shipping address"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:11
-msgid "Lieferzeit anzeigen von"
-msgstr "Show delivery time from"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:21
-#, fuzzy
-msgid "Als Offlineprodukt anzeigen"
-msgstr "Show in product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:28
-#, fuzzy
-msgid "Seite mit Adressdaten"
-msgstr "Additional customer data"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:29
-msgid "Keine Verlinkung auf eine Seite anzeigen"
-msgstr "Show no link to a page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:35
-#, fuzzy
-msgid "Hinweistext bei VerzÃ¶gerungen anzeigen"
-msgstr "Show order(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:37
-msgid "Grund fÃŒr verzÃ¶gerte Lieferung"
-msgstr "Reason for delayed delivery"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:38
-msgid "Zeitangabe der VerzÃ¶gerung"
-msgstr "Time of delay"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:49
-msgid "Urlaubszeit"
-msgstr "holiday time"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:51
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:45
-msgid "Urlaubsbeginn"
-msgstr "holiday start"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:46
-#, fuzzy
-msgid "Urlaubsende"
-msgstr "Sender"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:53
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:47
-msgid "UrlaubsgruÃ"
-msgstr "holiday greeting"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml:60
-msgid "Zur Konfiguration der Lieferzeit"
-msgstr "To configure the delivery time"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/mail_row_html.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/mail_row.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:462
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:463
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:471
-msgid "<br />"
-msgstr "<br />"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:8
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:18
-#, fuzzy
-msgid "Eingabetyp"
-msgstr "Input validation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:9
-msgid "Angabe von Tagen"
-msgstr "Specification of days"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:13
-msgid "VerfÃŒgbare Lieferzeiten"
-msgstr "Available delivery times"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:13
-#, fuzzy
-msgid "Kommagetrennt"
-msgstr "Comment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:17
-msgid "Standard Lieferzeit"
-msgstr "Standard deliverytime"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:22
-msgid "Offline-Produkte anzeigen (nicht im Onlineshop bestellbar)"
-msgstr "Show offline products (can not be ordered in the online shop)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:43
-msgid "Urlaubzeit"
-msgstr "Holiday time"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:53
-msgid "Im Warenkorb anzeigen"
-msgstr "Show in basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:54
-#, fuzzy
-msgid "In Bestellzusammenfassung anzeigen"
-msgstr "Show in order summary"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_deliverytime/settings_edit.phtml:55
-#, fuzzy
-msgid "In den Mails anzeigen"
-msgstr "Show in order summary"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/order_view_sidebar.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/mail_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/checkout_inner_prebutton.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/mail.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1586
-msgid "Bestellvariablen"
-msgstr "Order variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:28
-msgid "Bestellvariable lÃ¶schen"
-msgstr "Delete order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/ov_list.phtml:166
-msgid "Bisher noch keine Bestellvariablen angelegt."
-msgstr "No order variables saved yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/settings_edit.phtml:37
-msgid "Neue Bestellvariable anlegen"
-msgstr "Create new order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordervars/settings_edit.phtml:37
-#, fuzzy
-msgid "Neue Bestellvariable anlegen."
-msgstr "Create new order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customerbudget/customer_sidebar.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:43
-#, fuzzy
-msgid "Kundenbudget"
-msgstr "Customer data"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_customerbudget/customer_sidebar.phtml:14
-msgid "Budget"
-msgstr "Budget"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:4
-#, fuzzy
-msgid "Newsletter"
-msgstr "Satollo  newsletter"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:11
-msgid "Abonnentengruppe"
-msgstr "subscriber group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/customer_sidebar.phtml:12
-#, fuzzy
-msgid "Daten ÃŒbernehmen"
-msgstr "Apply settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/checkout_customer_inner.phtml:11
-#, fuzzy
-msgid "Melden Sie sich hier fÃŒr unseren Newsletter an."
-msgstr "You have been subscribed out newsletter successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:9
-msgid ""
-"Das Modul ist nur mit aktiviertem wpNewsletterGermany Plugin funktionsfÃ€hig."
-msgstr "The module works only with activated wpNewsletterGermany plugin."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:12
-msgid "Gruppenzuordnung nach Registrierung"
-msgstr "Group assignments after registration"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:13
-msgid "Aktion"
-msgstr "Action"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:13
-msgid "Opt-In Mail versenden"
-msgstr "Send Opt-In email"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:13
-msgid "Direkt anmelden"
-msgstr "Apply directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:17
-msgid "Gruppenimport aus wpShopGermany Kunden"
-msgstr "Group import from wpShopGermany customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:26
-msgid "Kunden importieren"
-msgstr "Import customers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:44
-msgid "Bitte mindestens eine Gruppe wÃ€hlen."
-msgstr "Please select at least one group."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_newsletter/settings_edit.phtml:49
-msgid ""
-"Die Shop Kunden werden in die ausgewÃ€hlten Gruppen importiert. Bestehende E-"
-"Mail Adressen werden ÃŒberschrieben."
-msgstr ""
-"The shop customers are imported into the chosen groups. Existing mail "
-"addresses will be overwritten."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_addressvalidation/settings_edit.phtml:8
-msgid "API-Key"
-msgstr "API-Key"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_addressvalidation/settings_edit.phtml:11
-#, fuzzy
-msgid "SchlÃŒssel anfordern"
-msgstr "Request password"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_haendlerbund.phtml:26
-msgid ""
-"wpShopGermany bietet eine Schnittstelle zum <a href=\"https://partner."
-"haendlerbund.de/partnerdoor.php?partnerid=partner_wp&bannerid=18\" target="
-"\"_blank\">HÃ€ndlerbund</a> an."
-msgstr ""
-"wpShopGermany provides an interface to the <a href=\"https://partner."
-"haendlerbund.de/partnerdoor.php?partnerid=partner_wp&bannerid=18\" target="
-"\"_blank\"> Dealer Association </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_haendlerbund.phtml:27
-msgid ""
-"HÃ€ndlerbund bietet Schutzpakete im Abo (\"AGB-Rechtstext-Flatrate\") fÃŒr "
-"Onlineshop Betreiber an. Mit dem wpShopGermany-HÃ€ndlerbund Plugin (ab "
-"Version 1.0), werden die angebotenen Rechtstexte auf die zugeordneten Blog-"
-"Seiten mittels Mausklick automatisch ÃŒbernommen und aktualisiert."
-msgstr ""
-"HÃ€ndlerbund offers protection packages by subscription (\"AGB-Rechtstext-"
-"Flatrate\") for online shop operators. With the wpShopGermany-HÃ€ndlerbund "
-"plugin (version 1.0 or higher), the offered legal texts are automatically "
-"taken over and updated on the associated blog pages by mouse click."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_haendlerbund.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_protectedshops.phtml:16
-msgid ""
-"Das Plugin wurde bereits gefunden aber noch nicht aktiviert. Bitte "
-"aktivieren sie das Plugin in der <a href=\"plugins.php\">Pluginverwaltung</"
-"a>."
-msgstr ""
-"The plugin has already been found but not yet activated. Please activate the "
-"plugin in the <a href=\"plugins.php\"> Plugin Administration </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:15
-msgid ""
-"wpShopGermany bietet eine AGB-Schnittstelle zur <a href=\"https://www.it-"
-"recht-kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150\">IT-Recht "
-"Kanzlei</a> an."
-msgstr ""
-"wpShopGermany offers a AGB interface to the <a href=\"https://www.it-recht-"
-"kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150\"> IT law firm </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:18
-msgid ""
-"Kostenloses Plugin zur automatisierten Nutzung des AGB-Service der <a href="
-"\"#1#\">IT-Recht-Kanzlei</a>"
-msgstr ""
-"Free plug-in for automated use of the terms and conditions service of the <a "
-"href=\"#1#\"> IT Law Firm </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:19
-msgid ""
-"abmahnsichere Rechtstexte (AGB, DatenschutzerklÃ€rung, Widerrufsbelehrung & "
-"Co) von der <a href=\"#1#\">IT-Recht Kanzlei</a> ab nur 8,90 â¬/mtl."
-msgstr ""
-"warning-free legal texts (general terms and conditions, privacy policy, "
-"right of revocation & Co) from the <a href=\"#1#\"> IT law firm </a> from "
-"only â¬ 8.90 / mth."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:20
-msgid ""
-"Einfache Integration von aktuellen & abmahnsicheren Rechtstexten in den "
-"wpShopGermany-Shop"
-msgstr ""
-"Easy integration of up-to-date and warning-free legal texts into the "
-"wpShopGermany shop"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:21
-msgid "Automatische Ãberwachung und Aktualisierung der Rechtstexte"
-msgstr "Automatic monitoring and updating of legal texts"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:22
-msgid "SelbstverstÃ€ndlich: Anwaltliche Haftung"
-msgstr "Of course: legal liability"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:23
-msgid ""
-"Flexibles Vertragsmodell fÃŒr den AGB-Service: Bei Bedarf Jederzeit monatlich "
-"kÃŒndbar"
-msgstr ""
-"Flexible contract model for the GTC service: If required, cancellable "
-"monthly at any time"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_itrecht.phtml:29
-#, fuzzy
-msgid "Jetzt absichern"
-msgstr "Save customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_protectedshops.phtml:11
-msgid ""
-"wpShopGermany bietet eine Schnittstelle zu <a href=\"http://www."
-"protectedshops.de/\" target=\"_blank\">Protected Shops</a> an."
-msgstr ""
-"wpShopGermany bietet eine Schnittstelle zu <a href=\"http://www."
-"protectedshops.de/\" target=\"_blank\">Protected Shops</a> an."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_protectedshops.phtml:12
-msgid ""
-"Protected Shops bietet Schutzpakete im Abo (\"AGB-Rechtstext-Flatrate\") fÃŒr "
-"Onlineshop Betreiber an. Mit dem wpShopGermany-ProtectedShops Plugin (ab "
-"Version 1.8), werden die angebotenen Rechtstexte auf die zugeordneten Blog-"
-"Seiten mittels Mausklick automatisch ÃŒbernommen und aktualisiert."
-msgstr ""
-"Protected Shops offers protection packages by subscription (\"AGB-Rechtstext-"
-"Flatrate\") for online shop operators. With the wpShopGermany-ProtectedShops "
-"plugin (from version 1.8), the offered legal texts are automatically taken "
-"over and updated on the associated blog pages by mouse click."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/form_protectedshops.phtml:13
-msgid ""
-"Erhalten Sie <strong>5% Rabatt</strong> auf das erste Protected Shops "
-"Jahresabo mit folgendem <strong>Gutscheincode</strong>: <span style=\"color:"
-"red;\">WP-SHOP</span> (unbedingt bei der Erstregistrierung angeben!)"
-msgstr ""
-"Get <strong> 5% off </ strong> on the first Protected Shops annual "
-"subscription with the following <strong> coupon code </ strong>: <span style "
-"= \"color: red;\"> WP-SHOP </ span> (be sure to specify the first "
-"registration!)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/settings_edit.phtml:11
-msgid "Premiumpartner"
-msgstr "Premium partner"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/settings_edit.phtml:14
-msgid "IT-Recht Kanzlei MÃŒnchen"
-msgstr "IT-Recht Kanzlei MÃŒnchen"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/settings_edit.phtml:25
-msgid "Protected Shops"
-msgstr "Protected Shops"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_legaltexts/settings_edit.phtml:34
-#, fuzzy
-msgid "HÃ€ndlerbund"
-msgstr "Merchant id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/basket_inner_prebutton.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:28
-msgid "Direkt zu PayPal"
-msgstr "direct to paypal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/basket_inner_prebutton.phtml:22
-#, fuzzy
-msgid "Zahlungsart wÃ€hlen"
-msgstr "Payment methods"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:14
-msgid "Ihr PayPal Konto wird nach Bestellabschluss belastet."
-msgstr "Your PayPal account will be charged after order completion."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:21
-#, fuzzy
-msgid "Zahlung erneut authorisieren"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:24
-msgid ""
-"Der Betrag der Bestellung hat sich verÃ€ndert. Sie mÃŒssen die Zahlung mit "
-"PayPal erneut authorisieren."
-msgstr ""
-"The amount of the order has changed. You must re-authorize the payment with "
-"PayPal."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:25
-msgid ""
-"Dies kÃ¶nnen Sie ÃŒber folgenden Button erledigen oder nach Bestellabschluss. "
-"Alternativ kÃ¶nnen Sie unten auch eine andere Zahlungsart wÃ€hlen."
-msgstr ""
-"You can do this via the following button or after order completion. "
-"Alternatively, you can choose another payment method below."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/checkout_handlePayment.phtml:28
-#, fuzzy
-msgid "Direkt mit PayPal bezahlen"
-msgstr "Pay with PayPal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_view_afterpayment.phtml:13
-msgid "PaymentID [<a href=\"#1#\">Status Aktualisieren</a>]"
-msgstr "PaymentID [<a href=\"#1#\">Status To update</a>]"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_view_afterpayment.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_view_afterpayment.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_view_afterpayment.phtml:16
-#, fuzzy
-msgid "#1# (#2#)"
-msgstr "Hello #1# #2#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_view_afterpayment.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_view_afterpayment.phtml:25
-msgid "SaleID"
-msgstr "SaleID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_view_afterpayment.phtml:27
-#, fuzzy
-msgid "Zahlung rÃŒckerstatten"
-msgstr "Payment methods"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:14
-msgid "Client ID"
-msgstr "Client id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:16
-msgid "Erhalten Sie im PayPal Account."
-msgstr "Get in the PayPal account."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:15
-msgid ""
-"Erhalten Sie im <a target=\"_blank\" href=\"#1#\">PayPal Developer "
-"Interface</a>."
-msgstr ""
-"Get the <a target=\"_blank\" href=\"#1#\"> PayPal Developer Interface </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:15
-msgid "Secret"
-msgstr "Secret"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:14
-msgid "Sandbox"
-msgstr "Sand box"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:15
-#, fuzzy
-msgid "Client ID (Sandbox)"
-msgstr "Licence (sand box)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:16
-#, fuzzy
-msgid "Secret (Sandbox)"
-msgstr "Licence (sand box)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:36
-#, fuzzy
-msgid "WebHook URL"
-msgstr "Logo url"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:37
-msgid "Beim speichern versuchen den WebHook anzumelden."
-msgstr "When saving try to log in the WebHook."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:30
-msgid "WebHook Anfragen protokollieren"
-msgstr "Log WebHook requests"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:32
-msgid "Absoluter Pfad zur Protokolldatei, Schreibrechte beachten."
-msgstr "Absolute path to the log file, note write permissions."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:19
-msgid "Stornierung bei Statuswechsel"
-msgstr "Cancellation at status change"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:59
-msgid "PayPal fÃŒr neue Bestellungen erlauben"
-msgstr "Allow PayPal for new orders"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:60
-#, fuzzy
-msgid "PayPal Plus aktivieren"
-msgstr "Activate module"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:63
-#, fuzzy
-msgid "Zahlungsauswahl im Warenkorb"
-msgstr "To basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:66
-msgid "PayPal Express aktivieren (Button im Warenkorb)"
-msgstr "Activate PayPal Express (button in shopping cart)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:68
-msgid "SSL fÃŒr ReturnURL erzwingen"
-msgstr "Force SSL for ReturnURL"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:69
-msgid "Return URL"
-msgstr "return url"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:84
-#, fuzzy
-msgid "Warenkorbdetails ÃŒbertragen"
-msgstr "Refresh basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:87
-#, fuzzy
-msgid "Bezeichnung im PayPal Zahlungsinterface"
-msgstr "Description of payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:87
-msgid "Max. 127 Zeichen"
-msgstr "Max. 127 characters"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:88
-msgid "URL fÃŒr ein Logo im PayPal Zahlungsinterface"
-msgstr "URL for a logo in the PayPal payment interface"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:88
-msgid "gif|png|jpg, Max. 190x60"
-msgstr "gif|png|jpg, Max. 190x60"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:89
-#, fuzzy
-msgid "Sprache im PayPal Zahlungsinterface"
-msgstr "Language in PayPal interface"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:92
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:74
-#, fuzzy
-msgid "FranzÃ¶sisch"
-msgstr "French"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:98
-#, fuzzy
-msgid "Betreff fÃŒr Zahlung"
-msgstr "Reference for transfers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/settings_edit.phtml:155
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:46
-#, fuzzy
-msgid "Ausblenden"
-msgstr "Send"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_done.phtml:11
-#, fuzzy
-msgid "Zahlung wurde erfolgreich durchgefÃŒhrt."
-msgstr "Logo has been deleted."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_done.phtml:15
-msgid "Zahlung wurde bereits ausgefÃŒhrt."
-msgstr "Payment has already been made."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_done.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/order_done.phtml:19
-msgid "Zahlung mittels der folgenden Zahlungsoption abschlieÃen"
-msgstr "Complete payment with the following payment option"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_done.phtml:39
-msgid "Um die Zahlung zu starten, klicken Sie bitte auf das PayPal Logo"
-msgstr "Click the Paypal logo to start the payment."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypalapi/order_done.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_done.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_done.phtml:12
-msgid "Mit PayPal bezahlen"
-msgstr "Pay with PayPal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:3
-msgid "Gesonderte Lieferadresse"
-msgstr "Special shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:12
-#, fuzzy
-msgid "Gesonderte Lieferadresse abweichend von der Rechnungsadresse verwenden"
-msgstr ""
-"Allows you to enter a shipping address additional to the billing address."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:103
-msgid "Firma:"
-msgstr "Company:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:112
-msgid "Anrede:"
-msgstr "Salutation:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:125
-msgid "Vorname:"
-msgstr "Forename:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:79
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:206
-#, fuzzy
-msgid "StraÃe, Nr.:"
-msgstr "Street, number:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:91
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:218
-msgid "Postleitzahl:"
-msgstr "Zip code:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:100
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:227
-msgid "Ort:"
-msgstr "City:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:236
-msgid "Land:"
-msgstr "Country:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:39
-#, fuzzy
-msgid "Lieferanschrift bearbeiten"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:85
-#, fuzzy
-msgid "Lieferanschrift Ã€ndern"
-msgstr "Shipping address"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:8
-msgid "Account ID"
-msgstr "Account ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:9
-#, fuzzy
-msgid "Projekt ID"
-msgstr "Project password"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:10
-msgid "AccessKey"
-msgstr "AccessKey"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:12
-#, fuzzy
-msgid "Zahlungs sofort starten"
-msgstr "Start payment immediately"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:13
-msgid "API URL"
-msgstr "api url"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:13
-msgid "Muss im micropaymentâ¢ Interface hinterlegt werden."
-msgstr "Must be deposited in the micropayment â¢ interface."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:16
-msgid "Account (FÃŒr Webmasterbewerbung)"
-msgstr "Account (webmasterrating)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:17
-msgid "Layout"
-msgstr "layout"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:18
-msgid "Hintergrundfarbe"
-msgstr "Background color"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:19
-#, fuzzy
-msgid "Kampagne des Projektinhabers"
-msgstr "Bank account owner"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:20
-msgid "Hintergrundgrafik fÃŒr Zahlfenster"
-msgstr "Background graphic for number windows"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:25
-msgid "CreditCard - Abrechnung per Creditkarte"
-msgstr "CreditCard - Billing via credit card"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:39
-#, fuzzy
-msgid "Zahlungsart \"Kreditkarte\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:44
-msgid "CreditCard - Abrechnung per Creditkarte (Reservierung)"
-msgstr "CreditCard - Billing by credit card (reservation)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:47
-#, fuzzy
-msgid "Zahlungsart \"Kreditkarte mit Reservierung\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:63
-msgid "Lastschrift - Abrechnung per Lastschrift"
-msgstr "Direct debit - Billing by direct debit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:52
-#, fuzzy
-msgid "Zahlungsart \"Lastschrift\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:110
-#, fuzzy
-msgid "Betreff der Zahlung"
-msgstr "Description of payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:81
-msgid "eBank2Pay - Abrechnung per Online Banking"
-msgstr "Call2Pay - Billing by online banking"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:84
-#, fuzzy
-msgid "Zahlungsart \"eBank2Pay\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:100
-msgid "Vorkasse - Abrechnung per Vorkasse"
-msgstr "Call2Pay - Billing by prepayment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:103
-#, fuzzy
-msgid "Zahlungsart \"Vorkasse\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:118
-msgid "Call2Pay - Abrechnung per Anruf / Telefon"
-msgstr "Call2Pay - Billing by phone / call"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:123
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:169
-#, fuzzy
-msgid "Zahlungsart \"Call2Pay\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:136
-msgid ""
-"Bitte beachten Sie, dass es bei der Nutzung von Call2Pay folgende "
-"EinschrÃ€nkungen gibt"
-msgstr "Please note that the following restrictions apply when using Call2Pay"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:138
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:184
-msgid "Nur Abrechnung von telekommunikationsbasierten Mehrwertdiensten mÃ¶glich"
-msgstr "Only billing of telecommunications-based value-added services possible"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:139
-msgid "Preisobergrenze von 30 Euro pro Transaktion"
-msgstr "Price cap of 30 euros per transaction"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:140
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:186
-msgid "National und international KEINE einheitliche GebÃŒhrenstruktur"
-msgstr "National and international NO uniform fee structure"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:141
-msgid "Teilweise abweichende Preise aus dem Mobilfunknetz"
-msgstr "Partially different prices from the mobile network"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:144
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:189
-msgid ""
-"Sollten Sie sich unsicher sein, ob Sie diese Zahlarten nutzen kÃ¶nnen oder "
-"dÃŒrfen, melden Sie sich einfach bei uns!"
-msgstr ""
-"If you are unsure about whether you can or can use these payment methods, "
-"please contact us!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:191
-msgid "Ansprechpartner"
-msgstr "contact person"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:147
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:192
-msgid "Telefon (Festnetz)"
-msgstr "phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:148
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:193
-#, fuzzy
-msgid "eMail"
-msgstr "Email"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:149
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:194
-msgid "Stichwort"
-msgstr "keyword"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:152
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:197
-msgid "Ich habe einen entsprechenden Account und kann die Zahlungsart nutzen."
-msgstr "I have a corresponding account and can use the payment method."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:163
-msgid "HandyPay - Abrechnung per SMS / Tan"
-msgstr "HandyPay - Billing via SMS / Tan"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:182
-msgid ""
-"Bitte beachten Sie, dass es bei der Nutzung von HandyPay folgende "
-"EinschrÃ€nkungen gibt"
-msgstr "Please note that the following restrictions apply when using HandyPay"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/settings_edit.phtml:185
-msgid "Preise nicht frei tarifierbar, nur vorgegebene Tarifstruktur nutzbar"
-msgstr ""
-"Prices can not be freely tariffed, only specified tariff structure can be "
-"used"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/order_done.phtml:8
-#, fuzzy
-msgid "Klicken Sie auf das folgende Logo um ihre Bestellung zu bezahlen."
-msgstr "Click on the logo to pay using Skrill (Moneybookers)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:28
-msgid ""
-"Bitte geben Sie ihre Kreditkarteninformationen (Kartennummer, "
-"GÃŒltigkeitsdatum und PrÃŒfnummer) in folgende Felder ein. Die Daten werden an "
-"Micropayment ÃŒbermittelt und nicht durch uns gespeichert oder ausgewertet."
-msgstr ""
-"Please enter your credit card information (card number, expiry date and "
-"verification number) in the following fields. The data will be transmitted "
-"to Micropayment and not stored or evaluated by us."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:401
-#, fuzzy
-msgid "Kreditkartennummer"
-msgstr "Customer id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:36
-msgid "Kreditkarte - Vorderseite"
-msgstr "Creditcard - Frontside"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:37
-msgid "Max Mustermann"
-msgstr "Max Mustermann"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:55
-msgid "Kreditkarte - RÃŒckseite"
-msgstr "Creditcard - Backsite"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:57
-msgid "HC600214C"
-msgstr "HC600214C"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:58
-msgid "Unterschrift Max Mustermann"
-msgstr "Signature Max Mustermann"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:59
-#, fuzzy
-msgid "PrÃŒfnummer"
-msgstr "Fax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:62
-#, fuzzy
-msgid "Zahlung starten"
-msgstr "Payment methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:92
-#, fuzzy
-msgid "Vielen Dank fÃŒr Ihre Zahlungsreservierung."
-msgstr "thank you for your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_micropayment/order_done.phtml:109
-#, fuzzy
-msgid "Unerwarteter Serverfehler!"
-msgstr "Unexpected exception!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:60
-#, fuzzy
-msgid "Betreff der Ãberweisung"
-msgstr "Reference for transfers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/settings_edit.phtml:69
-msgid "Sprache im PayPal Interface"
-msgstr "Language in PayPal interface"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_paypal/order_done.phtml:9
-msgid ""
-"Um den Betrag mit PayPal zu bezahlen klicken Sie bitte auf folgendes Logo."
-msgstr "To pay your order using PayPal please click on the following logo."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:146
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:146
-#, fuzzy
-msgid "Sind Sie sich sicher, dass sie diese Staffel entfernen mÃ¶chten?"
-msgstr "Are you sure you want to install this module?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:169
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:169
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:30
-#, fuzzy
-msgid "Staffelpreise"
-msgstr "Grading"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:176
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:175
-#, fuzzy
-msgid ""
-"Staffelpreise kÃ¶nnen erst nach einmaligem Speichern des Produktes definiert "
-"werden."
-msgstr "To create a variant you need to save the product a first time."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:179
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:178
-msgid "Staffelpreise aktiv"
-msgstr "Graduated prices active"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:183
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:10
-msgid "BezugsgrÃ¶Ãe"
-msgstr "Allocation base"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:193
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:192
-#, fuzzy
-msgid "Ersetzung"
-msgstr "Translations"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:194
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:193
-#, fuzzy
-msgid "Addition"
-msgstr "Action"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml:203
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_edit_allgemein.phtml:204
-#, fuzzy
-msgid "Zur Konfiguration der Staffelpreise"
-msgstr "Email configuration was saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:10
-msgid "Preisgrenzen"
-msgstr "Price limits"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/scaleList.phtml:75
-#, fuzzy
-msgid "Neue Preisgrenze"
-msgstr "New variant"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:14
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der "
-"Menge wie folgt:"
-msgstr ""
-"The product has a staggered price, this results from the quantity as follows:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:16
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des "
-"Gewichts wie folgt:"
-msgstr ""
-"The product has a staggered price, which results from the weight as follows:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:22
-msgid "Bis "
-msgstr "to"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:28
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:42
-#, fuzzy
-msgid " kostet das Produkt "
-msgstr "Ordered products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:43
-#, fuzzy
-msgid "je StÃŒck"
-msgstr "Item price"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:36
-msgid "Ab "
-msgstr "from"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:50
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der "
-"Menge. FÃŒr weitere Informationen loggen Sie sich bitte ein."
-msgstr ""
-"The product has a staggered price, this is based on the amount. For more "
-"information, please log in."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_scaleprice/product_bottom.phtml:52
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des "
-"Gewichts. FÃŒr weitere Informationen loggen Sie sich bitte ein."
-msgstr ""
-"The product has a staggered price, this results from the weight. For more "
-"information, please log in."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/order_view_sidebar.phtml:9
-#, fuzzy
-msgid "Trusted Shps"
-msgstr "Protected Shops"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/order_view_sidebar.phtml:11
-msgid "Einwilligung"
-msgstr "consent"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/order_view_sidebar.phtml:15
-msgid ""
-"Der Kunde erhÃ€lt eine Mail mit einem Link zur Bewertung der Bestellung. Sind "
-"Sie sich sicher?"
-msgstr ""
-"The customer receives an email with a link to the evaluation of the order. "
-"Are you sure?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/order_view_sidebar.phtml:15
-#, fuzzy
-msgid "E-Mail mit Bewertungslink senden"
-msgstr "Send email to customer."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail_html.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail.phtml:12
-msgid ""
-"wir hoffen Sie waren mit dem Bestellablauf zufrieden, um unseren Service und "
-"unsere Dienstleistung zu verbessern kÃ¶nnen Sie uns ÃŒber Trusted Shops "
-"bewerten. Dies kÃ¶nnen Sie kostenlos unter folgendem Link durchfÃŒhren: "
-msgstr ""
-"we hope you were satisfied with the order process, to improve our service "
-"and our service you can rate us through Trusted Shops. You can do this for "
-"free under the following link:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/mail_html.phtml:12
-#, fuzzy
-msgid "Bewertung durchfÃŒhren"
-msgstr "Execute import"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/widget_form.phtml:10
-#, fuzzy
-msgid "Bewertungen anzeigen"
-msgstr "Show order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/widget_form.phtml:14
-#, fuzzy
-msgid "Badge anzeigen"
-msgstr "Show all"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/widget_form.phtml:20
-msgid ""
-"Die weitere Konfiguration des Widgets erfolgt in den <a href=\"#1#"
-"\">Moduleinstellungen.</a>"
-msgstr ""
-"Further configuration of the widget is done in the <a href=\"#1#\"> module "
-"settings </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/widget.phtml:49
-msgid "Klicken Sie auf das GÃŒtesiegel, um die GÃŒltigkeit zu prÃŒfen!"
-msgstr "Click on the seal of quality to check the validity!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/checkout_customer_inner.phtml:10
-msgid ""
-"Ich bin damit einverstanden, eine separate und unverbindliche "
-"Bewertungsaufforderung (<a href=\"https://www.trustedshops.com/\" target="
-"\"_blank\">Trusted Shops</a>) per Mail zu erhalten."
-msgstr ""
-"I agree to receive a separate and non-binding evaluation request (<a href="
-"\"https://www.trustedshops.com/\" target=\"_blank\"> Trusted Shops </a>) via "
-"email."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:9
-msgid "Shop-ID"
-msgstr "Shop-ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:10
-msgid "Abfrage Bewertungseinwilligung (im Checkout)"
-msgstr "Query assessment approval (in checkout)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:13
-msgid "Als Vorauswahl aktiv"
-msgstr "Active as preselection"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:22
-msgid "Trusted Shops Widget"
-msgstr "Trusted Shops Widget"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:24
-msgid "Bewertungslinks"
-msgstr "Rating links"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:25
-msgid "Review Collector"
-msgstr "Review Collector"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:30
-msgid "Bewertungsbild zwischenspeichern (empfohlen)"
-msgstr "Cache rating image (recommended)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:31
-#, fuzzy
-msgid "Titel des Bewertungsbildes"
-msgstr "Width of preview picture"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:35
-msgid ""
-"Das Trusted Shops Widget muss in einen <a href=\"#1#\">Widgetbereich</a> "
-"eingefÃŒgt werden."
-msgstr ""
-"The Trusted Shops widget must be inserted into a <a href=\"#1#\"> widget "
-"area </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:36
-#, fuzzy
-msgid "Vorschau:"
-msgstr "Preview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:44
-#, fuzzy
-msgid "Link zur Bewertung"
-msgstr "Payment link"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:63
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:75
-msgid "Nur anzeigen, wenn Kunde bewerten mÃ¶chte"
-msgstr "Show only if customer wants to rate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:49
-msgid "Titel des Links"
-msgstr "link title"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:54
-msgid "Trusted Shops KÃ€uferschutz (Garantie)"
-msgstr "Trusted Shops Buyer Protection (Warranty)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:60
-msgid "Link zur Bewertung in Kundenmail nach Bestellabschluss"
-msgstr "Link to the evaluation in customer mail after order completion"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:65
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:77
-msgid "Text des Links"
-msgstr "link text"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:72
-msgid "Link zur Bewertung in Rechnungsmail"
-msgstr "Link to the evaluation in invoice mail"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:91
-#, fuzzy
-msgid "Nach"
-msgstr "After id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:93
-#, fuzzy
-msgid "Tagen"
-msgstr "Days"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:97
-#, fuzzy
-msgid "Erinnerung"
-msgstr "Sorting"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:114
-#, fuzzy
-msgid "BestellzustÃ€nde"
-msgstr "Orders"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:118
-msgid "Letzter Export"
-msgstr "last Export"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:127
-msgid "CSV-Export-Datei erstellen"
-msgstr "Create a CSV export file"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:129
-#, fuzzy
-msgid "Derzeit keine Daten zum Export verfÃŒgbar."
-msgstr "No data available for export."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_trustedshops/settings_edit.phtml:137
-msgid "Trusted Shops Review Collector"
-msgstr "Trusted Shops Review Collector"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/priceinfo.phtml:21
-msgid "(#1# / #2#)"
-msgstr "(#1# / #2#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:20
-msgid "Zur Konfiguration des FÃŒllmengenmoduls"
-msgstr "For configuration of the filling quantity module"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:9
-msgid "MÃ¶gliche Einheiten (Kommagetrennt)"
-msgstr "Possible units (separated with comma)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:15
-msgid "FÃŒllmenge auf ProduktÃŒbersichtsseiten anzeigen"
-msgstr "Show fill quantity on product views"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_fuellmenge/settings_edit.phtml:16
-msgid "Grundpreis auf ProduktÃŒbersichtsseiten anzeigen"
-msgstr "Show base price on product views"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_row.phtml:10
-#, fuzzy
-msgid "Upload zum Produkt"
-msgstr "Switch to product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_after.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_after.phtml:59
-#, fuzzy
-msgid "Bitte warten "
-msgstr "Please wait..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_after.phtml:45
-#, fuzzy
-msgid "Fehler"
-msgstr "Error page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/product_addedit_content.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:25
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:322
-#, fuzzy
-msgid "Bestellupload"
-msgstr "Order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/product_addedit_content.phtml:13
-#, fuzzy
-msgid "Bestellupload ermÃ¶glichen"
-msgstr "Delete order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/product_addedit_content.phtml:17
-msgid "Maximale Anzahl an Uploads"
-msgstr "Maximum number of uploads"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/checkout_inner_prebutton.phtml:10
-msgid "Dateiupload:"
-msgstr "file upload"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/checkout_inner_prebutton.phtml:31
-msgid "Bisher hochgeladene Dokumente"
-msgstr "Previously uploaded documents"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/checkout_inner_prebutton.phtml:36
-#, fuzzy
-msgid ""
-"Sind Sie sich sicher, dass Sie dieses Dokument aus der Bestellung entfernen "
-"mÃ¶chten?"
-msgstr "Are you sure you want to cancel this order?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/checkout_inner_prebutton.phtml:50
-msgid "Es stehen Ihnen #1# Mb von #2# Mb fÃŒr den Upload zur VerfÃŒgung"
-msgstr "There are # 1 # Mb of # 2 # Mb available for upload"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/order_view_row.phtml:11
-#, fuzzy
-msgid "Produktuploads"
-msgstr "Price of product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:11
-#, fuzzy
-msgid "Upload-typ"
-msgstr "Upload"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:12
-#, fuzzy
-msgid "Upload pro Bestellung"
-msgstr "One line per order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:13
-#, fuzzy
-msgid "Upload pro Produkt"
-msgstr "Downloadable product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:17
-#, fuzzy
-msgid "Neuer Dateiname"
-msgstr "Filename"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:20
-#, fuzzy
-msgid "Erlaubte Endungen (kommagetrennt)"
-msgstr "Possible units (separated with comma)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:25
-msgid "maximale GrÃ¶Ãe des Uploads (Angaben in MB)"
-msgstr "maximum size of the upload (in MB)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:26
-msgid "Text bei Ãberschreiten der max. Uploadgrenze"
-msgstr "Text when exceeding the max. Upload limit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:30
-#, fuzzy
-msgid "Mehr als eine Datei erlauben"
-msgstr "Allow more than one product in basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:35
-msgid "Upload ist kein Pflichtfeld"
-msgstr "Upload is not required"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:38
-msgid "Upload als Anhang an Adminmail"
-msgstr "Upload as an attachment to Adminmail"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/settings_edit.phtml:42
-msgid "Datei(en) als Zip anhÃ€ngen"
-msgstr "Attach file (s) as Zip"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_row_upload_target.phtml:13
-msgid "Upload entfernen."
-msgstr "delete upload"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_orderupload/basket_row_upload_target.phtml:28
-msgid "Hochladen"
-msgstr "Upload"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml:12
-#, fuzzy
-msgid "Warenkorbteaserprodukt"
-msgstr "Basket page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml:16
-#, fuzzy
-msgid "Von"
-msgstr "from"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml:17
-msgid "Bis"
-msgstr "to"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml:21
-msgid "Zur Konfiguration des Warenkorbteasers"
-msgstr "configuration basketteaser"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/settings_edit.phtml:8
-#, fuzzy
-msgid "Anzeige"
-msgstr "Display"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/settings_edit.phtml:8
-#, fuzzy
-msgid "Unter dem Warenkorb"
-msgstr "Into basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/settings_edit.phtml:8
-#, fuzzy
-msgid "Im Warenkorb"
-msgstr "in your basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_basketteaser/settings_edit.phtml:9
-#, fuzzy
-msgid "Template fÃŒr die Produkte im Warenkorb"
-msgstr "No products in your basket."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:8
-#, fuzzy
-msgid "VerkÃ€ufer-ID"
-msgstr "Number of sales"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:10
-msgid "Verwendungszweck fÃŒr Zahlungen"
-msgstr "Purpose for payments"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:34
-msgid "GiroCheckout - giropay"
-msgstr "GiroCheckout - giropay"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:37
-msgid "GiroCheckout - Kreditkarte"
-msgstr "GiroCheckout - Creditcard"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:40
-msgid "GiroCheckout - Lastschrift"
-msgstr "GiroCheckout - direct debit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:25
-#, fuzzy
-msgid "Zahlungsart \"giropay\" aktiv"
-msgstr "Activate \"Cash payment\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:26
-msgid "Projekt-ID fÃŒr giropay"
-msgstr "giropay Projekt-ID "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:54
-#, fuzzy
-msgid "Projekt-Passwort"
-msgstr "Project password"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:40
-msgid "Projekt-ID fÃŒr Kreditkarte"
-msgstr "Project-id for creditcard"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_giropay/settings_edit.phtml:53
-#, fuzzy
-msgid "Projekt-ID fÃŒr Lastschrift"
-msgstr "Project password"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:11
-msgid "AuflÃ¶sung: 95x65 Pixel (GIF/JPG/PNG)"
-msgstr "95x65 Pixel (GIF/JPG/PNG)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:13
-#, fuzzy
-msgid "Kunden ID"
-msgstr "CustomerID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:11
-#, fuzzy
-msgid "Shop ID"
-msgstr "Shop Team"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:24
-msgid "Pfund Sterling"
-msgstr "Pound sterling"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:25
-msgid "US Dollar"
-msgstr "US Dollar"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:35
-#, fuzzy
-msgid "VerfÃŒgbare Zahlungsarten"
-msgstr "Payment methods"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:66
-msgid "Adressdaten an wirecard ÃŒbermitteln?"
-msgstr "Send address data to wirecard?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:67
-#, fuzzy
-msgid "Minimaler Betrag bei Rechnungskauf"
-msgstr "Email for invoice copy"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:68
-#, fuzzy
-msgid "Maximaler Betrag bei Rechnungskauf"
-msgstr "Email for invoice copy"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:70
-#, fuzzy
-msgid "Sprache innerhalb wirecard"
-msgstr "Update within the database"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:77
-#, fuzzy
-msgid "Bestellbeschreibung"
-msgstr "Description"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:80
-msgid "Seite bei Abbruch"
-msgstr "Page at demolition"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:82
-msgid "Seite bei keinem Ergebnis"
-msgstr "Page for no result"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:83
-msgid "IFrame"
-msgstr "IFrame"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:83
-msgid "Popup"
-msgstr "Popup"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/settings_edit.phtml:83
-#, fuzzy
-msgid "Weiterleitung"
-msgstr "Continue"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/order_done.phtml:19
-#, fuzzy
-msgid "Zahlung mit wirecard"
-msgstr "Payment accepted"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/order_done.phtml:27
-msgid ""
-"Sollte sich kein Fenster fÃŒr die Zahlung Ã¶ffnen liegt dies mÃ¶glicherweise an "
-"Ihrem PopUp Blocker. Klicken sie <a href=\"#\" onclick="
-"\"wirecard_openPopup(); return false\">hier</a> um das Fenster erneut zu "
-"Ã¶ffnen."
-msgstr ""
-"If no window opens for payment, this may be due to your PopUp Blocker. Click "
-"<a href=\"#\" onclick=\"wirecard_openPopup(); return false\"> here </a> to "
-"reopen the window."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_wirecard/order_done.phtml:32
-#, fuzzy
-msgid "Zahlung mit wirecard starten."
-msgstr "Start payment immediately"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/settings_edit.phtml:75
-msgid ""
-"Die verfÃŒgbaren Zahlungsarten mÃŒssen mit <a href=\"http://www.iw-systeme.de"
-"\">IW Systeme</a> vereinbart werden."
-msgstr ""
-"The available payment methods must be agreed with <a href=\"http://www.iw-"
-"systeme.de\"> IW Systems </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_securepay/order_done.phtml:16
-#, fuzzy
-msgid ""
-"SecurePay Zahlung konnte nicht gestartet werden, wenden Sie sich an den "
-"Betreiber des Shops."
-msgstr ""
-"Unfortunately your payment could not be handled using Billsafe. Please "
-"contact the shop support team to arrange an alternative payment way."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:67
-msgid "Bitte einen Betreff angeben!"
-msgstr "Please enter a subject!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:75
-msgid "Bitte einen Text angeben!"
-msgstr "Please enter a text!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:102
-msgid "Mail konnte nicht versendet werden es ist ein Fehler aufgetreten!"
-msgstr "Mail could not be sent due to an error!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:118
-msgid "Mail wurde erfolgreich an den Kunden gesendet."
-msgstr "Mail has been sent to the customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:133
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:19
-msgid "Kundenkontakt"
-msgstr "Customer contact"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:155
-#, fuzzy
-msgid "Text (HTML)"
-msgstr "Text field (RTE)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:168
-msgid "Absenden"
-msgstr "Send"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:178
-#, fuzzy
-msgid "SMS Versand"
-msgstr "Shipping"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:195
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:149
-msgid "Die Telefonnummer #1# ist gÃŒltig."
-msgstr "The phone number # 1 # is valid."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:201
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:155
-#, fuzzy
-msgid "Die Telefonnummer #1# ist nicht gÃŒltig."
-msgstr "This voucher code is not valid!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/order_view.phtml:215
-#, fuzzy
-msgid "SMS Senden"
-msgstr "Send"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:9
-msgid "wpShopGermany: Zahlungsaufforderung"
-msgstr "wpShopGermany: Application for payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:22
-msgid ""
-"Sie sind Ihren Zahlungsverpflichtungen nicht nachgekommen. Bitte begleichen "
-"Sie umgehend den Rechnungsbetrag von"
-msgstr ""
-"You have not fulfilled your existing payment obligations. Please pay "
-"immediately the invoice amount of"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:27
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:30
-msgid ""
-"Nutzen Sie bitte folgenden Link um den Zahlvorgang abschlieÃen zu kÃ¶nnen"
-msgstr "Please use the following link to complete the payment process"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:9
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:10
-msgid "wpShopGermany: Zahlungserinnerung"
-msgstr "wpShopGermany: Payment reminder"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:21
-msgid "Sie haben am"
-msgstr "On"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:21
-msgid "eine Bestellung ÃŒber"
-msgstr "you have ordered products for"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:24
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:21
-msgid ""
-"aufgegeben. Leider ist bis heute kein Zahlungsausgleich erfolgt. Gab es "
-"Probleme mit der Zahlung? Gerne helfen wir Ihnen weiter! Oder dÃŒrfen wir die "
-"Bestellung fÃŒr Sie stornieren?"
-msgstr ""
-". Unfortunately we did not receive any payment yet. Do you have trouble with "
-"your payment? We would be pleased to help you in this matter! Or do you want "
-"to cancel your order?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:11
-msgid "SMS Flatrate Dienst nutzen"
-msgstr "use SMS Flatrate "
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:15
-msgid "URL Endpunkt"
-msgstr "URL Endpoint"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:16
-#, fuzzy
-msgid "SchlÃŒssel"
-msgstr "SALT key"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:18
-msgid "Feld d / \"type\""
-msgstr "Field d / \"type\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:19
-msgid "Feld e / \"status\""
-msgstr "Field d / \"status\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:20
-msgid "Feld f / \"reply\""
-msgstr "Field d / \"reply\""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_kundenkontakt/settings_edit.phtml:21
-msgid "Feld g / \"replytomail\""
-msgstr "Field g / \"replytomail\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar.phtml:105
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1254
-#, fuzzy
-msgid "Downloadplus"
-msgstr "Downloads"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:15
-#, fuzzy
-msgid "Sind sie sich sicher, dass sie die Datei lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this variation?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:80
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:288
-#, fuzzy
-msgid "DownloadPlus Produkt"
-msgstr "Downloadable product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml:107
-msgid "Zur Konfiguration des DownloadPlus-Moduls"
-msgstr "To configure the DownloadPlus module"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail_html.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail.phtml:10
-msgid "Es wurden PDFs von folgenden Bestellungen individualisiert:"
-msgstr "PDFs have been customized by the following orders:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail_html.phtml:17
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail.phtml:13
-#, fuzzy
-msgid "Bestellung ##1#: #2# Dateien"
-msgstr "Orders (#1# data sets)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail_html.phtml:20
-#, fuzzy
-msgid "Links versenden"
-msgstr "Item(s) shipped"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml:12
-#, fuzzy
-msgid "hiermit erhalten Sie die Downloadlinks fÃŒr Ihre gekauften PDFs:"
-msgstr "hereby you get a copy of your credit voucher"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/cronmail.phtml:15
-msgid "Links versenden: "
-msgstr "send link"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:20
-#, fuzzy
-msgid "Datei"
-msgstr "Filename"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:45
-#, fuzzy
-msgid "Noch nicht geplant."
-msgstr "Not scheduled"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:47
-#, fuzzy
-msgid "Geplant am #1#"
-msgstr "Scheduled for #1#."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:49
-msgid "DurchgefÃŒhrt am #1#"
-msgstr "Performed on # 1 #"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:55
-msgid "Planen"
-msgstr "to plan"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:64
-#, fuzzy
-msgid "Fertige Downloads an Kunden senden"
-msgstr "Send email to customer."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:65
-msgid "Alle Dokumente neu planen"
-msgstr "Reschedule all documents"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml:66
-msgid "ZÃ€hler zurÃŒcksetzen"
-msgstr "reset counter"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:14
-#, fuzzy
-msgid "Info / Hilfe"
-msgstr "Information page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:20
-msgid "Personalisierter Dateiname"
-msgstr "Personalized file name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:21
-#, fuzzy
-msgid "Individualisierung planen"
-msgstr "Load JavaScript validation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:21
-#, fuzzy
-msgid "Nach Zahlung"
-msgstr "When paying"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:21
-#, fuzzy
-msgid "Nach Bestellung"
-msgstr "Order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:22
-msgid "PDFs nach Individualisierung sofort senden"
-msgstr "Immediately send PDFs after customization"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:24
-#, fuzzy
-msgid " Mehr als ein Produkt im Warenkorb zulassen"
-msgstr "Allow more than one product in basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:25
-#, fuzzy
-msgid "GÃŒltigkeit von Links"
-msgstr "Valid till"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:25
-msgid "Unbegrenzt"
-msgstr "unlimited"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:25
-#, fuzzy
-msgid "Nach Downloads"
-msgstr "Downloads"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:25
-#, fuzzy
-msgid "Nach Tagen"
-msgstr "Cash on delivery "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:28
-#, fuzzy
-msgid "GÃŒltigkeit in Tagen"
-msgstr "Due date in days"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:32
-msgid "Anzahl an mÃ¶glichen Downloads"
-msgstr "Number of possible downloads"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:35
-msgid "Abgelaufene Downloads bereinigen"
-msgstr "Clean up expired downloads"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:36
-msgid "Downloads nach X Tagen lÃ¶schen"
-msgstr "Delete downloads after X days"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:37
-msgid "Pfad fÃŒr die PDFs der Produkte"
-msgstr "Path for the PDFs of the products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:37
-msgid "Standard: uploads/wpsg/wpsg_pdfprodukte/"
-msgstr "Default: uploads / wpsg / wpsg_pdfproducts /"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:38
-msgid "Pfad fÃŒr die Individualisierten PDFs"
-msgstr "Path for the individualized PDFs"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:38
-msgid "Standard: uploads/wpsg/wpsg_pdfprodukte_order/"
-msgstr "Default: uploads / wpsg / wpsg_pdfproduct_order /"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:39
-#, fuzzy
-msgid "Auslieferungsformat"
-msgstr "Compressed delivery"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:39
-msgid "Direkt"
-msgstr "direct"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:39
-#, fuzzy
-msgid "Gezippt (intern)"
-msgstr "Compressed delivery"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:40
-#, fuzzy
-msgid "Anpassung"
-msgstr "Fit in"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:40
-msgid "Gesamtes Dokument"
-msgstr "Entire document"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:40
-#, fuzzy
-msgid "Bereich"
-msgstr "Calculation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:43
-msgid "Anpassung ab Seite"
-msgstr "Adaptation from page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:44
-msgid "Anpassung bis Seite"
-msgstr "Adaptation to page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:47
-msgid "Passwort (Um Schutz aufzuheben)"
-msgstr "Password (to remove protection)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:48
-msgid "Passwort (Um Dokument Ã¶ffnen zu kÃ¶nnen)"
-msgstr "Password (to open document)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:50
-#, fuzzy
-msgid "Speichern erlauben"
-msgstr "Save"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:50
-#, fuzzy
-msgid "Dokumentenberechtigung"
-msgstr "Authorizations"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:51
-msgid "Drucken erlauben"
-msgstr "Allow printing"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:52
-msgid "Modifizieren erlauben"
-msgstr "Allow modification"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:53
-#, fuzzy
-msgid "Bemerkungen erlauben"
-msgstr "Customer comment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:58
-msgid "Mail fÃŒr Individualisierungsbericht"
-msgstr "Mail for personalization report"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:62
-#, fuzzy
-msgid "Mail fÃŒr Downloads an Kunden"
-msgstr "Mail to customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:64
-#, fuzzy
-msgid "Noch nicht ausgefÃŒhrt"
-msgstr "Not scheduled"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:66
-msgid "Letzte AusfÃŒhrung des Crons"
-msgstr "Last execution of the cron"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:140
-msgid "Hier kÃ¶nnen Sie die Zeile deaktivieren/aktivieren."
-msgstr "Here you can deactivate / activate the line."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:165
-msgid "Versuche Speicherlimit hochzusetzen"
-msgstr "Try to increase memory limit"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:166
-msgid "Versuche die AusfÃŒhrungszeit hochzusetzen"
-msgstr "Try to raise the execution time"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:167
-#, fuzzy
-msgid "Format der Downloadnummer"
-msgstr "Format customer id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:168
-msgid "Downloadnummer Startnummer"
-msgstr "Downloadnumber startnumber"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:169
-msgid "Angepasste Dokumente als Anhang versenden"
-msgstr "Send customized documents as attachments"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:176
-msgid ""
-"Das Downloadplus Modul ist eine erweiterung des Downloadprodukt Moduls und "
-"ermÃ¶glicht das Individualisieren von PDF Dokumenten."
-msgstr ""
-"The Downloadplus module is an extension of the download product module and "
-"allows the individualization of PDF documents."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:179
-msgid ""
-"Weitere Informationen erhalten Sie auf der <a href=\"http://wpshopgermany."
-"de/?p=1426\">Hilfe Seite</a> oder in unserem <a href=\"http://forum."
-"maennchen1.de\">Support Forum</a>."
-msgstr ""
-"For more information, please visit the <a href=\"http://wpshopgermany.de/?"
-"p=1426\"> Help Page </a> or our <a href=\"http://forum.maennchen1.de\"> "
-"Support Forum </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:183
-msgid "Eintrag in der Crontab:"
-msgstr "Entry in the Crontab:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/settings_edit.phtml:189
-msgid "HTTP Aufruf des Cron Scriptes:"
-msgstr "HTTP call of the cron script:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/filelist.phtml:9
-#, fuzzy
-msgid "Bisher keine PDFs hochgeladen."
-msgstr "No file uploaded yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_downloadplus/filelist.phtml:16
-#, fuzzy
-msgid "PDF lÃ¶schen"
-msgstr "delete"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_debitpayment/settings_edit.phtml:13
-msgid "Rabatt/GebÃŒhr"
-msgstr "Discount\\charge"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:13
-msgid "Produktauswahl"
-msgstr "Product choice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:22
-msgid "EinfÃŒgen und schlieÃen"
-msgstr "Paste and close"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:33
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_relatedproducts.class.php:24
-msgid "ZubehÃ¶rprodukte"
-msgstr "Related products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:67
-#, fuzzy
-msgid "Neues Produkt zuordnen"
-msgstr "Assign new product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:67
-#, fuzzy
-msgid "Produkt zuordnen"
-msgstr "Assign new product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml:71
-msgid "Zur Konfiguration der ZubehÃ¶rprodukte"
-msgstr "For configuration of accessory products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/basket_after.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/ajaxDialog.phtml:83
-msgid "Das kÃ¶nnte Ihnen auch gefallen:"
-msgstr "You May Also Like:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/list.phtml:10
-msgid "Noch keine Produkte zugeordnet"
-msgstr "No products assigned"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/relatedproducts.phtml:8
-msgid "Ãhnliche Produkte"
-msgstr "Related products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:8
-#, fuzzy
-msgid "Produkttemplate fÃŒr die ZubehÃ¶rprodukte"
-msgstr "Template for sold out products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:9
-msgid "Synchrone VerknÃŒpfung der Produkte"
-msgstr "Synchronous linking of the products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:11
-#, fuzzy
-msgid "ZubehÃ¶rprodukte im Warenkorb anpreisen"
-msgstr "Products in basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:11
-msgid ""
-"Wird unterhalb des Warenkorbes dargestellt. Alternativ kann "
-"[wpsg_relatedproducts_basket limit=\"5\"] verwendet werden."
-msgstr ""
-"Is shown below the basket. Alternatively, [wpsg_relatedproducts_basket limit "
-"= \"5\"] can be used."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:19
-msgid "Maximale Anzahl an angezeigten Produkten"
-msgstr "Maximum number of products displayed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:14
-#, fuzzy
-msgid "Template fÃŒr die ZubehÃ¶rprodukte im Warenkorb"
-msgstr "No products in your basket."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:17
-#, fuzzy
-msgid "ZubehÃ¶rprodukte im Warenkorb-Lightbox anpreisen"
-msgstr "Allow more than one product in basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_relatedproducts/settings_edit.phtml:20
-msgid "Tempalte fÃŒr die ZubehÃ¶rprodukte in der Lightbox"
-msgstr "Tempalte for the accessory products in the lightbox"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:9
-#, fuzzy
-msgid ""
-"Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto "
-"und geben Sie als Betreff <strong>#2#</strong> an."
-msgstr ""
-"Please transfer the invoice amount of #1# to the following account and enter "
-"as reference \"#2#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:39
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:46
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:43
-msgid "Bank"
-msgstr "Bank"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail_html.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail.phtml:14
-msgid "BIC-/SWIFT-Code"
-msgstr "BIC-/SWIFT-Code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail.phtml:9
-#, fuzzy
-msgid ""
-"Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto "
-"und geben Sie als Betreff \"#2#\" an."
-msgstr ""
-"Please transfer the invoice amount of #1# to the following account and enter "
-"as reference \"#2#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/mail.phtml:15
-#, fuzzy
-msgid "Betreff: #1#"
-msgstr "Subject"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:13
-msgid "Betreff fÃŒr Ãberweisungen"
-msgstr "Reference for transfers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/settings_edit.phtml:24
-msgid "BIC-/SWIFT Code"
-msgstr "BIC-/SWIFT Code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:10
-msgid ""
-"Sie haben die Zahlungsart \"Vorkasse\" gewÃ€hlt. Ãberweisen Sie daher den "
-"Rechnungsbetrag von #1# auf folgendes Konto:"
-msgstr ""
-"You chose the payment method \"Prepayment\". Please transfer the invoice "
-"amount of #1# to the following account:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:12
-msgid "Kontoinhaber: #1#"
-msgstr "Bank account owner: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:13
-msgid "IBAN: #1#"
-msgstr "IBAN: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:14
-msgid "Bank: #1#"
-msgstr "Bank: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:15
-msgid "BIC-/SWIFT-Code: #1#"
-msgstr "BIC-/SWIFT-Code: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:17
-msgid "Bitte als Betreff angeben: \"#1#\""
-msgstr "Please enter as reference: \"#1#\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_prepayment/order_done.phtml:20
-#, fuzzy
-msgid ""
-"Wenn Ihre Banking-App Girocode unterstÃŒtzt, kÃ¶nnen Sie diesen QRCode scannen."
-msgstr "If you have a voucher you can cash it here."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:35
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:178
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:192
-msgid "Sortierung:"
-msgstr "Sort after:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:37
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:180
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:194
-msgid "Preis (Kleinster zuerst)"
-msgstr "Price (lowest first)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:38
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:181
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:195
-msgid "Preis (GrÃ¶Ãter zuerst)"
-msgstr "Price (highest first)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:39
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:182
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:196
-msgid "Name Aufsteigend"
-msgstr "Name ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:40
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:183
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:197
-msgid "Name Absteigend"
-msgstr "Name descending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:41
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:184
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:198
-#, fuzzy
-msgid "Position Aufsteigend"
-msgstr "ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:199
-#, fuzzy
-msgid "Position Absteigend"
-msgstr "descending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:186
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:199
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:200
-#, fuzzy
-msgid "Erstellungsdatum (Ãlteste zuerst)"
-msgstr "Creation date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:43
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:187
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:46
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:201
-#, fuzzy
-msgid "Erstellungsdatum (Neueste zuerst)"
-msgstr "Creation date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:44
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:188
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:47
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:202
-#, fuzzy
-msgid "Artikelnummer Aufsteigend"
-msgstr "Item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:45
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:189
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:48
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:203
-#, fuzzy
-msgid "Artikelnummer Absteigend"
-msgstr "Item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:52
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:196
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:210
-msgid "Seite:"
-msgstr "Page:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:59
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:203
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:217
-msgid "Zu Seite #1# wechseln"
-msgstr "Switch to page #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:69
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:70
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:213
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:214
-msgid "Zur Gitteransicht wechseln."
-msgstr "Switch to grid view."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:84
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:91
-#, fuzzy
-msgid "Zur Detailseite des Produktes"
-msgstr "Swtich to detail page of the product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:95
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:106
-msgid "Gewicht: #1#"
-msgstr "Weight: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:97
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:108
-msgid "Gewicht: ab #1#"
-msgstr "Weight: from #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:106
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:117
-msgid "FÃŒllmenge: #1#"
-msgstr "Fill quantity: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:109
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:120
-msgid "Grundpreis: #1# / #2#"
-msgstr "Base price: #1# / #2#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:120
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:132
-#, fuzzy
-msgid "Lagerbestand: #1#"
-msgstr "Stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:126
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:161
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:99
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:168
-msgid "Zur Detailseite des Produkts"
-msgstr "Swtich to detail page of the product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:136
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:142
-msgid "ab #1#"
-msgstr "from #1#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:153
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:159
-msgid "Preise nur fÃŒr eingeloggte Benutzer"
-msgstr "Price only logged users"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:159
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:166
-msgid "Produkt ausverkauft"
-msgstr "Product sold out"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/list.phtml:171
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:185
-msgid "Keine passenden Produkte gefunden."
-msgstr "No matching products found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:72
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:227
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/layouts/grid.phtml:228
-msgid "Zur Listansicht wechseln."
-msgstr "Switch to list view."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:21
-msgid "Seite als Produktseite verwenden"
-msgstr "Use page as product page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:34
-msgid "Pro Seite"
-msgstr "per page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:39
-msgid "Produktauswahl (Kommagetrennte IDs)"
-msgstr "Product choice (comma separated IDs)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:46
-msgid "Keine Produktgruppen angelegt."
-msgstr "No product groups created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:58
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:467
-msgid "Kategorien"
-msgstr "Categories"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:56
-msgid "Keine Kategorien angelegt."
-msgstr "No categories created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:73
-msgid "Standardsortierung"
-msgstr "Default sorting"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:78
-msgid "Sortierungsauswahl ausblenden"
-msgstr "Hide sort choice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_productindex/page_metabox.phtml:83
-msgid "Ansichtenwechsel ausblenden"
-msgstr "Hide view choice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail_html.phtml:4
-msgid "hiermit erhalten Sie die Kopie der Rechnung"
-msgstr "hereby you get a copy of your invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/copymail_html.phtml:6
-#, fuzzy
-msgid "hiermit erhalten Sie die Kopie der Rechnungskorrektur"
-msgstr "hereby you get a copy of your invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:103
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:123
-msgid "FÃ€llig am"
-msgstr "Account due on"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:111
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:131
-msgid "Zahlungsbedingungen"
-msgstr "Terms of payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:390
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:403
-#, fuzzy
-msgid "Lieferdatum: #1#"
-msgstr "Company: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:494
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:507
-msgid "Versandkosten \"#1#\""
-msgstr "Shipping costs \"#1#\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:675
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:688
-#, fuzzy
-msgid "BearbeitungsgebÃŒhr"
-msgstr "Edit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:720
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:733
-msgid "Ihre Umsatzsteuer-Identifikationsnummer:"
-msgstr "Your VAT ID:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:729
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:742
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:742
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:755
-msgid "Es ergibt sich folgender Gesamtbetrag"
-msgstr "Resulting total amount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:743
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:756
-msgid "BRUTTOBETRAG"
-msgstr "VAT incl."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:748
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:781
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:761
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:794
-msgid "MwSt. GESAMT"
-msgstr "VAT"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:756
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:769
-msgid "Der Gesamtbetrag setzt sich wie folgt zusammen"
-msgstr "The total amount is comprising of"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:758
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:771
-msgid "NETTOBETRAG"
-msgstr "CLEAR AMOUNT"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:769
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:782
-msgid "MwSt. "
-msgstr "VAT "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:804
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:817
-msgid "SUMME"
-msgstr "TOTAL"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:835
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:848
-#, fuzzy
-msgid "Lieferung: #1#"
-msgstr "Order #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:861
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:874
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:89
-msgid "Lieferanschrift"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accounting_pdf.phtml:922
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoice_pdf.phtml:935
-msgid "Angaben wÃ€hrend der Bestellung"
-msgstr "Information from the order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail_html.phtml:16
-msgid "Sie erhalten hiermit die Rechnung in HÃ¶he von"
-msgstr "Here by you receive the invoice of"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail.phtml:15
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/invoicemail_html.phtml:16
-msgid "fÃŒr Ihre Bestellung mit der Bestellnummer"
-msgstr "for your order with the id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:57
-#, fuzzy
-msgid "Rechnungskorrektur erstellen"
-msgstr "Invoice creation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:65
-#, fuzzy
-msgid "Bestellung Stornieren"
-msgstr "Cancel this order"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:77
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:25
-msgid "Rechnungen"
-msgstr "Invoices"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:80
-msgid "Bisher keine Rechnungen geschrieben."
-msgstr "No invoice written yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:89
-#, fuzzy
-msgid "Rechnungskorrektur vom #1#"
-msgstr "Invoice canceled at #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:91
-msgid "Rechnung geschrieben am #1#"
-msgstr "Invoice written at #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:94
-msgid "Rechnung storniert am #1#"
-msgstr "Invoice canceled at #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:113
-#, fuzzy
-msgid ""
-"Sind Sie sicher, dass Sie eine Kopie dieser Rechnung/Rechnungskorrektur "
-"erneut an den Kunden senden mÃ¶chten?"
-msgstr ""
-"Are you sure you want to resend the copy of the invoice\\credit voucher to "
-"the customer?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:113
-msgid "Kopie senden"
-msgstr "Send copy"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:125
-msgid "Bestellstorno: Rechnungskorrektur erstellen"
-msgstr "Order cancellation: Create invoice correction"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:131
-msgid "Rechnung komplett stornieren und keine Rechnungskorrektur erstellen."
-msgstr "Cancel the invoice completely and do not create an invoice correction."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:132
-#, fuzzy
-msgid "Rechnungskorrektur erstellen."
-msgstr "Invoice creation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:133
-#, fuzzy
-msgid "Rechnungskorrektur erstellen und an Kunden senden."
-msgstr "Create credit voucher and send to customer."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:136
-msgid "GebÃŒhr fÃŒr Rechnungskorrektur"
-msgstr "Invoice correction fee"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:178
-msgid ""
-"Eine neue Rechnung kann erst geschrieben werden wenn alle bestehenden "
-"Rechnungen zu dieser Bestellung storniert wurden."
-msgstr ""
-"A new invoice can only be written after all former invoices for that order "
-"have been cancelled."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:185
-msgid "Neue Rechnung"
-msgstr "New invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:202
-#, fuzzy
-msgid "FÃ€lligkeit anzeigen"
-msgstr "Show payment date."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/order_view.phtml:225
-msgid "Rechnungsdatum"
-msgstr "Invoice date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail_html.phtml:13
-#, fuzzy
-msgid "Sie erhalten hiermit die Rechnungskorrektur in HÃ¶he von"
-msgstr "Here by you receive the invoice of"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/accountingmail_html.phtml:16
-msgid "Darin ist eine GebÃŒhr von #1# #2# enthalten."
-msgstr "This includes a fee of # 1 # # 2 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:93
-#, fuzzy
-msgid ""
-"Das Briefpapier wird hinter die gesamte Seite gelegt, das Logo wird "
-"standardmÃ€Ãig rechts oben auf jeder Seite platziert. (96 dpi)"
-msgstr ""
-"The letter paper is layed behind the whole page, the logo will be placed at "
-"the top right of every page. (96 dpi)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:170
-msgid ""
-"Hier kÃ¶nnen Sie Texte vordefinieren, die sie unter die Rechnung setzen "
-"kÃ¶nnen."
-msgstr "Here you can define texts that can be placed under the invoice."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:178
-msgid "Rechnungserstellung"
-msgstr "Invoice creation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:180
-msgid "Bei Bestellung"
-msgstr "When ordering"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:181
-msgid "Bei Zahlung"
-msgstr "When paying"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:183
-msgid "FÃ€lligkeit in Tagen"
-msgstr "Due date in days"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:184
-msgid "Anzahl an Produkten pro Seite (PDF)"
-msgstr "Amount of products per page (PDF)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:185
-msgid "Produktbeschreibung auf Rechnung anzeigen"
-msgstr "Show product description on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:188
-#, fuzzy
-msgid "Produktattribute auf der Rechnung anzeigen"
-msgstr "Show product variables on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:191
-#, fuzzy
-msgid "Rechnungsnummer auf Rechnungskorrektur anzeigen"
-msgstr "Show invoice number on credit voucher"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:192
-msgid "Produktvariablen auf Rechnung anzeigen"
-msgstr "Show product variables on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:193
-msgid "Bestellvariablen auf Rechnung anzeigen"
-msgstr "Show order variables on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:194
-#, fuzzy
-msgid "Land auf Rechnung verbergen"
-msgstr "Show product variables on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:195
-msgid "Startnummer (Rechnungen)"
-msgstr "Start number (invoices)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:196
-#, fuzzy
-msgid "Startnummer (Rechnungskorrektur)"
-msgstr "Start number (invoices)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:197
-#, fuzzy
-msgid "Mehrwertsteuersatz fÃŒr BearbeitungsgebÃŒhr"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:198
-msgid "Format (Rechnungen)"
-msgstr "Format (invoices)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:199
-#, fuzzy
-msgid "Format (Rechnungskorrektur)"
-msgstr "Format (invoices)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:210
-#, fuzzy
-msgid "Fortlaufende Rechnungs- bzw. Rechnungskorrekturnummer"
-msgstr "Continuing invoice and credit voucher numbers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:211
-msgid "Das aktuelle Jahr (4 Stellig)"
-msgstr "The current year (4-digits)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:212
-msgid "Der aktuelle Monat (01 - 12)"
-msgstr "The current month (01 - 12)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:213
-msgid "Der Tag des Monats (01 - 31)"
-msgstr "The current day of month (01 - 31)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:217
-msgid ""
-"Die Platzhalter kÃ¶nnen bei den Formatfeldern und dem Dateinamen verwendet "
-"werden. Der Platzhalter %nr% sollte dabei immer Verwendung finden."
-msgstr ""
-"The place holders can be used in the format fields and for file names. The "
-"place holder %nr% should always be used."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_rechnungen/settings_edit.phtml:219
-#, fuzzy
-msgid "MÃ¶gliche Platzhalter fÃŒr Rechnungen und Rechnungskorrektur"
-msgstr "Possible place holder for invoices and credit vouchers"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:9
-msgid "Bisher keine Versandarten angelegt."
-msgstr "No shipping methods created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:21
-msgid "Versandart lÃ¶schen"
-msgstr "Delete shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:77
-msgid "Grundlage"
-msgstr "Base"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:94
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:157
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:581
-msgid "Alle Versandzonen"
-msgstr "All shipping areas"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:113
-msgid "KostenschlÃŒssel"
-msgstr "Key of payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:128
-#, fuzzy
-msgid "KostenschlÃŒssel PLZ"
-msgstr "Key of payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/list.phtml:185
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/mail_status_html.phtml:2
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/order_view_switchStatus.phtml:26
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:21
-#, fuzzy
-msgid "Paketverfolgung"
-msgstr "Product management"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:9
-msgid ""
-"Mit diesem Modul ist es mÃ¶glich beliebig viele Lieferanten zu konfigurieren."
-msgstr "Allows you to configure multiple suppliers."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:10
-msgid ""
-"Unter Lieferanten verstehen wir den Dienstleister, der die Ware zu dem "
-"Kunden bringt und dafÃŒr die Versandkosten berechnet."
-msgstr ""
-"Suppliers are service provider that deliver products to your customers and "
-"get paid with shipping costs."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:11
-msgid "Wird ein Wert angegeben, so wird dieser Wert als Pauschale verwendet."
-msgstr "If a value is given, this value will be used as flat."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:14
-msgid ""
-"Sollen die Kosten nach Bestellwert, StÃŒckzahl oder Gewicht (Wenn Modul "
-"Produktgewicht aktiviert) gestaffelt werden so gilt folgendes "
-"Format:15:15,00|10:10,00|5,00. Es ist auch mÃ¶glich nur einen Wert anzugeben "
-"(Bsp. 5,00), so wird generell dieser Wert fÃŒr diese Versandart berechnet."
-msgstr ""
-"If you want to grade after order value, amount of items or weight (if module "
-"Product weight is active) use the following format:15:15,00|10:10,00|5,00. "
-"As well it is possible to enter only one value (e.g. 5,00). If you do so "
-"this value will be used for shipping."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:16
-msgid "ab 15 StÃŒck 15,00 EUR Versandkosten"
-msgstr "from 15 pieces 15,00 EUR shipping costs"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:17
-msgid "ab 10 StÃŒck 10,00 EUR Versandkosten"
-msgstr "from 10 pieces 10,00 EUR shipping costs"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:18
-msgid "bis 10 StÃŒck 5,00 EUR Versandkosten"
-msgstr "up to 10 pieces 5,00 EUR shipping costs"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:20
-msgid ""
-"Bietet man Beispielsweise den Versand als DHL Paket an, so kann man bei "
-"Bezeichnung \"DHL Paket\" eintragen und als Preis z.B. 6,90. Dieser Preis "
-"wird dann als Pauschale unabhÃ€ngig von StÃŒckzahl oder Gesamtgewicht "
-"verwendet."
-msgstr ""
-"If you provide shipping as DHL package for example you can enter the "
-"description \"DHL Package\" and as price you define 6,90. This price would "
-"be used as flat independent from the amount of pieces or total weight."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_versandarten/settings_edit.phtml:69
-msgid "Sind Sie sich sicher, dass sie die Versandart lÃ¶schen mÃ¶chten?"
-msgstr "Are you sure you want to delete this shipping method?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/cannotorder.phtml:41
-msgid "Altersverifizierung"
-msgstr "Age verification"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/produkt_edit_allgemein.phtml:8
-msgid "SOFORT Ident PrÃŒfung erforderlich"
-msgstr "IMPORTANT Identification required"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/produkt_edit_allgemein.phtml:11
-#, fuzzy
-msgid "Mindestalter"
-msgstr "Minimum order value"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:9
-msgid "Kundennummer bei SOFORT Ident"
-msgstr "Customer number SOFORT Ident"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:10
-msgid "Projektnummer bei SOFORT Ident"
-msgstr "Projekt number SOFORT Ident"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:14
-#, fuzzy
-msgid "Projektpasswort"
-msgstr "Project password"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:15
-msgid "HASH Algorithmus"
-msgstr "HAS Algorithmus"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:16
-msgid "MD5"
-msgstr "MD5"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:17
-msgid "SHA1"
-msgstr "SHA1"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:18
-msgid "SHA256"
-msgstr "SHA256"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:19
-msgid "SHA512"
-msgstr "SHA512"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:24
-#, fuzzy
-msgid "Mindestalter (Produktvorgabe)"
-msgstr "Ordered products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:28
-msgid "RÃŒcksprung-URL"
-msgstr ""
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_si/settings_edit.phtml:32
-msgid "PrÃŒfung fÃŒr Ausland deaktivieren"
-msgstr "Deactivate examination for foreign countries"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_spconditions/conditionList.phtml:23
-#, fuzzy
-msgid "Es sind noch keine Versand- oder Zahlungsbedingungen angelegt."
-msgstr "There are no variants created for that product."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_spconditions/settings_edit.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_spconditions.class.php:17
-#, fuzzy
-msgid "Versand- und Zahlungsbedingungen"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_spconditions/settings_edit.phtml:14
-#, fuzzy
-msgid "Neue Versand- und Zahlungsbedingung anlegen"
-msgstr "Shipping and payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/order_view_switchStatus.phtml:14
-msgid "Tracking-ID"
-msgstr "Tracking-ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/order_view_switchStatus.phtml:15
-msgid "Provider"
-msgstr "Provider"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/order_view_switchStatus.phtml:46
-msgid ""
-"Wenn sie auf den Status \"Ware versendet\" wechseln mÃ¶chten und einen "
-"Anbieter fÃŒr Paketverfolgung ausgewÃ€hlt haben so muss auch eine Tracking ID "
-"hinterlegt werden."
-msgstr ""
-"If you want to change to the status \"goods shipped\" and have selected a "
-"provider for parcel tracking, then a tracking ID must also be entered."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml:12
-#, fuzzy
-msgid "Keine Vorauswahl"
-msgstr "No choice."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit.phtml:61
-msgid "Anbieter fÃŒr Paketverfolgung"
-msgstr "Provider for package tracking"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:20
-#, fuzzy
-msgid "Anbieter lÃ¶schen"
-msgstr "Delete selected"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:33
-msgid "Url"
-msgstr "Url"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_packagetracking/settings_edit_list.phtml:78
-#, fuzzy
-msgid "Es wurden noch keine Anbieter fÃŒr die Paketverfolgung angelegt."
-msgstr "There are no variants created for that product."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/basket_row.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/mail_row.html.phtml:12
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/mail_row.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/mail_row.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/overview_row.phtml:12
-#, fuzzy
-msgid "Bemessungen"
-msgstr "Orders"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/product.phtml:15
-msgid "Bitte die LÃ€nge eintragen [in #1#]:"
-msgstr "Please enter the length [in # 1 #]:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/product.phtml:17
-msgid "Bitte die Breite eintragen [in #1#]:"
-msgstr "Please enter the width [in # 1 #]:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/product.phtml:27
-msgid "Die Breite liegt bei #1# #2#"
-msgstr "The width is # 1 # # 2 #"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/product.phtml:29
-msgid "Bitte die Laufmeter eintragen [in #1#]:"
-msgstr "Please enter the running meters [in # 1 #]:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/product.phtml:35
-msgid "LaufmeterlÃ€nge bitte eintragen [in #1#]:"
-msgstr "Please enter running length [in # 1 #]:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:9
-msgid "Berechnungsgrundlage fÃŒr das FlÃ€chenProdukt"
-msgstr "Calculation basis for the area product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:12
-msgid "Produkt ist ein Druckereiprodukt"
-msgstr "Product is a printed product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:19
-msgid "HÃ¶he x Breite"
-msgstr "height x width"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:156
-msgid "Laufmeter"
-msgstr "meter"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:23
-#, fuzzy
-msgid "vordefinierte Breite:"
-msgstr "Pre defined text fields"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:25
-#, fuzzy
-msgid "Einheit:"
-msgstr "Unit"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml:32
-msgid "Zur Konfiguration des Druckereimoduls"
-msgstr "To configure the printer module"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/settings_edit.phtml:9
-#, fuzzy
-msgid "FlÃ€cheneinheit"
-msgstr "Unit of filling quantity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_surfaceproduct/settings_edit.phtml:13
-#, fuzzy
-msgid "Umrechnungsfaktor"
-msgstr "Invoice date"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:11
-#, fuzzy
-msgid "Hallo "
-msgstr "Hello,"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:17
-msgid ""
-"Eine Produktvariation hat das Erreichen des minimalen Lagerbestands am #1# "
-"um #2# Uhr gemeldet."
-msgstr ""
-"A product variation reported reaching the minimum inventory #1# at #2# clock."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:23
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:21
-#, fuzzy
-msgid "Produktvariation"
-msgstr "Product variables"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail_html.phtml:29
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/stockmail.phtml:27
-msgid ""
-"Ein Produkt hat das Erreichen des minimalen Lagerbestand am #1# um #2# Uhr "
-"gemeldet."
-msgstr ""
-"A product has reported reaching the minimum inventory # 1 # at # 2 # clock."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:28
-msgid ""
-"Lagerbestand = Bestand(Variante 1) + Bestand(Variante 2) + Bestand(Variante "
-"X)"
-msgstr "Stock = Stock (Variant 1) + Stock (Variant 2) + Stock (Variant X)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:32
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:669
-#, fuzzy
-msgid "Mindestlagerbestand"
-msgstr "Stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:33
-#, fuzzy
-msgid "Benachrichtigung an"
-msgstr "Notification url"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/product_addedit_content.phtml:38
-msgid "Zur Konfiguration des Lagerbestandmoduls"
-msgstr "To configure the inventory module"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/settings_edit.phtml:9
-#, fuzzy
-msgid "Bestellungen bei negativen Bestand verhindern"
-msgstr "Prevent orders for negative stocks"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/settings_edit.phtml:10
-#, fuzzy
-msgid "Bestand in ProduktÃŒbersicht (Backend) anzeigen"
-msgstr "Show on product view pages"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/settings_edit.phtml:13
-#, fuzzy
-msgid "Bestand in ProduktÃŒbersicht (Frontend) anzeigen"
-msgstr "Show on product view pages"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/settings_edit.phtml:16
-#, fuzzy
-msgid "Bestand in Produkt (Frontend) anzeigen"
-msgstr "Show in basket in product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/settings_edit.phtml:17
-#, fuzzy
-msgid "Minimalbestand im Produkt hinterlegen"
-msgstr "No product groups created yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_stock/settings_edit.phtml:18
-#, fuzzy
-msgid "Ausverkaufte Produkte nicht anzeigen"
-msgstr "Show on product view pages"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/order_view_afterpayment.phtml:10
-#, fuzzy
-msgid "Zahlungsstatus"
-msgstr "Payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/order_view_afterpayment.phtml:15
-msgid "Zahlungsstatus aktualisieren (GetStatus Call)"
-msgstr "Update payment status (GetStatus Call)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/order_view_afterpayment.phtml:16
-msgid "Zahlung abbrechen (Cancellation Call)"
-msgstr "Cancel payment (Cancellation Call)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/order_view_afterpayment.phtml:19
-msgid "Zahlung einziehen (Capture Call)"
-msgstr "Collect payment (Capture Call)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/order_view_afterpayment.phtml:22
-msgid "Zahlung rÃŒckerstatten (Refund Call)"
-msgstr "Reimburse payment (Refund Call)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/order_view_afterpayment.phtml:23
-msgid "Zahlung abschlieÃen (Finish Transaction Call)"
-msgstr "Complete payment (Finish Transaction Call)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:10
-msgid "Merchant ID"
-msgstr "Merchant id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:12
-#, fuzzy
-msgid "Privater SchlÃŒssel"
-msgstr "Product key"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:13
-msgid "Autocapture (Nur fullcapture mÃ¶glich / DIRECT)"
-msgstr "autocapture (only fullcapture / direct)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:14
-msgid "Bestellstatus fÃŒr CAPTURE (Nur RETAIL)"
-msgstr "order Status with capture (only retail)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:15
-msgid "Risiko Klasse"
-msgstr "risc class"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:16
-msgid "Gering"
-msgstr "low"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:17
-#, fuzzy
-msgid "Normal"
-msgstr "Format"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:18
-#, fuzzy
-msgid "Stark"
-msgstr "Start"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:24
-msgid "HÃ¶he des IFrames in px"
-msgstr "height of iframes in px"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:26
-#, fuzzy
-msgid "MNS Statuswechsel"
-msgstr "MMS status mail"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:31
-msgid "Kein Wechsel"
-msgstr "no change"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:36
-#, fuzzy
-msgid "Kunden ÃŒber Statuswechsel informieren"
-msgstr "Inform customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:59
-msgid "Redirect URL"
-msgstr "Redirect URL"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:60
-#, fuzzy
-msgid "Warenkorb URL"
-msgstr "Basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:61
-msgid "AGB URL"
-msgstr "AGB URL"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:62
-msgid "MNS URL"
-msgstr "MNS URL"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_crefopay/settings_edit.phtml:63
-msgid "Jump URL"
-msgstr "Jump URL"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/produkt_addedit_allgemein.phtml:11
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/produkt_edit_sidebar.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:24
-#, fuzzy
-msgid "Bestellbedingungen"
-msgstr "Orders received"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:48
-#, fuzzy
-msgid ""
-"Sind Sie sich sicher, dass sie diese Bestellbedingung entfernen mÃ¶chten?"
-msgstr "Are you sure you want to cancel this order?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:71
-#, fuzzy
-msgid "Bisher keine Bestellbedingungen angelegt."
-msgstr "No order variables saved yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:100
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:111
-#, fuzzy
-msgid "Jede Bestellung"
-msgstr "When ordering"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:101
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:111
-#, fuzzy
-msgid "Bestimmte Produkte"
-msgstr "Ordered products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:102
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:111
-#, fuzzy
-msgid "Bestimmte Versandarten"
-msgstr "Shipping methods"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:106
-msgid "Wirkungsbereich"
-msgstr "area of ââinfluence"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:128
-msgid "Bedingungstext"
-msgstr "conditional text"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:143
-#, fuzzy
-msgid "Fehlertext"
-msgstr "Error page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/list.phtml:168
-#, fuzzy
-msgid "Versandartenauswahl"
-msgstr "Shipping methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/settings_edit.phtml:58
-#, fuzzy
-msgid "Text wurde erfolgreich gespeichert."
-msgstr "Customer has been saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/settings_edit.phtml:149
-msgid ""
-"Aufgrund des fÃŒr CrefoPay angepassten Bestellablaufs ist dieses Modul "
-"unwirksam."
-msgstr ""
-"the customized ordering process for CrefoPay this module is ineffective"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_ordercondition/settings_edit.phtml:158
-#, fuzzy
-msgid "Neue Bestellbedingung anlegen"
-msgstr "Create new order variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_freeshipping/settings_edit.phtml:10
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minrequest.class.php:20
-msgid "Mindestbestellwert"
-msgstr "Minimum order value"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:9
-msgid "Seller ID / VerkÃ€ufer-ID"
-msgstr "Seller ID / Buyer-ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:10
-msgid "Access Key ID"
-msgstr "Access Key ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:11
-msgid "Secret Access Key"
-msgstr "Secret Access Key"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:12
-msgid "Login with Amazon Client ID"
-msgstr "Login with Amazon Client ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:13
-msgid "Login with Amazon Client Secret"
-msgstr "Login with Amazon Client Secret"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:18
-#, fuzzy
-msgid "Zahlungsart fÃŒr neue Bestellungen aktiv"
-msgstr "Payment method for automatic renewal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:19
-#, fuzzy
-msgid "Name der Zahlungsart"
-msgstr "Name of payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:21
-msgid "Betreff (Auf Abrechnungen fÃŒr VerkÃ€ufer sichtbar)"
-msgstr "Subject (Viewable for Billing for Sellers)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:22
-#, fuzzy
-msgid "Button in Warenkorb integrieren"
-msgstr "Integrate log in in checkout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:32
-#, fuzzy
-msgid "HÃ€ndler URL"
-msgstr "Merchant id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/settings_edit.phtml:33
-msgid "JavaScript Origin"
-msgstr "JavaScript Origin"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/order_done.phtml:11
-#, fuzzy
-msgid "Zahlung wurde erfolgreich mit AmazonPay abgewickelt."
-msgstr "Invoice has been canceled successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/order_done.phtml:15
-#, fuzzy
-msgid "Zahlung wurde bereits erfolgreich mit AmazonPay abgewickelt."
-msgstr "Invoice has been canceled successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_amazon/order_done.phtml:79
-#, fuzzy
-msgid "Zahlung durchfÃŒhren"
-msgstr "Execute uninstall process"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:85
-#, fuzzy
-msgid "Produkte auf Ihrer Anfrageliste"
-msgstr "Products per page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:107
-#, fuzzy
-msgid "Produkt von Anfrageliste entfernen"
-msgstr "Product removed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:107
-#, fuzzy
-msgid ""
-"Sind Sie sich sicher, dass sie das Produkt aus der Anfrageliste entfernen "
-"mÃ¶chten?"
-msgstr "Are you sure you want to remove this product from your basket?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:222
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:235
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:56
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:66
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:73
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:98
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:415
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:324
-#, fuzzy
-msgid "Gesamtpreis (Netto)"
-msgstr "Total price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:226
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:231
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:60
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:62
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:83
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:88
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:435
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:344
-#, fuzzy
-msgid "Gesamtpreis (Brutto)"
-msgstr "Total price"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:252
-#, fuzzy
-msgid "Anfrageliste aktualisieren"
-msgstr "Update"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:256
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:76
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:118
-msgid "ZusÃ€tzliche Angaben"
-msgstr "Additional information"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:280
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail.phtml:93
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestmail_html.phtml:142
-#, fuzzy
-msgid "Kontaktdaten"
-msgstr "Customer data"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:449
-#, fuzzy
-msgid "Anfrage starten"
-msgstr "Start export"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/requestpage.phtml:456
-msgid "Es befinden sich keine Produkte auf der Anfrageliste."
-msgstr "There are no products on the Inquiry List."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:13
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail_html.phtml:13
-msgid "Das Anfrageformular auf der Homepage wurde am #1# um #2# Uhr"
-msgstr "The inquiry form on the homepage was at # 1 # at # 2 # pm"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:14
-msgid "mit folgenden Daten ausgefÃŒllt:"
-msgstr "filled in with the following data:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/customermail.phtml:18
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/customermail_html.phtml:14
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail_html.phtml:15
-#, fuzzy
-msgid "Produktdaten"
-msgstr "Products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:19
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail_html.phtml:18
-#, fuzzy
-msgid "Weitere Informationen"
-msgstr "Information"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail_html.phtml:20
-msgid "REMOTE IP"
-msgstr "REMOTE IP"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail.phtml:22
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail_html.phtml:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1427
-msgid "UserAgent"
-msgstr "UserAgent"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/customermail.phtml:14
-#, fuzzy
-msgid "Hallo #1# #2# #3#"
-msgstr "Hello #1# #2#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/customermail.phtml:16
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/customermail_html.phtml:12
-msgid "Vielen Dank fÃŒr Ihre Anfrage. Wir werden uns umgehend bei ihnen melden."
-msgstr "Thank you for your request. We will contact you immediately."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/product_bottom.phtml:31
-#, fuzzy
-msgid "Ihre Anfrageliste"
-msgstr "Your order confirmation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/adminmail_html.phtml:12
-#, fuzzy
-msgid "Hallo Administrator"
-msgstr "Dear shop administrator,"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/produkt_edit_allgemein.phtml:9
-#, fuzzy
-msgid "AnfrageProdukt"
-msgstr "Amount products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/produkt_edit_allgemein.phtml:11
-msgid "Ja, ohne Warenkorbfunktion"
-msgstr "Yes, without cart function"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/produkt_edit_allgemein.phtml:12
-msgid "Ja, mit zusÃ€tzlicher Warenkorbfunktion"
-msgstr "Yes, with additional shopping cart function"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:9
-msgid "Anfrageseite"
-msgstr "Request page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:10
-msgid "Weiterleitung nach Anfrage"
-msgstr "Forwarding on request"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:11
-#, fuzzy
-msgid "Nach neuem Produkt auf Merkliste"
-msgstr "After adding a product to the basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:13
-#, fuzzy
-msgid "Zur Anfrageseite leiten"
-msgstr "Jump to first page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:14
-#, fuzzy
-msgid "Anfrageseite im Fenster anzeigen"
-msgstr "Show basket in new window"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:17
-#, fuzzy
-msgid "ZusÃ€tzliche Kundendaten mit abfragen"
-msgstr "Request customer variables directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:19
-#, fuzzy
-msgid "Bestellvariablen mit abfragen"
-msgstr "Request customer variables directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/mods/mod_request/settings_edit.phtml:22
-#, fuzzy
-msgid "Produktvariablen mit abfragen"
-msgstr "Request customer variables directly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:12
-#, fuzzy
-msgid "Hier gelangen Sie zum Warenkorb"
-msgstr "No articles in your basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:18
-msgid "Hier gelangen Sie zum Formular der Kundendaten"
-msgstr "Click here for the form of the customer data"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:24
-msgid "Hier gelangen Sie zur Auswahl der Bezahlmethode und der Versandart"
-msgstr "Click here to select the payment method and shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:25
-#, fuzzy
-msgid "Versand/Zahlung"
-msgstr "Shipping and payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:30
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:45
-msgid "Hier gelangen Sie zum BestellÃŒbersicht"
-msgstr "Click here for the order overview"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:31
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:46
-msgid "Abschluss"
-msgstr "order completion"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:39
-msgid ""
-"Hier gelangen Sie zum Formular der Kundendaten, Bezahlmethode und der "
-"Versandart"
-msgstr ""
-"Here you will find the form for customer data, payment method and shipping "
-"method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/progress.phtml:40
-#, fuzzy
-msgid "Kundendaten / Zahlung  / Versand"
-msgstr "Payment \\ Shipping"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:13
-msgid "Artikel fÃŒr"
-msgstr "article(s) for"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:13
-msgid "im Warenkorb"
-msgstr "in your basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:66
-msgid "Gesamt"
-msgstr "Total"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:76
-msgid "Alle Preise zzgl. "
-msgstr "All prices plus "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:78
-msgid "Alle Preise inklusive MwSt. und zzgl."
-msgstr "All prices incl. sales tax and plus"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:82
-msgid "Zum Warenkorb"
-msgstr "To basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:84
-msgid "Keine Artikel im Warenkorb"
-msgstr "No articles in your basket"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:90
-msgid ""
-"FÃŒr Produkte nach EU Leistungsortregel wird der Steuersatz von #1# "
-"angewendet."
-msgstr ""
-"For products according to EU power rule, the tax rate of # 1 # is applied."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/index.phtml:93
-#, fuzzy
-msgid "Preiseinstellungen Ã€ndern"
-msgstr "Load settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:92
-#, fuzzy
-msgid "Bitte ÃŒberprÃŒfen Sie Ihre Kundendaten"
-msgstr "Please check your entries for the delivery address."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:94
-#, fuzzy
-msgid "Bitte geben Sie Ihre Kundendaten ein"
-msgstr "Please delete all customers before import!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:143
-#, fuzzy
-msgid "E-Mail Adresse:"
-msgstr "Email address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:153
-#, fuzzy
-msgid "E-Mail (Wiederholung:)"
-msgstr "Email address (confirmation)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:163
-#, fuzzy
-msgid "Geburtsdatum (Format: TT.MM.JJJJ):"
-msgstr "Day of birth (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:172
-#, fuzzy
-msgid "Fax.:"
-msgstr "Fax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:181
-#, fuzzy
-msgid "Tel.:"
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:250
-#, fuzzy
-msgid "UStIdNr.:"
-msgstr "VAT ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:325
-#, fuzzy
-msgid "zurÃŒck zum Warenkorb"
-msgstr "Back to basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout.phtml:326
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout2.phtml:98
-#, fuzzy
-msgid "weiter"
-msgstr "Continue"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:22
-msgid "Zusammenfassung"
-msgstr "Summary"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:30
-msgid ""
-"Ich habe die #1# des Anbieters gelesen und erklÃ€re mit dem Absenden der "
-"Bestellung mein EinverstÃ€ndnis. Die #2# habe ich zur Kenntnis genommen."
-msgstr ""
-"I read the #1# of the provider and accept it with sending this order. I have "
-"acknowledged the #2#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:41
-msgid "Zahlung/Versand"
-msgstr "Payment \\ Shipping"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:42
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:55
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:90
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:128
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:130
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:171
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:459
-msgid "[<a href=\"#1#\">Ãndern</a>]"
-msgstr "[<a href=\"#1#\">Edit</a>]"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:54
-msgid "Rechnungsanschrift"
-msgstr "Invoice address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:126
-msgid "Liefer- und Rechnungsanschrift"
-msgstr "Shipping and invoice address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:333
-msgid "<a href=\"#1#\">Versandkosten</a> (#2#)"
-msgstr "<a href=\"#1#\">Shipping costs</a> (#2#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:366
-msgid "Zahlungsart (#1#)"
-msgstr "Payment method (#1#)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:451
-msgid ""
-"Sofern die Lieferung in das Nicht-EU-Ausland erfolgt, kÃ¶nnen weitere ZÃ¶lle, "
-"Steuern oder GebÃŒhren vom Kunden zu zahlen sein, jedoch nicht an den "
-"Anbieter, sondern an die dort zustÃ€ndigen Zoll- bzw. SteuerbehÃ¶rden. Dem "
-"Kunden wird empfohlen, die Einzelheiten vor der Bestellung bei den Zoll- "
-"bzw. SteuerbehÃ¶rden zu erfragen."
-msgstr ""
-"If the delivery leaves the EU there might be additional customs duties, "
-"taxes or charges which have to be paid by the customer. These fees are not "
-"paid to the provider but to the responsible customs authority and tax "
-"authority respectively. We recommend the customer to ask for details at the "
-"responsible customs and tax authorities before you order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:472
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/checkout2.phtml:99
-#, fuzzy
-msgid "zurÃŒck"
-msgstr "refunded"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/overview.phtml:473
-msgid "zahlungspflichtig bestellen"
-msgstr "Order now"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:89
-msgid "Produkt aus dem Warenkorb entfernen"
-msgstr "Remove product from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:89
-#, fuzzy
-msgid ""
-"Sind Sie sich sicher, dass Sie das Produkt aus dem Warenkorb entfernen "
-"mÃ¶chten?"
-msgstr "Are you sure you want to remove this product from your basket?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:149
-msgid "Gutschein aus dem Warenkorb entfernen"
-msgstr "Remove voucher from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:149
-msgid ""
-"Sind Sie sich sicher, dass sie den Gutschein aus dem Warenkorb entfernen "
-"mÃ¶chten?"
-msgstr "Are you sure you want to remove this voucher from your basket?"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:211
-#, fuzzy
-msgid "<a href=\"#1#\">Versandkosten</a>:"
-msgstr "<a href=\"#1#\">Shipping costs</a> (#2#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:223
-msgid "Keine Versandart mÃ¶glich / Bitte manuell anfragen"
-msgstr "No delivery possible / Please request manually"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:272
-msgid "Keine Zahlungsart mÃ¶glich / Bitte manuell anfragen"
-msgstr "No payment possible / Please request manually"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:364
-#, fuzzy
-msgid "aktualisieren"
-msgstr "Update"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:367
-#, fuzzy
-msgid "zur Kasse"
-msgstr "Continue to checkout"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/basket.phtml:371
-msgid "weiter shoppen"
-msgstr "continue shopping"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/ajaxDialog.phtml:38
-msgid "Der Preis fÃŒr das Produkt betrÃ€gt #1#."
-msgstr "The price for the product is # 1 #."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/ajaxDialog.phtml:43
-msgid "Im Warenkorb befinden sich jetzt #1# Produkt(e)."
-msgstr "In the cart are now # 1 # product (s)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/ajaxDialog.phtml:48
-msgid "Der Gesamtpreis (inkl. Versand) betrÃ€gt jetzt #1#."
-msgstr "The total price (including shipping) is now # 1 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/ajaxDialog.phtml:59
-#, fuzzy
-msgid "FÃŒllmenge: #1# #2#"
-msgstr "Fill quantity: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/ajaxDialog.phtml:68
-msgid "Gewicht: #1# #2#"
-msgstr "Weight: #1# #2#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/customerquestion.phtml:13
-msgid ""
-"FÃŒr eine korrekte Preisberechnung benÃ¶tigen wir folgende Informationen von "
-"Ihnen."
-msgstr ""
-"For a correct price calculation we need the following information from you."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/customerquestion.phtml:17
-msgid "Sie sind:"
-msgstr "You are:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/customerquestion.phtml:21
-#, fuzzy
-msgid "Firmenkunde"
-msgstr "Company name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/customerquestion.phtml:26
-#, fuzzy
-msgid "Endkunde"
-msgstr "Customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/customerquestion.phtml:33
-msgid "aus:"
-msgstr "from:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/views/warenkorb/customerquestion.phtml:42
-msgid "OK"
-msgstr "ok"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order_product.class.php:21
-#, fuzzy
-msgid "Die Daten eines bestellten Produktes konnten nicht geladen werden"
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:33
-#, fuzzy
-msgid "Die Daten eines Bestellobjekts konnten nicht geladen werden "
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:433
-#, fuzzy
-msgid "Deaktivierte Zahlungsart (#1#)"
-msgstr "Payment method (#1#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:507
-msgid "Unbekannter Statuscode (#1#)"
-msgstr "Unknown status code (# 1 #)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:725
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:738
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:943
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:957
-#, fuzzy
-msgid "Nicht definiert."
-msgstr "Not defined!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1252
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1486
-#, fuzzy
-msgid "Deaktivierte Zahlungsart ("
-msgstr "Hint for payment method"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1252
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1269
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1296
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1486
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1503
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1530
-msgid ")"
-msgstr ")"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1269
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1503
-#, fuzzy
-msgid "Deaktivierte Versandart ("
-msgstr "Deactivate"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1296
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_order.class.php:1530
-msgid "Unbekannter Statuscode ("
-msgstr "Unknown status code ("
-
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_product.class.php:55
-msgid "Gesuchte ID:#1# Gefundene ID:#2#"
-msgstr "Searched ID: # 1 # ID found: # 2 #"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_exception.class.php:45
-#, fuzzy
-msgid "Unerwartetes Programmverhalten"
-msgstr "Unexpected error"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_exception.class.php:46
-#, fuzzy
-msgid "Datenbankfehler"
-msgstr "Database updated"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/model/wpsg_exception.class.php:48
-#, fuzzy
-msgid "Ungekannter Fehlertyp"
-msgstr "Unexpected exception!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_deliverynote/wpsg_deliverynote.class.php:22
-msgid "Konnte Lieferschein nicht laden, ungÃŒltige ID ÃŒbergeben"
-msgstr "Could not load delivery note, passed invalid ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:23
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:34
-msgid "Kreditkarte"
-msgstr "credit card"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:25
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlungsart Kreditkarte."
-msgstr "Allows the payment method prepayment."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:50
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:92
-msgid ""
-"WÃ€hlen Sie diese Zahlungsart wenn sie uns eine EinzugsermÃ€chtigung fÃŒr ihr "
-"Konto erteilen mÃ¶chten. Wir benÃ¶tigen dazu folgende Angaben:"
-msgstr ""
-"Select this payment method if you want to give us permission to charge your "
-"bank account for orders. We need the following information:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:228
-#, fuzzy
-msgid "Bitte den Namen der Kreditkarte kontrollieren (Kreditkarte)"
-msgstr "Please check the name of your bank (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:229
-#, fuzzy
-msgid "Bitte den Inhaber des Kontos kontrollieren (Kreditkarte)"
-msgstr "Please check the account owner (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:232
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:235
-#, fuzzy
-msgid "Bitte die PrÃŒfziffer kontrollieren (Kreditkarte)"
-msgstr "Please check the bank code (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:233
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:241
-#, fuzzy
-msgid "Bitte die Kartennummer ÃŒberprÃŒfen (Kreditkarte)"
-msgstr "Please check the bank account number (bank collection)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:399
-msgid "Kreditkartentyp"
-msgstr "credit Card typ"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:400
-msgid "Kreditkarteninhaber"
-msgstr "credit Card owner"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:402
-msgid "KreditkartenprÃŒfziffer"
-msgstr "Credit Card Verification"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:403
-msgid "Kreditkarten-GÃŒltigkeit-Monat"
-msgstr "Credit card validity Month"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_creditcard.class.php:404
-msgid "Kreditkarten-GÃŒltigkeit-Jahr"
-msgstr "Credit card validity year"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:39
-msgid ""
-"Darstellung und Auswertung von Statistiken, Piwik Integration, Eckdaten als "
-"Dashboard-Widget"
-msgstr ""
-"Presentation and evaluation of statistics, Piwik integration, key data as "
-"dashboard widget"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:90
-msgid ""
-"Bitte ÃŒberprÃŒfen Sie die Konfiguration im <a href=\"#1#\">Statistikmodul</"
-"a>. Es wurde keine Piwik Seiten ID angegeben."
-msgstr ""
-"Please check the configuration in the <a href=\"#1#\"> statistics module </"
-"a>. No Piwik Site ID was specified."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:126
-msgid "GoogleMaps Javascript nicht einbinden (Statistikmodul)"
-msgstr "GoogleMaps do not embed javascript (statistics module)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:127
-msgid ""
-"Ist diese Option aktiv, so werden die GoogleMaps Javascript Bibliotheken "
-"<u>nicht</u> eingebunden."
-msgstr ""
-"If this option is active, the GoogleMaps JavaScript libraries are <u> not </ "
-"u> included."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:313
-msgid "heute"
-msgstr "today"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:314
-msgid "gestern"
-msgstr "yesterday"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:315
-#, fuzzy
-msgid "gesamt"
-msgstr "Total"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:365
-msgid "Heute"
-msgstr "today"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:370
-msgid "Diese Woche"
-msgstr "this week"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:375
-msgid "Dieser Monat"
-msgstr "this month"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:380
-msgid "Dieses Quartal"
-msgstr "this quarter"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:385
-msgid "Dieses GeschÃ€ftjahr"
-msgstr "this business year"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:390
-msgid "Gestern"
-msgstr "yesterday"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:395
-msgid "Letzte Woche"
-msgstr "last week"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:400
-msgid "Letzter Monat"
-msgstr "last month"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:405
-msgid "Vorjahresquartal"
-msgstr "prior-year quarter"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:410
-msgid "Letztes GeschÃ€ftsjahr"
-msgstr "last business year"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:415
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:63
-msgid "Benutzerdefiniert"
-msgstr "User-defined"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:445
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:450
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:451
-#, fuzzy
-msgid "VerkÃ€ufe nach Zahlungsart"
-msgstr "Shipping and payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:465
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:470
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:471
-#, fuzzy
-msgid "Top"
-msgstr "Type"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:465
-msgid "Pro."
-msgstr "pro."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:465
-#, fuzzy
-msgid "Umsatz/Menge"
-msgstr "Revenue"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:470
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:471
-#, fuzzy
-msgid "verkaufter Produkte"
-msgstr "New product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:470
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:471
-msgid "Menge in Stck."
-msgstr "Quantity in piece"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:486
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:491
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:492
-msgid "Umsatz"
-msgstr "Revenue"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:501
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:506
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:507
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnoverperhour.class.php:132
-msgid "Umsatz pro Stunde"
-msgstr "Revenue per hour"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_statistics.class.php:516
-#, fuzzy
-msgid "Kundenkarte"
-msgstr "Customer data"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_legaltexts.class.php:22
-msgid "Rechtstexte"
-msgstr "legal texts"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_legaltexts.class.php:24
-#, fuzzy
-msgid "ErmÃ¶glicht den Abgleich mit Anbietern von \"AGB-Rechtstext-Flatrates\"."
-msgstr "Allows to synchronize legal texts with Protected Shops."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_legaltexts.class.php:64
-msgid ""
-"Es wurde beim Speichern der Einstellungen ein ungÃŒltiger Provider ÃŒbergeben"
-msgstr "An invalid provider was submitted when saving the settings"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_legaltexts.class.php:109
-msgid ""
-"Die von Ihnen verwendete Version des ProtectedShops Plugin ist nicht "
-"ausreichend. Sie benÃ¶tigen mindestens Version 1.6!"
-msgstr ""
-"Your current version of the Protected Shops plugin is not supported. You "
-"need at least version 1.6!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_legaltexts.class.php:151
-msgid ""
-"Es wurde bei der Ajax Anfrage der Provider ein ungÃŒltiger Provider angegeben"
-msgstr "An invalid provider was specified in the Ajax request of the provider"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:19
-#, fuzzy
-msgid "GiroCheckout"
-msgstr "Checkbox"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:21
-msgid ""
-"ErmÃ¶glicht das Einbinden der Zahlungsarten der <a href=\"#1\">GiroSolution "
-"AG</a>."
-msgstr ""
-"Allows you to integrate the payment methods of the <a href=\"#1\"> "
-"GiroSolution AG </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:31
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:72
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:110
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:111
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:149
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:110
-#, fuzzy
-msgid "Erfolgreiche Zahlung"
-msgstr "PayPal payment successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:32
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:73
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:111
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:112
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:111
-#, fuzzy
-msgid "Fehlerhafte Zahlung"
-msgstr "Failed Billsafe payment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:35
-msgid ""
-"Die sichere Online-Ãberweisung ÃŒber das Online-Banking Ihrer Bank oder "
-"Sparkasse. Im nÃ€chsten Schritt werden Sie direkt zum Online-Banking Ihrer "
-"Hausbank weitergeleitet, wo Sie die Zahlung durch Eingabe von PIN und TAN "
-"freigeben."
-msgstr ""
-"The secure online transfer via the online banking of your bank or savings "
-"bank. In the next step, you will be forwarded directly to the online banking "
-"of your house bank, where you will release the payment by entering PIN and "
-"TAN."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:38
-msgid ""
-"Nach Auswahl des Kreditkartentyps, werden Sie im nÃ€chsten Schritt "
-"aufgefordert, Ihre Kreditkartennummer und KartenprÃŒfnummer einzugeben. Wenn "
-"Ihre Kreditkarte fÃŒr 3D-Secure (Verified by Visa bzw. MasterCard SecureCode) "
-"freigeschaltet ist, werden Sie wÃ€hrend des Bezahlprozesses zur "
-"Sicherheitsabfrage Ihrer Hausbank weitergeleitet."
-msgstr ""
-"After selecting the type of credit card, the next step asks you to enter "
-"your credit card number and card verification number. If your credit card is "
-"enabled for 3D-Secure (Verified by Visa or MasterCard SecureCode), you will "
-"be redirected to your house bank during the payment process."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:41
-msgid ""
-"Hiermit ermÃ€chtigen Sie uns, den Betrag von Ihrem Konto einzuziehen. Aus "
-"DatenschutzgrÃŒnden werden Ihre Kontodaten nicht gespeichert. Bei jeder "
-"Bestellugn ist deshalb eine Neueingabe erforderlich."
-msgstr ""
-"Here by you authorize us to collect the amount from your account. For "
-"privacy reasons, your account information will not be saved. Each order "
-"requires a new entry."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:232
-msgid ""
-"GebÃŒhr konnte nicht berechnet werden, da eine ungÃŒltige Zahlungsart "
-"verwendet wurde"
-msgstr ""
-"Charge could not be calculated because an invalid payment method was used"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:276
-#, fuzzy
-msgid "Mit giropay bezahlen"
-msgstr "Pay with PayPal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:295
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:361
-#, fuzzy
-msgid "Keine gÃŒltige Bestellung aus Request gefiltert"
-msgstr "No valid XML file for settings specified."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:321
-msgid "GiroCheckout: GÃŒltige RÃŒckmeldung mit ZahlungsbestÃ€tigung"
-msgstr "GiroCheckout: valid confirmation with payment confirmation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:335
-msgid "GiroCheckout: GÃŒltige RÃŒckmeldung ohne ZahlungsbestÃ€tigung"
-msgstr "GiroCheckout: valid confirmation without payment confirmation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:348
-msgid "GiroCheckout: Fehlerhafte Anfrage (Hash stimmt nicht)"
-msgstr "GiroCheckout: Incorrect request (hash is wrong)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:410
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:416
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:249
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:255
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:339
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:345
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:196
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:202
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:340
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:346
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:436
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:442
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:574
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:580
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:462
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:468
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:597
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:603
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:406
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:412
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:339
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:345
-msgid "Zahlungslink"
-msgstr "Payment link"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:410
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:249
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:339
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:196
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:340
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:436
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:574
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:462
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:597
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:406
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:339
-msgid ", um die Zahlung durchzufÃŒhren"
-msgstr "to make the payment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_giropay.class.php:545
-msgid ""
-"Es wurde versucht einen Zahlungslink fÃŒr eine ungÃŒltige Zahlungsart zu "
-"generieren"
-msgstr ""
-"An attempt was made to generate a payment link for an invalid payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_topseller/wpsg_mod_topseller_widget.class.php:12
-#, fuzzy
-msgid "wpShopGermany TopSeller"
-msgstr "wpShopGermany version"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:22
-msgid "SofortÃŒberweisung"
-msgstr "SofortBanking"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:24
-msgid "ErmÃ¶glicht die Zahlungsart SofortÃŒberweisung."
-msgstr "Allows the payment method SofortBanking."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:32
-msgid ""
-"Zahlen Sie die per SofortÃŒberweisung. Ihre Bank muss dieses Verfahren "
-"unterstÃŒtzen und sie benÃ¶tigen ihre PIN/TAN zur Zahlung."
-msgstr ""
-"Pay using the service SofortBanking. Your bank has to support this method "
-"and you need your PIN/TAN in order to pay."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:41
-msgid "<!-- Die User ID bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- You get your user id from SofortBanking.com --!>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:42
-msgid "<!-- Die Projekt ID bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- You get your project id from SofortBanking.com --!>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:43
-msgid "<!-- Das Projektpasswort bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- You get your project password from SofortBanking.com --!>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:44
-msgid ""
-"<!-- Das Benachrichtigungspasswort bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- You get your notification password from SofortBanking.com --!>"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:324
-#, fuzzy
-msgid "SofortÃŒberweisung VERIFIED"
-msgstr "SofortBanking"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_su.class.php:337
-#, fuzzy
-msgid "SofortÃŒberweisung FAILED"
-msgstr "SofortBanking"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:23
-msgid ""
-"ErmÃ¶glicht Verwaltung und Zusendung von Tracking Codes zur Paketverfolgung."
-msgstr ""
-"Enables management and delivery of tracking codes for package tracking."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:139
-#, fuzzy
-msgid "Klicken Sie hier, um den Namen zu Ã€ndern."
-msgstr "Click here to request a new password."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:140
-msgid "http://tracking/%order_trackingid%"
-msgstr "http://tracking/%order_trackingid%"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:156
-msgid "Delete Anfrage ohne ID"
-msgstr "Delete request without ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:168
-msgid "Inline Edit ohne ID"
-msgstr "Inline Edit without ID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:195
-msgid "Inline Edit eines ungÃŒltigen Feldes"
-msgstr "Inline Edit of an invalid field"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_packagetracking.class.php:258
-msgid "Keine Paketverfolgung"
-msgstr "no package tracking"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:22
-msgid "Erlaubt das festlegen einer Mindestbestellmenge je Produkt."
-msgstr "Allows setting a minimum order quantity per product."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:113
-msgid ""
-"Die Mindestbestellmenge von Produkt #1# betrÃ€gt #2# und wurde korrigiert."
-msgstr ""
-"The minimum order quantity of product # 1 # is # 2 # and has been corrected."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:142
-msgid ""
-"Die Maximalbestellmenge von Produkt #1# betrÃ€gt #2# und wurde korrigiert."
-msgstr ""
-"The maximum order quantity of product # 1 # is # 2 # and has been corrected."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:186
-msgid ""
-"Die Mindestbestellmenge von Produkt #1# betrÃ€gt #2# und wurde nicht erreicht."
-msgstr ""
-"The minimum order quantity of product # 1 # is # 2 # and has not been "
-"reached."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minquantity.class.php:206
-msgid ""
-"Die Maximalbestellmenge von Produkt #1# betrÃ€gt #2# und wurde ÃŒberschritten."
-msgstr ""
-"The maximum order quantity of product # 1 # is # 2 # and has been exceeded."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:54
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:69
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:719
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1061
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1234
-msgid "Wartend"
-msgstr "Waiting"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:59
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_gutschein/wpsg_voucher.php:71
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1078
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1233
-msgid "Verbraucht"
-msgstr "Used"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:30
-msgid "Selbstabholung"
-msgstr "Pick up"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:23
-msgid ""
-"ErmÃ¶glicht die Versandart \"Selbstabholung\" mit der Zahlweise \"Barzahlung "
-"bei Abholung\"."
-msgstr ""
-"Allows to use the shipping method \"pick up\" with the payment method \"cash "
-"payment\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:32
-msgid ""
-"Vereinbaren Sie mit uns nach der Bestellung einen Termin an dem Sie die Ware "
-"abholen."
-msgstr ""
-"Make an appointment after your order when you want to pick up your products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:40
-msgid "Barzahlung"
-msgstr "Cash on pick up"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:41
-msgid ""
-"Sie bezahlen die Ware bei Abholung. Ist nur mit der Versandart "
-"\"Selbstabholung\" mÃ¶glich."
-msgstr ""
-"Pay the products when you pick them up. Only possible if you chose \"Cash "
-"and carry\" as shipping type."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:100
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:373
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:401
-msgid "Die Versandart \"#1#\" erfordert die Zahlungsart \"#2#\"."
-msgstr "Shipping type \"#1#\" requires payment method \"#2#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:117
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:362
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_willcollect.class.php:425
-msgid "Die Zahlungsart \"#1#\" erfordert die Versandart \"#2#\"."
-msgstr "Payment method \"#1#\" requires shipping method \"#2#\"."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:27
-msgid "Erlaubt die Definition und Anzeige von Lieferzeiten."
-msgstr "Allows the definition and display of delivery times."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:59
-msgid "3 Tage, 1 Woche, 3 Wochen"
-msgstr "3 days, 1 week, 3 weeks"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:60
-msgid "1 Woche"
-msgstr "1 week"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:283
-msgid "#1##2#"
-msgstr "#1##2#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:369
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:376
-msgid "#1# Tag(e)"
-msgstr "#1# day(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:382
-msgid "Das Produkt ist sofort lieferbar (Lieferzeit: 0 Tage)"
-msgstr "The product is in stock (delivery time: 0 days)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:415
-#, fuzzy
-msgid "UngÃŒltige Lieferzeitkonfiguration"
-msgstr "Page assignments"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:479
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverytime.class.php:485
-msgid " Tag(e)"
-msgstr "day(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:28
-#, fuzzy
-msgid "DownloadPlus"
-msgstr "Downloads"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:30
-#, fuzzy
-msgid "ErmÃ¶glicht den Verkauf von angepassten PDF Dokumenten."
-msgstr "Allows you to manage various types of shipping costs\\suppliers."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:119
-#, fuzzy
-msgid "PDFdownload E-Mail"
-msgstr "Download"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:120
-#, fuzzy
-msgid "E-Mail mit Links zu den PDFs die an den Kunden geht."
-msgstr "Email for new invoice to the customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:124
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:244
-msgid "PDFdownload Cron E-Mail"
-msgstr "PDFdownload Cron E-Mail"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:125
-msgid ""
-"E-Mail mit Informationen zu der PDF Individualisierung die vom Cron "
-"verschickt wird. (An Admin!)."
-msgstr ""
-"Email with information on the PDF customization sent by Cron. (To admin!)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:262
-#, fuzzy
-msgid "Datei fÃŒr das Downloadplus Modul erfolgreich hochgeladen."
-msgstr "File for the download module was uploaded successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:402
-#, fuzzy
-msgid "Datei wurde geplant."
-msgstr "File not found"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:412
-#, fuzzy
-msgid "Bestellung wurde geplant."
-msgstr "Order has not been found!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:422
-msgid "DownloadzÃ€hler wurden zurÃŒckgesetzt."
-msgstr "Download counters have been reset."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:447
-#, fuzzy
-msgid "Planung wurde storniert."
-msgstr "Invoice has been canceled successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:637
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:320
-msgid "Versand per Mail"
-msgstr "Dispatch via mail"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:703
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:704
-#, fuzzy
-msgid "UngÃŒltige Dateiendung."
-msgstr "Invalid request"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:726
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:727
-#, fuzzy
-msgid "Fehler beim Upload."
-msgstr "Failed to upload! File not found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:999
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1074
-msgid "Kein Kontrollhash!"
-msgstr "no Control hash!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1003
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1080
-#, fuzzy
-msgid "UngÃŒltiger Kontrollhash!"
-msgstr "Invalid request!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1009
-msgid "Sie haben die maximale Anzahl an Downloads ÃŒberschritten."
-msgstr "You have exceeded the maximum number of downloads."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1014
-#, fuzzy
-msgid "Der Download der Datei ist nicht mehr gÃŒltig."
-msgstr "Download is not possible anymore."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1084
-msgid "Mail mit Downloadlinks versendet!"
-msgstr "Mail sent with download links!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1261
-msgid "Text in Textfeld #1#"
-msgstr "Text in text field # 1 #"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1265
-#, fuzzy
-msgid "Downloadnummer"
-msgstr "Download"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1411
-#, fuzzy
-msgid "Pdf Downloads an:#1#"
-msgstr "Downloads"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1415
-#, fuzzy
-msgid "E-Mail erfolgreich gesendet."
-msgstr "Profile has been saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadplus.class.php:1421
-#, fuzzy
-msgid "Keine gÃŒltigen Downloads."
-msgstr "No valid licence"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:44
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:65
-msgid "ICP Onlinepayments"
-msgstr "ICP Onlinepayments"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:46
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:66
-msgid ""
-"ErmÃ¶glicht und gewÃ€hrleistet die sichere Akzeptanz von Kreditkartenzahlungen."
-msgstr "Enables and ensures secure acceptance of credit card payments."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:249
-msgid "ICP Fehler"
-msgstr "ICP Error"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_icp.class.php:295
-#, fuzzy
-msgid "ICP Zahlung erfolgt"
-msgstr "Payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:24
-#, fuzzy
-msgid "Trusted Shops"
-msgstr "Protected Shops"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:26
-#, fuzzy
-msgid "ErmÃ¶glicht die Integration von Trusted Shops."
-msgstr "Allows the payment method prepayment."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:48
-#, fuzzy
-msgid "HÃ€ndlerbewertungen einsehen"
-msgstr "Review order(s)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:52
-#, fuzzy
-msgid "Klicken Sie hier, um eine Bewertung des HÃ€ndlers abzugeben."
-msgstr "Click here to request a new password."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:54
-msgid "Bewerten Sie Ihr Einkaufserlebnis bei Trusted Shops! Vielen Dank!"
-msgstr "Rate your shopping experience with Trusted Shops! Many Thanks!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:56
-msgid ""
-"Vergessen Sie nicht Ihr Einkaufserlebnis bei Trusted Shops zu bewerten! "
-"Vielen Dank!"
-msgstr ""
-"Do not forget to rate your shopping experience with Trusted Shops! Many "
-"Thanks!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:71
-#, fuzzy
-msgid "Noch nicht ausgefÃŒhrt."
-msgstr "Not scheduled"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:198
-msgid ""
-"Sie haben noch keinen Review Collector-Export gemacht. <a href=\"#1#\">Jetzt "
-"starten.</a>"
-msgstr ""
-"You have not yet done a review collector export. <a href=\"#1#\"> Start Now. "
-"</a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:207
-msgid ""
-"Sie haben seit #1# Tagen keinen Review Collector-Export gemacht. <a href="
-"\"#2#\">Jetzt starten.</a>"
-msgstr ""
-"You have not done a review collector export since # 1 # days. <a href=\"#2#"
-"\"> Start Now. </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:215
-msgid "<a href=\"#1#\">Klicken Sie hier, um die Meldung auszublenden.</a>"
-msgstr "<a href=\"#1#\"> Click here to hide the message. </a>"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:349
-msgid ""
-"Ihnen werden keine Benachrichtigungen fÃŒr den Review Collector mehr "
-"angezeigt."
-msgstr "You will no longer see notifications for the Review Collector."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:400
-#, fuzzy
-msgid "E-Mail mit dem Bewertungslink wurde erfolgreich an den Kunden gesendet."
-msgstr "Mail has been sent to the customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:420
-#, fuzzy
-msgid "E-Mail mit dem Trusted Shops Bewertungslink an den Kunden"
-msgstr "Email for new invoice to the customer"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_trustedshops.class.php:421
-msgid ""
-"Diese E-Mail kann aus der Bestellansicht im Backend manuell an den Kunden "
-"versendet werden."
-msgstr ""
-"This e-mail can be sent manually from the order view in the backend to the "
-"customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:21
-msgid "ProduktÃŒbersichten"
-msgstr "Product views"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:23
-msgid "ErmÃ¶glicht die Darstellung von ProduktÃŒbersichtsseiten."
-msgstr "Allows you to show pages for product views."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:148
-msgid ""
-"Bitte geben sie eine gÃŒltige Auswahl von kommagetrennten ProduktIDs auf "
-"dieser Seite ein."
-msgstr ""
-"Please enter a valid selection of product IDs on this page separated by "
-"comma."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:174
-msgid ""
-"Bitte wÃ€hlen sie mindestens eine Produktgruppe zur Anzeige bei den "
-"Seiteneinstellungen dieser Seite aus."
-msgstr ""
-"Please select at least one product group to show on the site settings page."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:200
-msgid ""
-"Bitte wÃ€hlen sie mindestens eine Kategorie zur Anzeige bei den "
-"Seiteneinstellungen dieser Seite aus."
-msgstr "Please select at least one category to show on the site settings page."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:468
-#, fuzzy
-msgid "Erstes Produkt aus allen Kategorien"
-msgstr "Create new product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:475
-msgid "wpShopGermany ProduktÃŒbersicht"
-msgstr "wpShopGermany product overview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:490
-#, fuzzy
-msgid "Preis (Aufsteigend)"
-msgstr "Name ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:491
-#, fuzzy
-msgid "Preis (Absteigend)"
-msgstr "Name descending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:492
-#, fuzzy
-msgid "Name (Aufsteigend)"
-msgstr "Name ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:493
-#, fuzzy
-msgid "Name (Absteigend)"
-msgstr "Name descending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:494
-#, fuzzy
-msgid "Datum (Ãlteste zuerst)"
-msgstr "Price (lowest first)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:495
-#, fuzzy
-msgid "Datum (Neueste zuerst)"
-msgstr "Price (lowest first)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:496
-#, fuzzy
-msgid "Artikelnr. (Aufsteigend)"
-msgstr "Name ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:497
-#, fuzzy
-msgid "Artikelnr. (Absteigend)"
-msgstr "Name descending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:503
-#, fuzzy
-msgid "Position (Aufsteigend)"
-msgstr "ascending"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productindex.class.php:504
-#, fuzzy
-msgid "Position (Absteigend)"
-msgstr "descending"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:53
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:144
-msgid "CrefoPay"
-msgstr "CrefoPay"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:55
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlung ÃŒber CrefoPay."
-msgstr "Allows the payment method PayPal."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:216
-#, fuzzy
-msgid "CrefoPay Status wurde erfolgreich abgefragt."
-msgstr "Status changed successfully!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:217
-msgid ""
-"CrefoPay Status konnte nicht abgefragt werden. Bitte beachten Sie das "
-"Bestellprotokoll."
-msgstr "CrefoPay status could not be queried. Please note the order protocol."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:230
-msgid ""
-"CrefoPay Zahlungsabbruch wurde erfolgreich durchgefÃŒhrt. Der Kunde kann die "
-"Zahlung nun ÃŒber die Bestellabschlussseite (Link in E-Mail) neu starten."
-msgstr ""
-"CrefoPay payment cancellation was successful. The customer can now restart "
-"the payment via the order completion page (link in e-mail)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:236
-msgid ""
-"CrefoPay Zahlungsabbruch konnte nicht ÃŒbermittelt werden. Bitte beachten Sie "
-"das Bestellprotokoll."
-msgstr ""
-"CrefoPay Payment cancellation could not be delivered. Please note the order "
-"protocol."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:249
-#, fuzzy
-msgid "CrefoPay Zahlungseinzug wurde erfolgreich durchgefÃŒhrt."
-msgstr "Letter paper has been deleted."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:255
-msgid ""
-"CrefoPay Zahlungseinzug konnte nicht ÃŒbermittelt werden. Bitte beachten Sie "
-"das Bestellprotokoll."
-msgstr ""
-"CrefoPay payment collection could not be delivered. Please note the order "
-"protocol."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:268
-#, fuzzy
-msgid "CrefoPay RÃŒckerstattung wurde erfolgreich durchgefÃŒhrt."
-msgstr "Letter paper has been deleted."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:274
-msgid ""
-"CrefoPay RÃŒckerstattung konnte nicht ÃŒbermittelt werden. Bitte beachten Sie "
-"das Bestellprotokoll."
-msgstr ""
-"CrefoPay refund could not be submitted. Please note the order protocol."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:287
-#, fuzzy
-msgid "CrefoPay Abschluss wurde erfolgreich durchgefÃŒhrt."
-msgstr "Password has been changed successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:290
-msgid ""
-"CrefoPay Abschluss konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das "
-"Bestellprotokoll."
-msgstr ""
-"CrefoPay completion could not be submitted. Please note the order protocol."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:382
-msgid ""
-"Hier wurde die Warenkorb mit einer Bestellnummer aufgerufen die nicht mit "
-"der BestellID der Session ÃŒbereinstimmt"
-msgstr ""
-"Here the shopping cart was called with an order number that does not match "
-"the orderID of the session"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:444
-msgid "Fehler bei CrefoPay Zahlungsbenachrichtigung (MAC incorrect)"
-msgstr "Error with CrefoPay payment notification (MAC incorrect)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:453
-#, fuzzy
-msgid "Erfolgreiche CrefoPay Zahlungsbenachrichtigung"
-msgstr "PayPal payment successful"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:459
-msgid "Abgelehnte CrefoPay Zahlungsbenachrichtigung"
-msgstr "Rejected CrefoPay payment notification"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:532
-msgid "Fehler bei CrefoPay MNS (MAC incorrect)"
-msgstr "CrefoPay MNS Error (MAC incorrect)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:538
-msgid "Erfolgreiche CrefoPay MNS (#1#)"
-msgstr "successful CrefoPay MNS (#1#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:585
-msgid "Es ist ein Fehler aufgetreten, bitte Shop Betreiber benachrichtigen."
-msgstr "An error has occurred, please notify shop owner."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:639
-msgid "CrefoPay / Unbestimmt"
-msgstr "CrefoPay / unknown"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:735
-msgid "CrefoPay Zahlungsabbruch erfolgreich"
-msgstr "CrefoPay payment successful"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:743
-msgid "CrefoPay Zahlungsabbruch konnte nicht ÃŒbermittelt werden (HASH Fehler)"
-msgstr "CrefoPay payment cancellation could not be transmitted (HASH error)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:765
-#, fuzzy
-msgid "Stornierung"
-msgstr "Cancel invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:791
-#, fuzzy
-msgid "CrefoPay Stornierung erfolgreich"
-msgstr "Domain registration successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:799
-msgid "CrefoPay Stornierung konnte nicht ÃŒbermittelt werden (HASH Fehler)"
-msgstr "CrefoPay cancellation could not be submitted (HASH error)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:851
-#, fuzzy
-msgid "CrefoPay RÃŒckerstattung wurde erfolgreich durchgefÃŒhrt"
-msgstr "Comment has been saved!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:859
-msgid "CrefoPay RÃŒckerstattung konnte nicht durchgefÃŒhrt werden (HASH Fehler)"
-msgstr "CrefoPay refund could not be done (HASH error)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:867
-#, fuzzy
-msgid "CrefoPay RÃŒckerstattung konnte nicht erfolgreich durchgefÃŒhrt werden"
-msgstr "Translation file could not been copied."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:919
-#, fuzzy
-msgid "CrefoPay Status wurde erfolgreich abgefragt"
-msgstr "Status changed successfully!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:938
-#, fuzzy
-msgid "CrefoPay Status konnte nicht abgefragt werden (HASH Fehler)"
-msgstr "Status could no been set!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:987
-#, fuzzy
-msgid "CrefoPay Capture wurde erfolgreich durchgefÃŒhrt"
-msgstr "Letter paper has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:995
-#, fuzzy
-msgid "CrefoPay Capture konnte nicht gestartet werden (HASH Fehler)"
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:1118
-#, fuzzy
-msgid "CrefoPay Zahlung erfolgreich gestartet"
-msgstr "Translation saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:1129
-msgid "CrefoPay Zahlung konnte nicht gestartet werden (UngÃŒltige Antwort)"
-msgstr "CrefoPay payment could not be started (invalid response)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:1138
-msgid "CrefoPay Zahlung konnte nicht gestartet werden (HASH Fehler)"
-msgstr "CrefoPay payment could not be started (HASH error)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:1190
-msgid "CURL Error: #1#"
-msgstr "CURL Error: #1#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_crefopay.class.php:1230
-msgid "CrefoPay Fehler: #1#"
-msgstr "CrefoPay Error: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_fuellmenge.class.php:20
-msgid "FÃŒllmengen"
-msgstr "Filling quantities"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_fuellmenge.class.php:22
-msgid ""
-"Erlaubt das angeben der FÃŒllmenge und die Berechnung des Grundpreises. "
-"Notwendig bei FlÃ€chenprodukten, FlÃŒssigkeiten, o.Ã€. Produkten.<br />nÃ€here "
-"Details siehe <a href=\"http://www.gesetze-im-internet.de/pangv/index.html\" "
-"target=\"\">Preisangabenverordnung</a>."
-msgstr ""
-"Allows the declaration of filling quantities and calculation of base prices. "
-"Necessary for sheet products, liquid products etc. <br />More details can be "
-"found <a href=\"http://www.gesetze-im-internet.de/pangv/index.html\" target="
-"\"\">here</a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:24
-#, fuzzy
-msgid "ProduktArtikel"
-msgstr "Products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:26
-msgid ""
-"Produkte sind ein eigener Wordpress Artikeltyp und erscheinen so als Artikel "
-"und in der Suche."
-msgstr ""
-"Products are a separate Wordpress article type and appear as articles and in "
-"the search."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:116
-msgid "Der Custom Post Type fÃŒr die Produkte kann nun ÃŒbersetzt werden."
-msgstr "The Custom Post Type for the products can now be translated."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:142
-msgid ""
-"Zuordnungen werden neu aufgebaut. Bitte schlieÃen Sie die Seite nicht bis "
-"der Vorgang abgeschlossen ist."
-msgstr ""
-"Assignments are rebuilt. Please do not close the page until the process is "
-"complete."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:150
-msgid "Ein Aufbau der Zuordnung nicht nicht notwendig."
-msgstr "A structure of the assignment is not necessary."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:349
-msgid "Path Key erfolgreich geÃ€ndert. Die Produkt URLs haben sich geÃ€ndert!"
-msgstr "Path key changed successfully. The product URLs have changed!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:355
-msgid "Der Path Key darf nicht leer sein!"
-msgstr "The Path Key can not be empty!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:375
-msgid ""
-"Path Key (Kategorie) erfolgreich geÃ€ndert. Die Kategorie URLs haben sich "
-"geÃ€ndert!"
-msgstr ""
-"Path Key (category) changed successfully. The category URLs have changed!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:381
-msgid "Der Path Key (Kategorie) darf nicht leer sein!"
-msgstr "The Path Key (category) can not be empty!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:393
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:709
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:711
-#, fuzzy
-msgid "Produktkategorien"
-msgstr "Product variables"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:424
-msgid "Socialshareprivacy nicht einbinden (Produktartikel)"
-msgstr "Do not include socialshareprivacy (product article)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:425
-msgid ""
-"Ist diese Option aktiv, so wird die benÃ¶tigte JavaScript Bibliothek "
-"<u>nicht</u> eingebunden, auch wenn die Optionen im <a href=\"#1#"
-"\">Produktartikelmodul</a> aktiv sind."
-msgstr ""
-"If this option is active, the required JavaScript library will not <u> be "
-"included, even if the options in the <a href=\"#1#\"> product article module "
-"</a> are active."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:613
-#, fuzzy
-msgid "Kategorie / Artikel"
-msgstr "Categories"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:670
-msgid "Custom Post Type existiert zu Produkt (ID:#1#) noch nicht."
-msgstr "Custom Post Type does not exist for product (ID: # 1 #) yet."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:712
-#, fuzzy
-msgid "Neue Produktkategorie erstellen"
-msgstr "Create new product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:713
-#, fuzzy
-msgid "Produktkategorie bearbeiten"
-msgstr "Edit product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:725
-#, fuzzy
-msgid "wpShopGermany Produkte"
-msgstr "wpShopGermany product choice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktartikel.class.php:857
-msgid ""
-"Sie haben WPML aktiviert und den Custom Post Type der Produkte nicht "
-"ÃŒbersetzt. Die Ãbersetzung der Produkte kann so nicht korrekt arbeiten. "
-"Klicken Sie <a href=\"#1#\">hier</a> um das Problem zu lÃ¶sen."
-msgstr ""
-"You have enabled WPML and have not translated the custom post type of the "
-"products. The translation of the products can not work properly. Click <a "
-"href=\"#1#\"> here </a> to solve the problem."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:44
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:65
-msgid "SecurePay IW-Systeme"
-msgstr "SecurePay IW-Systeme"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:46
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlung ÃŒber SecurePay IW-Systeme."
-msgstr "Allows the payment method prepayment."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:66
-msgid ""
-"SecurePay IW-Systeme bietet eine sichere Art der Zahlung und unterstÃŒtzt "
-"dabei verschiedene ZahlungsmÃ¶glichkeiten."
-msgstr ""
-"SecurePay IW systems provides a secure way of payment, supporting multiple "
-"payment options."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:250
-msgid "SecurePay IW-Systeme Fehler"
-msgstr "SecurePay IW-Systeme Error"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_securepay.class.php:296
-msgid "SecurePay IW-Systeme Zahlung erfolgt"
-msgstr "SecurePay IW-Systeme payment successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:28
-#, fuzzy
-msgid "Select Box"
-msgstr "Dropdown box"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:29
-msgid "Radio Boxen"
-msgstr "Radio boxes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:30
-#, fuzzy
-msgid "Bilderauswahl"
-msgstr "salutation_select"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:35
-msgid ""
-"ErmÃ¶glicht es zentral Varianten anzulegen und diese im Produkt zu aktivieren."
-msgstr ""
-"Enables you to create variants centrally and activate them in the product."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:558
-msgid "Variante erfolgreich angelegt."
-msgstr "Variation has been created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:586
-#, fuzzy
-msgid "Variantenreihenfolge gespeichert."
-msgstr "Profile has been saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:621
-#, fuzzy
-msgid "Variationenreihenfolge gespeichert."
-msgstr "Variation has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:641
-msgid "Variante wurde erfolgreich gelÃ¶scht."
-msgstr "Variation has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:654
-msgid "Variante wurde erfolgreich aktiviert."
-msgstr "Variation has been activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:661
-msgid "Variante wurde erfolgreich deaktiviert."
-msgstr "Variation has been deactivated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:680
-msgid "Variation wurde erfolgreich angelegt."
-msgstr "Variation has been created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:705
-msgid "Variation wurde erfolgreich gelÃ¶scht."
-msgstr "Variation has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:720
-msgid "Variation wurde erfolgreich aktiviert."
-msgstr "Variation has been activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:727
-msgid "Variation wurde erfolgreich deaktiviert."
-msgstr "Variation has been deactivated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:1756
-#, fuzzy
-msgid "Administrator"
-msgstr "Dear shop administrator,"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:1776
-msgid "Der Minimalbestand der Variation #1# des Produkts #2# wurde erreicht."
-msgstr ""
-"The minimum inventory of variation # 1 # of product # 2 # has been reached."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:2348
-#, fuzzy
-msgid "Varianten Name"
-msgstr "Variants"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:2349
-#, fuzzy
-msgid "Varianten Artikelnummer"
-msgstr "Item number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:2364
-#, fuzzy
-msgid "Produktvariante"
-msgstr "Product variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:2365
-#, fuzzy
-msgid "Globale Variante"
-msgstr "Global settings"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:2367
-msgid "Unbenannte #1# (ID:#2#)"
-msgstr "unknown  #1# (ID:#2#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvariants.class.php:2368
-msgid "#1# #2# (ID:#3#)"
-msgstr "#1# #2# (ID:#3#)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnoverperhour.class.php:70
-msgid "Umsatz pro Stunde (Gesamt)"
-msgstr "Sales per hour (total)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnoverperhour.class.php:241
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:262
-msgid "Quartal"
-msgstr "quarter"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnoverperhour.class.php:509
-#, fuzzy
-msgid "Statistikdaten"
-msgstr "Statistic"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_topsellertosales.class.php:23
-#, fuzzy
-msgid "Sonstige"
-msgstr "Miscellaneous"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:87
-msgid "GeschÃ€ftsjahr"
-msgstr "buisness year"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:258
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:773
-msgid "KW"
-msgstr "KW"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:613
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:673
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:731
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:789
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_statistics/wpsg_turnover.class.php:841
-#, fuzzy
-msgid "Statistikdaten "
-msgstr "Statistic"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php:15
-msgid "wpShopGermany Login"
-msgstr "wpShopGermany login"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:21
-#, fuzzy
-msgid "ErmÃ¶glicht die Erstellung von Anschreibenen."
-msgstr "Allows you to show pages for product views."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:28
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:33
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:30
-msgid "Firmenname"
-msgstr "Company name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:33
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:38
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:35
-msgid "Tel"
-msgstr "Phone"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:36
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:41
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:38
-msgid "Web"
-msgstr "Web"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:37
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:42
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:39
-msgid "Steuer-Nr"
-msgstr "Tax number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:42
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:47
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:44
-msgid "Benutzer 1"
-msgstr "User defined 1"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:43
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:48
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:45
-msgid "Benutzer 2"
-msgstr "User defined 2"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:44
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:49
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:46
-msgid "Benutzer 3"
-msgstr "User defined 3"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:45
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:50
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:47
-msgid "Benutzer 4"
-msgstr "User defined 4"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:46
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:51
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:48
-msgid "Benutzer 5"
-msgstr "User defined 5"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:137
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:113
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:146
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:187
-msgid ""
-"UngÃŒltiger Dateityp (Briefpapier) ! Es sind nur JPG und PDF Dateien erlaubt!"
-msgstr "Unvalid file type (letter paper)! Allowed are jpeg and pdf files only!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:154
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:164
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:210
-msgid "Briefpapier wurde erfolgreich gelÃ¶scht."
-msgstr "Letter paper has been deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:173
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:186
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:232
-msgid "UngÃŒltiger Dateityp (Logo) ! Es sind nur JPG und PDF Dateien erlaubt!"
-msgstr "Invalid file type (logo)! Allowed are jpeg and pdf files only."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:185
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:199
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:248
-msgid "Logo wurde erfolgreich gelÃ¶scht."
-msgstr "Logo has been deleted."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:244
-msgid ""
-"Beim Erstellen des Anschreibendokumentes wurde keine BestellID ÃŒbergeben"
-msgstr "When creating the mailing document, no orderID was passed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:287
-msgid "Das Anschreibendokument wurde nicht wie vorgesehen angelegt"
-msgstr "The mailing document was not created as planned"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:299
-#, fuzzy
-msgid "Beim Erstellen des Anschreibendokumentes ist ein Fehler aufgetreten"
-msgstr "Mail could not be sent due to an error!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:322
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:409
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:119
-msgid "Grundeinstellungen wieder hergestellt"
-msgstr "Restored factory settings"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:407
-msgid "Musterfirma"
-msgstr "muster company"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:408
-msgid "Max"
-msgstr "Max"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:409
-msgid "Mustermann"
-msgstr "mustermann"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:410
-#, fuzzy
-msgid "MusterstraÃe"
-msgstr "Street"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_coverletter.class.php:413
-msgid "Musterhausen"
-msgstr "mustercity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:24
-msgid "ErmÃ¶glicht die Zuordnung von Produkten zu Produktgruppen."
-msgstr "Allows to assign products to product groups."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:83
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:773
-msgid "Nicht zugeordnet"
-msgstr "Not assigned"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:275
-msgid "Nicht zugewiesen."
-msgstr "Not assigned."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:498
-#, fuzzy
-msgid "Produktgruppe ID"
-msgstr "Product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:499
-#, fuzzy
-msgid "Produktgruppe Name"
-msgstr "Product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:695
-msgid "Produktgruppe wurde erfolgreich gelÃ¶scht."
-msgstr "Product group deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:717
-msgid "Produktgruppe erfolgreich gespeichert."
-msgstr "Product group saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:725
-msgid "Produktgruppe erfolgreich angelegt."
-msgstr "Product group created successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:768
-msgid "Individuelle Produkttemplates"
-msgstr "Customized product templates"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:806
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:307
-msgid "Menge ÃŒberschreitet Warenbestand!"
-msgstr "Quantity exceeds stock!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productgroups.class.php:810
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:301
-msgid "Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet!"
-msgstr "Quantity was reduced because it exceeded the stock!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_userpayment.class.php:24
-msgid "Erlaubt das anlegen von benutzerdefinierten Zahlungsarten."
-msgstr "Allows you to create customized payment methods."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_userpayment.class.php:68
-msgid "Anklicken um den Namen der Zahlvariante zu Ã€ndern ..."
-msgstr "Click to change the name of the payment method..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:24
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:612
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:51
-msgid "PayPal"
-msgstr "PayPal"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:26
-msgid "ErmÃ¶glicht die Zahlungsart PayPal."
-msgstr "Allows the payment method PayPal."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:35
-msgid "Zahlen Sie die Bestellung mittels ihres PayPal Kontos."
-msgstr "Pay your order using your Paypal account or as a PayPal guest."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:122
-msgid "Erfolgreiche PayPal Zahlung"
-msgstr "PayPal payment successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:123
-msgid "Fehlgeschlagene PayPal Zahlung"
-msgstr "PayPal payment failed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:145
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:439
-#, fuzzy
-msgid "Status der Zahlung (#1#) erfolgreich abgefragt."
-msgstr "Status changed successfully!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:161
-msgid ""
-"Das Modul \"PayPal\" ist aktiviert und es wurden keine API Zugangsdaten "
-"hinterlegt. Gehen Sie in die <a href=\"#1#\">Einstellungen</a> des Moduls um "
-"die API Daten zu hinterlegen."
-msgstr ""
-"The module \"PayPal\" is activated and no API access data has been stored. "
-"Go to the module's <a href=\"#1#\"> settings </a> to save the API data."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:278
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:178
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:427
-msgid "Zahlung erfolgreich ÃŒber die PayPal API storniert."
-msgstr "Payment successfully canceled via the PayPal API."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:279
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:179
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:428
-msgid ""
-"Es gab ein Problem bei der Stornierung der Zahlung ÃŒber die PayPal API. "
-"Bitte Bestellprotokoll beachten."
-msgstr ""
-"There was a problem with the cancellation of the payment via the PayPal API. "
-"Please note ordering protocol."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:388
-msgid "PayPal VERIFIED"
-msgstr "PayPal VERIFIED"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:408
-msgid "PayPal FAILED"
-msgstr "PayPal FAILED"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:526
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:678
-#, fuzzy
-msgid "Keine Bestellung zu PaymentID gefunden."
-msgstr "No orders for that token found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:538
-msgid "PayPal Erfolg: "
-msgstr "Paypal Success"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:544
-#, fuzzy
-msgid "PayPal Abgelehnt: "
-msgstr "Pay with PayPal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:567
-msgid "Beim start der Zahlung wurde keine BestellID ÃŒbergeben."
-msgstr "At the start of the payment, no order ID was transferred."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:584
-#, fuzzy
-msgid "PayPal Fehler: Zahlung konnte nicht erneut ausgefÃŒhrt werden"
-msgstr "There were technical problems, the repay could not be performed."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:606
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:723
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:902
-msgid "PayPal Fehler: #1#"
-msgstr "Paypal Error: #1#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:608
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:725
-msgid "PayPal Fehler, bitte Shop Betreiber kontaktieren."
-msgstr "PayPal error, please contact shop owner."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:615
-msgid ""
-"Es wurde versucht eine Zahlung zu starten zu einer Bestellung die nicht mit "
-"PayPalAPI ausgefÃŒhrt wurde"
-msgstr ""
-"An attempt was made to start a payment for an order that was not executed "
-"with PayPalAPI"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:825
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:948
-#, fuzzy
-msgid "WebHook ist bereits registriert."
-msgstr "No domains registered yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:837
-msgid ""
-"WebHook konnte nicht abgefragt/angelegt werden. Zugangsdaten ÃŒberprÃŒfen und "
-"erneut speichern."
-msgstr ""
-"WebHook could not be queried / created. Check access data and save again."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:855
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:960
-#, fuzzy
-msgid "WebHook erfolgreich angelegt."
-msgstr "Product created successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:862
-#, fuzzy
-msgid "WebHook konnte nicht angelegt werden. (#1#)"
-msgstr "Directory could not be created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypal.class.php:874
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:995
-#, fuzzy
-msgid "Bei einer Stornierung konnte Bestellung nicht geladen werden"
-msgstr "CSV file could no be loaded!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:29
-msgid "Konverter"
-msgstr "converter"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:31
-msgid "ErmÃ¶glicht die Konvertierung von WPSG3 nach WPSG4."
-msgstr "Allows conversion from WPSG3 to WPSG4."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:175
-msgid "Konverter beendet. Statuscode: "
-msgstr "Converter finished. Status Code:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:315
-msgid ""
-"Der M1-Konverter integriert die Daten in die neue wpShopGermany Version 4."
-msgstr ""
-"The M1 converter integrates the data into the new wpShopGermany version 4."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:323
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:415
-msgid "WPSG-Installation gefunden in: "
-msgstr "WPSG installation found in:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:328
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:420
-#, fuzzy
-msgid "<br />Keine WPSG-Installation gefunden!"
-msgstr "No template found!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:334
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:426
-msgid "<br /> WPSG-Version: "
-msgstr "<br /> WPSG-Version: "
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:342
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:434
-msgid "<br /> WPSG-Version OK."
-msgstr "<br /> WPSG-Version OK."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:347
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:439
-msgid "<br />WPSG-Version zu niedrig!"
-msgstr "<br />WPSG-Version to low!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:407
-msgid ""
-"Der M1-Konverter wandelt die bestehenden Daten aus Ihrer wpShopGermany "
-"Version 3 um und integriert die Daten in die neue wpShopGermany Version 4."
-msgstr ""
-"The M1 converter converts the existing data from your wpShopGermany version "
-"3 and integrates the data into the new wpShopGermany version 4."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:473
-msgid "<br /><br />Bilderverzeichnis fÃŒr Produkt 1: "
-msgstr "<br /> <br /> Picture directory for product 1:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_converter.class.php:483
-msgid ""
-"WÃ€hlen Sie die gewÃŒnschte Aktion aus. AbhÃ€ngig vom Umfang kann die "
-"Ãbertragung ein paar Minuten dauern. WÃ€hrend dieser Zeit ist es ratsam, "
-"keine VerÃ€nderungen an der Instanz vorzunehmen oder andere Prozesse "
-"zeitgleich abzuarbeiten."
-msgstr ""
-"Select the desired action. Depending on the size, the transfer may take a "
-"few minutes. During this time, it is advisable to make no changes to the "
-"instance or to process other processes at the same time."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_prepayment.class.php:20
-msgid "Vorkasse"
-msgstr "Prepayment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_prepayment.class.php:22
-msgid "ErmÃ¶glicht die Zahlungsart Vorkasse."
-msgstr "Allows the payment method prepayment."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_prepayment.class.php:31
-msgid ""
-"Zahlen Sie die Bestellung mittels Ãberweisung. Der Betreff wird ihnen in der "
-"BestellbestÃ€tigung mitgeteilt."
-msgstr ""
-"Pay your order via bank transfer. The reference for the transaction will be "
-"notified within the order confirmation."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_prepayment.class.php:84
-msgid ""
-"Die Zahlungsart \"Vorkasse\" ist aktiv, es wurden aber nur unvollstÃ€ndige "
-"Kontodaten angegeben. ÃberprÃŒfen Sie die <a href=\"#1#\">Moduleinstellungen</"
-"a>."
-msgstr ""
-"The payment method \"advance payment\" is active, but only incomplete "
-"account details have been specified. Check the <a href=\"#1#\"> module "
-"settings </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:25
-msgid "ErmÃ¶glicht das Erfassen von Kundeneingaben zu Bestellungen."
-msgstr "Allows to gather customer input on orders."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:29
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:30
-msgid "Texteingabe"
-msgstr "Text input"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:71
-msgid "Anklicken um den Namen der Bestellvariablen zu Ã€ndern ..."
-msgstr "Klick to change the name of the order variable..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:72
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:85
-msgid "Bitte zum Bearbeiten anklicken."
-msgstr "Please click to edit."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:169
-msgid "Bitte treffen Sie im Feld #1# eine Auswahl."
-msgstr "Please select a value for field #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:183
-msgid "Bitte tragen Sie in das Feld #1# einen Wert ein."
-msgstr "Please enter a value in field #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordervars.class.php:197
-msgid "Bitte aktivieren Sie das Feld #1#."
-msgstr "Please activate the field #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:23
-msgid ""
-"Ist dieses Modul aktiv, so lassen sich Rabatte abhÃ€ngig vom Bestellwert "
-"vergeben. Der Bestellwert ist der Artikelpreis + Kosten fÃŒr Versandkosten "
-"etc."
-msgstr ""
-"If activated, this module allows you to define discounts depending on the "
-"order value. The order value is calculated as follows: price of the article "
-"+ shipping costs etc."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:112
-msgid "Bitte einen gÃŒltigen Bestellwert und einen Rabatt eingeben!"
-msgstr "Please enter a valid order value and discount!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:1329
-msgid "Produktgruppenrabatt"
-msgstr "Discount for product group"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:1330
-#, fuzzy
-msgid "Kundengruppenrabatt"
-msgstr "Discount for product group"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_discount.class.php:1332
-msgid "Es konnte kein Name fÃŒr einen Rabatttyp zurÃŒckgegeben werden"
-msgstr "No name could be returned for a discount type"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:24
-msgid "wirecard"
-msgstr "wirecard"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:26
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlungsart wirecard."
-msgstr "Allows the payment method \"Invoice\"."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:35
-msgid "wirecard Checkout Page"
-msgstr "wirecard Checkout Page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:37
-msgid ""
-"Zahlen Sie die Bestellung mittels wirecard. Ãber wirecard sind verschiedene "
-"Zahlungsarten wie PayPal, SofortÃŒberweisung oder Kreditkarte mÃ¶glich."
-msgstr ""
-"Pay the order via wirecard. Via wirecard different payment methods such as "
-"PayPal, SofortÃŒberweisung or credit card are possible."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:107
-#, fuzzy
-msgid "Erfolgreiche wirecard Zahlung"
-msgstr "PayPal payment successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:108
-#, fuzzy
-msgid "Fehlgeschlagene wirecard Zahlung"
-msgstr "Failed Billsafe payment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:109
-msgid "Abgebrochene wirecard Zahlung"
-msgstr "Canceled wirecard payment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:110
-msgid "Unbestimmte wirecard Zahlung"
-msgstr "Unspecified wirecard payment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:139
-msgid ""
-"Das Modul \"wirecard\" ist aktiviert und es wurde kein geheimer SchlÃŒssel "
-"und keine Kunden ID hinterlegt. Gehen Sie in die <a href=\"#1#"
-"\">Einstellungen</a> des Moduls um den geheimen SchlÃŒssel zu hinterlegen."
-msgstr ""
-"The \"wirecard\" module is activated and no secret key or customer ID has "
-"been deposited. Go into the module's <a href=\"#1#\"> settings </a> to "
-"deposit the secret key."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:179
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:598
-msgid "Auswahl innerhalb wirecard"
-msgstr "Selection within wirecard"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:250
-msgid ""
-"Die Zahlungsart wirecard - Rechnung ist auf Grund eines ungÃŒltigen "
-"Rechnungsbetrages nicht mÃ¶glich."
-msgstr ""
-"The payment method wirecard - Invoice is not possible due to an invalid "
-"invoice amount."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:437
-#, fuzzy
-msgid "wirecard Fehler: Zahlung konnte nicht gestartet werden."
-msgstr "Translation file could not been copied."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:536
-#, fuzzy
-msgid "wirecard VERIFIED"
-msgstr "PayPal VERIFIED"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:554
-msgid "wirecard FAILED"
-msgstr "Wirecard FAILED"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:599
-msgid "Bancontact/Mister Cash"
-msgstr "Bancontact/Mister Cash"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:600
-msgid "CLICK2PAY"
-msgstr "CLICK2PAY"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:601
-msgid "Credit Card"
-msgstr "CrÃ©dit Card"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:602
-msgid "eKonto"
-msgstr "eKonto"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:603
-msgid "EPS e-payment (\"EPS Online Ãberweisung\")"
-msgstr "EPS e-payment (\"EPS Online payment\")"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:604
-msgid "giropay"
-msgstr "giropay"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:605
-msgid "iDEAL"
-msgstr "iDEAL"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:606
-msgid "Installment by payolution or RatePAY"
-msgstr "Installment by payolution or RatePAY"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:607
-msgid "Invoice by payolution or RatePAY"
-msgstr "Invoice by payolution or RatePAY"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:608
-msgid "Maestro SecureCode"
-msgstr "Maestro SecureCode"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:609
-msgid "moneta.ru"
-msgstr "moneta.ru"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:610
-msgid "mpass"
-msgstr "mpass"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:611
-msgid "Przelewy24"
-msgstr "Przelewy24"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:613
-msgid "Paybox"
-msgstr "paybox"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:614
-msgid "POLi payments"
-msgstr "POLi payments"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:615
-msgid "Paysafecard"
-msgstr "Paysafecard"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:616
-msgid "Quick"
-msgstr "quick"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:617
-msgid "SEPA Direct Debit"
-msgstr "SEPA direct debit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:618
-#, fuzzy
-msgid "Skrill Direct"
-msgstr "Skrill"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:619
-msgid "Skrill Digital Wallet"
-msgstr "skrill digital wallet"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:620
-msgid "sofort.com"
-msgstr "sofort.com"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_wirecard.class.php:621
-msgid "Trustly"
-msgstr "trustly"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:19
-msgid ""
-"Erlaubt es in der Bestellverwaltung dem Kunden eine AuftragsbestÃ€tigung zu "
-"senden."
-msgstr ""
-"Allows to send the order confirmation to the customer from the order "
-"management menu."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:26
-msgid "Ihre AuftragsbestÃ€tigung"
-msgstr "Your order confirmation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:67
-msgid "E-Mail AuftragsbestÃ€tigung (Kunde)"
-msgstr "Email order confirmation (customer)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:68
-msgid ""
-"Diese Mail bekommt der Kunde wenn eine AuftragsbestÃ€tigung versand wird."
-msgstr "This mail is send to the customer as order confirmation."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:182
-msgid "AuftragsbestÃ€tigung wurde versendet."
-msgstr "Order confirmation has been sent."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_auftragsbestaetigung.class.php:209
-#, fuzzy
-msgid "AuftragsbestÃ€tigung versendet an:#1#"
-msgstr "Order confirmation sent"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_anschreiben/wpsg_anschreiben.class.php:22
-msgid "Konnte Anschreiben nicht laden, ungÃŒltige ID ÃŒbergeben"
-msgstr "Could not load cover letter, passed invalid ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:20
-#, fuzzy
-msgid "GutscheinProdukt"
-msgstr "Voucher code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:22
-#, fuzzy
-msgid "Erlaubt das Verkaufen von Gutscheinen."
-msgstr "Allows to create vouchers."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:40
-#, fuzzy
-msgid "Ihr gekaufter Gutschein"
-msgstr "New voucher"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:207
-msgid "Automatisch Erstellt aus Bestellung #1# / Produkt #2#"
-msgstr "Automatically created from order # 1 # / product # 2 #"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:261
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:422
-#, fuzzy
-msgid "Gutscheinmail an: #1#"
-msgstr "Credit voucher to #1#"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:265
-msgid "Es wurden #1# Gutscheine generiert und an den Kunden verschickt."
-msgstr "# 1 # vouchers were generated and sent to the customer."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:273
-msgid "Es wurden #1# Gutscheine generiert aber nicht verschickt."
-msgstr "# 1 # vouchers were generated but not sent."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:310
-msgid ""
-"Es wurden bereits #1# Gutscheine eingelÃ¶st, diese wurden nicht gelÃ¶scht. "
-"Bitte greifen Sie ggf. manuell ein!"
-msgstr ""
-"# 1 # vouchers have already been redeemed, they have not been deleted. "
-"Please intervene manually if necessary!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:311
-#, fuzzy
-msgid "Es wurden #1# Gutscheine gelÃ¶scht."
-msgstr "Vouchers deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:324
-#, fuzzy
-msgid "Gutscheinprodukte"
-msgstr "Voucher code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:342
-#, fuzzy
-msgid "Gutscheinmail"
-msgstr "Voucher"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:343
-msgid ""
-"Diese Mail bekommt der Kunde beim Kauf (Bezahlung) von Gutscheinprodukten. "
-"Die PDF Gutscheine sind im Anhang dieser Mail."
-msgstr ""
-"This mail gets the customer when buying (payment) voucher products. The PDF "
-"vouchers are attached to this mail."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:370
-#, fuzzy
-msgid "Keine Gutscheine fÃŒr die Bestellung gefunden!"
-msgstr "No orders for that token found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:426
-msgid "Es wurden #1# Gutscheine an den Kunden verschickt."
-msgstr "# 1 # vouchers have been sent to the customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:436
-#, fuzzy
-msgid "Gutschein nicht gefunden!"
-msgstr "Order has not been found!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:440
-#, fuzzy
-msgid "Gutscheindokument nicht gefunden!"
-msgstr "Order has not been found!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:525
-msgid "Gutscheinprodukt: Generierter Code"
-msgstr "Coupon product: Generated code"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:526
-msgid "Gutscheinprodukt: GÃŒltig ab"
-msgstr "Voucher product: Valid from"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:527
-msgid "Gutscheinprodukt: GÃŒltig bis"
-msgstr "Coupon product: Valid until"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:723
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1065
-msgid "Ausgelaufen"
-msgstr "Expired"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_voucherproduct.class.php:729
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1071
-msgid "UngÃŒltig"
-msgstr "Invalid"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:25
-#, fuzzy
-msgid "InternetKasse"
-msgstr "Internal ID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:27
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlungsabwicklung ÃŒber die Sparkassen-Internetkasse."
-msgstr "Allows the payment method prepayment."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:36
-msgid ""
-"WÃ€hlen Sie diese Zahlungsart, um die Zahlung ÃŒber die Sparkassen Internet "
-"Kasse durchzufÃŒhren. (Kreditkarte)"
-msgstr ""
-"Select this payment method to make the payment through the Sparkassen "
-"Internet Kasse. (Credit card)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:38
-msgid "Geldkarte"
-msgstr "Money card"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:40
-msgid ""
-"WÃ€hlen Sie diese Zahlungsart, um die Zahlung ÃŒber die Sparkassen Internet "
-"Kasse durchzufÃŒhren. (Geldkarte)"
-msgstr ""
-"Select this payment method to make the payment through the Sparkassen "
-"Internet Kasse. (Cash card)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:42
-#, fuzzy
-msgid "Lastschrift"
-msgstr "Credit voucher"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:44
-msgid ""
-"WÃ€hlen Sie diese Zahlungsart, um die Zahlung ÃŒber die Sparkassen Internet "
-"Kasse durchzufÃŒhren. (Lastschrift)"
-msgstr ""
-"Select this payment method to make the payment through the Sparkassen "
-"Internet Kasse. (Debit)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:149
-msgid "Erfolgreiche Zahlung (Sparkassen Internetkasse)"
-msgstr "Successful payment (Sparkassen Internetkasse)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:150
-msgid "Fehlgeschlagene Zahlung (Sparkassen Internetkasse)"
-msgstr "Failed payment (Sparkassen Internetkasse)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:354
-msgid ""
-"URL Erreichbar, aber orderid zum bilden des Hashs nicht ÃŒbergeben! URL "
-"sollte erst nach Zahlung mit den Daten angefragt werden. RÃŒckgabe ist dann "
-"die Zielurl. Ohne orderid ist auch keine interne Zuordnung der Bestellung "
-"mÃ¶glich, deswegen hier Abbruch."
-msgstr ""
-"URL Reachable, but not orderid to make the hash! URL should only be "
-"requested after payment with the data. Return is then the Zielurl. Without "
-"orderid also no internal assignment of the order is possible, so cancel here."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:393
-msgid "Sparkassenkasse HASH Fehler"
-msgstr "Sparkasse HASH Error"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:407
-msgid "Sparkassenkasse Zahlungseingang: #1#"
-msgstr "Savings Bank Cashier Incoming: # 1 #"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shs.class.php:431
-msgid "Sparkassenkasse Fehler: #1#"
-msgstr "Sparkasse Error: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:21
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:699
-#, fuzzy
-msgid "Lieferschein"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:23
-#, fuzzy
-msgid "ErmÃ¶glicht die Erstellung von Lieferscheinen."
-msgstr "Allows you to show pages for product views."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:45
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:42
-msgid "BLZ"
-msgstr "Bank code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:84
-#, fuzzy
-msgid "Ihr Lieferschein"
-msgstr "Shipping address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:211
-#, fuzzy
-msgid "Produktbeschreibung auf Lieferschein anzeigen"
-msgstr "Show product description on invoice"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:212
-#, fuzzy
-msgid "Varianten auf Lieferschein anzeigen"
-msgstr "Show product variables on invoice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:248
-msgid ""
-"Es wurde versucht ein Lieferschein von einer anderen Bestellung anzuzeigen"
-msgstr "An attempt was made to display a delivery note from another order"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:259
-msgid ""
-"Beim Erstellen des Lieferscheindokumentes wurde keine BestellID ÃŒbergeben"
-msgstr "When creating the delivery note document, no order ID was transferred"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:268
-msgid "Ein Lieferschein wurde fÃŒr ein Produkt bereits erstellt"
-msgstr "A delivery note has already been created for a product"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:305
-msgid "Das Lieferscheindokument wurde nicht wie vorgesehen angelegt"
-msgstr "The delivery note document was not created as planned"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:350
-#, fuzzy
-msgid "Beim Erstellen des Lieferscheindokumentes ist ein Fehler aufgetreten"
-msgstr "Mail could not be sent due to an error!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:421
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:422
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:145
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:146
-msgid "Zum Bearbeiten anklicken"
-msgstr "Click to edit"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:474
-msgid "E-Mail mit dem Lieferschein"
-msgstr "E-Mail with deliverynote"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:475
-#, fuzzy
-msgid "Diese Mail geht an den Kunden oder an die angegebene E-Mail Adresse"
-msgstr "This email is sent to the customer when the invoice is written."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:541
-msgid ""
-"Das Lieferscheindokument wurde beim Senden der Bestellmail nicht gefunden"
-msgstr "The delivery note document was not found when sending the order mail"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:690
-msgid "LieferscheinVorschau.pdf"
-msgstr "deliverynote preview.pdf"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_deliverynote.class.php:691
-#, fuzzy
-msgid "Lieferschein Vorschau"
-msgstr "Width (preview)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:32
-#, fuzzy
-msgid "ErmÃ¶glicht eine gestaffelte Preisgestaltung"
-msgstr "Allows the payment method SofortBanking."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:212
-#, fuzzy
-msgid "Preisstaffel im Produkttemplate anzeigen"
-msgstr "Show directly in product template?"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:325
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:365
-msgid "UngÃŒltige Preisberechnung bei Produkttemplate"
-msgstr "Invalid price calculation for product template"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_scaleprice.class.php:442
-msgid "UngÃŒltige Preisberechnung im Frontend"
-msgstr "Invalid price calculation in the frontend"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:27
-#, fuzzy
-msgid "Erlaubt das Hochladen von Dateien zu Bestellungen."
-msgstr "Allows to gather customer input on orders."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:98
-#, fuzzy
-msgid "Bitte eine Datei zum Upload wÃ€hlen."
-msgstr "Please select an action!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:111
-#, fuzzy
-msgid "Bitte eine gÃŒltige Dateiendung verwenden."
-msgstr "Please select a valid payment method."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:146
-#, fuzzy
-msgid "Datei wurde erfolgreich hochgeladen."
-msgstr "You have been logged in successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:200
-msgid "Sie mÃŒssen bei Produkt \"#1#\" mindestens #2# Datei(en) angeben."
-msgstr "You must specify at least # 2 # file (s) for product \"# 1 #\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:222
-#, fuzzy
-msgid "Dokument wurde aus der Bestellung entfernt."
-msgstr "Voucher has been successfully added to your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:245
-#, fuzzy
-msgid "Datei existiert nicht mehr auf dem Server."
-msgstr "File could not be transfered."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:355
-msgid ""
-"Sie haben die maximale Anzahl an Dateien (#1#) fÃŒr dieses Produkt erreicht."
-msgstr "You have reached the maximum number of files (# 1 #) for this product."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_orderupload.class.php:372
-#, fuzzy
-msgid "Datei konnte nicht gefunden werden."
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_onepagecheckout.class.php:24
-#, fuzzy
-msgid "EinSeitenCheckout"
-msgstr "Register in checkout"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_onepagecheckout.class.php:26
-#, fuzzy
-msgid "ErmÃ¶glicht den Bestellablauf auf einer Seite"
-msgstr "Allows you to generate invoices in the PDF format."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_onepagecheckout.class.php:55
-#, fuzzy
-msgid "Kasse"
-msgstr "Street"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:23
-msgid "Erlaubt die Verwaltung des Lagerbestandes bei den Produkten."
-msgstr "Allows to manage the stock of your products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:108
-#, fuzzy
-msgid "Aufrufsfehler! Fehlercode:#1#"
-msgstr "Error in procedure call!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:343
-#, fuzzy
-msgid ""
-"Die ausgewÃ€hlte Menge wurde korrigiert, da sie den Warenbestand "
-"ÃŒberschreitet!"
-msgstr "Quantity was reduced because it exceeded the stock!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:351
-msgid ""
-"Bitte beachten Sie, dass die ausgewÃ€hlte Menge den Warenbestand "
-"ÃŒberschreitet, die Bestellung jedoch abgeschlossen werden kann! Bei Fragen "
-"zur Bestellung, wenden Sie sich bitte an uns."
-msgstr ""
-"Please note that the selected quantity exceeds the stock, but the order can "
-"be completed! For questions about the order, please contact us."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:377
-msgid ""
-"Der Lagerbestand von Produkt \"#1#\" hat sich zwischenzeitlich verÃ€ndert. Es "
-"sind nur noch #2# StÃŒck verfÃŒgbar."
-msgstr ""
-"The stock of product \"# 1 #\" has changed in the meantime. There are only # "
-"2 # pieces available."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:402
-msgid "Bestand / Gew. / FÃŒllm."
-msgstr "Stock / weight"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_stock.class.php:750
-msgid "Der Minimalbestand im Produkt #1# wurde erreicht."
-msgstr "The minimum inventory in product # 1 # has been reached."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:29
-#, fuzzy
-msgid "AnfrageProdukte"
-msgstr "Amount products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:31
-msgid ""
-"ErmÃ¶glicht es fÃŒr bestimmte Produkte Anfragen an den Shopbetreiber zu "
-"stellen."
-msgstr "Allows to make inquiries to the shop operator for certain products."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:68
-msgid "Anfrage"
-msgstr "Request"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:69
-#, fuzzy
-msgid "Vielen Dank fÃŒr Ihre Anfrage"
-msgstr "thank you for your order."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:122
-msgid "Anfrageliste wurde aktualisiert."
-msgstr "The customer budget is only available to logged in customers!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:140
-#, fuzzy
-msgid "Vielen Dank fÃŒr Ihre Anfrage."
-msgstr "thank you for your order."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:162
-#, fuzzy
-msgid "Produkt erfolgreich aus Anfrageliste entfernt."
-msgstr "Product removed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:163
-#, fuzzy
-msgid "Produkt konnte nicht aus Anfrageliste entfernt werden."
-msgstr "Module could not be activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:222
-#, fuzzy
-msgid "Produktbild auf Anfrageseite anzeigen"
-msgstr "Show product variables on invoice"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:238
-msgid "Mail an Shopbetreiber bei neuer Anfrage"
-msgstr "Mail to shop owner on new request"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:239
-msgid "E-Mail die bei einer neuen Anfrage an den Shopbetreiber gesendet wird."
-msgstr "E-mail that is sent to the shop operator on a new request."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:245
-msgid ""
-"E-Mail die bei einer neuen Anfrage an den Kunden gesendet wird. (BestÃ€tigung "
-"der Anfrage)."
-msgstr ""
-"E-mail sent to the customer on a new request. (Confirmation of the request)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:491
-#, fuzzy
-msgid "Keine Produkte in der Anfrageliste!"
-msgstr "No products in database found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:701
-#, fuzzy
-msgid "Bitte eine Auswahl im Feld \"#1#\" in Produkt \"#2#\" treffen!"
-msgstr "Please select your entry for \"#1#\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:711
-#, fuzzy
-msgid "Bitte machen Sie eine Angabe im Feld \"#1#\" in Produkt \"#2#\"!"
-msgstr "Please enter a value in field #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_request.class.php:719
-#, fuzzy
-msgid "Bitte akzeptieren Sie \"#1#\" in Produkt \"#2#\"!"
-msgstr "Please activate the field #1#."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_topseller.class.php:18
-msgid "TopSeller"
-msgstr "Topseller"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_topseller.class.php:20
-#, fuzzy
-msgid "ErmÃ¶glicht es Produkte als \"TopSeller\" darzustellen."
-msgstr "Allows you to specify pictures for your products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:22
-#, fuzzy
-msgid ""
-"ErmÃ¶glicht das Verwalten von Kundenbudgets und die Zahlung mit dem Budget."
-msgstr "Allows to gather customer input on orders."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:52
-#, fuzzy
-msgid "Zahlen Sie ihre Rechnung mit ihrem Kundenbudget."
-msgstr "Pay your order using your Paypal account or as a PayPal guest."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:114
-msgid "Das Kundenbudget ist nur fÃŒr eingelogte Kunden verfÃŒgbar!"
-msgstr "The customer budget is only available to logged in customers!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:126
-msgid "Ihr Budget reicht fÃŒr diese Bestellung leider nicht mehr aus!"
-msgstr "Your budget is no longer sufficient for this order!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customerbudget.class.php:164
-#, fuzzy
-msgid "Kontostand: #1#"
-msgstr "Bank account number: #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:23
-msgid "Erlaubt das Erstellen von Gutscheinen."
-msgstr "Allows to create vouchers."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:242
-msgid "Bitte eine CSV Datei angeben!"
-msgstr "Please select a CSV file!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:266
-msgid "CSV Datei konnte nicht geladen werden!"
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:284
-msgid "CSV Datei ungÃŒltig. (Spalte \"#1#\" muss vorhanden sein)"
-msgstr "Invalid CSV file. (column \"#1#\" missing)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:314
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:327
-msgid ""
-"Spalte \"#1#\" in Zeile #2# enthÃ€lt kein gÃŒltiges Datum -> Zeile wurde "
-"ÃŒbersprungen"
-msgstr ""
-"Column \"#1#\" in line #2# does not contain a valid date. This line has been "
-"ignored."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:340
-msgid ""
-"UngÃŒltiger Gutscheincode in Zeile #1# (zu Kurz) -> Zeile wurde ÃŒbersprungen"
-msgstr ""
-"Invalid voucher code in line #1# (to short). This line has been ignored."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:352
-msgid ""
-"UngÃŒltiger Gutscheinwert in Zeile #1# (kleiner gleich 0) -> Zeile wurde "
-"ÃŒbersprungen"
-msgstr ""
-"Invalid voucher value in line #1# (lower or equal 0). This line has been "
-"ignored."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:373
-msgid "Code aus Zeile #1# existierte schon und wurde ÃŒberschrieben."
-msgstr "Code from line #1# already existed and has been overwritten."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:384
-msgid "Code (#1#) aus Zeile #2# existiert schon -> Zeile wurde ÃŒbersprungen."
-msgstr "Code (#1#) from line #2# already exists. This line has been ignored."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:424
-msgid "Ein Gutschein erfolgreich importiert."
-msgstr "One voucher has been imported successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:425
-msgid "#1# Gutscheine erfolgreich importiert."
-msgstr "#1# vouchers imported successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:426
-msgid "Keine Gutscheine importiert."
-msgstr "No vouchers have been imported."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:452
-msgid "Eingabe im Feld \"Menge\" ist ungÃŒltig."
-msgstr "Input for \"Amount\" is not valid."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:460
-msgid "Eingabe im Feld \"GÃŒltig ab\" ÃŒberprÃŒfen."
-msgstr "Input for \"Valid from\" is not valid."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:468
-msgid "Eingabe im Feld \"GÃŒltig bis\" ÃŒberprÃŒfen."
-msgstr "Input for \"Valid to\" is not valid."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:476
-msgid "Eingabe im Feld \"Wert\" ÃŒberprÃŒfen."
-msgstr "Input for \"Value\" is not valid."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:507
-#, fuzzy
-msgid "Gutschein erfolgreich gespeichert."
-msgstr "Vouchers deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:552
-msgid "Gutscheine wurden erfolgreich angelegt."
-msgstr "Vouchers created successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:556
-msgid "Gutschein wurde erfolgreich angelegt."
-msgstr "Voucher created successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:585
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:851
-msgid ""
-"In der Session befindet sich eine Gutschein ID, die es nicht in der "
-"Datenbank gibt"
-msgstr ""
-"There is a coupon ID in the session that does not exist in the database"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:608
-msgid ""
-"Gutschein wurde entfernt, da er nicht mit Produkt #1# verwendet werden kann"
-msgstr "Voucher has been removed as it can not be used with product # 1 #"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:847
-msgid ""
-"In der Session ist keine ID fÃŒr den Gutschein im Basket Array, sollte nicht "
-"passieren"
-msgstr ""
-"In the session is no ID for the coupon in the basket array, should not happen"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:855
-#, fuzzy
-msgid "Gutschein wurde entfernt, da ein Rabatt angewendet wurde."
-msgstr "Voucher created successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:865
-msgid ""
-"Gutschein wurde entfernt, da der Mindestbestellwert von #1# unterschritten "
-"wurden."
-msgstr "Voucher removed as minimum order # 1 # has been undershot."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:968
-msgid "Gutscheine erfolgreich gelÃ¶scht."
-msgstr "Vouchers deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1168
-#, fuzzy
-msgid "Bitte mindestens einen Gutschein auswÃ€hlen"
-msgstr "Please select at least one order!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1186
-#, fuzzy
-msgid "#1# Gutschein(e) wurden gelÃ¶scht."
-msgstr "Vouchers deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_gutschein.class.php:1272
-#, fuzzy
-msgid "Gutschein einfÃŒgen im Warenkorb verbergen"
-msgstr "Remove voucher from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:26
-#, fuzzy
-msgid ""
-"ErmÃ¶glicht eine Kundenverwaltung mit Profil, Kundengruppen, Registrierung "
-"und Login Mechanismen."
-msgstr ""
-"Allows a customer management with profile, customer registration and login "
-"options."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:68
-msgid "PasswortÃ€nderungsanfrage"
-msgstr "Request password change"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:69
-#, fuzzy
-msgid "Ihr neues Passwort"
-msgstr "Your new password"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:89
-msgid "Alle Kunden wurden auf Aktiv gesetzt."
-msgstr "All customers were set to active."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:100
-msgid "Alle Kunden wurden auf Inaktiv gesetzt."
-msgstr "All customers were set to inactive."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:112
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:124
-msgid "Sie sind jetzt im Frontend als #1# #2# angemeldet."
-msgstr "You are now logged in the frontend as # 1 # # 2 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:192
-msgid "Profil"
-msgstr "Profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:193
-msgid "Registrierung"
-msgstr "Register"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:194
-#, fuzzy
-msgid "Registrierung abgeschlossen"
-msgstr "Unregister"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:237
-msgid ""
-"Die reCaptcha ÃberprÃŒfung ist in den Einstellungen aktiv, aber die "
-"Konfiguration ist nicht komplett. Bitte <a href=\"#1#\">hier</a> "
-"konfigurieren."
-msgstr ""
-"The reCaptcha check is active in the settings, but the configuration is not "
-"complete. Please configure <a href=\"#1#\"> here </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:265
-#, fuzzy
-msgid "Bitte mindestens einen Kunden wÃ€hlen."
-msgstr "Please select at least one group."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:272
-#, fuzzy
-msgid "Kein Zielkunde ausgewÃ€hlt."
-msgstr "No bill has been selected!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:301
-#, fuzzy
-msgid "#1# Bestellung(en) dem Kundenkonto zugeordnet."
-msgstr "#1# order(s) deleted."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:356
-msgid ""
-"Es gibt einen Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich erst "
-"an, bevor sie bestellen. (Auch im Wordpress)"
-msgstr ""
-"There is a user with this e-mail address. Please register before you order. "
-"(Wordpress)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:375
-msgid "Bitte ein Passwort festlegen!"
-msgstr "Please enter a password."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:390
-msgid "Bitte Passwort Wiederholung prÃŒfen!"
-msgstr "Please check your password confirmation."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:425
-#, fuzzy
-msgid "Es existiert bereits ein Wordpress Nutzer mit dieser E-Mail Adresse."
-msgstr "No user with that email address has been found!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:461
-msgid ""
-"Ein Kunde mit dieser E-Mail Adresse existiert bereits, bitte loggen Sie sich "
-"ein oder fordern Sie ein neues Passwort an!"
-msgstr ""
-"There is already a customer using this mail address. Please login or request "
-"a new password!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:487
-msgid ""
-"Ein Kunde mit dieser E-Mail Adresse existiert schon, die E-Mail wurde "
-"zurÃŒckgesetzt!"
-msgstr ""
-"There is already a customer with that email address, the email has been "
-"reset."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:509
-msgid "Bitte die Passworteingaben ÃŒberprÃŒfen."
-msgstr "Please check entered passwords."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:520
-msgid "Eine Registrierung ohne Passwort ist nicht mÃ¶glich."
-msgstr "A registration without a password is not possible."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:548
-#, fuzzy
-msgid "Bitte bestÃ€tigen Sie, dass Sie kein Bot sind."
-msgstr "Please enter a value in field #1#."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:639
-msgid "E-Mail bei vergessenem Passwort (Anfrage)"
-msgstr "Email for forgotten password (Request)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:640
-msgid ""
-"Diese Mail bekommt der Kunde wenn er sein Passwort vergessen hat und ein "
-"neues anfordert."
-msgstr ""
-"This mail is send to the customer if he requests a new password due to "
-"password loss."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:644
-msgid "E-Mail bei vergessenem Passwort (Neues Passwort)"
-msgstr "Email for forgotten password (New password)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:645
-msgid "Mit dieser E-Mail erhÃ€lt der Kunde sein neues Passwort."
-msgstr "This email is send to the customer and contains the new password."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:649
-msgid "E-Mail bei Registrierung (Kundenverwaltung)"
-msgstr "Email for registrations (customer management)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:650
-msgid ""
-"Mit dieser E-Mail erhÃ€lt der Kunde eine Mail mit seinen registrierten Daten."
-msgstr "To that mail the customer gets his register data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:654
-msgid "E-Mail bei StatusÃ€nderung im Kunden- Account"
-msgstr "Email for status changes of customer account"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:655
-msgid ""
-"Mit dieser E-Mail erhÃ€lt der Kunde ein Info nach Ãnderung seines Accounts."
-msgstr ""
-"With this email the customer gets an information after any change of his "
-"account."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:674
-msgid "Bitte eine E-Mail Adresse und ein Passwort angeben!"
-msgstr "Please enter an email address and password!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:706
-msgid "Sie wurden erfolgreich angemeldet."
-msgstr "You have been logged in successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:712
-msgid "Es wurde kein Kunde mit diesen Zugangsdaten gefunden!"
-msgstr "There is no customer with these login data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:795
-msgid "Ihnen wurde eine neues Passwort zugesendet."
-msgstr "A new password has been sent to you."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:816
-msgid "Bitte eine E-Mail Adresse angeben!"
-msgstr "Please provide a valid email address!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:848
-msgid ""
-"Ein Link zur Generierung eines neuen Passwortes wurde Ihnen zugesendet. "
-"ÃberprÃŒfen Sie bitte Ihr Postfach."
-msgstr ""
-"A link to generate you new password has been sent to you. Please check your "
-"mail."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:855
-msgid "Kein Benutzer mit dieser E-Mail Adresse gefunden!"
-msgstr "No user with that email address has been found!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:952
-msgid "Ihr Profil wurde erfolgreich angelegt."
-msgstr "Your profile has been created successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:997
-msgid "Passwortwiederholung ist nicht korrekt. Passwort wurde nicht geÃ€ndert!"
-msgstr "Password repetition is not correct. Password was not changed!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1011
-msgid ""
-"Passwort kann nicht verÃ€ndert werden, da sie nicht im Wordpress Backend "
-"angemeldet sind."
-msgstr ""
-"Password can not be changed because you are not logged in to the Wordpress "
-"backend."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1025
-msgid "Profil erfolgreich gespeichert."
-msgstr "Profile has been saved successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1410
-msgid "Es gab ein Problem beim anlegen des Wordpress Nutzers: "
-msgstr "There was a problem creating the Wordpress user:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1415
-msgid "Beim Anlegen des Wordpress Nutzers gab es eine unerwartete RÃŒckgabe"
-msgstr "When creating the Wordpress user, there was an unexpected return"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1779
-msgid "#1# Kunden wurden importiert."
-msgstr "#1# customers have been imported."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1831
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1878
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:80
-#, fuzzy
-msgid "Unzugeordnet"
-msgstr "Not assigned"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1915
-msgid "Kunde erfolgreich gelÃ¶scht."
-msgstr "Customer deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1966
-msgid "Passwort wurde erfolgreich geÃ€ndert."
-msgstr "Password has been changed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:1972
-msgid ""
-"Passwort wurde nicht geÃ€ndert, da die Wiederholung nicht ÃŒbereinstimmte."
-msgstr ""
-"Password could not be changed because the two given passwords were not "
-"identical."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:2034
-#, fuzzy
-msgid "WP-User wurde nicht angelegt."
-msgstr "Voucher created successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:2043
-msgid "Kunde wurde erfolgreich gespeichert."
-msgstr "Customer has been saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenverwaltung.class.php:2196
-#, fuzzy
-msgid "Die Daten eines Bestellobjekts konnten nicht geladen werden"
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_relatedproducts.class.php:26
-msgid ""
-"ErmÃ¶glicht es zu einem Produkt weitere Produkte als ZubehÃ¶r etc. anzugeben "
-"und darzustellen."
-msgstr "Allows you to specify relelated products to your products."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_relatedproducts.class.php:63
-msgid "FÃŒr jedes Produkt einstellbar"
-msgstr "Adjustable for each product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_spconditions.class.php:19
-#, fuzzy
-msgid ""
-"ErmÃ¶glicht die Erstellung von Bedingungen fÃŒr Versand- und Zahlungsarten."
-msgstr "Allows you to show pages for product views."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:22
-msgid "Bankeinzug"
-msgstr "Bank collection"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:24
-msgid "ErmÃ¶glicht die Zahlungsart Bankeinzug."
-msgstr "Allows the payment method \"bank collection\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:329
-msgid "Bitte den Namen der Bank kontrollieren (Bankeinzug)"
-msgstr "Please check the name of your bank (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:330
-msgid "Bitte den Inhaber des Kontos kontrollieren (Bankeinzug)"
-msgstr "Please check the account owner (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:335
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:362
-#, fuzzy
-msgid "Bitte die BIC der Bank kontrollieren (Bankeinzug)"
-msgstr "Please check the bank code (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:336
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:349
-#, fuzzy
-msgid "Bitte die IBAN Nr ÃŒberprÃŒfen (Bankeinzug)"
-msgstr "Please check the bank account number (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:342
-msgid "Bitte die BLZ der Bank kontrollieren (Bankeinzug)"
-msgstr "Please check the bank code (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_autodebit.class.php:343
-#, fuzzy
-msgid "Bitte die Kontonummer ÃŒberprÃŒfen (Bankeinzug)"
-msgstr "Please check the bank account number (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_basketteaser.class.php:16
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_basketteaser.class.php:108
-#, fuzzy
-msgid "Warenkorbteaser"
-msgstr "Basket page"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_basketteaser.class.php:18
-#, fuzzy
-msgid "ErmÃ¶glicht es im Warenkorb Produkte anzupreisen."
-msgstr "Allows you to specify pictures for your products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:24
-msgid "Skrill"
-msgstr "Skrill"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:26
-msgid "ErmÃ¶glicht die Zahlungsart \"Skrill\"."
-msgstr "Allows the payment method \"Skrill\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:34
-msgid "Zahlen Sie mit Skrill (Moneybookers)."
-msgstr "Pay using the Skrill (Moneybookers) service."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:96
-msgid "Erfolgreiche Skrill Zahlung"
-msgstr "Successful payment using Skrill"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:97
-msgid "Fehlgeschlagene Skrill Zahlung"
-msgstr "Failed payment using Skrill"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:211
-msgid "Bestellung wurde nicht gefunden!"
-msgstr "Order has not been found!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:219
-msgid "Skrill Modul: HÃ€ndler ID passt nicht!"
-msgstr "Skrill module: merchant id does not match!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:223
-msgid "HÃ€ndler ID passt nicht!"
-msgstr "Merchant id does not match!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:245
-msgid "Skrill Modul: UngÃŒltiger Hash!"
-msgstr "Skrill module: invalid hash!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:249
-msgid "Hash stimmt nicht ÃŒberein!"
-msgstr "Hash values don't match!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_skrill.class.php:259
-msgid "Skrill Modul: Erfolgreiche ZahlungsbestÃ€tigung"
-msgstr "Skrill module: Successful payment confirmation"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:22
-msgid "Klarna"
-msgstr "Klarna"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:24
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlungsart Rechnung ÃŒber Klarna."
-msgstr "Allows the payment method \"Invoice\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:33
-#, fuzzy
-msgid "Zahlen Sie auf Rechnung mit dem Zahlungsdienstleister \"Klarna\""
-msgstr "Pay using the payment method \"Billsafe\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:82
-#, fuzzy
-msgid "Erfolgreiche Klarna Zahlung"
-msgstr "PayPal payment successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:83
-#, fuzzy
-msgid "Fehlgeschlagene Klarna Zahlung"
-msgstr "PayPal payment failed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_klarna.class.php:186
-#, fuzzy
-msgid "ZahlungsgebÃŒhren"
-msgstr "Payment methods"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shippingadress.class.php:24
-#, fuzzy
-msgid ""
-"Erlaubt das Angeben einer Lieferadresse, unabhÃ€ngig von der Rechnungsadresse."
-msgstr ""
-"Allows you to enter a shipping address additional to the billing address."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_shippingadress.class.php:142
-msgid "Bitte ÃŒberprÃŒfen Sie die Eingaben bei der Lieferadresse."
-msgstr "Please check your entries for the delivery address."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php:16
-msgid "Trusted Shops Siegel/Bewertung"
-msgstr "Trusted Shops seal / rating"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:26
-msgid "ErmÃ¶glicht das Erfassen von Kundeneingaben zu bestellten Produkten."
-msgstr "Allows to gather customer input for ordered products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:84
-msgid "Anklicken um den Namen der Produktvariable zu Ã€ndern ..."
-msgstr "Click to change the name of the product variable..."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:166
-#, fuzzy
-msgid "Produktvariable"
-msgstr "Product variables"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:202
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:265
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:486
-msgid "Bitte im Feld \"#1#\" eine Auswahl treffen!"
-msgstr "Please make a selection for field \"#1#\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:210
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:273
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:494
-msgid "Bitte im Feld \"#1#\" eine Angabe machen!"
-msgstr "Please make an entry for field \"#1#\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:218
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:281
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:502
-msgid "Bitte das Feld \"#1#\" aktivieren!"
-msgstr "Please activate field \"#1#\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_productvars.class.php:379
-#, fuzzy
-msgid "\"Leere\" Produktvariablen anzeigen"
-msgstr "Create new product variable"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:32
-msgid "ErmÃ¶glicht die Zahlungsart Billsafe."
-msgstr "Allows you to offer a payment method using Billsafe."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:41
-msgid "Zahlen Sie mit der Zahlungsart \"Billsafe\""
-msgstr "Pay using the payment method \"Billsafe\""
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:116
-msgid "Ergebnis Ihrer Billsafe Zahlung"
-msgstr "Result of your Billsafe payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:117
-msgid "Fehlgeschlagene Billsafe Zahlung"
-msgstr "Failed Billsafe payment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:429
-msgid ""
-"Es gab Probleme bei der Ãbermittelung an Billsafe. Bitte kontaktieren Sie "
-"den Shopbetreiber."
-msgstr ""
-"There were problems submitting data to Billsafe. Please contact the shop "
-"support team."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:450
-msgid "Keine Bestellung fÃŒr diesen Token gefunden"
-msgstr "No orders for that token found."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:460
-#, fuzzy
-msgid "Bestellung bereits verarbeitet"
-msgstr "Page assignments edited."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:500
-msgid "Zahlung konnte durch Billsafe nicht bestÃ€tigt werden."
-msgstr "Payment could not be confirmed from Billsafe."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:521
-msgid "Erfolgreiche BestÃ€tigung durch Billsafe."
-msgstr "Successful payment by the use of Billsafe."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:600
-msgid "Versandbenachrichtung an Billsafe.de"
-msgstr "Shipping notification to Billsafe.de"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:616
-msgid "Stornierungsmitteilung an Billsafe.de"
-msgstr "Canceling notification to Billsafe.de"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:824
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:825
-msgid "Zahlungsaufschlag"
-msgstr "Fee for payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:848
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:849
-msgid "Gutschein/Rabatt"
-msgstr "Voucher\\Discount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_billsafe.class.php:897
-msgid "Fehler in Ãbermittelung an Billsafe"
-msgstr "Error in submission to Billsafe"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minrequest.class.php:22
-msgid "Erlaubt das festlegen eines Mindest- und Maximalbestellwertes."
-msgstr "Allows setting a minimum and maximum order value."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minrequest.class.php:53
-msgid "Der Mindestbestellwert von #1# #2# wurde nicht erreicht."
-msgstr "The minimum order of # 1 # # 2 # has not been reached."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_minrequest.class.php:66
-msgid "Der Maximalbestellwert von #1# #2# wurde ÃŒberschritten."
-msgstr "The maximum order value of # 1 # # 2 # has been exceeded."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:56
-msgid "UnverÃ€ndert"
-msgstr "Unchanged"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:57
-msgid "Zahl (99.99)"
-msgstr "Number (99.99)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:58
-msgid "Zahl (99,99)"
-msgstr "Number (99,99)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:59
-msgid "WÃ€hrung (99,99 â¬)"
-msgstr "Currency (99,99 â¬)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:60
-msgid "Datum (TT.MM.YYYY)"
-msgstr "Date (DD.MM.YYYY)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:61
-msgid "Zeit (hh:mm:ss)"
-msgstr "Time (hh:mm:ss)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:62
-msgid "Datum und Zeit (TT.MM.YYYY hh:mm:ss)"
-msgstr "Date and time (DD.MM.YYYY hh:mm:ss)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:65
-msgid "Text Excel 2007"
-msgstr "text Excel 2007"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:69
-msgid "CSV"
-msgstr "CSV"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:70
-msgid "XML"
-msgstr "XML"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:74
-msgid "UTF-8"
-msgstr "UTF-8"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:75
-msgid "ISO-8859-1"
-msgstr "ISO-8859-1"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:79
-msgid "Nie"
-msgstr "never"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:80
-msgid "Mit jeder Cron AusfÃŒhrung"
-msgstr "With every cron version"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:81
-msgid "TÃ€glich"
-msgstr "every day"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:82
-#, fuzzy
-msgid "WÃ¶chentlich"
-msgstr "delete"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:83
-#, fuzzy
-msgid "Monatlich"
-msgstr "Month\\Year:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:88
-msgid ""
-"ErmÃ¶glicht es Produkte, Bestellungen und Kunden bezogen auf Bestellungen in "
-"verschiedene CSV Formate zu exportieren."
-msgstr ""
-"Allows you to export products, orders and customers in various CSV formats."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:263
-msgid "Konnte Zip Archiv nicht erstellen!"
-msgstr "Could not create zip archive!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:315
-msgid "Neues Profil"
-msgstr "New profile"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:374
-#, fuzzy
-msgid "Neues Feld"
-msgstr "New profile"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:408
-msgid "Datei ist keine gÃŒltige Profildatei. Error: #1#"
-msgstr "File is not a valid profile file. Error: # 1 #"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:431
-#, fuzzy
-msgid "Profil als \"#1#\" erfolgreich importiert."
-msgstr "Profile has been saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:457
-#, fuzzy
-msgid "UngÃŒltiger Feldname (Feld)"
-msgstr "Invalid request"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:487
-msgid "UngÃŒltiger Feldname (Bestellfilter)"
-msgstr "Invalid field name (order filter)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:530
-msgid "UngÃŒltiger Feldname (Profil)"
-msgstr "Invalid field name (profile)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:597
-msgid "Muster Datei erfolgreich verarbeitet."
-msgstr "Sample file processed successfully."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1032
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1107
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1251
-msgid "Kein XML Root Tagname fÃŒr Profil \"#1#\" gesetzt!"
-msgstr "No XML root tagname set for profile \"# 1 #\"!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1033
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1110
-msgid "Kein XML Produkt Tagname fÃŒr Profil \"#1#\" gesetzt!"
-msgstr "No XML Product Tagname set for profile \"# 1 #\"!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1108
-msgid "Kein XML Bestellung Tagname fÃŒr Profil \"#1#\" gesetzt!"
-msgstr "No XML order tagname for profile \"# 1 #\" set!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1109
-msgid "Kein XML Produkt Roottagname fÃŒr Profil \"#1#\" gesetzt!"
-msgstr "No XML product root tag for profile \"# 1 #\" set!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1252
-msgid "Kein XML Kunden Tagname fÃŒr Profil \"#1#\" gesetzt!"
-msgstr "No XML customer tag name set for profile \"# 1 #\"!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1398
-#, fuzzy
-msgid "Profil konnte nicht geladen werden."
-msgstr "CSV file could no be loaded!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1411
-msgid "Leer"
-msgstr "Empty"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1419
-msgid "BestellID"
-msgstr "OrderID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1422
-msgid "Bemerkung Kunde"
-msgstr "Customer comment"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1423
-msgid "Bestellsumme"
-msgstr "Order value"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1424
-msgid "Bestellsumme (Netto)"
-msgstr "Order value (net)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1426
-msgid "Kosten Bezahlmethode"
-msgstr "Charge for payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1428
-msgid "IP Adresse"
-msgstr "IP address"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1430
-#, fuzzy
-msgid "Rechnungsadresse Anrede"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1431
-#, fuzzy
-msgid "Rechnungsadresse Firma"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1432
-#, fuzzy
-msgid "Rechnunsadresse Vorname"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1433
-#, fuzzy
-msgid "Rechnungsadresse Name"
-msgstr "Invoice address:"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1434
-msgid "Rechnungsadresse StraÃe (mit Hausnummer)"
-msgstr "Billing address street (with house number)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1435
-msgid "Rechnungsadresse StraÃe (ohne Hausnummer)"
-msgstr "Billing address street (without house number)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1436
-#, fuzzy
-msgid "Rechnungsadresse Hausnummer"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1437
-#, fuzzy
-msgid "Rechnungsadresse PLZ"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1438
-#, fuzzy
-msgid "Rechnungsadresse Ort"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1439
-#, fuzzy
-msgid "Rechnungsadresse Land (Name)"
-msgstr "Delivery address country (name)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1440
-#, fuzzy
-msgid "Rechnungsadresse Land (KÃŒrzel)"
-msgstr "Delivery address country (code)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1441
-#, fuzzy
-msgid "Rechnungsadresse Telefon"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1442
-#, fuzzy
-msgid "Rechnungsadresse Fax"
-msgstr "Invoice address:"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1444
-#, fuzzy
-msgid "Lieferadresse Anrede"
-msgstr "Shipping address city"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1445
-msgid "Lieferadresse Firma"
-msgstr "Shipping address company"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1446
-msgid "Lieferadresse Vorname"
-msgstr "Shipping address first name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1447
-msgid "Lieferadresse Name"
-msgstr "Shipping address last name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1448
-#, fuzzy
-msgid "Lieferadresse StraÃe (mit Hausnummer)"
-msgstr "Shipping address street"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1449
-#, fuzzy
-msgid "Lieferadresse StraÃe (ohne Hausnummer)"
-msgstr "Shipping address street"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1450
-#, fuzzy
-msgid "Lieferadresse Hausnummer"
-msgstr "Shipping address last name"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1451
-msgid "Lieferadresse PLZ"
-msgstr "Shipping address zip code"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1452
-msgid "Lieferadresse Ort"
-msgstr "Shipping address city"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1453
-msgid "Lieferadresse Land (Name)"
-msgstr "Delivery address country (name)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1454
-msgid "Lieferadresse Land (KÃŒrzel)"
-msgstr "Delivery address country (code)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1456
-msgid "Name der Zahlart"
-msgstr "Name of payment method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1457
-msgid "Name der Versandart"
-msgstr "Name of shipping method"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1458
-msgid "Anzahl Produkte"
-msgstr "Amount products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1459
-msgid "Name der Bank (Bankeinzug)"
-msgstr "Name of the bank (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1460
-msgid "BLZ der Bank (Bankeinzug)"
-msgstr "Bank code (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1461
-#, fuzzy
-msgid "BIC der Bank (Bankeinzug)"
-msgstr "Bank code (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1462
-msgid "Kontoinhaber (Bankeinzug)"
-msgstr "Account owner (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1463
-msgid "Kontonummer (Bankeinzug)"
-msgstr "Account number (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1464
-#, fuzzy
-msgid "IBAN Nummer (Bankeinzug)"
-msgstr "Account number (bank collection)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1465
-msgid "Status der Bestellung"
-msgstr "Order status"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1466
-msgid "Anzahl an Artikeln"
-msgstr "Number of articles"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1473
-msgid "ProduktID"
-msgstr "ProductID"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1476
-#, fuzzy
-msgid "Produkt-URL"
-msgstr "Product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1477
-#, fuzzy
-msgid "Produktbild-URL"
-msgstr "Product pictures"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1479
-msgid "Produkttyp"
-msgstr "Type of product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1481
-#, fuzzy
-msgid "Produktpreis (Netto)"
-msgstr "Price of product"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1482
-#, fuzzy
-msgid "Produktpreis aus Bestellung"
-msgstr "When ordering"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1483
-msgid "Produktpreis aus Bestellung (Netto)"
-msgstr "product Price from order (net)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1484
-#, fuzzy
-msgid "Mehrwertsteuer (SchlÃŒssel)"
-msgstr "Delete sales tax rate"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1485
-#, fuzzy
-msgid "Mehrwertsteuer (Wert)"
-msgstr "Sales tax"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1486
-#, fuzzy
-msgid "Mehrwertsteuer (Wert aus Bestellung)"
-msgstr "Sales tax rates"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1487
-msgid "FÃŒllmengeneinheit"
-msgstr "Unit of filling quantity"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1500
-msgid "KundenID"
-msgstr "CustomerID"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1506
-msgid "StraÃe (mit Hausnummer)"
-msgstr "street (with house number)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1507
-msgid "StraÃe (ohne Hausnummer)"
-msgstr "street (without house number)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1511
-msgid "Land (Name)"
-msgstr "Country (name)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1512
-msgid "Land (KÃŒrzel)"
-msgstr "Country (code)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1516
-msgid "Umsatzsteuernummer"
-msgstr "Sales tax identification number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1525
-#, fuzzy
-msgid "Lagerstatus"
-msgstr "Licence status"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1534
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:350
-msgid "Abo"
-msgstr "abo"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1536
-msgid "Abobeginn"
-msgstr "abo start"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1537
-#, fuzzy
-msgid "Aboende"
-msgstr "Sender"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1552
-msgid "Rechnungsnummer"
-msgstr "Invoice number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1553
-#, fuzzy
-msgid "Rechnungskorrekturnummer"
-msgstr "Invoice number"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1554
-#, fuzzy
-msgid "Datum der Rechnung/Rechnungskorrektur"
-msgstr "Date of invoice/credit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:1564
-msgid "Gutscheinnummer"
-msgstr "Voucher number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:2113
-msgid "auf Lager"
-msgstr "in stock"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:2113
-msgid "nicht auf Lager"
-msgstr "not in stock"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_export.class.php:2218
-#, fuzzy
-msgid "Nicht definiert ("
-msgstr "Not defined!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:32
-msgid "micropaymentâ¢"
-msgstr "micropayment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:34
-msgid ""
-"ErmÃ¶glicht die Zahlung ÃŒber den Zahlungsdienstleister <a href=\"http://r132."
-"micropayment.de\">micropaymentâ¢</a>."
-msgstr ""
-"Enables payment via the payment service provider <a href=\"http://r132."
-"micropayment.de\"> micropayment â¢ </a>."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:61
-msgid "Abrechnung per Kreditkarte"
-msgstr "Billing by credit card"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:67
-msgid "Abrechnung per Kreditkarte (Reservierung)"
-msgstr "Billing by credit card (reservation)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:73
-#, fuzzy
-msgid "Abrechnung per Lastschrift"
-msgstr "Invoice address"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:80
-msgid "Abrechnung per Online Banking"
-msgstr "billing by online banking"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:86
-msgid "Abrechnung per Vorkasse"
-msgstr "billing by prepayment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:93
-msgid "Abrechnung per Anruf / Telefon"
-msgstr "billing by call/phone"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:99
-msgid "Abrechnung per SMS / TAN"
-msgstr "billing by sms/tan"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:252
-#, fuzzy
-msgid "Zahlung reserviert"
-msgstr "Payment accepted"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:253
-#, fuzzy
-msgid "Reservierung eingelÃ¶st"
-msgstr "Register page"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:483
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:564
-msgid ""
-"Im Basket Array war eine Micropayment Zahlungsart die nicht definiert ist "
-"(Innerhalb calcPayment)"
-msgstr ""
-"In the basket array was a micropayment payment that is not defined (within "
-"calcPayment)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:618
-#, fuzzy
-msgid "Bitte die Kreditkartennummer angeben."
-msgstr "Please enter a subject!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:619
-#, fuzzy
-msgid "Bitte die PrÃŒfziffer der Kreditkarte angeben."
-msgstr "Please enter a name for the new variant!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:672
-msgid "Erfolgreiche Micropayment Authorisierung"
-msgstr "Successful micropayment authorization"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:680
-#, fuzzy
-msgid "Authorisierung konnte nicht durchgefÃŒhrt werden."
-msgstr "Translation file could not been copied."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:688
-#, fuzzy
-msgid "Session fÃŒr Zahlung konnte nicht aufgebaut werden."
-msgstr "Directory could not be created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:697
-#, fuzzy
-msgid "Die Kreditkartendaten wurden nicht akzeptiert."
-msgstr "Translation file has not been copied."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:713
-msgid "UngÃŒltiger Titel oder Bestellung nicht gefunden bei MP Request"
-msgstr "Invalid title or order not found on MP Request"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:717
-msgid "UngÃŒltiger Sicherheitstoken bei MP Request"
-msgstr "Invalid security token on MP Request"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:720
-msgid "Micropayment REQUEST"
-msgstr "Micropayment REQUEST"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:779
-msgid "Micropayment: Zahlung wurde gebucht"
-msgstr "Micropayment: Payment has been booked"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:810
-msgid "Reservierung konnte nicht gebucht werden. Status auf #1# zurÃŒckgesetzt."
-msgstr "Reservation could not be booked. Status reset to # 1 #."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:817
-msgid ""
-"Micropayment: Zahlung konnte nicht freigegeben werden / Status auf #1# "
-"zurÃŒckgesetzt."
-msgstr "Micropayment: Payment could not be released / status reset to # 1 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:844
-#, fuzzy
-msgid "Micropayment: Zahlungsreservierung wurde erfolgreich storniert"
-msgstr "Invoice has been canceled successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:870
-#, fuzzy
-msgid "Zahlungsreservierung konnte nicht aufgehoben werden"
-msgstr "Translation file could not been copied."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:873
-msgid "Micropayment: Zahlungsreservierung konnte nicht aufgehoben werden"
-msgstr "Micropayment: Payment reservation could not be canceled"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:1040
-msgid ""
-"Es wurde versucht einen Zahlungslink fÃŒr eine Bestellung anzufragen, die "
-"nicht mit Micropayment bezahlt wurde"
-msgstr ""
-"An attempt was made to request a payment link for an order that was not paid "
-"by micropayment"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_micropayment.class.php:1106
-msgid ""
-"Es wurde keine gÃŒltige Micropayment Zahlungsart beim generieren des "
-"Bezahllinks gefunden"
-msgstr ""
-"No valid micropayment payment method was found when generating the payment "
-"link"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_freeshipping.class.php:20
-msgid "Versandkostenfrei"
-msgstr "Free shipping"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_freeshipping.class.php:22
-msgid "ErmÃ¶glicht die Versandart \"Versandkostenfrei\"."
-msgstr "Allows the shipping method \"free shipping\"."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:29
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:40
-msgid "AmazonPay"
-msgstr "AmazonPay"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:31
-#, fuzzy
-msgid "ErmÃ¶glicht die Anmeldung / Zahlung mit Amazon."
-msgstr "Allows you to apply to the wpNewsletterGermany."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:41
-#, fuzzy
-msgid "Bezahlen Sie ihre Bestellung einfach mit ihrem Amazon Konto."
-msgstr "Pay your order using your Paypal account or as a PayPal guest."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:42
-msgid "O%order_id% - K%kunde_id%"
-msgstr "O%order_id% - K%kunde_id%"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:116
-#, fuzzy
-msgid "Der Betrag wurde erfolgreich zurÃŒckerstattet."
-msgstr "Product copied successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:122
-#, fuzzy
-msgid "Es gab technische Probleme beim zurÃŒckerstatten des Betrages."
-msgstr "There were technical problems, the repay could not be performed."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:124
-msgid "Fehler beim zurÃŒckerstatten des Bestellbetrages"
-msgstr "Error when refunding the order amount"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_amazon.class.php:132
-msgid "RÃŒckzahlung nicht mÃ¶glich, da keine Capture/Authorize ID gesetzt wurde"
-msgstr "Repayment not possible because no Capture / Authorize ID was set"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:20
-#, fuzzy
-msgid "LÃ€ndernummern"
-msgstr "Customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:22
-#, fuzzy
-msgid "ErmÃ¶glicht lÃ€nderspezifische Kunden- und Bestellnummern."
-msgstr "Allows to gather customer input on orders."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:52
-#, fuzzy
-msgid "Startnummer (Kundennummer)"
-msgstr "Start value for customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:53
-#, fuzzy
-msgid "Format (Kundennummer)"
-msgstr "Format customer id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:54
-#, fuzzy
-msgid "Startnummer (Bestellnummer)"
-msgstr "Start value for order id"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customernr.class.php:55
-#, fuzzy
-msgid "Format (Bestellnummer)"
-msgstr "Format order id"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:28
-msgid "SOFORT Ident"
-msgstr "SOFORT Ident"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:151
-msgid "FÃŒr Produkte #1# benÃ¶tigen Sie ein Mindestalter von #2# Jahren"
-msgstr "For products # 1 # you need a minimum age of # 2 # years"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:166
-msgid ""
-"Fehler beim HASH Abgleich. Bitte Projektpasswort und Hash Algorithmus auf "
-"beiden Seiten ÃŒberprÃŒfen."
-msgstr ""
-"Error during HASH adjustment. Please check project password and hash "
-"algorithm on both sides."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:170
-#, fuzzy
-msgid ""
-"Ihr Alter wurde erfolgreich ÃŒberprÃŒft und Sie kÃ¶nnen die Bestellung nun "
-"abschlieÃen."
-msgstr ""
-"Your payment has been accepted and you will receive your order in the "
-"following days."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:172
-msgid "RÃŒckgabe der SOFORT Ident Alterverifizierung"
-msgstr "Return of the SOFORT Ident age verification"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_si.class.php:196
-msgid "UngÃŒltiger HASH Algoritmus"
-msgstr "unknown HASH algorithm"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:27
-msgid "ErmÃ¶glicht es PDF Rechnungen zu Bestellungen zu generieren."
-msgstr "Allows you to generate invoices in the PDF format."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:400
-msgid "Rechnung existiert nicht oder passt nicht zur Bestellung!"
-msgstr "Invoice not found or is not assigned to that order!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:445
-#, fuzzy
-msgid "Zusendung einer Kopie fÃŒr Rechnungskorrektur #1# an #2#"
-msgstr "Sending a copy of invoice #1# to #2#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:483
-msgid "Zusendung einer Kopie fÃŒr Rechnung #1# an #2#"
-msgstr "Sending a copy of invoice #1# to #2#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:490
-msgid "Die Originalrechnung existiert nicht im Dateisystem."
-msgstr "The original invoice has not been found in the file system."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:644
-msgid "E-Mail bei neuer Rechnung an den Kunden"
-msgstr "Email for new invoice to the customer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:645
-msgid "Diese Mail bekommt der Kunde wenn die Rechnung geschrieben wird."
-msgstr "This email is sent to the customer when the invoice is written."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:649
-#, fuzzy
-msgid "E-Mail bei neuer Rechnungskorrektur"
-msgstr "Email for invoice copy"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:650
-#, fuzzy
-msgid ""
-"Diese Mail bekommt der Kunde wenn eine neue Rechnungskorrektur geschrieben "
-"wird."
-msgstr "This email is sent to the customer when the invoice is written."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:654
-msgid "E-Mail bei Rechnungskopie"
-msgstr "Email for invoice copy"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:655
-msgid ""
-"Diese Mail bekommt der Kunde wenn ihm eine Rechnungskopie gesendet wird."
-msgstr ""
-"This email is sent to the customer if he gets send a copy of his invoice."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:800
-#, fuzzy
-msgid "Rechnungskorrektur"
-msgstr "Invoice amount"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:826
-#, fuzzy
-msgid " - Vorschau"
-msgstr "Preview"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:841
-msgid "RNr."
-msgstr "Invoice number"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:867
-msgid ""
-"Rechnung konnte nicht geschrieben werden, da fÃŒr diese Bestellung (ID:#1#) "
-"bereits eine Rechnung (NR:#2#) geschrieben wurde."
-msgstr ""
-"Invoice could not be written because an invoice (NR: # 2 #) has already been "
-"written for this order (ID: # 1 #)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:1117
-msgid "Rechnungsmail an #1#"
-msgstr "Invoice mail to #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:1285
-#, fuzzy
-msgid "Rechnungskorrekturmail an #1# (Vorschau)"
-msgstr "Invoice mail to #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:1286
-#, fuzzy
-msgid "Rechnungskorrekturmail an #1#"
-msgstr "Invoice mail to #1#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_rechnungen.class.php:1304
-msgid "Rechnung wurde erfolgreich storniert"
-msgstr "Invoice has been canceled successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_weight.class.php:23
-msgid "Erlaubt die Verwaltung von Gewichten pro Produkt."
-msgstr "Allows you to manage the weight of products."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:27
-msgid ""
-"Ist dieses Modul aktiv, so lassen sich die Kunden in Kundengruppen "
-"verwalten. Mit den entsprechenden Modul \"Rabatt\" ist es mÃ¶glich einen "
-"Rabatt je Kundengruppe zu definieren."
-msgstr ""
-"If this module is active, customers can be managed in customer groups. With "
-"the appropriate module \"discount\" it is possible to define a discount per "
-"customer group."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:160
-msgid "Beim bearbeiten einer Kundengruppe wurde keine ID ÃŒbergeben"
-msgstr "When processing a customer group, no ID was passed"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:179
-#, fuzzy
-msgid "Kundengruppe konnte nicht erfolgreich gelÃ¶scht werden"
-msgstr "Customer successfully deleted."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:180
-#, fuzzy
-msgid "Kundengruppe wurde erfolgreich gelÃ¶scht"
-msgstr "Product group deleted successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:215
-#, fuzzy
-msgid "Kundengruppe erfolgreich gespeichert"
-msgstr "Customer has been saved successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_customergroup.class.php:227
-#, fuzzy
-msgid "Kundengruppe erfolgreich angelegt"
-msgstr "Product group created successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:26
-#, fuzzy
-msgid ""
-"ErmÃ¶glicht das Abfragen von Bedingungen zu Bestellungen oder einzelnen "
-"bestellten Produkten."
-msgstr "Allows to gather customer input for ordered products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:59
-#, fuzzy
-msgid "AGB + Widerrufsbelehrung"
-msgstr "Power of revocation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:60
-#, fuzzy
-msgid ""
-"Ich habe die <a href=\"%agb_url%\" target=\"_blank\">AGB</a> des Anbieters "
-"gelesen und erklÃ€re mit dem Absenden der Bestellung mein EinverstÃ€ndnis. Die "
-"<a href=\"%widerruf_url%\" target=\"_blank\">Widerrufsbelehrung</a> habe ich "
-"zur Kenntnis genommen."
-msgstr ""
-"I read the #1# of the provider and accept it with sending this order. I have "
-"acknowledged the #2#."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:61
-msgid ""
-"Sie mÃŒssen unsere <a href=\"%agb_url%\" target=\"_blank\">AGB</a> und <a "
-"href=\"%widerruf_url%\" target=\"_blank\">Widerrufsbelehrung</a> akzeptieren."
-msgstr ""
-"You must accept our <a href=\"%agb_url%\" target=\"_blank\"> terms and "
-"conditions </a> and <a href=\"%widerruf_url%\" target=\"_blank\"> revocation "
-"policy </a>."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:83
-#, fuzzy
-msgid "Bestimmungen zu Dienstleistungen"
-msgstr "Show order(s)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:84
-msgid ""
-"Ich bin einverstanden, dass Sie vor Ende der Widerrufsfrist mit der "
-"AusfÃŒhrung der beauftragten Dienstleistung beginnen. Mir ist bekannt, dass "
-"ich im Falle des Widerrufs Wertersatz fÃŒr die bereits erbrachten "
-"Dienstleistungen leisten muss. Ich stimme zu, dass der Vertrag von beiden "
-"Seiten vollstÃ€ndig erfÃŒllt wird, bevor ich mein Widerrufsrecht ausgeÃŒbt "
-"habe. Das Widerrufsrecht erlischt in diesem Fall vorzeitig."
-msgstr ""
-"I agree that you will start to carry out the commissioned service before the "
-"end of the cancellation period. I am aware that in the case of cancellation "
-"I must pay compensation for the services already provided. I agree that the "
-"contract will be fully fulfilled by both parties before I have exercised my "
-"right of withdrawal. The right of withdrawal expires prematurely in this "
-"case."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:85
-msgid "Sie mÃŒssen die Bestimmungen fÃŒr Dienstleistungen akzeptieren."
-msgstr "You must accept the terms of service."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:120
-#, fuzzy
-msgid "Anklicken um den Namen der Bestellbedingung zu Ã€ndern ..."
-msgstr "Klick to change the name of the order variable..."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_ordercondition.class.php:313
-msgid ""
-"Sie haben das Modul \"Bestellbedingungen\" aktiviert, es sind aber keine "
-"Bestellbedingungen definiert. ÃberprÃŒfen Sie die <a href=\"#1#"
-"\">Modulkonfiguration</a>, ihr Shop ist mÃ¶glicherweise nicht rechtssicher."
-msgstr ""
-"You have activated the module \"Order conditions\", but no order conditions "
-"are defined. Check the <a href=\"#1#\"> module configuration </a>, your shop "
-"may not be legally secure."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:29
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:81
-msgid "Druckerei"
-msgstr "Printer"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:31
-#, fuzzy
-msgid "ErmÃ¶glicht die Integration von flÃ€chenberechneten Produkten."
-msgstr "Allows to gather customer input for ordered products."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:158
-#, fuzzy
-msgid "LÃ€nge"
-msgstr "Recipient"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_surfaceproduct.class.php:159
-#, fuzzy
-msgid "Breite"
-msgstr "Edit"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:31
-#, fuzzy
-msgid "PayPal PLUS"
-msgstr "PayPal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:33
-msgid ""
-"ErmÃ¶glicht die Zahlungsart PayPal und PayPal PLUS, ÃŒber die REST API "
-"Schnittstelle und Login mit PayPal Express."
-msgstr ""
-"Enables the payment methods PayPal and PayPal PLUS, via the REST API "
-"interface and login with PayPal Express."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:50
-#, fuzzy
-msgid "Zahlen Sie die Bestellung mittels ihres PayPal Kontos"
-msgstr "Pay your order using your Paypal account or as a PayPal guest."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:327
-msgid ""
-"Die Zahlungsart PayPal ist leider nicht mit der Versandart \"Selbstabholung"
-"\" mÃ¶glich. Ihre Zahlung wurde storniert und ihr Konto nicht belastet. Bitte "
-"wÃ€hlen Sie eine andere Zahlungsart aus."
-msgstr ""
-"The payment method PayPal is not possible with the delivery method \"pickup"
-"\". Your payment has been canceled and your account has not been charged. "
-"Please select another payment method."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:388
-msgid ""
-"Sie hatten eventuell bereits eine Zahlungsart gewÃ€hlt. Aufgrund technischer "
-"EinschrÃ€nkungen kann es sein, dass diese Auswahl hier erneut durchgefÃŒhrt "
-"werden muss."
-msgstr ""
-"You may have already chosen a payment method. Due to technical limitations, "
-"this selection may need to be redone."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:438
-#, fuzzy
-msgid "Status der Zahlung konnte nicht abgefragt werden."
-msgstr "Status could no been set!"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:609
-msgid ""
-"Bitte ein Land auswÃ€hlen, damit die Versandkosten bestimmt werden kÃ¶nnen."
-msgstr "Please select a country, so that the shipping costs can be determined."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:686
-msgid "PayPalAPI WebHook Erfolg"
-msgstr "PayPalAPI WebHook successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:694
-#, fuzzy
-msgid "PayPalAPI Abgelehnt"
-msgstr "Pay with PayPal"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:827
-msgid ""
-"Ihre Daten wurden von PayPal ÃŒbernommen und Sie kÃ¶nnen die Bestellung direkt "
-"abschlieÃen, nachdem Sie alles ÃŒberprÃŒft haben."
-msgstr ""
-"Your data has been taken over by PayPal and you can complete the order "
-"directly after you have checked everything."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:890
-msgid "Bei Auswahl dieser Zahlungsart entstehen Kosten von #1#."
-msgstr "Selecting this method of payment will incur costs of # 1 #."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:961
-#, fuzzy
-msgid "WebHook konnte nicht angelegt werden."
-msgstr "Directory could not be created."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1218
-#, fuzzy
-msgid "EingelÃ¶ster Gutschein Code:#1#"
-msgstr "Length for voucher codes"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1233
-#, fuzzy
-msgid "GebÃŒhr fÃŒr Zahlungsart"
-msgstr "Charge\\Discount (payment method)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1233
-#, fuzzy
-msgid "Rabatt durch Zahlungsart"
-msgstr "Charge\\Discount (payment method)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1234
-msgid "Rabatt, der Aufgrund der gewÃ€hlten Zahlungsart entstanden ist."
-msgstr "Discount due to the selected payment method."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1250
-#, fuzzy
-msgid "Rabatt, der sich aus dem Warenkorbwert ergibt."
-msgstr "Remove voucher from basket"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1332
-#, fuzzy
-msgid "Rabatt aufgrund Versandart"
-msgstr "Charge\\Discount (shipping method)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1483
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1497
-#, fuzzy
-msgid "Keine API Daten hinterlegt."
-msgstr "No product groups created yet."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_paypalapi.class.php:1552
-msgid "API lieferte keinen AUTH Token. Vermutlich fehlerhafte Zugangsdaten."
-msgstr "API did not provide an AUTH token. Probably faulty access data."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:25
-msgid ""
-"Erlaubt es Produktattribute zu erstellen, die dann in der Produktverwaltung "
-"ausgefÃŒllt und im Frontend angezeigt werden."
-msgstr ""
-"Allows you to define product attributes which can be used in the product "
-"management and be shown in the front end."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_produktattribute.class.php:29
-msgid "Textfeld (RTE)"
-msgstr "Text field (RTE)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:20
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:91
-msgid "Downloadprodukte"
-msgstr "Downloadable products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:22
-#, fuzzy
-msgid ""
-"ErmÃ¶glicht es, Downloads als Produkt zu verkaufen. Diese Produkte kÃ¶nnen bei "
-"Sofortbezahlung (z.B. Paypal oder SofortÃŒberweisung) vom Kunden direkt "
-"heruntergeladen werden. Nach Zahlungseingang erhÃ€lt der Kunde eine E-Mail "
-"mit personalisiertem Downloadlink."
-msgstr ""
-"Allows you to sell downloadable products. These products can be purchased "
-"with instant payment services (e.g. Paypal, SofortBanking) so the customer "
-"can download them instantly after paying. After purchase the customer will "
-"receive an email with a personalized download link."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:29
-msgid "Ein Download ist nicht mehr mÃ¶glich."
-msgstr "Download is not possible anymore."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:164
-msgid "Datei fÃŒr das Downloadmodul erfolgreich hochgeladen."
-msgstr "File for the download module was uploaded successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:511
-msgid "E-Mail mit Links zum Download der Produkte"
-msgstr "Email containing links to download products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:549
-msgid "Bestellung wurde zwischenzeitlich storniert."
-msgstr "Meanwhile, the order has been canceled."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:590
-msgid "Zugriffsfehler"
-msgstr "Access error"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:671
-msgid "Die Datei wurde nicht gefunden"
-msgstr "File not found"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:684
-msgid "Downloadprodukte (Kunde)"
-msgstr "Downloadable products (customer)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_downloadprodukte.class.php:685
-msgid ""
-"Diese Mail bekommt der Kunde, darin sind die Links zu den Produkten "
-"enthalten."
-msgstr ""
-"This mail is send to the customer and contains the links to his purchased "
-"product(s)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_targo.class.php:27
-msgid "Targobank"
-msgstr "Targobank"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_targo.class.php:29
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlungsart Targobank."
-msgstr "Allows the payment method PayPal."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_targo.class.php:119
-msgid "Kreditvertrag angenommen"
-msgstr "credit agreement accepted"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:19
-msgid "Satollo Newsletter"
-msgstr "Satollo  newsletter"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:21
-msgid ""
-"ErmÃ¶glicht die Anmeldung an das \"<a href=\"http://wordpress.org/extend/"
-"plugins/newsletter/\">Newsletter</a>\" Plugin von Satollo."
-msgstr ""
-"Allows the use of the \"<a href=\"http://wordpress.org/extend/plugins/"
-"newsletter/\">newsletter</a>\" plugin by Satollo."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:74
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:110
-msgid "Sie wurden erfolgreich in unseren Newsletter eingetragen."
-msgstr "You have been subscribed out newsletter successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:99
-#, fuzzy
-msgid ""
-"Sie wurden erfolgreich in unseren Newsletter eingetragen, mÃŒssen diese aber "
-"noch bestÃ€tigen. Sie haben dazu eine E-Mail erhalten."
-msgstr "You have been subscribed out newsletter successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_nlsatolo.class.php:116
-msgid ""
-"Sie wurden nicht zum Newsletter angemeldet, da das Plugin \"newsletter\" "
-"nicht installiert ist."
-msgstr ""
-"You have not subscribed to our newsletter because the plugin \"newsletter\" "
-"is not installed."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_debitpayment.class.php:22
-msgid "Nachnahme"
-msgstr "Cash on delivery "
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_debitpayment.class.php:24
-msgid "ErmÃ¶glicht die Zahlungsart \"Nachnahme\"."
-msgstr "Allows the payment method \"Cash on delivery\"."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_debitpayment.class.php:32
-#, fuzzy
-msgid ""
-"Der Rechnungsbetrag wird an den Zusteller bar gezahlt. Hierbei kÃ¶nnen "
-"zusÃ€tzliche Kosten entstehen."
-msgstr ""
-"The total amount of the bill will be cashed by the delivery agent. "
-"Additional charges may occur."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:21
-#, fuzzy
-msgid "Erlaubt es in der Bestellverwaltung dem Kunden E-Mails zu senden."
-msgstr "Allows to send emails to customers out of the order management."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:44
-#, fuzzy
-msgid "SMS erfolgreich an das Gateway ÃŒbertragen."
-msgstr "Module was installed successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:45
-#, fuzzy
-msgid "SMS wurde zugestellt."
-msgstr "delivered"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:46
-msgid "SMS wurde noch nicht zugestellt."
-msgstr "SMS has not yet been delivered."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:47
-msgid ""
-"SMS konnte vermutlich nicht zugestellt werden (Rufnummer falsch, SIM nicht "
-"aktiv)."
-msgstr ""
-"SMS could probably not be delivered (phone number wrong, SIM not active)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:48
-msgid ""
-"SMS konnte nach Ablauf von 48 Stunden noch immer nicht zugestellt werden."
-msgstr "SMS could still not be delivered after 48 hours."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:49
-msgid "SMS ID abgelaufen oder ungÃŒltig (manuelle Status-Abfrage)."
-msgstr "SMS ID expired or invalid (manual status query)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:50
-msgid "Falscher Schnittstellen-Key oder Ihr Account ist gesperrt."
-msgstr "Wrong interface key or your account is locked."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:51
-msgid "Guthaben reicht nicht aus."
-msgstr "Credit is not enough."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:52
-msgid "Falsche DatenÃŒbergabe (z.B. Absender fehlt)."
-msgstr "Incorrect data transfer (e.g., sender missing)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:53
-msgid "EmpfÃ€nger nicht korrekt."
-msgstr "Receiver not correct."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:54
-#, fuzzy
-msgid "Absender nicht korrekt."
-msgstr "Translation file has not been copied."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:55
-msgid "Nachrichtentext nicht korrekt."
-msgstr "Message text incorrect."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:56
-msgid "Falscher AppKey oder Ihr Account ist gesperrt."
-msgstr "Wrong AppKey or your account is locked."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:57
-msgid ""
-"Sie haben versucht an eine internationale Handynummer eines Gateways, das "
-"ausschlieÃlich fÃŒr den Versand nach Deutschland bestimmt ist, zu senden."
-msgstr ""
-"You have tried to send an international mobile number of a gateway that is "
-"intended exclusively for shipping to Germany."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:58
-msgid ""
-"Parameter âtime=â ist nicht korrekt. Bitte im Format: TT.MM.JJJJ-SS:MM oder "
-"Parameter entfernen fÃŒr sofortigen Versand."
-msgstr ""
-"Parameter \"time =\" is not correct. Please format: dd.mm.yyyy-sv: mm or "
-"remove parameter for immediate shipping."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:59
-msgid ""
-"Parameter âtime=â ist zu weit in der Zukunft terminiert (max. 360 Tage)."
-msgstr ""
-"Parameter \"time =\" is scheduled too far in the future (maximum 360 days)."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:60
-msgid "Keine smsflatrate.net Gruppe vorhanden oder nicht korrekt."
-msgstr "No smsflatrate.net group available or not correct."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:61
-msgid ""
-"Unbekannter Fehler. Bitte dringend Support (ticket@smsflatrate.net) "
-"kontaktieren."
-msgstr ""
-"Unknown error. Please urgently contact support (ticket@smsflatrate.net)."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:187
-#, fuzzy
-msgid "SMS: #1# / #2#"
-msgstr "Base price: #1# / #2#"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:206
-#, fuzzy
-msgid "E-Mail, die vom Kundenkontakt Modul versendet wird."
-msgstr "Message has been sent via customer contact."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:207
-#, fuzzy
-msgid ""
-"Diese Mail kann in der Bestellverwaltung an den Kunden versendet werden."
-msgstr "Allows to send emails to customers out of the order management."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:220
-#, fuzzy
-msgid "MÃ¶gliche Vorwahlen fÃŒr SMS Versand. (kommagetrennt)"
-msgstr "Possible units (separated with comma)"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:269
-#, fuzzy
-msgid "SMS Versand nicht aktiviert."
-msgstr "Module is already activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:295
-#, fuzzy
-msgid "Unbekannte API Antwort"
-msgstr "Unknown file format"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:393
-msgid "Eine Nachricht ÃŒber den Kundenkontakt wurde versendet."
-msgstr "Message has been sent via customer contact."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_kundenkontakt.class.php:398
-#, fuzzy
-msgid "Kundenkontakt \"#1#\""
-msgstr "Customer contact"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:25
-#, fuzzy
-msgid "Adressvalidation"
-msgstr "Price calculation"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:27
-#, fuzzy
-msgid "ErmÃ¶glicht die PrÃŒfung der Adresse."
-msgstr "Allows the payment method prepayment."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:155
-msgid ""
-"Bitte die Kundenadresse (StraÃe, Hausnummer, PLZ, Ort und Land kontrollieren "
-"(Adressvalidation)"
-msgstr ""
-"Please check the customer address (street, house number, zip code, city and "
-"country (address validation)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:162
-msgid "Probleme mit dem Server der Adressvalidation (#1#)"
-msgstr "Problems with Address Validation Server (# 1 #)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:247
-msgid ""
-"Bitte die Lieferadresse (StraÃe, Hausnummer, PLZ, Ort und Land kontrollieren "
-"(Adressvalidation)"
-msgstr ""
-"Please check the delivery address (street, house number, zip code, city and "
-"country (address validation)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_addressvalidation.class.php:254
-msgid "Probleme mit dem Server (Adressvalidation) ("
-msgstr "Problems with the server (address validation) ("
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:21
-msgid "wpNewsletterGermany"
-msgstr "wpNewsletterGermany"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:23
-msgid "ErmÃ¶glicht die Anmeldung an den wpNewsletterGermany."
-msgstr "Allows you to apply to the wpNewsletterGermany."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:84
-msgid ""
-"Sie haben eine Mail erhalten, in der sie die Newsletteranmeldung bestÃ€tigen "
-"mÃŒssen."
-msgstr ""
-"An email was sent to you where you have to confirm your newsletter "
-"registration."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:88
-msgid "Sie wurden erfolgreich fÃŒr den Newsletter angemeldet."
-msgstr "You were successfully registered for the newsletter."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:140
-#, fuzzy
-msgid "Kein Abonnent gefunden"
-msgstr "No matching products found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:145
-msgid "Mehrere Abonnenten!"
-msgstr "Several subscribers!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:161
-#, fuzzy
-msgid "auf BestÃ€tigung warten"
-msgstr "Order confirmation sent"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_newsletter.class.php:242
-msgid "#1# Kunden in die Newsletter Gruppen importiert."
-msgstr "#1# customers imported to the newsletter groups."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:43
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:64
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:249
-msgid "FlexiPay"
-msgstr "FlexiPay"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:45
-#, fuzzy
-msgid "ErmÃ¶glicht die Zahlung ÃŒber FlexiPay."
-msgstr "Allows the payment method PayPal."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:65
-msgid ""
-"FlexiPay bietet eine sichere Art der Zahlung und unterstÃŒtzt dabei "
-"verschiedene ZahlungsmÃ¶glichkeiten."
-msgstr ""
-"FlexiPay offers a secure way of payment and supports different payment "
-"options."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_flexipay.class.php:295
-msgid "FlexiPay Zahlung erfolgt"
-msgstr "FlexiPay payment successful"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:33
-#, fuzzy
-msgid "AboProdukte"
-msgstr "Products"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:35
-#, fuzzy
-msgid "ErmÃ¶glicht den Verkauf von Abo Produkten"
-msgstr "Allows to assign products to product groups."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:108
-#, fuzzy
-msgid "Sie haben erfolgreich ein Abo erworben"
-msgstr "You have been logged in successfully."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:109
-#, fuzzy
-msgid "Ihr Abo ist ausgelaufen"
-msgstr "Expired"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:110
-msgid "Ihr Abo ist verlÃ€ngert worden"
-msgstr "Your subscription has been renewed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:375
-msgid "UngÃŒltige Anzahl von zulÃ€ssigen AbokÃ€ufen. Wurde auf unendlich gesetzt."
-msgstr "Invalid number of accepted purchases. Was set to infinity."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:454
-msgid ""
-"Es wurde eine Bestellung auf Zahlung aktzeptiert gesetzt, die eine Abo "
-"VerlÃ€ngerung drin hat zu der kein Eintrag existiert"
-msgstr ""
-"An order has been accepted for payment that has a subscription extension in "
-"it for which no entry exists"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:455
-msgid "wpsg"
-msgstr "wpsg"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:653
-msgid "E-Mail bei erstmaligem Abo Kauf"
-msgstr "E-mail on first subscription purchase"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:654
-#, fuzzy
-msgid "Diese Mail bekommt der Kunde beim erstmaligen Kauf eines Abos."
-msgstr ""
-"This mail is sent to the customer when the status of his order has changed."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:658
-msgid "E-Mail bei abgelaufenem Abo"
-msgstr "E-Mail with expired subscription"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:659
-#, fuzzy
-msgid ""
-"Diese Mail bekommt der Kunde wenn ein Abo auslÃ€uft mit der MÃ¶glichkeit es zu "
-"verlÃ€ngern."
-msgstr "This mail is send to the customer as order confirmation."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:663
-msgid "E-Mail bei verlÃ€ngertem Abo"
-msgstr "E-mail with extended subscription"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:664
-#, fuzzy
-msgid ""
-"Diese Mail bekommt der Kunde wenn er erfolgreich ein Abo verlÃ€ngert hat."
-msgstr "This email is sent to the customer when the invoice is written."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:668
-msgid "E-Mail an Admin wenn Abo angehalten werden soll"
-msgstr "Email admin if you want to stop subscribing"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:669
-msgid ""
-"Diese Mail wird verschickt, wenn ein Kunde im Frontend ein Abo anhalten will."
-msgstr "This mail is sent when a customer wants to subscribe in the frontend."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:673
-msgid "E-Mail bei Information vor VerlÃ€ngerung"
-msgstr "E-mail for information before extension"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:674
-#, fuzzy
-msgid "Diese Mail erhalten Kunden, bevor ein Abo automatisch verlÃ€ngert wird"
-msgstr "This mail is send to the customer as order confirmation."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:686
-msgid "Beim VerlÃ€ngerungslink keine BestellID oder ProductKey ÃŒbergeben"
-msgstr "When renewal link no order ID or ProductKey passed"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:721
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:736
-msgid ""
-"Das Abo kann nicht mehr verlÃ€ngert werden. Sie mÃŒssen das Produkt erneut "
-"erwerben."
-msgstr ""
-"The subscription can not be renewed. You must purchase the product again."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:751
-msgid "Abo VerlÃ€ngerung fÃŒr Produkt #1# eingefÃŒgt"
-msgstr "Subscription extension for product # 1 # inserted"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:773
-msgid "Abo kann nicht mehr so oft verlÃ€ngert werden!"
-msgstr "Subscription can not be renewed as often!"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:921
-#, fuzzy
-msgid "Abo Produkte"
-msgstr "Products"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:939
-msgid ""
-"Wenn das Abo auslÃ€uft, wird wieder automatisch eine Bestellung ausgelÃ¶st."
-msgstr ""
-"When the subscription expires, an order is automatically triggered again."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:940
-msgid ""
-"Wenn das Abo auslÃ€uft, wird dem Kunden wieder die MÃ¶glichkeit gegeben mit "
-"einer neuen Bestellung das Abo zu verlÃ€ngern."
-msgstr ""
-"When the subscription expires, the customer is given the opportunity to "
-"renew the subscription with a new order."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:942
-msgid "URL Benachrichtigung an: #1# ausgelÃ¶st. (type=abo_status_started)"
-msgstr "URL notification to: # 1 # triggered. (Type = abo_status_started)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:954
-msgid "Wenn das Abo auslÃ€uft, wird keine Bestellung mehr ausgelÃ¶st."
-msgstr "When the subscription expires, no order will be triggered."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:955
-msgid ""
-"Wenn das Abo auslÃ€uft, wird dem Kunden keine MÃ¶glichkeit gegeben mit einer "
-"neuen Bestellung das Abo zu verlÃ€ngern."
-msgstr ""
-"If the subscription expires, the customer is given no opportunity with a new "
-"order to extend the subscription."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:957
-msgid "URL Benachrichtigung an: #1# ausgelÃ¶st. (type=abo_status_stopped)"
-msgstr "URL notification to: # 1 # triggered. (Type = abo_status_stopped)"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:967
-msgid "Abo Startzeit"
-msgstr "abo start"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:968
-msgid "Abo Laufzeit"
-msgstr "abo runtime"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:969
-msgid "Abo Kosten VerlÃ€ngerung"
-msgstr "Subscription costs extension"
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1098
-msgid "Abo fÃŒr Produkt #1# wure angehalten."
-msgstr "Subscription for product # 1 # wure paused."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1133
-#, fuzzy
-msgid "Abo fÃŒr Produkt #1# wurde fortgesetzt."
-msgstr "#1# products imported."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1148
-msgid "Nicht angemeldet oder kein Zugriff auf diese Bestellung."
-msgstr "Not logged in or no access to this order."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1166
-msgid "Die VerlÃ€ngerung ihres Abos wurde angehalten."
-msgstr "The extension of her subscription was stopped."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1178
-msgid ""
-"Der Administrator wurde informiert und wird die VerlÃ€ngerung ihres Abos "
-"veranlassen."
-msgstr ""
-"The administrator has been informed and will arrange for the renewal of "
-"their subscription."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1191
-#, fuzzy
-msgid "Funktion ist deaktiviert."
-msgstr "Module is already activated."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1197
-#, fuzzy
-msgid "Produkt nicht in Bestellung gefunden."
-msgstr "No product key found."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1209
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1246
-msgid "Admin wurde bereits am #1# benachrichtigt das Abo zu stoppen."
-msgstr "Admin was already notified on # 1 # to stop the subscription."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1232
-#, fuzzy
-msgid "Mail an Administrator (Abo anhalten)"
-msgstr "Mail to Admin"
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_abo.class.php:1270
-#, fuzzy
-msgid "Mail an Kunden (Abo gekÃŒndigt)"
-msgstr "Send email to customer."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:26
-#, fuzzy
-msgid "ErmÃ¶glicht die Verwaltung von Versandkosten/Lieferanten."
-msgstr "Allows you to manage various types of shipping costs\\suppliers."
-
-# @ wpsg
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:85
-msgid "Anklicken um den Namen der Versandart zu Ã€ndern ..."
-msgstr "Click to change the name for the shipping type..."
-
-#: /scr/wpsg4/base/wpshopgermany_svn/mods/wpsg_mod_versandarten.class.php:476
-msgid "Ein Versand in dieses Postleitzahlengebiet ist nicht mÃ¶glich."
-msgstr "Shipping to this postcode area is not possible."
-
-# @ wpsg
-#~ msgid "Keine Registrierungsdaten gefunden."
-#~ msgstr "No registration data found."
-
-# @ wpsg
-#~ msgid "Domainregistrierung erfolgreich entfernt."
-#~ msgstr "Domain registration removed successfully."
-
-# @ wpsg
-#~ msgid "UngÃŒltiger Modulcode."
-#~ msgstr "Invalid code for module."
-
-# @ wpsg
-#~ msgid "Modul erfolgreich aktiviert."
-#~ msgstr "Module successfully activated."
-
-# @ wpsg
-#~ msgid "Registrierungsdaten erfolgreich ÃŒbermittelt"
-#~ msgstr "Registration information submitted successfully"
-
-# @ wpsg
-#~ msgid "Light Version"
-#~ msgstr "Light version"
-
-# @ wpsg
-#~ msgid "Anklicken ..."
-#~ msgstr "Click on..."
-
-# @ wpsg
-#~ msgid "Bitte lÃ¶schen sie vor dem Import alle Bestelldaten!"
-#~ msgstr "Please delete all orders before import!"
-
-# @ wpsg
-#~ msgid ""
-#~ "Version des Exportes ist nicht kompatibel, bitte importieren Sie nur aus "
-#~ "einem wpShopGermany aus der Version 2.5.8."
-#~ msgstr ""
-#~ "Export is not compatible. Please import only exports made from "
-#~ "wpShopGermany version 2.5.8."
-
-# @ wpsg
-#~ msgid "Import war erfolgreich, bitte prÃŒfen Sie die Daten."
-#~ msgstr "Data successfully imported. Please check imported data."
-
-# @ wpsg
-#~ msgid ""
-#~ "Es ist eine neue wpShopGermany Version vorhanden, bitte installieren Sie "
-#~ "diese ÃŒber die Pluginverwaltung."
-#~ msgstr ""
-#~ "There is a newer version of wpShopGermany, please update via Installed "
-#~ "Plugins page in backend."
-
-# @ wpsg
-#~ msgid "Templatedatei existiert nicht (#1#) !"
-#~ msgstr "File for template (#1#) not found!"
-
-# @ wpsg
-#~ msgid "Aktive Demo Lizenz (Noch #1# Tage)"
-#~ msgstr "Activated demo licence (#1# day(s) remaining)"
-
-# @ wpsg
-#~ msgid "Fehler beim anlegen des Backupverzeichnisses."
-#~ msgstr "Failed to create backup directory."
-
-# @ wpsg
-#~ msgid "Userviews wurden nicht kopiert."
-#~ msgstr "Userviews not copied."
-
-# @ wpsg
-#~ msgid "Unerwarteter Fehler bei Gutscheinzuordnung."
-#~ msgstr "Unexpected error while assigning your voucher."
-
-# @ wpsg
-#~ msgid "Bitte die Eingaben im Feld \"#1#\" ÃŒberprÃŒfen."
-#~ msgstr "Please check your entry for \"#1#\"."
-
-# @ wpsg
-#~ msgid "UngÃŒltiges Trennzeichen angegeben!"
-#~ msgstr "Invalid delimiter!"
-
-# @ wpsg
-#~ msgid "Titel/Anrede"
-#~ msgstr "Salutation"
-
-# @ wpsg
-#~ msgid "Gutschriftsnummer"
-#~ msgstr "Credit number"
-
-# @ wpsg
-#~ msgid ""
-#~ "Zahlen Sie die Bestellung auf Rechnung. Die Ware wird dann nach erhalt "
-#~ "des Rechnungsbetrags versendet."
-#~ msgstr ""
-#~ "Pay the order by invoice. The article(s) will be shipped to you after "
-#~ "receipt of payment."
-
-# @ wpsg
-#~ msgid "value"
-#~ msgstr "value"
-
-# @ wpsg
-#~ msgid "<!-- Tragen Sie hier die E-Mail ihres PayPal Kontos ein --!>"
-#~ msgstr "<!-- Enter here the email address of your PayPal account --!>"
-
-# @ wpsg
-#~ msgid "<!-- Ersetzen durch den Kontoinhaber --!>"
-#~ msgstr "<!-- Replace with bank account owner --!>"
-
-# @ wpsg
-#~ msgid "<!-- Ersetzen durch die Kontonummer --!>"
-#~ msgstr "<!-- Replace with bank account number--!>"
-
-# @ wpsg
-#~ msgid "<!-- Ersetzen durch den Namen der Bank --!>"
-#~ msgstr "<!-- Replace with bank name --!>"
-
-# @ wpsg
-#~ msgid "<!-- Ersetzen durch die Bankleitzahl --!>"
-#~ msgstr "<!-- Replace with bank code --!>"
-
-# @ wpsg
-#~ msgid "<!-- Ersetzen durch die IBAN des Kontos --!>"
-#~ msgstr "<!-- Replace with IBAN of your bank account --!>"
-
-# @ wpsg
-#~ msgid "<!-- Ersetzen durch den SWIFT Code --!>"
-#~ msgstr "<!-- Replace with SWIFT code --!>"
-
-# @ wpsg
-#~ msgid "Bildercache gelÃ¶scht."
-#~ msgstr "Cache for pictures has been cleared."
-
-# @ wpsg
-#~ msgid "ErmÃ¶glicht verschiedene Produktvariationen."
-#~ msgstr "Allows you to use various product variations."
-
-# @ wpsg
-#~ msgid "Import aus wpShopGermany 2.5.8"
-#~ msgstr "Import from wpShopGermany 2.5.8"
-
-# @ wpsg
-#~ msgid ""
-#~ "Mit dieser Funktion kÃ¶nnen sie den Export aus einem wpShopGermany 2.5.8 "
-#~ "in diese Version importieren"
-#~ msgstr ""
-#~ "With this feature you can import data you exported from former "
-#~ "wpShopGermany version 2.5.8."
-
-# @ wpsg
-#~ msgid "Sichern Sie in jedem Fall vorher ihre Daten!"
-#~ msgstr "In any case make a backup of your data before proceeding!"
-
-# @ wpsg
-#~ msgid ""
-#~ "FÃŒr den Import der Daten aus der Version 2 gibt es 3 Wege, beachten Sie "
-#~ "dazu unsere <a href=\"#1#\">Upgrade Anleitung</a>."
-#~ msgstr ""
-#~ "You have 3 options to import data from version 2 of wpShopGermany. Please "
-#~ "pay attention to our <a href=\"#1#\">upgrade manual</a>."
-
-# @ wpsg
-#~ msgid ""
-#~ "WÃ€hlen Sie diese Option wenn sie das Plugin direkt in diesem Wordpress "
-#~ "mit der Version2 ausgetauscht haben."
-#~ msgstr ""
-#~ "select this option if you have updated the plugin within this Wordpress "
-#~ "installation."
-
-# @ wpsg
-#~ msgid ""
-#~ "Sie kÃ¶nnen diesen Import mehrfach durchfÃŒhren. Starten Sie einen Testlauf "
-#~ "und prÃŒfen Sie anschlieÃend die Daten. Sollte alles OK sein, so kÃ¶nnen "
-#~ "Sie den Durchlauf ein zweites mal durchfÃŒhren und die Tabellen und Daten "
-#~ "lÃ¶schen."
-#~ msgstr ""
-#~ "You can import multiple times. So do a test run and check if everything "
-#~ "went right. After that you can rerun the process and delete old tables "
-#~ "and data."
-
-# @ wpsg
-#~ msgid "Alte Tabellen und Daten nach Import lÃ¶schen."
-#~ msgstr "Delete old tables and data after import."
-
-# @ wpsg
-#~ msgid "Die vorher installierte wpShopGermany Version ist nicht kompatibel"
-#~ msgstr "The previously installed version is not compatible."
-
-# @ wpsg
-#~ msgid ""
-#~ "Diese Option steht ihnen nur zur VerfÃŒgung wenn sie vorher eine Version "
-#~ "2.5.8 des wpShopGermany installiert hatten."
-#~ msgstr ""
-#~ "This option is only available if you used wpShopGermany 2.5.8 before."
-
-# @ wpsg
-#~ msgid ""
-#~ "Import aus der exportierten Datendatei ÃŒber Datei Upload (Aus Version "
-#~ "2.5.8)"
-#~ msgstr ""
-#~ "Import from an exported data file using the upload function (data file "
-#~ "needs to be exported using version 2.5.8)"
-
-# @ wpsg
-#~ msgid "Import einer per FTP hochgeladenen Datendatei (Aus Version 2.5.8)"
-#~ msgstr ""
-#~ "Import from a data file that has been uploaded via FTP (data file needs "
-#~ "to be exported using version 2.5.8)"
-
-# @ wpsg
-#~ msgid "Dazu muss die Datei unter folgendem Pfad abgelegt werden:"
-#~ msgstr "The file has to be stored at the following location:"
-
-# @ wpsg
-#~ msgid ""
-#~ "Datei erkannt, klicken Sie auf \"Importieren\" um den Import zu starten."
-#~ msgstr "File found, click on \\\"Import\\\" to start the process."
-
-# @ wpsg
-#~ msgid "Keine Datei an dieser Stelle gefunden."
-#~ msgstr "No file found at this location."
-
-# @ wpsg
-#~ msgid "#1# Tage verbleibend."
-#~ msgstr "#1# day(s) remaining."
-
-# @ wpsg
-#~ msgid "Feldbezeichnung"
-#~ msgstr "Field description"
-
-# @ wpsg
-#~ msgid "Keine"
-#~ msgstr "None"
-
-# @ wpsg
-#~ msgid ""
-#~ "Damit sie den Shop registrieren kÃ¶nnen benÃ¶tigen sie eine gÃŒltige Lizenz."
-#~ "<br />Diese kÃ¶nnen sie unter <a href=\"http://shop.maennchen1.de/\" "
-#~ "target=\"_blank\">shop.maennchen1.de</a> erwerben und anschlieÃend in der "
-#~ "Plugin Verwaltung installieren."
-#~ msgstr ""
-#~ "You need a valid licence to register wpShopGermany.<br />The licence can "
-#~ "be purchased at <a href=\"http://shop.maennchen1.de/\" target=\"_blank"
-#~ "\">shop.maennchen1.de</a> and entered in the plugin management afterwards."
-
-# @ wpsg
-#~ msgid "Demo Modus noch #1# Tage verbleibend."
-#~ msgstr "Demo mode, #1# day(s) remaining."
-
-# @ wpsg
-#~ msgid ""
-#~ "Sind Sie sich sicher, dass sie diesen Mehrwertsteuersatz lÃ¶schen mÃ¶chten?"
-#~ msgstr "Are you sure you want to delete this sales tax rate?"
-
-# @ wpsg
-#~ msgid "Neuen Mehrwertsteuersatz anlegen"
-#~ msgstr "Create new sales tax rate"
-
-# @ wpsg
-#~ msgid "Bisher keine MehrwertsteuersÃ€tze hinterlegt."
-#~ msgstr "No sales taxe rates specified yet."
-
-# @ wpsg
-#~ msgid "Lizenzart"
-#~ msgstr "Licence type"
-
-# @ wpsg
-#~ msgid "Ãnderungen ÃŒbermitteln"
-#~ msgstr "Submit changes"
-
-# @ wpsg
-#~ msgid "Registrierte Domains"
-#~ msgstr "Registered domains"
-
-# @ wpsg
-#~ msgid "Bereits auf diesen Key registrierte Domains"
-#~ msgstr "Registered domains for this key"
-
-# @ wpsg
-#~ msgid ""
-#~ "Sie dÃŒrfen mit dieser Lizenz den Shop nur auf einer Domain laufen lassen. "
-#~ "LÃ¶schen sie die bereits registrierte Domain und registrieren Sie diese "
-#~ "Domain neu."
-#~ msgstr ""
-#~ "You are only allowed to run the shop on one domain with your key. Please "
-#~ "delete a registered domain before adding a new one."
-
-# @ wpsg
-#~ msgid "Weitere Module"
-#~ msgstr "Additional modules"
-
-# @ wpsg
-#~ msgid ""
-#~ "wpShopGermany kann mit weiteren Modulen um spezielle Funktionen erweitert "
-#~ "werden. Die Module sind zum Teil kostenpflichtig."
-#~ msgstr ""
-#~ "wpShopGermany can be extended with special features. Some modules are "
-#~ "free of charge, some have to be purchased."
-
-# @ wpsg
-#~ msgid "ModulschlÃŒssel"
-#~ msgstr "Module key"
-
-# @ wpsg
-#~ msgid "Hier sehen sie verfÃŒgbare Module"
-#~ msgstr "All available modules"
-
-# @ wpsg
-#~ msgid "Aktuelle Version nicht mit Shop kompatibel."
-#~ msgstr "Current version not compatible with shop."
-
-# @ wpsg
-#~ msgid "Modul nicht geladen."
-#~ msgstr "Module not loaded."
-
-# @ wpsg
-#~ msgid "Modul aktiv."
-#~ msgstr "Module is active."
-
-# @ wpsg
-#~ msgid "Modul geladen aber nicht aktiv."
-#~ msgstr "Module loaded but inactive."
-
-# @ wpsg
-#~ msgid "Demo"
-#~ msgstr "Demo"
-
-# @ wpsg
-#~ msgid "Sind Sie sich sicher, dass sie dieses Modul aktualisieren mÃ¶chten?"
-#~ msgstr "Are you sure you want to update this module?"
-
-# @ wpsg
-#~ msgid "Modul laden"
-#~ msgstr "Download module"
-
-# @ wpsg
-#~ msgid "Kaufen"
-#~ msgstr "Purchase"
-
-# @ wpsg
-#~ msgid "Rechnungbetrag"
-#~ msgstr "Invoice amount"
-
-# @ wpsg
-#~ msgid "Genereller Rabatt"
-#~ msgstr "General discount"
-
-# @ wpsg
-#~ msgid "Rabatt (in %)"
-#~ msgstr "Discount (in %)"
-
-# @ wpsg
-#~ msgid "Trennzeichen"
-#~ msgstr "Separator"
-
-# @ wpsg
-#~ msgid "Format:"
-#~ msgstr "Format:"
-
-# @ wpsg
-#~ msgid "#1# Elemente"
-#~ msgstr "#1# element(s)"
-
-# @ wpsg
-#~ msgid "Zur letzten Seite gehen"
-#~ msgstr "Jump to last page"
-
-# @ wpsg
-#~ msgid "Alle markieren"
-#~ msgstr "Select all"
-
-# @ wpsg
-#~ msgid "End"
-#~ msgstr "End"
-
-# @ wpsg
-#~ msgid "GebÃŒhr/ Rabatt"
-#~ msgstr "Charge\\Discount"
-
-# @ wpsg
-#~ msgid "Absender Name"
-#~ msgstr "Sender name"
-
-# @ wpsg
-#~ msgid "Zahlungsaufforderung"
-#~ msgstr "Application for payment"
-
-# @ wpsg
-#~ msgid "Ihr wpShopGermany Team"
-#~ msgstr "Your Shop Team"
-
-# @ wpsg
-#~ msgid "Zahlungserinnerung"
-#~ msgstr "Payment reminder"
-
-# @ wpsg
-#~ msgid "Name/Anschrift"
-#~ msgstr "Name\\Address"
-
-# @ wpsg
-#~ msgid "Exportieren"
-#~ msgstr "Export"
-
-# @ wpsg
-#~ msgid "Bestellungen nur fÃŒr registrierte Kunden zulassen"
-#~ msgstr "Allow orders only for registered customers"
-
-# @ wpsg
-#~ msgid "E-Mail (PayPal Konto)"
-#~ msgstr "Email (PayPal account)"
-
-# @ wpsg
-#~ msgid ""
-#~ "Zur Anbindung an den PayPal Service wird <a href=\"https://www."
-#~ "paypalobjects.com/de_DE/html/IntegrationCenter/ic_pps_home.html\">PayPal "
-#~ "Starter</a> genutzt. FortfÃŒhrende Details finden Sie im <a href=\"https://"
-#~ "www.paypalobjects.com/de_DE/pdf/PayPal-Starter-Integrationshandbuch.pdf"
-#~ "\">Paypal Starter Integrationshandbuch.</a>"
-#~ msgstr ""
-#~ "To connect to the PayPal service the <a href=\"https://www.paypalobjects."
-#~ "com/de_DE/html/IntegrationCenter/ic_pps_home.html\">PayPal Starter</a> "
-#~ "functions are used. Further information can be found in the <a href="
-#~ "\"https://www.paypalobjects.com/de_DE/pdf/PayPal-Starter-"
-#~ "Integrationshandbuch.pdf\">Paypal Starter manual</a>."
-
-# @ wpsg
-#~ msgid ""
-#~ "Im Integrationshandbuch erfahren Sie auch, wie Sie die Sandbox nutzen, um "
-#~ "den Zahlungsverkehr zu testen."
-#~ msgstr ""
-#~ "In the manual you find information how to use the sand box mode to test "
-#~ "your payment transactions."
-
-# @ wpsg
-#~ msgid "BLZ: #1#"
-#~ msgstr "Bank code: #1#"
-
-# @ wpsg
-#~ msgid "Dieses Template erfordert das Modul mod_produktbilder."
-#~ msgstr "This template requires the module mod_produktbilder."
-
-# @ wpsg
-#~ msgid "Auswahl (| als Trenner)"
-#~ msgstr "Choice (| as separator)"
-
-# @ wpsg
-#~ msgid "Bitte anklicken um Auswahl kommagetrennt zu definieren"
-#~ msgstr "Please click to define choices separated by comma"
-
-# @ wpsg
-#~ msgid "Um ein Bild zu lÃ¶schen klicken Sie einfach auf das Bild."
-#~ msgstr "To delete a picture just click on it."
-
-# @ wpsg
-#~ msgid "BildhÃ¶he (Vorschau)"
-#~ msgstr "Height (preview)"
-
-# @ wpsg
-#~ msgid "Bildmodus (Vorschau)"
-#~ msgstr "Picture mode (preview)"
-
-# @ wpsg
-#~ msgid "Zuschneiden"
-#~ msgstr "Cut"
-
-# @ wpsg
-#~ msgid "BildqualitÃ€t (PNG/JPG)"
-#~ msgstr "Quality (png/jpeg)"
-
-# @ wpsg
-#~ msgid "Definieren ..."
-#~ msgstr "Define..."
-
-# @ wpsg
-#~ msgid "Radio Auswahl"
-#~ msgstr "Radio button"
-
-# @ wpsg
-#~ msgid "Varianten Art. Nr."
-#~ msgstr "Item number of variant"
-
-# @ wpsg
-#~ msgid "Speicher..."
-#~ msgstr "Saving..."
-
-# @ wpsg
-#~ msgid "Zum Bearbeiten anklicken und mit Enter bestÃ€tigen ..."
-#~ msgstr "Click to edit and press enter to confirm changes..."
-
-# @ wpsg
-#~ msgid "Anlegen"
-#~ msgstr "Create"
-
-# @ wpsg
-#~ msgid "Auswahl durch Radio Buttons"
-#~ msgstr "Choice using radio buttons"
-
-# @ wpsg
-#~ msgid "Auswahl ÃŒber eine Selectbox"
-#~ msgstr "Choice using drop down box"
-
-# @ wpsg
-#~ msgid "Ãber eine Checkbox aktivierbar"
-#~ msgstr "Activate using a check box"
-
-# @ wpsg
-#~ msgid ""
-#~ "Sind Sie sich sicher, dass Sie die Variante und alle Variationen lÃ¶schen "
-#~ "mÃ¶chten?"
-#~ msgstr ""
-#~ "Are you sure you want to delete this variant and all variations from it?"
-
-# @ wpsg
-#~ msgid "Direkte Anzeige eines Variantenbildes"
-#~ msgstr "Show variant pictures immediately"
-
-# @ wpsg
-#~ msgid "Produktbild anhand der Variante austauschen"
-#~ msgstr "Change product picture according to selected variant"
-
-# @ wpsg
-#~ msgid "HÃ¶he des Vorschaubildes"
-#~ msgstr "Height of preview picture"
-
-# @ wpsg
-#~ msgid ""
-#~ "Die direkte Anzeige, zeigt die Bilder direkt an. Es wird dabei fÃŒr jede "
-#~ "Variation ein Bild angezeigt. Bei Selectboxen erfolgt die Anzeige ÃŒber "
-#~ "den Wechsel der Selectbox. "
-#~ msgstr ""
-#~ "Shows the picture immediately for every variation that has been selected. "
-#~ "When using a drop down box the picture is changed when a new item was "
-#~ "selected in the box."
-
-# @ wpsg
-#~ msgid "Status wÃ€hlen (Alle)"
-#~ msgstr "select status (All)"
-
-# @ wpsg
-#~ msgid "Auswahl einschrÃ€nken"
-#~ msgstr "Limit range"
-
-# @ wpsg
-#~ msgid "Bestellung wurde in der Sprache #1# durchgefÃŒhrt."
-#~ msgstr "Order was made using the language #1#."
-
-# @ wpsg
-#~ msgid "Titel"
-#~ msgstr "Salutation"
-
-# @ wpsg
-#~ msgid "Anzeigen/Verbergen"
-#~ msgstr "Show\\hide"
-
-# @ wpsg
-#~ msgid "Noch keine EintrÃ€ge"
-#~ msgstr "No entries yet"
-
-# @ wpsg
-#~ msgid "Preis (BRUTTO)"
-#~ msgstr "Price (gross)"
-
-# @ wpsg
-#~ msgid "hint"
-#~ msgstr "hint"
-
-# @ wpsg
-#~ msgid "ZurÃŒck zur Kasse"
-#~ msgstr "Back to checkout"
-
-# @ wpsg
-#~ msgid "Darin enthaltene MwSt. (#1#)"
-#~ msgstr "Included sales tax (#1#)"
-
-# @ wpsg
-#~ msgid "http://wpshopgermany.maennchen1.de/"
-#~ msgstr "http://wpshopgermany.maennchen1.de/"
-
-# @ wpsg
-#~ msgid "The first real Wordpress shop plugin for Germany!"
-#~ msgstr "The first real Wordpress shop plugin for Germany!"
-
-# @ wpsg
-#~ msgid "maennchen1.de"
-#~ msgstr "maennchen1.de"
-
-# @ wpsg
-#~ msgid "http://maennchen1.de/"
-#~ msgstr "http://maennchen1.de/"
-
-# @ wpsg
-#~ msgid "Sie sind bereits Kunde? Dann kÃ¶nnen Sie sich hier anmelden."
-#~ msgstr "If you are already a customer you can log in here."
-
-# @ wpsg
-#~ msgid ""
-#~ "Passwort fÃŒr Kundenkonto angeben. Wenn Sie kein Kundenkonto anlegen (also "
-#~ "nur einmalig ein Produkt bestellen) wollen, kÃ¶nnen Sie diese Felder leer "
-#~ "lassen."
-#~ msgstr ""
-#~ "Password for customer account. If you don't want to create a customer "
-#~ "account (e.g. you just want to order a single time) leave these fields "
-#~ "blank."
-
-# @ wpsg
-#~ msgid "ZuzÃŒglich MwSt. (#1#)"
-#~ msgstr "Plus sales tax (#1#)"
-
-# @ wpsg
-#~ msgid "Bestelldaten angeben"
-#~ msgstr "Enter order information"
-
-# @ wpsg
-#~ msgid "Versandkosten."
-#~ msgstr "Shipping costs."
-
-# @ wpsg
-#~ msgid "Zusendung einer Kopie fÃŒr Gutschrift #1# an #2#"
-#~ msgstr "Sending of a copy for credit voucher #1# to #2#"
-
-# @ wpsg
-#~ msgid "Ihr Shop Team"
-#~ msgstr "Your Shop Team"
-
-# @ wpsg
-#~ msgid "E-Mail bei neuer Gutschrift"
-#~ msgstr "Email for new credit voucher"
-
-# @ wpsg
-#~ msgid ""
-#~ "Diese Mail bekommt der Kunde wenn eine neue Gutschrift geschrieben wird."
-#~ msgstr ""
-#~ "This email is sent to the customer when a new credit voucher is written."
-
-# @ wpsg
-#~ msgid "Sie erhalten hiermit die Gutschrift in HÃ¶he von"
-#~ msgstr "Hereby you get a credit voucher of"
-
-# @ wpsg
-#~ msgid "Gutschrift vom #1#"
-#~ msgstr "Credit voucher from #1#"
-
-# @ wpsg
-#~ msgid "Rechnung stornieren"
-#~ msgstr "Cancel invoice"
-
-# @ wpsg
-#~ msgid "Keine Gutschrift."
-#~ msgstr "No credit voucher."
-
-# @ wpsg
-#~ msgid "Neuer Status:"
-#~ msgstr "New status:"
-
-# @ wpsg
-#~ msgid ""
-#~ "Alle angegebenen Preise sind Endpreise zzgl. Liefer-/Versandkosten. "
-#~ "Aufgrund des Kleinunternehmerstatus gemÃ€Ã Â§ 19 UStG erhebe ich keine "
-#~ "Umsatzsteuer und weise diese daher auch nicht aus."
-#~ msgstr ""
-#~ "All prices are customer prices plus delivery and shipping costs. Since I "
-#~ "run a 'small business' as defined in Â§19 UStG, I do not bill VAT."
-
-# @ wpsg
-#~ msgid "Diese Zeile wird klein oberhalb der Kundenadresse platziert"
-#~ msgstr "This line will be shown small above the customer address."
-
-# @ wpsg
-#~ msgid "Startnummer (Gutschrift)"
-#~ msgstr "Start number (credit vouchers)"
-
-# @ wpsg
-#~ msgid "Format (Gutschrift)"
-#~ msgstr "Format (credit vouchers)"
-
-# @ wpsg
-#~ msgid "Wird eine Bestellvariable vom Type"
-#~ msgstr "Is an order variable of the type"
-
-# @ wpsg
-#~ msgid "\"Auswahl\""
-#~ msgstr "\"Choice\""
-
-# @ wpsg
-#~ msgid ""
-#~ "angelegt, kÃ¶nnen die Optionen mit dem Pipe \"|\" Symbol getrennt "
-#~ "angegeben werden."
-#~ msgstr "created, options can be separated using \"|\"."
-
-# @ wpsg
-#~ msgid "Bsp.:"
-#~ msgstr "Example:"
-
-# @ wpsg
-#~ msgid "Auswahl_1 | Auswahl_2 | Auswahl_3"
-#~ msgstr "Choice_1 | Choice_2 | Choice_3"
-
-# @ wpsg
-#~ msgid "Click & Buy"
-#~ msgstr "ClickandBuy"
-
-# @ wpsg
-#~ msgid "Wickeln Sie ihre Bestellung ÃŒber Click&Buy ab."
-#~ msgstr "Use ClickandBuy to purchase your order."
-
-# @ wpsg
-#~ msgid "ErmÃ¶glicht die Zahlungsart Click & Buy."
-#~ msgstr "Allows the payment method ClickandBuy."
-
-# @ wpsg
-#~ msgid "Neuer ClickandBuy Bezahl Link"
-#~ msgstr "New ClickandBuy payment link"
-
-# @ wpsg
-#~ msgid ""
-#~ "Der angefragte RÃŒckzahlungsbetrag ist grÃ¶Ãer als der noch nicht "
-#~ "zurÃŒckgezahlte Betrag!"
-#~ msgstr ""
-#~ "The requested amount to be repaid is higher than the not repaid amount!"
-
-# @ wpsg
-#~ msgid "Der angefragte RÃŒckzahlungsbetrag muss grÃ¶Ãer als 0 sein!"
-#~ msgstr "The requested amount to be repaid has to be higher than 0."
-
-# @ wpsg
-#~ msgid "Neue MMS StatusÃ€nderungen ERFOLG"
-#~ msgstr "New MMS for status change SUCCESS"
-
-# @ wpsg
-#~ msgid "Neue MMS StatusÃ€nderungen FEHLER"
-#~ msgstr "New MMS for status change ERROR"
-
-# @ wpsg
-#~ msgid "Versandkosten und AufschlÃ€ge"
-#~ msgstr "Shipping costs and additional charges"
-
-# @ wpsg
-#~ msgid "Versandkostenfrei per E-Mail"
-#~ msgstr "Free shipping via email"
-
-# @ wpsg
-#~ msgid ""
-#~ "Es wurde vom Administrator ein neuer ClickandBuy Bezahllink erstellt:"
-#~ msgstr "The administrator created a new ClickandBuy payment link:"
-
-# @ wpsg
-#~ msgid ""
-#~ "Um den Betrag mit Click&Buy zu bezahlen klicken Sie bitte auf folgendes "
-#~ "Logo."
-#~ msgstr ""
-#~ "Please click on the following logo to pay the amount using ClickandBuy."
-
-# @ wpsg
-#~ msgid "Mit Click&Buy bezahlen"
-#~ msgstr "Pay with ClickandBuy"
-
-# @ wpsg
-#~ msgid "Derzeitiger Status"
-#~ msgstr "Current status"
-
-# @ wpsg
-#~ msgid "Link"
-#~ msgstr "link"
-
-# @ wpsg
-#~ msgid "Neu generieren und versenden"
-#~ msgstr "Regenerate and resend"
-
-# @ wpsg
-#~ msgid "RÃŒckzahlung"
-#~ msgstr "Refund"
-
-# @ wpsg
-#~ msgid "ZurÃŒckzahlen"
-#~ msgstr "Do refund"
-
-# @ wpsg
-#~ msgid "Auftragsbezeichnung"
-#~ msgstr "Order description"
-
-# @ wpsg
-#~ msgid "Kryptographischer SchlÃŒssel"
-#~ msgstr "Cryptographic key"
-
-# @ wpsg
-#~ msgid "Kryptographischer SchlÃŒssel (MMS)"
-#~ msgstr "Cryptographic key (MMS)"
-
-# @ wpsg
-#~ msgid "Erfolgslink"
-#~ msgstr "Success link"
-
-# @ wpsg
-#~ msgid ""
-#~ "<b>wpShopGermany:</b> Bitte registrieren Sie diese Domain. Sie kÃ¶nnen "
-#~ "dies ganz einfach im <a href=\"#1#\">Lizenzmanager</a> durchfÃŒhren."
-#~ msgstr ""
-#~ "<b>wpShopGermany:</b> Please register this domain. You can do that by "
-#~ "using the <a href=\"#1#\">Licence manager</a>."
-
-# @ wpsg
-#~ msgid ""
-#~ "nohspc_Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. "
-#~ "Eine Registrierung Ihrer Domain ist somit nicht mÃ¶glich! <br />Weitere "
-#~ "Informationen finden Sie in unseren <a target=\"_blank\" href=\"http://"
-#~ "wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-"
-#~ "meinem-server-aktiviert-sind/\">FAQ</a>. Klicken Sie <a href=\"#1#"
-#~ "\">hier</a>, um die Meldung auszublenden."
-#~ msgstr ""
-#~ "nohspc_You server is missing the PHP library to support SOAP. That's why "
-#~ "you cannot register your domain! <br />Additional information can be "
-#~ "found in our <a target=\"_blank\" href=\"http://wpshopgermany.maennchen1."
-#~ "de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/"
-#~ "\">FAQ</a>. Click <a href=\"#1#\">here</a> to hide this message."
-
-# @ wpsg
-#~ msgid "Hilfeseite zur E-Mail Konfiguration"
-#~ msgstr "Help page for email configuration"
-
-# @ wpsg
-#~ msgid ""
-#~ "Hier kÃ¶nnen die Betreffs, EmpfÃ€nger und BCC/CC der E-Mails konfiguriert "
-#~ "werden."
-#~ msgstr "Here you can set the subject, receiver and BCC\\CC for emails."
-
-# @ wpsg
-#~ msgid "Mailanhang"
-#~ msgstr "Mail attachement"
-
-# @ wpsg
-#~ msgid "Aktuelle Datei ist"
-#~ msgstr "Current file is"
-
-# @ wpsg
-#~ msgid "Vor #1# Tage(n) abgelaufen."
-#~ msgstr "Expired #1# day(s) ago."
-
-# @ wpsg
-#~ msgid "Dateiformat (Import wie Export)"
-#~ msgstr "File format (import & export)"
-
-# @ wpsg
-#~ msgid "Details einblenden"
-#~ msgstr "Show details"
-
-# @ wpsg
-#~ msgid "Details ausblenden"
-#~ msgstr "Hide details"
-
-# @ wpsg
-#~ msgid "Gutschrift #1#"
-#~ msgstr "Credit voucher #1#"
-
-# @ wpsg
-#~ msgid "Loginzwang im Checkout"
-#~ msgstr "Force login in check out"
-
-# @ wpsg
-#~ msgid "Alle Kunden auf Inaktiv setzen."
-#~ msgstr "Set all customers to inactive."
-
-# @ wpsg
-#~ msgid "0 = Schlechte QualitÃ€t, 100 = Gute QualitÃ€t"
-#~ msgstr "0 = bad quality, 100 = good quality"
-
-# @ wpsg
-#~ msgid "Bildercache lÃ¶schen"
-#~ msgstr "Delete picture cache"
-
-# @ wpsg
-#~ msgid "Neues Feld fÃŒr die FuÃzeile hinzufÃŒgen"
-#~ msgstr "Add field for footer"
-
-# @ wpsg
-#~ msgid "3.1.2"
-#~ msgstr "3.1.2"
-
-# @ wpsg
-#~ msgid "Herr|Frau"
-#~ msgstr "Mr|Mrs"
-
-# @ wpsg
-#~ msgid "ProduktschlÃŒssel verfÃŒgbar nach Eingang der Zahlung."
-#~ msgstr "Product key is available after purchase."
Index: ng/wpsg-vi_VN.po
===================================================================
--- /lang/wpsg-vi_VN.po	(revision 8528)
+++ 	(revision )
@@ -1,11707 +1,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: wpShopGermany v3.1.2\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-03-06 09:58+0000\n"
-"PO-Revision-Date: 2017-03-06 13:31+0000\n"
-"Last-Translator: KimMueller <kim@rmueller.de>\n"
-"Language-Team: Vietnamese\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0\n"
-"X-Generator: Loco - https://localise.biz/\n"
-"X-Poedit-SourceCharset: utf-8\n"
-"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
-"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
-"X-Poedit-Basepath: ..\n"
-"X-Textdomain-Support: yes\n"
-"Language: vi\n"
-"X-Poedit-SearchPath-0: ."
-
-#: ../controller/wpsg_BasketController.class.php:2
-msgid "Es befinden sich keine Produkte im Warenkorb."
-msgstr "KhÃŽng cÃ³ sáº£n pháº©m trong giá»."
-
-#: ../controller/wpsg_BasketController.class.php:2
-msgid ""
-"Dieser Gutscheincode kann nicht eingelÃ¶st werden, da der Mindestbestellwert "
-"von #1# noch nicht erreicht ist."
-msgstr ""
-"MÃ£ nÃ y khÃŽng cÃ³ thá» ÄÆ°á»£c mua láº¡i bá»i vÃ¬ trÃ¬nh tá»± tá»i thiá»u cá»§a # 1 # lÃ  chÆ°a "
-"Äáº¡t."
-
-#: ../controller/wpsg_BasketController.class.php:4
-msgid ""
-"Gutschein konnte nicht hinzugefÃŒgt werden, da er fÃŒr das Produkt #1# nicht "
-"zulÃ€ssig ist."
-msgstr ""
-"CÃ¡c chá»©ng tá»« khÃŽng thá» ÄÆ°á»£c thÃªm vÃ o bá»i vÃ¬ nÃ³ khÃŽng ÄÆ°á»£c phÃ©p cho sáº£n pháº©m "
-"# 1 #."
-
-#: ../controller/wpsg_BasketController.class.php:4
-msgid ""
-"Gutschein konnte nicht hinzugefÃŒgt werden, da er fÃŒr die Produkte #1# nicht "
-"zulÃ€ssig ist."
-msgstr ""
-"CÃ¡c chá»©ng tá»« khÃŽng thá» ÄÆ°á»£c thÃªm vÃ o bá»i vÃ¬ nÃ³ khÃŽng ÄÆ°á»£c phÃ©p cho sáº£n pháº©m "
-"# 1 #."
-
-#: ../controller/wpsg_BasketController.class.php:4
-msgid "Produkt darf nur einmal im Warenkorb auftauchen."
-msgstr "Sáº£n pháº©m chá» ÄÆ°á»£c sá»­ dá»¥ng má»t trong giá» hÃ ng."
-
-#: ../controller/wpsg_SystemController.class.php:2 
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "<a href=\"#1#\">Klicken Sie hier, um die Meldung auszublenden.</a>"
-msgstr "<a href=\"#1#\"> Nháº¥n vÃ o ÄÃ¢y Äá» áº©n cÃ¡c thÃŽng Äiá»p mÃ£."
-
-#: ../controller/wpsg_SystemController.class.php:2
-msgid "Meldung ausblenden"
-msgstr "áºšn thÃŽng bÃ¡o"
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Shopinfo"
-msgstr "cá»­a hÃ ng ThÃŽng tin"
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Erweitert"
-msgstr "gia tÄng"
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Darstellung"
-msgstr "sá»± Äáº¡i diá»n"
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Widerruf"
-msgstr "sá»± rÃºt lui"
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Kundenvoreinstellungen"
-msgstr "sá» thÃ­ch cá»§a khÃ¡ch hÃ ng"
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Shopdaten erfolgreich gespeichert."
-msgstr "LÆ°u trá»¯ dá»¯ liá»u lÆ°u thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:2
-msgid ""
-"Die allgemeinen Daten des Shops haben sich verÃ€ndert, sie sollten das <a "
-"href=\"#1#\">Widerrufsformular</a> ÃŒberprÃŒfen bzw. neu generieren."
-msgstr ""
-"Cá»­a CÃ¡c dá»¯ liá»u nÃ³i chung ÄÃ£ thay Äá»i, há» nÃªn kiá»m tra cÃ¡c hÃ¬nh thá»©c rÃºt "
-"href=\"#1#\"> Äang <a hoáº·c tÃ¡i sinh."
-
-#: ../controller/wpsg_AdminController.class.php:11
-msgid "Migration der MwSt. SÃ€tze erfolgreich durchgefÃŒhrt."
-msgstr "Di cÆ° cá»§a thuáº¿ GTGT. Thiáº¿t láº­p thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr PayPal GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ PayPal"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Bankeinzugs GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i lá» phÃ­ ghi ná»£ trá»±c tiáº¿p"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Billsafe GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ BillSAFE"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Click&Buy GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i Click & Mua PhÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Nachnahme GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Flexipay GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ Flexipay"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Giropay (Giropay) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i Giropay (Giropay) PhÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Giropay (Creditcard) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i Giropay (Credit Card) phÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Giropay (Lastschrift) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ Giropay (ghi ná»£)"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz der GebÃŒhren fÃŒr Zahlung mit Rechnung"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i lá» phÃ­ thanh toÃ¡n theo hÃ³a ÄÆ¡n"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Klarna GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ Klarna"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Creditcard) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments (Credit Card) phÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Creditcardreservation) GebÃŒhren"
-msgstr ""
-"Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments (Credit Card Reservation) phÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Lastschrift) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments phÃ­ (ghi ná»£)"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (eBank2Pay) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments phÃ­ (eBank2Pay)"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Vorkasse) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments (trÆ°á»c) PhÃ­"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (Call2Pay) GebÃŒhren"
-msgstr ""
-"Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments phÃ­ (Call2Pay"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Micropayment (HandyPay) GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i micropayments phÃ­ (HandyPay)"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Vorkasse GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ trÆ°á»c"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr GebÃŒhren von Gutschriften"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ vá» tÃ­n dá»¥ng"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Securepay GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ Thanh toÃ¡n an toÃ n"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr GebÃŒhren Sparkasse Internetkasse GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i lá» phÃ­ lá» phÃ­ Sparkasse Internetkasse"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr Skrill GebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ Skrill"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr SofortÃŒberweisungsgebÃŒhren"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i phÃ­ chuyá»n kháº©n cáº¥p"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Mehrwertsteuersatz fÃŒr GebÃŒhren der Selbstabholung"
-msgstr "Thuáº¿ suáº¥t thuáº¿ GTGT Äá»i vá»i lá» phÃ­ cá»§a Pickup"
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Es gibt keine alten MwSt. SÃ€tze zu migrieren."
-msgstr "KhÃŽng cÃ³ thuáº¿ GTGT cÅ©. Di chuyá»n cÃ¢u."
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Einstellungen der Versandzonen wurden erfolgreich gespeichert."
-msgstr "CÃ i Äáº·t cá»§a khu váº­n chuyá»n ÄÃ£ ÄÆ°á»£c lÆ°u thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "UnvollstÃ€ndige Bestellungen erfolgreich gelÃ¶scht."
-msgstr "ÄÆ¡n Äáº·t hÃ ng Äáº§y Äá»§ xÃ³a thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Bitte einen Namen fÃŒr das neue Land angeben."
-msgstr "Vui lÃ²ng Äáº·t tÃªn cho cÃ¡c quá»c gia má»i."
-
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Land wurde erfolgreich gespeichert."
-msgstr "Äáº¥t nÆ°á»c cho Äáº¿n nay."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "EU-LÃ€nder erfolgreich importiert."
-msgstr "cÃ¡c nÆ°á»c EU nháº­p thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "LÃ€nder erfolgreich importiert."
-msgstr "NÆ°á»c nháº­p kháº©u thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "EU"
-msgstr "EU"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Inland"
-msgstr "ná»i Äá»a"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "EU LÃ€nder"
-msgstr "cÃ¡c nÆ°á»c EU"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Ausland"
-msgstr "nÆ°á»c ngoÃ i"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Kundenvoreinstellungen erfolgreich gespeichert."
-msgstr "Sá» thÃ­ch cá»§a khÃ¡ch hÃ ng lÆ°u thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Widerrufsformular erfolgreich hochgeladen."
-msgstr "hÃ¬nh thá»©c rÃºt táº£i lÃªn thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Widerruf erfolgreich gespeichert."
-msgstr "Thu há»i lÆ°u thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Widerrufsformular erfolgreich generiert."
-msgstr "hÃ¬nh thá»©c rÃºt táº¡o ra thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Widerrufsformular erfolgreich gelÃ¶scht."
-msgstr "hÃ¬nh thá»©c rÃºt xÃ³a thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Widerrufsformular konnte nicht gelÃ¶scht werden."
-msgstr "hÃ¬nh thá»©c rÃºt khÃŽng thá» bá» xÃ³a."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Refresh der News konnte nicht durchgefÃŒhrt."
-msgstr "LÃ m má»i tin tá»©c khÃŽng thá» ÄÆ°á»£c thá»±c hiá»n."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Refresh der News erfolgreich durchgefÃŒhrt."
-msgstr "LÃ m má»i tin thÃ nh cÃŽng."
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "News wurde nicht gefunden,"
-msgstr "Tin tá»©c khÃŽng tÃ¬m tháº¥y,"
-
-#: ../controller/wpsg_AdminController.class.php:54 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:49 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:65 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:77
-msgid "Immer anzeigen"
-msgstr "luÃŽn Hiá»n thá»"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Anhand des Apache Moduls mod_geoip"
-msgstr "Dá»±a trÃªn cÃ¡c mÃŽ-Äun mod_geoip Apache"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Anhand der PECL Erweiterung php_geoip"
-msgstr "php_geoip Vá»i sá»± má» rá»ng PECL"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Anhand der Browsersprache"
-msgstr "Vá»i ngÃŽn ngá»¯ trÃ¬nh duyá»t"
-
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "nicht anzeigen"
-msgstr "khÃŽng hiá»n thá»"
-
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../lib/wpsg_basket_widget.class.php:6 ../views/admin/seiten.phtml:28
-msgid "Anfrageliste"
-msgstr "danh sÃ¡ch yÃªu cáº§u"
-
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Es wurden alle Plugins bis auf wpShopGermany deaktiviert."
-msgstr "NÃ³ táº¥t cáº£ cÃ¡c plugin ÄÃ£ ÄÆ°á»£c vÃŽ hiá»u hÃ³a cho Äáº¿n khi wpShopGermany."
-
-#: ../controller/wpsg_AdminController.class.php:68
-msgid ""
-"Plugins konnten nicht wieder hergestellt werden, da nicht gespeichert wurde "
-"welche Plugins aktiv waren."
-msgstr ""
-"Plugins khÃŽng thá» ÄÆ°á»£c phá»¥c há»i bá»i vÃ¬ nÃ³ ÄÃ£ khÃŽng ÄÆ°á»£c lÆ°u nhá»¯ng gÃ¬ cÃ¡c "
-"plugin Äang hoáº¡t Äá»ng."
-
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Aktivierte Plugins wurden erfolgreich wieder hergesetellt."
-msgstr "plugins kÃ­ch hoáº¡t ÄÃ£ thÃ nh cÃŽng hergesetellt má»t láº§n ná»¯a."
-
-#: ../controller/wpsg_OrderController.class.php:16
-msgid ""
-"URL Benachrichtigung (Kauf) wurde fÃŒr die Produkte der Bestellung simuliert."
-msgstr "ThÃŽng bÃ¡o URL (mua) ÄÆ°á»£c mÃŽ phá»ng cho cÃ¡c sáº£n pháº©m cá»§a tráº­t tá»±."
-
-#: ../controller/wpsg_OrderController.class.php:16
-msgid ""
-"URL Benachrichtigung (Bezahlung) wurde fÃŒr die Produkte der Bestellung "
-"simuliert."
-msgstr ""
-"ThÃŽng bÃ¡o URL (thanh toÃ¡n) ÄÃ£ ÄÆ°á»£c mÃŽ phá»ng cho cÃ¡c sáº£n pháº©m cá»§a tráº­t tá»±."
-
-#: ../controller/wpsg_OrderController.class.php:16
-msgid "Kundenmail wurde erfolgreich an #1# simuliert."
-msgstr "thÆ° cá»§a khÃ¡ch hÃ ng ÄÃ£ ÄÆ°á»£c mÃŽ phá»ng thÃ nh cÃŽng á» vá» trÃ­ # 1 #."
-
-#: ../controller/wpsg_OrderController.class.php:16
-msgid "Adminmail wurde erfolgreich an #1# simuliert."
-msgstr "email quáº£n trá» ÄÃ£ ÄÆ°á»£c mÃŽ phá»ng thÃ nh cÃŽng á» vá» trÃ­ # 1 #."
-
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../lib/wpsg_basket_widget.class.php:11 ../views/admin/seiten.phtml:34 
-#: ../views/warenkorb/index.phtml:114
-msgid "Online Streitbeilegung"
-msgstr "giáº£i quyáº¿t tranh cháº¥p trá»±c tuyáº¿n"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Klicken zum Aufklappen"
-msgstr "Nháº¥n vÃ o ÄÃ¢y Äá» ÄÃ³ng"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Klicken zum Einklappen"
-msgstr "Click Äá» gáº¥p"
-
-#: ../controller/wpsg_ShopController.class.php:11 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:535
-msgid "Bitte warten"
-msgstr "xin vui lÃ²ng chá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Weitere Angaben zum Produkt sind noch nÃ¶tig"
-msgstr "ThÃªm cÃ¡c chi tiáº¿t cá»§a sáº£n pháº©m váº«n cÃ²n cáº§n thiáº¿t"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Dieses Feld ist ein Pflichtfeld"
-msgstr "* TrÆ°á»ng nÃ y lÃ  báº¯t buá»c"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Bitte wÃ€hlen Sie eine Option"
-msgstr "* Vui lÃ²ng chá»n má»t tÃ¹y chá»n"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Mindestens "
-msgstr "* Ãt nháº¥t"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid " Zeichen benÃ¶tigt"
-msgstr "kÃœ tá»± cáº§n thiáº¿t"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Maximal"
-msgstr "* tá»i Äa"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* You must fill one of the following fields"
-msgstr "* Báº¡n pháº£i Äiá»n má»t trong nhá»¯ng lÄ©nh vá»±c sau ÄÃ¢y"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Mindeswert ist "
-msgstr "* GiÃ¡ trá» tá»i thiá»u lÃ "
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Maximalwert ist "
-msgstr "* GiÃ¡ trá» tá»i Äa"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Datum vor "
-msgstr "* NgÃ y trÆ°á»c"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Datum nach "
-msgstr "* NgÃ y Äáº¿n"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Maximale Anzahl Markierungen ÃŒberschritten"
-msgstr "vÆ°á»£t * dáº¥u tá»i Äa"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Bitte wÃ€hlen Sie "
-msgstr "* Vui lÃ²ng chá»n"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid " Optionen"
-msgstr "tÃ¹y chá»n"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Felder stimmen nicht ÃŒberein"
-msgstr "* LÄ©nh vá»±c khÃŽng phÃ¹ há»£p"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* UngÃŒltige Kreditkartennummer"
-msgstr "* UngÃŒltige Kreditkartennummer"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* UngÃŒltige Telefonnummer"
-msgstr "* Sá» Äiá»n thoáº¡i khÃŽng há»£p lá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* UngÃŒltige E-Mail Adresse"
-msgstr "* Äá»a chá» E-mail khÃŽng há»£p lá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Keine gÃŒltige Ganzzahl"
-msgstr "* KhÃŽng cÃ³ sá» nguyÃªn há»£p lá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Keine gÃŒltige FlieÃkommazahl"
-msgstr "* KhÃŽng pháº£i lÃ  má»t sá» dáº¥u cháº¥m Äá»ng há»£p lá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* UngÃŒltiges Datumsformat, erwartet wird das Format TT.MM.JJJJ"
-msgstr "* Äá»nh dáº¡ng ngÃ y thÃ¡ng há»£p lá», dá»± kiáº¿n ââcÃ¡c DD.MM.YYYY Äá»nh dáº¡ng"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* UngÃŒltige IP Adresse"
-msgstr "* Äá»a chá» IP khÃŽng há»£p lá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* UngÃŒltige URL"
-msgstr "* URL khÃŽng há»£p lá»"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Nur Buchstaben erlaubt"
-msgstr "cho phÃ©p * Chá» cÃ³ chá»¯"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Keine Sonderzeichen erlaubt"
-msgstr "* KhÃŽng cÃ³ kÃœ tá»± Äáº·c biá»t cho phÃ©p"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Dieser Benutzer ist bereits vergeben"
-msgstr "* NgÆ°á»i dÃ¹ng nÃ y ÄÃ£ ÄÆ°á»£c phÃ¢n cÃŽng"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* ÃberprÃŒfe Angaben, bitte warten"
-msgstr "* Kiá»m tra chi tiáº¿t, xin vui lÃ²ng chá» Äá»£i"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Dieser Name ist bereits vergeben"
-msgstr "* TÃªn nÃ y ÄÃ£ ÄÆ°á»£c sá»­"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Dieser Name ist verfÃŒgbar"
-msgstr "* TÃªn nÃ y hiá»n cÃ³ sáºµn"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Bitte HELLO eingeben"
-msgstr "* Vui lÃ²ng nháº­p Hello"
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "* Bitte geben Sie einen Vorname an."
-msgstr "* Vui lÃ²ng nháº­p má»t tÃªn Äáº§u tiÃªn."
-
-#: ../controller/wpsg_ShopController.class.php:11 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:28 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:24 
-#: ../views/warenkorb/checkout.phtml:30
-msgid "Dieses Feld ist ein Pflichtfeld."
-msgstr "TrÆ°á»ng nÃ y lÃ  má»t trÆ°á»ng báº¯t buá»c."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Bitte wÃ€hlen Sie eine Option."
-msgstr "Vui lÃ²ng chá»n má»t tÃ¹y chá»n."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "UngÃŒltige E-Mail Adresse."
-msgstr "Äá»a chá» e-mail khÃŽng há»£p lá»."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "UngÃŒltige URL."
-msgstr "URL khÃŽng há»£p lá»."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Format: TT.MM.JJJJ beachten."
-msgstr "Äá»nh dáº¡ng: DD.MM.YYYY lÆ°u Ãœ."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "UngÃŒltiges Datumsformat (ISO)."
-msgstr "Äá»nh dáº¡ng ngÃ y khÃŽng há»£p lá» (ISO)."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Keine gÃŒltige Ganzzahl."
-msgstr "KhÃŽng cÃ³ nguyÃªn há»£p lá»."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Keine gÃŒltige FlieÃkommazahl."
-msgstr "KhÃŽng cÃ³ con sá» ná»i-Äiá»m há»£p lá»."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "UngÃŒltige Kreditkartennummer."
-msgstr "sá» tháº» tÃ­n dá»¥ng há»£p lá»."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Felder stimmen nicht ÃŒberein."
-msgstr "Fields khÃŽng khá»p."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "MaximallÃ€nge ist {0}."
-msgstr "Chiá»u dÃ i tá»i Äa lÃ  {0}."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "MindestlÃ€nge ist {0} characters."
-msgstr "Chiá»u dÃ i tá»i thiá»u lÃ  {0} kÃœ tá»±."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Bitte geben Sie einen Wert zwischen {0} und {1} LÃ€nge ein."
-msgstr "Vui lÃ²ng nháº­p má»t giÃ¡ trá» giá»¯a {0} vÃ  {1} dÃ i."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Bitte geben Sie einen Wert zwischen {0} und {1} ein."
-msgstr "Vui lÃ²ng nháº­p má»t giÃ¡ trá» giá»¯a {0} vÃ  {1}."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Maximalwert {0}."
-msgstr "GiÃ¡ trá» tá»i Äa {0}."
-
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "Minimalwert {0}."
-msgstr "GiÃ¡ trá» tá»i thiá»u {0}."
-
-#: ../controller/wpsg_ShopController.class.php:25
-msgid "Produkt in den Warenkorb legen"
-msgstr "ThÃªm vÃ o giá» hÃ ng"
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "UnvollstÃ€ndig"
-msgstr "khÃŽng Äá»§"
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Sprachdatei konnte nicht geschrieben werden! Setzen Sie bitte Schreibrechte "
-"auf folgender Datei ÃŒberprÃŒfen:<br /><b>"
-msgstr ""
-"File ngÃŽn ngá»¯ khÃŽng thá» ÄÆ°á»£c viáº¿t! Xin vui lÃ²ng Äáº·t sÃ©c ghi truy cáº­p vÃ o cÃ¡c "
-"táº­p tin: <br /> <b>"
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Ihre Datenbankversion ist nicht auf dem aktuellen Stand, aktualisieren Sie "
-"die Datenbank, indem Sie <a href=\"#1#\">hier</a> klicken.<br />Klicken Sie "
-"<a href=\"#1#\">hier</a>, um die Meldung auszublenden."
-msgstr ""
-"phiÃªn báº£n cÆ¡ sá» dá»¯ liá»u cá»§a báº¡n khÃŽng ÄÆ°á»£c cáº­p nháº­t, cáº­p nháº­t cÆ¡ sá» dá»¯ liá»u "
-"báº±ng cÃ¡ch <a href=\"#1#\"> báº¥m vÃ o ÄÃ¢y mÃ£. <br /> Báº¥m vÃ o <a href=\"#1#\"> "
-"ÄÃ¢y mÃ£ Äá» che giáº¥u cÃ¡c tin nháº¯n."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Das fÃŒr wpShopGermany notwendige PHP-Modul cURL ist nicht geladen. Bitte "
-"kontaktieren Sie Ihren Provider."
-msgstr ""
-"Sá»± cáº§n thiáº¿t cho mÃŽ-Äun wpShopGermany PHP cURL khÃŽng ÄÆ°á»£c náº¡p. HÃ£y liÃªn há» "
-"vá»i nhÃ  cung cáº¥p cá»§a báº¡n."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Es wurde kein Standardland definiert, der Shop kann so nicht korrekt "
-"betrieben werden. Bitte ÃŒberprÃŒfen Sie die <a href=\"#1#\">"
-"LÃ€nderkonfiguration</a>."
-msgstr ""
-"NÃ³ ÄÃ£ xÃ¡c Äá»nh má»t tiÃªu chuáº©n quá»c gia, cÃ¡c cá»­a hÃ ng khÃŽng cÃ³ thá» ÄÆ°á»£c váº­n "
-"hÃ nh ÄÃºng nhÆ° tháº¿. Xin hÃ£y kiá»m tra mÃ£ <a cáº¥u hÃ¬nh Äáº¥t nÆ°á»c href=\"#1#\"> "
-"nÃ y."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. Eine "
-"Registrierung Ihrer Domain ist somit nicht mÃ¶glich! <br />Weitere "
-"Informationen finden Sie in unseren <a target=\"_blank\" href=\"http:"
-"//wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-"
-"meinem-server-aktiviert-sind/\">FAQ</a>. Klicken Sie <a href=\"#1#\">hier</a>"
-", um die Meldung auszublenden."
-msgstr ""
-"MÃ¡y chá»§ cá»§a báº¡n thiáº¿u cÃ¡c thÆ° viá»n PHP Äá» há» trá»£ SOAP. Má»t ÄÄng kÃœ tÃªn miá»n "
-"cá»§a báº¡n lÃ  khÃŽng thá»! <br /> thÃŽng tin thÃªm cÃ³ thá» ÄÆ°á»£c tÃ¬m tháº¥y trong <má»t "
-"má»¥c tiÃªu cá»§a chÃºng tÃŽi = \"_ blank\" href = \"http://wpshopgermany."
-"maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem- mÃ¡y chá»§ kÃ­ch "
-"hoáº¡t-lÃ  / \"> Há»i ÄÃ¡p mÃ£. Nháº¥n vÃ o <a Äang href=\"#1#\"> ÄÃ¢y Äá» áº©n cÃ¡c tin "
-"nháº¯n."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Bitte ÃŒberprÃŒfen Sie die <a href=\"#1#\">Seitenkonfiguration</a>. Die "
-"Warenkorbseite muss korrekt angegeben sein, sonst funktioniert der Shop "
-"nicht."
-msgstr ""
-"Xin hÃ£y kiá»m tra mÃ£ <a cáº¥u hÃ¬nh bÃªn href=\"#1#\"> nÃ y. CÃ¡c trang giá» mua "
-"hÃ ng pháº£i ÄÆ°á»£c xÃ¡c Äá»nh má»t cÃ¡ch chÃ­nh xÃ¡c, náº¿u khÃŽng cÃ¡c cá»­a hÃ ng khÃŽng "
-"hoáº¡t Äá»ng."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"<b>wpShopGermany:</b> Sprachdatei kann nicht geschrieben werden! PrÃŒfen Sie "
-"die Schreibrechte auf folgender Datei:<br /><b>"
-msgstr ""
-"<B> wpShopGermany: </ b> táº­p tin báº±ng giá»ng nÃ³i khÃŽng thá» ÄÆ°á»£c viáº¿t! Kiá»m "
-"tra cÃ¡c quyá»n ghi vÃ o táº­p tin: <br /> <b>"
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Es ist ein Anhang der Kundenmail definiert, die Datei wurde aber nicht "
-"gefunden. <a href=\"#1#\">Zur E-Mail Konfiguration</a>"
-msgstr ""
-"NÃ³ Äá»nh nghÄ©a má»t phá»¥ lá»¥c thÆ° cá»§a khÃ¡ch hÃ ng, cÃ¡c táº­p tin ÄÃ£ khÃŽng ÄÆ°á»£c tÃ¬m "
-"tháº¥y. <a Äang href=\"#1#\"> gá»­i email cho cáº¥u hÃ¬nh"
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Es existieren noch alte angepasste Templates unter #1#. Kopieren Sie diese "
-"bitte nach #2#. ZukÃŒnftig werden die Templateanpassungen nicht mehr im "
-"Pluginverzeichnis gesucht. Weitere Informationen erhalten Sie auch <a "
-"href=\"#3#\">hier</a> oder auch in unserem kostenlosen <a href=\"#4#\">"
-"Forum</a>."
-msgstr ""
-"KhÃŽng cÃ³ tÃ¹y chá»nh cÃ¡c máº«u cÅ© dÆ°á»i # 1 #. Sao chÃ©p chÃºng theo thá»© tá»± # 2 #. "
-"Trong tÆ°Æ¡ng lai Äiá»u chá»nh máº«u khÃŽng cÃ²n muá»n trong thÆ° má»¥c plugin. ThÃªm "
-"thÃŽng tin cÅ©ng cÃ³ sáºµn <a href=\"#3#\"> ÄÃ¢y </a> hoáº·c tháº­m chÃ­ trong <a miá»
-n "
-"phÃ­ cá»§a chÃºng tÃŽi href=\"#4#\"> diá»
-n ÄÃ n."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Sie haben die Angaben zum Shop noch nicht ausgefÃŒllt. Klicken sie <a "
-"href=\"#1#\">hier</a> um die Angaben zu vervollstÃ€ndigen."
-msgstr ""
-"Báº¡n cÃ³ nhá»¯ng thÃŽng tin khÃŽng Äáº§y ra Äáº¿n cá»­a hÃ ng. Nháº¥n vÃ o <a href=\"#1#\"> "
-"ÄÃ¢y mÃ£ nÃ y Äá» hoÃ n thÃ nh cÃ¡c chi tiáº¿t."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"Ab der wpShopGermany Version 3.4 kann das kostenlose Modul \"<a href=\"#1#\">"
-"Bestellbedingungen</a>\" verwendet werden. Sie kÃ¶nnen es <a href=\"#2#\">"
-"hier</a> konfigurieren. ÃberprÃŒfen Sie auch die anderen Ãnderungen, die wir "
-"<a href=\"#3#\">in unserem Artikel</a> nÃ€her erlÃ€utern."
-msgstr ""
-"Tá»« wpShopGermany Version 3.4 module miá»
-n phÃ­ \"<a Äá» href=\"#1#\"> Äiá»u kiá»n "
-"mÃ£\" cÃ³ thá» ÄÆ°á»£c sá»­ dá»¥ng. Báº¡n cÃ³ thá» cáº¥u hÃ¬nh mÃ£ <a nÃ y nÃ³ href=\"#2#\"> ÄÃ¢y."
-" NgoÃ i ra kiá»m tra cÃ¡c cháº¥t bá» sung khÃ¡c, ÄÆ°á»£c mÃŽ táº£ trong bÃ i viáº¿t <a Äang "
-"href=\"#3#\"> cá»§a chÃºng tÃŽi gáº§n gÅ©i hÆ¡n."
-
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Systemfehler! Fehlercode:#1#"
-msgstr "Lá»i há» thá»ng! Error code: # 1 #"
-
-#: ../controller/wpsg_ProduktController.class.php:31 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:53
-msgid "Keine Daten zum Exportieren vorhanden."
-msgstr "KhÃŽng cÃ³ dá»¯ liá»u Äá» xuáº¥t kháº©u."
-
-#: ../controller/wpsg_ProduktController.class.php:31
-msgid "Keine Datei zum Import angegeben."
-msgstr "KhÃŽng cÃ³ táº­p tin Äá» nháº­p Äá»nh."
-
-#: ../controller/wpsg_ProduktController.class.php:74
-msgid "Alle Produkte"
-msgstr "Táº¥t cáº£ sáº£n pháº©m"
-
-#: ../lib/helper_functions.inc.php:2
-msgid "Anhang hochgeladen."
-msgstr "Phá»¥ lá»¥c táº£i lÃªn."
-
-#: ../lib/helper_functions.inc.php:2
-msgid "Aktueller Anhang"
-msgstr "Ghi chÃº hiá»n táº¡i"
-
-#: ../lib/helper_functions.inc.php:2
-msgid "Datei entfernen"
-msgstr "Di chuyá»n táº­p tin"
-
-#: ../lib/helper_functions.inc.php:2
-msgid "Text unter der E-Mail"
-msgstr "TiÃªu Äá» cá»§a email"
-
-#: ../lib/wpsg_db.class.php:2
-msgid ""
-"Wordpress hat den generierten Query abgelehnt, vermutlich ist ein Template "
-"beschÃ€digt. (UngÃŒltiger Zeichensatz)"
-msgstr ""
-"WordPress ÄÃ£ tá»« chá»i cÃ¡c truy váº¥n ÄÆ°á»£c táº¡o ra, cÃ³ thá» lÃ  má»t máº«u lÃ  há»ng. "
-"(Bá» kÃœ tá»± khÃŽng há»£p lá»)"
-
-#: ../lib/update.php:2
-msgid ""
-"Die Produkttemplates \"standard2.phtml\" und \"standard_login.phtml\" wurden "
-"mit dem Update auf Version 3.2.0 entfernt. Die Konfiguration wurde "
-"automatisch angepasst.<br />Weitere Informationen erhalten Sie <a "
-"href=\"http://wpshopgermany.maennchen1.de/?p=3647\">hier</a>."
-msgstr ""
-"CÃ¡c máº«u sáº£n pháº©m \"standard2.phtml\" vÃ  \"standard_login.phtml\" ÄÃ£ ÄÆ°á»£c gá»¡ "
-"bá» vá»i báº£n cáº­p nháº­t lÃªn phiÃªn báº£n 3.2.0. CÃ¡c cáº¥u hÃ¬nh ÄÃ£ ÄÆ°á»£c Äiá»u chá»nh tá»± "
-"Äá»ng. <br /> Äá» biáº¿t thÃªm thÃŽng tin, <a Äang href=\"http://wpshopgermany."
-"maennchen1.de/?p=3647\"> ÄÃ¢y."
-
-#: ../lib/update.php:2
-msgid ""
-"Das Produkttemplate wurde mit dem Update auf 3.2.0 angepasst, bitte "
-"ÃŒberprÃŒfen Sie die Darstellung in Ihrem Shop."
-msgstr ""
-"CÃ¡c máº«u sáº£n pháº©m ÄÃ£ ÄÆ°á»£c Äiá»u chá»nh vá»i cÃ¡c báº£n cáº­p nháº­t Äá» 3.2.0, xin vui "
-"lÃ²ng kiá»m tra mÃ n hÃ¬nh hiá»n thá» trong cá»­a hÃ ng cá»§a báº¡n."
-
-#: ../lib/update.php:2
-msgid ""
-"Die MehrwertsteuersÃ€tze sind jetzt an die LÃ€nder gekoppelt. <a "
-"onclick=\"return confirm('Sind Sie sich sicher?');\" href=\"#1#\">"
-"Importieren</a> sie die Standardliste oder ÃŒberprÃŒfen sie die <a "
-"href=\"#2#\">LÃ€nderkonfiguration</h2>."
-msgstr ""
-"Thuáº¿ suáº¥t thuáº¿ GTGT hiá»n nay cÃ³ liÃªn quan Äáº¿n nÆ°á»c. <Má»t onclick = \"return "
-"confirm ( '? Báº¡n cÃ³ cháº¯c cháº¯n');\" href = \"# 1 #\"> Nháº­p há» mÃ£ danh sÃ¡ch "
-"máº·c Äá»nh hoáº·c kiá»m tra cáº¥u hÃ¬nh Äáº¥t nÆ°á»c <a href=\"#2#\"> </ h2>."
-
-#: ../lib/update.php:2
-msgid ""
-"Bitte ÃŒberprÃŒfen Sie die Konfiguration der Mehrwertsteuer in den Produkten "
-"und der Konfiguration. <a href=\"#1#\">Migrationsassistent starten</a>"
-msgstr ""
-"Vui lÃ²ng kiá»m tra cáº¥u hÃ¬nh cá»§a thuáº¿ GTGT trong cÃ¡c sáº£n pháº©m vÃ  cáº¥u hÃ¬nh. <a "
-"href=\"#1#\"> Migration Wizard báº¯t Äáº§u mÃ£"
-
-#: ../lib/wpsg_basket.class.php:2
-msgid ""
-"Das Produkt befindet sich bereits im Warenkorb, es kann nur einmal erworben "
-"werden."
-msgstr "Sáº£n pháº©m ÄÃ£ cÃ³ trong giá» hÃ ng, nÃ³ cÃ³ thá» ÄÆ°á»£c mua má»t láº§n."
-
-#: ../lib/wpsg_basket.class.php:15
-msgid ""
-"Lagerbestand hat sich zwischenzeitlich geÃ€ndert. Bitte Bestellung ÃŒberprÃŒfen."
-msgstr "Cá» ÄÃ£ thay Äá»i trong khi chá» Äá»£i. Vui lÃ²ng kiá»m tra ÄÆ¡n Äáº·t hÃ ng."
-
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte ÃŒberprÃŒfen Sie die Eingaben in der E-Mail BestÃ€tigung!"
-msgstr "Vui lÃ²ng kiá»m tra cÃ¡c má»¥c trong email xÃ¡c nháº­n!"
-
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte \"#1#\" akzeptieren!"
-msgstr "HÃ£y \"# 1 #\" cháº¥p nháº­n!"
-
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte eine Auswahl im Feld \"#1#\" treffen!"
-msgstr "\"# 1 #\" hÃ£y chá»n tá»« há»p!"
-
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte machen Sie in Feld \"#1#\" eine Angabe!"
-msgstr "Vui lÃ²ng cung cáº¥p trong lÄ©nh vá»±c nÃ y \"# 1 #\" má»t dáº¥u hiá»u!"
-
-#: ../lib/filter_functions.inc.php:1
-msgid "Lizenz herunterladen"
-msgstr "Giáº¥y phÃ©p táº£i vá»"
-
-#: ../lib/filter_functions.inc.php:1 ../views/admin/module.phtml:118
-msgid ""
-"<span style=\"color:red; font-weight:bold;\">wpShopGermany Vollversion "
-"erwerben und weitere Funktionen freischalten.</span> [ <a target=\"_blank\" "
-"href=\"#1#\">Vollversion kaufen</a> ] [ <a target=\"_blank\" href=\"#2#\">"
-"Weitere Infos</a> ]"
-msgstr ""
-"<span style = \"color: red; font-weight: bold;\">. WpShopGermany mua phiÃªn "
-"báº£n Äáº§y Äá»§ vÃ  má» khÃ³a cÃ¡c tÃ­nh nÄng bá» sung </ span> [<a target=\"_blank\" "
-"href=\"#1#\"> Mua Full Version </ a >] [<a target=\"_blank\" href=\"#2#\"> "
-"TÃ¬m hiá»u thÃªm mÃ£]"
-
-#: ../lib/filter_functions.inc.php:1
-msgid "wpShopGermany Debug"
-msgstr "wpShopGermany Debug"
-
-#: ../views/produkttemplates/ausverkauft.phtml:62 
-#: ../views/produkttemplates/standard.phtml:87 
-#: ../views/produkttemplates/standard_productindex.phtml:79 
-#: ../views/mods/mod_productindex/layouts/list.phtml:152 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:156
-msgid "#2# zzgl. #1#"
-msgstr "# 2 # cá»ng. # 1 #"
-
-#: ../views/produkttemplates/standard.phtml:59 
-#: ../views/produkttemplates/standard_productindex.phtml:51 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "EAN"
-msgstr "EAN"
-
-#: ../views/produkttemplates/standard.phtml:62 
-#: ../views/produkttemplates/standard_productindex.phtml:54 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "GTIN"
-msgstr "GTIN"
-
-#: ../views/produkttemplates/standard.phtml:79 
-#: ../views/produkttemplates/standard_productindex.phtml:71
-msgid "Originalpreis"
-msgstr "giÃ¡ gá»c"
-
-#: ../views/produkttemplates/standard.phtml:103
-msgid ""
-"Die Produktpreise werden nur eingeloggten Benutzern angezeigt. Loggen Sie "
-"sich <a href=\""
-msgstr ""
-"GiÃ¡ sáº£n pháº©m chá» ÄÆ°á»£c hiá»n thá» cho ngÆ°á»i dÃ¹ng ÄÄng nháº­p. ÄÄng nháº­p vÃ o <a "
-"href = \""
-
-#: ../views/produkttemplates/standard.phtml:125 
-#: ../views/produkttemplates/standard_productindex.phtml:117 
-#: ../views/mods/mod_productindex/layouts/list.phtml:122 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:141
-msgid "Lagerbestand: #1#"
-msgstr "Cá»: # 1 #"
-
-#: ../views/produkttemplates/standard.phtml:141 
-#: ../views/produkttemplates/standard_productindex.phtml:127
-msgid "Lieferzeit: #1#"
-msgstr "Thá»i gian giao hÃ ng: # 1 #"
-
-#: ../views/produkttemplates/standard.phtml:143 
-#: ../views/produkttemplates/standard_productindex.phtml:129
-msgid "Lieferzeit: sofort lieferbar"
-msgstr "Thá»i gian giao hÃ ng: cÃ³ sáºµn"
-
-#: ../views/produkttemplates/standard.phtml:150 
-#: ../views/mods/mod_deliverytime/basket_row.phtml:24 
-#: ../views/mods/mod_deliverytime/overview_row.phtml:24
-msgid ""
-"Aufgrund von #1# kann es zu VerzÃ¶gerungen von #2# Tage in der Zustellung "
-"kommen."
-msgstr ""
-"VÃ¬ # 1 # cÃ³ thá» cÃ³ má»t sá»± cháº­m trá»
- cá»§a 2 # # ngÃ y ká» tá»« ngÃ y giao hÃ ng."
-
-#: ../views/produkttemplates/standard.phtml:240 
-#: ../views/produkttemplates/standard_productindex.phtml:212
-msgid "Loggen Sie sich bitte ein, um zu bestellen"
-msgstr "HÃ£y ÄÄng nháº­p má»t hÃ¬nh thá»©c Äá» Äáº·t hÃ ng"
-
-#: ../views/produkttemplates/standard.phtml:246 
-#: ../views/produkttemplates/standard_productindex.phtml:217
-msgid "Auf die Anfrageliste"
-msgstr "ThÃªm vÃ o giá»"
-
-#: ../views/produkttemplates/standard_productindex.phtml:95
-msgid "Die Produktpreise werden nur eingeloggten Benutzern angezeigt"
-msgstr "GiÃ¡ sáº£n pháº©m chá» ÄÆ°á»£c hiá»n thá» cho ngÆ°á»i dÃ¹ng ÄÄng nháº­p"
-
-#: ../views/produkt/select_filter_productlist.phtml:11
-msgid "Keine Produkte gefunden"
-msgstr "KhÃŽng cÃ³ sáº£n pháº©m tÃ¬m tháº¥y"
-
-#: ../views/produkt/mapimport.phtml:11
-msgid "Produktimport Mapping"
-msgstr "Nháº­p Mapping sáº£n pháº©m"
-
-#: ../views/produkt/mapimport.phtml:21
-msgid ""
-"Ordnen Sie die Spalten der zu importierenden Daten dem jeweiligen "
-"Produktattribut (links) zu"
-msgstr "Sáº¯p xáº¿p cÃ¡c cá»t dá»¯ liá»u ÄÆ°á»£c nháº­p kháº©u má»i thuá»c tÃ­nh sáº£n pháº©m (trÃ¡i)"
-
-#: ../views/produkt/mapimport.phtml:23
-msgid "Nicht zugeordnete Felder werden beim Import nicht verÃ€ndert"
-msgstr "lÄ©nh vá»±c Unassigned khÃŽng bá» thay Äá»i trong quÃ¡ trÃ¬nh nháº­p kháº©u"
-
-#: ../views/produkt/mapimport.phtml:33
-msgid "unbekannte DatensÃ€tze als neue Produkte anlegen"
-msgstr "Táº¡o há» sÆ¡ khÃŽng rÃµ lÃ  sáº£n pháº©m má»i"
-
-#: ../views/produkt/mapimport.phtml:34
-msgid "Fehlende Preise berechnen?"
-msgstr "Thiáº¿u ngoáº·c kÃ©p?"
-
-#: ../views/produkt/mapimport.phtml:34
-msgid ""
-"Wenn nur der Brutto Preis angegeben wird, so wird der Netto Preis berechnet."
-msgstr "Náº¿u chá» cÃ³ giÃ¡ tá»ng ÄÆ°á»£c ÄÆ°a ra, giÃ¡ rÃ²ng ÄÆ°á»£c tÃ­nh."
-
-#: ../views/produkt/index.phtml:212
-msgid "Dieses Produkt im Frontend ansehen"
-msgstr "Xem sáº£n pháº©m nÃ y táº¡i cÃ¡c lá»i vÃ o"
-
-#: ../views/produkt/index.phtml:231
-msgid "Variantenbestand"
-msgstr "kiá»m kÃª mÃŽ táº£"
-
-#: ../views/produkt/import.phtml:11
-msgid "Produktverwaltung - Produktimport"
-msgstr "Quáº£n lÃœ sáº£n pháº©m - sáº£n pháº©m nháº­p kháº©u"
-
-#: ../views/produkt/addedit.phtml:127
-msgid ""
-"Bitte ÃŒberprÃŒfen Sie die rot markierten Felder. Ãnderungen in diesen Feldern "
-"gehen beim Speichern verloren."
-msgstr ""
-"Vui lÃ²ng kiá»m tra cÃ¡c lÄ©nh vá»±c ÄÆ°á»£c ÄÃ¡nh dáº¥u mÃ u Äá». Nhá»¯ng thay Äá»i trong "
-"cÃ¡c lÄ©nh vá»±c nÃ y bá» máº¥t khi báº¡n lÆ°u."
-
-#: ../views/produkt/addedit.phtml:183
-msgid "Steuergruppe"
-msgstr "nhÃ³m kiá»m soÃ¡t"
-
-#: ../views/produkt/addedit.phtml:211
-msgid "Produkt unterliegt den EU-Leistungsortregeln"
-msgstr "Äá»i tÆ°á»£ng sáº£n pháº©m sang thá» trÆ°á»ng EU Leistungsortregeln"
-
-#: ../views/produkt/addedit.phtml:218
-msgid "Erlaubte Zahlungsarten"
-msgstr "Thanh toÃ¡n cho phÃ©p"
-
-#: ../views/produkt/addedit.phtml:256
-msgid "Erlaubte Versandarten"
-msgstr "tÃ¹y chá»n Shipping phÃ©p"
-
-#: ../views/produkt/addedit.phtml:349
-msgid "Produkt ID"
-msgstr "ID sáº£n pháº©m"
-
-#: ../views/produkt/addedit.phtml:403
-msgid "Zugeordneter Wordpress Artikel"
-msgstr "má»¥c WordPress liÃªn quan"
-
-#: ../views/produkt/addedit.phtml:429
-msgid "Verhalten im Warenkorb"
-msgstr "HÃ nh vi trong giá» hÃ ng"
-
-#: ../views/produkt/addedit.phtml:430
-msgid "Nur einmal mit beliebiger Menge (Standard)"
-msgstr "Chá» cÃ³ má»t láº§n vá»i sá» lÆ°á»£ng báº¥t ká»³ (Standard)"
-
-#: ../views/produkt/addedit.phtml:431
-msgid "Nur einmal mit Menge 1"
-msgstr "Chá» cÃ³ má»t láº§n vá»i Táº­p 1"
-
-#: ../views/produkt/addedit.phtml:432
-msgid "Mehrfach mit beliebiger Menge"
-msgstr "Nhiá»u sá» lÆ°á»£ng tÃ¹y Ãœ"
-
-#: ../views/produkt/addedit.phtml:433
-msgid "Mehrfach mit Menge 1"
-msgstr "Nhiá»u vá»i Táº­p 1"
-
-#: ../views/produkt/addedit.phtml:440
-msgid "URL"
-msgstr "URL"
-
-#: ../views/produkt/select_filter.phtml:13
-msgid "Suchen"
-msgstr "tÃ¬m kiáº¿m"
-
-#: ../views/mailtemplates/status.phtml:19 
-#: ../views/mailtemplates/kundenmail.phtml:107 
-#: ../views/mailtemplates/html/status.phtml:23 
-#: ../views/mailtemplates/html/kundenmail.phtml:44 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:47 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:149 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:21 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:16 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:15 
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:26 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:19 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:20 
-#: ../views/mods/mod_kundenverwaltung/mail_activate.phtml:14 
-#: ../views/mods/mod_kundenverwaltung/mail_activate_html.phtml:14 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:61 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:15 
-#: ../views/mods/mod_trustedshops/mail_html.phtml:17 
-#: ../views/mods/mod_trustedshops/mail.phtml:15 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:35
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:30 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:30 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:34
-msgid "Team"
-msgstr "Äá»i"
-
-#: ../views/mailtemplates/kundenmail.phtml:13
-msgid "vielen Dank fÃŒr Ihre Bestellung."
-msgstr "Cáº£m Æ¡n báº¡n ÄÃ£ Äáº·t hÃ ng."
-
-#: ../views/mailtemplates/order.phtml:24 
-#: ../views/mailtemplates/html/order.phtml:54 ../views/order/view.phtml:454
-msgid "MÃ¶gliche Versandarten"
-msgstr "phÆ°Æ¡ng phÃ¡p giao hÃ ng cÃ³ thá»"
-
-#: ../views/mailtemplates/order.phtml:104
-msgid "Gesamtpreis:"
-msgstr "Tá»ng giÃ¡:"
-
-#: ../views/mailtemplates/html/adminmail.phtml:10
-msgid "Eine neue Bestellung ist im Online-Shop eingegangen!"
-msgstr "Má»t tráº­t tá»± má»i ÄÃ£ ÄÆ°á»£c nháº­n ÄÆ°á»£c trong cÃ¡c cá»­a hÃ ng trá»±c tuyáº¿n!"
-
-#: ../views/mailtemplates/html/customer.phtml:71
-msgid "Rechnungs- /Lieferadresse"
-msgstr "Thanh toÃ¡n / Äá»a chá» giao hÃ ng"
-
-#: ../views/mailtemplates/html/customer.phtml:153
-msgid "Versand- und Lieferart"
-msgstr "Váº­n chuyá»n vÃ  giao hÃ ng"
-
-#: ../views/mailtemplates/html/kundenmail.phtml:28 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:34
-msgid ""
-"Es gelten unsere <a href=\"#1#\">Allgemeinen Geschaeftsbedingungen</a> (<a "
-"href=\"#1#\">AGB</a>)."
-msgstr ""
-"ChÃºng tÃŽi tham kháº£o <a href=\"#1#\"> Äiá»u kiá»n kinh doanh nÃ³i chung mÃ£ cá»§a "
-"chÃºng tÃŽi (<a href=\"#1#\"> Äiá»u kiá»n code)."
-
-#: ../views/mailtemplates/html/order.phtml:90
-msgid "Zwischensumme"
-msgstr "tá»ng phá»¥"
-
-#: ../views/mailtemplates/html/order.phtml:139
-msgid "Zahlungskosten"
-msgstr "chi phÃ­ thanh toÃ¡n"
-
-#: ../views/admin/customerpreset.phtml:27
-msgid "Standard Versandart"
-msgstr "phÃ¢n phá»i tiÃªu chuáº©n"
-
-#: ../views/admin/customerpreset.phtml:28
-msgid "Standard Zahlungsart"
-msgstr "thanh toÃ¡n tiÃªu chuáº©n"
-
-#: ../views/admin/customerpreset.phtml:29 ../views/admin/laender_edit.phtml:17 
-#: ../views/admin/migratemwst.phtml:10
-msgid "Standardland"
-msgstr "tiÃªu chuáº©n quá»c gia"
-
-#: ../views/admin/customerpreset.phtml:30
-msgid ""
-"Die LÃ€nder kÃ¶nnen in der <a href=\"#1#\">LÃ€nderverwaltung</a> definiert "
-"werden."
-msgstr ""
-"CÃ¡c nÆ°á»c cÃ³ thá» ÄÆ°á»£c Äá»nh nghÄ©a mÃ£ trong <a nÆ°á»c href=\"#1#\"> "
-"Administration."
-
-#: ../views/admin/customerpreset.phtml:32
-msgid "Standardanrede"
-msgstr "Tá»±a Äá» chuáº©n"
-
-#: ../views/admin/customerpreset.phtml:33
-msgid ""
-"Die Auswahl kann in den <a href=\"#1#\">Kundendaten</a> definiert werden."
-msgstr ""
-"Viá»c lá»±a chá»n cÃ³ thá» ÄÆ°á»£c Äá»nh nghÄ©a mÃ£ trong dá»¯ liá»u khÃ¡ch hÃ ng <a "
-"href=\"#1#\">."
-
-#: ../views/admin/kundendaten_tab2.phtml:54
-msgid "Index"
-msgstr "má»¥c lá»¥c"
-
-#: ../views/admin/emailconf.phtml:34
-msgid "HTML Mails versenden"
-msgstr "Gá»­i mail HTML"
-
-#: ../views/admin/emailconf.phtml:43
-msgid ""
-"Werden keine Angaben fÃŒr die folgenden E-Mails gemacht, so gelten die "
-"globalen Angaben."
-msgstr ""
-"Trá»« khi ÄÆ°á»£c chá» Äá»nh cho cÃ¡c e-mail sau ÄÃ¢y ÄÆ°á»£c thá»±c hiá»n, cÃ¡c dá»¯ liá»u "
-"toÃ n cáº§u cÃ³ giÃ¡ trá»."
-
-#: ../views/admin/emailconf.phtml:67
-msgid ""
-"Klicken Sie auf die jeweilige Mail um die Einstellungen angezeigt zu "
-"bekommen bzw. zu Ã€ndern."
-msgstr ""
-"Nháº¥p vÃ o email tÆ°Æ¡ng á»©ng vá»i cÃ¡c thiáº¿t láº­p xuáº¥t hiá»n Äá» cÃ³ ÄÆ°á»£c hoáº·c thay "
-"Äá»i."
-
-#: ../views/admin/versandzonen.phtml:81
-msgid ""
-"Sind Sie sich sicher, dass sie die Standard Versandzonen und LÃ€nder laden "
-"mÃ¶chten? Die alten Versandzonen und LÃ€nder gehen verloren."
-msgstr ""
-"Báº¡n cÃ³ cháº¯c cháº¯n muá»n táº£i cÃ¡c khu giao hÃ ng máº·c Äá»nh vÃ  cÃ¡c quá»c gia? CÃ¡c "
-"khu váº­n chuyá»n cÅ© vÃ  cÃ¡c nÆ°á»c sáºœ bá» máº¥t."
-
-#: ../views/admin/hilfe.phtml:79
-msgid "Migration der alten MehrwertsteuersÃ€tze"
-msgstr "Di cÆ° cá»§a thuáº¿ suáº¥t thuáº¿ GTGT cÅ©"
-
-#: ../views/admin/hilfe.phtml:81
-msgid ""
-"Ab Version 3.5 wurden die MehrwertsteuersÃ€tze den LÃ€ndern zugeordnet. Die "
-"alten MehrwertsteuersÃ€tze kÃ¶nnen <a href=\"#1#\">hier</a> umgewandelt werden."
-msgstr ""
-"Báº¯t Äáº§u vá»i phiÃªn báº£n 3.5, má»©c thuáº¿ GTGT ÄÆ°á»£c phÃ¢n bá» cho cÃ¡c nÆ°á»c. Thuáº¿ "
-"suáº¥t thuáº¿ GTGT cÅ© cÃ³ thá» ÄÆ°á»£c <a href=\"#1#\"> chuyá»n Äá»i mÃ£ á» ÄÃ¢y."
-
-#: ../views/admin/laender_edit.phtml:5 ../views/admin/laender.phtml:39
-msgid "LÃ€ndername"
-msgstr "tÃªn nÆ°á»c"
-
-#: ../views/admin/laender_edit.phtml:8
-msgid "MwSt. Grundlage"
-msgstr "Thuáº¿ GTGT. Dá»±a"
-
-#: ../views/admin/laender_edit.phtml:13
-msgid "MwSt. Satz A (stark ermÃ€Ãigter Satz)"
-msgstr "VAT. Má»t bá» (tá»· lá» siÃªu giáº£m)"
-
-#: ../views/admin/laender_edit.phtml:14
-msgid "MwSt. Satz B (ermÃ€Ãigter Satz)"
-msgstr "Set B (tá»· lá» giáº£m) thuáº¿ GTGT."
-
-#: ../views/admin/laender_edit.phtml:15
-msgid "MwSt. Satz C (Normalsatz)"
-msgstr "Thuáº¿ GTGT. Äáº·t C (tá»· lá» tiÃªu chuáº©n)"
-
-#: ../views/admin/laender_edit.phtml:16
-msgid "MwSt. Satz D (Zwischensatz)"
-msgstr "Thuáº¿ GTGT. Äáº·t D (Interlude)"
-
-#: ../views/admin/index.phtml:26
-msgid "Aktuelles"
-msgstr "tin tá»©c"
-
-#: ../views/admin/includes.phtml:26
-msgid "Shop CSS styles nicht einbinden"
-msgstr "phong cÃ¡ch cá»­a hÃ ng CSS khÃŽng nhÃºng"
-
-#: ../views/admin/module.phtml:114 ../views/mods/mod_core/module_index.phtml:10
-msgid "Modulverwaltung"
-msgstr "quáº£n lÃœ module"
-
-#: ../views/admin/module.phtml:115
-msgid ""
-"wpShopGermany ist Modular aufgebaut, wÃ€hlen Sie links das Modul aus, welches "
-"Sie konfigurieren mÃ¶chten. "
-msgstr ""
-"Thiáº¿t káº¿ mÃŽ Äun wpShopGermany cá»§a, chá»n trÃ¡i tá»« cÃ¡c mÃŽ-Äun mÃ  báº¡n muá»n cáº¥u "
-"hÃ¬nh."
-
-#: ../views/admin/versandzonen_list.phtml:14
-msgid "Inner- gemeinschaftlich"
-msgstr "trong táº­p thá»"
-
-#: ../views/admin/versandzonen_list.phtml:34
-msgid "Versandzonen PLZ bearbeiten"
-msgstr "khu Sá»­a váº­n chuyá»n Zip"
-
-#: ../views/admin/konfiguration.phtml:72
-msgid ""
-"<span style=\"color:red; font-weight:bold;\">Weitere Funktionen in der "
-"Vollversion.</span><br />[ <a target=\"_blank\" href=\"#1#\">Vollversion "
-"kaufen</a> ] [ <a target=\"_blank\" href=\"#2#\">Weitere Infos</a> ]"
-msgstr ""
-"<span style = \"color: red; font-weight: bold;\">. CÃ¡c tÃ­nh nÄng khÃ¡c trong "
-"phiÃªn báº£n Äáº§y Äá»§ </ span> <br /> [<a target=\"_blank\" href=\"#1#\"> Mua "
-"Full Version < / a>] [<a target=\"_blank\" href=\"#2#\"> TÃ¬m hiá»u thÃªm mÃ£]"
-
-#: ../views/admin/konfiguration.phtml:118
-msgid "Standardsprache (Backend)"
-msgstr "TiÃªu chuáº©n ngÃŽn ngá»¯ (trá» láº¡i)"
-
-#: ../views/admin/konfiguration.phtml:133
-msgid "UnvollstÃ€ndige Best. in Bestellverwaltung anzeigen"
-msgstr "Hiá»n chÆ°a hoÃ n chá»nh nháº¥t. Trong quáº£n lÃœ thá»© tá»±"
-
-#: ../views/admin/konfiguration.phtml:136
-msgid "Auf Seite bleiben mit Lightbox Meldung"
-msgstr "TrÃªn trang láº¡i vá»i thÃŽng Äiá»p há»p ÄÃšn"
-
-#: ../views/admin/konfiguration.phtml:137
-msgid "Auf Seite bleiben ohne Lightbox Meldung"
-msgstr "TrÃªn trang váº«n khÃŽng nháº¯n há»p ÄÃšn"
-
-#: ../views/admin/konfiguration.phtml:140
-msgid "Lightbox Meldung"
-msgstr "nháº¯n há»p ÄÃšn"
-
-#: ../views/admin/konfiguration.phtml:142
-msgid "Auswahl der Zahlung/Versandart ÃŒberspringen wenn mÃ¶glich"
-msgstr "Lá»±a chá»n thanh toÃ¡n / giao hÃ ng bá» qua náº¿u cÃ³ thá»"
-
-#: ../views/admin/konfiguration.phtml:148
-msgid "Sortierung Kundennummer (Backend)"
-msgstr "ID Order (backend)"
-
-#: ../views/admin/konfiguration.phtml:148
-msgid "Numerisch"
-msgstr "sá»"
-
-#: ../views/admin/deinstall.phtml:39
-msgid "UnvollstÃ€ndige Bestellungen (#1# DatensÃ€tze)"
-msgstr "ÄÆ¡n Äáº·t hÃ ng Äáº§y Äá»§ (# 1 # há» sÆ¡)"
-
-#: ../views/admin/presentation.phtml:27
-msgid "Artikelnummer im Produkttemplate anzeigen"
-msgstr "Xem sá» má»¥c trong máº«u sáº£n pháº©m"
-
-#: ../views/admin/presentation.phtml:28
-msgid "Formular Validierung"
-msgstr "hÃ¬nh thá»©c xÃ¡c nháº­n"
-
-#: ../views/admin/presentation.phtml:29
-msgid "Serverseitig"
-msgstr "Server-side "
-
-#: ../views/admin/presentation.phtml:30
-msgid "Serverseitig + Javascript V1"
-msgstr "Server-side JavaScript + V1"
-
-#: ../views/admin/presentation.phtml:31
-msgid "Serverseitig + Javascript V2"
-msgstr "Server-side JavaScript + V2"
-
-#: ../views/admin/presentation.phtml:33
-msgid "LÃ€nderauswahl im Warenkorb verbergen"
-msgstr "giáº¥u nÆ°á»c trong giá» hÃ ng"
-
-#: ../views/admin/ueber.phtml:8
-msgid "Systemcheck"
-msgstr "kiá»m tra há» thá»ng"
-
-#: ../views/admin/ueber.phtml:12
-msgid "Template Pfad:"
-msgstr "con ÄÆ°á»ng máº«u:"
-
-#: ../views/admin/ueber.phtml:22
-msgid "Sprachdatei:"
-msgstr "táº­p tin ngÃŽn ngá»¯"
-
-#: ../views/admin/ueber.phtml:48
-msgid "cURL verfÃŒgbar"
-msgstr "cURL sáºµn"
-
-#: ../views/admin/ueber.phtml:54
-msgid "aktive Wordpress Plugins"
-msgstr "hoáº¡t Äá»ng WordPress Plugins"
-
-#: ../views/admin/ueber.phtml:66
-msgid "Vormals aktivierte Module wieder herstellen aus KompatibilitÃ€tstest"
-msgstr "module trÆ°á»c ÄÃ¢y vá»n ÄÃ£ phá»¥c nguyÃªn tÆ°Æ¡ng thÃ­ch thá»­ nghiá»m"
-
-#: ../views/admin/ueber.phtml:68
-msgid "Alle Plugins auÃer wpShopGermany deaktivieren (KompatibilitÃ€tstest)"
-msgstr ""
-"Táº¥t cáº£ cÃ¡c plugin trá»« wpShopGermany vÃŽ hiá»u hÃ³a (kiá»m tra kháº£ nÄng tÆ°Æ¡ng "
-"thÃ­ch)"
-
-#: ../views/admin/blognetzwerk.phtml:34
-msgid "Session auf Verzeichnis einschrÃ€nken"
-msgstr "Giá»i háº¡n phiÃªn vÃ o thÆ° má»¥c"
-
-#: ../views/admin/widerrufsbelehrung.phtml:29
-msgid ""
-"Das Template fÃŒr die Mail finden Sie unter: <b>"
-"views/mailtemplates/kundenmail.phtml</b> bzw. <b>"
-"views/mailtemplates/html/kundenmail.phtml</b>."
-msgstr ""
-"CÃ¡c máº«u cho cÃ¡c mail cÃ³ thá» ÄÆ°á»£c tÃ¬m tháº¥y táº¡i: <b> views / email templates / "
-"kundenmail.phtml </ b> hoáº·c <b> views / email templates / html / kundenmail."
-"phtml </ b>."
-
-#: ../views/admin/widerrufsbelehrung.phtml:32
-msgid "Widerrufsformular"
-msgstr "hÃ¬nh thá»©c rÃºt"
-
-#: ../views/admin/widerrufsbelehrung.phtml:41
-msgid "Sind Sie sich sicher, dass Sie das Widerrufsformular lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xÃ³a cÃ¡c hÃ¬nh thá»©c rÃºt tiá»n?"
-
-#: ../views/admin/widerrufsbelehrung.phtml:41
-msgid "Widerrufsformular lÃ¶schen"
-msgstr "hÃ¬nh thá»©c rÃºt rÃµ rÃ ng"
-
-#: ../views/admin/widerrufsbelehrung.phtml:45
-msgid "Bisher wurde kein Widerrufsformular hinterlegt."
-msgstr "Cho Äáº¿n nay, khÃŽng cÃ³ hÃ¬nh thá»©c thu há»i ÄÃ£ ÄÆ°á»£c gá»­i."
-
-#: ../views/admin/widerrufsbelehrung.phtml:51
-msgid "Standardformular aus Shopinfo erstellen"
-msgstr "Táº¡o má»t tiÃªu chuáº©n hÃ¬nh thá»©c thÃŽng tin cá»­a hÃ ng"
-
-#: ../views/admin/widerrufsbelehrung.phtml:58
-msgid "Anhang an BestellbestÃ€tigung"
-msgstr "Táº¡o má»t hÃ¬nh thá»©c tiÃªu chuáº©n Äá» Shanhang BestellbestÃ€tigungopinfo"
-
-#: ../views/admin/widerrufsbelehrung.phtml:61
-msgid "Anhang an Rechnung"
-msgstr "Phá»¥ lá»¥c cá»§a bÃ¡o cÃ¡o"
-
-#: ../views/admin/widerrufsbelehrung.phtml:65
-msgid "Anhang an AuftragsbestÃ€tigung"
-msgstr "Phá»¥ lá»¥c Äá» Äáº·t hÃ ng Chá»©ng nháº­n"
-
-#: ../views/admin/migratemwst.phtml:16
-msgid "Produkte im Datenbestand"
-msgstr "CÃ¡c sáº£n pháº©m trong bá» dá»¯ liá»u"
-
-#: ../views/admin/migratemwst.phtml:21
-msgid "#1# Produkte mit #2# Mehrwertsteuer (#3#)"
-msgstr "# 1 # 2 # # sáº£n pháº©m cÃ³ thuáº¿ giÃ¡ trá» gia tÄng (# 3 #)"
-
-#: ../views/admin/migratemwst.phtml:23
-msgid "#1# Produkte mit ungÃŒltigem Steuersatz"
-msgstr "# 1 # Sáº£n pháº©m cÃ³ má»©c thuáº¿ khÃŽng há»£p lá»"
-
-#: ../views/admin/migratemwst.phtml:28
-msgid ""
-"Keine Produkte die noch keiner Mehrwertsteuergruppe zugewiesen wurden im "
-"Datenbestand."
-msgstr ""
-"KhÃŽng cÃ³ sáº£n pháº©m váº«n khÃŽng cÃ³ nhÃ³m thuáº¿ GTGT ÄÃ£ ÄÆ°á»£c giao cho cÃ¡c táº­p dá»¯ "
-"liá»u."
-
-#: ../views/admin/migratemwst.phtml:32
-msgid "Modulkonfigurationen"
-msgstr "cáº¥u hÃ¬nh mÃŽ-Äun"
-
-#: ../views/admin/migratemwst.phtml:60
-msgid "MehrwertsteuersÃ€tze zuweisen"
-msgstr "GÃ¡n thuáº¿ suáº¥t thuáº¿ GTGT"
-
-#: ../views/admin/news.phtml:21
-msgid "gelesen"
-msgstr "Äá»c"
-
-#: ../views/admin/news.phtml:33
-msgid "Derzeit stehen keine News zum Lesen bereit."
-msgstr "ChÆ°a cÃ³ tin tá»©c cÃ³ sáºµn Äá» Äá»c."
-
-#: ../views/admin/news.phtml:39
-msgid "Letzte Aktualisierung: #1# [<a href=\"#2#\">Aktualisieren</a>]"
-msgstr "Cáº­p nháº­t láº§n cuá»i: # 1 # [<a Äang href=\"#2#\"> LÃ m má»i]"
-
-#: ../views/admin/extended.phtml:31
-msgid "Beta Updates laden"
-msgstr "Táº£i Beta cáº­p nháº­t"
-
-#: ../views/admin/extended.phtml:41
-msgid "wpautop deaktivieren"
-msgstr "vÃŽ hiá»u hÃ³a wpautop"
-
-#: ../views/admin/extended.phtml:42
-msgid "wp_trim_excerpt nicht verwenden"
-msgstr "wp_trim_excerpt khÃŽng sá»­ dá»¥ng"
-
-#: ../views/admin/extended.phtml:43
-msgid "Bestellungen nicht mit LOCK TABLES verarbeiten"
-msgstr "khÃŽng xá»­ lÃœ ÄÆ¡n Äáº·t hÃ ng vá»i Báº¢NG KHÃA"
-
-#: ../views/admin/extended.phtml:44
-msgid "[raw] und [/raw] um Templates ausgeben (Frontend)"
-msgstr "[Raw] vÃ  [/ raw] dÃ nh máº«u (káº¿t thÃºc trÆ°á»c)"
-
-#: ../views/admin/extended.phtml:45
-msgid "Cachen von dynamischen Shopseiten verhindern"
-msgstr "ngÄn cháº·n bá» nhá» Äá»m cá»§a trang cá»­a hÃ ng nÄng Äá»ng"
-
-#: ../views/admin/extended.phtml:46
-msgid "MAC KompatibilitÃ€t bei Dateiimporten"
-msgstr "kháº£ nÄng tÆ°Æ¡ng thÃ­ch vá»i MAC nháº­p kháº©u táº­p tin"
-
-#: ../views/admin/extended.phtml:47
-msgid "Abfrage des Kundenstandortes (EU-Leistungsortregel)"
-msgstr "Truy váº¥n cÆ¡ sá» cá»§a khÃ¡ch hÃ ng (EU Leistungsortregel)"
-
-#: ../views/admin/extended.phtml:48
-msgid "Verify Peer deaktivieren"
-msgstr "vÃŽ hiá»u hÃ³a XÃ¡c Peer"
-
-#: ../views/admin/shopdata.phtml:26
-msgid "Name des Shops / Firma"
-msgstr "Cá»­a hÃ ng / TÃªn cÃŽng ty"
-
-#: ../views/admin/shopdata.phtml:27
-msgid "Inhaber des Shops"
-msgstr "chá»§ cá»­a hÃ ng"
-
-#: ../views/admin/shopdata.phtml:28
-msgid "Telefonnummer"
-msgstr "sá» Äiá»n thoáº¡i"
-
-#: ../views/admin/shopdata.phtml:31
-msgid "Steuernummer"
-msgstr "sá» thuáº¿"
-
-#: ../views/admin/shopdata.phtml:32
-msgid "USt-IdNr."
-msgstr "VAT Reg."
-
-#: ../views/admin/shopdata.phtml:40
-msgid "Bankdaten"
-msgstr "NgÃ¢n hÃ ng dá»¯ liá»u"
-
-#: ../views/admin/shopdata.phtml:44
-msgid "IBAN Nummer"
-msgstr "sá» IBAN"
-
-#: ../views/admin/shopdata.phtml:45
-msgid "BIC Nummer"
-msgstr "sá» BIC"
-
-#: ../views/admin/laender.phtml:28
-msgid "Neues Land hinzufÃŒgen"
-msgstr "ThÃªm má»t quá»c gia má»i"
-
-#: ../views/admin/laender.phtml:34
-msgid "Bestehende LÃ€nder"
-msgstr "nÆ°á»c hiá»n cÃ³"
-
-#: ../views/admin/laender.phtml:42
-msgid "MwSt. A"
-msgstr "Thuáº¿ GTGT. A"
-
-#: ../views/admin/laender.phtml:43
-msgid "MwSt. B"
-msgstr "Thuáº¿ GTGT. B"
-
-#: ../views/admin/laender.phtml:44
-msgid "MwSt. C"
-msgstr "Thuáº¿ GTGT. C"
-
-#: ../views/admin/laender.phtml:45
-msgid "MwSt. D"
-msgstr "Thuáº¿ GTGT. D"
-
-#: ../views/admin/laender.phtml:95
-msgid "Noch keine LÃ€nder angelegt."
-msgstr "KhÃŽng cÃ³ quá»c gia Ã¡p dá»¥ng."
-
-#: ../views/admin/laender.phtml:100
-msgid "StandardlÃ€nder importieren"
-msgstr "CÃ¡c quá»c gia tiÃªu chuáº©n nháº­p kháº©u"
-
-#: ../views/admin/laender.phtml:101
-msgid "Standard EU-LÃ€nder importieren"
-msgstr "Nháº­p cÃ¡c nÆ°á»c tiÃªu chuáº©n EU"
-
-#: ../views/admin/laender.phtml:110 ../views/admin/laender.phtml:121
-msgid "Sind sie sich sicher ?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n?"
-
-#: ../views/admin/kundendaten_tab1.phtml:79 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:180 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:175
-msgid "E-Mail Adresse (Wiederholung)"
-msgstr "Äá»a chá» Email (láº·p láº¡i)"
-
-#: ../views/admin/musterwiderruf.pdf.phtml:37
-msgid ""
-"Hiermit widerrufe(n) ich/wir (*) den von mir/uns (*) abgeschlossenen Vertrag "
-"ÃŒber den Kauf"
-msgstr ""
-"DÆ°á»i ÄÃ¢y ÄÆ°a ra thÃŽng bÃ¡o (s) I / ChÃºng tÃŽi (*) rÃºt tá»« / há»£p Äá»ng cá»§a chÃºng "
-"tÃŽi (*) cá»§a tÃŽi ÄÆ°á»£c tham gia Äá» mua hÃ ng"
-
-#: ../views/admin/musterwiderruf.pdf.phtml:38
-msgid "der folgenden Waren (*)/die Erbringung der folgenden Dienstleistung."
-msgstr "cÃ¡c hÃ ng hoÃ¡ sau (*) / cung cáº¥p cÃ¡c dá»ch vá»¥ sau."
-
-#: ../views/admin/musterwiderruf.pdf.phtml:40
-msgid "Artikelname"
-msgstr "tÃªn sáº£n pháº©m"
-
-#: ../views/admin/musterwiderruf.pdf.phtml:41
-msgid "Bestellt am (*)/erhalten am (*)"
-msgstr "Ra lá»nh trÃªn (*) / nháº­n vÃ o (*)"
-
-#: ../views/admin/musterwiderruf.pdf.phtml:49
-msgid "Meine Anschrift"
-msgstr "Äá»a chá» cá»§a tÃŽi"
-
-#: ../views/admin/musterwiderruf.pdf.phtml:56
-msgid "Datum, Unterschrift"
-msgstr "NgÃ y, Chá»¯ kÃœ"
-
-#: ../views/admin/kalkulation.phtml:26
-msgid "Kleinunternehmerregelung Text"
-msgstr "Kleinunternehmerregelung TiÃªu Äá»"
-
-#: ../views/order/index.phtml:165
-msgid "Bestellungen suchen"
-msgstr "TÃ¬m kiáº¿m ÄÆ¡n hÃ ng"
-
-#: ../views/order/index.phtml:177
-msgid "Filter"
-msgstr "bá» lá»c"
-
-#: ../views/order/index.phtml:209
-msgid "Bestellfilter"
-msgstr "lá»c tá»±"
-
-#: ../views/order/index.phtml:221
-msgid "Suchtext"
-msgstr "vÄn báº£n tÃ¬m kiáº¿m"
-
-#: ../views/order/index.phtml:225
-msgid "Bestelldatum (Monat/Jahr)"
-msgstr "ngÃ y Äáº·t hÃ ng (thÃ¡ng / nÄm)"
-
-#: ../views/order/index.phtml:246
-msgid "Rechnungsdatum (Monat/Jahr)"
-msgstr "ngÃ y láº­p hÃ³a ÄÆ¡n (thÃ¡ng / nÄm)"
-
-#: ../views/order/index.phtml:359 ../views/order/index.phtml:504
-msgid "Abo Ende"
-msgstr "cuá»i THUÃ BAO"
-
-#: ../views/order/index.phtml:452
-msgid "VerlÃ€ngerung zu Bestellung <a href=\"#1#\">#2#</a>"
-msgstr "Má» rá»ng Äá» Äáº·t hÃ ng <a href=\"#1#\"> # 2 # mÃ£"
-
-#: ../views/order/view.phtml:17
-msgid "Anschrift Ã€ndern (Kundendaten)"
-msgstr "Thay Äá»i Äá»a chá» (dá»¯ liá»u khÃ¡ch hÃ ng)"
-
-#: ../views/order/view.phtml:64
-msgid "Bestellung wird aktualisiert."
-msgstr "Thá»© tá»± sáºœ ÄÆ°á»£c cáº­p nháº­t."
-
-#: ../views/order/view.phtml:192 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:52
-msgid "Rechnungsanschrift Ã€ndern"
-msgstr "Chá»nh sá»­a Äá»a chá» thanh toÃ¡n"
-
-#: ../views/order/view.phtml:217
-msgid "Auch Lieferanschrift anpassen"
-msgstr "CÅ©ng thÃ­ch á»©ng Äá»a chá» giao hÃ ng"
-
-#: ../views/order/view.phtml:399
-msgid "Entwickler Optionen"
-msgstr "tÃ¹y chá»n nhÃ  phÃ¡t triá»n"
-
-#: ../views/order/view.phtml:403
-msgid "Kundenmail simulieren (An Shop Betreiber)"
-msgstr "ThÆ° khÃ¡ch hÃ ng mÃŽ phá»ng (cho cÃ¡c chá»§ cá»­a hÃ ng)"
-
-#: ../views/order/view.phtml:404
-msgid "Adminmail simulieren"
-msgstr "mÃŽ phá»ng quáº£n lÃœ thÆ°"
-
-#: ../views/order/view.phtml:405 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:30
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:29
-msgid "Bestellabschlussseite"
-msgstr "trang hoÃ n thÃ nh theo thá»© tá»±"
-
-#: ../views/order/view.phtml:406
-msgid "URL Benachrichtigung (Kauf) auslÃ¶sen"
-msgstr "kÃ­ch hoáº¡t URL alert (mua)"
-
-#: ../views/order/view.phtml:407
-msgid "URL Benachrichtigung (Bezahlung) auslÃ¶sen"
-msgstr "kÃ­ch hoáº¡t URL alert (thanh toÃ¡n)"
-
-#: ../views/order/view.phtml:408
-msgid "Warenkorbdaten anzeigen"
-msgstr "Xem dá»¯ liá»u giá» hÃ ng"
-
-#: ../views/mods/mod_produktattribute/basket_row.phtml:12 
-#: ../views/mods/mod_produktattribute/overview_row.phtml:12
-msgid "Attribut"
-msgstr "Äáº·c tÃ­nh"
-
-#: ../views/mods/mod_produktattribute/list.phtml:129 
-#: ../views/mods/mod_productvars/pv_list.phtml:102 
-#: ../views/mods/mod_ordervars/ov_list.phtml:119
-msgid "Die Reihenfolge lÃ€sst sich mittels Drag&Drop verÃ€ndern."
-msgstr "CÃ¡c lá»nh cÃ³ thá» ÄÆ°á»£c thay Äá»i báº±ng cÃ¡ch kÃ©o vÃ  tháº£."
-
-#: ../views/mods/mod_weight/overview_row_end.phtml:10 
-#: ../views/mods/mod_weight/basket_row_end.phtml:10 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Gesamtgewicht"
-msgstr "tá»ng trá»ng lÆ°á»£ng"
-
-#: ../views/mods/mod_weight/settings_edit.phtml:11 
-#: ../views/mods/mod_fuellmenge/settings_edit.phtml:11
-msgid "In der Warenkorb-Lightbox anzeigen"
-msgstr "Hiá»n táº¡i cÃ¡c há»p ÄÃšn giá»"
-
-#: ../views/mods/mod_weight/settings_edit.phtml:19
-msgid "Auf Anfrageseite anzeigen"
-msgstr "TrÃªn trang theo yÃªu cáº§u"
-
-#: ../views/mods/mod_weight/settings_edit.phtml:20
-msgid "Auf Anfrageseite im Produkt anzeigen"
-msgstr "TrÃªn trang yÃªu cáº§u trong sáº£n pháº©m"
-
-#: ../views/mods/mod_topseller/widget_form.phtml:19
-msgid "Limit"
-msgstr "giá»i háº¡n"
-
-#: ../views/mods/mod_topseller/produkt_edit_allgemein.phtml:9 
-#: ../views/mods/mod_topseller/produkt_edit_allgemein.phtml:14
-msgid "TopSeller Status"
-msgstr "tÃ¬nh tráº¡ng TopSeller"
-
-#: ../views/mods/mod_topseller/produkt_edit_allgemein.phtml:10
-msgid "Einbeziehen"
-msgstr "bao gá»m"
-
-#: ../views/mods/mod_topseller/produkt_edit_allgemein.phtml:11
-msgid "AusschlieÃen"
-msgstr "loáº¡i trá»«"
-
-#: ../views/mods/mod_topseller/produkt_edit_allgemein.phtml:15 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:48 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:64 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:76
-msgid "Nicht anzeigen"
-msgstr "KhÃŽng hiá»n thá»"
-
-#: ../views/mods/mod_topseller/settings_edit.phtml:9
-msgid "Alle Produkte einbeziehen"
-msgstr "Bao gá»m táº¥t cáº£ Sáº£n pháº©m"
-
-#: ../views/mods/mod_topseller/settings_edit.phtml:11
-msgid "Maximale Anzahl (Standard)"
-msgstr "Tá»i Äa (máº·c Äá»nh)"
-
-#: ../views/mods/mod_gutschein/add.phtml:24
-msgid "Code Generierung"
-msgstr "há» mÃ£"
-
-#: ../views/mods/mod_gutschein/add.phtml:25
-msgid "Automatisch"
-msgstr "tá»± Äá»ng"
-
-#: ../views/mods/mod_gutschein/add.phtml:31
-msgid "Minimaler Warenwert"
-msgstr "GiÃ¡ trá» tá»i thiá»u"
-
-#: ../views/mods/mod_gutschein/add.phtml:36
-msgid "BeschrÃ€nkung auf Produktgruppen"
-msgstr "Giá»i háº¡n cho cÃ¡c nhÃ³m sáº£n pháº©m"
-
-#: ../views/mods/mod_gutschein/add.phtml:38
-msgid "BeschrÃ€nkung auf Produkte"
-msgstr "Háº¡n cháº¿ vá» sáº£n pháº©m"
-
-#: ../views/mods/mod_gutschein/index.phtml:217
-msgid "Ab #1#"
-msgstr "Tá»« # 1 #"
-
-#: ../views/mods/mod_gutschein/index.phtml:231
-msgid "Mehrfach benutzbar"
-msgstr "nhiá»u thá» sá»­ dá»¥ng"
-
-#: ../views/mods/mod_gutschein/basket_row_end.phtml:11
-msgid "Gutscheincode:"
-msgstr "MÃ£ phiáº¿u giáº£m giÃ¡:"
-
-#: ../views/mods/mod_productvars/settings_edit.phtml:50
-msgid "Produktvariable(n) im Produkttemplate abfragen"
-msgstr "biáº¿n sáº£n pháº©m (s) Kiá»m tra cÃ¡c máº«u sáº£n pháº©m"
-
-#: ../views/mods/mod_userpayment/list.phtml:142 
-#: ../views/mods/mod_su/settings_edit.phtml:48 
-#: ../views/mods/mod_autodebit/settings_edit.phtml:15 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:25 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:36 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:55 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:72 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:92 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:109 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:131 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:177 
-#: ../views/mods/mod_paypal/settings_edit.phtml:88 
-#: ../views/mods/mod_invoice_type/settings_edit.phtml:15 
-#: ../views/mods/mod_debitpayment/settings_edit.phtml:15 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:25 
-#: ../views/mods/mod_versandarten/list.phtml:224
-msgid "Keine MwSt. wenn Land steuerfrei"
-msgstr "KhÃŽng cÃ³ thuáº¿ GTGT. Khi thuáº¿ Äáº¥t miá»
-n phÃ­"
-
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:5 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:5
-msgid ""
-"Die Produkte, die als Download vorliegen, wurden fÃŒr Sie freigeschaltet."
-msgstr "CÃ¡c sáº£n pháº©m, trong ÄÃ³ cÃ³ sáºµn nhÆ° download ÄÆ°á»£c má» khÃ³a cho báº¡n."
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:201 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:279 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:193
-msgid "Passwort sollte folgende Regeln befolgen:"
-msgstr "Máº­t kháº©u pháº£i tuÃ¢n theo cÃ¡c quy táº¯c sau ÄÃ¢y:"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:203 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:281 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:195
-msgid "Das Passwort ist zu kurz!"
-msgstr "Máº­t kháº©u quÃ¡ ngáº¯n!"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:204 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:282
-msgid "Mit mindestens einem Kleinbuchstaben wird das Passwort noch sicherer"
-msgstr "Vá»i Ã­t nháº¥t má»t chá»¯ thÆ°á»ng máº­t kháº©u an toÃ n hÆ¡n"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:205 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:283
-msgid "Mit mindestens einem GroÃbuchstaben wird das Passwort noch sicherer"
-msgstr "Vá»i Ã­t nháº¥t má»t chá»¯ hoa cÃ¡c máº­t kháº©u an toÃ n hÆ¡n"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:206 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:284
-msgid "Mit mindestens einer Zahl wird das Passwort noch sicherer"
-msgstr "Vá»i Ã­t nháº¥t má»t sá», máº­t kháº©u lÃ  an toÃ n hÆ¡n"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:207 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:285
-msgid "Mit mindestens einem Sonderzeichen wird das Passwort noch sicherer"
-msgstr "Vá»i Ã­t nháº¥t má»t kÃœ tá»± Äáº·c biá»t, cÃ¡c máº­t kháº©u an toÃ n hÆ¡n"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:212 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:159 
-#: ../views/warenkorb/checkout.phtml:139
-msgid "Geburtsdatum (Format: TT.MM.JJJJ)"
-msgstr "NgÃ y sinh (Äá»nh dáº¡ng: DD.MM.YYYY)"
-
-#: ../views/mods/mod_kundenverwaltung/register.phtml:300 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:292 
-#: ../views/mods/mod_autodebit/paymenthint.phtml:64 
-#: ../views/warenkorb/checkout.phtml:247
-msgid "Mit #1# gekennzeichnete Felder sind Pflichtfelder."
-msgstr "Vá»i # 1 # CÃ¡c trÆ°á»ng ÄÃ¡nh dáº¥u * lÃ  báº¯t buá»c."
-
-#: ../views/mods/mod_kundenverwaltung/index.phtml:89
-msgid "Alle Kundengruppen"
-msgstr "Táº¥t cáº£ cÃ¡c nhÃ³m khÃ¡ch hÃ ng"
-
-#: ../views/mods/mod_kundenverwaltung/index.phtml:90 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:65
-msgid "Unzugeordnet"
-msgstr "unassigned"
-
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:14
-msgid "Neues Passwort generieren"
-msgstr "Táº¡o máº­t kháº©u má»i"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:196
-msgid "Mindestens ein Kleinbuchstabe"
-msgstr "Ãt nháº¥t má»t chá»¯ thÆ°á»ng"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:197
-msgid "Mindestens ein GroÃbuchstabe"
-msgstr "Táº¡i thÆ° má»t vá»n nháº¥t"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:198
-msgid "Mindestens eine Zahl"
-msgstr "Ãt nháº¥t má»t trong sá»"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:199
-msgid "Mindestens ein Sonderzeichen"
-msgstr "Ãt nháº¥t má»t nhÃ¢n váº­t Äáº·c biá»t"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:231
-msgid "Umsatz in #1#"
-msgstr "BÃ¡n hÃ ng á» # 1 #"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:235
-msgid ""
-"<a href=\"#1#\" title=\"Storniert\" class=\"wpsg_storno\">#2#</a> / <a "
-"href=\"#3#\" title=\"Offen\" class=\"wpsg_open\">#4#</a> / <a href=\"#5#\" "
-"title=\"Bezahlt\" class=\"wpsg_payed\">#6#</a>"
-msgstr ""
-"Táº¯t Kundengr <a href=\"#1#\" class=\"wpsg_storno\"> # 2 / <a href = \"# 3 "
-"#\" title = class title=\"Storniert\" # mÃ£ \"má»\" = \"wpsg_open\" > # 4 # mÃ£ "
-"/ <a href=\"#5#\" title=\"Bezahlt\" class=\"wpsg_payed\"> # 6 # mÃ£ uppen"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:290
-msgid "Kundengruppe"
-msgstr "nhÃ³m khÃ¡ch hÃ ng"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:296
-msgid "Format: TT.MM.JJJJ"
-msgstr "Äá»nh dáº¡ng: DD.MM.YYYY"
-
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:307
-msgid "Mail bei StatusÃ€nderung"
-msgstr "Mail trÃªn sá»± thay Äá»i cá»§a tÃ¬nh tráº¡ng"
-
-#: ../views/mods/mod_kundenverwaltung/logout.phtml:9
-msgid ""
-"Sie kÃ¶nnen sich nicht registrieren, da sie derzeit eingeloggt sind. Klicken "
-"Sie <a href=\"#1#\">hier</a> um sich abzumelden."
-msgstr ""
-"Báº¡n khÃŽng thá» ÄÄng kÃœ vÃ¬ há» hiá»n Äang ÄÄng nháº­p. Nháº¥n vÃ o <a href=\"#1#\"> "
-"ÄÃ¢y mÃ£ Äá» thoÃ¡t ra."
-
-#: ../views/mods/mod_kundenverwaltung/order.phtml:30
-msgid "Rechnungskorrektur #1#"
-msgstr "Äiá»u chá»nh HoÃ¡ ÄÆ¡n # 1 #"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:12
-msgid "E-Mail darf nur einmal registriert werden"
-msgstr "Email cÃ³ thá» ÄÆ°á»£c ÄÄng kÃœ má»t láº§n duy nháº¥t"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:13
-msgid "Bestellung nur fÃŒr eingeloggte Benutzer"
-msgstr "Äá» chá» cho ngÆ°á»i dÃ¹ng ÄÄng nháº­p"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:17
-msgid "Weiterleitung nach Login"
-msgstr "Chuyá»n hÆ°á»ng Äá» ÄÄng nháº­p"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:18 
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:22
-msgid "Auf aktueller Seite bleiben"
-msgstr "Váº«n Äang trÃªn Trang hiá»n táº¡i"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:21
-msgid "Weiterleitung nach Logout"
-msgstr "Chuyá»n tiáº¿p sau khi Logout"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:40
-msgid "Weiterleitung nach Registrierung"
-msgstr "Chuyá»n hÆ°á»ng Äá» ÄÄng kÃœ"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:44
-msgid "Wordpress User koppeln"
-msgstr "vÃ i tÃ i WordPress"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:47
-msgid "Benutzerrolle"
-msgstr "vai trÃ² ngÆ°á»i dÃ¹ng"
-
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:63
-msgid ""
-"Die Einstellungen fÃŒr die E-Mails (Betreff, Absender, CC) kÃ¶nnen in der <a "
-"href=\"#1#\">E-Mail Konfiguration</a> durchgefÃŒhrt werden."
-msgstr ""
-"CÃ¡c thiáº¿t láº­p cho cÃ¡c e-mail (chá»§ Äá», ngÆ°á»i gá»­i, CC) cÃ³ thá» ÄÆ°á»£c thá»±c hiá»n "
-"trong mÃ£ <a cáº¥u hÃ¬nh email href=\"#1#\"> nÃ y."
-
-#: ../views/mods/mod_discount/basket_top.phtml:10
-msgid ""
-"Ab einem Bestellwert von #1# erhalten Sie einen Rabatt von #2#. Ihnen fehlen "
-"dazu noch #3# im Warenkorb."
-msgstr ""
-"Tá»« má»t thá»© tá»± # 1 # Báº¡n nháº­n ÄÆ°á»£c má»t giáº£m giÃ¡ # 2 #. Há» thiáº¿u cá»ng vá»i # 3 "
-"# trong giá» hÃ ng."
-
-#: ../views/mods/mod_discount/customergroup_edit.phtml:11 
-#: ../mods/wpsg_mod_discount.class.php:22
-msgid "Kundengruppenrabatt"
-msgstr "giáº£m giÃ¡ nhÃ³m khÃ¡ch hÃ ng"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:15
-msgid "Warenkorbrabatt"
-msgstr "giáº£m giÃ¡ giá» hÃ ng"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:25 
-#: ../mods/wpsg_mod_discount.class.php:22
-msgid "Rabatt auf alle Produkte"
-msgstr "Giáº£m giÃ¡ trÃªn táº¥t cáº£ cÃ¡c sáº£n pháº©m"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:51
-msgid "Rabatt auf Kundengruppen"
-msgstr "Táº¯t cÃ¡c nhÃ³m khÃ¡ch hÃ ng"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:54
-msgid "Originalpreis im Produkttemplate anzeigen"
-msgstr "GiÃ¡ gá»c trong máº«u sáº£n pháº©m"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:58
-msgid "Rabattreihenfolge (fÃŒr Berechnung):"
-msgstr "Sá»­ dá»¥ng liÃªn tá»¥c (tÃ­nh):"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:59
-msgid "Standard wiederherstellen"
-msgstr "khÃŽi phá»¥c máº·c Äá»nh"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:73
-msgid "Reihenfolge kann mittels Drag&Drop verÃ€ndert werden."
-msgstr "HÆ°á»ng cÃ³ thá» ÄÆ°á»£c thay Äá»i báº±ng cÃ¡ch kÃ©o vÃ  tháº£."
-
-#: ../views/mods/mod_discount/settings_edit.phtml:78
-msgid "Nur ersten Rabatt berÃŒcksichtigen"
-msgstr "chá» xem xÃ©t giáº£m giÃ¡ Äáº§u tiÃªn"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:90
-msgid "Staffelung:"
-msgstr "tá»t nghiá»p:"
-
-#: ../views/mods/mod_discount/settings_edit.phtml:118
-msgid "NÃ€chste Staffelung im Warenkorb anpreisen"
-msgstr "quáº£ng cÃ¡o tá»t nghiá»p tiáº¿p theo trong giá» hÃ ng"
-
-#: ../views/mods/mod_su/settings_edit.phtml:43
-msgid "Betreff fÃŒr Ãberweisung (Zeile 1)"
-msgstr "TiÃªu Äá» Äá» chuyá»n (dÃ²ng 1)"
-
-#: ../views/mods/mod_su/settings_edit.phtml:44
-msgid "Betreff fÃŒr Ãberweisung (Zeile 2)"
-msgstr "TiÃªu Äá» Äá» chuyá»n (dÃ²ng 2)"
-
-#: ../views/mods/mod_su/settings_edit.phtml:47 
-#: ../views/mods/mod_autodebit/settings_edit.phtml:14 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:24 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:35 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:54 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:71 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:91 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:108 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:130 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:176 
-#: ../views/mods/mod_paypal/settings_edit.phtml:87 
-#: ../views/mods/mod_invoice_type/settings_edit.phtml:14 
-#: ../views/mods/mod_debitpayment/settings_edit.phtml:14 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:24
-msgid "Mehrwertsteuersatz"
-msgstr "thuáº¿ suáº¥t thuáº¿ GTGT"
-
-#: ../views/mods/mod_su/settings_edit.phtml:52
-msgid "Kunden-Nr fÃŒr SofortÃŒberweisung.de"
-msgstr "sá» lÆ°á»£ng khÃ¡ch hÃ ng cho SofortÃŒberweisung.de"
-
-#: ../views/mods/mod_autodebit/mail_html.phtml:16 
-#: ../views/mods/mod_autodebit/mail.phtml:11
-msgid "BIC Code der Bank"
-msgstr "mÃ£ sá» ngÃ¢n hÃ ng BIC"
-
-#: ../views/mods/mod_autodebit/mail_html.phtml:31 
-#: ../views/mods/mod_autodebit/mail.phtml:17 
-#: ../views/mods/mod_autodebit/order_view_afterpayment.phtml:20
-msgid "IBAN Nr."
-msgstr "sá» IBAN."
-
-#: ../views/mods/mod_autodebit/paymenthint.phtml:22
-msgid "BIC"
-msgstr "BIC"
-
-#: ../views/mods/mod_autodebit/order_view_afterpayment.phtml:12
-msgid "BIC der Bank"
-msgstr "BIC NgÃ¢n hÃ ng"
-
-#: ../views/mods/mod_autodebit/settings_edit.phtml:16
-msgid "IBAN/BIC statt Kontonummer/BLZ verwenden"
-msgstr "sá»­ dá»¥ng IBAN / BIC thay vÃ¬ sá» tÃ i khoáº£n / BLZ"
-
-#: ../views/mods/mod_autodebit/order_done.phtml:8
-msgid ""
-"Sie bezahlen mit Bankeinzug. Wir werden den Betrag von Ihrem Konto abbuchen."
-msgstr ""
-"Báº¡n tráº£ báº±ng cÃ¡ch ghi ná»£ trá»±c tiáº¿p. ChÃºng tÃŽi sáºœ ghi ná»£ sá» tiá»n tá»« tÃ i khoáº£n "
-"cá»§a báº¡n."
-
-#: ../views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:11
-msgid "Produktgruppen Lagerbestand"
-msgstr "nhÃ³m sáº£n pháº©m chá»©ng khoÃ¡n"
-
-#: ../views/mods/mod_willcollect/settings_edit.phtml:12
-msgid "Selbstabholung nicht kombinieren"
-msgstr "khÃŽng káº¿t há»£p Pickup"
-
-#: ../views/mods/mod_deliverytime/basket_row.phtml:9 
-#: ../views/mods/mod_deliverytime/mail_row_html.phtml:11 
-#: ../views/mods/mod_deliverytime/mail_row.phtml:7 
-#: ../views/mods/mod_deliverytime/overview_row.phtml:9 
-#: ../views/mods/mod_deliverytime/produkt_edit_allgemein.phtml:10 
-#: ../views/mods/mod_deliverytime/produkt_edit_allgemein.phtml:12 
-#: ../mods/wpsg_mod_deliverytime.class.php:2 
-#: ../mods/wpsg_mod_deliverytime.class.php:5
-msgid "Lieferzeit"
-msgstr "thá»i gian giao hÃ ng"
-
-#: ../views/mods/mod_deliverytime/basket_row.phtml:14 
-#: ../views/mods/mod_deliverytime/overview_row.phtml:14
-msgid "sofort lieferbar"
-msgstr "cÃ³ ngay láº­p tá»©c"
-
-#: ../views/mods/mod_deliverytime/produkt_edit_allgemein.phtml:18
-msgid "Store"
-msgstr "cá»­a hÃ ng"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:8
-msgid "Eingabetyp"
-msgstr "loáº¡i Äáº§u vÃ o"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:9
-msgid "Angabe von Tagen"
-msgstr "XÃ¡c Äá»nh ngÃ y"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:13
-msgid "VerfÃŒgbare Lieferzeiten"
-msgstr "thá»i gian giao hÃ ng cÃ³ sáºµn"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:13
-msgid "Kommagetrennt"
-msgstr "dáº¥u pháº©y Ly"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:14 
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:17
-msgid "Standard Lieferzeit"
-msgstr "thá»i gian giao hÃ ng chuáº©n"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:22
-msgid "Produkte nur im Store (nicht im Onlineshop)"
-msgstr "Sáº£n pháº©m chá» cÃ³ trong cá»­a hÃ ng (khÃŽng pháº£i trong cá»­a hÃ ng trá»±c tuyáº¿n)"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:27
-msgid "Seite mit Adressdaten"
-msgstr "dá»¯ liá»u Äá»a chá» trang"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:28
-msgid "Bitte wÃ€hlen Sie eine Seite mit den Adressdaten"
-msgstr "Vui lÃ²ng chá»n má»t trang vá»i cÃ¡c dá»¯ liá»u Äá»a chá»"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:34
-msgid "Hinweistext bei VerzÃ¶gerungen anzeigen"
-msgstr "Xem LÆ°u Ãœ cho sá»± cháº­m trá»
-"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:36
-msgid "Grund fÃŒr verzÃ¶gerte Lieferung"
-msgstr "LÃœ do giao hÃ ng cháº­m"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:37
-msgid "Zeitangabe der VerzÃ¶gerung"
-msgstr "Thá»i gian Chá» Äá»nh thá»i gian trá»
-"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:44
-msgid "In Bestellzusammenfassung anzeigen"
-msgstr "Hiá»n trong báº£n tÃ³m táº¯t Äá»"
-
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:45
-msgid "In den Mails anzeigen"
-msgstr "Hiá»n trong thÆ°"
-
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:4
-msgid "Newsletter"
-msgstr "Báº£n tin"
-
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:11
-msgid "Abonnentengruppe"
-msgstr "nhÃ³m thuÃª bao"
-
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:12
-msgid "Daten ÃŒbernehmen"
-msgstr "cháº¥p nháº­n dá»¯ liá»u"
-
-#: ../views/mods/mod_legaltexts/form_haendlerbund.phtml:26
-msgid ""
-"wpShopGermany bietet eine Schnittstelle zum <a href=\"https://partner."
-"haendlerbund.de/partnerdoor.php?partnerid=partner_wp&bannerid=18\" "
-"target=\"_blank\">HÃ€ndlerbund</a> an."
-msgstr ""
-"wpShopGermany cung cáº¥p má»t giao diá»n Äá» <a href=\"https://partner."
-"haendlerbund.de/partnerdoor.php?partnerid=partner_wp&bannerid=18\" "
-"target=\"_blank\"> Äang HÃ€ndlerbund."
-
-#: ../views/mods/mod_legaltexts/form_haendlerbund.phtml:27
-msgid ""
-"HÃ€ndlerbund bietet Schutzpakete im Abo (\"AGB-Rechtstext-Flatrate\") fÃŒr "
-"Onlineshop Betreiber an. Mit dem wpShopGermany-HÃ€ndlerbund Plugin (ab "
-"Version 1.0), werden die angebotenen Rechtstexte auf die zugeordneten Blog-"
-"Seiten mittels Mausklick automatisch ÃŒbernommen und aktualisiert."
-msgstr ""
-"HÃ€ndlerbund cung cáº¥p cÃ¡c gÃ³i báº£o vá» trong cÃ¡c thuÃª bao ( \"AGB-phÃ¡p luáº­t vÄn "
-"báº£n flatrate\") táº¡i nhÃ  Äiá»u hÃ nh cá»­a hÃ ng trá»±c tuyáº¿n. By wpShopGermany-"
-"HÃ€ndlerbund plugin (phiÃªn báº£n 1.0), cÃ¡c vÄn báº£n quy pháº¡m phÃ¡p luáº­t ÄÆ°á»£c cung "
-"cáº¥p lÃ  tá»± Äá»ng báº±ng cÃ¡ch nháº¥p vÃ o cÃ¡c trang blog liÃªn quan vÃ  cáº­p nháº­t."
-
-#: ../views/mods/mod_legaltexts/form_haendlerbund.phtml:30 
-#: ../views/mods/mod_legaltexts/form_itrecht.phtml:28 
-#: ../views/mods/mod_legaltexts/form_protectedshops.phtml:16
-msgid ""
-"Das Plugin wurde bereits gefunden aber noch nicht aktiviert. Bitte "
-"aktivieren sie das Plugin in der <a href=\"plugins.php\">Pluginverwaltung</a>"
-"."
-msgstr ""
-"CÃ¡c plugin ÄÃ£ ÄÆ°á»£c tÃ¬m tháº¥y nhÆ°ng chÆ°a kÃ­ch hoáº¡t. HÃ£y kÃ­ch hoáº¡t cÃ¡c plugin "
-"trong mÃ£ quáº£n lÃœ Plugin <a href=\"plugins.php\">."
-
-#: ../views/mods/mod_legaltexts/form_itrecht.phtml:11
-msgid ""
-"wpShopGermany bietet eine AGB-Schnittstelle zur <a href=\"http://www.it-"
-"recht-kanzlei.de/Service/rechtstexte_fuer_onlineshops.php?partner_id=150\">"
-"IT-Recht Kanzlei</a> an."
-msgstr ""
-"wpShopGermany cung cáº¥p giao diá»n Äiá»u kiá»n cho cÃŽng ty luáº­t <a href=\"http:"
-"//www.it-recht-kanzlei.de/Service/rechtstexte_fuer_onlineshops.php?"
-"partner_id=150\"> CNTT Äá» mÃ£."
-
-#: ../views/mods/mod_legaltexts/form_itrecht.phtml:13
-msgid ""
-"Die IT-Recht Kanzlei bietet fÃŒr monatlich nur 9,99 Euro abmahnsichere "
-"Rechtstexte an - natÃŒrlich inkl. Haftung. Dazu gehÃ¶ren die AGB, die "
-"Widerrufsbelehrung, die DatenschutzerklÃ€rung sowie das Impressum. Mit dem "
-"wpShopGermany-IT-Recht Kanzlei Plugin (ab Version 1.0) werden die "
-"angebotenen Rechtstexte auf Ihre Blog-Seiten mittels Mausklick automatisch "
-"ÃŒbernommen und kÃŒnftig auch automatisch aktualisiert - inklusive permanenter "
-"AGB-Ãberwachung."
-msgstr ""
-"CÃŽng ty Luáº­t CNTT cung cáº¥p cho hÃ ng thÃ¡ng chá» 9,99 Euro abmahnsichere vÄn "
-"báº£n quy pháº¡m phÃ¡p luáº­t - dÄ© nhiÃªn bao gá»m cáº£ trÃ¡ch nhiá»m phÃ¡p lÃœ .. Äiá»u nÃ y "
-"bao gá»m cÃ¡c Äiá»u khoáº£n vÃ  Äiá»u kiá»n, viá»c thu há»i, ChÃ­nh sÃ¡ch báº£o máº­t vÃ  cÃ¡c "
-"dáº¥u áº¥n. By wpShopGermany CNTT ty luáº­t plugin (phiÃªn báº£n 1.0), cÃ¡c vÄn báº£n "
-"quy pháº¡m phÃ¡p luáº­t ÄÆ°á»£c cung cáº¥p ÄÆ°á»£c tá»± Äá»ng chuyá»n vÃ o cÃ¡c trang blog cá»§a "
-"báº¡n há» muá»n vÃ  trong tÆ°Æ¡ng lai cÅ©ng cáº­p nháº­t tá»± Äá»ng - trong ÄÃ³ cÃ³ Äiá»u kiá»n "
-"giÃ¡m sÃ¡t thÆ°á»ng trá»±c."
-
-#: ../views/mods/mod_legaltexts/form_itrecht.phtml:17
-msgid "Jetzt AGB Service buchen"
-msgstr "Äáº·t phÃ²ng ngay Äiá»u kiá»n Dá»ch vá»¥"
-
-#: ../views/mods/mod_legaltexts/form_itrecht.phtml:22
-msgid "Rechtstexte im gÃŒnstigen Paketpreis finden Sie hier"
-msgstr "cÃ¡c vÄn báº£n quy pháº¡m phÃ¡p luáº­t phá»¥c vá»¥ dÃ²ng cÃ³ thá» ÄÆ°á»£c tÃ¬m tháº¥y á» ÄÃ¢y"
-
-#: ../views/mods/mod_legaltexts/form_protectedshops.phtml:11
-msgid ""
-"wpShopGermany bietet eine Schnittstelle zu <a href=\"http://www."
-"protectedshops.de/\" target=\"_blank\">Protected Shops</a> an."
-msgstr ""
-"wpShopGermany cung cáº¥p má»t giao diá»n Äá» <a href=\"http://www.protectedshops."
-"de/\" target=\"_blank\"> Äang Protectedshops."
-
-#: ../views/mods/mod_legaltexts/form_protectedshops.phtml:12
-msgid ""
-"Protected Shops bietet Schutzpakete im Abo (\"AGB-Rechtstext-Flatrate\") fÃŒr "
-"Onlineshop Betreiber an. Mit dem wpShopGermany-ProtectedShops Plugin (ab "
-"Version 1.8), werden die angebotenen Rechtstexte auf die zugeordneten Blog-"
-"Seiten mittels Mausklick automatisch ÃŒbernommen und aktualisiert."
-msgstr ""
-"Cá»­a hÃ ng báº£o cung cáº¥p cÃ¡c gÃ³i báº£o vá» trong cÃ¡c thuÃª bao ( \"AGB-phÃ¡p luáº­t "
-"vÄn báº£n flatrate\") táº¡i nhÃ  Äiá»u hÃ nh cá»­a hÃ ng trá»±c tuyáº¿n. By wpShopGermany-"
-"Protectedshops plugin (phiÃªn báº£n 1.8), cÃ¡c vÄn báº£n quy pháº¡m phÃ¡p luáº­t ÄÆ°á»£c "
-"cung cáº¥p lÃ  tá»± Äá»ng báº±ng cÃ¡ch nháº¥p vÃ o cÃ¡c trang blog liÃªn quan vÃ  cáº­p nháº­t."
-
-#: ../views/mods/mod_legaltexts/form_protectedshops.phtml:13
-msgid ""
-"Erhalten Sie <strong>5% Rabatt</strong> auf das erste Protected Shops "
-"Jahresabo mit folgendem <strong>Gutscheincode</strong>: <span style=\"color:"
-"red;\">WP-SHOP</span> (unbedingt bei der Erstregistrierung angeben!)"
-msgstr ""
-"Nháº­n <strong> 5% </ strong> trÃªn Äáº§u Protectedshops Má»t nÄm nhÆ° sau <strong> "
-"MÃ£ phiáº¿u giáº£m giÃ¡ </ strong>: <span style = \"color: red;\"> WP-SHOP </ span>"
-" (nháº¥t thiáº¿t pháº£i á» xÃ¡c Äá»nh viá»c ÄÄng kÃœ ban Äáº§u!)"
-
-#: ../views/mods/mod_legaltexts/settings_edit.phtml:9
-msgid "Anbieter"
-msgstr "ngÆ°á»i cung cáº¥p"
-
-#: ../views/mods/mod_legaltexts/settings_edit.phtml:11
-msgid "HÃ€ndlerbund"
-msgstr "HÃ€ndlerbund"
-
-#: ../views/mods/mod_legaltexts/settings_edit.phtml:12
-msgid "IT-Recht Kanzlei MÃŒnchen"
-msgstr "cÃŽng ty luáº­t CNTT Munich"
-
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:12
-msgid "Gesonderte Lieferadresse abweichend von der Rechnungsadresse verwenden"
-msgstr "sá»­ dá»¥ng Äá»a chá» giao hÃ ng riÃªng biá»t khÃ¡c vá»i Äá»a chá» thanh toÃ¡n"
-
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:18
-msgid "Lieferanschrift Ã€ndern"
-msgstr "Thay Äá»i Äá»a chá» cá»§a báº¡n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:8
-msgid "Account ID"
-msgstr "Account ID"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:9
-msgid "Projekt ID"
-msgstr "dá»± Ã¡n ID"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:10
-msgid "AccessKey"
-msgstr "AccessKey"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:11
-msgid "Seite nach erfolgreicher Zahlung"
-msgstr "Trang sau khi thanh toÃ¡n thÃ nh cÃŽng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:12
-msgid "Zahlungs sofort starten"
-msgstr "Báº¯t Äáº§u thanh toÃ¡n ngay láº­p tá»©c"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:13
-msgid "API URL"
-msgstr "API URL"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:13
-msgid "Muss im micropaymentâ¢ Interface hinterlegt werden."
-msgstr "Pháº£i ÄÆ°á»£c lÆ°u trá»¯ trong cÃ¡c giao diá»n micropayment â¢."
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:16
-msgid "Account (FÃŒr Webmasterbewerbung)"
-msgstr "TÃ i khoáº£n (Äá»i vá»i cÃ¡c á»©ng dá»¥ng quáº£n trá» trang web)"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:17
-msgid "Layout"
-msgstr "bá» trÃ­"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:18
-msgid "Hintergrundfarbe"
-msgstr "mÃ u ná»n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:19
-msgid "Kampagne des Projektinhabers"
-msgstr "Chiáº¿n dá»ch cá»§a chá»§ dá»± Ã¡n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:20
-msgid "Hintergrundgrafik fÃŒr Zahlfenster"
-msgstr "Äá» há»a ná»n cho cá»­a sá» thanh toÃ¡n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:25
-msgid "CreditCard - Abrechnung per Creditkarte"
-msgstr "Tháº» tÃ­n dá»¥ng - thanh toÃ¡n báº±ng tháº» tÃ­n dá»¥ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:28
-msgid "Zahlungsart \"Kreditkarte\" aktiv"
-msgstr "Thanh toÃ¡n \"tháº» tÃ­n dá»¥ng\" hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:33 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:52 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:69 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:89 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:106 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:128 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:174 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:53
-msgid "Alternative Logo URL"
-msgstr "URL Logo thay tháº¿"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:44
-msgid "CreditCard - Abrechnung per Creditkarte (Reservierung)"
-msgstr "Tháº» tÃ­n dá»¥ng - thanh toÃ¡n báº±ng tháº» tÃ­n dá»¥ng (Äáº·t phÃ²ng)"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:47
-msgid "Zahlungsart \"Kreditkarte mit Reservierung\" aktiv"
-msgstr "Thanh toÃ¡n \"tháº» tÃ­n dá»¥ng vá»i phÃ²ng\" hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:63
-msgid "Lastschrift - Abrechnung per Lastschrift"
-msgstr "Ná»£ - Thanh toÃ¡n báº±ng tháº» ghi ná»£ trá»±c tiáº¿p"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:66
-msgid "Zahlungsart \"Lastschrift\" aktiv"
-msgstr "Thanh toÃ¡n \"ná»£\" hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:73 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:110
-msgid "Betreff der Zahlung"
-msgstr "CÃ¡c chi tiáº¿t thanh toÃ¡n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:81
-msgid "eBank2Pay - Abrechnung per Online Banking"
-msgstr "eBank2Pay - thanh toÃ¡n qua ngÃ¢n hÃ ng trá»±c tuyáº¿n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:84
-msgid "Zahlungsart \"eBank2Pay\" aktiv"
-msgstr "Thanh toÃ¡n \"eBank2Pay\" hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:100
-msgid "Vorkasse - Abrechnung per Vorkasse"
-msgstr "Thanh toÃ¡n - Thanh toÃ¡n trÆ°á»c"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:103
-msgid "Zahlungsart \"Vorkasse\" aktiv"
-msgstr "Thanh toÃ¡n \"trÆ°á»c\" hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:118
-msgid "Call2Pay - Abrechnung per Anruf / Telefon"
-msgstr "Call2Pay - thanh toÃ¡n cho má»i cuá»c gá»i / Äiá»n thoáº¡i"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:123 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:169
-msgid "Zahlungsart \"Call2Pay\" aktiv"
-msgstr "Thanh toÃ¡n \"Call2Pay\" hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:136
-msgid ""
-"Bitte beachten Sie, dass es bei der Nutzung von Call2Pay folgende "
-"EinschrÃ€nkungen gibt"
-msgstr "Xin lÆ°u Ãœ ráº±ng cÃ³ nhá»¯ng háº¡n cháº¿ sau ÄÃ¢y vá» viá»c sá»­ dá»¥ng Call2Pay"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:138 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:184
-msgid "Nur Abrechnung von telekommunikationsbasierten Mehrwertdiensten mÃ¶glich"
-msgstr "Chá» thanh toÃ¡n cÃ¡c dá»ch vá»¥ giÃ¡ trá» gia tÄng viá»
-n thÃŽng dá»±a trÃªn thá»"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:139
-msgid "Preisobergrenze von 30 Euro pro Transaktion"
-msgstr "GiÃ¡ tráº§n lÃ  30 euro cho má»i giao dá»ch"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:140 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:186
-msgid "National und international KEINE einheitliche GebÃŒhrenstruktur"
-msgstr "Quá»c gia vÃ  quá»c táº¿ NO cÆ¡ cáº¥u chi phÃ­ Äá»ng phá»¥c"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:141
-msgid "Teilweise abweichende Preise aus dem Mobilfunknetz"
-msgstr "giÃ¡ má»t pháº§n khÃ¡c nhau tá»« cÃ¡c máº¡ng di Äá»ng"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:144 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:189
-msgid ""
-"Sollten Sie sich unsicher sein, ob Sie diese Zahlarten nutzen kÃ¶nnen oder "
-"dÃŒrfen, melden Sie sich einfach bei uns!"
-msgstr ""
-"Náº¿u báº¡n khÃŽng cháº¯c cháº¯n náº¿u báº¡n cÃ³ thá» sá»­ dá»¥ng cÃ¡c khoáº£n thanh toÃ¡n sau hoáº·c "
-"cÃ³ thá», chá» cáº§n ÄÄng kÃœ vá»i chÃºng tÃŽi!"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:146 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:191
-msgid "Ansprechpartner"
-msgstr "tiáº¿p xÃºc"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:147 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:192
-msgid "Telefon (Festnetz)"
-msgstr "Äiá»n thoáº¡i (cá» Äá»nh)"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:148 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:193
-msgid "eMail"
-msgstr "eMail"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:149 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:194
-msgid "Stichwort"
-msgstr "tá»« khÃ³a"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:152 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:197
-msgid "Ich habe einen entsprechenden Account und kann die Zahlungsart nutzen."
-msgstr ""
-"TÃŽi cÃ³ má»t tÃ i khoáº£n tÆ°Æ¡ng á»©ng vÃ  cÃ³ thá» sá»­ dá»¥ng cÃ¡c phÆ°Æ¡ng thá»©c thanh toÃ¡n."
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:163
-msgid "HandyPay - Abrechnung per SMS / Tan"
-msgstr "HandyPay - thanh toÃ¡n qua SMS / TÃ¢n"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:182
-msgid ""
-"Bitte beachten Sie, dass es bei der Nutzung von HandyPay folgende "
-"EinschrÃ€nkungen gibt"
-msgstr "Xin lÆ°u Ãœ ráº±ng cÃ³ nhá»¯ng háº¡n cháº¿ sau ÄÃ¢y vá» viá»c sá»­ dá»¥ng HandyPay"
-
-#: ../views/mods/mod_micropayment/settings_edit.phtml:185
-msgid "Preise nicht frei tarifierbar, nur vorgegebene Tarifstruktur nutzbar"
-msgstr ""
-"GiÃ¡ khÃŽng thá» tá»± do tarifierbar, cÆ¡ cáº¥u thuáº¿ quan chá» ÄÆ°á»£c xÃ¡c Äá»nh trÆ°á»c cÃ³ "
-"sáºµn"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:9
-msgid "Klicken Sie auf das folgende Logo um ihre Bestellung zu bezahlen."
-msgstr "Nháº¥p vÃ o biá»u tÆ°á»£ng sau Äá» Äáº·t hÃ ng cá»§a há» pháº£i tráº£."
-
-#: ../views/mods/mod_micropayment/order_done.phtml:28
-msgid ""
-"Bitte geben Sie ihre Kreditkarteninformationen (Kartennummer, "
-"GÃŒltigkeitsdatum und PrÃŒfnummer) in folgende Felder ein. Die Daten werden an "
-"Micropayment ÃŒbermittelt und nicht durch uns gespeichert oder ausgewertet."
-msgstr ""
-"Vui lÃ²ng nháº­p thÃŽng tin tháº» tÃ­n dá»¥ng (sá» tháº», ngÃ y háº¿t háº¡n vÃ  sá» an ninh) "
-"cá»§a báº¡n trong cÃ¡c lÄ©nh vá»±c sau ÄÃ¢y. CÃ¡c dá»¯ liá»u ÄÆ°á»£c truyá»n Äáº¿n "
-"micropayments vÃ  khÃŽng ÄÆ°á»£c lÆ°u trá»¯ bá»i chÃºng tÃŽi hoáº·c ÄÃ¡nh giÃ¡."
-
-#: ../views/mods/mod_micropayment/order_done.phtml:35
-msgid "Kreditkartennummer"
-msgstr "Sá» tháº» tÃ­n dá»¥ng"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:36
-msgid "Kreditkarte - Vorderseite"
-msgstr "Tháº» tÃ­n dá»¥ng - recto"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:37
-msgid "Max Mustermann"
-msgstr "John Doe"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:55
-msgid "Kreditkarte - RÃŒckseite"
-msgstr "Tháº» tÃ­n dá»¥ng - trá» láº¡i"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:57
-msgid "HC600214C"
-msgstr "HC600214C"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:58
-msgid "Unterschrift Max Mustermann"
-msgstr "Chá»¯ kÃœ cá»§a John Doe"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:59
-msgid "PrÃŒfnummer"
-msgstr "sá» kiá»m tra"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:62
-msgid "Zahlung starten"
-msgstr "báº¯t Äáº§u thanh toÃ¡n"
-
-#: ../views/mods/mod_micropayment/order_done.phtml:92
-msgid "Vielen Dank fÃŒr Ihre Zahlungsreservierung."
-msgstr "Cáº£m Æ¡n báº¡n ÄÃ£ Äáº·t phÃ²ng thanh toÃ¡n cá»§a báº¡n."
-
-#: ../views/mods/mod_micropayment/order_done.phtml:109
-msgid "Unerwarteter Serverfehler!"
-msgstr "Báº¥t ngá» lá»i mÃ¡y chá»§!"
-
-#: ../views/mods/mod_paypal/order_view_afterpayment.phtml:13
-msgid "PaymentID"
-msgstr "PaymentID"
-
-#: ../views/mods/mod_paypal/order_view_afterpayment.phtml:13
-msgid "Status Aktualisieren"
-msgstr "cáº­p nháº­t tráº¡ng thÃ¡i"
-
-#: ../views/mods/mod_paypal/order_view_afterpayment.phtml:16
-msgid "#1# (#2#)"
-msgstr "#1# (#2#)"
-
-#: ../views/mods/mod_paypal/order_view_afterpayment.phtml:25
-msgid "SaleID"
-msgstr "SaleID"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:13
-msgid "Integrationsmodus"
-msgstr "cháº¿ Äá» há»i nháº­p"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:13
-msgid "Classic API"
-msgstr "API cá» Äiá»n"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:13
-msgid "REST API"
-msgstr "REST API"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:28
-msgid "Client ID"
-msgstr "Client ID"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:28 
-#: ../views/mods/mod_paypal/settings_edit.phtml:29
-msgid ""
-"Erhalten Sie im <a target=\"_blank\" href=\"#1#\">PayPal Developer "
-"Interface</a>."
-msgstr ""
-"Láº¥y <a target=\"_blank\" href=\"#1#\"> Äang Interface PayPal Developer."
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:29
-msgid "Secret"
-msgstr "BÃ­ máº­t"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:33
-msgid "Stornierung bei Statuswechsel"
-msgstr "Há»§y táº¡i thay Äá»i tráº¡ng thÃ¡i"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:50
-msgid "WebHook URL"
-msgstr "WebHook URL"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:51
-msgid "Beim speichern versuchen den WebHook anzumelden."
-msgstr "Khi cá»­a hÃ ng cá» gáº¯ng Äá» ÄÄng kÃœ webhook."
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:70
-msgid "Ausblenden"
-msgstr "phai mÃ u"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:83
-msgid "Betreff der Ãberweisung"
-msgstr "Chá»§ Äá» cá»§a Chuyá»n"
-
-#: ../views/mods/mod_paypal/settings_edit.phtml:92
-msgid "FranzÃ¶sisch"
-msgstr "ngÆ°á»i PhÃ¡p"
-
-#: ../views/mods/mod_scaleprice/scaleList.phtml:17 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:74 
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:24 
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:38
-msgid "StÃŒck"
-msgstr "cÃ¡i"
-
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:146
-msgid "Sind Sie sich sicher, dass sie diese Staffel entfernen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xÃ³a bá» mÃ¹a giáº£i nÃ y?"
-
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:169 
-#: ../mods/wpsg_mod_scaleprice.class.php:2
-msgid "Staffelpreise"
-msgstr "ChÃ o giÃ¡ tá»t nháº¥t"
-
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:174
-msgid ""
-"Staffelpreise kÃ¶nnen erst nach einmaligem Speichern des Produktes definiert "
-"werden."
-msgstr ""
-"giÃ¡ tá»t nghiá»p cÃ³ thá» ÄÆ°á»£c xÃ¡c Äá»nh duy nháº¥t má»t láº§n sau khi lÆ°u trá»¯ cÃ¡c sáº£n "
-"pháº©m."
-
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:177
-msgid "Staffelpreise aktiv"
-msgstr "ChÃ o giÃ¡ tá»t nháº¥t hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:191
-msgid "Ersetzung"
-msgstr "thay tháº¿"
-
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:192
-msgid "Addition"
-msgstr "thÃªm vÃ o"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:14
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der "
-"Menge wie folgt:"
-msgstr ""
-"Sáº£n pháº©m cÃ³ giÃ¡ cáº£ táº§ng, káº¿t quáº£ nÃ y trong tham chiáº¿u Äáº¿n sá» tiá»n nhÆ° sau:"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:16
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des "
-"Gewichts wie folgt:"
-msgstr ""
-"Sáº£n pháº©m cÃ³ giÃ¡ cáº£ táº§ng nÆ¡i nÃ y phÃ¡t sinh cÄn cá»© vÃ o trá»ng lÆ°á»£ng nhÆ° sau:"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:22
-msgid "Bis "
-msgstr "Äáº¿n"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:28 
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:42
-msgid " kostet das Produkt "
-msgstr "giÃ¡ thÃ nh sáº£n pháº©m"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:29 
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:43
-msgid "je StÃŒck"
-msgstr "má»i ÄÆ¡n vá»"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:36
-msgid "Ab "
-msgstr "tá»«"
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:50
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der "
-"Menge. FÃŒr weitere Informationen loggen Sie sich bitte ein."
-msgstr ""
-"Sáº£n pháº©m cÃ³ giÃ¡ cáº£ táº§ng, káº¿t quáº£ nÃ y trong tham chiáº¿u Äáº¿n sá» tiá»n. Äá» biáº¿t "
-"thÃªm thÃŽng tin, Äá» ÄÄng nháº­p."
-
-#: ../views/mods/mod_scaleprice/product_bottom.phtml:52
-msgid ""
-"Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des "
-"Gewichts. FÃŒr weitere Informationen loggen Sie sich bitte ein."
-msgstr ""
-"Sáº£n pháº©m cÃ³ giÃ¡ cáº£ táº§ng nÆ¡i nÃ y phÃ¡t sinh cÆ¡ sá» cÃ¢n. Äá» biáº¿t thÃªm thÃŽng tin, "
-"Äá» ÄÄng nháº­p."
-
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:11 
-#: ../mods/wpsg_mod_trustedshops.class.php:2
-msgid "Trusted Shops"
-msgstr "Cá»­a hÃ ng tin cáº­y"
-
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:15
-msgid "Einwilligung"
-msgstr "Äá»ng Ãœ"
-
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:22
-msgid ""
-"Der Kunde erhÃ€lt eine Mail mit einem Link zur Bewertung der Bestellung. Sind "
-"Sie sich sicher?"
-msgstr ""
-"KhÃ¡ch hÃ ng nháº­n ÄÆ°á»£c má»t email vá»i má»t liÃªn káº¿t Äá» xem xÃ©t láº¡i cÃ¡c ÄÆ¡n Äáº·t "
-"hÃ ng. Báº¡n cÃ³ cháº¯c cháº¯n?"
-
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:22
-msgid "E-Mail mit Bewertungslink senden"
-msgstr "gá»­i má»t email vá»i má»t liÃªn káº¿t xem xÃ©t láº¡i"
-
-#: ../views/mods/mod_trustedshops/mail_html.phtml:9 
-#: ../views/mods/mod_trustedshops/mail.phtml:9
-msgid ""
-"wir hoffen Sie waren mit dem Bestellablauf zufrieden, um unseren Service und "
-"unsere Dienstleistung zu verbessern kÃ¶nnen Sie uns ÃŒber Trusted Shops "
-"bewerten. Dies kÃ¶nnen Sie kostenlos unter folgendem Link durchfÃŒhren: "
-msgstr ""
-"ChÃºng tÃŽi hy vá»ng báº¡n sáºœ hÃ i lÃ²ng vá»i quÃ¡ trÃ¬nh Äáº·t hÃ ng Äá» cáº£i thiá»n kinh "
-"nghiá»m cá»§a báº¡n vÃ  cÃ¡c dá»ch vá»¥ cá»§a chÃºng tÃŽi báº¡n cÃ³ thá» ÄÃ¡nh giÃ¡ chÃºng tÃŽi "
-"Cá»­a hÃ ng tin cáº­y. Äiá»u nÃ y báº¡n cÃ³ thá» lÃ m Äiá»u ÄÃ³ miá»
-n phÃ­ táº¡i ÄÃ¢y:"
-
-#: ../views/mods/mod_trustedshops/mail_html.phtml:12
-msgid "Bewertung durchfÃŒhren"
-msgstr "ÄÃ¡nh giÃ¡ thá»±c hiá»n"
-
-#: ../views/mods/mod_trustedshops/widget_form.phtml:10
-msgid "Bewertungen anzeigen"
-msgstr "Hiá»n ÄÃ¡nh giÃ¡"
-
-#: ../views/mods/mod_trustedshops/widget_form.phtml:14
-msgid "Badge anzeigen"
-msgstr "Hiá»n Badge"
-
-#: ../views/mods/mod_trustedshops/widget_form.phtml:30
-msgid ""
-"Die weitere Konfiguration des Widgets erfolgt in den <a href=\"#1#\">"
-"Moduleinstellungen.</a>"
-msgstr ""
-"CÃ¡c cáº¥u hÃ¬nh thÃªm cÃ¡c widget diá»
-n ra trong cÃ¡c thiáº¿t láº­p mÃŽ-Äun <a "
-"href=\"#1#\">. </a>"
-
-#: ../views/mods/mod_trustedshops/widget.phtml:49
-msgid "Klicken Sie auf das GÃŒtesiegel, um die GÃŒltigkeit zu prÃŒfen!"
-msgstr "Nháº¥p vÃ o dáº¥u Äá» kiá»m tra tÃ­nh há»£p lá»!"
-
-#: ../views/mods/mod_trustedshops/checkout_customer_inner.phtml:10
-msgid ""
-"Ich bin damit einverstanden, eine separate und unverbindliche "
-"Bewertungsaufforderung (<a href=\"https://www.trustedshops.com/\" "
-"target=\"_blank\">Trusted Shops</a>) per Mail zu erhalten."
-msgstr ""
-"TÃŽi Äá»ng Ãœ, yÃªu cáº§u xem xÃ©t riÃªng biá»t vÃ  khÃŽng rÃ ng buá»c (<a href=\"https:"
-"//www.trustedshops.com/\" target=\"_blank\"> Trusted Cá»­a code) Äá» nháº­n e-"
-"mail."
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:9
-msgid "Shop-ID"
-msgstr "Shop-ID"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:10
-msgid "Abfrage Bewertungseinwilligung (im Checkout)"
-msgstr "sá»± Äá»ng Ãœ ÄÃ¡nh giÃ¡ truy váº¥n (Thanh)"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:13
-msgid "Als Vorauswahl aktiv"
-msgstr "LÃ  sá»± chá»n lá»c trÆ°á»c hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:22
-msgid "Trusted Shops Widget"
-msgstr "Cá»­a hÃ ng tin cáº­y phá»¥ tÃ¹ng"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:23
-msgid "Bestellabschluss"
-msgstr "hoÃ n thÃ nh tráº­t tá»±"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:24
-msgid "Bewertungslinks"
-msgstr "liÃªn káº¿t xem xÃ©t láº¡i"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:25
-msgid "Review Collector"
-msgstr "Xem láº¡i Collector"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:33
-msgid "Bewertungsbild zwischenspeichern (empfohlen)"
-msgstr "Xem xÃ©t áº£nh bá» nhá» cache (Äá» nghá»)"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:34
-msgid "Titel des Bewertungsbildes"
-msgstr "TiÃªu Äá» cá»§a hÃ¬nh áº£nh tá»ng quan"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:38
-msgid ""
-"Das Trusted Shops Widget muss in einen <a href=\"#1#\">Widgetbereich</a> "
-"eingefÃŒgt werden."
-msgstr ""
-"Trusted Äang phá»¥ tÃ¹ng cá»­a hÃ ng pháº£i ÄÆ°á»£c ÄÆ°a vÃ o trong má»t khu vá»±c phá»¥ tÃ¹ng "
-"<a href=\"#1#\">."
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:39
-msgid "Vorschau:"
-msgstr "Xem trÆ°á»c:"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:47
-msgid "Link zur Bewertung"
-msgstr "LiÃªn káº¿t Äá» xem"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:50 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:66 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:78
-msgid "Nur anzeigen, wenn Kunde bewerten mÃ¶chte"
-msgstr "Chá» hiá»n thá» náº¿u khÃ¡ch hÃ ng muá»n ÄÃ¡nh giÃ¡"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:52
-msgid "Titel des Links"
-msgstr "TiÃªu Äá» liÃªn káº¿t"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:57
-msgid "Trusted Shops KÃ€uferschutz (Garantie)"
-msgstr "Trusted Cá»­a hÃ ng mua Protection (báº£o lÃ£nh)"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:63
-msgid "Link zur Bewertung in Kundenmail nach Bestellabschluss"
-msgstr ""
-"LiÃªn káº¿t Äá» xem xÃ©t trong thÆ° cá»§a khÃ¡ch hÃ ng sau khi hoÃ n thÃ nh tráº­t tá»±"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:68 
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:80
-msgid "Text des Links"
-msgstr "VÄn báº£n cá»§a LiÃªn káº¿t"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:75
-msgid "Link zur Bewertung in Rechnungsmail"
-msgstr "LiÃªn káº¿t Äá» xem thÆ° ÄÃ£ láº­p hoÃ¡ ÄÆ¡n"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:90
-msgid "Erinnerung"
-msgstr "trÃ­ nhá»"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:99
-msgid "Nach"
-msgstr "qua"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:101
-msgid "Tagen"
-msgstr "gáº·p"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:111
-msgid "BestellzustÃ€nde"
-msgstr "bang tá»±"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:126
-msgid "Letzter Export"
-msgstr "Xuáº¥t kháº©u cuá»i"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:134
-msgid "CSV-Export-Datei erstellen"
-msgstr "Táº¡o má»t táº­p tin CSV xuáº¥t kháº©u"
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:136
-msgid "Derzeit keine Daten zum Export verfÃŒgbar."
-msgstr "KhÃŽng cÃ³ thÃŽng tin hiá»n cÃ³ sáºµn cho xuáº¥t kháº©u."
-
-#: ../views/mods/mod_trustedshops/settings_edit.phtml:144
-msgid "Trusted Shops Review Collector"
-msgstr "Trusted Cá»­a xÃ©t Collector"
-
-#: ../views/mods/mod_fuellmenge/priceinfo.phtml:8
-msgid "(#1# / #2#)"
-msgstr "(#1# / #2#)"
-
-#: ../views/mods/mod_core/admin_register.phtml:86
-msgid ""
-"Erweitern Sie Ihre wpShopGermany-Lizenz um weitere Funktionen, indem Sie <a "
-"href=\"#1#\">weitere Module installieren</a> und ihrer bestehenden "
-"wpShopGermany-Lizenz hinzufÃŒgen."
-msgstr ""
-"Má» rá»ng giáº¥y phÃ©p wpShopGermany cá»§a báº¡n Äáº¿n cÃ¡c chá»©c nÄng khÃ¡c báº±ng cÃ¡ch cÃ i "
-"Äáº·t thÃªm module <a Äang href=\"#1#\"> vÃ  thÃªm giáº¥y phÃ©p wpShopGermany hiá»n "
-"cÃ³ cá»§a há»."
-
-#: ../views/mods/mod_core/admin_register.phtml:94
-msgid "wpShopGermany Lizenz erweitern"
-msgstr "Má» rá»ng giáº¥y phÃ©p wpShopGermany"
-
-#: ../views/mods/mod_core/module_index.phtml:11
-msgid ""
-"Aktivieren/Installieren Sie weitere Module oder halten Sie externe Module "
-"aktuell."
-msgstr ""
-"Enable / cÃ i Äáº·t cÃ¡c module bá» sung hoáº·c giá»¯ cÃ¡c module bÃªn ngoÃ i hiá»n nay."
-
-#: ../views/mods/mod_core/module_index.phtml:17
-msgid "Hier sehen sie verfÃŒgbare externe Module"
-msgstr "á» ÄÃ¢y báº¡n cÃ³ thá» nhÃ¬n tháº¥y cÃ³ sáºµn cÃ¡c module bÃªn ngoÃ i"
-
-#: ../views/mods/mod_core/module_index.phtml:26
-msgid "installierte Version"
-msgstr "phiÃªn báº£n cÃ i Äáº·t"
-
-#: ../views/mods/mod_core/module_index.phtml:28
-msgid "verfÃŒgbare Version"
-msgstr "phiÃªn báº£n cÃ³ sáºµn"
-
-#: ../views/mods/mod_core/module_index.phtml:41
-msgid "kostenlos"
-msgstr "tá»± do"
-
-#: ../views/mods/mod_core/module_index.phtml:45
-msgid "aktiv"
-msgstr "hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_core/module_index.phtml:61
-msgid ""
-"neue Version verfÃŒgbar (<a href=\"#1#\">wpShopGermany Update</a> notwendig)"
-msgstr ""
-"phiÃªn báº£n má»i cÃ³ sáºµn (<a href=\"#1#\"> wpShopGermany mÃ£ cáº­p nháº­t cáº§n thiáº¿t)"
-
-#: ../views/mods/mod_core/module_index.phtml:63
-msgid "neue Version verfÃŒgbar: <a href=\"#1#\">installiere #2#</a>"
-msgstr "phiÃªn báº£n má»i cÃ³ sáºµn <a href=\"#1#\"> cÃ i Äáº·t # 2 # mÃ£"
-
-#: ../views/mods/mod_core/module_index.phtml:73
-msgid ""
-"Module konnten aufgrund fehlender SOAP UnterstÃŒtzung nicht geladen werden."
-msgstr "Module khÃŽng thá» náº¡p ÄÆ°á»£c do thiáº¿u sá»± há» trá»£ SOAP."
-
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:162
-msgid "Text (HTML)"
-msgstr "Text (HTML)"
-
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:29
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:25 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:25 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:28
-msgid ""
-"Nutzen Sie bitte folgenden Link um den Zahlvorgang abschlieÃen zu kÃ¶nnen"
-msgstr "Vui lÃ²ng sá»­ dá»¥ng Äá» liÃªn káº¿t sau Äá» quÃ¡ trÃ¬nh thanh toÃ¡n Äáº§y Äá»§"
-
-#: ../views/mods/mod_relatedproducts/basket_after.phtml:11 
-#: ../views/warenkorb/ajaxDialog.phtml:93
-msgid "Das kÃ¶nnte Ihnen auch gefallen:"
-msgstr "Báº¡n cÅ©ng cÃ³ thá»:"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:8
-msgid "Produkttemplate fÃŒr die ZubehÃ¶rprodukte"
-msgstr "Máº«u sáº£n pháº©m phá»¥ kiá»n"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:9
-msgid "Synchrone VerknÃŒpfung der Produkte"
-msgstr "Äá»ng bá» liÃªn káº¿t cÃ¡c sáº£n pháº©m"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:11
-msgid "ZubehÃ¶rprodukte im Warenkorb anpreisen"
-msgstr "quáº£ng cÃ¡o sáº£n pháº©m phá»¥ trong giá»"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:11
-msgid ""
-"Wird unterhalb des Warenkorbes dargestellt. Alternativ kann "
-"[wpsg_relatedproducts_basket limit=\"5\"] verwendet werden."
-msgstr ""
-"Äáº¡i diá»n bÃªn dÆ°á»i giá». NgoÃ i ra [wpsg_relatedproducts_basket háº¡n = \"5\"] "
-"ÄÆ°á»£c sá»­ dá»¥ng."
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:13 
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:19
-msgid "Maximale Anzahl an angezeigten Produkten"
-msgstr "Sá» lÆ°á»£ng tá»i Äa cá»§a sáº£n pháº©m trÆ°ng bÃ y"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:14
-msgid "Tempalte fÃŒr die ZubehÃ¶rprodukte im Warenkorb"
-msgstr "Tempalte cho cÃ¡c sáº£n pháº©m phá»¥ kiá»n trong giá» hÃ ng"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:17
-msgid "ZubehÃ¶rprodukte im Warenkorb-Lightbox anpreisen"
-msgstr "ZubehÃ¶rprodukte im Warenkorb-Lightbox anpreisen"
-
-#: ../views/mods/mod_relatedproducts/settings_edit.phtml:20
-msgid "Tempalte fÃŒr die ZubehÃ¶rprodukte in der Lightbox"
-msgstr ""
-"(Xem giÃ¡ eingeloTempalte cho cÃ¡c phá»¥ kiá»n trong nhá»¯ng ngÆ°á»i sá»­ dá»¥ng "
-"Lightboxggte)"
-
-#: ../views/mods/mod_varianten/produkt.phtml:61 
-#: ../views/mods/mod_varianten/produkt.phtml:144 
-#: ../views/mods/mod_varianten/produkt.phtml:181
-msgid "(Preise nur fÃŒr eingeloggte Benutzer)"
-msgstr "(GiÃ¡ trÃªn chá» dÃ nh cho ngÆ°á»i dÃ¹ng ÄÄng nháº­p)"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:35 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:528
-msgid "Grafikauswahl"
-msgstr "lá»±a chá»n biá»u Äá»"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:40
-msgid "Variante lÃ¶schen"
-msgstr "rÃµ rÃ ng MÃŽ táº£"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:42
-msgid "Variante deaktivieren"
-msgstr "vÃŽ hiá»u hÃ³a MÃŽ táº£"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:44
-msgid "Variante aktivieren"
-msgstr "kÃ­ch hoáº¡t biáº¿n thá»"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:262
-msgid "Variation lÃ¶schen"
-msgstr "rÃµ rÃ ng biáº¿n"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:264
-msgid "Variation deaktivieren"
-msgstr "biáº¿n thá» vÃŽ hiá»u hÃ³a"
-
-#: ../views/mods/mod_varianten/drawVarianten.phtml:266
-msgid "Variation aktivieren"
-msgstr "phÃ©p biáº¿n Äá»i"
-
-#: ../views/mods/mod_varianten/settings_edit.phtml:10
-msgid "Ausverkaufte Varianten anzeigen"
-msgstr "Hiá»n bÃ¡n cÃ¡c biáº¿n thá»"
-
-#: ../views/mods/mod_varianten/settings_edit.phtml:18
-msgid "Bild fÃŒr Varianten mit \"Grafikauswahl\""
-msgstr "HÃ¬nh áº£nh cÃ¡c mÃŽ hÃ¬nh vá»i \"lá»±a chá»n Äá» há»a\""
-
-#: ../views/mods/mod_varianten/settings_edit.phtml:21
-msgid "Bild Modus"
-msgstr "cháº¿ Äá» hÃ¬nh áº£nh"
-
-#: ../views/mods/mod_prepayment/mail_html.phtml:9
-msgid ""
-"Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto "
-"und geben Sie als Betreff <strong>#2#</strong> an."
-msgstr ""
-"Vui lÃ²ng chuyá»n sá» tiá»n lÃ  # 1 # vÃ o tÃ i khoáº£n sau vÃ  chá» ra trong cÃ¡c chá»§ "
-"Äá» <strong> # 2 # </ strong>."
-
-#: ../views/mods/mod_prepayment/mail.phtml:9
-msgid ""
-"Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto "
-"und geben Sie als Betreff \"#2#\" an."
-msgstr ""
-"Vui lÃ²ng chuyá»n sá» tiá»n lÃ  # 1 # Äá» cÃ¡c tÃ i khoáº£n sau ÄÃ¢y vÃ  nháº­p vÃ o dÃ²ng "
-"chá»§ Äá» \"# 2 #\" Äá»."
-
-#: ../views/mods/mod_productindex/layouts/list.phtml:51 
-#: ../views/mods/mod_productindex/layouts/list.phtml:196 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:53 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:212 
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Erstellungsdatum (Ãlteste zuerst)"
-msgstr "SÃ¡ng táº¡o ngÃ y (CÅ© nháº¥t trÆ°á»c)"
-
-#: ../views/mods/mod_productindex/layouts/list.phtml:52 
-#: ../views/mods/mod_productindex/layouts/list.phtml:197 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:54 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:213 
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Erstellungsdatum (Neueste zuerst)"
-msgstr "NgÃ y táº¡o (má»i nháº¥t Äáº§u tiÃªn)"
-
-#: ../views/mods/mod_productindex/layouts/list.phtml:53 
-#: ../views/mods/mod_productindex/layouts/list.phtml:198 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:55 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:214
-msgid "Artikelnummer Aufsteigend"
-msgstr "SKU TÄng dáº§n"
-
-#: ../views/mods/mod_productindex/layouts/list.phtml:54 
-#: ../views/mods/mod_productindex/layouts/list.phtml:199 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:56 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:215
-msgid "Artikelnummer Absteigend"
-msgstr "Artikelnummer Absteigend"
-
-#: ../views/mods/mod_productindex/layouts/list.phtml:173 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:181
-msgid "Produkt #1# in den Warenkorb legen"
-msgstr "Giá» hÃ ng sáº£n pháº©m # 1 # vÃ o giá» hÃ ng"
-
-#: ../views/mods/mod_productindex/page_metabox.phtml:37
-msgid "Ausverkaufte anzeigen"
-msgstr "Hiá»n bÃ¡n"
-
-#: ../views/mods/mod_versandarten/list.phtml:181
-msgid "KostenschlÃŒssel PLZ"
-msgstr "Chi phÃ­ Zip chÃ­nh"
-
-#: ../views/mods/mod_stock/settings_edit.phtml:27
-msgid "Template nicht wechseln"
-msgstr "khÃŽng thay Äá»i Theme"
-
-#: ../views/mods/mod_stock/settings_edit.phtml:28
-msgid "Bestellungen bei negativen Bestand verhindern"
-msgstr "ngÄn cháº·n cÃ¡c ÄÆ¡n Äáº·t hÃ ng táº¡i kho tiÃªu cá»±c"
-
-#: ../views/mods/mod_stock/settings_edit.phtml:29
-msgid "Bestand in ProduktÃŒbersicht (Backend) anzeigen"
-msgstr "Xem hÃ ng tá»n kho trong Tá»ng quan vá» sáº£n pháº©m (backend)"
-
-#: ../views/mods/mod_stock/settings_edit.phtml:31
-msgid "Bestand in ProduktÃŒbersicht (Frontend) anzeigen"
-msgstr "Xem hÃ ng tá»n kho trong Tá»ng quan vá» sáº£n pháº©m (káº¿t thÃºc trÆ°á»c)"
-
-#: ../views/mods/mod_stock/settings_edit.phtml:33
-msgid "Bestand in Produkt (Frontend) anzeigen"
-msgstr "Xem hÃ ng tá»n kho trong sáº£n pháº©m (lá»i vÃ o)"
-
-#: ../views/mods/mod_ordercondition/list.phtml:47
-msgid ""
-"Sind Sie sich sicher, dass sie diese Bestellbedingung entfernen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xÃ³a bá» tÃ¬nh tráº¡ng lá»nh nÃ y?"
-
-#: ../views/mods/mod_ordercondition/list.phtml:70
-msgid "Bisher keine Bestellbedingungen angelegt."
-msgstr "Cho Äáº¿n nay, khÃŽng cÃ³ Äiá»u kiá»n Äá» Ã¡p dá»¥ng."
-
-#: ../views/mods/mod_ordercondition/list.phtml:78
-msgid "Wirkungsbereich"
-msgstr "khu vá»±c áº£nh hÆ°á»ng"
-
-#: ../views/mods/mod_ordercondition/list.phtml:78 
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "Inaktiv"
-msgstr "khÃŽng hoáº¡t Äá»ng"
-
-#: ../views/mods/mod_ordercondition/list.phtml:78
-msgid "Jede Bestellung"
-msgstr "má»i thá»© tá»±"
-
-#: ../views/mods/mod_ordercondition/list.phtml:78
-msgid "Bestimmte Produkte"
-msgstr "Má»t sá» sáº£n pháº©m"
-
-#: ../views/mods/mod_ordercondition/list.phtml:82
-msgid "Bedingungstext"
-msgstr "vÄn báº£n Äiá»u kiá»n"
-
-#: ../views/mods/mod_ordercondition/list.phtml:86 
-#: ../views/mods/mod_ordercondition/list.phtml:104
-msgid "Editor anzeigen/verbergen"
-msgstr "Hiá»n / áºšn BiÃªn táº­p viÃªn"
-
-#: ../views/mods/mod_ordercondition/list.phtml:95 
-#: ../views/mods/mod_ordercondition/list.phtml:113
-msgid "Text speichern"
-msgstr "LÆ°u vÄn báº£n"
-
-#: ../views/mods/mod_ordercondition/list.phtml:100
-msgid "Fehlertext"
-msgstr "vÄn báº£n lá»i"
-
-#: ../views/mods/mod_ordercondition/produkt_edit_sidebar.phtml:11 
-#: ../views/mods/mod_ordercondition/settings_edit.phtml:158 
-#: ../mods/wpsg_mod_ordercondition.class.php:2
-msgid "Bestellbedingungen"
-msgstr "Äiá»u kiá»n tá»±"
-
-#: ../views/mods/mod_ordercondition/settings_edit.phtml:58
-msgid "Text wurde erfolgreich gespeichert."
-msgstr "VÄn báº£n ÄÃ£ ÄÆ°á»£c lÆ°u thÃ nh cÃŽng."
-
-#: ../views/mods/mod_ordercondition/settings_edit.phtml:149
-msgid ""
-"Aufgrund des fÃŒr CrefoPay angepassten Bestellablaufs ist dieses Modul "
-"unwirksam."
-msgstr ""
-"CÃ¡c Äiá»u chá»nh cho CrefoPay quÃ¡ trÃ¬nh Äáº·t hÃ ng, module nÃ y lÃ  khÃŽng há»£p lá»."
-
-#: ../views/mods/mod_ordercondition/settings_edit.phtml:159
-msgid "Neue Bestellbedingung anlegen"
-msgstr "Táº¡o Äiá»u kiá»n tráº­t tá»± má»i"
-
-#: ../views/warenkorb/progress.phtml:12
-msgid "Hier gelangen Sie zum Warenkorb"
-msgstr "Báº¥m vÃ o ÄÃ¢y Äá» giá»"
-
-#: ../views/warenkorb/progress.phtml:18
-msgid "Hier gelangen Sie zum Formular der Kundendaten"
-msgstr "á» ÄÃ¢y báº¡n cÃ³ ÄÆ°á»£c Äá» dÆ°á»i dáº¡ng dá»¯ liá»u cá»§a khÃ¡ch hÃ ng"
-
-#: ../views/warenkorb/progress.phtml:24
-msgid "Hier gelangen Sie zur Auswahl der Bezahlmethode und der Versandart"
-msgstr ""
-"Nháº¥n vÃ o ÄÃ¢y Äá» chá»n cÃ¡c phÆ°Æ¡ng thá»©c thanh toÃ¡n vÃ  váº­n chuyá»n cÃ¡c phÆ°Æ¡ng phÃ¡p"
-
-#: ../views/warenkorb/progress.phtml:25
-msgid "Zahlung / Versand"
-msgstr "Thanh toÃ¡n / Váº­n Chuyá»n"
-
-#: ../views/warenkorb/progress.phtml:30 ../views/warenkorb/progress.phtml:45
-msgid "Hier gelangen Sie zum BestellÃŒbersicht"
-msgstr "Báº¥m vÃ o ÄÃ¢y Äá» tÃ³m táº¯t Äá»"
-
-#: ../views/warenkorb/progress.phtml:31 ../views/warenkorb/progress.phtml:46
-msgid "Abschluss"
-msgstr "hoÃ n thÃ nh"
-
-#: ../views/warenkorb/progress.phtml:39
-msgid ""
-"Hier gelangen Sie zum Formular der Kundendaten, Bezahlmethode und der "
-"Versandart"
-msgstr ""
-"á» ÄÃ¢y báº¡n cÃ³ ÄÆ°á»£c Äá» dÆ°á»i dáº¡ng dá»¯ liá»u khÃ¡ch hÃ ng, phÆ°Æ¡ng thá»©c thanh toÃ¡n vÃ  "
-"phÆ°Æ¡ng thá»©c giao hÃ ng"
-
-#: ../views/warenkorb/progress.phtml:40
-msgid "Kundendaten / Zahlung  / Versand"
-msgstr "ThÃŽng tin tÃ i khoáº£n / Váº­n chuyá»n / thanh toÃ¡n"
-
-#: ../views/warenkorb/index.phtml:90
-msgid ""
-"FÃŒr Produkte nach EU Leistungsortregel wird der Steuersatz von #1# "
-"angewendet."
-msgstr "Äá»i vá»i sáº£n pháº©m theo EU Leistungsortregel tá»· lá» # 1 # ÄÆ°á»£c Ã¡p dá»¥ng."
-
-#: ../views/warenkorb/index.phtml:93
-msgid "Preiseinstellungen Ã€ndern"
-msgstr "thiáº¿t láº­p giÃ¡ thay Äá»i"
-
-#: ../views/warenkorb/checkout.phtml:81
-msgid "Bitte ÃŒberprÃŒfen Sie Ihre Kundendaten"
-msgstr "Vui lÃ²ng kiá»m tra dá»¯ liá»u khÃ¡ch hÃ ng cá»§a báº¡n"
-
-#: ../views/warenkorb/checkout.phtml:83
-msgid "Bitte geben Sie Ihre Kundendaten ein"
-msgstr "Vui lÃ²ng nháº­p dá»¯ liá»u khÃ¡ch hÃ ng cá»§a báº¡n"
-
-#: ../views/warenkorb/checkout.phtml:131
-msgid "E-Mail (Wiederholung)"
-msgstr "Email (láº·p láº¡i)"
-
-#: ../views/warenkorb/checkout.phtml:254
-msgid "zurÃŒck zum Warenkorb"
-msgstr "trá» láº¡i vÃ o giá» hÃ ng"
-
-#: ../views/warenkorb/checkout.phtml:255 ../views/warenkorb/checkout2.phtml:99
-msgid "weiter"
-msgstr "hÆ¡n"
-
-#: ../views/warenkorb/overview.phtml:250 ../views/warenkorb/basket.phtml:245
-msgid "Gesamtpreis (Netto)"
-msgstr "Tá»ng giÃ¡ (net)"
-
-#: ../views/warenkorb/overview.phtml:268 ../views/warenkorb/basket.phtml:263
-msgid "Gesamtpreis (Brutto)"
-msgstr "Tá»ng giÃ¡ (tá»ng)"
-
-#: ../views/warenkorb/overview.phtml:302 ../views/warenkorb/checkout2.phtml:98
-msgid "zurÃŒck"
-msgstr "trá» láº¡i"
-
-#: ../views/warenkorb/basket.phtml:142
-msgid "<a href=\"#1#\">Versandkosten</a>:"
-msgstr "<a Äang váº­n chuyá»n href=\"#1#\">:"
-
-#: ../views/warenkorb/basket.phtml:281
-msgid "aktualisieren"
-msgstr "cáº­p nháº­t"
-
-#: ../views/warenkorb/basket.phtml:283
-msgid "zur Kasse"
-msgstr "Thanh toÃ¡n"
-
-#: ../views/warenkorb/basket.phtml:287
-msgid "weiter shoppen"
-msgstr "Tiáº¿p tá»¥c mua sáº¯m"
-
-#: ../views/warenkorb/ajaxDialog.phtml:21
-msgid "Es sind folgende Fehler aufgetreten:"
-msgstr "CÃ³ lá»i dÆ°á»i ÄÃ¢y:"
-
-#: ../views/warenkorb/ajaxDialog.phtml:26 
-#: ../views/warenkorb/ajaxDialog.phtml:120
-msgid "Weiter Einkaufen"
-msgstr "tiáº¿p tá»¥c mua sáº¯m"
-
-#: ../views/warenkorb/ajaxDialog.phtml:47
-msgid "Es wurde #1#x \"#2#\" in den Warenkorb gelegt."
-msgstr "NÃ³ ÄÃ£ ÄÆ°á»£c # 1 # x \"# 2 #\" vÃ o giá» mua hÃ ng cá»§a báº¡n."
-
-#: ../views/warenkorb/ajaxDialog.phtml:56
-msgid "Der Preis fÃŒr das Produkt betrÃ€gt:"
-msgstr "GiÃ¡ cá»§a sáº£n pháº©m lÃ :"
-
-#: ../views/warenkorb/customerquestion.phtml:13
-msgid ""
-"FÃŒr eine korrekte Preisberechnung benÃ¶tigen wir folgende Informationen von "
-"Ihnen."
-msgstr ""
-"Äá»i vá»i má»t tÃ­nh giÃ¡ chÃ­nh xÃ¡c, chÃºng tÃŽi cáº§n nhá»¯ng thÃŽng tin sau ÄÃ¢y tá»« báº¡n."
-
-#: ../views/warenkorb/customerquestion.phtml:17
-msgid "Sie sind:"
-msgstr "ÄÃ³ lÃ :"
-
-#: ../views/warenkorb/customerquestion.phtml:21
-msgid "Firmenkunde"
-msgstr "khÃ¡ch hÃ ng doanh nghiá»p"
-
-#: ../views/warenkorb/customerquestion.phtml:26
-msgid "Endkunde"
-msgstr "cuá»i khÃ¡ch hÃ ng"
-
-#: ../views/warenkorb/customerquestion.phtml:33
-msgid "aus:"
-msgstr "tá»«:"
-
-#: ../views/warenkorb/customerquestion.phtml:42
-msgid "OK"
-msgstr "OK"
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variantenreihenfolge gespeichert."
-msgstr "chuá»i biáº¿n thá» ÄÆ°á»£c lÆ°u trá»¯."
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variationenreihenfolge gespeichert."
-msgstr "Biáº¿n thá» tá»± lÆ°u trá»¯."
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variantenpreis im Produkttemplate anzeigen"
-msgstr "MÃŽ táº£ GiÃ¡ Hiá»n trong máº«u sáº£n pháº©m"
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "immer anzeigen"
-msgstr "luÃŽn luÃŽn hiá»n thá»"
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "nur wenn grÃ¶Ãer 0"
-msgstr "chá» náº¿u lá»n hÆ¡n 0"
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "nie anzeigen"
-msgstr "bao giá» hiá»n thá»"
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Name der Variante"
-msgstr "tÃªn biáº¿n"
-
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Artikelnummer der Variante"
-msgstr "SKU biáº¿n thá»"
-
-#: ../mods/wpsg_mod_legaltexts.class.php:2
-msgid "Rechtstexte"
-msgstr "cÃ¡c vÄn báº£n quy pháº¡m phÃ¡p luáº­t"
-
-#: ../mods/wpsg_mod_legaltexts.class.php:2
-msgid "ErmÃ¶glicht den Abgleich mit Anbietern von \"AGB-Rechtstext-Flatrates\"."
-msgstr ""
-"ÄÆ°á»£c sá»­ dá»¥ng Äá» Äiá»u chá»nh vá»i cÃ¡c nhÃ  cung cáº¥p \"Flatrates vÄn kiá»n phÃ¡p "
-"luáº­t.\""
-
-#: ../mods/mod_topseller/wpsg_mod_topseller_widget.class.php:2
-msgid "wpShopGermany TopSeller"
-msgstr "wpShopGermany TopSeller"
-
-#: ../mods/wpsg_mod_su.class.php:2 ../mods/wpsg_mod_paypal.class.php:2 
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid ", um die Zahlung durchzufÃŒhren"
-msgstr "Thá»±c hiá»n thanh toÃ¡n"
-
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "SofortÃŒberweisung VERIFIED"
-msgstr "SofortÃŒberweisung phÃª duyá»t"
-
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "SofortÃŒberweisung FAILED"
-msgstr "SofortÃŒberweisung FAILED"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Produktbild im Warenkorb anzeigen"
-msgstr "hÃ¬nh áº£nh sáº£n pháº©m Xem trong giá» hÃ ng"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Produktbild in Bestellzusammenfassung anzeigen"
-msgstr "Xem hÃ¬nh áº£nh sáº£n pháº©m trong báº£n tÃ³m táº¯t Äá»"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Unbearbeitet"
-msgstr "chÆ°a hoÃ n thÃ nh"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Einpassen mit FreiflÃ€che"
-msgstr "Láº¯p vá»i khÃŽng gian má»"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Skallieren auf Breite"
-msgstr "Skallieren vá» chiá»u rá»ng"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Skallieren auf HÃ¶he"
-msgstr "Äá» Skallieren"
-
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Zentrieren und Abschneiden"
-msgstr "Äá»nh tÃ¢m vÃ  cáº¯t"
-
-#: ../mods/wpsg_mod_deliverytime.class.php:2
-msgid "Erlaubt die Definition und Anzeige von Lieferzeiten."
-msgstr "TÃ¹y thuá»c vÃ o Äá»nh nghÄ©a vÃ  hiá»n thá» thá»i gian giao hÃ ng."
-
-#: ../mods/wpsg_mod_deliverytime.class.php:5
-msgid "3 Tage, 1 Woche, 3 Wochen"
-msgstr "3 ngÃ y, 1 tuáº§n, 3 tuáº§n"
-
-#: ../mods/wpsg_mod_deliverytime.class.php:5
-msgid "1 Woche"
-msgstr "1 tuáº§n"
-
-#: ../mods/wpsg_mod_deliverytime.class.php:5
-msgid " Tag(e)"
-msgstr "Day (s)"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:2
-msgid "ErmÃ¶glicht die Integration von Trusted Shops."
-msgstr "Cho phÃ©p tÃ­ch há»£p cÃ¡c cá»­a hÃ ng tin cáº­y."
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "HÃ€ndlerbewertungen einsehen"
-msgstr "xem Xáº¿p háº¡ng"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "Klicken Sie hier, um eine Bewertung des HÃ€ndlers abzugeben."
-msgstr "Nháº¥n vÃ o ÄÃ¢y Äá» láº¡i má»t ÄÃ¡nh giÃ¡ cá»§a cÃ¡c Äáº¡i lÃœ."
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "Bewerten Sie Ihr Einkaufserlebnis bei Trusted Shops! Vielen Dank!"
-msgstr ""
-"ÄÃ¡nh giÃ¡ kinh nghiá»m mua sáº¯m cá»§a báº¡n vá»i cá»­a hÃ ng ÄÃ¡ng tin cáº­y! Cáº£m Æ¡n báº¡n!"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid ""
-"Vergessen Sie nicht Ihr Einkaufserlebnis bei Trusted Shops zu bewerten! "
-"Vielen Dank!"
-msgstr ""
-"QuÃªn Äá» ÄÃ¡nh giÃ¡ khÃŽng kinh nghiá»m mua sáº¯m táº¡i cá»­a hÃ ng ÄÃ¡ng tin cáº­y! Cáº£m Æ¡n "
-"báº¡n!"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "Noch nicht ausgefÃŒhrt."
-msgstr "ChÆ°a ÄÆ°á»£c thá»±c hiá»n."
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid ""
-"Sie haben noch keinen Review Collector-Export gemacht. <a href=\"#1#\">Jetzt "
-"starten.</a>"
-msgstr ""
-"Báº¡n ÄÃ£ khÃŽng ÄÆ°á»£c thá»±c hiá»n má»t xuáº¥t kháº©u giÃ¡ Collector. <a href=\"#1#\"> "
-"Báº¯t Äáº§u bÃ¢y giá». </a>"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid ""
-"Sie haben seit #1# Tagen keinen Review Collector-Export gemacht. <a "
-"href=\"#2#\">Jetzt starten.</a>"
-msgstr ""
-"Báº¡n ÄÃ£ khÃŽng lÃ m xÃ©t Collector xuáº¥t kháº©u tá»« # 1 # ngÃ y. <a href=\"#2#\"> Báº¯t "
-"Äáº§u bÃ¢y giá». </a>"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid ""
-"Ihnen werden keine Benachrichtigungen fÃŒr den Review Collector mehr "
-"angezeigt."
-msgstr "Báº¡n cÃ³ nhiá»u hiá»n thá» thÃŽng bÃ¡o cho cÃ¡c xÃ©t Collector."
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "E-Mail mit dem Bewertungslink wurde erfolgreich an den Kunden gesendet."
-msgstr ""
-"E-mail vá»i cÃ¡c liÃªn káº¿t xem xÃ©t láº¡i ÄÃ£ ÄÆ°á»£c gá»­i thÃ nh cÃŽng cho khÃ¡ch hÃ ng."
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid "E-Mail mit dem Trusted Shops Bewertungslink an den Kunden"
-msgstr "E-mail vá»i Trusted LiÃªn káº¿t Cá»­a hÃ ng ÄÃ¡nh giÃ¡ cho khÃ¡ch hÃ ng"
-
-#: ../mods/wpsg_mod_trustedshops.class.php:4
-msgid ""
-"Diese E-Mail kann aus der Bestellansicht im Backend manuell an den Kunden "
-"versendet werden."
-msgstr ""
-"e-mail nÃ y cÃ³ thá» ÄÆ°á»£c gá»­i tá»« cÃ¡c Äiá»m tráº­t tá»± trong cÃ¡c phá»¥ trá»£ báº±ng tay "
-"cho khÃ¡ch hÃ ng."
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Preis (Aufsteigend)"
-msgstr "GiÃ¡ (TÄng dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Preis (Absteigend)"
-msgstr "GiÃ¡ (giáº£m dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Name (Aufsteigend)"
-msgstr "TÃªn (tÄng dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Name (Absteigend)"
-msgstr "TÃªn (giáº£m dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Artikelnummer (Aufsteigend)"
-msgstr "sá» lÆ°á»£ng hÃ ng (tÄng dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Artikelnummer (Absteigend)"
-msgstr "sá» bÃ i viáº¿t (giáº£m dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Position (Aufsteigend)"
-msgstr "Chá»©c vá»¥ (tÄng dáº§n)"
-
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Position (Absteigend)"
-msgstr "NhÃ³m sáº£n pháº©m ID"
-
-#: ../mods/wpsg_mod_productgroups.class.php:96
-msgid "Produktgruppe ID"
-msgstr "NhÃ³m sáº£n pháº©m ID"
-
-#: ../mods/wpsg_mod_productgroups.class.php:96
-msgid "Produktgruppe Name"
-msgstr "TÃªn nhÃ³m sáº£n pháº©m"
-
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "Status der Zahlung (#1#) erfolgreich abgefragt."
-msgstr "tÃ¬nh tráº¡ng thanh toÃ¡n (# 1 #) truy váº¥n thÃ nh cÃŽng."
-
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid ""
-"Das Modul \"PayPal\" ist aktiviert und es wurden keine API "
-"Zugangsdaten hinterlegt. Gehen Sie in die <a href=\"#1#\">Einstellungen</a> "
-"des Moduls um die API Daten zu hinterlegen."
-msgstr ""
-"CÃ¡c mÃŽ-Äun \"PayPal\" ÄÆ°á»£c kÃ­ch hoáº¡t vÃ  khÃŽng cÃ³ dá»¯ liá»u truy cáº­p API ÄÃ¢y "
-"Sets. Äáº¿n Äáº·t cá»c trong <a thiáº¿t láº­p href=\"#1#\"> mÃ£ cá»§a cÃ¡c mÃŽ-Äun Äá» cÃ¡c "
-"dá»¯ liá»u API."
-
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid ""
-"Das Modul \"PayPal\" ist aktiviert und es wurde kein PayPal Konto fÃŒr "
-"Zahlungen hinterlegt. Gehen Sie in die <a href=\"#1#\">Einstellungen</a> des "
-"Moduls um das PayPal Konto anzugeben."
-msgstr ""
-"CÃ¡c mÃŽ-Äun \"PayPal\" ÄÆ°á»£c kÃ­ch hoáº¡t vÃ  khÃŽng cÃ³ tÃ i khoáº£n PayPal Äá» thanh "
-"toÃ¡n khoáº£n lÆ°u kÃœ. Tá»i <a thiáº¿t láº­p href=\"#1#\"> mÃ£ cá»§a cÃ¡c mÃŽ-Äun vÃ o tÃ i "
-"khoáº£n PayPal quy Äá»nh."
-
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "Zahlung erfolgreich ÃŒber die PayPal API storniert."
-msgstr "Thanh toÃ¡n thÃ nh cÃŽng thÃŽng qua cÃ¡c API PayPal há»§y."
-
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid ""
-"Es gab ein Problem bei der Stornierung der Zahlung ÃŒber die PayPal API. "
-"Bitte Bestellprotokoll beachten."
-msgstr ""
-"CÃ³ má»t váº¥n Äá» vá»i viá»c há»§y bá» cÃ¡c thanh toÃ¡n thÃŽng qua cÃ¡c API PayPal. Xin "
-"vui lÃ²ng tÃ¬m cÃ¡c báº£n ghi theo thá»© tá»±."
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "Keine Bestellung zu PaymentID gefunden."
-msgstr "KhÃŽng Äá» PaymentID ÄÆ°á»£c tÃ¬m tháº¥y."
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "PayPal Erfolg: "
-msgstr "PayPal thÃ nh cÃŽng:"
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "PayPal Abgelehnt: "
-msgstr "PayPal Bá» tá»« chá»i:"
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "PayPal Fehler: Zahlung konnte nicht erneut ausgefÃŒhrt werden"
-msgstr "PayPal Lá»i: thanh toÃ¡n khÃŽng thá» ÄÆ°á»£c thá»±c hiá»n má»t láº§n ná»¯a"
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "PayPal Fehler: #1#"
-msgstr "lá»i PayPal: # 1 #"
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "PayPal Fehler, bitte Shop Betreiber kontaktieren."
-msgstr "PayPal lá»i, xin vui lÃ²ng liÃªn há» vá»i cÃ¡c nhÃ  Äiá»u hÃ nh cá»­a hÃ ng."
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "WebHook ist bereits registriert."
-msgstr "Webhook ÄÃ£ ÄÆ°á»£c ÄÄng kÃœ."
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid ""
-"WebHook konnte nicht abgefragt/angelegt werden. Zugangsdaten ÃŒberprÃŒfen und "
-"erneut speichern."
-msgstr ""
-"Webhook khÃŽng thá» ÄÆ°á»£c truy váº¥n / Ã¡p dá»¥ng. Kiá»m tra thÃŽng tin vÃ  lÆ°u láº¡i."
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "WebHook erfolgreich angelegt."
-msgstr "Webhook táº¡o thÃ nh cÃŽng."
-
-#: ../mods/wpsg_mod_paypal.class.php:11
-msgid "WebHook konnte nicht angelegt werden. (#1#)"
-msgstr "Webhook khÃŽng thá» ÄÆ°á»£c táº¡o ra. (# 1 #)"
-
-#: ../mods/wpsg_mod_prepayment.class.php:2
-msgid ""
-"Die Zahlungsart \"Vorkasse\" ist aktiv, es wurden aber nur unvollstÃ€ndige "
-"Kontodaten angegeben. ÃberprÃŒfen Sie die <a href=\"#1#\">"
-"Moduleinstellungen</a>."
-msgstr ""
-"CÃ¡c phÆ°Æ¡ng thá»©c thanh toÃ¡n \"táº¡m á»©ng\" Äang hoáº¡t Äá»ng, nhÆ°ng chá» cÃ³ khÃŽng "
-"Äáº§y Äá»§ dá»¯ liá»u tÃ i khoáº£n ÄÃ£ ÄÆ°á»£c cung cáº¥p. Kiá»m tra <a href=\"#1#\"> thiáº¿t "
-"láº­p mÃŽ-Äun mÃ£."
-
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:21
-msgid "AuftragsbestÃ€tigung versendet an:#1#"
-msgstr "XÃ¡c nháº­n ÄÆ¡n hÃ ng gá»­i vá»: # 1 #"
-
-#: ../mods/wpsg_mod_scaleprice.class.php:2
-msgid "ErmÃ¶glicht eine gestaffelte Preisgestaltung"
-msgstr "Cho phÃ©p giÃ¡ cáº£ táº§ng"
-
-#: ../mods/wpsg_mod_scaleprice.class.php:13
-msgid "Preisstaffel im Produkttemplate anzeigen"
-msgstr "quy mÃŽ Hiá»n thá» giÃ¡ trong máº«u sáº£n pháº©m"
-
-#: ../mods/wpsg_mod_stock.class.php:5
-msgid "Nicht angegeben!"
-msgstr "BÃ­ máº­t!"
-
-#: ../mods/wpsg_mod_stock.class.php:5
-msgid "Aufrufsfehler! Fehlercode:#1#"
-msgstr "Lá»i cuá»c gá»i! Error code: # 1 #"
-
-#: ../mods/wpsg_mod_stock.class.php:28
-msgid "Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet! "
-msgstr "Khá»i lÆ°á»£ng ÄÃ£ ÄÆ°á»£c sá»­a chá»¯a vÃ¬ nÃ³ vÆ°á»£t quÃ¡ hÃ ng tá»n kho!"
-
-#: ../mods/wpsg_mod_stock.class.php:28
-msgid ""
-"Die ausgewÃ€hlte Menge wurde korrigiert, da sie den Warenbestand "
-"ÃŒberschreitet!"
-msgstr "Sá» lÆ°á»£ng ÄÆ°á»£c lá»±a chá»n ÄÃ£ ÄÆ°á»£c sá»­a chá»¯a vÃ¬ nÃ³ vÆ°á»£t quÃ¡ hÃ ng tá»n kho!"
-
-#: ../mods/wpsg_mod_stock.class.php:28
-msgid ""
-"Bitte beachten Sie, dass die ausgewÃ€hlte Menge den Warenbestand "
-"ÃŒberschreitet, die Bestellung jedoch abgeschlossen werden kann! Bei Fragen "
-"zur Bestellung, wenden Sie sich bitte an uns."
-msgstr ""
-"Xin lÆ°u Ãœ ráº±ng sá» lÆ°á»£ng ÄÃ£ chá»n vÆ°á»£t quÃ¡ sá» lÆ°á»£ng cÃ³ sáºµn, theo thá»© tá»±, nhÆ°ng "
-"cÃ³ thá» ÄÆ°á»£c hoÃ n thÃ nh! Náº¿u báº¡n cÃ³ tháº¯c máº¯c vá» Äáº·t hÃ ng, xin vui lÃ²ng liÃªn "
-"há» vá»i chÃºng tÃŽi."
-
-#: ../mods/wpsg_mod_stock.class.php:28
-msgid ""
-"Der Lagerbestand von Produkt \"#1#\" hat sich zwischenzeitlich verÃ€ndert. Es "
-"sind nur noch #1# StÃŒck verfÃŒgbar."
-msgstr ""
-"Cá» phiáº¿u cá»§a sáº£n pháº©m \"# 1 #\" ÄÃ£ thay Äá»i trong khi chá» Äá»£i. Chá» cÃ³ má»t # "
-"1 # Pieces sáºµn."
-
-#: ../mods/wpsg_mod_topseller.class.php:2
-msgid "TopSeller"
-msgstr "TopSeller"
-
-#: ../mods/wpsg_mod_topseller.class.php:2
-msgid "ErmÃ¶glicht es Produkte als \"TopSeller\" darzustellen."
-msgstr "Cho phÃ©p cÃ¡c sáº£n pháº©m nhÆ° mÃ n hÃ¬nh \"TopSeller\"."
-
-#: ../mods/wpsg_mod_gutschein.class.php:25
-msgid ""
-"Gutschein wurde entfernt, da er nicht mit Produkt #1# verwendet werden kann"
-msgstr ""
-"Phiáº¿u giáº£m giÃ¡ ÄÃ£ ÄÆ°á»£c gá»¡ bá», vÃ¬ nÃ³ khÃŽng thá» ÄÆ°á»£c sá»­ dá»¥ng vá»i sáº£n pháº©m # 1 #"
-
-#: ../mods/wpsg_mod_gutschein.class.php:25
-msgid ""
-"Gutschein wurde entfernt, da der Mindestbestellwert von #1# unterschritten "
-"wurden."
-msgstr "Voucher ÄÃ£ bá» xÃ³a do trÃ¬nh tá»± tá»i thiá»u cá»§a # 1 # lÃ  chÃ¬a."
-
-#: ../mods/wpsg_mod_gutschein.class.php:35
-msgid "Gutschein einfÃŒgen im Warenkorb verbergen"
-msgstr "Phiáº¿u giáº£m giÃ¡ chÃšn trong giá» mua hÃ ng cá»§a báº¡n áº©n"
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:2
-msgid ""
-"ErmÃ¶glicht eine Kundenverwaltung mit Profil, Kundengruppen, Registrierung "
-"und Login Mechanismen."
-msgstr ""
-"Cho phÃ©p quáº£n lÃœ khÃ¡ch hÃ ng vá»i há» sÆ¡, nhÃ³m khÃ¡ch hÃ ng, ÄÄng kÃœ vÃ  cÆ¡ cháº¿ "
-"ÄÄng nháº­p."
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Registrierung abgeschlossen"
-msgstr "ÄÄng kÃœ hoÃ n thÃ nh"
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid ""
-"Es gibt einen Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich erst "
-"an, bevor sie bestellen. (Auch im Wordpress)"
-msgstr ""
-"CÃ³ má»t ngÆ°á»i dÃ¹ng vá»i Äá»a chá» email nÃ y. Vui lÃ²ng ÄÄng nháº­p trÆ°á»c khi há» mua "
-"hÃ ng. (CÅ©ng trong WordPress)"
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Es existiert bereits ein Wordpress Nutzer mit dieser E-Mail Adresse."
-msgstr "ÄÃ£ cÃ³ má»t ngÆ°á»i sá»­ dá»¥ng WordPress vá»i Äá»a chá» email nÃ y."
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Passwortwiederholung ist nicht korrekt. Passwort wurde nicht geÃ€ndert!"
-msgstr "Láº·p láº¡i máº­t kháº©u khÃŽng ÄÃºng. Máº­t kháº©u ÄÃ£ ÄÆ°á»£c khÃŽng thay Äá»i!"
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid ""
-"Passwort kann nicht verÃ€ndert werden, da sie nicht im Wordpress Backend "
-"angemeldet sind."
-msgstr ""
-"Máº­t kháº©u khÃŽng thá» ÄÆ°á»£c thay Äá»i, bá»i vÃ¬ há» khÃŽng ÄÄng nháº­p trong WordPress "
-"phá»¥ trá»£."
-
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:46
-msgid "Es gab ein Problem beim anlegen des Wordpress Nutzers: "
-msgstr "CÃ³ má»t váº¥n Äá» táº¡o ngÆ°á»i sá»­ dá»¥ng WordPress trong:"
-
-#: ../mods/wpsg_mod_relatedproducts.class.php:10
-msgid "FÃŒr jedes Produkt einstellbar"
-msgstr "Äiá»u chá»nh cho má»i sáº£n pháº©m"
-
-#: ../mods/wpsg_mod_autodebit.class.php:20
-msgid "Bitte die BIC der Bank kontrollieren (Bankeinzug)"
-msgstr "Xin BIC cá»§a phiáº¿u ngÃ¢n hÃ ng (ghi ná»£)"
-
-#: ../mods/wpsg_mod_autodebit.class.php:20
-msgid "Bitte die IBAN Nr ÃŒberprÃŒfen (Bankeinzug)"
-msgstr "Vui lÃ²ng kiá»m tra sá» IBAN (ghi ná»£)"
-
-#: ../mods/wpsg_mod_autodebit.class.php:20
-msgid "Bitte die Kontonummer ÃŒberprÃŒfen (Bankeinzug)"
-msgstr "Vui lÃ²ng kiá»m tra sá» tÃ i khoáº£n (ghi ná»£)"
-
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "SOAP Fehler: #1#"
-msgstr "lá»i SOAP: # 1 #"
-
-#: ../mods/wpsg_mod_invoice_type.class.php:2
-msgid ""
-"Zahlen Sie die Bestellung auf Rechnung. Die Ware wird dann nach Erhalt des "
-"Rechnungsbetrags versendet."
-msgstr "Tráº£ tá»± trÃªn tÃ i khoáº£n. HÃ ng hÃ³a sáºœ ÄÆ°á»£c gá»­i khi nháº­n ÄÆ°á»£c hÃ³a ÄÆ¡n."
-
-#: ../mods/wpsg_mod_shippingadress.class.php:1
-msgid ""
-"Erlaubt das Angeben einer Lieferadresse, unabhÃ€ngig von der Rechnungsadresse."
-msgstr ""
-"Cho phÃ©p báº¡n chá» Äá»nh má»t Äá»a chá» giao hÃ ng, khÃŽng phá»¥ thuá»c vÃ o Äá»a chá» "
-"thanh toÃ¡n."
-
-#: ../mods/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php:2
-msgid "Trusted Shops Siegel/Bewertung"
-msgstr "Trusted Cá»­a Seal / Xem láº¡i"
-
-#: ../mods/wpsg_mod_productvars.class.php:10
-msgid "\"Leere\" Produktvariablen anzeigen"
-msgstr "Xem biáº¿n sáº£n pháº©m \"rá»ng\""
-
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Text Excel 2007"
-msgstr "VÄn báº£n Excel 2007"
-
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "BIC der Bank (Bankeinzug)"
-msgstr "BIC cá»§a ngÃ¢n hÃ ng (ghi ná»£)"
-
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "IBAN Nummer (Bankeinzug)"
-msgstr "sá» IBAN (ghi ná»£)"
-
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Rechnungskorrekturnummer"
-msgstr "sá» Correction Bill"
-
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Datum der Rechnung/Rechnungskorrektur"
-msgstr "NgÃ y hÃ³a ÄÆ¡n / Äiá»u chá»nh HoÃ¡ ÄÆ¡n"
-
-#: ../mods/wpsg_mod_micropayment.class.php:2
-msgid "micropaymentâ¢"
-msgstr "micropaymentâ¢"
-
-#: ../mods/wpsg_mod_micropayment.class.php:2
-msgid ""
-"ErmÃ¶glicht die Zahlung ÃŒber den Zahlungsdienstleister <a href=\"http://r132."
-"micropayment.de\">micropaymentâ¢</a>."
-msgstr ""
-"Cho phÃ©p thanh toÃ¡n báº±ng cÃ¡c dá»ch vá»¥ thanh toÃ¡n <a href=\"http://r132."
-"micropayment.de\"> Äang micropayment â¢."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per Kreditkarte"
-msgstr "thanh toÃ¡n tháº» tÃ­n dá»¥ng"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per Kreditkarte (Reservierung)"
-msgstr "Thanh toÃ¡n báº±ng tháº» tÃ­n dá»¥ng (Äáº·t phÃ²ng)"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per Lastschrift"
-msgstr "Thanh toÃ¡n báº±ng tháº» ghi ná»£ trá»±c tiáº¿p"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per Online Banking"
-msgstr "Thanh toÃ¡n qua ngÃ¢n hÃ ng trá»±c tuyáº¿n"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per Vorkasse"
-msgstr "Thanh toÃ¡n trÆ°á»c"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per Anruf / Telefon"
-msgstr "Thanh toÃ¡n cho má»i cuá»c gá»i / Äiá»n thoáº¡i"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Abrechnung per SMS / TAN"
-msgstr "Thanh toÃ¡n qua SMS / TÃN"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Erfolgreiche Zahlung"
-msgstr "Thanh toÃ¡n thÃ nh cÃŽng"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Zahlung reserviert"
-msgstr "thanh toÃ¡n Ltd."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Reservierung eingelÃ¶st"
-msgstr "Äáº·t phÃ²ng ÄÆ°á»£c mua láº¡i"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Bitte die Kreditkartennummer angeben."
-msgstr "HÃ£y xÃ¡c Äá»nh cÃ¡c sá» tháº» tÃ­n dá»¥ng."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Bitte die PrÃŒfziffer der Kreditkarte angeben."
-msgstr "Xin cho biáº¿t sá» kiá»m tra cá»§a tháº» tÃ­n dá»¥ng."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Erfolgreiche Micropayment Authorisierung"
-msgstr "uá»· quyá»n micropayment thÃ nh cÃŽng"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Authorisierung konnte nicht durchgefÃŒhrt werden."
-msgstr "Uá»· quyá»n khÃŽng thá» ÄÆ°á»£c thá»±c hiá»n."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Session fÃŒr Zahlung konnte nicht aufgebaut werden."
-msgstr "Session cho thanh toÃ¡n khÃŽng thá» ÄÆ°á»£c thiáº¿t láº­p."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Die Kreditkartendaten wurden nicht akzeptiert."
-msgstr "CÃ¡c chi tiáº¿t tháº» tÃ­n dá»¥ng khÃŽng ÄÆ°á»£c cháº¥p nháº­n."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Micropayment REQUEST"
-msgstr "micropayment YÃU CáºŠU"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Micropayment: Zahlung wurde gebucht"
-msgstr "Micropayment: thanh toÃ¡n thá»±c hiá»n"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Reservierung konnte nicht gebucht werden. Status auf #1# zurÃŒckgesetzt."
-msgstr "Äáº·t phÃ²ng cÃ³ thá» khÃŽng ÄÆ°á»£c ÄÄng. TÃ¬nh tráº¡ng trÃªn # 1 # thiáº¿t láº­p láº¡i."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid ""
-"Micropayment: Zahlung konnte nicht freigegeben werden / Status auf #1# "
-"zurÃŒckgesetzt."
-msgstr ""
-"Micropayment: thanh toÃ¡n cÃ³ thá» khÃŽng ÄÆ°á»£c phÃ¡t hÃ nh / tráº¡ng thÃ¡i trÃªn # 1 # "
-"thiáº¿t láº­p láº¡i."
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Micropayment: Zahlungsreservierung wurde erfolgreich storniert"
-msgstr "Micropayment: phÃ²ng thanh toÃ¡n ÄÃ£ bá» há»§y"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Zahlungsreservierung konnte nicht aufgehoben werden"
-msgstr "phÃ²ng thanh toÃ¡n khÃŽng thá» bá» há»§y bá»"
-
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Micropayment: Zahlungsreservierung konnte nicht aufgehoben werden"
-msgstr "Micropayment: phÃ²ng thanh toÃ¡n khÃŽng thá» bá» há»§y bá»"
-
-#: ../mods/wpsg_mod_ordercondition.class.php:2
-msgid ""
-"ErmÃ¶glicht das Abfragen von Bedingungen zu Bestellungen oder einzelnen "
-"bestellten Produkten."
-msgstr ""
-"Cho phÃ©p truy váº¥n cÃ¡c Äiá»u kiá»n Äá» cÃ¡c ÄÆ¡n Äáº·t hÃ ng hoáº·c sáº£n pháº©m cÃ¡ nhÃ¢n ra "
-"lá»nh."
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid "AGB + Widerrufsbelehrung"
-msgstr "Äiá»u khoáº£n + Äiá»u kiá»n"
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid ""
-"Ich habe die <a href=\"%agb_url%\" target=\"_blank\">AGB</a> des Anbieters "
-"gelesen und erklÃ€re mit dem Absenden der Bestellung mein EinverstÃ€ndnis. Die "
-"<a href=\"%widerruf_url%\" target=\"_blank\">Widerrufsbelehrung</a> habe ich "
-"zur Kenntnis genommen."
-msgstr ""
-"TÃŽi ÄÃ£ Äá»c <a href=\"%agb_url%\" target=\"_blank\"> Äiá»u khoáº£n cá»§a mÃ£ tá»« cÃ¡c "
-"nhÃ  cung cáº¥p vÃ  giáº£i thÃ­ch vá»i viá»c gá»­i cÃ¡c lá»nh Äá»ng Ãœ cá»§a tÃŽi. MÃ£ <a "
-"href=\"%widerruf_url%\" target=\"_blank\"> Thu há»i tÃŽi nháº­n thá»©c."
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid ""
-"Sie mÃŒssen unsere <a href=\"%agb_url%\" target=\"_blank\">AGB</a> und <a "
-"href=\"%widerruf_url%\" target=\"_blank\">Widerrufsbelehrung</a> akzeptieren."
-msgstr ""
-"Báº¡n cáº§n <a href=\"%agb_url%\" target=\"_blank\"> Äiá»u khoáº£n cá»§a chÃºng tÃŽi "
-"</a> vÃ  cháº¥p nháº­n <a href=\"%widerruf_url%\" target=\"_blank\"> thu há»i."
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid "Bestimmungen zu Dienstleistungen"
-msgstr "Quy Äá»nh cho cÃ¡c dá»ch vá»¥"
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid ""
-"Ich bin einverstanden, dass Sie vor Ende der Widerrufsfrist mit der "
-"AusfÃŒhrung der beauftragten Dienstleistung beginnen. Mir ist bekannt, dass "
-"ich im Falle des Widerrufs Wertersatz fÃŒr die bereits erbrachten "
-"Dienstleistungen leisten muss. Ich stimme zu, dass der Vertrag von beiden "
-"Seiten vollstÃ€ndig erfÃŒllt wird, bevor ich mein Widerrufsrecht ausgeÃŒbt habe."
-" Das Widerrufsrecht erlischt in diesem Fall vorzeitig."
-msgstr ""
-"TÃŽi Äá»ng Ãœ ráº±ng báº¡n báº¯t Äáº§u trÆ°á»c khi káº¿t thÃºc thá»i háº¡n thu há»i vá»i viá»c "
-"thá»±c hiá»n cÃ¡c dá»ch vá»¥ kÃœ há»£p Äá»ng. TÃŽi biáº¿t ráº±ng trong trÆ°á»ng há»£p thu há»i, "
-"tÃŽi pháº£i tráº£ tiá»n bá»i thÆ°á»ng cho cÃ¡c dá»ch vá»¥ ÄÃ£ cung cáº¥p. TÃŽi Äá»ng Ãœ ráº±ng "
-"há»£p Äá»ng lÃ  hoÃ n toÃ n thá»±c hiá»n bá»i cáº£ hai bÃªn trÆ°á»c khi tÃŽi thá»±c hiá»n quyá»n "
-"cá»§a mÃ¬nh rÃºt lui. Quyá»n nÃ y háº¿t háº¡n sá»m trong trÆ°á»ng há»£p nÃ y."
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid "Sie mÃŒssen die Bestimmungen fÃŒr Dienstleistungen akzeptieren."
-msgstr "Báº¡n pháº£i cháº¥p nháº­n cÃ¡c Äiá»u khoáº£n cá»§a dá»ch vá»¥."
-
-#: ../mods/wpsg_mod_ordercondition.class.php:12
-msgid "Anklicken um den Namen der Bestellbedingung zu Ã€ndern ..."
-msgstr "Nháº¥n vÃ o ÄÃ¢y Äá» thay Äá»i tÃªn cá»§a cÃ¡c Äiá»u kiá»n Äá» ..."
-
-#: ../mods/wpsg_mod_ordercondition.class.php:21
-msgid ""
-"Sie haben das Modul \"Bestellbedingungen\" aktiviert, es sind aber keine "
-"Bestellbedingungen definiert. ÃberprÃŒfen Sie die <a href=\"#1#\">"
-"Modulkonfiguration</a>, ihr Shop ist mÃ¶glicherweise nicht rechtssicher."
-msgstr ""
-"Báº¡n cÃ³ module \"quy táº¯c thá»© tá»±\", nhÆ°ng khÃŽng cÃ³ Äiá»u kiá»n Äá» gÃ ng. Kiá»m tra "
-"mÃ£ cáº¥u hÃ¬nh mÃŽ-Äun <a href=\"#1#\">, cá»­a hÃ ng cá»§a báº¡n cÃ³ thá» khÃŽng hoÃ n toÃ n "
-"cháº¯c cháº¯n."
-
-#: ../mods/wpsg_mod_downloadprodukte.class.php:1
-msgid ""
-"ErmÃ¶glicht es, Downloads als Produkt zu verkaufen. Diese Produkte kÃ¶nnen bei "
-"Sofortbezahlung (z.B. Paypal oder SofortÃŒberweisung) vom Kunden direkt "
-"heruntergeladen werden. Nach Zahlungseingang erhÃ€lt der Kunde eine E-Mail "
-"mit personalisiertem Downloadlink."
-msgstr ""
-"Cho phÃ©p táº£i vá» Äá» bÃ¡n nhÆ° má»t sáº£n pháº©m. Nhá»¯ng sáº£n pháº©m nÃ y cÃ³ thá» ÄÆ°á»£c táº£i "
-"vá» trá»±c tiáº¿p tá»« thanh toÃ¡n tá»©c thá»i (nhÆ° Paypal hoáº·c SofortÃŒberweisung) cá»§a "
-"khÃ¡ch hÃ ng. Sau khi thanh toÃ¡n, khÃ¡ch hÃ ng nháº­n ÄÆ°á»£c má»t email vá»i cÃ¡c liÃªn "
-"káº¿t táº£i vá» cÃ¡ nhÃ¢n."
-
-#: ../mods/wpsg_mod_debitpayment.class.php:2
-msgid ""
-"Der Rechnungsbetrag wird an den Zusteller bar gezahlt. Hierbei kÃ¶nnen "
-"zusÃ€tzliche Kosten entstehen."
-msgstr ""
-"LÆ°á»£ng hÃ³a ÄÆ¡n ÄÆ°á»£c thanh toÃ¡n Äá» thanh phÃ¢n phá»i. á» ÄÃ¢y, cÃ¡c khoáº£n phÃ­ bá» "
-"sung cÃ³ thá» ÄÆ°á»£c Ã¡p dá»¥ng."
-
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1
-msgid "Erlaubt es in der Bestellverwaltung dem Kunden E-Mails zu senden."
-msgstr "Cho phÃ©p khÃ¡ch hÃ ng Äá» gá»­i e-mail trong quáº£n lÃœ tráº­t tá»±."
-
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1
-msgid "E-Mail, die vom Kundenkontakt Modul versendet wird."
-msgstr "Email ÄÆ°á»£c gá»­i tá»« cÃ¡c module liÃªn láº¡c cá»§a khÃ¡ch hÃ ng."
-
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1
-msgid ""
-"Diese Mail kann in der Bestellverwaltung an den Kunden versendet werden."
-msgstr "tá»­ nÃ y cÃ³ thá» ÄÆ°á»£c gá»­i trong quáº£n lÃœ tráº­t tá»± cho khÃ¡ch hÃ ng."
-
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1
-msgid "Kundenkontakt \"#1#\""
-msgstr "Gá»i \"# 1 #\""
-
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "Kein Abonnent gefunden"
-msgstr "KhÃŽng tÃ¬m tháº¥y thuÃª bao"
-
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "Mehrere Abonnenten!"
-msgstr "Má»t sá» ngÆ°á»i ÄÄng kÃœ!"
-
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "auf BestÃ€tigung warten"
-msgstr "Äang chá» xÃ¡c nháº­n"
-
-#: ../mods/wpsg_mod_versandarten.class.php:2
-msgid "ErmÃ¶glicht die Verwaltung von Versandkosten/Lieferanten."
-msgstr "Cho phÃ©p quáº£n lÃœ váº­n chuyá»n / nhÃ  cung cáº¥p."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:2
-msgid "Aufrufsfehler!"
-msgstr "Lá»i trong quÃ¡ trÃ¬nh kÃ­ch hoáº¡t!"
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:2
-msgid "Aufrufsfehler!!"
-msgstr "Lá»i trong quÃ¡ trÃ¬nh kÃ­ch hoáº¡t!!!"
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:2
-msgid "Produkt erfolgreich in den Warenkorb gelegt."
-msgstr "ÄÃ£ thÃªm sáº£n pháº©m vÃ o giá» hÃ ng."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:2
-msgid "Ein Gutschein mit diesem Code existiert nicht!"
-msgstr "Phiáº¿u mua hÃ ng vá»i mÃ£ trÃªn khÃŽng tá»n táº¡i."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:2
-msgid "Dieser Gutscheincode ist nicht gÃŒltig!"
-msgstr "Phiáº¿u mua hÃ ng khÃŽng há»£p lá»!"
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:2
-msgid ""
-"Dieser Gutscheincode wurde bereits eingelÃ¶st und ist nicht mehrfach "
-"verwendbar."
-msgstr "MÃ£ phiáº¿u mua hÃ ng nÃ y ÄÃ£ ÄÆ°á»£c sá»­ dá»¥ng vÃ  khÃŽng cÃ²n giÃ¡ trá»."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4
-msgid "Gutschein wurde der Bestellung erfolgreich hinzugefÃŒgt."
-msgstr "ÄÃ£ thÃªm phiáº¿u mua hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4
-msgid ""
-"Sie mÃŒssen unsere #1# und #2# gelesen haben, um eine Bestellung "
-"durchzufÃŒhren! Bitte setzen Sie unten das entsprechende HÃ€kchen!"
-msgstr ""
-"Äá» thá»±c hiá»n ÄÆ¡n hÃ ng, vui lÃ²ng ÄÃ¡nh dáº¥u vÃ o ÃŽ Äá» xÃ¡c nháº­n báº¡n ÄÃ£ Äá»c vÃ  "
-"Äá»ng Ãœ vá»i #1# vÃ  #2#."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4 
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../lib/wpsg_basket_widget.class.php:7 ../views/admin/seiten.phtml:31 
-#: ../views/warenkorb/overview.phtml:29
-msgid "AGB"
-msgstr "CÃ¡c Äiá»u khoáº£n vÃ  Äiá»u kiá»n chung"
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4 
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../lib/wpsg_basket_widget.class.php:8 
-#: ../views/mailtemplates/kundenmail.phtml:95 
-#: ../views/mailtemplates/html/kundenmail.phtml:32 
-#: ../views/admin/seiten.phtml:33 ../views/admin/widerrufsbelehrung.phtml:28 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:36 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:137 
-#: ../views/warenkorb/overview.phtml:30
-msgid "Widerrufsbelehrung"
-msgstr "Quyá»n huá»· bá»"
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4
-msgid "Gutschein erfolgreich entfernt."
-msgstr "ÄÃ£ huá»· bá» phiáº¿u mua hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4
-msgid "Produkt erfolgreich entfernt."
-msgstr "ÄÃ£ huá»· bá» sáº£n pháº©m thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4
-msgid "Warenkorb erfolgreich aktualisiert"
-msgstr "ÄÃ£ cáº­p nháº­t giá» hÃ ng."
-
-# @ wpsg
-#: ../controller/wpsg_BasketController.class.php:4
-msgid "Unerwarteter Fehler!"
-msgstr "Lá»i khÃŽng ÄÆ°á»£c dá»± bÃ¡o!"
-
-# @ wpsg
-#: ../controller/wpsg_SystemController.class.php:2
-msgid "Templatedatei existiert nicht (#1#) !"
-msgstr "KhÃŽng tÃ¬m tháº¥y tá»p tin cho máº«u (#1#)!"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Kein Zugriff"
-msgstr "KhÃŽng truy cáº­p ÄÆ°á»£c"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2 
-#: ../views/produkt/addedit.phtml:313 ../views/order/view.phtml:331 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Allgemein"
-msgstr "CÃ i Äáº·t chung"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Einstellungen sichern"
-msgstr "LÆ°u cÃ i Äáº·t"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Blognetzwerk"
-msgstr "Máº¡ng Blog"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Pfade"
-msgstr "ÄÆ°á»ng dáº«n"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Preiskalkulation"
-msgstr "TÃ­nh giÃ¡"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Berechtigungen"
-msgstr "Uá»· quyá»n"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Bibliotheken/Includes"
-msgstr "ThÆ° má»¥c/Bao gá»m"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Seitenkonfiguration"
-msgstr "CÃ i Äáº·t trang"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2 
-#: ../views/order/view.phtml:170 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:124 
-#: ../views/warenkorb/progress.phtml:19
-msgid "Kundendaten"
-msgstr "Dá»¯ liá»u khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2 
-#: ../views/admin/emailconf.phtml:26
-msgid "E-Mail Konfiguration"
-msgstr "CÃ i Äáº·t E-Mail"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2 
-#: ../views/admin/versandzonen.phtml:120
-msgid "Versandzonen"
-msgstr "VÃ¹ng giao hÃ ng"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "LÃ€nderverwaltung"
-msgstr "Quáº£n lÃœ theo quá»c gia"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:2
-msgid "Deinstallieren"
-msgstr "Dá»¡ cÃ i Äáº·t"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:36 
-#: ../mods/wpsg_mod_produktattribute.class.php:16
-msgid "Anklicken um Bezeichnung zu Ã€ndern ..."
-msgstr "Nháº¥p Äá» thay Äá»i miÃªu táº£âŠ"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Produkte erfolgreich gelÃ¶scht."
-msgstr "XoÃ¡ sáº£n pháº©m thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Kunden erfolgreich gelÃ¶scht."
-msgstr "XoÃ¡ khÃ¡ch hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:36
-msgid "Bestellungen erfolgreich gelÃ¶scht."
-msgstr "XoÃ¡ ÄÆ¡n hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:43 
-#: ../views/admin/laender_edit.phtml:11 ../views/admin/laender.phtml:58
-msgid "keine MwSt. bei USt.IdNr."
-msgstr "chÆ°a gá»m thuáº¿ GTGT cho mÃ£ sá» thuáº¿"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:44 
-#: ../views/admin/laender_edit.phtml:10 ../views/admin/laender.phtml:60
-msgid "keine MwSt."
-msgstr "chÆ°a gá»m thuáº¿ GTGT"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:45 
-#: ../views/admin/laender_edit.phtml:9 ../views/admin/laender.phtml:62
-msgid "mit MwSt."
-msgstr "gá»m thuáº¿ GTGT"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Kundenvariablen erfolgreich gespeichert."
-msgstr "LÆ°u thÃ nh cÃŽng thÃŽng tin khÃ¡ch hÃ ng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "Neues benutzerdefiniertes Feld"
-msgstr "VÃ¹ng tuá»³ biáº¿n má»i"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:54
-msgid "E-Mail Konfiguration erfolgreich gespeichert."
-msgstr "ÄÃ£ lÆ°u cÃ i Äáº·t E-Mail thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:54 
-#: ../mods/wpsg_mod_su.class.php:2 ../mods/wpsg_mod_paypal.class.php:2 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7 
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Neu anlegen und zuordnen"
-msgstr "Táº¡o má»i vÃ  chá»nh sá»­a"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:54 
-#: ../mods/wpsg_mod_legaltexts.class.php:2 
-#: ../mods/wpsg_mod_trustedshops.class.php:2 
-#: ../mods/wpsg_mod_gutschein.class.php:2 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:2 
-#: ../mods/wpsg_mod_export.class.php:2 ../mods/wpsg_mod_nlsatolo.class.php:2 
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1 
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "Sonstiges"
-msgstr "KhÃ¡c"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:54 
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Einstellungen gespeichert."
-msgstr "ÄÃ£ lÆ°u cÃ i Äáº·t."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Keine gÃŒltige XML Einstellungsdatei angegeben!"
-msgstr "Tá»p cÃ i Äáº·t XML cÃ³ hiá»u lá»±c chÆ°a ÄÆ°á»£c xÃ¡c Äá»nh!"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Einstellungen wurden erfolgreich importiert."
-msgstr "CÃ i Äáº·t ÄÆ°á»£c nháº­p thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Bitte eine Einstellungsdatei angeben!"
-msgstr "Vui lÃ²ng cung cáº¥p má»t tá»p cho CÃ i Äáº·t!"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Einstellung gespeichert."
-msgstr "ÄÃ£ lÆ°u cÃ i Äáº·t."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Berechtigungen gespeichert."
-msgstr "ÄÃ£ lÆ°u uá»· quyá»n."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../views/mailtemplates/html/adminmail.phtml:16 
-#: ../views/mailtemplates/html/kundenmail.phtml:15 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:19 
-#: ../views/warenkorb/progress.phtml:12 ../views/warenkorb/index.phtml:9
-msgid "Warenkorb"
-msgstr "Giá» hÃ ng"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../lib/wpsg_basket_widget.class.php:10 
-#: ../views/produkttemplates/ausverkauft.phtml:62 
-#: ../views/produkttemplates/ausverkauft.phtml:69 
-#: ../views/produkttemplates/ausverkauft.phtml:71 
-#: ../views/produkttemplates/standard.phtml:87 
-#: ../views/produkttemplates/standard.phtml:94 
-#: ../views/produkttemplates/standard.phtml:96 
-#: ../views/produkttemplates/standard_productindex.phtml:79 
-#: ../views/produkttemplates/standard_productindex.phtml:86 
-#: ../views/produkttemplates/standard_productindex.phtml:88 
-#: ../views/mailtemplates/html/order.phtml:99 ../views/admin/seiten.phtml:30 
-#: ../views/order/view.phtml:489 ../views/order/view.phtml:492 
-#: ../views/order/view.phtml:494 ../views/order/view.phtml:505 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:105 
-#: ../views/mods/mod_productindex/layouts/list.phtml:152 
-#: ../views/mods/mod_productindex/layouts/list.phtml:157 
-#: ../views/mods/mod_productindex/layouts/list.phtml:159 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:156 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:161 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:163 
-#: ../views/warenkorb/index.phtml:76 ../views/warenkorb/index.phtml:78 
-#: ../views/warenkorb/overview.phtml:180 ../views/warenkorb/overview.phtml:183 
-#: ../views/warenkorb/overview.phtml:185 ../views/warenkorb/basket.phtml:127 
-#: ../views/warenkorb/basket.phtml:130 ../views/warenkorb/basket.phtml:132 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Versandkosten"
-msgstr "Chi phÃ­ váº­n chuyá»n"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 ../views/admin/seiten.phtml:32
-msgid "Datenschutz"
-msgstr "ChÃ­nh sÃ¡ch riÃªng tÆ°"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68 
-#: ../controller/wpsg_ShopController.class.php:1 
-#: ../lib/wpsg_basket_widget.class.php:12 ../views/admin/seiten.phtml:35
-msgid "Impressum"
-msgstr "Báº£n quyá»n"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Seiteneinstellungen bearbeitet."
-msgstr "CÃ i Äáº·t trang ÄÃ£ ÄÆ°á»£c thay Äá»i."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Moduleinstellungen gespeichert"
-msgstr "CÃ i Äáº·t Module ÄÃ£ ÄÆ°á»£c lÆ°u."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Datenbank erfolgreich abgeglichen!"
-msgstr "CÆ¡ sá» dá»¯ liá»u ÄÃ£ ÄÆ°á»£c Äá»ng bá» hoÃ¡ thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Datenbank aktualisiert"
-msgstr "ÄÃ£ cáº­p nháº­t cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid ""
-"Noch kein Hilfetext hinterlegt. Bitte versuchen Sie es spÃ€ter noch einmal."
-"<br />Hilfe finden sie auch unter <a href=\"http://forum.maennchen1.de\">"
-"http://forum.maennchen1.de</a>"
-msgstr ""
-"ChÆ°a cÃ³ vÄn báº£n há» trá»£ nÃ o ÄÆ°á»£c xÃ¡c Äá»nh. Vui lÃ²ng thá»­ láº¡i sau.<br /><a "
-"href=\"http://forum.maennchen1.de\">http://forum.maennchen1.de</a>"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Bitte lÃ¶schen sie vor dem Import alle Bestelldaten!"
-msgstr "Vui lÃ²ng xoÃ¡ táº¥t cáº£ ÄÆ¡n Äáº·t hÃ ng trÆ°á»c khi nháº­p!"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Bitte lÃ¶schen sie vor dem Import alle Kundendaten!"
-msgstr "Vui lÃ²ng xÃ³a táº¥t cáº£ khÃ¡ch hÃ ng trÆ°á»c khi nháº­p!"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid "Kein Paket hochgeladen!"
-msgstr "KhÃŽng cÃ³ gÃ³i nÃ o ÄÆ°á»£c táº£i lÃªn!"
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:68
-msgid ""
-"Version des Exportes ist nicht kompatibel, bitte importieren Sie nur aus "
-"einem wpShopGermany aus der Version 2.5.8."
-msgstr ""
-"PhiÃªn báº£n xuáº¥t dá»¯ liá»u khÃŽng tÆ°Æ¡ng thÃ­ch, vui lÃ²ng chá» nháº­p tá»« wpShopGermany "
-"tá»« phiÃªn báº£n 2.5.8."
-
-# @ wpsg
-#: ../controller/wpsg_AdminController.class.php:84
-msgid "Import war erfolgreich, bitte prÃŒfen Sie die Daten."
-msgstr "Nháº­p dá»¯ liá»u thÃ nh cÃŽng. Vui lÃ²ng kiá»m tra láº¡i dá»¯ liá»u ÄÃ£ nháº­p."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:2
-msgid "Bemerkung wurde erfolgreich gespeichert!"
-msgstr "ÄÃ£ lÆ°u bÃ¬nh luáº­n!"
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:16
-msgid "Status konnte nicht gesetzt werden!"
-msgstr "KhÃŽng thá» xÃ¡c nháº­n ÄÆ°á»£c tÃ¬nh tráº¡ng."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:16
-msgid "Status wurde erfolgreich geÃ€ndert!"
-msgstr "ÄÃ£ thay Äá»i thÃ nh cÃŽng tÃ¬nh tráº¡ng ÄÆ¡n hÃ ng!"
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:16
-msgid "Status wurde nicht geÃ€ndert, da unverÃ€ndert."
-msgstr "Tráº¡ng thÃ¡i khÃŽng ÄÆ°á»£c lÆ°u do chÆ°a ÄÆ°á»£c thay Äá»i."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:16
-msgid "Bestellung wurde storniert und Kunde benachrichtigt."
-msgstr "ÄÃ£ huá»· ÄÆ¡n hÃ ng. ÄÃ£ thÃŽng bÃ¡o vá»i khÃ¡ch hÃ ng."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:56
-msgid "Keine Bestellnummer ÃŒbergeben."
-msgstr "KhÃŽng cÃ³ sá» ÄÆ¡n hÃ ng nÃ o ÄÆ°á»£c xÃ¡c nháº­n."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:56
-msgid "Bestellung erfolgreich gelÃ¶scht."
-msgstr "ÄÆ¡n hÃ ng ÄÃ£ bá» xoÃ¡."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:56
-msgid "Keine Rechnungen gewÃ€hlt!"
-msgstr "KhÃŽng cÃ³ hoÃ¡ ÄÆ¡n nÃ o ÄÆ°á»£c chá»n!"
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126
-msgid "Bitte eine Aktion wÃ€hlen!"
-msgstr "Vui lÃ²ng chá»n má»t hoáº¡t Äá»ng!"
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126
-msgid "Bitte mindestens eine Bestellung auswÃ€hlen!"
-msgstr "Vui lÃ²ng chá»n Ã­t nháº¥t má»t ÄÆ¡n hÃ ng!"
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126
-msgid "#1# Bestellung(en) gelÃ¶scht."
-msgstr "ÄÃ£ xoÃ¡ #1# ÄÆ¡n hÃ ng."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126
-msgid ""
-"FÃŒr die gewÃ€hlten Bestellungen konnten keine Rechnungen geschrieben werden, "
-"bestehende Rechnungen mÃŒssen erst storniert werden."
-msgstr "Báº¡n cáº§n xoÃ¡ hoÃ¡ ÄÆ¡n cÅ© trÆ°á»c khi nháº­p má»t hoÃ¡ ÄÆ¡n má»i."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126
-msgid "#1# Rechnungen geschrieben"
-msgstr "#1# HoÃ¡ ÄÆ¡n ÄÃ£ ÄÆ°á»£c nháº­p."
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126 
-#: ../views/admin/loadsavesettings.phtml:30
-msgid "Download"
-msgstr "Táº£i vá»"
-
-# @ wpsg
-#: ../controller/wpsg_OrderController.class.php:126
-msgid ""
-"Status von #1# Bestellungen aktualisiert (Kunden wurden nicht benachrichtigt)"
-msgstr ""
-"Tráº¡ng thÃ¡i cá»§a #1# ÄÆ¡n hÃ ng ÄÃ£ ÄÆ°á»£c cáº­p nháº­t (KhÃ¡ch hÃ ng chÆ°a ÄÆ°á»£c thÃŽng bÃ¡o)"
-"."
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:1
-msgid "wpShopGermany DemoProdukt WordPress Artikel"
-msgstr "wpShopGermany DemoProduct WordPress Article"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:1
-msgid "wpShopGermany DemoProdukt"
-msgstr "wpShopGermany DemoProduct"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:1
-msgid "Dies ist der ProdukttextâŠ"
-msgstr "ÄÃ¢y lÃ  vÄn báº£n sáº£n pháº©mâŠ"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:1
-msgid "wpShopGermany DemoProdukt WordPress Seite"
-msgstr "wpShopGermany báº£n demo WordPress trang sáº£n pháº©m"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:1
-msgid ""
-"Aufgrund der Kleinunternehmerregelung gemÃ€Ã Â§ 19 UStG wird keine "
-"Umsatzsteuer erhoben oder ausgewiesen."
-msgstr ""
-"Theo nhÆ° quy Äá»nh dÃ nh cho doanh nghiá»p nhá», Äiá»u Â§ 19 UStG (Luáº­t thuáº¿ tiÃªu "
-"thá»¥ Äá»©c), khoáº£n thuáº¿ tiÃªu thá»¥ sáºœ khÃŽng bá» tÃ­nh."
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:11 
-#: ../views/produkttemplates/standard.phtml:203 
-#: ../views/produkttemplates/standard_productindex.phtml:180
-msgid "Ihr Warenkorb"
-msgstr "Giá» hÃ ng cá»§a báº¡n"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:11
-msgid "UngÃŒltige Anfrage!"
-msgstr "Äá» nghá» khÃŽng hiá»u lá»±c!"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:25
-msgid ""
-"Das Template (#1#) fÃŒr ein Produkt (ID:#2#) scheint nicht zu existieren!"
-msgstr "CÃ³ váº» khÃŽng cÃ³ máº«u nÃ o (#1#) cho sáº£n pháº©m (ID: #2#)"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "StatusÃ€nderung mit Email an #1# von \"#2#\" auf \"#3#\""
-msgstr "ÄÃ£ chuyá»n tráº¡ng thÃ¡i vá»i thÆ° tá»« #1# cá»§a #2# sang #3#"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "StatusÃ€nderung von \"#1#\" auf \"#2#\""
-msgstr "ÄÃ£ chuyá»n tráº¡ng thÃ¡i tá»« #1# sang #2#"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Kunde wurde nicht informiert"
-msgstr "KhÃ¡ch hÃ ng chÆ°a ÄÆ°á»£c thÃŽng bÃ¡o"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Eingegangen"
-msgstr "ÄÃ£ nháº­n"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Auftrag akzeptiert"
-msgstr "ÄÆ¡n hÃ ng ÄÆ°á»£c cháº¥p nháº­n"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Zahlung akzeptiert"
-msgstr "Thanh toÃ¡n ÄÆ°á»£c cháº¥p nháº­n"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "aktive Abos"
-msgstr "ÄÄng kÃœ Äang hoáº¡t Äá»ng"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "ausstehende AbokÃŒndigungen"
-msgstr "Äang há»§y ÄÄng kÃœ"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Mehrfachbestellung mÃ¶glich"
-msgstr "Nhiá»u ÄÆ¡n Äáº·t hÃ ng cÃ³ thá»"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Nach Ablauf des Abos"
-msgstr "sau khi háº¿t háº¡n ÄÄng kÃœ"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Zahlungsart fÃŒr automatische VerlÃ€ngerung"
-msgstr "PhÆ°Æ¡ng thá»©c thanh toÃ¡n Äá» gia háº¡n ÄÄng kÃœ tá»± Äá»ng"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Mail an Kunden"
-msgstr "ThÆ° Äáº·t hÃ ng (KhÃ¡ch hÃ ng) gá»­i"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Mail an Administator"
-msgstr "ThÆ° Äáº·t hÃ ng (quáº£n trá» viÃªn) gá»­i"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Kunde kann im Frontend"
-msgstr "HÃ nh Äá»ng cá»§a khÃ¡ch hÃ ng á» lá»i vÃ o"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Nichts"
-msgstr "khÃŽng"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "VerlÃ€ngerung direkt stoppen"
-msgstr "Ngá»«ng gia háº¡n ÄÄng kÃœ trá»±c tiáº¿p"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "VerlÃ€ngerung ÃŒber Mail an Administrator stoppen"
-msgstr "Ngá»«ng gia háº¡n ÄÄng kÃœ qua ThÆ° tá»i NgÆ°á»i quáº£n trá»"
-
-# @ wpsg
-#: controller/wpsg_ShopController.class.php:1
-msgid "Hinweistext"
-msgstr "ghi chÃº vÄn báº£n"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Rechnung geschrieben"
-msgstr "ÄÃ£ táº¡o hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Zahlung fehlgeschlagen"
-msgstr "Thanh toÃ¡n khÃŽng thÃ nh cÃŽng"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Ware versendet"
-msgstr "Sáº£n pháº©m ÄÃ£ ÄÆ°á»£c gá»­i"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "zugestellt"
-msgstr "ÄÃ£ giao hÃ ng"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "zurÃŒckgezahlt"
-msgstr "ÄÃ£ hoÃ n láº¡i tiá»n"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "storniert"
-msgstr "ÄÃ£ huá»· bá»"
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Unerwarteter Fehler beim schreiben der Ãbersetzungsdatei."
-msgstr "Lá»i khÃŽng xÃ¡c Äá»nh khi nháº­p báº£n dá»ch."
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid ""
-"<b>wpShopGermany:</b> Bitte registrieren Sie diese Domain. Sie kÃ¶nnen dies "
-"ganz einfach im <a href=\"#1#\">Lizenzmanager</a> durchfÃŒhren."
-msgstr ""
-"<b>wpShopGermany:</b> Vui lÃ²ng ÄÄng kÃœ miá»n nÃ y. Báº¡n cÃ³ thá» ÄÄng kÃœ sá»­ dá»¥ng "
-"Quáº£n lÃœ Giáº¥y phÃ©p <a href=\"#1#\">r</a>."
-
-# @ wpsg
-#: ../controller/wpsg_ShopController.class.php:48
-msgid "Versuchte Zahlung ÃŒber #1#."
-msgstr "ÄÃ£ thá»­ thanh toÃ¡n qua #1#-"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:31
-msgid "#1# Produkte wurden importiert."
-msgstr "#1# sáº£n pháº©m ÄÃ£ ÄÆ°á»£c nháº­p."
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "KOPIE"
-msgstr "SAO CHÃP"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "Produkt wurde erfolgreich kopiert."
-msgstr "Sao chÃ©p sáº£n pháº©m thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "ERROR: Ãbersetzung existiert noch nicht, das dÃŒrfte nicht passieren!"
-msgstr "Lá»I: ChÆ°a cÃ³ báº£n dá»ch, lá»i khÃŽng nÃªn xáº£y ra! "
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "Ãbersetzung erfolgreich gespeichert"
-msgstr "Báº£n dá»ch ÄÃ£ ÄÆ°á»£c lÆ°u thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "Produkt erfolgreich gespeichert."
-msgstr "Sáº£n pháº©m ÄÃ£ ÄÆ°á»£c lÆ°u thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "Produkt erfolgreich angelegt."
-msgstr "ÄÃ£ táº¡o sáº£n pháº©m thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:54
-msgid "Produkt erfolgreich gelÃ¶scht."
-msgstr "ÄÃ£ xoÃ¡ sáº£n pháº©m thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89
-msgid "Interne ID"
-msgstr "ID ná»i bá»"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89 
-#: ../views/produkt/addedit.phtml:302 ../views/produkt/select_filter.phtml:10 
-#: ../views/order/view.phtml:429 ../mods/wpsg_mod_export.class.php:22
-msgid "Produktname"
-msgstr "TÃªn sáº£n pháº©m"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89 
-#: ../views/produkttemplates/ausverkauft.phtml:49 
-#: ../views/produkttemplates/standard.phtml:57 
-#: ../views/produkttemplates/standard_productindex.phtml:49 
-#: ../views/produkt/index.phtml:139 ../views/produkt/index.phtml:262 
-#: ../views/produkt/addedit.phtml:360 
-#: ../views/mods/mod_kundenverwaltung/order.phtml:47 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Artikelnummer"
-msgstr "Sá» lÆ°á»£ng"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89 
-#: ../views/produkt/index.phtml:167 ../views/produkt/index.phtml:290 
-#: ../views/mods/mod_kundenverwaltung/order.phtml:41 
-#: ../views/mods/mod_productgroups/settings_edit.phtml:14 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:74 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:227
-msgid "Preis"
-msgstr "GiÃ¡"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89
-msgid "Aufsteigend"
-msgstr "tÄng dáº§n"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89
-msgid "Absteigend"
-msgstr "giáº£m dáº§n"
-
-# @ wpsg
-#: ../controller/wpsg_ProduktController.class.php:89 
-#: ../mods/wpsg_mod_relatedproducts.class.php:10
-msgid "Aus Produkt"
-msgstr "Tá»« sáº£n pháº©m"
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2
-msgid "Verzeichnis konnte nicht angelegt werden."
-msgstr "ThÆ° má»¥c khÃŽng thá» ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2 
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:155
-msgid "Betreff"
-msgstr "Ná»i dung"
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2
-msgid "Absender"
-msgstr "NgÆ°á»i gá»­i"
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2
-msgid "EmpfÃ€nger"
-msgstr "NgÆ°á»i nháº­n"
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2
-msgid "CC"
-msgstr "CC"
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2
-msgid "BCC"
-msgstr "BCC"
-
-# @ wpsg
-#: ../lib/helper_functions.inc.php:2
-msgid "Mailanhang"
-msgstr "ÄÃ­nh kÃšm"
-
-# @ wpsg
-#: ../lib/functions.inc.php:2 ../views/mailtemplates/order.phtml:37 
-#: ../views/mailtemplates/html/order.phtml:69 ../views/order/view.phtml:470 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:97 
-#: ../views/warenkorb/overview.phtml:156 ../views/warenkorb/overview.phtml:169 
-#: ../views/warenkorb/overview.phtml:204 ../views/warenkorb/overview.phtml:223 
-#: ../views/warenkorb/basket.phtml:97 ../views/warenkorb/basket.phtml:117 
-#: ../views/warenkorb/basket.phtml:171 ../views/warenkorb/basket.phtml:211
-msgid "anteilig"
-msgstr "Theo tá»· lá»"
-
-# @ wpsg
-#: ../lib/wpsg_basket_widget.class.php:2
-msgid "wpShopGermany Warenkorb Widget"
-msgstr "wpShopGermany basket widget"
-
-# @ wpsg
-#: ../lib/wpsg_basket_widget.class.php:4
-msgid "Seiten unterhalb des Widgets"
-msgstr "CÃ¡c trang dÆ°á»i Widget"
-
-# @ wpsg
-#: ../lib/wpsg_basket_widget.class.php:9
-msgid "Datenschutzrichtlinien"
-msgstr "ChÃ­nh sÃ¡ch riÃªng tÆ°"
-
-# @ wpsg
-#: ../lib/wpsg_basket_widget.class.php:15
-msgid "Versandhinweis"
-msgstr "ThÃŽng tin giao hÃ ng"
-
-# @ wpsg
-#: ../lib/wpsg_basket_widget.class.php:17
-msgid ""
-"Wenn nichts angezeigt wird, so wird der Standardtext \"Alle Preise inklusive "
-"MwSt. und zzgl. Versandkosten\" angezeigt!"
-msgstr ""
-"Náº¿u khÃŽng cÃ³ thÃŽng tin thÃªm nÃ o ÄÆ°á»£c hiá»n thá», báº¡n sáºœ tháº¥y dÃ²ng thÃŽng bÃ¡o "
-"máº·c Äá»nh \"GiÃ¡ ÄÃ£ bao gá»m thuáº¿ GTGT vÃ  chÆ°a bao gá»m phÃ­ váº­n chuyá»n\"."
-
-# @ wpsg
-#: ../lib/wpsg_basket_widget.class.php:17
-msgid "Im Text ist HTML Code erlaubt."
-msgstr "Cho phÃ©p mÃ£ HTML trong vÄn báº£n."
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bestellmail (Admin) an:#1#"
-msgstr "ThÆ° Äáº·t hÃ ng (Admin) gá»­i tá»i: #1#"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bestellmail (Kunde) an:#1#"
-msgstr "ThÆ° Äáº·t hÃ ng (KhÃ¡ch hÃ ng) gá»­i tá»i: #1#"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Unerwarteter Fehler bei Gutscheinzuordnung."
-msgstr "Lá»i khÃŽng xÃ¡c Äá»nh khi xÃ¡c Äá»nh Phiáº¿u mua hÃ ng."
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte im Feld \"Anrede\" eine Angabe machen!"
-msgstr "Vui lÃ²ng chá»n \"Danh xÆ°ng\" cá»§a báº¡n!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte im Feld \"Firma\" eine Angabe machen!"
-msgstr "Vui lÃ²ng ghi tÃªn \"CÃŽng ty\" cá»§a báº¡n!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte im Feld \"Vorname\" eine Angabe machen!"
-msgstr "Vui lÃ²ng ghi \"TÃªn\" cá»§a báº¡n!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte im Feld \"Name\" eine Angabe machen!"
-msgstr "Vui lÃ²ng ghi \"Há»\" cá»§a báº¡n!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingabe im Feld \"Geburtsdatum\" ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p ngÃ y sinh cÃ³ hiá»u lá»±c!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingabe der E-Mail Adresse ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p Äá»a chá» email cÃ³ hiá»u lá»±c!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingabe im Feld \"Telefonnummer\" ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p sá» Äiá»n thoáº¡i cÃ³ hiá»u lá»±c cÃ¹ng vá»i mÃ£ quá»c gia!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingaben im Feld \"StraÃe\" ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p Äá»a chá» \"ÄÆ°á»ng\"!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingaben im Feld \"Fax\" ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p sá» Fax cÃ³ hiá»u lá»±c cÃ¹ng vá»i mÃ£ quá»c gia!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingaben im Feld \"PLZ\" ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p mÃ£ bÆ°u Äiá»n cÃ³ hiá»u lá»±c!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingaben im Feld \"Ort\" ÃŒberprÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p tÃªn \"ThÃ nh phá»\"!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte ein Land auswÃ€hlen!"
-msgstr "Vui lÃ²ng chá»n má»t quá»c gia!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte die Eingaben im Feld \"UStIdNr.\" prÃŒfen!"
-msgstr "Vui lÃ²ng nháº­p mÃ£ sá» thuáº¿!"
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte eine gÃŒltige Versandart auswÃ€hlen."
-msgstr "Vui lÃ²ng chá»n phÆ°Æ¡ng thá»©c giao hÃ ng cÃ³ hiá»u lá»±c."
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15
-msgid "Bitte eine gÃŒltige Zahlungsart auswÃ€hlen."
-msgstr "Vui lÃ²ng chá»n phÆ°Æ¡ng thá»©c thanh toÃ¡n cÃ³ hiá»u lá»±c."
-
-# @ wpsg
-#: ../lib/wpsg_basket.class.php:15 ../views/warenkorb/basket.phtml:298
-msgid "Keine Produkte im Warenkorb."
-msgstr "KhÃŽng cÃ³ sáº£n pháº©m trong giá» hÃ ng."
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1
-msgid "Aktive Demo Lizenz (Noch #1# Tage)"
-msgstr "ÄÃ£ kÃ­ch hoáº¡t giáº¥y phÃ©p cháº¡y thá»­ (cÃ²n #1# ngÃ y)"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1
-msgid "Keine gÃŒltige Lizenz"
-msgstr "Giáº¥y phÃ©p khÃŽng há»£p lá»"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1 ../views/admin/konfiguration.phtml:54 
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Light Version"
-msgstr "PhiÃªn báº£n ÄÆ¡n giáº£n"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1 ../views/admin/konfiguration.phtml:55 
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Pro Version"
-msgstr "PhiÃªn báº£n nÃ¢ng cao"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1 ../views/admin/konfiguration.phtml:56 
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Enterprise Version"
-msgstr "PhiÃªn báº£n cho doanh nghiá»p"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1
-msgid "Neue Lizenz aktivieren"
-msgstr "KÃ­ch hoáº¡t giáº¥y phÃ©p má»i"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1
-msgid "Lizenz aktivieren."
-msgstr "KÃ­ch hoáº¡t giáº¥y phÃ©p."
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1 ../views/admin/access.phtml:47
-msgid "Konfiguration"
-msgstr "CÃ i Äáº·t"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1 ../views/produkt/index.phtml:57 
-#: ../views/admin/access.phtml:79
-msgid "Produktverwaltung"
-msgstr "Quáº£n lÃœ sáº£n pháº©m"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:1 
-#: ../views/mailtemplates/html/adminmail.phtml:16 
-#: ../views/admin/access.phtml:69 ../views/order/index.phtml:11
-msgid "Bestellverwaltung"
-msgstr "Quáº£n lÃœ ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:11
-msgid "Kopiere Shop aus dem Pluginverzeichnis ..."
-msgstr "Sao chÃ©p shop tá»« thÆ° má»¥c PluginâŠ."
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:11
-msgid "Kopiere Shop zurÃŒck ..."
-msgstr "Sao chÃ©p Shop láº¡iâŠ"
-
-# @ wpsg
-#: ../lib/filter_functions.inc.php:11
-msgid "Aktualisiere Shop Datenbank ..."
-msgstr "Äang cáº­p nháº­t CÆ¡ sá» dá»¯ liá»u cá»§a ShopâŠ"
-
-# @ wpsg
-#: ../views/produkttemplates/ausverkauft.phtml:54 
-#: ../views/produkttemplates/standard.phtml:71 
-#: ../views/produkttemplates/standard_productindex.phtml:63
-msgid "StÃŒckpreis:"
-msgstr "GiÃ¡ má»i sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkttemplates/ausverkauft.phtml:69 
-#: ../views/produkttemplates/standard.phtml:94 
-#: ../views/produkttemplates/standard_productindex.phtml:86 
-#: ../views/mods/mod_productindex/layouts/list.phtml:157 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:161
-msgid "(zzgl. #1#% MwSt. und zzgl. #2#)"
-msgstr "(cá»ng #1# thuáº¿ GTGT vÃ  cá»ng #2#)"
-
-# @ wpsg
-#: ../views/produkttemplates/ausverkauft.phtml:71 
-#: ../views/produkttemplates/standard.phtml:96 
-#: ../views/produkttemplates/standard_productindex.phtml:88 
-#: ../views/mods/mod_productindex/layouts/list.phtml:159 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:163
-msgid "(inkl. #1#% MwSt. und zzgl. #2#)"
-msgstr "(ÄÃ£ gá»m #1# thuáº¿ GTGT vÃ  gá»m #2#)"
-
-# @ wpsg
-#: ../views/produkttemplates/ausverkauft.phtml:81 
-#: ../views/produkttemplates/standard.phtml:112 
-#: ../views/produkttemplates/standard_productindex.phtml:104 
-#: ../views/warenkorb/ajaxDialog.phtml:65
-msgid "FÃŒllmenge: #1# (#2# / #3#)"
-msgstr "Sá» hÃ ng trong má»i thÃ¹ng: #1# (#2# / #3#)"
-
-# @ wpsg
-#: ../views/produkttemplates/ausverkauft.phtml:93 
-#: ../views/produkttemplates/standard.phtml:162 
-#: ../views/produkttemplates/standard_productindex.phtml:139 
-#: ../views/warenkorb/ajaxDialog.phtml:78
-msgid "Gewicht: #1# #2#"
-msgstr "Khá»i lÆ°á»£ng: #1# #2#"
-
-# @ wpsg
-#: ../views/produkttemplates/ausverkauft.phtml:105 
-#: ../views/mods/mod_productindex/layouts/list.phtml:169 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:174
-msgid "Produkt ausverkauft"
-msgstr "ÄÃ£ bÃ¡n háº¿t sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkttemplates/standard.phtml:176 
-#: ../views/produkttemplates/standard_productindex.phtml:153 
-#: ../views/mailtemplates/order.phtml:9 
-#: ../views/mailtemplates/html/order.phtml:10 ../views/order/view.phtml:434 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:78 
-#: ../views/warenkorb/overview.phtml:111 ../views/warenkorb/basket.phtml:31 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Anzahl"
-msgstr "Sá» lÆ°á»£ng"
-
-# @ wpsg
-#: ../views/produkttemplates/standard.phtml:237 
-#: ../views/produkttemplates/standard_productindex.phtml:209
-msgid "In den Warenkorb"
-msgstr "Trong giá» hÃ ng"
-
-# @ wpsg
-#: ../views/produkt/mapimport.phtml:12 ../views/produkt/import.phtml:12
-msgid "ZurÃŒck zur Produktverwaltung"
-msgstr "Quay láº¡i quáº£n lÃœ sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/mapimport.phtml:37 ../views/produkt/import.phtml:26 
-#: ../views/mods/mod_gutschein/import.phtml:31 
-#: ../views/mods/mod_kundenverwaltung/import.phtml:26
-msgid "Import starten"
-msgstr "Báº¯t Äáº§u nháº­p dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:58 ../views/mods/mod_gutschein/index.phtml:12 
-#: ../views/mods/mod_gutschein/basket_row_end.phtml:13 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:76 
-#: ../views/mods/mod_productgroups/index.phtml:12
-msgid "HinzufÃŒgen"
-msgstr "ThÃªm vÃ o"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:60 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:78
-msgid "Exportieren"
-msgstr "Xuáº¥t dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:62 ../views/admin/hilfe.phtml:70 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:80
-msgid "Importieren"
-msgstr "Nháº­p"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:72 ../views/produkt/index.phtml:74
-msgid "Produkte suchen"
-msgstr "TÃ¬m kiáº¿m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:81 ../views/produkt/index.phtml:300 
-#: ../views/order/index.phtml:184 ../views/order/index.phtml:535 
-#: ../views/mods/mod_gutschein/index.phtml:133 
-#: ../views/mods/mod_gutschein/index.phtml:281 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:106
-msgid "#1# Elemente"
-msgstr "#1# yáº¿u tá»"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:84 ../views/produkt/index.phtml:303 
-#: ../views/order/index.phtml:187 ../views/order/index.phtml:538 
-#: ../views/mods/mod_gutschein/index.phtml:136 
-#: ../views/mods/mod_gutschein/index.phtml:284 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:109
-msgid "Zur ersten Seite gehen"
-msgstr "Äáº¿n trang Äáº§u"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:85 ../views/produkt/index.phtml:304 
-#: ../views/order/index.phtml:188 ../views/order/index.phtml:539 
-#: ../views/mods/mod_gutschein/index.phtml:137 
-#: ../views/mods/mod_gutschein/index.phtml:285 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:110
-msgid "Zur vorherigen Seite gehen"
-msgstr "Äáº¿n trang trÆ°á»c"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:86 ../views/produkt/index.phtml:305 
-#: ../views/order/index.phtml:189 ../views/order/index.phtml:540 
-#: ../views/mods/mod_gutschein/index.phtml:138 
-#: ../views/mods/mod_gutschein/index.phtml:286 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:111
-msgid "Aktuelle Seite"
-msgstr "Trang hiá»n táº¡i"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:86 ../views/produkt/index.phtml:305 
-#: ../views/order/index.phtml:189 ../views/order/index.phtml:540 
-#: ../views/mods/mod_gutschein/index.phtml:138 
-#: ../views/mods/mod_gutschein/index.phtml:286 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:111
-msgid "von"
-msgstr "tá»«"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:87 ../views/produkt/index.phtml:306 
-#: ../views/order/index.phtml:190 ../views/order/index.phtml:541 
-#: ../views/mods/mod_gutschein/index.phtml:139 
-#: ../views/mods/mod_gutschein/index.phtml:287 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:112
-msgid "Zur nÃ€chsten Seite gehen"
-msgstr "Äáº¿n trang káº¿ tiáº¿p"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:88 ../views/produkt/index.phtml:307 
-#: ../views/order/index.phtml:191 ../views/order/index.phtml:542 
-#: ../views/mods/mod_gutschein/index.phtml:140 
-#: ../views/mods/mod_gutschein/index.phtml:288 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:113
-msgid "Zur letzten Seite gehen"
-msgstr "Äáº¿n trang cuá»i cÃ¹ng"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:133 ../views/produkt/index.phtml:256 
-#: ../views/mailtemplates/adminmail.phtml:20 
-#: ../views/mailtemplates/adminmail.phtml:35 
-#: ../views/mailtemplates/adminmail.phtml:46 
-#: ../views/mailtemplates/kundenmail.phtml:20 
-#: ../views/mailtemplates/kundenmail.phtml:35 
-#: ../views/mailtemplates/kundenmail.phtml:46 
-#: ../views/mailtemplates/html/customer.phtml:10 
-#: ../views/mailtemplates/html/customer.phtml:53 
-#: ../views/mailtemplates/html/customer.phtml:79 
-#: ../views/admin/migratemwst.phtml:12 
-#: ../views/admin/kundendaten_tab1.phtml:47 
-#: ../views/admin/musterwiderruf.pdf.phtml:50 ../views/order/view.phtml:211 
-#: ../views/mods/mod_productvars/pv_list.phtml:12 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:11 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:26 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:36 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:166 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:148 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:214 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:152 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:294 
-#: ../views/mods/mod_kundenverwaltung/order.phtml:40 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:22 
-#: ../views/mods/mod_productgroups/add.phtml:33 
-#: ../views/mods/mod_productgroups/add.phtml:36 
-#: ../views/mods/mod_productgroups/add.phtml:43 
-#: ../views/mods/mod_productgroups/index.phtml:26 
-#: ../views/mods/mod_productgroups/index.phtml:53 
-#: ../views/mods/mod_ordervars/ov_list.phtml:12 
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:9 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:69 
-#: ../views/mods/mod_core/admin_register.phtml:35 
-#: ../views/warenkorb/checkout.phtml:116 ../mods/wpsg_mod_export.class.php:22
-msgid "Name"
-msgstr "Há»"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:146 ../views/produkt/index.phtml:269 
-#: ../views/produkt/select.phtml:151 
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:18
-msgid "Produktgruppe"
-msgstr "NhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:154 ../views/produkt/index.phtml:277 
-#: ../views/mods/mod_stock/produkt_edit_sidebar.phtml:11 
-#: ../views/mods/mod_stock/produkt_edit_sidebar.phtml:16 
-#: ../mods/wpsg_mod_stock.class.php:2
-msgid "Lagerbestand"
-msgstr "HÃ ng trong kho"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:161 ../views/produkt/index.phtml:284 
-#: ../views/mailtemplates/order.phtml:7 
-#: ../views/mailtemplates/html/order.phtml:8 ../views/admin/laender.phtml:41 
-#: ../views/order/view.phtml:432 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:76 
-#: ../views/warenkorb/overview.phtml:114 ../views/warenkorb/basket.phtml:34
-msgid "MwSt."
-msgstr "Thuáº¿ GTGT"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:185 ../views/produkt/index.phtml:201 
-#: ../views/produkt/index.phtml:202 ../views/order/view.phtml:354
-msgid "Produkt fÃŒr Sprache #1# bearbeiten."
-msgstr "Chá»nh sá»­a sáº£n pháº©m cho ngÃŽn ngá»¯ #1#."
-
-# @ wpsg
-#: ../views/produkt/index.phtml:195 ../views/produkt/index.phtml:197
-msgid "Dieses Produkt bearbeiten"
-msgstr "Chá»nh sá»­a sáº£n pháº©m nÃ y"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:195 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:173
-msgid "---- "
-msgstr "---- "
-
-# @ wpsg
-#: ../views/produkt/index.phtml:197 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:192 
-#: ../views/mods/mod_productgroups/index.phtml:37 
-#: ../views/mods/mod_paypal/settings_edit.phtml:36 
-#: ../views/mods/mod_paypal/settings_edit.phtml:71
-msgid "Bearbeiten"
-msgstr "Chá»nh sá»­a"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:208
-msgid "Sind Sie sicher, dass Sie das Produkt lÃ¶schen wollen?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ sáº£n pháº©m nÃ y?"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:208
-msgid "Dieses Produkt lÃ¶schen"
-msgstr "XoÃ¡ sáº£n pháº©m nÃ y"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:208 ../views/admin/konfiguration.phtml:145 
-#: ../views/order/index.phtml:398 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:194 
-#: ../views/mods/mod_productgroups/index.phtml:39 
-#: ../views/warenkorb/basket.phtml:44 ../views/warenkorb/basket.phtml:85
-msgid "LÃ¶schen"
-msgstr "XoÃ¡"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:210
-msgid "Sind Sie sicher, dass Sie das Produkt kopieren wollen?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n sao chÃ©p sáº£n pháº©m nÃ y"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:210
-msgid "Dieses Produkt kopieren"
-msgstr "Sao chÃ©p sáº£n pháº©m nÃ y"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:210
-msgid "Kopieren"
-msgstr "Sao chÃ©p"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:212 ../views/order/index.phtml:394
-msgid "Ansehen"
-msgstr "Xem"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:220
-msgid "Nicht zugewiesen"
-msgstr "ChÆ°a ÄÆ°á»£c chá» Äá»nh"
-
-# @ wpsg
-#: ../views/produkt/index.phtml:350 ../views/produkt/select.phtml:135
-msgid "Keine Produkte in der Datenbank."
-msgstr "KhÃŽng tÃ¬m tháº¥y sáº£n pháº©m nÃ o trong cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/produkt/import.phtml:20
-msgid ""
-"Laden Sie ein vorher exportiertes CSV File hoch, die Produktdaten werden "
-"dann aus dieser Datei importiert."
-msgstr ""
-"Táº£i lÃªn má»t tá»p CSV ÄÃ£ xuáº¥t trÆ°á»c Äá» nháº­p thÃŽng tin sáº£n pháº©m tá»« tá»p nÃ y."
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:157
-msgid "Produkt bearbeiten"
-msgstr "Chá»nh sá»­a sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:162
-msgid "Neues Produkt"
-msgstr "Sáº£n pháº©m má»i"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:179 ../views/produkt/addedit.phtml:217 
-#: ../views/produkt/addedit.phtml:255 ../views/produkt/addedit.phtml:312 
-#: ../views/produkt/addedit.phtml:458 ../views/order/index.phtml:208 
-#: ../views/order/view.phtml:169 ../views/order/view.phtml:255 
-#: ../views/order/view.phtml:299 ../views/order/view.phtml:310 
-#: ../views/order/view.phtml:330 ../views/order/view.phtml:423 
-#: ../views/order/view.phtml:567 
-#: ../views/mods/mod_produktattribute/produkt_edit_content.phtml:11 
-#: ../views/mods/mod_productvars/produkt_edit_sidebar.phtml:10 
-#: ../views/mods/mod_export/produkt_index_aftersearch.phtml:52 
-#: ../views/mods/mod_auftragsbestaetigung/order_view.phtml:32 
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:11 
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:72 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:184 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:207 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:254 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:283 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:313 
-#: ../views/mods/mod_discount/productgroups_addedit_sidebar.phtml:9 
-#: ../views/mods/mod_discount/customergroup_edit.phtml:9 
-#: ../views/mods/mod_discount/produkt_edit_sidebar.phtml:10 
-#: ../views/mods/mod_productgroups/add.phtml:32 
-#: ../views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:9 
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:10 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:10 
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:3 
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:168 
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:10 
-#: ../views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:10 
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:135 
-#: ../views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml:10 
-#: ../views/mods/mod_varianten/produkt_edit_content.phtml:287 
-#: ../views/mods/mod_stock/produkt_edit_sidebar.phtml:10 
-#: ../views/mods/mod_ordercondition/produkt_edit_sidebar.phtml:10
-msgid "Zum Ein/Ausklappen hier klicken"
-msgstr "Nháº¥n Äá» áº©n/hiá»n"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:180
-msgid "Preis / Steuer"
-msgstr "GiÃ¡ \\ thuáº¿"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:188
-msgid "Preis (NETTO)"
-msgstr "GiÃ¡ (chÆ°a gá»m phÃ­)"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:201
-msgid "Preis (BRUTTO)"
-msgstr "GiÃ¡ (ÄÃ£ gá»m phÃ­)"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:210 
-#: ../views/mailtemplates/adminmail.phtml:69 
-#: ../views/mailtemplates/kundenmail.phtml:69 
-#: ../views/mailtemplates/html/customer.phtml:137 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:56
-msgid "Steueranteil"
-msgstr "Thuáº¿"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:222 ../views/produkt/addedit.phtml:260 
-#: ../views/order/index.phtml:157 ../views/order/index.phtml:159 
-#: ../views/order/index.phtml:216 ../views/order/index.phtml:229 
-#: ../views/order/index.phtml:235 ../views/order/index.phtml:250 
-#: ../views/order/index.phtml:256 ../views/mods/mod_gutschein/index.phtml:117 
-#: ../views/mods/mod_gutschein/index.phtml:119 
-#: ../views/mods/mod_productgroups/produkt_index_filter.phtml:39 
-#: ../views/mods/mod_productgroups/produkt_index_filter.phtml:41 
-#: ../mods/wpsg_mod_productindex.class.php:14
-msgid "Alle"
-msgstr "Táº¥t cáº£"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:223 ../views/produkt/addedit.phtml:261 
-#: ../views/mods/mod_productvars/pv_list.phtml:23 
-#: ../views/mods/mod_productvars/pv_list.phtml:85 
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:10 
-#: ../views/mods/mod_ordervars/ov_list.phtml:65 
-#: ../views/mods/mod_ordervars/ov_list.phtml:99 
-#: ../mods/wpsg_mod_productindex.class.php:14 
-#: ../mods/wpsg_mod_ordervars.class.php:2 
-#: ../mods/wpsg_mod_productvars.class.php:2
-msgid "Auswahl"
-msgstr "Lá»±a chá»n"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:319
-msgid "Ãbersetzungen"
-msgstr "Báº£n dá»ch"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:325 ../views/produkt/addedit.phtml:327 
-#: ../views/produkt/addedit.phtml:329
-msgid "Zu Sprache #1# wechseln."
-msgstr "Chuyá»n sang ngÃŽn ngá»¯ #1#."
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:339
-msgid "Produktname (Detail)"
-msgstr "TÃªn sáº£n pháº©m (chi tiáº¿t)"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:369
-msgid "Produkttemplate"
-msgstr "Máº«u mÃŽ táº£ sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:373 
-#: ../views/mods/mod_stock/settings_edit.phtml:14
-msgid "Keine Templatedatein gefunden!"
-msgstr "KhÃŽng tÃ¬m tháº¥y tá»p máº«u nÃ o!"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:386
-msgid "URL Benachrichtigung"
-msgstr "ThÃŽng bÃ¡o URL"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:391
-msgid "beim Verkauf"
-msgstr "khi bÃ¡n"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:393
-msgid "bei Bezahlung"
-msgstr "khi thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:407 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:151 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:258 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:137 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:223 
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:76 
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:146 
-#: ../views/warenkorb/checkout.phtml:101 ../views/warenkorb/checkout.phtml:185
-msgid "Bitte auswÃ€hlen"
-msgstr "Vui lÃ²ng chá»n"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:409
-msgid "Artikel"
-msgstr "Má»¥c sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:416
-msgid "Seiten"
-msgstr "Trang"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:459 ../mods/wpsg_mod_export.class.php:22
-msgid "Beschreibung"
-msgstr "MÃŽ táº£"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:514
-msgid "Produkt speichern"
-msgstr "LÆ°u sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/addedit.phtml:515
-msgid "Produkt speichern und zur Ãbersicht"
-msgstr "LÆ°u sáº£n pháº©m vÃ  quay láº¡i trang Tá»ng quÃ¡t"
-
-# @ wpsg
-#: ../views/produkt/select_filter.phtml:25 ../views/produkt/select.phtml:30 
-#: ../views/admin/kundendaten_tab2.phtml:26 
-#: ../views/admin/versandzonen.phtml:16 ../views/admin/versandzonen.phtml:37 
-#: ../views/admin/versandzonen.phtml:83 ../views/admin/kundendaten.phtml:63 
-#: ../views/order/view.phtml:49 
-#: ../views/mods/mod_produktattribute/list.phtml:48 
-#: ../views/mods/mod_produktattribute/settings_edit.phtml:47 
-#: ../views/mods/mod_produktattribute/settings_edit.phtml:74 
-#: ../views/mods/mod_productvars/settings_edit.phtml:13 
-#: ../views/mods/mod_productvars/settings_edit.phtml:29 
-#: ../views/mods/mod_export/settings_edit.phtml:13 
-#: ../views/mods/mod_export/settings_edit.phtml:61 
-#: ../views/mods/mod_export/settings_edit.phtml:80 
-#: ../views/mods/mod_userpayment/settings_edit.phtml:32 
-#: ../views/mods/mod_userpayment/settings_edit.phtml:50 
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:44 
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:81 
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:21 
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:50 
-#: ../views/mods/mod_ordervars/settings_edit.phtml:17 
-#: ../views/mods/mod_legaltexts/settings_edit.phtml:25 
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:32 
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:55 
-#: ../views/mods/mod_relatedproducts/list.phtml:35 
-#: ../views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml:28 
-#: ../views/mods/mod_versandarten/settings_edit.phtml:31 
-#: ../views/mods/mod_versandarten/settings_edit.phtml:71 
-#: ../views/mods/mod_ordercondition/list.phtml:49 
-#: ../views/mods/mod_ordercondition/settings_edit.phtml:16
-msgid "Bitte warten ..."
-msgstr "Vui lÃ²ng chá»âŠ."
-
-# @ wpsg
-#: ../views/produkt/select.phtml:18
-msgid "wpShopGermany Produktauswahl"
-msgstr "Lá»±a chá»n sáº£n pháº©m wpShopGermany"
-
-# @ wpsg
-#: ../views/produkt/select.phtml:138 ../views/mailtemplates/order.phtml:4 
-#: ../views/mailtemplates/html/order.phtml:5 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:73 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Produkt"
-msgstr "Sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/produkt/select.phtml:139 
-#: ../views/mods/mod_topseller/widget_form.phtml:10 
-#: ../views/mods/mod_topseller/settings_edit.phtml:12 
-#: ../views/mods/mod_productgroups/add.phtml:50 
-#: ../views/mods/mod_productgroups/index.phtml:27 
-#: ../views/mods/mod_productgroups/index.phtml:54 
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:144 
-#: ../views/mods/mod_productindex/page_metabox.phtml:31
-msgid "Template"
-msgstr "Máº«u"
-
-# @ wpsg
-#: ../views/produkt/select.phtml:142
-msgid "EinfÃŒgen und schlieÃen"
-msgstr "DÃ¡n vÃ  ÄÃ³ng láº¡i"
-
-# @ wpsg
-#: ../views/produkt/select.phtml:143 ../views/produkt/select.phtml:145 
-#: ../views/produkt/select.phtml:154
-msgid "EinfÃŒgen"
-msgstr "DÃ¡n"
-
-# @ wpsg
-#: ../views/produkt/select.phtml:152
-msgid "Sortierung"
-msgstr "PhÃ¢n loáº¡i"
-
-# @ wpsg
-#: ../views/produkt/select.phtml:153
-msgid "Richtung"
-msgstr "Äá»nh hÆ°á»ng"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:11 
-#: ../views/mailtemplates/html/adminmail.phtml:8
-msgid "Hallo Administrator,"
-msgstr "Gá»­i Quáº£n lÃœ Cá»­a hÃ ng,"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:13
-msgid "Eine neue Bestellung ist im Online-Shop eingegangen."
-msgstr "CÃ³ ÄÆ¡n hÃ ng má»i trong Cá»­a hÃ ng trá»±c tuyáº¿n cá»§a báº¡n."
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:17 
-#: ../views/mailtemplates/kundenmail.phtml:17 
-#: ../views/mailtemplates/html/customer.phtml:2 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:8
-msgid "Rechnungsadresse:"
-msgstr "Äá»a chá» gá»­i hoÃ¡ ÄÆ¡n:"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:19 
-#: ../views/mailtemplates/adminmail.phtml:34 
-#: ../views/mailtemplates/adminmail.phtml:45 
-#: ../views/mailtemplates/kundenmail.phtml:19 
-#: ../views/mailtemplates/kundenmail.phtml:34 
-#: ../views/mailtemplates/kundenmail.phtml:45 
-#: ../views/mailtemplates/html/customer.phtml:6 
-#: ../views/mailtemplates/html/customer.phtml:49 
-#: ../views/mailtemplates/html/customer.phtml:75 
-#: ../views/admin/kundendaten_tab1.phtml:29 ../views/order/view.phtml:208 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:10 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:25 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:35 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:141 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:127 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:298 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:14 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:66 
-#: ../views/warenkorb/checkout.phtml:91 ../mods/wpsg_mod_export.class.php:22
-msgid "Firma"
-msgstr "CÃŽng ty"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:21 
-#: ../views/mailtemplates/adminmail.phtml:36 
-#: ../views/mailtemplates/adminmail.phtml:47 
-#: ../views/mailtemplates/kundenmail.phtml:21 
-#: ../views/mailtemplates/kundenmail.phtml:36 
-#: ../views/mailtemplates/kundenmail.phtml:47 
-#: ../views/mailtemplates/html/customer.phtml:14 
-#: ../views/mailtemplates/html/customer.phtml:57 
-#: ../views/mailtemplates/html/customer.phtml:83 
-#: ../views/admin/shopdata.phtml:36 ../views/admin/kundendaten_tab1.phtml:102 
-#: ../views/admin/musterwiderruf.pdf.phtml:51 ../views/order/view.phtml:212 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:12 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:27 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:37 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:301 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:38 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:15 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:70 
-#: ../views/mods/mod_core/admin_register.phtml:38 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "StraÃe"
-msgstr "ÄÆ°á»ng phá»"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:22 
-#: ../views/mailtemplates/adminmail.phtml:39 
-#: ../views/mailtemplates/adminmail.phtml:53 
-#: ../views/mailtemplates/kundenmail.phtml:22 
-#: ../views/mailtemplates/kundenmail.phtml:39 
-#: ../views/mailtemplates/kundenmail.phtml:53 
-#: ../views/mailtemplates/html/customer.phtml:18 
-#: ../views/mailtemplates/html/customer.phtml:65 
-#: ../views/mailtemplates/html/customer.phtml:97 
-#: ../views/admin/kundendaten_tab1.phtml:129 ../views/order/view.phtml:215 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:13 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:30 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:38 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:254 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:219 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:304 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:50 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:73 
-#: ../views/mods/mod_core/admin_register.phtml:39 
-#: ../views/warenkorb/checkout.phtml:181
-msgid "Land"
-msgstr "TÃªn nÆ°á»c"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:24 
-#: ../views/mailtemplates/adminmail.phtml:49 
-#: ../views/mailtemplates/kundenmail.phtml:24 
-#: ../views/mailtemplates/kundenmail.phtml:49 
-#: ../views/mailtemplates/html/customer.phtml:23 
-#: ../views/mailtemplates/html/customer.phtml:88 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:15 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:40
-msgid "USt.IdNr."
-msgstr "MÃ£ sá» thuáº¿:"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:27 
-#: ../views/mailtemplates/adminmail.phtml:37 
-#: ../views/mailtemplates/adminmail.phtml:52 
-#: ../views/mailtemplates/kundenmail.phtml:27 
-#: ../views/mailtemplates/kundenmail.phtml:37 
-#: ../views/mailtemplates/kundenmail.phtml:52 
-#: ../views/mailtemplates/html/customer.phtml:28 
-#: ../views/mailtemplates/html/customer.phtml:61 
-#: ../views/mailtemplates/html/customer.phtml:93 
-#: ../views/admin/shopdata.phtml:38 ../views/admin/kundendaten_tab1.phtml:120 
-#: ../views/order/view.phtml:214 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:18 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:28 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:43 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:247 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:212 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:303 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:46 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:72 
-#: ../views/mods/mod_core/admin_register.phtml:37 
-#: ../views/warenkorb/checkout.phtml:174 ../mods/wpsg_mod_export.class.php:22
-msgid "Ort"
-msgstr "ThÃ nh phá»"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:28 
-#: ../views/mailtemplates/adminmail.phtml:54 
-#: ../views/mailtemplates/kundenmail.phtml:28 
-#: ../views/mailtemplates/kundenmail.phtml:54 
-#: ../views/mailtemplates/html/customer.phtml:32 
-#: ../views/mailtemplates/html/customer.phtml:101 
-#: ../views/admin/kundendaten_tab1.phtml:84 ../views/order/view.phtml:229 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:19 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:44 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:299 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:30 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Telefon"
-msgstr "Sá» Äiá»n thoáº¡i"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:29 
-#: ../views/mailtemplates/adminmail.phtml:55 
-#: ../views/mailtemplates/kundenmail.phtml:29 
-#: ../views/mailtemplates/kundenmail.phtml:55 
-#: ../views/mailtemplates/html/customer.phtml:36 
-#: ../views/mailtemplates/html/customer.phtml:105 
-#: ../views/admin/kundendaten_tab1.phtml:93 ../views/order/view.phtml:225 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:20 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:45 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:300 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:34
-msgid "Fax"
-msgstr "Sá» Fax"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:30 
-#: ../views/mailtemplates/adminmail.phtml:56 
-#: ../views/mailtemplates/kundenmail.phtml:30 
-#: ../views/mailtemplates/kundenmail.phtml:56 
-#: ../views/mailtemplates/html/customer.phtml:40 
-#: ../views/mailtemplates/html/customer.phtml:109 
-#: ../views/admin/kundendaten_tab1.phtml:65 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:21 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:46 
-#: ../views/mods/mod_kundenverwaltung/login.phtml:20 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:173 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:166 
-#: ../views/mods/mod_kundenverwaltung/checkout_login.phtml:12 
-#: ../views/warenkorb/checkout.phtml:123
-msgid "E-Mail Adresse"
-msgstr "Äá»a chá» email"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:32 
-#: ../views/mailtemplates/kundenmail.phtml:32 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:23
-msgid "Lieferadresse:"
-msgstr "Äá»a chá» giao hÃ ng:"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:43 
-#: ../views/mailtemplates/kundenmail.phtml:43 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:33
-msgid "Rechnungs- /Lieferadresse:"
-msgstr "Äá»a chá» gá»­i hoÃ¡ ÄÆ¡n & giao hÃ ng:"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:60 
-#: ../views/mailtemplates/kundenmail.phtml:60 
-#: ../views/mailtemplates/html/customer.phtml:120 
-#: ../views/order/view.phtml:176 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:49 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:287 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Kundennummer"
-msgstr "MÃ£ KhÃ¡ch hÃ ng:"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:61 
-#: ../views/mailtemplates/kundenmail.phtml:61 
-#: ../views/mailtemplates/html/customer.phtml:124 
-#: ../views/order/view.phtml:337 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:50 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Bestellnummer"
-msgstr "Sá» ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:62 
-#: ../views/mailtemplates/kundenmail.phtml:62 
-#: ../views/mailtemplates/html/customer.phtml:128 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:51
-msgid "Bestelldatum"
-msgstr "NgÃ y Äáº·t hÃ ng:"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:63 
-#: ../views/mailtemplates/kundenmail.phtml:63 
-#: ../views/mailtemplates/html/customer.phtml:132 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:52 
-#: ../views/mods/mod_kundenverwaltung/order.phtml:35
-msgid "Rechnungsbetrag"
-msgstr "Tá»ng hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:72 
-#: ../views/mailtemplates/kundenmail.phtml:72 
-#: ../views/mailtemplates/html/customer.phtml:157 
-#: ../views/order/index.phtml:340 ../views/order/index.phtml:485 
-#: ../views/order/view.phtml:262 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:59
-msgid "Versandart"
-msgstr "PhÆ°Æ¡ng thá»©c váº­n chuyá»n"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:73 
-#: ../views/mailtemplates/kundenmail.phtml:74 
-#: ../views/mailtemplates/html/customer.phtml:164 
-#: ../views/order/view.phtml:277 ../views/order/view.phtml:515 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:60 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:110
-msgid "Zahlungsart"
-msgstr "PhÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:76 
-#: ../views/mailtemplates/kundenmail.phtml:77 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:69 
-#: ../mods/wpsg_mod_ordervars.class.php:2 
-#: ../mods/wpsg_mod_discount.class.php:2 
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:2 
-#: ../mods/wpsg_mod_export.class.php:22 
-#: ../mods/wpsg_mod_ordercondition.class.php:2
-msgid "Bestellung"
-msgstr "ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mailtemplates/adminmail.phtml:80 
-#: ../views/mailtemplates/kundenmail.phtml:82 
-#: ../views/mailtemplates/html/adminmail.phtml:23 
-#: ../views/mailtemplates/html/kundenmail.phtml:22 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:26 
-#: ../views/warenkorb/checkout.phtml:237 ../views/warenkorb/overview.phtml:287
-msgid "Bestellkommentar"
-msgstr "BÃ¬nh luáº­n ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mailtemplates/status.phtml:9 
-#: ../views/mailtemplates/kundenmail.phtml:11 
-#: ../views/mailtemplates/html/status.phtml:11 
-#: ../views/mailtemplates/html/kundenmail.phtml:7 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:7 
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:7 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:7 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:8 
-#: ../views/mods/mod_kundenverwaltung/mail_activate.phtml:8 
-#: ../views/mods/mod_kundenverwaltung/mail_activate_html.phtml:8 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:8 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:7 
-#: ../views/mods/mod_trustedshops/mail_html.phtml:7 
-#: ../views/mods/mod_trustedshops/mail.phtml:7
-msgid "Hallo #1# #2#,"
-msgstr "Gá»­i #1# #2#,"
-
-# @ wpsg
-#: ../views/mailtemplates/status.phtml:12 
-#: ../views/mailtemplates/html/status.phtml:14
-msgid ""
-"Der Status Ihrer Bestellung mit der Bestellnummer #1# hat sich von \"#2#\" "
-"auf \"#3#\" geÃ€ndert."
-msgstr "Tráº¡ng thÃ¡i cá»§a ÄÆ¡n Äáº·t hÃ ng #1# ÄÃ£ chuyá»n tá»« #2# sang #3#."
-
-# @ wpsg
-#: ../views/mailtemplates/status.phtml:17 
-#: ../views/mailtemplates/kundenmail.phtml:105 
-#: ../views/mailtemplates/html/status.phtml:21 
-#: ../views/mailtemplates/html/kundenmail.phtml:42 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:46 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:147 
-#: ../views/mods/mod_trustedshops/mail_html.phtml:15 
-#: ../views/mods/mod_trustedshops/mail.phtml:13 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:33
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:28 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:28 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:32
-msgid "Mit freundlichen GrÃŒÃen"
-msgstr "TrÃ¢n trá»ng,"
-
-# @ wpsg
-#: ../views/mailtemplates/kundenmail.phtml:86 
-#: ../views/mailtemplates/html/kundenmail.phtml:26 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:32 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:131
-msgid "Wir bedanken uns fuer Ihre Bestellung."
-msgstr "Cáº£m Æ¡n báº¡n ÄÃ£ Äáº·t hÃ ng."
-
-# @ wpsg
-#: ../views/mailtemplates/kundenmail.phtml:88 
-#: ../views/mailtemplates/html/kundenmail.phtml:27
-msgid ""
-"Bitte beachten Sie, dass es sich bei dieser E-Mail um eine "
-"Bestellbestaetigung und keine bindende Auftragsbestaetigung handelt. "
-"Preisirrtuemer sind leider nicht vollstaendig auszuschliessen."
-msgstr ""
-"Vui lÃ²ng lÆ°u Ãœ ráº±ng thÆ° nÃ y lÃ  thÆ° thÃŽng bÃ¡o vÃ  khÃŽng pháº£i lÃ  xÃ¡c nháº­n Äáº·t "
-"hÃ ng cÃ³ tÃ¬nh rÃ ng buá»c. Sai sÃ³t tÃ­nh giÃ¡ khÃŽng thá» ÄÆ°á»£c hoÃ n toÃ n loáº¡i trá»«.  "
-
-# @ wpsg
-#: ../views/mailtemplates/kundenmail.phtml:90 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:133
-msgid "Es gelten unsere Allgemeinen Geschaeftsbedingungen (AGB)."
-msgstr "Ãp dá»¥ng Äiá»u khoáº£n vÃ  Äiá»u kiá»n chung cá»§a chÃºng tÃŽi."
-
-# @ wpsg
-#: ../views/mailtemplates/kundenmail.phtml:100 
-#: ../views/mailtemplates/html/kundenmail.phtml:37 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:41 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:142
-msgid "...hier steht der Text zum Widerrufsrecht..."
-msgstr "âŠÄÃ¢y lÃ  vÄn báº£n cho quyá»n huá»· bá»âŠ"
-
-# @ wpsg
-#: ../views/mailtemplates/kundenmail.phtml:103 
-#: ../views/mailtemplates/html/kundenmail.phtml:40 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:44 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:145
-msgid "Ende der Widerrufsbelehrung"
-msgstr "Káº¿t thÃºc quyá»n huá»· bá»"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:3 
-#: ../views/mailtemplates/html/order.phtml:4 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:72
-msgid "Pos"
-msgstr "POS"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:5 
-#: ../views/mailtemplates/html/order.phtml:6 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:74
-msgid "StÃŒckpreis"
-msgstr "GiÃ¡ má»t ÄÆ¡n vá» hÃ ng hoÃ¡"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:10 
-#: ../views/mailtemplates/html/order.phtml:11 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:79
-msgid "Summe"
-msgstr "Tá»ng"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:21
-msgid "Art. Nr.:"
-msgstr "Sá» má»¥c hÃ ng hoÃ¡:"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:34 
-#: ../views/mailtemplates/html/order.phtml:66 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:94
-msgid "Gutschein (#1#)"
-msgstr "Phiáº¿u mua hÃ ng \"#1#\""
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:43 
-#: ../views/mailtemplates/html/order.phtml:80 ../views/order/view.phtml:479
-msgid "AbzÃŒglich Rabatt"
-msgstr "Trá»« chiáº¿t kháº¥u"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:47 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:102
-msgid "Zwischensumme:"
-msgstr "Tá»ng táº¡m tÃ­nh:"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:50
-msgid "Versandkosten:"
-msgstr "CÃ¡c chi phÃ­ váº­n chuyá»n:"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:53 ../views/mailtemplates/order.phtml:65 
-#: ../views/mailtemplates/order.phtml:81 
-#: ../views/mailtemplates/html/order.phtml:104 
-#: ../views/mailtemplates/html/order.phtml:121 
-#: ../views/mailtemplates/html/order.phtml:144
-msgid "Anteilig"
-msgstr "Theo tá»· lá»"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:78 ../views/warenkorb/basket.phtml:193
-msgid "Zahlungsart:"
-msgstr "PhÆ°Æ¡ng thá»©c thanh toÃ¡n:"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:95 
-#: ../views/mailtemplates/html/order.phtml:164 ../views/order/view.phtml:526 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:120 
-#: ../views/warenkorb/overview.phtml:259 ../views/warenkorb/basket.phtml:254
-msgid "zuzÃŒglich MwSt. (#1#)"
-msgstr "cá»ng thuáº¿ GTGT (#1#1)"
-
-# @ wpsg
-#: ../views/mailtemplates/order.phtml:97 
-#: ../views/mailtemplates/html/order.phtml:166 ../views/order/view.phtml:549
-msgid "darin enthaltene MwSt. (#1#)"
-msgstr "ÄÃ£ gá»m thuáº¿ GTGT (#1#1)"
-
-# @ wpsg
-#: ../views/mailtemplates/html/customer.phtml:45 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:51 
-#: ../mods/wpsg_mod_shippingadress.class.php:1
-msgid "Lieferadresse"
-msgstr "Äá»a chá» giao hÃ ng"
-
-# @ wpsg
-#: ../views/mailtemplates/html/customer.phtml:116 
-#: ../views/order/view.phtml:424 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:22
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:22 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:22 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:21
-msgid "Bestelldaten"
-msgstr "Dá»¯ liá»u ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mailtemplates/html/kundenmail.phtml:9 
-#: ../views/warenkorb/done.phtml:42
-msgid "Vielen Dank fÃŒr Ihre Bestellung!"
-msgstr "Cáº£m Æ¡n báº¡n ÄÃ£ Äáº·t hÃ ng!"
-
-# @ wpsg
-#: ../views/mailtemplates/html/order.phtml:45 
-#: ../views/mods/mod_varianten/basket_row.phtml:15 
-#: ../views/mods/mod_varianten/mail_row_html.phtml:15 
-#: ../views/mods/mod_varianten/order_view_row.phtml:14 
-#: ../views/mods/mod_varianten/mail_row.phtml:13 
-#: ../views/mods/mod_varianten/overview_row.phtml:14
-msgid "Art. Nr."
-msgstr "Sá» sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mailtemplates/html/order.phtml:174 ../views/order/view.phtml:435 
-#: ../views/order/view.phtml:536 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:128 
-#: ../views/warenkorb/overview.phtml:116 ../views/warenkorb/overview.phtml:241 
-#: ../views/warenkorb/basket.phtml:36 ../views/warenkorb/basket.phtml:236
-msgid "Gesamtpreis"
-msgstr "Tá»ng giÃ¡"
-
-# @ wpsg
-#: ../views/admin/customerpreset.phtml:11 ../views/admin/path.phtml:11 
-#: ../views/admin/emailconf.phtml:11 ../views/admin/access.phtml:11 
-#: ../views/admin/versandzonen.phtml:101 ../views/admin/kundendaten.phtml:11 
-#: ../views/admin/index.phtml:20 ../views/admin/includes.phtml:11 
-#: ../views/admin/konfiguration.phtml:11 ../views/admin/deinstall.phtml:11 
-#: ../views/admin/presentation.phtml:11 ../views/admin/seiten.phtml:11 
-#: ../views/admin/blognetzwerk.phtml:12 
-#: ../views/admin/widerrufsbelehrung.phtml:11 ../views/admin/extended.phtml:11 
-#: ../views/admin/shopdata.phtml:11 ../views/admin/laender.phtml:11 
-#: ../views/admin/loadsavesettings.phtml:11 ../views/admin/kalkulation.phtml:11
-msgid "Einstellungen"
-msgstr "CÃ i Äáº·t"
-
-# @ wpsg
-#: ../views/admin/customerpreset.phtml:39 
-#: ../views/admin/kundendaten_tab2.phtml:94 
-#: ../views/admin/laender_edit.phtml:25 
-#: ../views/admin/versandzonen_list.phtml:25 
-#: ../views/admin/versandzonen_list.phtml:43 
-#: ../views/admin/versandzonen_list.phtml:54 ../views/order/view.phtml:21 
-#: ../views/mods/mod_produktattribute/list.phtml:86 
-#: ../views/mods/mod_produktattribute/list.phtml:112 
-#: ../views/mods/mod_productvars/pv_list.phtml:32 
-#: ../views/mods/mod_productvars/pv_list.phtml:54 
-#: ../views/mods/mod_productvars/pv_list.phtml:78 
-#: ../views/mods/mod_productvars/order_view_row.phtml:26 
-#: ../views/mods/mod_productvars/order_view_row.phtml:38 
-#: ../views/mods/mod_productvars/order_view_row.phtml:52 
-#: ../views/mods/mod_export/profil.phtml:26 
-#: ../views/mods/mod_export/profil.phtml:47 
-#: ../views/mods/mod_export/profil.phtml:68 
-#: ../views/mods/mod_export/profil.phtml:208 
-#: ../views/mods/mod_export/profil.phtml:219 
-#: ../views/mods/mod_export/profil.phtml:242 
-#: ../views/mods/mod_export/profil.phtml:253 
-#: ../views/mods/mod_userpayment/list.phtml:33 
-#: ../views/mods/mod_userpayment/list.phtml:44 
-#: ../views/mods/mod_userpayment/list.phtml:55 
-#: ../views/mods/mod_userpayment/list.phtml:66 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:297 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:26 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:39 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:50 
-#: ../views/mods/mod_ordervars/ov_list.phtml:34 
-#: ../views/mods/mod_ordervars/ov_list.phtml:58 
-#: ../views/mods/mod_ordervars/ov_list.phtml:108 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:22 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:39 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:50 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:59 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:165 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:177 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:191 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:207 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:282 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:299 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:312 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:326 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:357 
-#: ../views/mods/mod_versandarten/list.phtml:33 
-#: ../views/mods/mod_versandarten/list.phtml:44 
-#: ../views/mods/mod_versandarten/list.phtml:55 
-#: ../views/mods/mod_versandarten/list.phtml:66 
-#: ../views/mods/mod_versandarten/list.phtml:79 
-#: ../views/mods/mod_versandarten/list.phtml:97 
-#: ../views/mods/mod_versandarten/list.phtml:194 
-#: ../views/mods/mod_ordercondition/list.phtml:21
-msgid "Speichern"
-msgstr "LÆ°u"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:23 
-#: ../views/mods/mod_produktattribute/settings_edit.phtml:71
-msgid "HTML Code Block"
-msgstr "Äoáº¡n mÃ£ HTML"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:55 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Kundenvariablen"
-msgstr "Biáº¿n sá» khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:56 
-#: ../views/admin/kundendaten_tab1.phtml:11
-msgid "Pflichtfeld"
-msgstr "VÃ¹ng báº¯t buá»c"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:57 
-#: ../views/mods/mod_produktattribute/list.phtml:17 
-#: ../views/mods/mod_productvars/pv_list.phtml:13 
-#: ../views/mods/mod_ordervars/ov_list.phtml:13
-msgid "Typ"
-msgstr "Loáº¡i"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:60
-msgid "Kundenvariable lÃ¶schen"
-msgstr "XoÃ¡ biáº¿n khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:69 ../views/admin/module.phtml:47 
-#: ../views/admin/ueber.phtml:48 ../views/admin/kundendaten_tab1.phtml:17 
-#: ../views/admin/kundendaten_tab1.phtml:32 
-#: ../views/admin/kundendaten_tab1.phtml:41 
-#: ../views/admin/kundendaten_tab1.phtml:50 
-#: ../views/admin/kundendaten_tab1.phtml:59 
-#: ../views/admin/kundendaten_tab1.phtml:68 
-#: ../views/admin/kundendaten_tab1.phtml:87 
-#: ../views/admin/kundendaten_tab1.phtml:96 
-#: ../views/admin/kundendaten_tab1.phtml:105 
-#: ../views/admin/kundendaten_tab1.phtml:114 
-#: ../views/admin/kundendaten_tab1.phtml:123 
-#: ../views/admin/kundendaten_tab1.phtml:132 
-#: ../views/admin/kundendaten_tab1.phtml:141 
-#: ../views/mods/mod_produktattribute/produkt_bottom.phtml:14 
-#: ../views/mods/mod_productvars/order_view_row.phtml:53 
-#: ../views/mods/mod_productvars/overview_row.phtml:23 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:51 
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:15 
-#: ../mods/wpsg_mod_ordervars.class.php:11 
-#: ../mods/wpsg_mod_ordervars.class.php:20 
-#: ../mods/wpsg_mod_productvars.class.php:17 
-#: ../mods/wpsg_mod_produktattribute.class.php:77
-msgid "Ja"
-msgstr "CÃ³"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:70 ../views/admin/module.phtml:46 
-#: ../views/admin/ueber.phtml:48 ../views/admin/kundendaten_tab1.phtml:18 
-#: ../views/admin/kundendaten_tab1.phtml:33 
-#: ../views/admin/kundendaten_tab1.phtml:42 
-#: ../views/admin/kundendaten_tab1.phtml:51 
-#: ../views/admin/kundendaten_tab1.phtml:60 
-#: ../views/admin/kundendaten_tab1.phtml:69 
-#: ../views/admin/kundendaten_tab1.phtml:88 
-#: ../views/admin/kundendaten_tab1.phtml:97 
-#: ../views/admin/kundendaten_tab1.phtml:106 
-#: ../views/admin/kundendaten_tab1.phtml:115 
-#: ../views/admin/kundendaten_tab1.phtml:124 
-#: ../views/admin/kundendaten_tab1.phtml:133 
-#: ../views/admin/kundendaten_tab1.phtml:142 
-#: ../views/mods/mod_produktattribute/produkt_bottom.phtml:14 
-#: ../views/mods/mod_productvars/order_view_row.phtml:53 
-#: ../views/mods/mod_productvars/overview_row.phtml:25 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:51 
-#: ../views/mods/mod_trustedshops/order_view_sidebar.phtml:15 
-#: ../mods/wpsg_mod_ordervars.class.php:11 
-#: ../mods/wpsg_mod_ordervars.class.php:20 
-#: ../mods/wpsg_mod_productvars.class.php:17 
-#: ../mods/wpsg_mod_produktattribute.class.php:77
-msgid "Nein"
-msgstr "KhÃŽng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:71
-msgid "Nicht zeigen"
-msgstr "KhÃŽng hiá»n thá»"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:76 
-#: ../views/mods/mod_produktattribute/list.phtml:32
-msgid "Textfeld"
-msgstr "VÃ¹ng vÄn báº£n"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:77 
-#: ../views/mods/mod_produktattribute/list.phtml:34
-msgid "Auswahlfeld"
-msgstr "Danh má»¥c kÃ©o xuá»ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:78 
-#: ../views/mods/mod_produktattribute/list.phtml:35 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:29 
-#: ../mods/wpsg_mod_ordervars.class.php:2 
-#: ../mods/wpsg_mod_productvars.class.php:2
-msgid "Checkbox"
-msgstr "Ã trá»ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:82 
-#: ../views/mods/mod_produktattribute/list.phtml:25
-msgid "HTML Code generieren"
-msgstr "Táº¡o mÃ£ HTML"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:95 
-#: ../views/admin/kundendaten_tab2.phtml:97 
-#: ../views/admin/versandzonen_list.phtml:44 
-#: ../views/admin/versandzonen_list.phtml:46 
-#: ../views/admin/versandzonen_list.phtml:55 
-#: ../views/admin/versandzonen_list.phtml:57 
-#: ../views/mods/mod_produktattribute/list.phtml:87 
-#: ../views/mods/mod_produktattribute/list.phtml:89 
-#: ../views/mods/mod_produktattribute/list.phtml:113 
-#: ../views/mods/mod_produktattribute/list.phtml:115 
-#: ../views/mods/mod_productvars/pv_list.phtml:33 
-#: ../views/mods/mod_productvars/pv_list.phtml:35 
-#: ../views/mods/mod_productvars/pv_list.phtml:55 
-#: ../views/mods/mod_productvars/pv_list.phtml:57 
-#: ../views/mods/mod_productvars/pv_list.phtml:81 
-#: ../views/mods/mod_productvars/pv_list.phtml:83 
-#: ../views/mods/mod_productvars/order_view_row.phtml:27 
-#: ../views/mods/mod_productvars/order_view_row.phtml:29 
-#: ../views/mods/mod_productvars/order_view_row.phtml:41 
-#: ../views/mods/mod_productvars/order_view_row.phtml:43 
-#: ../views/mods/mod_productvars/order_view_row.phtml:55 
-#: ../views/mods/mod_productvars/order_view_row.phtml:57 
-#: ../views/mods/mod_export/profil.phtml:27 
-#: ../views/mods/mod_export/profil.phtml:29 
-#: ../views/mods/mod_export/profil.phtml:48 
-#: ../views/mods/mod_export/profil.phtml:50 
-#: ../views/mods/mod_export/profil.phtml:69 
-#: ../views/mods/mod_export/profil.phtml:71 
-#: ../views/mods/mod_export/profil.phtml:209 
-#: ../views/mods/mod_export/profil.phtml:211 
-#: ../views/mods/mod_export/profil.phtml:222 
-#: ../views/mods/mod_export/profil.phtml:224 
-#: ../views/mods/mod_export/profil.phtml:243 
-#: ../views/mods/mod_export/profil.phtml:245 
-#: ../views/mods/mod_export/profil.phtml:256 
-#: ../views/mods/mod_export/profil.phtml:258 
-#: ../views/mods/mod_userpayment/list.phtml:34 
-#: ../views/mods/mod_userpayment/list.phtml:36 
-#: ../views/mods/mod_userpayment/list.phtml:45 
-#: ../views/mods/mod_userpayment/list.phtml:47 
-#: ../views/mods/mod_userpayment/list.phtml:58 
-#: ../views/mods/mod_userpayment/list.phtml:69 
-#: ../views/mods/mod_userpayment/list.phtml:71 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:29 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:31 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:40 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:42 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:53 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:55 
-#: ../views/mods/mod_ordervars/ov_list.phtml:35 
-#: ../views/mods/mod_ordervars/ov_list.phtml:37 
-#: ../views/mods/mod_ordervars/ov_list.phtml:61 
-#: ../views/mods/mod_ordervars/ov_list.phtml:63 
-#: ../views/mods/mod_ordervars/ov_list.phtml:109 
-#: ../views/mods/mod_ordervars/ov_list.phtml:111 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:40 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:42 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:51 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:53 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:60 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:62 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:166 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:168 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:178 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:180 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:192 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:194 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:208 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:210 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:283 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:285 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:300 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:302 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:313 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:315 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:327 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:329 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:358 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:360 
-#: ../views/mods/mod_versandarten/list.phtml:34 
-#: ../views/mods/mod_versandarten/list.phtml:36 
-#: ../views/mods/mod_versandarten/list.phtml:45 
-#: ../views/mods/mod_versandarten/list.phtml:47 
-#: ../views/mods/mod_versandarten/list.phtml:56 
-#: ../views/mods/mod_versandarten/list.phtml:58 
-#: ../views/mods/mod_versandarten/list.phtml:69 
-#: ../views/mods/mod_versandarten/list.phtml:71 
-#: ../views/mods/mod_versandarten/list.phtml:82 
-#: ../views/mods/mod_versandarten/list.phtml:84 
-#: ../views/mods/mod_versandarten/list.phtml:100 
-#: ../views/mods/mod_versandarten/list.phtml:102 
-#: ../views/mods/mod_versandarten/list.phtml:195 
-#: ../views/mods/mod_versandarten/list.phtml:197 
-#: ../views/mods/mod_ordercondition/list.phtml:22 
-#: ../views/mods/mod_ordercondition/list.phtml:24
-msgid "Zum Bearbeiten anklicken ..."
-msgstr "Nháº¥n Äá» chá»nh sá»­aâŠ"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:96 
-#: ../views/admin/versandzonen_list.phtml:45 
-#: ../views/admin/versandzonen_list.phtml:56 
-#: ../views/mods/mod_produktattribute/list.phtml:88 
-#: ../views/mods/mod_produktattribute/list.phtml:114 
-#: ../views/mods/mod_productvars/pv_list.phtml:34 
-#: ../views/mods/mod_productvars/pv_list.phtml:56 
-#: ../views/mods/mod_productvars/pv_list.phtml:82 
-#: ../views/mods/mod_productvars/order_view_row.phtml:28 
-#: ../views/mods/mod_productvars/order_view_row.phtml:42 
-#: ../views/mods/mod_productvars/order_view_row.phtml:56 
-#: ../views/mods/mod_export/profil.phtml:28 
-#: ../views/mods/mod_export/profil.phtml:49 
-#: ../views/mods/mod_export/profil.phtml:70 
-#: ../views/mods/mod_export/profil.phtml:210 
-#: ../views/mods/mod_export/profil.phtml:223 
-#: ../views/mods/mod_export/profil.phtml:244 
-#: ../views/mods/mod_export/profil.phtml:257 
-#: ../views/mods/mod_userpayment/list.phtml:35 
-#: ../views/mods/mod_userpayment/list.phtml:46 
-#: ../views/mods/mod_userpayment/list.phtml:57 
-#: ../views/mods/mod_userpayment/list.phtml:70 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:30 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:41 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:54 
-#: ../views/mods/mod_ordervars/ov_list.phtml:36 
-#: ../views/mods/mod_ordervars/ov_list.phtml:62 
-#: ../views/mods/mod_ordervars/ov_list.phtml:110 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:41 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:52 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:61 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:167 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:179 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:193 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:209 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:284 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:301 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:314 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:328 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:359 
-#: ../views/mods/mod_versandarten/list.phtml:35 
-#: ../views/mods/mod_versandarten/list.phtml:46 
-#: ../views/mods/mod_versandarten/list.phtml:57 
-#: ../views/mods/mod_versandarten/list.phtml:70 
-#: ../views/mods/mod_versandarten/list.phtml:83 
-#: ../views/mods/mod_versandarten/list.phtml:101 
-#: ../views/mods/mod_versandarten/list.phtml:196 
-#: ../views/mods/mod_ordercondition/list.phtml:23
-msgid "Speicher ..."
-msgstr "Äang lÆ°uâŠ"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:106
-msgid "AuswahlmÃ¶glichkeiten (\"|\" als Trenner)"
-msgstr "CÃ¡c lá»±a chá»n (sá»­ dá»¥ng dáº¥u cÃ¡ch \"|\")"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:114
-msgid "Kundenvariablen direkt abfragen"
-msgstr "YÃªu cáº§u trá»±c tiáº¿p cÃ¡c biáº¿n khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab2.phtml:116
-msgid "Keine benutzerdefinierten Kundenfelder angelegt."
-msgstr "Váº«n chÆ°a táº¡o vÃ¹ng tuá»³ biáº¿n khÃ¡ch hÃ ng nÃ o."
-
-# @ wpsg
-#: ../views/admin/path.phtml:26
-msgid "Pfadeinstellungen"
-msgstr "CÃ i Äáº·t ÄÆ°á»ng dáº«n"
-
-# @ wpsg
-#: ../views/admin/path.phtml:28
-msgid ""
-"Hier kÃ¶nnen die Pfade definiert werden, in denen der Shop seine Daten ablegt."
-msgstr "Báº¡n cÃ³ Äáº·t ÄÆ°á»ng dáº«n cho cá»­a hÃ ng lÆ°u thÃŽng tin táº¡i ÄÃ¢y."
-
-# @ wpsg
-#: ../views/admin/path.phtml:30
-msgid "Multiblog Upload Path (relativ zu wp-content)"
-msgstr "ÄÆ°á»ng dáº«n táº£i lÃªn Multiblog (liÃªn há» tá»i wp-content)"
-
-# @ default
-#: ../views/admin/path.phtml:30
-#, php-format
-msgid ""
-"Sollte den Platzhalter %blog_id% enthalten, dieser zeigt auf die ID des "
-"jeweiligen Blockes sonst kann es bei dem Betrieb von mehreren Shops zu "
-"Ãberschreibungen kommen."
-msgstr ""
-"Náº¿u placeholders% blog_id%, Äiá»u nÃ y cho tháº¥y ID cá»§a má»i khá»i náº¿u khÃŽng nÃ³ "
-"cÃ³ thá» dáº«n Äáº¿n viá»c ghi ÄÃš trong cÃ¡c hoáº¡t Äá»ng cá»§a má»t sá» cá»­a hÃ ng."
-
-# @ wpsg
-#: ../views/admin/path.phtml:34 ../views/admin/emailconf.phtml:69 
-#: ../views/admin/kundendaten.phtml:51 ../views/admin/includes.phtml:37 
-#: ../views/admin/module.phtml:82 ../views/admin/module.phtml:96 
-#: ../views/admin/module.phtml:99 ../views/admin/konfiguration.phtml:165 
-#: ../views/admin/presentation.phtml:47 ../views/admin/seiten.phtml:37 
-#: ../views/admin/blognetzwerk.phtml:44 
-#: ../views/admin/widerrufsbelehrung.phtml:70 ../views/admin/extended.phtml:60 
-#: ../views/admin/shopdata.phtml:47 ../views/admin/loadsavesettings.phtml:27 
-#: ../views/admin/kalkulation.phtml:48
-msgid "Einstellungen speichern"
-msgstr "LÆ°u cÃ¡c cÃ i Äáº·t"
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:27
-msgid "Hilfeseite zur E-Mail Konfiguration"
-msgstr "Trang trá»£ giÃºp cho cÃ i Äáº·t thÆ° Äiá»n tá»­"
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:30
-msgid ""
-"Hier kÃ¶nnen die Betreffs, EmpfÃ€nger und BCC/CC der E-Mails konfiguriert "
-"werden."
-msgstr "Báº¡n cÃ³ thá» Äáº·t chá»§ Äá», ngÆ°á»i nháº­n vÃ  BCC/CC cho thÆ° táº¡i ÄÃ¢y."
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:42
-msgid "Globale Vorgaben"
-msgstr "CÃ i Äáº·t toÃ n cáº§u"
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:47
-msgid "BestellbestÃ€tigung (Admin)"
-msgstr "XÃ¡c nháº­n ÄÆ¡n hÃ ng (Admin)"
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:48
-msgid "Diese Mail bekommt der Admin beim Eingang einer neuen Bestellung."
-msgstr "ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n admin khi nháº­n ÄÆ¡n Äáº·t hÃ ng má»i."
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:53
-msgid "BestellbestÃ€tigung (Kunde)"
-msgstr "XÃ¡c nháº­n ÄÆ¡n hÃ ng (KhÃ¡ch hÃ ng)"
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:54
-msgid "Diese Mail bekommt der Kunde nach DurchfÃŒhrung der Bestellung."
-msgstr "ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n khÃ¡ch hÃ ng sau khi Äáº·t hÃ ng."
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:60
-msgid "StatusÃ€nderung (Kunde)"
-msgstr "ThÃŽng bÃ¡o thay Äá»i tráº¡ng thÃ¡i (KhÃ¡ch hÃ ng)"
-
-# @ wpsg
-#: ../views/admin/emailconf.phtml:61
-msgid "Diese Mail bekommt der Kunde bei der Ãnderung des Bestellstatus."
-msgstr "ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n khÃ¡ch hÃ ng khi tráº¡ng thÃ¡i ÄÆ¡n hÃ ng ÄÆ°á»£c thay Äá»i."
-
-# @ wpsg
-#: ../views/admin/access.phtml:37
-msgid "MenÃŒpunkt sichtbar"
-msgstr "Danh má»¥c hiá»n thá»"
-
-# @ wpsg
-#: ../views/admin/access.phtml:58 ../views/admin/index.phtml:23 
-#: ../views/mods/mod_core/admin_register.phtml:12
-msgid "Lizenzverwaltung"
-msgstr "Quáº£n lÃœ giáº¥y phÃ©p"
-
-# @ wpsg
-#: ../views/admin/access.phtml:92
-msgid "Berechtigungen Speichern"
-msgstr "LÆ°u cÃ¡c quyá»n"
-
-# @ wpsg
-#: ../views/admin/versandzonen.phtml:35
-msgid "Sind Sie sich sicher, dass sie diese Versandzone lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ vÃ¹ng giao hÃ ng nÃ y?"
-
-# @ wpsg
-#: ../views/admin/versandzonen.phtml:121
-msgid "Neue Versandzone anlegen"
-msgstr "Táº¡o vÃ¹ng giao hÃ ng má»i"
-
-# @ wpsg
-#: ../views/admin/kundendaten_renderfield.phtml:15 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:282 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:248 
-#: ../views/warenkorb/checkout.phtml:210
-msgid "Bitte AuswÃ€hlen"
-msgstr "Vui lÃ²ng chá»n"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:11 ../views/admin/index.phtml:31
-msgid "Hilfe"
-msgstr "Há» trá»£"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:13
-msgid "Hier ein kleiner Ãberblick, wo welche Information zu finden ist:"
-msgstr "Báº£n tÃ³m táº¯t ngáº¯n cÃ¡c thÃŽng tin báº¡n cÃ³ thá» tÃ¬m tháº¥y á» ÄÃ¢y:"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:15
-msgid "Tutorials"
-msgstr "HÆ°á»ng dáº«n cho ngÆ°á»i má»i báº¯t Äáº§u"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:16
-msgid ""
-"In den Tutorial haben wir praxisnahe Beispiele verwendet, um die einzelnen "
-"Funktionen nÃ€her zu erklÃ€ren. Rechts im MenÃŒ kÃ¶nnen die Kategorien nÃ€her "
-"ausgewÃ€hlt werden, ganz oben gibt es ein Suchfenster, was ganz sehr gut "
-"funktioniert ;)"
-msgstr ""
-"ChÃºng tÃŽi sá»­ dá»¥ng cÃ¡c vÃ­ dá»¥ thá»±c táº¿ Äá» giáº£i thÃ­ch chi tiáº¿t cÃ¡c tÃ­nh nÄng. "
-"Báº¡n cÃ³ thá» lá»±a chá»n cÃ¡c má»¥c phÃ¢n loáº¡i trong danh má»¥c bÃªn pháº£i vÃ  tháº¥y thanh "
-"tÃ¬m kiáº¿m á» gÃ³c trÃªn."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:19
-msgid "Forum"
-msgstr "Diá»
-n ÄÃ n"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:20
-msgid ""
-"Alle Anfragen hinsichtlich Fehler, Inbetriebnahme und Administration "
-"beantworten wir zeitnah (wÃ€hrend unserer GeschÃ€ftszeiten). Vielleicht ist "
-"deine Frage bereits im Forum gestellt und beantwortet worden? Das "
-"Suchformular dort ist auch sehr mÃ€chtig, probiere es doch mal aus!"
-msgstr ""
-"ChÃºng tÃŽi tráº£ lá»i nhanh nháº¥t cÃ³ thá» (trong giá» lÃ m viá»c) má»i cÃ¢u há»i liÃªn "
-"quan Äáº¿n lá»i, viá»c sá»­ dá»¥ng vÃ  quáº£n lÃœ. Vui lÃ²ng sá»­ dá»¥ng thanh tÃ¬m kiáº¿m Äá» "
-"tÃ¬m cÃ¢u há»i cá»§a báº¡n trÆ°á»c khi gá»­i cÃ¢u há»i."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:21
-msgid ""
-"Bitte nutze generell das Forum fÃŒr eine Support-Anfrage, <u>nicht</u> unser "
-"Kontaktformular oder Telefon."
-msgstr ""
-"Vui lÃ²ng sá»­ dá»¥ng diá»
-n ÄÃ n cho cÃ¡c Äá» nghá» há» trá»£ vÃ  máº«u liÃªn láº¡c cá»§a chÃºng "
-"tÃŽi <u>not</u> hoáº·c Äiá»n thoáº¡i."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:24
-msgid "Feature Wunschliste"
-msgstr "TÃ­nh nÄng danh sÃ¡ch Æ°a thÃ­ch"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:25
-msgid ""
-"Wir orientieren uns direkt am Markt. Insofern geben wir dir als User die "
-"MÃ¶glichkeit mitzuentscheiden, welches Feature wpShopGermany zukÃŒnftig haben "
-"wird. Du kannst selber einen Feature-Wunsch anlegen, oder fÃŒr einen "
-"bestehenden Wunsch deine Stimme abgeben."
-msgstr ""
-"ChÃºng tÃŽi táº­p trung trá»±c tiáº¿p trÃªn thá» trÆ°á»ng. Vá» máº·t nÃ y, chÃºng tÃŽi cung "
-"cáº¥p cho báº¡n nhÆ° lÃ  má»t ngÆ°á»i sá»­ dá»¥ng quyáº¿t Äá»nh cÃ¹ng kháº£ nÄng cÃ³ tÃ­nh nÄng "
-"wpShopGermany sáºœ cÃ³ trong tÆ°Æ¡ng lai. Báº¡n cÃ³ thá» tá»± táº¡o ra má»t yÃªu cáº§u tÃ­nh "
-"nÄng, hoáº·c bá» phiáº¿u cho má»t yÃªu cáº§u hiá»n cÃ³."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:28
-msgid "Import aus wpShopGermany 2.5.8"
-msgstr "Nháº­p tá»« wpShopGermany 2.5.8"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:29
-msgid ""
-"Mit dieser Funktion kÃ¶nnen sie den Export aus einem wpShopGermany 2.5.8 in "
-"diese Version importieren"
-msgstr ""
-"Báº¡n cÃ³ thá» dÃ¹ng tÃ­nh nÄng nÃ y Äá» nháº­p dá»¯ liá»u ÄÃ£ xuáº¥t trÆ°á»c ÄÃ³ tá»« "
-"wpShopGermany phiÃªn báº£n 2.5.8."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:30
-msgid "Sichern Sie in jedem Fall vorher ihre Daten!"
-msgstr "HÃ£y Äáº£m báº£o ráº±ng ÄÃ£ táº¡o báº£n sao dá»± phÃ²ng dá»¯ liá»u trÆ°á»c khi tiáº¿n hÃ nh!"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:34
-msgid ""
-"FÃŒr den Import der Daten aus der Version 2 gibt es 3 Wege, beachten Sie dazu "
-"unsere <a href=\"#1#\">Upgrade Anleitung</a>."
-msgstr ""
-"Báº¡n cÃ³ 3 lá»±a chá»n Äá» nháº­p dá»¯ liá»u tá»« wpShopGermany phiÃªn báº£n 2. Vui lÃ²ng chÃº "
-"Ãœ tá»i <a href=\"#1#\">upgrade manual</a> cá»§a chÃºng tÃŽi."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:38
-msgid "Update innerhalb der Datenbank"
-msgstr "Cáº­p nháº­t trong cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:41
-msgid ""
-"WÃ€hlen Sie diese Option wenn sie das Plugin direkt in diesem Wordpress mit "
-"der Version2 ausgetauscht haben."
-msgstr ""
-"Nháº¥n vÃ o lá»±a chá»n nÃ y náº¿u báº¡n ÄÃ£ cáº­p nháº­t Plugin trong quÃ¡ trÃ¬nh cÃ i Äáº·t "
-"Wordpress."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:42
-msgid ""
-"Sie kÃ¶nnen diesen Import mehrfach durchfÃŒhren. Starten Sie einen Testlauf "
-"und prÃŒfen Sie anschlieÃend die Daten. Sollte alles OK sein, so kÃ¶nnen Sie "
-"den Durchlauf ein zweites mal durchfÃŒhren und die Tabellen und Daten lÃ¶schen."
-msgstr ""
-"Báº¡n cÃ³ thá» thá»±c hiá»n nháº­p dá»¯ liá»u nÃ y nhiá»u láº§n. Báº¯t Äáº§u cháº¡y thá»­ nghiá»m vÃ  "
-"kiá»m tra dá»¯ liá»u. Náº¿u khÃŽng cÃ³ lá»i, báº¡n cÃ³ thá» cháº¡y nháº­p dá»¯ liá»u láº§n hai vÃ  "
-"xoÃ¡ cÃ¡c báº£ng vÃ  dá»¯ liá»u cÅ©."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:45
-msgid "Alte Tabellen und Daten nach Import lÃ¶schen."
-msgstr "XoÃ¡ cÃ¡c báº£ng vÃ  dá»¯ liá»u cÅ© sau khi nháº­p dá»¯ liá»u."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:47 ../views/admin/hilfe.phtml:62 
-#: ../views/admin/hilfe.phtml:70 ../views/admin/laender.phtml:215 
-#: ../views/order/index.phtml:532 ../views/mods/mod_gutschein/index.phtml:302 
-#: ../views/mods/mod_export/settings_edit.phtml:32 
-#: ../views/mods/mod_productgroups/index.phtml:39
-msgid "Sind Sie sich sicher?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n thá»±c hiá»n?"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:47
-msgid "Import durchfÃŒhren"
-msgstr "Tiáº¿n hÃ nh nháº­p"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:51
-msgid "Die vorher installierte wpShopGermany Version ist nicht kompatibel"
-msgstr "PhiÃªn báº£n cÃ i Äáº·t trÆ°á»c ÄÃ³ khÃŽng tÆ°Æ¡ng thÃ­ch."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:55
-msgid ""
-"Diese Option steht ihnen nur zur VerfÃŒgung wenn sie vorher eine Version 2.5."
-"8 des wpShopGermany installiert hatten."
-msgstr ""
-"Lá»±a chá»n nÃ y chá» kháº£ thi khi trÆ°á»c ÄÃ³ báº¡n ÄÃ£ cÃ i Äáº·t wpShopGermany phiÃªn báº£n "
-"2.5.8. "
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:60
-msgid ""
-"Import aus der exportierten Datendatei ÃŒber Datei Upload (Aus Version 2.5.8)"
-msgstr ""
-"Nháº­p tá»« dá»¯ liá»u ÄÃ£ xuáº¥t thÃŽng qua TÃ­nh nÄng Táº£i dá»¯ liá»u lÃªn (PhiÃªn báº£n 2.5.8)"
-"."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:62 ../views/mods/mod_export/profil.phtml:156
-msgid "Hochladen"
-msgstr "Táº£i lÃªn"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:65
-msgid "Import einer per FTP hochgeladenen Datendatei (Aus Version 2.5.8)"
-msgstr ""
-"Nháº­p tá»« tá»p dá»¯ liá»u ÄÃ£ ÄÆ°á»£c táº£i lÃªn qua phÆ°Æ¡ng thá»©c FTP (PhiÃªn báº£n 2.5.8)"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:66
-msgid "Dazu muss die Datei unter folgendem Pfad abgelegt werden:"
-msgstr "Tá»p tin pháº£i ÄÆ°á»£c lÆ°u trá»¯ á» Äá»a chá» sau:"
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:69
-msgid ""
-"Datei erkannt, klicken Sie auf \"Importieren\" um den Import zu starten."
-msgstr "ÄÃ£ tÃ¬m tháº¥y tá»p tin, nháº¥n vÃ o \\\"Import\\\" Äá» khá»i Äá»ng quÃ¡ trÃ¬nh."
-
-# @ wpsg
-#: ../views/admin/hilfe.phtml:72
-msgid "Keine Datei an dieser Stelle gefunden."
-msgstr "KhÃŽng tÃ¬m tháº¥y tá»p nÃ o á» Äá»a chá» nÃ y."
-
-# @ wpsg
-#: ../views/admin/laender_edit.phtml:6
-msgid "KÃŒrzel"
-msgstr "MÃ£"
-
-# @ wpsg
-#: ../views/admin/laender_edit.phtml:7 ../views/admin/laender.phtml:40 
-#: ../views/mods/mod_versandarten/list.phtml:159
-msgid "Versandzone"
-msgstr "VÃ¹ng váº­n chuyá»n"
-
-# @ wpsg
-#: ../views/admin/kundendaten.phtml:30
-msgid "Pfllichtfelder"
-msgstr "VÃ¹ng báº¯t buá»c"
-
-# @ wpsg
-#: ../views/admin/kundendaten.phtml:31
-msgid "Weitere Kundendaten"
-msgstr "Dá»¯ liá»u khÃ¡ch hÃ ng thÃªm"
-
-# @ wpsg
-#: ../views/admin/kundendaten.phtml:33
-msgid "Neues Kundenfeld hinzufÃŒgen"
-msgstr "ThÃªm vÃ¹ng khÃ¡ch hÃ ng"
-
-# @ wpsg
-#. translators: plugin header field 'Name'
-#: ../views/admin/index.phtml:13
-msgid "wpShopGermany"
-msgstr "wpShopGermany"
-
-# @ wpsg
-#: ../views/admin/index.phtml:21
-msgid "Module"
-msgstr "CÃ¡c Module"
-
-# @ wpsg
-#: ../views/admin/index.phtml:32
-msgid "Ãber"
-msgstr "Vá»"
-
-# @ wpsg
-#: ../views/admin/includes.phtml:27
-msgid "JQuery einbinden"
-msgstr "ChÃšn jQuery"
-
-# @ wpsg
-#: ../views/admin/includes.phtml:30
-msgid "Javascript Validierung laden"
-msgstr "Táº£i phÃª chuáº©n JavaScript "
-
-# @ wpsg
-#: ../views/admin/includes.phtml:31
-msgid "CSS der Javascript Validierung laden"
-msgstr "Táº£i CSS cá»§a phÃª chuáº©n JavaScript "
-
-# @ wpsg
-#: ../views/admin/module.phtml:42
-msgid "Modul aktiviert"
-msgstr "Module ÄÃ£ ÄÆ°á»£c kÃ­ch hoáº¡t"
-
-# @ wpsg
-#: ../views/admin/module.phtml:54
-msgid "Version"
-msgstr "PhiÃªn báº£n"
-
-# @ wpsg
-#: ../views/admin/module.phtml:57 ../views/mods/mod_core/module_index.phtml:27
-msgid "Lizenz"
-msgstr "Giáº¥y phÃ©p"
-
-# @ wpsg
-#: ../views/admin/module.phtml:62
-msgid "Kostenfrei"
-msgstr "Miá»
-n phÃ­"
-
-# @ wpsg
-#: ../views/admin/module.phtml:65
-msgid "Aktiviert"
-msgstr "ÄÃ£ kÃ­ch hoáº¡t"
-
-# @ wpsg
-#: ../views/admin/module.phtml:68
-msgid "Demo Modus noch #1# Tage verbleibend."
-msgstr "Cháº¿ Äá» thá»­ nghiá»m, cÃ²n #1# ngÃ y."
-
-# @ wpsg
-#: ../views/admin/module.phtml:70
-msgid "Demo Modus abgelaufen."
-msgstr "Cháº¿ Äá» thá»­ nghiá»m háº¿t háº¡n."
-
-# @ wpsg
-#: ../views/admin/kundendaten_codeinfo.phtml:8
-msgid ""
-"Code fÃŒr die Abfrage der Kundenvariable mit der ID #1# (Muss im checkout2."
-"phtml verwendet werden)"
-msgstr ""
-"MÃ£ phá»¥c há»i biáº¿n khÃ¡ch hÃ ng vá»i id #1# (pháº£i sá»­ dá»¥ng trong checkout2.phtml)"
-
-# @ wpsg
-#: ../views/admin/kundendaten_codeinfo.phtml:14
-msgid ""
-"Code fÃŒr die Ausgabe der Kundenvariable mit der ID #1# (WÃ€hrend die "
-"Bestellung noch nicht ÃŒbertragen wurde)"
-msgstr ""
-"MÃ£ phá»¥c há»i biáº¿n khÃ¡ch hÃ ng vá»i id #1# (pháº£i sá»­ dá»¥ng trong checkout2.phtml)"
-
-# @ wpsg
-#: ../views/admin/kundendaten_codeinfo.phtml:20
-msgid ""
-"Code fÃŒr die Ausgabe der Kundenvariable mit der ID #1# (Nachdem der Kunde in "
-"der Datenbank angelegt ist)"
-msgstr ""
-"MÃ£ phá»¥c há»i biáº¿n khÃ¡ch hÃ ng vá»i id #1# (sau khi ÄÃ£ thÃªm khÃ¡ch hÃ ng vÃ o cÆ¡ sá» "
-"dá»¯ liá»u)"
-
-# @ wpsg
-#: ../views/admin/kundendaten_codeinfo.phtml:26
-msgid "%kunde_id% muss durch die ID des Kunden in der Datenbank ersetzt werden"
-msgstr "%kunde_id% pháº£i ÄÆ°á»£c thay tháº¿ vá»i mÃ£ ID khÃ¡ch hÃ ng trong cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/admin/versandzonen_list.phtml:9
-msgid "Bisher keine Versandzonen hinterlegt."
-msgstr "ChÆ°a cÃ³ vÃ¹ng giao hÃ ng nÃ o ÄÆ°á»£c lÆ°u."
-
-# @ wpsg
-#: ../views/admin/versandzonen_list.phtml:13 
-#: ../views/mods/mod_produktattribute/list.phtml:14 
-#: ../views/mods/mod_userpayment/list.phtml:97 
-#: ../views/mods/mod_su/settings_edit.phtml:40 
-#: ../views/mods/mod_autodebit/settings_edit.phtml:8 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:9 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:31 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:50 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:67 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:87 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:104 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:126 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:172 
-#: ../views/mods/mod_paypal/settings_edit.phtml:9 
-#: ../views/mods/mod_invoice_type/settings_edit.phtml:8 
-#: ../views/mods/mod_debitpayment/settings_edit.phtml:8 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:11 
-#: ../views/mods/mod_versandarten/list.phtml:129 
-#: ../views/mods/mod_ordercondition/list.phtml:77 
-#: ../views/mods/mod_freeshipping/settings_edit.phtml:8
-msgid "Bezeichnung"
-msgstr "MÃŽ táº£"
-
-# @ wpsg
-#: ../views/admin/versandzonen_list.phtml:33
-msgid "Versandzone lÃ¶schen"
-msgstr "XoÃ  vÃ¹ng giao hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:30
-msgid "Lizenzende"
-msgstr "Káº¿t thÃºc giáº¥y phÃ©p"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:34
-msgid "Vor #1# Tage(n) abgelaufen."
-msgstr "ÄÃ£ háº¿t háº¡n #1# ngÃ y trÆ°á»c."
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:36
-msgid "#1# Tage verbleibend."
-msgstr "CÃ²n #1# ngÃ y."
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:45
-msgid "Lizenzstatus"
-msgstr "Tráº¡ng thÃ¡i giáº¥y phÃ©p"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:84
-msgid "Update"
-msgstr "Cáº­p nháº­t"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:87
-msgid ""
-"Die Version der Datenbank stimmt nicht mit der installierten Version ÃŒberein!"
-"<br />Bitte klicken Sie auf "
-msgstr ""
-"PhiÃªn báº£n dá»¯ liá»u khÃŽng phÃ¹ há»£p vá»i phiÃªn báº£n wpShopGermany ÄÃ£ cÃ i Äáº·t <br />"
-"Vui lÃ²ng nháº¥n"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:87 ../views/admin/konfiguration.phtml:98
-msgid "Aktualisieren"
-msgstr "Cáº­o nháº­t"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:87
-msgid "Produkte etc. werden dabei nicht gelÃ¶scht."
-msgstr "Sáº£n pháº©m v.vâŠ sáºœ khÃŽng bá» xoÃ¡."
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:95
-msgid "Installierte DB Version"
-msgstr "PhiÃªn báº£n DB ÄÃ£ ÄÆ°á»£c cÃ i Äáº·t"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:108 ../mods/wpsg_mod_export.class.php:22
-msgid "WÃ€hrung"
-msgstr "ÄÆ¡n vá» tiá»n tá»"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:123
-msgid "Produkte pro Seite"
-msgstr "Sáº£n pháº©m má»i trang"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:132
-msgid "Bestellungen pro Seite"
-msgstr "ÄÆ¡n Äáº·t hÃ ng má»i trang"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:134
-msgid "Bestellungen fÃŒr 0 #1# direkt abschlieÃen"
-msgstr "HoÃ n thÃ nh ÄÆ¡n hÃ ng cho 0 #1# ngay"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:135
-msgid "Nach neuem Produkt im Warenkorb"
-msgstr "Sau khi thÃªm má»t sáº£n pháº©m vÃ o giá» hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:138
-msgid "Zum Warenkorb leiten"
-msgstr "Chuyá»n Äáº¿n giá» hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:139
-msgid "Warenkorb im Fenster anzeigen"
-msgstr "Hiá»n thá» giá» hÃ ng trong cá»­a sá» má»i "
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:143
-msgid "Kundendaten nach Bestellung"
-msgstr "Dá»¯ liá»u khÃ¡ch hÃ ng sau khi Äáº·t hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:144
-msgid "In Session belassen"
-msgstr "Giá»¯ trong phiÃªn giao dá»ch"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:147
-msgid "Formatierung Kundennummer"
-msgstr "Äá»nh dáº¡ng sá» ID khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:148 
-#: ../views/mods/mod_productgroups/settings_edit.phtml:11
-msgid "Alphabetisch"
-msgstr "Thá»© tá»± chá»¯ cÃ¡i"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:149
-msgid "Start fÃŒr Kundennummer"
-msgstr "Khá»i Äá»ng cho sá» ID khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:150
-msgid "Formatierung Bestellnummer"
-msgstr "Äá»nh dáº¡ng sá» ID ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/admin/konfiguration.phtml:151
-msgid "Start fÃŒr Bestellnummer"
-msgstr "Khá»i Äá»ng cho sá» ID ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:27
-msgid "Bitte wÃ€hlen Sie aus, was Sie entfernen mÃ¶chten?"
-msgstr "Vui lÃ²ng chá»n má»¥c báº¡n muá»n xoÃ¡."
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:30
-msgid "Produkte (#1# DatensÃ€tze)"
-msgstr "Sáº£n pháº©m (#1# bá» dá»¯ liá»u)"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:33
-msgid "Kunden (#1# DatensÃ€tze)"
-msgstr "KhÃ¡ch hÃ ng (#1# bá» dá»¯ liá»u)"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:36
-msgid "Bestellungen (#1# DatensÃ€tze)"
-msgstr "CÃ¡c ÄÆ¡n Äáº·t hÃ ng (#1# bá» dá»¯ liá»u)"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:44
-msgid "Plugin, Programmdateien, Moduldateien und Datenbanktabellen"
-msgstr "Plugin, tá»p tin chÆ°Æ¡ng trÃ¬nh, tá»p Module vÃ  báº£ng cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:47
-msgid "Deinstallation durchfÃŒhren"
-msgstr "Thá»±c hiá»n quÃ¡ tÃ¬nh dá»¡ cÃ i Äáº·t"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:50
-msgid ""
-"Hinweis: Es werden hier auch bereits gelÃ¶schte DatensÃ€tze angezeigt, da "
-"diese noch im System hinterlegt bleiben."
-msgstr ""
-"LÆ°u Ãœ: Bá» dá»¯ liá»u ÄÃ£ xoÃ¡ sáºœ ÄÆ°á»£c hiá»n thá» á» ÄÃ¢y vÃ  sáºœ ÄÆ°á»£c giá»¯ trong cÆ¡ sá» "
-"dá»¯ liá»u vÃ  chá» ÄÆ°á»£c ÄÃ¡nh dáº¥u lÃ  \\\"ÄÃ£ xoÃ¡\\\"."
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:51
-msgid "Das Deinstallieren ist aber nicht umkehrbar!"
-msgstr "QuÃ¡ trÃ¬nh dá»¡ cÃ i Äáº·t khÃŽng thá» khÃŽi phá»¥c!"
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:65
-msgid "Bitte mindestens eine Option wÃ€hlen."
-msgstr "Vui lÃ²ng ÄÆ°a ra Ã­t nháº¥t má»t lá»±a chá»n."
-
-# @ wpsg
-#: ../views/admin/deinstall.phtml:69
-msgid "Sind Sie sich sicher? Der Vorgang ist nicht umkehrbar!"
-msgstr ""
-"Báº¡n cÃ³ cháº¯c cháº¯n muá»n thá»±c hiá»n hoáº¡t Äá»ng nÃ y? QuÃ¡ trÃ¬nh nÃ y khÃŽng thá» ÄÆ°á»£c "
-"Äáº£o ngÆ°á»£c."
-
-# @ wpsg
-#: ../views/admin/presentation.phtml:26
-msgid "MwSt. Spalte auch bei einem Satz zeigen"
-msgstr "Hiá»n thá» cá»t Thuáº¿ GTGT cho má»i tá»· lá»"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:30
-msgid "ÃŒber diese Installation"
-msgstr "vá» cÃ i Äáº·t nÃ y"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:44
-msgid "wpShopGermany Version"
-msgstr "PhiÃªn báº£n wpShopGermany"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:45
-msgid "aktivierte wpShopGermany-Module"
-msgstr "Module wpShopGermany ÄÃ£ kÃ­ch hoáº¡t"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:46
-msgid "WordPress Version"
-msgstr "PhiÃªn báº£n Wordpress"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:47
-msgid "PHP Version"
-msgstr "PhiÃªn báº£n PHP"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:49
-msgid "php.ini Einstellungen"
-msgstr "CÃ i Äáº·t php.ini"
-
-# @ wpsg
-#: ../views/admin/ueber.phtml:50
-msgid "geladene PHP Erweiterungen"
-msgstr "ÄuÃŽi má» rá»ng PHP ÄÃ£ táº£i"
-
-# @ wpsg
-#: ../views/admin/seiten.phtml:29
-msgid "Warenkorbseite"
-msgstr "Trang Giá» hÃ ng"
-
-# @ wpsg
-#: ../views/admin/blognetzwerk.phtml:29
-msgid "Sie befinden sich in einer Multiblog Umgebung."
-msgstr "Báº¡n Äang trong mÃŽi trÆ°á»ng nhiá»u Blog."
-
-# @ wpsg
-#: ../views/admin/blognetzwerk.phtml:33
-msgid "Jeden Blog getrennt behandeln"
-msgstr "Xá»­ lÃœ má»i Blog riÃªng láº»"
-
-# @ wpsg
-#: ../views/admin/blognetzwerk.phtml:41
-msgid ""
-"Nach der Umstellung dieser Option sollte in den Blogs in denen der Shop noch "
-"verwendet wird die Shop Datenbank aktualisiert werden. (Einstellungen -> "
-"Allgemein)"
-msgstr ""
-"Sau khi ÄÃ£ thay Äá»i lá»±a chá»n nÃ y, báº¡n nÃªn cáº­p nháº­t cÆ¡ sá» dá»¯ liá»u cho Blog. "
-"(CÃ i Äáº·t --> CÃ i Äáº·t chung)"
-
-# @ wpsg
-#: ../views/admin/widerrufsbelehrung.phtml:29
-msgid ""
-"Dieser Text wird in die Mail eingebunden, die der Kunde als "
-"BestellbestÃ€tigung erhÃ€lt."
-msgstr ""
-"VÄn báº£n nÃ y ÄÆ°á»£c thÃªm vÃ o thÆ° gá»­i Äáº¿n khÃ¡ch hÃ ng khi xÃ¡c nháº­n ÄÆ¡n hÃ ng."
-
-# @ wpsg
-#: ../views/admin/migratemwst.phtml:42 
-#: ../views/mods/mod_userpayment/settings_edit.phtml:71 
-#: ../mods/wpsg_mod_userpayment.class.php:2
-msgid "Zahlvarianten"
-msgstr "CÃ¡c phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/admin/migratemwst.phtml:51 
-#: ../views/mods/mod_versandarten/settings_edit.phtml:91 
-#: ../views/warenkorb/checkout2.phtml:23 
-#: ../mods/wpsg_mod_versandarten.class.php:2
-msgid "Versandarten"
-msgstr "CÃ¡c phÆ°Æ¡ng thá»©c giao hÃ ng"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:26
-msgid "SALT SchlÃŒssel"
-msgstr "KhoÃ¡ SALT"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:27
-msgid "RTE Felder mit nl2br speichern"
-msgstr "LÆ°u vÃ¹ng RTE vá»i nl2br"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:28
-msgid "Debug Modus"
-msgstr "Cháº¿ Äá» gá»¡ lá»i"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:34
-msgid "RequestURI als ProduktURL verwenden"
-msgstr "Sá»­ dá»¥ng RequestURI nhÆ° ProductURL"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:35
-msgid "User Views ignorieren"
-msgstr "Bá» qua lÆ°á»£t xem cá»§a ngÆ°á»i dÃ¹ng"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:36
-msgid "Klassisches Upload Formular"
-msgstr "Máº«u táº£i lÃªn "
-
-# @ wpsg
-#: ../views/admin/extended.phtml:37
-msgid "Ausgaben im Warenkorb direkt ausgeben"
-msgstr "Hiá»n thá» Äáº§u ra trong giá» hÃ ng trá»±c tiáº¿p"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:38
-msgid "ApplyFilter Funktion nicht anwenden"
-msgstr "KhÃŽng Ã¡p dá»¥ng tÃ­nh nÄng ApplyFilter"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:39
-msgid "RTE Felder mit nl2br ausgeben"
-msgstr "Hiá»n thá» vÃ¹ng RTE vá»i nl2br"
-
-# @ wpsg
-#: ../views/admin/extended.phtml:40
-msgid "ZeilenumbrÃŒche im Export entfernen"
-msgstr "Huá»· cÃ¡ch dÃ²ng trong quÃ¡ trÃ¬nh xuáº¥t"
-
-# @ wpsg
-#: ../views/admin/shopdata.phtml:29 ../mods/wpsg_mod_export.class.php:22
-msgid "Faxnummer"
-msgstr "Sá» fax"
-
-# @ wpsg
-#: ../views/admin/shopdata.phtml:30 ../views/order/view.phtml:238 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:297 
-#: ../views/mods/mod_kundenverwaltung/getpwd.phtml:20 
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:31 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:26 
-#: ../views/mods/mod_core/admin_register.phtml:40 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "E-Mail"
-msgstr "Email"
-
-# @ wpsg
-#: ../views/admin/shopdata.phtml:34 ../views/order/view.phtml:191 
-#: ../views/order/view.phtml:209 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:154 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:220 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:14 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:67
-msgid "Anschrift"
-msgstr "Äá»a chá»"
-
-# @ wpsg
-#: ../views/admin/shopdata.phtml:37 ../views/admin/kundendaten_tab1.phtml:111 
-#: ../views/order/view.phtml:213 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:240 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:205 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:71 
-#: ../views/warenkorb/checkout.phtml:167
-msgid "Postleitzahl"
-msgstr "MÃ£ bÆ°u Äiá»n"
-
-# @ wpsg
-#: ../views/admin/shopdata.phtml:42 
-#: ../views/mods/mod_autodebit/mail_html.phtml:11 
-#: ../views/mods/mod_autodebit/paymenthint.phtml:57 
-#: ../views/mods/mod_autodebit/mail.phtml:9 
-#: ../views/mods/mod_autodebit/order_view_afterpayment.phtml:9
-msgid "Name der Bank"
-msgstr "TÃªn ngÃ¢n hÃ ng"
-
-# @ wpsg
-#: ../views/admin/shopdata.phtml:43 
-#: ../views/mods/mod_prepayment/mail_html.phtml:14 
-#: ../views/mods/mod_prepayment/mail.phtml:11 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:28
-msgid "Kontoinhaber"
-msgstr "Chá»§ tÃ i khoáº£n"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab1.phtml:10
-msgid "Feldbezeichnung"
-msgstr "MÃŽ táº£ vÃ¹ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab1.phtml:14 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:148 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:134 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:293 
-#: ../views/warenkorb/checkout.phtml:98
-msgid "Anrede"
-msgstr "Danh xÆ°ng"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab1.phtml:23
-msgid "MÃ¶gliche Werte fÃŒr Auswahl getrennt mit |"
-msgstr "CÃ¡c giÃ¡ trá» kháº£ dá»¥ng ÄÆ°á»£c tÃ¡ch bá»i dáº¥u |"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab1.phtml:38 ../views/order/view.phtml:210 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:159 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:145 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:295 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:18 
-#: ../views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml:68 
-#: ../views/mods/mod_core/admin_register.phtml:34 
-#: ../views/warenkorb/checkout.phtml:109 ../mods/wpsg_mod_export.class.php:22
-msgid "Vorname"
-msgstr "TÃªn"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab1.phtml:56 ../views/order/view.phtml:221 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:296 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Geburtsdatum"
-msgstr "NgÃ y ThÃ¡ng NÄm Sinh"
-
-# @ wpsg
-#: ../views/admin/kundendaten_tab1.phtml:138 ../views/order/view.phtml:233 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:266 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:231 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:305 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:54 
-#: ../views/warenkorb/checkout.phtml:193 ../views/warenkorb/overview.phtml:100
-msgid "UStIdNr."
-msgstr "MÃ£ sá» thuáº¿ GTGT"
-
-# @ wpsg
-#: ../views/admin/loadsavesettings.phtml:30
-msgid "Einstellungen als XML Datei downloaden"
-msgstr "Táº£i cÃ i Äáº·t tá»p XML"
-
-# @ wpsg
-#: ../views/admin/loadsavesettings.phtml:36
-msgid "Einstellungen laden"
-msgstr "CÃ i Äáº·t táº£i vá»"
-
-# @ wpsg
-#: ../views/admin/loadsavesettings.phtml:43
-msgid "Einstellungen ÃŒbernehmen"
-msgstr "Ãp dá»¥ng cÃ i Äáº·t"
-
-# @ wpsg
-#: ../views/admin/loadsavesettings.phtml:45
-msgid ""
-"Derzeit werden nur die Einstellungen gespeichert. "
-"Produkte/Kunden/Bestellungen etc. sind nicht enthalten!"
-msgstr ""
-"Hiá»n táº¡i chá» cÃ³ cÃ i Äáº·t ÄÆ°á»£c lÆ°u. ChÆ°a bao gá»m Sáº£n pháº©m/KhÃ¡ch hÃ ng/ÄÆ¡n hÃ ng!"
-
-# @ wpsg
-#: ../views/admin/musterwiderruf.pdf.phtml:52 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:16
-msgid "PLZ/Ort"
-msgstr "MÃ£ bÆ°u Äiá»n/thÃ nh phá»"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:25
-msgid "Kleinunternehmerregelung"
-msgstr "Quáº£n lÃœ giáº¥y phÃ©p"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:30
-msgid "Preisangaben im Shop (Backend)"
-msgstr "GiÃ¡ trong Shop (Back-end)"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:34 ../views/admin/kalkulation.phtml:40
-msgid "Brutto (inkl. Steuer)"
-msgstr "Tá»ng giÃ¡ (gá»m thuáº¿)"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:35 ../views/admin/kalkulation.phtml:40
-msgid "Netto (zzgl. Steuer)"
-msgstr "GiÃ¡ thá»±c (cá»ng thuáº¿)"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:40
-msgid "Preisangaben im Shop (Frontend)"
-msgstr "GiÃ¡ trong Shop (Front-end)"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:43
-msgid "Versandkosten bei 0 ausblenden"
-msgstr "áºšn giÃ¡ váº­n chuyá»n khi báº±ng 0"
-
-# @ wpsg
-#: ../views/admin/kalkulation.phtml:44
-msgid "Zahlungskosten bei 0 ausblenden"
-msgstr "áºšn giÃ¡ thanh toÃ¡n khi báº±ng 0"
-
-# @ wpsg
-#: ../views/order/orderlog.phtml:11
-msgid "Datum"
-msgstr "NgÃ y"
-
-# @ wpsg
-#: ../views/order/orderlog.phtml:12
-msgid "Titel"
-msgstr "Danh xÆ°ng"
-
-# @ wpsg
-#: ../views/order/orderlog.phtml:20
-msgid "Anzeigen/Verbergen"
-msgstr "Hiá»n thá»\\áº©n"
-
-# @ wpsg
-#: ../views/order/orderlog.phtml:31
-msgid "Noch keine EintrÃ€ge"
-msgstr "ChÆ°a nháº­p dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/order/index.phtml:138
-msgid "Bestellungen von Kunden #1#"
-msgstr "ÄÆ¡n hÃ ng cá»§a khÃ¡ch hÃ ng #1#"
-
-# @ wpsg
-#: ../views/order/index.phtml:139
-msgid "Alle anzeigen"
-msgstr "Hiá»n thá» táº¥t cáº£"
-
-# @ wpsg
-#: ../views/order/index.phtml:167
-msgid "Bestellung suchen"
-msgstr "TÃ¬m kiáº¿m ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/order/index.phtml:222 ../views/order/index.phtml:366 
-#: ../views/order/index.phtml:511 ../views/mods/mod_gutschein/index.phtml:196 
-#: ../views/mods/mod_gutschein/index.phtml:272 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:160 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:226 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:306 
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:10 
-#: ../views/mods/mod_newsletter/customer_sidebar.phtml:15
-msgid "Status"
-msgstr "Tráº¡ng thÃ¡i"
-
-# @ wpsg
-#: ../views/order/index.phtml:268
-msgid "Auswahl einschrÃ€nken"
-msgstr "Giá»i háº¡n lá»±a chá»n"
-
-# @ wpsg
-#: ../views/order/index.phtml:322 ../views/order/index.phtml:467 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:142 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:208
-msgid "Nr."
-msgstr "Sá»"
-
-# @ wpsg
-#: ../views/order/index.phtml:328 ../views/order/index.phtml:473
-msgid "Kunde"
-msgstr "KhÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/order/index.phtml:334 ../views/order/index.phtml:479
-msgid "Bezahlmethode"
-msgstr "PhÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/order/index.phtml:346 ../views/order/index.phtml:491 
-#: ../views/mods/mod_productgroups/index.phtml:28 
-#: ../views/mods/mod_productgroups/index.phtml:55 
-#: ../views/mods/mod_productindex/page_metabox.phtml:13 
-#: ../mods/wpsg_mod_varianten.class.php:2 
-#: ../mods/wpsg_mod_produktbilder.class.php:2 
-#: ../mods/wpsg_mod_deliverytime.class.php:2 
-#: ../mods/wpsg_mod_productindex.class.php:2 
-#: ../mods/wpsg_mod_fuellmenge.class.php:2 
-#: ../mods/wpsg_mod_productgroups.class.php:2 
-#: ../mods/wpsg_mod_scaleprice.class.php:2 ../mods/wpsg_mod_stock.class.php:2 
-#: ../mods/wpsg_mod_topseller.class.php:2 
-#: ../mods/wpsg_mod_relatedproducts.class.php:2 
-#: ../mods/wpsg_mod_productvars.class.php:2 
-#: ../mods/wpsg_mod_weight.class.php:2 
-#: ../mods/wpsg_mod_produktattribute.class.php:2 
-#: ../mods/wpsg_mod_downloadprodukte.class.php:1
-msgid "Produkte"
-msgstr "CÃ¡c sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/order/index.phtml:352 ../views/order/index.phtml:497 
-#: ../views/mods/mod_discount/settings_edit.phtml:93 
-#: ../mods/wpsg_mod_versandarten.class.php:2
-msgid "Bestellwert"
-msgstr "GiÃ¡ trá» ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/order/index.phtml:380
-msgid "Bestellung wurde in der Sprache #1# durchgefÃŒhrt."
-msgstr "ÄÆ¡n hÃ ng ÄÆ°á»£c thá»±c hiá»n sá»­ dá»¥ng ngÃŽn ngá»¯ #1#."
-
-# @ wpsg
-#: ../views/order/index.phtml:384
-msgid "Kommentar (Kunde): #1#"
-msgstr "BÃ¬nh luáº­n (khÃ¡ch hÃ ng): #1#"
-
-# @ wpsg
-#: ../views/order/index.phtml:389
-msgid "Kommentar (Admin): "
-msgstr "BÃ¬nh luáº­n (Admin): #1#"
-
-# @ wpsg
-#: ../views/order/index.phtml:394
-msgid "Diese Bestellung ansehen"
-msgstr "Hiá»n thá» ÄÆ¡n hÃ ng nÃ y"
-
-# @ wpsg
-#: ../views/order/index.phtml:396
-msgid "Sind Sie sich sicher, dass Sie diese Bestellung stornieren mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n huá»· ÄÆ¡n hÃ ng nÃ y"
-
-# @ wpsg
-#: ../views/order/index.phtml:396
-msgid "Diese Bestellung stornieren"
-msgstr "Huá»· ÄÆ¡n hÃ ng nÃ y"
-
-# @ wpsg
-#: ../views/order/index.phtml:396
-msgid "Stornieren"
-msgstr "Huá»· hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../views/order/index.phtml:398
-msgid "Sind Sie sich sicher, dass Sie diese Bestellung lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ ÄÆ¡n hÃ ng nÃ y?"
-
-# @ wpsg
-#: ../views/order/index.phtml:398
-msgid "Diese Bestellung lÃ¶schen"
-msgstr "XoÃ¡ ÄÆ¡n hÃ ng nÃ y"
-
-# @ wpsg
-#: ../views/order/index.phtml:432
-msgid "#1# x <a href=\"#2#\">#3#</a> fÃŒr je #4#"
-msgstr "#1# x <a href=\"#2#\">#3#</a> for each #4#"
-
-# @ wpsg
-#: ../views/order/index.phtml:522
-msgid "Aktion wÃ€hlen"
-msgstr "Chá»n hoáº¡t Äá»ng"
-
-# @ wpsg
-#: ../views/order/index.phtml:524
-msgid "Status auf \"#1#\" setzen."
-msgstr "Äáº·t tráº¡ng thÃ¡i vá» #1#."
-
-# @ wpsg
-#: ../views/order/index.phtml:526
-msgid "Bestellungen lÃ¶schen"
-msgstr "XoÃ¡ ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/order/index.phtml:528
-msgid "Rechnung schreiben"
-msgstr "Xuáº¥t hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../views/order/index.phtml:529
-msgid "Rechnung ansehen"
-msgstr "Xem hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../views/order/index.phtml:532
-msgid "AusfÃŒhren"
-msgstr "Thá»±c hiá»n"
-
-# @ wpsg
-#: ../views/order/index.phtml:561
-msgid "Keine Bestellungen in der Datenbank."
-msgstr "KhÃŽng tÃ¬m tháº¥y ÄÆ¡n hÃ ng nÃ o trong cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/order/view.phtml:157
-msgid "Bestellung #1#"
-msgstr "ÄÆ¡n hÃ ng sá» #1#"
-
-# @ wpsg
-#: ../views/order/view.phtml:182
-msgid "Zum Kunden"
-msgstr "Chuyá»n Äáº¿n khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/order/view.phtml:256
-msgid "Versand- und Zahlungsart"
-msgstr "PhÆ°Æ¡ng thá»©c váº­n chuyá»n vÃ  thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/order/view.phtml:300
-msgid "Bestellkommentar (Kunde)"
-msgstr "BÃ¬nh luáº­n ÄÆ¡n hÃ ng (khÃ¡ch hÃ ng)"
-
-# @ wpsg
-#: ../views/order/view.phtml:311
-msgid "Bestellkommentar (Admin)"
-msgstr "BÃ¬nh luáº­n ÄÆ¡n hÃ ng (Admin)"
-
-# @ wpsg
-#: ../views/order/view.phtml:316 
-#: ../views/mods/mod_auftragsbestaetigung/order_view.phtml:40
-msgid "Senden"
-msgstr "Gá»­i"
-
-# @ wpsg
-#: ../views/order/view.phtml:350
-msgid "Sprache"
-msgstr "NgÃŽn ngá»¯"
-
-# @ wpsg
-#: ../views/order/view.phtml:364
-msgid "Bestelleingang"
-msgstr "ÄÃ£ nháº­n ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/order/view.phtml:377
-msgid "StatusÃ€nderung"
-msgstr "Thay Äá»i tráº¡ng thÃ¡i"
-
-# @ wpsg
-#: ../views/order/view.phtml:385
-msgid "Status Ã€ndern"
-msgstr "Thay Äá»i tráº¡ng thÃ¡i"
-
-# @ wpsg
-#: ../views/order/view.phtml:388
-msgid "Kunde informieren"
-msgstr "ThÃŽng bÃ¡o cho khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/order/view.phtml:430 ../views/warenkorb/overview.phtml:112 
-#: ../views/warenkorb/basket.phtml:32
-msgid "Einzelpreis"
-msgstr "GiÃ¡ ÄÆ¡n vá»"
-
-# @ wpsg
-#: ../views/order/view.phtml:440 
-#: ../views/mods/mod_productindex/layouts/list.phtml:171
-msgid "Zum Produkt"
-msgstr "Chuyá»n tá»i sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/order/view.phtml:467 ../views/warenkorb/index.phtml:51 
-#: ../views/warenkorb/overview.phtml:161 ../views/warenkorb/basket.phtml:103
-msgid "Gutschein"
-msgstr "Phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../views/order/view.phtml:489 ../views/warenkorb/overview.phtml:180 
-#: ../views/warenkorb/basket.phtml:127
-msgid "Summe (zzgl. #1#)"
-msgstr "Tá»ng (cá»ng #1#)"
-
-# @ wpsg
-#: ../views/order/view.phtml:492 ../views/warenkorb/overview.phtml:183 
-#: ../views/warenkorb/basket.phtml:130
-msgid "Summe (zzgl. #1#, zzgl. MwSt.)"
-msgstr "Tá»ng (cá»ng #1# vÃ  thuáº¿ GTGT)"
-
-# @ wpsg
-#: ../views/order/view.phtml:494 ../views/warenkorb/overview.phtml:185 
-#: ../views/warenkorb/basket.phtml:132
-msgid "Summe (zzgl. #1#, inkl. MwSt.)"
-msgstr "Tá»ng (cá»ng #1# vÃ  thuáº¿ GTGT)"
-
-# @ wpsg
-#: ../views/order/view.phtml:568
-msgid "Bestellprotokoll"
-msgstr "PhÆ°Æ¡ng thá»©c Äáº·t hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/produkt_edit_content.phtml:12 
-#: ../views/mods/mod_produktattribute/settings_edit.phtml:104 
-#: ../mods/wpsg_mod_export.class.php:22 
-#: ../mods/wpsg_mod_produktattribute.class.php:2
-msgid "Produktattribute"
-msgstr "Thuá»c tÃ­nh sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:9
-msgid "Keine Produktattribute hinterlegt."
-msgstr "ChÆ°a cÃ³ thuá»c tÃ­nh sáº£n pháº©m nÃ o ÄÆ°á»£c lÆ°u."
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:13 
-#: ../views/mods/mod_gutschein/index.phtml:166 
-#: ../views/mods/mod_gutschein/index.phtml:242 
-#: ../views/mods/mod_productvars/pv_list.phtml:11 
-#: ../views/mods/mod_userpayment/list.phtml:19 
-#: ../views/mods/mod_ordervars/ov_list.phtml:11 
-#: ../views/mods/mod_versandarten/list.phtml:19 
-#: ../views/mods/mod_ordercondition/list.phtml:76
-msgid "ID"
-msgstr "ID"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:16 
-#: ../views/mods/mod_produktattribute/list.phtml:28
-msgid "Werte direkt in jedem Template anzeigen wenn gesetzt."
-msgstr "Chá» giÃ¡ trá» trá»±c tiáº¿p trong má»i máº«u náº¿u ÄÃ£ ÄÆ°á»£c Äáº·t."
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:33
-msgid "Textfeld (RTE)"
-msgstr "VÃ¹ng vÄn báº£n (TRE)"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:40 
-#: ../views/mods/mod_productvars/pv_list.phtml:45
-msgid "Produktvariable lÃ¶schen"
-msgstr "XoÃ¡ biáº¿n sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:46
-msgid "Sind Sie sich sicher, dass Sie dieses Produktattribute lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ thuá»c tÃ­nh nÃ y?"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:100
-msgid "Auswahl (| als Trenner)"
-msgstr "Lá»±a chá»n (dáº¥u phÃ¢n cÃ¡ch |)"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/list.phtml:124
-msgid "Bitte anklicken um Auswahl kommagetrennt zu definieren"
-msgstr "Vui lÃ²ng nháº¥n Äá» xÃ¡c Äá»nh lá»±a chá»n phÃ¢n cÃ¡ch báº±ng dáº¥u pháº©y"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/genPACode.phtml:9
-msgid "Code fÃŒr den Namen des Produktattributes mit der ID #1#"
-msgstr "MÃ£ tÃªn cho thuá»c tÃ­nh sáº£n pháº©m #1#"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/genPACode.phtml:13
-msgid "Code fÃŒr den Wert des Produktattributes mit der ID #1#"
-msgstr "MÃ£ giÃ¡ trá» cho thuá»c tÃ­nh sáº£n pháº©m #1#"
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/genPACode.phtml:17
-msgid ""
-"Diese Code Schipsel kÃ¶nnen in die Produkttemplates oder in die Mailtemplates "
-"eingebaut werden."
-msgstr "CÃ¡c Äoáº¡n mÃ£ nÃ y cÃ³ thá» ÄÆ°á»£c dÃ¹ng trong máº«u sáº£n pháº©m vÃ  thÆ°."
-
-# @ wpsg
-#: ../views/mods/mod_produktattribute/settings_edit.phtml:105
-msgid "Neues Produktattribut anlegen"
-msgstr "Táº¡o thuá»c tÃ­nh sáº£n pháº©m má»i"
-
-# @ wpsg
-#: ../views/mods/mod_weight/basket_row.phtml:9 
-#: ../views/mods/mod_weight/overview_row.phtml:9 
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:184 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:76 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:232 
-#: ../mods/wpsg_mod_scaleprice.class.php:13 
-#: ../mods/wpsg_mod_export.class.php:22 
-#: ../mods/wpsg_mod_versandarten.class.php:2
-msgid "Gewicht"
-msgstr "Khá»i lÆ°á»£ng"
-
-# @ wpsg
-#: ../views/mods/mod_weight/produkt_edit_allgemein.phtml:8 
-#: ../mods/wpsg_mod_weight.class.php:2
-msgid "Produktgewicht"
-msgstr "Khá»i lÆ°á»£ng sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:8
-msgid "Gewichtseinheit"
-msgstr "ÄÆ¡n vá» khá»i lÆ°á»£ng"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:9 
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:42
-msgid "Im Produkt anzeigen"
-msgstr "Hiá»n thá» trong sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:10 
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:43
-msgid "Im Warenkorb anzeigen"
-msgstr "Hiá»n thá» trong giá» hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:12
-msgid "Im Warenkorb im Produkt anzeigen"
-msgstr "Hiá»n thá» trong giá» hÃ ng trong Má»¥c sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:13
-msgid "In Zusammenfassung anzeigen"
-msgstr "Hiá»n thá» trong tÃ³m táº¯t ÄÆ¡n Äáº·t hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:14
-msgid "In Zusammenfassung im Produkt anzeigen"
-msgstr "Hiá»n thá» trong tÃ³m táº¯t ÄÆ¡n hÃ ng trong Má»¥c sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_weight/settings_edit.phtml:16
-msgid "Auf ProduktÃŒbersichtsseiten anzeigen"
-msgstr "Hiá»n thá» trÃªn trang Tá»ng quÃ¡t sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_topseller/produkt_edit_allgemein.phtml:16 
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:116 
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:94
-msgid "Anzeigen"
-msgstr "Hiá»n thá»"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:10
-msgid "Neuer Gutschein"
-msgstr "Phiáº¿u mua hÃ ng má»i"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:17 
-#: ../views/mods/mod_gutschein/index.phtml:190 
-#: ../views/mods/mod_gutschein/index.phtml:266 
-#: ../views/mods/mod_export/profil.phtml:165
-msgid "Wert"
-msgstr "GiÃ¡ trá»"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:18 
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:190
-msgid "Berechnung"
-msgstr "TÃ­nh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:19
-msgid "Absoluter Betrag"
-msgstr "GiÃ¡ trá» tuyá»t Äá»i"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:20
-msgid "Prozentual"
-msgstr "Pháº§n trÄm"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:22
-msgid "GÃŒltig ab"
-msgstr "CÃ³ giÃ¡ trá» tá»«"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:23 
-#: ../views/mods/mod_micropayment/order_done.phtml:38
-msgid "GÃŒltig bis"
-msgstr "CÃ³ giÃ¡ trá» tá»i"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:26
-msgid "Manuell"
-msgstr "Tá»± Äáº·t"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:29 
-#: ../views/mods/mod_gutschein/index.phtml:172 
-#: ../views/mods/mod_gutschein/index.phtml:248
-msgid "Code"
-msgstr "MÃ£"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:32 
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:183 
-#: ../mods/wpsg_mod_scaleprice.class.php:13 
-#: ../mods/wpsg_mod_versandarten.class.php:2
-msgid "Menge"
-msgstr "Sá» lÆ°á»£ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:33
-msgid "Mehrfach verwendbar"
-msgstr "TÃ¡i sá»­ dá»¥ng nhiá»u láº§n"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:34
-msgid "Kommentar"
-msgstr "BÃ¬nh luáº­n"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/add.phtml:41
-msgid "Gutschein anlegen"
-msgstr "Táº¡o phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:11 
-#: ../views/mods/mod_gutschein/admin_setcapabilities.phtml:11
-msgid "Gutscheinverwaltung"
-msgstr "Quáº£n lÃœ phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:13
-msgid "CSV Export"
-msgstr "Xuáº¥t tá»p CSV"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:14
-msgid "CSV Import"
-msgstr "Nháº­p CSV"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:126 
-#: ../views/mods/mod_gutschein/index.phtml:128
-msgid "Gutscheine suchen"
-msgstr "TÃ¬m kiáº¿m phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:163 
-#: ../views/mods/mod_gutschein/index.phtml:239
-msgid "Alle markieren"
-msgstr "Chá»n táº¥t cáº£"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:178 
-#: ../views/mods/mod_gutschein/index.phtml:254
-msgid "Start"
-msgstr "Báº¯t Äáº§u"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:184 
-#: ../views/mods/mod_gutschein/index.phtml:260
-msgid "End"
-msgstr "Káº¿t thÃºc"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:229
-msgid "#1# mal benutzt"
-msgstr "ÄÃ£ sá»­ dá»¥ng #1# láº§n"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:302
-msgid "Markierte lÃ¶schen"
-msgstr "XoÃ¡ má»¥c ÄÃ£ chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/index.phtml:305
-msgid "Keine Gutscheine in der Datenbank."
-msgstr "KhÃŽng tÃ¬m tháº¥y phiáº¿u mua hÃ ng nÃ o trong cÆ¡ sá» dá»¯ liá»u."
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/import.phtml:13
-msgid "Gutscheinverwaltung - CSV Import"
-msgstr "Quáº£n lÃœ phiáº¿u mua hÃ ng - Nháº­p CSV"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/import.phtml:17
-msgid "Bestehende Codes"
-msgstr "MÃ£ Äang sá»­ dá»¥ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/import.phtml:17
-msgid "Ãberschreiben"
-msgstr "Viáº¿t ÄÃš"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/import.phtml:17
-msgid "Ignorieren"
-msgstr "Bá» qua"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/import.phtml:22
-msgid "CSV Quell Datei"
-msgstr "Tá»p nguá»n CSV"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/import.phtml:32
-msgid "ZurÃŒck zur Gutscheinverwaltung"
-msgstr "Quay láº¡i quáº£n lÃœ phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/settings_edit.phtml:8
-msgid "LÃ€nge der Gutscheincodes"
-msgstr "Äá» dÃ i mÃ£ phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_gutschein/settings_edit.phtml:9
-msgid "Gutscheine pro Seite (Backend)"
-msgstr "Phiáº¿u mua hÃ ng má»i trang (Backend)"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/basket_row.phtml:14 
-#: ../views/mods/mod_productvars/renderTemplate.phtml:18 
-#: ../views/mods/mod_ordervars/checkout_inner_prebutton.phtml:30 
-#: ../views/warenkorb/basket.phtml:147 ../views/warenkorb/basket.phtml:196
-msgid "Bitte wÃ€hlen"
-msgstr "Vui lÃ²ng chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/pv_list.phtml:14 
-#: ../views/mods/mod_ordervars/ov_list.phtml:14
-msgid "Pflicht"
-msgstr "Báº¯t buá»c"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/pv_list.phtml:136
-msgid "Bisher noch keine Produktvariablen angelegt."
-msgstr "ChÆ°a cÃ³ biáº¿n sáº£n pháº©m nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_productvars/order_view_row.phtml:39 
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:27 
-#: ../mods/wpsg_mod_ordervars.class.php:11 
-#: ../mods/wpsg_mod_ordervars.class.php:20 
-#: ../mods/wpsg_mod_productvars.class.php:17
-msgid "Keine Angabe"
-msgstr "KhÃŽng cÃ³ thÃŽng tin"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/produkt_edit_sidebar.phtml:11 
-#: ../views/mods/mod_productvars/settings_edit.phtml:60 
-#: ../mods/wpsg_mod_productvars.class.php:2 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Produktvariablen"
-msgstr "Biáº¿n sá» sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/produkt_edit_sidebar.phtml:19
-msgid "Bisher keine Produktvariablen angelegt."
-msgstr "ChÆ°a cÃ³ biáº¿n sáº£n pháº©m nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_productvars/produkt_edit_sidebar.phtml:22
-msgid "Zur Produktvariablenverwaltung"
-msgstr "Tá»i trang quáº£n lÃœ biáº¿n sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/overview_row.phtml:15
-msgid "Nicht angegeben"
-msgstr "ChÆ°a cung cáº¥p"
-
-# @ wpsg
-#: ../views/mods/mod_productvars/settings_edit.phtml:61
-msgid "Neue Produktvariable anlegen"
-msgstr "Táº¡o biáº¿n sáº£n pháº©m má»i"
-
-# @ wpsg
-#: ../views/mods/mod_export/produkt_index_aftersearch.phtml:27
-msgid "Bitte mindestens ein Profil zum exportieren wÃ€hlen."
-msgstr "Vui lÃ²ng chá»n Ã­t nháº¥t má»t há» sÆ¡ Äá» xuáº¥t."
-
-# @ wpsg
-#: ../views/mods/mod_export/produkt_index_aftersearch.phtml:53 
-#: ../views/mods/mod_export/produkt_index_head.phtml:12 
-#: ../mods/wpsg_mod_export.class.php:7
-msgid "Bestellexport"
-msgstr "Xuáº¥t ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_export/produkt_index_aftersearch.phtml:62
-msgid "Export starten"
-msgstr "Báº¯t Äáº§u xuáº¥t dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:13
-msgid "Profilname"
-msgstr "TÃªn há» sÆ¡"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:16 
-#: ../views/mods/mod_export/profil.phtml:192
-msgid "Profil lÃ¶schen"
-msgstr "XoÃ¡ há» sÆ¡"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:35
-msgid "Dateiname"
-msgstr "TÃªn tá»p tin"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:56
-msgid "Trennzeichen"
-msgstr "Dáº¥u cÃ¡ch"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:77
-msgid "Eine Zeile pro Bestellung"
-msgstr "Má»t dÃ²ng cho má»i ÄÆ¡n Äáº·t hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:99
-msgid "Spaltennamen in erster Spalte"
-msgstr "TÃªn cá»t trong cá»t Äáº§u tiÃªn"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:121
-msgid "Dateiformat (Import wie Export)"
-msgstr "Äá»nh dáº¡ng tá»p (nháº­p vÃ  xuáº¥t)"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:125
-msgid "UTF-8"
-msgstr "UTF-8"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:126
-msgid "ISO-8859-1"
-msgstr "ISO-8859-1"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:150
-msgid "Muster Vorlage (csv Datei)"
-msgstr "Tá»p máº«u (dáº¡ng csv)"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:164
-msgid "Spaltenname"
-msgstr "TÃªn cá»t"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:166
-msgid "Format"
-msgstr "Äá»nh dáº¡ng"
-
-# @ wpsg
-#: ../views/mods/mod_export/profil.phtml:197
-msgid "Format:"
-msgstr "Äá»nh dáº¡ng:"
-
-# @ wpsg
-#: ../views/mods/mod_export/profillist.phtml:16
-msgid "Bisher noch keine Profile angelegt."
-msgstr "ChÆ°a cÃ³ há» sÆ¡ nÃ o ÄÆ°á»£c lÆ°u."
-
-# @ wpsg
-#: ../views/mods/mod_export/settings_edit.phtml:59
-msgid "Sind sie sich sicher?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n?"
-
-# @ wpsg
-#: ../views/mods/mod_export/settings_edit.phtml:99 
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Exportprofile"
-msgstr "Há» sÆ¡ xuáº¥t"
-
-# @ wpsg
-#: ../views/mods/mod_export/settings_edit.phtml:100
-msgid "Neuens Exportprofil anlegen"
-msgstr "Táº¡o há» sÆ¡ xuáº¥t dá»¯ liá»u má»i"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:9
-msgid "Bisher keine Zahlvarianten angelegt."
-msgstr "ChÆ°a cÃ³ biáº¿n thanh toÃ¡n nÃ o ÄÆ°á»£c táº¡o"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:22
-msgid "Zahlvariante lÃ¶schen"
-msgstr "XoÃ¡ phÆ°Æ¡ng phÃ¡p thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:56
-msgid "Definieren ..."
-msgstr "Äá»nh nghÄ©aâŠ"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:104 
-#: ../views/mods/mod_su/settings_edit.phtml:41 
-#: ../views/mods/mod_autodebit/settings_edit.phtml:9 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:8 
-#: ../views/mods/mod_paypal/settings_edit.phtml:10 
-#: ../views/mods/mod_invoice_type/settings_edit.phtml:9 
-#: ../views/mods/mod_debitpayment/settings_edit.phtml:9 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:18 
-#: ../views/mods/mod_versandarten/list.phtml:136 
-#: ../views/mods/mod_freeshipping/settings_edit.phtml:9 
-#: ../mods/wpsg_mod_gutschein.class.php:35 
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "Aktiv"
-msgstr "Hoáº¡t Äá»ng"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:113 
-#: ../views/mods/mod_su/settings_edit.phtml:42 
-#: ../views/mods/mod_autodebit/settings_edit.phtml:10 
-#: ../views/mods/mod_willcollect/settings_edit.phtml:10 
-#: ../views/mods/mod_deliverytime/settings_edit.phtml:23 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:32 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:51 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:68 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:88 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:105 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:127 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:173 
-#: ../views/mods/mod_paypal/settings_edit.phtml:11 
-#: ../views/mods/mod_invoice_type/settings_edit.phtml:10 
-#: ../views/mods/mod_debitpayment/settings_edit.phtml:10 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:19 
-#: ../views/mods/mod_versandarten/list.phtml:145
-msgid "Hinweistext"
-msgstr "Gá»£i Ãœ"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:120 
-#: ../views/mods/mod_su/settings_edit.phtml:46 
-#: ../views/mods/mod_autodebit/settings_edit.phtml:13 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:34 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:53 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:70 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:90 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:107 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:129 
-#: ../views/mods/mod_micropayment/settings_edit.phtml:175 
-#: ../views/mods/mod_paypal/settings_edit.phtml:86 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:23
-msgid "GebÃŒhr/Rabatt"
-msgstr "PhÃ­\\Chiáº¿t kháº¥u"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/list.phtml:130 
-#: ../views/mods/mod_versandarten/list.phtml:212
-msgid "Steuersatz"
-msgstr "Tá»· suáº¥t thuáº¿"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/settings_edit.phtml:48
-msgid "Sind Sie sich sicher, dass sie die Zahlvariante lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ phÆ°Æ¡ng phÃ¡p thanh toÃ¡n nÃ y?"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/settings_edit.phtml:72
-msgid "Neue Zahlvariante anlegen"
-msgstr "Táº¡o phÆ°Æ¡ng phÃ¡p thanh toÃ¡n má»i"
-
-# @ wpsg
-#: ../views/mods/mod_userpayment/settings_edit.phtml:82
-msgid ""
-"Um eine Zahlvariante zu bearbeiten klicken Sie einfach auf den Namen oder "
-"den Rabattwert."
-msgstr ""
-"Nháº¥p lÃªn tÃªn hoáº·c giÃ¡ trá» chiáº¿t kháº¥u Äá» chá»nh sá»­a phÆ°Æ¡ng phÃ¡p thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_auftragsbestaetigung/order_view.phtml:33 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:8 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:1 
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:2
-msgid "AuftragsbestÃ€tigung"
-msgstr "XÃ¡c nháº­n ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_auftragsbestaetigung/order_view.phtml:42
-msgid ""
-"Die AuftragsbestÃ€tigung bestÃ€tigt dem Kunden die erfolgreiche Erfassung des "
-"Auftrages. Abweichungen vom Auftrag kÃ¶nnen mittels des Textfeldes "
-"mitgesendet werden."
-msgstr ""
-"XÃ¡c nháº­n ÄÆ¡n hÃ ng xÃ¡c nháº­n vá»i khÃ¡ch hÃ ng viá»c nháº­n ÄÆ¡n hÃ ng. Viá»c thay Äá»i "
-"ÄÆ¡n hÃ ng cÃ³ thá» ÄÆ°á»£c gá»­i kÃšm qua vÃ¹ng vÄn báº£n."
-
-# @ wpsg
-#: ../views/mods/mod_auftragsbestaetigung/order_view.phtml:43
-msgid "Der Status Ã€ndert sich automatisch auf \"BestÃ€tigt\"."
-msgstr "Tá»± Äá»ng chuyá»n tráº¡ng thÃ¡i sang \"ÄÃ£ xÃ¡c nháº­n\"."
-
-# @ wpsg
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:10 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:3
-msgid ""
-"Vielen Dank fÃŒr Ihre Bestellung. Sie erhalten hiermit die "
-"AuftragsbestÃ€tigung mit allen wichtigen Informationen zu Ihrer Bestellung."
-msgstr ""
-"Cáº£m Æ¡n báº¡n ÄÃ£ Äáº·t hÃ ng. ÄÃ¢y lÃ  xÃ¡c nháº­n ÄÆ¡n hÃ ng vá»i cÃ¡c thÃŽng tin quan "
-"trá»ng cho ÄÆ¡n hÃ ng cá»§a báº¡n."
-
-# @ wpsg
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml:13 
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:64
-msgid "Kommentar AuftragsbestÃ€tigung"
-msgstr "BÃ¬nh luáº­n xÃ¡c nháº­n ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml:122
-msgid "darin enthaltenes MwSt. (#1#)"
-msgstr "ÄÃ£ gá»m thuáº¿ GTGT (#1#)"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_list.phtml:13
-msgid "Dieses Bild lÃ¶schen."
-msgstr "XoÃ¡ hÃ¬nh nÃ y."
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_list.phtml:22
-msgid "Bisher keine Produktbilder hochgeladen."
-msgstr "ChÆ°a cÃ³ hÃ¬nh sáº£n pháº©m nÃ o ÄÆ°á»£c táº£i lÃªn."
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:12 
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Produktbilder"
-msgstr "HÃ¬nh sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:23
-msgid "Um ein Bild zu lÃ¶schen klicken Sie einfach auf das Bild."
-msgstr "Nháº¥p lÃªn Äá» xoÃ¡ hÃ¬nh"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:31
-msgid ""
-"Bitte klicken Sie auf Upload um ein Bild hochzuladen. Um ein Bild zu lÃ¶schen "
-"klicken Sie einfach auf das Bild."
-msgstr "Nháº¥n vÃ o \"Táº£i lÃªn\" Äá» táº£i hÃ¬nh lÃªn. Äá» xoÃ¡ hÃ¬nh, nháº¥n lÃªn hÃ¬nh."
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:79
-msgid "Sind Sie sicher, das Sie dieses Bild lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ hÃ¬nh?"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:105
-msgid ""
-"Das Hochladen von Produktbildern ist erst nach erstmaligem speichern mÃ¶glich."
-msgstr "Báº¡n chá» cÃ³ thá» táº£i lÃªn hÃ¬nh sáº£n pháº©m náº¿u ÄÃ£ lÆ°u sáº£n pháº©m."
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/produkt_edit_content.phtml:112 
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:90
-msgid "FTP Pfad"
-msgstr "ÄÆ°á»ng dáº«n FTP"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/settings_edit.phtml:8
-msgid "Bildbreite (Vorschau)"
-msgstr "Chiá»u rá»ng (xem trÆ°á»c)"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/settings_edit.phtml:9
-msgid "BildhÃ¶he (Vorschau)"
-msgstr "Chiá»u cao (xem trÆ°á»c)"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/settings_edit.phtml:10
-msgid "Bildmodus (Vorschau)"
-msgstr "Cháº¿ Äá» áº£nh (xem trÆ°á»c)"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/settings_edit.phtml:11
-msgid "BildqualitÃ€t (PNG/JPG)"
-msgstr "Cháº¥t lÆ°á»£ng (png/jpeg)"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/settings_edit.phtml:11
-msgid "0 = Schlechte QualitÃ€t, 100 = Gute QualitÃ€t"
-msgstr "0 = cháº¥t lÆ°á»£ng kÃ©m, 100 = cháº¥t lÆ°á»£ng tá»t"
-
-# @ wpsg
-#: ../views/mods/mod_produktbilder/settings_edit.phtml:13
-msgid "Bildercache lÃ¶schen"
-msgstr "XoÃ¡ bá» nhá» Äá»m áº£nh"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/produkt_edit_list.phtml:15
-msgid "Datei lÃ¶schen"
-msgstr "XoÃ¡ tá»p"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/produkt_edit_list.phtml:21
-msgid "Bisher keine Dateien hochgeladen."
-msgstr "ChÆ°a tá»p nÃ o ÄÆ°á»£c táº£i lÃªn."
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:1 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:1 
-#: ../views/mods/mod_kundenverwaltung/checkout_logout.phtml:10 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:18
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:18 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:18 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:17
-msgid "Hallo"
-msgstr "Xin chÃ o,"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:3 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:3
-msgid "Ihre Bezahlung zu der Bestellung"
-msgstr "Thanh toÃ¡n cá»§a báº¡n cho ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:3 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:3
-msgid "ist bei uns eingegangen."
-msgstr "ÄÃ£ ÄÆ°á»£c chuyá»n."
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:14 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:9
-msgid "Sie haben fÃŒr"
-msgstr "Báº¡n cÃ³"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:14 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:9
-msgid "Tage die MÃ¶glichkeit die Dateien herunterzuladen."
-msgstr "ngÃ y Äá» táº£i tá»p tin vá»."
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:16 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:11
-msgid "Sie kÃ¶nnen die Datei %1% mal herunterladen"
-msgstr "Báº¡n cÃ³ thá» táº£i má»i tá»p %1% láº§n."
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml:19 
-#: ../views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml:15 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:13 
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:24 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:17 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:18 
-#: ../views/mods/mod_kundenverwaltung/mail_activate.phtml:12 
-#: ../views/mods/mod_kundenverwaltung/mail_activate_html.phtml:12 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:59 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:13
-msgid "Viele GrÃŒÃe"
-msgstr "TrÃ¢n trá»ng,"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/order_view_row.phtml:9 
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:9
-msgid "Downloads"
-msgstr "Táº£i vá»"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:48
-msgid "Sind Sie sicher, das Sie diese Datei lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ tá»p nÃ y?"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:74
-msgid "Downloadprodukt"
-msgstr "Sáº£n pháº©m cÃ³ thá» táº£i vá»"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml:84
-msgid "Upload"
-msgstr "Táº£i lÃªn"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:9
-msgid "ZÃ€hltyp"
-msgstr "PhÆ°Æ¡ng phÃ¡p Äáº¿m"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:9 
-#: ../views/mods/mod_deliverytime/produkt_edit_allgemein.phtml:12
-msgid "Tage"
-msgstr "NgÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:10
-msgid "Tage/Downloads gÃŒltig"
-msgstr "NgÃ y\\Táº£i vá» cÃ³ hiá»u lá»±c"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:11
-msgid "Meldung wenn kein Download mehr mÃ¶glich ist"
-msgstr "Tin nháº¯n khi khÃŽng cÃ³ sáº£n pháº©m táº£i vá» nÃ o cÃ²n láº¡i"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:12
-msgid "Gezippte Auslieferung"
-msgstr "Gá»­i tá»p nÃ©n"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:13
-msgid "Verzeichnis fÃŒr temporÃ€res Archiv (Standard /tmp)"
-msgstr "ÄÆ°á»ng dáº«n Äáº¿n lÆ°u trá»¯ táº¡m thá»i (máº·c Äá»nh /tmp)"
-
-# @ wpsg
-#: ../views/mods/mod_downloadprodukte/settings_edit.phtml:14
-msgid "Mehr als ein Produkt im Warenkorb zulassen"
-msgstr "Cho phÃ©p trÃªn má»t sáº£n pháº©m trong giá» hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:9 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:9 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:10 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:9
-msgid "Sie haben eine neues Passwort angefragt."
-msgstr "Báº¡n ÄÃ£ Äá» nghá» máº­t kháº©u má»i"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml:11 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdsend.phtml:11
-msgid "Ihr neues Passwort lautet ab sofort: #1#"
-msgstr "Máº­t kháº©u má»i cá»§a báº¡n lÃ  #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:9 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:10
-msgid "Sie haben sich mit folgenden Daten bei uns registriert."
-msgstr "Báº¡n ÄÃ£ ÄÄng kÃœ cÃ¡c dá»¯ liá»u dÆ°á»i ÄÃ¢y."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:11
-msgid "Firma: #1#"
-msgstr "CÃŽng ty: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:12
-msgid "Vorname: #1#"
-msgstr "TÃªn: #1# "
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:13
-msgid "Name: #1#"
-msgstr "Há»: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:14
-msgid "E-Mail: #1#"
-msgstr "ThÆ° Äiá»n tá»­: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:15
-msgid "Telefon: #1#"
-msgstr "Sá» Äiá»n thoáº¡i: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:16
-msgid "Fax: #1#"
-msgstr "Sá» fax: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:17
-msgid "StraÃe: #1#"
-msgstr "ÄÆ°á»ng: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:18
-msgid "PLZ: #1#"
-msgstr "MÃ£ bÆ°u Äiá»n: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:19
-msgid "Ort: #1#"
-msgstr "ThÃ nh phá»: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:20
-msgid "Land: #1#"
-msgstr "Quá»c gia: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_register.phtml:21
-msgid "UStIdNr.: #1#"
-msgstr "MÃ£ thuáº¿ GTGT: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:11 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:12
-msgid ""
-"Es wird ihnen ein neues Passwort generiert, wenn sie auf folgenden Link "
-"klicken:"
-msgstr "Máº­t kháº©u má»i sáºœ ÄÆ°á»£c táº¡o khi nháº¥p vÃ o ÄÆ°á»ng dáº«n nÃ y:"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml:15 
-#: ../views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml:16
-msgid ""
-"Sollten Sie kein neues Passwort angefragt haben kÃ¶nnen Sie diese Mail "
-"ignorieren."
-msgstr "Náº¿u báº¡n khÃŽng yÃªu cáº§u máº­t kháº©u má»i, báº¡n cÃ³ thá» bá» qua thÆ° nÃ y."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/login.phtml:15
-msgid "Bereits Kunde? Hier einloggen ..."
-msgstr "ÄÃ£ lÃ  khÃ¡ch hÃ ng? ÄÄng nháº­p táº¡i ÄÃ¢yâŠ"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/login.phtml:25 
-#: ../views/mods/mod_kundenverwaltung/register.phtml:187 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:265 
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:189 
-#: ../views/mods/mod_kundenverwaltung/checkout_login.phtml:18 
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:32 
-#: ../views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml:10
-msgid "Passwort"
-msgstr "Máº­t kháº©u"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/login.phtml:33 
-#: ../views/mods/mod_kundenverwaltung/checkout_login.phtml:27 
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:13 
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:29
-msgid "Login"
-msgstr "ÄÄng nháº­p"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/register.phtml:194
-msgid "Passwort (Wiederholung)"
-msgstr "Máº­t kháº©u (xÃ¡c minh)"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/register.phtml:219 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:184 
-#: ../views/warenkorb/checkout.phtml:146
-msgid "Fax."
-msgstr "Sá» fax"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/register.phtml:226 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:191 
-#: ../views/warenkorb/checkout.phtml:153
-msgid "Tel."
-msgstr "Sá» Äiá»n thoáº¡i "
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/register.phtml:233 
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:198 
-#: ../views/warenkorb/checkout.phtml:160
-msgid "Strasse Nr."
-msgstr "Sá» ÄÆ°á»ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/register.phtml:312
-msgid "Registrieren"
-msgstr "ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:75 
-#: ../views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml:11 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:2 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Kundenverwaltung"
-msgstr "Quáº£n lÃœ khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:98 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:100
-msgid "Kunden suchen"
-msgstr "TÃ¬m kiáº¿m khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:181
-msgid "#1# Bestellungen"
-msgstr "#1# ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:182
-msgid "Umsatz: #1#"
-msgstr "Doanh thu: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:185 
-#: ../views/mods/mod_kundenverwaltung/index.phtml:197
-msgid "Bestellungen einsehen"
-msgstr "Xem láº¡i ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:192
-msgid "Diesen Kunden bearbeiten"
-msgstr "Chá»nh sá»­a khÃ¡ch hÃ ng nÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:194
-msgid "Sind Sie sicher, dass Sie diesen Kunden lÃ¶schen wollen?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ khÃ¡ch hÃ ng nÃ y?"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:194
-msgid "Diesen Kunden lÃ¶schen"
-msgstr "XoÃ¡ khÃ¡ch hÃ ng nÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/index.phtml:259
-msgid "Keine Kunden in der Datenbank."
-msgstr "KhÃŽng tÃ¬m tháº¥y khÃ¡ch hÃ ng nÃ o trong cÆ¡ sá» dá»¯ liá»u"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/import.phtml:11
-msgid "Kundenimport"
-msgstr "Nháº­p khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/import.phtml:12
-msgid "ZurÃŒck zur Kundenverwaltung"
-msgstr "Quay láº¡i Quáº£n lÃœ khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/import.phtml:20
-msgid ""
-"Laden Sie ein vorher exportiertes CSV File hoch, die Kundendaten werden dann "
-"aus dieser Datei importiert."
-msgstr ""
-"Táº£i lÃªn má»t tá»p tin CSV ÄÃ£ ÄÆ°á»£c xuáº¥t trÆ°á»c ÄÃ³ Äá» nháº­p vÃ o dá»¯ liá»u khÃ¡ch hÃ ng."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/profil.phtml:272 
-#: ../views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml:17
-msgid "Passwort wiederholen"
-msgstr "Nháº¯c láº¡i máº­t kháº©u"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/checkout_logout.phtml:12 
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:19
-msgid "Abmelden"
-msgstr "ThoÃ¡t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:186
-msgid "PasswortÃ€nderung"
-msgstr "Thay Äá»i máº­t kháº©u"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:191
-msgid "Wiederholung"
-msgstr "XÃ¡c nháº­n"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:209
-msgid "Information"
-msgstr "ThÃŽng tin"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:213 
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:18 
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Bestellungen"
-msgstr "Äáº·t hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:218
-msgid "Bestellungen anzeigen"
-msgstr "Hiá»n thá» cÃ¡c ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:225
-msgid "Letzte Bestellung"
-msgstr "ÄÆ¡n Äáº·t hÃ ng má»i nháº¥t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:256
-msgid "Benutzerdefinierte Felder"
-msgstr "VÃ¹ng do ngÆ°á»i dÃ¹ng tuá»³ chá»nh"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:263 
-#: ../mods/wpsg_mod_ordervars.class.php:20
-msgid "Keine Auswahl"
-msgstr "KhÃŽng cÃ³ lá»±a chá»n."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:284
-msgid "Name/Anschrift"
-msgstr "TÃªn\\Äá»a chá»"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:302 
-#: ../views/mods/mod_kundenverwaltung/mail_register_html.phtml:42 
-#: ../views/mods/mod_core/admin_register.phtml:36 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "PLZ"
-msgstr "MÃ£ bÆ°u Äiá»n"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:314
-msgid "Kundenkommentar"
-msgstr "BÃ¬nh luáº­n cá»§a khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:328
-msgid "Kunde speichern"
-msgstr "LÆ°u khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/edit.phtml:329
-msgid "Kunde speichern und zur Ãbersicht"
-msgstr "LÆ°u khÃ¡ch hÃ ng vÃ  quay trá» láº¡i Tá»ng quÃ¡t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/getpwd.phtml:11
-msgid ""
-"Geben Sie hier die E-Mail Adresse an, mit der Sie bereits bestellt haben. "
-"Sie erhalten dann eine E-Mail mit der Aufforderung ein neues Passwort zu "
-"generieren."
-msgstr ""
-"Nháº­p Äá»a chá» Email báº¡n ÄÃ£ dÃ¹ng Äá» Äáº·t hÃ ng. Báº¡n sáºœ nháº­n ÄÆ°á»£c thÆ° Äá» nghá» táº¡o "
-"máº­t kháº©u má»i."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/getpwd.phtml:27
-msgid "Passwort anfordern"
-msgstr "Äá» nghá» máº­t kháº©u"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/mail_activate.phtml:10 
-#: ../views/mods/mod_kundenverwaltung/mail_activate_html.phtml:10
-msgid "Der Status Ihres Accounts hat sich gÃ€ndert auf:"
-msgstr "Tráº¡ng thÃ¡i tÃ i khoáº£n cá»§a báº¡n ÄÃ£ ÄÆ°á»£c chuyá»n sang"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:20
-msgid "Bestellung vom #1# ÃŒber #2#"
-msgstr "ÄÆ¡n cá»§a #1# vá» #2#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:23
-msgid "Bestellstatus"
-msgstr "Tráº¡ng thÃ¡i ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:28
-msgid "Rechnung #1#"
-msgstr "HoÃ¡ ÄÆ¡n #1#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:36 
-#: ../views/warenkorb/overview.phtml:104 ../views/warenkorb/basket.phtml:24
-msgid "Bestellte Produkte"
-msgstr "CÃ¡c sáº£n pháº©m ÄÃ£ Äáº·t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:49 
-#: ../views/mods/mod_varianten/basket_row.phtml:10 
-#: ../views/mods/mod_varianten/mail_row_html.phtml:10 
-#: ../views/mods/mod_varianten/order_view_row.phtml:9 
-#: ../views/mods/mod_varianten/mail_row.phtml:17 
-#: ../views/mods/mod_varianten/overview_row.phtml:9
-msgid "Variante"
-msgstr "Biáº¿n"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:54
-msgid "Datei \"#1#\": "
-msgstr "Tá»p \"#1#\""
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:56
-msgid "Noch nicht geplant"
-msgstr "ChÆ°a Äáº·t lá»ch"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:58
-msgid "Geplant am #1#."
-msgstr "ÄÃ£ lÃªn lá»ch cho #1#."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:61
-msgid "<a href=\"#1#\" target=\"blank\">Download</a>"
-msgstr "<a href=\"#1#\" target=\"blank\">Download</a>"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/order.phtml:91
-msgid "Bisher keine Bestellungen durchgefÃŒhrt."
-msgstr "ChÆ°a táº¡o ÄÆ¡n hÃ ng nÃ o."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:15
-msgid "Hallo #1# #2#"
-msgstr "ChÃ o #1# #2#"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:17
-msgid "Profil bearbeiten"
-msgstr "Chá»nh sá»­a há» sÆ¡"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:36
-msgid "Anmelden"
-msgstr "ÄÄng nháº­p"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/widget.phtml:41
-msgid "Passwort vergessen?"
-msgstr "QuÃªn máº­t kháº©u?"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:8
-msgid "Kunden pro Seite (Backend)"
-msgstr "KhÃ¡ch hÃ ng má»i trang (Backend)"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:9
-msgid "Login in Checkout integrieren"
-msgstr "TÃ­ch há»£p ÄÄng nháº­p khi thoÃ¡t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:10
-msgid "Registrierung im Checkout"
-msgstr "ÄÄng kÃœ khi thoÃ¡t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:11
-msgid "Registrierungzwang im Checkout"
-msgstr "Báº¯t buá»c ÄÄng kÃœ khi thoÃ¡t"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:25
-msgid "Status nach Registrierung"
-msgstr "Tráº¡ng thÃ¡i sau khi ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:31
-msgid "Sind Sie sich sicher, dass Sie alle Kunden auf Aktiv setzen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c muá»n Äáº·t táº¥t cáº£ cÃ¡c khÃ¡ch hÃ ng á» tráº¡ng thÃ¡i hoáº¡t Äá»ng?"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:31
-msgid "Alle Kunden auf Aktiv setzen."
-msgstr "Äáº·t táº¥t cáº£ khÃ¡ch hÃ ng á» tráº¡ng thÃ¡i hoáº¡t Äá»ng."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:32
-msgid "Sind Sie sich sicher, dass Sie alle Kunden auf Inaktiv setzen mÃ¶chten?"
-msgstr ""
-"Báº¡n cÃ³ cháº¯c muá»n Äáº·t táº¥t cáº£ cÃ¡c khÃ¡ch hÃ ng á» tráº¡ng thÃ¡i khÃŽng hoáº¡t Äá»ng?"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:32
-msgid "Alle Kunden auf Inaktiv setzen."
-msgstr "Äáº·t táº¥t cáº£ khÃ¡ch hÃ ng á» tráº¡ng thÃ¡i khÃŽng hoáº¡t Äá»ng."
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:38
-msgid "Profilseite"
-msgstr "Trang há» sÆ¡"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:39
-msgid "Registrierungsseite"
-msgstr "Trang ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:41
-msgid "BestellÃŒbersichtsseite"
-msgstr "Trang tá»ng quÃ¡t ÄÆ¡n Äáº·t hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:52
-msgid "AWeber Integration"
-msgstr "AWeber Integration"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:55
-msgid "AWeber meta_web_form_id"
-msgstr "AWeber meta_web_form_id"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:56
-msgid "AWeber listname"
-msgstr "AWeber listname"
-
-# @ wpsg
-#: ../views/mods/mod_kundenverwaltung/settings_edit.phtml:57
-msgid "AWeber meta_adtracking"
-msgstr "AWeber meta_adtracking"
-
-# @ wpsg
-#: ../views/mods/mod_discount/productgroups_addedit_sidebar.phtml:11 
-#: ../mods/wpsg_mod_discount.class.php:22
-msgid "Produktgruppenrabatt"
-msgstr "Chiáº¿t kháº¥u cho nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_discount/productgroups_addedit_sidebar.phtml:14 
-#: ../views/mods/mod_discount/produkt_edit_sidebar.phtml:14
-msgid "Aktion aktiv"
-msgstr "Cháº¡y chiáº¿n dá»ch"
-
-# @ wpsg
-#: ../views/mods/mod_discount/productgroups_addedit_sidebar.phtml:15 
-#: ../views/mods/mod_discount/produkt_edit_sidebar.phtml:15
-msgid "Start (TT.MM.JJJJ)"
-msgstr "Báº¯t Äáº§u (DD.MM.YYYY)"
-
-# @ wpsg
-#: ../views/mods/mod_discount/productgroups_addedit_sidebar.phtml:16 
-#: ../views/mods/mod_discount/produkt_edit_sidebar.phtml:16
-msgid "Ende (TT.MM.JJJJ)"
-msgstr "Káº¿t thÃºc (DD.MM.YYYY)"
-
-# @ wpsg
-#: ../views/mods/mod_discount/productgroups_addedit_sidebar.phtml:17 
-#: ../views/mods/mod_discount/customergroup_edit.phtml:14 
-#: ../views/mods/mod_discount/produkt_edit_sidebar.phtml:17 
-#: ../views/mods/mod_discount/settings_edit.phtml:39 
-#: ../views/mods/mod_discount/settings_edit.phtml:94 
-#: ../views/warenkorb/index.phtml:41 ../views/warenkorb/overview.phtml:174 
-#: ../views/warenkorb/basket.phtml:111 ../mods/wpsg_mod_discount.class.php:2
-msgid "Rabatt"
-msgstr "Chiáº¿t kháº¥u"
-
-# @ wpsg
-#: ../views/mods/mod_discount/produkt_edit_sidebar.phtml:11 
-#: ../views/mods/mod_discount/settings_edit.phtml:14 
-#: ../mods/wpsg_mod_discount.class.php:22
-msgid "Produktrabatt"
-msgstr "Chiáº¿t kháº¥u cho sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_discount/settings_edit.phtml:23
-msgid "Rabatt auf Produkte"
-msgstr "Chiáº¿t kháº¥u cho cÃ¡c sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_discount/settings_edit.phtml:31
-msgid "Von (tt.mm.jjjj)"
-msgstr "Tá»« ngÃ y (DD.MM.YYYY)"
-
-# @ wpsg
-#: ../views/mods/mod_discount/settings_edit.phtml:35
-msgid "Bis (tt.mm.jjjj)"
-msgstr "Äáº¿n ngÃ y (DD.MM.YYYY)"
-
-# @ wpsg
-#: ../views/mods/mod_discount/settings_edit.phtml:47
-msgid "Rabatt auf Produktgruppen"
-msgstr "Chiáº¿t kháº¥u cho cÃ¡c nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_discount/settings_edit.phtml:97 
-#: ../views/mods/mod_discount/settings_edit.phtml:102 
-#: ../views/mods/mod_discount/settings_edit.phtml:108 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:11 
-#: ../views/mods/mod_scaleprice/scaleList.phtml:68
-msgid "ab"
-msgstr "tá»«"
-
-# @ wpsg
-#: ../views/mods/mod_discount/settings_edit.phtml:104
-msgid "lÃ¶schen"
-msgstr "xoÃ¡"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:51
-msgid "Verwendete WÃ€hrung"
-msgstr "ÄÆ¡n vá» tiá»n tá» ÄÃ£ sá»­ dá»¥ng"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:51
-msgid "Euro"
-msgstr "Euro"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:51
-msgid "Schweizer Franken"
-msgstr "Swiss franc"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:51
-msgid "Britische Pfund"
-msgstr "Äá»ng Báº£ng Anh"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:53
-msgid "Projekt ID fÃŒr SofortÃŒberweisung.de"
-msgstr "MÃ£ dá»± Ã¡n tá»« sofortbanking.com"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:54
-msgid "Projekt Passwort"
-msgstr "Máº­t kháº©u dá»± Ã¡n"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:55
-msgid "Benachrichtigungs Passwort"
-msgstr "Máº­t kháº©u thÃŽng bÃ¡o"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:56
-msgid "Sprache bei SofortÃŒberweisung.de"
-msgstr "NgÃŽn ngá»¯ trong sofortbanking.com"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:56
-msgid "deutsch"
-msgstr "Tiáº¿ng Äá»©c"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:56
-msgid "englisch"
-msgstr "Tiáº¿ng Anh"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:56
-msgid "franzÃ¶sisch"
-msgstr "Tiáº¿ng PhÃ¡p"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:56
-msgid "niederlÃ€ndisch"
-msgstr "Tiáº¿ng HÃ  Lan"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:57
-msgid "Verwendetes HASH Verfahren"
-msgstr "Sá»­ dá»¥ng phÆ°Æ¡ng phÃ¡p HASH"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:60
-msgid "URL fÃŒr HTTP Benachrichtigung"
-msgstr "URL cho thÃŽng bÃ¡o HTTP"
-
-# @ wpsg
-#: ../views/mods/mod_su/settings_edit.phtml:67 
-#: ../views/mods/mod_paypal/settings_edit.phtml:93
-msgid "Zahlung sofort starten"
-msgstr "Báº¯t Äáº§u thanh toÃ¡n ngay"
-
-# @ wpsg
-#: ../views/mods/mod_su/order_done.phtml:8
-msgid ""
-"Um den Betrag mit SofortÃŒberweisung zu bezahlen klicken Sie bitte auf "
-"folgendes Logo."
-msgstr "Nháº¥p lÃªn biá»u tÆ°á»£ng Äá» thanh toÃ¡n báº±ng SofortBanking:"
-
-# @ wpsg
-#: ../views/mods/mod_su/order_done.phtml:10 
-#: ../views/mods/mod_su/order_done.phtml:11
-msgid "Mit SofortÃŒberweisung bezahlen"
-msgstr "Thanh toÃ¡n dÃ¹ng SofortBanking"
-
-# @ wpsg
-#: ../views/mods/mod_autodebit/mail_html.phtml:21 
-#: ../views/mods/mod_autodebit/mail.phtml:13 
-#: ../views/mods/mod_autodebit/order_view_afterpayment.phtml:14
-msgid "BLZ der Bank"
-msgstr "MÃ£ ngÃ¢n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_autodebit/mail_html.phtml:26 
-#: ../views/mods/mod_autodebit/mail.phtml:15
-msgid "Name des Kontoinhabers"
-msgstr "Chá»§ tÃ i khoáº£n"
-
-# @ wpsg
-#: ../views/mods/mod_autodebit/mail_html.phtml:36 
-#: ../views/mods/mod_autodebit/paymenthint.phtml:48 
-#: ../views/mods/mod_autodebit/mail.phtml:19 
-#: ../views/mods/mod_autodebit/order_view_afterpayment.phtml:22
-msgid "Kontonummer"
-msgstr "Sá» tÃ i khoáº£n"
-
-# @ wpsg
-#: ../views/mods/mod_autodebit/paymenthint.phtml:13 
-#: ../views/mods/mod_autodebit/order_view_afterpayment.phtml:17
-msgid "Inhaber"
-msgstr "Chá»§"
-
-# @ wpsg
-#: ../views/mods/mod_autodebit/paymenthint.phtml:30
-msgid "Bankleitzahl"
-msgstr "MÃ£ ngÃ¢n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_autodebit/paymenthint.phtml:40 
-#: ../views/mods/mod_prepayment/mail_html.phtml:18 
-#: ../views/mods/mod_prepayment/mail.phtml:12 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:30
-msgid "IBAN"
-msgstr "IBAN"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/show.phtml:9 
-#: ../views/mods/mod_productgroups/list.phtml:12
-msgid "Dieses Template erfordert das Modul mod_produktbilder."
-msgstr "Máº«u nÃ y yÃªu cáº§u Module mod_produktbilder."
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/show.phtml:45
-msgid "Mehr zur Produktgruppe"
-msgstr "ThÃªm vá» nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/add.phtml:11
-msgid "Produktgruppe #1#"
-msgstr "NhÃ³m sáº£n pháº©m #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/add.phtml:51
-msgid "Info Seite"
-msgstr "Trang thÃŽng tin"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/add.phtml:57
-msgid "Produktgruppe speichern"
-msgstr "LÆ°u nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/add.phtml:58
-msgid "Produktgruppe speichern und zur Ãbersicht"
-msgstr "LÆ°u nhÃ³m sáº£n pháº©m vÃ  quay láº¡i trang Tá»ng quÃ¡t"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/index.phtml:11 
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:23
-msgid "Produktgruppenverwaltung"
-msgstr "Quáº£n lÃœ nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/index.phtml:20
-msgid "Keine Produktgruppen hinterlegt."
-msgstr "ChÆ°a cÃ³ nhÃ³m sáº£n pháº©m nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/index.phtml:35 
-#: ../views/mods/mod_productgroups/index.phtml:37
-msgid "Diese Produktgruppe bearbeiten"
-msgstr "Chá»nh sá»­a nhÃ³m sáº£n pháº©m nÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/index.phtml:39
-msgid "Diese Produktgruppe lÃ¶schen"
-msgstr "XoÃ¡ nhÃ³m sáº£n pháº©m nÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/index.phtml:42
-msgid "Zur Produktliste"
-msgstr "Äáº¿n danh sÃ¡ch sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:14 
-#: ../views/mods/mod_stock/produkt_edit_sidebar.phtml:25
-msgid "Lagerbestand zÃ€hlen"
-msgstr "Sá» hÃ ng trong kho"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml:15 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:79 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:235
-msgid "Bestand"
-msgstr "Trong kho"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/admin_setcapabilities.phtml:11
-msgid "Statistik"
-msgstr "Sá» liá»u"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:11 
-#: ../views/mods/mod_productindex/page_metabox.phtml:19 
-#: ../views/mods/mod_productindex/page_metabox.phtml:21 
-#: ../mods/wpsg_mod_productindex.class.php:14 
-#: ../mods/wpsg_mod_productgroups.class.php:2 
-#: ../mods/wpsg_mod_productgroups.class.php:20
-msgid "Produktgruppen"
-msgstr "CÃ¡c nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:16
-msgid "Bisher wurden keine Produktgruppen angelegt."
-msgstr "ChÆ°a cÃ³ nhÃ³m sáº£n pháº©m nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:19
-msgid "Sticky von"
-msgstr "Tá»«"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/produkt_edit_sidebar.phtml:20
-msgid "Sticky bis"
-msgstr "Äáº¿n"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/settings_edit.phtml:8
-msgid "ProduktgruppenÃŒbersichtsseite"
-msgstr "Trang tá»ng quÃ¡t nhÃ³m sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/settings_edit.phtml:9
-msgid "Sortierung innerhalb der Gruppe"
-msgstr "PhÃ¢n liá»u trong nhÃ³m"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/settings_edit.phtml:10
-msgid "Nach ID"
-msgstr "ID sau"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/settings_edit.phtml:12
-msgid "Anzahl VerkÃ€ufe"
-msgstr "Sá» lÆ°á»£ng lÆ°á»£t bÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_productgroups/settings_edit.phtml:13 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Erstellungsdatum"
-msgstr "NgÃ y táº¡o"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/mail_html.phtml:9 
-#: ../views/mods/mod_willcollect/mail.phtml:9
-msgid "Bitte vereinbaren Sie mit uns einen Termin an dem Sie die Ware abholen."
-msgstr "Vui lÃ²ng Äáº·t lá»ch háº¹n vá»i chÃºng tÃŽi náº¿u báº¡n muá»n Äáº¿n nháº­n hÃ ng."
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/mail_html.phtml:14 
-#: ../views/mods/mod_willcollect/mail.phtml:11
-msgid "Abholadresse"
-msgstr "Äá»a chá» nháº­n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/shippinghint.phtml:8
-msgid "Die Ware kann dann an folgender Adresse abgeholt werden:"
-msgstr "Báº¡n cÃ³ thá» Äáº¿n nháº­n sáº£n pháº©m táº¡i Äá»a chá»:"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/settings_edit.phtml:11
-msgid "Selbstabholung erfordert Barzahlung"
-msgstr ""
-"PhÆ°Æ¡ng thá»©c Thanh toÃ¡n trá»±c tiáº¿p vÃ  nháº­n hÃ ng yÃªu cáº§u thanh toÃ¡n báº±ng tiá»n "
-"máº·t"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/settings_edit.phtml:18
-msgid "Zahlungsart \"Barzahlung\" aktivieren"
-msgstr "KÃ­ch hoáº¡t \"Thanh toÃ¡n tiá»n máº·t\""
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/settings_edit.phtml:19
-msgid "Bezeichung der Zahlungsart"
-msgstr "MÃŽ táº£ phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/settings_edit.phtml:20
-msgid "Hinweistext der Zahlungsart"
-msgstr "Gá»£i Ãœ phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/settings_edit.phtml:22
-msgid "GebÃŒhr/Rabatt (Versandart)"
-msgstr "PhÃ­\\Chiáº¿t kháº¥u (phÆ°Æ¡ng thá»©c váº­n chuyá»n)"
-
-# @ wpsg
-#: ../views/mods/mod_willcollect/settings_edit.phtml:23
-msgid "GebÃŒhr/Rabatt (Zahlungsart)"
-msgstr "PhÃ­\\Chiáº¿t kháº¥u (phÆ°Æ¡ng thá»©c thanh toÃ¡n)"
-
-# @ wpsg
-#: ../views/mods/mod_nlsatolo/checkout_customer_inner.phtml:13 
-#: ../views/mods/mod_newsletter/checkout_customer_inner.phtml:11
-msgid "FÃŒr Newsletter anmelden."
-msgstr "ÄÄng kÃœ nháº­n thÆ° thÃŽng bÃ¡o"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/order_view_sidebar.phtml:11 
-#: ../views/mods/mod_ordervars/mail_html.phtml:9 
-#: ../views/mods/mod_ordervars/checkout_inner_prebutton.phtml:10 
-#: ../views/mods/mod_ordervars/mail.phtml:9 
-#: ../views/mods/mod_ordervars/settings_edit.phtml:40 
-#: ../mods/wpsg_mod_ordervars.class.php:2 ../mods/wpsg_mod_export.class.php:22
-msgid "Bestellvariablen"
-msgstr "Biáº¿n sá» ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/ov_list.phtml:25
-msgid "Bestellvariable lÃ¶schen"
-msgstr "XoÃ¡ biáº¿n ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/ov_list.phtml:153
-msgid "Bisher noch keine Bestellvariablen angelegt."
-msgstr "ChÆ°a cÃ³ biáº¿n ÄÆ¡n hÃ ng nÃ o ÄÆ°á»£c lÆ°u."
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/settings_edit.phtml:32
-msgid "Wird eine Bestellvariable vom Type"
-msgstr "LÃ  má»t thay Äá»i cá»§a hoÃ¡ ÄÆ¡n dáº¡ng"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/settings_edit.phtml:32
-msgid "\"Auswahl\""
-msgstr "Lá»±a chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/settings_edit.phtml:32
-msgid ""
-"angelegt, kÃ¶nnen die Optionen mit dem Pipe \"|\" Symbol getrennt angegeben "
-"werden."
-msgstr "táº¡o, lá»±a chá»n cÃ³ thá» ÄÆ°á»£c ngÄn cÃ¡ch sá»­ dá»¥ng \"|\"."
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/settings_edit.phtml:33
-msgid "Bsp.:"
-msgstr "VÃ­ dá»¥:"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/settings_edit.phtml:33
-msgid "Auswahl_1 | Auswahl_2 | Auswahl_3"
-msgstr "Lá»±a chá»n_1 | Lá»±a chá»n_2 | Lá»±a chá»n_3"
-
-# @ wpsg
-#: ../views/mods/mod_ordervars/settings_edit.phtml:41
-msgid "Neue Bestellvariable anlegen"
-msgstr "Táº¡o má»t biáº¿n ÄÆ¡n hÃ ng má»i"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:9
-msgid ""
-"Das Modul ist nur mit aktiviertem wpNewsletterGermany Plugin funktionsfÃ€hig."
-msgstr "Module chá» hoáº¡t Äá»ng vá»i Plugin wpNewsletterGermany ÄÃ£ kÃ­ch hoáº¡t."
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:12
-msgid "Gruppenzuordnung nach Registrierung"
-msgstr "Sáº¯p xáº¿p nhÃ³m sau khi ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:13
-msgid "Aktion"
-msgstr "Hoáº¡t Äá»ng"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:13
-msgid "Opt-In Mail versenden"
-msgstr "Gá»­i thÆ° Opt-in"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:13
-msgid "Direkt anmelden"
-msgstr "Ãp dá»¥ng trá»±c tiáº¿p"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:17
-msgid "Gruppenimport aus wpShopGermany Kunden"
-msgstr "Nháº­p nhÃ³m tá»« khÃ¡ch hÃ ng wpShopGermany"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:26
-msgid "Kunden importieren"
-msgstr "Nháº­p khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:44
-msgid "Bitte mindestens eine Gruppe wÃ€hlen."
-msgstr "Vui lÃ²ng chá»n Ã­t nháº¥t má»t nhÃ³m."
-
-# @ wpsg
-#: ../views/mods/mod_newsletter/settings_edit.phtml:49
-msgid ""
-"Die Shop Kunden werden in die ausgewÃ€hlten Gruppen importiert. Bestehende E-"
-"Mail Adressen werden ÃŒberschrieben."
-msgstr ""
-"KhÃ¡ch hÃ ng cá»­a hÃ ng ÄÃ£ ÄÆ°á»£c nháº­p vÃ o cÃ¡c nhÃ³m ÄÃ£ ÄÆ°á»£c chá»n. CÃ¡c Äá»a chá» thÆ° "
-"hiá»n táº¡i sáºœ ÄÆ°á»£c viáº¿t ÄÃš."
-
-# @ wpsg
-#: ../views/mods/mod_legaltexts/settings_edit.phtml:10
-msgid "Protected Shops"
-msgstr "Protected Shops"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:3
-msgid "Gesonderte Lieferadresse"
-msgstr "Äá»a chá» váº­n chuyá»n Äáº·c biá»t"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:21
-msgid "Firma:"
-msgstr "CÃŽng ty:"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:26
-msgid "Anrede:"
-msgstr "Danh xÆ°ng:"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:37
-msgid "Vorname:"
-msgstr "TÃªn:"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:44
-msgid "Name:"
-msgstr "Há»:"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:51
-msgid "Strasse, Nr.:"
-msgstr "ÄÆ°á»ng, sá» nhÃ :"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:58
-msgid "Postleitzahl:"
-msgstr "MÃ£ bÆ°u Äiá»n:"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:65
-msgid "Ort:"
-msgstr "ThÃ nh phá»:"
-
-# @ wpsg
-#: ../views/mods/mod_shippingadress/checkout_inner_prebutton.phtml:72
-msgid "Land:"
-msgstr "Quá»c gia:"
-
-# @ wpsg
-#: ../views/mods/mod_micropayment/settings_edit.phtml:14
-msgid "Sandbox"
-msgstr "Sand box"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:17
-msgid "E-Mail (PayPal Konto)"
-msgstr "Email (TÃ i khoáº£n Paypal)"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:20
-msgid ""
-"Zur Anbindung an den PayPal Service wird <a href=\"https://www.paypalobjects."
-"com/de_DE/html/IntegrationCenter/ic_pps_home.html\">PayPal Starter</a> "
-"genutzt. FortfÃŒhrende Details finden Sie im <a href=\"https://www."
-"paypalobjects.com/de_DE/pdf/PayPal-Starter-Integrationshandbuch.pdf\">Paypal "
-"Starter Integrationshandbuch.</a>"
-msgstr ""
-"TÃ­nh nÄng <a href=\"https://www.paypalobjects."
-"com/de_DE/html/IntegrationCenter/ic_pps_home.html\">PayPal Starter</a> ÄÆ°á»£c "
-"sá»­ dá»¥ng Äá» káº¿t ná»i tá»i dá»ch vá»¥ cá»§a Paypal. Xem thÃŽng tin chi tiáº¿t táº¡i <a "
-"href=\"https://www.paypalobjects.com/de_DE/pdf/PayPal-Starter-"
-"Integrationshandbuch.pdf\">Paypal Starter manual</a>."
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:21
-msgid ""
-"Im Integrationshandbuch erfahren Sie auch, wie Sie die Sandbox nutzen, um "
-"den Zahlungsverkehr zu testen."
-msgstr ""
-"Trong tÃ i liá»u hÆ°á»ng dáº«n, báº¡n sáºœ tÃ¬m tháº¥y thÃŽng tin vá» viá»c sá»­ dá»¥ng Tráº¡ng "
-"thÃ¡i Sandbox Äá» kiá»m tra giao dá»ch thanh toÃ¡n."
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:82
-msgid "Sandbox Modus"
-msgstr "Tráº¡ng thÃ¡i Sandbox"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:91
-msgid "WÃ€hrungscode (Standard: EUR)"
-msgstr "MÃ£ ÄÆ¡n vá» tiá»n tá» (máº·c Äá»nh: EUR)"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:92
-msgid "Sprache im PayPal Interface"
-msgstr "NgÃŽn ngá»¯ trong giao diá»n Paypal"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:92
-msgid "Deutsch"
-msgstr "Tiáº¿ng Äá»©c"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:92
-msgid "Englisch"
-msgstr "Tiáº¿ng Anh"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:94
-msgid "Erfolgsseite"
-msgstr "Trang xÃ¡c nháº­n thÃ nh cÃŽng"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/settings_edit.phtml:95
-msgid "Fehlerseite"
-msgstr "Trang xÃ¡c nháº­n lá»i"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/order_done.phtml:9
-msgid ""
-"Um den Betrag mit PayPal zu bezahlen klicken Sie bitte auf folgendes Logo."
-msgstr "Äá» thanh toÃ¡n báº±ng Paypal, vui lÃ²ng nháº¥n vÃ o biá»u tÆ°á»£ng sau"
-
-# @ wpsg
-#: ../views/mods/mod_paypal/order_done.phtml:11 
-#: ../views/mods/mod_paypal/order_done.phtml:12
-msgid "Mit PayPal bezahlen"
-msgstr "Thanh toÃ¡n dÃ¹ng Paypal"
-
-# @ wpsg
-#: ../views/mods/mod_scaleprice/produkt_edit_sidebar.phtml:182 
-#: ../views/mods/mod_fuellmenge/settings_edit.phtml:10
-msgid "BezugsgrÃ¶Ãe"
-msgstr "CÆ¡ sá» phÃ¢n phá»i"
-
-# @ wpsg
-#: ../views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:11 
-#: ../views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:15 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:229 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "FÃŒllmenge"
-msgstr "Sá» lÆ°á»£ng má»i gÃ³i"
-
-# @ wpsg
-#: ../views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml:14
-msgid "Einheit"
-msgstr "ÄÆ¡n vá»"
-
-# @ wpsg
-#: ../views/mods/mod_fuellmenge/settings_edit.phtml:9
-msgid "MÃ¶gliche Einheiten (Kommagetrennt)"
-msgstr "CÃ¡c ÄÆ¡n vá» kháº£ dá»¥ng (phÃ¢n tÃ¡ch vá»i dáº¥u pháº©y)"
-
-# @ wpsg
-#: ../views/mods/mod_fuellmenge/settings_edit.phtml:13
-msgid "FÃŒllmenge auf ProduktÃŒbersichtsseiten anzeigen"
-msgstr "Hiá»n thá» lÆ°á»£ng cho má»i thÃ¹ng táº¡i Tá»ng quÃ¡t sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_fuellmenge/settings_edit.phtml:14
-msgid "Grundpreis auf ProduktÃŒbersichtsseiten anzeigen"
-msgstr "Hiá»n thá» giÃ¡ cÆ¡ sá» táº¡i Tá»ng quÃ¡t sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_invoice_type/settings_edit.phtml:13
-msgid "GebÃŒhr/ Rabatt"
-msgstr "PhÃ­\\Chiáº¿t kháº¥u"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:17 
-#: ../views/mods/mod_core/admin_register.phtml:27
-msgid "Registrierungsdaten"
-msgstr "Dá»¯ liá»u ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:18
-msgid "Domainverwaltung"
-msgstr "Quáº£n lÃœ miá»n"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:19
-msgid "Modulaktivierung"
-msgstr "Quáº£n lÃœ Module"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:29
-msgid "Lizenzart"
-msgstr "Loáº¡i giáº¥y phÃ©p"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:43
-msgid "Ãnderungen ÃŒbermitteln"
-msgstr "Ná»p thay Äá»i"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:49
-msgid "Registrierte Domains"
-msgstr "CÃ¡c miá»n ÄÃ£ ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:52
-msgid "Noch keine Domains registriert."
-msgstr "ChÆ°a cÃ³ miá»n nÃ o ÄÆ°á»£c ÄÄng kÃœ."
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:54
-msgid "Bereits auf diesen Key registrierte Domains"
-msgstr "CÃ¡c miá»n ÄÃ£ ÄÄng kÃœ cho khoÃ¡ nÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:57
-msgid "Registrierung aufheben"
-msgstr "Huá»· ÄÄng kÃœ"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:64
-msgid "Diese Domain ist bereits auf diesen SchlÃŒssel registriert."
-msgstr "Miá»n nÃ y ÄÃ£ ÄÆ°á»£c ÄÄng kÃœ vá»i khoÃ¡ nÃ y."
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:67
-msgid "Diese Domain ist noch nicht auf diesen SchlÃŒssel registriert."
-msgstr "Miá»
-n nÃ y váº«n chÆ°a ÄÆ°á»£c ÄÄng kÃœ vá»i khoÃ¡ nÃ y."
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:71
-msgid ""
-"Sie dÃŒrfen mit dieser Lizenz den Shop nur auf einer Domain laufen lassen. "
-"LÃ¶schen sie die bereits registrierte Domain und registrieren Sie diese "
-"Domain neu."
-msgstr "Báº¡n chá» ÄÆ°á»£c phÃ©p cháº¡y shop trÃªn má»t miá»n vá»i mÃ£ cá»§a báº¡n."
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:76
-msgid "Diese Domain registrieren"
-msgstr "ÄÄng kÃœ miá»n nay"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:84
-msgid "Weitere Module"
-msgstr "Module phá»¥"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_register.phtml:91
-msgid "ModulschlÃŒssel"
-msgstr "KhoÃ¡ Module"
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_licence.phtml:5
-msgid "Es wurde noch keine gÃŒltige Lizenz gefunden."
-msgstr "KhÃŽng tÃ¬m tháº¥y giáº¥y phÃ©p cÃ³ hiá»u lá»±c."
-
-# @ wpsg
-#: ../views/mods/mod_core/admin_licence.phtml:7
-msgid ""
-"Damit sie den Shop registrieren kÃ¶nnen benÃ¶tigen sie eine gÃŒltige Lizenz.<br "
-"/>Diese kÃ¶nnen sie unter <a href=\"http://shop.maennchen1.de/\" "
-"target=\"_blank\">shop.maennchen1.de</a> erwerben und anschlieÃend in der "
-"Plugin Verwaltung installieren."
-msgstr ""
-"Báº¡n cáº§n giáº¥y phÃ©p cÃ³ hiá»u lá»±c Äá» ÄÄng kÃœ wpShopGermany.<br />Giáº¥y phÃ©p cÃ³ "
-"thá» ÄÆ°á»£c mua táº¡i <a href=\"http://shop.maennchen1.de/\" target=\"_blank\">"
-"shop.maennchen1.de</a> vÃ  nháº­p vÃ o Quáº£n lÃœ Plugin sau ÄÃ³."
-
-# @ wpsg
-#: ../views/mods/mod_core/module_index.phtml:25
-msgid "Modulname"
-msgstr "TÃªn Module"
-
-# @ wpsg
-#: ../views/mods/mod_core/module_index.phtml:48
-msgid "Demo"
-msgstr "Báº£n thá»­"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:67
-msgid "Bitte einen Betreff angeben!"
-msgstr "Vui lÃ²ng nháº­p chá»§ Äá»!"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:75
-msgid "Bitte einen Text angeben!"
-msgstr "Vui lÃ²ng nháº­p vÄn báº£n!"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:102
-msgid "Mail konnte nicht versendet werden es ist ein Fehler aufgetreten!"
-msgstr "KhÃŽng thá» gá»­i thÆ° do cÃ³ lá»i!"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:118
-msgid "Mail wurde erfolgreich an den Kunden gesendet."
-msgstr "ThÆ° ÄÃ£ ÄÆ°á»£c gá»­i tá»i khÃ¡ch hÃ ng."
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:136 
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1
-msgid "Kundenkontakt"
-msgstr "LiÃªn há» khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:170 
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Text"
-msgstr "VÄn báº£n"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/order_view.phtml:177
-msgid "Absenden"
-msgstr "Gá»­i"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:9 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:9
-msgid "wpShopGermany: Zahlungsaufforderung"
-msgstr "wpShopGermany: Äá» nghá» thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml:20
-#:  ../views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml:20
-msgid ""
-"Sie sind Ihren Zahlungsverpflichtungen nicht nachgekommen. Bitte begleichen "
-"Sie umgehend den Rechnungsbetrag von"
-msgstr ""
-"Báº¡n chÆ°a hoÃ n thÃ nh viá»c thanh toÃ¡n. Vui lÃ²ng thanh toÃ¡n cho ÄÆ¡n hÃ ng vá»i "
-"giÃ¡ trá» lÃ "
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:9 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:8
-msgid "wpShopGermany: Zahlungserinnerung"
-msgstr "wpShopGermany: ThÆ° nháº¯c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:20 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:19
-msgid "Sie haben am"
-msgstr "VÃ o ngÃ y"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:20 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:19
-msgid "eine Bestellung ÃŒber"
-msgstr "báº¡n ÄÃ£ Äáº·t sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml:20 
-#: ../views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml:19
-msgid ""
-"aufgegeben. Leider ist bis heute kein Zahlungsausgleich erfolgt. Gab es "
-"Probleme mit der Zahlung? Gerne helfen wir Ihnen weiter! Oder dÃŒrfen wir die "
-"Bestellung fÃŒr Sie stornieren?"
-msgstr ""
-"Ráº¥t tiáº¿c chÃºng tÃŽi váº«n chÆ°a nháº­n ÄÆ°á»£c khoáº£n thanh toÃ¡n. Náº¿u báº¡n gáº·p váº¥n Äá» "
-"trong quÃ¡ trÃ¬nh thanh toÃ¡n, chÃºng tÃŽi ráº¥t vui lÃ²ng ÄÆ°á»£c há» trá»£ báº¡n."
-
-# @ wpsg
-#: ../views/mods/mod_debitpayment/settings_edit.phtml:13
-msgid "Rabatt/GebÃŒhr"
-msgstr "Chiáº¿t kháº¥u\\PhÃ­"
-
-# @ wpsg
-#: ../views/mods/mod_relatedproducts/list.phtml:10
-msgid "Noch keine Produkte zugeordnet"
-msgstr "ChÆ°a cÃ³ sáº£n pháº©m ÄÆ°á»£c chá» Äá»nh"
-
-# @ wpsg
-#: ../views/mods/mod_relatedproducts/list.phtml:15 
-#: ../views/mods/mod_relatedproducts/list.phtml:17
-msgid "Zuordnung lÃ¶schen"
-msgstr "XoÃ¡ chá» Äá»nh"
-
-# @ wpsg
-#: ../views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml:11 
-#: ../mods/wpsg_mod_relatedproducts.class.php:2
-msgid "ZubehÃ¶rprodukte"
-msgstr "CÃ¡c sáº£n pháº©m liÃªn quan"
-
-# @ wpsg
-#: ../views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml:14
-msgid "Neuens Produkt zuordnen"
-msgstr "Chá» Äá»nh sáº£n pháº©m má»i"
-
-# @ wpsg
-#: ../views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml:35
-msgid "Produktauswahl"
-msgstr "Lá»±a chá»n sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_relatedproducts/relatedproducts.phtml:8
-msgid "Ãhnliche Produkte"
-msgstr "CÃ¡c sáº£n pháº©m liÃªn quan"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/produkt_edit_content.phtml:14
-msgid "Bitte einen Namen fÃŒr die neue Variante angeben!"
-msgstr "Vui lÃ²ng thÃªm tÃªn cá»§a máº«u má»i!"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/produkt_edit_content.phtml:87
-msgid ""
-"Sind Sie sich sicher, dass Sie die Variante und alle Variationen lÃ¶schen "
-"mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ máº«u nÃ y vÃ  táº¥t cáº£ biáº¿n thá» cá»§a nÃ³?"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/produkt_edit_content.phtml:164
-msgid "Sind Sie sich sicher, dass Sie die Variation lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n xoÃ¡ thay Äá»i nÃ y?"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/produkt_edit_content.phtml:288 
-#: ../mods/wpsg_mod_varianten.class.php:2
-msgid "Varianten"
-msgstr "Biáº¿n sá»"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/produkt_edit_content.phtml:294
-msgid ""
-"Varianten kÃ¶nnen erst nach einmaligem Speichern des Produkts angelegt werden."
-msgstr "Äá» táº¡o má»t máº«u mÃ£ má»i báº¡n cáº§n lÆ°u sáº£n pháº©m trÆ°á»c."
-
-# @ wpsg
-#: ../views/mods/mod_varianten/mail_row.phtml:10
-msgid "Variante:"
-msgstr "Máº«u mÃ£:"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:18
-msgid "Es wurden noch keine Varianten zu diesem Produkt angelegt."
-msgstr "ChÆ°a cÃ³ biáº¿n nÃ o ÄÆ°á»£c táº¡o cho sáº£n pháº©m nÃ y."
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:31
-msgid "Selectbox"
-msgstr "Thanh chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:33
-msgid "Radio Auswahl"
-msgstr "Chá»n Radio"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:73 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:226
-msgid "Varianten Art. Nr."
-msgstr "Sá» sáº£n pháº©m cá»§a má»t máº«u"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:342
-msgid "Speicher..."
-msgstr "Äang lÆ°uâŠ"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:343
-msgid "Zum Bearbeiten anklicken und mit Enter bestÃ€tigen ..."
-msgstr "Nháº¥n Äá» chá»nh sá»­a vÃ  áº¥n Enter Äá» xÃ¡c nháº­n thay Äá»iâŠ"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:429
-msgid "Neue Variation"
-msgstr "Thay Äá»i má»i"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:431 
-#: ../views/mods/mod_varianten/drawVarianten.phtml:531
-msgid "Anlegen"
-msgstr "Táº¡o"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:520
-msgid "Neue Variante"
-msgstr "Máº«u mÃ£ má»i"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:524
-msgid "Auswahl durch Radio Buttons"
-msgstr "Lá»±a chá»n sá»­ dá»¥ng cÃ¡c nÃºt Radio"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:525
-msgid "Auswahl ÃŒber eine Selectbox"
-msgstr "Lá»±a chá»n sá»­ dá»¥ng thanh chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/drawVarianten.phtml:526
-msgid "Ãber eine Checkbox aktivierbar"
-msgstr "KÃ­ch hoáº¡t sá»­ dá»¥ng ÃŽ chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:8
-msgid "Direkte Anzeige eines Variantenbildes"
-msgstr "Hiá»n thá» áº£nh cá»§a máº«u mÃ£ ngay"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:9
-msgid "Erweiterte Variantenanzeige aktivieren"
-msgstr "Hiá»n thá» má» rá»ng cho cÃ¡c máº«u mÃ£"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:12 
-#: ../views/mods/mod_varianten/settings_edit.phtml:19
-msgid "Breite des Vorschaubildes"
-msgstr "Chiá»u rá»ng cá»§a hÃ¬nh xem trÆ°á»c"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:13 
-#: ../views/mods/mod_varianten/settings_edit.phtml:20
-msgid "HÃ¶he des Vorschaubildes"
-msgstr "Chiá»u cao cá»§a hÃ¬nh xem trÆ°á»c"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:14
-msgid "Produktartikelnummer ersetzen"
-msgstr "Thay sá» sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:14
-msgid ""
-"Ersetzt die Produktartikelnummer durch die zusammengesetzte Artikelnummern "
-"der Varianten."
-msgstr "Thay sá» sáº£n pháº©m báº±ng sá» sáº£n pháº©m kÃšm máº«u mÃ£"
-
-# @ wpsg
-#: ../views/mods/mod_varianten/settings_edit.phtml:26
-msgid ""
-"Die direkte Anzeige, zeigt die Bilder direkt an. Es wird dabei fÃŒr jede "
-"Variation ein Bild angezeigt. Bei Selectboxen erfolgt die Anzeige ÃŒber den "
-"Wechsel der Selectbox. "
-msgstr ""
-"Hiá»n thá» áº£nh cho má»i thay Äá»i. Táº¡i ÃŽ lá»±a chá»n hiá»n thá» thay Äá»i ÃŽ lá»±a chá»n"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/mail_html.phtml:22 
-#: ../views/mods/mod_prepayment/mail.phtml:13 
-#: ../views/mods/mod_prepayment/settings_edit.phtml:29
-msgid "Bank"
-msgstr "NgÃ¢n hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/mail_html.phtml:26 
-#: ../views/mods/mod_prepayment/mail.phtml:14
-msgid "BIC-/SWIFT-Code"
-msgstr "MÃ£ BIC-/SWIFT"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/settings_edit.phtml:20
-msgid "Betreff fÃŒr Ãberweisungen"
-msgstr "Ná»i dung chuyá»n khoáº£n"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/settings_edit.phtml:31
-msgid "BIC-/SWIFT Code"
-msgstr "MÃ£ BIC-/SWIFT"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/order_done.phtml:10
-msgid ""
-"Sie haben die Zahlungsart \"Vorkasse\" gewÃ€hlt. Ãberweisen Sie daher den "
-"Rechnungsbetrag von #1# auf folgendes Konto:"
-msgstr ""
-"Báº¡n ÄÃ£ chá»n thanh toÃ¡n \"Tráº£ trÆ°á»c\". Vui lÃ²ng chuyá»n khoáº£n thanh toÃ¡n hoÃ¡ "
-"ÄÆ¡n #1# Äáº¿n tÃ i khoáº£n sau:"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/order_done.phtml:12
-msgid "Kontoinhaber: #1#"
-msgstr "Chá»§ tÃ i khoáº£n: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/order_done.phtml:13
-msgid "IBAN: #1#"
-msgstr "IBAN: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/order_done.phtml:14
-msgid "Bank: #1#"
-msgstr "NgÃ¢n hÃ ng: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/order_done.phtml:15
-msgid "BIC-/SWIFT-Code: #1#"
-msgstr "BIC-/SWIFT-Code: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_prepayment/order_done.phtml:17
-msgid "Bitte als Betreff angeben: \"#1#\""
-msgstr "Vui lÃ²ng ghi chÃº ná»i dung: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:45 
-#: ../views/mods/mod_productindex/layouts/list.phtml:190 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:47 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:206
-msgid "Sortierung:"
-msgstr "PhÃ¢n loáº¡i theo:"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:47 
-#: ../views/mods/mod_productindex/layouts/list.phtml:192 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:49 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:208
-msgid "Preis (Kleinster zuerst)"
-msgstr "GiÃ¡ (tháº¥p tá»i cao)"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:48 
-#: ../views/mods/mod_productindex/layouts/list.phtml:193 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:50 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:209
-msgid "Preis (GrÃ¶Ãter zuerst)"
-msgstr "GiÃ¡ (cao tá»i tháº¥p)"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:49 
-#: ../views/mods/mod_productindex/layouts/list.phtml:194 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:51 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:210
-msgid "Name Aufsteigend"
-msgstr "TÃªn giáº£m dáº§n"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:50 
-#: ../views/mods/mod_productindex/layouts/list.phtml:195 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:52 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:211
-msgid "Name Absteigend"
-msgstr "TÃªn tÄng dáº§n"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:61 
-#: ../views/mods/mod_productindex/layouts/list.phtml:206 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:63 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:222
-msgid "Seite:"
-msgstr "Trang:"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:68 
-#: ../views/mods/mod_productindex/layouts/list.phtml:213 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:70 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:229
-msgid "Zu Seite #1# wechseln"
-msgstr "Chuyá»n tá»i trang #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:78 
-#: ../views/mods/mod_productindex/layouts/list.phtml:79 
-#: ../views/mods/mod_productindex/layouts/list.phtml:223 
-#: ../views/mods/mod_productindex/layouts/list.phtml:224
-msgid "Zur Gitteransicht wechseln."
-msgstr "Chuyá»n tá»i xem dáº¡ng lÆ°á»i."
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:95 
-#: ../views/mods/mod_productindex/layouts/list.phtml:136 
-#: ../views/mods/mod_productindex/layouts/list.phtml:171 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:101 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:110 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:177
-msgid "Zur Detailseite des Produkts"
-msgstr "Chuyá»n tá»i trang chi tiáº¿t sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:107 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:116
-msgid "Gewicht: #1#"
-msgstr "Khá»i lÆ°á»£ng: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:109 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:118
-msgid "Gewicht: ab #1#"
-msgstr "Khá»i lÆ°á»£ng: tá»« #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:116 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:125
-msgid "FÃŒllmenge: #1#"
-msgstr "LÆ°á»£ng trong thÃ¹ng: #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:128 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:131
-msgid "Grundpreis: #1# / #2#"
-msgstr "GiÃ¡ cÆ¡ sá»: #1# / #2#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:147 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:151
-msgid "ab #1#"
-msgstr "tá»« #1#"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:164 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:168
-msgid "Preise nur fÃŒr eingeloggte Benutzer"
-msgstr "GiÃ¡ chá» hiá»n thá» cho ngÆ°á»i ÄÆ°á»£c kÃ­ch hoáº¡t"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:173 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:181
-msgid "In den Warenkorb legen"
-msgstr "Cho vÃ o giá» hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/list.phtml:183 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:199
-msgid "Keine passenden Produkte gefunden."
-msgstr "ChÆ°a tÃ¬m tháº¥y sáº£n pháº©m nÃ o phÃ¹ há»£p."
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/grid.phtml:80 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:81 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:239 
-#: ../views/mods/mod_productindex/layouts/grid.phtml:240
-msgid "Zur Listansicht wechseln."
-msgstr "Chuyá»n tá»i xem danh sÃ¡ch."
-
-# @ wpsg
-#: ../views/mods/mod_productindex/layouts/grid.phtml:177
-msgid "Zu den Produktdetails"
-msgstr "ThÃŽng tin sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:9
-msgid "Seite als Produktseite verwenden"
-msgstr "Sá»­ dá»¥ng trang nhÆ° trang sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:15
-msgid "Produktauswahl (Kommagetrennte IDs)"
-msgstr "Lá»±a chá»n sáº£n pháº©m (ngÄn cÃ¡ch mÃ£ SP báº±ng dáº¥u pháº©y)"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:19
-msgid "Keine Produktgruppen angelegt."
-msgstr "ChÆ°a cÃ³ nhÃ³m sáº£n pháº©m nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:26 
-#: ../views/mods/mod_productindex/page_metabox.phtml:28 
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "Kategorien"
-msgstr "CÃ¡c má»¥c"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:26
-msgid "Keine Kategorien angelegt."
-msgstr "ChÆ°a cÃ³ má»¥c nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:32
-msgid "Pro Seite"
-msgstr "má»i trang"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:33
-msgid "Sortierungsauswahl ausblenden"
-msgstr "áºšn lá»±a chá»n phÃ¢n loáº¡i"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:34
-msgid "Ansichtenwechsel ausblenden"
-msgstr "áºšn lá»±a chá»n xem"
-
-# @ wpsg
-#: ../views/mods/mod_productindex/page_metabox.phtml:40
-msgid "Standardsortierung"
-msgstr "PhÃ¢n loáº¡i máº·c Äá»nh"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/list.phtml:9
-msgid "Bisher keine Versandarten angelegt."
-msgstr "ChÆ°a cÃ³ phÆ°Æ¡ng thá»©c thanh toÃ¡n nÃ o ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/list.phtml:22
-msgid "Versandart lÃ¶schen"
-msgstr "XoÃ¡ phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/list.phtml:152
-msgid "Grundlage"
-msgstr "CÆ¡ sá»"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/list.phtml:164 
-#: ../mods/wpsg_mod_versandarten.class.php:16 
-#: ../mods/wpsg_mod_versandarten.class.php:37
-msgid "Alle Versandzonen"
-msgstr "Táº¥t cáº£ cÃ¡c vÃ¹ng giao hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/list.phtml:172
-msgid "KostenschlÃŒssel"
-msgstr "ChÃ¬a khoÃ¡ chi phÃ­"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:9
-msgid ""
-"Mit diesem Modul ist es mÃ¶glich beliebig viele Lieferanten zu konfigurieren."
-msgstr "Module nÃ y cho phÃ©p báº¡n thay Äá»i nhiá»u nhÃ  cung cáº¥p."
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:10
-msgid ""
-"Unter Lieferanten verstehen wir den Dienstleister, der die Ware zu dem "
-"Kunden bringt und dafÃŒr die Versandkosten berechnet."
-msgstr ""
-"NhÃ  váº­n chuyá»n ÄÆ°á»£c hiá»u lÃ  cÃ¡c nhÃ  cung cáº¥p dá»ch vá»¥ mang hÃ ng hoÃ¡ Äáº¿n cho "
-"khÃ¡ch hÃ ng vÃ  do ÄÃ³ thu phÃ­ dá»ch vá»¥."
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:11
-msgid "Wird ein Wert angegeben, so wird dieser Wert als Pauschale verwendet."
-msgstr ""
-"Náº¿u cÃ³ má»t giÃ¡ trá» ÄÆ°á»£c cho, giÃ¡ trá» nÃ y sáºœ ÄÆ°á»£c sá»­ dá»¥ng nhÆ° \"Pauschale\""
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:14
-msgid ""
-"Sollen die Kosten nach Bestellwert, StÃŒckzahl oder Gewicht (Wenn Modul "
-"Produktgewicht aktiviert) gestaffelt werden so gilt folgendes Format:15:15,"
-"00|10:10,00|5,00. Es ist auch mÃ¶glich nur einen Wert anzugeben (Bsp. 5,00), "
-"so wird generell dieser Wert fÃŒr diese Versandart berechnet."
-msgstr ""
-"Náº¿u chi phÃ­ ÄÆ°á»£c phÃ¢n loáº¡i theo giÃ¡ trá» Äáº·t hÃ ng, sá» lÆ°á»£ng vÃ  khá»i lÆ°á»£ng "
-"(Khi module Khá»i lÆ°á»£ng ÄÆ°á»£c kÃ­ch hoáº¡t), Äá»nh dáº¡ng 15:15,00|10:10,00|5,00 sáºœ "
-"ÄÆ°á»£c sá»­ dá»¥ng. CÅ©ng cÃ³ thá» chá» cÃ³ má»t giÃ¡ trá» ÄÆ°á»£c ÄÆ°a ra (VÃ­ dá»¥: 5,00), khi "
-"ÄÃ³ giÃ¡ trá» nÃ y ÄÆ°á»£c tÃ­nh lÃ  má»t loáº¡i phÃ­ váº­n chuyá»n."
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:16
-msgid "ab 15 StÃŒck 15,00 EUR Versandkosten"
-msgstr "tá»« sáº£n pháº©m thá»© 15 chi phÃ­ váº­n chuyá»n lÃ  15,00 EUR"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:17
-msgid "ab 10 StÃŒck 10,00 EUR Versandkosten"
-msgstr "tá»« sáº£n pháº©m thá»© 10 chi phÃ­ váº­n chuyá»n lÃ  10,00 EUR"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:18
-msgid "bis 10 StÃŒck 5,00 EUR Versandkosten"
-msgstr "tÃ­nh Äáº¿n sáº£n pháº©m thá»© 10 chi phÃ­ váº­n chuyá»n lÃ  5,00 EUR"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:20
-msgid ""
-"Bietet man Beispielsweise den Versand als DHL Paket an, so kann man bei "
-"Bezeichnung \"DHL Paket\" eintragen und als Preis z.B. 6,90. Dieser Preis "
-"wird dann als Pauschale unabhÃ€ngig von StÃŒckzahl oder Gesamtgewicht "
-"verwendet."
-msgstr ""
-"Náº¿u dá»ch vá»¥ váº­n chuyá»n ÄÆ°á»£c cung cáº¥p, vÃ­ dá»¥ lÃ  BÆ°u kiá»n DHL, báº¡n cÃ³ thá» ghi "
-"thÃªm \"BÆ°u kiá»n DHL\" vÃ o má»¥c mÃŽ táº£ vÃ  giÃ¡ cho dá»ch vá»¥ nÃ y lÃ  6,90. GiÃ¡ nÃ y "
-"ÄÃ£ ÄÆ°á»£c cá» Äá»nh, khÃŽng phá»¥ thuá»c vÃ o sá» lÆ°á»£ng sáº£n pháº©m hoáº·c tá»ng trá»ng lÆ°á»£ng."
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:69
-msgid "Sind Sie sich sicher, dass sie die Versandart lÃ¶schen mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muÃ³n xoÃ¡ phÆ°Æ¡ng thá»©c váº­n chuyá»n nÃ y?"
-
-# @ wpsg
-#: ../views/mods/mod_versandarten/settings_edit.phtml:92
-msgid "Neue Versandart anlegen"
-msgstr "ThÃªm phÆ°Æ¡ng thá»©c váº­n chuyá»n má»i"
-
-# @ wpsg
-#: ../views/mods/mod_stock/settings_edit.phtml:10
-msgid "Template fÃŒr ausverkaufte Produkte"
-msgstr "Máº«u cho sáº£n pháº©m bÃ¡n háº¿t hÃ ng"
-
-# @ wpsg
-#: ../views/mods/mod_stock/settings_edit.phtml:18
-msgid "Wie Produkttemplate"
-msgstr "Giá»ng tá»p máº«u sáº£n pháº©m"
-
-# @ wpsg
-#: ../views/mods/mod_freeshipping/settings_edit.phtml:10
-msgid "Mindestbestellwert"
-msgstr "GiÃ¡ trá» Äáº·t hÃ ng tháº¥p nháº¥t"
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:13
-msgid "Artikel fÃŒr"
-msgstr "Má»¥c cho"
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:13
-msgid "im Warenkorb"
-msgstr "trong giá» hÃ ng cá»§a báº¡n"
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:66
-msgid "Gesamt"
-msgstr "Tá»ng"
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:76
-msgid "Alle Preise zzgl. "
-msgstr "Táº¥t cáº£ giÃ¡ cá»ng vá»i"
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:78
-msgid "Alle Preise inklusive MwSt. und zzgl."
-msgstr "Táº¥t cáº£ giÃ¡ bao gá»m thuáº¿ vÃ  "
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:81 ../views/warenkorb/ajaxDialog.phtml:121
-msgid "Zum Warenkorb"
-msgstr "Äáº¿n giá» hÃ ng"
-
-# @ wpsg
-#: ../views/warenkorb/index.phtml:84
-msgid "Keine Artikel im Warenkorb"
-msgstr "KhÃŽng cÃ³ sáº£n pháº©m nÃ o trong giá» hÃ ng"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:19
-msgid "Zusammenfassung"
-msgstr "TÃ³m táº¯t"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:28
-msgid ""
-"Ich habe die #1# des Anbieters gelesen und erklÃ€re mit dem Absenden der "
-"Bestellung mein EinverstÃ€ndnis. Die #2# habe ich zur Kenntnis genommen."
-msgstr ""
-"TÃŽi ÄÃ£ Äá»c #1# cá»§a nhÃ  cung cáº¥p vÃ  cháº¥p nháº­n Äiá»u khoáº£n ÄÃ³ khi gá»­i ÄÆ¡n hÃ ng "
-"Äi. TÃŽi Äá»ng Ãœ vá»i #2#."
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:40
-msgid "Zahlung/Versand"
-msgstr "Thanh toÃ¡n/Váº­n chuyá»n"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:41 ../views/warenkorb/overview.phtml:50 
-#: ../views/warenkorb/overview.phtml:66 ../views/warenkorb/overview.phtml:84 
-#: ../views/warenkorb/overview.phtml:105 ../views/warenkorb/overview.phtml:288
-msgid "[<a href=\"#1#\">Ãndern</a>]"
-msgstr "[<a href=\"#1#\">Edit</a>]"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:49
-msgid "Rechnungsanschrift"
-msgstr "Äá»a chá» hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:65
-msgid "Lieferanschrift"
-msgstr "Äá»a chá» váº­n chuyá»n"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:83
-msgid "Liefer- und Rechnungsanschrift"
-msgstr "Äá»a chá» váº­n chuyá»n vÃ  gá»­i hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:196
-msgid "<a href=\"#1#\">Versandkosten</a> (#2#)"
-msgstr "<a href=\"#1#\">Shipping costs</a> (#2#)"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:218
-msgid "Zahlungsart (#1#)"
-msgstr "PhÆ°Æ¡ng thá»©c thanh toÃ¡n (#1#)"
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:280
-msgid ""
-"Sofern die Lieferung in das Nicht-EU-Ausland erfolgt, kÃ¶nnen weitere ZÃ¶lle, "
-"Steuern oder GebÃŒhren vom Kunden zu zahlen sein, jedoch nicht an den "
-"Anbieter, sondern an die dort zustÃ€ndigen Zoll- bzw. SteuerbehÃ¶rden. Dem "
-"Kunden wird empfohlen, die Einzelheiten vor der Bestellung bei den Zoll- bzw."
-" SteuerbehÃ¶rden zu erfragen."
-msgstr ""
-"Náº¿u sáº£n pháº©m ÄÆ°á»£c váº­n chuyá»n ra khá»i ChÃ¢u Ãu, khÃ¡ch hÃ ng cÃ³ thá» pháº£i tráº£ cÃ¡c "
-"khoáº£n thuáº¿ vÃ  phÃ­ khÃ¡c. Khoáº£n phÃ­ nÃ y khÃŽng ÄÆ°á»£c tráº£ cho bÃªn bÃ¡n, mÃ  ÄÆ°á»£c sá»­ "
-"dá»¥ng thanh toÃ¡n cho cÆ¡ quan thuáº¿ vÃ  háº£i quan. ChÃºng tÃŽi khuyáº¿n nghá» khÃ¡ch "
-"hÃ ng tÃ¬m hiá»u thÃŽng tin chi tiáº¿t hÆ¡n trÆ°á»c khi Äáº·t hÃ ng."
-
-# @ wpsg
-#: ../views/warenkorb/overview.phtml:305
-msgid "zahlungspflichtig bestellen"
-msgstr "Äáº­t hÃ ng ngay"
-
-# @ wpsg
-#: ../views/warenkorb/basket.phtml:43
-msgid "Produkt aus dem Warenkorb entfernen"
-msgstr "Huá»· bá» sáº£n pháº©m tá»« giá» hÃ ng"
-
-# @ wpsg
-#: ../views/warenkorb/basket.phtml:43
-msgid ""
-"Sind Sie sich sicher, dass sie das Produkt aus dem Warenkorb entfernen "
-"mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n huá»· sáº£n pháº©m trong giá» hÃ ng?"
-
-# @ wpsg
-#: ../views/warenkorb/basket.phtml:84
-msgid "Gutschein aus dem Warenkorb entfernen"
-msgstr "Huá»· bá» phiáº¿u mua hÃ ng tá»« giá» hÃ ng"
-
-# @ wpsg
-#: ../views/warenkorb/basket.phtml:84
-msgid ""
-"Sind Sie sich sicher, dass sie den Gutschein aus dem Warenkorb entfernen "
-"mÃ¶chten?"
-msgstr "Báº¡n cÃ³ cháº¯c cháº¯n muá»n huá»· bá» phiáº¿u mua hÃ ng nÃ y khá»i giá» hÃ ng?"
-
-# @ wpsg
-#: ../views/warenkorb/checkout2.phtml:39 ../views/warenkorb/checkout2.phtml:75
-msgid "GebÃŒhr"
-msgstr "PhÃ­"
-
-# @ wpsg
-#: ../views/warenkorb/checkout2.phtml:58 ../mods/wpsg_mod_su.class.php:2 
-#: ../mods/wpsg_mod_userpayment.class.php:2 
-#: ../mods/wpsg_mod_paypal.class.php:2 ../mods/wpsg_mod_prepayment.class.php:2 
-#: ../mods/wpsg_mod_autodebit.class.php:2 
-#: ../mods/wpsg_mod_invoice_type.class.php:2 
-#: ../mods/wpsg_mod_micropayment.class.php:2 
-#: ../mods/wpsg_mod_debitpayment.class.php:2
-msgid "Zahlungsarten"
-msgstr "CÃ¡c phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../views/warenkorb/messageDialog.phtml:15
-msgid "SchlieÃen"
-msgstr "ÄÃ³ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:2
-msgid "ErmÃ¶glicht verschiedene Produktvariationen."
-msgstr "Cho phÃ©p báº¡n sá»­ dá»¥ng nhiá»u káº¿t há»£p sáº£n pháº©m khÃ¡c nhau."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variante erfolgreich angelegt."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variante wurde erfolgreich gelÃ¶scht."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c xoÃ¡."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variante wurde erfolgreich aktiviert."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c kÃ­ch hoáº¡t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variante wurde erfolgreich deaktiviert."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c huá»· kÃ­ch hoáº¡t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variation wurde erfolgreich angelegt."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c táº¡o."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variation wurde erfolgreich gelÃ¶scht."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c xoÃ¡."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variation wurde erfolgreich aktiviert."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c kÃ­ch hoáº¡t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_varianten.class.php:4
-msgid "Variation wurde erfolgreich deaktiviert."
-msgstr "Thay Äá»i ÄÃ£ ÄÆ°á»£c huá»· kÃ­ch hoáº¡t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_legaltexts.class.php:2
-msgid ""
-"Die von Ihnen verwendete Version des ProtectedShops Plugin ist nicht "
-"ausreichend. Sie benÃ¶tigen mindestens Version 1.6!"
-msgstr ""
-"PhiÃªn báº£n Protected Shops cá»§a báº¡n hiá»n táº¡i khÃŽng ÄÆ°á»£c há» trá»£. Báº¡n cáº§n cÃ i "
-"Äáº·t báº£n 1.6 trá» lÃªn!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "SofortÃŒberweisung"
-msgstr "SofortBanking"
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "ErmÃ¶glicht die Zahlungsart SofortÃŒberweisung."
-msgstr "Cho phÃ©p thá»±c hiá»n phÆ°Æ¡ng thá»©c thanh toÃ¡n SofortBanking."
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid ""
-"Zahlen Sie die per SofortÃŒberweisung. Ihre Bank muss dieses Verfahren "
-"unterstÃŒtzen und sie benÃ¶tigen ihre PIN/TAN zur Zahlung."
-msgstr ""
-"Thanh toÃ¡n sá»­ dá»¥ng dá»ch vá»¥ SofortBanking. NgÃ¢n hÃ ng cá»§a báº¡n cáº§n há» trá»£ "
-"phÆ°Æ¡ng thá»©c nÃ y vÃ  báº¡n cáº§n mÃ£ PIN/TAN Äá» thá»±c hiá»n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "<!-- Die User ID bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- Báº¡n nháº­n mÃ£ ngÆ°á»i dÃ¹ng tá»« SofortBanking.com --!>"
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "<!-- Die Projekt ID bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- Báº¡n nháº­n mÃ£ dá»± Ã¡n tá»« SofortBanking.com --!>"
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid "<!-- Das Projektpasswort bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- Báº¡n nháº­n máº­t kháº©u dá»± Ã¡n tá»« SofortBanking.com --!>"
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2
-msgid ""
-"<!-- Das Benachrichtigungspasswort bekommen sie von SofortÃŒberweisung.de --!>"
-msgstr "<!-- Báº¡n nháº­n máº­t kháº©u dá»± Ã¡n tá»« SofortBanking.com --!>"
-
-# @ wpsg
-#: ../mods/wpsg_mod_su.class.php:2 ../mods/wpsg_mod_paypal.class.php:2 
-#: ../mods/wpsg_mod_micropayment.class.php:6
-msgid "Zahlungslink"
-msgstr "ÄÆ°á»ng dáº«n thanh toÃ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "ErmÃ¶glicht es Bilder zu Produkten anzugeben."
-msgstr "Cho phÃ©p táº£i hÃ¬nh cho sáº£n pháº©m."
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Bildercache gelÃ¶scht."
-msgstr "Bá» lÆ°u cache cho áº£nh ÄÃ£ ÄÆ°á»£c xoÃ¡."
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Fehler beim Upload! Datei existiert nicht."
-msgstr "Táº£i lÃªn khÃŽng thÃ nh cÃŽng! KhÃŽng tÃ¬m tháº¥y tá»p tin."
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Einpassen"
-msgstr "Cáº¯t vá»«a"
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Strecken"
-msgstr "KÃ©o"
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Zuschneiden"
-msgstr "Cáº¯t"
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktbilder.class.php:2
-msgid "Unbekanntes Dateiformat"
-msgstr "Äá»nh dáº¡ng khÃŽng xÃ¡c Äá»nh"
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid "Selbstabholung"
-msgstr "Äáº¿n Äiá»m nháº­n hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2 
-#: ../mods/wpsg_mod_shippingadress.class.php:1 
-#: ../mods/wpsg_mod_freeshipping.class.php:2 
-#: ../mods/wpsg_mod_versandarten.class.php:2
-msgid "Versand"
-msgstr "Giao hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid ""
-"ErmÃ¶glicht die Versandart \"Selbstabholung\" mit der Zahlweise \"Barzahlung "
-"bei Abholung\"."
-msgstr ""
-"Cho phÃ©p sá»­ dá»¥ng phÆ°Æ¡ng thá»©c giao nháº­n \"Äáº¿n láº¥y hÃ ng\" vÃ  thanh toÃ¡n \"Tiá»n "
-"máº·t\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid ""
-"Vereinbaren Sie mit uns nach der Bestellung einen Termin an dem Sie die Ware "
-"abholen."
-msgstr "Äáº·t lá»ch háº¹n vá»i chÃºng tÃŽi Äá» Äáº¿n láº¥y hÃ ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid "Barzahlung"
-msgstr "Tráº£ tiá»n khi Äáº¿n láº¥y hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid ""
-"Sie bezahlen die Ware bei Abholung. Ist nur mit der Versandart "
-"\"Selbstabholung\" mÃ¶glich."
-msgstr ""
-"Thanh toÃ¡n cho sáº£n pháº©m khi báº¡n Äáº¿n láº¥y hÃ ng. Chá» kháº£ dá»¥ng khi báº¡n chá»n "
-"phÆ°Æ¡ng thá»©c váº­n chuyá»n \"Tráº£ tiá»n máº·t khi Äáº¿n láº¥y hÃ ng\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid "Die Versandart \"#1#\" erfordert die Zahlungsart \"#2#\"."
-msgstr ""
-"PhÆ°Æ¡ng thá»©c váº­n chuyá»n \"#1#\" ÄÃ²i há»i Äi kÃšm phÆ°Æ¡ng thá»©c thanh toÃ¡n \"#2#\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_willcollect.class.php:2
-msgid "Die Zahlungsart \"#1#\" erfordert die Versandart \"#2#\"."
-msgstr ""
-"PhÆ°Æ¡ng thá»©c thanh toÃ¡n \"#1#\" ÄÃ²i há»i Äi kÃšm phÆ°Æ¡ng thá»©c váº­n chuyá»n \"#2#\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productindex.class.php:2
-msgid "ProduktÃŒbersichten"
-msgstr "LÆ°á»£ng xem sáº£n pháº©m"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productindex.class.php:2
-msgid "ErmÃ¶glicht die Darstellung von ProduktÃŒbersichtsseiten."
-msgstr "Cho phÃ©p báº¡n hiá»n thá» trang cho lÆ°á»£ng xem sáº£n pháº©m."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productindex.class.php:2
-msgid ""
-"Bitte geben sie eine gÃŒltige Auswahl von kommagetrennten ProduktIDs auf "
-"dieser Seite ein."
-msgstr ""
-"Vui lÃ²ng thÃªm lá»±a chá»n cÃ³ giÃ¡ trá» cho mÃ£ sáº£n pháº©m trong trang ngÃ y, sá»­ dá»¥ng "
-"dáº¥u pháº©y Äá» ngÄn cÃ¡ch."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productindex.class.php:2
-msgid ""
-"Bitte wÃ€hlen sie mindestens eine Produktgruppe zur Anzeige bei den "
-"Seiteneinstellungen dieser Seite aus."
-msgstr ""
-"Vui lÃ²ng chá»n Ã­t nháº¥t má»t nhÃ³m sáº£n pháº©m Äá» hiá»n thá» trÃªn trang cÃ i Äáº·t trang."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productindex.class.php:2
-msgid ""
-"Bitte wÃ€hlen sie mindestens eine Kategorie zur Anzeige bei den "
-"Seiteneinstellungen dieser Seite aus."
-msgstr "Vui lÃ²ng chá»n Ã­t nháº¥t má»t má»¥c Äá» hiá»n thá» trÃªn trang cÃ i Äáº·t trang."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productindex.class.php:23
-msgid "wpShopGermany ProduktÃŒbersicht"
-msgstr "Tá»ng quÃ¡t sáº£n pháº©m wpShopGermany "
-
-# @ wpsg
-#: ../mods/wpsg_mod_fuellmenge.class.php:2
-msgid "FÃŒllmengen"
-msgstr "Sá» lÆ°á»£ng má»i gÃ³i"
-
-# @ wpsg
-#: ../mods/wpsg_mod_fuellmenge.class.php:2
-msgid ""
-"Erlaubt das angeben der FÃŒllmenge und die Berechnung des Grundpreises. "
-"Notwendig bei FlÃ€chenprodukten, FlÃŒssigkeiten, o.Ã€. Produkten.<br />nÃ€here "
-"Details siehe <a href=\"http://www.gesetze-im-internet.de/pangv/index.html\" "
-"target=\"\">Preisangabenverordnung</a>."
-msgstr ""
-"Cho phÃ©p thá»±c hiá»n sá» lÆ°á»£ng má»i gÃ³i vÃ  tÃ­nh toÃ¡n giÃ¡ cÆ¡ sá». Cáº§n thiáº¿t cho "
-"sáº£n pháº©m theo tá», cÃ¡c sáº£n pháº©m cháº¥t lá»ng, v.v... <br />Chi tiáº¿t vui lÃ²ng xem "
-"<a href=\"http://www.gesetze-im-internet.de/pangv/index.html\" target=\"\">"
-"here</a>."
-
-# @ wpsg
-#: ../mods/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php:2
-msgid "wpShopGermany Login"
-msgstr "ÄÄng nháº­p wpShopGermany"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:2
-msgid "ErmÃ¶glicht die Zuordnung von Produkten zu Produktgruppen."
-msgstr "Cho phÃ©p chá» Äá»nh sáº£n pháº©m vÃ o cÃ¡c nhÃ³m sáº£n pháº©m."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:20 
-#: ../mods/wpsg_mod_productgroups.class.php:127
-msgid "Nicht zugeordnet"
-msgstr "KhÃŽng ÄÆ°á»£c chá» Äá»nh"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:46
-msgid "Nicht zugewiesen."
-msgstr "KhÃŽng ÄÆ°á»£c chá» Äá»nh."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:127
-msgid "Produktgruppe wurde erfolgreich gelÃ¶scht."
-msgstr "NhÃ³m sáº£n pháº©m ÄÃ£ ÄÆ°á»£c xoÃ¡ thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:127
-msgid "Produktgruppe erfolgreich gespeichert."
-msgstr "NhÃ³m sáº£n pháº©m ÄÃ£ ÄÆ°á»£c lÆ°u thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:127
-msgid "Produktgruppe erfolgreich angelegt."
-msgstr "NhÃ³m sáº£n pháº©m ÄÃ£ ÄÆ°á»£c táº¡o thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:127
-msgid "Individuelle Produkttemplates"
-msgstr "Máº«u sáº£n pháº©m tuá»³ biáº¿n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:127 
-#: ../mods/wpsg_mod_stock.class.php:28
-msgid "Menge ÃŒberschreitet Warenbestand!"
-msgstr "Sá» lÆ°á»£ng vÆ°á»£t quÃ¡ hÃ ng trong kho!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productgroups.class.php:127
-msgid "Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet!"
-msgstr "Sá» lÆ°á»£ng sáº£n pháº©m ÄÆ°á»£c cáº¯t giáº£m do vÆ°á»£t quÃ¡ sá» lÆ°á»£ng hÃ ng trong kho!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_userpayment.class.php:2
-msgid "Erlaubt das anlegen von benutzerdefinierten Zahlungsarten."
-msgstr "Cho phÃ©p báº¡n táº¡o cÃ¡c phÆ°Æ¡ng phÃ¡p thanh toÃ¡n tuá»³ biáº¿n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_userpayment.class.php:11
-msgid "Anklicken um den Namen der Zahlvariante zu Ã€ndern ..."
-msgstr "Nháº¥p Äá» thay Äá»i tÃªn phÆ°Æ¡ng thá»©c thanh toÃ¡nâŠ"
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "PayPal"
-msgstr "PayPal"
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "ErmÃ¶glicht die Zahlungsart PayPal."
-msgstr "Cho phÃ©p thanh toÃ¡n qua Paypal."
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "Zahlen Sie die Bestellung mittels ihres PayPal Kontos."
-msgstr "Thanh toÃ¡n ÄÆ¡n hÃ ng qua Paypal."
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "Erfolgreiche PayPal Zahlung"
-msgstr "Thanh toÃ¡n qua Paypal thÃ nh cÃŽng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "Fehlgeschlagene PayPal Zahlung"
-msgstr "Thanh toÃ¡n qua Paypal tháº¥t báº¡i"
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "PayPal VERIFIED"
-msgstr "Paypal XÃC NHáº¬N"
-
-# @ wpsg
-#: ../mods/wpsg_mod_paypal.class.php:2
-msgid "PayPal FAILED"
-msgstr "Paypal THáº€T Báº I"
-
-# @ wpsg
-#: ../mods/wpsg_mod_prepayment.class.php:2
-msgid "Vorkasse"
-msgstr "Tráº£ trÆ°á»c"
-
-# @ wpsg
-#: ../mods/wpsg_mod_prepayment.class.php:2
-msgid "ErmÃ¶glicht die Zahlungsart Vorkasse."
-msgstr "Cho phÃ©p phÆ°Æ¡ng thá»©c thanh toÃ¡n tráº£ trÆ°á»c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_prepayment.class.php:2
-msgid ""
-"Zahlen Sie die Bestellung mittels Ãberweisung. Der Betreff wird ihnen in der "
-"BestellbestÃ€tigung mitgeteilt."
-msgstr ""
-"Thanh toÃ¡n ÄÆ¡n hÃ ng báº±ng Chuyá»n khoáº£n. XÃ¡c nháº­n chuyá»n khoáº£n sáºœ ÄÆ°á»£c gá»­i kÃšm "
-"cÃ¹ng XÃ¡c nháº­n ÄÆ¡n hÃ ng. "
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:2
-msgid "ErmÃ¶glicht das Erfassen von Kundeneingaben zu Bestellungen."
-msgstr "Cho phÃ©p thu tháº­p thÃŽng tin nháº­p tá»« khÃ¡ch hÃ ng cho ÄÆ¡n hÃ ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:2 
-#: ../mods/wpsg_mod_productvars.class.php:2
-msgid "Texteingabe"
-msgstr "Nháº­p vÄn báº£n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:11
-msgid "Anklicken um den Namen der Bestellvariablen zu Ã€ndern ..."
-msgstr "Nháº¥p Äá» thay Äá»i tÃªn cá»§a biáº¿n sá» ÄÆ¡n hÃ ngâŠ"
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:11 
-#: ../mods/wpsg_mod_productvars.class.php:10
-msgid "Bitte zum Bearbeiten anklicken."
-msgstr "Nháº¥p Äá» chá»nh sá»­a."
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:11
-msgid "Bitte treffen Sie im Feld #1# eine Auswahl."
-msgstr "Vui lÃ²ng chá»n má»t giÃ¡ trá» cho vÃ¹ng #1#."
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:11
-msgid "Bitte tragen Sie in das Feld #1# einen Wert ein."
-msgstr "Vui lÃ²ng nháº­p má»t giÃ¡ trá» cho vÃ¹ng #1#."
-
-# @ wpsg
-#: ../mods/wpsg_mod_ordervars.class.php:11
-msgid "Bitte aktivieren Sie das Feld #1#."
-msgstr "Vui lÃ²ng kÃ­ch hoáº¡t vÃ¹ng #1#."
-
-# @ wpsg
-#: ../mods/wpsg_mod_discount.class.php:2
-msgid ""
-"Ist dieses Modul aktiv, so lassen sich Rabatte abhÃ€ngig vom Bestellwert "
-"vergeben. Der Bestellwert ist der Artikelpreis + Kosten fÃŒr Versandkosten "
-"etc."
-msgstr ""
-"Náº¿u ÄÆ°á»£c kÃ­ch hoáº¡t, Module nÃ y sáºœ cho phÃ©p báº¡n xÃ¡c Äá»nh chiáº¿t kháº¥u dá»±a trÃªn "
-"giÃ¡ trá» ÄÆ¡n hÃ ng. GiÃ¡ trá» ÄÆ¡n hÃ ng ÄÆ°á»£c tÃ­nh nhÆ° sau: GiÃ¡ sáº£n pháº©m + Chi phÃ­ "
-"váº­n chuyá»n v.v.."
-
-# @ wpsg
-#: ../mods/wpsg_mod_discount.class.php:6
-msgid "Bitte einen gÃŒltigen Bestellwert und einen Rabatt eingeben!"
-msgstr "Vui lÃ²ng nháº­p giÃ¡ trá» ÄÆ¡n hÃ ng vÃ  chiáº¿t kháº¥u!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:2
-msgid ""
-"Erlaubt es in der Bestellverwaltung dem Kunden eine AuftragsbestÃ€tigung zu "
-"senden."
-msgstr ""
-"Cho phÃ©p gá»­i xÃ¡c nháº­n ÄÆ¡n hÃ ng tá»i khÃ¡ch hÃ ng tá»« Danh má»¥c Quáº£n lÃœ ÄÆ¡n hÃ ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:2
-msgid "Ihre AuftragsbestÃ€tigung"
-msgstr "XÃ¡c nháº­n ÄÆ¡n hÃ ng cá»§a báº¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:2
-msgid "E-Mail AuftragsbestÃ€tigung (Kunde)"
-msgstr "ThÆ° xÃ¡c nháº­n ÄÆ¡n hÃ ng (khÃ¡ch hÃ ng)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:2
-msgid ""
-"Diese Mail bekommt der Kunde wenn eine AuftragsbestÃ€tigung versand wird."
-msgstr "ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n khÃ¡ch hÃ ng Äá» xÃ¡c nháº­n ÄÆ¡n hÃ ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_auftragsbestaetigung.class.php:21
-msgid "AuftragsbestÃ€tigung wurde versendet."
-msgstr "XÃ¡c nháº­n ÄÆ¡n hÃ ng ÄÃ£ ÄÆ°á»£c gá»­i."
-
-# @ wpsg
-#: ../mods/wpsg_mod_stock.class.php:2
-msgid "Erlaubt die Verwaltung des Lagerbestandes bei den Produkten."
-msgstr "Cho phÃ©p quáº£n lÃœ hÃ ng tá»n kho."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:2 
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Gutscheine"
-msgstr "CÃ¡c phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:2
-msgid "Erlaubt das Erstellen von Gutscheinen."
-msgstr "Cho phÃ©p táº¡o phiáº¿u mua hÃ ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Bitte eine CSV Datei angeben!"
-msgstr "Vui lÃ²ng chá»n tá»p CSV!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "CSV Datei konnte nicht geladen werden!"
-msgstr "Tá»p CSV khÃŽng thá» táº£i ÄÆ°á»£c!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "CSV Datei ungÃŒltig. (Spalte \"#1#\" muss vorhanden sein)"
-msgstr "Tá»p CSV khÃŽng kháº£ dá»¥ng (khÃŽng cÃ³ cá»t \"#1#\")"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid ""
-"Spalte \"#1#\" in Zeile #2# enthÃ€lt kein gÃŒltiges Datum -> Zeile wurde "
-"ÃŒbersprungen"
-msgstr ""
-"Cá»t \"#1#\" trong dÃ²ng #2# khÃŽng bao gá»m ngÃ y hiá»u lá»±c. DÃ²ng nÃ y sáºœ bá» bá» "
-"qua. "
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid ""
-"UngÃŒltiger Gutscheincode in Zeile #1# (zu Kurz) -> Zeile wurde ÃŒbersprungen"
-msgstr ""
-"MÃ£ phiáº¿u mua hÃ ng khÃŽng cÃ³ giÃ¡ trá» trong dÃ²ng #1# (quÃ¡ ngáº¯n). DÃ²ng nÃ y sáºœ bá» "
-"bá» qua."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid ""
-"UngÃŒltiger Gutscheinwert in Zeile #1# (kleiner gleich 0) -> Zeile wurde "
-"ÃŒbersprungen"
-msgstr ""
-"GiÃ¡ trá» phiáº¿u mua hÃ ng khÃŽng cÃ³ giÃ¡ trá» trong dÃ²ng #1# (nhá» hÆ¡n hoáº·c báº±ng 0)."
-" DÃ²ng nÃ y sáºœ bá» bá» qua."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Code aus Zeile #1# existierte schon und wurde ÃŒberschrieben."
-msgstr "MÃ£ tá»« dÃ²ng #1# ÄÃ£ tá»n táº¡i vÃ  sáºœ ÄÆ°á»£c viáº¿t ÄÃš lÃªn."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Code (#1#) aus Zeile #2# existiert schon -> Zeile wurde ÃŒbersprungen."
-msgstr "MÃ£ (#1#) tá»« dÃ²ng #2# ÄÃ£ tá»n táº¡i. DÃ²ng nÃ y sáºœ bá» bá» qua-"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Ein Gutschein erfolgreich importiert."
-msgstr "Má»t phiáº¿u mua hÃ ng ÄÃ£ ÄÆ°á»£c nháº­p thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "#1# Gutscheine erfolgreich importiert."
-msgstr "#1# phiáº¿u mua hÃ ng ÄÃ£ ÄÆ°á»£c nháº­p thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Keine Gutscheine importiert."
-msgstr "ChÆ°a cÃ³ phiáº¿u mua hÃ ng nÃ o ÄÆ°á»£c nháº­p."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Eingabe im Feld \"Menge\" ist ungÃŒltig."
-msgstr "GiÃ¡ trá» nháº­p cho \"Sá» lÆ°á»£ng\" khÃŽng hiá»u lá»±c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Eingabe im Feld \"GÃŒltig ab\" ÃŒberprÃŒfen."
-msgstr "GiÃ¡ trá» nháº­p cho \"Hiá»u lá»±c tá»« ngÃ y\" khÃŽng hiá»u lá»±c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Eingabe im Feld \"GÃŒltig bis\" ÃŒberprÃŒfen."
-msgstr "GiÃ¡ trá» nháº­p cho \"Hiá»u lá»±c Äáº¿n ngÃ y\" khÃŽng hiá»u lá»±c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Eingabe im Feld \"Wert\" ÃŒberprÃŒfen."
-msgstr "GiÃ¡ trá» nháº­p cho \"GiÃ¡ trá»\" khÃŽng hiá»u lá»±c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Gutscheine wurden erfolgreich angelegt."
-msgstr "ÄÃ£ táº¡o cÃ¡c phiáº¿u mua hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:23
-msgid "Gutschein wurde erfolgreich angelegt."
-msgstr "ÄÃ£ táº¡o phiáº¿u mua hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:25
-msgid "Gutscheine erfolgreich gelÃ¶scht."
-msgstr "ÄÃ£ xoÃ¡ cÃ¡c phiáº¿u mua hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:35
-msgid "Wartend"
-msgstr "Chá»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:35
-msgid "Ausgelaufen"
-msgstr "QuÃ¡ háº¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:35
-msgid "UngÃŒltig"
-msgstr "KhÃŽng giÃ¡ trá»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_gutschein.class.php:35
-msgid "Verbraucht"
-msgstr "ÄÃ£ ÄÆ°á»£c sá»­ dá»¥ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "PasswortÃ€nderungsanfrage"
-msgstr "Äá» nghá» thay Äá»i máº­t kháº©u"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Ihr Neues Passwort"
-msgstr "Máº­t kháº©u má»i cá»§a báº¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Alle Kunden wurden auf Aktiv gesetzt."
-msgstr "Táº¥t cáº£ khÃ¡ch hÃ ng ÄÆ°á»£c Äáº·t á» tráº¡ng thÃ¡i hoáº¡t Äá»ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Alle Kunden wurden auf Inaktiv gesetzt."
-msgstr "Táº¥t cáº£ khÃ¡ch hÃ ng ÄÆ°á»£c Äáº·t á» tráº¡ng thÃ¡i khÃŽng hoáº¡t Äá»ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Profil"
-msgstr "Há» sÆ¡"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Registrierung"
-msgstr "KÃ­ch hoáº¡t"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Bitte ein Passwort festlegen!"
-msgstr "Vui lÃ²ng nháº­p máº­t kháº©u."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:7
-msgid "Bitte Passwort Wiederholung prÃŒfen!"
-msgstr "Vui lÃ²ng kiá»m tra xÃ¡c minh máº­t kháº©u."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid ""
-"Ein Kunde mit dieser E-Mail Adresse existiert bereits, bitte loggen Sie sich "
-"ein oder fordern Sie ein neues Passwort an!"
-msgstr ""
-"ÄÃ£ cÃ³ khÃ¡ch hÃ ng sá»­ dá»¥ng Äá»a chá» thÆ° nÃ y. Vui lÃ²ng ÄÄng nháº­p hoáº·c sá»­ dá»¥ng "
-"máº­t kháº©u má»i."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid ""
-"Ein Kunde mit dieser E-Mail Adresse existiert schon, die E-Mail wurde "
-"zurÃŒckgesetzt!"
-msgstr "Äá»a chá» email nÃ y ÄÃ£ ÄÆ°á»£c sá»­ dá»¥ng, email ÄÃ£ ÄÆ°á»£c Äáº·t láº¡i."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "Bitte die Passworteingaben ÃŒberprÃŒfen."
-msgstr "Vui lÃ²ng kiá»m tra máº­t kháº©u ÄÃ£ nháº­p."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "Eine Registrierung ohne Passwort ist nicht mÃ¶glich."
-msgstr "KhÃŽng thá» ÄÄng kÃœ khÃŽng cÃ³ máº­t kháº©u."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "E-Mail bei vergessenem Passwort (Anfrage)"
-msgstr "ThÆ° dÃ nh trÆ°á»ng há»£p quÃªn máº­t kháº©u (Äá» nghá»)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid ""
-"Diese Mail bekommt der Kunde wenn er sein Passwort vergessen hat und ein "
-"neues anfordert."
-msgstr ""
-"ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n khÃ¡ch hÃ ng náº¿u khÃ¡ch hÃ ng yÃªu cáº§u máº­t kháº©u má»i do máº¥t "
-"máº­t kháº©u cÅ©."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "E-Mail bei vergessenem Passwort (Neues Passwort)"
-msgstr "ThÆ° dÃ nh trÆ°á»ng há»£p quÃªn máº­t kháº©u (Máº­t kháº©u má»i)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "Mit dieser E-Mail erhÃ€lt der Kunde sein neues Passwort."
-msgstr "ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n khÃ¡ch hÃ ng vÃ  cÃ³ chá»©a máº­t kháº©u má»i."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "E-Mail bei Registrierung (Kundenverwaltung)"
-msgstr "ThÆ° ÄÄng kÃœ (quáº£n lÃœ khÃ¡ch hÃ ng)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid ""
-"Mit dieser E-Mail erhÃ€lt der Kunde eine Mail mit seinen registrierten Daten."
-msgstr "KhÃ¡ch hÃ ng nháº­n ÄÆ°á»£c dá»¯ liá»u ÄÄng kÃœ qua thÆ° nÃ y."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "E-Mail bei StatusÃ€nderung im Kunden- Account"
-msgstr "ThÆ° vá» thay Äá»i tráº¡ng thÃ¡i cho tÃ i khoáº£n khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid ""
-"Mit dieser E-Mail erhÃ€lt der Kunde ein Info nach Ãnderung seines Accounts."
-msgstr "KhÃ¡ch hÃ ng nháº­n ÄÆ°á»£c thÃŽng tin thay Äá»i tÃ i khoáº£n qua thÆ° nÃ y."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:16
-msgid "Bitte eine E-Mail Adresse und ein Passwort angeben!"
-msgstr "Vui lÃ²ng nháº­p Äá»a chá» email vÃ  máº­t kháº©u!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Sie wurden erfolgreich angemeldet."
-msgstr "Báº¡n ÄÃ£ ÄÄng nháº­p thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Es wurde kein Kunde mit diesen Zugangsdaten gefunden!"
-msgstr "KhÃŽng cÃ³ khÃ¡ch hÃ ng nÃ o vá»i thÃŽng tin ÄÄng nháº­p nÃ y."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Ihnen wurde eine neues Passwort zugesendet."
-msgstr "Máº­t kháº©u má»i ÄÃ£ ÄÆ°á»£c gá»­i tá»i báº¡n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "UngÃŒltige Anfrage"
-msgstr "YÃªu cáº§u khÃŽng cÃ³ giÃ¡ trá»."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Bitte eine E-Mail Adresse angeben!"
-msgstr "Vui lÃ²ng cung cáº¥p má»t Äá»a chá» email cÃ³ hiá»u lá»±c!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid ""
-"Ein Link zur Generierung eines neuen Passwortes wurde Ihnen zugesendet. "
-"ÃberprÃŒfen Sie bitte Ihr Postfach."
-msgstr ""
-"ÄÆ°á»ng dáº«n táº¡o máº­t kháº©u má»i ÄÃ£ ÄÆ°á»£c gá»­i. Vui lÃ²ng kiá»m tra hÃ²m thÆ° cá»§a báº¡n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Kein Benutzer mit dieser E-Mail Adresse gefunden!"
-msgstr "KhÃŽng tÃ¬m tháº¥y ngÆ°á»i dÃ¹ng nÃ o cÃ³ Äá»a chá» email nÃ y!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Ihr Profil wurde erfolgreich angelegt."
-msgstr "Há» sÆ¡ cá»§a báº¡n ÄÃ£ ÄÆ°á»£c táº¡o thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:24
-msgid "Profil erfolgreich gespeichert."
-msgstr "Há» sÆ¡ ÄÃ£ ÄÆ°á»£c lÆ°u thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:53
-msgid "#1# Kunden wurden importiert."
-msgstr "#1# khÃ¡ch hÃ ng ÄÃ£ ÄÆ°á»£c nháº­p."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:74
-msgid "Kunde erfolgreich gelÃ¶scht."
-msgstr "ÄÃ£ xoÃ¡ khÃ¡ch hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:74
-msgid "Passwort wurde erfolgreich geÃ€ndert."
-msgstr "Máº­t kháº©u ÄÃ£ ÄÆ°á»£c thay Äá»i."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:74
-msgid ""
-"Passwort wurde nicht geÃ€ndert, da die Wiederholung nicht ÃŒbereinstimmte."
-msgstr ""
-"KhÃŽng thá» thay Äá»i máº­t kháº©u do hai máº­t kháº©u ÄÆ°á»£c nháº­p khÃŽng giá»ng nhau."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenverwaltung.class.php:74
-msgid "Kunde wurde erfolgreich gespeichert."
-msgstr "ÄÃ£ lÆ°u khÃ¡ch hÃ ng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_relatedproducts.class.php:2
-msgid ""
-"ErmÃ¶glicht es zu einem Produkt weitere Produkte als ZubehÃ¶r etc. anzugeben "
-"und darzustellen."
-msgstr "Cho phÃ©p báº¡n xÃ¡c Äá»nh cÃ¡c sáº£n pháº©m liÃªn quan Äáº¿n sáº£n pháº©m cá»§a báº¡n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_autodebit.class.php:2
-msgid "Bankeinzug"
-msgstr "Ghi ná»£ trá»±c tiáº¿p qua tÃ i khoáº£n ngÃ¢n hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_autodebit.class.php:2
-msgid "ErmÃ¶glicht die Zahlungsart Bankeinzug."
-msgstr "Cho phÃ©p phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_autodebit.class.php:9
-msgid ""
-"WÃ€hlen Sie diese Zahlungsart wenn sie uns eine EinzugsermÃ€chtigung fÃŒr ihr "
-"Konto erteilen mÃ¶chten. Wir benÃ¶tigen dazu folgende Angaben:"
-msgstr ""
-"Chá»n phÆ°Æ¡ng thá»©c thanh toÃ¡n nÃ y náº¿u báº¡n muá»n cho phÃ©p chÃºng tÃŽi ghi ná»£ trá»±c "
-"tiáº¿p vÃ o tÃ i khoáº£n ngÃ¢n hÃ ng cá»§a báº¡n cho ÄÆ¡n Äáº·t hÃ ng. ChÃºng tÃŽi cáº§n cÃ¡c "
-"thÃŽng tin sau:"
-
-# @ wpsg
-#: ../mods/wpsg_mod_autodebit.class.php:20
-msgid "Bitte den Namen der Bank kontrollieren (Bankeinzug)"
-msgstr "Vui lÃ²ng kiá»m tra láº¡i tÃªn ngÃ¢n hÃ ng (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_autodebit.class.php:20
-msgid "Bitte den Inhaber des Kontos kontrollieren (Bankeinzug)"
-msgstr "Vui lÃ²ng kiá»m tra láº¡i tÃªn chá»§ tÃ i khoáº£n (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_autodebit.class.php:20
-msgid "Bitte die BLZ der Bank kontrollieren (Bankeinzug)"
-msgstr "Vui lÃ²ng kiá»m tra láº¡i mÃ£ ngÃ¢n hÃ ng (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid ""
-"nohspc_Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. "
-"Eine Registrierung Ihrer Domain ist somit nicht mÃ¶glich! <br />Weitere "
-"Informationen finden Sie in unseren <a target=\"_blank\" href=\"http:"
-"//wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-"
-"meinem-server-aktiviert-sind/\">FAQ</a>."
-msgstr ""
-"nohspc_Server cá»§a báº¡n khÃŽng cÃ³ thÆ° viá»n PHP cho há» trá»£ SOAP. ÄÄng kÃœ miá»n "
-"cá»§a báº¡n khÃŽng kháº£ dá»¥ng! <br /> Xem thÃªm thÃŽng tin táº¡i <a target=\"_blank\" "
-"href=\"http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-"
-"curl-auf-meinem-server-aktiviert-sind/\">FAQ</a>."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Keine Registrierungsdaten gefunden."
-msgstr "KhÃŽng tÃ¬m tháº¥y dá»¯ liá»u ÄÄng kÃœ"
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Fehler im Registrierungsserver: #1#"
-msgstr "Lá»i khi ÄÄng kÃœ: #1#"
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Domainregistrierung erfolgreich entfernt."
-msgstr "Huá»· bá» cÃ i Äáº·t miá»n thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Domainregistrierung erfolgreich."
-msgstr "CÃ i Äáº·t miá»n thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Modul erfolgreich installiert."
-msgstr "CÃ i Äáº·t Module thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Modul konnte nicht aktiviert werden."
-msgstr "KhÃŽng kÃ­ch hoáº¡t ÄÆ°á»£c Module."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "UngÃŒltiger Modulcode."
-msgstr "MÃ£ Module khÃŽng cÃ³ giÃ¡ trá»."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Code bereits fÃŒr einen anderen SchlÃŒssel verwendet."
-msgstr "MÃ£ ÄÃ£ ÄÆ°á»£c sá»­ dá»¥ng cho khoÃ¡ khÃ¡c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Modul bereits aktiviert."
-msgstr "Module ÄÃ£ ÄÆ°á»£c kÃ­ch hoáº¡t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Modul erfolgreich aktiviert."
-msgstr "Module ÄÆ°á»£c kÃ­ch hoáº¡t thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Registrierungsdaten erfolgreich ÃŒbermittelt"
-msgstr "ÄÃ£ ná»p thÃŽng tin ÄÄng kÃœ thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Modul (#1#) konnte nicht kopiert werden!"
-msgstr "KhÃŽng thá» sao chÃ©p Module (#1#)!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Fehler beim Entpacken: #1#"
-msgstr "Lá»i khi giáº£i nÃ©n: #1#"
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Datei konnte nicht ÃŒbertragen werden."
-msgstr "Tá»p tin khÃŽng thá» ÄÆ°á»£c chuyá»n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_core.class.php:2
-msgid "Datei konnte nicht entpackt werden."
-msgstr "Giáº£i nÃ©n tá»p tin khÃŽng thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_invoice_type.class.php:2 
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Rechnung"
-msgstr "HoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_invoice_type.class.php:2
-msgid "ErmÃ¶glicht die Zahlungsart Rechnung."
-msgstr "Cho phÃ©p phÆ°Æ¡ng phÃ¡p thanh toÃ¡n \"HoÃ¡ ÄÆ¡n\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_shippingadress.class.php:1
-msgid "Bitte ÃŒberprÃŒfen Sie die Eingaben bei der Lieferadresse."
-msgstr "Vui lÃ²ng thÃªm thÃŽng tin cho Äá»a chá» giao nháº­n."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productvars.class.php:2
-msgid "ErmÃ¶glicht das Erfassen von Kundeneingaben zu bestellten Produkten."
-msgstr "Cho phÃ©p thu tháº­p thÃŽng tin khÃ¡ch hÃ ng cho sáº£n pháº©m ÄÃ£ Äáº·t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_productvars.class.php:10
-msgid "Anklicken um den Namen der Produktvariable zu Ã€ndern ..."
-msgstr "Nháº¥p Äá» thay Äá»i tÃªn biáº¿n sá» sáº£n pháº©mâŠ"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productvars.class.php:10 
-#: ../mods/wpsg_mod_productvars.class.php:17
-msgid "Bitte im Feld \"#1#\" eine Auswahl treffen!"
-msgstr "Vui lÃ²ng lá»±a chá»n cho vÃ¹ng \"#1#\"!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productvars.class.php:10 
-#: ../mods/wpsg_mod_productvars.class.php:17
-msgid "Bitte im Feld \"#1#\" eine Angabe machen!"
-msgstr "Vui lÃ²ng nháº­p thÃŽng tin cho vÃ¹ng \"#1#\"!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_productvars.class.php:10 
-#: ../mods/wpsg_mod_productvars.class.php:17
-msgid "Bitte das Feld \"#1#\" aktivieren!"
-msgstr "Vui lÃ²ng kÃ­ch hoáº¡t vÃ¹ng \"#1#\"!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "UnverÃ€ndert"
-msgstr "KhÃŽng thay Äá»i"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Zahl (99.99)"
-msgstr "Sá» (99.99)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Zahl (99,99)"
-msgstr "Sá» (99.99)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "WÃ€hrung (99,99 â¬)"
-msgstr "ÄÆ¡n vá» tiá»n tá» (99,99 â¬)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Datum (TT.MM.YYYY)"
-msgstr "NgÃ y (DD.MM.YYYY)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Zeit (hh:mm:ss)"
-msgstr "Giá» (hh:mm:ss)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Datum und Zeit (TT.MM.YYYY hh:mm:ss)"
-msgstr "NgÃ y vÃ  giá» (DD.MM.YYYY hh:mm:ss)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid "Benutzerdefiniert"
-msgstr "Do ngÆ°á»i dÃ¹ng quáº£n lÃœ"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:2
-msgid ""
-"ErmÃ¶glicht es Produkte, Bestellungen und Kunden bezogen auf Bestellungen in "
-"verschiedene CSV Formate zu exportieren."
-msgstr ""
-"Cho phÃ©p báº¡n xuáº¥t sáº£n pháº©m, ÄÆ¡n hÃ ng vÃ  khÃ¡ch hÃ ng dÆ°á»i nhiá»u Äá»nh dáº¡ng CSV."
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Konnte Zip Archiv nicht erstellen!"
-msgstr "KhÃŽng thá» táº¡o ÄÆ°á»£c tá»p zip lÆ°u trá»¯!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Neues Profil"
-msgstr "Há» sÆ¡ má»i"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "UngÃŒltiges Trennzeichen angegeben!"
-msgstr "Dáº¥u phÃ¢n cÃ¡ch khÃŽng phÃ¹ há»£p!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Muster Datei erfolgreich verarbeitet."
-msgstr "Tá»p máº«u ÄÆ°á»£c xá»­ lÃœ thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Leer"
-msgstr "Trá»ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "BestellID"
-msgstr "MÃ£ ID ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Bemerkung Kunde"
-msgstr "BÃ¬nh luáº­n khÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Bestellsumme"
-msgstr "GiÃ¡ trá» ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Bestellsumme (Netto)"
-msgstr "GiÃ¡ trá» ÄÆ¡n hÃ ng (rÃ²ng)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Kosten Bezahlmethode"
-msgstr "PhÃ­ thanh toÃ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "UserAgent"
-msgstr "UserAgent"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "IP Adresse"
-msgstr "Äá»a chá» IP"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse Vorname"
-msgstr "Äá»a chá» giao hÃ ng tÃªn"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse Name"
-msgstr "Äá»a chá» giao hÃ ng há»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse Firma"
-msgstr "Äá»a chá» giao hÃ ng cÃŽng ty"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse StraÃe"
-msgstr "Äá»a chá» giao hÃ ng ÄÆ°á»ng phá»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse PLZ"
-msgstr "Äá»a chá» giao hÃ ng mÃ£ bÆ°u Äiá»n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse Ort"
-msgstr "Äá»a chá» giao hÃ ng thÃ nh phá»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse Land (Name)"
-msgstr "Äá»a chá» giao hÃ ng Quá»c gia (tÃªn)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Lieferadresse Land (KÃŒrzel)"
-msgstr "Äá»a chá» giao hÃ ng Quá»c gia (mÃ£)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Name der Zahlart"
-msgstr "TÃªn phÆ°Æ¡ng thá»©c thanh toÃ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Name der Versandart"
-msgstr "TÃªn phÆ°Æ¡ng thá»©c váº­n chuyá»n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Anzahl Produkte"
-msgstr "Sá» lÆ°á»£ng sáº£n pháº©m"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Name der Bank (Bankeinzug)"
-msgstr "TÃªn ngÃ¢n hÃ ng (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "BLZ der Bank (Bankeinzug)"
-msgstr "MÃ£ ngÃ¢n hÃ ng (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Kontoinhaber (Bankeinzug)"
-msgstr "Chá»§ tÃ i khoáº£n (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Kontonummer (Bankeinzug)"
-msgstr "Sá» tÃ i khoáº£n (Ghi ná»£ trá»±c tiáº¿p)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Status der Bestellung"
-msgstr "Tráº¡ng thÃ¡i ÄÆ¡n hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Anzahl an Artikeln"
-msgstr "Sá» lÆ°á»£ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "ProduktID"
-msgstr "SanphamID"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Position"
-msgstr "Má»¥c hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Produkttyp"
-msgstr "Loáº¡i sáº£n pháº©m"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Produktpreis"
-msgstr "GiÃ¡ sáº£n pháº©m"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Mehrwertsteuer"
-msgstr "Thuáº¿ GTGT"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "FÃŒllmengeneinheit"
-msgstr "ÄÆ¡n vá» sá» lÆ°á»£ng má»i gÃ³i"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Kunden"
-msgstr "KhÃ¡ch hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "KundenID"
-msgstr "KhachhangID"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Titel/Anrede"
-msgstr "Danh xÆ°ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Land (Name)"
-msgstr "Quá»c gia (tÃªn)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Land (KÃŒrzel)"
-msgstr "Quá»c gia (mÃ£)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Umsatzsteuernummer"
-msgstr "MÃ£ sá» thuáº¿"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Rechnungsnummer"
-msgstr "Sá» hoÃ¡ ÄÆ¡n"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:22
-msgid "Gutscheinnummer"
-msgstr "Sá» phiáº¿u mua hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_export.class.php:85
-msgid "Nicht definiert!"
-msgstr "KhÃŽng xÃ¡c Äá»nh!"
-
-# @ wpsg
-#: ../mods/wpsg_mod_freeshipping.class.php:2
-msgid "Versandkostenfrei"
-msgstr "Miá»
-n phÃ­ giao hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_freeshipping.class.php:2
-msgid "ErmÃ¶glicht die Versandart \"Versandkostenfrei\"."
-msgstr "Cho phÃ©p phÆ°Æ¡ng phÃ¡p váº­n chuyá»n \"Miá»
-n phÃ­ giao hÃ ng\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_weight.class.php:2
-msgid "Erlaubt die Verwaltung von Gewichten pro Produkt."
-msgstr "Cho phÃ©p báº¡n quáº£n lÃœ khá»i lÆ°á»£ng sáº£n pháº©m."
-
-# @ wpsg
-#: ../mods/wpsg_mod_produktattribute.class.php:2
-msgid ""
-"Erlaubt es Produktattribute zu erstellen, die dann in der Produktverwaltung "
-"ausgefÃŒllt und im Frontend angezeigt werden."
-msgstr ""
-"Cho phÃ©p báº¡n Äá»nh nghÄ©a thuá»c tÃ­nh sáº£n pháº©m Äá» sá»­ dá»¥ng trong danh má»¥c Quáº£n "
-"lÃœ sáº£n pháº©m vÃ  giao diá»n (Front-end)."
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:1
-msgid "Downloadprodukte"
-msgstr "CÃ¡c sáº£n pháº©m cÃ³ thá» táº£i vá»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:1
-msgid "Ein Download ist nicht mehr mÃ¶glich."
-msgstr "Táº£i vá» khÃŽng cÃ²n hiá»u lá»±c."
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:1
-msgid "Datei fÃŒr das Downloadmodul erfolgreich hochgeladen."
-msgstr "Tá»p tin cho Module táº£i vá» ÄÃ£ ÄÆ°á»£c táº£i lÃªn thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:1
-msgid "Versand per Mail"
-msgstr "Gá»­i qua E-mail"
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:6
-msgid "E-Mail mit Links zum Download der Produkte"
-msgstr "ThÆ° gá»m ÄÆ°á»ng dáº«n Äá» táº£i sáº£n pháº©m vá»"
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:13
-msgid "Bestellung wurde zwischenzeitlich storniert."
-msgstr "Trong lÃºc nÃ y ÄÆ¡n hÃ ng ÄÃ£ ÄÆ°á»£c huá»· bá»."
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:13
-msgid "Zugriffsfehler"
-msgstr "Lá»i ÄÄng nháº­p"
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:20
-msgid "Die Datei wurde nicht gefunden"
-msgstr "KhÃŽng tÃ¬m tháº¥y tá»p tin"
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:20
-msgid "Downloadprodukte (Kunde)"
-msgstr "CÃ¡c sáº£n pháº©m cÃ³ thá» táº£i vá» (khÃ¡ch hÃ ng)"
-
-# @ wpsg
-#: ../mods/wpsg_mod_downloadprodukte.class.php:20
-msgid ""
-"Diese Mail bekommt der Kunde, darin sind die Links zu den Produkten "
-"enthalten."
-msgstr ""
-"ThÆ° nÃ y ÄÆ°á»£c gá»­i Äáº¿n khÃ¡ch hÃ ng vÃ  bao gá»m ÄÆ°á»ng dáº«n Äáº¿n sáº£n pháº©m khÃ¡ch hÃ ng "
-"ÄÃ£ mua."
-
-# @ wpsg
-#: ../mods/wpsg_mod_nlsatolo.class.php:2
-msgid "Satollo Newsletter"
-msgstr "ThÆ° thÃŽng bÃ¡o Satollo"
-
-# @ wpsg
-#: ../mods/wpsg_mod_nlsatolo.class.php:2
-msgid ""
-"ErmÃ¶glicht die Anmeldung an das \"<a href=\"http://wordpress."
-"org/extend/plugins/newsletter/\">Newsletter</a>\" Plugin von Satollo."
-msgstr ""
-"Cho phÃ©p sá»­ dá»¥ng Plugin cá»§a Satollo \"<a href=\"http://wordpress."
-"org/extend/plugins/newsletter/\">newsletter</a>\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_nlsatolo.class.php:2
-msgid "Sie wurden erfolgreich in unseren Newsletter eingetragen."
-msgstr "Báº¡n ÄÃ£ ÄÄng kÃœ nháº­n thÆ° thÃŽng bÃ¡o thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_nlsatolo.class.php:2
-msgid ""
-"Sie wurden nicht zum Newsletter angemeldet, da das Plugin \"newsletter\" "
-"nicht installiert ist."
-msgstr ""
-"Báº¡n chÆ°a ÄÄng kÃœ nháº­n thÆ° thÃŽng bÃ¡o cá»§a chÃºng tÃŽi do Plugin \"ThÆ° thÃŽng "
-"bÃ¡o\" chÆ°a ÄÆ°á»£c cÃ i Äáº·t."
-
-# @ wpsg
-#: ../mods/wpsg_mod_debitpayment.class.php:2
-msgid "Nachnahme"
-msgstr "Thanh toÃ¡n khi nháº­n hÃ ng"
-
-# @ wpsg
-#: ../mods/wpsg_mod_debitpayment.class.php:2
-msgid "ErmÃ¶glicht die Zahlungsart \"Nachnahme\"."
-msgstr "Cho phÃ©p thá»±c hiá»n phÆ°Æ¡ng thá»©c \"Thanh toÃ¡n khi nháº­n hÃ ng\"."
-
-# @ wpsg
-#: ../mods/wpsg_mod_kundenkontakt.class.php:1
-msgid "Eine Nachricht ÃŒber den Kundenkontakt wurde versendet."
-msgstr "ThÆ° ÄÃ£ ÄÆ°á»£c gá»­i thÃŽng qua LiÃªn há» khÃ¡ch hÃ ng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "wpNewsletterGermany"
-msgstr "wpNewsletterGermany"
-
-# @ wpsg
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "ErmÃ¶glicht die Anmeldung an den wpNewsletterGermany."
-msgstr "Cho phÃ©p báº¡n Ã¡p dá»¥ng wpNewsletterGermany"
-
-# @ wpsg
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid ""
-"Sie haben eine Mail erhalten, in der sie die Newsletteranmeldung bestÃ€tigen "
-"mÃŒssen."
-msgstr "ÄÃ£ gá»­i thÆ° tá»i báº¡n Äá» xÃ¡c nháº­n ÄÄng kÃœ nháº­n thÆ° thÃŽng bÃ¡o."
-
-# @ wpsg
-#: ../mods/wpsg_mod_newsletter.class.php:2
-msgid "Sie wurden erfolgreich fÃŒr den Newsletter angemeldet."
-msgstr "Báº¡n ÄÃ£ ÄÄng kÃœ nháº­n thÆ° thÃŽng bÃ¡o thÃ nh cÃŽng."
-
-# @ wpsg
-#: ../mods/wpsg_mod_newsletter.class.php:7
-msgid "#1# Kunden in die Newsletter Gruppen importiert."
-msgstr "#1# khÃ¡ch hÃ ng ÄÃ£ nháº­p vÃ o nhÃ³m nháº­n thÆ° thÃŽng bÃ¡o."
-
-# @ wpsg
-#: ../mods/wpsg_mod_versandarten.class.php:16
-msgid "Anklicken um den Namen der Versandart zu Ã€ndern ..."
-msgstr "Nháº¥p Äá» thay Äá»i tÃªn phÆ°Æ¡ng thá»©c giao hÃ ngâŠ"
Index: /lib/PayPal/Api/Address.php
===================================================================
--- /lib/PayPal/Api/Address.php	(revision 8528)
+++ /lib/PayPal/Api/Address.php	(revision 5261)
@@ -2,4 +2,6 @@
 
 namespace PayPal\Api;
+
+use PayPal\Common\PayPalModel;
 
 /**
@@ -11,10 +13,9 @@
  *
  * @property string phone
- * @property string type
  */
-class Address extends BaseAddress
+class Address extends BaseAddress 
 {
     /**
-     * Phone number in E.123 format. 50 characters max.
+     * Phone number in E.123 format.
      *
      * @param string $phone
@@ -29,5 +30,5 @@
 
     /**
-     * Phone number in E.123 format. 50 characters max.
+     * Phone number in E.123 format.
      *
      * @return string
@@ -38,25 +39,3 @@
     }
 
-    /**
-     * Type of address (e.g., HOME_OR_WORK, GIFT etc).
-     *
-     * @param string $type
-     *
-     * @return $this
-     */
-    public function setType($type)
-    {
-        $this->type = $type;
-        return $this;
-    }
-
-    /**
-     * Type of address (e.g., HOME_OR_WORK, GIFT etc).
-     *
-     * @return string
-     */
-    public function getType()
-    {
-        return $this->type;
-    }
 }
Index: /lib/PayPal/Api/Agreement.php
===================================================================
--- /lib/PayPal/Api/Agreement.php	(revision 8528)
+++ /lib/PayPal/Api/Agreement.php	(revision 5261)
@@ -5,7 +5,8 @@
 use PayPal\Common\PayPalResourceModel;
 use PayPal\Core\PayPalConstants;
+use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\AgreementTransactions;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 
 /**
Index: /lib/PayPal/Api/Amount.php
===================================================================
--- /lib/PayPal/Api/Amount.php	(revision 8528)
+++ /lib/PayPal/Api/Amount.php	(revision 5261)
@@ -21,5 +21,5 @@
 {
     /**
-     * 3-letter [currency code](https://developer.paypal.com/docs/integration/direct/rest_api_payment_country_currency_support/). PayPal does not support all currencies.
+     * 3 letter currency code
      *
      * @param string $currency
@@ -34,5 +34,5 @@
 
     /**
-     * 3-letter [currency code](https://developer.paypal.com/docs/integration/direct/rest_api_payment_country_currency_support/). PayPal does not support all currencies.
+     * 3 letter currency code
      *
      * @return string
@@ -44,8 +44,9 @@
 
     /**
-     * Total amount charged from the payer to the payee. In case of a refund, this is the refunded amount to the original payer from the payee. 10 characters max with support for 2 decimal places.
+     * Total amount charged as part of this payment.
+     *
      *
      * @param string|double $total
-     * 
+     *
      * @return $this
      */
@@ -59,5 +60,5 @@
 
     /**
-     * Total amount charged from the payer to the payee. In case of a refund, this is the refunded amount to the original payer from the payee. 10 characters max with support for 2 decimal places.
+     * Total amount charged as part of this payment.
      *
      * @return string
Index: /lib/PayPal/Api/Authorization.php
===================================================================
--- /lib/PayPal/Api/Authorization.php	(revision 8528)
+++ /lib/PayPal/Api/Authorization.php	(revision 5261)
@@ -5,5 +5,7 @@
 use PayPal\Common\PayPalResourceModel;
 use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\Capture;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
@@ -15,4 +17,6 @@
  *
  * @property string id
+ * @property string create_time
+ * @property string update_time
  * @property \PayPal\Api\Amount amount
  * @property string payment_mode
@@ -24,16 +28,12 @@
  * @property \PayPal\Api\FmfDetails fmf_details
  * @property string parent_payment
- * @property \PayPal\Api\ProcessorResponse processor_response
+ * @property string clearing_time
  * @property string valid_until
- * @property string create_time
- * @property string update_time
- * @property string reference_id
- * @property string receipt_id
- * @property \PayPal\Api\Links[] links
+ * @property \PayPal\Api\Links links
  */
 class Authorization extends PayPalResourceModel
 {
     /**
-     * ID of the authorization transaction.
+     * Identifier of the authorization transaction.
      *
      * @param string $id
@@ -48,5 +48,5 @@
 
     /**
-     * ID of the authorization transaction.
+     * Identifier of the authorization transaction.
      *
      * @return string
@@ -58,5 +58,5 @@
 
     /**
-     * Amount being authorized.
+     * Amount being authorized for.
      *
      * @param \PayPal\Api\Amount $amount
@@ -71,5 +71,5 @@
 
     /**
-     * Amount being authorized.
+     * Amount being authorized for.
      *
      * @return \PayPal\Api\Amount
@@ -81,6 +81,6 @@
 
     /**
-     * Specifies the payment mode of the transaction.
-     * Valid Values: ["INSTANT_TRANSFER"]
+     * specifies payment mode of the transaction
+     * Valid Values: ["INSTANT_TRANSFER", "MANUAL_BANK_TRANSFER", "DELAYED_TRANSFER", "ECHECK"]
      *
      * @param string $payment_mode
@@ -95,5 +95,5 @@
 
     /**
-     * Specifies the payment mode of the transaction.
+     * specifies payment mode of the transaction
      *
      * @return string
@@ -105,5 +105,5 @@
 
     /**
-     * State of the authorization.
+     * State of the authorization transaction.
      * Valid Values: ["pending", "authorized", "partially_captured", "captured", "expired", "voided"]
      *
@@ -119,5 +119,5 @@
 
     /**
-     * State of the authorization.
+     * State of the authorization transaction.
      *
      * @return string
@@ -129,5 +129,5 @@
 
     /**
-     * Reason code, `AUTHORIZATION`, for a transaction state of `pending`.
+     * Reason code for the transaction state being Pending. This field will replace pending_reason field eventually
      * Valid Values: ["AUTHORIZATION"]
      *
@@ -143,5 +143,5 @@
 
     /**
-     * Reason code, `AUTHORIZATION`, for a transaction state of `pending`.
+     * Reason code for the transaction state being Pending. This field will replace pending_reason field eventually
      *
      * @return string
@@ -155,5 +155,5 @@
      * [DEPRECATED] Reason code for the transaction state being Pending.Obsolete. use reason_code field instead.
      * Valid Values: ["AUTHORIZATION"]
-     *
+     * @deprecated Plese Use setReasonCode instead
      * @param string $pending_reason
      * 
@@ -167,6 +167,6 @@
 
     /**
-     * @deprecated  [DEPRECATED] Reason code for the transaction state being Pending.Obsolete. use reason_code field instead.
-     *
+     * [DEPRECATED] Reason code for the transaction state being Pending.Obsolete. use reason_code field instead.
+     * @deprecated Plese Use setReasonCode instead
      * @return string
      */
@@ -177,5 +177,5 @@
 
     /**
-     * The level of seller protection in force for the transaction. Only supported when the `payment_method` is set to `paypal`. Allowed values:<br>  `ELIGIBLE`- Merchant is protected by PayPal's Seller Protection Policy for Unauthorized Payments and Item Not Received.<br> `PARTIALLY_ELIGIBLE`- Merchant is protected by PayPal's Seller Protection Policy for Item Not Received or Unauthorized Payments. Refer to `protection_eligibility_type` for specifics. <br> `INELIGIBLE`- Merchant is not protected under the Seller Protection Policy.
+     * Protection Eligibility of the Payer 
      * Valid Values: ["ELIGIBLE", "PARTIALLY_ELIGIBLE", "INELIGIBLE"]
      *
@@ -191,5 +191,5 @@
 
     /**
-     * The level of seller protection in force for the transaction. Only supported when the `payment_method` is set to `paypal`. Allowed values:<br>  `ELIGIBLE`- Merchant is protected by PayPal's Seller Protection Policy for Unauthorized Payments and Item Not Received.<br> `PARTIALLY_ELIGIBLE`- Merchant is protected by PayPal's Seller Protection Policy for Item Not Received or Unauthorized Payments. Refer to `protection_eligibility_type` for specifics. <br> `INELIGIBLE`- Merchant is not protected under the Seller Protection Policy.
+     * Protection Eligibility of the Payer 
      *
      * @return string
@@ -201,6 +201,6 @@
 
     /**
-     * The kind of seller protection in force for the transaction. This property is returned only when the `protection_eligibility` property is set to `ELIGIBLE`or `PARTIALLY_ELIGIBLE`. Only supported when the `payment_method` is set to `paypal`. Allowed values:<br> `ITEM_NOT_RECEIVED_ELIGIBLE`- Sellers are protected against claims for items not received.<br> `UNAUTHORIZED_PAYMENT_ELIGIBLE`- Sellers are protected against claims for unauthorized payments.<br> One or both of the allowed values can be returned.
-     * Valid Values: ["ITEM_NOT_RECEIVED_ELIGIBLE", "UNAUTHORIZED_PAYMENT_ELIGIBLE", "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE"]
+     * Protection Eligibility Type of the Payer 
+     * Valid Values: ["ELIGIBLE", "ITEM_NOT_RECEIVED_ELIGIBLE", "INELIGIBLE", "UNAUTHORIZED_PAYMENT_ELIGIBLE"]
      *
      * @param string $protection_eligibility_type
@@ -215,5 +215,5 @@
 
     /**
-     * The kind of seller protection in force for the transaction. This property is returned only when the `protection_eligibility` property is set to `ELIGIBLE`or `PARTIALLY_ELIGIBLE`. Only supported when the `payment_method` is set to `paypal`. Allowed values:<br> `ITEM_NOT_RECEIVED_ELIGIBLE`- Sellers are protected against claims for items not received.<br> `UNAUTHORIZED_PAYMENT_ELIGIBLE`- Sellers are protected against claims for unauthorized payments.<br> One or both of the allowed values can be returned.
+     * Protection Eligibility Type of the Payer 
      *
      * @return string
@@ -225,5 +225,5 @@
 
     /**
-     * Fraud Management Filter (FMF) details applied for the payment that could result in accept, deny, or pending action. Returned in a payment response only if the merchant has enabled FMF in the profile settings and one of the fraud filters was triggered based on those settings. See [Fraud Management Filters Summary](https://developer.paypal.com/docs/classic/fmf/integration-guide/FMFSummary/) for more information.
+     * Fraud Management Filter (FMF) details applied for the payment that could result in accept/deny/pending action.
      *
      * @param \PayPal\Api\FmfDetails $fmf_details
@@ -238,5 +238,5 @@
 
     /**
-     * Fraud Management Filter (FMF) details applied for the payment that could result in accept, deny, or pending action. Returned in a payment response only if the merchant has enabled FMF in the profile settings and one of the fraud filters was triggered based on those settings. See [Fraud Management Filters Summary](https://developer.paypal.com/docs/classic/fmf/integration-guide/FMFSummary/) for more information.
+     * Fraud Management Filter (FMF) details applied for the payment that could result in accept/deny/pending action.
      *
      * @return \PayPal\Api\FmfDetails
@@ -271,28 +271,29 @@
 
     /**
-     * Response codes returned by the processor concerning the submitted payment. Only supported when the `payment_method` is set to `credit_card`.
-     *
-     * @param \PayPal\Api\ProcessorResponse $processor_response
-     *
-     * @return $this
-     */
-    public function setProcessorResponse($processor_response)
-    {
-        $this->processor_response = $processor_response;
-        return $this;
-    }
-
-    /**
-     * Response codes returned by the processor concerning the submitted payment. Only supported when the `payment_method` is set to `credit_card`.
-     *
-     * @return \PayPal\Api\ProcessorResponse
-     */
-    public function getProcessorResponse()
-    {
-        return $this->processor_response;
-    }
-
-    /**
-     * Authorization expiration time and date as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Expected clearing time for eCheck Transactions
+     *
+     *
+     * @param string $clearing_time
+     *
+     * @return $this
+     */
+    public function setClearingTime($clearing_time)
+    {
+        $this->clearing_time = $clearing_time;
+        return $this;
+    }
+
+    /**
+     * Expected clearing time for eCheck Transactions
+     *
+     * @return string
+     */
+    public function getClearingTime()
+    {
+        return $this->clearing_time;
+    }
+
+    /**
+     * Date/Time until which funds may be captured against this resource in UTC ISO8601 format.
      *
      * @param string $valid_until
@@ -307,5 +308,5 @@
 
     /**
-     * Authorization expiration time and date as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date/Time until which funds may be captured against this resource in UTC ISO8601 format.
      *
      * @return string
@@ -317,5 +318,5 @@
 
     /**
-     * Time of authorization as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $create_time
@@ -330,5 +331,5 @@
 
     /**
-     * Time of authorization as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -340,5 +341,5 @@
 
     /**
-     * Time that the resource was last updated.
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @param string $update_time
@@ -353,5 +354,5 @@
 
     /**
-     * Time that the resource was last updated.
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @return string
@@ -363,51 +364,5 @@
 
     /**
-     * Identifier to the purchase or transaction unit corresponding to this authorization transaction.
-     *
-     * @param string $reference_id
-     * 
-     * @return $this
-     */
-    public function setReferenceId($reference_id)
-    {
-        $this->reference_id = $reference_id;
-        return $this;
-    }
-
-    /**
-     * Identifier to the purchase or transaction unit corresponding to this authorization transaction.
-     *
-     * @return string
-     */
-    public function getReferenceId()
-    {
-        return $this->reference_id;
-    }
-
-    /**
-     * Receipt id is 16 digit number payment identification number returned for guest users to identify the payment.
-     *
-     * @param string $receipt_id
-     * 
-     * @return $this
-     */
-    public function setReceiptId($receipt_id)
-    {
-        $this->receipt_id = $receipt_id;
-        return $this;
-    }
-
-    /**
-     * Receipt id is 16 digit number payment identification number returned for guest users to identify the payment.
-     *
-     * @return string
-     */
-    public function getReceiptId()
-    {
-        return $this->receipt_id;
-    }
-
-    /**
-     * Shows details for an authorization, by ID.
+     * Retrieve details about a previously created authorization by passing the authorization_id in the request URI.
      *
      * @param string $authorizationId
@@ -434,5 +389,5 @@
 
     /**
-     * Captures and processes an authorization, by ID. To use this call, the original payment call must specify an intent of `authorize`.
+     * Capture and process a previously created authorization by passing the authorization_id in the request URI. To use this request, the original payment call must have the intent set to authorize.
      *
      * @param Capture $capture
@@ -460,5 +415,5 @@
 
     /**
-     * Voids, or cancels, an authorization, by ID. You cannot void a fully captured authorization.
+     * Void (cancel) a previously authorized payment by passing the authorization_id in the request URI. Note that a fully captured authorization cannot be voided.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -483,5 +438,5 @@
 
     /**
-     * Reauthorizes a PayPal account payment, by authorization ID. To ensure that funds are still available, reauthorize a payment after the initial three-day honor period. Supports only the `amount` request parameter.
+     * Reauthorize a PayPal account payment by passing the authorization_id in the request URI. You should reauthorize a payment after the initial 3-day honor period to ensure that funds are still available.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
Index: /lib/PayPal/Api/BankAccount.php
===================================================================
--- /lib/PayPal/Api/BankAccount.php	(revision 8528)
+++ /lib/PayPal/Api/BankAccount.php	(revision 5261)
@@ -3,14 +3,17 @@
 namespace PayPal\Api;
 
-use PayPal\Common\PayPalModel;
+use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
+use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
  * Class BankAccount
- * 
+ *
  * A resource representing a bank account that can be used to fund a payment.
- * @deprecated Deprecated. It is for internal use only. It may be removed in next major revision.
  *
  * @package PayPal\Api
  *
+ * @property string id
  * @property string account_number
  * @property string account_number_type
@@ -35,11 +38,10 @@
  * @property string update_time
  * @property string valid_until
- * @property \PayPal\Api\Links[] links
  */
-class BankAccount extends PayPalModel
+class BankAccount extends PayPalResourceModel
 {
     /**
      * ID of the bank account being saved for later use.
-     * @deprecated Not publicly available
+     *
      * @param string $id
      * 
@@ -54,5 +56,5 @@
     /**
      * ID of the bank account being saved for later use.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -437,5 +439,5 @@
 
     /**
-     * [DEPRECATED] Use external_customer_id instead.
+     * Deprecated - Use external_customer_id instead.
      *
      * @param string $payer_id
@@ -450,5 +452,5 @@
 
     /**
-     * @deprecated  [DEPRECATED] Use external_customer_id instead.
+     * Deprecated - Use external_customer_id instead.
      *
      * @return string
@@ -482,6 +484,7 @@
     }
 
-    /**
-     * A unique identifier of the merchant for which this bank account has been stored for. Generated and provided by the facilitator so it can be used to restrict the usage of the bank account to the specific merchant.
+
+    /**
+     * A unique identifier of the merchant for which this bank account has been stored for. Generated and provided by the facilitator so it can be used to restrict the usage of the bank account to the specific merchnt.
      *
      * @param string $merchant_id
@@ -496,5 +499,5 @@
 
     /**
-     * A unique identifier of the merchant for which this bank account has been stored for. Generated and provided by the facilitator so it can be used to restrict the usage of the bank account to the specific merchant.
+     * A unique identifier of the merchant for which this bank account has been stored for. Generated and provided by the facilitator so it can be used to restrict the usage of the bank account to the specific merchnt.
      *
      * @return string
@@ -575,54 +578,95 @@
 
     /**
-     * Sets Links
-     *
-     * @param \PayPal\Api\Links[] $links
-     * 
-     * @return $this
-     */
-    public function setLinks($links)
-    {
-        $this->links = $links;
-        return $this;
-    }
-
-    /**
-     * Gets Links
-     *
-     * @return \PayPal\Api\Links[]
-     */
-    public function getLinks()
-    {
-        return $this->links;
-    }
-
-    /**
-     * Append Links to the list.
-     *
-     * @param \PayPal\Api\Links $links
-     * @return $this
-     */
-    public function addLink($links)
-    {
-        if (!$this->getLinks()) {
-            return $this->setLinks(array($links));
-        } else {
-            return $this->setLinks(
-                array_merge($this->getLinks(), array($links))
-            );
-        }
-    }
-
-    /**
-     * Remove Links from the list.
-     *
-     * @param \PayPal\Api\Links $links
-     * @return $this
-     */
-    public function removeLink($links)
-    {
-        return $this->setLinks(
-            array_diff($this->getLinks(), array($links))
+     * Creates a new Bank Account Resource.
+     *
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
+     * @return BankAccount
+     */
+    public function create($apiContext = null, $restCall = null)
+    {
+        $payLoad = $this->toJSON();
+        $json = self::executeCall(
+            "/v1/vault/bank-accounts",
+            "POST",
+            $payLoad,
+            null,
+            $apiContext,
+            $restCall
         );
+        $this->fromJson($json);
+        return $this;
+    }
+
+    /**
+     * Obtain the Bank Account resource for the given identifier.
+     *
+     * @param string $bankAccountId
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
+     * @return BankAccount
+     */
+    public static function get($bankAccountId, $apiContext = null, $restCall = null)
+    {
+        ArgumentValidator::validate($bankAccountId, 'bankAccountId');
+        $payLoad = "";
+        $json = self::executeCall(
+            "/v1/vault/bank-accounts/$bankAccountId",
+            "GET",
+            $payLoad,
+            null,
+            $apiContext,
+            $restCall
+        );
+        $ret = new BankAccount();
+        $ret->fromJson($json);
+        return $ret;
+    }
+
+    /**
+     * Delete the bank account resource for the given identifier.
+     *
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
+     * @return bool
+     */
+    public function delete($apiContext = null, $restCall = null)
+    {
+        ArgumentValidator::validate($this->getId(), "Id");
+        $payLoad = "";
+        self::executeCall(
+            "/v1/vault/bank-accounts/{$this->getId()}",
+            "DELETE",
+            $payLoad,
+            null,
+            $apiContext,
+            $restCall
+        );
+        return true;
+    }
+
+    /**
+     * Update information in a previously saved bank account. Only the modified fields need to be passed in the request.
+     *
+     * @param PatchRequest $patchRequest
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
+     * @return BankAccount
+     */
+    public function update($patchRequest, $apiContext = null, $restCall = null)
+    {
+        ArgumentValidator::validate($this->getId(), "Id");
+        ArgumentValidator::validate($patchRequest, 'patchRequest');
+        $payLoad = $patchRequest->toJSON();
+        $json = self::executeCall(
+            "/v1/vault/bank-accounts/{$this->getId()}",
+            "PATCH",
+            $payLoad,
+            null,
+            $apiContext,
+            $restCall
+        );
+        $this->fromJson($json);
+        return $this;
     }
 
Index: /lib/PayPal/Api/BillingInfo.php
===================================================================
--- /lib/PayPal/Api/BillingInfo.php	(revision 8528)
+++ /lib/PayPal/Api/BillingInfo.php	(revision 5261)
@@ -25,5 +25,5 @@
 {
     /**
-     * The invoice recipient email address. Maximum length is 260 characters.
+     * Email address of the invoice recipient. 260 characters max.
      *
      * @param string $email
@@ -38,5 +38,5 @@
 
     /**
-     * The invoice recipient email address. Maximum length is 260 characters.
+     * Email address of the invoice recipient. 260 characters max.
      *
      * @return string
@@ -48,5 +48,5 @@
 
     /**
-     * The invoice recipient first name. Maximum length is 30 characters.
+     * First name of the invoice recipient. 30 characters max.
      *
      * @param string $first_name
@@ -61,5 +61,5 @@
 
     /**
-     * The invoice recipient first name. Maximum length is 30 characters.
+     * First name of the invoice recipient. 30 characters max.
      *
      * @return string
@@ -71,5 +71,5 @@
 
     /**
-     * The invoice recipient last name. Maximum length is 30 characters.
+     * Last name of the invoice recipient. 30 characters max.
      *
      * @param string $last_name
@@ -84,5 +84,5 @@
 
     /**
-     * The invoice recipient last name. Maximum length is 30 characters.
+     * Last name of the invoice recipient. 30 characters max.
      *
      * @return string
@@ -94,5 +94,5 @@
 
     /**
-     * The invoice recipient company business name. Maximum length is 100 characters.
+     * Company business name of the invoice recipient. 100 characters max.
      *
      * @param string $business_name
@@ -107,5 +107,5 @@
 
     /**
-     * The invoice recipient company business name. Maximum length is 100 characters.
+     * Company business name of the invoice recipient. 100 characters max.
      *
      * @return string
@@ -117,5 +117,5 @@
 
     /**
-     * The invoice recipient address.
+     * Address of the invoice recipient.
      *
      * @param \PayPal\Api\InvoiceAddress $address
@@ -130,5 +130,5 @@
 
     /**
-     * The invoice recipient address.
+     * Address of the invoice recipient.
      *
      * @return \PayPal\Api\InvoiceAddress
@@ -140,5 +140,5 @@
 
     /**
-     * The language in which the email was sent to the payer. Used only when the payer does not have a PayPal account.
+     * Language of the email sent to the payer. Will only be used if payer doesn't have a PayPal account.
      * Valid Values: ["da_DK", "de_DE", "en_AU", "en_GB", "en_US", "es_ES", "es_XC", "fr_CA", "fr_FR", "fr_XC", "he_IL", "id_ID", "it_IT", "ja_JP", "nl_NL", "no_NO", "pl_PL", "pt_BR", "pt_PT", "ru_RU", "sv_SE", "th_TH", "tr_TR", "zh_CN", "zh_HK", "zh_TW", "zh_XC"]
      *
@@ -154,5 +154,5 @@
 
     /**
-     * The language in which the email was sent to the payer. Used only when the payer does not have a PayPal account.
+     * Language of the email sent to the payer. Will only be used if payer doesn't have a PayPal account.
      *
      * @return string
@@ -164,5 +164,5 @@
 
     /**
-     * Additional information, such as business hours. Maximum length is 40 characters.
+     * Option to display additional information such as business hours. 40 characters max.
      *
      * @param string $additional_info
@@ -177,5 +177,5 @@
 
     /**
-     * Additional information, such as business hours. Maximum length is 40 characters.
+     * Option to display additional information such as business hours. 40 characters max.
      *
      * @return string
Index: /lib/PayPal/Api/CancelNotification.php
===================================================================
--- /lib/PayPal/Api/CancelNotification.php	(revision 8528)
+++ /lib/PayPal/Api/CancelNotification.php	(revision 5261)
@@ -16,5 +16,4 @@
  * @property bool send_to_merchant
  * @property bool send_to_payer
- * @property string[] cc_emails
  */
 class CancelNotification extends PayPalModel
@@ -67,5 +66,5 @@
 
     /**
-     * Indicates whether to send a copy of the notification to the merchant.
+     * A flag indicating whether a copy of the email has to be sent to the merchant.
      *
      * @param bool $send_to_merchant
@@ -80,5 +79,5 @@
 
     /**
-     * Indicates whether to send a copy of the notification to the merchant.
+     * A flag indicating whether a copy of the email has to be sent to the merchant.
      *
      * @return bool
@@ -90,5 +89,5 @@
 
     /**
-     * Indicates whether to send a copy of the notification to the payer.
+     * A flag indicating whether a copy of the email has to be sent to the payer.
      *
      * @param bool $send_to_payer
@@ -103,5 +102,5 @@
 
     /**
-     * Indicates whether to send a copy of the notification to the payer.
+     * A flag indicating whether a copy of the email has to be sent to the payer.
      *
      * @return bool
@@ -112,56 +111,3 @@
     }
 
-    /**
-     * Applicable for invoices created with Cc emails. If this field is not in the body, all the cc email addresses added as part of the invoice shall be notified else this field can be used to limit the list of email addresses. Note: additional email addresses are not supported.
-     *
-     * @param string[] $cc_emails
-     * 
-     * @return $this
-     */
-    public function setCcEmails($cc_emails)
-    {
-        $this->cc_emails = $cc_emails;
-        return $this;
-    }
-
-    /**
-     * Applicable for invoices created with Cc emails. If this field is not in the body, all the cc email addresses added as part of the invoice shall be notified else this field can be used to limit the list of email addresses. Note: additional email addresses are not supported.
-     *
-     * @return string[]
-     */
-    public function getCcEmails()
-    {
-        return $this->cc_emails;
-    }
-
-    /**
-     * Append CcEmails to the list.
-     *
-     * @param string $string
-     * @return $this
-     */
-    public function addCcEmail($string)
-    {
-        if (!$this->getCcEmails()) {
-            return $this->setCcEmails(array($string));
-        } else {
-            return $this->setCcEmails(
-                array_merge($this->getCcEmails(), array($string))
-            );
-        }
-    }
-
-    /**
-     * Remove CcEmails from the list.
-     *
-     * @param string $string
-     * @return $this
-     */
-    public function removeCcEmail($string)
-    {
-        return $this->setCcEmails(
-            array_diff($this->getCcEmails(), array($string))
-        );
-    }
-
 }
Index: /lib/PayPal/Api/Capture.php
===================================================================
--- /lib/PayPal/Api/Capture.php	(revision 8528)
+++ /lib/PayPal/Api/Capture.php	(revision 5261)
@@ -4,7 +4,8 @@
 
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\Refund;
+use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
-use PayPal\Rest\ApiContext;
 
 /**
@@ -16,13 +17,11 @@
  *
  * @property string id
+ * @property string create_time
+ * @property string update_time
  * @property \PayPal\Api\Amount amount
  * @property bool is_final_capture
  * @property string state
- * @property string reason_code
  * @property string parent_payment
- * @property string invoice_number
  * @property \PayPal\Api\Currency transaction_fee
- * @property string create_time
- * @property string update_time
  * @property \PayPal\Api\Links[] links
  */
@@ -30,5 +29,5 @@
 {
     /**
-     * The ID of the capture transaction.
+     * Identifier of the Capture transaction.
      *
      * @param string $id
@@ -43,5 +42,5 @@
 
     /**
-     * The ID of the capture transaction.
+     * Identifier of the Capture transaction.
      *
      * @return string
@@ -53,5 +52,5 @@
 
     /**
-     * The amount to capture. If the amount matches the orginally authorized amount, the state of the authorization changes to `captured`. If not, the state of the authorization changes to `partially_captured`.
+     * Amount being captured. If no amount is specified, amount is used from the authorization being captured. If amount is same as the amount that's authorized for, the state of the authorization changes to captured. If not, the state of the authorization changes to partially_captured. Alternatively, you could indicate a final capture by setting the is_final_capture flag to true.
      *
      * @param \PayPal\Api\Amount $amount
@@ -66,5 +65,5 @@
 
     /**
-     * The amount to capture. If the amount matches the orginally authorized amount, the state of the authorization changes to `captured`. If not, the state of the authorization changes to `partially_captured`.
+     * Amount being captured. If no amount is specified, amount is used from the authorization being captured. If amount is same as the amount that's authorized for, the state of the authorization changes to captured. If not, the state of the authorization changes to partially_captured. Alternatively, you could indicate a final capture by setting the is_final_capture flag to true.
      *
      * @return \PayPal\Api\Amount
@@ -76,5 +75,5 @@
 
     /**
-     * Indicates whether to release all remaining funds that the authorization holds in the funding instrument. Default is `false`.
+     * whether this is a final capture for the given authorization or not. If it's final, all the remaining funds held by the authorization, will be released in the funding instrument.
      *
      * @param bool $is_final_capture
@@ -89,5 +88,5 @@
 
     /**
-     * Indicates whether to release all remaining funds that the authorization holds in the funding instrument. Default is `false`.
+     * whether this is a final capture for the given authorization or not. If it's final, all the remaining funds held by the authorization, will be released in the funding instrument.
      *
      * @return bool
@@ -99,5 +98,5 @@
 
     /**
-     * The state of the capture.
+     * State of the capture transaction.
      * Valid Values: ["pending", "completed", "refunded", "partially_refunded"]
      *
@@ -113,5 +112,5 @@
 
     /**
-     * The state of the capture.
+     * State of the capture transaction.
      *
      * @return string
@@ -123,29 +122,5 @@
 
     /**
-     * The reason code that describes why the transaction state is pending or reversed.
-     * Valid Values: ["CHARGEBACK", "GUARANTEE", "BUYER_COMPLAINT", "REFUND", "UNCONFIRMED_SHIPPING_ADDRESS", "ECHECK", "INTERNATIONAL_WITHDRAWAL", "RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION", "PAYMENT_REVIEW", "REGULATORY_REVIEW", "UNILATERAL", "VERIFICATION_REQUIRED", "TRANSACTION_APPROVED_AWAITING_FUNDING"]
-     *
-     * @param string $reason_code
-     * 
-     * @return $this
-     */
-    public function setReasonCode($reason_code)
-    {
-        $this->reason_code = $reason_code;
-        return $this;
-    }
-
-    /**
-     * The reason code that describes why the transaction state is pending or reversed.
-     *
-     * @return string
-     */
-    public function getReasonCode()
-    {
-        return $this->reason_code;
-    }
-
-    /**
-     * The ID of the payment on which this transaction is based.
+     * ID of the Payment resource that this transaction is based on.
      *
      * @param string $parent_payment
@@ -160,5 +135,5 @@
 
     /**
-     * The ID of the payment on which this transaction is based.
+     * ID of the Payment resource that this transaction is based on.
      *
      * @return string
@@ -170,28 +145,5 @@
 
     /**
-     * The invoice number to track this payment.
-     *
-     * @param string $invoice_number
-     * 
-     * @return $this
-     */
-    public function setInvoiceNumber($invoice_number)
-    {
-        $this->invoice_number = $invoice_number;
-        return $this;
-    }
-
-    /**
-     * The invoice number to track this payment.
-     *
-     * @return string
-     */
-    public function getInvoiceNumber()
-    {
-        return $this->invoice_number;
-    }
-
-    /**
-     * The transaction fee for this payment.
+     * Transaction fee applicable for this payment.
      *
      * @param \PayPal\Api\Currency $transaction_fee
@@ -206,5 +158,5 @@
 
     /**
-     * The transaction fee for this payment.
+     * Transaction fee applicable for this payment.
      *
      * @return \PayPal\Api\Currency
@@ -216,5 +168,5 @@
 
     /**
-     * The date and time of capture, as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $create_time
@@ -229,5 +181,5 @@
 
     /**
-     * The date and time of capture, as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -239,5 +191,5 @@
 
     /**
-     * The date and time when the resource was last updated.
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @param string $update_time
@@ -252,5 +204,5 @@
 
     /**
-     * The date and time when the resource was last updated.
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @return string
@@ -262,5 +214,5 @@
 
     /**
-     * Shows details for a captured payment, by ID.
+     * Retrieve details about a captured payment by passing the capture_id in the request URI.
      *
      * @param string $captureId
@@ -289,8 +241,7 @@
      * Refund a captured payment by passing the capture_id in the request URI. In addition, include an amount object in the body of the request JSON.
      *
-     * @deprecated Please use #refundCapturedPayment instead.
-     * @param Refund         $refund
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param Refund $refund
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return Refund
      */
@@ -313,29 +264,3 @@
     }
 
-    /**
-     * Refunds a captured payment, by ID. Include an `amount` object in the JSON request body.
-     *
-     * @param RefundRequest $refundRequest
-     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
-     * @return DetailedRefund
-     */
-    public function refundCapturedPayment($refundRequest, $apiContext = null, $restCall = null)
-    {
-        ArgumentValidator::validate($this->getId(), "Id");
-        ArgumentValidator::validate($refundRequest, 'refundRequest');
-        $payLoad = $refundRequest->toJSON();
-        $json = self::executeCall(
-            "/v1/payments/capture/{$this->getId()}/refund",
-            "POST",
-            $payLoad,
-            null,
-            $apiContext,
-            $restCall
-        );
-        $ret = new DetailedRefund();
-        $ret->fromJson($json);
-        return $ret;
-    }
-
 }
Index: /lib/PayPal/Api/CarrierAccountToken.php
===================================================================
--- /lib/PayPal/Api/CarrierAccountToken.php	(revision 8528)
+++ /lib/PayPal/Api/CarrierAccountToken.php	(revision 5261)
@@ -21,5 +21,5 @@
      *
      * @param string $carrier_account_id
-     * 
+     *
      * @return $this
      */
@@ -41,8 +41,8 @@
 
     /**
-     * The unique identifier of the payer used when saving this carrier account instrument.
+     * ID of a previously saved carrier account resource.
+     *
      *
      * @param string $external_customer_id
-     * 
      * @return $this
      */
Index: /lib/PayPal/Api/CartBase.php
===================================================================
--- /lib/PayPal/Api/CartBase.php	(revision 8528)
+++ /lib/PayPal/Api/CartBase.php	(revision 5261)
@@ -13,5 +13,4 @@
  * @package PayPal\Api
  *
- * @property string reference_id
  * @property \PayPal\Api\Amount amount
  * @property \PayPal\Api\Payee payee
@@ -20,5 +19,4 @@
  * @property string custom
  * @property string invoice_number
- * @property string purchase_order
  * @property string soft_descriptor
  * @property \PayPal\Api\PaymentOptions payment_options
@@ -30,27 +28,4 @@
 {
     /**
-     * Merchant identifier to the purchase unit. Optional parameter
-     *
-     * @param string $reference_id
-     * 
-     * @return $this
-     */
-    public function setReferenceId($reference_id)
-    {
-        $this->reference_id = $reference_id;
-        return $this;
-    }
-
-    /**
-     * Merchant identifier to the purchase unit. Optional parameter
-     *
-     * @return string
-     */
-    public function getReferenceId()
-    {
-        return $this->reference_id;
-    }
-
-    /**
      * Amount being collected.
      *
@@ -145,19 +120,20 @@
 
     /**
+     * Note to the recipient of the funds in this transaction.
+     *
+     *
+     * @param string $custom
+     * 
+     * @return $this
+     */
+    public function setCustom($custom)
+    {
+        $this->custom = $custom;
+        return $this;
+    }
+
+    /**
      * free-form field for the use of clients
      *
-     * @param string $custom
-     * 
-     * @return $this
-     */
-    public function setCustom($custom)
-    {
-        $this->custom = $custom;
-        return $this;
-    }
-
-    /**
-     * free-form field for the use of clients
-     *
      * @return string
      */
@@ -191,28 +167,6 @@
 
     /**
-     * purchase order is number or id specific to this payment
-     *
-     * @param string $purchase_order
-     * 
-     * @return $this
-     */
-    public function setPurchaseOrder($purchase_order)
-    {
-        $this->purchase_order = $purchase_order;
-        return $this;
-    }
-
-    /**
-     * purchase order is number or id specific to this payment
-     *
-     * @return string
-     */
-    public function getPurchaseOrder()
-    {
-        return $this->purchase_order;
-    }
-
-    /**
-     * Soft descriptor used when charging this funding source. If length exceeds max length, the value will be truncated
+     * Soft descriptor used when charging this funding source.
+     *
      *
      * @param string $soft_descriptor
@@ -227,5 +181,5 @@
 
     /**
-     * Soft descriptor used when charging this funding source. If length exceeds max length, the value will be truncated
+     * Soft descriptor used when charging this funding source.
      *
      * @return string
@@ -237,28 +191,6 @@
 
     /**
-     * Soft descriptor city used when charging this funding source. If length exceeds max length, the value will be truncated. Only supported when the `payment_method` is set to `credit_card`
-     * @deprecated Not publicly available
-     * @param string $soft_descriptor_city
-     * 
-     * @return $this
-     */
-    public function setSoftDescriptorCity($soft_descriptor_city)
-    {
-        $this->soft_descriptor_city = $soft_descriptor_city;
-        return $this;
-    }
-
-    /**
-     * Soft descriptor city used when charging this funding source. If length exceeds max length, the value will be truncated. Only supported when the `payment_method` is set to `credit_card`
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getSoftDescriptorCity()
-    {
-        return $this->soft_descriptor_city;
-    }
-
-    /**
      * Payment options requested for this purchase unit
+     *
      *
      * @param \PayPal\Api\PaymentOptions $payment_options
@@ -353,56 +285,4 @@
     }
 
-    /**
-     * List of external funding being applied to the purchase unit. Each external_funding unit should have a unique reference_id
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\ExternalFunding[] $external_funding
-     *
-     * @return $this
-     */
-    public function setExternalFunding($external_funding)
-    {
-        $this->external_funding = $external_funding;
-        return $this;
-    }
-
-    /**
-     * List of external funding being applied to the purchase unit. Each external_funding unit should have a unique reference_id
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\ExternalFunding[]
-     */
-    public function getExternalFunding()
-    {
-        return $this->external_funding;
-    }
-
-    /**
-     * Append ExternalFunding to the list.
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\ExternalFunding $externalFunding
-     * @return $this
-     */
-    public function addExternalFunding($externalFunding)
-    {
-        if (!$this->getExternalFunding()) {
-            return $this->setExternalFunding(array($externalFunding));
-        } else {
-            return $this->setExternalFunding(
-                array_merge($this->getExternalFunding(), array($externalFunding))
-            );
-        }
-    }
-
-    /**
-     * Remove ExternalFunding from the list.
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\ExternalFunding $externalFunding
-     * @return $this
-     */
-    public function removeExternalFunding($externalFunding)
-    {
-        return $this->setExternalFunding(
-            array_diff($this->getExternalFunding(), array($externalFunding))
-        );
-    }
 
 }
Index: /lib/PayPal/Api/Cost.php
===================================================================
--- /lib/PayPal/Api/Cost.php	(revision 8528)
+++ /lib/PayPal/Api/Cost.php	(revision 5261)
@@ -4,11 +4,11 @@
 
 use PayPal\Common\PayPalModel;
+use PayPal\Validation\NumericValidator;
 use PayPal\Converter\FormatConverter;
-use PayPal\Validation\NumericValidator;
 
 /**
  * Class Cost
  *
- * Cost as a percent or an amount. For example, to specify 10%, enter `10`. Alternatively, to specify an amount of 5, enter `5`.
+ * Cost as a percent. For example, 10% should be entered as 10. Alternatively, cost as an amount. For example, an amount of 5 should be entered as 5.
  *
  * @package PayPal\Api
@@ -45,5 +45,5 @@
 
     /**
-     * The cost, as an amount. Valid range is from 0 to 1,000,000.
+     * Cost in amount. Range of 0 to 999999.99.
      *
      * @param \PayPal\Api\Currency $amount
@@ -58,5 +58,5 @@
 
     /**
-     * The cost, as an amount. Valid range is from 0 to 1,000,000.
+     * Cost in amount. Range of 0 to 999999.99.
      *
      * @return \PayPal\Api\Currency
Index: /lib/PayPal/Api/CreateProfileResponse.php
===================================================================
--- /lib/PayPal/Api/CreateProfileResponse.php	(revision 8528)
+++ /lib/PayPal/Api/CreateProfileResponse.php	(revision 5261)
@@ -2,4 +2,6 @@
 
 namespace PayPal\Api;
+
+use PayPal\Common\PayPalModel;
 
 /**
@@ -12,5 +14,5 @@
  * @property string id
  */
-class CreateProfileResponse extends WebProfile
+class CreateProfileResponse extends PayPalModel
 {
     /**
Index: /lib/PayPal/Api/Credit.php
===================================================================
--- /lib/PayPal/Api/Credit.php	(revision 8528)
+++ /lib/PayPal/Api/Credit.php	(revision 5261)
@@ -14,4 +14,5 @@
  * @property string id
  * @property string type
+ * @property string terms
  */
 class Credit extends PayPalModel
@@ -41,5 +42,5 @@
 
     /**
-     * specifies type of credit
+     * Specifies the type of credit.
      * Valid Values: ["BILL_ME_LATER", "PAYPAL_EXTRAS_MASTERCARD", "EBAY_MASTERCARD", "PAYPAL_SMART_CONNECT"]
      *
@@ -55,5 +56,5 @@
 
     /**
-     * specifies type of credit
+     * Specifies the type of credit
      *
      * @return string
@@ -64,3 +65,26 @@
     }
 
+    /**
+     * URI to the associated terms.
+     *
+     * @param string $terms
+     *
+     * @return $this
+     */
+    public function setTerms($terms)
+    {
+        $this->terms = $terms;
+        return $this;
+    }
+
+    /**
+     * URI to the associated terms.
+     *
+     * @return string
+     */
+    public function getTerms()
+    {
+        return $this->terms;
+    }
+
 }
Index: /lib/PayPal/Api/CreditCard.php
===================================================================
--- /lib/PayPal/Api/CreditCard.php	(revision 8528)
+++ /lib/PayPal/Api/CreditCard.php	(revision 5261)
@@ -4,34 +4,37 @@
 
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 
 /**
  * Class CreditCard
  *
- * @package    PayPal\Api
+ * A resource representing a credit card that can be used to fund a payment.
  *
- * @property string              number
- * @property string              type
- * @property int                 expire_month
- * @property int                 expire_year
- * @property string              cvv2
- * @property string              first_name
- * @property string              last_name
+ * @package PayPal\Api
+ *
+ * @property string id
+ * @property string number
+ * @property string type
+ * @property int expire_month
+ * @property int expire_year
+ * @property string cvv2
+ * @property string first_name
+ * @property string last_name
  * @property \PayPal\Api\Address billing_address
- * @property string              external_customer_id
- * @property string              state
- * @property string              valid_until
- * @property \PayPal\Api\Links[] links
+ * @property string external_customer_id
+ * @property string state
+ * @property string valid_until
+ * @property string create_time
+ * @property string update_time
  */
 class CreditCard extends PayPalResourceModel
 {
     /**
-     * ID of the credit card. This ID is provided in the response when storing credit cards. **Required if using a stored credit card.**
-     *
-     * @deprecated Not publicly available
+     * ID of the credit card being saved for later use.
+     *
      * @param string $id
-     *
+     * 
      * @return $this
      */
@@ -43,7 +46,6 @@
 
     /**
-     * ID of the credit card. This ID is provided in the response when storing credit cards. **Required if using a stored credit card.**
-     *
-     * @deprecated Not publicly available
+     * ID of the credit card being saved for later use.
+     *
      * @return string
      */
@@ -54,8 +56,8 @@
 
     /**
-     * Credit card number. Numeric characters only with no spaces or punctuation. The string must conform with modulo and length required by each credit card type. *Redacted in responses.*
+     * Card number.
      *
      * @param string $number
-     *
+     * 
      * @return $this
      */
@@ -67,5 +69,5 @@
 
     /**
-     * Credit card number. Numeric characters only with no spaces or punctuation. The string must conform with modulo and length required by each credit card type. *Redacted in responses.*
+     * Card number.
      *
      * @return string
@@ -77,8 +79,8 @@
 
     /**
-     * Credit card type. Valid types are: `visa`, `mastercard`, `discover`, `amex`
+     * Type of the Card (eg. Visa, Mastercard, etc.).
      *
      * @param string $type
-     *
+     * 
      * @return $this
      */
@@ -90,5 +92,5 @@
 
     /**
-     * Credit card type. Valid types are: `visa`, `mastercard`, `discover`, `amex`
+     * Type of the Card (eg. Visa, Mastercard, etc.).
      *
      * @return string
@@ -100,8 +102,8 @@
 
     /**
-     * Expiration month with no leading zero. Acceptable values are 1 through 12.
+     * 2 digit card expiry month.
      *
      * @param int $expire_month
-     *
+     * 
      * @return $this
      */
@@ -113,5 +115,5 @@
 
     /**
-     * Expiration month with no leading zero. Acceptable values are 1 through 12.
+     * 2 digit card expiry month.
      *
      * @return int
@@ -123,8 +125,8 @@
 
     /**
-     * 4-digit expiration year.
+     * 4 digit card expiry year
      *
      * @param int $expire_year
-     *
+     * 
      * @return $this
      */
@@ -136,5 +138,5 @@
 
     /**
-     * 4-digit expiration year.
+     * 4 digit card expiry year
      *
      * @return int
@@ -146,8 +148,8 @@
 
     /**
-     * 3-4 digit card validation code.
+     * Card validation code. Only supported when making a Payment but not when saving a credit card for future use.
      *
      * @param string $cvv2
-     *
+     * 
      * @return $this
      */
@@ -159,5 +161,5 @@
 
     /**
-     * 3-4 digit card validation code.
+     * Card validation code. Only supported when making a Payment but not when saving a credit card for future use.
      *
      * @return string
@@ -169,8 +171,8 @@
 
     /**
-     * Cardholder's first name.
+     * Card holder's first name.
      *
      * @param string $first_name
-     *
+     * 
      * @return $this
      */
@@ -182,5 +184,5 @@
 
     /**
-     * Cardholder's first name.
+     * Card holder's first name.
      *
      * @return string
@@ -192,8 +194,8 @@
 
     /**
-     * Cardholder's last name.
+     * Card holder's last name.
      *
      * @param string $last_name
-     *
+     * 
      * @return $this
      */
@@ -205,5 +207,5 @@
 
     /**
-     * Cardholder's last name.
+     * Card holder's last name.
      *
      * @return string
@@ -218,5 +220,5 @@
      *
      * @param \PayPal\Api\Address $billing_address
-     *
+     * 
      * @return $this
      */
@@ -238,8 +240,8 @@
 
     /**
-     * A unique identifier of the customer to whom this bank account belongs. Generated and provided by the facilitator. **This is now used in favor of `payer_id` when creating or using a stored funding instrument in the vault.**
+     * A unique identifier of the customer to whom this bank account belongs to. Generated and provided by the facilitator. This is required when creating or using a stored funding instrument in vault.
      *
      * @param string $external_customer_id
-     *
+     * 
      * @return $this
      */
@@ -251,5 +253,5 @@
 
     /**
-     * A unique identifier of the customer to whom this bank account belongs. Generated and provided by the facilitator. **This is now used in favor of `payer_id` when creating or using a stored funding instrument in the vault.**
+     * A unique identifier of the customer to whom this bank account belongs to. Generated and provided by the facilitator. This is required when creating or using a stored funding instrument in vault.
      *
      * @return string
@@ -261,80 +263,9 @@
 
     /**
-     * A user provided, optional convenvience field that functions as a unique identifier for the merchant on behalf of whom this credit card is being stored for. Note that this has no relation to PayPal merchant id
-     *
-     * @param string $merchant_id
-     *
-     * @return $this
-     */
-    public function setMerchantId($merchant_id)
-    {
-        $this->merchant_id = $merchant_id;
-        return $this;
-    }
-
-    /**
-     * A user provided, optional convenvience field that functions as a unique identifier for the merchant on behalf of whom this credit card is being stored for. Note that this has no relation to PayPal merchant id
-     *
-     * @return string
-     */
-    public function getMerchantId()
-    {
-        return $this->merchant_id;
-    }
-
-    /**
-     * A unique identifier that you can assign and track when storing a credit card or using a stored credit card. This ID can help to avoid unintentional use or misuse of credit cards. This ID can be any value you would like to associate with the saved card, such as a UUID, username, or email address. Required when using a stored credit card if a payer_id was originally provided when storing the credit card in vault.
-     *
-     * @deprecated This is being deprecated in favor of the `external_customer_id` property.
-     * @param string $payer_id
-     *
-     * @return $this
-     */
-    public function setPayerId($payer_id)
-    {
-        $this->payer_id = $payer_id;
-        return $this;
-    }
-
-    /**
-     * A unique identifier that you can assign and track when storing a credit card or using a stored credit card. This ID can help to avoid unintentional use or misuse of credit cards. This ID can be any value you would like to associate with the saved card, such as a UUID, username, or email address. Required when using a stored credit card if a payer_id was originally provided when storing the credit card in vault.
-     *
-     * @deprecated This is being deprecated in favor of the `external_customer_id` property.
-     * @return string
-     */
-    public function getPayerId()
-    {
-        return $this->payer_id;
-    }
-
-    /**
-     * A unique identifier of the bank account resource. Generated and provided by the facilitator so it can be used to restrict the usage of the bank account to the specific merchant.
-     *
-     * @param string $external_card_id
-     *
-     * @return $this
-     */
-    public function setExternalCardId($external_card_id)
-    {
-        $this->external_card_id = $external_card_id;
-        return $this;
-    }
-
-    /**
-     * A unique identifier of the bank account resource. Generated and provided by the facilitator so it can be used to restrict the usage of the bank account to the specific merchant.
-     *
-     * @return string
-     */
-    public function getExternalCardId()
-    {
-        return $this->external_card_id;
-    }
-
-    /**
-     * State of the credit card funding instrument.
+     * State of the funding instrument.
      * Valid Values: ["expired", "ok"]
      *
      * @param string $state
-     *
+     * 
      * @return $this
      */
@@ -346,5 +277,5 @@
 
     /**
-     * State of the credit card funding instrument.
+     * State of the funding instrument.
      *
      * @return string
@@ -356,5 +287,28 @@
 
     /**
-     * Funding instrument expiration date.
+     * Date/Time until this resource can be used fund a payment.
+     *
+     * @param string $valid_until
+     * 
+     * @return $this
+     */
+    public function setValidUntil($valid_until)
+    {
+        $this->valid_until = $valid_until;
+        return $this;
+    }
+
+    /**
+     * Date/Time until this resource can be used fund a payment.
+     *
+     * @return string
+     */
+    public function getValidUntil()
+    {
+        return $this->valid_until;
+    }
+
+    /**
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $create_time
@@ -369,5 +323,5 @@
 
     /**
-     * Resource creation time  as ISO8601 date-time format (ex: 1994-11-05T13:15:30Z) that indicates creation time.
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -379,5 +333,5 @@
 
     /**
-     * Resource creation time  as ISO8601 date-time format (ex: 1994-11-05T13:15:30Z) that indicates the updation time.
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $update_time
@@ -392,5 +346,5 @@
 
     /**
-     * Resource creation time  as ISO8601 date-time format (ex: 1994-11-05T13:15:30Z) that indicates the updation time.
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -402,31 +356,8 @@
 
     /**
-     * Date/Time until this resource can be used fund a payment.
-     *
-     * @param string $valid_until
-     *
-     * @return $this
-     */
-    public function setValidUntil($valid_until)
-    {
-        $this->valid_until = $valid_until;
-        return $this;
-    }
-
-    /**
-     * Funding instrument expiration date.
-     *
-     * @return string
-     */
-    public function getValidUntil()
-    {
-        return $this->valid_until;
-    }
-
-    /**
      * Creates a new Credit Card Resource (aka Tokenize).
      *
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return CreditCard
      */
@@ -449,7 +380,7 @@
      * Obtain the Credit Card resource for the given identifier.
      *
-     * @param string         $creditCardId
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param string $creditCardId
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return CreditCard
      */
@@ -474,6 +405,6 @@
      * Delete the Credit Card resource for the given identifier.
      *
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return bool
      */
@@ -496,7 +427,7 @@
      * Update information in a previously saved card. Only the modified fields need to be passed in the request.
      *
-     * @param PatchRequest   $patchRequest
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param PatchRequest $patchRequest
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return CreditCard
      */
@@ -518,43 +449,3 @@
     }
 
-    /**
-     * Retrieves a list of Credit Card resources.
-     *
-     * @param array          $params
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
-     * @return CreditCardList
-     */
-    public static function all($params, $apiContext = null, $restCall = null)
-    {
-        if (is_null($params)) {
-            $params = array();
-        }
-        ArgumentValidator::validate($params, 'params');
-        $payLoad = "";
-        $allowedParams = array(
-            'page_size' => 1,
-            'page' => 1,
-            'start_time' => 1,
-            'end_time' => 1,
-            'sort_order' => 1,
-            'sort_by' => 1,
-            'merchant_id' => 1,
-            'external_card_id' => 1,
-            'external_customer_id' => 1,
-            'total_required' => 1
-        );
-        $json = self::executeCall(
-            "/v1/vault/credit-cards" . "?" . http_build_query(array_intersect_key($params, $allowedParams)),
-            "GET",
-            $payLoad,
-            null,
-            $apiContext,
-            $restCall
-        );
-        $ret = new CreditCardList();
-        $ret->fromJson($json);
-        return $ret;
-    }
-
 }
Index: /lib/PayPal/Api/CreditCardHistory.php
===================================================================
--- /lib/PayPal/Api/CreditCardHistory.php	(revision 8528)
+++ /lib/PayPal/Api/CreditCardHistory.php	(revision 5261)
@@ -4,4 +4,5 @@
 
 use PayPal\Common\PayPalModel;
+use PayPal\Rest\ApiContext;
 
 /**
@@ -12,5 +13,5 @@
  * @package PayPal\Api
  *
- * @property \PayPal\Api\CreditCard[] credit_cards
+ * @property \PayPal\Api\CreditCard credit_cards
  * @property int count
  * @property string next_id
@@ -20,7 +21,8 @@
     /**
      * A list of credit card resources
+     * 
      *
-     *
-     * @param \PayPal\Api\CreditCard[] $credit_cards
+     * @param \PayPal\Api\CreditCard $credit-cards
+     * 
      * @return $this
      */
Index: /lib/PayPal/Api/CreditCardList.php
===================================================================
--- /lib/PayPal/Api/CreditCardList.php	(revision 8528)
+++ /lib/PayPal/Api/CreditCardList.php	(revision 5261)
@@ -3,5 +3,5 @@
 namespace PayPal\Api;
 
-use PayPal\Common\PayPalResourceModel;
+use PayPal\Common\PayPalModel;
 
 /**
@@ -12,21 +12,20 @@
  * @package PayPal\Api
  *
- * @property \PayPal\Api\CreditCard[] items
- * @property \PayPal\Api\Links[] links
- * @property int total_items
- * @property int total_pages
+ * @property \PayPal\Api\CreditCard[] credit_cards
+ * @property int count
+ * @property string next_id
  */
-class CreditCardList extends PayPalResourceModel
+class CreditCardList extends PayPalModel
 {
     /**
      * A list of credit card resources
      *
-     * @param \PayPal\Api\CreditCard[] $items
+     * @param \PayPal\Api\CreditCard[] $credit_cards
      * 
      * @return $this
      */
-    public function setItems($items)
+    public function setCreditCards($credit_cards)
     {
-        $this->items = $items;
+        $this->{"credit-cards"} = $credit_cards;
         return $this;
     }
@@ -37,22 +36,22 @@
      * @return \PayPal\Api\CreditCard[]
      */
-    public function getItems()
+    public function getCreditCards()
     {
-        return $this->items;
+        return $this->{"credit-cards"};
     }
 
     /**
-     * Append Items to the list.
+     * Append CreditCards to the list.
      *
      * @param \PayPal\Api\CreditCard $creditCard
      * @return $this
      */
-    public function addItem($creditCard)
+    public function addCreditCard($creditCard)
     {
-        if (!$this->getItems()) {
-            return $this->setItems(array($creditCard));
+        if (!$this->getCreditCards()) {
+            return $this->setCreditCards(array($creditCard));
         } else {
-            return $this->setItems(
-                array_merge($this->getItems(), array($creditCard))
+            return $this->setCreditCards(
+                array_merge($this->getCreditCards(), array($creditCard))
             );
         }
@@ -60,60 +59,60 @@
 
     /**
-     * Remove Items from the list.
+     * Remove CreditCards from the list.
      *
      * @param \PayPal\Api\CreditCard $creditCard
      * @return $this
      */
-    public function removeItem($creditCard)
+    public function removeCreditCard($creditCard)
     {
-        return $this->setItems(
-            array_diff($this->getItems(), array($creditCard))
+        return $this->setCreditCards(
+            array_diff($this->getCreditCards(), array($creditCard))
         );
     }
 
     /**
-     * Total number of items present in the given list. Note that the number of items might be larger than the records in the current page.
+     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items.
      *
-     * @param int $total_items
+     * @param int $count
      * 
      * @return $this
      */
-    public function setTotalItems($total_items)
+    public function setCount($count)
     {
-        $this->total_items = $total_items;
+        $this->count = $count;
         return $this;
     }
 
     /**
-     * Total number of items present in the given list. Note that the number of items might be larger than the records in the current page.
+     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items.
      *
      * @return int
      */
-    public function getTotalItems()
+    public function getCount()
     {
-        return $this->total_items;
+        return $this->count;
     }
 
     /**
-     * Total number of pages that exist, for the total number of items, with the given page size.
+     * Identifier of the next element to get the next range of results.
      *
-     * @param int $total_pages
+     * @param string $next_id
      * 
      * @return $this
      */
-    public function setTotalPages($total_pages)
+    public function setNextId($next_id)
     {
-        $this->total_pages = $total_pages;
+        $this->next_id = $next_id;
         return $this;
     }
 
     /**
-     * Total number of pages that exist, for the total number of items, with the given page size.
+     * Identifier of the next element to get the next range of results.
      *
-     * @return int
+     * @return string
      */
-    public function getTotalPages()
+    public function getNextId()
     {
-        return $this->total_pages;
+        return $this->next_id;
     }
 
Index: /lib/PayPal/Api/CreditCardToken.php
===================================================================
--- /lib/PayPal/Api/CreditCardToken.php	(revision 8528)
+++ /lib/PayPal/Api/CreditCardToken.php	(revision 5261)
@@ -22,5 +22,5 @@
 {
     /**
-     * ID of credit card previously stored using `/vault/credit-card`.
+     * ID of a previously saved Credit Card resource using /vault/credit-card API.
      *
      * @param string $credit_card_id
@@ -35,5 +35,5 @@
 
     /**
-     * ID of credit card previously stored using `/vault/credit-card`.
+     * ID of a previously saved Credit Card resource using /vault/credit-card API.
      *
      * @return string
@@ -45,5 +45,5 @@
 
     /**
-     * A unique identifier that you can assign and track when storing a credit card or using a stored credit card. This ID can help to avoid unintentional use or misuse of credit cards. This ID can be any value you would like to associate with the saved card, such as a UUID, username, or email address.  **Required when using a stored credit card if a payer_id was originally provided when storing the credit card in vault.**
+     * The unique identifier of the payer used when saving this credit card using /vault/credit-card API.
      *
      * @param string $payer_id
@@ -58,5 +58,5 @@
 
     /**
-     * A unique identifier that you can assign and track when storing a credit card or using a stored credit card. This ID can help to avoid unintentional use or misuse of credit cards. This ID can be any value you would like to associate with the saved card, such as a UUID, username, or email address.  **Required when using a stored credit card if a payer_id was originally provided when storing the credit card in vault.**
+     * The unique identifier of the payer used when saving this credit card using /vault/credit-card API.
      *
      * @return string
@@ -68,5 +68,5 @@
 
     /**
-     * Last four digits of the stored credit card number.
+     * Last 4 digits of the card number from the saved card.
      *
      * @param string $last4
@@ -81,5 +81,5 @@
 
     /**
-     * Last four digits of the stored credit card number.
+     * Last 4 digits of the card number from the saved card.
      *
      * @return string
@@ -91,5 +91,5 @@
 
     /**
-     * Credit card type. Valid types are: `visa`, `mastercard`, `discover`, `amex`. Values are presented in lowercase and not should not be used for display.
+     * Type of the Card (eg. visa, mastercard, etc.) from the saved card. Please note that the values are always in lowercase and not meant to be used directly for display.
      *
      * @param string $type
@@ -104,5 +104,5 @@
 
     /**
-     * Credit card type. Valid types are: `visa`, `mastercard`, `discover`, `amex`. Values are presented in lowercase and not should not be used for display.
+     * Type of the Card (eg. visa, mastercard, etc.) from the saved card. Please note that the values are always in lowercase and not meant to be used directly for display.
      *
      * @return string
@@ -114,5 +114,5 @@
 
     /**
-     * Expiration month with no leading zero. Acceptable values are 1 through 12.
+     * card expiry month from the saved card with value 1 - 12
      *
      * @param int $expire_month
@@ -127,5 +127,5 @@
 
     /**
-     * Expiration month with no leading zero. Acceptable values are 1 through 12.
+     * card expiry month from the saved card with value 1 - 12
      *
      * @return int
@@ -137,5 +137,5 @@
 
     /**
-     * 4-digit expiration year.
+     * 4 digit card expiry year from the saved card
      *
      * @param int $expire_year
@@ -150,5 +150,5 @@
 
     /**
-     * 4-digit expiration year.
+     * 4 digit card expiry year from the saved card
      *
      * @return int
Index: /lib/PayPal/Api/CurrencyConversion.php
===================================================================
--- /lib/PayPal/Api/CurrencyConversion.php	(revision 8528)
+++ /lib/PayPal/Api/CurrencyConversion.php	(revision 5261)
@@ -20,4 +20,5 @@
  * @property string conversion_type
  * @property bool conversion_type_changeable
+ * @property string web_url
  * @property \PayPal\Api\Links[] links
  */
@@ -189,5 +190,5 @@
      * Base URL to web applications endpoint
      * Valid Values: ["https://www.paypal.com/{country_code}/webapps/xocspartaweb/webflow/sparta/proxwebflow", "https://www.paypal.com/{country_code}/proxflow"]
-     * @deprecated Not publicly available
+     *
      * @param string $web_url
      * @throws \InvalidArgumentException
@@ -203,5 +204,5 @@
     /**
      * Base URL to web applications endpoint
-     * @deprecated Not publicly available
+     *
      * @return string
      */
Index: /lib/PayPal/Api/CustomAmount.php
===================================================================
--- /lib/PayPal/Api/CustomAmount.php	(revision 8528)
+++ /lib/PayPal/Api/CustomAmount.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class CustomAmount
  *
- * The custom amount applied on an invoice. If you include a label, the amount cannot be empty.
+ * Custom amount applied on an invoice. If a label is included then the amount cannot be empty.
  *
  * @package PayPal\Api
@@ -18,5 +18,5 @@
 {
     /**
-     * The custom amount label. Maximum length is 25 characters.
+     * Custom amount label. 25 characters max.
      *
      * @param string $label
@@ -31,5 +31,5 @@
 
     /**
-     * The custom amount label. Maximum length is 25 characters.
+     * Custom amount label. 25 characters max.
      *
      * @return string
@@ -41,5 +41,5 @@
 
     /**
-     * The custom amount value. Valid range is from -999999.99 to 999999.99.
+     * Custom amount value. Range of 0 to 999999.99.
      *
      * @param \PayPal\Api\Currency $amount
@@ -54,5 +54,5 @@
 
     /**
-     * The custom amount value. Valid range is from -999999.99 to 999999.99.
+     * Custom amount value. Range of 0 to 999999.99.
      *
      * @return \PayPal\Api\Currency
Index: /lib/PayPal/Api/Details.php
===================================================================
--- /lib/PayPal/Api/Details.php	(revision 8528)
+++ /lib/PayPal/Api/Details.php	(revision 5261)
@@ -26,5 +26,5 @@
 {
     /**
-     * Amount of the subtotal of the items. **Required** if line items are specified. 10 characters max, with support for 2 decimal places.
+     * Sub-total (amount) of items being paid for.
      *
      * @param string|double $subtotal
@@ -41,5 +41,5 @@
 
     /**
-     * Amount of the subtotal of the items. **Required** if line items are specified. 10 characters max, with support for 2 decimal places.
+     * Sub-total (amount) of items being paid for.
      *
      * @return string
@@ -51,5 +51,5 @@
 
     /**
-     * Amount charged for shipping. 10 characters max with support for 2 decimal places.
+     * Amount being charged for shipping.
      *
      * @param string|double $shipping
@@ -66,5 +66,5 @@
 
     /**
-     * Amount charged for shipping. 10 characters max with support for 2 decimal places.
+     * Amount being charged for shipping.
      *
      * @return string
@@ -76,5 +76,5 @@
 
     /**
-     * Amount charged for tax. 10 characters max with support for 2 decimal places.
+     * Amount being charged as tax.
      *
      * @param string|double $tax
@@ -91,5 +91,5 @@
 
     /**
-     * Amount charged for tax. 10 characters max with support for 2 decimal places.
+     * Amount being charged as tax.
      *
      * @return string
@@ -101,7 +101,7 @@
 
     /**
-     * Amount being charged for the handling fee. Only supported when the `payment_method` is set to `paypal`.
-     *
-     * @param string|double $handling_fee
+     * Amount being charged as handling fee.
+     *
+     * @param string $handling_fee
      * 
      * @return $this
@@ -116,5 +116,5 @@
 
     /**
-     * Amount being charged for the handling fee. Only supported when the `payment_method` is set to `paypal`.
+     * Amount being charged as handling fee.
      *
      * @return string
@@ -126,7 +126,7 @@
 
     /**
-     * Amount being discounted for the shipping fee. Only supported when the `payment_method` is set to `paypal`.
-     *
-     * @param string|double $shipping_discount
+     * Amount being charged as shipping discount.
+     *
+     * @param string $shipping_discount
      * 
      * @return $this
@@ -141,5 +141,5 @@
 
     /**
-     * Amount being discounted for the shipping fee. Only supported when the `payment_method` is set to `paypal`.
+     * Amount being charged as shipping discount.
      *
      * @return string
@@ -151,5 +151,5 @@
 
     /**
-     * Amount being charged for the insurance fee. Only supported when the `payment_method` is set to `paypal`.
+     * Amount being charged as insurance.
      *
      * @param string|double $insurance
@@ -166,5 +166,5 @@
 
     /**
-     * Amount being charged for the insurance fee. Only supported when the `payment_method` is set to `paypal`.
+     * Amount being charged as insurance.
      *
      * @return string
@@ -178,5 +178,5 @@
      * Amount being charged as gift wrap fee.
      *
-     * @param string|double $gift_wrap
+     * @param string $gift_wrap
      * 
      * @return $this
Index: /lib/PayPal/Api/Error.php
===================================================================
--- /lib/PayPal/Api/Error.php	(revision 8528)
+++ /lib/PayPal/Api/Error.php	(revision 5261)
@@ -12,10 +12,12 @@
  * @package PayPal\Api
  *
- * @property string                     name
- * @property string                     message
+ * @property string name
+ * @property string purchase_unit_reference_id
+ * @property string debug_id
+ * @property string message
+ * @property string code
+ * @property string information_link
  * @property \PayPal\Api\ErrorDetails[] details
- * @property string                     information_link
- * @property string                     debug_id
- * @property \PayPal\Api\Links[]        links
+ * @property \PayPal\Api\Links[] links
  */
 class Error extends PayPalModel
@@ -25,5 +27,5 @@
      *
      * @param string $name
-     *
+     * 
      * @return $this
      */
@@ -47,7 +49,6 @@
      * Reference ID of the purchase_unit associated with this error
      *
-     * @deprecated Not publicly available
      * @param string $purchase_unit_reference_id
-     *
+     * 
      * @return $this
      */
@@ -61,5 +62,4 @@
      * Reference ID of the purchase_unit associated with this error
      *
-     * @deprecated Not publicly available
      * @return string
      */
@@ -70,9 +70,54 @@
 
     /**
+     * PayPal internal identifier used for correlation purposes.
+     *
+     * @param string $debug_id
+     * 
+     * @return $this
+     */
+    public function setDebugId($debug_id)
+    {
+        $this->debug_id = $debug_id;
+        return $this;
+    }
+
+    /**
+     * PayPal internal identifier used for correlation purposes.
+     *
+     * @return string
+     */
+    public function getDebugId()
+    {
+        return $this->debug_id;
+    }
+
+    /**
+     * Message describing the error.
+     *
+     * @param string $message
+     * 
+     * @return $this
+     */
+    public function setMessage($message)
+    {
+        $this->message = $message;
+        return $this;
+    }
+
+    /**
+     * Message describing the error.
+     *
+     * @return string
+     */
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+    /**
      * PayPal internal error code.
      *
-     * @deprecated Not publicly available
      * @param string $code
-     *
+     * 
      * @return $this
      */
@@ -86,5 +131,4 @@
      * PayPal internal error code.
      *
-     * @deprecated Not publicly available
      * @return string
      */
@@ -95,54 +139,8 @@
 
     /**
-     * PayPal internal identifier used for correlation purposes.
-     *
-     * @param string $debug_id
-     *
-     * @return $this
-     */
-    public function setDebugId($debug_id)
-    {
-        $this->debug_id = $debug_id;
-        return $this;
-    }
-
-    /**
-     * PayPal internal identifier used for correlation purposes.
-     *
-     * @return string
-     */
-    public function getDebugId()
-    {
-        return $this->debug_id;
-    }
-
-    /**
-     * Message describing the error.
-     *
-     * @param string $message
-     *
-     * @return $this
-     */
-    public function setMessage($message)
-    {
-        $this->message = $message;
-        return $this;
-    }
-
-    /**
-     * Message describing the error.
-     *
-     * @return string
-     */
-    public function getMessage()
-    {
-        return $this->message;
-    }
-
-    /**
      * URI for detailed information related to this error for the developer.
      *
      * @param string $information_link
-     *
+     * 
      * @return $this
      */
@@ -167,5 +165,5 @@
      *
      * @param \PayPal\Api\ErrorDetails[] $details
-     *
+     * 
      * @return $this
      */
@@ -217,58 +215,8 @@
 
     /**
-     * response codes returned from a payment processor such as avs, cvv, etc. Only supported when the `payment_method` is set to `credit_card`.
-     *
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\ProcessorResponse $processor_response
-     *
-     * @return $this
-     */
-    public function setProcessorResponse($processor_response)
-    {
-        $this->processor_response = $processor_response;
-        return $this;
-    }
-
-    /**
-     * response codes returned from a payment processor such as avs, cvv, etc. Only supported when the `payment_method` is set to `credit_card`.
-     *
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\ProcessorResponse
-     */
-    public function getProcessorResponse()
-    {
-        return $this->processor_response;
-    }
-
-    /**
-     * Fraud filter details.  Only supported when the `payment_method` is set to `credit_card`
-     *
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\FmfDetails $fmf_details
-     *
-     * @return $this
-     */
-    public function setFmfDetails($fmf_details)
-    {
-        $this->fmf_details = $fmf_details;
-        return $this;
-    }
-
-    /**
-     * Fraud filter details.  Only supported when the `payment_method` is set to `credit_card`
-     *
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\FmfDetails
-     */
-    public function getFmfDetails()
-    {
-        return $this->fmf_details;
-    }
-
-    /**
      * Sets Links
      *
      * @param \PayPal\Api\Links[] $links
-     *
+     * 
      * @return $this
      */
@@ -318,3 +266,4 @@
         );
     }
+
 }
Index: /lib/PayPal/Api/ErrorDetails.php
===================================================================
--- /lib/PayPal/Api/ErrorDetails.php	(revision 8528)
+++ /lib/PayPal/Api/ErrorDetails.php	(revision 5261)
@@ -14,4 +14,6 @@
  * @property string field
  * @property string issue
+ * @property string purchase_unit_reference_id
+ * @property string code
  */
 class ErrorDetails extends PayPalModel
@@ -65,5 +67,5 @@
     /**
      * Reference ID of the purchase_unit associated with this error
-     * @deprecated Not publicly available
+     *
      * @param string $purchase_unit_reference_id
      * 
@@ -78,5 +80,5 @@
     /**
      * Reference ID of the purchase_unit associated with this error
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -88,5 +90,5 @@
     /**
      * PayPal internal error code.
-     * @deprecated Not publicly available
+     *
      * @param string $code
      * 
@@ -101,5 +103,5 @@
     /**
      * PayPal internal error code.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
Index: /lib/PayPal/Api/ExtendedBankAccount.php
===================================================================
--- /lib/PayPal/Api/ExtendedBankAccount.php	(revision 8528)
+++ /lib/PayPal/Api/ExtendedBankAccount.php	(revision 5261)
@@ -10,10 +10,11 @@
  * @package PayPal\Api
  *
+ * @property string mandate_reference_number
  */
-class ExtendedBankAccount extends BankAccount
+class ExtendedBankAccount extends BankAccount 
 {
     /**
      * Identifier of the direct debit mandate to validate. Currently supported only for EU bank accounts(SEPA).
-     * @deprecated Not publicly available
+     *
      * @param string $mandate_reference_number
      * 
@@ -28,5 +29,5 @@
     /**
      * Identifier of the direct debit mandate to validate. Currently supported only for EU bank accounts(SEPA).
-     * @deprecated Not publicly available
+     *
      * @return string
      */
Index: /lib/PayPal/Api/FlowConfig.php
===================================================================
--- /lib/PayPal/Api/FlowConfig.php	(revision 8528)
+++ /lib/PayPal/Api/FlowConfig.php	(revision 5261)
@@ -15,11 +15,10 @@
  * @property string landing_page_type
  * @property string bank_txn_pending_url
- * @property string user_action
- * @property string return_uri_http_method
  */
 class FlowConfig extends PayPalModel
 {
     /**
-     * The type of landing page to display on the PayPal site for user checkout. Set to `Billing` to use the non-PayPal account landing page. Set to `Login` to use the PayPal account login landing page.
+     * Type of PayPal page to be displayed when a user lands on the PayPal site for checkout. Allowed values: `Billing` or `Login`. When set to `Billing`, the Non-PayPal account landing page is used. When set to `Login`, the PayPal account login landing page is used.
+     * 
      *
      * @param string $landing_page_type
@@ -34,5 +33,5 @@
 
     /**
-     * The type of landing page to display on the PayPal site for user checkout. Set to `Billing` to use the non-PayPal account landing page. Set to `Login` to use the PayPal account login landing page.
+     * Type of PayPal page to be displayed when a user lands on the PayPal site for checkout. Allowed values: `Billing` or `Login`. When set to `Billing`, the Non-PayPal account landing page is used. When set to `Login`, the PayPal account login landing page is used.
      *
      * @return string
@@ -44,5 +43,6 @@
 
     /**
-     * The merchant site URL to display after a bank transfer payment. Valid for only the Giropay or bank transfer payment method in Germany.
+     * The URL on the merchant site for transferring to after a bank transfer payment.
+     * 
      *
      * @param string $bank_txn_pending_url
@@ -58,5 +58,5 @@
 
     /**
-     * The merchant site URL to display after a bank transfer payment. Valid for only the Giropay or bank transfer payment method in Germany.
+     * The URL on the merchant site for transferring to after a bank transfer payment.
      *
      * @return string
@@ -67,49 +67,3 @@
     }
 
-    /**
-     * Defines whether buyers can complete purchases on the PayPal or merchant website.
-     *
-     * @param string $user_action
-     * 
-     * @return $this
-     */
-    public function setUserAction($user_action)
-    {
-        $this->user_action = $user_action;
-        return $this;
-    }
-
-    /**
-     * Defines whether buyers can complete purchases on the PayPal or merchant website.
-     *
-     * @return string
-     */
-    public function getUserAction()
-    {
-        return $this->user_action;
-    }
-
-    /**
-     * Defines the HTTP method to use to redirect the user to a return URL. A valid value is `GET` or `POST`.
-     *
-     * @param string $return_uri_http_method
-     * 
-     * @return $this
-     */
-    public function setReturnUriHttpMethod($return_uri_http_method)
-    {
-        $this->return_uri_http_method = $return_uri_http_method;
-        return $this;
-    }
-
-    /**
-     * Defines the HTTP method to use to redirect the user to a return URL. A valid value is `GET` or `POST`.
-     *
-     * @return string
-     */
-    public function getReturnUriHttpMethod()
-    {
-        return $this->return_uri_http_method;
-    }
-
 }
Index: /lib/PayPal/Api/FmfDetails.php
===================================================================
--- /lib/PayPal/Api/FmfDetails.php	(revision 8528)
+++ /lib/PayPal/Api/FmfDetails.php	(revision 5261)
@@ -45,5 +45,5 @@
     /**
      * Filter Identifier.
-     * Valid Values: ["AVS_NO_MATCH", "AVS_PARTIAL_MATCH", "AVS_UNAVAILABLE_OR_UNSUPPORTED", "CARD_SECURITY_CODE_MISMATCH", "MAXIMUM_TRANSACTION_AMOUNT", "UNCONFIRMED_ADDRESS", "COUNTRY_MONITOR", "LARGE_ORDER_NUMBER", "BILLING_OR_SHIPPING_ADDRESS_MISMATCH", "RISKY_ZIP_CODE", "SUSPECTED_FREIGHT_FORWARDER_CHECK", "TOTAL_PURCHASE_PRICE_MINIMUM", "IP_ADDRESS_VELOCITY", "RISKY_EMAIL_ADDRESS_DOMAIN_CHECK", "RISKY_BANK_IDENTIFICATION_NUMBER_CHECK", "RISKY_IP_ADDRESS_RANGE", "PAYPAL_FRAUD_MODEL"]
+     * Valid Values: ["AVS_NO_MATCH", "AVS_PARTIAL_MATCH", "AVS_UNAVAILABLE_OR_UNSUPPORTED", "CARD_SECURITY_CODE_MISMATCH", "MAXIMUM_TRANSACTION_AMOUNT", "UNCONFIRMED_ADDRESS", "COUNTRY_MONITOR", "LARGE_ORDER_NUMBER", "BILLING_OR_SHIPPING_ADDRESS_MATCH", "RISKY_ZIP_CODE", "SUSPECTED_FREIGHT_FORWARDER_CHECK", "TOTAL_PURCHASE_PRICE_MINIMUM", "IP_ADDRESS_VELOCITY", "RISKY_EMAIL_ADDRESS_DOMAIN_CHECK", "RISKY_BANK_IDENTIFICATION_NUMBER_CHECK", "RISKY_IP_ADDRESS_RANGE", "PAYPAL_FRAUD_MODEL"]
      *
      * @param string $filter_id
Index: /lib/PayPal/Api/FundingDetail.php
===================================================================
--- /lib/PayPal/Api/FundingDetail.php	(revision 8528)
+++ /lib/PayPal/Api/FundingDetail.php	(revision 5261)
@@ -14,6 +14,4 @@
  * @property string clearing_time
  * @property string payment_hold_date
- * @property string payment_debit_date
- * @property string processing_type
  */
 class FundingDetail extends PayPalModel
@@ -43,5 +41,5 @@
 
     /**
-     * [DEPRECATED] Hold-off duration of the payment. payment_debit_date should be used instead.
+     * Hold-off duration of the payment
      *
      * @param string $payment_hold_date
@@ -56,5 +54,5 @@
 
     /**
-     * @deprecated  [DEPRECATED] Hold-off duration of the payment. payment_debit_date should be used instead.
+     * Hold-off duration of the payment
      *
      * @return string
@@ -65,50 +63,3 @@
     }
 
-    /**
-     * Date when funds will be debited from the payer's account
-     *
-     * @param string $payment_debit_date
-     * 
-     * @return $this
-     */
-    public function setPaymentDebitDate($payment_debit_date)
-    {
-        $this->payment_debit_date = $payment_debit_date;
-        return $this;
-    }
-
-    /**
-     * Date when funds will be debited from the payer's account
-     *
-     * @return string
-     */
-    public function getPaymentDebitDate()
-    {
-        return $this->payment_debit_date;
-    }
-
-    /**
-     * Processing type of the payment card
-     * Valid Values: ["CUP_SECURE", "PINLESS_DEBIT"]
-     *
-     * @param string $processing_type
-     * 
-     * @return $this
-     */
-    public function setProcessingType($processing_type)
-    {
-        $this->processing_type = $processing_type;
-        return $this;
-    }
-
-    /**
-     * Processing type of the payment card
-     *
-     * @return string
-     */
-    public function getProcessingType()
-    {
-        return $this->processing_type;
-    }
-
 }
Index: /lib/PayPal/Api/FundingInstrument.php
===================================================================
--- /lib/PayPal/Api/FundingInstrument.php	(revision 8528)
+++ /lib/PayPal/Api/FundingInstrument.php	(revision 5261)
@@ -8,19 +8,26 @@
  * Class FundingInstrument
  *
- * A resource representing a Payer's funding instrument. An instance of this schema is valid if and only if it is valid against exactly one of these supported properties
+ * A resource representing a Payer's funding instrument.
  *
  * @package PayPal\Api
  *
  * @property \PayPal\Api\CreditCard credit_card
+ * @property \PayPal\Api\ExtendedBankAccount bank_account
  * @property \PayPal\Api\CreditCardToken credit_card_token
- * @property \PayPal\Api\Billing billing
+ * @property \PayPal\Api\Incentive incentive
+ * @property \PayPal\Api\PaymentCard payment_card
+ * @property \PayPal\Api\PaymentCardToken payment_card_token
+ * @property \PayPal\Api\BankToken bank_account_token
+ * @property \PayPal\Api\Credit credit
+ * @property \PayPal\Api\CarrierAccountToken carrier_account_token
+ *
  */
 class FundingInstrument extends PayPalModel
 {
     /**
-     * Credit Card instrument.
+     * Credit Card information.
      *
      * @param \PayPal\Api\CreditCard $credit_card
-     *
+     * 
      * @return $this
      */
@@ -32,5 +39,5 @@
 
     /**
-     * Credit Card instrument.
+     * Credit Card information.
      *
      * @return \PayPal\Api\CreditCard
@@ -42,8 +49,8 @@
 
     /**
-     * PayPal vaulted credit Card instrument.
+     * Credit Card information.
      *
      * @param \PayPal\Api\CreditCardToken $credit_card_token
-     *
+     * 
      * @return $this
      */
@@ -55,5 +62,5 @@
 
     /**
-     * PayPal vaulted credit Card instrument.
+     * Credit Card information.
      *
      * @return \PayPal\Api\CreditCardToken
@@ -68,5 +75,5 @@
      *
      * @param \PayPal\Api\PaymentCard $payment_card
-     *
+     * 
      * @return $this
      */
@@ -88,8 +95,31 @@
 
     /**
-     * Bank Account information.
-     * @deprecated Not publicly available
+     * Payment card token information.
+     *
+     * @param \PayPal\Api\PaymentCardToken $payment_card_token
+     * 
+     * @return $this
+     */
+    public function setPaymentCardToken($payment_card_token)
+    {
+        $this->payment_card_token = $payment_card_token;
+        return $this;
+    }
+
+    /**
+     * Payment card token information.
+     *
+     * @return \PayPal\Api\PaymentCardToken
+     */
+    public function getPaymentCardToken()
+    {
+        return $this->payment_card_token;
+    }
+
+    /**
+     * Bank Account information.
+     *
      * @param \PayPal\Api\ExtendedBankAccount $bank_account
-     *
+     * 
      * @return $this
      */
@@ -102,5 +132,5 @@
     /**
      * Bank Account information.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\ExtendedBankAccount
      */
@@ -111,8 +141,8 @@
 
     /**
-     * Vaulted bank account instrument.
-     * @deprecated Not publicly available
+     * Bank Account information.
+     *
      * @param \PayPal\Api\BankToken $bank_account_token
-     *
+     * 
      * @return $this
      */
@@ -124,6 +154,6 @@
 
     /**
-     * Vaulted bank account instrument.
-     * @deprecated Not publicly available
+     * Bank Account information.
+     *
      * @return \PayPal\Api\BankToken
      */
@@ -134,8 +164,8 @@
 
     /**
-     * PayPal credit funding instrument.
-     * @deprecated Not publicly available
+     * Credit funding information.
+     *
      * @param \PayPal\Api\Credit $credit
-     *
+     * 
      * @return $this
      */
@@ -147,6 +177,6 @@
 
     /**
-     * PayPal credit funding instrument.
-     * @deprecated Not publicly available
+     * Credit funding information.
+     *
      * @return \PayPal\Api\Credit
      */
@@ -157,6 +187,6 @@
 
     /**
-     * Incentive funding instrument.
-     * @deprecated Not publicly available
+     * Incentive funding information.
+     *
      * @param \PayPal\Api\Incentive $incentive
      *
@@ -170,6 +200,6 @@
 
     /**
-     * Incentive funding instrument.
-     * @deprecated Not publicly available
+     * Incentive funding information.
+     *
      * @return \PayPal\Api\Incentive
      */
@@ -180,29 +210,6 @@
 
     /**
-     * External funding instrument.
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\ExternalFunding $external_funding
-     *
-     * @return $this
-     */
-    public function setExternalFunding($external_funding)
-    {
-        $this->external_funding = $external_funding;
-        return $this;
-    }
-
-    /**
-     * External funding instrument.
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\ExternalFunding
-     */
-    public function getExternalFunding()
-    {
-        return $this->external_funding;
-    }
-
-    /**
-     * Carrier account token instrument.
-     * @deprecated Not publicly available
+     * Carrier account token information.
+     *
      * @param \PayPal\Api\CarrierAccountToken $carrier_account_token
      *
@@ -216,6 +223,6 @@
 
     /**
-     * Carrier account token instrument.
-     * @deprecated Not publicly available
+     * Carrier account token information.
+     *
      * @return \PayPal\Api\CarrierAccountToken
      */
@@ -225,97 +232,3 @@
     }
 
-    /**
-     * Carrier account instrument
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\CarrierAccount $carrier_account
-     *
-     * @return $this
-     */
-    public function setCarrierAccount($carrier_account)
-    {
-        $this->carrier_account = $carrier_account;
-        return $this;
-    }
-
-    /**
-     * Carrier account instrument
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\CarrierAccount
-     */
-    public function getCarrierAccount()
-    {
-        return $this->carrier_account;
-    }
-
-    /**
-     * Private Label Card funding instrument. These are store cards provided by merchants to drive business with value to customer with convenience and rewards.
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\PrivateLabelCard $private_label_card
-     *
-     * @return $this
-     */
-    public function setPrivateLabelCard($private_label_card)
-    {
-        $this->private_label_card = $private_label_card;
-        return $this;
-    }
-
-    /**
-     * Private Label Card funding instrument. These are store cards provided by merchants to drive business with value to customer with convenience and rewards.
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\PrivateLabelCard
-     */
-    public function getPrivateLabelCard()
-    {
-        return $this->private_label_card;
-    }
-
-    /**
-     * Billing instrument that references pre-approval information for the payment
-     *
-     * @param \PayPal\Api\Billing $billing
-     *
-     * @return $this
-     */
-    public function setBilling($billing)
-    {
-        $this->billing = $billing;
-        return $this;
-    }
-
-    /**
-     * Billing instrument that references pre-approval information for the payment
-     *
-     * @return \PayPal\Api\Billing
-     */
-    public function getBilling()
-    {
-        return $this->billing;
-    }
-
-    /**
-     * Alternate Payment  information - Mostly regional payment providers. For e.g iDEAL in Netherlands
-     *
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\AlternatePayment $alternate_payment
-     *
-     * @return $this
-     */
-    public function setAlternatePayment($alternate_payment)
-    {
-        $this->alternate_payment = $alternate_payment;
-        return $this;
-    }
-
-    /**
-     * Alternate Payment  information - Mostly regional payment providers. For e.g iDEAL in Netherlands
-     *
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\AlternatePayment
-     */
-    public function getAlternatePayment()
-    {
-        return $this->alternate_payment;
-    }
-
 }
Index: /lib/PayPal/Api/FundingSource.php
===================================================================
--- /lib/PayPal/Api/FundingSource.php	(revision 8528)
+++ /lib/PayPal/Api/FundingSource.php	(revision 5261)
@@ -16,15 +16,15 @@
  * @property string soft_descriptor
  * @property \PayPal\Api\Currency amount
- * @property \PayPal\Api\Currency negative_balance_amount
  * @property string legal_text
  * @property \PayPal\Api\FundingDetail funding_detail
  * @property string additional_text
+ * @property \PayPal\Api\FundingInstrument extends
  * @property \PayPal\Api\Links[] links
  */
-class FundingSource extends FundingInstrument
+class FundingSource extends PayPalModel
 {
     /**
      * specifies funding mode of the instrument
-     * Valid Values: ["INSTANT_TRANSFER", "MANUAL_BANK_TRANSFER", "DELAYED_TRANSFER", "ECHECK", "PAY_UPON_INVOICE"]
+     * Valid Values: ["INSTANT_TRANSFER", "MANUAL_BANK_TRANSFER", "DELAYED_TRANSFER", "ECHECK"]
      *
      * @param string $funding_mode
@@ -50,5 +50,5 @@
     /**
      * Instrument type for this funding source
-     * Valid Values: ["BALANCE", "PAYMENT_CARD", "BANK_ACCOUNT", "CREDIT", "INCENTIVE", "EXTERNAL_FUNDING", "TAB"]
+     * Valid Values: ["BALANCE", "PAYMENT_CARD", "BANK_ACCOUNT", "CREDIT", "INCENTIVE"]
      *
      * @param string $funding_instrument_type
@@ -119,27 +119,4 @@
 
     /**
-     * Additional amount to be pulled from the instrument to recover a negative balance on the buyer's account that is owed to PayPal.
-     *
-     * @param \PayPal\Api\Currency $negative_balance_amount
-     * 
-     * @return $this
-     */
-    public function setNegativeBalanceAmount($negative_balance_amount)
-    {
-        $this->negative_balance_amount = $negative_balance_amount;
-        return $this;
-    }
-
-    /**
-     * Additional amount to be pulled from the instrument to recover a negative balance on the buyer's account that is owed to PayPal.
-     *
-     * @return \PayPal\Api\Currency
-     */
-    public function getNegativeBalanceAmount()
-    {
-        return $this->negative_balance_amount;
-    }
-
-    /**
      * Localized legal text relevant to funding source.
      *
@@ -214,7 +191,5 @@
      *
      * @param \PayPal\Api\FundingInstrument $extends
-     *
-     * @deprecated Unused
-     *
+     * 
      * @return $this
      */
@@ -227,6 +202,4 @@
     /**
      * Gets Extends
-     *
-     * @deprecated Unused
      *
      * @return \PayPal\Api\FundingInstrument
Index: /lib/PayPal/Api/FuturePayment.php
===================================================================
--- /lib/PayPal/Api/FuturePayment.php	(revision 8528)
+++ /lib/PayPal/Api/FuturePayment.php	(revision 5261)
@@ -3,4 +3,5 @@
 namespace PayPal\Api;
 
+use PayPal\Common\PayPalModel;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
@@ -19,9 +20,11 @@
      * @param null $apiContext
      * @param string|null  $clientMetadataId
-     * @param PayPalRestCall|null $restCall is the Rest Call Service that is used to make rest calls
      * @return $this
      */
-    public function create($apiContext = null, $clientMetadataId = null, $restCall = null)
+    public function create($apiContext = null, $clientMetadataId = null)
     {
+        if ($apiContext == null) {
+            $apiContext = new ApiContext(self::$credential);
+        }
         $headers = array();
         if ($clientMetadataId != null) {
@@ -31,14 +34,16 @@
         }
         $payLoad = $this->toJSON();
-        $json = self::executeCall(
+        $call = new PayPalRestCall($apiContext);
+        $json = $call->execute(
+            array('PayPal\Handler\RestHandler'),
             "/v1/payments/payment",
             "POST",
             $payLoad,
-            $headers,
-            $apiContext,
-            $restCall
+            $headers
         );
         $this->fromJson($json);
+
         return $this;
+
     }
 
@@ -57,3 +62,15 @@
     }
 
+    /**
+     * Updates Access Token using long lived refresh token
+     *
+     * @param string|null $refreshToken
+     * @param ApiContext $apiContext
+     * @return void
+     */
+    public function updateAccessToken($refreshToken, $apiContext)
+    {
+        $apiContext = $apiContext ? $apiContext : new ApiContext(self::$credential);
+        $apiContext->getCredential()->updateAccessToken($apiContext->getConfig(), $refreshToken);
+    }
 }
Index: /lib/PayPal/Api/Incentive.php
===================================================================
--- /lib/PayPal/Api/Incentive.php	(revision 8528)
+++ /lib/PayPal/Api/Incentive.php	(revision 5261)
@@ -189,5 +189,5 @@
     /**
      * Specifies type of incentive
-     * Valid Values: ["COUPON", "GIFT_CARD", "MERCHANT_SPECIFIC_BALANCE", "VOUCHER"]
+     * Valid Values: ["COUPON", "GIFT_CARD", "MERCHANT_SPECIFIC_BALANCE"]
      *
      * @param string $type
Index: /lib/PayPal/Api/InputFields.php
===================================================================
--- /lib/PayPal/Api/InputFields.php	(revision 8528)
+++ /lib/PayPal/Api/InputFields.php	(revision 5261)
@@ -19,5 +19,6 @@
 {
     /**
-     * Indicates whether the buyer can enter a note to the merchant on the PayPal page during checkout.
+     * Enables the buyer to enter a note to the merchant on the PayPal page during checkout.
+     * 
      *
      * @param bool $allow_note
@@ -32,5 +33,5 @@
 
     /**
-     * Indicates whether the buyer can enter a note to the merchant on the PayPal page during checkout.
+     * Enables the buyer to enter a note to the merchant on the PayPal page during checkout.
      *
      * @return bool
@@ -42,5 +43,6 @@
 
     /**
-     * Indicates whether PayPal displays shipping address fields on the experience pages. Valid value is `0`, `1`, or `2`. Set to `0` to display the shipping address on the PayPal pages. Set to `1` to redact shipping address fields from the PayPal pages. Set to `2` to not pass the shipping address but instead get it from the buyer's account profile. For digital goods, this field is required and value must be `1`.
+     * Determines whether or not PayPal displays shipping address fields on the experience pages. Allowed values: `0`, `1`, or `2`. When set to `0`, PayPal displays the shipping address on the PayPal pages. When set to `1`, PayPal does not display shipping address fields whatsoever. When set to `2`, if you do not pass the shipping address, PayPal obtains it from the buyer's account profile. For digital goods, this field is required, and you must set it to `1`. 
+     * 
      *
      * @param int $no_shipping
@@ -55,5 +57,5 @@
 
     /**
-     * Indicates whether PayPal displays shipping address fields on the experience pages. Valid value is `0`, `1`, or `2`. Set to `0` to display the shipping address on the PayPal pages. Set to `1` to redact shipping address fields from the PayPal pages. Set to `2` to not pass the shipping address but instead get it from the buyer's account profile. For digital goods, this field is required and value must be `1`.
+     * Determines whether or not PayPal displays shipping address fields on the experience pages. Allowed values: `0`, `1`, or `2`. When set to `0`, PayPal displays the shipping address on the PayPal pages. When set to `1`, PayPal does not display shipping address fields whatsoever. When set to `2`, if you do not pass the shipping address, PayPal obtains it from the buyer's account profile. For digital goods, this field is required, and you must set it to `1`. 
      *
      * @return int
@@ -65,5 +67,6 @@
 
     /**
-     * Indicates whether to display the shipping address that is passed to this call rather than the one on file with PayPal for this buyer on the PayPal experience pages. Valid value is `0` or `1`. Set to `0` to display the shipping address on file. Set to `1` to display the shipping address supplied to this call; the buyer cannot edit this shipping address.
+     * Determines whether or not the PayPal pages should display the shipping address and not the shipping address on file with PayPal for this buyer. Displaying the PayPal street address on file does not allow the buyer to edit that address. Allowed values: `0` or `1`. When set to `0`, the PayPal pages should not display the shipping address. When set to `1`, the PayPal pages should display the shipping address.
+     * 
      *
      * @param int $address_override
@@ -78,5 +81,5 @@
 
     /**
-     * Indicates whether to display the shipping address that is passed to this call rather than the one on file with PayPal for this buyer on the PayPal experience pages. Valid value is `0` or `1`. Set to `0` to display the shipping address on file. Set to `1` to display the shipping address supplied to this call; the buyer cannot edit this shipping address.
+     * Determines whether or not the PayPal pages should display the shipping address and not the shipping address on file with PayPal for this buyer. Displaying the PayPal street address on file does not allow the buyer to edit that address. Allowed values: `0` or `1`. When set to `0`, the PayPal pages should not display the shipping address. When set to `1`, the PayPal pages should display the shipping address.
      *
      * @return int
Index: /lib/PayPal/Api/InstallmentOption.php
===================================================================
--- /lib/PayPal/Api/InstallmentOption.php	(revision 8528)
+++ /lib/PayPal/Api/InstallmentOption.php	(revision 5261)
@@ -4,4 +4,6 @@
 
 use PayPal\Common\PayPalModel;
+use PayPal\Converter\FormatConverter;
+use PayPal\Validation\NumericValidator;
 
 /**
@@ -97,4 +99,6 @@
     public function setDiscountPercentage($discount_percentage)
     {
+        NumericValidator::validate($discount_percentage, "Discount Percentage");
+        $discount_percentage = FormatConverter::formatToPrice($discount_percentage);
         $this->discount_percentage = $discount_percentage;
         return $this;
@@ -111,3 +115,4 @@
     }
 
+
 }
Index: /lib/PayPal/Api/Invoice.php
===================================================================
--- /lib/PayPal/Api/Invoice.php	(revision 8528)
+++ /lib/PayPal/Api/Invoice.php	(revision 5261)
@@ -4,7 +4,7 @@
 
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 use PayPal\Validation\UrlValidator;
 
@@ -18,20 +18,15 @@
  * @property string id
  * @property string number
- * @property string template_id
  * @property string uri
  * @property string status
  * @property \PayPal\Api\MerchantInfo merchant_info
  * @property \PayPal\Api\BillingInfo[] billing_info
- * @property \PayPal\Api\Participant[] cc_info
  * @property \PayPal\Api\ShippingInfo shipping_info
  * @property \PayPal\Api\InvoiceItem[] items
  * @property string invoice_date
  * @property \PayPal\Api\PaymentTerm payment_term
- * @property string reference
  * @property \PayPal\Api\Cost discount
  * @property \PayPal\Api\ShippingCost shipping_cost
  * @property \PayPal\Api\CustomAmount custom
- * @property bool allow_partial_payment
- * @property \PayPal\Api\Currency minimum_amount_due
  * @property bool tax_calculated_after_discount
  * @property bool tax_inclusive
@@ -44,12 +39,10 @@
  * @property \PayPal\Api\RefundDetail[] refunds
  * @property \PayPal\Api\Metadata metadata
- * @property \PayPal\Api\PaymentSummary paid_amount
- * @property \PayPal\Api\PaymentSummary refunded_amount
- * @property \PayPal\Api\FileAttachment[] attachments
+ * @property string additional_data
  */
 class Invoice extends PayPalResourceModel
 {
     /**
-     * The unique invoice resource identifier.
+     * Unique invoice resource identifier.
      *
      * @param string $id
@@ -64,5 +57,5 @@
 
     /**
-     * The unique invoice resource identifier.
+     * Unique invoice resource identifier.
      *
      * @return string
@@ -97,68 +90,45 @@
 
     /**
-     * The template ID used for the invoice. Useful for copy functionality.
-     *
-     * @param string $template_id
-     * 
-     * @return $this
-     */
-    public function setTemplateId($template_id)
-    {
-        $this->template_id = $template_id;
-        return $this;
-    }
-
-    /**
-     * The template ID used for the invoice. Useful for copy functionality.
+     * URI of the invoice resource.
+     *
+     * @param string $uri
+     * 
+     * @return $this
+     */
+    public function setUri($uri)
+    {
+        $this->uri = $uri;
+        return $this;
+    }
+
+    /**
+     * URI of the invoice resource.
      *
      * @return string
      */
-    public function getTemplateId()
-    {
-        return $this->template_id;
-    }
-
-    /**
-     * URI of the invoice resource.
-     *
-     * @param string $uri
-     * 
-     * @return $this
-     */
-    public function setUri($uri)
-    {
-        $this->uri = $uri;
-        return $this;
-    }
-
-    /**
-     * URI of the invoice resource.
+    public function getUri()
+    {
+        return $this->uri;
+    }
+
+    /**
+     * Status of the invoice.
+     * Valid Values: ["DRAFT", "SENT", "PAID", "MARKED_AS_PAID", "CANCELLED", "REFUNDED", "PARTIALLY_REFUNDED", "MARKED_AS_REFUNDED"]
+     *
+     * @param string $status
+     * 
+     * @return $this
+     */
+    public function setStatus($status)
+    {
+        $this->status = $status;
+        return $this;
+    }
+
+    /**
+     * Status of the invoice.
      *
      * @return string
      */
-    public function getUri()
-    {
-        return $this->uri;
-    }
-
-    /**
-     * Status of the invoice.
-     * Valid Values: ["DRAFT", "SENT", "PAID", "MARKED_AS_PAID", "CANCELLED", "REFUNDED", "PARTIALLY_REFUNDED", "MARKED_AS_REFUNDED", "UNPAID", "PAYMENT_PENDING"]
-     *
-     * @param string $status
-     * 
-     * @return $this
-     */
-    public function setStatus($status)
-    {
-        $this->status = $status;
-        return $this;
-    }
-
-    /**
-     * Status of the invoice.
-     *
-     * @return string
-     */
     public function getStatus()
     {
@@ -190,5 +160,5 @@
 
     /**
-     * The required invoice recipient email address and any optional billing information. One recipient is supported.
+     * Email address of invoice recipient (required) and optional billing information. (Note: We currently only allow one recipient).
      *
      * @param \PayPal\Api\BillingInfo[] $billing_info
@@ -203,5 +173,5 @@
 
     /**
-     * The required invoice recipient email address and any optional billing information. One recipient is supported.
+     * Email address of invoice recipient (required) and optional billing information. (Note: We currently only allow one recipient).
      *
      * @return \PayPal\Api\BillingInfo[]
@@ -243,58 +213,5 @@
 
     /**
-     * For invoices sent by email, one or more email addresses to which to send a Cc: copy of the notification. Supports only email addresses under participant.
-     *
-     * @param \PayPal\Api\Participant[] $cc_info
-     * 
-     * @return $this
-     */
-    public function setCcInfo($cc_info)
-    {
-        $this->cc_info = $cc_info;
-        return $this;
-    }
-
-    /**
-     * For invoices sent by email, one or more email addresses to which to send a Cc: copy of the notification. Supports only email addresses under participant.
-     *
-     * @return \PayPal\Api\Participant[]
-     */
-    public function getCcInfo()
-    {
-        return $this->cc_info;
-    }
-
-    /**
-     * Append CcInfo to the list.
-     *
-     * @param \PayPal\Api\Participant $participant
-     * @return $this
-     */
-    public function addCcInfo($participant)
-    {
-        if (!$this->getCcInfo()) {
-            return $this->setCcInfo(array($participant));
-        } else {
-            return $this->setCcInfo(
-                array_merge($this->getCcInfo(), array($participant))
-            );
-        }
-    }
-
-    /**
-     * Remove CcInfo from the list.
-     *
-     * @param \PayPal\Api\Participant $participant
-     * @return $this
-     */
-    public function removeCcInfo($participant)
-    {
-        return $this->setCcInfo(
-            array_diff($this->getCcInfo(), array($participant))
-        );
-    }
-
-    /**
-     * The shipping information for entities to whom items are being shipped.
+     * Shipping information for entities to whom items are being shipped.
      *
      * @param \PayPal\Api\ShippingInfo $shipping_info
@@ -309,5 +226,5 @@
 
     /**
-     * The shipping information for entities to whom items are being shipped.
+     * Shipping information for entities to whom items are being shipped.
      *
      * @return \PayPal\Api\ShippingInfo
@@ -319,5 +236,5 @@
 
     /**
-     * The list of items to include in the invoice. Maximum value is 100 items per invoice.
+     * List of items included in the invoice. 100 items max per invoice.
      *
      * @param \PayPal\Api\InvoiceItem[] $items
@@ -332,5 +249,5 @@
 
     /**
-     * The list of items to include in the invoice. Maximum value is 100 items per invoice.
+     * List of items included in the invoice. 100 items max per invoice.
      *
      * @return \PayPal\Api\InvoiceItem[]
@@ -372,5 +289,5 @@
 
     /**
-     * The date when the invoice was enabled. The date format is *yyyy*-*MM*-*dd* *z* as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date on which the invoice was enabled. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $invoice_date
@@ -385,5 +302,5 @@
 
     /**
-     * The date when the invoice was enabled. The date format is *yyyy*-*MM*-*dd* *z* as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date on which the invoice was enabled. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -395,5 +312,5 @@
 
     /**
-     * Optional. The payment deadline for the invoice. Value is either `term_type` or `due_date` but not both.
+     * Optional field to pass payment deadline for the invoice. Either term_type or due_date can be passed, but not both.
      *
      * @param \PayPal\Api\PaymentTerm $payment_term
@@ -408,5 +325,5 @@
 
     /**
-     * Optional. The payment deadline for the invoice. Value is either `term_type` or `due_date` but not both.
+     * Optional field to pass payment deadline for the invoice. Either term_type or due_date can be passed, but not both.
      *
      * @return \PayPal\Api\PaymentTerm
@@ -418,251 +335,182 @@
 
     /**
-     * Reference data, such as PO number, to add to the invoice. Maximum length is 60 characters.
-     *
-     * @param string $reference
-     * 
-     * @return $this
-     */
-    public function setReference($reference)
-    {
-        $this->reference = $reference;
-        return $this;
-    }
-
-    /**
-     * Reference data, such as PO number, to add to the invoice. Maximum length is 60 characters.
+     * Invoice level discount in percent or amount.
+     *
+     * @param \PayPal\Api\Cost $discount
+     * 
+     * @return $this
+     */
+    public function setDiscount($discount)
+    {
+        $this->discount = $discount;
+        return $this;
+    }
+
+    /**
+     * Invoice level discount in percent or amount.
+     *
+     * @return \PayPal\Api\Cost
+     */
+    public function getDiscount()
+    {
+        return $this->discount;
+    }
+
+    /**
+     * Shipping cost in percent or amount.
+     *
+     * @param \PayPal\Api\ShippingCost $shipping_cost
+     * 
+     * @return $this
+     */
+    public function setShippingCost($shipping_cost)
+    {
+        $this->shipping_cost = $shipping_cost;
+        return $this;
+    }
+
+    /**
+     * Shipping cost in percent or amount.
+     *
+     * @return \PayPal\Api\ShippingCost
+     */
+    public function getShippingCost()
+    {
+        return $this->shipping_cost;
+    }
+
+    /**
+     * Custom amount applied on an invoice. If a label is included then the amount cannot be empty.
+     *
+     * @param \PayPal\Api\CustomAmount $custom
+     * 
+     * @return $this
+     */
+    public function setCustom($custom)
+    {
+        $this->custom = $custom;
+        return $this;
+    }
+
+    /**
+     * Custom amount applied on an invoice. If a label is included then the amount cannot be empty.
+     *
+     * @return \PayPal\Api\CustomAmount
+     */
+    public function getCustom()
+    {
+        return $this->custom;
+    }
+
+    /**
+     * Indicates whether tax is calculated before or after a discount. If false (the default), the tax is calculated before a discount. If true, the tax is calculated after a discount.
+     *
+     * @param bool $tax_calculated_after_discount
+     * 
+     * @return $this
+     */
+    public function setTaxCalculatedAfterDiscount($tax_calculated_after_discount)
+    {
+        $this->tax_calculated_after_discount = $tax_calculated_after_discount;
+        return $this;
+    }
+
+    /**
+     * Indicates whether tax is calculated before or after a discount. If false (the default), the tax is calculated before a discount. If true, the tax is calculated after a discount.
+     *
+     * @return bool
+     */
+    public function getTaxCalculatedAfterDiscount()
+    {
+        return $this->tax_calculated_after_discount;
+    }
+
+    /**
+     * A flag indicating whether the unit price includes tax. Default is false
+     *
+     * @param bool $tax_inclusive
+     * 
+     * @return $this
+     */
+    public function setTaxInclusive($tax_inclusive)
+    {
+        $this->tax_inclusive = $tax_inclusive;
+        return $this;
+    }
+
+    /**
+     * A flag indicating whether the unit price includes tax. Default is false
+     *
+     * @return bool
+     */
+    public function getTaxInclusive()
+    {
+        return $this->tax_inclusive;
+    }
+
+    /**
+     * General terms of the invoice. 4000 characters max.
+     *
+     * @param string $terms
+     * 
+     * @return $this
+     */
+    public function setTerms($terms)
+    {
+        $this->terms = $terms;
+        return $this;
+    }
+
+    /**
+     * General terms of the invoice. 4000 characters max.
      *
      * @return string
      */
-    public function getReference()
-    {
-        return $this->reference;
-    }
-
-    /**
-     * The invoice level discount, as a percent or an amount value.
-     *
-     * @param \PayPal\Api\Cost $discount
-     * 
-     * @return $this
-     */
-    public function setDiscount($discount)
-    {
-        $this->discount = $discount;
-        return $this;
-    }
-
-    /**
-     * The invoice level discount, as a percent or an amount value.
-     *
-     * @return \PayPal\Api\Cost
-     */
-    public function getDiscount()
-    {
-        return $this->discount;
-    }
-
-    /**
-     * The shipping cost, as a percent or an amount value.
-     *
-     * @param \PayPal\Api\ShippingCost $shipping_cost
-     * 
-     * @return $this
-     */
-    public function setShippingCost($shipping_cost)
-    {
-        $this->shipping_cost = $shipping_cost;
-        return $this;
-    }
-
-    /**
-     * The shipping cost, as a percent or an amount value.
-     *
-     * @return \PayPal\Api\ShippingCost
-     */
-    public function getShippingCost()
-    {
-        return $this->shipping_cost;
-    }
-
-    /**
-     * The custom amount to apply on an invoice. If you include a label, the amount cannot be empty.
-     *
-     * @param \PayPal\Api\CustomAmount $custom
-     * 
-     * @return $this
-     */
-    public function setCustom($custom)
-    {
-        $this->custom = $custom;
-        return $this;
-    }
-
-    /**
-     * The custom amount to apply on an invoice. If you include a label, the amount cannot be empty.
-     *
-     * @return \PayPal\Api\CustomAmount
-     */
-    public function getCustom()
-    {
-        return $this->custom;
-    }
-
-    /**
-     * Indicates whether the invoice allows a partial payment. If set to `false`, invoice must be paid in full. If set to `true`, the invoice allows partial payments. Default is `false`.
-     *
-     * @param bool $allow_partial_payment
-     * 
-     * @return $this
-     */
-    public function setAllowPartialPayment($allow_partial_payment)
-    {
-        $this->allow_partial_payment = $allow_partial_payment;
-        return $this;
-    }
-
-    /**
-     * Indicates whether the invoice allows a partial payment. If set to `false`, invoice must be paid in full. If set to `true`, the invoice allows partial payments. Default is `false`.
-     *
-     * @return bool
-     */
-    public function getAllowPartialPayment()
-    {
-        return $this->allow_partial_payment;
-    }
-
-    /**
-     * If `allow_partial_payment` is set to `true`, the minimum amount allowed for a partial payment.
-     *
-     * @param \PayPal\Api\Currency $minimum_amount_due
-     * 
-     * @return $this
-     */
-    public function setMinimumAmountDue($minimum_amount_due)
-    {
-        $this->minimum_amount_due = $minimum_amount_due;
-        return $this;
-    }
-
-    /**
-     * If `allow_partial_payment` is set to `true`, the minimum amount allowed for a partial payment.
-     *
-     * @return \PayPal\Api\Currency
-     */
-    public function getMinimumAmountDue()
-    {
-        return $this->minimum_amount_due;
-    }
-
-    /**
-     * Indicates whether tax is calculated before or after a discount. If set to `false`, the tax is calculated before a discount. If set to `true`, the tax is calculated after a discount. Default is `false`.
-     *
-     * @param bool $tax_calculated_after_discount
-     * 
-     * @return $this
-     */
-    public function setTaxCalculatedAfterDiscount($tax_calculated_after_discount)
-    {
-        $this->tax_calculated_after_discount = $tax_calculated_after_discount;
-        return $this;
-    }
-
-    /**
-     * Indicates whether tax is calculated before or after a discount. If set to `false`, the tax is calculated before a discount. If set to `true`, the tax is calculated after a discount. Default is `false`.
-     *
-     * @return bool
-     */
-    public function getTaxCalculatedAfterDiscount()
-    {
-        return $this->tax_calculated_after_discount;
-    }
-
-    /**
-     * Indicates whether the unit price includes tax. Default is `false`.
-     *
-     * @param bool $tax_inclusive
-     * 
-     * @return $this
-     */
-    public function setTaxInclusive($tax_inclusive)
-    {
-        $this->tax_inclusive = $tax_inclusive;
-        return $this;
-    }
-
-    /**
-     * Indicates whether the unit price includes tax. Default is `false`.
-     *
-     * @return bool
-     */
-    public function getTaxInclusive()
-    {
-        return $this->tax_inclusive;
-    }
-
-    /**
-     * General terms of the invoice. 4000 characters max.
-     *
-     * @param string $terms
-     * 
-     * @return $this
-     */
-    public function setTerms($terms)
-    {
-        $this->terms = $terms;
-        return $this;
-    }
-
-    /**
-     * General terms of the invoice. 4000 characters max.
+    public function getTerms()
+    {
+        return $this->terms;
+    }
+
+    /**
+     * Note to the payer. 4000 characters max.
+     *
+     * @param string $note
+     * 
+     * @return $this
+     */
+    public function setNote($note)
+    {
+        $this->note = $note;
+        return $this;
+    }
+
+    /**
+     * Note to the payer. 4000 characters max.
      *
      * @return string
      */
-    public function getTerms()
-    {
-        return $this->terms;
-    }
-
-    /**
-     * Note to the payer. 4000 characters max.
-     *
-     * @param string $note
-     * 
-     * @return $this
-     */
-    public function setNote($note)
-    {
-        $this->note = $note;
-        return $this;
-    }
-
-    /**
-     * Note to the payer. 4000 characters max.
+    public function getNote()
+    {
+        return $this->note;
+    }
+
+    /**
+     * Bookkeeping memo that is private to the merchant. 150 characters max.
+     *
+     * @param string $merchant_memo
+     * 
+     * @return $this
+     */
+    public function setMerchantMemo($merchant_memo)
+    {
+        $this->merchant_memo = $merchant_memo;
+        return $this;
+    }
+
+    /**
+     * Bookkeeping memo that is private to the merchant. 150 characters max.
      *
      * @return string
      */
-    public function getNote()
-    {
-        return $this->note;
-    }
-
-    /**
-     * A private bookkeeping memo for the merchant. Maximum length is 150 characters.
-     *
-     * @param string $merchant_memo
-     * 
-     * @return $this
-     */
-    public function setMerchantMemo($merchant_memo)
-    {
-        $this->merchant_memo = $merchant_memo;
-        return $this;
-    }
-
-    /**
-     * A private bookkeeping memo for the merchant. Maximum length is 150 characters.
-     *
-     * @return string
-     */
     public function getMerchantMemo()
     {
@@ -671,5 +519,5 @@
 
     /**
-     * Full URL of an external image to use as the logo. Maximum length is 4000 characters.
+     * Full URL of an external image to use as the logo. 4000 characters max.
      *
      * @param string $logo_url
@@ -685,5 +533,5 @@
 
     /**
-     * Full URL of an external image to use as the logo. Maximum length is 4000 characters.
+     * Full URL of an external image to use as the logo. 4000 characters max.
      *
      * @return string
@@ -741,10 +589,10 @@
 
     /**
-     * Append Payments to the list.
+     * Append PaymentDetails to the list.
      *
      * @param \PayPal\Api\PaymentDetail $paymentDetail
      * @return $this
      */
-    public function addPayment($paymentDetail)
+    public function addPaymentDetail($paymentDetail)
     {
         if (!$this->getPayments()) {
@@ -758,10 +606,10 @@
 
     /**
-     * Remove Payments from the list.
+     * Remove PaymentDetails from the list.
      *
      * @param \PayPal\Api\PaymentDetail $paymentDetail
      * @return $this
      */
-    public function removePayment($paymentDetail)
+    public function removePaymentDetail($paymentDetail)
     {
         return $this->setPayments(
@@ -794,10 +642,10 @@
 
     /**
-     * Append Refunds to the list.
+     * Append RefundDetails to the list.
      *
      * @param \PayPal\Api\RefundDetail $refundDetail
      * @return $this
      */
-    public function addRefund($refundDetail)
+    public function addRefundDetail($refundDetail)
     {
         if (!$this->getRefunds()) {
@@ -811,10 +659,10 @@
 
     /**
-     * Remove Refunds from the list.
+     * Remove RefundDetails from the list.
      *
      * @param \PayPal\Api\RefundDetail $refundDetail
      * @return $this
      */
-    public function removeRefund($refundDetail)
+    public function removeRefundDetail($refundDetail)
     {
         return $this->setRefunds(
@@ -847,6 +695,6 @@
 
     /**
-     * Any miscellaneous invoice data. Maximum length is 4000 characters.
-     * @deprecated Not publicly available
+     * Any miscellaneous invoice data. 4000 characters max.
+     *
      * @param string $additional_data
      * 
@@ -860,6 +708,6 @@
 
     /**
-     * Any miscellaneous invoice data. Maximum length is 4000 characters.
-     * @deprecated Not publicly available
+     * Any miscellaneous invoice data. 4000 characters max.
+     *
      * @return string
      */
@@ -870,104 +718,5 @@
 
     /**
-     * Payment summary of the invoice including amount paid through PayPal and other sources.
-     *
-     * @param \PayPal\Api\PaymentSummary $paid_amount
-     * 
-     * @return $this
-     */
-    public function setPaidAmount($paid_amount)
-    {
-        $this->paid_amount = $paid_amount;
-        return $this;
-    }
-
-    /**
-     * Payment summary of the invoice including amount paid through PayPal and other sources.
-     *
-     * @return \PayPal\Api\PaymentSummary
-     */
-    public function getPaidAmount()
-    {
-        return $this->paid_amount;
-    }
-
-    /**
-     * Payment summary of the invoice including amount refunded through PayPal and other sources.
-     *
-     * @param \PayPal\Api\PaymentSummary $refunded_amount
-     * 
-     * @return $this
-     */
-    public function setRefundedAmount($refunded_amount)
-    {
-        $this->refunded_amount = $refunded_amount;
-        return $this;
-    }
-
-    /**
-     * Payment summary of the invoice including amount refunded through PayPal and other sources.
-     *
-     * @return \PayPal\Api\PaymentSummary
-     */
-    public function getRefundedAmount()
-    {
-        return $this->refunded_amount;
-    }
-
-    /**
-     * List of files attached to the invoice.
-     *
-     * @param \PayPal\Api\FileAttachment[] $attachments
-     * 
-     * @return $this
-     */
-    public function setAttachments($attachments)
-    {
-        $this->attachments = $attachments;
-        return $this;
-    }
-
-    /**
-     * List of files attached to the invoice.
-     *
-     * @return \PayPal\Api\FileAttachment[]
-     */
-    public function getAttachments()
-    {
-        return $this->attachments;
-    }
-
-    /**
-     * Append Attachments to the list.
-     *
-     * @param \PayPal\Api\FileAttachment $fileAttachment
-     * @return $this
-     */
-    public function addAttachment($fileAttachment)
-    {
-        if (!$this->getAttachments()) {
-            return $this->setAttachments(array($fileAttachment));
-        } else {
-            return $this->setAttachments(
-                array_merge($this->getAttachments(), array($fileAttachment))
-            );
-        }
-    }
-
-    /**
-     * Remove Attachments from the list.
-     *
-     * @param \PayPal\Api\FileAttachment $fileAttachment
-     * @return $this
-     */
-    public function removeAttachment($fileAttachment)
-    {
-        return $this->setAttachments(
-            array_diff($this->getAttachments(), array($fileAttachment))
-        );
-    }
-
-    /**
-     * Creates an invoice. Include invoice details including merchant information in the request.
+     * Create a new invoice by passing the details for the invoice, including the merchant_info, to the request URI.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -991,5 +740,5 @@
 
     /**
-     * Searches for an invoice or invoices. Include a search object that specifies your search criteria in the request.
+     * Search for a specific invoice or invoices by passing a search object that specifies your search criteria to the request URI.
      *
      * @param Search $search
@@ -1016,5 +765,5 @@
 
     /**
-     * Sends an invoice, by ID, to a recipient. Optionally, set the `notify_merchant` query parameter to send the merchant an invoice update notification. By default, `notify_merchant` is `true`.
+     * Send a specific invoice to its intended recipient by passing the invoice ID to the request URI. Optionally, you can specify whether to send the merchant an invoice update notification by using the notify_merchant query parameter. By default, notify_merchant is true.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -1038,5 +787,5 @@
 
     /**
-     * Sends a reminder about a specific invoice, by ID, to a recipient. Include a notification object that defines the reminder subject and other details in the JSON request body.
+     * Send a reminder about a specific invoice to its intended recipient by providing the ID of the invoice in the request URI. In addition, pass a notification object that specifies the subject of the reminder and other details in the request JSON.
      *
      * @param Notification $notification
@@ -1062,5 +811,5 @@
 
     /**
-     * Cancels an invoice, by ID.
+     * Cancel an invoice by passing the invoice ID to the request URI.
      *
      * @param CancelNotification $cancelNotification
@@ -1086,5 +835,5 @@
 
     /**
-     * Marks the status of a specified invoice, by ID, as paid. Include a payment detail object that defines the payment method and other details in the JSON request body.
+     * Mark the status of an invoice as paid by passing the invoice ID to the request URI. In addition, pass a payment detail object that specifies the payment method and other details in the request JSON.
      *
      * @param PaymentDetail $paymentDetail
@@ -1110,5 +859,5 @@
 
     /**
-     * Marks the status of a specified invoice, by ID, as refunded. Include a refund detail object that defines the refund type and other details in the JSON request body.
+     * Mark the status of an invoice as refunded by passing the invoice ID to the request URI. In addition, pass a refund-detail object that specifies the type of refund and other details in the request JSON.
      *
      * @param RefundDetail $refundDetail
@@ -1134,5 +883,5 @@
 
     /**
-     * Gets the details for a specified invoice, by ID.
+     * Retrieve the details for a particular invoice by passing the invoice ID to the request URI.
      *
      * @param string $invoiceId
@@ -1159,5 +908,5 @@
 
     /**
-     * Lists some or all merchant invoices. Filters the response by any specified optional query string parameters.
+     * List some or all invoices for a merchant according to optional query string parameters specified.
      *
      * @param array $params
@@ -1191,5 +940,5 @@
 
     /**
-     * Fully updates an invoice by passing the invoice ID to the request URI. In addition, pass a complete invoice object in the request JSON. Partial updates are not supported.
+     * Fully update an invoice by passing the invoice ID to the request URI. In addition, pass a complete invoice object in the request JSON. Partial updates are not supported.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -1236,50 +985,4 @@
 
     /**
-     * Delete external payment.
-     *
-     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
-     * @return bool
-     */
-    public function deleteExternalPayment($transactionId, $apiContext = null, $restCall = null)
-    {
-        ArgumentValidator::validate($this->getId(), "Id");
-        ArgumentValidator::validate($transactionId, "TransactionId");
-        $payLoad = "";
-        self::executeCall(
-            "/v1/invoicing/invoices/{$this->getId()}/payment-records/{$transactionId}",
-            "DELETE",
-            $payLoad,
-            null,
-            $apiContext,
-            $restCall
-        );
-        return true;
-    }
-
-    /**
-     * Delete external refund.
-     *
-     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
-     * @return bool
-     */
-    public function deleteExternalRefund($transactionId, $apiContext = null, $restCall = null)
-    {
-        ArgumentValidator::validate($this->getId(), "Id");
-        ArgumentValidator::validate($transactionId, "TransactionId");
-        $payLoad = "";
-        self::executeCall(
-            "/v1/invoicing/invoices/{$this->getId()}/refund-records/{$transactionId}",
-            "DELETE",
-            $payLoad,
-            null,
-            $apiContext,
-            $restCall
-        );
-        return true;
-    }
-
-    /**
      * Generate a QR code for an invoice by passing the invoice ID to the request URI. The request generates a QR code that is 500 pixels in width and height. You can change the dimensions of the returned code by specifying optional query parameters.
      *
@@ -1315,26 +1018,3 @@
     }
 
-    /**
-     * Generates the successive invoice number.
-     *
-     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
-     * @return InvoiceNumber
-     */
-    public static function generateNumber($apiContext = null, $restCall = null)
-    {
-        $payLoad = "";
-        $json = self::executeCall(
-            "/v1/invoicing/invoices/next-invoice-number",
-            "POST",
-            $payLoad,
-            null,
-            $apiContext,
-            $restCall
-        );
-        $ret = new InvoiceNumber();
-        $ret->fromJson($json);
-        return $ret;
-    }
-
 }
Index: /lib/PayPal/Api/InvoiceAddress.php
===================================================================
--- /lib/PayPal/Api/InvoiceAddress.php	(revision 8528)
+++ /lib/PayPal/Api/InvoiceAddress.php	(revision 5261)
@@ -2,4 +2,6 @@
 
 namespace PayPal\Api;
+
+use PayPal\Common\PayPalModel;
 
 /**
@@ -12,5 +14,5 @@
  * @property \PayPal\Api\Phone phone
  */
-class InvoiceAddress extends BaseAddress
+class InvoiceAddress extends BaseAddress 
 {
     /**
Index: /lib/PayPal/Api/InvoiceItem.php
===================================================================
--- /lib/PayPal/Api/InvoiceItem.php	(revision 8528)
+++ /lib/PayPal/Api/InvoiceItem.php	(revision 5261)
@@ -6,5 +6,4 @@
 use PayPal\Converter\FormatConverter;
 use PayPal\Validation\NumericValidator;
-use PayPal\Validation\UrlValidator;
 
 /**
@@ -22,10 +21,9 @@
  * @property string date
  * @property \PayPal\Api\Cost discount
- * @property string unit_of_measure
  */
 class InvoiceItem extends PayPalModel
 {
     /**
-     * Name of the item. 200 characters max.
+     * Name of the item. 60 characters max.
      *
      * @param string $name
@@ -40,5 +38,5 @@
 
     /**
-     * Name of the item. 200 characters max.
+     * Name of the item. 60 characters max.
      *
      * @return string
@@ -73,5 +71,5 @@
 
     /**
-     * Quantity of the item. Range of -10000 to 10000.
+     * Quantity of the item. Range of 0 to 9999.999.
      *
      * @param string|double $quantity
@@ -81,5 +79,5 @@
     public function setQuantity($quantity)
     {
-        NumericValidator::validate($quantity, "Quantity");
+        NumericValidator::validate($quantity, "Percent");
         $quantity = FormatConverter::formatToPrice($quantity);
         $this->quantity = $quantity;
@@ -88,5 +86,5 @@
 
     /**
-     * Quantity of the item. Range of -10000 to 10000.
+     * Quantity of the item. Range of 0 to 9999.999.
      *
      * @return string
@@ -98,5 +96,5 @@
 
     /**
-     * Unit price of the item. Range of -1,000,000 to 1,000,000.
+     * Unit price of the item. Range of -999999.99 to 999999.99.
      *
      * @param \PayPal\Api\Currency $unit_price
@@ -111,5 +109,5 @@
 
     /**
-     * Unit price of the item. Range of -1,000,000 to 1,000,000.
+     * Unit price of the item. Range of -999999.99 to 999999.99.
      *
      * @return \PayPal\Api\Currency
@@ -144,5 +142,5 @@
 
     /**
-     * The date when the item or service was provided. The date format is *yyyy*-*MM*-*dd* *z* as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date on which the item or service was provided. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $date
@@ -157,5 +155,5 @@
 
     /**
-     * The date when the item or service was provided. The date format is *yyyy*-*MM*-*dd* *z* as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date on which the item or service was provided. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -167,5 +165,5 @@
 
     /**
-     * The item discount, as a percent or an amount value.
+     * Item discount in percent or amount.
      *
      * @param \PayPal\Api\Cost $discount
@@ -180,5 +178,5 @@
 
     /**
-     * The item discount, as a percent or an amount value.
+     * Item discount in percent or amount.
      *
      * @return \PayPal\Api\Cost
@@ -189,51 +187,3 @@
     }
 
-    /**
-     * The image URL. Maximum length is 4000 characters.
-     * @deprecated Not publicly available
-     * @param string $image_url
-     * @throws \InvalidArgumentException
-     * @return $this
-     */
-    public function setImageUrl($image_url)
-    {
-        UrlValidator::validate($image_url, "ImageUrl");
-        $this->image_url = $image_url;
-        return $this;
-    }
-
-    /**
-     * The image URL. Maximum length is 4000 characters.
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getImageUrl()
-    {
-        return $this->image_url;
-    }
-
-    /**
-     * The unit of measure of the item being invoiced.
-     * Valid Values: ["QUANTITY", "HOURS", "AMOUNT"]
-     *
-     * @param string $unit_of_measure
-     * 
-     * @return $this
-     */
-    public function setUnitOfMeasure($unit_of_measure)
-    {
-        $this->unit_of_measure = $unit_of_measure;
-        return $this;
-    }
-
-    /**
-     * The unit of measure of the item being invoiced.
-     *
-     * @return string
-     */
-    public function getUnitOfMeasure()
-    {
-        return $this->unit_of_measure;
-    }
-
 }
Index: /lib/PayPal/Api/Item.php
===================================================================
--- /lib/PayPal/Api/Item.php	(revision 8528)
+++ /lib/PayPal/Api/Item.php	(revision 5261)
@@ -11,44 +11,51 @@
  * Class Item
  *
- * Item details.
+ * An item being paid for.
  *
  * @package PayPal\Api
  *
- * @property string sku
+ * @property string quantity
  * @property string name
  * @property string description
- * @property string quantity
  * @property string price
+ * @property string tax
  * @property string currency
- * @property string tax
+ * @property string sku
  * @property string url
+ * @property string category
+ * @property \PayPal\Api\Measurement weight
+ * @property \PayPal\Api\Measurement length
+ * @property \PayPal\Api\Measurement height
+ * @property \PayPal\Api\Measurement width
+ * @property \PayPal\Api\NameValuePair[] supplementary_data
+ * @property \PayPal\Api\NameValuePair[] postback_data
  */
 class Item extends PayPalModel
 {
     /**
-     * Stock keeping unit corresponding (SKU) to item.
-     *
-     * @param string $sku
-     * 
-     * @return $this
-     */
-    public function setSku($sku)
-    {
-        $this->sku = $sku;
-        return $this;
-    }
-
-    /**
-     * Stock keeping unit corresponding (SKU) to item.
-     *
-     * @return string
-     */
-    public function getSku()
-    {
-        return $this->sku;
-    }
-
-    /**
-     * Item name. 127 characters max.
+     * Number of items.
+     *
+     * @param string $quantity
+     * 
+     * @return $this
+     */
+    public function setQuantity($quantity)
+    {
+        $this->quantity = $quantity;
+        return $this;
+    }
+
+    /**
+     * Number of items.
+     *
+     * @return string
+     */
+    public function getQuantity()
+    {
+        return $this->quantity;
+    }
+
+    /**
+     * Name of the item.
      *
      * @param string $name
@@ -63,5 +70,5 @@
 
     /**
-     * Item name. 127 characters max.
+     * Name of the item.
      *
      * @return string
@@ -73,5 +80,5 @@
 
     /**
-     * Description of the item. Only supported when the `payment_method` is set to `paypal`.
+     * Description of the item.
      *
      * @param string $description
@@ -86,5 +93,5 @@
 
     /**
-     * Description of the item. Only supported when the `payment_method` is set to `paypal`.
+     * Description of the item.
      *
      * @return string
@@ -96,28 +103,5 @@
 
     /**
-     * Number of a particular item. 10 characters max.
-     *
-     * @param string $quantity
-     * 
-     * @return $this
-     */
-    public function setQuantity($quantity)
-    {
-        $this->quantity = $quantity;
-        return $this;
-    }
-
-    /**
-     * Number of a particular item. 10 characters max.
-     *
-     * @return string
-     */
-    public function getQuantity()
-    {
-        return $this->quantity;
-    }
-
-    /**
-     * Item cost. 10 characters max.
+     * Cost of the item.
      *
      * @param string|double $price
@@ -134,5 +118,5 @@
 
     /**
-     * Item cost. 10 characters max.
+     * Cost of the item.
      *
      * @return string
@@ -144,28 +128,5 @@
 
     /**
-     * 3-letter [currency code](https://developer.paypal.com/docs/integration/direct/rest_api_payment_country_currency_support/).
-     *
-     * @param string $currency
-     * 
-     * @return $this
-     */
-    public function setCurrency($currency)
-    {
-        $this->currency = $currency;
-        return $this;
-    }
-
-    /**
-     * 3-letter [currency code](https://developer.paypal.com/docs/integration/direct/rest_api_payment_country_currency_support/).
-     *
-     * @return string
-     */
-    public function getCurrency()
-    {
-        return $this->currency;
-    }
-
-    /**
-     * Tax of the item. Only supported when the `payment_method` is set to `paypal`.
+     * tax of the item.
      *
      * @param string|double $tax
@@ -182,5 +143,5 @@
 
     /**
-     * Tax of the item. Only supported when the `payment_method` is set to `paypal`.
+     * tax of the item.
      *
      * @return string
@@ -189,4 +150,50 @@
     {
         return $this->tax;
+    }
+
+    /**
+     * 3-letter Currency Code
+     *
+     * @param string $currency
+     * 
+     * @return $this
+     */
+    public function setCurrency($currency)
+    {
+        $this->currency = $currency;
+        return $this;
+    }
+
+    /**
+     * 3-letter Currency Code
+     *
+     * @return string
+     */
+    public function getCurrency()
+    {
+        return $this->currency;
+    }
+
+    /**
+     * Number or code to identify the item in your catalog/records.
+     *
+     * @param string $sku
+     * 
+     * @return $this
+     */
+    public function setSku($sku)
+    {
+        $this->sku = $sku;
+        return $this;
+    }
+
+    /**
+     * Number or code to identify the item in your catalog/records.
+     *
+     * @return string
+     */
+    public function getSku()
+    {
+        return $this->sku;
     }
 
@@ -218,5 +225,5 @@
      * Category type of the item.
      * Valid Values: ["DIGITAL", "PHYSICAL"]
-     * @deprecated Not publicly available
+     *
      * @param string $category
      * 
@@ -231,5 +238,5 @@
     /**
      * Category type of the item.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -241,5 +248,5 @@
     /**
      * Weight of the item.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Measurement $weight
      * 
@@ -254,5 +261,5 @@
     /**
      * Weight of the item.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\Measurement
      */
@@ -264,5 +271,5 @@
     /**
      * Length of the item.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Measurement $length
      * 
@@ -277,5 +284,5 @@
     /**
      * Length of the item.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\Measurement
      */
@@ -287,5 +294,5 @@
     /**
      * Height of the item.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Measurement $height
      * 
@@ -300,5 +307,5 @@
     /**
      * Height of the item.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\Measurement
      */
@@ -310,5 +317,5 @@
     /**
      * Width of the item.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Measurement $width
      * 
@@ -323,5 +330,5 @@
     /**
      * Width of the item.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\Measurement
      */
@@ -333,5 +340,5 @@
     /**
      * Set of optional data used for PayPal risk determination.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\NameValuePair[] $supplementary_data
      * 
@@ -346,5 +353,5 @@
     /**
      * Set of optional data used for PayPal risk determination.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\NameValuePair[]
      */
@@ -356,5 +363,5 @@
     /**
      * Append SupplementaryData to the list.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\NameValuePair $nameValuePair
      * @return $this
@@ -373,5 +380,5 @@
     /**
      * Remove SupplementaryData from the list.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\NameValuePair $nameValuePair
      * @return $this
@@ -386,5 +393,5 @@
     /**
      * Set of optional data used for PayPal post-transaction notifications.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\NameValuePair[] $postback_data
      * 
@@ -399,5 +406,5 @@
     /**
      * Set of optional data used for PayPal post-transaction notifications.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\NameValuePair[]
      */
@@ -409,5 +416,5 @@
     /**
      * Append PostbackData to the list.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\NameValuePair $nameValuePair
      * @return $this
@@ -426,5 +433,5 @@
     /**
      * Remove PostbackData from the list.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\NameValuePair $nameValuePair
      * @return $this
Index: /lib/PayPal/Api/ItemList.php
===================================================================
--- /lib/PayPal/Api/ItemList.php	(revision 8528)
+++ /lib/PayPal/Api/ItemList.php	(revision 5261)
@@ -15,8 +15,15 @@
  * @property \PayPal\Api\ShippingAddress shipping_address
  * @property string shipping_method
- * @property string shipping_phone_number
  */
 class ItemList extends PayPalModel
 {
+    /**
+     * Is this list empty?
+     */
+    public function isEmpty()
+    {
+        return empty($this->items);
+    }
+
     /**
      * List of items.
@@ -28,5 +35,5 @@
     public function setItems($items)
     {
-        $this->items = array_values($items);
+        $this->items = $items;
         return $this;
     }
@@ -118,26 +125,3 @@
     }
 
-    /**
-     * Allows merchant's to share payerâs contact number with PayPal for the current payment. Final contact number of payer associated with the transaction might be same as shipping_phone_number or different based on Payerâs action on PayPal. The phone number must be represented in its canonical international format, as defined by the E.164 numbering plan
-     *
-     * @param string $shipping_phone_number
-     * 
-     * @return $this
-     */
-    public function setShippingPhoneNumber($shipping_phone_number)
-    {
-        $this->shipping_phone_number = $shipping_phone_number;
-        return $this;
-    }
-
-    /**
-     * Allows merchant's to share payerâs contact number with PayPal for the current payment. Final contact number of payer associated with the transaction might be same as shipping_phone_number or different based on Payerâs action on PayPal. The phone number must be represented in its canonical international format, as defined by the E.164 numbering plan
-     *
-     * @return string
-     */
-    public function getShippingPhoneNumber()
-    {
-        return $this->shipping_phone_number;
-    }
-
 }
Index: /lib/PayPal/Api/MerchantInfo.php
===================================================================
--- /lib/PayPal/Api/MerchantInfo.php	(revision 8528)
+++ /lib/PayPal/Api/MerchantInfo.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class MerchantInfo
  *
- * Merchant business information that appears on the invoice.
+ * Business information of the merchant that will appear on the invoice.
  *
  * @package PayPal\Api
@@ -21,5 +21,4 @@
  * @property string website
  * @property string tax_id
- * @property string additional_info_label
  * @property string additional_info
  */
@@ -27,5 +26,5 @@
 {
     /**
-     * The merchant email address. Maximum length is 260 characters.
+     * Email address of the merchant. 260 characters max.
      *
      * @param string $email
@@ -40,5 +39,5 @@
 
     /**
-     * The merchant email address. Maximum length is 260 characters.
+     * Email address of the merchant. 260 characters max.
      *
      * @return string
@@ -50,5 +49,5 @@
 
     /**
-     * The merchant first name. Maximum length is 30 characters.
+     * First name of the merchant. 30 characters max.
      *
      * @param string $first_name
@@ -63,5 +62,5 @@
 
     /**
-     * The merchant first name. Maximum length is 30 characters.
+     * First name of the merchant. 30 characters max.
      *
      * @return string
@@ -73,5 +72,5 @@
 
     /**
-     * The merchant last name. Maximum length is 30 characters.
+     * Last name of the merchant. 30 characters max.
      *
      * @param string $last_name
@@ -86,5 +85,5 @@
 
     /**
-     * The merchant last name. Maximum length is 30 characters.
+     * Last name of the merchant. 30 characters max.
      *
      * @return string
@@ -96,5 +95,5 @@
 
     /**
-     * The merchant address.
+     * Address of the merchant.
      *
      * @param \PayPal\Api\InvoiceAddress $address
@@ -109,5 +108,5 @@
 
     /**
-     * The merchant address.
+     * Address of the merchant.
      *
      * @return \PayPal\Api\InvoiceAddress
@@ -119,5 +118,5 @@
 
     /**
-     * The merchant company business name. Maximum length is 100 characters.
+     * Company business name of the merchant. 100 characters max.
      *
      * @param string $business_name
@@ -132,5 +131,5 @@
 
     /**
-     * The merchant company business name. Maximum length is 100 characters.
+     * Company business name of the merchant. 100 characters max.
      *
      * @return string
@@ -142,5 +141,5 @@
 
     /**
-     * The merchant phone number.
+     * Phone number of the merchant.
      *
      * @param \PayPal\Api\Phone $phone
@@ -155,5 +154,5 @@
 
     /**
-     * The merchant phone number.
+     * Phone number of the merchant.
      *
      * @return \PayPal\Api\Phone
@@ -165,5 +164,5 @@
 
     /**
-     * The merchant fax number.
+     * Fax number of the merchant.
      *
      * @param \PayPal\Api\Phone $fax
@@ -178,5 +177,5 @@
 
     /**
-     * The merchant fax number.
+     * Fax number of the merchant.
      *
      * @return \PayPal\Api\Phone
@@ -188,5 +187,5 @@
 
     /**
-     * The merchant website. Maximum length is 2048 characters.
+     * Website of the merchant. 2048 characters max.
      *
      * @param string $website
@@ -201,5 +200,5 @@
 
     /**
-     * The merchant website. Maximum length is 2048 characters.
+     * Website of the merchant. 2048 characters max.
      *
      * @return string
@@ -211,5 +210,5 @@
 
     /**
-     * The merchant tax ID. Maximum length is 100 characters.
+     * Tax ID of the merchant. 100 characters max.
      *
      * @param string $tax_id
@@ -224,5 +223,5 @@
 
     /**
-     * The merchant tax ID. Maximum length is 100 characters.
+     * Tax ID of the merchant. 100 characters max.
      *
      * @return string
@@ -234,28 +233,5 @@
 
     /**
-     * Option to provide a label to the additional_info field. 40 characters max.
-     *
-     * @param string $additional_info_label
-     * 
-     * @return $this
-     */
-    public function setAdditionalInfoLabel($additional_info_label)
-    {
-        $this->additional_info_label = $additional_info_label;
-        return $this;
-    }
-
-    /**
-     * Option to provide a label to the additional_info field. 40 characters max.
-     *
-     * @return string
-     */
-    public function getAdditionalInfoLabel()
-    {
-        return $this->additional_info_label;
-    }
-
-    /**
-     * Additional information, such as business hours. Maximum length is 40 characters.
+     * Option to display additional information such as business hours. 40 characters max.
      *
      * @param string $additional_info
@@ -270,5 +246,5 @@
 
     /**
-     * Additional information, such as business hours. Maximum length is 40 characters.
+     * Option to display additional information such as business hours. 40 characters max.
      *
      * @return string
Index: /lib/PayPal/Api/Metadata.php
===================================================================
--- /lib/PayPal/Api/Metadata.php	(revision 8528)
+++ /lib/PayPal/Api/Metadata.php	(revision 5261)
@@ -9,5 +9,5 @@
  * Class Metadata
  *
- * Audit information for the resource.
+ * Audit information of the resource.
  *
  * @package PayPal\Api
@@ -27,5 +27,5 @@
 {
     /**
-     * The date and time when the resource was created.
+     * Date when the resource was created.
      *
      * @param string $created_date
@@ -40,5 +40,5 @@
 
     /**
-     * The date and time when the resource was created.
+     * Date when the resource was created.
      *
      * @return string
@@ -50,5 +50,5 @@
 
     /**
-     * The email address of the account that created the resource.
+     * Email address of the account that created the resource.
      *
      * @param string $created_by
@@ -63,5 +63,5 @@
 
     /**
-     * The email address of the account that created the resource.
+     * Email address of the account that created the resource.
      *
      * @return string
@@ -73,5 +73,5 @@
 
     /**
-     * The date and time when the resource was cancelled.
+     * Date when the resource was cancelled.
      *
      * @param string $cancelled_date
@@ -86,5 +86,5 @@
 
     /**
-     * The date and time when the resource was cancelled.
+     * Date when the resource was cancelled.
      *
      * @return string
@@ -96,5 +96,5 @@
 
     /**
-     * The actor who cancelled the resource.
+     * Actor who cancelled the resource.
      *
      * @param string $cancelled_by
@@ -109,5 +109,5 @@
 
     /**
-     * The actor who cancelled the resource.
+     * Actor who cancelled the resource.
      *
      * @return string
@@ -119,5 +119,5 @@
 
     /**
-     * The date and time when the resource was last edited.
+     * Date when the resource was last edited.
      *
      * @param string $last_updated_date
@@ -132,5 +132,5 @@
 
     /**
-     * The date and time when the resource was last edited.
+     * Date when the resource was last edited.
      *
      * @return string
@@ -142,5 +142,5 @@
 
     /**
-     * The email address of the account that last edited the resource.
+     * Email address of the account that last edited the resource.
      *
      * @param string $last_updated_by
@@ -155,5 +155,5 @@
 
     /**
-     * The email address of the account that last edited the resource.
+     * Email address of the account that last edited the resource.
      *
      * @return string
@@ -165,5 +165,5 @@
 
     /**
-     * The date and time when the resource was first sent.
+     * Date when the resource was first sent.
      *
      * @param string $first_sent_date
@@ -178,5 +178,5 @@
 
     /**
-     * The date and time when the resource was first sent.
+     * Date when the resource was first sent.
      *
      * @return string
@@ -188,5 +188,5 @@
 
     /**
-     * The date and time when the resource was last sent.
+     * Date when the resource was last sent.
      *
      * @param string $last_sent_date
@@ -201,5 +201,5 @@
 
     /**
-     * The date and time when the resource was last sent.
+     * Date when the resource was last sent.
      *
      * @return string
@@ -211,5 +211,5 @@
 
     /**
-     * The email address of the account that last sent the resource.
+     * Email address of the account that last sent the resource.
      *
      * @param string $last_sent_by
@@ -224,5 +224,5 @@
 
     /**
-     * The email address of the account that last sent the resource.
+     * Email address of the account that last sent the resource.
      *
      * @return string
Index: /lib/PayPal/Api/Notification.php
===================================================================
--- /lib/PayPal/Api/Notification.php	(revision 8528)
+++ /lib/PayPal/Api/Notification.php	(revision 5261)
@@ -15,5 +15,4 @@
  * @property string note
  * @property bool send_to_merchant
- * @property string[] cc_emails
  */
 class Notification extends PayPalModel
@@ -66,5 +65,5 @@
 
     /**
-     * Indicates whether to send a copy of the email to the merchant.
+     * A flag indicating whether a copy of the email has to be sent to the merchant.
      *
      * @param bool $send_to_merchant
@@ -79,5 +78,5 @@
 
     /**
-     * Indicates whether to send a copy of the email to the merchant.
+     * A flag indicating whether a copy of the email has to be sent to the merchant.
      *
      * @return bool
@@ -88,56 +87,3 @@
     }
 
-    /**
-     * Applicable for invoices created with Cc emails. If this field is not in the body, all the cc email addresses added as part of the invoice shall be notified else this field can be used to limit the list of email addresses. Note: additional email addresses are not supported.
-     *
-     * @param string[] $cc_emails
-     * 
-     * @return $this
-     */
-    public function setCcEmails($cc_emails)
-    {
-        $this->cc_emails = $cc_emails;
-        return $this;
-    }
-
-    /**
-     * Applicable for invoices created with Cc emails. If this field is not in the body, all the cc email addresses added as part of the invoice shall be notified else this field can be used to limit the list of email addresses. Note: additional email addresses are not supported.
-     *
-     * @return string[]
-     */
-    public function getCcEmails()
-    {
-        return $this->cc_emails;
-    }
-
-    /**
-     * Append CcEmails to the list.
-     *
-     * @param string $string
-     * @return $this
-     */
-    public function addCcEmail($string)
-    {
-        if (!$this->getCcEmails()) {
-            return $this->setCcEmails(array($string));
-        } else {
-            return $this->setCcEmails(
-                array_merge($this->getCcEmails(), array($string))
-            );
-        }
-    }
-
-    /**
-     * Remove CcEmails from the list.
-     *
-     * @param string $string
-     * @return $this
-     */
-    public function removeCcEmail($string)
-    {
-        return $this->setCcEmails(
-            array_diff($this->getCcEmails(), array($string))
-        );
-    }
-
 }
Index: /lib/PayPal/Api/OpenIdAddress.php
===================================================================
--- /lib/PayPal/Api/OpenIdAddress.php	(revision 8528)
+++ /lib/PayPal/Api/OpenIdAddress.php	(revision 5261)
@@ -6,18 +6,9 @@
 
 /**
- * Class OpenIdAddress
- *
  * End-User's preferred address.
- *
- * @package PayPal\Api
- *
- * @property string street_address
- * @property string locality
- * @property string region
- * @property string postal_code
- * @property string country
  */
 class OpenIdAddress extends PayPalModel
 {
+
     /**
      * Full street address component, which may include house number, street name.
Index: /lib/PayPal/Api/OpenIdError.php
===================================================================
--- /lib/PayPal/Api/OpenIdError.php	(revision 8528)
+++ /lib/PayPal/Api/OpenIdError.php	(revision 5261)
@@ -5,11 +5,5 @@
 
 /**
- * Class OpenIdError
- *
  * Error resource
- *
- * @property string error
- * @property string error_description
- * @property string error_uri
  */
 class OpenIdError extends PayPalModel
Index: /lib/PayPal/Api/OpenIdSession.php
===================================================================
--- /lib/PayPal/Api/OpenIdSession.php	(revision 8528)
+++ /lib/PayPal/Api/OpenIdSession.php	(revision 5261)
@@ -13,13 +13,11 @@
      * start the authentication / authorization process.
      *
-     * @param string $redirectUri Uri on merchant website to where
+     * @param string     $redirectUri   Uri on merchant website to where
      *                                  the user must be redirected to post paypal login
-     * @param array $scope The access privilges that you are requesting for
+     * @param array      $scope         The access privilges that you are requesting for
      *                                  from the user. Pass empty array for all scopes.
-     * @param string $clientId client id from developer portal
-     *                                  See https://developer.paypal.com/docs/integration/direct/log-in-with-paypal/detailed/#attributes for more
-     * @param null $nonce
-     * @param null $state
-     * @param ApiContext $apiContext Optional API Context
+     * @param string     $clientId      client id from developer portal
+     *                                  See https://developer.paypal.com/webapps/developer/docs/integration/direct/log-in-with-paypal/detailed/#attributes for more
+     * @param ApiContext $apiContext    Optional API Context
      * @return string Authorization URL
      */
@@ -54,5 +52,5 @@
             $params['state'] = $state;
         }
-        return sprintf("%s/signin/authorize?%s", self::getBaseUrl($config), http_build_query($params));
+        return sprintf("%s/v1/authorize?%s", self::getBaseUrl($config), http_build_query($params));
     }
 
@@ -81,5 +79,5 @@
             'logout' => 'true'
         );
-        return sprintf("%s/webapps/auth/protocol/openidconnect/v1/endsession?%s", self::getBaseUrl($config), http_build_query($params));
+        return sprintf("%s/v1/endsession?%s", self::getBaseUrl($config), http_build_query($params));
     }
 
Index: /lib/PayPal/Api/OpenIdTokeninfo.php
===================================================================
--- /lib/PayPal/Api/OpenIdTokeninfo.php	(revision 8528)
+++ /lib/PayPal/Api/OpenIdTokeninfo.php	(revision 5261)
@@ -1,4 +1,5 @@
 <?php
 namespace PayPal\Api;
+
 
 use PayPal\Common\PayPalResourceModel;
@@ -7,14 +8,5 @@
 
 /**
- * Class OpenIdTokeninfo
- *
  * Token grant resource
- *
- * @property string scope
- * @property string access_token
- * @property string refresh_token
- * @property string token_type
- * @property string id_token
- * @property int expires_in
  */
 class OpenIdTokeninfo extends PayPalResourceModel
@@ -220,8 +212,7 @@
      *                               (optional) scope is an array that either the same or a subset of the scope passed to the authorization request
      * @param APIContext $apiContext Optional API Context
-     * @param PayPalRestCall $restCall
      * @return OpenIdTokeninfo
      */
-    public function createFromRefreshToken($params, $apiContext = null, $restCall = null)
+    public function createFromRefreshToken($params, $apiContext = null)
     {
         static $allowedParams = array('grant_type' => 1, 'refresh_token' => 1, 'scope' => 1);
@@ -246,6 +237,5 @@
                 'Authorization' => 'Basic ' . base64_encode($clientId . ":" . $clientSecret)
             ),
-            $apiContext,
-            $restCall
+            $apiContext
         );
 
Index: /lib/PayPal/Api/OpenIdUserinfo.php
===================================================================
--- /lib/PayPal/Api/OpenIdUserinfo.php	(revision 8528)
+++ /lib/PayPal/Api/OpenIdUserinfo.php	(revision 5261)
@@ -6,29 +6,5 @@
 
 /**
- * Class OpenIdUserinfo
- *
  * OpenIdConnect UserInfo Resource
- *
- * @property string user_id
- * @property string sub
- * @property mixed name
- * @property string given_name
- * @property string family_name
- * @property string middle_name
- * @property string picture
- * @property string email
- * @property bool email_verified
- * @property string gender
- * @property string birthday
- * @property string zoneinfo
- * @property string locale
- * @property string language
- * @property bool verified
- * @property string phone_number
- * @property OpenIdAddress address
- * @property mixed verified_account
- * @property mixed account_type
- * @property string age_range
- * @property string payer_id
  */
 class OpenIdUserinfo extends PayPalResourceModel
@@ -506,8 +482,7 @@
      *                                 access_token - access token from the createFromAuthorizationCode / createFromRefreshToken calls
      * @param ApiContext $apiContext Optional API Context
-     * @param PayPalRestCall $restCall
      * @return OpenIdUserinfo
      */
-    public static function getUserinfo($params, $apiContext = null, $restCall = null)
+    public static function getUserinfo($params, $apiContext = null)
     {
         static $allowedParams = array('schema' => 1);
@@ -529,6 +504,5 @@
                 'Content-Type' => 'x-www-form-urlencoded'
             ),
-            $apiContext,
-            $restCall
+            $apiContext
         );
 
Index: /lib/PayPal/Api/Order.php
===================================================================
--- /lib/PayPal/Api/Order.php	(revision 8528)
+++ /lib/PayPal/Api/Order.php	(revision 5261)
@@ -5,5 +5,8 @@
 use PayPal\Common\PayPalResourceModel;
 use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\Capture;
+use PayPal\Api\Authorization;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
@@ -15,5 +18,5 @@
  *
  * @property string id
- * @property string reference_id
+ * @property string purchase_unit_reference_id
  * @property \PayPal\Api\Amount amount
  * @property string payment_mode
@@ -27,5 +30,4 @@
  * @property string create_time
  * @property string update_time
- * @property \PayPal\Api\Links[] links
  */
 class Order extends PayPalResourceModel
@@ -57,8 +59,6 @@
      * Identifier to the purchase unit associated with this object. Obsolete. Use one in cart_base.
      *
-     * @deprecated Use #setReferenceId instead
-     *
      * @param string $purchase_unit_reference_id
-     *
+     * 
      * @return $this
      */
@@ -71,5 +71,4 @@
     /**
      * Identifier to the purchase unit associated with this object. Obsolete. Use one in cart_base.
-     * @deprecated Use #getReferenceId instead
      *
      * @return string
@@ -78,27 +77,4 @@
     {
         return $this->purchase_unit_reference_id;
-    }
-
-    /**
-     * Identifier to the purchase unit associated with this object. Obsolete. Use one in cart_base.
-     *
-     * @param string $reference_id
-     *
-     * @return $this
-     */
-    public function setReferenceId($reference_id)
-    {
-        $this->reference_id = $reference_id;
-        return $this;
-    }
-
-    /**
-     * Identifier to the purchase unit associated with this object. Obsolete. Use one in cart_base.
-     *
-     * @return string
-     */
-    public function getReferenceId()
-    {
-        return $this->reference_id;
     }
 
@@ -152,5 +128,5 @@
     /**
      * State of the order transaction.
-     * Valid Values: ["pending", "completed", "voided", "authorized", "captured"]
+     * Valid Values: ["pending", "completed", "refunded", "partially_refunded", "voided"]
      *
      * @param string $state
@@ -175,5 +151,5 @@
 
     /**
-     * Reason code for the transaction state being Pending or Reversed. This field will replace pending_reason field eventually. Only supported when the `payment_method` is set to `paypal`.
+     * Reason code for the transaction state being Pending or Reversed. This field will replace pending_reason field eventually
      * Valid Values: ["PAYER_SHIPPING_UNCONFIRMED", "MULTI_CURRENCY", "RISK_REVIEW", "REGULATORY_REVIEW", "VERIFICATION_REQUIRED", "ORDER", "OTHER"]
      *
@@ -189,5 +165,5 @@
 
     /**
-     * Reason code for the transaction state being Pending or Reversed. This field will replace pending_reason field eventually. Only supported when the `payment_method` is set to `paypal`.
+     * Reason code for the transaction state being Pending or Reversed. This field will replace pending_reason field eventually
      *
      * @return string
@@ -199,5 +175,5 @@
 
     /**
-     * [DEPRECATED] Reason code for the transaction state being Pending. Obsolete. Retained for backward compatability. Use reason_code field above instead. 
+     * Reason code for the transaction state being Pending. Obsolete. Retained for backward compatability. Use reason_code field above instead. 
      * Valid Values: ["payer_shipping_unconfirmed", "multi_currency", "risk_review", "regulatory_review", "verification_required", "order", "other"]
      *
@@ -213,5 +189,5 @@
 
     /**
-     * @deprecated  [DEPRECATED] Reason code for the transaction state being Pending. Obsolete. Retained for backward compatability. Use reason_code field above instead. 
+     * Reason code for the transaction state being Pending. Obsolete. Retained for backward compatability. Use reason_code field above instead. 
      *
      * @return string
@@ -223,5 +199,5 @@
 
     /**
-     * The level of seller protection in force for the transaction.
+     * Protection Eligibility of the Payer 
      * Valid Values: ["ELIGIBLE", "PARTIALLY_ELIGIBLE", "INELIGIBLE"]
      *
@@ -232,10 +208,10 @@
     public function setProtectionEligibility($protection_eligibility)
     {
-        $this->protection_eligibility = $protection_eligibility;
-        return $this;
-    }
-
-    /**
-     * The level of seller protection in force for the transaction.
+        $this->{"protection-eligibility"} = $protection_eligibility;
+        return $this;
+    }
+
+    /**
+     * Protection Eligibility of the Payer 
      *
      * @return string
@@ -243,10 +219,10 @@
     public function getProtectionEligibility()
     {
-        return $this->protection_eligibility;
-    }
-
-    /**
-     * The kind of seller protection in force for the transaction. This property is returned only when the `protection_eligibility` property is set to `ELIGIBLE`or `PARTIALLY_ELIGIBLE`. Only supported when the `payment_method` is set to `paypal`. Allowed values:<br> `ITEM_NOT_RECEIVED_ELIGIBLE`- Sellers are protected against claims for items not received.<br> `UNAUTHORIZED_PAYMENT_ELIGIBLE`- Sellers are protected against claims for unauthorized payments.<br> One or both of the allowed values can be returned.
-     * Valid Values: ["ITEM_NOT_RECEIVED_ELIGIBLE", "UNAUTHORIZED_PAYMENT_ELIGIBLE", "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE"]
+        return $this->{"protection-eligibility"};
+    }
+
+    /**
+     * Protection Eligibility Type of the Payer 
+     * Valid Values: ["ELIGIBLE", "ITEM_NOT_RECEIVED_ELIGIBLE", "INELIGIBLE", "UNAUTHORIZED_PAYMENT_ELIGIBLE"]
      *
      * @param string $protection_eligibility_type
@@ -256,10 +232,10 @@
     public function setProtectionEligibilityType($protection_eligibility_type)
     {
-        $this->protection_eligibility_type = $protection_eligibility_type;
-        return $this;
-    }
-
-    /**
-     * The kind of seller protection in force for the transaction. This property is returned only when the `protection_eligibility` property is set to `ELIGIBLE`or `PARTIALLY_ELIGIBLE`. Only supported when the `payment_method` is set to `paypal`. Allowed values:<br> `ITEM_NOT_RECEIVED_ELIGIBLE`- Sellers are protected against claims for items not received.<br> `UNAUTHORIZED_PAYMENT_ELIGIBLE`- Sellers are protected against claims for unauthorized payments.<br> One or both of the allowed values can be returned.
+        $this->{"protection-eligibility_type"} = $protection_eligibility_type;
+        return $this;
+    }
+
+    /**
+     * Protection Eligibility Type of the Payer 
      *
      * @return string
@@ -267,5 +243,5 @@
     public function getProtectionEligibilityType()
     {
-        return $this->protection_eligibility_type;
+        return $this->{"protection-eligibility_type"};
     }
 
@@ -363,5 +339,5 @@
 
     /**
-     * Shows details for an order, by ID.
+     * Retrieve details about an order by passing the order_id in the request URI.
      *
      * @param string $orderId
@@ -388,5 +364,5 @@
 
     /**
-     * Captures a payment for an order, by ID. To use this call, the original payment call must specify an intent of `order`. In the JSON request body, include the payment amount and indicate whether this capture is the final capture for the authorization.
+     * Capture a payment on an order by passing the order_id in the request URI. In addition, include the amount of the payment and indicate whether this is a final capture for the given authorization in the body of the request JSON. To issue this request, an original payment call must specify an intent of order.
      *
      * @param Capture $capture
@@ -414,5 +390,5 @@
 
     /**
-     * Voids, or cancels, an order, by ID. You cannot void an order if a payment has already been partially or fully captured.
+     * Void (cancel) an order by passing the order_id in the request URI. Note that an order cannot be voided if payment has already been partially or fully captured.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -437,5 +413,5 @@
 
     /**
-     * Authorizes an order, by ID. Include an `amount` object in the JSON request body.
+     * Authorize an order by passing the order_id in the request URI. In addition, include an amount object in the body of the request JSON.
      *
      * @param Authorization $authorization Authorization Object with Amount value to be authorized
Index: /lib/PayPal/Api/Patch.php
===================================================================
--- /lib/PayPal/Api/Patch.php	(revision 8528)
+++ /lib/PayPal/Api/Patch.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class Patch
  *
- * A JSON patch object that you can use to apply partial updates to resources.
+ * A JSON Patch object used for doing partial updates to resources.
  *
  * @package PayPal\Api
@@ -20,6 +20,6 @@
 {
     /**
-     * The operation to perform.
-     * Valid Values: ["add", "remove", "replace", "move", "copy", "test"]
+     * Patch operation to perform.Value required for add & remove operation can be any JSON value.
+     * Valid Values: ["add", "remove", "replace"]
      *
      * @param string $op
@@ -34,5 +34,5 @@
 
     /**
-     * The operation to perform.
+     * Patch operation to perform.Value required for add & remove operation can be any JSON value.
      *
      * @return string
@@ -44,5 +44,5 @@
 
     /**
-     * A JSON pointer that references a location in the target document where the operation is performed. A `string` value.
+     * string containing a JSON-Pointer value that references a location within the target document (the target location) where the operation is performed.
      *
      * @param string $path
@@ -57,5 +57,5 @@
 
     /**
-     * A JSON pointer that references a location in the target document where the operation is performed. A `string` value.
+     * string containing a JSON-Pointer value that references a location within the target document (the target location) where the operation is performed.
      *
      * @return string
Index: /lib/PayPal/Api/PatchRequest.php
===================================================================
--- /lib/PayPal/Api/PatchRequest.php	(revision 8528)
+++ /lib/PayPal/Api/PatchRequest.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PatchRequest
  *
- * A JSON patch request.
+ * Request object used for a JSON Patch.
  *
  * @package PayPal\Api
Index: /lib/PayPal/Api/Payee.php
===================================================================
--- /lib/PayPal/Api/Payee.php	(revision 8528)
+++ /lib/PayPal/Api/Payee.php	(revision 5261)
@@ -4,9 +4,10 @@
 
 use PayPal\Common\PayPalModel;
+use PayPal\Rest\ApiContext;
 
 /**
  * Class Payee
  *
- * A resource representing a Payee who receives the funds and fulfills the order.
+ * A resource representing a Payee that received the funds and fulfills the order. Only one of the following identifiers need to be supplied.
  *
  * @package PayPal\Api
@@ -14,9 +15,11 @@
  * @property string email
  * @property string merchant_id
+ * @property \PayPal\Api\Phone phone
  */
 class Payee extends PayPalModel
 {
     /**
-     * Email Address associated with the Payee's PayPal Account. If the provided email address is not associated with any PayPal Account, the payee can only receive PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements.
+     * Email Address associated with the Payee's PayPal Account. If the provided email address is not associated with any PayPal Account, the payee can only receiver PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements.
+     * 
      *
      * @param string $email
@@ -31,5 +34,5 @@
 
     /**
-     * Email Address associated with the Payee's PayPal Account. If the provided email address is not associated with any PayPal Account, the payee can only receive PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements.
+     * Email Address associated with the Payee's PayPal Account. If the provided email address is not associated with any PayPal Account, the payee can only receiver PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements.
      *
      * @return string
@@ -41,5 +44,6 @@
 
     /**
-     * Encrypted PayPal account identifier for the Payee.
+     * Encrypted PayPal Account identifier for the Payee.
+     * 
      *
      * @param string $merchant_id
@@ -54,5 +58,5 @@
 
     /**
-     * Encrypted PayPal account identifier for the Payee.
+     * Encrypted PayPal Account identifier for the Payee.
      *
      * @return string
@@ -64,75 +68,7 @@
 
     /**
-     * First Name of the Payee.
-     * @deprecated Not publicly available
-     * @param string $first_name
+     * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. 
      * 
-     * @return $this
-     */
-    public function setFirstName($first_name)
-    {
-        $this->first_name = $first_name;
-        return $this;
-    }
-
-    /**
-     * First Name of the Payee.
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getFirstName()
-    {
-        return $this->first_name;
-    }
-
-    /**
-     * Last Name of the Payee.
-     * @deprecated Not publicly available
-     * @param string $last_name
-     * 
-     * @return $this
-     */
-    public function setLastName($last_name)
-    {
-        $this->last_name = $last_name;
-        return $this;
-    }
-
-    /**
-     * Last Name of the Payee.
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getLastName()
-    {
-        return $this->last_name;
-    }
-
-    /**
-     * Unencrypted PayPal account Number of the Payee
-     * @deprecated Not publicly available
-     * @param string $account_number
-     * 
-     * @return $this
-     */
-    public function setAccountNumber($account_number)
-    {
-        $this->account_number = $account_number;
-        return $this;
-    }
-
-    /**
-     * Unencrypted PayPal account Number of the Payee
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getAccountNumber()
-    {
-        return $this->account_number;
-    }
-
-    /**
-     * Information related to the Payee.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Phone $phone
      * 
@@ -146,6 +82,6 @@
 
     /**
-     * Information related to the Payee.
-     * @deprecated Not publicly available
+     * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. 
+     *
      * @return \PayPal\Api\Phone
      */
Index: /lib/PayPal/Api/Payer.php
===================================================================
--- /lib/PayPal/Api/Payer.php	(revision 8528)
+++ /lib/PayPal/Api/Payer.php	(revision 5261)
@@ -14,6 +14,10 @@
  * @property string payment_method
  * @property string status
+ * @property string account_type
+ * @property string account_age
  * @property \PayPal\Api\FundingInstrument[] funding_instruments
- * @property string external_selected_funding_instrument_type
+ * @property string funding_option_id
+ * @property \PayPal\Api\FundingOption funding_option
+ * @property \PayPal\Api\FundingOption related_funding_option
  * @property \PayPal\Api\PayerInfo payer_info
  */
@@ -21,8 +25,6 @@
 {
     /**
-     * Payment method being used. "credit_card" is not available for general use.
-     * Please ensure that you have acquired the approval for using "credit_card" for your live
-     * credentials.
-     * Valid Values: ["credit_card", "paypal"]
+     * Payment method being used - PayPal Wallet payment, Bank Direct Debit  or Direct Credit card.
+     * Valid Values: ["credit_card", "bank", "paypal", "pay_upon_invoice", "carrier"]
      *
      * @param string $payment_method
@@ -73,5 +75,5 @@
      * Type of account relationship payer has with PayPal.
      * Valid Values: ["BUSINESS", "PERSONAL", "PREMIER"]
-     * @deprecated Not publicly available
+     *
      * @param string $account_type
      * 
@@ -86,5 +88,5 @@
     /**
      * Type of account relationship payer has with PayPal.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -96,5 +98,5 @@
     /**
      * Duration since the payer established account relationship with PayPal in days.
-     * @deprecated Not publicly available
+     *
      * @param string $account_age
      * 
@@ -109,5 +111,5 @@
     /**
      * Duration since the payer established account relationship with PayPal in days.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -118,5 +120,5 @@
 
     /**
-     * List of funding instruments to fund the payment. 'OneOf' funding_instruments,funding_option_id to be used to identify the specifics of payment method passed.
+     * List of funding instruments to fund the payment.
      *
      * @param \PayPal\Api\FundingInstrument[] $funding_instruments
@@ -131,5 +133,5 @@
 
     /**
-     * List of funding instruments to fund the payment. 'OneOf' funding_instruments,funding_option_id to be used to identify the specifics of payment method passed.
+     * List of funding instruments to fund the payment.
      *
      * @return \PayPal\Api\FundingInstrument[]
@@ -171,6 +173,6 @@
 
     /**
-     * Id of user selected funding option for the payment.'OneOf' funding_instruments,funding_option_id to be used to identify the specifics of payment method passed.
-     * @deprecated Not publicly available
+     * Id of user selected funding option for the payment. 'OneOf' funding_instruments or funding_option_id to be present 
+     *
      * @param string $funding_option_id
      * 
@@ -184,6 +186,6 @@
 
     /**
-     * Id of user selected funding option for the payment.'OneOf' funding_instruments,funding_option_id to be used to identify the specifics of payment method passed.
-     * @deprecated Not publicly available
+     * Id of user selected funding option for the payment. 'OneOf' funding_instruments or funding_option_id to be present 
+     *
      * @return string
      */
@@ -195,5 +197,5 @@
     /**
      * Default funding option available for the payment 
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\FundingOption $funding_option
      * 
@@ -208,5 +210,5 @@
     /**
      * Default funding option available for the payment 
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\FundingOption
      */
@@ -217,30 +219,6 @@
 
     /**
-     * Instrument type pre-selected by the user outside of PayPal and passed along the payment creation. This param is used in cases such as PayPal Credit Second Button
-     * Valid Values: ["CREDIT", "PAY_UPON_INVOICE"]
-     *
-     * @param string $external_selected_funding_instrument_type
-     * 
-     * @return $this
-     */
-    public function setExternalSelectedFundingInstrumentType($external_selected_funding_instrument_type)
-    {
-        $this->external_selected_funding_instrument_type = $external_selected_funding_instrument_type;
-        return $this;
-    }
-
-    /**
-     * Instrument type pre-selected by the user outside of PayPal and passed along the payment creation. This param is used in cases such as PayPal Credit Second Button
-     *
-     * @return string
-     */
-    public function getExternalSelectedFundingInstrumentType()
-    {
-        return $this->external_selected_funding_instrument_type;
-    }
-
-    /**
      * Funding option related to default funding option.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\FundingOption $related_funding_option
      * 
@@ -255,5 +233,5 @@
     /**
      * Funding option related to default funding option.
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\FundingOption
      */
Index: /lib/PayPal/Api/PayerInfo.php
===================================================================
--- /lib/PayPal/Api/PayerInfo.php	(revision 8528)
+++ /lib/PayPal/Api/PayerInfo.php	(revision 5261)
@@ -28,9 +28,10 @@
  * @property string country_code
  * @property \PayPal\Api\Address billing_address
+ * @property \PayPal\Api\ShippingAddress shipping_address
  */
 class PayerInfo extends PayPalModel
 {
     /**
-     * Email address representing the payer. 127 characters max.
+     * Email address representing the Payer.
      *
      * @param string $email
@@ -45,5 +46,5 @@
 
     /**
-     * Email address representing the payer. 127 characters max.
+     * Email address representing the Payer.
      *
      * @return string
@@ -55,5 +56,5 @@
 
     /**
-     * External Remember Me id representing the payer
+     * External Remember Me id representing the Payer
      *
      * @param string $external_remember_me_id
@@ -68,5 +69,5 @@
 
     /**
-     * External Remember Me id representing the payer
+     * External Remember Me id representing the Payer
      *
      * @return string
@@ -80,12 +81,11 @@
      * Account Number representing the Payer
      *
-     * @deprecated Use #setBuyerAccountNumberInstead
-     * @param string $account_number
-     *
-     * @return $this
-     */
-    public function setAccountNumber($account_number)
-    {
-        $this->account_number = $account_number;
+     * @param string $buyer_account_number
+     * 
+     * @return $this
+     */
+    public function setBuyerAccountNumber($buyer_account_number)
+    {
+        $this->buyer_account_number = $buyer_account_number;
         return $this;
     }
@@ -94,30 +94,4 @@
      * Account Number representing the Payer
      *
-     * @deprecated Use #getBuyerAccountNumberInstead
-     *
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getAccountNumber()
-    {
-        return $this->account_number;
-    }
-
-    /**
-     * Account Number representing the Payer
-     *
-     * @param string $buyer_account_number
-     * 
-     * @return $this
-     */
-    public function setBuyerAccountNumber($buyer_account_number)
-    {
-        $this->buyer_account_number = $buyer_account_number;
-        return $this;
-    }
-
-    /**
-     * Account Number representing the Payer
-     *
      * @return string
      */
@@ -128,5 +102,5 @@
 
     /**
-     * Salutation of the payer.
+     * Salutation of the Payer.
      *
      * @param string $salutation
@@ -141,5 +115,5 @@
 
     /**
-     * Salutation of the payer.
+     * Salutation of the Payer.
      *
      * @return string
@@ -151,5 +125,5 @@
 
     /**
-     * First name of the payer.
+     * First Name of the Payer.
      *
      * @param string $first_name
@@ -164,5 +138,5 @@
 
     /**
-     * First name of the payer.
+     * First Name of the Payer.
      *
      * @return string
@@ -174,5 +148,5 @@
 
     /**
-     * Middle name of the payer.
+     * Middle Name of the Payer.
      *
      * @param string $middle_name
@@ -187,5 +161,5 @@
 
     /**
-     * Middle name of the payer.
+     * Middle Name of the Payer.
      *
      * @return string
@@ -197,5 +171,5 @@
 
     /**
-     * Last name of the payer.
+     * Last Name of the Payer.
      *
      * @param string $last_name
@@ -210,5 +184,5 @@
 
     /**
-     * Last name of the payer.
+     * Last Name of the Payer.
      *
      * @return string
@@ -220,5 +194,5 @@
 
     /**
-     * Suffix of the payer.
+     * Suffix of the Payer.
      *
      * @param string $suffix
@@ -233,5 +207,5 @@
 
     /**
-     * Suffix of the payer.
+     * Suffix of the Payer.
      *
      * @return string
@@ -243,5 +217,5 @@
 
     /**
-     * PayPal assigned encrypted Payer ID.
+     * PayPal assigned Payer ID.
      *
      * @param string $payer_id
@@ -256,5 +230,5 @@
 
     /**
-     * PayPal assigned encrypted Payer ID.
+     * PayPal assigned Payer ID.
      *
      * @return string
@@ -266,5 +240,5 @@
 
     /**
-     * Phone number representing the payer. 20 characters max.
+     * Phone number representing the Payer.
      *
      * @param string $phone
@@ -279,5 +253,5 @@
 
     /**
-     * Phone number representing the payer. 20 characters max.
+     * Phone number representing the Payer.
      *
      * @return string
@@ -336,5 +310,5 @@
 
     /**
-     * Payerâs tax ID. Only supported when the `payment_method` is set to `paypal`.
+     * Payer's tax ID.
      *
      * @param string $tax_id
@@ -349,5 +323,5 @@
 
     /**
-     * Payerâs tax ID. Only supported when the `payment_method` is set to `paypal`.
+     * Payer's tax ID.
      *
      * @return string
@@ -359,5 +333,5 @@
 
     /**
-     * Payerâs tax ID type. Allowed values: `BR_CPF` or `BR_CNPJ`. Only supported when the `payment_method` is set to `paypal`.
+     * Payer's tax ID type.
      * Valid Values: ["BR_CPF", "BR_CNPJ"]
      *
@@ -373,5 +347,5 @@
 
     /**
-     * Payerâs tax ID type. Allowed values: `BR_CPF` or `BR_CNPJ`. Only supported when the `payment_method` is set to `paypal`.
+     * Payer's tax ID type.
      *
      * @return string
@@ -383,5 +357,5 @@
 
     /**
-     * Two-letter registered country code of the payer to identify the buyer country.
+     * 2 letter registered country code of the payer to identify the buyer country
      *
      * @param string $country_code
@@ -396,5 +370,5 @@
 
     /**
-     * Two-letter registered country code of the payer to identify the buyer country.
+     * 2 letter registered country code of the payer to identify the buyer country
      *
      * @return string
@@ -429,5 +403,5 @@
 
     /**
-     * @deprecated [DEPRECATED] Use shipping address present in purchase unit or at root level of checkout Session.
+     * Obsolete. Use shipping address present in purchase unit.
      *
      * @param \PayPal\Api\ShippingAddress $shipping_address
@@ -442,5 +416,5 @@
 
     /**
-     * @deprecated  [DEPRECATED] Use shipping address present in purchase unit or at root level of checkout Session.
+     * Obsolete. Use shipping address present in purchase unit.
      *
      * @return \PayPal\Api\ShippingAddress
Index: /lib/PayPal/Api/Payment.php
===================================================================
--- /lib/PayPal/Api/Payment.php	(revision 8528)
+++ /lib/PayPal/Api/Payment.php	(revision 5261)
@@ -6,5 +6,8 @@
 use PayPal\Core\PayPalConstants;
 use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\object;
+use PayPal\Api\PaymentHistory;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
@@ -16,16 +19,16 @@
  *
  * @property string id
+ * @property string create_time
+ * @property string update_time
  * @property string intent
  * @property \PayPal\Api\Payer payer
+ * @property \PayPal\Api\Payee payee
+ * @property string cart
  * @property \PayPal\Api\Transaction[] transactions
+ * @property \PayPal\Api\Error[] failed_transactions
+ * @property \PayPal\Api\PaymentInstruction payment_instruction
  * @property string state
+ * @property \PayPal\Api\RedirectUrls redirect_urls
  * @property string experience_profile_id
- * @property string note_to_payer
- * @property \PayPal\Api\Payee $payee
- * @property \PayPal\Api\RedirectUrls redirect_urls
- * @property string failure_reason
- * @property string create_time
- * @property string update_time
- * @property \PayPal\Api\Links[] links
  */
 class Payment extends PayPalResourceModel
@@ -55,5 +58,5 @@
 
     /**
-     * Payment intent.
+     * Intent of the payment - Sale or Authorization or Order.
      * Valid Values: ["sale", "authorize", "order"]
      *
@@ -69,5 +72,5 @@
 
     /**
-     * Payment intent.
+     * Intent of the payment - Sale or Authorization or Order.
      *
      * @return string
@@ -102,28 +105,6 @@
 
     /**
-     * Information that the merchant knows about the payer.  This information is not definitive and only serves as a hint to the UI or any pre-processing logic.
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\PotentialPayerInfo $potential_payer_info
-     * 
-     * @return $this
-     */
-    public function setPotentialPayerInfo($potential_payer_info)
-    {
-        $this->potential_payer_info = $potential_payer_info;
-        return $this;
-    }
-
-    /**
-     * Information that the merchant knows about the payer.  This information is not definitive and only serves as a hint to the UI or any pre-processing logic.
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\PotentialPayerInfo
-     */
-    public function getPotentialPayerInfo()
-    {
-        return $this->potential_payer_info;
-    }
-
-    /**
-     * Receiver of funds for this payment.
+     * .
+     *
      * @param \PayPal\Api\Payee $payee
      * 
@@ -137,5 +118,6 @@
 
     /**
-     * Receiver of funds for this payment.
+     * .
+     *
      * @return \PayPal\Api\Payee
      */
@@ -147,5 +129,5 @@
     /**
      * ID of the cart to execute the payment.
-     * @deprecated Not publicly available
+     *
      * @param string $cart
      * 
@@ -160,5 +142,5 @@
     /**
      * ID of the cart to execute the payment.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -169,5 +151,5 @@
 
     /**
-     * Transactional details including the amount and item details.
+     * A payment can have more than one transaction, with each transaction establishing a contract between the payer and a payee
      *
      * @param \PayPal\Api\Transaction[] $transactions
@@ -182,5 +164,5 @@
 
     /**
-     * Transactional details including the amount and item details.
+     * A payment can have more than one transaction, with each transaction establishing a contract between the payer and a payee
      *
      * @return \PayPal\Api\Transaction[]
@@ -223,5 +205,5 @@
     /**
      * Applicable for advanced payments like multi seller payment (MSP) to support partial failures
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Error[] $failed_transactions
      * 
@@ -236,5 +218,5 @@
     /**
      * Applicable for advanced payments like multi seller payment (MSP) to support partial failures
-     * @deprecated Not publicly available
+     *
      * @return \PayPal\Api\Error[]
      */
@@ -246,5 +228,5 @@
     /**
      * Append FailedTransactions to the list.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Error $error
      * @return $this
@@ -263,5 +245,5 @@
     /**
      * Remove FailedTransactions from the list.
-     * @deprecated Not publicly available
+     *
      * @param \PayPal\Api\Error $error
      * @return $this
@@ -275,82 +257,6 @@
 
     /**
-     * Collection of PayPal generated billing agreement tokens.
-     * @deprecated Not publicly available
-     * @param string[] $billing_agreement_tokens
-     * 
-     * @return $this
-     */
-    public function setBillingAgreementTokens($billing_agreement_tokens)
-    {
-        $this->billing_agreement_tokens = $billing_agreement_tokens;
-        return $this;
-    }
-
-    /**
-     * Collection of PayPal generated billing agreement tokens.
-     * @deprecated Not publicly available
-     * @return string[]
-     */
-    public function getBillingAgreementTokens()
-    {
-        return $this->billing_agreement_tokens;
-    }
-
-    /**
-     * Append BillingAgreementTokens to the list.
-     * @deprecated Not publicly available
-     * @param string $billingAgreementToken
-     * @return $this
-     */
-    public function addBillingAgreementToken($billingAgreementToken)
-    {
-        if (!$this->getBillingAgreementTokens()) {
-            return $this->setBillingAgreementTokens(array($billingAgreementToken));
-        } else {
-            return $this->setBillingAgreementTokens(
-                array_merge($this->getBillingAgreementTokens(), array($billingAgreementToken))
-            );
-        }
-    }
-
-    /**
-     * Remove BillingAgreementTokens from the list.
-     * @deprecated Not publicly available
-     * @param string $billingAgreementToken
-     * @return $this
-     */
-    public function removeBillingAgreementToken($billingAgreementToken)
-    {
-        return $this->setBillingAgreementTokens(
-            array_diff($this->getBillingAgreementTokens(), array($billingAgreementToken))
-        );
-    }
-
-    /**
-     * Credit financing offered to payer on PayPal side. Returned in payment after payer opts-in
-     * @deprecated Not publicly available
-     * @param \PayPal\Api\CreditFinancingOffered $credit_financing_offered
-     * 
-     * @return $this
-     */
-    public function setCreditFinancingOffered($credit_financing_offered)
-    {
-        $this->credit_financing_offered = $credit_financing_offered;
-        return $this;
-    }
-
-    /**
-     * Credit financing offered to payer on PayPal side. Returned in payment after payer opts-in
-     * @deprecated Not publicly available
-     * @return \PayPal\Api\CreditFinancingOffered
-     */
-    public function getCreditFinancingOffered()
-    {
-        return $this->credit_financing_offered;
-    }
-
-    /**
-     * Instructions for the payer to complete this payment.
-     * @deprecated Not publicly available
+     * A payment instruction resource
+     *
      * @param \PayPal\Api\PaymentInstruction $payment_instruction
      * 
@@ -364,6 +270,6 @@
 
     /**
-     * Instructions for the payer to complete this payment.
-     * @deprecated Not publicly available
+     * A payment instruction resource
+     *
      * @return \PayPal\Api\PaymentInstruction
      */
@@ -374,6 +280,6 @@
 
     /**
-     * The state of the payment, authorization, or order transaction. The value is:<ul><li><code>created</code>. The transaction was successfully created.</li><li><code>approved</code>. The buyer approved the transaction.</li><li><code>failed</code>. The transaction request failed.</li></ul>
-     * Valid Values: ["created", "approved", "failed", "partially_completed", "in_progress"]
+     * state of the payment
+     * Valid Values: ["created", "approved", "completed", "partially_completed", "failed", "canceled", "expired", "in_progress"]
      *
      * @param string $state
@@ -388,5 +294,5 @@
 
     /**
-     * The state of the payment, authorization, or order transaction. The value is:<ul><li><code>created</code>. The transaction was successfully created.</li><li><code>approved</code>. The buyer approved the transaction.</li><li><code>failed</code>. The transaction request failed.</li></ul>
+     * state of the payment
      *
      * @return string
@@ -398,5 +304,5 @@
 
     /**
-     * PayPal generated identifier for the merchant's payment experience profile. Refer to [this](https://developer.paypal.com/docs/api/#payment-experience) link to create experience profile ID.
+     * Identifier for the payment experience.
      *
      * @param string $experience_profile_id
@@ -411,5 +317,5 @@
 
     /**
-     * PayPal generated identifier for the merchant's payment experience profile. Refer to [this](https://developer.paypal.com/docs/api/#payment-experience) link to create experience profile ID.
+     * Identifier for the payment experience.
      *
      * @return string
@@ -421,28 +327,5 @@
 
     /**
-     * free-form field for the use of clients to pass in a message to the payer
-     *
-     * @param string $note_to_payer
-     * 
-     * @return $this
-     */
-    public function setNoteToPayer($note_to_payer)
-    {
-        $this->note_to_payer = $note_to_payer;
-        return $this;
-    }
-
-    /**
-     * free-form field for the use of clients to pass in a message to the payer
-     *
-     * @return string
-     */
-    public function getNoteToPayer()
-    {
-        return $this->note_to_payer;
-    }
-
-    /**
-     * Set of redirect URLs you provide only for PayPal-based payments.
+     * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls.
      *
      * @param \PayPal\Api\RedirectUrls $redirect_urls
@@ -457,5 +340,5 @@
 
     /**
-     * Set of redirect URLs you provide only for PayPal-based payments.
+     * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls.
      *
      * @return \PayPal\Api\RedirectUrls
@@ -467,29 +350,5 @@
 
     /**
-     * Failure reason code returned when the payment failed for some valid reasons.
-     * Valid Values: ["UNABLE_TO_COMPLETE_TRANSACTION", "INVALID_PAYMENT_METHOD", "PAYER_CANNOT_PAY", "CANNOT_PAY_THIS_PAYEE", "REDIRECT_REQUIRED", "PAYEE_FILTER_RESTRICTIONS"]
-     *
-     * @param string $failure_reason
-     * 
-     * @return $this
-     */
-    public function setFailureReason($failure_reason)
-    {
-        $this->failure_reason = $failure_reason;
-        return $this;
-    }
-
-    /**
-     * Failure reason code returned when the payment failed for some valid reasons.
-     *
-     * @return string
-     */
-    public function getFailureReason()
-    {
-        return $this->failure_reason;
-    }
-
-    /**
-     * Payment creation time as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $create_time
@@ -504,5 +363,5 @@
 
     /**
-     * Payment creation time as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -514,5 +373,5 @@
 
     /**
-     * Payment update time as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @param string $update_time
@@ -527,5 +386,5 @@
 
     /**
-     * Payment update time as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @return string
@@ -545,19 +404,7 @@
         return $this->getLink(PayPalConstants::APPROVAL_URL);
     }
-	
-	/**
-     * Get token from Approval Link
-     *
-     * @return null|string
-     */
-	public function getToken()
-	{
-		$parameter_name = "token";
-		parse_str(parse_url($this->getApprovalLink(), PHP_URL_QUERY), $query);
-		return !isset($query[$parameter_name]) ? null : $query[$parameter_name];
-	}
-	
-    /**
-     * Creates and processes a payment. In the JSON request body, include a `payment` object with the intent, payer, and transactions. For PayPal payments, include redirect URLs in the `payment` object.
+
+    /**
+     * Create and process a payment by passing a payment object that includes the intent, payer, and transactions in the body of the request JSON. For PayPal payments, include redirect URLs in the payment object.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -581,5 +428,5 @@
 
     /**
-     * Shows details for a payment, by ID.
+     * Look up a particular payment resource by passing the payment_id in the request URI.
      *
      * @param string $paymentId
@@ -606,5 +453,5 @@
 
     /**
-     * Partially updates a payment, by ID. You can update the amount, shipping address, invoice ID, and custom data. You cannot use patch after execute has been called.
+     * Partially update a payment resource by by passing the payment_id in the request URI. In addition, pass a patch_request_object in the body of the request JSON that specifies the operation to perform, path of the target location, and new value to apply. Please note that it is not possible to use patch after execute has been called.
      *
      * @param PatchRequest $patchRequest
@@ -630,5 +477,5 @@
 
     /**
-     * Executes, or completes, a PayPal payment that the payer has approved. You can optionally update selective payment information when you execute a payment.
+     * Execute (complete) a PayPal payment that has been approved by the payer by passing the payment_id in the request URI. This request only works after a buyer has approved the payment using the provided PayPal approval URL. Optionally update transaction information when executing the payment by passing in one or more transactions.
      *
      * @param PaymentExecution $paymentExecution
@@ -655,5 +502,5 @@
 
     /**
-     * List payments that were made to the merchant who issues the request. Payments can be in any state.
+     * List payments in any state (created, approved, failed, etc.). Payments returned are the payments made to the merchant issuing the request.
      *
      * @param array $params
@@ -667,12 +514,12 @@
         $payLoad = "";
         $allowedParams = array(
-                    'count' => 1,
-                    'start_id' => 1,
-                    'start_index' => 1,
-                    'start_time' => 1,
-                    'end_time' => 1,
-                    'payee_id' => 1,
-                    'sort_by' => 1,
-                    'sort_order' => 1,
+            'count' => 1,
+            'start_id' => 1,
+            'start_index' => 1,
+            'start_time' => 1,
+            'end_time' => 1,
+            'payee_id' => 1,
+            'sort_by' => 1,
+            'sort_order' => 1,
         );
         $json = self::executeCall(
Index: /lib/PayPal/Api/PaymentCard.php
===================================================================
--- /lib/PayPal/Api/PaymentCard.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentCard.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PaymentCard
  *
- * A payment card that can fund a payment.
+ * A resource representing a payment card that can be used to fund a payment.
  *
  * @package PayPal\Api
@@ -15,6 +15,6 @@
  * @property string number
  * @property string type
- * @property string expire_month
- * @property string expire_year
+ * @property int expire_month
+ * @property int expire_year
  * @property string start_month
  * @property string start_year
@@ -26,7 +26,5 @@
  * @property string external_customer_id
  * @property string status
- * @property string card_product_class
  * @property string valid_until
- * @property string issue_number
  * @property \PayPal\Api\Links[] links
  */
@@ -34,5 +32,5 @@
 {
     /**
-     * The ID of a credit card to save for later use.
+     * ID of the credit card being saved for later use.
      *
      * @param string $id
@@ -47,5 +45,5 @@
 
     /**
-     * The ID of a credit card to save for later use.
+     * ID of the credit card being saved for later use.
      *
      * @return string
@@ -57,5 +55,5 @@
 
     /**
-     * The card number.
+     * Card number.
      *
      * @param string $number
@@ -70,5 +68,5 @@
 
     /**
-     * The card number.
+     * Card number.
      *
      * @return string
@@ -80,5 +78,5 @@
 
     /**
-     * The card type.
+     * Type of the Card.
      * Valid Values: ["VISA", "AMEX", "SOLO", "JCB", "STAR", "DELTA", "DISCOVER", "SWITCH", "MAESTRO", "CB_NATIONALE", "CONFINOGA", "COFIDIS", "ELECTRON", "CETELEM", "CHINA_UNION_PAY", "MASTERCARD"]
      *
@@ -94,5 +92,5 @@
 
     /**
-     * The card type.
+     * Type of the Card.
      *
      * @return string
@@ -104,7 +102,7 @@
 
     /**
-     * The two-digit expiry month for the card.
-     *
-     * @param string $expire_month
+     * 2 digit card expiry month.
+     *
+     * @param int $expire_month
      * 
      * @return $this
@@ -117,7 +115,7 @@
 
     /**
-     * The two-digit expiry month for the card.
-     *
-     * @return string
+     * 2 digit card expiry month.
+     *
+     * @return int
      */
     public function getExpireMonth()
@@ -127,7 +125,7 @@
 
     /**
-     * The four-digit expiry year for the card.
-     *
-     * @param string $expire_year
+     * 4 digit card expiry year
+     *
+     * @param int $expire_year
      * 
      * @return $this
@@ -140,7 +138,7 @@
 
     /**
-     * The four-digit expiry year for the card.
-     *
-     * @return string
+     * 4 digit card expiry year
+     *
+     * @return int
      */
     public function getExpireYear()
@@ -150,5 +148,5 @@
 
     /**
-     * The two-digit start month for the card. Required for UK Maestro cards.
+     * 2 digit card start month.
      *
      * @param string $start_month
@@ -163,5 +161,5 @@
 
     /**
-     * The two-digit start month for the card. Required for UK Maestro cards.
+     * 2 digit card start month.
      *
      * @return string
@@ -173,5 +171,5 @@
 
     /**
-     * The four-digit start year for the card. Required for UK Maestro cards. 
+     * 4 digit card start year.
      *
      * @param string $start_year
@@ -186,5 +184,5 @@
 
     /**
-     * The four-digit start year for the card. Required for UK Maestro cards. 
+     * 4 digit card start year.
      *
      * @return string
@@ -196,5 +194,5 @@
 
     /**
-     * The validation code for the card. Supported for payments but not for saving payment cards for future use.
+     * Card validation code. Only supported when making a Payment but not when saving a payment card for future use.
      *
      * @param string $cvv2
@@ -209,5 +207,5 @@
 
     /**
-     * The validation code for the card. Supported for payments but not for saving payment cards for future use.
+     * Card validation code. Only supported when making a Payment but not when saving a payment card for future use.
      *
      * @return string
@@ -219,5 +217,5 @@
 
     /**
-     * The first name of the card holder.
+     * Card holder's first name.
      *
      * @param string $first_name
@@ -232,5 +230,5 @@
 
     /**
-     * The first name of the card holder.
+     * Card holder's first name.
      *
      * @return string
@@ -242,5 +240,5 @@
 
     /**
-     * The last name of the card holder.
+     * Card holder's last name.
      *
      * @param string $last_name
@@ -255,5 +253,5 @@
 
     /**
-     * The last name of the card holder.
+     * Card holder's last name.
      *
      * @return string
@@ -265,5 +263,5 @@
 
     /**
-     * The two-letter country code.
+     * 2 letter country code
      *
      * @param string $billing_country
@@ -278,5 +276,5 @@
 
     /**
-     * The two-letter country code.
+     * 2 letter country code
      *
      * @return string
@@ -288,5 +286,5 @@
 
     /**
-     * The billing address for the card.
+     * Billing Address associated with this card.
      *
      * @param \PayPal\Api\Address $billing_address
@@ -301,5 +299,5 @@
 
     /**
-     * The billing address for the card.
+     * Billing Address associated with this card.
      *
      * @return \PayPal\Api\Address
@@ -311,5 +309,5 @@
 
     /**
-     * The ID of the customer who owns this card account. The facilitator generates and provides this ID. Required when you create or use a stored funding instrument in the PayPal vault.
+     * A unique identifier of the customer to whom this card account belongs to. Generated and provided by the facilitator. This is required when creating or using a stored funding instrument in vault.
      *
      * @param string $external_customer_id
@@ -324,5 +322,5 @@
 
     /**
-     * The ID of the customer who owns this card account. The facilitator generates and provides this ID. Required when you create or use a stored funding instrument in the PayPal vault.
+     * A unique identifier of the customer to whom this card account belongs to. Generated and provided by the facilitator. This is required when creating or using a stored funding instrument in vault.
      *
      * @return string
@@ -334,5 +332,5 @@
 
     /**
-     * The state of the funding instrument.
+     * State of the funding instrument.
      * Valid Values: ["EXPIRED", "ACTIVE"]
      *
@@ -348,5 +346,5 @@
 
     /**
-     * The state of the funding instrument.
+     * State of the funding instrument.
      *
      * @return string
@@ -358,29 +356,5 @@
 
     /**
-     * The product class of the financial instrument issuer.
-     * Valid Values: ["CREDIT", "DEBIT", "GIFT", "PAYPAL_PREPAID", "PREPAID", "UNKNOWN"]
-     *
-     * @param string $card_product_class
-     * 
-     * @return $this
-     */
-    public function setCardProductClass($card_product_class)
-    {
-        $this->card_product_class = $card_product_class;
-        return $this;
-    }
-
-    /**
-     * The product class of the financial instrument issuer.
-     *
-     * @return string
-     */
-    public function getCardProductClass()
-    {
-        return $this->card_product_class;
-    }
-
-    /**
-     * The date and time until when this instrument can be used fund a payment.
+     * Date/Time until this resource can be used fund a payment.
      *
      * @param string $valid_until
@@ -395,5 +369,5 @@
 
     /**
-     * The date and time until when this instrument can be used fund a payment.
+     * Date/Time until this resource can be used fund a payment.
      *
      * @return string
@@ -402,27 +376,4 @@
     {
         return $this->valid_until;
-    }
-
-    /**
-     * The one- to two-digit card issue number. Required for UK Maestro cards.
-     *
-     * @param string $issue_number
-     * 
-     * @return $this
-     */
-    public function setIssueNumber($issue_number)
-    {
-        $this->issue_number = $issue_number;
-        return $this;
-    }
-
-    /**
-     * The one- to two-digit card issue number. Required for UK Maestro cards.
-     *
-     * @return string
-     */
-    public function getIssueNumber()
-    {
-        return $this->issue_number;
     }
 
Index: /lib/PayPal/Api/PaymentDetail.php
===================================================================
--- /lib/PayPal/Api/PaymentDetail.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentDetail.php	(revision 5261)
@@ -18,10 +18,9 @@
  * @property string method
  * @property string note
- * @property \PayPal\Api\Currency amount
  */
 class PaymentDetail extends PayPalModel
 {
     /**
-     * The PayPal payment detail. Indicates whether payment was made in an invoicing flow through PayPal or externally. In the case of the mark-as-paid API, the supported payment type is `EXTERNAL`. For backward compatibility, the `PAYPAL` payment type is still supported.
+     * PayPal payment detail indicating whether payment was made in an invoicing flow via PayPal or externally. In the case of the mark-as-paid API, payment type is EXTERNAL and this is what is now supported. The PAYPAL value is provided for backward compatibility.
      * Valid Values: ["PAYPAL", "EXTERNAL"]
      *
@@ -37,5 +36,5 @@
 
     /**
-     * The PayPal payment detail. Indicates whether payment was made in an invoicing flow through PayPal or externally. In the case of the mark-as-paid API, the supported payment type is `EXTERNAL`. For backward compatibility, the `PAYPAL` payment type is still supported.
+     * PayPal payment detail indicating whether payment was made in an invoicing flow via PayPal or externally. In the case of the mark-as-paid API, payment type is EXTERNAL and this is what is now supported. The PAYPAL value is provided for backward compatibility.
      *
      * @return string
@@ -47,5 +46,5 @@
 
     /**
-     * The PayPal payment transaction ID. Required with the `PAYPAL` payment type.
+     * PayPal payment transaction id. Mandatory field in case the type value is PAYPAL.
      *
      * @param string $transaction_id
@@ -60,5 +59,5 @@
 
     /**
-     * The PayPal payment transaction ID. Required with the `PAYPAL` payment type.
+     * PayPal payment transaction id. Mandatory field in case the type value is PAYPAL.
      *
      * @return string
@@ -94,5 +93,5 @@
 
     /**
-     * The date when the invoice was paid. The date format is *yyyy*-*MM*-*dd* *z* as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date when the invoice was paid. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $date
@@ -107,5 +106,5 @@
 
     /**
-     * The date when the invoice was paid. The date format is *yyyy*-*MM*-*dd* *z* as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date when the invoice was paid. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -117,5 +116,5 @@
 
     /**
-     * The payment mode or method. Required with the `EXTERNAL` payment type.
+     * Payment mode or method. This field is mandatory if the value of the type field is EXTERNAL.
      * Valid Values: ["BANK_TRANSFER", "CASH", "CHECK", "CREDIT_CARD", "DEBIT_CARD", "PAYPAL", "WIRE_TRANSFER", "OTHER"]
      *
@@ -131,5 +130,5 @@
 
     /**
-     * The payment mode or method. Required with the `EXTERNAL` payment type.
+     * Payment mode or method. This field is mandatory if the value of the type field is EXTERNAL.
      *
      * @return string
@@ -141,5 +140,5 @@
 
     /**
-     * Optional. A note associated with the payment.
+     * Optional note associated with the payment.
      *
      * @param string $note
@@ -154,5 +153,5 @@
 
     /**
-     * Optional. A note associated with the payment.
+     * Optional note associated with the payment.
      *
      * @return string
@@ -163,26 +162,3 @@
     }
 
-    /**
-     * The amount to record as payment against invoice. If you omit this parameter, the total invoice amount is recorded as payment.
-     *
-     * @param \PayPal\Api\Currency $amount
-     * 
-     * @return $this
-     */
-    public function setAmount($amount)
-    {
-        $this->amount = $amount;
-        return $this;
-    }
-
-    /**
-     * The amount to record as payment against invoice. If you omit this parameter, the total invoice amount is recorded as payment.
-     *
-     * @return \PayPal\Api\Currency
-     */
-    public function getAmount()
-    {
-        return $this->amount;
-    }
-
 }
Index: /lib/PayPal/Api/PaymentExecution.php
===================================================================
--- /lib/PayPal/Api/PaymentExecution.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentExecution.php	(revision 5261)
@@ -18,5 +18,5 @@
 {
     /**
-     * The ID of the Payer, passed in the `return_url` by PayPal.
+     * PayPal assigned Payer ID returned in the approval return url.
      *
      * @param string $payer_id
@@ -31,5 +31,5 @@
 
     /**
-     * The ID of the Payer, passed in the `return_url` by PayPal.
+     * PayPal assigned Payer ID returned in the approval return url.
      *
      * @return string
@@ -41,28 +41,5 @@
 
     /**
-     * Carrier account id for a carrier billing payment. For a carrier billing payment, payer_id is not applicable.
-     * @deprecated Not publicly available
-     * @param string $carrier_account_id
-     * 
-     * @return $this
-     */
-    public function setCarrierAccountId($carrier_account_id)
-    {
-        $this->carrier_account_id = $carrier_account_id;
-        return $this;
-    }
-
-    /**
-     * Carrier account id for a carrier billing payment. For a carrier billing payment, payer_id is not applicable.
-     * @deprecated Not publicly available
-     * @return string
-     */
-    public function getCarrierAccountId()
-    {
-        return $this->carrier_account_id;
-    }
-
-    /**
-     * Transactional details including the amount and item details.
+     * Transaction information to be used at the time of execute payment. Only amount and shipping_address can be updated in execute payment
      *
      * @param \PayPal\Api\Transaction[] $transactions
@@ -77,5 +54,5 @@
 
     /**
-     * Transactional details including the amount and item details.
+     * Transaction information to be used at the time of execute payment. Only amount and shipping_address can be updated in execute payment
      *
      * @return \PayPal\Api\Transaction[]
Index: /lib/PayPal/Api/PaymentHistory.php
===================================================================
--- /lib/PayPal/Api/PaymentHistory.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentHistory.php	(revision 5261)
@@ -72,5 +72,5 @@
 
     /**
-     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items. Maximum value: 20.
+     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items.
      *
      * @param int $count
@@ -85,5 +85,5 @@
 
     /**
-     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items. Maximum value: 20.
+     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items.
      *
      * @return int
Index: /lib/PayPal/Api/PaymentInstruction.php
===================================================================
--- /lib/PayPal/Api/PaymentInstruction.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentInstruction.php	(revision 5261)
@@ -4,21 +4,22 @@
 
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
-use PayPal\Validation\ArgumentValidator;
+use PayPal\Transport\PayPalRestCall;
 
 /**
  * Class PaymentInstruction
  *
- * Contain details of how and when the payment should be made to PayPal in cases of manual bank transfer.
+ * Object used to represent payment instruction.
  *
  * @package PayPal\Api
  *
- * @property string                                  reference_number
- * @property string                                  instruction_type
+ * @property string reference_number
+ * @property string instruction_type
  * @property \PayPal\Api\RecipientBankingInstruction recipient_banking_instruction
- * @property \PayPal\Api\Currency                    amount
- * @property string                                  payment_due_date
- * @property string                                  note
- * @property \PayPal\Api\Links[]                     links
+ * @property \PayPal\Api\Currency amount
+ * @property string payment_due_date
+ * @property string note
+ * @property \PayPal\Api\Links[] links
  */
 class PaymentInstruction extends PayPalResourceModel
@@ -28,5 +29,5 @@
      *
      * @param string $reference_number
-     *
+     * 
      * @return $this
      */
@@ -46,5 +47,4 @@
         return $this->reference_number;
     }
-
     /**
      * Type of payment instruction
@@ -52,5 +52,5 @@
      *
      * @param string $instruction_type
-     *
+     * 
      * @return $this
      */
@@ -75,5 +75,5 @@
      *
      * @param \PayPal\Api\RecipientBankingInstruction $recipient_banking_instruction
-     *
+     * 
      * @return $this
      */
@@ -98,5 +98,5 @@
      *
      * @param \PayPal\Api\Currency $amount
-     *
+     * 
      * @return $this
      */
@@ -121,5 +121,5 @@
      *
      * @param string $payment_due_date
-     *
+     * 
      * @return $this
      */
@@ -144,5 +144,5 @@
      *
      * @param string $note
-     *
+     * 
      * @return $this
      */
@@ -166,7 +166,7 @@
      * Retrieve a payment instruction by passing the payment_id in the request URI. Use this request if you are implementing a solution that includes delayed payment like Pay Upon Invoice (PUI).
      *
-     * @param string         $paymentId
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param string $paymentId
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return PaymentInstruction
      */
Index: /lib/PayPal/Api/PaymentOptions.php
===================================================================
--- /lib/PayPal/Api/PaymentOptions.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentOptions.php	(revision 5261)
@@ -40,49 +40,3 @@
     }
 
-    /**
-     * Indicator if this payment request is a recurring payment. Only supported when the `payment_method` is set to `credit_card`
-     * @deprecated Not publicly available
-     * @param bool $recurring_flag
-     * 
-     * @return $this
-     */
-    public function setRecurringFlag($recurring_flag)
-    {
-        $this->recurring_flag = $recurring_flag;
-        return $this;
-    }
-
-    /**
-     * Indicator if this payment request is a recurring payment. Only supported when the `payment_method` is set to `credit_card`
-     * @deprecated Not publicly available
-     * @return bool
-     */
-    public function getRecurringFlag()
-    {
-        return $this->recurring_flag;
-    }
-
-    /**
-     * Indicator if fraud management filters (fmf) should be skipped for this transaction. Only supported when the `payment_method` is set to `credit_card`
-     * @deprecated Not publicly available
-     * @param bool $skip_fmf
-     * 
-     * @return $this
-     */
-    public function setSkipFmf($skip_fmf)
-    {
-        $this->skip_fmf = $skip_fmf;
-        return $this;
-    }
-
-    /**
-     * Indicator if fraud management filters (fmf) should be skipped for this transaction. Only supported when the `payment_method` is set to `credit_card`
-     * @deprecated Not publicly available
-     * @return bool
-     */
-    public function getSkipFmf()
-    {
-        return $this->skip_fmf;
-    }
-
 }
Index: /lib/PayPal/Api/PaymentTerm.php
===================================================================
--- /lib/PayPal/Api/PaymentTerm.php	(revision 8528)
+++ /lib/PayPal/Api/PaymentTerm.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PaymentTerm
  *
- * The payment term of the invoice. If you specify `term_type`, you cannot specify `due_date` and vice versa.
+ * Payment term of the invoice. If term_type is present, due_date must not be present and vice versa.
  *
  * @package PayPal\Api
@@ -18,6 +18,6 @@
 {
     /**
-     * The terms by which the invoice payment is due.
-     * Valid Values: ["DUE_ON_RECEIPT", "DUE_ON_DATE_SPECIFIED", "NET_10", "NET_15", "NET_30", "NET_45", "NET_60", "NET_90", "NO_DUE_DATE"]
+     * Terms by which the invoice payment is due.
+     * Valid Values: ["DUE_ON_RECEIPT", "NET_10", "NET_15", "NET_30", "NET_45"]
      *
      * @param string $term_type
@@ -32,5 +32,5 @@
 
     /**
-     * The terms by which the invoice payment is due.
+     * Terms by which the invoice payment is due.
      *
      * @return string
@@ -42,5 +42,5 @@
 
     /**
-     * The date when the invoice payment is due. This date must be a future date. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date on which invoice payment is due. It must be always a future date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $due_date
@@ -55,5 +55,5 @@
 
     /**
-     * The date when the invoice payment is due. This date must be a future date. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Date on which invoice payment is due. It must be always a future date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
Index: /lib/PayPal/Api/Payout.php
===================================================================
--- /lib/PayPal/Api/Payout.php	(revision 8528)
+++ /lib/PayPal/Api/Payout.php	(revision 5261)
@@ -4,7 +4,7 @@
 
 use PayPal\Common\PayPalResourceModel;
-use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
 use PayPal\Validation\ArgumentValidator;
+use PayPal\Rest\ApiContext;
 
 /**
Index: /lib/PayPal/Api/PayoutBatch.php
===================================================================
--- /lib/PayPal/Api/PayoutBatch.php	(revision 8528)
+++ /lib/PayPal/Api/PayoutBatch.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PayoutBatch
  *
- * The PayPal-generated batch status.
+ * The batch status as generated by PayPal.
  *
  * @package PayPal\Api
@@ -19,5 +19,5 @@
 {
     /**
-     * A batch header. Includes the generated batch status.
+     * A batch header that includes the generated batch status.
      *
      * @param \PayPal\Api\PayoutBatchHeader $batch_header
@@ -32,5 +32,5 @@
 
     /**
-     * A batch header. Includes the generated batch status.
+     * A batch header that includes the generated batch status.
      *
      * @return \PayPal\Api\PayoutBatchHeader
@@ -42,5 +42,5 @@
 
     /**
-     * An array of items in a batch payout.
+     * Array of the items in a batch payout.
      *
      * @param \PayPal\Api\PayoutItemDetails[] $items
@@ -55,5 +55,5 @@
 
     /**
-     * An array of items in a batch payout.
+     * Array of the items in a batch payout.
      *
      * @return \PayPal\Api\PayoutItemDetails[]
Index: /lib/PayPal/Api/PayoutBatchHeader.php
===================================================================
--- /lib/PayPal/Api/PayoutBatchHeader.php	(revision 8528)
+++ /lib/PayPal/Api/PayoutBatchHeader.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PayoutBatchHeader
  *
- * Batch header resource.
+ * This object enables you to get payout header information for an entire batch request. This object represents payout header data, and can be the response to a batch header request.
  *
  * @package PayPal\Api
@@ -25,5 +25,5 @@
 {
     /**
-     * The PayPal-generated ID for a batch payout.
+     * An ID for the batch payout. Generated by PayPal. 30 characters max.
      *
      * @param string $payout_batch_id
@@ -38,5 +38,5 @@
 
     /**
-     * The PayPal-generated ID for a batch payout.
+     * An ID for the batch payout. Generated by PayPal. 30 characters max.
      *
      * @return string
@@ -48,5 +48,5 @@
 
     /**
-     * The PayPal-generated batch payout status. If the batch payout passes the preliminary checks, the status is `PENDING`.
+     * Generated batch status.
      *
      * @param string $batch_status
@@ -61,5 +61,5 @@
 
     /**
-     * The PayPal-generated batch payout status. If the batch payout passes the preliminary checks, the status is `PENDING`.
+     * Generated batch status.
      *
      * @return string
@@ -74,5 +74,5 @@
      *
      * @param string $time_created
-     *
+     * 
      * @return $this
      */
@@ -97,5 +97,5 @@
      *
      * @param string $time_completed
-     *
+     * 
      * @return $this
      */
@@ -130,5 +130,5 @@
 
     /**
-     * The sender-provided batch payout header.
+     * The original batch header as provided by the payment sender.
      *
      * @return \PayPal\Api\PayoutSenderBatchHeader
@@ -143,5 +143,5 @@
      *
      * @param \PayPal\Api\Currency $amount
-     *
+     * 
      * @return $this
      */
@@ -166,5 +166,5 @@
      *
      * @param \PayPal\Api\Currency $fees
-     *
+     * 
      * @return $this
      */
@@ -189,5 +189,5 @@
      *
      * @param \PayPal\Api\Error $errors
-     *
+     * 
      * @return $this
      */
Index: /lib/PayPal/Api/PayoutItem.php
===================================================================
--- /lib/PayPal/Api/PayoutItem.php	(revision 8528)
+++ /lib/PayPal/Api/PayoutItem.php	(revision 5261)
@@ -4,12 +4,12 @@
 
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 
 /**
  * Class PayoutItem
  *
- * A sender-created definition of a payout to a single recipient.
+ * Sender-created description of a payout to a single recipient.
  *
  * @package PayPal\Api
@@ -24,8 +24,8 @@
 {
     /**
-     * The type of ID that identifies the payment receiver. Value is:<ul><code>EMAIL</code>. Unencrypted email. Value is a string of up to 127 single-byte characters.</li><li><code>PHONE</code>. Unencrypted phone number.<blockquote><strong>Note:</strong> The PayPal sandbox does not support the <code>PHONE</code> recipient type.</blockquote></li><li><code>PAYPAL_ID</code>. Encrypted PayPal account number.</li></ul>If the <code>sender_batch_header</code> includes the <code>recipient_type</code> attribute, any payout item without its own <code>recipient_type</code> attribute uses the <code>recipient_type</code> value from <code>sender_batch_header</code>. If the <code>sender_batch_header</code> omits the <code>recipient_type</code> attribute, each payout item must include its own <code>recipient_type</code> value.
+     * The type of identification for the payment receiver. If this field is provided, the payout items without a `recipient_type` will use the provided value. If this field is not provided, each payout item must include a value for the `recipient_type`.
      *
      * @param string $recipient_type
-     * 
+     *
      * @return $this
      */
@@ -37,5 +37,5 @@
 
     /**
-     * The type of ID that identifies the payment receiver. Value is:<ul><code>EMAIL</code>. Unencrypted email. Value is a string of up to 127 single-byte characters.</li><li><code>PHONE</code>. Unencrypted phone number.<blockquote><strong>Note:</strong> The PayPal sandbox does not support the <code>PHONE</code> recipient type.</blockquote></li><li><code>PAYPAL_ID</code>. Encrypted PayPal account number.</li></ul>If the <code>sender_batch_header</code> includes the <code>recipient_type</code> attribute, any payout item without its own <code>recipient_type</code> attribute uses the <code>recipient_type</code> value from <code>sender_batch_header</code>. If the <code>sender_batch_header</code> omits the <code>recipient_type</code> attribute, each payout item must include its own <code>recipient_type</code> value.
+     * The type of identification for the payment receiver. If this field is provided, the payout items without a `recipient_type` will use the provided value. If this field is not provided, each payout item must include a value for the `recipient_type`.
      *
      * @return string
@@ -47,8 +47,8 @@
 
     /**
-     * The amount of money to pay the receiver.
+     * The amount of money to pay a receiver.
      *
      * @param \PayPal\Api\Currency $amount
-     * 
+     *
      * @return $this
      */
@@ -60,5 +60,5 @@
 
     /**
-     * The amount of money to pay the receiver.
+     * The amount of money to pay a receiver.
      *
      * @return \PayPal\Api\Currency
@@ -70,8 +70,8 @@
 
     /**
-     * Optional. A sender-specified note for notifications. Value is any string value.
+     * Note for notifications. The note is provided by the payment sender. This note can be any string. 4000 characters max.
      *
      * @param string $note
-     * 
+     *
      * @return $this
      */
@@ -83,5 +83,5 @@
 
     /**
-     * Optional. A sender-specified note for notifications. Value is any string value.
+     * Note for notifications. The note is provided by the payment sender. This note can be any string. 4000 characters max.
      *
      * @return string
@@ -93,8 +93,8 @@
 
     /**
-     * The receiver of the payment. Corresponds to the `recipient_type` value in the request.
+     * The receiver of the payment. In a call response, the format of this value corresponds to the `recipient_type` specified in the request. 127 characters max.
      *
      * @param string $receiver
-     * 
+     *
      * @return $this
      */
@@ -106,5 +106,5 @@
 
     /**
-     * The receiver of the payment. Corresponds to the `recipient_type` value in the request.
+     * The receiver of the payment. In a call response, the format of this value corresponds to the `recipient_type` specified in the request. 127 characters max.
      *
      * @return string
@@ -116,8 +116,8 @@
 
     /**
-     * A sender-specified ID number. Tracks the batch payout in an accounting system.
+     * A sender-specific ID number, used in an accounting system for tracking purposes. 30 characters max.
      *
      * @param string $sender_item_id
-     * 
+     *
      * @return $this
      */
@@ -129,5 +129,5 @@
 
     /**
-     * A sender-specified ID number. Tracks the batch payout in an accounting system.
+     * A sender-specific ID number, used in an accounting system for tracking purposes. 30 characters max.
      *
      * @return string
@@ -187,3 +187,4 @@
         return $ret;
     }
+
 }
Index: /lib/PayPal/Api/PayoutItemDetails.php
===================================================================
--- /lib/PayPal/Api/PayoutItemDetails.php	(revision 8528)
+++ /lib/PayPal/Api/PayoutItemDetails.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PayoutItemDetails
  *
- * The payout item status and other details.
+ * This object contains status and other data for an individual payout of a batch.
  *
  * @package PayPal\Api
@@ -26,5 +26,5 @@
 {
     /**
-     * The ID for the payout item. Viewable when you show details for a batch payout.
+     * An ID for an individual payout. Provided by PayPal, such as in the case of getting the status of a batch request. 30 characters max.
      *
      * @param string $payout_item_id
@@ -39,5 +39,5 @@
 
     /**
-     * The ID for the payout item. Viewable when you show details for a batch payout.
+     * An ID for an individual payout. Provided by PayPal, such as in the case of getting the status of a batch request. 30 characters max.
      *
      * @return string
@@ -49,5 +49,5 @@
 
     /**
-     * The PayPal-generated ID for the transaction.
+     * Generated ID for the transaction. 30 characters max.
      *
      * @param string $transaction_id
@@ -62,5 +62,5 @@
 
     /**
-     * The PayPal-generated ID for the transaction.
+     * Generated ID for the transaction. 30 characters max.
      *
      * @return string
@@ -72,5 +72,5 @@
 
     /**
-     * The transaction status.
+     * Status of a transaction.
      *
      * @param string $transaction_status
@@ -85,5 +85,5 @@
 
     /**
-     * The transaction status.
+     * Status of a transaction.
      *
      * @return string
@@ -95,5 +95,5 @@
 
     /**
-     * The amount of money, in U.S. dollars, for fees.
+     * Amount of money in U.S. dollars for fees.
      *
      * @param \PayPal\Api\Currency $payout_item_fee
@@ -108,5 +108,5 @@
 
     /**
-     * The amount of money, in U.S. dollars, for fees.
+     * Amount of money in U.S. dollars for fees.
      *
      * @return \PayPal\Api\Currency
@@ -118,5 +118,5 @@
 
     /**
-     * The PayPal-generated ID for the batch payout.
+     * An ID for the batch payout. Generated by PayPal. 30 characters max.
      *
      * @param string $payout_batch_id
@@ -131,5 +131,5 @@
 
     /**
-     * The PayPal-generated ID for the batch payout.
+     * An ID for the batch payout. Generated by PayPal. 30 characters max.
      *
      * @return string
@@ -141,5 +141,5 @@
 
     /**
-     * A sender-specified ID number. Tracks the batch payout in an accounting system.
+     * Sender-created ID for tracking the batch in an accounting system. 30 characters max.
      *
      * @param string $sender_batch_id
@@ -154,5 +154,5 @@
 
     /**
-     * A sender-specified ID number. Tracks the batch payout in an accounting system.
+     * Sender-created ID for tracking the batch in an accounting system. 30 characters max.
      *
      * @return string
@@ -164,5 +164,5 @@
 
     /**
-     * The sender-provided information for the payout item.
+     * The data for a payout item that the sender initially provided.
      *
      * @param \PayPal\Api\PayoutItem $payout_item
@@ -177,5 +177,5 @@
 
     /**
-     * The sender-provided information for the payout item.
+     * The data for a payout item that the sender initially provided.
      *
      * @return \PayPal\Api\PayoutItem
@@ -187,5 +187,5 @@
 
     /**
-     * The date and time when this item was last processed.
+     * Time of the last processing for this item.
      *
      * @param string $time_processed
@@ -200,5 +200,5 @@
 
     /**
-     * The date and time when this item was last processed.
+     * Time of the last processing for this item.
      *
      * @return string
@@ -210,5 +210,5 @@
 
     /**
-     * Sets Errors
+     * Sets Error
      *
      * @param \PayPal\Api\Error $errors
@@ -223,5 +223,5 @@
 
     /**
-     * Gets Errors
+     * Gets Error
      *
      * @return \PayPal\Api\Error
Index: /lib/PayPal/Api/PayoutSenderBatchHeader.php
===================================================================
--- /lib/PayPal/Api/PayoutSenderBatchHeader.php	(revision 8528)
+++ /lib/PayPal/Api/PayoutSenderBatchHeader.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class PayoutSenderBatchHeader
  *
- * The sender-provided batch header for a batch payout request.
+ * This object represents sender-provided data about a batch header. The data is provided in a POST request. All batch submissions must have a batch header.
  *
  * @package PayPal\Api
@@ -15,10 +15,9 @@
  * @property string email_subject
  * @property string recipient_type
- * @property string batch_status
  */
 class PayoutSenderBatchHeader extends PayPalModel
 {
     /**
-     * A sender-specified ID number. Tracks the batch payout in an accounting system.<blockquote><strong>Note:</strong> PayPal prevents duplicate batches from being processed. If you specify a `sender_batch_id` that was used in the last 30 days, the API rejects the request and returns an error message that indicates the duplicate `sender_batch_id` and includes a HATEOAS link to the original batch payout with the same `sender_batch_id`. If you receive a HTTP `5nn` status code, you can safely retry the request with the same `sender_batch_id`. In any case, the API completes a payment only once for a specific `sender_batch_id` that is used within 30 days.</blockquote>
+     * Sender-created ID for tracking the batch payout in an accounting system. 30 characters max.
      *
      * @param string $sender_batch_id
@@ -33,5 +32,5 @@
 
     /**
-     * A sender-specified ID number. Tracks the batch payout in an accounting system.<blockquote><strong>Note:</strong> PayPal prevents duplicate batches from being processed. If you specify a `sender_batch_id` that was used in the last 30 days, the API rejects the request and returns an error message that indicates the duplicate `sender_batch_id` and includes a HATEOAS link to the original batch payout with the same `sender_batch_id`. If you receive a HTTP `5nn` status code, you can safely retry the request with the same `sender_batch_id`. In any case, the API completes a payment only once for a specific `sender_batch_id` that is used within 30 days.</blockquote>
+     * Sender-created ID for tracking the batch payout in an accounting system. 30 characters max.
      *
      * @return string
@@ -43,5 +42,5 @@
 
     /**
-     * The subject line text for the email that PayPal sends when a payout item completes. The subject line is the same for all recipients. Value is an alphanumeric string with a maximum length of 255 single-byte characters.
+     * The subject line text for the email that PayPal sends when a payout item is completed. (The subject line is the same for all recipients.) Maximum of 255 single-byte alphanumeric characters.
      *
      * @param string $email_subject
@@ -56,5 +55,5 @@
 
     /**
-     * The subject line text for the email that PayPal sends when a payout item completes. The subject line is the same for all recipients. Value is an alphanumeric string with a maximum length of 255 single-byte characters.
+     * The subject line text for the email that PayPal sends when a payout item is completed. (The subject line is the same for all recipients.) Maximum of 255 single-byte alphanumeric characters.
      *
      * @return string
@@ -66,5 +65,5 @@
 
     /**
-     * The type of ID that identifies the payment receiver. Value is:<ul><code>EMAIL</code>. Unencrypted email. Value is a string of up to 127 single-byte characters.</li><li><code>PHONE</code>. Unencrypted phone number.<blockquote><strong>Note:</strong> The PayPal sandbox does not support the <code>PHONE</code> recipient type.</blockquote></li><li><code>PAYPAL_ID</code>. Encrypted PayPal account number.</li></ul>If the <code>sender_batch_header</code> includes the <code>recipient_type</code> attribute, any payout item without its own <code>recipient_type</code> attribute uses the <code>recipient_type</code> value from <code>sender_batch_header</code>. If the <code>sender_batch_header</code> omits the <code>recipient_type</code> attribute, each payout item must include its own <code>recipient_type</code> value.
+     * The type of ID for a payment receiver. If this field is provided, the payout items without a `recipient_type` will use the provided value. If this field is not provided, each payout item must include a value for the `recipient_type`. 
      *
      * @param string $recipient_type
@@ -79,5 +78,5 @@
 
     /**
-     * The type of ID that identifies the payment receiver. Value is:<ul><code>EMAIL</code>. Unencrypted email. Value is a string of up to 127 single-byte characters.</li><li><code>PHONE</code>. Unencrypted phone number.<blockquote><strong>Note:</strong> The PayPal sandbox does not support the <code>PHONE</code> recipient type.</blockquote></li><li><code>PAYPAL_ID</code>. Encrypted PayPal account number.</li></ul>If the <code>sender_batch_header</code> includes the <code>recipient_type</code> attribute, any payout item without its own <code>recipient_type</code> attribute uses the <code>recipient_type</code> value from <code>sender_batch_header</code>. If the <code>sender_batch_header</code> omits the <code>recipient_type</code> attribute, each payout item must include its own <code>recipient_type</code> value.
+     * The type of ID for a payment receiver. If this field is provided, the payout items without a `recipient_type` will use the provided value. If this field is not provided, each payout item must include a value for the `recipient_type`. 
      *
      * @return string
@@ -88,20 +87,3 @@
     }
 
-    /**
-     * @deprecated This property is unused
-     */
-    public function setBatchStatus($batch_status)
-    {
-        $this->batch_status = $batch_status;
-        return $this;
-    }
-
-    /**
-     * @deprecated This property is unused
-     */
-    public function getBatchStatus()
-    {
-        return $this->batch_status;
-    }
-
 }
Index: /lib/PayPal/Api/Phone.php
===================================================================
--- /lib/PayPal/Api/Phone.php	(revision 8528)
+++ /lib/PayPal/Api/Phone.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class Phone
  *
- * Information related to the Payee.
+ * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. 
  *
  * @package PayPal\Api
Index: /lib/PayPal/Api/Plan.php
===================================================================
--- /lib/PayPal/Api/Plan.php	(revision 8528)
+++ /lib/PayPal/Api/Plan.php	(revision 5261)
@@ -5,7 +5,8 @@
 use PayPal\Common\PayPalModel;
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\PlanList;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 
 /**
Index: /lib/PayPal/Api/Presentation.php
===================================================================
--- /lib/PayPal/Api/Presentation.php	(revision 8528)
+++ /lib/PayPal/Api/Presentation.php	(revision 5261)
@@ -15,11 +15,10 @@
  * @property string logo_image
  * @property string locale_code
- * @property string return_url_label
- * @property string note_to_seller_label
  */
 class Presentation extends PayPalModel
 {
     /**
-     * A label that overrides the business name in the PayPal account on the PayPal pages. Character length and limitations: 127 single-byte alphanumeric characters.
+     * A label that overrides the business name in the PayPal account on the PayPal pages.
+     * 
      *
      * @param string $brand_name
@@ -34,5 +33,5 @@
 
     /**
-     * A label that overrides the business name in the PayPal account on the PayPal pages. Character length and limitations: 127 single-byte alphanumeric characters.
+     * A label that overrides the business name in the PayPal account on the PayPal pages.
      *
      * @return string
@@ -44,5 +43,6 @@
 
     /**
-     * A URL to the logo image. A valid media type is `.gif`, `.jpg`, or `.png`. The maximum width of the image is 190 pixels. The maximum height of the image is 60 pixels. PayPal crops images that are larger. PayPal places your logo image at the top of the cart review area. PayPal recommends that you store the image on a secure (HTTPS) server. Otherwise, web browsers display a message that checkout pages contain non-secure items. Character length and limit: 127 single-byte alphanumeric characters.
+     * A URL to logo image. Allowed vaues: `.gif`, `.jpg`, or `.png`.
+     * 
      *
      * @param string $logo_image
@@ -57,5 +57,5 @@
 
     /**
-     * A URL to the logo image. A valid media type is `.gif`, `.jpg`, or `.png`. The maximum width of the image is 190 pixels. The maximum height of the image is 60 pixels. PayPal crops images that are larger. PayPal places your logo image at the top of the cart review area. PayPal recommends that you store the image on a secure (HTTPS) server. Otherwise, web browsers display a message that checkout pages contain non-secure items. Character length and limit: 127 single-byte alphanumeric characters.
+     * A URL to logo image. Allowed vaues: `.gif`, `.jpg`, or `.png`.
      *
      * @return string
@@ -67,5 +67,6 @@
 
     /**
-     * The locale of pages displayed by PayPal payment experience. A valid value is `AU`, `AT`, `BE`, `BR`, `CA`, `CH`, `CN`, `DE`, `ES`, `GB`, `FR`, `IT`, `NL`, `PL`, `PT`, `RU`, or `US`. A 5-character code is also valid for languages in specific countries: `da_DK`, `he_IL`, `id_ID`, `ja_JP`, `no_NO`, `pt_BR`, `ru_RU`, `sv_SE`, `th_TH`, `zh_CN`, `zh_HK`, or `zh_TW`.
+     * Locale of pages displayed by PayPal payment experience.
+     * 
      *
      * @param string $locale_code
@@ -80,5 +81,5 @@
 
     /**
-     * The locale of pages displayed by PayPal payment experience. A valid value is `AU`, `AT`, `BE`, `BR`, `CA`, `CH`, `CN`, `DE`, `ES`, `GB`, `FR`, `IT`, `NL`, `PL`, `PT`, `RU`, or `US`. A 5-character code is also valid for languages in specific countries: `da_DK`, `he_IL`, `id_ID`, `ja_JP`, `no_NO`, `pt_BR`, `ru_RU`, `sv_SE`, `th_TH`, `zh_CN`, `zh_HK`, or `zh_TW`.
+     * Locale of pages displayed by PayPal payment experience.
      *
      * @return string
@@ -89,49 +90,3 @@
     }
 
-    /**
-     * A label to use as hypertext for the return to merchant link.
-     *
-     * @param string $return_url_label
-     * 
-     * @return $this
-     */
-    public function setReturnUrlLabel($return_url_label)
-    {
-        $this->return_url_label = $return_url_label;
-        return $this;
-    }
-
-    /**
-     * A label to use as hypertext for the return to merchant link.
-     *
-     * @return string
-     */
-    public function getReturnUrlLabel()
-    {
-        return $this->return_url_label;
-    }
-
-    /**
-     * A label to use as the title for the note to seller field. Used only when `allow_note` is `1`.
-     *
-     * @param string $note_to_seller_label
-     * 
-     * @return $this
-     */
-    public function setNoteToSellerLabel($note_to_seller_label)
-    {
-        $this->note_to_seller_label = $note_to_seller_label;
-        return $this;
-    }
-
-    /**
-     * A label to use as the title for the note to seller field. Used only when `allow_note` is `1`.
-     *
-     * @return string
-     */
-    public function getNoteToSellerLabel()
-    {
-        return $this->note_to_seller_label;
-    }
-
 }
Index: /lib/PayPal/Api/RedirectUrls.php
===================================================================
--- /lib/PayPal/Api/RedirectUrls.php	(revision 8528)
+++ /lib/PayPal/Api/RedirectUrls.php	(revision 5261)
@@ -9,5 +9,5 @@
  * Class RedirectUrls
  *
- * Set of redirect URLs you provide only for PayPal-based payments.
+ * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls.
  *
  * @package PayPal\Api
@@ -19,5 +19,5 @@
 {
     /**
-     * Url where the payer would be redirected to after approving the payment. **Required for PayPal account payments.**
+     * Url where the payer would be redirected to after approving the payment.
      *
      * @param string $return_url
@@ -33,5 +33,5 @@
 
     /**
-     * Url where the payer would be redirected to after approving the payment. **Required for PayPal account payments.**
+     * Url where the payer would be redirected to after approving the payment.
      *
      * @return string
@@ -43,5 +43,5 @@
 
     /**
-     * Url where the payer would be redirected to after canceling the payment. **Required for PayPal account payments.**
+     * Url where the payer would be redirected to after canceling the payment.
      *
      * @param string $cancel_url
@@ -57,5 +57,5 @@
 
     /**
-     * Url where the payer would be redirected to after canceling the payment. **Required for PayPal account payments.**
+     * Url where the payer would be redirected to after canceling the payment.
      *
      * @return string
Index: /lib/PayPal/Api/Refund.php
===================================================================
--- /lib/PayPal/Api/Refund.php	(revision 8528)
+++ /lib/PayPal/Api/Refund.php	(revision 5261)
@@ -6,4 +6,5 @@
 use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
@@ -15,15 +16,13 @@
  *
  * @property string id
+ * @property string create_time
+ * @property string update_time
  * @property \PayPal\Api\Amount amount
  * @property string state
  * @property string reason
- * @property string invoice_number
  * @property string sale_id
  * @property string capture_id
  * @property string parent_payment
  * @property string description
- * @property string create_time
- * @property string update_time
- * @property string reason_code
  * @property \PayPal\Api\Links[] links
  */
@@ -31,5 +30,5 @@
 {
     /**
-     * ID of the refund transaction. 17 characters max.
+     * Identifier of the refund transaction in UTC ISO8601 format.
      *
      * @param string $id
@@ -44,5 +43,5 @@
 
     /**
-     * ID of the refund transaction. 17 characters max.
+     * Identifier of the refund transaction in UTC ISO8601 format.
      *
      * @return string
@@ -54,5 +53,5 @@
 
     /**
-     * Details including both refunded amount (to payer) and refunded fee (to payee). 10 characters max.
+     * Details including both refunded amount (to Payer) and refunded fee (to Payee).If amount is not specified, it's assumed to be full refund.
      *
      * @param \PayPal\Api\Amount $amount
@@ -67,5 +66,5 @@
 
     /**
-     * Details including both refunded amount (to payer) and refunded fee (to payee). 10 characters max.
+     * Details including both refunded amount (to Payer) and refunded fee (to Payee).If amount is not specified, it's assumed to be full refund.
      *
      * @return \PayPal\Api\Amount
@@ -77,5 +76,5 @@
 
     /**
-     * State of the refund.
+     * State of the refund transaction.
      * Valid Values: ["pending", "completed", "failed"]
      *
@@ -91,5 +90,5 @@
 
     /**
-     * State of the refund.
+     * State of the refund transaction.
      *
      * @return string
@@ -124,27 +123,4 @@
 
     /**
-     * Your own invoice or tracking ID number. Character length and limitations: 127 single-byte alphanumeric characters.
-     *
-     * @param string $invoice_number
-     * 
-     * @return $this
-     */
-    public function setInvoiceNumber($invoice_number)
-    {
-        $this->invoice_number = $invoice_number;
-        return $this;
-    }
-
-    /**
-     * Your own invoice or tracking ID number. Character length and limitations: 127 single-byte alphanumeric characters.
-     *
-     * @return string
-     */
-    public function getInvoiceNumber()
-    {
-        return $this->invoice_number;
-    }
-
-    /**
      * ID of the Sale transaction being refunded. 
      *
@@ -170,5 +146,5 @@
 
     /**
-     * ID of the sale transaction being refunded.
+     * ID of the Capture transaction being refunded. 
      *
      * @param string $capture_id
@@ -183,5 +159,5 @@
 
     /**
-     * ID of the sale transaction being refunded.
+     * ID of the Capture transaction being refunded. 
      *
      * @return string
@@ -193,5 +169,5 @@
 
     /**
-     * ID of the payment resource on which this transaction is based.
+     * ID of the Payment resource that this transaction is based on.
      *
      * @param string $parent_payment
@@ -206,5 +182,5 @@
 
     /**
-     * ID of the payment resource on which this transaction is based.
+     * ID of the Payment resource that this transaction is based on.
      *
      * @return string
@@ -239,5 +215,5 @@
 
     /**
-     * Time of refund as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $create_time
@@ -252,5 +228,5 @@
 
     /**
-     * Time of refund as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -262,5 +238,5 @@
 
     /**
-     * Time that the resource was last updated.
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @param string $update_time
@@ -275,5 +251,5 @@
 
     /**
-     * Time that the resource was last updated.
+     * Time the resource was last updated in UTC ISO8601 format.
      *
      * @return string
@@ -285,29 +261,5 @@
 
     /**
-     * The reason code for the refund state being pending
-     * Valid Values: ["ECHECK"]
-     *
-     * @param string $reason_code
-     * 
-     * @return $this
-     */
-    public function setReasonCode($reason_code)
-    {
-        $this->reason_code = $reason_code;
-        return $this;
-    }
-
-    /**
-     * The reason code for the refund state being pending
-     *
-     * @return string
-     */
-    public function getReasonCode()
-    {
-        return $this->reason_code;
-    }
-
-    /**
-     * Shows details for a refund, by ID.
+     * Retrieve details about a specific refund by passing the refund_id in the request URI.
      *
      * @param string $refundId
Index: /lib/PayPal/Api/RefundDetail.php
===================================================================
--- /lib/PayPal/Api/RefundDetail.php	(revision 8528)
+++ /lib/PayPal/Api/RefundDetail.php	(revision 5261)
@@ -13,13 +13,11 @@
  *
  * @property string type
- * @property string transaction_id
  * @property string date
  * @property string note
- * @property \PayPal\Api\Currency amount
  */
 class RefundDetail extends PayPalModel
 {
     /**
-     * The PayPal refund type. Indicates whether refund was paid in invoicing flow through PayPal or externally. In the case of mark-as-refunded API, the supported refund type is `EXTERNAL`. For backward compatability, the `PAYPAL` refund type is still supported.
+     * PayPal refund type indicating whether refund was done in invoicing flow via PayPal or externally. In the case of the mark-as-refunded API, refund type is EXTERNAL and this is what is now supported. The PAYPAL value is provided for backward compatibility.
      * Valid Values: ["PAYPAL", "EXTERNAL"]
      *
@@ -35,5 +33,5 @@
 
     /**
-     * The PayPal refund type. Indicates whether refund was paid in invoicing flow through PayPal or externally. In the case of mark-as-refunded API, the supported refund type is `EXTERNAL`. For backward compatability, the `PAYPAL` refund type is still supported.
+     * PayPal refund type indicating whether refund was done in invoicing flow via PayPal or externally. In the case of the mark-as-refunded API, refund type is EXTERNAL and this is what is now supported. The PAYPAL value is provided for backward compatibility.
      *
      * @return string
@@ -45,28 +43,5 @@
 
     /**
-     * The PayPal refund transaction ID. Required with the `PAYPAL` refund type.
-     *
-     * @param string $transaction_id
-     * 
-     * @return $this
-     */
-    public function setTransactionId($transaction_id)
-    {
-        $this->transaction_id = $transaction_id;
-        return $this;
-    }
-
-    /**
-     * The PayPal refund transaction ID. Required with the `PAYPAL` refund type.
-     *
-     * @return string
-     */
-    public function getTransactionId()
-    {
-        return $this->transaction_id;
-    }
-
-    /**
-     * Date on which the invoice was refunded. Date format: yyyy-MM-dd z. For example, 2014-02-27 PST.
+     * Date when the invoice was marked as refunded. If no date is specified, the current date and time is used as the default. In addition, the date must be after the invoice payment date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $date
@@ -81,5 +56,5 @@
 
     /**
-     * Date on which the invoice was refunded. Date format: yyyy-MM-dd z. For example, 2014-02-27 PST.
+     * Date when the invoice was marked as refunded. If no date is specified, the current date and time is used as the default. In addition, the date must be after the invoice payment date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -113,26 +88,3 @@
     }
 
-    /**
-     * Amount to be recorded as refund against invoice. If this field is not passed, the total invoice paid amount is recorded as refund.
-     *
-     * @param \PayPal\Api\Currency $amount
-     * 
-     * @return $this
-     */
-    public function setAmount($amount)
-    {
-        $this->amount = $amount;
-        return $this;
-    }
-
-    /**
-     * Amount to be recorded as refund against invoice. If this field is not passed, the total invoice paid amount is recorded as refund.
-     *
-     * @return \PayPal\Api\Currency
-     */
-    public function getAmount()
-    {
-        return $this->amount;
-    }
-
 }
Index: /lib/PayPal/Api/RelatedResources.php
===================================================================
--- /lib/PayPal/Api/RelatedResources.php	(revision 8528)
+++ /lib/PayPal/Api/RelatedResources.php	(revision 5261)
@@ -21,8 +21,9 @@
 {
     /**
-     * Sale transaction
+     * A sale transaction
+     *
      *
      * @param \PayPal\Api\Sale $sale
-     * 
+     *
      * @return $this
      */
@@ -34,5 +35,5 @@
 
     /**
-     * Sale transaction
+     * A sale transaction
      *
      * @return \PayPal\Api\Sale
@@ -44,8 +45,9 @@
 
     /**
-     * Authorization transaction
+     * An authorization transaction
+     *
      *
      * @param \PayPal\Api\Authorization $authorization
-     * 
+     *
      * @return $this
      */
@@ -57,5 +59,5 @@
 
     /**
-     * Authorization transaction
+     * An authorization transaction
      *
      * @return \PayPal\Api\Authorization
@@ -67,8 +69,9 @@
 
     /**
-     * Order transaction
+     * An order transaction
+     *
      *
      * @param \PayPal\Api\Order $order
-     * 
+     *
      * @return $this
      */
@@ -80,5 +83,5 @@
 
     /**
-     * Order transaction
+     * An order transaction
      *
      * @return \PayPal\Api\Order
@@ -90,8 +93,9 @@
 
     /**
-     * Capture transaction
+     * A capture transaction
+     *
      *
      * @param \PayPal\Api\Capture $capture
-     * 
+     *
      * @return $this
      */
@@ -103,5 +107,5 @@
 
     /**
-     * Capture transaction
+     * A capture transaction
      *
      * @return \PayPal\Api\Capture
@@ -113,8 +117,9 @@
 
     /**
-     * Refund transaction
+     * A refund transaction
+     *
      *
      * @param \PayPal\Api\Refund $refund
-     * 
+     *
      * @return $this
      */
@@ -126,5 +131,5 @@
 
     /**
-     * Refund transaction
+     * A refund transaction
      *
      * @return \PayPal\Api\Refund
Index: /lib/PayPal/Api/Sale.php
===================================================================
--- /lib/PayPal/Api/Sale.php	(revision 8528)
+++ /lib/PayPal/Api/Sale.php	(revision 5261)
@@ -6,16 +6,19 @@
 use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
  * Class Sale
  *
- * A sale transaction. This is the resource that is returned as a part related resources in Payment
+ * A sale transaction.
  *
  * @package PayPal\Api
  *
  * @property string id
- * @property string purchase_unit_reference_id
+ * @property string create_time
+ * @property string update_time
  * @property \PayPal\Api\Amount amount
  * @property string payment_mode
+ * @property string pending_reason
  * @property string state
  * @property string reason_code
@@ -23,6 +26,6 @@
  * @property string protection_eligibility_type
  * @property string clearing_time
- * @property string payment_hold_status
- * @property string[] payment_hold_reasons
+ * @property string recipient_fund_status
+ * @property string hold_reason
  * @property \PayPal\Api\Currency transaction_fee
  * @property \PayPal\Api\Currency receivable_amount
@@ -31,8 +34,4 @@
  * @property string receipt_id
  * @property string parent_payment
- * @property \PayPal\Api\ProcessorResponse processor_response
- * @property string billing_agreement_id
- * @property string create_time
- * @property string update_time
  * @property \PayPal\Api\Links[] links
  */
@@ -63,5 +62,5 @@
 
     /**
-     * Identifier to the purchase or transaction unit corresponding to this sale transaction.
+     * Identifier to the purchase unit corresponding to this sale transaction.
      *
      * @param string $purchase_unit_reference_id
@@ -76,5 +75,5 @@
 
     /**
-     * Identifier to the purchase or transaction unit corresponding to this sale transaction.
+     * Identifier to the purchase unit corresponding to this sale transaction.
      *
      * @return string
@@ -109,5 +108,5 @@
 
     /**
-     * Specifies payment mode of the transaction. Only supported when the `payment_method` is set to `paypal`.
+     * specifies payment mode of the transaction
      * Valid Values: ["INSTANT_TRANSFER", "MANUAL_BANK_TRANSFER", "DELAYED_TRANSFER", "ECHECK"]
      *
@@ -123,5 +122,5 @@
 
     /**
-     * Specifies payment mode of the transaction. Only supported when the `payment_method` is set to `paypal`.
+     * specifies payment mode of the transaction
      *
      * @return string
@@ -133,6 +132,30 @@
 
     /**
+     * Reason of Pending transaction.
+     *
+     *
+     *
+     * @param  string  $pending_reason
+     * @return $this
+     */
+    public function setPendingReason($pending_reason)
+    {
+        $this->pending_reason = $pending_reason;
+        return $this;
+    }
+
+    /**
+     * Reason of Pending transaction.
+     *
+     * @return string
+     */
+    public function getPendingReason()
+    {
+        return $this->pending_reason;
+    }
+
+    /**
      * State of the sale transaction.
-     * Valid Values: ["completed", "partially_refunded", "pending", "refunded", "denied"]
+     * Valid Values: ["completed", "partially_refunded", "pending", "refunded"]
      *
      * @param string $state
@@ -157,6 +180,6 @@
 
     /**
-     * Reason code for the transaction state being Pending or Reversed. Only supported when the `payment_method` is set to `paypal`.
-     * Valid Values: ["CHARGEBACK", "GUARANTEE", "BUYER_COMPLAINT", "REFUND", "UNCONFIRMED_SHIPPING_ADDRESS", "ECHECK", "INTERNATIONAL_WITHDRAWAL", "RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION", "PAYMENT_REVIEW", "REGULATORY_REVIEW", "UNILATERAL", "VERIFICATION_REQUIRED", "TRANSACTION_APPROVED_AWAITING_FUNDING"]
+     * Reason code for the transaction state being Pending or Reversed.
+     * Valid Values: ["CHARGEBACK", "GUARANTEE", "BUYER_COMPLAINT", "REFUND", "UNCONFIRMED_SHIPPING_ADDRESS", "ECHECK", "INTERNATIONAL_WITHDRAWAL", "RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION", "PAYMENT_REVIEW", "REGULATORY_REVIEW", "UNILATERAL", "VERIFICATION_REQUIRED"]
      *
      * @param string $reason_code
@@ -171,5 +194,5 @@
 
     /**
-     * Reason code for the transaction state being Pending or Reversed. Only supported when the `payment_method` is set to `paypal`.
+     * Reason code for the transaction state being Pending or Reversed.
      *
      * @return string
@@ -181,5 +204,5 @@
 
     /**
-     * The level of seller protection in force for the transaction. Only supported when the `payment_method` is set to `paypal`. 
+     * Protection Eligibility of the Payer 
      * Valid Values: ["ELIGIBLE", "PARTIALLY_ELIGIBLE", "INELIGIBLE"]
      *
@@ -195,5 +218,5 @@
 
     /**
-     * The level of seller protection in force for the transaction. Only supported when the `payment_method` is set to `paypal`. 
+     * Protection Eligibility of the Payer 
      *
      * @return string
@@ -205,6 +228,6 @@
 
     /**
-     * The kind of seller protection in force for the transaction. It is returned only when protection_eligibility is ELIGIBLE or PARTIALLY_ELIGIBLE. Only supported when the `payment_method` is set to `paypal`.
-     * Valid Values: ["ITEM_NOT_RECEIVED_ELIGIBLE", "UNAUTHORIZED_PAYMENT_ELIGIBLE", "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE"]
+     * Protection Eligibility Type of the Payer 
+     * Valid Values: ["ELIGIBLE", "ITEM_NOT_RECEIVED_ELIGIBLE", "INELIGIBLE", "UNAUTHORIZED_PAYMENT_ELIGIBLE"]
      *
      * @param string $protection_eligibility_type
@@ -219,5 +242,5 @@
 
     /**
-     * The kind of seller protection in force for the transaction. It is returned only when protection_eligibility is ELIGIBLE or PARTIALLY_ELIGIBLE. Only supported when the `payment_method` is set to `paypal`.
+     * Protection Eligibility Type of the Payer 
      *
      * @return string
@@ -229,5 +252,5 @@
 
     /**
-     * Expected clearing time for eCheck Transactions. Returned when payment is made with eCheck. Only supported when the `payment_method` is set to `paypal`.
+     * Expected clearing time for eCheck Transactions
      *
      * @param string $clearing_time
@@ -242,5 +265,5 @@
 
     /**
-     * Expected clearing time for eCheck Transactions. Returned when payment is made with eCheck. Only supported when the `payment_method` is set to `paypal`.
+     * Expected clearing time for eCheck Transactions
      *
      * @return string
@@ -252,78 +275,49 @@
 
     /**
-     * Status of the Recipient Fund. For now, it will be returned only when fund status is held
-     * Valid Values: ["HELD"]
-     *
-     * @param string $payment_hold_status
-     * 
-     * @return $this
-     */
-    public function setPaymentHoldStatus($payment_hold_status)
-    {
-        $this->payment_hold_status = $payment_hold_status;
-        return $this;
-    }
-
-    /**
-     * Status of the Recipient Fund. For now, it will be returned only when fund status is held
-     *
-     * @return string
-     */
-    public function getPaymentHoldStatus()
-    {
-        return $this->payment_hold_status;
-    }
-
-    /**
-     * Reasons for PayPal holding recipient fund. It is set only if payment hold status is held
-     *
-     * @param string[] $payment_hold_reasons
-     * 
-     * @return $this
-     */
-    public function setPaymentHoldReasons($payment_hold_reasons)
-    {
-        $this->payment_hold_reasons = $payment_hold_reasons;
-        return $this;
-    }
-
-    /**
-     * Reasons for PayPal holding recipient fund. It is set only if payment hold status is held
-     *
-     * @return string[]
-     */
-    public function getPaymentHoldReasons()
-    {
-        return $this->payment_hold_reasons;
-    }
-
-    /**
-     * Append PaymentHoldReasons to the list.
-     *
-     * @param string $string
-     * @return $this
-     */
-    public function addPaymentHoldReason($string)
-    {
-        if (!$this->getPaymentHoldReasons()) {
-            return $this->setPaymentHoldReasons(array($string));
-        } else {
-            return $this->setPaymentHoldReasons(
-                array_merge($this->getPaymentHoldReasons(), array($string))
-            );
-        }
-    }
-
-    /**
-     * Remove PaymentHoldReasons from the list.
-     *
-     * @param string $string
-     * @return $this
-     */
-    public function removePaymentHoldReason($string)
-    {
-        return $this->setPaymentHoldReasons(
-            array_diff($this->getPaymentHoldReasons(), array($string))
-        );
+     * Indicates the credit status of fund to the recipient. It will be returned only when payment status is 'completed' 
+     * Valid Values: ["COMPLETED", "HELD"]
+     *
+     * @param string $recipient_fund_status
+     * 
+     * @return $this
+     */
+    public function setRecipientFundStatus($recipient_fund_status)
+    {
+        $this->recipient_fund_status = $recipient_fund_status;
+        return $this;
+    }
+
+    /**
+     * Indicates the credit status of fund to the recipient. It will be returned only when payment status is 'completed' 
+     *
+     * @return string
+     */
+    public function getRecipientFundStatus()
+    {
+        return $this->recipient_fund_status;
+    }
+
+    /**
+     * Reason for holding the funds.
+     * Valid Values: ["NEW_SELLER_PAYMENT_HOLD", "PAYMENT_HOLD"]
+     *
+     * @param string $hold_reason
+     * 
+     * @return $this
+     */
+    public function setHoldReason($hold_reason)
+    {
+        $this->hold_reason = $hold_reason;
+        return $this;
+    }
+
+    /**
+     * Reason for holding the funds.
+     *
+     * @return string
+     */
+    public function getHoldReason()
+    {
+        return $this->hold_reason;
     }
 
@@ -352,5 +346,5 @@
 
     /**
-     * Net amount the merchant receives for this transaction in their receivable currency. Returned only in cross-currency use cases where a merchant bills a buyer in a non-primary currency for that buyer.
+     * Net amount payee receives for this transaction after deducting transaction fee.
      *
      * @param \PayPal\Api\Currency $receivable_amount
@@ -365,5 +359,5 @@
 
     /**
-     * Net amount the merchant receives for this transaction in their receivable currency. Returned only in cross-currency use cases where a merchant bills a buyer in a non-primary currency for that buyer.
+     * Net amount payee receives for this transaction after deducting transaction fee.
      *
      * @return \PayPal\Api\Currency
@@ -375,5 +369,5 @@
 
     /**
-     * Exchange rate applied for this transaction. Returned only in cross-currency use cases where a merchant bills a buyer in a non-primary currency for that buyer.
+     * Exchange rate applied for this transaction.
      *
      * @param string $exchange_rate
@@ -388,5 +382,5 @@
 
     /**
-     * Exchange rate applied for this transaction. Returned only in cross-currency use cases where a merchant bills a buyer in a non-primary currency for that buyer.
+     * Exchange rate applied for this transaction.
      *
      * @return string
@@ -398,5 +392,5 @@
 
     /**
-     * Fraud Management Filter (FMF) details applied for the payment that could result in accept, deny, or pending action. Returned in a payment response only if the merchant has enabled FMF in the profile settings and one of the fraud filters was triggered based on those settings. See [Fraud Management Filters Summary](/docs/classic/fmf/integration-guide/FMFSummary/) for more information.
+     * Fraud Management Filter (FMF) details applied for the payment that could result in accept/deny/pending action.
      *
      * @param \PayPal\Api\FmfDetails $fmf_details
@@ -411,5 +405,5 @@
 
     /**
-     * Fraud Management Filter (FMF) details applied for the payment that could result in accept, deny, or pending action. Returned in a payment response only if the merchant has enabled FMF in the profile settings and one of the fraud filters was triggered based on those settings. See [Fraud Management Filters Summary](/docs/classic/fmf/integration-guide/FMFSummary/) for more information.
+     * Fraud Management Filter (FMF) details applied for the payment that could result in accept/deny/pending action.
      *
      * @return \PayPal\Api\FmfDetails
@@ -421,5 +415,5 @@
 
     /**
-     * Receipt id is a payment identification number returned for guest users to identify the payment.
+     * Receipt id is 16 digit number payment identification number returned for guest users to identify the payment.
      *
      * @param string $receipt_id
@@ -434,5 +428,5 @@
 
     /**
-     * Receipt id is a payment identification number returned for guest users to identify the payment.
+     * Receipt id is 16 digit number payment identification number returned for guest users to identify the payment.
      *
      * @return string
@@ -444,5 +438,5 @@
 
     /**
-     * ID of the payment resource on which this transaction is based.
+     * ID of the Payment resource that this transaction is based on.
      *
      * @param string $parent_payment
@@ -457,5 +451,5 @@
 
     /**
-     * ID of the payment resource on which this transaction is based.
+     * ID of the Payment resource that this transaction is based on.
      *
      * @return string
@@ -467,51 +461,5 @@
 
     /**
-     * Response codes returned by the processor concerning the submitted payment. Only supported when the `payment_method` is set to `credit_card`.
-     *
-     * @param \PayPal\Api\ProcessorResponse $processor_response
-     * 
-     * @return $this
-     */
-    public function setProcessorResponse($processor_response)
-    {
-        $this->processor_response = $processor_response;
-        return $this;
-    }
-
-    /**
-     * Response codes returned by the processor concerning the submitted payment. Only supported when the `payment_method` is set to `credit_card`.
-     *
-     * @return \PayPal\Api\ProcessorResponse
-     */
-    public function getProcessorResponse()
-    {
-        return $this->processor_response;
-    }
-
-    /**
-     * ID of the billing agreement used as reference to execute this transaction.
-     *
-     * @param string $billing_agreement_id
-     * 
-     * @return $this
-     */
-    public function setBillingAgreementId($billing_agreement_id)
-    {
-        $this->billing_agreement_id = $billing_agreement_id;
-        return $this;
-    }
-
-    /**
-     * ID of the billing agreement used as reference to execute this transaction.
-     *
-     * @return string
-     */
-    public function getBillingAgreementId()
-    {
-        return $this->billing_agreement_id;
-    }
-
-    /**
-     * Time of sale as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6)
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @param string $create_time
@@ -526,5 +474,5 @@
 
     /**
-     * Time of sale as defined in [RFC 3339 Section 5.6](http://tools.ietf.org/html/rfc3339#section-5.6)
+     * Time the resource was created in UTC ISO8601 format.
      *
      * @return string
@@ -559,5 +507,5 @@
 
     /**
-     * Shows details for a sale, by ID. Returns only sales that were created through the REST API.
+     * Retrieve details about a sale transaction by passing the sale_id in the request URI. This request returns only the sales that were created via the REST API.
      *
      * @param string $saleId
@@ -586,8 +534,7 @@
      * Refund a completed payment by passing the sale_id in the request URI. In addition, include an empty JSON payload in the request body for a full refund. For a partial refund, include an amount object in the request body.
      *
-     * @deprecated Please use #refundSale instead.
-     * @param Refund         $refund
-     * @param ApiContext     $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall   is the Rest Call Service that is used to make rest calls
+     * @param Refund $refund
+     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
+     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
      * @return Refund
      */
@@ -610,28 +557,3 @@
     }
 
-    /**
-     * Refunds a sale, by ID. For a full refund, include an empty payload in the JSON request body. For a partial refund, include an `amount` object in the JSON request body.
-     *
-     * @param RefundRequest $refundRequest
-     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
-     * @return DetailedRefund
-     */
-    public function refundSale($refundRequest, $apiContext = null, $restCall = null)
-    {
-        ArgumentValidator::validate($this->getId(), "Id");
-        ArgumentValidator::validate($refundRequest, 'refundRequest');
-        $payLoad = $refundRequest->toJSON();
-        $json = self::executeCall(
-            "/v1/payments/sale/{$this->getId()}/refund",
-            "POST",
-            $payLoad,
-            null,
-            $apiContext,
-            $restCall
-        );
-        $ret = new DetailedRefund();
-        $ret->fromJson($json);
-        return $ret;
-    }
 }
Index: /lib/PayPal/Api/Search.php
===================================================================
--- /lib/PayPal/Api/Search.php	(revision 8528)
+++ /lib/PayPal/Api/Search.php	(revision 5261)
@@ -31,10 +31,9 @@
  * @property \PayPal\Api\number page_size
  * @property bool total_count_required
- * @property bool archived
  */
 class Search extends PayPalModel
 {
     /**
-     * The initial letters of the email address.
+     * Initial letters of the email address.
      *
      * @param string $email
@@ -49,5 +48,5 @@
 
     /**
-     * The initial letters of the email address.
+     * Initial letters of the email address.
      *
      * @return string
@@ -59,5 +58,5 @@
 
     /**
-     * The initial letters of the recipient's first name.
+     * Initial letters of the recipient's first name.
      *
      * @param string $recipient_first_name
@@ -72,5 +71,5 @@
 
     /**
-     * The initial letters of the recipient's first name.
+     * Initial letters of the recipient's first name.
      *
      * @return string
@@ -82,5 +81,5 @@
 
     /**
-     * The initial letters of the recipient's last name.
+     * Initial letters of the recipient's last name.
      *
      * @param string $recipient_last_name
@@ -95,5 +94,5 @@
 
     /**
-     * The initial letters of the recipient's last name.
+     * Initial letters of the recipient's last name.
      *
      * @return string
@@ -105,5 +104,5 @@
 
     /**
-     * The initial letters of the recipient's business name.
+     * Initial letters of the recipient's business name.
      *
      * @param string $recipient_business_name
@@ -118,5 +117,5 @@
 
     /**
-     * The initial letters of the recipient's business name.
+     * Initial letters of the recipient's business name.
      *
      * @return string
@@ -128,5 +127,5 @@
 
     /**
-     * The invoice number.
+     * The invoice number that appears on the invoice.
      *
      * @param string $number
@@ -141,5 +140,5 @@
 
     /**
-     * The invoice number.
+     * The invoice number that appears on the invoice.
      *
      * @return string
@@ -151,5 +150,5 @@
 
     /**
-     * The invoice status.
+     * Status of the invoice.
      * Valid Values: ["DRAFT", "SENT", "PAID", "MARKED_AS_PAID", "CANCELLED", "REFUNDED", "PARTIALLY_REFUNDED", "MARKED_AS_REFUNDED"]
      *
@@ -165,5 +164,5 @@
 
     /**
-     * The invoice status.
+     * Status of the invoice.
      *
      * @return string
@@ -175,5 +174,5 @@
 
     /**
-     * The lower limit of the total amount.
+     * Lower limit of total amount.
      *
      * @param \PayPal\Api\Currency $lower_total_amount
@@ -188,5 +187,5 @@
 
     /**
-     * The lower limit of the total amount.
+     * Lower limit of total amount.
      *
      * @return \PayPal\Api\Currency
@@ -198,5 +197,5 @@
 
     /**
-     * The upper limit of total amount.
+     * Upper limit of total amount.
      *
      * @param \PayPal\Api\Currency $upper_total_amount
@@ -211,5 +210,5 @@
 
     /**
-     * The upper limit of total amount.
+     * Upper limit of total amount.
      *
      * @return \PayPal\Api\Currency
@@ -221,5 +220,5 @@
 
     /**
-     * The start date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $start_invoice_date
@@ -234,5 +233,5 @@
 
     /**
-     * The start date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -244,5 +243,5 @@
 
     /**
-     * The end date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $end_invoice_date
@@ -257,5 +256,5 @@
 
     /**
-     * The end date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -267,5 +266,5 @@
 
     /**
-     * The start due date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice due date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $start_due_date
@@ -280,5 +279,5 @@
 
     /**
-     * The start due date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice due date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -290,5 +289,5 @@
 
     /**
-     * The end due date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice due date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $end_due_date
@@ -303,5 +302,5 @@
 
     /**
-     * The end due date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice due date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -313,5 +312,5 @@
 
     /**
-     * The start payment date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice payment date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $start_payment_date
@@ -326,5 +325,5 @@
 
     /**
-     * The start payment date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice payment date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -336,5 +335,5 @@
 
     /**
-     * The end payment date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice payment date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $end_payment_date
@@ -349,5 +348,5 @@
 
     /**
-     * The end payment date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice payment date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -359,5 +358,5 @@
 
     /**
-     * The start creation date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice creation date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $start_creation_date
@@ -372,5 +371,5 @@
 
     /**
-     * The start creation date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * Start invoice creation date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -382,5 +381,5 @@
 
     /**
-     * The end creation date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice creation date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @param string $end_creation_date
@@ -395,5 +394,5 @@
 
     /**
-     * The end creation date for the invoice. Date format is *yyyy*-*MM*-*dd* *z*, as defined in [Internet Date/Time Format](http://tools.ietf.org/html/rfc3339#section-5.6).
+     * End invoice creation date. Date format yyyy-MM-dd z, as defined in [ISO8601](http://tools.ietf.org/html/rfc3339#section-5.6).
      *
      * @return string
@@ -405,5 +404,5 @@
 
     /**
-     * The offset for the search results.
+     * Offset of the search results.
      *
      * @param \PayPal\Api\number $page
@@ -418,5 +417,5 @@
 
     /**
-     * The offset for the search results.
+     * Offset of the search results.
      *
      * @return \PayPal\Api\number
@@ -428,5 +427,5 @@
 
     /**
-     * The page size for the search results.
+     * Page size of the search results.
      *
      * @param \PayPal\Api\number $page_size
@@ -441,5 +440,5 @@
 
     /**
-     * The page size for the search results.
+     * Page size of the search results.
      *
      * @return \PayPal\Api\number
@@ -451,5 +450,5 @@
 
     /**
-     * Indicates whether the total count appears in the response. Default is `false`.
+     * A flag indicating whether total count is required in the response.
      *
      * @param bool $total_count_required
@@ -464,5 +463,5 @@
 
     /**
-     * Indicates whether the total count appears in the response. Default is `false`.
+     * A flag indicating whether total count is required in the response.
      *
      * @return bool
@@ -473,26 +472,3 @@
     }
 
-    /**
-     * A flag indicating whether search is on invoices archived by merchant. true - returns archived / false returns unarchived / null returns all.
-     *
-     * @param bool $archived
-     * 
-     * @return $this
-     */
-    public function setArchived($archived)
-    {
-        $this->archived = $archived;
-        return $this;
-    }
-
-    /**
-     * A flag indicating whether search is on invoices archived by merchant. true - returns archived / false returns unarchived / null returns all.
-     *
-     * @return bool
-     */
-    public function getArchived()
-    {
-        return $this->archived;
-    }
-
 }
Index: /lib/PayPal/Api/ShippingAddress.php
===================================================================
--- /lib/PayPal/Api/ShippingAddress.php	(revision 8528)
+++ /lib/PayPal/Api/ShippingAddress.php	(revision 5261)
@@ -2,4 +2,6 @@
 
 namespace PayPal\Api;
+
+use PayPal\Common\PayPalModel;
 
 /**
@@ -10,5 +12,8 @@
  * @package PayPal\Api
  *
+ * @property string id
  * @property string recipient_name
+ * @property bool default_address
+ * @property bool preferred_address
  */
 class ShippingAddress extends Address
@@ -16,7 +21,7 @@
     /**
      * Address ID assigned in PayPal system.
-     * @deprecated Not publicly available
+     *
      * @param string $id
-     * 
+     *
      * @return $this
      */
@@ -29,5 +34,5 @@
     /**
      * Address ID assigned in PayPal system.
-     * @deprecated Not publicly available
+     *
      * @return string
      */
@@ -41,5 +46,5 @@
      *
      * @param string $recipient_name
-     * 
+     *
      * @return $this
      */
@@ -62,7 +67,7 @@
     /**
      * Default shipping address of the Payer.
-     * @deprecated Not publicly available
+     *
      * @param bool $default_address
-     * 
+     *
      * @return $this
      */
@@ -75,5 +80,5 @@
     /**
      * Default shipping address of the Payer.
-     * @deprecated Not publicly available
+     *
      * @return bool
      */
@@ -85,7 +90,7 @@
     /**
      * Shipping Address marked as preferred by Payer.
-     * @deprecated Not publicly available
+     *
      * @param bool $preferred_address
-     * 
+     *
      * @return $this
      */
@@ -98,5 +103,5 @@
     /**
      * Shipping Address marked as preferred by Payer.
-     * @deprecated Not publicly available
+     *
      * @return bool
      */
Index: /lib/PayPal/Api/ShippingCost.php
===================================================================
--- /lib/PayPal/Api/ShippingCost.php	(revision 8528)
+++ /lib/PayPal/Api/ShippingCost.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class ShippingCost
  *
- * Shipping cost, as a percent or an amount.
+ * Shipping cost in percent or amount.
  *
  * @package PayPal\Api
@@ -18,5 +18,5 @@
 {
     /**
-     * The shipping cost, as an amount. Valid range is from 0 to 999999.99.
+     * Shipping cost in amount. Range of 0 to 999999.99.
      *
      * @param \PayPal\Api\Currency $amount
@@ -31,5 +31,5 @@
 
     /**
-     * The shipping cost, as an amount. Valid range is from 0 to 999999.99.
+     * Shipping cost in amount. Range of 0 to 999999.99.
      *
      * @return \PayPal\Api\Currency
@@ -41,5 +41,5 @@
 
     /**
-     * The tax percentage on the shipping amount.
+     * Tax percentage on shipping amount.
      *
      * @param \PayPal\Api\Tax $tax
@@ -54,5 +54,5 @@
 
     /**
-     * The tax percentage on the shipping amount.
+     * Tax percentage on shipping amount.
      *
      * @return \PayPal\Api\Tax
Index: /lib/PayPal/Api/ShippingInfo.php
===================================================================
--- /lib/PayPal/Api/ShippingInfo.php	(revision 8528)
+++ /lib/PayPal/Api/ShippingInfo.php	(revision 5261)
@@ -21,5 +21,5 @@
 {
     /**
-     * The invoice recipient first name. Maximum length is 30 characters.
+     * First name of the invoice recipient. 30 characters max.
      *
      * @param string $first_name
@@ -34,5 +34,5 @@
 
     /**
-     * The invoice recipient first name. Maximum length is 30 characters.
+     * First name of the invoice recipient. 30 characters max.
      *
      * @return string
@@ -44,5 +44,5 @@
 
     /**
-     * The invoice recipient last name. Maximum length is 30 characters.
+     * Last name of the invoice recipient. 30 characters max.
      *
      * @param string $last_name
@@ -57,5 +57,5 @@
 
     /**
-     * The invoice recipient last name. Maximum length is 30 characters.
+     * Last name of the invoice recipient. 30 characters max.
      *
      * @return string
@@ -67,5 +67,5 @@
 
     /**
-     * The invoice recipient company business name. Maximum length is 100 characters.
+     * Company business name of the invoice recipient. 100 characters max.
      *
      * @param string $business_name
@@ -80,5 +80,5 @@
 
     /**
-     * The invoice recipient company business name. Maximum length is 100 characters.
+     * Company business name of the invoice recipient. 100 characters max.
      *
      * @return string
@@ -112,26 +112,4 @@
 
     /**
-     * @deprecated Not used anymore
-     *
-     * @param string $email
-     * @return $this
-     */
-    public function setEmail($email)
-    {
-        $this->email = $email;
-        return $this;
-    }
-
-    /**
-     * @deprecated Not used anymore
-     *
-     * @return string
-     */
-    public function getEmail()
-    {
-        return $this->email;
-    }
-
-    /**
      * Address of the invoice recipient.
      *
@@ -147,5 +125,5 @@
 
     /**
-     * The invoice recipient address.
+     * Address of the invoice recipient.
      *
      * @return \PayPal\Api\InvoiceAddress
Index: /lib/PayPal/Api/Tax.php
===================================================================
--- /lib/PayPal/Api/Tax.php	(revision 8528)
+++ /lib/PayPal/Api/Tax.php	(revision 5261)
@@ -22,5 +22,5 @@
 {
     /**
-     * The resource ID.
+     * Identifier of the resource.
      *
      * @param string $id
@@ -35,5 +35,5 @@
 
     /**
-     * The resource ID.
+     * Identifier of the resource.
      *
      * @return string
@@ -45,5 +45,5 @@
 
     /**
-     * The tax name. Maximum length is 20 characters.
+     * Name of the tax. 10 characters max.
      *
      * @param string $name
@@ -58,5 +58,5 @@
 
     /**
-     * The tax name. Maximum length is 20 characters.
+     * Name of the tax. 10 characters max.
      *
      * @return string
@@ -68,5 +68,5 @@
 
     /**
-     * The rate of the specified tax. Valid range is from 0.001 to 99.999.
+     * Rate of the specified tax. Range of 0.001 to 99.999.
      *
      * @param string|double $percent
@@ -83,5 +83,5 @@
 
     /**
-     * The rate of the specified tax. Valid range is from 0.001 to 99.999.
+     * Rate of the specified tax. Range of 0.001 to 99.999.
      *
      * @return string
@@ -93,5 +93,5 @@
 
     /**
-     * The tax as a monetary amount. Cannot be specified in a request.
+     * Tax in the form of money. Cannot be specified in a request.
      *
      * @param \PayPal\Api\Currency $amount
@@ -106,5 +106,5 @@
 
     /**
-     * The tax as a monetary amount. Cannot be specified in a request.
+     * Tax in the form of money. Cannot be specified in a request.
      *
      * @return \PayPal\Api\Currency
Index: /lib/PayPal/Api/Transaction.php
===================================================================
--- /lib/PayPal/Api/Transaction.php	(revision 8528)
+++ /lib/PayPal/Api/Transaction.php	(revision 5261)
@@ -10,4 +10,6 @@
  * @package PayPal\Api
  *
+ * @property string purchase_unit_reference_id
+ * @property Transaction transactions
  */
 class Transaction extends TransactionBase
@@ -41,5 +43,5 @@
      *
      * @param string $purchase_unit_reference_id
-     * @deprecated Use #setReferenceId instead
+     *
      * @return $this
      */
@@ -53,5 +55,4 @@
      * Identifier to the purchase unit corresponding to this sale transaction
      *
-     * @deprecated Use #getReferenceId instead
      * @return string
      */
Index: /lib/PayPal/Api/TransactionBase.php
===================================================================
--- /lib/PayPal/Api/TransactionBase.php	(revision 8528)
+++ /lib/PayPal/Api/TransactionBase.php	(revision 5261)
@@ -2,4 +2,7 @@
 
 namespace PayPal\Api;
+
+use PayPal\Common\PayPalModel;
+use PayPal\Rest\ApiContext;
 
 /**
@@ -18,5 +21,5 @@
      * 
      *
-     * @param \PayPal\Api\RelatedResources[] $related_resources
+     * @param \PayPal\Api\RelatedResources $related_resources
      * 
      * @return $this
Index: /lib/PayPal/Api/Transactions.php
===================================================================
--- /lib/PayPal/Api/Transactions.php	(revision 8528)
+++ /lib/PayPal/Api/Transactions.php	(revision 5261)
@@ -4,4 +4,5 @@
 
 use PayPal\Common\PayPalModel;
+use PayPal\Rest\ApiContext;
 
 /**
Index: /lib/PayPal/Api/WebProfile.php
===================================================================
--- /lib/PayPal/Api/WebProfile.php	(revision 8528)
+++ /lib/PayPal/Api/WebProfile.php	(revision 5261)
@@ -4,12 +4,13 @@
 
 use PayPal\Common\PayPalResourceModel;
+use PayPal\Validation\ArgumentValidator;
+use PayPal\Api\CreateProfileResponse;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 
 /**
  * Class WebProfile
  *
- * Payment web experience profile resource
+ * Payment Web experience profile resource
  *
  * @package PayPal\Api
@@ -17,5 +18,4 @@
  * @property string id
  * @property string name
- * @property bool temporary
  * @property \PayPal\Api\FlowConfig flow_config
  * @property \PayPal\Api\InputFields input_fields
@@ -25,5 +25,6 @@
 {
     /**
-     * The unique ID of the web experience profile.
+     * ID of the web experience profile.
+     * 
      *
      * @param string $id
@@ -38,5 +39,5 @@
 
     /**
-     * The unique ID of the web experience profile.
+     * ID of the web experience profile.
      *
      * @return string
@@ -48,5 +49,6 @@
 
     /**
-     * The web experience profile name. Unique for a specified merchant's profiles.
+     * Name of the web experience profile.
+     * 
      *
      * @param string $name
@@ -61,5 +63,5 @@
 
     /**
-     * The web experience profile name. Unique for a specified merchant's profiles.
+     * Name of the web experience profile.
      *
      * @return string
@@ -71,28 +73,6 @@
 
     /**
-     * Indicates whether the profile persists for three hours or permanently. Set to `false` to persist the profile permanently. Set to `true` to persist the profile for three hours.
-     *
-     * @param bool $temporary
-     * 
-     * @return $this
-     */
-    public function setTemporary($temporary)
-    {
-        $this->temporary = $temporary;
-        return $this;
-    }
-
-    /**
-     * Indicates whether the profile persists for three hours or permanently. Set to `false` to persist the profile permanently. Set to `true` to persist the profile for three hours.
-     *
-     * @return bool
-     */
-    public function getTemporary()
-    {
-        return $this->temporary;
-    }
-
-    /**
      * Parameters for flow configuration.
+     * 
      *
      * @param \PayPal\Api\FlowConfig $flow_config
@@ -118,4 +98,5 @@
     /**
      * Parameters for input fields customization.
+     * 
      *
      * @param \PayPal\Api\InputFields $input_fields
@@ -141,4 +122,5 @@
     /**
      * Parameters for style and presentation.
+     * 
      *
      * @param \PayPal\Api\Presentation $presentation
@@ -163,5 +145,5 @@
 
     /**
-     * Creates a web experience profile. Pass the profile name and details in the JSON request body.
+     * Create a web experience profile by passing the name of the profile and other profile details in the request JSON to the request URI.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -186,5 +168,5 @@
 
     /**
-     * Updates a web experience profile. Pass the ID of the profile to the request URI and pass the profile details in the JSON request body. If your request omits any profile detail fields, the operation removes the previously set values for those fields.
+     * Update a web experience profile by passing the ID of the profile to the request URI. In addition, pass the profile details in the request JSON. If your request does not include values for all profile detail fields, the previously set values for the omitted fields are removed by this operation.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -208,5 +190,5 @@
 
     /**
-     * Partially-updates a web experience profile. Pass the profile ID to the request URI. Pass a patch object with the operation, path of the profile location to update, and, if needed, a new value to complete the operation in the JSON request body.
+     * Partially update an existing web experience profile by passing the ID of the profile to the request URI. In addition, pass a patch object in the request JSON that specifies the operation to perform, path of the profile location to update, and a new value if needed to complete the operation.
      *
      * @param Patch[] $patch
@@ -236,5 +218,5 @@
 
     /**
-     * Shows details for a web experience profile, by ID.
+     * Retrieve the details of a particular web experience profile by passing the ID of the profile to the request URI.
      *
      * @param string $profileId
@@ -261,5 +243,5 @@
 
     /**
-     * Lists all web experience profiles for a merchant or subject.
+     * Lists all web experience profiles that exist for a merchant (or subject).
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -282,5 +264,5 @@
 
     /**
-     * Deletes a web experience profile, by ID.
+     * Delete an existing web experience profile by passing the profile ID to the request URI.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
Index: /lib/PayPal/Api/Webhook.php
===================================================================
--- /lib/PayPal/Api/Webhook.php	(revision 8528)
+++ /lib/PayPal/Api/Webhook.php	(revision 5261)
@@ -7,4 +7,5 @@
 use PayPal\Api\WebhookList;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 use PayPal\Validation\UrlValidator;
 
@@ -12,5 +13,5 @@
  * Class Webhook
  *
- * One or more webhook objects.
+ * Represents Webhook resource.
  *
  * @package PayPal\Api
@@ -23,5 +24,5 @@
 {
     /**
-     * The ID of the webhook.
+     * Identifier of the webhook resource.
      *
      * @param string $id
@@ -36,5 +37,5 @@
 
     /**
-     * The ID of the webhook.
+     * Identifier of the webhook resource.
      *
      * @return string
@@ -46,5 +47,5 @@
 
     /**
-     * The URL that is configured to listen on `localhost` for incoming `POST` notification messages that contain event information.
+     * Webhook notification endpoint url.
      *
      * @param string $url
@@ -60,5 +61,5 @@
 
     /**
-     * The URL that is configured to listen on `localhost` for incoming `POST` notification messages that contain event information.
+     * Webhook notification endpoint url.
      *
      * @return string
@@ -70,5 +71,5 @@
 
     /**
-     * A list of up to ten events to which to subscribe your webhook. To subscribe to all events including new events as they are added, specify the asterisk (`*`) wildcard. To replace the `event_types` array, specify the `*` wildcard. To see all supported events, [list available events](#available-event-type.list).
+     * List of Webhooks event-types.
      *
      * @param \PayPal\Api\WebhookEventType[] $event_types
@@ -83,5 +84,5 @@
 
     /**
-     * A list of up to ten events to which to subscribe your webhook. To subscribe to all events including new events as they are added, specify the asterisk (`*`) wildcard. To replace the `event_types` array, specify the `*` wildcard. To see all supported events, [list available events](#available-event-type.list).
+     * List of Webhooks event-types.
      *
      * @return \PayPal\Api\WebhookEventType[]
@@ -123,5 +124,5 @@
 
     /**
-     * Subscribes your webhook listener to events. A successful call returns a [`webhook`](/docs/api/webhooks/#definition-webhook) object, which includes the webhook ID for later use.
+     * Creates the Webhook for the application associated with the access token.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -145,5 +146,5 @@
 
     /**
-     * Shows details for a webhook, by ID.
+     * Retrieves the Webhook identified by webhook_id for the application associated with access token.
      *
      * @param string $webhookId
@@ -172,6 +173,4 @@
      * Retrieves all Webhooks for the application associated with access token.
      *
-     * @deprecated Please use Webhook#getAllWithParams instead.
-     *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
      * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
@@ -180,24 +179,7 @@
     public static function getAll($apiContext = null, $restCall = null)
     {
-        return self::getAllWithParams(array(), $apiContext, $restCall);
-    }
-
-    /**
-     * Lists all webhooks for an app.
-     *
-     * @param array $params
-     * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
-     * @param PayPalRestCall $restCall is the Rest Call Service that is used to make rest calls
-     * @return WebhookList
-     */
-    public static function getAllWithParams($params = array(), $apiContext = null, $restCall = null)
-    {
-        ArgumentValidator::validate($params, 'params');
         $payLoad = "";
-        $allowedParams = array(
-            'anchor_type' => 1,
-        );
-        $json = self::executeCall(
-            "/v1/notifications/webhooks?" . http_build_query(array_intersect_key($params, $allowedParams)),
+        $json = self::executeCall(
+            "/v1/notifications/webhooks",
             "GET",
             $payLoad,
@@ -212,5 +194,5 @@
 
     /**
-     * Replaces webhook fields with new values. Pass a `json_patch` object with `replace` operation and `path`, which is `/url` for a URL or `/event_types` for events. The `value` is either the URL or a list of events.
+     * Updates the Webhook identified by webhook_id for the application associated with access token.
      *
      * @param PatchRequest $patchRequest
@@ -237,5 +219,5 @@
 
     /**
-     * Deletes a webhook, by ID.
+     * Deletes the Webhook identified by webhook_id for the application associated with access token.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
Index: /lib/PayPal/Api/WebhookEvent.php
===================================================================
--- /lib/PayPal/Api/WebhookEvent.php	(revision 8528)
+++ /lib/PayPal/Api/WebhookEvent.php	(revision 5261)
@@ -5,7 +5,7 @@
 use PayPal\Common\PayPalResourceModel;
 use PayPal\Exception\PayPalConnectionException;
+use PayPal\Validation\ArgumentValidator;
 use PayPal\Rest\ApiContext;
 use PayPal\Transport\PayPalRestCall;
-use PayPal\Validation\ArgumentValidator;
 use PayPal\Validation\JsonValidator;
 
@@ -13,5 +13,5 @@
  * Class WebhookEvent
  *
- * A webhook event notification.
+ * Represents a Webhooks event
  *
  * @package PayPal\Api
@@ -20,15 +20,12 @@
  * @property string create_time
  * @property string resource_type
- * @property string event_version
  * @property string event_type
  * @property string summary
- * @property \PayPal\Common\PayPalModel resource
- * @property string status
- * @property mixed[] transmissions
+ * @property mixed resource
  */
 class WebhookEvent extends PayPalResourceModel
 {
     /**
-     * The ID of the webhook event notification.
+     * Identifier of the Webhooks event resource.
      *
      * @param string $id
@@ -43,5 +40,5 @@
 
     /**
-     * The ID of the webhook event notification.
+     * Identifier of the Webhooks event resource.
      *
      * @return string
@@ -53,5 +50,5 @@
 
     /**
-     * The date and time when the webhook event notification was created.
+     * Time the resource was created.
      *
      * @param string $create_time
@@ -66,5 +63,5 @@
 
     /**
-     * The date and time when the webhook event notification was created.
+     * Time the resource was created.
      *
      * @return string
@@ -76,5 +73,5 @@
 
     /**
-     * The name of the resource related to the webhook notification event.
+     * Name of the resource contained in resource element.
      *
      * @param string $resource_type
@@ -89,5 +86,5 @@
 
     /**
-     * The name of the resource related to the webhook notification event.
+     * Name of the resource contained in resource element.
      *
      * @return string
@@ -99,28 +96,5 @@
 
     /**
-     * The version of the event.
-     *
-     * @param string $event_version
-     * 
-     * @return $this
-     */
-    public function setEventVersion($event_version)
-    {
-        $this->event_version = $event_version;
-        return $this;
-    }
-
-    /**
-     * The version of the event.
-     *
-     * @return string
-     */
-    public function getEventVersion()
-    {
-        return $this->event_version;
-    }
-
-    /**
-     * The event that triggered the webhook event notification.
+     * Name of the event type that occurred on resource, identified by data_resource element, to trigger the Webhooks event.
      *
      * @param string $event_type
@@ -135,5 +109,5 @@
 
     /**
-     * The event that triggered the webhook event notification.
+     * Name of the event type that occurred on resource, identified by data_resource element, to trigger the Webhooks event.
      *
      * @return string
@@ -145,5 +119,5 @@
 
     /**
-     * A summary description for the event notification. For example, `A payment authorization was created.`
+     * A summary description of the event. E.g. A successful payment authorization was created for $$
      *
      * @param string $summary
@@ -158,5 +132,5 @@
 
     /**
-     * A summary description for the event notification. For example, `A payment authorization was created.`
+     * A summary description of the event. E.g. A successful payment authorization was created for $$
      *
      * @return string
@@ -168,5 +142,5 @@
 
     /**
-     * The resource that triggered the webhook event notification.
+     * This contains the resource that is identified by resource_type element.
      *
      * @param \PayPal\Common\PayPalModel $resource
@@ -181,5 +155,5 @@
 
     /**
-     * The resource that triggered the webhook event notification.
+     * This contains the resource that is identified by resource_type element.
      *
      * @return \PayPal\Common\PayPalModel
@@ -197,6 +171,4 @@
      *
      * NOTE: PLEASE DO NOT USE THE DATA PROVIDED IN WEBHOOK DIRECTLY, AS HACKER COULD PASS IN FAKE DATA. IT IS VERY IMPORTANT THAT YOU RETRIEVE THE ID AND MAKE A SEPARATE CALL TO PAYPAL API.
-     *
-     * @deprecated Please use `VerifyWebhookSignature->post()` instead.
      *
      * @param string     $body
@@ -256,5 +228,5 @@
 
     /**
-     * Resends a webhook event notification, by ID. Any pending notifications are not resent.
+     * Resends the Webhooks event resource identified by event_id.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
@@ -279,5 +251,5 @@
 
     /**
-     * Lists webhook event notifications. Use query parameters to filter the response.
+     * Retrieves the list of Webhooks events resources for the application associated with token. The developers can use it to see list of past webhooks events.
      *
      * @param array $params
@@ -294,6 +266,4 @@
           'start_time' => 1,
           'end_time' => 1,
-          'transaction_id' => 1,
-          'event_type' => 1,
       );
         $json = self::executeCall(
Index: /lib/PayPal/Api/WebhookEventList.php
===================================================================
--- /lib/PayPal/Api/WebhookEventList.php	(revision 8528)
+++ /lib/PayPal/Api/WebhookEventList.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class WebhookEventList
  *
- * List of webhooks events.
+ * List of Webhooks event resources
  *
  * @package PayPal\Api
@@ -19,5 +19,5 @@
 {
     /**
-     * A list of webhooks events.
+     * A list of Webhooks event resources
      *
      * @param \PayPal\Api\WebhookEvent[] $events
@@ -32,5 +32,5 @@
 
     /**
-     * A list of webhooks events.
+     * A list of Webhooks event resources
      *
      * @return \PayPal\Api\WebhookEvent[]
@@ -72,5 +72,5 @@
 
     /**
-     * The number of items in each range of results. Note that the response might have fewer items than the requested `page_size` value.
+     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items.
      *
      * @param int $count
@@ -85,5 +85,5 @@
 
     /**
-     * The number of items in each range of results. Note that the response might have fewer items than the requested `page_size` value.
+     * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items.
      *
      * @return int
Index: /lib/PayPal/Api/WebhookEventType.php
===================================================================
--- /lib/PayPal/Api/WebhookEventType.php	(revision 8528)
+++ /lib/PayPal/Api/WebhookEventType.php	(revision 5261)
@@ -5,11 +5,12 @@
 use PayPal\Common\PayPalResourceModel;
 use PayPal\Validation\ArgumentValidator;
-use PayPal\Api\WebhookEventTypeList;
+use PayPal\Api\WebhookEventList;
 use PayPal\Rest\ApiContext;
+use PayPal\Transport\PayPalRestCall;
 
 /**
  * Class WebhookEventType
  *
- * A list of events.
+ * Contains the information for a Webhooks event-type
  *
  * @package PayPal\Api
@@ -17,10 +18,9 @@
  * @property string name
  * @property string description
- * @property string status
  */
 class WebhookEventType extends PayPalResourceModel
 {
     /**
-     * The unique event name.
+     * Unique event-type name.
      *
      * @param string $name
@@ -35,5 +35,5 @@
 
     /**
-     * The unique event name.
+     * Unique event-type name.
      *
      * @return string
@@ -45,5 +45,5 @@
 
     /**
-     * A human-readable description of the event.
+     * Human readable description of the event-type
      *
      * @param string $description
@@ -58,5 +58,5 @@
 
     /**
-     * A human-readable description of the event.
+     * Human readable description of the event-type
      *
      * @return string
@@ -68,28 +68,5 @@
 
     /**
-     * The status of a webhook event.
-     *
-     * @param string $status
-     * 
-     * @return $this
-     */
-    public function setStatus($status)
-    {
-        $this->status = $status;
-        return $this;
-    }
-
-    /**
-     * The status of a webhook event.
-     *
-     * @return string
-     */
-    public function getStatus()
-    {
-        return $this->status;
-    }
-
-    /**
-     * Lists event subscriptions for a webhook, by ID.
+     * Retrieves the list of events-types subscribed by the given Webhook.
      *
      * @param string $webhookId
@@ -116,5 +93,5 @@
 
     /**
-     * Lists available events to which any webhook can subscribe. For a list of supported events, see [Webhook events](/docs/integration/direct/rest/webhooks/webhook-events/).
+     * Retrieves the master list of available Webhooks events-types resources for any webhook to subscribe to.
      *
      * @param ApiContext $apiContext is the APIContext for this call. It can be used to pass dynamic configuration and credentials.
Index: /lib/PayPal/Api/WebhookEventTypeList.php
===================================================================
--- /lib/PayPal/Api/WebhookEventTypeList.php	(revision 8528)
+++ /lib/PayPal/Api/WebhookEventTypeList.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class WebhookEventTypeList
  *
- * List of webhook events.
+ * List of Webhooks event-types
  *
  * @package PayPal\Api
@@ -17,5 +17,5 @@
 {
     /**
-     * A list of webhook events.
+     * A list of Webhooks event-types
      *
      * @param \PayPal\Api\WebhookEventType[] $event_types
@@ -30,5 +30,5 @@
 
     /**
-     * A list of webhook events.
+     * A list of Webhooks event-types
      *
      * @return \PayPal\Api\WebhookEventType[]
Index: /lib/PayPal/Api/WebhookList.php
===================================================================
--- /lib/PayPal/Api/WebhookList.php	(revision 8528)
+++ /lib/PayPal/Api/WebhookList.php	(revision 5261)
@@ -8,5 +8,5 @@
  * Class WebhookList
  *
- * List of webhooks.
+ * List of Webhooks
  *
  * @package PayPal\Api
@@ -17,5 +17,5 @@
 {
     /**
-     * A list of webhooks.
+     * A list of Webhooks
      *
      * @param \PayPal\Api\Webhook[] $webhooks
@@ -30,5 +30,5 @@
 
     /**
-     * A list of webhooks.
+     * A list of Webhooks
      *
      * @return \PayPal\Api\Webhook[]
Index: /lib/PayPal/Auth/OAuthTokenCredential.php
===================================================================
--- /lib/PayPal/Auth/OAuthTokenCredential.php	(revision 8528)
+++ /lib/PayPal/Auth/OAuthTokenCredential.php	(revision 5261)
@@ -32,5 +32,12 @@
      * @var int $expiryBufferTime
      */
-    public static $expiryBufferTime = 120;
+    private static $expiryBufferTime = 120;
+
+    /**
+     * Private Variable
+     *
+     * @var \PayPal\Core\PayPalLoggingManager $logger
+     */
+    private $logger;
 
     /**
@@ -87,4 +94,5 @@
         $this->clientSecret = $clientSecret;
         $this->cipher = new Cipher($this->clientSecret);
+        $this->logger = PayPalLoggingManager::getInstance(__CLASS__);
     }
 
@@ -118,8 +126,4 @@
     public function getAccessToken($config)
     {
-        // Check if we already have accessToken in Cache
-        if ($this->accessToken && (time() - $this->tokenCreateTime) < ($this->tokenExpiresIn - self::$expiryBufferTime)) {
-            return $this->accessToken;
-        }
         // Check for persisted data first
         $token = AuthorizationCache::pull($config, $this->clientId);
@@ -195,6 +199,4 @@
             return $response['refresh_token'];
         }
-
-        return null;
     }
 
@@ -202,5 +204,5 @@
      * Updates Access Token based on given input
      *
-     * @param array $config
+     * @param      $config
      * @param string|null $refreshToken
      * @return string
@@ -227,9 +229,4 @@
         $httpConfig = new PayPalHttpConfig(null, 'POST', $config);
 
-        // if proxy set via config, add it
-        if (!empty($config['http.Proxy'])) {
-            $httpConfig->setHttpProxy($config['http.Proxy']);
-        }
-
         $handlers = array(self::$AUTH_HANDLER);
 
@@ -255,5 +252,4 @@
      *
      * @param array $config
-     * @param null|string $refreshToken
      * @return null
      * @throws PayPalConnectionException
@@ -274,5 +270,7 @@
             $this->accessToken = null;
             $this->tokenExpiresIn = null;
-            PayPalLoggingManager::getInstance(__CLASS__)->warning("Could not generate new Access token. Invalid response from server: ");
+            $this->logger->warning(
+                "Could not generate new Access token. Invalid response from server: "
+            );
             throw new PayPalConnectionException(null, "Could not generate new Access token. Invalid response from server: ");
         } else {
Index: /lib/PayPal/Cache/AuthorizationCache.php
===================================================================
--- /lib/PayPal/Cache/AuthorizationCache.php	(revision 8528)
+++ /lib/PayPal/Cache/AuthorizationCache.php	(revision 5261)
@@ -21,7 +21,5 @@
     {
         // Return if not enabled
-        if (!self::isEnabled($config)) {
-            return null;
-        }
+        if (!self::isEnabled($config)) { return null; }
 
         $tokens = null;
@@ -35,5 +33,5 @@
                     // If client Id is found, just send in that data only
                     return $tokens[$clientId];
-                } elseif ($clientId) {
+                } else if ($clientId) {
                     // If client Id is provided, but no key in persisted data found matching it.
                     return null;
@@ -57,7 +55,5 @@
     {
         // Return if not enabled
-        if (!self::isEnabled($config)) {
-            return;
-        }
+        if (!self::isEnabled($config)) { return; }
 
         $cachePath = self::cachePath($config);
@@ -79,5 +75,5 @@
             );
         }
-        if (!file_put_contents($cachePath, json_encode($tokens))) {
+        if(!file_put_contents($cachePath, json_encode($tokens))) {
             throw new \Exception("Failed to write cache");
         };
@@ -93,5 +89,5 @@
     {
         $value = self::getConfigValue('cache.enabled', $config);
-        return empty($value) ? false : ((trim($value) == true || trim($value) == 'true'));
+        return empty($value) ? false : ((trim($value) == true || trim($value) == 'true') ?  true : false);
     }
     
@@ -121,3 +117,5 @@
         return (array_key_exists($key, $config)) ? trim($config[$key]) : null;
     }
+
+
 }
Index: /lib/PayPal/Common/ArrayUtil.php
===================================================================
--- /lib/PayPal/Common/ArrayUtil.php	(revision 8528)
+++ /lib/PayPal/Common/ArrayUtil.php	(revision 5261)
@@ -11,4 +11,5 @@
 class ArrayUtil
 {
+
     /**
      *
Index: /lib/PayPal/Common/PayPalModel.php
===================================================================
--- /lib/PayPal/Common/PayPalModel.php	(revision 8528)
+++ /lib/PayPal/Common/PayPalModel.php	(revision 5261)
@@ -2,6 +2,6 @@
 
 namespace PayPal\Common;
-
 use PayPal\Validation\JsonValidator;
+use PayPal\Validation\ModelAccessorValidator;
 
 /**
@@ -39,5 +39,5 @@
      * to do $obj->fromJson($data) later after creating the object.
      *
-     * @param array|string|null $data
+     * @param null $data
      * @throws \InvalidArgumentException
      */
@@ -68,7 +68,5 @@
     {
         // Return Null if Null
-        if ($data === null) {
-            return null;
-        }
+        if ($data === null) { return null; }
 
         if (is_a($data, get_class(new \stdClass()))) {
@@ -125,4 +123,5 @@
     public function __set($key, $value)
     {
+        ModelAccessorValidator::validate($this, $this->convertToCamelCase($key));
         if (!is_array($value) && $value === null) {
             $this->__unset($key);
@@ -176,7 +175,7 @@
             if ($v instanceof PayPalModel) {
                 $ret[$k] = $v->toArray();
-            } elseif (is_array($v) && sizeof($v) <= 0) {
+            } else if (sizeof($v) <= 0 && is_array($v)) {
                 $ret[$k] = array();
-            } elseif (is_array($v)) {
+            } else if (is_array($v)) {
                 $ret[$k] = $this->_convertToArray($v);
             } else {
@@ -207,7 +206,7 @@
                 if (is_array($v)) {
                     // Determine the class of the object
-                    if (($clazz = ReflectionUtil::getPropertyClass(get_class($this), $k)) != null) {
+                    if (($clazz = ReflectionUtil::getPropertyClass(get_class($this), $k)) != null){
                         // If the value is an associative array, it means, its an object. Just make recursive call to it.
-                        if (empty($v)) {
+                        if (empty($v)){
                             if (ReflectionUtil::isPropertyClassArray(get_class($this), $k)) {
                                 // It means, it is an array of objects.
@@ -251,7 +250,7 @@
     private function assignValue($key, $value)
     {
-        $setter = 'set'. $this->convertToCamelCase($key);
-        // If we find the setter, use that, otherwise use magic method.
-        if (method_exists($this, $setter)) {
+        // If we find the getter setter, use that, otherwise use magic method.
+        if (ModelAccessorValidator::validate($this, $this->convertToCamelCase($key))) {
+            $setter = "set" . $this->convertToCamelCase($key);
             $this->$setter($value);
         } else {
Index: /lib/PayPal/Common/PayPalResourceModel.php
===================================================================
--- /lib/PayPal/Common/PayPalResourceModel.php	(revision 8528)
+++ /lib/PayPal/Common/PayPalResourceModel.php	(revision 5261)
@@ -2,8 +2,9 @@
 
 namespace PayPal\Common;
-
+use PayPal\Handler\IPayPalHandler;
 use PayPal\Rest\ApiContext;
 use PayPal\Rest\IResource;
 use PayPal\Transport\PayPalRestCall;
+
 
 /**
@@ -42,9 +43,7 @@
     public function getLink($rel)
     {
-        if (is_array($this->links)) {
-            foreach ($this->links as $link) {
-                if ($link->getRel() == $rel) {
-                    return $link->getHref();
-                }
+        foreach ($this->links as $link) {
+            if ($link->getRel() == $rel) {
+                return $link->getHref();
             }
         }
@@ -105,16 +104,3 @@
         return $json;
     }
-
-    /**
-     * Updates Access Token using long lived refresh token
-     *
-     * @param string|null $refreshToken
-     * @param ApiContext $apiContext
-     * @return void
-     */
-    public function updateAccessToken($refreshToken, $apiContext)
-    {
-        $apiContext = $apiContext ? $apiContext : new ApiContext(self::$credential);
-        $apiContext->getCredential()->updateAccessToken($apiContext->getConfig(), $refreshToken);
-    }
-}
+} 
Index: /lib/PayPal/Common/PayPalUserAgent.php
===================================================================
--- /lib/PayPal/Common/PayPalUserAgent.php	(revision 8528)
+++ /lib/PayPal/Common/PayPalUserAgent.php	(revision 5261)
@@ -22,6 +22,8 @@
     public static function getValue($sdkName, $sdkVersion)
     {
+
         $featureList = array(
-            'platform-ver=' . PHP_VERSION,
+            'lang=PHP',
+            'v=' . PHP_VERSION,
             'bit=' . self::_getPHPBit(),
             'os=' . str_replace(' ', '_', php_uname('s') . ' ' . php_uname('r')),
@@ -30,5 +32,5 @@
         if (defined('OPENSSL_VERSION_TEXT')) {
             $opensslVersion = explode(' ', OPENSSL_VERSION_TEXT);
-            $featureList[] = 'crypto-lib-ver=' . $opensslVersion[1];
+            $featureList[] = 'openssl=' . $opensslVersion[1];
         }
         if (function_exists('curl_version')) {
@@ -36,5 +38,5 @@
             $featureList[] = 'curl=' . $curlVersion['version'];
         }
-        return sprintf("PayPalSDK/%s %s (%s)", $sdkName, $sdkVersion, implode('; ', $featureList));
+        return sprintf("PayPalSDK/%s %s (%s)", $sdkName, $sdkVersion, implode(';', $featureList));
     }
 
Index: /lib/PayPal/Common/ReflectionUtil.php
===================================================================
--- /lib/PayPal/Common/ReflectionUtil.php	(revision 8528)
+++ /lib/PayPal/Common/ReflectionUtil.php	(revision 5261)
@@ -2,5 +2,4 @@
 
 namespace PayPal\Common;
-
 use PayPal\Exception\PayPalConfigurationException;
 
@@ -114,5 +113,5 @@
 
         // todo: smarter regexp
-        if (!preg_match_all(
+        if ( !preg_match_all(
             '~\@([^\s@\(]+)[\t ]*(?:\(?([^\n@]+)\)?)?~i',
             $refl->getDocComment(),
@@ -122,5 +121,5 @@
         }
         foreach ($annots[1] as $i => $annot) {
-            $annotations[strtolower($annot)] = empty($annots[2][$i]) ? true : rtrim($annots[2][$i], " \t\n\r)");
+            $annotations[strtolower($annot)] = empty($annots[2][$i]) ? TRUE : rtrim($annots[2][$i], " \t\n\r)");
         }
 
Index: /lib/PayPal/Converter/FormatConverter.php
===================================================================
--- /lib/PayPal/Converter/FormatConverter.php	(revision 8528)
+++ /lib/PayPal/Converter/FormatConverter.php	(revision 5261)
@@ -3,6 +3,6 @@
 namespace PayPal\Converter;
 
-class FormatConverter
-{
+class FormatConverter {
+
     /**
      * Format the data based on the input formatter value
@@ -47,12 +47,12 @@
     {
         $decimals = 2;
-        $currencyDecimals = array('JPY' => 0, 'TWD' => 0, 'HUF' => 0);
+        $currencyDecimals = array('JPY' => 0, 'TWD' => 0);
         if ($currency && array_key_exists($currency, $currencyDecimals)) {
             if (strpos($value, ".") !== false && (floor($value) != $value)) {
-                //throw exception if it has decimal values for JPY, TWD and HUF which does not ends with .00
+                //throw exception if it has decimal values for JPY and TWD which does not ends with .00
                 throw new \InvalidArgumentException("value cannot have decimals for $currency currency");
             }
             $decimals = $currencyDecimals[$currency];
-        } elseif (strpos($value, ".") === false) {
+        } else if (strpos($value, ".") === false) {
             // Check if value has decimal values. If not no need to assign 2 decimals with .00 at the end
             $decimals = 0;
Index: /lib/PayPal/Core/PayPalConfigManager.php
===================================================================
--- /lib/PayPal/Core/PayPalConfigManager.php	(revision 8528)
+++ /lib/PayPal/Core/PayPalConfigManager.php	(revision 5261)
@@ -96,13 +96,12 @@
     public function get($searchKey)
     {
+
         if (array_key_exists($searchKey, $this->configs)) {
             return $this->configs[$searchKey];
         } else {
             $arr = array();
-            if ($searchKey !== '') {
-                foreach ($this->configs as $k => $v) {
-                    if (strstr($k, $searchKey)) {
-                        $arr[$k] = $v;
-                    }
+            foreach ($this->configs as $k => $v) {
+                if (strstr($k, $searchKey)) {
+                    $arr[$k] = $v;
                 }
             }
@@ -110,4 +109,5 @@
             return $arr;
         }
+
     }
 
@@ -124,4 +124,5 @@
     public function getIniPrefix($userId = null)
     {
+
         if ($userId == null) {
             $arr = array();
@@ -157,3 +158,6 @@
         trigger_error('Clone is not allowed.', E_USER_ERROR);
     }
+
 }
+
+    
Index: /lib/PayPal/Core/PayPalConstants.php
===================================================================
--- /lib/PayPal/Core/PayPalConstants.php	(revision 8528)
+++ /lib/PayPal/Core/PayPalConstants.php	(revision 5261)
@@ -13,5 +13,5 @@
 
     const SDK_NAME = 'PayPal-PHP-SDK';
-    const SDK_VERSION = '1.13.0';
+    const SDK_VERSION = '1.4.0';
 
     /**
@@ -21,7 +21,7 @@
 
     const REST_SANDBOX_ENDPOINT = "https://api.sandbox.paypal.com/";
-    const OPENID_REDIRECT_SANDBOX_URL = "https://www.sandbox.paypal.com";
+    const OPENID_REDIRECT_SANDBOX_URL = "https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect";
 
     const REST_LIVE_ENDPOINT = "https://api.paypal.com/";
-    const OPENID_REDIRECT_LIVE_URL = "https://www.paypal.com";
+    const OPENID_REDIRECT_LIVE_URL = "https://www.paypal.com/webapps/auth/protocol/openidconnect";
 }
Index: /lib/PayPal/Core/PayPalCredentialManager.php
===================================================================
--- /lib/PayPal/Core/PayPalCredentialManager.php	(revision 8528)
+++ /lib/PayPal/Core/PayPalCredentialManager.php	(revision 5261)
@@ -97,5 +97,5 @@
         $userName = null;
         while (in_array($key, $arrayPartKeys)) {
-            if (isset($credArr[$key . ".ClientId"]) && isset($credArr[$key . ".ClientSecret"])) {
+            if (isset($credArr[$key . ".ClientId"]) && isset($credArr[$key . ".ClientId"])) {
                 $userName = $key;
                 $this->credentialHashmap[$userName] = new OAuthTokenCredential(
@@ -114,4 +114,5 @@
             $key = $prefix . $suffix;
         }
+
     }
 
@@ -146,5 +147,5 @@
         if ($userId == null && array_key_exists($this->defaultAccountName, $this->credentialHashmap)) {
             $credObj = $this->credentialHashmap[$this->defaultAccountName];
-        } elseif (array_key_exists($userId, $this->credentialHashmap)) {
+        } else if (array_key_exists($userId, $this->credentialHashmap)) {
             $credObj = $this->credentialHashmap[$userId];
         }
@@ -164,3 +165,4 @@
         trigger_error('Clone is not allowed.', E_USER_ERROR);
     }
+
 }
Index: /lib/PayPal/Core/PayPalHttpConfig.php
===================================================================
--- /lib/PayPal/Core/PayPalHttpConfig.php	(revision 8528)
+++ /lib/PayPal/Core/PayPalHttpConfig.php	(revision 5261)
@@ -20,7 +20,7 @@
      */
     public static $defaultCurlOptions = array(
-        CURLOPT_SSLVERSION => 6,
+        CURLOPT_SSLVERSION => 1,
         CURLOPT_CONNECTTIMEOUT => 10,
-        CURLOPT_RETURNTRANSFER => true,
+        CURLOPT_RETURNTRANSFER => TRUE,
         CURLOPT_TIMEOUT => 60,    // maximum number of seconds to allow cURL functions to execute
         CURLOPT_USERAGENT => 'PayPal-PHP-SDK',
@@ -28,5 +28,5 @@
         CURLOPT_SSL_VERIFYHOST => 2,
         CURLOPT_SSL_VERIFYPEER => 1,
-        CURLOPT_SSL_CIPHER_LIST => 'TLSv1:TLSv1.2'
+        CURLOPT_SSL_CIPHER_LIST => 'TLSv1'
         //Allowing TLSv1 cipher list.
         //Adding it like this for backward compatibility with older versions of curl
@@ -65,5 +65,5 @@
         $curl = curl_version();
         $sslVersion = isset($curl['ssl_version']) ? $curl['ssl_version'] : '';
-        if($sslVersion && substr_compare($sslVersion, "NSS/", 0, strlen("NSS/")) === 0) {
+        if (substr_compare($sslVersion, "NSS/", 0, strlen("NSS/")) === 0) {
             //Remove the Cipher List for NSS
             $this->removeCurlOption(CURLOPT_SSL_CIPHER_LIST);
Index: /lib/PayPal/Core/PayPalHttpConnection.php
===================================================================
--- /lib/PayPal/Core/PayPalHttpConnection.php	(revision 8528)
+++ /lib/PayPal/Core/PayPalHttpConnection.php	(revision 5261)
@@ -20,4 +20,11 @@
 
     /**
+     * HTTP status codes for which a retry must be attempted
+     * retry is currently attempted for Request timeout, Bad Gateway,
+     * Service Unavailable and Gateway timeout errors.
+     */
+    private static $retryCodes = array('408', '502', '503', '504',);
+
+    /**
      * LoggingManager
      *
@@ -25,14 +32,4 @@
      */
     private $logger;
-
-    /**
-     * @var array
-     */
-    private $responseHeaders = array();
-
-    /**
-     * @var bool
-     */
-    private $skippedHttpStatusLine = false;
 
     /**
@@ -59,4 +56,5 @@
     private function getHttpHeaders()
     {
+
         $ret = array();
         foreach ($this->httpConfig->getHeaders() as $k => $v) {
@@ -67,59 +65,9 @@
 
     /**
-     * Parses the response headers for debugging.
+     * Executes an HTTP request
      *
-     * @param resource $ch
-     * @param string $data
-     * @return int
+     * @param string $data query string OR POST content as a string
+     * @throws PayPalConnectionException
      */
-    protected function parseResponseHeaders($ch, $data) {
-        if (!$this->skippedHttpStatusLine) {
-            $this->skippedHttpStatusLine = true;
-            return strlen($data);
-        }
-
-        $trimmedData = trim($data);
-        if (strlen($trimmedData) == 0) {
-            return strlen($data);
-        }
-
-        // Added condition to ignore extra header which dont have colon ( : )
-        if (strpos($trimmedData, ":") == false) {
-            return strlen($data);
-        }
-        
-        list($key, $value) = explode(":", $trimmedData, 2);
-
-        $key = trim($key);
-        $value = trim($value);
-
-        // This will skip over the HTTP Status Line and any other lines
-        // that don't look like header lines with values
-        if (strlen($key) > 0 && strlen($value) > 0) {
-            // This is actually a very basic way of looking at response headers
-            // and may miss a few repeated headers with different (appended)
-            // values but this should work for debugging purposes.
-            $this->responseHeaders[$key] = $value;
-        }
-
-        return strlen($data);
-    }
-
-
-    /**
-     * Implodes a key/value array for printing.
-     *
-     * @param array $arr
-     * @return string
-     */
-    protected function implodeArray($arr) {
-        $retStr = '';
-        foreach($arr as $key => $value) {
-            $retStr .= $key . ': ' . $value . ', ';
-        }
-        rtrim($retStr, ', ');
-        return $retStr;
-    }
-
     /**
      * Executes an HTTP request
@@ -136,11 +84,7 @@
         //Initialize Curl Options
         $ch = curl_init($this->httpConfig->getUrl());
-        $options = $this->httpConfig->getCurlOptions();
-        if (empty($options[CURLOPT_HTTPHEADER])) {
-            unset($options[CURLOPT_HTTPHEADER]);
-        }
-        curl_setopt_array($ch, $options);
+        curl_setopt_array($ch, $this->httpConfig->getCurlOptions());
         curl_setopt($ch, CURLOPT_URL, $this->httpConfig->getUrl());
-        curl_setopt($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_HEADER, true);
         curl_setopt($ch, CURLINFO_HEADER_OUT, true);
         curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHttpHeaders());
@@ -150,6 +94,4 @@
             case 'POST':
                 curl_setopt($ch, CURLOPT_POST, true);
-                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
-                break;
             case 'PUT':
             case 'PATCH':
@@ -160,11 +102,13 @@
 
         //Default Option if Method not of given types in switch case
-        if ($this->httpConfig->getMethod() != null) {
+        if ($this->httpConfig->getMethod() != NULL) {
             curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->httpConfig->getMethod());
         }
 
-        $this->responseHeaders = array();
-        $this->skippedHttpStatusLine = false;
-        curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'parseResponseHeaders'));
+        //Logging Each Headers for debugging purposes
+        foreach ($this->getHttpHeaders() as $header) {
+            //TODO: Strip out credentials and other secure info when logging.
+            // $this->logger->debug($header);
+        }
 
         //Execute Curl Request
@@ -182,4 +126,15 @@
         }
 
+        //Retry if Failing
+        $retries = 0;
+        if (in_array($httpStatus, self::$retryCodes) && $this->httpConfig->getHttpRetryCount() != null) {
+            $this->logger->info("Got $httpStatus response from server. Retrying");
+            do {
+                $result = curl_exec($ch);
+                //Retrieve Response Status
+                $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+            } while (in_array($httpStatus, self::$retryCodes) && (++$retries < $this->httpConfig->getHttpRetryCount()));
+        }
+
         //Throw Exception if Retries and Certificates doenst work
         if (curl_errno($ch)) {
@@ -195,8 +150,13 @@
         // Get Request and Response Headers
         $requestHeaders = curl_getinfo($ch, CURLINFO_HEADER_OUT);
+        //Using alternative solution to CURLINFO_HEADER_SIZE as it throws invalid number when called using PROXY.
+        $responseHeaderSize = strlen($result) - curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
+        $responseHeaders = substr($result, 0, $responseHeaderSize);
+        $result = substr($result, $responseHeaderSize);
+
         $this->logger->debug("Request Headers \t: " . str_replace("\r\n", ", ", $requestHeaders));
         $this->logger->debug(($data && $data != '' ? "Request Data\t\t: " . $data : "No Request Payload") . "\n" . str_repeat('-', 128) . "\n");
         $this->logger->info("Response Status \t: " . $httpStatus);
-        $this->logger->debug("Response Headers\t: " . $this->implodeArray($this->responseHeaders));
+        $this->logger->debug("Response Headers\t: " . str_replace("\r\n", ", ", $responseHeaders));
 
         //Close the curl request
@@ -204,5 +164,16 @@
 
         //More Exceptions based on HttpStatus Code
-        if ($httpStatus < 200 || $httpStatus >= 300) {
+        if (in_array($httpStatus, self::$retryCodes)) {
+            $ex = new PayPalConnectionException(
+                $this->httpConfig->getUrl(),
+                "Got Http response code $httpStatus when accessing {$this->httpConfig->getUrl()}. " .
+                "Retried $retries times."
+            );
+            $ex->setData($result);
+            $this->logger->error("Got Http response code $httpStatus when accessing {$this->httpConfig->getUrl()}. " .
+                "Retried $retries times." . $result);
+            $this->logger->debug("\n\n" . str_repeat('=', 128) . "\n");
+            throw $ex;
+        } else if ($httpStatus < 200 || $httpStatus >= 300) {
             $ex = new PayPalConnectionException(
                 $this->httpConfig->getUrl(),
@@ -211,5 +182,5 @@
             );
             $ex->setData($result);
-            $this->logger->error("Got Http response code $httpStatus when accessing {$this->httpConfig->getUrl()}. " . $result);
+            $this->logger->error("Got Http response code $httpStatus when accessing {$this->httpConfig->getUrl()}. " . $result );
             $this->logger->debug("\n\n" . str_repeat('=', 128) . "\n");
             throw $ex;
@@ -221,3 +192,4 @@
         return $result;
     }
+
 }
Index: /lib/PayPal/Core/PayPalLoggingManager.php
===================================================================
--- /lib/PayPal/Core/PayPalLoggingManager.php	(revision 8528)
+++ /lib/PayPal/Core/PayPalLoggingManager.php	(revision 5261)
@@ -2,7 +2,4 @@
 
 namespace PayPal\Core;
-
-use PayPal\Log\PayPalLogFactory;
-use Psr\Log\LoggerInterface;
 
 /**
@@ -13,22 +10,36 @@
 class PayPalLoggingManager
 {
-    /**
-     * @var array of logging manager instances with class name as key
-     */
-    private static $instances = array();
 
     /**
-     * The logger to be used for all messages
-     *
-     * @var LoggerInterface
+     * Default Logging Level
      */
-    private $logger;
+    const DEFAULT_LOGGING_LEVEL = 0;
 
     /**
      * Logger Name
+     * @var string
+     */
+    private $loggerName;
+
+    /**
+     * Log Enabled
+     *
+     * @var bool
+     */
+    private $isLoggingEnabled;
+
+    /**
+     * Configured Logging Level
+     *
+     * @var int|mixed
+     */
+    private $loggingLevel;
+
+    /**
+     * Configured Logging File
      *
      * @var string
      */
-    private $loggerName;
+    private $loggerFile;
 
     /**
@@ -40,26 +51,70 @@
     public static function getInstance($loggerName = __CLASS__)
     {
-        if (array_key_exists($loggerName, PayPalLoggingManager::$instances)) {
-            return PayPalLoggingManager::$instances[$loggerName];
-        }
-        $instance = new self($loggerName);
-        PayPalLoggingManager::$instances[$loggerName] = $instance;
+        $instance = new self();
+        $instance->setLoggerName($loggerName);
         return $instance;
     }
 
     /**
+     * Sets Logger Name. Generally defaulted to Logging Class
+     *
+     * @param string $loggerName
+     */
+    public function setLoggerName($loggerName = __CLASS__)
+    {
+        $this->loggerName = $loggerName;
+    }
+
+    /**
      * Default Constructor
+     */
+    public function __construct()
+    {
+        // To suppress the warning during the date() invocation in logs, we would default the timezone to GMT.
+        if (!ini_get('date.timezone')) {
+            date_default_timezone_set('GMT');
+        }
+
+        $config = PayPalConfigManager::getInstance()->getConfigHashmap();
+
+        $this->isLoggingEnabled = (array_key_exists('log.LogEnabled', $config) && $config['log.LogEnabled'] == '1');
+
+        if ($this->isLoggingEnabled) {
+            $this->loggerFile = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log');
+            $loggingLevel = strtoupper($config['log.LogLevel']);
+            $this->loggingLevel =
+                (isset($loggingLevel) && defined(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel")) ?
+                constant(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel") :
+                PayPalLoggingManager::DEFAULT_LOGGING_LEVEL;
+        }
+    }
+
+    /**
+     * Default Logger
      *
-     * @param string $loggerName Generally represents the class name.
+     * @param string $message
+     * @param int $level
      */
-    private function __construct($loggerName)
+    private function log($message, $level = PayPalLoggingLevel::INFO)
     {
-        $config = PayPalConfigManager::getInstance()->getConfigHashmap();
-        // Checks if custom factory defined, and is it an implementation of @PayPalLogFactory
-        $factory = array_key_exists('log.AdapterFactory', $config) && in_array('PayPal\Log\PayPalLogFactory', class_implements($config['log.AdapterFactory'])) ? $config['log.AdapterFactory'] : '\PayPal\Log\PayPalDefaultLogFactory';
-        /** @var PayPalLogFactory $factoryInstance */
-        $factoryInstance = new $factory();
-        $this->logger = $factoryInstance->getLogger($loggerName);
-        $this->loggerName = $loggerName;
+        if ($this->isLoggingEnabled) {
+            $config = PayPalConfigManager::getInstance()->getConfigHashmap();
+            // Check if logging in live
+            if (array_key_exists('mode', $config) && $config['mode'] == 'live') {
+                // Live should not have logging level above INFO.
+                if ($this->loggingLevel >= PayPalLoggingLevel::INFO) {
+                    // If it is at Debug Level, throw an warning in the log.
+                    if ($this->loggingLevel == PayPalLoggingLevel::DEBUG) {
+                        error_log("[" . date('d-m-Y h:i:s') . "] " . $this->loggerName . ": ERROR\t: Not allowed to keep 'Debug' level for Live Environments. Reduced to 'INFO'\n", 3, $this->loggerFile);
+                    }
+                    // Reducing it to info level
+                    $this->loggingLevel = PayPalLoggingLevel::INFO;
+                }
+            }
+
+            if ($level <= $this->loggingLevel) {
+                error_log("[" . date('d-m-Y h:i:s') . "] " . $this->loggerName . ": $message\n", 3, $this->loggerFile);
+            }
+        }
     }
 
@@ -71,5 +126,5 @@
     public function error($message)
     {
-        $this->logger->error($message);
+        $this->log("ERROR\t: " . $message, PayPalLoggingLevel::ERROR);
     }
 
@@ -81,5 +136,5 @@
     public function warning($message)
     {
-        $this->logger->warning($message);
+        $this->log("WARNING\t: " . $message, PayPalLoggingLevel::WARN);
     }
 
@@ -91,5 +146,5 @@
     public function info($message)
     {
-        $this->logger->info($message);
+        $this->log("INFO\t: " . $message, PayPalLoggingLevel::INFO);
     }
 
@@ -101,9 +156,9 @@
     public function fine($message)
     {
-        $this->info($message);
+        $this->log("FINE\t: " . $message, PayPalLoggingLevel::FINE);
     }
 
     /**
-     * Log Debug
+     * Log Fine
      *
      * @param string $message
@@ -111,9 +166,6 @@
     public function debug($message)
     {
-        $config = PayPalConfigManager::getInstance()->getConfigHashmap();
-        // Disable debug in live mode.
-        if (array_key_exists('mode', $config) && $config['mode'] != 'live') {
-            $this->logger->debug($message);
-        }
+        $this->log("DEBUG\t: " . $message, PayPalLoggingLevel::DEBUG);
     }
+
 }
Index: /lib/PayPal/Exception/PayPalInvalidCredentialException.php
===================================================================
--- /lib/PayPal/Exception/PayPalInvalidCredentialException.php	(revision 8528)
+++ /lib/PayPal/Exception/PayPalInvalidCredentialException.php	(revision 5261)
@@ -33,3 +33,4 @@
         return $errorMsg;
     }
+
 }
Index: /lib/PayPal/Exception/PayPalMissingCredentialException.php
===================================================================
--- /lib/PayPal/Exception/PayPalMissingCredentialException.php	(revision 8528)
+++ /lib/PayPal/Exception/PayPalMissingCredentialException.php	(revision 5261)
@@ -34,3 +34,4 @@
         return $errorMsg;
     }
+
 }
Index: /lib/PayPal/Handler/OauthHandler.php
===================================================================
--- /lib/PayPal/Handler/OauthHandler.php	(revision 8528)
+++ /lib/PayPal/Handler/OauthHandler.php	(revision 5261)
@@ -79,7 +79,7 @@
         if (isset($config['oauth.EndPoint'])) {
             $baseEndpoint = $config['oauth.EndPoint'];
-        } elseif (isset($config['service.EndPoint'])) {
+        } else if (isset($config['service.EndPoint'])) {
             $baseEndpoint = $config['service.EndPoint'];
-        } elseif (isset($config['mode'])) {
+        } else if (isset($config['mode'])) {
             switch (strtoupper($config['mode'])) {
                 case 'SANDBOX':
Index: /lib/PayPal/Handler/RestHandler.php
===================================================================
--- /lib/PayPal/Handler/RestHandler.php	(revision 8528)
+++ /lib/PayPal/Handler/RestHandler.php	(revision 5261)
@@ -48,4 +48,5 @@
     public function handle($httpConfig, $request, $options)
     {
+
         $credential = $this->apiContext->getCredential();
         $config = $this->apiContext->getConfig();
@@ -72,7 +73,4 @@
         );
 
-        // Overwrite Expect Header to disable 100 Continue Issue
-        $httpConfig->addHeader("Expect", null);
-
         if (!array_key_exists("User-Agent", $httpConfig->getHeaders())) {
             $httpConfig->addHeader("User-Agent", PayPalUserAgent::getValue(PayPalConstants::SDK_NAME, PayPalConstants::SDK_VERSION));
@@ -83,5 +81,5 @@
         }
 
-        if (($httpConfig->getMethod() == 'POST' || $httpConfig->getMethod() == 'PUT') && !is_null($this->apiContext->getRequestId())) {
+        if ($httpConfig->getMethod() == 'POST' || $httpConfig->getMethod() == 'PUT') {
             $httpConfig->addHeader('PayPal-Request-Id', $this->apiContext->getRequestId());
         }
@@ -105,5 +103,5 @@
         if (isset($config['service.EndPoint'])) {
             return $config['service.EndPoint'];
-        } elseif (isset($config['mode'])) {
+        } else if (isset($config['mode'])) {
             switch (strtoupper($config['mode'])) {
                 case 'SANDBOX':
Index: /lib/PayPal/Rest/ApiContext.php
===================================================================
--- /lib/PayPal/Rest/ApiContext.php	(revision 8528)
+++ /lib/PayPal/Rest/ApiContext.php	(revision 5261)
@@ -29,5 +29,5 @@
      * If the value is not set, it would get the value from @\PayPal\Core\PayPalCredentialManager
      *
-     * @var \PayPal\Auth\OAuthTokenCredential
+     * @var \Paypal\Auth\OAuthTokenCredential
      */
     private $credential;
@@ -86,15 +86,9 @@
     public function getRequestId()
     {
+        if ($this->requestId == null) {
+            $this->requestId = $this->generateRequestId();
+        }
+
         return $this->requestId;
-    }
-
-    /**
-     * Sets the request ID
-     *
-     * @param string $requestId the PayPal-Request-Id value to use
-     */
-    public function setRequestId($requestId)
-    {
-        $this->requestId = $requestId;
     }
 
@@ -103,5 +97,4 @@
      * header used for idempotency. In cases where you need to make multiple create calls
      * using the same ApiContext object, you need to reset request Id.
-     * @deprecated Call setRequestId with a unique value.
      *
      * @return string
@@ -148,5 +141,4 @@
      * can be used to set the PayPal-Request-Id header
      * that is used for idempotency
-     * @deprecated
      *
      * @return string
Index: /lib/PayPal/Security/Cipher.php
===================================================================
--- /lib/PayPal/Security/Cipher.php	(revision 8528)
+++ /lib/PayPal/Security/Cipher.php	(revision 5261)
@@ -19,5 +19,5 @@
     const IV_SIZE = 16;
 
-    public function __construct($secretKey)
+    function __construct($secretKey)
     {
         $this->secretKey = $secretKey;
@@ -30,5 +30,5 @@
      * @return string
      */
-    public function encrypt($input)
+    function encrypt($input)
     {
         // Create a random IV. Not using mcrypt to generate one, as to not have a dependency on it.
@@ -46,5 +46,5 @@
      * @return string
      */
-    public function decrypt($input)
+    function decrypt($input)
     {
         // Decode the IV + data
Index: /lib/PayPal/Transport/PayPalRestCall.php
===================================================================
--- /lib/PayPal/Transport/PayPalRestCall.php	(revision 8528)
+++ /lib/PayPal/Transport/PayPalRestCall.php	(revision 5261)
@@ -2,7 +2,7 @@
 namespace PayPal\Transport;
 
+use PayPal\Core\PayPalLoggingManager;
 use PayPal\Core\PayPalHttpConfig;
 use PayPal\Core\PayPalHttpConnection;
-use PayPal\Core\PayPalLoggingManager;
 use PayPal\Rest\ApiContext;
 
@@ -53,4 +53,5 @@
     public function execute($handlers = array(), $path, $method, $data = '', $headers = array())
     {
+
         $config = $this->apiContext->getConfig();
         $httpConfig = new PayPalHttpConfig(null, $method, $config);
@@ -61,9 +62,4 @@
             )
         );
-
-        // if proxy set via config, add it
-        if (!empty($config['http.Proxy'])) {
-            $httpConfig->setHttpProxy($config['http.Proxy']);
-        }
 
         /** @var \Paypal\Handler\IPayPalHandler $handler */
@@ -80,3 +76,4 @@
         return $response;
     }
+
 }
Index: /lib/PayPal/Validation/ArgumentValidator.php
===================================================================
--- /lib/PayPal/Validation/ArgumentValidator.php	(revision 8528)
+++ /lib/PayPal/Validation/ArgumentValidator.php	(revision 5261)
@@ -24,5 +24,5 @@
             // Error if Object Null
             throw new \InvalidArgumentException("$argumentName cannot be null");
-        } elseif (gettype($argument) == 'string' && trim($argument) == '') {
+        } else if (gettype($argument) == 'string' && trim($argument) == ''){
             // Error if String Empty
             throw new \InvalidArgumentException("$argumentName string cannot be empty");
Index: /lib/PayPal/Validation/JsonValidator.php
===================================================================
--- /lib/PayPal/Validation/JsonValidator.php	(revision 8528)
+++ /lib/PayPal/Validation/JsonValidator.php	(revision 5261)
@@ -22,7 +22,4 @@
         @json_decode($string);
         if (json_last_error() != JSON_ERROR_NONE) {
-            if ($string === '' || $string === null) {
-                return true;
-            }
             if ($silent == false) {
                 //Throw an Exception for string or array
@@ -33,3 +30,3 @@
         return true;
     }
-}
+} 
Index: /lib/PayPal/Validation/NumericValidator.php
===================================================================
--- /lib/PayPal/Validation/NumericValidator.php	(revision 8528)
+++ /lib/PayPal/Validation/NumericValidator.php	(revision 5261)
@@ -22,4 +22,5 @@
         if (trim($argument) != null && !is_numeric($argument)) {
             throw new \InvalidArgumentException("$argumentName is not a valid numeric value");
+
         }
         return true;
Index: /lib/PayPal/Validation/UrlValidator.php
===================================================================
--- /lib/PayPal/Validation/UrlValidator.php	(revision 8528)
+++ /lib/PayPal/Validation/UrlValidator.php	(revision 5261)
Index: b/composer.json
===================================================================
--- /lib/composer.json	(revision 8528)
+++ 	(revision )
@@ -1,6 +1,0 @@
-{
-  "require": { 
-    "leafo/scssphp": "v0.7.1",
-    "matthiasmullie/minify": "1.3.60"
-  }
-}
Index: b/composer.lock
===================================================================
--- /lib/composer.lock	(revision 8528)
+++ 	(revision )
@@ -1,193 +1,0 @@
-{
-    "_readme": [
-        "This file locks the dependencies of your project to a known state",
-        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
-        "This file is @generated automatically"
-    ],
-    "content-hash": "12a22a3c84870878acb8d5985523a49c",
-    "packages": [
-        {
-            "name": "leafo/scssphp",
-            "version": "v0.7.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/leafo/scssphp.git",
-                "reference": "9eaf3a6db4d88ce2c265a89e3fc495fbec9bf7a6"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/leafo/scssphp/zipball/9eaf3a6db4d88ce2c265a89e3fc495fbec9bf7a6",
-                "reference": "9eaf3a6db4d88ce2c265a89e3fc495fbec9bf7a6",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.6",
-                "squizlabs/php_codesniffer": "~2.5"
-            },
-            "bin": [
-                "bin/pscss"
-            ],
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Leafo\\ScssPhp\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Leaf Corcoran",
-                    "email": "leafot@gmail.com",
-                    "homepage": "http://leafo.net"
-                }
-            ],
-            "description": "scssphp is a compiler for SCSS written in PHP.",
-            "homepage": "http://leafo.github.io/scssphp/",
-            "keywords": [
-                "css",
-                "less",
-                "sass",
-                "scss",
-                "stylesheet"
-            ],
-            "support": {
-                "issues": "https://github.com/leafo/scssphp/issues",
-                "source": "https://github.com/leafo/scssphp/tree/master"
-            },
-            "abandoned": "scssphp/scssphp",
-            "time": "2017-10-13T15:53:00+00:00"
-        },
-        {
-            "name": "matthiasmullie/minify",
-            "version": "1.3.60",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/matthiasmullie/minify.git",
-                "reference": "ab7fea80ce5ce6549baaf272bc8bd926a7e08f90"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/ab7fea80ce5ce6549baaf272bc8bd926a7e08f90",
-                "reference": "ab7fea80ce5ce6549baaf272bc8bd926a7e08f90",
-                "shasum": ""
-            },
-            "require": {
-                "ext-pcre": "*",
-                "matthiasmullie/path-converter": "~1.1",
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "~2.0",
-                "matthiasmullie/scrapbook": "~1.0",
-                "phpunit/phpunit": "~4.8"
-            },
-            "suggest": {
-                "psr/cache-implementation": "Cache implementation to use with Minify::cache"
-            },
-            "bin": [
-                "bin/minifycss",
-                "bin/minifyjs"
-            ],
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "MatthiasMullie\\Minify\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Matthias Mullie",
-                    "email": "minify@mullie.eu",
-                    "homepage": "http://www.mullie.eu",
-                    "role": "Developer"
-                }
-            ],
-            "description": "CSS & JavaScript minifier, in PHP. Removes whitespace, strips comments, combines files (incl. @import statements and small assets in CSS files), and optimizes/shortens a few common programming patterns.",
-            "homepage": "http://www.minifier.org",
-            "keywords": [
-                "JS",
-                "css",
-                "javascript",
-                "minifier",
-                "minify"
-            ],
-            "support": {
-                "issues": "https://github.com/matthiasmullie/minify/issues",
-                "source": "https://github.com/matthiasmullie/minify/tree/master"
-            },
-            "time": "2018-04-18T08:50:35+00:00"
-        },
-        {
-            "name": "matthiasmullie/path-converter",
-            "version": "1.1.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/matthiasmullie/path-converter.git",
-                "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/e7d13b2c7e2f2268e1424aaed02085518afa02d9",
-                "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9",
-                "shasum": ""
-            },
-            "require": {
-                "ext-pcre": "*",
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.8"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "MatthiasMullie\\PathConverter\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Matthias Mullie",
-                    "email": "pathconverter@mullie.eu",
-                    "homepage": "http://www.mullie.eu",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Relative path converter",
-            "homepage": "http://github.com/matthiasmullie/path-converter",
-            "keywords": [
-                "converter",
-                "path",
-                "paths",
-                "relative"
-            ],
-            "support": {
-                "issues": "https://github.com/matthiasmullie/path-converter/issues",
-                "source": "https://github.com/matthiasmullie/path-converter/tree/1.1.3"
-            },
-            "time": "2019-02-05T23:41:09+00:00"
-        }
-    ],
-    "packages-dev": [],
-    "aliases": [],
-    "minimum-stability": "stable",
-    "stability-flags": [],
-    "prefer-stable": false,
-    "prefer-lowest": false,
-    "platform": [],
-    "platform-dev": [],
-    "plugin-api-version": "2.2.0"
-}
Index: /lib/filter_functions.inc.php
===================================================================
--- /lib/filter_functions.inc.php	(revision 8528)
+++ /lib/filter_functions.inc.php	(revision 5261)
@@ -1,891 +1,618 @@
-<?php
-
-    /**
-     * Ãbernimmt die Ausgabe im Backend
-     */
-    function wpsg_dispatch()
-    {
-    
-        if ($_REQUEST['page'] == 'wpsg-Admin')
-        {
-    
-            // AdminController ÃŒbernimmt
-            $AC = new wpsg_AdminController();
-            $AC->dispatch();
-    
-        }
-        else if ($_REQUEST['page'] == 'wpsg-Produkt')
-        {
-    
-            // ProduktController ÃŒbernimmt
-            $PC = new wpsg_ProduktController();
-            $PC->dispatch();
-    
-        }
-        else if ($_REQUEST['page'] == 'wpsg-Order')
-        {
-    
-            // Bestellverwaltung ÃŒbernimmt
-            $OC = new wpsg_OrderController();
-            $OC->dispatch();
-    
-        }
-    
-    } // function wpsg_dispatch()
-    
-    function wpsg_admin_notices() {
-
-        $wpsg_update_data = wpsg_get_update_data();
-    
-        if ($wpsg_update_data !== null && is_object($wpsg_update_data['updateData'])) {
-    
-            if (property_exists($wpsg_update_data['updateData'], 'banner')) {
-    
-                $arBanner = $wpsg_update_data['updateData']->banner;
-    
-                if (wpsg_isSizedArray($arBanner)) {
-
-                    foreach ($arBanner as $b) {
-    
-                        echo '<div class="wpsg_banner '.$b['class'].'">';
-                        echo $b['content'];
-                        echo '</div>';
-    
-                    }
-    
-                }
-    
-            }
-    
-        }
-
-        echo $GLOBALS['wpsg_sc']->writeBackendMessage();
-    
-    }
-    
-    /**
-     * Wird in der Wordpress Pluginverwaltung nach dem Plugin aufgerufen
-     */
-    function wpsg_after_plugin_row($pluginfile, $plugindata, $context)
-    {
-
-        if ($plugindata['Name'] == 'wpShopGermany')
-        {
-
-            //if ($GLOBALS['wpsg_sc']->isMultiBlog()) echo 'multi';
-            //if (strpos($_SERVER['REQUEST_URI'], 'network') !== false) echo 'network';
-            //if ($GLOBALS['wpsg_sc']->bLicence === true) echo 'licence';    
-			
-            if ($GLOBALS['wpsg_sc']->bLicence === true)
-            {
+<?php 
+
+	/**
+	 * Ãbernimmt die Ausgabe im Backend
+	 */
+	function wpsg_dispatch()
+	{
+		 		
+		if ($_REQUEST['page'] == 'wpsg-Admin')
+		{
+
+			// AdminController ÃŒbernimmt
+			$AC = new wpsg_AdminController();
+			$AC->dispatch();
+			
+		}
+		else if ($_REQUEST['page'] == 'wpsg-Produkt')
+		{
+			
+			// ProduktController ÃŒbernimmt
+			$PC = new wpsg_ProduktController();
+			$PC->dispatch();
+			
+		}
+		else if ($_REQUEST['page'] == 'wpsg-Order')
+		{
+			
+			// Bestellverwaltung ÃŒbernimmt
+			$OC = new wpsg_OrderController();
+			$OC->dispatch();
+			
+		}
+		
+	} // function wpsg_dispatch()
+
+	/**
+	 * Wird in der Wordpress Pluginverwaltung nach dem Plugin aufgerufen
+	 */
+	function wpsg_after_plugin_row($pluginfile, $plugindata, $context)
+	{
+		
+		if ($plugindata['Name'] == 'wpShopGermany')
+		{
+					
+			if ($GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core'))
+			{
+			
+				echo '<tr class="plugin-update-trr '.((is_plugin_active('wpshopgermany/wpshopgermany.php'))?'active':'').'" id="wpsg-licence"><td colspan="4">';			
+				
+				echo $GLOBALS['wpsg_sc']->writeBackendMessage();
+				
+				echo '<div class="update-wpsg-message">'; 
+				
+				if (intval($GLOBALS['wpsg_sc']->arLizenz['nr']) <= 0 && $GLOBALS['wpsg_sc']->getDemoDays() > 0)
+				{
+					echo wpsg_translate(__('Aktive Demo Lizenz (Noch #1# Tage)', 'wpsg'), $GLOBALS['wpsg_sc']->getDemoDays());
+				}
+				else if (intval($GLOBALS['wpsg_sc']->arLizenz['nr']) <= 0)
+				{
+					echo '<span style="color:red;">'.__('Keine gÃŒltige Lizenz', 'wpsg').'</span>';
+				}
+				else 
+				{
+					 
+					switch ($GLOBALS['wpsg_sc']->arLizenz['l'])
+					{
+						
+						case '1': echo __('Light Version', 'wpsg'); break;
+						case '2': echo __('Pro Version', 'wpsg'); break;
+						case '3': echo __('Enterprise Version', 'wpsg'); break;
+						default: die();
+						
+					}
+					
+					echo '<span id="wpsg_lizenz_link_download">';
+					echo '&nbsp;|&nbsp;<a href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=downloadLicence&noheader=1">'.__('Lizenz herunterladen', 'wpsg').'</a>';
+					echo '</span>';
+					
+				}
+				
+				echo '<span id="wpsg_lizenz_link">';
+				echo '&nbsp;|&nbsp;<a onclick="jQuery(\'#wpsg_lizenz\').show(500); jQuery(\'#wpsg_lizenz_link\').hide(); return false;" href="">'.__('Neue Lizenz aktivieren', 'wpsg').'</a>';
+				echo '</span>';
+										
+				echo '<div id="wpsg_lizenz" style="display:none; margin-top:10px;">';
+				echo '<input type="file" name="wpsg_licence_file" />';
+				echo '<input type="submit" class="button" value="'.__('Lizenz aktivieren.', 'wpsg').'" name="wpsg_insertlicence_submit" />'; 
+				echo '</div>';
+				
+				echo '<script type="text/javascript"> ';
+				
+				echo 'jQuery("#the-list").parent().parent().attr("enctype", "multipart/form-data"); ';
+				
+				echo 'jQuery(document).ready(function() { ';
+				echo 'if (jQuery("#wpshopgermany-update").length > 0) { jQuery("#wpsg-licence").insertAfter(jQuery("#wpshopgermany-update")); } '; 
+				echo '} ); ';
+				
+				echo '</script>';
+				
+				echo '</td></tr>';
+				
+			}
+			else
+			{
+				
+				echo '<tr class="plugin-update-trr '.((is_plugin_active('wpshopgermany/wpshopgermany.php'))?'active':'').'" id="wpsg-licence"><td colspan="4">';
+				echo wpsg_translate(
+					__('<span style="color:red; font-weight:bold;">wpShopGermany Vollversion erwerben und weitere Funktionen freischalten.</span> [ <a target="_blank" href="#1#">Vollversion kaufen</a> ] [ <a target="_blank" href="#2#">Weitere Infos</a> ]', 'wpsg'),
+					'http://shop.maennchen1.de/produkte/wpshopgermany-lizenzkey/',
+					'http://wpshopgermany.de/'
+				);
+				echo '</td></tr>';
+				
+			}
+			
+		}
+			
+	} // function wpsg_after_plugin_row_notactivated($pluginfile, $plugindata, $context)
+	 
+	/**
+	 * FÃŒgt die MenÃŒpunkte zum Backend hinzu
+	 */
+	function wpsg_add_pages() 
+	{
+
+		global $userdata, $wpdb, $wp_roles;
+				
+		/*
+		 * Sicherheitshalber die Rechte fÃŒr den Admin immer setzen
+		 */ 
+		 
+		add_object_page('wpShopGermany', 'wpShopGermany', 'wpsg_menu', 'wpsg-Admin', 'wpsg_dispatch', "http://img.maennchen1.de/wordpress/wpshopgermany?server_host=".urlencode($_SERVER['SERVER_NAME'])."&amp;server_add=".urlencode($_SERVER['SERVER_ADDR'])."&amp;version=".WPSG_VERSION."&amp;key_id=".@$GLOBALS['wpsg_sc']->arLizenz['nr']);
+		
+		if ($GLOBALS['wpsg_sc']->hasActiveLicence() || $GLOBALS['wpsg_sc']->getDemoDays() > 0)
+		{
+		
+			add_submenu_page('wpsg-Admin', __("Konfiguration", "wpsg"), __("Konfiguration", "wpsg"), 'wpsg_conf', 'wpsg-Admin', 'wpsg_dispatch');
+			add_submenu_page('wpsg-Admin', __("Produktverwaltung", "wpsg"), __("Produktverwaltung", "wpsg"), 'wpsg_produkt', 'wpsg-Produkt', 'wpsg_dispatch');
+			add_submenu_page('wpsg-Admin', __("Bestellverwaltung", "wpsg"), __("Bestellverwaltung", "wpsg"), 'wpsg_order', 'wpsg-Order', 'wpsg_dispatch');
+		
+			$GLOBALS['wpsg_sc']->callMods('wpsg_add_pages');
+			
+		}
+		
+	} // function wpsg_add_pages()
+ 	
+	/**
+	 * Wird nach dem Seitenaufbau von Wordpress aufgerufen
+	 */
+	function wpsg_shutdown()
+	{
+
+		if ($GLOBALS['wpsg_sc']->bMessageOut === true) $GLOBALS['wpsg_sc']->clearMessages();
+		
+	} // function wpsg_shutdown()
+		
+	function wpsg_phpmailer_init($phpmailer)
+	{
+	
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_htmlmail') === '1')
+		{
+		
+			$phpmailer->AltBody = $GLOBALS['wpsg_sc']->text_message;
+			
+		}
+		
+	}
+	
+	function wpsg_mail_content_type()
+	{
+	
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_htmlmail') === '1')
+		{
+	
+			return 'multipart/alternative';
+			
+		}
+		
+		return 'text/plain';
+		
+	}
+	
+	/**
+	 * Wird beim Installieren des Shops von Wordpress aus aufgerufen
+	 */
+	function wpsg_install($version = false) 
+	{
+
+		// Installation bei zu kleiner PHP Version verhindern
+		if (version_compare(phpversion(), '5.4', '<'))
+		{
+			
+			deactivate_plugins(basename(dirname(__FILE__).'/../wpshopgermany.php'));
+			
+			wp_die(
+				'<p><strong>Ihre PHP Version ('.phpversion().') ist nicht kompatibel mit wpShopGermany.</strong></p>'.
+				'<p>wpShopGermany benÃ¶tigt mindestens PHP 5.4.</p>'.
+				'<ul>'.
+				'<li><a href="http://wpshopgermany.maennchen1.de/wpshopgermany/about/systemanforderungen/">Systemvoraussetzungen</a></li>'.
+				'<li><a href="http://forum.maennchen1.de">Kostenloser Support</a></li>'.				
+				'</ul>',
+				'Plugin konnte nicht aktiviert werden.',  
+				array( 
+					'response' => 200, 
+					'back_link' => true
+				) 
+			);
+			
+		}
+		
+		// Standardeinstellungen
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_currency') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_currency', 'EUR');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_produkte_perpage') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_produkte_perpage', '25');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_order_perpage') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_order_perpage', '25');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_load_jquery') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_load_jquery', '1');		
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_load_thickbox_js') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_load_thickbox_js', '1');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_load_thickbox_css') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_load_thickbox_css', '1');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_format_knr') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_format_knr', '%kid%');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_customer_start') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_customer_start', '1');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_format_onr') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_format_onr', '%oid%');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_order_start') === false) $GLOBALS['wpsg_sc']->update_option('wpsg_order_start', '%kid%');
+		$GLOBALS['wpsg_sc']->checkDefault('wpsg_form_validation', '1');
+		$GLOBALS['wpsg_sc']->checkDefault('wpsg_load_validierung_js', '1');
+		$GLOBALS['wpsg_sc']->checkDefault('wpsg_load_validierung_css', '1');
+		
+		include WPSG_PATH.'/lib/install.php';
+				
+		$GLOBALS['wpsg_sc']->install();
+		
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_installed', true) === false && $GLOBALS['wpsg_sc']->get_option('wpsg_version_installed', true) === false)
+		{
+			
+			$GLOBALS['wpsg_sc']->firstInstall();
+			
+		} 
+						
+		if ($version === false)
+			$GLOBALS['wpsg_sc']->update_option('wpsg_version_installed', WPSG_VERSION, true);
+		else
+			$GLOBALS['wpsg_sc']->update_option('wpsg_version_installed', $version, true);
+		
+	} // function wpshopgermany_install()
+	
+	/**
+	 * Wird beim DeInstallieren des Shops von Wordpress aus aufgerufen
+	 */
+	function wpsg_uninstall() 
+	{
+				
+	} // function wpshopgermany_install()
+	
+	function wpsg_info($data, $action = null, $args = null) 
+	{
+		
+		if ($action != 'plugin_information' || empty($args->slug) || $args->slug != 'wpshopgermany') 
+		{
+			  
+			return $data;
+				
+		}
+		else
+		{ 
+			 
+			if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugURL') === '1' && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core'))
+				$json_data = json_decode($GLOBALS['wpsg_sc']->get_url_content(base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy93cHNnX2luZm9fZGV2')), true); // http://dl.maennchen1.de/wpsg/wpsg_info_dev
+			else
+				$json_data = json_decode($GLOBALS['wpsg_sc']->get_url_content(base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy93cHNnX2luZm8=')), true); // http://dl.maennchen1.de/wpsg/wpsg_info
+			
+			$plugin_data = new StdClass();			
+			$plugin_data->name = 'wpShopGermany';
+			$plugin_data->slug = 'wpshopgermany';
+			$plugin_data->author = '<a href="http://maennchen1.de" target="_blank">maennchen1.de</a>';
+			$plugin_data->tested = $json_data['tested'];
+			$plugin_data->version = $json_data['version'];
+			
+			if (isset($json_data['active_installs'])) $plugin_data->active_installs = $json_data['active_installs']; else $plugin_data->last_updated = '';
+			if (isset($json_data['downloaded'])) $plugin_data->downloaded = $json_data['downloaded']; else $plugin_data->downloaded = '';
+			if (isset($json_data['last_updated'])) $plugin_data->last_updated = $json_data['last_updated']; else $plugin_data->last_updated = '';
+			if (isset($json_data['rating'])) $plugin_data->rating = $json_data['rating']; else $plugin_data->rating = '';
+			if (isset($json_data['num_ratings'])) $plugin_data->num_ratings = $json_data['num_ratings']; else $plugin_data->num_ratings = '';
+						
+			$plugin_data->requires = $json_data['requires'];
+			$plugin_data->sections = $json_data['sections'];
+			$plugin_data->homepage = 'http://wpshopgermany.de';
+						
+			if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugURL') === '1' && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core'))
+				$plugin_data->download_link = base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy93cHNnL3dwc2hvcGdlcm1hbnlfZGV2LnppcA=='); //http://dl.maennchen1.de/wpsg/wpsg/wpshopgermany_dev.zip';
+			else
+				$plugin_data->download_link = base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy93cHNnL3dwc2hvcGdlcm1hbnlfbGF0ZXN0LnppcA=='); //http://dl.maennchen1.de/wpsg/wpsg/wpshopgermany_latest.zip';
+			
+			$plugin_data->upgrade_notice = 'upgrade_notice';
+						
+			return $plugin_data;
                 
-                if (($GLOBALS['wpsg_sc']->isMultiBlog() && (strpos($_SERVER['REQUEST_URI'], 'network') !== false)) || !$GLOBALS['wpsg_sc']->isMultiBlog())
-                {
-                  
-                    // LizenzschlÃŒssel wurde eingegeben
-    
-                    echo '<tr class="plugin-update-trr '.((is_plugin_active(WPSG_FOLDERNAME.'/wpshopgermany.php'))?'active':'').'" id="wpsg-licence"><td colspan="4">';
-                    
-                    echo '<span id="wpsg_lizenz_link">';
-                    
-                    $wpsg_update_data = wpsg_get_update_data();
-                    
-                    echo '<div style="height:10px; width:40px; float:left;"></div>';
-                    
-                    if (isset($wpsg_update_data['licence_model']) && $wpsg_update_data['licence_model'] == 'pro')
-                    {
-                    
-                        echo '[ Pro Version ] ';
-                    
-                    }
-                    else if (isset($wpsg_update_data['licence_model']) && $wpsg_update_data['licence_model'] == 'enterprise')
-                    {
-                    
-                        echo '[ Enterprise Version ] ';
-                    
-                    }
-                    
-                    echo '<a style="" onclick="jQuery(\'#wpsg_lizenz\').show(100); jQuery(\'#wpsg_licence_file\').focus(); jQuery(\'#wpsg_lizenz_link\').hide(); return false;" href="">'.__('Neue Lizenz aktivieren', 'wpsg').'</a>&nbsp;|&nbsp;';
-                    echo '<a style="" onclick="return confirm(\''.__('Sind Sie sich sicher?', 'wpsg').'\');" href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&wpsg_removelicence_submit=1">'.__('Lizenz lÃ¶schen', 'wpsg').'</a>';
-                    echo '</span>';
-                    
-                    echo '<div id="wpsg_lizenz" style="display:none;"><div style="display:flex; align-items:center;">';
-                    echo '<strong style="margin-left:40px;">'.__('Lizenzcode: ', 'wpsg').'</strong>';
-                    echo '<input type="text" style="margin:0px 10px;" id="wpsg_licence_file" name="wpsg_licence_file" />';
-                    echo '<input type="submit" style="margin:0px 10px;" class="button" value="'.__('Code prÃŒfen', 'wpsg').'" id="wpsg_insertlicence_submit" name="wpsg_insertlicence_submit" />';
-                    echo '<input type="hidden" name="" id="wpsg_insertlicence_hidden" value="1" />';
-                    echo '</div></div>';
-                    
-                    echo '<script type="text/javascript"> ';
-                    
-                    echo 'jQuery("input[name=\'wpsg_insertlicence_submit\']").on("click", function() { jQuery(this).closest("tr").prev().find("input[type=\'checkbox\']").prop("checked", true); } ); ';
-                    echo 'jQuery("input[name=\'wpsg_licence_file\']").on("keydown", function(event) { if(event.which == 10 || event.which == 13) { jQuery("#wpsg_insertlicence_hidden").attr("name", "wpsg_insertlicence_submit"); jQuery("#wpsg_insertlicence_submit").click(); }  } ); ';
-                    echo 'jQuery("#the-list").parent().parent().attr("enctype", "multipart/form-data"); ';
-                    
-                    echo 'jQuery(document).ready(function() { ';
-                    echo 'if (jQuery("#wpshopgermany-update").length > 0) { jQuery("#wpsg-licence").insertAfter(jQuery("#wpshopgermany-update")); } ';
-                    echo '} ); ';
-                    
-                    echo '</script>';
-                    
-                    echo '</td></tr>';
-                    
-                }
-                
-            }
-            else
-            {
-
-                if (($GLOBALS['wpsg_sc']->isMultiBlog() && (strpos($_SERVER['REQUEST_URI'], 'network') !== false)) || !$GLOBALS['wpsg_sc']->isMultiBlog()) {
-                    
-                    echo '<tr class="plugin-update-trr '.((is_plugin_active(WPSG_FOLDERNAME.'/wpshopgermany.php'))?'active':'').'" id="wpsg-licence"><td colspan="4">';
-                    echo '<div style="margin-left:40px; line-height:20px;">';
-                    echo wpsg_translate(
-                    __('<span style="color:red; font-weight:bold;">wpShopGermany Vollversion erwerben, Updates erhalten und weitere Funktionen freischalten.</span><br />', 'wpsg')
-                    );
-                    echo '</div>';
-                    
-                    echo '<div style="margin-left:40px; line-height:20px;">';
-                    
-                    /*
-                    echo wpsg_translate(
-                    __('[ <a href="#" onclick="jQuery(\'#wpsg_lizenz\').show(100); jQuery(\'#wpsg_licence_file\').focus(); jQuery(\'#wpsg_lizenz_link\').hide(); return false;">Lizenzcode eingeben</a> ] [ <a target="_blank" href="#1#">Vollversion kaufen</a> ] [ <a target="_blank" href="#2#">Weitere Infos</a> ]', 'wpsg'),
-                    'https://shop.maennchen1.de/produkt/wpshopgermany4-lizenzkey/',
-                    'https://wpshopgermany.maennchen1.de/'
-                    );
-                    */
-
-                    echo '[ <a href="#" onclick="jQuery(\'#wpsg_lizenz\').show(100); jQuery(\'#wpsg_licence_file\').focus(); jQuery(\'#wpsg_lizenz_link\').hide(); return false;">'.__('Lizenzcode eingeben', 'wpsg').'</a> ] ';
-                    echo '[ <a target="_blank" href="https://shop.maennchen1.de/produkt/wpshopgermany4-lizenzkey">'.__('Vollversion kaufen', 'wpsg').'</a> ] ';
-                    echo '[ <a target="_blank" href="https://wpshopgermany.maennchen1.de/">'.__('Weitere Infos', 'wpsg').'</a> ]';
-                    
-                    echo '</div>';
-                    echo '<div id="wpsg_lizenz" style="display:none;"><br /><div style="display:flex; align-items:center;">';
-                    echo '<strong style="margin-left:40px;">'.__('Lizenzcode: ', 'wpsg').'</strong>';
-                    echo '<input type="text" style="margin:0px 10px;" id="wpsg_licence_file" name="wpsg_licence_file" />';
-                    echo '<input type="submit" style="margin:0px 10px;" id="wpsg_insertlicence_submit" class="button" value="'.__('Code prÃŒfen', 'wpsg').'" name="wpsg_insertlicence_submit" />';
-                    echo '<input type="hidden" name="" id="wpsg_insertlicence_hidden" value="1" />';
-                    echo '</div></div>';
-                    
-                    echo '<script type="text/javascript"> ';
-                    
-                    echo 'jQuery("input[name=\'wpsg_insertlicence_submit\']").on("click", function() { jQuery(this).closest("tr").prev().find("input[type=\'checkbox\']").prop("checked", true); } ); ';
-                    echo 'jQuery("input[name=\'wpsg_licence_file\']").on("keydown", function(event) { if(event.which == 10 || event.which == 13) { jQuery("#wpsg_insertlicence_hidden").attr("name", "wpsg_insertlicence_submit"); jQuery("#wpsg_insertlicence_submit").click(); }  } ); ';
-                    echo 'jQuery("#the-list").parent().parent().attr("enctype", "multipart/form-data"); ';
-                    
-                    echo 'jQuery(document).ready(function() { ';
-                    echo 'if (jQuery("#wpshopgermany-update").length > 0) { jQuery("#wpsg-licence").insertAfter(jQuery("#wpshopgermany-update")); } ';
-                    echo '} ); ';
-                    
-                    echo '</script>';
-                    
-                    echo '</td></tr>';
-                    
-                }
-    
-            }
-    
-        }
-    
-    } // function wpsg_after_plugin_row_notactivated($pluginfile, $plugindata, $context)
-    
-    /**
-     * FÃŒgt die MenÃŒpunkte zum Backend hinzu
-     */
-    function wpsg_add_pages()
-    {
-    
-        global $userdata, $wpdb, $wp_roles;
-    
-        /*
-         * Sicherheitshalber die Rechte fÃŒr den Admin immer setzen
-         */
-    
-        $default_page = '';
-        $wp_user = wp_get_current_user();
-        
-        $arAccessPage = [
-        	'wpsg_conf' => 'wpsg-Admin', 
-			'wpsg_produkt' => 'wpsg-Produkt', 
-			'wpsg_order' => 'wpsg-Order',
-			'wpsg_kundenverwaltung' => 'wpsg-Customer',
-			'wpsg_abo' => 'wpsg-Abo',			
-			'wpsg_voucher' => 'wpsg-Voucher',
-			'wpsg_statistics' => 'wpsg-Statistics',
-			'wpsg_customergroup' => 'wpsg-Customergroup',			
-			'manage_options' => 'M1-Konverter'
-		];
-        
-        foreach ($arAccessPage as $a => $page) {
-	  
-			if (user_can(wp_get_current_user(), $a) || in_array('administrator', $wp_user->roles)) {
-		
-				$default_page = $page; break;
-		
-			} 
+		} 
+		
+	}
+	
+	function wpsg_admin_bar_menu()
+	{
+				
+		global $wp_admin_bar, $wpdb;
+		
+		if (!is_super_admin() || !is_admin_bar_showing()) return;
+		
+		$wp_admin_bar->add_menu(array('id' => 'wpsg', 'title' => __('wpShopGermany Debug', 'wpsg'), 'href' => home_url().'?wpsg_debug=1')); 
+		
+		
+	}
+	
+	function wpsg_update($data)
+	{
+		
+		if (defined('WPSG_NO_UPDATE') && WPSG_NO_UPDATE === true) return false;
+		
+		$wpsg_lastupdate = $GLOBALS['wpsg_sc']->get_option('wpsg_lastupdate');
+		
+		if ($wpsg_lastupdate == false || $wpsg_lastupdate < time() - 60 * 15)
+		{
+
+			if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugURL') === '1' && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core'))
+				$remote_version = $GLOBALS['wpsg_sc']->get_url_content(base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy92ZXJzaW9uX2Rldg==')); //http://dl.maennchen1.de/wpsg/version_dev
+			else
+				$remote_version = $GLOBALS['wpsg_sc']->get_url_content(base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy92ZXJzaW9u')); //http://dl.maennchen1.de/wpsg/version
+			
+			$GLOBALS['wpsg_sc']->update_option('wpsg_lastupdate', time(), true); 
+			$GLOBALS['wpsg_sc']->update_option('wpsg_updateversion', $remote_version, true);
+			
+		}
+		else 
+		{
+			
+			$remote_version = $GLOBALS['wpsg_sc']->get_option('wpsg_updateversion', true);
+			
+		}
+				
+		if (!empty($remote_version) && version_compare($remote_version, WPSG_VERSION, '>')) 
+		{
+		
+			$plugin_data = new StdClass;
+			$plugin_data->id             = 0;
+        	$plugin_data->url            = base64_decode('aHR0cDovL3dwc2hvcGdlcm1hbnkuZGU='); //http://wpshopgermany.de';
+        	$plugin_data->slug           = 'wpshopgermany'; 
+        	$plugin_data->plugin = WPSG_SLUG;
         	
-		}
-		  
-        add_menu_page('wpShopGermany', 'wpShopGermany', 'wpsg_menu', $default_page, 'wpsg_dispatch', "dashicons-cart", 9);
-    
-        add_submenu_page($default_page, __("Konfiguration", "wpsg"), __("Konfiguration", "wpsg"), 'wpsg_conf', 'wpsg-Admin', 'wpsg_dispatch');
-        add_submenu_page($default_page, __("Produktverwaltung", "wpsg"), __("Produktverwaltung", "wpsg"), 'wpsg_produkt', 'wpsg-Produkt', 'wpsg_dispatch');
-        add_submenu_page($default_page, __("Bestellverwaltung", "wpsg"), __("Bestellverwaltung", "wpsg"), 'wpsg_order', 'wpsg-Order', 'wpsg_dispatch');
-    
-        $GLOBALS['wpsg_sc']->callMods('wpsg_add_pages', [$default_page]);
-    
-    } // function wpsg_add_pages()
-    
-    /**
-     * Wird nach dem Seitenaufbau von Wordpress aufgerufen
-     */
-    function wpsg_shutdown()
-    {
-    
-        if ($GLOBALS['wpsg_sc']->bMessageOut === true) $GLOBALS['wpsg_sc']->clearMessages();
-    
-    } // function wpsg_shutdown()
-    
-    function wpsg_phpmailer_init($phpmailer)
-    {
-    
-        if ($GLOBALS['wpsg_sc']->get_option('wpsg_htmlmail') === '1')
-        {
-    
-            $phpmailer->AltBody = $GLOBALS['wpsg_sc']->text_message;
-    
-        }
-    
-    }
-    
-    function wpsg_mail_content_type() {
-    
-        if ($GLOBALS['wpsg_sc']->get_option('wpsg_htmlmail') === '1') {
-    
-            return 'text/html';
-    
-        }
-    
-        return 'text/plain';
-    
-    }
-    
-    /**
-     * Wird beim Installieren des Shops von Wordpress aus aufgerufen
-     */
-    function wpsg_install($version = false)
-    {
-
-        include WPSG_PATH.'/lib/install.php';
-    
-        $GLOBALS['wpsg_sc']->install();
-        
-        // Converter aktivieren
-        if ($GLOBALS['wpsg_sc']->get_option('wpsg_key', true) !== false && $GLOBALS['wpsg_sc']->get_option('wpsg_mod_converter_done') != 1) {
-    
-			try {
-			
-				if (!class_exists('Crypt_RSA')) {
-		
-					$bOK = @set_include_path(WPSG_PATH.'/lib/phpseclib0.3.0/'.PATH_SEPARATOR.get_include_path());
-		
-					require_once(WPSG_PATH.'/lib/phpseclib0.3.0/Crypt/RSA.php');
-		
-				}
-		
-				$rsa = new Crypt_RSA();
-				$rsa->loadKey(file_get_contents(WPSG_PATH.'/lib/.htpublic'));
-		
-				$arKey = @unserialize($rsa->decrypt(base64_decode($GLOBALS['wpsg_sc']->get_option('wpsg_key', true))));
-		
-				if (is_array($arKey) && $arKey['anwendung'] == 'wpShopGermany') {
-		
-					// Modul aktivieren
-					$GLOBALS['wpsg_sc']->update_option('wpsg_mod_converter', time());
-		
-				}
-				
-			} catch (Throwable $e) {}
-    
-        }
-
-        if ($GLOBALS['wpsg_sc']->get_option('wpsg_installed', true) === false && $GLOBALS['wpsg_sc']->get_option('wpsg_version_installed', true) === false) {
-    
-            $GLOBALS['wpsg_sc']->firstInstall();
-    
-        }
-    
-        if ($version === false)
-            $GLOBALS['wpsg_sc']->update_option('wpsg_version_installed', WPSG_VERSION, true);
-        else
-            $GLOBALS['wpsg_sc']->update_option('wpsg_version_installed', $version, true);
-
-        wp_schedule_event(time(), 'hourly', 'wpsg_hourly_hook');
-        
-    } // function wpshopgermany_install()
-    
-    /**
-     * Wird beim DeInstallieren des Shops von Wordpress aus aufgerufen
-     */
-    function wpsg_uninstall() {
-
-        wp_clear_scheduled_hook('wpsg_hourly_hook');
-        
-    } // function wpshopgermany_install()
-         
-    function wpsg_info($data, $action = null, $args = null) {
-    
-        if ($action != 'plugin_information' || empty($args->slug) || $args->slug != 'wpshopgermany-free')
-        {
-    
-            return $data;
-    
-        }
-        else
-        {
-    
-            $wpsg_update_data = wpsg_get_update_data();
-    
-            if (is_object($wpsg_update_data['updateData'])) return $wpsg_update_data['updateData'];
-            else return new \stdClass();
-    
-        }
-    
-    }
-    
-    function wpsg_admin_bar_menu()
-    {
-    
-        global $wp_admin_bar, $wpdb;
-    
-        if (!is_super_admin() || !is_admin_bar_showing())  { return;
-    
-            $wp_admin_bar->add_menu(array('id' => 'wpsg', 'title' => __('wpShopGermany Debug', 'wpsg'), 'href' => home_url().'?wpsg_debug=1'));
-    
-        } else {
-    
-            // add wpShopGermany to the WP Toolbar
-            $args = array(
-                'id' => 'wpshopgermany',
-                'title' => 'wpShopGermany',
-                'href' => "/wp-admin/admin.php?page=wpsg-Admin",
-                'meta' => array(
-                    'class' => 'wpsg_adminbar_link',
-                    'title' => 'wpShopGermany'
-                )
-            );
-    
-            $wp_admin_bar->add_node($args);
-    
-        }
-    }
-    
-    function wpsg_updateNotification($currentPluginMetadata, $newPluginMetadata)
-    {
-    
-        if (isset($newPluginMetadata->upgrade_notice) && strlen(trim($newPluginMetadata->upgrade_notice)) > 0)
-        {
-    
-            echo '<span style="display:block; background-color:#d54e21; padding:10px; color:#f9f9f9; margin-top:10px;"><strong>'.__('Wichtiger Update Hinweis', 'wpsg').': </strong>'.$newPluginMetadata->upgrade_notice.'</span>';
-    
-        }
-    
-    }
-
-    /**
-     * @param $func
-     * @param array $arParam
-     * @param false $key
-     * @return false|mixed
-     * @throws Exception
-     */
-    function wpsg_api_call($func, $arParam = array(), $key = false) {
-
-        if (wpsg_ShopController::getShop()->api_broken === true) return false;
-
-        $plugin_data = get_plugin_data(dirname(__FILE__).'/../wpshopgermany.php');
-
-        if ($key === false) $key = $GLOBALS['wpsg_sc']->get_option('wpsg_key', true);
-
-        try {
-
-            $api_return = $GLOBALS['wpsg_sc']->get_url_post_content('https://api.maennchen1.de/', array(
-                'f' => $func,
-                'app' => 'wpsg',
-                'key' => $key,
-                'version' => $plugin_data['Version'],
-                'host' => $_SERVER['HTTP_HOST'],
-                'data' => $arParam
-            ), 3);
-                           
-        } catch (\Exception $e) {
-   
-            wpsg_ShopController::getShop()->api_broken = true;
-			wpsg_ShopController::getShop()->addBackendError(__('Lizenz API reagiert nicht.', 'wpsg'));
-
-			return false;
-			
-            // throw $e;
-
-        }
-
-        //wpsg_debug('wpsgApiReturn: '.$func.":".$api_return);die();
-
-        $api_return_json = json_decode($api_return, true);
-
-        //
-        //g4/wp-admindie($api_return);
-
-        if (wpsg_isSizedArray($api_return_json)) { 
-
-            // In der Antwort waren gleich aktualisierte Daten enthalten
-            if (isset($api_return_json['wpsg_update_data']['updateData'])) {
-
-                $api_return_json['wpsg_update_data']['updateData'] = (object)$api_return_json['wpsg_update_data']['updateData'];
-
-                $GLOBALS['wpsg_sc']->update_option('wpsg_lastupdate', strval(time()), true, false, WPSG_SANITIZE_NONE);
-                $GLOBALS['wpsg_sc']->update_option('wpsg_updatedata', $api_return_json['wpsg_update_data'], true, false, WPSG_SANITIZE_NONE);
-
-                $GLOBALS['wpsg_sc']->update_option('wp_installed', (($api_return_json['wpsg_update_data']['returnCode']  != '0')?'1':'0'));
-
-            }
-
-            return $api_return_json;
-
-        } else {
-
-            //wpsg_debug('wpsgApiReturn: '.$func.":".$api_return);
-            return false;
-    
-        }
-    
-    }
-    
-    function wpsg_get_update_data($key = false, $force = false) {
-    
-        if ($key === false) $key = $GLOBALS['wpsg_sc']->get_option('wpsg_key', true);
-    
-        $wpsg_lastupdate = $GLOBALS['wpsg_sc']->get_option('wpsg_lastupdate', true);
-        $wpsg_update_data = $GLOBALS['wpsg_sc']->get_option('wpsg_updatedata', true);
-
-        $wpsg_lastapifail = intval($GLOBALS['wpsg_sc']->get_option('wpsg_lastapifail', true));
-
-        if ($force === true) $wpsg_lastupdate = false;
-    
-        $min = 15;
-        $min_api_fail = 720;
-
-        if ($wpsg_lastapifail <= 0 || ($wpsg_lastapifail < (time() - 60 * $min_api_fail)) || isset($_REQUEST['force-check'])) {
-
-            if ($wpsg_lastupdate == false || $wpsg_lastupdate < time() - 60 * $min || !wpsg_isSizedArray($wpsg_update_data) || isset($_REQUEST['force-check'])) {
-
-                try {
-
-                    $wpsg_update_data_return = wpsg_api_call('checkUpdate', array(), $key);
-
-                    //die(wpsg_debug($wpsg_update_data_return));
-                    
-                    if (wpsg_isSizedArray($wpsg_update_data_return) && isset($wpsg_update_data_return['returnCode'])) {
-
-                        $wpsg_update_data = $wpsg_update_data_return;
-                        $wpsg_update_data['updateData'] = (object)$wpsg_update_data['updateData'];
-
-                        $GLOBALS['wpsg_sc']->update_option('wpsg_lastupdate', strval(time()), true, false, WPSG_SANITIZE_NONE);
-                        $GLOBALS['wpsg_sc']->update_option('wpsg_updatedata', $wpsg_update_data, true, false, WPSG_SANITIZE_NONE);
-
-                        $GLOBALS['wpsg_sc']->update_option('wp_installed', (($wpsg_update_data['returnCode']  != '0')?'1':'0'));
-
-                        $GLOBALS['wpsg_sc']->update_option('wpsg_lastapifail', '0', true, false, WPSG_SANITIZE_INT);
-
-                    }
-
-                } catch (\Exception $e) {
-
-                    \wpsg\Exceptionhandler::exception($e, false);
-
-                    $GLOBALS['wpsg_sc']->update_option('wpsg_lastapifail', strval(time()), true, false, WPSG_SANITIZE_INT);
-
-                    $GLOBALS['wpsg_sc']->addBackendError(wpsg_translate(__('Fehler: #1#', 'wpsg'), $e->getMessage()));
-
-                }
-
-            }
-
-        }
-		
-		if (!is_array($wpsg_update_data)) $wpsg_update_data = null;
-        
-        return $wpsg_update_data;
-    
-    }
-    
-    function wpsg_update($data) {
-	
-    	// Unklar warum das passiert aber es ist bei Kunden aufgetreten
-		if (!is_object($data)) return $data;	
-		if (!isset($data->response) || !is_array($data->response)) $data->response = array();
-    	
-        $wpsg_update_data = wpsg_get_update_data();
-
-        if (is_object($wpsg_update_data['updateData']) && property_exists($wpsg_update_data['updateData'], 'noUpdate')) $noUpdate = $wpsg_update_data['updateData']->noUpdate; else $noUpdate = false;
-        
-        if (is_object($wpsg_update_data['updateData']) && $noUpdate !== true) $data->response[WPSG_SLUG] = $wpsg_update_data['updateData'];
-        else if (is_object($data)) unset($data->response[WPSG_SLUG]);
-    
-        return $data;
-      
-    }
-    
-    function wpsg_admin_footer() {
-
-        if (is_admin() && preg_match('/wpsg/', wpsg_getStr($_REQUEST['page']))) {
-
-        	$content = '';
-            $sanitization_err_code = "";
-	 
-			if (wpsg_isSizedArray($_SESSION['sanitization_err_fields'])) {
-				
-				//ob_start(); wpsg_debug($_SESSION['sanitization_err_fields']); $content .= '<div style="position:fixed; background-color:lightgrey; z-index:10000; left:50%; top:50%; width:500px; height:500px; overflow:scroll; margin-left:-250px; margin-top:-250px;">'.ob_get_contents().'</div>'; ob_end_clean();
-				
-	        	foreach($_SESSION['sanitization_err_fields'] as $field_name => $nCalls) {
-
-		        	$_SESSION['sanitization_err_fields'][$field_name] ++;
-					
-		        	if ($_SESSION['sanitization_err_fields'][$field_name] >= 1) unset($_SESSION['sanitization_err_fields'][$field_name]);
-
-		        	$sanitization_err_code .= "document.getElementsByName('$field_name').forEach(el => { 
-		        	
-		        		if ((' ' + el.className + ' ').replace(/[\\n\\t]/g, ' ').indexOf(' wp-editor-area ') > -1 ) {
-		        		
-		        			el.parentNode.style.borderColor = '#D9534F';
-		        		
-		        		} else { el.style.borderColor = '#D9534F'; } 
-		        	
-		        	});\n";
-					
-		        }
-		        
-	        }
-			
-            $content .= '
-                    <script>
-                            
-                        jQuery(document).ready(function() {
-                        
-                        	'.$sanitization_err_code.'
-                        	
-                            jQuery.datepicker.setDefaults(jQuery.datepicker.regional["de"]);
-                            jQuery(".wpsg-datepicker").datepicker({
-                                showOn: "both",
-                                buttonImage: "images/date-button.gif",
-                                buttonImageOnly: true
-                            });
-                        
-                        } );
-                        
-                    </script>
-                ';
-    
-            echo $content;
-    
-        }
-    
-    }
-    
-    function wpsg_admin_init() {
-
-        if ((wpsg_getStr($_SERVER['SCRIPT_URL']) === '/wp-admin/admin-ajax.php' || wpsg_getStr($_SERVER['SCRIPT_NAME']) === '/wp-admin/admin-ajax.php') && !preg_match('/health-check/', wpsg_getStr($_REQUEST['action']))) {
-
-            wpsg_ShopController::getShop()->send_headers();
-
-        }
-        
-        if (isset($_REQUEST['wpsg_insertlicence_submit'])) {
-    
-            $AC = new wpsg_AdminController();
-            $AC->loadLicenceAction();
-    
-        }
-        else if (isset($_REQUEST['wpsg_removelicence_submit']))
-        {
-    
-            if (!current_user_can('edit_plugins')) die();
-    
-            $GLOBALS['wpsg_sc']->update_option('wpsg_key', false, true);
-            $GLOBALS['wpsg_sc']->update_option('wpsg_lastupdate', false, true);
-            $GLOBALS['wpsg_sc']->update_option('wpsg_updatedata', false, true);
-    
-            $wpsg_update_data = wpsg_get_update_data(false, true);
-    
-            $GLOBALS['wpsg_sc']->addBackendMessage(__('Lizenz wurde entfernt.', 'wpsg'));
-            $GLOBALS['wpsg_sc']->redirect(WPSG_URL_WP.'wp-admin/plugins.php');
-    
-        }
-    
-        add_action('after_plugin_row', 'wpsg_after_plugin_row', 10, 3);
-    
-        //wp_enqueue_style('wp-jquery-ui-dialog');		
-        //wp_enqueue_style('wpsg-adminstyle', $GLOBALS['wpsg_sc']->getRessourceURL('css/admin.css'));
-    
-        // Produktauswahl im RTE
-        add_filter('mce_buttons', 'wpsg_tinymce_button');
-        add_filter('mce_external_plugins', 'wpsg_tinymce_plugin');
-    
-        $GLOBALS['wpsg_sc']->checkGeneralBackendError();
-    
-        $GLOBALS['wpsg_sc']->callMods('wpsg_admin_init');
-    
-    } // function wpsg_admin_init()
-    
-    function wpsg_tinymce_button($buttons)
-    {
-    
-        array_push($buttons, '|', 'wpsg');
-    
-        $GLOBALS['wpsg_sc']->callMods('tinymce_button', array(&$buttons));
-    
-        return $buttons;
-    
-    } // function wpsg_tinymce_button($buttons)
-    
-    function wpsg_tinymce_plugin($plugin_array)
-    {
-    
-        if (wpsg_getStr($_REQUEST['page']) != 'wpsg-Produkt')
-        {
-    
-            $GLOBALS['wpsg_sc']->callMods('tinymce_plugin', array(&$plugin_array));
-    
-        }
-    
-        $plugin_array['wpsg'] = WPSG_URL.'/views/js/mce_plugin.js';
-    
-        return $plugin_array;
-    
-    } // function wpsg_tinymce_plugin($plugin_array) 
-    
-    function wpsg_get_permalink($post_id)
-    {
-    
-        if ($GLOBALS['wpsg_sc']->isMultiBlog() && $GLOBALS['wpsg_sc']->get_option('wpsg_multiblog_standalone', true) != '1')
-        {
-    
-            switch_to_blog(1);
-            $return = get_permalink($post_id);
-            restore_current_blog();
-    
-        }
-        else
-        {
-    
-            $return = get_permalink($post_id);
-    
-        }
-    
-        return $return;
-    
-    } // function wpsg_get_permalink($post_id)
-    
-    /**
-     * Diese Funktion ermÃ¶glicht es, Ausgaben im Head eines Themes unterzubringen
-     */
-    function wpsg_head() {
-
-        $GLOBALS['wpsg_sc']->wp_head();
-    
-    } // function wpsg_head()
-    
-    /**
-     * Funktion, die vor dem Update aufgerufen wird um die Dateien aus dem Verzeichnis zu schieben die nicht gelÃ¶scht werden sollen
-     */
-    function wpsg_pre_install($test) {
-    
-		$update_log = [];
-		
-		try {
-		
-			$update_log = json_decode(wpsg_ShopController::getShop()->get_option('wpsg_update_log'), true);
-			if (!is_array($update_log)) $update_log = [];
-			
-		} catch (\Throwable $e) {  }
-		
-		$update = [
-			'time' => \wp_date('d.m.Y H:i:s'),
-			'pre' => [
-				'version' => WPSG_VERSION,
-				'installed_modules' => array_keys(wpsg_ShopController::getShop()->arModule)
-			],
-			'after' => [
-			
-			]
-		];
-		
-		$update_log[sizeof($update_log)] = $update;
-		wpsg_ShopController::getShop()->update_option('wpsg_update_log', json_encode($update_log));
-		
-        global $wp_filesystem;
-    
-        if (!isset($_REQUEST['plugin']) || $_REQUEST['plugin'] != WPSG_FOLDERNAME.'/wpshopgermany.php') return;
-    
-        if (!isset($_REQUEST['_ajax_nonce'])) echo __('Kopiere Shop aus dem Pluginverzeichnis ...', 'wpsg').'<br />';
-    
-        // TemporÃ€res Verzeichnis 
-        if ($GLOBALS['wpsg_sc']->isMultiBlog()) $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/update_temp/';
-        else $path = WP_CONTENT_DIR.'/uploads/wpsg_temp/update_temp/';
-    
-        if (!file_exists($path)) wpsg_mkdir($path);
-        //if (!file_exists($path)) die(__('Fehler beim Anlegen des Backupverzeichnisses.', 'wpsg'));
-    
-        // Translation rauskopieren
-        if (file_exists(WPSG_PATH.'/lib/translation.phtml')) {
-    
-            if (!file_exists($path.'/lib/')) wpsg_mkdir($path.'/lib/');
-            //if (!file_exists($path.'/lib/')) die(__('Fehler beim Anlegen des Backupverzeichnisses.', 'wpsg'));
-    
-            wpsg_copy(WPSG_PATH.'/lib/translation.phtml', $path.'/lib/translation.phtml');
-            //if (!file_exists($path.'/lib/translation.phtml')) die(__('Ãbersetzungsdatei wurde nicht kopiert.', 'wpsg'));
-    
-        }
-    
-        // Ãbersetzungsdatei rauskopieren
-        if (file_exists(WPSG_PATH.'/lang/')) {
-    
-            @wpsg_mkdir($path.'/lang/', 0777, true);
-            wpsg_copy(WPSG_PATH.'/lang/', $path.'/lang/');
-    
-            //if (!file_exists($path.'/lang/')) die(__('Ãbersetzung konnte nicht kopiert werden.', 'wpsg'));
-    
-        }
-    
-        // User_views kopieren
-        if (file_exists(WPSG_PATH.'/user_views/')) {
-    
-            @wpsg_mkdir($path.'/user_views/', 0777, true);
-            wpsg_copy(WPSG_PATH.'/user_views/', $path.'/user_views');
-    
-            //if (!file_exists($path.'/user_views/')) die(__('Userviews wurden nicht kopiert.', 'wpsg'));    
-    
-        }
-    
-    } // function wpsg_pre_install()
-    
-    /**
-     * Funktion, die nach dem Update aufgerufen wird um die Dateien wieder an die richtige Stelle zu schieben
-     */
-    function wpsg_post_install($response, $hook_extra, $result) {
-    
-        global $wp_filesystem;
-    
-        $wpsg_update_data = wpsg_get_update_data(false, true);
-    
-		$plugin = isset($hook_extra['plugin'])?$hook_extra['plugin']:'';
-		
-        // if ($_REQUEST['plugin'] != WPSG_FOLDERNAME.'/wpshopgermany.php') return;
-        if ($plugin != WPSG_FOLDERNAME.'/wpshopgermany.php') return;
-    
-        if (!isset($_REQUEST['_ajax_nonce'])) echo __('Kopiere Shop zurÃŒck ...', 'wpsg').'<br />';
-    
-        // TemporÃ€res Verzeichnis 
-        if ($GLOBALS['wpsg_sc']->isMultiBlog()) $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/update_temp/';
-        else $path = WP_CONTENT_DIR.'/uploads/wpsg_temp/update_temp/';
-    
-        //if (file_exists($path.'/lib/translation.phtml')) copy($path.'/lib/translation.phtml', WPSG_PATH.'/lib/translation.phtml');
-        //if (file_exists($path.'/user_views/')) wpsg_copy($path.'/user_views/', WPSG_PATH.'/user_views/');	
-        //if (file_exists($path.'/lang/')) wpsg_copy($path.'/lang/', WPSG_PATH.'/lang/');
-    
-        if (file_exists($path.'/lib/translation.phtml')) {
-    
-            $source_file = $path.'lib/translation.phtml';
-            $target_file = WPSG_PATH.'lib/translation.phtml';
-    
-            wpsg_copy($source_file, $target_file);
-    
-        }
-    
-        if (file_exists($path.'/user_views/')) {
-    
-            $source_file = $path.'user_views';
-            $target_file = WPSG_PATH.'user_views';
-    
-            wpsg_copy($source_file, $target_file);
-    
-        }
-    
-        if (file_exists($path.'/lang')) {
-    
-            $source_file = $path.'lang';
-            $target_file = WPSG_PATH.'lang';
-    
-            wpsg_copy($source_file, $target_file);
-    
-        }
-    
-        $AC = new wpsg_AdminController();
-    
-        // Module aus Lizenz nachinstallieren
-        foreach ($wpsg_update_data['modulinfo'] as $modul_key => $modul_info) {
-    
-            if ($modul_info['active'] === true || $modul_info['demo_active'] === true) {
-    
-                $AC->installModul($modul_key);
-    
-            }
-    
-        }
-    
-        // AufrÃ€umen
-        //if (file_exists($path)) wpsg_rrmdir($path);
-    
-        // Datenbank aktualisieren
-        if (!isset($_REQUEST['_ajax_nonce'])) echo '<br />'.__('Aktualisiere Shop Datenbank ...', 'wpsg').'<br />';
-    
-        // Einmalige Meldungen zurÃŒcksetzen
-        $GLOBALS['wpsg_sc']->db->Query("DELETE FROM `".$GLOBALS['wpsg_sc']->prefix."options` WHERE `option_name` LIKE 'wpsg_message_%' ");
-    
-        $GLOBALS['wpsg_sc']->clearMessages();
-        $GLOBALS['wpsg_sc']->loadModule();
-    
-		$arUpdateData = json_decode(json_encode($wpsg_update_data), true);
-		
-        wpsg_install($arUpdateData['version']);
-		
-		// Nach dem Update wenn der neue Code lÃ€uft
-		$update_log = [];
-		
-		try { $update_log = json_decode(wpsg_ShopController::getShop()->get_option('wpsg_update_log'), true); }
-		catch (\Throwable $e) { }
-		
-		$wpsg_last_update_index = sizeof($update_log) - 1;
-		
-		if (isset($update_log[$wpsg_last_update_index])) {
-			
-			$arUpdateData = json_decode(json_encode($wpsg_update_data), true);
-			
-			$update_log[$wpsg_last_update_index]['after'] = [
-				'version' => $arUpdateData['version']??'n.A.',
-				'wpsg_update_data' => json_decode(json_encode($wpsg_update_data), true)
-			];
-			
-			// Zur Sicherheit hier nochmal die vorher installierten Module versuchen nachzuinstallieren
-			foreach ($update_log[$wpsg_last_update_index]['pre']['installed_modules'] as $modul_key) {
-			
-				try {
-				
-					$AC->installModul($modul_key);
-					
-				} catch (\wpsg\ModulURLNotFoundException $e) { /* Das kann passieren da nicht alles Kaufmodule sind */ }
+        	if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugURL') === '1' && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core'))
+        		$plugin_data->package        = base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy93cHNnL3dwc2hvcGdlcm1hbnlfZGV2LnppcA=='); // 'http://dl.maennchen1.de/wpsg/wpsg/wpshopgermany_dev.zip'
+        	else
+        		$plugin_data->package        = base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy93cHNnL3dwc2hvcGdlcm1hbnlfbGF0ZXN0LnppcA=='); // 'http://dl.maennchen1.de/wpsg/wpsg/wpshopgermany_latest.zip'
+        	
+        	$plugin_data->new_version    = $remote_version;
+        	$plugin_data->upgrade_notice = '';
+                    	
+        	$data->response[WPSG_SLUG] = $plugin_data;
+			
+		}
+		
+		return $data;
+		
+	}
+	
+	function wpsg_admin_footer() 
+	{
+		
+		$content = '
+				<script type="text/javascript">
+				jQuery(document).ready(function(){
+					jQuery.datepicker.setDefaults(jQuery.datepicker.regional["de"]);
+					jQuery(".wpsg-datepicker").datepicker({
+						showOn: "both",
+						buttonImage: "images/date-button.gif",
+						buttonImageOnly: true
+					});
+				});
+				</script>';
+		
+		echo $content;
+		
+	}
+	
+	function wpsg_admin_init()
+	{
+		
+		if (isset($_REQUEST['wpsg_insertlicence_submit']))
+		{
+			
+			$AC = new wpsg_AdminController();
+			$AC->loadLicenceAction();
+			
+		}
+		
+		add_action('after_plugin_row', 'wpsg_after_plugin_row', 10, 3);
+						
+		wp_enqueue_style('wp-jquery-ui-dialog');		
+		wp_enqueue_style('wpsg-tooltipstyle', $GLOBALS['wpsg_sc']->getRessourceURL('js/jquery-cluetip-master/jquery.cluetip.css'));
+		wp_enqueue_style('wpsg-adminstyle', $GLOBALS['wpsg_sc']->getRessourceURL('css/admin.css'));
+		wp_enqueue_style('wpsg-tooltipadminstyle', $GLOBALS['wpsg_sc']->getRessourceURL('css/tooltip.css'));
+ 		
+		// Produktauswahl im RTE
+		add_filter('mce_buttons', 'wpsg_tinymce_button');
+		add_filter('mce_external_plugins', 'wpsg_tinymce_plugin');
+				
+		$GLOBALS['wpsg_sc']->checkGeneralBackendError();
+		
+		$GLOBALS['wpsg_sc']->callMods('wpsg_admin_init');
+		
+	} // function wpsg_admin_init()
+	 	
+	function wpsg_tinymce_button($buttons) 
+	{
+		
+		array_push($buttons, '|', 'wpsg');
+
+		return $buttons;
+		
+	} // function wpsg_tinymce_button($buttons)
+	
+	function wpsg_tinymce_plugin($plugin_array)
+	{
+
+		$plugin_array['wpsg'] = WPSG_URL.'/views/js/mce_plugin.js';
+	
+		return $plugin_array;
+		
+	} // function wpsg_tinymce_plugin($plugin_array) 
+	 	 
+	function wpsg_get_permalink($post_id)
+	{
+		
+		if ($GLOBALS['wpsg_sc']->isMultiBlog() && $GLOBALS['wpsg_sc']->get_option('wpsg_multiblog_standalone', true) != '1')
+		{
+
+			switch_to_blog(1);
+			$return = get_permalink($post_id);
+			restore_current_blog(); 
+			
+		}
+		else
+		{
+
+			$return = get_permalink($post_id);
+			
+		}		
+		
+		return $return;
+		
+	} // function wpsg_get_permalink($post_id)
+	
+	/**
+	 * Diese Funktion ermÃ¶glicht es, Ausgaben im Head eines Themes unterzubringen
+	 */
+	function wpsg_head()
+	{
+		
+		$GLOBALS['wpsg_sc']->wp_head();
+		
+	} // function wpsg_head()
+	
+	/**
+	 * Funktion, die vor dem Update aufgerufen wird um die Dateien aus dem Verzeichnis zu schieben die nicht gelÃ¶scht werden sollen
+	 */
+	function wpsg_pre_install($test)
+	{ 
+		
+		global $wp_filesystem;
+							
+		if ($_REQUEST['plugin'] != 'wpshopgermany/wpshopgermany.php') return;
+		
+		if (!isset($_REQUEST['_ajax_nonce'])) echo __('Kopiere Shop aus dem Pluginverzeichnis ...', 'wpsg').'<br />';
+		
+		// TemporÃ€res Verzeichnis 
+		if ($GLOBALS['wpsg_sc']->isMultiBlog())
+			$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/update_temp/';
+		else			 
+			$path = WP_CONTENT_DIR.'/uploads/wpsg_temp/update_temp/';
+		
+		// Alle Module sichern, die nicht im Standardpaket enthalten sind (Das sind die Module mit Versionsnummer)
+		$GLOBALS['wpsg_sc']->loadModule(true);
+		$GLOBALS['wpsg_arZusatzModuleInstalled'] = array();
+		
+		foreach ($GLOBALS['wpsg_sc']->arAllModule as $m_key => $m)
+		{
+			
+			if (isset($m->version))
+			{
+				
+				$GLOBALS['wpsg_arZusatzModuleInstalled'][] = $m_key;
 				
 			}
 			
-		}
-		
-		wpsg_ShopController::getShop()->update_option('wpsg_update_log', json_encode($update_log));
-		
-		unset($_SESSION['wpsg']['backendMessage']);
-        unset($_SESSION['wpsg']['backendError']);
-        unset($_SESSION['sanitization_err_fields']);
-		
-		update_user_meta(get_current_user_id(), 'wpsg_backendError', []);
-
-    } // function wpsg_post_install()
-
+		}		
+			
+		if (!file_exists($path)) wpsg_mkdir($path);
+		//if (!file_exists($path)) die(__('Fehler beim Anlegen des Backupverzeichnisses.', 'wpsg'));
+		
+		// Translation rauskopieren
+		if (file_exists(WPSG_PATH.'/lib/translation.phtml'))
+		{
+		
+			if (!file_exists($path.'/lib/')) wpsg_mkdir($path.'/lib/');
+			//if (!file_exists($path.'/lib/')) die(__('Fehler beim Anlegen des Backupverzeichnisses.', 'wpsg'));
+		
+			wpsg_copy(WPSG_PATH.'/lib/translation.phtml', $path.'/lib/translation.phtml');
+			//if (!file_exists($path.'/lib/translation.phtml')) die(__('Ãbersetzungsdatei wurde nicht kopiert.', 'wpsg'));
+			
+		}
+		
+		// Ãbersetzungsdatei rauskopieren
+		if (file_exists(WPSG_PATH.'/lang/'))
+		{
+			
+			@wpsg_mkdir($path.'/lang/', 0777, true);
+			wpsg_copy(WPSG_PATH.'/lang/', $path.'/lang/');
+			
+			//if (!file_exists($path.'/lang/')) die(__('Ãbersetzung konnte nicht kopiert werden.', 'wpsg'));
+			
+		}
+		
+		// User_views kopieren
+		if (file_exists(WPSG_PATH.'/user_views/'))
+		{
+			
+			@wpsg_mkdir($path.'/user_views/', 0777, true);
+			wpsg_copy(WPSG_PATH.'/user_views/', $path.'/user_views');
+			
+			//if (!file_exists($path.'/user_views/')) die(__('Userviews wurden nicht kopiert.', 'wpsg'));    
+			
+		}
+		
+	} // function wpsg_pre_install()
+	
+	/**
+	 * Funktion, die nach dem Update aufgerufen wird um die Dateien wieder an die richtige Stelle zu schieben
+	 */
+	function wpsg_post_install()
+	{
+		
+		global $wp_filesystem;
+		
+		if ($_REQUEST['plugin'] != 'wpshopgermany/wpshopgermany.php') return;
+		
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugURL') === '1' && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core'))
+			$remote_version = $GLOBALS['wpsg_sc']->get_url_content(base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy92ZXJzaW9uX2Rldg==')); // http://dl.maennchen1.de/wpsg/version_dev
+		else
+			$remote_version = $GLOBALS['wpsg_sc']->get_url_content(base64_decode('aHR0cDovL2RsLm1hZW5uY2hlbjEuZGUvd3BzZy92ZXJzaW9u')); // http://dl.maennchen1.de/wpsg/version
+		
+		if (!isset($_REQUEST['_ajax_nonce'])) echo __('Kopiere Shop zurÃŒck ...', 'wpsg').'<br />';
+		
+		// TemporÃ€res Verzeichnis 
+		if ($GLOBALS['wpsg_sc']->isMultiBlog())
+			$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/update_temp/';
+		else			 
+			$path = WP_CONTENT_DIR.'/uploads/wpsg_temp/update_temp/';
+			
+		//if (file_exists($path.'/lib/translation.phtml')) copy($path.'/lib/translation.phtml', WPSG_PATH.'/lib/translation.phtml');
+		//if (file_exists($path.'/user_views/')) wpsg_copy($path.'/user_views/', WPSG_PATH.'/user_views/');	
+		//if (file_exists($path.'/lang/')) wpsg_copy($path.'/lang/', WPSG_PATH.'/lang/');
+		
+		if (file_exists($path.'/lib/translation.phtml'))
+		{
+			
+			$source_file = $path.'lib/translation.phtml';
+			$target_file = WPSG_PATH.'lib/translation.phtml';
+			
+			wpsg_copy($source_file, $target_file);			
+						
+		}
+		
+		if (file_exists($path.'/user_views/'))
+		{
+			
+			$source_file = $path.'user_views';
+			$target_file = WPSG_PATH.'user_views';
+			
+			wpsg_copy($source_file, $target_file);
+			
+		}
+		
+		if (file_exists($path.'/lang'))
+		{
+			
+			$source_file = $path.'lang';
+			$target_file = WPSG_PATH.'lang';
+			    
+			wpsg_copy($source_file, $target_file);
+						
+		}
+		
+		wpsg_chmod($path.'/lib/translation.phtml', 0777);
+		wpsg_chmod($path.'/lang', 0777);
+		
+		$AC = new wpsg_AdminController();
+		
+		// Module nachinstallieren
+		foreach ((array)$GLOBALS['wpsg_arZusatzModuleInstalled'] as $m_key)
+		{
+			
+			$AC->installModul($m_key);
+			
+		}
+		
+		// AufrÃ€umen
+		//if (file_exists($path)) wpsg_rrmdir($path);
+				 
+		// Datenbank aktualisieren
+		if (!isset($_REQUEST['_ajax_nonce'])) echo '<br />'.__('Aktualisiere Shop Datenbank ...', 'wpsg').'<br />';
+		
+		// Einmalige Meldungen zurÃŒcksetzen
+		$GLOBALS['wpsg_sc']->db->Query("DELETE FROM `".$GLOBALS['wpsg_sc']->prefix."options` WHERE `option_name` LIKE 'wpsg_message_%' ");		
+		
+		$GLOBALS['wpsg_sc']->clearMessages();
+		$GLOBALS['wpsg_sc']->loadModule();
+		
+		wpsg_install(trim($remote_version));
+		
+	} // function wpsg_post_install()
+	
+?>
Index: /lib/fpdf/FAQ.htm
===================================================================
--- /lib/fpdf/FAQ.htm	(revision 5261)
+++ /lib/fpdf/FAQ.htm	(revision 5261)
@@ -0,0 +1,341 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>FAQ</title>
+<link type="text/css" rel="stylesheet" href="fpdf.css">
+<style type="text/css">
+ul {list-style-type:none; margin:0; padding:0}
+ul#answers li {margin-top:1.8em}
+.question {font-weight:bold; color:#900000}
+</style>
+</head>
+<body>
+<h1>FAQ</h1>
+<ul>
+<li><b>1.</b> <a href='#q1'>What's exactly the license of FPDF? Are there any usage restrictions?</a></li>
+<li><b>2.</b> <a href='#q2'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</a></li>
+<li><b>3.</b> <a href='#q3'>I try to generate a PDF and IE displays a blank page. What happens?</a></li>
+<li><b>4.</b> <a href='#q4'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</a></li>
+<li><b>5.</b> <a href='#q5'>I try to display a variable in the Header method but nothing prints.</a></li>
+<li><b>6.</b> <a href='#q6'>I defined the Header and Footer methods in my PDF class but nothing appears.</a></li>
+<li><b>7.</b> <a href='#q7'>Accented characters are replaced by some strange characters like Ã©.</a></li>
+<li><b>8.</b> <a href='#q8'>I try to display the Euro symbol but it doesn't work.</a></li>
+<li><b>9.</b> <a href='#q9'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</a></li>
+<li><b>10.</b> <a href='#q10'>I draw a frame with very precise dimensions, but when printed I notice some differences.</a></li>
+<li><b>11.</b> <a href='#q11'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</a></li>
+<li><b>12.</b> <a href='#q12'>How can I put a background in my PDF?</a></li>
+<li><b>13.</b> <a href='#q13'>How can I set a specific header or footer on the first page?</a></li>
+<li><b>14.</b> <a href='#q14'>I'd like to use extensions provided by different scripts. How can I combine them?</a></li>
+<li><b>15.</b> <a href='#q15'>How can I send the PDF by email?</a></li>
+<li><b>16.</b> <a href='#q16'>What's the limit of the file sizes I can generate with FPDF?</a></li>
+<li><b>17.</b> <a href='#q17'>Can I modify a PDF with FPDF?</a></li>
+<li><b>18.</b> <a href='#q18'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</a></li>
+<li><b>19.</b> <a href='#q19'>Can I convert an HTML page to PDF with FPDF?</a></li>
+<li><b>20.</b> <a href='#q20'>Can I concatenate PDF files with FPDF?</a></li>
+</ul>
+
+<ul id='answers'>
+<li id='q1'>
+<p><b>1.</b> <span class='question'>What's exactly the license of FPDF? Are there any usage restrictions?</span></p>
+FPDF is released under a permissive license: there is no usage restriction. You may embed it
+freely in your application (commercial or not), with or without modifications.
+</li>
+
+<li id='q2'>
+<p><b>2.</b> <span class='question'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</span></p>
+These "weird" characters are in fact the actual content of your PDF. This behavior is a bug of
+IE6. When it first receives an HTML page, then a PDF from the same URL, it displays it directly
+without launching Acrobat. This happens frequently during the development stage: on the least
+script error, an HTML page is sent, and after correction, the PDF arrives.
+<br>
+To solve the problem, simply quit and restart IE. You can also go to another URL and come
+back.
+<br>
+To avoid this kind of inconvenience during the development, you can generate the PDF directly
+to a file and open it through the explorer.
+</li>
+
+<li id='q3'>
+<p><b>3.</b> <span class='question'>I try to generate a PDF and IE displays a blank page. What happens?</span></p>
+First of all, check that you send nothing to the browser after the PDF (not even a space or a
+carriage return). You can put an exit statement just after the call to the Output() method to
+be sure. If it still doesn't work, it means you're a victim of the "blank page syndrome". IE
+used in conjunction with the Acrobat plug-in suffers from many bugs. To avoid these problems
+in a reliable manner, two main techniques exist:
+<br>
+<br>
+- Disable the plug-in and use Acrobat as a helper application. To do this, launch Acrobat, go
+to the Edit menu, Preferences, Internet, and uncheck "Display PDF in browser". Then, the next
+time you load a PDF in IE, it displays the dialog box "Open it" or "Save it to disk". Uncheck
+the option "Always ask before opening this type of file" and choose Open. From now on, PDF files
+will open automatically in an external Acrobat window.
+<br>
+The drawback of the method is that you need to alter the client configuration, which you can do
+in an intranet environment but not for the Internet.
+<br>
+<br>
+- Use a redirection technique. It consists in generating the PDF in a temporary file on the server
+and redirect the client to it. For example, at the end of the script, you can put the following:
+<div class="doc-source">
+<pre><code>//Determine a temporary file name in the current directory
+$file = basename(tempnam('.', 'tmp'));
+rename($file, $file.'.pdf');
+$file .= '.pdf';
+//Save PDF to file
+$pdf-&gt;Output($file, 'F');
+//Redirect
+header('Location: '.$file);</code></pre>
+</div>
+This method turns the dynamic PDF into a static one and avoids all troubles. But you have to do
+some cleaning in order to delete the temporary files. For example:
+<div class="doc-source">
+<pre><code>function CleanFiles($dir)
+{
+    //Delete temporary files
+    $t = time();
+    $h = opendir($dir);
+    while($file=readdir($h))
+    {
+        if(substr($file,0,3)=='tmp' &amp;&amp; substr($file,-4)=='.pdf')
+        {
+            $path = $dir.'/'.$file;
+            if($t-filemtime($path)&gt;3600)
+                @unlink($path);
+        }
+    }
+    closedir($h);
+}</code></pre>
+</div>
+This function deletes all files of the form tmp*.pdf older than an hour in the specified
+directory. You may call it where you want, for example in the script which generates the PDF.
+</li>
+
+<li id='q4'>
+<p><b>4.</b> <span class='question'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</span></p>
+You have to enclose your string with double quotes, not single ones.
+</li>
+
+<li id='q5'>
+<p><b>5.</b> <span class='question'>I try to display a variable in the Header method but nothing prints.</span></p>
+You have to use the <code>global</code> keyword to access global variables, for example:
+<div class="doc-source">
+<pre><code>function Header()
+{
+    global $title;
+
+    $this-&gt;SetFont('Arial', 'B', 15);
+    $this-&gt;Cell(0, 10, $title, 1, 1, 'C');
+}
+
+$title = 'My title';</code></pre>
+</div>
+Alternatively, you can use an object property:
+<div class="doc-source">
+<pre><code>function Header()
+{
+    $this-&gt;SetFont('Arial', 'B', 15);
+    $this-&gt;Cell(0, 10, $this-&gt;title, 1, 1, 'C');
+}
+
+$pdf-&gt;title = 'My title';</code></pre>
+</div>
+</li>
+
+<li id='q6'>
+<p><b>6.</b> <span class='question'>I defined the Header and Footer methods in my PDF class but nothing appears.</span></p>
+You have to create an object from the PDF class, not FPDF:
+<div class="doc-source">
+<pre><code>$pdf = new PDF();</code></pre>
+</div>
+</li>
+
+<li id='q7'>
+<p><b>7.</b> <span class='question'>Accented characters are replaced by some strange characters like Ã©.</span></p>
+Don't use UTF-8 encoding. Standard FPDF fonts use ISO-8859-1 or Windows-1252.
+It is possible to perform a conversion to ISO-8859-1 with utf8_decode():
+<div class="doc-source">
+<pre><code>$str = utf8_decode($str);</code></pre>
+</div>
+But some characters such as Euro won't be translated correctly. If the iconv extension is available, the
+right way to do it is the following:
+<div class="doc-source">
+<pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
+</div>
+</li>
+
+<li id='q8'>
+<p><b>8.</b> <span class='question'>I try to display the Euro symbol but it doesn't work.</span></p>
+The standard fonts have the Euro character at position 128. You can define a constant like this
+for convenience:
+<div class="doc-source">
+<pre><code>define('EURO', chr(128));</code></pre>
+</div>
+</li>
+
+<li id='q9'>
+<p><b>9.</b> <span class='question'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</span></p>
+You must send nothing to the browser except the PDF itself: no HTML, no space, no carriage return. A common
+case is having extra blank at the end of an included script file.<br>
+If you can't figure out where the problem comes from, this other message appearing just before can help you:<br>
+<br>
+<b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
+<br>
+It means that script.php outputs something at line X. Go to this line and fix it.
+In case the message doesn't show, first check that you didn't disable warnings, then add this at the very
+beginning of your script:
+<div class="doc-source">
+<pre><code>ob_end_clean();</code></pre>
+</div>
+If you still don't see it, disable zlib.output_compression in your php.ini and it should appear.
+</li>
+
+<li id='q10'>
+<p><b>10.</b> <span class='question'>I draw a frame with very precise dimensions, but when printed I notice some differences.</span></p>
+To respect dimensions, select "None" for the Page Scaling setting instead of "Shrink to Printable Area" in the print dialog box.
+</li>
+
+<li id='q11'>
+<p><b>11.</b> <span class='question'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</span></p>
+Printers have physical margins (different depending on the models); it is therefore impossible to remove
+them and print on the whole surface of the paper.
+</li>
+
+<li id='q12'>
+<p><b>12.</b> <span class='question'>How can I put a background in my PDF?</span></p>
+For a picture, call Image() in the Header() method, before any other output. To set a background color, use Rect().
+</li>
+
+<li id='q13'>
+<p><b>13.</b> <span class='question'>How can I set a specific header or footer on the first page?</span></p>
+Simply test the page number:
+<div class="doc-source">
+<pre><code>function Header()
+{
+    if($this-&gt;PageNo()==1)
+    {
+        //First page
+        ...
+    }
+    else
+    {
+        //Other pages
+        ...
+    }
+}</code></pre>
+</div>
+</li>
+
+<li id='q14'>
+<p><b>14.</b> <span class='question'>I'd like to use extensions provided by different scripts. How can I combine them?</span></p>
+Use an inheritance chain. If you have two classes, say A in a.php:
+<div class="doc-source">
+<pre><code>require('fpdf.php');
+
+class A extends FPDF
+{
+...
+}</code></pre>
+</div>
+and B in b.php:
+<div class="doc-source">
+<pre><code>require('fpdf.php');
+
+class B extends FPDF
+{
+...
+}</code></pre>
+</div>
+then make B extend A:
+<div class="doc-source">
+<pre><code>require('a.php');
+
+class B extends A
+{
+...
+}</code></pre>
+</div>
+and make your own class extend B:
+<div class="doc-source">
+<pre><code>require('b.php');
+
+class PDF extends B
+{
+...
+}
+
+$pdf = new PDF();</code></pre>
+</div>
+</li>
+
+<li id='q15'>
+<p><b>15.</b> <span class='question'>How can I send the PDF by email?</span></p>
+As any other file, but an easy way is to use <a href="http://phpmailer.codeworxtech.com">PHPMailer</a> and
+its in-memory attachment:
+<div class="doc-source">
+<pre><code>$mail = new PHPMailer();
+...
+$doc = $pdf-&gt;Output('', 'S');
+$mail-&gt;AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
+$mail-&gt;Send();</code></pre>
+</div>
+</li>
+
+<li id='q16'>
+<p><b>16.</b> <span class='question'>What's the limit of the file sizes I can generate with FPDF?</span></p>
+There is no particular limit. There are some constraints, however:
+<br>
+<br>
+- The maximum memory size allocated to PHP scripts is usually 8MB. For very big documents,
+especially with images, this limit may be reached (the file being built into memory). The
+parameter is configured in the php.ini file.
+<br>
+<br>
+- The maximum execution time allocated defaults to 30 seconds. This limit can of course be easily
+reached. It is configured in php.ini and may be altered dynamically with set_time_limit().
+<br>
+<br>
+- Browsers generally have a 5 minute time-out. If you send the PDF directly to the browser and
+reach the limit, it will be lost. It is therefore advised for very big documents to
+generate them in a file, and to send some data to the browser from time to time (with a call
+to flush() to force the output). When the document is finished, you can send a redirection to
+it or create a link.
+<br>
+Remark: even if the browser times out, the script may continue to run on the server.
+</li>
+
+<li id='q17'>
+<p><b>17.</b> <span class='question'>Can I modify a PDF with FPDF?</span></p>
+It is possible to import pages from an existing PDF document thanks to the FPDI extension:<br>
+<br>
+<a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/" target="_blank">http://www.setasign.de/products/pdf-php-solutions/fpdi/</a><br>
+<br>
+You can then add some content to them.
+</li>
+
+<li id='q18'>
+<p><b>18.</b> <span class='question'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</span></p>
+No. But a GPL C utility does exist, pdftotext, which is able to extract the textual content from
+a PDF. It is provided with the Xpdf package:<br>
+<br>
+<a href="http://www.foolabs.com/xpdf/" target="_blank">http://www.foolabs.com/xpdf/</a>
+</li>
+
+<li id='q19'>
+<p><b>19.</b> <span class='question'>Can I convert an HTML page to PDF with FPDF?</span></p>
+Not real-world pages. But a GPL C utility does exist, htmldoc, which allows to do it and gives good results:<br>
+<br>
+<a href="http://www.htmldoc.org" target="_blank">http://www.htmldoc.org</a>
+</li>
+
+<li id='q20'>
+<p><b>20.</b> <span class='question'>Can I concatenate PDF files with FPDF?</span></p>
+Not directly, but it is possible to use <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/demos/concatenate-fake/" target="_blank">FPDI</a>
+to perform this task. Some free command-line tools also exist:<br>
+<br>
+<a href="http://thierry.schmit.free.fr/spip/spip.php?article15&amp;lang=en" target="_blank">mbtPdfAsm</a><br>
+<a href="http://www.accesspdf.com/pdftk/" target="_blank">pdftk</a>
+</li>
+</ul>
+</body>
+</html>
Index: /lib/fpdf/FPDI_Protection.php
===================================================================
--- /lib/fpdf/FPDI_Protection.php	(revision 5261)
+++ /lib/fpdf/FPDI_Protection.php	(revision 5261)
@@ -0,0 +1,305 @@
+<?php
+/****************************************************************************
+* Software: FPDI_Protection                                                 *
+* Version:  1.0.3                                                            *
+* Date:     2009/03/06                                                      *
+* Author:   Klemen VODOPIVEC, Jan Slabon                                    *
+* License:  Freeware                                                        *
+*                                                                           *
+* You may use and modify this software as you wish as stated in original    *
+* FPDF package.                                                             *
+*                                                                           *
+* Infos (by Jan Slabon):                                                    *
+* This class extends the FPDI-class available at http://www.setasign.de     *
+* so that you can import pages and create new protected pdf files.          *
+*                                                                           *
+* This release is dedicated to my son Fin Frederik (*2005/06/04)            *
+*                                                                           *
+****************************************************************************/
+
+require_once('fpdi.php');
+
+class FPDI_Protection extends FPDI {
+	
+	var $encrypted = false;         //whether document is protected
+    var $Uvalue;                    //U entry in pdf document
+    var $Ovalue;                    //O entry in pdf document
+    var $Pvalue;                    //P entry in pdf document
+    var $enc_obj_id;                //encryption object id
+    var $last_rc4_key = '';         //last RC4 key encrypted (cached for optimisation)
+    var $last_rc4_key_c;            //last RC4 computed key
+    var $padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
+    
+    /**
+    * Function to set permissions as well as user and owner passwords
+    *
+    * - permissions is an array with values taken from the following list:
+    *   40bit:  copy, print, modify, annot-forms
+    *   128bit: fill-in, screenreaders, assemble, degraded-print
+    *   If a value is present it means that the permission is granted
+    * - If a user password is set, user will be prompted before document is opened
+    * - If an owner password is set, document can be opened in privilege mode with no
+    *   restriction if that password is entered
+    */
+    function SetProtection($permissions=array(), $user_pass='', $owner_pass=null) {
+        $options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'annot-forms' => 32 );
+        $protection = 192;
+        foreach($permissions as $permission){
+            if (!isset($options[$permission]))
+                $this->Error('Incorrect permission: '.$permission);
+            $protection += $options[$permission];
+        }
+        if ($owner_pass === null)
+            $owner_pass = uniqid(rand());
+        $this->encrypted = true;
+        $this->_generateencryptionkey($user_pass, $owner_pass, $protection);
+    }
+
+
+    function _putstream($s) {
+        if ($this->encrypted) {
+            $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s);
+        }
+        parent::_putstream($s);
+    }
+
+
+    function _textstring($s) {
+        if ($this->encrypted) {
+            $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s);
+        }
+        return parent::_textstring($s);
+    }
+
+
+    /**
+    * Compute key depending on object number where the encrypted data is stored
+    */
+    function _objectkey($n) {
+        return substr($this->_md5_16($this->encryption_key.pack('VXxx', $n)), 0, 10);
+    }
+
+
+    /**
+    * Escape special characters
+    */
+    function _escape($s) {
+        return str_replace(
+        	array('\\',')','(',"\r", "\n", "\t"),
+        	array('\\\\','\\)','\\(','\\r', '\\n', '\\t'),$s);
+    }
+
+    function _putresources() {
+        parent::_putresources();
+        if ($this->encrypted) {
+            $this->_newobj();
+            $this->enc_obj_id = $this->_current_obj_id;
+            $this->_out('<<');
+            $this->_putencryption();
+            $this->_out('>>');
+        }
+    }
+
+    function _putencryption() {
+        $this->_out('/Filter /Standard');
+        $this->_out('/V 1');
+        $this->_out('/R 2');
+        $this->_out('/O ('.$this->_escape($this->Ovalue).')');
+        $this->_out('/U ('.$this->_escape($this->Uvalue).')');
+        $this->_out('/P '.$this->Pvalue);
+    }
+
+
+    function _puttrailer() {
+        parent::_puttrailer();
+        if ($this->encrypted) {
+            $this->_out('/Encrypt '.$this->enc_obj_id.' 0 R');
+            $this->_out('/ID [()()]');
+        }
+    }
+
+
+    /**
+    * RC4 is the standard encryption algorithm used in PDF format
+    */
+    function _RC4($key, $text) {
+    	if ($this->last_rc4_key != $key) {
+            $k = str_repeat($key, 256/strlen($key)+1);
+            $rc4 = range(0,255);
+            $j = 0;
+            for ($i=0; $i<256; $i++){
+                $t = $rc4[$i];
+                $j = ($j + $t + ord($k{$i})) % 256;
+                $rc4[$i] = $rc4[$j];
+                $rc4[$j] = $t;
+            }
+            $this->last_rc4_key = $key;
+            $this->last_rc4_key_c = $rc4;
+        } else {
+            $rc4 = $this->last_rc4_key_c;
+        }
+
+        $len = strlen($text);
+        $a = 0;
+        $b = 0;
+        $out = '';
+        for ($i=0; $i<$len; $i++){
+            $a = ($a+1)%256;
+            $t= $rc4[$a];
+            $b = ($b+$t)%256;
+            $rc4[$a] = $rc4[$b];
+            $rc4[$b] = $t;
+            $k = $rc4[($rc4[$a]+$rc4[$b])%256];
+            $out.=chr(ord($text{$i}) ^ $k);
+        }
+
+        return $out;
+    }
+    
+
+    /**
+    * Get MD5 as binary string
+    */
+    function _md5_16($string) {
+        return pack('H*',md5($string));
+    }
+
+    /**
+    * Compute O value
+    */
+    function _Ovalue($user_pass, $owner_pass) {
+        $tmp = $this->_md5_16($owner_pass);
+        $owner_RC4_key = substr($tmp,0,5);
+        return $this->_RC4($owner_RC4_key, $user_pass);
+    }
+
+
+    /**
+    * Compute U value
+    */
+    function _Uvalue() {
+        return $this->_RC4($this->encryption_key, $this->padding);
+    }
+
+
+    /**
+    * Compute encryption key
+    */
+    function _generateencryptionkey($user_pass, $owner_pass, $protection) {
+        // Pad passwords
+        $user_pass = substr($user_pass.$this->padding,0,32);
+        $owner_pass = substr($owner_pass.$this->padding,0,32);
+        // Compute O value
+        $this->Ovalue = $this->_Ovalue($user_pass,$owner_pass);
+        // Compute encyption key
+        $tmp = $this->_md5_16($user_pass.$this->Ovalue.chr($protection)."\xFF\xFF\xFF");
+        $this->encryption_key = substr($tmp,0,5);
+        // Compute U value
+        $this->Uvalue = $this->_Uvalue();
+        // Compute P value
+        $this->Pvalue = -(($protection^255)+1);
+    }
+
+    
+    function pdf_write_value(&$value) {
+    	switch ($value[0]) {
+    		case PDF_TYPE_STRING :
+				if ($this->encrypted) {
+                    $value[1] = $this->_unescape($value[1]);
+                    $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
+                 	$value[1] = $this->_escape($value[1]);
+                } 
+    			break;
+    			
+			case PDF_TYPE_STREAM :
+				if ($this->encrypted) {
+                    $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]);
+                }
+                break;
+                
+            case PDF_TYPE_HEX :
+				
+            	if ($this->encrypted) {
+                	$value[1] = $this->hex2str($value[1]);
+                	$value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
+                    
+                	// remake hexstring of encrypted string
+    				$value[1] = $this->str2hex($value[1]);
+                }
+                break;
+    	}	
+    	
+    	parent::pdf_write_value($value);
+    }
+    
+    
+    function hex2str($hex) {
+    	return pack('H*', str_replace(array("\r","\n",' '),'', $hex));
+    }
+    
+    function str2hex($str) {
+        return current(unpack('H*',$str));
+    }
+    
+    /**
+     * Deescape special characters
+     */
+    function _unescape($s) {
+        $out = '';
+        for ($count = 0, $n = strlen($s); $count < $n; $count++) {
+            if ($s[$count] != '\\' || $count == $n-1) {
+                $out .= $s[$count];
+            } else {
+                switch ($s[++$count]) {
+                    case ')':
+                    case '(':
+                    case '\\':
+                        $out .= $s[$count];
+                        break;
+                    case 'f':
+                        $out .= chr(0x0C);
+                        break;
+                    case 'b':
+                        $out .= chr(0x08);
+                        break;
+                    case 't':
+                        $out .= chr(0x09);
+                        break;
+                    case 'r':
+                        $out .= chr(0x0D);
+                        break;
+                    case 'n':
+                        $out .= chr(0x0A);
+                        break;
+                    case "\r":
+                        if ($count != $n-1 && $s[$count+1] == "\n")
+                            $count++;
+                        break;
+                    case "\n":
+                        break;
+                    default:
+                        // Octal-Values
+                        if (ord($s[$count]) >= ord('0') &&
+                            ord($s[$count]) <= ord('9')) {
+                            $oct = ''. $s[$count];
+                                
+                            if (ord($s[$count+1]) >= ord('0') &&
+                                ord($s[$count+1]) <= ord('9')) {
+                                $oct .= $s[++$count];
+                                
+                                if (ord($s[$count+1]) >= ord('0') &&
+                                    ord($s[$count+1]) <= ord('9')) {
+                                    $oct .= $s[++$count];    
+                                }                            
+                            }
+                            
+                            $out .= chr(octdec($oct));
+                        } else {
+                            $out .= $s[$count];
+                        }
+                }
+            }
+        }
+        return $out;
+    }
+}
Index: /lib/fpdf/changelog.htm
===================================================================
--- /lib/fpdf/changelog.htm	(revision 5261)
+++ /lib/fpdf/changelog.htm	(revision 5261)
@@ -0,0 +1,146 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Changelog</title>
+<link type="text/css" rel="stylesheet" href="fpdf.css">
+<style type="text/css">
+dd {margin:1em 0 1em 1em}
+</style>
+</head>
+<body>
+<h1>Changelog</h1>
+<dl>
+<dt><strong>v1.7</strong> (2011-06-18)</dt>
+<dd>
+- The MakeFont utility has been completely rewritten and doesn't depend on ttf2pt1 anymore.<br>
+- Alpha channel is now supported for PNGs.<br>
+- When inserting an image, it's now possible to specify its resolution.<br>
+- Default resolution for images was increased from 72 to 96 dpi.<br>
+- When inserting a GIF image, no temporary file is used anymore if the PHP version is 5.1 or higher.<br>
+- When output buffering is enabled and the PDF is about to be sent, the buffer is now cleared if it contains only a UTF-8 BOM and/or whitespace (instead of throwing an error).<br>
+- Symbol and ZapfDingbats fonts now support underline style.<br>
+- Custom page sizes are now checked to ensure that width is smaller than height.<br>
+- Standard font files were changed to use the same format as user fonts.<br>
+- A bug in the embedding of Type1 fonts was fixed.<br>
+- A bug related to SetDisplayMode() and the current locale was fixed.<br>
+- A display issue occurring with the Adobe Reader X plug-in was fixed.<br>
+- An issue related to transparency with some versions of Adobe Reader was fixed.<br>
+- The Content-Length header was removed because it caused an issue when the HTTP server applies compression.<br>
+</dd>
+<dt><strong>v1.6</strong> (2008-08-03)</dt>
+<dd>
+- PHP 4.3.10 or higher is now required.<br>
+- GIF image support.<br>
+- Images can now trigger page breaks.<br>
+- Possibility to have different page formats in a single document.<br>
+- Document properties (author, creator, keywords, subject and title) can now be specified in UTF-8.<br>
+- Fixed a bug: when a PNG was inserted through a URL, an error sometimes occurred.<br>
+- An automatic page break in Header() doesn't cause an infinite loop any more.<br>
+- Removed some warning messages appearing with recent PHP versions.<br>
+- Added HTTP headers to reduce problems with IE.<br>
+</dd>
+<dt><strong>v1.53</strong> (2004-12-31)</dt>
+<dd>
+- When the font subdirectory is in the same directory as fpdf.php, it's no longer necessary to define the FPDF_FONTPATH constant.<br>
+- The array $HTTP_SERVER_VARS is no longer used. It could cause trouble on PHP5-based configurations with the register_long_arrays option disabled.<br>
+- Fixed a problem related to Type1 font embedding which caused trouble to some PDF processors.<br>
+- The file name sent to the browser could not contain a space character.<br>
+- The Cell() method could not print the number 0 (you had to pass the string '0').<br>
+</dd>
+<dt><strong>v1.52</strong> (2003-12-30)</dt>
+<dd>
+- Image() now displays the image at 72 dpi if no dimension is given.<br>
+- Output() takes a string as second parameter to indicate destination.<br>
+- Open() is now called automatically by AddPage().<br>
+- Inserting remote JPEG images doesn't generate an error any longer.<br>
+- Decimal separator is forced to dot in the constructor.<br>
+- Added several encodings (Turkish, Thai, Hebrew, Ukrainian and Vietnamese).<br>
+- The last line of a right-aligned MultiCell() was not correctly aligned if it was terminated by a carriage return.<br>
+- No more error message about already sent headers when outputting the PDF to the standard output from the command line.<br>
+- The underlining was going too far for text containing characters \, ( or ).<br>
+- $HTTP_ENV_VARS has been replaced by $HTTP_SERVER_VARS.<br>
+</dd>
+<dt><strong>v1.51</strong> (2002-08-03)</dt>
+<dd>
+- Type1 font support.<br>
+- Added Baltic encoding.<br>
+- The class now works internally in points with the origin at the bottom in order to avoid two bugs occurring with Acrobat 5 :<br>&nbsp;&nbsp;* The line thickness was too large when printed under Windows 98 SE and ME.<br>&nbsp;&nbsp;* TrueType fonts didn't appear immediately inside the plug-in (a substitution font was used), one had to cause a window refresh to make them show up.<br>
+- It's no longer necessary to set the decimal separator as dot to produce valid documents.<br>
+- The clickable area in a cell was always on the left independently from the text alignment.<br>
+- JPEG images in CMYK mode appeared in inverted colors.<br>
+- Transparent PNG images in grayscale or true color mode were incorrectly handled.<br>
+- Adding new fonts now works correctly even with the magic_quotes_runtime option set to on.<br>
+</dd>
+<dt><strong>v1.5</strong> (2002-05-28)</dt>
+<dd>
+- TrueType font (AddFont()) and encoding support (Western and Eastern Europe, Cyrillic and Greek).<br>
+- Added Write() method.<br>
+- Added underlined style.<br>
+- Internal and external link support (AddLink(), SetLink(), Link()).<br>
+- Added right margin management and methods SetRightMargin(), SetTopMargin().<br>
+- Modification of SetDisplayMode() to select page layout.<br>
+- The border parameter of MultiCell() now lets choose borders to draw as Cell().<br>
+- When a document contains no page, Close() now calls AddPage() instead of causing a fatal error.<br>
+</dd>
+<dt><strong>v1.41</strong> (2002-03-13)</dt>
+<dd>
+- Fixed SetDisplayMode() which no longer worked (the PDF viewer used its default display).<br>
+</dd>
+<dt><strong>v1.4</strong> (2002-03-02)</dt>
+<dd>
+- PHP3 is no longer supported.<br>
+- Page compression (SetCompression()).<br>
+- Choice of page format and possibility to change orientation inside document.<br>
+- Added AcceptPageBreak() method.<br>
+- Ability to print the total number of pages (AliasNbPages()).<br>
+- Choice of cell borders to draw.<br>
+- New mode for Cell(): the current position can now move under the cell.<br>
+- Ability to include an image by specifying height only (width is calculated automatically).<br>
+- Fixed a bug: when a justified line triggered a page break, the footer inherited the corresponding word spacing.<br>
+</dd>
+<dt><strong>v1.31</strong> (2002-01-12)</dt>
+<dd>
+- Fixed a bug in drawing frame with MultiCell(): the last line always started from the left margin.<br>
+- Removed Expires HTTP header (gives trouble in some situations).<br>
+- Added Content-disposition HTTP header (seems to help in some situations).<br>
+</dd>
+<dt><strong>v1.3</strong> (2001-12-03)</dt>
+<dd>
+- Line break and text justification support (MultiCell()).<br>
+- Color support (SetDrawColor(), SetFillColor(), SetTextColor()). Possibility to draw filled rectangles and paint cell background.<br>
+- A cell whose width is declared null extends up to the right margin of the page.<br>
+- Line width is now retained from page to page and defaults to 0.2 mm.<br>
+- Added SetXY() method.<br>
+- Fixed a passing by reference done in a deprecated manner for PHP4.<br>
+</dd>
+<dt><strong>v1.2</strong> (2001-11-11)</dt>
+<dd>
+- Added font metric files and GetStringWidth() method.<br>
+- Centering and right-aligning text in cells.<br>
+- Display mode control (SetDisplayMode()).<br>
+- Added methods to set document properties (SetAuthor(), SetCreator(), SetKeywords(), SetSubject(), SetTitle()).<br>
+- Possibility to force PDF download by browser.<br>
+- Added SetX() and GetX() methods.<br>
+- During automatic page break, current abscissa is now retained.<br>
+</dd>
+<dt><strong>v1.11</strong> (2001-10-20)</dt>
+<dd>
+- PNG support doesn't require PHP4/zlib any more. Data are now put directly into PDF without any decompression/recompression stage.<br>
+- Image insertion now works correctly even with magic_quotes_runtime option set to on.<br>
+</dd>
+<dt><strong>v1.1</strong> (2001-10-07)</dt>
+<dd>
+- JPEG and PNG image support.<br>
+</dd>
+<dt><strong>v1.01</strong> (2001-10-03)</dt>
+<dd>
+- Fixed a bug involving page break: in case when Header() doesn't specify a font, the one from previous page was not restored and produced an incorrect document.<br>
+</dd>
+<dt><strong>v1.0</strong> (2001-09-17)</dt>
+<dd>
+- First version.<br>
+</dd>
+</dl>
+</body>
+</html>
Index: /lib/fpdf/doc/acceptpagebreak.htm
===================================================================
--- /lib/fpdf/doc/acceptpagebreak.htm	(revision 5261)
+++ /lib/fpdf/doc/acceptpagebreak.htm	(revision 5261)
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>AcceptPageBreak</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>AcceptPageBreak</h1>
+<code><b>boolean</b> AcceptPageBreak()</code>
+<h2>Description</h2>
+Whenever a page break condition is met, the method is called, and the break is issued or not
+depending on the returned value. The default implementation returns a value according to the
+mode selected by SetAutoPageBreak().
+<br>
+This method is called automatically and should not be called directly by the application.
+<h2>Example</h2>
+The method is overriden in an inherited class in order to obtain a 3 column layout:
+<div class="doc-source">
+<pre><code>class PDF extends FPDF
+{
+var $col = 0;
+
+function SetCol($col)
+{
+    // Move position to a column
+    $this-&gt;col = $col;
+    $x = 10+$col*65;
+    $this-&gt;SetLeftMargin($x);
+    $this-&gt;SetX($x);
+}
+
+function AcceptPageBreak()
+{
+    if($this-&gt;col&lt;2)
+    {
+        // Go to next column
+        $this-&gt;SetCol($this-&gt;col+1);
+        $this-&gt;SetY(10);
+        return false;
+    }
+    else
+    {
+        // Go back to first column and issue page break
+        $this-&gt;SetCol(0);
+        return true;
+    }
+}
+}
+
+$pdf = new PDF();
+$pdf-&gt;AddPage();
+$pdf-&gt;SetFont('Arial','',12);
+for($i=1;$i&lt;=300;$i++)
+    $pdf-&gt;Cell(0,5,&quot;Line $i&quot;,0,1);
+$pdf-&gt;Output();</code></pre>
+</div>
+<h2>See also</h2>
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/addfont.htm
===================================================================
--- /lib/fpdf/doc/addfont.htm	(revision 5261)
+++ /lib/fpdf/doc/addfont.htm	(revision 5261)
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>AddFont</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>AddFont</h1>
+<code>AddFont(<b>string</b> family [, <b>string</b> style [, <b>string</b> file]])</code>
+<h2>Description</h2>
+Imports a TrueType, OpenType or Type1 font and makes it available. It is necessary to generate a font
+definition file first with the MakeFont utility.
+<br>
+The definition file (and the font file itself when embedding) must be present in the font directory.
+If it is not found, the error "Could not include font definition file" is raised.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>family</code></dt>
+<dd>
+Font family. The name can be chosen arbitrarily. If it is a standard family name, it will
+override the corresponding font.
+</dd>
+<dt><code>style</code></dt>
+<dd>
+Font style. Possible values are (case insensitive):
+<ul>
+<li>empty string: regular</li>
+<li><code>B</code>: bold</li>
+<li><code>I</code>: italic</li>
+<li><code>BI</code> or <code>IB</code>: bold italic</li>
+</ul>
+The default value is regular.
+</dd>
+<dt><code>file</code></dt>
+<dd>
+The font definition file.
+<br>
+By default, the name is built from the family and style, in lower case with no space.
+</dd>
+</dl>
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>$pdf-&gt;AddFont('Comic','I');</code></pre>
+</div>
+is equivalent to:
+<div class="doc-source">
+<pre><code>$pdf-&gt;AddFont('Comic','I','comici.php');</code></pre>
+</div>
+<h2>See also</h2>
+<a href="setfont.htm">SetFont()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/addlink.htm
===================================================================
--- /lib/fpdf/doc/addlink.htm	(revision 5261)
+++ /lib/fpdf/doc/addlink.htm	(revision 5261)
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>AddLink</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>AddLink</h1>
+<code><b>int</b> AddLink()</code>
+<h2>Description</h2>
+Creates a new internal link and returns its identifier. An internal link is a clickable area
+which directs to another place within the document.
+<br>
+The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is
+defined with SetLink().
+<h2>See also</h2>
+<a href="cell.htm">Cell()</a>,
+<a href="write.htm">Write()</a>,
+<a href="image.htm">Image()</a>,
+<a href="link.htm">Link()</a>,
+<a href="setlink.htm">SetLink()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/addpage.htm
===================================================================
--- /lib/fpdf/doc/addpage.htm	(revision 5261)
+++ /lib/fpdf/doc/addpage.htm	(revision 5261)
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>AddPage</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>AddPage</h1>
+<code>AddPage([<b>string</b> orientation [, <b>mixed</b> size]])</code>
+<h2>Description</h2>
+Adds a new page to the document. If a page is already present, the Footer() method is called
+first to output the footer. Then the page is added, the current position set to the top-left
+corner according to the left and top margins, and Header() is called to display the header.
+<br>
+The font which was set before calling is automatically restored. There is no need to call
+SetFont() again if you want to continue with the same font. The same is true for colors and
+line width.
+<br>
+The origin of the coordinate system is at the top-left corner and increasing ordinates go
+downwards.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>orientation</code></dt>
+<dd>
+Page orientation. Possible values are (case insensitive):
+<ul>
+<li><code>P</code> or <code>Portrait</code></li>
+<li><code>L</code> or <code>Landscape</code></li>
+</ul>
+The default value is the one passed to the constructor.
+</dd>
+<dt><code>size</code></dt>
+<dd>
+Page size. It can be either one of the following values (case insensitive):
+<ul>
+<li><code>A3</code></li>
+<li><code>A4</code></li>
+<li><code>A5</code></li>
+<li><code>Letter</code></li>
+<li><code>Legal</code></li>
+</ul>
+or an array containing the width and the height (expressed in user unit).<br>
+<br>
+The default value is the one passed to the constructor.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="fpdf.htm">FPDF()</a>,
+<a href="header.htm">Header()</a>,
+<a href="footer.htm">Footer()</a>,
+<a href="setmargins.htm">SetMargins()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/aliasnbpages.htm
===================================================================
--- /lib/fpdf/doc/aliasnbpages.htm	(revision 5261)
+++ /lib/fpdf/doc/aliasnbpages.htm	(revision 5261)
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>AliasNbPages</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>AliasNbPages</h1>
+<code>AliasNbPages([<b>string</b> alias])</code>
+<h2>Description</h2>
+Defines an alias for the total number of pages. It will be substituted as the document is
+closed.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>alias</code></dt>
+<dd>
+The alias. Default value: <code>{nb}</code>.
+</dd>
+</dl>
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>class PDF extends FPDF
+{
+function Footer()
+{
+    // Go to 1.5 cm from bottom
+    $this-&gt;SetY(-15);
+    // Select Arial italic 8
+    $this-&gt;SetFont('Arial','I',8);
+    // Print current and total page numbers
+    $this-&gt;Cell(0,10,'Page '.$this-&gt;PageNo().'/{nb}',0,0,'C');
+}
+}
+
+$pdf = new PDF();
+$pdf-&gt;AliasNbPages();</code></pre>
+</div>
+<h2>See also</h2>
+<a href="pageno.htm">PageNo()</a>,
+<a href="footer.htm">Footer()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/cell.htm
===================================================================
--- /lib/fpdf/doc/cell.htm	(revision 5261)
+++ /lib/fpdf/doc/cell.htm	(revision 5261)
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Cell</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Cell</h1>
+<code>Cell(<b>float</b> w [, <b>float</b> h [, <b>string</b> txt [, <b>mixed</b> border [, <b>int</b> ln [, <b>string</b> align [, <b>boolean</b> fill [, <b>mixed</b> link]]]]]]])</code>
+<h2>Description</h2>
+Prints a cell (rectangular area) with optional borders, background color and character string.
+The upper-left corner of the cell corresponds to the current position. The text can be aligned
+or centered. After the call, the current position moves to the right or to the next line. It is
+possible to put a link on the text.
+<br>
+If automatic page breaking is enabled and the cell goes beyond the limit, a page break is
+done before outputting.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>w</code></dt>
+<dd>
+Cell width. If <code>0</code>, the cell extends up to the right margin.
+</dd>
+<dt><code>h</code></dt>
+<dd>
+Cell height.
+Default value: <code>0</code>.
+</dd>
+<dt><code>txt</code></dt>
+<dd>
+String to print.
+Default value: empty string.
+</dd>
+<dt><code>border</code></dt>
+<dd>
+Indicates if borders must be drawn around the cell. The value can be either a number:
+<ul>
+<li><code>0</code>: no border</li>
+<li><code>1</code>: frame</li>
+</ul>
+or a string containing some or all of the following characters (in any order):
+<ul>
+<li><code>L</code>: left</li>
+<li><code>T</code>: top</li>
+<li><code>R</code>: right</li>
+<li><code>B</code>: bottom</li>
+</ul>
+Default value: <code>0</code>.
+</dd>
+<dt><code>ln</code></dt>
+<dd>
+Indicates where the current position should go after the call. Possible values are:
+<ul>
+<li><code>0</code>: to the right</li>
+<li><code>1</code>: to the beginning of the next line</li>
+<li><code>2</code>: below</li>
+</ul>
+Putting <code>1</code> is equivalent to putting <code>0</code> and calling Ln() just after.
+Default value: <code>0</code>.
+</dd>
+<dt><code>align</code></dt>
+<dd>
+Allows to center or align the text. Possible values are:
+<ul>
+<li><code>L</code> or empty string: left align (default value)</li>
+<li><code>C</code>: center</li>
+<li><code>R</code>: right align</li>
+</ul>
+</dd>
+<dt><code>fill</code></dt>
+<dd>
+Indicates if the cell background must be painted (<code>true</code>) or transparent (<code>false</code>).
+Default value: <code>false</code>.
+</dd>
+<dt><code>link</code></dt>
+<dd>
+URL or identifier returned by AddLink().
+</dd>
+</dl>
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>// Set font
+$pdf-&gt;SetFont('Arial','B',16);
+// Move to 8 cm to the right
+$pdf-&gt;Cell(80);
+// Centered text in a framed 20*10 mm cell and line break
+$pdf-&gt;Cell(20,10,'Title',1,1,'C');</code></pre>
+</div>
+<h2>See also</h2>
+<a href="setfont.htm">SetFont()</a>,
+<a href="setdrawcolor.htm">SetDrawColor()</a>,
+<a href="setfillcolor.htm">SetFillColor()</a>,
+<a href="settextcolor.htm">SetTextColor()</a>,
+<a href="setlinewidth.htm">SetLineWidth()</a>,
+<a href="addlink.htm">AddLink()</a>,
+<a href="ln.htm">Ln()</a>,
+<a href="multicell.htm">MultiCell()</a>,
+<a href="write.htm">Write()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/close.htm
===================================================================
--- /lib/fpdf/doc/close.htm	(revision 5261)
+++ /lib/fpdf/doc/close.htm	(revision 5261)
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Close</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Close</h1>
+<code>Close()</code>
+<h2>Description</h2>
+Terminates the PDF document. It is not necessary to call this method explicitly because Output()
+does it automatically.
+<br>
+If the document contains no page, AddPage() is called to prevent from getting an invalid document.
+<h2>See also</h2>
+<a href="output.htm">Output()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/error.htm
===================================================================
--- /lib/fpdf/doc/error.htm	(revision 5261)
+++ /lib/fpdf/doc/error.htm	(revision 5261)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Error</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Error</h1>
+<code>Error(<b>string</b> msg)</code>
+<h2>Description</h2>
+This method is automatically called in case of fatal error; it simply outputs the message
+and halts the execution. An inherited class may override it to customize the error handling
+but should always halt the script, or the resulting document would probably be invalid.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>msg</code></dt>
+<dd>
+The error message.
+</dd>
+</dl>
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/footer.htm
===================================================================
--- /lib/fpdf/doc/footer.htm	(revision 5261)
+++ /lib/fpdf/doc/footer.htm	(revision 5261)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Footer</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Footer</h1>
+<code>Footer()</code>
+<h2>Description</h2>
+This method is used to render the page footer. It is automatically called by AddPage() and
+Close() and should not be called directly by the application. The implementation in FPDF is
+empty, so you have to subclass it and override the method if you want a specific processing.
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>class PDF extends FPDF
+{
+function Footer()
+{
+    // Go to 1.5 cm from bottom
+    $this-&gt;SetY(-15);
+    // Select Arial italic 8
+    $this-&gt;SetFont('Arial','I',8);
+    // Print centered page number
+    $this-&gt;Cell(0,10,'Page '.$this-&gt;PageNo(),0,0,'C');
+}
+}</code></pre>
+</div>
+<h2>See also</h2>
+<a href="header.htm">Header()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/fpdf.htm
===================================================================
--- /lib/fpdf/doc/fpdf.htm	(revision 5261)
+++ /lib/fpdf/doc/fpdf.htm	(revision 5261)
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>FPDF</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>FPDF</h1>
+<code>FPDF([<b>string</b> orientation [, <b>string</b> unit [, <b>mixed</b> size]]])</code>
+<h2>Description</h2>
+This is the class constructor. It allows to set up the page size, the orientation and the
+unit of measure used in all methods (except for font sizes).
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>orientation</code></dt>
+<dd>
+Default page orientation. Possible values are (case insensitive):
+<ul>
+<li><code>P</code> or <code>Portrait</code></li>
+<li><code>L</code> or <code>Landscape</code></li>
+</ul>
+Default value is <code>P</code>.
+</dd>
+<dt><code>unit</code></dt>
+<dd>
+User unit. Possible values are:
+<ul>
+<li><code>pt</code>: point</li>
+<li><code>mm</code>: millimeter</li>
+<li><code>cm</code>: centimeter</li>
+<li><code>in</code>: inch</li>
+</ul>
+A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This
+is a very common unit in typography; font sizes are expressed in that unit.
+<br>
+<br>
+Default value is <code>mm</code>.
+</dd>
+<dt><code>size</code></dt>
+<dd>
+The size used for pages. It can be either one of the following values (case insensitive):
+<ul>
+<li><code>A3</code></li>
+<li><code>A4</code></li>
+<li><code>A5</code></li>
+<li><code>Letter</code></li>
+<li><code>Legal</code></li>
+</ul>
+or an array containing the width and the height (expressed in the unit given by <code>unit</code>).<br>
+<br>
+Default value is <code>A4</code>.
+</dd>
+</dl>
+<h2>Example</h2>
+Example with a custom 100x150 mm page size:
+<div class="doc-source">
+<pre><code>$pdf = new FPDF('P','mm',array(100,150));</code></pre>
+</div>
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/getstringwidth.htm
===================================================================
--- /lib/fpdf/doc/getstringwidth.htm	(revision 5261)
+++ /lib/fpdf/doc/getstringwidth.htm	(revision 5261)
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>GetStringWidth</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>GetStringWidth</h1>
+<code><b>float</b> GetStringWidth(<b>string</b> s)</code>
+<h2>Description</h2>
+Returns the length of a string in user unit. A font must be selected.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>s</code></dt>
+<dd>
+The string whose length is to be computed.
+</dd>
+</dl>
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/getx.htm
===================================================================
--- /lib/fpdf/doc/getx.htm	(revision 5261)
+++ /lib/fpdf/doc/getx.htm	(revision 5261)
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>GetX</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>GetX</h1>
+<code><b>float</b> GetX()</code>
+<h2>Description</h2>
+Returns the abscissa of the current position.
+<h2>See also</h2>
+<a href="setx.htm">SetX()</a>,
+<a href="gety.htm">GetY()</a>,
+<a href="sety.htm">SetY()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/gety.htm
===================================================================
--- /lib/fpdf/doc/gety.htm	(revision 5261)
+++ /lib/fpdf/doc/gety.htm	(revision 5261)
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>GetY</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>GetY</h1>
+<code><b>float</b> GetY()</code>
+<h2>Description</h2>
+Returns the ordinate of the current position.
+<h2>See also</h2>
+<a href="sety.htm">SetY()</a>,
+<a href="getx.htm">GetX()</a>,
+<a href="setx.htm">SetX()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/header.htm
===================================================================
--- /lib/fpdf/doc/header.htm	(revision 5261)
+++ /lib/fpdf/doc/header.htm	(revision 5261)
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Header</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Header</h1>
+<code>Header()</code>
+<h2>Description</h2>
+This method is used to render the page header. It is automatically called by AddPage() and
+should not be called directly by the application. The implementation in FPDF is empty, so
+you have to subclass it and override the method if you want a specific processing.
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>class PDF extends FPDF
+{
+function Header()
+{
+    // Select Arial bold 15
+    $this-&gt;SetFont('Arial','B',15);
+    // Move to the right
+    $this-&gt;Cell(80);
+    // Framed title
+    $this-&gt;Cell(30,10,'Title',1,0,'C');
+    // Line break
+    $this-&gt;Ln(20);
+}
+}</code></pre>
+</div>
+<h2>See also</h2>
+<a href="footer.htm">Footer()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/image.htm
===================================================================
--- /lib/fpdf/doc/image.htm	(revision 5261)
+++ /lib/fpdf/doc/image.htm	(revision 5261)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Image</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Image</h1>
+<code>Image(<b>string</b> file [, <b>float</b> x [, <b>float</b> y [, <b>float</b> w [, <b>float</b> h [, <b>string</b> type [, <b>mixed</b> link]]]]]])</code>
+<h2>Description</h2>
+Puts an image. The size it will take on the page can be specified in different ways:
+<ul>
+<li>explicit width and height (expressed in user unit or dpi)</li>
+<li>one explicit dimension, the other being calculated automatically in order to keep the original proportions</li>
+<li>no explicit dimension, in which case the image is put at 96 dpi</li>
+</ul>
+Supported formats are JPEG, PNG and GIF. The GD extension is required for GIF.
+<br>
+<br>
+For JPEGs, all flavors are allowed:
+<ul>
+<li>gray scales</li>
+<li>true colors (24 bits)</li>
+<li>CMYK (32 bits)</li>
+</ul>
+For PNGs, are allowed:
+<ul>
+<li>gray scales on at most 8 bits (256 levels)</li>
+<li>indexed colors</li>
+<li>true colors (24 bits)</li>
+</ul>
+For GIFs: in case of an animated GIF, only the first frame is displayed.<br>
+<br>
+Transparency is supported.<br>
+<br>
+The format can be specified explicitly or inferred from the file extension.<br>
+<br>
+It is possible to put a link on the image.<br>
+<br>
+Remark: if an image is used several times, only one copy is embedded in the file.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>file</code></dt>
+<dd>
+Path or URL of the image.
+</dd>
+<dt><code>x</code></dt>
+<dd>
+Abscissa of the upper-left corner. If not specified or equal to <code>null</code>, the current abscissa
+is used.
+</dd>
+<dt><code>y</code></dt>
+<dd>
+Ordinate of the upper-left corner. If not specified or equal to <code>null</code>, the current ordinate
+is used; moreover, a page break is triggered first if necessary (in case automatic page breaking is enabled)
+and, after the call, the current ordinate is moved to the bottom of the image.
+</dd>
+<dt><code>w</code></dt>
+<dd>
+Width of the image in the page. There are three cases:
+<ul>
+<li>If the value is positive, it represents the width in user unit</li>
+<li>If the value is negative, the absolute value represents the horizontal resolution in dpi</li>
+<li>If the value is not specified or equal to zero, it is automatically calculated</li>
+</ul>
+</dd>
+<dt><code>h</code></dt>
+<dd>
+Height of the image in the page. There are three cases:
+<ul>
+<li>If the value is positive, it represents the height in user unit</li>
+<li>If the value is negative, the absolute value represents the vertical resolution in dpi</li>
+<li>If the value is not specified or equal to zero, it is automatically calculated</li>
+</ul>
+</dd>
+<dt><code>type</code></dt>
+<dd>
+Image format. Possible values are (case insensitive): <code>JPG</code>, <code>JPEG</code>, <code>PNG</code> and <code>GIF</code>.
+If not specified, the type is inferred from the file extension.
+</dd>
+<dt><code>link</code></dt>
+<dd>
+URL or identifier returned by AddLink().
+</dd>
+</dl>
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>// Insert a logo in the top-left corner at 300 dpi
+$pdf-&gt;Image('logo.png',10,10,-300);
+// Insert a dynamic image from a URL
+$pdf-&gt;Image('http://chart.googleapis.com/chart?cht=p3&amp;chd=t:60,40&amp;chs=250x100&amp;chl=Hello|World',60,30,90,0,'PNG');</code></pre>
+</div>
+<h2>See also</h2>
+<a href="addlink.htm">AddLink()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/index.htm
===================================================================
--- /lib/fpdf/doc/index.htm	(revision 5261)
+++ /lib/fpdf/doc/index.htm	(revision 5261)
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>FPDF 1.7 Reference Manual</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>FPDF 1.7 Reference Manual</h1>
+<a href="acceptpagebreak.htm">AcceptPageBreak</a> - accept or not automatic page break<br>
+<a href="addfont.htm">AddFont</a> - add a new font<br>
+<a href="addlink.htm">AddLink</a> - create an internal link<br>
+<a href="addpage.htm">AddPage</a> - add a new page<br>
+<a href="aliasnbpages.htm">AliasNbPages</a> - define an alias for number of pages<br>
+<a href="cell.htm">Cell</a> - print a cell<br>
+<a href="close.htm">Close</a> - terminate the document<br>
+<a href="error.htm">Error</a> - fatal error<br>
+<a href="footer.htm">Footer</a> - page footer<br>
+<a href="fpdf.htm">FPDF</a> - constructor<br>
+<a href="getstringwidth.htm">GetStringWidth</a> - compute string length<br>
+<a href="getx.htm">GetX</a> - get current x position<br>
+<a href="gety.htm">GetY</a> - get current y position<br>
+<a href="header.htm">Header</a> - page header<br>
+<a href="image.htm">Image</a> - output an image<br>
+<a href="line.htm">Line</a> - draw a line<br>
+<a href="link.htm">Link</a> - put a link<br>
+<a href="ln.htm">Ln</a> - line break<br>
+<a href="multicell.htm">MultiCell</a> - print text with line breaks<br>
+<a href="output.htm">Output</a> - save or send the document<br>
+<a href="pageno.htm">PageNo</a> - page number<br>
+<a href="rect.htm">Rect</a> - draw a rectangle<br>
+<a href="setauthor.htm">SetAuthor</a> - set the document author<br>
+<a href="setautopagebreak.htm">SetAutoPageBreak</a> - set the automatic page breaking mode<br>
+<a href="setcompression.htm">SetCompression</a> - turn compression on or off<br>
+<a href="setcreator.htm">SetCreator</a> - set document creator<br>
+<a href="setdisplaymode.htm">SetDisplayMode</a> - set display mode<br>
+<a href="setdrawcolor.htm">SetDrawColor</a> - set drawing color<br>
+<a href="setfillcolor.htm">SetFillColor</a> - set filling color<br>
+<a href="setfont.htm">SetFont</a> - set font<br>
+<a href="setfontsize.htm">SetFontSize</a> - set font size<br>
+<a href="setkeywords.htm">SetKeywords</a> - associate keywords with document<br>
+<a href="setleftmargin.htm">SetLeftMargin</a> - set left margin<br>
+<a href="setlinewidth.htm">SetLineWidth</a> - set line width<br>
+<a href="setlink.htm">SetLink</a> - set internal link destination<br>
+<a href="setmargins.htm">SetMargins</a> - set margins<br>
+<a href="setrightmargin.htm">SetRightMargin</a> - set right margin<br>
+<a href="setsubject.htm">SetSubject</a> - set document subject<br>
+<a href="settextcolor.htm">SetTextColor</a> - set text color<br>
+<a href="settitle.htm">SetTitle</a> - set document title<br>
+<a href="settopmargin.htm">SetTopMargin</a> - set top margin<br>
+<a href="setx.htm">SetX</a> - set current x position<br>
+<a href="setxy.htm">SetXY</a> - set current x and y positions<br>
+<a href="sety.htm">SetY</a> - set current y position<br>
+<a href="text.htm">Text</a> - print a string<br>
+<a href="write.htm">Write</a> - print flowing text<br>
+</body>
+</html>
Index: /lib/fpdf/doc/line.htm
===================================================================
--- /lib/fpdf/doc/line.htm	(revision 5261)
+++ /lib/fpdf/doc/line.htm	(revision 5261)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Line</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Line</h1>
+<code>Line(<b>float</b> x1, <b>float</b> y1, <b>float</b> x2, <b>float</b> y2)</code>
+<h2>Description</h2>
+Draws a line between two points.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>x1</code></dt>
+<dd>
+Abscissa of first point.
+</dd>
+<dt><code>y1</code></dt>
+<dd>
+Ordinate of first point.
+</dd>
+<dt><code>x2</code></dt>
+<dd>
+Abscissa of second point.
+</dd>
+<dt><code>y2</code></dt>
+<dd>
+Ordinate of second point.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setlinewidth.htm">SetLineWidth()</a>,
+<a href="setdrawcolor.htm">SetDrawColor()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/link.htm
===================================================================
--- /lib/fpdf/doc/link.htm	(revision 5261)
+++ /lib/fpdf/doc/link.htm	(revision 5261)
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Link</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Link</h1>
+<code>Link(<b>float</b> x, <b>float</b> y, <b>float</b> w, <b>float</b> h, <b>mixed</b> link)</code>
+<h2>Description</h2>
+Puts a link on a rectangular area of the page. Text or image links are generally put via Cell(),
+Write() or Image(), but this method can be useful for instance to define a clickable area inside
+an image.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>x</code></dt>
+<dd>
+Abscissa of the upper-left corner of the rectangle.
+</dd>
+<dt><code>y</code></dt>
+<dd>
+Ordinate of the upper-left corner of the rectangle.
+</dd>
+<dt><code>w</code></dt>
+<dd>
+Width of the rectangle.
+</dd>
+<dt><code>h</code></dt>
+<dd>
+Height of the rectangle.
+</dd>
+<dt><code>link</code></dt>
+<dd>
+URL or identifier returned by AddLink().
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="addlink.htm">AddLink()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="write.htm">Write()</a>,
+<a href="image.htm">Image()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/ln.htm
===================================================================
--- /lib/fpdf/doc/ln.htm	(revision 5261)
+++ /lib/fpdf/doc/ln.htm	(revision 5261)
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Ln</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Ln</h1>
+<code>Ln([<b>float</b> h])</code>
+<h2>Description</h2>
+Performs a line break. The current abscissa goes back to the left margin and the ordinate
+increases by the amount passed in parameter.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>h</code></dt>
+<dd>
+The height of the break.
+<br>
+By default, the value equals the height of the last printed cell.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="cell.htm">Cell()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/multicell.htm
===================================================================
--- /lib/fpdf/doc/multicell.htm	(revision 5261)
+++ /lib/fpdf/doc/multicell.htm	(revision 5261)
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>MultiCell</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>MultiCell</h1>
+<code>MultiCell(<b>float</b> w, <b>float</b> h, <b>string</b> txt [, <b>mixed</b> border [, <b>string</b> align [, <b>boolean</b> fill]]])</code>
+<h2>Description</h2>
+This method allows printing text with line breaks. They can be automatic (as soon as the
+text reaches the right border of the cell) or explicit (via the \n character). As many cells
+as necessary are output, one below the other.
+<br>
+Text can be aligned, centered or justified. The cell block can be framed and the background
+painted.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>w</code></dt>
+<dd>
+Width of cells. If <code>0</code>, they extend up to the right margin of the page.
+</dd>
+<dt><code>h</code></dt>
+<dd>
+Height of cells.
+</dd>
+<dt><code>txt</code></dt>
+<dd>
+String to print.
+</dd>
+<dt><code>border</code></dt>
+<dd>
+Indicates if borders must be drawn around the cell block. The value can be either a number:
+<ul>
+<li><code>0</code>: no border</li>
+<li><code>1</code>: frame</li>
+</ul>
+or a string containing some or all of the following characters (in any order):
+<ul>
+<li><code>L</code>: left</li>
+<li><code>T</code>: top</li>
+<li><code>R</code>: right</li>
+<li><code>B</code>: bottom</li>
+</ul>
+Default value: <code>0</code>.
+</dd>
+<dt><code>align</code></dt>
+<dd>
+Sets the text alignment. Possible values are:
+<ul>
+<li><code>L</code>: left alignment</li>
+<li><code>C</code>: center</li>
+<li><code>R</code>: right alignment</li>
+<li><code>J</code>: justification (default value)</li>
+</ul>
+</dd>
+<dt><code>fill</code></dt>
+<dd>
+Indicates if the cell background must be painted (<code>true</code>) or transparent (<code>false</code>).
+Default value: <code>false</code>.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setfont.htm">SetFont()</a>,
+<a href="setdrawcolor.htm">SetDrawColor()</a>,
+<a href="setfillcolor.htm">SetFillColor()</a>,
+<a href="settextcolor.htm">SetTextColor()</a>,
+<a href="setlinewidth.htm">SetLineWidth()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="write.htm">Write()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/output.htm
===================================================================
--- /lib/fpdf/doc/output.htm	(revision 5261)
+++ /lib/fpdf/doc/output.htm	(revision 5261)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Output</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Output</h1>
+<code><b>string</b> Output([<b>string</b> name, <b>string</b> dest])</code>
+<h2>Description</h2>
+Send the document to a given destination: browser, file or string. In the case of browser, the
+plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.
+<br>
+The method first calls Close() if necessary to terminate the document.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>name</code></dt>
+<dd>
+The name of the file. If not specified, the document will be sent to the browser
+(destination <code>I</code>) with the name <code>doc.pdf</code>.
+</dd>
+<dt><code>dest</code></dt>
+<dd>
+Destination where to send the document. It can take one of the following values:
+<ul>
+<li><code>I</code>: send the file inline to the browser. The plug-in is used if available.
+The name given by <code>name</code> is used when one selects the "Save as" option on the
+link generating the PDF.</li>
+<li><code>D</code>: send to the browser and force a file download with the name given by
+<code>name</code>.</li>
+<li><code>F</code>: save to a local file with the name given by <code>name</code> (may include a path).</li>
+<li><code>S</code>: return the document as a string. <code>name</code> is ignored.</li>
+</ul>
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="close.htm">Close()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/pageno.htm
===================================================================
--- /lib/fpdf/doc/pageno.htm	(revision 5261)
+++ /lib/fpdf/doc/pageno.htm	(revision 5261)
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>PageNo</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>PageNo</h1>
+<code><b>int</b> PageNo()</code>
+<h2>Description</h2>
+Returns the current page number.
+<h2>See also</h2>
+<a href="aliasnbpages.htm">AliasNbPages()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/rect.htm
===================================================================
--- /lib/fpdf/doc/rect.htm	(revision 5261)
+++ /lib/fpdf/doc/rect.htm	(revision 5261)
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Rect</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Rect</h1>
+<code>Rect(<b>float</b> x, <b>float</b> y, <b>float</b> w, <b>float</b> h [, <b>string</b> style])</code>
+<h2>Description</h2>
+Outputs a rectangle. It can be drawn (border only), filled (with no border) or both.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>x</code></dt>
+<dd>
+Abscissa of upper-left corner.
+</dd>
+<dt><code>y</code></dt>
+<dd>
+Ordinate of upper-left corner.
+</dd>
+<dt><code>w</code></dt>
+<dd>
+Width.
+</dd>
+<dt><code>h</code></dt>
+<dd>
+Height.
+</dd>
+<dt><code>style</code></dt>
+<dd>
+Style of rendering. Possible values are:
+<ul>
+<li><code>D</code> or empty string: draw. This is the default value.</li>
+<li><code>F</code>: fill</li>
+<li><code>DF</code> or <code>FD</code>: draw and fill</li>
+</ul>
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setlinewidth.htm">SetLineWidth()</a>,
+<a href="setdrawcolor.htm">SetDrawColor()</a>,
+<a href="setfillcolor.htm">SetFillColor()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setauthor.htm
===================================================================
--- /lib/fpdf/doc/setauthor.htm	(revision 5261)
+++ /lib/fpdf/doc/setauthor.htm	(revision 5261)
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetAuthor</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetAuthor</h1>
+<code>SetAuthor(<b>string</b> author [, <b>boolean</b> isUTF8])</code>
+<h2>Description</h2>
+Defines the author of the document.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>author</code></dt>
+<dd>
+The name of the author.
+</dd>
+<dt><code>isUTF8</code></dt>
+<dd>
+Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
+Default value: <code>false</code>.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setcreator.htm">SetCreator()</a>,
+<a href="setkeywords.htm">SetKeywords()</a>,
+<a href="setsubject.htm">SetSubject()</a>,
+<a href="settitle.htm">SetTitle()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setautopagebreak.htm
===================================================================
--- /lib/fpdf/doc/setautopagebreak.htm	(revision 5261)
+++ /lib/fpdf/doc/setautopagebreak.htm	(revision 5261)
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetAutoPageBreak</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetAutoPageBreak</h1>
+<code>SetAutoPageBreak(<b>boolean</b> auto [, <b>float</b> margin])</code>
+<h2>Description</h2>
+Enables or disables the automatic page breaking mode. When enabling, the second parameter is
+the distance from the bottom of the page that defines the triggering limit. By default, the
+mode is on and the margin is 2 cm.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>auto</code></dt>
+<dd>
+Boolean indicating if mode should be on or off.
+</dd>
+<dt><code>margin</code></dt>
+<dd>
+Distance from the bottom of the page.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>,
+<a href="acceptpagebreak.htm">AcceptPageBreak()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setcompression.htm
===================================================================
--- /lib/fpdf/doc/setcompression.htm	(revision 5261)
+++ /lib/fpdf/doc/setcompression.htm	(revision 5261)
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetCompression</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetCompression</h1>
+<code>SetCompression(<b>boolean</b> compress)</code>
+<h2>Description</h2>
+Activates or deactivates page compression. When activated, the internal representation of
+each page is compressed, which leads to a compression ratio of about 2 for the resulting
+document.
+<br>
+Compression is on by default.
+<br>
+<br>
+<strong>Note:</strong> the Zlib extension is required for this feature. If not present, compression
+will be turned off.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>compress</code></dt>
+<dd>
+Boolean indicating if compression must be enabled.
+</dd>
+</dl>
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setcreator.htm
===================================================================
--- /lib/fpdf/doc/setcreator.htm	(revision 5261)
+++ /lib/fpdf/doc/setcreator.htm	(revision 5261)
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetCreator</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetCreator</h1>
+<code>SetCreator(<b>string</b> creator [, <b>boolean</b> isUTF8])</code>
+<h2>Description</h2>
+Defines the creator of the document. This is typically the name of the application that
+generates the PDF.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>creator</code></dt>
+<dd>
+The name of the creator.
+</dd>
+<dt><code>isUTF8</code></dt>
+<dd>
+Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
+Default value: <code>false</code>.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setauthor.htm">SetAuthor()</a>,
+<a href="setkeywords.htm">SetKeywords()</a>,
+<a href="setsubject.htm">SetSubject()</a>,
+<a href="settitle.htm">SetTitle()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setdisplaymode.htm
===================================================================
--- /lib/fpdf/doc/setdisplaymode.htm	(revision 5261)
+++ /lib/fpdf/doc/setdisplaymode.htm	(revision 5261)
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetDisplayMode</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetDisplayMode</h1>
+<code>SetDisplayMode(<b>mixed</b> zoom [, <b>string</b> layout])</code>
+<h2>Description</h2>
+Defines the way the document is to be displayed by the viewer. The zoom level can be set: pages can be
+displayed entirely on screen, occupy the full width of the window, use real size, be scaled by a
+specific zooming factor or use viewer default (configured in the Preferences menu of Adobe Reader).
+The page layout can be specified too: single at once, continuous display, two columns or viewer
+default.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>zoom</code></dt>
+<dd>
+The zoom to use. It can be one of the following string values:
+<ul>
+<li><code>fullpage</code>: displays the entire page on screen</li>
+<li><code>fullwidth</code>: uses maximum width of window</li>
+<li><code>real</code>: uses real size (equivalent to 100% zoom)</li>
+<li><code>default</code>: uses viewer default mode</li>
+</ul>
+or a number indicating the zooming factor to use.
+</dd>
+<dt><code>layout</code></dt>
+<dd>
+The page layout. Possible values are:
+<ul>
+<li><code>single</code>: displays one page at once</li>
+<li><code>continuous</code>: displays pages continuously</li>
+<li><code>two</code>: displays two pages on two columns</li>
+<li><code>default</code>: uses viewer default mode</li>
+</ul>
+Default value is <code>default</code>.
+</dd>
+</dl>
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setdrawcolor.htm
===================================================================
--- /lib/fpdf/doc/setdrawcolor.htm	(revision 5261)
+++ /lib/fpdf/doc/setdrawcolor.htm	(revision 5261)
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetDrawColor</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetDrawColor</h1>
+<code>SetDrawColor(<b>int</b> r [, <b>int</b> g, <b>int</b> b])</code>
+<h2>Description</h2>
+Defines the color used for all drawing operations (lines, rectangles and cell borders). It
+can be expressed in RGB components or gray scale. The method can be called before the first
+page is created and the value is retained from page to page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>r</code></dt>
+<dd>
+If <code>g</code> et <code>b</code> are given, red component; if not, indicates the gray level.
+Value between 0 and 255.
+</dd>
+<dt><code>g</code></dt>
+<dd>
+Green component (between 0 and 255).
+</dd>
+<dt><code>b</code></dt>
+<dd>
+Blue component (between 0 and 255).
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setfillcolor.htm">SetFillColor()</a>,
+<a href="settextcolor.htm">SetTextColor()</a>,
+<a href="line.htm">Line()</a>,
+<a href="rect.htm">Rect()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setfillcolor.htm
===================================================================
--- /lib/fpdf/doc/setfillcolor.htm	(revision 5261)
+++ /lib/fpdf/doc/setfillcolor.htm	(revision 5261)
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetFillColor</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetFillColor</h1>
+<code>SetFillColor(<b>int</b> r [, <b>int</b> g, <b>int</b> b])</code>
+<h2>Description</h2>
+Defines the color used for all filling operations (filled rectangles and cell backgrounds).
+It can be expressed in RGB components or gray scale. The method can be called before the first
+page is created and the value is retained from page to page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>r</code></dt>
+<dd>
+If <code>g</code> and <code>b</code> are given, red component; if not, indicates the gray level.
+Value between 0 and 255.
+</dd>
+<dt><code>g</code></dt>
+<dd>
+Green component (between 0 and 255).
+</dd>
+<dt><code>b</code></dt>
+<dd>
+Blue component (between 0 and 255).
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setdrawcolor.htm">SetDrawColor()</a>,
+<a href="settextcolor.htm">SetTextColor()</a>,
+<a href="rect.htm">Rect()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setfont.htm
===================================================================
--- /lib/fpdf/doc/setfont.htm	(revision 5261)
+++ /lib/fpdf/doc/setfont.htm	(revision 5261)
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetFont</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetFont</h1>
+<code>SetFont(<b>string</b> family [, <b>string</b> style [, <b>float</b> size]])</code>
+<h2>Description</h2>
+Sets the font used to print character strings. It is mandatory to call this method
+at least once before printing text or the resulting document would not be valid.
+<br>
+The font can be either a standard one or a font added via the AddFont() method. Standard fonts
+use the Windows encoding cp1252 (Western Europe).
+<br>
+The method can be called before the first page is created and the font is kept from page
+to page.
+<br>
+If you just wish to change the current font size, it is simpler to call SetFontSize().
+<br>
+<br>
+<strong>Note:</strong> the font definition files must be accessible. They are searched successively in:
+<ul>
+<li>The directory defined by the <code>FPDF_FONTPATH</code> constant (if this constant is defined)</li>
+<li>The <code>font</code> directory located in the same directory as <code>fpdf.php</code> (if it exists)</li>
+<li>The directories accessible through <code>include()</code></li>
+</ul>
+Example using <code>FPDF_FONTPATH</code>:
+<div class="doc-source">
+<pre><code>define('FPDF_FONTPATH','/home/www/font');
+require('fpdf.php');</code></pre>
+</div>
+If the file corresponding to the requested font is not found, the error "Could not include font
+definition file" is raised.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>family</code></dt>
+<dd>
+Family font. It can be either a name defined by AddFont() or one of the standard families (case
+insensitive):
+<ul>
+<li><code>Courier</code> (fixed-width)</li>
+<li><code>Helvetica</code> or <code>Arial</code> (synonymous; sans serif)</li>
+<li><code>Times</code> (serif)</li>
+<li><code>Symbol</code> (symbolic)</li>
+<li><code>ZapfDingbats</code> (symbolic)</li>
+</ul>
+It is also possible to pass an empty string. In that case, the current family is kept.
+</dd>
+<dt><code>style</code></dt>
+<dd>
+Font style. Possible values are (case insensitive):
+<ul>
+<li>empty string: regular</li>
+<li><code>B</code>: bold</li>
+<li><code>I</code>: italic</li>
+<li><code>U</code>: underline</li>
+</ul>
+or any combination. The default value is regular.
+Bold and italic styles do not apply to <code>Symbol</code> and <code>ZapfDingbats</code>.
+</dd>
+<dt><code>size</code></dt>
+<dd>
+Font size in points.
+<br>
+The default value is the current size. If no size has been specified since the beginning of
+the document, the value taken is 12.
+</dd>
+</dl>
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>// Times regular 12
+$pdf-&gt;SetFont('Times');
+// Arial bold 14
+$pdf-&gt;SetFont('Arial','B',14);
+// Removes bold
+$pdf-&gt;SetFont('');
+// Times bold, italic and underlined 14
+$pdf-&gt;SetFont('Times','BIU');</code></pre>
+</div>
+<h2>See also</h2>
+<a href="addfont.htm">AddFont()</a>,
+<a href="setfontsize.htm">SetFontSize()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>,
+<a href="write.htm">Write()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setfontsize.htm
===================================================================
--- /lib/fpdf/doc/setfontsize.htm	(revision 5261)
+++ /lib/fpdf/doc/setfontsize.htm	(revision 5261)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetFontSize</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetFontSize</h1>
+<code>SetFontSize(<b>float</b> size)</code>
+<h2>Description</h2>
+Defines the size of the current font.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>size</code></dt>
+<dd>
+The size (in points).
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setfont.htm">SetFont()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setkeywords.htm
===================================================================
--- /lib/fpdf/doc/setkeywords.htm	(revision 5261)
+++ /lib/fpdf/doc/setkeywords.htm	(revision 5261)
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetKeywords</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetKeywords</h1>
+<code>SetKeywords(<b>string</b> keywords [, <b>boolean</b> isUTF8])</code>
+<h2>Description</h2>
+Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>keywords</code></dt>
+<dd>
+The list of keywords.
+</dd>
+<dt><code>isUTF8</code></dt>
+<dd>
+Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
+Default value: <code>false</code>.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setauthor.htm">SetAuthor()</a>,
+<a href="setcreator.htm">SetCreator()</a>,
+<a href="setsubject.htm">SetSubject()</a>,
+<a href="settitle.htm">SetTitle()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setleftmargin.htm
===================================================================
--- /lib/fpdf/doc/setleftmargin.htm	(revision 5261)
+++ /lib/fpdf/doc/setleftmargin.htm	(revision 5261)
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetLeftMargin</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetLeftMargin</h1>
+<code>SetLeftMargin(<b>float</b> margin)</code>
+<h2>Description</h2>
+Defines the left margin. The method can be called before creating the first page.
+<br>
+If the current abscissa gets out of page, it is brought back to the margin.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>margin</code></dt>
+<dd>
+The margin.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="settopmargin.htm">SetTopMargin()</a>,
+<a href="setrightmargin.htm">SetRightMargin()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
+<a href="setmargins.htm">SetMargins()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setlinewidth.htm
===================================================================
--- /lib/fpdf/doc/setlinewidth.htm	(revision 5261)
+++ /lib/fpdf/doc/setlinewidth.htm	(revision 5261)
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetLineWidth</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetLineWidth</h1>
+<code>SetLineWidth(<b>float</b> width)</code>
+<h2>Description</h2>
+Defines the line width. By default, the value equals 0.2 mm. The method can be called before
+the first page is created and the value is retained from page to page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>width</code></dt>
+<dd>
+The width.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="line.htm">Line()</a>,
+<a href="rect.htm">Rect()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setlink.htm
===================================================================
--- /lib/fpdf/doc/setlink.htm	(revision 5261)
+++ /lib/fpdf/doc/setlink.htm	(revision 5261)
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetLink</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetLink</h1>
+<code>SetLink(<b>int</b> link [, <b>float</b> y [, <b>int</b> page]])</code>
+<h2>Description</h2>
+Defines the page and position a link points to.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>link</code></dt>
+<dd>
+The link identifier returned by AddLink().
+</dd>
+<dt><code>y</code></dt>
+<dd>
+Ordinate of target position; <code>-1</code> indicates the current position.
+The default value is <code>0</code> (top of page).
+</dd>
+<dt><code>page</code></dt>
+<dd>
+Number of target page; <code>-1</code> indicates the current page. This is the default value.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="addlink.htm">AddLink()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setmargins.htm
===================================================================
--- /lib/fpdf/doc/setmargins.htm	(revision 5261)
+++ /lib/fpdf/doc/setmargins.htm	(revision 5261)
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetMargins</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetMargins</h1>
+<code>SetMargins(<b>float</b> left, <b>float</b> top [, <b>float</b> right])</code>
+<h2>Description</h2>
+Defines the left, top and right margins. By default, they equal 1 cm. Call this method to change
+them.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>left</code></dt>
+<dd>
+Left margin.
+</dd>
+<dt><code>top</code></dt>
+<dd>
+Top margin.
+</dd>
+<dt><code>right</code></dt>
+<dd>
+Right margin. Default value is the left one.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setleftmargin.htm">SetLeftMargin()</a>,
+<a href="settopmargin.htm">SetTopMargin()</a>,
+<a href="setrightmargin.htm">SetRightMargin()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setrightmargin.htm
===================================================================
--- /lib/fpdf/doc/setrightmargin.htm	(revision 5261)
+++ /lib/fpdf/doc/setrightmargin.htm	(revision 5261)
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetRightMargin</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetRightMargin</h1>
+<code>SetRightMargin(<b>float</b> margin)</code>
+<h2>Description</h2>
+Defines the right margin. The method can be called before creating the first page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>margin</code></dt>
+<dd>
+The margin.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setleftmargin.htm">SetLeftMargin()</a>,
+<a href="settopmargin.htm">SetTopMargin()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
+<a href="setmargins.htm">SetMargins()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setsubject.htm
===================================================================
--- /lib/fpdf/doc/setsubject.htm	(revision 5261)
+++ /lib/fpdf/doc/setsubject.htm	(revision 5261)
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetSubject</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetSubject</h1>
+<code>SetSubject(<b>string</b> subject [, <b>boolean</b> isUTF8])</code>
+<h2>Description</h2>
+Defines the subject of the document.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>subject</code></dt>
+<dd>
+The subject.
+</dd>
+<dt><code>isUTF8</code></dt>
+<dd>
+Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
+Default value: <code>false</code>.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setauthor.htm">SetAuthor()</a>,
+<a href="setcreator.htm">SetCreator()</a>,
+<a href="setkeywords.htm">SetKeywords()</a>,
+<a href="settitle.htm">SetTitle()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/settextcolor.htm
===================================================================
--- /lib/fpdf/doc/settextcolor.htm	(revision 5261)
+++ /lib/fpdf/doc/settextcolor.htm	(revision 5261)
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetTextColor</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetTextColor</h1>
+<code>SetTextColor(<b>int</b> r [, <b>int</b> g, <b>int</b> b])</code>
+<h2>Description</h2>
+Defines the color used for text. It can be expressed in RGB components or gray scale. The
+method can be called before the first page is created and the value is retained from page to
+page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>r</code></dt>
+<dd>
+If <code>g</code> et <code>b</code> are given, red component; if not, indicates the gray level.
+Value between 0 and 255.
+</dd>
+<dt><code>g</code></dt>
+<dd>
+Green component (between 0 and 255).
+</dd>
+<dt><code>b</code></dt>
+<dd>
+Blue component (between 0 and 255).
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setdrawcolor.htm">SetDrawColor()</a>,
+<a href="setfillcolor.htm">SetFillColor()</a>,
+<a href="text.htm">Text()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/settitle.htm
===================================================================
--- /lib/fpdf/doc/settitle.htm	(revision 5261)
+++ /lib/fpdf/doc/settitle.htm	(revision 5261)
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetTitle</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetTitle</h1>
+<code>SetTitle(<b>string</b> title [, <b>boolean</b> isUTF8])</code>
+<h2>Description</h2>
+Defines the title of the document.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>title</code></dt>
+<dd>
+The title.
+</dd>
+<dt><code>isUTF8</code></dt>
+<dd>
+Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
+Default value: <code>false</code>.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setauthor.htm">SetAuthor()</a>,
+<a href="setcreator.htm">SetCreator()</a>,
+<a href="setkeywords.htm">SetKeywords()</a>,
+<a href="setsubject.htm">SetSubject()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/settopmargin.htm
===================================================================
--- /lib/fpdf/doc/settopmargin.htm	(revision 5261)
+++ /lib/fpdf/doc/settopmargin.htm	(revision 5261)
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetTopMargin</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetTopMargin</h1>
+<code>SetTopMargin(<b>float</b> margin)</code>
+<h2>Description</h2>
+Defines the top margin. The method can be called before creating the first page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>margin</code></dt>
+<dd>
+The margin.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setleftmargin.htm">SetLeftMargin()</a>,
+<a href="setrightmargin.htm">SetRightMargin()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
+<a href="setmargins.htm">SetMargins()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setx.htm
===================================================================
--- /lib/fpdf/doc/setx.htm	(revision 5261)
+++ /lib/fpdf/doc/setx.htm	(revision 5261)
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetX</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetX</h1>
+<code>SetX(<b>float</b> x)</code>
+<h2>Description</h2>
+Defines the abscissa of the current position. If the passed value is negative, it is relative
+to the right of the page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>x</code></dt>
+<dd>
+The value of the abscissa.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="getx.htm">GetX()</a>,
+<a href="gety.htm">GetY()</a>,
+<a href="sety.htm">SetY()</a>,
+<a href="setxy.htm">SetXY()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/setxy.htm
===================================================================
--- /lib/fpdf/doc/setxy.htm	(revision 5261)
+++ /lib/fpdf/doc/setxy.htm	(revision 5261)
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetXY</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetXY</h1>
+<code>SetXY(<b>float</b> x, <b>float</b> y)</code>
+<h2>Description</h2>
+Defines the abscissa and ordinate of the current position. If the passed values are negative,
+they are relative respectively to the right and bottom of the page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>x</code></dt>
+<dd>
+The value of the abscissa.
+</dd>
+<dt><code>y</code></dt>
+<dd>
+The value of the ordinate.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setx.htm">SetX()</a>,
+<a href="sety.htm">SetY()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/sety.htm
===================================================================
--- /lib/fpdf/doc/sety.htm	(revision 5261)
+++ /lib/fpdf/doc/sety.htm	(revision 5261)
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>SetY</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>SetY</h1>
+<code>SetY(<b>float</b> y)</code>
+<h2>Description</h2>
+Moves the current abscissa back to the left margin and sets the ordinate. If the passed value
+is negative, it is relative to the bottom of the page.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>y</code></dt>
+<dd>
+The value of the ordinate.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="getx.htm">GetX()</a>,
+<a href="gety.htm">GetY()</a>,
+<a href="setx.htm">SetX()</a>,
+<a href="setxy.htm">SetXY()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/text.htm
===================================================================
--- /lib/fpdf/doc/text.htm	(revision 5261)
+++ /lib/fpdf/doc/text.htm	(revision 5261)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Text</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Text</h1>
+<code>Text(<b>float</b> x, <b>float</b> y, <b>string</b> txt)</code>
+<h2>Description</h2>
+Prints a character string. The origin is on the left of the first character, on the baseline.
+This method allows to place a string precisely on the page, but it is usually easier to use
+Cell(), MultiCell() or Write() which are the standard methods to print text.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>x</code></dt>
+<dd>
+Abscissa of the origin.
+</dd>
+<dt><code>y</code></dt>
+<dd>
+Ordinate of the origin.
+</dd>
+<dt><code>txt</code></dt>
+<dd>
+String to print.
+</dd>
+</dl>
+<h2>See also</h2>
+<a href="setfont.htm">SetFont()</a>,
+<a href="settextcolor.htm">SetTextColor()</a>,
+<a href="cell.htm">Cell()</a>,
+<a href="multicell.htm">MultiCell()</a>,
+<a href="write.htm">Write()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/doc/write.htm
===================================================================
--- /lib/fpdf/doc/write.htm	(revision 5261)
+++ /lib/fpdf/doc/write.htm	(revision 5261)
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Write</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Write</h1>
+<code>Write(<b>float</b> h, <b>string</b> txt [, <b>mixed</b> link])</code>
+<h2>Description</h2>
+This method prints text from the current position. When the right margin is reached (or the \n
+character is met) a line break occurs and text continues from the left margin. Upon method exit,
+the current position is left just at the end of the text.
+<br>
+It is possible to put a link on the text.
+<h2>Parameters</h2>
+<dl class="param">
+<dt><code>h</code></dt>
+<dd>
+Line height.
+</dd>
+<dt><code>txt</code></dt>
+<dd>
+String to print.
+</dd>
+<dt><code>link</code></dt>
+<dd>
+URL or identifier returned by AddLink().
+</dd>
+</dl>
+<h2>Example</h2>
+<div class="doc-source">
+<pre><code>// Begin with regular font
+$pdf-&gt;SetFont('Arial','',14);
+$pdf-&gt;Write(5,'Visit ');
+// Then put a blue underlined link
+$pdf-&gt;SetTextColor(0,0,255);
+$pdf-&gt;SetFont('','U');
+$pdf-&gt;Write(5,'www.fpdf.org','http://www.fpdf.org');</code></pre>
+</div>
+<h2>See also</h2>
+<a href="setfont.htm">SetFont()</a>,
+<a href="settextcolor.htm">SetTextColor()</a>,
+<a href="addlink.htm">AddLink()</a>,
+<a href="multicell.htm">MultiCell()</a>,
+<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
+<hr style="margin-top:1.5em">
+<div style="text-align:center"><a href="index.htm">Index</a></div>
+</body>
+</html>
Index: /lib/fpdf/filters/FilterASCII85.php
===================================================================
--- /lib/fpdf/filters/FilterASCII85.php	(revision 5261)
+++ /lib/fpdf/filters/FilterASCII85.php	(revision 5261)
@@ -0,0 +1,101 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!defined('ORD_z'))
+	define('ORD_z',ord('z'));
+if (!defined('ORD_exclmark'))
+	define('ORD_exclmark', ord('!'));
+if (!defined('ORD_u'))	
+	define('ORD_u', ord('u'));
+if (!defined('ORD_tilde'))
+	define('ORD_tilde', ord('~'));
+
+if (!class_exists('FilterASCII85', false)) {
+
+    class FilterASCII85 {
+        
+        function error($msg) {
+            die($msg);
+        }
+        
+        function decode($in) {
+            $out = '';
+            $state = 0;
+            $chn = null;
+            
+            $l = strlen($in);
+            
+            for ($k = 0; $k < $l; ++$k) {
+                $ch = ord($in[$k]) & 0xff;
+                
+                if ($ch == ORD_tilde) {
+                    break;
+                }
+                if (preg_match('/^\s$/',chr($ch))) {
+                    continue;
+                }
+                if ($ch == ORD_z && $state == 0) {
+                    $out .= chr(0).chr(0).chr(0).chr(0);
+                    continue;
+                }
+                if ($ch < ORD_exclmark || $ch > ORD_u) {
+                    return $this->error('Illegal character in ASCII85Decode.');
+                }
+                
+                $chn[$state++] = $ch - ORD_exclmark;
+                
+                if ($state == 5) {
+                    $state = 0;
+                    $r = 0;
+                    for ($j = 0; $j < 5; ++$j)
+                        $r = $r * 85 + $chn[$j];
+                    $out .= chr($r >> 24);
+                    $out .= chr($r >> 16);
+                    $out .= chr($r >> 8);
+                    $out .= chr($r);
+                }
+            }
+            $r = 0;
+            
+            if ($state == 1)
+                return $this->error('Illegal length in ASCII85Decode.');
+            if ($state == 2) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85;
+                $out .= chr($r >> 24);
+            }
+            else if ($state == 3) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + ($chn[2]+1) * 85 * 85;
+                $out .= chr($r >> 24);
+                $out .= chr($r >> 16);
+            }
+            else if ($state == 4) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + $chn[2] * 85 * 85  + ($chn[3]+1) * 85 ;
+                $out .= chr($r >> 24);
+                $out .= chr($r >> 16);
+                $out .= chr($r >> 8);
+            }
+    
+            return $out;
+        }
+        
+        function encode($in) {
+            return $this->error("ASCII85 encoding not implemented.");
+        }
+    }
+}
Index: /lib/fpdf/filters/FilterASCII85_FPDI.php
===================================================================
--- /lib/fpdf/filters/FilterASCII85_FPDI.php	(revision 5261)
+++ /lib/fpdf/filters/FilterASCII85_FPDI.php	(revision 5261)
@@ -0,0 +1,33 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('FilterASCII85.php');
+
+class FilterASCII85_FPDI extends FilterASCII85 {
+
+    var $fpdi;
+    
+    function FilterASCII85_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
Index: /lib/fpdf/filters/FilterLZW.php
===================================================================
--- /lib/fpdf/filters/FilterLZW.php	(revision 5261)
+++ /lib/fpdf/filters/FilterLZW.php	(revision 5261)
@@ -0,0 +1,157 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!class_exists('FilterLZW', false)) {
+
+    class FilterLZW {
+        
+        var $sTable = array();
+        var $data = null;
+        var $dataLength = 0;
+        var $tIdx;
+        var $bitsToGet = 9;
+        var $bytePointer;
+        var $bitPointer;
+        var $nextData = 0;
+        var $nextBits = 0;
+        var $andTable = array(511, 1023, 2047, 4095);
+    
+        function error($msg) {
+            die($msg);
+        }
+        
+        /**
+         * Method to decode LZW compressed data.
+         *
+         * @param string data    The compressed data.
+         */
+        function decode($data) {
+    
+            if($data[0] == 0x00 && $data[1] == 0x01) {
+                $this->error('LZW flavour not supported.');
+            }
+    
+            $this->initsTable();
+    
+            $this->data = $data;
+            $this->dataLength = strlen($data);
+    
+            // Initialize pointers
+            $this->bytePointer = 0;
+            $this->bitPointer = 0;
+    
+            $this->nextData = 0;
+            $this->nextBits = 0;
+    
+            $oldCode = 0;
+    
+            $string = '';
+            $uncompData = '';
+    
+            while (($code = $this->getNextCode()) != 257) {
+                if ($code == 256) {
+                    $this->initsTable();
+                    $code = $this->getNextCode();
+    
+                    if ($code == 257) {
+                        break;
+                    }
+    
+                    $uncompData .= $this->sTable[$code];
+                    $oldCode = $code;
+    
+                } else {
+    
+                    if ($code < $this->tIdx) {
+                        $string = $this->sTable[$code];
+                        $uncompData .= $string;
+    
+                        $this->addStringToTable($this->sTable[$oldCode], $string[0]);
+                        $oldCode = $code;
+                    } else {
+                        $string = $this->sTable[$oldCode];
+                        $string = $string.$string[0];
+                        $uncompData .= $string;
+    
+                        $this->addStringToTable($string);
+                        $oldCode = $code;
+                    }
+                }
+            }
+            
+            return $uncompData;
+        }
+    
+    
+        /**
+         * Initialize the string table.
+         */
+        function initsTable() {
+            $this->sTable = array();
+    
+            for ($i = 0; $i < 256; $i++)
+                $this->sTable[$i] = chr($i);
+    
+            $this->tIdx = 258;
+            $this->bitsToGet = 9;
+        }
+    
+        /**
+         * Add a new string to the string table.
+         */
+        function addStringToTable ($oldString, $newString='') {
+            $string = $oldString.$newString;
+    
+            // Add this new String to the table
+            $this->sTable[$this->tIdx++] = $string;
+    
+            if ($this->tIdx == 511) {
+                $this->bitsToGet = 10;
+            } else if ($this->tIdx == 1023) {
+                $this->bitsToGet = 11;
+            } else if ($this->tIdx == 2047) {
+                $this->bitsToGet = 12;
+            }
+        }
+    
+        // Returns the next 9, 10, 11 or 12 bits
+        function getNextCode() {
+            if ($this->bytePointer == $this->dataLength) {
+                return 257;
+            }
+    
+            $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
+            $this->nextBits += 8;
+    
+            if ($this->nextBits < $this->bitsToGet) {
+                $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
+                $this->nextBits += 8;
+            }
+    
+            $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9];
+            $this->nextBits -= $this->bitsToGet;
+    
+            return $code;
+        }
+        
+        function encode($in) {
+            $this->error("LZW encoding not implemented.");
+        }
+    }
+}
Index: /lib/fpdf/filters/FilterLZW_FPDI.php
===================================================================
--- /lib/fpdf/filters/FilterLZW_FPDI.php	(revision 5261)
+++ /lib/fpdf/filters/FilterLZW_FPDI.php	(revision 5261)
@@ -0,0 +1,33 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('FilterLZW.php');
+
+class FilterLZW_FPDI extends FilterLZW {
+
+    var $fpdi;
+
+    function FilterLZW_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+    
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
Index: /lib/fpdf/filters/FilterPredictor.php
===================================================================
--- /lib/fpdf/filters/FilterPredictor.php	(revision 5261)
+++ /lib/fpdf/filters/FilterPredictor.php	(revision 5261)
@@ -0,0 +1,377 @@
+<?php
+// +---------------------------------------------------------------------+
+// | FPDI PDF-Parser v.1.0.3                                             |
+// | Copyright (c) 2009-2010 Setasign - Jan Slabon                       |
+// +---------------------------------------------------------------------+
+// | This source file is subject to the                                  |
+// |    "FPDI PDF-Parser Commercial Developer License Agreement"         |
+// | that is bundled with this package in the file                       |
+// |    "FPDI-PDF-Parser-License.pdf"                                    |
+// +---------------------------------------------------------------------+
+// | Homepage: http://www.setasign.de                                    |
+// | E-mail: support@setasign.de                                         |
+// +---------------------------------------------------------------------+
+
+$__tmp = version_compare(phpversion(), "5") == -1 ? array('FilterPredictor') : array('FilterPredictor', false);
+if (!call_user_func_array('class_exists', $__tmp)) {
+    
+    class FilterPredictor {
+        /**
+         * Whether or not to only write algorithm byte if predictor value is 15.
+         * If set to <i>true</i>, the algorithm byte is written at the beginning
+         * of every line for all PNG predictors. If set to <i>false</i>, this
+         * byte is only written for optimum png compression, which can vary
+         * the compression algorithm for each row.
+         */
+        var $alwaysWritePredictorByte = true;
+    
+        function error($msg) {
+            die($msg);
+        }
+        
+        /**
+         * Value prediction using the Alan W. Paeth algorithm
+         * 
+         * @param $left The value to the left of the processed data entry.
+         * @param $above The value above the processed data entry.
+         * @param $upperLeft The value to the upper left of the processed data entry.
+         * @return Returns the prediction value according to the Peath algorithm
+         */
+        function paethPredictor($left, $above, $upperLeft) {
+            // initial estimate
+            $p = $left + $above - $upperLeft;
+            
+            // distances to a, b, c
+            $pLeft      = abs($p - $left);
+            $pAbove     = abs($p - $above);
+            $pUpperLeft = abs($p - $upperLeft);
+            
+            // return nearest of $left, $above, $upperLeft,
+            // breaking ties in order $left, $above, $upperLeft.
+            if ($pLeft <= $pAbove && $pLeft <= $pUpperLeft) {
+                return $left;
+            } else if ($pAbove <= $pUpperLeft) {
+                return $above;
+            } else {
+                return $upperLeft;
+            }
+        }
+    
+        /**
+         * Decodes data using a predictor function.
+         * 
+         * @param data (in) The data area to be decoded.
+         * @param predictor (in) The predictor used to encode the data.
+         * @param columns (in) The number of columns if the encoded data is a bitmap.
+         * @param colors (in) The number of colors if the encoded data is a bitmap.
+         * @param bitsPerComponent (in) The number of bits per component/element of the encoded data.
+         * @return Returns the decoded data.
+         */
+        function decode($data, $predictor=0, $columns=null, $colors=null, $bitsPerComponent=null) {        
+            // no predictor 
+            if ($predictor == 1) {
+                return $data;
+                
+            } else if ($predictor == 2) { // TIFF 
+    		    // not supported
+                return $this->error("TIFF predictor not yet supported");
+                  
+            } else if ($predictor >= 10 && $predictor <= 15) { // PNG predictors
+    				
+                // make sure parameters contain valid values   
+                $columns          = is_null($columns)          ? 1 : (int)$columns;
+                $colors           = is_null($colors)           ? 1 : (int)$colors;
+                $bitsPerComponent = is_null($bitsPerComponent) ? 8 : (int)$bitsPerComponent;
+        
+                // compute bitmap parameters
+                $bytesPerPixel = $colors * $bitsPerComponent / 8;
+                $bytesPerRow = (int) (($colors * $columns * $bitsPerComponent + 7) / 8);
+    
+                // the return (decoded) data
+                $out = '';
+    
+                // some variables needed to process the data				
+                $currRowString = '';	// the currently read row as a string
+                $offset = 0; // the offset in the source data ($data) while reading/decoding it
+                $currRowData = array(); // the data of the current row
+                $priorRowData = array_fill(0, $bytesPerRow, 0); // the data of the previous row
+    						
+    			// initialize the predictor for the current row
+    			$currPredictor = $predictor;
+    						
+                // read until EOF
+                $eof = false;
+                while (!$eof)
+                {
+                    // read first algorithm byte for PNG predictor 15
+                    if ($this->alwaysWritePredictorByte || $predictor == 15) {
+                        $currPredictor = ord(substr($data, $offset++, 1));
+                        if (!is_null($currPredictor)) {
+                            $currPredictor += 10;
+                        } else {
+                            $eof = true;
+                        }								  
+                    }
+    								
+    				// read row
+                    if (!$eof) {
+                        $currRowString = substr($data, $offset, $bytesPerRow);
+                        if (strlen($currRowString) != $bytesPerRow) {
+                            $eof = true;
+    						if (strlen($currRowString) != 0) {
+    						    return $this->error("Could not read complete row while decoding data");
+    						}
+                        }
+    								
+                        // process row
+                        if (!$eof) {
+                            // copy current row into an array
+                            $currRowData = array();
+                            $currRowLength = strlen($currRowString);
+                            for ($i = 0; $i < $currRowLength; $i++) {
+                                $currRowData[$i] = ord($currRowString[$i]);
+                            }
+                            
+                            // process row using the selected predictor
+                            switch ($currPredictor) {
+                                case 10: // PNG_FILTER_NONE
+                                    break;
+                                    
+                                case 11: // PNG_FILTER_SUB (left)
+                                    for ($i = $bytesPerPixel; $i < $bytesPerRow; $i++) {
+                                        $currRowData[$i] = ($currRowData[$i] + $currRowData[$i - $bytesPerPixel]) & 0xff;
+                                    }
+                                    break;
+                                    
+                                case 12: // PNG_FILTER_UP (previous row)
+                                    for ($i = 0; $i < $bytesPerRow; $i++) {
+                                        $currRowData[$i] = ($currRowData[$i] + $priorRowData[$i]) & 0xff;
+                                    }
+                                    break;
+                                    
+                                case 13: // PNG_FILTER_AVERAGE (to the left and previous row)
+                                    for ($i = 0; $i < $bytesPerPixel; $i++) {
+                                        $currRowData[$i] = ($currRowData[$i] + floor($priorRowData[$i] / 2)) & 0xff;
+                                    }
+                                    for ($i = $bytesPerPixel; $i < $bytesPerRow; $i++) {
+                                        $currRowData[$i] = ($currRowData[$i] + floor(($currRowData[$i - $bytesPerPixel] + $priorRowData[$i])/2)) & 0xff;
+                                    }
+                                    break;
+                                    
+                                case 14: // PNG_FILTER_PAETH
+                                    for ($i = 0; $i < $bytesPerRow; $i++) {
+                                        // execute peath predictor
+                                        $left      = ($i < $bytesPerPixel) ? 0 : $currRowData[$i - $bytesPerPixel];
+                                        $above     = $priorRowData[$i];
+                                        $upperLeft = ($i < $bytesPerPixel) ? 0 : $priorRowData[$i - $bytesPerPixel];
+                                        $predicted = $this->paethPredictor($left, $above, $upperLeft);
+                                        
+                                        // encode data
+                                        $currRowData[$i] = ($currRowData[$i] + $predicted) & 0xff;
+                                    }
+                                    break;
+                                    
+                                default:
+                                    // error PNG filter unknown.
+                                    return $this->error('unrecognized png predictor ('.$currPredictor.') while decoding data');
+                                    break;
+                                    
+                            } // switch on current PNG predictor
+    
+                            // copy data to output
+                            for ($i = 0; $i < $currRowLength; $i++) {
+                                $out .= chr($currRowData[$i]);
+                            }
+    
+                            // copy current row to previous row
+                            $priorRowData = $currRowData;
+    						
+                            // offset to next row
+                            $offset += $bytesPerRow;
+                        } // if not eof
+                    } // if not eof								
+                } // while reading data
+    
+                // return decoded data
+                return $out;
+    
+            } else { // if PNG predictor
+                return $this->error("unrecognized predictor: ".$predictor);
+            }
+        } // function decode
+     
+     
+    
+    
+        /**
+         * Encodes data using a predictor function.
+         * 
+         * @param data (in) The data area to be encoded.
+         * @param predictor (in) The predictor to be used to encode the data.
+         * @param columns (in) The number of columns if the data to be encoded is a bitmap.
+         * @param colors (in) The number of colors if the data to be encoded is a bitmap.
+         * @param bitsPerComponent (in) The number of bits per component/element of the data to be encoded.
+         * @return Returns the encoded data.
+         */
+        function encode($data, $predictor=0, $columns=null, $colors=null, $bitsPerComponent=null) {
+            
+            if ($predictor == 1) { // no predictor 
+                return $data;
+                
+            } else if ($predictor == 2) {// TIFF 
+                // not supported
+                return $this->error("TIFF predictor not yet supported");
+                          
+            } else if ($predictor >= 10 && $predictor <= 15) { // PNG predictors
+                // make sure parameters contain valid values   
+                $columns          = is_null($columns)          ? 1 : (int)$columns;
+                $colors           = is_null($colors)           ? 1 : (int)$colors;
+                $bitsPerComponent = is_null($bitsPerComponent) ? 8 : (int)$bitsPerComponent;
+            
+                // compute bitmap parameters
+                $bytesPerPixel = $colors * $bitsPerComponent / 8;
+                $bytesPerRow = (int) (($colors * $columns * $bitsPerComponent + 7) / 8);
+            
+                // the return (encoded) data
+                $out = '';
+            
+                // some variables needed to process the data				
+                $currRowString = '';	// the currently read row as a string
+                $offset = 0; // the offset in the source data ($data) while reading/decoding it
+                $currRowData = array(); // the data of the current row
+                $priorRowData = array_fill(0, $bytesPerRow, 0); // the data of the previous row
+            
+                // read the filter type byte and a whole row of data
+                while ( ($currRowString = substr($data, $offset, $bytesPerRow)) && 
+                    strlen($currRowString) == $bytesPerRow) {
+                    // copy current row into an array
+                    $currRowData = array();
+                    $currRowLength = strlen($currRowString);
+                    for ($i = 0; $i < $currRowLength; $i++) {
+                        $currRowData[$i] = ord($currRowString[$i]);
+                    }
+                    
+                    // select predictor
+                    $currPredictor = $predictor;
+                    
+                    // find optimal predictor
+                    if ($predictor == 15) {
+                        // compute a value for the SUB predictor
+                        $subPredictor = 0;
+                        for ($i = $bytesPerRow-1; $i >=$bytesPerPixel ; $i--) {
+                            $subPredictor += abs($currRowData[$i] - $currRowData[$i - $bytesPerPixel]);
+                        }
+                    
+                        // compute a value for the UP predictor
+                        $upPredictor = 0;
+                        for ($i = 0; $i < $bytesPerRow; $i++) {
+                            $upPredictor += abs($currRowData[$i] - $priorRowData[$i]);
+                        }
+                    
+                        // compute a value for the AVERAGE predictor
+                        $averagePredictor = 0;
+                        for ($i = $bytesPerRow-1; $i >=$bytesPerPixel ; $i--) {
+                            $averagePredictor += abs($currRowData[$i] - floor(($currRowData[$i - $bytesPerPixel] + $priorRowData[$i])/2));
+                        }
+                        
+                        for ($i = 0; $i < $bytesPerPixel; $i++) {
+                            $averagePredictor += abs($currRowData[$i] - floor($priorRowData[$i] / 2));
+                        }
+                    
+                        // compute a value for the PEATH predictor
+                        $peathPredictor = 0;
+                        for ($i = $bytesPerRow-1; $i >=0 ; $i--) {
+                            $left      = ($i<$bytesPerPixel)?0:$currRowData[$i - $bytesPerPixel];
+                            $above     = $priorRowData[$i];
+                            $upperLeft = ($i<$bytesPerPixel)?0:$priorRowData[$i - $bytesPerPixel];
+                            $predicted = $this->paethPredictor($left,$above,$upperLeft);
+                            $peathPredictor += abs($currRowData[$i] - $predicted);
+                        }
+                    
+                        // select the best predictor
+                        if ($subPredictor <= $upPredictor && $subPredictor <= $averagePredictor && $subPredictor <= $peathPredictor) {
+                            $currPredictor = 11;
+                        } else if ($upPredictor <= $subPredictor && $upPredictor <= $averagePredictor && $upPredictor <= $peathPredictor) {
+                            $currPredictor = 12;
+                        } else if ($averagePredictor <= $subPredictor && $averagePredictor <= $upPredictor && $averagePredictor <= $peathPredictor) {
+                            $currPredictor = 13;
+                        } else {
+                            $currPredictor = 14;
+                        }
+                    }
+                    
+                    // process row using the selected filter
+                    switch ($currPredictor) {
+                        case 10: // PNG_FILTER_NONE
+                            break;
+                        
+                        case 11: // PNG_FILTER_SUB (left)
+                            for ($i = $bytesPerRow-1; $i >=$bytesPerPixel ; $i--) {
+                                $currRowData[$i] = ($currRowData[$i] - $currRowData[$i - $bytesPerPixel]) & 0xff;
+                            }
+                            break;
+                            
+                        case 12: // PNG_FILTER_UP (previous row)
+                            for ($i = 0; $i < $bytesPerRow; $i++) {
+                                $currRowData[$i] = ($currRowData[$i] - $priorRowData[$i]) & 0xff;
+                            }
+                            break;
+                            
+                        case 13: // PNG_FILTER_AVERAGE (to the left and previous row)
+                            for ($i = $bytesPerRow-1; $i >=$bytesPerPixel ; $i--) {
+                                $currRowData[$i] = ($currRowData[$i] - floor(($currRowData[$i - $bytesPerPixel] + $priorRowData[$i])/2) & 0xff);
+                            }
+                            for ($i = 0; $i < $bytesPerPixel; $i++) {
+                                $currRowData[$i] = ($currRowData[$i] - floor($priorRowData[$i] / 2)) & 0xff;
+                            }
+                            break;
+                            
+                        case 14: // PNG_FILTER_PAETH
+                            for ($i = $bytesPerRow-1; $i >=0 ; $i--) {
+                                // execute peath predictor
+                                $left      = ($i<$bytesPerPixel)?0:$currRowData[$i - $bytesPerPixel];
+                                $above     = $priorRowData[$i];
+                                $upperLeft = ($i<$bytesPerPixel)?0:$priorRowData[$i - $bytesPerPixel];
+                                $predicted = $this->paethPredictor($left,$above,$upperLeft);
+                                
+                                // encode data
+                                $currRowData[$i] = ($currRowData[$i] - $predicted) & 0xff;
+                            }
+                        break;
+                        
+                        default:
+                            // error PNG filter unknown.
+                            return $this->error('unrecognized png predictor ('.$currPredictor.') while encoding data');
+                            break;
+                    
+                    } // switch on current PNG predictor						
+                    
+                    // copy data to output
+                    if ($this->alwaysWritePredictorByte || $predictor == 15) {
+                        $out .= chr($currPredictor-10);
+                    }
+                    for ($i = 0; $i < $currRowLength; $i++) {
+                        $out .= chr($currRowData[$i]);
+                    }
+                    
+                    // copy current row to previous row
+                    for ($i = 0; $i < $currRowLength; $i++) {
+                        $priorRowData[$i] = ord($currRowString[$i]);
+                    }
+                    
+                    // offset to next row
+                    $offset += $bytesPerRow;
+                    
+                } // while reading data
+                
+                // return encoded data
+                return $out;
+            
+            } else { // if PNG predictor
+                return $this->error("unrecognized predictor: ".$predictor);
+            }
+        } // function encode
+    } // class Predictor
+}
+
+unset($__tmp);
Index: /lib/fpdf/filters/FilterPredictor_FPDI.php
===================================================================
--- /lib/fpdf/filters/FilterPredictor_FPDI.php	(revision 5261)
+++ /lib/fpdf/filters/FilterPredictor_FPDI.php	(revision 5261)
@@ -0,0 +1,28 @@
+<?php
+// +---------------------------------------------------------------------+
+// | FPDI PDF-Parser v.1.0.3                                             |
+// | Copyright (c) 2009 Setasign - Jan Slabon                            |
+// +---------------------------------------------------------------------+
+// | This source file is subject to the                                  |
+// |    "FPDI PDF-Parser Commercial Developer License Agreement"         |
+// | that is bundled with this package in the file                       |
+// |    "FPDI-PDF-Parser-License.pdf"                                    |
+// +---------------------------------------------------------------------+
+// | Homepage: http://www.setasign.de                                    |
+// | E-mail: support@setasign.de                                         |
+// +---------------------------------------------------------------------+
+
+require_once('FilterPredictor.php');
+
+class FilterPredictor_FPDI extends FilterPredictor {
+    
+    var $fpdi;
+
+    function FilterPredictor_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+    
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
Index: /lib/fpdf/font/courier.php
===================================================================
--- /lib/fpdf/font/courier.php	(revision 5261)
+++ /lib/fpdf/font/courier.php	(revision 5261)
@@ -0,0 +1,8 @@
+<?php
+$type = 'Core';
+$name = 'Courier';
+$up = -100;
+$ut = 50;
+for($i=0;$i<=255;$i++)
+	$cw[chr($i)] = 600;
+?>
Index: /lib/fpdf/font/courierb.php
===================================================================
--- /lib/fpdf/font/courierb.php	(revision 5261)
+++ /lib/fpdf/font/courierb.php	(revision 5261)
@@ -0,0 +1,8 @@
+<?php
+$type = 'Core';
+$name = 'Courier-Bold';
+$up = -100;
+$ut = 50;
+for($i=0;$i<=255;$i++)
+	$cw[chr($i)] = 600;
+?>
Index: /lib/fpdf/font/courierbi.php
===================================================================
--- /lib/fpdf/font/courierbi.php	(revision 5261)
+++ /lib/fpdf/font/courierbi.php	(revision 5261)
@@ -0,0 +1,8 @@
+<?php
+$type = 'Core';
+$name = 'Courier-BoldOblique';
+$up = -100;
+$ut = 50;
+for($i=0;$i<=255;$i++)
+	$cw[chr($i)] = 600;
+?>
Index: /lib/fpdf/font/courieri.php
===================================================================
--- /lib/fpdf/font/courieri.php	(revision 5261)
+++ /lib/fpdf/font/courieri.php	(revision 5261)
@@ -0,0 +1,8 @@
+<?php
+$type = 'Core';
+$name = 'Courier-Oblique';
+$up = -100;
+$ut = 50;
+for($i=0;$i<=255;$i++)
+	$cw[chr($i)] = 600;
+?>
Index: /lib/fpdf/font/helvetica.php
===================================================================
--- /lib/fpdf/font/helvetica.php	(revision 5261)
+++ /lib/fpdf/font/helvetica.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Helvetica';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
+	'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
+	'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
+	chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
+	chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
+?>
Index: /lib/fpdf/font/helveticab.php
===================================================================
--- /lib/fpdf/font/helveticab.php	(revision 5261)
+++ /lib/fpdf/font/helveticab.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Helvetica-Bold';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
+	'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
+	'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
+	chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
+?>
Index: /lib/fpdf/font/helveticabi.php
===================================================================
--- /lib/fpdf/font/helveticabi.php	(revision 5261)
+++ /lib/fpdf/font/helveticabi.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Helvetica-BoldOblique';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
+	'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
+	'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
+	chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
+?>
Index: /lib/fpdf/font/helveticai.php
===================================================================
--- /lib/fpdf/font/helveticai.php	(revision 5261)
+++ /lib/fpdf/font/helveticai.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Helvetica-Oblique';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
+	'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
+	'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
+	chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
+	chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
+?>
Index: /lib/fpdf/font/makefont/cp1250.map
===================================================================
--- /lib/fpdf/font/makefont/cp1250.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1250.map	(revision 5261)
@@ -0,0 +1,251 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+015A Sacute
+!8D U+0164 Tcaron
+!8E U+017D Zcaron
+!8F U+0179 Zacute
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+015B sacute
+!9D U+0165 tcaron
+!9E U+017E zcaron
+!9F U+017A zacute
+!A0 U+00A0 space
+!A1 U+02C7 caron
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+0104 Aogonek
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+015E Scedilla
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+0105 aogonek
+!BA U+015F scedilla
+!BB U+00BB guillemotright
+!BC U+013D Lcaron
+!BD U+02DD hungarumlaut
+!BE U+013E lcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcommaaccent
+!FF U+02D9 dotaccent
Index: /lib/fpdf/font/makefont/cp1251.map
===================================================================
--- /lib/fpdf/font/makefont/cp1251.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1251.map	(revision 5261)
@@ -0,0 +1,255 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0402 afii10051
+!81 U+0403 afii10052
+!82 U+201A quotesinglbase
+!83 U+0453 afii10100
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+20AC Euro
+!89 U+2030 perthousand
+!8A U+0409 afii10058
+!8B U+2039 guilsinglleft
+!8C U+040A afii10059
+!8D U+040C afii10061
+!8E U+040B afii10060
+!8F U+040F afii10145
+!90 U+0452 afii10099
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0459 afii10106
+!9B U+203A guilsinglright
+!9C U+045A afii10107
+!9D U+045C afii10109
+!9E U+045B afii10108
+!9F U+045F afii10193
+!A0 U+00A0 space
+!A1 U+040E afii10062
+!A2 U+045E afii10110
+!A3 U+0408 afii10057
+!A4 U+00A4 currency
+!A5 U+0490 afii10050
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+0401 afii10023
+!A9 U+00A9 copyright
+!AA U+0404 afii10053
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+0407 afii10056
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+0406 afii10055
+!B3 U+0456 afii10103
+!B4 U+0491 afii10098
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+0451 afii10071
+!B9 U+2116 afii61352
+!BA U+0454 afii10101
+!BB U+00BB guillemotright
+!BC U+0458 afii10105
+!BD U+0405 afii10054
+!BE U+0455 afii10102
+!BF U+0457 afii10104
+!C0 U+0410 afii10017
+!C1 U+0411 afii10018
+!C2 U+0412 afii10019
+!C3 U+0413 afii10020
+!C4 U+0414 afii10021
+!C5 U+0415 afii10022
+!C6 U+0416 afii10024
+!C7 U+0417 afii10025
+!C8 U+0418 afii10026
+!C9 U+0419 afii10027
+!CA U+041A afii10028
+!CB U+041B afii10029
+!CC U+041C afii10030
+!CD U+041D afii10031
+!CE U+041E afii10032
+!CF U+041F afii10033
+!D0 U+0420 afii10034
+!D1 U+0421 afii10035
+!D2 U+0422 afii10036
+!D3 U+0423 afii10037
+!D4 U+0424 afii10038
+!D5 U+0425 afii10039
+!D6 U+0426 afii10040
+!D7 U+0427 afii10041
+!D8 U+0428 afii10042
+!D9 U+0429 afii10043
+!DA U+042A afii10044
+!DB U+042B afii10045
+!DC U+042C afii10046
+!DD U+042D afii10047
+!DE U+042E afii10048
+!DF U+042F afii10049
+!E0 U+0430 afii10065
+!E1 U+0431 afii10066
+!E2 U+0432 afii10067
+!E3 U+0433 afii10068
+!E4 U+0434 afii10069
+!E5 U+0435 afii10070
+!E6 U+0436 afii10072
+!E7 U+0437 afii10073
+!E8 U+0438 afii10074
+!E9 U+0439 afii10075
+!EA U+043A afii10076
+!EB U+043B afii10077
+!EC U+043C afii10078
+!ED U+043D afii10079
+!EE U+043E afii10080
+!EF U+043F afii10081
+!F0 U+0440 afii10082
+!F1 U+0441 afii10083
+!F2 U+0442 afii10084
+!F3 U+0443 afii10085
+!F4 U+0444 afii10086
+!F5 U+0445 afii10087
+!F6 U+0446 afii10088
+!F7 U+0447 afii10089
+!F8 U+0448 afii10090
+!F9 U+0449 afii10091
+!FA U+044A afii10092
+!FB U+044B afii10093
+!FC U+044C afii10094
+!FD U+044D afii10095
+!FE U+044E afii10096
+!FF U+044F afii10097
Index: /lib/fpdf/font/makefont/cp1252.map
===================================================================
--- /lib/fpdf/font/makefont/cp1252.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1252.map	(revision 5261)
@@ -0,0 +1,251 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!8E U+017D Zcaron
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9E U+017E zcaron
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/cp1253.map
===================================================================
--- /lib/fpdf/font/makefont/cp1253.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1253.map	(revision 5261)
@@ -0,0 +1,239 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!A0 U+00A0 space
+!A1 U+0385 dieresistonos
+!A2 U+0386 Alphatonos
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+2015 afii00208
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+0384 tonos
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+0388 Epsilontonos
+!B9 U+0389 Etatonos
+!BA U+038A Iotatonos
+!BB U+00BB guillemotright
+!BC U+038C Omicrontonos
+!BD U+00BD onehalf
+!BE U+038E Upsilontonos
+!BF U+038F Omegatonos
+!C0 U+0390 iotadieresistonos
+!C1 U+0391 Alpha
+!C2 U+0392 Beta
+!C3 U+0393 Gamma
+!C4 U+0394 Delta
+!C5 U+0395 Epsilon
+!C6 U+0396 Zeta
+!C7 U+0397 Eta
+!C8 U+0398 Theta
+!C9 U+0399 Iota
+!CA U+039A Kappa
+!CB U+039B Lambda
+!CC U+039C Mu
+!CD U+039D Nu
+!CE U+039E Xi
+!CF U+039F Omicron
+!D0 U+03A0 Pi
+!D1 U+03A1 Rho
+!D3 U+03A3 Sigma
+!D4 U+03A4 Tau
+!D5 U+03A5 Upsilon
+!D6 U+03A6 Phi
+!D7 U+03A7 Chi
+!D8 U+03A8 Psi
+!D9 U+03A9 Omega
+!DA U+03AA Iotadieresis
+!DB U+03AB Upsilondieresis
+!DC U+03AC alphatonos
+!DD U+03AD epsilontonos
+!DE U+03AE etatonos
+!DF U+03AF iotatonos
+!E0 U+03B0 upsilondieresistonos
+!E1 U+03B1 alpha
+!E2 U+03B2 beta
+!E3 U+03B3 gamma
+!E4 U+03B4 delta
+!E5 U+03B5 epsilon
+!E6 U+03B6 zeta
+!E7 U+03B7 eta
+!E8 U+03B8 theta
+!E9 U+03B9 iota
+!EA U+03BA kappa
+!EB U+03BB lambda
+!EC U+03BC mu
+!ED U+03BD nu
+!EE U+03BE xi
+!EF U+03BF omicron
+!F0 U+03C0 pi
+!F1 U+03C1 rho
+!F2 U+03C2 sigma1
+!F3 U+03C3 sigma
+!F4 U+03C4 tau
+!F5 U+03C5 upsilon
+!F6 U+03C6 phi
+!F7 U+03C7 chi
+!F8 U+03C8 psi
+!F9 U+03C9 omega
+!FA U+03CA iotadieresis
+!FB U+03CB upsilondieresis
+!FC U+03CC omicrontonos
+!FD U+03CD upsilontonos
+!FE U+03CE omegatonos
Index: /lib/fpdf/font/makefont/cp1254.map
===================================================================
--- /lib/fpdf/font/makefont/cp1254.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1254.map	(revision 5261)
@@ -0,0 +1,249 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+011E Gbreve
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0130 Idotaccent
+!DE U+015E Scedilla
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+011F gbreve
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0131 dotlessi
+!FE U+015F scedilla
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/cp1255.map
===================================================================
--- /lib/fpdf/font/makefont/cp1255.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1255.map	(revision 5261)
@@ -0,0 +1,233 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+20AA afii57636
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00D7 multiply
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD sfthyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 middot
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00F7 divide
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+05B0 afii57799
+!C1 U+05B1 afii57801
+!C2 U+05B2 afii57800
+!C3 U+05B3 afii57802
+!C4 U+05B4 afii57793
+!C5 U+05B5 afii57794
+!C6 U+05B6 afii57795
+!C7 U+05B7 afii57798
+!C8 U+05B8 afii57797
+!C9 U+05B9 afii57806
+!CB U+05BB afii57796
+!CC U+05BC afii57807
+!CD U+05BD afii57839
+!CE U+05BE afii57645
+!CF U+05BF afii57841
+!D0 U+05C0 afii57842
+!D1 U+05C1 afii57804
+!D2 U+05C2 afii57803
+!D3 U+05C3 afii57658
+!D4 U+05F0 afii57716
+!D5 U+05F1 afii57717
+!D6 U+05F2 afii57718
+!D7 U+05F3 gereshhebrew
+!D8 U+05F4 gershayimhebrew
+!E0 U+05D0 afii57664
+!E1 U+05D1 afii57665
+!E2 U+05D2 afii57666
+!E3 U+05D3 afii57667
+!E4 U+05D4 afii57668
+!E5 U+05D5 afii57669
+!E6 U+05D6 afii57670
+!E7 U+05D7 afii57671
+!E8 U+05D8 afii57672
+!E9 U+05D9 afii57673
+!EA U+05DA afii57674
+!EB U+05DB afii57675
+!EC U+05DC afii57676
+!ED U+05DD afii57677
+!EE U+05DE afii57678
+!EF U+05DF afii57679
+!F0 U+05E0 afii57680
+!F1 U+05E1 afii57681
+!F2 U+05E2 afii57682
+!F3 U+05E3 afii57683
+!F4 U+05E4 afii57684
+!F5 U+05E5 afii57685
+!F6 U+05E6 afii57686
+!F7 U+05E7 afii57687
+!F8 U+05E8 afii57688
+!F9 U+05E9 afii57689
+!FA U+05EA afii57690
+!FD U+200E afii299
+!FE U+200F afii300
Index: /lib/fpdf/font/makefont/cp1257.map
===================================================================
--- /lib/fpdf/font/makefont/cp1257.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1257.map	(revision 5261)
@@ -0,0 +1,244 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!8D U+00A8 dieresis
+!8E U+02C7 caron
+!8F U+00B8 cedilla
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!9D U+00AF macron
+!9E U+02DB ogonek
+!A0 U+00A0 space
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00D8 Oslash
+!A9 U+00A9 copyright
+!AA U+0156 Rcommaaccent
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00C6 AE
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00F8 oslash
+!B9 U+00B9 onesuperior
+!BA U+0157 rcommaaccent
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00E6 ae
+!C0 U+0104 Aogonek
+!C1 U+012E Iogonek
+!C2 U+0100 Amacron
+!C3 U+0106 Cacute
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+0118 Eogonek
+!C7 U+0112 Emacron
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0179 Zacute
+!CB U+0116 Edotaccent
+!CC U+0122 Gcommaaccent
+!CD U+0136 Kcommaaccent
+!CE U+012A Imacron
+!CF U+013B Lcommaaccent
+!D0 U+0160 Scaron
+!D1 U+0143 Nacute
+!D2 U+0145 Ncommaaccent
+!D3 U+00D3 Oacute
+!D4 U+014C Omacron
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0172 Uogonek
+!D9 U+0141 Lslash
+!DA U+015A Sacute
+!DB U+016A Umacron
+!DC U+00DC Udieresis
+!DD U+017B Zdotaccent
+!DE U+017D Zcaron
+!DF U+00DF germandbls
+!E0 U+0105 aogonek
+!E1 U+012F iogonek
+!E2 U+0101 amacron
+!E3 U+0107 cacute
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+0119 eogonek
+!E7 U+0113 emacron
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+017A zacute
+!EB U+0117 edotaccent
+!EC U+0123 gcommaaccent
+!ED U+0137 kcommaaccent
+!EE U+012B imacron
+!EF U+013C lcommaaccent
+!F0 U+0161 scaron
+!F1 U+0144 nacute
+!F2 U+0146 ncommaaccent
+!F3 U+00F3 oacute
+!F4 U+014D omacron
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0173 uogonek
+!F9 U+0142 lslash
+!FA U+015B sacute
+!FB U+016B umacron
+!FC U+00FC udieresis
+!FD U+017C zdotaccent
+!FE U+017E zcaron
+!FF U+02D9 dotaccent
Index: /lib/fpdf/font/makefont/cp1258.map
===================================================================
--- /lib/fpdf/font/makefont/cp1258.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp1258.map	(revision 5261)
@@ -0,0 +1,247 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+0300 gravecomb
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+0110 Dcroat
+!D1 U+00D1 Ntilde
+!D2 U+0309 hookabovecomb
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+01A0 Ohorn
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+01AF Uhorn
+!DE U+0303 tildecomb
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+0301 acutecomb
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+0111 dcroat
+!F1 U+00F1 ntilde
+!F2 U+0323 dotbelowcomb
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+01A1 ohorn
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+01B0 uhorn
+!FE U+20AB dong
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/cp874.map
===================================================================
--- /lib/fpdf/font/makefont/cp874.map	(revision 5261)
+++ /lib/fpdf/font/makefont/cp874.map	(revision 5261)
@@ -0,0 +1,225 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!85 U+2026 ellipsis
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!A0 U+00A0 space
+!A1 U+0E01 kokaithai
+!A2 U+0E02 khokhaithai
+!A3 U+0E03 khokhuatthai
+!A4 U+0E04 khokhwaithai
+!A5 U+0E05 khokhonthai
+!A6 U+0E06 khorakhangthai
+!A7 U+0E07 ngonguthai
+!A8 U+0E08 chochanthai
+!A9 U+0E09 chochingthai
+!AA U+0E0A chochangthai
+!AB U+0E0B sosothai
+!AC U+0E0C chochoethai
+!AD U+0E0D yoyingthai
+!AE U+0E0E dochadathai
+!AF U+0E0F topatakthai
+!B0 U+0E10 thothanthai
+!B1 U+0E11 thonangmonthothai
+!B2 U+0E12 thophuthaothai
+!B3 U+0E13 nonenthai
+!B4 U+0E14 dodekthai
+!B5 U+0E15 totaothai
+!B6 U+0E16 thothungthai
+!B7 U+0E17 thothahanthai
+!B8 U+0E18 thothongthai
+!B9 U+0E19 nonuthai
+!BA U+0E1A bobaimaithai
+!BB U+0E1B poplathai
+!BC U+0E1C phophungthai
+!BD U+0E1D fofathai
+!BE U+0E1E phophanthai
+!BF U+0E1F fofanthai
+!C0 U+0E20 phosamphaothai
+!C1 U+0E21 momathai
+!C2 U+0E22 yoyakthai
+!C3 U+0E23 roruathai
+!C4 U+0E24 ruthai
+!C5 U+0E25 lolingthai
+!C6 U+0E26 luthai
+!C7 U+0E27 wowaenthai
+!C8 U+0E28 sosalathai
+!C9 U+0E29 sorusithai
+!CA U+0E2A sosuathai
+!CB U+0E2B hohipthai
+!CC U+0E2C lochulathai
+!CD U+0E2D oangthai
+!CE U+0E2E honokhukthai
+!CF U+0E2F paiyannoithai
+!D0 U+0E30 saraathai
+!D1 U+0E31 maihanakatthai
+!D2 U+0E32 saraaathai
+!D3 U+0E33 saraamthai
+!D4 U+0E34 saraithai
+!D5 U+0E35 saraiithai
+!D6 U+0E36 sarauethai
+!D7 U+0E37 saraueethai
+!D8 U+0E38 sarauthai
+!D9 U+0E39 sarauuthai
+!DA U+0E3A phinthuthai
+!DF U+0E3F bahtthai
+!E0 U+0E40 saraethai
+!E1 U+0E41 saraaethai
+!E2 U+0E42 saraothai
+!E3 U+0E43 saraaimaimuanthai
+!E4 U+0E44 saraaimaimalaithai
+!E5 U+0E45 lakkhangyaothai
+!E6 U+0E46 maiyamokthai
+!E7 U+0E47 maitaikhuthai
+!E8 U+0E48 maiekthai
+!E9 U+0E49 maithothai
+!EA U+0E4A maitrithai
+!EB U+0E4B maichattawathai
+!EC U+0E4C thanthakhatthai
+!ED U+0E4D nikhahitthai
+!EE U+0E4E yamakkanthai
+!EF U+0E4F fongmanthai
+!F0 U+0E50 zerothai
+!F1 U+0E51 onethai
+!F2 U+0E52 twothai
+!F3 U+0E53 threethai
+!F4 U+0E54 fourthai
+!F5 U+0E55 fivethai
+!F6 U+0E56 sixthai
+!F7 U+0E57 seventhai
+!F8 U+0E58 eightthai
+!F9 U+0E59 ninethai
+!FA U+0E5A angkhankhuthai
+!FB U+0E5B khomutthai
Index: /lib/fpdf/font/makefont/iso-8859-1.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-1.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-1.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/iso-8859-11.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-11.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-11.map	(revision 5261)
@@ -0,0 +1,248 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0E01 kokaithai
+!A2 U+0E02 khokhaithai
+!A3 U+0E03 khokhuatthai
+!A4 U+0E04 khokhwaithai
+!A5 U+0E05 khokhonthai
+!A6 U+0E06 khorakhangthai
+!A7 U+0E07 ngonguthai
+!A8 U+0E08 chochanthai
+!A9 U+0E09 chochingthai
+!AA U+0E0A chochangthai
+!AB U+0E0B sosothai
+!AC U+0E0C chochoethai
+!AD U+0E0D yoyingthai
+!AE U+0E0E dochadathai
+!AF U+0E0F topatakthai
+!B0 U+0E10 thothanthai
+!B1 U+0E11 thonangmonthothai
+!B2 U+0E12 thophuthaothai
+!B3 U+0E13 nonenthai
+!B4 U+0E14 dodekthai
+!B5 U+0E15 totaothai
+!B6 U+0E16 thothungthai
+!B7 U+0E17 thothahanthai
+!B8 U+0E18 thothongthai
+!B9 U+0E19 nonuthai
+!BA U+0E1A bobaimaithai
+!BB U+0E1B poplathai
+!BC U+0E1C phophungthai
+!BD U+0E1D fofathai
+!BE U+0E1E phophanthai
+!BF U+0E1F fofanthai
+!C0 U+0E20 phosamphaothai
+!C1 U+0E21 momathai
+!C2 U+0E22 yoyakthai
+!C3 U+0E23 roruathai
+!C4 U+0E24 ruthai
+!C5 U+0E25 lolingthai
+!C6 U+0E26 luthai
+!C7 U+0E27 wowaenthai
+!C8 U+0E28 sosalathai
+!C9 U+0E29 sorusithai
+!CA U+0E2A sosuathai
+!CB U+0E2B hohipthai
+!CC U+0E2C lochulathai
+!CD U+0E2D oangthai
+!CE U+0E2E honokhukthai
+!CF U+0E2F paiyannoithai
+!D0 U+0E30 saraathai
+!D1 U+0E31 maihanakatthai
+!D2 U+0E32 saraaathai
+!D3 U+0E33 saraamthai
+!D4 U+0E34 saraithai
+!D5 U+0E35 saraiithai
+!D6 U+0E36 sarauethai
+!D7 U+0E37 saraueethai
+!D8 U+0E38 sarauthai
+!D9 U+0E39 sarauuthai
+!DA U+0E3A phinthuthai
+!DF U+0E3F bahtthai
+!E0 U+0E40 saraethai
+!E1 U+0E41 saraaethai
+!E2 U+0E42 saraothai
+!E3 U+0E43 saraaimaimuanthai
+!E4 U+0E44 saraaimaimalaithai
+!E5 U+0E45 lakkhangyaothai
+!E6 U+0E46 maiyamokthai
+!E7 U+0E47 maitaikhuthai
+!E8 U+0E48 maiekthai
+!E9 U+0E49 maithothai
+!EA U+0E4A maitrithai
+!EB U+0E4B maichattawathai
+!EC U+0E4C thanthakhatthai
+!ED U+0E4D nikhahitthai
+!EE U+0E4E yamakkanthai
+!EF U+0E4F fongmanthai
+!F0 U+0E50 zerothai
+!F1 U+0E51 onethai
+!F2 U+0E52 twothai
+!F3 U+0E53 threethai
+!F4 U+0E54 fourthai
+!F5 U+0E55 fivethai
+!F6 U+0E56 sixthai
+!F7 U+0E57 seventhai
+!F8 U+0E58 eightthai
+!F9 U+0E59 ninethai
+!FA U+0E5A angkhankhuthai
+!FB U+0E5B khomutthai
Index: /lib/fpdf/font/makefont/iso-8859-15.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-15.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-15.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+20AC Euro
+!A5 U+00A5 yen
+!A6 U+0160 Scaron
+!A7 U+00A7 section
+!A8 U+0161 scaron
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+017D Zcaron
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+017E zcaron
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+0152 OE
+!BD U+0153 oe
+!BE U+0178 Ydieresis
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/iso-8859-16.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-16.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-16.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+0105 aogonek
+!A3 U+0141 Lslash
+!A4 U+20AC Euro
+!A5 U+201E quotedblbase
+!A6 U+0160 Scaron
+!A7 U+00A7 section
+!A8 U+0161 scaron
+!A9 U+00A9 copyright
+!AA U+0218 Scommaaccent
+!AB U+00AB guillemotleft
+!AC U+0179 Zacute
+!AD U+00AD hyphen
+!AE U+017A zacute
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+010C Ccaron
+!B3 U+0142 lslash
+!B4 U+017D Zcaron
+!B5 U+201D quotedblright
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+017E zcaron
+!B9 U+010D ccaron
+!BA U+0219 scommaaccent
+!BB U+00BB guillemotright
+!BC U+0152 OE
+!BD U+0153 oe
+!BE U+0178 Ydieresis
+!BF U+017C zdotaccent
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0106 Cacute
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+015A Sacute
+!D8 U+0170 Uhungarumlaut
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0118 Eogonek
+!DE U+021A Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+0107 cacute
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+015B sacute
+!F8 U+0171 uhungarumlaut
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0119 eogonek
+!FE U+021B tcommaaccent
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/iso-8859-2.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-2.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-2.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+013D Lcaron
+!A6 U+015A Sacute
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+0160 Scaron
+!AA U+015E Scedilla
+!AB U+0164 Tcaron
+!AC U+0179 Zacute
+!AD U+00AD hyphen
+!AE U+017D Zcaron
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+0105 aogonek
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+013E lcaron
+!B6 U+015B sacute
+!B7 U+02C7 caron
+!B8 U+00B8 cedilla
+!B9 U+0161 scaron
+!BA U+015F scedilla
+!BB U+0165 tcaron
+!BC U+017A zacute
+!BD U+02DD hungarumlaut
+!BE U+017E zcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcommaaccent
+!FF U+02D9 dotaccent
Index: /lib/fpdf/font/makefont/iso-8859-4.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-4.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-4.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+0138 kgreenlandic
+!A3 U+0156 Rcommaaccent
+!A4 U+00A4 currency
+!A5 U+0128 Itilde
+!A6 U+013B Lcommaaccent
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+0160 Scaron
+!AA U+0112 Emacron
+!AB U+0122 Gcommaaccent
+!AC U+0166 Tbar
+!AD U+00AD hyphen
+!AE U+017D Zcaron
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+0105 aogonek
+!B2 U+02DB ogonek
+!B3 U+0157 rcommaaccent
+!B4 U+00B4 acute
+!B5 U+0129 itilde
+!B6 U+013C lcommaaccent
+!B7 U+02C7 caron
+!B8 U+00B8 cedilla
+!B9 U+0161 scaron
+!BA U+0113 emacron
+!BB U+0123 gcommaaccent
+!BC U+0167 tbar
+!BD U+014A Eng
+!BE U+017E zcaron
+!BF U+014B eng
+!C0 U+0100 Amacron
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+012E Iogonek
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+0116 Edotaccent
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+012A Imacron
+!D0 U+0110 Dcroat
+!D1 U+0145 Ncommaaccent
+!D2 U+014C Omacron
+!D3 U+0136 Kcommaaccent
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+0172 Uogonek
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0168 Utilde
+!DE U+016A Umacron
+!DF U+00DF germandbls
+!E0 U+0101 amacron
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+012F iogonek
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+0117 edotaccent
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+012B imacron
+!F0 U+0111 dcroat
+!F1 U+0146 ncommaaccent
+!F2 U+014D omacron
+!F3 U+0137 kcommaaccent
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+0173 uogonek
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0169 utilde
+!FE U+016B umacron
+!FF U+02D9 dotaccent
Index: /lib/fpdf/font/makefont/iso-8859-5.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-5.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-5.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0401 afii10023
+!A2 U+0402 afii10051
+!A3 U+0403 afii10052
+!A4 U+0404 afii10053
+!A5 U+0405 afii10054
+!A6 U+0406 afii10055
+!A7 U+0407 afii10056
+!A8 U+0408 afii10057
+!A9 U+0409 afii10058
+!AA U+040A afii10059
+!AB U+040B afii10060
+!AC U+040C afii10061
+!AD U+00AD hyphen
+!AE U+040E afii10062
+!AF U+040F afii10145
+!B0 U+0410 afii10017
+!B1 U+0411 afii10018
+!B2 U+0412 afii10019
+!B3 U+0413 afii10020
+!B4 U+0414 afii10021
+!B5 U+0415 afii10022
+!B6 U+0416 afii10024
+!B7 U+0417 afii10025
+!B8 U+0418 afii10026
+!B9 U+0419 afii10027
+!BA U+041A afii10028
+!BB U+041B afii10029
+!BC U+041C afii10030
+!BD U+041D afii10031
+!BE U+041E afii10032
+!BF U+041F afii10033
+!C0 U+0420 afii10034
+!C1 U+0421 afii10035
+!C2 U+0422 afii10036
+!C3 U+0423 afii10037
+!C4 U+0424 afii10038
+!C5 U+0425 afii10039
+!C6 U+0426 afii10040
+!C7 U+0427 afii10041
+!C8 U+0428 afii10042
+!C9 U+0429 afii10043
+!CA U+042A afii10044
+!CB U+042B afii10045
+!CC U+042C afii10046
+!CD U+042D afii10047
+!CE U+042E afii10048
+!CF U+042F afii10049
+!D0 U+0430 afii10065
+!D1 U+0431 afii10066
+!D2 U+0432 afii10067
+!D3 U+0433 afii10068
+!D4 U+0434 afii10069
+!D5 U+0435 afii10070
+!D6 U+0436 afii10072
+!D7 U+0437 afii10073
+!D8 U+0438 afii10074
+!D9 U+0439 afii10075
+!DA U+043A afii10076
+!DB U+043B afii10077
+!DC U+043C afii10078
+!DD U+043D afii10079
+!DE U+043E afii10080
+!DF U+043F afii10081
+!E0 U+0440 afii10082
+!E1 U+0441 afii10083
+!E2 U+0442 afii10084
+!E3 U+0443 afii10085
+!E4 U+0444 afii10086
+!E5 U+0445 afii10087
+!E6 U+0446 afii10088
+!E7 U+0447 afii10089
+!E8 U+0448 afii10090
+!E9 U+0449 afii10091
+!EA U+044A afii10092
+!EB U+044B afii10093
+!EC U+044C afii10094
+!ED U+044D afii10095
+!EE U+044E afii10096
+!EF U+044F afii10097
+!F0 U+2116 afii61352
+!F1 U+0451 afii10071
+!F2 U+0452 afii10099
+!F3 U+0453 afii10100
+!F4 U+0454 afii10101
+!F5 U+0455 afii10102
+!F6 U+0456 afii10103
+!F7 U+0457 afii10104
+!F8 U+0458 afii10105
+!F9 U+0459 afii10106
+!FA U+045A afii10107
+!FB U+045B afii10108
+!FC U+045C afii10109
+!FD U+00A7 section
+!FE U+045E afii10110
+!FF U+045F afii10193
Index: /lib/fpdf/font/makefont/iso-8859-7.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-7.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-7.map	(revision 5261)
@@ -0,0 +1,250 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+2018 quoteleft
+!A2 U+2019 quoteright
+!A3 U+00A3 sterling
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AF U+2015 afii00208
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+0384 tonos
+!B5 U+0385 dieresistonos
+!B6 U+0386 Alphatonos
+!B7 U+00B7 periodcentered
+!B8 U+0388 Epsilontonos
+!B9 U+0389 Etatonos
+!BA U+038A Iotatonos
+!BB U+00BB guillemotright
+!BC U+038C Omicrontonos
+!BD U+00BD onehalf
+!BE U+038E Upsilontonos
+!BF U+038F Omegatonos
+!C0 U+0390 iotadieresistonos
+!C1 U+0391 Alpha
+!C2 U+0392 Beta
+!C3 U+0393 Gamma
+!C4 U+0394 Delta
+!C5 U+0395 Epsilon
+!C6 U+0396 Zeta
+!C7 U+0397 Eta
+!C8 U+0398 Theta
+!C9 U+0399 Iota
+!CA U+039A Kappa
+!CB U+039B Lambda
+!CC U+039C Mu
+!CD U+039D Nu
+!CE U+039E Xi
+!CF U+039F Omicron
+!D0 U+03A0 Pi
+!D1 U+03A1 Rho
+!D3 U+03A3 Sigma
+!D4 U+03A4 Tau
+!D5 U+03A5 Upsilon
+!D6 U+03A6 Phi
+!D7 U+03A7 Chi
+!D8 U+03A8 Psi
+!D9 U+03A9 Omega
+!DA U+03AA Iotadieresis
+!DB U+03AB Upsilondieresis
+!DC U+03AC alphatonos
+!DD U+03AD epsilontonos
+!DE U+03AE etatonos
+!DF U+03AF iotatonos
+!E0 U+03B0 upsilondieresistonos
+!E1 U+03B1 alpha
+!E2 U+03B2 beta
+!E3 U+03B3 gamma
+!E4 U+03B4 delta
+!E5 U+03B5 epsilon
+!E6 U+03B6 zeta
+!E7 U+03B7 eta
+!E8 U+03B8 theta
+!E9 U+03B9 iota
+!EA U+03BA kappa
+!EB U+03BB lambda
+!EC U+03BC mu
+!ED U+03BD nu
+!EE U+03BE xi
+!EF U+03BF omicron
+!F0 U+03C0 pi
+!F1 U+03C1 rho
+!F2 U+03C2 sigma1
+!F3 U+03C3 sigma
+!F4 U+03C4 tau
+!F5 U+03C5 upsilon
+!F6 U+03C6 phi
+!F7 U+03C7 chi
+!F8 U+03C8 psi
+!F9 U+03C9 omega
+!FA U+03CA iotadieresis
+!FB U+03CB upsilondieresis
+!FC U+03CC omicrontonos
+!FD U+03CD upsilontonos
+!FE U+03CE omegatonos
Index: /lib/fpdf/font/makefont/iso-8859-9.map
===================================================================
--- /lib/fpdf/font/makefont/iso-8859-9.map	(revision 5261)
+++ /lib/fpdf/font/makefont/iso-8859-9.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+011E Gbreve
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0130 Idotaccent
+!DE U+015E Scedilla
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+011F gbreve
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0131 dotlessi
+!FE U+015F scedilla
+!FF U+00FF ydieresis
Index: /lib/fpdf/font/makefont/koi8-r.map
===================================================================
--- /lib/fpdf/font/makefont/koi8-r.map	(revision 5261)
+++ /lib/fpdf/font/makefont/koi8-r.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+2500 SF100000
+!81 U+2502 SF110000
+!82 U+250C SF010000
+!83 U+2510 SF030000
+!84 U+2514 SF020000
+!85 U+2518 SF040000
+!86 U+251C SF080000
+!87 U+2524 SF090000
+!88 U+252C SF060000
+!89 U+2534 SF070000
+!8A U+253C SF050000
+!8B U+2580 upblock
+!8C U+2584 dnblock
+!8D U+2588 block
+!8E U+258C lfblock
+!8F U+2590 rtblock
+!90 U+2591 ltshade
+!91 U+2592 shade
+!92 U+2593 dkshade
+!93 U+2320 integraltp
+!94 U+25A0 filledbox
+!95 U+2219 periodcentered
+!96 U+221A radical
+!97 U+2248 approxequal
+!98 U+2264 lessequal
+!99 U+2265 greaterequal
+!9A U+00A0 space
+!9B U+2321 integralbt
+!9C U+00B0 degree
+!9D U+00B2 twosuperior
+!9E U+00B7 periodcentered
+!9F U+00F7 divide
+!A0 U+2550 SF430000
+!A1 U+2551 SF240000
+!A2 U+2552 SF510000
+!A3 U+0451 afii10071
+!A4 U+2553 SF520000
+!A5 U+2554 SF390000
+!A6 U+2555 SF220000
+!A7 U+2556 SF210000
+!A8 U+2557 SF250000
+!A9 U+2558 SF500000
+!AA U+2559 SF490000
+!AB U+255A SF380000
+!AC U+255B SF280000
+!AD U+255C SF270000
+!AE U+255D SF260000
+!AF U+255E SF360000
+!B0 U+255F SF370000
+!B1 U+2560 SF420000
+!B2 U+2561 SF190000
+!B3 U+0401 afii10023
+!B4 U+2562 SF200000
+!B5 U+2563 SF230000
+!B6 U+2564 SF470000
+!B7 U+2565 SF480000
+!B8 U+2566 SF410000
+!B9 U+2567 SF450000
+!BA U+2568 SF460000
+!BB U+2569 SF400000
+!BC U+256A SF540000
+!BD U+256B SF530000
+!BE U+256C SF440000
+!BF U+00A9 copyright
+!C0 U+044E afii10096
+!C1 U+0430 afii10065
+!C2 U+0431 afii10066
+!C3 U+0446 afii10088
+!C4 U+0434 afii10069
+!C5 U+0435 afii10070
+!C6 U+0444 afii10086
+!C7 U+0433 afii10068
+!C8 U+0445 afii10087
+!C9 U+0438 afii10074
+!CA U+0439 afii10075
+!CB U+043A afii10076
+!CC U+043B afii10077
+!CD U+043C afii10078
+!CE U+043D afii10079
+!CF U+043E afii10080
+!D0 U+043F afii10081
+!D1 U+044F afii10097
+!D2 U+0440 afii10082
+!D3 U+0441 afii10083
+!D4 U+0442 afii10084
+!D5 U+0443 afii10085
+!D6 U+0436 afii10072
+!D7 U+0432 afii10067
+!D8 U+044C afii10094
+!D9 U+044B afii10093
+!DA U+0437 afii10073
+!DB U+0448 afii10090
+!DC U+044D afii10095
+!DD U+0449 afii10091
+!DE U+0447 afii10089
+!DF U+044A afii10092
+!E0 U+042E afii10048
+!E1 U+0410 afii10017
+!E2 U+0411 afii10018
+!E3 U+0426 afii10040
+!E4 U+0414 afii10021
+!E5 U+0415 afii10022
+!E6 U+0424 afii10038
+!E7 U+0413 afii10020
+!E8 U+0425 afii10039
+!E9 U+0418 afii10026
+!EA U+0419 afii10027
+!EB U+041A afii10028
+!EC U+041B afii10029
+!ED U+041C afii10030
+!EE U+041D afii10031
+!EF U+041E afii10032
+!F0 U+041F afii10033
+!F1 U+042F afii10049
+!F2 U+0420 afii10034
+!F3 U+0421 afii10035
+!F4 U+0422 afii10036
+!F5 U+0423 afii10037
+!F6 U+0416 afii10024
+!F7 U+0412 afii10019
+!F8 U+042C afii10046
+!F9 U+042B afii10045
+!FA U+0417 afii10025
+!FB U+0428 afii10042
+!FC U+042D afii10047
+!FD U+0429 afii10043
+!FE U+0427 afii10041
+!FF U+042A afii10044
Index: /lib/fpdf/font/makefont/koi8-u.map
===================================================================
--- /lib/fpdf/font/makefont/koi8-u.map	(revision 5261)
+++ /lib/fpdf/font/makefont/koi8-u.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+2500 SF100000
+!81 U+2502 SF110000
+!82 U+250C SF010000
+!83 U+2510 SF030000
+!84 U+2514 SF020000
+!85 U+2518 SF040000
+!86 U+251C SF080000
+!87 U+2524 SF090000
+!88 U+252C SF060000
+!89 U+2534 SF070000
+!8A U+253C SF050000
+!8B U+2580 upblock
+!8C U+2584 dnblock
+!8D U+2588 block
+!8E U+258C lfblock
+!8F U+2590 rtblock
+!90 U+2591 ltshade
+!91 U+2592 shade
+!92 U+2593 dkshade
+!93 U+2320 integraltp
+!94 U+25A0 filledbox
+!95 U+2022 bullet
+!96 U+221A radical
+!97 U+2248 approxequal
+!98 U+2264 lessequal
+!99 U+2265 greaterequal
+!9A U+00A0 space
+!9B U+2321 integralbt
+!9C U+00B0 degree
+!9D U+00B2 twosuperior
+!9E U+00B7 periodcentered
+!9F U+00F7 divide
+!A0 U+2550 SF430000
+!A1 U+2551 SF240000
+!A2 U+2552 SF510000
+!A3 U+0451 afii10071
+!A4 U+0454 afii10101
+!A5 U+2554 SF390000
+!A6 U+0456 afii10103
+!A7 U+0457 afii10104
+!A8 U+2557 SF250000
+!A9 U+2558 SF500000
+!AA U+2559 SF490000
+!AB U+255A SF380000
+!AC U+255B SF280000
+!AD U+0491 afii10098
+!AE U+255D SF260000
+!AF U+255E SF360000
+!B0 U+255F SF370000
+!B1 U+2560 SF420000
+!B2 U+2561 SF190000
+!B3 U+0401 afii10023
+!B4 U+0404 afii10053
+!B5 U+2563 SF230000
+!B6 U+0406 afii10055
+!B7 U+0407 afii10056
+!B8 U+2566 SF410000
+!B9 U+2567 SF450000
+!BA U+2568 SF460000
+!BB U+2569 SF400000
+!BC U+256A SF540000
+!BD U+0490 afii10050
+!BE U+256C SF440000
+!BF U+00A9 copyright
+!C0 U+044E afii10096
+!C1 U+0430 afii10065
+!C2 U+0431 afii10066
+!C3 U+0446 afii10088
+!C4 U+0434 afii10069
+!C5 U+0435 afii10070
+!C6 U+0444 afii10086
+!C7 U+0433 afii10068
+!C8 U+0445 afii10087
+!C9 U+0438 afii10074
+!CA U+0439 afii10075
+!CB U+043A afii10076
+!CC U+043B afii10077
+!CD U+043C afii10078
+!CE U+043D afii10079
+!CF U+043E afii10080
+!D0 U+043F afii10081
+!D1 U+044F afii10097
+!D2 U+0440 afii10082
+!D3 U+0441 afii10083
+!D4 U+0442 afii10084
+!D5 U+0443 afii10085
+!D6 U+0436 afii10072
+!D7 U+0432 afii10067
+!D8 U+044C afii10094
+!D9 U+044B afii10093
+!DA U+0437 afii10073
+!DB U+0448 afii10090
+!DC U+044D afii10095
+!DD U+0449 afii10091
+!DE U+0447 afii10089
+!DF U+044A afii10092
+!E0 U+042E afii10048
+!E1 U+0410 afii10017
+!E2 U+0411 afii10018
+!E3 U+0426 afii10040
+!E4 U+0414 afii10021
+!E5 U+0415 afii10022
+!E6 U+0424 afii10038
+!E7 U+0413 afii10020
+!E8 U+0425 afii10039
+!E9 U+0418 afii10026
+!EA U+0419 afii10027
+!EB U+041A afii10028
+!EC U+041B afii10029
+!ED U+041C afii10030
+!EE U+041D afii10031
+!EF U+041E afii10032
+!F0 U+041F afii10033
+!F1 U+042F afii10049
+!F2 U+0420 afii10034
+!F3 U+0421 afii10035
+!F4 U+0422 afii10036
+!F5 U+0423 afii10037
+!F6 U+0416 afii10024
+!F7 U+0412 afii10019
+!F8 U+042C afii10046
+!F9 U+042B afii10045
+!FA U+0417 afii10025
+!FB U+0428 afii10042
+!FC U+042D afii10047
+!FD U+0429 afii10043
+!FE U+0427 afii10041
+!FF U+042A afii10044
Index: /lib/fpdf/font/makefont/makefont.php
===================================================================
--- /lib/fpdf/font/makefont/makefont.php	(revision 5261)
+++ /lib/fpdf/font/makefont/makefont.php	(revision 5261)
@@ -0,0 +1,419 @@
+<?php
+/*******************************************************************************
+* Utility to generate font definition files                                    *
+*                                                                              *
+* Version: 1.14                                                                *
+* Date:    2008-08-03                                                          *
+* Author:  Olivier PLATHEY                                                     *
+*******************************************************************************/
+
+function ReadMap($enc)
+{
+	//Read a map file
+	$file=dirname(__FILE__).'/'.strtolower($enc).'.map';
+	$a=file($file);
+	if(empty($a))
+		die('<b>Error:</b> encoding not found: '.$enc);
+	$cc2gn=array();
+	foreach($a as $l)
+	{
+		if($l[0]=='!')
+		{
+			$e=preg_split('/[ \\t]+/',rtrim($l));
+			$cc=hexdec(substr($e[0],1));
+			$gn=$e[2];
+			$cc2gn[$cc]=$gn;
+		}
+	}
+	for($i=0;$i<=255;$i++)
+	{
+		if(!isset($cc2gn[$i]))
+			$cc2gn[$i]='.notdef';
+	}
+	return $cc2gn;
+}
+
+function ReadAFM($file, &$map)
+{
+	//Read a font metric file
+	$a=file($file);
+	if(empty($a))
+		die('File not found');
+	$widths=array();
+	$fm=array();
+	$fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent',
+		'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut',
+		'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent',
+		'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent',
+		'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent',
+		'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat',
+		'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb',
+		'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong');
+	foreach($a as $l)
+	{
+		$e=explode(' ',rtrim($l));
+		if(count($e)<2)
+			continue;
+		$code=$e[0];
+		$param=$e[1];
+		if($code=='C')
+		{
+			//Character metrics
+			$cc=(int)$e[1];
+			$w=$e[4];
+			$gn=$e[7];
+			if(substr($gn,-4)=='20AC')
+				$gn='Euro';
+			if(isset($fix[$gn]))
+			{
+				//Fix incorrect glyph name
+				foreach($map as $c=>$n)
+				{
+					if($n==$fix[$gn])
+						$map[$c]=$gn;
+				}
+			}
+			if(empty($map))
+			{
+				//Symbolic font: use built-in encoding
+				$widths[$cc]=$w;
+			}
+			else
+			{
+				$widths[$gn]=$w;
+				if($gn=='X')
+					$fm['CapXHeight']=$e[13];
+			}
+			if($gn=='.notdef')
+				$fm['MissingWidth']=$w;
+		}
+		elseif($code=='FontName')
+			$fm['FontName']=$param;
+		elseif($code=='Weight')
+			$fm['Weight']=$param;
+		elseif($code=='ItalicAngle')
+			$fm['ItalicAngle']=(double)$param;
+		elseif($code=='Ascender')
+			$fm['Ascender']=(int)$param;
+		elseif($code=='Descender')
+			$fm['Descender']=(int)$param;
+		elseif($code=='UnderlineThickness')
+			$fm['UnderlineThickness']=(int)$param;
+		elseif($code=='UnderlinePosition')
+			$fm['UnderlinePosition']=(int)$param;
+		elseif($code=='IsFixedPitch')
+			$fm['IsFixedPitch']=($param=='true');
+		elseif($code=='FontBBox')
+			$fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]);
+		elseif($code=='CapHeight')
+			$fm['CapHeight']=(int)$param;
+		elseif($code=='StdVW')
+			$fm['StdVW']=(int)$param;
+	}
+	if(!isset($fm['FontName']))
+		die('FontName not found');
+	if(!empty($map))
+	{
+		if(!isset($widths['.notdef']))
+			$widths['.notdef']=600;
+		if(!isset($widths['Delta']) && isset($widths['increment']))
+			$widths['Delta']=$widths['increment'];
+		//Order widths according to map
+		for($i=0;$i<=255;$i++)
+		{
+			if(!isset($widths[$map[$i]]))
+			{
+				echo '<b>Warning:</b> character '.$map[$i].' is missing<br>';
+				$widths[$i]=$widths['.notdef'];
+			}
+			else
+				$widths[$i]=$widths[$map[$i]];
+		}
+	}
+	$fm['Widths']=$widths;
+	return $fm;
+}
+
+function MakeFontDescriptor($fm, $symbolic)
+{
+	//Ascent
+	$asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000);
+	$fd="array('Ascent'=>".$asc;
+	//Descent
+	$desc=(isset($fm['Descender']) ? $fm['Descender'] : -200);
+	$fd.=",'Descent'=>".$desc;
+	//CapHeight
+	if(isset($fm['CapHeight']))
+		$ch=$fm['CapHeight'];
+	elseif(isset($fm['CapXHeight']))
+		$ch=$fm['CapXHeight'];
+	else
+		$ch=$asc;
+	$fd.=",'CapHeight'=>".$ch;
+	//Flags
+	$flags=0;
+	if(isset($fm['IsFixedPitch']) && $fm['IsFixedPitch'])
+		$flags+=1<<0;
+	if($symbolic)
+		$flags+=1<<2;
+	if(!$symbolic)
+		$flags+=1<<5;
+	if(isset($fm['ItalicAngle']) && $fm['ItalicAngle']!=0)
+		$flags+=1<<6;
+	$fd.=",'Flags'=>".$flags;
+	//FontBBox
+	if(isset($fm['FontBBox']))
+		$fbb=$fm['FontBBox'];
+	else
+		$fbb=array(0,$desc-100,1000,$asc+100);
+	$fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'";
+	//ItalicAngle
+	$ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0);
+	$fd.=",'ItalicAngle'=>".$ia;
+	//StemV
+	if(isset($fm['StdVW']))
+		$stemv=$fm['StdVW'];
+	elseif(isset($fm['Weight']) && preg_match('/bold|black/i',$fm['Weight']))
+		$stemv=120;
+	else
+		$stemv=70;
+	$fd.=",'StemV'=>".$stemv;
+	//MissingWidth
+	if(isset($fm['MissingWidth']))
+		$fd.=",'MissingWidth'=>".$fm['MissingWidth'];
+	$fd.=')';
+	return $fd;
+}
+
+function MakeWidthArray($fm)
+{
+	//Make character width array
+	$s="array(\n\t";
+	$cw=$fm['Widths'];
+	for($i=0;$i<=255;$i++)
+	{
+		if(chr($i)=="'")
+			$s.="'\\''";
+		elseif(chr($i)=="\\")
+			$s.="'\\\\'";
+		elseif($i>=32 && $i<=126)
+			$s.="'".chr($i)."'";
+		else
+			$s.="chr($i)";
+		$s.='=>'.$fm['Widths'][$i];
+		if($i<255)
+			$s.=',';
+		if(($i+1)%22==0)
+			$s.="\n\t";
+	}
+	$s.=')';
+	return $s;
+}
+
+function MakeFontEncoding($map)
+{
+	//Build differences from reference encoding
+	$ref=ReadMap('cp1252');
+	$s='';
+	$last=0;
+	for($i=32;$i<=255;$i++)
+	{
+		if($map[$i]!=$ref[$i])
+		{
+			if($i!=$last+1)
+				$s.=$i.' ';
+			$last=$i;
+			$s.='/'.$map[$i].' ';
+		}
+	}
+	return rtrim($s);
+}
+
+function SaveToFile($file, $s, $mode)
+{
+	$f=fopen($file,'w'.$mode);
+	if(!$f)
+		die('Can\'t write to file '.$file);
+	fwrite($f,$s,strlen($s));
+	fclose($f);
+}
+
+function ReadShort($f)
+{
+	$a=unpack('n1n',fread($f,2));
+	return $a['n'];
+}
+
+function ReadLong($f)
+{
+	$a=unpack('N1N',fread($f,4));
+	return $a['N'];
+}
+
+function CheckTTF($file)
+{
+	//Check if font license allows embedding
+	$f=fopen($file,'rb');
+	if(!$f)
+		die('<b>Error:</b> Can\'t open '.$file);
+	//Extract number of tables
+	fseek($f,4,SEEK_CUR);
+	$nb=ReadShort($f);
+	fseek($f,6,SEEK_CUR);
+	//Seek OS/2 table
+	$found=false;
+	for($i=0;$i<$nb;$i++)
+	{
+		if(fread($f,4)=='OS/2')
+		{
+			$found=true;
+			break;
+		}
+		fseek($f,12,SEEK_CUR);
+	}
+	if(!$found)
+	{
+		fclose($f);
+		return;
+	}
+	fseek($f,4,SEEK_CUR);
+	$offset=ReadLong($f);
+	fseek($f,$offset,SEEK_SET);
+	//Extract fsType flags
+	fseek($f,8,SEEK_CUR);
+	$fsType=ReadShort($f);
+	$rl=($fsType & 0x02)!=0;
+	$pp=($fsType & 0x04)!=0;
+	$e=($fsType & 0x08)!=0;
+	fclose($f);
+	if($rl && !$pp && !$e)
+		echo '<b>Warning:</b> font license does not allow embedding';
+}
+
+/*******************************************************************************
+* fontfile: path to TTF file (or empty string if not to be embedded)           *
+* afmfile:  path to AFM file                                                   *
+* enc:      font encoding (or empty string for symbolic fonts)                 *
+* patch:    optional patch for encoding                                        *
+* type:     font type if fontfile is empty                                     *
+*******************************************************************************/
+function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='TrueType')
+{
+	//Generate a font definition file
+	if(get_magic_quotes_runtime())
+		@set_magic_quotes_runtime(0);
+	ini_set('auto_detect_line_endings','1');
+	if($enc)
+	{
+		$map=ReadMap($enc);
+		foreach($patch as $cc=>$gn)
+			$map[$cc]=$gn;
+	}
+	else
+		$map=array();
+	if(!file_exists($afmfile))
+		die('<b>Error:</b> AFM file not found: '.$afmfile);
+	$fm=ReadAFM($afmfile,$map);
+	if($enc)
+		$diff=MakeFontEncoding($map);
+	else
+		$diff='';
+	$fd=MakeFontDescriptor($fm,empty($map));
+	//Find font type
+	if($fontfile)
+	{
+		$ext=strtolower(substr($fontfile,-3));
+		if($ext=='ttf')
+			$type='TrueType';
+		elseif($ext=='pfb')
+			$type='Type1';
+		else
+			die('<b>Error:</b> unrecognized font file extension: '.$ext);
+	}
+	else
+	{
+		if($type!='TrueType' && $type!='Type1')
+			die('<b>Error:</b> incorrect font type: '.$type);
+	}
+	//Start generation
+	$s='<?php'."\n";
+	$s.='$type=\''.$type."';\n";
+	$s.='$name=\''.$fm['FontName']."';\n";
+	$s.='$desc='.$fd.";\n";
+	if(!isset($fm['UnderlinePosition']))
+		$fm['UnderlinePosition']=-100;
+	if(!isset($fm['UnderlineThickness']))
+		$fm['UnderlineThickness']=50;
+	$s.='$up='.$fm['UnderlinePosition'].";\n";
+	$s.='$ut='.$fm['UnderlineThickness'].";\n";
+	$w=MakeWidthArray($fm);
+	$s.='$cw='.$w.";\n";
+	$s.='$enc=\''.$enc."';\n";
+	$s.='$diff=\''.$diff."';\n";
+	$basename=substr(basename($afmfile),0,-4);
+	if($fontfile)
+	{
+		//Embedded font
+		if(!file_exists($fontfile))
+			die('<b>Error:</b> font file not found: '.$fontfile);
+		if($type=='TrueType')
+			CheckTTF($fontfile);
+		$f=fopen($fontfile,'rb');
+		if(!$f)
+			die('<b>Error:</b> Can\'t open '.$fontfile);
+		$file=fread($f,filesize($fontfile));
+		fclose($f);
+		if($type=='Type1')
+		{
+			//Find first two sections and discard third one
+			$header=(ord($file[0])==128);
+			if($header)
+			{
+				//Strip first binary header
+				$file=substr($file,6);
+			}
+			$pos=strpos($file,'eexec');
+			if(!$pos)
+				die('<b>Error:</b> font file does not seem to be valid Type1');
+			$size1=$pos+6;
+			if($header && ord($file[$size1])==128)
+			{
+				//Strip second binary header
+				$file=substr($file,0,$size1).substr($file,$size1+6);
+			}
+			$pos=strpos($file,'00000000');
+			if(!$pos)
+				die('<b>Error:</b> font file does not seem to be valid Type1');
+			$size2=$pos-$size1;
+			$file=substr($file,0,$size1+$size2);
+		}
+		if(function_exists('gzcompress'))
+		{
+			$cmp=$basename.'.z';
+			SaveToFile($cmp,gzcompress($file),'b');
+			$s.='$file=\''.$cmp."';\n";
+			echo 'Font file compressed ('.$cmp.')<br>';
+		}
+		else
+		{
+			$s.='$file=\''.basename($fontfile)."';\n";
+			echo '<b>Notice:</b> font file could not be compressed (zlib extension not available)<br>';
+		}
+		if($type=='Type1')
+		{
+			$s.='$size1='.$size1.";\n";
+			$s.='$size2='.$size2.";\n";
+		}
+		else
+			$s.='$originalsize='.filesize($fontfile).";\n";
+	}
+	else
+	{
+		//Not embedded font
+		$s.='$file='."'';\n";
+	}
+	$s.="?>\n";
+	SaveToFile($basename.'.php',$s,'t');
+	echo 'Font definition file generated ('.$basename.'.php'.')<br>';
+}
+?>
Index: /lib/fpdf/font/symbol.php
===================================================================
--- /lib/fpdf/font/symbol.php	(revision 5261)
+++ /lib/fpdf/font/symbol.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Symbol';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549,
+	','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722,
+	'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768,
+	'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576,
+	'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0,
+	chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
+	chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603,
+	chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768,
+	chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042,
+	chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329,
+	chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0);
+?>
Index: /lib/fpdf/font/times.php
===================================================================
--- /lib/fpdf/font/times.php	(revision 5261)
+++ /lib/fpdf/font/times.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Times-Roman';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722,
+	'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944,
+	'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
+	'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980,
+	chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333,
+	chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500);
+?>
Index: /lib/fpdf/font/timesb.php
===================================================================
--- /lib/fpdf/font/timesb.php	(revision 5261)
+++ /lib/fpdf/font/timesb.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Times-Bold';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722,
+	'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000,
+	'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833,
+	'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333,
+	chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
+?>
Index: /lib/fpdf/font/timesbi.php
===================================================================
--- /lib/fpdf/font/timesbi.php	(revision 5261)
+++ /lib/fpdf/font/timesbi.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Times-BoldItalic';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667,
+	'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889,
+	'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
+	'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333,
+	chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
+	chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444);
+?>
Index: /lib/fpdf/font/timesi.php
===================================================================
--- /lib/fpdf/font/timesi.php	(revision 5261)
+++ /lib/fpdf/font/timesi.php	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+$type = 'Core';
+$name = 'Times-Italic';
+$up = -100;
+$ut = 50;
+$cw = array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611,
+	'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833,
+	'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722,
+	'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980,
+	chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333,
+	chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611,
+	chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444);
+?>
Index: /lib/fpdf/fpdf.css
===================================================================
--- /lib/fpdf/fpdf.css	(revision 5261)
+++ /lib/fpdf/fpdf.css	(revision 5261)
@@ -0,0 +1,21 @@
+body {font-family:"Times New Roman",serif}
+h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em}
+h2 {font:bold 100% Arial,sans-serif; color:#900000; margin-top:1.5em}
+dl.param dt {text-decoration:underline}
+dl.param dd {margin-top:1em; margin-bottom:1em}
+dl.param ul {margin-top:1em; margin-bottom:1em}
+tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%}
+div.source {margin-top:1.4em; margin-bottom:1.3em}
+div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%}
+div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000}
+div.doc-source {margin-top:1.4em; margin-bottom:1.3em}
+div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%}
+div.doc-source code {display:block; background-color:#E0E0E0; padding:4px}
+.kw {color:#000080; font-weight:bold}
+.str {color:#CC0000}
+.cmt {color:#008000}
+p.demo {text-align:center; margin-top:-0.9em}
+a.demo {text-decoration:none; font-weight:bold; color:#0000CC}
+a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC}
+a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF}
+a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF}
Index: /lib/fpdf/fpdf.php
===================================================================
--- /lib/fpdf/fpdf.php	(revision 5261)
+++ /lib/fpdf/fpdf.php	(revision 5261)
@@ -0,0 +1,1804 @@
+<?php
+/*******************************************************************************
+* FPDF                                                                         *
+*                                                                              *
+* Version: 1.7                                                                 *
+* Date:    2011-06-18                                                          *
+* Author:  Olivier PLATHEY                                                     *
+*******************************************************************************/
+
+define('FPDF_VERSION','1.7');
+
+class FPDF
+{
+var $page;               // current page number
+var $n;                  // current object number
+var $offsets;            // array of object offsets
+var $buffer;             // buffer holding in-memory PDF
+var $pages;              // array containing pages
+var $state;              // current document state
+var $compress;           // compression flag
+var $k;                  // scale factor (number of points in user unit)
+var $DefOrientation;     // default orientation
+var $CurOrientation;     // current orientation
+var $StdPageSizes;       // standard page sizes
+var $DefPageSize;        // default page size
+var $CurPageSize;        // current page size
+var $PageSizes;          // used for pages with non default sizes or orientations
+var $wPt, $hPt;          // dimensions of current page in points
+var $w, $h;              // dimensions of current page in user unit
+var $lMargin;            // left margin
+var $tMargin;            // top margin
+var $rMargin;            // right margin
+var $bMargin;            // page break margin
+var $cMargin;            // cell margin
+var $x, $y;              // current position in user unit
+var $lasth;              // height of last printed cell
+var $LineWidth;          // line width in user unit
+var $fontpath;           // path containing fonts
+var $CoreFonts;          // array of core font names
+var $fonts;              // array of used fonts
+var $FontFiles;          // array of font files
+var $diffs;              // array of encoding differences
+var $FontFamily;         // current font family
+var $FontStyle;          // current font style
+var $underline;          // underlining flag
+var $CurrentFont;        // current font info
+var $FontSizePt;         // current font size in points
+var $FontSize;           // current font size in user unit
+var $DrawColor;          // commands for drawing color
+var $FillColor;          // commands for filling color
+var $TextColor;          // commands for text color
+var $ColorFlag;          // indicates whether fill and text colors are different
+var $ws;                 // word spacing
+var $images;             // array of used images
+var $PageLinks;          // array of links in pages
+var $links;              // array of internal links
+var $AutoPageBreak;      // automatic page breaking
+var $PageBreakTrigger;   // threshold used to trigger page breaks
+var $InHeader;           // flag set when processing header
+var $InFooter;           // flag set when processing footer
+var $ZoomMode;           // zoom display mode
+var $LayoutMode;         // layout display mode
+var $title;              // title
+var $subject;            // subject
+var $author;             // author
+var $keywords;           // keywords
+var $creator;            // creator
+var $AliasNbPages;       // alias for total number of pages
+var $PDFVersion;         // PDF version number
+
+/*******************************************************************************
+*                                                                              *
+*                               Public methods                                 *
+*                                                                              *
+*******************************************************************************/
+function FPDF($orientation='P', $unit='mm', $size='A4')
+{
+	// Some checks
+	$this->_dochecks();
+	// Initialization of properties
+	$this->page = 0;
+	$this->n = 2;
+	$this->buffer = '';
+	$this->pages = array();
+	$this->PageSizes = array();
+	$this->state = 0;
+	$this->fonts = array();
+	$this->FontFiles = array();
+	$this->diffs = array();
+	$this->images = array();
+	$this->links = array();
+	$this->InHeader = false;
+	$this->InFooter = false;
+	$this->lasth = 0;
+	$this->FontFamily = '';
+	$this->FontStyle = '';
+	$this->FontSizePt = 12;
+	$this->underline = false;
+	$this->DrawColor = '0 G';
+	$this->FillColor = '0 g';
+	$this->TextColor = '0 g';
+	$this->ColorFlag = false;
+	$this->ws = 0;
+	// Font path
+	if(defined('FPDF_FONTPATH'))
+	{
+		$this->fontpath = FPDF_FONTPATH;
+		if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\')
+			$this->fontpath .= '/';
+	}
+	elseif(is_dir(dirname(__FILE__).'/font'))
+		$this->fontpath = dirname(__FILE__).'/font/';
+	else
+		$this->fontpath = '';
+	// Core fonts
+	$this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats');
+	// Scale factor
+	if($unit=='pt')
+		$this->k = 1;
+	elseif($unit=='mm')
+		$this->k = 72/25.4;
+	elseif($unit=='cm')
+		$this->k = 72/2.54;
+	elseif($unit=='in')
+		$this->k = 72;
+	else
+		$this->Error('Incorrect unit: '.$unit);
+	// Page sizes
+	$this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28),
+		'letter'=>array(612,792), 'legal'=>array(612,1008));
+	$size = $this->_getpagesize($size);
+	$this->DefPageSize = $size;
+	$this->CurPageSize = $size;
+	// Page orientation
+	$orientation = strtolower($orientation);
+	if($orientation=='p' || $orientation=='portrait')
+	{
+		$this->DefOrientation = 'P';
+		$this->w = $size[0];
+		$this->h = $size[1];
+	}
+	elseif($orientation=='l' || $orientation=='landscape')
+	{
+		$this->DefOrientation = 'L';
+		$this->w = $size[1];
+		$this->h = $size[0];
+	}
+	else
+		$this->Error('Incorrect orientation: '.$orientation);
+	$this->CurOrientation = $this->DefOrientation;
+	$this->wPt = $this->w*$this->k;
+	$this->hPt = $this->h*$this->k;
+	// Page margins (1 cm)
+	$margin = 28.35/$this->k;
+	$this->SetMargins($margin,$margin);
+	// Interior cell margin (1 mm)
+	$this->cMargin = $margin/10;
+	// Line width (0.2 mm)
+	$this->LineWidth = .567/$this->k;
+	// Automatic page break
+	$this->SetAutoPageBreak(true,2*$margin);
+	// Default display mode
+	$this->SetDisplayMode('default');
+	// Enable compression
+	$this->SetCompression(true);
+	// Set default PDF version number
+	$this->PDFVersion = '1.3';
+}
+
+function SetMargins($left, $top, $right=null)
+{
+	// Set left, top and right margins
+	$this->lMargin = $left;
+	$this->tMargin = $top;
+	if($right===null)
+		$right = $left;
+	$this->rMargin = $right;
+}
+
+function SetLeftMargin($margin)
+{
+	// Set left margin
+	$this->lMargin = $margin;
+	if($this->page>0 && $this->x<$margin)
+		$this->x = $margin;
+}
+
+function SetTopMargin($margin)
+{
+	// Set top margin
+	$this->tMargin = $margin;
+}
+
+function SetRightMargin($margin)
+{
+	// Set right margin
+	$this->rMargin = $margin;
+}
+
+function SetAutoPageBreak($auto, $margin=0)
+{
+	// Set auto page break mode and triggering margin
+	$this->AutoPageBreak = $auto;
+	$this->bMargin = $margin;
+	$this->PageBreakTrigger = $this->h-$margin;
+}
+
+function SetDisplayMode($zoom, $layout='default')
+{
+	// Set display mode in viewer
+	if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
+		$this->ZoomMode = $zoom;
+	else
+		$this->Error('Incorrect zoom display mode: '.$zoom);
+	if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default')
+		$this->LayoutMode = $layout;
+	else
+		$this->Error('Incorrect layout display mode: '.$layout);
+}
+
+function SetCompression($compress)
+{
+	// Set page compression
+	if(function_exists('gzcompress'))
+		$this->compress = $compress;
+	else
+		$this->compress = false;
+}
+
+function SetTitle($title, $isUTF8=false)
+{
+	// Title of document
+	if($isUTF8)
+		$title = $this->_UTF8toUTF16($title);
+	$this->title = $title;
+}
+
+function SetSubject($subject, $isUTF8=false)
+{
+	// Subject of document
+	if($isUTF8)
+		$subject = $this->_UTF8toUTF16($subject);
+	$this->subject = $subject;
+}
+
+function SetAuthor($author, $isUTF8=false)
+{
+	// Author of document
+	if($isUTF8)
+		$author = $this->_UTF8toUTF16($author);
+	$this->author = $author;
+}
+
+function SetKeywords($keywords, $isUTF8=false)
+{
+	// Keywords of document
+	if($isUTF8)
+		$keywords = $this->_UTF8toUTF16($keywords);
+	$this->keywords = $keywords;
+}
+
+function SetCreator($creator, $isUTF8=false)
+{
+	// Creator of document
+	if($isUTF8)
+		$creator = $this->_UTF8toUTF16($creator);
+	$this->creator = $creator;
+}
+
+function AliasNbPages($alias='{nb}')
+{
+	// Define an alias for total number of pages
+	$this->AliasNbPages = $alias;
+}
+
+function Error($msg)
+{
+	// Fatal error
+	die('<b>FPDF error:</b> '.$msg);
+}
+
+function Open()
+{
+	// Begin document
+	$this->state = 1;
+}
+
+function Close()
+{
+	// Terminate document
+	if($this->state==3)
+		return;
+	if($this->page==0)
+		$this->AddPage();
+	// Page footer
+	$this->InFooter = true;
+	$this->Footer();
+	$this->InFooter = false;
+	// Close page
+	$this->_endpage();
+	// Close document
+	$this->_enddoc();
+}
+
+function AddPage($orientation='', $size='')
+{
+	// Start a new page
+	if($this->state==0)
+		$this->Open();
+	$family = $this->FontFamily;
+	$style = $this->FontStyle.($this->underline ? 'U' : '');
+	$fontsize = $this->FontSizePt;
+	$lw = $this->LineWidth;
+	$dc = $this->DrawColor;
+	$fc = $this->FillColor;
+	$tc = $this->TextColor;
+	$cf = $this->ColorFlag;
+	if($this->page>0)
+	{
+		// Page footer
+		$this->InFooter = true;
+		$this->Footer();
+		$this->InFooter = false;
+		// Close page
+		$this->_endpage();
+	}
+	// Start new page
+	$this->_beginpage($orientation,$size);
+	// Set line cap style to square
+	$this->_out('2 J');
+	// Set line width
+	$this->LineWidth = $lw;
+	$this->_out(sprintf('%.2F w',$lw*$this->k));
+	// Set font
+	if($family)
+		$this->SetFont($family,$style,$fontsize);
+	// Set colors
+	$this->DrawColor = $dc;
+	if($dc!='0 G')
+		$this->_out($dc);
+	$this->FillColor = $fc;
+	if($fc!='0 g')
+		$this->_out($fc);
+	$this->TextColor = $tc;
+	$this->ColorFlag = $cf;
+	// Page header
+	$this->InHeader = true;
+	$this->Header();
+	$this->InHeader = false;
+	// Restore line width
+	if($this->LineWidth!=$lw)
+	{
+		$this->LineWidth = $lw;
+		$this->_out(sprintf('%.2F w',$lw*$this->k));
+	}
+	// Restore font
+	if($family)
+		$this->SetFont($family,$style,$fontsize);
+	// Restore colors
+	if($this->DrawColor!=$dc)
+	{
+		$this->DrawColor = $dc;
+		$this->_out($dc);
+	}
+	if($this->FillColor!=$fc)
+	{
+		$this->FillColor = $fc;
+		$this->_out($fc);
+	}
+	$this->TextColor = $tc;
+	$this->ColorFlag = $cf;
+}
+
+function Header()
+{
+	// To be implemented in your own inherited class
+}
+
+function Footer()
+{
+	// To be implemented in your own inherited class
+}
+
+function PageNo()
+{
+	// Get current page number
+	return $this->page;
+}
+
+function SetDrawColor($r, $g=null, $b=null)
+{
+	// Set color for all stroking operations
+	if(($r==0 && $g==0 && $b==0) || $g===null)
+		$this->DrawColor = sprintf('%.3F G',$r/255);
+	else
+		$this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255);
+	if($this->page>0)
+		$this->_out($this->DrawColor);
+}
+
+function SetFillColor($r, $g=null, $b=null)
+{
+	// Set color for all filling operations
+	if(($r==0 && $g==0 && $b==0) || $g===null)
+		$this->FillColor = sprintf('%.3F g',$r/255);
+	else
+		$this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
+	$this->ColorFlag = ($this->FillColor!=$this->TextColor);
+	if($this->page>0)
+		$this->_out($this->FillColor);
+}
+
+function SetTextColor($r, $g=null, $b=null)
+{
+	// Set color for text
+	if(($r==0 && $g==0 && $b==0) || $g===null)
+		$this->TextColor = sprintf('%.3F g',$r/255);
+	else
+		$this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
+	$this->ColorFlag = ($this->FillColor!=$this->TextColor);
+}
+
+function GetStringWidth($s)
+{
+	// Get width of a string in the current font
+	$s = (string)$s;
+	$cw = &$this->CurrentFont['cw'];
+	$w = 0;
+	$l = strlen($s);
+	for($i=0;$i<$l;$i++)
+		$w += $cw[$s[$i]];
+	return $w*$this->FontSize/1000;
+}
+
+function SetLineWidth($width)
+{
+	// Set line width
+	$this->LineWidth = $width;
+	if($this->page>0)
+		$this->_out(sprintf('%.2F w',$width*$this->k));
+}
+
+function Line($x1, $y1, $x2, $y2)
+{
+	// Draw a line
+	$this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k));
+}
+
+function Rect($x, $y, $w, $h, $style='')
+{
+	// Draw a rectangle
+	if($style=='F')
+		$op = 'f';
+	elseif($style=='FD' || $style=='DF')
+		$op = 'B';
+	else
+		$op = 'S';
+	$this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op));
+}
+
+function AddFont($family, $style='', $file='')
+{
+	// Add a TrueType, OpenType or Type1 font
+	$family = strtolower($family);
+	if($file=='')
+		$file = str_replace(' ','',$family).strtolower($style).'.php';
+	$style = strtoupper($style);
+	if($style=='IB')
+		$style = 'BI';
+	$fontkey = $family.$style;
+	if(isset($this->fonts[$fontkey]))
+		return;
+	$info = $this->_loadfont($file);
+	$info['i'] = count($this->fonts)+1;
+	if(!empty($info['diff']))
+	{
+		// Search existing encodings
+		$n = array_search($info['diff'],$this->diffs);
+		if(!$n)
+		{
+			$n = count($this->diffs)+1;
+			$this->diffs[$n] = $info['diff'];
+		}
+		$info['diffn'] = $n;
+	}
+	if(!empty($info['file']))
+	{
+		// Embedded font
+		if($info['type']=='TrueType')
+			$this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']);
+		else
+			$this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']);
+	}
+	$this->fonts[$fontkey] = $info;
+}
+
+function SetFont($family, $style='', $size=0)
+{
+	// Select a font; size given in points
+	if($family=='')
+		$family = $this->FontFamily;
+	else
+		$family = strtolower($family);
+	$style = strtoupper($style);
+	if(strpos($style,'U')!==false)
+	{
+		$this->underline = true;
+		$style = str_replace('U','',$style);
+	}
+	else
+		$this->underline = false;
+	if($style=='IB')
+		$style = 'BI';
+	if($size==0)
+		$size = $this->FontSizePt;
+	// Test if font is already selected
+	if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size)
+		return;
+	// Test if font is already loaded
+	$fontkey = $family.$style;
+	if(!isset($this->fonts[$fontkey]))
+	{
+		// Test if one of the core fonts
+		if($family=='arial')
+			$family = 'helvetica';
+		if(in_array($family,$this->CoreFonts))
+		{
+			if($family=='symbol' || $family=='zapfdingbats')
+				$style = '';
+			$fontkey = $family.$style;
+			if(!isset($this->fonts[$fontkey]))
+				$this->AddFont($family,$style);
+		}
+		else
+			$this->Error('Undefined font: '.$family.' '.$style);
+	}
+	// Select it
+	$this->FontFamily = $family;
+	$this->FontStyle = $style;
+	$this->FontSizePt = $size;
+	$this->FontSize = $size/$this->k;
+	$this->CurrentFont = &$this->fonts[$fontkey];
+	if($this->page>0)
+		$this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
+}
+
+function SetFontSize($size)
+{
+	// Set font size in points
+	if($this->FontSizePt==$size)
+		return;
+	$this->FontSizePt = $size;
+	$this->FontSize = $size/$this->k;
+	if($this->page>0)
+		$this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
+}
+
+function AddLink()
+{
+	// Create a new internal link
+	$n = count($this->links)+1;
+	$this->links[$n] = array(0, 0);
+	return $n;
+}
+
+function SetLink($link, $y=0, $page=-1)
+{
+	// Set destination of internal link
+	if($y==-1)
+		$y = $this->y;
+	if($page==-1)
+		$page = $this->page;
+	$this->links[$link] = array($page, $y);
+}
+
+function Link($x, $y, $w, $h, $link)
+{
+	// Put a link on the page
+	$this->PageLinks[$this->page][] = array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link);
+}
+
+function Text($x, $y, $txt)
+{
+	// Output a string
+	$s = sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt));
+	if($this->underline && $txt!='')
+		$s .= ' '.$this->_dounderline($x,$y,$txt);
+	if($this->ColorFlag)
+		$s = 'q '.$this->TextColor.' '.$s.' Q';
+	$this->_out($s);
+}
+
+function AcceptPageBreak()
+{
+	// Accept automatic page break or not
+	return $this->AutoPageBreak;
+}
+
+function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
+{
+	// Output a cell
+	$k = $this->k;
+	if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
+	{
+		// Automatic page break
+		$x = $this->x;
+		$ws = $this->ws;
+		if($ws>0)
+		{
+			$this->ws = 0;
+			$this->_out('0 Tw');
+		}
+		$this->AddPage($this->CurOrientation,$this->CurPageSize);
+		$this->x = $x;
+		if($ws>0)
+		{
+			$this->ws = $ws;
+			$this->_out(sprintf('%.3F Tw',$ws*$k));
+		}
+	}
+	if($w==0)
+		$w = $this->w-$this->rMargin-$this->x;
+	$s = '';
+	if($fill || $border==1)
+	{
+		if($fill)
+			$op = ($border==1) ? 'B' : 'f';
+		else
+			$op = 'S';
+		$s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
+	}
+	if(is_string($border))
+	{
+		$x = $this->x;
+		$y = $this->y;
+		if(strpos($border,'L')!==false)
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
+		if(strpos($border,'T')!==false)
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
+		if(strpos($border,'R')!==false)
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
+		if(strpos($border,'B')!==false)
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
+	}
+	if($txt!=='')
+	{
+		if($align=='R')
+			$dx = $w-$this->cMargin-$this->GetStringWidth($txt);
+		elseif($align=='C')
+			$dx = ($w-$this->GetStringWidth($txt))/2;
+		else
+			$dx = $this->cMargin;
+		if($this->ColorFlag)
+			$s .= 'q '.$this->TextColor.' ';
+		$txt2 = str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
+		$s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
+		if($this->underline)
+			$s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
+		if($this->ColorFlag)
+			$s .= ' Q';
+		if($link)
+			$this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
+	}
+	if($s)
+		$this->_out($s);
+	$this->lasth = $h;
+	if($ln>0)
+	{
+		// Go to next line
+		$this->y += $h;
+		if($ln==1)
+			$this->x = $this->lMargin;
+	}
+	else
+		$this->x += $w;
+}
+
+function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false)
+{
+	// Output text with automatic or explicit line breaks
+	$cw = &$this->CurrentFont['cw'];
+	if($w==0)
+		$w = $this->w-$this->rMargin-$this->x;
+	$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
+	$s = str_replace("\r",'',$txt);
+	$nb = strlen($s);
+	if($nb>0 && $s[$nb-1]=="\n")
+		$nb--;
+	$b = 0;
+	if($border)
+	{
+		if($border==1)
+		{
+			$border = 'LTRB';
+			$b = 'LRT';
+			$b2 = 'LR';
+		}
+		else
+		{
+			$b2 = '';
+			if(strpos($border,'L')!==false)
+				$b2 .= 'L';
+			if(strpos($border,'R')!==false)
+				$b2 .= 'R';
+			$b = (strpos($border,'T')!==false) ? $b2.'T' : $b2;
+		}
+	}
+	$sep = -1;
+	$i = 0;
+	$j = 0;
+	$l = 0;
+	$ns = 0;
+	$nl = 1;
+	while($i<$nb)
+	{
+		// Get next character
+		$c = $s[$i];
+		if($c=="\n")
+		{
+			// Explicit line break
+			if($this->ws>0)
+			{
+				$this->ws = 0;
+				$this->_out('0 Tw');
+			}
+			$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+			$i++;
+			$sep = -1;
+			$j = $i;
+			$l = 0;
+			$ns = 0;
+			$nl++;
+			if($border && $nl==2)
+				$b = $b2;
+			continue;
+		}
+		if($c==' ')
+		{
+			$sep = $i;
+			$ls = $l;
+			$ns++;
+		}
+		$l += $cw[$c];
+		if($l>$wmax)
+		{
+			// Automatic line break
+			if($sep==-1)
+			{
+				if($i==$j)
+					$i++;
+				if($this->ws>0)
+				{
+					$this->ws = 0;
+					$this->_out('0 Tw');
+				}
+				$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+			}
+			else
+			{
+				if($align=='J')
+				{
+					$this->ws = ($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
+					$this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
+				}
+				$this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
+				$i = $sep+1;
+			}
+			$sep = -1;
+			$j = $i;
+			$l = 0;
+			$ns = 0;
+			$nl++;
+			if($border && $nl==2)
+				$b = $b2;
+		}
+		else
+			$i++;
+	}
+	// Last chunk
+	if($this->ws>0)
+	{
+		$this->ws = 0;
+		$this->_out('0 Tw');
+	}
+	if($border && strpos($border,'B')!==false)
+		$b .= 'B';
+	$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+	$this->x = $this->lMargin;
+}
+
+function Write($h, $txt, $link='')
+{
+	// Output text in flowing mode
+	$cw = &$this->CurrentFont['cw'];
+	$w = $this->w-$this->rMargin-$this->x;
+	$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
+	$s = str_replace("\r",'',$txt);
+	$nb = strlen($s);
+	$sep = -1;
+	$i = 0;
+	$j = 0;
+	$l = 0;
+	$nl = 1;
+	while($i<$nb)
+	{
+		// Get next character
+		$c = $s[$i];
+		if($c=="\n")
+		{
+			// Explicit line break
+			$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
+			$i++;
+			$sep = -1;
+			$j = $i;
+			$l = 0;
+			if($nl==1)
+			{
+				$this->x = $this->lMargin;
+				$w = $this->w-$this->rMargin-$this->x;
+				$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
+			}
+			$nl++;
+			continue;
+		}
+		if($c==' ')
+			$sep = $i;
+		$l += $cw[$c];
+		if($l>$wmax)
+		{
+			// Automatic line break
+			if($sep==-1)
+			{
+				if($this->x>$this->lMargin)
+				{
+					// Move to next line
+					$this->x = $this->lMargin;
+					$this->y += $h;
+					$w = $this->w-$this->rMargin-$this->x;
+					$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
+					$i++;
+					$nl++;
+					continue;
+				}
+				if($i==$j)
+					$i++;
+				$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
+			}
+			else
+			{
+				$this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
+				$i = $sep+1;
+			}
+			$sep = -1;
+			$j = $i;
+			$l = 0;
+			if($nl==1)
+			{
+				$this->x = $this->lMargin;
+				$w = $this->w-$this->rMargin-$this->x;
+				$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
+			}
+			$nl++;
+		}
+		else
+			$i++;
+	}
+	// Last chunk
+	if($i!=$j)
+		$this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link);
+}
+
+function Ln($h=null)
+{
+	// Line feed; default value is last cell height
+	$this->x = $this->lMargin;
+	if($h===null)
+		$this->y += $this->lasth;
+	else
+		$this->y += $h;
+}
+
+function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
+{
+	// Put an image on the page
+	if(!isset($this->images[$file]))
+	{
+		// First use of this image, get info
+		if($type=='')
+		{
+			$pos = strrpos($file,'.');
+			if(!$pos)
+				$this->Error('Image file has no extension and no type was specified: '.$file);
+			$type = substr($file,$pos+1);
+		}
+		$type = strtolower($type);
+		if($type=='jpeg')
+			$type = 'jpg';
+		$mtd = '_parse'.$type;
+		if(!method_exists($this,$mtd))
+			$this->Error('Unsupported image type: '.$type);
+		$info = $this->$mtd($file);
+		$info['i'] = count($this->images)+1;
+		$this->images[$file] = $info;
+	}
+	else
+		$info = $this->images[$file];
+
+	// Automatic width and height calculation if needed
+	if($w==0 && $h==0)
+	{
+		// Put image at 96 dpi
+		$w = -96;
+		$h = -96;
+	}
+	if($w<0)
+		$w = -$info['w']*72/$w/$this->k;
+	if($h<0)
+		$h = -$info['h']*72/$h/$this->k;
+	if($w==0)
+		$w = $h*$info['w']/$info['h'];
+	if($h==0)
+		$h = $w*$info['h']/$info['w'];
+
+	// Flowing mode
+	if($y===null)
+	{
+		if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
+		{
+			// Automatic page break
+			$x2 = $this->x;
+			$this->AddPage($this->CurOrientation,$this->CurPageSize);
+			$this->x = $x2;
+		}
+		$y = $this->y;
+		$this->y += $h;
+	}
+
+	if($x===null)
+		$x = $this->x;
+	$this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i']));
+	if($link)
+		$this->Link($x,$y,$w,$h,$link);
+}
+
+function GetX()
+{
+	// Get x position
+	return $this->x;
+}
+
+function SetX($x)
+{
+	// Set x position
+	if($x>=0)
+		$this->x = $x;
+	else
+		$this->x = $this->w+$x;
+}
+
+function GetY()
+{
+	// Get y position
+	return $this->y;
+}
+
+function SetY($y)
+{
+	// Set y position and reset x
+	$this->x = $this->lMargin;
+	if($y>=0)
+		$this->y = $y;
+	else
+		$this->y = $this->h+$y;
+}
+
+function SetXY($x, $y)
+{
+	// Set x and y positions
+	$this->SetY($y);
+	$this->SetX($x);
+}
+
+function Output($name='', $dest='')
+{
+	// Output PDF to some destination
+	if($this->state<3)
+		$this->Close();
+	$dest = strtoupper($dest);
+	if($dest=='')
+	{
+		if($name=='')
+		{
+			$name = 'doc.pdf';
+			$dest = 'I';
+		}
+		else
+			$dest = 'F';
+	}
+	switch($dest)
+	{
+		case 'I':
+			// Send to standard output
+			$this->_checkoutput();
+			if(PHP_SAPI!='cli')
+			{
+				// We send to a browser
+				header('Content-Type: application/pdf');
+				header('Content-Disposition: inline; filename="'.$name.'"');
+				header('Cache-Control: private, max-age=0, must-revalidate');
+				header('Pragma: public');
+			}
+			echo $this->buffer;
+			break;
+		case 'D':
+			// Download file
+			$this->_checkoutput();
+			header('Content-Type: application/x-download');
+			header('Content-Disposition: attachment; filename="'.$name.'"');
+			header('Cache-Control: private, max-age=0, must-revalidate');
+			header('Pragma: public');
+			echo $this->buffer;
+			break;
+		case 'F':
+			// Save to local file
+			$f = fopen($name,'wb');
+			if(!$f)
+				$this->Error('Unable to create output file: '.$name);
+			fwrite($f,$this->buffer,strlen($this->buffer));
+			fclose($f);
+			break;
+		case 'S':
+			// Return as a string
+			return $this->buffer;
+		default:
+			$this->Error('Incorrect output destination: '.$dest);
+	}
+	return '';
+}
+
+/*******************************************************************************
+*                                                                              *
+*                              Protected methods                               *
+*                                                                              *
+*******************************************************************************/
+function _dochecks()
+{
+	// Check availability of %F
+	if(sprintf('%.1F',1.0)!='1.0')
+		$this->Error('This version of PHP is not supported');
+	// Check mbstring overloading
+	if(ini_get('mbstring.func_overload') & 2)
+		$this->Error('mbstring overloading must be disabled');
+	// Ensure runtime magic quotes are disabled
+	if(get_magic_quotes_runtime())
+		@set_magic_quotes_runtime(0);
+}
+
+function _checkoutput()
+{
+	if(PHP_SAPI!='cli')
+	{
+		if(headers_sent($file,$line))
+			$this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
+	}
+	if(ob_get_length())
+	{
+		// The output buffer is not empty
+		if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents()))
+		{
+			// It contains only a UTF-8 BOM and/or whitespace, let's clean it
+			ob_clean();
+		}
+		else
+			$this->Error("Some data has already been output, can't send PDF file");
+	}
+}
+
+function _getpagesize($size)
+{
+	if(is_string($size))
+	{
+		$size = strtolower($size);
+		if(!isset($this->StdPageSizes[$size]))
+			$this->Error('Unknown page size: '.$size);
+		$a = $this->StdPageSizes[$size];
+		return array($a[0]/$this->k, $a[1]/$this->k);
+	}
+	else
+	{
+		if($size[0]>$size[1])
+			return array($size[1], $size[0]);
+		else
+			return $size;
+	}
+}
+
+function _beginpage($orientation, $size)
+{
+	$this->page++;
+	$this->pages[$this->page] = '';
+	$this->state = 2;
+	$this->x = $this->lMargin;
+	$this->y = $this->tMargin;
+	$this->FontFamily = '';
+	// Check page size and orientation
+	if($orientation=='')
+		$orientation = $this->DefOrientation;
+	else
+		$orientation = strtoupper($orientation[0]);
+	if($size=='')
+		$size = $this->DefPageSize;
+	else
+		$size = $this->_getpagesize($size);
+	if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1])
+	{
+		// New size or orientation
+		if($orientation=='P')
+		{
+			$this->w = $size[0];
+			$this->h = $size[1];
+		}
+		else
+		{
+			$this->w = $size[1];
+			$this->h = $size[0];
+		}
+		$this->wPt = $this->w*$this->k;
+		$this->hPt = $this->h*$this->k;
+		$this->PageBreakTrigger = $this->h-$this->bMargin;
+		$this->CurOrientation = $orientation;
+		$this->CurPageSize = $size;
+	}
+	if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1])
+		$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
+}
+
+function _endpage()
+{
+	$this->state = 1;
+}
+
+function _loadfont($font)
+{
+	// Load a font definition file from the font directory
+	include($this->fontpath.$font);
+	$a = get_defined_vars();
+	if(!isset($a['name']))
+		$this->Error('Could not include font definition file');
+	return $a;
+}
+
+function _escape($s)
+{
+	// Escape special characters in strings
+	$s = str_replace('\\','\\\\',$s);
+	$s = str_replace('(','\\(',$s);
+	$s = str_replace(')','\\)',$s);
+	$s = str_replace("\r",'\\r',$s);
+	return $s;
+}
+
+function _textstring($s)
+{
+	// Format a text string
+	return '('.$this->_escape($s).')';
+}
+
+function _UTF8toUTF16($s)
+{
+	// Convert UTF-8 to UTF-16BE with BOM
+	$res = "\xFE\xFF";
+	$nb = strlen($s);
+	$i = 0;
+	while($i<$nb)
+	{
+		$c1 = ord($s[$i++]);
+		if($c1>=224)
+		{
+			// 3-byte character
+			$c2 = ord($s[$i++]);
+			$c3 = ord($s[$i++]);
+			$res .= chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2));
+			$res .= chr((($c2 & 0x03)<<6) + ($c3 & 0x3F));
+		}
+		elseif($c1>=192)
+		{
+			// 2-byte character
+			$c2 = ord($s[$i++]);
+			$res .= chr(($c1 & 0x1C)>>2);
+			$res .= chr((($c1 & 0x03)<<6) + ($c2 & 0x3F));
+		}
+		else
+		{
+			// Single-byte character
+			$res .= "\0".chr($c1);
+		}
+	}
+	return $res;
+}
+
+function _dounderline($x, $y, $txt)
+{
+	// Underline text
+	$up = $this->CurrentFont['up'];
+	$ut = $this->CurrentFont['ut'];
+	$w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' ');
+	return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
+}
+
+function _parsejpg($file)
+{
+	// Extract info from a JPEG file
+	$a = getimagesize($file);
+	if(!$a)
+		$this->Error('Missing or incorrect image file: '.$file);
+	if($a[2]!=2)
+		$this->Error('Not a JPEG file: '.$file);
+	if(!isset($a['channels']) || $a['channels']==3)
+		$colspace = 'DeviceRGB';
+	elseif($a['channels']==4)
+		$colspace = 'DeviceCMYK';
+	else
+		$colspace = 'DeviceGray';
+	$bpc = isset($a['bits']) ? $a['bits'] : 8;
+	$data = file_get_contents($file);
+	return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data);
+}
+
+function _parsepng($file)
+{
+	// Extract info from a PNG file
+	$f = fopen($file,'rb');
+	if(!$f)
+		$this->Error('Can\'t open image file: '.$file);
+	$info = $this->_parsepngstream($f,$file);
+	fclose($f);
+	return $info;
+}
+
+function _parsepngstream($f, $file)
+{
+	// Check signature
+	if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
+		$this->Error('Not a PNG file: '.$file);
+
+	// Read header chunk
+	$this->_readstream($f,4);
+	if($this->_readstream($f,4)!='IHDR')
+		$this->Error('Incorrect PNG file: '.$file);
+	$w = $this->_readint($f);
+	$h = $this->_readint($f);
+	$bpc = ord($this->_readstream($f,1));
+	if($bpc>8)
+		$this->Error('16-bit depth not supported: '.$file);
+	$ct = ord($this->_readstream($f,1));
+	if($ct==0 || $ct==4)
+		$colspace = 'DeviceGray';
+	elseif($ct==2 || $ct==6)
+		$colspace = 'DeviceRGB';
+	elseif($ct==3)
+		$colspace = 'Indexed';
+	else
+		$this->Error('Unknown color type: '.$file);
+	if(ord($this->_readstream($f,1))!=0)
+		$this->Error('Unknown compression method: '.$file);
+	if(ord($this->_readstream($f,1))!=0)
+		$this->Error('Unknown filter method: '.$file);
+	if(ord($this->_readstream($f,1))!=0)
+		$this->Error('Interlacing not supported: '.$file);
+	$this->_readstream($f,4);
+	$dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w;
+
+	// Scan chunks looking for palette, transparency and image data
+	$pal = '';
+	$trns = '';
+	$data = '';
+	do
+	{
+		$n = $this->_readint($f);
+		$type = $this->_readstream($f,4);
+		if($type=='PLTE')
+		{
+			// Read palette
+			$pal = $this->_readstream($f,$n);
+			$this->_readstream($f,4);
+		}
+		elseif($type=='tRNS')
+		{
+			// Read transparency info
+			$t = $this->_readstream($f,$n);
+			if($ct==0)
+				$trns = array(ord(substr($t,1,1)));
+			elseif($ct==2)
+				$trns = array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1)));
+			else
+			{
+				$pos = strpos($t,chr(0));
+				if($pos!==false)
+					$trns = array($pos);
+			}
+			$this->_readstream($f,4);
+		}
+		elseif($type=='IDAT')
+		{
+			// Read image data block
+			$data .= $this->_readstream($f,$n);
+			$this->_readstream($f,4);
+		}
+		elseif($type=='IEND')
+			break;
+		else
+			$this->_readstream($f,$n+4);
+	}
+	while($n);
+
+	if($colspace=='Indexed' && empty($pal))
+		$this->Error('Missing palette in '.$file);
+	$info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns);
+	if($ct>=4)
+	{
+		// Extract alpha channel
+		if(!function_exists('gzuncompress'))
+			$this->Error('Zlib not available, can\'t handle alpha channel: '.$file);
+		$data = gzuncompress($data);
+		$color = '';
+		$alpha = '';
+		if($ct==4)
+		{
+			// Gray image
+			$len = 2*$w;
+			for($i=0;$i<$h;$i++)
+			{
+				$pos = (1+$len)*$i;
+				$color .= $data[$pos];
+				$alpha .= $data[$pos];
+				$line = substr($data,$pos+1,$len);
+				$color .= preg_replace('/(.)./s','$1',$line);
+				$alpha .= preg_replace('/.(.)/s','$1',$line);
+			}
+		}
+		else
+		{
+			// RGB image
+			$len = 4*$w;
+			for($i=0;$i<$h;$i++)
+			{
+				$pos = (1+$len)*$i;
+				$color .= $data[$pos];
+				$alpha .= $data[$pos];
+				$line = substr($data,$pos+1,$len);
+				$color .= preg_replace('/(.{3})./s','$1',$line);
+				$alpha .= preg_replace('/.{3}(.)/s','$1',$line);
+			}
+		}
+		unset($data);
+		$data = gzcompress($color);
+		$info['smask'] = gzcompress($alpha);
+		if($this->PDFVersion<'1.4')
+			$this->PDFVersion = '1.4';
+	}
+	$info['data'] = $data;
+	return $info;
+}
+
+function _readstream($f, $n)
+{
+	// Read n bytes from stream
+	$res = '';
+	while($n>0 && !feof($f))
+	{
+		$s = fread($f,$n);
+		if($s===false)
+			$this->Error('Error while reading stream');
+		$n -= strlen($s);
+		$res .= $s;
+	}
+	if($n>0)
+		$this->Error('Unexpected end of stream');
+	return $res;
+}
+
+function _readint($f)
+{
+	// Read a 4-byte integer from stream
+	$a = unpack('Ni',$this->_readstream($f,4));
+	return $a['i'];
+}
+
+function _parsegif($file)
+{
+	// Extract info from a GIF file (via PNG conversion)
+	if(!function_exists('imagepng'))
+		$this->Error('GD extension is required for GIF support');
+	if(!function_exists('imagecreatefromgif'))
+		$this->Error('GD has no GIF read support');
+	$im = imagecreatefromgif($file);
+	if(!$im)
+		$this->Error('Missing or incorrect image file: '.$file);
+	imageinterlace($im,0);
+	$f = @fopen('php://temp','rb+');
+	if($f)
+	{
+		// Perform conversion in memory
+		ob_start();
+		imagepng($im);
+		$data = ob_get_clean();
+		imagedestroy($im);
+		fwrite($f,$data);
+		rewind($f);
+		$info = $this->_parsepngstream($f,$file);
+		fclose($f);
+	}
+	else
+	{
+		// Use temporary file
+		$tmp = tempnam('.','gif');
+		if(!$tmp)
+			$this->Error('Unable to create a temporary file');
+		if(!imagepng($im,$tmp))
+			$this->Error('Error while saving to temporary file');
+		imagedestroy($im);
+		$info = $this->_parsepng($tmp);
+		unlink($tmp);
+	}
+	return $info;
+}
+
+function _newobj()
+{
+	// Begin a new object
+	$this->n++;
+	$this->offsets[$this->n] = strlen($this->buffer);
+	$this->_out($this->n.' 0 obj');
+}
+
+function _putstream($s)
+{
+	$this->_out('stream');
+	$this->_out($s);
+	$this->_out('endstream');
+}
+
+function _out($s)
+{
+	// Add a line to the document
+	if($this->state==2)
+		$this->pages[$this->page] .= $s."\n";
+	else
+		$this->buffer .= $s."\n";
+}
+
+function _putpages()
+{
+	$nb = $this->page;
+	if(!empty($this->AliasNbPages))
+	{
+		// Replace number of pages
+		for($n=1;$n<=$nb;$n++)
+			$this->pages[$n] = str_replace($this->AliasNbPages,$nb,$this->pages[$n]);
+	}
+	if($this->DefOrientation=='P')
+	{
+		$wPt = $this->DefPageSize[0]*$this->k;
+		$hPt = $this->DefPageSize[1]*$this->k;
+	}
+	else
+	{
+		$wPt = $this->DefPageSize[1]*$this->k;
+		$hPt = $this->DefPageSize[0]*$this->k;
+	}
+	$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
+	for($n=1;$n<=$nb;$n++)
+	{
+		// Page
+		$this->_newobj();
+		$this->_out('<</Type /Page');
+		$this->_out('/Parent 1 0 R');
+		if(isset($this->PageSizes[$n]))
+			$this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1]));
+		$this->_out('/Resources 2 0 R');
+		if(isset($this->PageLinks[$n]))
+		{
+			// Links
+			$annots = '/Annots [';
+			foreach($this->PageLinks[$n] as $pl)
+			{
+				$rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
+				$annots .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
+				if(is_string($pl[4]))
+					$annots .= '/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
+				else
+				{
+					$l = $this->links[$pl[4]];
+					$h = isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt;
+					$annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k);
+				}
+			}
+			$this->_out($annots.']');
+		}
+		if($this->PDFVersion>'1.3')
+			$this->_out('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
+		$this->_out('/Contents '.($this->n+1).' 0 R>>');
+		$this->_out('endobj');
+		// Page content
+		$p = ($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
+		$this->_newobj();
+		$this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
+		$this->_putstream($p);
+		$this->_out('endobj');
+	}
+	// Pages root
+	$this->offsets[1] = strlen($this->buffer);
+	$this->_out('1 0 obj');
+	$this->_out('<</Type /Pages');
+	$kids = '/Kids [';
+	for($i=0;$i<$nb;$i++)
+		$kids .= (3+2*$i).' 0 R ';
+	$this->_out($kids.']');
+	$this->_out('/Count '.$nb);
+	$this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt));
+	$this->_out('>>');
+	$this->_out('endobj');
+}
+
+function _putfonts()
+{
+	$nf = $this->n;
+	foreach($this->diffs as $diff)
+	{
+		// Encodings
+		$this->_newobj();
+		$this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
+		$this->_out('endobj');
+	}
+	foreach($this->FontFiles as $file=>$info)
+	{
+		// Font file embedding
+		$this->_newobj();
+		$this->FontFiles[$file]['n'] = $this->n;
+		$font = file_get_contents($this->fontpath.$file,true);
+		if(!$font)
+			$this->Error('Font file not found: '.$file);
+		$compressed = (substr($file,-2)=='.z');
+		if(!$compressed && isset($info['length2']))
+			$font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']);
+		$this->_out('<</Length '.strlen($font));
+		if($compressed)
+			$this->_out('/Filter /FlateDecode');
+		$this->_out('/Length1 '.$info['length1']);
+		if(isset($info['length2']))
+			$this->_out('/Length2 '.$info['length2'].' /Length3 0');
+		$this->_out('>>');
+		$this->_putstream($font);
+		$this->_out('endobj');
+	}
+	foreach($this->fonts as $k=>$font)
+	{
+		// Font objects
+		$this->fonts[$k]['n'] = $this->n+1;
+		$type = $font['type'];
+		$name = $font['name'];
+		if($type=='Core')
+		{
+			// Core font
+			$this->_newobj();
+			$this->_out('<</Type /Font');
+			$this->_out('/BaseFont /'.$name);
+			$this->_out('/Subtype /Type1');
+			if($name!='Symbol' && $name!='ZapfDingbats')
+				$this->_out('/Encoding /WinAnsiEncoding');
+			$this->_out('>>');
+			$this->_out('endobj');
+		}
+		elseif($type=='Type1' || $type=='TrueType')
+		{
+			// Additional Type1 or TrueType/OpenType font
+			$this->_newobj();
+			$this->_out('<</Type /Font');
+			$this->_out('/BaseFont /'.$name);
+			$this->_out('/Subtype /'.$type);
+			$this->_out('/FirstChar 32 /LastChar 255');
+			$this->_out('/Widths '.($this->n+1).' 0 R');
+			$this->_out('/FontDescriptor '.($this->n+2).' 0 R');
+			if(isset($font['diffn']))
+				$this->_out('/Encoding '.($nf+$font['diffn']).' 0 R');
+			else
+				$this->_out('/Encoding /WinAnsiEncoding');
+			$this->_out('>>');
+			$this->_out('endobj');
+			// Widths
+			$this->_newobj();
+			$cw = &$font['cw'];
+			$s = '[';
+			for($i=32;$i<=255;$i++)
+				$s .= $cw[chr($i)].' ';
+			$this->_out($s.']');
+			$this->_out('endobj');
+			// Descriptor
+			$this->_newobj();
+			$s = '<</Type /FontDescriptor /FontName /'.$name;
+			foreach($font['desc'] as $k=>$v)
+				$s .= ' /'.$k.' '.$v;
+			if(!empty($font['file']))
+				$s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
+			$this->_out($s.'>>');
+			$this->_out('endobj');
+		}
+		else
+		{
+			// Allow for additional types
+			$mtd = '_put'.strtolower($type);
+			if(!method_exists($this,$mtd))
+				$this->Error('Unsupported font type: '.$type);
+			$this->$mtd($font);
+		}
+	}
+}
+
+function _putimages()
+{
+	foreach(array_keys($this->images) as $file)
+	{
+		$this->_putimage($this->images[$file]);
+		unset($this->images[$file]['data']);
+		unset($this->images[$file]['smask']);
+	}
+}
+
+function _putimage(&$info)
+{
+	$this->_newobj();
+	$info['n'] = $this->n;
+	$this->_out('<</Type /XObject');
+	$this->_out('/Subtype /Image');
+	$this->_out('/Width '.$info['w']);
+	$this->_out('/Height '.$info['h']);
+	if($info['cs']=='Indexed')
+		$this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
+	else
+	{
+		$this->_out('/ColorSpace /'.$info['cs']);
+		if($info['cs']=='DeviceCMYK')
+			$this->_out('/Decode [1 0 1 0 1 0 1 0]');
+	}
+	$this->_out('/BitsPerComponent '.$info['bpc']);
+	if(isset($info['f']))
+		$this->_out('/Filter /'.$info['f']);
+	if(isset($info['dp']))
+		$this->_out('/DecodeParms <<'.$info['dp'].'>>');
+	if(isset($info['trns']) && is_array($info['trns']))
+	{
+		$trns = '';
+		for($i=0;$i<count($info['trns']);$i++)
+			$trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
+		$this->_out('/Mask ['.$trns.']');
+	}
+	if(isset($info['smask']))
+		$this->_out('/SMask '.($this->n+1).' 0 R');
+	$this->_out('/Length '.strlen($info['data']).'>>');
+	$this->_putstream($info['data']);
+	$this->_out('endobj');
+	// Soft mask
+	if(isset($info['smask']))
+	{
+		$dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w'];
+		$smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']);
+		$this->_putimage($smask);
+	}
+	// Palette
+	if($info['cs']=='Indexed')
+	{
+		$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
+		$pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
+		$this->_newobj();
+		$this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
+		$this->_putstream($pal);
+		$this->_out('endobj');
+	}
+}
+
+function _putxobjectdict()
+{
+	foreach($this->images as $image)
+		$this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
+}
+
+function _putresourcedict()
+{
+	$this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+	$this->_out('/Font <<');
+	foreach($this->fonts as $font)
+		$this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
+	$this->_out('>>');
+	$this->_out('/XObject <<');
+	$this->_putxobjectdict();
+	$this->_out('>>');
+}
+
+function _putresources()
+{
+	$this->_putfonts();
+	$this->_putimages();
+	// Resource dictionary
+	$this->offsets[2] = strlen($this->buffer);
+	$this->_out('2 0 obj');
+	$this->_out('<<');
+	$this->_putresourcedict();
+	$this->_out('>>');
+	$this->_out('endobj');
+}
+
+function _putinfo()
+{
+	$this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION));
+	if(!empty($this->title))
+		$this->_out('/Title '.$this->_textstring($this->title));
+	if(!empty($this->subject))
+		$this->_out('/Subject '.$this->_textstring($this->subject));
+	if(!empty($this->author))
+		$this->_out('/Author '.$this->_textstring($this->author));
+	if(!empty($this->keywords))
+		$this->_out('/Keywords '.$this->_textstring($this->keywords));
+	if(!empty($this->creator))
+		$this->_out('/Creator '.$this->_textstring($this->creator));
+	$this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis')));
+}
+
+function _putcatalog()
+{
+	$this->_out('/Type /Catalog');
+	$this->_out('/Pages 1 0 R');
+	if($this->ZoomMode=='fullpage')
+		$this->_out('/OpenAction [3 0 R /Fit]');
+	elseif($this->ZoomMode=='fullwidth')
+		$this->_out('/OpenAction [3 0 R /FitH null]');
+	elseif($this->ZoomMode=='real')
+		$this->_out('/OpenAction [3 0 R /XYZ null null 1]');
+	elseif(!is_string($this->ZoomMode))
+		$this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']');
+	if($this->LayoutMode=='single')
+		$this->_out('/PageLayout /SinglePage');
+	elseif($this->LayoutMode=='continuous')
+		$this->_out('/PageLayout /OneColumn');
+	elseif($this->LayoutMode=='two')
+		$this->_out('/PageLayout /TwoColumnLeft');
+}
+
+function _putheader()
+{
+	$this->_out('%PDF-'.$this->PDFVersion);
+}
+
+function _puttrailer()
+{
+	$this->_out('/Size '.($this->n+1));
+	$this->_out('/Root '.$this->n.' 0 R');
+	$this->_out('/Info '.($this->n-1).' 0 R');
+}
+
+function _enddoc()
+{
+	$this->_putheader();
+	$this->_putpages();
+	$this->_putresources();
+	// Info
+	$this->_newobj();
+	$this->_out('<<');
+	$this->_putinfo();
+	$this->_out('>>');
+	$this->_out('endobj');
+	// Catalog
+	$this->_newobj();
+	$this->_out('<<');
+	$this->_putcatalog();
+	$this->_out('>>');
+	$this->_out('endobj');
+	// Cross-ref
+	$o = strlen($this->buffer);
+	$this->_out('xref');
+	$this->_out('0 '.($this->n+1));
+	$this->_out('0000000000 65535 f ');
+	for($i=1;$i<=$this->n;$i++)
+		$this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));
+	// Trailer
+	$this->_out('trailer');
+	$this->_out('<<');
+	$this->_puttrailer();
+	$this->_out('>>');
+	$this->_out('startxref');
+	$this->_out($o);
+	$this->_out('%%EOF');
+	$this->state = 3;
+}
+// End of class
+}
+
+// Handle special IE contype request
+if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype')
+{
+	header('Content-Type: application/pdf');
+	exit;
+}
+
+?>
Index: /lib/fpdf/fpdf_tpl.php
===================================================================
--- /lib/fpdf/fpdf_tpl.php	(revision 5261)
+++ /lib/fpdf/fpdf_tpl.php	(revision 5261)
@@ -0,0 +1,449 @@
+<?php
+//
+//  FPDF_TPL - Version 1.2
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+class FPDF_TPL extends FPDF {
+    /**
+     * Array of Tpl-Data
+     * @var array
+     */
+    var $tpls = array();
+
+    /**
+     * Current Template-ID
+     * @var int
+     */
+    var $tpl = 0;
+    
+    /**
+     * "In Template"-Flag
+     * @var boolean
+     */
+    var $_intpl = false;
+    
+    /**
+     * Nameprefix of Templates used in Resources-Dictonary
+     * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
+     */
+    var $tplprefix = "/TPL";
+
+    /**
+     * Resources used By Templates and Pages
+     * @var array
+     */
+    var $_res = array();
+    
+    /**
+     * Last used Template data
+     *
+     * @var array
+     */
+    var $lastUsedTemplateData = array();
+    
+    /**
+     * Start a Template
+     *
+     * This method starts a template. You can give own coordinates to build an own sized
+     * Template. Pay attention, that the margins are adapted to the new templatesize.
+     * If you want to write outside the template, for example to build a clipped Template,
+     * you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
+     *
+     * If no parameter is given, the template uses the current page-size.
+     * The Method returns an ID of the current Template. This ID is used later for using this template.
+     * Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
+     *
+     * @param int $x The x-coordinate given in user-unit
+     * @param int $y The y-coordinate given in user-unit
+     * @param int $w The width given in user-unit
+     * @param int $h The height given in user-unit
+     * @return int The ID of new created Template
+     */
+    function beginTemplate($x = null, $y = null, $w = null, $h = null) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+    		$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
+    		return;
+    	}
+    	
+        if ($this->page <= 0)
+            $this->error("You have to add a page to fpdf first!");
+
+        if ($x == null)
+            $x = 0;
+        if ($y == null)
+            $y = 0;
+        if ($w == null)
+            $w = $this->w;
+        if ($h == null)
+            $h = $this->h;
+
+        // Save settings
+        $this->tpl++;
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl = array(
+            'o_x' => $this->x,
+            'o_y' => $this->y,
+            'o_AutoPageBreak' => $this->AutoPageBreak,
+            'o_bMargin' => $this->bMargin,
+            'o_tMargin' => $this->tMargin,
+            'o_lMargin' => $this->lMargin,
+            'o_rMargin' => $this->rMargin,
+            'o_h' => $this->h,
+            'o_w' => $this->w,
+            'buffer' => '',
+            'x' => $x,
+            'y' => $y,
+            'w' => $w,
+            'h' => $h
+        );
+
+        $this->SetAutoPageBreak(false);
+        
+        // Define own high and width to calculate possitions correct
+        $this->h = $h;
+        $this->w = $w;
+
+        $this->_intpl = true;
+        $this->SetXY($x + $this->lMargin, $y + $this->tMargin);
+        $this->SetRightMargin($this->w - $w + $this->rMargin);
+
+        return $this->tpl;
+    }
+    
+    /**
+     * End Template
+     *
+     * This method ends a template and reset initiated variables on beginTemplate.
+     *
+     * @return mixed If a template is opened, the ID is returned. If not a false is returned.
+     */
+    function endTemplate() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
+        }
+        
+        if ($this->_intpl) {
+            $this->_intpl = false; 
+            $tpl =& $this->tpls[$this->tpl];
+            $this->SetXY($tpl['o_x'], $tpl['o_y']);
+            $this->tMargin = $tpl['o_tMargin'];
+            $this->lMargin = $tpl['o_lMargin'];
+            $this->rMargin = $tpl['o_rMargin'];
+            $this->h = $tpl['o_h'];
+            $this->w = $tpl['o_w'];
+            $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
+            
+            return $this->tpl;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * Use a Template in current Page or other Template
+     *
+     * You can use a template in a page or in another template.
+     * You can give the used template a new size like you use the Image()-method.
+     * All parameters are optional. The width or height is calculated automaticaly
+     * if one is given. If no parameter is given the origin size as defined in
+     * beginTemplate() is used.
+     * The calculated or used width and height are returned as an array.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_x The x-position
+     * @param int $_y The y-position
+     * @param int $_w The new width of the template
+     * @param int $_h The new height of the template
+     * @retrun array The height and width of the template
+     */
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
+        if ($this->page <= 0)
+        	$this->error('You have to add a page first!');
+        
+        if (!isset($this->tpls[$tplidx]))
+            $this->error('Template does not exist!');
+            
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
+        }
+        
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_x == null)
+            $_x = 0;
+        if ($_y == null)
+            $_y = 0;
+            
+        $_x += $tpl['x'];
+        $_y += $tpl['y'];
+        
+        $wh = $this->getTemplateSize($tplidx, $_w, $_h);
+        $_w = $wh['w'];
+        $_h = $wh['h'];
+    
+        $tData = array(
+            'x' => $this->x,
+            'y' => $this->y,
+            'w' => $_w,
+            'h' => $_h,
+            'scaleX' => ($_w / $w),
+            'scaleY' => ($_h / $h),
+            'tx' => $_x,
+            'ty' =>  ($this->h - $_y - $_h),
+            'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
+        );
+        
+        $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate 
+        $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
+
+        // reset font in the outer graphic state
+        if ($this->FontFamily) {
+	        $family = $this->FontFamily;
+	        $this->FontFamily = '';
+	        $this->SetFont($family);
+        }
+        
+        $this->lastUsedTemplateData = $tData;
+        
+        return array('w' => $_w, 'h' => $_h);
+    }
+    
+    /**
+     * Get The calculated Size of a Template
+     *
+     * If one size is given, this method calculates the other one.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_w The width of the template
+     * @param int $_h The height of the template
+     * @return array The height and width of the template
+     */
+    function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
+        if (!$this->tpls[$tplidx])
+            return false;
+
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_w == 0 and $_h == 0) {
+            $_w = $w;
+            $_h = $h;
+        }
+
+    	if($_w == 0)
+    		$_w = $_h * $w / $h;
+    	if($_h == 0)
+    		$_h = $_w * $h / $w;
+    		
+        return array("w" => $_w, "h" => $_h);
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    public function SetFont($family, $style = '', $size = 0) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
+        }
+        
+        /**
+         * force the resetting of font changes in a template
+         */
+        if ($this->_intpl)
+            $this->FontFamily = '';
+            
+        parent::SetFont($family, $style, $size);
+       
+        $fontkey = $this->FontFamily . $this->FontStyle;
+        
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        } else {
+            $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        }
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '') {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Image'), $args);
+        }
+        
+        $ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
+        } else {
+            $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
+        }
+        
+        return $ret;
+    }
+    
+    /**
+     * See FPDF-Documentation ;-)
+     *
+     * AddPage is not available when you're "in" a template.
+     */
+    function AddPage($orientation = '', $format = '') {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding pages in templates isn\'t possible!');
+            
+        parent::AddPage($orientation, $format);
+    }
+
+    /**
+     * Preserve adding Links in Templates ...won't work
+     */
+    function Link($x, $y, $w, $h, $link) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Link'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Using links in templates aren\'t possible!');
+            
+        parent::Link($x, $y, $w, $h, $link);
+    }
+    
+    function AddLink() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding links in templates aren\'t possible!');
+        return parent::AddLink();
+    }
+    
+    function SetLink($link, $y = 0, $page = -1) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Setting links in templates aren\'t possible!');
+        parent::SetLink($link, $y, $page);
+    }
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<'.$filter.'/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
+                // llx
+                $tpl['x'] * $this->k,
+                // lly
+                -$tpl['y'] * $this->k,
+                // urx
+                ($tpl['w'] + $tpl['x']) * $this->k,
+                // ury
+                ($tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            if ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
+                     -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+        	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+            	$this->_out('/Font <<');
+                foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+            		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+            	$this->_out('>>');
+            }
+        	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+        	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+        	{
+                $this->_out('/XObject <<');
+                if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                    foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+              			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                }
+                if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                    foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                        $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                }
+                $this->_out('>>');
+        	}
+        	$this->_out('>>');
+        	
+        	$this->_out('/Length ' . strlen($p) . ' >>');
+    		$this->_putstream($p);
+    		$this->_out('endobj');
+        }
+    }
+    
+    /**
+     * Overwritten to add _putformxobjects() after _putimages()
+     *
+     */
+    function _putimages() {
+        parent::_putimages();
+        $this->_putformxobjects();
+    }
+    
+    function _putxobjectdict() {
+        parent::_putxobjectdict();
+        
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
+            }
+        }
+    }
+
+    /**
+     * Private Method
+     */
+    function _out($s) {
+        if ($this->state == 2 && $this->_intpl) {
+            $this->tpls[$this->tpl]['buffer'] .= $s . "\n";
+        } else {
+            parent::_out($s);
+        }
+    }
+}
Index: /lib/fpdf/fpdi.php
===================================================================
--- /lib/fpdf/fpdi.php	(revision 5261)
+++ /lib/fpdf/fpdi.php	(revision 5261)
@@ -0,0 +1,548 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+define('FPDI_VERSION', '1.4');
+
+// Check for TCPDF and remap TCPDF to FPDF
+if (class_exists('TCPDF', false)) {
+    require_once('fpdi2tcpdf_bridge.php');
+}
+
+require_once('fpdf_tpl.php');
+require_once('fpdi_pdf_parser.php');
+
+
+class FPDI extends FPDF_TPL {
+    /**
+     * Actual filename
+     * @var string
+     */
+    var $current_filename;
+
+    /**
+     * Parser-Objects
+     * @var array
+     */
+    var $parsers;
+    
+    /**
+     * Current parser
+     * @var object
+     */
+    var $current_parser;
+    
+    /**
+     * object stack
+     * @var array
+     */
+    var $_obj_stack;
+    
+    /**
+     * done object stack
+     * @var array
+     */
+    var $_don_obj_stack;
+
+    /**
+     * Current Object Id.
+     * @var integer
+     */
+    var $_current_obj_id;
+    
+    /**
+     * The name of the last imported page box
+     * @var string
+     */
+    var $lastUsedPageBox;
+    
+    /**
+     * Cache for imported pages/template ids
+     * @var array
+     */
+    var $_importedPages = array();
+    
+    /**
+     * Set a source-file
+     *
+     * @param string $filename a valid filename
+     * @return int number of available pages
+     */
+    function setSourceFile($filename) {
+        $this->current_filename = $filename;
+        
+        if (!isset($this->parsers[$filename]))
+            $this->parsers[$filename] = $this->_getPdfParser($filename);
+        $this->current_parser =& $this->parsers[$filename];
+        
+        return $this->parsers[$filename]->getPageCount();
+    }
+    
+    /**
+     * Returns a PDF parser object
+     *
+     * @param string $filename
+     * @return fpdi_pdf_parser
+     */
+    function _getPdfParser($filename) {
+    	return new fpdi_pdf_parser($filename, $this);
+    }
+    
+    /**
+     * Get the current PDF version
+     *
+     * @return string
+     */
+    function getPDFVersion() {
+		return $this->PDFVersion;
+	}
+    
+	/**
+     * Set the PDF version
+     *
+     * @return string
+     */
+	function setPDFVersion($version = '1.3') {
+		$this->PDFVersion = $version;
+	}
+	
+    /**
+     * Import a page
+     *
+     * @param int $pageno pagenumber
+     * @return int Index of imported page - to use with fpdf_tpl::useTemplate()
+     */
+    function importPage($pageno, $boxName = '/CropBox') {
+        if ($this->_intpl) {
+            return $this->error('Please import the desired pages before creating a new template.');
+        }
+        
+        $fn = $this->current_filename;
+        
+        // check if page already imported
+        $pageKey = $fn . ((int)$pageno) . $boxName;
+        if (isset($this->_importedPages[$pageKey]))
+            return $this->_importedPages[$pageKey];
+        
+        $parser =& $this->parsers[$fn];
+        $parser->setPageno($pageno);
+
+        if (!in_array($boxName, $parser->availableBoxes))
+            return $this->Error(sprintf('Unknown box: %s', $boxName));
+        $pageboxes = $parser->getPageBoxes($pageno, $this->k);
+        
+        /**
+         * MediaBox
+         * CropBox: Default -> MediaBox
+         * BleedBox: Default -> CropBox
+         * TrimBox: Default -> CropBox
+         * ArtBox: Default -> CropBox
+         */
+        if (!isset($pageboxes[$boxName]) && ($boxName == '/BleedBox' || $boxName == '/TrimBox' || $boxName == '/ArtBox'))
+            $boxName = '/CropBox';
+        if (!isset($pageboxes[$boxName]) && $boxName == '/CropBox')
+            $boxName = '/MediaBox';
+        
+        if (!isset($pageboxes[$boxName]))
+            return false;
+        $this->lastUsedPageBox = $boxName;
+        
+        $box = $pageboxes[$boxName];
+        
+        $this->tpl++;
+        $this->tpls[$this->tpl] = array();
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl['parser'] =& $parser;
+        $tpl['resources'] = $parser->getPageResources();
+        $tpl['buffer'] = $parser->getContent();
+        $tpl['box'] = $box;
+        
+        // To build an array that can be used by PDF_TPL::useTemplate()
+        $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl], $box);
+        
+        // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects()
+        $tpl['x'] = 0;
+        $tpl['y'] = 0;
+        
+        // handle rotated pages
+        $rotation = $parser->getPageRotation($pageno);
+        $tpl['_rotationAngle'] = 0;
+        if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) {
+        	$steps = $angle / 90;
+                
+            $_w = $tpl['w'];
+            $_h = $tpl['h'];
+            $tpl['w'] = $steps % 2 == 0 ? $_w : $_h;
+            $tpl['h'] = $steps % 2 == 0 ? $_h : $_w;
+            
+            if ($angle < 0)
+            	$angle += 360;
+            
+        	$tpl['_rotationAngle'] = $angle * -1;
+        }
+        
+        $this->_importedPages[$pageKey] = $this->tpl;
+        
+        return $this->tpl;
+    }
+    
+    function getLastUsedPageBox() {
+        return $this->lastUsedPageBox;
+    }
+    
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0, $adjustPageSize = false) {
+        if ($adjustPageSize == true && is_null($_x) && is_null($_y)) {
+            $size = $this->getTemplateSize($tplidx, $_w, $_h);
+            $format = array($size['w'], $size['h']);
+            if (is_subclass_of($this, 'TCPDF')) {
+            	$this->setPageFormat($format, $format[0] > $format[1] ? 'L' : 'P');
+            } else {
+            	if ($format[0] != $this->CurPageFormat[0] || $format[1] != $this->CurPageFormat[1]) {
+	                $this->w = $format[0];
+	                $this->h = $format[1];
+	                $this->wPt = $this->w * $this->k;
+	        		$this->hPt = $this->h * $this->k;
+	        		$this->PageBreakTrigger = $this->h - $this->bMargin;
+	        		$this->CurPageFormat = $format;
+	        		$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
+	            }
+            } 
+        }
+        
+        $this->_out('q 0 J 1 w 0 j 0 G 0 g'); // reset standard values
+        $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h);
+        $this->_out('Q');
+        
+        return $s;
+    }
+    
+    /**
+     * Private method, that rebuilds all needed objects of source files
+     */
+    function _putimportedobjects() {
+        if (is_array($this->parsers) && count($this->parsers) > 0) {
+            foreach($this->parsers AS $filename => $p) {
+                $this->current_parser =& $this->parsers[$filename];
+                if (isset($this->_obj_stack[$filename]) && is_array($this->_obj_stack[$filename])) {
+                    while(($n = key($this->_obj_stack[$filename])) !== null) {
+                        $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c, $this->_obj_stack[$filename][$n][1]);
+						
+                        $this->_newobj($this->_obj_stack[$filename][$n][0]);
+                        
+                        if ($nObj[0] == PDF_TYPE_STREAM) {
+							$this->pdf_write_value($nObj);
+                        } else {
+                            $this->pdf_write_value($nObj[1]);
+                        }
+                        
+                        $this->_out('endobj');
+                        $this->_obj_stack[$filename][$n] = null; // free memory
+                        unset($this->_obj_stack[$filename][$n]);
+                        reset($this->_obj_stack[$filename]);
+                    }
+                }
+            }
+        }
+    }
+    
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$cN = $this->n; // TCPDF/Protection: rem current "n"
+    		
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<' . $filter . '/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', 
+                (isset($tpl['box']['llx']) ? $tpl['box']['llx'] : $tpl['x']) * $this->k,
+                (isset($tpl['box']['lly']) ? $tpl['box']['lly'] : -$tpl['y']) * $this->k,
+                (isset($tpl['box']['urx']) ? $tpl['box']['urx'] : $tpl['w'] + $tpl['x']) * $this->k,
+                (isset($tpl['box']['ury']) ? $tpl['box']['ury'] : $tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            $c = 1;
+            $s = 0;
+            $tx = 0;
+            $ty = 0;
+            
+            if (isset($tpl['box'])) {
+                $tx = -$tpl['box']['llx'];
+                $ty = -$tpl['box']['lly']; 
+                
+                if ($tpl['_rotationAngle'] <> 0) {
+                    $angle = $tpl['_rotationAngle'] * M_PI/180;
+                    $c=cos($angle);
+                    $s=sin($angle);
+                    
+                    switch($tpl['_rotationAngle']) {
+                        case -90:
+                           $tx = -$tpl['box']['lly'];
+                           $ty = $tpl['box']['urx'];
+                           break;
+                        case -180:
+                            $tx = $tpl['box']['urx'];
+                            $ty = $tpl['box']['ury'];
+                            break;
+                        case -270:
+                        	$tx = $tpl['box']['ury'];
+                            $ty = -$tpl['box']['llx'];
+                            break;
+                    }
+                }
+            } else if ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $tx = -$tpl['x']*2;
+                $ty = $tpl['y']*2;
+            }
+            
+            $tx *= $this->k;
+            $ty *= $this->k;
+            
+            if ($c != 1 || $s != 0 || $tx != 0 || $ty != 0) {
+                $this->_out(sprintf('/Matrix [%.5F %.5F %.5F %.5F %.5F %.5F]',
+                    $c, $s, -$s, $c, $tx, $ty
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            if (isset($tpl['resources'])) {
+                $this->current_parser =& $tpl['parser'];
+                $this->pdf_write_value($tpl['resources']); // "n" will be changed
+            } else {
+                $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+
+                $this->_out('/ExtGState <<');
+				foreach($this->extgstates as $k=>$extgstate)
+				$this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R');
+				$this->_out('>>');
+                
+            	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+                	$this->_out('/Font <<');
+                    foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+                		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+                	$this->_out('>>');
+                }
+            	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+            	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+            	{
+                    $this->_out('/XObject <<');
+                    if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                        foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+                  			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                    }
+                    if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                        foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                            $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                    }
+                    $this->_out('>>');
+            	}
+            	$this->_out('>>');
+            }
+
+            $nN = $this->n; // TCPDF: rem new "n"
+            $this->n = $cN; // TCPDF: reset to current "n"
+            $this->_out('/Length ' . strlen($p) . ' >>');
+    		$this->_putstream($p);
+    		$this->_out('endobj');
+    		$this->n = $nN; // TCPDF: reset to new "n"
+        }
+        
+        $this->_putimportedobjects();
+    }
+
+    /**
+     * Rewritten to handle existing own defined objects
+     */
+    function _newobj($obj_id = false, $onlynewobj = false) {
+        if (!$obj_id) {
+            $obj_id = ++$this->n;
+        }
+
+        //Begin a new object
+        if (!$onlynewobj) {
+            $this->offsets[$obj_id] = is_subclass_of($this, 'TCPDF') ? $this->bufferlen : strlen($this->buffer);
+            $this->_out($obj_id . ' 0 obj');
+            $this->_current_obj_id = $obj_id; // for later use with encryption
+        }
+        
+        return $obj_id;
+    }
+
+    /**
+     * Writes a value
+     * Needed to rebuild the source document
+     *
+     * @param mixed $value A PDF-Value. Structure of values see cases in this method
+     */
+    function pdf_write_value(&$value)
+    {
+        if (is_subclass_of($this, 'TCPDF')) {
+            parent::pdf_write_value($value);
+        }
+        
+        switch ($value[0]) {
+
+    		case PDF_TYPE_TOKEN:
+                $this->_straightOut($value[1] . ' ');
+    			break;
+		    case PDF_TYPE_NUMERIC:
+    		case PDF_TYPE_REAL:
+                if (is_float($value[1]) && $value[1] != 0) {
+    			    $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') . ' ');
+    			} else {
+        			$this->_straightOut($value[1] . ' ');
+    			}
+    			break;
+    			
+    		case PDF_TYPE_ARRAY:
+
+    			// An array. Output the proper
+    			// structure and move on.
+
+    			$this->_straightOut('[');
+                for ($i = 0; $i < count($value[1]); $i++) {
+    				$this->pdf_write_value($value[1][$i]);
+    			}
+
+    			$this->_out(']');
+    			break;
+
+    		case PDF_TYPE_DICTIONARY:
+
+    			// A dictionary.
+    			$this->_straightOut('<<');
+
+    			reset ($value[1]);
+
+    			while (list($k, $v) = each($value[1])) {
+    				$this->_straightOut($k . ' ');
+    				$this->pdf_write_value($v);
+    			}
+
+    			$this->_straightOut('>>');
+    			break;
+
+    		case PDF_TYPE_OBJREF:
+
+    			// An indirect object reference
+    			// Fill the object stack if needed
+    			$cpfn =& $this->current_parser->filename;
+    			
+    			if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) {
+    			    $this->_newobj(false, true);
+    			    $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value);
+                    $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); // Value is maybee obsolete!!!
+                }
+                $objid = $this->_don_obj_stack[$cpfn][$value[1]][0];
+
+    			$this->_out($objid . ' 0 R');
+    			break;
+
+    		case PDF_TYPE_STRING:
+
+    			// A string.
+                $this->_straightOut('(' . $value[1] . ')');
+
+    			break;
+
+    		case PDF_TYPE_STREAM:
+
+    			// A stream. First, output the
+    			// stream dictionary, then the
+    			// stream data itself.
+                $this->pdf_write_value($value[1]);
+    			$this->_out('stream');
+    			$this->_out($value[2][1]);
+    			$this->_out('endstream');
+    			break;
+    			
+            case PDF_TYPE_HEX:
+                $this->_straightOut('<' . $value[1] . '>');
+                break;
+
+            case PDF_TYPE_BOOLEAN:
+    		    $this->_straightOut($value[1] ? 'true ' : 'false ');
+    		    break;
+            
+    		case PDF_TYPE_NULL:
+                // The null object.
+
+    			$this->_straightOut('null ');
+    			break;
+    	}
+    }
+    
+    
+    /**
+     * Modified so not each call will add a newline to the output.
+     */
+    function _straightOut($s) {
+        if (!is_subclass_of($this, 'TCPDF')) {
+            if($this->state==2)
+        		$this->pages[$this->page] .= $s;
+        	else
+        		$this->buffer .= $s;
+        } else {
+            if ($this->state == 2) {
+				if (isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {
+					// puts data before page footer
+					$page = substr($this->getPageBuffer($this->page), 0, -$this->footerlen[$this->page]);
+					$footer = substr($this->getPageBuffer($this->page), -$this->footerlen[$this->page]);
+					$this->setPageBuffer($this->page, $page . ' ' . $s . "\n" . $footer);
+				} else {
+					$this->setPageBuffer($this->page, $s, true);
+				}
+			} else {
+				$this->setBuffer($s);
+			}
+        }
+    }
+
+    /**
+     * rewritten to close opened parsers
+     *
+     */
+    function _enddoc() {
+        parent::_enddoc();
+        $this->_closeParsers();
+    }
+    
+    /**
+     * close all files opened by parsers
+     */
+    function _closeParsers() {
+        if ($this->state > 2 && count($this->parsers) > 0) {
+          	foreach ($this->parsers as $k => $_){
+            	$this->parsers[$k]->closeFile();
+            	$this->parsers[$k] = null;
+            	unset($this->parsers[$k]);
+            }
+            return true;
+        }
+        return false;
+    }
+}
Index: /lib/fpdf/fpdi2tcpdf_bridge.php
===================================================================
--- /lib/fpdf/fpdi2tcpdf_bridge.php	(revision 5261)
+++ /lib/fpdf/fpdi2tcpdf_bridge.php	(revision 5261)
@@ -0,0 +1,163 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+/**
+ * This class is used as a bridge between TCPDF and FPDI
+ * and will create the possibility to use both FPDF and TCPDF
+ * via one FPDI version.
+ * 
+ * We'll simply remap TCPDF to FPDF again.
+ * 
+ * It'll be loaded and extended by FPDF_TPL.
+ */
+class FPDF extends TCPDF {
+    
+	function _putstream($s) {
+		$this->_out($this->_getstream($s));
+	}
+	
+	function _getxobjectdict() {
+        $out = parent::_getxobjectdict();
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $out .= sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']);
+            }
+        }
+        
+        return $out;
+    }
+	
+    /**
+     * Encryption of imported data by FPDI
+     *
+     * @param array $value
+     */
+    function pdf_write_value(&$value) {
+        switch ($value[0]) {
+    		case PDF_TYPE_STRING:
+				if ($this->encrypted) {
+				    $value[1] = $this->_unescape($value[1]);
+                    $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
+                 	$value[1] = $this->_escape($value[1]);
+                } 
+    			break;
+    			
+			case PDF_TYPE_STREAM:
+			    if ($this->encrypted) {
+			        $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]);
+                }
+                break;
+                
+            case PDF_TYPE_HEX:
+            	if ($this->encrypted) {
+                	$value[1] = $this->hex2str($value[1]);
+                	$value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
+                    
+                	// remake hexstring of encrypted string
+    				$value[1] = $this->str2hex($value[1]);
+                }
+                break;
+    	}
+    }
+    
+    /**
+     * Unescapes a PDF string
+     *
+     * @param string $s
+     * @return string
+     */
+    function _unescape($s) {
+        $out = '';
+        for ($count = 0, $n = strlen($s); $count < $n; $count++) {
+            if ($s[$count] != '\\' || $count == $n-1) {
+                $out .= $s[$count];
+            } else {
+                switch ($s[++$count]) {
+                    case ')':
+                    case '(':
+                    case '\\':
+                        $out .= $s[$count];
+                        break;
+                    case 'f':
+                        $out .= chr(0x0C);
+                        break;
+                    case 'b':
+                        $out .= chr(0x08);
+                        break;
+                    case 't':
+                        $out .= chr(0x09);
+                        break;
+                    case 'r':
+                        $out .= chr(0x0D);
+                        break;
+                    case 'n':
+                        $out .= chr(0x0A);
+                        break;
+                    case "\r":
+                        if ($count != $n-1 && $s[$count+1] == "\n")
+                            $count++;
+                        break;
+                    case "\n":
+                        break;
+                    default:
+                        // Octal-Values
+                        if (ord($s[$count]) >= ord('0') &&
+                            ord($s[$count]) <= ord('9')) {
+                            $oct = ''. $s[$count];
+                                
+                            if (ord($s[$count+1]) >= ord('0') &&
+                                ord($s[$count+1]) <= ord('9')) {
+                                $oct .= $s[++$count];
+                                
+                                if (ord($s[$count+1]) >= ord('0') &&
+                                    ord($s[$count+1]) <= ord('9')) {
+                                    $oct .= $s[++$count];    
+                                }                            
+                            }
+                            
+                            $out .= chr(octdec($oct));
+                        } else {
+                            $out .= $s[$count];
+                        }
+                }
+            }
+        }
+        return $out;
+    }
+    
+    /**
+     * Hexadecimal to string
+     *
+     * @param string $hex
+     * @return string
+     */
+    function hex2str($hex) {
+    	return pack('H*', str_replace(array("\r", "\n", ' '), '', $hex));
+    }
+    
+    /**
+     * String to hexadecimal
+     *
+     * @param string $str
+     * @return string
+     */
+    function str2hex($str) {
+        return current(unpack('H*', $str));
+    }
+}
Index: /lib/fpdf/fpdi_pdf_parser.php
===================================================================
--- /lib/fpdf/fpdi_pdf_parser.php	(revision 5261)
+++ /lib/fpdf/fpdi_pdf_parser.php	(revision 5261)
@@ -0,0 +1,406 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('pdf_parser.php');
+
+class fpdi_pdf_parser extends pdf_parser {
+
+    /**
+     * Pages
+     * Index beginns at 0
+     *
+     * @var array
+     */
+    var $pages;
+    
+    /**
+     * Page count
+     * @var integer
+     */
+    var $page_count;
+    
+    /**
+     * actual page number
+     * @var integer
+     */
+    var $pageno;
+    
+    /**
+     * PDF Version of imported Document
+     * @var string
+     */
+    var $pdfVersion;
+    
+    /**
+     * FPDI Reference
+     * @var object
+     */
+    var $fpdi;
+    
+    /**
+     * Available BoxTypes
+     *
+     * @var array
+     */
+    var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox');
+        
+    /**
+     * Constructor
+     *
+     * @param string $filename  Source-Filename
+     * @param object $fpdi      Object of type fpdi
+     */
+    function fpdi_pdf_parser($filename, &$fpdi) {
+        $this->fpdi =& $fpdi;
+		
+        parent::pdf_parser($filename);
+
+        // resolve Pages-Dictonary
+        $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
+
+        // Read pages
+        $this->read_pages($this->c, $pages, $this->pages);
+        
+        // count pages;
+        $this->page_count = count($this->pages);
+    }
+    
+    /**
+     * Overwrite parent::error()
+     *
+     * @param string $msg  Error-Message
+     */
+    function error($msg) {
+    	$this->fpdi->error($msg);	
+    }
+    
+    /**
+     * Get pagecount from sourcefile
+     *
+     * @return int
+     */
+    function getPageCount() {
+        return $this->page_count;
+    }
+
+
+    /**
+     * Set pageno
+     *
+     * @param int $pageno Pagenumber to use
+     */
+    function setPageno($pageno) {
+        $pageno = ((int) $pageno) - 1;
+
+        if ($pageno < 0 || $pageno >= $this->getPageCount()) {
+            $this->fpdi->error('Pagenumber is wrong!');
+        }
+
+        $this->pageno = $pageno;
+    }
+    
+    /**
+     * Get page-resources from current page
+     *
+     * @return array
+     */
+    function getPageResources() {
+        return $this->_getPageResources($this->pages[$this->pageno]);
+    }
+    
+    /**
+     * Get page-resources from /Page
+     *
+     * @param array $obj Array of pdf-data
+     */
+    function _getPageResources ($obj) { // $obj = /Page
+    	$obj = $this->pdf_resolve_object($this->c, $obj);
+
+        // If the current object has a resources
+    	// dictionary associated with it, we use
+    	// it. Otherwise, we move back to its
+    	// parent object.
+        if (isset ($obj[1][1]['/Resources'])) {
+    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
+    		if ($res[0] == PDF_TYPE_OBJECT)
+                return $res[1];
+            return $res;
+    	} else {
+    		if (!isset ($obj[1][1]['/Parent'])) {
+    			return false;
+    		} else {
+                $res = $this->_getPageResources($obj[1][1]['/Parent']);
+                if ($res[0] == PDF_TYPE_OBJECT)
+                    return $res[1];
+                return $res;
+    		}
+    	}
+    }
+
+
+    /**
+     * Get content of current page
+     *
+     * If more /Contents is an array, the streams are concated
+     *
+     * @return string
+     */
+    function getContent() {
+        $buffer = '';
+        
+        if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
+            $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
+            foreach($contents AS $tmp_content) {
+                $buffer .= $this->_rebuildContentStream($tmp_content) . ' ';
+            }
+        }
+        
+        return $buffer;
+    }
+    
+    
+    /**
+     * Resolve all content-objects
+     *
+     * @param array $content_ref
+     * @return array
+     */
+    function _getPageContent($content_ref) {
+        $contents = array();
+        
+        if ($content_ref[0] == PDF_TYPE_OBJREF) {
+            $content = $this->pdf_resolve_object($this->c, $content_ref);
+            if ($content[1][0] == PDF_TYPE_ARRAY) {
+                $contents = $this->_getPageContent($content[1]);
+            } else {
+                $contents[] = $content;
+            }
+        } else if ($content_ref[0] == PDF_TYPE_ARRAY) {
+            foreach ($content_ref[1] AS $tmp_content_ref) {
+                $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
+            }
+        }
+
+        return $contents;
+    }
+
+
+    /**
+     * Rebuild content-streams
+     *
+     * @param array $obj
+     * @return string
+     */
+    function _rebuildContentStream($obj) {
+        $filters = array();
+        
+        if (isset($obj[1][1]['/Filter'])) {
+            $_filter = $obj[1][1]['/Filter'];
+
+            if ($_filter[0] == PDF_TYPE_OBJREF) {
+                $tmpFilter = $this->pdf_resolve_object($this->c, $_filter);
+                $_filter = $tmpFilter[1];
+            }
+            
+            if ($_filter[0] == PDF_TYPE_TOKEN) {
+                $filters[] = $_filter;
+            } else if ($_filter[0] == PDF_TYPE_ARRAY) {
+                $filters = $_filter[1];
+            }
+        }
+
+        $stream = $obj[2][1];
+
+        foreach ($filters AS $_filter) {
+            switch ($_filter[1]) {
+                case '/FlateDecode':
+                	// $stream .= "\x0F\x0D"; // in an errorious stream this suffix could work
+                	if (function_exists('gzuncompress')) {
+                        $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';
+                    } else {
+                        $this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
+                    }
+                    
+                    if ($stream === false) {
+                    	$this->error('Error while decompressing stream.');
+                    }
+                break;
+                case '/LZWDecode':
+                    include_once('filters/FilterLZW_FPDI.php');
+                    $decoder = new FilterLZW_FPDI($this->fpdi);
+                    $stream = $decoder->decode($stream);
+                    break;
+                case '/ASCII85Decode':
+                    include_once('filters/FilterASCII85_FPDI.php');
+                    $decoder = new FilterASCII85_FPDI($this->fpdi);
+                    $stream = $decoder->decode($stream);
+                    break;
+                case null:
+                    $stream = $stream;
+                break;
+                default:
+                    $this->error(sprintf('Unsupported Filter: %s',$_filter[1]));
+            }
+        }
+        
+        return $stream;
+    }
+    
+    
+    /**
+     * Get a Box from a page
+     * Arrayformat is same as used by fpdf_tpl
+     *
+     * @param array $page a /Page
+     * @param string $box_index Type of Box @see $availableBoxes
+     * @param float Scale factor from user space units to points
+     * @return array
+     */
+    function getPageBox($page, $box_index, $k) {
+        $page = $this->pdf_resolve_object($this->c, $page);
+        $box = null;
+        if (isset($page[1][1][$box_index]))
+            $box =& $page[1][1][$box_index];
+        
+        if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
+            $tmp_box = $this->pdf_resolve_object($this->c, $box);
+            $box = $tmp_box[1];
+        }
+            
+        if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
+            $b =& $box[1];
+            return array('x' => $b[0][1]/$k,
+                         'y' => $b[1][1]/$k,
+                         'w' => abs($b[0][1]-$b[2][1])/$k,
+                         'h' => abs($b[1][1]-$b[3][1])/$k,
+                         'llx' => min($b[0][1], $b[2][1])/$k,
+                         'lly' => min($b[1][1], $b[3][1])/$k,
+                         'urx' => max($b[0][1], $b[2][1])/$k,
+                         'ury' => max($b[1][1], $b[3][1])/$k,
+                         );
+        } else if (!isset ($page[1][1]['/Parent'])) {
+            return false;
+        } else {
+            return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index, $k);
+        }
+    }
+
+    /**
+     * Get all page boxes by page no
+     * 
+     * @param int The page number
+     * @param float Scale factor from user space units to points
+     * @return array
+     */
+     function getPageBoxes($pageno, $k) {
+        return $this->_getPageBoxes($this->pages[$pageno-1], $k);
+    }
+    
+    /**
+     * Get all boxes from /Page
+     *
+     * @param array a /Page
+     * @return array
+     */
+    function _getPageBoxes($page, $k) {
+        $boxes = array();
+
+        foreach($this->availableBoxes AS $box) {
+            if ($_box = $this->getPageBox($page, $box, $k)) {
+                $boxes[$box] = $_box;
+            }
+        }
+
+        return $boxes;
+    }
+
+    /**
+     * Get the page rotation by pageno
+     *
+     * @param integer $pageno
+     * @return array
+     */
+    function getPageRotation($pageno) {
+        return $this->_getPageRotation($this->pages[$pageno-1]);
+    }
+    
+    function _getPageRotation($obj) { // $obj = /Page
+    	$obj = $this->pdf_resolve_object($this->c, $obj);
+    	if (isset ($obj[1][1]['/Rotate'])) {
+    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
+    		if ($res[0] == PDF_TYPE_OBJECT)
+                return $res[1];
+            return $res;
+    	} else {
+    		if (!isset ($obj[1][1]['/Parent'])) {
+    			return false;
+    		} else {
+                $res = $this->_getPageRotation($obj[1][1]['/Parent']);
+                if ($res[0] == PDF_TYPE_OBJECT)
+                    return $res[1];
+                return $res;
+    		}
+    	}
+    }
+    
+    /**
+     * Read all /Page(es)
+     *
+     * @param object pdf_context
+     * @param array /Pages
+     * @param array the result-array
+     */
+    function read_pages(&$c, &$pages, &$result) {
+        // Get the kids dictionary
+    	$_kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
+        
+        if (!is_array($_kids))
+            $this->error('Cannot find /Kids in current /Page-Dictionary');
+            
+        if ($_kids[1][0] == PDF_TYPE_ARRAY) {
+            $kids = $_kids[1][1];
+        } else {
+            $kids = $_kids[1];
+        }
+        
+        foreach ($kids as $v) {
+    		$pg = $this->pdf_resolve_object ($c, $v);
+            if ($pg[1][1]['/Type'][1] === '/Pages') {
+                // If one of the kids is an embedded
+    			// /Pages array, resolve it as well.
+                $this->read_pages($c, $pg, $result);
+    		} else {
+    			$result[] = $pg;
+    		}
+    	}
+    }
+
+    
+    
+    /**
+     * Get PDF-Version
+     *
+     * And reset the PDF Version used in FPDI if needed
+     */
+    function getPDFVersion() {
+        parent::getPDFVersion();
+        $this->fpdi->setPDFVersion(max($this->fpdi->getPDFVersion(), $this->pdfVersion));
+    }
+    
+}
Index: /lib/fpdf/install.txt
===================================================================
--- /lib/fpdf/install.txt	(revision 5261)
+++ /lib/fpdf/install.txt	(revision 5261)
@@ -0,0 +1,15 @@
+The FPDF library is made up of the following elements:
+
+- the main file, fpdf.php, which contains the class
+- the font definition files located in the font directory
+
+The font definition files are necessary as soon as you want to output some text in a document.
+If they are not accessible, the SetFont() method will produce the following error:
+
+FPDF error: Could not include font definition file
+
+
+Remarks:
+
+- Only the files corresponding to the fonts actually used are necessary
+- The tutorials provided in this package are ready to be executed
Index: /lib/fpdf/license.txt
===================================================================
--- /lib/fpdf/license.txt	(revision 5261)
+++ /lib/fpdf/license.txt	(revision 5261)
@@ -0,0 +1,6 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software to use, copy, modify, distribute, sublicense, and/or sell
+copies of the software, and to permit persons to whom the software is furnished
+to do so.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.
Index: /lib/fpdf/makefont/cp1250.map
===================================================================
--- /lib/fpdf/makefont/cp1250.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1250.map	(revision 5261)
@@ -0,0 +1,251 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+015A Sacute
+!8D U+0164 Tcaron
+!8E U+017D Zcaron
+!8F U+0179 Zacute
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+015B sacute
+!9D U+0165 tcaron
+!9E U+017E zcaron
+!9F U+017A zacute
+!A0 U+00A0 space
+!A1 U+02C7 caron
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+0104 Aogonek
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+015E Scedilla
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+0105 aogonek
+!BA U+015F scedilla
+!BB U+00BB guillemotright
+!BC U+013D Lcaron
+!BD U+02DD hungarumlaut
+!BE U+013E lcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcommaaccent
+!FF U+02D9 dotaccent
Index: /lib/fpdf/makefont/cp1251.map
===================================================================
--- /lib/fpdf/makefont/cp1251.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1251.map	(revision 5261)
@@ -0,0 +1,255 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0402 afii10051
+!81 U+0403 afii10052
+!82 U+201A quotesinglbase
+!83 U+0453 afii10100
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+20AC Euro
+!89 U+2030 perthousand
+!8A U+0409 afii10058
+!8B U+2039 guilsinglleft
+!8C U+040A afii10059
+!8D U+040C afii10061
+!8E U+040B afii10060
+!8F U+040F afii10145
+!90 U+0452 afii10099
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0459 afii10106
+!9B U+203A guilsinglright
+!9C U+045A afii10107
+!9D U+045C afii10109
+!9E U+045B afii10108
+!9F U+045F afii10193
+!A0 U+00A0 space
+!A1 U+040E afii10062
+!A2 U+045E afii10110
+!A3 U+0408 afii10057
+!A4 U+00A4 currency
+!A5 U+0490 afii10050
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+0401 afii10023
+!A9 U+00A9 copyright
+!AA U+0404 afii10053
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+0407 afii10056
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+0406 afii10055
+!B3 U+0456 afii10103
+!B4 U+0491 afii10098
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+0451 afii10071
+!B9 U+2116 afii61352
+!BA U+0454 afii10101
+!BB U+00BB guillemotright
+!BC U+0458 afii10105
+!BD U+0405 afii10054
+!BE U+0455 afii10102
+!BF U+0457 afii10104
+!C0 U+0410 afii10017
+!C1 U+0411 afii10018
+!C2 U+0412 afii10019
+!C3 U+0413 afii10020
+!C4 U+0414 afii10021
+!C5 U+0415 afii10022
+!C6 U+0416 afii10024
+!C7 U+0417 afii10025
+!C8 U+0418 afii10026
+!C9 U+0419 afii10027
+!CA U+041A afii10028
+!CB U+041B afii10029
+!CC U+041C afii10030
+!CD U+041D afii10031
+!CE U+041E afii10032
+!CF U+041F afii10033
+!D0 U+0420 afii10034
+!D1 U+0421 afii10035
+!D2 U+0422 afii10036
+!D3 U+0423 afii10037
+!D4 U+0424 afii10038
+!D5 U+0425 afii10039
+!D6 U+0426 afii10040
+!D7 U+0427 afii10041
+!D8 U+0428 afii10042
+!D9 U+0429 afii10043
+!DA U+042A afii10044
+!DB U+042B afii10045
+!DC U+042C afii10046
+!DD U+042D afii10047
+!DE U+042E afii10048
+!DF U+042F afii10049
+!E0 U+0430 afii10065
+!E1 U+0431 afii10066
+!E2 U+0432 afii10067
+!E3 U+0433 afii10068
+!E4 U+0434 afii10069
+!E5 U+0435 afii10070
+!E6 U+0436 afii10072
+!E7 U+0437 afii10073
+!E8 U+0438 afii10074
+!E9 U+0439 afii10075
+!EA U+043A afii10076
+!EB U+043B afii10077
+!EC U+043C afii10078
+!ED U+043D afii10079
+!EE U+043E afii10080
+!EF U+043F afii10081
+!F0 U+0440 afii10082
+!F1 U+0441 afii10083
+!F2 U+0442 afii10084
+!F3 U+0443 afii10085
+!F4 U+0444 afii10086
+!F5 U+0445 afii10087
+!F6 U+0446 afii10088
+!F7 U+0447 afii10089
+!F8 U+0448 afii10090
+!F9 U+0449 afii10091
+!FA U+044A afii10092
+!FB U+044B afii10093
+!FC U+044C afii10094
+!FD U+044D afii10095
+!FE U+044E afii10096
+!FF U+044F afii10097
Index: /lib/fpdf/makefont/cp1252.map
===================================================================
--- /lib/fpdf/makefont/cp1252.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1252.map	(revision 5261)
@@ -0,0 +1,251 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!8E U+017D Zcaron
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9E U+017E zcaron
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/cp1253.map
===================================================================
--- /lib/fpdf/makefont/cp1253.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1253.map	(revision 5261)
@@ -0,0 +1,239 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!A0 U+00A0 space
+!A1 U+0385 dieresistonos
+!A2 U+0386 Alphatonos
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+2015 afii00208
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+0384 tonos
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+0388 Epsilontonos
+!B9 U+0389 Etatonos
+!BA U+038A Iotatonos
+!BB U+00BB guillemotright
+!BC U+038C Omicrontonos
+!BD U+00BD onehalf
+!BE U+038E Upsilontonos
+!BF U+038F Omegatonos
+!C0 U+0390 iotadieresistonos
+!C1 U+0391 Alpha
+!C2 U+0392 Beta
+!C3 U+0393 Gamma
+!C4 U+0394 Delta
+!C5 U+0395 Epsilon
+!C6 U+0396 Zeta
+!C7 U+0397 Eta
+!C8 U+0398 Theta
+!C9 U+0399 Iota
+!CA U+039A Kappa
+!CB U+039B Lambda
+!CC U+039C Mu
+!CD U+039D Nu
+!CE U+039E Xi
+!CF U+039F Omicron
+!D0 U+03A0 Pi
+!D1 U+03A1 Rho
+!D3 U+03A3 Sigma
+!D4 U+03A4 Tau
+!D5 U+03A5 Upsilon
+!D6 U+03A6 Phi
+!D7 U+03A7 Chi
+!D8 U+03A8 Psi
+!D9 U+03A9 Omega
+!DA U+03AA Iotadieresis
+!DB U+03AB Upsilondieresis
+!DC U+03AC alphatonos
+!DD U+03AD epsilontonos
+!DE U+03AE etatonos
+!DF U+03AF iotatonos
+!E0 U+03B0 upsilondieresistonos
+!E1 U+03B1 alpha
+!E2 U+03B2 beta
+!E3 U+03B3 gamma
+!E4 U+03B4 delta
+!E5 U+03B5 epsilon
+!E6 U+03B6 zeta
+!E7 U+03B7 eta
+!E8 U+03B8 theta
+!E9 U+03B9 iota
+!EA U+03BA kappa
+!EB U+03BB lambda
+!EC U+03BC mu
+!ED U+03BD nu
+!EE U+03BE xi
+!EF U+03BF omicron
+!F0 U+03C0 pi
+!F1 U+03C1 rho
+!F2 U+03C2 sigma1
+!F3 U+03C3 sigma
+!F4 U+03C4 tau
+!F5 U+03C5 upsilon
+!F6 U+03C6 phi
+!F7 U+03C7 chi
+!F8 U+03C8 psi
+!F9 U+03C9 omega
+!FA U+03CA iotadieresis
+!FB U+03CB upsilondieresis
+!FC U+03CC omicrontonos
+!FD U+03CD upsilontonos
+!FE U+03CE omegatonos
Index: /lib/fpdf/makefont/cp1254.map
===================================================================
--- /lib/fpdf/makefont/cp1254.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1254.map	(revision 5261)
@@ -0,0 +1,249 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+011E Gbreve
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0130 Idotaccent
+!DE U+015E Scedilla
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+011F gbreve
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0131 dotlessi
+!FE U+015F scedilla
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/cp1255.map
===================================================================
--- /lib/fpdf/makefont/cp1255.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1255.map	(revision 5261)
@@ -0,0 +1,233 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+20AA afii57636
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00D7 multiply
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD sfthyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 middot
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00F7 divide
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+05B0 afii57799
+!C1 U+05B1 afii57801
+!C2 U+05B2 afii57800
+!C3 U+05B3 afii57802
+!C4 U+05B4 afii57793
+!C5 U+05B5 afii57794
+!C6 U+05B6 afii57795
+!C7 U+05B7 afii57798
+!C8 U+05B8 afii57797
+!C9 U+05B9 afii57806
+!CB U+05BB afii57796
+!CC U+05BC afii57807
+!CD U+05BD afii57839
+!CE U+05BE afii57645
+!CF U+05BF afii57841
+!D0 U+05C0 afii57842
+!D1 U+05C1 afii57804
+!D2 U+05C2 afii57803
+!D3 U+05C3 afii57658
+!D4 U+05F0 afii57716
+!D5 U+05F1 afii57717
+!D6 U+05F2 afii57718
+!D7 U+05F3 gereshhebrew
+!D8 U+05F4 gershayimhebrew
+!E0 U+05D0 afii57664
+!E1 U+05D1 afii57665
+!E2 U+05D2 afii57666
+!E3 U+05D3 afii57667
+!E4 U+05D4 afii57668
+!E5 U+05D5 afii57669
+!E6 U+05D6 afii57670
+!E7 U+05D7 afii57671
+!E8 U+05D8 afii57672
+!E9 U+05D9 afii57673
+!EA U+05DA afii57674
+!EB U+05DB afii57675
+!EC U+05DC afii57676
+!ED U+05DD afii57677
+!EE U+05DE afii57678
+!EF U+05DF afii57679
+!F0 U+05E0 afii57680
+!F1 U+05E1 afii57681
+!F2 U+05E2 afii57682
+!F3 U+05E3 afii57683
+!F4 U+05E4 afii57684
+!F5 U+05E5 afii57685
+!F6 U+05E6 afii57686
+!F7 U+05E7 afii57687
+!F8 U+05E8 afii57688
+!F9 U+05E9 afii57689
+!FA U+05EA afii57690
+!FD U+200E afii299
+!FE U+200F afii300
Index: /lib/fpdf/makefont/cp1257.map
===================================================================
--- /lib/fpdf/makefont/cp1257.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1257.map	(revision 5261)
@@ -0,0 +1,244 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!8D U+00A8 dieresis
+!8E U+02C7 caron
+!8F U+00B8 cedilla
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!9D U+00AF macron
+!9E U+02DB ogonek
+!A0 U+00A0 space
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00D8 Oslash
+!A9 U+00A9 copyright
+!AA U+0156 Rcommaaccent
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00C6 AE
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00F8 oslash
+!B9 U+00B9 onesuperior
+!BA U+0157 rcommaaccent
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00E6 ae
+!C0 U+0104 Aogonek
+!C1 U+012E Iogonek
+!C2 U+0100 Amacron
+!C3 U+0106 Cacute
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+0118 Eogonek
+!C7 U+0112 Emacron
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0179 Zacute
+!CB U+0116 Edotaccent
+!CC U+0122 Gcommaaccent
+!CD U+0136 Kcommaaccent
+!CE U+012A Imacron
+!CF U+013B Lcommaaccent
+!D0 U+0160 Scaron
+!D1 U+0143 Nacute
+!D2 U+0145 Ncommaaccent
+!D3 U+00D3 Oacute
+!D4 U+014C Omacron
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0172 Uogonek
+!D9 U+0141 Lslash
+!DA U+015A Sacute
+!DB U+016A Umacron
+!DC U+00DC Udieresis
+!DD U+017B Zdotaccent
+!DE U+017D Zcaron
+!DF U+00DF germandbls
+!E0 U+0105 aogonek
+!E1 U+012F iogonek
+!E2 U+0101 amacron
+!E3 U+0107 cacute
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+0119 eogonek
+!E7 U+0113 emacron
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+017A zacute
+!EB U+0117 edotaccent
+!EC U+0123 gcommaaccent
+!ED U+0137 kcommaaccent
+!EE U+012B imacron
+!EF U+013C lcommaaccent
+!F0 U+0161 scaron
+!F1 U+0144 nacute
+!F2 U+0146 ncommaaccent
+!F3 U+00F3 oacute
+!F4 U+014D omacron
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0173 uogonek
+!F9 U+0142 lslash
+!FA U+015B sacute
+!FB U+016B umacron
+!FC U+00FC udieresis
+!FD U+017C zdotaccent
+!FE U+017E zcaron
+!FF U+02D9 dotaccent
Index: /lib/fpdf/makefont/cp1258.map
===================================================================
--- /lib/fpdf/makefont/cp1258.map	(revision 5261)
+++ /lib/fpdf/makefont/cp1258.map	(revision 5261)
@@ -0,0 +1,247 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+0300 gravecomb
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+0110 Dcroat
+!D1 U+00D1 Ntilde
+!D2 U+0309 hookabovecomb
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+01A0 Ohorn
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+01AF Uhorn
+!DE U+0303 tildecomb
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+0301 acutecomb
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+0111 dcroat
+!F1 U+00F1 ntilde
+!F2 U+0323 dotbelowcomb
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+01A1 ohorn
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+01B0 uhorn
+!FE U+20AB dong
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/cp874.map
===================================================================
--- /lib/fpdf/makefont/cp874.map	(revision 5261)
+++ /lib/fpdf/makefont/cp874.map	(revision 5261)
@@ -0,0 +1,225 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!85 U+2026 ellipsis
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!A0 U+00A0 space
+!A1 U+0E01 kokaithai
+!A2 U+0E02 khokhaithai
+!A3 U+0E03 khokhuatthai
+!A4 U+0E04 khokhwaithai
+!A5 U+0E05 khokhonthai
+!A6 U+0E06 khorakhangthai
+!A7 U+0E07 ngonguthai
+!A8 U+0E08 chochanthai
+!A9 U+0E09 chochingthai
+!AA U+0E0A chochangthai
+!AB U+0E0B sosothai
+!AC U+0E0C chochoethai
+!AD U+0E0D yoyingthai
+!AE U+0E0E dochadathai
+!AF U+0E0F topatakthai
+!B0 U+0E10 thothanthai
+!B1 U+0E11 thonangmonthothai
+!B2 U+0E12 thophuthaothai
+!B3 U+0E13 nonenthai
+!B4 U+0E14 dodekthai
+!B5 U+0E15 totaothai
+!B6 U+0E16 thothungthai
+!B7 U+0E17 thothahanthai
+!B8 U+0E18 thothongthai
+!B9 U+0E19 nonuthai
+!BA U+0E1A bobaimaithai
+!BB U+0E1B poplathai
+!BC U+0E1C phophungthai
+!BD U+0E1D fofathai
+!BE U+0E1E phophanthai
+!BF U+0E1F fofanthai
+!C0 U+0E20 phosamphaothai
+!C1 U+0E21 momathai
+!C2 U+0E22 yoyakthai
+!C3 U+0E23 roruathai
+!C4 U+0E24 ruthai
+!C5 U+0E25 lolingthai
+!C6 U+0E26 luthai
+!C7 U+0E27 wowaenthai
+!C8 U+0E28 sosalathai
+!C9 U+0E29 sorusithai
+!CA U+0E2A sosuathai
+!CB U+0E2B hohipthai
+!CC U+0E2C lochulathai
+!CD U+0E2D oangthai
+!CE U+0E2E honokhukthai
+!CF U+0E2F paiyannoithai
+!D0 U+0E30 saraathai
+!D1 U+0E31 maihanakatthai
+!D2 U+0E32 saraaathai
+!D3 U+0E33 saraamthai
+!D4 U+0E34 saraithai
+!D5 U+0E35 saraiithai
+!D6 U+0E36 sarauethai
+!D7 U+0E37 saraueethai
+!D8 U+0E38 sarauthai
+!D9 U+0E39 sarauuthai
+!DA U+0E3A phinthuthai
+!DF U+0E3F bahtthai
+!E0 U+0E40 saraethai
+!E1 U+0E41 saraaethai
+!E2 U+0E42 saraothai
+!E3 U+0E43 saraaimaimuanthai
+!E4 U+0E44 saraaimaimalaithai
+!E5 U+0E45 lakkhangyaothai
+!E6 U+0E46 maiyamokthai
+!E7 U+0E47 maitaikhuthai
+!E8 U+0E48 maiekthai
+!E9 U+0E49 maithothai
+!EA U+0E4A maitrithai
+!EB U+0E4B maichattawathai
+!EC U+0E4C thanthakhatthai
+!ED U+0E4D nikhahitthai
+!EE U+0E4E yamakkanthai
+!EF U+0E4F fongmanthai
+!F0 U+0E50 zerothai
+!F1 U+0E51 onethai
+!F2 U+0E52 twothai
+!F3 U+0E53 threethai
+!F4 U+0E54 fourthai
+!F5 U+0E55 fivethai
+!F6 U+0E56 sixthai
+!F7 U+0E57 seventhai
+!F8 U+0E58 eightthai
+!F9 U+0E59 ninethai
+!FA U+0E5A angkhankhuthai
+!FB U+0E5B khomutthai
Index: /lib/fpdf/makefont/iso-8859-1.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-1.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-1.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/iso-8859-11.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-11.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-11.map	(revision 5261)
@@ -0,0 +1,248 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0E01 kokaithai
+!A2 U+0E02 khokhaithai
+!A3 U+0E03 khokhuatthai
+!A4 U+0E04 khokhwaithai
+!A5 U+0E05 khokhonthai
+!A6 U+0E06 khorakhangthai
+!A7 U+0E07 ngonguthai
+!A8 U+0E08 chochanthai
+!A9 U+0E09 chochingthai
+!AA U+0E0A chochangthai
+!AB U+0E0B sosothai
+!AC U+0E0C chochoethai
+!AD U+0E0D yoyingthai
+!AE U+0E0E dochadathai
+!AF U+0E0F topatakthai
+!B0 U+0E10 thothanthai
+!B1 U+0E11 thonangmonthothai
+!B2 U+0E12 thophuthaothai
+!B3 U+0E13 nonenthai
+!B4 U+0E14 dodekthai
+!B5 U+0E15 totaothai
+!B6 U+0E16 thothungthai
+!B7 U+0E17 thothahanthai
+!B8 U+0E18 thothongthai
+!B9 U+0E19 nonuthai
+!BA U+0E1A bobaimaithai
+!BB U+0E1B poplathai
+!BC U+0E1C phophungthai
+!BD U+0E1D fofathai
+!BE U+0E1E phophanthai
+!BF U+0E1F fofanthai
+!C0 U+0E20 phosamphaothai
+!C1 U+0E21 momathai
+!C2 U+0E22 yoyakthai
+!C3 U+0E23 roruathai
+!C4 U+0E24 ruthai
+!C5 U+0E25 lolingthai
+!C6 U+0E26 luthai
+!C7 U+0E27 wowaenthai
+!C8 U+0E28 sosalathai
+!C9 U+0E29 sorusithai
+!CA U+0E2A sosuathai
+!CB U+0E2B hohipthai
+!CC U+0E2C lochulathai
+!CD U+0E2D oangthai
+!CE U+0E2E honokhukthai
+!CF U+0E2F paiyannoithai
+!D0 U+0E30 saraathai
+!D1 U+0E31 maihanakatthai
+!D2 U+0E32 saraaathai
+!D3 U+0E33 saraamthai
+!D4 U+0E34 saraithai
+!D5 U+0E35 saraiithai
+!D6 U+0E36 sarauethai
+!D7 U+0E37 saraueethai
+!D8 U+0E38 sarauthai
+!D9 U+0E39 sarauuthai
+!DA U+0E3A phinthuthai
+!DF U+0E3F bahtthai
+!E0 U+0E40 saraethai
+!E1 U+0E41 saraaethai
+!E2 U+0E42 saraothai
+!E3 U+0E43 saraaimaimuanthai
+!E4 U+0E44 saraaimaimalaithai
+!E5 U+0E45 lakkhangyaothai
+!E6 U+0E46 maiyamokthai
+!E7 U+0E47 maitaikhuthai
+!E8 U+0E48 maiekthai
+!E9 U+0E49 maithothai
+!EA U+0E4A maitrithai
+!EB U+0E4B maichattawathai
+!EC U+0E4C thanthakhatthai
+!ED U+0E4D nikhahitthai
+!EE U+0E4E yamakkanthai
+!EF U+0E4F fongmanthai
+!F0 U+0E50 zerothai
+!F1 U+0E51 onethai
+!F2 U+0E52 twothai
+!F3 U+0E53 threethai
+!F4 U+0E54 fourthai
+!F5 U+0E55 fivethai
+!F6 U+0E56 sixthai
+!F7 U+0E57 seventhai
+!F8 U+0E58 eightthai
+!F9 U+0E59 ninethai
+!FA U+0E5A angkhankhuthai
+!FB U+0E5B khomutthai
Index: /lib/fpdf/makefont/iso-8859-15.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-15.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-15.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+20AC Euro
+!A5 U+00A5 yen
+!A6 U+0160 Scaron
+!A7 U+00A7 section
+!A8 U+0161 scaron
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+017D Zcaron
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+017E zcaron
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+0152 OE
+!BD U+0153 oe
+!BE U+0178 Ydieresis
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/iso-8859-16.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-16.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-16.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+0105 aogonek
+!A3 U+0141 Lslash
+!A4 U+20AC Euro
+!A5 U+201E quotedblbase
+!A6 U+0160 Scaron
+!A7 U+00A7 section
+!A8 U+0161 scaron
+!A9 U+00A9 copyright
+!AA U+0218 Scommaaccent
+!AB U+00AB guillemotleft
+!AC U+0179 Zacute
+!AD U+00AD hyphen
+!AE U+017A zacute
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+010C Ccaron
+!B3 U+0142 lslash
+!B4 U+017D Zcaron
+!B5 U+201D quotedblright
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+017E zcaron
+!B9 U+010D ccaron
+!BA U+0219 scommaaccent
+!BB U+00BB guillemotright
+!BC U+0152 OE
+!BD U+0153 oe
+!BE U+0178 Ydieresis
+!BF U+017C zdotaccent
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0106 Cacute
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+015A Sacute
+!D8 U+0170 Uhungarumlaut
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0118 Eogonek
+!DE U+021A Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+0107 cacute
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+015B sacute
+!F8 U+0171 uhungarumlaut
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0119 eogonek
+!FE U+021B tcommaaccent
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/iso-8859-2.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-2.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-2.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+013D Lcaron
+!A6 U+015A Sacute
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+0160 Scaron
+!AA U+015E Scedilla
+!AB U+0164 Tcaron
+!AC U+0179 Zacute
+!AD U+00AD hyphen
+!AE U+017D Zcaron
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+0105 aogonek
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+013E lcaron
+!B6 U+015B sacute
+!B7 U+02C7 caron
+!B8 U+00B8 cedilla
+!B9 U+0161 scaron
+!BA U+015F scedilla
+!BB U+0165 tcaron
+!BC U+017A zacute
+!BD U+02DD hungarumlaut
+!BE U+017E zcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcommaaccent
+!FF U+02D9 dotaccent
Index: /lib/fpdf/makefont/iso-8859-4.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-4.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-4.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+0138 kgreenlandic
+!A3 U+0156 Rcommaaccent
+!A4 U+00A4 currency
+!A5 U+0128 Itilde
+!A6 U+013B Lcommaaccent
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+0160 Scaron
+!AA U+0112 Emacron
+!AB U+0122 Gcommaaccent
+!AC U+0166 Tbar
+!AD U+00AD hyphen
+!AE U+017D Zcaron
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+0105 aogonek
+!B2 U+02DB ogonek
+!B3 U+0157 rcommaaccent
+!B4 U+00B4 acute
+!B5 U+0129 itilde
+!B6 U+013C lcommaaccent
+!B7 U+02C7 caron
+!B8 U+00B8 cedilla
+!B9 U+0161 scaron
+!BA U+0113 emacron
+!BB U+0123 gcommaaccent
+!BC U+0167 tbar
+!BD U+014A Eng
+!BE U+017E zcaron
+!BF U+014B eng
+!C0 U+0100 Amacron
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+012E Iogonek
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+0116 Edotaccent
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+012A Imacron
+!D0 U+0110 Dcroat
+!D1 U+0145 Ncommaaccent
+!D2 U+014C Omacron
+!D3 U+0136 Kcommaaccent
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+0172 Uogonek
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0168 Utilde
+!DE U+016A Umacron
+!DF U+00DF germandbls
+!E0 U+0101 amacron
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+012F iogonek
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+0117 edotaccent
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+012B imacron
+!F0 U+0111 dcroat
+!F1 U+0146 ncommaaccent
+!F2 U+014D omacron
+!F3 U+0137 kcommaaccent
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+0173 uogonek
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0169 utilde
+!FE U+016B umacron
+!FF U+02D9 dotaccent
Index: /lib/fpdf/makefont/iso-8859-5.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-5.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-5.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0401 afii10023
+!A2 U+0402 afii10051
+!A3 U+0403 afii10052
+!A4 U+0404 afii10053
+!A5 U+0405 afii10054
+!A6 U+0406 afii10055
+!A7 U+0407 afii10056
+!A8 U+0408 afii10057
+!A9 U+0409 afii10058
+!AA U+040A afii10059
+!AB U+040B afii10060
+!AC U+040C afii10061
+!AD U+00AD hyphen
+!AE U+040E afii10062
+!AF U+040F afii10145
+!B0 U+0410 afii10017
+!B1 U+0411 afii10018
+!B2 U+0412 afii10019
+!B3 U+0413 afii10020
+!B4 U+0414 afii10021
+!B5 U+0415 afii10022
+!B6 U+0416 afii10024
+!B7 U+0417 afii10025
+!B8 U+0418 afii10026
+!B9 U+0419 afii10027
+!BA U+041A afii10028
+!BB U+041B afii10029
+!BC U+041C afii10030
+!BD U+041D afii10031
+!BE U+041E afii10032
+!BF U+041F afii10033
+!C0 U+0420 afii10034
+!C1 U+0421 afii10035
+!C2 U+0422 afii10036
+!C3 U+0423 afii10037
+!C4 U+0424 afii10038
+!C5 U+0425 afii10039
+!C6 U+0426 afii10040
+!C7 U+0427 afii10041
+!C8 U+0428 afii10042
+!C9 U+0429 afii10043
+!CA U+042A afii10044
+!CB U+042B afii10045
+!CC U+042C afii10046
+!CD U+042D afii10047
+!CE U+042E afii10048
+!CF U+042F afii10049
+!D0 U+0430 afii10065
+!D1 U+0431 afii10066
+!D2 U+0432 afii10067
+!D3 U+0433 afii10068
+!D4 U+0434 afii10069
+!D5 U+0435 afii10070
+!D6 U+0436 afii10072
+!D7 U+0437 afii10073
+!D8 U+0438 afii10074
+!D9 U+0439 afii10075
+!DA U+043A afii10076
+!DB U+043B afii10077
+!DC U+043C afii10078
+!DD U+043D afii10079
+!DE U+043E afii10080
+!DF U+043F afii10081
+!E0 U+0440 afii10082
+!E1 U+0441 afii10083
+!E2 U+0442 afii10084
+!E3 U+0443 afii10085
+!E4 U+0444 afii10086
+!E5 U+0445 afii10087
+!E6 U+0446 afii10088
+!E7 U+0447 afii10089
+!E8 U+0448 afii10090
+!E9 U+0449 afii10091
+!EA U+044A afii10092
+!EB U+044B afii10093
+!EC U+044C afii10094
+!ED U+044D afii10095
+!EE U+044E afii10096
+!EF U+044F afii10097
+!F0 U+2116 afii61352
+!F1 U+0451 afii10071
+!F2 U+0452 afii10099
+!F3 U+0453 afii10100
+!F4 U+0454 afii10101
+!F5 U+0455 afii10102
+!F6 U+0456 afii10103
+!F7 U+0457 afii10104
+!F8 U+0458 afii10105
+!F9 U+0459 afii10106
+!FA U+045A afii10107
+!FB U+045B afii10108
+!FC U+045C afii10109
+!FD U+00A7 section
+!FE U+045E afii10110
+!FF U+045F afii10193
Index: /lib/fpdf/makefont/iso-8859-7.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-7.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-7.map	(revision 5261)
@@ -0,0 +1,250 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+2018 quoteleft
+!A2 U+2019 quoteright
+!A3 U+00A3 sterling
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AF U+2015 afii00208
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+0384 tonos
+!B5 U+0385 dieresistonos
+!B6 U+0386 Alphatonos
+!B7 U+00B7 periodcentered
+!B8 U+0388 Epsilontonos
+!B9 U+0389 Etatonos
+!BA U+038A Iotatonos
+!BB U+00BB guillemotright
+!BC U+038C Omicrontonos
+!BD U+00BD onehalf
+!BE U+038E Upsilontonos
+!BF U+038F Omegatonos
+!C0 U+0390 iotadieresistonos
+!C1 U+0391 Alpha
+!C2 U+0392 Beta
+!C3 U+0393 Gamma
+!C4 U+0394 Delta
+!C5 U+0395 Epsilon
+!C6 U+0396 Zeta
+!C7 U+0397 Eta
+!C8 U+0398 Theta
+!C9 U+0399 Iota
+!CA U+039A Kappa
+!CB U+039B Lambda
+!CC U+039C Mu
+!CD U+039D Nu
+!CE U+039E Xi
+!CF U+039F Omicron
+!D0 U+03A0 Pi
+!D1 U+03A1 Rho
+!D3 U+03A3 Sigma
+!D4 U+03A4 Tau
+!D5 U+03A5 Upsilon
+!D6 U+03A6 Phi
+!D7 U+03A7 Chi
+!D8 U+03A8 Psi
+!D9 U+03A9 Omega
+!DA U+03AA Iotadieresis
+!DB U+03AB Upsilondieresis
+!DC U+03AC alphatonos
+!DD U+03AD epsilontonos
+!DE U+03AE etatonos
+!DF U+03AF iotatonos
+!E0 U+03B0 upsilondieresistonos
+!E1 U+03B1 alpha
+!E2 U+03B2 beta
+!E3 U+03B3 gamma
+!E4 U+03B4 delta
+!E5 U+03B5 epsilon
+!E6 U+03B6 zeta
+!E7 U+03B7 eta
+!E8 U+03B8 theta
+!E9 U+03B9 iota
+!EA U+03BA kappa
+!EB U+03BB lambda
+!EC U+03BC mu
+!ED U+03BD nu
+!EE U+03BE xi
+!EF U+03BF omicron
+!F0 U+03C0 pi
+!F1 U+03C1 rho
+!F2 U+03C2 sigma1
+!F3 U+03C3 sigma
+!F4 U+03C4 tau
+!F5 U+03C5 upsilon
+!F6 U+03C6 phi
+!F7 U+03C7 chi
+!F8 U+03C8 psi
+!F9 U+03C9 omega
+!FA U+03CA iotadieresis
+!FB U+03CB upsilondieresis
+!FC U+03CC omicrontonos
+!FD U+03CD upsilontonos
+!FE U+03CE omegatonos
Index: /lib/fpdf/makefont/iso-8859-9.map
===================================================================
--- /lib/fpdf/makefont/iso-8859-9.map	(revision 5261)
+++ /lib/fpdf/makefont/iso-8859-9.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+011E Gbreve
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0130 Idotaccent
+!DE U+015E Scedilla
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+011F gbreve
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0131 dotlessi
+!FE U+015F scedilla
+!FF U+00FF ydieresis
Index: /lib/fpdf/makefont/koi8-r.map
===================================================================
--- /lib/fpdf/makefont/koi8-r.map	(revision 5261)
+++ /lib/fpdf/makefont/koi8-r.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+2500 SF100000
+!81 U+2502 SF110000
+!82 U+250C SF010000
+!83 U+2510 SF030000
+!84 U+2514 SF020000
+!85 U+2518 SF040000
+!86 U+251C SF080000
+!87 U+2524 SF090000
+!88 U+252C SF060000
+!89 U+2534 SF070000
+!8A U+253C SF050000
+!8B U+2580 upblock
+!8C U+2584 dnblock
+!8D U+2588 block
+!8E U+258C lfblock
+!8F U+2590 rtblock
+!90 U+2591 ltshade
+!91 U+2592 shade
+!92 U+2593 dkshade
+!93 U+2320 integraltp
+!94 U+25A0 filledbox
+!95 U+2219 periodcentered
+!96 U+221A radical
+!97 U+2248 approxequal
+!98 U+2264 lessequal
+!99 U+2265 greaterequal
+!9A U+00A0 space
+!9B U+2321 integralbt
+!9C U+00B0 degree
+!9D U+00B2 twosuperior
+!9E U+00B7 periodcentered
+!9F U+00F7 divide
+!A0 U+2550 SF430000
+!A1 U+2551 SF240000
+!A2 U+2552 SF510000
+!A3 U+0451 afii10071
+!A4 U+2553 SF520000
+!A5 U+2554 SF390000
+!A6 U+2555 SF220000
+!A7 U+2556 SF210000
+!A8 U+2557 SF250000
+!A9 U+2558 SF500000
+!AA U+2559 SF490000
+!AB U+255A SF380000
+!AC U+255B SF280000
+!AD U+255C SF270000
+!AE U+255D SF260000
+!AF U+255E SF360000
+!B0 U+255F SF370000
+!B1 U+2560 SF420000
+!B2 U+2561 SF190000
+!B3 U+0401 afii10023
+!B4 U+2562 SF200000
+!B5 U+2563 SF230000
+!B6 U+2564 SF470000
+!B7 U+2565 SF480000
+!B8 U+2566 SF410000
+!B9 U+2567 SF450000
+!BA U+2568 SF460000
+!BB U+2569 SF400000
+!BC U+256A SF540000
+!BD U+256B SF530000
+!BE U+256C SF440000
+!BF U+00A9 copyright
+!C0 U+044E afii10096
+!C1 U+0430 afii10065
+!C2 U+0431 afii10066
+!C3 U+0446 afii10088
+!C4 U+0434 afii10069
+!C5 U+0435 afii10070
+!C6 U+0444 afii10086
+!C7 U+0433 afii10068
+!C8 U+0445 afii10087
+!C9 U+0438 afii10074
+!CA U+0439 afii10075
+!CB U+043A afii10076
+!CC U+043B afii10077
+!CD U+043C afii10078
+!CE U+043D afii10079
+!CF U+043E afii10080
+!D0 U+043F afii10081
+!D1 U+044F afii10097
+!D2 U+0440 afii10082
+!D3 U+0441 afii10083
+!D4 U+0442 afii10084
+!D5 U+0443 afii10085
+!D6 U+0436 afii10072
+!D7 U+0432 afii10067
+!D8 U+044C afii10094
+!D9 U+044B afii10093
+!DA U+0437 afii10073
+!DB U+0448 afii10090
+!DC U+044D afii10095
+!DD U+0449 afii10091
+!DE U+0447 afii10089
+!DF U+044A afii10092
+!E0 U+042E afii10048
+!E1 U+0410 afii10017
+!E2 U+0411 afii10018
+!E3 U+0426 afii10040
+!E4 U+0414 afii10021
+!E5 U+0415 afii10022
+!E6 U+0424 afii10038
+!E7 U+0413 afii10020
+!E8 U+0425 afii10039
+!E9 U+0418 afii10026
+!EA U+0419 afii10027
+!EB U+041A afii10028
+!EC U+041B afii10029
+!ED U+041C afii10030
+!EE U+041D afii10031
+!EF U+041E afii10032
+!F0 U+041F afii10033
+!F1 U+042F afii10049
+!F2 U+0420 afii10034
+!F3 U+0421 afii10035
+!F4 U+0422 afii10036
+!F5 U+0423 afii10037
+!F6 U+0416 afii10024
+!F7 U+0412 afii10019
+!F8 U+042C afii10046
+!F9 U+042B afii10045
+!FA U+0417 afii10025
+!FB U+0428 afii10042
+!FC U+042D afii10047
+!FD U+0429 afii10043
+!FE U+0427 afii10041
+!FF U+042A afii10044
Index: /lib/fpdf/makefont/koi8-u.map
===================================================================
--- /lib/fpdf/makefont/koi8-u.map	(revision 5261)
+++ /lib/fpdf/makefont/koi8-u.map	(revision 5261)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+2500 SF100000
+!81 U+2502 SF110000
+!82 U+250C SF010000
+!83 U+2510 SF030000
+!84 U+2514 SF020000
+!85 U+2518 SF040000
+!86 U+251C SF080000
+!87 U+2524 SF090000
+!88 U+252C SF060000
+!89 U+2534 SF070000
+!8A U+253C SF050000
+!8B U+2580 upblock
+!8C U+2584 dnblock
+!8D U+2588 block
+!8E U+258C lfblock
+!8F U+2590 rtblock
+!90 U+2591 ltshade
+!91 U+2592 shade
+!92 U+2593 dkshade
+!93 U+2320 integraltp
+!94 U+25A0 filledbox
+!95 U+2022 bullet
+!96 U+221A radical
+!97 U+2248 approxequal
+!98 U+2264 lessequal
+!99 U+2265 greaterequal
+!9A U+00A0 space
+!9B U+2321 integralbt
+!9C U+00B0 degree
+!9D U+00B2 twosuperior
+!9E U+00B7 periodcentered
+!9F U+00F7 divide
+!A0 U+2550 SF430000
+!A1 U+2551 SF240000
+!A2 U+2552 SF510000
+!A3 U+0451 afii10071
+!A4 U+0454 afii10101
+!A5 U+2554 SF390000
+!A6 U+0456 afii10103
+!A7 U+0457 afii10104
+!A8 U+2557 SF250000
+!A9 U+2558 SF500000
+!AA U+2559 SF490000
+!AB U+255A SF380000
+!AC U+255B SF280000
+!AD U+0491 afii10098
+!AE U+255D SF260000
+!AF U+255E SF360000
+!B0 U+255F SF370000
+!B1 U+2560 SF420000
+!B2 U+2561 SF190000
+!B3 U+0401 afii10023
+!B4 U+0404 afii10053
+!B5 U+2563 SF230000
+!B6 U+0406 afii10055
+!B7 U+0407 afii10056
+!B8 U+2566 SF410000
+!B9 U+2567 SF450000
+!BA U+2568 SF460000
+!BB U+2569 SF400000
+!BC U+256A SF540000
+!BD U+0490 afii10050
+!BE U+256C SF440000
+!BF U+00A9 copyright
+!C0 U+044E afii10096
+!C1 U+0430 afii10065
+!C2 U+0431 afii10066
+!C3 U+0446 afii10088
+!C4 U+0434 afii10069
+!C5 U+0435 afii10070
+!C6 U+0444 afii10086
+!C7 U+0433 afii10068
+!C8 U+0445 afii10087
+!C9 U+0438 afii10074
+!CA U+0439 afii10075
+!CB U+043A afii10076
+!CC U+043B afii10077
+!CD U+043C afii10078
+!CE U+043D afii10079
+!CF U+043E afii10080
+!D0 U+043F afii10081
+!D1 U+044F afii10097
+!D2 U+0440 afii10082
+!D3 U+0441 afii10083
+!D4 U+0442 afii10084
+!D5 U+0443 afii10085
+!D6 U+0436 afii10072
+!D7 U+0432 afii10067
+!D8 U+044C afii10094
+!D9 U+044B afii10093
+!DA U+0437 afii10073
+!DB U+0448 afii10090
+!DC U+044D afii10095
+!DD U+0449 afii10091
+!DE U+0447 afii10089
+!DF U+044A afii10092
+!E0 U+042E afii10048
+!E1 U+0410 afii10017
+!E2 U+0411 afii10018
+!E3 U+0426 afii10040
+!E4 U+0414 afii10021
+!E5 U+0415 afii10022
+!E6 U+0424 afii10038
+!E7 U+0413 afii10020
+!E8 U+0425 afii10039
+!E9 U+0418 afii10026
+!EA U+0419 afii10027
+!EB U+041A afii10028
+!EC U+041B afii10029
+!ED U+041C afii10030
+!EE U+041D afii10031
+!EF U+041E afii10032
+!F0 U+041F afii10033
+!F1 U+042F afii10049
+!F2 U+0420 afii10034
+!F3 U+0421 afii10035
+!F4 U+0422 afii10036
+!F5 U+0423 afii10037
+!F6 U+0416 afii10024
+!F7 U+0412 afii10019
+!F8 U+042C afii10046
+!F9 U+042B afii10045
+!FA U+0417 afii10025
+!FB U+0428 afii10042
+!FC U+042D afii10047
+!FD U+0429 afii10043
+!FE U+0427 afii10041
+!FF U+042A afii10044
Index: /lib/fpdf/makefont/makefont.php
===================================================================
--- /lib/fpdf/makefont/makefont.php	(revision 5261)
+++ /lib/fpdf/makefont/makefont.php	(revision 5261)
@@ -0,0 +1,373 @@
+<?php
+/*******************************************************************************
+* Utility to generate font definition files                                    *
+*                                                                              *
+* Version: 1.2                                                                 *
+* Date:    2011-06-18                                                          *
+* Author:  Olivier PLATHEY                                                     *
+*******************************************************************************/
+
+require('ttfparser.php');
+
+function Message($txt, $severity='')
+{
+	if(PHP_SAPI=='cli')
+	{
+		if($severity)
+			echo "$severity: ";
+		echo "$txt\n";
+	}
+	else
+	{
+		if($severity)
+			echo "<b>$severity</b>: ";
+		echo "$txt<br>";
+	}
+}
+
+function Notice($txt)
+{
+	Message($txt, 'Notice');
+}
+
+function Warning($txt)
+{
+	Message($txt, 'Warning');
+}
+
+function Error($txt)
+{
+	Message($txt, 'Error');
+	exit;
+}
+
+function LoadMap($enc)
+{
+	$file = dirname(__FILE__).'/'.strtolower($enc).'.map';
+	$a = file($file);
+	if(empty($a))
+		Error('Encoding not found: '.$enc);
+	$map = array_fill(0, 256, array('uv'=>-1, 'name'=>'.notdef'));
+	foreach($a as $line)
+	{
+		$e = explode(' ', rtrim($line));
+		$c = hexdec(substr($e[0],1));
+		$uv = hexdec(substr($e[1],2));
+		$name = $e[2];
+		$map[$c] = array('uv'=>$uv, 'name'=>$name);
+	}
+	return $map;
+}
+
+function GetInfoFromTrueType($file, $embed, $map)
+{
+	// Return informations from a TrueType font
+	$ttf = new TTFParser();
+	$ttf->Parse($file);
+	if($embed)
+	{
+		if(!$ttf->Embeddable)
+			Error('Font license does not allow embedding');
+		$info['Data'] = file_get_contents($file);
+		$info['OriginalSize'] = filesize($file);
+	}
+	$k = 1000/$ttf->unitsPerEm;
+	$info['FontName'] = $ttf->postScriptName;
+	$info['Bold'] = $ttf->Bold;
+	$info['ItalicAngle'] = $ttf->italicAngle;
+	$info['IsFixedPitch'] = $ttf->isFixedPitch;
+	$info['Ascender'] = round($k*$ttf->typoAscender);
+	$info['Descender'] = round($k*$ttf->typoDescender);
+	$info['UnderlineThickness'] = round($k*$ttf->underlineThickness);
+	$info['UnderlinePosition'] = round($k*$ttf->underlinePosition);
+	$info['FontBBox'] = array(round($k*$ttf->xMin), round($k*$ttf->yMin), round($k*$ttf->xMax), round($k*$ttf->yMax));
+	$info['CapHeight'] = round($k*$ttf->capHeight);
+	$info['MissingWidth'] = round($k*$ttf->widths[0]);
+	$widths = array_fill(0, 256, $info['MissingWidth']);
+	for($c=0;$c<=255;$c++)
+	{
+		if($map[$c]['name']!='.notdef')
+		{
+			$uv = $map[$c]['uv'];
+			if(isset($ttf->chars[$uv]))
+			{
+				$w = $ttf->widths[$ttf->chars[$uv]];
+				$widths[$c] = round($k*$w);
+			}
+			else
+				Warning('Character '.$map[$c]['name'].' is missing');
+		}
+	}
+	$info['Widths'] = $widths;
+	return $info;
+}
+
+function GetInfoFromType1($file, $embed, $map)
+{
+	// Return informations from a Type1 font
+	if($embed)
+	{
+		$f = fopen($file, 'rb');
+		if(!$f)
+			Error('Can\'t open font file');
+		// Read first segment
+		$a = unpack('Cmarker/Ctype/Vsize', fread($f,6));
+		if($a['marker']!=128)
+			Error('Font file is not a valid binary Type1');
+		$size1 = $a['size'];
+		$data = fread($f, $size1);
+		// Read second segment
+		$a = unpack('Cmarker/Ctype/Vsize', fread($f,6));
+		if($a['marker']!=128)
+			Error('Font file is not a valid binary Type1');
+		$size2 = $a['size'];
+		$data .= fread($f, $size2);
+		fclose($f);
+		$info['Data'] = $data;
+		$info['Size1'] = $size1;
+		$info['Size2'] = $size2;
+	}
+
+	$afm = substr($file, 0, -3).'afm';
+	if(!file_exists($afm))
+		Error('AFM font file not found: '.$afm);
+	$a = file($afm);
+	if(empty($a))
+		Error('AFM file empty or not readable');
+	foreach($a as $line)
+	{
+		$e = explode(' ', rtrim($line));
+		if(count($e)<2)
+			continue;
+		$entry = $e[0];
+		if($entry=='C')
+		{
+			$w = $e[4];
+			$name = $e[7];
+			$cw[$name] = $w;
+		}
+		elseif($entry=='FontName')
+			$info['FontName'] = $e[1];
+		elseif($entry=='Weight')
+			$info['Weight'] = $e[1];
+		elseif($entry=='ItalicAngle')
+			$info['ItalicAngle'] = (int)$e[1];
+		elseif($entry=='Ascender')
+			$info['Ascender'] = (int)$e[1];
+		elseif($entry=='Descender')
+			$info['Descender'] = (int)$e[1];
+		elseif($entry=='UnderlineThickness')
+			$info['UnderlineThickness'] = (int)$e[1];
+		elseif($entry=='UnderlinePosition')
+			$info['UnderlinePosition'] = (int)$e[1];
+		elseif($entry=='IsFixedPitch')
+			$info['IsFixedPitch'] = ($e[1]=='true');
+		elseif($entry=='FontBBox')
+			$info['FontBBox'] = array((int)$e[1], (int)$e[2], (int)$e[3], (int)$e[4]);
+		elseif($entry=='CapHeight')
+			$info['CapHeight'] = (int)$e[1];
+		elseif($entry=='StdVW')
+			$info['StdVW'] = (int)$e[1];
+	}
+
+	if(!isset($info['FontName']))
+		Error('FontName missing in AFM file');
+	$info['Bold'] = isset($info['Weight']) && preg_match('/bold|black/i', $info['Weight']);
+	if(isset($cw['.notdef']))
+		$info['MissingWidth'] = $cw['.notdef'];
+	else
+		$info['MissingWidth'] = 0;
+	$widths = array_fill(0, 256, $info['MissingWidth']);
+	for($c=0;$c<=255;$c++)
+	{
+		$name = $map[$c]['name'];
+		if($name!='.notdef')
+		{
+			if(isset($cw[$name]))
+				$widths[$c] = $cw[$name];
+			else
+				Warning('Character '.$name.' is missing');
+		}
+	}
+	$info['Widths'] = $widths;
+	return $info;
+}
+
+function MakeFontDescriptor($info)
+{
+	// Ascent
+	$fd = "array('Ascent'=>".$info['Ascender'];
+	// Descent
+	$fd .= ",'Descent'=>".$info['Descender'];
+	// CapHeight
+	if(!empty($info['CapHeight']))
+		$fd .= ",'CapHeight'=>".$info['CapHeight'];
+	else
+		$fd .= ",'CapHeight'=>".$info['Ascender'];
+	// Flags
+	$flags = 0;
+	if($info['IsFixedPitch'])
+		$flags += 1<<0;
+	$flags += 1<<5;
+	if($info['ItalicAngle']!=0)
+		$flags += 1<<6;
+	$fd .= ",'Flags'=>".$flags;
+	// FontBBox
+	$fbb = $info['FontBBox'];
+	$fd .= ",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'";
+	// ItalicAngle
+	$fd .= ",'ItalicAngle'=>".$info['ItalicAngle'];
+	// StemV
+	if(isset($info['StdVW']))
+		$stemv = $info['StdVW'];
+	elseif($info['Bold'])
+		$stemv = 120;
+	else
+		$stemv = 70;
+	$fd .= ",'StemV'=>".$stemv;
+	// MissingWidth
+	$fd .= ",'MissingWidth'=>".$info['MissingWidth'].')';
+	return $fd;
+}
+
+function MakeWidthArray($widths)
+{
+	$s = "array(\n\t";
+	for($c=0;$c<=255;$c++)
+	{
+		if(chr($c)=="'")
+			$s .= "'\\''";
+		elseif(chr($c)=="\\")
+			$s .= "'\\\\'";
+		elseif($c>=32 && $c<=126)
+			$s .= "'".chr($c)."'";
+		else
+			$s .= "chr($c)";
+		$s .= '=>'.$widths[$c];
+		if($c<255)
+			$s .= ',';
+		if(($c+1)%22==0)
+			$s .= "\n\t";
+	}
+	$s .= ')';
+	return $s;
+}
+
+function MakeFontEncoding($map)
+{
+	// Build differences from reference encoding
+	$ref = LoadMap('cp1252');
+	$s = '';
+	$last = 0;
+	for($c=32;$c<=255;$c++)
+	{
+		if($map[$c]['name']!=$ref[$c]['name'])
+		{
+			if($c!=$last+1)
+				$s .= $c.' ';
+			$last = $c;
+			$s .= '/'.$map[$c]['name'].' ';
+		}
+	}
+	return rtrim($s);
+}
+
+function SaveToFile($file, $s, $mode)
+{
+	$f = fopen($file, 'w'.$mode);
+	if(!$f)
+		Error('Can\'t write to file '.$file);
+	fwrite($f, $s, strlen($s));
+	fclose($f);
+}
+
+function MakeDefinitionFile($file, $type, $enc, $embed, $map, $info)
+{
+	$s = "<?php\n";
+	$s .= '$type = \''.$type."';\n";
+	$s .= '$name = \''.$info['FontName']."';\n";
+	$s .= '$desc = '.MakeFontDescriptor($info).";\n";
+	$s .= '$up = '.$info['UnderlinePosition'].";\n";
+	$s .= '$ut = '.$info['UnderlineThickness'].";\n";
+	$s .= '$cw = '.MakeWidthArray($info['Widths']).";\n";
+	$s .= '$enc = \''.$enc."';\n";
+	$diff = MakeFontEncoding($map);
+	if($diff)
+		$s .= '$diff = \''.$diff."';\n";
+	if($embed)
+	{
+		$s .= '$file = \''.$info['File']."';\n";
+		if($type=='Type1')
+		{
+			$s .= '$size1 = '.$info['Size1'].";\n";
+			$s .= '$size2 = '.$info['Size2'].";\n";
+		}
+		else
+			$s .= '$originalsize = '.$info['OriginalSize'].";\n";
+	}
+	$s .= "?>\n";
+	SaveToFile($file, $s, 't');
+}
+
+function MakeFont($fontfile, $enc='cp1252', $embed=true)
+{
+	// Generate a font definition file
+	if(get_magic_quotes_runtime())
+		@set_magic_quotes_runtime(0);
+	ini_set('auto_detect_line_endings', '1');
+
+	if(!file_exists($fontfile))
+		Error('Font file not found: '.$fontfile);
+	$ext = strtolower(substr($fontfile,-3));
+	if($ext=='ttf' || $ext=='otf')
+		$type = 'TrueType';
+	elseif($ext=='pfb')
+		$type = 'Type1';
+	else
+		Error('Unrecognized font file extension: '.$ext);
+
+	$map = LoadMap($enc);
+
+	if($type=='TrueType')
+		$info = GetInfoFromTrueType($fontfile, $embed, $map);
+	else
+		$info = GetInfoFromType1($fontfile, $embed, $map);
+
+	$basename = substr(basename($fontfile), 0, -4);
+	if($embed)
+	{
+		if(function_exists('gzcompress'))
+		{
+			$file = $basename.'.z';
+			SaveToFile($file, gzcompress($info['Data']), 'b');
+			$info['File'] = $file;
+			Message('Font file compressed: '.$file);
+		}
+		else
+		{
+			$info['File'] = basename($fontfile);
+			Notice('Font file could not be compressed (zlib extension not available)');
+		}
+	}
+
+	MakeDefinitionFile($basename.'.php', $type, $enc, $embed, $map, $info);
+	Message('Font definition file generated: '.$basename.'.php');
+}
+
+if(PHP_SAPI=='cli')
+{
+	// Command-line interface
+	if($argc==1)
+		die("Usage: php makefont.php fontfile [enc] [embed]\n");
+	$fontfile = $argv[1];
+	if($argc>=3)
+		$enc = $argv[2];
+	else
+		$enc = 'cp1252';
+	if($argc>=4)
+		$embed = ($argv[3]=='true' || $argv[3]=='1');
+	else
+		$embed = true;
+	MakeFont($fontfile, $enc, $embed);
+}
+?>
Index: /lib/fpdf/makefont/ttfparser.php
===================================================================
--- /lib/fpdf/makefont/ttfparser.php	(revision 5261)
+++ /lib/fpdf/makefont/ttfparser.php	(revision 5261)
@@ -0,0 +1,289 @@
+<?php
+/*******************************************************************************
+* Utility to parse TTF font files                                              *
+*                                                                              *
+* Version: 1.0                                                                 *
+* Date:    2011-06-18                                                          *
+* Author:  Olivier PLATHEY                                                     *
+*******************************************************************************/
+
+class TTFParser
+{
+	var $f;
+	var $tables;
+	var $unitsPerEm;
+	var $xMin, $yMin, $xMax, $yMax;
+	var $numberOfHMetrics;
+	var $numGlyphs;
+	var $widths;
+	var $chars;
+	var $postScriptName;
+	var $Embeddable;
+	var $Bold;
+	var $typoAscender;
+	var $typoDescender;
+	var $capHeight;
+	var $italicAngle;
+	var $underlinePosition;
+	var $underlineThickness;
+	var $isFixedPitch;
+
+	function Parse($file)
+	{
+		$this->f = fopen($file, 'rb');
+		if(!$this->f)
+			$this->Error('Can\'t open file: '.$file);
+
+		$version = $this->Read(4);
+		if($version=='OTTO')
+			$this->Error('OpenType fonts based on PostScript outlines are not supported');
+		if($version!="\x00\x01\x00\x00")
+			$this->Error('Unrecognized file format');
+		$numTables = $this->ReadUShort();
+		$this->Skip(3*2); // searchRange, entrySelector, rangeShift
+		$this->tables = array();
+		for($i=0;$i<$numTables;$i++)
+		{
+			$tag = $this->Read(4);
+			$this->Skip(4); // checkSum
+			$offset = $this->ReadULong();
+			$this->Skip(4); // length
+			$this->tables[$tag] = $offset;
+		}
+
+		$this->ParseHead();
+		$this->ParseHhea();
+		$this->ParseMaxp();
+		$this->ParseHmtx();
+		$this->ParseCmap();
+		$this->ParseName();
+		$this->ParseOS2();
+		$this->ParsePost();
+
+		fclose($this->f);
+	}
+
+	function ParseHead()
+	{
+		$this->Seek('head');
+		$this->Skip(3*4); // version, fontRevision, checkSumAdjustment
+		$magicNumber = $this->ReadULong();
+		if($magicNumber!=0x5F0F3CF5)
+			$this->Error('Incorrect magic number');
+		$this->Skip(2); // flags
+		$this->unitsPerEm = $this->ReadUShort();
+		$this->Skip(2*8); // created, modified
+		$this->xMin = $this->ReadShort();
+		$this->yMin = $this->ReadShort();
+		$this->xMax = $this->ReadShort();
+		$this->yMax = $this->ReadShort();
+	}
+
+	function ParseHhea()
+	{
+		$this->Seek('hhea');
+		$this->Skip(4+15*2);
+		$this->numberOfHMetrics = $this->ReadUShort();
+	}
+
+	function ParseMaxp()
+	{
+		$this->Seek('maxp');
+		$this->Skip(4);
+		$this->numGlyphs = $this->ReadUShort();
+	}
+
+	function ParseHmtx()
+	{
+		$this->Seek('hmtx');
+		$this->widths = array();
+		for($i=0;$i<$this->numberOfHMetrics;$i++)
+		{
+			$advanceWidth = $this->ReadUShort();
+			$this->Skip(2); // lsb
+			$this->widths[$i] = $advanceWidth;
+		}
+		if($this->numberOfHMetrics<$this->numGlyphs)
+		{
+			$lastWidth = $this->widths[$this->numberOfHMetrics-1];
+			$this->widths = array_pad($this->widths, $this->numGlyphs, $lastWidth);
+		}
+	}
+
+	function ParseCmap()
+	{
+		$this->Seek('cmap');
+		$this->Skip(2); // version
+		$numTables = $this->ReadUShort();
+		$offset31 = 0;
+		for($i=0;$i<$numTables;$i++)
+		{
+			$platformID = $this->ReadUShort();
+			$encodingID = $this->ReadUShort();
+			$offset = $this->ReadULong();
+			if($platformID==3 && $encodingID==1)
+				$offset31 = $offset;
+		}
+		if($offset31==0)
+			$this->Error('No Unicode encoding found');
+
+		$startCount = array();
+		$endCount = array();
+		$idDelta = array();
+		$idRangeOffset = array();
+		$this->chars = array();
+		fseek($this->f, $this->tables['cmap']+$offset31, SEEK_SET);
+		$format = $this->ReadUShort();
+		if($format!=4)
+			$this->Error('Unexpected subtable format: '.$format);
+		$this->Skip(2*2); // length, language
+		$segCount = $this->ReadUShort()/2;
+		$this->Skip(3*2); // searchRange, entrySelector, rangeShift
+		for($i=0;$i<$segCount;$i++)
+			$endCount[$i] = $this->ReadUShort();
+		$this->Skip(2); // reservedPad
+		for($i=0;$i<$segCount;$i++)
+			$startCount[$i] = $this->ReadUShort();
+		for($i=0;$i<$segCount;$i++)
+			$idDelta[$i] = $this->ReadShort();
+		$offset = ftell($this->f);
+		for($i=0;$i<$segCount;$i++)
+			$idRangeOffset[$i] = $this->ReadUShort();
+
+		for($i=0;$i<$segCount;$i++)
+		{
+			$c1 = $startCount[$i];
+			$c2 = $endCount[$i];
+			$d = $idDelta[$i];
+			$ro = $idRangeOffset[$i];
+			if($ro>0)
+				fseek($this->f, $offset+2*$i+$ro, SEEK_SET);
+			for($c=$c1;$c<=$c2;$c++)
+			{
+				if($c==0xFFFF)
+					break;
+				if($ro>0)
+				{
+					$gid = $this->ReadUShort();
+					if($gid>0)
+						$gid += $d;
+				}
+				else
+					$gid = $c+$d;
+				if($gid>=65536)
+					$gid -= 65536;
+				if($gid>0)
+					$this->chars[$c] = $gid;
+			}
+		}
+	}
+
+	function ParseName()
+	{
+		$this->Seek('name');
+		$tableOffset = ftell($this->f);
+		$this->postScriptName = '';
+		$this->Skip(2); // format
+		$count = $this->ReadUShort();
+		$stringOffset = $this->ReadUShort();
+		for($i=0;$i<$count;$i++)
+		{
+			$this->Skip(3*2); // platformID, encodingID, languageID
+			$nameID = $this->ReadUShort();
+			$length = $this->ReadUShort();
+			$offset = $this->ReadUShort();
+			if($nameID==6)
+			{
+				// PostScript name
+				fseek($this->f, $tableOffset+$stringOffset+$offset, SEEK_SET);
+				$s = $this->Read($length);
+				$s = str_replace(chr(0), '', $s);
+				$s = preg_replace('|[ \[\](){}<>/%]|', '', $s);
+				$this->postScriptName = $s;
+				break;
+			}
+		}
+		if($this->postScriptName=='')
+			$this->Error('PostScript name not found');
+	}
+
+	function ParseOS2()
+	{
+		$this->Seek('OS/2');
+		$version = $this->ReadUShort();
+		$this->Skip(3*2); // xAvgCharWidth, usWeightClass, usWidthClass
+		$fsType = $this->ReadUShort();
+		$this->Embeddable = ($fsType!=2) && ($fsType & 0x200)==0;
+		$this->Skip(11*2+10+4*4+4);
+		$fsSelection = $this->ReadUShort();
+		$this->Bold = ($fsSelection & 32)!=0;
+		$this->Skip(2*2); // usFirstCharIndex, usLastCharIndex
+		$this->typoAscender = $this->ReadShort();
+		$this->typoDescender = $this->ReadShort();
+		if($version>=2)
+		{
+			$this->Skip(3*2+2*4+2);
+			$this->capHeight = $this->ReadShort();
+		}
+		else
+			$this->capHeight = 0;
+	}
+
+	function ParsePost()
+	{
+		$this->Seek('post');
+		$this->Skip(4); // version
+		$this->italicAngle = $this->ReadShort();
+		$this->Skip(2); // Skip decimal part
+		$this->underlinePosition = $this->ReadShort();
+		$this->underlineThickness = $this->ReadShort();
+		$this->isFixedPitch = ($this->ReadULong()!=0);
+	}
+
+	function Error($msg)
+	{
+		if(PHP_SAPI=='cli')
+			die("Error: $msg\n");
+		else
+			die("<b>Error</b>: $msg");
+	}
+
+	function Seek($tag)
+	{
+		if(!isset($this->tables[$tag]))
+			$this->Error('Table not found: '.$tag);
+		fseek($this->f, $this->tables[$tag], SEEK_SET);
+	}
+
+	function Skip($n)
+	{
+		fseek($this->f, $n, SEEK_CUR);
+	}
+
+	function Read($n)
+	{
+		return fread($this->f, $n);
+	}
+
+	function ReadUShort()
+	{
+		$a = unpack('nn', fread($this->f,2));
+		return $a['n'];
+	}
+
+	function ReadShort()
+	{
+		$a = unpack('nn', fread($this->f,2));
+		$v = $a['n'];
+		if($v>=0x8000)
+			$v -= 65536;
+		return $v;
+	}
+
+	function ReadULong()
+	{
+		$a = unpack('NN', fread($this->f,4));
+		return $a['N'];
+	}
+}
+?>
Index: /lib/fpdf/pdf_context.php
===================================================================
--- /lib/fpdf/pdf_context.php	(revision 5261)
+++ /lib/fpdf/pdf_context.php	(revision 5261)
@@ -0,0 +1,100 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!class_exists('pdf_context', false)) {
+    
+    class pdf_context {
+    
+        /**
+         * Modi
+         *
+         * @var integer 0 = file | 1 = string
+         */
+        var $_mode = 0;
+        
+    	var $file;
+    	var $buffer;
+    	var $offset;
+    	var $length;
+    
+    	var $stack;
+    
+    	// Constructor
+    
+    	function pdf_context(&$f) {
+    		$this->file =& $f;
+    		if (is_string($this->file))
+    		    $this->_mode = 1;
+    		$this->reset();
+    	}
+    
+    	// Optionally move the file
+    	// pointer to a new location
+    	// and reset the buffered data
+    
+    	function reset($pos = null, $l = 100) {
+    	    if ($this->_mode == 0) {
+            	if (!is_null ($pos)) {
+        			fseek ($this->file, $pos);
+        		}
+        
+        		$this->buffer = $l > 0 ? fread($this->file, $l) : '';
+        		$this->length = strlen($this->buffer);
+        		if ($this->length < $l)
+                    $this->increase_length($l - $this->length);
+    	    } else {
+    	        $this->buffer = $this->file;
+    	        $this->length = strlen($this->buffer);
+    	    }
+    		$this->offset = 0;
+    		$this->stack = array();
+    	}
+    
+    	// Make sure that there is at least one
+    	// character beyond the current offset in
+    	// the buffer to prevent the tokenizer
+    	// from attempting to access data that does
+    	// not exist
+    
+    	function ensure_content() {
+    		if ($this->offset >= $this->length - 1) {
+    			return $this->increase_length();
+    		} else {
+    			return true;
+    		}
+    	}
+    
+    	// Forcefully read more data into the buffer
+    
+    	function increase_length($l = 100) {
+    		if ($this->_mode == 0 && feof($this->file)) {
+    			return false;
+    		} else if ($this->_mode == 0) {
+    		    $totalLength = $this->length + $l;
+    		    do {
+                    $this->buffer .= fread($this->file, $totalLength-$this->length);
+                } while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file));
+    			
+    			return true;
+    		} else {
+    	        return false;
+    		}
+    	}
+    }
+}
Index: /lib/fpdf/pdf_parser.php
===================================================================
--- /lib/fpdf/pdf_parser.php	(revision 5261)
+++ /lib/fpdf/pdf_parser.php	(revision 5261)
@@ -0,0 +1,1028 @@
+<?php
+// +---------------------------------------------------------------------+
+// | FPDI PDF-Parser v.1.0.3                                             |
+// | Copyright (c) 2009-2010 Setasign - Jan Slabon                       |
+// +---------------------------------------------------------------------+
+// | This source file is subject to the                                  |
+// |    "FPDI PDF-Parser Commercial Developer License Agreement"         |
+// | that is bundled with this package in the file                       |
+// |    "FPDI-PDF-Parser-License.pdf"                                    |
+// +---------------------------------------------------------------------+
+// | Homepage: http://www.setasign.de                                    |
+// | E-mail: support@setasign.de                                         |
+// +---------------------------------------------------------------------+
+
+if (!defined ('PDF_TYPE_NULL'))
+    define ('PDF_TYPE_NULL', 0);
+if (!defined ('PDF_TYPE_NUMERIC'))
+    define ('PDF_TYPE_NUMERIC', 1);
+if (!defined ('PDF_TYPE_TOKEN'))
+    define ('PDF_TYPE_TOKEN', 2);
+if (!defined ('PDF_TYPE_HEX'))
+    define ('PDF_TYPE_HEX', 3);
+if (!defined ('PDF_TYPE_STRING'))
+    define ('PDF_TYPE_STRING', 4);
+if (!defined ('PDF_TYPE_DICTIONARY'))
+    define ('PDF_TYPE_DICTIONARY', 5);
+if (!defined ('PDF_TYPE_ARRAY'))
+    define ('PDF_TYPE_ARRAY', 6);
+if (!defined ('PDF_TYPE_OBJDEC'))
+    define ('PDF_TYPE_OBJDEC', 7);
+if (!defined ('PDF_TYPE_OBJREF'))
+    define ('PDF_TYPE_OBJREF', 8);
+if (!defined ('PDF_TYPE_OBJECT'))
+    define ('PDF_TYPE_OBJECT', 9);
+if (!defined ('PDF_TYPE_STREAM'))
+    define ('PDF_TYPE_STREAM', 10);
+if (!defined ('PDF_TYPE_BOOLEAN'))
+    define ('PDF_TYPE_BOOLEAN', 11);
+if (!defined ('PDF_TYPE_REAL'))
+    define ('PDF_TYPE_REAL', 12);
+
+require_once('pdf_context.php');
+
+class pdf_parser {
+	
+	/**
+     * Filename
+     * @var string
+     */
+    var $filename;
+    
+    /**
+     * File resource
+     * @var resource
+     */
+    var $f;
+    
+    /**
+     * PDF Context
+     * @var object pdf_context-Instance
+     */
+    var $c;
+    
+    /**
+     * xref-Data
+     * @var array
+     */
+    var $xref;
+
+    /**
+     * root-Object
+     * @var array
+     */
+    var $root;
+    
+    /**
+     * PDF Version
+     * @var array
+     */
+    var $pdfVersion = '1.3';
+    
+    /**
+     * For reading encrypted documents and xref/objectstreams are in use
+     *
+     * @var boolean
+     */
+    var $readPlain = true;
+    
+    /**
+     * Cache for opened object streams
+     *
+     * @var array
+     */
+    var $_objStreamCache = array();
+    
+    /**
+     * Constructor
+     *
+     * @param string $filename  Source-Filename
+     */
+	function pdf_parser($filename) {
+        $this->filename = $filename;
+        
+        $this->f = @fopen($this->filename, 'rb');
+        
+        if (!$this->f)
+            $this->error(sprintf('Cannot open %s !', $filename));
+        
+        $this->getPDFVersion();
+        
+        $this->c = new pdf_context($this->f);
+
+        $this->xref = array();
+        $this->pdf_read_xref($this->xref, $this->pdf_find_xref());
+        
+        if (count($this->xref) == 0) {
+            $this->error('Unable to find xref table.');
+        }
+        
+        // Check for Encryption
+        $this->getEncryption();
+        
+        // Read root
+        $this->pdf_read_root();
+    }
+    
+    /**
+     * Close the opened file
+     */
+    function closeFile() {
+    	if (isset($this->f) && is_resource($this->f)) {
+    	    fclose($this->f);
+    		unset($this->f);
+    	}	
+    }
+    
+    /**
+     * Print Error and die
+     *
+     * @param string $msg  Error-Message
+     */
+    function error($msg) {
+    	die('<b>PDF-Parser Error:</b> ' . $msg);	
+    }
+    
+    /**
+     * Check Trailer for Encryption
+     */
+    function getEncryption() {
+        if (isset($this->xref['trailer'][1]['/Encrypt'])) {
+            $this->error('File is encrypted!');
+        }
+    }
+    
+	/**
+     * Find/Return /Root
+     *
+     * @return array
+     */
+    function pdf_find_root() {
+        if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) {
+            $this->error('Wrong Type of Root-Element! Must be an indirect reference');
+        }
+        
+        return $this->xref['trailer'][1]['/Root'];
+    }
+
+    /**
+     * Read the /Root
+     */
+    function pdf_read_root() {
+        // read root
+        $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root());
+    }
+    
+    /**
+     * Get PDF-Version
+     *
+     * And reset the PDF Version used in FPDI if needed
+     */
+    function getPDFVersion() {
+        fseek($this->f, 0);
+        preg_match('/\d\.\d/', fread($this->f, 16), $m);
+        if (isset($m[0]))
+            $this->pdfVersion = $m[0];
+        return $this->pdfVersion;
+    }
+    
+    /**
+     * Find the xref-Table
+     */
+    function pdf_find_xref() {
+        $toRead = 1500;
+                
+        $stat = fseek ($this->f, -$toRead, SEEK_END);
+        if ($stat === -1) {
+            fseek ($this->f, 0);
+        }
+       	$data = fread($this->f, $toRead);
+       	
+        $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); 
+        $data = substr($data, $pos);
+        
+        if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) {
+            $this->error('Unable to find pointer to xref table');
+    	}
+
+    	return (int) $matches[1];
+    }
+
+    function pdf_read_xref(&$result, $offset) {
+        $o_pos = $offset-min(20, $offset);
+    	fseek($this->f, $o_pos); // set some bytes backwards to fetch errorious docs
+                
+        $data = fread($this->f, 100);
+        
+        $xrefPos = strrpos($data, 'xref');
+        
+        if ($xrefPos === false) {
+            // Could be a xref-Stream
+            // Set to the real pointer
+            fseek($this->f, $offset);
+            $c = new pdf_context($this->f);
+            $xrefStreamObjDec = $this->pdf_read_value($c);
+            
+            if (is_array($xrefStreamObjDec) && isset($xrefStreamObjDec[0]) && $xrefStreamObjDec[0] == PDF_TYPE_OBJDEC) {
+                
+                if (!isset($result['xref_location'])) {
+                    $result['xref_location'] = $offset;
+                    $result['max_object'] = 0;
+            	}
+            	
+            	$this->xref['xref'][$xrefStreamObjDec[1]] = array($xrefStreamObjDec[2] => $offset);
+            	
+                $xrefStream = $this->pdf_resolve_object($c, array(PDF_TYPE_OBJREF, $xrefStreamObjDec[1], $xrefStreamObjDec[2]));
+                
+                if (isset($xrefStream[1][1]['/Type']) && $xrefStream[1][1]['/Type'][1] == '/XRef') {
+                    $filters = array();
+        
+                    if (isset($xrefStream[1][1]['/Filter'])) {
+                        $_filter = $xrefStream[1][1]['/Filter'];
+            
+                        if ($_filter[0] == PDF_TYPE_TOKEN) {
+                            $filters[] = $_filter;
+                        } else if ($_filter[0] == PDF_TYPE_ARRAY) {
+                            $filters = $_filter[1];
+                        }
+                        $_filter = null;
+                        unset($_filter);
+                    }
+                    
+                    $xrefStreamData = $xrefStream[2][1];
+                    
+                    foreach ($filters AS $_filter) {
+                        switch ($_filter[1]) {
+                            case '/FlateDecode':
+                                if (function_exists('gzuncompress')) {
+                                    $xrefStreamData = (strlen($xrefStreamData) > 0) ? @gzuncompress($xrefStreamData) : '';                        
+                                } else {
+                                    $this->error(sprintf('To handle %s filter, please compile php with zlib support.', $_filter[1]));
+                                }
+                                if ($xrefStreamData === false) {
+                                    $this->error('Error while decompressing stream.');
+                                }
+                            break;
+                            case '/LZWDecode':
+                                include_once('filters/FilterLZW_FPDI.php');
+                                $decoder = new FilterLZW_FPDI($this->fpdi);
+                                $xrefStreamData = $decoder->decode($xrefStreamData);
+                                break;
+                            case '/ASCII85Decode':
+                                include_once('filters/FilterASCII85_FPDI.php');
+                                $decoder = new FilterASCII85_FPDI($this->fpdi);
+                                $xrefStreamData = $decoder->decode($xrefStreamData);
+                                break;
+                            case null:
+                                // no filter
+                                break;
+                            default:
+                                $this->error('Unsupported Filter: %s', $_filter[1]);
+                        }
+                    }
+                    $filters = null;
+                    unset($filters);
+                    
+                    if (isset($xrefStream[1][1]['/DecodeParms']) && isset($xrefStream[1][1]['/DecodeParms'][1]['/Predictor'])) {
+                        require_once('filters/FilterPredictor_FPDI.php');
+                        $decoder = new FilterPredictor_FPDI($this->fpdi);
+                        
+                        if (isset($xrefStream[1][1]['/DecodeParms'][1]['/Columns'])) {
+                            $xrefStreamData = $decoder->decode($xrefStreamData, $xrefStream[1][1]['/DecodeParms'][1]['/Predictor'][1], $xrefStream[1][1]['/DecodeParms'][1]['/Columns'][1]);
+                        } else {
+                            $xrefStreamData = $decoder->decode($xrefStreamData, $xrefStream[1][1]['/DecodeParms'][1]['/Predictor'][1]);                        
+                        }
+                    }
+                    
+                    if (isset($xrefStream[1][1]['/Index']))
+                        $sections = count($xrefStream[1][1]['/Index'][1])/2; 
+                    else 
+                        $sections = 1;
+                        
+                    $entryFieldSize = array(
+                        $xrefStream[1][1]['/W'][1][0][1],
+                        $xrefStream[1][1]['/W'][1][1][1],
+                        $xrefStream[1][1]['/W'][1][2][1]
+                    );
+                    
+                    $entrySize = array_sum($entryFieldSize);
+                    $offset = 0;
+                    
+                    if (!isset($result['xref'])) {
+                        $result['xref'] = array();
+                    } 
+                    
+                    $result['_isXrefStream'] = true;
+                        
+                    for ($count = 0; $count < $sections; $count++) {
+                        $size = $xrefStream[1][1]['/Size'][1];
+                        if (isset($xrefStream[1][1]['/Index'])) {  
+                            $objNum  = $xrefStream[1][1]['/Index'][1][$count*2][1];  
+                            $entries = $xrefStream[1][1]['/Index'][1][$count*2 + 1][1];
+                        } else {
+                            $objNum  = 0;
+                            $entries = $size;
+                        }  
+                        
+                        if ($size > $result['max_object'])
+                            $result['max_object'] = $size;
+                        
+                        for ($entry = 0; $entry < $entries; $entry++) {
+                            $fields = array(1, 0, 0);
+                            if ($entryFieldSize[0] > 0) {
+                                if ($entryFieldSize[0] == 1) {   
+                                    $fields[0] = ord($xrefStreamData[$offset++]);  
+                                } else {  
+                                    $fields[0] = 0;
+                                    for ($k = 0; $k < $entryFieldSize[0]; $k++) {
+                                        $fields[0] = ($fields[0] << 8) + (ord($xrefStreamData[$offset++]) & 0xff);
+                                    }
+                                }
+                            }
+
+                            for ($i = 1; $i < 3; $i++) {
+                                if ($entryFieldSize[$i] > 0) {
+                                    if ($entryFieldSize[$i] == 1) {   
+                                        $fields[$i] = ord($xrefStreamData[$offset++]);  
+                                    } else {  
+                                        $fields[$i] = 0;
+                                        for ($k = 0; $k < $entryFieldSize[$i]; $k++) {
+                                            $fields[$i] = ($fields[$i] << 8) + (ord($xrefStreamData[$offset++]) & 0xff);
+                                        }
+                                    }
+                                }
+                            }
+                            
+                            switch ($fields[0]) {
+                                case 0: // free
+                                    // 1 = object no bzw. $objNum 
+                                    // 2 = gen
+                                    if (!isset($result['xref'][$objNum]))
+                                        $result['xref'][$objNum] = array();
+                                        
+                                    if (!array_key_exists($gen = $fields[2], $result['xref'][$objNum])) {
+                                        $result['xref'][$objNum][$gen] = null;
+                                    } 
+                                    break;
+                                case 1: // normal entry
+                                    // 1 = offset 
+                                    // 2 = gen
+                                    if (!isset($result['xref'][$objNum]))
+                                        $result['xref'][$objNum] = array();
+                                    
+                                    if (!array_key_exists($gen = $fields[2], $result['xref'][$objNum])) {
+                                        $result['xref'][$objNum][$gen] = $fields[1];
+                                    }
+                                    break;
+                                case 2: // entry in an object stream
+                                    // 1 = stream object number
+                                    // 2 = index within the stream object
+                                    if (!isset($result['xref'][$objNum]))
+                                        $result['xref'][$objNum] = array();
+                                    
+                                    if (!isset($result['objStreams'][$objNum]) && (!isset($result['xref'][$objNum]) || !array_key_exists($gen = $fields[2], $result['xref'][$objNum]))) {
+                            	    	$result['objStreams'][$objNum] = array(
+                                            $fields[1],
+                                            $fields[2]
+                            	    	);
+                            	    	
+                            	    	$result['objStreamObjects'][$fields[1]] = 1;
+                                    } 
+                                    break;
+                            }
+                            
+                            $objNum++;
+                        }
+                    }
+                    
+                    if (!isset($result['trailer'])) {
+                        $result['trailer'] = array(PDF_TYPE_DICTIONARY, array());
+                        $allowed = array('/Size', '/Root', '/Encrypt', '/Info', '/ID');
+                        for ($i = 0, $n = count($allowed); $i < $n; $i++) {
+                            if (isset($xrefStream[1][1][$allowed[$i]])) {
+                                $result['trailer'][1][$allowed[$i]] = $xrefStream[1][1][$allowed[$i]];
+                            }
+                        }
+                    }
+                    
+                    if (isset($xrefStream[1][1]['/Prev'])) {
+                        $this->pdf_read_xref($result, $xrefStream[1][1]['/Prev'][1]);
+                    }
+                    
+                    return true;
+                }
+            }
+            
+            $this->error('Unable to find xref table.');
+        }
+        
+        if (!isset($result['xref_location'])) {
+            $result['xref_location'] = $o_pos+$xrefPos;
+            $result['max_object'] = 0;
+    	}
+
+    	$cylces = -1;
+        $bytesPerCycle = 100;
+        
+    	fseek($this->f, $o_pos = $o_pos+$xrefPos+4); // set the handle direct after the "xref"-keyword
+        $data = fread($this->f, $bytesPerCycle);
+        
+        while (($trailerPos = strpos($data, 'trailer', max($bytesPerCycle*$cylces++, 0))) === false && !feof($this->f)) {
+            $data .= fread($this->f, $bytesPerCycle);
+        }
+        
+        if ($trailerPos === false) {
+            $this->error('Trailer keyword not found after xref table');
+        }
+        
+        $data = substr($data, 0, $trailerPos);
+        
+        // get Line-Ending
+        preg_match_all("/(\r\n|\n|\r)/", substr($data, 0, 100), $m); // get linebreaks in the first 100 bytes
+
+        $differentLineEndings = count(array_unique($m[0]));
+        if ($differentLineEndings > 1) {
+            $lines = preg_split("/(\r\n|\n|\r)/", $data, -1, PREG_SPLIT_NO_EMPTY);
+        } else {
+            $lines = explode($m[0][1], $data);
+        }
+        
+        $data = $differentLineEndings = $m = null;
+        unset($data, $differentLineEndings, $m);
+        
+        $linesCount = count($lines);
+        
+        $start = 1;
+        
+        for ($i = 0; $i < $linesCount; $i++) {
+            $line = trim($lines[$i]);
+            if ($line) {
+                $pieces = explode(' ', $line);
+                
+                $c = count($pieces);
+                switch($c) {
+                    case 2:
+                        $start = (int)$pieces[0];
+                        $end   = $start+(int)$pieces[1];
+                        if ($end > $result['max_object'])
+                            $result['max_object'] = $end;
+                        break;
+                    case 3:
+                        if (!isset($result['xref'][$start]))
+                            $result['xref'][$start] = array();
+                        
+                        if (!array_key_exists($gen = (int) $pieces[1], $result['xref'][$start])) {
+                	        $result['xref'][$start][$gen] = $pieces[2] == 'n' ? (int) $pieces[0] : null;
+                	    }
+                        $start++;
+                        break;
+                    default:
+                        $this->error(sprintf('Unexpected data in xref table (%s)', join(' ', $pieces)));
+                }
+            }
+        }
+        
+        $lines = $pieces = $line = $start = $end = $gen = null;
+        unset($lines, $pieces, $line, $start, $end, $gen);
+        
+        fseek($this->f, $o_pos+$trailerPos+7);
+        
+        $c = new pdf_context($this->f);
+	    $trailer = $this->pdf_read_value($c);
+	    
+	    $c = null;
+	    unset($c);
+	    
+	    if (!isset($result['trailer'])) {
+            $result['trailer'] = $trailer;          
+	    }
+	    
+	    if (isset($trailer[1]['/Prev'])) {
+	    	$this->pdf_read_xref($result, $trailer[1]['/Prev'][1]);
+	    } 
+	    
+	    $trailer = null;
+	    unset($trailer);
+        
+        return true;
+    }
+    
+
+    /**
+     * Reads an Value
+     *
+     * @param object $c pdf_context
+     * @param string $token a Token
+     * @return mixed
+     */
+    function pdf_read_value(&$c, $token = null) {
+    	if (is_null($token)) {
+    	    $token = $this->pdf_read_token($c);
+    	}
+    	
+        if ($token === false) {
+    	    return false;
+    	}
+
+       	switch ($token) {
+            case	'<':
+    			// This is a hex string.
+    			// Read the value, then the terminator
+
+                $pos = $c->offset;
+
+    			while(1) {
+
+                    $match = strpos ($c->buffer, '>', $pos);
+				
+    				// If you can't find it, try
+    				// reading more data from the stream
+
+    				if ($match === false) {
+    					if (!$c->increase_length()) {
+    						return false;
+    					} else {
+                        	continue;
+                    	}
+    				}
+
+    				$result = substr ($c->buffer, $c->offset, $match - $c->offset);
+    				$c->offset = $match+1;
+    				
+    				return array (PDF_TYPE_HEX, $result);
+                }
+                
+                break;
+    		case	'<<':
+    			// This is a dictionary.
+
+    			$result = array();
+
+    			// Recurse into this function until we reach
+    			// the end of the dictionary.
+    			while (($key = $this->pdf_read_token($c)) !== '>>') {
+    				if ($key === false) {
+    					return false;
+    				}
+					
+    				if (($value = $this->pdf_read_value($c)) === false) {
+    					return false;
+    				}
+    				
+    				// Catch missing value
+    				if ($value[0] == PDF_TYPE_TOKEN && $value[1] == '>>') {
+    				    $result[$key] = array(PDF_TYPE_NULL);
+    				    break;
+    				}
+    				
+                    $result[$key] = $value;
+    			}
+    			
+    			return array (PDF_TYPE_DICTIONARY, $result);
+
+    		case	'[':
+    			// This is an array.
+
+    			$result = array();
+
+    			// Recurse into this function until we reach
+    			// the end of the array.
+    			while (($token = $this->pdf_read_token($c)) !== ']') {
+                    if ($token === false) {
+    					return false;
+    				}
+					
+    				if (($value = $this->pdf_read_value($c, $token)) === false) {
+                        return false;
+    				}
+					
+    				$result[] = $value;
+    			}
+    			
+                return array (PDF_TYPE_ARRAY, $result);
+            
+    		case	'('		:
+                // This is a string
+                $pos = $c->offset;
+                
+                $openBrackets = 1;
+    			do {
+                    for (; $openBrackets != 0 && $pos < $c->length; $pos++) {
+                        switch (ord($c->buffer[$pos])) {
+                            case 0x28: // '('
+                                $openBrackets++;
+                                break;
+                            case 0x29: // ')'
+                                $openBrackets--;
+                                break;
+                            case 0x5C: // backslash
+                                $pos++;
+                        }
+                    }
+    			} while($openBrackets != 0 && $c->increase_length());
+    			
+    			$result = substr($c->buffer, $c->offset, $pos - $c->offset - 1);
+    			$c->offset = $pos;
+    			
+    			return array (PDF_TYPE_STRING, $result);
+            
+            case 'stream':
+            	$o_pos = ftell($c->file)-strlen($c->buffer);
+		        $o_offset = $c->offset;
+		        
+		        $c->reset($startpos = $o_pos + $o_offset);
+		        
+		        $e = 0; // ensure line breaks in front of the stream
+		        if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13))
+		        	$e++;
+		        if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10))
+		        	$e++;
+		        
+	        	if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) {
+		        	$tmp_c = new pdf_context($this->f);
+		        	$tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']);
+		        	$length = $tmp_length[1][1];
+		        } else {
+		        	$length = $this->actual_obj[1][1]['/Length'][1];	
+		        }
+		        
+		        if ($length > 0) {
+    		        $c->reset($startpos+$e,$length);
+    		        $v = $c->buffer;
+		        } else {
+		            $v = '';   
+		        }
+		        
+		        $c->reset($startpos+$e+$length); 
+		        $endstream = $this->pdf_read_token($c);
+		        
+		        if ($endstream != 'endstream') {
+		            $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream")
+		            // We don't throw an error here because the next
+		            // round trip will start at a new offset
+		        }
+		        
+		        return array(PDF_TYPE_STREAM, $v);
+		        
+	        default	:
+            	if (is_numeric ($token)) {
+                    // A numeric token. Make sure that
+    				// it is not part of something else.
+    				if (($tok2 = $this->pdf_read_token ($c)) !== false) {
+                        if (is_numeric ($tok2)) {
+
+    						// Two numeric tokens in a row.
+    						// In this case, we're probably in
+    						// front of either an object reference
+    						// or an object specification.
+    						// Determine the case and return the data
+    						if (($tok3 = $this->pdf_read_token ($c)) !== false) {
+                                switch ($tok3) {
+    								case	'obj'	:
+                                        return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2);
+    								case	'R'		:
+    									return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2);
+    							}
+    							// If we get to this point, that numeric value up
+    							// there was just a numeric value. Push the extra
+    							// tokens back into the stack and return the value.
+    							array_push ($c->stack, $tok3);
+    						}
+    					}
+
+    					array_push ($c->stack, $tok2);
+    				}
+
+    				if ($token === (string)((int)$token))
+        				return array (PDF_TYPE_NUMERIC, (int)$token);
+    				else 
+    					return array (PDF_TYPE_REAL, (float)$token);
+    			} else if ($token == 'true' || $token == 'false') {
+                    return array (PDF_TYPE_BOOLEAN, $token == 'true');
+    			} else if ($token == 'null') {
+    			   return array (PDF_TYPE_NULL);
+    			} else {
+                    // Just a token. Return it.
+    				return array (PDF_TYPE_TOKEN, $token);
+    			}
+         }
+    }
+    
+    /**
+     * Resolve an object
+     *
+     * @param object $c pdf_context
+     * @param array $obj_spec The object-data
+     * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para
+     */
+    function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) {
+        // Exit if we get invalid data
+    	if (!is_array($obj_spec)) {
+    	    $ret = false;
+    	    return $ret;
+    	}
+
+    	if ($obj_spec[0] == PDF_TYPE_OBJREF) {
+    	    
+    	    // This is a reference, resolve it
+    		if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) {
+                
+    		    // Save current file position
+    			// This is needed if you want to resolve
+    			// references while you're reading another object
+    			// (e.g.: if you need to determine the length
+    			// of a stream)
+
+    			$old_pos = ftell($c->file);
+
+    			// Reposition the file pointer and
+    			// load the object header.
+				
+    			$c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]);
+
+    			$header = $this->pdf_read_value($c);
+    			
+                if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) {
+                	$toSearchFor = $obj_spec[1].' '.$obj_spec[2].' obj';
+    				if (preg_match('/'.$toSearchFor.'/', $c->buffer)) {
+    					$c->offset = strpos($c->buffer, $toSearchFor) + strlen($toSearchFor);
+    					// reset stack
+        				$c->stack = array();
+    				} else {
+        				$this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location");
+    				}
+                }
+
+    			// If we're being asked to store all the information
+    			// about the object, we add the object ID and generation
+    			// number for later use
+    			$result = array();
+				$this->actual_obj =& $result;
+    			if ($encapsulate) {
+    				$result = array (
+    					PDF_TYPE_OBJECT,
+    					'obj' => $obj_spec[1],
+    					'gen' => $obj_spec[2]
+    				);
+    			} 
+
+    			// Now simply read the object data until
+    			// we encounter an end-of-object marker
+    			while(1) {
+                    $value = $this->pdf_read_value($c);
+                    if ($value === false || count($result) > 4) {
+					    // in this case the parser coudn't find an endobj so we break here
+						break;
+    				}
+
+    				if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') {
+    					break;
+    				}
+
+                    $result[] = $value;
+    			}
+
+    			$c->reset($old_pos);
+
+                if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) {
+                    $result[0] = PDF_TYPE_STREAM;
+                }
+
+    		} else if (isset($this->xref['objStreams'][$obj_spec[1]])) {
+    		    
+    		    $this->actual_obj =& $result;
+    			if ($encapsulate) {
+    				$result = array (
+    					PDF_TYPE_OBJECT,
+    					'obj' => $obj_spec[1],
+    					'gen' => $obj_spec[2]
+    				);
+    			} else {
+    				$result = array();
+    			}
+    			
+    			$streamObjId = $this->xref['objStreams'][$obj_spec[1]][0];
+    			
+    			if (!isset($this->_objStreamCache[(string)$streamObjId])) {
+    			    $objStreamRef = array(PDF_TYPE_OBJREF, $streamObjId, 0);
+    			    $oReadPlain = $this->readPlain;
+    			    $this->readPlain = true;
+        		    $objStream = $this->pdf_resolve_object($c, $objStreamRef);
+        		    $this->readPlain = $oReadPlain;
+                        
+                    $firstOffset = $objStream[1][1]['/First'][1];
+                    $objectCount = $objStream[1][1]['/N'][1];
+        		    
+                    $filters = array();
+                    if (isset($objStream[1][1]['/Filter'])) {
+                        $_filter = $objStream[1][1]['/Filter'];
+            
+                        if ($_filter[0] == PDF_TYPE_TOKEN) {
+                            $filters[] = $_filter;
+                        } else if ($_filter[0] == PDF_TYPE_ARRAY) {
+                            $filters = $_filter[1];
+                        }
+                        $_filter = null;
+                        unset($_filter);
+                    }
+                    
+                    $stream = $objStream[2][1];
+                    
+                    foreach ($filters AS $_filter) {
+                        switch ($_filter[1]) {
+                            case '/FlateDecode':
+                                if (function_exists('gzuncompress')) {
+                                    $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';                        
+                                } else {
+                                    $this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
+                                }
+                                if ($stream === false) {
+                                    $this->error('Error while decompressing stream.');
+                                }
+                                break;
+                            case '/LZWDecode':
+                                include_once('filters/FilterLZW_FPDI.php');
+                                $decoder = new FilterLZW_FPDI($this->fpdi);
+                                $stream = $decoder->decode($stream);
+                                break;
+                            case '/ASCII85Decode':
+                                include_once('filters/FilterASCII85_FPDI.php');
+                                $decoder = new FilterASCII85_FPDI($this->fpdi);
+                                $stream = $decoder->decode($stream);
+                                break;
+                            case null:
+                                // nothing to do
+                                break;
+                            default:
+                                $this->error('Unsupported Filter: %s', $_filter[1]);
+                        }
+                    }
+                    $filters = null;
+                    unset($filters);
+                    
+                    $stream .= ' ';
+                    
+                    $sc = new pdf_context($stream);
+                    
+                    for ($i = 0; $i < $objectCount; $i++) {
+                        $objNo = $this->pdf_read_token($sc);
+                        $offset = $this->pdf_read_token($sc);
+                        $objectPos[$objNo] = $firstOffset+$offset;
+                    }
+                    
+                    $this->_objStreamCache[(string)$streamObjId] = array(
+                        'sc' => $sc,
+                        'objectPos' => $objectPos
+                    );
+    			} else {
+    			    extract($this->_objStreamCache[(string)$streamObjId]);
+    			}
+    			
+    			$sc->reset();
+    			$sc->offset = $objectPos[$obj_spec[1]];
+    			$oReadPlain = $this->readPlain;
+    			$this->readPlain = false;
+                $result[1] = $this->pdf_read_value($sc);
+                $this->readPlain = $oReadPlain;
+                    
+                if (count($this->_objStreamCache) > 2) {
+                    reset($this->_objStreamCache);
+                    $k = key($this->_objStreamCache);
+                    unset($this->_objStreamCache[$k]);
+                }
+            } else {
+                $this->actual_obj =& $result;
+    			if ($encapsulate) {
+    				$result = array (
+    					PDF_TYPE_OBJECT,
+    					'obj' => $obj_spec[1],
+    					'gen' => $obj_spec[2],
+    					array(PDF_TYPE_NULL)
+    				);
+    			} else {
+    				$result = array(PDF_TYPE_NULL);
+    			}
+            }
+    		
+            return $result;
+    	} else {
+    		return $obj_spec;
+    	}
+    }
+
+    
+    
+    /**
+     * Reads a token from the file
+     *
+     * @param object $c pdf_context
+     * @return mixed
+     */
+    function pdf_read_token(&$c)
+    {
+    	// If there is a token available
+    	// on the stack, pop it out and
+    	// return it.
+
+    	if (count($c->stack)) {
+    		return array_pop($c->stack);
+    	}
+
+    	// Strip away any whitespace
+
+    	do {
+    		if (!$c->ensure_content()) {
+    			return false;
+    		}
+    		$c->offset += strspn($c->buffer, " \n\r\t", $c->offset);
+    	} while ($c->offset >= $c->length - 1);
+
+    	// Get the first character in the stream
+
+    	$char = $c->buffer[$c->offset++];
+
+    	switch ($char) {
+
+    		case '[':
+    		case ']':
+    		case '(':
+    		case ')':
+
+    			// This is either an array or literal string
+    			// delimiter, Return it
+
+    			return $char;
+
+    		case '<':
+    		case '>':
+
+    			// This could either be a hex string or
+    			// dictionary delimiter. Determine the
+    			// appropriate case and return the token
+
+    			if ($c->buffer[$c->offset] == $char) {
+    				if (!$c->ensure_content()) {
+    					return false;
+    				}
+    				$c->offset++;
+    				return $char . $char;
+    			} else {
+    				return $char;
+    			}
+
+            case '%':
+			    
+                // This is a comment - jump over it!
+			    
+                $pos = $c->offset;
+                while(1) {
+    			    $match = preg_match("/(\r\n|\r|\n)/", $c->buffer, $m, PREG_OFFSET_CAPTURE, $pos);
+                    if ($match === 0) {
+    					if (!$c->increase_length()) {
+    						return false;
+    					} else {
+                        	continue;
+                    	}
+    				}
+
+    				$c->offset = $m[0][1]+strlen($m[0][0]);
+    				
+    				return $this->pdf_read_token($c);
+                }
+                
+    		default:
+
+    			// This is "another" type of token (probably
+    			// a dictionary entry or a numeric value)
+    			// Find the end and return it.
+
+    			if (!$c->ensure_content()) {
+    				return false;
+    			}
+
+    			while(1) {
+
+    				// Determine the length of the token
+
+    				$pos = strcspn($c->buffer, " %[]<>()\r\n\t/", $c->offset);
+
+    				if ($c->offset + $pos <= $c->length - 1) {
+    					break;
+    				} else {
+    					// If the script reaches this point,
+    					// the token may span beyond the end
+    					// of the current buffer. Therefore,
+    					// we increase the size of the buffer
+    					// and try again--just to be safe.
+
+    					$c->increase_length();
+    				}
+    			}
+
+    			$result = substr($c->buffer, $c->offset - 1, $pos + 1);
+                
+    			$c->offset += $pos;
+    			return $result;
+    	}
+    }
+}
Index: /lib/fpdf/tutorial/20k_c1.txt
===================================================================
--- /lib/fpdf/tutorial/20k_c1.txt	(revision 5261)
+++ /lib/fpdf/tutorial/20k_c1.txt	(revision 5261)
@@ -0,0 +1,10 @@
+The year 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten. Without getting into those rumors that upset civilians in the seaports and deranged the public mind even far inland, it must be said that professional seamen were especially alarmed. Traders, shipowners, captains of vessels, skippers, and master mariners from Europe and America, naval officers from every country, and at their heels the various national governments on these two continents, were all extremely disturbed by the business.
+In essence, over a period of time several ships had encountered "an enormous thing" at sea, a long spindle-shaped object, sometimes giving off a phosphorescent glow, infinitely bigger and faster than any whale.
+The relevant data on this apparition, as recorded in various logbooks, agreed pretty closely as to the structure of the object or creature in question, its unprecedented speed of movement, its startling locomotive power, and the unique vitality with which it seemed to be gifted.  If it was a cetacean, it exceeded in bulk any whale previously classified by science.  No naturalist, neither Cuvier nor Lacépède, neither Professor Dumeril nor Professor de Quatrefages, would have accepted the existence of such a monster sight unseen -- specifically, unseen by their own scientific eyes.
+Striking an average of observations taken at different times -- rejecting those timid estimates that gave the object a length of 200 feet, and ignoring those exaggerated views that saw it as a mile wide and three long--you could still assert that this phenomenal creature greatly exceeded the dimensions of anything then known to ichthyologists, if it existed at all.
+Now then, it did exist, this was an undeniable fact; and since the human mind dotes on objects of wonder, you can understand the worldwide excitement caused by this unearthly apparition. As for relegating it to the realm of fiction, that charge had to be dropped.
+In essence, on July 20, 1866, the steamer Governor Higginson, from the Calcutta & Burnach Steam Navigation Co., encountered this moving mass five miles off the eastern shores of Australia. Captain Baker at first thought he was in the presence of an unknown reef; he was even about to fix its exact position when two waterspouts shot out of this inexplicable object and sprang hissing into the air some 150 feet.  So, unless this reef was subject to the intermittent eruptions of a geyser, the Governor Higginson had fair and honest dealings with some aquatic mammal, until then unknown, that could spurt from its blowholes waterspouts mixed with air and steam.
+Similar events were likewise observed in Pacific seas, on July 23 of the same year, by the Christopher Columbus from the West India & Pacific Steam Navigation Co.  Consequently, this extraordinary cetacean could transfer itself from one locality to another with startling swiftness, since within an interval of just three days, the Governor Higginson and the Christopher Columbus had observed it at two positions on the charts separated by a distance of more than 700 nautical leagues.
+Fifteen days later and 2,000 leagues farther, the Helvetia from the Compagnie Nationale and the Shannon from the Royal Mail line, running on opposite tacks in that part of the Atlantic lying between the United States and Europe, respectively signaled each other that the monster had been sighted in latitude 42 degrees 15' north and longitude 60 degrees 35' west of the meridian of Greenwich.  From their simultaneous observations, they were able to estimate the mammal's minimum length at more than 350 English feet; this was because both the Shannon and the Helvetia were of smaller dimensions, although each measured 100 meters stem to stern. Now then, the biggest whales, those rorqual whales that frequent the waterways of the Aleutian Islands, have never exceeded a length of 56 meters--if they reach even that.
+One after another, reports arrived that would profoundly affect public opinion:  new observations taken by the transatlantic liner Pereire, the Inman line's Etna running afoul of the monster, an official report drawn up by officers on the French frigate Normandy, dead-earnest reckonings obtained by the general staff of Commodore Fitz-James aboard the Lord Clyde. In lighthearted countries, people joked about this phenomenon, but such serious, practical countries as England, America, and Germany were deeply concerned.
+In every big city the monster was the latest rage; they sang about it in the coffee houses, they ridiculed it in the newspapers, they dramatized it in the theaters.  The tabloids found it a fine opportunity for hatching all sorts of hoaxes. In those newspapers short of copy, you saw the reappearance of every gigantic imaginary creature, from "Moby Dick," that dreadful white whale from the High Arctic regions, to the stupendous kraken whose tentacles could entwine a 500-ton craft and drag it into the ocean depths. They even reprinted reports from ancient times: the views of Aristotle and Pliny accepting the existence of such monsters, then the Norwegian stories of Bishop Pontoppidan, the narratives of Paul Egede, and finally the reports of Captain Harrington -- whose good faith is above suspicion--in which he claims he saw, while aboard the Castilian in 1857, one of those enormous serpents that, until then, had frequented only the seas of France's old extremist newspaper, The Constitutionalist.
Index: /lib/fpdf/tutorial/20k_c2.txt
===================================================================
--- /lib/fpdf/tutorial/20k_c2.txt	(revision 5261)
+++ /lib/fpdf/tutorial/20k_c2.txt	(revision 5261)
@@ -0,0 +1,23 @@
+During the period in which these developments were occurring, I had returned from a scientific undertaking organized to explore the Nebraska badlands in the United States. In my capacity as Assistant Professor at the Paris Museum of Natural History, I had been attached to this expedition by the French government. After spending six months in Nebraska, I arrived in New York laden with valuable collections near the end of March. My departure for France was set for early May. In the meantime, then, I was busy classifying my mineralogical, botanical, and zoological treasures when that incident took place with the Scotia.
+I was perfectly abreast of this question, which was the big news of the day, and how could I not have been? I had read and reread every American and European newspaper without being any farther along. This mystery puzzled me. Finding it impossible to form any views, I drifted from one extreme to the other. Something was out there, that much was certain, and any doubting Thomas was invited to place his finger on the Scotia's wound.
+When I arrived in New York, the question was at the boiling point. The hypothesis of a drifting islet or an elusive reef, put forward by people not quite in their right minds, was completely eliminated. And indeed, unless this reef had an engine in its belly, how could it move about with such prodigious speed?
+Also discredited was the idea of a floating hull or some other enormous wreckage, and again because of this speed of movement.
+So only two possible solutions to the question were left, creating two very distinct groups of supporters: on one side, those favoring a monster of colossal strength; on the other, those favoring an "underwater boat" of tremendous motor power.
+Now then, although the latter hypothesis was completely admissible, it couldn't stand up to inquiries conducted in both the New World and the Old. That a private individual had such a mechanism at his disposal was less than probable. Where and when had he built it, and how could he have built it in secret?
+Only some government could own such an engine of destruction, and in these disaster-filled times, when men tax their ingenuity to build increasingly powerful aggressive weapons, it was possible that, unknown to the rest of the world, some nation could have been testing such a fearsome machine. The Chassepot rifle led to the torpedo, and the torpedo has led to this underwater battering ram, which in turn will lead to the world putting its foot down. At least I hope it will.
+But this hypothesis of a war machine collapsed in the face of formal denials from the various governments. Since the public interest was at stake and transoceanic travel was suffering, the sincerity of these governments could not be doubted. Besides, how could the assembly of this underwater boat have escaped public notice? Keeping a secret under such circumstances would be difficult enough for an individual, and certainly impossible for a nation whose every move is under constant surveillance by rival powers.
+So, after inquiries conducted in England, France, Russia, Prussia, Spain, Italy, America, and even Turkey, the hypothesis of an underwater Monitor was ultimately rejected.
+After I arrived in New York, several people did me the honor of consulting me on the phenomenon in question. In France I had published a two-volume work, in quarto, entitled The Mysteries of the Great Ocean Depths. Well received in scholarly circles, this book had established me as a specialist in this pretty obscure field of natural history. My views were in demand. As long as I could deny the reality of the business, I confined myself to a flat "no comment." But soon, pinned to the wall, I had to explain myself straight out. And in this vein, "the honorable Pierre Aronnax, Professor at the Paris Museum," was summoned by The New York Herald to formulate his views no matter what.
+I complied. Since I could no longer hold my tongue, I let it wag. I discussed the question in its every aspect, both political and scientific, and this is an excerpt from the well-padded article I published in the issue of April 30.
+
+"Therefore," I wrote, "after examining these different hypotheses one by one, we are forced, every other supposition having been refuted, to accept the existence of an extremely powerful marine animal.
+"The deepest parts of the ocean are totally unknown to us. No soundings have been able to reach them. What goes on in those distant depths? What creatures inhabit, or could inhabit, those regions twelve or fifteen miles beneath the surface of the water? What is the constitution of these animals? It's almost beyond conjecture.
+"However, the solution to this problem submitted to me can take the form of a choice between two alternatives.
+"Either we know every variety of creature populating our planet, or we do not.
+"If we do not know every one of them, if nature still keeps ichthyological secrets from us, nothing is more admissible than to accept the existence of fish or cetaceans of new species or even new genera, animals with a basically 'cast-iron' constitution that inhabit strata beyond the reach of our soundings, and which some development or other, an urge or a whim if you prefer, can bring to the upper level of the ocean for long intervals.
+"If, on the other hand, we do know every living species, we must look for the animal in question among those marine creatures already cataloged, and in this event I would be inclined to accept the existence of a giant narwhale.
+"The common narwhale, or sea unicorn, often reaches a length of sixty feet. Increase its dimensions fivefold or even tenfold, then give this cetacean a strength in proportion to its size while enlarging its offensive weapons, and you have the animal we're looking for. It would have the proportions determined by the officers of the Shannon, the instrument needed to perforate the Scotia, and the power to pierce a steamer's hull.
+"In essence, the narwhale is armed with a sort of ivory sword, or lance, as certain naturalists have expressed it. It's a king-sized tooth as hard as steel. Some of these teeth have been found buried in the bodies of baleen whales, which the narwhale attacks with invariable success. Others have been wrenched, not without difficulty, from the undersides of vessels that narwhales have pierced clean through, as a gimlet pierces a wine barrel. The museum at the Faculty of Medicine in Paris owns one of these tusks with a length of 2.25 meters and a width at its base of forty-eight centimeters!
+"All right then! Imagine this weapon to be ten times stronger and the animal ten times more powerful, launch it at a speed of twenty miles per hour, multiply its mass times its velocity, and you get just the collision we need to cause the specified catastrophe.
+"So, until information becomes more abundant, I plump for a sea unicorn of colossal dimensions, no longer armed with a mere lance but with an actual spur, like ironclad frigates or those warships called 'rams,' whose mass and motor power it would possess simultaneously.
+"This inexplicable phenomenon is thus explained away--unless it's something else entirely, which, despite everything that has been sighted, studied, explored and experienced, is still possible!"
Index: /lib/fpdf/tutorial/calligra.php
===================================================================
--- /lib/fpdf/tutorial/calligra.php	(revision 5261)
+++ /lib/fpdf/tutorial/calligra.php	(revision 5261)
@@ -0,0 +1,23 @@
+<?php
+$type = 'TrueType';
+$name = 'CalligrapherRegular';
+$desc = array('Ascent'=>899,'Descent'=>-234,'CapHeight'=>899,'Flags'=>32,'FontBBox'=>'[-173 -234 1328 899]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>800);
+$up = -200;
+$ut = 20;
+$cw = array(
+	chr(0)=>800,chr(1)=>800,chr(2)=>800,chr(3)=>800,chr(4)=>800,chr(5)=>800,chr(6)=>800,chr(7)=>800,chr(8)=>800,chr(9)=>800,chr(10)=>800,chr(11)=>800,chr(12)=>800,chr(13)=>800,chr(14)=>800,chr(15)=>800,chr(16)=>800,chr(17)=>800,chr(18)=>800,chr(19)=>800,chr(20)=>800,chr(21)=>800,
+	chr(22)=>800,chr(23)=>800,chr(24)=>800,chr(25)=>800,chr(26)=>800,chr(27)=>800,chr(28)=>800,chr(29)=>800,chr(30)=>800,chr(31)=>800,' '=>282,'!'=>324,'"'=>405,'#'=>584,'$'=>632,'%'=>980,'&'=>776,'\''=>259,'('=>299,')'=>299,'*'=>377,'+'=>600,
+	','=>259,'-'=>432,'.'=>254,'/'=>597,'0'=>529,'1'=>298,'2'=>451,'3'=>359,'4'=>525,'5'=>423,'6'=>464,'7'=>417,'8'=>457,'9'=>479,':'=>275,';'=>282,'<'=>600,'='=>600,'>'=>600,'?'=>501,'@'=>800,'A'=>743,
+	'B'=>636,'C'=>598,'D'=>712,'E'=>608,'F'=>562,'G'=>680,'H'=>756,'I'=>308,'J'=>314,'K'=>676,'L'=>552,'M'=>1041,'N'=>817,'O'=>729,'P'=>569,'Q'=>698,'R'=>674,'S'=>618,'T'=>673,'U'=>805,'V'=>753,'W'=>1238,
+	'X'=>716,'Y'=>754,'Z'=>599,'['=>315,'\\'=>463,']'=>315,'^'=>600,'_'=>547,'`'=>278,'a'=>581,'b'=>564,'c'=>440,'d'=>571,'e'=>450,'f'=>347,'g'=>628,'h'=>611,'i'=>283,'j'=>283,'k'=>560,'l'=>252,'m'=>976,
+	'n'=>595,'o'=>508,'p'=>549,'q'=>540,'r'=>395,'s'=>441,'t'=>307,'u'=>614,'v'=>556,'w'=>915,'x'=>559,'y'=>597,'z'=>452,'{'=>315,'|'=>222,'}'=>315,'~'=>600,chr(127)=>800,chr(128)=>800,chr(129)=>800,chr(130)=>0,chr(131)=>0,
+	chr(132)=>0,chr(133)=>780,chr(134)=>0,chr(135)=>0,chr(136)=>278,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>1064,chr(141)=>800,chr(142)=>0,chr(143)=>800,chr(144)=>800,chr(145)=>259,chr(146)=>259,chr(147)=>470,chr(148)=>470,chr(149)=>500,chr(150)=>300,chr(151)=>600,chr(152)=>278,chr(153)=>990,
+	chr(154)=>0,chr(155)=>0,chr(156)=>790,chr(157)=>800,chr(158)=>800,chr(159)=>754,chr(160)=>282,chr(161)=>324,chr(162)=>450,chr(163)=>640,chr(164)=>518,chr(165)=>603,chr(166)=>0,chr(167)=>519,chr(168)=>254,chr(169)=>800,chr(170)=>349,chr(171)=>0,chr(172)=>0,chr(173)=>432,chr(174)=>800,chr(175)=>278,
+	chr(176)=>0,chr(177)=>0,chr(178)=>0,chr(179)=>0,chr(180)=>278,chr(181)=>614,chr(182)=>0,chr(183)=>254,chr(184)=>278,chr(185)=>0,chr(186)=>305,chr(187)=>0,chr(188)=>0,chr(189)=>0,chr(190)=>0,chr(191)=>501,chr(192)=>743,chr(193)=>743,chr(194)=>743,chr(195)=>743,chr(196)=>743,chr(197)=>743,
+	chr(198)=>1060,chr(199)=>598,chr(200)=>608,chr(201)=>608,chr(202)=>608,chr(203)=>608,chr(204)=>308,chr(205)=>308,chr(206)=>308,chr(207)=>308,chr(208)=>0,chr(209)=>817,chr(210)=>729,chr(211)=>729,chr(212)=>729,chr(213)=>729,chr(214)=>729,chr(215)=>0,chr(216)=>729,chr(217)=>805,chr(218)=>805,chr(219)=>805,
+	chr(220)=>805,chr(221)=>0,chr(222)=>0,chr(223)=>688,chr(224)=>581,chr(225)=>581,chr(226)=>581,chr(227)=>581,chr(228)=>581,chr(229)=>581,chr(230)=>792,chr(231)=>440,chr(232)=>450,chr(233)=>450,chr(234)=>450,chr(235)=>450,chr(236)=>283,chr(237)=>283,chr(238)=>283,chr(239)=>283,chr(240)=>0,chr(241)=>595,
+	chr(242)=>508,chr(243)=>508,chr(244)=>508,chr(245)=>508,chr(246)=>508,chr(247)=>0,chr(248)=>508,chr(249)=>614,chr(250)=>614,chr(251)=>614,chr(252)=>614,chr(253)=>0,chr(254)=>0,chr(255)=>597);
+$enc = 'cp1252';
+$file = 'calligra.z';
+$originalsize = 40120;
+?>
Index: /lib/fpdf/tutorial/countries.txt
===================================================================
--- /lib/fpdf/tutorial/countries.txt	(revision 5261)
+++ /lib/fpdf/tutorial/countries.txt	(revision 5261)
@@ -0,0 +1,15 @@
+Austria;Vienna;83859;8075
+Belgium;Brussels;30518;10192
+Denmark;Copenhagen;43094;5295
+Finland;Helsinki;304529;5147
+France;Paris;543965;58728
+Germany;Berlin;357022;82057
+Greece;Athens;131625;10511
+Ireland;Dublin;70723;3694
+Italy;Roma;301316;57563
+Luxembourg;Luxembourg;2586;424
+Netherlands;Amsterdam;41526;15654
+Portugal;Lisbon;91906;9957
+Spain;Madrid;504790;39348
+Sweden;Stockholm;410934;8839
+United Kingdom;London;243820;58862
Index: /lib/fpdf/tutorial/index.htm
===================================================================
--- /lib/fpdf/tutorial/index.htm	(revision 5261)
+++ /lib/fpdf/tutorial/index.htm	(revision 5261)
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Tutorials</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Tutorials</h1>
+<ul style="list-style-type:none; margin-left:0; padding-left:0">
+<li><a href="tuto1.htm">Tutorial 1</a>: Minimal example</li>
+<li><a href="tuto2.htm">Tutorial 2</a>: Header, footer, page break and image</li>
+<li><a href="tuto3.htm">Tutorial 3</a>: Line breaks and colors</li>
+<li><a href="tuto4.htm">Tutorial 4</a>: Multi-columns</li>
+<li><a href="tuto5.htm">Tutorial 5</a>: Tables</li>
+<li><a href="tuto6.htm">Tutorial 6</a>: Links and flowing text</li>
+<li><a href="tuto7.htm">Tutorial 7</a>: Adding new fonts and encoding support</li>
+</UL>
+</body>
+</html>
Index: /lib/fpdf/tutorial/makefont.php
===================================================================
--- /lib/fpdf/tutorial/makefont.php	(revision 5261)
+++ /lib/fpdf/tutorial/makefont.php	(revision 5261)
@@ -0,0 +1,6 @@
+<?php
+// Generation of font definition file for tutorial 7
+require('../makefont/makefont.php');
+
+MakeFont('calligra.ttf','cp1252');
+?>
Index: /lib/fpdf/tutorial/tuto1.htm
===================================================================
--- /lib/fpdf/tutorial/tuto1.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto1.htm	(revision 5261)
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Minimal example</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Minimal example</h1>
+Let's start with the classic example:
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+</span>$pdf <span class="kw">= new </span>FPDF<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>16<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Hello World!'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto1.php' target='_blank' class='demo'>[Demo]</a></p>
+After including the library file, we create an FPDF object.
+The <a href='../doc/fpdf.htm'>FPDF()</a> constructor is used here with the default values: pages are in A4 portrait and
+the unit of measure is millimeter. It could have been specified explicitly with:
+<div class="source">
+<pre><code>$pdf <span class="kw">= new </span>FPDF<span class="kw">(</span><span class="str">'P'</span><span class="kw">,</span><span class="str">'mm'</span><span class="kw">,</span><span class="str">'A4'</span><span class="kw">);
+</span></code></pre>
+</div>
+It's possible to use landscape (<code>L</code>), other page sizes (such as <code>Letter</code> and
+<code>Legal</code>) and units (<code>pt</code>, <code>cm</code>, <code>in</code>).
+<br>
+<br>
+There's no page at the moment, so we have to add one with <a href='../doc/addpage.htm'>AddPage()</a>. The origin
+is at the upper-left corner and the current position is by default set at 1 cm from the
+borders; the margins can be changed with <a href='../doc/setmargins.htm'>SetMargins()</a>.
+<br>
+<br>
+Before we can print text, it's mandatory to select a font with <a href='../doc/setfont.htm'>SetFont()</a>, otherwise the
+document would be invalid. We choose Arial bold 16:
+<div class="source">
+<pre><code>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>16<span class="kw">);
+</span></code></pre>
+</div>
+We could have specified italics with I, underlined with U or a regular font with an empty string
+(or any combination). Note that the font size is given in points, not millimeters (or another user
+unit); it's the only exception. The other standard fonts are Times, Courier, Symbol and ZapfDingbats.
+<br>
+<br>
+We can now print a cell with <a href='../doc/cell.htm'>Cell()</a>. A cell is a rectangular area, possibly framed,
+which contains a line of text. It is output at the current position. We specify its dimensions,
+its text (centered or aligned), if borders should be drawn, and where the current position
+moves after it (to the right, below or to the beginning of the next line). To add a frame, we would do this:
+<div class="source">
+<pre><code>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Hello World !'</span><span class="kw">,</span>1<span class="kw">);
+</span></code></pre>
+</div>
+To add a new cell next to it with centered text and go to the next line, we would do:
+<div class="source">
+<pre><code>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>60<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Powered by FPDF.'</span><span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
+</span></code></pre>
+</div>
+Remark: the line break can also be done with <a href='../doc/ln.htm'>Ln()</a>. This method additionnaly allows to specify
+the height of the break.
+<br>
+<br>
+Finally, the document is closed and sent to the browser with <a href='../doc/output.htm'>Output()</a>. We could have saved
+it to a file by passing the desired file name.
+<br>
+<br>
+<strong>Caution:</strong> in case when the PDF is sent to the browser, nothing else must be output by the
+script, neither before nor after (no HTML, not even a space or a carriage return). If you send something
+before, you will get the error message: "Some data has already been output, can't send PDF file". If you
+send something after, the document might not display.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto1.php
===================================================================
--- /lib/fpdf/tutorial/tuto1.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto1.php	(revision 5261)
@@ -0,0 +1,9 @@
+<?php
+require('../fpdf.php');
+
+$pdf = new FPDF();
+$pdf->AddPage();
+$pdf->SetFont('Arial','B',16);
+$pdf->Cell(40,10,'Hello World!');
+$pdf->Output();
+?>
Index: /lib/fpdf/tutorial/tuto2.htm
===================================================================
--- /lib/fpdf/tutorial/tuto2.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto2.htm	(revision 5261)
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Header, footer, page break and image</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Header, footer, page break and image</h1>
+Here's a two page example with header, footer and logo:
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+class </span>PDF <span class="kw">extends </span>FPDF
+<span class="kw">{
+</span><span class="cmt">// Page header
+</span><span class="kw">function </span>Header<span class="kw">()
+{
+    </span><span class="cmt">// Logo
+    </span>$<span class="kw">this-&gt;</span>Image<span class="kw">(</span><span class="str">'logo.png'</span><span class="kw">,</span>10<span class="kw">,</span>6<span class="kw">,</span>30<span class="kw">);
+    </span><span class="cmt">// Arial bold 15
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>15<span class="kw">);
+    </span><span class="cmt">// Move to the right
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>80<span class="kw">);
+    </span><span class="cmt">// Title
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>30<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Title'</span><span class="kw">,</span>1<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
+    </span><span class="cmt">// Line break
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>20<span class="kw">);
+}
+
+</span><span class="cmt">// Page footer
+</span><span class="kw">function </span>Footer<span class="kw">()
+{
+    </span><span class="cmt">// Position at 1.5 cm from bottom
+    </span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(-</span>15<span class="kw">);
+    </span><span class="cmt">// Arial italic 8
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span>8<span class="kw">);
+    </span><span class="cmt">// Page number
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Page '</span><span class="kw">.</span>$<span class="kw">this-&gt;</span>PageNo<span class="kw">().</span><span class="str">'/{nb}'</span><span class="kw">,</span>0<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
+}
+}
+
+</span><span class="cmt">// Instanciation of inherited class
+</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>AliasNbPages<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Times'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
+for(</span>$i<span class="kw">=</span>1<span class="kw">;</span>$i<span class="kw">&lt;=</span>40<span class="kw">;</span>$i<span class="kw">++)
+    </span>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Printing line number '</span><span class="kw">.</span>$i<span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto2.php' target='_blank' class='demo'>[Demo]</a></p>
+This example makes use of the <a href='../doc/header.htm'>Header()</a> and <a href='../doc/footer.htm'>Footer()</a> methods to process page headers and
+footers. They are called automatically. They already exist in the FPDF class but do nothing,
+therefore we have to extend the class and override them.
+<br>
+<br>
+The logo is printed with the <a href='../doc/image.htm'>Image()</a> method by specifying its upper-left corner and
+its width. The height is calculated automatically to respect the image proportions.
+<br>
+<br>
+To print the page number, a null value is passed as the cell width. It means that the cell
+should extend up to the right margin of the page; this is handy to center text. The current page
+number is returned by the <a href='../doc/pageno.htm'>PageNo()</a> method; as for the total number of pages, it's obtained
+via the special value <code>{nb}</code> which is substituted when the document is finished
+(provided you first called <a href='../doc/aliasnbpages.htm'>AliasNbPages()</a>).
+<br>
+Note the use of the <a href='../doc/sety.htm'>SetY()</a> method which allows to set position at an absolute location in
+the page, starting from the top or the bottom.
+<br>
+<br>
+Another interesting feature is used here: the automatic page breaking. As soon as a cell would
+cross a limit in the page (at 2 centimeters from the bottom by default), a break is issued
+and the font restored. Although the header and footer select their own font (Arial), the body
+continues with Times. This mechanism of automatic restoration also applies to colors and line
+width. The limit which triggers page breaks can be set with <a href='../doc/setautopagebreak.htm'>SetAutoPageBreak()</a>.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto2.php
===================================================================
--- /lib/fpdf/tutorial/tuto2.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto2.php	(revision 5261)
@@ -0,0 +1,41 @@
+<?php
+require('../fpdf.php');
+
+class PDF extends FPDF
+{
+// Page header
+function Header()
+{
+	// Logo
+	$this->Image('logo.png',10,6,30);
+	// Arial bold 15
+	$this->SetFont('Arial','B',15);
+	// Move to the right
+	$this->Cell(80);
+	// Title
+	$this->Cell(30,10,'Title',1,0,'C');
+	// Line break
+	$this->Ln(20);
+}
+
+// Page footer
+function Footer()
+{
+	// Position at 1.5 cm from bottom
+	$this->SetY(-15);
+	// Arial italic 8
+	$this->SetFont('Arial','I',8);
+	// Page number
+	$this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
+}
+}
+
+// Instanciation of inherited class
+$pdf = new PDF();
+$pdf->AliasNbPages();
+$pdf->AddPage();
+$pdf->SetFont('Times','',12);
+for($i=1;$i<=40;$i++)
+	$pdf->Cell(0,10,'Printing line number '.$i,0,1);
+$pdf->Output();
+?>
Index: /lib/fpdf/tutorial/tuto3.htm
===================================================================
--- /lib/fpdf/tutorial/tuto3.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto3.htm	(revision 5261)
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Line breaks and colors</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Line breaks and colors</h1>
+Let's continue with an example which prints justified paragraphs. It also illustrates the use
+of colors.
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+class </span>PDF <span class="kw">extends </span>FPDF
+<span class="kw">{
+function </span>Header<span class="kw">()
+{
+    global </span>$title<span class="kw">;
+
+    </span><span class="cmt">// Arial bold 15
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>15<span class="kw">);
+    </span><span class="cmt">// Calculate width of title and position
+    </span>$w <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetStringWidth<span class="kw">(</span>$title<span class="kw">)+</span>6<span class="kw">;
+    </span>$<span class="kw">this-&gt;</span>SetX<span class="kw">((</span>210<span class="kw">-</span>$w<span class="kw">)/</span>2<span class="kw">);
+    </span><span class="cmt">// Colors of frame, background and text
+    </span>$<span class="kw">this-&gt;</span>SetDrawColor<span class="kw">(</span>0<span class="kw">,</span>80<span class="kw">,</span>180<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>230<span class="kw">,</span>230<span class="kw">,</span>0<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>220<span class="kw">,</span>50<span class="kw">,</span>50<span class="kw">);
+    </span><span class="cmt">// Thickness of frame (1 mm)
+    </span>$<span class="kw">this-&gt;</span>SetLineWidth<span class="kw">(</span>1<span class="kw">);
+    </span><span class="cmt">// Title
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">,</span>9<span class="kw">,</span>$title<span class="kw">,</span>1<span class="kw">,</span>1<span class="kw">,</span><span class="str">'C'</span><span class="kw">,</span>true<span class="kw">);
+    </span><span class="cmt">// Line break
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>10<span class="kw">);
+}
+
+function </span>Footer<span class="kw">()
+{
+    </span><span class="cmt">// Position at 1.5 cm from bottom
+    </span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(-</span>15<span class="kw">);
+    </span><span class="cmt">// Arial italic 8
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span>8<span class="kw">);
+    </span><span class="cmt">// Text color in gray
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>128<span class="kw">);
+    </span><span class="cmt">// Page number
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Page '</span><span class="kw">.</span>$<span class="kw">this-&gt;</span>PageNo<span class="kw">(),</span>0<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
+}
+
+function </span>ChapterTitle<span class="kw">(</span>$num<span class="kw">, </span>$label<span class="kw">)
+{
+    </span><span class="cmt">// Arial 12
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
+    </span><span class="cmt">// Background color
+    </span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>200<span class="kw">,</span>220<span class="kw">,</span>255<span class="kw">);
+    </span><span class="cmt">// Title
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>6<span class="kw">,</span><span class="str">"Chapter </span>$num<span class="str"> : </span>$label<span class="str">"</span><span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>true<span class="kw">);
+    </span><span class="cmt">// Line break
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>4<span class="kw">);
+}
+
+function </span>ChapterBody<span class="kw">(</span>$file<span class="kw">)
+{
+    </span><span class="cmt">// Read text file
+    </span>$txt <span class="kw">= </span>file_get_contents<span class="kw">(</span>$file<span class="kw">);
+    </span><span class="cmt">// Times 12
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Times'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
+    </span><span class="cmt">// Output justified text
+    </span>$<span class="kw">this-&gt;</span>MultiCell<span class="kw">(</span>0<span class="kw">,</span>5<span class="kw">,</span>$txt<span class="kw">);
+    </span><span class="cmt">// Line break
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    </span><span class="cmt">// Mention in italics
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>5<span class="kw">,</span><span class="str">'(end of excerpt)'</span><span class="kw">);
+}
+
+function </span>PrintChapter<span class="kw">(</span>$num<span class="kw">, </span>$title<span class="kw">, </span>$file<span class="kw">)
+{
+    </span>$<span class="kw">this-&gt;</span>AddPage<span class="kw">();
+    </span>$<span class="kw">this-&gt;</span>ChapterTitle<span class="kw">(</span>$num<span class="kw">,</span>$title<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>ChapterBody<span class="kw">(</span>$file<span class="kw">);
+}
+}
+
+</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
+</span>$title <span class="kw">= </span><span class="str">'20000 Leagues Under the Seas'</span><span class="kw">;
+</span>$pdf<span class="kw">-&gt;</span>SetTitle<span class="kw">(</span>$title<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetAuthor<span class="kw">(</span><span class="str">'Jules Verne'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>PrintChapter<span class="kw">(</span>1<span class="kw">,</span><span class="str">'A RUNAWAY REEF'</span><span class="kw">,</span><span class="str">'20k_c1.txt'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>PrintChapter<span class="kw">(</span>2<span class="kw">,</span><span class="str">'THE PROS AND CONS'</span><span class="kw">,</span><span class="str">'20k_c2.txt'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto3.php' target='_blank' class='demo'>[Demo]</a></p>
+The <a href='../doc/getstringwidth.htm'>GetStringWidth()</a> method allows to determine the length of a string in the current font,
+which is used here to calculate the position and the width of the frame surrounding the title.
+Then colors are set (via <a href='../doc/setdrawcolor.htm'>SetDrawColor()</a>, <a href='../doc/setfillcolor.htm'>SetFillColor()</a> and <a href='../doc/settextcolor.htm'>SetTextColor()</a>) and the
+thickness of the line is set to 1 mm (instead of 0.2 by default) with <a href='../doc/setlinewidth.htm'>SetLineWidth()</a>. Finally,
+we output the cell (the last parameter <code>true</code> indicates that the background must
+be filled).
+<br>
+<br>
+The method used to print the paragraphs is <a href='../doc/multicell.htm'>MultiCell()</a>. Each time a line reaches the
+right extremity of the cell or a carriage return character is met, a line break is issued
+and a new cell automatically created under the current one. Text is justified by default.
+<br>
+<br>
+Two document properties are defined: the title (<a href='../doc/settitle.htm'>SetTitle()</a>) and the author (<a href='../doc/setauthor.htm'>SetAuthor()</a>).
+There are several ways to view them in Adobe Reader. The first one is to open the file directly with
+the reader, go to the File menu and choose the Properties option. The second one, also available from
+the plug-in, is to right-click and select Document Properties. The third method is to type the Ctrl+D
+key combination.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto3.php
===================================================================
--- /lib/fpdf/tutorial/tuto3.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto3.php	(revision 5261)
@@ -0,0 +1,81 @@
+<?php
+require('../fpdf.php');
+
+class PDF extends FPDF
+{
+function Header()
+{
+	global $title;
+
+	// Arial bold 15
+	$this->SetFont('Arial','B',15);
+	// Calculate width of title and position
+	$w = $this->GetStringWidth($title)+6;
+	$this->SetX((210-$w)/2);
+	// Colors of frame, background and text
+	$this->SetDrawColor(0,80,180);
+	$this->SetFillColor(230,230,0);
+	$this->SetTextColor(220,50,50);
+	// Thickness of frame (1 mm)
+	$this->SetLineWidth(1);
+	// Title
+	$this->Cell($w,9,$title,1,1,'C',true);
+	// Line break
+	$this->Ln(10);
+}
+
+function Footer()
+{
+	// Position at 1.5 cm from bottom
+	$this->SetY(-15);
+	// Arial italic 8
+	$this->SetFont('Arial','I',8);
+	// Text color in gray
+	$this->SetTextColor(128);
+	// Page number
+	$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
+}
+
+function ChapterTitle($num, $label)
+{
+	// Arial 12
+	$this->SetFont('Arial','',12);
+	// Background color
+	$this->SetFillColor(200,220,255);
+	// Title
+	$this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
+	// Line break
+	$this->Ln(4);
+}
+
+function ChapterBody($file)
+{
+	// Read text file
+	$txt = file_get_contents($file);
+	// Times 12
+	$this->SetFont('Times','',12);
+	// Output justified text
+	$this->MultiCell(0,5,$txt);
+	// Line break
+	$this->Ln();
+	// Mention in italics
+	$this->SetFont('','I');
+	$this->Cell(0,5,'(end of excerpt)');
+}
+
+function PrintChapter($num, $title, $file)
+{
+	$this->AddPage();
+	$this->ChapterTitle($num,$title);
+	$this->ChapterBody($file);
+}
+}
+
+$pdf = new PDF();
+$title = '20000 Leagues Under the Seas';
+$pdf->SetTitle($title);
+$pdf->SetAuthor('Jules Verne');
+$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
+$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
+$pdf->Output();
+?>
Index: /lib/fpdf/tutorial/tuto4.htm
===================================================================
--- /lib/fpdf/tutorial/tuto4.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto4.htm	(revision 5261)
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Multi-columns</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Multi-columns</h1>
+This example is a variant of the previous one showing how to lay the text across multiple
+columns.
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+class </span>PDF <span class="kw">extends </span>FPDF
+<span class="kw">{
+</span><span class="cmt">// Current column
+</span><span class="kw">var </span>$col <span class="kw">= </span>0<span class="kw">;
+</span><span class="cmt">// Ordinate of column start
+</span><span class="kw">var </span>$y0<span class="kw">;
+
+function </span>Header<span class="kw">()
+{
+    </span><span class="cmt">// Page header
+    </span><span class="kw">global </span>$title<span class="kw">;
+
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>15<span class="kw">);
+    </span>$w <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetStringWidth<span class="kw">(</span>$title<span class="kw">)+</span>6<span class="kw">;
+    </span>$<span class="kw">this-&gt;</span>SetX<span class="kw">((</span>210<span class="kw">-</span>$w<span class="kw">)/</span>2<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetDrawColor<span class="kw">(</span>0<span class="kw">,</span>80<span class="kw">,</span>180<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>230<span class="kw">,</span>230<span class="kw">,</span>0<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>220<span class="kw">,</span>50<span class="kw">,</span>50<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetLineWidth<span class="kw">(</span>1<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">,</span>9<span class="kw">,</span>$title<span class="kw">,</span>1<span class="kw">,</span>1<span class="kw">,</span><span class="str">'C'</span><span class="kw">,</span>true<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>10<span class="kw">);
+    </span><span class="cmt">// Save ordinate
+    </span>$<span class="kw">this-&gt;</span>y0 <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetY<span class="kw">();
+}
+
+function </span>Footer<span class="kw">()
+{
+    </span><span class="cmt">// Page footer
+    </span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(-</span>15<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span>8<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>128<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Page '</span><span class="kw">.</span>$<span class="kw">this-&gt;</span>PageNo<span class="kw">(),</span>0<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
+}
+
+function </span>SetCol<span class="kw">(</span>$col<span class="kw">)
+{
+    </span><span class="cmt">// Set position at a given column
+    </span>$<span class="kw">this-&gt;</span>col <span class="kw">= </span>$col<span class="kw">;
+    </span>$x <span class="kw">= </span>10<span class="kw">+</span>$col<span class="kw">*</span>65<span class="kw">;
+    </span>$<span class="kw">this-&gt;</span>SetLeftMargin<span class="kw">(</span>$x<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetX<span class="kw">(</span>$x<span class="kw">);
+}
+
+function </span>AcceptPageBreak<span class="kw">()
+{
+    </span><span class="cmt">// Method accepting or not automatic page break
+    </span><span class="kw">if(</span>$<span class="kw">this-&gt;</span>col<span class="kw">&lt;</span>2<span class="kw">)
+    {
+        </span><span class="cmt">// Go to next column
+        </span>$<span class="kw">this-&gt;</span>SetCol<span class="kw">(</span>$<span class="kw">this-&gt;</span>col<span class="kw">+</span>1<span class="kw">);
+        </span><span class="cmt">// Set ordinate to top
+        </span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(</span>$<span class="kw">this-&gt;</span>y0<span class="kw">);
+        </span><span class="cmt">// Keep on page
+        </span><span class="kw">return </span>false<span class="kw">;
+    }
+    else
+    {
+        </span><span class="cmt">// Go back to first column
+        </span>$<span class="kw">this-&gt;</span>SetCol<span class="kw">(</span>0<span class="kw">);
+        </span><span class="cmt">// Page break
+        </span><span class="kw">return </span>true<span class="kw">;
+    }
+}
+
+function </span>ChapterTitle<span class="kw">(</span>$num<span class="kw">, </span>$label<span class="kw">)
+{
+    </span><span class="cmt">// Title
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>200<span class="kw">,</span>220<span class="kw">,</span>255<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>6<span class="kw">,</span><span class="str">"Chapter </span>$num<span class="str"> : </span>$label<span class="str">"</span><span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>true<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>4<span class="kw">);
+    </span><span class="cmt">// Save ordinate
+    </span>$<span class="kw">this-&gt;</span>y0 <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetY<span class="kw">();
+}
+
+function </span>ChapterBody<span class="kw">(</span>$file<span class="kw">)
+{
+    </span><span class="cmt">// Read text file
+    </span>$txt <span class="kw">= </span>file_get_contents<span class="kw">(</span>$file<span class="kw">);
+    </span><span class="cmt">// Font
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Times'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
+    </span><span class="cmt">// Output text in a 6 cm width column
+    </span>$<span class="kw">this-&gt;</span>MultiCell<span class="kw">(</span>60<span class="kw">,</span>5<span class="kw">,</span>$txt<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    </span><span class="cmt">// Mention
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>5<span class="kw">,</span><span class="str">'(end of excerpt)'</span><span class="kw">);
+    </span><span class="cmt">// Go back to first column
+    </span>$<span class="kw">this-&gt;</span>SetCol<span class="kw">(</span>0<span class="kw">);
+}
+
+function </span>PrintChapter<span class="kw">(</span>$num<span class="kw">, </span>$title<span class="kw">, </span>$file<span class="kw">)
+{
+    </span><span class="cmt">// Add chapter
+    </span>$<span class="kw">this-&gt;</span>AddPage<span class="kw">();
+    </span>$<span class="kw">this-&gt;</span>ChapterTitle<span class="kw">(</span>$num<span class="kw">,</span>$title<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>ChapterBody<span class="kw">(</span>$file<span class="kw">);
+}
+}
+
+</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
+</span>$title <span class="kw">= </span><span class="str">'20000 Leagues Under the Seas'</span><span class="kw">;
+</span>$pdf<span class="kw">-&gt;</span>SetTitle<span class="kw">(</span>$title<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetAuthor<span class="kw">(</span><span class="str">'Jules Verne'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>PrintChapter<span class="kw">(</span>1<span class="kw">,</span><span class="str">'A RUNAWAY REEF'</span><span class="kw">,</span><span class="str">'20k_c1.txt'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>PrintChapter<span class="kw">(</span>2<span class="kw">,</span><span class="str">'THE PROS AND CONS'</span><span class="kw">,</span><span class="str">'20k_c2.txt'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto4.php' target='_blank' class='demo'>[Demo]</a></p>
+The key method used is <a href='../doc/acceptpagebreak.htm'>AcceptPageBreak()</a>. It allows to accept or not an automatic page
+break. By refusing it and altering the margin and current position, the desired column layout
+is achieved.
+<br>
+For the rest, not many changes; two properties have been added to the class to save the current
+column number and the position where columns begin, and the MultiCell() call specifies a
+6 centimeter width.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto4.php
===================================================================
--- /lib/fpdf/tutorial/tuto4.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto4.php	(revision 5261)
@@ -0,0 +1,111 @@
+<?php
+require('../fpdf.php');
+
+class PDF extends FPDF
+{
+// Current column
+var $col = 0;
+// Ordinate of column start
+var $y0;
+
+function Header()
+{
+	// Page header
+	global $title;
+
+	$this->SetFont('Arial','B',15);
+	$w = $this->GetStringWidth($title)+6;
+	$this->SetX((210-$w)/2);
+	$this->SetDrawColor(0,80,180);
+	$this->SetFillColor(230,230,0);
+	$this->SetTextColor(220,50,50);
+	$this->SetLineWidth(1);
+	$this->Cell($w,9,$title,1,1,'C',true);
+	$this->Ln(10);
+	// Save ordinate
+	$this->y0 = $this->GetY();
+}
+
+function Footer()
+{
+	// Page footer
+	$this->SetY(-15);
+	$this->SetFont('Arial','I',8);
+	$this->SetTextColor(128);
+	$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
+}
+
+function SetCol($col)
+{
+	// Set position at a given column
+	$this->col = $col;
+	$x = 10+$col*65;
+	$this->SetLeftMargin($x);
+	$this->SetX($x);
+}
+
+function AcceptPageBreak()
+{
+	// Method accepting or not automatic page break
+	if($this->col<2)
+	{
+		// Go to next column
+		$this->SetCol($this->col+1);
+		// Set ordinate to top
+		$this->SetY($this->y0);
+		// Keep on page
+		return false;
+	}
+	else
+	{
+		// Go back to first column
+		$this->SetCol(0);
+		// Page break
+		return true;
+	}
+}
+
+function ChapterTitle($num, $label)
+{
+	// Title
+	$this->SetFont('Arial','',12);
+	$this->SetFillColor(200,220,255);
+	$this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
+	$this->Ln(4);
+	// Save ordinate
+	$this->y0 = $this->GetY();
+}
+
+function ChapterBody($file)
+{
+	// Read text file
+	$txt = file_get_contents($file);
+	// Font
+	$this->SetFont('Times','',12);
+	// Output text in a 6 cm width column
+	$this->MultiCell(60,5,$txt);
+	$this->Ln();
+	// Mention
+	$this->SetFont('','I');
+	$this->Cell(0,5,'(end of excerpt)');
+	// Go back to first column
+	$this->SetCol(0);
+}
+
+function PrintChapter($num, $title, $file)
+{
+	// Add chapter
+	$this->AddPage();
+	$this->ChapterTitle($num,$title);
+	$this->ChapterBody($file);
+}
+}
+
+$pdf = new PDF();
+$title = '20000 Leagues Under the Seas';
+$pdf->SetTitle($title);
+$pdf->SetAuthor('Jules Verne');
+$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
+$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
+$pdf->Output();
+?>
Index: /lib/fpdf/tutorial/tuto5.htm
===================================================================
--- /lib/fpdf/tutorial/tuto5.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto5.htm	(revision 5261)
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Tables</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Tables</h1>
+This tutorial shows different ways to make tables.
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+class </span>PDF <span class="kw">extends </span>FPDF
+<span class="kw">{
+</span><span class="cmt">// Load data
+</span><span class="kw">function </span>LoadData<span class="kw">(</span>$file<span class="kw">)
+{
+    </span><span class="cmt">// Read file lines
+    </span>$lines <span class="kw">= </span>file<span class="kw">(</span>$file<span class="kw">);
+    </span>$data <span class="kw">= array();
+    foreach(</span>$lines <span class="kw">as </span>$line<span class="kw">)
+        </span>$data<span class="kw">[] = </span>explode<span class="kw">(</span><span class="str">';'</span><span class="kw">,</span>trim<span class="kw">(</span>$line<span class="kw">));
+    return </span>$data<span class="kw">;
+}
+
+</span><span class="cmt">// Simple table
+</span><span class="kw">function </span>BasicTable<span class="kw">(</span>$header<span class="kw">, </span>$data<span class="kw">)
+{
+    </span><span class="cmt">// Header
+    </span><span class="kw">foreach(</span>$header <span class="kw">as </span>$col<span class="kw">)
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>7<span class="kw">,</span>$col<span class="kw">,</span>1<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    </span><span class="cmt">// Data
+    </span><span class="kw">foreach(</span>$data <span class="kw">as </span>$row<span class="kw">)
+    {
+        foreach(</span>$row <span class="kw">as </span>$col<span class="kw">)
+            </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>6<span class="kw">,</span>$col<span class="kw">,</span>1<span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    }
+}
+
+</span><span class="cmt">// Better table
+</span><span class="kw">function </span>ImprovedTable<span class="kw">(</span>$header<span class="kw">, </span>$data<span class="kw">)
+{
+    </span><span class="cmt">// Column widths
+    </span>$w <span class="kw">= array(</span>40<span class="kw">, </span>35<span class="kw">, </span>40<span class="kw">, </span>45<span class="kw">);
+    </span><span class="cmt">// Header
+    </span><span class="kw">for(</span>$i<span class="kw">=</span>0<span class="kw">;</span>$i<span class="kw">&lt;</span>count<span class="kw">(</span>$header<span class="kw">);</span>$i<span class="kw">++)
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>$i<span class="kw">],</span>7<span class="kw">,</span>$header<span class="kw">[</span>$i<span class="kw">],</span>1<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    </span><span class="cmt">// Data
+    </span><span class="kw">foreach(</span>$data <span class="kw">as </span>$row<span class="kw">)
+    {
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>0<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>0<span class="kw">],</span><span class="str">'LR'</span><span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>1<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>1<span class="kw">],</span><span class="str">'LR'</span><span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>2<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>2<span class="kw">]),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>3<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>3<span class="kw">]),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    }
+    </span><span class="cmt">// Closing line
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>array_sum<span class="kw">(</span>$w<span class="kw">),</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'T'</span><span class="kw">);
+}
+
+</span><span class="cmt">// Colored table
+</span><span class="kw">function </span>FancyTable<span class="kw">(</span>$header<span class="kw">, </span>$data<span class="kw">)
+{
+    </span><span class="cmt">// Colors, line width and bold font
+    </span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>255<span class="kw">,</span>0<span class="kw">,</span>0<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>255<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetDrawColor<span class="kw">(</span>128<span class="kw">,</span>0<span class="kw">,</span>0<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetLineWidth<span class="kw">(</span>.3<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">);
+    </span><span class="cmt">// Header
+    </span>$w <span class="kw">= array(</span>40<span class="kw">, </span>35<span class="kw">, </span>40<span class="kw">, </span>45<span class="kw">);
+    for(</span>$i<span class="kw">=</span>0<span class="kw">;</span>$i<span class="kw">&lt;</span>count<span class="kw">(</span>$header<span class="kw">);</span>$i<span class="kw">++)
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>$i<span class="kw">],</span>7<span class="kw">,</span>$header<span class="kw">[</span>$i<span class="kw">],</span>1<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">,</span>true<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+    </span><span class="cmt">// Color and font restoration
+    </span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>224<span class="kw">,</span>235<span class="kw">,</span>255<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">);
+    </span><span class="cmt">// Data
+    </span>$fill <span class="kw">= </span>false<span class="kw">;
+    foreach(</span>$data <span class="kw">as </span>$row<span class="kw">)
+    {
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>0<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>0<span class="kw">],</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>$fill<span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>1<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>1<span class="kw">],</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>$fill<span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>2<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>2<span class="kw">]),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">,</span>$fill<span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>3<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>3<span class="kw">]),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">,</span>$fill<span class="kw">);
+        </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
+        </span>$fill <span class="kw">= !</span>$fill<span class="kw">;
+    }
+    </span><span class="cmt">// Closing line
+    </span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>array_sum<span class="kw">(</span>$w<span class="kw">),</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'T'</span><span class="kw">);
+}
+}
+
+</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
+</span><span class="cmt">// Column headings
+</span>$header <span class="kw">= array(</span><span class="str">'Country'</span><span class="kw">, </span><span class="str">'Capital'</span><span class="kw">, </span><span class="str">'Area (sq km)'</span><span class="kw">, </span><span class="str">'Pop. (thousands)'</span><span class="kw">);
+</span><span class="cmt">// Data loading
+</span>$data <span class="kw">= </span>$pdf<span class="kw">-&gt;</span>LoadData<span class="kw">(</span><span class="str">'countries.txt'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>14<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>BasicTable<span class="kw">(</span>$header<span class="kw">,</span>$data<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>ImprovedTable<span class="kw">(</span>$header<span class="kw">,</span>$data<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>FancyTable<span class="kw">(</span>$header<span class="kw">,</span>$data<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto5.php' target='_blank' class='demo'>[Demo]</a></p>
+A table being just a collection of cells, it's natural to build one from them. The first
+example is achieved in the most basic way possible: simple framed cells, all of the same size
+and left aligned. The result is rudimentary but very quick to obtain.
+<br>
+<br>
+The second table brings some improvements: each column has its own width, headings are centered,
+and numbers right aligned. Moreover, horizontal lines have been removed. This is done by means
+of the <code>border</code> parameter of the <a href='../doc/cell.htm'>Cell()</a> method, which specifies which sides of the
+cell must be drawn. Here we want the left (<code>L</code>) and right (<code>R</code>) ones. It remains
+the problem of the horizontal line to finish the table. There are two possibilities: either
+check for the last line in the loop, in which case we use <code>LRB</code> for the <code>border</code>
+parameter; or, as done here, add the line once the loop is over.
+<br>
+<br>
+The third table is similar to the second one but uses colors. Fill, text and line colors are
+simply specified. Alternate coloring for rows is obtained by using alternatively transparent
+and filled cells.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto5.php
===================================================================
--- /lib/fpdf/tutorial/tuto5.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto5.php	(revision 5261)
@@ -0,0 +1,102 @@
+<?php
+require('../fpdf.php');
+
+class PDF extends FPDF
+{
+// Load data
+function LoadData($file)
+{
+	// Read file lines
+	$lines = file($file);
+	$data = array();
+	foreach($lines as $line)
+		$data[] = explode(';',trim($line));
+	return $data;
+}
+
+// Simple table
+function BasicTable($header, $data)
+{
+	// Header
+	foreach($header as $col)
+		$this->Cell(40,7,$col,1);
+	$this->Ln();
+	// Data
+	foreach($data as $row)
+	{
+		foreach($row as $col)
+			$this->Cell(40,6,$col,1);
+		$this->Ln();
+	}
+}
+
+// Better table
+function ImprovedTable($header, $data)
+{
+	// Column widths
+	$w = array(40, 35, 40, 45);
+	// Header
+	for($i=0;$i<count($header);$i++)
+		$this->Cell($w[$i],7,$header[$i],1,0,'C');
+	$this->Ln();
+	// Data
+	foreach($data as $row)
+	{
+		$this->Cell($w[0],6,$row[0],'LR');
+		$this->Cell($w[1],6,$row[1],'LR');
+		$this->Cell($w[2],6,number_format($row[2]),'LR',0,'R');
+		$this->Cell($w[3],6,number_format($row[3]),'LR',0,'R');
+		$this->Ln();
+	}
+	// Closing line
+	$this->Cell(array_sum($w),0,'','T');
+}
+
+// Colored table
+function FancyTable($header, $data)
+{
+	// Colors, line width and bold font
+	$this->SetFillColor(255,0,0);
+	$this->SetTextColor(255);
+	$this->SetDrawColor(128,0,0);
+	$this->SetLineWidth(.3);
+	$this->SetFont('','B');
+	// Header
+	$w = array(40, 35, 40, 45);
+	for($i=0;$i<count($header);$i++)
+		$this->Cell($w[$i],7,$header[$i],1,0,'C',true);
+	$this->Ln();
+	// Color and font restoration
+	$this->SetFillColor(224,235,255);
+	$this->SetTextColor(0);
+	$this->SetFont('');
+	// Data
+	$fill = false;
+	foreach($data as $row)
+	{
+		$this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
+		$this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
+		$this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill);
+		$this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill);
+		$this->Ln();
+		$fill = !$fill;
+	}
+	// Closing line
+	$this->Cell(array_sum($w),0,'','T');
+}
+}
+
+$pdf = new PDF();
+// Column headings
+$header = array('Country', 'Capital', 'Area (sq km)', 'Pop. (thousands)');
+// Data loading
+$data = $pdf->LoadData('countries.txt');
+$pdf->SetFont('Arial','',14);
+$pdf->AddPage();
+$pdf->BasicTable($header,$data);
+$pdf->AddPage();
+$pdf->ImprovedTable($header,$data);
+$pdf->AddPage();
+$pdf->FancyTable($header,$data);
+$pdf->Output();
+?>
Index: /lib/fpdf/tutorial/tuto6.htm
===================================================================
--- /lib/fpdf/tutorial/tuto6.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto6.htm	(revision 5261)
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Links and flowing text</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+</head>
+<body>
+<h1>Links and flowing text</h1>
+This tutorial explains how to insert links (internal and external) and shows a new text writing
+mode. It also contains a basic HTML parser.
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+class </span>PDF <span class="kw">extends </span>FPDF
+<span class="kw">{
+var </span>$B<span class="kw">;
+var </span>$I<span class="kw">;
+var </span>$U<span class="kw">;
+var </span>$HREF<span class="kw">;
+
+function </span>PDF<span class="kw">(</span>$orientation<span class="kw">=</span><span class="str">'P'</span><span class="kw">, </span>$unit<span class="kw">=</span><span class="str">'mm'</span><span class="kw">, </span>$size<span class="kw">=</span><span class="str">'A4'</span><span class="kw">)
+{
+    </span><span class="cmt">// Call parent constructor
+    </span>$<span class="kw">this-&gt;</span>FPDF<span class="kw">(</span>$orientation<span class="kw">,</span>$unit<span class="kw">,</span>$size<span class="kw">);
+    </span><span class="cmt">// Initialization
+    </span>$<span class="kw">this-&gt;</span>B <span class="kw">= </span>0<span class="kw">;
+    </span>$<span class="kw">this-&gt;</span>I <span class="kw">= </span>0<span class="kw">;
+    </span>$<span class="kw">this-&gt;</span>U <span class="kw">= </span>0<span class="kw">;
+    </span>$<span class="kw">this-&gt;</span>HREF <span class="kw">= </span><span class="str">''</span><span class="kw">;
+}
+
+function </span>WriteHTML<span class="kw">(</span>$html<span class="kw">)
+{
+    </span><span class="cmt">// HTML parser
+    </span>$html <span class="kw">= </span>str_replace<span class="kw">(</span><span class="str">"\n"</span><span class="kw">,</span><span class="str">' '</span><span class="kw">,</span>$html<span class="kw">);
+    </span>$a <span class="kw">= </span>preg_split<span class="kw">(</span><span class="str">'/&lt;(.*)&gt;/U'</span><span class="kw">,</span>$html<span class="kw">,-</span>1<span class="kw">,</span>PREG_SPLIT_DELIM_CAPTURE<span class="kw">);
+    foreach(</span>$a <span class="kw">as </span>$i<span class="kw">=&gt;</span>$e<span class="kw">)
+    {
+        if(</span>$i<span class="kw">%</span>2<span class="kw">==</span>0<span class="kw">)
+        {
+            </span><span class="cmt">// Text
+            </span><span class="kw">if(</span>$<span class="kw">this-&gt;</span>HREF<span class="kw">)
+                </span>$<span class="kw">this-&gt;</span>PutLink<span class="kw">(</span>$<span class="kw">this-&gt;</span>HREF<span class="kw">,</span>$e<span class="kw">);
+            else
+                </span>$<span class="kw">this-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span>$e<span class="kw">);
+        }
+        else
+        {
+            </span><span class="cmt">// Tag
+            </span><span class="kw">if(</span>$e<span class="kw">[</span>0<span class="kw">]==</span><span class="str">'/'</span><span class="kw">)
+                </span>$<span class="kw">this-&gt;</span>CloseTag<span class="kw">(</span>strtoupper<span class="kw">(</span>substr<span class="kw">(</span>$e<span class="kw">,</span>1<span class="kw">)));
+            else
+            {
+                </span><span class="cmt">// Extract attributes
+                </span>$a2 <span class="kw">= </span>explode<span class="kw">(</span><span class="str">' '</span><span class="kw">,</span>$e<span class="kw">);
+                </span>$tag <span class="kw">= </span>strtoupper<span class="kw">(</span>array_shift<span class="kw">(</span>$a2<span class="kw">));
+                </span>$attr <span class="kw">= array();
+                foreach(</span>$a2 <span class="kw">as </span>$v<span class="kw">)
+                {
+                    if(</span>preg_match<span class="kw">(</span><span class="str">'/([^=]*)=["\']?([^"\']*)/'</span><span class="kw">,</span>$v<span class="kw">,</span>$a3<span class="kw">))
+                        </span>$attr<span class="kw">[</span>strtoupper<span class="kw">(</span>$a3<span class="kw">[</span>1<span class="kw">])] = </span>$a3<span class="kw">[</span>2<span class="kw">];
+                }
+                </span>$<span class="kw">this-&gt;</span>OpenTag<span class="kw">(</span>$tag<span class="kw">,</span>$attr<span class="kw">);
+            }
+        }
+    }
+}
+
+function </span>OpenTag<span class="kw">(</span>$tag<span class="kw">, </span>$attr<span class="kw">)
+{
+    </span><span class="cmt">// Opening tag
+    </span><span class="kw">if(</span>$tag<span class="kw">==</span><span class="str">'B' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'I' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'U'</span><span class="kw">)
+        </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>true<span class="kw">);
+    if(</span>$tag<span class="kw">==</span><span class="str">'A'</span><span class="kw">)
+        </span>$<span class="kw">this-&gt;</span>HREF <span class="kw">= </span>$attr<span class="kw">[</span><span class="str">'HREF'</span><span class="kw">];
+    if(</span>$tag<span class="kw">==</span><span class="str">'BR'</span><span class="kw">)
+        </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>5<span class="kw">);
+}
+
+function </span>CloseTag<span class="kw">(</span>$tag<span class="kw">)
+{
+    </span><span class="cmt">// Closing tag
+    </span><span class="kw">if(</span>$tag<span class="kw">==</span><span class="str">'B' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'I' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'U'</span><span class="kw">)
+        </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>false<span class="kw">);
+    if(</span>$tag<span class="kw">==</span><span class="str">'A'</span><span class="kw">)
+        </span>$<span class="kw">this-&gt;</span>HREF <span class="kw">= </span><span class="str">''</span><span class="kw">;
+}
+
+function </span>SetStyle<span class="kw">(</span>$tag<span class="kw">, </span>$enable<span class="kw">)
+{
+    </span><span class="cmt">// Modify style and select corresponding font
+    </span>$<span class="kw">this-&gt;</span>$tag <span class="kw">+= (</span>$enable <span class="kw">? </span>1 <span class="kw">: -</span>1<span class="kw">);
+    </span>$style <span class="kw">= </span><span class="str">''</span><span class="kw">;
+    foreach(array(</span><span class="str">'B'</span><span class="kw">, </span><span class="str">'I'</span><span class="kw">, </span><span class="str">'U'</span><span class="kw">) as </span>$s<span class="kw">)
+    {
+        if(</span>$<span class="kw">this-&gt;</span>$s<span class="kw">&gt;</span>0<span class="kw">)
+            </span>$style <span class="kw">.= </span>$s<span class="kw">;
+    }
+    </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span>$style<span class="kw">);
+}
+
+function </span>PutLink<span class="kw">(</span>$URL<span class="kw">, </span>$txt<span class="kw">)
+{
+    </span><span class="cmt">// Put a hyperlink
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">,</span>0<span class="kw">,</span>255<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span><span class="str">'U'</span><span class="kw">,</span>true<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span>$txt<span class="kw">,</span>$URL<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span><span class="str">'U'</span><span class="kw">,</span>false<span class="kw">);
+    </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">);
+}
+}
+
+</span>$html <span class="kw">= </span><span class="str">'You can now easily print text mixing different styles: &lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;italic&lt;/i&gt;,
+&lt;u&gt;underlined&lt;/u&gt;, or &lt;b&gt;&lt;i&gt;&lt;u&gt;all at once&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;!&lt;br&gt;&lt;br&gt;You can also insert links on
+text, such as &lt;a href="http://www.fpdf.org"&gt;www.fpdf.org&lt;/a&gt;, or on an image: click on the logo.'</span><span class="kw">;
+
+</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
+</span><span class="cmt">// First page
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>20<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span><span class="str">"To find out what's new in this tutorial, click "</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'U'</span><span class="kw">);
+</span>$link <span class="kw">= </span>$pdf<span class="kw">-&gt;</span>AddLink<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span><span class="str">'here'</span><span class="kw">,</span>$link<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">);
+</span><span class="cmt">// Second page
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>SetLink<span class="kw">(</span>$link<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Image<span class="kw">(</span><span class="str">'logo.png'</span><span class="kw">,</span>10<span class="kw">,</span>12<span class="kw">,</span>30<span class="kw">,</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'http://www.fpdf.org'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetLeftMargin<span class="kw">(</span>45<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>SetFontSize<span class="kw">(</span>14<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>WriteHTML<span class="kw">(</span>$html<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto6.php' target='_blank' class='demo'>[Demo]</a></p>
+The new method to print text is <a href='../doc/write.htm'>Write()</a>. It's very close to <a href='../doc/multicell.htm'>MultiCell()</a>; the differences are:
+<ul>
+<li>The end of line is at the right margin and the next line begins at the left one</li>
+<li>The current position moves at the end of the text</li>
+</ul>
+So it allows to write a chunk of text, alter the font style, then continue from the exact
+place we left it. On the other hand, you cannot justify it.
+<br>
+<br>
+The method is used on the first page to put a link pointing to the second one. The beginning of
+the sentence is written in regular style, then we switch to underline and finish it. The link
+is created with <a href='../doc/addlink.htm'>AddLink()</a>, which returns a link identifier. The identifier is
+passed as third parameter of Write(). Once the second page is created, we use <a href='../doc/setlink.htm'>SetLink()</a> to
+make the link point to the beginning of the current page.
+<br>
+<br>
+Then we put an image with an external link on it. An external link is just a URL. It's passed as
+last parameter of <a href='../doc/image.htm'>Image()</a>.
+<br>
+<br>
+Finally, the left margin is moved after the image with <a href='../doc/setleftmargin.htm'>SetLeftMargin()</a> and some text in
+HTML format is output. A very simple HTML parser is used for this, based on regular expressions.
+Recognized tags are &lt;b&gt;, &lt;i&gt;, &lt;u&gt;, &lt;a&gt; and &lt;br&gt;; the others are
+ignored. The parser also makes use of the Write() method. An external link is put the same way as
+an internal one (third parameter of Write()). Note that <a href='../doc/cell.htm'>Cell()</a> also allows to put links.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto6.php
===================================================================
--- /lib/fpdf/tutorial/tuto6.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto6.php	(revision 5261)
@@ -0,0 +1,124 @@
+<?php
+require('../fpdf.php');
+
+class PDF extends FPDF
+{
+var $B;
+var $I;
+var $U;
+var $HREF;
+
+function PDF($orientation='P', $unit='mm', $size='A4')
+{
+	// Call parent constructor
+	$this->FPDF($orientation,$unit,$size);
+	// Initialization
+	$this->B = 0;
+	$this->I = 0;
+	$this->U = 0;
+	$this->HREF = '';
+}
+
+function WriteHTML($html)
+{
+	// HTML parser
+	$html = str_replace("\n",' ',$html);
+	$a = preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
+	foreach($a as $i=>$e)
+	{
+		if($i%2==0)
+		{
+			// Text
+			if($this->HREF)
+				$this->PutLink($this->HREF,$e);
+			else
+				$this->Write(5,$e);
+		}
+		else
+		{
+			// Tag
+			if($e[0]=='/')
+				$this->CloseTag(strtoupper(substr($e,1)));
+			else
+			{
+				// Extract attributes
+				$a2 = explode(' ',$e);
+				$tag = strtoupper(array_shift($a2));
+				$attr = array();
+				foreach($a2 as $v)
+				{
+					if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
+						$attr[strtoupper($a3[1])] = $a3[2];
+				}
+				$this->OpenTag($tag,$attr);
+			}
+		}
+	}
+}
+
+function OpenTag($tag, $attr)
+{
+	// Opening tag
+	if($tag=='B' || $tag=='I' || $tag=='U')
+		$this->SetStyle($tag,true);
+	if($tag=='A')
+		$this->HREF = $attr['HREF'];
+	if($tag=='BR')
+		$this->Ln(5);
+}
+
+function CloseTag($tag)
+{
+	// Closing tag
+	if($tag=='B' || $tag=='I' || $tag=='U')
+		$this->SetStyle($tag,false);
+	if($tag=='A')
+		$this->HREF = '';
+}
+
+function SetStyle($tag, $enable)
+{
+	// Modify style and select corresponding font
+	$this->$tag += ($enable ? 1 : -1);
+	$style = '';
+	foreach(array('B', 'I', 'U') as $s)
+	{
+		if($this->$s>0)
+			$style .= $s;
+	}
+	$this->SetFont('',$style);
+}
+
+function PutLink($URL, $txt)
+{
+	// Put a hyperlink
+	$this->SetTextColor(0,0,255);
+	$this->SetStyle('U',true);
+	$this->Write(5,$txt,$URL);
+	$this->SetStyle('U',false);
+	$this->SetTextColor(0);
+}
+}
+
+$html = 'You can now easily print text mixing different styles: <b>bold</b>, <i>italic</i>,
+<u>underlined</u>, or <b><i><u>all at once</u></i></b>!<br><br>You can also insert links on
+text, such as <a href="http://www.fpdf.org">www.fpdf.org</a>, or on an image: click on the logo.';
+
+$pdf = new PDF();
+// First page
+$pdf->AddPage();
+$pdf->SetFont('Arial','',20);
+$pdf->Write(5,"To find out what's new in this tutorial, click ");
+$pdf->SetFont('','U');
+$link = $pdf->AddLink();
+$pdf->Write(5,'here',$link);
+$pdf->SetFont('');
+// Second page
+$pdf->AddPage();
+$pdf->SetLink($link);
+$pdf->Image('logo.png',10,12,30,0,'','http://www.fpdf.org');
+$pdf->SetLeftMargin(45);
+$pdf->SetFontSize(14);
+$pdf->WriteHTML($html);
+$pdf->Output();
+?>
Index: /lib/fpdf/tutorial/tuto7.htm
===================================================================
--- /lib/fpdf/tutorial/tuto7.htm	(revision 5261)
+++ /lib/fpdf/tutorial/tuto7.htm	(revision 5261)
@@ -0,0 +1,241 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Adding new fonts and encoding support</title>
+<link type="text/css" rel="stylesheet" href="../fpdf.css">
+<style type="text/css">
+table {border-collapse:collapse; border-style:solid; border-width:2px; border-color:#A0A0A0 #000000 #000000 #A0A0A0}
+table {margin:1.4em 0 1.4em 1em}
+th {background-color:#E0EBFF; color:#900000; text-align:left}
+th, td {border:1px solid #808080; padding:2px 10px}
+tr.alt0 {background-color:#FFFFEE}
+tr.alt1 {background-color:#FFFFE0}
+</style>
+</head>
+<body>
+<h1>Adding new fonts and encoding support</h1>
+This tutorial explains how to use TrueType, OpenType and Type1 fonts so that you are not limited to
+the standard fonts any more. The other benefit is that you can choose the font encoding, which allows
+you to use other languages than the Western ones (the standard fonts having too few available characters).
+<br>
+<br>
+Remark: for OpenType, only the format based on TrueType is supported (not the one based on Type1).
+<br>
+<br>
+There are two ways to use a new font: embedding it in the PDF or not. When a font is not
+embedded, it is searched in the system. The advantage is that the PDF file is lighter; on the other
+hand, if it's not available, a substitution font is used. So it's preferable to ensure that the
+needed font is installed on the client systems. If the file is to be viewed by a large audience,
+it's highly recommended to embed.
+<br>
+<br>
+Adding a new font requires two steps:
+<ul>
+<li>Generation of the font definition file</li>
+<li>Declaration of the font in the script</li>
+</ul>
+For Type1, you need the corresponding AFM file. It's usually provided with the font.
+
+<h2>Generation of the font definition file</h2>
+The first step consists in generating a PHP file containing all the information needed by FPDF;
+in addition, the font file is compressed. To do this, a helper script is provided in the makefont
+directory of the package: makefont.php. It contains the following function:
+<br>
+<br>
+<code>MakeFont(<b>string</b> fontfile, [, <b>string</b> enc [, <b>boolean</b> embed]])</code>
+<dl class="param" style="margin-bottom:2em">
+<dt><code>fontfile</code></dt>
+<dd>
+<p>Path to the .ttf, .otf or .pfb file.</p>
+</dd>
+<dt><code>enc</code></dt>
+<dd>
+<p>Name of the encoding to use. Default value: <code>cp1252</code>.</p>
+</dd>
+<dt><code>embed</code></dt>
+<dd>
+<p>Whether to embed the font or not. Default value: <code>true</code>.</p>
+</dd>
+</dl>
+The first parameter is the name of the font file. The extension must be either .ttf, .otf or .pfb and
+determines the font type. If your Type1 font is in ASCII format (.pfa), you can convert it to binary
+(.pfb) with the help of <a href="http://www.lcdf.org/~eddietwo/type/#t1utils" target="_blank">t1utils</a>.
+<br>
+<br>
+For Type1 fonts, the corresponding .afm file must be present in the same directory.
+<br>
+<br>
+The encoding defines the association between a code (from 0 to 255) and a character. The first 128 are
+always the same and correspond to ASCII; the following are variable. Encodings are stored in .map
+files. The available ones are:
+<ul>
+<li>cp1250 (Central Europe)</li>
+<li>cp1251 (Cyrillic)</li>
+<li>cp1252 (Western Europe)</li>
+<li>cp1253 (Greek)</li>
+<li>cp1254 (Turkish)</li>
+<li>cp1255 (Hebrew)</li>
+<li>cp1257 (Baltic)</li>
+<li>cp1258 (Vietnamese)</li>
+<li>cp874 (Thai)</li>
+<li>ISO-8859-1 (Western Europe)</li>
+<li>ISO-8859-2 (Central Europe)</li>
+<li>ISO-8859-4 (Baltic)</li>
+<li>ISO-8859-5 (Cyrillic)</li>
+<li>ISO-8859-7 (Greek)</li>
+<li>ISO-8859-9 (Turkish)</li>
+<li>ISO-8859-11 (Thai)</li>
+<li>ISO-8859-15 (Western Europe)</li>
+<li>ISO-8859-16 (Central Europe)</li>
+<li>KOI8-R (Russian)</li>
+<li>KOI8-U (Ukrainian)</li>
+</ul>
+Of course, the font must contain the characters corresponding to the chosen encoding.
+<br>
+<br>
+Remark: the standard fonts use cp1252.
+<br>
+<br>
+After you have called the function (create a new file for this and include makefont.php), a .php file
+is created, with the same name as the font file. You may rename it if you wish. If the case of embedding,
+the font file is compressed and gives a second file with .z as extension (except if the compression
+function is not available, it requires Zlib). You may rename it too, but in this case you have to change
+the variable <code>$file</code> in the .php file accordingly.
+<br>
+<br>
+Example:
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'makefont/makefont.php'</span><span class="kw">);
+
+</span>MakeFont<span class="kw">(</span><span class="str">'c:\\Windows\\Fonts\\comic.ttf'</span><span class="kw">,</span><span class="str">'cp1252'</span><span class="kw">);
+</span>?&gt;</code></pre>
+</div>
+which gives the files comic.php and comic.z.
+<br>
+<br>
+Then copy the generated files to the font directory. If the font file could not be compressed, copy
+it directly instead of the .z version.
+<br>
+<br>
+Another way to call MakeFont() is through the command line:
+<br>
+<br>
+<kbd>php makefont\makefont.php c:\Windows\Fonts\comic.ttf cp1252</kbd>
+<br>
+<br>
+Finally, for TrueType and OpenType fonts, you can also generate the files
+<a href="http://www.fpdf.org/makefont/">online</a> instead of doing it manually.
+
+<h2>Declaration of the font in the script</h2>
+The second step is simple. You just need to call the <a href='../doc/addfont.htm'>AddFont()</a> method:
+<div class="source">
+<pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'comic.php'</span><span class="kw">);
+</span></code></pre>
+</div>
+And the font is now available (in regular and underlined styles), usable like the others. If we
+had worked with Comic Sans MS Bold (comicbd.ttf), we would have written:
+<div class="source">
+<pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span><span class="str">'comicbd.php'</span><span class="kw">);
+</span></code></pre>
+</div>
+
+<h2>Example</h2>
+Let's now see a complete example. We will use the font <a href="http://www.abstractfonts.com/font/52" target="_blank">Calligrapher</a>.
+The first step is the generation of the font files:
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'makefont/makefont.php'</span><span class="kw">);
+
+</span>MakeFont<span class="kw">(</span><span class="str">'calligra.ttf'</span><span class="kw">,</span><span class="str">'cp1252'</span><span class="kw">);
+</span>?&gt;</code></pre>
+</div>
+The script gives the following report:
+<br>
+<br>
+<b>Warning:</b> character Euro is missing<br>
+<b>Warning:</b> character zcaron is missing<br>
+Font file compressed: calligra.z<br>
+Font definition file generated: calligra.php<br>
+<br>
+The euro character is not present in the font (it's too old). Another character is missing too.
+<br>
+<br>
+Alternatively we could have used the command line:
+<br>
+<br>
+<kbd>php makefont\makefont.php calligra.ttf cp1252</kbd>
+<br>
+<br>
+or used the online generator.
+<br>
+<br>
+We can now copy the two generated files to the font directory and write the script:
+<div class="source">
+<pre><code>&lt;?php
+<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
+
+</span>$pdf <span class="kw">= new </span>FPDF<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Calligrapher'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'calligra.php'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
+</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Calligrapher'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>35<span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>10<span class="kw">,</span><span class="str">'Enjoy new fonts with FPDF!'</span><span class="kw">);
+</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
+</span>?&gt;</code></pre>
+</div>
+<p class='demo'><a href='tuto7.php' target='_blank' class='demo'>[Demo]</a></p>
+
+<h2>About the euro symbol</h2>
+The euro character is not present in all encodings, and is not always placed at the same position:
+<table>
+<tr><th>Encoding</th><th>Position</th></tr>
+<tr class="alt0"><td>cp1250</td><td>128</td></tr>
+<tr class="alt1"><td>cp1251</td><td>136</td></tr>
+<tr class="alt0"><td>cp1252</td><td>128</td></tr>
+<tr class="alt1"><td>cp1253</td><td>128</td></tr>
+<tr class="alt0"><td>cp1254</td><td>128</td></tr>
+<tr class="alt1"><td>cp1255</td><td>128</td></tr>
+<tr class="alt0"><td>cp1257</td><td>128</td></tr>
+<tr class="alt1"><td>cp1258</td><td>128</td></tr>
+<tr class="alt0"><td>cp874</td><td>128</td></tr>
+<tr class="alt1"><td>ISO-8859-1</td><td>N/A</td></tr>
+<tr class="alt0"><td>ISO-8859-2</td><td>N/A</td></tr>
+<tr class="alt1"><td>ISO-8859-4</td><td>N/A</td></tr>
+<tr class="alt0"><td>ISO-8859-5</td><td>N/A</td></tr>
+<tr class="alt1"><td>ISO-8859-7</td><td>N/A</td></tr>
+<tr class="alt0"><td>ISO-8859-9</td><td>N/A</td></tr>
+<tr class="alt1"><td>ISO-8859-11</td><td>N/A</td></tr>
+<tr class="alt0"><td>ISO-8859-15</td><td>164</td></tr>
+<tr class="alt1"><td>ISO-8859-16</td><td>164</td></tr>
+<tr class="alt0"><td>KOI8-R</td><td>N/A</td></tr>
+<tr class="alt1"><td>KOI8-U</td><td>N/A</td></tr>
+</table>
+ISO-8859-1 is widespread but does not include the euro sign. If you need it, the simplest thing
+to do is to use cp1252 or ISO-8859-15 instead, which are nearly identical but contain the precious
+symbol.
+
+<h2>Reducing the size of TrueType fonts</h2>
+Font files are often quite voluminous; this is due to the fact that they contain the characters
+corresponding to many encodings. Zlib compression reduces them but they remain fairly big. A
+technique exists to reduce them further. It consists in converting the font to the Type1 format
+with <a href="http://ttf2pt1.sourceforge.net" target="_blank">ttf2pt1</a> (the Windows binary is
+available <a href="http://www.fpdf.org/fr/dl.php?id=22">here</a>) while specifying the encoding
+you are interested in; all other characters will be discarded.
+<br>
+For example, the arial.ttf font that ships with Windows Vista weights 748 KB (it contains 3381 characters).
+After compression it drops to 411. Let's convert it to Type1 by keeping only cp1250 characters:
+<br>
+<br>
+<kbd>ttf2pt1 -b -L cp1250.map c:\Windows\Fonts\arial.ttf arial</kbd>
+<br>
+<br>
+The .map files are located in the makefont directory of the package. The command produces
+arial.pfb and arial.afm. The arial.pfb file weights only 57 KB, and 53 after compression.
+<br>
+<br>
+It's possible to go even further. If you are interested only by a subset of the encoding (you
+probably don't need all 217 characters), you can open the .map file and remove the lines you are
+not interested in. This will reduce the file size accordingly.
+</body>
+</html>
Index: /lib/fpdf/tutorial/tuto7.php
===================================================================
--- /lib/fpdf/tutorial/tuto7.php	(revision 5261)
+++ /lib/fpdf/tutorial/tuto7.php	(revision 5261)
@@ -0,0 +1,11 @@
+<?php
+define('FPDF_FONTPATH','.');
+require('../fpdf.php');
+
+$pdf = new FPDF();
+$pdf->AddFont('Calligrapher','','calligra.php');
+$pdf->AddPage();
+$pdf->SetFont('Calligrapher','',35);
+$pdf->Cell(0,10,'Enjoy new fonts with FPDF!');
+$pdf->Output();
+?>
Index: /lib/functions.inc.php
===================================================================
--- /lib/functions.inc.php	(revision 8528)
+++ /lib/functions.inc.php	(revision 5261)
@@ -1,57 +1,4 @@
 <?php
-
-    function wpsg_strftime($format, $timestamp = null) {
-
-        if ($timestamp === null) $timestamp = time();
-
-        if (class_exists('IntlDateFormatter')) {
-
-			$replacements = [
-				'%a' => 'eee',
-				'%A' => 'eeee',
-				'%d' => 'dd',
-				'%e' => 'd',
-				'%j' => 'D', // nicht direkt unterstÃŒtzt
-				'%u' => 'e',
-				'%w' => 'c',
-				'%b' => 'MMM',
-				'%B' => 'MMMM',
-				'%m' => 'MM',
-				'%y' => 'yy',
-				'%Y' => 'yyyy',
-				'%H' => 'HH',
-				'%k' => 'H',
-				'%I' => 'hh',
-				'%l' => 'h',
-				'%M' => 'mm',
-				'%S' => 'ss',
-				'%p' => 'a',
-				'%z' => 'Z',
-				'%Z' => 'z',
-				'%%' => '%',
-			];
-	
-			$intlFormat = $format;
-			
-			foreach ($replacements as $strf => $intl) $intlFormat = str_replace($strf, $intl, $intlFormat);
-			
-            $formatter = new \IntlDateFormatter(
-                "de-DE",
-                IntlDateFormatter::FULL,
-                IntlDateFormatter::NONE,
-				date_default_timezone_get(),
-				null,
-				$intlFormat
-            );
-
-            $dateTime = new DateTime();
-            $dateTime->setTimestamp($timestamp);
-
-            return $formatter->format($dateTime);
-
-        } else return strftime($format, $timestamp);
-
-    }
-
+	
 	/**
 	 * PrÃŒfen ob Ajax-Request vorliegt
@@ -72,18 +19,4 @@
 		return false;
 	
-	}
-
-	function wpsg_removeBOM($data) 
-	{
-    
-		if (0 === strpos(bin2hex($data), 'efbbbf')) 
-		{
-       
-			return substr($data, 3);
-    
-		}
-    
-		return $data;
-
 	}
 
@@ -94,15 +27,12 @@
 	 * @return	array
 	 */
-	function wpsg_array_csort($marray, $column) {
-
-        $sortarr = [];
-
-		foreach ($marray as $row) {
-
+	function wpsg_array_csort($marray, $column) 
+	{
+		
+		foreach ($marray as $row) 
+		{
 	   		$sortarr[] = $row[$column];
-
-		}
-
-	 	array_multisort($sortarr, $marray);
+		}
+	 	@array_multisort($sortarr, $marray);
 	 	
 	 	return $marray;
@@ -136,52 +66,16 @@
 		
 	} // function wpsg_array_unique($ar)	
-
-	/**
-	 * Funktion ist nÃ¶tig, da alle Ajax Anfragen is_admin mit true beantworten laut Doku
-	 * Ich benÃ¶tige aber eine Unterscheidung ob ich im Frontend eine Aktion ausfÃŒhre oder im Backend
-	 * Daher habe ich fÃŒr Frontend Anfragen den Parameter wpsg_frontend_ajax auf 1 gesetzt
-	 */
-	function wpsg_is_admin()
-	{
-
-		if (isset($_REQUEST['wpsg_frontend_ajax']) && $_REQUEST['wpsg_frontend_ajax'] === '1') return false;
-		else return is_admin();
-
-	} // function wpsg_is_admin()
-
-    function wpsg_rglob($pattern, $flags = 0)
-    {
-
-        $arFiles = glob($pattern, $flags);
-
-        foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
-        {
-
-            $arFiles = array_merge($arFiles, wpsg_rglob($dir.'/'.basename($pattern), $flags));
-
-        }
-
-        return $arFiles;
-
-    }
-
+	
 	/**
 	 * PrÃŒft die Eingabe eines Geburtsdatums auf GÃŒltigkeit
 	 * @param String $val
-	 */  
-	function wpsg_isValidGeb(&$val)
-	{
-		
-	    if (preg_match('/\d{4}\-\d{2}\-\d{2}/', $val))	        
-        {
-            
-            $val = date('d.m.Y', strtotime($val));
-            
-        }
-	    
+	 */
+	function wspg_isValidGeb(&$val)
+	{
+		
 		if (wpsg_isSizedString($val) && preg_match('/\d{2}\.\d{2}\.\d{4}/', $val)) return true;
 		else return false;
 		
-	} // function wpsg_isValidGeb($val)
+	} // function wspg_isValidGeb($val)
 	
 	/**
@@ -189,89 +83,27 @@
 	 * @param String $val
 	 */
-	function wpsg_isValidEMail(string &$val): bool {
-		
-		if (!isset($val)) return false;
-		
-		return filter_var($val, FILTER_VALIDATE_EMAIL);
+	function wpsg_isValidEMail(&$val)
+	{
+		
+		if (wpsg_isSizedString($val) && strpos($val, '@') !== false) return true;
+		else return false;
 		
 	} // function wpsg_isValidEMail($val)
 	
-	/**
-	 * Definiert eine Konstante, wenn Sie noch nicht definiert wurde
-	 * @param unknown $name
-	 * @param unknown $value
-	 */
-	function wpsg_define($name, $value)
-	{
-		
-		if (!defined($name)) define($name, $value);
-		
-	} // function wpsg_define($name, $value)
-	
-	function wpsg_parse_size($size) 
-	{
-  
-		$unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size.
-  		$size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size.
-  
-		if ($unit) 
-		{
-    
-			return round($size * pow(1024, stripos('bkmgtpezy', $unit[0])));
-  		
-		}
-  		else 
-		{
-    
-			return round($size);
-  
-		}
-
-	} // function wpsg_parse_size($size) 
-
-	function wpsg_get_file_upload_max_size() 
-	{
-  
-		static $max_size = -1;
-
-  		if ($max_size < 0) 
-		{
-    
-    		$post_max_size = wpsg_parse_size(ini_get('post_max_size'));
-    
-			if ($post_max_size > 0) 
-			{
-      
-				$max_size = $post_max_size;
-    
-			}
-
-    		$upload_max = wpsg_parse_size(ini_get('upload_max_filesize'));
-    
-			if ($upload_max > 0 && $upload_max < $max_size) 
-			{
-      
-				$max_size = $upload_max;
-    
-			}
-  
-		}
-  
-		return $max_size;
-		
-	} // function wpsg_get_file_upload_max_size()
-
-
 	/**
 	 * Setzt einen Wert oder addiert ihn
 	 * Um Warnungen zu verhindern wenn man einen Wert auf eine Variable addiert die mÃ¶glicherweise nicht definiert ist
 	 */
-	function wpsg_addSet(&$arrayElement, $addSet) {
-			    
-		if (isset($arrayElement) && is_numeric($arrayElement)) {
- 
-			$arrayElement += (double)$addSet;
-			
-		} else {
+	function wpsg_addSet(&$arrayElement, $addSet)
+	{
+		
+		if (isset($arrayElement))
+		{
+			
+			$arrayElement += $addSet;			
+			
+		}
+		else
+		{
 			
 			$arrayElement = $addSet;
@@ -358,18 +190,4 @@
 	} // function wpsg_asort_function($a, $b)
 	
-	/**
-	 * Gibt einen Pfad formatiert zurÃŒck
-	 * - Entfernt doppelte // bzw. \\
-	 * - Wandelt // in Systemspezifische Trenner um
-	 */
-	function wpsg_format_path($strPath)
-	{
-		
-		$strPath = preg_replace('/(\/+)|(\\+)/', DIRECTORY_SEPARATOR, $strPath);
-		
-		return $strPath;
-		
-	} // function wpsg_format_path($strPath)
-	
 	function wpsg_array_csort_pk_function($accountA, $accountB)
 	{
@@ -398,5 +216,5 @@
 	}
 
-	function wpsg_tax_groups($noRata = false, $noSuffix = false)
+	function wpsg_tax_groups($noRata = false)
 	{
 		
@@ -410,6 +228,5 @@
 		);
 		
-		if ($noRata === true) unset($arTaxGroups[0]);		
-		if ($noSuffix === true) return $arTaxGroups;
+		if ($noRata === true) unset($arTaxGroups[0]);
 		
 		foreach ($arTaxGroups as $tax_key => &$tax_label)
@@ -436,27 +253,5 @@
 		
 	} // function wpsg_tax_groups()
-
-	/**
-	 * Wandelt einen Key => Value Array fÃŒr die InlineEdit JS Funktion um
-	 * @param $ar
-	 */
-	function wpsg_prepare_for_inlineEdit($ar)
-	{
-		
-		if (!wpsg_isSizedArray($ar)) return json_encode(array());
-		
-		$arReturn = array();
-		
-		foreach ($ar as $k => $v)
-		{
-			
-			$arReturn[] = array('value' => $k, 'text' => $v);
-			
-		}
-		
-		return json_encode($arReturn);
-		
-	} // function wpsg_prepare_for_inlineEdit($ar)
-
+	
 	function wpsg_prepare_for_debug(&$value)
 	{
@@ -477,22 +272,13 @@
 	}
 	
-	function wpsg_debug_console($value)
-	{
-		
-		if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugModus') != "1") return;
-		
-		echo '<script type="text/javascript"> console.log('.json_encode($value).'); </script>';
-		
-	}
-
 	/**
 	 * Debug Funktion, die den ÃŒbergebenen Wert ausgibt wenn die Option im Backend aktiviert ist.
 	 */
-	function wpsg_debug($value, $small = false)
+	function wpsg_debug($value)
 	{
 		 
 		if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugModus') != "1") return;
 		
-		echo '<pre style="color:red; '.(($small === true)?'font-size:12px; overflow-x:scroll;':'').'">';
+		echo '<pre style="color:red;">';
 		
 		if (is_array($value))
@@ -500,5 +286,6 @@
 			
 			wpsg_prepare_for_debug($value);
-			 
+			
+			
 			print_r($value);
 			echo '</pre>';
@@ -523,12 +310,8 @@
 	/**
 	 * Entfernt aus einem Wert / Array alle XSS Attacken
-	 * @param $value
-	 * @return array|string
 	 */
 	function wpsg_xss($value)
 	{
-
-		if(is_object($value)) return $value;
-
+		
 		if (is_array($value))
 		{
@@ -544,6 +327,6 @@
 		else
 		{
-
-			$value = $value !== null ? strip_tags($value) : '';
+			
+			$value = strip_tags($value);
 			
 		}
@@ -554,636 +337,7 @@
 	
 	/**
-	 * PrÃŒft Eingaben auf GÃŒltigkeit
-	 *
-	 * @param $val
-	 * @param $type
-	 *
-	 * @param null $param
-	 * @return bool true wenn GÃŒltig
-	 * @throws Exception
-	 */
-	function wpsg_checkInput(&$val, $type, $param = null) {
-		
-		$bReturn = false;
-		
-		if ($type === null) $type = WPSG_SANITIZE_TEXTFIELD;
-		
-		if (wpsg_isSizedArray($param['allow']) && in_array($val, $param['allow'])) return true;		
-		if (!isset($val) && !wpsg_isTrue($param['allowEmpty'])) return false;
-				
-		if (!is_numeric($type)) $type = -1;
-		
-		if (wpsg_isTrue($param['allowEmpty']) && strval($val) === '') return true;
-		
-		switch ($type) {
-			
-			case WPSG_SANITIZE_ZIP: // PLZ
-				
-				if (preg_match('/^\d{0,5}$/', $val)) $bReturn = true;
-				else $bReturn = false;
-				
-				break;
-							
-			case WPSG_SANITIZE_USTIDNR:
-				
-				if (preg_match('/^([A-z]*)?\d+$/i', $val)) $bReturn = true;
-				else $bReturn = false;
-				
-				break;
-			
-			case WPSG_SANITIZE_DATE_EN:
-				
-				if (preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $val)) $bReturn = true;
-				else $bReturn = false;
-				
-				break;
-				
-			case WPSG_SANITIZE_DATE:
-				
-				if (preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $val)) $bReturn = true;
-				else $bReturn = false;
-				
-				break;
-			
-			case WPSG_SANITIZE_DATETIME:
-				
-				if (preg_match('/\d{2}\.\d{2}\.\d{4}(\040\d{2}\:\d{2}(\:\d{2})?)?/', $val)) $bReturn = true;
-				else $bReturn = false;
-				
-				break;
-			
-			case WPSG_SANITIZE_COSTKEY:
-				
-				$filtered = preg_replace('/(\d)|(\:)|(,)|(\|)|(\,)/', '', $val);
-				
-				if (trim($filtered) === '') $bReturn = true;
-				else $bReturn = false;
-				
-				break;
-				
-			case WPSG_SANITIZE_HTML:
-				
-				$filtered = \wp_kses_post($val);
-				
-				if ($filtered === $val) $bReturn = true;
-				else {
-					 
-					$bReturn = false;
-					
-				}
-				
-				break;
-				
-			case WPSG_SANITIZE_CHECKBOX:
-				
-				if (in_array($val, ['0', '1'])) $bReturn = true;
-				
-				break;
-			
-			case WPSG_SANITIZE_HEXCOLOR:
-				
-				if ($val === '' || preg_match('/^\#[0-9A-F]{6}$/', $val)) $bReturn = true;
-				
-				break;
-				
-			case WPSG_SANITIZE_EMAIL:
-				
-				if (sanitize_email($val) == $val) $bReturn = true;
-				
-				break;
-			
-			case WPSG_SANITIZE_EMAILNAME:
-				
-				// TODO RFC 2822? Checken
-				// <NAME> E-Mail
-				// Aber auch nur E-Mail
-				//if (preg_match('/(?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\ x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/', $val)) $bReturn = true; 
-				$bReturn = true;
-				
-				break;
-				
-			case WPSG_SANITIZE_URL_LOCAL:
-				
-				if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') $url_local = 'https://';
-				else $url_local = 'http://';
-				
-				$url_local .= $_SERVER['HTTP_HOST'];
-				
-				if (substr($val, 0, strlen($url_local)) === $url_local || substr($val, 0, 1) === '/') $bReturn = true;
-								
-				break;
-
-			case WPSG_SANITIZE_URL:
-				
-				if (sanitize_url($val) == trim($val)) $bReturn = true; 
-				
-				break;
-				
-			case WPSG_SANITIZE_PATH:
-			case WPSG_SANITIZE_DOMAIN:
-			case WPSG_SANITIZE_ARRAY_LANG:
-			case WPSG_SANITIZE_PRODUCTKEY:
-			case WPSG_SANITIZE_TEXTFIELD:
-			
-				if (is_array($val)) {
-					
-					$bReturn = true;
-					
-					foreach ($val as $k => $v) {
-						
-						$bReturn = $bReturn && wpsg_checkInput($v, WPSG_SANITIZE_TEXTFIELD);
-						
-					}
-					
-				} else {
-					
-					if (sanitize_text_field($val) == trim($val)) $bReturn = true; 
-					
-				}
-				 
-				break;
-				
-			case WPSG_SANITIZE_TEXTAREA:
-				
-				if (sanitize_textarea_field($val) == trim($val)) $bReturn = true;
-				
-				break;
-				
-			case WPSG_SANITIZE_PAGEID:
-			case WPSG_SANITIZE_INT: 
-				
-				if (strval(intval($val)) === strval($val) || strval($val) === '0') $bReturn = true;
-				 
-				break; 
-			
-			case WPSG_SANITIZE_VALUES: 
-				
-				if (!wpsg_isSizedArray($param)) throw new \Exception(__('Systemfehlder! wpsg_checkInput mit $type = values ohne Angabe von mÃ¶glichen Werten aufgerufen.'));
-				
-				if (in_array($val, $param)) $bReturn = true;
-				
-				break;
-				
-			case WPSG_SANITIZE_FLOAT:
-				
-				if (\sanitize_text_field($val) == $val) {
-					
-					$bReturn = true;
-									
-					$val = wpsg_tf($val, true);
-					
-				}
-				
-				break;
-				
-			case WPSG_SANITIZE_TAXKEY:
-				
-				if (in_array($val, ['0',  'a', 'b', 'c', 'd', 'e'])) $bReturn = true;
-				
-				break;
-			
-			case WPSG_SANITIZE_PAYMENT_KEY:
-			case WPSG_SANITIZE_SHIPPING_KEY:
-				
-				if (is_numeric($val) || preg_match('/\d+_\d+/', $val)) $bReturn = true;
-				
-				break;
-				 
-			case WPSG_SANITIZE_ARRAY_FILENAME:
-				
-				if (\sanitize_file_name($val) == $val) $bReturn = true;
-				
-				break;
-				
-			case WPSG_SANITIZE_APIKEY:
-			case WPSG_SANITIZE_NONE: 
-				
-				$bReturn = true;
-				
-				break;
-				
-			case WPSG_SANITIZE_ARRAY_TEXTFIELD:
-				
-				if (!is_array($val)) {
-					
-					$bReturn = false;
-					
-				} else {
-					
-					$bReturn = true;
-					
-					foreach ($val as $k => $v) {
-						
-						if (!wpsg_checkInput($v, WPSG_SANITIZE_TEXTFIELD)) $bReturn = false;
-						
-					}
-					
-				}
-								
-				break;
-								
-			case WPSG_SANITIZE_ARRAY_INT:
-				
-				if (!is_array($val)) $bReturn = false;
-				else {
-					
-					$bReturn = true;
-					
-					foreach ($val as $k => $v) {
-						
-						if (!wpsg_checkInput($v, WPSG_SANITIZE_INT)) $bReturn = false;
-						
-					}
-					
-				}
-				
-			default:
-			 
-				//throw new \Exception(wpsg_translate(__('Typ #1# fÃŒr EingabeÃŒberprÃŒfung nicht definiert.', 'wpsg'), $type));
-				
-				break;
-				
-		}
-				
-		return $bReturn;
-		
-	}
-	
-	/**
-	 * Nutzt die wpsg_checkInput um eine Variable im Request zu validieren
-	 *
-	 * @param $name
-	 * @param $arCheckInputArguments
-	 * @param null $strLabel
-	 * @param $data
-	 * @param null $value
-	 * @return bool
-	 * @throws \wpsg\Exception
-	 */
-	function wpsg_checkRequest($name, $arCheckInputArguments, $strLabel = null, &$data = [], $value = null) {
-		
-		$type = $arCheckInputArguments[0];
-		$param = null;
-		
-		if (isset($arCheckInputArguments[1])) $param = $arCheckInputArguments[1];
-		
-		if ($value === null && isset($_REQUEST[$name])) $value = $_REQUEST[$name];
-		
-		if (!wpsg_checkInput($value, $type, $param)) {
-			
-			wpsg_ShopController::getShop()->addInputFieldError($name, $strLabel);
-			 						
-			return false;
-			
-		} else {
-			
-			$data[$name] = wpsg_q($value);
-			
-			return true;
-			
-		}
-		
-	}
-	
-	/**
-	 * Entry function for universal sanitization and validation
-	 * Suited for assigning another value if function returns false due to an error
-	 *
-	 * @param String    $type
-	 * @param array     $params
-	 *
-	 * @return array|String
-	 * @throws \wpsg\Exception  Do *not* catch
-	 *
-	 * @see "Securing Input" ( https://developer.wordpress.org/plugins/security/securing-input/ )
-	 */
-	function wpsg_sanitize($type, ...$params)
-	{
- 
-		$err = false;
-
-		// Main parameter used for comparison
-		$primary = isset($params["primary"]) ? $params['primary'] : $params[0];
-
-		// If $primary is not even set
-		if($primary === NULL) return false;
-
-		// If prefix "sanitize_" not assigned
-		if(strpos($primary, "sanitize_") === false) $type = "sanitize_$type";
-
-		$validTypes = array(
-			"sanitize_email" => "str",
-			"sanitize_file_name" => "str",
-			"sanitize_hex_color" => "str",
-			"sanitize_hex_color_no_hash" => "str",
-			"sanitize_html_class" => "str",			
-			"sanitize_key" => "int",
-			'sanitize_wpsg_taxkey' => 'taxkey',
-			'sanitize_wpsg_tf' => 'tf',
-			"sanitize_meta" => "int", // gettype($meta_key) === "int"
-			"sanitize_mime_type" => "str",
-			"sanitize_option" => "mixed",
-			"sanitize_sql_orderby" => "str",
-			"sanitize_text_field" => "str",
-			"sanitize_title" => "str",
-			"sanitize_title_for_query" => "str",
-			"sanitize_title_with_dashes" => "str",
-			"sanitize_user" => "str",
-			'sanitize_wpsg_in_array' => 'in_array',
-			'sanitize_wpsg_checkbox' => 'checkbox',			
-		);
-		
-		if (!array_key_exists($type, $validTypes)) return wpsg_xss($primary);
-		if (!function_exists($type) && strpos($type, "wpsg_") === false)
-			throw new \wpsg\Exception("Function $type does not exists in the WordPress function pool.");
-		 
-		# Validation (and Sanitization for type txt_tbl)
-		switch($validTypes[$type])
-		{
-
-			// Asked for a string
-			case "str":
-				
-				if(gettype($primary) !== "string") {
-					
-					$err = __("Bitte ÃŒberprÃŒfen sie folgende Eingabe: ", "wpsg");
-					
-				}
-				
-				break;
-			
-			case 'checkbox':
-				 
-				if (!in_array($primary, ['0', '1'])) {
-					
-					$GLOBALS['wpsg_sc']->addBackendError(__('UngÃŒltige Eingaben, bitte ÃŒberprÃŒfen Sie die markierten Felder.', 'wpsg'));
-					
-					return false;
-					
-				}
-				
-				break;
-				
-			case 'in_array':
-				
-				if (!in_array($primary, $params[1])) {
-					
-					$GLOBALS['wpsg_sc']->addBackendError(__('UngÃŒltige Eingaben, bitte ÃŒberprÃŒfen Sie die markierten Felder.', 'wpsg'));
-					
-					return false;
-					
-				}
-				
-				$sanitized_val = $primary;
-				
-				break;
-				
-			case 'tf': 
-				
-				if (!preg_match('/^\-?\d+(\.|\,)\d+$/', $primary)) {
-					
-					$GLOBALS['wpsg_sc']->addBackendError(__('UngÃŒltige Eingaben, bitte ÃŒberprÃŒfen Sie die markierten Felder.', 'wpsg'));
-					
-					return false;
-					
-				}
-				
-				$sanitized_val = wpsg_tf($primary);
-						 
-				break;
-
-			case "taxkey":
-				 
-				$primary = strtolower($primary);
-				
-				if (!in_array($primary, ['0', 'a', 'b', 'c', 'd'])) {
-					
-					$GLOBALS['wpsg_sc']->addBackendError(__('ÃberprÃŒfen Sie den Mehrwertsteuersatz, die Eingabe war ungÃŒltig.', 'wpsg'));
-					
-					return false;
-					
-				}  
-				
-				break;
-				
-			case "int":
-				
-				$nPrimary = (int)$primary;
-				
-				if ($nPrimary !== $primary) {
-					
-					$GLOBALS['wpsg_sc']->addBackendError(__('UngÃŒltige Eingaben, bitte ÃŒberprÃŒfen Sie die markierten Felder.', 'wpsg'));
-					
-					return false;
-					
-				}
-				
-				break;
-								
-			// Asked for an integer
-			/*case "int":
-				
-				if($primary[0] === "-")
-				{
-
-					$isNegative = true;
-					$primary = substr($primary, 1, strlen($primary) - 1);
-
-				}
-
-				$prefix = wpsg_isTrue($isNegative) ? "-" : "";
-
-				if(in_array("isFloat", $params))
-				{
-
-					$fPrimary = wpsg_tf($primary);
-
-
-					if(
-						(bool)((double)$fPrimary <= (double)wpsg_tf(0)) &&
-						wpsg_isSizedString($primary) &&
-						!in_array($primary, array("0", "0.0", "0.00", "0,0", "0,00")))
-					{
-
-						$fPrimary = $primary;
-						$prefix = "";
-
-						$err = __("Bitte ÃŒberprÃŒfen sie folgende Eingabe: ");
-
-					}
-
-				}
-				else
-				{
-					
-					$nPrimary = (int)$primary;
-					
-					if(
-						gettype($nPrimary) !== "integer" ||
-						!empty($nPrimary) && !wpsg_isSizedInt($nPrimary) && $primary !== "0" ||
-						wpsg_isSizedString($primary) && !wpsg_isSizedInt($nPrimary) && $primary !== "0"
-					) $err = __("Bitte ÃŒberprÃŒfen sie folgende Eingabe: ");
-					
-				}
-				break;
-			*/
-			
-			case "txt_tbl":
-				$returnArr = array();
-
-				foreach($primary as $k => $arr)
-					foreach($arr as $_k => $_v)
-						switch($_k)
-						{
-
-							case "text":
-								$returnArr[$k][$_k] = wpsg_sanitize("text_field", $_v);
-								break;
-
-							case "x":
-							case "y":
-							case "fontsize":
-							case "alpha":
-							case "angle":
-							case "align":
-							case "aktiv":
-							case "bg":
-								$returnArr[$k][$_k] = wpsg_sanitize("key", $_v);
-								break;
-
-							case "color":
-								$returnArr[$k][$_k] = wpsg_sanitize("hex_color", $_v);
-								break;
-
-						}
-
-				return $returnArr;
-				break;
-
-			// Mixed value
-			default:
-				break;
-
-		}
-
-		# Sanitization WP Funktion
-		if (strpos($type, "wpsg_") === false) {
-			
-			try {
-	
-				// If a float/double value is wanted
-				if($validTypes[$type] !== "int" && !in_array("isFloat", $params) || $err !== false)
-					$sanitized_val = call_user_func_array($type, $params);
-				else if(in_array("isFloat", $params))
-					$sanitized_val = sanitize_text_field($prefix.wpsg_ff($fPrimary));
-				else {
-				
-					$sanitized_val = sanitize_text_field($prefix.$primary);
-					
-				}
-	
-			} catch(Exception $e) {
-				
-				throw new \wpsg\Exception($e->getMessage(), $e->getCode());
-				
-			}
-			
-		}
-
-		# If error was thrown --> output $primary after sanitization
-		if($err !== false)
-		{
-
-			$GLOBALS['wpsg_sc']->addBackendError(
-				$err . (wpsg_isSizedString($sanitized_val) ? substr($sanitized_val, 0, 10) : $sanitized_val)
-			);
-
-			return false;
-
-		}
-
-		return $sanitized_val ?: wpsg_xss($primary);
-
-	} // function wpsg_sanitize(String $type, array|string ...$params)
-
-
-	/**
-	 * Secure Input Alias
-	 * Suited for returning either the wp sanitized or the wpsg_xss sanitized value
-	 *
-	 * @param       $type
-	 * @param mixed ...$params
-	 *
-	 * @return array|string
-	 * @throws \wpsg\Exception  Do *not* catch
-	 */
-	function wpsg_sinput($type, ...$params)
-	{
-
-		return $params[0];
-		
-		/*
-		 * Deaktiviert
-		$primary = isset($params["primary"]) ? $params['primary'] : $params[0];
-		$sanitizedVal = wpsg_sanitize($type, ...$params);
-
-		return !$sanitizedVal ? wpsg_xss($primary) : $sanitizedVal;
-		*/
-		
-	} // function wpsg_sinput(String $type, array|string ...$params)
-
-	/**
-	 * Entry function for global escaping
-	 *
-	 * @param String $type
-	 * @param array  $params
-	 *
-	 * @return string
-	 * @throws \wpsg\Exception Do *not* catch
-	 * @see "Securing Output" ( https://developer.wordpress.org/plugins/security/securing-output/ )
-	 */
-	function wpsg_escape($type, ...$params)
-	{
-
-		// Main parameter used for comparison
-		$primary = isset($params["primary"]) ? $params['primary'] : $params[0];
-
-		// If $primary is not even set
-		if($primary === NULL) return false;
-
-		// If prefix "esc_" is not assigned
-		if(strpos($type, "esc_") === false) $type = "esc_" . $type;
-
-		$validTypes = array(
-			"esc_html",
-			"esc_url",
-			"esc_js",
-			"esc_attr"
-		);
-
-		if(!in_array($type, $validTypes)) return wpsg_q($primary);
-		if(!function_exists($type)) throw new \wpsg\Exception("Function $type does not exists in the WordPress function pool.");
-
-		# Escape function execution
-		try{
-			if(wpsg_isSizedArray($params)) $returnVal = call_user_func_array(
-				$type, array_unshift($params, $primary)
-			);
-			else $returnVal = $type($primary);
-		} catch(Exception $e) {
-			throw new \wpsg\Exception($e->getMessage(), $e->getCode());
-		}
-
-		return $returnVal ?: wpsg_q($primary);
-
-	} // function wpsg_escape(String $type, array|String $params)
-
-	/**
 	 * Sortiert den Array $ar um, nach den Indexen in $newIndexOrder
-	 *
 	 * @param unknown $ar
 	 * @param unknown $newIndexOrder
-	 *
-	 * @throws \wpsg\Exception
 	 */
 	function wpsg_array_reorder(&$ar, $newIndexOrder)
@@ -1212,5 +366,5 @@
 		{
 			
-			throw new \wpsg\Exception(__('Beim umsortieren eines Arrays gab es im Original Array mehr Elemente als in der angegebenen Sortierung', 'wpsg'));
+			$GLOBALS['wpsg_sc']->throwErrorCode('100_8');
 			
 		}
@@ -1218,28 +372,4 @@
 	} // function wpsg_array_reorder(&$ar, $newIndexOrder)
 	 
-    function wpsg_anonymip($value) {
-    
-        return preg_replace('/\d*$/', 'xxx', $value);
-
-    }
-	
-	/**
-	 * Generiert eine zufÃ€llige Zeichenkette der LÃ€nge $laenge
-	 */
-	function wpsg_genCode($laenge, $chars = false) {
-		
-		if ($laenge <= 0) $size = 10;
-		
-		if ($chars === false) $chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
-		
-		$arCode = array();
-		for ($i = 1; $i <= $laenge; $i++) { $arCode[] = $chars[rand(0, (strlen($chars) - 1))]; }
-		
-		$strCode = implode('', @$arCode);
-		
-		return $strCode;
-		
-	} // public function genCode($laenge)
-    
 	/**
 	 * Escape Funktion fÃŒr die Datenbank
@@ -1267,5 +397,6 @@
 			{
 				
-				throw new \wpsg\Exception(__('Beim escapen wurde ein Objekt ÃŒbergeben, hier sind nur Strings erlaubt.', 'wpsg'));
+				wpsg_debug(print_r(debug_backtrace(), 1));
+				die($GLOBALS['wpsg_sc']->throwErrorCode('100_3'));
 				
 			}
@@ -1342,22 +473,9 @@
 	 */
 	function wpsg_hspc($string) { if (isset($string)) return htmlspecialchars($string); else return ''; } // function wpsg_hspc($string)
-
-	/**
-	 * Dient zur Erkennung des Cron Jobs
-	 * (FÃŒr die Funktion canDisplay im Produkt wird der Admin Status abgefragt, so dass Produkte im Backend angezeigt werden auch wenn sie ausverkauft sind
-	 * Im Cron mÃŒssen diese Produkte auch exportiert werden damit die Darstellung mit dem Backend stimmt
-	 */
-	function wpsg_is_cron()
-	{
-		
-		if (defined("WPSG_CRON") && WPSG_CRON === true) return true;
-		else return false;
-		
-	}
-
+	
 	/**
 	 * Formatiert einen Double Wert fÃŒr Ausgaben im Frontend
 	 */
-	function wpsg_ff($value, $einheit = false, $keep = false, $stellen = 2)
+	function wpsg_ff($value, $einheit = false, $keep = false)
 	{
 		
@@ -1380,5 +498,6 @@
 		else
 		{
- 
+
+			$stellen = 2;
 			$value = doubleval($value);
 			   
@@ -1388,8 +507,9 @@
 				preg_match('/0\.(0+)\d/', $value, $match);
 				
-				if (isset($match[1])) {
+				if (isset($match[1]))
+				{
 					
 					$stellen = strlen($match[1]) + $stellen;
-					
+				
 				}
 				
@@ -1415,5 +535,5 @@
 		
 		// Alles auÃer Zahlen, Punkt und Komma entfernen
-		$value = preg_replace('/[^\d|^\.|^\,|^\-]/', '', ($value??''));
+		$value = preg_replace('/[^\d|^\.|^\,|^\-]/', '', $value);
 				
 		if (strpos($value, ".") && strpos($value, ","))
@@ -1425,5 +545,5 @@
 				
 				//1.123,23
-				return wpsg_tf(str_replace(",", ".", str_replace(".", "", $value)));
+				return str_replace(",", ".", str_replace(".", "", $value));
 				
 			}
@@ -1432,5 +552,5 @@
 
 				//1,234.23
-				return wpsg_tf(str_replace(",", "", $value));
+				return str_replace(",", "", $value);
 				
 			}
@@ -1444,5 +564,5 @@
 		else
 		{
-			return floatval(str_replace(",", ".", $value));
+			return str_replace(",", ".", $value);
 		}
 		
@@ -1540,12 +660,6 @@
 	function wpsg_toDate($value)
 	{
-			
-		if (is_numeric($value))
-		{
-			
-			return date('Y-m-d', $value); 
-			
-		}
-		else if (preg_match('/\d{2}\.\d{2}\.\d{4}/', $value))
+		
+		if (preg_match('/\d{2}\.\d{2}\.\d{4}/', $value))
 		{
 			
@@ -1554,5 +668,5 @@
 			return $arDate[2].'-'.$arDate[1].'-'.$arDate[0];
 			
-		}		
+		}
 		else if (strtotime($value) > 0)
 		{
@@ -1582,45 +696,14 @@
 	 * Gibt einen Timestamp formatiert als Datum/Datum+Zeit zurÃŒck
 	 */
-	function wpsg_formatTimestamp($ts, $dateOnly = false, $offset = false) {
-
-		if (!is_numeric($ts)) $ts = strtotime($ts);
-
+	function wpsg_formatTimestamp($ts, $dateOnly = false)
+	{
+		
 		if ($ts == 0) return '';
-
-		if ($offset) $ts += intval(get_option('gmt_offset')) * 60 * 60;
-
+		
 		if ($dateOnly) return date('d.m.Y', $ts);
 		else return date('d.m.Y H:i:s', $ts);
 		 
-	}
-
-	 /**
-     * LÃ¶scht alle Dateien in einem Verzeichnis
-     * @param string $path
-     */
-    function wpsg_clearDirectory(string $path): void {
-
-    	$wpsg_upload_path = realpath(wpsg_ShopController::getShop()->getUplodatStoragePath());
-    	$path = realpath($path).DIRECTORY_SEPARATOR;
-
-    	// Ich erlaube die Funktion nur unter dem wp-content/uploads/wpsg Folder etwas zu lÃ¶schen
-    	if (substr($path, 0, strlen($wpsg_upload_path)) !== $wpsg_upload_path) throw new \Exception(__('Zugriffsfehler'));
-
-        $files = scandir($path);
-
-        foreach ($files as $file) {
-
-            $filepath = $path.$file;
-
-            if (is_file($filepath)) {
-
-                unlink($filepath);
-
-            }
-
-        }
-
-    }
-
+	} // function wpsg_formatTimestamp($ts)
+	
 	/**
 	 * Erweiterung der Gettext Funktion um flexible Parameter
@@ -1629,13 +712,14 @@
 	 * ZusÃ€tzlich wird der String noch durch Htmlspecialchars gejagt
 	 */
-	function wpsg_translate($string) {
+	function wpsg_translate($string)
+	{
 		
 		$arg = array(); 
 			
-	  	for($i = 1 ; $i < func_num_args(); $i++) {
+	  	for($i = 1 ; $i < func_num_args(); $i++)
+	  	{
 	  		
 	  		$arg = func_get_arg($i);
-	  		$string = preg_replace("/#".$i."#/", $arg, $string);
-	  		
+	  		$string = preg_replace("/#".$i."#/", $arg, $string);  	
 	  	}
 	   
@@ -1643,21 +727,8 @@
 	  	
 	} // function wpsg_translate($string)
-
-    /**
-     * Wie die Wordpress Funktion, bachtet aber die WPML Seitenzuordnung
-	 * @return int
-     */
-    function wpsg_get_the_id() {
-
-        return intval($GLOBALS['wpsg_sc']->getPageId(\get_the_id()));
-
-    } // function wpsg_get_the_id()
-
+	
 	function wpsg_calculatePreis($value, $brutto_netto, $mwst)
 	{
 		
-		if (doubleval($value) <= 0) return 0;
-		if (doubleval($mwst) <= 0) return $value;
-
 		if ($brutto_netto == WPSG_BRUTTO)
 		{
@@ -1669,5 +740,5 @@
 		else
 		{
-
+			
 			// Netto Preis bestimmen
 			return $value / (1 + ($mwst / 100));
@@ -1704,5 +775,5 @@
 	{
 		
-		$arData = explode($del, ($value??''));
+		$arData = explode($del, $value);
 		
 		foreach ($arData as $k => $v)
@@ -1755,16 +826,24 @@
 	function wpsg_trim($value, $clearEntry = '')
 	{
-
-		if (!is_array($clearEntry)) $testClearEntry = array($clearEntry);
-		else $testClearEntry = $clearEntry;
 		
 		if (is_array($value))
 		{
-
+			
 			foreach ($value as $k => $v)
 			{
-				
-				$value[$k] = wpsg_trim($v, $clearEntry);
-				if ($clearEntry !== false && in_array($value[$k], $testClearEntry)) unset($value[$k]);
+
+				if ($clearEntry === false)
+				{
+					
+					$value[$k] = wpsg_trim($v);	
+					
+				}
+				else
+				{
+								
+					if (is_string($v) && trim($v) == '' || trim($v) == $clearEntry) unset($value[$k]);
+					else $value[$k] = wpsg_trim($v);
+					
+				}
 				
 			}
@@ -1775,5 +854,5 @@
 			
 			$value = trim($value);
-						
+			
 		}
 		
@@ -1808,4 +887,5 @@
 		
 		if (!isset($value)) return false;
+		if (strlen(doubleval($value)) != strlen($value)) return false;
 		
 		$dValue = doubleval($value);
@@ -1859,59 +939,4 @@
 		
 	}	
-		
-	function wpsg_checkNounce($controller, $action = '', $arParam = []) {
-		
-		check_admin_referer(wpsg_getNounce($controller, $action, $arParam));
-		
-	}
-	
-	function wpsg_formNounce($controller, $action = '', $arParam = []) {
-		
-		return wp_nonce_field(wpsg_getNounce($controller, $action, $arParam));
-		
-	}
-	
-	function wpsg_getNounce($controller, $action = '', $arParam = []) {
-		
-		$strNounce = 'wpsg-'.strtolower($controller).'-'.strtolower($action).'-';
-		
-		if (wpsg_isSizedArray($arParam)) {
-		
-			ksort($arParam);
-			
-			foreach ($arParam as $k => $v) {
-				
-				$strNounce .= $k.'-'.$v;
-				
-			}
-			
-		}
-		
-		return $strNounce;
-		
-	}
-	
-	function wpsg_admin_url($controller, $action = '', $arParam = [], $arParamNoNounce = [], $html_entity_decode = false) {
-		
-		$strURL = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-'.$controller.'&action='.$action;
-		
-		if (wpsg_isSizedArray($arParam)) {
-			
-			$strURL .= '&'.http_build_query($arParam);
-						
-		}		
-		
-		if (wpsg_isSizedArray($arParamNoNounce)) {
-			
-			$strURL .= '&'.http_build_query($arParamNoNounce);
-			
-		}
-				
-		$url = wp_nonce_url($strURL, wpsg_getNounce($controller, $action, $arParam));
-		
-		if ($html_entity_decode) return html_entity_decode($url);
-		else return $url;
-		
-	}
 	
 	/**
@@ -1931,49 +956,29 @@
 		
 	} // function isSizedArray($array, $size = 1)
-
-	/**
-	 * Gibt die Numerische Entsprechung einer Variable zurÃŒck oder $default
-	 */
-	function wpsg_getInt(&$value, $default = 0)
-	{
-			
-		if (!isset($value) || !is_numeric($value)) return $default;
-		
-		return intval($value);
-		
-	}
-
-	function wpsg_getFloat(&$value, $default = 0.0)
-	{
-
-		if (!isset($value)) return $default;
-		else return floatval($value);
-
-	}
-
+	
+	/**
+	 * Gibt einen Float Wert zurÃŒck und verhindert Fehler/Warnungen wenn Wert nicht definiert wurde
+	 * Wenn Wert nicht definiert wird 0.0 zurÃŒckgegeben
+	 */
+	function wpsg_getFloat(&$value)
+	{
+		
+		if (!isset($value)) return 0.0;
+		
+		return floatval($value);
+		
+	} // function wpsg_getFloat(&$value)
+	
 	/**
 	 * Gibt einen String zurÃŒck und verhindert Fehler wenn eine Wert nicht definiert wurde
 	 */
-	function wpsg_getStr(&$value, $default = '') {
-
-	    $test_value = strval($value);
-
-		if (!isset($value) || !wpsg_isSizedString($test_value)) return strval($default);
+	function wpsg_getStr(&$value)
+	{
+		
+		if (!isset($value) || !is_string($value)) return '';
 		
 		return $value;		
 		
 	} // wpsg_getStr($value = '')
-
-	/**
-	 * Gibt ein Array zurÃŒck und verhindert Fehler wenn eine Wert nicht definiert wurde
-	 */
-	function wpsg_getArray(&$value)
-	{
-	
-		if (!isset($value) || !is_array($value)) return Array();
-	
-		return $value;
-	
-	} // wpsg_getArray($value = '')
 	
 	/**
@@ -1988,19 +993,6 @@
 	} // function wpsg_isTrue(&$val)
 	
-	function wpsg_explodeName($val)
-	{
-		
-		$arWords = explode(' ', $val);
-		
-		return array($arWords[0], implode(' ', array_slice($arWords, 1)));
-		
-	}
-	
 	/**
 	 * PrÃŒft ob eine Varible ein String ist und die LÃ€nge > 0 ist
-	 * Gibt auch bei (int)"1" true zurÃŒck (!!!!!)
-	 * @param $strValue
-	 * @param bool $value
-	 * @return bool
 	 */
 	function wpsg_isSizedString(&$strValue, $value = false)
@@ -2009,10 +1001,8 @@
 		$oldValue = $strValue;
 		
+		$strValue = strval($strValue);
+		
 		$isset = true;		
-		if (!isset($strValue)) return false;
-		if (is_int($strValue)) $strValue = strval($strValue);
-		
-		if (gettype($strValue) != 'string') return false;
-		
+		if (!isset($strValue) || !is_string($strValue)) $isset = false;		
 		if (strlen($strValue) <= 0) $isset = false;
 		
@@ -2048,12 +1038,10 @@
 	 * @return 	int
 	 */
-	function wpsg_getDaysofMonth($month, $year) {
-	    
+	function wpsg_getDaysofMonth($month, $year)
+	{
 		$time = mktime(0, 0, 0, $month, 1, $year);
-		 
 		return date('t', $time);
-		
-    }
-		
+	}
+	
 	/**
 	 * Gibt das Upload Verzeichnis zurÃŒck, in dem Daten von wpShopGermany gespeichert werden
@@ -2061,14 +1049,15 @@
 	 * @return string Der absolute Pfad
 	 */
-	function wpsg_getUploadDir($strPathKey = '', $htprotection = true)
-	{
-		
-	    if (strpos($strPathKey, '..')) throw new \Exception(__('UnzulÃ€ssige Pfadangabe!'));
-	    
-		if ($GLOBALS['wpsg_sc']->isMultiBlog()) {
+	function wpsg_getUploadDir($strPathKey = '')
+	{
+		
+		if ($GLOBALS['wpsg_sc']->isMultiBlog())
+		{
 			
 			$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/'.$strPathKey.'/';
 			
-		} else {
+		}
+		else
+		{
 			
 			$path = WP_CONTENT_DIR.'/uploads/wpsg/'.$strPathKey.'/';
@@ -2076,31 +1065,15 @@
 		}
 		
-		if ($strPathKey === '' || $htprotection === false) {
-		    
-		    if (!file_exists($path)) mkdir($path, 0775, true);
-		    		    		    
-        } else {
-		
-		    $GLOBALS['wpsg_sc']->protectDirectory($path);
-		    
-        }
+		if (!file_exists($path))
+		{
+			
+			mkdir($path, 0777, true);
+			
+		}
 		
 		return $path;
 		
 	} // function wpsg_getUploadDir($strPathKey = '')
-
-    /**
-     * Siehe wpsg_getUploadDir
-     * Gibt aber die URL zurÃŒck
-     */
-    function wpsg_getUploadUrl($strPathKey = '', $htprotection = true) {
-
-        $path = wpsg_getUploadDir($strPathKey, $htprotection);
-        $upload_dir = \wp_upload_dir();        
-        
-        return str_replace($upload_dir['basedir'], $upload_dir['baseurl'], $path);
-                
-    }
-
+	
 	/**
 	 * Verschiebt eine hochgeladene Datei  
@@ -2109,5 +1082,5 @@
 	 * @return true or false
 	 */
-	function wpsg_fileUpload($strPathKey = '', $arFile = [])
+	function wpsg_fileUpload($strPathKey = '', $arFile)
 	{
 		
@@ -2125,2 +1098,3 @@
 	} // function wpsg_fileUpload($strPathKey = '', $arFile)
 
+?>
Index: /lib/helper_functions.inc.php
===================================================================
--- /lib/helper_functions.inc.php	(revision 8528)
+++ /lib/helper_functions.inc.php	(revision 5261)
@@ -57,7 +57,6 @@
 			if (!$ok)
 			{
-
-				$file = preg_replace('/(.*)'.WPSG_CONTENTDIR_WP.'/', '/'.WPSG_CONTENTDIR_WP, $file);
-
+	
+				$file = preg_replace('/(.*)wp-content/', '/wp-content', $file);
 				return $wp_filesystem->delete($file, true);
 	
@@ -70,23 +69,27 @@
 		{
 				
-		    $arSubFiles = scandir($file);
-            
-            foreach ($arSubFiles as $subfile) {
-                
-                if (!in_array($subfile, ['.', '..'])) {
-
-                    $ok = wpsg_rrmdir($file."/".$subfile);
-                    if (!$ok) return false;
-                    
-                }
-                
-            }
-		    
+			$dir_hdle = opendir($file);
+	
+			while ($subfile = readdir($dir_hdle))
+			{
+	
+				if (!in_array($subfile, array(".", "..")))
+				{
+	
+					$ok = wpsg_rrmdir($file."/".$subfile);
+					if (!$ok) return false;
+	
+				}
+			  
+			}
+	
+			closedir($dir_hdle);
+			 
 			$ok = @rmdir($file);
-            
+				
 			if (!$ok)
 			{
 	
-				$file = preg_replace('/(.*)'.WPSG_CONTENTDIR_WP.'/', '/'.WPSG_CONTENTDIR_WP, $file);
+				$file = preg_replace('/(.*)wp-content/', '/wp-content', $file);
 				return $wp_filesystem->delete($file, true);
 	
@@ -130,5 +133,5 @@
 		// Jetzt wirds knifflig, mit dem wp_filesystem versuchen
 		// An das wp_filesystem wird alles ab /wp-content ÃŒbergeben
-		$path_wp = preg_replace('/(.*)'.WPSG_CONTENTDIR_WP.'/', '/'.WPSG_CONTENTDIR_WP, $path);
+		$path_wp = preg_replace('/(.*)wp-content/', '/wp-content', $path);
 	
 		// Pfad auftrennen, da wp_filesystem leider nicht rekursiv arbeitet
@@ -163,8 +166,8 @@
 	
 		global $wp_filesystem;
-
+			
 		if (is_file($src))
 		{
-		
+				
 			if (!file_exists(dirname($dst)))
 			{
@@ -187,6 +190,6 @@
 				$target = trailingslashit($wp_filesystem->find_folder($target));
 				
-				$source = preg_replace('/(.*)'.WPSG_CONTENTDIR_WP.'/', '/'.WPSG_CONTENTDIR_WP, $source);
-				$target = preg_replace('/(.*)'.WPSG_CONTENTDIR_WP.'/', '/'.WPSG_CONTENTDIR_WP, $target);
+				$source = preg_replace('/(.*)wp-content/', '/wp-content', $source);
+				$target = preg_replace('/(.*)wp-content/', '/wp-content', $target);
 	
 				return $wp_filesystem->copy($source, $target, true, 0777);
@@ -197,15 +200,15 @@
 				
 		}
-
+	
 		if (is_dir($src) && !file_exists($dst))
 		{
-
+				
 			$ok = wpsg_mkdir($dst);
-			if (!$ok || !is_dir($dst)) die(__('Verzeichnis konnte nicht angelegt werden.', 'wpsg'));  
-
-		}
-
+			if (!$ok) die(__('Verzeichnis konnte nicht angelegt werden.', 'wpsg'));
+				
+		}
+	
 		$dir_hdle = opendir($src);
-
+	
 		while ($file = readdir($dir_hdle))
 		{
@@ -213,5 +216,5 @@
 			if (!in_array($file, array(".", "..")))
 			{
-
+				 
 				$ok = wpsg_copy($src."/".$file, $dst.'/'.$file);
 				if (!$ok) return false;
@@ -263,22 +266,24 @@
 		{
 		
-			$GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_betreff', $_REQUEST['wpsg_'.$key.'_betreff'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$GLOBALS['wpsg_sc']->addTranslationString('wpsg_'.$key.'_betreff', $_REQUEST['wpsg_'.$key.'_betreff'], WPSG_SANITIZE_TEXTFIELD);
-			
-		}
-		
-		if (isset($_REQUEST['wpsg_'.$key.'_absender'])) {
-			
-			$GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_absender', $_REQUEST['wpsg_'.$key.'_absender'], false, false, WPSG_SANITIZE_EMAILNAME);
-			$GLOBALS['wpsg_sc']->addTranslationString('wpsg_'.$key.'_absender', $_REQUEST['wpsg_'.$key.'_absender'], WPSG_SANITIZE_EMAILNAME);
-		}
-
-		if (isset($_REQUEST['wpsg_'.$key.'_empfaenger'])) $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_empfaenger', $_REQUEST['wpsg_'.$key.'_empfaenger'], false, false, WPSG_SANITIZE_EMAILNAME);
-		if (isset($_REQUEST['wpsg_'.$key.'_cc'])) $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_cc', $_REQUEST['wpsg_'.$key.'_cc'], false, false, WPSG_SANITIZE_EMAILNAME);
-		if (isset($_REQUEST['wpsg_'.$key.'_bcc'])) $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_bcc', $_REQUEST['wpsg_'.$key.'_bcc'], false, false, WPSG_SANITIZE_EMAILNAME);
-		if (isset($_REQUEST['wpsg_'.$key.'_text'])) {
-			
-			$GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_text', $_REQUEST['wpsg_'.$key.'_text'], false, false, WPSG_SANITIZE_HTML);
-			$GLOBALS['wpsg_sc']->addTranslationString('wpsg_'.$key.'_text', $_REQUEST['wpsg_'.$key.'_text'], WPSG_SANITIZE_HTML);
+			$GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_betreff', $_REQUEST['wpsg_'.$key.'_betreff']);
+			$GLOBALS['wpsg_sc']->addTranslationString('wpsg_'.$key.'_betreff', $_REQUEST['wpsg_'.$key.'_betreff']);
+			
+		}
+		
+		if (isset($_REQUEST['wpsg_'.$key.'_absender'])) 
+		{
+			
+			$GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_absender', $_REQUEST['wpsg_'.$key.'_absender']);
+			$GLOBALS['wpsg_sc']->addTranslationString('wpsg_'.$key.'_absender', $_REQUEST['wpsg_'.$key.'_absender']);
+		}
+		
+		if (isset($_REQUEST['wpsg_'.$key.'_empfaenger'])) $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_empfaenger', $_REQUEST['wpsg_'.$key.'_empfaenger']);
+		if (isset($_REQUEST['wpsg_'.$key.'_cc'])) $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_cc', $_REQUEST['wpsg_'.$key.'_cc']);
+		if (isset($_REQUEST['wpsg_'.$key.'_bcc'])) $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_bcc', $_REQUEST['wpsg_'.$key.'_bcc']);
+		if (isset($_REQUEST['wpsg_'.$key.'_text']))
+		{
+			
+			$GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_text', $_REQUEST['wpsg_'.$key.'_text']);
+			$GLOBALS['wpsg_sc']->addTranslationString('wpsg_'.$key.'_text', $_REQUEST['wpsg_'.$key.'_text']);
 			
 		}
@@ -302,52 +307,78 @@
 		}
 		
-		// AnhÃ€nge aus Mediathek speichern
-		if (isset($_REQUEST['wpsg_'.$key.'_mediaattachment'])) {
-		    
-		    $GLOBALS['wpsg_sc']->update_option('wpsg_'.$key.'_mediaattachment', $_REQUEST['wpsg_'.$key.'_mediaattachment']);
-		    
-        }
-				
 	} // function wpsg_saveEMailConfig($key)
-
+	
 	/**
 	 * Rendert ein Feld fÃŒr die E-Mail Konfiguration
-	 *
+	 * 
 	 * @param unknown $key
-	 * @param string  $strTitle
-	 * @param string  $notice
-	 *
-	 * @param bool    $bTo
-	 * @param bool    $bAttachment
-	 *
-	 * @return false|string
+	 * @param string $bTo
+	 * @param string $notice
 	 */
-	function wpsg_drawEMailConfig($key, $strTitle = '', $notice = '', $bTo = false, $bAttachment = false, $strTemplate = false)
-	{
-		
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_key'] = $key;
-		$TC->view['field_title'] = $strTitle;
-		$TC->view['field_notice'] = $notice;
-		$TC->view['field_to'] = $bTo;
-		$TC->view['field_attachment'] = $bAttachment;
-        $TC->view['strTemplate'] = $strTemplate;
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/emailconf.phtml', false);
-				
+	function wpsg_drawEMailConfig($key, $strTitle = '', $notice = '', $bTo = false, $bAttachment = false)
+	{
+		
+		$strOut  = '';
+		
+		$strOut .= '<div class="wpsg_mail_head head" id="mail_'.$key.'">';
+		$strOut .= '<div class="title">';
+		$strOut .= '<div class="fulltab">'.$strTitle.'</div>';
+		$strOut .= '</div>';
+		$strOut .= '</div>';
+		
+		$strOut .= '<div class="content wpsg_mail_content">';
+		
+		$strOut .= wpsg_drawForm_Input('wpsg_'.$key.'_betreff', __('Betreff', 'wpsg'), $GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_betreff')); 
+		$strOut .= wpsg_drawForm_Input('wpsg_'.$key.'_absender', __('Absender', 'wpsg'), $GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_absender'));
+		
+		if ($bTo === true)
+		{
+			
+			$strOut .= wpsg_drawForm_Input('wpsg_'.$key.'_empfaenger', __('EmpfÃ€nger', 'wpsg'), $GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_empfaenger')); 
+			
+		}
+		
+		$strOut .= wpsg_drawForm_Input('wpsg_'.$key.'_cc', __('CC', 'wpsg'), $GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_cc')); 
+		$strOut .= wpsg_drawForm_Input('wpsg_'.$key.'_bcc', __('BCC', 'wpsg'), $GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_bcc')); 				 
+		
+		if ($bAttachment === true)
+		{
+			
+			$strOut .= wpsg_drawForm_Upload('wpsg_'.$key.'_attachfile', __('Mailanhang', 'wpsg'), '', '43', '100000', ''); 
+			$strOut .= '<br />';
+			$strOut .= '<div class="wpsg_hinweis">';
+			$strOut .= '<strong>'.__('Aktueller Anhang', 'wpsg').': </strong>'.((wpsg_isSizedString($GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_attachfile')))?$GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_attachfile'):'keiner');
+			$strOut .= ((wpsg_isSizedString($GLOBALS['wpsg_sc']->get_option('wpsg_kundenmail_attachfile')))?'<a class="wpsg_icon wpsg_icon_right wpsg_icon_remove" titel="'.__('Datei entfernen', 'wpsg').'" href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&amp;subaction='.$_REQUEST['subaction'].'&amp;cmd=del_attach_file"></a>':'');
+			$strOut .= '</div><br />';
+			
+		}
+		
+		// RTE
+		ob_start();
+		wp_editor($GLOBALS['wpsg_sc']->get_option('wpsg_'.$key.'_text'), 'wpsg_'.$key.'_text');
+		$rte_content = ob_get_contents();
+		ob_end_clean();
+		
+		$strOut .= '<div class="wpsg_form_field">';
+		$strOut .= '<div class="wpsg_form_left"><label>'.__('Text unter der E-Mail', 'wpsg').'</label></div>';
+		$strOut .= '<div class="wpsg_form_right"></div><div class="wpsg_clear"></div>';
+		$strOut .= '</div>';
+		$strOut .= $rte_content;
+		
+		if (wpsg_isSizedString($notice))
+		{
+						
+			$strOut .= '<br /><div class="wpsg_hinweis">'.$notice.'</div>';
+		
+		}
+			
+		$strOut .= '</div><br />';
+		
+		return $strOut;
+		
 	} // function wpsg_drawEMailConfig($key)
 	
-	function wpsg_drawForm_getID($field_name)
-	{
-		
-		$field_id = $field_name;
-		$field_id = preg_replace('/\[|\]/', '', $field_id);
-		
-		return $field_id;
-		
-	}
-	
-	function wpsg_drawForm_Button($field_name, $field_label, ?array $conf = []) {
+	function wpsg_drawForm_Button($field_name, $field_label, $conf)
+	{
 		
 		if (wpsg_isSizedString($conf['id'])) $field_id = $conf['id'];
@@ -367,10 +398,10 @@
 				
 		$strReturn = '
-			<div class="wpsg_form_field" '.((isset($conf['wrap_id']))?'id="'.$conf['wrap_id'].'"':'').'">
+			<div class="wpsg_form_field">
 				<div class="wpsg_form_left">
 					<label for="'.$field_id.'">'.$field_label.'</label>
 				</div>
 				<div class="wpsg_form_right">
-					<input '.((isset($conf['field_id']))?'id="'.$conf['field_id'].'"':'').' type="button" class="button '.$button_class.'" onclick="'.$button_onclick.'" value="'.$button_text.'" name="'.$field_name.'" />
+					<input type="button" class="button '.$button_class.'" onclick="'.$button_onclick.'" value="'.$button_text.'" name="'.$field_name.'" />
 				</div>
 				<div class="wpsg_clear"></div>
@@ -385,118 +416,153 @@
 	{
 		
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_name'] = $field_name;
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_id'] = wpsg_getStr($conf['id'], wpsg_drawForm_getID($field_name));
-		$TC->view['field_checked'] = $field_checked;
-		$TC->view['field_config'] = $conf;
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/checkbox.phtml', false);
-		 
+		$strReturn = '';
+		
+		if (isset($conf['id']))
+		{
+
+			$field_id = $conf['id'];
+			
+		}
+		else
+		{
+		
+			$field_id = $field_name;
+			
+		}
+		
+		$att = '';
+		
+		if (isset($conf['disabled']) && $conf['disabled'] === true)
+		{
+			
+			$att .= ' disabled="disabled" ';
+			
+		}
+		
+		if (!isset($conf['value'])) $value = '1'; else $value = $conf['value'];
+		
+		$tabindex = 0;
+		if (!wpsg_isSizedString($conf['tabindex']))
+		{
+				
+			wpsg_addSet($GLOBALS['wpsg']['tabindex'], 1);
+			$tabindex = $GLOBALS['wpsg']['tabindex'];
+				
+		}
+		else
+		{
+				
+			$tabindex = $conf['tabindex'];
+				
+		}
+		
+		$att .= ' tabindex="'.$tabindex.'" ';
+		
+		if (isset($conf['fullrow']) && $conf['fullrow'] === true)
+		{
+			
+			$strReturn .= '
+				<div class="wpsg_form_field wpsg_form_field_fullrow">
+					<input type="hidden" name="'.$field_name.'" value="0" />					
+					<label for="'.$field_id.'">
+						<input id="'.$field_id.'" type="checkbox" class="checkbox" '.$att.' name="'.$field_name.'" value="'.$value.'" '.($field_checked?'checked="checked"':'').' />
+						'.$field_label.'
+					</label>
+			';
+			
+			if (isset($conf['help']))
+			{
+					
+				$strReturn .= '<a href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" class="wpsg_form_help"></a>';
+			
+			}
+			
+			$strReturn .= '
+					<div class="clear"></div>
+				</div>
+			';
+			
+		}
+		else if (isset($conf['labelright']) && $conf['labelright'] === true)
+		{
+
+			$strReturn = '
+				<div class="wpsg_form_field">
+					<div class="wpsg_form_left">&nbsp;</div>
+					<div class="wpsg_form_right">
+						<input type="hidden" name="'.$field_name.'" value="0" />
+						<input id="'.$field_id.'" type="checkbox" class="checkbox" '.$att.' name="'.$field_name.'" value="'.$value.'" '.($field_checked?'checked="checked"':'').' />
+						<label for="'.$field_id.'">'.$field_label.((isset($conf['noDoubleDot']))?'':':').'</label>
+			';
+				
+			if (isset($conf['help']))
+			{
+					
+				$strReturn .= '<a href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" class="wpsg_form_help"></a>';
+			
+			}
+				
+			if (isset($conf['hint']))
+			{
+			
+				if (substr($conf['hint'], 0, 7) == 'nohspc_')
+					$strReturn .= '<div class="wpsg_clear"></div><p class="wpsg_hinweis">'.substr($conf['hint'], 7).'</p>';
+				else
+					$strReturn .= '<div class="wpsg_clear"></div><p class="wpsg_hinweis">'.wpsg_hspc($conf['hint']).'</p>';
+			
+			}
+			
+			$strReturn .= '
+						</div>
+					<div class="wpsg_clear"></div>
+				</div>
+			';
+			
+		}
+		else
+		{
+		
+			$strReturn = '
+				<div class="wpsg_form_field">
+					<div class="wpsg_form_left">
+						<label for="'.$field_id.'">'.$field_label.((isset($conf['noDoubleDot']))?'':':').'</label>
+					</div>
+					<div class="wpsg_form_right">
+						<input type="hidden" name="'.$field_name.'" value="0" />
+						<input id="'.$field_id.'" type="checkbox" class="checkbox" '.$att.' name="'.$field_name.'" value="'.$value.'" '.($field_checked?'checked="checked"':'').' />
+			';
+			
+			if (isset($conf['help']))
+			{
+			
+				$strReturn .= '<a href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" class="wpsg_form_help"></a>';
+	
+			}
+			
+			if (isset($conf['hint']))
+			{
+				
+				if (substr($conf['hint'], 0, 7) == 'nohspc_')
+					$strReturn .= '<div class="wpsg_clear"></div><p class="wpsg_hinweis">'.substr($conf['hint'], 7).'</p>';
+				else
+					$strReturn .= '<div class="wpsg_clear"></div><p class="wpsg_hinweis">'.wpsg_hspc($conf['hint']).'</p>';
+				
+			}
+	
+			$strReturn .= '
+						</div>
+					<div class="wpsg_clear"></div>
+				</div>
+			';
+			
+		}
+		
+		return $strReturn;
+		
 	} // function wpsg_drawForm_Checkbox($field_name, $field_label, $conf = array())
 
-	function wpsg_drawForm_AdminboxStart($title = false, $wrap_class = '', $arConf = array()) {
-
-        $strDisplayBody = '';
-        $strDisplayHeader = '';
-        $strDisplayWrap = wpsg_getStr($arConf['style']);
-
-        $strOnClick = '';
-
-        if (wpsg_isTrue($arConf['collapsed'])) $strDisplayBody .= 'display:none;';
-
-        if (wpsg_isTrue($arConf['collapsable'])) {
-
-            $strOnClick = 'jQuery(this).next().toggle(); return false;';
-            $strDisplayHeader .= 'cursor:pointer;';
-
-        }
-
-		echo '<div class="panel panel-default '.$wrap_class.'" style="'.$strDisplayWrap.'">';
-
-		if (wpsg_isSizedString($title)) {
-
-			echo '<div class="panel-heading clearfix" style="'.$strDisplayHeader.'" onclick="'.$strOnClick.'">';
-			echo '<h3 class="panel-title">';
-			echo $title;
-			echo '</h3>';
-			echo '</div>';
-
-		}
-
-		echo '<div class="panel-body '.wpsg_getStr($arConf['panel-body-class']).'" style="'.$strDisplayBody.'">';
-
-	}
-	
-	function wpsg_drawForm_AdminboxEnd()
-	{
-		
-		echo '</div>';
-		echo '</div>';
-	
-	}
-	
-	function wpsg_drawForm_TextStart() 
-	{
-		
-		ob_start();
-		
-	} // function wpsg_drawForm_TextStart()
-	
-	function wpsg_drawForm_TextEnd($field_label = '', $field_config = array())
-	{
-	
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_value'] = ob_get_contents();
-		$TC->view['field_config'] = $field_config;
-		
-		ob_end_clean();
-
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/text.phtml', false);
-	
-	} // function wpsg_drawForm_TextEnd($field_label)
-	
-	function wpsg_drawForm_Text($field_label, $field_value, $field_id = false, $conf = array()) {
-	 
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_value'] = $field_value;
-		$TC->view['field_config'] = $conf;
-		$TC->view['field_id'] = $field_id;
-		
-		if (wpsg_isSizedArray($TC->view['field_config']['inlineEdit_source'])) $TC->view['field_config']['inlineEdit_source'] = wpsg_prepare_for_inlineEdit($TC->view['field_config']['inlineEdit_source']);
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/text.phtml', false);
-		
-	}
-	
-	function wpsg_drawForm_SubmitButton($field_label)
-	{
-		
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_label'] = $field_label; 
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/input_submit.phtml', false);
-		
-	}
-	
-	function wpsg_drawForm_Input($field_name, $field_label, $field_value, ?array $conf = []): string {
-				
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_name'] = $field_name;
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_id'] = wpsg_drawForm_getID($field_name);
-		$TC->view['field_value'] = $field_value;
-		$TC->view['field_config'] = $conf;
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/input.phtml', false);
-		
-		/*
+	function wpsg_drawForm_Input($field_name, $field_label, $field_value, $conf = array())
+	{
+		
 		$field_id = $field_name;
 		$field_id = preg_replace('/\[|\]/', '', $field_id);
@@ -650,5 +716,5 @@
 		
 		return $strReturn;
-		*/		
+		
 		
 	} // function wpsg_drawForm_Input($field_name, $field_label, $field_value, $conf = array())
@@ -657,13 +723,39 @@
 	{
 		
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_name'] = $field_name;
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_id'] = wpsg_drawForm_getID($field_name);
-		$TC->view['field_value'] = $field_value;
-		$TC->view['field_config'] = $conf;
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/textarea.phtml', false);
+		$field_id = $field_name;
+		
+		$strReturn = '
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label for="'.$field_id.'">'.$field_label.':</label>
+				</div>
+				<div class="wpsg_form_right">
+					<textarea id="'.$field_id.'" name="'.$field_name.'">'.wpsg_hspc($field_value).'</textarea>
+		';
+		
+		if (isset($conf['help']))
+		{
+		
+			$strReturn .= '<a href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field='.wpsg_hspc($conf['help']).'" class="wpsg_form_help"></a>';
+
+		}
+		
+		if (isset($conf['hint']))
+		{
+		
+			if (substr($conf['hint'], 0, 7) == 'nohspc_')
+				$strReturn .= '<div class="wpsg_clear"></div><p class="wpsg_hinweis">'.substr($conf['hint'], 7).'</p>';
+			else
+				$strReturn .= '<div class="wpsg_clear"></div><p class="wpsg_hinweis">'.wpsg_hspc($conf['hint']).'</p>';
+		
+		}
+		
+		$strReturn .= '
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+		';
+		
+		return $strReturn;
 		
 	} // function wpsg_drawForm_Textarea($field_name, $field_label, $field_value, $conf = array())
@@ -671,18 +763,4 @@
 	function wpsg_drawForm_Upload($field_name, $field_label, $field_value = false, $size = '50', $maxlength = '100000', $conf = array())
 	{
-		
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_name'] = $field_name;
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_id'] = wpsg_drawForm_getID($field_name);
-		$TC->view['field_value'] = $field_value;
-		$TC->view['field_size'] = $size;
-		$TC->view['field_maxLength'] = $maxlength;
-		$TC->view['field_config'] = $conf;
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/upload.phtml', false);
-		
-		/*
 		$field_id = $field_name;
 		
@@ -717,46 +795,10 @@
 		
 		return $strReturn;
-		*/
 		
 	}
 	
-	function wpsg_drawForm_Radio($field_name, $field_label, $field_values, $field_value, $conf = array())
-	{
-	    
-	    
-	    
-	}
-	
-	function wpsg_drawForm_Select($field_name, $field_label, $field_values, $field_value, $conf = array()) {
-		
-		$TC = new wpsg_SystemController();
-		
-		$TC->view['field_name'] = $field_name;
-		$TC->view['field_label'] = $field_label;
-
-		if (wpsg_isSizedString($conf['id'])) $TC->view['field_id'] = $conf['id'];
-		else $TC->view['field_id'] = wpsg_drawForm_getID($field_name);
-
-		$TC->view['field_value'] = $field_value;
-		$TC->view['field_values'] = $field_values;
-		$TC->view['field_config'] = $conf;
-		$TC->view['atts_select'] = '';
-
-		if (wpsg_isSizedString($conf['onchange'])) {
-
-			$TC->view['atts_select'] .= ' onchange="'.$conf['onchange'].'" ';
-
-		}
-
-		if (wpsg_isSizedInt($conf['multiple'])) {
-		
-			$TC->view['field_name'] .= '[]';
-			$TC->view['atts_select'] .= ' size="'.$conf['multiple'].'" multiple=""multiple" ';
-			
-		}
-		
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/select.phtml', false);
-	
-		/*
+	function wpsg_drawForm_Select($field_name, $field_label, $field_values, $field_value, $conf = array())
+	{
+		
 		if (wpsg_isSizedString($conf['id']))
 		{
@@ -909,5 +951,4 @@
 		
 		return $strReturn;
-		*/
 		
 	} // function wpsg_drawForm_Select($field_name, $field_label, $field_values, $field_value, $conf = array())
@@ -977,19 +1018,4 @@
 		
 	} // function wpsg_drawForm_Date($field_name, $field_label, $field_value, $conf = array())
-
-	function wpsg_drawForm_Link($field_name, $field_label, $field_link, $conf = array())
-	{
-	
-		$TC = new wpsg_SystemController();
-	
-		$TC->view['field_name'] = $field_name;
-		$TC->view['field_label'] = $field_label;
-		$TC->view['field_id'] = wpsg_drawForm_getID($field_name);
-		$TC->view['field_link'] = $field_link;
-		$TC->view['field_config'] = $conf;
-	
-		return $TC->render(WPSG_PATH_VIEW.'admin/form/link.phtml', false);
-	
-	} // function wpsg_drawForm_Link($field_name, $field_label, $field_link, $conf = array())
 	
 ?>
Index: /lib/install.php
===================================================================
--- /lib/install.php	(revision 8528)
+++ /lib/install.php	(revision 5261)
@@ -26,26 +26,18 @@
 	$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
 	  	id mediumint(9) NOT NULL AUTO_INCREMENT,		
-	  	cdate datetime NOT NULL,
-	  	disabled INT(11) NOT NULL,
+	  	cdate datetime NOT NULL,		  
 	  	partikel INT(11) NOT NULL,
 	  	name VARCHAR(255) NOT NULL,	
 	  	detailname VARCHAR(500) NOT NULL,
-		shortdesc VARCHAR(1500) NOT NULL,
 	  	anr VARCHAR(100) NOT NULL,
 	  	typ VARCHAR(100) NOT NULL, 
 	  	preis DOUBLE(10,2) NOT NULL,
-		oldprice DOUBLE(10,2) NOT NULL,
 		mwst_key VARCHAR(1) NOT NULL,
 	  	beschreibung longtext NOT NULL,
-		longdescription longtext NOT NULL,
-		longdescription_addon longtext NOT NULL,
-		productfeatures longtext NOT NULL,
-		moreinfos longtext NOT NULL,
-        moreinfos2 longtext NOT NULL,
 	  	pgruppe INT(11) NOT NULL,
 	  	ptemplate_file VARCHAR(255) NOT NULL,
 	  	deleted INT(1) NOT NULL,
 	  	lang_parent INT(11) NOT NULL,
-	  	lang_code VARCHAR(11) NOT NULL COMMENT 'Der Language Code der Ãbersetzung',
+	  	lang_locale VARCHAR(11) NOT NULL,
 	  	rabatt VARCHAR(255) NOT NULL,	  	
 	  	posturl VARCHAR(500) NOT NULL,
@@ -57,37 +49,12 @@
 		euleistungsortregel INT(1) NOT NULL,
 		basket_multiple INT(1) NOT NULL, 
-		rating INT(1) NOT NULL,
-	  	postids VARCHAR(255) NOT NULL,	  	 
 	  	PRIMARY KEY  (id),
 	  	KEY lang_parent (lang_parent)
 	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
 	
-	$b = dbDelta($sql);
-
-	/**
-	 * Adresstabelle
-	 */
-	
-	$sql = "CREATE TABLE ".WPSG_TBL_ADRESS." (
-		id mediumint(9) NOT NULL AUTO_INCREMENT,
-		cdate datetime NOT NULL,
-		title VARCHAR(50) NOT NULL,
-		name VARCHAR(255) NOT NULL,	   			
-   		vname VARCHAR(255) NOT NULL,
-   		firma VARCHAR(255) NOT NULL,
-   		fax VARCHAR(255) NOT NULL,
-   		strasse VARCHAR(255) NOT NULL,
-   		nr VARCHAR(255) NOT NULL COMMENT 'Hausnummer Optional / Siehe Kundeneinstellungen',
-   		plz VARCHAR(255) NOT NULL,
-   		ort VARCHAR(255) NOT NULL,
-   		land VARCHAR(100) NOT NULL,
-   		tel VARCHAR(100) NOT NULL, 		
-   		PRIMARY KEY  (id)
-	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
 	dbDelta($sql);
  	
 	/**
-	 * Kundentabelle ALT
+	 * Kundentabelle
 	 */
 	$sql = "CREATE TABLE ".WPSG_TBL_KU." (
@@ -95,17 +62,20 @@
    		knr VARCHAR(255) NOT NULL,
    		paypal_payer_id VARCHAR(255) NOT NULL,
+   		title VARCHAR(50) NOT NULL,
+   		name VARCHAR(255) NOT NULL,	   			
+   		vname VARCHAR(255) NOT NULL,
+   		email VARCHAR(255) NOT NULL,
+   		firma VARCHAR(255) NOT NULL,   		
+   		fax VARCHAR(255) NOT NULL,
+   		strasse VARCHAR(255) NOT NULL,
+   		plz VARCHAR(255) NOT NULL,
+   		ort VARCHAR(255) NOT NULL,
+   		land VARCHAR(100) NOT NULL, 
+   		tel VARCHAR(100) NOT NULL,
    		geb DATE NOT NULL,
-   		status VARCHAR(255) NOT NULL,
-   		email VARCHAR(500) NOT NULL COMMENT 'E-Mail Adresse des Kunden',
-   		email_einvoice VARCHAR(500) NOT NULL COMMENT 'E-Mail Adresse fÃŒr eRechnung',
-   		leitweg_id VARCHAR(500) NOT NULL COMMENT 'Leitweg-ID fÃŒr eRechnung',
-   		ustidnr VARCHAR(100) NOT NULL,
+   		ustidnr VARCHAR(100) NOT NULL,   		
    		custom TEXT NOT NULL,
-   		comment TEXT NOT NULL,
-   		adress_id INT(11) NOT NULL COMMENT 'Link zu WPSG_TBL_ADRESS (Kundenadresse)',
-   		deleted INT(11) NOT NULL COMMENT 'Markierung fÃŒr gelÃ¶schte Kunden',
-   		invisible INT(1) DEFAULT 0 NOT NULL COMMENT '1=unvollstÃ€ndige Bestellung',
-		KEY adress_id (adress_id),
-   		PRIMARY KEY  (id)
+   		PRIMARY KEY  (id),
+   		KEY land (land)
    	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
    	
@@ -125,9 +95,26 @@
    		price_gesamt DOUBLE(10,4) NOT NULL,
 		price_gesamt_netto DOUBLE(10,4) NOT NULL,
-		price_gesamt_brutto DOUBLE(10,4) NOT NULL,   	 
-		price_frontend INT(1) NOT NULL,   		
-		topay DOUBLE(10,4) NOT NULL COMMENT '',   		
-		topay_netto DOUBLE(10,4) NOT NULL COMMENT 'Zahlbetrag Netto',
-		topay_brutto DOUBLE(10,4) NOT NULL COMMENT 'Zahlbetrag Brutto', 
+		price_gesamt_brutto DOUBLE(10,4) NOT NULL,
+   		price_shipping DOUBLE(10,4) NOT NULL,
+		price_shipping_netto DOUBLE(10,4) NOT NULL,
+		price_shipping_brutto DOUBLE(10,4) NOT NULL,			
+   		price_payment DOUBLE(10,4) NOT NULL,
+		price_payment_netto DOUBLE(10,4) NOT NULL,
+		price_payment_brutto DOUBLE(10,4) NOT NULL,
+   		price_rabatt DOUBLE(10,4) NOT NULL,
+   		price_gs DOUBLE(10,4) NOT NULL,
+   		mwst_payment DOUBLE(10,4) NOT NULL,
+   		mwst_shipping DOUBLE(10,4) NOT NULL,
+   		type_shipping VARCHAR(255) NOT NULL,
+   		type_payment VARCHAR(255) NOT NULL,
+   		shipping_title VARCHAR(255) NOT NULL,
+   		shipping_vname VARCHAR(255) NOT NULL,
+		shipping_name VARCHAR(255) NOT NULL,				
+	  	shipping_strasse VARCHAR(255) NOT NULL,
+	  	shipping_hausnr VARCHAR(255) NOT NULL,
+	  	shipping_plz VARCHAR(255) NOT NULL,
+	  	shipping_ort VARCHAR(255) NOT NULL,
+	  	shipping_land VARCHAR(100) NOT NULL,
+	  	shipping_firma VARCHAR(255) NOT NULL,
 	  	bname VARCHAR(500) NOT NULL,
 		bblz VARCHAR(500) NOT NULL,
@@ -137,75 +124,21 @@
 		bvars TEXT NOT NULL,
 		pvars text NOT NULL,
-   		status VARCHAR(255) NOT NULL,
+   		status int(5) NOT NULL,
    		transaction varchar(255) NOT NULL,   			
    		dp_cron_planed datetime NOT NULL,
-   		dp_cron_done datetime NOT NULL,   		 
-   		kleinunternehmer INT(1) NOT NULL COMMENT 'DEPRECATED Durch taxmode ersetzt',
-   		custom_data MEDIUMBLOB NOT NULL,
+   		dp_cron_done datetime NOT NULL,
+   		gs_id INT(11) NOT NULL,
+   		kleinunternehmer INT(1) NOT NULL,
+   		custom_data TEXT NOT NULL,
    		admincomment TEXT NOT NULL,
    		language VARCHAR(10) NOT NULL,
-   		adress_id INT(11) NOT NULL COMMENT 'Link zu WPSG_TBL_ADRESS (Rechnungsadresse)',
-   		shipping_adress_id INT(11) NOT NULL COMMENT 'Link zu WPSG_TBL_ADRESS (Lieferanschrift)',   		   		
-   		be_bruttonetto INT(1) NOT NULL COMMENT 'Preisanzeige Backend',
-   		fe_bruttonetto INT(1) NOT NULL COMMENT 'Preisanzeige Frontend',   		   		
-   		shipping_set VARCHAR(255) NOT NULL COMMENT 'Versandkosten evtl. mit %',
-   		shipping_key VARCHAR(255) NOT NULL COMMENT 'AusgewÃ€hlte Versandart',
-   		shipping_bruttonetto INT(1) NOT NULL COMMENT 'Versandkosten in Brutto/Netto',
-   		shipping_tax_key VARCHAR(10) COMMENT 'SteuerschlÃŒssel der Versandart',   		
-   		type_shipping VARCHAR(255) COMMENT 'DEPRECATED durch shipping_key ersetzt',
-   		price_shipping DOUBLE(10,4) COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		price_shipping_netto DOUBLE(10,4) COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		price_shipping_brutto DOUBLE(10,4) COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		mwst_shipping DOUBLE(10,4) COMMENT 'DEPRECATED durch shipphig_tax ersetzt',	   		
-   		payment_set VARCHAR(255) COMMENT 'Zahlungsarten evtl. mit %',
-   		payment_key VARCHAR(255) COMMENT 'AusgewÃ€hlte Zahlungsart',
-   		payment_bruttonetto INT(1) COMMENT 'Zahlungskoten in Brutto/Netto',
-   		payment_tax_key VARCHAR(10) COMMENT 'SteuerschlÃŒssel der Zahlungsart',   		
-   		type_payment VARCHAR(255) COMMENT 'DEPRECATED durch payment_key ersetzt',
-   		price_payment DOUBLE(10,4) COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		price_payment_netto DOUBLE(10,4) COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		price_payment_brutto DOUBLE(10,4) COMMENT 'DEPRECATED sollte nicht verwendet werden',
-   		mwst_payment DOUBLE(10,4) COMMENT 'DEPRECATED durch payment_tax ersetzt',   		
-   		discount_set VARCHAR(255) COMMENT 'Rabattwert aus Backend',
-   		discount_bruttonetto INT(1) COMMENT 'Brutto/Netto Rabatt',
-   		discount_tax_key VARCHAR(10) COMMENT 'SteuerschlÃŒssel Rabatt',   		
-   		price_rabatt DOUBLE(10,4) NOT NULL COMMENT 'DEPRECATED',
-   		price_rabatt_netto DOUBLE(10,4) NOT NULL COMMENT 'DEPRECATED',
-   		price_rabatt_brutto DOUBLE(10,4) NOT NULL COMMENT 'DEPRECATED',   		
-   		voucher_tax_key VARCHAR(10) COMMENT 'SteuerschlÃŒssel Gutschein',   		
-   		price_gs DOUBLE(10,4) NOT NULL COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		price_gs_netto DOUBLE(10,4) NOT NULL COMMENT 'DEPRECATED sollte nicht verwendet werden',
-		price_gs_brutto DOUBLE(10,4) NOT NULL COMMENT 'DEPRECATED sollte nicht verwendet werden',
-   		gs_set VARCHAR(100) NOT NULL COMMENT 'Eventuell in % (Wert des Gutscheins)',
-   		gs_tax_key VARCHAR(10) NOT NULL COMMENT 'Steuersatz des Gutscheins',
-   		voucher_bruttonetto INT(1) COMMENT 'Brutto/Netto Gutschein',
-   		gs_id INT(11) NOT NULL,
-   		gs_code VARCHAR(1000) NOT NULL COMMENT 'Der Gutscheincode',   		   		   		
-   		shop_country_id INT(11) COMMENT 'ID des Landes vom Shop',
-   		shop_country_tax INT(1) COMMENT 'MwSt. Grundlage',
-   		shop_country_tax_a DOUBLE(10,4) COMMENT 'Steuersatz A',
-   		shop_country_tax_b DOUBLE(10,4) COMMENT 'Steuersatz B',
-   		shop_country_tax_c DOUBLE(10,4) COMMENT 'Steuersatz C',
-   		shop_country_tax_d DOUBLE(10,4) COMMENT 'Steuersatz D',   		
-   		target_country_id INT(11) COMMENT 'ID des Landes vom Zie',
-   		target_country_tax INT(1) COMMENT 'MwSt. Grundlage',
-   		target_country_tax_a DOUBLE(10,4) COMMENT 'Steuersatz A',
-   		target_country_tax_b DOUBLE(10,4) COMMENT 'Steuersatz B',
-   		target_country_tax_c DOUBLE(10,4) COMMENT 'Steuersatz C',
-   		target_country_tax_d DOUBLE(10,4) COMMENT 'Steuersatz D',
-   		calculation INT(1) COMMENT '1 wenn die Bestellung mit der neuen Calculation Klasse berechnet wurde',
-   		tax_mode INT(1) COMMENT 'Art der Besteuerung Kleinunternehmer/1, Endkunden/2, Firmenkunden/3',
-   		secret VARCHAR(255) COMMENT 'Zufallszahl',
-   		ext_payed INT(1) COMMENT '1 wenn die Bestellung ÃŒber einen Zahlungsprovider als gezahlt gemeldet wurde',
-   		KEY adress_id (adress_id),
-   		KEY shipping_adress_id (shipping_adress_id),
+   		PRIMARY KEY  (id),
    		KEY k_id (k_id),
    		KEY gs_id (gs_id),
-   		KEY status (status),
-   		PRIMARY KEY  (id)
+   		KEY shipping_land (shipping_land)
    	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-	 	 
-	dbDelta($sql);
-		
+	
+	dbDelta($sql);
+	
 	/**
 	 * Tabelle fÃŒr die bestellten Produkte
@@ -214,7 +147,5 @@
    		id mediumint(9) NOT NULL AUTO_INCREMENT,
    		o_id int(25) NOT NULL,
-   		p_id int(25) NOT NULL,   		
-   		product_set VARCHAR(255) COMMENT 'Preis des Produktes im Backend',
-   		product_bruttonetto INT(1) COMMENT 'Preiseinstellung Brutto/Netto',   		   		
+   		p_id int(25) NOT NULL,
 		productkey varchar(255) NOT NULL,
 		product_index int(11) NOT NULL,
@@ -229,5 +160,4 @@
 		allowedpayments VARCHAR( 255 ) NOT NULL, 
 		allowedshipping VARCHAR( 255 ) NOT NULL,
-		euleistungsortregel INT(1) NOT NULL,
 		PRIMARY KEY  (id),
    		KEY o_id (o_id),
@@ -244,5 +174,4 @@
 		name VARCHAR(255) NOT NULL,
 		innereu int(1) NOT NULL,
-		shippingpreset varchar(100) NOT NULL,
 		param TEXT NOT NULL,
 		PRIMARY KEY  (id)		
Index: /lib/jqplot/changes.txt
===================================================================
--- /lib/jqplot/changes.txt	(revision 5261)
+++ /lib/jqplot/changes.txt	(revision 5261)
@@ -0,0 +1,398 @@
+Title: Change Log
+
+1.0.5:
+* Updated to jQuery 1.9
+
+1.0.0b2:
+* Major improvements in memory usage:
+** Merged in changes from Timo Besenruether to reuse canvas elements and improve 
+   memory performance.
+** Fixed all identifiable DOM leaks.
+** Mergged in changes from cguillot for memory improvements in IE < 9.
+* Added vertical and dashed vertical line support for canvas overlay.
+* Fixed bug where initially hidden plots would not display.
+* Fixed bug with point labels and null data points.
+* Updated to jQuery 1.6.1.
+* Improved pie slice margin calculation and fixed slice margin and pie positioning 
+  with small slices.
+* Improved bar renderer so bars always start at 0 if:
+** The axis is a linear axis (not log/date).
+** There are no other line types besides bars attached to the axis.
+** The data on the axis is all >= 0.
+** The user has not specified a pad, padMin or forceTickAt0 = true option.
+* Modified tick prefix behavious so prefix no added to all ticks, even if format 
+  string is specified.
+* Fix to ensure original tick formats are applied when zooming and resetting 
+  zoom.
+* Updated auto tick format string so format adjusted when zooming.
+* Modified auto tick computation to put less ticks on small plots and more
+  ticks on large plots.
+* Update bubble render to support gradients in IE 9.
+
+1.0.0b1:
+* Much improved tick generation algorithm to get precise rounded 
+  tick values (Thanks Scott Prahl!).
+* Auto compute tick format string if none is provided.
+* Much better "slicing" of pie charts when using "sliceMargin" option to set
+  a gap between the slices.
+* Expanded canvasOverlay plugin to create arbitrary dashed and solid 
+  horizontal and vertical lines on top of plot.
+* Added defaultColors and defaultNegativeColors options to $.jqplot.config.
+* Fixed issue #318, highlighter & bar renderer incompatability.
+* Improve highlighter tooltip positioning with negative bars.
+* Fixed #305, mispelling of jqlotDragStart and jqlotDragStop.  MUST NOW BIND
+  TO jqplotDragStart and jqplotDragStop.
+* Fixed #290, some variables left in global scope.
+* Fixed #289, OHLC line widths hard coded at 1.5. Now set by lineWidth option.
+* Fixed #296 for determining databounds on log axes.
+* Updated to jQuery 1.5.1
+* Fixed waterfall plot to ensure first and last bars always fill to zero.
+* Added lineJoin and lineCap option to series lines.
+* Bar widths now based on width of grid, not plot target for better scaling.
+* Added looseZoom option to cursor so zooming can produce well rounded ticks.
+* Added forceTickAt0 and forceTickAt100 options to ensure there will always
+  be a tick at 0 or 100 in the plot.
+* Fixed bug where cursor legend didn't honor series showLabel option.
+
+
+1.0.0a:
+
+* Series can now be moved forward or backward in stack to e.g. bring a line
+  forward when mousing over a point.
+* Can now move outside of grid area while zooming.  Can have zoom
+  constrained to grid area or allow zooming outside.
+* Fixed issue #142 with tooltip drawn on top of event canvas, hiding
+  mouse events.
+* Fixed #147 where pie slices with 0 value not rendering properly in IE.
+* Fixed #130 where stack data not sorted properly.
+* Fixed bug with null values not handled properly in category axes.
+* Fixed #156 where pie charts not rendering on QTWebKit.
+* Now using feature detection for canvas and canvas text capability
+  rather than browser version.
+* Added enahncedLegendRenderer plugin to allow multi row/column legends
+  and clickable labels to show/hide series.
+* Added fillToValue option to allow filled line plot to fill to an
+  arbitrary value.
+* Added block plot plugin.
+* Added funnel type charts.
+* Added meter gauge type charts.
+* Added plot theming support.
+* $.jqplot.config.enablePlugins now false by default.
+* Implemented highlighting on bar, pie, donut, funnel, etc. charts.
+* Fix to pointlabels plugin to align labels properly on multi series plots.
+* Added custom error handling to display error message in plot area.
+* Fixed issue where would call to draw grid border of 0 width would
+  result in a default border being drawn.
+* Added options to place legend outside of grid and shrink grid so everything
+  stays within plot div.
+* Fixed bug in color generator so now calls to get() continually cycle
+  through colors just like next().
+* Added defaultAxisStart option.
+* Added gradient fills to bubbles.
+* Added bubble charts.
+* Added showLabels option to bubble charts.
+* Pass bubble radius to event callback in bubble charts.
+* Fixed #207, typo in docs.
+* Fixed #206 where "value" pie slice data labels were displaying wrong
+  value.
+* Fixed #147 with 0 value slices in IE6.
+* Fixed issue #241, disabled varyBarColor option in stacked charts.
+* Added dataRenderer option to allow custom processors for JSON, AJAX
+  and anywhere else you might want to get data.
+* Fixed null value handling so plot now properly skip or join over nulls.
+* Fixed showTicks and showTickMarks option conflicts.
+* Fixed issue #185 where pointLabels plugin incompatibility could crash
+  pie, donut and other plots.
+* Fixed #23 and #143 to obey gridPadding option.
+* Fixed #233 with highlighter tooltip separator.
+* Fixed #224 where type checking failing on GWT.
+* Fixed #272 with pie highlighting not working on replot.
+* Memory performance improvements.
+* Changes to build script so everything should build when pulled from repo.
+* Fixed issue #275, IE 6/7 don't support array indexing of strings.
+* Added event listener hooks for mouseUp, mouseDown, etc. to all line plots.
+* Fixed bug with highlighter not working when null in data.
+* Updated to jQuery 1.4.4
+* Fixed bug where donut plots showed value of radians of slice instead
+  of actual data.
+* Reverted to excanvas r3 so IE8 no longer has to emulate IE7.
+* Added tooltipContentEditor option to highlighter, allowing callback
+  to manipulate tooltip content at run time (thanks Tim Bunce!).
+* Fixed bug where axes scale not resetting.
+* Fixed bug with date axes where data bounds not properly set.
+* Fixed issue where tick marks disappear if grid lines turned off.
+* Updated replot method to allow passing in axes options for more control.
+* Added experimental support for "broken" axes.
+* Fixed bug with pies where pies with 0 valued slices did not draw correctly.
+* Added canvasOverlay plugin to allow drawing of arbitrary shapes on a canvas
+  over the plot.
+* Added option to display arbitrary text/html (message, animated gif, etc.) if
+  plot is constructed without data.  Allow a "data loading" indicator to be shown.
+* Added resetAxisValues method to manually update axis ticks without
+  redrawing the plot.
+* Fix to labels on negative bars so label postiion of 'n' will be below a negative bar,
+  just as it is above a positive bar (thanks guigod!).
+* Added thousands separator character (') to sprintf formatting (thanks yuichi1004!).
+* Re-factored date parsing/formatting to use new jsDate module which does not
+  extend the Date prototype.
+
+
+0.9.7:
+
+* Added Mekko chart plot type with enhanced legend and axes support.
+* Implemented vertical waterfall charts.  Can create waterfall plot as
+  option to bar chart.  See examples folder of distribution.
+* Enhanced plot labels for waterfall style.
+* Enhanced bar plots so you can now color each bar of a series 
+  independently with the "varyBarColor" option.
+* Re-factored series drawing so that each series and series shadow drawn
+  on it's own canvas.  Allows series to be redrawn independently of each other.
+* Added additional default series colors.
+* Added useNegativeColors option to turn off negative color array and use 
+  only seriesColors array to define all bar/filled line colors.
+* Fix css for cursor legend.
+* Modified shape renderer so rectangles can be stroked and filled.
+* Re-factored date methods out of dateAxisRenderer so that date formatter 
+  and methods can be accesses outside of dateAxisRenderer plugin.
+* Fixed #132, now trigger series change event on plot target instead of drag canvas.
+* Fixes issue #116 where some source files had mix of tabs and spaces 
+  for indentation.  Should have been all spaces.
+* Fixed issue #126, some links broken in docs section of web site.
+* Fixed issue #90, trendline plugin incompatibility with pie renderer.
+* Updated samples in examples folder of distribution to include navigation 
+  links if web server is set up to process .html files with php.
+
+
+0.9.6:
+
+* New, easier to use, replot() method for placing plots in tabs, accordions,
+  resizable containers or for changing plot parameters programmatically.
+* Updated legend renderer for pie charts to draw swatches which will
+  print correctly.
+* Fixed issue #118 with patch from taum so autoscale option will
+  honor tickInterval and numberTicks options
+* Fix to plot diameter calculation for initially hidden plots.
+* Added examples for making plots in jQuery UI tabs and accordions.
+* Fixed issue #120 where pie chart with single slice not displaying
+  correctly in IE and Chrome
+
+
+0.9.5.2:
+
+* Fixed #102 where double clicking on plot that has zoom enabled, but
+  has not been zoomed resulted in error.
+* Fixed bug where candlestick coloring options not working.
+* Added option to turn individual series labels off in the legend.
+
+
+0.9.5.1:
+
+* Fixed bug where tooltip not working with OHLC and candlestick charts.
+* Added additional marker styles: plus, X and dash.
+
+
+0.9.5:
+
+* Implemented "zoomProxy".  zoomProxy allows zooming one plot from another 
+  such as an overview plot.
+* Zooming can now be constrained to just x or y axis.
+* Enhanced cursor plugin with vertical "dataTracking" line.  This is a line
+  at the cursor location with a readout of data points at the line location
+  which are displayed in the chart legend.
+* Changed cursor tooltip format string.  Now one format string is used for
+  entire tooltip.
+* Added mechanisms to specify plot size when plot target is hidden or plot
+  height/width otherwise cannot be determined from markup.
+* Added $.jqplot.config object to specify jqplot wide configuration options.
+  These include enablePlugins to globally set the default plugin state on/off
+  and defaultHeight/defaultWidth to specify default plot height/width.
+* Added fillToZero option which forces filled charts to fill to zero as opposed
+  to axis minimum.  Thus negative filled bar/line values will fill upwards to
+  zero axis value.
+* Added option to disable stacking on individual lines.
+* Changed targetId property of the plot object so it now includes a "#" before
+  the id string.
+* Improved tick and body sizing of Open Hi Low Close and candlestick charts.
+* Removed lots of web site related files from the repository.  This means that,
+  if working from the sources, user's won't be able to build the jqplot web
+  site and the docs/tests that are hosted on that site.  The minified and
+  compressed  distribution packages will build fine.
+* Lots of examples were added to a separate examples directory to better show
+  functionality of jqPlot for local testing with the distribution.
+* Many various bug fixes and other minor enhancements.
+
+
+0.9.4:
+
+* Implemented axis labels.  Labels can be rendered in div tags or as canvas 
+  elements supporting rotated text.
+* Improved rotated axis label positioning so labels will start or end at a
+  tick position.
+* Fixed bug where an empty data series would hang plot rendering.
+* completed issue #66 for misc. improvements to documentation.
+* Fixed issue #64 where the same ID's were assigned to cursor and highlighter
+  elements.
+* Added option to legend to encode special HTML characters.
+* Fixed undesirable behavior where point labels for points off the plot
+  were being rendered.
+* Added edgeTolerance option to point label renderer to control rendering of 
+  labels near plot edges.
+
+
+0.9.3:
+
+* Preliminary support for axis labels.  Currently rendered into DIV tags,
+  so no rotated label support.  This feature is currently experimental.
+* Fixed bug #52, needed space in tick div tag between style and class declarations 
+  or plot failed in certain application doctypes.
+* Fixed issue #54, miter style line join for chart lines causing spikes at steep 
+  changes in slope.  Changed miter style to round.
+* Added examples for new autoscaling algorithm.
+* Fixed bug #57, category axis labels disappear on redraw()
+* Improved algorithm which controlled maximum number of labels that would display
+  on a category axis.
+* Fixed bug #45 where null values causing errors in plotData and gridData.
+* Fixed issue #60 where seriesColors option was not working.
+
+
+0.9.2:
+
+* Fixed bug #45 where a plot could crash if series had different numbers of points.
+* Fixed issue #50, added option to turn off sorting of series data. 
+* Fixed issue #31, implemented a better axis autoscaling algorithm and added an autoscale option.
+
+0.9.1:
+
+* Fixed bug #40, when axis pad, padMax, padMin set to 0, graph would fail to render.
+* Fixed bug #41 where pie and bar charts not rendered correctly on redraw().
+* Fixed bug #11, filled stacked line plots not rendering correctly in IE.
+* Fixed bug #42 where stacked charts not rendering with string date axis ticks.
+* Fixed bug in redraw() method where axes ticks were not reset.
+* Fixed "jqplotPreRedrawEvent" that should have been named "jqplotPostRedraw" event.
+
+0.9.0:
+
+* Added Open Hi Low Close charts, Candlestick charts and Hi Low Close charts.
+* Added support for arbitrary labels on the data points.
+* Enhanced highlighter plugin to allow custom formatting control of entire tooltip.
+* Enhanced highlighter to support multiple y values in a data point.
+* Fixed bug #38 where series with a single point with a negative value would fail.
+* Improvements to examples to show what plugins to include.
+* Expanded documentation for some of the plugins.
+
+0.8.5:
+
+* Added zooming ability with double click or single click options to reset zoom.
+* Modified default tick spacing algorithm for date axes to give more space to ticks.
+* Fixed bug #2 where tickInterval wasn't working properly.
+* Added neighborThreshold option to control how close mouse must be to 
+  point to trigger neighbor detection.
+* Added double click event handler on plot.
+
+0.8.0:
+
+* Support for up to 9 y axes.
+* Added option to control padding at max/min bounds of axes separately.
+* Closed issue #21, added options to control grid line color and width.
+* Closed issue #20, added options to filled line charts to stoke above 
+  fill and customize fill color and transparency.
+* Improved structure of on line documentation to make usage and options 
+  docs default.
+* Added much documentation on options and css styling.
+
+0.7.1:
+
+* Bug fix release
+* Fixed bug #6, missing semi-colons messing up some javascript compressors.
+* Fixed bug #13 where 2D ticks array of [values, labels] would fail to 
+  renderer with DateAxisRenderer.
+* Fixes bug #16 where pie renderer overwriting options for all plot types 
+  and crashing non pie plots.
+* Fixes bug #17 constrainTo dragable option mispelled as "contstrainTo".  
+  Fixed dragable color issue when used with trend lines.
+
+0.7.0:
+
+* Pie chart support
+* Enabled tooltipLocation option in highlighter. 
+* Highlighter Tooltip will account for mark size and highlight size when 
+  positioning itself. 
+* Added ability to show just x, y or both axes in highlighter tooltip.
+* Added customization of separator between axes values in highlighter tooltip.
+* Modified how shadows are drawn for lines, bars and markers.  Now drawn first, 
+  so they are always behind the object.
+* Adjustments to shadow parameters on lines to account for new shadow positioning.
+* Added a ColorGenerator class to robustly return next available color 
+  for a plot with wrap around to first color at end.
+* Udates to docs about css file.
+* Fixed bug with String x values in series and IE error on sorting (Category Axis).
+* Added cursor changes in dragable plugin when cursor near dragable point.
+
+0.6.6b:
+
+* Added excanvas.js and excanvas.min.js to compressed distributions.
+* Added example/test html pages I had locally into repository and to 
+  compressed distributions.
+
+0.6.6a:
+
+* Removed absolute positioning from dom element and put back into css file.
+* Duplicate of 0.6.6 with a suffix to unambiguously differentiate between 
+  previously posted 0.6.6 release.
+
+0.6.6:
+
+* Fixed bug #5, trend line plugin failing when no trend line options specified.
+* Added absolute position css spec to axis tick dom element.
+* Enhancement to category axes, more intuitive handling of series with 
+  missing data values.
+
+0.6.5:
+
+* Fixed bug #4, series of unequal data length not rendering correctly.  
+  This is a bugfix release only.
+
+0.6.4:
+
+* Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y 
+  values are euqal) or single value data series would crash.
+
+0.6.3:
+
+* Support for stacked line (a.k.a. area) and stacked bar (horizontal and 
+  vertical) charts.
+* Refactored barRenderer to use default shape and shadow renderers.
+* Added info (contacts & support information) page to web site.
+
+0.6.2:
+
+* This is a minor upgrade to docs and build only.  No functionality has changed.
+* Ant build script generates entire site, examples, tests and distribution.
+* Improvements to documentation.
+
+0.6.1:
+
+* New sprintf implementation from Ash Searle that implements %g.
+* Fix to sprintf e/f formats.
+* Created new format specifier, %p and %P to preserve significance.
+* Modified p/P format to better display larger numbers.
+* Fixed and simplified significant digits calculation for sprintf.
+* Added option to have cursor tooltip follow the mouse or not.
+* Added options to change size of highlight.
+* Updates to handle dates like '6-May-09'.
+* Mods to improve look of web site.
+* Updates to documentation.
+* Added license and copyright statement to source files.
+
+0.6.0:
+
+* Added rotated text support.  Uses native canvas text functionality in 
+  browsers that support it or draws text on canvas with Hershey font
+* metrics for non-supporting browsers.
+* Removed lots of lint in js code.
+* Moved tick css from js code into css file.
+* Fix to tick positioning css.  y axis ticks were positioned to wrong side of axis div.
+* Re-factored axis tick renderer instantiation into the axes renderers themselves.
+
+
+For changes prior to 0.6.0 release, please see change log at http://bitbucket.org/cleonello/jqplot/changesets/
Index: /lib/jqplot/jquery.js
===================================================================
--- /lib/jqplot/jquery.js	(revision 8528)
+++ /lib/jqplot/jquery.js	(revision 5261)
@@ -3658,5 +3658,5 @@
 	},
 
-	onbind: function( types, data, fn ) {
+	bind: function( types, data, fn ) {
 		return this.on( types, null, data, fn );
 	},
Index: b/jquery.jcarousel.min.js
===================================================================
--- /lib/jquery.jcarousel.min.js	(revision 8528)
+++ 	(revision )
@@ -1,4 +1,0 @@
-/*! jCarousel - v0.3.4 - 2015-09-23
-* http://sorgalla.com/jcarousel/
-* Copyright (c) 2006-2015 Jan Sorgalla; Licensed MIT */
-!function(a){"use strict";var b=a.jCarousel={};b.version="0.3.4";var c=/^([+\-]=)?(.+)$/;b.parseTarget=function(a){var b=!1,d="object"!=typeof a?c.exec(a):null;return d?(a=parseInt(d[2],10)||0,d[1]&&(b=!0,"-="===d[1]&&(a*=-1))):"object"!=typeof a&&(a=parseInt(a,10)||0),{target:a,relative:b}},b.detectCarousel=function(a){for(var b;a.length>0;){if(b=a.filter("[data-jcarousel]"),b.length>0)return b;if(b=a.find("[data-jcarousel]"),b.length>0)return b;a=a.parent()}return null},b.base=function(c){return{version:b.version,_options:{},_element:null,_carousel:null,_init:a.noop,_create:a.noop,_destroy:a.noop,_reload:a.noop,create:function(){return this._element.attr("data-"+c.toLowerCase(),!0).data(c,this),!1===this._trigger("create")?this:(this._create(),this._trigger("createend"),this)},destroy:function(){return!1===this._trigger("destroy")?this:(this._destroy(),this._trigger("destroyend"),this._element.removeData(c).removeAttr("data-"+c.toLowerCase()),this)},reload:function(a){return!1===this._trigger("reload")?this:(a&&this.options(a),this._reload(),this._trigger("reloadend"),this)},element:function(){return this._element},options:function(b,c){if(0===arguments.length)return a.extend({},this._options);if("string"==typeof b){if("undefined"==typeof c)return"undefined"==typeof this._options[b]?null:this._options[b];this._options[b]=c}else this._options=a.extend({},this._options,b);return this},carousel:function(){return this._carousel||(this._carousel=b.detectCarousel(this.options("carousel")||this._element),this._carousel||a.error('Could not detect carousel for plugin "'+c+'"')),this._carousel},_trigger:function(b,d,e){var f,g=!1;return e=[this].concat(e||[]),(d||this._element).each(function(){f=a.Event((c+":"+b).toLowerCase()),a(this).trigger(f,e),f.isDefaultPrevented()&&(g=!0)}),!g}}},b.plugin=function(c,d){var e=a[c]=function(b,c){this._element=a(b),this.options(c),this._init(),this.create()};return e.fn=e.prototype=a.extend({},b.base(c),d),a.fn[c]=function(b){var d=Array.prototype.slice.call(arguments,1),f=this;return this.each("string"==typeof b?function(){var e=a(this).data(c);if(!e)return a.error("Cannot call methods on "+c+' prior to initialization; attempted to call method "'+b+'"');if(!a.isFunction(e[b])||"_"===b.charAt(0))return a.error('No such method "'+b+'" for '+c+" instance");var g=e[b].apply(e,d);return g!==e&&"undefined"!=typeof g?(f=g,!1):void 0}:function(){var d=a(this).data(c);d instanceof e?d.reload(b):new e(this,b)}),f},e}}(jQuery),function(a,b){"use strict";var c=function(a){return parseFloat(a)||0};a.jCarousel.plugin("jcarousel",{animating:!1,tail:0,inTail:!1,resizeTimer:null,lt:null,vertical:!1,rtl:!1,circular:!1,underflow:!1,relative:!1,_options:{list:function(){return this.element().children().eq(0)},items:function(){return this.list().children()},animation:400,transitions:!1,wrap:null,vertical:null,rtl:null,center:!1},_list:null,_items:null,_target:a(),_first:a(),_last:a(),_visible:a(),_fullyvisible:a(),_init:function(){var a=this;return this.onWindowResize=function(){a.resizeTimer&&clearTimeout(a.resizeTimer),a.resizeTimer=setTimeout(function(){a.reload()},100)},this},_create:function(){this._reload(),a(b).on("resize.jcarousel",this.onWindowResize)},_destroy:function(){a(b).off("resize.jcarousel",this.onWindowResize)},_reload:function(){this.vertical=this.options("vertical"),null==this.vertical&&(this.vertical=this.list().height()>this.list().width()),this.rtl=this.options("rtl"),null==this.rtl&&(this.rtl=function(b){if("rtl"===(""+b.attr("dir")).toLowerCase())return!0;var c=!1;return b.parents("[dir]").each(function(){return/rtl/i.test(a(this).attr("dir"))?(c=!0,!1):void 0}),c}(this._element)),this.lt=this.vertical?"top":"left",this.relative="relative"===this.list().css("position"),this._list=null,this._items=null;var b=this.index(this._target)>=0?this._target:this.closest();this.circular="circular"===this.options("wrap"),this.underflow=!1;var c={left:0,top:0};return b.length>0&&(this._prepare(b),this.list().find("[data-jcarousel-clone]").remove(),this._items=null,this.underflow=this._fullyvisible.length>=this.items().length,this.circular=this.circular&&!this.underflow,c[this.lt]=this._position(b)+"px"),this.move(c),this},list:function(){if(null===this._list){var b=this.options("list");this._list=a.isFunction(b)?b.call(this):this._element.find(b)}return this._list},items:function(){if(null===this._items){var b=this.options("items");this._items=(a.isFunction(b)?b.call(this):this.list().find(b)).not("[data-jcarousel-clone]")}return this._items},index:function(a){return this.items().index(a)},closest:function(){var b,d=this,e=this.list().position()[this.lt],f=a(),g=!1,h=this.vertical?"bottom":this.rtl&&!this.relative?"left":"right";return this.rtl&&this.relative&&!this.vertical&&(e+=this.list().width()-this.clipping()),this.items().each(function(){if(f=a(this),g)return!1;var i=d.dimension(f);if(e+=i,e>=0){if(b=i-c(f.css("margin-"+h)),!(Math.abs(e)-i+b/2<=0))return!1;g=!0}}),f},target:function(){return this._target},first:function(){return this._first},last:function(){return this._last},visible:function(){return this._visible},fullyvisible:function(){return this._fullyvisible},hasNext:function(){if(!1===this._trigger("hasnext"))return!0;var a=this.options("wrap"),b=this.items().length-1,c=this.options("center")?this._target:this._last;return b>=0&&!this.underflow&&(a&&"first"!==a||this.index(c)<b||this.tail&&!this.inTail)?!0:!1},hasPrev:function(){if(!1===this._trigger("hasprev"))return!0;var a=this.options("wrap");return this.items().length>0&&!this.underflow&&(a&&"last"!==a||this.index(this._first)>0||this.tail&&this.inTail)?!0:!1},clipping:function(){return this._element["inner"+(this.vertical?"Height":"Width")]()},dimension:function(a){return a["outer"+(this.vertical?"Height":"Width")](!0)},scroll:function(b,c,d){if(this.animating)return this;if(!1===this._trigger("scroll",null,[b,c]))return this;a.isFunction(c)&&(d=c,c=!0);var e=a.jCarousel.parseTarget(b);if(e.relative){var f,g,h,i,j,k,l,m,n=this.items().length-1,o=Math.abs(e.target),p=this.options("wrap");if(e.target>0){var q=this.index(this._last);if(q>=n&&this.tail)this.inTail?"both"===p||"last"===p?this._scroll(0,c,d):a.isFunction(d)&&d.call(this,!1):this._scrollTail(c,d);else if(f=this.index(this._target),this.underflow&&f===n&&("circular"===p||"both"===p||"last"===p)||!this.underflow&&q===n&&("both"===p||"last"===p))this._scroll(0,c,d);else if(h=f+o,this.circular&&h>n){for(m=n,j=this.items().get(-1);m++<h;)j=this.items().eq(0),k=this._visible.index(j)>=0,k&&j.after(j.clone(!0).attr("data-jcarousel-clone",!0)),this.list().append(j),k||(l={},l[this.lt]=this.dimension(j),this.moveBy(l)),this._items=null;this._scroll(j,c,d)}else this._scroll(Math.min(h,n),c,d)}else if(this.inTail)this._scroll(Math.max(this.index(this._first)-o+1,0),c,d);else if(g=this.index(this._first),f=this.index(this._target),i=this.underflow?f:g,h=i-o,0>=i&&(this.underflow&&"circular"===p||"both"===p||"first"===p))this._scroll(n,c,d);else if(this.circular&&0>h){for(m=h,j=this.items().get(0);m++<0;){j=this.items().eq(-1),k=this._visible.index(j)>=0,k&&j.after(j.clone(!0).attr("data-jcarousel-clone",!0)),this.list().prepend(j),this._items=null;var r=this.dimension(j);l={},l[this.lt]=-r,this.moveBy(l)}this._scroll(j,c,d)}else this._scroll(Math.max(h,0),c,d)}else this._scroll(e.target,c,d);return this._trigger("scrollend"),this},moveBy:function(a,b){var d=this.list().position(),e=1,f=0;return this.rtl&&!this.vertical&&(e=-1,this.relative&&(f=this.list().width()-this.clipping())),a.left&&(a.left=d.left+f+c(a.left)*e+"px"),a.top&&(a.top=d.top+f+c(a.top)*e+"px"),this.move(a,b)},move:function(b,c){c=c||{};var d=this.options("transitions"),e=!!d,f=!!d.transforms,g=!!d.transforms3d,h=c.duration||0,i=this.list();if(!e&&h>0)return void i.animate(b,c);var j=c.complete||a.noop,k={};if(e){var l={transitionDuration:i.css("transitionDuration"),transitionTimingFunction:i.css("transitionTimingFunction"),transitionProperty:i.css("transitionProperty")},m=j;j=function(){a(this).css(l),m.call(this)},k={transitionDuration:(h>0?h/1e3:0)+"s",transitionTimingFunction:d.easing||c.easing,transitionProperty:h>0?function(){return f||g?"all":b.left?"left":"top"}():"none",transform:"none"}}g?k.transform="translate3d("+(b.left||0)+","+(b.top||0)+",0)":f?k.transform="translate("+(b.left||0)+","+(b.top||0)+")":a.extend(k,b),e&&h>0&&i.one("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",j),i.css(k),0>=h&&i.each(function(){j.call(this)})},_scroll:function(b,c,d){if(this.animating)return a.isFunction(d)&&d.call(this,!1),this;if("object"!=typeof b?b=this.items().eq(b):"undefined"==typeof b.jquery&&(b=a(b)),0===b.length)return a.isFunction(d)&&d.call(this,!1),this;this.inTail=!1,this._prepare(b);var e=this._position(b),f=this.list().position()[this.lt];if(e===f)return a.isFunction(d)&&d.call(this,!1),this;var g={};return g[this.lt]=e+"px",this._animate(g,c,d),this},_scrollTail:function(b,c){if(this.animating||!this.tail)return a.isFunction(c)&&c.call(this,!1),this;var d=this.list().position()[this.lt];this.rtl&&this.relative&&!this.vertical&&(d+=this.list().width()-this.clipping()),this.rtl&&!this.vertical?d+=this.tail:d-=this.tail,this.inTail=!0;var e={};return e[this.lt]=d+"px",this._update({target:this._target.next(),fullyvisible:this._fullyvisible.slice(1).add(this._visible.last())}),this._animate(e,b,c),this},_animate:function(b,c,d){if(d=d||a.noop,!1===this._trigger("animate"))return d.call(this,!1),this;this.animating=!0;var e=this.options("animation"),f=a.proxy(function(){this.animating=!1;var a=this.list().find("[data-jcarousel-clone]");a.length>0&&(a.remove(),this._reload()),this._trigger("animateend"),d.call(this,!0)},this),g="object"==typeof e?a.extend({},e):{duration:e},h=g.complete||a.noop;return c===!1?g.duration=0:"undefined"!=typeof a.fx.speeds[g.duration]&&(g.duration=a.fx.speeds[g.duration]),g.complete=function(){f(),h.call(this)},this.move(b,g),this},_prepare:function(b){var d,e,f,g,h=this.index(b),i=h,j=this.dimension(b),k=this.clipping(),l=this.vertical?"bottom":this.rtl?"left":"right",m=this.options("center"),n={target:b,first:b,last:b,visible:b,fullyvisible:k>=j?b:a()};if(m&&(j/=2,k/=2),k>j)for(;;){if(d=this.items().eq(++i),0===d.length){if(!this.circular)break;if(d=this.items().eq(0),b.get(0)===d.get(0))break;if(e=this._visible.index(d)>=0,e&&d.after(d.clone(!0).attr("data-jcarousel-clone",!0)),this.list().append(d),!e){var o={};o[this.lt]=this.dimension(d),this.moveBy(o)}this._items=null}if(g=this.dimension(d),0===g)break;if(j+=g,n.last=d,n.visible=n.visible.add(d),f=c(d.css("margin-"+l)),k>=j-f&&(n.fullyvisible=n.fullyvisible.add(d)),j>=k)break}if(!this.circular&&!m&&k>j)for(i=h;;){if(--i<0)break;if(d=this.items().eq(i),0===d.length)break;if(g=this.dimension(d),0===g)break;if(j+=g,n.first=d,n.visible=n.visible.add(d),f=c(d.css("margin-"+l)),k>=j-f&&(n.fullyvisible=n.fullyvisible.add(d)),j>=k)break}return this._update(n),this.tail=0,m||"circular"===this.options("wrap")||"custom"===this.options("wrap")||this.index(n.last)!==this.items().length-1||(j-=c(n.last.css("margin-"+l)),j>k&&(this.tail=j-k)),this},_position:function(a){var b=this._first,c=b.position()[this.lt],d=this.options("center"),e=d?this.clipping()/2-this.dimension(b)/2:0;return this.rtl&&!this.vertical?(c-=this.relative?this.list().width()-this.dimension(b):this.clipping()-this.dimension(b),c+=e):c-=e,!d&&(this.index(a)>this.index(b)||this.inTail)&&this.tail?(c=this.rtl&&!this.vertical?c-this.tail:c+this.tail,this.inTail=!0):this.inTail=!1,-c},_update:function(b){var c,d=this,e={target:this._target,first:this._first,last:this._last,visible:this._visible,fullyvisible:this._fullyvisible},f=this.index(b.first||e.first)<this.index(e.first),g=function(c){var g=[],h=[];b[c].each(function(){e[c].index(this)<0&&g.push(this)}),e[c].each(function(){b[c].index(this)<0&&h.push(this)}),f?g=g.reverse():h=h.reverse(),d._trigger(c+"in",a(g)),d._trigger(c+"out",a(h)),d["_"+c]=b[c]};for(c in b)g(c);return this}})}(jQuery,window),function(a){"use strict";a.jcarousel.fn.scrollIntoView=function(b,c,d){var e,f=a.jCarousel.parseTarget(b),g=this.index(this._fullyvisible.first()),h=this.index(this._fullyvisible.last());if(e=f.relative?f.target<0?Math.max(0,g+f.target):h+f.target:"object"!=typeof f.target?f.target:this.index(f.target),g>e)return this.scroll(e,c,d);if(e>=g&&h>=e)return a.isFunction(d)&&d.call(this,!1),this;for(var i,j=this.items(),k=this.clipping(),l=this.vertical?"bottom":this.rtl?"left":"right",m=0;;){if(i=j.eq(e),0===i.length)break;if(m+=this.dimension(i),m>=k){var n=parseFloat(i.css("margin-"+l))||0;m-n!==k&&e++;break}if(0>=e)break;e--}return this.scroll(e,c,d)}}(jQuery),function(a){"use strict";a.jCarousel.plugin("jcarouselControl",{_options:{target:"+=1",event:"click",method:"scroll"},_active:null,_init:function(){this.onDestroy=a.proxy(function(){this._destroy(),this.carousel().one("jcarousel:createend",a.proxy(this._create,this))},this),this.onReload=a.proxy(this._reload,this),this.onEvent=a.proxy(function(b){b.preventDefault();var c=this.options("method");a.isFunction(c)?c.call(this):this.carousel().jcarousel(this.options("method"),this.options("target"))},this)},_create:function(){this.carousel().one("jcarousel:destroy",this.onDestroy).on("jcarousel:reloadend jcarousel:scrollend",this.onReload),this._element.on(this.options("event")+".jcarouselcontrol",this.onEvent),this._reload()},_destroy:function(){this._element.off(".jcarouselcontrol",this.onEvent),this.carousel().off("jcarousel:destroy",this.onDestroy).off("jcarousel:reloadend jcarousel:scrollend",this.onReload)},_reload:function(){var b,c=a.jCarousel.parseTarget(this.options("target")),d=this.carousel();if(c.relative)b=d.jcarousel(c.target>0?"hasNext":"hasPrev");else{var e="object"!=typeof c.target?d.jcarousel("items").eq(c.target):c.target;b=d.jcarousel("target").index(e)>=0}return this._active!==b&&(this._trigger(b?"active":"inactive"),this._active=b),this}})}(jQuery),function(a){"use strict";a.jCarousel.plugin("jcarouselPagination",{_options:{perPage:null,item:function(a){return'<a href="#'+a+'">'+a+"</a>"},event:"click",method:"scroll"},_carouselItems:null,_pages:{},_items:{},_currentPage:null,_init:function(){this.onDestroy=a.proxy(function(){this._destroy(),this.carousel().one("jcarousel:createend",a.proxy(this._create,this))},this),this.onReload=a.proxy(this._reload,this),this.onScroll=a.proxy(this._update,this)},_create:function(){this.carousel().one("jcarousel:destroy",this.onDestroy).on("jcarousel:reloadend",this.onReload).on("jcarousel:scrollend",this.onScroll),this._reload()},_destroy:function(){this._clear(),this.carousel().off("jcarousel:destroy",this.onDestroy).off("jcarousel:reloadend",this.onReload).off("jcarousel:scrollend",this.onScroll),this._carouselItems=null},_reload:function(){var b=this.options("perPage");if(this._pages={},this._items={},a.isFunction(b)&&(b=b.call(this)),null==b)this._pages=this._calculatePages();else for(var c,d=parseInt(b,10)||0,e=this._getCarouselItems(),f=1,g=0;;){if(c=e.eq(g++),0===c.length)break;this._pages[f]=this._pages[f]?this._pages[f].add(c):c,g%d===0&&f++}this._clear();var h=this,i=this.carousel().data("jcarousel"),j=this._element,k=this.options("item"),l=this._getCarouselItems().length;a.each(this._pages,function(b,c){var d=h._items[b]=a(k.call(h,b,c));d.on(h.options("event")+".jcarouselpagination",a.proxy(function(){var a=c.eq(0);if(i.circular){var d=i.index(i.target()),e=i.index(a);parseFloat(b)>parseFloat(h._currentPage)?d>e&&(a="+="+(l-d+e)):e>d&&(a="-="+(d+(l-e)))}i[this.options("method")](a)},h)),j.append(d)}),this._update()},_update:function(){var b,c=this.carousel().jcarousel("target");a.each(this._pages,function(a,d){return d.each(function(){return c.is(this)?(b=a,!1):void 0}),b?!1:void 0}),this._currentPage!==b&&(this._trigger("inactive",this._items[this._currentPage]),this._trigger("active",this._items[b])),this._currentPage=b},items:function(){return this._items},reloadCarouselItems:function(){return this._carouselItems=null,this},_clear:function(){this._element.empty(),this._currentPage=null},_calculatePages:function(){for(var a,b,c=this.carousel().data("jcarousel"),d=this._getCarouselItems(),e=c.clipping(),f=0,g=0,h=1,i={};;){if(a=d.eq(g++),0===a.length)break;b=c.dimension(a),f+b>e&&(h++,f=0),f+=b,i[h]=i[h]?i[h].add(a):a}return i},_getCarouselItems:function(){return this._carouselItems||(this._carouselItems=this.carousel().jcarousel("items")),this._carouselItems}})}(jQuery),function(a,b){"use strict";var c,d,e={hidden:"visibilitychange",mozHidden:"mozvisibilitychange",msHidden:"msvisibilitychange",webkitHidden:"webkitvisibilitychange"};a.each(e,function(a,e){return"undefined"!=typeof b[a]?(c=a,d=e,!1):void 0}),a.jCarousel.plugin("jcarouselAutoscroll",{_options:{target:"+=1",interval:3e3,autostart:!0},_timer:null,_started:!1,_init:function(){this.onDestroy=a.proxy(function(){this._destroy(),this.carousel().one("jcarousel:createend",a.proxy(this._create,this))},this),this.onAnimateEnd=a.proxy(this._start,this),this.onVisibilityChange=a.proxy(function(){b[c]?this._stop():this._start()},this)},_create:function(){this.carousel().one("jcarousel:destroy",this.onDestroy),a(b).on(d,this.onVisibilityChange),this.options("autostart")&&this.start()},_destroy:function(){this._stop(),this.carousel().off("jcarousel:destroy",this.onDestroy),a(b).off(d,this.onVisibilityChange)},_start:function(){return this._stop(),this._started?(this.carousel().one("jcarousel:animateend",this.onAnimateEnd),this._timer=setTimeout(a.proxy(function(){this.carousel().jcarousel("scroll",this.options("target"))},this),this.options("interval")),this):void 0},_stop:function(){return this._timer&&(this._timer=clearTimeout(this._timer)),this.carousel().off("jcarousel:animateend",this.onAnimateEnd),this},start:function(){return this._started=!0,this._start(),this},stop:function(){return this._started=!1,this._stop(),this}})}(jQuery,document);
Index: b/phpgirocode.class.php
===================================================================
--- /lib/phpgirocode.class.php	(revision 8528)
+++ 	(revision )
@@ -1,613 +1,0 @@
-<?php
-
-	/**
-	 * Klasse zur Generierung von GiroCode QR Codes 
-	 * @author Daschmi (https://daschmi.de)
-	 * Version 1.1 (07.06.2015)
-	 * 
-	 * http://daschmi.de
-	 * https://www.girocode.de/wp-content/uploads/2014/06/GiroCode_EPC_Standard.pdf
-	 */
-	class PhpGirocode
-	{
-		
-		const OUTPUT_BROWSER = 1;
-		const OUTPUT_FILE = 2;
-		const OUTPUT_BASE64 = 3;
-		const OUTPUT_TEST = 4;
-		
-		/** Servicekennung 
-		 * Beginnen die aus einem QR-Code extrahierten Daten mit der Zeichenfolge BCD gefolgt von einer Zeilenschaltung kann fÃŒr die weitere PrÃŒfung der Daten davon
-		 *  ausgegangen werden, dass ein Datensatz zur Zahlungsinitiierung vorliegt.
-		 * @var String 
-		 * */
-		private $serviceidentifier = "BCD"; 
-		
-		/** Version
-		 * @var String 
-		 * */
-		private $version = "001";
-		
-		/** 
-		 * Kodierung 
-		 * 1 = UTF-8
-		 * 2 = ISO 8859-1
-		 * 3 = ISO 8859-2
-		 * 4 = ISO 5589-4
-		 * 5 = ISO 8859-5
-		 * 6 = ISO 8859-7
-		 * 7 = ISO 8859-10
-		 * 8 = ISO 8859-15
-		 * @var String
-		 * */
-		private $encoding = "1";
-		
-		/**
-		 * Funktion
-		 * Die Funktion wird durch den SchlÃŒsselwert definiert: SCT - SEPA Credit Transfer
-		 * @var String
-		 */
-		private $function = "SCT";
-		
-		/**
-		 * BIC
-		 * LÃ€nge: 8/11  
-		 * @var String
-		 */
-		private $bic = "";
-		
-		/**
-		 * Name Kontoinhaber
-		 * LÃ€nge: 70
-		 * @var String
-		 */
-		private $reciver = "";
-				
-		/**
-		 * IBAN Nummer des EmpfÃ€ngers
-		 * LÃ€nge: 34
-		 * @var String
-		 */
-		private $iban = "";
-		 
-		/**
-		 * Betrag
-		 * LÃ€nge: 12
-		 * Der Betrag ist ein empfohlenes, jedoch kein zwingend zu fÃŒllendes Feld. Bei fehlenden BetrÃ€gen ist, wie bei betragsoffenen Ãberweisungsbelegen, die Eingabe eines Betrags vorzusehen.
-		 * Der Betrag ist maximal 999.999.999,99, hat maximal 2 Nachkommastellen, den Punkt als Dezimaltrennzeichen und wird unmittelbar nach dem dreibuchstabigen WÃ€hrungscode in GroÃbuchstaben angegeben.
-		 * Zur VerfÃŒgung steht als WÃ€hrung ausschlieÃlich EUR. Die Betragsdarstellung ist mit RÃŒcksicht auf die CodegrÃ¶Ãe mÃ¶glichst kurzzuhalten, z.B. besser EUR3 als EUR3.00. Vornullen sind nicht erlaubt.
-		 * @var double
-		 */
-		private $amount = 0;
-				
-		/**
-		 * Verwendungstext
-		 * LÃ€nge: 140
-		 * @var unknown_type
-		 */
-		private $text = "";
-		
-		/**
-		 * Sammeln von Fehlermeldungen
-		 * @var Array
-		 */
-		private $arError = array();
-		
-		/**
-		 * Fehlerkorrektur-Level
-		 * @var String
-		 */
-		private $errCorrLevel = "M";
-
-		/**
-		 * QRCode-GrÃ¶Ãe
-		 * @var String
-		 */
-		private $qrsize = 10;
-		
-		/**
-		 * Pfad fÃŒr temporÃ€re Dateien
-		 * @var String
-		 */
-		private $strTmpPath = "/tmp";
-		
-		public function __construct()
-		{
-			
-			$this->strTmpPath = sys_get_temp_dir();
-			
-		} // public function __construct()
-		
-		public function setTmpPath($path)
-		{
-			
-			$this->strTmpPath = $path;
-			
-		} // public function setTmpPath($path)
-		
-		public function getTmpPath()
-		{
-			
-			return $this->strTmpPath;
-			
-		} // public function getTmpPath()
-		
-		/**
-		 * Setzt die Codierung
-		 */
-		public function setEncoding($strEncoding)
-		{
-			
-			switch (strtolower($strEncoding))
-			{
-
-				case 'utf-8': $this->encoding = 1; break;
-				case 'iso 8859-1': $this->encoding = 2; break;
-				case 'iso 8859-2': $this->encoding = 3; break;
-				case 'iso 8859-4': $this->encoding = 4; break;
-				case 'iso 8859-5': $this->encoding = 5; break;
-				case 'iso 8859-7': $this->encoding = 6; break;
-				case 'iso 8859-10': $this->encoding = 7; break;
-				case 'iso 8859-15': $this->encoding = 8; break;
-				
-				default: $this->handleError(1);
-				
-			}
-			
-		} // public function setEncoding($strEncoding)
-
-		/**
-		 * Setzt die BIC fÃŒr die Ãberweisung
-		 */
-		public function setBIC($strBIC) 
-		{
-
-			if (!in_array(strlen($strBIC), array(8, 11)))
-			{
-				
-				$this->handleError(2);
-				
-			}
-			else
-			{
-				
-				$this->bic = strtoupper($strBIC);
-				
-			}
-			
-		} // public function setBIC($strBIC)
-		
-		/**
-		 * Setzt den EmpfÃ€nger
-		 */
-		public function setReciver($strReciver)
-		{
-			
-			if (strlen($strReciver) <= 0) $this->handleError(3); 
-			else 
-			{
-				
-				$this->reciver = substr($strReciver, 0, 70);
-				
-			}
-			
-		} // public function setReciver($strReciver)
-
-		/**
-		 * Setzt den EmpfÃ€nger
-		 */
-		public function setErrCorrLevel($level)
-		{
-			
-			$this->errCorrLevel = substr($level, 0, 1);
-			
-		} // public function setErrCorrLevel($level)
-		
-		/**
-		 * Gibt die IBAN zurÃŒck
-		 */
-		public function getIBAN()
-		{
-			
-			return $this->iban;
-			
-		} // public function getIBAN()
-		
-		/**
-		 * Setzt die IBAN
-		 */
-		public function setIBAN($strIBAN)
-		{
-			
-			if (strlen($strIBAN) > 34) $this->handleError(4);
-			else
-			{
-				
-				$this->iban = strtoupper(preg_replace('/\040/', '', $strIBAN));
-				
-			}
-			
-		} // public function setIBAN($strIBAN)
-		
-		/**
-		 * Berechnet die IBAN aus Kontonummer und BLZ
-		 */
-		public function calculateIBANBIC($strKontonummer, $strBLZ, $strCountry = "DE")
-		{
-			
-			$string = $strBLZ.$strKontonummer.$this->getAlphanumericInt(substr(strtoupper($strCountry), 0, 1)).$this->getAlphanumericInt(substr(strtoupper($strCountry), 1, 1)).'00';
-			$pz = 98 - bcmod($string, 97);
-			
-			$this->iban = strtoupper($strCountry).$pz.$strBLZ.$strKontonummer;				
-			
-			$strFile = dirname(__FILE__).'/data/blzbic.txt';
-			
-			if (!file_exists($strFile))
-			{
-				
-				$this->handleError(8);
-				
-			}
-			else
-			{
-				
-				$bankInfo = $this->readBLZBICFile($strFile, $strBLZ);
-				
-				if ($bankInfo === false) $this->handleError(9);
-				else
-				{
-				
-					$this->bic = $bankInfo['bic'];
-					
-				}
-				
-			}
-			
-		} // public function calculateIBANBIC($strKontonummer, $strBLZ)
-		
-		/**
-		 * Setzt den Betrag fÃŒr die Ãberweisung 
-		 */
-		public function setAmount($dAmount)
-		{
-			
-			$value = $this->toFloat($dAmount);
-			
-			if ($value <= 0) $this->handleError(5);
-			else
-			{
-				
-				$this->amount = $value;
-				
-			}
-			
-		} // public function setAmount($dAmount)
-		
-		/**
-		 * Setzt den Text
-		 * @param String $strText
-		 */
-		public function setText($strText)
-		{
-			
-			if (strlen($strText) > 140) $this->handleError(6);
-			else
-			{
-				
-				$this->text = $strText;
-				
-			}
-			
-		} // public function setText($strText)
-		
-		/**
-		 * Setzt die QR-Code-GrÃ¶Ãe
-		 * @param Integer $size
-		 */
-		public function setSize($size)
-		{
-			
-			$this->qrsize = $size;
-			
-		} // public function setSize($size)
-		
-		
-		/**
-		 * PrÃŒft die IBAN auf ValiditÃ€t
-		 * @return true|false
-		 */
-		public function isValidIBAN()
-		{
-			
-			if (!preg_match('/^[A-Z]{2}\d*/', $this->iban))
-			{
-				
-				$this->handleError(7);
-				
-				return false;
-				
-			}
-			else
-			{
-				
-				$string = substr($this->iban, 4).$this->getAlphanumericInt(substr($this->iban, 0, 1)).$this->getAlphanumericInt(substr($this->iban, 1, 1)).substr($this->iban, 2, 2);
-
-				if (bcmod($string, 97) === '1')
-				{
-					
-					return true;
-					
-				}
-				else
-				{
-					
-					$this->handleError(11);
-					return false;
-					
-				}
-								
-			}
-			
-		} // public function isValidIBAN()
-				
-		/**
-		 * Generiert den Barcode
-		 */
-		public function generate($out = self::OUTPUT_BROWSER, $file = false)
-		{
-			 				
-			$arField = array();
-			
-			$arField[1] = $this->serviceidentifier;
-			$arField[2] = $this->version;
-			$arField[3] = $this->encoding;
-			$arField[4] = $this->function;
-			$arField[5] = $this->bic;
-			$arField[6] = $this->reciver;
-			$arField[7] = $this->iban;						
-			
-			//if ($this->amount > 0) $arField[8] = "EUR".round($this->amount, 2); else $arFild[] = '';
-			if ($this->amount > 0) $arField[8] = "EUR".sprintf('%.2f', $this->amount); else $arFild[] = '';
-			
-			$arField[9] = '';
-			$arField[10] = '';
-			
-			if (strlen($this->text) > 0) $arField[11] = $this->text; else $arField[11] = '';			
-			$arField[12] = '';
-						
-			// public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
-			
-			//$code = implode("\n", $arField);
-			$code = implode(PHP_EOL, $arField);
-			
-			if ($out === self::OUTPUT_BROWSER)
-			{
-				
-				QRcode::png($code, false, $this->errCorrLevel, $this->qrsize);
-				
-			}
-			else if ($out === self::OUTPUT_FILE)
-			{
-				
-				if (strlen($file) <= 0) $this->handleError(10);
-				else 
-				{
-					
-					if (!file_exists($file)) touch($file);
-					
-					QRcode::png($code, $file, $this->errCorrLevel, $this->qrsize);
-					
-				}
-				
-			}
-			else if ($out === self::OUTPUT_BASE64)
-			{
-				
-				$tmpfname = @tempnam("/tmp", "phpgirocode");
-				
-				QRcode::png($code, $tmpfname, $this->errCorrLevel, $this->qrsize, 2);
-				
-				return base64_encode(file_get_contents($tmpfname));
-				
-			}
-			else if ($out === self::OUTPUT_TEST)
-			{
-				
-				return print_r($arField, 1);
-				
-			}
-			
-		} // public function generate()
-		
-		public function getMatchingBLZBIC($search)
-		{
-			
-			$filename = dirname(__FILE__).'/data/blzbic.txt';
-				
-			if (!file_exists($filename))
-			{
-			
-				$this->handleError(8);
-			
-			}
-			else
-			{
-			
-				$arData = array();
-								
-				$handle = fopen($filename, "r");
-				
-				while (($line = fgets($handle, 4096)) !== false)
-				{
-					
-					$arRow = $this->explodeRow($line);
-					 
-					if (strpos($arRow['blz'], $search) !== false || strpos($arRow['bic'], $search) != false || strpos($arRow['name'], $search) != false)
-					{
-						
-						$arData[] = $arRow;
-						
-					}
-					
-				}
-				
-				return $arData;
-			
-			}
-			
-		}
-		
-		private function explodeRow($line)
-		{
-			
-			$arRow = array(
-				'1' => substr($line, 0, 8), // Bankleitzahl
-				'2' => substr($line, 8, 1), // Merkmal, ob bankleitzahlfÃŒhrender Zahlungsdienstleister (â1â) oder nicht (â2â)
-				'3' => substr($line, 9, 58), // Bezeichnung des Zahlungsdienstleisters (ohne Rechtsform)
-				'4' => substr($line, 67, 5),
-				'5' => substr($line, 72, 35),
-				'6' => substr($line, 107, 27), // Kurzbezeichnung des Zahlungsdienstleisters mit Ort (ohne Rechtsform)
-				'7' => substr($line, 134, 5), // Institutsnummer fÃŒr PAN
-				'8' => substr($line, 139, 11),
-				'9' => substr($line, 150, 2), // Knnzeichen fÃŒr PrÃŒfzifferberechnungsmethode
-				'10' => substr($line, 152, 6), // Nummer des Datensatzes
-				'11' => substr($line, 158, 1), // Ãnderungskennzeichen
-				'12' => substr($line, 159, 1), // Hinweis auf beabsichtigte BankleitzahllÃ¶schung
-				'13' => substr($line, 160, 8), // Hinweis auf Nachfolge-Bankleitzahl
-				'14' => substr($line, 168, 6) // Kennzeichen fÃŒr die IBAN-Regel (nur erweiterte Bankleitzahlendatei)
-			);
-			
-			$arRow['blz'] = $arRow[1];
-			$arRow['name'] = $arRow[3];
-			$arRow['plz'] = $arRow[4];
-			$arRow['ort'] = $arRow[5];
-			$arRow['bic'] = $arRow[8];
-			
-			return $arRow;
-			
-		} // private function explodeRow($row)
-		
-		/**
-		 * Liest die BLZBic Infodatei und gibt Informationen anhand der BLZ oder BIC zurÃŒck
-		 * http://www.bundesbank.de/Redaktion/DE/Downloads/Aufgaben/Unbarer_Zahlungsverkehr/Bankleitzahlen/merkblatt_bankleitzahlendatei.pdf?__blob=publicationFile
-		 * http://www.bundesbank.de/Redaktion/DE/Standardartikel/Aufgaben/Unbarer_Zahlungsverkehr/bankleitzahlen_download.html
-		 */
-		private function readBLZBICFile($filename, $searchBLZ = false, $searchBIC = false)
-		{
-			
-			if ($searchBLZ === false && $searchBIC === false) return array();
-			
-			$handle = fopen($filename, "r");
-			 
-			while (($line = fgets($handle, 4096)) !== false) 
-			{
-				
-				$line = trim($line);
-								
-				$arRow = $this->explodeRow($line);
-				
-				// Nur Hauptsitze erfassen
-				if (trim($arRow['8']) === '') continue;
-												 
-				if ($arRow['bic'] == $searchBIC || $arRow['blz'] == $searchBLZ) return $arRow;
-				
-			}
-			
-			return false;
-			
-		} // private function readBLZBICFile($file, $searchBLZ = false, $searchBIC = false)
-		
-		/**
-		 * Gibt die Ganzzahl fÃŒr einen Buchstaben zurÃŒck fÃŒr PrÃŒfsummenberechnung
-		 */
-		private function getAlphanumericInt($char)
-		{
-			
-			return (ord($char) - 55);
-			
-		} // private function getAlphanumericInt($char)
-		
-		/**
-		 * Versucht Nutzereingaben in valide Floatwerte zu wandeln
-		 */
-		private function toFloat($value)
-		{
-				
-			// Alles auÃer Zahlen, Punkt und Komma entfernen
-			$value = preg_replace('/[^\d|^\.|^\,|^\-]/', '', $value);
-		
-			if (strpos($value, ".") && strpos($value, ","))
-			{
-					
-				// , und . drin
-				if (strpos($value, ",") > strpos($value, "."))
-				{
-		
-					//1.123,23
-					return floatval(str_replace(",", ".", str_replace(".", "", $value)));
-		
-				}
-				else
-				{
-		
-					//1,234.23
-					return floatval(str_replace(",", "", $value));
-		
-				}
-					
-			}
-		
-			return floatval(str_replace(",", ".", $value));
-			
-		} // function toFloat($value)
-		
-		/**
-		 * Fehlerbehandlung
-		 */
-		private function handleError($errorCode)
-		{
-			
-			$strError = "UngÃŒltiger Fehlercode";
-			
-			switch ($errorCode)
-			{
-				
-				case 1: $strError = 'UngÃŒltige Zeichenkodierung'; break;
-				case 2: $strError = 'UngÃŒltige BIC'; break;
-				case 3: $strError = 'Kein EpfÃ€nger angegeben'; break;
-				case 4: $strError = 'UngÃŒltige IBAN angebeen'; break;		
-				case 5: $strError = 'Kein Betrag angegeben'; break;
-				case 6: $strError = 'Text ist zu lang, es sind maximal 140 Zeichen mÃ¶glich'; break;
-				case 7: $strError = 'IBAN hat ein ungÃŒltiges Format'; break;
-				case 8: $strError = 'BLZ/BIC Datendatei existiert nicht'; break;
-				case 9: $strError = 'BLZ wurde in Bankdatei nicht gefunden'; break;
-				case 10: $strError = 'Datei fÃŒr Ausgabe kann nicht geschrieben werden'; break;
-				case 11: $strError = 'PrÃŒfziffer der IBAN stimmt nicht'; break;
-								
-			}
-			
-			$this->arError[] = $strError;
-						
-		} // private function handleError($errorCode)
-		
-		public function hasError()
-		{
-			
-			return ((sizeof($this->arError) > 0)?true:false);
-			
-		} // private function hasError()
-		
-		public function getError()
-		{
-			
-			$arReturn = $this->arError;
-			
-			$this->arError = array();
-		 
-			return $arReturn;
-			
-		} // private function getError()
-		
-	}
-
-?>
Index: /lib/phpseclib0.3.0/Crypt/Hash.php
===================================================================
--- /lib/phpseclib0.3.0/Crypt/Hash.php	(revision 8528)
+++ /lib/phpseclib0.3.0/Crypt/Hash.php	(revision 5261)
@@ -153,6 +153,5 @@
      * @access public
      */
-    //function Crypt_Hash($hash = 'sha1')
-    public function __construct($hash = 'sha1')
+    function Crypt_Hash($hash = 'sha1')
     {
         if ( !defined('CRYPT_HASH_MODE') ) {
Index: /lib/phpseclib0.3.0/Crypt/RSA.php
===================================================================
--- /lib/phpseclib0.3.0/Crypt/RSA.php	(revision 8528)
+++ /lib/phpseclib0.3.0/Crypt/RSA.php	(revision 5261)
@@ -459,6 +459,5 @@
      * @access public
      */
-    //function Crypt_RSA()
-    public function __construct()
+    function Crypt_RSA()
     {
         if (!class_exists('Math_BigInteger')) {
Index: /lib/phpseclib0.3.0/Math/BigInteger.php
===================================================================
--- /lib/phpseclib0.3.0/Math/BigInteger.php	(revision 8528)
+++ /lib/phpseclib0.3.0/Math/BigInteger.php	(revision 5261)
@@ -257,6 +257,5 @@
      * @access public
      */
-    //function Math_BigInteger($x = 0, $base = 10)
-    function __construct($x = 0, $base = 10)
+    function Math_BigInteger($x = 0, $base = 10)
     {
         if ( !defined('MATH_BIGINTEGER_MODE') ) {
Index: /lib/socialshareprivacy/index.html
===================================================================
--- /lib/socialshareprivacy/index.html	(revision 5261)
+++ /lib/socialshareprivacy/index.html	(revision 5261)
@@ -0,0 +1,741 @@
+<!DOCTYPE HTML>
+<html lang="de-DE">
+<head>
+    <title>Dokumentation &ndash; heise &bdquo;socialSharePrivacy&ldquo;&ndash;Plug-In</title>
+    <meta charset="UTF-8" />
+    <meta name="author" content="Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt - Heise Zeitschriften Verlag GbmH &amp; Co. KG" />
+    <meta name="description" content="Dokumentation und Einbindung des heise SocialSharePrivacy-Plug-Ins" />
+    <style type="text/css">
+        h1, h2, h3 {
+            font: normal 24px/30px Georgia, Times, "Times New Roman", serif; 
+            color: #666;
+        }
+        h2 {
+            font-size: 22px;
+            line-height: 28px;
+        }
+        h3 {
+            font-size: 20px;
+            line-height: 26px;
+        }
+        a {
+            color: #039;
+        }
+        pre {
+            background-color: #eee; 
+            border: 1px solid #bbb;
+            padding: 10px; 
+            margin: 20px 0 0;
+        }
+        pre code {
+            margin: 0; 
+            padding: 0;
+        }
+        pre + p {
+            margin-top: 5px;
+        }
+        ol li, p, td, th {
+            font: normal 14px/20px "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, sans-serif; 
+            clear: both;
+        }
+        nav {
+            display: block; 
+            margin-bottom: 50px;
+            border-bottom: 1px solid #333;
+        }
+        nav ol li,
+        nav ol li a {
+            font: bold 16px/24px "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, sans-serif;
+            color: #039;
+            -moz-transition: all .5s ease-in;
+            -webkit-transition: all .5s ease-in;
+            transition: all .5s ease-in;
+        }
+        nav ol li a:hover {
+            text-decoration: none; 
+            color: #333;
+        }
+        ol#structure li ol {
+            list-style-type: none; 
+            padding: 0;
+        }
+        ol#structure li ol#fb_app_id_step_by_step {
+            list-style-type: decimal;
+            padding-left: 20px;
+        }
+        ol#structure li ol#fb_app_id_step_by_step li {
+            margin-bottom: 16px;
+        }
+        ol#structure li ol li {
+            margin-bottom: 30px; 
+        }
+        ol#structure li ol li table {
+            border: 1px solid #333;
+            width: 100%;
+            display: table;
+            margin: 20px 0;
+        }
+        ol#structure li ol.changelog li {
+            margin: 5px 0;
+        }
+        ol#structure li ol.changelog li pre {
+            margin: 5px 0 20px;
+        }
+        table caption {
+            text-align: left; 
+            font-size: 18px; 
+            font-weight: bold; 
+            text-indent: 5px; 
+        }
+        table th {
+            text-align: left; 
+            font-style: italic; 
+            background-color: #333;
+            color: #fff;
+        }
+        table th, 
+        table td {
+            padding: 2px 4px; 
+            vertical-align: top; 
+        }
+        table tr:hover td {
+            background-color: #eee;
+        }
+    </style>
+</head>
+<body>
+    <h1>jQuery Plug-In socialshareprivacy &ndash; Dokumentation</h1>
+
+    <h3>Download des jQuery-Plug-Ins:</h3>
+    <p>
+        <a href="http://www.heise.de/extras/socialshareprivacy/jquery.socialshareprivacy.zip">jquery.socialshareprivacy.zip</a><br />
+        <a href="http://www.heise.de/extras/socialshareprivacy/jquery.socialshareprivacy.tar.gz">jquery.socialshareprivacy.tar.gz</a>
+    </p>
+        
+    <nav>
+        <h2>Navigation</h2>
+        <ol>
+            <li><a href="#changelog">Change-Log</a></li>
+            <li><a href="#files">Dateien</a></li>
+            <li><a href="#pre">Voraussetzungen und EinschrÃ€nkungen</a></li>
+            <li><a href="#dimensions">AusmaÃe</a></li>
+            <li>Einfache Einbindung
+                <ol>
+                    <li><a href="#merge">Quelltext</a></li>
+                    <li><a href="#explanation">ErklÃ€rung des Codes</a></li>
+                </ol>
+            </li>
+            <li><a href="#options">Optionen</a>
+                <ol>
+                    <li><a href="#options_general">Allgemein</a></li>
+                    <li><a href="#options_facebook">Facebook</a></li>
+                    <li><a href="#options_twitter">Twitter</a></li>
+                    <li><a href="#options_gplus">Google+</a></li>
+                </ol>
+            </li>
+            <li><a href="#examples">Beispiel-Einbindungen</a>
+                <ol>
+                    <li><a href="#only_fb">Nur Facebook einbinden</a></li>
+                    <li><a href="#no_perma">Keine Option zum dauerhaften Aktivieren anbieten</a></li>
+                    <li><a href="#only_gplus_css_path">Nur Google+ anbieten und eigenen Pfad fÃŒr die CSS-Datei angeben.</a></li>
+                </ol>
+            </li>
+            <li><a href="#url">URL</a></li>
+            <li><a href="#perma_option">Einstellung merken</a></li>
+            <li><a href="#licence">Lizenz</a></li>
+            <li><a href="#logo">Logo</a></li>
+        </ol>
+    </nav>
+    
+    <ol id="structure">
+        <li>
+            <h2 id="changelog">Change-Log</h2>
+            <ol class="changelog">
+                <li>
+                    <h3 id="v1-4">Version 1.4</h3>
+                    <ul>
+                        <li>
+                            Grafik: Da Google+ eine neue aktive Grafik einsetzt, wurde nun auch die inaktive Google+ Grafik angepasst<br />
+                            alt: <img src="/extras/socialshareprivacy/socialshareprivacy/images/dummy_gplus_alt.png" alt="alte Google+ Grafik" /><br />
+                            neu: <img src="/extras/socialshareprivacy/socialshareprivacy/images/dummy_gplus.png" alt="neue Google+ Grafik" /><br />
+                        </li>
+                    </ul>
+                </li>
+                <li>
+                    <h3 id="v1-3">Version 1.3</h3>
+                    <ul>
+                        <li>
+                            Erste Fassung, die auch mehrmals auf einer Seite verwendet werden kann. Damit in den verschiedenen Instanzen unterschiedliche URIs verwendet werden kÃ¶nnen, wird der per Option <code>uri</code> gesetzen Funktion ein Kontext-DOM-Knoten ÃŒbergeben, ÃŒber den man eine URI ermitteln kann. Beispiele fÃŒr die Verwendung haben wir in der Dokumentation bei den <a href="#examples">Beispiel-Einbindungen</a> ergÃ€nzt.
+                        </li>
+                        <li>
+                            Korrektur fÃŒr IE &lt; 9: Das per <code>css_path</code> angegebene Stylesheet wurde mit jQuery-Versionen != 1.4.2 nicht eingebaut.
+                        </li>
+                    </ul>
+                </li>
+                <li>
+                    <h3 id="v1-2">Version 1.2</h3>
+                    <ul>
+                        <li>
+                            JS: Facebook App-ID entfernt, da diese nicht mehr nÃ¶tig ist, um den Like/Recommend-Button zu nutzen.
+                        </li>
+                    </ul>
+                </li>
+                <li>
+                    <h3 id="v1-1">Version 1.1</h3>
+                    <ul>
+                        <li>
+                            CSS: Bei diversen Elementen haben wir mehr Angaben hinzugefÃŒgt, um die Nacharbeiten, bei der Integration in eigene Seiten, geringer zu halten. Vor allem haben wir <code>margin</code>-, <code>padding</code>-, <code>width</code>- und <code>height</code>-Angaben hinzugefÃŒgt.
+                        </li>
+                        <li>
+                            Die Doku wurde um einen Beispiele- und diesen Change-Log-Bereich erweitert. 
+                        </li>
+                        <li>
+                            Das Plug-In wurde inhaltlich etwas umgestellt und einige Code-AbkÃŒrzungen vorgenommen.
+                        </li>
+                        <li>
+                            JS-Bug Korrektur: Es gab einen Fehler, wenn es in der Seite ein <code>canonical</code>-Attribut gab, das aber einen leeren Wert hatte.
+                        </li>
+                        <li>
+                            JS-Bug Korrektur: Bei den Optionen von Google+ gab es eine Angabe, die spÃ€ter im Script nie abgefragt wurde.
+                        </li>
+                        <li>
+                            JS-Bug Korrektur: Die Perma-Option von Google+ wurde nur angezeigt, wenn auch die Perma-Option von Twitter aktiviert war.
+                        </li>
+                        <li>
+                            Twitter: Wenn aktiviert war das iFrame zu groÃ und ÃŒberlagerte darunter liegende Links. <code>&lt;iframe ...style="width:130px; height:25px;">&lt;/iframe></code> ergÃ€nzt.
+                        </li>
+                        <li>Allgemein: Wenn die Option css_path leer ist, wird kein &lt;link>-Tag mit leerem href in die Seite eingebaut.</li>
+                        <li>Allgemein: Die von den Buttons verwendete URI kann jetzt ÃŒber die Option <code>uri</code> gesteuert werden. Es ist sowohl ein fester Wert, wie auch eine Function mÃ¶glich. Default ist die enthaltene Funktion <code>getURI</code></li>
+                        <li><strong>Neue Features:</strong>
+                            <ul>
+                                <li>Facebook: Die Beschriftungsvarianten des Buttons "Empfehlen" und "GefÃ€llt mir" kann ÃŒber die neue Option "action" gesteuert werden. Werte sind "<code>recommend</code>" (default) und "<code>like</code>".</li>
+                                <li>Twitter: Parameter "<code>language</code>" (default "<code>en</code>") jetzt auch fÃŒr Twitter.</li>
+                            </ul>
+                        </li>
+                    </ul>
+                </li>
+                <li>
+                    <h3 id="v1-0">Version 1.0</h3>
+                    <ul>
+                        <li>Erstes Ã¶ffentliches Release</li>
+                    </ul>
+                </li>
+            </ol>
+        </li>
+
+        <li>
+            <h2 id="files">Dateien</h2>
+            <p>Zu unserem Plug-In gehÃ¶ren folgende Dateien:</p>
+            <ul>
+                <li>index.html (die Doku, die Sie gerade lesen)</li>
+                <li>dimensions.gif (Infografik fÃŒr diese Doku)</li>
+                <li>2-klick-logo_min.jpg (Logo klein)</li>
+                <li>jquery.socialshareprivacy.js</li>
+                <li>jquery.socialshareprivacy.min.js</li>
+                <li>socialshareprivacy/socialshareprivacy.css</li>
+                <li>socialshareprivacy/images/dummy_facebook.png</li>
+                <li>socialshareprivacy/images/dummy_facebook_en.png</li>
+                <li>socialshareprivacy/images/dummy_gplus.png</li>
+                <li>socialshareprivacy/images/dummy_twitter.png</li>
+                <li>socialshareprivacy/images/settings.png</li>
+                <li>socialshareprivacy/images/socialshareprivacy_info.png</li>
+                <li>socialshareprivacy/images/socialshareprivacy_on_off.png</li>
+                <li>socialshareprivacy/images/2-klick-logo.jpg</li>
+            </ul>
+        </li>
+        <li>
+            <h2 id="pre">Voraussetzungen und EinschrÃ€nkungen</h2>
+            <p>
+                Technische Voraussetzungen sind jQuery und aktiviertes JavaScript im Browser. Bei uns getestet mit jQuery 1.4.<br />
+                Das Plug-In kann derzeit innerhalb einer HTML-Seite nur einmal verwendet werden.
+            </p>
+            <p>
+                Wenn Sie VorschlÃ€ge zur Verbesserung haben, wenden Sie sich gerne per Mail an <a href="mailto:2klick@heise.de?subject=Vorschlag%20zum%20Plug-In">2klick@heise.de</a>.
+            </p>
+            <p>
+                Das dauerhafte Aktivieren der Services funktioniert im Internet Explorer erst ab Version 8, da die VorgÃ€ngerversionen kein JSON unterstÃŒtzen. Daher fehlt im IE &lt;= 7 diese Funktion. Der Rest des Plug-Ins ist davon nicht betroffen.
+            </p>
+            <p>
+                <del datetime="2011-10-04" cite="http://www.heise.de/extras/socialshareprivacy/#v1-2">FÃŒr Facebook ist zwingend eine eigene App-ID notwendig, siehe dazu <a href="#fb_app-id">Hinweis zur Facebook App-ID</a>.</del>
+            </p>
+        </li>
+        <li>
+            <h2 id="dimensions">AusmaÃe</h2>
+            <img src="dimensions.gif" width="600" height="284" alt="AusmaÃe des Plug-Ins" />
+            <p>
+                Das Plug-In benÃ¶tigt insgesamt etwa 600 Pixel in der Breite (wenn alle Services aktiviert sind) und ca. 290 Pixel in der HÃ¶he, wobei dies natÃŒrlich auch von der LÃ€nge der angegebenen MouseOver-Texte abhÃ€ngt.
+            </p>
+        <li>
+            <ol>
+                <li>
+                    <h2 id="merge">Einbindung</h2>
+<pre>
+<code>&lt;head&gt;
+  &hellip;
+  &lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt; 
+  &lt;script type="text/javascript" src="jquery.socialshareprivacy.js"&gt;&lt;/script&gt;
+  &lt;script type="text/javascript"&gt;
+    jQuery(document).ready(function($){
+      if($('#socialshareprivacy').length > 0){
+        $('#socialshareprivacy').socialSharePrivacy(); 
+      }
+    });
+  &lt;/script&gt;
+  &hellip;
+&lt;/head&gt;
+&lt;body&gt;
+  &hellip;
+  &lt;div id="socialshareprivacy"&gt;&lt;/div&gt;
+  &hellip;
+&lt;/body&gt;</code>
+</pre>
+                </li>
+                <li>
+                    <h3 id="explanation">ErklÃ€rung des Codes</h3>
+
+<pre>
+<code>&lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt; 
+&lt;script type="text/javascript" src="jquery.socialshareprivacy.js"&gt;&lt;/script&gt;</code>
+</pre>
+                    <p>
+                        Die erste Zeile bindet das JavaScript-Framework &bdquo;JQuery&ldquo; (<a href="http://jquery.com/">http://jquery.com/</a>) ein, die zweite Zeile unser Plug-In. jQuery liegt unserem Paket <strong>nicht</strong> bei, Sie mÃŒssen es erst noch selbst von der eben genannten Website herunterladen.
+                    </p>
+
+<pre>
+<code>&lt;script type="text/javascript"&gt;
+  jQuery(document).ready(function($){
+    if($('#socialshareprivacy').length > 0){
+      $('#socialshareprivacy').socialSharePrivacy(); 
+    }
+  });
+&lt;/script&gt;</code>
+</pre>
+                    <p>
+                        In diesem <code>&lt;script&gt;</code>-Block wird die Plug-In Funktion an ein frei wÃ€hlbares, leeres HTML-Element in der Seite gehÃ€ngt, in diesem Fall das Element mit der <code>id</code> <em>socialshareprivacy</em>.<br />
+                        Damit das AnhÃ€ngen des Plug-Ins nur dann geschieht, wenn das Element auch wirklich vorhanden ist, haben wir noch die Kontrollfunktion <code>if</code>, die das AnhÃ€ngen umschlieÃt und die nÃ¶tige Bedingung prÃŒft.
+                    </p>
+
+<pre>
+<code>&lt;body&gt;
+  &hellip;
+  &lt;div id="socialshareprivacy"&gt;&lt;/div&gt;
+  &hellip;
+&lt;/body&gt;</code>
+</pre>
+                    <p>
+                        Irgendwo im <code>&lt;body&gt;</code>-Bereich der Website platziert man das leere HTML-Element mit der gewÃŒnschten <code>id</code>, die identisch zur verwendeten <code>id</code> im vorhergehenden <code>&lt;script&gt;</code>-Block sein muss.
+                    </p>
+                </li>
+            </ol>
+        </li>
+        <li>
+            <h2 id="options">Optionen</h2>
+            <p>
+                Zur Einbindung stehen diverse Optionen zur VerfÃŒgung. Im Folgenden sind erstmal die allgemeinen Optionen aufgefÃŒhrt und anschlieÃend die Optionen nach den einzelnen Services (Facebook, Twitter, Google+) aufgelistet.<br />
+                Beispiel fÃŒr einen Aufruf mit Optionen:
+            </p>
+<pre>
+<code>$('#socialshareprivacy').socialSharePrivacy({
+  services : {
+    facebook : {
+      'perma_option': 'off'
+    }, 
+    twitter : {
+        'status' : 'off'
+    },
+    gplus : {
+      'display_name' : 'Google Plus'
+    }
+  },
+  'cookie_domain' : 'heise.de'
+});</code>
+</pre>
+            <ol>
+                <li id="options_general">
+                    <table summary="Eine Auflistung aller allgemeinen Optionen des socialSharePrivacy-Plug-Ins">
+                        <caption>allgemeine Optionen</caption>
+                        <thead>
+                            <tr>
+                                <th>Option</th>
+                                <th>Standardwert</th>
+                                <th>Beschreibung</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr>
+                                <td>info_link</td>
+                                <td>http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html</td>
+                                <td>Link zu detaillierter Datenschutz-Info, in unserem Fall ein heise-Artikel.</td>
+                            </tr>
+                            <tr>
+                                <td>txt_help</td>
+                                <td><em>Text</em></td>
+                                <td>MouseOver-Text des <em>i</em>-Icons</td>
+                            </tr>
+                            <tr>
+                                <td>settings_perma</td>
+                                <td>Dauerhaft aktivieren und Daten&uuml;ber&shy;tragung zustimmen:</td>
+                                <td>Ãberschrift des EinstellungsmenÃŒs</td>
+                            </tr>
+                            <tr>
+                                <td>cookie_path</td>
+                                <td>/</td>
+                                <td>Pfad der GÃŒltigkeit des Cookies</td>
+                            </tr>
+                            <tr>
+                                <td>cookie_domain</td>
+                                <td><code>document.location.host</code></td>
+                                <td>Domain fÃŒr die das Cookie gÃŒltig ist</td>
+                            </tr>
+                            <tr>
+                                <td>cookie_expires</td>
+                                <td>365</td>
+                                <td>Dauer die das Cookie gÃŒltig ist in Tagen</td>
+                            </tr>
+                            <tr>
+                                <td>css_path</td>
+                                <td>socialshareprivacy/socialshareprivacy.css</td>
+                                <td>Pfad zur CSS-Datei, wenn leer wird kein Stylesheet eingebaut</td>
+                            </tr>
+                            <tr>
+                                <td>uri</td>
+                                <td>getURI</td>
+                                <td>Die URI, die von den Buttons weitergegeben werden soll. MÃ¶glich ist ein fester Wert (z.B. <code>"http://www.heise.de"</code>) oder eine Funktion (siehe <code>function getURI()</code> im Plug-In-Quellcode)</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </li>
+                <li id="options_facebook">
+                    <table summary="Eine Auflistung aller Optionen fÃŒr Facebook des socialSharePrivacy-Plug-Ins">
+                        <caption>Optionen: Facebook</caption>
+                        <thead>
+                            <tr>
+                                <th>Option</th>
+                                <th>Standardwert</th>
+                                <th>Beschreibung</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr>
+                                <td>status</td>
+                                <td>on</td>
+                                <td>Der User hat Facebook zur Auswahl</td>
+                            </tr>
+                            <tr>
+                                <td><del datetime="2011-10-04" cite="http://www.heise.de/extras/socialshareprivacy/#v1-2">app_id</del></td>
+                                <td><em>entfallen (seit Version 1.2)</em></td>
+                                <td><del datetime="2011-10-04" cite="http://www.heise.de/extras/socialshareprivacy/#v1-2">Facebook App-ID; Sie ist nÃ¶tig um den <em>Empfehlen</em>-Button von Facebook nutzen zu kÃ¶nnen. Ist sie nicht angegeben, wird dem User Facebook trotz <code>'status' : 'on'</code> <strong>nicht</strong> angeboten. In der JavaScript-Konsole wird dem Entwickler ein entsprechender Hinweis ausgegeben.</del></td>
+                            </tr>
+                            <tr>
+                                <td>dummy_img</td>
+                                <td>socialshareprivacy/images/dummy_facebook.png</td>
+                                <td>Pfad zur statischen Grafik</td>
+                            </tr>
+                            <tr>
+                                <td>txt_info</td>
+                                <td><em>Text</em></td>
+                                <td>MouseOver-Text des Empfehlen-Buttons</td>
+                            </tr>
+                            <tr>
+                                <td>txt_fb_off</td>
+                                <td>nicht mit Facebook verbunden</td>
+                                <td>Text-Entsprechung der Schalter-Grafik im ausgeschalteten Zustand, in der Regel nicht sichtbar fÃŒr den User</td>
+                            </tr>
+                            <tr>
+                                <td>txt_fb_on</td>
+                                <td>mit Facebook verbunden</td>
+                                <td>Text-Entsprechung der Schalter-Grafik im eingeschalteten Zustand, in der Regel nicht sichtbar fÃŒr den User</td>
+                            </tr>
+                            <tr>
+                                <td>perma_option</td>
+                                <td>on</td>
+                                <td>Der User hat die Option sich Facebook dauerhaft einblenden zu lassen (mittels Cookie)</td>
+                            </tr>
+                            <tr>
+                                <td>display_name</td>
+                                <td>Facebook</td>
+                                <td>Schreibweise des Service in den Optionen</td>
+                            </tr>
+                            <tr>
+                                <td>referrer_track</td>
+                                <td>&nbsp;</td>
+                                <td>Wird ans Ende der URL gehÃ€ngt, kann zum Tracken des Referrers genutzt werden</td>
+                            </tr>
+                            <tr>
+                                <td>language</td>
+                                <td>de_DE</td>
+                                <td>Spracheinstellung</td>
+                            </tr>
+                            <tr>
+                                <td>action</td>
+                                <td>recommend</td>
+                                <td>Beschriftung des Buttons: Empfehlen (<code>recommend</code>) oder GefÃ€llt mir (<code>like</code>)</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </li>
+                <li id="options_twitter">
+                    <table summary="Eine Auflistung aller Optionen fÃŒr Twitter des socialSharePrivacy-Plug-Ins">
+                        <caption>Optionen: Twitter</caption>
+                        <thead>
+                            <tr>
+                                <th>Option</th>
+                                <th>Standardwert</th>
+                                <th>Beschreibung</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr>
+                                <td>status</td>
+                                <td>on</td>
+                                <td>Der User hat Twitter zur Auswahl</td>
+                            </tr>
+                            <tr>
+                                <td>dummy_img</td>
+                                <td>socialshareprivacy/images/dummy_twitter.png</td>
+                                <td>Pfad zur statischen Grafik</td>
+                            </tr>
+                            <tr>
+                                <td>txt_info</td>
+                                <td><em>Text</em></td>
+                                <td>MouseOver-Text des Tweet-Buttons</td>
+                            </tr>
+                            <tr>
+                                <td>txt_twitter_off</td>
+                                <td>nicht mit Twitter verbunden</td>
+                                <td>Text-Entsprechung der Schalter-Grafik im ausgeschalteten Zustand, in der Regel nicht sichtbar fÃŒr den User</td>
+                            </tr>
+                            <tr>
+                                <td>txt_twitter_on</td>
+                                <td>mit Twitter verbunden</td>
+                                <td>Text-Entsprechung der Schalter-Grafik im eingeschalteten Zustand, in der Regel nicht sichtbar fÃŒr den User</td>
+                            </tr>
+                            <tr>
+                                <td>perma_option</td>
+                                <td>on</td>
+                                <td>Der User hat die Option sich Twitter dauerhaft einblenden zu lassen (mittels Cookie)</td>
+                            </tr>
+                            <tr>
+                                <td>display_name</td>
+                                <td>Twitter</td>
+                                <td>Schreibweise des Service in den Optionen</td>
+                            </tr>
+                            <tr>
+                                <td>referrer_track</td>
+                                <td>&nbsp;</td>
+                                <td>Wird ans Ende der URL gehÃ€ngt, kann zum Tracken des Referrers genutzt werden</td>
+                            </tr>
+                            <tr>
+                                <td>tweet_text</td>
+                                <td><code>getTweetText</code></td>
+                                <td>
+                                    Die Funktion prÃŒft ob es die Meta-Angabe <code>DC.title</code> gibt und verwendet diese. Gibt es auÃerdem noch <code>DC.creator</code> wird diese etwas abgesetzt (&quot; - &quot;) hinten angehÃ€ngt. Ist <code>DC.title</code> nicht vorhanden wird das &lt;title&gt;-Tag der Seite verwendet.<br />
+                                    Diese Option kann mit einem eigenen Text (<code>typeof == string</code>) ÃŒberschrieben werden oder mit einer eigenen Funktion (<code>typeof == function</code>), die den Text generiert.<br />
+                                    Der ÃŒbergebene Texte wird immer auf 120 Zeichen gekÃŒrzt und beim letzten Leerzeichen mit &hellip; ersetzt.
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>language</td>
+                                <td>en</td>
+                                <td>Spracheinstellung (Default: "<code>en</code>" ja, uns gefÃ€llt Tweet besser als Twittern)</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </li>
+                <li id="options_gplus">
+                    <table summary="Eine Auflistung aller Optionen fÃŒr Google+ des socialSharePrivacy-Plug-Ins">
+                        <caption>Optionen: Google+</caption>
+                        <thead>
+                            <tr>
+                                <th>Option</th>
+                                <th>Standardwert</th>
+                                <th>Beschreibung</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr>
+                                <td>status</td>
+                                <td>on</td>
+                                <td>Der User hat Google+ zur Auswahl</td>
+                            </tr>
+                            <tr>
+                                <td>dummy_img</td>
+                                <td>socialshareprivacy/images/dummy_gplus.png</td>
+                                <td>Pfad zur statischen Grafik</td>
+                            </tr>
+                            <tr>
+                                <td>txt_info</td>
+                                <td><em>Text</em></td>
+                                <td>MouseOver-Text des &bdquo;+1&ldquo;-Buttons</td>
+                            </tr>
+                            <tr>
+                                <td>txt_gplus_off</td>
+                                <td>nicht mit Google+ verbunden</td>
+                                <td>Text-Entsprechung der Schalter-Grafik im ausgeschalteten Zustand, in der Regel nicht sichtbar fÃŒr den User</td>
+                            </tr>
+                            <tr>
+                                <td>txt_gplus_on</td>
+                                <td>mit Google+ verbunden</td>
+                                <td>Text-Entsprechung der Schalter-Grafik im eingeschalteten Zustand, in der Regel nicht sichtbar fÃŒr den User</td>
+                            </tr>
+                            <tr>
+                                <td>perma_option</td>
+                                <td>on</td>
+                                <td>Der User hat die Option sich Google+ dauerhaft einblenden zu lassen (mittels Cookie)</td>
+                            </tr>
+                            <tr>
+                                <td>display_name</td>
+                                <td>Google+</td>
+                                <td>Schreibweise des Service in den Optionen</td>
+                            </tr>
+                            <tr>
+                                <td>referrer_track</td>
+                                <td>&nbsp;</td>
+                                <td>Wird ans Ende der URL gehÃ€ngt, kann zum Tracken des Referrers genutzt werden</td>
+                            </tr>
+                            <tr>
+                                <td>language</td>
+                                <td>de</td>
+                                <td>Spracheinstellung</td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </li>
+            </ol>
+        </li>
+        <li>
+            <h2 id="examples">Beispiel-Einbindungen</h2>
+            <p>
+                Im Folgenden sehen Sie ein paar beispielhafte Einbindungen von gÃ€ngigen Konfigurationen.
+            </p>
+            <ul>
+                <li>
+                    <h3 id="only_fb">Nur Facebook einbinden</h3>
+<pre>
+<code>$('#socialshareprivacy').socialSharePrivacy({
+    services : {
+        twitter : {
+            'status' : 'off'
+        },
+        gplus : {
+            'status' : 'off'
+        }
+    }
+});</code>
+</pre>
+                </li>
+                <li>
+                    <h3 id="no_perma">Keine Option zum dauerhaften Aktivieren anbieten</h3>
+<pre>
+<code>$('#socialshareprivacy').socialSharePrivacy({
+    services : {
+        facebook : {
+            'perma_option'  : 'off'
+        }, 
+        twitter : {
+            'perma_option' : 'off'
+        },
+        gplus : {
+            'perma_option' : 'off'
+        }
+    }
+});</code>
+</pre>
+                </li>
+                <li>
+                    <h3 id="only_gplus_css_path">Nur Google+ anbieten und eigenen Pfad fÃŒr die CSS-Datei angeben.</h3>
+<pre>
+<code>$('#socialshareprivacy').socialSharePrivacy({
+    services : {
+        facebook : {
+            'status' : 'off'
+        }, 
+        twitter : {
+            'status' : 'off'
+        }
+    },
+    'css_path' : '/style/plugins/socialshareprivacy.css'
+});</code>
+</pre>
+                </li>
+                <li>
+                    <h3>Mehrere 2-Klick-Buttonleisten auf einer Seite</h3>
+                    <h4>Variante 1: Ein Aufruf des Plug-Ins mit einem entsprechenden Selektor</h4>
+<pre>
+&lt;div class="anriss">
+    &lt;h3>&lt;a href="http://www.heise.de">heise&lt;/a>&lt;/h3>
+    &lt;p>lorem ipsum&lt;/p>
+    &lt;div class="social">&lt;/div>
+&lt;/div>
+
+&lt;div class="anriss">
+    &lt;h3>&lt;a href="http://www.heise.de/security/">heise security&lt;/a>&lt;/h3>
+    &lt;p>dolor sit amet&lt;/p>
+    &lt;div class="social">&lt;/div>
+&lt;/div>
+
+&lt;script>
+$(".social").socialSharePrivacy({
+    uri : function(context) {
+        return $(context).parents(".anriss").find("h3 a").attr("href");
+    }
+});
+&lt;/script>
+</pre>
+                            <h4>Variante 2: Mehrfacher Aufruf des Plug-Ins</h4>
+<pre>
+&lt;div>
+    &lt;h3>&lt;a href="http://www.heise.de">heise&lt;/a>&lt;/h3>
+    &lt;p>lorem ipsum&lt;/p>
+    &lt;div id="one">&lt;/div>
+&lt;/div>
+&lt;script>
+$("#one").socialSharePrivacy({
+    uri : "http://www.heise.de"
+});
+&lt;/script>
+
+&lt;div>
+    &lt;h3>&lt;a href="http://www.heise.de/security/">heise security&lt;/a>&lt;/h3>
+    &lt;p>dolor sit amet&lt;/p>
+    &lt;div id="two">&lt;/div>
+&lt;/div>
+&lt;script>
+$("#two").socialSharePrivacy({
+    uri : "http://www.heise.de/security/"
+});
+&lt;/script>
+</pre>
+
+                </li>
+            </ul>
+        </li>
+        <li>
+            <h2 id="url">URL</h2>
+            <p>
+                Die URL, die den Services ÃŒbergeben wird, kann ÃŒber eine Option gesteuert werden.<br />StandardmÃ€Ãig wird eine Funktion innerhalb des Plug-Ins verwendet, die die URL der aktuellen Seite aus <code>document.location.href</code> ermittelt, ist jedoch eine kanonische URL hinterlegt (<code>&lt;link rel="canonical"&gt;</code>), wird diese genommen.
+            </p>
+        </li>
+        <li>
+            <h2 id="perma_option">Einstellungen merken</h2>
+            <p>
+                Bevor das Cookie abgefragt wird, wie die Einstellungen des Users sind, wird erstmal geprÃŒft, wie das Plug-In konfiguriert ist. Ist das Plug-In eventuell nachtrÃ€glich umgestellt worden hat der User dadurch keine Nachteile.<br />
+                Wurde fÃŒr alle Services die Merken-Funktion ausgeschaltet (<code>'perma_option' : 'off'</code>) wird auch das EinstellungsmenÃŒ nicht mehr angezeigt.
+            </p>
+        </li>
+        <li>
+            <h2 id="licence">Lizenz</h2>
+            <p>
+                Dieses Plug-In ist unter der MIT License (<a href="http://www.opensource.org/licenses/mit-license.php">http://www.opensource.org/licenses/mit-license.php</a>) verÃ¶ffentlicht und darf gerne fÃŒr private, wie auch kommerzielle Zwecke genutzt werden.
+            </p>
+        </li>
+        <li>
+            <h2 id="logo">Logo</h2>
+            <p>
+                Unserem Plug-In liegt auch das von uns verwendete Logo bei, das Sie gerne zur Bewerbung dieser Aktion verwenden dÃŒrfen.
+                <a href="socialshareprivacy/images/2-klick-logo.jpg"><img src="2-klick-logo_min.jpg" width="150" height="150" alt="Logo 2 Klicks fÃŒr mehr Datenschutz" style="float: left;" /></a>
+            </p>
+        </li>
+    </ol>
+</body>
+</html>
Index: /lib/socialshareprivacy/jquery.socialshareprivacy.js
===================================================================
--- /lib/socialshareprivacy/jquery.socialshareprivacy.js	(revision 5261)
+++ /lib/socialshareprivacy/jquery.socialshareprivacy.js	(revision 5261)
@@ -0,0 +1,377 @@
+/*
+ * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz
+ *
+ * http://www.heise.de/extras/socialshareprivacy/
+ * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html
+ *
+ * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt,
+ * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de
+ *
+ * is released under the MIT License http://www.opensource.org/licenses/mit-license.php
+ *
+ * Spread the word, link to us if you can.
+ */
+(function ($) {
+
+    "use strict";
+
+	/*
+	 * helper functions
+	 */ 
+
+    // abbreviate at last blank before length and add "\u2026" (horizontal ellipsis)
+    function abbreviateText(text, length) {
+        var abbreviated = decodeURIComponent(text);
+        if (abbreviated.length <= length) {
+            return text;
+        }
+
+        var lastWhitespaceIndex = abbreviated.substring(0, length - 1).lastIndexOf(' ');
+        abbreviated = encodeURIComponent(abbreviated.substring(0, lastWhitespaceIndex)) + "\u2026";
+
+        return abbreviated;
+    }
+
+    // returns content of <meta name="" content=""> tags or '' if empty/non existant
+    function getMeta(name) {
+        var metaContent = $('meta[name="' + name + '"]').attr('content');
+        return metaContent || '';
+    }
+    
+    // create tweet text from content of <meta name="DC.title"> and <meta name="DC.creator">
+    // fallback to content of <title> tag
+    function getTweetText() {
+        var title = getMeta('DC.title');
+        var creator = getMeta('DC.creator');
+
+        if (title.length > 0 && creator.length > 0) {
+            title += ' - ' + creator;
+        } else {
+            title = $('title').text();
+        }
+
+        return encodeURIComponent(title);
+    }
+
+    // build URI from rel="canonical" or document.location
+    function getURI() {
+        var uri = document.location.href;
+        var canonical = $("link[rel=canonical]").attr("href");
+
+        if (canonical && canonical.length > 0) {
+            if (canonical.indexOf("http") < 0) {
+                canonical = document.location.protocol + "//" + document.location.host + canonical;
+            }
+            uri = canonical;
+        }
+
+        return uri;
+    }
+
+    function cookieSet(name, value, days, path, domain) {
+        var expires = new Date();
+        expires.setTime(expires.getTime() + (days * 24 * 60 * 60 * 1000));
+        document.cookie = name + '=' + value + '; expires=' + expires.toUTCString() + '; path=' + path + '; domain=' + domain;
+    }
+    function cookieDel(name, value, path, domain) {
+        var expires = new Date();
+        expires.setTime(expires.getTime() - 100);
+        document.cookie = name + '=' + value + '; expires=' + expires.toUTCString() + '; path=' + path + '; domain=' + domain;
+    }
+
+    // extend jquery with our plugin function
+    $.fn.socialSharePrivacy = function (settings) {
+        var defaults = {
+            'services' : {
+                'facebook' : {
+                    'status'            : 'on',
+                    'dummy_img'         : 'socialshareprivacy/images/dummy_facebook.png',
+                    'txt_info'          : '2 Klicks f&uuml;r mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k&ouml;nnen Ihre Empfehlung an Facebook senden. Schon beim Aktivieren werden Daten an Dritte &uuml;bertragen &ndash; siehe <em>i</em>.',
+                    'txt_fb_off'        : 'nicht mit Facebook verbunden',
+                    'txt_fb_on'         : 'mit Facebook verbunden',
+                    'perma_option'      : 'on',
+                    'display_name'      : 'Facebook',
+                    'referrer_track'    : '',
+                    'language'          : 'de_DE',
+                    'action'            : 'recommend'
+                }, 
+                'twitter' : {
+                    'status'            : 'on', 
+                    'dummy_img'         : 'socialshareprivacy/images/dummy_twitter.png',
+                    'txt_info'          : '2 Klicks f&uuml;r mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k&ouml;nnen Ihre Empfehlung an Twitter senden. Schon beim Aktivieren werden Daten an Dritte &uuml;bertragen &ndash; siehe <em>i</em>.',
+                    'txt_twitter_off'   : 'nicht mit Twitter verbunden',
+                    'txt_twitter_on'    : 'mit Twitter verbunden',
+                    'perma_option'      : 'on',
+                    'display_name'      : 'Twitter',
+                    'referrer_track'    : '', 
+                    'tweet_text'        : getTweetText,
+                    'language'          : 'en'
+                },
+                'gplus' : {
+                    'status'            : 'on',
+                    'dummy_img'         : 'socialshareprivacy/images/dummy_gplus.png',
+                    'txt_info'          : '2 Klicks f&uuml;r mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k&ouml;nnen Ihre Empfehlung an Google+ senden. Schon beim Aktivieren werden Daten an Dritte &uuml;bertragen &ndash; siehe <em>i</em>.',
+                    'txt_gplus_off'     : 'nicht mit Google+ verbunden',
+                    'txt_gplus_on'      : 'mit Google+ verbunden',
+                    'perma_option'      : 'on',
+                    'display_name'      : 'Google+',
+                    'referrer_track'    : '',
+                    'language'          : 'de'
+                }
+            },
+            'info_link'         : 'http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html',
+            'txt_help'          : 'Wenn Sie diese Felder durch einen Klick aktivieren, werden Informationen an Facebook, Twitter oder Google in die USA &uuml;bertragen und unter Umst&auml;nden auch dort gespeichert. N&auml;heres erfahren Sie durch einen Klick auf das <em>i</em>.',
+            'settings_perma'    : 'Dauerhaft aktivieren und Daten&uuml;ber&shy;tragung zustimmen:',
+            'cookie_path'       : '/',
+            'cookie_domain'     : document.location.host,
+            'cookie_expires'    : '365',
+            'css_path'          : 'socialshareprivacy/socialshareprivacy.css',
+            'uri'               : getURI
+        };
+
+        // Standardwerte des Plug-Ings mit den vom User angegebenen Optionen ueberschreiben
+        var options = $.extend(true, defaults, settings);
+
+        var facebook_on = (options.services.facebook.status === 'on');
+        var twitter_on  = (options.services.twitter.status  === 'on');
+        var gplus_on    = (options.services.gplus.status    === 'on');
+
+        // check if at least one service is "on"
+        if (!facebook_on && !twitter_on && !gplus_on) {
+            return;
+        }
+
+        // insert stylesheet into document and prepend target element
+        if (options.css_path.length > 0) {
+            // IE fix (noetig fuer IE < 9 - wird hier aber fuer alle IE gemacht)
+            if (document.createStyleSheet) {
+                document.createStyleSheet(options.css_path);
+            } else {
+                $('head').append('<link rel="stylesheet" type="text/css" href="' + options.css_path + '" />');
+            }
+        }
+
+        return this.each(function () {
+
+            $(this).prepend('<ul class="social_share_privacy_area"></ul>');
+            var context = $('.social_share_privacy_area', this);
+
+            // canonical uri that will be shared
+            var uri = options.uri;
+            if (typeof uri === 'function') {
+                uri = uri(context);
+            }
+
+            //
+            // Facebook
+            //
+            if (facebook_on) {
+                var fb_enc_uri = encodeURIComponent(uri + options.services.facebook.referrer_track);
+                var fb_code = '<iframe src="http://www.facebook.com/plugins/like.php?locale=' + options.services.facebook.language + '&amp;href=' + fb_enc_uri + '&amp;send=true&amp;layout=button_count&amp;width=120&amp;show_faces=false&amp;action=' + options.services.facebook.action + '&amp;colorscheme=light&amp;font&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:145px; height:21px;" allowTransparency="true"></iframe>';
+                var fb_dummy_btn = '<img src="' + options.services.facebook.dummy_img + '" alt="Facebook &quot;Like&quot;-Dummy" class="fb_like_privacy_dummy" />';
+
+                context.append('<li class="facebook help_info"><span class="info">' + options.services.facebook.txt_info + '</span><span class="switch off">' + options.services.facebook.txt_fb_off + '</span><div class="fb_like dummy_btn">' + fb_dummy_btn + '</div></li>');
+
+                var $container_fb = $('li.facebook', context);
+
+                $('li.facebook div.fb_like img.fb_like_privacy_dummy,li.facebook span.switch', context).live('click', function () {
+                    if ($container_fb.find('span.switch').hasClass('off')) {
+                        $container_fb.addClass('info_off');
+                        $container_fb.find('span.switch').addClass('on').removeClass('off').html(options.services.facebook.txt_fb_on);
+                        $container_fb.find('img.fb_like_privacy_dummy').replaceWith(fb_code);
+                    } else {
+                        $container_fb.removeClass('info_off');
+                        $container_fb.find('span.switch').addClass('off').removeClass('on').html(options.services.facebook.txt_fb_off);
+                        $container_fb.find('.fb_like').html(fb_dummy_btn);
+                    }
+                });
+            }
+
+            //
+            // Twitter
+            //
+            if (twitter_on) {
+                var text = options.services.twitter.tweet_text;
+                if (typeof text === 'function') {
+                    text = text();
+                }
+                // 120 is the max character count left after twitters automatic url shortening with t.co
+                text = abbreviateText(text, '120');
+
+                var twitter_enc_uri = encodeURIComponent(uri + options.services.twitter.referrer_track);
+                var twitter_count_url = encodeURIComponent(uri);
+                var twitter_code = '<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?url=' + twitter_enc_uri + '&amp;counturl=' + twitter_count_url + '&amp;text=' + text + '&amp;count=horizontal&amp;lang=' + options.services.twitter.language + '" style="width:130px; height:25px;"></iframe>';
+                var twitter_dummy_btn = '<img src="' + options.services.twitter.dummy_img + '" alt="&quot;Tweet this&quot;-Dummy" class="tweet_this_dummy" />';
+
+                context.append('<li class="twitter help_info"><span class="info">' + options.services.twitter.txt_info + '</span><span class="switch off">' + options.services.twitter.txt_twitter_off + '</span><div class="tweet dummy_btn">' + twitter_dummy_btn + '</div></li>');
+
+                var $container_tw = $('li.twitter', context);
+
+                $('li.twitter div.tweet img,li.twitter span.switch', context).live('click', function () {
+                    if ($container_tw.find('span.switch').hasClass('off')) {
+                        $container_tw.addClass('info_off');
+                        $container_tw.find('span.switch').addClass('on').removeClass('off').html(options.services.twitter.txt_twitter_on);
+                        $container_tw.find('img.tweet_this_dummy').replaceWith(twitter_code);
+                    } else {
+                        $container_tw.removeClass('info_off');
+                        $container_tw.find('span.switch').addClass('off').removeClass('on').html(options.services.twitter.txt_twitter_off);
+                        $container_tw.find('.tweet').html(twitter_dummy_btn);
+                    }
+                });
+            }
+
+            //
+            // Google+
+            //
+            if (gplus_on) {
+                // fuer G+ wird die URL nicht encoded, da das zu einem Fehler fuehrt
+                var gplus_uri = uri + options.services.gplus.referrer_track;
+                
+                // we use the Google+ "asynchronous" code, standard code is flaky if inserted into dom after load
+                var gplus_code = '<div class="g-plusone" data-size="medium" data-href="' + gplus_uri + '"></div><script type="text/javascript">window.___gcfg = {lang: "' + options.services.gplus.language + '"}; (function() { var po = document.createElement("script"); po.type = "text/javascript"; po.async = true; po.src = "https://apis.google.com/js/plusone.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s); })(); </script>';
+                var gplus_dummy_btn = '<img src="' + options.services.gplus.dummy_img + '" alt="&quot;Google+1&quot;-Dummy" class="gplus_one_dummy" />';
+
+                context.append('<li class="gplus help_info"><span class="info">' + options.services.gplus.txt_info + '</span><span class="switch off">' + options.services.gplus.txt_gplus_off + '</span><div class="gplusone dummy_btn">' + gplus_dummy_btn + '</div></li>');
+
+                var $container_gplus = $('li.gplus', context);
+
+                $('li.gplus div.gplusone img,li.gplus span.switch', context).live('click', function () {
+                    if ($container_gplus.find('span.switch').hasClass('off')) {
+                        $container_gplus.addClass('info_off');
+                        $container_gplus.find('span.switch').addClass('on').removeClass('off').html(options.services.gplus.txt_gplus_on);
+                        $container_gplus.find('img.gplus_one_dummy').replaceWith(gplus_code);
+                    } else {
+                        $container_gplus.removeClass('info_off');
+                        $container_gplus.find('span.switch').addClass('off').removeClass('on').html(options.services.gplus.txt_gplus_off);
+                        $container_gplus.find('.gplusone').html(gplus_dummy_btn);
+                    }
+                });
+            }
+
+            //
+            // Der Info/Settings-Bereich wird eingebunden
+            //
+            context.append('<li class="settings_info"><div class="settings_info_menu off perma_option_off"><a href="' + options.info_link + '"><span class="help_info icon"><span class="info">' + options.txt_help + '</span></span></a></div></li>');
+
+            // Info-Overlays mit leichter Verzoegerung einblenden
+            $('.help_info:not(.info_off)', context).live('mouseenter', function () {
+                var $info_wrapper = $(this);
+                var timeout_id = window.setTimeout(function () { $($info_wrapper).addClass('display'); }, 500);
+                $(this).data('timeout_id', timeout_id);
+            });
+            $('.help_info', context).live('mouseleave', function () {
+                var timeout_id = $(this).data('timeout_id');
+                window.clearTimeout(timeout_id);
+                if ($(this).hasClass('display')) {
+                    $(this).removeClass('display');
+                }
+            });
+
+            var facebook_perma = (options.services.facebook.perma_option === 'on');
+            var twitter_perma  = (options.services.twitter.perma_option  === 'on');
+            var gplus_perma    = (options.services.gplus.perma_option    === 'on');
+
+            // Menue zum dauerhaften Einblenden der aktiven Dienste via Cookie einbinden
+            // Die IE7 wird hier ausgenommen, da er kein JSON kann und die Cookies hier ueber JSON-Struktur abgebildet werden
+            if (((facebook_on && facebook_perma)
+                || (twitter_on && twitter_perma)
+                || (gplus_on && gplus_perma))
+                    && (!$.browser.msie || ($.browser.msie && $.browser.version > 7.0))) {
+
+                // Cookies abrufen
+                var cookie_list = document.cookie.split(';');
+                var cookies = '{';
+                var i = 0;
+                for (; i < cookie_list.length; i += 1) {
+                    var foo = cookie_list[i].split('=');
+                    cookies += '"' + $.trim(foo[0]) + '":"' + $.trim(foo[1]) + '"';
+                    if (i < cookie_list.length - 1) {
+                        cookies += ',';
+                    }
+                }
+                cookies += '}';
+                cookies = JSON.parse(cookies);
+
+                // Container definieren
+                var $container_settings_info = $('li.settings_info', context);
+
+                // Klasse entfernen, die das i-Icon alleine formatiert, da Perma-Optionen eingeblendet werden
+                $container_settings_info.find('.settings_info_menu').removeClass('perma_option_off');
+
+                // Perma-Optionen-Icon (.settings) und Formular (noch versteckt) einbinden
+                $container_settings_info.find('.settings_info_menu').append('<span class="settings">Einstellungen</span><form><fieldset><legend>' + options.settings_perma + '</legend></fieldset></form>');
+
+
+                // Die Dienste mit <input> und <label>, sowie checked-Status laut Cookie, schreiben
+                var checked = ' checked="checked"';
+                if (facebook_on && facebook_perma) {
+                    var perma_status_facebook = cookies.socialSharePrivacy_facebook === 'perma_on' ? checked : '';
+                    $container_settings_info.find('form fieldset').append(
+                        '<input type="checkbox" name="perma_status_facebook" id="perma_status_facebook"'
+                            + perma_status_facebook + ' /><label for="perma_status_facebook">'
+                            + options.services.facebook.display_name + '</label>'
+                    );
+                }
+
+                if (twitter_on && twitter_perma) {
+                    var perma_status_twitter = cookies.socialSharePrivacy_twitter === 'perma_on' ? checked : '';
+                    $container_settings_info.find('form fieldset').append(
+                        '<input type="checkbox" name="perma_status_twitter" id="perma_status_twitter"'
+                            + perma_status_twitter + ' /><label for="perma_status_twitter">'
+                            + options.services.twitter.display_name + '</label>'
+                    );
+                }
+
+                if (gplus_on && gplus_perma) {
+                    var perma_status_gplus = cookies.socialSharePrivacy_gplus === 'perma_on' ? checked : '';
+                    $container_settings_info.find('form fieldset').append(
+                        '<input type="checkbox" name="perma_status_gplus" id="perma_status_gplus"'
+                            + perma_status_gplus + ' /><label for="perma_status_gplus">'
+                            + options.services.gplus.display_name + '</label>'
+                    );
+                }
+
+                // Cursor auf Pointer setzen fuer das Zahnrad
+                $container_settings_info.find('span.settings').css('cursor', 'pointer');
+
+                // Einstellungs-Menue bei mouseover ein-/ausblenden
+                $($container_settings_info.find('span.settings'), context).live('mouseenter', function () {
+                    var timeout_id = window.setTimeout(function () { $container_settings_info.find('.settings_info_menu').removeClass('off').addClass('on'); }, 500);
+                    $(this).data('timeout_id', timeout_id);
+                }); 
+                $($container_settings_info, context).live('mouseleave', function () {
+                    var timeout_id = $(this).data('timeout_id');
+                    window.clearTimeout(timeout_id);
+                    $container_settings_info.find('.settings_info_menu').removeClass('on').addClass('off');
+                });
+
+                // Klick-Interaktion auf <input> um Dienste dauerhaft ein- oder auszuschalten (Cookie wird gesetzt oder geloescht)
+                $($container_settings_info.find('fieldset input')).live('click', function (event) {
+                    var click = event.target.id;
+                    var service = click.substr(click.lastIndexOf('_') + 1, click.length);
+                    var cookie_name = 'socialSharePrivacy_' + service;
+
+                    if ($('#' + event.target.id + ':checked').length) {
+                        cookieSet(cookie_name, 'perma_on', options.cookie_expires, options.cookie_path, options.cookie_domain);
+                        $('form fieldset label[for=' + click + ']', context).addClass('checked');
+                    } else {
+                        cookieDel(cookie_name, 'perma_on', options.cookie_path, options.cookie_domain);
+                        $('form fieldset label[for=' + click + ']', context).removeClass('checked');
+                    }
+                });
+
+                // Dienste automatisch einbinden, wenn entsprechendes Cookie vorhanden ist
+                if (facebook_on && facebook_perma && cookies.socialSharePrivacy_facebook === 'perma_on') {
+                    $('li.facebook span.switch', context).click();
+                }
+                if (twitter_on && twitter_perma && cookies.socialSharePrivacy_twitter === 'perma_on') {
+                    $('li.twitter span.switch', context).click();
+                }
+                if (gplus_on && gplus_perma && cookies.socialSharePrivacy_gplus === 'perma_on') {
+                    $('li.gplus span.switch', context).click();
+                }
+            }
+        }); // this.each(function ()
+    };      // $.fn.socialSharePrivacy = function (settings) {
+}(jQuery));
+
Index: /lib/socialshareprivacy/jquery.socialshareprivacy.min.js
===================================================================
--- /lib/socialshareprivacy/jquery.socialshareprivacy.min.js	(revision 5261)
+++ /lib/socialshareprivacy/jquery.socialshareprivacy.min.js	(revision 5261)
@@ -0,0 +1,33 @@
+/*
+ * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz
+ *
+ * http://www.heise.de/extras/socialshareprivacy/
+ * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html
+ *
+ * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt,
+ * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de
+ *
+ * is released under the MIT License http://www.opensource.org/licenses/mit-license.php
+ *
+ * Spread the word, link to us if you can.
+ */
+(function(b){function x(b,a){var f=decodeURIComponent(b);if(f.length<=a)return b;var j=f.substring(0,a-1).lastIndexOf(" ");return f=encodeURIComponent(f.substring(0,j))+"\u2026"}function q(c){return b('meta[name="'+c+'"]').attr("content")||""}function r(){var c=q("DC.title"),a=q("DC.creator"),c=0<c.length&&0<a.length?c+(" - "+a):b("title").text();return encodeURIComponent(c)}function s(){var c=document.location.href,a=b("link[rel=canonical]").attr("href");a&&0<a.length&&(0>a.indexOf("http")&&(a=document.location.protocol+
+"//"+document.location.host+a),c=a);return c}b.fn.socialSharePrivacy=function(c){var a=b.extend(!0,{services:{facebook:{status:"on",dummy_img:"socialshareprivacy/images/dummy_facebook.png",txt_info:"2 Klicks f&uuml;r mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k&ouml;nnen Ihre Empfehlung an Facebook senden. Schon beim Aktivieren werden Daten an Dritte &uuml;bertragen &ndash; siehe <em>i</em>.",txt_fb_off:"nicht mit Facebook verbunden",txt_fb_on:"mit Facebook verbunden",
+perma_option:"on",display_name:"Facebook",referrer_track:"",language:"de_DE",action:"recommend"},twitter:{status:"on",dummy_img:"socialshareprivacy/images/dummy_twitter.png",txt_info:"2 Klicks f&uuml;r mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k&ouml;nnen Ihre Empfehlung an Twitter senden. Schon beim Aktivieren werden Daten an Dritte &uuml;bertragen &ndash; siehe <em>i</em>.",txt_twitter_off:"nicht mit Twitter verbunden",txt_twitter_on:"mit Twitter verbunden",perma_option:"on",
+display_name:"Twitter",referrer_track:"",tweet_text:r,language:"en"},gplus:{status:"on",dummy_img:"socialshareprivacy/images/dummy_gplus.png",txt_info:"2 Klicks f&uuml;r mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k&ouml;nnen Ihre Empfehlung an Google+ senden. Schon beim Aktivieren werden Daten an Dritte &uuml;bertragen &ndash; siehe <em>i</em>.",txt_gplus_off:"nicht mit Google+ verbunden",txt_gplus_on:"mit Google+ verbunden",perma_option:"on",display_name:"Google+",
+referrer_track:"",language:"de"}},info_link:"http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html",txt_help:"Wenn Sie diese Felder durch einen Klick aktivieren, werden Informationen an Facebook, Twitter oder Google in die USA &uuml;bertragen und unter Umst&auml;nden auch dort gespeichert. N&auml;heres erfahren Sie durch einen Klick auf das <em>i</em>.",settings_perma:"Dauerhaft aktivieren und Daten&uuml;ber&shy;tragung zustimmen:",cookie_path:"/",cookie_domain:document.location.host,
+cookie_expires:"365",css_path:"socialshareprivacy/socialshareprivacy.css",uri:s},c),f="on"===a.services.facebook.status,j="on"===a.services.twitter.status,n="on"===a.services.gplus.status;if(f||j||n)return 0<a.css_path.length&&(document.createStyleSheet?document.createStyleSheet(a.css_path):b("head").append('<link rel="stylesheet" type="text/css" href="'+a.css_path+'" />')),this.each(function(){b(this).prepend('<ul class="social_share_privacy_area"></ul>');var d=b(".social_share_privacy_area",this),
+c=a.uri;"function"===typeof c&&(c=c(d));if(f){var g=encodeURIComponent(c+a.services.facebook.referrer_track),q='<iframe src="http://www.facebook.com/plugins/like.php?locale='+a.services.facebook.language+"&amp;href="+g+"&amp;send=false&amp;layout=button_count&amp;width=120&amp;show_faces=false&amp;action="+a.services.facebook.action+'&amp;colorscheme=light&amp;font&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:145px; height:21px;" allowTransparency="true"></iframe>',
+t='<img src="'+a.services.facebook.dummy_img+'" alt="Facebook &quot;Like&quot;-Dummy" class="fb_like_privacy_dummy" />';d.append('<li class="facebook help_info"><span class="info">'+a.services.facebook.txt_info+'</span><span class="switch off">'+a.services.facebook.txt_fb_off+'</span><div class="fb_like dummy_btn">'+t+"</div></li>");var k=b("li.facebook",d);b("li.facebook div.fb_like img.fb_like_privacy_dummy,li.facebook span.switch",d).live("click",function(){k.find("span.switch").hasClass("off")?
+(k.addClass("info_off"),k.find("span.switch").addClass("on").removeClass("off").html(a.services.facebook.txt_fb_on),k.find("img.fb_like_privacy_dummy").replaceWith(q)):(k.removeClass("info_off"),k.find("span.switch").addClass("off").removeClass("on").html(a.services.facebook.txt_fb_off),k.find(".fb_like").html(t))})}if(j){g=a.services.twitter.tweet_text;"function"===typeof g&&(g=g());var g=x(g,"120"),o=encodeURIComponent(c+a.services.twitter.referrer_track),e=encodeURIComponent(c),r='<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?url='+
+o+"&amp;counturl="+e+"&amp;text="+g+"&amp;count=horizontal&amp;lang="+a.services.twitter.language+'" style="width:130px; height:25px;"></iframe>',u='<img src="'+a.services.twitter.dummy_img+'" alt="&quot;Tweet this&quot;-Dummy" class="tweet_this_dummy" />';d.append('<li class="twitter help_info"><span class="info">'+a.services.twitter.txt_info+'</span><span class="switch off">'+a.services.twitter.txt_twitter_off+'</span><div class="tweet dummy_btn">'+u+"</div></li>");var l=b("li.twitter",d);b("li.twitter div.tweet img,li.twitter span.switch",
+d).live("click",function(){l.find("span.switch").hasClass("off")?(l.addClass("info_off"),l.find("span.switch").addClass("on").removeClass("off").html(a.services.twitter.txt_twitter_on),l.find("img.tweet_this_dummy").replaceWith(r)):(l.removeClass("info_off"),l.find("span.switch").addClass("off").removeClass("on").html(a.services.twitter.txt_twitter_off),l.find(".tweet").html(u))})}if(n){var s='<div class="g-plusone" data-size="medium" data-href="'+(c+a.services.gplus.referrer_track)+'"></div><script type="text/javascript">window.___gcfg = {lang: "'+
+a.services.gplus.language+'"}; (function() { var po = document.createElement("script"); po.type = "text/javascript"; po.async = true; po.src = "https://apis.google.com/js/plusone.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s); })(); <\/script>',v='<img src="'+a.services.gplus.dummy_img+'" alt="&quot;Google+1&quot;-Dummy" class="gplus_one_dummy" />';d.append('<li class="gplus help_info"><span class="info">'+a.services.gplus.txt_info+'</span><span class="switch off">'+
+a.services.gplus.txt_gplus_off+'</span><div class="gplusone dummy_btn">'+v+"</div></li>");var m=b("li.gplus",d);b("li.gplus div.gplusone img,li.gplus span.switch",d).live("click",function(){m.find("span.switch").hasClass("off")?(m.addClass("info_off"),m.find("span.switch").addClass("on").removeClass("off").html(a.services.gplus.txt_gplus_on),m.find("img.gplus_one_dummy").replaceWith(s)):(m.removeClass("info_off"),m.find("span.switch").addClass("off").removeClass("on").html(a.services.gplus.txt_gplus_off),
+m.find(".gplusone").html(v))})}d.append('<li class="settings_info"><div class="settings_info_menu off perma_option_off"><a href="'+a.info_link+'"><span class="help_info icon"><span class="info">'+a.txt_help+"</span></span></a></div></li>");b(".help_info:not(.info_off)",d).live("mouseenter",function(){var a=b(this),c=window.setTimeout(function(){b(a).addClass("display")},500);b(this).data("timeout_id",c)});b(".help_info",d).live("mouseleave",function(){var a=b(this).data("timeout_id");window.clearTimeout(a);
+b(this).hasClass("display")&&b(this).removeClass("display")});c="on"===a.services.facebook.perma_option;g="on"===a.services.twitter.perma_option;o="on"===a.services.gplus.perma_option;if((f&&c||j&&g||n&&o)&&(!b.browser.msie||b.browser.msie&&7<b.browser.version)){for(var i=document.cookie.split(";"),e="{",p=0;p<i.length;p+=1){var w=i[p].split("="),e=e+('"'+b.trim(w[0])+'":"'+b.trim(w[1])+'"');p<i.length-1&&(e+=",")}var e=JSON.parse(e+"}"),h=b("li.settings_info",d);h.find(".settings_info_menu").removeClass("perma_option_off");
+h.find(".settings_info_menu").append('<span class="settings">Einstellungen</span><form><fieldset><legend>'+a.settings_perma+"</legend></fieldset></form>");f&&c&&(i="perma_on"===e.socialSharePrivacy_facebook?' checked="checked"':"",h.find("form fieldset").append('<input type="checkbox" name="perma_status_facebook" id="perma_status_facebook"'+i+' /><label for="perma_status_facebook">'+a.services.facebook.display_name+"</label>"));j&&g&&(i="perma_on"===e.socialSharePrivacy_twitter?' checked="checked"':
+"",h.find("form fieldset").append('<input type="checkbox" name="perma_status_twitter" id="perma_status_twitter"'+i+' /><label for="perma_status_twitter">'+a.services.twitter.display_name+"</label>"));n&&o&&(i="perma_on"===e.socialSharePrivacy_gplus?' checked="checked"':"",h.find("form fieldset").append('<input type="checkbox" name="perma_status_gplus" id="perma_status_gplus"'+i+' /><label for="perma_status_gplus">'+a.services.gplus.display_name+"</label>"));h.find("span.settings").css("cursor","pointer");
+b(h.find("span.settings"),d).live("mouseenter",function(){var a=window.setTimeout(function(){h.find(".settings_info_menu").removeClass("off").addClass("on")},500);b(this).data("timeout_id",a)});b(h,d).live("mouseleave",function(){var a=b(this).data("timeout_id");window.clearTimeout(a);h.find(".settings_info_menu").removeClass("on").addClass("off")});b(h.find("fieldset input")).live("click",function(c){var e=c.target.id,g="socialSharePrivacy_"+e.substr(e.lastIndexOf("_")+1,e.length);if(b("#"+c.target.id+
+":checked").length){var c=a.cookie_expires,h=a.cookie_path,f=a.cookie_domain,i=new Date;i.setTime(i.getTime()+c*864E5);document.cookie=g+"=perma_on; expires="+i.toUTCString()+"; path="+h+"; domain="+f;b("form fieldset label[for="+e+"]",d).addClass("checked")}else{c=a.cookie_path;h=a.cookie_domain;f=new Date;f.setTime(f.getTime()-100);document.cookie=g+"=perma_on; expires="+f.toUTCString()+"; path="+c+"; domain="+h;b("form fieldset label[for="+e+"]",d).removeClass("checked")}});f&&c&&"perma_on"===
+e.socialSharePrivacy_facebook&&b("li.facebook span.switch",d).click();j&&g&&"perma_on"===e.socialSharePrivacy_twitter&&b("li.twitter span.switch",d).click();n&&o&&"perma_on"===e.socialSharePrivacy_gplus&&b("li.gplus span.switch",d).click()}})}})(jQuery);
Index: /lib/socialshareprivacy/socialshareprivacy/socialshareprivacy.css
===================================================================
--- /lib/socialshareprivacy/socialshareprivacy/socialshareprivacy.css	(revision 5261)
+++ /lib/socialshareprivacy/socialshareprivacy/socialshareprivacy.css	(revision 5261)
@@ -0,0 +1,226 @@
+.social_share_privacy_area {
+    clear: both;
+    margin: 20px 0 !important;
+	list-style-type: none;
+	padding: 0 !important;
+	width: auto;
+	height: 25px;
+	display: block;
+}
+.social_share_privacy_area li {
+	margin: 0 !important;
+	padding: 0 !important;
+	height: 21px;
+	float: left;
+}
+.social_share_privacy_area li .dummy_btn {
+    float: left;
+    margin: 0 0 0 10px;
+    cursor: pointer;
+    padding: 0;
+    height: inherit;
+}
+.social_share_privacy_area li div iframe {
+    overflow: hidden;
+    height: inherit;
+    width: inherit;
+}
+/* Facebook begin */
+.social_share_privacy_area .facebook {
+    width: 180px;
+    display: inline-block;
+}
+.social_share_privacy_area .facebook .fb_like iframe {
+    width: 145px;
+}
+/* Facebook end */
+/* Twitter begin */
+.social_share_privacy_area .twitter {
+	width: 148px;
+}
+.social_share_privacy_area li div.tweet {
+	width: 115px;
+}
+/* Twitter end */
+/* Google+ begin */
+.social_share_privacy_area .gplus {
+	width: 123px;
+}
+.social_share_privacy_area li div.gplusone {
+	width: 90px;
+}
+/* Google+ end */
+/* Switch begin */
+.social_share_privacy_area li .switch {
+    display: inline-block;
+    text-indent: -9999em;
+    background: transparent url(images/socialshareprivacy_on_off.png) no-repeat 0 0 scroll;
+    width: 23px;
+    height: 12px;
+    overflow: hidden;
+    float: left;
+    margin: 4px 0 0;
+    padding: 0;
+    cursor: pointer;
+}
+.social_share_privacy_area li .switch.on {
+    background-position: 0 -12px; 
+}
+/* Switch end */
+/* Tooltips begin */
+.social_share_privacy_area li.help_info {
+    position: relative; 
+}
+.social_share_privacy_area li.help_info .info, 
+.social_share_privacy_area li .help_info.icon .info {
+    display: none;
+    position: absolute;
+    bottom: 40px;
+    left: 0;
+    width: 290px;
+    padding: 10px 15px;
+    margin: 0;
+    font-size: 12px;
+    line-height: 16px;
+    font-weight: bold;
+    border: 1px solid #ccc;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    -moz-box-shadow: 0 3px 4px #999;
+    -webkit-box-shadow: 0 3px 4px #999;
+    box-shadow: 0 3px 4px #999;
+    background-color: #fdfbec;
+    color: #000;
+    z-index: 90;
+}
+.social_share_privacy_area li.gplus.help_info .info {
+    left: -60px;
+}
+.social_share_privacy_area li .help_info.icon .info {
+    left: -243px;
+    width: 350px;
+}
+.social_share_privacy_area li.help_info.display .info, 
+.social_share_privacy_area li .help_info.icon.display .info {
+    display: block;
+}
+.social_share_privacy_area li.help_info.info_off.display .info {
+    display: none;
+}
+.social_share_privacy_area li .help_info.icon {
+    background: #fff url(images/socialshareprivacy_info.png) no-repeat center center scroll;
+    width: 25px;
+    height: 20px;
+    position: relative;
+    display: inline-block;
+	vertical-align: top;
+	border: 2px solid #e7e3e3;
+	border-right-width: 0;
+	-moz-border-radius: 5px 0 0 5px;
+	-webkit-border-radius: 5px 0 0 5px;
+	border-radius: 5px 0 0 5px;
+    margin: 0;
+    padding: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu.on .help_info.icon {
+	border-top-width: 0;
+	border-left-width: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu.perma_option_off .help_info.icon {
+	border-right-width: 2px;
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;
+	border-radius: 5px;
+}
+/* Tooltips end */
+/* Settings/Info begin */
+.social_share_privacy_area li.settings_info {
+	position: relative;
+	top: -2px;
+}
+.social_share_privacy_area li.settings_info a {
+	text-decoration: none;
+	margin: 0 !important;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu {
+    background-color: #f3f4f5;
+    border: 2px solid #e7e3e3;
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;
+    border-radius: 5px;
+	-moz-box-shadow: 2px 2px 3px #c1c1c1;
+	-webkit-box-shadow: 2px 2px 3px #c1c1c1;
+    box-shadow: 3px 3px 3px #c1c1c1;
+    left: 0;
+    position: absolute;
+    top: 0;
+    width: 135px;
+    z-index: 95;
+    margin: 0;
+    padding: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu.off {
+	border-width: 0;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+	background-color: transparent;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu.off form {
+	display: none;
+	margin: 0;
+	padding: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu .settings {
+	text-indent: -9999em;
+	display: inline-block;
+	background: #fff url(images/settings.png) no-repeat center center scroll;
+	width: 25px;
+	height: 20px;
+	border: 2px solid #e7e3e3;
+	-moz-border-radius: 0 5px 5px 0;
+	-webkit-border-radius: 0 5px 5px 0;
+	border-radius: 0 5px 5px 0;
+	border-left: 1px solid #ddd;
+	margin: 0;
+	padding: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu.on .settings {
+	border-top-width: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu form fieldset {
+    border-width: 0;
+    margin: 0;
+    padding: 0 10px 10px;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu form fieldset legend {
+    font-size: 11px;
+    font-weight: bold;
+    line-height: 14px;
+    margin: 0;
+    padding: 10px 0;
+	width: 115px;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu form fieldset input {
+	clear: both;
+    float: left;
+    margin: 4px 10px 4px 0;
+    padding: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu form fieldset label {
+    display: inline-block;
+    float: left;
+    font-size: 12px;
+    font-weight: bold;
+    line-height: 24px;
+	-moz-transition: color .5s ease-in;
+	-webkit-transition: color .5s ease-in;
+	transition: color .5s ease-in;
+	margin: 0;
+	padding: 0;
+}
+.social_share_privacy_area li.settings_info .settings_info_menu form fieldset label.checked {
+	color: #090;
+}
+/* Settings/Info end */
Index: /lib/ui/jquery.ui.datepicker-de.js
===================================================================
--- /lib/ui/jquery.ui.datepicker-de.js	(revision 8528)
+++ /lib/ui/jquery.ui.datepicker-de.js	(revision 5261)
@@ -2,8 +2,4 @@
 /* Written by Milian Wolff (mail@milianw.de). */
 jQuery(function($){
-	
-	if (typeof $.datepicker != "undefined")
-	{
-	
 	$.datepicker.regional['de'] = {
 		closeText: 'schlie&szlig;en',
@@ -25,6 +21,3 @@
 		yearSuffix: ''};
 	$.datepicker.setDefaults($.datepicker.regional['de']);
-		
-	}
-	
 });
Index: /lib/update.php
===================================================================
--- /lib/update.php	(revision 8528)
+++ /lib/update.php	(revision 5261)
@@ -23,5 +23,4 @@
 			{
 				
-				$wpsg_reqpage = (($pages_show['wpsg_reqpage'] == '1')?'1':'0');
 				$wpsg_agbpage = (($pages_show['wpsg_agbpage'] == '1')?'1':'0');
 			  	$wpsg_wrpage = (($pages_show['wpsg_wrpage'] == '1')?'1':'0');
@@ -37,5 +36,4 @@
 			  		{
 			  	 
-			  			$widget[$k]['wpsg_reqpage'] = $wpsg_reqpage;
 				  		$widget[$k]['wpsg_agbpage'] = $wpsg_agbpage;
 				  		$widget[$k]['wpsg_wrpage'] = $wpsg_wrpage;
Index: /lib/wpsg_basket.class.php
===================================================================
--- /lib/wpsg_basket.class.php	(revision 8528)
+++ /lib/wpsg_basket.class.php	(revision 5261)
@@ -1,8 +1,6 @@
 <?php
-	
-	use \wpsg\M1;
-	
+
 	/**
-	 * Diese Klasse kapselt die Produkte
+	 * Diese Klasse kapselt die Produkte 
 	 * @author Daschmi
 	 */
@@ -10,16 +8,13 @@
 	{
 		
-		/** @var wpsg_db */
+		/** Das Datenbankobjekt */
 		var $db;
-
-        /** @var array */
-        var $arOrder = [];
-
-		/** @var wpsg_ShopController */
+		
+		/** Das Shop Objekt */
 		var $shop;
 		
 		/** Array mit den Produkten */
 		public $arProdukte;
-		
+
 		/** Gutscheinwert */
 		public $gs_value = false;
@@ -30,5 +25,5 @@
 		/** Gutscheincode */
 		public $gs_code = false;
-		
+			
 		/** Gutschein ID */
 		public $gs_id = false;
@@ -44,7 +39,4 @@
 		
 		public $arCheckout;
-
-		/** @var \wpsg\wpsg_calculation */
-		public $oCalculation = null;
 		
 		/**
@@ -78,17 +70,21 @@
 		 * FÃŒgt ein Produkt in die Session ein
 		 */
-		public function addProduktToSession($produkt_key, $menge) {
-
+		public function addProduktToSession($produkt_key, $menge)
+		{
+			
 			if (!wpsg_isSizedArray($_SESSION['wpsg']['basket'])) $_SESSION['wpsg']['basket'] = array();
 			
 			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktId($produkt_key));
 			
-			if ($product_data['basket_multiple'] == 1) {
+			if ($product_data['basket_multiple'] == 1)
+			{
 				
 				// Nur einmal mit beliebiger Menge
 				// Hier nichts machen, es wird weiter unten hinzugefÃŒgt
-
-			} else if ($product_data['basket_multiple'] == 2) {
-				
+				
+			}
+			else if ($product_data['basket_multiple'] == 2)
+			{
+
 				// Mehrfach mit Menge 1
 				if ($menge > 1)
@@ -117,22 +113,22 @@
 				foreach ((array)$_SESSION['wpsg']['basket'] as $p_key => $p)
 				{
-					
+						
 					if ($p['id'] == $produkt_key)
 					{
 						
 						// Produkt ist schon drin, ich breche hier mit -1 ab, damit zum Warenkorb geleitet wird und eine Meldung wird angezeigt
-						$this->shop->addFrontendMessage(__('Das Produkt befindet sich bereits im Warenkorb, es kann nur einmal erworben werden.', 'wpsg'));
+						$this->shop->addFrontendMessage(__('Das Produkt befindet sich bereits im Warenkorb, es kann nur einmal erworben werden.', 'wpsg'));						
 						return -1;
 						
 					}
 					
-				}
+				} 
 				
 				$menge = 1;
 				
 			}
-			else
-			{
-				
+			else 
+			{
+
 				// Nur einmal mit beliebiger Menge
 				// Basket durchgehen und schauen ob es schon drin ist und dann abbrechen sonst neu hinzufÃŒgen
@@ -142,8 +138,7 @@
 					if ($p['id'] == $produkt_key)
 					{
-						
+						 
 						$bOK = $this->shop->callMods('basket_produkttosession', array($produkt_key, &$menge, &$_SESSION['wpsg']['basket'][$p_key]));
-						
-						if ($bOK === false)
+						if ($bOK === false) 
 						{
 							
@@ -151,7 +146,5 @@
 							
 						}
-						
-						$GLOBALS['wpsg_lastInsertIndex'] = $p_key;
-						
+						 	
 						$_SESSION['wpsg']['basket'][$p_key]['menge'] += intval($menge);
 						
@@ -159,22 +152,26 @@
 						if ($_SESSION['wpsg']['basket'][$p_key]['menge'] <= 0)
 						{
-							
+								
 							unset($_SESSION['wpsg']['basket'][$p_key]);
-							
-						}
-						
+								
+						}							
+								
 						return true;
-						
-					}
-					
-				}
-				
-			}
-		
+											
+					}
+					
+				}
+				
+			}
+			
 			$ses_data = array();
-		 
+			
 			$bOK = $this->shop->callMods('basket_produkttosession', array($produkt_key, &$menge, &$ses_data));
-
-			if ($bOK === false) return false;
+			if ($bOK === false) 
+			{
+				
+				return false;
+				
+			}
 			
 			// War noch nicht drin => neu hinzufÃŒgen
@@ -184,16 +181,14 @@
 				'referer' => ''
 			));
-
+			
 			if (isset($_REQUEST['myReferer'])) $ses_data['referer'] = $_REQUEST['myReferer'];
 			
 			//$_SESSION['wpsg']['basket'][] = wpsg_xss($ses_data);
 			array_push($_SESSION['wpsg']['basket'], wpsg_xss($ses_data));
-			end($_SESSION['wpsg']['basket']);
-			$GLOBALS['wpsg_lastInsertIndex'] = key($_SESSION['wpsg']['basket']);
 			
 			return true;
-			
+					
 		} // public function addProduktToBasket($produkt_id, $menge)
-		
+
 		/**
 		 * FÃŒgt einen Gutschein zum Warenkorb hinzu
@@ -201,15 +196,19 @@
 		 * @param string $mode w = Wertgutschein, p = Prozentual
 		 */
-		public function addGutscheinToSession($value, $calc, $code, $gs_id) {
-			  
-			if (!isset($_SESSION['wpsg']['gs'])) $_SESSION['wpsg']['gs'] = [];
-
-			$_SESSION['wpsg']['gs'][] = wpsg_xss(array(
-				'value' => $value,
-				'calc' => $calc,
-				'code' => $code,
-				'id' => $gs_id
+		public function addGutscheinToSession($value, $calc, $code, $gs_id)
+		{
+			 
+			$this->gs_value = $value;
+			$this->gs_calc = $calc;
+			$this->gs_code = $code;
+			$this->gs_id = $gs_id;
+			
+			$_SESSION['wpsg']['gs'] = wpsg_xss(array(	
+				'value' => $this->gs_value,
+				'calc' => $this->gs_calc,
+				'code' => $this->gs_code,
+				'id' => $this->gs_id			
 			));
-
+			
 		} // public function addGutscheinToSession($value, $calc, $code)
 		
@@ -217,45 +216,9 @@
 		 * Entfernt ein Produkt aus dem Warenkorb
 		 */
-		public function removeProduktFromSession($produkt_index) {
-
-			$this->shop->callMods('basket_removeProduktFromSession', [$produkt_index]);	
-			
+		public function removeProduktFromSession($produkt_index)
+		{
+ 
 			unset($_SESSION['wpsg']['basket'][$produkt_index]);
-			\wpsg\wpsg_calculation::getSessionCalculation()->update();
-
-			//$this->shop->callMods('basket_removeProduktFromSession', [$produkt_index]);	
 			$this->shop->cache->clearShopBasketArray();
-			$this->shop->basket->initFromSession(true);
-			
-			if ($this->shop->get_option('wpsg_switchtolowestshippingafterproductremove') === '1' && isset($_SESSION['wpsg']['checkout']['shipping'])) {
-				
-				$oCalculation = \wpsg\wpsg_calculation::getSessionCalculation(true);
-				$oCalculation->getCalculationArray();
-				
-				$min_key = null; $min_value = null;
-				
-				$this->shop->arShipping = $this->shop->arShippingAll;
-				$this->shop->checkShippingAvailable();
-				
-				foreach ($this->shop->arShipping as $k => $v) {
-					
-					$price_shipping = $oCalculation->calculateCostKey($v['price']);
-					
-					if ($min_key === null || $price_shipping < $min_value) {
-						
-						$min_key = $k;
-						$min_value = $price_shipping;
-						
-					}
-					
-				}
-				
-				if ($min_key !== null) {
-					
-					$_SESSION['wpsg']['checkout']['shipping'] = $min_key;
-										
-				}
-								
-			}
 			
 			return true;
@@ -266,20 +229,25 @@
 		 * Aktualisiert den Warenkorb in der Session
 		 */
-		public function updateProduktFromSession($product_index, $produkt_menge) {
-			
-			if (intval($produkt_menge) <= 0) {
+		public function updateProduktFromSession($product_index, $produkt_menge)
+		{
+					
+			if (intval($produkt_menge) <= 0)
+			{
 				
 				$this->removeProduktFromSession($product_index);
 				return true;
 				
-			}
-
-			foreach ($_SESSION['wpsg']['basket'] as $k => $p) {
-				
-				if ($k == $product_index) {
-
+			} 
+			
+				 	 
+			foreach ($_SESSION['wpsg']['basket'] as $k => $p)
+			{
+				
+				if ($k == $product_index)
+				{ 
+					 
 					$this->shop->callMods('basket_updateProduktFromSession', array(&$product_index, &$produkt_menge));
 					$_SESSION['wpsg']['basket'][$k]['menge'] = intval($produkt_menge);
-
+					
 					if (!wpsg_isSizedInt($_SESSION['wpsg']['basket'][$k]['menge'])) unset($_SESSION['wpsg']['basket'][$k]);
 					
@@ -295,33 +263,30 @@
 		 * Initiiert den Warenkorb aus der Session heraus
 		 */
-		public function initFromSession($rebuild = false) {
-			
+		public function initFromSession($rebuild = false)
+		{
+												
 			if (!isset($_SESSION['wpsg']['basket'])) return;
 			if ($this->loadFromSession === true && $rebuild === false) return;
-
+			
 			$this->arProdukte = array();
 			
-			foreach ((array)$_SESSION['wpsg']['basket'] as $produkt_key => $b) {
+			foreach ((array)$_SESSION['wpsg']['basket'] as $produkt_key => $b)
+			{
 				
 				$this->arProdukte[$produkt_key] = $b;
-
-			}
-
-			$this->arCheckout = wpsg_array_merge(array(
-				'firma' => '',
-				'title' => '-1',
-				'vname' => '',
-				'name' => '',
-				'email' => '', 'email2' => '',
-				'geb' => '',
-				'fax' => '',
-				'tel' => '',
-				'strasse' => '', 'nr' => '',
-				'plz' => '',
-				'ort' => '',
-				'land' => '',
-				'custom' => '',
-				'comment' => ''
-			), wpsg_isSizedArray($_SESSION['wpsg']['checkout'])?$_SESSION['wpsg']['checkout']:array());
+				
+			}
+			
+			if (isset($_SESSION['wpsg']['gs']))
+			{
+				
+				$this->gs_value = $_SESSION['wpsg']['gs']['value'];
+				$this->gs_calc = $_SESSION['wpsg']['gs']['calc'];
+				$this->gs_code = $_SESSION['wpsg']['gs']['code'];
+				$this->gs_id = $_SESSION['wpsg']['gs']['id'];
+				
+			}
+			
+			$this->arCheckout = $_SESSION['wpsg']['checkout'];
 			
 			$this->loadFromSession = true;
@@ -336,32 +301,14 @@
 			
 			if (is_numeric($produkt_key)) return $produkt_key;
-			else if (preg_match('/pv_\d(.*)/', $produkt_key))
-			{
-				
-				// Varianten ProduktschlÃŒssel
-				$produkt_id = preg_replace('/(pv_)|(\|(.*))/', '', $produkt_key);
-				
+			else if (preg_match('/vp_\d(.*)/', $produkt_key))
+			{
+				
+				// Varianten ProduktschlÃŒssel				
+				$produkt_id = preg_replace('/(vp_)|(\/(.*))/', '', $produkt_key);
+
 				return $produkt_id;
 				
 			}
 			else return false;
-			
-		}
-		
-		/**
-		 * Wandelt die Daten des Basket in die neue Klasse zur Berechnung
-		 * @return wpsg\wpsg_calculation
-		 */
-		public function toCalculation() {
-			
-			$b = new \wpsg\wpsg_calculation();
-			
-			foreach ($this->arProdukte as $p) {
-				
-				$b->addProduct($p['productkey'], $p['product_index'], $p['preis_netto'], $p['menge'], $p['op_mwst_key'], $p['order_product_id']);
-				
-			}
-			
-			return $b;
 			
 		}
@@ -370,101 +317,53 @@
 		 * Initiiert den Basket aus der Datenbank
 		 */
-		public function initFromDB($o_id, $backend = false) {
-			
-			$order = $this->db->fetchRow("
-				SELECT
-					*
-			  	FROM
-					`".WPSG_TBL_ORDER."`
-			  	WHERE
-			  		`id` = '".wpsg_q($o_id)."'
-			");
-			
-			$kunde = $this->db->fetchRow("
-				SELECT
-					K.*, A.*, K.`id` AS `id`
-				FROM
-					`".WPSG_TBL_KU."` AS K
-					 	LEFT JOIN `".WPSG_TBL_ADRESS."` AS A ON (A.`id` = K.`adress_id`)
-				WHERE
-					K.`id` = '".wpsg_q($order['k_id']??'')."'
-			");
-
-			$this->oCalculation = null;
+		public function initFromDB($o_id, $backend = false)
+		{
+			
+			$order = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($o_id)."'");
+			$kunde = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($order['k_id'])."'");
+			
 			$this->arCheckout = array(
-				'firma' => wpsg_getStr($kunde['firma']),
-				'title' => wpsg_getStr($kunde['title']),
-				'vname' => wpsg_getStr($kunde['vname']),
-				'name' => wpsg_getStr($kunde['name']),
-				'email' => wpsg_getStr($kunde['email']),
-				'geb' => date('d.m.Y', strtotime(wpsg_getStr($kunde['geb']))),
-				'email2' => wpsg_getStr($kunde['email']),
-				'tel' => wpsg_getStr($kunde['tel']),
-				'strasse' => wpsg_getStr($kunde['strasse']),
-				'nr' => wpsg_getStr($kunde['nr']),
-				'fax' => wpsg_getStr($kunde['fax']),
-				'plz' => wpsg_getStr($kunde['plz']),
-				'ort' => wpsg_getStr($kunde['ort']),
-				'land' => wpsg_getStr($kunde['land']),
-				'ustidnr' => wpsg_getStr($kunde['ustidnr']),
-				'custom' => wpsg_getStr($kunde['custom']),
-				'shipping' => $order['type_shipping']??'',
-				'payment' => $order['type_payment']??'',
-				'comment' => $order['comment']??'',
-				'onr' => $order['onr']??'',
-				'knr' => wpsg_getStr($kunde['knr']),
-				'datum' => strtotime($order['cdate'])??''
+				'firma' => $kunde['firma'],
+				'title' => $kunde['title'],
+				'vname' => $kunde['vname'],
+				'name' => $kunde['name'],
+				'email' => $kunde['email'],
+				'geb' => strtotime('d.m.Y', $kunde['geb']),
+				'email2' => $kunde['email'],
+				'tel' => $kunde['tel'],
+				'strasse' => $kunde['strasse'],
+				'fax' => $kunde['fax'],
+				'plz' => $kunde['plz'],
+				'ort' => $kunde['ort'],
+				'land' => $kunde['land'],
+				'ustidnr' => $kunde['ustidnr'],
+				'shipping' => $order['type_shipping'],
+				'payment' => $order['type_payment'],
+				'comment' => $order['comment'],
+				'onr' => $order['onr'],
+				'knr' => $order['knr'],
+				'datum' => strftime($order['cdate'])
 			);
-			
-			if (wpsg_isSizedInt($order['shipping_adress_id'])) {
-				
-				$shipping_adress = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($order['shipping_adress_id'])."' "); 
-			
-				foreach (['title', 'name', 'vname', 'firma', 'strasse', 'nr', 'plz', 'ort', 'land', 'tel'] as $sk) {
-					
-					$this->arCheckout['shipping_'.$sk] = $shipping_adress[$sk];
-					
-				}
-				
-			}
-			
-			if ($this->shop->hasMod('wpsg_mod_autodebit'))
-			{
-				
-				$this->arCheckout['mod_autodebit_name'] = wpsg_getStr($order['mod_autodebit_name']);
-				$this->arCheckout['mod_autodebit_blz'] = wpsg_getStr($order['mod_autodebit_blz']);
-				$this->arCheckout['mod_autodebit_bic'] = wpsg_getStr($order['mod_autodebit_bic']);
-				$this->arCheckout['mod_autodebit_inhaber'] = wpsg_getStr($order['mod_autodebit_inhaber']);
-				$this->arCheckout['mod_autodebit_knr'] = wpsg_getStr($order['mod_autodebit_knr']);
-				$this->arCheckout['mod_autodebit_iban'] = wpsg_getStr($order['mod_autodebit_iban']);
-				
-			}
-			
-			$this->arOrder = $order;
-			
+			 			
 			// Produkte
 			$arProdukte = $this->db->fetchAssoc("
 				SELECT
-					OP.`menge`, OP.`price` AS preis_brutto,
-					OP.`price`, OP.`price_netto`, OP.`price_brutto`, OP.`mwst_key` AS op_mwst_key,
+					OP.`menge`, OP.`price` AS preis_brutto, 
 					OP.`mwst_value` AS `mwst_value`,
-					IF (OP.`productkey` != '', OP.`productkey`, P.`id`) AS `productkey`,
+					IF (OP.`productkey` != '', OP.`productkey`, P.`id`) AS `productkey`, 
 					OP.`mod_vp_varkey`,
-					OP.`id` AS `order_product_id`,
-					P.`id`, P.`anr`, P.`name`, OP.`product_index`
+					OP.`id` AS `order_product_id`,					
+					P.`id`, P.`anr`, P.`name`  
 				FROM
 					`".WPSG_TBL_ORDERPRODUCT."` AS OP
 						LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (OP.`p_id` = P.`id`)
 				WHERE
-					OP.`o_id` = '".wpsg_q($o_id)."'
-			", "product_index");
+					OP.`o_id` = '".wpsg_q($o_id)."'					
+			"); 
 			
 			foreach ($arProdukte as $k => $v)
 			{
 				
-				$arProdukte[$k]['varPriceAdded'] = 1;
-				
-				if ($v['productkey'] != '') $arProdukte[$k]['id'] = $v['productkey'];
-				else if ($v['mod_vp_varkey'] != '') $arProdukte[$k]['id'] = $v['mod_vp_varkey'];
+				if ($v['mod_vp_varkey'] != '') $arProdukte[$k]['id'] = $v['mod_vp_varkey'];
 				
 				// Preis ist immer in Brutto in der WPSG_TBL_ORDERPRODUCTS
@@ -480,26 +379,27 @@
 					else
 					{
+						$arProdukte[$k]['preis'] = $arProdukte[$k]['preis_netto'];						
+					}
+					
+				}
+				else
+				{
+				
+					if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
+					{
+						$arProdukte[$k]['preis'] = $arProdukte[$k]['preis_brutto'];
+					}
+					else
+					{
 						$arProdukte[$k]['preis'] = $arProdukte[$k]['preis_netto'];
 					}
 					
 				}
-				else
-				{
-					
-					if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
-					{
-						$arProdukte[$k]['preis'] = $arProdukte[$k]['preis_brutto'];
-					}
-					else
-					{
-						$arProdukte[$k]['preis'] = $arProdukte[$k]['preis_netto'];
-					}
-					
-				}
 				
 			}
 			
 			// Gutschein
-			if (wpsg_isSizedInt($order['gs_id'])) {
+			if ($order['gs_id'] > 0)
+			{
 				
 				$gs = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `id` = '".wpsg_q($order['gs_id'])."'");
@@ -512,17 +412,9 @@
 			}
 			
-			// Gutschein-Wert aus der Order-Tabelle wegen Bearbeitung
-			if ($backend) {
-				
-				$val = abs(@$order['price_gs']);
-				$this->gs_value = $val;
-				
-			}
-			
 			$this->arProdukte = $arProdukte;
 			
 			$this->loadFromSession = false;
 			$this->o_id = $o_id;
-			
+			 
 		} // public function initFromDB($o_id)
 		
@@ -530,30 +422,23 @@
 		 * LÃ¶scht die Session
 		 */
-		public function clearSession($customer_id)
+		public function clearSession()
 		{
 			
-			$this->shop->callMods('clearSession');
-			
-			if ($this->shop->get_option('wpsg_afterorder') == '1')
-			{
-				
-				// LÃ¶schen
-				unset($_SESSION['wpsg']);
-				
-			}
+			if ($this->shop->get_option('wpsg_afterorder') == '1') unset($_SESSION['wpsg']);
 			else
 			{
-				
-				// In Session belassen
+			
 				unset($_SESSION['wpsg']['basket']);
 				unset($_SESSION['wpsg']['gs']);
+			
+				$this->shop->callMods('clearSession');
 				
 				if ($this->shop->hasMod('wpsg_mod_kundenverwaltung'))
 				{
 					
-					$this->shop->callMod('wpsg_mod_kundenverwaltung', 'login', array($customer_id));
-					
-				}
-				
+					$this->shop->callMod('wpsg_mod_kundenverwaltung', 'login', array($_SESSION['wpsg']['checkout']['id']));
+					
+				}
+			
 			}
 			
@@ -565,32 +450,8 @@
 		 * @param Array $arBasket (Daten des Basket als Array)
 		 */
-		public function sendOrderSaveMails($order_id, $arBasket, $bCustomerMail = true, $bAdminMail = true, $bDebug = false) {
-			
-			$oOrder = wpsg_order::getInstance($order_id, true);
-			
-			$arAttach_Customer = [];
-			$arAttach_Admin = [];
-			
-            // Rechnung schreiben, damit ich sie an die Mail anhÃ€ngen kann
-			if ($this->shop->hasMod('wpsg_mod_rechnungen') && $this->shop->get_option('wpsg_mod_rechnungen_customermail') === '1') {
-			    
-			    try {
-			    
-			        // Ich brauche das PDF von der Rechnung
-                    $this->shop->callMod('wpsg_mod_rechnungen', 'writeAutoRechnung', [$oOrder->getId(), false, false]);
-
-                    foreach (\wpsg\wpsg_invoice::findByOrderId($oOrder->getId()) as $oInvoice) {
-
-                        $arAttach_Customer[] = $oInvoice->getFilePath();
-
-                    }
-
-                } catch (\Exception $e) {
-			        
-			        echo $e;
-			        
-                }
-                
-            }
+		public function sendOrderSaveMails($order_id, $arBasket, $bCustomerMail = true, $bAdminMail = true, $bDebug = false)
+		{
+						
+			$oOrder = wpsg_order::getInstance($order_id);
 			
 			$this->shop->view['oOrder'] = $oOrder;
@@ -598,27 +459,21 @@
 			
 			$this->shop->view['o_id'] = $order_id;
-			$this->shop->view['k_id'] = $oOrder->k_id;
 			$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
 			$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['oOrder']->k_id);
 			
-			$this->shop->view['basket']['checkout']['k_id'] = $oOrder->k_id;
-			
-			if ($bDebug === true) {
-				
+			if ($bDebug === true)
+			{
+			
 				$this->shop->view['basket']['checkout']['datum'] = time();
 				$this->shop->view['basket']['checkout']['onr'] = $this->shop->view['oOrder']->onr;
 				$this->shop->view['basket']['checkout']['knr'] = $this->shop->view['customer']['knr'];
 				$this->shop->view['basket']['checkout']['comment'] = $oOrder->comment;
-				
+			
 			}
 			
 			// Adminmail
-			if ($bAdminMail === true) {
-				
-				$arAttach = $arAttach_Admin;
-				
-				// Anhang aufbereiten
-				$this->shop->callMod('wpsg_mod_orderupload', 'getAdminAttachment', array(&$arAttach));
-				
+			if ($bAdminMail === true)
+			{
+			
 				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mailtemplates/adminmail.phtml', false);
 				
@@ -626,5 +481,5 @@
 				else $mail_html = false;
 				
-				$this->shop->sendMail($mail_text, $this->shop->get_option('wpsg_adminmail_empfaenger'), 'adminmail', $arAttach, $order_id, $oOrder->k_id, $mail_html);
+				$this->shop->sendMail($mail_text, $this->shop->get_option('wpsg_adminmail_empfaenger'), 'adminmail', array(), $order_id, $oOrder->k_id, $mail_html);
 				
 				if ($bDebug === false)
@@ -639,65 +494,41 @@
 					
 				}
-				
+					
 				sleep(1);
 				
 			}
-			
+				
 			// Kundenmail
 			if ($bCustomerMail === true)
 			{
-				
+			
 				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mailtemplates/kundenmail.phtml', false);
 				
 				if ($this->shop->get_option('wpsg_htmlmail') === '1') $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mailtemplates/html/kundenmail.phtml', false);
 				else $mail_html = false;
-				
-				$arAttachments = $arAttach_Customer;
+					
+				$arAttachments = array();
+					
+				if (wpsg_isSizedString($this->shop->get_option('wpsg_kundenmail_attachfile')) && file_exists(wpsg_getUploadDir('wpsg_mailconf').$this->shop->get_option('wpsg_kundenmail_attachfile')))
+				{
+				
+					$arAttachments[] = wpsg_getUploadDir('wpsg_mailconf').$this->shop->get_option('wpsg_kundenmail_attachfile');
+				
+				}
 				
 				if ($this->shop->get_option('wpsg_widerrufsformular_kundenmail') === '1' && wpsg_isSizedString($this->shop->get_option('wpsg_revocationform')))
 				{
-					
+				
 					$revocationFile = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform');
-					
+				
 					if (file_exists($revocationFile) && is_file($revocationFile))
 					{
-						
+							
 						$arAttachments[] = $revocationFile;
-						
-					}
-					
-				}
-
-				// QR-Rechnung an die Mail anhÃ€ngen
-				/*if ($this->shop->hasMod('wpsg_mod_prepayment') && $this->shop->get_option('wpsg_mod_prepayment_mailattachment') === '1') {
-
-					require_once WPSG_PATH_LIB.'phpgirocode.class.php';
-
-					$qrbillFile = $this->shop->callMod('wpsg_mod_prepayment', 'getFilePath', array($oOrder->getId));
-
-					if (file_exists($qrbillFile) && is_file($qrbillFile))
-					{		
-
-						$arAttachments[] = $qrbillFile;
-
-					} else {
-
-						// generate the qr-bill
-						$this->shop->callMod('wpsg_mod_prepayment', 'genQRCode', [
-							$order_id,
-							$this->shop->view['wpsg_mod_prepayment']['subject'],
-							$this->shop->view['basket']['sum']['preis_gesamt_brutto'],
-							10,
-							PhpGirocode::OUTPUT_BASE64,
-							$this->shop->get_option('wpsg_mod_prepayment_qrcode_country'),
-							$this->shop->view['basket']
-						]);
-					
-						$arAttachments[] = $this->shop->callMod('wpsg_mod_prepayment', 'getFilePath', array($order_id));
-
-					}
-					
-				}*/
-				
+							
+					}
+				
+				}
+
 				if ($bDebug === true) $empfaenger = $this->shop->get_option('wpsg_adminmail_empfaenger');
 				else $empfaenger = $this->arCheckout['email'];
@@ -705,6 +536,7 @@
 				$this->shop->sendMail($mail_text, $empfaenger, 'kundenmail', $arAttachments, $order_id, $oOrder->k_id, $mail_html);
 
-				if ($bDebug === false) {
-					
+				if ($bDebug === false)
+				{
+				
 					$this->db->ImportQuery(WPSG_TBL_OL, array(
 						"o_id" => wpsg_q($order_id),
@@ -719,275 +551,338 @@
 			
 		} // public function sendOrderSaveMails($order_id)
-		
+		 
 		/**
 		 * Speichert die Bestellung in die Datenbank
 		 * Ist der Parameter $finish_order auf false so bleiben die Bestelldaten in der Session (Zur Vorspeicherung)
 		 */
-		public function save($finish_order = true, $sendmail = true, $save = false) {
-
-			$knr = '';
-			 			
-			try {
-				
-				// Eintrag in Kundentabelle
+		public function save($finish_order = true)
+		{
+							
+			// Berechnen
+			$arBasket = $this->toArray();
+		 
+			// Keien Produkte nix speichern 
+			// Sonst wurden schon beim Betreten des leeren Warenkorb (Bots) leere Bestellungen erzeugt 
+			if (!wpsg_isSizedArray($arBasket['produkte'])) return;
+			
+			// Eintrag in Kundentabelle
+			$data = array(
+				'title' 	=> wpsg_q($this->arCheckout['title']),
+				'name' 		=> wpsg_q($this->arCheckout['name']),
+				'vname' 	=> wpsg_q($this->arCheckout['vname']),
+				'email' 	=> wpsg_q($this->arCheckout['email']),
+				'firma' 	=> wpsg_q($this->arCheckout['firma']),
+				'fax' 		=> wpsg_q($this->arCheckout['fax']),
+				'strasse' 	=> wpsg_q($this->arCheckout['strasse']),
+				'plz' 		=> wpsg_q($this->arCheckout['plz']),
+				'ort' 		=> wpsg_q($this->arCheckout['ort']),
+				'land' 		=> wpsg_q($this->arCheckout['land']),
+				'tel' 		=> wpsg_q($this->arCheckout['tel']),
+				'geb' 		=> wpsg_q(wpsg_toDate($this->arCheckout['geb'])),
+				'ustidnr' 	=> wpsg_q($this->arCheckout['ustidnr'])
+			);	
+						
+			$this->shop->callMods('basket_save_kunde', array(&$data, &$this->arCheckout));
+			
+			$saved_order_db = array();
+			
+			if (wpsg_isSizedInt($_SESSION['wpsg']['order_id']))
+			{
+							
+				$saved_order_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_SESSION['wpsg']['order_id'])."' ");
+				
+				if ($saved_order_db['id'] != $_SESSION['wpsg']['order_id'])
+				{
+					
+					// Wenn die Bestellung aus der Session nicht in der Datenbank existiert lege ich sie neu an
+					unset($_SESSION['wpsg']['order_id']); 
+					
+				}
+				else
+				{
+				
+					$k_id = $saved_order_db['k_id'];
+					
+				}
+				
+			}
+			
+			// Sollte die ID des eingeloggten Kunden nicht mit der ID in der Bestellung passen
+			if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id']))
+			{
+			
+				if (wpsg_isSizedInt($k_id) && $k_id != $_SESSION['wpsg']['checkout']['id'])
+				{
+						
+					$k_id = $_SESSION['wpsg']['checkout']['id'];
+			
+				}
+			
+			}			
+			
+			$data['custom'] = array();
+			if (isset($this->arCheckout['custom']) && wpsg_isSizedArray($this->arCheckout)) $data['custom'] = $this->arCheckout['custom'];
+					
+			if ($k_id > 0)
+			{
+				
+				// Kunde existiert bereits, hier muss aufgepasst werden dass nur abgefragte Kundenvariablen ersetzt werden
+				$kunde_data = $this->shop->cache->loadKunden($k_id);					
+				$custom_old = @unserialize($kunde_data['custom']);
+				
+				if (wpsg_isSizedArray($custom_old))
+				{
+					
+					$data['custom'] = wpsg_array_merge($custom_old, (array)$this->arCheckout['custom']);
+											
+				}
+				
+			}
+			 
+			$data['custom'] = serialize($data['custom']);
+			
+			if ($k_id > 0)
+			{
+				
+				$this->db->UpdateQuery(WPSG_TBL_KU, $data, "`id` = '".wpsg_q($k_id)."'");
+				$knr = $this->db->fetchOne("SELECT `knr` FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($k_id)."'");
+				
+				$this->shop->callMods('customer_updatePwd', array(&$k_id, &$this->arCheckout['password']));
+				$this->shop->callMods('customer_updated', array(&$k_id));
+				
+			}
+			else
+			{
+				
+				if ($this->shop->hasMod('wpsg_mod_customergroup'))
+				{
+				
+					if (wpsg_isSizedInt($this->shop->get_option('wpsg_page_mod_kundenverwaltung_group_checkout'))) $data['group_id'] = $this->shop->get_option('wpsg_page_mod_kundenverwaltung_group_checkout');
+					
+				}
+
+				$k_id = $this->db->ImportQuery(WPSG_TBL_KU, $data);
+				$knr = $this->shop->buildKNR($k_id);
+				
+				$this->db->UpdateQuery(WPSG_TBL_KU, array(
+					'knr' => wpsg_q($knr)
+				), "`id` = '".wpsg_q($k_id)."'");
+			 
+				$this->shop->callMods('customer_created', array(&$k_id, &$this->arCheckout['password']));				
+				
+			}
+			
+			$arBasket['checkout']['k_id'] = $k_id;
+			$arBasket['checkout']['knr'] = $knr;
+						
+			// Der Kunde ist ab 14.08.2015 nicht mehr angemeldet
+			//$_SESSION['wpsg']['checkout']['id'] = wpsg_xss($k_id);
+			 
+			// Produkte letztmalig ÃŒberprÃŒfen			
+			foreach ($arBasket['produkte'] as $p_id => &$p)
+			{
+			
+				if ($this->shop->hasMod('wpsg_mod_stock'))
+				{
+			
+					if (!$this->shop->callMod('wpsg_mod_stock', 'checkBestand', array($p['id'], $p['menge'])) && $this->shop->get_option('wpsg_mod_stock_allow') == '1')
+					{
+							
+						$p['menge'] = $this->shop->callMod('wpsg_mod_stock', 'getBestand', array($p['id']));
+			
+					}
+						
+				}
+				
+			}
+				 
+			$data = array(
+				'cdate' 			=> 'NOW()',
+				'k_id' 				=> $k_id,
+				'ip' 				=> wpsg_q($_SERVER['REMOTE_ADDR']),
+				'useragent' 		=> wpsg_q($_SERVER['HTTP_USER_AGENT']),
+				'comment' 			=> wpsg_q($this->arCheckout['comment']),
+				'price_gesamt' 		=> wpsg_tf(round($arBasket['sum']['preis_gesamt_brutto'], 2)),
+				'price_gesamt_netto' 		=> wpsg_tf(round($arBasket['sum']['preis_gesamt_netto'], 2)),
+				'price_gesamt_brutto' 		=> wpsg_tf(round($arBasket['sum']['preis_gesamt_brutto'], 2)),
+				'price_shipping' 	=> wpsg_tf($arBasket['sum']['preis_shipping']), // Sollte mal entfernt werden, wird aber an 1000 Stellen verwendet
+				'price_shipping_netto' => wpsg_tf($arBasket['sum']['preis_shipping_netto']),
+				'price_shipping_brutto'	=> wpsg_tf($arBasket['sum']['preis_shipping_brutto']),
+				'price_payment' 	=> wpsg_tf($arBasket['sum']['preis_payment']), // Sollte mal entfernt wedren, wird aber an 1000 Stellen verwendet
+				'price_payment_netto' 	=> wpsg_tf($arBasket['sum']['preis_payment_netto']),
+				'price_payment_brutto' 	=> wpsg_tf($arBasket['sum']['preis_payment_brutto']),
+				'price_rabatt' 		=> wpsg_tf($arBasket['sum']['preis_rabatt']),				
+				'mwst_payment' 		=> wpsg_tf($arBasket['payment']['preis_payment_brutto'] - $arBasket['payment']['preis_payment_netto']),
+				'mwst_shipping' 	=> wpsg_tf($arBasket['shipping']['preis_shipping_brutto'] - $arBasket['shipping']['preis_shipping_netto']),
+				'type_shipping' 	=> wpsg_q($this->arCheckout['shipping']),
+				'type_payment' 		=> wpsg_q($this->arCheckout['payment']),
+				'custom_data' 		=> array(
+					'basket' 				=> $arBasket,
+					'preis_backend' 		=> $this->shop->get_option('wpsg_preisangaben'),
+					'preis_frontend' 		=> $this->shop->getFrontendTaxview(),
+					'wpsg_kleinunternehmer' => $this->shop->get_option('wpsg_kleinunternehmer'),
+					'wpsg_kleinunternehmer_text' => $this->shop->get_option('wpsg_kleinunternehmer_text')
+				)				
+			);
+			
+			if ($finish_order === true) $data['status'] = wpsg_ShopController::STATUS_EINGEGANGEN; 
+			else $data['status'] = wpsg_ShopController::STATUS_UNVOLLSTAENDIG;
+			
+			// Sprache des Nutzers speichern
+			if ($this->shop->isOtherLang())
+			{
+				
+				$data['language'] = wpsg_q($this->shop->getCurrentLanguage());
+				
+			}
+			 
+			/** Gutschein speichern */
+			if ($this->gs_id !== false && $this->gs_id > 0)
+			{
+				
+				$gs_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `id` = '".wpsg_q($this->gs_id)."'");
+				
+				if ($gs_db['id'] != $this->gs_id) die(__('Unerwarteter Fehler bei Gutscheinzuordnung.', 'wpsg'));
+				
+				$data['gs_id'] = wpsg_q($this->gs_id);
+				$data['price_gs'] = wpsg_q($arBasket['sum']['gs']);
+								
+			}
+			
+			$this->shop->callMods('basket_save_order', array(&$data, &$this->arCheckout, &$arBasket, $finish_order));
+			
+			$data['custom_data'] = wpsg_q(serialize($data['custom_data']));
+			
+			if (wpsg_isSizedInt($_SESSION['wpsg']['order_id']))
+			{
+				
+				$this->db->UpdateQuery(WPSG_TBL_ORDER, $data, " `id` = '".wpsg_q($_SESSION['wpsg']['order_id'])."' ");
+				
+				$o_id = $_SESSION['wpsg']['order_id'];
+				$o_nr = $saved_order_db['onr'];
+				
+			}
+			else 
+			{
+				
+				$o_id = $this->db->ImportQuery(WPSG_TBL_ORDER, $data);
+				$o_nr = $this->shop->buildONR($o_id, $k_id, $knr);
+			
+				// Bestellnummer speichern
+				$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+					'onr' => wpsg_q($o_nr)
+				), "`id` = '".wpsg_q($o_id)."'");
+								
+			}
+				
+			$arBasket['checkout']['onr'] = $o_nr;			
+			$arBasket['checkout']['o_id'] = $o_id;
+			$arBasket['checkout']['datum'] = strtotime($this->db->fetchOne("SELECT `cdate` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($o_id)."'")); 
+			
+			if ($finish_order === true)
+			{
+			
+				/** Gutschein der Bestellung zuordnen */
+				if ($this->gs_id !== false && $this->gs_id > 0)
+				{
+				
+					if ($gs_db['multi'] != '1')
+					{
+							
+						$this->db->UpdateQuery(WPSG_TBL_GUTSCHEIN, array('o_id' => $o_id), "`id` = '".wpsg_q($this->gs_id)."'");
+							
+					}
+				
+				}
+				
+				$this->shop->cache->clearOrderCache($o_id);
+				$this->shop->cache->clearKundenCache($k_id);
+				
+			}
+			
+			// DB bereinigen und alte zur Bestellung gespeicherte Produkte lÃ¶schen
+			$this->db->Query("DELETE FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($o_id)."' ");
+			 
+			// Produkte eintragen
+			foreach ($arBasket['produkte'] as $p_id => &$p)
+			{
+			 	 	 
+				// AufdrÃ¶selung der Varianten damit in der DB die korrekt Produkt ID steht
+				$produkt_id = $this->shop->getProduktID($p['id']);
+				  
 				$data = array(
-					'email' => wpsg_q(wpsg_getStr($this->arCheckout['email'])),
-					'email_einvoice' => $this->arCheckout['email_einvoice']??'',
-					'leitweg_id' => $this->arCheckout['leitweg_id']??'',
-					'invisible' => 1,
-					'geb' => wpsg_q(wpsg_toDate(wpsg_getStr($this->arCheckout['geb']))),
-					'ustidnr' => wpsg_q(wpsg_getStr($this->arCheckout['ustidnr']))
+					'o_id' => wpsg_q($o_id),
+					'p_id' => wpsg_q($produkt_id),
+					'productkey' => $p['id'],
+					'product_index' => $p_id,
+					'menge' => wpsg_q($p['menge']),
+					'price' => wpsg_q($p['preis_brutto']),
+					'price_netto' => wpsg_q(wpsg_tf($p['preis_netto'])),
+					'price_brutto' => wpsg_q(wpsg_tf($p['preis_brutto'])),
+					'mwst_key' => wpsg_q($p['mwst_key']),
+					'mwst_value' => wpsg_q(wpsg_tf($p['preis_brutto'] - $p['preis_netto'])),
+					'mod_vp_varkey' => wpsg_q($p['productkey']),
+					'allowedpayments' => wpsg_q($p['allowedpayments']),
+					'allowedshipping' => wpsg_q($p['allowedshipping'])
 				);
-
-				$this->shop->callMods('basket_save_kunde', array(&$data, &$this->arCheckout));
-
-				$k_id = wpsg_getStr($this->arCheckout['id']);
-				
-				// Sollte die ID des eingeloggten Kunden nicht mit der ID in der Bestellung passen
-				if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id'])) {
-					
-					if (wpsg_isSizedInt($k_id) && $k_id != $_SESSION['wpsg']['checkout']['id']) {
-						
-						$k_id = $_SESSION['wpsg']['checkout']['id'];
-						
-					}
-					
-				}
-				
-				$data['custom'] = array();
-				
-				if (isset($this->arCheckout['custom']) && wpsg_isSizedArray($this->arCheckout)) $data['custom'] = $this->arCheckout['custom'];
-				
-				if (wpsg_isSizedInt($k_id)) {
-					
-					// Kunde existiert bereits, hier muss aufgepasst werden dass nur abgefragte Kundenvariablen ersetzt werden
-					$kunde_data = $this->shop->cache->loadKunden($k_id);
-					$custom_old = @unserialize($kunde_data['custom']);
-					
-					if (wpsg_isSizedArray($custom_old))
-					{
-						
-						$data['custom'] = wpsg_array_merge($custom_old, (array)$this->arCheckout['custom']);
-						
-					}
-					
-				}
-				
-				$data['custom'] = serialize($data['custom']);
-				
-				$update_customer_data = array();
-				
-				if ($k_id > 0) {
-					
-					$this->db->UpdateQuery(WPSG_TBL_KU, $data, "`id` = '".wpsg_q($k_id)."'");
-					$knr = $this->db->fetchOne("SELECT `knr` FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($k_id)."'");
-					
-					$this->shop->callMods('customer_updatePwd', array(&$k_id, &$this->arCheckout['password']));
-					$this->shop->callMods('customer_updated', array(&$k_id));
-					
-				} else {
-					
-					if ($this->shop->hasMod('wpsg_mod_customergroup')) {
-						
-						if (wpsg_isSizedInt($this->shop->get_option('wpsg_page_mod_kundenverwaltung_group_checkout'))) $data['group_id'] = $this->shop->get_option('wpsg_page_mod_kundenverwaltung_group_checkout');
-						
-					}
-					
-					if (wpsg_isSizedString($data['email'])) {
-						
-						if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id'])) {
-
-							$k_id = $this->db->ImportQuery(WPSG_TBL_KU, $data);
-							
-							$_SESSION['wpsg']['checkout']['id'] = $k_id;
-							
-						} else {
-							
-							$k_id = wpsg_getInt($_SESSION['wpsg']['checkout']['id']);
-							
-						}
-						
-						$knr = $this->shop->buildKNR($k_id);
-
-                        $update_customer_data['status'] = intval(get_option('wpsg_page_mod_kundenverwaltung_status'));
-						$update_customer_data['knr'] = wpsg_q($knr);
-						
-					}
-					
-					$this->shop->callMods('customer_created', array(&$k_id, &$this->arCheckout['password']));
-					
-				}
-				
-				// Adresse speichern wenn der Kunde noch keine Adresse hat
-				$customer_data = $this->shop->cache->loadKunden($k_id, true);
-				
-				$adress_data = array(
-					'firma' => wpsg_q(wpsg_getStr($this->arCheckout['firma'])),
-					'title' => wpsg_q(wpsg_getStr($this->arCheckout['title'])),
-					'vname' => wpsg_q(wpsg_getStr($this->arCheckout['vname'])),
-					'name' => wpsg_q(wpsg_getStr($this->arCheckout['name'])),
-					'strasse' => wpsg_q(wpsg_getStr($this->arCheckout['strasse'])),
-					'nr' => wpsg_q(wpsg_getStr($this->arCheckout['nr'])),
-					'plz' => wpsg_q(wpsg_getStr($this->arCheckout['plz'])),
-					'ort' => wpsg_q(wpsg_getStr($this->arCheckout['ort'])),
-					'tel' => wpsg_q(wpsg_getStr($this->arCheckout['tel'])),
-					'fax' => wpsg_q(wpsg_getStr($this->arCheckout['fax'])),
-					'land' => wpsg_q(wpsg_getStr($this->arCheckout['land']))
-				);
-				
-				$update_data = [
-					'k_id' => wpsg_q($k_id),
-					'language' => wpsg_q($this->shop->getCurrentLanguageCode())
-				];
-				
-				if (!wpsg_isSizedInt($customer_data['adress_id'])) {
-					
-					$adress_data['cdate'] = 'NOW()';
-					
-					if (wpsg_isSizedString($adress_data['name']) && wpsg_isSizedString($adress_data['vname'])) {
-						
-						$customer_data['adress_id'] = wpsg_q($this->db->ImportQuery(WPSG_TBL_ADRESS, $adress_data));
-						$update_customer_data['adress_id'] = $customer_data['adress_id'];
-						
-					}
-					
-				} else {
-					
-					$this->db->UpdateQuery(WPSG_TBL_ADRESS, $adress_data, " `id` = '".wpsg_q($customer_data['adress_id'])."' ");
-					
-				}
-				
-				$re_adress_id = $customer_data['adress_id'];
-				
-				// Kundendaten ggf. aktualisieren
-				if (wpsg_isSizedArray($update_customer_data)) $this->db->UpdateQuery(WPSG_TBL_KU, $update_customer_data, "`id` = '".wpsg_q($k_id)."'");
-				
-				$arBasket['checkout']['k_id'] = $k_id;
-				$arBasket['checkout']['knr'] = $knr;
-				
-				if (($finish_order === true) && (wpsg_getStr($this->arCheckout['diff_shippingadress']) == '1')) {
-					
-					// Gesonderte Lieferadresse speichern
-					
-					$adata['cdate'] = 'NOW()';
-					
-					$adata['title'] 	= $this->arCheckout['shipping_title'];
-					$adata['vname'] 	= $this->arCheckout['shipping_vname'];
-					$adata['name'] 		= $this->arCheckout['shipping_name'];
-					$adata['strasse'] 	= $this->arCheckout['shipping_strasse'];
-					$adata['nr'] 	= $this->arCheckout['shipping_nr'];
-					$adata['plz'] 		= $this->arCheckout['shipping_plz'];
-					$adata['ort'] 		= $this->arCheckout['shipping_ort'];
-					$adata['firma'] 	= $this->arCheckout['shipping_firma'];
-					$adata['land'] 		= $this->arCheckout['shipping_land'];
-					
-					$update_data['shipping_adress_id'] = wpsg_q($this->db->ImportQuery(WPSG_TBL_ADRESS, $adata));
-					
-				}
-				
-				$update_data['adress_id'] = $re_adress_id;
-				
-				$update_data['custom_data']['basket']['oOrder'] = Array();
-				$update_data['custom_data'] = wpsg_q(serialize($update_data['custom_data']));
-				
-				// Neu durch calculation Klasse speichern				
-				$oCalculation = \wpsg\wpsg_calculation::getSessionCalculation();
-				//$o_id = $oCalculation->toDB(@$_SESSION['wpsg']['order_id'], [], $finish_order);
-				
-				$o_id = @$_SESSION['wpsg']['order_id'];
-				
-				if ($save) {
-					
-					$o_id = $oCalculation->toDB(@$_SESSION['wpsg']['order_id'], [], $finish_order);
-					
-					$_SESSION['wpsg']['order_id'] = $o_id;
-					
-				}
-				
-				if ($finish_order) {
-					 
-					$update_data['onr'] = wpsg_q($this->shop->buildONR(@$_SESSION['wpsg']['order_id'], $k_id, $knr));
-					
-					$o_id = $oCalculation->toDB(@$_SESSION['wpsg']['order_id'], [
-						'comment' => $this->arCheckout['comment']
-					], $finish_order);
-										
-				}
-				 
-				if ($finish_order === true) $update_data['status'] = wpsg_ShopController::STATUS_EINGEGANGEN;
-				else $update_data['status'] = wpsg_ShopController::STATUS_UNVOLLSTAENDIG;
-				
-				if (wpsg_isSizedInt($o_id)) $this->db->UpdateQuery(WPSG_TBL_ORDER, $update_data, "`id` = '".wpsg_q($o_id)."'");
-				
-				// URL Benachrichtigung beim Kauf
-				if ($finish_order === true) {
-					
-					foreach ($oCalculation->getCalculationArray()['product'] as $p) {
-						 
-						$produkt_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($p['product_id'])."'");
-						
-						if ($produkt_db['posturl'] != '' && $produkt_db['posturl_verkauf'] == '1')
-						{
-							
-							$this->shop->notifyURL($produkt_db['posturl'], $p['product_key'], $p['amount'], $o_id, 0, false, array(
-								'product_index' => $p['product_index']
-							));
-							
-						}
-						
-					}
-					
-					$this->shop->cache->clearOrderCache($o_id);
-					$this->shop->cache->clearKundenCache($k_id);
-					
-					$this->shop->callMods('basket_save_done', array(&$o_id, &$k_id, &$this));
-					$this->shop->callMods('basket_save_done_array', array(&$o_id, &$k_id, &$arBasket));
-					
-					$this->shop->basket->initFromDB($o_id);
-					$arBasket = $this->shop->basket->toArray();
-					
-					// Wenn CrefoPay aktiv, werden die Mails spÃ€ter versendet
-					if (!$this->shop->hasMod('wpsg_mod_crefopay') && $sendmail) $this->sendOrderSaveMails($o_id, $arBasket);
-					
-					// Bestellung direkt auf "Zahlung akzeptiert setzen" wenn option aktiv ist
-					if ($this->shop->get_option('wpsg_emptyorder_clear') == '1' && $oCalculation->getToPay(WPSG_BRUTTO) == 0) {
-						
-						$this->shop->setOrderStatus($o_id, 100, true);
-						
-					}
-					
-					// Eintrag in die Kundentabelle
-					$kdata = array(
-						'invisible' => 0 	// 0=vollstÃ€ndige Bestellung
-					);
-					
-					$this->db->UpdateQuery(WPSG_TBL_KU, $kdata, "`id` = '".wpsg_q($k_id)."'");
-					 
-					// Alte BestellID muss nach Abschluss entfernt werden
-					unset($_SESSION['wpsg']['order_id']);
-					unset($_SESSION['wpsg']['checkout']['payment_amount']);
-					unset($_SESSION['wpsg']['checkout']['paymentId']);
-					unset($_SESSION['wpsg']['checkout']['payer_id']);
-					
-					$this->clearSession($k_id);
-					
-				} else {
-					 
-					$_SESSION['wpsg']['order_id'] = $o_id;
-					
-				}
-				
-			} catch (Exception $e) {
-				
-				$this->db->unlockTables();
-				
-				die($e->getMessage());
-				
-			}
-			
-			$this->db->unlockTables();
+				
+				$this->shop->callMods('basket_save_product', array(&$data, &$p, $finish_order));
+				
+				$this->db->ImportQuery(WPSG_TBL_ORDERPRODUCT, $data);
+				
+				// Eventuelle URL Benachrichtigung bei Kauf
+				if ($finish_order === true)
+				{
+				
+					$produkt_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'");
+				
+					if ($produkt_db['posturl'] != '' && $produkt_db['posturl_verkauf'] == '1')
+					{
+						
+						$this->shop->notifyURL($produkt_db['posturl'], $p['id'], $p['menge'], $o_id, 0, false, array(
+							'product_index' => $p_id
+						));
+				
+					}
+					
+				}
+				
+			}
+			
+			if ($finish_order === true)
+			{
+			
+				$this->shop->callMods('basket_save_done', array(&$o_id, &$k_id, &$this));
+				$this->shop->callMods('basket_save_done_array', array(&$o_id, &$k_id, &$arBasket));
+	
+				// Wenn CrefoPay aktiv, werden die Mails spÃ€ter versendet
+				if (!$this->shop->hasMod('wpsg_mod_crefopay')) $this->sendOrderSaveMails($o_id, $arBasket);
+				
+				// Bestellung direkt auf "Zahlung akzeptiert setzen" wenn option aktiv ist
+				if ($this->shop->get_option('wpsg_emptyorder_clear') == '1' && $arBasket['sum']['preis_gesamt_brutto'] == 0)
+				{
+					
+					$this->shop->setOrderStatus($o_id, 100, true);
+					
+				}
+				
+				// Alte BestellID muss nach AbschluÃ entfernt werden
+				unset($_SESSION['wpsg']['order_id']);
+				unset($_SESSION['wpsg']['checkout']['payment_amount']);
+				unset($_SESSION['wpsg']['checkout']['paymentId']);
+				unset($_SESSION['wpsg']['checkout']['payer_id']);
+				
+				$this->clearSession();
+				
+			}
+			else
+			{
+				
+				$_SESSION['wpsg']['order_id'] = $o_id;
+				
+			}
 			
 			return $o_id;
-			
+						
 		} // public function save()
 		
@@ -1000,35 +895,20 @@
 		 * ÃberprÃŒft die Korrektheit der Kunden- und Bestelldaten
 		 */
-		public function checkCheckout($state = true) {
-			
+		public function checkCheckout($state = true)
+		{
+			 
 			$bError = false;
-			
-			// Darf hier nicht ÃŒberschrieben werden sonst keine Feldmarkierung fÃŒr ordercondition
-			if (!wpsg_isSizedArray($_SESSION['wpsg']['errorFields'])) $_SESSION['wpsg']['errorFields'] = array();
+			$_SESSION['wpsg']['errorFields'] = array();
 			
 			$custom_config = $GLOBALS['wpsg_sc']->loadPflichtFeldDaten();
-			
+
 			$this->shop->callMods('checkCheckout', array(&$state, &$bError, &$this->arCheckout));
-			
-			if ($state == 1 || $state) {
-
-				if (wpsg_isSizedString($_REQUEST['wpsg_spam_email'])) throw new \Exception('Holland Connection');
-				
-				if (isset($_REQUEST['wpsg_mod_kundenverwaltung_register']) && $this->shop->get_option('wpsg_mod_kundenverwaltung_mathcaptcha') === '1') {
-					
-					if (\get_transient('wpsg_mod_kundenverwaltung_mathcaptcha_result') !== $_REQUEST['wpsg_mod_kundenverwaltung_mathcaptcha']) {
-						
-						$this->shop->addFrontendError(__('Bitte lÃ¶sen sie die Mathe Aufgabe und zeigen Sie, dass Sie kein Bot sind!', 'wpsg'));
-						$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_kundenverwaltung_mathcaptcha';
-						$bError = true;
-						
-					}
-					
-				}
-				
-				if (wpsg_isSizedString($_REQUEST['wpsg_spam_email'])) throw new \Exception('Holland Connection');
-				
+						
+			if ($state == 1 || $state)
+			{
+			
 				// Anrede ÃŒberprÃŒfen
-				if ($custom_config['anrede'] != '2' && $custom_config['anrede'] != '1' && ($this->arCheckout['title']??'-1') == '-1') {
+				if ($custom_config['anrede'] != '1' && $this->arCheckout['title'] == '-1')
+				{
 					
 					$this->shop->addFrontendError(__('Bitte im Feld "Anrede" eine Angabe machen!', 'wpsg'));
@@ -1037,7 +917,8 @@
 					
 				}
-				
-				// Firma
-				if ($custom_config['firma'] != '2' && $custom_config['firma'] != '1' && trim($this->arCheckout['firma']) == '') {
+	
+				// Firma 
+				if ($custom_config['firma'] != '1' && trim($this->arCheckout['firma']) == '')
+				{
 					
 					$this->shop->addFrontendError(__('Bitte im Feld "Firma" eine Angabe machen!', 'wpsg'));
@@ -1048,5 +929,6 @@
 				
 				// Vorname
-				if ($custom_config['vname'] != '2' && $custom_config['vname'] != '1' && trim(wpsg_getStr($this->arCheckout['vname'])) == '') {
+				if ($custom_config['vname'] != '1' && trim($this->arCheckout['vname']) == '')
+				{
 					
 					$this->shop->addFrontendError(__('Bitte im Feld "Vorname" eine Angabe machen!', 'wpsg'));
@@ -1057,5 +939,5 @@
 				
 				// Name
-				if ($custom_config['name'] != '2' && $custom_config['name'] != '1' && trim(wpsg_getStr($this->arCheckout['name'])) == '')
+				if ($custom_config['name'] != '1' && trim($this->arCheckout['name']) == '')
 				{
 					
@@ -1068,8 +950,11 @@
 				// Geburtsdatum
 				if (
-					($custom_config['geb'] != '2' && $custom_config['geb'] != '1' && !wpsg_isValidGeb($this->arCheckout['geb'])) ||
-					(wpsg_isSizedString($this->arCheckout['geb']) && !wpsg_isValidGeb($this->arCheckout['geb']))
-				
-				)
+						$custom_config['geb'] == '0' && !wspg_isValidGeb($this->arCheckout['geb'])
+						
+						/*
+						(wspg_isValidGeb($this->arCheckout['geb']) && wpsg_isSizedString($this->arCheckout['geb'])) || 
+						$custom_config['geb'] == '0'
+						 * */
+					)
 				{
 					
@@ -1081,8 +966,5 @@
 				
 				// E-Mail Adresse
-				if (
-					($custom_config['email'] != '2' && $custom_config['email'] != '1' && !wpsg_isValidEMail($this->arCheckout['email'])) ||
-					(wpsg_isSizedString($this->arCheckout['email']) && !wpsg_isValidEMail($this->arCheckout['email']))
-				)
+				if ($custom_config['email'] != '1' && !wpsg_isValidEMail($this->arCheckout['email']))
 				{
 					
@@ -1092,43 +974,16 @@
 					
 				}
-				
-				if (intval($custom_config['eInvoice']) === 1 && trim($this->arCheckout['email_einvoice']??'') !== '') { // e-Mail fÃŒr eRechnung wird abgefragt und ist angegeben
-					
-					if (!wpsg_isValidEMail($this->arCheckout['email_einvoice'])) {
-						
-						$this->shop->addFrontendError(__('Bitte die Eingabe der E-Mail Adresse fÃŒr eRechnung ÃŒberprÃŒfen!', 'wpsg'));
-						$_SESSION['wpsg']['errorFields'][] = 'einvoice_input';
-						$bError = true;
-						
-					}
-					
-				}
-
-				if (intval($custom_config['leitweg']??0) === 1 && trim($this->arCheckout['leitweg_id']??'') !== '') { // E-Mail fÃŒr eRechnung wird abgefragt und ist angegeben
-
-					if (empty($this->arCheckout['leitweg_id'])) {
-
-						$this->shop->addFrontendError(__('Bitte die Eingabe der E-Mail Adresse fÃŒr eRechnung ÃŒberprÃŒfen!', 'wpsg'));
-						$_SESSION['wpsg']['errorFields'][] = 'leitweg_input';
-						$bError = true;
-
-					}
-
-				}
-				
+	
 				// E-Mail EingabeÃŒberprÃŒfung
 				if ($custom_config['emailconfirm'] == '1')
 				{
 					
-					$this->arCheckout['email'] = strtolower($this->arCheckout['email']??'');
-					$this->arCheckout['email2'] = strtolower($this->arCheckout['email2']??'');
-					
-					if ($this->arCheckout['email'] != wpsg_getStr($this->arCheckout['email2']))
-					{
-						
+					if ($this->arCheckout['email'] != $this->arCheckout['email2'])
+					{
+	
 						$this->shop->addFrontendError(__('Bitte ÃŒberprÃŒfen Sie die Eingaben in der E-Mail BestÃ€tigung!', 'wpsg'));
-						$_SESSION['wpsg']['errorFields'][] = 'email';
+						$_SESSION['wpsg']['errorFields'][] = 'email'; 
 						$bError = true;
-						
+						 
 					}
 					
@@ -1136,7 +991,7 @@
 				
 				// Telefonnummer validieren
-				if ($custom_config['tel'] != '2' && $custom_config['tel'] != '1' && ($this->arCheckout['tel']??'') == '')
-				{
-					
+				if ($custom_config['tel'] != '1' && $this->arCheckout['tel'] == '')
+				{
+
 					$this->shop->addFrontendError(__('Bitte die Eingabe im Feld "Telefonnummer" ÃŒberprÃŒfen!', 'wpsg'));
 					$_SESSION['wpsg']['errorFields'][] = 'tel';
@@ -1146,5 +1001,5 @@
 				
 				// StraÃe prÃŒfen
-				if ($custom_config['strasse'] != '2' && $custom_config['strasse'] != '1' && wpsg_getStr($this->arCheckout['strasse']) == '')
+				if ($custom_config['strasse'] != '1' && $this->arCheckout['strasse'] == '')
 				{
 					
@@ -1155,15 +1010,6 @@
 				}
 				
-				// Hausnummer
-				if (wpsg_getStr($custom_config['wpsg_showNr']) === '1' && $custom_config['strasse'] != '2' && $custom_config['strasse'] != '1' && wpsg_getStr($this->arCheckout['nr']) == '') {
-					
-					$this->shop->addFrontendError(__('Bitte die Eingaben im Feld "StraÃe" ÃŒberprÃŒfen!', 'wpsg'));
-					$_SESSION['wpsg']['errorFields'][] = 'nr';
-					$bError = true;
-					
-				}
-				
 				// Fax prÃŒfen
-				if ($custom_config['fax'] != '2' && $custom_config['fax'] != '1' && $this->arCheckout['fax'] == '')
+				if ($custom_config['fax'] != '1' && $this->arCheckout['fax'] == '')
 				{
 					
@@ -1175,22 +1021,16 @@
 				
 				// PLZ ÃŒberprÃŒfen
-				if (!in_array($custom_config['plz'], ['1', '2'])) {
-					
-					// Ja
-					// Wir haben uns darauf geeinigt Zahlen, Buchstaben, Bindestriche und Freizeichen geeinigt
-					$filtered_string = preg_replace('/[^A-Z0-9-\040]+/', '', strtoupper($this->arCheckout['plz']??''));
-					
-					if ($filtered_string !== $this->arCheckout['plz']) {
-						
-						$this->shop->addFrontendError(__('Bitte die Eingaben im Feld "PLZ" ÃŒberprÃŒfen!', 'wpsg'));
-						$_SESSION['wpsg']['errorFields'][] = 'plz';
-						$bError = true;
-						
-					}
+				if ($custom_config['plz'] != '1' && $this->arCheckout['plz'] == '')
+				{
+					
+					$this->shop->addFrontendError(__('Bitte die Eingaben im Feld "PLZ" ÃŒberprÃŒfen!', 'wpsg'));
+					$_SESSION['wpsg']['errorFields'][] = 'plz';
+					$bError = true;
 					
 				}
 				
 				// Ort ÃŒberprÃŒfen
-				if ($custom_config['ort'] != '2' && $custom_config['ort'] != '1' && ($this->arCheckout['ort']??'') == '') {
+				if ($custom_config['ort'] != '1' && $this->arCheckout['ort'] == '')
+				{
 					
 					$this->shop->addFrontendError(__('Bitte die Eingaben im Feld "Ort" ÃŒberprÃŒfen!', 'wpsg'));
@@ -1201,5 +1041,5 @@
 				
 				// Land ÃŒberprÃŒfen
-				if ($custom_config['land'] != '2' && $custom_config['land'] != '1' && $this->arCheckout['land'] <= 0)
+				if ($custom_config['land'] != '1' && $this->arCheckout['land'] <= 0)
 				{
 					
@@ -1209,23 +1049,7 @@
 					
 				}
-
-				$checkout_country_id = intval($this->arCheckout['land']);
-				if ($checkout_country_id > 0) {
-
-					$wpsg_country = wpsg_country::getInstance( $checkout_country_id );
-
-					if ( $wpsg_country->getName() === 'Deutschland' && strlen( $this->arCheckout['plz'] ) != 5 ) {
-
-						$this->shop->addFrontendError( __( 'Postleitzahl gibt es in diesem Land nicht.', 'wpsg' ) );
-						$_SESSION['wpsg']['errorFields'][] = 'plz';
-						$_SESSION['wpsg']['errorFields'][] = 'land';
-						$bError                            = true;
-
-					}
-
-				}
 				
 				// UStIdNr prÃŒfen
-				if ($custom_config['ustidnr'] != '2' && $custom_config['ustidnr'] != '1' && !preg_match("/^[a-zA-Z]+\d+/", $this->arCheckout['ustidnr']))
+				if ($custom_config['ustidnr'] != '1' && !preg_match("/^[a-zA-Z]+\d+/", $this->arCheckout['ustidnr']))
 				{
 					
@@ -1241,5 +1065,5 @@
 					
 					// Wenn die Kundenvariable nicht im Request drin ist dann auch nichts machen
-					// Problem war der Fall, dass eine Kundenvariable nicht angezeigt wurde
+					// Problem war der Fall, dass eine Kundenvariable nicht angezeigt wurde 
 					if (!isset($this->arCheckout['custom'][$c_id])) continue;
 					
@@ -1295,21 +1119,19 @@
 				
 			}
-			
+
 			/**
 			 * Versand- und Zahlungsarten nur Checken wenn State=2 oder alle State=true (Alles prÃŒfen)
 			 * Wenn Einseiten-Checkout aktiv, dann auch bei State=1 prÃŒfen aber nicht(!) Wenn Profil oder Registrierung abgeschickt wird
-			 */
-			if ($state == 2 || $state === true ||
+			 */			
+			if ($state == 2 || $state === true || 
 				($this->shop->hasMod('wpsg_mod_onepagecheckout') && $state == 1 && !isset($_REQUEST['wpsg_mod_kundenverwaltung_save']) && !isset($_REQUEST['wpsg_mod_kundenverwaltung_register'])))
 			{
-				
-				// Das wird jetzt eher gemacht
-				//$this->shop->checkShippingAvailable();
-				//$this->shop->checkPaymentAvailable();
-				
+							
+				$this->shop->checkShippingAvailable(); 
+ 
 				// Versandart prÃŒfen
 				if (!isset($this->arCheckout['shipping']) || !array_key_exists($this->arCheckout['shipping'], $this->shop->arShipping) || $this->arCheckout['shipping'] == '')
 				{
-			 
+				
 					$this->shop->addFrontendError(__('Bitte eine gÃŒltige Versandart auswÃ€hlen.', 'wpsg'));
 					$_SESSION['wpsg']['errorFields'][] = 'shipping';
@@ -1317,30 +1139,24 @@
 					
 				}
-				
+ 
 				// Zahlungsart prÃŒfen
 				if (!$this->shop->hasMod('wpsg_mod_crefopay'))
 				{
-					
+				
 					if (!isset($this->arCheckout['payment']) || !array_key_exists($this->arCheckout['payment'], $this->shop->arPayment) || $this->arCheckout['payment'] == '')
 					{
-						
-						// Fake Zahlungsart PayPal Plus soll keinen Fehler schreiben
-						if ($this->arCheckout['payment'] != 'ppp')
-						{
-							
-							$this->shop->addFrontendError(__('Bitte eine gÃŒltige Zahlungsart auswÃ€hlen.', 'wpsg'));
-							$_SESSION['wpsg']['errorFields'][] = 'payment';
-							$bError = true;
-							
-						}
-						
-					}
-					
-				}
-				
+					
+						$this->shop->addFrontendError(__('Bitte eine gÃŒltige Zahlungsart auswÃ€hlen.', 'wpsg'));
+						$_SESSION['wpsg']['errorFields'][] = 'payment';
+						$bError = true;
+						
+					}
+					
+				}
+			 
 			}
 			
 			// prÃŒft ob tatsÃ€chlich mind. ein Produkt im Warenkorb liegt
-			if (isset($_SESSION['wpsg']['basket']) && count($_SESSION['wpsg']['basket']) < 1 && !is_numeric($state))
+			if (count($_SESSION['wpsg']['basket']) < 1 && !is_numeric($state))
 			{
 				$this->shop->addFrontendError(__('Keine Produkte im Warenkorb.', 'wpsg'));
@@ -1348,9 +1164,9 @@
 				$bError = true;
 			}
-			
-			return !$bError;
+				
+			return !$bError; 
 			
 		} // public function checkCheckout()
-		
+
 		/**
 		 * ÃberprÃŒft den Basket Array auf ein EU-Leistungsort Produkt und gibt true oder false zurÃŒck
@@ -1373,26 +1189,105 @@
 		 * Wandelt die in der Session gespeicherten Produkte in einen aufgewerteten Array
 		 */
-		public function toArray($backend = false, $clearVK = false) {
+		public function toArray($backend = false, $clearVK = false)
+		{
+			
+			if ($this->o_id > 0)
+			{
+				
+				$order_data = $this->shop->cache->loadOrder($this->o_id);
+				$custom_data = @unserialize($order_data['custom_data']);	
+								
+				if (is_array($custom_data['basket']))
+				{
+					
+					$arBasket = $custom_data['basket'];
+					
+					// Ich vereinige die Checkoutdaten mit den Kundendaten aus der Datenbank
+					// Damit sind hier die aktuellen Werte aus der Datenbank enthalten
+					$arBasket['checkout'] = wpsg_array_merge($arBasket['checkout'], $this->shop->cache->loadKunden($arBasket['checkout']['k_id']));
+										
+					// FÃŒr das Backend eventuell Preise drehen
+					if ($backend === true)
+					{
+						
+						if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+						{
+						 
+							if (isset($arBasket['sum']['preis_payment_netto'])) $arBasket['sum']['preis_payment'] = $arBasket['sum']['preis_payment_netto'];
+							if (isset($arBasket['sum']['preis_shipping_netto'])) $arBasket['sum']['preis_shipping'] = $arBasket['sum']['preis_shipping_netto']; 
+							if (isset($arBasket['sum']['gs_netto'])) $arBasket['sum']['gs'] = $arBasket['sum']['gs_netto'];
+							if (isset($arBasket['sum']['preis_rabatt_netto'])) $arBasket['sum']['preis_rabatt'] = $arBasket['sum']['preis_rabatt_netto'];
+							if (isset($arBasket['sum']['preis_netto'])) $arBasket['sum']['preis'] = $arBasket['sum']['preis_netto'];
+							if (isset($arBasket['sum']['preis_gesamt_netto'])) $arBasket['sum']['preis_gesamt'] = $arBasket['sum']['preis_gesamt_netto'];
+											
+						}
+						else
+						{
+							
+							if (isset($arBasket['sum']['preis_payment_brutto'])) $arBasket['sum']['preis_payment'] = $arBasket['sum']['preis_payment_brutto'];
+							if (isset($arBasket['sum']['preis_shipping_brutto'])) $arBasket['sum']['preis_shipping'] = $arBasket['sum']['preis_shipping_brutto']; 
+							if (isset($arBasket['sum']['gs_brutto'])) $arBasket['sum']['gs'] = $arBasket['sum']['gs_brutto'];
+							if (isset($arBasket['sum']['preis_rabatt_brutto'])) $arBasket['sum']['preis_rabatt'] = $arBasket['sum']['preis_rabatt_brutto'];
+							if (isset($arBasket['sum']['preis_brutto'])) $arBasket['sum']['preis'] = $arBasket['sum']['preis_brutto'];
+							if (isset($arBasket['sum']['preis_gesamt_brutto'])) $arBasket['sum']['preis_gesamt'] = $arBasket['sum']['preis_gesamt_brutto'];
+							
+						}
+						
+						foreach ($arBasket['produkte'] as $k => $v)
+						{
+							
+							if ($arBasket['noMwSt'] == '1')
+							{
+								
+								$arBasket['produkte'][$k]['preis'] = $arBasket['produkte'][$k]['preis_netto'];
+								
+							}
+							else
+							{
+							
+								if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+								{
+								
+									$arBasket['produkte'][$k]['preis'] = $arBasket['produkte'][$k]['preis_netto'];
+									
+								}
+								else
+								{
+									
+									$arBasket['produkte'][$k]['preis'] = $arBasket['produkte'][$k]['preis_brutto'];
+									
+								}
+								
+							}
+							
+						}
+						
+					}
+					
+					return $arBasket;
+					
+				}
+				
+			}
+
+			// MwSt. Im Frontend nicht anzeigen, weil z.B. UstIDnr angegeben wurde
+			if (wpsg_isSizedInt($this->arCheckout['shipping_land'])) $land = $this->shop->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->arCheckout['shipping_land'])."'");				
+			else if (wpsg_isSizedInt($this->arCheckout['land'])) $land = $this->shop->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->arCheckout['land'])."'");
+			else $land = 0;
 
 			$arReturn = array();
-			
-			if (wpsg_isSizedInt($_SESSION['wpsg']['order_id'])) $arReturn['oOrder'] = wpsg_order::getInstance($_SESSION['wpsg']['order_id']);
-			
-			$noMwSt = false;
-
-			if (isset($this->arCheckout['land'])) {
-			
-				$land = $this->shop->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->arCheckout['land'])."'");
-
-				$noMwSt = false;
-
-				if (wpsg_isSizedArray($land)) {
-
-					if ($land['mwst'] == '1' || $this->shop->get_option('wpsg_kleinunternehmer') == '1') $noMwSt = true;
-					else if ($land['mwst'] == '2' && wpsg_isSizedString($this->arCheckout['ustidnr'])) $noMwSt = true;
-
-				}
-
-			}
+						
+			$arReturn['land'] = $land;
+			
+			if (wpsg_isSizedInt($this->arCheckout['shipping_land']))
+			{
+				
+				$arReturn['shipping_land'] = $this->shop->db->fetchRow("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->arCheckout['shipping_land'])."'");
+				
+			}
+			
+			if ($land['mwst'] == '1' || $this->shop->get_option('wpsg_kleinunternehmer') == '1') $noMwSt = true;
+			else if ($land['mwst'] == '2' && $this->arCheckout['ustidnr'] != '') $noMwSt = true;
+			else $noMwSt = false;
 			
 			$arReturn['noMwSt'] = $noMwSt;
@@ -1406,37 +1301,27 @@
 				'preis_gesamt_netto' => 0,
 				'preis_payment' => 0,
-				'preis_shipping' => 0,
-				'preis_shipping_netto' => 0,
-				'preis_shipping_brutto' => 0,
-				'preis_rabatt' => 0
+				'preis_shipping' => 0
 			);
-			
-			// Hier sammel ich die Produktpreise
-			$arProductPrice = array(
-				WPSG_NETTO => array(),
-				WPSG_BRUTTO => array()
-			);
-
-			foreach ($this->arProdukte as $product_index => &$b) {
-				
+								
+			foreach ($this->arProdukte as $product_index => &$b)
+			{
+								
 				$produkt_id = $this->shop->getProduktID($b['id']);
-
-                wpsg_addSet($arReturn['menge'], $b['menge']);
+				
+				wpsg_addSet($arReturn['menge'], $b['menge']);
 
 				$country = $this->shop->getDefaultCountry();
 				
-				if (is_numeric($produkt_id)) {
-					
+				if (is_numeric($produkt_id))
+				{
+										
 					// Preis wird berechnet daher entfernen
 					unset($b['preis']);
 					unset($b['preis_netto']);
 					unset($b['preis_brutto']);
-					unset($b['mwst_key']); // Key muss auch gelÃ¶scht werden, damit die loadProduktArray den Preis korrekt ermittelt (Sonst funktioniert es beim 2. Mal nicht)
 					
 					// in $b sind eventuell auch Moduldaten drin (Produktvariablen)
-					$this->shop->country = wpsg_getInt($land['id'], 0);
-					$b = $this->shop->loadProduktArray($produkt_id, $b, true);
-					//$this->shop->country = 0;
-
+					$b = $this->shop->loadProduktArray($produkt_id, $b);
+					
 					if (wpsg_isSizedInt($b['euleistungsortregel']))
 					{
@@ -1447,37 +1332,18 @@
 					}
 					
-					if ($backend === true)
-					{
-						$country = wpsg_country::getInstance($this->arCheckout['land']);
-					}
-					
 					$b['productkey'] = $b['id'];
-					
-				}
-
+  
+				}
+				
 				$this->shop->callMods('basket_toArray', array(&$b, $backend, $noMwSt));
+		 				 
 				$this->checkMwSt($b['mwst_key'], $country, $arReturn);
-
-				if ($noMwSt) {
-					
-					// Damit erreiche ich, dass 0% angezeigt wird, wenn keine MwSt. berechnet wird
-					$this->arProdukte[$product_index]['mwst_key'] = false;
-					
-					$price_product_netto = $b['preis_netto'];
-					$price_product_brutto = $b['preis_netto'];
-					
-				} else {
-					
-					$price_product_netto = $b['preis_netto'];
-					$price_product_brutto = $b['preis_brutto'];
-					
-				}
-
+								
 				// Hier wird entschieden ob der gerundete oder der genaue Wert zum Gesamtpreis hinzuaddiert wird
-				if ($this->shop->addRoundedValues === true)
-				{
-					
-					$b['preis_netto'] = round($price_product_netto, 2);
-					$b['preis_brutto'] = round($price_product_brutto, 2);
+				if ($this->shop->addRoundedValues === true) 
+				{
+					
+					$price_sum_brutto = round($b['preis_brutto'], 2);
+					$price_sum_netto = round($b['preis_netto'], 2);
 					
 				}
@@ -1485,17 +1351,85 @@
 				{
 					
-					$b['preis_netto'] = $price_product_netto;
-					$b['preis_brutto'] = $price_product_brutto;
-					
-				}
-
-				$price_sum_netto = $b['preis_netto'] * $b['menge'];
-				$price_sum_brutto = $b['preis_brutto'] * $b['menge'];
-				
-				if ($this->shop->getFrontendTaxView() == WPSG_NETTO) $b['preis'] = round($b['preis_netto'], 2);
-				else $b['preis'] = round($b['preis_brutto'], 2);
-				
-				$arProductPrice[WPSG_NETTO][$b['mwst_key'].'_'.$country->id][] = $price_sum_netto;
-				$arProductPrice[WPSG_BRUTTO][$b['mwst_key'].'_'.$country->id][] = $price_sum_brutto;
+					$price_sum_brutto = $b['preis_brutto'];
+					$price_sum_netto = $b['preis_netto'];
+					
+				}
+				
+				if ($noMwSt) $b['mwst_value'] = 0;
+				else $b['mwst_value'] = $arReturn['mwst'][$b['mwst_key'].'_'.$country->id]['value'];
+				
+				if (!$noMwSt) wpsg_addSet($arReturn['sum']['mwst'], (($price_sum_brutto - $price_sum_netto) * $b['menge']));
+				else $arReturn['sum']['mwst'] = 0;
+				
+				if ($noMwSt)
+				{
+				
+					$arReturn['sum']['preis_brutto'] += $price_sum_netto * $b['menge'];
+					$arReturn['sum']['preis_gesamt_brutto'] += $price_sum_netto * $b['menge'];
+										
+				}
+				else
+				{
+									
+					$arReturn['sum']['preis_brutto'] += $price_sum_brutto * $b['menge'];
+					$arReturn['sum']['preis_gesamt_brutto'] += $price_sum_brutto * $b['menge'];
+					
+				}
+									
+				$arReturn['sum']['preis_netto'] += $price_sum_netto * $b['menge'];
+				$arReturn['sum']['preis_gesamt_netto'] += $price_sum_netto * $b['menge'];
+				
+				// Preis Spalte auswÃ€hlen
+				if ($backend)
+				{
+					
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $noMwSt)
+					{
+						
+						$b['preis'] = $price_sum_netto;
+						$arReturn['sum']['preis'] += $price_sum_netto * $b['menge'];
+						$arReturn['sum']['preis_gesamt'] += $price_sum_netto * $b['menge'];
+						 
+					}
+					else 
+					{
+						
+						$b['preis'] = $price_sum_brutto;
+						$arReturn['sum']['preis'] += $price_sum_brutto * $b['menge'];
+						$arReturn['sum']['preis_gesamt'] += $price_sum_brutto * $b['menge'];
+						
+					}
+					
+				}
+				else
+				{
+					
+					if ($this->shop->getFrontendTaxview() == WPSG_NETTO || $noMwSt)
+					{ 
+						
+						$b['preis'] = $price_sum_netto;
+						wpsg_addSet($arReturn['sum']['preis'], ($price_sum_netto * $b['menge']));
+						wpsg_addSet($arReturn['sum']['preis_gesamt'], ($price_sum_netto * $b['menge']));
+						
+					}
+					else 
+					{
+						
+						$b['preis'] = $price_sum_brutto;
+						wpsg_addSet($arReturn['sum']['preis'], ($price_sum_brutto * $b['menge']));						
+						wpsg_addSet($arReturn['sum']['preis_gesamt'], ($price_sum_brutto * $b['menge']));
+						
+					}
+					
+				}
+				
+				// Steueranteil
+				if (!$noMwSt)
+				{
+					
+					wpsg_addSet($arReturn['mwst'][$b['mwst_key'].'_'.$country->id]['sum'], (($price_sum_brutto - $price_sum_netto) * $b['menge']));
+					wpsg_addSet($arReturn['mwst'][$b['mwst_key'].'_'.$country->id]['base_value'], ($price_sum_brutto * $b['menge']));
+					
+				}
 
 				$b['product_index'] = $product_index;
@@ -1503,158 +1437,55 @@
 				
 			} // foreach Produkte
-
-			// Die Basis der Preisberechnung, wenn Brutto, dann wird Netto berechnet
-			if ($this->shop->getFrontendTaxview() == WPSG_NETTO) {
-				
-				$base = WPSG_NETTO;
-				$calc = WPSG_BRUTTO;
-				
-			} else {
-				
-				$base = WPSG_BRUTTO;
-				$calc = WPSG_NETTO;
-				
-			}
-			
-			// Jetzt die jeweilige Steuer berechnen, damit die Anzeige stimmt
-			foreach ($arProductPrice[$base] as $tax_key_lang => $tax) {
-				
-				$arTaxKey = explode('_', $tax_key_lang);
-				$country_id = $arTaxKey[1];
-				$country_id = $this->arCheckout['land'];
-				$country = wpsg_country::getInstance($country_id);
-				$tax_key = $arTaxKey[0];
-				
-				if ($noMwSt === true) $tax_value = 0; else $tax_value = $country->getTax($tax_key);
-				
-				$sum_tax_value = round(wpsg_calculateSteuer(array_sum($tax), $base, $tax_value), 2);
-				
-				wpsg_addSet($arReturn['sum']['mwst'], $sum_tax_value);
-				
-				if ($calc === WPSG_NETTO)
-				{
-					
-					$sum_netto = round(wpsg_calculatePreis(array_sum($tax), WPSG_NETTO, $tax_value), 2);
-					$sum_brutto = array_sum($tax);
-					
-				}
-				else
-				{
-					
-					$sum_netto = array_sum($tax);
-					$sum_brutto = round(wpsg_calculatePreis(array_sum($tax), WPSG_BRUTTO, $tax_value), 2);
-					
-					// Rundungsfehler abfangen
-					if (abs($price_sum_brutto - $sum_brutto) < 0.02) $sum_brutto = $price_sum_brutto;
-					
-				}
-				
-				wpsg_addSet($arReturn['sum']['preis_netto'], $sum_netto);
-				wpsg_addSet($arReturn['sum']['preis_gesamt_netto'], $sum_netto);
-				wpsg_addSet($arReturn['sum']['preis_brutto'], $sum_brutto);
-				wpsg_addSet($arReturn['sum']['preis_gesamt_brutto'], $sum_brutto);
-				
-				if (!$noMwSt)
-				{
-					/*
-					if ((isset($this->arOrder['price_frontend'])) && ($this->arOrder['price_frontend'] == WPSG_BRUTTO))
-					{
-						wpsg_addSet($arReturn['mwst'][$tax_key_lang]['sum'], $sum_tax_value);
-						wpsg_addSet($arReturn['mwst'][$tax_key_lang]['base_value'], $sum_brutto);
-
-					}
-					else if ((isset($this->arOrder['price_frontend'])) && ($this->arOrder['price_frontend'] == WPSG_NETTO))
-					{
-						wpsg_addSet($arReturn['mwst'][$tax_key_lang]['sum'], $sum_tax_value);
-						wpsg_addSet($arReturn['mwst'][$tax_key_lang]['base_value'], $sum_netto);
-
-					}
-					else */
-					{
-						wpsg_addSet($arReturn['mwst'][$tax_key_lang]['sum'], $sum_tax_value);
-						wpsg_addSet($arReturn['mwst'][$tax_key_lang]['base_value'], $sum_brutto);
-						
-					}
-					
-				}
-				
-			}
-			
-			if ($base === WPSG_NETTO) {
-				
-				wpsg_addSet($arReturn['sum']['preis'], $arReturn['sum']['preis_netto']);
-				wpsg_addSet($arReturn['sum']['preis_gesamt'], $arReturn['sum']['preis_gesamt_netto']);
-				
-			} else {
-				
-				wpsg_addSet($arReturn['sum']['preis'], $arReturn['sum']['preis_brutto']);
-				wpsg_addSet($arReturn['sum']['preis_gesamt'], $arReturn['sum']['preis_gesamt_brutto']);
-				
-			}
-			
-			if ($backend) {
-
-				$arReturn['backend'] = $backend;
-				$arReturn['price_frontend'] = @$this->arOrder['price_frontend'];
-				$arReturn['order_rabatt'] = @$this->arOrder['price_rabatt'];
-				$arReturn['gs_value'] = @$this->arOrder['price_gs'];
-				
-			}
 			
 			// Gutschein einberechnen
-			//$this->shop->callMod('wpsg_mod_gutschein', 'basket_toArray_gs', array(&$this, &$arReturn));
-			
+			$this->shop->callMod('wpsg_mod_gutschein', 'basket_toArray_gs', array(&$this, &$arReturn));
+
 			// Staffelrabatt
-			$this->shop->callMod('wpsg_mod_discount', 'basket_toArray_discount', array(&$this, &$arReturn));
+			$this->shop->callMod('wpsg_mod_discount', 'basket_toArray_discount', arraY(&$this, &$arReturn));
 			
 			// Kundendaten einfÃŒgen
 			$arReturn['checkout'] = $this->arCheckout;
-						
+
 			$this->shop->callMods('basket_toArray_preshippayment', array(&$this, &$arReturn));
 			
-			// Die Versandkosten fÃŒr den Warenkorb berechnen
+			// Die Versandkosten fÃŒr den Warenkorb berechnen berechnen
 			// Dies darf im checkout2 nicht passieren, oder wenn der Parameter auf true
-			//			if (false && $this->o_id > 0)
-			if ($this->o_id > 0) {
-				
+			if ($this->o_id > 0)
+			{
+
 				$order_data = $this->shop->cache->loadOrder($this->o_id);
 				$price_shipping = $order_data['price_shipping'];
 				$price_payment = $order_data['price_payment'];
-				$arReturn['sum']['preis_payment_brutto'] = $order_data['price_payment_brutto'];
-				$arReturn['sum']['preis_payment_netto'] = $order_data['price_payment_netto'];
-				$arReturn['sum']['preis_shipping_brutto'] = $order_data['price_shipping_brutto'];
-				$arReturn['sum']['preis_shipping_netto'] = $order_data['price_shipping_netto'];
-				
-				/*
 
 				if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
 				{
-
+				
 					$arReturn['sum']['preis_payment_brutto'] = $price_payment;
 					$arReturn['sum']['preis_payment_netto'] = wpsg_calculatePreis($price_payment, WPSG_NETTO, $order_data['mwst_payment']);
-
+				
 					$arReturn['sum']['preis_shipping_brutto'] = $price_shipping;
 					$arReturn['sum']['preis_shipping_netto'] = wpsg_calculatePreis($price_shipping, WPSG_NETTO, $order_data['mwst_shipping']);
-
+					
 				}
 				else
 				{
-
+					
 					$arReturn['sum']['preis_payment_netto'] = $price_payment;
 					$arReturn['sum']['preis_payment_brutto'] = wpsg_calculatePreis($price_payment, WPSG_BRUTTO, $order_data['mwst_payment']);
-
+					
 					$arReturn['sum']['preis_shipping_netto'] = $price_shipping;
 					$arReturn['sum']['preis_shipping_brutto'] = wpsg_calculatePreis($price_shipping, WPSG_BRUTTO, $order_data['mwst_shipping']);
-
-				}
-				*/
-
-			} else {
+					
+				}
+				
+			}
+			else
+			{
 				
 				// Bin mir nicht sicher warum die Versandkosten/Zahlungskosten im Checkout nicht berechnet wurde
-				// Aufgrund von PayPal (PayPal Plus) brauch ich sie aber
+				// Aufgrund von PayPal (PayPal Plus) brauch ich sie aber 
 				//if (!isset($_REQUEST['wpsg_checkout2']) && !$clearVK)
 				{
-					
+				
 					if ($backend) $arReturn['backend'] = true;
 					else $arReturn['backend'] = false;
@@ -1667,7 +1498,7 @@
 						 * Ist fÃŒr die Auswahl der LÃ€nder, Zahlungsarten und Versandarten im Warenkorb nÃ¶tig geworden
 						 */
-						if (wpsg_isSizedInt($arReturn['checkout']['shipping']) && !@array_key_exists($arReturn['checkout']['shipping'], $this->shop->arShipping))
+						if (wpsg_isSizedInt($arReturn['checkout']['shipping']) && !array_key_exists($arReturn['checkout']['shipping'], $this->shop->arShipping)) 
 						{
-						
+							
 							unset($arReturn['checkout']['shipping']);
 							
@@ -1680,15 +1511,15 @@
 							
 						}
-						
+												
 					}
 					
 					// Versandarten kÃ¶nnen gruppiert sein, vorher trennen
-					if (wpsg_isSizedString($arReturn['checkout']['shipping']) && preg_match('/(.*)\-(.*)/', $arReturn['checkout']['shipping']))
+					if (preg_match('/(.*)\-(.*)/', $arReturn['checkout']['shipping']))
 					{
 						
 						$arShipping = explode('-', $arReturn['checkout']['shipping']);
-						
+
 						// Ich simuliere hier die Berechnung in einem Extra Array, da die Funktion leider so gebaut ist
-						// Sonst ist die Grundlage fÃŒr die Berechnung nicht gleich
+						// Sonst ist die Grundlage fÃŒr die Berechnung nicht die Selbe
 						$arBasketPreShipping = $arReturn;
 						
@@ -1704,8 +1535,8 @@
 							wpsg_addSet($arReturn['sum']['preis_shipping_netto'], $basket_calc['sum']['preis_shipping_netto']);
 							
-							wpsg_addSet($arReturn['shipping']['mwst'], wpsg_getStr($basket_calc['shipping']['mwst']));
-							wpsg_addSet($arReturn['shipping']['preis_shipping_netto'], wpsg_getStr($basket_calc['shipping']['preis_shipping_netto']));
-							wpsg_addSet($arReturn['shipping']['preis_shipping_brutto'], wpsg_getStr($basket_calc['shipping']['preis_shipping_brutto']));
-							
+							wpsg_addSet($arReturn['shipping']['mwst'], $basket_calc['shipping']['mwst']);
+							wpsg_addSet($arReturn['shipping']['preis_shipping_netto'], $basket_calc['shipping']['preis_shipping_netto']);
+							wpsg_addSet($arReturn['shipping']['preis_shipping_brutto'], $basket_calc['shipping']['preis_shipping_brutto']);
+ 
 							foreach ($basket_calc['mwst'] as $tax_key => $mwst)
 							{
@@ -1715,5 +1546,5 @@
 								if (!array_key_exists($tax_key, $arBasketPreShipping['mwst']))
 								{
-									
+								
 									// Satz war vorher noch nicht drin
 									$arReturn['mwst'][$tax_key]['sum'] += $mwst['sum'];
@@ -1724,5 +1555,5 @@
 								{
 									
-									$arReturn['mwst'][$tax_key]['sum'] += ($mwst['sum'] - $arBasketPreShipping['mwst'][$tax_key]['sum']);
+									$arReturn['mwst'][$tax_key]['sum'] += ($mwst['sum'] - $arBasketPreShipping['mwst'][$tax_key]['sum']); 
 									$arReturn['mwst'][$tax_key]['base_value'] += ($mwst['base_value'] - $arBasketPreShipping['mwst'][$tax_key]['base_value']);
 									
@@ -1737,5 +1568,5 @@
 						
 						//wpsg_debug($arReturn);die();
-						
+						 
 						// In den Produktdaten sind die fÃŒr das Produkt zulÃ€ssigen Versandarten gespeichert, hier entferne ich noch die die in dieser Bestellung nicht gewÃ€hlt wurden
 						foreach ($arReturn['produkte'] as &$p)
@@ -1771,198 +1602,91 @@
 						
 					}
-					
-				}
-				
-			}
+										
+					$this->shop->callMods('calcPayment', array(&$arReturn));
+										
+				}
+				
+			}
+			
+			// Zahlungskosten der Summe hinzurechnen
+			if (isset($arReturn['sum']['preis_payment_netto'])) $arReturn['sum']['preis_gesamt_netto'] += $arReturn['sum']['preis_payment_netto'];
+			if (isset($arReturn['sum']['preis_payment_brutto'])) $arReturn['sum']['preis_gesamt_brutto'] += $arReturn['sum']['preis_payment_brutto'];
+
+			// Versandkosten der Summe hinzurechnen
+			if (isset($arReturn['sum']['preis_shipping_netto'])) $arReturn['sum']['preis_gesamt_netto'] += $arReturn['sum']['preis_shipping_netto'];
+			if (isset($arReturn['sum']['preis_shipping_brutto'])) $arReturn['sum']['preis_gesamt_brutto'] += $arReturn['sum']['preis_shipping_brutto'];
+			
+			if ($backend)
+			{
+				
+				// Preisangaben fÃŒrs Backend
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+				{
+					
+					$arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_shipping_netto'];
+					$arReturn['sum']['preis_shipping'] = $arReturn['sum']['preis_shipping_netto'];
+					
+					$arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_payment_netto'];
+					$arReturn['sum']['preis_payment'] = $arReturn['sum']['preis_payment_netto'];
+					
+				}
+				else
+				{
+					
+					$arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_shipping_brutto'];
+					$arReturn['sum']['preis_shipping'] = $arReturn['sum']['preis_shipping_brutto'];
+					
+					$arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_payment_brutto'];
+					$arReturn['sum']['preis_payment'] = $arReturn['sum']['preis_payment_brutto'];
+					
+				}
+				
+			}
+			else 
+			{
+				
+				// Preisangaben fÃŒrs Frontend 
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					if (isset($arReturn['sum']['preis_shipping_brutto'])) $arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_shipping_netto'];
+					if (isset($arReturn['sum']['preis_payment_brutto'])) $arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_payment_netto'];
+					
+					if (isset($arReturn['sum']['preis_shipping_brutto'])) $arReturn['sum']['preis_shipping'] = $arReturn['sum']['preis_shipping_netto'];
+					if (isset($arReturn['sum']['preis_payment_brutto'])) $arReturn['sum']['preis_payment'] = $arReturn['sum']['preis_payment_netto'];
+					
+				}
+				else
+				{
+					
+					if (isset($arReturn['sum']['preis_shipping_brutto'])) $arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_shipping_brutto'];
+					if (isset($arReturn['sum']['preis_payment_brutto'])) $arReturn['sum']['preis_gesamt'] += $arReturn['sum']['preis_payment_brutto'];
+					
+					if (isset($arReturn['sum']['preis_shipping_brutto'])) $arReturn['sum']['preis_shipping'] = $arReturn['sum']['preis_shipping_brutto'];
+					if (isset($arReturn['sum']['preis_payment_brutto'])) $arReturn['sum']['preis_payment'] = $arReturn['sum']['preis_payment_brutto'];
+					 
+				}
+				
+			}
+			
+			// Leere MwSt. SÃ€tze entfernen
+			foreach ((array)$arReturn['mwst'] as $k => $v)
+			{
+				if ($v['sum'] <= 0) unset($arReturn['mwst'][$k]);
+			}
+			 			
+			// Negative Bestellungen Verhindern 
+			if (isset($arReturn['sum']['preis_netto']) && $arReturn['sum']['preis_netto'] < 0) $arReturn['sum']['preis_netto'] = 0;
+			if (isset($arReturn['sum']['preis_brutto']) && $arReturn['sum']['preis_brutto'] < 0) $arReturn['sum']['preis_brutto'] = 0;
+			if (isset($arReturn['sum']['preis']) && $arReturn['sum']['preis'] < 0) $arReturn['sum']['preis'] = 0;
+			if (isset($arReturn['sum']['preis_gesamt_netto']) && $arReturn['sum']['preis_gesamt_netto'] < 0) $arReturn['sum']['preis_gesamt_netto'] = 0;
+			if (isset($arReturn['sum']['preis_gesamt_brutto']) && $arReturn['sum']['preis_gesamt_brutto'] < 0) $arReturn['sum']['preis_gesamt_brutto'] = 0;
+			if (isset($arReturn['sum']['preis_gesamt']) && $arReturn['sum']['preis_gesamt'] < 0) $arReturn['sum']['preis_gesamt'] = 0; 
 			
 			$this->shop->callMods('basket_toArray_final', array(&$this, &$arReturn));
-		 
-			// LÃ€nderdetails laden
-			if (wpsg_isSizedInt($arReturn['checkout']['land'])) {
-				
-				$oCountry = wpsg_country::getInstance($arReturn['checkout']['land']);
-				
-				$arReturn['land'] = [
-					'name' => $oCountry->getName(),
-					'shorttext' => $oCountry->getShorttext()
-				];
-				
-			}
-			
-			if (wpsg_isSizedInt($arReturn['checkout']['shipping_land'])) {
-				
-				$oCountry = wpsg_country::getInstance($arReturn['checkout']['shipping_land']);
-				
-				$arReturn['shipping_land'] = [
-					'name' => $oCountry->getName(),
-					'shorttext' => $oCountry->getShorttext()
-				];
-				
-			}
-
-			if (true || $this->oCalculation === null) {
-
-				$this->oCalculation = new \wpsg\wpsg_calculation();
-
-				if (!$this->loadFromSession) {
-
-					$this->oCalculation->fromDB($this->o_id);
-
-				} else {
-
-					$this->oCalculation = \wpsg\wpsg_calculation::getSessionCalculation(); // ->fromSession();
-
-				}
-
-			}
-			
-			$arCalculation = $this->oCalculation->getCalculationArray();
-			
-			unset($p); // Wichtig, da oben mit der Referenzt &$p gearbeitet wurde
-			
-			foreach ($arCalculation['product'] as $product_index => $p) {
-				
-				$product_index = $p['product_index'];
-				
-				$arReturn['produkte'][$product_index]['preis'] = (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$p['netto_single']:$p['brutto_single']);
-				$arReturn['produkte'][$product_index]['preis_netto'] = $p['netto_single'];
-				$arReturn['produkte'][$product_index]['preis_brutto'] = $p['brutto_single'];
-				
-				if ($p['tax'] == '0') $arReturn['produkte'][$product_index]['mwst_value'] = 0;
-				else $arReturn['produkte'][$product_index]['mwst_value'] =  $arCalculation['tax'][$p['tax_key']]['tax_value'];
-				
-			}
-			
-			$arReturn['gs'] = null;
-			$arReturn['sum'] = [
-				'preis' => (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['sum']['productsum_netto']:$arCalculation['sum']['productsum_brutto']),
-				'preis_netto' => $arCalculation['sum']['productsum_netto'],
-				'preis_brutto' => $arCalculation['sum']['productsum_brutto'],
-				'preis_gesamt_brutto' => $arCalculation['sum']['brutto'],
-				'preis_gesamt_netto' => $arCalculation['sum']['netto'],
-				'preis_payment' => (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['sum']['payment_netto']:$arCalculation['sum']['payment_brutto']),
-				'preis_shipping' => (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['sum']['shipping_netto']:$arCalculation['sum']['shipping_brutto']),
-				'preis_shipping_netto' => $arCalculation['sum']['shipping_netto'],
-				'preis_shipping_brutto' => $arCalculation['sum']['shipping_brutto'],
-				'preis_rabatt' => -1 * (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['sum']['discount_netto']:$arCalculation['sum']['discount_brutto']),
-				'mwst' => $arCalculation['sum']['tax'],
-				'preis_gesamt' => (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['sum']['netto']:$arCalculation['sum']['brutto']),
-				'preis_rabatt_netto' => -1 * $arCalculation['sum']['discount_netto'],
-				'preis_rabatt_brutto' => -1 * $arCalculation['sum']['discount_brutto']
-			];
-			
-			if (isset($arCalculation['sum']['voucher_netto'])) {
-				
-				$arReturn['sum']['gs'] = -1 * (($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['sum']['voucher_netto']:$arCalculation['sum']['voucher_brutto']);
-				
-			}
-			
-			$arReturn['shipping']['mwst'] = wpsg_getStr($arCalculation['shipping'][0]['tax']);
-			$arReturn['shipping']['preis_shipping_netto'] = wpsg_getStr($arCalculation['shipping'][0]['netto']);
-			$arReturn['shipping']['preis_shipping_brutto'] = wpsg_getStr($arCalculation['shipping'][0]['brutto']);
-			
-			if (@isset($arCalculation['tax'][$arCalculation['shipping'][0]['tax_key']]['tax_value'])) $arReturn['shipping']['tax_value'] = $arCalculation['tax'][$arCalculation['shipping'][0]['tax_key']]['tax_value'];
-			else $arReturn['shipping']['tax_value'] = 0;
-			 
-			$arReturn['mwst'] = [];
-			
-			foreach ($arCalculation['tax'] as $tax_key => $tax) {
-				
-				if (wpsg_isSizedDouble($tax['sum'])) {
-					 
-					// Anteilig muss ich nicht anzeigen, da dieser Teil schon in den SÃ€tzen enthalten ist
-					if ($tax_key == '0') continue;
-						 
-					$arTaxKey = explode('_', $tax_key);
-						
-					$country_id = $arTaxKey[1];
-					$tax_key_clear = $arTaxKey[0];
-															
-					$arReturn['mwst'][$tax_key] = [
-						'country' => $country_id,
-						'tax_key' => $tax_key_clear,
-						'sum' => $tax['sum'],
-						'name' => $this->oCalculation->getTaxLabelArray(true)[$tax_key],
-						'value' => $tax['tax_value'],
-						'base_value' => $tax['brutto']
-					];
-					
-				}
-				
-			}
-			
-			/*if (wpsg_isSizedArray($arCalculation['voucher'][0])) {
-				
-				$arReturn['gs_value'] = abs(($this->shop->getFrontendTaxview() === WPSG_NETTO)?$arCalculation['voucher'][0]['netto']:$arCalculation['voucher'][0]['brutto']);
-				$arReturn['gs']['code'] = $arCalculation['voucher'][0]['code'];
-				$arReturn['gs']['gs_value'] = $arReturn['gs_value'];
-								
-			}*/
-			
-			// Alte Templates greifen auf den Shipping Array zu, deshalb dort auch korrigieren
-			//$this->shop->arShipping[$arCalculation['shipping'][0]['shipping_key']]['']			
-			//$this->shop->arShipping[$arCalculation['shipping'][0]['shipping_key']]['mwst_value'] = $arCalculation['tax'][$arCalculation['shipping'][0]['tax_key']]['tax_value'];
-			 
-			$arReturn['arCalculation'] = $arCalculation;
 			
 			return $arReturn;
 			
 		} // public function toArray()
-		
-		/**
-		 * Verteilt den Wert $value auf die MwSt SÃ€tze in $arBasket
-		 * $value wird Netto ÃŒbergeben
-		 */
-		public function addMwSt(&$arBasket, $value)
-		{
-			
-			if (wpsg_tf($value) <= 0) return 0;
-			
-			$price_option = $this->shop->get_option('wpsg_preisangaben');
-			
-			// Anteilig auf die SÃ€tze verteilen
-			foreach ((array)$arBasket['mwst'] as $mw_id => $mw)
-			{
-				
-				if ($mw['base_value'] > 0)
-				{
-					if (($price_option == WPSG_BRUTTO))
-					{
-						$proz = $mw['base_value'] / $arBasket['sum']['preis_brutto'];
-						
-						$arBasket['mwst'][$mw_id]['base_value'] += $proz * $value;
-						$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_BRUTTO, $mw['value']);
-						
-					}
-					else
-					{
-						$proz = $mw['base_value'] / $arBasket['sum']['preis_netto'];
-						
-						$arBasket['mwst'][$mw_id]['base_value'] -= wpsg_calculatePreis($proz * $value, WPSG_NETTO, $mw['value']);
-						//$arBasket['mwst'][$mw_id]['base_value'] += $proz * $value;
-						$arBasket['mwst'][$mw_id]['sum'] = wpsg_calculateSteuer($arBasket['mwst'][$mw_id]['base_value'], WPSG_NETTO, $mw['value']);
-						
-					}
-					
-				}
-				
-			}
-			
-			// Mehrwertsteuer Summe korrigieren
-			$sum_mwst = 0;
-			foreach ($arBasket['mwst'] as $mw_id => $mw)
-			{
-				
-				$sum_mwst += $arBasket['mwst'][$mw_id]['sum'];
-				
-			}
-			
-			$sub = $arBasket['sum']['mwst'];
-			
-			$arBasket['sum']['mwst'] = abs($sum_mwst);
-			
-			return $sub - $arBasket['sum']['mwst'];
-			
-		} // public function addMwSt(&$arBasket, $value)
 		
 		/**
@@ -1989,5 +1713,5 @@
 			
 			return $nAmount;
-			
+						
 		} // public function getBasketAmount($product_key)
 		
@@ -2011,5 +1735,5 @@
 			
 		} // public function getProductIDs()
-		
+				
 		/**
 		 * Verteilt den Wert $value auf die Steuerarten in $arReturn
@@ -2018,9 +1742,9 @@
 		{
 			
-			if ($arReturn['noMwSt'] == true)
+			if ($arReturn['noMwSt'] == true) 
 			{
 				
 				$arReturn['sum']['preis_brutto'] -= $value;
-				$arReturn['sum']['preis_gesamt_brutto'] -= $value;
+				$arReturn['sum']['preis_gesamt_brutto'] -= $value;				
 				$arReturn['sum']['preis_netto'] -= $value;
 				$arReturn['sum']['preis_gesamt_netto'] -= $value;
@@ -2047,10 +1771,10 @@
 			{
 				
-				$proz = ($v['base_value'] - $v['sum']) * 100 / $netto_gesamt; // Anteil
+				$proz = ($v['base_value'] - $v['sum']) * 100 / $netto_gesamt; // Anteil 
 				$value_anteilig = $value / 100 * $proz; // Der Teil, der mit der Steuer besteuert werden soll 70% mit 19%, 30% mit 7% usw.
 				
-				if ($brut_nett == WPSG_BRUTTO)
-				{
-					
+				if ($brut_nett == WPSG_BRUTTO) 
+				{
+					 
 					$mwst_anteilig = wpsg_calculateSteuer($value_anteilig, WPSG_BRUTTO, $v['value']); // Der anteilige Steuerwert
 					
@@ -2058,5 +1782,5 @@
 					$arReturn['sum']['mwst'] -= $mwst_anteilig;
 					$arReturn['sum']['preis_brutto'] -= $mwst_anteilig;
-					$arReturn['sum']['preis_gesamt_brutto'] -= $mwst_anteilig;
+					$arReturn['sum']['preis_gesamt_brutto'] -= $mwst_anteilig;				
 					$arReturn['sum']['preis_netto'] -= $value_anteilig;
 					$arReturn['sum']['preis_gesamt_netto'] -= $value_anteilig;
@@ -2073,5 +1797,5 @@
 					$arReturn['sum']['mwst'] -= $mwst_anteilig;
 					$arReturn['sum']['preis_brutto'] -= $mwst_anteilig;
-					$arReturn['sum']['preis_gesamt_brutto'] -= $mwst_anteilig;
+					$arReturn['sum']['preis_gesamt_brutto'] -= $mwst_anteilig;				
 					$arReturn['sum']['preis_netto'] -= $value_anteilig;
 					$arReturn['sum']['preis_gesamt_netto'] -= $value_anteilig;
@@ -2081,8 +1805,8 @@
 				}
 				
-			}
+			} 
 			
 		} // public function distributeMwSt($value, &$arReturn)
-		
+
 		/**
 		 * Hilfsfunktion
@@ -2091,8 +1815,8 @@
 		public function checkMwSt($tax_key, $country, &$arReturn)
 		{
-			
+		
 			if ($tax_key != null && !array_key_exists($tax_key.'_'.$country->id, (array)$arReturn['mwst']))
 			{
-				
+		
 				if (is_object($country)) $tax_value = $country->getTax($tax_key);
 				else $tax_value = 0;
@@ -2106,11 +1830,12 @@
 					'sum' => '0',
 					'name' => $name,
-					'value' => $tax_value
-				);
-				
-			}
-			
+					'value' => $tax_value		
+				); 
+		
+			}
+				
 		} // private function checkMwSt($mwst_id, $country, &$arReturn)
 		
 	} // class wpsg_basket
 
+?>
Index: /lib/wpsg_basket_widget.class.php
===================================================================
--- /lib/wpsg_basket_widget.class.php	(revision 8528)
+++ /lib/wpsg_basket_widget.class.php	(revision 5261)
@@ -5,9 +5,11 @@
 	 * @author daniel
 	 */
-	class wpsg_basket_widget extends WP_Widget {
+	class wpsg_basket_widget extends WP_Widget
+	{
 		
 		var $id = "wpsg_basket_widget";
 		
-		function __construct() {
+		function wpsg_basket_widget()
+		{
 					 
 	    	parent::__construct('wpsg_basket_widget', 'wpShopGermany Warenkorb Widget', array(
@@ -23,5 +25,5 @@
 	  		$GLOBALS['wpsg_sc']->basket->initFromSession();
 	  		$GLOBALS['wpsg_sc']->view['basket'] = $GLOBALS['wpsg_sc']->basket->toArray();
-
+	  		 		
 	  		if (is_array($GLOBALS['wpsg_sc']->view['basket']) && sizeof($GLOBALS['wpsg_sc']->view['basket']['produkte']) > 0)
 	  		{
@@ -34,18 +36,13 @@
 	  		
 	  		$GLOBALS['wpsg_sc']->view['wpsg_versandhinweis'] = $settings['wpsg_versandhinweis'];
-
-            $GLOBALS['wpsg_sc']->view['widget_args'] = $args;
-		    $GLOBALS['wpsg_sc']->view['widget_settings'] = $settings;
-
+	  		$GLOBALS['wpsg_sc']->view['wpsg_widgetsettings'] = $settings;	  		
+	  		
 	  		$GLOBALS['wpsg_sc']->render(WPSG_PATH_VIEW.'/warenkorb/index.phtml');
-		  
-			$GLOBALS['wpsg_sc']->basket->reset();
-		  
-		} // function widget($args, $settings)
+	  	 	
+	  	} // function widget($args, $settings)
 		
 	  	function form($instance) 
 	  	{ 
- 			
-	  		if (isset($instance['wpsg_requestpage'])) { $wpsg_requestpage = $instance['wpsg_requestpage']; } else { $wpsg_requestpage = 0; }
+ 	
  			if (isset($instance['wpsg_agbpage'])) { $wpsg_agbpage = $instance['wpsg_agbpage']; } else { $wpsg_agbpage = 0; }
  			if (isset($instance['wpsg_wrpage'])) { $wpsg_wrpage = $instance['wpsg_wrpage']; } else { $wpsg_wrpage = 0; }
@@ -60,14 +57,11 @@
 	  		<span style="font-weight:bold;"><?php echo __("Seiten unterhalb des Widgets", "wpsg"); ?>:</span><br />
 	  		
-	  		<?php // if ($this->hasMod('wpsg_mod_request') == '1') { ?>
-	  			<label><input type="checkbox" value="1" <?php echo (($wpsg_requestpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_requestpage'); ?>" id="<?php echo $this->get_field_id('wpsg_requestpage'); ?>" />&nbsp;<?php echo __('Anfrageliste', 'wpsg'); ?><br /></label>	  		
-	  		<?php // } ?>
+	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_agbpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_agbpage'); ?>" id="<?php echo $this->get_field_id('wpsg_agbpage'); ?>" />&nbsp;<?php echo __('AGB', 'wpsg'); ?><br /></label>	  		
+	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_wrpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_wrpage'); ?>" id="<?php echo $this->get_field_id('wpsg_wrpage'); ?>" />&nbsp;<?php echo __('Widerrufsbelehrung', 'wpsg'); ?><br /></label>
+	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_dspage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_dspage'); ?>" id="<?php echo $this->get_field_id('wpsg_dspage'); ?>" />&nbsp;<?php echo __('Datenschutzrichtlinien', 'wpsg'); ?><br /></label>
+	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_vkpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_vkpage'); ?>" id="<?php echo $this->get_field_id('wpsg_vkpage'); ?>" />&nbsp;<?php echo __('Versandkosten', 'wpsg'); ?><br /></label>
+	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_odrpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_odrpage'); ?>" id="<?php echo $this->get_field_id('wpsg_odrpage'); ?>" />&nbsp;<?php echo __('Online Streitbeilegung', 'wpsg'); ?><br /></label>
+	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_imppage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_imppage'); ?>" id="<?php echo $this->get_field_id('wpsg_imppage'); ?>" />&nbsp;<?php echo __('Impressum', 'wpsg'); ?><br /></label>
 	  		
-	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_agbpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_agbpage'); ?>" id="<?php echo $this->get_field_id('wpsg_agbpage'); ?>" />&nbsp;<?php echo __('AGB', 'wpsg'); ?><br /></label>	  	
-	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_dspage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_dspage'); ?>" id="<?php echo $this->get_field_id('wpsg_dspage'); ?>" />&nbsp;<?php echo __('Datenschutzrichtlinien', 'wpsg'); ?><br /></label>
-	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_imppage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_imppage'); ?>" id="<?php echo $this->get_field_id('wpsg_imppage'); ?>" />&nbsp;<?php echo __('Impressum', 'wpsg'); ?><br /></label>
-	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_odrpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_odrpage'); ?>" id="<?php echo $this->get_field_id('wpsg_odrpage'); ?>" />&nbsp;<?php echo __('Online Streitbeilegung', 'wpsg'); ?><br /></label>
-	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_vkpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_vkpage'); ?>" id="<?php echo $this->get_field_id('wpsg_vkpage'); ?>" />&nbsp;<?php echo __('Versandkosten', 'wpsg'); ?><br /></label>	  			  			
-	  		<label><input type="checkbox" value="1" <?php echo (($wpsg_wrpage == '1')?'checked="checked"':''); ?> name="<?php echo $this->get_field_name('wpsg_wrpage'); ?>" id="<?php echo $this->get_field_id('wpsg_wrpage'); ?>" />&nbsp;<?php echo __('Widerrufsbelehrung', 'wpsg'); ?><br /></label>
 	  		<br /> 
 	  		<span style="font-weight:bold;"><?php echo __("Versandhinweis", "wpsg"); ?>:</span><br />
@@ -84,5 +78,4 @@
 			$instance = array();
 			
-			$instance['wpsg_requestpage'] = $new_instance['wpsg_requestpage'];
 			$instance['wpsg_agbpage'] = $new_instance['wpsg_agbpage'];
 			$instance['wpsg_wrpage'] = $new_instance['wpsg_wrpage'];
Index: /lib/wpsg_cache.class.php
===================================================================
--- /lib/wpsg_cache.class.php	(revision 8528)
+++ /lib/wpsg_cache.class.php	(revision 5261)
@@ -18,5 +18,4 @@
 		var $_arMwSt; // Array mit den MwSt. SÃ€tzen
 		var $_BasketArray; // Array mit dem Warenkorb der aktuellen Session als Array
-		var $_arCountry; // Array mit den DatensÃ€tzen aus der LÃ€ndertabelle
 		
 		var $_arMwStDB;
@@ -37,50 +36,24 @@
 			$this->_BasketArray = false;
 			$this->_arOrderObjects = array();
-			$this->_arCountry = [];
 			
 		} // public function __construct()
-		
-		/**
-		 * Gibt einen LÃ€nderdatensatz aus der Datenbank zurÃŒck
-		 * Wenn als $country_id 0 ÃŒbergeben wird, werden alle LÃ€nder zurÃŒckgegeben
-		 * @param int $country_id
-		 */
-		public function getCountry($country_id = 0) {
-			
-			if (!array_key_exists($country_id, $this->_arCountry)) {
-				
-				if ($country_id === 0) {
-				
-					$this->_arCountry[$country_id] = $this->_db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ", "id");
-						
-				} else {
+				
+		/**
+		 * LÃ€dt die reinen Bestelldaten aus der Datenbank und gibt sie zurÃŒck
+		 */
+		public function loadOrder($order_id)
+		{
+			
+			if (!array_key_exists($order_id, $this->_arOrder))
+			{
 					
-					$this->_arCountry[$country_id] = $this->_db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($country_id)."' ", "id");
-					
-				}
-								
-			}
-			
-			return $this->_arCountry[$country_id];
-			
-		}
-		
-		/**
-		 * LÃ€dt die reinen Bestelldaten aus der Datenbank und gibt sie zurÃŒck
-		 */
-		public function loadOrder($order_id, $noCache = false) {
-			
-			if (!array_key_exists($order_id, $this->_arOrder) || $noCache === true) {
-					
-				$db_order = $this->_db->fetchRow("
+				$this->_arOrder[$order_id] = $this->_db->fetchRow("
 					SELECT
-						*
+						O.*
 					FROM
-						`".WPSG_TBL_ORDER."` 
+						`".WPSG_TBL_ORDER."` AS O
 					WHERE
-						`id` = '".wpsg_q($order_id)."'
-				"); 
-				
-				$this->_arOrder[$order_id] = $db_order;
+						O.`id` = '".wpsg_q($order_id)."'
+				");
 				
 			}
@@ -150,28 +123,23 @@
 			
 		} // public function clearKundenCache($kunde_id = false)
- 
+		
 		/**
 		 * LÃ€dt die reinen Produktdaten aus der Datenbank und gibt sie zurÃŒck
 		 * Besser loadProduktArray aus Shop verwenden da dies Ãbersetzung etc. berÃŒcksichtigt
 		 */
-		public function loadProduct($product_id) {
-			
-			if (!array_key_exists($product_id, $this->_arProducts)) {
+		public function loadProduct($product_id)
+		{
+			
+			if (!array_key_exists($product_id, $this->_arProducts))
+			{
 					
 				$this->_arProducts[$product_id] = $this->_db->fetchRow("
 					SELECT
-						*
+						P.*
 					FROM
-						`".WPSG_TBL_PRODUCTS."` 
+						`".WPSG_TBL_PRODUCTS."` AS P
 					WHERE
-						`id` = '".wpsg_q($product_id)."'
+						P.`id` = '".wpsg_q($product_id)."'
 				");
-
-				if (wpsg_getInt($this->_arProducts[$product_id]['id']) !== intval($product_id)) throw new \wpsg\Exception(wpsg_translate(
-				    __('Produkt #1# konnte nicht geladen werden', 'wpsg'),
-                    $product_id
-                ));
-
-				$this->_arProducts[$product_id]['product_key'] = $product_id;
 				
 			}
@@ -192,10 +160,10 @@
 			{
 			
-				$this->_arProductObjects[$product_id] =	new wpsg_product();
-				$this->_arProductObjects[$product_id]->load($product_id);
+				$this->_arOrderObjects[$product_id] =	new wpsg_product();
+				$this->_arOrderObjects[$product_id]->load($product_id);
 							
 			}
 				
-			return $this->_arProductObjects[$product_id];
+			return $this->_arOrderObjects[$product_id];
 			
 		} // public function loadProductObject($product_id)
@@ -229,19 +197,17 @@
 		 * LÃ€dt die reinen Kundendaten aus der Datenbank und gibt sie zurÃŒck
 		 */
-		public function loadKunden($kunde_id, $noCache = false) 
-		{
-
-			if (!array_key_exists($kunde_id, $this->_arKunden) || $noCache === true)
+		public function loadKunden($kunde_id) 
+		{
+
+			if (!array_key_exists($kunde_id, $this->_arKunden))
 			{
 					
 				$this->_arKunden[$kunde_id] = $this->_db->fetchRow("
 					SELECT
-						C.*,
-						CA.`title`, CA.`name`, CA.`vname`, CA.`firma`, CA.`fax`, CA.`strasse`, CA.`nr`, CA.`plz`, CA.`ort`, CA.`land`, CA.`tel` 
+						K.*
 					FROM
-						`".WPSG_TBL_KU."` AS C
-						 	LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = C.`adress_id`) 
+						`".WPSG_TBL_KU."` AS K
 					WHERE
-						C.`id` = '".wpsg_q($kunde_id)."'
+						K.`id` = '".wpsg_q($kunde_id)."'
 				");
 				
Index: b/wpsg_calculation.class.php
===================================================================
--- /lib/wpsg_calculation.class.php	(revision 8528)
+++ 	(revision )
@@ -1,1937 +1,0 @@
-<?php
-
-    namespace wpsg;
-
-    /**
-     * Neue Klasse zur Berechnung des Warenkorbes
-     * Soll die alte basket Klasse ersetzen
-     * 
-     */
-    class wpsg_calculation {
-
-        /**
-         * @var wpsg_db
-         */
-        private $db = null;
-
-	    /**
-	     * Wenn aus einer Bestellung generiert, dann ist hier die BestellID drin
-	     * @var ?int null 
-	     */
-        private $order_id = null;
-		
-		/** @var bool Wenn die Berechnung von einer Bestellung gemacht wird dÃŒrfen bestimmte Bedingungen nicht mehr geprÃŒft werden z.B. Gutschein GÃŒltigkeit */
-		public $order_finish = false;
-        
-        /**
-         * @var \wpsg_ShopController
-         */
-        private $shop = null;
-
-        /** @var array */
-        private $arCountry = null;
-        
-        /** @var array */
-        private $arCalculation = null;
-        
-        /** @var array  */
-    	private $arCalculationRow = null;
-            
-		/** @var bool Ist bei alten rekonstriuerten Berechnungen true */
-    	public $restored = false;
-    			
-    	private $dWeight = 0;
-    	
-    	private $tax_mode = '2';
-	
-    	public static $functionscache = [];
-    	
-		const TAXMODE_SMALLBUSINESS = '1';
-    	const TAXMODE_B2C = '2';
-    	const TAXMODE_B2B = '3';
-	
-		/**
-		 * wpsg_calculation constructor.
-		 */
-        public function __construct() {
-
-            $this->db = &$GLOBALS['wpsg_db'];
-            $this->shop = &$GLOBALS['wpsg_sc'];
-                        
-            $this->arCalculationRow = [];
-            $this->arCountry = [];
-            
-        }        
-        
-        public function setTaxMode($tax_mode) {
-        	
-        	$this->tax_mode = $tax_mode;
-	
-			$this->arCalculation = null;
-        	
-		}
-        
-		public function getTaxMode() {
-        	
-        	return $this->tax_mode; 
-        	
-		}
-		
-		public function getCountry(): array {
-			
-			return $this->arCountry;
-			
-		}
-		
-        /** 
-         * Setzt das Standardland fÃŒr die Steuerberechnung wenn im $tax_key kein Land definiert ist 
-         */
-        public function addCountry($country_id, $tax_mode, $tax_a, $tax_b, $tax_c, $tax_d, $default = true) {
-            
-        	if (!wpsg_isSizedInt($country_id)) $country_id = $this->shop->getDefaultCountry(true);
-        	
-        	if (array_key_exists($country_id, $this->arCountry)) return; 
-        	
-            $this->arCountry[$country_id] = [
-            	'id' => $country_id,
-            	'tax_mode' => $tax_mode,
-				'default' => $default,
-            	'a_'.$country_id => $tax_a,
-				'b_'.$country_id => $tax_b,
-				'c_'.$country_id => $tax_c,
-				'd_'.$country_id => $tax_d,
-			];
-	
-			$this->arCalculation = null;
-            
-        }
-        
-        public function getTargetCountry() {
-	
-			if (sizeof($this->arCountry) === 1) return array_values($this->arCountry)[0];
-        	
-			foreach ($this->arCountry as $country_id => $c) {
-		
-				if ($c['default'] !== true) return $c;
-		
-			}
-	
-			throw new \Exception(__('Kein Rechnungsland fÃŒr die Berechnung gesetzt.', 'wpsg'));
-        	
-		}
-        
-        public function getTargetCountryID() {
-        	
-        	if (sizeof($this->arCountry) === 1) return array_keys($this->arCountry)[0];
-        	
-			foreach ($this->arCountry as $country_id => $c) {
-		
-				if ($c['default'] !== true) return $country_id;
-		
-			}
-			
-			throw new \Exception(__('Kein Rechnungsland fÃŒr die Berechnung gesetzt.', 'wpsg'));
-        	
-		}
-        
-		public function getDefaultCountry() {
-			
-			foreach ($this->arCountry as $country_id => $c) {
-				
-				if ($c['default'] === true) return $c;
-				
-			}
-			
-			throw new \Exception(__('Kein Standardland fÃŒr die Berechnung gesetzt.', 'wpsg'));
-        	
-		}
-		
-        public function getDefaultCountryID() {
-        	
-        	foreach ($this->arCountry as $country_id => $c) {
-        		
-        		if ($c['default'] === true) return $country_id;
-        		
-			}
-        	
-			throw new \Exception(__('Kein Standardland fÃŒr die Berechnung gesetzt.', 'wpsg'));
-			
-		}
-        
-        public function removeVoucher($order_voucher_id) {
-        	
-        	foreach ($this->arCalculationRow as $k => $cr) {
-        		
-        		if (isset($cr['data']['order_voucher_id']) && $cr['data']['order_voucher_id'] == $order_voucher_id) {
-        			
-        			unset($this->arCalculationRow[$k]);
-        			
-				}
-        		
-			}
-	
-			$this->arCalculation = null;
-        	
-		}
-	
-		/**
-		 * @param $set
-		 * @param $bruttonetto
-		 * @param $tax_key
-		 * @param int $amount
-		 * @param bool $code
-		 * @param bool $id
-		 * @param int $order_voucher_id
-		 */
-		public function addVoucher($set, $bruttonetto, $tax_key, $amount = 1, $code = false, $id = false, $order_voucher_id = 0) {
-			
-			$tax_key = $this->normalizeTaxKey($tax_key);
-			
-			if (strpos($set, '-') === false) $set = '-'.$set;
-			
-			$this->arCalculationRow['voucher_'.$id.'-'.$order_voucher_id] = [
-				'type' => 'voucher',
-				'amount' => $amount,
-				'set' => $set,
-				'tax_key' => $tax_key,
-				'bruttonetto' => $bruttonetto,
-				'data' => [
-					'code' => $code,
-					'id' => $id,
-					'order_voucher_id' => $order_voucher_id
-				]
-			];
-			
-			$this->arCalculation = null;
-			
-		}
-		
-		public function getVoucher() {
-			
-			$arVoucher = [];
-			
-			foreach ($this->arCalculationRow as $cr_key => $cr) { 
-
-				// wenn Gutschein
-				if ($cr['type'] === 'voucher') {
-
-					// true wenn Gutschein in %
-					// if ( strpos($cr['set'], '%')  !== false ) wpsg_debug('Proz. Gutschein');
-					// else 
-					
-					$arVoucher[] = $cr; // Inahlt else diese zeile
-
-				}
-
-			}
-			
-			if (sizeof($arVoucher) > 0) return $arVoucher; else return null;
-			 
-		}
-		
-		public function addCoupon($set, $bruttonetto, $tax_key, $amount = 1, $code = false, $id = false, $order_voucher_id = 0) {
- 
-			$tax_key = $this->normalizeTaxKey($tax_key);
-			
-			if (strpos($set, '-') === false) $set = '-'.$set;
-			
-			$this->arCalculationRow['coupon_'.$id.'-'.$order_voucher_id] = [
-				'type' => 'coupon',
-				'amount' => $amount,
-				'set' => $set,
-				'tax_key' => $tax_key,
-				'bruttonetto' => $bruttonetto,				
-				'data' => [
-					'code' => $code,
-					'id' => $id,
-					'order_voucher_id' => $order_voucher_id
-				]
-			];
-			
-			$this->arCalculation = null;
-			
-		}
-		
-		public function getCoupon() {
-			
-			$arCoupon = [];
-			
-			foreach ($this->arCalculationRow as $cr_key => $cr) { 
-				
-				if ($cr['type'] === 'coupon') {
-
-					$arCoupon[] = $cr;
-					
-				}
-
-			}
-			
-			if (sizeof($arCoupon) > 0) return $arCoupon; else return null;
-			
-		}
-        
-        public function removeDiscount() {
-	
-			foreach ($this->arCalculationRow as $k => $cr) {
-		
-				if ($cr['type'] === 'discount') {
-			
-					unset($this->arCalculationRow[$k]);
-			
-				}
-		
-			}
-	
-			$this->arCalculation = null;
-            
-        }
-        
-        public function addDiscount($set, $bruttonetto, $tax_key, $amount = 1) {
-	 
-			$tax_key = $this->normalizeTaxKey($tax_key);
-	
-			if (strpos($set, '-') === false) $set = '-'.$set;
-			
-			$this->arCalculationRow['discount'] = [
-				'type' => 'discount',
-				'amount' => $amount,
-				'set' => $set,
-				'tax_key' => $tax_key,
-				'bruttonetto' => $bruttonetto,
-				'data' => [ ]
-			];
-	
-			$this->arCalculation = null;
-	                    
-        }
-		
-		public function getDiscount() {
-			
-			if (!isset($this->arCalculationRow['discount'])) return null;
-			
-			return $this->arCalculationRow['discount'];
-						
-		}
-		
-        public function addProduct($set, $bruttonetto, $tax_key, $amount, $product_key, $product_index = false, $order_product_id = false, $eu = false, $ses_data = false) {
-	
-			// wpsg_debug($set.": ".$bruttonetto.":".$tax_key.":".$amount);
-			
-			$targetCountry = false; 
-			
-			if ($eu === true) {
-				 
-				/*
-				if ($this->getTaxMode() === self::TAXMODE_B2B && $this->arCountry[$this->getTargetCountryID()]['tax_mode'] == '2') {
-					
-					$tax_key = 'e';
-					
-				} else if ($this->arCountry[$this->getTargetCountryID()]['tax_mode'] == '1') {
-					
-					$tax_key = 'e';
-					
-				} else {
-					
-					$country_id = $this->getTargetCountryID();
-					
-					$tax_key = $this->normalizeTaxKey($tax_key, $country_id);
-					
-				}
-				*/
-				
-				if ($this->getTaxMode() === self::TAXMODE_B2C) {
-					
-					$targetCountry = true;
-					$country_id = $this->getTargetCountryID(); 					
-					
-				} else {
-					
-					$country_id = $this->getDefaultCountryID();
-										
-				}
-				
-				$tax_key = $this->normalizeTaxKey($tax_key, $country_id);
-				 
-			} else {
-				
-				$tax_key = $this->normalizeTaxKey($tax_key, $this->getDefaultCountryID());
-				
-			} 
-			
-            if ($product_index === false) $product_index = $this->getMaxProductIndex() + 1;
-            
-            if (wpsg_isSizedInt($order_product_id)) {
-            
-            	foreach ($this->arCalculationRow as $k => $item) {
-            	
-            		if ($item['type'] === 'product' && $item['data']['order_product_id'] == $order_product_id) unset($this->arCalculationRow[$k]);
-            	
-				}
-				
-			}
-            
-            $p = [
-            	'type' => 'product',
-				'amount' => $amount,
-				'set' => $set,
-				'tax_key' => $tax_key,
-				'bruttonetto' => $bruttonetto,
-				'data' => [
-					'product_id' => $this->shop->getProduktID($product_key),
-					'product_key' => $product_key,
-					'product_index' => $product_index,
-					'order_product_id' => $order_product_id,
-					'eu' => $eu,
-					'targetCountry' => $targetCountry,
-					'is_downloadproduct' => $this->shop->callMod('wpsg_mod_downloadplus', 'isPDFProdukt', [$product_key]) || $this->shop->callMod('wpsg_mod_downloadprodukte', 'isDownloadProduct', [$product_key])
-				]
-			];
-	
-			$this->shop->callMods('calculation_addProduct',[&$p, $ses_data]);
-	
-			$this->arCalculationRow[] = $p;
-	 
-			$this->arCalculation = null;
-            
-        }
-        
-        public function removeProduct($order_product_id) {
-            
-            foreach ($this->arCalculationRow as $k => $cr) {
-                
-                if ($cr['type'] === 'product' && $cr['data']['order_product_id'] == $order_product_id) unset($this->arCalculationRow[$k]);
-                
-            }
-            
-			$this->arCalculation = null;            
-            
-        }
-        
-        /**
-         * Setzt die Versandkosten
-         */
-        public function addShipping($set, $bruttonetto, $tax_key, $shipping_key) {
- 
-            $tax_key = $this->normalizeTaxKey($tax_key);
-                                
-            $this->arCalculationRow['shipping'] = [
-            	'type' => 'shipping',
-				'amount' => 1,
-            	'set' => $set,
-				'bruttonetto' => $bruttonetto,
-                'tax_key' => $tax_key,
-				'data' => [
-					'shipping_key' => $shipping_key
-				]
-            ];
-
-			$this->arCalculation = null;
-			
-        }
-				
-        /**
-         * Setzt die Zahlungskosten
-         */
-        public function addPayment($set, $bruttonetto, $tax_key, $payment_key) {
-
-			$tax_key = $this->normalizeTaxKey($tax_key);
- 
-			$this->arCalculationRow['payment'] = [
-				'type' => 'payment',
-				'amount' => 1,
-				'set' => $set,
-				'bruttonetto' => $bruttonetto,
-				'tax_key' => $tax_key,
-				'data' => [
-					'payment_key' => $payment_key
-				]
-			];
-
-			$this->arCalculation = null;
-            
-        }
-
-        public function getCalculationArray($force_rebuild = false) {
-
-            if ($this->arCountry === null) throw new \Exception(__('Warenkorb kann nicht ohne ein gesetztes Land berechnet werden.', 'wpsg'));
-
-            if ($force_rebuild === true || is_null($this->arCalculation)) {
-
-            	//$GLOBALS['t'] = ($GLOBALS['t']??0) + 1;
-            	//if ($GLOBALS['t'] === 2) {debug_print_backtrace();die();}
-
-            	$this->arCalculation = [
-            		'sum' => [
-            			'product_netto' => 0,
-						'product_brutto' => 0,
-						'product_tax' => 0,
-						'productsum_netto' => 0,
-						'productsum_brutto' => 0,
-						'payment_netto' => 0,
-						'payment_brutto' => 0,
-						'shipping_netto' => 0,
-						'shipping_brutto' => 0,
-						'discount_netto' => 0,
-						'discount_brutto' => 0,
-						'netto' => 0,
-						'brutto' => 0,
-						'tax' => 0,
-						'amount' => 0
-					],
-					'tax' => [],
-					'product' => [],
-					'voucher' => [],
-					'coupon' => [],
-                    'payment' => [
-                        0 => [
-                            'name' => __('Kostenlos', 'wpsg'),
-                            'id' => '0'
-                        ]
-                    ]
-            	];
-            	
-            	$arTypeOrder = ['product', 'discount', 'voucher', 'shipping', 'payment'];
-            	            	
-            	uasort($this->arCalculationRow, function($a, $b) use ($arTypeOrder) {
-            		
-            		return strcmp(array_search($a['type'], $arTypeOrder),array_search($b['type'], $arTypeOrder));
-            		
-				});
-
-            	if (isset($this->arCalculationRow['payment']) && sizeof($this->arCalculationRow['payment']) > 0) {
-
-            		$this->arCalculation['payment'] = [];
-
-	            }
-
-                foreach ($this->arCalculationRow as $k_cr => $cr) {
-					
-                	if ($cr['type'] === 'coupon') continue;
-                	  
-                	$this->addTax($cr['tax_key']);
-                	$this->calculateTaxProportionally($cr['bruttonetto']);
-							
-                	if (!is_array($cr['set'])) $cr['set'] = [$cr['set']];
-                						
-                	$brutto = 0;
-                	$netto = 0;
-
-					$country_id = $this->getTargetCountry()['id'];
-					
-                	foreach ($cr['set'] as $set) {
-		
-						$set_brutto = 0;
-						$set_brutto = 0;
-                								
-						if (strpos($set, '|') !== false) {
- 
-							$kosten = $this->calculateCostKey($set);
-
-							if ($this->shop->getBackendTaxview() === WPSG_NETTO) {
-								
-								list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_NETTO, $kosten, $cr['tax_key']);
-								
-							} else {
-								
-								list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_BRUTTO, $kosten, $cr['tax_key']);
-								
-							}
-							
-						} else if (strpos($set, '%') !== false) {
-
-							if ($cr['type'] === 'voucher') {
- 
-								// Ein Gutschein kann nur fÃŒr bestimmte Produktgruppen/Produkte gelten, das prÃŒfe ich hier und ziehe Produktpreise ab, wenn nicht zulÃ€ssig
-								// Ist partial === true, wurde der Gutschein nicht auf alle Produkte angewendet
-
-								$oVoucher = \wpsg_voucher::getInstance($cr['data']['id']);
-
-								$netto_scope = $this->arCalculation['sum']['netto'];
-								$brutto_scope = $this->arCalculation['sum']['brutto'];
- 
-								$cr['data']['partial'] = false;
-
-								foreach ($this->arCalculationRow as $cr2) {
-
-									if ($cr2['type'] === 'product') {
-
-										if ($oVoucher->isUsabel($cr2['data']['product_id']) === false && $this->order_finish === false) {
- 
-											list($set_netto, $set_brutto) = $this->calculateTaxPart($cr2['bruttonetto'], $cr2['set'], $cr2['tax_key']);
- 
-											$netto_scope -= $set_netto;
-											$brutto_scope -= $set_brutto;
-
-											$cr['data']['partial'] = true;
-
-										}
-
-									}
-
-								}
-
-							} else {
-
-								$netto_scope = $this->arCalculation['sum']['netto'];
-								$brutto_scope = $this->arCalculation['sum']['brutto'];
-
-							}
- 
-							// Prozentualer Wert
-							$set_netto = $netto_scope / 100 * wpsg_tf($set);
-							$set_brutto = $brutto_scope / 100 * wpsg_tf($set);
-
-							// wpsg_debug($set_netto); // DEBUG
-							// wpsg_debug($set_brutto); // DEBUG
-
-							if ($this->shop->getBackendTaxview() === WPSG_NETTO) {
-								
-								list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_NETTO, $set_netto, $cr['tax_key']);
-								
-							} else {
-								
-								list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_BRUTTO, $set_brutto, $cr['tax_key']);
-								
-							}
-
-							// die('cut_calc'); // DEBUG
-							
-						} else {
-							 
-							if (preg_match('/^(.+)\-(.*)$/', $set)) {
-								
-								list($typ, $set) = explode('-', $set);
-														
-							}
-							
-							// Netto / Brutto berechnen
-							if ($cr['bruttonetto'] === WPSG_NETTO) {
-																
-								$set_netto = wpsg_tf($set);
-								
-								// Kleiner 0 prÃŒfen
-								//if (($netto + $set_netto) < 0) $set_netto = -1 * $brutto;
-								
-								list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_NETTO, $set_netto, $cr['tax_key']);
-													
-							} else {
-													
-								if (wpsg_isTrue($cr['data']['targetCountry'])) {
-								
-									$tax_key_part = preg_replace('/\_(.*)/', '', $cr['tax_key']);
-									
-									$tax_default = $this->arCountry[$this->getDefaultCountryID()][$tax_key_part.'_'.$this->getDefaultCountryID()];
-									$tax_target = $this->arCountry[$this->getTargetCountryID()][$tax_key_part.'_'.$this->getTargetCountryID()];
-									
-									$set_brutto = wpsg_calculatePreis(
-										wpsg_calculatePreis(wpsg_tf($set), WPSG_NETTO, $tax_default),
-										WPSG_BRUTTO,
-										$tax_target
-									);
-									
-								} else {
-									
-									$set_brutto = wpsg_tf($set);
-									
-								}
-								 								
-								//wpsg_Debug($brutto.":".$set_brutto);
-								// Kleiner 0 prÃŒfen
-								if (($this->arCalculation['sum']['brutto'] + $set_brutto) < 0) $set_brutto = -1 * $this->arCalculation['sum']['brutto'];
-																
-								list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_BRUTTO, $set_brutto, $cr['tax_key']);
-								
-								$this->arCalculationRow[$k_cr]['set_netto'] = $set_netto;
-								$this->arCalculationRow[$k_cr]['set_brutto'] = $set_brutto;
-								
-								//wpsg_debug('2: '.$set_netto.":".$set_brutto);
-							}
-														 																									
-						}
-						
-						$netto += $set_netto;
-						$brutto += $set_brutto;
-														
-					}
-					
-					$cr['set'] = array_values($cr['set'])[0];
-						
-					$netto_calculated_single = $netto;
-					$brutto_calculated_single = $brutto;
-					
-					if ($this->arCountry[$country_id]['tax_mode'] == '1') {
-	
-						// Land ist auf "Keine Steuer" gestellt
-						$brutto = $netto; 
-					
-					} else {
-																	
-						if ($this->tax_mode === self::TAXMODE_SMALLBUSINESS) {
-						
-							// Kleinunternehmer								
-							$brutto = $netto; 
-							
-						} else if ($this->tax_mode === self::TAXMODE_B2B) {
-							
-							// Firmenkunde // keine MwSt. bei USt.IdNr. = 2
-							if ($this->arCountry[$this->getTargetCountryID()]['tax_mode'] == '2') {
-								
-								$brutto = $netto;
-								
-							}
-						
-						}
-						
-					}
-					
-					if ($this->shop->get_option('wpsg_noroundamount') === '1') {
-										
-                		// Standar, bis 19.11.2019 / 4.1.7
-						$netto_single = $netto;
-						$brutto_single = $brutto;
-					
-						$netto *= $cr['amount'];
-						$brutto *= $cr['amount'];
-						
-					} else {
-	
-						$netto_single = round($netto, 2);
-						$brutto_single = round($brutto, 2);
-					
-						$netto = $netto_single * $cr['amount'];
-						$brutto = $brutto_single * $cr['amount'];
-						
-					}
-
-					$this->arCalculation['tax'][$cr['tax_key']]['netto'] += $netto;
-					$this->arCalculation['tax'][$cr['tax_key']]['brutto'] += $brutto;
-					
-					$tax = $brutto - $netto;
-					
-					$this->arCalculation[$cr['type']][] = $cr['data'] + [
-						'type' => $cr['type'],
-						'netto' => $netto,
-						'brutto' => $brutto,
-						'netto_calculated_single' => $netto_calculated_single,
-						'brutto_calculated_single' => $brutto_calculated_single,
-						'netto_single' => $netto_single,
-						'brutto_single' => $brutto_single,
-						'tax' => $tax,
-						'amount' => $cr['amount'],
-						'tax_key' => $cr['tax_key'],
-						'bruttonetto' => $cr['bruttonetto'],
-						'set' => $cr['set']
-					];
-					
-					$this->arCalculationRow[$k_cr]['netto_calculated_single'] = $netto_calculated_single;
-					$this->arCalculationRow[$k_cr]['brutto_calculated_single'] = $brutto_calculated_single;
-					
-					wpsg_addSet($this->arCalculation['sum'][$cr['type'].'_netto'],$netto);
-					wpsg_addSet($this->arCalculation['sum'][$cr['type'].'_brutto'],$brutto);
-					
-					wpsg_addSet($this->arCalculation['sum'][$cr['type'].'_netto_calculated'],$netto_calculated_single * $cr['amount']);
-					wpsg_addSet($this->arCalculation['sum'][$cr['type'].'_brutto_calculated'],$brutto_calculated_single * $cr['amount']);
-					wpsg_addSet($this->arCalculation['sum'][$cr['type'].'_tax'],$tax);
-					
-					if ($this->arCalculation['sum']['netto'] + $netto < 0) {
-						
-						$netto = -1 * $this->arCalculation['sum']['netto'];
-						$brutto = -1 * $this->arCalculation['sum']['brutto'];
-						$tax = -1 * $this->arCalculation['sum']['tax'];
-						
-					}
-					
-					$this->arCalculation['sum']['netto'] += $netto;
-					$this->arCalculation['sum']['brutto'] += $brutto;
-					
-					$this->arCalculation['sum']['tax'] += $tax;
-						
-					if (in_array($cr['type'], ['product', 'voucher'])) {
-												
-						$this->arCalculation['sum']['productsum_netto'] += $netto;
-						$this->arCalculation['sum']['productsum_brutto'] += $brutto;
-						
-					}
-					
-					if ($cr['type'] === 'product') {
-						
-						$this->arCalculation['sum']['amount'] += $cr['amount'];
-						
-					}
-					
-                }
-				
-				$this->arCalculation['sum']['topay_netto'] = $this->arCalculation['sum']['netto'];
-				$this->arCalculation['sum']['topay_brutto'] = $this->arCalculation['sum']['brutto'];
-					
-				foreach ($this->arCalculationRow as $cr) {
-                	
-					$set = $cr['set'];
-					
-                	if ($cr['type'] === 'coupon') {
-
-                		// Der Wertgutschein kann nur fÃŒr bestimmte Produkte erlaubt sein
-		                // Ich ermittle daher das Brutto/Netto auf den der Gutschein angewendet werden kann
-		                $scope_brutto = 0;
-		                $scope_netto = 0;
-
-		                $cr['data']['partial'] = false;
-
-		                $oVoucher = \wpsg_voucher::getInstance($cr['data']['id']);
-
-		                foreach ($this->arCalculationRow as $cr2) {
-
-		                	if ($cr2['type'] === 'product') {
-
-		                		if ($oVoucher->isUsabel($cr2['data']['product_id'], false)) {
-
-		                			list($scope_set_netto, $scope_set_brutto) = $this->calculateTaxPart($cr2['bruttonetto'], $cr2['set'], $cr2['tax_key']);
-
-		                			$scope_netto -= $scope_set_netto * $cr2['amount'];
-		                			$scope_brutto -= $scope_set_brutto * $cr2['amount'];
-
-				                } else $cr['data']['partial'] = true;
-
-			                } else if (in_array($cr2['type'], ['shipping', 'payment'])) {
-		                		
-		                		$scope_netto -= $cr2['set_netto'];
-		                		$scope_brutto -= $cr2['set_brutto'];
-		                		
-			                }
-
-		                }
-		                
-						// Netto / Brutto berechnen
-						if ($cr['bruttonetto'] === WPSG_NETTO) {
-
-							$scope_netto = max($set_netto, $cr['set']);
-
-							$set_netto = $scope_netto;
-
-							list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_NETTO, $set_netto, $cr['tax_key']);
-
-						} else {
-
-							$scope_brutto = max($scope_brutto, $cr['set']);
-
-							if (wpsg_isTrue($cr['data']['targetCountry'])) {
-
-								$tax_key_part = preg_replace('/\_(.*)/', '', $cr['tax_key']);
-				
-								$tax_default = $this->arCountry[$this->getDefaultCountryID()][$tax_key_part.'_'.$this->getDefaultCountryID()];
-								$tax_target = $this->arCountry[$this->getTargetCountryID()][$tax_key_part.'_'.$this->getTargetCountryID()];
-
-								$set_brutto = wpsg_calculatePreis(
-									//wpsg_calculatePreis(wpsg_tf($set), WPSG_NETTO, $tax_default),
-									wpsg_calculatePreis(wpsg_tf($scope_brutto), WPSG_NETTO, $tax_default),
-									WPSG_BRUTTO,
-									$tax_target
-								);
-				
-							} else {
-
-								$set_brutto = $scope_brutto; //wpsg_tf($set);
-				
-							}
-
-							//if ($cr['set'] < abs($set_brutto)) $set_brutto = -1 * $cr['set'];
-							 
-							$set_brutto = wpsg_tf($set_brutto);
-							
-							if (($this->arCalculation['sum']['brutto'] + $set_brutto) < 0) $set_brutto = -1 * $this->arCalculation['sum']['brutto'];
-
-							list($set_netto, $set_brutto) = $this->calculateTaxPart(WPSG_BRUTTO, $set_brutto, $cr['tax_key'], true);
-
-							if ($this->arCalculation['sum']['topay_netto'] + $set_netto < 0) {
-								
-								$set_netto = $this->arCalculation['sum']['topay_netto'];
-								$this->arCalculation['sum']['topay_netto'] = 0;
-								
-							} else $this->arCalculation['sum']['topay_netto'] += $set_netto;
-
-							if ($this->arCalculation['sum']['topay_brutto'] + $set_brutto < 0) {
-
-								$set_brutto = $this->arCalculation['sum']['topay_brutto'];
-								$this->arCalculation['sum']['topay_brutto'] = 0;
-								
-							} else {
-
-								$this->arCalculation['sum']['topay_brutto'] += $set_brutto;
-
-							}
-
-						}
-		
-						$tax = $set_brutto - $set_netto;
-		
-						$this->arCalculation[$cr['type']][] = $cr['data'] + [
-							'type' => $cr['type'],
-							'netto' => $set_netto,
-							'brutto' => $set_brutto,
-							'netto_single' => $set_netto,
-							'brutto_single' => $set_brutto,
-							'tax' => $tax,
-							'amount' => 1,
-							'tax_key' => $cr['tax_key'],
-							'bruttonetto' => $cr['bruttonetto'],
-							'set' => $cr['set']
-						];
-						
-					}
-                	
-				}
-	 
-				foreach ($this->arCalculation['tax'] as $tax_key => $tax) {
-		
-					$this->arCalculation['tax'][$tax_key]['sum'] = $tax['brutto'] - $tax['netto'];
-		
-				}
-                 				
-				//die(wpsg_debug($this->arCalculation));
-                
-            }
-
-			//die(wpsg_debug($this->arCalculation));
-			
-            return $this->arCalculation;
-
-        }
-         
-        /**
-         * Speichert die Berechnung in eine Bestellung
-         * 
-         * @param bool $id
-         */
-        public function toDB($id = false, $db_data = [], $finish_order = false) {
-					
-			$id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($id)."' ");
-        	if (!wpsg_isSizedInt($id)) $id = false;
-        	
-            $arCalculation = $this->getCalculationArray();
-             
-            $db_data['price_gesamt_netto'] = wpsg_q($arCalculation['sum']['netto']);
-            $db_data['price_gesamt_brutto'] = wpsg_q($arCalculation['sum']['brutto']);
-	
-			$db_data['topay_netto'] = wpsg_q($arCalculation['sum']['topay_netto']);
-			$db_data['topay_brutto'] = wpsg_q($arCalculation['sum']['topay_brutto']);
-                        
-            if ($this->shop->getFrontendTaxview() === WPSG_NETTO) $display = 'netto';
-            else  $display = 'brutto';
-	
-			$db_data['price_gesamt'] = wpsg_q($arCalculation['sum'][$display]);
-			$db_data['topay'] = wpsg_q($arCalculation['sum']['topay_'.$display]);
-	
-			// Shipping leeren
-			$db_data['shipping_set'] = '';
-			$db_data['shipping_key'] = '';
-			$db_data['shipping_bruttonetto'] = '';
-			$db_data['shipping_tax_key'] = '';
-			$db_data['type_shipping'] = '';
-			$db_data['price_shipping'] = '';
-			$db_data['price_shipping_netto'] = '';
-			$db_data['price_shipping_brutto'] = '';
-			$db_data['mwst_shipping'] = '';
-	
-			// Payment leeren
-			$db_data['payment_set'] = '';
-			$db_data['payment_key'] = '';
-			$db_data['payment_bruttonetto'] = '';
-			$db_data['payment_tax_key'] = '';
-			$db_data['type_payment'] = '';
-			$db_data['price_payment'] = '';
-			$db_data['price_payment_netto'] = '';
-			$db_data['price_payment_brutto'] = '';
-			$db_data['mwst_payment'] = '';
-		
-			// Gutschein leeren
-			$db_data['voucher_tax_key'] = '';
-			$db_data['price_gs'] = '';
-			$db_data['price_gs_netto'] = '';
-			$db_data['price_gs_brutto'] = '';
-			$db_data['gs_set'] = '';
-			$db_data['gs_tax_key'] = '';
-			$db_data['voucher_bruttonetto'] = '';
-			$db_data['gs_id'] = '';
-			$db_data['gs_code'] = '';
-			
-			// Rabatt leeren
-			$db_data['discount_set'] = '';
-			$db_data['discount_bruttonetto'] = '';
-			$db_data['discount_tax_key'] = '';
-			$db_data['price_rabatt'] = '';
-			$db_data['price_rabatt_netto'] = '';
-			$db_data['price_rabatt_brutto'] = '';
-			
-			$db_data['calculation'] = '1';
-			$db_data['tax_mode'] = $this->getTaxMode();
-			
-            foreach ($this->arCalculationRow as $cr) {
-            	
-            	if ($cr['type'] === 'discount') {
-
-					$db_data['discount_set'] = wpsg_q($cr['set']);
-					$db_data['discount_bruttonetto'] = wpsg_q($cr['bruttonetto']);
-					$db_data['discount_tax_key'] = wpsg_q($this->clearTaxKey($cr['tax_key']));
-					$db_data['price_rabatt'] = wpsg_q($arCalculation['sum']['discount_'.$display]);
-					$db_data['price_rabatt_netto'] = wpsg_q($arCalculation['sum']['discount_netto']);
-					$db_data['price_rabatt_brutto'] = wpsg_q($arCalculation['sum']['discount_brutto']);
-					            		
-				} else if ($cr['type'] === 'shipping') {
-
-            	    if (is_array($cr['set'])) $shipping_set = implode('#', $cr['set']);
-            	    else $shipping_set = $cr['set'];
-					
-            		$db_data['shipping_set'] = wpsg_q($shipping_set);
-					$db_data['shipping_key'] = wpsg_q($cr['data']['shipping_key']);
-					$db_data['shipping_bruttonetto'] = wpsg_q($cr['bruttonetto']);
-					$db_data['shipping_tax_key'] = wpsg_q($this->clearTaxKey($cr['tax_key']));
-					$db_data['type_shipping'] = wpsg_q($cr['data']['shipping_key']);
-					$db_data['price_shipping'] = wpsg_q($arCalculation['sum']['shipping_'.$display.'_calculated']??$arCalculation['sum']['shipping_'.$display]);
-					$db_data['price_shipping_netto'] = wpsg_q($arCalculation['sum']['shipping_netto_calculated']??$arCalculation['sum']['shipping_netto']);
-					$db_data['price_shipping_brutto'] = wpsg_q($arCalculation['sum']['shipping_brutto_calculated']??$arCalculation['sum']['shipping_brutto']);
-					$db_data['mwst_shipping'] = wpsg_q($arCalculation['sum']['shipping_brutto'] - $arCalculation['sum']['shipping_netto']);
-            		
-				} else if ($cr['type'] === 'payment') {
-		
-					$db_data['payment_set'] = wpsg_q($cr['set']);
-					$db_data['payment_key'] = wpsg_q($cr['data']['payment_key']);
-					$db_data['payment_bruttonetto'] = wpsg_q($cr['bruttonetto']);
-					$db_data['payment_tax_key'] = wpsg_q($this->clearTaxKey($cr['tax_key']));
-					$db_data['type_payment'] = wpsg_q($cr['data']['payment_key']);
-					$db_data['price_payment'] = wpsg_q($arCalculation['sum']['payment_'.$display]);
-					$db_data['price_payment_netto'] = wpsg_q($arCalculation['sum']['payment_netto']);
-					$db_data['price_payment_brutto'] = wpsg_q($arCalculation['sum']['payment_brutto']);
-					$db_data['mwst_payment'] = wpsg_q($arCalculation['sum']['payment_brutto'] - $arCalculation['sum']['payment_netto']);
-		 					
-				}
-				             	
-			}
-                        
-			$db_data['be_bruttonetto'] = wpsg_q($this->shop->getBackendTaxview());
-            $db_data['fe_bruttonetto'] = wpsg_q($this->shop->getFrontendTaxview());
-	
-            $oDefaultCountry = $this->shop->getDefaultCountry();
-            
-			$db_data['shop_country_id'] = wpsg_q($oDefaultCountry->id);
-			$db_data['shop_country_tax'] = wpsg_q($oDefaultCountry->mwst);
-			$db_data['shop_country_tax_a'] = wpsg_q(wpsg_tf($oDefaultCountry->mwst_a));
-			$db_data['shop_country_tax_b'] = wpsg_q(wpsg_tf($oDefaultCountry->mwst_b));
-			$db_data['shop_country_tax_c'] = wpsg_q(wpsg_tf($oDefaultCountry->mwst_c));
-			$db_data['shop_country_tax_d'] = wpsg_q(wpsg_tf($oDefaultCountry->mwst_d));
-				
-			$oTargetCountry = \wpsg_country::getInstance($this->getTargetCountryID());
-			
-			$db_data['target_country_id'] = wpsg_q($oTargetCountry->id);
-			$db_data['target_country_tax'] = wpsg_q($oTargetCountry->mwst);
-			$db_data['target_country_tax_a'] = wpsg_q(wpsg_tf($oTargetCountry->mwst_a));
-			$db_data['target_country_tax_b'] = wpsg_q(wpsg_tf($oTargetCountry->mwst_b));
-			$db_data['target_country_tax_c'] = wpsg_q(wpsg_tf($oTargetCountry->mwst_c));
-			$db_data['target_country_tax_d'] = wpsg_q(wpsg_tf($oTargetCountry->mwst_d));
-			
-			// Die Hooks verwenden Daten aus $_SESSION, deshalb nur beim Speichern im Frontend
-			if (!is_admin()) {
-			
-				$this->shop->callMods('calculation_saveOrder', [&$this, $arCalculation, &$db_data, $finish_order]);
-				
-			}
-			
-			if ($finish_order) {
-				
-				$db_data['cdate'] = 'NOW()';
-				
-			}
-			
-            if (wpsg_isSizedInt($id)) {
-                
-                $this->db->UpdateQuery(WPSG_TBL_ORDER, $db_data, " `id` = '".wpsg_q($id)."' ");
-                
-            }  else {
-
-                $db_data['cdate'] = 'NOW()';
-
-                $id = $this->db->ImportQuery(WPSG_TBL_ORDER, $db_data);
-                
-                // TODO: Land zuweisen und speichern
-                
-            }
-	                         
-            $arOrderProductID = [-1];
-            
-			if ($this->shop->hasMod('wpsg_mod_gutschein')) {
-			
-				// Gutscheine speichern		 
-				$this->db->Query("DELETE FROM `".WPSG_TBL_ORDER_VOUCHER."` WHERE `order_id` = '".wpsg_q($id)."' ");
-				
-				foreach ($arCalculation['voucher'] as $v) {
-				
-					$this->db->ImportQuery(WPSG_TBL_ORDER_VOUCHER, [
-						'create_time' => "NOW()",
-						'order_id' => wpsg_q($id),
-						'voucher_id' => wpsg_q($v['id']),
-						'set_value' => wpsg_q($v['set']), 
-						'sum_netto' => wpsg_q($v['netto']),
-						'sum_brutto' => wpsg_q($v['brutto']),
-						'tax_key' => wpsg_q($v['tax_key']),
-						'bruttonetto' => wpsg_q($v['bruttonetto']),
-						'code' => wpsg_q($v['code']),
-						'coupon' => '0'
-					]);
-	
-				}
-				
-				foreach ($arCalculation['coupon'] as $c) {
-					
-					$this->db->ImportQuery(WPSG_TBL_ORDER_VOUCHER, [
-						'create_time' => "NOW()",
-						'order_id' => wpsg_q($id),
-						'voucher_id' => wpsg_q($c['id']),
-						'set_value' => wpsg_q($c['set']),
-						'sum_netto' => wpsg_q($c['netto']),
-						'sum_brutto' => wpsg_q($c['brutto']),
-						'tax_key' => wpsg_q($c['tax_key']),
-						'bruttonetto' => wpsg_q($c['bruttonetto']),
-						'code' => wpsg_q($c['code']),
-						'coupon' => '1'
-					]);
-					
-				}
-				
-			}
-						
-            // Produkte speichern
-			foreach ($arCalculation['product'] as $p) {
-                 
-				$db_data = [
-					'o_id' => wpsg_q($id),
-					'p_id' => wpsg_q($p['product_id']),										
-					'productkey' => wpsg_q($p['product_key']),
-					'product_index' => wpsg_q($p['product_index']),
-					'menge' => wpsg_q($p['amount']),
-					'price_netto' => wpsg_q($p['netto_calculated_single']??$p['netto_single']),
-					'price_brutto' => wpsg_q($p['brutto_calculated_single']??$p['brutto_single']),
-					'price' => wpsg_q($p[$display]),
-					'mwst_value' => wpsg_q($p['brutto_single'] - $p['netto_single']),
-					'mwst_key' => wpsg_q($p['tax_key']),
-					'product_set' => wpsg_q($p['set']),
-					'product_bruttonetto' => wpsg_q($p['bruttonetto']),
-					'euleistungsortregel' => wpsg_q($p['eu']),
-					//'mod_vp_varkey' => getmypid() // GehÃ¶rt Raus, nur Debug
-				];
-				
-				if (!wpsg_isSizedInt($p['order_product_id']) && $p['product_index'] !== false) {
-					
-					$p['order_product_id'] = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($id)."' AND `p_id` = '".wpsg_q($p['product_id'])."' AND `productkey` = '".wpsg_q($p['product_key'])."' AND `product_index` = '".wpsg_q($p['product_index'])."' ");
-					
-				}
-				
-				// Die Hooks verwenden Daten aus $_SESSION, deshalb nur beim Speichern im Frontend
-				if (!is_admin()) {
-				
-					$this->shop->callMods('calculation_saveProduct', [&$this, $p, &$db_data, $finish_order]);
-					
-				}
-				
-				if (wpsg_isSizedInt($p['order_product_id'])) {
-
-					$this->db->UpdateQuery(WPSG_TBL_ORDERPRODUCT, $db_data, " `id` = '".wpsg_q($p['order_product_id'])."' ");
-					
-				} else {
-
-                    $p['order_product_id'] = $this->db->ImportQuery(WPSG_TBL_ORDERPRODUCT, $db_data);
-					
-				}
- 
-                $arOrderProductID[] = $p['order_product_id'];
-
-                if (!is_admin()) {
- 
-                    $this->shop->callMods('calculation_saveProduct_after', [&$this, $p, &$db_data, $finish_order]);
-
-                }
-				
-            }
-             
-            $this->db->Query("DELETE FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($id)."' AND `id` NOT IN (".wpsg_q(implode(',', $arOrderProductID)).") ");
-            	
-			$this->arCalculation = null;
-                
-            return $id;
-            
-        } // public function toDB($id = false)
-	
-		/**
-		 * LÃ€dt eine alte Bestellung, die mit der alten wpsg_basket Klasse berechnet wurde
-		 * 
-		 * @param $db_order
-		 * @param $db_products
-		 */
-		public function fromDBFallback($db_order, $db_products) {
-									
-			// LÃ€nder
-			$oDefaultCountry = $this->shop->getDefaultCountry();
-			
-			$this->addCountry($oDefaultCountry->id, $oDefaultCountry->mwst, $oDefaultCountry->mwst_a,$oDefaultCountry->mwst_b, $oDefaultCountry->mwst_c, $oDefaultCountry->mwst_d, true);
-			
-			if (wpsg_isSizedInt($db_order['adress_id'])) {
-				
-				$country_id = $this->db->fetchOne("
-					SELECT
-						A.`land`
-					FROM
-						`".WPSG_TBL_ADRESS."` AS A
-					WHERE
-						A.`id` = '".wpsg_q($db_order['adress_id'])."'
-				");
-				
-				$oInvoiceCountry = \wpsg_country::getInstance($country_id);
-				 
-				if (!$oInvoiceCountry->isLoaded()) throw new \Exception(wpsg_translate(__('Land mit der ID #1# in Adress ID #2# existiert nicht mehr.', 'wpsg'), $country_id, $db_order['adress_id']));
-				
-				$this->addCountry($oInvoiceCountry->id, $oInvoiceCountry->mwst, $oInvoiceCountry->mwst_a,$oInvoiceCountry->mwst_b, $oInvoiceCountry->mwst_c, $oInvoiceCountry->mwst_d, false);
-				 
-			} else {
-				
-				$oInvoiceCountry = $oDefaultCountry;
-				
-			}
-			
-			if ($this->shop->hasMod('wpsg_mod_weight')) $this->dWeight = wpsg_tf($db_order['weight']);
-		 
-			if (isset($this->shop->arShipping[$db_order['type_shipping']])) {
-				
-				$shipping = $this->shop->arShipping[$db_order['type_shipping']];
-					
-				$this->addShipping($shipping['price'],$this->shop->getBackendTaxview(), $shipping['mwst_key'], $db_order['type_shipping']);
-				
-			} else {
-				
-				$this->addShipping($db_order['shipping_set'],$db_order['shipping_bruttonetto'],$db_order['shipping_tax_key'],$db_order['type_shipping']);
-				
-			}
-			
-			if (isset($this->shop->arPayment[$db_order['type_payment']])) {
-				
-				$payment = $this->shop->arPayment[$db_order['type_payment']];
-		 
-				$this->addPayment($payment['price'],$this->shop->getBackendTaxview(),$payment['mwst'],$db_order['type_payment']);
-				
-			} else {
-				
-				$this->addPayment($db_order['payment_set'],$db_order['payment_bruttonetto'],$db_order['payment_tax_key'],$db_order['type_payment']);
-				
-			}
-			
-			// Produkte
-			foreach ($db_products as $db_p) {
-				
-				if (!wpsg_isSizedString($db_p['productkey'])) $db_p['productkey'] = $db_p['p_id'];
-				
-				$product_data = $this->db->fetchRow("SELECT `euleistungsortregel` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($db_p['p_id'])."' ");
-				
-				if ($this->shop->getBackendTaxview() === WPSG_BRUTTO) $product_set = $db_p['price_brutto'];
-				else $product_set = $db_p['price_netto'];
-				
-				$tax_key = $db_p['mwst_key'];
-				
-				// c_1
-				if ($product_data['euleistungsortregel'] === '1') $eu = true;
-				$eu = false;
-							
-				$this->addProduct($product_set, $this->shop->getBackendTaxview(), $tax_key, $db_p['menge'],$db_p['productkey'], $db_p['product_index'], $db_p['id'], $eu);
-				
-			}
-			
-			// Rabatte
-			if (wpsg_isSizedString($db_order['discount_set'])) {
-				
-				$this->addDiscount($db_order['discount_set'], $db_order['discount_bruttonetto'], $db_order['discount_tax_key']);
-				
-			}
-			
-			// Gutschein
-			if (wpsg_isSizedString($db_order['gs_set'])) {
-				
-				$this->addVoucher($db_order['gs_set'], $db_order['voucher_bruttonetto'], $db_order['gs_tax_key'], 1, $db_order['gs_code'],$db_order['gs_id']);
-				
-			}
-			
-			$this->restored = true;
-			
-		} // public function fromDBFallback($db_order, $db_products) {
-		
-        public function fromDB($id) {
-
-			if (!wpsg_isSizedInt($id)) return;
-
-			$this->order_id = $id;
-						
-            $db_order = $this->db->fetchRow("SELECT O.*, A.`land` FROM `".WPSG_TBL_ORDER."` AS O LEFT JOIN `".WPSG_TBL_ADRESS."` AS A ON (O.`adress_id` = A.`id`) WHERE O.`id` = '".wpsg_q($id)."' ");
-            $db_products = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($id)."' ");
-
-			if (intval($db_order['status']) !== \wpsg_ShopController::STATUS_UNVOLLSTAENDIG) $this->order_finish = true;
-			
-            if (!wpsg_isSizedInt($db_order['calculation'])) {
-            	
-            	return $this->fromDBFallback($db_order, $db_products);
-            	
-			}
-	
-			if ($this->shop->hasMod('wpsg_mod_weight')) $this->dWeight = wpsg_tf($db_order['weight']);
-            
-			$this->setTaxMode($db_order['tax_mode']);
- 
-            $this->addCountry($db_order['shop_country_id'], $db_order['shop_country_tax'], $db_order['shop_country_tax_a'],$db_order['shop_country_tax_b'], $db_order['shop_country_tax_c'], $db_order['shop_country_tax_d'], true);
-			$this->addCountry($db_order['target_country_id'], $db_order['target_country_tax'], $db_order['target_country_tax_a'],$db_order['target_country_tax_b'], $db_order['target_country_tax_c'], $db_order['target_country_tax_d'], false);
-
-			if (strpos($db_order['shipping_set'], '#') !== false) $db_order['shipping_set'] = explode('#', $db_order['shipping_set']);
-
-			// Versand- und Zahlungsart	        
-            $this->addShipping($db_order['shipping_set'],$db_order['shipping_bruttonetto'],$db_order['shipping_tax_key'],$db_order['shipping_key']);
-            $this->addPayment($db_order['payment_set'], $db_order['payment_bruttonetto'], $db_order['payment_tax_key'],$db_order['payment_key']);
-
-            // Produkte
-            foreach ($db_products as $db_p) {
-            	
-                $this->addProduct(
-					$db_p['product_set'], 
-					$db_p['product_bruttonetto'], 
-					$db_p['mwst_key'], 
-					$db_p['menge'],
-					$db_p['productkey'], 
-					$db_p['product_index'], 
-					$db_p['id'], 
-					(($db_p['euleistungsortregel'] === '1')?true:false)
-                );
-                
-            }
-            
-            // Rabatte
-            if (wpsg_isSizedString($db_order['discount_set'])) {
-                
-                $this->addDiscount($db_order['discount_set'], $db_order['discount_bruttonetto'], $db_order['discount_tax_key']);
-                
-            }
-            
-            // Gutschein
-			if (wpsg_isSizedString($db_order['gs_set'])) {
-            	
-            	$this->addVoucher($db_order['gs_set'], $db_order['voucher_bruttonetto'], $db_order['gs_tax_key'], 1, $db_order['gs_code'],$db_order['gs_id']);
-            	
-			}            
-            			
-			if ($this->shop->hasMod('wpsg_mod_gutschein')) {
-            	
-            	$arVoucher = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDER_VOUCHER."` WHERE `order_id` = '".wpsg_q($id)."' ORDER BY `id` ASC ");
-            	 
-            	foreach ($arVoucher as $v) {
-						
-            		if ($v['coupon'] === '1') {
-            			
-            			$this->addCoupon($v['set_value'], $v['bruttonetto'], $v['tax_key'], 1, $v['code'], $v['voucher_id'], $v['id']);
-            			
-					} else {
-						 
-            			$this->addVoucher($v['set_value'], $v['bruttonetto'], $v['tax_key'], 1, $v['code'], $v['voucher_id'], $v['id']);
-            			
-					}
-            		
-				}
-            	
-			}
-			
-        } // public function fromDB($id)
-        
-		public function fromSession() {
-
-			$ses = (isset($_SESSION['wpsg'])?$_SESSION['wpsg']:[]);
-			 
-			if ($this->shop->hasMod('wpsg_mod_weight')) $this->dWeight = wpsg_tf($this->shop->callMod('wpsg_mod_weight', 'getSessionBasketWeight'));
-			
-			$oDefaultCountry = $this->shop->getDefaultCountry();			
-			$this->addCountry($oDefaultCountry->id, $oDefaultCountry->mwst, $oDefaultCountry->mwst_a, $oDefaultCountry->mwst_b, $oDefaultCountry->mwst_c, $oDefaultCountry->mwst_d,true);
-			
-			// "Mwst. gemÃ€Ã Lieferland berechnen" beachten
-			if (\wpsg_ShopController::getShop()->get_option('wpsg_deliverycountrytax') === '1' && ($ses['checkout']['shipping_land']??0) > 0 && ($ses['checkout']['shipping_land']??0) != $ses['checkout']['land']) {
-			
-				$oShippingCountry = \wpsg_country::getInstance($ses['checkout']['shipping_land']);
-				
-				$this->addCountry($oShippingCountry->id, $oShippingCountry->mwst, $oShippingCountry->mwst_a, $oShippingCountry->mwst_b, $oShippingCountry->mwst_c, $oShippingCountry->mwst_d, false);
-				
-			} else {
-				
-				if ($ses['checkout']['land'] != $oDefaultCountry->id) {
-				
-					$oInvoiceCountry = \wpsg_country::getInstance($ses['checkout']['land']);
-					$this->addCountry($oInvoiceCountry->id, $oInvoiceCountry->mwst, $oInvoiceCountry->mwst_a, $oInvoiceCountry->mwst_b, $oInvoiceCountry->mwst_c, $oInvoiceCountry->mwst_d,false);
-					
-				} 
-				
-			} 
-			
-			if (wpsg_isSizedArray($ses['basket'])) {
-				
-				foreach ($ses['basket'] as $product_index => $p) {
-					 
-					$oProduct = \wpsg_product::getInstance($p['id']);
-										
-					$this->addProduct(
-						$oProduct->getPrice($p['id'], $this->shop->getBackendTaxview()), 
-						$this->shop->getBackendTaxview(), 
-						$oProduct->mwst_key, 
-						$p['menge'], 
-						$p['id'], 
-						$product_index, 
-						false, 
-						(($oProduct->euleistungsortregel === '1')?true:false),
-						$p
-					);
-										
-				}
-												
-			}
-			
-			$this->shop->callMods('calculation_fromSession',[&$this, true, false]);
-
-			// Payment
-			if (isset($_SESSION['wpsg']['checkout']['payment']) && array_key_exists($_SESSION['wpsg']['checkout']['payment'], $this->shop->arPayment)) {
-
-				$payment = $this->shop->arPayment[$_SESSION['wpsg']['checkout']['payment']];
-				$price = $payment['price']??'0';
-
-                if (wpsg_isSizedArray($payment)) {
-
-                    $this->addPayment($price, $this->shop->getBackendTaxview(), @$payment['tax_key'], $_SESSION['wpsg']['checkout']['payment']);
-                    
-                }
-				
-			}
-			 
-			// Shipping 
-			if (isset($_SESSION['wpsg']['checkout']['shipping']) && array_key_exists($_SESSION['wpsg']['checkout']['shipping'], $this->shop->arShipping)) {
-				
-				$shipping = $this->shop->arShipping[$_SESSION['wpsg']['checkout']['shipping']];
-				
-				if (wpsg_isSizedArray($shipping['sub'])) {
-					 
-					$price = [];
-					
-					foreach ($shipping['sub'] as $sub_shipping) {
-						
-						$price[] = $sub_shipping['price'];
-						
-					}
-					
-				} else $price = $shipping['price'];
-				
-				if (wpsg_isSizedArray($shipping)) $this->addShipping($price, $this->shop->getBackendTaxview(), $shipping['tax_key'], $_SESSION['wpsg']['checkout']['shipping']);
-				
-			}
-				
-			$this->shop->callMods('calculation_fromSession',[&$this, true, true]);			
-			 
-			// Besteuerung
-			if ($this->shop->get_option('wpsg_kleinunternehmer') === '1') {
-				
-				$this->setTaxMode(self::TAXMODE_SMALLBUSINESS);
-				
-			} else if (($this->getTargetCountry()['tax_mode'] === '2' && wpsg_isSizedString($_SESSION['wpsg']['checkout']['ustidnr'])) || $this->getTargetCountry()['tax_mode'] === '1') {
-				
-				$this->setTaxMode(self::TAXMODE_B2B);
-				
-			} else {
-				
-				$this->setTaxMode(self::TAXMODE_B2C);
-				
-			}
-			
-		}
-		
-        public function getMaxProductIndex() {
-            
-            $max_index = 0;
-            
-            foreach ($this->arCalculationRow as $cr) {
-                
-            	if ($cr['type'] === 'product') $max_index = max($max_index, $cr['data']['product_index']);
-                
-            }
-            
-            return $max_index;
-            
-        }
-
-		public function setWeight($weight) {
-
-			$this->dWeight = $weight;
-			
-		}
-
-		public function getWeight() {
-			
-			return $this->dWeight;
-			
-		}
-	
-		/**
-		 * Berechnet einen KostenschlÃŒssel
-		 * benÃ¶tigt eine geladene Kalkulation
-		 * @param $set
-		 * @return float|string
-		 * @throws \Exception
-		 */
-        public function calculateCostKey($set) {
-
-			if (strval($set) === '0' || strval($set) === '0,00' || strval($set) === '0.00') return 0;
-			
-			list($typ, $set) = explode('-', $set);
-
-			$arKosten = explode('|', $set);
-			$arKosten = array_reverse($arKosten);
-			
-			if ($typ === 'w') $value = (($this->shop->getBackendTaxview() === WPSG_NETTO)?$this->arCalculation['sum']['productsum_netto']:$this->arCalculation['sum']['productsum_brutto']);
-			else if ($typ === 's') {
-			
-				// Menge
-				// $value = $this->arCalculation['sum']['amount'];
-				// Downloadprodukte sollen sich nicht auf die Staffel auswirken
-				 
-				$value = 0;
-				
-				foreach ($this->arCalculationRow as $cr) {
-					
-					if ($cr['type'] === 'product') {
-						
-						if (($cr['data']['is_downloadproduct']??false) !== true) $value += $cr['amount'];
-						
-					}
-					
-				}
-					
-			} else if ($typ === 'g') $value = $this->dWeight; // Gewicht
-			else { 
-				
-				throw new \Exception(wpsg_translate(__('Typ (#1#) fÃŒr KostenschlÃŒssel nicht definiert.', 'wpsg'), $typ)); 
-			
-			}
-
-			$kosten = 0;
-			
-			foreach ($arKosten as $k) {
-
-				$arP = explode(":", $k);
-		
-				if (sizeof($arP) == 1) $kosten = $arP[0];
-				else if (wpsg_tf($arP[0]) <= $value) $kosten = $arP[1];
-		
-			}
-	
-			$kosten = wpsg_tf($kosten);
-        	
-        	return $kosten;
-			
-		}
-        
-        /* Private */
-		
-		/**
-		 * Ermittelt die Verteilung der SteuersÃ€tze
-		 */
-		private function calculateTaxProportionally($bruttonetto) {
-			
-			if ($bruttonetto === WPSG_NETTO) $bruttonetto = 'netto';
-			else $bruttonetto = 'brutto';
-	 
-			$sum = $this->arCalculation['sum'][$bruttonetto]; 
-			
-			// Den Anteiligen Netto Betrag beachte ich nicht bei der Anteilermittlung
-			//$sum -= $this->arCalculation['tax'][0][$bruttonetto]; 
-			
-			foreach ($this->arCalculation['tax'] as $tax_key => $tax) {
-				
-				if ($tax_key == '0') {
-					
-					$this->arCalculation['tax'][$tax_key]['part'] = 0;
-					
-				} else {
-					
-					if ($sum <= 0) $this->arCalculation['tax'][$tax_key]['part'] = 1; //? Hier war mal 0 drin
-					else $this->arCalculation['tax'][$tax_key]['part'] = $tax[$bruttonetto] / $sum;
-					
-				}
-				
-			}
-			
-		}
-		
-		/**
-		 * Berechnet den Netto Wert zu einem Bruttowert
-		 * 
-		 * @param $brutto
-		 * @param $tax_key
-		 */
-        private function calculateTaxPart($bruttonetto, $val, $tax_key, $noTax = false) {
-	        	
-        	if (!is_numeric($val)) $val = 0;
-        	
-        	if ($tax_key == '0') { // 0, bedeutet hier anteilig
-		
-				$ret_netto = 0;
-				$ret_brutto = 0;
-				
-				foreach ($this->arCalculation['tax'] as $tax_key2 => $tax) {
-			
-					if ($tax_key2 != '0') {
-				 
-						if ($bruttonetto === WPSG_NETTO) {
-							
-							$netto = $val * $tax['part'];
-							
-							$brutto = $netto;
-							$brutto =  $netto * (1 + $this->arCalculation['tax'][$tax_key2]['tax_value'] / 100);
-														
-						} else {
-							
-							$brutto = $val * $tax['part']; 
-							$netto = $brutto / (1 + $this->arCalculation['tax'][$tax_key2]['tax_value'] / 100);
-							
-						}
-						
-						if ($this->tax_mode === self::TAXMODE_SMALLBUSINESS) $brutto = $netto;
-						else if ($this->tax_mode === self::TAXMODE_B2B) $brutto = $netto;
-						
-						$ret_netto += $netto;
-						$ret_brutto += $brutto;
-						
-						if ($tax_key !== $tax_key2 && !$noTax) {
-							
-							//if ($this->getTargetCountry()['tax_mode'] == '1') $brutto = $netto;
-//!							//if ($this->tax_mode === self::TAXMODE_B2B) $brutto = $netto;
-							 
-							$this->arCalculation['tax'][$tax_key2]['netto'] += $netto;
-							$this->arCalculation['tax'][$tax_key2]['brutto'] += $brutto;
-							
-						}
-												
-					}
-			
-				}
-									
-				return [$ret_netto, $ret_brutto];
-		
-			} else {
-				
-				if ($bruttonetto === WPSG_NETTO) {
-					
-					return [$val, $val * (1 + $this->arCalculation['tax'][$tax_key]['tax_value'] / 100)];
-					
-				}
-				else {
-					
-					return [$val / (1 + $this->arCalculation['tax'][$tax_key]['tax_value'] / 100), $val];
-					
-				}
-		
-			}
-			
-		} 
-
-        /**
-         * Im Array sollen die Tax SchlÃŒssel immer mit Land gespeichert sein
-		 * Erzwingt auch 0% Mwst
-         */
-        private function normalizeTaxKey($tax_key, $country_id = false, $defaultCountryID = true) {
-	
-            if ($tax_key == '') $tax_key = '0';
-            
-            if ($tax_key != '0' && !preg_match('/\_\d+$/', $tax_key)) {
-            	
-            	if ($country_id === false) {
-            		
-            		if ($defaultCountryID === true) $country_id = $this->getDefaultCountryID();
-            		else $country_id = $this->getTargetCountryID();
-            		
-				}
-            	
-            	return $tax_key.'_'.$country_id;
-            					
-			} else return $tax_key;
-            
-        }
-	
-		/**
-		 * Entfernt den LÃ€nderschlÃŒssel aus dem SteuerschlÃŒssel
-		 * @param $tax_key
-		 */
-        private function clearTaxKey($tax_key) {
-        	
-        	if (!preg_match('/\_\d+$/', $tax_key)) return $tax_key;
-        	
-        	return explode('_', $tax_key)[0];
-        	
-		}
-	
-		/**
-		 * Gibt einen Array zurÃŒck, in dem die beteiligten SteuersÃ€tze mit LÃ€nderkÃŒrzel definiert sind
-		 */
-		public function getTaxLabelArray($short = false) {
-		
-			$arTaxLabel = [];
-			$arTaxGgroup = wpsg_tax_groups(false, true);
-			$arCalculation = $this->getCalculationArray();
-			
-			$country_default_id = false;
-			
-			foreach ($this->arCountry as $country_id => $country) {
-				
-				if ($country['default'] === true) $country_default_id = $country_id;
-				
-			}
-			
-			if (!wpsg_isSizedInt($country_default_id)) throw new \Exception(__('Standardland konnte in Berechnung nicht ermittelt werden.'));
-			
-			foreach ($arCalculation['tax'] as $tax) {
-			
-				if (preg_match('/_\d+/', $tax['key'])) {
-				
-					$arTaxKey = explode('_', $tax['key']);
-					$tax_key = $arTaxKey[0];
-				
-					$country_id = $arTaxKey[1];
-									
-				} else {
-				
-					$tax_key = $tax['key'];
-					
-					$country_id = $country_default_id;
-				
-				}
-								
-				$oCountry = \wpsg_country::getInstance($country_id);
-			
-				$tax_value = (($tax['key'] === '0' || !isset($this->arCountry[$country_id][$tax['key']]))?0:$this->arCountry[$country_id][$tax['key']]);
-				
-				if ($oCountry->isLoaded()) {
-									
-					$kuerzel = $oCountry->kuerzel;
-										
-				} else {
-					
-					$kuerzel = '';
-					
-				}
-				
-				if ($short === true) {
-					
-					if (!in_array($tax_key, ['0', 'e'])) $arTaxLabel[$tax['key']] = wpsg_ff(wpsg_tf($tax_value), '%');
-					else if ($tax_key === 'e') $arTaxLabel[$tax_key] = '0';
-					else $arTaxLabel[$tax['key']] = 'anteilig';
-					
-				} else {
-					
-					if (!in_array($tax_key, ['0', 'e'])) $arTaxLabel[$tax['key']] = $arTaxGgroup[$tax_key].' ('.wpsg_ff(wpsg_tf($tax_value), '%').' / '.$kuerzel.')';
-					else $arTaxLabel[$tax['key']] = $arTaxGgroup[$tax_key];
-					
-				}
-				
-			}
-			
-			return $arTaxLabel;
-		
-		}
-
-		public function update() {
-			
-			unset(self::$functionscache['getSessionCalculation']);
-			
-		}
-		
-		public function getShippingName() {
-			
-			$arName = [];
-			
-			foreach ($this->arCalculationRow as $k_cr => $cr) {
-				
-				if ($cr['type'] === 'shipping') {
-					
-					if (strpos($cr['data']['shipping_key'], '-') !== false) {
-						
-						$arSubName = [];
-						
-						foreach (explode('-', $cr['data']['shipping_key']) as $shipping_key) {
-				
-							$arSubName[] = $this->shop->arShippingAll[$shipping_key]['name']??'';	
-							
-						}				
-						
-						$arName[] = implode(' + ', $arSubName);	
-						
-					} else {
-					
-						$arName[] = $this->shop->arShippingAll[$cr['data']['shipping_key']]['name']??'';
-						
-					}
-					
-				}
-				
-			}
-			
-			return implode(' / ', $arName);
-			
-		}
-		
-		public function getPaymentName() {
-			
-			$arName = [];
-			
-			foreach ($this->arCalculationRow as $k_cr => $cr) {
-				
-				if ($cr['type'] === 'payment') $arName[] = $this->shop->arPayment[$cr['data']['payment_key']]['name']??'';
-				
-			}
-			
-			return implode(' / ', $arName);
-			
-		}
-		
-        /**
-         * Gibt die Anzahl an Produkten zurÃŒck
-         * @return int
-         */
-		public function getProductCount() {
-
-		    $sum = 0;
-
-		    foreach ($this->getCalculationArray()['product'] as $p) {
-
-		        $sum += $p['amount'];
-
-            }
-
-		    return $sum;
-
-        }
-
-		public function getShippingSum($bruttonetto = WPSG_NETTO) {
-		
-			$arCalculation = $this->getCalculationArray();
-			
-			if ($bruttonetto === WPSG_BRUTTO) return $arCalculation['sum']['shipping_brutto'];
-			else return $arCalculation['sum']['shipping_netto'];
-						
-		}
-		
-		public function getPaymentSum($bruttonetto = WPSG_NETTO) {
-		
-			$arCalculation = $this->getCalculationArray();
-			
-			if ($bruttonetto === WPSG_BRUTTO) return $arCalculation['sum']['payment_brutto'];
-			else return $arCalculation['sum']['payment_netto'];
-						
-		}
-		
-		public function getSum($bruttonetto = WPSG_NETTO) {
-
-		    if ($this->getProductCount() <= 0) return 0;
-
-			$arCalculation = $this->getCalculationArray();
-			
-			if ($bruttonetto === WPSG_BRUTTO) return $arCalculation['sum']['brutto'];
-			else return $arCalculation['sum']['netto'];
-			
-		}
-
-		public function getToPay($bruttonetto = WPSG_BRUTTO) {
-
-            if ($this->getProductCount() <= 0) return 0;
-
-            $arCalculation = $this->getCalculationArray();
-
-            if ($bruttonetto === WPSG_BRUTTO) return $arCalculation['sum']['topay_brutto'];
-            else return $arCalculation['sum']['topay_netto'];
-
-        }
-		
-		private function addTax($tax_key) {
-	
-			if (!isset($this->arCalculation['tax'][$tax_key])) {
-				
-				$arTaxKey = explode('_', $tax_key);
-				
-				$this->arCalculation['tax'][$tax_key] = [
-					'key' => $tax_key,
-					'tax_value' => (($tax_key !== '0' && isset($this->arCountry[$arTaxKey[1]][$tax_key]))?$this->arCountry[$arTaxKey[1]][$tax_key]:0),
-					'netto' => 0,
-					'brutto' => 0
-				];
-				
-			} 
-            
-        }
-
-        /**
-         * @param int $product_index
-         */
-        public function getOrderProduct($product_index) {
-
-            foreach ($this->getCalculationArray()['product'] as $p) {
-
-                if (intval($p['product_index']) === $product_index) {
-
-                    return \wpsg_order_product::getInstance($p['order_product_id']);
-
-                }
-
-            }
-
-            return null;
-
-        }
-                
-        /* Static */
-
-        /**
-         * @param int $order_id
-         * @param bool $no_cache
-         * @return wpsg_calculation
-         */
-        public static function getOrderCalculation($order_id, $no_cache = false) {
-
-            $cache_key = __FUNCTION__.implode('|', \func_get_args());
-
-            if (!isset(self::$functionscache[$cache_key]) || $no_cache) {
-
-                $oCalculation = new wpsg_calculation();
-                $oCalculation->fromDB($order_id);
-
-                self::$functionscache[$cache_key] = $oCalculation;
-
-            }
-
-            return self::$functionscache[$cache_key];
-
-        }
-
-		/**
-         * @param bool $no_cache
-         * @return wpsg_calculation
-		 */
-		public static function getSessionCalculation($no_cache = false) {
-			
-			$cache_key = __FUNCTION__.implode('|', \func_get_args());
-			 
-			if (!isset(self::$functionscache[$cache_key]) || self::$functionscache[$cache_key] === null || $no_cache) {
-			
-				$oCalculation = new wpsg_calculation();
-				$oCalculation->fromSession();
-				
-				self::$functionscache[$cache_key] = $oCalculation;
-				
-			}
-			
-			return self::$functionscache[$cache_key];
-				
-		}
-	        
-    }
-         
-         
Index: /lib/wpsg_db.class.php
===================================================================
--- /lib/wpsg_db.class.php	(revision 8528)
+++ /lib/wpsg_db.class.php	(revision 5261)
@@ -4,6 +4,7 @@
 	 * Klasse die die vom Shop verwendeten Datenbankfunktionen kapselt
 	 */
-	class wpsg_db {
-
+	class wpsg_db
+	{
+		
 		/**
 		 * Fehlerbehandlung
@@ -14,59 +15,55 @@
 			global $wpdb;
 		
-			$lastQuery = $wpdb->last_query;
-			
-			throw new \wpsg\Exception($wpdb->last_error, \wpsg\Exception::TYP_DB, array(
-				array(__('Letzter Query', 'wpsg'), $lastQuery)
-			));
+			$strError = $wpdb->last_query;
+			if (!wpsg_isSizedString($strError)) $strError = __('Wordpress hat den generierten Query abgelehnt, vermutlich ist ein Template beschÃ€digt. (UngÃŒltiger Zeichensatz)', 'wpsg');
+			
+			die(wpsg_debug("Query: ".$strError."\nFehler: ".$wpdb->last_error."\nBacktrace:\n".print_r(debug_backtrace(), 1)));
 		
 		} // function handleError()
 		
-		public static function fetchOnePrepared($strQuery, ... $arg): ?string {
-		
-			global $wpdb;
-			
-			$row = $wpdb->get_row($wpdb->prepare($strQuery, $arg), ARRAY_N);
-	
-			if ($row === null) return null;
-			else return $row[0];
-			
-		}
-
 		/**
 		 * Gibt eine einzelne Zelle aus der Datenbank zurÃŒck
 		 */
-		function fetchOne($strQuery) {
-			
-			global $wpdb;
-
-			$result = $wpdb->get_var($strQuery);
-
-			if ($result === false) {
-				
-				$this->handleError();
-				
-			} else {
-
+		function fetchOne($strQuery)
+		{
+			
+			global $wpdb;
+
+			if ($wpdb->query($strQuery) === false)
+			{
+				
+				$this->handleError();
+				
+			}
+			else
+			{
+			
+				$result = $wpdb->get_var($strQuery);
+ 
 				return $result;
 				
 			} 
 			
-		} 
+		} // function fetchOne($strQuery)
 		
 		/**
 		 * Gibt eine ganze Zeile als Ergebnis aus der Datenbank zurÃŒck
 		 */
-		function fetchRow($strQuery) {
-			
-			global $wpdb;
-
-			$result = $wpdb->get_row($strQuery, ARRAY_A);
-
-			if ($result === false) {
-			
-				$this->handleError();
-			
-			} else {
-
+		function fetchRow($strQuery)
+		{
+			
+			global $wpdb;
+			 
+			if ($wpdb->query($strQuery) === false)
+			{
+			
+				$this->handleError();
+			
+			}
+			else
+			{
+					
+				$result = $wpdb->get_row($strQuery, ARRAY_A);
+			 
 				return $result;
 			
@@ -79,21 +76,27 @@
 		 * Ist der Parameter $key ungleich zu false, so ist der SchlÃŒssel des Arrays die in $key ÃŒbergebene Spalte 
 		 */
-		function fetchAssoc($strQuery, $key = false) {
-			
-			global $wpdb;
-
-			$arReturn1 = $wpdb->get_results($strQuery, ARRAY_A);
-
-			if ($arReturn1 === false) {
-					
-				$this->handleError();
-					
-			} else {
-
-				if ($key != false) {
+		function fetchAssoc($strQuery, $key = false)
+		{
+			
+			global $wpdb;
+			
+			if ($wpdb->query($strQuery) === false)
+			{
+					
+				$this->handleError();
+					
+			}
+			else
+			{
+			
+				$arReturn1 = $wpdb->get_results($strQuery, ARRAY_A);
+				
+				if ($key != false)
+				{
 					
 					$arReturn = array();
 					
-					foreach ($arReturn1 as $k => $v) {
+					foreach ($arReturn1 as $k => $v)
+					{
 						
 						$arReturn[$v[$key]] = $v;
@@ -103,5 +106,7 @@
 					return $arReturn;
 					
-				} else {
+				}
+				else
+				{
 					
 					return $arReturn1;
@@ -118,19 +123,23 @@
 		 * Der Parameter strValueField ist die Spalte fÃŒr den Wert des Arrays 
 		 */
-		function fetchAssocField($strQuery, $strKeyField = false, $strValueField = false) {
-		
-			global $wpdb;
-
-			$db_rows = $wpdb->get_results($strQuery, ARRAY_A);
-
-			if ($db_rows === false) {
-					
-				$this->handleError();
-					
-			} else {
-
+		function fetchAssocField($strQuery, $strKeyField = false, $strValueField = false)
+		{
+		
+			global $wpdb;
+			
+			if ($wpdb->query($strQuery) === false)
+			{
+					
+				$this->handleError();
+					
+			}
+			else
+			{
+			
+				$db_rows = $wpdb->get_results($strQuery, ARRAY_A);
 				$arReturn = array();			
 				
-				foreach ($db_rows as $row) {
+				foreach ($db_rows as $row)
+				{
 					 
 					if ($strKeyField != false && $strValueField != false)
@@ -180,5 +189,8 @@
 			{
 				
-				if ($v != "NOW()" && $v != "NULL") $v = "'".$v."'";
+				if ($v != "NOW()" && $v != "NULL" && !is_array($v))
+					$v = "'".$v."'";
+				else if (is_array($v))
+					$v = $v[0];
 					
 				$strQuery .= "`".$k."` = ".$v.", ";
@@ -208,34 +220,19 @@
 		 * Aktualisiert Zeilen in der Datenbank anhand des $where Selectse
 		 */
-		function UpdateQuery($table, $data, $where, $checkCols = false)
-		{
-			
-			global $wpdb;
-
-            /**
-             * Wenn diese Option aktiv ist, so werden Spalten nur importiert
-             * wenn sie auch in der Zieltabelle existieren.
-             */
-            if ($checkCols === true)
-            {
-
-                $arFields = $this->fetchAssoc("SHOW COLUMNS FROM `".wpsg_q($table)."` ");
-
-                $arCols = array();
-                foreach ($arFields as $f) { $arCols[] = $f['Field']; }
-                foreach ($data as $k => $v) { if (!in_array($k, $arCols)) { unset($data[$k]); } }
-
-            }
-            
-            if (!wpsg_isSizedArray($data)) throw new \Exception(__('Update ohne Daten?', 'wpsg'));
+		function UpdateQuery($table, $data, $where)
+		{
+			
+			global $wpdb;
 			
 			// Query aufbauen, da wir den kompletten QueryWHERE String als String ÃŒbergeben
 			$strQuery = "UPDATE `".wpsg_q($table)."` SET ";
 			
-			foreach ($data as $k => $v) {
-
-				if (is_array($v)) $v = json_encode($v);
-
-				if ($v != "NOW()" && $v != "NULL") $v = "'".$v."'";
+			foreach ($data as $k => $v)
+			{
+				
+				if ($v != "NOW()" && $v != "NULL" && !is_array($v))
+					$v = "'".$v."'";
+				else if (is_array($v))
+					$v = $v[0];
 					
 				$strQuery .= "`".$k."` = ".$v.", ";
@@ -288,14 +285,6 @@
 			 			
 		} // function Query($strQuery)
-	 		
-		/**
-		 * Entsperrt alle Tabellen
-		 */
-		function unlockTables()
-		{
-			
-			$this->Query("UNLOCK TABLES");
- 			
- 		} // function unlockTables()
-		
-	}
+		
+	} // class wpsg_db
+
+?>
Index: b/wpsg_exceptionhandler.class.php
===================================================================
--- /lib/wpsg_exceptionhandler.class.php	(revision 8528)
+++ 	(revision )
@@ -1,74 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 18.05.2017
-     * Time: 08:44
-     */
-
-    namespace wpsg;
-    
-	class ModulURLNotFoundException extends \Exception {}
-	
-    abstract class Exceptionhandler {
-
-        /**
-         * Wird aufgerufen wenn eine Exception nicht im Code behandelt wird
-         * @param $ex
-         */
-        static function exception($ex, $break = true) {
-			 			
-            if (get_class($ex) === "wpsg\Exception") {
-
-                $typeLabel = $ex->getTypLabel();
-                $arData = $ex->getData();
-
-            } else {
-
-				//echo '<pre>'; var_dump($ex); echo '</pre>';
-				//echo '<pre>'; debug_print_backtrace();echo '</pre>';
-	            
-                $typeLabel = __('Allgemeiner Fehler', 'wpsg');
-                $arData = Array();
-
-            }
-
-            $msg = $ex->getMessage();
-
-			if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugLog') === '1') {
-				
-	            // Protokolleintrag anlegen
-	            $strLogText  = date('d.m.Y H:i:s').': '.str_pad($typeLabel, 50, ' ')."\r\n";
-	            $strLogText .= $msg."\r\n";
-	
-	            foreach ($arData as $d)
-	            {
-	
-	                $strLogText .= $d[0].': '.$d[1]."\r\n";
-	
-	            }
-	
-	            ob_start();
-	            $strLogText .= $ex;
-	            ob_end_clean();
-	
-	            ob_start();
-	            debug_print_backtrace();
-	            $backtrace = ob_get_contents();
-	            ob_end_clean();
-	         
-	            $strLogText .= str_pad('', 120, '-')."\r\n";
-	
-	            $log_file = $GLOBALS['wpsg_sc']->getStorageRoot().'exception.log';
-	
-	            if (file_exists($log_file)) file_put_contents($log_file, $strLogText.file_get_contents($log_file));
-	            else file_put_contents($log_file, $strLogText);
-
-			} else throw $ex;
-
-            if ($break) die(wpsg_debug($typeLabel.": ".$msg."\r\n".($backtrace??''), true));
-
-        } // static function myCallbackMethod($ex)
-        
-    }  
-    
Index: /lib/wpsg_fpdf.class.php
===================================================================
--- /lib/wpsg_fpdf.class.php	(revision 8528)
+++ /lib/wpsg_fpdf.class.php	(revision 5261)
@@ -1,27 +1,8 @@
 <?php
 
-	use \setasign\Fpdi\Fpdi;
-	use \setasign\FpdiProtection\FpdiProtection;
-	
-	class wpsg_fpdf extends Fpdi
+	class wpsg_fpdf extends FPDI
 	{
-		 
-		var $noHeader = false;
-		var $extgstates = [];
-		
-		public function addBase64Image($base64Image, $x, $y, $w = 0, $h = 0) {
-			
-			list($type, $data) = explode(';', $base64Image);
-			list(, $data) = explode(',', $data);
-			$data = base64_decode($data);
-	
-			$tempFile = tempnam(sys_get_temp_dir(), 'fpdf') . '.png';
-			file_put_contents($tempFile, $data);
-	
-			$this->Image($tempFile, $x, $y, $w, $h);
-	
-			unlink($tempFile);
-			
-		}
+		
+		var $extgstates;
 		
 		public function Text($x, $y, $text)
@@ -31,22 +12,20 @@
 			
 		}
- 	
-		public function Cell($w, $h = 0, $text = '', $border = 0, $ln = 0, $align = '', $fill = 0, $link = '') 
-		{
 						
-			return parent::Cell($w, $h, $this->toIso($text), $border, $ln, $align, $fill, $link);
-			
-		}
- 
-		public function wpsg_MultiCell($x, $y, $h, $txt, $border = 0, $align = 'L', $fill = 0, $width = 0)
-		{
- 
+		public function Cell($w, $h, $text, $border, $ln, $align, $fill = 0)
+		{
+			
+			parent::Cell($w, $h, $this->toIso($text), $border, $ln, $align, $fill);
+			
+		}
+
+		public function MultiCell($x, $y, $h, $txt, $border = 0, $align = 'L', $fill = 0, $width = 0)
+		{
+
 			//	MultiCell(float w , float h , string txt [, mixed border] [, string align] [, integer fill])
-			parent::setXY(wpsg_tf($x), wpsg_tf($y));
-			
-			// Hier kein toISO weil intern wieder Cell aufgerufen wird
-			parent::MultiCell($width, wpsg_tf($h), $txt, $border, $align, $fill);
-
-			$height = $this->getY() - wpsg_tf($y);
+			parent::setXY($x, $y);
+			parent::MultiCell($width, $h, $this->toIso($txt), $border, $align, $fill);
+
+			$height = $this->getY() - $y;
 				
 			return $height;
@@ -54,8 +33,8 @@
 		}
 		
-		public function wpsg_SetTextColor($strHEXCode)
-		{
-			
-			if (trim($strHEXCode??'') === '') return;
+		public function SetTextColor($strHEXCode)
+		{
+			
+			error_reporting(E_ERROR);
 			
 			if ($strHEXCode[0] == '#')
@@ -75,10 +54,8 @@
 			parent::setTextColor($r, $g, $b);
 			
-		} // public function wpsg_SetTextColor($strHEXCode)
+		} // public function SetTextColor($strHEXCode)
 		
 		function Rotate($angle,$x=-1,$y=-1)
 		{
-			
-			$angle = floatval($angle);
 			
 		    if($x==-1)
@@ -111,6 +88,5 @@
 				if ($angle == "" || $angle == 0) 
 				{
-				
-					$angle = 0;
+					
 					$x = $x - $h;
 											
@@ -209,23 +185,14 @@
 	    function _putextgstates()
 	    {
-	    	
-	    	$extgstates = $this->extgstates;
-	    	
-	    	if (is_array($extgstates)) {
-	        
-	    		for ($i = 1; $i <= count($this->extgstates); $i++) {
-	    			
-					$this->_newobj();
-					$this->extgstates[$i]['n'] = $this->n;
-					$this->_out('<</Type /ExtGState');
-					foreach ($this->extgstates[$i]['parms'] as $k=>$v)
-						$this->_out('/'.$k.' '.$v);
-					$this->_out('>>');
-					$this->_out('endobj');
-					
-				}
-				
-			}
-				
+	        for ($i = 1; $i <= count($this->extgstates); $i++)
+	        {
+	            $this->_newobj();
+	            $this->extgstates[$i]['n'] = $this->n;
+	            $this->_out('<</Type /ExtGState');
+	            foreach ($this->extgstates[$i]['parms'] as $k=>$v)
+	                $this->_out('/'.$k.' '.$v);
+	            $this->_out('>>');
+	            $this->_out('endobj');
+	        }
 	    }
 
@@ -251,15 +218,7 @@
 		{
 			
-			/* Alternative:
-				$value = utf8_decode($value);
-				$value = str_replace("â¬", chr(128), $value);
-				$value = str_replace(utf8_decode("â¬"), chr(128), $value);
-			 */
-			 			
-			$value = str_replace('â', '-', $value);
 			$value = str_replace("â¬", '&euro;', $value);
-			//$value = utf8_decode($value);
-			$value = iconv('UTF-8', 'ISO-8859-1', $value);
-            $value = str_replace("&euro;", chr(128), $value);
+			$value = utf8_decode($value);
+			$value = str_replace("&euro;", chr(128), $value);			
 			
 			return $value;
@@ -269,2 +228,3 @@
 	}
 
+?>
Index: /lib/wpsg_header.class.php
===================================================================
--- /lib/wpsg_header.class.php	(revision 8528)
+++ /lib/wpsg_header.class.php	(revision 5261)
@@ -3,47 +3,22 @@
 	class wpsg_header
 	{
-
-        public static function startDownloadContent($filename, $content)
-        {
-
-            header('Content-Description: File Transfer');
-            header('Content-Type: application/octet-stream');
-            header('Content-Disposition: attachment; filename='.$filename);
-            header('Connection: Keep-Alive');
-            header('Expires: 0');
-            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-            header('Pragma: public');
-
-            // Bei Download von Textdateien (Profil.json) wurde die falsche LÃ€nge ÃŒbergeben und der Download damit abgeschnitten ??
-            //header('Content-Length: '.mb_strlen($content));
-
-            echo $content;
-            exit;
-
-        } // public static function startDownload($filename)
 		
-        public function IMG($file) {
-
-            $filename = basename($file);
-            $file_extension = strtolower(substr(strrchr($filename,"."),1));
-
-            switch ($file_extension) {
-                
-                case "gif": $ctype = "image/gif"; break;
-                case "png": $ctype = "image/png"; break;
-                case "jpeg":
-                case "jpg": $ctype = "image/jpeg"; break;
-                
-                default:
-                    
-            }
-
-            header('Content-type: '.$ctype);
-            
-            readfile($file);
-            exit;
-		    
-        }
-        
+		public static function startDownloadContent($filename, $content)
+		{
+			
+			header('Content-Description: File Transfer');
+			header('Content-Type: application/octet-stream');
+			header('Content-Disposition: attachment; filename='.$filename);
+			header('Content-Transfer-Encoding: binary');
+			header('Connection: Keep-Alive');
+			header('Expires: 0');
+			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+			header('Pragma: public');
+			header('Content-Length: '.strlen($content));
+			
+			die($content);
+			
+		} // public static function startDownload($filename)
+		
 		public static function PDFPlugin($file)
 		{
@@ -58,46 +33,11 @@
 		} // public static function PDFPlugin($filename)
 		
-		public static function JSONData($arData) {
+		public static function JSONData($arData)
+		{
 			
 			header('Content-Type: application/json');
-			
-			echo json_encode($arData);
-			exit;
+			die(json_encode($arData));
 			
 		} // public static function JSONData()
-
-        public static function AUTO($file, $filename = false) {
-
-            if ($filename === false) $filename = basename($file);
-
-            header('Content-Disposition: inline; filename="'.$filename.'"');
-
-            header('Pragma: public');
-            header('Content-type: '.\mime_content_type($file));
-            header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
-            header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
-
-            readfile($file);
-
-        }
-
-		public static function ZIP($file, $filename = false)
-		{
-
-			if ($filename === false) $filename = basename($file);
-			
-			header("Pragma: public");
-			header("Expires: 0");
-			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
-			header("Cache-Control: public");
-			header("Content-Description: File Transfer");
-			header("Content-type: application/octet-stream");
-			header("Content-Disposition: attachment; filename=\"".$filename."\"");
-			header("Content-Transfer-Encoding: binary");
-			header("Content-Length: ".filesize($file)."\\n");
-		
-			readfile($file);
-			
-		}
 		
 	} // class wpsg_header
Index: b/wpsg_imagehandler.class.php
===================================================================
--- /lib/wpsg_imagehandler.class.php	(revision 8528)
+++ 	(revision )
@@ -1,255 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 01.09.2017
-     * Time: 08:04
-     */
-
-    /**
-     * In dieser Klasse sind die Funktionen zum Zugriff auf die Produktbilder gekapselt
-     * Ersetzt das alte Produktbilder Modul
-     */
-    class wpsg_imagehandler 
-    {
-        
-        /** @var wpsg_ShopController */
-        private $shop = null;
-
-        /** @var wpsg_db */
-        public $db = null;
-        
-        public function __construct()
-        {
-            
-            $this->shop = &$GLOBALS['wpsg_sc'];
-            $this->db = &$GLOBALS['wpsg_db'];
-            
-        } // public function __construct()
-        
-        /**
-		 * Gibt die ID des Anhangs zu einem ProduktKey zurÃŒck
-		 * 
-		 * @author Daschmi
-		 * @param $product_key
-		 */
-		public function getAttachmentID($product_key, $vari_id = false, $all = false) {
-			
-			$arAttachmentIDs = $this->getAttachmentIDs($product_key, $vari_id, $all);
-
-			if (wpsg_isSizedArray($arAttachmentIDs)) {
-
-                $arValues = array_values($arAttachmentIDs);
-
-                return $arValues[0];
-
-            }
-			else return false;
-			
-		} // public function getAttachmentID($product_key)
-				
-		public function addImageToProduct($file, $product_id) {
-			
-			// Siehe
-			// https://codex.wordpress.org/Function_Reference/wp_insert_attachment
-			
-			if (!wpsg_isSizedString($file)) return null;
-			
-			$wp_upload_dir = wp_upload_dir();
-			
-			$mt_filetype = wp_check_filetype(basename($file), null);
-			$mt_filename = $wp_upload_dir['path'].'/'.basename($file);
-					
-			// Neuer Dateiname muss eindeutig sein Suffixen
-			$i = 1; while(true) {
-				
-				if (!file_exists($mt_filename)) break;
-				else {
-					
-					$mt_filename = preg_replace('/\.(?!.*\.)/', '_'.$i.'.', $mt_filename); 
-					
-				}
-				
-				if ($i > 100) throw new \wpsg\Exception("Systemfehler!");
-				
-				$i ++;
-				
-			}
-			
-			copy($file, $mt_filename);
-			
-			$attachment = array(
-				'guid' => wpsg_q($wp_upload_dir['url'].'/'.basename($mt_filename)),
-				'post_mime_type' => wpsg_q($mt_filetype['type']),
-				'post_title' => wpsg_q(preg_replace('/\.[^.]+$/', '', basename($mt_filename))),
-				'post_excerpt' => wpsg_q(basename($file)),
-				'post_status' => 'inherit'
-			);
-			
-			$attachment_id = wp_insert_attachment($attachment, $mt_filename, '0');
-			
-			require_once(ABSPATH.'wp-admin/includes/image.php');
-			
-			$attach_data = wp_generate_attachment_metadata($attachment_id, $mt_filename);
-			wp_update_attachment_metadata($attachment_id, $attach_data);
-			
-			add_post_meta($attachment_id, 'wpsg_produkt_id', $product_id);
-			
-			return $attachment_id;
-			
-		} // public function addImageToProduct($file, $product_id)
-	
-		/**
-		 * Gibt die IDs der AnhÃ€nge zurÃŒck (Alle Bilder eines Produkts)
-		 * Beachtet die Reihenfolge aus der Spalte "postids"
-		 *
-		 * - Alle Bilder anhand des ProduktKeys:
-		 * getAttachmentIDs('pv_1|1:1|2:3');
-		 *
-		 * - Alle gesetzten Bilder einer speziellen Variation (Nur gesetzte in Reihenfolge)
-		 * - Hier darf $product_key nur die ID enthalten
-		 * getAttachmentIDs(1, 2)
-		 *
-		 * - Alle Bilder einer speziellen Variation (In Reihenfolge)
-		 * - Hier darf $product_key nur die ID enthalten
-		 * getAttachmentIDs(1, 2, true)
-		 *
-		 *
-		 * @author Daschmi
-		 * @param String $product_key
-		 * @return array
-		 * @throws \wpsg\Exception
-		 */
-		public function getAttachmentIDs($product_key, $vari_id = false, $all = false, $hideGlobalVariationImages = false) {
-			
-			$product_id = $this->shop->getProduktID($product_key);
-		 
-			$arAttachmentIDs = $this->db->fetchAssocField("
-				SELECT 
-					P.`ID` 
-			  	FROM 
-			  		`".$this->shop->prefix."postmeta` AS PM
-			  		 	LEFT JOIN `".$this->shop->prefix."posts` AS P ON (PM.`post_id` = P.`ID`)
-			  	WHERE 
-			  		PM.`meta_key` = 'wpsg_produkt_id' AND 
-			  		PM.`meta_value` = '".wpsg_q($product_id)."' AND
-			  		P.`ID` IS NOT NULL
-			");
-
-            // Keine Sortierung, dann nach IDs, Sortierung kommt weiter unten
-            asort($arAttachmentIDs);
-            
-			// Die Sortierung steht in der Spalte postids im Produkt
-			$postids = $this->db->fetchOne("SELECT `postids` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."' ");
-
-			if (strpos(($postids??''), ',') !== false) {
-				
-				$arPostIDsOrder = explode(',', $postids);
-				 
-				// Die Elemente in der Reihenfolge aus $arPostIDsOrder, die auch in $arAttachmentIDs vorkommen
-				$arAttachmentIDsIntersect = array_intersect($arPostIDsOrder, $arAttachmentIDs);
-				
-				// Elemente, die in $arAttachment drin sind, aber nicht in $arPostIDsOrder
-				$arDiff = array_diff($arAttachmentIDs, $arPostIDsOrder);
-				$arAttachmentIDs = $arAttachmentIDsIntersect + $arDiff;
-
-
-			}
-
-
-			// Jetzt sind in $arAttachmentIDs alle Bilder dieses Produktes
-			if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($product_key))) {
-
-				// Bei einem Variantenprodukt muss ich jetzt noch filtern ...
-				$arVariInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($product_key));
-
-				return array_values($arVariInfo['images']);
-                                
-			} else if ($this->shop->hasMod('wpsg_mod_productvariants') && wpsg_isSizedInt($vari_id)) {
-
-				// Daten der Produktvariation laden
-				$row = $this->db->fetchRow("SELECT `images`, `images_set` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `product_id` = '".wpsg_q($product_id)."' AND `variation_id` = '".wpsg_q($vari_id)."' ");
-				
-				if ($row !== null) {
-					
-					list($images, $images_set) = array_values($this->db->fetchRow("SELECT `images`, `images_set` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `product_id` = '".wpsg_q($product_id)."' AND `variation_id` = '".wpsg_q($vari_id)."' "));
-					
-				} else {
-					
-					$images = '';
-					$images_set = '';
-					
-				}
-
-				$arAttachmentIDsProductVari = explode(',', $images);
-
-				// Die Elemente, in der Reihenfolge aus $arAttachmentIDs. die auch in $arAttachmentIDsProductVari enthalten sind
-				$arAttachmentIDsIntersect = array_intersect($arAttachmentIDsProductVari, $arAttachmentIDs);
-
-				// Die Elemente, die in $arAttachment drin sind, aber nicht in $arAttachmentIDsProductVari
-				$arDiff = array_diff($arAttachmentIDs, $arAttachmentIDsProductVari);
-				$arAttachmentIDs = $arAttachmentIDsIntersect + $arDiff;
-				 	
-				if ($all === true) {
-					
-					return array_values($arAttachmentIDs);
-					
-				} else {
-					
-					// Jetzt noch aus der Reihenfolge die gesetzten filtern					
-					$arSet = wpsg_trim(explode(',', $images_set));
-					$arAttachmentIDsReturn = array();
-					
-					foreach ($arSet as $attachment_id) {
-						
-						if (array_search($attachment_id, $arAttachmentIDs)) $arAttachmentIDsReturn[] = $attachment_id;
-						
-					}
-					
-					return array_values($arAttachmentIDsReturn);
-					
-				}
-				
-			} else if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProduct', array($product_key))) {
-
-				if (!$hideGlobalVariationImages) {
-
-					// Globale Bilder hinzufÃŒgen
-					$vari_data = $this->shop->callMod('wpsg_mod_productvariants', 'getVariants', [$this->shop->getProduktID($product_key), true, true, true]);
-
-					foreach ($vari_data as $variant_id => $variant_data) {
-
-						foreach ($variant_data['arVariation'] as $variation_id => $variation_data) {
-
-							$arAttachmentIDs = wpsg_trim(array_unique(array_merge(
-								$arAttachmentIDs, $variation_data['images_global']
-							)));
-						}
-
-					}
-
-				}
-
-			}
-
-			$arAttachmentIDs = array_filter($arAttachmentIDs, function($attachment_id) { return get_post_status($attachment_id) === 'publish'; });
-
-			return array_values($arAttachmentIDs); 
-			
-		} // public function getAttachmentIDs($product_id)
-
-        /* Backend Funktionen */
-
-        /**
-         * Zeichnet die Liste der Bilder fÃŒr das Backend der Produktverwaltung
-         * @param $product_id
-         */
-        public function getProductListBackend($product_id, $size = 'thumbnail') {
-            
-            $this->shop->view['productImages'] = $this->getAttachmentIDs($product_id, false, false, true);
-
-			return $this->shop->render(WPSG_PATH_VIEW.'/produkt/images_list.phtml', false);
-            
-        } // public function getProductListBackend($product_id)
-        
-    } // class wpsg_imagehandler
Index: b/wpsg_remoteconnection.class.php
===================================================================
--- /lib/wpsg_remoteconnection.class.php	(revision 8528)
+++ 	(revision )
@@ -1,52 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 16.11.2016
-     * Time: 10:31
-     */
-
-    abstract class wpsg_remoteconnection
-    {
-   
-        /* Statische Funktionen */
-        
-        public static function handleConenctionString($strConnectionString, $filename, $file, $con_type = FTP_ASCII)
-        {
-            
-            if (preg_match('/^ftp/', $strConnectionString))
-            {
-                
-                $arPath = explode('/', $strConnectionString);
-                $arConnection = explode('@', $arPath[2]);
-                $arAccess = explode(':', $arConnection[0]);
-                
-                $host = $arConnection[1];
-                $username = $arAccess[0];
-                $password = $arAccess[1];
-                
-                $path = implode('/', array_slice($arPath, 3));
-                                
-                $connection = ftp_connect($host);                
-                if ($connection === false) throw new \Exception(wpsg_translate(__('Konnte keine Verbindung zu #1# aufbauen. (Host)', 'wpsg'), $host));
-                
-                $login_result = ftp_login($connection, $username, $password);
-                if ($login_result === false) throw new \Exception(wpsg_translate(__('Konnte keine Verbindung zu #1# aufbauen. (Zugangsdaten)', 'wpsg'), $host));
-                
-                ftp_pasv($connection, true);
-                
-                $trans = ftp_put($connection, $path.'/'.$filename, $file, $con_type);
-                
-                ftp_close($connection);
-                
-                return true;
-                
-            }
-            
-            return false;
-            
-        } // public static function handleConenctionString($connection, $file)
-        
-    } // class wpsg_mod_remoteconnection
-
-?>
Index: /model/wpsg_country.class.php
===================================================================
--- /model/wpsg_country.class.php	(revision 8528)
+++ /model/wpsg_country.class.php	(revision 5261)
@@ -11,19 +11,13 @@
 		 * LÃ€dt die Daten eines Landes
 		 */
-		public function load($country_id) {
+		public function load($country_id)
+		{
 			
 			parent::load($country_id);
 			
-			$this->data = $this->db->fetchRow("
-				SELECT
-					L.*, VZ.`shippingpreset`
-				FROM 
-				    `".WPSG_TBL_LAND."` AS L
-				        LEFT JOIN `".WPSG_TBL_VZ."` AS VZ ON (VZ.`id` = L.`vz`) 
-				WHERE 
-					L.`id` = '".wpsg_q($country_id)."' 
-			");
+			$this->data = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($country_id)."' ");
 			
-			if (!wpsg_isSizedArray($this->data) || $this->data['id'] != $country_id || !wpsg_isSizedInt($this->data['id'])) {
+			if ($this->data['id'] != $country_id || !wpsg_isSizedInt($this->data['id']))
+			{
 				
 				return false;
@@ -34,31 +28,4 @@
 				
 		} // public function load($deliverynote_id)
-
-		/**
-		 * Gibt das Kuerzel des Landes zurÃŒck
-		 * @return mixed|null
-		 */
-		public function getShorttext()
-		{
-				
-			return __($this->kuerzel, 'wpsg');
-				
-		} // public function getShorttext()
-		
-		public function getShippingZoneId() /* :int */ {
-			
-			return intval($this->__get('vz'));
-			
-		}
-		
-		/**
-		 * LÃ¶scht das Land
-		 */
-		public function delete()
-		{
-
-			$this->db->Query("DELETE FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->id)."' ");
-
-		} // public function delete()
 		
 		/**
@@ -72,9 +39,10 @@
 		} // public function getName()
 		
-		public function getTax($tax_group) {
+		public function getTax($tax_group)
+		{						
 
-			if ($tax_group == 'e' || !$this->isLoaded() || !array_key_exists('mwst_'.$tax_group, $this->data)) return 0;
+			if ($tax_group == 'e' || !array_key_exists('mwst_'.$tax_group, $this->data)) return 0;
 								
-			return $this->data['mwst_'.$tax_group]??0;
+			return $this->data['mwst_'.$tax_group];
 						
 		} // public function getTax($tax_group)
@@ -129,14 +97,4 @@
 		} // public static function find($arFilter = array())
 		
-		public static function getCountryIDFromCode($code)
-		{
-			
-			$id = $GLOBALS['wpsg_db']->fetchOne("SELECT `id` FROM `".WPSG_TBL_LAND."` WHERE LOWER(`kuerzel`) = LOWER('".wpsg_q($code)."') ");
-			
-			if (wpsg_isSizedInt($id)) return $id;
-			else return false;
-			
-		} // public static function getCountryIDFromCode($code)
-		
 	} // class wpsg_country extends wpsg_model 
 
Index: /model/wpsg_customer.class.php
===================================================================
--- /model/wpsg_customer.class.php	(revision 8528)
+++ /model/wpsg_customer.class.php	(revision 5261)
@@ -4,152 +4,20 @@
 	 * Model fÃŒr einen Kunden
 	 */
-	class wpsg_customer extends wpsg_model {
-		
-		private $adress_data;
-		public $data;
+	class wpsg_customer extends wpsg_model
+	{
 		
 		/**
 		 * LÃ€dt die Kundendaten aus der Datenbank
 		 */
-		public function load($customer_id) {
+		public function load($customer_id)
+		{
 			
 			parent::load($customer_id);
 			
-			$this->data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($customer_id)."' ");
-			
-			if (wpsg_isSizedInt($this->data['adress_id'])) $this->adress_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($this->data['adress_id'])."' ");
-			else $this->adress_data = false;
+			$this->data = $this->db->fetchRow("SELECT K.* FROM `".WPSG_TBL_KU."` AS K WHERE K.`id` = '".wpsg_q($customer_id)."' ");
 			
 			return true;
 			
 		} // public function load($id)
-
-		public function getCustomerVariables() {
-
-			$return = [];
-
-			$custom = @unserialize($this->data['custom']);
-
-			if (wpsg_isSizedArray($custom)) {
-
-				$arRequired = $this->shop->loadPflichtFeldDaten();
-
-				foreach ($custom as $i => $value) {
-
-					$return[$i] = [
-						'label' => $arRequired['custom'][$i]['name']??'Unbekannte Kundenvariable',
-						'typ' => intval($arRequired['custom'][$i]['typ']??0),
-						'value' => $value
-					];
-
-					if ($return[$i]['typ'] === 2) {
-
-						if (intval($return[$i]['value']) === 1) $return[$i]['value'] = __('Ja', 'wpsg');
-						else if (intval($return[$i]['value']) === 0) $return[$i]['value'] = __('Nein', 'wpsg');
-						else $return[$i]['value'] = __('Keine Angabe', 'wpsg');
-
-					} else if ($return[$i]['typ'] === 1) {
-
-						if (intval($return[$i]['value']) === -1) $return[$i]['value'] = __('Keine Auswahl', 'wpsg');
-
-					}
-
-				}
-
-			}
-
-			return $return;
-
-		}
-
-        public function anonymize() {
-		    
-		    $arOrder = wpsg_Order::find(['k_id' => $this->id]);
-		    $arAdressID = [];
-		    
-		    foreach ($arOrder as $oOrder) {
-		        
-		        if ($oOrder->adress_id > 0) $arAdressID[] = $oOrder->adress_id;
-		        if ($oOrder->shipping_adress_id > 0) $arAdressID[] = $oOrder->shipping_adress_id;
-		     
-            }
-            
-            $arAdressID = array_unique($arAdressID);
-		    
-		    if (wpsg_isSizedArray($arAdressID)) {
-		        
-		        $this->db->UpdateQuery(WPSG_TBL_ADRESS, [
-		            'title' => '',
-                    'name' => '----',
-                    'vname' => '----',
-                    'firma' => '----',
-                    'fax' => '----',
-                    'strasse' => '----',
-                    'nr' => '----',
-                    'plz' => '----',
-                    'ort' => '----',
-                    'land' => '----',
-                    'tel' => '----',
-                ], " `id` IN (".wpsg_q(implode(',', $arAdressID)).") ");
-		        
-            }
-            
-            if (intval($this->wp_user_id) > 0) {
-
-                wp_delete_user($this->wp_user_id);
-		        
-            }
-            
-            $this->db->UpdateQuery(WPSG_TBL_KU, [
-                'paypal_payer_id' => '----',
-                'geb' => '0000-00-00',
-                'email' => '----',
-                'ustidnr' => '----',
-                'custom' => '----',
-                'passwort_saltmd5' => '',
-                'comment' => '',
-                'wp_user_id' => '',
-                'group_id' => '',
-                'wpsg_mod_statistics_long' => '----',
-                'wpsg_mod_statistics_lat' => '----',
-                'deleted' => '1',
-                'status' => '-1',
-                'anonymized' => 'NOW()'
-            ], " `id` = '".wpsg_q($this->id)."' ", true);
-		    
-        } // public function anonymize()
-        
-		/**
-		 * Aktuallisiert den Adressdatensatz
-		 * @param Array $adress_data (Quoted!)
-		 */
-		public function updateAdress($adress_data)
-		{
-		
-			if (!wpsg_isSizedInt($this->data['adress_id']))
-			{
-					
-				// Es kann sein, dass zu einem Kunden noch kein Adressdatensatz existiert, dann anlegen
-				$adress_data['cdate'] = 'NOW()';
-		
-				$adress_id = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adress_data);
-		
-				$this->db->UpdateQuery(WPSG_TBL_KU, array(
-					'adress_id' => wpsg_q($adress_id)
-				), " `id` = '".wpsg_q($this->id)."' ");
-		
-				$this->data['adress_id'] = $adress_id;
-		
-			}
-			else
-			{
-		
-				$this->db->UpdateQuery(WPSG_TBL_ADRESS, $adress_data, " `id` = '".wpsg_q($this->data['adress_id'])."' ");
-		
-			}
-				
-			$this->adress_data = $adress_data;
-				
-		} // public function updateAdress($adress_data)
 		
 		/**
@@ -161,5 +29,5 @@
 		{
 			
-			if (preg_match('/Frau/i', $this->getTitle()))
+			if (preg_match('/Frau/i', $this->title))
 			{
 				
@@ -175,32 +43,4 @@
 			
 		} // public function getGender()
-		
-		/**
-		 * Gibt die Anrede zurÃŒck
-		 */
-		public function getTitle()
-		{
-			
-			$title = "";
-			
-			if ($this->adress_data === false) $title = wpsg_getStr($this->data['title']);
-			else $title = wpsg_getStr($this->adress_data['title']);
-			
-			$arAnrede = explode('|', $this->shop->get_option('wpsg_admin_pflicht')['anrede_auswahl']);
-			if ($title < 0) return '';
-			else return @$arAnrede[$title];
-			
-		} // public function getTitle()
-		
-		/**
-		 * Gibt die Firma zurÃŒck
-		 */
-		public function getCompany()
-		{
-			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['firma']);
-			else return $this->adress_data['firma']; 
-			
-		} // public function getCompany()
 		
 		/**
@@ -211,9 +51,8 @@
 		{
 			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['vname']);
-			else return $this->adress_data['vname'];
+			return $this->vname;
 			
 		} // public function getFirstname()
-		 
+		
 		/**
 		 * Gibt den Namen des Kunden zurÃŒck
@@ -223,58 +62,21 @@
 		{
 			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['name']);
-			else return $this->adress_data['name'];
+			return $this->name;
 			
 		} // public function getName()
-				
-		/**
-		 * Gibt die Telefonnummer zurÃŒck
-		 */
-		public function getPhone() {
-			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['tel']);
-			else return $this->adress_data['tel']??''; 
-			
-		} // public function getPhone()
-		
-		/**
-		 * Gibt die Fax Nummer zurÃŒck
-		 */
-		public function getFax()
-		{
-			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['fax']);
-			else return $this->adress_data['fax']; 
-			
-		} // public function getFax()
-				
-		/**
-		 * @param $trimHnr Wenn true, dann wird versucht die Hausnummer abzutrennen (Wenn Hnr nicht separat erfasst)
+		
+		/**
+		 * Versucht die Hausnummer von der StraÃe abzutrennen und nur die StraÃe zurÃŒckzugeben
 		 * @return String der Reine StraÃenname der Rechnungsadresse
 		 */
-		public function getStreetClear($trimHnr = false)
-		{
-			
-			if (wpsg_isSizedInt($this->shop->get_option('wpsg_showNr')) && $trimHnr === true)
-			{
-				
-				if ($this->adress_data === false) $street = wpsg_getStr($this->data['strasse']);
-				else $street = $this->adress_data['strasse'];
-				
-				return preg_replace('/\040+\d+$/', '', $street);
-				
-			}
-			else
-			{
-				
-				if ($this->adress_data === false) return wpsg_getStr($this->data['strasse']);
-				else return $this->adress_data['strasse'];
-				
-			}
+		public function getStreetClear()
+		{
+			
+			return preg_replace('/\040+\d+$/', '', $this->strasse);
 			
 		} // public function getStreetClear() 	
 		
 		/**
-		 * Gibt die StraÃe (inkl. Hausnummer) des Kunden zurÃŒck
+		 * Gibt die StraÃe des Kunden zurÃŒck
 		 * @return String StraÃe des Kunden
 		 */
@@ -282,7 +84,6 @@
 		{
 			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['strasse']);
-			else return rtrim($this->adress_data['strasse'].' '.$this->adress_data['nr']);
-						
+			return $this->strasse;
+			
 		} // public function getStreet()
 		
@@ -294,12 +95,5 @@
 		{
 			
-			if (wpsg_isSizedInt($this->shop->get_option('wpsg_showNr')))
-			{
-				
-				return $this->nr;
-				
-			}
-			
-			return preg_replace('/(.*)\040/', '', $this->strasse??'');
+			return preg_replace('/(.*)\040/', '', $this->strasse);
 			
 		} // public function getStreetNr()
@@ -312,6 +106,5 @@
 		{
 			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['plz']);
-			else return $this->adress_data['plz'];
+			return $this->plz;
 			
 		} // public function getZip()
@@ -324,55 +117,8 @@
 		{
 			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['ort']);
-			else return $this->adress_data['ort'];
+			return $this->ort;
 			
 		} // public function getCity()
-				
-		/**
-		 * Gibt die ID des Landes zurÃŒck
-		 * @return \Integer ID des Landes
-		 */
-		public function getCountryID()
-		{
-			
-			if ($this->adress_data === false) return wpsg_getStr($this->data['land']);
-			else return $this->adress_data['land']; 
-			
-		} // public function getCountryID()
-		
-		/**
-		 * Gibt das KÃŒrzel des Landes zurÃŒck
-		 * In der Regel sollte es dem ISO Code entsprechen
-		 */
-		public function getCountryKuerzel()
-		{
-			
-			return $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->getCountryID())."' ");
-			
-		} // public function getCountryKuerzel()
-		
-		/**
-		 * Gibt den Namen des Landes zurÃŒck
-		 */
-		public function getCountryName()
-		{
-			 
-			return $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->getCountryID())."' ");
-			
-		} // public function getCountryName()
- 		
-		/**
-		 * Darstellung des Kunden
-		 */
-		public function getLabel()
-		{
-
-			return trim($this->getFirstname().' '.$this->getName());
-
-		} // public function getLabel()
-
-		/** Gibt die Kundennummer zurÃŒck */
-		public function getNr() { return $this->knr; } // public function getNr()
-    
+		
 		/**
 		 * Gibt das Geburtsdatum zurÃŒck
@@ -397,19 +143,24 @@
 			
 		} // public function getBirthdate()
-		
-		/**
-		 * Gibt die optionale E-Mail Adresse fÃŒr eRechnungen zurÃŒck
-		 * @return string|null
-		 */
-		public function getEMailEInvoice(): ?string {
-			
-			if (!$this->isLoaded()) return '';
-			
-			$email_einvoice = $this->__get('email_einvoice');
-			
-			if (trim($email_einvoice) !== '' && filter_var($email_einvoice, FILTER_VALIDATE_EMAIL)) return $email_einvoice;
-			else return null;
-			
-		}
+
+		/**
+		 * Gibt die Telefonnummer zurÃŒck
+		 */
+		public function getPhone()
+		{
+			
+			return $this->tel;
+			
+		} // public function getPhone()
+		
+		/**
+		 * Gibt die Fax Nummer zurÃŒck
+		 */
+		public function getFax()
+		{
+			
+			return $this->fax;
+			
+		} // public function getFax()
 		
 		/**
@@ -454,80 +205,47 @@
 			
 		} // public function getOrderAmount($order_status = false)
-
-		/**
-		 * Gibt die Anzahl der Bestellungen des Kunden zurÃŒck
-		 */
-		public function getOrderCount()
-		{
-
-			if ($this->shop->get_option('wpsg_showincompleteorder') != '1')
-			{
-				$stat = array();
-				foreach ($this->shop->arStatus as $k => $s)
-				{
-					if ($k != wpsg_ShopController::STATUS_UNVOLLSTAENDIG) $stat[] = $k;
-				}
-				return wpsg_order::count(array('k_id' => $this->id, 'status' => $stat));
-			}
-			else
-				return wpsg_order::count(array('k_id' => $this->id));
-
-		} // public function getOrderCount()
-
-		public function delete() {
-			
-			// Kundendatensatz lÃ¶schen
-			$this->db->UpdateQuery(WPSG_TBL_KU, array('deleted' => '1'), " `id` = '".wpsg_q($this->id)."' ");
-			
-		} // public function delete()
-		
-		/* Statische Funktionen */
-
-		/**
-		 * ZÃ€hlt die Bestellungen anhand des Filters
-		 */
-		public static function count($arFilter)
-		{
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					(
-						SELECT
-						  	DISTINCT K.`id`
-						FROM
-							`".WPSG_TBL_KU."` AS K
-							".$strQueryJOIN."
-						WHERE
-							1
-							".$strQueryWHERE." 
-						HAVING
-							1
-							".$strQueryHAVING."											
-					) AS innerSelect
-			";
-
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-
-		} // public static function count($arFilter)
-
-		public static function find($arFilter = array()) {
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strLimit = "";
-
-			if (wpsg_isSizedArray($arFilter['limit'])) $strLimit = "LIMIT ".wpsg_q($arFilter['limit'][0]).", ".wpsg_q($arFilter['limit'][1]);
+		
+		/**
+		 * Gibt die ID des Landes zurÃŒck
+		 * @return \Integer ID des Landes
+		 */
+		public function getCountryID()
+		{
+			
+			return $this->land;
+			
+		} // public function getCountryID()
+		
+		/**
+		 * Gibt das KÃŒrzel des Landes zurÃŒck
+		 * In der Regel sollte es dem ISO Code entsprechen
+		 */
+		public function getCountryKuerzel()
+		{
+			
+			return $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->getCountryID())."' ");
+			
+		} // public function getCountryKuerzel()
+		
+		/**
+		 * Gibt den Namen des Landes zurÃŒck
+		 */
+		public function getCountryName()
+		{
+			
+			return $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->getCountryID())."' ");
+			
+		} // public function getCountryName()
+ 
+		public static function find($arFilter = array())
+		{
+			
+			list($strQueryWHERE, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
 			
 			$strQuery = "
 				SELECT
 					K.`id`
-					".$strQuerySELECT."
 				FROM
 					`".WPSG_TBL_KU."` AS K
-					    ".$strQueryJOIN."
 				WHERE
 					1
@@ -538,7 +256,6 @@
 				ORDER BY
 					".$strQueryORDER."		
-				".$strLimit."
-			";
-			
+			";	
+			 
 			$arCustomerID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery);
 			$arReturn = array();
@@ -555,87 +272,22 @@
 		} // public function find($arQuery = array())
 		
-        public static function hasFilteR($arFilter = []) {
-
-            list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-            
-            if (wpsg_isSizedString($strQueryWHERE) || wpsg_isSizedString($strQueryHAVING)) return true;
-            else return false;
-		    
-        }
-        
-		public static function getQueryParts($arFilter = array()) {
-
-			$strQuerySELECT = "";
+		public static function getQueryParts($arFilter = array())
+		{
+				
 			$strQueryWHERE = "";
-			$strQueryJOIN = "";
 			$strQueryHAVING = "";
-            
-            $bJoinAdress = false;            
-
-			$strQuerySELECT .= ",
-				(SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` AS O WHERE O.`k_id` = K.`id` AND O.`status` != '".wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)."') AS order_count,
-				(SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` AS O WHERE O.`k_id` = K.`id` AND O.`status` = '".wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)."') AS order_count_incomplete
-			";
-
-			if (wpsg_isSizedString($arFilter['email'])) {
+			$strQueryORDER = " K.`id` ASC ";
+			 
+			if (wpsg_isSizedString($arFilter['email']))
+			{
 				
 				$strQueryWHERE .= " AND K.`email` = '".wpsg_q($arFilter['email'])."' ";
 				
 			}
-			
-			if (wpsg_isSizedInt($arFilter['group_id'])) $strQueryWHERE .= " AND `group_id` = '".wpsg_q($arFilter['group_id'])."' ";
-
-			if (wpsg_isSizedString($arFilter['s'])) {
-
-			    $bJoinAdress = true;
-			    
-				$strQueryWHERE .= " 
-					AND (
-						CA.`name` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						CA.`vname` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						CA.`firma` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						K.`email` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						K.`id` = '".wpsg_q($arFilter['s'])."' OR
-						K.`knr` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						K.`comment` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						K.`custom` LIKE '%".wpsg_q($arFilter['s'])."%'
-					)
-				";
-				
-			}
-			
-			if (!wpsg_isTrue($arFilter['showDeleted'])) $strQueryWHERE .= " AND `deleted` != '1' ";
-
-			//$strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_KU."` AS C ON (C.`id` = O.`k_id`) ";
-			//$strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = C.`adress_id`) ";
-			
-			//if (wpsg_isSizedString($arFilter['order'], 'nr')) { $strQueryORDER = " K.`knr`, K.`vname`, K.`name` "; }
-			if (wpsg_isSizedString($arFilter['order'], 'nr')) { $strQueryORDER = " K.`knr` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'adress')) { $bJoinAdress = true; $strQueryORDER = " CONCAT(CA.`plz`, CA.`ort`) "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'status')) { $strQueryORDER = " order_count "; }
-			else $strQueryORDER = " K.`id` ";
-            
-			// Richtung
-			if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strQueryORDER .= " DESC ";
-			else $strQueryORDER .= " ASC ";
-
-            if ($bJoinAdress)
-            {
-                
-                $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = K.`adress_id`) ";
-                
-            }
-            
-			return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER);
+				
+			return array($strQueryWHERE, $strQueryHAVING, $strQueryORDER);
 				
 		} // public function getQueryParts($arFilter = array())
-
-
-		public function getLeitwegId(): string {
-
-			return $this->__get('leitweg_id')??'';
-
-		}
-
+		
 	} // class wpsg_order extends wpsg_model
 	
Index: del/wpsg_exception.class.php
===================================================================
--- /model/wpsg_exception.class.php	(revision 8528)
+++ 	(revision )
@@ -1,81 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 18.05.2017
-     * Time: 08:57
-     */
-
-    namespace wpsg;
- 
-    class Exception extends \Exception
-    {
-        
-        const TYP_UNEXPECTED = 0;
-        const TYP_DB = 1;
-        const TYP_EXT_URL = 2;
-         
-        private $typ = null;
-        private $data = null;
-        
-        public function __construct($message, $typ = null, $arData = array(), $code = 0, ?Exception $previous = null) {
-                        
-            parent::__construct($message, $code, $previous);
-            
-            if ($typ === null) $typ = self::TYP_UNEXPECTED;
-            
-            $this->typ = $typ;
-            $this->data = $arData;
-            
-        } // public function __construct($message, $code = 0, Exception $previous = null)
-
-        public function getData()
-        {
-
-            return $this->data;
-
-        }
-
-        public function getTypLabel() 
-        {
-        
-            switch ($this->typ)
-            {
-                
-                case self::TYP_UNEXPECTED: return __('Unerwartetes Programmverhalten', 'wpsg'); break;
-                case self::TYP_DB: return __('Datenbankfehler', 'wpsg'); break;
-				case self::TYP_EXT_URL: return __('Fehler bei externem URL Aufruf', 'wpsg'); break;
-                
-                default: return __('Ungekannter Fehlertyp', 'wpsg'); break;
-                
-            } // switch ($this->_typ)
-            
-        } // public function getTypLabel()
-		
-		public static function getMethodNotFoundException($func_name = "") {
-        	
-        	return new \Exception(wpsg_translate(__('Funktion (#1#) existiert nicht', 'wpsg'), $func_name));
-        	
-		}
-		
-		public static function getSanitizeException() {
-        	
-			debug_print_backtrace();
-			
-        	return new \Exception('Parameterfehler');
-        	
-		}
-		
-		public static function getInvalidValueException() {
-        	
-        	return new \Exception('Aufrufsfehler');
-        	
-		}
-
-		public static function getInvalidFunctionException() {
-
-            return new \Exception('UngÃŒltiger Aufruf');
-
-        }
-        
-    } // class exception extends \Exception
Index: /model/wpsg_model.class.php
===================================================================
--- /model/wpsg_model.class.php	(revision 8528)
+++ /model/wpsg_model.class.php	(revision 5261)
@@ -5,11 +5,10 @@
 	 * @author Daschmi
 	 */
-	class wpsg_model {
+	class wpsg_model
+	{
 		
 		/** @var array */
 		public static $_objCache = array();
-
-		private $arMeta = null;
-
+		
 		/** @var wpsg_db */
 		var $db = false;
@@ -34,14 +33,4 @@
 		} // public function __construct()
 		
-		public function getId() {
-
-		    $id = 0;
-
-            if (isset($this->data['id'])) $id = intval($this->data['id']);
-
-            return $id;
-			
-		}
-		
 		/**
 		 * LÃ€dt Daten des Objekts
@@ -53,22 +42,13 @@
 			
 		} // public function load($id)
-
-		/**
-		 * PrÃŒft ob das Objekt korrekt geladen wurde
-		 * Wenn ein Datensatz in der DB nicht existiert, wird ein leeres Dummy Objekt geladen
-		 */
-		public function isLoaded() 
-		{
-			
-			return wpsg_isSizedInt($this->data['id']);
-			
-		} // public function isLoaded() 
 		
 		/**
 		 * Etwas im Datenarray ablegen
 		 */
-		public function __get($name) {
+		public function __get($name)
+		{
 
-			if (array_key_exists($name, (array)$this->data)) {
+			if (array_key_exists($name, (array)$this->data))
+			{
 				
 				return $this->data[$name];
@@ -79,5 +59,4 @@
 			
 		} // public function __get($name)
-		 
 		
 		/**
@@ -94,159 +73,27 @@
 		 * Gibt eine Instanz dieses Models zurÃŒck anhand des PrimÃ€rschlÃŒssels
 		 * @param int $id
-		 * @param bool $noCache
-		 * @return static
 		 */
-		public static function getInstance($id, $noCache = false) {
-						
+		public static function getInstance($id, $noCache = false)
+		{
+				
 			$class_name = get_called_class();
-			
-			if (wpsg_isSizedArray($id)) {
+			 
+			if (!array_key_exists($class_name.'_'.$id, self::$_objCache) || $noCache === true)
+			{
 				
-				$arReturn = [];
+				$oObject = new $class_name(); 
+				$bLoad = $oObject->load($id);
+
+				if (!$bLoad) return false;
+		
+				self::$_objCache[$class_name.'_'.$id] = $oObject;
+		
+			}
 				
-				foreach ($id as $_id) {
-					
-					$arReturn[$_id] = self::getInstance($_id);
-					
-				}
+			return self::$_objCache[$class_name.'_'.$id];
 				
-				return $arReturn;
+		} // public abstract static function getInstance($id)
 				
-			} else if (is_array($id)) {
-				
-				return [];
-				
-			} else {
-				
-				if (!isset(self::$_objCache[$class_name]) || !array_key_exists($id, self::$_objCache[$class_name]) || $noCache === true) {
-										
-					$oObject = new $class_name();
-					$oObject->load($id);
-					
-					self::$_objCache[$class_name][$id] = $oObject;
-					
-				}
-				
-				return self::$_objCache[$class_name][$id];
-				
-			}
-			
-		} // public abstract static function getInstance($id)
-		
-		public static function clearCache($id = false) {
-			
-			$class_name = get_called_class();
-			
-			if ($id === false) {
-				
-				unset(self::$_objCache[$class_name]);
-				
-				self::$_objCache[$class_name] = [];
-				
-			}
-			else {
-				
-				unset(self::$_objCache[$class_name][$id]);
-				
-			}
-			
-		}
+	} // class wpsg_model
 
-        /**
-         * Setzt einen Wert in der META Tabelle
-         * @param $meta_key
-         * @param null $meta_value
-         * @throws \wpsg\Exception
-         */
-        public function setMeta($meta_key, $meta_value = null) {
-
-            $class = get_called_class();
-
-            if ($class::$_tableName === null) throw \wpsg\Exception::getInvalidValueException();
-            if (!wpsg_isSizedInt($this->id)) throw \wpsg\Exception::getInvalidValueException();
-
-            $target_id = intval($this->id);
-
-            if ($target_id <= 0) throw \wpsg\Exception::getInvalidValueException();
-
-            if (is_null($meta_value)) {
-
-                $this->db->Query("DELETE FROM `".WPSG_TBL_META."` WHERE `meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' AND `meta_table` = '".wpsg_q($class::$_tableName)."' ");
-
-            } else {
-
-                $nExistsID = $this->db->fetchOne("SELECT M.`id` FROM `".WPSG_TBL_META."` AS M WHERE M.`meta_table` = '".wpsg_q($class::$_tableName)."' AND M.`meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' ");
-
-				if (wpsg_isSizedInt(wpsg_ShopController::getShop()->get_option('wpsg_debugModus'))) {
-					
-					if ($class::$_tableName === 'WPSG_TBL_ORDER' && $meta_key === 'wpsg_mod_paypalapi_saleid') {
-						
-						$this->addLogEntry('Setze PayPal SaleID: '.$meta_value, json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3), JSON_PRETTY_PRINT));
-						
-					} else if ($class::$_tableName === 'WPSG_TBL_ORDER' && $meta_key === 'wpsg_mod_paypalapi_paymentid') {
-						
-						$this->addLogEntry('Setze PayPal PaymentID: '.$meta_value, json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3), JSON_PRETTY_PRINT));
-						
-					}
-					
-				}
-				
-                if (wpsg_isSizedInt($nExistsID)) {
-
-                    $this->db->UpdateQuery(WPSG_TBL_META, array(
-                        'meta_value' => wpsg_q($meta_value)
-                    ), " `id` = '".wpsg_q($nExistsID)."' ");
-
-                } else {
-
-                    $this->db->ImportQuery(WPSG_TBL_META, array(
-                        'target_id' => wpsg_q($this->id),
-                        'meta_table' => wpsg_q($class::$_tableName),
-                        'meta_key' => wpsg_q($meta_key),
-                        'meta_value' => wpsg_q($meta_value)
-                    ));
-
-                }
-				
-				if ($this->arMeta !== null) $this->arMeta[$meta_key] = $meta_value;
-
-            }
-
-            $this->arMeta = null;
-
-        } // public function setMeta($meta_key, $meta_value)
-
-        /**
-         * Gibt einen META Value zurÃŒck
-         */
-        public function getMeta($meta_key, $reload = false, $default = null) {
-
-            $class = get_called_class();
-
-            if ($class::$_tableName === null) throw \wpsg\Exception::getInvalidValueException();
-
-            if ($this->arMeta === null || $reload === true) {
-
-                $this->arMeta = $this->db->fetchAssocField("
-                    SELECT
-                        M.`meta_key`, M.`meta_value`
-                    FROM 
-                        `".WPSG_TBL_META."` AS M
-                    WHERE
-                        M.`meta_table` = '".wpsg_q($class::$_tableName)."' AND
-                        M.`target_id` = '".wpsg_q($this->getId())."' 
-                ", "meta_key", "meta_value");
-
-            }
-
-            if (array_key_exists($meta_key, $this->arMeta)) return $this->arMeta[$meta_key];
-            else {
-                
-                if ($default !== null) return $default;
-                else return '';
-                
-            }
-
-        } // public function getMeta($meta_key)
-
-	} // class wpsg_model
+?>
Index: /model/wpsg_news.class.php
===================================================================
--- /model/wpsg_news.class.php	(revision 8528)
+++ /model/wpsg_news.class.php	(revision 5261)
@@ -10,5 +10,5 @@
 		
 		/** URL fÃŒr den Feed */
-		private static $rss_url = 'https://api.maennchen1.de/feed/';
+		private static $rss_url = 'http://wpshopgermany.maennchen1.de/feed/';
 		
 		/** Limit fÃŒr die News */
@@ -27,5 +27,6 @@
 			$last_news = $GLOBALS['wpsg_sc']->get_option('wpsg_news_cache');
 			
-			if (!wpsg_isSizedInt($last_refresh) || !wpsg_isSizedArray($last_news) || ($last_refresh + self::$nRefreshDelay) <= time()) {
+			if (!wpsg_isSizedInt($last_refresh) || !wpsg_isSizedArray($last_news) || ($last_refresh + self::$nRefreshDelay) <= time())
+			{
 				 
 				return self::getLatestNewsFromRSS();
@@ -34,5 +35,5 @@
 			else
 			{
-
+			
 				return $last_news;
 				
@@ -45,58 +46,35 @@
 		 * Speichert die News gleichzeitig in den Cache und aktualisiert das Refresh Datum
 		 */
-		public static function getLatestNewsFromRSS() {
-
-            $wpsg_lastapifail = intval($GLOBALS['wpsg_sc']->get_option('wpsg_lastapifail', true));
-            $min_api_fail = 720;
-
-            if ($wpsg_lastapifail <= 0 || $wpsg_lastapifail < time() - 60 * $min_api_fail || isset($_REQUEST['force_check']) || wpsg_isSizedInt($_REQUEST['reload'])) {
-
-                try {
-
-                    $xml = new SimpleXMLElement($GLOBALS['wpsg_sc']->get_url_content(self::$rss_url));
-
-                } catch (\Exception $e) {
-
-                    $GLOBALS['wpsg_sc']->update_option('wpsg_lastapifail', strval(time()), true, false, WPSG_SANITIZE_INT);
-
-                    wpsg_ShopController::getShop()->addBackendError(__('Konnte News nicht laden.', 'wpsg'));
-
-                    return [];
-
-                }
-
-                $result = $xml->xpath('//item');
-
-                $count = 0; $arReturn = array();
-
-                foreach ($result as $node) {
-
-                    $count ++;
-
-						  $namespaces = $node->getNamespaces(true);
-						  
-                    $arReturn[] = array(
-                        'id' => strval($node->guid[0]),
-                        'title' => strval($node->title[0]),
-                        'url' => strval($node->link[0]),
-                        'date' => strtotime(strval($node->pubDate[0])),
-                        'teaser' => (string)$node->children($namespaces['content'])->encoded
-                    );
-
-                    if ($count >= self::$nLimit) break;
-
-                }
-
-                // News im Cache ablegen
-                $GLOBALS['wpsg_sc']->update_option('wpsg_news_cache', $arReturn, false, false, WPSG_SANITIZE_NONE);
-                $GLOBALS['wpsg_sc']->update_option('wpsg_news_cache_refresh', time(), false, false, WPSG_SANITIZE_NONE);
-
-                return $arReturn;
-
-            } else {
-
-                return [];
-
-            }
+		public static function getLatestNewsFromRSS()
+		{
+			
+			$xml = new SimpleXMLElement($GLOBALS['wpsg_sc']->get_url_content(self::$rss_url));
+			
+			$result = $xml->xpath('//item');
+			
+			$count = 0; $arReturn = array();
+			
+			foreach ($result as $node)
+			{
+				
+				$count ++;
+				
+				$arReturn[] = array(
+					'id' => strval($node->guid[0]),
+					'title' => strval($node->title[0]),
+					'url' => strval($node->link[0]),
+					'date' => strtotime(strval($node->pubDate[0])),
+					'teaser' => strval($node->description[0])						
+				);
+								
+				if ($count >= self::$nLimit) break;
+								
+			}
+			
+			// News im Cache ablegen
+			$GLOBALS['wpsg_sc']->update_option('wpsg_news_cache', $arReturn);
+			$GLOBALS['wpsg_sc']->update_option('wpsg_news_cache_refresh', time());
+									
+			return $arReturn;
 			
 		} // private static function getLatestNewsFromRSS()
@@ -150,12 +128,7 @@
 			{
 				
-				if (!self::isRead($news['id']))
-				{
-					
-					$nUnread ++;
-					
-				}
+				if (!self::isRead($news['id'])) $nUnread ++;
 				
-			} 
+			}
 			
 			return $nUnread;
@@ -184,17 +157,15 @@
 		 * 
 		 * @param String $news_id
-		 * @return mixed $news
+		 * @return Array $news
 		 */
-		public static function getNewsById($news_id) {
+		public static function getNewsById($news_id)
+		{
 			
-			$last_news = self::getLatestNews(); //$GLOBALS['wpsg_sc']->get_option('wpsg_news_cache');
+			$last_news = $GLOBALS['wpsg_sc']->get_option('wpsg_news_cache');
 			
-			if (wpsg_isSizedArray($last_news)) {
-			
-				foreach ($last_news as $news) {
+			foreach ($last_news as $news)
+			{
 				
-					if ($news['id'] == $news_id) return $news;
-				
-				}
+				if ($news['id'] == $news_id) return $news;
 				
 			}
Index: /model/wpsg_order.class.php
===================================================================
--- /model/wpsg_order.class.php	(revision 8528)
+++ /model/wpsg_order.class.php	(revision 5261)
@@ -4,11 +4,10 @@
 	 * Model fÃŒr eine Bestellung
 	 */
-	class wpsg_order extends wpsg_model {
+	class wpsg_order extends wpsg_model
+	{
 
-        static $_tableName = 'WPSG_TBL_ORDER';
-
-		/** @var bool wpsg_customer */
-		var $customer = false; // Kundenobjekt
-		
+		var $customer = false; // Kundenobjekt 
+		var $bShippingAdress = false; // Wenn true, dann gibt es eine separate Versandadresse 
+						
 		/* Klassenvariablen */
 		var $_innerEu = null;
@@ -16,28 +15,17 @@
 		var $_arOrderProducts = null;
 		
-		public $data = false;
-		public $adress_data = false;
-		public $shipping_adress_data = false;
-		
 		/**
 		 * LÃ€dt die Daten der Bestellung
 		 */
-		public function load($order_id) {
+		public function load($order_id)
+		{
 
 			parent::load($order_id);
-						
-			@$this->data = $this->shop->cache->loadOrder($order_id, true);
-			@$this->customer = $this->shop->cache->loadCustomerObject($this->data['k_id']);
-
-			if (is_array($this->data)) {
-
-			    $this->bShippingAdress = $this->shop->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array($this->data['k_id'], $order_id));
-				
-			    if (isset($this->data['id']) && ($this->data['id'] != $order_id)) throw new \wpsg\Exception(__('Die Daten eines Bestellobjekts konnten nicht geladen werden ', 'wpsg'));
-				
-			    if (wpsg_isSizedInt($this->data['adress_id'])) $this->adress_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($this->data['adress_id'])."' ");
-			    if (wpsg_isSizedInt($this->data['shipping_adress_id'])) $this->shipping_adress_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($this->data['shipping_adress_id'])."' ");
-
-            }
+			
+			@$this->data = &$this->shop->cache->loadOrder($order_id);
+			@$this->customer = &$this->shop->cache->loadCustomerObject($this->data['k_id']);			
+			$this->bShippingAdress = $this->shop->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array($this->data['k_id'], $order_id));
+			
+			if ($this->data['id'] != $order_id) $this->shop->throwErrorCode('100_1');
 
 			return true;
@@ -46,116 +34,7 @@
 		
 		/**
-		 * Aktualisiert die Versandadresse
-		 * @param $adress_data
-		 */
-		public function updateShippingAdress($adress_data)
-		{
-				
-			if (!wpsg_isSizedInt($this->data['shipping_adress_id']))
-			{
-		
-				// Es kann sein, dass zu einer Bestellung noch kein Adressdatensatz existiert, dann anlegen
-				$adress_data['cdate'] = 'NOW()';
-		
-				$adress_id = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adress_data);
-		
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
-					'shipping_adress_id' => wpsg_q($adress_id)
-				), " `id` = '".wpsg_q($this->id)."' ");
-		
-				$this->data['shipping_adress_id'] = $adress_id;
-		
-			}
-			else
-			{
-		
-				$this->db->UpdateQuery(WPSG_TBL_ADRESS, $adress_data, " `id` = '".wpsg_q($this->data['shipping_adress_id'])."' ");
-		
-			}
-				
-			$this->shipping_adress_data = $adress_data;
-				
-		} // public function updateShippingAdress($adress_data)
-		
-		/**
-		 * Aktuallisiert den Adressdatensatz
-		 * @param Array $adress_data (Quoted!)
-		 */
-		public function updateAdress($adress_data)
-		{
-			
-			$order_data = [];
-			
-			$insert = false;
-				
-			if (!wpsg_isSizedInt($this->data['adress_id']))
-			{
-		
-				$insert = true;
-		
-			}
-			else
-			{
-					
-				$adress_db_exists = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($this->data['adress_id'])."' ");
-		
-				if ($adress_db_exists != $this->data['adress_id']) $insert = true;
-		
-			}
-				
-			if ($insert === true)
-			{
-		
-				// Es kann sein, dass zu einer Bestellung noch kein Adressdatensatz existiert, dann anlegen
-				$adress_data['cdate'] = 'NOW()';
-		
-				$adress_id = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adress_data);
-				
-				$order_data['adress_id'] = wpsg_q($adress_id);
-		
-			}
-			else
-			{
-					
-				$this->db->UpdateQuery(WPSG_TBL_ADRESS, $adress_data, " `id` = '".wpsg_q($this->data['adress_id'])."' ");
-		
-			}
-				
-			if (isset($adress_data['land'])) {
-				
-				$oCountry = wpsg_country::getInstance($adress_data['land']);
-				
-				
-				
-				$order_data['target_country_id'] = wpsg_q($adress_data['land']);
-				$order_data['target_country_tax'] = wpsg_q($oCountry->mwst);
-				$order_data['target_country_tax_a'] = wpsg_q($oCountry->mwst_a);
-				$order_data['target_country_tax_b'] = wpsg_q($oCountry->mwst_b);
-				$order_data['target_country_tax_c'] = wpsg_q($oCountry->mwst_c);
-				$order_data['target_country_tax_d'] = wpsg_q($oCountry->mwst_d);
-			
-			}
-			
-			if (wpsg_isSizedArray($order_data)) {
-			
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, $order_data, " `id` = '".wpsg_q($this->id)."' ");
-				
-				foreach ($order_data as $k => $v) {
-					
-					$this->data[$k] = $v;
-					
-				}
-				
-			}
-			
-			$this->adress_data = $adress_data;
-				
-		} // public function updateAdress($adress_data)
-		
-		/**
 		 * Erstellt einen Eintrag im Bestellprotokoll
-		 * @param string $subject Text des Betreffs
-		 * @param string $text Text der protokolliert werden soll
-		 * @throws \wpsg\Exception
+		 * @param varchar $subject Text des Betreffs 
+		 * @param varchar $text Text der protokolliert werden soll
 		 */
 		public function log($subject, $text)
@@ -170,72 +49,116 @@
 			
 		} // public function log($subject, $text)
+		
+		/**
+		 * Gibt den letzten Log Eintrag zurÃŒck 
+		 */
+		public function getLastLogEntry()
+		{
+			
+			return $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_OL."` WHERE `o_id` = '".wpsg_q($this->id)."' ORDER BY `cdate` DESC, `id` DESC LIMIT 1 ");
+			
+		} // public function getLastLogEntry()
+		
+		/**
+		 * Setzt einen Wert in der META Tabelle 
+		 */
+		public function setMeta($meta_key, $meta_value)
+		{
+			
+			if (is_null($meta_value))
+			{
+				
+				$this->db->Query("DELETE FROM `".WPSG_TBL_META."` WHERE `meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' AND `meta_table` = 'WPSG_TBL_ORDER' ");
+				
+			}
+			else
+			{
+			
+				$nExistsID = $this->db->fetchOne("SELECT M.`id` FROM `".WPSG_TBL_META."` AS M WHERE M.`meta_table` = 'WPSG_TBL_ORDER' AND M.`meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' ");
+				
+				if (wpsg_isSizedInt($nExistsID))
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_META, array(					
+						'meta_value' => wpsg_q($meta_value)
+					), " `id` = '".wpsg_q($nExistsID)."' ");
+					
+				}
+				else
+				{
+					
+					$this->db->ImportQuery(WPSG_TBL_META, array(
+						'target_id' => wpsg_q($this->id),
+						'meta_table' => "WPSG_TBL_ORDER",
+						'meta_key' => wpsg_q($meta_key),
+						'meta_value' => wpsg_q($meta_value)
+					));
+					
+				}
+				
+			}
+			
+		} // public function setMeta($meta_key, $meta_value)
+		
+		/**
+		 * Gibt einen META Value zurÃŒck
+		 */
+		public function getMeta($meta_key)
+		{
+			
+			$meta_value = $this->db->fetchOne("SELECT M.`meta_value` FROM `".WPSG_TBL_META."` AS M WHERE M.`meta_table` = 'WPSG_TBL_ORDER' AND M.`meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' ");
+			
+			return $meta_value;
+			
+		} // public function getMeta($meta_key)
+		
+		/**
+		 * Gibt den Namen der Versandart zurÃŒck
+		 * Ist wichtig geworden, da die Versandart aus mehreren Versandarten zusammengesetzt sein kann
+		 * Die Methode getShippingName im ShopController funktioniert nur fÃŒr die Session wenn in arShipping 
+		 * schon die zusammengesetzt Versandart drin ist. Die Ãbersetzung ÃŒbernimmt aber die getShippingName im ShopController
+		 */
+		public function getShippingTypName()
+		{
 
-		public function getLog()
-		{
+			if (preg_match('/(.*)-(.*)/', $this->type_shipping))
+			{
+				
+				// Versandart ist zusammengesetzt
+				$arShippingKey = explode('-', $this->type_shipping);
+				$arShippingNames = array();
+				
+				foreach ($arShippingKey as $shipping_key)
+				{
 
-			return $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_OL."` WHERE `o_id` = '".wpsg_q($this->id)."' ORDER BY `cdate` DESC, `id` DESC ");
-
+					$arShippingNames[] = $this->shop->getShippingName($shipping_key);
+					
+				}
+				
+				return implode(' + ', $arShippingNames);
+				
+			}
+			else
+			{
+				
+				return $this->shop->getShippingName($this->type_shipping);
+				
+			}
+			
+		} // public function getShippingTypName()
+		
+		public function getPaymentTaxAmount()
+		{
+			
+			return wpsg_tf($this->mwst_payment);
+			
 		}
-
-		/**
-		 * Gibt den letzten Log Eintrag zurÃŒck 
-		 */
-		public function getLastLogEntry()
-		{
-			
-			return $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_OL."` WHERE `o_id` = '".wpsg_q($this->id)."' ORDER BY `cdate` DESC, `id` DESC LIMIT 1 ");
-			
-		} // public function getLastLogEntry()
-
-		public function getPaymentTaxAmount()
-		{
-			
-			return wpsg_tf($this->mwst_payment);
-			
-		}
-		
-		public function getShippingTaxAmount() {
+		
+		public function getShippingTaxAmount()
+		{
 			
 			return wpsg_tf($this->mwst_shipping);
 			
 		} // public function getShippingTaxAmount()
-
-		/**
-		 * Steuersatz z.B. 19.00 
-		 * @return void
-		 */
-		public function getShippingTaxValue() {
-			
-			if ($this->shipping_tax_key === '0') {
-					
-				return __('Anteilig', 'wpsg');
-					
-			} else {
-				
-				$oCountry = $this->getInvoiceCountry();
-				
-				if ($this->shipping_tax_key === 'a') return $oCountry->mwst_a; 
-				else if ($this->shipping_tax_key === 'b') return $oCountry->mwst_b; 
-				else if ($this->shipping_tax_key === 'c') return $oCountry->mwst_c; 
-				else if ($this->shipping_tax_key === 'd') return $oCountry->mwst_d; 
-				else return null;
-			
-			}
-			
-		}
-		
-		public function getToPay($brutto_netto = WPSG_BRUTTO) {
-						
-			if ($brutto_netto == WPSG_BRUTTO) {
-				
-				return wpsg_tf($this->data['topay_brutto']);
-				
-			} else {
-				
-				return wpsg_tf($this->data['topay_netto']);
-				
-			}
-			
-		}
 		
 		/**
@@ -245,47 +168,28 @@
 		public function getAmount($brutto_netto = WPSG_BRUTTO)
 		{
+						
+			//wpsg_debug($this->data['price_gesamt_netto'].":".$this->data['price_gesamt_brutto']);
 			
 			if ($brutto_netto == WPSG_BRUTTO)
 			{
-
-				if (isset($this->data['price_gesamt_brutto'])) return wpsg_tf($this->data['price_gesamt_brutto']);
-				
-			}
-			else
-			{
-			
-				if (isset($this->data['price_gesamt_netto'])) return wpsg_tf($this->data['price_gesamt_netto']);
+				
+				return wpsg_tf($this->data['price_gesamt_brutto']);
+				
+			}
+			else
+			{
+			
+				return wpsg_tf($this->data['price_gesamt_netto']);
 				
 			}
 			
 		} // public function getAmount()
-
-		/**
-		 * Gibt den Warenwert der Bestellung zurÃŒck 
-		 */
-		public function getAmountProductsum($brutto_netto = WPSG_BRUTTO)
-		{
-
-			foreach ($this->getOrderProducts() as $oOrderProduct) 
-			{
-				
-				$product_sum += $oOrderProduct->getPriceSum($brutto_netto);
-				
-			}
-
-			return wpsg_tf($product_sum);
-
-		}
 				
 		/**
 		 * Summe aller MwSt. BetrÃ€ge der Bestellung
 		 */
-		public function getTaxAmount() {
-			
-			$arCalculation = \wpsg\wpsg_calculation::getOrderCalculation($this->getId())->getCalculationArray();
-			
-			return $arCalculation['sum']['tax'];
-			
-			/*
+		public function getTaxAmount()
+		{
+				
 			$tax_return = 0;
 			
@@ -301,5 +205,4 @@
 			
 			return wpsg_tf($tax_return);
-			*/
 				
 		} // public function getTaxAmount()
@@ -307,8 +210,12 @@
 		public function getProductAmount($brutto_netto = WPSG_BRUTTO)
 		{
+				
+			//wpsg_debug($this->getAmount($brutto_netto));
+			//wpsg_debug($this->getShippingAmount($brutto_netto));
+			//wpsg_debug($this->getPaymentAmount($brutto_netto));
 			
 			return $this->getAmount($brutto_netto) - $this->getShippingAmount($brutto_netto) - $this->getPaymentAmount($brutto_netto); 
 				
-		} // public function getProductAmount($brutto_netto = WPSG_BRUTTO)
+		} // public function getAmount()
 		
 		/**
@@ -326,9 +233,6 @@
 		 * Gibt die Anzahl zurÃŒck, wie oft das Produkt in der Bestellung vorkommt
 		 */
-		public function getProductCount($product_id = null) {
-			
-			$strQueryWHERE = "";
-			
-			if ($product_id !== null) $strQueryWHERE .= " AND `p_id` = '".wpsg_q($product_id)."' ";
+		public function getProductCount($product_id)
+		{
 			
 			return $this->db->fetchOne("
@@ -338,13 +242,12 @@
 					`".WPSG_TBL_ORDERPRODUCT."`
 				WHERE
+					`p_id` = '".wpsg_q($product_id)."' AND
 					`o_id` = '".wpsg_q($this->id)."'
-					".$strQueryWHERE."
 			");
 			
-		}
+		} // public function getProductCount($product_id)
 		
 		/**
 		 * Gibt einen Array mit allen bestellten Produkten zurÃŒck
-         * @return wpsg_order_product[]
 		 */
 		public function getOrderProducts()
@@ -377,5 +280,5 @@
 				return $arReturn;
 				
-			}	// public function getOrderProducts()
+			}
 			
 		} // public function getOrderProducts()
@@ -427,72 +330,11 @@
 		 * Gibt die verwendete Zahlungsart der Bestellung zurÃŒck
 		 */
-		public function getPaymentID() {
-			
-			$order_payment_key = $this->__get('payment_key');
-			$type_payment = $this->__get('type_payment');
-			
-			if (!wpsg_isSizedString($order_payment_key) && wpsg_isSizedString($type_payment)) $order_payment_key = $this->__get('type_payment');
-			
-			return $order_payment_key; 
+		public function getPaymentID()
+		{
+			
+			return $this->data['type_payment'];
 			
 		} // public function getPaymentID()
-
-		/**
-		 * @return String Name der verwendeten Zahlungsart
-		 */
-		public function getPaymentLabel() {
-			
-			$order_payment_key = $this->getPaymentID();
-			
-			if (!array_key_exists($order_payment_key, $this->shop->arPayment)) return wpsg_translate(__('Deaktivierte Zahlungsart (#1#)', 'wpsg'), $this->getPaymentID());
-			else return $this->shop->arPayment[$this->getPaymentID()]['name'];
-
- 		} // public function getPaymentLabel()
-
-		/**
-		 * @return String Name der verwendeten Versandart
-		 */
-		public function getShippingLabel() {
-			
-			$order_shipping_key = $this->getShippingID();
-
-			if (preg_match('/(.*)-(.*)/', $order_shipping_key))
-			{
-
-				// Versandart ist zusammengesetzt
-				$arShippingKey = explode('-', $order_shipping_key);
-				$arShippingNames = array();
-
-				foreach ($arShippingKey as $shipping_key)
-				{
-
-					$arShippingNames[] = $this->shop->getShippingName($shipping_key);
-
-				}
-
-				return implode(' + ', $arShippingNames);
-
-			}
-			else
-			{
-
-				return $this->shop->getShippingName($order_shipping_key);
-
-			}
-
-		} // public function getShippingLabel()
-
-		/**
-		 * @return String Key der verwendeten Versandart
-		 */
-		public function getShippingID() {
-			
-			$order_shipping_key = $this->__get('shipping_key');
-			if (!wpsg_isSizedString($order_shipping_key) && wpsg_isSizedString($this->__get('type_shipping'))) $order_shipping_key = $this->__get('type_shipping');
-			
-			return $order_shipping_key;
-
-		} // public function getShippingID()
-
+		
 		/**
 		 * Gibt einen Array mit ProduktKeys zurÃŒck, die in dieser Bestellung bestellt wurden
@@ -514,36 +356,4 @@
 		} // public function getProductKeys()
 
-        public function getStatusCode() {
-
-		    return intval($this->__get('status'));
-
-        }
-
-		/**
-		 * Gibt die Bezeichnung des Status der Bestellung zurÃŒck
-		 * @return String
-		 */
-		public function getStateLabel()
-		{
-
-			if (!array_key_exists($this->status, $this->shop->arStatus))
-			return wpsg_translate(__('Unbekannter Statuscode (#1#)', 'wpsg'), $this->status);
-			else return $this->shop->arStatus[$this->status];
-
-		} // public function getStateLabel()
-
-		/* Rechnungsadresse */
-		
-		/**
-		 * Firma oder Herr Max Mustermann
-		 * @return string
-		 */
-		public function getInvoiceSalutationTitle(): string {
-			
-			if (trim($this->getInvoiceCompany()) !== '') return $this->getInvoiceCompany();
-			else return trim($this->getInvoiceTitle().' '.$this->getInvoiceFirstName().' '.$this->getInvoiceName());
-			
-		}
-		
 		/**
 		 * Gibt das Geschlecht des RechnungsempfÃ€ngers zurÃŒck
@@ -553,9 +363,127 @@
 		{
 			
-			if ($this->adress_data === false) return $this->customer->getGender();
-			else 
-			{
-				
-				if (preg_match('/Frau/i', $this->getInvoiceTitle()))
+			return $this->customer->getGender();
+			
+		} // public function getInvoiceGender()
+		
+		/**
+		 * Gibt den Vornamen des RechnungsempfÃ€ngers zurÃŒck
+		 * @return String Vorname des RechnungsempfÃ€ngers
+		 */
+		public function getInvoiceFirstName()
+		{
+			
+			return $this->customer->getFirstName();
+			
+		} // public function getInvoiceFirstName()
+		
+		/**
+		 * Gibt den Namen des RechnungsempfÃ€ngers zurÃŒck
+		 * @return String Name des RechnungsempfÃ€ngers
+		 */
+		public function getInvoiceName()
+		{
+			
+			return $this->customer->getName();
+			
+		} // public function getInvoiceName()
+				
+		/**
+		 * Gibt die StraÃe der Rechnungsadresse zurÃŒck
+		 * @return String StraÃe der Rechnungsanschrift
+		 */
+		public function getInvoiceStreet()
+		{
+			
+			return $this->customer->getStreet();
+			
+		} // public function getInvoiceStreet()
+		
+		/**
+		 * Versucht die Hausnummer von der StraÃe abzutrennen und nur die StraÃe zurÃŒckzugeben
+		 * @return String der Reine StraÃenname der Rechnungsadresse
+		 */
+		public function getInvoiceStreetClear()
+		{
+			
+			return $this->customer->getStreetClear();
+			
+		} // public function getInvoiceStreetClear()
+		
+		/**
+		 * Gibt die StraÃennummer der Rechnungsadresse zurÃŒck
+		 * @return String Hausnummer der Rechnungsanschrift
+		 */
+		public function getInvoiceStreetNr()
+		{
+			
+			return $this->customer->getStreetNr();
+			
+		} // public function getInvoiceStreetNr()
+		
+		/**
+		 * Gibt die Postleitzahl der Rechnungsadresse zurÃŒck
+		 * @return String PLZ der Rechnungsadresse
+		 */
+		public function getInvoiceZip()
+		{
+			
+			return $this->customer->getZip();
+			
+		} // public function getInvoiceZip()
+		
+		/**
+		 * Gibt den Ort der Rechnungsadresse zurÃŒck
+		 * @return String Ort der Rechnungsadresse
+		 */
+		public function getInvoiceCity()
+		{
+			
+			return $this->customer->getCity();
+			 
+		} // public function getInvoiceCity()
+		
+		/**
+		 * Gibt die ID des Landes zurÃŒck, an die die Rechnung ging
+		 * @return \Integer ID des Landes fÃŒr die Rechnung
+		 */
+		public function getInvoiceCountry()
+		{
+				
+			return $this->customer->getCountryID();
+			
+		} // public function getInvoiceCountry()
+		
+		/**
+		 * Gibt das KÃŒrzel des Rechnungslandes zurÃŒck
+		 */
+		public function getInvoiceCountryKuerzel()
+		{
+				
+			return $this->customer->getCountryKuerzel();
+				
+		} // public function getInvoiceCountryKuerzel()
+		
+		/**
+		 * Gibt den Namen des Landes der Rechnungsadresse zurÃŒck
+		 */
+		public function getInvoiceCountryName()
+		{
+			
+			return $this->customer->getCountryName();
+			
+		} // public function getInvoiceCountryName()
+		
+		/**
+		 * Gibt das Geschlecht des EmpfÃ€ngers der Bestellung zurÃŒck
+		 * @return Geschlecht des EmpfÃ€ngers
+		 */
+		public function getShippingGender()
+		{
+			
+			if ($this->bShippingAdress === true)
+			{
+				
+				if (preg_match('/Frau/i', $this->shipping_title))
 				{
 					
@@ -571,258 +499,4 @@
 				
 			}
-			
-		} // public function getInvoiceGender()
-
-		/**
-		 * Gibt die Firma des RechnungsempfÃ€ngers zurÃŒck
-		 */
-		public function getInvoiceCompany()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getCompany();
-			else return ($this->adress_data['firma']??'');
-			
-		} // public function getInvoiceCompany()
-		
-		/**
-		 * Gibt die Anrede zurÃŒck
-		 */
-		public function getInvoiceTitle()
-		{
-			 
-			if ($this->adress_data === false) $title = wpsg_getStr($this->data['title']);
-			else $title = wpsg_getStr($this->adress_data['title']);
-			
-			$arAnrede = explode('|', $this->shop->get_option('wpsg_admin_pflicht')['anrede_auswahl']);
-			if (($title < 0) || ($title == '')) return '';
-			else return $arAnrede[$title];
-			
-		} // public function getTitle()
-		
-		/**
-		 * Gibt den Vornamen des RechnungsempfÃ€ngers zurÃŒck
-		 * @return String Vorname des RechnungsempfÃ€ngers
-		 */
-		public function getInvoiceFirstName()
-		{
-			 
-			if ($this->adress_data === false) return $this->customer->getFirstName();
-			else return wpsg_getStr($this->adress_data['vname']); 
-			
-		} // public function getInvoiceFirstName()
-		
-		/**
-		 * Gibt den Namen des RechnungsempfÃ€ngers zurÃŒck
-		 * @return String Name des RechnungsempfÃ€ngers
-		 */
-		public function getInvoiceName()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getName();
-			else return wpsg_getStr($this->adress_data['name']);
-			
-		} // public function getInvoiceName()
-
-		/**
-		 * Gibt die Fax Nummer des RechnungsempfÃ€ngers zurÃŒck
-		 */
-		public function getInvoiceFax()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getFax();
-			else return wpsg_getStr($this->adress_data['fax']);
-			
-		} // public function getInvoiceFax()
-		
-		/**
-		 * Gibt die Fax Nummer des RechnungsempfÃ€ngers zurÃŒck
-		 */
-		public function getInvoicePhone()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getPhone();
-			else return wpsg_getStr($this->adress_data['tel']);
-			
-		} // public function getInvoicePhone()
-		
-		/**
-		 * Gibt die StraÃe der Rechnungsadresse zurÃŒck (Mit Hausnummer)
-		 * @return String StraÃe der Rechnungsanschrift
-		 */
-		public function getInvoiceStreet()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getStreet();
-			else return trim(wpsg_getStr($this->adress_data['strasse']).' '.wpsg_getStr($this->adress_data['nr']));
-			
-		} // public function getInvoiceStreet()
-		
-		/**
-		 * @param $trimHnr Wenn true, dann wird versucht die Hausnummer abzutrennen (Wenn Hnr nicht separat erfasst)
-		 * @return String der Reine StraÃenname der Rechnungsadresse
-		 */
-		public function getInvoiceStreetClear($trimHnr = false)
-		{
-		
-			if ($this->adress_data === false)
-			{
-				
-				return $this->customer->getStreetClear($trimHnr);
-				
-			}
-			else 
-			{
-				
-				if (wpsg_isSizedInt($this->shop->get_option('wpsg_showNr')) && $trimHnr === true)
-				{
-					 
-					return preg_replace('/\040+\d+$/', '', $this->adress_data['strasse']);
-					
-				}
-				else
-				{
-					 				
-					return $this->adress_data['strasse'];
-					
-				}
-				
-			} 
-			
-		} // public function getInvoiceStreetClear()
-		
-		/**
-		 * Gibt die StraÃennummer der Rechnungsadresse zurÃŒck
-		 * @return String Hausnummer der Rechnungsanschrift
-		 */
-		public function getInvoiceStreetNr()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getStreetNr();
-			else return $this->adress_data['nr'];			
-			 			
-		} // public function getInvoiceStreetNr()
-		
-		/**
-		 * Gibt die Postleitzahl der Rechnungsadresse zurÃŒck
-		 * @return String PLZ der Rechnungsadresse
-		 */
-		public function getInvoiceZip()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getZip();
-			else return wpsg_getStr($this->adress_data['plz']);
-			
-		} // public function getInvoiceZip()
-		
-		/**
-		 * Gibt den Ort der Rechnungsadresse zurÃŒck
-		 * @return String Ort der Rechnungsadresse
-		 */
-		public function getInvoiceCity()
-		{
-			
-			if ($this->adress_data === false) return $this->customer->getCity();
-			else return wpsg_getStr($this->adress_data['ort']);
-						 
-		} // public function getInvoiceCity()
-		
-		/**
-		 * Gibt die ID des Landes zurÃŒck, an die die Rechnung ging
-		 * @return \Integer ID des Landes fÃŒr die Rechnung
-		 */
-		public function getInvoiceCountryID() {
-			
-			// Aufpassen! Das kann auch das Lieferland sein, wenn die Option "Besteuerung von Lieferland" aktiv ist
-			// $target_country_id = intval($this->__get('target_country_id'));
-			// if ($target_country_id > 0) return $target_country_id;
-			
-			if ($this->adress_data === false) return $this->customer->getCountryID();
-			else return wpsg_getStr($this->adress_data['land']);
-						
-		} // public function getInvoiceCountry()
-		
-		/**
-		 * Gibt das Land zurÃŒck, nachdem sich bei dieser Bestellung die Besteuerung richtet
-		 * @return wpsg_country
-		 */
-		public function getTaxCountry(): wpsg_country {
-			
-			if (wpsg_ShopController::getShop()->get_option('wpsg_deliverycountrytax') === '1') return $this->getShippingCountry();
-			else return $this->getInvoiceCountry();
-			
-		}
-		
-		/**
-		 * Gibt das LÃ€nderobjekt fÃŒr die Rechnung zurÃŒck
-		 */
-		public function getInvoiceCountry()
-		{
-						
-			return wpsg_country::getInstance($this->getInvoiceCountryID());
-						
-		} // public function getInvoiceCountry()
-
-		/**
-		 * Gibt das KÃŒrzel des Rechnungslandes zurÃŒck
-		 */
-		public function getInvoiceCountryKuerzel()
-		{
-				
-			$invoiceCountry = $this->getInvoiceCountry();
-			
-			if (!is_object($invoiceCountry)) return __('Nicht definiert.', 'wpsg');
-			else return $this->getInvoiceCountry()->getShorttext();
-				
-		} // public function getInvoiceCountryKuerzel()
-		
-		/**
-		 * Gibt den Namen des Landes der Rechnungsadresse zurÃŒck
-		 */
-		public function getInvoiceCountryName()
-		{
-			
-			$invoiceCountry = $this->getInvoiceCountry();
-			
-			if (!is_object($invoiceCountry)) return __('Nicht definiert.', 'wpsg');
-			else return $this->getInvoiceCountry()->getName(); 
-			
-		} // public function getInvoiceCountryName()
-
-		/**
-		 * Gibt die Leitweg-ID der Bestellung zurÃŒck
-		 */
-		public function getLeitwegId(): string
-		{
-
-			return $this->getCustomer()->getLeitwegId();
-
-		}	// public function getLeitwegId()
-
-		/* Lieferadresse */
-		
-		/**
-		 * Gibt das Geschlecht des EmpfÃ€ngers der Bestellung zurÃŒck
-		 * @return Geschlecht des EmpfÃ€ngers
-		 */
-		public function getShippingGender()
-		{
-			
-			if ($this->hasShippingAdress()) 
-			{
-				
-				if (preg_match('/Frau/i', $this->getShippingTitle()))
-				{
-					
-					return 'f';
-					
-				}
-				else
-				{
-					
-					return 'm';
-					
-				}
-				
-			}
 			else
 			{
@@ -833,38 +507,4 @@
 			
 		} // public function getShippingGender()
-		
-		/** 
-		 * Gibt die Firma der Lieferadresse zurÃŒck 
-		 */
-		public function getShippingCompany()
-		{
-			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['firma'];
-			else return $this->getInvoiceCompany(); 
-			
-		}	// public function getShippingCompany()
-		
-		/** 
-		 * Anrede der Lieferadresse
-		 */
-		public function getShippingTitle()
-		{
-			
-			//if ($this->hasShippingAdress()) return $this->shipping_adress_data['title'];
-			//else return $this->getInvoiceTitle();
-			if ($this->bShippingAdress === true)
-			{
-			
-				if (wpsg_isSizedString($this->shipping_adress_data['title'])) $title = $this->shipping_adress_data['title'];
-				else $title = $this->data['shipping_title'];
-			
-			}
-				else $title = $this->getInvoiceTitle();
-			
-			$arAnrede = explode('|', $this->shop->get_option('wpsg_admin_pflicht')['anrede_auswahl']);
-			if ($title < 0) return '';
-			else return $arAnrede[$title]??'';
-			
-		}	// public function getShippingTitle()
 		
 		/**
@@ -875,6 +515,16 @@
 		{
 			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['vname'];
-			else return $this->getInvoiceFirstName(); 
+			if ($this->bShippingAdress === true)
+			{
+				
+				return $this->shipping_vname;
+				
+			}
+			else
+			{
+				
+				return $this->getInvoiceFirstName();
+				
+			}
 			
 		} // public function getShippingFirstName()
@@ -884,10 +534,43 @@
 		 * @return string Name des EmpfÃ€ngers
 		 */
-		public function getShippingName() {
-			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['name'];
-			else return $this->getInvoiceName(); 
-			 						
+		public function getShippingName()
+		{
+			
+			if ($this->bShippingAdress === true)
+			{
+				
+				return $this->shipping_name;
+				
+			}
+			else
+			{
+				
+				return $this->getInvoiceName();
+				
+			}
+						
 		} // public function getShippingName()
+		
+		/**
+		 * Gibt den reinen StraÃennamen des EmpfÃ€ngers zurÃŒck
+		 * @return string reiner StraÃenname des EmpfÃ€ngers
+		 */
+		public function getShippingStreetClear()
+		{
+			
+			if ($this->bShippingAdress === true)
+			{
+				
+			 	return preg_replace('/\040+\d+$/', '', $this->shipping_strasse);
+				
+			}
+			else
+			{
+				
+				return $this->getInvoiceStreetClear();
+				
+			}
+			
+		} // public function getShippingStreetClear()
 		
 		/**
@@ -898,36 +581,18 @@
 		{
 			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['strasse'].' '.$this->shipping_adress_data['nr'];
-			else return $this->getInvoiceStreet(); 
-			 			
+			if ($this->bShippingAdress === true)
+			{
+				
+				return $this->shipping_strasse;
+				
+			}
+			else
+			{
+				
+				return $this->getInvoiceStreet();
+				
+			}
+			
 		} // public function getShippingStreet()
-		
-		/**
-		 * Gibt den reinen StraÃennamen des EmpfÃ€ngers zurÃŒck
-		 * @return string reiner StraÃenname des EmpfÃ€ngers
-		 */
-		public function getShippingStreetClear($trimHnr = false)
-		{
-			
-			if ($this->hasShippingAdress())
-			{
-				
-				if (wpsg_isSizedInt($this->shop->get_option('wpsg_showNr')) && $trimHnr === true)
-				{
-					 
-					return preg_replace('/\040+\d+$/', '', wpsg_getStr($this->shipping_adress_data['strasse']));
-					
-				}
-				else
-				{
-				
-					return $this->shipping_adress_data['strasse']; 
-					
-				}
-				
-			}
-			else return $this->getInvoiceStreetClear($trimHnr); 
-			 			
-		} // public function getShippingStreetClear()
 		
 		/**
@@ -938,7 +603,17 @@
 		{
 			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['nr'];
-			else return $this->getInvoiceStreetNr(); 
-			 
+			if ($this->bShippingAdress === true)
+			{
+				
+				return intval(preg_replace('/(.*)\040/', '', $this->shipping_strasse));
+				
+			}
+			else 
+			{
+				
+				return $this->getInvoiceStreetNr();
+				
+			}
+			
 		} // public function getShippingStreetNr()
 		
@@ -950,7 +625,17 @@
 		{
 			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['plz'];
-			else return $this->getInvoiceZip(); 
-			 
+			if ($this->bShippingAdress === true)
+			{
+				
+				return $this->shipping_plz;
+								
+			}
+			else
+			{
+				
+				return $this->getInvoiceZip();
+				
+			}
+			
 		} // public function getShippingZip()
 		
@@ -962,9 +647,19 @@
 		{
 			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['ort'];
-			else return $this->getInvoiceCity(); 
-			 
+			if ($this->bShippingAdress === true)
+			{
+				
+				return $this->shipping_ort;
+				
+			}
+			else
+			{
+				
+				return $this->getInvoiceCity();
+				
+			}
+			
 		} // public function getShippingCity()
-						
+				
 		/**
 		 * Gibt das Lieferland der Bestellung zurÃŒck
@@ -974,61 +669,55 @@
 		{
 			
-			if ($this->hasShippingAdress()) return $this->shipping_adress_data['land'];
-			else return $this->getInvoiceCountryID(); 
+			if ($this->bShippingAdress)
+			{
+				
+				return $this->shipping_land;
+				
+			}
+			else 
+			{
+				
+				return $this->getInvoiceCountry();
+				
+			}
+			
+		} // public function getShippingCountryID()
+				
+		/**
+		 * Gibt das Kuerzel des Lieferlandes zurÃŒck
+		 */
+		public function getShippingCountryKuerzel()
+		{
+			
+			if ($this->bShippingAdress === true)
+			{
+				
+				return $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->getShippingCountryID())."' ");
+				
+			}
+			else
+			{
 			 
-		} // public function getShippingCountryID()
-		
-		/**
-		 * Gibt das Lieferland als Objekt zurÃŒck
-		 * @return wpsg_country
-		 */
-		public function getShippingCountry()
-		{
-			
-			return wpsg_country::getInstance($this->getShippingCountryID());
-			
-		} // public function getShippingCountry()
-		
-		/**
-		 * Gibt das Kuerzel des Lieferlandes zurÃŒck
-		 */
-		public function getShippingCountryKuerzel()
-		{
-			
-			$shippingCountry = $this->getShippingCountry();
-			
-			if (!is_object($shippingCountry)) return __('Nicht definiert.', 'wpsg');
-			else return $this->getShippingCountry()->getShorttext();  
-			
+				return $this->getInvoiceCountryKuerzel();
+				
+			}
 			
 		} // public function getShippingCountryKuerzel()
 		
-		/** 
-		 * Gibt den Namen des Lieferlandes zurÃŒck
-		 */
 		public function getShippingCountryName()
 		{
 			
-			$shippingCountry = $this->getShippingCountry();
-			 
-			if (!is_object($shippingCountry)) return __('Nicht definiert.', 'wpsg');
-			else return $this->getShippingCountry()->getName(); 
-			
-		}	// public function getShippingCountryName()
-		
-		/**
-		 * Gibt die Bestellnummer zurÃŒck
-		 * @return string|null
-		 */
-		public function getNr() { return $this->onr; }
-  
-		public function addLogEntry($title, $text) {
-			
-			$this->db->ImportQuery(WPSG_TBL_OL, [
-				"title" => wpsg_q($title),
-				"cdate" => "NOW()",
-				"o_id" => wpsg_q($this->id),
-				"mailtext" => wpsg_q($text)
-			]);
+			if ($this->bShippingAdress === true)
+			{
+			
+				return $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->getShippingCountryID())."' ");
+			
+			}
+			else
+			{
+			
+				return $this->getInvoiceCountryName();
+			
+			}
 			
 		}
@@ -1089,15 +778,5 @@
 			
 		} // public function isInnerEu()
-
-		/**
-		 * return Boolean true, wenn eine separate Versandadresse verwendet wurde
-		 */
-		public function hasShippingAdress()
-		{
-
-			return wpsg_isSizedInt($this->data['shipping_adress_id']);
-
-		} // public function hasShippingAdress()
-
+		
 		/**
 		 * Speichert die Bestelldaten in die Datenbank
@@ -1115,8 +794,8 @@
 		public function delete()
 		{
-
+			
 			// Module aufrufen, damit sie die AbhÃ€ngigkeiten lÃ¶schen kÃ¶nnen
-			$this->shop->callMods('delOrder', array($this->getId()));
-			 			
+			$this->shop->callMods('delOrder', array(&$this->id));
+				
 			// Bestelldaten aus der Bestelltabelle lÃ¶schen
 			$this->db->Query("DELETE FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($this->id)."' ");
@@ -1132,62 +811,68 @@
 				
 		} // public function delete()
-
-		/* Statische Funktionen */
-
-		/**
-		 * ZÃ€hlt die Bestellungen anhand des Filters
-		 */
-		public static function count($arFilter) {
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					(
-						SELECT
-						  	DISTINCT O.`id`
-						FROM
-							`".WPSG_TBL_ORDER."` AS O
-							".$strQueryJOIN."
-						WHERE
-							1
-							".$strQueryWHERE." 
-						HAVING
-							1
-							".$strQueryHAVING."											
-					) AS innerSelect
-			";
-
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-
-		} // public static function count($arFilter)
-
-		public static function findByOrderNr(string $order_nr): ?wpsg_order {
-
-			$order_id = intval($GLOBALS['wpsg_db']->fetchOnePrepared("SELECT `id` FROM `".WPSG_TBL_ORDER."` WHERE `onr` = %s ", $order_nr));
-
-			if ($order_id > 0) return wpsg_order::getInstance($order_id);
-			else return null;
-
-		}
-
+		
 		/**
 		 * Gibt einen Array von Bestellungen zurÃŒck, die auf den ÃŒbergebenen Filter passen
 		 * @param array $arFilter
 		 */
-		public static function find($arFilter = array(), $load = true) {
-			
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strLimit = "";
-
-			if (wpsg_isSizedArray($arFilter['limit'])) $strLimit = "LIMIT ".wpsg_q($arFilter['limit'][0]).", ".wpsg_q($arFilter['limit'][1]);
-
+		public static function find($arFilter = array())
+		{
+			
+			$strQueryWHERE = "";
+			$strQueryJOIN = "";
+			
+			if (wpsg_isSizedInt($arFilter['k_id']))
+			{
+				
+				$strQueryWHERE .= " AND O.`k_id` = '".wpsg_q($arFilter['k_id'])."' ";
+				
+			}
+			
+			if (wpsg_isSizedInt($arFilter['status']))
+			{
+				
+				$strQueryWHERE .= " AND O.`status` = '".wpsg_q($arFilter['status'])."' ";
+				
+			}
+			else if (wpsg_isSizedArray($arFilter['status']))
+			{
+				
+				$strQueryWHERE .= " AND O.`status` IN (".wpsg_q(implode(',', $arFilter['status'])).") ";
+				
+			}
+			
+			if (wpsg_isSizedInt($arFilter['NOTstatus']))
+			{
+			
+				$strQueryWHERE .= " AND O.`status` != '".wpsg_q($arFilter['NOTstatus'])."' ";
+			
+			}
+			else if (wpsg_isSizedArray($arFilter['NOTstatus']))
+			{
+			
+				$strQueryWHERE .= " AND O.`status` NOT IN (".wpsg_q(implode(',', $arFilter['NOTstatus'])).") ";
+			
+			}
+			
+			if (wpsg_isSizedInt($arFilter['cdate_from']))
+			{
+			
+				$strQueryWHERE .= " AND O.`cdate` > '".wpsg_date('Y-m-d', $arFilter['cdate_from'])."' ";
+			
+			}
+			
+			if (wpsg_isSizedInt($arFilter['product_id']))
+			{
+				
+				$strQueryWHERE .= " AND OP.`p_id` = '".wpsg_q($arFilter['product_id'])."' ";
+				$bJoinProducts = true;
+				
+			}
+			
+			if ($bJoinProducts === true) $strQueryJOIN = " LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (O.`id` = OP.`o_id`) ";
+			
 			$strQuery = "
 				SELECT
 					O.`id`
-					".$strQuerySELECT."
 				FROM
 					`".WPSG_TBL_ORDER."` AS O
@@ -1195,451 +880,25 @@
 				WHERE
 					1
-					".$strQueryWHERE."
+					".$strQueryWHERE."	
 				GROUP BY 
 					O.`id`
-				HAVING
-					1
-					".$strQueryHAVING."
-				ORDER BY
-					".$strQueryORDER."
-				".$strLimit."
 			";
-			
-			$arOrderID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery, "id", "id");
+			 
+			$arOrderID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery);
+			$arReturn = array();
+			
+			foreach ($arOrderID as $order_id)
+			{
+				
+				$oOrder = $GLOBALS['wpsg_sc']->cache->loadOrderObject($order_id); 
+				$arReturn[] = $oOrder;
+				
+			}
+			
+			return $arReturn;
+			
+		} // public static function find($arFilter = array())
+		
+	} // class wpsg_mod_order extends wpsg_model
 
-			if ($load !== true) return $arOrderID;
-
-			$arReturn = array();
-			
-			foreach ($arOrderID as $order_id) {
-
-				$oOrder = $GLOBALS['wpsg_sc']->cache->loadOrderObject($order_id);
-				$arReturn[] = $oOrder;
-				
-			}
-			
-			return $arReturn;
-			
-		} // public static function find($arFilter = array(), $load = true)
-
-		public static function getQueryParts($arFilter = array()) {
-
-			$strQuerySELECT = "";
-			$strQueryWHERE = "";
-			$strQueryJOIN = "";
-			$strQueryHAVING = "";
-			$strQueryORDER = "";
-
-			$bJoinProducts = false;
-			$bJoinOrderProducts = false;			
-			$bJoinCustomer = false;
-			$bJoinInvoice = false;
-			$bJoinOrderAdress = false;
-			$bJoinVoucher = false;
-
-			if (wpsg_isSizedInt($arFilter['id'])) $strQueryWHERE .= " AND O.`id` = '".wpsg_q($arFilter['id'])."' ";
-			if (wpsg_isSizedInt($arFilter['k_id'])) $strQueryWHERE .= " AND O.`k_id` = '".wpsg_q($arFilter['k_id'])."' ";
-			if (wpsg_isSizedInt($arFilter['cdate_from'])) $strQueryWHERE .= " AND O.`cdate` > '".wpsg_date('Y-m-d', $arFilter['cdate_from'])."' ";
-			if (wpsg_isSizedInt($arFilter['product_id'])) { $strQueryWHERE .= " AND OP.`p_id` = '".wpsg_q($arFilter['product_id'])."' "; $bJoinOrderProducts = true; }
-			if (wpsg_isSizedString($arFilter['cdate_y']) && $arFilter['cdate_y'] != '-1') { $strQueryWHERE .= " AND YEAR(O.`cdate`) = '".wpsg_q($arFilter['cdate_y'])."' "; }
-			if (wpsg_isSizedString($arFilter['cdate_m']) && $arFilter['cdate_m'] != '-1') { $strQueryWHERE .= " AND MONTH(O.`cdate`) = '".wpsg_q(ltrim($arFilter['cdate_m'], '0'))."' "; }
-			if (wpsg_isSizedString($arFilter['invoicedate_y']) && $arFilter['invoicedate_y'] != '-1') { $bJoinInvoice = true; $strQueryWHERE .= " AND YEAR(I.`datum`) = '".wpsg_q($arFilter['invoicedate_y'])."' "; }
-			if (wpsg_isSizedString($arFilter['invoicedate_m']) && $arFilter['invoicedate_m'] != '-1') { $bJoinInvoice = true; $strQueryWHERE .= " AND MONTH(I.`datum`) = '".wpsg_q(ltrim($arFilter['invoicedate_m'], '0'))."' "; }
-			if (wpsg_isSizedString($arFilter['rnr'])) { $bJoinInvoice = true; $strQueryWHERE .= " AND I.`rnr` = '".wpsg_q($arFilter['rnr'])."' "; }
-			if (wpsg_isSizedInt($arFilter['productgroup_id'])) { $bJoinProducts = true; $strQueryWHERE .= " AND P.`pgruppe` = '".wpsg_q($arFilter['productgroup_id'])."' "; }
-			
-			if (intval($arFilter['voucher_id']??0) > 0) {
-				
-				$bJoinVoucher = true;
-				$strQueryWHERE .= " AND OV.`voucher_id` = '".intval($arFilter['voucher_id'])."' ";
-				
-			}
-			
-			if (wpsg_isSizedString($arFilter['payment_key'])) $strQueryWHERE .= " AND O.`payment_key` = '".wpsg_q($arFilter['payment_key'])."' ";
-
-			if (wpsg_isSizedString($arFilter['s'])) {
-
-                $strQueryWHERE_S_OR = "";
-
-				if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvars')) {
-
-				    $strQueryWHERE_S_OR .= " OR O.`pvars` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-
-                }
-
-				if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_rechnungen')) {
-
-					$strQueryWHERE_S_OR .= " OR I.`rnr` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-
-				}
-
-                $strQueryWHERE .= "
-					AND (
-						OA.`vname` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						OA.`name` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						C.`email` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						OA.`firma` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						C.`ustidnr` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						O.`onr` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						O.`id` = '".wpsg_q($arFilter['s'])."' 
-						".$strQueryWHERE_S_OR."
-					)
-				";
-
-				$bJoinInvoice = true;
-                $bJoinOrderAdress = true;
-                $bJoinCustomer = true;
-
-			}
-
-			if ((wpsg_isSizedString($arFilter['status']) || $arFilter['status'] == '0') && intval($arFilter['status']) !== -1) {
-
-				$strQueryWHERE .= " AND O.`status` = '".wpsg_q($arFilter['status'])."' ";
-
-			} else if (wpsg_isSizedArray($arFilter['status'])) {
-
-				$strQueryWHERE .= " AND O.`status` IN (".wpsg_q(implode(',', $arFilter['status'])).") ";
-
-			}
-
-			if (wpsg_isSizedInt($arFilter['NOTstatus'])) {
-
-				$strQueryWHERE .= " AND O.`status` != '".wpsg_q($arFilter['NOTstatus'])."' ";
-
-			} else if (wpsg_isSizedArray($arFilter['NOTstatus'])) {
-
-				$strQueryWHERE .= " AND O.`status` NOT IN (".wpsg_q(implode(',', $arFilter['NOTstatus'])).") ";
-
-			}
-
-			// Sortierung
-			if (wpsg_isSizedString($arFilter['order'], 'cdate')) { $strQueryORDER = " O.`cdate` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'nr')) { $strQueryORDER = " O.`onr` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'customer')) { $strQueryORDER = " CONCAT(OA.`name`, ' ', OA.`vname`) "; $bJoinCustomer = true; $bJoinOrderAdress = true; }
-			else if (wpsg_isSizedString($arFilter['order'], 'payment')) {
-
-				$strQuerySELECT .= " , (SELECT CASE `type_payment` ";
-
-				foreach ($GLOBALS['wpsg_sc']->arPayment as $payment_key => $payment_info)
-				{
-
-					$strQuerySELECT .= " WHEN '".wpsg_q($payment_key)."' THEN '".wpsg_q($payment_info['name'])."' ";
-
-				}
-
-				$strQuerySELECT .= " ELSE CONCAT('".wpsg_q(__('Deaktivierte Zahlungsart (', 'wpsg'))."', O.`type_payment`, '".wpsg_q(__(')'))."') ";
-				$strQuerySELECT .= "END) AS `paymentlabel` ";
-
-				$strQueryORDER = " CONCAT(`paymentlabel`, ' - ', `price_payment`) ";
-
-			}
-			else if (wpsg_isSizedString($arFilter['order'], 'shipping')) {
-
-				$strQuerySELECT .= " , (SELECT CASE `type_shipping` ";
-
-				foreach ($GLOBALS['wpsg_sc']->arShipping as $shipping_key => $shipping_info)
-				{
-
-					$strQuerySELECT .= " WHEN '".wpsg_q($shipping_key)."' THEN '".wpsg_q($shipping_info['name'])."' ";
-
-				}
-
-				$strQuerySELECT .= " ELSE CONCAT('".wpsg_q(__('Deaktivierte Versandart (', 'wpsg'))."', O.`type_shipping`, '".wpsg_q(__(')'))."') ";
-				$strQuerySELECT .= "END) AS `shippinglabel` ";
-
-				$strQueryORDER = " CONCAT(`shippinglabel`, ' - ', `price_shipping`) ";
-
-			}
-			else if (wpsg_isSizedString($arFilter['order'], 'products'))
-			{
-				
-				$bJoinOrderProducts = true;
-				$strQuerySELECT .= ", COUNT(OP.`id`) AS `count_products` ";
-				$strQueryORDER = " `count_products` ";
-
-			}
-			else if (wpsg_isSizedString($arFilter['order'], 'amount')) $strQueryORDER .= " `price_gesamt_brutto` ";
-			else if (wpsg_isSizedString($arFilter['order'], 'state'))
-			{
-
-				$strQuerySELECT .= " , (SELECT CASE `status` ";
-
-				foreach ($GLOBALS['wpsg_sc']->arStatus as $state_key => $state_label)
-				{
-
-					$strQuerySELECT .= " WHEN '".wpsg_q($state_key)."' THEN '".wpsg_q($state_label)."' ";
-
-				}
-
-				$strQuerySELECT .= " ELSE CONCAT('".wpsg_q(__('Unbekannter Statuscode (', 'wpsg'))."', O.`status`, '".wpsg_q(__(')'))."') ";
-				$strQuerySELECT .= "END) AS `statelabel` ";
-				$strQueryORDER = " `statelabel` ";
-
-			}
-			else $strQueryORDER = " O.`id` ";
-
-			// Richtung
-			if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strQueryORDER .= " DESC ";
-			else $strQueryORDER .= " ASC ";
-
-			if ($bJoinProducts === true) $bJoinOrderProducts = true;
-			
-			// Optionale Joins
-			if ($bJoinOrderProducts === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (O.`id` = OP.`o_id`) ";
-			if ($bJoinProducts === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (OP.`p_id` = P.`id`) ";
-			if ($bJoinCustomer === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_KU."` AS C ON (C.`id` = O.`k_id`) ";
-			if ($bJoinInvoice === true) {
-
-                $strQueryJOIN .= " 
-                    LEFT JOIN `".WPSG_TBL_ORDER_INVOICE."` AS ORDER_INVOICE ON (O.`id` = ORDER_INVOICE.`order_id`) 
-                    LEFT JOIN `".WPSG_TBL_RECHNUNGEN."` AS I ON (I.`id` = ORDER_INVOICE.`invoice_id`) 
-                ";
-
-            }
-			if ($bJoinOrderAdress === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ADRESS."` AS OA ON (OA.`id` = O.`adress_id`) ";
-			if ($bJoinVoucher === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ORDER_VOUCHER."` AS OV ON (OV.`order_id` = O.`id`) ";
-
-			wpsg_ShopController::getShop()->callMods('wpsg_order_getQueryParts', [$arFilter, &$strQuerySELECT, &$strQueryWHERE, &$strQueryJOIN, &$strQueryHAVING, &$strQueryORDER]);
-			
-			return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER);
-
-		}	// public static function getQueryParts($arFilter = array())
-
-		/**
-		 * ZÃ€hlt die Abo-Bestellungen anhand des Filters
-		 */
-		public static function countAbo($arFilter)
-		{
-			
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryPartsAbo($arFilter);
-			
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					(
-						SELECT
-						  	DISTINCT O.`id`
-						FROM
-							`".WPSG_TBL_ORDER."` AS O
-							".$strQueryJOIN."
-						WHERE
-							1
-							".$strQueryWHERE."
-						HAVING
-							1
-							".$strQueryHAVING."
-					) AS innerSelect
-			";
-			
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-			
-		} // public static function countAbo($arFilter)
-		
-		/**
-		 * Gibt einen Array von Abo-Bestellungen zurÃŒck, die auf den ÃŒbergebenen Filter passen
-		 * @param array $arFilter
-		 */
-		public static function findAbo($arFilter = array(), $load = true)
-		{
-			
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryPartsAbo($arFilter);
-			
-			$strLimit = "";
-			
-			if (wpsg_isSizedArray($arFilter['limit'])) $strLimit = "LIMIT ".wpsg_q($arFilter['limit'][0]).", ".wpsg_q($arFilter['limit'][1]);
-			
-			$strQuery = "
-				SELECT
-					O.`id`
-					".$strQuerySELECT."
-				FROM
-					`".WPSG_TBL_ORDER."` AS O
-					".$strQueryJOIN."
-				WHERE
-					1
-					".$strQueryWHERE."
-				GROUP BY
-					O.`id`
-				HAVING
-					1
-					".$strQueryHAVING."
-				ORDER BY
-					".$strQueryORDER."
-				".$strLimit."
-			";
-			
-			$arOrderID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery, "id", "id");
-			
-			if ($load !== true) return $arOrderID;
-			
-			$arReturn = array();
-			
-			foreach ($arOrderID as $order_id)
-			{
-				
-				$oOrder = $GLOBALS['wpsg_sc']->cache->loadOrderObject($order_id);
-				$arReturn[] = $oOrder;
-				
-			}
-			
-			return $arReturn;
-			
-		} // public static function findAbo($arFilter = array(), $load = true)
-		
-		public static function getQueryPartsAbo($arFilter = array())
-		{
-			
-			$strQuerySELECT = "";
-			$strQueryWHERE = "";
-			$strQueryJOIN = "";
-			$strQueryHAVING = "";
-			$strQueryORDER = "";
-			
-			$bJoinOrderProducts = true;
-			$bJoinCustomer = false;
-			$bJoinInvoice = false;
-			$bJoinAbo = false;
-			$bJoinOrderAdress = false;
-			
-			if (wpsg_isSizedInt($arFilter['k_id'])) $strQueryWHERE .= " AND O.`k_id` = '".wpsg_q($arFilter['k_id'])."' ";
-			if (wpsg_isSizedInt($arFilter['cdate_from'])) $strQueryWHERE .= " AND O.`cdate` > '".wpsg_date('Y-m-d', $arFilter['cdate_from'])."' ";
-			if (wpsg_isSizedInt($arFilter['product_id'])) { $strQueryWHERE .= " AND OP.`p_id` = '".wpsg_q($arFilter['product_id'])."' "; $bJoinOrderProducts = true; }
-			if (wpsg_isSizedString($arFilter['cdate_y']) && $arFilter['cdate_y'] != '-1') { $strQueryWHERE .= " AND YEAR(O.`cdate`) = '".wpsg_q($arFilter['cdate_y'])."' "; }
-			if (wpsg_isSizedString($arFilter['cdate_m']) && $arFilter['cdate_m'] != '-1') { $strQueryWHERE .= " AND MONTH(O.`cdate`) = '".wpsg_q(ltrim($arFilter['cdate_m'], '0'))."' "; }
-			if (wpsg_isSizedString($arFilter['enddate_y']) && $arFilter['enddate_y'] != '-1') { $bJoinAbo= true; $strQueryWHERE .= " AND YEAR(A.`expiration`) = '".wpsg_q($arFilter['enddate_y'])."' "; }
-			if (wpsg_isSizedString($arFilter['enddate_m']) && $arFilter['enddate_m'] != '-1') { $bJoinAbo= true; $strQueryWHERE .= " AND MONTH(A.`expiration`) = '".wpsg_q(ltrim($arFilter['enddate_m'], '0'))."' "; }
-			if (wpsg_isSizedString($arFilter['s']))
-			{
-				
-				$strQueryWHERE .= "
-					AND
-					(
-						OA.`vname` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						OA.`name` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						C.`email` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						OA.`firma` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						C.`ustidnr` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						O.`onr` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						O.`id` = '".wpsg_q($arFilter['s'])."'
-					)
-				";
-				
-				$bJoinOrderAdress = true;
-				$bJoinCustomer = true;
-				
-			}
-			
-			if (wpsg_isSizedInt($arFilter['status']) || $arFilter['status'] == '0')
-			{
-				
-				$strQueryWHERE .= " AND A.`status` = '".wpsg_q($arFilter['status'])."' ";
-				
-			}
-			else if (wpsg_isSizedArray($arFilter['status']))
-			{
-				
-				$strQueryWHERE .= " AND O.`status` IN (".wpsg_q(implode(',', $arFilter['status'])).") ";
-				
-			}
-			
-			if (wpsg_isSizedInt($arFilter['NOTstatus']))
-			{
-				
-				$strQueryWHERE .= " AND O.`status` != '".wpsg_q($arFilter['NOTstatus'])."' ";
-				
-			}
-			else if (wpsg_isSizedArray($arFilter['NOTstatus']))
-			{
-				
-				$strQueryWHERE .= " AND O.`status` NOT IN (".wpsg_q(implode(',', $arFilter['NOTstatus'])).") ";
-				
-			}
-			
-			// Sortierung
-			if (wpsg_isSizedString($arFilter['order'], 'cdate')) { $strQueryORDER = " O.`cdate` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'nr')) { $strQueryORDER = " O.`onr` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'customer')) { $strQueryORDER = " CONCAT(OA.`vname`, ' ', OA.`name`) "; $bJoinCustomer = true; $bJoinOrderAdress = true; }
-			else if (wpsg_isSizedString($arFilter['order'], 'payment')) {
-				
-				$strQuerySELECT .= " , (SELECT CASE `type_payment` ";
-				
-				foreach ($GLOBALS['wpsg_sc']->arPayment as $payment_key => $payment_info)
-				{
-					
-					$strQuerySELECT .= " WHEN '".wpsg_q($payment_key)."' THEN '".wpsg_q($payment_info['name'])."' ";
-					
-				}
-				
-				$strQuerySELECT .= " ELSE CONCAT('".wpsg_q(__('Deaktivierte Zahlungsart (', 'wpsg'))."', O.`type_payment`, '".wpsg_q(__(')'))."') ";
-				$strQuerySELECT .= "END) AS `paymentlabel` ";
-				
-				$strQueryORDER = " CONCAT(`paymentlabel`, ' - ', `price_payment`) ";
-				
-			}
-			else if (wpsg_isSizedString($arFilter['order'], 'shipping')) {
-				
-				$strQuerySELECT .= " , (SELECT CASE `type_shipping` ";
-				
-				foreach ($GLOBALS['wpsg_sc']->arShipping as $shipping_key => $shipping_info)
-				{
-					
-					$strQuerySELECT .= " WHEN '".wpsg_q($shipping_key)."' THEN '".wpsg_q($shipping_info['name'])."' ";
-					
-				}
-				
-				$strQuerySELECT .= " ELSE CONCAT('".wpsg_q(__('Deaktivierte Versandart (', 'wpsg'))."', O.`type_shipping`, '".wpsg_q(__(')'))."') ";
-				$strQuerySELECT .= "END) AS `shippinglabel` ";
-				
-				$strQueryORDER = " CONCAT(`shippinglabel`, ' - ', `price_shipping`) ";
-				
-			}
-			else if (wpsg_isSizedString($arFilter['order'], 'products'))
-			{
-				
-				$bJoinOrderProducts = true;
-				$strQuerySELECT .= ", COUNT(OP.`id`) AS `count_products` ";
-				$strQueryORDER = " `count_products` ";
-				
-			}
-			else if (wpsg_isSizedString($arFilter['order'], 'amount')) $strQueryORDER .= " `price_gesamt_brutto` ";
-			else if (wpsg_isSizedString($arFilter['order'], 'state'))
-			{
-				
-				$strQuerySELECT .= " , (SELECT CASE `status` ";
-				
-				foreach ($GLOBALS['wpsg_sc']->arStatus as $state_key => $state_label)
-				{
-					
-					$strQuerySELECT .= " WHEN '".wpsg_q($state_key)."' THEN '".wpsg_q($state_label)."' ";
-					
-				}
-				
-				$strQuerySELECT .= " ELSE CONCAT('".wpsg_q(__('Unbekannter Statuscode (', 'wpsg'))."', O.`status`, '".wpsg_q(__(')'))."') ";
-				$strQuerySELECT .= "END) AS `statelabel` ";
-				$strQueryORDER = " `statelabel` ";
-				
-			}
-			else $strQueryORDER = " O.`id` ";
-			
-			// Richtung
-			if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strQueryORDER .= " DESC ";
-			else $strQueryORDER .= " ASC ";
-			
-			// Optionale Joins
-			if ($bJoinOrderProducts === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (O.`id` = OP.`o_id`) ";
-			if ($bJoinCustomer === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_KU."` AS C ON (C.`id` = O.`k_id`) ";
-			if ($bJoinInvoice === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_RECHNUNGEN."` AS I ON (I.`o_id` =  O.`id` AND I.`storno` = '0000-00-00 00:00:00' AND I.`rnr` != '') ";
-			if ($bJoinOrderAdress === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ADRESS."` AS OA ON (OA.`id` = O.`adress_id`) ";
-
-			// Abo-Tabelle immer dazu wegen Abo-Status
-			$bJoinAbo = true;
-			if ($bJoinAbo === true) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ABO."` AS A ON (A.`order_id` =  O.`id`) ";
-			$strQueryWHERE .= " AND P.`wpsg_mod_abo_activ` = 1 ";
-			$strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = OP.`p_id`) ";
-			
-			return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER);
-			
-		}	// public static function getQueryPartsAbo($arFilter = array())
-		
-	} // class wpsg_mod_order extends wpsg_model
+?>
Index: /model/wpsg_order_product.class.php
===================================================================
--- /model/wpsg_order_product.class.php	(revision 8528)
+++ /model/wpsg_order_product.class.php	(revision 5261)
@@ -4,14 +4,14 @@
 	 * Klasse, die ein bestelltes Produkt behandelt
 	 */
-	class wpsg_order_product extends wpsg_model {
-
-        static $_tableName = 'WPSG_TBL_ORDERPRODUCT';
+	class wpsg_order_product extends wpsg_model
+	{
 
 		public $number;
-
+						
 		/**
 		 * LÃ€dt die Daten des bestellten Produkts
 		 */
-		public function load($order_product_id) {
+		public function load($order_product_id)
+		{
 		
 			parent::load($order_product_id);
@@ -19,25 +19,14 @@
 			$this->data = $this->db->fetchRow("SELECT OP.* FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`id` = '".wpsg_q($order_product_id)."' ");
 			
-			if ($this->data === null || $this->data['id'] != $order_product_id) {
-				
-				throw new \wpsg\Exception(
-					wpsg_translate(__('Die Daten eines bestellten Produktes (order_product_id: #1#) konnten nicht geladen werden', 'wpsg'), $order_product_id)
-				);
-				
-			}
+			if ($this->data['id'] != $order_product_id) $this->shop->throwErrorCode('100_6');
 			
 		} // public function load($order_product_id)
 				
-		public function getTaxValue() {
+		public function getTaxValue()
+		{
 				
 			return $this->mwst_value;
 				
 		} // public function getTaxValue()
-		
-		public function getTaxKey() {
-			
-			return $this->mwst_key;
-			
-		}
 		
 		public function getOneTaxAmount()
@@ -66,10 +55,9 @@
 		} // public function getOneAmount($brutto_netto = WPSG_BRUTTO)
 		
-		public function getAmount() {
-
-		    return intval($this->menge);
-
-			//if ($brutto_netto == WPSG_BRUTTO) return wpsg_tf($this->price_brutto * $this->menge);
-			//else return wpsg_tf($this->price_netto * $this->menge);
+		public function getAmount($brutto_netto = WPSG_BRUTTO)
+		{
+			
+			if ($brutto_netto == WPSG_BRUTTO) return wpsg_tf($this->price_brutto * $this->menge);
+			else return wpsg_tf($this->price_netto * $this->menge);
 			
 		} // public function getAmount()
@@ -82,14 +70,8 @@
 		} // public function getNumber()
 		
-		/**
-		 * @return wpsg_product
-		 */
-		public function getProduct() {
+		public function getProduct()
+		{
 			
-			$oProduct = $this->shop->cache->loadProductObject($this->getProductId());
-			
-			if ($this->getProductKey() !== null) $oProduct->setProductKey($this->getProductKey());
-			
-			return $oProduct;
+			return $this->shop->cache->loadProductObject($this->getProductId());
 			
 		} // public function getProduct()
@@ -102,10 +84,4 @@
 		} // public function getCount()
 		 
-		public function getDescription() {
-			
-			return $this->data['beschreibung']??'';
-			
-		}
-		
 		public function getProductIndex()
 		{
@@ -114,69 +90,16 @@
 			
 		}
- 		
-        public function getProductName() {
-
-			try {
-
-	            $strName = $this->getProduct()->getProductName();
-
-				/*
-	            if ($this->shop->hasMod('wpsg_mod_productvariants') && preg_match('/pv_(.*)/', $this->getProductKey())) {
-
-	                $vari = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($this->getProductKey()));
-
-	                if (wpsg_isSizedString($vari['key'])) $strName .= ' / '.$vari['key'];
-
-	            }
-				*/
-
-			} catch (\Exception $e) {
-
-				$strName = '---';
-
-			}
-
-            return $strName;
-
-        }
-
-        /**
-         * @return wpsg_order
-         */
-        public function getOrder() {
-
-            return wpsg_order::getInstance($this->data['o_id']);
-
-        }
-        
-        public function getPrice($tax_view = WPSG_NETTO) {
-		    
-		    if ($tax_view === WPSG_BRUTTO) {
-		        
-		        return $this->price_brutto;
-		        
-            } else {
-		        
-		        return $this->price_netto;
-		        
-            }
-		    
-        }
-
-        public function getPriceSum($tax_view = WPSG_NETTO) {
-
-            return $this->getPrice($tax_view) * $this->getAmount();
-
-        }
-
-		public function getProductKey() {
+		
+		public function getProductKey()
+		{
 			
-			$var_key = $this->mod_vp_varkey;
-			
-			if (wpsg_isSizedString($var_key)) {
+			if (wpsg_isSizedString($this->mod_vp_varkey))
+			{
 				
 				return $this->mod_vp_varkey;
 				
-			} else {
+			}
+			else
+			{
 				
 				return $this->productkey;
@@ -184,24 +107,25 @@
 			}
 			
-			return null;
-			
 		} // public function getProductKey()
 		
-		public function getProductId() {
-
-			$mod_vp_varkey = $this->mod_vp_varkey;
-			$productkey = $this->productkey;
-
-			if (wpsg_isSizedString($mod_vp_varkey)) {
+		public function getProductId()
+		{
+			
+			if (wpsg_isSizedString($this->mod_vp_varkey))
+			{
 				
-				return intval($this->shop->getProduktID($mod_vp_varkey));
+				return $this->shop->getProduktID($this->mod_vp_varkey);
 				
-			} else if (wpsg_isSizedString($productkey)) {
+			}
+			else if (wpsg_isSizedString($this->productkey))
+			{
 				
-				return intval($this->shop->getProduktID($productkey));
+				return $this->shop->getProduktID($this->productkey);
 				
-			} else {
-			 
-				return intval($this->p_id);
+			}
+			else
+			{
+				
+				return $this->p_id;
 				
 			}
@@ -210,2 +134,4 @@
 		
 	} // class wpsg_order_product extends wpsg_model
+
+?>
Index: /model/wpsg_product.class.php
===================================================================
--- /model/wpsg_product.class.php	(revision 8528)
+++ /model/wpsg_product.class.php	(revision 5261)
@@ -1,35 +1,23 @@
 <?php
-
-    use \wpsg\M1;
 
 	/**
 	 * Klasse, die ein Produkt behandelt
 	 */
-	class wpsg_product extends wpsg_model {
-
-	    static $_tableName = 'WPSG_TBL_PRODUCTS';
-
-		const MULTIPLE_ONE_MULTI = 0; // Nur einmal mit beliebiger Menge (Standard)
-		const MULTIPLE_ONE_ONE = 4; // Nur einmal mit Menge 1
-		const MULTIPLE_MULTI_MULTI = 1; // Mehrfach mit beliebiger Menge
-		const MULTIPLE_MULTI_ONE = 2; // Mehrfach mit Menge 1
-
-		private $_cache = [];
-		private $arMeta = null;
-		
-		public $loadedData = array(); /* EnthÃ€lt die Daten, die ÃŒber den ShopController und die Module geladen / erweitert wurden */		
-		public $product_key = "";		
-
+	class wpsg_product extends wpsg_model
+	{
+		
 		/**
 		 * LÃ€dt die Daten des Produkts
 		 */
-		public function load($product_id, $loadedData = false) {		 
-
+		public function load($product_id)
+		{
+		
 			parent::load($product_id);
- 
+							
 			$this->data = $this->db->fetchRow("SELECT P.* FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`id` = '".wpsg_q($product_id)."' ");
 
-			if ($this->shop->isOtherLang()) {
-
+			if ($this->shop->isOtherLang())
+			{
+			
 				$trans_produkt = $this->db->fetchRow("
 					SELECT
@@ -38,597 +26,148 @@
 						`".WPSG_TBL_PRODUCTS."` AS P
 					WHERE
-						P.`lang_code` = '".wpsg_q($this->shop->getCurrentLanguageCode())."' AND
+						P.`lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."' AND
 						P.`lang_parent` = '".wpsg_q($product_id)."'
 				");
-
+			
 				if ($trans_produkt['id'] > 0)
 				{
-
+						
 					$this->data['name'] = $trans_produkt['name'];
 					$this->data['beschreibung'] = $trans_produkt['beschreibung'];
 					$this->data['detailname'] = $trans_produkt['detailname'];
-
+						
 				}
-
-			}
- 
-			$this->loadedData = $this->shop->loadProduktArray($product_id);
-
-			if ($this->data['id'] != $product_id) throw new \wpsg\Exception(wpsg_translate(__('Gesuchte ID:#1# Gefundene ID:#2#', 'wpsg'), $product_id, $this->data['id']));
-
+				
+			}
+			
+			if ($this->data['id'] != $product_id) $this->shop->throwErrorCode('100_5');
+			
 			return true;
-
+				
 		} // public function load($product_id)
 		
 		/**
-		 * Nutzt die getProdcutCode und gibt einen Array mit allen gesetzten ProductCodes zurÃŒck
-		 * @return array
-		 */
-		public function getAllProductCodes(): array {
-		
-			$r = [];
-			
-			foreach (['ean', 'gtin', 'mpn', 'pzn', 'sku', 'upc', 'sin', 'asin', 'gpc', 'isbn', 'issn', 'isin', 'isrc', 'ismn', 'can', 'jan', 'jis', 'apn', 'cpc', 'man', 'ban'] as $code) {
-				
-				$code = $this->getProductCode($code);
-				
-				if ($code !== null) $r[] = $code;
-				
-			}
-			
-			return $r;
-		
-		}
-		
-		public function getCombination($pvariationID = null): ?\wpsg\wpsg_combination {
-
-			if ($pvariationID !== null) return \wpsg\wpsg_combination::findByProductAndKey($this->getId(), $pvariationID);
-			else {
-
-				if ($this->getProductKey() !== null) {
-					
-					return \wpsg\wpsg_combination::findByProductAndKey($this->getId(), $this->getProductKey());
-					
-				}
-
-			}
-			
-			return null;
-			
-		}
+		 * Setzt einen Wert in der META Tabelle
+		 */
+		public function setMeta($meta_key, $meta_value)
+		{
+				
+			$nExistsID = $this->db->fetchOne("SELECT M.`id` FROM `".WPSG_TBL_META."` AS M WHERE M.`meta_table` = 'WPSG_TBL_PRODUCTS' AND M.`meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' ");
+				
+			if (wpsg_isSizedInt($nExistsID))
+			{
+		
+				$this->db->UpdateQuery(WPSG_TBL_META, array(
+					'meta_value' => wpsg_q($meta_value)
+				), " `id` = '".wpsg_q($nExistsID)."' ");
+		
+			}
+			else
+			{
+		
+				$this->db->ImportQuery(WPSG_TBL_META, array(
+					'target_id' => wpsg_q($this->id),
+					'meta_table' => "WPSG_TBL_PRODUCTS",
+					'meta_key' => wpsg_q($meta_key),
+					'meta_value' => wpsg_q($meta_value)
+				));
+		
+			}
+				
+		} // public function setMeta($meta_key, $meta_value)
+		
+		/**
+		 * Gibt einen META Value zurÃŒck
+		 */
+		public function getMeta($meta_key)
+		{
+				
+			$meta_value = $this->db->fetchOne("SELECT M.`meta_value` FROM `".WPSG_TBL_META."` AS M WHERE M.`meta_table` = 'WPSG_TBL_PRODUCTS' AND M.`meta_key` = '".wpsg_q($meta_key)."' AND `target_id` = '".wpsg_q($this->id)."' ");
+				
+			return $meta_value;
+				
+		} // public function getMeta($meta_key)
 		
 		/**
 		 * Gibt den Namen des Produktes zurÃŒck
 		 */
-		public function getProductName($detailname = false, $pvariationID = null) {
-
-			if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
-
-				$oCombination = $this->getCombination($pvariationID);
-				
-				if ($oCombination !== null) {
-					
-					$strDetailname = $oCombination->getMeta('detailname');
-					
-					if (wpsg_isSizedString($strDetailname) && $detailname === true) {
-
-						$name_return = $strDetailname;
-		
-					} else {
-		
-						$name_return = $oCombination->getMeta('name');
-		
-					}
-					
-					if ($name_return !== '') return $name_return;
-					
-				}
-
-			}
-			
-			$strDetailname = $this->detailname;
-			
-			if (wpsg_isSizedString($strDetailname) && $detailname === true) {
-
-				$strName = $strDetailname;
-
-			} else {
-
-				$strName = $this->name;
-
-			}
-
-			if (strpos($strName, '^') !== false) {
-
-				$strName = preg_replace('/\^/', '<span class="wpsg_upper">', $strName).'</span>';
-
-			}
-
-			return $strName;
-
-		}
-		
-		/**
-		 * Gibt den Code zurÃŒck, fÃŒr $code_key kann folgendes verwendet werden:
-		 * ean, gtin, mpn, pzn, sku, upc, sin, asin, gpc, isbn, issn, isin, isrc, ismn, can, jan, jis, apn, cpc, man, ban
-		 *
-		 * @param string|null $code_key
-		 * @return string
-		 * @throws Exception
-		 */
-		public function getProductCode(?string $code_key = null, $pvariationID = null): ?array {
-			
-			$arCodes = ['ean', 'gtin', 'mpn', 'pzn', 'sku', 'upc', 'sin', 'asin', 'gpc', 'isbn', 'issn', 'isin', 'isrc', 'ismn', 'can', 'jan', 'jis', 'apn', 'cpc', 'man', 'ban'];
-			
-			if (in_array($code_key, $arCodes)) {
-				
-				$code = $this->getMeta($code_key, false, '');
-				
-				if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
- 
-					$oCombination = $this->getCombination($pvariationID);
-					
-					if ($oCombination !== null) {
-					
-						$code_variant = $oCombination->getMeta($code_key, false, '');
-						
-						if ($code_variant !== '') $code = $code_variant;
-						
-					}
-					
-				}
-				
-				if ($code === '') return null;
-				
-				$code_config = wpsg_product::getProductCodeConfig()[$code_key]??null;
-				
-				if ($code_config !== null) {
-					
-					$itemprop = $code_config['itemprop']??null;
-					
-				} else {
-					
-					$itemprop = null;
-					
-				}
-				
-				return [
-					'code' => $code,
-					'code_key' => $code_key,
-					'label' => strtoupper($code_key),
-					'itemprop' => $itemprop
-				];
-			
-			} else throw new \Exception(__('UngÃŒltiger Productcode angefragt.', 'wpsg'));
-			
-		}
-		
-		/**
-		 * Gibt die Artikelnummer zurÃŒck
-		 * @return string
-		 */
-		public function getNr($pvariationID = null) {
-			
-			$anr = $this->anr;
-		
-			if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
-
-				$oCombination = $this->getCombination($pvariationID);
-				
-				if ($oCombination !== null) {
-					
-					$vari_anr = $oCombination->getMeta('anr', false, '');
-					
-					if ($vari_anr !== '') $anr = $vari_anr;
-					
-				}
-				
-			}
-		
-			return $anr;
-			
-		}
-		
-		public function appendData($arData)
-		{
-
-			$this->loadedData = $arData;
-
-		} // public function appendData($arData)
-
-		public function delete() {
-
-			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
-				'deleted' => '1'
-			), "`id` = '".wpsg_q($this->id)."'");
-
-			$this->shop->callMods('produkt_del', array($this->id));
-
-			// Ãbersetzung lÃ¶schen
-			$this->db->UpdateQuerY(WPSG_TBL_PRODUCTS, array(
-				'deleted' => '1'
-			), "`lang_parent` = '".wpsg_q($this->id)."'");
-
-            wpsg_product::clearInstance($this->id);
-
-		} // public function delete()
-
-        public function deletePermanently() {
-
-            $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".M1::q($this->getId())."' ");
-            $this->db->Query("DELETE FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_PRODUCTS' AND `target_id` = '".M1::q($this->getId())."' ");
-
-            $this->shop->callMods('product_deletePermanently', [$this->getId()]);
-
-            wpsg_product::clearInstance($this->id);
-
-        }
-
-		/**
-		 * Setzt den Produkt Key
-		 */
-		public function setProductKey($product_key) {
-
-			$this->product_key = $product_key;
-			
-			$this->shop->callMods('product_setProductKey', [&$this, $product_key]);
-
-		} // public function setProductKey($product_key)
-
-		/**
-		 * Gibt den ProductKey zurÃŒck
-		 */
-		public function getProductKey()
-		{
-			
-			if (strlen($this->product_key) > 0) return $this->product_key;
-			else
-			{
-				 
-				if (wpsg_isSizedString($this->loadedData['product_key'])) return $this->loadedData['product_key'];
-				
-			}
-			
-			return $this->id;
-			
-		} // public function getProductKey()
-
-		/**
-		 * @return wpsg_productgroup
-		 */
-		public function getProductgroup() {
-
-			return wpsg_productgroup::getInstance($this->pgruppe);
-
-		} // public function getProductgroup()
-
-		public function getProductgroupName()
-		{
-
-			$oProductGroup = $this->getProductgroup();
-
-			if ($oProductGroup === false) return '----';
-			else return $oProductGroup->name;
-
-		} // public function getProductgroupName()
-
-		/**
-		 * Gibt die Produktbeschreibung zurÃŒck
-		 */
-		public function getLongDescription() {
-
-			return $this->data['longdescription'];
-
-		} // public function getShortDescription()
-
-		/**
-		 * Gibt die Produktbeschreibung zurÃŒck
-		 */
-		public function getLongDescriptionAddon() {
-
-			return $this->data['longdescription_addon'];
-
-		} // public function getShortDescription()
-
-		/**
-		 * Gibt die Produktfeatures zurÃŒck
-		 */
-		public function getProductfeatures() {
-
-			return $this->data['productfeatures'];
-
-		} // public function getProductfeatures()
-		
-		/**
-		 * Gibt die Produktbeschreibung zurÃŒck
-		 */
-		public function getShortDescription() {
-
-			return $this->data['beschreibung'];
-
-		} // public function getShortDescription()
- 
-		/**
-		 * DEPRECATED durch getProductCode ersetzt
-		 * Gibt die EAN zurÃŒck
-		 */
-		public function getEAN() {
-
-			$code = $this->getProductCode('ean');
-			
-			if ($code === null) return '';
-			else return $code['code'];
-
-		}
-
-		/**
-		 * DEPRECATED durch getProductCode ersetzt
-		 * Gibt die GTIN zurÃŒck
-		 */
-		public function getGTIN() {
- 
-			$code = $this->getProductCode('gtin');
-			
-			if ($code === null) return '';
-			else return $code['code'];
-
-		}
-
+		public function getProductName()
+		{
+									
+			return $this->name;
+			
+		} // public function getProductName()
+		
 		/**
 		 * Gibt die ProduktURL zurÃŒck
 		 * Siehe auch wpsg_ShopController->getProduktLink (Macht das gleiche, aber beachtet den Basket von welcher URL es hinzugefÃŒgt wurde da URL nicht eindeutig)
 		 */
-		public function getProductURL($language_key = false)
-		{
-
+		public function getProductURL()
+		{
+			
 			$url = false;
-
-			$this->shop->callMods('getProduktlink', array($this->id, &$url, $language_key));
-
+			
+			$this->shop->callMods('getProduktlink', array($this->id, &$url));
+			
 			if ($url === false)
 			{
-
-				$partikel = $this->partikel;
-
-				if (wpsg_isSizedInt($partikel))
+			
+				if (wpsg_isSizedInt($this->partikel))
 				{
-
+					
 					return get_permalink($this->partikel);
-
+					
 				}
 				else
 				{
-
-                    if ($this->shop->get_option('wpsg_page_product') > 0) $product_url = $this->shop->getURL(wpsg_ShopController::URL_PRODUCTDETAIL);
-                    else $product_url = $this->shop->getURL(wpsg_ShopController::URL_BASKET);
-
-					if (strpos($product_url, "?") > 0) {
-
-                        $product_url .= "&wpsg_action=showProdukt&produkt_id=".$this->id;
-
-					} else {
-
-                        $product_url .= "?wpsg_action=showProdukt&produkt_id=".$this->id;
-
+						
+					$basket_url = $this->shop->getURL(wpsg_ShopController::URL_BASKET);
+						
+					if (strpos($basket_url, "?") > 0)
+					{
+						
+						$basket_url .= "&wpsg_action=showProdukt&produkt_id=".$this->id;
+						
 					}
-
-					return $product_url;
-
+					else
+					{
+						
+						$basket_url .= "?wpsg_action=showProdukt&produkt_id=".$this->id;
+						
+					}
+											
+					return $basket_url;
+						
 				}
-
-			}
-			else
-			{
-
+			
+			}
+			else
+			{
+			
 				return $url;
-
-			}
-
-		} // public function getProductURL() 
-        
-		public function getDefaultTaxValue()
-		{
-
-			return $GLOBALS['wpsg_sc']->getDefaultCountry()->getTax($this->mwst_key);
-
-		} // public function getDefaultTaxValue()
-
-		/**
-		 * Bestimmt ob das Produkt z.B. in den ProduktÃŒbersichten angezeigt werden kann
-		 *
-		 * @param String $product_key Der ProduktKey
-		 * @return bool true wenn das Produkt sichtbar ist
-		 */
-		public function canDisplay($product_key = false)
-		{
-
-			if ($product_key === false) $product_key = $this->id;
-
-			// Module Checken
-			$bOK = $this->shop->callMods('canDisplay', array($product_key));
-
-			return $bOK;
-
-		} // public function canDisplay($product_key = false)
-
-		/**
-		 * Bestimmt ob der Preis des Produktes angezeigt werden darf
-		 *
-		 * @param String $product_key Der ProduktKey
-		 * @param bool $product_key true wenn der Preis angezeigt werden darf
-		 */
-		public function canDisplayPrice($product_key = false)
-		{
-
-			if ($product_key === false) $product_key = $this->id;
-						
-			// War mal im Produkt, muss aber auch ohne Produktbezug funktionieren z.B. fÃŒr den Preisfilter
-			// Im ShopController wird die Preisanzeige fÃŒr angemeldete Nutzer geprÃŒft
-			return $GLOBALS['wpsg_sc']->canDisplayPrice();
-
-		} // public function canDisplayPrice($product_key = false)
-
-		/**
-		 * Gibt true zurÃŒck, wenn das Produkt gekauft werden kann, false wenn nicht
-		 * Bestimmt ob der Button im Warenkorb angezeigt wird
-		 */
-		public function canOrder($product_key = false)
-		{
-
-			if ($product_key === false) $product_key = $this->id;
-
-			// Anfrageprodukt?
-			if ($this->shop->hasMod('wpsg_mod_request'))
-			{
-
-				$wpsg_mod_request_set = $this->getMeta('wpsg_mod_request_set');
-
-				//if (!(!is_numeric($wpsg_mod_request_set) || in_array($wpsg_mod_request_set, array(wpsg_mod_request::TYP_YES, wpsg_mod_request::TYP_YESWITHBASKET)))) return false;
-				if (!(!is_numeric($wpsg_mod_request_set) || ($wpsg_mod_request_set == wpsg_mod_request::TYP_NO))) return false;
-				
-			}
-			
-			// Kauf nur fÃŒr angemeldete Benutzer?
-			if (!$this->shop->canDisplayPrice()) return false;
-			
-						// Module Checken
-			$bOK = $this->shop->callMods('canOrder', array($product_key));
-			
-			return $bOK;
-
-		} // public function canOrder()
-
-		/**
-		 * Gibt den MwSt. Wert fÃŒr das Frontend zurÃŒck
-		 */
-		public function getFrontendTaxValue()
-		{
-
-		    $oCountry = $this->shop->getFrontendCountry();
-             
-            return $oCountry->getTax($this->mwst_key);
-
-		} // public function getFrontendTaxValue()
-
-		/**
-		 * Gibt den Alten Preis fÃŒr das Frontend zurÃŒck
-		 */
-		public function getOldPrice($taxView = false) {
-		    
-		    if ($taxView === false) {
-		        
-		        if (is_admin()) $taxView = $this->shop->getBackendTaxview();
-		        else $taxView = $this->shop->getFrontendTaxview();
-		        
-		    }
-		    
-		    $oldprice = wpsg_tf($this->oldprice);
-		    
-		    // Rabatt ÃŒberschreibt die Produkteinstellung
-		    if ($this->shop->hasMod('wpsg_mod_discount') && wpsg_isSizedInt($this->shop->get_option('wpsg_mod_discount_show')) && isset($this->loadedData['preis_prediscount'])) {
-		        
-		        // Rabatt
-		        $oldprice = $this->loadedData['preis_prediscount'];
-		        
-		        if ($oldprice > 0) return $oldprice;
-		        else return false;
-		        
-		    } else {
-		    
-		        if ($oldprice > 0) return $this->calculateTaxViewPrice($oldprice, $taxView);
-		        else return false;
-
-		    }
-		    
-		}
-
-		public function getMinPrice($product_key = false) {
-
-			return $this->getPrice($product_key);
-
-		}
-
-		/**
-		 * Gibt den Preis fÃŒr das Frontend zurÃŒck
-		 * @param $product_key Produktkey
-		 * @param $taxView Anzuzeigende Steuer
-		 * @param int $amount Menge des Produktes im Warenkorb. bei false wird in die Session geschaut
-		 * @param double $weight Gewicht des Produktes im Warenkob, bei false wird anhand der Session ermittelt 
-		 * @param boolean $scalePrice Wenn False, dann wird der Staffelpreis ignoriert
-		 */
-		public function getPrice($product_key = false, $taxView = false, $amount = false, $weight = false, $scalePrice = true) {
-	
-			// AbwÃ€rtskompatibilitÃ€t, weil alte Produkttemplates die Funktion ohne Parameter aufrufen
-			if ($product_key === false && wpsg_isSizedString($GLOBALS['wpsg_sc']->view['data']['product_key'])) $product_key = $GLOBALS['wpsg_sc']->view['data']['product_key'];
-			
-			// Grundpreis aus dem Produkt
-			if ($this->shop->getBackendTaxview() === WPSG_BRUTTO) {
-				
-				$price_brutto = $this->data['preis'];
-				$price_netto = wpsg_calculatePreis($price_brutto, WPSG_NETTO,$this->shop->getDefaultCountry()->getTax($this->data['mwst_key']));
-				
-			} else {
-				
-				$price_netto = $this->data['preis'];
-				$price_brutto = wpsg_calculatePreis($price_netto, WPSG_BRUTTO, $this->shop->getDefaultCountry()->getTax($this->data['mwst_key']));
-				
-			}
-
-			// Abo VerlÃ€ngerungen
-			$this->shop->callMod('wpsg_mod_abo', 'product_getPrice', [&$this, &$price_netto, &$price_brutto, $product_key, $amount, $weight]);
-
-			if ($scalePrice) {
-				
-				// Staffelpreis
-				$this->shop->callMod('wpsg_mod_scaleprice','product_getPrice', [&$this, &$price_netto, &$price_brutto, $product_key, $amount, $weight]);
-				
-			}
-
-			// Varianten 
-			$this->shop->callMod('wpsg_mod_productvariants', 'product_getPrice', [&$this, &$price_netto, &$price_brutto, $product_key, $amount, $weight]);
-			
-			// Rabatte
-			$this->shop->callMod('wpsg_mod_discount', 'product_getPrice', [&$this, &$price_netto, &$price_brutto, $product_key, $amount, $weight]);
-			 
-			if ($taxView === false) {
-				
-				if (is_admin()) $taxView = $this->shop->getBackendTaxview();
-				else $taxView = $this->shop->getFrontendTaxview();
-				
-			}
-			
-			if ($taxView === WPSG_BRUTTO) {
-				
-				$price = $price_brutto;
-				
-			} else {
-				
-				$price = $price_netto;
-				
-			} 
-			
-			return $price;
-
-		}
-
+			
+			}
+			
+		} // public function getProductURL()
+		
 		/**
 		 * Gibt true zurÃŒck, wenn die Zahlungsarten fÃŒr das Produkt eingeschrÃ€nkt sind
-		 * @return bool
+		 * @return bool 
 		 */
 		public function hasLimitedPayment()
 		{
-
+			
 			$arAllowedPayment = explode(',', $this->allowedpayments);
-			$arAllowedPayment = wpsg_trim($arAllowedPayment, array('', '0'));
-
+			$arAllowedPayment = wpsg_trim($arAllowedPayment, '0');
+			
 			if (wpsg_isSizedArray($arAllowedPayment))
 			{
-
+				
 				return true;
-
-			}
-
+				
+			}
+			
 		} // public function hasLimitedPayment()
-
+				
 		/**
 		 * Gibt einen Array mit IDs von Zahlungsarten zurÃŒck, die fÃŒr dieses Produkt erlaubt sind
@@ -638,267 +177,34 @@
 		public function getAllowedPayment()
 		{
-
+			
 			if (!$this->hasLimitedPayment()) return array();
 			else
 			{
-
+				
 				$arPayment = wpsg_trim((array)explode(',', $this->allowedpayments), '0');
-
+				
 				return $arPayment;
-
-			}
-
+				
+			}
+			
 		} // public function getAllowedPayment()
-
+		
 		/**
 		 * Gibt true zurÃŒck, wenn die Versandarten fÃŒr das Produkt eingeschrÃ€nkt sind
 		 */
-		public function hasLimitedShipping() {
-
+		public function hasLimitedShipping()
+		{
+				
 			$arAllowedShipping = explode(',', $this->allowedshipping);
-			$arAllowedShipping = wpsg_trim($arAllowedShipping, array('', '0'));
-
-			if (wpsg_isSizedArray($arAllowedShipping)) {
-
+			$arAllowedShipping = wpsg_trim($arAllowedShipping, '0');
+			
+			if (wpsg_isSizedArray($arAllowedShipping))
+			{
+		
 				return true;
-
-			}
- 			
-			return false;
-
+		
+			}
+				
 		} // public function hasLimitedShipping()
-
-        public function getRatingCount()
-        {
-
-            if (!isset($this->loadedData['rating'])) return 0;
-            else if ($this->loadedData['rating'] === '-1')
-            {
-
-                return sizeof(\get_comments(array(
-                    'post_id' => $this->GetPostID(),
-                    'type' => 'wpsg_product_comment',
-                    'status' => 'approve'
-                )));
-
-            }
-            else return 1;
-
-        }
-        
-		public function getRating()
-		{
-			 
-			if (!isset($this->loadedData['rating_calculated']))
-			{
-				
-				if (!isset($this->loadedData['rating'])) $this->loadedData['rating_calculated'] = 0;
-				else
-				{
-					
-					if ($this->loadedData['rating'] === '-1')
-					{
-						
-						$arApprovedComments = \get_comments(array(
-							'post_id' => $this->GetPostID(),
-							'type' => 'wpsg_product_comment',
-							'status' => 'approve'
-						));
-						
-						$point = 0;
-						$nPointSet = 0;
-						
-						foreach ($arApprovedComments as $oWP_Comment)
-						{
-							
-							$comment_point = intval(get_comment_meta($oWP_Comment->comment_ID, 'sto_points', true));
-							
-							if ($comment_point > 0)
-							{
-								
-								$point += $comment_point;
-								$nPointSet ++;
-								
-							}
-							
-						}
-								 				
-						if ($nPointSet <= 0) $this->loadedData['rating_calculated'] = 0;
-						else $this->loadedData['rating_calculated'] = $point / $nPointSet;
-						
-					}
-					else
-					{
-						
-						$this->loadedData['rating_calculated'] = $this->loadedData['rating'];
-						
-					}
-					
-				}
-				
-			}
-			
-			return $this->loadedData['rating_calculated'];
-			
-		}
-		
-		public function getPostID()
-		{
-			
-			if (!isset($this->loadedData['post_id'])) return false;
-			else return $this->loadedData['post_id'];
-			
-		} // public function getPostID()
-
-		/**
-		 * Gibt einen String zurÃŒck. Entwickelt fÃŒr die Googel Produktfeed Versandintegration
-		 * Format: '<LÃ€nderkÃŒrzel>:::<Versandkosten>'
-		 * @return string
-		 */
-		function getGPFShipping($allowedCountryCodes) {
-
-			$allowedShippingIds = $this->getAllowedShipping();
-			$allShippingMethods = $this->shop->arShipping;
-
-			$shippingCosts = array();
-			foreach ($allowedShippingIds as $shippingId) {
-
-				if (!in_array($allShippingMethods[$shippingId]['price'], ['0', 'w-0,00'])) {
-					
-					$shippingCosts[$allShippingMethods[$shippingId]['vz']][] = floatval(str_replace(',', '.', substr($allShippingMethods[$shippingId]['price'], 2)));
-					
-				}
-				
-			}
-
-			$lowestShippingCosts = array();
-			foreach ($shippingCosts as $vz => $costs) {
-
-
-				if (!in_array(0, $costs)) $lowestShippingCosts[$vz] = min($costs);
-				else { // Versandkosten 0 werden nicht beachtet
-
-					$nonZeroCosts = [];
-					foreach ($costs as $cost) {
-
-						if ($cost != '0') $nonZeroCosts[] = $cost;
-
-					}
-
-					if (sizeof($nonZeroCosts) > 0) $lowestShippingCosts[$vz] = min($nonZeroCosts);
-
-				}
-
-				
-			}
-
-			$countryCodes = array();
-			foreach (wpsg_country::find() as $country) {
-
-				$countryCode = $country->getShorttext();
-				$shippingZoneId = $country->getShippingZoneId();
-
-				/*
-				 * Die Syntax des Versandattributs hat laut Doku so auszusehen: [country]:[region]:[service]:[price]
-				 * siehe hier: https://support.google.com/merchants/answer/6324484?hl=en&sjid=2740661050506542778-EU
-				 * Country [country]: Hier muss das LÃ€nderkÃŒrzel an angegeben werden, fÃŒr das die Versandkosten gelten. Beispielweise kÃ¶nnte "DE" fÃŒr Deutschland stehen.
-				 * Region [region]: Diese Option ist optional und ermÃ¶glicht es Ihnen, spezifischere regionale Informationen anzugeben, falls erforderlich. Beispielweise bestimmte Versandkosten fÃŒr verschiedene BundeslÃ€nder oder Regionen innerhalb eines Landes.
-				 * Service [service]: Hier kann der Versandservice angegeben werden, fÃŒr den die Kosten gelten. Es kÃ¶nnte sich um verschiedene Versandmethoden oder -optionen handeln, wie "Standardversand", "Expressversand" usw.
-				 * Price [price]: Das ist der Preis fÃŒr den Versand.ER kann in einer selbst gewÃ€hlten WÃ€hrung angegeben werden, zum Beispiel "EUR 5.99" oder "5.99 EUR". Wichtig: Beim Preis muss die US Dezimalschreibweise genutzt werden.
-				 * Beispiel: DE:BE:Standardversand:EUR 3.99 ("DE" steht fÃŒr Deutschland und "BE" steht fÃŒr Berlin)
-				 */
-				if (in_array($countryCode, $allowedCountryCodes)) {
-					$countryCodes[] = $countryCode . ':::' . sprintf('%.2f', $lowestShippingCosts[$shippingZoneId]) . ' ' . $this->shop->get_option('wpsg_currency');
-				}
-
-			}
-
-			return implode(',', $countryCodes);
-
-		}
-		
-		public function getPossibleProductVariantKeys(): array {
-			
-			if (!wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) return [];
-			if (!wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'isVariantsProduct', [$this->getId()])) return [];
-			
-			$arVariantInfo = wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'getVariants', [$this->getId(),  true, true, true]);
-	
-			$arVariant = [];
-			$arVariationen = [];
-			
-			foreach ($arVariantInfo as $var) {
-				
-				$arVariationen[$var['id']] = [];
-				
-				foreach ($var['arVariation'] as $vari) {
-					
-					$arVariationen[$var['id']][] = $vari['variation_id'];
-					
-				}
-				
-				if (sizeof($arVariationen[$var['id']]) > 0) $arVariant[] = $var['id'];
-				
-			}
-			
-			if (sizeof($arVariant) <= 0) return [];
-			
-			$nVariant = sizeof($arVariant); $result = [];
-			
-			$rec_get_combi = function($current_combination, $current_variant) use ($nVariant, $arVariant, $arVariationen, &$result, &$rec_get_combi) {
-				
-				if ($current_variant >= $nVariant) {
-					
-					$result[] = $current_combination;
-					
-					return;
-					
-				}
-				
-				foreach ($arVariationen[$arVariant[$current_variant]] as $variation) {
-					
-					$next_combination = $current_combination;
-					$next_combination[$arVariant[$current_variant]] = $variation;
-					
-					$rec_get_combi($next_combination, $current_variant + 1);
-					
-				}
-				
-			};
-			
-			$rec_get_combi([], 0);
-			
-			foreach ($result as $k => $v) {
-				
-				$arKey = []; $arLabel = [];
-				
-				foreach ($v as $var_id => $vari_id) {
-					
-					$arKey[] = $var_id.':'.$vari_id;
-					
-					/*
-					$var_label = '['.$var_id.']';
-					$vari_label = '['.$vari_id.']';
-					
-					try { $var_label = \wpsg\wpsg_variant::getInstance($var_id)->getLabel(); } catch (\Exception $e) { }
-					try { $vari_label = \wpsg\wpsg_variation::getInstance($vari_id)->getLabel(); } catch (\Exception $e) { }
-					
-					$arLabel[] = $var_label.':'.$vari_label;
-					*/
-					
-				}
-				
-				$key = \wpsg\wpsg_combination::normalizeKey(implode('|', $arKey));
-				
-				$result[$k] = [
-					'label' => wpsg\wpsg_combination::getLabelFromKey($key),
-					'var_key' => $key
-				];
-				
-			}
-			
-			return $result;
-			
-		}
 		
 		/**
@@ -909,653 +215,18 @@
 		public function getAllowedShipping()
 		{
+			
+			if (!$this->hasLimitedShipping()) return array();
+			else
+			{
+				
+				$arShipping = wpsg_trim((array)explode(',', $this->allowedshipping), '0');
+				
+				return $arShipping;
+				
+			}
+			
+		} // public function getAllowedShipping()
+		
+	} // class wpsg_product extends wpsg_model
 
-            $arShipping = wpsg_trim((array)explode(',', $this->allowedshipping), ['', '0']);
-            
-            if (wpsg_isSizedArray($arShipping)) return $arShipping;
-            else {
-                
-                if (!is_array($this->shop->arShippingAll)) $this->shop->arShippingAll = [];
-                
-                $arShipping = array_keys($this->shop->arShippingAll);
-
-                if ($this->shop->hasMod('wpsg_mod_downloadprodukte')) {
-                    
-                    if ($this->shop->callMod('wpsg_mod_downloadprodukte', 'getProdFiles',[$this->id]) === false) {
-
-                        unset($arShipping[array_search('601', $arShipping)]);
-
-                    } else {
-                        
-                        $arShipping = ['601'];
-                        
-                    }
-                        
-                }
-
-                if ($this->shop->hasMod('wpsg_mod_downloadplus')) {
-
-                    if ($this->shop->callMod('wpsg_mod_downloadplus', 'isPDFProdukt',[$this->id]) === false) {
-
-                        unset($arShipping[array_search('101', $arShipping)]);
-
-                    } else {
-
-                        $arShipping = ['101'];
-
-                    }
-
-                }
-
-                return $arShipping;
-                
-            } 
-
-		} // public function getAllowedShipping()
-
-		/* Private Funktionen */
-
-		/**
-		 * @param $price	Der Preis aus dem Backend
-		 * @param $taxView
-		 * @return float
-		 */
-		private function calculateTaxViewPrice($price, $taxView)
-		{
-
-			if ($this->shop->getBackendTaxview() === WPSG_NETTO)
-			{
-
-				$price_netto = $price;
-				$price_brutto = wpsg_calculatePreis($price_netto, WPSG_BRUTTO, $this->shop->getCalcTaxValue($this->mwst_key));
-
-			}
-			else
-			{
-
-				$price_brutto = $price;
-				$price_netto = wpsg_calculatePreis($price_brutto, WPSG_NETTO, $this->shop->getCalcTaxValue($this->mwst_key));
-
-			}
-
-			if ($taxView === false)
-			{
-
-				if (is_admin()) $taxView = $this->shop->getBackendTaxview();
-				else $taxView = $this->shop->getFrontendTaxview();
-
-			}
-
-			if ($taxView === WPSG_NETTO) return $price_netto;
-			else return $price_brutto;
-
-		}
-		
-		public function getMenuOrder() {
-			
-			return wpsg_getInt($this->loadedData['menu_order']);
-			
-		}
-		
-		/**
-		 * Soll beim Speichern und beim kauf der Bestand im Produkt aus dem Variantenbestand berechnet werden?
-		 * @return bool
-		 * @throws Exception
-		 */
-		public function isCalcStockFromVariStock(): bool {
-			
-			$meta_value = $this->getMeta('wpsg_vp_product_stock_nocalc', false, '0');
-			
-			if ($meta_value === '0') {
-			
-				return match($this->shop->get_option('wpsg_vp_product_stock_nocalc')) {
-					'1' => false,
-					default => true
-				};
-				
-			} else {
-				
-				return match($meta_value) {
-					'2' => true,
-					'1' => false,
-					default => throw new \Exception(wpsg_translate(__('UngÃŒltiger META Wert (#1#) bei wpsg_vp_product_stock_nocalc', 'wpsg'), $meta_value))
-				};
-				
-			}
-			
-		}
-		
-		/**
-		 * Soll der Bestand in der Variante beim Kauf reduziert werden
-		 * @return bool
-		 * @throws Exception
-		 */
-		public function isReduceVariStockEnabled(): bool {
-			
-			$meta_value = $this->getMeta('wpsg_vp_product_stock_varinotchange', false, '0');
-			
-			if ($meta_value === '0') {
-			
-				return match($this->shop->get_option('wpsg_vp_product_stock_varinotchange')) {
-					'1' => false,
-					default => true
-				};
-				
-			} else {
-				
-				return match($meta_value) {
-					'2' => true,
-					'1' => false,
-					default => throw new \Exception(wpsg_translate(__('UngÃŒltiger META Wert (#1#) bei wpsg_vp_product_stock_varinotchange', 'wpsg'), $meta_value))
-				};
-				
-			}
-			
-		}
-		
-		/* Statische Funktionen */
-
-		public static function findMaxPrice($arFilter = array())
-		{
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strQuery = "
-				SELECT
-					MAX(P.`preis`)
-				FROM
-					`".WPSG_TBL_PRODUCTS."` AS P
-						".$strQueryJOIN."
-				WHERE
-					1
-					".$strQueryWHERE."
-				HAVING
-					1
-					".$strQueryHAVING."
-			";
-
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-
-		}
-
-		public static function findMinPrice($arFilter = array())
-		{
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strQuery = "
-				SELECT
-					MIN(P.`preis`)
-				FROM
-					`".WPSG_TBL_PRODUCTS."` AS P
-						".$strQueryJOIN."
-				WHERE
-					1
-					".$strQueryWHERE."
-				HAVING
-					1
-					".$strQueryHAVING."
-			";
- 
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-
-		} // public static function getMinPrice($arFilter = array())
-
-		public static function count($arFilter = array()) {
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					(
-						SELECT
-						  	DISTINCT P.`id`
-						    ".$strQuerySELECT."
-						FROM
-							`".WPSG_TBL_PRODUCTS."` AS P
-							".$strQueryJOIN."
-						WHERE
-							1
-							".$strQueryWHERE."
-						GROUP BY
-							P.`id`
-						HAVING
-							1
-							".$strQueryHAVING."						
-					) AS innerSelect
-			";
-          
-			if (($arFilter['debug']??false) === true) wpsg_debug($strQuery);
-			
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-
-		}
-
-		/**
-		 * @param array $arFilter
-		 * @param bool $load
-		 *
-		 * @return wpsg_product[]
-		 * @throws \wpsg\Exception
-		 */
-		public static function find($arFilter = array(), $load = true) {
- 
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strLimit = "";
-
-			if (wpsg_isSizedArray($arFilter['limit'])) $strLimit = "LIMIT ".wpsg_q($arFilter['limit'][0]).", ".wpsg_q($arFilter['limit'][1]);
-
-			$strQuery = "
-				SELECT
-					P.`id`
-					".$strQuerySELECT."
-				FROM
-					`".WPSG_TBL_PRODUCTS."` AS P
-						".$strQueryJOIN."
-				WHERE
-					1
-					".$strQueryWHERE."
-				GROUP BY
-					P.`id`
-				HAVING
-					1
-					".$strQueryHAVING."
-				ORDER BY
-					".$strQueryORDER."
-				".$strLimit."
-			";
-
-			// wpsg_debug($strQuery);
-			
-			$arID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery);
-			$arReturn = array();
-
-			// Manche Filterungen erfordern leider Objektzugriff
-			$force_load = false;
-
-			// Wenn ich die nicht kaufbaren Produkte rausfiltern will, kann ich es nicht auf einen DB Query beschrÃ€nken, da ich die Module anfragen muss
-			if (wpsg_isSizedInt($arFilter['hideNotBuyable'])) $force_load = true;
-
-			foreach ($arID as $id) {
-
-				if ($load === true || $force_load === true) {
-
-					$arReturn[$id] = self::getInstance($id);
-
-					if (wpsg_isSizedInt($arFilter['hideNotBuyable']) && !$arReturn[$id]->canOrder()) { unset($arReturn[$id]); continue; }
-
-					// StandardmÃ€Ãig werden nicht anzeigbare Produkte ausgeblendet
-					// Erfordert das die Objekt geladen wurden, sonst muss spÃ€ter geprÃŒft werden
-					if (!$arReturn[$id]->canDisplay()) { unset($arReturn[$id]); continue; }
-
-					if (isset($arReturn[$id]) && $force_load === true && $load === false) $arReturn[$id] = $id;
-
-				} else $arReturn[$id] = $id;
-
-			}
-
-            if (isset($arFilter['order']) && $arFilter['order'] === 'price') {
-
-                uasort($arReturn, function($a, $b) use ($arFilter) {
-
-                    if (!is_object($a)) $a = wpsg_product::getInstance($a);
-                    if (!is_object($b)) $b = wpsg_product::getInstance($b);
-
-	                if ($arFilter['ascdesc'] === 'DESC') $order = 1;
-	                else $order = -1;
-
-                    if ($a->getMinPrice() === $b->getMinPrice()) return 0;
-                    return ($a->getMinPrice() < $b->getMinPrice())?$order:-1 * $order;
-
-                } );
-
-            }
-
-			return $arReturn;
-
-		} // public function find($arQuery = array())
-
-		public static function getQueryParts($arFilter = array()) {
-
-			$strQuerySELECT = "";
-			$strQueryWHERE = " AND P.`lang_parent` <= 0 ";
-			$strQueryJOIN = "";
-			$strQueryHAVING = "";
-			$strQueryORDER = "";
-            
-            $bJoinPost = false;
-            $bJoinVariants = false;
-			$bJoinTermRelationship = false;
-			$bJoinTermTaxonomy = false;
-			$bJoinTerms = false;
-			
-			$strQueryOn_TermTaxonomy = '';
-			$strQueryOn_Terms = '';
-            
-			if (intval($arFilter['productcategory_ids']??0) === -2) {
-				
-				unset($arFilter['productcategory_ids']);
-				$arFilter['isNoCat'] = true;
-				
-			}
-			
-			if (wpsg_isSizedArray($arFilter['product_ids'])) $strQueryWHERE .= " AND P.`id` IN (".wpsg_q(implode(',', $arFilter['product_ids'])).") ";
-
-			if (wpsg_isSizedArray($arFilter['productgroup_ids'])) $strQueryWHERE .= " AND P.`pgruppe` IN (".wpsg_q(implode(',', $arFilter['productgroup_ids'])).") ";
-			else if (wpsg_isSizedString($arFilter['productgroup_ids']) && $arFilter['productgroup_ids'] != '-1') $strQueryWHERE .= " AND P.`pgruppe` IN (".wpsg_q($arFilter['productgroup_ids']).") ";
-
-			if (wpsg_isSizedString($arFilter['price_min'])) $strQueryWHERE .= " AND P.`preis` >= '".wpsg_q($arFilter['price_min'])."' ";
-			if (wpsg_isSizedString($arFilter['price_max'])) $strQueryWHERE .= " AND P.`preis` <= '".wpsg_q($arFilter['price_max'])."' ";
-
-			if (sizeof($arFilter['exclude_ids']??[]) > 0) { $strQueryWHERE .= " AND P.`id` NOT IN (".implode(',', array_map('intval', $arFilter['exclude_ids'])).") "; }
-			
-            if (wpsg_isSizedString($arFilter['s'])) {
-
-                if (preg_match('/ID:(\d+)?/i', $arFilter['s'], $m)) {
-
-                    $strQueryWHERE .= " AND P.`id` = '".wpsg_q($m[1])."' ";
-
-                } else {
-
-                    $strQueryWHERE_OR = "";
-
-                    if ($GLOBALS['wpsg_sc']->hasMod('wpsg_mod_productvariants') && wpsg_isSizedInt($arFilter['searchExt']))
-                    {
-
-                        $bJoinVariants = true;
-
-                        //$strQueryWHERE_OR .= " OR V.`name` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-                        $strQueryWHERE_OR .= " OR VV.`name` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-                        $strQueryWHERE_OR .= " OR VV.`shortname` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-                        $strQueryWHERE_OR .= " OR PV.`anr` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-
-                    }
-
-                    $strQueryWHERE .= "
-						AND (							
-							P.`name` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-							P.`anr` LIKE '%".wpsg_q($arFilter['s'])."%'
-							".$strQueryWHERE_OR."
-						)
-					";
-
-                }
-
-            }
-
-			if (($arFilter['isNoCat']??false) === true) {
-				 
-				$strQuerySELECT = ", (
-					SELECT
-						COUNT(*)
-					FROM
-						`".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS SUB_POST
-							RIGHT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS SUB_PCAT ON (SUB_POST.`ID` = SUB_PCAT.`object_id`)
-					WHERE
-						SUB_POST.`wpsg_produkt_id` = P.`id`
-				) AS `count_cat` ";				
-				
-				$strQueryHAVING .= " AND `count_cat` <= 0 ";
-				
-			}
-			
-			if (wpsg_isSizedArray($arFilter['cat_ids']) && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_produktartikel')) {
-
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";
-
-				$bJoinPost = true;
-				$bJoinTermRelationship = true;
-
-				$strQueryWHERE .= " AND PCAT.`term_taxonomy_id` IN (".wpsg_q(implode(',', $arFilter['cat_ids'])).") ";
-
-			}
-
-			if (($arFilter['loadCat']??false) === true) {
-				
-				$bJoinPost = true;
-				$bJoinTermRelationship = true;
-				$bJoinTermTaxonomy = true;
-				$bJoinTerms = true;
-				
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";				
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";				
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_taxonomy')."` AS TERMTAX ON (TERMTAX.`term_taxonomy_id` = PCAT.`term_taxonomy_id`) ";
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'terms')."` AS TERMS ON (TERMS.`term_id` = TERMTAX.`term_id`) ";
-				
-				if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strDirection = " DESC ";
-				else $strDirection = " ASC ";
-				
-				if (wpsg_ShopController::getShop()->get_option('wpsg_mod_produktartikel_cat_first_level') === '1') {
-					
-					$strQueryOn_TermTaxonomy .= " AND TERMTAX.`parent` = '0' ";
-					
-				}
-				
-				$wpsg_mod_produktartikel_cat_ignore = trim(wpsg_ShopController::getShop()->get_option('wpsg_mod_produktartikel_cat_ignore'));
-				
-				if ($wpsg_mod_produktartikel_cat_ignore !== '') {
-				
-					foreach (explode(',', wpsg_ShopController::getShop()->get_option('wpsg_mod_produktartikel_cat_ignore')) as $exclude_term_slug) {
-						
-						if ($exclude_term_slug > 0) $strQueryOn_Terms .= " AND TERM.`slug` != '".wpsg_q($exclude_term_slug)."' ";
-						
-					}
-				
-				}
-            				
-				$strQuerySELECT .= " , GROUP_CONCAT(TERMS.name ORDER BY TERMS.name ".$strDirection.") AS `cat_names` ";
-				
-			}
-			
-			if ((wpsg_isSizedString($arFilter['productcategory_ids'])) && ($arFilter['productcategory_ids'] != '-1') && ($GLOBALS['wpsg_sc']->hasMod('wpsg_mod_produktartikel'))) {
-
-				$bJoinPost = true;
-				$bJoinTermRelationship = true;
-				
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";
-				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS TR ON (POST.`ID` = TR.`object_id`) ";
-
-				$strQueryWHERE .= " AND PCAT.`term_taxonomy_id` = ".$arFilter['productcategory_ids']." ";
-		
-			}
-
-			if (wpsg_isSizedArray($arFilter['variants'])) {
-
-				foreach (wpsg_trim($arFilter['variants']) as $variant_id => $variation_id) {
-
-					$in = wpsg_q($variant_id);
-					$strQueryJOIN .= " RIGHT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PVI".$in." ON (PVI".$in.".`product_id` = P.`id` AND PVI".$in.".`variation_id` IN (".wpsg_q($variation_id).") AND PVI".$in.".`active` = '1') ";
-
-				}
-
-			}
-
-			if (wpsg_isSizedArray($arFilter['attributs'])) {
-
-				foreach ($arFilter['attributs'] as $attribut_id => $attribut_value) {
-
-					$in = wpsg_q($attribut_id);
-					$arValues = wpsg_trim(explode(',', $attribut_value));
-
-					$strQueryJOIN_ATTRIBUTE_ON  = " ( 0 ";
-					foreach ($arValues as $k => $value) $strQueryJOIN_ATTRIBUTE_ON .= " OR PA".$in.".`value` = '".wpsg_q($value)."' ";
-					$strQueryJOIN_ATTRIBUTE_ON .= " ) ";
-
-					$strQueryJOIN .= " RIGHT JOIN `".WPSG_TBL_PRODUCTS_AT."` AS PA".$in." ON (PA".$in.".`p_id` = P.`id` AND PA".$in.".`a_id` = '".wpsg_q($attribut_id)."' AND ".$strQueryJOIN_ATTRIBUTE_ON.") ";
-
-				}
-
-			}
-			
-			if (!wpsg_isTrue($arFilter['showDisabled'])) $strQueryWHERE .= " AND P.`disabled` != '1' ";
-
-			if (wpsg_isSizedString($arFilter['order'], 'name')) { $strQueryORDER = " P.`name` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'price')) { $strQueryORDER = " P.`preis` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'cdate')) { $strQueryORDER = " P.`cdate` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'mwst')) { $strQueryORDER = " P.`mwst_key` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'anr')) { $strQueryORDER = " P.`anr` "; }
-            else if (wpsg_isSizedString($arFilter['order'], 'pos')) { $strQueryORDER = " POST.`menu_order` "; $bJoinPost = true; }
-			else if (($arFilter['order']??'') === 'cat') { $strQueryORDER = " `cat_names` "; }
-			else if (($arFilter['order']??'') === 'stock') { $strQueryORDER = " `stock` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'pgruppe')) {
-
-				$strQuerySELECT .= " , (SELECT PG.`name` FROM `".WPSG_TBL_PRODUCTS_GROUP."` AS PG WHERE PG.`id` = P.`pgruppe`) AS `order_count` ";
-				$strQueryORDER = " order_count ";
-
-			} else $strQueryORDER = " P.`id` ";
-
-			//$strQueryJOIN .= " LEFT JOIN `".$GLOBALS['wpsg_sc']->prefix."posts` AS PP ON (PP.`wpsg_produkt_id` = P.`id` AND PP.`post_type` = '".wpsg_q($GLOBALS['wpsg_sc']->get_option('wpsg_mod_produktartikel_pathkey'))."' ) ";
-            if ($bJoinPost) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) "; 
-			if ($bJoinTermRelationship) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";
-            if ($bJoinTermTaxonomy) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_taxonomy')."` AS TERMTAX ON (TERMTAX.`term_taxonomy_id` = PCAT.`term_taxonomy_id` ".$strQueryOn_TermTaxonomy.") ";
-			if ($bJoinTerms) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'terms')."` AS TERMS ON (TERMS.`term_id` = TERMTAX.`term_id` ".$strQueryOn_Terms.") ";
-				
-            if ($bJoinVariants) {
-
-                $strQueryJOIN .= " 
-                    LEFT JOIN `".WPSG_TBL_VARIANTS."` AS V ON (V.`product_id` = P.`id` OR V.`product_id` = 0)
-                    LEFT JOIN `".WPSG_TBL_VARIANTS_VARI."` AS VV ON (VV.`variant_id` = V.`id`)
-                    LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PV ON (PV.`variation_id` = V.`id` AND PV.`product_id` = P.`id`)
-                "; 
-                
-            }
-            
-			// Richtung
-			if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strQueryORDER .= " DESC ";
-			else $strQueryORDER .= " ASC ";
-
-			$strQueryWHERE .= " AND P.`deleted` != '1' ";
-
-			return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER);
-
-		} // public function getQueryParts($arFilter = array())
-
-        /**
-         * @param string|int $product_key
-         * @param bool $noCache
-         * @return wpsg_product
-         */
-		public static function getInstance($product_key, $noCache = false) {
-			
-			$class_name = get_called_class();
-			 
-			if (wpsg_isSizedArray($product_key)) {
-				
-				$arReturn = [];
-				
-				foreach ($product_key as $_id) {
-					
-					$arReturn[$_id] = self::getInstance($_id);
-										
-				}
-				
-				return $arReturn;
-				
-			} else if (is_array($product_key)) {
-
-			    return array();
-
-            } else {
-			
-				if (!array_key_exists($class_name.'_'.$product_key, self::$_objCache) || $noCache === true) {
-					
-					$product_id = $GLOBALS['wpsg_sc']->getProduktId($product_key);
-					
-					$oObject = new $class_name(); 
-					$oObject->load($product_id);
-					$oObject->setProductKey($product_key);
-	
-					self::$_objCache[$class_name.'_'.$product_key] = $oObject;
-			
-				}
-					
-				return self::$_objCache[$class_name.'_'.$product_key];
-				
-			}
-			
-		} // public static function getInstance($id, $noCache = false)
-
-        public static function clearInstance($product_key) {
-
-            $class_name = get_called_class();
-
-		    unset(self::$_objCache[$class_name.'_'.$product_key]);
-
-        }
-		
-		public static function getProductCodeConfig(): array {
-		 
-			return [
-				'ean' => [
-					'label' => 'EAN (European Article Number)',
-					'itemprop' => 'gtin13'
-				],
-				'gtin' => [
-					'label' => 'GTIN (Global Trade Item Number)'
-				],
-				'mpn' => [
-					'label' => 'MPN (Manufacturer Part Number)'
-				],
-				'pzn' => [
-					'label' => 'PZN (Pharmazentralnummer)'
-				],
-				'sku' => [
-					'label' => 'SKU (Stock Keeping Unit)',
-					'itemprop' => 'ean'
-				],
-				'upc' => [
-					'label' => 'UPC (Universal Product Code)'
-				],
-				'sin' => [
-					'label' => 'SIN (Service Item Number)'
-				],
-				'asin' => [
-					'label' => 'ASIN (Amazon Standard Identification Number)'
-				],
-				'gpc' => [
-					'label' => 'GPC (Global Product Classification)'
-				],
-				'isbn' => [
-					'label' => 'ISBN (International Standard Book Number)'
-				],
-				'issn' => [
-					'label' => 'ISSN (International Standard Serial Number)'
-				],
-				'isin' => [
-					'label' => 'ISIN (International Securities Identification Number)'
-				],
-				'isrc' => [
-					'label' => 'ISRC (International Standard Recording Code)'
-				],
-				'ismn' => [
-					'label' => 'ISMN (International Standard Music Number)'
-				],
-				'can' => [
-					'label' => 'CAN (Chinese Article Number)'
-				],
-				'jan' => [
-					'label' => 'JAN (Japanese Article Number)'
-				],
-				'jis' => [
-					'label' => 'JIS (Japanese Industrial Standards)'
-				],
-				'apn' => [
-					'label' => 'APN (Australian Product Number)'
-				],
-				'cpc' => [
-					'label' => 'CPC (Canadian Product Code)'
-				],
-				'man' => [
-					'label' => 'MAN (Mexican Article Number)'
-				],
-				'ban' => [
-					'label' => 'BAN (Brazilian Article Number)'
-				],
-			];
-			
-		}
-
-	}
+?>
Index: /mods/mod_abo/demo_notification.php
===================================================================
--- /mods/mod_abo/demo_notification.php	(revision 8528)
+++ /mods/mod_abo/demo_notification.php	(revision 5261)
@@ -23,5 +23,5 @@
 	  
 	  // PFad zum Wordpress Root Verzeichnis 
-	  //$path_wp_root = dirname(__FILE__).'/../';
+	  $path_wp_root = dirname(__FILE__).'/../';
 	  	  
 	  $product_id = $_REQUEST['product_id'];
@@ -31,8 +31,8 @@
 	  
 	  /* Wordpress initiieren */
-	  require_once(ABSPATH.'wp-load.php');
+	  require_once($path_wp_root.'wp-load.php'); 
 	  
 	  /* Shop Plugin initiieren */
-	  require_once(ABSPATH.WPSG_CONTENTDIR_WP.'/plugins/'.WPSG_FOLDERNAME.'/wpshopgermany.php');
+	  require_once($path_wp_root.'wp-content/plugins/wpshopgermany/wpshopgermany.php');
 	  
 	  if ($_REQUEST['typ'] == 'abo_firstbuy')
Index: ds/mod_abo/wpsg_abo.php
===================================================================
--- /mods/mod_abo/wpsg_abo.php	(revision 8528)
+++ 	(revision )
@@ -1,407 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (daschmi@daschmi.de)
-     * Date: 16.11.2020
-     * Time: 08:32
-     */
-
-    class wpsg_abo extends wpsg_model {
-
-        static $_tableName = 'WPSG_TBL_ABO';
-        public static $arState = [];
-
-        const STATE_RUNNING = 1;
-        const STATE_INEXTENSION = 2;
-        const STATE_EXTEND = 3;
-
-        /**
-         * LÃ€dt die Daten der Bestellung
-         */
-        public function load($abo_id) {
-
-            parent::load($abo_id);
-
-            $this->data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ABO."` WHERE `id` = '".intval($abo_id)."' ");
-            
-        }
-
-        public function getExpirationTime() {
-            
-            return strtotime($this->__get('expiration'));
-            
-        }
-
-        /**
-         * Gibt den Wert des Status zurÃŒck
-         * @return int
-         */
-        public function getState() {
-
-            $expiration_time = $this->getExpirationTime();
-            $time = wpsg_time();
-
-            if ($expiration_time < $time) {
-
-                return self::STATE_EXTEND;
-
-            } else {
-
-                $wpsg_mod_abo_autoexpire_informationtime = intval(
-                    wpsg_ShopController::getShop()->callMod('wpsg_mod_abo', 'getSetting', ['wpsg_mod_abo_autoexpire_informationtime', $this->getProductId()])
-                );
-            
-                if ($wpsg_mod_abo_autoexpire_informationtime > 0) {
-
-                    $t_inform = strtotime('-'.$wpsg_mod_abo_autoexpire_informationtime.' day', $expiration_time);
-
-                    if ($time > $t_inform) {
-
-                        return self::STATE_INEXTENSION;
-
-                    } else {
-
-                        return self::STATE_RUNNING;
-
-                    }
-
-                } else return self::STATE_RUNNING;
-
-            }
-                        
-        }
-        
-        /**
-         * Gibt den aktuellen Status anhand der Laufzeit zurÃŒck
-         */
-        public function getStateLabel() {
-
-            return self::$arState[$this->getState()];
-            
-        }
-        
-        /**
-         * Gibt die Hauptbestellung zurÃŒck, mit der das Abo gestartet wurde
-         * @return wpsg_order
-         */
-        public function getOrder() {
-            
-            return wpsg_order::getInstance(intval($this->data['order_id']));
-            
-        }
-        
-        public function getProductId() {
-            
-            $oOrderProduct = $this->getOrderProduct();
-            
-            if ($oOrderProduct === false) return false;
-            else return $oOrderProduct->getProductId();
-            
-        }
-        
-        public function getOrderProduct() {
-            
-            $order_product_id = intval($this->__get('order_product_id'));
-            
-            if ($order_product_id <= 0) {
-
-                $product_key = intval($this->__get('product_key'));
-                $order_id = intval($this->__get('order_id'));
-
-                if ($product_key > 0 && $order_id > 0) {
-
-                    $order_product_id = intval($this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `productkey` = '".wpsg_q($product_key)."' AND `o_id` = '".wpsg_q($order_id)."' "));
-
-                    if ($order_product_id <= 0) return false;
-
-                }
-
-            }
-
-            try {
-
-                return wpsg_order_product::getInstance($order_product_id);
-
-            } catch (\Exception $e) {
-
-                return false;
-
-            }
-
-        }
-
-        public function getNr() {
-
-            return $this->getOrder()->getNr();
-
-        }
-
-        public static function getFromOrderAndOrderProduct($order_id, $order_product_id) {
-
-            $abo_id = intval(
-                wpsg_ShopController::getShop()->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `order_product_id` = '".wpsg_q($order_product_id)."' ")
-            );
-
-            if ($abo_id <= 0) {
-
-                // Fallback fÃŒr alte Abo's / VerlÃ€ngerungen
-
-                $oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-
-                if (preg_match('/^abo_\d+_\d+$/', $oOrderProduct->getProductKey())) {
-
-                	$abo_id = intval(explode('_', $oOrderProduct->getProductKey())[1]);
-
-                } else {
-
-	                $abo_id = intval(
-	                    wpsg_ShopController::getShop()->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `product_key` = '".wpsg_q($oOrderProduct->getProductKey())."' ")
-	                );
-
-                }
-
-                if ($abo_id <= 0) {
-
-                    throw new \wpsg\Exception(wpsg_translate(
-                    __('Kein Abo zu dieser Bestellung (ID:#1#) und BestellProdukt (ID:#2#) gefunden.', 'wpsg'), $order_id, $order_product_id
-                    ));
-
-                }
-
-            }
-
-            return wpsg_abo::getInstance($abo_id);
-                        
-        }
-        
-        public static function find($arFilter = array(), $load = true) {
-
-            list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-            $strLimit = "";
-
-            if (wpsg_isSizedArray($arFilter['limit']) && !wpsg_isSizedInt($arFilter['state'])) $strLimit = "LIMIT ".wpsg_q($arFilter['limit'][0]).", ".wpsg_q($arFilter['limit'][1]);
-
-            $strQuery = "
-				SELECT
-					A.`id`
-					".$strQuerySELECT."
-				FROM
-					`".WPSG_TBL_ABO."` AS A
-					".$strQueryJOIN."
-				WHERE
-					1
-					".$strQueryWHERE."
-				GROUP BY 
-					A.`id`
-				HAVING
-					1
-					".$strQueryHAVING."
-				ORDER BY
-					".$strQueryORDER."
-				".$strLimit."
-			";
-			 
-            $arAboID = wpsg_ShopController::getShop()->db->fetchAssocField($strQuery, "id", "id");
-
-            if (wpsg_isSizedInt($arFilter['state'])) {
- 
-                foreach ($arAboID as $k => $abo_id) {
-                    
-                    $oAbo = wpsg_abo::getInstance($abo_id);
-                    
-                    if ($oAbo->getState() !== intval($arFilter['state'])) {
-                        
-                        unset($arAboID[$k]);
-                        
-                        if (!$load) {
-                            
-                            wpsg_abo::clearCache($abo_id);
-                            unset($oAbo);
-                            
-                        }
-                        
-                    }
-                    
-                }
-				
-				if (wpsg_isSizedArray($arFilter['limit'])) {
-					
-					$arAboID = array_slice($arAboID, intval($arFilter['limit'][0]), intval($arFilter['limit'][1]));
-					
-				}
-					
-                
-            }
-            
-            if ($load !== true) return $arAboID;
-
-            $arReturn = array();
-
-            foreach ($arAboID as $abo_id) {
-
-                $oAbo = wpsg_abo::getInstance($abo_id);
-                $arReturn[] = $oAbo;
-
-            }
-
-            return $arReturn;
-
-        }
-
-        public static function count($arFilter) {
-
-            list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-            if (wpsg_isSizedInt($arFilter['state'])) {
-            
-                $arFilterAll = $arFilter; unset($arFilterAll['state']);
-                
-                $arAbo = self::find($arFilterAll, false);
-
-                foreach ($arAbo as $k => $abo_id) {
-                    
-                    $oAbo = wpsg_abo::getInstance($abo_id);
- 
-                    if ($oAbo->getState() !== intval($arFilter['state'])) unset($arAbo[$k]);
-                    
-                    wpsg_abo::clearCache($abo_id); unset($oAbo);
-                    
-                }
-
-                return sizeof($arAbo);
-                
-                
-            } else {
-            
-                $strQuery = "
-                    SELECT
-                        COUNT(*)
-                    FROM
-                        (
-                            SELECT
-                                DISTINCT A.`id`
-                            FROM
-                                `".WPSG_TBL_ABO."` AS A
-                                ".$strQueryJOIN."
-                            WHERE
-                                1
-                                ".$strQueryWHERE." 
-                            HAVING
-                                1
-                                ".$strQueryHAVING."											
-                        ) AS innerSelect
-                ";
-                
-                return wpsg_ShopController::getShop()->db->fetchOne($strQuery);
-                
-            }
-
-        } // public static function count($arFilter)
-        
-        public static function getQueryParts($arFilter = array()) {
-
-            $strQuerySELECT = "";
-            $strQueryWHERE = "";
-            $strQueryJOIN = ""; $strQueryJOINSuffix = "";
-            $strQueryHAVING = "";
-            
-            $bJoinOrder = false;
-			$bJoinCustomer = false;
-			$bJoinCustomerAddress = false;
-			$bJoinOrderProduct = false;
-			$bJoinProduct = false;
-            
-            if (wpsg_isSizedString($arFilter['s'])) {
-                
-                $bJoinOrder = true;
-
-                list($strQuerySELECTOrder, $strQueryWHEREOrder, $strQueryJOINOrder, $strQueryHAVINGOrder, $strQueryORDEROrder) = wpsg_order::getQueryParts(['s' => $arFilter['s']]);
- 
-                $strQueryWHERE .= $strQueryWHEREOrder;
-                $strQueryJOINSuffix .= $strQueryJOINOrder;
-                
-            }
-
-            if (wpsg_isSizedInt($arFilter['k_id'])) {
-
-                $bJoinOrder = true;
-
-                list($strQuerySELECTOrder, $strQueryWHEREOrder, $strQueryJOINOrder, $strQueryHAVINGOrder, $strQueryORDEROrder) = wpsg_order::getQueryParts(['k_id' => $arFilter['k_id']]);
-
-                $strQueryWHERE .= $strQueryWHEREOrder;
-                $strQueryJOINSuffix .= $strQueryJOINOrder;
-
-            }
-            
-            if (wpsg_isSizedInt($arFilter['cdate_m'])) $strQueryWHERE .= " AND MONTH(A.`cdate`) = '".wpsg_q($arFilter['cdate_m'])."' ";
-            if (wpsg_isSizedInt($arFilter['cdate_y'])) $strQueryWHERE .= " AND YEAR(A.`cdate`) = '".wpsg_q($arFilter['cdate_y'])."' ";
-
-            if (wpsg_isSizedInt($arFilter['enddate_m'])) $strQueryWHERE .= " AND MONTH(A.`expiration`) = '".wpsg_q($arFilter['enddate_m'])."' ";
-            if (wpsg_isSizedInt($arFilter['enddate_y'])) $strQueryWHERE .= " AND YEAR(A.`expiration`) = '".wpsg_q($arFilter['enddate_y'])."' ";
-                       
-			if (($arFilter['order']??'') === 'cdate') $strQueryORDER = " A.`cdate` ";
-			else if (($arFilter['order']??'') === 'customer') { 
-				
-				$bJoinOrder = true;
-				$bJoinCustomer = true;
-				$bJoinCustomerAddress = true;
-				
-				$strQueryORDER = " CA.`name` ";
-				
-			} else if (($arFilter['order']??'') === 'payment') {
-				
-				$bJoinOrder = true;
-				
-				$strQueryORDER = " O.`type_payment` ";
-				
-			} else if (($arFilter['order']??'') === 'shipping') {
-				
-				$bJoinOrder = true;
-				
-				$strQueryORDER = " O.`type_shipping` ";
-				
-			}			
-			else if (($arFilter['order']??'') === 'products') {
-			
-				$bJoinOrderProduct = true;
-				$bJoinProduct = true;
-				
-				$strQueryORDER = " P.`name` ";
-
-			} else if (($arFilter['order']??'') === 'amount') {
-				
-				$bJoinOrder = true;
-				
-				$strQueryORDER = " O.`price_gesamt_brutto` ";
-
-			} else if (($arFilter['order']??'') === 'expiration') $strQueryORDER = " A.`expiration` ";
-			else if (($arFilter['order']??'') === 'state') $strQueryORDER = " A.`status` ";
-			else $strQueryORDER = " A.`id` ";
-			
-			if (($arFilter['ascdesc']??'') === 'DESC') $strQueryORDER .= " DESC ";
-			else $strQueryORDER .= " ASC ";
-			
-			if ($bJoinOrder) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON (O.`id` = A.`order_id`) ";
-			if ($bJoinCustomer) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_KU."` AS C ON (O.`k_id` = C.`id`) ";
-			if ($bJoinCustomerAddress) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (C.`adress_id` = CA.`id`)  ";
-			if ($bJoinOrderProduct) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (OP.`id` = A.`order_product_id`) ";
-			if ($bJoinProduct) $strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = OP.`p_id`) ";
-						
-            return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN.$strQueryJOINSuffix, $strQueryHAVING, $strQueryORDER);
-
-        }
-        
-        public static function init() {
-         
-            self::$arState = [
-                self::STATE_RUNNING => __('laufend', 'wpsg'),
-                self::STATE_INEXTENSION => __('in VerlÃ€ngerung', 'wpsg'),
-                self::STATE_EXTEND => __('abgelaufen', 'wpsg')
-            ];
-            
-        }
-        
-    }
-
-    wpsg_abo::init();
Index: /mods/mod_cab/changelog
===================================================================
--- /mods/mod_cab/changelog	(revision 5261)
+++ /mods/mod_cab/changelog	(revision 5261)
@@ -0,0 +1,8 @@
+#3.0.6
+ - Erste Version
+ 
+#3.1.0
+ - KompatibilitÃ€t zu 3.1.0
+ 
+#3.2.0
+ - KompatibilitÃ€t mit Shop 3.2.0
Index: /mods/mod_customergroup/wpsg_customergroup.php
===================================================================
--- /mods/mod_customergroup/wpsg_customergroup.php	(revision 8528)
+++ /mods/mod_customergroup/wpsg_customergroup.php	(revision 5261)
@@ -51,33 +51,5 @@
 			
 		} // public static function delete($customer_group_id)
- 
-		public static function count($arFilter = array())
-		{
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					(
-						SELECT
-						  	DISTINCT CG.`id`
-						FROM
-							`".WPSG_TBL_KG."` AS CG
-							".$strQueryJOIN."
-						WHERE
-							1
-							".$strQueryWHERE." 
-						HAVING
-							1
-							".$strQueryHAVING."											
-					) AS innerSelect
-			";
-
-			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
-
-		} // public static function count($arFilter = array())
-
+		
 		/**
 		 * Gibt einen Array von Kundengruppen zurÃŒck, die auf den ÃŒbergebenen Filter passen
@@ -86,74 +58,66 @@
 		public static function find($arFilter = array())
 		{
-
-			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
-
-			$strLimit = "";
-
-			if (wpsg_isSizedArray($arFilter['limit'])) $strLimit = "LIMIT ".wpsg_q($arFilter['limit'][0]).", ".wpsg_q($arFilter['limit'][1]);
-
+				
+			$strQueryWHERE = "";
+			$strQueryORDER = "";
+				
+			if (wpsg_isSizedString($arFilter['name']))
+			{
+				
+				$strQueryWHERE .= " AND KG.`name` LIKE '%".wpsg_q($arFilter['name'])."%' ";
+				
+			}
+			
+			switch (strtolower($arFilter['order']))
+			{
+				
+				case 'name': $strQueryORDER .= " KG.`name` "; break;
+				case 'customercount': $strQueryORDER .= " `customercount` "; break;
+				case 'calculation': $strQueryORDER .= " `calculation` "; break; 
+				case 'id': 
+				default: 
+					$strQueryORDER .= " KG.`id` ";
+								
+			}
+			
+			switch (strtolower($arFilter['ascdesc']))
+			{
+				
+				case 'asc': $strQueryORDER .= " ASC "; break;
+				case 'desc': 
+				default:
+					$strQueryORDER .= " DESC ";
+				
+			}
+				
 			$strQuery = "
 				SELECT
-					CG.`id`
-					".$strQuerySELECT."
+					KG.`id`,
+					(SELECT COUNT(*) FROM `".WPSG_TBL_KU."` AS K WHERE K.`group_id` = KG.`id`) AS `customercount` 
 				FROM
-					`".WPSG_TBL_KG."` AS CG
-						".$strQueryJOIN."
+					`".WPSG_TBL_KG."` AS KG
 				WHERE
 					1
 					".$strQueryWHERE."
-				HAVING
-					1
-					".$strQueryHAVING."
 				ORDER BY
-					".$strQueryORDER."		
-				".$strLimit."
+					".$strQueryORDER." 
 			";
-
-			$arCustomerID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery);
+		
+			$arCustomerGroupID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery);
 			$arReturn = array();
-
-			foreach ($arCustomerID as $customer_id)
+				
+			foreach ($arCustomerGroupID as $customer_group_id)
 			{
-
-				$arReturn[$customer_id] = self::getInstance($customer_id);
-
+		
+				$oCustomerGroup = new wpsg_customergroup();
+				$oCustomerGroup->load($customer_group_id);
+				$arReturn[] = $oCustomerGroup;
+		
 			}
-
+				
 			return $arReturn;
-
-
+				
 		} // public static function find($arFilter = array())
-
-		public static function getQueryParts($arFilter = array())
-		{
-
-			$strQuerySELECT = "";
-			$strQueryWHERE = "";
-			$strQueryJOIN = "";
-			$strQueryHAVING = "";
-			$strQueryORDER = "";
-
-			$strQuerySELECT .= "
-				,(SELECT COUNT(*) FROM `".WPSG_TBL_KU."` AS K WHERE K.`group_id` = CG.`id`) AS `customercount`
-			";
-
-			if (wpsg_isSizedString($arFilter['s'])) $strQueryWHERE .= " AND CG.`name` LIKE '%".wpsg_q($arFilter['s'])."%' ";
-
-			if (wpsg_isSizedString($arFilter['name'])) $strQueryWHERE .= " AND CG.`name` LIKE '%".wpsg_q($arFilter['name'])."%' ";
-
-			if (wpsg_isSizedString($arFilter['order'], 'name')) { $strQueryORDER = " CG.`name` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'customercount')) { $strQueryORDER = " `customercount` "; }
-			else if (wpsg_isSizedString($arFilter['order'], 'calculation')) { $strQueryORDER = " CG.`calculation` "; }
-			else $strQueryORDER = " CG.`id` ";
-
-			// Richtung
-			if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strQueryORDER .= " DESC ";
-			else $strQueryORDER .= " ASC ";
-
-			return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER);
-
-		}
-
+		
 	} // class wpsg_customergroup
 
Index: /mods/mod_deliverynote/wpsg_deliverynote.class.php
===================================================================
--- /mods/mod_deliverynote/wpsg_deliverynote.class.php	(revision 8528)
+++ /mods/mod_deliverynote/wpsg_deliverynote.class.php	(revision 5261)
@@ -6,6 +6,7 @@
 	 *
 	 */
-	class wpsg_deliverynote extends wpsg_model {
-
+	class wpsg_deliverynote extends wpsg_model 
+	{
+		
 		/**
 		 * LÃ€dt die Daten des Lieferscheins
@@ -19,5 +20,5 @@
 			$this->data = $this->db->fetchRow("SELECT DN.* FROM `".WPSG_TBL_DELIVERYNOTE."` AS DN WHERE DN.`id` = '".wpsg_q($deliverynote_id)."' ");
 			
-			if ($this->data['id'] != $deliverynote_id) throw new \wpsg\Exception(__('Konnte Lieferschein nicht laden, ungÃŒltige ID ÃŒbergeben', 'wpsg'));
+			if ($this->data['id'] != $deliverynote_id) $this->shop->throwErrorCode('2000_1');
 			
 			return true;
Index: /mods/mod_downloadplus/wpsg_fpdf.php
===================================================================
--- /mods/mod_downloadplus/wpsg_fpdf.php	(revision 8528)
+++ /mods/mod_downloadplus/wpsg_fpdf.php	(revision 5261)
@@ -1,7 +1,6 @@
 <?php
-	 
-	use \setasign\FpdiProtection\FpdiProtection;
-	
-	class wpsg_dl_fpdf extends FpdiProtection {
+ 
+	class wpsg_dl_fpdf extends FPDI_Protection
+	{
 		
 		var $angle = 0;
@@ -25,7 +24,7 @@
 		{
 			
-			parent::__construct($orientation, $unit, $format);
-			
-			/* Code 128 */			
+			parent::FPDF($orientation, $unit, $format);
+			
+			/* Code 128 */
 			$this->T128[] = array(2, 1, 2, 2, 2, 2);           //0 : [ ]               // composition des caractÃšres
 			$this->T128[] = array(2, 2, 2, 1, 2, 2);           //1 : [!]
@@ -177,30 +176,7 @@
 			
 		}
-		
-		public function wpsg_SetTextColor($strHEXCode)
-		{
-								
-			if ($strHEXCode[0] == '#')
-				$strHEXCode = substr($strHEXCode, 1);
-		
-				if (strlen($strHEXCode) == 6)
-					list($r, $g, $b) = array($strHEXCode[0].$strHEXCode[1],
-							$strHEXCode[2].$strHEXCode[3],
-							$strHEXCode[4].$strHEXCode[5]);
-					elseif (strlen($strHEXCode) == 3)
-					list($r, $g, $b) = array($strHEXCode[0].$strHEXCode[0], $strHEXCode[1].$strHEXCode[1], $strHEXCode[2].$strHEXCode[2]);
-					else
-						return false;
-		
-						$r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
-						 
-						parent::setTextColor($r, $g, $b);
-							
-		} // public function wpsg_SetTextColor($strHEXCode)
-		
+				
 		function Code128($x, $y, $code, $h) 
 		{
-			
-			$code = $this->clearCode($code);
 			
 			$w = 5 * strlen($code);
@@ -225,10 +201,6 @@
 			$crypt = "";
 			
-			$break = 0;
-			
 			while ($code > "") 
 			{
-				
-				$break ++;
 				
 				// BOUCLE PRINCIPALE DE CODAGE
@@ -283,5 +255,5 @@
 						
 					}
-					 
+					
 					$madeB = strpos($Bguid,"N");                                            // Ã©tendu du set B
 					
@@ -306,17 +278,7 @@
 				$Bguid = substr($Bguid,$made);
 				$Cguid = substr($Cguid,$made);
-				 
-				// Um Endlosschleifen zu verhindern
-				if ($break === 1000) 
-				{
-					
-					die("Code: ".$code." konnte nicht in EAN128 kodiert werden.");
-					
-					break;
-					
-				}
 				
 			}                                                                          // FIN BOUCLE PRINCIPALE
-		 
+		
 			$check = ord($crypt[0]);     
 			
@@ -372,7 +334,7 @@
 			$sum=0;
 			for($i=1;$i<=11;$i+=2)
-				$sum+=3*$barcode[$i];
+				$sum+=3*$barcode{$i};
 			for($i=0;$i<=10;$i+=2)
-				$sum+=$barcode[$i];
+				$sum+=$barcode{$i};
 			$r=$sum%10;
 			if($r>0)
@@ -381,14 +343,13 @@
 		}
 		
-		function TestCheckDigit($barcode) {
-			
+		function TestCheckDigit($barcode)
+		{
 			//Test validity of check digit
 			$sum=0;
 			for($i=1;$i<=11;$i+=2)
-				$sum+=3*$barcode[$i];
+				$sum+=3*$barcode{$i};
 			for($i=0;$i<=10;$i+=2)
-				$sum+=$barcode[$i];
-			return ($sum+$barcode[12])%10==0;
-			
+				$sum+=$barcode{$i};
+			return ($sum+$barcode{12})%10==0;
 		}
 		
@@ -429,15 +390,15 @@
 			);
 			$code='101';
-			$p=$parities[$barcode[0]];
+			$p=$parities[$barcode{0}];
 			for($i=1;$i<=6;$i++)
-				$code.=$codes[$p[$i-1]][$barcode[$i]];
+				$code.=$codes[$p[$i-1]][$barcode{$i}];
 				$code.='01010';
     for($i=7;$i<=12;$i++)
-		    $code.=$codes['C'][$barcode[$i]];
+		    $code.=$codes['C'][$barcode{$i}];
 		    $code.='101';
 		    //Draw bars
 		    for($i=0;$i<strlen($code);$i++)
 		    {
-		    if($code[$i]=='1')
+		    if($code{$i}=='1')
 		    	$this->Rect($x+$i*$w, $y, $w, $h, 'F');
 		    }
@@ -449,7 +410,4 @@
 		function Rotate($angle,$x=-1,$y=-1)
 		{
-			
-			if (is_string($angle)) $angle = floatval($angle);
-			
 		    if($x==-1)
 		        $x=$this->x;
@@ -470,15 +428,20 @@
 		}
 		
-		function RotatedText($x, $y, $txt, $angle, $bCenter) {
-		
-				if ($bCenter) {
+		function RotatedText($x, $y, $txt, $angle, $bCenter = "0")
+		{
+		
+				if ($bCenter == "1")
+				{
 					
 					$h = $this->GetStringWidth($txt) / 2;	// Hypothenuse
 					
-					if ($angle == "" || $angle == 0) {
+					if ($angle == "" || $angle == 0) 
+					{
 						
 						$x = $x - $h;
 												
-					} else {
+					}
+					else
+					{
 						
 						$xAK = $h * cos(deg2rad($angle)); // Ankathete
@@ -565,21 +528,4 @@
 	    } 
 		    
-	    function clearCode($code)
-	    {
-	    	
-	    	$arReplace = array(
-	    		'/Ã/' => 'Ae',
-	    		'/Ã€/' => 'ae',
-    			'/Ã/' => 'Oe',
-    			'/Ã¶/' => 'oe',
-    			'/Ã/' => 'Ue',
-    			'/ÃŒ/' => 'ue',
-	    		'/Ã/' => 'ss'	    		
-	    	);
-	    	
-	    	return preg_replace(array_keys($arReplace), array_values($arReplace), $code);
-	    	
-	    }
-	    
 	} // class wpsg_fpdf extends FPDI
 
Index: /mods/mod_keygen/.htprivate
===================================================================
--- /mods/mod_keygen/.htprivate	(revision 5261)
+++ /mods/mod_keygen/.htprivate	(revision 5261)
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC9hSDz+Lm9jQJwtIudmgM3ZjBR7ZS8i3Rm0sau6q1VVGRlBmDZ
+d5zMlElMorrrzzUMZITOsDTIdDGXk4z0vmT3gp89KGnCSkYW6NoGbshPhNKOhBHg
+tTrCXBupaIWgLAyOcnRc1ik7crd9BZaCU5K8OZczFsNek0wuYNO6ipZ6HwIDAQAB
+AoGADdWaAjU12dBhTTjguDB166VaAaEGKn1Dkf3w4vPek0wFyBofF8DTgVuRvjZi
+zrPhe3Ya+7uBHuDcfeQXdgYv+IEhB9U1b1LXtTNFOmgjoZDdrm5VdR8MPzwigwnH
+k+gL4a9y82mMPhoXaGOnbHzMMEgeswYfOvH5IZv0GVX8XYECQQDtXbAbGUZmT9nk
+6K+tFdTxzXDoWeRkMEiIBw4eAo4xBGc2fdZz3BLPppaMO6MDyVgNMFuUSDaf6D36
+Phri850zAkEAzGXjMWujsDbg0N6gh5TZXtU08EXthTHz0I/xG7W1iFBojeisPlwp
+J3rvTNfeOsYfcqniYdNJRxQfOAt+lH63ZQJBAL0Pqn1rHE/RulRBoevTP9F5OT1Y
+nDnQ23S9adktX+RbBXq5sF6II9ORdMgtmCIj9SZMJiVtf1TOvs7bOL8cG1ECQQCs
+ah21KGkRUZleVwzukT6y4gIf07zBqBtUiLcHesXAUKOBYQ06JR+J8Ac/uK/6v/jz
+Dh6qCkI7tNuIuRlzRViJAkBZA+9SH/pt9W55TdmWntDBAuznqmrGmUpf5jph/OcN
++cg4hSq9Sk5DQ3UjPnP7P/1ChQQCboaOAkYs5h5XH5d/
+-----END RSA PRIVATE KEY-----
Index: ds/mod_klarna/KlarnaOrder.php
===================================================================
--- /mods/mod_klarna/KlarnaOrder.php	(revision 8528)
+++ 	(revision )
@@ -1,31 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 05.03.24
-	 * @time: 09:02
-	 */
-	
-	namespace wpsgKlarna\mod_klarna;
-	
-	abstract class KlarnaOrder {
-		
-		public static function buildOrderHash(int $order_id): string {
-		
-			$oOrder = \wpsg_order::getInstance($order_id);
-			
-			$arHash = [$oOrder->getToPay()];
-			
-			foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-				
-				$arHash[] = $oOrderProduct->getAmount().':'.$oOrderProduct->getPriceSum(WPSG_BRUTTO);
-				
-			}
-			
-			return base64_encode(implode('|', $arHash));
-		
-		}
-		
-	}
Index: ds/mod_klarna/KlarnaPayment.php
===================================================================
--- /mods/mod_klarna/KlarnaPayment.php	(revision 8528)
+++ 	(revision )
@@ -1,452 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 04.03.24
-	 * @time: 12:49
-	 */
-	
-	namespace wpsgKlarna\mod_klarna;
- 
-	class KlarnaPayment {
-		
-		public static function getOrder(int $order_id, string $klarna_order_id): array {
-			
-			list($response_data, $response_header_code, $response_header) = self::callAPI('ordermanagement/v1/orders/'.$klarna_order_id, null, $order_id);
-			
-			$response_json = json_decode($response_data, true);
-			
-			return $response_json;
-			
-		}
-		
-		/**
-		 * @throws \Exception
-		 */
-		public static function captureOrder(int $order_id, string $klarna_order_id): array {
-		
-			$oOrder = \wpsg_order::getInstance($order_id);
-			$capture_amount = $oOrder->getToPay(WPSG_BRUTTO);
-			
-			$request_data = self::getOrderData($order_id) + [
-				'captured_amount' => intval(round($capture_amount, 2) * 100)
-			];
-			
-			list($response_data, $response_header_code, $response_header) = self::callAPI('ordermanagement/v1/orders/'.$klarna_order_id.'/captures', $request_data, $order_id);
-			
-			$response_data = json_decode($response_data, true);
-			
-			if (isset($response_data['error_code'])) {
-			 
-				wpsg_debug($request_data);
-				wpsg_debug($response_data);
-				
-				$oOrder = \wpsg_order::getInstance($order_id);
-				$oOrder->addLogEntry('Klarna Fehler', print_r($response_data, true));
-				
-				throw new \Exception($response_data['error_messages'][0]);
-				
-			} else {
-				
-				if ($response_header_code === 201) {
-					
-					if (!isset($response_header['capture-id']) || !isset($response_header['location'])) throw new \Exception(__('Fehler beim Capture', 'wpsg'));
-					
-					return [
-						'capture-id' => $response_header['capture-id'],
-						'location' => $response_header['location']
-					];
-					
-				}
-				
-			}
-			
-			throw new \Exception(__('Capture nicht mÃ¶glich', 'wpsg'));
-			
-		}
-		
-		public static function createOrderWithAuthorizationToken(int $order_id, string $authorization_token) {
-			
-			$request_data = self::getOrderData($order_id);
-		 
-			list($response_data) = self::callAPI('payments/v1/authorizations/'.$authorization_token.'/order', $request_data, $order_id);
-		
-			$response_data = json_decode($response_data, true);
-			
-			return [
-				'authorized_payment_method' => $response_data['authorized_payment_method'],
-				'fraud_status' => $response_data['fraud_status'],
-				'order_id' => $response_data['order_id']
-			];
-			
-		}
-		
-		/**
-		 * @throws \Exception
-		 */
-		public static function updateSession(string $session_id, int $order_id): void {
-		
-			$request_data = self::getOrderData($order_id);
-			
-			list($response_data, $http_code, $header, $request_data) = self::callAPI('payments/v1/sessions/'.$session_id, $request_data, $order_id);
-		
-			$response_json = json_decode($response_data, true);
-			
-			if (isset($response_data['error_code'])) {
-				
-				wpsg_debug('KlarnaFail: ordermanagement/v1/orders/{}/cancel');
-				wpsg_debug($request_data);
-				wpsg_debug($response_data);
-				
-				throw new \Exception($response_data['error_code']);
-				
-			}
-			
-			if ($http_code !== 204) {
-				
-				wpsg_debug($response_data);
-				
-				throw new \Exception(__('Session konnte nicht aktualisiert werden.', 'wpsg'));
-				
-			}
-			
-		}
-		
-		/**
-		 * Erstellt oder Aktualisiert eine Session anhand der BestellID
-		 * @throws \Exception
-		 */
-		public static function getSession(int $order_id): array {
-			
-			$oOrder = \wpsg_order::getInstance($order_id);
-			
-			$client_token = $oOrder->getMeta('wpsg_mod_klarna_client_token', false, '');
-			$session_id = $oOrder->getMeta('wpsg_mod_klarna_session_id', false, '');
-			
-			if ($client_token === '' || $session_id === '') {
-				
-				$r = self::createSession($order_id);
-			 
-				$oOrder->setMeta('wpsg_mod_klarna_client_token', $r['client_token']);
-				$oOrder->setMeta('wpsg_mod_klarna_session_id', $r['session_id']);
-				
-				return $r;
-				
-			} else {
-	 
-				$session_data = self::getSessionDetails($session_id, $order_id);
-				
-				if ($session_data['status'] === 'incomplete') {
-					
-					self::updateSession($session_id, $order_id);
-					
-				}
-				return [
-					'client_token' => $client_token,
-					'session_id' => $session_id
-				];
-			
-			}
-			
-		}
-		
-		private static function getSessionDetails(string $session_id, int $order_id): array {
-			
-			list($response_data, $response_header, $header, $request_data) = self::callAPI('payments/v1/sessions/'.$session_id, null, $order_id);
-			
-			return json_decode($response_data, true);
-			
-		}
-		
-		/**
-		 * Erstellt eine neue Session
-		 * @param int $order_id
-		 * @return array
-		 * @throws \Exception
-		 */
-		private static function createSession(int $order_id): array {
-			
-			$request_data = self::getOrderData($order_id) + [
-				'intent' => 'buy'
-			];
-			
-			list($response_data, $response_header, $header, $request_data) = self::callAPI('payments/v1/sessions', $request_data, $order_id);
- 
-			$response_data = json_decode($response_data, true);
-			
-			if (isset($response_data['error_code'])) {
-			 
-				wpsg_debug('KlarnaFail: payments/v1/sessions');
-				wpsg_debug($request_data);
-				wpsg_debug($response_data);
-				
-				$oOrder = \wpsg_order::getInstance($order_id);
-				$oOrder->addLogEntry('Klarna Fehler', print_r($response_data, true));
-				
-				throw new \Exception($response_data['error_code']);
-				
-			}
-			
-			return [
-				'client_token' => $response_data['client_token'],
-				'session_id' => $response_data['session_id']
-			];
-			
-		}
-		
-		private static function getOrderData(int $order_id): array {
-			
-			$oOrder = \wpsg_order::getInstance($order_id);
-			$wpsg_calculation = \wpsg\wpsg_calculation::getOrderCalculation($order_id);
-			$arCalculation = $wpsg_calculation->getCalculationArray();
-			
-			$order_lines = [];
-			
-			foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-				
-				$row = [
-					'name' => $oOrderProduct->getProductName(),
-					'quantity' => $oOrderProduct->getAmount(),
-					'total_amount' => $oOrderProduct->getPriceSum(WPSG_BRUTTO) * 100,
-					'unit_price' => $oOrderProduct->getPrice(WPSG_BRUTTO) * 100,
-					'total_tax_amount' => intval(round(($oOrderProduct->getPriceSum(WPSG_BRUTTO) - $oOrderProduct->getPriceSum(WPSG_NETTO)), 2) * 100),
-					'tax_rate' => $oOrder->getTaxCountry()->getTax($oOrderProduct->getTaxKey()) * 100,
-					'type' => 'physical'
-				];
-
-				$order_lines[] = $row;
-				
-			}
-
-			// Versandkosten
-			if (sizeof($arCalculation['shipping']) > 0) {
-				
-				foreach ($arCalculation['shipping'] as $shipping_data) {
-				
-					$order_lines[] = [
-						'name' => __('Versandkosten', 'wpsg'),
-						'quantity' => 1,
-						'total_amount' => intval($shipping_data['brutto'] * 100),
-						'unit_price' => intval($shipping_data['brutto'] * 100),
-						'total_tax_amount' => intval(round($shipping_data['tax'], 2) * 100),
-						'tax_rate' => $oOrder->getTaxCountry()->getTax('c') * 100,
-						'type' => 'shipping_fee'
-					];
-					
-				}
-				
-			}
-			
-			// Zahlungskosten
-			if (sizeof($arCalculation['payment']) > 0) {
-				
-				foreach ($arCalculation['payment'] as $payment_data) {
-				
-					$order_lines[] = [
-						'name' => __('Zahlungskosten', 'wpsg'),
-						'quantity' => 1,
-						'total_amount' => intval($payment_data['brutto'] * 100),
-						'unit_price' => intval($payment_data['brutto'] * 100),
-						'total_tax_amount' => intval(round($payment_data['tax'], 2) * 100),
-						'tax_rate' => $oOrder->getTaxCountry()->getTax('c') * 100,
-						'type' => 'surcharge'
-					];
-					
-				}
-				
-			}
-			
-			// Warenkorb Rabatt
-			if (sizeof($arCalculation['discount']) > 0) {
-				
-				foreach ($arCalculation['discount'] as $discount_data) {
-				
-					$order_lines[] = [
-						'name' => __('Warenkorbrabatt', 'wpsg'),
-						'quantity' => 1,
-						'total_amount' => intval($discount_data['brutto'] * 100),
-						'unit_price' => intval($discount_data['brutto'] * 100),
-						'total_tax_amount' => intval(round($discount_data['tax'], 2) * 100),
-						'tax_rate' => $oOrder->getTaxCountry()->getTax('c') * 100,
-						'type' => 'discount'
-					];
-					
-				}
-				
-			}
-			
-			// Gutscheine
-			if (sizeof($arCalculation['voucher']) > 0) {
-				
-				foreach ($arCalculation['voucher'] as $voucher_data) {
-				
-					$order_lines[] = [
-						'name' => __('Gutschein', 'wpsg'),
-						'quantity' => 1,
-						'total_amount' => intval($voucher_data['brutto'] * 100),
-						'unit_price' => intval($voucher_data['brutto'] * 100),
-						'total_tax_amount' => intval(round($voucher_data['tax'], 2) * 100),
-						'tax_rate' => $oOrder->getTaxCountry()->getTax('c') * 100,
-						'type' => 'gift_card'
-					];
-					
-				}
-				
-			}
-			
-			$r = [
-				'acquiring_channel' => 'ECOMMERCE',
-				'order_amount' => $oOrder->getToPay(WPSG_BRUTTO) * 100,
-				'order_lines' => $order_lines,
-				'purchase_country' => $oOrder->getInvoiceCountry()->getShorttext(),
-				'purchase_currency' => \wpsg_ShopController::getShop()->get_option('wpsg_currency'),
-				'merchant_data' => 'BestellID: '.$oOrder->getId().' KundenID: '.$oOrder->getCustomer()->getId(),
-				'merchant_reference1' => $oOrder->getNr(),
-				'merchant_reference2' => $oOrder->getId(),
-				'order_tax_amount' => intval(round($oOrder->getTaxAmount(), 2) * 100),
-				'locale' => 'de-DE',
-				'merchant_urls' => [
-					'terms' => 'https://maennchen1.de', // URL for the terms and conditions page of the merchant. The URL will be displayed inside the Klarna Checkout iFrame.(max 2000 characters)
-					'checkout' => 'https://maennchen1.de', // URL for the checkout page of the merchant. (max 2000 characters)
-					'confirmation' => 'https://maennchen1.de', // URL of the merchant confirmation page. The consumer will be redirected back to the confirmation page if the authorization is successful after the customer clicks on the âPlace Orderâ button inside checkout. The special characters of the confirmation URL should be encoded, e.g. the "space" character should be written as "%20". Then, on top of that, the whole confirmation URL should be encoded. E.g. the "space" character should become "%2520". (max 2000 characters)
-					'push' => 'https://maennchen1.de', // URL that will be used for push notification when an order is completed. Should be different than checkout and confirmation URLs.
-				]
-			];
-	 
-			$r['billing_address'] = [
-				'city' => $oOrder->getInvoiceCity(),
-				'country' => $oOrder->getInvoiceCountry()->getShorttext(),
-				'email' => $oOrder->getCustomer()->getEMail(),
-				'family_name' => $oOrder->getInvoiceName(),
-				'given_name' => $oOrder->getInvoiceFirstName(),
-				//'organization_name' => $oOrder->getInvoiceCompany(),
-				'phone' => $oOrder->getInvoicePhone(),
-				'postal_code' => $oOrder->getInvoiceZip(),
-				'street_address' => $oOrder->getInvoiceStreet()
-			];
-			
-			$r['shipping_address'] = [
-				'city' => $oOrder->getShippingCity(),
-				'country' => $oOrder->getShippingCountry()->getShorttext(),
-				'email' => $oOrder->getCustomer()->getEMail(),
-				'family_name' => $oOrder->getShippingName(),
-				'given_name' => $oOrder->getShippingFirstName(),
-				//'organization_name' => $oOrder->getShippingCompany(),
-				'postal_code' => $oOrder->getShippingZip(),
-				'street_address' => $oOrder->getShippingStreet()
-			];
-			
-			$r['customer'] = [
-				'date_of_birth' => $oOrder->getCustomer()->getBirthdate('Y-m-d')
-			];
-			
-			// wpsg_debug($r);
-			
-			return $r;
-			
-		}
-		
-		private static function callAPI(string $path, ?array $data, ?int $order_id = null): array {
-			
-			if (\wpsg_ShopController::getShop()->get_option('wpsg_mod_klarna_sandbox') === '1') {
-				
-				$log_prefix = '(SANDBOX)';
-				$username = \wpsg_ShopController::getShop()->get_option('wpsg_mod_klarna_sandbox_user');
-				$password = \wpsg_ShopController::getShop()->get_option('wpsg_mod_klarna_sandbox_password');
-				$url = 'https://api.playground.klarna.com/';
-				
-			} else {
-				
-				$log_prefix = '(LIVE)';
-				$username = \wpsg_ShopController::getShop()->get_option('wpsg_mod_klarna_api_user');
-				$password = \wpsg_ShopController::getShop()->get_option('wpsg_mod_klarna_api_password');
-				$url = 'https://api.klarna.com/';
-				
-			}
-			
-			$ch = curl_init($url.$path);
-			
-			if ($data !== null) {
-				
-				curl_setopt($ch, CURLOPT_POST, true);
-				curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
-				
-			}
-			
-			curl_setopt($ch, CURLOPT_HEADER, true);
-			curl_setopt($ch, CURLOPT_HTTPHEADER, [
-				'Content-Type: application/json',
-				'Authorization: Basic '.base64_encode($username.':'.$password)
-			]);
-			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-			
-			$result = curl_exec($ch);
-			
-			if ($result === false) throw new \Exception(__('API Fehler', 'wpsg'));
-			
-			// extract header
-			$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
-			$header = substr($result, 0, $headerSize);
-			$header = self::getHeaders($header);
-			
-			// extract body
-			$result = substr($result, $headerSize);
-			
-			if ($result === false) {
-				
-				wpsg_debug(curl_getinfo($ch));
-				wpsg_debug("?");
-				
-			}
-			
-			$info = curl_getinfo($ch);
-			
-			$httpcode = intval($info['http_code']);
-			
-			if ($order_id !== null && \wpsg_ShopController::getShop()->get_option('wpsg_mod_klarna_debug') === '1') {
-				
-				$json_result = json_decode($result, true);
-				
-				$backtrace = debug_backtrace();
-    			$caller_function = isset($backtrace[1]['function']) ? $backtrace[1]['function'] : 'Unknown';
-    			
-				$oOrder = \wpsg_order::getInstance($order_id);
-				$oOrder->addLogEntry('Klarna API '.$log_prefix.' '.$caller_function, $path.print_r($json_result, true));
-				
-			}
-			
-			curl_close($ch);
-			
-			return [$result, $httpcode, $header, $data];
-			
-		}
-		
-		private static function getHeaders($respHeaders): array {
-			
-			$headers = array();
-			
-			$headerText = substr($respHeaders, 0, strpos($respHeaders, "\r\n\r\n"));
-			
-			foreach (explode("\r\n", $headerText) as $i => $line) {
-				
-				if ($i === 0) {
-					
-					$headers['http_code'] = $line;
-				
-				} else {
-					
-					list ($key, $value) = explode(': ', $line);
-					
-					$headers[$key] = $value;
-				
-				}
-			
-			}
-
-			return $headers;
-
-		}
-		
-	}
Index: /mods/mod_klarna/klarna_php_2.3.0/CHANGELOG
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/CHANGELOG	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/CHANGELOG	(revision 5261)
@@ -0,0 +1,185 @@
+=====================
+Klarna PHP API
+=====================
+
+v2.3.0
+---------------
+Date: 2012-09-19
+
+    Rickard D. <support@klarna.com>
+        Klarna.php (activateReservation) :
+            Change to allow NULL to be sent in as PNO when activating a
+            reservation. Any other value than null will still trigger a
+            verification that a string longer than 0 characters is sent
+            as PNO.
+
+        Klarna.php (activate) : new function
+            New function to activate a reservation using minimal information.
+            Optional information for the activate call should be set using
+            setActivateInformation.
+            To partially activate a reservation, use Klarna::addArtNo() function
+            (replaces splitReservation).
+
+        Klarna.php (update) : new function
+            New function to update a reservation using minimal information.
+            Use setAddress to update address, addArticle to update an article in
+            the goodslist and setEstoreInfo to update order id:s.
+
+        Klarna.php (checkCountryCurrency) : removed function
+            As this function does not scale and does not belong in a library it has
+            been removed.
+
+        Country.php () :
+            Added all available country constants.
+
+        Language.php () :
+            Added all available language constants.
+
+        Klarna.php (getLanguageForCountry) : deprecated
+                   (getCurrencyForCountry) : deprecated
+        Country.php (checkLanguage) : deprecated
+                    (checkCurrency) : deprecated
+                    (getLanguage) : deprecated
+                    (getCurrency) : deprecated
+            Deprecated functions that will not scale and will not be compatible for
+            any potential future markets.
+
+        Klarna.php (init, setCountry) :
+            Removed the automatic setting of currency and language when setting
+            the country. This functionality does not scale and was not consistent
+            depending on how you set the country.
+
+    Majid G. <support@klarna.com>
+        Klarna.php (addTransaction) :
+            Removing the link comment for PRE_PAY flag
+
+        Flags.php (KlarnaFlags) :
+            Adding deprecated comment for Flag 8 (PRE_PAY)
+
+
+v2.2.1
+----------------
+Date: 2012-05-18
+
+David K. <support@klarna.com>
+    Klarna.php (summarizeGoodsList)
+        New method that can be used to get a aggregated price for the entire
+        goodslist
+
+    Klarna.php (reserveAmount)
+        Replace the simple goodslist summary that did not take taxes and
+        discounts into consideration with a call to summarizeGoodsList
+
+v2.2.0
+----------------
+Date: 2012-05-14
+
+Rickard D. <support@klarna.com>
+    Klarna.php (assembleAddress) :
+        Only validate that the proper object type is sent in to Klarna, no longer
+        performs any validation of the content of the fields.
+
+    klarnaaddr.php () :
+        Removed validation of field contets. Now possible to set all fields to
+        empty strings if you wan.
+
+    Klarna.php (addTransaction, reserveAmount, activateReservation) :
+        If $gender is sent in as an empty string, treat it as null.
+
+    klarnacalc.php (calc_apr) :
+        Removed the ability to send in a FIXED or SPECIAL pclass to
+        KlarnaCalc->calc_apr. If this function is called with a FIXED or SPECIAL
+        pclass it will now throw an exception instead of causing a fatal error.
+
+    Klarna.php (getAllPClasses) : added
+    storage.intf.php (getAllPClasses) : added
+        Added possibility to get all stored pclasses, regardless of eid or type.
+
+    Klarna.php (setPCStorage) :
+        Added possibility to set a PCStorage on the Klarna object.
+
+    Klarna.php (getPCStorage) : made public (was protected)
+        Added possibility to get the configured PCStorage object from the Klarna
+        object.
+
+    Country.php (getLanguageForCountry, getCurrencyForCountry) : added
+        Added possibility to get the language or currency for a specific country.
+
+    All Files () :
+        Updated code to follow the PEAR standard.
+
+        Refactored several classes into their own files.
+            All refactored classes were previosly declared inside the Klarna.php
+            file. The new files are now instead included in the Klarna.php file,
+            so no functionality has changed in that regard.
+                KlarnaCountry   => Country.php
+                KlarnaCurrency  => Currency.php
+                KlarnaEncoding  => Encoding.php
+                KlarnaException => Exceptions.php
+                KlarnaFlags     => Flags.php
+                KlarnaLanguage  => Language.php
+
+
+        Made almost all exceptions thrown more specific and meaningful than just
+        KlarnaException, although they still extend KlarnaException so old
+        try-catch blocks will still work.
+
+v2.1.3
+----------------
+Date: 2011-09-26
+
+* Fixed a minor conversion issue.
+
+v2.1.2
+----------------
+Date: 2011-09-12
+
+* Improved the MySQL and SQL storage modules
+
+    Added so you can pass an associative array to pcURI with the database info
+
+    Added support for dashes in the normal regexp handling
+
+    Fixed a rounding bug which requires a DROP TABLE and re-update of all PClasses
+
+* Fixed a minor issue regarding the debug and xmlrpcDebug settings
+
+* Added support for the ISO 3166-1 alpha-3 country codes
+
+
+v2.1.1
+----------------
+Date: 2011-09-06
+
+* Corrected a few issues in the phpDoc comments
+
+* Improved fetchPClasses, it is now possible to specify only country (as code or constant)
+
+* Changed the MySQL PClass storage's clear functionality to use DELETE FROM instead of DROP TABLE,
+  this is to prevent possible permission issues in the database
+
+* Various improvements and bug fixes
+
+v2.1.0
+----------------
+Date: 2011-08-19
+
+* Added support for stronger cryptographic hashes
+
+    The default is now SHA-512 instead of MD5
+
+* Experimental generic database storage using PDO
+
+* Added work arounds for issues with the XML-RPC library
+
+* Bug fix and additional sanity checks in getCheapestPClass
+
+* Debug mode uses FirePHP if available
+
+v2.0.0
+----------------
+Date: 2011-07-01
+
+* Initial release of 2.0 API
+
+* A complete rewrite using object oriented practices
Index: /mods/mod_klarna/klarna_php_2.3.0/Country.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Country.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Country.php	(revision 5261)
@@ -0,0 +1,761 @@
+<?php
+
+/**
+ * KlarnaCountry
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Country Constants class
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaCountry
+{
+    /**
+     * Country constant for Austria (AT).<br>
+     * ISO3166_AT
+     *
+     * @var int
+     */
+    const AT = 15;
+
+    /**
+     * Country constant for Denmark (DK).<br>
+     * ISO3166_DK
+     *
+     * @var int
+     */
+    const DK = 59;
+
+    /**
+     * Country constant for Finland (FI).<br>
+     * ISO3166_FI
+     *
+     * @var int
+     */
+    const FI = 73;
+
+    /**
+     * Country constant for Germany (DE).<br>
+     * ISO3166_DE
+     *
+     * @var int
+     */
+    const DE = 81;
+
+    /**
+     * Country constant for Netherlands (NL).<br>
+     * ISO3166_NL
+     *
+     * @var int
+     */
+    const NL = 154;
+
+    /**
+     * Country constant for Norway (NO).<br>
+     * ISO3166_NO
+     *
+     * @var int
+     */
+    const NO = 164;
+
+    /**
+     * Country constant for Sweden (SE).<br>
+     * ISO3166_SE
+     *
+     * @var int
+     */
+    const SE = 209;
+
+    /**
+     * Converts a country code, e.g. 'de' or 'deu' to the KlarnaCountry constant.
+     *
+     * @param string $val country code iso-alpha-2 or iso-alpha-3
+     *
+     * @return int|null
+     */
+    public static function fromCode($val)
+    {
+        $val = strtoupper($val);
+        if (strlen($val) === 3) {
+            if (self::$_tlcFlip === array()) {
+                self::$_tlcFlip = array_flip(self::$_tlcMap);
+            }
+            if (!array_key_exists($val, self::$_tlcFlip)) {
+                return null;
+            }
+            $val = self::$_tlcFlip[$val];
+        }
+        if (array_key_exists($val, self::$_countries)) {
+            return self::$_countries[$val];
+        }
+        return null;
+    }
+
+    /**
+     * Converts a KlarnaCountry constant to the respective country code.
+     *
+     * @param int  $val    KlarnaCountry constant
+     * @param bool $alpha3 Whether to return a ISO-3166-1 alpha-3 code
+     *
+     * @return string|null
+     */
+    public static function getCode($val, $alpha3 = false)
+    {
+        if (self::$_countryFlip === array()) {
+            self::$_countryFlip = array_flip(self::$_countries);
+        }
+        if (!array_key_exists($val, self::$_countryFlip)) {
+            return null;
+        }
+        $result = self::$_countryFlip[$val];
+        if ($alpha3) {
+            return self::$_tlcMap[$result];
+        }
+        return $result;
+    }
+
+    /**
+     * Checks country against currency and returns true if they match.
+     *
+     * @param int $country  {@link KlarnaCountry}
+     * @param int $language {@link KlarnaLanguage}
+     *
+     * @deprecated Do not use.
+     *
+     * @return bool
+     */
+    public static function checkLanguage($country, $language)
+    {
+        switch($country) {
+        case KlarnaCountry::AT:
+        case KlarnaCountry::DE:
+            return ($language === KlarnaLanguage::DE);
+        case KlarnaCountry::NL:
+            return ($language === KlarnaLanguage::NL);
+        case KlarnaCountry::FI:
+            return ($language === KlarnaLanguage::FI);
+        case KlarnaCountry::DK:
+            return ($language === KlarnaLanguage::DA);
+        case KlarnaCountry::NO:
+            return ($language === KlarnaLanguage::NB);
+        case KlarnaCountry::SE:
+            return ($language === KlarnaLanguage::SV);
+        default:
+            //Country not yet supported by Klarna.
+            return false;
+        }
+    }
+    /**
+     * Checks country against language and returns true if they match.
+     *
+     * @param int $country  {@link KlarnaCountry}
+     * @param int $currency {@link KlarnaCurrency}
+     *
+     * @deprecated Do not use.
+     *
+     * @return bool
+     */
+    public static function checkCurrency($country, $currency)
+    {
+        switch($country) {
+        case KlarnaCountry::AT:
+        case KlarnaCountry::DE:
+        case KlarnaCountry::NL:
+        case KlarnaCountry::FI:
+            return ($currency === KlarnaCurrency::EUR);
+        case KlarnaCountry::DK:
+            return ($currency === KlarnaCurrency::DKK);
+        case KlarnaCountry::NO:
+            return ($currency === KlarnaCurrency::NOK);
+        case KlarnaCountry::SE:
+            return ($currency === KlarnaCurrency::SEK);
+        default:
+            //Country not yet supported by Klarna.
+            return false;
+        }
+    }
+    /**
+     * Get language for supplied country. Defaults to English.
+     *
+     * @param int $country KlarnaCountry constant
+     *
+     * @deprecated Do not use.
+     *
+     * @return int
+     */
+    public static function getLanguage($country)
+    {
+        switch($country) {
+        case KlarnaCountry::AT:
+        case KlarnaCountry::DE:
+            return KlarnaLanguage::DE;
+        case KlarnaCountry::NL:
+            return KlarnaLanguage::NL;
+        case KlarnaCountry::FI:
+            return KlarnaLanguage::FI;
+        case KlarnaCountry::DK:
+            return KlarnaLanguage::DA;
+        case KlarnaCountry::NO:
+            return KlarnaLanguage::NB;
+        case KlarnaCountry::SE:
+            return KlarnaLanguage::SV;
+        default:
+            return KlarnaLanguage::EN;
+        }
+    }
+    /**
+     * Get currency for supplied country
+     *
+     * @param int $country KlarnaCountry constant
+     *
+     * @deprecated Do not use.
+     *
+     * @return int|false
+     */
+    public static function getCurrency($country)
+    {
+        switch($country) {
+        case KlarnaCountry::AT:
+        case KlarnaCountry::DE:
+        case KlarnaCountry::NL:
+        case KlarnaCountry::FI:
+            return KlarnaCurrency::EUR;
+        case KlarnaCountry::DK:
+            return KlarnaCurrency::DKK;
+        case KlarnaCountry::NO:
+            return KlarnaCurrency::NOK;
+        case KlarnaCountry::SE:
+            return KlarnaCurrency::SEK;
+        default:
+            return false;
+        }
+    }
+
+    private static $_tlcFlip = array();
+
+      /**
+     * Cache for the flipped country array
+     *
+     * @var array
+     */
+    private static $_countryFlip = array();
+
+    /**
+     * Array containing all countries and their KRED Code
+     *
+     * @var array
+     */
+    private static $_countries = array(
+        'AF' => 1,   //     AFGHANISTAN
+        'AX' => 2,   //     Ã
+LAND ISLANDS
+        'AL' => 3,   //     ALBANIA
+        'DZ' => 4,   //     ALGERIA
+        'AS' => 5,   //     AMERICAN SAMOA
+        'AD' => 6,   //     ANDORRA
+        'AO' => 7,   //     ANGOLA
+        'AI' => 8,   //     ANGUILLA
+        'AQ' => 9,   //     ANTARCTICA
+        'AG' => 10,  //     ANTIGUA AND BARBUDA
+        'AR' => 11,  //     ARGENTINA
+        'AM' => 12,  //     ARMENIA
+        'AW' => 13,  //     ARUBA
+        'AU' => 14,  //     AUSTRALIA
+        'AT' => 15,  //     AUSTRIA
+        'AZ' => 16,  //     AZERBAIJAN
+        'BS' => 17,  //     BAHAMAS
+        'BH' => 18,  //     BAHRAIN
+        'BD' => 19,  //     BANGLADESH
+        'BB' => 20,  //     BARBADOS
+        'BY' => 21,  //     BELARUS
+        'BE' => 22,  //     BELGIUM
+        'BZ' => 23,  //     BELIZE
+        'BJ' => 24,  //     BENIN
+        'BM' => 25,  //     BERMUDA
+        'BT' => 26,  //     BHUTAN
+        'BO' => 27,  //     BOLIVIA
+        'BA' => 28,  //     BOSNIA AND HERZEGOVINA
+        'BW' => 29,  //     BOTSWANA
+        'BV' => 30,  //     BOUVET ISLAND
+        'BR' => 31,  //     BRAZIL
+        'IO' => 32,  //     BRITISH INDIAN OCEAN TERRITORY
+        'BN' => 33,  //     BRUNEI DARUSSALAM
+        'BG' => 34,  //     BULGARIA
+        'BF' => 35,  //     BURKINA FASO
+        'BI' => 36,  //     BURUNDI
+        'KH' => 37,  //     CAMBODIA
+        'CM' => 38,  //     CAMEROON
+        'CA' => 39,  //     CANADA
+        'CV' => 40,  //     CAPE VERDE
+        'KY' => 41,  //     CAYMAN ISLANDS
+        'CF' => 42,  //     CENTRAL AFRICAN REPUBLIC
+        'TD' => 43,  //     CHAD
+        'CL' => 44,  //     CHILE
+        'CN' => 45,  //     CHINA
+        'CX' => 46,  //     CHRISTMAS ISLAND
+        'CC' => 47,  //     COCOS (KEELING) ISLANDS
+        'CO' => 48,  //     COLOMBIA
+        'KM' => 49,  //     COMOROS
+        'CG' => 50,  //     CONGO
+        'CD' => 51,  //     CONGO, THE DEMOCRATIC REPUBLIC OF THE
+        'CK' => 52,  //     COOK ISLANDS
+        'CR' => 53,  //     COSTA RICA
+        'CI' => 54,  //     COTE D'IVOIRE
+        'HR' => 55,  //     CROATIA
+        'CU' => 56,  //     CUBA
+        'CY' => 57,  //     CYPRUS
+        'CZ' => 58,  //     CZECH REPUBLIC
+        'DK' => 59,  //     DENMARK
+        'DJ' => 60,  //     DJIBOUTI
+        'DM' => 61,  //     DOMINICA
+        'DO' => 62,  //     DOMINICAN REPUBLIC
+        'EC' => 63,  //     ECUADOR
+        'EG' => 64,  //     EGYPT
+        'SV' => 65,  //     EL SALVADOR
+        'GQ' => 66,  //     EQUATORIAL GUINEA
+        'ER' => 67,  //     ERITREA
+        'EE' => 68,  //     ESTONIA
+        'ET' => 69,  //     ETHIOPIA
+        'FK' => 70,  //     FALKLAND ISLANDS (MALVINAS)
+        'FO' => 71,  //     FAROE ISLANDS
+        'FJ' => 72,  //     FIJI
+        'FI' => 73,  //     FINLAND
+        'FR' => 74,  //     FRANCE
+        'GF' => 75,  //     FRENCH GUIANA
+        'PF' => 76,  //     FRENCH POLYNESIA
+        'TF' => 77,  //     FRENCH SOUTHERN TERRITORIES
+        'GA' => 78,  //     GABON
+        'GM' => 79,  //     GAMBIA
+        'GE' => 80,  //     GEORGIA
+        'DE' => 81,  //     GERMANY
+        'GH' => 82,  //     GHANA
+        'GI' => 83,  //     GIBRALTAR
+        'GR' => 84,  //     GREECE
+        'GL' => 85,  //     GREENLAND
+        'GD' => 86,  //     GRENADA
+        'GP' => 87,  //     GUADELOUPE
+        'GU' => 88,  //     GUAM
+        'GT' => 89,  //     GUATEMALA
+        'GG' => 90,  //     GUERNSEY
+        'GN' => 91,  //     GUINEA
+        'GW' => 92,  //     GUINEA-BISSAU
+        'GY' => 93,  //     GUYANA
+        'HT' => 94,  //     HAITI
+        'HM' => 95,  //     HEARD ISLAND AND MCDONALD ISLANDS
+        'VA' => 96,  //     HOLY SEE (VATICAN CITY STATE)
+        'HN' => 97,  //     HONDURAS
+        'HK' => 98,  //     HONG KONG
+        'HU' => 99,  //     HUNGARY
+        'IS' => 100, //     ICELAND
+        'IN' => 101, //     INDIA
+        'ID' => 102, //     INDONESIA
+        'IR' => 103, //     IRAN, ISLAMIC REPUBLIC OF
+        'IQ' => 104, //     IRAQ
+        'IE' => 105, //     IRELAND
+        'IM' => 106, //     ISLE OF MAN
+        'IL' => 107, //     ISRAEL
+        'IT' => 108, //     ITALY
+        'JM' => 109, //     JAMAICA
+        'JP' => 110, //     JAPAN
+        'JE' => 111, //     JERSEY
+        'JO' => 112, //     JORDAN
+        'KZ' => 113, //     KAZAKHSTAN
+        'KE' => 114, //     KENYA
+        'KI' => 115, //     KIRIBATI
+        'KP' => 116, //     KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF
+        'KR' => 117, //     KOREA, REPUBLIC OF
+        'KW' => 118, //     KUWAIT
+        'KG' => 119, //     KYRGYZSTAN
+        'LA' => 120, //     LAO PEOPLE'S DEMOCRATIC REPUBLIC
+        'LV' => 121, //     LATVIA
+        'LB' => 122, //     LEBANON
+        'LS' => 123, //     LESOTHO
+        'LR' => 124, //     LIBERIA
+        'LY' => 125, //     LIBYAN ARAB JAMAHIRIYA
+        'LI' => 126, //     LIECHTENSTEIN
+        'LT' => 127, //     LITHUANIA
+        'LU' => 128, //     LUXEMBOURG
+        'MO' => 129, //     MACAO
+        'MK' => 130, //     MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF
+        'MG' => 131, //     MADAGASCAR
+        'MW' => 132, //     MALAWI
+        'MY' => 133, //     MALAYSIA
+        'MV' => 134, //     MALDIVES
+        'ML' => 135, //     MALI
+        'MT' => 136, //     MALTA
+        'MH' => 137, //     MARSHALL ISLANDS
+        'MQ' => 138, //     MARTINIQUE
+        'MR' => 139, //     MAURITANIA
+        'MU' => 140, //     MAURITIUS
+        'YT' => 141, //     MAYOTTE
+        'MX' => 142, //     MEXICO
+        'FM' => 143, //     MICRONESIA     FEDERATED STATES OF
+        'MD' => 144, //     MOLDOVA, REPUBLIC OF
+        'MC' => 145, //     MONACO
+        'MN' => 146, //     MONGOLIA
+        'MS' => 147, //     MONTSERRAT
+        'MA' => 148, //     MOROCCO
+        'MZ' => 149, //     MOZAMBIQUE
+        'MM' => 150, //     MYANMAR
+        'NA' => 151, //     NAMIBIA
+        'NR' => 152, //     NAURU
+        'NP' => 153, //     NEPAL
+        'NL' => 154, //     NETHERLANDS
+        'AN' => 155, //     NETHERLANDS ANTILLES
+        'NC' => 156, //     NEW CALEDONIA
+        'NZ' => 157, //     NEW ZEALAND
+        'NI' => 158, //     NICARAGUA
+        'NE' => 159, //     NIGER
+        'NG' => 160, //     NIGERIA
+        'NU' => 161, //     NIUE
+        'NF' => 162, //     NORFOLK ISLAND
+        'MP' => 163, //     NORTHERN MARIANA ISLANDS
+        'NO' => 164, //     NORWAY
+        'OM' => 165, //     OMAN
+        'PK' => 166, //     PAKISTAN
+        'PW' => 167, //     PALAU
+        'PS' => 168, //     PALESTINIAN TERRITORY OCCUPIED
+        'PA' => 169, //     PANAMA
+        'PG' => 170, //     PAPUA NEW GUINEA
+        'PY' => 171, //     PARAGUAY
+        'PE' => 172, //     PERU
+        'PH' => 173, //     PHILIPPINES
+        'PN' => 174, //     PITCAIRN
+        'PL' => 175, //     POLAND
+        'PT' => 176, //     PORTUGAL
+        'PR' => 177, //     PUERTO RICO
+        'QA' => 178, //     QATAR
+        'RE' => 179, //     REUNION
+        'RO' => 180, //     ROMANIA
+        'RU' => 181, //     RUSSIAN FEDERATION
+        'RW' => 182, //     RWANDA
+        'SH' => 183, //     SAINT HELENA
+        'KN' => 184, //     SAINT KITTS AND NEVIS
+        'LC' => 185, //     SAINT LUCIA
+        'PM' => 186, //     SAINT PIERRE AND MIQUELON
+        'VC' => 187, //     SAINT VINCENT AND THE GRENADINES
+        'WS' => 188, //     SAMOA
+        'SM' => 189, //     SAN MARINO
+        'ST' => 190, //     SAO TOME AND PRINCIPE
+        'SA' => 191, //     SAUDI ARABIA
+        'SN' => 192, //     SENEGAL
+        'CS' => 193, //     SERBIA AND MONTENEGRO
+        'SC' => 194, //     SEYCHELLES
+        'SL' => 195, //     SIERRA LEONE
+        'SG' => 196, //     SINGAPORE
+        'SK' => 197, //     SLOVAKIA
+        'SI' => 198, //     SLOVENIA
+        'SB' => 199, //     SOLOMON ISLANDS
+        'SO' => 200, //     SOMALIA
+        'ZA' => 201, //     SOUTH AFRICA
+        'GS' => 202, //     SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS
+        'ES' => 203, //     SPAIN
+        'LK' => 204, //     SRI LANKA
+        'SD' => 205, //     SUDAN
+        'SR' => 206, //     SURINAME
+        'SJ' => 207, //     SVALBARD AND JAN MAYEN
+        'SZ' => 208, //     SWAZILAND
+        'SE' => 209, //     SWEDEN
+        'CH' => 210, //     SWITZERLAND
+        'SY' => 211, //     SYRIAN ARAB REPUBLIC
+        'TW' => 212, //     TAIWAN PROVINCE OF CHINA
+        'TJ' => 213, //     TAJIKISTAN
+        'TZ' => 214, //     TANZANIA, UNITED REPUBLIC OF
+        'TH' => 215, //     THAILAND
+        'TL' => 216, //     TIMOR-LESTE
+        'TG' => 217, //     TOGO
+        'TK' => 218, //     TOKELAU
+        'TO' => 219, //     TONGA
+        'TT' => 220, //     TRINIDAD AND TOBAGO
+        'TN' => 221, //     TUNISIA
+        'TR' => 222, //     TURKEY
+        'TM' => 223, //     TURKMENISTAN
+        'TC' => 224, //     TURKS AND CAICOS ISLANDS
+        'TV' => 225, //     TUVALU
+        'UG' => 226, //     UGANDA
+        'UA' => 227, //     UKRAINE
+        'AE' => 228, //     UNITED ARAB EMIRATES
+        'GB' => 229, //     UNITED KINGDOM
+        'US' => 230, //     UNITED STATES
+        'UM' => 231, //     UNITED STATES MINOR OUTLYING ISLANDS
+        'UY' => 232, //     URUGUAY
+        'UZ' => 233, //     UZBEKISTAN
+        'VU' => 234, //     VANUATU
+        'VE' => 235, //     VENEZUELA
+        'VN' => 236, //     VIET NAM
+        'VG' => 237, //     VIRGIN ISLANDS, BRITISH
+        'VI' => 238, //     VIRGIN ISLANDS, US
+        'WF' => 239, //     WALLIS AND FUTUNA
+        'EH' => 240, //     WESTERN SAHARA
+        'YE' => 241, //     YEMEN
+        'ZM' => 242, //     ZAMBIA
+        'ZW' => 243  //     ZIMBABWE
+    );
+
+    private static $_tlcMap = array(
+        'AF' => 'AFG',
+        'AX' => 'ALA',
+        'AL' => 'ALB',
+        'DZ' => 'DZA',
+        'AS' => 'ASM',
+        'AD' => 'AND',
+        'AO' => 'AGO',
+        'AI' => 'AIA',
+        'AQ' => 'ATA',
+        'AG' => 'ATG',
+        'AR' => 'ARG',
+        'AM' => 'ARM',
+        'AW' => 'ABW',
+        'AU' => 'AUS',
+        'AT' => 'AUT',
+        'AZ' => 'AZE',
+        'BS' => 'BHS',
+        'BH' => 'BHR',
+        'BD' => 'BGD',
+        'BB' => 'BRB',
+        'BY' => 'BLR',
+        'BE' => 'BEL',
+        'BZ' => 'BLZ',
+        'BJ' => 'BEN',
+        'BM' => 'BMU',
+        'BT' => 'BTN',
+        'BO' => 'BOL',
+        'BQ' => 'BES',
+        'BA' => 'BIH',
+        'BW' => 'BWA',
+        'BV' => 'BVT',
+        'BR' => 'BRA',
+        'IO' => 'IOT',
+        'BN' => 'BRN',
+        'BG' => 'BGR',
+        'BF' => 'BFA',
+        'BI' => 'BDI',
+        'KH' => 'KHM',
+        'CM' => 'CMR',
+        'CA' => 'CAN',
+        'CV' => 'CPV',
+        'KY' => 'CYM',
+        'CF' => 'CAF',
+        'TD' => 'TCD',
+        'CL' => 'CHL',
+        'CN' => 'CHN',
+        'CX' => 'CXR',
+        'CC' => 'CCK',
+        'CO' => 'COL',
+        'KM' => 'COM',
+        'CG' => 'COG',
+        'CD' => 'COD',
+        'CK' => 'COK',
+        'CR' => 'CRI',
+        'CI' => 'CIV',
+        'HR' => 'HRV',
+        'CU' => 'CUB',
+        'CW' => 'CUW',
+        'CY' => 'CYP',
+        'CZ' => 'CZE',
+        'DK' => 'DNK',
+        'DJ' => 'DJI',
+        'DM' => 'DMA',
+        'DO' => 'DOM',
+        'EC' => 'ECU',
+        'EG' => 'EGY',
+        'SV' => 'SLV',
+        'GQ' => 'GNQ',
+        'ER' => 'ERI',
+        'EE' => 'EST',
+        'ET' => 'ETH',
+        'FK' => 'FLK',
+        'FO' => 'FRO',
+        'FJ' => 'FJI',
+        'FI' => 'FIN',
+        'FR' => 'FRA',
+        'GF' => 'GUF',
+        'PF' => 'PYF',
+        'TF' => 'ATF',
+        'GA' => 'GAB',
+        'GM' => 'GMB',
+        'GE' => 'GEO',
+        'DE' => 'DEU',
+        'GH' => 'GHA',
+        'GI' => 'GIB',
+        'GR' => 'GRC',
+        'GL' => 'GRL',
+        'GD' => 'GRD',
+        'GP' => 'GLP',
+        'GU' => 'GUM',
+        'GT' => 'GTM',
+        'GG' => 'GGY',
+        'GN' => 'GIN',
+        'GW' => 'GNB',
+        'GY' => 'GUY',
+        'HT' => 'HTI',
+        'HM' => 'HMD',
+        'VA' => 'VAT',
+        'HN' => 'HND',
+        'HK' => 'HKG',
+        'HU' => 'HUN',
+        'IS' => 'ISL',
+        'IN' => 'IND',
+        'ID' => 'IDN',
+        'IR' => 'IRN',
+        'IQ' => 'IRQ',
+        'IE' => 'IRL',
+        'IM' => 'IMN',
+        'IL' => 'ISR',
+        'IT' => 'ITA',
+        'JM' => 'JAM',
+        'JP' => 'JPN',
+        'JE' => 'JEY',
+        'JO' => 'JOR',
+        'KZ' => 'KAZ',
+        'KE' => 'KEN',
+        'KI' => 'KIR',
+        'KP' => 'PRK',
+        'KR' => 'KOR',
+        'KW' => 'KWT',
+        'KG' => 'KGZ',
+        'LA' => 'LAO',
+        'LV' => 'LVA',
+        'LB' => 'LBN',
+        'LS' => 'LSO',
+        'LR' => 'LBR',
+        'LY' => 'LBY',
+        'LI' => 'LIE',
+        'LT' => 'LTU',
+        'LU' => 'LUX',
+        'MO' => 'MAC',
+        'MK' => 'MKD',
+        'MG' => 'MDG',
+        'MW' => 'MWI',
+        'MY' => 'MYS',
+        'MV' => 'MDV',
+        'ML' => 'MLI',
+        'MT' => 'MLT',
+        'MH' => 'MHL',
+        'MQ' => 'MTQ',
+        'MR' => 'MRT',
+        'MU' => 'MUS',
+        'YT' => 'MYT',
+        'MX' => 'MEX',
+        'FM' => 'FSM',
+        'MD' => 'MDA',
+        'MC' => 'MCO',
+        'MN' => 'MNG',
+        'ME' => 'MNE',
+        'MS' => 'MSR',
+        'MA' => 'MAR',
+        'MZ' => 'MOZ',
+        'MM' => 'MMR',
+        'NA' => 'NAM',
+        'NR' => 'NRU',
+        'NP' => 'NPL',
+        'NL' => 'NLD',
+        'NC' => 'NCL',
+        'NZ' => 'NZL',
+        'NI' => 'NIC',
+        'NE' => 'NER',
+        'NG' => 'NGA',
+        'NU' => 'NIU',
+        'NF' => 'NFK',
+        'MP' => 'MNP',
+        'NO' => 'NOR',
+        'OM' => 'OMN',
+        'PK' => 'PAK',
+        'PW' => 'PLW',
+        'PS' => 'PSE',
+        'PA' => 'PAN',
+        'PG' => 'PNG',
+        'PY' => 'PRY',
+        'PE' => 'PER',
+        'PH' => 'PHL',
+        'PN' => 'PCN',
+        'PL' => 'POL',
+        'PT' => 'PRT',
+        'PR' => 'PRI',
+        'QA' => 'QAT',
+        'RE' => 'REU',
+        'RO' => 'ROU',
+        'RU' => 'RUS',
+        'RW' => 'RWA',
+        'BL' => 'BLM',
+        'SH' => 'SHN',
+        'KN' => 'KNA',
+        'LC' => 'LCA',
+        'MF' => 'MAF',
+        'PM' => 'SPM',
+        'VC' => 'VCT',
+        'WS' => 'WSM',
+        'SM' => 'SMR',
+        'ST' => 'STP',
+        'SA' => 'SAU',
+        'SN' => 'SEN',
+        'RS' => 'SRB',
+        'SC' => 'SYC',
+        'SL' => 'SLE',
+        'SG' => 'SGP',
+        'SX' => 'SXM',
+        'SK' => 'SVK',
+        'SI' => 'SVN',
+        'SB' => 'SLB',
+        'SO' => 'SOM',
+        'ZA' => 'ZAF',
+        'GS' => 'SGS',
+        'SS' => 'SSD',
+        'ES' => 'ESP',
+        'LK' => 'LKA',
+        'SD' => 'SDN',
+        'SR' => 'SUR',
+        'SJ' => 'SJM',
+        'SZ' => 'SWZ',
+        'SE' => 'SWE',
+        'CH' => 'CHE',
+        'SY' => 'SYR',
+        'TW' => 'TWN',
+        'TJ' => 'TJK',
+        'TZ' => 'TZA',
+        'TH' => 'THA',
+        'TL' => 'TLS',
+        'TG' => 'TGO',
+        'TK' => 'TKL',
+        'TO' => 'TON',
+        'TT' => 'TTO',
+        'TN' => 'TUN',
+        'TR' => 'TUR',
+        'TM' => 'TKM',
+        'TC' => 'TCA',
+        'TV' => 'TUV',
+        'UG' => 'UGA',
+        'UA' => 'UKR',
+        'AE' => 'ARE',
+        'GB' => 'GBR',
+        'US' => 'USA',
+        'UM' => 'UMI',
+        'UY' => 'URY',
+        'UZ' => 'UZB',
+        'VU' => 'VUT',
+        'VE' => 'VEN',
+        'VN' => 'VNM',
+        'VG' => 'VGB',
+        'VI' => 'VIR',
+        'WF' => 'WLF',
+        'EH' => 'ESH',
+        'YE' => 'YEM',
+        'ZM' => 'ZMB',
+        'ZW' => 'ZWE'
+    );
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/Currency.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Currency.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Currency.php	(revision 5261)
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * KlarnaCurrency
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Currency Constants class
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaCurrency
+{
+
+    /**
+     * Currency constant for Swedish Crowns (SEK).
+     *
+     * @var int
+     */
+    const SEK = 0;
+
+    /**
+     * Currency constant for Norwegian Crowns (NOK).
+     *
+     * @var int
+     */
+    const NOK = 1;
+
+    /**
+     * Currency constant for Euro.
+     *
+     * @var int
+     */
+    const EUR = 2;
+
+    /**
+     * Currency constant for Danish Crowns (DKK).
+     *
+     * @var int
+     */
+    const DKK = 3;
+
+    /**
+     * Converts a currency code, e.g. 'eur' to the KlarnaCurrency constant.
+     *
+     * @param string $val currency code
+     *
+     * @return int|null
+     */
+    public static function fromCode($val)
+    {
+        switch(strtolower($val)) {
+        case 'dkk':
+            return self::DKK;
+        case 'eur':
+        case 'euro':
+            return self::EUR;
+        case 'nok':
+            return self::NOK;
+        case 'sek':
+            return self::SEK;
+        default:
+            return null;
+        }
+    }
+
+    /**
+     * Converts a KlarnaCurrency constant to the respective language code.
+     *
+     * @param int $val KlarnaCurrency constant
+     *
+     * @return string|null
+     */
+    public static function getCode($val)
+    {
+        switch($val) {
+        case self::DKK:
+            return 'dkk';
+        case self::EUR:
+            return 'eur';
+        case self::NOK:
+            return 'nok';
+        case self::SEK:
+            return 'sek';
+        default:
+            return null;
+        }
+    }
+
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/Encoding.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Encoding.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Encoding.php	(revision 5261)
@@ -0,0 +1,250 @@
+<?php
+/**
+ * KlarnaEncoding
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+require_once 'Exceptions.php';
+
+/**
+ * Encoding class
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaEncoding
+{
+    /**
+     * PNO/SSN encoding for Sweden.
+     *
+     * @var int
+     */
+    const PNO_SE = 2;
+
+    /**
+     * PNO/SSN encoding for Norway.
+     *
+     * @var int
+     */
+    const PNO_NO = 3;
+
+    /**
+     * PNO/SSN encoding for Finland.
+     *
+     * @var int
+     */
+    const PNO_FI = 4;
+
+    /**
+     * PNO/SSN encoding for Denmark.
+     *
+     * @var int
+     */
+    const PNO_DK = 5;
+
+    /**
+     * PNO/SSN encoding for Germany.
+     *
+     * @var int
+     */
+    const PNO_DE = 6;
+
+    /**
+     * PNO/SSN encoding for Netherlands.
+     *
+     * @var int
+     */
+    const PNO_NL = 7;
+
+    /**
+     * PNO/SSN encoding for Austria.
+     *
+     * @var int
+     */
+    const PNO_AT = 8;
+
+    /**
+     * Encoding constant for customer numbers.
+     *
+     * @see Klarna::setCustomerNo()
+     * @var int
+     */
+    const CUSTNO = 1000;
+
+    /**
+     * Encoding constant for email address.
+     *
+     * @var int
+     */
+    const EMAIL = 1001;
+
+    /**
+     * Encoding constant for cell numbers.
+     *
+     * @var int
+     */
+    const CELLNO = 1002;
+
+    /**
+     * Encoding constant for bank bic + account number.
+     *
+     * @var int
+     */
+    const BANK_BIC_ACC_NO = 1003;
+
+    /**
+     * Returns the constant for the wanted country.
+     *
+     * @param string $country country
+     *
+     * @return int
+     */
+    public static function get($country)
+    {
+        switch (strtoupper($country)) {
+        case "DE":
+            return KlarnaEncoding::PNO_DE;
+        case "DK":
+            return KlarnaEncoding::PNO_DK;
+        case "FI":
+            return KlarnaEncoding::PNO_FI;
+        case "NL":
+            return KlarnaEncoding::PNO_NL;
+        case "NO":
+            return KlarnaEncoding::PNO_NO;
+        case "SE":
+            return KlarnaEncoding::PNO_SE;
+        case "AT":
+            return KlarnaEncoding::PNO_AT;
+        default:
+            return -1;
+        }
+    }
+
+    /**
+     * Returns a regexp string for the specified encoding constant.
+     *
+     * @param int $enc PNO/SSN encoding constant.
+     *
+     * @return string The regular expression.
+     * @throws Klarna_UnknownEncodingException
+     */
+    public static function getRegexp($enc)
+    {
+        switch($enc) {
+        case self::PNO_SE:
+            /*
+             * All positions except C contain numbers 0-9.
+             *
+             * PNO:
+             * YYYYMMDDCNNNN, C = -|+  length 13
+             * YYYYMMDDNNNN                   12
+             * YYMMDDCNNNN                    11
+             * YYMMDDNNNN                     10
+             *
+             * ORGNO:
+             * XXXXXXNNNN
+             * XXXXXX-NNNN
+             * 16XXXXXXNNNN
+             * 16XXXXXX-NNNN
+             *
+             */
+            return '/^[0-9]{6,6}(([0-9]{2,2}[-\+]{1,1}[0-9]{4,4})|([-\+]'.
+                '{1,1}[0-9]{4,4})|([0-9]{4,6}))$/';
+        case self::PNO_NO:
+            /*
+             * All positions contain numbers 0-9.
+             *
+             * Pno
+             * DDMMYYIIIKK    ("fodelsenummer" or "D-nummer") length = 11
+             * DDMMYY-IIIKK   ("fodelsenummer" or "D-nummer") length = 12
+             * DDMMYYYYIIIKK  ("fodelsenummer" or "D-nummer") length = 13
+             * DDMMYYYY-IIIKK ("fodelsenummer" or "D-nummer") length = 14
+             *
+             * Orgno
+             * Starts with 8 or 9.
+             *
+             * NNNNNNNNK      (orgno)                         length = 9
+             */
+            return '/^[0-9]{6,6}((-[0-9]{5,5})|([0-9]{2,2}((-[0-9]'.
+                '{5,5})|([0-9]{1,1})|([0-9]{3,3})|([0-9]{5,5))))$/';
+        case self::PNO_FI:
+            /*
+             * Pno
+             * DDMMYYCIIIT
+             * DDMMYYIIIT
+             * C = century, '+' = 1800, '-' = 1900 och 'A' = 2000.
+             * I = 0-9
+             * T = 0-9, A-F, H, J, K-N, P, R-Y
+             *
+             * Orgno
+             * NNNNNNN-T
+             * NNNNNNNT
+             * T = 0-9, A-F, H, J, K-N, P, R-Y
+             */
+            return '/^[0-9]{6,6}(([A\+-]{1,1}[0-9]{3,3}[0-9A-FHJK-NPR-Y]'.
+                '{1,1})|([0-9]{3,3}[0-9A-FHJK-NPR-Y]{1,1})|([0-9]{1,1}-{0,1}'.
+                '[0-9A-FHJK-NPR-Y]{1,1}))$/i';
+        case self::PNO_DK:
+            /*
+             * Pno
+             * DDMMYYNNNG       length 10
+             * G = gender, odd/even for men/women.
+             *
+             * Orgno
+             * XXXXXXXX         length 8
+             */
+            return '/^[0-9]{8,8}([0-9]{2,2})?$/';
+        case self::PNO_NL:
+        case self::PNO_DE:
+            /**
+             * Pno
+             * DDMMYYYYG         length 9
+             * DDMMYYYY                 8
+             *
+             * Orgno
+             * XXXXXXX                  7  company org nr
+             */
+            return '/^[0-9]{7,9}$/';
+        case self::EMAIL:
+            /**
+             * Validates an email.
+             */
+            return '/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]'.
+                '+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z0-9-][a-zA-Z0-9-]+)+$/';
+        case self::CELLNO:
+            /**
+             * Validates a cellno.
+             *
+             */
+            return '/^07[\ \-0-9]{8,13}$/';
+        default:
+            throw new Klarna_UnknownEncodingException($enc);
+        }
+    }
+
+    /**
+     * Checks if the specified PNO is correct according to specified encoding constant.
+     *
+     * @param string $pno PNO/SSN string.
+     * @param int    $enc {@link KlarnaEncoding PNO/SSN encoding} constant.
+     *
+     * @return bool   True if correct.
+     */
+    public static function checkPNO($pno, $enc = null)
+    {
+        return strlen($pno) > 0;
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/Exceptions.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Exceptions.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Exceptions.php	(revision 5261)
@@ -0,0 +1,735 @@
+<?php
+/**
+ * Klarna Exceptions
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+require_once 'Country.php';
+
+/**
+ * KlarnaException class, only used so it says "KlarnaException" instead of
+ * Exception.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaException extends Exception
+{
+    /**
+     * Returns an error message readable by end customers.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getMessage() . " (#".$this->code.")";
+    }
+}
+
+/**
+ * Exception for invalid Configuration object
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidConfigurationException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(
+            "Supplied config is not a KlarnaConfig/ArrayAccess object!",
+            50001
+        );
+    }
+}
+/**
+ * Exception for incomplete Configuration object
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_IncompleteConfigurationException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct('Klarna instance not fully configured!', 50002);
+    }
+}
+
+/**
+ * Exception for invalid KlarnaAddr object
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidKlarnaAddrException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(
+            "Supplied address is not a KlarnaAddr object!",
+            50011
+        );
+    }
+}
+
+/**
+ * Exception for no KlarnaAddr set
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_MissingAddressException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct("No address set!", 50035);
+    }
+}
+
+/**
+ * Exception for missing Configuration field
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_ConfigFieldMissingException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $field config field
+     */
+    public function __construct($field)
+    {
+        parent::__construct("Config field '{$field}' is not valid!", 50003);
+
+    }
+}
+
+/**
+ * Exception for Unknown Encoding
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_UnknownEncodingException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param int $encoding encoding
+     */
+    public function __construct($encoding)
+    {
+        parent::__construct(
+            "Unknown PNO/SSN encoding constant! ({$encoding})", 50091
+        );
+    }
+}
+
+/**
+ * Exception for Unknown Address Type
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_UnknownAddressTypeException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param int $type type
+     */
+    public function __construct($type)
+    {
+        parent::__construct("Unknown address type: {$type}", 50012);
+    }
+}
+
+/**
+ * Exception for Missing Country
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_MissingCountryException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct('You must set country first!', 50046);
+    }
+}
+
+/**
+ * Exception for Unknown Country
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_UnknownCountryException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param mixed $country country
+     */
+    public function __construct($country)
+    {
+        parent::__construct("Unknown country! ({$country})", 50006);
+    }
+}
+
+/**
+ * Exception for Unknown Language
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_UnknownLanguageException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param mixed $language language
+     */
+    public function __construct($language)
+    {
+        parent::__construct("Unknown language! ({$language})", 50007);
+    }
+}
+
+/**
+ * Exception for Unknown Currency
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_UnknownCurrencyException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param mixed $currency currency
+     */
+    public function __construct($currency)
+    {
+        parent::__construct("Unknown currency! ({$currency})", 50008);
+    }
+}
+
+/**
+ * Exception for Missing Arguments
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_ArgumentNotSetException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $argument argument
+     */
+    public function __construct($argument)
+    {
+        parent::__construct("Argument '{$argument}' not set!", 50005);
+    }
+}
+
+/**
+ * Exception for Country and Currency mismatch
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_CountryCurrencyMismatchException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param mixed $country  country
+     * @param mixed $currency currency
+     */
+    public function __construct($country, $currency)
+    {
+        $countryCode = KlarnaCountry::getCode($country);
+        parent::__construct(
+            "Mismatching country/currency for '{$countryCode}'! ".
+            "[country: $country currency: $currency]",
+            50011
+        );
+    }
+}
+
+/**
+ * Exception for Country and Currency mismatch
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_CountryLanguageMismatchException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param mixed $country  country
+     * @param mixed $language language
+     */
+    public function __construct($country, $language)
+    {
+        $countryCode = KlarnaCountry::getCode($country);
+        parent::__construct(
+            "Mismatching country/language for '{$countryCode}'! ".
+            "[country: $country language: $language]",
+            50024
+        );
+    }
+}
+
+/**
+ * Exception for Shipping country being different from set country
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_ShippingCountryException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(
+            'Shipping address country must match the country set!', 50041
+        );
+    }
+}
+
+/**
+ * Exception for Missing Goodslist
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_MissingGoodslistException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct("No articles in goodslist!", 50034);
+    }
+}
+
+/**
+ * Exception for invalid price
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidPriceException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param mixed $price price
+     */
+    public function __construct($price)
+    {
+        parent::__construct(
+            "price/amount must be an integer and greater than 0! ($price)",
+            50039
+        );
+    }
+}
+
+
+/**
+ * Exception for invalid pcstorage class
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_PCStorageInvalidException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $className     classname
+     * @param string $pclassStorage pcstorage class file
+     */
+    public function __construct($className, $pclassStorage)
+    {
+        parent::__construct(
+            "$className located in $pclassStorage is not a PCStorage instance.",
+            50052
+        );
+    }
+}
+
+/**
+ * Exception for invalid type
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidTypeException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $param parameter
+     * @param string $type  type
+     */
+    public function __construct($param, $type)
+    {
+        parent::__construct(
+            "$param is not of the expected type. Expected: $type.",
+            50062
+        );
+    }
+}
+
+/**
+ * Exception for invalid PNO
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidPNOException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct("PNO/SSN is not valid!", 50078);
+    }
+}
+
+
+/**
+ * Exception for invalid Email
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidEmailException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct("Email is not valid!", 50017);
+    }
+}
+
+/**
+ * Exception for invalid Email
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_UnsupportedMarketException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string|array $countries allowed countries
+     */
+    public function __construct($countries)
+    {
+        if (is_array($countries)) {
+            $countries = implode(", ", $countries);
+        }
+        parent::__construct(
+            "This method is only available for customers from: {$countries}",
+            50025
+        );
+    }
+}
+/**
+ * Exception for invalid Locale
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_InvalidLocaleException extends KlarnaException
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(
+            "You must set country, language and currency!",
+            50023
+        );
+    }
+}
+
+/**
+ * Exception for Missing Address Fields
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_AddressFieldMissingException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $argument argument
+     */
+    public function __construct($argument)
+    {
+        parent::__construct("'{$argument}' not set!", 50015);
+    }
+}
+
+/**
+ * Exception for File Not Writable
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_FileNotWritableException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $file filename
+     */
+    public function __construct($file)
+    {
+        parent::__construct("Unable to write to {$file}!");
+    }
+}
+
+/**
+ * Exception for File Not Readable
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_FileNotReadableException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $file filename
+     */
+    public function __construct($file)
+    {
+        parent::__construct("Unable to read from {$file}!");
+    }
+}
+
+/**
+ * Exception for File Not Readable
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_FileNotFoundException extends KlarnaException
+{
+    /**
+     * Constructor
+     *
+     * @param string $file filename
+     */
+    public function __construct($file)
+    {
+        parent::__construct("Unable to find file: {$file}!");
+    }
+}
+
+/**
+ * Exception for Database Errors
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+class Klarna_DatabaseException extends KlarnaException
+{
+}
+
+/**
+ * Exception for PClass Errors
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_PClassException extends KlarnaException
+{
+}
+
+/**
+ * Exception for XML Parse errors
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna_XMLParseException extends KlarnaException
+{
+        /**
+     * Constructor
+     *
+     * @param string $file filename
+     */
+    public function __construct($file)
+    {
+        parent::__construct("Unable to parse XML file: {$file}!");
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/Flags.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Flags.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Flags.php	(revision 5261)
@@ -0,0 +1,319 @@
+<?php
+/**
+ * KlarnaFlags
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Flag Constants class
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaFlags
+{
+
+    /**
+     * Specifies that no flag is to be used.
+     *
+     * @var int
+     */
+    const NO_FLAG = 0;
+
+    //Gender flags
+    /**
+     * Indicates that the person is a female.<br>
+     * Use "" or null when unspecified.<br>
+     *
+     * @var int
+     */
+    const FEMALE = 0;
+
+    /**
+     * Indicates that the person is a male.<br>
+     * Use "" or null when unspecified.<br>
+     *
+     * @var int
+     */
+    const MALE = 1;
+
+    //Order status constants
+    /**
+     * This signifies that the invoice or reservation is accepted.
+     *
+     * @var int
+     */
+    const ACCEPTED = 1;
+
+    /**
+     * This signifies that the invoice or reservation is pending, will be set
+     * to accepted or denied.
+     *
+     * @var int
+     */
+    const PENDING = 2;
+
+    /**
+     * This signifies that the invoice or reservation is <b>denied</b>.
+     *
+     * @var int
+     */
+    const DENIED = 3;
+
+    //Get_address constants
+    /**
+     * A code which indicates that all first names should be returned with the
+     * address.
+     *
+     * Formerly refered to as GA_OLD.
+     *
+     * @var int
+     */
+    const GA_ALL = 1;
+
+    /**
+     * A code which indicates that only the last name should be returned with
+     * the address.
+     *
+     * Formerly referd to as GA_NEW.
+     *
+     * @var int
+     */
+    const GA_LAST = 2;
+
+    /**
+     * A code which indicates that the given name should be returned with
+     * the address. If no given name is registered, this will behave as
+     * {@link KlarnaFlags::GA_ALL GA_ALL}.
+     *
+     */
+    const GA_GIVEN = 5;
+
+    //Article/goods constants
+    /**
+     * Quantity measured in 1/1000s.
+     *
+     * @var int
+     */
+    const PRINT_1000 = 1;
+
+    /**
+     * Quantity measured in 1/100s.
+     *
+     * @var int
+     */
+    const PRINT_100 = 2;
+
+    /**
+     * Quantity measured in 1/10s.
+     *
+     * @var int
+     */
+    const PRINT_10 = 4;
+
+    /**
+     * Indicates that the item is a shipment fee.
+     *
+     * Update_charge_amount (1)
+     *
+     * @var int
+     */
+    const IS_SHIPMENT = 8;
+
+    /**
+     * Indicates that the item is a handling fee.
+     *
+     * Update_charge_amount (2)
+     *
+     * @var int
+     */
+    const IS_HANDLING = 16;
+
+    /**
+     * Article price including VAT.
+     *
+     * @var int
+     */
+    const INC_VAT = 32;
+
+    //Miscellaneous
+    /**
+     * Signifies that this is to be displayed in the checkout.<br>
+     * Used for part payment.<br>
+     *
+     * @var int
+     */
+    const CHECKOUT_PAGE = 0;
+
+    /**
+     * Signifies that this is to be displayed in the product page.<br>
+     * Used for part payment.<br>
+     *
+     * @var int
+     */
+    const PRODUCT_PAGE = 1;
+
+    /**
+     * Signifies that the specified address is billing address.
+     *
+     * @var int
+     */
+    const IS_BILLING = 100;
+
+    /**
+     * Signifies that the specified address is shipping address.
+     *
+     * @var int
+     */
+    const IS_SHIPPING = 101;
+
+    //Invoice and Reservation
+    /**
+     * Indicates that the purchase is a test invoice/part payment.
+     *
+     * @var int
+     */
+    const TEST_MODE = 2;
+
+    /**
+     * PClass id/value for invoices.
+     *
+     * @see KlarnaPClass::INVOICE.
+     * @var int
+     */
+    const PCLASS_INVOICE = -1;
+
+    //Invoice
+    /**
+     * Activates an invoices automatically, requires setting in Klarna Online.
+     *
+     * If you designate this flag an invoice is created directly in the active
+     * state, i.e. Klarna will buy the invoice immediately.
+     *
+     * @var int
+     */
+    const AUTO_ACTIVATE = 1;
+
+    /**
+     * Creates a pre-pay invoice.
+     *
+     * @var int
+     *
+     * @deprecated Do not use.
+     */
+    const PRE_PAY = 8;
+
+    /**
+     * Used to flag a purchase as sensitive order.
+     *
+     * @var int
+     */
+    const SENSITIVE_ORDER = 1024;
+
+    /**
+     * Used to return an array with long and short ocr number.
+     *
+     * @see Klarna::addTransaction()
+     * @var int
+     */
+    const RETURN_OCR = 8192;
+
+    /**
+     * Specifies the shipment type as normal.
+     *
+     * @var int
+     */
+    const NORMAL_SHIPMENT = 1;
+
+    /**
+     * Specifies the shipment type as express.
+     *
+     * @var int
+     */
+    const EXPRESS_SHIPMENT = 2;
+
+    //Mobile (Invoice) flags
+    /**
+     * Marks the transaction as Klarna mobile.
+     *
+     * @var int
+     */
+    const M_PHONE_TRANSACTION = 262144;
+
+    /**
+     * Sends a pin code to the phone sent in pno.
+     *
+     * @var int
+     */
+    const M_SEND_PHONE_PIN = 524288;
+
+    //Reservation flags
+    /**
+     * Signifies that the amount specified is the new amount.
+     *
+     * @var int
+     */
+    const NEW_AMOUNT = 0;
+
+    /**
+     * Signifies that the amount specified is to be added.
+     *
+     * @var int
+     */
+    const ADD_AMOUNT = 1;
+
+    /**
+     * Sends the invoice by mail when activating a reservation.
+     *
+     * @var int
+     */
+    const RSRV_SEND_BY_MAIL = 4;
+
+    /**
+     * Sends the invoice by e-mail when activating a reservation.
+     *
+     * @var int
+     */
+    const RSRV_SEND_BY_EMAIL = 8;
+
+    /**
+     * Used for partial deliveries, this flag saves the reservation number so
+     * it can be used again.
+     *
+     * @var int
+     */
+    const RSRV_PRESERVE_RESERVATION = 16;
+
+    /**
+     * Used to flag a purchase as sensitive order.
+     *
+     * @var int
+     */
+    const RSRV_SENSITIVE_ORDER = 32;
+
+    /**
+     * Marks the transaction as Klarna mobile.
+     *
+     * @var int
+     */
+    const RSRV_PHONE_TRANSACTION = 512;
+
+    /**
+     * Sends a pin code to the mobile number.
+     *
+     * @var int
+     */
+    const RSRV_SEND_PHONE_PIN = 1024;
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/Klarna.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Klarna.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Klarna.php	(revision 5261)
@@ -0,0 +1,4556 @@
+<?php
+/**
+ * Klarna API
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * This API provides a way to integrate with Klarna's services over the
+ * XMLRPC protocol.
+ *
+ * All strings inputted need to be encoded with ISO-8859-1.<br>
+ * In addition you need to decode HTML entities, if they exist.<br>
+ *
+ * For more information see our
+ * {@link http://integration.klarna.com/en/api/step-by-step step by step} guide.
+ *
+ * Dependencies:
+ *
+ *  xmlrpc-3.0.0.beta/lib/xmlrpc.inc
+ *      from {@link http://phpxmlrpc.sourceforge.net/}
+ *
+ * xmlrpc-3.0.0.beta/lib/xmlrpc_wrappers.inc
+ *      from {@link http://phpxmlrpc.sourceforge.net/}
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class Klarna
+{
+    /**
+     * Klarna PHP API version identifier.
+     *
+     * @var string
+     */
+    protected $VERSION = 'php:api:2.3.0';
+
+    /**
+     * Klarna protocol identifier.
+     *
+     * @var string
+     */
+    protected $PROTO = '4.1';
+
+    /**
+     * Flag to indicate use of the report server Candice.
+     *
+     * @var bool
+     */
+    private static $_candice = true;
+
+    /**
+     * URL/Address to the Candice server.
+     * Port used is 80.
+     *
+     * @var string
+     */
+    private static $_c_addr = "clientstat.klarna.com";
+
+    /**
+     * Constants used with LIVE mode for the communications with Klarna.
+     *
+     * @var int
+     */
+    const LIVE = 0;
+
+    /**
+     * URL/Address to the live Klarna Online server.
+     * Port used is 443 for SSL and 80 without.
+     *
+     * @var string
+     */
+    private static $_live_addr = 'payment.klarna.com';
+
+    /**
+     * Constants used with BETA mode for the communications with Klarna.
+     *
+     * @var int
+     */
+    const BETA = 1;
+
+    /**
+     * URL/Address to the beta test Klarna Online server.
+     * Port used is 443 for SSL and 80 without.
+     *
+     * @var string
+     */
+    private static $_beta_addr = 'payment-beta.klarna.com';
+
+    /**
+     * Indicates whether the communications is over SSL or not.
+     *
+     * @var bool
+     */
+    protected $ssl = false;
+
+    /**
+     * An object of xmlrpc_client, used to communicate with Klarna.
+     *
+     * @link http://phpxmlrpc.sourceforge.net/
+     *
+     * @var xmlrpc_client
+     */
+    protected $xmlrpc;
+
+    /**
+     * Which server the Klarna API is using, LIVE or BETA (TESTING).
+     *
+     * @see Klarna::LIVE
+     * @see Klarna::BETA
+     *
+     * @var int
+     */
+    protected $mode;
+
+    /**
+     * The URL/Address used to communicate with Klarna.
+     *
+     * @var string
+     */
+    protected $addr;
+
+    /**
+     * The port number used to communicate with Klarna.
+     *
+     * @var int
+     */
+    protected $port;
+
+    /**
+     * The estore's identifier received from Klarna.
+     *
+     * @var int
+     */
+    private $_eid;
+
+    /**
+     * The estore's shared secret received from Klarna.
+     *
+     * <b>Note</b>:<br>
+     * DO NOT SHARE THIS WITH ANYONE!
+     *
+     * @var string
+     */
+    private $_secret;
+
+    /**
+     * KlarnaCountry constant.
+     *
+     * @see KlarnaCountry
+     *
+     * @var int
+     */
+    private $_country;
+
+    /**
+     * KlarnaCurrency constant.
+     *
+     * @see KlarnaCurrency
+     *
+     * @var int
+     */
+    private $_currency;
+
+    /**
+     * KlarnaLanguage constant.
+     *
+     * @see KlarnaLanguage
+     *
+     * @var int
+     */
+    private $_language;
+
+    /**
+     * An array of articles for the current order.
+     *
+     * @var array
+     */
+    protected $goodsList;
+
+    /**
+     * An array of article numbers and quantity.
+     *
+     * @var array
+     */
+    protected $artNos;
+
+    /**
+     * An KlarnaAddr object containing the billing address.
+     *
+     * @var KlarnaAddr
+     */
+    protected $billing;
+
+    /**
+     * An KlarnaAddr object containing the shipping address.
+     *
+     * @var KlarnaAddr
+     */
+    protected $shipping;
+
+    /**
+     * Estore's user(name) or identifier.
+     * Only used in {@link Klarna::addTransaction()}.
+     *
+     * @var string
+     */
+    protected $estoreUser = "";
+
+    /**
+     * External order numbers from other systems.
+     *
+     * @var string
+     */
+    protected $orderid = array("", "");
+
+    /**
+     * Reference (person) parameter.
+     *
+     * @var string
+     */
+    protected $reference = "";
+
+    /**
+     * Reference code parameter.
+     *
+     * @var string
+     */
+    protected $reference_code = "";
+
+    /**
+     * An array of named extra info.
+     *
+     * @var array
+     */
+    protected $extraInfo = array();
+
+    /**
+     * An array of named bank info.
+     *
+     * @var array
+     */
+    protected $bankInfo = array();
+
+    /**
+     * An array of named income expense info.
+     *
+     * @var array
+     */
+    protected $incomeInfo = array();
+
+    /**
+     * An array of named shipment info.
+     *
+     * @var array
+     */
+    protected $shipInfo = array();
+
+    /**
+     * An array of named travel info.
+     *
+     * @ignore Do not show this in PHPDoc.
+     * @var array
+     */
+    protected $travelInfo = array();
+
+    /**
+     * An array of named activate info
+     *
+     * @ignore
+     * @var array
+     */
+    protected $activateInfo = array();
+
+    /**
+     * An array of named session id's.<br>
+     * E.g. "dev_id_1" => ...<br>
+     *
+     * @var array
+     */
+    protected $sid = array();
+
+    /**
+     * A comment sent in the XMLRPC communications.
+     * This is resetted using clear().
+     *
+     * @var string
+     */
+    protected $comment = "";
+
+    /**
+     * An array with all the checkoutHTML objects.
+     *
+     * @var array
+     */
+    protected $coObjects = array();
+
+    /**
+     * Flag to indicate if the API should output verbose
+     * debugging information.
+     *
+     * @var bool
+     */
+    public static $debug = false;
+
+    /**
+     * Turns on the internal XMLRPC debugging.
+     *
+     * @var bool
+     */
+    public static $xmlrpcDebug = false;
+
+    /**
+     * If this is set to true, XMLRPC invocation is disabled.
+     *
+     * @var bool
+     */
+    public static $disableXMLRPC = false;
+
+    /**
+     * If the estore is using a proxy which populates the clients IP to
+     * x_forwarded_for
+     * then and only then should this be set to true.
+     *
+     * <b>Note</b>:<br>
+     * USE WITH CARE!
+     *
+     * @var bool
+     */
+    public static $x_forwarded_for = false;
+
+    /**
+     * Array of HTML entities, used to create numeric htmlentities.
+     *
+     * @ignore Do not show this in PHPDoc.
+     * @var array
+     */
+    protected static $htmlentities = false;
+
+    /**
+     * Populated with possible proxy information.
+     * A comma separated list of IP addresses.
+     *
+     * @var string
+     */
+    private $_x_fwd;
+
+    /**
+     * The storage class for PClasses.
+     *
+     * Use 'xml' for xmlstorage.class.php.<br>
+     * Use 'mysql' for mysqlstorage.class.php.<br>
+     * Use 'json' for jsonstorage.class.php.<br>
+     *
+     * @var string
+     */
+    protected $pcStorage;
+
+    /**
+     * The storage URI for PClasses.
+     *
+     * Use the absolute or relative URI to a file if
+     * {@link Klarna::$pcStorage} is set as 'xml' or 'json'.<br>
+     * Use a HTTP-auth similar URL if {@link Klarna::$pcStorage} is set
+     * as 'mysql', <br>
+     * e.g. user:passwd@addr:port/dbName.dbTable.<br>
+     * Or an associative array (recommended) {@see MySQLStorage}
+     *
+     * @var mixed
+     */
+    protected $pcURI;
+
+    /**
+     * PCStorage instance.
+     *
+     * @ignore Do not show this in PHPDoc.
+     * @var PCStorage
+     */
+    protected $pclasses;
+
+    /**
+     * ArrayAccess instance.
+     *
+     * @ignore Do not show this in PHPDoc.
+     * @var ArrayAccess
+     */
+    protected $config;
+
+    /**
+     * Empty constructor, because sometimes it's needed.
+     */
+    public function __construct()
+    {
+    }
+
+    /**
+     * Checks if the config has fields described in argument.<br>
+     * Missing field(s) is in the exception message.
+     *
+     * To check that the config has eid and secret:<br>
+     * <code>
+     * try {
+     *     $this->hasFields('eid', 'secret');
+     * }
+     * catch(Exception $e) {
+     *     echo "Missing fields: " . $e->getMessage();
+     * }
+     * </code>
+     *
+     * @throws Exception
+     * @return void
+     */
+    protected function hasFields(/*variable arguments*/)
+    {
+        $missingFields = array();
+        $args = func_get_args();
+        foreach ($args as $field) {
+            if (!isset($this->config[$field])) {
+                $missingFields[] = $field;
+            }
+        }
+        if (count($missingFields) > 0) {
+            throw new Klarna_ConfigFieldMissingException(
+                implode(', ', $missingFields)
+            );
+        }
+    }
+
+    /**
+     * Initializes the Klarna object accordingly to the set config object.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    protected function init()
+    {
+        $this->hasFields('eid', 'secret', 'mode', 'pcStorage', 'pcURI');
+
+        if (!is_int($this->config['eid'])) {
+            $this->config['eid'] = intval($this->config['eid']);
+        }
+
+        if ($this->config['eid'] <= 0) {
+            throw new Klarna_ConfigFieldMissingException('eid');
+        }
+
+        if (!is_string($this->config['secret'])) {
+            $this->config['secret'] = strval($this->config['secret']);
+        }
+
+        if (strlen($this->config['secret']) == 0) {
+            throw new Klarna_ConfigFieldMissingException('secret');
+        }
+
+        //Set the shop id and secret.
+        $this->_eid = $this->config['eid'];
+        $this->_secret = $this->config['secret'];
+
+        //Set the country specific attributes.
+        try {
+            $this->hasFields('country', 'language', 'currency');
+
+            //If hasFields doesn't throw exception we can set them all.
+            $this->setCountry($this->config['country']);
+            $this->setLanguage($this->config['language']);
+            $this->setCurrency($this->config['currency']);
+        } catch(Exception $e) {
+            //fields missing for country, language or currency
+            $this->_country = $this->_language = $this->_currency = null;
+        }
+
+        //Set addr and port according to mode.
+        $this->mode = (int)$this->config['mode'];
+
+        if ($this->mode === self::LIVE) {
+            $this->addr = self::$_live_addr;
+            $this->ssl = true;
+        } else {
+            $this->addr = self::$_beta_addr;
+            $this->ssl = true;
+        }
+
+        try {
+            $this->hasFields('ssl');
+            $this->ssl = (bool)$this->config['ssl'];
+        } catch(Exception $e) {
+            //No 'ssl' field ignore it...
+        }
+
+        if ($this->ssl) {
+             $this->port = 443;
+        } else {
+            $this->port = 80;
+        }
+
+        try {
+            $this->hasFields('candice');
+            self::$_candice = (bool)$this->config['candice'];
+        } catch(Exception $e) {
+            //No 'candice' field ignore it...
+        }
+
+        try {
+            $this->hasFields('xmlrpcDebug');
+            Klarna::$xmlrpcDebug = $this->config['xmlrpcDebug'];
+        } catch(Exception $e) {
+            //No 'xmlrpcDebug' field ignore it...
+        }
+
+        try {
+            $this->hasFields('debug');
+            Klarna::$debug = $this->config['debug'];
+        } catch(Exception $e) {
+            //No 'debug' field ignore it...
+        }
+
+        $this->pcStorage = $this->config['pcStorage'];
+        $this->pcURI = $this->config['pcURI'];
+
+        $this->xmlrpc = new xmlrpc_client(
+            '/',
+            $this->addr,
+            $this->port,
+            ($this->ssl) ? 'https' : 'http'
+        );
+
+        $this->xmlrpc->request_charset_encoding = 'ISO-8859-1';
+    }
+
+    /**
+     * Method of ease for setting common config fields.
+     *
+     * The storage module for PClasses:<br>
+     * Use 'xml' for xmlstorage.class.php.<br>
+     * Use 'mysql' for mysqlstorage.class.php.<br>
+     * Use 'json' for jsonstorage.class.php.<br>
+     *
+     * The storage URI for PClasses:<br>
+     * Use the absolute or relative URI to a file if {@link Klarna::$pcStorage}
+     * is set as 'xml' or 'json'.<br>
+     * Use a HTTP-auth similar URL if {@link Klarna::$pcStorage} is set as
+     * mysql', e.g. user:passwd@addr:port/dbName.dbTable.
+     * Or an associative array (recommended) {@see MySQLStorage}
+     *
+     * <b>Note</b>:<br>
+     * This disables the config file storage.<br>
+     *
+     * @param int    $eid       Merchant ID/EID
+     * @param string $secret    Secret key/Shared key
+     * @param int    $country   {@link KlarnaCountry}
+     * @param int    $language  {@link KlarnaLanguage}
+     * @param int    $currency  {@link KlarnaCurrency}
+     * @param int    $mode      {@link Klarna::LIVE} or {@link Klarna::BETA}
+     * @param string $pcStorage PClass storage module.
+     * @param string $pcURI     PClass URI.
+     * @param bool   $ssl       Whether HTTPS (HTTP over SSL) or HTTP is used.
+     * @param bool   $candice   Error reporting to Klarna.
+     *
+     * @see Klarna::setConfig()
+     * @see KlarnaConfig
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function config(
+        $eid, $secret, $country, $language, $currency,
+        $mode = Klarna::LIVE, $pcStorage = 'json', $pcURI = 'pclasses.json',
+        $ssl = true, $candice = true
+    ) {
+        try {
+            KlarnaConfig::$store = false;
+            $this->config = new KlarnaConfig(null);
+
+            $this->config['eid'] = $eid;
+            $this->config['secret'] = $secret;
+            $this->config['country']  = $country;
+            $this->config['language'] = $language;
+            $this->config['currency'] = $currency;
+            $this->config['mode'] = $mode;
+            $this->config['ssl'] = $ssl;
+            $this->config['candice'] = $candice;
+            $this->config['pcStorage'] = $pcStorage;
+            $this->config['pcURI'] = $pcURI;
+
+            $this->init();
+        } catch(Exception $e) {
+            $this->config = null;
+            throw new KlarnaException(
+                $e->getMessage(),
+                $e->getCode()
+            );
+        }
+    }
+
+    /**
+     * Sets and initializes this Klarna object using the supplied config object.
+     *
+     * @param KlarnaConfig &$config Config object.
+     *
+     * @see KlarnaConfig
+     * @throws  KlarnaException
+     * @return  void
+     */
+    public function setConfig(&$config)
+    {
+        if (!$config instanceof ArrayAccess) {
+            throw new Klarna_InvalidConfigurationException;
+        }
+        $this->config = $config;
+        $this->init();
+    }
+
+    /**
+     * Get the complete locale (country, language, currency) to use for the
+     * values passed, or the configured value if passing null.
+     *
+     * @param mixed $country  country  constant or code
+     * @param mixed $language language constant or code
+     * @param mixed $currency currency constant or code
+     *
+     * @throws KlarnaException
+     * @return array
+     */
+    public function getLocale(
+        $country = null, $language = null, $currency = null
+    ) {
+        $locale = array(
+            'country' => null,
+            'language' => null,
+            'currency' => null
+        );
+
+        if ($country === null) {
+            // Use the configured country / language / currency
+            $locale['country'] = $this->_country;
+            if ($this->_language !== null) {
+                $locale['language'] = $this->_language;
+            }
+
+            if ($this->_currency !== null) {
+                $locale['currency'] = $this->_currency;
+            }
+        } else {
+            // Use the given country / language / currency
+            if (!is_numeric($country)) {
+                $country = KlarnaCountry::fromCode($country);
+            }
+            $locale['country'] = intval($country);
+
+            if ($language !== null) {
+                if (!is_numeric($language)) {
+                    $language = KlarnaLanguage::fromCode($language);
+                }
+                $locale['language'] = intval($language);
+            }
+
+            if ($currency !== null) {
+                if (!is_numeric($currency)) {
+                    $currency = KlarnaCurrency::fromCode($currency);
+                }
+                $locale['currency'] = intval($currency);
+            }
+        }
+
+        // Complete partial structure with defaults
+        if ($locale['currency'] === null) {
+            $locale['currency'] = $this->getCurrencyForCountry(
+                $locale['country']
+            );
+        }
+
+        if ($locale['language'] === null) {
+            $locale['language'] = $this->getLanguageForCountry(
+                $locale['country']
+            );
+        }
+
+        $this->_checkCountry($locale['country']);
+        $this->_checkCurrency($locale['currency']);
+        $this->_checkLanguage($locale['language']);
+
+        return $locale;
+    }
+
+    /**
+     * Sets the country used.
+     *
+     * <b>Note</b>:<br>
+     * If you input 'dk', 'fi', 'de', 'nl', 'no' or 'se', <br>
+     * then currency and language will be set to mirror that country.<br>
+     *
+     * @param string|int $country {@link KlarnaCountry}
+     *
+     * @see KlarnaCountry
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setCountry($country)
+    {
+        if (!is_numeric($country)
+            && (strlen($country) == 2 || strlen($country) == 3)
+        ) {
+            $country = KlarnaCountry::fromCode($country);
+        }
+        $this->_checkCountry($country);
+        $this->_country = $country;
+    }
+
+    /**
+     * Returns the country code for the set country constant.
+     *
+     * @param int $country {@link KlarnaCountry Country} constant.
+     *
+     * @return string  Two letter code, e.g. "se", "no", etc.
+     */
+    public function getCountryCode($country = null)
+    {
+        if ($country === null) {
+            $country = $this->_country;
+        }
+
+        $code = KlarnaCountry::getCode($country);
+        return (string) $code;
+    }
+
+    /**
+     * Returns the {@link KlarnaCountry country} constant from the country code.
+     *
+     * @param string $code Two letter code, e.g. "se", "no", etc.
+     *
+     * @throws KlarnaException
+     * @return int {@link KlarnaCountry Country} constant.
+     */
+    public static function getCountryForCode($code)
+    {
+        $country = KlarnaCountry::fromCode($code);
+        if ($country === null) {
+            throw new Klarna_UnknownCountryException($code);
+        }
+        return $country;
+    }
+
+    /**
+     * Returns the country constant.
+     *
+     * @return int  {@link KlarnaCountry}
+     */
+    public function getCountry()
+    {
+        return $this->_country;
+    }
+
+    /**
+     * Sets the language used.
+     *
+     * <b>Note</b>:<br>
+     * You can use the two letter language code instead of the constant.<br>
+     * E.g. 'da' instead of using {@link KlarnaLanguage::DA}.<br>
+     *
+     * @param string|int $language {@link KlarnaLanguage}
+     *
+     * @see KlarnaLanguage
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setLanguage($language)
+    {
+        if (!is_numeric($language) && strlen($language) == 2) {
+            $this->setLanguage(self::getLanguageForCode($language));
+        } else {
+            $this->_checkLanguage($language);
+            $this->_language = $language;
+        }
+    }
+
+    /**
+     * Returns the language code for the set language constant.
+     *
+     * @param int $language {@link KlarnaLanguage Language} constant.
+     *
+     * @return string Two letter code, e.g. "da", "de", etc.
+     */
+    public function getLanguageCode($language = null)
+    {
+        if ($language === null) {
+            $language = $this->_language;
+        }
+        $code = KlarnaLanguage::getCode($language);
+
+        return (string) $code;
+    }
+
+    /**
+     * Returns the {@link KlarnaLanguage language} constant from the language code.
+     *
+     * @param string $code Two letter code, e.g. "da", "de", etc.
+     *
+     * @throws KlarnaException
+     * @return int  {@link KlarnaLanguage Language} constant.
+     */
+    public static function getLanguageForCode($code)
+    {
+        $language = KlarnaLanguage::fromCode($code);
+
+        if ($language === null) {
+            throw new Klarna_UnknownLanguageException($code);
+        }
+        return $language;
+    }
+
+    /**
+     * Returns the language constant.
+     *
+     * @return int  {@link KlarnaLanguage}
+     */
+    public function getLanguage()
+    {
+        return $this->_language;
+    }
+
+    /**
+     * Sets the currency used.
+     *
+     * <b>Note</b>:<br>
+     * You can use the three letter shortening of the currency.<br>
+     * E.g. "dkk", "eur", "nok" or "sek" instead of the constant.<br>
+     *
+     * @param string|int $currency {@link KlarnaCurrency}
+     *
+     * @see KlarnaCurrency
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setCurrency($currency)
+    {
+        if (!is_numeric($currency) && strlen($currency) == 3) {
+            $this->setCurrency(self::getCurrencyForCode($currency));
+        } else {
+            $this->_checkCurrency($currency);
+            $this->_currency = $currency;
+        }
+    }
+
+    /**
+     * Returns the {@link KlarnaCurrency currency} constant from the currency
+     * code.
+     *
+     * @param string $code Two letter code, e.g. "dkk", "eur", etc.
+     *
+     * @throws KlarnaException
+     * @return int  {@link KlarnaCurrency Currency} constant.
+     */
+    public static function getCurrencyForCode($code)
+    {
+        $currency = KlarnaCurrency::fromCode($code);
+        if ($currency === null) {
+            throw new Klarna_UnknownCurrencyException($code);
+        }
+        return $currency;
+    }
+
+    /**
+     * Returns the the currency code for the set currency constant.
+     *
+     * @param int $currency {@link KlarnaCurrency Currency} constant.
+     *
+     * @return string  Three letter currency code.
+     */
+    public function getCurrencyCode($currency = null)
+    {
+        if ($currency === null) {
+            $currency = $this->_currency;
+        }
+
+        $code = KlarnaCurrency::getCode($currency);
+        return (string) $code;
+    }
+
+    /**
+     * Returns the set currency constant.
+     *
+     * @return int  {@link KlarnaCurrency}
+     */
+    public function getCurrency()
+    {
+        return $this->_currency;
+    }
+
+    /**
+     * Returns the {@link KlarnaLanguage language} constant for the specified
+     * or set country.
+     *
+     * @param int $country {@link KlarnaCountry Country} constant.
+     *
+     * @deprecated Do not use.
+     *
+     * @return int|false if no match otherwise KlarnaLanguage constant.
+     */
+    public function getLanguageForCountry($country = null)
+    {
+        if ($country === null) {
+            $country = $this->_country;
+        }
+        // Since getLanguage defaults to EN, check so we actually have a match
+        $language = KlarnaCountry::getLanguage($country);
+        if (KlarnaCountry::checkLanguage($country, $language)) {
+            return $language;
+        }
+        return false;
+    }
+
+    /**
+     * Returns the {@link KlarnaCurrency currency} constant for the specified
+     * or set country.
+     *
+     * @param int $country {@link KlarnaCountry country} constant.
+     *
+     * @deprecated Do not use.
+     *
+     * @return int|false {@link KlarnaCurrency currency} constant.
+     */
+    public function getCurrencyForCountry($country = null)
+    {
+        if ($country === null) {
+            $country = $this->_country;
+        }
+        return KlarnaCountry::getCurrency($country);
+    }
+
+    /**
+     * Sets the session id's for various device identification,
+     * behaviour identification software.
+     *
+     * <b>Available named session id's</b>:<br>
+     * string - dev_id_1<br>
+     * string - dev_id_2<br>
+     * string - dev_id_3<br>
+     * string - beh_id_1<br>
+     * string - beh_id_2<br>
+     * string - beh_id_3<br>
+     *
+     * @param string $name Session ID identifier, e.g. 'dev_id_1'.
+     * @param string $sid  Session ID.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setSessionID($name, $sid)
+    {
+        $this->_checkArgument($name, "name");
+        $this->_checkArgument($sid, "sid");
+
+        $this->sid[$name] = $sid;
+    }
+
+    /**
+     * Sets the shipment information for the upcoming transaction.<br>
+     *
+     * Using this method is optional.
+     *
+     * <b>Available named values are</b>:<br>
+     * int    - delay_adjust<br>
+     * string - shipping_company<br>
+     * string - shipping_product<br>
+     * string - tracking_no<br>
+     * array  - warehouse_addr<br>
+     *
+     * "warehouse_addr" is sent using {@link KlarnaAddr::toArray()}.
+     *
+     * Make sure you send in the values as the right data type.<br>
+     * Use strval, intval or similar methods to ensure the right type is sent.
+     *
+     * @param string $name  key
+     * @param mixed  $value value
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setShipmentInfo($name, $value)
+    {
+        $this->_checkArgument($name, "name");
+
+        $this->shipInfo[$name] = $value;
+    }
+
+    /**
+     * Sets the Activation information for the upcoming transaction.<br>
+     *
+     * Using this method is optional.
+     *
+     * <b>Available named values are</b>:<br>
+     * int    - flags<br>
+     * int    - bclass<br>
+     * string - orderid1<br>
+     * string - orderid2<br>
+     * string - ocr<br>
+     * string - reference<br>
+     * string - reference_code<br>
+     * string - cust_no<br>
+     *
+     * Make sure you send in the values as the right data type.<br>
+     * Use strval, intval or similar methods to ensure the right type is sent.
+     *
+     * @param string $name  key
+     * @param mixed  $value value
+     *
+     * @see setShipmentInfo
+     *
+     * @return void
+     */
+    public function setActivateInfo($name, $value)
+    {
+        $this->activateInfo[$name] = $value;
+    }
+
+    /**
+     * Sets the extra information for the upcoming transaction.<br>
+     *
+     * Using this method is optional.
+     *
+     * <b>Available named values are</b>:<br>
+     * string - cust_no<br>
+     * string - estore_user<br>
+     * string - maiden_name<br>
+     * string - place_of_birth<br>
+     * string - password<br>
+     * string - new_password<br>
+     * string - captcha<br>
+     * int    - poa_group<br>
+     * string - poa_pno<br>
+     * string - ready_date<br>
+     * string - rand_string<br>
+     * int    - bclass<br>
+     * string - pin<br>
+     *
+     * Make sure you send in the values as the right data type.<br>
+     * Use strval, intval or similar methods to ensure the right type is sent.
+     *
+     * @param string $name  key
+     * @param mixed  $value value
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setExtraInfo($name, $value)
+    {
+        $this->_checkArgument($name, "name");
+
+        $this->extraInfo[$name] = $value;
+    }
+
+    /**
+     * Sets the income expense information for the upcoming transaction.<br>
+     *
+     * Using this method is optional.
+     *
+     * <b>Available named values are</b>:<br>
+     * int - yearly_salary<br>
+     * int - no_people_in_household<br>
+     * int - no_children_below_18<br>
+     * int - net_monthly_household_income<br>
+     * int - monthly_cost_accommodation<br>
+     * int - monthly_cost_other_loans<br>
+     *
+     * Make sure you send in the values as the right data type.<br>
+     * Use strval, intval or similar methods to ensure the right type is sent.
+     *
+     * @param string $name  key
+     * @param mixed  $value value
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setIncomeInfo($name, $value)
+    {
+        $this->_checkArgument($name, "name");
+
+        $this->incomeInfo[$name] = $value;
+    }
+
+    /**
+     * Sets the bank information for the upcoming transaction.<br>
+     *
+     * Using this method is optional.
+     *
+     * <b>Available named values are</b>:<br>
+     * int    - bank_acc_bic<br>
+     * int    - bank_acc_no<br>
+     * int    - bank_acc_pin<br>
+     * int    - bank_acc_tan<br>
+     * string - bank_name<br>
+     * string - bank_city<br>
+     * string - iban<br>
+     *
+     * Make sure you send in the values as the right data type.<br>
+     * Use strval, intval or similar methods to ensure the right type is sent.
+     *
+     * @param string $name  key
+     * @param mixed  $value value
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setBankInfo($name, $value)
+    {
+        $this->_checkArgument($name, "name");
+
+        $this->bankInfo[$name] = $value;
+    }
+
+    /**
+     * Sets the travel information for the upcoming transaction.<br>
+     *
+     * Using this method is optional.
+     *
+     * <b>Available named values are</b>:<br>
+     * string - travel_company<br>
+     * string - reseller_company<br>
+     * string - departure_date<br>
+     * string - return_date<br>
+     * array  - destinations<br>
+     * array  - passenger_list<br>
+     * array  - passport_no<br>
+     * array  - driver_license_no<br>
+     *
+     * Make sure you send in the values as the right data type.<br>
+     * Use strval, intval or similar methods to ensure the right type is sent.
+     *
+     * @param string $name  key
+     * @param mixed  $value value
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setTravelInfo($name, $value)
+    {
+        $this->_checkArgument($name, "name");
+
+        $this->travelInfo[$name] = $value;
+    }
+
+    /**
+     * Returns the clients IP address.
+     *
+     * @return string
+     */
+    public function getClientIP()
+    {
+        $tmp_ip = '';
+        $x_fwd = null;
+
+        //Proxy handling.
+        if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
+            $tmp_ip = $_SERVER['REMOTE_ADDR'];
+        }
+
+        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
+            $x_fwd = $_SERVER["HTTP_X_FORWARDED_FOR"];
+        }
+
+        if (self::$x_forwarded_for && ($x_fwd !== null)) {
+            //Cut out the first IP address
+            $cpos = strpos($x_fwd, ',');
+            if ($cpos !== false) {
+                $tmp_ip = substr($x_fwd, 0, $cpos);
+                $x_fwd = substr($x_fwd, $cpos+2);
+            } else { //Only one IP address
+                $tmp_ip = $x_fwd;
+                $x_fwd = null;
+            }
+        }
+        $this->_x_fwd = $x_fwd;
+
+        return $tmp_ip;
+    }
+
+    /**
+     * Sets the specified address for the current order.
+     *
+     * <b>Address type can be</b>:<br>
+     * {@link KlarnaFlags::IS_SHIPPING}<br>
+     * {@link KlarnaFlags::IS_BILLING}<br>
+     *
+     * @param int        $type Address type.
+     * @param KlarnaAddr $addr Specified address.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setAddress($type, $addr)
+    {
+        if (!($addr instanceof KlarnaAddr)) {
+            throw new Klarna_InvalidKlarnaAddrException;
+        }
+
+        if ($addr->isCompany === null) {
+            $addr->isCompany = false;
+        }
+
+        if ($type === KlarnaFlags::IS_SHIPPING) {
+            $this->shipping = $addr;
+            self::printDebug("shipping address array", $this->shipping);
+            return;
+        }
+
+        if ($type === KlarnaFlags::IS_BILLING) {
+            $this->billing = $addr;
+            self::printDebug("billing address array", $this->billing);
+            return;
+        }
+        throw new Klarna_UnknownAddressTypeException($type);
+    }
+
+    /**
+     * Sets order id's from other systems for the upcoming transaction.<br>
+     * User is only sent with {@link Klarna::addTransaction()}.<br>
+     *
+     * @param string $orderid1 order id 1
+     * @param string $orderid2 order id 2
+     * @param string $user     username
+     *
+     * @see Klarna::setExtraInfo()
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setEstoreInfo($orderid1 = "", $orderid2 = "", $user = "")
+    {
+        if (!is_string($orderid1)) {
+            $orderid1 = strval($orderid1);
+        }
+
+        if (!is_string($orderid2)) {
+            $orderid2 = strval($orderid2);
+        }
+
+        if (!is_string($user)) {
+            $user = strval($user);
+        }
+
+        if (strlen($user) > 0 ) {
+            $this->setExtraInfo('estore_user', $user);
+        }
+
+        $this->orderid[0] = $orderid1;
+        $this->orderid[1] = $orderid2;
+    }
+
+    /**
+     * Sets the reference (person) and reference code, for the upcoming
+     * transaction.
+     *
+     * If this is omitted, it can grab first name, last name from the address
+     * and use that as a reference person.
+     *
+     * @param string $ref  Reference person / message to customer on invoice.
+     * @param string $code Reference code / message to customer on invoice.
+     *
+     * @return void
+     */
+    public function setReference($ref, $code)
+    {
+        $this->_checkRef($ref, $code);
+        $this->reference = $ref;
+        $this->reference_code = $code;
+    }
+
+    /**
+     * Returns the reference (person).
+     *
+     * @return string
+     */
+    public function getReference()
+    {
+        return $this->reference;
+    }
+
+    /**
+     * Returns an associative array used to send the address to Klarna.
+     *
+     *
+     * @param KlarnaAddr $addr Address object to assemble.
+     *
+     * @throws KlarnaException
+     * @return array The address for the specified method.
+     */
+    protected function assembleAddr($addr)
+    {
+        if (!($addr instanceof KlarnaAddr)) {
+            throw new Klarna_InvalidKlarnaAddrException;
+        }
+
+        return $addr->toArray();
+    }
+
+    /**
+     * Sets the comment field, which can be shown in the invoice.
+     *
+     * @param string $data comment to set
+     *
+     * @return void
+     */
+    public function setComment($data)
+    {
+        $this->comment = $data;
+    }
+
+    /**
+     * Adds an additional comment to the comment field. Appends with a newline.
+     *
+     * @param string $data comment to add
+     *
+     * @see Klarna::setComment()
+     *
+     * @return void
+     */
+    public function addComment($data)
+    {
+        $this->comment .= "\n".$data;
+    }
+
+    /**
+     * Returns the PNO/SSN encoding constant for currently set country.
+     *
+     * <b>Note</b>:<br>
+     * Country, language and currency needs to match!
+     *
+     * @throws KlarnaException
+     * @return int  {@link KlarnaEncoding} constant.
+     */
+    public function getPNOEncoding()
+    {
+        $this->_checkLocale();
+
+        $country = KlarnaCountry::getCode($this->_country);
+
+        return KlarnaEncoding::get($country);
+    }
+
+    /**
+     * Purpose: The get_addresses function is used to retrieve a customer's
+     * address(es). Using this, the customer is not required to enter any
+     * information, only confirm the one presented to him/her.<br>
+     *
+     * The get_addresses function can also be used for companies.<br>
+     * If the customer enters a company number, it will return all the
+     * addresses where the company is registered at.<br>
+     *
+     * The get_addresses function is ONLY allowed to be used for Swedish
+     * persons with the following conditions:
+     * <ul>
+     *     <li>
+     *          It can be only used if invoice or part payment is
+     *          the default payment method
+     *     </li>
+     *     <li>
+     *          It has to disappear if the customer chooses another
+     *          payment method
+     *     </li>
+     *     <li>
+     *          The button is not allowed to be called "get address", but
+     *          "continue" or<br>
+     *          it can be picked up automatically when all the numbers have
+     *          been typed.
+     *     </li>
+     * </ul>
+     *
+     * <b>Type can be one of these</b>:<br>
+     * {@link KlarnaFlags::GA_ALL},<br>
+     * {@link KlarnaFlags::GA_LAST},<br>
+     * {@link KlarnaFlags::GA_GIVEN}.<br>
+     *
+     * @param string $pno      Social security number, personal number, ...
+     * @param int    $encoding {@link KlarnaEncoding PNO Encoding} constant.
+     * @param int    $type     Specifies returned information.
+     *
+     * @link http://integration.klarna.com/en/api/standard-integration/functions
+     *       /getaddresses
+     * @throws KlarnaException
+     * @return array   An array of {@link KlarnaAddr} objects.
+     */
+    public function getAddresses(
+        $pno, $encoding = null, $type = KlarnaFlags::GA_GIVEN
+    ) {
+        if ($this->_country !== KlarnaCountry::SE) {
+            throw new Klarna_UnsupportedMarketException("Sweden");
+        }
+
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+
+        $this->_checkPNO($pno, $encoding);
+
+        $digestSecret = self::digest(
+            $this->colon(
+                $this->_eid, $pno, $this->_secret
+            )
+        );
+
+        $paramList = array(
+            $pno,
+            $this->_eid,
+            $digestSecret,
+            $encoding,
+            $type,
+            $this->getClientIP()
+        );
+
+        self::printDebug("get_addresses array", $paramList);
+
+        $result = $this->xmlrpc_call('get_addresses', $paramList);
+
+        self::printDebug("get_addresses result array", $result);
+
+        $addrs = array();
+        foreach ($result as $tmpAddr) {
+            try {
+                $addr = new KlarnaAddr();
+                if ($type === KlarnaFlags::GA_GIVEN) {
+                    $addr->isCompany = (count($tmpAddr) == 5) ? true : false;
+                    if ($addr->isCompany) {
+                        $addr->setCompanyName($tmpAddr[0]);
+                        $addr->setStreet($tmpAddr[1]);
+                        $addr->setZipCode($tmpAddr[2]);
+                        $addr->setCity($tmpAddr[3]);
+                        $addr->setCountry($tmpAddr[4]);
+                    } else {
+                        $addr->setFirstName($tmpAddr[0]);
+                        $addr->setLastName($tmpAddr[1]);
+                        $addr->setStreet($tmpAddr[2]);
+                        $addr->setZipCode($tmpAddr[3]);
+                        $addr->setCity($tmpAddr[4]);
+                        $addr->setCountry($tmpAddr[5]);
+                    }
+                } else if ($type === KlarnaFlags::GA_LAST) {
+                    // Here we cannot decide if it is a company or not?
+                    // Assume private person.
+                    $addr->setLastName($tmpAddr[0]);
+                    $addr->setStreet($tmpAddr[1]);
+                    $addr->setZipCode($tmpAddr[2]);
+                    $addr->setCity($tmpAddr[3]);
+                    $addr->setCountry($tmpAddr[4]);
+                } else if ($type === KlarnaFlags::GA_ALL) {
+                    if (strlen($tmpAddr[0]) > 0) {
+                        $addr->setFirstName($tmpAddr[0]);
+                        $addr->setLastName($tmpAddr[1]);
+                    } else {
+                        $addr->isCompany = true;
+                        $addr->setCompanyName($tmpAddr[1]);
+                    }
+                    $addr->setStreet($tmpAddr[2]);
+                    $addr->setZipCode($tmpAddr[3]);
+                    $addr->setCity($tmpAddr[4]);
+                    $addr->setCountry($tmpAddr[5]);
+                } else {
+                    continue;
+                }
+                $addrs[] = $addr;
+            } catch(Exception $e) {
+                //Silently fail
+            }
+        }
+
+        return $addrs;
+    }
+
+    /**
+     * Adds an article to the current goods list for the current order.
+     *
+     * <b>Note</b>:<br>
+     * It is recommended that you use {@link KlarnaFlags::INC_VAT}.<br>
+     *
+     * <b>Flags can be</b>:<br>
+     * {@link KlarnaFlags::INC_VAT}<br>
+     * {@link KlarnaFlags::IS_SHIPMENT}<br>
+     * {@link KlarnaFlags::IS_HANDLING}<br>
+     * {@link KlarnaFlags::PRINT_1000}<br>
+     * {@link KlarnaFlags::PRINT_100}<br>
+     * {@link KlarnaFlags::PRINT_10}<br>
+     * {@link KlarnaFlags::NO_FLAG}<br>
+     *
+     * Some flags can be added to each other for multiple options.
+     *
+     * @param int    $qty      Quantity.
+     * @param string $artNo    Article number.
+     * @param string $title    Article title.
+     * @param int    $price    Article price.
+     * @param float  $vat      VAT in percent, e.g. 25% is inputted as 25.
+     * @param float  $discount Possible discount on article.
+     * @param int    $flags    Options which specify the article
+     *                         ({@link KlarnaFlags::IS_HANDLING}) and it's price
+     *                         ({@link KlarnaFlags::INC_VAT})
+     *
+     * @see Klarna::addTransaction()
+     * @see Klarna::reserveAmount()
+     * @see Klarna::activateReservation()
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function addArticle(
+        $qty, $artNo, $title, $price, $vat, $discount = 0,
+        $flags = KlarnaFlags::INC_VAT
+    ) {
+        $this->_checkQty($qty);
+
+        // Either artno or title has to be set
+        if ((($artNo === null ) || ($artNo == ""))
+            && (($title === null ) || ($title == ""))
+        ) {
+            throw new Klarna_ArgumentNotSetException('Title and ArtNo', 50026);
+        }
+
+        $this->_checkPrice($price);
+        $this->_checkVAT($vat);
+        $this->_checkDiscount($discount);
+        $this->_checkInt($flags, 'flags');
+
+        //Create goodsList array if not set.
+        if (!$this->goodsList || !is_array($this->goodsList)) {
+            $this->goodsList = array();
+        }
+
+        //Populate a temp array with the article details.
+        $tmpArr = array(
+            "artno" => $artNo,
+            "title" => $title,
+            "price" => $price,
+            "vat" => $vat,
+            "discount" => $discount,
+            "flags" => $flags
+        );
+
+        //Add the temp array and quantity field to the internal goods list.
+        $this->goodsList[] = array(
+                "goods" => $tmpArr,
+                "qty"   => $qty
+        );
+
+        if (count($this->goodsList) > 0) {
+            self::printDebug(
+                "article added",
+                $this->goodsList[count($this->goodsList)-1]
+            );
+        }
+    }
+
+    /**
+     * Assembles and sends the current order to Klarna.<br>
+     * This clears all relevant data if $clear is set to true.<br>
+     *
+     * <b>This method returns an array with</b>:<br>
+     * Invoice number<br>
+     * Order status flag<br>
+     *
+     * If the flag {@link KlarnaFlags::RETURN_OCR} is used:<br>
+     * Invoice number<br>
+     * OCR number <br>
+     * Order status flag<br>
+     *
+     * <b>Order status can be</b>:<br>
+     * {@link KlarnaFlags::ACCEPTED}<br>
+     * {@link KlarnaFlags::PENDING}<br>
+     * {@link KlarnaFlags::DENIED}<br>
+     *
+     * Gender is only required for Germany and Netherlands.<br>
+     *
+     * <b>Flags can be</b>:<br>
+     * {@link KlarnaFlags::NO_FLAG}<br>
+     * {@link KlarnaFlags::TEST_MODE}<br>
+     * {@link KlarnaFlags::AUTO_ACTIVATE}<br>
+     * {@link KlarnaFlags::SENSITIVE_ORDER}<br>
+     * {@link KlarnaFlags::RETURN_OCR}<br>
+     * {@link KlarnaFlags::M_PHONE_TRANSACTION}<br>
+     * {@link KlarnaFlags::M_SEND_PHONE_PIN}<br>
+     *
+     * Some flags can be added to each other for multiple options.
+     *
+     * <b>Note</b>:<br>
+     * Normal shipment type is assumed unless otherwise specified,
+     * ou can do this by calling:<br>
+     * {@link Klarna::setShipmentInfo() setShipmentInfo('delay_adjust', ...)}
+     * with either:<br>
+     * {@link KlarnaFlags::NORMAL_SHIPMENT NORMAL_SHIPMENT} or
+     * {@link KlarnaFlags::EXPRESS_SHIPMENT EXPRESS_SHIPMENT}<br>
+     *
+     * @param string $pno      Personal number, SSN, date of birth, etc.
+     * @param int    $gender   {@link KlarnaFlags::FEMALE} or
+     *                         {@link KlarnaFlags::MALE},
+     *                         null or "" for unspecified.
+     * @param int    $flags    Options which affect the behaviour.
+     * @param int    $pclass   PClass id used for this invoice.
+     * @param int    $encoding {@link KlarnaEncoding Encoding} constant for the
+     *                         PNO parameter.
+     * @param bool   $clear    Whether customer info should be cleared after
+     *                         this call or not.
+     *
+     * @link http://integration.klarna.com/en/api/standard-integration/functions/
+     *       addtransaction
+     *
+     * @throws KlarnaException
+     * @return array An array with invoice number and order status. [string, int]
+     */
+    public function addTransaction(
+        $pno, $gender, $flags = KlarnaFlags::NO_FLAG,
+        $pclass = KlarnaPClass::INVOICE, $encoding = null, $clear = true
+    ) {
+        $this->_checkLocale(50023);
+
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+
+        if (!($flags & KlarnaFlags::PRE_PAY)) {
+            $this->_checkPNO($pno, $encoding);
+        }
+
+        if ($gender === 'm') {
+            $gender = KlarnaFlags::MALE;
+        } else if ($gender === 'f') {
+            $gender = KlarnaFlags::FEMALE;
+        }
+
+        if ($gender !== null && strlen($gender) > 0) {
+            $this->_checkInt($gender, 'gender');
+        }
+
+        $this->_checkInt($flags,  'flags');
+        $this->_checkInt($pclass, 'pclass');
+
+        //Check so required information is set.
+        $this->_checkGoodslist();
+
+        //We need at least one address set
+        if (!($this->billing instanceof KlarnaAddr)
+            && !($this->shipping instanceof KlarnaAddr)
+        ) {
+            throw new Klarna_MissingAddressException;
+        }
+
+        //If only one address is set, copy to the other address.
+        if (!($this->shipping instanceof KlarnaAddr)
+            && ($this->billing instanceof KlarnaAddr)
+        ) {
+            $this->shipping = $this->billing;
+        } else if (!($this->billing instanceof KlarnaAddr)
+            && ($this->shipping instanceof KlarnaAddr)
+        ) {
+            $this->billing = $this->shipping;
+        }
+
+        //Assume normal shipment unless otherwise specified.
+        if (!isset($this->shipInfo['delay_adjust'])) {
+            $this->setShipmentInfo('delay_adjust', KlarnaFlags::NORMAL_SHIPMENT);
+        }
+
+        //Make sure we get any session ID's or similar
+        $this->initCheckout();
+
+        //function add_transaction_digest
+        $string = "";
+        foreach ($this->goodsList as $goods) {
+            $string .= $goods['goods']['title'] .':';
+        }
+        $digestSecret = self::digest($string . $this->_secret);
+        //end function add_transaction_digest
+
+        $billing = $this->assembleAddr($this->billing);
+        $shipping = $this->assembleAddr($this->shipping);
+
+        //Shipping country must match specified country!
+        if (strlen($shipping['country']) > 0
+            && ($shipping['country'] !== $this->_country)
+        ) {
+            throw new Klarna_ShippingCountryException;
+        }
+
+        $paramList = array(
+            $pno,
+            $gender,
+            $this->reference,
+            $this->reference_code,
+            $this->orderid[0],
+            $this->orderid[1],
+            $shipping,
+            $billing,
+            $this->getClientIP(),
+            $flags,
+            $this->_currency,
+            $this->_country,
+            $this->_language,
+            $this->_eid,
+            $digestSecret,
+            $encoding,
+            $pclass,
+            $this->goodsList,
+            $this->comment,
+            $this->shipInfo,
+            $this->travelInfo,
+            $this->incomeInfo,
+            $this->bankInfo,
+            $this->sid,
+            $this->extraInfo
+        );
+
+        self::printDebug('add_invoice', $paramList);
+
+        $result = $this->xmlrpc_call('add_invoice', $paramList);
+
+        if ($clear === true) {
+            //Make sure any stored values that need to be unique between
+            //purchases are cleared.
+            foreach ($this->coObjects as $co) {
+                $co->clear();
+            }
+            $this->clear();
+        }
+
+        self::printDebug('add_invoice result', $result);
+
+        return $result;
+    }
+
+
+    /**
+     * Activates previously created invoice
+     * (from {@link Klarna::addTransaction()}).
+     *
+     * <b>Note</b>:<br>
+     * If you want to change the shipment type, you can specify it using:
+     * {@link Klarna::setShipmentInfo() setShipmentInfo('delay_adjust', ...)}
+     * with either: {@link KlarnaFlags::NORMAL_SHIPMENT NORMAL_SHIPMENT} or
+     * {@link KlarnaFlags::EXPRESS_SHIPMENT EXPRESS_SHIPMENT}
+     *
+     * @param string $invNo  Invoice number.
+     * @param int    $pclass PClass id used for this invoice.
+     * @param bool   $clear  Whether customer info should be cleared after this
+     *                       call.
+     *
+     * @see Klarna::setShipmentInfo()
+     * @link http://integration.klarna.com/en/api/standard-integration/functions
+     *       /activateinvoice
+     *
+     * @throws KlarnaException
+     * @return string  An URL to the PDF invoice.
+     */
+    public function activateInvoice(
+        $invNo, $pclass = KlarnaPClass::INVOICE, $clear = true
+    ) {
+        $this->_checkInvNo($invNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $digestSecret,
+            $pclass,
+            $this->shipInfo
+        );
+
+        self::printDebug('activate_invoice', $paramList);
+
+        $result = $this->xmlrpc_call('activate_invoice', $paramList);
+
+        if ($clear === true) {
+            $this->clear();
+        }
+
+        self::printDebug('activate_invoice result', $result);
+
+        return $result;
+    }
+
+    /**
+     * Removes a passive invoices which has previously been created with
+     * {@link Klarna::addTransaction()}.
+     * True is returned if the invoice was successfully removed, otherwise an
+     * exception is thrown.<br>
+     *
+     * @param string $invNo Invoice number.
+     *
+     * @throws KlarnaException
+     * @return bool
+     */
+    public function deleteInvoice($invNo)
+    {
+        $this->_checkInvNo($invNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $digestSecret
+        );
+
+        self::printDebug('delete_invoice', $paramList);
+
+        $result = $this->xmlrpc_call('delete_invoice', $paramList);
+
+        return ($result == 'ok') ? true : false;
+    }
+
+    /**
+     * Summarizes the prices of the held goods list
+     *
+     * @return int total amount
+     */
+    public function summarizeGoodsList()
+    {
+        $amount = 0;
+        if (!is_array($this->goodsList)) {
+            return $amount;
+        }
+        foreach ($this->goodsList as $goods) {
+            $price = $goods['goods']['price'];
+
+            // Add VAT if price is Excluding VAT
+            if (($goods['goods']['flags'] & KlarnaFlags::INC_VAT) === 0) {
+                $vat = $goods['goods']['vat'] / 100.0;
+                $price *= (1.0 + $vat);
+            }
+
+            // Reduce discounts
+            if ($goods['goods']['discount'] > 0) {
+                $discount = $goods['goods']['discount'] / 100.0;
+                $price *= (1.0 - $discount);
+            }
+
+            $amount += $price * (int)$goods['qty'];
+        }
+        return $amount;
+    }
+
+    /**
+     * Reserves a purchase amount for a specific customer. <br>
+     * The reservation is valid, by default, for 7 days.<br>
+     *
+     * <b>This method returns an array with</b>:<br>
+     * A reservation number (rno)<br>
+     * Order status flag<br>
+     *
+     * <b>Order status can be</b>:<br>
+     * {@link KlarnaFlags::ACCEPTED}<br>
+     * {@link KlarnaFlags::PENDING}<br>
+     * {@link KlarnaFlags::DENIED}<br>
+     *
+     * <b>Please note</b>:<br>
+     * Activation must be done with activate_reservation, i.e. you cannot
+     * activate through Klarna Online.
+     *
+     * Gender is only required for Germany and Netherlands.<br>
+     *
+     * <b>Flags can be set to</b>:<br>
+     * {@link KlarnaFlags::NO_FLAG}<br>
+     * {@link KlarnaFlags::TEST_MODE}<br>
+     * {@link KlarnaFlags::RSRV_SENSITIVE_ORDER}<br>
+     * {@link KlarnaFlags::RSRV_PHONE_TRANSACTION}<br>
+     * {@link KlarnaFlags::RSRV_SEND_PHONE_PIN}<br>
+     *
+     * Some flags can be added to each other for multiple options.
+     *
+     * <b>Note</b>:<br>
+     * Normal shipment type is assumed unless otherwise specified, you can do
+     * this by calling:<br>
+     * {@link Klarna::setShipmentInfo() setShipmentInfo('delay_adjust', ...)}
+     * with either: {@link KlarnaFlags::NORMAL_SHIPMENT NORMAL_SHIPMENT} or
+     * {@link KlarnaFlags::EXPRESS_SHIPMENT EXPRESS_SHIPMENT}<br>
+     *
+     * @param string $pno      Personal number, SSN, date of birth, etc.
+     * @param int    $gender   {@link KlarnaFlags::FEMALE} or
+     *                         {@link KlarnaFlags::MALE}, null for unspecified.
+     * @param int    $amount   Amount to be reserved, including VAT.
+     * @param int    $flags    Options which affect the behaviour.
+     * @param int    $pclass   {@link KlarnaPClass::getId() PClass ID}.
+     * @param int    $encoding {@link KlarnaEncoding PNO Encoding} constant.
+     * @param bool   $clear    Whether customer info should be cleared after
+     *                         this call.
+     *
+     * @link http://integration.klarna.com/en/api/advanced-integration
+     *       /functions/reserveamount
+     *
+     * @throws KlarnaException
+     * @return array An array with reservation number and order
+     *               status. [string, int]
+     */
+    public function reserveAmount(
+        $pno, $gender, $amount, $flags = 0, $pclass = KlarnaPClass::INVOICE,
+        $encoding = null, $clear = true
+    ) {
+        $this->_checkLocale();
+
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+
+        $this->_checkPNO($pno, $encoding);
+
+        if ($gender === 'm') {
+            $gender = KlarnaFlags::MALE;
+        } else if ($gender === 'f') {
+            $gender = KlarnaFlags::FEMALE;
+        }
+        if ($gender !== null && strlen($gender) > 0) {
+            $this->_checkInt($gender, 'gender');
+        }
+
+        $this->_checkInt($flags,  'flags');
+        $this->_checkInt($pclass, 'pclass');
+
+        //Check so required information is set.
+        $this->_checkGoodslist();
+
+
+        //Calculate automatically the amount from goodsList.
+        if ($amount === -1) {
+            $amount = (int)round($this->summarizeGoodsList());
+        } else {
+            $this->_checkAmount($amount);
+        }
+
+        if ($amount <= 0) {
+            throw new Klarna_InvalidPriceException($amount);
+        }
+
+        //No addresses used for phone transactions
+        if ($flags & KlarnaFlags::RSRV_PHONE_TRANSACTION) {
+            $billing = $shipping = '';
+        } else {
+            $billing = $this->assembleAddr($this->billing);
+            $shipping = $this->assembleAddr($this->shipping);
+
+            if (strlen($shipping['country']) > 0
+                && ($shipping['country'] !== $this->_country)
+            ) {
+                throw new Klarna_ShippingCountryException;
+            }
+        }
+
+        //Assume normal shipment unless otherwise specified.
+        if (!isset($this->shipInfo['delay_adjust'])) {
+            $this->setShipmentInfo('delay_adjust', KlarnaFlags::NORMAL_SHIPMENT);
+        }
+
+        //Make sure we get any session ID's or similar
+        $this->initCheckout($this, $this->_eid);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $pno, $amount, $this->_secret)
+        );
+
+        $paramList = array(
+            $pno,
+            $gender,
+            $amount,
+            $this->reference,
+            $this->reference_code,
+            $this->orderid[0],
+            $this->orderid[1],
+            $shipping,
+            $billing,
+            $this->getClientIP(),
+            $flags,
+            $this->_currency,
+            $this->_country,
+            $this->_language,
+            $this->_eid,
+            $digestSecret,
+            $encoding, $pclass,
+            $this->goodsList,
+            $this->comment,
+            $this->shipInfo,
+            $this->travelInfo,
+            $this->incomeInfo,
+            $this->bankInfo,
+            $this->sid,
+            $this->extraInfo
+        );
+
+        self::printDebug('reserve_amount', $paramList);
+
+        $result = $this->xmlrpc_call('reserve_amount', $paramList);
+
+        if ($clear === true) {
+            //Make sure any stored values that need to be unique between
+            //purchases are cleared.
+            foreach ($this->coObjects as $co) {
+                $co->clear();
+            }
+            $this->clear();
+        }
+
+        self::printDebug('reserve_amount result', $result);
+
+        return $result;
+    }
+
+    /**
+     * Cancels a reservation.
+     *
+     * @param string $rno Reservation number.
+     *
+     * @link http://integration.klarna.com/en/api/advanced-integration/functions
+     *       /cancelreservation
+     *
+     * @throws KlarnaException
+     * @return bool True, if the cancellation was successful.
+     */
+    public function cancelReservation($rno)
+    {
+        $this->_checkRNO($rno);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $rno, $this->_secret)
+        );
+        $paramList = array(
+            $rno,
+            $this->_eid,
+            $digestSecret
+        );
+
+        self::printDebug('cancel_reservation', $paramList);
+
+        $result = $this->xmlrpc_call('cancel_reservation', $paramList);
+
+        return ($result == 'ok');
+    }
+
+    /**
+     * Changes specified reservation to a new amount.
+     *
+     * <b>Flags can be either of these</b>:<br>
+     * {@link KlarnaFlags::NEW_AMOUNT}<br>
+     * {@link KlarnaFlags::ADD_AMOUNT}<br>
+     *
+     * @param string $rno    Reservation number.
+     * @param int    $amount Amount including VAT.
+     * @param int    $flags  Options which affect the behaviour.
+     *
+     * @link http://integration.klarna.com/en/api/advanced-integration/functions
+     *       /changereservation
+     *
+     * @throws KlarnaException
+     * @return bool    True, if the change was successful.
+     */
+    public function changeReservation(
+        $rno, $amount, $flags = KlarnaFlags::NEW_AMOUNT
+    ) {
+        $this->_checkRNO($rno);
+        $this->_checkAmount($amount);
+        $this->_checkInt($flags, 'flags');
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $rno, $amount, $this->_secret)
+        );
+        $paramList = array(
+            $rno,
+            $amount,
+            $this->_eid,
+            $digestSecret,
+            $flags
+        );
+
+        self::printDebug('change_reservation', $paramList);
+
+        $result = $this->xmlrpc_call('change_reservation', $paramList);
+
+        return ($result  == 'ok') ? true : false;
+    }
+
+    /**
+     * Update the reservation matching the given reservation number.
+     *
+     * @param string  $rno   Reservation number
+     * @param boolean $clear clear set data aftre updating. Defaulted to true.
+     *
+     * @throws KlarnaException if no RNO is given, or if an error is recieved
+     *         from Klarna Online.
+     *
+     * @return true if the update was successful
+     */
+    public function update($rno, $clear = true)
+    {
+        $this->_checkRNO($rno);
+
+        // All info that is sent in is part of the digest secret, in this order:
+        // [
+        //      proto_vsn, client_vsn, eid, rno, careof, street, zip, city,
+        //      country, fname, lname, careof, street, zip, city, country,
+        //      fname, lname, artno, qty, orderid1, orderid2
+        // ].
+        // The address part appears twice, that is one per address that
+        // changes. If no value is sent in for an optional field, there
+        // is no entry for this field in the digest secret. Shared secret
+        // is added at the end of the digest secret.
+        $digestArray = array(
+            str_replace('.', ':', $this->PROTO),
+            $this->VERSION,
+            $this->_eid,
+            $rno
+        );
+        $digestArray = array_merge(
+            $digestArray, $this->_addressDigestPart($this->shipping)
+        );
+        $digestArray = array_merge(
+            $digestArray, $this->_addressDigestPart($this->billing)
+        );
+        if (is_array($this->goodsList) && $this->goodsList !== array()) {
+            foreach ($this->goodsList as $goods) {
+                if (strlen($goods["goods"]["artno"]) > 0) {
+                    $digestArray[] = $goods["goods"]["artno"];
+                } else {
+                    $digestArray[] = $goods["goods"]["title"];
+                }
+                $digestArray[] = $goods["qty"];
+            }
+        }
+        foreach ($this->orderid as $orderid) {
+            $digestArray[] = $orderid;
+        }
+        $digestArray[] = $this->_secret;
+
+        $digestSecret = $this->digest(implode(':', array_filter($digestArray)));
+
+
+        $shipping = array();
+        $billing = array();
+        if ($this->shipping !== null && $this->shipping instanceof KlarnaAddr) {
+            $shipping = $this->shipping->toArray();
+        }
+        if ($this->billing !== null && $this->billing instanceof KlarnaAddr) {
+            $billing = $this->billing->toArray();
+        }
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $rno,
+            array(
+                'goods_list' => $this->goodsList,
+                'dlv_addr' => $shipping,
+                'bill_addr' => $billing,
+                'orderid1' => $this->orderid[0],
+                'orderid2' => $this->orderid[1]
+            )
+        );
+
+        self::printDebug('update array', $paramList);
+
+        $result = $this->xmlrpc_call('update', $paramList);
+
+        self::printDebug('update result', $result);
+
+        return ($result === 'ok');
+    }
+
+    /**
+     * Help function to sort the address for update digest.
+     *
+     * @param KlarnaAddr|null $address KlarnaAddr object or null
+     *
+     * @return array
+     */
+    private function _addressDigestPart(KlarnaAddr $address = null)
+    {
+        if ($address === null) {
+            return array();
+        }
+
+        $keyOrder = array(
+            'careof', 'street', 'zip', 'city', 'country', 'fname', 'lname'
+        );
+
+        $holder = $address->toArray();
+        $digest = array();
+
+        foreach ($keyOrder as $key) {
+            if ($holder[$key] != "") {
+                $digest[] = $holder[$key];
+            }
+        }
+
+        return $digest;
+    }
+
+    /**
+     * Activate the reservation matching the given reservation number.
+     * Optional information should be set in ActivateInfo.
+     *
+     * To perform a partial activation, use the addArtNo function to specify
+     * which items in the reservation to include in the activation.
+     *
+     * @param string  $rno   Reservation number
+     * @param string  $ocr   optional OCR number to attach to the reservation when
+     *                       activating. Overrides OCR specified in activateInfo.
+     * @param string  $flags optional flags to affect behavior. If specified it
+     *                       will overwrite any flag set in activateInfo.
+     * @param boolean $clear clear set data after activating. Defaulted to true.
+     *
+     * @throws KlarnaException when the RNO is not specified, or if an error
+     *         is recieved from Klarna Online.
+     * @return A string array with risk status and reservation number.
+     */
+    public function activate(
+        $rno, $ocr = null, $flags = null, $clear = true
+    ) {
+        $this->_checkRNO($rno);
+
+        // Overwrite any OCR set on activateInfo if supplied here since this
+        // method call is more specific.
+        if ($ocr !== null) {
+            $this->setActivateInfo('ocr', $ocr);
+        }
+
+        // If flags is specified set the flag supplied here to activateInfo.
+        if ($flags !== null) {
+            $this->setActivateInfo('flags', $flags);
+        }
+
+        //Assume normal shipment unless otherwise specified.
+        if (!array_key_exists('delay_adjust', $this->shipInfo)) {
+            $this->setShipmentInfo('delay_adjust', KlarnaFlags::NORMAL_SHIPMENT);
+        }
+
+        // Append shipment info to activateInfo
+        $this->activateInfo['shipment_info'] = $this->shipInfo;
+
+        // Unlike other calls, if NO_FLAG is specified it should not be sent in
+        // at all.
+        if (array_key_exists('flags', $this->activateInfo)
+            && $this->activateInfo['flags'] === KlarnaFlags::NO_FLAG
+        ) {
+            unset($this->activateInfo['flags']);
+        }
+
+        // Build digest. Any field in activateInfo that is set is included in
+        // the digest.
+        $digestArray = array(
+            str_replace('.', ':', $this->PROTO),
+            $this->VERSION,
+            $this->_eid,
+            $rno
+        );
+
+        $optionalDigestKeys = array(
+            'bclass',
+            'cust_no',
+            'flags',
+            'ocr',
+            'orderid1',
+            'orderid2',
+            'reference',
+            'reference_code'
+        );
+
+        foreach ($optionalDigestKeys as $key) {
+            if (array_key_exists($key, $this->activateInfo)) {
+                $digestArray[] = $this->activateInfo[$key];
+            }
+        }
+
+        if (array_key_exists('delay_adjust', $this->activateInfo['shipment_info'])) {
+            $digestArray[] = $this->activateInfo['shipment_info']['delay_adjust'];
+        }
+
+        // If there are any artnos added with addArtNo, add them to the digest
+        // and to the activateInfo
+        if (is_array($this->artNos)) {
+            foreach ($this->artNos as $artNo) {
+                $digestArray[] = $artNo['artno'];
+                $digestArray[] = $artNo['qty'];
+            }
+            $this->setActivateInfo('artnos', $this->artNos);
+        }
+
+        $digestArray[] = $this->_secret;
+        $digestSecret = self::digest(implode(':', array_filter($digestArray)));
+
+        // Create the parameter list.
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $rno,
+            $this->activateInfo
+        );
+
+        self::printDebug('activate array', $paramList);
+
+        $result = $this->xmlrpc_call('activate', $paramList);
+
+        self::printDebug('activate result', $result);
+
+        // Clear the state if specified.
+        if ($clear) {
+            $this->clear();
+        }
+
+        return $result;
+    }
+
+    /**
+     * Activates a previously created reservation.
+     *
+     * <b>This method returns an array with</b>:<br>
+     * Risk status ("no_risk", "ok")<br>
+     * Invoice number<br>
+     *
+     * Gender is only required for Germany and Netherlands.<br>
+     *
+     * Use of the OCR parameter is optional.
+     * An OCR number can be retrieved by using:
+     * {@link Klarna::reserveOCR()} or {@link Klarna::reserveOCRemail()}.
+     *
+     * <b>Flags can be set to</b>:<br>
+     * {@link KlarnaFlags::NO_FLAG}<br>
+     * {@link KlarnaFlags::TEST_MODE}<br>
+     * {@link KlarnaFlags::RSRV_SEND_BY_MAIL}<br>
+     * {@link KlarnaFlags::RSRV_SEND_BY_EMAIL}<br>
+     * {@link KlarnaFlags::RSRV_PRESERVE_RESERVATION}<br>
+     * {@link KlarnaFlags::RSRV_SENSITIVE_ORDER}<br>
+     *
+     * Some flags can be added to each other for multiple options.
+     *
+     * <b>Note</b>:<br>
+     * Normal shipment type is assumed unless otherwise specified, you can
+     * do this by calling:
+     * {@link Klarna::setShipmentInfo() setShipmentInfo('delay_adjust', ...)}
+     * with either: {@link KlarnaFlags::NORMAL_SHIPMENT NORMAL_SHIPMENT} or
+     * {@link KlarnaFlags::EXPRESS_SHIPMENT EXPRESS_SHIPMENT}<br>
+     *
+     * @param string $pno      Personal number, SSN, date of birth, etc.
+     * @param string $rno      Reservation number.
+     * @param int    $gender   {@link KlarnaFlags::FEMALE} or
+     *                         {@link KlarnaFlags::MALE}, null for unspecified.
+     * @param string $ocr      A OCR number.
+     * @param int    $flags    Options which affect the behaviour.
+     * @param int    $pclass   {@link KlarnaPClass::getId() PClass ID}.
+     * @param int    $encoding {@link KlarnaEncoding PNO Encoding} constant.
+     * @param bool   $clear    Whether customer info should be cleared after
+     *                         this call.
+     *
+     * @link http://integration.klarna.com/en/api/advanced-integration/functions
+     *       /activatereservation
+     * @see Klarna::reserveAmount()
+     *
+     * @throws KlarnaException
+     * @return array An array with risk status and invoice number [string, string].
+     */
+    public function activateReservation(
+        $pno, $rno, $gender, $ocr = "", $flags = KlarnaFlags::NO_FLAG,
+        $pclass = KlarnaPClass::INVOICE, $encoding = null, $clear = true
+    ) {
+        $this->_checkLocale();
+
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+
+        // Only check PNO if it is not explicitly null.
+        if ($pno !== null) {
+            $this->_checkPNO($pno, $encoding);
+        }
+
+        $this->_checkRNO($rno);
+
+        if ($gender !== null && strlen($gender) > 0) {
+            $this->_checkInt($gender, 'gender');
+        }
+
+        $this->_checkOCR($ocr);
+        $this->_checkRef($this->reference, $this->reference_code);
+
+        $this->_checkGoodslist();
+
+        //No addresses used for phone transactions
+        $billing = $shipping = '';
+        if ( !($flags & KlarnaFlags::RSRV_PHONE_TRANSACTION) ) {
+            $billing = $this->assembleAddr($this->billing);
+            $shipping = $this->assembleAddr($this->shipping);
+
+            if (strlen($shipping['country']) > 0
+                && ($shipping['country'] !== $this->_country)
+            ) {
+                throw new Klarna_ShippingCountryException;
+            }
+        }
+
+        //activate digest
+        $string = $this->_eid . ":" . $pno . ":";
+        foreach ($this->goodsList as $goods) {
+            $string .= $goods["goods"]["artno"] . ":" . $goods["qty"] . ":";
+        }
+        $digestSecret = self::digest($string . $this->_secret);
+        //end digest
+
+        //Assume normal shipment unless otherwise specified.
+        if (!isset($this->shipInfo['delay_adjust'])) {
+            $this->setShipmentInfo('delay_adjust', KlarnaFlags::NORMAL_SHIPMENT);
+        }
+
+        $paramList = array(
+            $rno,
+            $ocr,
+            $pno,
+            $gender,
+            $this->reference,
+            $this->reference_code,
+            $this->orderid[0],
+            $this->orderid[1],
+            $shipping,
+            $billing,
+            "0.0.0.0",
+            $flags,
+            $this->_currency,
+            $this->_country,
+            $this->_language,
+            $this->_eid,
+            $digestSecret,
+            $encoding,
+            $pclass,
+            $this->goodsList,
+            $this->comment,
+            $this->shipInfo,
+            $this->travelInfo,
+            $this->incomeInfo,
+            $this->bankInfo,
+            $this->extraInfo
+        );
+
+        self::printDebug('activate_reservation', $paramList);
+
+        $result = $this->xmlrpc_call('activate_reservation', $paramList);
+
+        if ($clear === true) {
+            $this->clear();
+        }
+
+        self::printDebug('activate_reservation result', $result);
+
+        return $result;
+    }
+
+
+    /**
+     * Splits a reservation due to for example outstanding articles.
+     *
+     * <b>For flags usage see</b>:<br>
+     * {@link Klarna::reserveAmount()}<br>
+     *
+     * @param string $rno    Reservation number.
+     * @param int    $amount The amount to be subtracted from the reservation.
+     * @param int    $flags  Options which affect the behaviour.
+     *
+     * @link http://integration.klarna.com/en/api/advanced-integration/functions
+     *       /splitreservation
+     *
+     * @throws KlarnaException
+     * @return string A new reservation number.
+     */
+    public function splitReservation(
+        $rno, $amount, $flags = KlarnaFlags::NO_FLAG
+    ) {
+        //Check so required information is set.
+        $this->_checkRNO($rno);
+        $this->_checkAmount($amount);
+
+        if ($amount <= 0) {
+            throw new Klarna_InvalidPriceException($amount);
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $rno, $amount, $this->_secret)
+        );
+        $paramList = array(
+            $rno,
+            $amount,
+            $this->orderid[0],
+            $this->orderid[1],
+            $flags,
+            $this->_eid,
+            $digestSecret
+        );
+
+        self::printDebug('split_reservation array', $paramList);
+
+        $result = $this->xmlrpc_call('split_reservation', $paramList);
+
+        self::printDebug('split_reservation result', $result);
+
+        return $result;
+    }
+
+    /**
+     * Reserves a specified number of OCR numbers.<br>
+     * For the specified country or the {@link Klarna::setCountry() set country}.<br>
+     *
+     * @param int $no      The number of OCR numbers to reserve.
+     * @param int $country {@link KlarnaCountry} constant.
+     *
+     * @link http://integration.klarna.com/en/api/advanced-integration/functions
+     *       /reserveocrnums
+     *
+     * @throws KlarnaException
+     * @return array An array of OCR numbers.
+     */
+    public function reserveOCR($no, $country = null)
+    {
+        $this->_checkNo($no);
+        if ($country === null) {
+            if (!$this->_country) {
+                throw new Klarna_MissingCountryException;
+            }
+            $country = $this->_country;
+        } else {
+            $this->_checkCountry($country);
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $no, $this->_secret)
+        );
+        $paramList = array(
+            $no,
+            $this->_eid,
+            $digestSecret,
+            $country
+        );
+
+        self::printDebug('reserve_ocr_nums array', $paramList);
+
+        return $this->xmlrpc_call('reserve_ocr_nums', $paramList);
+    }
+
+    /**
+     * Reserves the number of OCRs specified and sends them to the given email.
+     *
+     * @param int    $no      Number of OCR numbers to reserve.
+     * @param string $email   address.
+     * @param int    $country {@link KlarnaCountry} constant.
+     *
+     * @return bool True, if the OCRs were reserved and sent.
+     */
+    public function reserveOCRemail($no, $email, $country = null)
+    {
+        $this->_checkNo($no);
+        $this->_checkPNO($email, KlarnaEncoding::EMAIL);
+
+        if ($country === null) {
+            if (!$this->_country) {
+                throw new Klarna_MissingCountryException;
+            }
+            $country = $this->_country;
+        } else {
+            $this->_checkCountry($country);
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $no, $this->_secret)
+        );
+        $paramList = array(
+            $no,
+            $email,
+            $this->_eid,
+            $digestSecret,
+            $country
+        );
+
+        self::printDebug('reserve_ocr_nums_email array', $paramList);
+
+        $result = $this->xmlrpc_call('reserve_ocr_nums_email', $paramList);
+
+        return ($result == 'ok');
+    }
+
+    /**
+     * Checks if the specified SSN/PNO has an part payment account with Klarna.
+     *
+     * @param string $pno      Social security number, Personal number, ...
+     * @param int    $encoding {@link KlarnaEncoding PNO Encoding} constant.
+     *
+     * @link http://integration.klarna.com/en/api/standard-integration/functions
+     *       /hasaccount
+     *
+     * @throws KlarnaException
+     * @return bool    True, if customer has an account.
+     */
+    public function hasAccount($pno, $encoding = null)
+    {
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+
+        $this->_checkPNO($pno, $encoding);
+
+        $digest = self::digest(
+            $this->colon($this->_eid, $pno, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $pno,
+            $digest,
+            $encoding
+        );
+
+        self::printDebug('has_account', $paramList);
+
+        $result = $this->xmlrpc_call('has_account', $paramList);
+
+        return ($result === 'true');
+    }
+
+    /**
+     * Adds an article number and quantity to be used in
+     * {@link Klarna::activatePart()}, {@link Klarna::creditPart()}
+     * and {@link Klarna::invoicePartAmount()}.
+     *
+     * @param int    $qty   Quantity of specified article.
+     * @param string $artNo Article number.
+     *
+     * @link http://integration.klarna.com/en/api/invoice-handling-functions/
+     *       functions/mkartno
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function addArtNo($qty, $artNo)
+    {
+        $this->_checkQty($qty);
+        $this->_checkArtNo($artNo);
+
+        if (!is_array($this->artNos)) {
+            $this->artNos = array();
+        }
+
+        $this->artNos[] = array('artno' => $artNo, 'qty' => $qty);
+    }
+
+    /**
+     * Partially activates a passive invoice.
+     *
+     * Returned array contains index "url" and "invno".<br>
+     * The value of "url" is a URL pointing to a temporary PDF-version of the
+     * activated invoice.<br>
+     * The value of "invno" is either 0 if the entire invoice was activated or
+     * the number on the new passive invoice.<br>
+     *
+     * <b>Note</b>:<br>
+     * You need to call {@link Klarna::addArtNo()} first, to specify which
+     * articles and how many you want to partially activate.<br>
+     * If you want to change the shipment type, you can specify it using:
+     * {@link Klarna::setShipmentInfo() setShipmentInfo('delay_adjust', ...)}
+     * with either: {@link KlarnaFlags::NORMAL_SHIPMENT NORMAL_SHIPMENT}
+     * or {@link KlarnaFlags::EXPRESS_SHIPMENT EXPRESS_SHIPMENT}
+     *
+     * @param string $invNo  Invoice numbers.
+     * @param int    $pclass PClass id used for this invoice.
+     * @param bool   $clear  Whether customer info should be cleared after
+     *                       this call.
+     *
+     * @see Klarna::addArtNo()
+     * @see Klarna::activateInvoice()
+     * @link http://integration.klarna.com/en/api/standard-integration/functions
+     *       /activatepart
+     *
+     * @throws KlarnaException
+     * @return array An array with invoice URL and invoice number.
+     *         ['url' => val, 'invno' => val]
+     */
+    public function activatePart(
+        $invNo, $pclass = KlarnaPClass::INVOICE, $clear = true
+    ) {
+        $this->_checkInvNo($invNo);
+        $this->_checkArtNos($this->artNos);
+
+        self::printDebug('activate_part artNos array', $this->artNos);
+
+        //function activate_part_digest
+        $string = $this->_eid . ":" . $invNo . ":";
+        foreach ($this->artNos as $artNo) {
+            $string .= $artNo["artno"] . ":". $artNo["qty"] . ":";
+        }
+        $digestSecret = self::digest($string . $this->_secret);
+        //end activate_part_digest
+
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $this->artNos,
+            $digestSecret,
+            $pclass,
+            $this->shipInfo
+        );
+
+        self::printDebug('activate_part array', $paramList);
+
+        $result = $this->xmlrpc_call('activate_part', $paramList);
+
+        if ($clear === true) {
+            $this->clear();
+        }
+
+        self::printDebug('activate_part result', $result);
+
+        return $result;
+    }
+
+    /**
+     * Retrieves the total amount for an active invoice.
+     *
+     * @param string $invNo Invoice number.
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /invoiceamount
+     *
+     * @throws KlarnaException
+     * @return float The total amount.
+     */
+    public function invoiceAmount($invNo)
+    {
+        $this->_checkInvNo($invNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $digestSecret
+        );
+
+        self::printDebug('invoice_amount array', $paramList);
+
+        $result = $this->xmlrpc_call('invoice_amount', $paramList);
+
+        //Result is in cents, fix it.
+        return ($result / 100);
+    }
+
+    /**
+     * Changes the order number of a purchase that was set when the order was
+     * made online.
+     *
+     * @param string $invNo   Invoice number.
+     * @param string $orderid Estores order number.
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /updateorderno
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function updateOrderNo($invNo, $orderid)
+    {
+        $this->_checkInvNo($invNo);
+        $this->_checkEstoreOrderNo($orderid);
+
+        $digestSecret = self::digest(
+            $this->colon($invNo, $orderid, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $invNo,
+            $orderid
+        );
+
+        self::printDebug('update_orderno array', $paramList);
+
+        $result = $this->xmlrpc_call('update_orderno', $paramList);
+
+        return $result;
+    }
+
+    /**
+     * Sends an activated invoice to the customer via e-mail. <br>
+     * The email is sent in plain text format and contains a link to a
+     * PDF-invoice.<br>
+     *
+     * <b>Please note!</b><br>
+     * Regular postal service is used if the customer has not entered his/her
+     * e-mail address when making the purchase (charges may apply).<br>
+     *
+     * @param string $invNo Invoice number.
+     *
+     * @link http://integration.klarna.com/en/api/invoice-handling-functions
+     *       /functions/emailinvoice
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function emailInvoice($invNo)
+    {
+        $this->_checkInvNo($invNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $digestSecret
+        );
+
+        self::printDebug('email_invoice array', $paramList);
+
+        return $this->xmlrpc_call('email_invoice', $paramList);
+    }
+
+    /**
+     * Requests a postal send-out of an activated invoice to a customer by
+     * Klarna (charges may apply).
+     *
+     * @param string $invNo Invoice number.
+     *
+     * @link http://integration.klarna.com/en/api/invoice-handling-functions
+     *       /functions/sendinvoice
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function sendInvoice($invNo)
+    {
+        $this->_checkInvNo($invNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $digestSecret
+        );
+
+        self::printDebug('send_invoice array', $paramList);
+
+        return $this->xmlrpc_call('send_invoice', $paramList);
+    }
+
+    /**
+     * Gives discounts on invoices.<br>
+     * If you are using standard integration and the purchase is not yet
+     * activated (you have not yet delivered the goods), <br>
+     * just change the article list in our online interface Klarna Online.<br>
+     *
+     * <b>Flags can be</b>:<br>
+     * {@link KlarnaFlags::INC_VAT}<br>
+     * {@link KlarnaFlags::NO_FLAG}, <b>NOT RECOMMENDED!</b><br>
+     *
+     * @param string $invNo       Invoice number.
+     * @param int    $amount      The amount given as a discount.
+     * @param float  $vat         VAT in percent, e.g. 22.2 for 22.2%.
+     * @param int    $flags       If amount is
+     *                            {@link KlarnaFlags::INC_VAT including} or
+     *                            {@link KlarnaFlags::NO_FLAG excluding} VAT.
+     * @param string $description Optional custom text to present as discount
+     *                            in the invoice.
+     *
+     * @link http://integration.klarna.com/en/api/invoice-handling-functions
+     *       /functions/returnamount
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function returnAmount(
+        $invNo, $amount, $vat, $flags = KlarnaFlags::INC_VAT, $description = ""
+    ) {
+        $this->_checkInvNo($invNo);
+        $this->_checkAmount($amount);
+        $this->_checkVAT($vat);
+        $this->_checkInt($flags, 'flags');
+
+        if ($description == null) {
+            $description = "";
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $amount,
+            $vat,
+            $digestSecret,
+            $flags,
+            $description
+        );
+
+        self::printDebug('return_amount', $paramList);
+
+        return $this->xmlrpc_call('return_amount', $paramList);
+    }
+
+    /**
+     * Performs a complete refund on an invoice, part payment and mobile
+     * purchase.
+     *
+     * @param string $invNo  Invoice number.
+     * @param string $credNo Credit number.
+     *
+     * @link http://integration.klarna.com/en/api/invoice-handling-functions
+     *       /functions/creditinvoice
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function creditInvoice($invNo, $credNo = "")
+    {
+        $this->_checkInvNo($invNo);
+        $this->_checkCredNo($credNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $credNo,
+            $digestSecret
+        );
+
+        self::printDebug('credit_invoice', $paramList);
+
+        return $this->xmlrpc_call('credit_invoice', $paramList);
+    }
+
+    /**
+     * Performs a partial refund on an invoice, part payment or mobile purchase.
+     *
+     * <b>Note</b>:<br>
+     * You need to call {@link Klarna::addArtNo()} first.<br>
+     *
+     * @param string $invNo  Invoice number.
+     * @param string $credNo Credit number.
+     *
+     * @see  Klarna::addArtNo()
+     * @link http://integration.klarna.com/en/api/invoice-handling-functions
+     *       /functions/creditpart
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function creditPart($invNo, $credNo = "")
+    {
+        $this->_checkInvNo($invNo);
+        $this->_checkCredNo($credNo);
+        $this->_checkArtNos($this->artNos);
+
+        //function activate_part_digest
+        $string = $this->_eid . ":" . $invNo . ":";
+        foreach ($this->artNos as $artNo) {
+            $string .= $artNo["artno"] . ":". $artNo["qty"] . ":";
+        }
+        $digestSecret = self::digest($string . $this->_secret);
+        //end activate_part_digest
+
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $this->artNos,
+            $credNo,
+            $digestSecret
+        );
+
+        $this->artNos = array();
+
+        self::printDebug('credit_part', $paramList);
+
+        return $this->xmlrpc_call('credit_part', $paramList);
+    }
+
+    /**
+     * Changes the quantity of a specific item in a passive invoice.
+     *
+     * @param string $invNo Invoice number.
+     * @param string $artNo Article number.
+     * @param int    $qty   Quantity of specified article.
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /updategoodsqty
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function updateGoodsQty($invNo, $artNo, $qty)
+    {
+        $this->_checkInvNo($invNo);
+        $this->_checkQty($qty);
+        $this->_checkArtNo($artNo);
+
+        $digestSecret = self::digest(
+            $this->colon($invNo, $artNo, $qty, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $invNo,
+            $artNo,
+            $qty
+        );
+
+        self::printDebug('update_goods_qty', $paramList);
+
+        return $this->xmlrpc_call('update_goods_qty', $paramList);
+    }
+
+    /**
+     * Changes the amount of a fee (e.g. the invoice fee) in a passive invoice.
+     *
+     * <b>Type can be</b>:<br>
+     * {@link KlarnaFlags::IS_SHIPMENT}<br>
+     * {@link KlarnaFlags::IS_HANDLING}<br>
+     *
+     * @param string $invNo     Invoice number.
+     * @param int    $type      Charge type.
+     * @param int    $newAmount The new amount for the charge.
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /updatechargeamount
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function updateChargeAmount($invNo, $type, $newAmount)
+    {
+        $this->_checkInvNo($invNo);
+        $this->_checkInt($type, 'type');
+        $this->_checkAmount($newAmount);
+
+        if ($type === KlarnaFlags::IS_SHIPMENT) {
+            $type = 1;
+        } else if ($type === KlarnaFlags::IS_HANDLING) {
+            $type = 2;
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($invNo, $type, $newAmount, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $invNo,
+            $type,
+            $newAmount
+        );
+
+        self::printDebug('update_charge_amount', $paramList);
+
+        return $this->xmlrpc_call('update_charge_amount', $paramList);
+    }
+
+    /**
+     * The invoice_address function is used to retrieve the address of a
+     * purchase.
+     *
+     * @param string $invNo Invoice number.
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /invoiceaddress
+     *
+     * @throws KlarnaException
+     * @return KlarnaAddr
+     */
+    public function invoiceAddress($invNo)
+    {
+        $this->_checkInvNo($invNo);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $invNo, $this->_secret)
+        );
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $digestSecret
+        );
+
+        self::printDebug('invoice_address', $paramList);
+
+        $result = $this->xmlrpc_call('invoice_address', $paramList);
+
+        $addr = new KlarnaAddr();
+        if (strlen($result[0]) > 0) {
+            $addr->isCompany = false;
+            $addr->setFirstName($result[0]);
+            $addr->setLastName($result[1]);
+        } else {
+            $addr->isCompany = true;
+            $addr->setCompanyName($result[1]);
+        }
+        $addr->setStreet($result[2]);
+        $addr->setZipCode($result[3]);
+        $addr->setCity($result[4]);
+        $addr->setCountry($result[5]);
+
+        return $addr;
+    }
+
+    /**
+     * Retrieves the amount of a specific goods from a purchase.
+     *
+     * <b>Note</b>:<br>
+     * You need to call {@link Klarna::addArtNo()} first.<br>
+     *
+     * @param string $invNo Invoice number.
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /invoicepartamount
+     * @see  Klarna::addArtNo()
+     *
+     * @throws KlarnaException
+     * @return float The amount of the goods.
+     */
+    public function invoicePartAmount($invNo)
+    {
+        $this->_checkInvNo($invNo);
+        $this->_checkArtNos($this->artNos);
+
+        //function activate_part_digest
+        $string = $this->_eid . ":" . $invNo . ":";
+        foreach ($this->artNos as $artNo) {
+            $string .= $artNo["artno"] . ":". $artNo["qty"] . ":";
+        }
+        $digestSecret = self::digest($string . $this->_secret);
+        //end activate_part_digest
+
+        $paramList = array(
+            $this->_eid,
+            $invNo,
+            $this->artNos,
+            $digestSecret
+        );
+        $this->artNos = array();
+
+        self::printDebug('invoice_part_amount', $paramList);
+
+        $result = $this->xmlrpc_call('invoice_part_amount', $paramList);
+
+        return ($result / 100);
+    }
+
+    /**
+     * Returns the current order status for a specific reservation or invoice.
+     * Use this when {@link Klarna::addTransaction()} or
+     * {@link Klarna::reserveAmount()} returns a {@link KlarnaFlags::PENDING}
+     * status.
+     *
+     * <b>Order status can be</b>:<br>
+     * {@link KlarnaFlags::ACCEPTED}<br>
+     * {@link KlarnaFlags::PENDING}<br>
+     * {@link KlarnaFlags::DENIED}<br>
+     *
+     * @param string $id   Reservation number or invoice number.
+     * @param int    $type 0 if $id is an invoice or reservation, 1 for order id
+     *
+     * @link http://integration.klarna.com/en/api/other-functions/functions
+     *       /checkorderstatus
+     *
+     * @throws KlarnaException
+     * @return string  The order status.
+     */
+    public function checkOrderStatus($id, $type = 0)
+    {
+        $this->_checkArgument($id, "id");
+
+        $this->_checkInt($type, 'type');
+        if ($type !== 0 && $type !== 1) {
+            throw new Klarna_InvalidTypeException(
+                'type', "0 or 1"
+            );
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $id, $this->_secret)
+        );
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $id,
+            $type
+        );
+
+        self::printDebug('check_order_status', $paramList);
+
+        return $this->xmlrpc_call('check_order_status', $paramList);
+    }
+
+    /**
+     * Retrieves a list of all the customer numbers associated with the
+     * specified pno.
+     *
+     * @param string $pno      Social security number, Personal number, ...
+     * @param int    $encoding {@link KlarnaEncoding PNO Encoding} constant.
+     *
+     * @throws KlarnaException
+     * @return array An array containing all customer numbers associated
+     *               with that pno.
+     */
+    public function getCustomerNo($pno, $encoding = null)
+    {
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+        $this->_checkPNO($pno, $encoding);
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $pno, $this->_secret)
+        );
+        $paramList = array(
+            $pno,
+            $this->_eid,
+            $digestSecret,
+            $encoding
+        );
+
+        self::printDebug('get_customer_no', $paramList);
+
+        return $this->xmlrpc_call('get_customer_no', $paramList);
+    }
+
+    /**
+     * Associates a pno with a customer number when you want to make future
+     * purchases without a pno.
+     *
+     * @param string $pno      Social security number, Personal number, ...
+     * @param string $custNo   The customer number.
+     * @param int    $encoding {@link KlarnaEncoding PNO Encoding} constant.
+     *
+     * @throws KlarnaException
+     * @return bool  True, if the customer number was associated with the pno.
+     */
+    public function setCustomerNo($pno, $custNo, $encoding = null)
+    {
+        //Get the PNO/SSN encoding constant.
+        if ($encoding === null) {
+            $encoding = $this->getPNOEncoding();
+        }
+        $this->_checkPNO($pno, $encoding);
+
+        $this->_checkArgument($custNo, 'custNo');
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $pno, $custNo, $this->_secret)
+        );
+        $paramList = array(
+            $pno,
+            $custNo,
+            $this->_eid,
+            $digestSecret,
+            $encoding
+        );
+
+        self::printDebug('set_customer_no', $paramList);
+
+        $result = $this->xmlrpc_call('set_customer_no', $paramList);
+
+        return ($result == 'ok');
+    }
+
+    /**
+     * Removes a customer number from association with a pno.
+     *
+     * @param string $custNo The customer number.
+     *
+     * @throws KlarnaException
+     * @return bool    True, if the customer number association was removed.
+     */
+    public function removeCustomerNo($custNo)
+    {
+        $this->_checkArgument($custNo, 'custNo');
+
+        $digestSecret = self::digest(
+            $this->colon($this->_eid, $custNo, $this->_secret)
+        );
+
+        $paramList = array(
+            $custNo,
+            $this->_eid,
+            $digestSecret
+        );
+
+        self::printDebug('remove_customer_no', $paramList);
+
+        $result = $this->xmlrpc_call('remove_customer_no', $paramList);
+
+        return ($result == 'ok');
+    }
+
+    /**
+     * Sets notes/log information for the specified invoice  number.
+     *
+     * @param string $invNo Invoice number.
+     * @param string $notes Note(s) to be associated with the invoice.
+     *
+     * @throws KlarnaException
+     * @return string  Invoice number.
+     */
+    public function updateNotes($invNo, $notes)
+    {
+        $this->_checkInvNo($invNo);
+
+        if (!is_string($notes)) {
+            $notes = strval($notes);
+        }
+
+        $digestSecret = self::digest(
+            $this->colon($invNo, $notes, $this->_secret)
+        );
+
+        $paramList = array(
+            $this->_eid,
+            $digestSecret,
+            $invNo,
+            $notes
+        );
+
+        self::printDebug('update_notes', $paramList);
+
+        return $this->xmlrpc_call('update_notes', $paramList);
+    }
+
+    /**
+     * Returns the configured PCStorage object.
+     *
+     * @throws Exception|KlarnaException
+     * @return PCStorage
+     */
+    public function getPCStorage()
+    {
+        if (isset($this->pclasses)) {
+            return $this->pclasses;
+        }
+
+        include_once 'pclasses/storage.intf.php';
+        $className = $this->pcStorage.'storage';
+        $pclassStorage = dirname(__FILE__) . "/pclasses/{$className}.class.php";
+
+        include_once $pclassStorage;
+        $storage = new $className;
+
+        if (!($storage instanceof PCStorage)) {
+            throw new Klarna_PCStorageInvalidException(
+                $className, $pclassStorage
+            );
+        }
+        return $storage;
+    }
+
+    /**
+     * Fetch pclasses
+     *
+     * @param PCStorage $storage  PClass Storage
+     * @param int       $country  KlarnaCountry constant
+     * @param int       $language KlarnaLanguage constant
+     * @param int       $currency KlarnaCurrency constant
+     *
+     * @return void
+     */
+    private function _fetchPClasses($storage, $country, $language, $currency)
+    {
+        $digestSecret = self::digest(
+            $this->_eid . ":" . $currency . ":" . $this->_secret
+        );
+        $paramList = array(
+            $this->_eid,
+            $currency,
+            $digestSecret,
+            $country,
+            $language
+        );
+
+        self::printDebug('get_pclasses array', $paramList);
+
+        $result = $this->xmlrpc_call('get_pclasses', $paramList);
+
+        self::printDebug('get_pclasses result', $result);
+
+        foreach ($result as &$pclass) {
+            //numeric htmlentities
+            $pclass[1] = Klarna::num_htmlentities($pclass[1]);
+
+            //Below values are in "cents", fix them.
+            $pclass[3] /= 100; //divide start fee with 100
+            $pclass[4] /= 100; //divide invoice fee with 100
+            $pclass[5] /= 100; //divide interest rate with 100
+            $pclass[6] /= 100; //divide min amount with 100
+
+            if ($pclass[9] != '-') {
+                //unix timestamp instead of yyyy-mm-dd
+                $pclass[9] = strtotime($pclass[9]);
+            }
+
+            //Associate the PClass with this estore.
+            array_unshift($pclass, $this->_eid);
+
+            $storage->addPClass(new KlarnaPClass($pclass));
+        }
+    }
+
+    /**
+     * Fetches the PClasses from Klarna Online.<br>
+     * Removes the cached/stored pclasses and updates.<br>
+     * You are only allowed to call this once, or once per update of PClasses
+     * in KO.<br>
+     *
+     * <b>Note</b>:<br>
+     * If language and/or currency is null, then they will be set to mirror
+     * the specified country.<br/>
+     * Short codes like DE, SV or EUR can also be used instead of the constants.
+     *
+     * @param string|int $country  {@link KlarnaCountry Country} constant,
+     *                             or two letter code.
+     * @param mixed      $language {@link KlarnaLanguage Language} constant,
+     *                             or two letter code.
+     * @param mixed      $currency {@link KlarnaCurrency Currency} constant,
+     *                             or three letter code.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function fetchPClasses(
+        $country = null, $language = null, $currency = null
+    ) {
+        extract(
+            $this->getLocale($country, $language, $currency),
+            EXTR_OVERWRITE
+        );
+
+        if (!($this->config instanceof ArrayAccess)) {
+            throw new Klarna_IncompleteConfigurationException;
+        }
+
+        $pclasses = $this->getPCStorage();
+        try {
+            //Attempt to load previously stored pclasses, so they aren't
+            // accidentially removed.
+            $pclasses->load($this->pcURI);
+        }
+        catch(Exception $e) {
+            self::printDebug('load pclasses', $e->getMessage());
+        }
+
+        $this->_fetchPClasses($pclasses, $country, $language, $currency);
+
+        $pclasses->save($this->pcURI);
+        $this->pclasses = $pclasses;
+    }
+
+    /**
+     * Removes the stored PClasses, if you need to update them.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function clearPClasses()
+    {
+        if ($this->config instanceof ArrayAccess) {
+            $pclasses = $this->getPCStorage();
+            $pclasses->clear($this->pcURI);
+        } else {
+            throw new Klarna_IncompleteConfigurationException;
+        }
+    }
+
+    /**
+     * Retrieves the specified PClasses.
+     *
+     * <b>Type can be</b>:<br>
+     * {@link KlarnaPClass::CAMPAIGN}<br>
+     * {@link KlarnaPClass::ACCOUNT}<br>
+     * {@link KlarnaPClass::SPECIAL}<br>
+     * {@link KlarnaPClass::FIXED}<br>
+     * {@link KlarnaPClass::DELAY}<br>
+     * {@link KlarnaPClass::MOBILE}<br>
+     *
+     * @param int $type PClass type identifier.
+     *
+     * @throws KlarnaException
+     * @return array An array of PClasses. [KlarnaPClass]
+     */
+    public function getPClasses($type = null)
+    {
+        if (!($this->config instanceof ArrayAccess)) {
+            throw new Klarna_IncompleteConfigurationException;
+        }
+        if (!$this->pclasses) {
+            $this->pclasses = $this->getPCStorage();
+            $this->pclasses->load($this->pcURI);
+        }
+        $tmp = $this->pclasses->getPClasses(
+            $this->_eid, $this->_country, $type
+        );
+        $this->sortPClasses($tmp[$this->_eid]);
+        return $tmp[$this->_eid];
+    }
+
+    /**
+     * Retrieve a flattened array of all pclasses stored in the configured
+     * pclass storage.
+     *
+     * @return array
+     */
+    public function getAllPClasses()
+    {
+        if (!$this->pclasses) {
+            $this->pclasses = $this->getPCStorage();
+            $this->pclasses->load($this->pcURI);
+        }
+        return $this->pclasses->getAllPClasses();
+    }
+
+    /**
+     * Returns the specified PClass.
+     *
+     * @param int $id The PClass ID.
+     *
+     * @return KlarnaPClass
+     */
+    public function getPClass($id)
+    {
+        if (!is_numeric($id)) {
+            throw new Klarna_InvalidTypeException('id', 'integer');
+        }
+
+        if (!($this->config instanceof ArrayAccess)) {
+            throw new Klarna_IncompleteConfigurationException;
+        }
+
+        if (!$this->pclasses || !($this->pclasses instanceof PCStorage)) {
+            $this->pclasses = $this->getPCStorage();
+            $this->pclasses->load($this->pcURI);
+        }
+        return $this->pclasses->getPClass(
+            intval($id), $this->_eid, $this->_country
+        );
+    }
+
+    /**
+     * Sorts the specified array of KlarnaPClasses.
+     *
+     * @param array &$array An array of {@link KlarnaPClass PClasses}.
+     *
+     * @return void
+     */
+    public function sortPClasses(&$array)
+    {
+        if (!is_array($array)) {
+            //Input is not an array!
+            $array = array();
+            return;
+        }
+        //Sort pclasses array after natural sort (natcmp)
+        if (!function_exists('pcCmp')) {
+            /**
+             * Comparison function
+             *
+             * @param KlarnaPClass $a object 1
+             * @param KlarnaPClass $b object 2
+             *
+             * @return int
+             */
+            function pcCmp($a, $b)
+            {
+                if ($a->getDescription() == null
+                    && $b->getDescription() == null
+                ) {
+                    return 0;
+                } else if ($a->getDescription() == null) {
+                    return 1;
+                } else if ($b->getDescription() == null) {
+                    return -1;
+                } else if ($b->getType() === 2 && $a->getType() !== 2) {
+                    return 1;
+                } else if ($b->getType() !== 2 && $a->getType() === 2) {
+                    return -1;
+                }
+
+                return strnatcmp($a->getDescription(), $b->getDescription())*-1;
+            }
+        }
+        usort($array, "pcCmp");
+    }
+
+    /**
+     * Returns the cheapest, per month, PClass related to the specified sum.
+     *
+     * <b>Note</b>: This choose the cheapest PClass for the current country.<br>
+     * {@link Klarna::setCountry()}
+     *
+     * <b>Flags can be</b>:<br>
+     * {@link KlarnaFlags::CHECKOUT_PAGE}<br>
+     * {@link KlarnaFlags::PRODUCT_PAGE}<br>
+     *
+     * @param float $sum   The product cost, or total sum of the cart.
+     * @param int   $flags Which type of page the info will be displayed on.
+     *
+     * @throws KlarnaException
+     * @return KlarnaPClass or false if none was found.
+     */
+    public function getCheapestPClass($sum, $flags)
+    {
+        if (!is_numeric($sum)) {
+            throw new Klarna_InvalidPriceException($sum);
+        }
+
+        if (!is_numeric($flags)
+            || !in_array(
+                $flags, array(
+                    KlarnaFlags::CHECKOUT_PAGE, KlarnaFlags::PRODUCT_PAGE)
+            )
+        ) {
+            throw new Klarna_InvalidTypeException(
+                'flags',
+                KlarnaFlags::CHECKOUT_PAGE . ' or ' . KlarnaFlags::PRODUCT_PAGE
+            );
+        }
+
+        $lowest_pp = $lowest = false;
+
+        foreach ($this->getPClasses() as $pclass) {
+            $lowest_payment = KlarnaCalc::get_lowest_payment_for_account(
+                $pclass->getCountry()
+            );
+            if ($pclass->getType() < 2 && $sum >= $pclass->getMinAmount()) {
+                $minpay = KlarnaCalc::calc_monthly_cost(
+                    $sum, $pclass, $flags
+                );
+
+                if ($minpay < $lowest_pp || $lowest_pp === false) {
+                    if ($pclass->getType() == KlarnaPClass::ACCOUNT
+                        || $minpay >= $lowest_payment
+                    ) {
+                        $lowest_pp = $minpay;
+                        $lowest = $pclass;
+                    }
+                }
+            }
+        }
+
+        return $lowest;
+    }
+
+    /**
+     * Initializes the checkoutHTML objects.
+     *
+     * @see Klarna::checkoutHTML()
+     * @return void
+     */
+    protected function initCheckout()
+    {
+        $dir = dirname(__FILE__);
+
+        //Require the CheckoutHTML interface/abstract class
+        include_once $dir.'/checkout/checkouthtml.intf.php';
+
+        //Iterate over all .class.php files in checkout/
+        foreach (glob($dir.'/checkout/*.class.php') as $checkout) {
+            if (!self::$debug) {
+                ob_start();
+            }
+            include_once $checkout;
+
+            $className = basename($checkout, '.class.php');
+            $cObj = new $className;
+
+            if ($cObj instanceof CheckoutHTML) {
+                $cObj->init($this, $this->_eid);
+                $this->coObjects[$className] = $cObj;
+            }
+
+            if (!self::$debug) {
+                ob_end_clean();
+            }
+        }
+    }
+
+    /**
+     * Returns the checkout page HTML from the checkout classes.
+     *
+     * <b>Note</b>:<br>
+     * This method uses output buffering to silence unwanted echoes.<br>
+     *
+     * @see CheckoutHTML
+     *
+     * @return string  A HTML string.
+     */
+    public function checkoutHTML()
+    {
+        if (empty($this->coObjects)) {
+            $this->initCheckout();
+        }
+        $dir = dirname(__FILE__);
+
+        //Require the CheckoutHTML interface/abstract class
+        include_once $dir.'/checkout/checkouthtml.intf.php';
+
+        //Iterate over all .class.php files in
+        $html = "\n";
+        foreach ($this->coObjects as $cObj) {
+            if (!self::$debug) {
+                ob_start();
+            }
+            if ($cObj instanceof CheckoutHTML) {
+                $html .= $cObj->toHTML() . "\n";
+            }
+            if (!self::$debug) {
+                ob_end_clean();
+            }
+        }
+
+        return $html;
+    }
+
+    /**
+     * Creates a XMLRPC call with specified XMLRPC method and parameters from array.
+     *
+     * @param string $method XMLRPC method.
+     * @param array  $array  XMLRPC parameters.
+     *
+     * @throws KlarnaException
+     * @return mixed
+     */
+    protected function xmlrpc_call($method, $array)
+    {
+        if (!($this->xmlrpc instanceof xmlrpc_client)) {
+            throw new Klarna_IncompleteConfigurationException;
+        }
+        if (!isset($method) || !is_string($method)) {
+            throw new Klarna_InvalidTypeException('method', 'string');
+        }
+        if ($array === null || count($array) === 0) {
+            throw new KlarnaException("Parameterlist is empty or null!", 50067);
+        }
+        if (self::$disableXMLRPC) {
+            return true;
+        }
+        try {
+            /*
+             * Disable verifypeer for CURL, so below error is avoided.
+             * CURL error: SSL certificate problem, verify that the CA
+             * cert is OK.
+             * Details: error:14090086:SSL
+             * routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (#8)
+             */
+            $this->xmlrpc->verifypeer = false;
+
+            $timestart = microtime(true);
+
+            //Create the XMLRPC message.
+            $msg = new xmlrpcmsg($method);
+            $params = array_merge(
+                array(
+                    $this->PROTO, $this->VERSION
+                ), $array
+            );
+
+            $msg = new xmlrpcmsg($method);
+            foreach ($params as $p) {
+                if (!$msg->addParam(
+                    php_xmlrpc_encode($p, array('extension_api'))
+                )
+                ) {
+                    throw new KlarnaException(
+                        "Failed to add parameters to XMLRPC message.",
+                        50068
+                    );
+                }
+            }
+
+            //Send the message.
+            $selectDateTime = microtime(true);
+            if (self::$xmlrpcDebug) {
+                $this->xmlrpc->setDebug(2);
+            }
+            $xmlrpcresp = $this->xmlrpc->send($msg);
+
+            //Calculate time and selectTime.
+            $timeend = microtime(true);
+            $time = (int) (($selectDateTime - $timestart) * 1000);
+            $selectTime = (int) (($timeend - $timestart) * 1000);
+
+            $status = $xmlrpcresp->faultCode();
+
+            //Send report to candice.
+            if (self::$_candice === true) {
+                $this->sendStat($method, $time, $selectTime, $status);
+            }
+
+            if ($status !== 0) {
+                throw new KlarnaException($xmlrpcresp->faultString(), $status);
+            }
+
+            return php_xmlrpc_decode($xmlrpcresp->value());
+        }
+        catch(KlarnaException $e) {
+            //Otherwise it is caught below, and rethrown.
+            throw $e;
+        }
+        catch(Exception $e) {
+            throw new KlarnaException($e->getMessage(), $e->getCode());
+        }
+    }
+
+    /**
+     * Removes all relevant order/customer data from the internal structure.
+     *
+     * @return void
+     */
+    public function clear()
+    {
+        $this->goodsList = null;
+        $this->comment = "";
+
+        $this->billing = null;
+        $this->shipping = null;
+
+        $this->shipInfo = array();
+        $this->extraInfo = array();
+        $this->bankInfo = array();
+        $this->incomeInfo = array();
+        $this->activateInfo = array();
+
+        $this->reference = "";
+        $this->reference_code = "";
+
+        $this->orderid[0] = "";
+        $this->orderid[1] = "";
+
+        $this->artNos = array();
+        $this->coObjects = array();
+    }
+
+    /**
+     * Sends a report to Candice.
+     *
+     * @param string $method     XMLRPC method.
+     * @param int    $time       Elapsed time of entire XMLRPC call.
+     * @param int    $selectTime Time to create the XMLRPC parameters.
+     * @param int    $status     XMLRPC error code.
+     *
+     * @return void
+     */
+    protected function sendStat($method, $time, $selectTime, $status)
+    {
+        $fp = @fsockopen('udp://'.self::$_c_addr, 80, $errno, $errstr, 1500);
+        if ($fp) {
+            $url = (($this->ssl) ? 'https://' : 'http://').$this->addr;
+            $data = $this->pipe(
+                $this->_eid,
+                $method,
+                $time,
+                $selectTime,
+                $status,
+                $url.':'.$this->port
+            );
+            $digest = self::digest($this->pipe($data, $this->_secret));
+
+            self::printDebug("candice report", $data);
+
+            @fwrite($fp, $this->pipe($data, $digest));
+            @fclose($fp);
+        }
+    }
+
+    /**
+     * Implodes parameters with delimiter ':'.
+     * Null and "" values are ignored by the colon function to
+     * ensure there is not several colons in succession.
+     *
+     * @return string Colon separated string.
+     */
+    public static function colon(/* variable parameters */)
+    {
+        $args = func_get_args();
+        return implode(':', array_filter($args));
+    }
+
+    /**
+     * Implodes parameters with delimiter '|'.
+     *
+     * @return string Pipe separated string.
+     */
+    public static function pipe(/* variable parameters */)
+    {
+        $args = func_get_args();
+        return implode('|', $args);
+    }
+
+    /**
+     * Creates a digest hash from the inputted string,
+     * and the specified or the preferred hash algorithm.
+     *
+     * @param string $data Data to be hashed.
+     * @param string $hash hash algoritm to use
+     *
+     * @throws KlarnaException
+     * @return string  Base64 encoded hash.
+     */
+    public static function digest($data, $hash = null)
+    {
+        if ($hash===null) {
+            $preferred = array(
+                'sha512',
+                'sha384',
+                'sha256',
+                'sha224',
+                'md5'
+            );
+
+            $hashes = array_intersect($preferred, hash_algos());
+
+            if (count($hashes) == 0) {
+                throw new KlarnaException(
+                    "No available hash algorithm supported!"
+                );
+            }
+            $hash = array_shift($hashes);
+        }
+        self::printDebug('digest() using hash', $hash);
+
+        return base64_encode(pack("H*", hash($hash, $data)));
+    }
+
+    /**
+     * Converts special characters to numeric htmlentities.
+     *
+     * <b>Note</b>:<br>
+     * If supplied string is encoded with UTF-8, o umlaut ("Ã¶") will become two
+     * HTML entities instead of one.
+     *
+     * @param string $str String to be converted.
+     *
+     * @return string String converted to numeric HTML entities.
+     */
+    public static function num_htmlentities($str)
+    {
+        if (!self::$htmlentities) {
+            self::$htmlentities = array();
+            $table = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
+            foreach ($table as $char => $entity) {
+                self::$htmlentities[$entity] = '&#' . ord($char) . ';';
+            }
+        }
+
+        return str_replace(
+            array_keys(
+                self::$htmlentities
+            ), self::$htmlentities, htmlentities($str)
+        );
+    }
+
+    /**
+     * Prints debug information if debug is set to true.
+     * $msg is used as header/footer in the output.
+     *
+     * if FirePHP is available it will be used instead of
+     * dumping the debug info into the document.
+     *
+     * It uses print_r and encapsulates it in HTML/XML comments.
+     * (<!-- -->)
+     *
+     * @param string $msg   Debug identifier, e.g. "my array".
+     * @param mixed  $mixed Object, type, etc, to be debugged.
+     *
+     * @return void
+     */
+    public static function printDebug($msg, $mixed)
+    {
+        if (self::$debug) {
+            if (class_exists('FB', false)) {
+                FB::send($mixed, $msg);
+            } else {
+                echo "\n<!-- ".$msg.": \n";
+                print_r($mixed);
+                echo "\n end ".$msg." -->\n";
+            }
+        }
+    }
+
+    /**
+     * Checks/fixes so the invNo input is valid.
+     *
+     * @param string &$invNo Invoice number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkInvNo(&$invNo)
+    {
+        if (!isset($invNo)) {
+            throw new Klarna_ArgumentNotSetException("Invoice number");
+        }
+        if (!is_string($invNo)) {
+            $invNo = strval($invNo);
+        }
+        if (strlen($invNo) == 0) {
+            throw new Klarna_ArgumentNotSetException("Invoice number");
+        }
+    }
+
+    /**
+     * Checks/fixes so the quantity input is valid.
+     *
+     * @param int &$qty Quantity.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkQty(&$qty)
+    {
+        if (!isset($qty)) {
+            throw new Klarna_ArgumentNotSetException("Quantity");
+        }
+        if (is_numeric($qty) && !is_int($qty)) {
+            $qty = intval($qty);
+        }
+        if (!is_int($qty)) {
+            throw new Klarna_InvalidTypeException("Quantity", "integer");
+        }
+    }
+
+    /**
+     * Checks/fixes so the artTitle input is valid.
+     *
+     * @param string &$artTitle Article title.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkArtTitle(&$artTitle)
+    {
+        if (!is_string($artTitle)) {
+            $artTitle = strval($artTitle);
+        }
+        if (!isset($artTitle) || strlen($artTitle) == 0) {
+            throw new Klarna_ArgumentNotSetException("artTitle", 50059);
+        }
+    }
+
+    /**
+     * Checks/fixes so the artNo input is valid.
+     *
+     * @param int|string &$artNo Article number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkArtNo(&$artNo)
+    {
+        if (is_numeric($artNo) && !is_string($artNo)) {
+            //Convert artNo to string if integer.
+            $artNo = strval($artNo);
+        }
+        if (!isset($artNo) || strlen($artNo) == 0 || (!is_string($artNo))) {
+            throw new Klarna_ArgumentNotSetException("artNo");
+        }
+    }
+
+    /**
+     * Checks/fixes so the credNo input is valid.
+     *
+     * @param string &$credNo Credit number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkCredNo(&$credNo)
+    {
+        if (!isset($credNo)) {
+            throw new Klarna_ArgumentNotSetException("Credit number");
+        }
+
+        if ($credNo === false || $credNo === null) {
+            $credNo = "";
+        }
+        if (!is_string($credNo)) {
+            $credNo = strval($credNo);
+            if (!is_string($credNo)) {
+                throw new Klarna_InvalidTypeException("Credit number", "string");
+            }
+        }
+    }
+
+    /**
+     * Checks so that artNos is an array and is not empty.
+     *
+     * @param array &$artNos Array from {@link Klarna::addArtNo()}.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkArtNos(&$artNos)
+    {
+        if (!is_array($artNos)) {
+            throw new Klarna_InvalidTypeException("artNos", "array");
+        }
+        if (empty($artNos)) {
+            throw new KlarnaException('ArtNo array is empty!', 50064);
+        }
+    }
+
+    /**
+     * Checks/fixes so the integer input is valid.
+     *
+     * @param int    &$int  {@link KlarnaFlags flags} constant.
+     * @param string $field Name of the field.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkInt(&$int, $field)
+    {
+        if (!isset($int)) {
+            throw new Klarna_ArgumentNotSetException($field);
+        }
+        if (is_numeric($int) && !is_int($int)) {
+            $int = intval($int);
+        }
+        if (!is_numeric($int) || !is_int($int)) {
+            throw new Klarna_InvalidTypeException($field, "integer");
+        }
+    }
+
+    /**
+     * Checks/fixes so the VAT input is valid.
+     *
+     * @param float &$vat VAT.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkVAT(&$vat)
+    {
+        if (!isset($vat)) {
+            throw new Klarna_ArgumentNotSetException("VAT");
+        }
+        if (is_numeric($vat) && (!is_int($vat) || !is_float($vat))) {
+            $vat = floatval($vat);
+        }
+        if (!is_numeric($vat) || (!is_int($vat) && !is_float($vat))) {
+            throw new Klarna_InvalidTypeException("VAT", "integer or float");
+        }
+    }
+
+    /**
+     * Checks/fixes so the amount input is valid.
+     *
+     * @param int &$amount Amount.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkAmount(&$amount)
+    {
+        if (!isset($amount)) {
+            throw new Klarna_ArgumentNotSetException("Amount");
+        }
+        if (is_numeric($amount)) {
+            $this->_fixValue($amount);
+        }
+        if (is_numeric($amount) && !is_int($amount)) {
+            $amount = intval($amount);
+        }
+        if (!is_numeric($amount) || !is_int($amount)) {
+            throw new Klarna_InvalidTypeException("amount", "integer");
+        }
+    }
+
+    /**
+     * Checks/fixes so the price input is valid.
+     *
+     * @param int &$price Price.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkPrice(&$price)
+    {
+        if (!isset($price)) {
+            throw new Klarna_ArgumentNotSetException("Price");
+        }
+        if (is_numeric($price)) {
+            $this->_fixValue($price);
+        }
+        if (is_numeric($price) && !is_int($price)) {
+            $price = intval($price);
+        }
+        if (!is_numeric($price) || !is_int($price)) {
+            throw new Klarna_InvalidTypeException("Price", "integer");
+        }
+    }
+
+    /**
+     * Multiplies value with 100 and rounds it.
+     * This fixes value/price/amount inputs so that KO can handle them.
+     *
+     * @param float &$value value
+     *
+     * @return void
+     */
+    private function _fixValue(&$value)
+    {
+        $value = round($value * 100);
+    }
+
+    /**
+     * Checks/fixes so the discount input is valid.
+     *
+     * @param float &$discount Discount amount.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkDiscount(&$discount)
+    {
+        if (!isset($discount)) {
+            throw new Klarna_ArgumentNotSetException("Discount");
+        }
+        if (is_numeric($discount)
+            && (!is_int($discount) || !is_float($discount))
+        ) {
+            $discount = floatval($discount);
+        }
+
+        if (!is_numeric($discount)
+            || (!is_int($discount) && !is_float($discount))
+        ) {
+            throw new Klarna_InvalidTypeException("Discount", "integer or float");
+        }
+    }
+
+    /**
+     * Checks/fixes so that the estoreOrderNo input is valid.
+     *
+     * @param string &$estoreOrderNo Estores order number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkEstoreOrderNo(&$estoreOrderNo)
+    {
+        if (!isset($estoreOrderNo)) {
+            throw new Klarna_ArgumentNotSetException("Order number");
+        }
+
+        if (!is_string($estoreOrderNo)) {
+            $estoreOrderNo = strval($estoreOrderNo);
+            if (!is_string($estoreOrderNo)) {
+                throw new Klarna_InvalidTypeException("Order number", "string");
+            }
+        }
+    }
+
+    /**
+     * Checks/fixes to the PNO/SSN input is valid.
+     *
+     * @param string &$pno Personal number, social security  number, ...
+     * @param int    $enc  {@link KlarnaEncoding PNO Encoding} constant.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkPNO(&$pno, $enc)
+    {
+        if (!$pno) {
+            throw new Klarna_ArgumentNotSetException("PNO/SSN");
+        }
+
+        if (!KlarnaEncoding::checkPNO($pno)) {
+            throw new Klarna_InvalidPNOException;
+        }
+    }
+
+    /**
+     * Checks/fixes to the country input is valid.
+     *
+     * @param int &$country {@link KlarnaCountry Country} constant.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkCountry(&$country)
+    {
+        if (!isset($country)) {
+            throw new Klarna_ArgumentNotSetException("Country");
+        }
+        if (is_numeric($country) && !is_int($country)) {
+            $country = intval($country);
+        }
+        if (!is_numeric($country) || !is_int($country)) {
+            throw new Klarna_InvalidTypeException("Country", "integer");
+        }
+    }
+
+    /**
+     * Checks/fixes to the language input is valid.
+     *
+     * @param int &$language {@link KlarnaLanguage Language} constant.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkLanguage(&$language)
+    {
+        if (!isset($language)) {
+            throw new Klarna_ArgumentNotSetException("Language");
+        }
+        if (is_numeric($language) && !is_int($language)) {
+            $language = intval($language);
+        }
+        if (!is_numeric($language) || !is_int($language)) {
+            throw new Klarna_InvalidTypeException("Language", "integer");
+        }
+    }
+
+    /**
+     * Checks/fixes to the currency input is valid.
+     *
+     * @param int &$currency {@link KlarnaCurrency Currency} constant.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkCurrency(&$currency)
+    {
+        if (!isset($currency)) {
+            throw new Klarna_ArgumentNotSetException("Currency");
+        }
+        if (is_numeric($currency) && !is_int($currency)) {
+            $currency = intval($currency);
+        }
+        if (!is_numeric($currency) || !is_int($currency)) {
+            throw new Klarna_InvalidTypeException("Currency", "integer");
+        }
+    }
+
+    /**
+     * Checks/fixes so no/number is a valid input.
+     *
+     * @param int &$no Number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkNo(&$no)
+    {
+        if (!isset($no)) {
+            throw new Klarna_ArgumentNotSetException("no");
+        }
+        if (is_numeric($no) && !is_int($no)) {
+            $no = intval($no);
+        }
+        if (!is_numeric($no) || !is_int($no) || $no <= 0) {
+            throw new Klarna_InvalidTypeException('no', 'integer > 0');
+        }
+    }
+
+    /**
+     * Checks/fixes so reservation number is a valid input.
+     *
+     * @param string &$rno Reservation number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkRNO(&$rno)
+    {
+        if (!is_string($rno)) {
+            $rno = strval($rno);
+        }
+        if (strlen($rno) == 0) {
+            throw new Klarna_ArgumentNotSetException("RNO");
+        }
+    }
+
+    /**
+     * Checks/fixes so that reference/refCode are valid.
+     *
+     * @param string &$reference Reference string.
+     * @param string &$refCode   Reference code.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkRef(&$reference, &$refCode)
+    {
+        if (!is_string($reference)) {
+            $reference = strval($reference);
+            if (!is_string($reference)) {
+                throw new Klarna_InvalidTypeException("Reference", "string");
+            }
+        }
+
+        if (!is_string($refCode)) {
+            $refCode = strval($refCode);
+            if (!is_string($refCode)) {
+                throw new Klarna_InvalidTypeException("Reference code", "string");
+            }
+        }
+    }
+
+    /**
+     * Checks/fixes so that the OCR input is valid.
+     *
+     * @param string &$ocr OCR number.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkOCR(&$ocr)
+    {
+        if (!is_string($ocr)) {
+            $ocr = strval($ocr);
+            if (!is_string($ocr)) {
+                throw new Klarna_InvalidTypeException("OCR", "string");
+            }
+        }
+    }
+
+     /**
+     * Check so required argument is supplied.
+     *
+     * @param string $argument argument to check
+     * @param string $name     name of argument
+     *
+     * @throws Klarna_ArgumentNotSetException
+     * @return void
+     */
+    private function _checkArgument($argument, $name)
+    {
+        if (!is_string($argument)) {
+            $argument = strval($argument);
+        }
+
+        if (strlen($argument) == 0) {
+            throw new Klarna_ArgumentNotSetException($name);
+        }
+    }
+
+    /**
+     * Check so Locale settings (country, currency, language) are set.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    private function _checkLocale()
+    {
+        if (!is_int($this->_country)
+            || !is_int($this->_language)
+            || !is_int($this->_currency)
+        ) {
+            throw new Klarna_InvalidLocaleException;
+        }
+    }
+
+    /**
+     * Checks wether a goodslist is set.
+     *
+     * @throws Klarna_MissingGoodslistException
+     * @return void
+     */
+    private function _checkGoodslist()
+    {
+        if (!is_array($this->goodsList) || empty($this->goodsList)) {
+            throw new Klarna_MissingGoodslistException;
+        }
+    }
+
+    /**
+     * Set the pcStorage method used for this instance
+     *
+     * @param PCStorage $pcStorage PCStorage implementation
+     *
+     * @return void
+     */
+    public function setPCStorage($pcStorage)
+    {
+        if (!($pcStorage instanceof PCStorage)) {
+            throw new Klarna_InvalidTypeException('pcStorage', 'PCStorage');
+        }
+        $this->pcStorage = $pcStorage->getName();
+        $this->pclasses = $pcStorage;
+    }
+
+} //End Klarna
+
+/**
+ * Include the {@link KlarnaConfig} class.
+ */
+require_once 'klarnaconfig.php';
+
+/**
+ * Include the {@link KlarnaPClass} class.
+ */
+require_once 'klarnapclass.php';
+
+/**
+ * Include the {@link KlarnaCalc} class.
+ */
+require_once 'klarnacalc.php';
+
+/**
+ * Include the {@link KlarnaAddr} class.
+ */
+require_once 'klarnaaddr.php';
+
+/**
+ * Include the Exception classes.
+ */
+require_once 'Exceptions.php';
+
+/**
+ * Include the KlarnaEncoding class.
+ */
+require_once 'Encoding.php';
+
+
+/**
+ * Include the KlarnaFlags class.
+ */
+require_once 'Flags.php';
+
+/**
+ * Include KlarnaCountry, KlarnaCurrency, KlarnaLanguage classes
+ */
+require_once 'Country.php';
+require_once 'Currency.php';
+require_once 'Language.php';
Index: /mods/mod_klarna/klarna_php_2.3.0/Language.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/Language.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/Language.php	(revision 5261)
@@ -0,0 +1,300 @@
+<?php
+
+/**
+ * KlarnaLanguage
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Language Constants class
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaLanguage
+{
+
+    /**
+     * Language constant for Danish (DA).<br>
+     * ISO639_DA
+     *
+     * @var int
+     */
+    const DA = 27;
+
+    /**
+     * Language constant for German (DE).<br>
+     * ISO639_DE
+     *
+     * @var int
+     */
+    const DE = 28;
+
+    /**
+     * Language constant for English (EN).<br>
+     * ISO639_EN
+     *
+     * @var int
+     */
+    const EN = 31;
+
+    /**
+     * Language constant for Finnish (FI).<br>
+     * ISO639_FI
+     *
+     * @var int
+     */
+    const FI = 37;
+
+    /**
+     * Language constant for Norwegian (NB).<br>
+     * ISO639_NB
+     *
+     * @var int
+     */
+    const NB = 97;
+
+    /**
+     * Language constant for Dutch (NL).<br>
+     * ISO639_NL
+     *
+     * @var int
+     */
+    const NL = 101;
+
+    /**
+     * Language constant for Swedish (SV).<br>
+     * ISO639_SV
+     *
+     * @var int
+     */
+    const SV = 138;
+
+    /**
+     * Converts a language code, e.g. 'de' to the KlarnaLanguage constant.
+     *
+     * @param string $val language code
+     *
+     * @return int|null
+     */
+    public static function fromCode($val)
+    {
+        $val = strtoupper($val);
+        if (array_key_exists($val, self::$_languages)) {
+            return self::$_languages[$val];
+        }
+        return null;
+    }
+
+    /**
+     * Converts a KlarnaLanguage constant to the respective language code.
+     *
+     * @param int $val KlarnaLanguage constant
+     *
+     * @return lowercase string|null
+     */
+    public static function getCode($val)
+    {
+        if (self::$_languageFlip === array()) {
+            self::$_languageFlip = array_flip(self::$_languages);
+        }
+        if (array_key_exists($val, self::$_languageFlip)) {
+            return strtolower(self::$_languageFlip[$val]);
+        }
+        return null;
+    }
+
+    /**
+     * Cache for the flipped language array
+     *
+     * @var array
+     */
+    private static $_languageFlip = array();
+
+    /**
+     * Array containing all languages and their KRED Code
+     *
+     * @var array
+     */
+    private static $_languages = array(
+        'AA' => 1,    // Afar
+        'AB' => 2,    // Abkhazian
+        'AE' => 3,    // Avestan
+        'AF' => 4,    // Afrikaans
+        'AM' => 5,    // Amharic
+        'AR' => 6,    // Arabic
+        'AS' => 7,    // Assamese
+        'AY' => 8,    // Aymara
+        'AZ' => 9,    // Azerbaijani
+        'BA' => 10,    // Bashkir
+        'BE' => 11,    // Byelorussian; Belarusian
+        'BG' => 12,    // Bulgarian
+        'BH' => 13,    // Bihari
+        'BI' => 14,    // Bislama
+        'BN' => 15,    // Bengali; Bangla
+        'BO' => 16,    // Tibetan
+        'BR' => 17,    // Breton
+        'BS' => 18,    // Bosnian
+        'CA' => 19,    // Catalan
+        'CE' => 20,    // Chechen
+        'CH' => 21,    // Chamorro
+        'CO' => 22,    // Corsican
+        'CS' => 23,    // Czech
+        'CU' => 24,    // Church Slavic
+        'CV' => 25,    // Chuvash
+        'CY' => 26,    // Welsh
+        'DA' => 27,    // Danish
+        'DE' => 28,    // German
+        'DZ' => 29,    // Dzongkha; Bhutani
+        'EL' => 30,    // Greek
+        'EN' => 31,    // English
+        'EO' => 32,    // Esperanto
+        'ES' => 33,    // Spanish
+        'ET' => 34,    // Estonian
+        'EU' => 35,    // Basque
+        'FA' => 36,    // Persian
+        'FI' => 37,    // Finnish
+        'FJ' => 38,    // Fijian; Fiji
+        'FO' => 39,    // Faroese
+        'FR' => 40,    // French
+        'FY' => 41,    // Frisian
+        'GA' => 42,    // Irish
+        'GD' => 43,    // Scots; Gaelic
+        'GL' => 44,    // Gallegan; Galician
+        'GN' => 45,    // Guarani
+        'GU' => 46,    // Gujarati
+        'GV' => 47,    // Manx
+        'HA' => 48,    // Hausa
+        'HE' => 49,    // Hebrew (formerly iw)
+        'HI' => 50,    // Hindi
+        'HO' => 51,    // Hiri Motu
+        'HR' => 52,    // Croatian
+        'HU' => 53,    // Hungarian
+        'HY' => 54,    // Armenian
+        'HZ' => 55,    // Herero
+        'IA' => 56,    // Interlingua
+        'ID' => 57,    // Indonesian (formerly in)
+        'IE' => 58,    // Interlingue
+        'IK' => 59,    // Inupiak
+        'IO' => 60,    // Ido
+        'IS' => 61,    // Icelandic
+        'IT' => 62,    // Italian
+        'IU' => 63,    // Inuktitut
+        'JA' => 64,    // Japanese
+        'JV' => 65,    // Javanese
+        'KA' => 66,    // Georgian
+        'KI' => 67,    // Kikuyu
+        'KJ' => 68,    // Kuanyama
+        'KK' => 69,    // Kazakh
+        'KL' => 70,    // Kalaallisut; Greenlandic
+        'KM' => 71,    // Khmer; Cambodian
+        'KN' => 72,    // Kannada
+        'KO' => 73,    // Korean
+        'KS' => 74,    // Kashmiri
+        'KU' => 75,    // Kurdish
+        'KV' => 76,    // Komi
+        'KW' => 77,    // Cornish
+        'KY' => 78,    // Kirghiz
+        'LA' => 79,    // Latin
+        'LB' => 80,    // Letzeburgesch
+        'LN' => 81,    // Lingala
+        'LO' => 82,    // Lao; Laotian
+        'LT' => 83,    // Lithuanian
+        'LV' => 84,    // Latvian; Lettish
+        'MG' => 85,    // Malagasy
+        'MH' => 86,    // Marshall
+        'MI' => 87,    // Maori
+        'MK' => 88,    // Macedonian
+        'ML' => 89,    // Malayalam
+        'MN' => 90,    // Mongolian
+        'MO' => 91,    // Moldavian
+        'MR' => 92,    // Marathi
+        'MS' => 93,    // Malay
+        'MT' => 94,    // Maltese
+        'MY' => 95,    // Burmese
+        'NA' => 96,    // Nauru
+        'NB' => 97,    // Norwegian BokmÃ¥l
+        'ND' => 98,    // Ndebele, North
+        'NE' => 99,    // Nepali
+        'NG' => 100,    // Ndonga
+        'NL' => 101,    // Dutch
+        'NN' => 102,    // Norwegian Nynorsk
+        'NO' => 103,    // Norwegian
+        'NR' => 104,    // Ndebele, South
+        'NV' => 105,    // Navajo
+        'NY' => 106,    // Chichewa; Nyanja
+        'OC' => 107,    // Occitan; ProvenÃ§al
+        'OM' => 108,    // (Afan) Oromo
+        'OR' => 109,    // Oriya
+        'OS' => 110,    // Ossetian; Ossetic
+        'PA' => 111,    // Panjabi; Punjabi
+        'PI' => 112,    // Pali
+        'PL' => 113,    // Polish
+        'PS' => 114,    // Pashto, Pushto
+        'PT' => 115,    // Portuguese
+        'QU' => 116,    // Quechua
+        'RM' => 117,    // Rhaeto-Romance
+        'RN' => 118,    // Rundi; Kirundi
+        'RO' => 119,    // Romanian
+        'RU' => 120,    // Russian
+        'RW' => 121,    // Kinyarwanda
+        'SA' => 122,    // Sanskrit
+        'SC' => 123,    // Sardinian
+        'SD' => 124,    // Sindhi
+        'SE' => 125,    // Northern Sami
+        'SG' => 126,    // Sango; Sangro
+        'SI' => 127,    // Sinhalese
+        'SK' => 128,    // Slovak
+        'SL' => 129,    // Slovenian
+        'SM' => 130,    // Samoan
+        'SN' => 131,    // Shona
+        'SO' => 132,    // Somali
+        'SQ' => 133,    // Albanian
+        'SR' => 134,    // Serbian
+        'SS' => 135,    // Swati; Siswati
+        'ST' => 136,    // Sesotho; Sotho, Southern
+        'SU' => 137,    // Sundanese
+        'SV' => 138,    // Swedish
+        'SW' => 139,    // Swahili
+        'TA' => 140,    // Tamil
+        'TE' => 141,    // Telugu
+        'TG' => 142,    // Tajik
+        'TH' => 143,    // Thai
+        'TI' => 144,    // Tigrinya
+        'TK' => 145,    // Turkmen
+        'TL' => 146,    // Tagalog
+        'TN' => 147,    // Tswana; Setswana
+        'TO' => 148,    // Tongan
+        'TR' => 149,    // Turkish
+        'TS' => 150,    // Tsonga
+        'TT' => 151,    // Tatar
+        'TW' => 152,    // Twi
+        'TY' => 153,    // Tahitian
+        'UG' => 154,    // Uighur
+        'UK' => 155,    // Ukrainian
+        'UR' => 156,    // Urdu
+        'UZ' => 157,    // Uzbek
+        'VI' => 158,    // Vietnamese
+        'VO' => 159,    // Volapuk
+        'WA' => 160,    // Walloon
+        'WO' => 161,    // Wolof
+        'XH' => 162,    // Xhosa
+        'YI' => 163,    // Yiddish (formerly ji)
+        'YO' => 164,    // Yoruba
+        'ZA' => 165,    // Zhuang
+        'ZH' => 166,    // Chinese
+        'ZU' => 167     // Zulu
+    );
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/checkout/checkouthtml.intf.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/checkout/checkouthtml.intf.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/checkout/checkouthtml.intf.php	(revision 5261)
@@ -0,0 +1,97 @@
+<?php
+/**
+ * CheckoutHTML interface for threatmetrix
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * This interface provides methods to supply checkout page specific HTML.<br>
+ * Can be used to insert device identification, fraud prevention,<br>
+ * client side validation code into the checkout page.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+abstract class CheckoutHTML
+{
+
+    /**
+     * Creates a session ID used for e.g. client identification and fraud
+     * prevention.
+     *
+     * This method creates a 40 character long integer.
+     * The first 30 numbers is microtime + random numbers.
+     * The last 10 numbers is the eid zero-padded.
+     *
+     * All random functions are automatically seeded as of PHP 4.2.0.
+     *
+     * E.g. for eid 1004 output could be:
+     * 1624100001298454658880354228080000001004
+     *
+     * @param int $eid merchant id
+     *
+     * @return string A integer with a string length of 40.
+     */
+    public static function getSessionID($eid)
+    {
+        $eid = strval($eid);
+        while (strlen($eid) < 10) {
+            $eid = "0" . $eid; //Zero-pad the eid.
+        }
+
+        $sid = str_replace(array(' ', ',', '.'), '', microtime());
+        $sid[0] = rand(1, 9); //Make sure we always have a non-zero first.
+
+        //microtime + rand = 30 numbers in length
+        while (strlen($sid) < 30) {
+            //rand is automatically seeded as of PHP 4.2.0
+            $sid .= rand(0, 9999);
+        }
+        $sid = substr($sid, 0, 30);
+        $sid .= $eid;
+
+        return $sid;
+    }
+
+    /**
+     * Initializes this object, this method is always called
+     * before {@link CheckoutHTML::toHTML()}.
+     * This method is used in {@link Klarna::addTransaction()},
+     * {@link Klarna::reserveAmount()} and in {@link Klarna::checkoutHTML()}
+     *
+     * @param Klarna $klarna The API instance
+     * @param int    $eid    merchant id
+     *
+     * @return void
+     */
+    abstract public function init($klarna, $eid);
+
+    /**
+     * This returns the HTML code for this object,
+     * which will be used in the checkout page.
+     *
+     * @return string HTML
+     */
+    abstract public function toHTML();
+
+    /**
+     * This function is used to clear any stored values
+     * (in SESSION, COOKIE or similar)
+     * which are required to be unique between purchases.
+     *
+     * @return void
+     */
+    abstract public function clear();
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/checkout/threatmetrix.class.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/checkout/threatmetrix.class.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/checkout/threatmetrix.class.php	(revision 5261)
@@ -0,0 +1,136 @@
+<?php
+/**
+ * threatmetrix implementation of checckouthtml
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * ThreatMetrix is a fraud prevention and device identification software.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class ThreatMetrix extends CheckoutHTML
+{
+
+    /**
+     * The ID used in conjunction with the Klarna API.
+     *
+     * @var int
+     */
+    const ID = 'dev_id_1';
+
+    /**
+     * ThreatMetrix organizational ID.
+     *
+     * @var string
+     */
+    protected $orgID = 'qicrzsu4';
+
+    /**
+     * Session ID for the client.
+     *
+     * @var string
+     */
+    protected $sessionID;
+
+    /**
+     * Hostname used to access ThreatMetrix.
+     *
+     * @var string
+     */
+    protected $host = 'h.online-metrix.net';
+
+    /**
+     * Protocol used to access ThreatMetrix.
+     *
+     * @var string
+     */
+    protected $proto = 'https';
+
+    /**
+     * Initializes this object, this method is always called
+     * before {@link CheckoutHTML::toHTML()}.
+     * This method is used in {@link Klarna::addTransaction()},
+     * {@link Klarna::reserveAmount()} and in {@link Klarna::checkoutHTML()}
+     *
+     * @param Klarna $klarna The API instance
+     * @param int    $eid    Merchant ID
+     *
+     * @return void
+     */
+    public function init($klarna, $eid)
+    {
+        if (!is_int($eid)) {
+            throw new Klarna_ConfigFieldMissingException('eid');
+        }
+        if (isset($_SESSION)) {
+            if (!isset($_SESSION[self::ID])
+                || (strlen($_SESSION[self::ID]) < 40)
+            ) {
+                $_SESSION[self::ID] = parent::getSessionID($eid);
+                $this->sessionID = $_SESSION[self::ID];
+            } else {
+                $this->sessionID = $_SESSION[self::ID];
+            }
+        } else {
+            $this->sessionID = parent::getSessionID($eid);
+        }
+
+        $klarna->setSessionID(self::ID, $this->sessionID);
+    }
+
+    /**
+     * This function is used to clear any stored values
+     * (in SESSION, COOKIE or similar)
+     * which are required to be unique between purchases.
+     *
+     * @return void
+     */
+    public function clear()
+    {
+        if (isset($_SESSION) && isset($_SESSION[self::ID])) {
+            $_SESSION[self::ID] = null;
+            unset($_SESSION[self::ID]);
+        }
+    }
+
+    /**
+     * This returns the HTML code for this object,
+     * which will be used in the checkout page.
+     *
+     * @return string
+     */
+    public function toHTML()
+    {
+        $html
+            = "<p style='display: none; ".
+            "background:url($this->proto://$this->host/fp/clear.png?org_id=".
+            "$this->orgID&session_id=$this->sessionID&m=1)'></p>".
+            "<script src='$this->proto://$this->host/fp/check.js?org_id=".
+            "$this->orgID&session_id=$this->sessionID' ".
+            "type='text/javascript'></script>".
+            "<img src='$this->proto://$this->host/fp/clear.png?org_id=".
+            "$this->orgID&session_id=$this->sessionID&m=2' alt='' >".
+            "<object type='application/x-shockwave-flash' style='display: none' ".
+            "data='$this->proto://$this->host/fp/fp.swf?org_id=$this->orgID&".
+            "session_id=$this->sessionID' width='1' height='1' id='obj_id'>".
+            "<param name='movie' value='$this->proto://$this->host/fp/fp.swf?".
+            "org_id=$this->orgID&session_id=$this->sessionID' />".
+            "<div></div>".
+            "</object>";
+        return $html;
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/klarnaaddr.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/klarnaaddr.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/klarnaaddr.php	(revision 5261)
@@ -0,0 +1,609 @@
+<?php
+/**
+ * KlarnaAddr
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * KlarnaAddr is an object of convenience, to parse and create addresses.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaAddr
+{
+
+    /**
+     * Email address.
+     *
+     * @var string
+     */
+    protected $email;
+
+    /**
+     * Phone number.
+     *
+     * @var string
+     */
+    protected $telno;
+
+    /**
+     * Cellphone number.
+     *
+     * @var string
+     */
+    protected $cellno;
+
+    /**
+     * First name.
+     *
+     * @var string
+     */
+    protected $fname;
+
+    /**
+     * Last name.
+     *
+     * @var string
+     */
+    protected $lname;
+
+    /**
+     * Company name.
+     *
+     * @var string
+     */
+    protected $company;
+
+    /**
+     * Care of, C/O.
+     *
+     * @var string
+     */
+    protected $careof;
+
+    /**
+     * Street address.
+     *
+     * @var string
+     */
+    protected $street;
+
+    /**
+     * Zip code.
+     *
+     * @var string
+     */
+    protected $zip;
+
+    /**
+     * City.
+     *
+     * @var string
+     */
+    protected $city;
+
+    /**
+     * KlarnaCountry constant
+     *
+     * @var int
+     */
+    protected $country;
+
+    /**
+     * House number.
+     * Only for NL and DE!
+     *
+     * @var string
+     */
+    protected $houseNo;
+
+    /**
+     * House extension.
+     * Only for NL!
+     *
+     * @var string
+     */
+    protected $houseExt;
+
+    /**
+     * When using {@link Klarna::getAddresses()} this might be guessed
+     * depending on type used.
+     *
+     * Signifies if address is for a company or a private person.
+     * If isCompany is null, then it is unknown and will be assumed to
+     * be a private person.
+     *
+     * <b>Note</b>:<br>
+     * This has no effect on transmitted data.
+     *
+     * @var bool|null
+     */
+    public $isCompany = null;
+
+    /**
+     * Class constructor.
+     *
+     * Calls the set methods for all arguments.
+     *
+     * @param string     $email    Email address.
+     * @param string     $telno    Phone number.
+     * @param string     $cellno   Cellphone number.
+     * @param string     $fname    First name.
+     * @param string     $lname    Last name.
+     * @param string     $careof   Care of, C/O.
+     * @param string     $street   Street address.
+     * @param string     $zip      Zip code.
+     * @param string     $city     City.
+     * @param string|int $country  KlarnaCountry constant or two letter code.
+     * @param string     $houseNo  House number, only used in DE and NL.
+     * @param string     $houseExt House extension, only used in NL.
+     *
+     * @throws KlarnaException
+     */
+    public function __construct(
+        $email = null, $telno = null, $cellno = null, $fname = null,
+        $lname = null, $careof = "", $street = null, $zip = null,
+        $city = null, $country = null, $houseNo = "", $houseExt = ""
+    ) {
+        //Set all string values to ""
+        $this->company = "";
+        $this->telno = "";
+        $this->careof = "";
+        $this->cellno = "";
+        $this->city = "";
+        $this->email = "";
+        $this->fname = "";
+        $this->lname = "";
+        $this->zip = "";
+
+        if ($email !== null) {
+            $this->setEmail($email);
+        }
+
+        if ($telno !== null) {
+            $this->setTelno($telno);
+        }
+
+        if ($cellno !== null) {
+            $this->setCellno($cellno);
+        }
+
+        if ($fname !== null) {
+            $this->setFirstName($fname);
+        }
+
+        if ($lname !== null) {
+            $this->setLastName($lname);
+        }
+
+        $this->setCareof($careof);
+
+        if ($street !== null) {
+            $this->setStreet($street);
+        }
+
+        if ($zip !== null) {
+            $this->setZipCode($zip);
+        }
+
+        if ($city !== null) {
+            $this->setCity($city);
+        }
+
+        if ($country !== null) {
+            $this->setCountry($country);
+        }
+
+        $this->setHouseNumber($houseNo);
+        $this->setHouseExt($houseExt);
+    }
+
+    /**
+     * Returns the email address.
+     *
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->email;
+    }
+
+    /**
+     * Sets the email address.
+     *
+     * @param string $email email address
+     *
+     * @return void
+     */
+    public function setEmail($email)
+    {
+        if (!is_string($email)) {
+            $email = strval($email);
+        }
+
+        $this->email = $email;
+    }
+
+    /**
+     * Returns the phone number.
+     *
+     * @return string
+     */
+    public function getTelno()
+    {
+        return $this->telno;
+    }
+
+    /**
+     * Sets the phone number.
+     *
+     * @param string $telno telno
+     *
+     * @return void
+     */
+    public function setTelno($telno)
+    {
+        if (!is_string($telno)) {
+            $telno = strval($telno);
+        }
+        $this->telno = $telno;
+    }
+
+    /**
+     * Returns the cellphone number.
+     *
+     * @return string
+     */
+    public function getCellno()
+    {
+        return $this->cellno;
+    }
+
+    /**
+     * Sets the cellphone number.
+     *
+     * @param string $cellno mobile number
+     *
+     * @return void
+     */
+    public function setCellno($cellno)
+    {
+        if (!is_string($cellno)) {
+            $cellno = strval($cellno);
+        }
+
+        $this->cellno = $cellno;
+    }
+
+    /**
+     * Returns the first name.
+     *
+     * @return string
+     */
+    public function getFirstName()
+    {
+        return $this->fname;
+    }
+
+    /**
+     * Sets the first name.
+     *
+     * @param string $fname firstname
+     *
+     * @return void
+     */
+    public function setFirstName($fname)
+    {
+        if (!is_string($fname)) {
+            $fname = strval($fname);
+        }
+
+        $this->fname = $fname;
+    }
+
+    /**
+     * Returns the last name.
+     *
+     * @return string
+     */
+    public function getLastName()
+    {
+        return $this->lname;
+    }
+
+    /**
+     * Sets the last name.
+     *
+     * @param string $lname lastname
+     *
+     * @return void
+     */
+    public function setLastName($lname)
+    {
+        if (!is_string($lname)) {
+            $lname = strval($lname);
+        }
+
+        $this->lname = $lname;
+    }
+
+    /**
+     * Returns the company name.
+     *
+     * @return string
+     */
+    public function getCompanyName()
+    {
+        return $this->company;
+    }
+
+    /**
+     * Sets the company name.
+     * If the purchase results in a company purchase,
+     * reference person will be used from first and last name,
+     * or the value set with {@link Klarna::setReference()}.
+     *
+     * @param string $company company name
+     *
+     * @see Klarna::setReference
+     * @return void
+     */
+    public function setCompanyName($company)
+    {
+        if (!is_string($company)) {
+            $company = strval($company);
+        }
+
+        $this->company = $company;
+    }
+
+    /**
+     * Returns the care of, C/O.
+     *
+     * @return string
+     */
+    public function getCareof()
+    {
+        return $this->careof;
+    }
+
+    /**
+     * Sets the care of, C/O.
+     *
+     * @param string $careof care of address
+     *
+     * @return void
+     */
+    public function setCareof($careof)
+    {
+        if (!is_string($careof)) {
+            $careof = strval($careof);
+        }
+
+        $this->careof = $careof;
+    }
+
+    /**
+     * Returns the street address.
+     *
+     * @return string
+     */
+    public function getStreet()
+    {
+        return $this->street;
+    }
+
+    /**
+     * Sets the street address.
+     *
+     * @param string $street street address
+     *
+     * @return void
+     */
+    public function setStreet($street)
+    {
+        if (!is_string($street)) {
+            $street = strval($street);
+        }
+
+        $this->street = $street;
+    }
+
+    /**
+     * Returns the zip code.
+     *
+     * @return string
+     */
+    public function getZipCode()
+    {
+        return $this->zip;
+    }
+
+    /**
+     * Sets the zip code.
+     *
+     * @param string $zip zip code
+     *
+     * @return void
+     */
+    public function setZipCode($zip)
+    {
+
+        if (!is_string($zip)) {
+            $zip = strval($zip);
+        }
+
+        $zip = str_replace(' ', '', $zip); //remove spaces
+
+        $this->zip = $zip;
+    }
+
+    /**
+     * Returns the city.
+     *
+     * @return string
+     */
+    public function getCity()
+    {
+        return $this->city;
+    }
+
+    /**
+     * Sets the city.
+     *
+     * @param string $city city
+     *
+     * @return void
+     */
+    public function setCity($city)
+    {
+        if (!is_string($city)) {
+            $city = strval($city);
+        }
+
+        $this->city = $city;
+    }
+
+    /**
+     * Returns the country as a integer constant.
+     *
+     * @return int {@link KlarnaCountry}
+     */
+    public function getCountry()
+    {
+        return $this->country;
+    }
+
+    /**
+     * Returns the country as a two letter representation.
+     *
+     * @throws KlarnaException
+     * @return string  E.g. 'de', 'dk', ...
+     */
+    public function getCountryCode()
+    {
+        return KlarnaCountry::getCode($this->country);
+    }
+
+    /**
+     * Sets the country, use either a two letter representation or the integer
+     * constant.
+     *
+     * @param int $country {@link KlarnaCountry}
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function setCountry($country)
+    {
+        if ($country === null) {
+            throw new Klarna_ArgumentNotSetException('Country');
+        }
+        if (is_numeric($country)) {
+            if (!is_int($country)) {
+                $country = intval($country);
+            }
+            $this->country = $country;
+            return;
+        }
+        if (strlen($country) == 2 || strlen($country) == 3) {
+            $this->setCountry(KlarnaCountry::fromCode($country));
+            return;
+        }
+        throw new KlarnaException("Failed to set country! ($country)");
+    }
+
+    /**
+     * Returns the house number.<br>
+     * Only used in Germany and Netherlands.<br>
+     *
+     * @return string
+     */
+    public function getHouseNumber()
+    {
+        return $this->houseNo;
+    }
+
+    /**
+     * Sets the house number.<br>
+     * Only used in Germany and Netherlands.<br>
+     *
+     * @param string $houseNo house number
+     *
+     * @return void
+     */
+    public function setHouseNumber($houseNo)
+    {
+        if (!is_string($houseNo)) {
+            $houseNo = strval($houseNo);
+        }
+
+        $this->houseNo = $houseNo;
+    }
+
+    /**
+     * Returns the house extension.<br>
+     * Only used in Netherlands.<br>
+     *
+     * @return string
+     */
+    public function getHouseExt()
+    {
+        return $this->houseExt;
+    }
+
+    /**
+     * Sets the house extension.<br>
+     * Only used in Netherlands.<br>
+     *
+     * @param string $houseExt house extension
+     *
+     * @return void
+     */
+    public function setHouseExt($houseExt)
+    {
+        if (!is_string($houseExt)) {
+            $houseExt = strval($houseExt);
+        }
+
+        $this->houseExt = $houseExt;
+    }
+
+    /**
+     * Returns an associative array representing this object.
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        return array(
+            'email' => $this->getEmail(),
+            'telno' => $this->getTelno(),
+            'cellno' => $this->getCellno(),
+            'fname' => $this->getFirstName(),
+            'lname' => $this->getLastName(),
+            'company' => $this->getCompanyName(),
+            'careof' => $this->getCareof(),
+            'street' => $this->getStreet(),
+            'house_number' => $this->getHouseNumber(),
+            'house_extension' => $this->getHouseExt(),
+            'zip' => $this->getZipCode(),
+            'city' => $this->getCity(),
+            'country' => $this->getCountry(),
+        );
+    }
+
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/klarnacalc.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/klarnacalc.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/klarnacalc.php	(revision 5261)
@@ -0,0 +1,654 @@
+<?php
+/**
+ * KlarnaCalc
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * KlarnaCalc provides methods to calculate part payment functions.
+ *
+ * All rates are yearly rates, but they are calculated monthly. So
+ * a rate of 9 % is used 0.75% monthly. The first is the one we specify
+ * to the customers, and the second one is the one added each month to
+ * the account. The IRR uses the same notation.
+ *
+ * The APR is however calculated by taking the monthly rate and raising
+ * it to the 12 power. This is according to the EU law, and will give
+ * very large numbers if the $pval is small compared to the $fee and
+ * the amount of months you repay is small as well.
+ *
+ * All functions work in discrete mode, and the time interval is the
+ * mythical evenly divided month. There is no way to calculate APR in
+ * days without using integrals and other hairy math. So don't try.
+ * The amount of days between actual purchase and the first bill can
+ * of course vary between 28 and 61 days, but all calculations in this
+ * class assume this time is exactly and that is ok since this will only
+ * overestimate the APR and all examples in EU law uses whole months as well.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaCalc
+{
+
+    /**
+     * This constant tells the irr function when to stop.
+     * If the calculation error is lower than this the calculation is done.
+     *
+     * @var float
+     */
+    protected static $accuracy = 0.01;
+
+    /**
+     * Calculates the midpoint between two points. Used by divide and conquer.
+     *
+     * @param float $a point a
+     * @param float $b point b
+     *
+     * @return float
+     */
+    private static function _midpoint($a, $b)
+    {
+        return (($a+$b)/2);
+    }
+
+    /**
+     * npv - Net Present Value
+     * Calculates the difference between the initial loan to the customer
+     * and the individual payments adjusted for the inverse of the interest
+     * rate. The variable we are searching for is $rate and if $pval,
+     * $payarray and $rate is perfectly balanced this function returns 0.0.
+     *
+     * @param float $pval       initial loan to customer (in any currency)
+     * @param array $payarray   array of monthly payments from the customer
+     * @param float $rate       interest rate per year in %
+     * @param int   $fromdayone count interest from the first day? yes(1)/no(0)
+     *
+     * @return float
+     */
+    private static function _npv($pval, $payarray, $rate, $fromdayone)
+    {
+        $month = $fromdayone;
+        foreach ($payarray as $payment) {
+            $pval -= $payment / pow(1 + $rate/(12*100.0), $month++);
+        }
+
+        return ($pval);
+    }
+
+    /**
+     * This function uses divide and conquer to numerically find the IRR,
+     * Internal Rate of Return. It starts of by trying a low of 0% and a
+     * high of 100%. If this isn't enough it will double the interval up
+     * to 1000000%. Note that this is insanely high, and if you try to convert
+     * an IRR that high to an APR you will get even more insane values,
+     * so feed this function good data.
+     *
+     * Return values: float irr  if it was possible to find a rate that gets
+     *                           npv closer to 0 than $accuracy.
+     *                int -1     The sum of the payarray is less than the lent
+     *                           amount, $pval. Hellooooooo. Impossible.
+     *                int -2     the IRR is way to high, giving up.
+     *
+     * This algorithm works in logarithmic time no matter what inputs you give
+     * and it will come to a good answer within ~30 steps.
+     *
+     * @param float $pval       initial loan to customer (in any currency)
+     * @param array $payarray   array of monthly payments from the customer
+     * @param int   $fromdayone count interest from the first day? yes(1)/no(0)
+     *
+     * @return float
+     */
+    private static function  _irr($pval, $payarray, $fromdayone)
+    {
+        $low = 0.0;
+        $high = 100.0;
+        $lowval = self::_npv($pval, $payarray, $low, $fromdayone);
+        $highval = self::_npv($pval, $payarray, $high, $fromdayone);
+
+        // The sum of $payarray is smaller than $pval, impossible!
+        if ($lowval > 0.0) {
+            return (-1);
+        }
+
+        // Standard divide and conquer.
+        do {
+            $mid = self::_midpoint($low, $high);
+            $midval  = self::_npv($pval, $payarray, $mid, $fromdayone);
+            if (abs($midval) < self::$accuracy) {
+                //we are close enough
+                return ($mid);
+            }
+
+            if ($highval < 0.0) {
+                // we are not in range, so double it
+                $low = $high;
+                $lowval = $highval;
+                $high *= 2;
+                $highval = self::_npv($pval, $payarray, $high, $fromdayone);
+            } else if ($midval >= 0.0) {
+                // irr is between low and mid
+                $high = $mid;
+                $highval = $midval;
+            } else {
+                // irr is between mid and high
+                $low = $mid;
+                $lowval = $midval;
+            }
+        } while ($high < 1000000);
+        // bad input, insanely high interest. APR will be INSANER!
+        return (-2);
+    }
+
+    /**
+     * IRR is not the same thing as APR, Annual Percentage Rate. The
+     * IRR is per time period, i.e. 1 month, and the APR is per year,
+     * and note that that you need to raise to the power of 12, not
+     * mutliply by 12.
+     *
+     * This function turns an IRR into an APR.
+     *
+     * If you feed it a value of 100%, yes the APR will be millions!
+     * If you feed it a value of   9%, it will be 9.3806%.
+     * That is the nature of this math and you can check the wiki
+     * page for APR for more info.
+     *
+     * @param float $irr Internal Rate of Return, expressed yearly, in %
+     *
+     * @return float Annual Percentage Rate, in %
+     */
+    private static function  _irr2apr($irr)
+    {
+        return (100 * (pow(1 + $irr / (12 * 100.0), 12) - 1));
+    }
+
+    /**
+     * This is a simplified model of how our paccengine works if
+     * a client always pays their bills. It adds interest and fees
+     * and checks minimum payments. It will run until the value
+     * of the account reaches 0, and return an array of all the
+     * individual payments. Months is the amount of months to run
+     * the simulation. Important! Don't feed it too few months or
+     * the whole loan won't be paid off, but the other functions
+     * should handle this correctly.
+     *
+     * Giving it too many months has no bad effects, or negative
+     * amount of months which means run forever, but it will stop
+     * as soon as the account is paid in full.
+     *
+     * Depending if the account is a base account or not, the
+     * payment has to be 1/24 of the capital amount.
+     *
+     * The payment has to be at least $minpay, unless the capital
+     * amount + interest + fee is less than $minpay; in that case
+     * that amount is paid and the function returns since the client
+     * no longer owes any money.
+     *
+     * @param float   $pval    initial loan to customer (in any currency)
+     * @param float   $rate    interest rate per year in %
+     * @param float   $fee     monthly invoice fee
+     * @param float   $minpay  minimum monthly payment allowed for this country.
+     * @param float   $payment payment the client to pay each month
+     * @param int     $months  amount of months to run (-1 => infinity)
+     * @param boolean $base    is it a base account?
+     *
+     * @return array  An array of monthly payments for the customer.
+     */
+    private static function _fulpacc(
+        $pval, $rate, $fee, $minpay, $payment, $months, $base
+    ) {
+        $bal = $pval;
+        $payarray = array();
+        while (($months != 0) && ($bal > self::$accuracy)) {
+            $interest = $bal * $rate / (100.0 * 12);
+            $newbal = $bal + $interest + $fee;
+
+            if ($minpay >= $newbal || $payment >= $newbal) {
+                $payarray[] = $newbal;
+                return $payarray;
+            }
+
+            $newpay = max($payment, $minpay);
+            if ($base) {
+                $newpay = max($newpay, $bal/24.0 + $fee + $interest);
+            }
+
+            $bal = $newbal - $newpay;
+            $payarray[] = $newpay;
+            $months -= 1;
+        }
+
+        return $payarray;
+    }
+
+    /**
+     * Calculates how much you have to pay each month if you want to
+     * pay exactly the same amount each month. The interesting input
+     * is the amount of $months.
+     *
+     * It does not include the fee so add that later.
+     *
+     * Return value: monthly payment.
+     *
+     * @param float $pval   principal value
+     * @param int   $months months to pay of in
+     * @param float $rate   interest rate in % as before
+     *
+     * @return float monthly payment
+     */
+    private static function _annuity($pval, $months, $rate)
+    {
+        if ($months == 0) {
+            return $pval;
+        }
+
+        if ($rate == 0) {
+            return $pval/$months;
+        }
+
+        $p = $rate / (100.0*12);
+        return $pval * $p / (1 - pow((1+$p), -$months));
+    }
+
+    /**
+     * Calculate the APR for an annuity given the following inputs.
+     *
+     * If you give it bad inputs, it will return negative values.
+     *
+     * @param float $pval   principal value
+     * @param int   $months months to pay off in
+     * @param float $rate   interest rate in % as before
+     * @param float $fee    monthly fee
+     * @param float $minpay minimum payment per month
+     *
+     * @return float APR in %
+     */
+    private static function _aprAnnuity($pval, $months, $rate, $fee, $minpay)
+    {
+        $payment = self::_annuity($pval, $months, $rate) + $fee;
+        if ($payment < 0) {
+            return $payment;
+        }
+        $payarray = self::_fulpacc(
+            $pval, $rate, $fee, $minpay, $payment, $months, false
+        );
+        $apr = self::_irr2apr(self::_irr($pval, $payarray, 1));
+
+        return $apr;
+    }
+
+    /**
+     * Grabs the array of all monthly payments for specified PClass.
+     *
+     * <b>Flags can be either</b>:<br>
+     * {@link KlarnaFlags::CHECKOUT_PAGE}<br>
+     * {@link KlarnaFlags::PRODUCT_PAGE}<br>
+     *
+     * @param float        $sum    The sum for the order/product.
+     * @param KlarnaPClass $pclass KlarnaPClass used to calculate the APR.
+     * @param int          $flags  Checkout or Product page.
+     *
+     * @throws KlarnaException
+     * @return array An array of monthly payments.
+     */
+    private static function _getPayArray($sum, $pclass, $flags)
+    {
+        $monthsfee = 0;
+        if ($flags === KlarnaFlags::CHECKOUT_PAGE) {
+            $monthsfee = $pclass->getInvoiceFee();
+        }
+        $startfee = 0;
+        if ($flags === KlarnaFlags::CHECKOUT_PAGE) {
+            $startfee = $pclass->getStartFee();
+        }
+
+        //Include start fee in sum
+        $sum += $startfee;
+
+        $base = ($pclass->getType() === KlarnaPClass::ACCOUNT);
+        $lowest = self::get_lowest_payment_for_account($pclass->getCountry());
+
+        if ($flags == KlarnaFlags::CHECKOUT_PAGE) {
+            $minpay = ($pclass->getType() === KlarnaPClass::ACCOUNT) ? $lowest : 0;
+        } else {
+            $minpay = 0;
+        }
+
+        $payment = self::_annuity(
+            $sum,
+            $pclass->getMonths(),
+            $pclass->getInterestRate()
+        );
+
+        //Add monthly fee
+        $payment += $monthsfee;
+
+        return  self::_fulpacc(
+            $sum,
+            $pclass->getInterestRate(),
+            $monthsfee,
+            $minpay,
+            $payment,
+            $pclass->getMonths(),
+            $base
+        );
+    }
+
+    /**
+     * Calculates APR for the specified values.<br>
+     * Result is rounded with two decimals.<br>
+     *
+     * <b>Flags can be either</b>:<br>
+     * {@link KlarnaFlags::CHECKOUT_PAGE}<br>
+     * {@link KlarnaFlags::PRODUCT_PAGE}<br>
+     *
+     * @param float        $sum    The sum for the order/product.
+     * @param KlarnaPClass $pclass KlarnaPClass used to calculate the APR.
+     * @param int          $flags  Checkout or Product page.
+     * @param int          $free   Number of free months.
+     *
+     * @throws KlarnaException
+     * @return float  APR in %
+     */
+    public static function calc_apr($sum, $pclass, $flags, $free = 0)
+    {
+        if (!is_numeric($sum)) {
+            throw new Klarna_InvalidTypeException('sum', 'numeric');
+        }
+        if (is_numeric($sum) && (!is_int($sum) || !is_float($sum))) {
+            $sum = floatval($sum);
+        }
+
+        if (!($pclass instanceof KlarnaPClass)) {
+            throw new Klarna_InvalidTypeException('pclass', 'KlarnaPClass');
+        }
+
+        if (!is_numeric($free)) {
+            throw new Klarna_InvalidTypeException('free',  'integer');
+        }
+
+        if (is_numeric($free) && !is_int($free)) {
+            $free = intval($free);
+        }
+
+        if ($free < 0) {
+            throw new KlarnaException(
+                'Error in ' . __METHOD__ .
+                ': Number of free months must be positive or zero!'
+            );
+        }
+
+        if (is_numeric($flags) && !is_int($flags)) {
+            $flags = intval($flags);
+        }
+
+        if (!is_numeric($flags)
+            || !in_array(
+                $flags, array(
+                    KlarnaFlags::CHECKOUT_PAGE, KlarnaFlags::PRODUCT_PAGE
+                )
+            )
+        ) {
+            throw new Klarna_InvalidTypeException(
+                'flags',
+                KlarnaFlags::CHECKOUT_PAGE . ' or ' . KlarnaFlags::PRODUCT_PAGE
+            );
+        }
+
+        $monthsfee = 0;
+        if ($flags === KlarnaFlags::CHECKOUT_PAGE) {
+            $monthsfee = $pclass->getInvoiceFee();
+        }
+        $startfee = 0;
+        if ($flags === KlarnaFlags::CHECKOUT_PAGE) {
+            $startfee = $pclass->getStartFee();
+        }
+
+        //Include start fee in sum
+        $sum += $startfee;
+
+        $lowest = self::get_lowest_payment_for_account($pclass->getCountry());
+
+        if ($flags == KlarnaFlags::CHECKOUT_PAGE) {
+            $minpay = ($pclass->getType() === KlarnaPClass::ACCOUNT) ? $lowest : 0;
+        } else {
+            $minpay = 0;
+        }
+
+        //add monthly fee
+        $payment = self::_annuity(
+            $sum,
+            $pclass->getMonths(),
+            $pclass->getInterestRate()
+        ) + $monthsfee;
+
+        $type = $pclass->getType();
+        switch($type) {
+        case KlarnaPClass::CAMPAIGN:
+        case KlarnaPClass::ACCOUNT:
+            return round(
+                self::_aprAnnuity(
+                    $sum, $pclass->getMonths(),
+                    $pclass->getInterestRate(),
+                    $pclass->getInvoiceFee(),
+                    $minpay
+                ),
+                2
+            );
+        case KlarnaPClass::SPECIAL:
+            throw new Klarna_PClassException(
+                'Method is not available for SPECIAL pclasses'
+            );
+        case KlarnaPClass::FIXED:
+            throw new Klarna_PClassException(
+                'Method is not available for FIXED pclasses'
+            );
+        default:
+            throw new Klarna_PClassException(
+                'Unknown PClass type! ('.$type.')'
+            );
+        }
+    }
+
+    /**
+     * Calculates the total credit purchase cost.<br>
+     * The result is rounded up, depending on the pclass country.<br>
+     *
+     * <b>Flags can be either</b>:<br>
+     * {@link KlarnaFlags::CHECKOUT_PAGE}<br>
+     * {@link KlarnaFlags::PRODUCT_PAGE}<br>
+     *
+     * @param float        $sum    The sum for the order/product.
+     * @param KlarnaPClass $pclass PClass used to calculate total credit cost.
+     * @param int          $flags  Checkout or Product page.
+     *
+     * @throws KlarnaException
+     * @return float  Total credit purchase cost.
+     */
+    public static function total_credit_purchase_cost($sum, $pclass, $flags)
+    {
+        if (!is_numeric($sum)) {
+            throw new Klarna_InvalidTypeException('sum', 'numeric');
+        }
+
+        if (is_numeric($sum) && (!is_int($sum) || !is_float($sum))) {
+            $sum = floatval($sum);
+        }
+
+        if (!($pclass instanceof KlarnaPClass)) {
+            throw new Klarna_InvalidTypeException('pclass', 'KlarnaPClass');
+        }
+
+        if (is_numeric($flags) && !is_int($flags)) {
+            $flags = intval($flags);
+        }
+
+        if (!is_numeric($flags)
+            || !in_array(
+                $flags,
+                array(
+                    KlarnaFlags::CHECKOUT_PAGE, KlarnaFlags::PRODUCT_PAGE
+                )
+            )
+        ) {
+            throw new Klarna_InvalidTypeException(
+                'flags',
+                KlarnaFlags::CHECKOUT_PAGE . ' or ' . KlarnaFlags::PRODUCT_PAGE
+            );
+        }
+
+        $payarr = self::_getPayArray($sum, $pclass, $flags);
+
+        $credit_cost = 0;
+        foreach ($payarr as $pay) {
+            $credit_cost += $pay;
+        }
+
+        return self::pRound($credit_cost, $pclass->getCountry());
+    }
+
+    /**
+     * Calculates the monthly cost for the specified pclass.
+     * The result is rounded up to the correct value depending on the
+     * pclass country.<br>
+     *
+     * Example:<br>
+     * <ul>
+     *     <li>In product view, round monthly cost with max 0.5 or 0.1
+     *  depending on currency.<br>
+     *     <ul>
+     *         <li>10.50 SEK rounds to 11 SEK</li>
+     *         <li>10.49 SEK rounds to 10 SEK</li>
+     *         <li> 8.55 EUR rounds to 8.6 EUR</li>
+     *         <li> 8.54 EUR rounds to 8.5 EUR</li>
+     *     </ul></li>
+     *     <li>
+     *         In checkout, round the monthly cost to have 2 decimals.<br>
+     *         For example 10.57 SEK/per mÃ¥nad
+     *     </li>
+     * </ul>
+     *
+     * <b>Flags can be either</b>:<br>
+     * {@link KlarnaFlags::CHECKOUT_PAGE}<br>
+     * {@link KlarnaFlags::PRODUCT_PAGE}<br>
+     *
+     * @param int          $sum    The sum for the order/product.
+     * @param KlarnaPClass $pclass PClass used to calculate monthly cost.
+     * @param int          $flags  Checkout or product page.
+     *
+     * @throws KlarnaException
+     * @return float  The monthly cost.
+     */
+    public static function calc_monthly_cost($sum, $pclass, $flags)
+    {
+        if (!is_numeric($sum)) {
+            throw new Klarna_InvalidTypeException('sum', 'numeric');
+        }
+
+        if (is_numeric($sum) && (!is_int($sum) || !is_float($sum))) {
+            $sum = floatval($sum);
+        }
+
+        if (!($pclass instanceof KlarnaPClass)) {
+            throw new Klarna_InvalidTypeException('pclass', 'KlarnaPClass');
+        }
+
+        if (is_numeric($flags) && !is_int($flags)) {
+            $flags = intval($flags);
+        }
+
+        if (!is_numeric($flags)
+            || !in_array(
+                $flags,
+                array(
+                    KlarnaFlags::CHECKOUT_PAGE, KlarnaFlags::PRODUCT_PAGE
+                )
+            )
+        ) {
+            throw new Klarna_InvalidTypeException(
+                'flags',
+                KlarnaFlags::CHECKOUT_PAGE . ' or ' . KlarnaFlags::PRODUCT_PAGE
+            );
+        }
+
+        $payarr = self::_getPayArray($sum, $pclass, $flags);
+        $value = 0;
+        if (isset($payarr[0])) {
+            $value = $payarr[0];
+        }
+
+        if (KlarnaFlags::CHECKOUT_PAGE == $flags) {
+            return round($value, 2);
+        }
+
+        return self::pRound($value, $pclass->getCountry());
+    }
+
+    /**
+     * Returns the lowest monthly payment for Klarna Account.
+     *
+     * @param int $country KlarnaCountry constant.
+     *
+     * @throws KlarnaException
+     * @return int|float      Lowest monthly payment.
+     */
+    public static function get_lowest_payment_for_account($country)
+    {
+        $country = KlarnaCountry::getCode($country);
+
+        switch (strtoupper($country)) {
+        case "SE":
+            return 50.0;
+        case "NO":
+            return 95.0;
+        case "FI":
+            return 8.95;
+        case "DK":
+            return 89.0;
+        case "DE":
+        case "NL":
+        case "AT":
+            return 6.95;
+        default:
+            throw new KlarnaException("Invalid country {$country}");
+        }
+    }
+
+    /**
+     * Rounds a value depending on the specified country.
+     *
+     * @param int|float $value   The value to be rounded.
+     * @param int       $country KlarnaCountry constant.
+     *
+     * @return float|int
+     */
+    public static function pRound($value, $country)
+    {
+        $multiply = 1; //Round to closest integer
+        $country = KlarnaCountry::getCode($country);
+        switch($country) {
+        case "FI":
+        case "DE":
+        case "NL":
+        case "AT":
+            $multiply = 10; //Round to closest decimal
+            break;
+        }
+
+        return floor(($value*$multiply)+0.5)/$multiply;
+    }
+
+}
+
Index: /mods/mod_klarna/klarna_php_2.3.0/klarnaconfig.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/klarnaconfig.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/klarnaconfig.php	(revision 5261)
@@ -0,0 +1,176 @@
+<?php
+/**
+ * KlarnaConfig
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Configuration class for the Klarna instance.
+ *
+ * KlarnaConfig stores added fields in JSON, it also prepends.<br>
+ * Loads/saves specified file, or default file, if {@link KlarnaConfig::$store}
+ * is set to true.<br>
+ *
+ * You add settings using the ArrayAccess:<br>
+ * $arr['field'] = $val or $arr->offsetSet('field', $val);<br>
+ *
+ * Available settings are:<br>
+ * eid         - Merchant ID (int)
+ * secret      - Shared secret (string)
+ * country     - Country constant or code  (int|string)
+ * language    - Language constant or code (int|string)
+ * currency    - Currency constant or code (int|string)
+ * mode        - Klarna::BETA or Klarna::LIVE
+ * ssl         - Use HTTPS or HTTP. (bool)
+ * candice     - Status reporting to Klarna, to detect erroneous
+ *               integrations, etc. (bool)
+ * pcStorage   - Storage module, e.g. 'json'
+ * pcURI       - URI to where the PClasses are stored, e.g.
+ *               '/srv/shop/pclasses.json'
+ * xmlrpcDebug - XMLRPC debugging (bool)
+ * debug       - Normal debugging (bool)
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaConfig implements ArrayAccess
+{
+
+    /**
+     * An array containing all the options for this config.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var array
+     */
+    protected $options;
+
+    /**
+     * If set to true, saves the config.
+     *
+     * @var bool
+     */
+    public static $store = true;
+
+    /**
+     * URI to the config file.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var string
+     */
+    protected $file;
+
+    /**
+     * Class constructor
+     *
+     * Loads specified file, or default file,
+     * if {@link KlarnaConfig::$store} is set to true.
+     *
+     * @param string $file URI to config file, e.g. ./config.json
+     */
+    public function __construct($file = null)
+    {
+        $this->options = array();
+        if ($file) {
+            $this->file = $file;
+            if (is_readable($this->file)) {
+                $this->options = json_decode(
+                    file_get_contents(
+                        $this->file
+                    ), true
+                );
+            }
+        }
+    }
+
+    /**
+     * Clears the config.
+     *
+     * @return void
+     */
+    public function clear()
+    {
+        $this->options = array();
+    }
+
+    /**
+     * Class destructor
+     *
+     * Saves specified file, or default file,
+     * if {@link KlarnaConfig::$store} is set to true.
+     */
+    public function __destruct()
+    {
+        if (self::$store && $this->file) {
+            if ((!file_exists($this->file)
+                && is_writable(dirname($this->file)))
+                || is_writable($this->file)
+            ) {
+                file_put_contents($this->file, json_encode($this->options));
+            }
+        }
+    }
+
+    /**
+     * Returns true whether the field exists.
+     *
+     * @param mixed $offset field
+     *
+     * @return bool
+     */
+    public function offsetExists($offset)
+    {
+        return isset($this->options[$offset]);
+    }
+
+    /**
+     * Used to get the value of a field.
+     *
+     * @param mixed $offset field
+     *
+     * @return mixed
+     */
+    public function offsetGet($offset)
+    {
+        if (!$this->offsetExists($offset)) {
+            return null;
+        }
+        return $this->options[$offset];
+    }
+
+    /**
+     * Used to set a value to a field.
+     *
+     * @param mixed $offset field
+     * @param mixed $value  value
+     *
+     * @return void
+     */
+    public function offsetSet($offset, $value)
+    {
+        $this->options[$offset] = $value;
+    }
+
+    /**
+     * Removes the specified field.
+     *
+     * @param mixed $offset field
+     *
+     * @return void
+     */
+    public function offsetUnset($offset)
+    {
+        unset($this->options[$offset]);
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/klarnapclass.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/klarnapclass.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/klarnapclass.php	(revision 5261)
@@ -0,0 +1,573 @@
+<?php
+/**
+ * KlarnaPClass
+ *
+ * PHP Version 5.3
+ *
+ * @ignore  Do not show in PHPDoc.
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * PClass object used for part payment.
+ *
+ * PClasses are used in conjunction with KlarnaCalc to determine part payment costs.
+ *
+ * @ignore    Do not show in PHPDoc.
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class KlarnaPClass
+{
+
+    /**
+     * Invoice type/identifier, used for invoice purchases.
+     *
+     * @var int
+     */
+    const INVOICE = -1;
+
+    /**
+     * Campaign type pclass.
+     *
+     * @var int
+     */
+    const CAMPAIGN = 0;
+
+    /**
+     * Account type pclass.
+     *
+     * @var int
+     */
+    const ACCOUNT = 1;
+
+    /**
+     * Special campaign type pclass.<br>
+     * "Buy now, pay in x month"<br>
+     *
+     * @var int
+     */
+    const SPECIAL = 2;
+
+    /**
+     * Fixed campaign type pclass
+     *
+     * @var int
+     */
+    const FIXED = 3;
+
+    /**
+     * Delayed campaign type pclass.<br>
+     * "Pay in X months"<br>
+     *
+     * @var int
+     */
+    const DELAY = 4;
+
+    /**
+     * Klarna Mobile type pclass
+     *
+     * @var int
+     */
+    const MOBILE = 5;
+
+    /**
+     * The description for this PClass.
+     * HTML entities for special characters.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var string
+     */
+    protected $description;
+
+    /**
+     * Number of months for this PClass.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var int
+     */
+    protected $months;
+
+    /**
+     * PClass starting fee.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var float
+     */
+    protected $startFee;
+
+    /**
+     * PClass invoice/handling fee.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var float
+     */
+    protected $invoiceFee;
+
+    /**
+     * PClass interest rate.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var float
+     */
+    protected $interestRate;
+
+    /**
+     * PClass minimum amount for purchase/product.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var float
+     */
+    protected $minAmount;
+
+    /**
+     * PClass country.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @see KlarnaCountry
+     * @var int
+     */
+    protected $country;
+
+    /**
+     * PClass ID.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * PClass type.
+     *
+     * @see self::CAMPAIGN
+     * @see self::ACCOUNT
+     * @see self::SPECIAL
+     * @see self::FIXED
+     * @see self::DELAY
+     * @see self::MOBILE
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var int
+     */
+    protected $type;
+
+    /**
+     * Expire date / valid until date as unix timestamp.<br>
+     * Compare it with e.g. $_SERVER['REQUEST_TIME'].<br>
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var int
+     */
+    protected $expire;
+
+    /**
+     * Merchant ID / Estore ID.
+     *
+     * @ignore Do not show in PHPDoc.
+     * @var int
+     */
+    protected $eid;
+
+    /**
+     * Class constructor
+     *
+     * The optional array argument can be:
+     * array (
+     *   0 = eid (this is created in the API)
+     *   1 = id number
+     *   2 = description
+     *   3 = amount of months for part payment
+     *   4 = start fee
+     *   5 = invoice fee
+     *   6 = interest rate
+     *   7 = minimum purchase amount for pclass
+     *   8 = country
+     *   9 = type
+     *     (This is used to determine which pclass-id is an account and
+     *     a campaign, 0 = campaign, 1 = account, 2 = special campaign
+     *     i.e. x-mas campaign)
+     *  10 = expire date
+     *
+     * @param null|array $arr Associative or numeric array of PClass data.
+     */
+    public function __construct($arr = null)
+    {
+        if (!is_array($arr) || count($arr) < 11) {
+            return;
+        }
+
+        foreach ($arr as $key => $val) {
+            switch($key) {
+            case "0":
+            case "eid":
+                $this->setEid($val);
+                break;
+            case "1":
+            case "id":
+                $this->setId($val);
+                break;
+            case "2":
+            case "desc":
+            case "description":
+                $this->setDescription($val);
+                break;
+            case "3":
+            case "months":
+                $this->setMonths($val);
+                break;
+            case "4":
+            case "startfee":
+                $this->setStartFee($val);
+                break;
+            case "5":
+            case "invoicefee":
+                $this->setInvoiceFee($val);
+                break;
+            case "6":
+            case "interestrate":
+                $this->setInterestRate($val);
+                break;
+            case "7":
+            case "minamount":
+                $this->setMinAmount($val);
+                break;
+            case "8":
+            case "country":
+                $this->setCountry($val);
+                break;
+            case "9":
+            case "type":
+                $this->setType($val);
+                break;
+            case "10":
+            case "expire":
+                $this->setExpire($val);
+                break;
+            default:
+                //Array index not supported.
+                break;
+            }
+        }
+    }
+
+    /**
+     * Returns an associative array mirroring this PClass.
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        return array(
+                'eid'          => $this->eid,
+                'id'           => $this->id,
+                'description'  => $this->description,
+                'months'       => $this->months,
+                'startfee'     => $this->startFee,
+                'invoicefee'   => $this->invoiceFee,
+                'interestrate' => $this->interestRate,
+                'minamount'    => $this->minAmount,
+                'country'      => $this->country,
+                'type'         => $this->type,
+                'expire'       => $this->expire
+        );
+    }
+
+    /**
+     * Sets the descriptiton, converts to HTML entities.
+     *
+     * @param string $description PClass description.
+     *
+     * @return void
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * Sets the number of months.
+     *
+     * @param int $months Number of months.
+     *
+     * @return void
+     */
+    public function setMonths($months)
+    {
+        $this->months = intval($months);
+    }
+
+    /**
+     * Sets the starting fee.
+     *
+     * @param float $startFee Starting fee.
+     *
+     * @return void
+     */
+    public function setStartFee($startFee)
+    {
+        $this->startFee = floatval($startFee);
+    }
+
+    /**
+     * Sets the invoicing/handling fee.
+     *
+     * @param float $invoiceFee Invoicing fee.
+     *
+     * @return void
+     */
+    public function setInvoiceFee($invoiceFee)
+    {
+        $this->invoiceFee = floatval($invoiceFee);
+    }
+
+    /**
+     * Sets the interest rate.
+     *
+     * @param float $interestRate Interest rate.
+     *
+     * @return void
+     */
+    public function setInterestRate($interestRate)
+    {
+        $this->interestRate = floatval($interestRate);
+    }
+
+    /**
+     * Sets the Minimum amount to use this PClass.
+     *
+     * @param float $minAmount Minimum amount.
+     *
+     * @return void
+     */
+    public function setMinAmount($minAmount)
+    {
+        $this->minAmount = floatval($minAmount);
+    }
+
+    /**
+     * Sets the country for this PClass.
+     *
+     * @param int $country {@link KlarnaCountry} constant.
+     *
+     * @see KlarnaCountry
+     *
+     * @return void
+     */
+    public function setCountry($country)
+    {
+        $this->country = intval($country);
+    }
+
+    /**
+     * Sets the ID for this pclass.
+     *
+     * @param int $id PClass identifier.
+     *
+     * @return void
+     */
+    public function setId($id)
+    {
+        $this->id = intval($id);
+    }
+
+    /**
+     * Sets the type for this pclass.
+     *
+     * @param int $type PClass type identifier.
+     *
+     * @see self::CAMPAIGN
+     * @see self::ACCOUNT
+     * @see self::SPECIAL
+     * @see self::FIXED
+     * @see self::DELAY
+     * @see self::MOBILE
+     *
+     * @return void
+     */
+    public function setType($type)
+    {
+        $this->type = intval($type);
+    }
+
+
+    /**
+     * Returns the ID for this PClass.
+     *
+     * @return int  PClass identifier.
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Returns this PClass's type.
+     *
+     * @see self::CAMPAIGN
+     * @see self::ACCOUNT
+     * @see self::SPECIAL
+     * @see self::FIXED
+     * @see self::DELAY
+     * @see self::MOBILE
+     *
+     * @return int  PClass type identifier.
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Returns the Merchant ID or Estore ID connected to this PClass.
+     *
+     * @return int
+     */
+    public function getEid()
+    {
+        return $this->eid;
+    }
+
+    /**
+     * Merchant ID or Estore ID connected to this PClass.
+     *
+     * @param int $eid Merchant ID.
+     *
+     * @return void
+     */
+    public function setEid($eid)
+    {
+        $this->eid = intval($eid);
+    }
+
+    /**
+     * Checks whether this PClass is valid.
+     *
+     * @param int $now Unix timestamp
+     *
+     * @return bool
+     */
+    public function isValid($now = null)
+    {
+        if ($this->expire == null
+            || $this->expire == '-'
+            || $this->expire <= 0
+        ) {
+            //No expire, or unset? assume valid.
+            return true;
+        }
+
+        if ($now === null || !is_numeric($now)) {
+            $now = time();
+        }
+
+        //If now is before expire, it is still valid.
+        return ($now > $this->expire) ? false : true;
+    }
+
+    /**
+     * Returns the valid until/expire date unix timestamp.
+     *
+     * @return int
+     */
+    public function getExpire()
+    {
+        return $this->expire;
+    }
+
+    /**
+     * Sets the valid until/expire date unix timestamp.
+     *
+     * @param int $expire unix timestamp for expire
+     *
+     * @return void
+     */
+    public function setExpire($expire)
+    {
+        $this->expire = $expire;
+    }
+
+    /**
+     * Returns the description for this PClass.
+     *
+     * <b>Note</b>:<br>
+     * Encoded with HTML entities.
+     *
+     * @return string  PClass description.
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Returns the number of months for this PClass.
+     *
+     * @return int  Number of months.
+     */
+    public function getMonths()
+    {
+        return $this->months;
+    }
+
+    /**
+     * Returns the starting fee for this PClass.
+     *
+     * @return float  Starting fee.
+     */
+    public function getStartFee()
+    {
+        return $this->startFee;
+    }
+
+    /**
+     * Returns the invoicing/handling fee for this PClass.
+     *
+     * @return float  Invoicing fee.
+     */
+    public function getInvoiceFee()
+    {
+        return $this->invoiceFee;
+    }
+
+    /**
+     * Returns the interest rate for this PClass.
+     *
+     * @return float  Interest rate.
+     */
+    public function getInterestRate()
+    {
+        return $this->interestRate;
+    }
+
+    /**
+     * Returns the minimum order/product amount for which this PClass is allowed.
+     *
+     * @return float  Minimum amount to use this PClass.
+     */
+    public function getMinAmount()
+    {
+        return $this->minAmount;
+    }
+
+    /**
+     * Returns the country related to this PClass.
+     *
+     * @see KlarnaCountry
+     * @return int {@link KlarnaCountry} constant.
+     */
+    public function getCountry()
+    {
+        return $this->country;
+    }
+
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/pclasses/jsonstorage.class.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/pclasses/jsonstorage.class.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/pclasses/jsonstorage.class.php	(revision 5261)
@@ -0,0 +1,150 @@
+<?php
+/**
+ * JsonStorage
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Include the {@link PCStorage} interface.
+ */
+require_once 'storage.intf.php';
+
+/**
+ * JSON storage class for KlarnaPClass
+ *
+ * This class is an JSON implementation of the PCStorage interface.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+class JSONStorage extends PCStorage
+{
+
+
+    /**
+     * return the name of the storage type
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return "json";
+    }
+
+    /**
+     * Checks if the file is writeable, readable or if the directory is.
+     *
+     * @param string $jsonFile json file that holds the pclasses
+     *
+     * @throws error
+     * @return void
+     */
+    protected function checkURI($jsonFile)
+    {
+        //If file doesn't exist, check the directory.
+        if (!file_exists($jsonFile)) {
+            $jsonFile = dirname($jsonFile);
+        }
+
+        if (!is_writable($jsonFile)) {
+            throw new Klarna_FileNotWritableException($jsonFile);
+        }
+
+        if (!is_readable($jsonFile)) {
+            throw new Klarna_FileNotReadableException($jsonFile);
+        }
+    }
+
+    /**
+     * Clear the pclasses
+     *
+     * @param string $uri uri to file to clear
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function clear($uri)
+    {
+        $this->checkURI($uri);
+        unset($this->pclasses);
+        if (file_exists($uri)) {
+            unlink($uri);
+        }
+    }
+
+    /**
+     * Load pclasses from file
+     *
+     * @param string $uri uri to file to load
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function load($uri)
+    {
+        $this->checkURI($uri);
+        if (!file_exists($uri)) {
+            //Do not fail, if file doesn't exist.
+            return;
+        }
+        $arr = json_decode(file_get_contents($uri), true);
+
+        if (count($arr) == 0) {
+            return;
+        }
+
+        foreach ($arr as $pclasses) {
+            if (count($pclasses) == 0) {
+                continue;
+            }
+            foreach ($pclasses as $pclass) {
+                $this->addPClass(new KlarnaPClass($pclass));
+            }
+        }
+    }
+
+    /**
+     * Save pclasses to file
+     *
+     * @param string $uri uri to file to save
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function save($uri)
+    {
+        try {
+            $this->checkURI($uri);
+
+            $output = array();
+            foreach ($this->pclasses as $eid => $pclasses) {
+                foreach ($pclasses as $pclass) {
+                    if (!isset($output[$eid])) {
+                        $output[$eid] = array();
+                    }
+                    $output[$eid][] = $pclass->toArray();
+                }
+            }
+            if (count($this->pclasses) > 0) {
+                file_put_contents($uri, json_encode($output));
+            } else {
+                file_put_contents($uri, "");
+            }
+        } catch(Exception $e) {
+            throw new KlarnaException($e->getMessage());
+        }
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/pclasses/mysqlstorage.class.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/pclasses/mysqlstorage.class.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/pclasses/mysqlstorage.class.php	(revision 5261)
@@ -0,0 +1,335 @@
+<?php
+/**
+ * MySQL Storage
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Include the {@link PCStorage} interface.
+ */
+require_once 'storage.intf.php';
+
+/**
+ * MySQL storage class for KlarnaPClass
+ *
+ * This class is an MySQL implementation of the PCStorage interface.<br>
+ * Config field pcURI needs to match format:
+ * user:passwd@addr:port/dbName.dbTable<br>
+ * Port can be omitted.<br>
+ *
+ * <b>Acceptable characters</b>:<br>
+ * Username: [A-Za-z0-9_]<br>
+ * Password: [A-Za-z0-9_]<br>
+ * Address:  [A-Za-z0-9_.]<br>
+ * Port:     [0-9]<br>
+ * DB name:  [A-Za-z0-9_]<br>
+ * DB table: [A-Za-z0-9_]<br>
+ *
+ * To allow for more special characters, and to avoid having<br>
+ * a regular expression that is too hard to understand, you can<br>
+ * use an associative array:<br>
+ * <code>
+ * array(
+ *   "user" => "myuser",
+ *   "passwd" => "mypass",
+ *   "dsn" => "localhost",
+ *   "db" => "mydatabase",
+ *   "table" => "mytable"
+ * );
+ * </code>
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class MySQLStorage extends PCStorage
+{
+
+    /**
+     * Database name.
+     *
+     * @var string
+     */
+    protected $dbName;
+
+    /**
+     * Database table.
+     *
+     * @var string
+     */
+    protected $dbTable;
+
+    /**
+     * Database address.
+     *
+     * @var string
+     */
+    protected $addr;
+
+    /**
+     * Database username.
+     *
+     * @var string
+     */
+    protected $user;
+
+    /**
+     * Database password.
+     *
+     * @var string
+     */
+    protected $passwd;
+
+    /**
+     * MySQL DB link resource.
+     *
+     * @var resource
+     */
+    protected $link;
+
+    /**
+     * return the name of the storage type
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return "mysql";
+    }
+
+    /**
+     * Connects to the DB and checks if DB and table exists.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    protected function connect()
+    {
+        $this->link = mysql_connect($this->addr, $this->user, $this->passwd);
+        if ($this->link === false) {
+            throw new Klarna_DatabaseException(
+                'Failed to connect to database! ('.mysql_error().')'
+            );
+        }
+
+        if (!mysql_query(
+            "CREATE DATABASE IF NOT EXISTS `{$this->dbName}`",
+            $this->link
+        )
+        ) {
+            throw new Klarna_DatabaseException(
+                'Failed to create! ('.mysql_error().')'
+            );
+        }
+
+        $create = mysql_query(
+            "CREATE TABLE IF NOT EXISTS `{$this->dbName}`.`{$this->dbTable}` (
+                `eid` int(10) unsigned NOT NULL,
+                `id` int(10) unsigned NOT NULL,
+                `type` tinyint(4) NOT NULL,
+                `description` varchar(255) NOT NULL,
+                `months` int(11) NOT NULL,
+                `interestrate` decimal(11,2) NOT NULL,
+                `invoicefee` decimal(11,2) NOT NULL,
+                `startfee` decimal(11,2) NOT NULL,
+                `minamount` decimal(11,2) NOT NULL,
+                `country` int(11) NOT NULL,
+                `expire` int(11) NOT NULL,
+                KEY `id` (`id`)
+            )", $this->link
+        );
+
+        if (!$create) {
+            throw new Klarna_DatabaseException(
+                'Table not existing, failed to create! ('.mysql_error().')'
+            );
+        }
+    }
+
+    /**
+     * Splits the URI in format: user:passwd@addr/dbName.dbTable<br>
+     *
+     * To allow for more special characters, and to avoid having<br>
+     * a regular expression that is too hard to understand, you can<br>
+     * use an associative array:<br>
+     * <code>
+     * array(
+     *   "user" => "myuser",
+     *   "passwd" => "mypass",
+     *   "dsn" => "localhost",
+     *   "db" => "mydatabase",
+     *   "table" => "mytable"
+     * );
+     * </code>
+     *
+     * @param string|array $uri Specified URI to database and table.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    protected function splitURI($uri)
+    {
+        if (is_array($uri)) {
+            $this->user = $uri['user'];
+            $this->passwd = $uri['passwd'];
+            $this->addr = $uri['dsn'];
+            $this->dbName = $uri['db'];
+            $this->dbTable = $uri['table'];
+        } else if (preg_match(
+            '/^([\w-]+):([\w-]+)@([\w\.-]+|[\w\.-]+:[\d]+)\/([\w-]+).([\w-]+)$/',
+            $uri,
+            $arr
+        ) === 1
+        ) {
+            /*
+              [0] => user:passwd@addr/dbName.dbTable
+              [1] => user
+              [2] => passwd
+              [3] => addr
+              [4] => dbName
+              [5] => dbTable
+            */
+            if (count($arr) != 6) {
+                throw new Klarna_DatabaseException(
+                    'URI is invalid! Missing field or invalid characters used!'
+                );
+            }
+
+            $this->user = $arr[1];
+            $this->passwd = $arr[2];
+            $this->addr = $arr[3];
+            $this->dbName = $arr[4];
+            $this->dbTable = $arr[5];
+        } else {
+            throw new Klarna_DatabaseException(
+                'URI to MySQL is not valid! ( user:passwd@addr/dbName.dbTable )'
+            );
+        }
+    }
+
+    /**
+     * Load pclasses
+     *
+     * @param string $uri pclass uri
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function load($uri)
+    {
+        $this->splitURI($uri);
+        $this->connect();
+        $result = mysql_query(
+            "SELECT * FROM `{$this->dbName}`.`{$this->dbTable}`",
+            $this->link
+        );
+        if ($result === false) {
+            throw new Klarna_DatabaseException(
+                'SELECT query failed! ('.mysql_error().')'
+            );
+        }
+        while ($row = mysql_fetch_assoc($result)) {
+            $this->addPClass(new KlarnaPClass($row));
+        }
+    }
+
+    /**
+     * Save pclasses to database
+     *
+     * @param string $uri pclass uri
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function save($uri)
+    {
+        $this->splitURI($uri);
+
+        $this->connect();
+        if (!is_array($this->pclasses) || count($this->pclasses) == 0) {
+            return;
+        }
+
+        foreach ($this->pclasses as $pclasses) {
+            foreach ($pclasses as $pclass) {
+                //Remove the pclass if it exists.
+                mysql_query(
+                    "DELETE FROM `{$this->dbName}`.`{$this->dbTable}`
+                     WHERE `id` = '{$pclass->getId()}'
+                     AND `eid` = '{$pclass->getEid()}'"
+                );
+
+                //Insert it again.
+                $result = mysql_query(
+                    "INSERT INTO `{$this->dbName}`.`{$this->dbTable}`
+                       (`eid`,
+                        `id`,
+                        `type`,
+                        `description`,
+                        `months`,
+                        `interestrate`,
+                        `invoicefee`,
+                        `startfee`,
+                        `minamount`,
+                        `country`,
+                        `expire`
+                        )
+                     VALUES
+                       ('{$pclass->getEid()}',
+                        '{$pclass->getId()}',
+                        '{$pclass->getType()}',
+                        '{$pclass->getDescription()}',
+                        '{$pclass->getMonths()}',
+                        '{$pclass->getInterestRate()}',
+                        '{$pclass->getInvoiceFee()}',
+                        '{$pclass->getStartFee()}',
+                        '{$pclass->getMinAmount()}',
+                        '{$pclass->getCountry()}',
+                        '{$pclass->getExpire()}')", $this->link
+                );
+                if ($result === false) {
+                    throw new Klarna_DatabaseException(
+                        'INSERT INTO query failed! ('.mysql_error().')'
+                    );
+                }
+            }
+        }
+    }
+
+    /**
+     * Clear the pclasses
+     *
+     * @param string $uri pclass uri
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function clear($uri)
+    {
+        try {
+            $this->splitURI($uri);
+            unset($this->pclasses);
+            $this->connect();
+
+            mysql_query(
+                "DELETE FROM `{$this->dbName}`.`{$this->dbTable}`",
+                $this->link
+            );
+        } catch(Exception $e) {
+            throw new Klarna_DatabaseException(
+                $e->getMessage(), $e->getCode()
+            );
+        }
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/pclasses/sqlstorage.class.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/pclasses/sqlstorage.class.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/pclasses/sqlstorage.class.php	(revision 5261)
@@ -0,0 +1,473 @@
+<?php
+/**
+ * SQL Storage
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Include the {@link PCStorage} interface.
+ */
+require_once 'storage.intf.php';
+
+/**
+ * SQL storage class for KlarnaPClass
+ *
+ * This class is an MySQL implementation of the PCStorage interface.<br>
+ * Config field pcURI needs to match format:
+ * user:passwd@addr:port/dbName.dbTable<br>
+ * Port can be omitted.<br>
+ *
+ * <b>Acceptable characters</b>:<br>
+ * Username: [A-Za-z0-9_]<br>
+ * Password: [A-Za-z0-9_]<br>
+ * Address:  [A-Za-z0-9_.]<br>
+ * Port:     [0-9]<br>
+ * DB name:  [A-Za-z0-9_]<br>
+ * DB table: [A-Za-z0-9_]<br>
+ *
+ * To allow for more special characters, and to avoid having<br>
+ * a regular expression that is too hard to understand, you can<br>
+ * use an associative array:<br>
+ * <code>
+ * array(
+ *   "user" => "myuser",
+ *   "passwd" => "mypass",
+ *   "dsn" => "localhost",
+ *   "db" => "mydatabase",
+ *   "table" => "mytable"
+ * );
+ * </code>
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class SQLStorage extends PCStorage
+{
+
+    /**
+     * Database name.
+     *
+     * @var string
+     */
+    protected $dbName;
+
+    /**
+     * Database table.
+     *
+     * @var string
+     */
+    protected $dbTable;
+
+    /**
+     * Database address.
+     *
+     * @var string
+     */
+    protected $addr;
+
+    /**
+     * PDO DSN notation.
+     *
+     * @var string
+     */
+    protected $dsn;
+
+    /**
+     * Database username.
+     *
+     * @var string
+     */
+    protected $user;
+
+    /**
+     * Database password.
+     *
+     * @var string
+     */
+    protected $passwd;
+
+    /**
+     * PDO DB link resource.
+     *
+     * @var PDO
+     */
+    protected $pdo;
+
+    /**
+     * return the name of the storage type
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return "sql";
+    }
+
+    /**
+     * Splits the URI for the following formats:<br>
+     * user:passwd@addr/dbName.dbTable (assumes MySQL)<br>
+     * user:password@pdo:dsn/dbName.dbTable<br>
+     *
+     * To allow for more special characters, and to avoid having<br>
+     * a regular expression that is too hard to understand, you can<br>
+     * use an associative array:<br>
+     * <code>
+     * array(
+     *   "user" => "myuser",
+     *   "passwd" => "mypass",
+     *   "dsn" => "localhost",
+     *   "db" => "mydatabase",
+     *   "table" => "mytable"
+     * );
+     * </code>
+     *
+     * @param string|array $uri Specified URI to database and table.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    protected function splitURI($uri)
+    {
+        /* If you want to have some characters that would make the
+            regexp too complex, you can use an array as input instead. */
+        if (is_array($uri)) {
+            $this->user = $uri['user'];
+            $this->passwd = $uri['passwd'];
+            $this->dsn = $uri['dsn'];
+            $this->dbName = $uri['db'];
+            $this->dbTable = $uri['table'];
+
+            return array(
+                $uri,
+                $this->user,
+                $this->passwd,
+                $this->dsn,
+                $this->dbName,
+                $this->dbTable
+            );
+        }
+        $pdo_rex
+            = '/^([\w-]+):([\w-]+)@pdo:([\w.,:;\/ \\\t=\(\){}\*-]+)\/([\w-]+)'.
+            '.([\w-]+)$/';
+        $pcuri_rex
+            = '/^([\w-]+):([\w-]+)@([\w\.-]+|[\w\.-]+:[\d]+|[\w\.-]+:'.
+            '[\w\.\/-]+|:[\w\.\/-]+)\/([\w-]+).([\w-]+)$/';
+        $arr = null;
+        if (preg_match($pdo_rex, $uri, $arr) === 1) {
+            /*
+             * [0] => user:password@pdo:dsn/dbName.dbTable
+             * [1] => user
+             * [2] => passwd
+             * [3] => dsn
+             * [4] => dbName
+             * [5] => dbTable
+             */
+            if (count($arr) != 6) {
+                throw new Klarna_DatabaseException(
+                    'URI is invalid! Missing field or invalid characters used!'
+                );
+            }
+
+            $this->user = $arr[1];
+            $this->passwd = $arr[2];
+            $this->dsn = $arr[3];
+            $this->dbName = $arr[4];
+            $this->dbTable = $arr[5];
+        } else if (preg_match($pcuri_rex, $uri, $arr) === 1) {
+            //user:pass@127.0.0.1:3306/dbName.dbTable
+            //user:pass@localhost:/tmp/mysql.sock/dbName.dbTable
+            /*
+             * [0] => user:passwd@addr/dbName.dbTable
+             * [1] => user
+             * [2] => passwd
+             * [3] => addr
+             * [4] => dbName
+             * [5] => dbTable
+             */
+            if (count($arr) != 6) {
+                throw new Klarna_DatabaseException(
+                    'URI is invalid! Missing field or invalid characters used!'
+                );
+            }
+
+            $this->user = $arr[1];
+            $this->passwd = $arr[2];
+            $this->addr = $arr[3];
+            $this->port = 3306;
+            if (preg_match(
+                '/^([0-9.]+(:([0-9]+))?)$/', $this->addr, $tmp
+            ) === 1
+            ) {
+                if (isset($tmp[3])) {
+                    $this->port = $tmp[3];
+                }
+            }
+            $this->dbName = $arr[4];
+            $this->dbTable = $arr[5];
+            $this->dsn = "mysql:host={$this->addr};port={$this->port};";
+        } else {
+            throw new Klarna_DatabaseException(
+                'URI to SQL is not valid! ( user:passwd@addr/dbName.dbTable )'
+            );
+        }
+
+        return $arr;
+    }
+
+    /**
+     * Grabs the PDO connection to the database, specified by the URI.
+     *
+     * @param string $uri pclass uri
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    protected function getConnection($uri)
+    {
+        if ($this->pdo) {
+            return; //Already have a connection
+        }
+
+        $this->splitURI($uri);
+
+        try {
+            $this->pdo = new PDO($this->dsn, $this->user, $this->passwd);
+            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+        } catch (PDOException $e) {
+            throw new Klarna_DatabaseException('Failed to connect to database!');
+        }
+    }
+
+    /**
+     * Initializes the DB, if the database or table is missing.
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    protected function initDB()
+    {
+        try {
+            $this->pdo->exec("CREATE DATABASE `{$this->dbName}`");
+        } catch (PDOException $e) {
+            //SQLite does not support this...
+            //throw new KlarnaException(
+            //  'Database non-existant, failed to create it!'
+            //);
+        }
+
+        $sql = <<<SQL
+            CREATE TABLE IF NOT EXISTS `{$this->dbName}`.`{$this->dbTable}` (
+                `eid` int(10) NOT NULL,
+                `id` int(10) NOT NULL,
+                `type` int(4) NOT NULL,
+                `description` varchar(255) NOT NULL,
+                `months` int(11) NOT NULL,
+                `interestrate` decimal(11,2) NOT NULL,
+                `invoicefee` decimal(11,2) NOT NULL,
+                `startfee` decimal(11,2) NOT NULL,
+                `minamount` decimal(11,2) NOT NULL,
+                `country` int(11) NOT NULL,
+                `expire` int(11) NOT NULL
+            );
+SQL;
+        try {
+            $this->pdo->exec($sql);
+        } catch (PDOException $e) {
+            throw new Klarna_DatabaseException(
+                'Table non-existant, failed to create it!'
+            );
+        }
+    }
+
+    /**
+     * Connects to the DB and checks if DB and table exists.
+     *
+     * @param string|array $uri pclass uri
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    protected function connect($uri)
+    {
+        $this->getConnection($uri);
+        $this->initDB();
+    }
+
+    /**
+     * Loads the PClasses.
+     *
+     * @param string|array $uri pclass uri
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    public function load($uri)
+    {
+        $this->connect($uri);
+        $this->loadPClasses();
+    }
+
+    /**
+     * Loads the PClasses.
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    protected function loadPClasses()
+    {
+        try {
+            $sth = $this->pdo->prepare(
+                "SELECT * FROM `{$this->dbName}`.`{$this->dbTable}`",
+                array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)
+            );
+            $sth->execute();
+
+            while ($row = $sth->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {
+                $this->addPClass(new KlarnaPClass($row));
+            }
+
+            $sth->closeCursor();
+            $sth = null;
+        } catch (PDOException $e) {
+            throw new Klarna_DatabaseException(
+                'Could not fetch PClasses from database!'
+            );
+        }
+    }
+
+    /**
+     * Saves the PClasses.
+     *
+     * @param string|array $uri pclass uri
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    public function save($uri)
+    {
+        $this->connect($uri);
+        //Only attempt to savePClasses if there are any.
+        if (!is_array($this->pclasses)) {
+            return;
+        }
+        if (count($this->pclasses) == 0) {
+            return;
+        }
+        $this->savePClasses();
+    }
+
+    /**
+     * Saves the PClasses.
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    protected function savePClasses()
+    {
+        //Insert PClass SQL statement.
+        $sql = <<<SQL
+            INSERT INTO `{$this->dbName}`.`{$this->dbTable}`
+                (`eid`, `id`, `type`, `description`, `months`, `interestrate`,
+       	         `invoicefee`, `startfee`, `minamount`, `country`, `expire`)
+           	VALUES
+                (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+SQL;
+
+        foreach ($this->pclasses as $pclasses) {
+            foreach ($pclasses as $pclass) {
+                try {
+                    //Remove the pclass if it exists.
+                    $sth = $this->pdo->prepare(
+                        "DELETE FROM `{$this->dbName}`.`{$this->dbTable}`
+                        WHERE `id` = ? AND `eid` = ?"
+                    );
+                    $sth->execute(
+                        array(
+                            $pclass->getId(), $pclass->getEid()
+                        )
+                    );
+
+                    $sth->closeCursor();
+                    $sth = null;
+                } catch(PDOException $e) {
+                    //Fail silently, we don't care if the removal failed.
+                }
+
+                try {
+                    //Attempt to insert the PClass into the DB.
+                    $sth = $this->pdo->prepare($sql);
+                    $sth->execute(
+                        array(
+                            $pclass->getEid(),
+                            $pclass->getId(),
+                            $pclass->getType(),
+                            $pclass->getDescription(),
+                            $pclass->getMonths(),
+                            $pclass->getInterestRate(),
+                            $pclass->getInvoiceFee(),
+                            $pclass->getStartFee(),
+                            $pclass->getMinAmount(),
+                            $pclass->getCountry(),
+                            $pclass->getExpire()
+                        )
+                    );
+
+                    $sth->closeCursor();
+                    $sth = null;
+                } catch(PDOException $e) {
+                    throw new Klarna_DatabaseException(
+                        'Failed to insert PClass into database!'
+                    );
+                }
+            }
+        }
+    }
+
+    /**
+     * Drops the database table, to clear the PClasses.
+     *
+     * @param string|array $uri pclass uri
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    public function clear($uri)
+    {
+        try {
+            $this->connect($uri);
+            unset($this->pclasses);
+            $this->clearTable();
+        } catch(Exception $e) {
+            throw new Klarna_DatabaseException(
+                $e->getMessage(), $e->getCode()
+            );
+        }
+    }
+
+    /**
+     * Drops the database table, to clear the PClasses.
+     *
+     * @return void
+     * @throws KlarnaException
+     */
+    protected function clearTable()
+    {
+        try {
+            $this->pdo->exec("DELETE FROM `{$this->dbName}`.`{$this->dbTable}`");
+        } catch (PDOException $e) {
+            throw new Klarna_DatabaseException('Could not clear the database!');
+        }
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/pclasses/storage.intf.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/pclasses/storage.intf.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/pclasses/storage.intf.php	(revision 5261)
@@ -0,0 +1,229 @@
+<?php
+/**
+ * PClass Storage Interface
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * KlarnaPClass Storage interface
+ *
+ * This class provides an interface with which to save the PClasses easily.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+abstract class PCStorage
+{
+
+    /**
+     * An array of KlarnaPClasses.
+     *
+     * @var array
+     */
+    protected $pclasses;
+
+    /**
+     * Thhe name of the implementation.
+     * The file should be <name>storage.class.php
+     *
+     * @return string
+     */
+    abstract public function getName();
+
+    /**
+     * Adds a PClass to the storage.
+     *
+     * @param KlarnaPClass $pclass PClass object.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function addPClass($pclass)
+    {
+        if (! $pclass instanceof KlarnaPClass) {
+            throw new Klarna_InvalidTypeException('pclass', 'KlarnaPClass');
+        }
+
+        if (!isset($this->pclasses) || !is_array($this->pclasses)) {
+            $this->pclasses = array();
+        }
+
+        if ($pclass->getDescription() === null || $pclass->getType() === null) {
+            //Something went wrong, do not save these!
+            return;
+        }
+
+        if (!isset($this->pclasses[$pclass->getEid()])) {
+            $this->pclasses[$pclass->getEid()] = array();
+        }
+        $this->pclasses[$pclass->getEid()][$pclass->getId()] = $pclass;
+    }
+
+    /**
+     * Gets the PClass by ID.
+     *
+     * @param int $id      PClass ID.
+     * @param int $eid     Merchant ID.
+     * @param int $country {@link KlarnaCountry Country} constant.
+     *
+     * @throws KlarnaException
+     * @return KlarnaPClass
+     */
+    public function getPClass($id, $eid, $country)
+    {
+        if (!is_int($id)) {
+            throw new InvalidArgumentException('Supplied ID is not an integer!');
+        }
+
+        if (!is_array($this->pclasses)) {
+            throw new Klarna_PClassException('No match for that eid!');
+        }
+
+        if (!isset($this->pclasses[$eid]) || !is_array($this->pclasses[$eid])) {
+            throw new Klarna_PClassException('No match for that eid!');
+        }
+
+        if (!isset($this->pclasses[$eid][$id])
+            || !$this->pclasses[$eid][$id]->isValid()
+        ) {
+            throw new Klarna_PClassException('No such pclass available!');
+        }
+
+        if ($this->pclasses[$eid][$id]->getCountry() !== $country) {
+            throw new Klarna_PClassException(
+                'You cannot use this pclass with set country!'
+            );
+        }
+
+        return $this->pclasses[$eid][$id];
+    }
+
+    /**
+     * Returns an array of KlarnaPClasses, keyed with pclass ID.
+     * If type is specified, only that type will be returned.
+     *
+     * <b>Types available</b>:<br>
+     * {@link KlarnaPClass::ACCOUNT}<br>
+     * {@link KlarnaPClass::CAMPAIGN}<br>
+     * {@link KlarnaPClass::SPECIAL}<br>
+     * {@link KlarnaPClass::DELAY}<br>
+     * {@link KlarnaPClass::MOBILE}<br>
+     *
+     * @param int $eid     Merchant ID.
+     * @param int $country {@link KlarnaCountry Country} constant.
+     * @param int $type    PClass type identifier.
+     *
+     * @throws KlarnaException
+     * @return array An array of {@link KlarnaPClass PClasses}.
+     */
+    public function getPClasses($eid, $country, $type = null)
+    {
+        if (!is_int($country)) {
+            throw new Klarna_ArgumentNotSetException('country');
+        }
+
+        $tmp = false;
+        if (!is_array($this->pclasses)) {
+            return;
+        }
+
+        $tmp = array();
+        foreach ($this->pclasses as $eid => $pclasses) {
+            $tmp[$eid] = array();
+
+            foreach ($pclasses as $pclass) {
+                if (!$pclass->isValid()) {
+                    continue; //Pclass invalid, skip it.
+                }
+                if ($pclass->getEid() === $eid
+                    && $pclass->getCountry() === $country
+                    && ($pclass->getType() === $type || $type === null)
+                ) {
+                    $tmp[$eid][$pclass->getId()] = $pclass;
+                }
+            }
+        }
+
+        return $tmp;
+    }
+
+    /**
+     * Returns a flattened array of all pclasses
+     *
+     * @return array
+     */
+    public function getAllPClasses()
+    {
+        if (!is_array($this->pclasses)) {
+            return array();
+        }
+        return $this->_flatten(array_values($this->pclasses));
+    }
+
+    /**
+     * Flatten an array
+     *
+     * @param array $array array to flatten
+     *
+     * @return array
+     */
+    private function _flatten($array)
+    {
+        if (!is_array($array)) {
+            // nothing to do if it's not an array
+            return array($array);
+        }
+        $result = array();
+        foreach ($array as $value) {
+            // explode the sub-array, and add the parts
+            $result = array_merge($result, $this->_flatten($value));
+        }
+        return $result;
+    }
+
+    /**
+     * Loads the PClasses and calls {@link self::addPClass()} to store them
+     * in runtime.
+     * URI can be location to a file, or a db prefixed table.
+     *
+     * @param string $uri URI to stored PClasses.
+     *
+     * @throws KlarnaException|Exception
+     * @return void
+     */
+    abstract public function load($uri);
+
+    /**
+     * Takes the internal PClass array and stores it.
+     * URI can be location to a file, or a db prefixed table.
+     *
+     * @param string $uri URI to stored PClasses.
+     *
+     * @throws KlarnaException|Exception
+     * @return void
+     */
+    abstract public function save($uri);
+
+    /**
+     * Removes the internally stored pclasses.
+     *
+     * @param string $uri URI to stored PClasses.
+     *
+     * @throws KlarnaException|Exception
+     * @return void
+     */
+    abstract public function clear($uri);
+
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/pclasses/xmlstorage.class.php
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/pclasses/xmlstorage.class.php	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/pclasses/xmlstorage.class.php	(revision 5261)
@@ -0,0 +1,280 @@
+<?php
+/**
+ * XMLStorage
+ *
+ * PHP Version 5.3
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+
+/**
+ * Include the {@link PCStorage} interface.
+ */
+require_once 'storage.intf.php';
+
+/**
+ * XML storage class for KlarnaPClass
+ *
+ * This class is an XML implementation of the PCStorage interface.
+ *
+ * @category  Payment
+ * @package   KlarnaAPI
+ * @author    MS Dev <ms.modules@klarna.com>
+ * @copyright 2012 Klarna AB (http://klarna.com)
+ * @license   http://opensource.org/licenses/BSD-2-Clause BSD-2
+ * @link      http://integration.klarna.com/
+ */
+class XMLStorage extends PCStorage
+{
+
+    /**
+     * The internal XML document.
+     *
+     * @var DOMDocument
+     */
+    protected $dom;
+
+    /**
+     * XML version for the DOM document.
+     *
+     * @var string
+     */
+    protected $version = '1.0';
+
+    /**
+     * Encoding for the DOM document.
+     *
+     * @var string
+     */
+    protected $encoding = 'ISO-8859-1';
+
+    /**
+     * Class constructor
+     */
+    public function __construct()
+    {
+        $this->dom = new DOMDocument($this->version, $this->encoding);
+        $this->dom->formatOutput = true;
+        $this->dom->preserveWhiteSpace = false;
+    }
+
+    /**
+     * return the name of the storage type
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return "xml";
+    }
+
+    /**
+     * Checks if the file is writeable, readable or if the directory is.
+     *
+     * @param string $xmlFile URI to XML file.
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    protected function checkURI($xmlFile)
+    {
+        //If file doesn't exist, check the directory.
+        if (!file_exists($xmlFile)) {
+            $xmlFile = dirname($xmlFile);
+        }
+
+        if (!is_writable($xmlFile)) {
+            throw new Klarna_FileNotWritableException($xmlFile);
+        }
+
+        if (!is_readable($xmlFile)) {
+            throw new Klarna_FileNotReadableException($xmlFile);
+        }
+    }
+
+
+    /**
+     * Load pclasses from file
+     *
+     * @param string $uri uri to file to load
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function load($uri)
+    {
+        $this->checkURI($uri);
+        if (!file_exists($uri)) {
+            //Do not fail, if file doesn't exist.
+            return;
+        }
+        if (!@$this->dom->load($uri)) {
+            throw new Klarna_XMLParseException($uri);
+        }
+
+        $xpath = new DOMXpath($this->dom);
+        foreach ($xpath->query('/klarna/estore') as $estore) {
+            $eid = $estore->getAttribute('id');
+
+            foreach ($xpath->query('pclass', $estore) as $node) {
+                $pclass = new KlarnaPClass();
+                $pclass->setId(
+                    $node->getAttribute('pid')
+                );
+                $pclass->setType(
+                    $node->getAttribute('type')
+                );
+                $pclass->setEid($eid);
+                $pclass->setDescription(
+                    $xpath->query('description', $node)->item(0)->textContent
+                );
+                $pclass->setMonths(
+                    $xpath->query('months', $node)->item(0)->textContent
+                );
+                $pclass->setStartFee(
+                    $xpath->query('startfee', $node)->item(0)->textContent
+                );
+                $pclass->setInvoiceFee(
+                    $xpath->query('invoicefee', $node)->item(0)->textContent
+                );
+                $pclass->setInterestRate(
+                    $xpath->query('interestrate', $node)->item(0)->textContent
+                );
+                $pclass->setMinAmount(
+                    $xpath->query('minamount', $node)->item(0)->textContent
+                );
+                $pclass->setCountry(
+                    $xpath->query('country', $node)->item(0)->textContent
+                );
+                $pclass->setExpire(
+                    $xpath->query('expire', $node)->item(0)->textContent
+                );
+
+                $this->addPClass($pclass);
+            }
+        }
+    }
+
+    /**
+     * Creates DOMElement for all fields for specified PClass.
+     *
+     * @param KlarnaPClass $pclass pclass object
+     *
+     * @return array Array of DOMElements.
+     */
+    protected function createFields($pclass)
+    {
+        $fields = array();
+
+        //This is to prevent HTMLEntities to be converted to the real character.
+        $fields[] = $this->dom->createElement('description');
+        end($fields)->appendChild(
+            $this->dom->createTextNode($pclass->getDescription())
+        );
+        $fields[] = $this->dom->createElement(
+            'months', $pclass->getMonths()
+        );
+        $fields[] = $this->dom->createElement(
+            'startfee', $pclass->getStartFee()
+        );
+        $fields[] = $this->dom->createElement(
+            'invoicefee', $pclass->getInvoiceFee()
+        );
+        $fields[] = $this->dom->createElement(
+            'interestrate', $pclass->getInterestRate()
+        );
+        $fields[] = $this->dom->createElement(
+            'minamount', $pclass->getMinAmount()
+        );
+        $fields[] = $this->dom->createElement(
+            'country', $pclass->getCountry()
+        );
+        $fields[] = $this->dom->createElement(
+            'expire', $pclass->getExpire()
+        );
+
+        return $fields;
+    }
+
+    /**
+     * Save pclasses to file
+     *
+     * @param string $uri uri to file to save
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function save($uri)
+    {
+        $this->checkURI($uri);
+
+        //Reset DOMDocument.
+        if (!$this->dom->loadXML(
+            "<?xml version='$this->version' encoding='$this->encoding'?"
+            ."><klarna/>"
+        )
+        ) {
+            throw new Klarna_XMLParseException($uri);
+        }
+
+        ksort($this->pclasses, SORT_NUMERIC);
+        $xpath = new DOMXpath($this->dom);
+
+        foreach ($this->pclasses as $eid => $pclasses) {
+            $estore = $xpath->query('/klarna/estore[@id="'.$eid.'"]');
+
+            if ($estore === false || $estore->length === 0) {
+                //No estore with matching eid, create it.
+                $estore = $this->dom->createElement('estore');
+                $estore->setAttribute('id', $eid);
+                $this->dom->documentElement->appendChild($estore);
+            } else {
+                $estore = $estore->item(0);
+            }
+
+            foreach ($pclasses as $pclass) {
+                if ($eid != $pclass->getEid()) {
+                    //This should never occur, failsafe.
+                    continue;
+                }
+
+                $pnode = $this->dom->createElement('pclass');
+
+                foreach ($this->createFields($pclass) as $field) {
+                    $pnode->appendChild($field);
+                }
+
+                $pnode->setAttribute('pid', $pclass->getId());
+                $pnode->setAttribute('type', $pclass->getType());
+
+                $estore->appendChild($pnode);
+            }
+        }
+
+        if (!$this->dom->save($uri)) {
+            throw new KlarnaException('Failed to save XML document!');
+        }
+    }
+
+    /**
+     * This uses unlink (delete) to clear the pclasses!
+     *
+     * @param string $uri uri to file to clear
+     *
+     * @throws KlarnaException
+     * @return void
+     */
+    public function clear($uri)
+    {
+        $this->checkURI($uri);
+        unset($this->pclasses);
+        if (file_exists($uri)) {
+            unlink($uri);
+        }
+    }
+}
Index: /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc.inc
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc.inc	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc.inc	(revision 5261)
@@ -0,0 +1,3776 @@
+<?php
+// by Edd Dumbill (C) 1999-2002
+// <edd@usefulinc.com>
+// $Id: xmlrpc.inc,v 1.174 2009/03/16 19:36:38 ggiunta Exp $
+
+// Copyright (c) 1999,2000,2002 Edd Dumbill.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    * Redistributions of source code must retain the above copyright
+//      notice, this list of conditions and the following disclaimer.
+//
+//    * Redistributions in binary form must reproduce the above
+//      copyright notice, this list of conditions and the following
+//      disclaimer in the documentation and/or other materials provided
+//      with the distribution.
+//
+//    * Neither the name of the "XML-RPC for PHP" nor the names of its
+//      contributors may be used to endorse or promote products derived
+//      from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+// OF THE POSSIBILITY OF SUCH DAMAGE.
+
+	if(!function_exists('xml_parser_create'))
+	{
+		// For PHP 4 onward, XML functionality is always compiled-in on windows:
+		// no more need to dl-open it. It might have been compiled out on *nix...
+		if(strtoupper(substr(PHP_OS, 0, 3) != 'WIN'))
+		{
+			dl('xml.so');
+		}
+	}
+
+	// G. Giunta 2005/01/29: declare global these variables,
+	// so that xmlrpc.inc will work even if included from within a function
+	// Milosch: 2005/08/07 - explicitly request these via $GLOBALS where used.
+	$GLOBALS['xmlrpcI4']='i4';
+	$GLOBALS['xmlrpcInt']='int';
+	$GLOBALS['xmlrpcBoolean']='boolean';
+	$GLOBALS['xmlrpcDouble']='double';
+	$GLOBALS['xmlrpcString']='string';
+	$GLOBALS['xmlrpcDateTime']='dateTime.iso8601';
+	$GLOBALS['xmlrpcBase64']='base64';
+	$GLOBALS['xmlrpcArray']='array';
+	$GLOBALS['xmlrpcStruct']='struct';
+	$GLOBALS['xmlrpcValue']='undefined';
+
+	$GLOBALS['xmlrpcTypes']=array(
+		$GLOBALS['xmlrpcI4']       => 1,
+		$GLOBALS['xmlrpcInt']      => 1,
+		$GLOBALS['xmlrpcBoolean']  => 1,
+		$GLOBALS['xmlrpcString']   => 1,
+		$GLOBALS['xmlrpcDouble']   => 1,
+		$GLOBALS['xmlrpcDateTime'] => 1,
+		$GLOBALS['xmlrpcBase64']   => 1,
+		$GLOBALS['xmlrpcArray']    => 2,
+		$GLOBALS['xmlrpcStruct']   => 3
+	);
+
+	$GLOBALS['xmlrpc_valid_parents'] = array(
+		'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
+		'BOOLEAN' => array('VALUE'),
+		'I4' => array('VALUE'),
+		'INT' => array('VALUE'),
+		'STRING' => array('VALUE'),
+		'DOUBLE' => array('VALUE'),
+		'DATETIME.ISO8601' => array('VALUE'),
+		'BASE64' => array('VALUE'),
+		'MEMBER' => array('STRUCT'),
+		'NAME' => array('MEMBER'),
+		'DATA' => array('ARRAY'),
+		'ARRAY' => array('VALUE'),
+		'STRUCT' => array('VALUE'),
+		'PARAM' => array('PARAMS'),
+		'METHODNAME' => array('METHODCALL'),
+		'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
+		'FAULT' => array('METHODRESPONSE'),
+		'NIL' => array('VALUE'), // only used when extension activated
+		'EX:NIL' => array('VALUE') // only used when extension activated
+	);
+
+	// define extra types for supporting NULL (useful for json or <NIL/>)
+	$GLOBALS['xmlrpcNull']='null';
+	$GLOBALS['xmlrpcTypes']['null']=1;
+
+	// Not in use anymore since 2.0. Shall we remove it?
+	/// @deprecated
+	$GLOBALS['xmlEntities']=array(
+		'amp'  => '&',
+		'quot' => '"',
+		'lt'   => '<',
+		'gt'   => '>',
+		'apos' => "'"
+	);
+
+	// tables used for transcoding different charsets into us-ascii xml
+
+	$GLOBALS['xml_iso88591_Entities']=array();
+	$GLOBALS['xml_iso88591_Entities']['in'] = array();
+	$GLOBALS['xml_iso88591_Entities']['out'] = array();
+	for ($i = 0; $i < 32; $i++)
+	{
+		$GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);
+		$GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';
+	}
+	for ($i = 160; $i < 256; $i++)
+	{
+		$GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);
+		$GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';
+	}
+
+	/// @todo add to iso table the characters from cp_1252 range, i.e. 128 to 159?
+	/// These will NOT be present in true ISO-8859-1, but will save the unwary
+	/// windows user from sending junk (though no luck when reciving them...)
+  /*
+	$GLOBALS['xml_cp1252_Entities']=array();
+	for ($i = 128; $i < 160; $i++)
+	{
+		$GLOBALS['xml_cp1252_Entities']['in'][] = chr($i);
+	}
+	$GLOBALS['xml_cp1252_Entities']['out'] = array(
+		'&#x20AC;', '?',        '&#x201A;', '&#x0192;',
+		'&#x201E;', '&#x2026;', '&#x2020;', '&#x2021;',
+		'&#x02C6;', '&#x2030;', '&#x0160;', '&#x2039;',
+		'&#x0152;', '?',        '&#x017D;', '?',
+		'?',        '&#x2018;', '&#x2019;', '&#x201C;',
+		'&#x201D;', '&#x2022;', '&#x2013;', '&#x2014;',
+		'&#x02DC;', '&#x2122;', '&#x0161;', '&#x203A;',
+		'&#x0153;', '?',        '&#x017E;', '&#x0178;'
+	);
+  */
+
+	$GLOBALS['xmlrpcerr'] = array(
+	'unknown_method'=>1,
+	'invalid_return'=>2,
+	'incorrect_params'=>3,
+	'introspect_unknown'=>4,
+	'http_error'=>5,
+	'no_data'=>6,
+	'no_ssl'=>7,
+	'curl_fail'=>8,
+	'invalid_request'=>15,
+	'no_curl'=>16,
+	'server_error'=>17,
+	'multicall_error'=>18,
+	'multicall_notstruct'=>9,
+	'multicall_nomethod'=>10,
+	'multicall_notstring'=>11,
+	'multicall_recursion'=>12,
+	'multicall_noparams'=>13,
+	'multicall_notarray'=>14,
+
+	'cannot_decompress'=>103,
+	'decompress_fail'=>104,
+	'dechunk_fail'=>105,
+	'server_cannot_decompress'=>106,
+	'server_decompress_fail'=>107
+	);
+
+	$GLOBALS['xmlrpcstr'] = array(
+	'unknown_method'=>'Unknown method',
+	'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload',
+	'incorrect_params'=>'Incorrect parameters passed to method',
+	'introspect_unknown'=>"Can't introspect: method unknown",
+	'http_error'=>"Didn't receive 200 OK from remote server.",
+	'no_data'=>'No data received from server.',
+	'no_ssl'=>'No SSL support compiled in.',
+	'curl_fail'=>'CURL error',
+	'invalid_request'=>'Invalid request payload',
+	'no_curl'=>'No CURL support compiled in.',
+	'server_error'=>'Internal server error',
+	'multicall_error'=>'Received from server invalid multicall response',
+	'multicall_notstruct'=>'system.multicall expected struct',
+	'multicall_nomethod'=>'missing methodName',
+	'multicall_notstring'=>'methodName is not a string',
+	'multicall_recursion'=>'recursive system.multicall forbidden',
+	'multicall_noparams'=>'missing params',
+	'multicall_notarray'=>'params is not an array',
+
+	'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress',
+	'decompress_fail'=>'Received from server invalid compressed HTTP',
+	'dechunk_fail'=>'Received from server invalid chunked HTTP',
+	'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress',
+	'server_decompress_fail'=>'Received from client invalid compressed HTTP request'
+	);
+
+	// The charset encoding used by the server for received messages and
+	// by the client for received responses when received charset cannot be determined
+	// or is not supported
+	$GLOBALS['xmlrpc_defencoding']='UTF-8';
+
+	// The encoding used internally by PHP.
+	// String values received as xml will be converted to this, and php strings will be converted to xml
+	// as if having been coded with this
+	$GLOBALS['xmlrpc_internalencoding']='ISO-8859-1';
+
+	$GLOBALS['xmlrpcName']='XML-RPC for PHP';
+	$GLOBALS['xmlrpcVersion']='3.0.0.beta';
+
+	// let user errors start at 800
+	$GLOBALS['xmlrpcerruser']=800;
+	// let XML parse errors start at 100
+	$GLOBALS['xmlrpcerrxml']=100;
+
+	// formulate backslashes for escaping regexp
+	// Not in use anymore since 2.0. Shall we remove it?
+	/// @deprecated
+	$GLOBALS['xmlrpc_backslash']=chr(92).chr(92);
+
+	// set to TRUE to enable correct decoding of <NIL/> and <EX:NIL/> values
+	$GLOBALS['xmlrpc_null_extension']=false;
+
+	// set to TRUE to enable encoding of php NULL values to <EX:NIL/> instead of <NIL/>
+	$GLOBALS['xmlrpc_null_apache_encoding']=false;
+
+	// used to store state during parsing
+	// quick explanation of components:
+	//   ac - used to accumulate values
+	//   isf - used to indicate a parsing fault (2) or xmlrpcresp fault (1)
+	//   isf_reason - used for storing xmlrpcresp fault string
+	//   lv - used to indicate "looking for a value": implements
+	//        the logic to allow values with no types to be strings
+	//   params - used to store parameters in method calls
+	//   method - used to store method name
+	//   stack - array with genealogy of xml elements names:
+	//           used to validate nesting of xmlrpc elements
+	$GLOBALS['_xh']=null;
+
+	/**
+	* Convert a string to the correct XML representation in a target charset
+	* To help correct communication of non-ascii chars inside strings, regardless
+	* of the charset used when sending requests, parsing them, sending responses
+	* and parsing responses, an option is to convert all non-ascii chars present in the message
+	* into their equivalent 'charset entity'. Charset entities enumerated this way
+	* are independent of the charset encoding used to transmit them, and all XML
+	* parsers are bound to understand them.
+	* Note that in the std case we are not sending a charset encoding mime type
+	* along with http headers, so we are bound by RFC 3023 to emit strict us-ascii.
+	*
+	* @todo do a bit of basic benchmarking (strtr vs. str_replace)
+	* @todo	make usage of iconv() or recode_string() or mb_string() where available
+	*/
+	function xmlrpc_encode_entitites($data, $src_encoding='', $dest_encoding='')
+	{
+		if ($src_encoding == '')
+		{
+			// lame, but we know no better...
+			$src_encoding = $GLOBALS['xmlrpc_internalencoding'];
+		}
+
+		switch(strtoupper($src_encoding.'_'.$dest_encoding))
+		{
+			case 'ISO-8859-1_':
+			case 'ISO-8859-1_US-ASCII':
+				$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);
+				$escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data);
+				break;
+			case 'ISO-8859-1_UTF-8':
+				$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);
+				$escaped_data = utf8_encode($escaped_data);
+				break;
+			case 'ISO-8859-1_ISO-8859-1':
+			case 'US-ASCII_US-ASCII':
+			case 'US-ASCII_UTF-8':
+			case 'US-ASCII_':
+			case 'US-ASCII_ISO-8859-1':
+			case 'UTF-8_UTF-8':
+			//case 'CP1252_CP1252':
+				$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);
+				break;
+			case 'UTF-8_':
+			case 'UTF-8_US-ASCII':
+			case 'UTF-8_ISO-8859-1':
+	// NB: this will choke on invalid UTF-8, going most likely beyond EOF
+	$escaped_data = '';
+	// be kind to users creating string xmlrpcvals out of different php types
+	$data = (string) $data;
+	$ns = strlen ($data);
+	for ($nn = 0; $nn < $ns; $nn++)
+	{
+		$ch = $data[$nn];
+		$ii = ord($ch);
+		//1 7 0bbbbbbb (127)
+		if ($ii < 128)
+		{
+			/// @todo shall we replace this with a (supposedly) faster str_replace?
+			switch($ii){
+				case 34:
+					$escaped_data .= '&quot;';
+					break;
+				case 38:
+					$escaped_data .= '&amp;';
+					break;
+				case 39:
+					$escaped_data .= '&apos;';
+					break;
+				case 60:
+					$escaped_data .= '&lt;';
+					break;
+				case 62:
+					$escaped_data .= '&gt;';
+					break;
+				default:
+					$escaped_data .= $ch;
+			} // switch
+		}
+		//2 11 110bbbbb 10bbbbbb (2047)
+		else if ($ii>>5 == 6)
+		{
+			$b1 = ($ii & 31);
+			$ii = ord($data[$nn+1]);
+			$b2 = ($ii & 63);
+			$ii = ($b1 * 64) + $b2;
+			$ent = sprintf ('&#%d;', $ii);
+			$escaped_data .= $ent;
+			$nn += 1;
+		}
+		//3 16 1110bbbb 10bbbbbb 10bbbbbb
+		else if ($ii>>4 == 14)
+		{
+			$b1 = ($ii & 15);
+			$ii = ord($data[$nn+1]);
+			$b2 = ($ii & 63);
+			$ii = ord($data[$nn+2]);
+			$b3 = ($ii & 63);
+			$ii = ((($b1 * 64) + $b2) * 64) + $b3;
+			$ent = sprintf ('&#%d;', $ii);
+			$escaped_data .= $ent;
+			$nn += 2;
+		}
+		//4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
+		else if ($ii>>3 == 30)
+		{
+			$b1 = ($ii & 7);
+			$ii = ord($data[$nn+1]);
+			$b2 = ($ii & 63);
+			$ii = ord($data[$nn+2]);
+			$b3 = ($ii & 63);
+			$ii = ord($data[$nn+3]);
+			$b4 = ($ii & 63);
+			$ii = ((((($b1 * 64) + $b2) * 64) + $b3) * 64) + $b4;
+			$ent = sprintf ('&#%d;', $ii);
+			$escaped_data .= $ent;
+			$nn += 3;
+		}
+	}
+				break;
+/*
+			case 'CP1252_':
+			case 'CP1252_US-ASCII':
+				$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);
+				$escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data);
+				$escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data);
+				break;
+			case 'CP1252_UTF-8':
+				$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);
+				/// @todo we could use real UTF8 chars here instead of xml entities... (note that utf_8 encode all allone will NOT convert them)
+				$escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data);
+				$escaped_data = utf8_encode($escaped_data);
+				break;
+			case 'CP1252_ISO-8859-1':
+				$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;'), $data);
+				// we might as well replave all funky chars with a '?' here, but we are kind and leave it to the receiving application layer to decide what to do with these weird entities...
+				$escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data);
+				break;
+*/
+			default:
+				$escaped_data = '';
+				error_log("Converting from $src_encoding to $dest_encoding: not supported...");
+		}
+		return $escaped_data;
+	}
+
+	/// xml parser handler function for opening element tags
+	function xmlrpc_se($parser, $name, $attrs, $accept_single_vals=false)
+	{
+		// if invalid xmlrpc already detected, skip all processing
+		if ($GLOBALS['_xh']['isf'] < 2)
+		{
+			// check for correct element nesting
+			// top level element can only be of 2 types
+			/// @todo optimization creep: save this check into a bool variable, instead of using count() every time:
+			///       there is only a single top level element in xml anyway
+			if (count($GLOBALS['_xh']['stack']) == 0)
+			{
+				if ($name != 'METHODRESPONSE' && $name != 'METHODCALL' && (
+					$name != 'VALUE' && !$accept_single_vals))
+				{
+					$GLOBALS['_xh']['isf'] = 2;
+					$GLOBALS['_xh']['isf_reason'] = 'missing top level xmlrpc element';
+					return;
+				}
+				else
+				{
+					$GLOBALS['_xh']['rt'] = strtolower($name);
+					$GLOBALS['_xh']['rt'] = strtolower($name);
+				}
+			}
+			else
+			{
+				// not top level element: see if parent is OK
+				$parent = end($GLOBALS['_xh']['stack']);
+				if (!array_key_exists($name, $GLOBALS['xmlrpc_valid_parents']) || !in_array($parent, $GLOBALS['xmlrpc_valid_parents'][$name]))
+				{
+					$GLOBALS['_xh']['isf'] = 2;
+					$GLOBALS['_xh']['isf_reason'] = "xmlrpc element $name cannot be child of $parent";
+					return;
+				}
+			}
+
+			switch($name)
+			{
+				// optimize for speed switch cases: most common cases first
+				case 'VALUE':
+					/// @todo we could check for 2 VALUE elements inside a MEMBER or PARAM element
+					$GLOBALS['_xh']['vt']='value'; // indicator: no value found yet
+					$GLOBALS['_xh']['ac']='';
+					$GLOBALS['_xh']['lv']=1;
+					$GLOBALS['_xh']['php_class']=null;
+					break;
+				case 'I4':
+				case 'INT':
+				case 'STRING':
+				case 'BOOLEAN':
+				case 'DOUBLE':
+				case 'DATETIME.ISO8601':
+				case 'BASE64':
+					if ($GLOBALS['_xh']['vt']!='value')
+					{
+						//two data elements inside a value: an error occurred!
+						$GLOBALS['_xh']['isf'] = 2;
+						$GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";
+						return;
+					}
+					$GLOBALS['_xh']['ac']=''; // reset the accumulator
+					break;
+				case 'STRUCT':
+				case 'ARRAY':
+					if ($GLOBALS['_xh']['vt']!='value')
+					{
+						//two data elements inside a value: an error occurred!
+						$GLOBALS['_xh']['isf'] = 2;
+						$GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";
+						return;
+					}
+					// create an empty array to hold child values, and push it onto appropriate stack
+					$cur_val = array();
+					$cur_val['values'] = array();
+					$cur_val['type'] = $name;
+					// check for out-of-band information to rebuild php objs
+					// and in case it is found, save it
+					if (@isset($attrs['PHP_CLASS']))
+					{
+						$cur_val['php_class'] = $attrs['PHP_CLASS'];
+					}
+					$GLOBALS['_xh']['valuestack'][] = $cur_val;
+					$GLOBALS['_xh']['vt']='data'; // be prepared for a data element next
+					break;
+				case 'DATA':
+					if ($GLOBALS['_xh']['vt']!='data')
+					{
+						//two data elements inside a value: an error occurred!
+						$GLOBALS['_xh']['isf'] = 2;
+						$GLOBALS['_xh']['isf_reason'] = "found two data elements inside an array element";
+						return;
+					}
+				case 'METHODCALL':
+				case 'METHODRESPONSE':
+				case 'PARAMS':
+					// valid elements that add little to processing
+					break;
+				case 'METHODNAME':
+				case 'NAME':
+					/// @todo we could check for 2 NAME elements inside a MEMBER element
+					$GLOBALS['_xh']['ac']='';
+					break;
+				case 'FAULT':
+					$GLOBALS['_xh']['isf']=1;
+					break;
+				case 'MEMBER':
+					$GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on
+					//$GLOBALS['_xh']['ac']='';
+					// Drop trough intentionally
+				case 'PARAM':
+					// clear value type, so we can check later if no value has been passed for this param/member
+					$GLOBALS['_xh']['vt']=null;
+					break;
+				case 'NIL':
+				case 'EX:NIL':
+					if ($GLOBALS['xmlrpc_null_extension'])
+					{
+						if ($GLOBALS['_xh']['vt']!='value')
+						{
+							//two data elements inside a value: an error occurred!
+							$GLOBALS['_xh']['isf'] = 2;
+							$GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";
+							return;
+						}
+						$GLOBALS['_xh']['ac']=''; // reset the accumulator
+						break;
+					}
+					// we do not support the <NIL/> extension, so
+					// drop through intentionally
+				default:
+					/// INVALID ELEMENT: RAISE ISF so that it is later recognized!!!
+					$GLOBALS['_xh']['isf'] = 2;
+					$GLOBALS['_xh']['isf_reason'] = "found not-xmlrpc xml element $name";
+					break;
+			}
+
+			// Save current element name to stack, to validate nesting
+			$GLOBALS['_xh']['stack'][] = $name;
+
+			/// @todo optimization creep: move this inside the big switch() above
+			if($name!='VALUE')
+			{
+				$GLOBALS['_xh']['lv']=0;
+			}
+		}
+	}
+
+	/// Used in decoding xml chunks that might represent single xmlrpc values
+	function xmlrpc_se_any($parser, $name, $attrs)
+	{
+		xmlrpc_se($parser, $name, $attrs, true);
+	}
+
+	/// xml parser handler function for close element tags
+	function xmlrpc_ee($parser, $name, $rebuild_xmlrpcvals = true)
+	{
+		if ($GLOBALS['_xh']['isf'] < 2)
+		{
+			// push this element name from stack
+			// NB: if XML validates, correct opening/closing is guaranteed and
+			// we do not have to check for $name == $curr_elem.
+			// we also checked for proper nesting at start of elements...
+			$curr_elem = array_pop($GLOBALS['_xh']['stack']);
+
+			switch($name)
+			{
+				case 'VALUE':
+					// This if() detects if no scalar was inside <VALUE></VALUE>
+					if ($GLOBALS['_xh']['vt']=='value')
+					{
+						$GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];
+						$GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcString'];
+					}
+
+					if ($rebuild_xmlrpcvals)
+					{
+						// build the xmlrpc val out of the data received, and substitute it
+						$temp = new xmlrpcval($GLOBALS['_xh']['value'], $GLOBALS['_xh']['vt']);
+						// in case we got info about underlying php class, save it
+						// in the object we're rebuilding
+						if (isset($GLOBALS['_xh']['php_class']))
+							$temp->_php_class = $GLOBALS['_xh']['php_class'];
+						// check if we are inside an array or struct:
+						// if value just built is inside an array, let's move it into array on the stack
+						$vscount = count($GLOBALS['_xh']['valuestack']);
+						if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')
+						{
+							$GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $temp;
+						}
+						else
+						{
+							$GLOBALS['_xh']['value'] = $temp;
+						}
+					}
+					else
+					{
+						/// @todo this needs to treat correctly php-serialized objects,
+						/// since std deserializing is done by php_xmlrpc_decode,
+						/// which we will not be calling...
+						if (isset($GLOBALS['_xh']['php_class']))
+						{
+						}
+
+						// check if we are inside an array or struct:
+						// if value just built is inside an array, let's move it into array on the stack
+						$vscount = count($GLOBALS['_xh']['valuestack']);
+						if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')
+						{
+							$GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $GLOBALS['_xh']['value'];
+						}
+					}
+					break;
+				case 'BOOLEAN':
+				case 'I4':
+				case 'INT':
+				case 'STRING':
+				case 'DOUBLE':
+				case 'DATETIME.ISO8601':
+				case 'BASE64':
+					$GLOBALS['_xh']['vt']=strtolower($name);
+					/// @todo: optimization creep - remove the if/elseif cycle below
+					/// since the case() in which we are already did that
+					if ($name=='STRING')
+					{
+						$GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];
+					}
+					elseif ($name=='DATETIME.ISO8601')
+					{
+						if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $GLOBALS['_xh']['ac']))
+						{
+							error_log('XML-RPC: invalid value received in DATETIME: '.$GLOBALS['_xh']['ac']);
+						}
+						$GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcDateTime'];
+						$GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];
+					}
+					elseif ($name=='BASE64')
+					{
+						/// @todo check for failure of base64 decoding / catch warnings
+						$GLOBALS['_xh']['value']=base64_decode($GLOBALS['_xh']['ac']);
+					}
+					elseif ($name=='BOOLEAN')
+					{
+						// special case here: we translate boolean 1 or 0 into PHP
+						// constants true or false.
+						// Strings 'true' and 'false' are accepted, even though the
+						// spec never mentions them (see eg. Blogger api docs)
+						// NB: this simple checks helps a lot sanitizing input, ie no
+						// security problems around here
+						if ($GLOBALS['_xh']['ac']=='1' || strcasecmp($GLOBALS['_xh']['ac'], 'true') == 0)
+						{
+							$GLOBALS['_xh']['value']=true;
+						}
+						else
+						{
+							// log if receiveing something strange, even though we set the value to false anyway
+							if ($GLOBALS['_xh']['ac']!='0' && strcasecmp($GLOBALS['_xh']['ac'], 'false') != 0)
+								error_log('XML-RPC: invalid value received in BOOLEAN: '.$GLOBALS['_xh']['ac']);
+							$GLOBALS['_xh']['value']=false;
+						}
+					}
+					elseif ($name=='DOUBLE')
+					{
+						// we have a DOUBLE
+						// we must check that only 0123456789-.<space> are characters here
+						// NOTE: regexp could be much stricter than this...
+						if (!preg_match('/^[+-eE0123456789 \t.]+$/', $GLOBALS['_xh']['ac']))
+						{
+							/// @todo: find a better way of throwing an error than this!
+							error_log('XML-RPC: non numeric value received in DOUBLE: '.$GLOBALS['_xh']['ac']);
+							$GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';
+						}
+						else
+						{
+							// it's ok, add it on
+							$GLOBALS['_xh']['value']=(double)$GLOBALS['_xh']['ac'];
+						}
+					}
+					else
+					{
+						// we have an I4/INT
+						// we must check that only 0123456789-<space> are characters here
+						if (!preg_match('/^[+-]?[0123456789 \t]+$/', $GLOBALS['_xh']['ac']))
+						{
+							/// @todo find a better way of throwing an error than this!
+							error_log('XML-RPC: non numeric value received in INT: '.$GLOBALS['_xh']['ac']);
+							$GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';
+						}
+						else
+						{
+							// it's ok, add it on
+							$GLOBALS['_xh']['value']=(int)$GLOBALS['_xh']['ac'];
+						}
+					}
+					//$GLOBALS['_xh']['ac']=''; // is this necessary?
+					$GLOBALS['_xh']['lv']=3; // indicate we've found a value
+					break;
+				case 'NAME':
+					$GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name'] = $GLOBALS['_xh']['ac'];
+					break;
+				case 'MEMBER':
+					//$GLOBALS['_xh']['ac']=''; // is this necessary?
+					// add to array in the stack the last element built,
+					// unless no VALUE was found
+					if ($GLOBALS['_xh']['vt'])
+					{
+						$vscount = count($GLOBALS['_xh']['valuestack']);
+						$GLOBALS['_xh']['valuestack'][$vscount-1]['values'][$GLOBALS['_xh']['valuestack'][$vscount-1]['name']] = $GLOBALS['_xh']['value'];
+					} else
+						error_log('XML-RPC: missing VALUE inside STRUCT in received xml');
+					break;
+				case 'DATA':
+					//$GLOBALS['_xh']['ac']=''; // is this necessary?
+					$GLOBALS['_xh']['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty
+					break;
+				case 'STRUCT':
+				case 'ARRAY':
+					// fetch out of stack array of values, and promote it to current value
+					$curr_val = array_pop($GLOBALS['_xh']['valuestack']);
+					$GLOBALS['_xh']['value'] = $curr_val['values'];
+					$GLOBALS['_xh']['vt']=strtolower($name);
+					if (isset($curr_val['php_class']))
+					{
+						$GLOBALS['_xh']['php_class'] = $curr_val['php_class'];
+					}
+					break;
+				case 'PARAM':
+					// add to array of params the current value,
+					// unless no VALUE was found
+					if ($GLOBALS['_xh']['vt'])
+					{
+						$GLOBALS['_xh']['params'][]=$GLOBALS['_xh']['value'];
+						$GLOBALS['_xh']['pt'][]=$GLOBALS['_xh']['vt'];
+					}
+					else
+						error_log('XML-RPC: missing VALUE inside PARAM in received xml');
+					break;
+				case 'METHODNAME':
+					$GLOBALS['_xh']['method']=preg_replace('/^[\n\r\t ]+/', '', $GLOBALS['_xh']['ac']);
+					break;
+				case 'NIL':
+				case 'EX:NIL':
+					if ($GLOBALS['xmlrpc_null_extension'])
+					{
+						$GLOBALS['_xh']['vt']='null';
+						$GLOBALS['_xh']['value']=null;
+						$GLOBALS['_xh']['lv']=3;
+						break;
+					}
+					// drop through intentionally if nil extension not enabled
+				case 'PARAMS':
+				case 'FAULT':
+				case 'METHODCALL':
+				case 'METHORESPONSE':
+					break;
+				default:
+					// End of INVALID ELEMENT!
+					// shall we add an assert here for unreachable code???
+					break;
+			}
+		}
+	}
+
+	/// Used in decoding xmlrpc requests/responses without rebuilding xmlrpc values
+	function xmlrpc_ee_fast($parser, $name)
+	{
+		xmlrpc_ee($parser, $name, false);
+	}
+
+	/// xml parser handler function for character data
+	function xmlrpc_cd($parser, $data)
+	{
+		// skip processing if xml fault already detected
+		if ($GLOBALS['_xh']['isf'] < 2)
+		{
+			// "lookforvalue==3" means that we've found an entire value
+			// and should discard any further character data
+			if($GLOBALS['_xh']['lv']!=3)
+			{
+				// G. Giunta 2006-08-23: useless change of 'lv' from 1 to 2
+				//if($GLOBALS['_xh']['lv']==1)
+				//{
+					// if we've found text and we're just in a <value> then
+					// say we've found a value
+					//$GLOBALS['_xh']['lv']=2;
+				//}
+				// we always initialize the accumulator before starting parsing, anyway...
+				//if(!@isset($GLOBALS['_xh']['ac']))
+				//{
+				//	$GLOBALS['_xh']['ac'] = '';
+				//}
+				$GLOBALS['_xh']['ac'].=$data;
+			}
+		}
+	}
+
+	/// xml parser handler function for 'other stuff', ie. not char data or
+	/// element start/end tag. In fact it only gets called on unknown entities...
+	function xmlrpc_dh($parser, $data)
+	{
+		// skip processing if xml fault already detected
+		if ($GLOBALS['_xh']['isf'] < 2)
+		{
+			if(substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';')
+			{
+				// G. Giunta 2006-08-25: useless change of 'lv' from 1 to 2
+				//if($GLOBALS['_xh']['lv']==1)
+				//{
+				//	$GLOBALS['_xh']['lv']=2;
+				//}
+				$GLOBALS['_xh']['ac'].=$data;
+			}
+		}
+		return true;
+	}
+
+	class xmlrpc_client
+	{
+		var $path;
+		var $server;
+		var $port=0;
+		var $method='http';
+		var $errno;
+		var $errstr;
+		var $debug=0;
+		var $username='';
+		var $password='';
+		var $authtype=1;
+		var $cert='';
+		var $certpass='';
+		var $cacert='';
+		var $cacertdir='';
+		var $key='';
+		var $keypass='';
+		var $verifypeer=true;
+		var $verifyhost=1;
+		var $no_multicall=false;
+		var $proxy='';
+		var $proxyport=0;
+		var $proxy_user='';
+		var $proxy_pass='';
+		var $proxy_authtype=1;
+		var $cookies=array();
+		var $extracurlopts=array();
+
+		/**
+		* List of http compression methods accepted by the client for responses.
+		* NB: PHP supports deflate, gzip compressions out of the box if compiled w. zlib
+		*
+		* NNB: you can set it to any non-empty array for HTTP11 and HTTPS, since
+		* in those cases it will be up to CURL to decide the compression methods
+		* it supports. You might check for the presence of 'zlib' in the output of
+		* curl_version() to determine wheter compression is supported or not
+		*/
+		var $accepted_compression = array();
+		/**
+		* Name of compression scheme to be used for sending requests.
+		* Either null, gzip or deflate
+		*/
+		var $request_compression = '';
+		/**
+		* CURL handle: used for keep-alive connections (PHP 4.3.8 up, see:
+		* http://curl.haxx.se/docs/faq.html#7.3)
+		*/
+		var $xmlrpc_curl_handle = null;
+		/// Wheter to use persistent connections for http 1.1 and https
+		var $keepalive = false;
+		/// Charset encodings that can be decoded without problems by the client
+		var $accepted_charset_encodings = array();
+		/// Charset encoding to be used in serializing request. NULL = use ASCII
+		var $request_charset_encoding = '';
+		/**
+		* Decides the content of xmlrpcresp objects returned by calls to send()
+		* valid strings are 'xmlrpcvals', 'phpvals' or 'xml'
+		*/
+		var $return_type = 'xmlrpcvals';
+		/**
+		* Sent to servers in http headers
+		*/
+		var $user_agent;
+
+		/**
+		* @param string $path either the complete server URL or the PATH part of the xmlrc server URL, e.g. /xmlrpc/server.php
+		* @param string $server the server name / ip address
+		* @param integer $port the port the server is listening on, defaults to 80 or 443 depending on protocol used
+		* @param string $method the http protocol variant: defaults to 'http', 'https' and 'http11' can be used if CURL is installed
+		*/
+		function xmlrpc_client($path, $server='', $port='', $method='')
+		{
+			// allow user to specify all params in $path
+			if($server == '' and $port == '' and $method == '')
+			{
+				$parts = parse_url($path);
+				$server = $parts['host'];
+				$path = isset($parts['path']) ? $parts['path'] : '';
+				if(isset($parts['query']))
+				{
+					$path .= '?'.$parts['query'];
+				}
+				if(isset($parts['fragment']))
+				{
+					$path .= '#'.$parts['fragment'];
+				}
+				if(isset($parts['port']))
+				{
+					$port = $parts['port'];
+				}
+				if(isset($parts['scheme']))
+				{
+					$method = $parts['scheme'];
+				}
+				if(isset($parts['user']))
+				{
+					$this->username = $parts['user'];
+				}
+				if(isset($parts['pass']))
+				{
+					$this->password = $parts['pass'];
+				}
+			}
+			if($path == '' || $path[0] != '/')
+			{
+				$this->path='/'.$path;
+			}
+			else
+			{
+				$this->path=$path;
+			}
+			$this->server=$server;
+			if($port != '')
+			{
+				$this->port=$port;
+			}
+			if($method != '')
+			{
+				$this->method=$method;
+			}
+
+			// if ZLIB is enabled, let the client by default accept compressed responses
+			if(function_exists('gzinflate') || (
+				function_exists('curl_init') && (($info = curl_version()) &&
+				((is_string($info) && strpos($info, 'zlib') !== null) || isset($info['libz_version'])))
+			))
+			{
+				$this->accepted_compression = array('gzip', 'deflate');
+			}
+
+			// keepalives: enabled by default
+			$this->keepalive = true;
+
+			// by default the xml parser can support these 3 charset encodings
+			$this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII');
+
+			// initialize user_agent string
+			$this->user_agent = $GLOBALS['xmlrpcName'] . ' ' . $GLOBALS['xmlrpcVersion'];
+		}
+
+		/**
+		* Enables/disables the echoing to screen of the xmlrpc responses received
+		* @param integer $debug values 0, 1 and 2 are supported (2 = echo sent msg too, before received response)
+		* @access public
+		*/
+		function setDebug($in)
+		{
+			$this->debug=$in;
+		}
+
+		/**
+		* Add some http BASIC AUTH credentials, used by the client to authenticate
+		* @param string $u username
+		* @param string $p password
+		* @param integer $t auth type. See curl_setopt man page for supported auth types. Defaults to CURLAUTH_BASIC (basic auth)
+		* @access public
+		*/
+		function setCredentials($u, $p, $t=1)
+		{
+			$this->username=$u;
+			$this->password=$p;
+			$this->authtype=$t;
+		}
+
+		/**
+		* Add a client-side https certificate
+		* @param string $cert
+		* @param string $certpass
+		* @access public
+		*/
+		function setCertificate($cert, $certpass)
+		{
+			$this->cert = $cert;
+			$this->certpass = $certpass;
+		}
+
+		/**
+		* Add a CA certificate to verify server with (see man page about
+		* CURLOPT_CAINFO for more details
+		* @param string $cacert certificate file name (or dir holding certificates)
+		* @param bool $is_dir set to true to indicate cacert is a dir. defaults to false
+		* @access public
+		*/
+		function setCaCertificate($cacert, $is_dir=false)
+		{
+			if ($is_dir)
+			{
+				$this->cacertdir = $cacert;
+			}
+			else
+			{
+				$this->cacert = $cacert;
+			}
+		}
+
+		/**
+		* Set attributes for SSL communication: private SSL key
+		* NB: does not work in older php/curl installs
+		* Thanks to Daniel Convissor
+		* @param string $key The name of a file containing a private SSL key
+		* @param string $keypass The secret password needed to use the private SSL key
+		* @access public
+		*/
+		function setKey($key, $keypass)
+		{
+			$this->key = $key;
+			$this->keypass = $keypass;
+		}
+
+		/**
+		* Set attributes for SSL communication: verify server certificate
+		* @param bool $i enable/disable verification of peer certificate
+		* @access public
+		*/
+		function setSSLVerifyPeer($i)
+		{
+			$this->verifypeer = $i;
+		}
+
+		/**
+		* Set attributes for SSL communication: verify match of server cert w. hostname
+		* @param int $i
+		* @access public
+		*/
+		function setSSLVerifyHost($i)
+		{
+			$this->verifyhost = $i;
+		}
+
+		/**
+		* Set proxy info
+		* @param string $proxyhost
+		* @param string $proxyport Defaults to 8080 for HTTP and 443 for HTTPS
+		* @param string $proxyusername Leave blank if proxy has public access
+		* @param string $proxypassword Leave blank if proxy has public access
+		* @param int $proxyauthtype set to constant CURLAUTH_NTLM to use NTLM auth with proxy
+		* @access public
+		*/
+		function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 1)
+		{
+			$this->proxy = $proxyhost;
+			$this->proxyport = $proxyport;
+			$this->proxy_user = $proxyusername;
+			$this->proxy_pass = $proxypassword;
+			$this->proxy_authtype = $proxyauthtype;
+		}
+
+		/**
+		* Enables/disables reception of compressed xmlrpc responses.
+		* Note that enabling reception of compressed responses merely adds some standard
+		* http headers to xmlrpc requests. It is up to the xmlrpc server to return
+		* compressed responses when receiving such requests.
+		* @param string $compmethod either 'gzip', 'deflate', 'any' or ''
+		* @access public
+		*/
+		function setAcceptedCompression($compmethod)
+		{
+			if ($compmethod == 'any')
+				$this->accepted_compression = array('gzip', 'deflate');
+			else
+				$this->accepted_compression = array($compmethod);
+		}
+
+		/**
+		* Enables/disables http compression of xmlrpc request.
+		* Take care when sending compressed requests: servers might not support them
+		* (and automatic fallback to uncompressed requests is not yet implemented)
+		* @param string $compmethod either 'gzip', 'deflate' or ''
+		* @access public
+		*/
+		function setRequestCompression($compmethod)
+		{
+			$this->request_compression = $compmethod;
+		}
+
+		/**
+		* Adds a cookie to list of cookies that will be sent to server.
+		* NB: setting any param but name and value will turn the cookie into a 'version 1' cookie:
+		* do not do it unless you know what you are doing
+		* @param string $name
+		* @param string $value
+		* @param string $path
+		* @param string $domain
+		* @param int $port
+		* @access public
+		*
+		* @todo check correctness of urlencoding cookie value (copied from php way of doing it...)
+		*/
+		function setCookie($name, $value='', $path='', $domain='', $port=null)
+		{
+			$this->cookies[$name]['value'] = urlencode($value);
+			if ($path || $domain || $port)
+			{
+				$this->cookies[$name]['path'] = $path;
+				$this->cookies[$name]['domain'] = $domain;
+				$this->cookies[$name]['port'] = $port;
+				$this->cookies[$name]['version'] = 1;
+			}
+			else
+			{
+				$this->cookies[$name]['version'] = 0;
+			}
+		}
+
+		/**
+		* Directly set cURL options, for extra flexibility
+		* It allows eg. to bind client to a specific IP interface / address
+		* @param $options array
+		*/
+		function SetCurlOptions( $options )
+		{
+			$this->extracurlopts = $options;
+		}
+
+		/**
+		* Set user-agent string that will be used by this client instance
+		* in http headers sent to the server
+		*/
+		function SetUserAgent( $agentstring )
+		{
+			$this->user_agent = $agentstring;
+		}
+
+		/**
+		* Send an xmlrpc request
+		* @param mixed $msg The message object, or an array of messages for using multicall, or the complete xml representation of a request
+		* @param integer $timeout Connection timeout, in seconds, If unspecified, a platform specific timeout will apply
+		* @param string $method if left unspecified, the http protocol chosen during creation of the object will be used
+		* @return xmlrpcresp
+		* @access public
+		*/
+		function& send($msg, $timeout=0, $method='')
+		{
+			// if user deos not specify http protocol, use native method of this client
+			// (i.e. method set during call to constructor)
+			if($method == '')
+			{
+				$method = $this->method;
+			}
+
+			if(is_array($msg))
+			{
+				// $msg is an array of xmlrpcmsg's
+				$r = $this->multicall($msg, $timeout, $method);
+				return $r;
+			}
+			elseif(is_string($msg))
+			{
+				$n = new xmlrpcmsg('');
+				$n->payload = $msg;
+				$msg = $n;
+			}
+
+			// where msg is an xmlrpcmsg
+			$msg->debug=$this->debug;
+
+			if($method == 'https')
+			{
+				$r =& $this->sendPayloadHTTPS(
+					$msg,
+					$this->server,
+					$this->port,
+					$timeout,
+					$this->username,
+					$this->password,
+					$this->authtype,
+					$this->cert,
+					$this->certpass,
+					$this->cacert,
+					$this->cacertdir,
+					$this->proxy,
+					$this->proxyport,
+					$this->proxy_user,
+					$this->proxy_pass,
+					$this->proxy_authtype,
+					$this->keepalive,
+					$this->key,
+					$this->keypass
+				);
+			}
+			elseif($method == 'http11')
+			{
+				$r =& $this->sendPayloadCURL(
+					$msg,
+					$this->server,
+					$this->port,
+					$timeout,
+					$this->username,
+					$this->password,
+					$this->authtype,
+					null,
+					null,
+					null,
+					null,
+					$this->proxy,
+					$this->proxyport,
+					$this->proxy_user,
+					$this->proxy_pass,
+					$this->proxy_authtype,
+					'http',
+					$this->keepalive
+				);
+			}
+			else
+			{
+				$r =& $this->sendPayloadHTTP10(
+					$msg,
+					$this->server,
+					$this->port,
+					$timeout,
+					$this->username,
+					$this->password,
+					$this->authtype,
+					$this->proxy,
+					$this->proxyport,
+					$this->proxy_user,
+					$this->proxy_pass,
+					$this->proxy_authtype
+				);
+			}
+
+			return $r;
+		}
+
+		/**
+		* @access private
+		*/
+		function &sendPayloadHTTP10($msg, $server, $port, $timeout=0,
+			$username='', $password='', $authtype=1, $proxyhost='',
+			$proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1)
+		{
+			if($port==0)
+			{
+				$port=80;
+			}
+
+			// Only create the payload if it was not created previously
+			if(empty($msg->payload))
+			{
+				$msg->createPayload($this->request_charset_encoding);
+			}
+
+			$payload = $msg->payload;
+			// Deflate request body and set appropriate request headers
+			if(function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate'))
+			{
+				if($this->request_compression == 'gzip')
+				{
+					$a = @gzencode($payload);
+					if($a)
+					{
+						$payload = $a;
+						$encoding_hdr = "Content-Encoding: gzip\r\n";
+					}
+				}
+				else
+				{
+					$a = @gzcompress($payload);
+					if($a)
+					{
+						$payload = $a;
+						$encoding_hdr = "Content-Encoding: deflate\r\n";
+					}
+				}
+			}
+			else
+			{
+				$encoding_hdr = '';
+			}
+
+			// thanks to Grant Rauscher <grant7@firstworld.net> for this
+			$credentials='';
+			if($username!='')
+			{
+				$credentials='Authorization: Basic ' . base64_encode($username . ':' . $password) . "\r\n";
+				if ($authtype != 1)
+				{
+					error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth is supported with HTTP 1.0');
+				}
+			}
+
+			$accepted_encoding = '';
+			if(is_array($this->accepted_compression) && count($this->accepted_compression))
+			{
+				$accepted_encoding = 'Accept-Encoding: ' . implode(', ', $this->accepted_compression) . "\r\n";
+			}
+
+			$proxy_credentials = '';
+			if($proxyhost)
+			{
+				if($proxyport == 0)
+				{
+					$proxyport = 8080;
+				}
+				$connectserver = $proxyhost;
+				$connectport = $proxyport;
+				$uri = 'http://'.$server.':'.$port.$this->path;
+				if($proxyusername != '')
+				{
+					if ($proxyauthtype != 1)
+					{
+						error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth to proxy is supported with HTTP 1.0');
+					}
+					$proxy_credentials = 'Proxy-Authorization: Basic ' . base64_encode($proxyusername.':'.$proxypassword) . "\r\n";
+				}
+			}
+			else
+			{
+				$connectserver = $server;
+				$connectport = $port;
+				$uri = $this->path;
+			}
+
+			// Cookie generation, as per rfc2965 (version 1 cookies) or
+			// netscape's rules (version 0 cookies)
+			$cookieheader='';
+			if (count($this->cookies))
+			{
+				$version = '';
+				foreach ($this->cookies as $name => $cookie)
+				{
+					if ($cookie['version'])
+					{
+						$version = ' $Version="' . $cookie['version'] . '";';
+						$cookieheader .= ' ' . $name . '="' . $cookie['value'] . '";';
+						if ($cookie['path'])
+							$cookieheader .= ' $Path="' . $cookie['path'] . '";';
+						if ($cookie['domain'])
+							$cookieheader .= ' $Domain="' . $cookie['domain'] . '";';
+						if ($cookie['port'])
+							$cookieheader .= ' $Port="' . $cookie['port'] . '";';
+					}
+					else
+					{
+						$cookieheader .= ' ' . $name . '=' . $cookie['value'] . ";";
+					}
+				}
+				$cookieheader = 'Cookie:' . $version . substr($cookieheader, 0, -1) . "\r\n";
+			}
+
+			$op= 'POST ' . $uri. " HTTP/1.0\r\n" .
+				'User-Agent: ' . $this->user_agent . "\r\n" .
+				'Host: '. $server . ':' . $port . "\r\n" .
+				$credentials .
+				$proxy_credentials .
+				$accepted_encoding .
+				$encoding_hdr .
+				'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings) . "\r\n" .
+				$cookieheader .
+				'Content-Type: ' . $msg->content_type . "\r\nContent-Length: " .
+				strlen($payload) . "\r\n\r\n" .
+				$payload;
+
+			if($this->debug > 1)
+			{
+				print "<PRE>\n---SENDING---\n" . htmlentities($op) . "\n---END---\n</PRE>";
+				// let the client see this now in case http times out...
+				flush();
+			}
+
+			if($timeout>0)
+			{
+				$fp=@fsockopen($connectserver, $connectport, $this->errno, $this->errstr, $timeout);
+			}
+			else
+			{
+				$fp=@fsockopen($connectserver, $connectport, $this->errno, $this->errstr);
+			}
+			if($fp)
+			{
+				if($timeout>0 && function_exists('stream_set_timeout'))
+				{
+					stream_set_timeout($fp, $timeout);
+				}
+			}
+			else
+			{
+				$this->errstr='Connect error: '.$this->errstr;
+				$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr . ' (' . $this->errno . ')');
+				return $r;
+			}
+
+			if(!fputs($fp, $op, strlen($op)))
+			{
+				fclose($fp);
+				$this->errstr='Write error';
+				$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr);
+				return $r;
+			}
+			else
+			{
+				// reset errno and errstr on succesful socket connection
+				$this->errstr = '';
+			}
+			// G. Giunta 2005/10/24: close socket before parsing.
+			// should yeld slightly better execution times, and make easier recursive calls (e.g. to follow http redirects)
+			$ipd='';
+			do
+			{
+				// shall we check for $data === FALSE?
+				// as per the manual, it signals an error
+				$ipd.=fread($fp, 32768);
+			} while(!feof($fp));
+			fclose($fp);
+			$r =& $msg->parseResponse($ipd, false, $this->return_type);
+			return $r;
+
+		}
+
+		/**
+		* @access private
+		*/
+		function &sendPayloadHTTPS($msg, $server, $port, $timeout=0, $username='',
+			$password='', $authtype=1, $cert='',$certpass='', $cacert='', $cacertdir='',
+			$proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1,
+			$keepalive=false, $key='', $keypass='')
+		{
+			$r =& $this->sendPayloadCURL($msg, $server, $port, $timeout, $username,
+				$password, $authtype, $cert, $certpass, $cacert, $cacertdir, $proxyhost, $proxyport,
+				$proxyusername, $proxypassword, $proxyauthtype, 'https', $keepalive, $key, $keypass);
+			return $r;
+		}
+
+		/**
+		* Contributed by Justin Miller <justin@voxel.net>
+		* Requires curl to be built into PHP
+		* NB: CURL versions before 7.11.10 cannot use proxy to talk to https servers!
+		* @access private
+		*/
+		function &sendPayloadCURL($msg, $server, $port, $timeout=0, $username='',
+			$password='', $authtype=1, $cert='', $certpass='', $cacert='', $cacertdir='',
+			$proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1, $method='https',
+			$keepalive=false, $key='', $keypass='')
+		{
+			if(!function_exists('curl_init'))
+			{
+				$this->errstr='CURL unavailable on this install';
+				$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_curl'], $GLOBALS['xmlrpcstr']['no_curl']);
+				return $r;
+			}
+			if($method == 'https')
+			{
+				if(($info = curl_version()) &&
+					((is_string($info) && strpos($info, 'OpenSSL') === null) || (is_array($info) && !isset($info['ssl_version']))))
+				{
+					$this->errstr='SSL unavailable on this install';
+					$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_ssl'], $GLOBALS['xmlrpcstr']['no_ssl']);
+					return $r;
+				}
+			}
+
+			if($port == 0)
+			{
+				if($method == 'http')
+				{
+					$port = 80;
+				}
+				else
+				{
+					$port = 443;
+				}
+			}
+
+			// Only create the payload if it was not created previously
+			if(empty($msg->payload))
+			{
+				$msg->createPayload($this->request_charset_encoding);
+			}
+
+			// Deflate request body and set appropriate request headers
+			$payload = $msg->payload;
+			if(function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate'))
+			{
+				if($this->request_compression == 'gzip')
+				{
+					$a = @gzencode($payload);
+					if($a)
+					{
+						$payload = $a;
+						$encoding_hdr = 'Content-Encoding: gzip';
+					}
+				}
+				else
+				{
+					$a = @gzcompress($payload);
+					if($a)
+					{
+						$payload = $a;
+						$encoding_hdr = 'Content-Encoding: deflate';
+					}
+				}
+			}
+			else
+			{
+				$encoding_hdr = '';
+			}
+
+			if($this->debug > 1)
+			{
+				print "<PRE>\n---SENDING---\n" . htmlentities($payload) . "\n---END---\n</PRE>";
+				// let the client see this now in case http times out...
+				flush();
+			}
+
+			if(!$keepalive || !$this->xmlrpc_curl_handle)
+			{
+				$curl = curl_init($method . '://' . $server . ':' . $port . $this->path);
+				if($keepalive)
+				{
+					$this->xmlrpc_curl_handle = $curl;
+				}
+			}
+			else
+			{
+				$curl = $this->xmlrpc_curl_handle;
+			}
+
+			// results into variable
+			curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+
+			if($this->debug)
+			{
+				curl_setopt($curl, CURLOPT_VERBOSE, 1);
+			}
+			curl_setopt($curl, CURLOPT_USERAGENT, $this->user_agent);
+			// required for XMLRPC: post the data
+			curl_setopt($curl, CURLOPT_POST, 1);
+			// the data
+			curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
+
+			// return the header too
+			curl_setopt($curl, CURLOPT_HEADER, 1);
+
+			// will only work with PHP >= 5.0
+			// NB: if we set an empty string, CURL will add http header indicating
+			// ALL methods it is supporting. This is possibly a better option than
+			// letting the user tell what curl can / cannot do...
+			if(is_array($this->accepted_compression) && count($this->accepted_compression))
+			{
+				//curl_setopt($curl, CURLOPT_ENCODING, implode(',', $this->accepted_compression));
+				// empty string means 'any supported by CURL' (shall we catch errors in case CURLOPT_SSLKEY undefined ?)
+				if (count($this->accepted_compression) == 1)
+				{
+					curl_setopt($curl, CURLOPT_ENCODING, $this->accepted_compression[0]);
+				}
+				else
+					curl_setopt($curl, CURLOPT_ENCODING, '');
+			}
+			// extra headers
+			$headers = array('Content-Type: ' . $msg->content_type , 'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings));
+			// if no keepalive is wanted, let the server know it in advance
+			if(!$keepalive)
+			{
+				$headers[] = 'Connection: close';
+			}
+			// request compression header
+			if($encoding_hdr)
+			{
+				$headers[] = $encoding_hdr;
+			}
+
+			curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+			// timeout is borked
+			if($timeout)
+			{
+				curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : $timeout - 1);
+			}
+
+			if($username && $password)
+			{
+				curl_setopt($curl, CURLOPT_USERPWD, $username.':'.$password);
+				if (defined('CURLOPT_HTTPAUTH'))
+				{
+					curl_setopt($curl, CURLOPT_HTTPAUTH, $authtype);
+				}
+				else if ($authtype != 1)
+				{
+					error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth is supported by the current PHP/curl install');
+				}
+			}
+
+			if($method == 'https')
+			{
+				// set cert file
+				if($cert)
+				{
+					curl_setopt($curl, CURLOPT_SSLCERT, $cert);
+				}
+				// set cert password
+				if($certpass)
+				{
+					curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $certpass);
+				}
+				// whether to verify remote host's cert
+				curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verifypeer);
+				// set ca certificates file/dir
+				if($cacert)
+				{
+					curl_setopt($curl, CURLOPT_CAINFO, $cacert);
+				}
+				if($cacertdir)
+				{
+					curl_setopt($curl, CURLOPT_CAPATH, $cacertdir);
+				}
+				// set key file (shall we catch errors in case CURLOPT_SSLKEY undefined ?)
+				if($key)
+				{
+					curl_setopt($curl, CURLOPT_SSLKEY, $key);
+				}
+				// set key password (shall we catch errors in case CURLOPT_SSLKEY undefined ?)
+				if($keypass)
+				{
+					curl_setopt($curl, CURLOPT_SSLKEYPASSWD, $keypass);
+				}
+				// whether to verify cert's common name (CN); 0 for no, 1 to verify that it exists, and 2 to verify that it matches the hostname used
+				curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $this->verifyhost);
+			}
+
+			// proxy info
+			if($proxyhost)
+			{
+				if($proxyport == 0)
+				{
+					$proxyport = 8080; // NB: even for HTTPS, local connection is on port 8080
+				}
+				curl_setopt($curl, CURLOPT_PROXY, $proxyhost.':'.$proxyport);
+				//curl_setopt($curl, CURLOPT_PROXYPORT,$proxyport);
+				if($proxyusername)
+				{
+					curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyusername.':'.$proxypassword);
+					if (defined('CURLOPT_PROXYAUTH'))
+					{
+						curl_setopt($curl, CURLOPT_PROXYAUTH, $proxyauthtype);
+					}
+					else if ($proxyauthtype != 1)
+					{
+						error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth to proxy is supported by the current PHP/curl install');
+					}
+				}
+			}
+
+			// NB: should we build cookie http headers by hand rather than let CURL do it?
+			// the following code does not honour 'expires', 'path' and 'domain' cookie attributes
+			// set to client obj the the user...
+			if (count($this->cookies))
+			{
+				$cookieheader = '';
+				foreach ($this->cookies as $name => $cookie)
+				{
+					$cookieheader .= $name . '=' . $cookie['value'] . '; ';
+				}
+				curl_setopt($curl, CURLOPT_COOKIE, substr($cookieheader, 0, -2));
+			}
+
+			foreach ($this->extracurlopts as $opt => $val)
+			{
+				curl_setopt($curl, $opt, $val);
+			}
+
+			$result = curl_exec($curl);
+
+			if ($this->debug > 1)
+			{
+				print "<PRE>\n---CURL INFO---\n";
+				foreach(curl_getinfo($curl) as $name => $val)
+					 print $name . ': ' . htmlentities($val). "\n";
+				print "---END---\n</PRE>";
+			}
+
+			if(!$result) /// @todo we should use a better check here - what if we get back '' or '0'?
+			{
+				$this->errstr='no response';
+				$resp=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['curl_fail'], $GLOBALS['xmlrpcstr']['curl_fail']. ': '. curl_error($curl));
+				curl_close($curl);
+				if($keepalive)
+				{
+					$this->xmlrpc_curl_handle = null;
+				}
+			}
+			else
+			{
+				if(!$keepalive)
+				{
+					curl_close($curl);
+				}
+				$resp =& $msg->parseResponse($result, true, $this->return_type);
+			}
+			return $resp;
+		}
+
+		/**
+		* Send an array of request messages and return an array of responses.
+		* Unless $this->no_multicall has been set to true, it will try first
+		* to use one single xmlrpc call to server method system.multicall, and
+		* revert to sending many successive calls in case of failure.
+		* This failure is also stored in $this->no_multicall for subsequent calls.
+		* Unfortunately, there is no server error code universally used to denote
+		* the fact that multicall is unsupported, so there is no way to reliably
+		* distinguish between that and a temporary failure.
+		* If you are sure that server supports multicall and do not want to
+		* fallback to using many single calls, set the fourth parameter to FALSE.
+		*
+		* NB: trying to shoehorn extra functionality into existing syntax has resulted
+		* in pretty much convoluted code...
+		*
+		* @param array $msgs an array of xmlrpcmsg objects
+		* @param integer $timeout connection timeout (in seconds)
+		* @param string $method the http protocol variant to be used
+		* @param boolean fallback When true, upon receiveing an error during multicall, multiple single calls will be attempted
+		* @return array
+		* @access public
+		*/
+		function multicall($msgs, $timeout=0, $method='', $fallback=true)
+		{
+			if ($method == '')
+			{
+				$method = $this->method;
+			}
+			if(!$this->no_multicall)
+			{
+				$results = $this->_try_multicall($msgs, $timeout, $method);
+				if(is_array($results))
+				{
+					// System.multicall succeeded
+					return $results;
+				}
+				else
+				{
+					// either system.multicall is unsupported by server,
+					// or call failed for some other reason.
+					if ($fallback)
+					{
+						// Don't try it next time...
+						$this->no_multicall = true;
+					}
+					else
+					{
+						if (is_a($results, 'xmlrpcresp'))
+						{
+							$result = $results;
+						}
+						else
+						{
+							$result = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['multicall_error'], $GLOBALS['xmlrpcstr']['multicall_error']);
+						}
+					}
+				}
+			}
+			else
+			{
+				// override fallback, in case careless user tries to do two
+				// opposite things at the same time
+				$fallback = true;
+			}
+
+			$results = array();
+			if ($fallback)
+			{
+				// system.multicall is (probably) unsupported by server:
+				// emulate multicall via multiple requests
+				foreach($msgs as $msg)
+				{
+					$results[] =& $this->send($msg, $timeout, $method);
+				}
+			}
+			else
+			{
+				// user does NOT want to fallback on many single calls:
+				// since we should always return an array of responses,
+				// return an array with the same error repeated n times
+				foreach($msgs as $msg)
+				{
+					$results[] = $result;
+				}
+			}
+			return $results;
+		}
+
+		/**
+		* Attempt to boxcar $msgs via system.multicall.
+		* Returns either an array of xmlrpcreponses, an xmlrpc error response
+		* or false (when received response does not respect valid multicall syntax)
+		* @access private
+		*/
+		function _try_multicall($msgs, $timeout, $method)
+		{
+			// Construct multicall message
+			$calls = array();
+			foreach($msgs as $msg)
+			{
+				$call['methodName'] = new xmlrpcval($msg->method(),'string');
+				$numParams = $msg->getNumParams();
+				$params = array();
+				for($i = 0; $i < $numParams; $i++)
+				{
+					$params[$i] = $msg->getParam($i);
+				}
+				$call['params'] = new xmlrpcval($params, 'array');
+				$calls[] = new xmlrpcval($call, 'struct');
+			}
+			$multicall = new xmlrpcmsg('system.multicall');
+			$multicall->addParam(new xmlrpcval($calls, 'array'));
+
+			// Attempt RPC call
+			$result =& $this->send($multicall, $timeout, $method);
+
+			if($result->faultCode() != 0)
+			{
+				// call to system.multicall failed
+				return $result;
+			}
+
+			// Unpack responses.
+			$rets = $result->value();
+
+			if ($this->return_type == 'xml')
+			{
+					return $rets;
+			}
+			else if ($this->return_type == 'phpvals')
+			{
+				///@todo test this code branch...
+				$rets = $result->value();
+				if(!is_array($rets))
+				{
+					return false;		// bad return type from system.multicall
+				}
+				$numRets = count($rets);
+				if($numRets != count($msgs))
+				{
+					return false;		// wrong number of return values.
+				}
+
+				$response = array();
+				for($i = 0; $i < $numRets; $i++)
+				{
+					$val = $rets[$i];
+					if (!is_array($val)) {
+						return false;
+					}
+					switch(count($val))
+					{
+						case 1:
+							if(!isset($val[0]))
+							{
+								return false;		// Bad value
+							}
+							// Normal return value
+							$response[$i] = new xmlrpcresp($val[0], 0, '', 'phpvals');
+							break;
+						case 2:
+							///	@todo remove usage of @: it is apparently quite slow
+							$code = @$val['faultCode'];
+							if(!is_int($code))
+							{
+								return false;
+							}
+							$str = @$val['faultString'];
+							if(!is_string($str))
+							{
+								return false;
+							}
+							$response[$i] = new xmlrpcresp(0, $code, $str);
+							break;
+						default:
+							return false;
+					}
+				}
+				return $response;
+			}
+			else // return type == 'xmlrpcvals'
+			{
+				$rets = $result->value();
+				if($rets->kindOf() != 'array')
+				{
+					return false;		// bad return type from system.multicall
+				}
+				$numRets = $rets->arraysize();
+				if($numRets != count($msgs))
+				{
+					return false;		// wrong number of return values.
+				}
+
+				$response = array();
+				for($i = 0; $i < $numRets; $i++)
+				{
+					$val = $rets->arraymem($i);
+					switch($val->kindOf())
+					{
+						case 'array':
+							if($val->arraysize() != 1)
+							{
+								return false;		// Bad value
+							}
+							// Normal return value
+							$response[$i] = new xmlrpcresp($val->arraymem(0));
+							break;
+						case 'struct':
+							$code = $val->structmem('faultCode');
+							if($code->kindOf() != 'scalar' || $code->scalartyp() != 'int')
+							{
+								return false;
+							}
+							$str = $val->structmem('faultString');
+							if($str->kindOf() != 'scalar' || $str->scalartyp() != 'string')
+							{
+								return false;
+							}
+							$response[$i] = new xmlrpcresp(0, $code->scalarval(), $str->scalarval());
+							break;
+						default:
+							return false;
+					}
+				}
+				return $response;
+			}
+		}
+	} // end class xmlrpc_client
+
+	class xmlrpcresp
+	{
+		var $val = 0;
+		var $valtyp;
+		var $errno = 0;
+		var $errstr = '';
+		var $payload;
+		var $hdrs = array();
+		var $_cookies = array();
+		var $content_type = 'text/xml';
+		var $raw_data = '';
+
+		/**
+		* @param mixed $val either an xmlrpcval obj, a php value or the xml serialization of an xmlrpcval (a string)
+		* @param integer $fcode set it to anything but 0 to create an error response
+		* @param string $fstr the error string, in case of an error response
+		* @param string $valtyp either 'xmlrpcvals', 'phpvals' or 'xml'
+		*
+		* @todo add check that $val / $fcode / $fstr is of correct type???
+		* NB: as of now we do not do it, since it might be either an xmlrpcval or a plain
+		* php val, or a complete xml chunk, depending on usage of xmlrpc_client::send() inside which creator is called...
+		*/
+		function xmlrpcresp($val, $fcode = 0, $fstr = '', $valtyp='')
+		{
+			if($fcode != 0)
+			{
+				// error response
+				$this->errno = $fcode;
+				$this->errstr = $fstr;
+				//$this->errstr = htmlspecialchars($fstr); // XXX: encoding probably shouldn't be done here; fix later.
+			}
+			else
+			{
+				// successful response
+				$this->val = $val;
+				if ($valtyp == '')
+				{
+					// user did not declare type of response value: try to guess it
+					if (is_object($this->val) && is_a($this->val, 'xmlrpcval'))
+					{
+						$this->valtyp = 'xmlrpcvals';
+					}
+					else if (is_string($this->val))
+					{
+						$this->valtyp = 'xml';
+
+					}
+					else
+					{
+						$this->valtyp = 'phpvals';
+					}
+				}
+				else
+				{
+					// user declares type of resp value: believe him
+					$this->valtyp = $valtyp;
+				}
+			}
+		}
+
+		/**
+		* Returns the error code of the response.
+		* @return integer the error code of this response (0 for not-error responses)
+		* @access public
+		*/
+		function faultCode()
+		{
+			return $this->errno;
+		}
+
+		/**
+		* Returns the error code of the response.
+		* @return string the error string of this response ('' for not-error responses)
+		* @access public
+		*/
+		function faultString()
+		{
+			return $this->errstr;
+		}
+
+		/**
+		* Returns the value received by the server.
+		* @return mixed the xmlrpcval object returned by the server. Might be an xml string or php value if the response has been created by specially configured xmlrpc_client objects
+		* @access public
+		*/
+		function value()
+		{
+			return $this->val;
+		}
+
+		/**
+		* Returns an array with the cookies received from the server.
+		* Array has the form: $cookiename => array ('value' => $val, $attr1 => $val1, $attr2 = $val2, ...)
+		* with attributes being e.g. 'expires', 'path', domain'.
+		* NB: cookies sent as 'expired' by the server (i.e. with an expiry date in the past)
+		* are still present in the array. It is up to the user-defined code to decide
+		* how to use the received cookies, and wheter they have to be sent back with the next
+		* request to the server (using xmlrpc_client::setCookie) or not
+		* @return array array of cookies received from the server
+		* @access public
+		*/
+		function cookies()
+		{
+			return $this->_cookies;
+		}
+
+		/**
+		* Returns xml representation of the response. XML prologue not included
+		* @param string $charset_encoding the charset to be used for serialization. if null, US-ASCII is assumed
+		* @return string the xml representation of the response
+		* @access public
+		*/
+		function serialize($charset_encoding='')
+		{
+			if ($charset_encoding != '')
+				$this->content_type = 'text/xml; charset=' . $charset_encoding;
+			else
+				$this->content_type = 'text/xml';
+			$result = "<methodResponse>\n";
+			if($this->errno)
+			{
+				// G. Giunta 2005/2/13: let non-ASCII response messages be tolerated by clients
+				// by xml-encoding non ascii chars
+				$result .= "<fault>\n" .
+"<value>\n<struct><member><name>faultCode</name>\n<value><int>" . $this->errno .
+"</int></value>\n</member>\n<member>\n<name>faultString</name>\n<value><string>" .
+xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "</string></value>\n</member>\n" .
+"</struct>\n</value>\n</fault>";
+			}
+			else
+			{
+				if(!is_object($this->val) || !is_a($this->val, 'xmlrpcval'))
+				{
+					if (is_string($this->val) && $this->valtyp == 'xml')
+					{
+						$result .= "<params>\n<param>\n" .
+							$this->val .
+							"</param>\n</params>";
+					}
+					else
+					{
+						/// @todo try to build something serializable?
+						die('cannot serialize xmlrpcresp objects whose content is native php values');
+					}
+				}
+				else
+				{
+					$result .= "<params>\n<param>\n" .
+						$this->val->serialize($charset_encoding) .
+						"</param>\n</params>";
+				}
+			}
+			$result .= "\n</methodResponse>";
+			$this->payload = $result;
+			return $result;
+		}
+	}
+
+	class xmlrpcmsg
+	{
+		var $payload;
+		var $methodname;
+		var $params=array();
+		var $debug=0;
+		var $content_type = 'text/xml';
+
+		/**
+		* @param string $meth the name of the method to invoke
+		* @param array $pars array of parameters to be paased to the method (xmlrpcval objects)
+		*/
+		function xmlrpcmsg($meth, $pars=0)
+		{
+			$this->methodname=$meth;
+			if(is_array($pars) && count($pars)>0)
+			{
+				for($i=0; $i<count($pars); $i++)
+				{
+					$this->addParam($pars[$i]);
+				}
+			}
+		}
+
+		/**
+		* @access private
+		*/
+		function xml_header($charset_encoding='')
+		{
+			if ($charset_encoding != '')
+			{
+				return "<?xml version=\"1.0\" encoding=\"$charset_encoding\" ?" . ">\n<methodCall>\n";
+			}
+			else
+			{
+				return "<?xml version=\"1.0\"?" . ">\n<methodCall>\n";
+			}
+		}
+
+		/**
+		* @access private
+		*/
+		function xml_footer()
+		{
+			return '</methodCall>';
+		}
+
+		/**
+		* @access private
+		*/
+		function kindOf()
+		{
+			return 'msg';
+		}
+
+		/**
+		* @access private
+		*/
+		function createPayload($charset_encoding='')
+		{
+			if ($charset_encoding != '')
+				$this->content_type = 'text/xml; charset=' . $charset_encoding;
+			else
+				$this->content_type = 'text/xml';
+			$this->payload=$this->xml_header($charset_encoding);
+			$this->payload.='<methodName>' . $this->methodname . "</methodName>\n";
+			$this->payload.="<params>\n";
+			for($i=0; $i<count($this->params); $i++)
+			{
+				$p=$this->params[$i];
+				$this->payload.="<param>\n" . $p->serialize($charset_encoding) .
+				"</param>\n";
+			}
+			$this->payload.="</params>\n";
+			$this->payload.=$this->xml_footer();
+		}
+
+		/**
+		* Gets/sets the xmlrpc method to be invoked
+		* @param string $meth the method to be set (leave empty not to set it)
+		* @return string the method that will be invoked
+		* @access public
+		*/
+		function method($meth='')
+		{
+			if($meth!='')
+			{
+				$this->methodname=$meth;
+			}
+			return $this->methodname;
+		}
+
+		/**
+		* Returns xml representation of the message. XML prologue included
+		* @return string the xml representation of the message, xml prologue included
+		* @access public
+		*/
+		function serialize($charset_encoding='')
+		{
+			$this->createPayload($charset_encoding);
+			return $this->payload;
+		}
+
+		/**
+		* Add a parameter to the list of parameters to be used upon method invocation
+		* @param xmlrpcval $par
+		* @return boolean false on failure
+		* @access public
+		*/
+		function addParam($par)
+		{
+			// add check: do not add to self params which are not xmlrpcvals
+			if(is_object($par) && is_a($par, 'xmlrpcval'))
+			{
+				$this->params[]=$par;
+				return true;
+			}
+			else
+			{
+				return false;
+			}
+		}
+
+		/**
+		* Returns the nth parameter in the message. The index zero-based.
+		* @param integer $i the index of the parameter to fetch (zero based)
+		* @return xmlrpcval the i-th parameter
+		* @access public
+		*/
+		function getParam($i) { return $this->params[$i]; }
+
+		/**
+		* Returns the number of parameters in the messge.
+		* @return integer the number of parameters currently set
+		* @access public
+		*/
+		function getNumParams() { return count($this->params); }
+
+		/**
+		* Given an open file handle, read all data available and parse it as axmlrpc response.
+		* NB: the file handle is not closed by this function.
+		* NNB: might have trouble in rare cases to work on network streams, as we
+		*      check for a read of 0 bytes instead of feof($fp).
+		*      But since checking for feof(null) returns false, we would risk an
+		*      infinite loop in that case, because we cannot trust the caller
+		*      to give us a valid pointer to an open file...
+		* @access public
+		* @return xmlrpcresp
+		* @todo add 2nd & 3rd param to be passed to ParseResponse() ???
+		*/
+		function &parseResponseFile($fp)
+		{
+			$ipd='';
+			while($data=fread($fp, 32768))
+			{
+				$ipd.=$data;
+			}
+			//fclose($fp);
+			$r =& $this->parseResponse($ipd);
+			return $r;
+		}
+
+		/**
+		* Parses HTTP headers and separates them from data.
+		* @access private
+		*/
+		function &parseResponseHeaders(&$data, $headers_processed=false)
+		{
+				// Support "web-proxy-tunelling" connections for https through proxies
+				if(preg_match('/^HTTP\/1\.[0-1] 200 Connection established/', $data))
+				{
+					// Look for CR/LF or simple LF as line separator,
+					// (even though it is not valid http)
+					$pos = strpos($data,"\r\n\r\n");
+					if($pos || is_int($pos))
+					{
+						$bd = $pos+4;
+					}
+					else
+					{
+						$pos = strpos($data,"\n\n");
+						if($pos || is_int($pos))
+						{
+							$bd = $pos+2;
+						}
+						else
+						{
+							// No separation between response headers and body: fault?
+							$bd = 0;
+						}
+					}
+					if ($bd)
+					{
+						// this filters out all http headers from proxy.
+						// maybe we could take them into account, too?
+						$data = substr($data, $bd);
+					}
+					else
+					{
+						error_log('XML-RPC: '.__METHOD__.': HTTPS via proxy error, tunnel connection possibly failed');
+						$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)');
+						return $r;
+					}
+				}
+
+				// Strip HTTP 1.1 100 Continue header if present
+				while(preg_match('/^HTTP\/1\.1 1[0-9]{2} /', $data))
+				{
+					$pos = strpos($data, 'HTTP', 12);
+					// server sent a Continue header without any (valid) content following...
+					// give the client a chance to know it
+					if(!$pos && !is_int($pos)) // works fine in php 3, 4 and 5
+					{
+						break;
+					}
+					$data = substr($data, $pos);
+				}
+				if(!preg_match('/^HTTP\/[0-9.]+ 200 /', $data))
+				{
+					$errstr= substr($data, 0, strpos($data, "\n")-1);
+					error_log('XML-RPC: '.__METHOD__.': HTTP error, got response: ' .$errstr);
+					$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (' . $errstr . ')');
+					return $r;
+				}
+
+				$GLOBALS['_xh']['headers'] = array();
+				$GLOBALS['_xh']['cookies'] = array();
+
+				// be tolerant to usage of \n instead of \r\n to separate headers and data
+				// (even though it is not valid http)
+				$pos = strpos($data,"\r\n\r\n");
+				if($pos || is_int($pos))
+				{
+					$bd = $pos+4;
+				}
+				else
+				{
+					$pos = strpos($data,"\n\n");
+					if($pos || is_int($pos))
+					{
+						$bd = $pos+2;
+					}
+					else
+					{
+						// No separation between response headers and body: fault?
+						// we could take some action here instead of going on...
+						$bd = 0;
+					}
+				}
+				// be tolerant to line endings, and extra empty lines
+				$ar = preg_split("/\r?\n/", trim(substr($data, 0, $pos)));
+				while(list(,$line) = @each($ar))
+				{
+					// take care of multi-line headers and cookies
+					$arr = explode(':',$line,2);
+					if(count($arr) > 1)
+					{
+						$header_name = strtolower(trim($arr[0]));
+						/// @todo some other headers (the ones that allow a CSV list of values)
+						/// do allow many values to be passed using multiple header lines.
+						/// We should add content to $GLOBALS['_xh']['headers'][$header_name]
+						/// instead of replacing it for those...
+						if ($header_name == 'set-cookie' || $header_name == 'set-cookie2')
+						{
+							if ($header_name == 'set-cookie2')
+							{
+								// version 2 cookies:
+								// there could be many cookies on one line, comma separated
+								$cookies = explode(',', $arr[1]);
+							}
+							else
+							{
+								$cookies = array($arr[1]);
+							}
+							foreach ($cookies as $cookie)
+							{
+								// glue together all received cookies, using a comma to separate them
+								// (same as php does with getallheaders())
+								if (isset($GLOBALS['_xh']['headers'][$header_name]))
+									$GLOBALS['_xh']['headers'][$header_name] .= ', ' . trim($cookie);
+								else
+									$GLOBALS['_xh']['headers'][$header_name] = trim($cookie);
+								// parse cookie attributes, in case user wants to correctly honour them
+								// feature creep: only allow rfc-compliant cookie attributes?
+								// @todo support for server sending multiple time cookie with same name, but using different PATHs
+								$cookie = explode(';', $cookie);
+								foreach ($cookie as $pos => $val)
+								{
+									$val = explode('=', $val, 2);
+									$tag = trim($val[0]);
+									$val = trim(@$val[1]);
+									/// @todo with version 1 cookies, we should strip leading and trailing " chars
+									if ($pos == 0)
+									{
+										$cookiename = $tag;
+										$GLOBALS['_xh']['cookies'][$tag] = array();
+										$GLOBALS['_xh']['cookies'][$cookiename]['value'] = urldecode($val);
+									}
+									else
+									{
+										if ($tag != 'value')
+										{
+										  $GLOBALS['_xh']['cookies'][$cookiename][$tag] = $val;
+										}
+									}
+								}
+							}
+						}
+						else
+						{
+							$GLOBALS['_xh']['headers'][$header_name] = trim($arr[1]);
+						}
+					}
+					elseif(isset($header_name))
+					{
+						///	@todo version1 cookies might span multiple lines, thus breaking the parsing above
+						$GLOBALS['_xh']['headers'][$header_name] .= ' ' . trim($line);
+					}
+				}
+
+				$data = substr($data, $bd);
+
+				if($this->debug && count($GLOBALS['_xh']['headers']))
+				{
+					print '<PRE>';
+					foreach($GLOBALS['_xh']['headers'] as $header => $value)
+					{
+						print htmlentities("HEADER: $header: $value\n");
+					}
+					foreach($GLOBALS['_xh']['cookies'] as $header => $value)
+					{
+						print htmlentities("COOKIE: $header={$value['value']}\n");
+					}
+					print "</PRE>\n";
+				}
+
+				// if CURL was used for the call, http headers have been processed,
+				// and dechunking + reinflating have been carried out
+				if(!$headers_processed)
+				{
+					// Decode chunked encoding sent by http 1.1 servers
+					if(isset($GLOBALS['_xh']['headers']['transfer-encoding']) && $GLOBALS['_xh']['headers']['transfer-encoding'] == 'chunked')
+					{
+						if(!$data = decode_chunked($data))
+						{
+							error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to rebuild the chunked data received from server');
+							$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['dechunk_fail'], $GLOBALS['xmlrpcstr']['dechunk_fail']);
+							return $r;
+						}
+					}
+
+					// Decode gzip-compressed stuff
+					// code shamelessly inspired from nusoap library by Dietrich Ayala
+					if(isset($GLOBALS['_xh']['headers']['content-encoding']))
+					{
+						$GLOBALS['_xh']['headers']['content-encoding'] = str_replace('x-', '', $GLOBALS['_xh']['headers']['content-encoding']);
+						if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' || $GLOBALS['_xh']['headers']['content-encoding'] == 'gzip')
+						{
+							// if decoding works, use it. else assume data wasn't gzencoded
+							if(function_exists('gzinflate'))
+							{
+								if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data))
+								{
+									$data = $degzdata;
+									if($this->debug)
+									print "<PRE>---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---</PRE>";
+								}
+								elseif($GLOBALS['_xh']['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))
+								{
+									$data = $degzdata;
+									if($this->debug)
+									print "<PRE>---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---</PRE>";
+								}
+								else
+								{
+									error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to decode the deflated data received from server');
+									$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['decompress_fail'], $GLOBALS['xmlrpcstr']['decompress_fail']);
+									return $r;
+								}
+							}
+							else
+							{
+								error_log('XML-RPC: '.__METHOD__.': the server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');
+								$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['cannot_decompress'], $GLOBALS['xmlrpcstr']['cannot_decompress']);
+								return $r;
+							}
+						}
+					}
+				} // end of 'if needed, de-chunk, re-inflate response'
+
+				// real stupid hack to avoid PHP complaining about returning NULL by ref
+				$r = null;
+				$r =& $r;
+				return $r;
+		}
+
+		/**
+		* Parse the xmlrpc response contained in the string $data and return an xmlrpcresp object.
+		* @param string $data the xmlrpc response, eventually including http headers
+		* @param bool $headers_processed when true prevents parsing HTTP headers for interpretation of content-encoding and consequent decoding
+		* @param string $return_type decides return type, i.e. content of response->value(). Either 'xmlrpcvals', 'xml' or 'phpvals'
+		* @return xmlrpcresp
+		* @access public
+		*/
+		function &parseResponse($data='', $headers_processed=false, $return_type='xmlrpcvals')
+		{
+			if($this->debug)
+			{
+				//by maHo, replaced htmlspecialchars with htmlentities
+				print "<PRE>---GOT---\n" . htmlentities($data) . "\n---END---\n</PRE>";
+			}
+
+			if($data == '')
+			{
+				error_log('XML-RPC: '.__METHOD__.': no response received from server.');
+				$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_data'], $GLOBALS['xmlrpcstr']['no_data']);
+				return $r;
+			}
+
+			$GLOBALS['_xh']=array();
+
+			$raw_data = $data;
+			// parse the HTTP headers of the response, if present, and separate them from data
+			if(substr($data, 0, 4) == 'HTTP')
+			{
+				$r =& $this->parseResponseHeaders($data, $headers_processed);
+				if ($r)
+				{
+					// failed processing of HTTP response headers
+					// save into response obj the full payload received, for debugging
+					$r->raw_data = $data;
+					return $r;
+				}
+			}
+			else
+			{
+				$GLOBALS['_xh']['headers'] = array();
+				$GLOBALS['_xh']['cookies'] = array();
+			}
+
+			if($this->debug)
+			{
+				$start = strpos($data, '<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
+				if ($start)
+				{
+					$start += strlen('<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
+					$end = strpos($data, '-->', $start);
+					$comments = substr($data, $start, $end-$start);
+					print "<PRE>---SERVER DEBUG INFO (DECODED) ---\n\t".htmlentities(str_replace("\n", "\n\t", base64_decode($comments)))."\n---END---\n</PRE>";
+				}
+			}
+
+			// be tolerant of extra whitespace in response body
+			$data = trim($data);
+
+			/// @todo return an error msg if $data=='' ?
+
+			// be tolerant of junk after methodResponse (e.g. javascript ads automatically inserted by free hosts)
+			// idea from Luca Mariano <luca.mariano@email.it> originally in PEARified version of the lib
+			$pos = strrpos($data, '</methodResponse>');
+			if($pos !== false)
+			{
+				$data = substr($data, 0, $pos+17);
+			}
+
+			// if user wants back raw xml, give it to him
+			if ($return_type == 'xml')
+			{
+				$r = new xmlrpcresp($data, 0, '', 'xml');
+				$r->hdrs = $GLOBALS['_xh']['headers'];
+				$r->_cookies = $GLOBALS['_xh']['cookies'];
+				$r->raw_data = $raw_data;
+				return $r;
+			}
+
+			// try to 'guestimate' the character encoding of the received response
+			$resp_encoding = guess_encoding(@$GLOBALS['_xh']['headers']['content-type'], $data);
+
+			$GLOBALS['_xh']['ac']='';
+			//$GLOBALS['_xh']['qt']=''; //unused...
+			$GLOBALS['_xh']['stack'] = array();
+			$GLOBALS['_xh']['valuestack'] = array();
+			$GLOBALS['_xh']['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc
+			$GLOBALS['_xh']['isf_reason']='';
+			$GLOBALS['_xh']['rt']=''; // 'methodcall or 'methodresponse'
+
+			// if response charset encoding is not known / supported, try to use
+			// the default encoding and parse the xml anyway, but log a warning...
+			if (!in_array($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+			// the following code might be better for mb_string enabled installs, but
+			// makes the lib about 200% slower...
+			//if (!is_valid_charset($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+			{
+				error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received response: '.$resp_encoding);
+				$resp_encoding = $GLOBALS['xmlrpc_defencoding'];
+			}
+			$parser = xml_parser_create($resp_encoding);
+			xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
+			// G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell
+			// the xml parser to give us back data in the expected charset.
+			// What if internal encoding is not in one of the 3 allowed?
+			// we use the broadest one, ie. utf8
+			// This allows to send data which is native in various charset,
+			// by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding
+			if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+			{
+				xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
+			}
+			else
+			{
+				xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);
+			}
+
+			if ($return_type == 'phpvals')
+			{
+				xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
+			}
+			else
+			{
+				xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
+			}
+
+			xml_set_character_data_handler($parser, 'xmlrpc_cd');
+			xml_set_default_handler($parser, 'xmlrpc_dh');
+
+			// first error check: xml not well formed
+			if(!xml_parse($parser, $data, count($data)))
+			{
+				// thanks to Peter Kocks <peter.kocks@baygate.com>
+				if((xml_get_current_line_number($parser)) == 1)
+				{
+					$errstr = 'XML error at line 1, check URL';
+				}
+				else
+				{
+					$errstr = sprintf('XML error: %s at line %d, column %d',
+						xml_error_string(xml_get_error_code($parser)),
+						xml_get_current_line_number($parser), xml_get_current_column_number($parser));
+				}
+				error_log($errstr);
+				$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'].' ('.$errstr.')');
+				xml_parser_free($parser);
+				if($this->debug)
+				{
+					print $errstr;
+				}
+				$r->hdrs = $GLOBALS['_xh']['headers'];
+				$r->_cookies = $GLOBALS['_xh']['cookies'];
+				$r->raw_data = $raw_data;
+				return $r;
+			}
+			xml_parser_free($parser);
+			// second error check: xml well formed but not xml-rpc compliant
+			if ($GLOBALS['_xh']['isf'] > 1)
+			{
+				if ($this->debug)
+				{
+					/// @todo echo something for user?
+				}
+
+				$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],
+				$GLOBALS['xmlrpcstr']['invalid_return'] . ' ' . $GLOBALS['_xh']['isf_reason']);
+			}
+			// third error check: parsing of the response has somehow gone boink.
+			// NB: shall we omit this check, since we trust the parsing code?
+			elseif ($return_type == 'xmlrpcvals' && !is_object($GLOBALS['_xh']['value']))
+			{
+				// something odd has happened
+				// and it's time to generate a client side error
+				// indicating something odd went on
+				$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],
+					$GLOBALS['xmlrpcstr']['invalid_return']);
+			}
+			else
+			{
+				if ($this->debug)
+				{
+					print "<PRE>---PARSED---\n";
+					// somehow htmlentities chokes on var_export, and some full html string...
+					//print htmlentitites(var_export($GLOBALS['_xh']['value'], true));
+					print htmlspecialchars(var_export($GLOBALS['_xh']['value'], true));
+					print "\n---END---</PRE>";
+				}
+
+				// note that using =& will raise an error if $GLOBALS['_xh']['st'] does not generate an object.
+				$v =& $GLOBALS['_xh']['value'];
+
+				if($GLOBALS['_xh']['isf'])
+				{
+					/// @todo we should test here if server sent an int and a string,
+					/// and/or coerce them into such...
+					if ($return_type == 'xmlrpcvals')
+					{
+						$errno_v = $v->structmem('faultCode');
+						$errstr_v = $v->structmem('faultString');
+						$errno = $errno_v->scalarval();
+						$errstr = $errstr_v->scalarval();
+					}
+					else
+					{
+						$errno = $v['faultCode'];
+						$errstr = $v['faultString'];
+					}
+
+					if($errno == 0)
+					{
+						// FAULT returned, errno needs to reflect that
+						$errno = -1;
+					}
+
+					$r = new xmlrpcresp(0, $errno, $errstr);
+				}
+				else
+				{
+					$r=new xmlrpcresp($v, 0, '', $return_type);
+				}
+			}
+
+			$r->hdrs = $GLOBALS['_xh']['headers'];
+			$r->_cookies = $GLOBALS['_xh']['cookies'];
+			$r->raw_data = $raw_data;
+			return $r;
+		}
+	}
+
+	class xmlrpcval
+	{
+		var $me=array();
+		var $mytype=0;
+		var $_php_class=null;
+
+		/**
+		* @param mixed $val
+		* @param string $type any valid xmlrpc type name (lowercase). If null, 'string' is assumed
+		*/
+		function xmlrpcval($val=-1, $type='')
+		{
+			/// @todo: optimization creep - do not call addXX, do it all inline.
+			/// downside: booleans will not be coerced anymore
+			if($val!==-1 || $type!='')
+			{
+				// optimization creep: inlined all work done by constructor
+				switch($type)
+				{
+					case '':
+						$this->mytype=1;
+						$this->me['string']=$val;
+						break;
+					case 'i4':
+					case 'int':
+					case 'double':
+					case 'string':
+					case 'boolean':
+					case 'dateTime.iso8601':
+					case 'base64':
+					case 'null':
+						$this->mytype=1;
+						$this->me[$type]=$val;
+						break;
+					case 'array':
+						$this->mytype=2;
+						$this->me['array']=$val;
+						break;
+					case 'struct':
+						$this->mytype=3;
+						$this->me['struct']=$val;
+						break;
+					default:
+						error_log("XML-RPC: ".__METHOD__.": not a known type ($type)");
+				}
+				/*if($type=='')
+				{
+					$type='string';
+				}
+				if($GLOBALS['xmlrpcTypes'][$type]==1)
+				{
+					$this->addScalar($val,$type);
+				}
+				elseif($GLOBALS['xmlrpcTypes'][$type]==2)
+				{
+					$this->addArray($val);
+				}
+				elseif($GLOBALS['xmlrpcTypes'][$type]==3)
+				{
+					$this->addStruct($val);
+				}*/
+			}
+		}
+
+		/**
+		* Add a single php value to an (unitialized) xmlrpcval
+		* @param mixed $val
+		* @param string $type
+		* @return int 1 or 0 on failure
+		*/
+		function addScalar($val, $type='string')
+		{
+			$typeof=@$GLOBALS['xmlrpcTypes'][$type];
+			if($typeof!=1)
+			{
+				error_log("XML-RPC: ".__METHOD__.": not a scalar type ($type)");
+				return 0;
+			}
+
+			// coerce booleans into correct values
+			// NB: we should either do it for datetimes, integers and doubles, too,
+			// or just plain remove this check, implemented on booleans only...
+			if($type==$GLOBALS['xmlrpcBoolean'])
+			{
+				if(strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false')))
+				{
+					$val=true;
+				}
+				else
+				{
+					$val=false;
+				}
+			}
+
+			switch($this->mytype)
+			{
+				case 1:
+					error_log('XML-RPC: '.__METHOD__.': scalar xmlrpcval can have only one value');
+					return 0;
+				case 3:
+					error_log('XML-RPC: '.__METHOD__.': cannot add anonymous scalar to struct xmlrpcval');
+					return 0;
+				case 2:
+					// we're adding a scalar value to an array here
+					//$ar=$this->me['array'];
+					//$ar[]=new xmlrpcval($val, $type);
+					//$this->me['array']=$ar;
+					// Faster (?) avoid all the costly array-copy-by-val done here...
+					$this->me['array'][]=new xmlrpcval($val, $type);
+					return 1;
+				default:
+					// a scalar, so set the value and remember we're scalar
+					$this->me[$type]=$val;
+					$this->mytype=$typeof;
+					return 1;
+			}
+		}
+
+		/**
+		* Add an array of xmlrpcval objects to an xmlrpcval
+		* @param array $vals
+		* @return int 1 or 0 on failure
+		* @access public
+		*
+		* @todo add some checking for $vals to be an array of xmlrpcvals?
+		*/
+		function addArray($vals)
+		{
+			if($this->mytype==0)
+			{
+				$this->mytype=$GLOBALS['xmlrpcTypes']['array'];
+				$this->me['array']=$vals;
+				return 1;
+			}
+			elseif($this->mytype==2)
+			{
+				// we're adding to an array here
+				$this->me['array'] = array_merge($this->me['array'], $vals);
+				return 1;
+			}
+			else
+			{
+				error_log('XML-RPC: '.__METHOD__.': already initialized as a [' . $this->kindOf() . ']');
+				return 0;
+			}
+		}
+
+		/**
+		* Add an array of named xmlrpcval objects to an xmlrpcval
+		* @param array $vals
+		* @return int 1 or 0 on failure
+		* @access public
+		*
+		* @todo add some checking for $vals to be an array?
+		*/
+		function addStruct($vals)
+		{
+			if($this->mytype==0)
+			{
+				$this->mytype=$GLOBALS['xmlrpcTypes']['struct'];
+				$this->me['struct']=$vals;
+				return 1;
+			}
+			elseif($this->mytype==3)
+			{
+				// we're adding to a struct here
+				$this->me['struct'] = array_merge($this->me['struct'], $vals);
+				return 1;
+			}
+			else
+			{
+				error_log('XML-RPC: '.__METHOD__.': already initialized as a [' . $this->kindOf() . ']');
+				return 0;
+			}
+		}
+
+		// poor man's version of print_r ???
+		// DEPRECATED!
+		function dump($ar)
+		{
+			foreach($ar as $key => $val)
+			{
+				echo "$key => $val<br />";
+				if($key == 'array')
+				{
+					while(list($key2, $val2) = each($val))
+					{
+						echo "-- $key2 => $val2<br />";
+					}
+				}
+			}
+		}
+
+		/**
+		* Returns a string containing "struct", "array" or "scalar" describing the base type of the value
+		* @return string
+		* @access public
+		*/
+		function kindOf()
+		{
+			switch($this->mytype)
+			{
+				case 3:
+					return 'struct';
+					break;
+				case 2:
+					return 'array';
+					break;
+				case 1:
+					return 'scalar';
+					break;
+				default:
+					return 'undef';
+			}
+		}
+
+		/**
+		* @access private
+		*/
+		function serializedata($typ, $val, $charset_encoding='')
+		{
+			$rs='';
+			switch(@$GLOBALS['xmlrpcTypes'][$typ])
+			{
+				case 1:
+					switch($typ)
+					{
+						case $GLOBALS['xmlrpcBase64']:
+							$rs.="<${typ}>" . base64_encode($val) . "</${typ}>";
+							break;
+						case $GLOBALS['xmlrpcBoolean']:
+							$rs.="<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
+							break;
+						case $GLOBALS['xmlrpcString']:
+							// G. Giunta 2005/2/13: do NOT use htmlentities, since
+							// it will produce named html entities, which are invalid xml
+							$rs.="<${typ}>" . xmlrpc_encode_entitites($val, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding). "</${typ}>";
+							break;
+						case $GLOBALS['xmlrpcInt']:
+						case $GLOBALS['xmlrpcI4']:
+							$rs.="<${typ}>".(int)$val."</${typ}>";
+							break;
+						case $GLOBALS['xmlrpcDouble']:
+							// avoid using standard conversion of float to string because it is locale-dependent,
+							// and also because the xmlrpc spec forbids exponential notation.
+							// sprintf('%F') could be most likely ok but it fails eg. on 2e-14.
+							// The code below tries its best at keeping max precision while avoiding exp notation,
+							// but there is of course no limit in the number of decimal places to be used...
+							$rs.="<${typ}>".preg_replace('/\\.?0+$/','',number_format((double)$val, 128, '.', ''))."</${typ}>";
+							break;
+						case $GLOBALS['xmlrpcDateTime']:
+							if (is_string($val))
+							{
+								$rs.="<${typ}>${val}</${typ}>";
+							}
+							else if(is_a($val, 'DateTime'))
+							{
+								$rs.="<${typ}>".$val->format('Ymd\TH:i:s')."</${typ}>";
+							}
+							else if(is_int($val))
+							{
+								$rs.="<${typ}>".strftime("%Y%m%dT%H:%M:%S", $val)."</${typ}>";
+							}
+							else
+							{
+								// not really a good idea here: but what shall we output anyway? left for backward compat...
+								$rs.="<${typ}>${val}</${typ}>";
+							}
+							break;
+						case $GLOBALS['xmlrpcNull']:
+							if ($GLOBALS['xmlrpc_null_apache_encoding'])
+							{
+								$rs.="<ex:nil/>";
+							}
+							else
+							{
+								$rs.="<nil/>";
+							}
+							break;
+						default:
+							// no standard type value should arrive here, but provide a possibility
+							// for xmlrpcvals of unknown type...
+							$rs.="<${typ}>${val}</${typ}>";
+					}
+					break;
+				case 3:
+					// struct
+					if ($this->_php_class)
+					{
+						$rs.='<struct php_class="' . $this->_php_class . "\">\n";
+					}
+					else
+					{
+						$rs.="<struct>\n";
+					}
+					foreach($val as $key2 => $val2)
+					{
+						$rs.='<member><name>'.xmlrpc_encode_entitites($key2, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding)."</name>\n";
+						//$rs.=$this->serializeval($val2);
+						$rs.=$val2->serialize($charset_encoding);
+						$rs.="</member>\n";
+					}
+					$rs.='</struct>';
+					break;
+				case 2:
+					// array
+					$rs.="<array>\n<data>\n";
+					for($i=0; $i<count($val); $i++)
+					{
+						//$rs.=$this->serializeval($val[$i]);
+						$rs.=$val[$i]->serialize($charset_encoding);
+					}
+					$rs.="</data>\n</array>";
+					break;
+				default:
+					break;
+			}
+			return $rs;
+		}
+
+		/**
+		* Returns xml representation of the value. XML prologue not included
+		* @param string $charset_encoding the charset to be used for serialization. if null, US-ASCII is assumed
+		* @return string
+		* @access public
+		*/
+		function serialize($charset_encoding='')
+		{
+			// add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals...
+			//if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval')))
+			//{
+				reset($this->me);
+				list($typ, $val) = each($this->me);
+				return '<value>' . $this->serializedata($typ, $val, $charset_encoding) . "</value>\n";
+			//}
+		}
+
+		// DEPRECATED
+		function serializeval($o)
+		{
+			// add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals...
+			//if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval')))
+			//{
+				$ar=$o->me;
+				reset($ar);
+				list($typ, $val) = each($ar);
+				return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
+			//}
+		}
+
+		/**
+		* Checks wheter a struct member with a given name is present.
+		* Works only on xmlrpcvals of type struct.
+		* @param string $m the name of the struct member to be looked up
+		* @return boolean
+		* @access public
+		*/
+		function structmemexists($m)
+		{
+			return array_key_exists($m, $this->me['struct']);
+		}
+
+		/**
+		* Returns the value of a given struct member (an xmlrpcval object in itself).
+		* Will raise a php warning if struct member of given name does not exist
+		* @param string $m the name of the struct member to be looked up
+		* @return xmlrpcval
+		* @access public
+		*/
+		function structmem($m)
+		{
+			return $this->me['struct'][$m];
+		}
+
+		/**
+		* Reset internal pointer for xmlrpcvals of type struct.
+		* @access public
+		*/
+		function structreset()
+		{
+			reset($this->me['struct']);
+		}
+
+		/**
+		* Return next member element for xmlrpcvals of type struct.
+		* @return xmlrpcval
+		* @access public
+		*/
+		function structeach()
+		{
+			return each($this->me['struct']);
+		}
+
+		// DEPRECATED! this code looks like it is very fragile and has not been fixed
+		// for a long long time. Shall we remove it for 2.0?
+		function getval()
+		{
+			// UNSTABLE
+			reset($this->me);
+			list($a,$b)=each($this->me);
+			// contributed by I Sofer, 2001-03-24
+			// add support for nested arrays to scalarval
+			// i've created a new method here, so as to
+			// preserve back compatibility
+
+			if(is_array($b))
+			{
+				@reset($b);
+				while(list($id,$cont) = @each($b))
+				{
+					$b[$id] = $cont->scalarval();
+				}
+			}
+
+			// add support for structures directly encoding php objects
+			if(is_object($b))
+			{
+				$t = get_object_vars($b);
+				@reset($t);
+				while(list($id,$cont) = @each($t))
+				{
+					$t[$id] = $cont->scalarval();
+				}
+				@reset($t);
+				while(list($id,$cont) = @each($t))
+				{
+					@$b->$id = $cont;
+				}
+			}
+			// end contrib
+			return $b;
+		}
+
+		/**
+		* Returns the value of a scalar xmlrpcval
+		* @return mixed
+		* @access public
+		*/
+		function scalarval()
+		{
+			reset($this->me);
+			list(,$b)=each($this->me);
+			return $b;
+		}
+
+		/**
+		* Returns the type of the xmlrpcval.
+		* For integers, 'int' is always returned in place of 'i4'
+		* @return string
+		* @access public
+		*/
+		function scalartyp()
+		{
+			reset($this->me);
+			list($a,)=each($this->me);
+			if($a==$GLOBALS['xmlrpcI4'])
+			{
+				$a=$GLOBALS['xmlrpcInt'];
+			}
+			return $a;
+		}
+
+		/**
+		* Returns the m-th member of an xmlrpcval of struct type
+		* @param integer $m the index of the value to be retrieved (zero based)
+		* @return xmlrpcval
+		* @access public
+		*/
+		function arraymem($m)
+		{
+			return $this->me['array'][$m];
+		}
+
+		/**
+		* Returns the number of members in an xmlrpcval of array type
+		* @return integer
+		* @access public
+		*/
+		function arraysize()
+		{
+			return count($this->me['array']);
+		}
+
+		/**
+		* Returns the number of members in an xmlrpcval of struct type
+		* @return integer
+		* @access public
+		*/
+		function structsize()
+		{
+			return count($this->me['struct']);
+		}
+	}
+
+
+	// date helpers
+
+	/**
+	* Given a timestamp, return the corresponding ISO8601 encoded string.
+	*
+	* Really, timezones ought to be supported
+	* but the XML-RPC spec says:
+	*
+	* "Don't assume a timezone. It should be specified by the server in its
+	* documentation what assumptions it makes about timezones."
+	*
+	* These routines always assume localtime unless
+	* $utc is set to 1, in which case UTC is assumed
+	* and an adjustment for locale is made when encoding
+	*
+	* @param int $timet (timestamp)
+	* @param int $utc (0 or 1)
+	* @return string
+	*/
+	function iso8601_encode($timet, $utc=0)
+	{
+		if(!$utc)
+		{
+			$t=strftime("%Y%m%dT%H:%M:%S", $timet);
+		}
+		else
+		{
+			if(function_exists('gmstrftime'))
+			{
+				// gmstrftime doesn't exist in some versions
+				// of PHP
+				$t=gmstrftime("%Y%m%dT%H:%M:%S", $timet);
+			}
+			else
+			{
+				$t=strftime("%Y%m%dT%H:%M:%S", $timet-date('Z'));
+			}
+		}
+		return $t;
+	}
+
+	/**
+	* Given an ISO8601 date string, return a timet in the localtime, or UTC
+	* @param string $idate
+	* @param int $utc either 0 or 1
+	* @return int (datetime)
+	*/
+	function iso8601_decode($idate, $utc=0)
+	{
+		$t=0;
+		if(preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $idate, $regs))
+		{
+			if($utc)
+			{
+				$t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+			}
+			else
+			{
+				$t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+			}
+		}
+		return $t;
+	}
+
+	/**
+	* Takes an xmlrpc value in PHP xmlrpcval object format and translates it into native PHP types.
+	*
+	* Works with xmlrpc message objects as input, too.
+	*
+	* Given proper options parameter, can rebuild generic php object instances
+	* (provided those have been encoded to xmlrpc format using a corresponding
+	* option in php_xmlrpc_encode())
+	* PLEASE NOTE that rebuilding php objects involves calling their constructor function.
+	* This means that the remote communication end can decide which php code will
+	* get executed on your server, leaving the door possibly open to 'php-injection'
+	* style of attacks (provided you have some classes defined on your server that
+	* might wreak havoc if instances are built outside an appropriate context).
+	* Make sure you trust the remote server/client before eanbling this!
+	*
+	* @author Dan Libby (dan@libby.com)
+	*
+	* @param xmlrpcval $xmlrpc_val
+	* @param array $options if 'decode_php_objs' is set in the options array, xmlrpc structs can be decoded into php objects; if 'dates_as_objects' is set xmlrpc datetimes are decoded as php DateTime objects (standard is
+	* @return mixed
+	*/
+	function php_xmlrpc_decode($xmlrpc_val, $options=array())
+	{
+		switch($xmlrpc_val->kindOf())
+		{
+			case 'scalar':
+				if (in_array('extension_api', $options))
+				{
+					reset($xmlrpc_val->me);
+					list($typ,$val) = each($xmlrpc_val->me);
+					switch ($typ)
+					{
+						case 'dateTime.iso8601':
+							$xmlrpc_val->scalar = $val;
+							$xmlrpc_val->xmlrpc_type = 'datetime';
+							$xmlrpc_val->timestamp = iso8601_decode($val);
+							return $xmlrpc_val;
+						case 'base64':
+							$xmlrpc_val->scalar = $val;
+							$xmlrpc_val->type = $typ;
+							return $xmlrpc_val;
+						default:
+							return $xmlrpc_val->scalarval();
+					}
+				}
+				if (in_array('dates_as_objects', $options) && $xmlrpc_val->scalartyp() == 'dateTime.iso8601')
+				{
+					// we return a Datetime object instead of a string
+					// since now the constructor of xmlrpcval accepts safely strings, ints and datetimes,
+					// we cater to all 3 cases here
+					$out = $xmlrpc_val->scalarval();
+					if (is_string($out))
+					{
+						$out = strtotime($out);
+					}
+					if (is_int($out))
+					{
+						$result = new Datetime();
+						$result->setTimestamp($out);
+						return $result;
+					}
+					elseif (is_a($out, 'Datetime'))
+					{
+						return $out;
+					}
+				}
+				return $xmlrpc_val->scalarval();
+			case 'array':
+				$size = $xmlrpc_val->arraysize();
+				$arr = array();
+				for($i = 0; $i < $size; $i++)
+				{
+					$arr[] = php_xmlrpc_decode($xmlrpc_val->arraymem($i), $options);
+				}
+				return $arr;
+			case 'struct':
+				$xmlrpc_val->structreset();
+				// If user said so, try to rebuild php objects for specific struct vals.
+				/// @todo should we raise a warning for class not found?
+				// shall we check for proper subclass of xmlrpcval instead of
+				// presence of _php_class to detect what we can do?
+				if (in_array('decode_php_objs', $options) && $xmlrpc_val->_php_class != ''
+					&& class_exists($xmlrpc_val->_php_class))
+				{
+					$obj = @new $xmlrpc_val->_php_class;
+					while(list($key,$value)=$xmlrpc_val->structeach())
+					{
+						$obj->$key = php_xmlrpc_decode($value, $options);
+					}
+					return $obj;
+				}
+				else
+				{
+					$arr = array();
+					while(list($key,$value)=$xmlrpc_val->structeach())
+					{
+						$arr[$key] = php_xmlrpc_decode($value, $options);
+					}
+					return $arr;
+				}
+			case 'msg':
+				$paramcount = $xmlrpc_val->getNumParams();
+				$arr = array();
+				for($i = 0; $i < $paramcount; $i++)
+				{
+					$arr[] = php_xmlrpc_decode($xmlrpc_val->getParam($i));
+				}
+				return $arr;
+			}
+	}
+
+	// This constant left here only for historical reasons...
+	// it was used to decide if we have to define xmlrpc_encode on our own, but
+	// we do not do it anymore
+	if(function_exists('xmlrpc_decode'))
+	{
+		define('XMLRPC_EPI_ENABLED','1');
+	}
+	else
+	{
+		define('XMLRPC_EPI_ENABLED','0');
+	}
+
+	/**
+	* Takes native php types and encodes them into xmlrpc PHP object format.
+	* It will not re-encode xmlrpcval objects.
+	*
+	* Feature creep -- could support more types via optional type argument
+	* (string => datetime support has been added, ??? => base64 not yet)
+	*
+	* If given a proper options parameter, php object instances will be encoded
+	* into 'special' xmlrpc values, that can later be decoded into php objects
+	* by calling php_xmlrpc_decode() with a corresponding option
+	*
+	* @author Dan Libby (dan@libby.com)
+	*
+	* @param mixed $php_val the value to be converted into an xmlrpcval object
+	* @param array $options	can include 'encode_php_objs', 'auto_dates', 'null_extension' or 'extension_api'
+	* @return xmlrpcval
+	*/
+	function php_xmlrpc_encode($php_val, $options=array())
+	{
+		$type = gettype($php_val);
+		switch($type)
+		{
+			case 'string':
+				if (in_array('auto_dates', $options) && preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $php_val))
+					$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDateTime']);
+				else
+					$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcString']);
+				break;
+			case 'integer':
+				$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcInt']);
+				break;
+			case 'double':
+				$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDouble']);
+				break;
+				// <G_Giunta_2001-02-29>
+				// Add support for encoding/decoding of booleans, since they are supported in PHP
+			case 'boolean':
+				$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcBoolean']);
+				break;
+				// </G_Giunta_2001-02-29>
+			case 'array':
+				// PHP arrays can be encoded to either xmlrpc structs or arrays,
+				// depending on wheter they are hashes or plain 0..n integer indexed
+				// A shorter one-liner would be
+				// $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
+				// but execution time skyrockets!
+				$j = 0;
+				$arr = array();
+				$ko = false;
+				foreach($php_val as $key => $val)
+				{
+					$arr[$key] = php_xmlrpc_encode($val, $options);
+					if(!$ko && $key !== $j)
+					{
+						$ko = true;
+					}
+					$j++;
+				}
+				if($ko)
+				{
+					$xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);
+				}
+				else
+				{
+					$xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcArray']);
+				}
+				break;
+			case 'object':
+				if(is_a($php_val, 'xmlrpcval'))
+				{
+					$xmlrpc_val = $php_val;
+				}
+				else if(is_a($php_val, 'DateTime'))
+				{
+					$xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $GLOBALS['xmlrpcStruct']);
+				}
+				else
+				{
+					$arr = array();
+					reset($php_val);
+					while(list($k,$v) = each($php_val))
+					{
+						$arr[$k] = php_xmlrpc_encode($v, $options);
+					}
+					$xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);
+					if (in_array('encode_php_objs', $options))
+					{
+						// let's save original class name into xmlrpcval:
+						// might be useful later on...
+						$xmlrpc_val->_php_class = get_class($php_val);
+					}
+				}
+				break;
+			case 'NULL':
+				if (in_array('extension_api', $options))
+				{
+					$xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcString']);
+				}
+				else if (in_array('null_extension', $options))
+				{
+					$xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcNull']);
+				}
+				else
+				{
+					$xmlrpc_val = new xmlrpcval();
+				}
+				break;
+			case 'resource':
+				if (in_array('extension_api', $options))
+				{
+					$xmlrpc_val = new xmlrpcval((int)$php_val, $GLOBALS['xmlrpcInt']);
+				}
+				else
+				{
+					$xmlrpc_val = new xmlrpcval();
+				}
+			// catch "user function", "unknown type"
+			default:
+				// giancarlo pinerolo <ping@alt.it>
+				// it has to return
+				// an empty object in case, not a boolean.
+				$xmlrpc_val = new xmlrpcval();
+				break;
+			}
+			return $xmlrpc_val;
+	}
+
+	/**
+	* Convert the xml representation of a method response, method request or single
+	* xmlrpc value into the appropriate object (a.k.a. deserialize)
+	* @param string $xml_val
+	* @param array $options
+	* @return mixed false on error, or an instance of either xmlrpcval, xmlrpcmsg or xmlrpcresp
+	*/
+	function php_xmlrpc_decode_xml($xml_val, $options=array())
+	{
+		$GLOBALS['_xh'] = array();
+		$GLOBALS['_xh']['ac'] = '';
+		$GLOBALS['_xh']['stack'] = array();
+		$GLOBALS['_xh']['valuestack'] = array();
+		$GLOBALS['_xh']['params'] = array();
+		$GLOBALS['_xh']['pt'] = array();
+		$GLOBALS['_xh']['isf'] = 0;
+		$GLOBALS['_xh']['isf_reason'] = '';
+		$GLOBALS['_xh']['method'] = false;
+		$GLOBALS['_xh']['rt'] = '';
+		/// @todo 'guestimate' encoding
+		$parser = xml_parser_create();
+		xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
+		// What if internal encoding is not in one of the 3 allowed?
+		// we use the broadest one, ie. utf8!
+		if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+		{
+			xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
+		}
+		else
+		{
+			xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);
+		}
+		xml_set_element_handler($parser, 'xmlrpc_se_any', 'xmlrpc_ee');
+		xml_set_character_data_handler($parser, 'xmlrpc_cd');
+		xml_set_default_handler($parser, 'xmlrpc_dh');
+		if(!xml_parse($parser, $xml_val, 1))
+		{
+			$errstr = sprintf('XML error: %s at line %d, column %d',
+						xml_error_string(xml_get_error_code($parser)),
+						xml_get_current_line_number($parser), xml_get_current_column_number($parser));
+			error_log($errstr);
+			xml_parser_free($parser);
+			return false;
+		}
+		xml_parser_free($parser);
+		if ($GLOBALS['_xh']['isf'] > 1) // test that $GLOBALS['_xh']['value'] is an obj, too???
+		{
+			error_log($GLOBALS['_xh']['isf_reason']);
+			return false;
+		}
+		switch ($GLOBALS['_xh']['rt'])
+		{
+			case 'methodresponse':
+				$v =& $GLOBALS['_xh']['value'];
+				if ($GLOBALS['_xh']['isf'] == 1)
+				{
+					$vc = $v->structmem('faultCode');
+					$vs = $v->structmem('faultString');
+					$r = new xmlrpcresp(0, $vc->scalarval(), $vs->scalarval());
+				}
+				else
+				{
+					$r = new xmlrpcresp($v);
+				}
+				return $r;
+			case 'methodcall':
+				$m = new xmlrpcmsg($GLOBALS['_xh']['method']);
+				for($i=0; $i < count($GLOBALS['_xh']['params']); $i++)
+				{
+					$m->addParam($GLOBALS['_xh']['params'][$i]);
+				}
+				return $m;
+			case 'value':
+				return $GLOBALS['_xh']['value'];
+			default:
+				return false;
+		}
+	}
+
+	/**
+	* decode a string that is encoded w/ "chunked" transfer encoding
+	* as defined in rfc2068 par. 19.4.6
+	* code shamelessly stolen from nusoap library by Dietrich Ayala
+	*
+	* @param string $buffer the string to be decoded
+	* @return string
+	*/
+	function decode_chunked($buffer)
+	{
+		// length := 0
+		$length = 0;
+		$new = '';
+
+		// read chunk-size, chunk-extension (if any) and crlf
+		// get the position of the linebreak
+		$chunkend = strpos($buffer,"\r\n") + 2;
+		$temp = substr($buffer,0,$chunkend);
+		$chunk_size = hexdec( trim($temp) );
+		$chunkstart = $chunkend;
+		while($chunk_size > 0)
+		{
+			$chunkend = strpos($buffer, "\r\n", $chunkstart + $chunk_size);
+
+			// just in case we got a broken connection
+			if($chunkend == false)
+			{
+				$chunk = substr($buffer,$chunkstart);
+				// append chunk-data to entity-body
+				$new .= $chunk;
+				$length += strlen($chunk);
+				break;
+			}
+
+			// read chunk-data and crlf
+			$chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart);
+			// append chunk-data to entity-body
+			$new .= $chunk;
+			// length := length + chunk-size
+			$length += strlen($chunk);
+			// read chunk-size and crlf
+			$chunkstart = $chunkend + 2;
+
+			$chunkend = strpos($buffer,"\r\n",$chunkstart)+2;
+			if($chunkend == false)
+			{
+				break; //just in case we got a broken connection
+			}
+			$temp = substr($buffer,$chunkstart,$chunkend-$chunkstart);
+			$chunk_size = hexdec( trim($temp) );
+			$chunkstart = $chunkend;
+		}
+		return $new;
+	}
+
+	/**
+	* xml charset encoding guessing helper function.
+	* Tries to determine the charset encoding of an XML chunk received over HTTP.
+	* NB: according to the spec (RFC 3023), if text/xml content-type is received over HTTP without a content-type,
+	* we SHOULD assume it is strictly US-ASCII. But we try to be more tolerant of unconforming (legacy?) clients/servers,
+	* which will be most probably using UTF-8 anyway...
+	*
+	* @param string $httpheaders the http Content-type header
+	* @param string $xmlchunk xml content buffer
+	* @param string $encoding_prefs comma separated list of character encodings to be used as default (when mb extension is enabled)
+	*
+	* @todo explore usage of mb_http_input(): does it detect http headers + post data? if so, use it instead of hand-detection!!!
+	*/
+	function guess_encoding($httpheader='', $xmlchunk='', $encoding_prefs=null)
+	{
+		// discussion: see http://www.yale.edu/pclt/encoding/
+		// 1 - test if encoding is specified in HTTP HEADERS
+
+		//Details:
+		// LWS:           (\13\10)?( |\t)+
+		// token:         (any char but excluded stuff)+
+		// quoted string: " (any char but double quotes and cointrol chars)* "
+		// header:        Content-type = ...; charset=value(; ...)*
+		//   where value is of type token, no LWS allowed between 'charset' and value
+		// Note: we do not check for invalid chars in VALUE:
+		//   this had better be done using pure ereg as below
+		// Note 2: we might be removing whitespace/tabs that ought to be left in if
+		//   the received charset is a quoted string. But nobody uses such charset names...
+
+		/// @todo this test will pass if ANY header has charset specification, not only Content-Type. Fix it?
+		$matches = array();
+		if(preg_match('/;\s*charset\s*=([^;]+)/i', $httpheader, $matches))
+		{
+			return strtoupper(trim($matches[1], " \t\""));
+		}
+
+		// 2 - scan the first bytes of the data for a UTF-16 (or other) BOM pattern
+		//     (source: http://www.w3.org/TR/2000/REC-xml-20001006)
+		//     NOTE: actually, according to the spec, even if we find the BOM and determine
+		//     an encoding, we should check if there is an encoding specified
+		//     in the xml declaration, and verify if they match.
+		/// @todo implement check as described above?
+		/// @todo implement check for first bytes of string even without a BOM? (It sure looks harder than for cases WITH a BOM)
+		if(preg_match('/^(\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\x00\x00\xFF\xFE|\xFE\xFF\x00\x00)/', $xmlchunk))
+		{
+			return 'UCS-4';
+		}
+		elseif(preg_match('/^(\xFE\xFF|\xFF\xFE)/', $xmlchunk))
+		{
+			return 'UTF-16';
+		}
+		elseif(preg_match('/^(\xEF\xBB\xBF)/', $xmlchunk))
+		{
+			return 'UTF-8';
+		}
+
+		// 3 - test if encoding is specified in the xml declaration
+		// Details:
+		// SPACE:         (#x20 | #x9 | #xD | #xA)+ === [ \x9\xD\xA]+
+		// EQ:            SPACE?=SPACE? === [ \x9\xD\xA]*=[ \x9\xD\xA]*
+		if (preg_match('/^<\?xml\s+version\s*=\s*'. "((?:\"[a-zA-Z0-9_.:-]+\")|(?:'[a-zA-Z0-9_.:-]+'))".
+			'\s+encoding\s*=\s*' . "((?:\"[A-Za-z][A-Za-z0-9._-]*\")|(?:'[A-Za-z][A-Za-z0-9._-]*'))/",
+			$xmlchunk, $matches))
+		{
+			return strtoupper(substr($matches[2], 1, -1));
+		}
+
+		// 4 - if mbstring is available, let it do the guesswork
+		// NB: we favour finding an encoding that is compatible with what we can process
+		if(extension_loaded('mbstring'))
+		{
+			if($encoding_prefs)
+			{
+				$enc = mb_detect_encoding($xmlchunk, $encoding_prefs);
+			}
+			else
+			{
+				$enc = mb_detect_encoding($xmlchunk);
+			}
+			// NB: mb_detect likes to call it ascii, xml parser likes to call it US_ASCII...
+			// IANA also likes better US-ASCII, so go with it
+			if($enc == 'ASCII')
+			{
+				$enc = 'US-'.$enc;
+			}
+			return $enc;
+		}
+		else
+		{
+			// no encoding specified: as per HTTP1.1 assume it is iso-8859-1?
+			// Both RFC 2616 (HTTP 1.1) and 1945 (HTTP 1.0) clearly state that for text/xxx content types
+			// this should be the standard. And we should be getting text/xml as request and response.
+			// BUT we have to be backward compatible with the lib, which always used UTF-8 as default...
+			return $GLOBALS['xmlrpc_defencoding'];
+		}
+	}
+
+	/**
+	* Checks if a given charset encoding is present in a list of encodings or
+	* if it is a valid subset of any encoding in the list
+	* @param string $encoding charset to be tested
+	* @param mixed $validlist comma separated list of valid charsets (or array of charsets)
+	*/
+	function is_valid_charset($encoding, $validlist)
+	{
+		$charset_supersets = array(
+			'US-ASCII' => array ('ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4',
+				'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8',
+				'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-11', 'ISO-8859-12',
+				'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'UTF-8',
+				'EUC-JP', 'EUC-', 'EUC-KR', 'EUC-CN')
+		);
+		if (is_string($validlist))
+			$validlist = explode(',', $validlist);
+		if (@in_array(strtoupper($encoding), $validlist))
+			return true;
+		else
+		{
+			if (array_key_exists($encoding, $charset_supersets))
+				foreach ($validlist as $allowed)
+					if (in_array($allowed, $charset_supersets[$encoding]))
+						return true;
+				return false;
+		}
+	}
+
+?>
Index: /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc_wrappers.inc
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc_wrappers.inc	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc_wrappers.inc	(revision 5261)
@@ -0,0 +1,955 @@
+<?php
+/**
+ * PHP-XMLRPC "wrapper" functions
+ * Generate stubs to transparently access xmlrpc methods as php functions and viceversa
+ *
+ * @version $Id: xmlrpc_wrappers.inc,v 1.13 2008/09/20 01:23:47 ggiunta Exp $
+ * @author Gaetano Giunta
+ * @copyright (C) 2006-2009 G. Giunta
+ * @license code licensed under the BSD License: http://phpxmlrpc.sourceforge.net/license.txt
+ *
+ * @todo separate introspection from code generation for func-2-method wrapping
+ * @todo use some better templating system for code generation?
+ * @todo implement method wrapping with preservation of php objs in calls
+ * @todo when wrapping methods without obj rebuilding, use return_type = 'phpvals' (faster)
+ * @todo implement self-parsing of php code for PHP <= 4
+ */
+
+	// requires: xmlrpc.inc
+
+	/**
+	* Given a string defining a php type or phpxmlrpc type (loosely defined: strings
+	* accepted come from javadoc blocks), return corresponding phpxmlrpc type.
+	* NB: for php 'resource' types returns empty string, since resources cannot be serialized;
+	* for php class names returns 'struct', since php objects can be serialized as xmlrpc structs
+	* for php arrays always return array, even though arrays sometiles serialize as json structs
+	* @param string $phptype
+	* @return string
+	*/
+	function php_2_xmlrpc_type($phptype)
+	{
+		switch(strtolower($phptype))
+		{
+			case 'string':
+				return $GLOBALS['xmlrpcString'];
+			case 'integer':
+			case $GLOBALS['xmlrpcInt']: // 'int'
+			case $GLOBALS['xmlrpcI4']:
+				return $GLOBALS['xmlrpcInt'];
+			case 'double':
+				return $GLOBALS['xmlrpcDouble'];
+			case 'boolean':
+				return $GLOBALS['xmlrpcBoolean'];
+			case 'array':
+				return $GLOBALS['xmlrpcArray'];
+			case 'object':
+				return $GLOBALS['xmlrpcStruct'];
+			case $GLOBALS['xmlrpcBase64']:
+			case $GLOBALS['xmlrpcStruct']:
+				return strtolower($phptype);
+			case 'resource':
+				return '';
+			default:
+				if(class_exists($phptype))
+				{
+					return $GLOBALS['xmlrpcStruct'];
+				}
+				else
+				{
+					// unknown: might be any 'extended' xmlrpc type
+					return $GLOBALS['xmlrpcValue'];
+				}
+		}
+	}
+
+	/**
+	* Given a string defining a phpxmlrpc type return corresponding php type.
+	* @param string $xmlrpctype
+	* @return string
+	*/
+	function xmlrpc_2_php_type($xmlrpctype)
+	{
+		switch(strtolower($xmlrpctype))
+		{
+			case 'base64':
+			case 'datetime.iso8601':
+			case 'string':
+				return $GLOBALS['xmlrpcString'];
+			case 'int':
+			case 'i4':
+				return 'integer';
+			case 'struct':
+			case 'array':
+				return 'array';
+			case 'double':
+				return 'float';
+			case 'undefined':
+				return 'mixed';
+			case 'boolean':
+			case 'null':
+			default:
+				// unknown: might be any xmlrpc type
+				return strtolower($xmlrpctype);
+		}
+	}
+
+	/**
+	* Given a user-defined PHP function, create a PHP 'wrapper' function that can
+	* be exposed as xmlrpc method from an xmlrpc_server object and called from remote
+	* clients (as well as its corresponding signature info).
+	*
+	* Since php is a typeless language, to infer types of input and output parameters,
+	* it relies on parsing the javadoc-style comment block associated with the given
+	* function. Usage of xmlrpc native types (such as datetime.dateTime.iso8601 and base64)
+	* in the @param tag is also allowed, if you need the php function to receive/send
+	* data in that particular format (note that base64 encoding/decoding is transparently
+	* carried out by the lib, while datetime vals are passed around as strings)
+	*
+	* Known limitations:
+	* - requires PHP 5.0.3 +
+	* - only works for user-defined functions, not for PHP internal functions
+	*   (reflection does not support retrieving number/type of params for those)
+	* - functions returning php objects will generate special xmlrpc responses:
+	*   when the xmlrpc decoding of those responses is carried out by this same lib, using
+	*   the appropriate param in php_xmlrpc_decode, the php objects will be rebuilt.
+	*   In short: php objects can be serialized, too (except for their resource members),
+	*   using this function.
+	*   Other libs might choke on the very same xml that will be generated in this case
+	*   (i.e. it has a nonstandard attribute on struct element tags)
+	* - usage of javadoc @param tags using param names in a different order from the
+	*   function prototype is not considered valid (to be fixed?)
+	*
+	* Note that since rel. 2.0RC3 the preferred method to have the server call 'standard'
+	* php functions (ie. functions not expecting a single xmlrpcmsg obj as parameter)
+	* is by making use of the functions_parameters_type class member.
+	*
+	* @param string $funcname the name of the PHP user function to be exposed as xmlrpc method; array($obj, 'methodname') and array('class', 'methodname') are ok too
+	* @param string $newfuncname (optional) name for function to be created
+	* @param array $extra_options (optional) array of options for conversion. valid values include:
+	*        bool  return_source when true, php code w. function definition will be returned, not evaluated
+	*        bool  encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
+	*        bool  decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
+	*        bool  suppress_warnings  remove from produced xml any runtime warnings due to the php function being invoked
+	* @return false on error, or an array containing the name of the new php function,
+	*         its signature and docs, to be used in the server dispatch map
+	*
+	* @todo decide how to deal with params passed by ref: bomb out or allow?
+	* @todo finish using javadoc info to build method sig if all params are named but out of order
+	* @todo add a check for params of 'resource' type
+	* @todo add some trigger_errors / error_log when returning false?
+	* @todo what to do when the PHP function returns NULL? we are currently returning an empty string value...
+	* @todo add an option to suppress php warnings in invocation of user function, similar to server debug level 3?
+	* @todo if $newfuncname is empty, we could use create_user_func instead of eval, as it is possibly faster
+	* @todo add a verbatim_object_copy parameter to allow avoiding the same obj instance?
+	*/
+	function wrap_php_function($funcname, $newfuncname='', $extra_options=array())
+	{
+		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
+		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
+		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
+		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
+		$catch_warnings = isset($extra_options['suppress_warnings']) && $extra_options['suppress_warnings'] ? '@' : '';
+
+		if(version_compare(phpversion(), '5.0.3') == -1)
+		{
+			// up to php 5.0.3 some useful reflection methods were missing
+			error_log('XML-RPC: cannot not wrap php functions unless running php version bigger than 5.0.3');
+			return false;
+		}
+
+        $exists = false;
+	    if (is_string($funcname) && strpos($funcname, '::') !== false)
+	    {
+	        $funcname = explode('::', $funcname);
+	    }
+        if(is_array($funcname))
+        {
+            if(count($funcname) < 2 || (!is_string($funcname[0]) && !is_object($funcname[0])))
+            {
+    			error_log('XML-RPC: syntax for function to be wrapped is wrong');
+    			return false;
+            }
+            if(is_string($funcname[0]))
+            {
+                $plainfuncname = implode('::', $funcname);
+            }
+            elseif(is_object($funcname[0]))
+            {
+                $plainfuncname = get_class($funcname[0]) . '->' . $funcname[1];
+            }
+            $exists = method_exists($funcname[0], $funcname[1]);
+            if (!$exists && version_compare(phpversion(), '5.1') < 0)
+            {
+               // workaround for php 5.0: static class methods are not seen by method_exists
+               $exists = is_callable( $funcname );
+            }
+        }
+        else
+        {
+            $plainfuncname = $funcname;
+            $exists = function_exists($funcname);
+        }
+
+		if(!$exists)
+		{
+			error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname);
+			return false;
+		}
+		else
+		{
+			// determine name of new php function
+			if($newfuncname == '')
+			{
+				if(is_array($funcname))
+				{
+    				if(is_string($funcname[0]))
+        				$xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
+    				else
+    					$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
+				}
+				else
+				{
+					$xmlrpcfuncname = "{$prefix}_$funcname";
+				}
+			}
+			else
+			{
+				$xmlrpcfuncname = $newfuncname;
+			}
+			while($buildit && function_exists($xmlrpcfuncname))
+			{
+				$xmlrpcfuncname .= 'x';
+			}
+
+			// start to introspect PHP code
+			if(is_array($funcname))
+			{
+    			$func = new ReflectionMethod($funcname[0], $funcname[1]);
+    			if($func->isPrivate())
+    			{
+    				error_log('XML-RPC: method to be wrapped is private: '.$plainfuncname);
+    				return false;
+    			}
+    			if($func->isProtected())
+    			{
+    				error_log('XML-RPC: method to be wrapped is protected: '.$plainfuncname);
+    				return false;
+    			}
+     			if($func->isConstructor())
+    			{
+    				error_log('XML-RPC: method to be wrapped is the constructor: '.$plainfuncname);
+    				return false;
+    			}
+			    // php 503 always says isdestructor = true...
+                if( version_compare(phpversion(), '5.0.3') != 0 && $func->isDestructor())
+    			{
+    				error_log('XML-RPC: method to be wrapped is the destructor: '.$plainfuncname);
+    				return false;
+    			}
+    			if($func->isAbstract())
+    			{
+    				error_log('XML-RPC: method to be wrapped is abstract: '.$plainfuncname);
+    				return false;
+    			}
+                /// @todo add more checks for static vs. nonstatic?
+            }
+			else
+			{
+    			$func = new ReflectionFunction($funcname);
+            }
+			if($func->isInternal())
+			{
+				// Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs
+				// instead of getparameters to fully reflect internal php functions ?
+				error_log('XML-RPC: function to be wrapped is internal: '.$plainfuncname);
+				return false;
+			}
+
+			// retrieve parameter names, types and description from javadoc comments
+
+			// function description
+			$desc = '';
+			// type of return val: by default 'any'
+			$returns = $GLOBALS['xmlrpcValue'];
+			// desc of return val
+			$returnsDocs = '';
+			// type + name of function parameters
+			$paramDocs = array();
+
+			$docs = $func->getDocComment();
+			if($docs != '')
+			{
+				$docs = explode("\n", $docs);
+				$i = 0;
+				foreach($docs as $doc)
+				{
+					$doc = trim($doc, " \r\t/*");
+					if(strlen($doc) && strpos($doc, '@') !== 0 && !$i)
+					{
+						if($desc)
+						{
+							$desc .= "\n";
+						}
+						$desc .= $doc;
+					}
+					elseif(strpos($doc, '@param') === 0)
+					{
+						// syntax: @param type [$name] desc
+						if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
+						{
+							if(strpos($matches[1], '|'))
+							{
+								//$paramDocs[$i]['type'] = explode('|', $matches[1]);
+								$paramDocs[$i]['type'] = 'mixed';
+							}
+							else
+							{
+								$paramDocs[$i]['type'] = $matches[1];
+							}
+							$paramDocs[$i]['name'] = trim($matches[2]);
+							$paramDocs[$i]['doc'] = $matches[3];
+						}
+						$i++;
+					}
+					elseif(strpos($doc, '@return') === 0)
+					{
+						// syntax: @return type desc
+						//$returns = preg_split('/\s+/', $doc);
+						if(preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches))
+						{
+							$returns = php_2_xmlrpc_type($matches[1]);
+							if(isset($matches[2]))
+							{
+								$returnsDocs = $matches[2];
+							}
+						}
+					}
+				}
+			}
+
+			// execute introspection of actual function prototype
+			$params = array();
+			$i = 0;
+			foreach($func->getParameters() as $paramobj)
+			{
+				$params[$i] = array();
+				$params[$i]['name'] = '$'.$paramobj->getName();
+				$params[$i]['isoptional'] = $paramobj->isOptional();
+				$i++;
+			}
+
+
+			// start  building of PHP code to be eval'd
+			$innercode = '';
+			$i = 0;
+			$parsvariations = array();
+			$pars = array();
+			$pnum = count($params);
+			foreach($params as $param)
+			{
+				if (isset($paramDocs[$i]['name']) && $paramDocs[$i]['name'] && strtolower($paramDocs[$i]['name']) != strtolower($param['name']))
+				{
+					// param name from phpdoc info does not match param definition!
+					$paramDocs[$i]['type'] = 'mixed';
+				}
+
+				if($param['isoptional'])
+				{
+					// this particular parameter is optional. save as valid previous list of parameters
+					$innercode .= "if (\$paramcount > $i) {\n";
+					$parsvariations[] = $pars;
+				}
+				$innercode .= "\$p$i = \$msg->getParam($i);\n";
+				if ($decode_php_objects)
+				{
+					$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i, array('decode_php_objs'));\n";
+				}
+				else
+				{
+					$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i);\n";
+				}
+
+				$pars[] = "\$p$i";
+				$i++;
+				if($param['isoptional'])
+				{
+					$innercode .= "}\n";
+				}
+				if($i == $pnum)
+				{
+					// last allowed parameters combination
+					$parsvariations[] = $pars;
+				}
+			}
+
+			$sigs = array();
+			$psigs = array();
+			if(count($parsvariations) == 0)
+			{
+				// only known good synopsis = no parameters
+				$parsvariations[] = array();
+				$minpars = 0;
+			}
+			else
+			{
+				$minpars = count($parsvariations[0]);
+			}
+
+			if($minpars)
+			{
+				// add to code the check for min params number
+				// NB: this check needs to be done BEFORE decoding param values
+				$innercode = "\$paramcount = \$msg->getNumParams();\n" .
+				"if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode;
+			}
+			else
+			{
+				$innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode;
+			}
+
+			$innercode .= "\$np = false;\n";
+			// since there are no closures in php, if we are given an object instance,
+            // we store a pointer to it in a global var...
+			if ( is_array($funcname) && is_object($funcname[0]) )
+			{
+			    $GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0];
+			    $innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n";
+			    $realfuncname = '$obj->'.$funcname[1];
+			}
+			else
+			{
+    			$realfuncname = $plainfuncname;
+            }
+			foreach($parsvariations as $pars)
+			{
+				$innercode .= "if (\$paramcount == " . count($pars) . ") \$retval = {$catch_warnings}$realfuncname(" . implode(',', $pars) . "); else\n";
+				// build a 'generic' signature (only use an appropriate return type)
+				$sig = array($returns);
+				$psig = array($returnsDocs);
+				for($i=0; $i < count($pars); $i++)
+				{
+					if (isset($paramDocs[$i]['type']))
+					{
+						$sig[] = php_2_xmlrpc_type($paramDocs[$i]['type']);
+					}
+					else
+					{
+						$sig[] = $GLOBALS['xmlrpcValue'];
+					}
+					$psig[] = isset($paramDocs[$i]['doc']) ? $paramDocs[$i]['doc'] : '';
+				}
+				$sigs[] = $sig;
+				$psigs[] = $psig;
+			}
+			$innercode .= "\$np = true;\n";
+			$innercode .= "if (\$np) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}'); else {\n";
+			//$innercode .= "if (\$_xmlrpcs_error_occurred) return new xmlrpcresp(0, $GLOBALS['xmlrpcerr']user, \$_xmlrpcs_error_occurred); else\n";
+			$innercode .= "if (is_a(\$retval, '{$prefix}resp')) return \$retval; else\n";
+			if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
+			{
+				$innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));";
+			}
+			else
+			{
+				if ($encode_php_objects)
+					$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n";
+				else
+					$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n";
+			}
+			// shall we exclude functions returning by ref?
+			// if($func->returnsReference())
+			// 	return false;
+			$code = "function $xmlrpcfuncname(\$msg) {\n" . $innercode . "}\n}";
+			//print_r($code);
+			if ($buildit)
+			{
+				$allOK = 0;
+				eval($code.'$allOK=1;');
+				// alternative
+				//$xmlrpcfuncname = create_function('$m', $innercode);
+
+				if(!$allOK)
+				{
+					error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap php function '.$plainfuncname);
+					return false;
+				}
+			}
+
+			/// @todo examine if $paramDocs matches $parsvariations and build array for
+			/// usage as method signature, plus put together a nice string for docs
+
+			$ret = array('function' => $xmlrpcfuncname, 'signature' => $sigs, 'docstring' => $desc, 'signature_docs' => $psigs, 'source' => $code);
+			return $ret;
+		}
+	}
+
+    /**
+    * Given a user-defined PHP class or php object, map its methods onto a list of
+	* PHP 'wrapper' functions that can be exposed as xmlrpc methods from an xmlrpc_server
+	* object and called from remote clients (as well as their corresponding signature info).
+	*
+    * @param mixed $classname the name of the class whose methods are to be exposed as xmlrpc methods, or an object instance of that class
+    * @param array $extra_options see the docs for wrap_php_method for more options
+    *        string method_type 'static', 'nonstatic', 'all' and 'auto' (default); the latter will switch between static and non-static depending on wheter $classname is a class name or object instance
+    * @return array or false on failure
+    *
+    * @todo get_class_methods will return both static and non-static methods.
+    *       we have to differentiate the action, depending on wheter we recived a class name or object
+    */
+    function wrap_php_class($classname, $extra_options=array())
+    {
+		$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
+		$methodtype = isset($extra_options['method_type']) ? $extra_options['method_type'] : 'auto';
+
+        if(version_compare(phpversion(), '5.0.3') == -1)
+		{
+			// up to php 5.0.3 some useful reflection methods were missing
+			error_log('XML-RPC: cannot not wrap php functions unless running php version bigger than 5.0.3');
+			return false;
+		}
+
+        $result = array();
+		$mlist = get_class_methods($classname);
+		foreach($mlist as $mname)
+		{
+    		if ($methodfilter == '' || preg_match($methodfilter, $mname))
+			{
+    			// echo $mlist."\n";
+    			$func = new ReflectionMethod($classname, $mname);
+    			if(!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract())
+    			{
+        			if(($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) ||
+            			(!$func->isStatic && ($methodtype == 'all' || $methodtype == 'nonstatic' || ($methodtype == 'auto' && is_object($classname)))))
+            		{
+                        $methodwrap = wrap_php_function(array($classname, $mname), '', $extra_options);
+                        if ( $methodwrap )
+                        {
+                            $result[$methodwrap['function']] = $methodwrap['function'];
+                        }
+                    }
+    			}
+			}
+		}
+        return $result;
+    }
+
+	/**
+	* Given an xmlrpc client and a method name, register a php wrapper function
+	* that will call it and return results using native php types for both
+	* params and results. The generated php function will return an xmlrpcresp
+	* oject for failed xmlrpc calls
+	*
+	* Known limitations:
+	* - server must support system.methodsignature for the wanted xmlrpc method
+	* - for methods that expose many signatures, only one can be picked (we
+	*   could in priciple check if signatures differ only by number of params
+	*   and not by type, but it would be more complication than we can spare time)
+	* - nested xmlrpc params: the caller of the generated php function has to
+	*   encode on its own the params passed to the php function if these are structs
+	*   or arrays whose (sub)members include values of type datetime or base64
+	*
+	* Notes: the connection properties of the given client will be copied
+	* and reused for the connection used during the call to the generated
+	* php function.
+	* Calling the generated php function 'might' be slow: a new xmlrpc client
+	* is created on every invocation and an xmlrpc-connection opened+closed.
+	* An extra 'debug' param is appended to param list of xmlrpc method, useful
+	* for debugging purposes.
+	*
+	* @param xmlrpc_client $client     an xmlrpc client set up correctly to communicate with target server
+	* @param string        $methodname the xmlrpc method to be mapped to a php function
+	* @param array         $extra_options array of options that specify conversion details. valid ptions include
+	*        integer       signum      the index of the method signature to use in mapping (if method exposes many sigs)
+	*        integer       timeout     timeout (in secs) to be used when executing function/calling remote method
+	*        string        protocol    'http' (default), 'http11' or 'https'
+	*        string        new_function_name the name of php function to create. If unsepcified, lib will pick an appropriate name
+	*        string        return_source if true return php code w. function definition instead fo function name
+	*        bool          encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
+	*        bool          decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
+	*        mixed         return_on_fault a php value to be returned when the xmlrpc call fails/returns a fault response (by default the xmlrpcresp object is returned in this case). If a string is used, '%faultCode%' and '%faultString%' tokens will be substituted with actual error values
+	*        bool          debug        set it to 1 or 2 to see debug results of querying server for method synopsis
+	* @return string                   the name of the generated php function (or false) - OR AN ARRAY...
+	*/
+	function wrap_xmlrpc_method($client, $methodname, $extra_options=0, $timeout=0, $protocol='', $newfuncname='')
+	{
+		// mind numbing: let caller use sane calling convention (as per javadoc, 3 params),
+		// OR the 2.0 calling convention (no options) - we really love backward compat, don't we?
+		if (!is_array($extra_options))
+		{
+			$signum = $extra_options;
+			$extra_options = array();
+		}
+		else
+		{
+			$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
+			$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
+			$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
+			$newfuncname = isset($extra_options['new_function_name']) ? $extra_options['new_function_name'] : '';
+		}
+		//$encode_php_objects = in_array('encode_php_objects', $extra_options);
+		//$verbatim_client_copy = in_array('simple_client_copy', $extra_options) ? 1 :
+		//	in_array('build_class_code', $extra_options) ? 2 : 0;
+
+		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
+		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
+		$simple_client_copy = isset($extra_options['simple_client_copy']) ? (int)($extra_options['simple_client_copy']) : 0;
+		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
+		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
+		if (isset($extra_options['return_on_fault']))
+		{
+			$decode_fault = true;
+			$fault_response = $extra_options['return_on_fault'];
+		}
+		else
+		{
+			$decode_fault = false;
+			$fault_response = '';
+		}
+		$debug = isset($extra_options['debug']) ? ($extra_options['debug']) : 0;
+
+		$msgclass = $prefix.'msg';
+		$valclass = $prefix.'val';
+		$decodefunc = 'php_'.$prefix.'_decode';
+
+		$msg = new $msgclass('system.methodSignature');
+		$msg->addparam(new $valclass($methodname));
+		$client->setDebug($debug);
+		$response =& $client->send($msg, $timeout, $protocol);
+		if($response->faultCode())
+		{
+			error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname);
+			return false;
+		}
+		else
+		{
+			$msig = $response->value();
+			if ($client->return_type != 'phpvals')
+			{
+				$msig = $decodefunc($msig);
+			}
+			if(!is_array($msig) || count($msig) <= $signum)
+			{
+				error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname);
+				return false;
+			}
+			else
+			{
+				// pick a suitable name for the new function, avoiding collisions
+				if($newfuncname != '')
+				{
+					$xmlrpcfuncname = $newfuncname;
+				}
+				else
+				{
+					// take care to insure that methodname is translated to valid
+					// php function name
+					$xmlrpcfuncname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
+						array('_', ''), $methodname);
+				}
+				while($buildit && function_exists($xmlrpcfuncname))
+				{
+					$xmlrpcfuncname .= 'x';
+				}
+
+				$msig = $msig[$signum];
+				$mdesc = '';
+				// if in 'offline' mode, get method description too.
+				// in online mode, favour speed of operation
+				if(!$buildit)
+				{
+					$msg = new $msgclass('system.methodHelp');
+					$msg->addparam(new $valclass($methodname));
+					$response =& $client->send($msg, $timeout, $protocol);
+					if (!$response->faultCode())
+					{
+						$mdesc = $response->value();
+						if ($client->return_type != 'phpvals')
+						{
+							$mdesc = $mdesc->scalarval();
+						}
+					}
+				}
+
+				$results = build_remote_method_wrapper_code($client, $methodname,
+					$xmlrpcfuncname, $msig, $mdesc, $timeout, $protocol, $simple_client_copy,
+					$prefix, $decode_php_objects, $encode_php_objects, $decode_fault,
+					$fault_response);
+
+				//print_r($code);
+				if ($buildit)
+				{
+					$allOK = 0;
+					eval($results['source'].'$allOK=1;');
+					// alternative
+					//$xmlrpcfuncname = create_function('$m', $innercode);
+					if($allOK)
+					{
+						return $xmlrpcfuncname;
+					}
+					else
+					{
+						error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap remote method '.$methodname);
+						return false;
+					}
+				}
+				else
+				{
+					$results['function'] = $xmlrpcfuncname;
+					return $results;
+				}
+			}
+		}
+	}
+
+	/**
+	* Similar to wrap_xmlrpc_method, but will generate a php class that wraps
+	* all xmlrpc methods exposed by the remote server as own methods.
+	* For more details see wrap_xmlrpc_method.
+	* @param xmlrpc_client $client the client obj all set to query the desired server
+	* @param array $extra_options list of options for wrapped code
+	* @return mixed false on error, the name of the created class if all ok or an array with code, class name and comments (if the appropriatevoption is set in extra_options)
+	*/
+	function wrap_xmlrpc_server($client, $extra_options=array())
+	{
+		$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
+		//$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
+		$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
+		$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
+		$newclassname = isset($extra_options['new_class_name']) ? $extra_options['new_class_name'] : '';
+		$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
+		$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
+		$verbatim_client_copy = isset($extra_options['simple_client_copy']) ? !($extra_options['simple_client_copy']) : true;
+		$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
+		$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
+
+		$msgclass = $prefix.'msg';
+		//$valclass = $prefix.'val';
+		$decodefunc = 'php_'.$prefix.'_decode';
+
+		$msg = new $msgclass('system.listMethods');
+		$response =& $client->send($msg, $timeout, $protocol);
+		if($response->faultCode())
+		{
+			error_log('XML-RPC: could not retrieve method list from remote server');
+			return false;
+		}
+		else
+		{
+			$mlist = $response->value();
+			if ($client->return_type != 'phpvals')
+			{
+				$mlist = $decodefunc($mlist);
+			}
+			if(!is_array($mlist) || !count($mlist))
+			{
+				error_log('XML-RPC: could not retrieve meaningful method list from remote server');
+				return false;
+			}
+			else
+			{
+				// pick a suitable name for the new function, avoiding collisions
+				if($newclassname != '')
+				{
+					$xmlrpcclassname = $newclassname;
+				}
+				else
+				{
+					$xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
+						array('_', ''), $client->server).'_client';
+				}
+				while($buildit && class_exists($xmlrpcclassname))
+				{
+					$xmlrpcclassname .= 'x';
+				}
+
+				/// @todo add function setdebug() to new class, to enable/disable debugging
+				$source = "class $xmlrpcclassname\n{\nvar \$client;\n\n";
+				$source .= "function $xmlrpcclassname()\n{\n";
+				$source .= build_client_wrapper_code($client, $verbatim_client_copy, $prefix);
+				$source .= "\$this->client =& \$client;\n}\n\n";
+				$opts = array('simple_client_copy' => 2, 'return_source' => true,
+					'timeout' => $timeout, 'protocol' => $protocol,
+					'encode_php_objs' => $encode_php_objects, 'prefix' => $prefix,
+					'decode_php_objs' => $decode_php_objects
+					);
+				/// @todo build javadoc for class definition, too
+				foreach($mlist as $mname)
+				{
+					if ($methodfilter == '' || preg_match($methodfilter, $mname))
+					{
+						$opts['new_function_name'] = preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
+							array('_', ''), $mname);
+						$methodwrap = wrap_xmlrpc_method($client, $mname, $opts);
+						if ($methodwrap)
+						{
+							if (!$buildit)
+							{
+								$source .= $methodwrap['docstring'];
+							}
+							$source .= $methodwrap['source']."\n";
+						}
+						else
+						{
+							error_log('XML-RPC: will not create class method to wrap remote method '.$mname);
+						}
+					}
+				}
+				$source .= "}\n";
+				if ($buildit)
+				{
+					$allOK = 0;
+					eval($source.'$allOK=1;');
+					// alternative
+					//$xmlrpcfuncname = create_function('$m', $innercode);
+					if($allOK)
+					{
+						return $xmlrpcclassname;
+					}
+					else
+					{
+						error_log('XML-RPC: could not create class '.$xmlrpcclassname.' to wrap remote server '.$client->server);
+						return false;
+					}
+				}
+				else
+				{
+					return array('class' => $xmlrpcclassname, 'code' => $source, 'docstring' => '');
+				}
+			}
+		}
+	}
+
+	/**
+	* Given the necessary info, build php code that creates a new function to
+	* invoke a remote xmlrpc method.
+	* Take care that no full checking of input parameters is done to ensure that
+	* valid php code is emitted.
+	* Note: real spaghetti code follows...
+	* @access private
+	*/
+	function build_remote_method_wrapper_code($client, $methodname, $xmlrpcfuncname,
+		$msig, $mdesc='', $timeout=0, $protocol='', $client_copy_mode=0, $prefix='xmlrpc',
+		$decode_php_objects=false, $encode_php_objects=false, $decode_fault=false,
+		$fault_response='')
+	{
+		$code = "function $xmlrpcfuncname (";
+		if ($client_copy_mode < 2)
+		{
+			// client copy mode 0 or 1 == partial / full client copy in emitted code
+			$innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix);
+			$innercode .= "\$client->setDebug(\$debug);\n";
+			$this_ = '';
+		}
+		else
+		{
+			// client copy mode 2 == no client copy in emitted code
+			$innercode = '';
+			$this_ = 'this->';
+		}
+		$innercode .= "\$msg = new {$prefix}msg('$methodname');\n";
+
+		if ($mdesc != '')
+		{
+			// take care that PHP comment is not terminated unwillingly by method description
+			$mdesc = "/**\n* ".str_replace('*/', '* /', $mdesc)."\n";
+		}
+		else
+		{
+			$mdesc = "/**\nFunction $xmlrpcfuncname\n";
+		}
+
+		// param parsing
+		$plist = array();
+		$pcount = count($msig);
+		for($i = 1; $i < $pcount; $i++)
+		{
+			$plist[] = "\$p$i";
+			$ptype = $msig[$i];
+			if($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' ||
+				$ptype == 'string' || $ptype == 'dateTime.iso8601' || $ptype == 'base64' || $ptype == 'null')
+			{
+				// only build directly xmlrpcvals when type is known and scalar
+				$innercode .= "\$p$i = new {$prefix}val(\$p$i, '$ptype');\n";
+			}
+			else
+			{
+				if ($encode_php_objects)
+				{
+					$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i, array('encode_php_objs'));\n";
+				}
+				else
+				{
+					$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i);\n";
+				}
+			}
+			$innercode .= "\$msg->addparam(\$p$i);\n";
+			$mdesc .= '* @param '.xmlrpc_2_php_type($ptype)." \$p$i\n";
+		}
+		if ($client_copy_mode < 2)
+		{
+			$plist[] = '$debug=0';
+			$mdesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n";
+		}
+		$plist = implode(', ', $plist);
+		$mdesc .= '* @return '.xmlrpc_2_php_type($msig[0])." (or an {$prefix}resp obj instance if call fails)\n*/\n";
+
+		$innercode .= "\$res =& \${$this_}client->send(\$msg, $timeout, '$protocol');\n";
+		if ($decode_fault)
+		{
+			if (is_string($fault_response) && ((strpos($fault_response, '%faultCode%') !== false) || (strpos($fault_response, '%faultString%') !== false)))
+			{
+				$respcode = "str_replace(array('%faultCode%', '%faultString%'), array(\$res->faultCode(), \$res->faultString()), '".str_replace("'", "''", $fault_response)."')";
+			}
+			else
+			{
+				$respcode = var_export($fault_response, true);
+			}
+		}
+		else
+		{
+			$respcode = '$res';
+		}
+		if ($decode_php_objects)
+		{
+			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value(), array('decode_php_objs'));";
+		}
+		else
+		{
+			$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());";
+		}
+
+		$code = $code . $plist. ") {\n" . $innercode . "\n}\n";
+
+		return array('source' => $code, 'docstring' => $mdesc);
+	}
+
+	/**
+	* Given necessary info, generate php code that will rebuild a client object
+	* Take care that no full checking of input parameters is done to ensure that
+	* valid php code is emitted.
+	* @access private
+	*/
+	function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc')
+	{
+		$code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path).
+			"', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n";
+
+		// copy all client fields to the client that will be generated runtime
+		// (this provides for future expansion or subclassing of client obj)
+		if ($verbatim_client_copy)
+		{
+			foreach($client as $fld => $val)
+			{
+				if($fld != 'debug' && $fld != 'return_type')
+				{
+					$val = var_export($val, true);
+					$code .= "\$client->$fld = $val;\n";
+				}
+			}
+		}
+		// only make sure that client always returns the correct data type
+		$code .= "\$client->return_type = '{$prefix}vals';\n";
+		//$code .= "\$client->setDebug(\$debug);\n";
+		return $code;
+	}
+?>
Index: /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpcs.inc
===================================================================
--- /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpcs.inc	(revision 5261)
+++ /mods/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpcs.inc	(revision 5261)
@@ -0,0 +1,1246 @@
+<?php
+// by Edd Dumbill (C) 1999-2002
+// <edd@usefulinc.com>
+// $Id: xmlrpcs.inc,v 1.71 2008/10/29 23:41:28 ggiunta Exp $
+
+// Copyright (c) 1999,2000,2002 Edd Dumbill.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    * Redistributions of source code must retain the above copyright
+//      notice, this list of conditions and the following disclaimer.
+//
+//    * Redistributions in binary form must reproduce the above
+//      copyright notice, this list of conditions and the following
+//      disclaimer in the documentation and/or other materials provided
+//      with the distribution.
+//
+//    * Neither the name of the "XML-RPC for PHP" nor the names of its
+//      contributors may be used to endorse or promote products derived
+//      from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+// OF THE POSSIBILITY OF SUCH DAMAGE.
+
+	// XML RPC Server class
+	// requires: xmlrpc.inc
+
+	$GLOBALS['xmlrpcs_capabilities'] = array(
+		// xmlrpc spec: always supported
+		'xmlrpc' => new xmlrpcval(array(
+			'specUrl' => new xmlrpcval('http://www.xmlrpc.com/spec', 'string'),
+			'specVersion' => new xmlrpcval(1, 'int')
+		), 'struct'),
+		// if we support system.xxx functions, we always support multicall, too...
+		// Note that, as of 2006/09/17, the following URL does not respond anymore
+		'system.multicall' => new xmlrpcval(array(
+			'specUrl' => new xmlrpcval('http://www.xmlrpc.com/discuss/msgReader$1208', 'string'),
+			'specVersion' => new xmlrpcval(1, 'int')
+		), 'struct'),
+		// introspection: version 2! we support 'mixed', too
+		'introspection' => new xmlrpcval(array(
+			'specUrl' => new xmlrpcval('http://phpxmlrpc.sourceforge.net/doc-2/ch10.html', 'string'),
+			'specVersion' => new xmlrpcval(2, 'int')
+		), 'struct')
+	);
+
+	/* Functions that implement system.XXX methods of xmlrpc servers */
+	$_xmlrpcs_getCapabilities_sig=array(array($GLOBALS['xmlrpcStruct']));
+	$_xmlrpcs_getCapabilities_doc='This method lists all the capabilites that the XML-RPC server has: the (more or less standard) extensions to the xmlrpc spec that it adheres to';
+	$_xmlrpcs_getCapabilities_sdoc=array(array('list of capabilities, described as structs with a version number and url for the spec'));
+	function _xmlrpcs_getCapabilities($server, $m=null)
+	{
+		$outAr = $GLOBALS['xmlrpcs_capabilities'];
+		// NIL extension
+		if ($GLOBALS['xmlrpc_null_extension']) {
+			$outAr['nil'] = new xmlrpcval(array(
+				'specUrl' => new xmlrpcval('http://www.ontosys.com/xml-rpc/extensions.php', 'string'),
+				'specVersion' => new xmlrpcval(1, 'int')
+			), 'struct');
+		}
+		return new xmlrpcresp(new xmlrpcval($outAr, 'struct'));
+	}
+
+	// listMethods: signature was either a string, or nothing.
+	// The useless string variant has been removed
+	$_xmlrpcs_listMethods_sig=array(array($GLOBALS['xmlrpcArray']));
+	$_xmlrpcs_listMethods_doc='This method lists all the methods that the XML-RPC server knows how to dispatch';
+	$_xmlrpcs_listMethods_sdoc=array(array('list of method names'));
+	function _xmlrpcs_listMethods($server, $m=null) // if called in plain php values mode, second param is missing
+	{
+
+		$outAr=array();
+		foreach($server->dmap as $key => $val)
+		{
+			$outAr[]=new xmlrpcval($key, 'string');
+		}
+		if($server->allow_system_funcs)
+		{
+			foreach($GLOBALS['_xmlrpcs_dmap'] as $key => $val)
+			{
+				$outAr[]=new xmlrpcval($key, 'string');
+			}
+		}
+		return new xmlrpcresp(new xmlrpcval($outAr, 'array'));
+	}
+
+	$_xmlrpcs_methodSignature_sig=array(array($GLOBALS['xmlrpcArray'], $GLOBALS['xmlrpcString']));
+	$_xmlrpcs_methodSignature_doc='Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)';
+	$_xmlrpcs_methodSignature_sdoc=array(array('list of known signatures, each sig being an array of xmlrpc type names', 'name of method to be described'));
+	function _xmlrpcs_methodSignature($server, $m)
+	{
+		// let accept as parameter both an xmlrpcval or string
+		if (is_object($m))
+		{
+			$methName=$m->getParam(0);
+			$methName=$methName->scalarval();
+		}
+		else
+		{
+			$methName=$m;
+		}
+		if(strpos($methName, "system.") === 0)
+		{
+			$dmap=$GLOBALS['_xmlrpcs_dmap']; $sysCall=1;
+		}
+		else
+		{
+			$dmap=$server->dmap; $sysCall=0;
+		}
+		if(isset($dmap[$methName]))
+		{
+			if(isset($dmap[$methName]['signature']))
+			{
+				$sigs=array();
+				foreach($dmap[$methName]['signature'] as $inSig)
+				{
+					$cursig=array();
+					foreach($inSig as $sig)
+					{
+						$cursig[]=new xmlrpcval($sig, 'string');
+					}
+					$sigs[]=new xmlrpcval($cursig, 'array');
+				}
+				$r=new xmlrpcresp(new xmlrpcval($sigs, 'array'));
+			}
+			else
+			{
+				// NB: according to the official docs, we should be returning a
+				// "none-array" here, which means not-an-array
+				$r=new xmlrpcresp(new xmlrpcval('undef', 'string'));
+			}
+		}
+		else
+		{
+			$r=new xmlrpcresp(0,$GLOBALS['xmlrpcerr']['introspect_unknown'], $GLOBALS['xmlrpcstr']['introspect_unknown']);
+		}
+		return $r;
+	}
+
+	$_xmlrpcs_methodHelp_sig=array(array($GLOBALS['xmlrpcString'], $GLOBALS['xmlrpcString']));
+	$_xmlrpcs_methodHelp_doc='Returns help text if defined for the method passed, otherwise returns an empty string';
+	$_xmlrpcs_methodHelp_sdoc=array(array('method description', 'name of the method to be described'));
+	function _xmlrpcs_methodHelp($server, $m)
+	{
+		// let accept as parameter both an xmlrpcval or string
+		if (is_object($m))
+		{
+			$methName=$m->getParam(0);
+			$methName=$methName->scalarval();
+		}
+		else
+		{
+			$methName=$m;
+		}
+		if(strpos($methName, "system.") === 0)
+		{
+			$dmap=$GLOBALS['_xmlrpcs_dmap']; $sysCall=1;
+		}
+		else
+		{
+			$dmap=$server->dmap; $sysCall=0;
+		}
+		if(isset($dmap[$methName]))
+		{
+			if(isset($dmap[$methName]['docstring']))
+			{
+				$r=new xmlrpcresp(new xmlrpcval($dmap[$methName]['docstring']), 'string');
+			}
+			else
+			{
+				$r=new xmlrpcresp(new xmlrpcval('', 'string'));
+			}
+		}
+		else
+		{
+			$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['introspect_unknown'], $GLOBALS['xmlrpcstr']['introspect_unknown']);
+		}
+		return $r;
+	}
+
+	$_xmlrpcs_multicall_sig = array(array($GLOBALS['xmlrpcArray'], $GLOBALS['xmlrpcArray']));
+	$_xmlrpcs_multicall_doc = 'Boxcar multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details';
+	$_xmlrpcs_multicall_sdoc = array(array('list of response structs, where each struct has the usual members', 'list of calls, with each call being represented as a struct, with members "methodname" and "params"'));
+	function _xmlrpcs_multicall_error($err)
+	{
+		if(is_string($err))
+		{
+			$str = $GLOBALS['xmlrpcstr']["multicall_${err}"];
+			$code = $GLOBALS['xmlrpcerr']["multicall_${err}"];
+		}
+		else
+		{
+			$code = $err->faultCode();
+			$str = $err->faultString();
+		}
+		$struct = array();
+		$struct['faultCode'] = new xmlrpcval($code, 'int');
+		$struct['faultString'] = new xmlrpcval($str, 'string');
+		return new xmlrpcval($struct, 'struct');
+	}
+
+	function _xmlrpcs_multicall_do_call($server, $call)
+	{
+		if($call->kindOf() != 'struct')
+		{
+			return _xmlrpcs_multicall_error('notstruct');
+		}
+		$methName = @$call->structmem('methodName');
+		if(!$methName)
+		{
+			return _xmlrpcs_multicall_error('nomethod');
+		}
+		if($methName->kindOf() != 'scalar' || $methName->scalartyp() != 'string')
+		{
+			return _xmlrpcs_multicall_error('notstring');
+		}
+		if($methName->scalarval() == 'system.multicall')
+		{
+			return _xmlrpcs_multicall_error('recursion');
+		}
+
+		$params = @$call->structmem('params');
+		if(!$params)
+		{
+			return _xmlrpcs_multicall_error('noparams');
+		}
+		if($params->kindOf() != 'array')
+		{
+			return _xmlrpcs_multicall_error('notarray');
+		}
+		$numParams = $params->arraysize();
+
+		$msg = new xmlrpcmsg($methName->scalarval());
+		for($i = 0; $i < $numParams; $i++)
+		{
+			if(!$msg->addParam($params->arraymem($i)))
+			{
+				$i++;
+				return _xmlrpcs_multicall_error(new xmlrpcresp(0,
+					$GLOBALS['xmlrpcerr']['incorrect_params'],
+					$GLOBALS['xmlrpcstr']['incorrect_params'] . ": probable xml error in param " . $i));
+			}
+		}
+
+		$result = $server->execute($msg);
+
+		if($result->faultCode() != 0)
+		{
+			return _xmlrpcs_multicall_error($result);		// Method returned fault.
+		}
+
+		return new xmlrpcval(array($result->value()), 'array');
+	}
+
+	function _xmlrpcs_multicall_do_call_phpvals($server, $call)
+	{
+		if(!is_array($call))
+		{
+			return _xmlrpcs_multicall_error('notstruct');
+		}
+		if(!array_key_exists('methodName', $call))
+		{
+			return _xmlrpcs_multicall_error('nomethod');
+		}
+		if (!is_string($call['methodName']))
+		{
+			return _xmlrpcs_multicall_error('notstring');
+		}
+		if($call['methodName'] == 'system.multicall')
+		{
+			return _xmlrpcs_multicall_error('recursion');
+		}
+		if(!array_key_exists('params', $call))
+		{
+			return _xmlrpcs_multicall_error('noparams');
+		}
+		if(!is_array($call['params']))
+		{
+			return _xmlrpcs_multicall_error('notarray');
+		}
+
+		// this is a real dirty and simplistic hack, since we might have received a
+		// base64 or datetime values, but they will be listed as strings here...
+		$numParams = count($call['params']);
+		$pt = array();
+		foreach($call['params'] as $val)
+			$pt[] = php_2_xmlrpc_type(gettype($val));
+
+		$result = $server->execute($call['methodName'], $call['params'], $pt);
+
+		if($result->faultCode() != 0)
+		{
+			return _xmlrpcs_multicall_error($result);		// Method returned fault.
+		}
+
+		return new xmlrpcval(array($result->value()), 'array');
+	}
+
+	function _xmlrpcs_multicall($server, $m)
+	{
+		$result = array();
+		// let accept a plain list of php parameters, beside a single xmlrpc msg object
+		if (is_object($m))
+		{
+			$calls = $m->getParam(0);
+			$numCalls = $calls->arraysize();
+			for($i = 0; $i < $numCalls; $i++)
+			{
+				$call = $calls->arraymem($i);
+				$result[$i] = _xmlrpcs_multicall_do_call($server, $call);
+			}
+		}
+		else
+		{
+			$numCalls=count($m);
+			for($i = 0; $i < $numCalls; $i++)
+			{
+				$result[$i] = _xmlrpcs_multicall_do_call_phpvals($server, $m[$i]);
+			}
+		}
+
+		return new xmlrpcresp(new xmlrpcval($result, 'array'));
+	}
+
+	$GLOBALS['_xmlrpcs_dmap']=array(
+		'system.listMethods' => array(
+			'function' => '_xmlrpcs_listMethods',
+			'signature' => $_xmlrpcs_listMethods_sig,
+			'docstring' => $_xmlrpcs_listMethods_doc,
+			'signature_docs' => $_xmlrpcs_listMethods_sdoc),
+		'system.methodHelp' => array(
+			'function' => '_xmlrpcs_methodHelp',
+			'signature' => $_xmlrpcs_methodHelp_sig,
+			'docstring' => $_xmlrpcs_methodHelp_doc,
+			'signature_docs' => $_xmlrpcs_methodHelp_sdoc),
+		'system.methodSignature' => array(
+			'function' => '_xmlrpcs_methodSignature',
+			'signature' => $_xmlrpcs_methodSignature_sig,
+			'docstring' => $_xmlrpcs_methodSignature_doc,
+			'signature_docs' => $_xmlrpcs_methodSignature_sdoc),
+		'system.multicall' => array(
+			'function' => '_xmlrpcs_multicall',
+			'signature' => $_xmlrpcs_multicall_sig,
+			'docstring' => $_xmlrpcs_multicall_doc,
+			'signature_docs' => $_xmlrpcs_multicall_sdoc),
+		'system.getCapabilities' => array(
+			'function' => '_xmlrpcs_getCapabilities',
+			'signature' => $_xmlrpcs_getCapabilities_sig,
+			'docstring' => $_xmlrpcs_getCapabilities_doc,
+			'signature_docs' => $_xmlrpcs_getCapabilities_sdoc)
+	);
+
+	$GLOBALS['_xmlrpcs_occurred_errors'] = '';
+	$GLOBALS['_xmlrpcs_prev_ehandler'] = '';
+
+	/**
+	* Error handler used to track errors that occur during server-side execution of PHP code.
+	* This allows to report back to the client whether an internal error has occurred or not
+	* using an xmlrpc response object, instead of letting the client deal with the html junk
+	* that a PHP execution error on the server generally entails.
+	*
+	* NB: in fact a user defined error handler can only handle WARNING, NOTICE and USER_* errors.
+	*
+	*/
+	function _xmlrpcs_errorHandler($errcode, $errstring, $filename=null, $lineno=null, $context=null)
+	{
+		// obey the @ protocol
+		if (error_reporting() == 0)
+			return;
+
+		//if($errcode != E_NOTICE && $errcode != E_WARNING && $errcode != E_USER_NOTICE && $errcode != E_USER_WARNING)
+		if($errcode != E_STRICT)
+		{
+			$GLOBALS['_xmlrpcs_occurred_errors'] = $GLOBALS['_xmlrpcs_occurred_errors'] . $errstring . "\n";
+		}
+		// Try to avoid as much as possible disruption to the previous error handling
+		// mechanism in place
+		if($GLOBALS['_xmlrpcs_prev_ehandler'] == '')
+		{
+			// The previous error handler was the default: all we should do is log error
+			// to the default error log (if level high enough)
+			if(ini_get('log_errors') && (intval(ini_get('error_reporting')) & $errcode))
+			{
+				error_log($errstring);
+			}
+		}
+		else
+		{
+			// Pass control on to previous error handler, trying to avoid loops...
+			if($GLOBALS['_xmlrpcs_prev_ehandler'] != '_xmlrpcs_errorHandler')
+			{
+				// NB: this code will NOT work on php < 4.0.2: only 2 params were used for error handlers
+				if(is_array($GLOBALS['_xmlrpcs_prev_ehandler']))
+				{
+					// the following works both with static class methods and plain object methods as error handler
+					call_user_func_array($GLOBALS['_xmlrpcs_prev_ehandler'], array($errcode, $errstring, $filename, $lineno, $context));
+				}
+				else
+				{
+					$GLOBALS['_xmlrpcs_prev_ehandler']($errcode, $errstring, $filename, $lineno, $context);
+				}
+			}
+		}
+	}
+
+	$GLOBALS['_xmlrpc_debuginfo']='';
+
+	/**
+	* Add a string to the debug info that can be later seralized by the server
+	* as part of the response message.
+	* Note that for best compatbility, the debug string should be encoded using
+	* the $GLOBALS['xmlrpc_internalencoding'] character set.
+	* @param string $m
+	* @access public
+	*/
+	function xmlrpc_debugmsg($m)
+	{
+		$GLOBALS['_xmlrpc_debuginfo'] .= $m . "\n";
+	}
+
+	class xmlrpc_server
+	{
+		/**
+		* Array defining php functions exposed as xmlrpc methods by this server
+		* @access private
+		*/
+		var $dmap=array();
+		/**
+		* Defines how functions in dmap will be invoked: either using an xmlrpc msg object
+		* or plain php values.
+		* valid strings are 'xmlrpcvals', 'phpvals' or 'epivals'
+		*/
+		var $functions_parameters_type='xmlrpcvals';
+		/**
+		* Option used for fine-tuning the encoding the php values returned from
+		* functions registered in the dispatch map when the functions_parameters_types
+		* member is set to 'phpvals'
+		* @see php_xmlrpc_encode for a list of values
+		*/
+		var $phpvals_encoding_options = array( 'auto_dates' );
+		/// controls wether the server is going to echo debugging messages back to the client as comments in response body. valid values: 0,1,2,3
+		var $debug = 1;
+		/**
+		* Controls behaviour of server when invoked user function throws an exception:
+		* 0 = catch it and return an 'internal error' xmlrpc response (default)
+		* 1 = catch it and return an xmlrpc response with the error corresponding to the exception
+		* 2 = allow the exception to float to the upper layers
+		*/
+		var $exception_handling = 0;
+		/**
+		* When set to true, it will enable HTTP compression of the response, in case
+		* the client has declared its support for compression in the request.
+		*/
+		var $compress_response = false;
+		/**
+		* List of http compression methods accepted by the server for requests.
+		* NB: PHP supports deflate, gzip compressions out of the box if compiled w. zlib
+		*/
+		var $accepted_compression = array();
+		/// shall we serve calls to system.* methods?
+		var $allow_system_funcs = true;
+		/// list of charset encodings natively accepted for requests
+		var $accepted_charset_encodings = array();
+		/**
+		* charset encoding to be used for response.
+		* NB: if we can, we will convert the generated response from internal_encoding to the intended one.
+		* can be: a supported xml encoding (only UTF-8 and ISO-8859-1 at present, unless mbstring is enabled),
+		* null (leave unspecified in response, convert output stream to US_ASCII),
+		* 'default' (use xmlrpc library default as specified in xmlrpc.inc, convert output stream if needed),
+		* or 'auto' (use client-specified charset encoding or same as request if request headers do not specify it (unless request is US-ASCII: then use library default anyway).
+		* NB: pretty dangerous if you accept every charset and do not have mbstring enabled)
+		*/
+		var $response_charset_encoding = '';
+		/**
+		* Storage for internal debug info
+		* @access private
+		*/
+		var $debug_info = '';
+		/**
+		* Extra data passed at runtime to method handling functions. Used only by EPI layer
+		*/
+		var $user_data = null;
+
+		/**
+		* @param array $dispmap the dispatch map withd efinition of exposed services
+		* @param boolean $servicenow set to false to prevent the server from runnung upon construction
+		*/
+		function xmlrpc_server($dispMap=null, $serviceNow=true)
+		{
+			// if ZLIB is enabled, let the server by default accept compressed requests,
+			// and compress responses sent to clients that support them
+			if(function_exists('gzinflate'))
+			{
+				$this->accepted_compression = array('gzip', 'deflate');
+				$this->compress_response = true;
+			}
+
+			// by default the xml parser can support these 3 charset encodings
+			$this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII');
+
+			// dispMap is a dispatch array of methods
+			// mapped to function names and signatures
+			// if a method
+			// doesn't appear in the map then an unknown
+			// method error is generated
+			/* milosch - changed to make passing dispMap optional.
+			 * instead, you can use the class add_to_map() function
+			 * to add functions manually (borrowed from SOAPX4)
+			 */
+			if($dispMap)
+			{
+				$this->dmap = $dispMap;
+				if($serviceNow)
+				{
+					$this->service();
+				}
+			}
+		}
+
+		/**
+		* Set debug level of server.
+		* @param integer $in debug lvl: determines info added to xmlrpc responses (as xml comments)
+		* 0 = no debug info,
+		* 1 = msgs set from user with debugmsg(),
+		* 2 = add complete xmlrpc request (headers and body),
+		* 3 = add also all processing warnings happened during method processing
+		* (NB: this involves setting a custom error handler, and might interfere
+		* with the standard processing of the php function exposed as method. In
+		* particular, triggering an USER_ERROR level error will not halt script
+		* execution anymore, but just end up logged in the xmlrpc response)
+		* Note that info added at elevel 2 and 3 will be base64 encoded
+		* @access public
+		*/
+		function setDebug($in)
+		{
+			$this->debug=$in;
+		}
+
+		/**
+		* Return a string with the serialized representation of all debug info
+		* @param string $charset_encoding the target charset encoding for the serialization
+		* @return string an XML comment (or two)
+		*/
+		function serializeDebug($charset_encoding='')
+		{
+			// Tough encoding problem: which internal charset should we assume for debug info?
+			// It might contain a copy of raw data received from client, ie with unknown encoding,
+			// intermixed with php generated data and user generated data...
+			// so we split it: system debug is base 64 encoded,
+			// user debug info should be encoded by the end user using the INTERNAL_ENCODING
+			$out = '';
+			if ($this->debug_info != '')
+			{
+				$out .= "<!-- SERVER DEBUG INFO (BASE64 ENCODED):\n".base64_encode($this->debug_info)."\n-->\n";
+			}
+			if($GLOBALS['_xmlrpc_debuginfo']!='')
+			{
+
+				$out .= "<!-- DEBUG INFO:\n" . xmlrpc_encode_entitites(str_replace('--', '_-', $GLOBALS['_xmlrpc_debuginfo']), $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "\n-->\n";
+				// NB: a better solution MIGHT be to use CDATA, but we need to insert it
+				// into return payload AFTER the beginning tag
+				//$out .= "<![CDATA[ DEBUG INFO:\n\n" . str_replace(']]>', ']_]_>', $GLOBALS['_xmlrpc_debuginfo']) . "\n]]>\n";
+			}
+			return $out;
+		}
+
+		/**
+		* Execute the xmlrpc request, printing the response
+		* @param string $data the request body. If null, the http POST request will be examined
+		* @return xmlrpcresp the response object (usually not used by caller...)
+		* @access public
+		*/
+		function service($data=null, $return_payload=false)
+		{
+			if ($data === null)
+			{
+				// workaround for a known bug in php ver. 5.2.2 that broke $HTTP_RAW_POST_DATA
+				$ver = phpversion();
+				if ($ver[0] >= 5)
+				{
+					$data = file_get_contents('php://input');
+				}
+				else
+				{
+					$data = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
+				}
+			}
+			$raw_data = $data;
+
+			// reset internal debug info
+			$this->debug_info = '';
+
+			// Echo back what we received, before parsing it
+			if($this->debug > 1)
+			{
+				$this->debugmsg("+++GOT+++\n" . $data . "\n+++END+++");
+			}
+
+			$r = $this->parseRequestHeaders($data, $req_charset, $resp_charset, $resp_encoding);
+			if (!$r)
+			{
+				$r=$this->parseRequest($data, $req_charset);
+			}
+
+			// save full body of request into response, for more debugging usages
+			$r->raw_data = $raw_data;
+
+			if($this->debug > 2 && $GLOBALS['_xmlrpcs_occurred_errors'])
+			{
+				$this->debugmsg("+++PROCESSING ERRORS AND WARNINGS+++\n" .
+					$GLOBALS['_xmlrpcs_occurred_errors'] . "+++END+++");
+			}
+
+			$payload=$this->xml_header($resp_charset);
+			if($this->debug > 0)
+			{
+				$payload = $payload . $this->serializeDebug($resp_charset);
+			}
+
+			// G. Giunta 2006-01-27: do not create response serialization if it has
+			// already happened. Helps building json magic
+			if (empty($r->payload))
+			{
+				$r->serialize($resp_charset);
+			}
+			$payload = $payload . $r->payload;
+
+			if ($return_payload)
+			{
+				return $payload;
+			}
+
+			// if we get a warning/error that has output some text before here, then we cannot
+			// add a new header. We cannot say we are sending xml, either...
+			if(!headers_sent())
+			{
+				header('Content-Type: '.$r->content_type);
+				// we do not know if client actually told us an accepted charset, but if he did
+				// we have to tell him what we did
+				header("Vary: Accept-Charset");
+
+				// http compression of output: only
+				// if we can do it, and we want to do it, and client asked us to,
+				// and php ini settings do not force it already
+				$php_no_self_compress = !ini_get('zlib.output_compression') && (ini_get('output_handler') != 'ob_gzhandler');
+				if($this->compress_response && function_exists('gzencode') && $resp_encoding != ''
+					&& $php_no_self_compress)
+				{
+					if(strpos($resp_encoding, 'gzip') !== false)
+					{
+						$payload = gzencode($payload);
+						header("Content-Encoding: gzip");
+						header("Vary: Accept-Encoding");
+					}
+					elseif (strpos($resp_encoding, 'deflate') !== false)
+					{
+						$payload = gzcompress($payload);
+						header("Content-Encoding: deflate");
+						header("Vary: Accept-Encoding");
+					}
+				}
+
+				// do not ouput content-length header if php is compressing output for us:
+				// it will mess up measurements
+				if($php_no_self_compress)
+				{
+					header('Content-Length: ' . (int)strlen($payload));
+				}
+			}
+			else
+			{
+				error_log('XML-RPC: '.__METHOD__.': http headers already sent before response is fully generated. Check for php warning or error messages');
+			}
+
+			print $payload;
+
+			// return request, in case subclasses want it
+			return $r;
+		}
+
+		/**
+		* Add a method to the dispatch map
+		* @param string $methodname the name with which the method will be made available
+		* @param string $function the php function that will get invoked
+		* @param array $sig the array of valid method signatures
+		* @param string $doc method documentation
+		* @param array $sigdoc the array of valid method signatures docs (one string per param, one for return type)
+		* @access public
+		*/
+		function add_to_map($methodname,$function,$sig=null,$doc=false,$sigdoc=false)
+		{
+			$this->dmap[$methodname] = array(
+				'function'	=> $function,
+				'docstring' => $doc
+			);
+			if ($sig)
+			{
+				$this->dmap[$methodname]['signature'] = $sig;
+			}
+			if ($sigdoc)
+			{
+				$this->dmap[$methodname]['signature_docs'] = $sigdoc;
+			}
+		}
+
+		/**
+		* Verify type and number of parameters received against a list of known signatures
+		* @param array $in array of either xmlrpcval objects or xmlrpc type definitions
+		* @param array $sig array of known signatures to match against
+		* @access private
+		*/
+		function verifySignature($in, $sig)
+		{
+			// check each possible signature in turn
+			if (is_object($in))
+			{
+				$numParams = $in->getNumParams();
+			}
+			else
+			{
+				$numParams = count($in);
+			}
+			foreach($sig as $cursig)
+			{
+				if(count($cursig)==$numParams+1)
+				{
+					$itsOK=1;
+					for($n=0; $n<$numParams; $n++)
+					{
+						if (is_object($in))
+						{
+							$p=$in->getParam($n);
+							if($p->kindOf() == 'scalar')
+							{
+								$pt=$p->scalartyp();
+							}
+							else
+							{
+								$pt=$p->kindOf();
+							}
+						}
+						else
+						{
+							$pt= $in[$n] == 'i4' ? 'int' : strtolower($in[$n]); // dispatch maps never use i4...
+						}
+
+						// param index is $n+1, as first member of sig is return type
+						if($pt != $cursig[$n+1] && $cursig[$n+1] != $GLOBALS['xmlrpcValue'])
+						{
+							$itsOK=0;
+							$pno=$n+1;
+							$wanted=$cursig[$n+1];
+							$got=$pt;
+							break;
+						}
+					}
+					if($itsOK)
+					{
+						return array(1,'');
+					}
+				}
+			}
+			if(isset($wanted))
+			{
+				return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
+			}
+			else
+			{
+				return array(0, "No method signature matches number of parameters");
+			}
+		}
+
+		/**
+		* Parse http headers received along with xmlrpc request. If needed, inflate request
+		* @return null on success or an xmlrpcresp
+		* @access private
+		*/
+		function parseRequestHeaders(&$data, &$req_encoding, &$resp_encoding, &$resp_compression)
+		{
+			// check if $_SERVER is populated: it might have been disabled via ini file
+			// (this is true even when in CLI mode)
+			if (count($_SERVER) == 0)
+			{
+				error_log('XML-RPC: '.__METHOD__.': cannot parse request headers as $_SERVER is not populated');
+			}
+
+			if($this->debug > 1)
+			{
+				if(function_exists('getallheaders'))
+				{
+					$this->debugmsg(''); // empty line
+					foreach(getallheaders() as $name => $val)
+					{
+						$this->debugmsg("HEADER: $name: $val");
+					}
+				}
+
+			}
+
+			if(isset($_SERVER['HTTP_CONTENT_ENCODING']))
+			{
+				$content_encoding = str_replace('x-', '', $_SERVER['HTTP_CONTENT_ENCODING']);
+			}
+			else
+			{
+				$content_encoding = '';
+			}
+
+			// check if request body has been compressed and decompress it
+			if($content_encoding != '' && strlen($data))
+			{
+				if($content_encoding == 'deflate' || $content_encoding == 'gzip')
+				{
+					// if decoding works, use it. else assume data wasn't gzencoded
+					if(function_exists('gzinflate') && in_array($content_encoding, $this->accepted_compression))
+					{
+						if($content_encoding == 'deflate' && $degzdata = @gzuncompress($data))
+						{
+							$data = $degzdata;
+							if($this->debug > 1)
+							{
+								$this->debugmsg("\n+++INFLATED REQUEST+++[".strlen($data)." chars]+++\n" . $data . "\n+++END+++");
+							}
+						}
+						elseif($content_encoding == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))
+						{
+							$data = $degzdata;
+							if($this->debug > 1)
+								$this->debugmsg("+++INFLATED REQUEST+++[".strlen($data)." chars]+++\n" . $data . "\n+++END+++");
+						}
+						else
+						{
+							$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_decompress_fail'], $GLOBALS['xmlrpcstr']['server_decompress_fail']);
+							return $r;
+						}
+					}
+					else
+					{
+						//error_log('The server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');
+						$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_cannot_decompress'], $GLOBALS['xmlrpcstr']['server_cannot_decompress']);
+						return $r;
+					}
+				}
+			}
+
+			// check if client specified accepted charsets, and if we know how to fulfill
+			// the request
+			if ($this->response_charset_encoding == 'auto')
+			{
+				$resp_encoding = '';
+				if (isset($_SERVER['HTTP_ACCEPT_CHARSET']))
+				{
+					// here we should check if we can match the client-requested encoding
+					// with the encodings we know we can generate.
+					/// @todo we should parse q=0.x preferences instead of getting first charset specified...
+					$client_accepted_charsets = explode(',', strtoupper($_SERVER['HTTP_ACCEPT_CHARSET']));
+					// Give preference to internal encoding
+					$known_charsets = array($GLOBALS['xmlrpc_internalencoding'], 'UTF-8', 'ISO-8859-1', 'US-ASCII');
+					foreach ($known_charsets as $charset)
+					{
+						foreach ($client_accepted_charsets as $accepted)
+							if (strpos($accepted, $charset) === 0)
+							{
+								$resp_encoding = $charset;
+								break;
+							}
+						if ($resp_encoding)
+							break;
+					}
+				}
+			}
+			else
+			{
+				$resp_encoding = $this->response_charset_encoding;
+			}
+
+			if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
+			{
+				$resp_compression = $_SERVER['HTTP_ACCEPT_ENCODING'];
+			}
+			else
+			{
+				$resp_compression = '';
+			}
+
+			// 'guestimate' request encoding
+			/// @todo check if mbstring is enabled and automagic input conversion is on: it might mingle with this check???
+			$req_encoding = guess_encoding(isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '',
+				$data);
+
+			return null;
+		}
+
+		/**
+		* Parse an xml chunk containing an xmlrpc request and execute the corresponding
+		* php function registered with the server
+		* @param string $data the xml request
+		* @param string $req_encoding (optional) the charset encoding of the xml request
+		* @return xmlrpcresp
+		* @access private
+		*/
+		function parseRequest($data, $req_encoding='')
+		{
+			// 2005/05/07 commented and moved into caller function code
+			//if($data=='')
+			//{
+			//	$data=$GLOBALS['HTTP_RAW_POST_DATA'];
+			//}
+
+			// G. Giunta 2005/02/13: we do NOT expect to receive html entities
+			// so we do not try to convert them into xml character entities
+			//$data = xmlrpc_html_entity_xlate($data);
+
+			$GLOBALS['_xh']=array();
+			$GLOBALS['_xh']['ac']='';
+			$GLOBALS['_xh']['stack']=array();
+			$GLOBALS['_xh']['valuestack'] = array();
+			$GLOBALS['_xh']['params']=array();
+			$GLOBALS['_xh']['pt']=array();
+			$GLOBALS['_xh']['isf']=0;
+			$GLOBALS['_xh']['isf_reason']='';
+			$GLOBALS['_xh']['method']=false; // so we can check later if we got a methodname or not
+			$GLOBALS['_xh']['rt']='';
+
+			// decompose incoming XML into request structure
+			if ($req_encoding != '')
+			{
+				if (!in_array($req_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+				// the following code might be better for mb_string enabled installs, but
+				// makes the lib about 200% slower...
+				//if (!is_valid_charset($req_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+				{
+					error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received request: '.$req_encoding);
+					$req_encoding = $GLOBALS['xmlrpc_defencoding'];
+				}
+				/// @BUG this will fail on PHP 5 if charset is not specified in the xml prologue,
+				// the encoding is not UTF8 and there are non-ascii chars in the text...
+				/// @todo use an ampty string for php 5 ???
+				$parser = xml_parser_create($req_encoding);
+			}
+			else
+			{
+				$parser = xml_parser_create();
+			}
+
+			xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
+			// G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell
+			// the xml parser to give us back data in the expected charset
+			// What if internal encoding is not in one of the 3 allowed?
+			// we use the broadest one, ie. utf8
+			// This allows to send data which is native in various charset,
+			// by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding
+			if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
+			{
+				xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
+			}
+			else
+			{
+				xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);
+			}
+
+			if ($this->functions_parameters_type != 'xmlrpcvals')
+				xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
+			else
+				xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
+			xml_set_character_data_handler($parser, 'xmlrpc_cd');
+			xml_set_default_handler($parser, 'xmlrpc_dh');
+			if(!xml_parse($parser, $data, 1))
+			{
+				// return XML error as a faultCode
+				$r=new xmlrpcresp(0,
+				$GLOBALS['xmlrpcerrxml']+xml_get_error_code($parser),
+				sprintf('XML error: %s at line %d, column %d',
+					xml_error_string(xml_get_error_code($parser)),
+					xml_get_current_line_number($parser), xml_get_current_column_number($parser)));
+				xml_parser_free($parser);
+			}
+			elseif ($GLOBALS['_xh']['isf'])
+			{
+				xml_parser_free($parser);
+				$r=new xmlrpcresp(0,
+					$GLOBALS['xmlrpcerr']['invalid_request'],
+					$GLOBALS['xmlrpcstr']['invalid_request'] . ' ' . $GLOBALS['_xh']['isf_reason']);
+			}
+			else
+			{
+				xml_parser_free($parser);
+				// small layering violation in favor of speed and memory usage:
+				// we should allow the 'execute' method handle this, but in the
+				// most common scenario (xmlrpcvals type server with some methods
+				// registered as phpvals) that would mean a useless encode+decode pass
+				if ($this->functions_parameters_type != 'xmlrpcvals' || (isset($this->dmap[$GLOBALS['_xh']['method']]['parameters_type']) && ($this->dmap[$GLOBALS['_xh']['method']]['parameters_type'] == 'phpvals')))
+				{
+					if($this->debug > 1)
+					{
+						$this->debugmsg("\n+++PARSED+++\n".var_export($GLOBALS['_xh']['params'], true)."\n+++END+++");
+					}
+					$r = $this->execute($GLOBALS['_xh']['method'], $GLOBALS['_xh']['params'], $GLOBALS['_xh']['pt']);
+				}
+				else
+				{
+					// build an xmlrpcmsg object with data parsed from xml
+					$m=new xmlrpcmsg($GLOBALS['_xh']['method']);
+					// now add parameters in
+					for($i=0; $i<count($GLOBALS['_xh']['params']); $i++)
+					{
+						$m->addParam($GLOBALS['_xh']['params'][$i]);
+					}
+
+					if($this->debug > 1)
+					{
+						$this->debugmsg("\n+++PARSED+++\n".var_export($m, true)."\n+++END+++");
+					}
+					$r = $this->execute($m);
+				}
+			}
+			return $r;
+		}
+
+		/**
+		* Execute a method invoked by the client, checking parameters used
+		* @param mixed $m either an xmlrpcmsg obj or a method name
+		* @param array $params array with method parameters as php types (if m is method name only)
+		* @param array $paramtypes array with xmlrpc types of method parameters (if m is method name only)
+		* @return xmlrpcresp
+		* @access private
+		*/
+		function execute($m, $params=null, $paramtypes=null)
+		{
+			if (is_object($m))
+			{
+				$methName = $m->method();
+			}
+			else
+			{
+				$methName = $m;
+			}
+			$sysCall = $this->allow_system_funcs && (strpos($methName, "system.") === 0);
+			$dmap = $sysCall ? $GLOBALS['_xmlrpcs_dmap'] : $this->dmap;
+
+			if(!isset($dmap[$methName]['function']))
+			{
+				// No such method
+				return new xmlrpcresp(0,
+					$GLOBALS['xmlrpcerr']['unknown_method'],
+					$GLOBALS['xmlrpcstr']['unknown_method']);
+			}
+
+			// Check signature
+			if(isset($dmap[$methName]['signature']))
+			{
+				$sig = $dmap[$methName]['signature'];
+				if (is_object($m))
+				{
+					list($ok, $errstr) = $this->verifySignature($m, $sig);
+				}
+				else
+				{
+					list($ok, $errstr) = $this->verifySignature($paramtypes, $sig);
+				}
+				if(!$ok)
+				{
+					// Didn't match.
+					return new xmlrpcresp(
+						0,
+						$GLOBALS['xmlrpcerr']['incorrect_params'],
+						$GLOBALS['xmlrpcstr']['incorrect_params'] . ": ${errstr}"
+					);
+				}
+			}
+
+			$func = $dmap[$methName]['function'];
+			// let the 'class::function' syntax be accepted in dispatch maps
+			if(is_string($func) && strpos($func, '::'))
+			{
+				$func = explode('::', $func);
+			}
+			// verify that function to be invoked is in fact callable
+			if(!is_callable($func))
+			{
+				error_log("XML-RPC: ".__METHOD__.": function $func registered as method handler is not callable");
+				return new xmlrpcresp(
+					0,
+					$GLOBALS['xmlrpcerr']['server_error'],
+					$GLOBALS['xmlrpcstr']['server_error'] . ": no function matches method"
+				);
+			}
+
+			// If debug level is 3, we should catch all errors generated during
+			// processing of user function, and log them as part of response
+			if($this->debug > 2)
+			{
+				$GLOBALS['_xmlrpcs_prev_ehandler'] = set_error_handler('_xmlrpcs_errorHandler');
+			}
+			try
+			{
+				// Allow mixed-convention servers
+				if (is_object($m))
+				{
+					if($sysCall)
+					{
+						$r = call_user_func($func, $this, $m);
+					}
+					else
+					{
+						$r = call_user_func($func, $m);
+					}
+					if (!is_a($r, 'xmlrpcresp'))
+					{
+						error_log("XML-RPC: ".__METHOD__.": function $func registered as method handler does not return an xmlrpcresp object");
+						if (is_a($r, 'xmlrpcval'))
+						{
+							$r = new xmlrpcresp($r);
+						}
+						else
+						{
+							$r = new xmlrpcresp(
+								0,
+								$GLOBALS['xmlrpcerr']['server_error'],
+								$GLOBALS['xmlrpcstr']['server_error'] . ": function does not return xmlrpcresp object"
+							);
+						}
+					}
+				}
+				else
+				{
+					// call a 'plain php' function
+					if($sysCall)
+					{
+						array_unshift($params, $this);
+						$r = call_user_func_array($func, $params);
+					}
+					else
+					{
+						// 3rd API convention for method-handling functions: EPI-style
+						if ($this->functions_parameters_type == 'epivals')
+						{
+							$r = call_user_func_array($func, array($methName, $params, $this->user_data));
+							// mimic EPI behaviour: if we get an array that looks like an error, make it
+							// an eror response
+							if (is_array($r) && array_key_exists('faultCode', $r) && array_key_exists('faultString', $r))
+							{
+								$r = new xmlrpcresp(0, (integer)$r['faultCode'], (string)$r['faultString']);
+							}
+							else
+							{
+								// functions using EPI api should NOT return resp objects,
+								// so make sure we encode the return type correctly
+								$r = new xmlrpcresp(php_xmlrpc_encode($r, array('extension_api')));
+							}
+						}
+						else
+						{
+							$r = call_user_func_array($func, $params);
+						}
+					}
+					// the return type can be either an xmlrpcresp object or a plain php value...
+					if (!is_a($r, 'xmlrpcresp'))
+					{
+						// what should we assume here about automatic encoding of datetimes
+						// and php classes instances???
+						$r = new xmlrpcresp(php_xmlrpc_encode($r, $this->phpvals_encoding_options));
+					}
+				}
+			}
+			catch(Exception $e)
+			{
+				// (barring errors in the lib) an uncatched exception happened
+				// in the called function, we wrap it in a proper error-response
+				switch($this->exception_handling)
+				{
+					case 2:
+						throw $e;
+						break;
+					case 1:
+						$r = new xmlrpcresp(0, $e->getCode(), $e->getMessage());
+						break;
+					default:
+						$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_error'], $GLOBALS['xmlrpcstr']['server_error']);
+				}
+			}
+			if($this->debug > 2)
+			{
+				// note: restore the error handler we found before calling the
+				// user func, even if it has been changed inside the func itself
+				if($GLOBALS['_xmlrpcs_prev_ehandler'])
+				{
+					set_error_handler($GLOBALS['_xmlrpcs_prev_ehandler']);
+				}
+				else
+				{
+					restore_error_handler();
+				}
+			}
+			return $r;
+		}
+
+		/**
+		* add a string to the 'internal debug message' (separate from 'user debug message')
+		* @param string $strings
+		* @access private
+		*/
+		function debugmsg($string)
+		{
+			$this->debug_info .= $string."\n";
+		}
+
+		/**
+		* @access private
+		*/
+		function xml_header($charset_encoding='')
+		{
+			if ($charset_encoding != '')
+			{
+				return "<?xml version=\"1.0\" encoding=\"$charset_encoding\"?" . ">\n";
+			}
+			else
+			{
+				return "<?xml version=\"1.0\"?" . ">\n";
+			}
+		}
+
+		/**
+		* A debugging routine: just echoes back the input packet as a string value
+		* DEPRECATED!
+		*/
+		function echoInput()
+		{
+			$r=new xmlrpcresp(new xmlrpcval( "'Aha said I: '" . $GLOBALS['HTTP_RAW_POST_DATA'], 'string'));
+			print $r->serialize();
+		}
+	}
+?>
Index: /mods/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php
===================================================================
--- /mods/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php	(revision 8528)
+++ /mods/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php	(revision 5261)
@@ -4,9 +4,11 @@
 	 * Widget Klasse fÃŒr die Anzeige des Kundenlogin Formulars  
 	 */
-	class wpsg_kundenverwaltung_widget extends WP_Widget  {
+	class wpsg_kundenverwaltung_widget extends WP_Widget 
+	{
 		
 		var $id = "wpsg_kundenverwaltung_widget";
 		
-		function __construct() {
+		function wpsg_kundenverwaltung_widget()
+		{
 						
 	    	parent::__construct('wpsg_kundenverwaltung_widget', 'wpShopGermany Login', array(
@@ -18,7 +20,4 @@
 	  	function widget($args, $settings)
 	  	{
-
-		    $GLOBALS['wpsg_sc']->view['widget_args'] = $args;
-		    $GLOBALS['wpsg_sc']->view['widget_settings'] = $settings;
 
 	  		$GLOBALS['wpsg_sc']->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/widget.phtml');
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/examples/creditcard_nvp.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/examples/creditcard_nvp.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/examples/creditcard_nvp.php	(revision 5261)
@@ -0,0 +1,423 @@
+<pre>
+<?php
+/**
+ * @copyright 2008 micropayment GmbH
+ * @link http://www.micropayment.de/
+ * @link https://sipg.micropayment.de/public/creditcard/v1.2/nvp/
+ * @author Yves Berkholz
+ * @package MCP-Service-Client
+ * @subpackage Demo
+ * @version 1.02
+ */
+// =================================================================================================
+//
+// WICHTIG!!! Tragen Sie hier Ihren AccessKey ein
+//
+// Sie finden Ihren AccessKey im ControlCenter unter dem Menupunkt "Meine Konfiguration"
+//
+// =================================================================================================
+	if(!defined('MCP__ACCESSKEY')) define('MCP__ACCESSKEY', 'HIER IHREN ACCESSKEY EINTRAGEN');
+// =================================================================================================
+
+// TestModus (deaktivieren)
+// -------------------------------------------------------------------------------------------------
+	if(!defined('MCP__TESTMODE')) define('MCP__TESTMODE', 1);
+
+// ServiceURL die aufgerufen werden soll
+// -------------------------------------------------------------------------------------------------
+	if(!defined('MCP__CREDITCARDSERVICE_NVP_URL')) define('MCP__CREDITCARDSERVICE_NVP_URL', 'https://sipg.micropayment.de/public/creditcard/v1.2/nvp/');
+
+// Service-Interface das verwendet werden soll
+// -------------------------------------------------------------------------------------------------
+	if(!defined('MCP__CREDITCARDSERVICE_INTERFACE')) define('MCP__CREDITCARDSERVICE_INTERFACE', 'IMcpCreditcardService_v1_2');
+
+// Bibliothek/Service-Interface und den gewünschten Dispatcher laden
+// -------------------------------------------------------------------------------------------------
+	require_once( realpath('../lib/init.php') );
+	require_once( realpath('../services/' . MCP__CREDITCARDSERVICE_INTERFACE . '.php') );
+	require_once( MCP__SERVICELIB_DISPATCHER . 'TNvpServiceDispatcher.php');
+
+// Beispieldaten, die ggf. äbgeändert werden müssen
+// -------------------------------------------------------------------------------------------------
+	$email 		= 'max.mustermann2@example.com';
+	$firstname	= 'Max';
+	$surname	= 'Mustermann';
+	$bSendMail	= false;
+	$customerId = md5($email);
+	$customerIP = '127.0.0.1';
+
+	$address	= 'Mustergasse 123';
+	$zipcode	= '12345';
+	$town		= 'Berlin';
+	$country	= 'DE';
+
+	$cardNumber 		= '4111111111111111';
+	$cardCVC2			= '666';
+	$cardExpiryYear		= '2011';
+	$cardExpiryMonth	= '11';
+
+	$amount				= 250; // cent
+	$currency			= 'EUR';
+	$project			= 'demo';
+	$account			= null;
+	$projectCampaign	= null;
+	$webmasterCampaign	= null;
+	$title				= 'livesystemtest';
+	$paytext			= 'Live System Test';
+	$sessionFreeParams	= array(
+							'foo'		=> 'bar',
+							'bar'		=> 'foo',
+							'foobar'	=> 'foobar'
+						);
+
+
+/* ---------------------------------------------------------------------------------------------- *\
+| Folgender allgemeiner Ablaufplan ist für die Durchführung von Transaktion zu berücksichtigen
++---------------------------------------------------------------------------------------------------
+	  I. Es muß ein Kunde existieren für den gebucht werden soll:
+			(a) "customerCreate" legt einen neuen Kunden an
+			(b) "customerGet" liefert bestehende Kundendaten, kann auch zur Überprüfung der Existenz eines Kunden verwendet werden
+			(c) "customerSet" ändern bestehende Kundendaten
+
+	 II. Für den Kunden müssen Kreditkarteninformationen hinterlegt sein
+			(a) "creditcardDataSet" weist einem bestehenden Kunden Kreditkartendaten zu
+			(b) "creditcardDataGet" ruft Diese wieder ab
+
+	III. Es muß eine gültige Session vorhanden sein
+			(a) "sessionCreate" erzeugt eine Session mit allen allgemein relevanten Informationen für eine Buchung
+			(b) "sessionGet" liefert die mit einer Session vernknüpten Informationen, inklusive der durchgeführten Transaktionen
+
+\* ---------------------------------------------------------------------------------------------- */
+
+
+/* ---------------------------------------------------------------------------------------------- *\
+// Ablaufplan des Beispiels
++---------------------------------------------------------------------------------------------------
+	1. Kunden anlegen - falls dieser noch nicht existiert und ggf. mit zusätzlichen Daten versehen
+	2. Kreditkartendaten für Kunden abfragen / hinterlegen
+	3. Session erzeugen / abfragen
+
+	4a. Purchase Transaktion durchführen						$bPurchase
+	4b. Authorization Transaktion durchführen					$bAuthorization
+
+	5. Capture Transaktion durchführen							$bCapture
+
+	6a. Reversal Transaktion durchführen						$bReversal
+	6b. Refund Transaktion durchführen							$bRefund
+
+	   Session sowie verknüpfte Transaktionen abfragen
+\* ---------------------------------------------------------------------------------------------- */
+	$bResetData			= true;
+	$bPurchase 			= false;
+	$bAuthorization 	= false;
+	$bCapture			= false;
+	$bReversal			= false;
+	$bRefund			= false;
+
+// Bsp.-Kombination 1: Purchase + Rückbuchung
+//	$bPurchase 			= true;
+//	$bReversal			= true;
+
+// Bsp.-Kombination 2: Authorization + Freigabe
+//	$bAuthorization		= true;
+//	$bReversal			= true;
+
+// Bsp.-Kombination 2: Authorization + Capture + Rückbuchung
+//	$bAuthorization		= true;
+//	$bCapture			= true;
+//	$bRefund			= true;
+
+
+
+	try {
+	// Dispatcher initialisieren
+	// ---------------------------------------------------------------------------------------------
+		$dispatcher = new TNvpServiceDispatcher(MCP__CREDITCARDSERVICE_INTERFACE, MCP__CREDITCARDSERVICE_NVP_URL);
+
+	// Dispatcher aufrufen
+	// ---------------------------------------------------------------------------------------------
+	/*
+		// Möglichkeit 1
+		// dabei müssen alle Parameter in der Reihenfolge wie im Interface beschrieben, übergeben werden, auch jene die Standardwerte haben
+			$result = $dispatcher -> myMethod($param1, $param2, $param3);
+
+		// Möglichkeit 2
+			$aParams = array();
+			$aParams['param1'] = 'param1Value';
+		//  $aParams['param2'] kann, wenn er einen Standardwert hat, weggelassen werden
+			$aParams['param3'] = 'param3Value';
+			$result = $dispatcher -> send('myMethod', $aParams);
+	 */
+
+
+	// 1. Kunden anlegen - falls dieser noch nicht existiert und ggf. mit zusätzlichen Daten versehen
+	// ---------------------------------------------------------------------------------------------
+		try {
+			echo '<b>customerGet</b>:<br />';
+
+			$result = $dispatcher -> customerGet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId);
+
+			print_r($result);
+			echo '<br />';
+		}
+		catch(Exception $e) {
+				echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+
+			switch($e -> getCode()) {
+				case 3003:
+				case 3110:
+					echo '<b>customerCreate</b>:<br />';
+
+
+					$result = $dispatcher -> customerCreate(MCP__ACCESSKEY, MCP__TESTMODE, $customerId, null, $firstname, $surname, $email, 'en-GB');
+					if($result) $customerId = $result;
+					print_r($result);
+					echo '<br />';
+				break;
+				default:
+					echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+				break;
+			}
+		}
+
+
+		echo '<br />';
+		echo '<b>customerSet-1</b>:<br/>';
+		$result = $dispatcher -> customerSet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId, array('foo' => 'bar', 'internalstatus' => '123'), $firstname, $surname, $email, 'de-DE');
+		print_r($result);
+		echo '<br />';
+
+		echo '<br />';
+		echo '<b>customerSet-2</b>:<br/>';
+		$result = $dispatcher -> customerSet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId, array('foo2' => 'bar2', 'internalstatus2' => '123'), $firstname, $surname, $email, 'de-DE');
+		print_r($result);
+		echo '<br />';
+
+		echo '<br />';
+		echo '<b>addressSet</b>:<br/>';
+		$result = $dispatcher -> addressSet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId, $address, $zipcode, $town, $country);
+		print_r($result);
+
+		echo '<br />';
+		echo '<b>addressGet</b>:<br/>';
+		$result = $dispatcher -> addressGet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId);
+		print_r($result);
+
+
+	// 2. Kreditkartendaten für Kunden abfragen / hinterlegen
+	// ---------------------------------------------------------------------------------------------
+		try {
+			echo '<b>creditcardDataGet</b>:<br />';
+			$result = $dispatcher -> creditcardDataGet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId);
+			print_r($result);
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+		}
+
+
+		try {
+			echo '<b>creditcardDataSet</b>:<br />';
+			$result = $dispatcher -> creditcardDataSet(MCP__ACCESSKEY, MCP__TESTMODE, $customerId, $cardNumber, $cardExpiryYear, $cardExpiryMonth);
+			print_r($result);
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+		}
+
+	// 3. Session erzeugen / abfragen
+	// ---------------------------------------------------------------------------------------------
+		try {
+			$sessionId = null;
+			echo '<b>sessionCreate</b>:<br />';
+			$result = $dispatcher -> sessionCreate(MCP__ACCESSKEY, MCP__TESTMODE, $customerId, $sessionId, $project, $projectCampaign, $account, $webmasterCampaign, $amount, $currency, $title, $paytext, $customerIP, $sessionFreeParams, $bSendMail);
+			print_r($result);
+			echo '<br />';
+
+			$sessionId = $result['sessionId'];
+
+			echo '<b>sessionGet</b>:<br />';
+			$result = $dispatcher -> sessionGet(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId);
+			print_r($result);
+			echo '<br />';
+
+		}
+		catch(Exception $e) {
+			echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+		}
+
+	// 4a. Purchase Transaktion durchführen
+	// ---------------------------------------------------------------------------------------------
+	// erst ohne CVC2, falls der Kunde mit der Kreditkarte schonmal erfolgreich gebucht hat funktioniert doe Buchung
+	// sollte die Buchung fehlschlagen die Transaktion einfach nochmal mit CVC2-Code durchführen
+	// idealerweise läßt man vom Kunden den CVC2 Code immer angeben
+	// ---------------------------------------------------------------------------------------------
+	if($bPurchase) {
+
+		try {
+			echo '<b>transactionPurchase ohne CVC2</b>:<br />';
+			$result = $dispatcher -> transactionPurchase(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId);
+			print_r($result);
+
+			$transactionId = $result['transactionId'];
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			switch($e -> getCode()) {
+				case 3510:
+					echo ' Failed<br />';
+
+					echo '<b>transactionPurchase mit CVC2</b>:<br />';
+					$result = $dispatcher -> transactionPurchase(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId, $cardCVC2);
+
+					$transactionId = $result['transactionId'];
+					print_r($result);
+					echo '<br />';
+				break;
+				default:
+					echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+				break;
+			}
+		}
+	} // if($bPurchase)
+
+
+	// 4b. Authorization Transaktion durchführen
+	// ---------------------------------------------------------------------------------------------
+	// erst ohne CVC2, falls der Kunde mit der Kreditkarte schonmal erfolgreich gebucht hat funktioniert doe Buchung
+	// sollte die Buchung fehlschlagen die Transaktion einfach nochmal mit CVC2-Code durchführen
+	// idealerweise läßt man vom Kunden den CVC2 Code immer angeben
+	// ---------------------------------------------------------------------------------------------
+	if($bAuthorization) {
+
+		try {
+			echo '<b>transactionAuthorization ohne CVC2</b>:<br />';
+			$result = $dispatcher -> transactionAuthorization(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId);
+			print_r($result);
+
+			$transactionId = $result['transactionId'];
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			switch($e -> getCode()) {
+				case 3510:
+					echo ' Failed<br />';
+
+					echo '<b>transactionAuthorization mit CVC2</b>:<br />';
+					$result = $dispatcher -> transactionAuthorization(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId, $cardCVC2);
+
+					$transactionId = $result['transactionId'];
+					print_r($result);
+					echo '<br />';
+				break;
+				default:
+					echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+				break;
+			}
+		}
+	} // if($bAuthorization)
+
+	// 5. Capture Transaktion durchführen
+	// ---------------------------------------------------------------------------------------------
+	if($bCapture) {
+
+		try {
+			echo '<b>transactionCapture</b>:<br />';
+			$result = $dispatcher -> transactionCapture(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId, $transactionId);
+
+			$transactionId = $result['transactionId'];
+			print_r($result);
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+		}
+
+	} // if($bCapture)
+
+
+
+	// 6a. Reversal Transaktion durchführen
+	// ---------------------------------------------------------------------------------------------
+	if($bReversal) {
+
+		try {
+			echo '<b>transactionReversal</b>:<br />';
+			$result = $dispatcher -> transactionReversal(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId, $transactionId);
+			print_r($result);
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+		}
+
+	} // if($bReversal)
+
+	// 6b. Refund Transaktion durchführen
+	// ---------------------------------------------------------------------------------------------
+	if($bRefund) {
+
+		try {
+			echo '<b>transactionRefund</b>:<br />';
+			$result = $dispatcher -> transactionRefund(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId, $transactionId);
+			print_r($result);
+			echo '<br />';
+		}
+		catch(Exception $e) {
+			echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+		}
+
+	} // if($bRefund)
+
+
+
+
+	// Session sowie verknüpfte Transaktionen abfragen
+	// ---------------------------------------------------------------------------------------------
+		$result = $dispatcher -> sessionGet(MCP__ACCESSKEY, MCP__TESTMODE, $sessionId);
+		echo '<b>sessionGet</b>:<br />';
+		print_r($result);
+		echo '<br />';
+
+		if($result AND is_array($result['transactionIds'] )) {
+			foreach($result['transactionIds'] as $transactionId) {
+				try {
+
+					$result = $dispatcher -> transactionGet(MCP__ACCESSKEY, MCP__TESTMODE, $transactionId);
+					echo '<b>transactionGet</b>:<br />';
+					print_r($result);
+					echo '<br />';
+
+					if(MCP__TESTMODE) {
+						$result = $dispatcher -> transactionChargebackNotificationTest(MCP__ACCESSKEY, MCP__TESTMODE, $transactionId);
+						echo '<br /><b>transactionChargebackNotificationTest</b>:<br />';
+						print_r($result);
+						echo '<br />';
+					}
+
+
+				}
+				catch(Exception $e) {
+					echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+				}
+			}
+		}
+
+	// Testdaten zurücksetzen
+	// ---------------------------------------------------------------------------------------------
+		if(MCP__TESTMODE && $bResetData) {
+			$result = $dispatcher -> resetTest(MCP__ACCESSKEY, MCP__TESTMODE);
+			echo '<br /><b>resetTest</b>:<br />';
+			echo htmlentities($result);
+			echo '<br />';
+		}
+
+
+	}
+	catch(Exception $e) {
+		echo get_class($e) .'[' . $e -> getCode() . '] ' . $e -> getMessage() . '<br />';
+	}
+?>
+</pre>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/examples/creditcard_nvp_notification_receiver.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/examples/creditcard_nvp_notification_receiver.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/examples/creditcard_nvp_notification_receiver.php	(revision 5261)
@@ -0,0 +1,186 @@
+<?php
+// -------------------------------------------------------------------------------------------------
+//  init library and import Nvp-Serializer
+//   - Serializer is required for right response encoding
+// -------------------------------------------------------------------------------------------------
+	require_once( realpath('../lib/init.php') );
+	require_once(MCP__SERVICELIB_SERIALIZER . 'TNvpSerializer.php');
+	
+// -------------------------------------------------------------------------------------------------
+//  helper classes
+// -------------------------------------------------------------------------------------------------
+	/**
+	 * status of notification processing
+	 */
+	class NotificationStatus {
+		/**
+		 * Notification was received and processed successfully
+		 */
+		const SUCCESS = 'SUCCESS';
+		
+		/**
+		 * Notification was received successfully, but an error occurred on processing
+		 */
+		const FAILED = 'FAILED';
+		
+		/**
+		 * Notification wasn't received / processed without an error
+		 */
+		const ERROR = 'ERROR';
+	}
+	
+	
+	/**
+	 * data mapper class for response
+	 *
+	 */
+	class NotificationResponse {
+		/**
+		 * @var string
+		 * @see NotificationStatus
+		 */
+		public $status			= null;
+		
+		/**
+		 * @var string
+		 */
+		public $statusMessage	= null;
+		
+		/**
+		 * @var array|null
+		 */
+		public $freeParam		= null;
+		
+		/**
+		 * @param string $status
+		 * @param string|null $statusMessage
+		 * @param array|null $freeParam
+		 */
+		public function __construct($status=NotificationStatus::ERROR, $statusMessage=null, $freeParam=null) {
+			$this -> status			= $status;
+			$this -> statusMessage	= $statusMessage;
+			$this -> freeParam		= $freeParam;
+		}
+	}
+	
+	/**
+	 * data mapper class contains data of "transactionChargeback" notification
+	 * for later usage
+	 */
+	class TransactionChargebackNotificationData {
+		/**
+		 * @var string
+		 */
+		public $sessionId		= '';
+
+		/**
+		 * @var string
+		 */
+		public $customerId		= '';
+		
+		/**
+		 * @var string
+		 */
+		public $transactionId	= '';
+		
+		/**
+		 * @var string
+		 */
+		public $transactionAuth	= '';
+		
+		/**
+		 * @var string
+		 */
+		public $title			= '';
+		
+		/**
+		 * @var string
+		 */
+		public $amount			= '';
+		
+		/**
+		 * @var integer
+		 */
+		public $currency		= '';
+		
+		/**
+		 * @var string
+		 */
+		public $country			= '';
+		
+		/**
+		 * @var array
+		 */
+		public $freeParam		= array();
+	}
+	
+	
+// -------------------------------------------------------------------------------------------------
+//  start main loop
+// -------------------------------------------------------------------------------------------------
+	do {
+		$oResponse = new NotificationResponse(NotificationStatus::ERROR);
+
+		$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : null;
+		
+		switch($action) {
+			case 'transactionChargeback':
+				$oRequest = new TransactionChargebackNotificationData();
+				$oRequest -> sessionId			= isset($_REQUEST['sessionId']) ? (string)$_REQUEST['sessionId'] : null;
+				$oRequest -> customerId			= isset($_REQUEST['customerId']) ? (string)$_REQUEST['customerId'] : null;
+				$oRequest -> transactionId		= isset($_REQUEST['transactionId']) ? (string)$_REQUEST['transactionId'] : null;
+				$oRequest -> transactionAuth	= isset($_REQUEST['transactionAuth']) ? (string)$_REQUEST['transactionAuth'] : null;
+				$oRequest -> title				= isset($_REQUEST['title']) ? (string)$_REQUEST['title'] : null;
+				$oRequest -> amount				= isset($_REQUEST['amount']) ? (integer)$_REQUEST['amount'] : null;
+				$oRequest -> currency			= isset($_REQUEST['currency']) ? (string)$_REQUEST['currency'] : null;
+				$oRequest -> country			= isset($_REQUEST['country']) ? (string)$_REQUEST['country'] : null;
+				$oRequest -> freeParam			= isset($_REQUEST['freeParam']) AND is_array($_REQUEST['freeParam']) ? $_REQUEST['freeParam'] : null;		
+				
+				$oResponse -> status		= NotificationStatus::FAILED;
+				$oResponse -> statusMessage	= '';
+			break;
+			
+			case null:
+				$oResponse -> statusMessage = sPrintF('action is required but empty');
+			break 2; // switch, do...while
+			break 2;
+			default:
+				$oResponse -> statusMessage = sPrintF('action "%s" not supported', $action);
+			break 2; // switch, do...while
+		}		
+	
+	/*
+	 perform your notification processing on $oRequest here
+	 e.g. validation, storage or logging
+	 
+	 if an error occurred simply "break" do...while loop
+	 optionally assign statusmessage $oResponse -> statusMessage = 'damm, error';
+	 you can later read in controlcenter
+	*/
+		
+	// example: simplified validation
+		$err = array();
+		if( empty($oRequest -> sessionId) ) $err['sessionId']				= 'sessionId is empty';
+		if( empty($oRequest -> customerId) ) $err['customerId']				= 'customerId is empty';
+		if( empty($oRequest -> transactionId) ) $err['transactionId']		= 'transactionId is empty';
+		if( empty($oRequest -> transactionAuth) ) $err['transactionAuth']	= 'transactionAuth is empty';
+		if( empty($oRequest -> title) ) $err['title']						= 'title is empty';
+		if( empty($oRequest -> amount) ) $err['amount']						= 'amount is empty';
+
+		if( count($err) > 0) {
+			$oResponse -> statusMessage = implode(', ', $err);
+			break;
+		}
+	
+		
+		$oResponse -> status		= NotificationStatus::SUCCESS;
+		$oResponse -> statusMessage	= '';
+	} while(0);
+	
+// -------------------------------------------------------------------------------------------------
+//  send response to client
+// -------------------------------------------------------------------------------------------------
+	header('Content-type: text/plain; charset=iso-8859-1');
+	header('X-MCP-API-ResponseServiceProtocol: ' . TServiceProtocol::NVP);
+	echo TNvpSerializer::serialize($oResponse);
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/examples/readme.txt
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/examples/readme.txt	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/examples/readme.txt	(revision 5261)
@@ -0,0 +1,1 @@
+Hier finden Sie Beispiele für die Verwendung der jeweiligen Service-Interfaces.
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/clients/TSimpleHttpClient.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/clients/TSimpleHttpClient.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/clients/TSimpleHttpClient.php	(revision 5261)
@@ -0,0 +1,496 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Clients
+	 * @version 1.0
+	 */	
+
+	require_once(MCP__SERVICELIB_COMMON . 'TException.php');
+
+	class TSimpleHttpClientException extends TException {
+		protected function getErrorMessageFile() {
+			return dirname(__FILE__) . '/TSimpleHttpClientException.txt';
+		}
+	}
+
+	abstract class TSimpleHttpBase {
+		/**
+		 * @var array
+		 */
+		protected $_headers = array();
+
+		/**
+		 * @var string
+		 */
+		protected $_body = '';
+
+		/**
+		 * @return array
+		 */
+		public function getHeaders() {
+			return $this -> _headers;
+		}
+
+
+		/**
+		 * @param array $value
+		 */
+		public function setHeaders($value) {
+			if( is_array($value) ) {
+				$this -> _headers = $value;
+			}
+		}
+
+		/**
+		 * @param string $name
+		 * @param string $value
+		 * @param boolean $replace
+		 */
+		public function addHeader($name, $value, $replace=true) {
+			if($replace OR !isset($this -> _headers[$name])) $this -> _headers[$name] = $value;
+		}
+
+		/**
+		 * @param string $name
+		 */
+		public function removeHeader($name) {
+			if(isset($this -> _headers[$name])) unset($this -> _headers[$name]);
+		}
+
+		/**
+		 * @param string $name
+		 * @return boolean
+		 */
+		public function isHeader($name) {
+			return array_key_exists($name, $this -> _headers);
+		}
+
+		/**
+		 * @param string $name
+		 * @return string
+		 */
+		public function getHeader($name) {
+			if(isset($this -> _headers[$name])) return $this -> _headers[$name];
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setBody($value) {
+			$this -> _body = (string)$value;
+		}
+
+		/**
+		 * @return string $value
+		 */
+		public function getBody() {
+			return $this -> _body;
+		}
+	}
+
+
+	class TSimpleHttpResponse extends TSimpleHttpBase {
+		/**
+		 * @var integer
+		 */
+		private $_statusCode		= 0;
+
+		/**
+		 * @var string
+		 */
+		private $_statusMessage		= '';
+
+		/**
+		 * @param integer $code
+		 * @param string $message
+		 * @param string $body
+		 * @param array $headers
+		 */
+		public function __construct($code=0, $message='', $body='', $headers=null) {
+			$this -> setStatusCode($code);
+			$this -> setStatusMessage($message);
+			$this -> setBody($body);
+			$this -> setHeaders($headers);
+		}
+
+		/**
+		 * @param integer $value
+		 */
+		protected function setStatusCode($value) {
+			$this -> _statusCode = (integer)$value;
+		}
+
+		/**
+		 * @return integer
+		 */
+		public function getStatusCode() {
+			return $this -> _statusCode;
+		}
+
+		/**
+		 * @param string $value
+		 */
+		protected function setStatusMessage($value) {
+			$this -> _statusMessage = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getStatusMessage() {
+			return $this -> _statusMessage;
+		}
+
+		public function __toString() {
+			return $this -> getBody();
+		}
+
+		/**
+		 * @param string $data
+		 * @return TSimpleHttpResponse
+		 */
+		public static function parse(&$data) {
+			$tmp = preg_split('(\r\n\r\n|\r\r|\n\n)', $data);
+
+			$code 		= 0;
+			$message	= '';
+			$body 		= $data;
+			$headers	= array();
+			$tmpHeader		= trim($tmp[0]);
+
+			if( preg_match('/^HTTP\/\d.\d/i', $tmpHeader) ) {
+				$body = preg_replace('/' . preg_quote($tmpHeader, '/') . '/', '', $body);
+				$body = preg_replace('/^(\r\n\r\n|\r\r|\n\n)/', '', $body);
+			}			
+			else {
+				$tmpHeader = '';
+			}
+
+			if($tmpHeader) {
+				$proto = false;
+				$tmp = explode("\n", $tmpHeader);
+				foreach($tmp as $row) {
+					if(!$proto) {
+						if( $proto = preg_match('/^HTTP\/\d.\d (\d{3,}) (.*)/i', $row, $matches) ) {
+							$code		= $matches[1];
+							$message	= $matches[2];
+							continue;
+						}
+					}
+
+					list($k, $v) = preg_split('(: )', $row);
+					$headers[trim($k)] = trim($v);
+				}
+			}
+			
+		// UTF-8 Hack laut Guido
+			if(substr($body, 0, 3) === 'ï»¿') {
+				$body = substr($body, 3);
+			}
+			return new TSimpleHttpResponse($code, $message, $body, $headers);
+		}
+	}
+
+
+	class TSimpleHttpClient extends TSimpleHttpBase {
+		const SSL_PORT = 443;
+
+		const POST	= 'POST';
+		const GET	= 'GET';
+
+		const AUTHORIZATION_BASIC = 'Basic';
+
+		private $_requestMethod = self::POST;
+
+		/**
+		 * @var string
+		 */
+		private $_host = '';
+
+		/**
+		 * @var integer
+		 */
+		private $_port = 80;
+
+		/**
+		 * @var string
+		 */
+		private $_path = '/';
+
+		/**
+		 * @var string
+		 */
+		private $_query = '';
+
+		/**
+		 * @var string
+		 */
+		private $_user = '';
+
+		/**
+		 * @var string
+		 */
+		private $_pass = '';
+
+		/**
+		 * @var string
+		 */
+		private $_auth = self::AUTHORIZATION_BASIC;
+
+		/**
+		 * @var resource
+		 */
+		private $fp = null;
+
+		/**
+		 * @param string $method
+		 * @param string $uri
+		 */
+		public function __construct($method=TSimpleHttpClient::POST, $uri='') {
+			$this -> setRequestMethod($method);
+			$this -> parseUri($uri);
+		}
+
+		/**
+		 * @return TSimpleHttpResponse
+		 * @throws TSimpleHttpClientException
+		 */
+		public function request() {
+			if( $this -> getBody() ) $this -> setRequestMethod(self::POST);
+
+			$result = '';
+			switch($this -> getAuthorization() ) {
+				case self::AUTHORIZATION_BASIC:
+					if( $this -> getUser() )$this -> addHeader('Authorization', 'Basic ' . base64_encode($this -> getUser() . ':' . $this -> getPass()) );
+				break;
+			}
+
+		// modifications for GET requests
+			do {
+				if($this -> isPost()) break;
+				if($this -> isHeader('Content-type')) $this -> removeHeader('Content-type');
+				if($this -> isHeader('Content-length')) $this -> removeHeader('Content-length');
+			} while(0);
+
+		// modifications for POST requests
+			do {
+				if(!$this -> isPost()) break;
+				if( !$this -> isHeader('Content-length') ) $this -> addHeader('Content-length', (integer)strlen($this -> getBody()) );
+			} while(0);
+
+			$query = $this -> getQuery();
+			if($query) {
+				$path = $this -> getPath();
+				$path .= '?' .$query;
+				$this -> setPath($path);
+			}
+
+			$this -> streamOpen();
+			$this -> streamWrite( sPrintF("%s %s HTTP/1.0\n", $this -> getRequestMethod(), $this -> getPath()) );
+			$this -> streamWrite( sPrintF("Host: %s \n", $this -> getHost()) );
+
+			foreach( $this -> getHeaders() as $hName => $hValue)
+				$this -> streamWrite( sPrintF("%s: %s\n", $hName, $hValue) );
+
+			$this -> streamWrite("Connection: close\n\n");
+			if($this -> isPost() ) $this -> streamWrite( $this -> getBody() . "\n");
+
+			while(!$this -> streamEOF() ) {
+				$result .= $this -> streamRead(512);
+			}
+			$this -> streamClose();
+
+			return TSimpleHttpResponse::parse($result);
+
+		}
+
+		private function streamOpen() {
+			$errno 	= 0;
+			$errstr	= '';
+			$host = $this -> isSSL() ? 'ssl://' : '';
+			$host .= $this -> getHost();
+			$this -> fp = @fSockOpen($host, $this -> getPort(), $errno, $errstr, 30);
+			if(!$this -> fp) throw new TSimpleHttpClientException('streamopen_failed', $errno, $errstr, $this -> getHost(), $this -> getPort());
+		}
+
+		private function streamWrite($data) {
+			$result = fWrite($this -> fp, $data);
+			if($result === false) throw new TSimpleHttpClientException('streamwrite_failed', $data, $this -> getHost(), $this -> getPort(), $this -> getPath());
+			return $result;
+		}
+
+		private function streamRead($length) {
+			$result = fRead($this -> fp, $length);
+			if($result === false) throw new TSimpleHttpClientException('streamread_failed', $this -> getHost(), $this -> getPort(), $this -> getPath());
+			return $result;
+		}
+
+		private function streamEOF() {
+			return fEoF($this -> fp);
+		}
+
+		private function streamClose() {
+			if($this -> fp) @fClose($this -> fp);
+		}
+
+		/**
+		 * @param string $uri
+		 * @return boolean
+		 */
+		public function parseUri($uri) {
+			if( empty($uri) ) return false;
+			$uri = parse_url( $uri);
+
+			if( isset($uri['port'])) $this -> setPort($uri['port']);
+			if( isset($uri['scheme']) AND $uri['scheme'] == 'https') $this -> setPort(self::SSL_PORT);
+			if( isset($uri['host'])) $this -> setHost($uri['host']);
+			if( isset($uri['path'])) $this -> setPath($uri['path']);
+			if( isset($uri['query'])) $this -> setQuery($uri['query']);
+			if( isset($uri['user'])) $this -> setUser($uri['user']);
+			if( isset($uri['pass'])) $this -> setPass($uri['pass']);
+			if( isset($uri['user']) ) $this -> setAuthorization(self::AUTHORIZATION_BASIC);
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setAuthorization($value) {
+			$this -> _auth = $value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getAuthorization() {
+			return  $this -> _auth;
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setRequestMethod($value) {
+			$this -> _requestMethod = $value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getRequestMethod() {
+			return $this -> _requestMethod;
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setHost($value) {
+			$this -> _host = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getHost() {
+			return $this -> _host;
+		}
+
+		/**
+		 * @param integer $value
+		 */
+		public function setPort($value) {
+			$this -> _port = (integer)$value;
+		}
+
+		/**
+		 * @return integer
+		 */
+		public function getPort() {
+			return $this -> _port;
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setPath($value) {
+			$this -> _path = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getPath() {
+			return $this -> _path;
+		}		
+
+		/**
+		 * @param string $value
+		 */
+		public function setUser($value) {
+			$this -> _user = (string)$value;
+			$this -> setAuthorization(self::AUTHORIZATION_BASIC);
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getUser() {
+			return $this -> _user;
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setPass($value) {
+			$this -> _pass = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getPass() {
+			return $this -> _pass;
+		}
+
+		/**
+		 * @param mixed $value
+		 * @param string only if $value is array or object
+		 */
+		public function setQuery($value, $argSeparator='&') {
+			if( is_scalar($value) ) {
+				$this -> _query = (string)$value;
+			}
+			else {
+				$this -> _query = http_build_query($value, '', $argSeparator);
+			}
+		}
+
+		/**
+		 * @param boolean $map
+		 * @return mixed
+		 */
+		public function getQuery($map=false) {
+			$result = $this -> _query;
+			if($map) parse_str($this -> _query, $result);
+			return $result;
+		}
+
+		/**
+		 *
+		 * @return boolean
+		 */
+		public function isSSL() {
+			return ($this -> _port == self::SSL_PORT);
+		}
+
+		
+
+		/**
+		 * @return boolean
+		 */
+		public function isPost() {
+			return ($this -> getRequestMethod() == self::POST);
+		}
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/clients/TSimpleHttpClientException.txt
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/clients/TSimpleHttpClientException.txt	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/clients/TSimpleHttpClientException.txt	(revision 5261)
@@ -0,0 +1,4 @@
+streamopen_failed				= An Error occured during connect to "{2}:{3}" #{0} "{1}"
+streamopen_ssl_not_supported	= SSL currently not supported
+streamwrite_failed				= An Error occured during writing data to stream "{1}:{2}{3}" {0}
+streamread_failed				= An Error occured during reading data from stream "{1}:{2}{3}"
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/ServiceReflection.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/ServiceReflection.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/ServiceReflection.php	(revision 5261)
@@ -0,0 +1,614 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Reflection
+	 * @version 1.0
+	 */
+
+	class ServiceReflection {
+		/**
+		 * @var string
+		 */
+		private $_className = '';
+
+		/**
+		 * @var ClassServiceReflection
+		 */
+		private $_serviceClassReflection = null;
+
+		/**
+		 * @param string $className
+		 * @param integer $options
+		 * @param mixed $server
+		 */
+		public function __construct($className, $options=0) {
+			$this -> _className = $className;
+			$this -> reflectService($options);
+		}
+
+		/**
+		 * @return ClassServiceReflection
+		 */
+		public function getServiceClassReflection() {
+			return $this -> _serviceClassReflection;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getClass() {
+			return $this -> _className;
+		}
+
+
+		/**
+		 * @param integer $options
+		 */
+		protected function reflectService($options=0) {
+			$this -> _serviceClassReflection = ClassServiceReflection::createReflection(new ReflectionClass( $this -> getClass() ) );
+		}
+	}
+
+
+	abstract class BaseServiceReflection {
+		/**
+		 * @var string
+		 */
+		private $_type = '';
+
+		/**
+		 * @var string
+		 */
+		private $_description = '';
+
+		/**
+		 * @param string $type
+		 * @param string $description
+		 */
+		public function __construct($type='', $description='') {
+			$this -> setType($type);
+			$this -> setDescription($description);
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setType($value) {
+			$this -> _type = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getType() {
+			return $this -> _type;
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setDescription($value) {
+			$this -> _description = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getDescription() {
+			return $this -> _description;
+		}
+
+		protected static function removeCommentElements($value) {
+			$value = preg_replace('/(^[\\s]*\\/\\*\\*)|(^[\\s]\\*\\/)|(^[\\s]*\\*?\\s)|(^[\\s]*)|(^[\\t]*)/ixm', '', $value);
+			$value = preg_replace('/(\*\/)$/i', '', $value);
+			$value = trim($value);
+			return $value;
+		}
+
+		protected static function prepareDocComment($value) {
+			$value = self::removeCommentElements($value);
+			$value = str_replace("\r", '', $value);
+			$value = preg_replace("/([\\t])+/", "\t", $value);
+		    return explode("\n", $value);
+		}
+
+		/**
+		 * @param string $value
+		 * @return string
+		 */
+		protected static function getDescriptionBlock($value) {
+			$commentLines = self::prepareDocComment($value);
+
+			$result = '';
+			foreach($commentLines as $line) {
+				if($line == '')  continue;
+				if($line{0} == '@') continue;
+
+				$result .= $line;
+				$result .= "\n";
+			}
+
+			$result = trim($result);
+
+			return $result;
+		}
+
+	}
+
+	class NamedServiceReflectionBase extends BaseServiceReflection {
+		/**
+		 * @var string
+		 */
+		private $_name = null;
+
+		/**
+		 * @param string $name
+		 * @param string $type
+		 * @param string $description
+		 */
+		public function __construct($name='', $type='', $description='') {
+			parent::__construct($type, $description);
+			$this -> setName($name);
+		}
+
+		/**
+		 * @param string $value
+		 */
+		public function setName($value) {
+			$this -> _name = (string)$value;
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getName() {
+			return $this -> _name;
+		}
+
+	}
+
+	class ClassServiceReflection extends BaseServiceReflection {
+		/**
+		 * @var MethodServiceReflection[]
+		 */
+		private $_methods = array();
+
+		/**
+		 * @param MethodServiceReflection[] $value
+		 */
+		public function setMethods($value) {
+			if( !is_array($value) ) return;
+		}
+
+		/**
+		 * @return MethodServiceReflection[]
+		 */
+		public function getMethods() {
+			return $this -> _methods;
+		}
+
+		/**
+		 * @param string $name
+		 * @return MethodServiceReflection
+		 */
+		public function getMethod($name) {
+			if( !$this -> hasMethod($name) ) return null;
+			return $this -> _methods[$name];
+		}
+
+		/**
+		 * @param string $name
+		 * @return boolean
+		 */
+		public function hasMethod($name) {
+			return isset($this -> _methods[$name]);
+		}
+
+		/**
+		 * @param MethodServiceReflection $value
+		 */
+		public function addMethod(MethodServiceReflection $value) {
+			$this -> _methods[$value -> getName()] = $value;
+		}
+
+		static public function createReflection(ReflectionClass $reflection) {
+			$result = new ClassServiceReflection($reflection -> getName(), self::getDescriptionBlock($reflection -> getDocComment()));
+
+			$methods = $reflection -> getMethods();
+			foreach($methods as $method) {
+				if( !$method -> isPublic()) continue;
+				$result -> addMethod( MethodServiceReflection::createReflection($method) );
+			}
+			return $result;
+		 }
+
+		 public function getTypes() {
+		 	$result = array();
+		 	foreach($this -> getMethods() as $item) {
+		 		$result = array_merge($result, $item -> getTypes());
+		 	}
+		 	return $result;
+		 }
+	}
+
+
+	class MethodServiceReflection extends NamedServiceReflectionBase {
+		/**
+		 * @var ParameterServiceReflection[]
+		 */
+		private $_parameters = array();
+
+		/**
+		 * @var ReturnServiceReflection
+		 */
+		private $_return	= null;
+
+		/**
+		 * @param string $name
+		 * @param string $type
+		 * @param string $description
+		 * @param ParameterServiceReflection[] $parameters
+		 * @param ReturnServiceReflection $return
+		 */
+		public function __construct($name='', $type='', $description='', $parameters=null, $return=null) {
+			parent::__construct($name, $type, $description);
+			$this -> setParameters($parameters);
+			$this -> setReturn($return);
+		}
+
+		/**
+		 * @param ParameterServiceReflection[] $value
+		 */
+		public function setParameters($value) {
+			if( !is_array($value) ) return;
+			$_parameters = array();
+			foreach($value as $param) {
+				$this -> addParamter($param);
+			}
+		}
+
+		/**
+		 * @return ParameterServiceReflection[]
+		 */
+		public function getParameters() {
+			return $this -> _parameters;
+		}
+
+		/**
+		 * @return integer
+		 */
+		public function getNumberOfParameters() {
+			return count($this -> _parameters);
+		}
+
+		/**
+		 * @param ParameterServiceReflection $value
+		 */
+		public function addParamter(ParameterServiceReflection $value) {
+			$this -> _parameters[$value -> getName()] = $value;
+		}
+
+		/**
+		 * @param string $name
+		 * @return ParameterServiceReflection
+		 */
+		public function getParamter($name) {
+			if( !isset($this -> _parameters[$name]) ) return null;
+			return $this -> _parameters[$name];
+		}
+
+		/**
+		 * @param ReturnServiceReflection $value
+		 */
+		public function setReturn($value) {
+			if( !$value instanceof ReturnServiceReflection) return;
+			$this -> _return = $value;
+		}
+
+		/**
+		 * @return ReturnServiceReflection
+		 */
+		public function getReturn() {
+			return $this -> _return;
+		}
+
+		static public function createReflection(ReflectionMethod $reflection) {
+		 	$comment = $reflection -> getDocComment();
+		 	$result = new MethodServiceReflection($reflection -> getName(), '', self::getDescriptionBlock($comment));
+
+		 	$commentLines = self::prepareDocComment($comment);
+
+		 	$tmpParams	= array();
+		 	$return		= new ReturnServiceReflection('void', '');
+
+			$params = $reflection -> getParameters();
+			foreach($params as $param) {
+				$name = $param -> getName();
+				$tmpParams[$name] = new ParameterServiceReflection($name, 'mixed');
+
+				/* QUICKFIX: for Bug#62715 in PHP 5.3.16
+				 * @link https://bugs.php.net/bug.php?id=62715
+				 * Fatal error: Uncaught exception 'ReflectionException' with message 'Parameter is not optional'
+				 */
+				if(version_compare(str_replace(PHP_EXTRA_VERSION, '', PHP_VERSION) , '5.3.16', 'eq')) continue;
+
+				if( $param -> isDefaultValueAvailable() ) {
+					$tmpParams[$name] -> setHasDefault(true);
+					$tmpParams[$name] -> setRequired(false);
+					$tmpParams[$name] -> setDefault( $param -> getDefaultValue(), false);
+				}
+			}
+
+
+		 	foreach($commentLines as $line) {
+				if ($line == '') continue;
+				if ($line{0} != '@') continue;
+
+				if( preg_match('/^@param\s+([\w\[\]()]+)\s+\$([\w()]+)\s*(.*)/i', $line, $match) ) {
+					$type = $match[1];
+					$name = $match[2];
+					$desc = $match[3];
+					$param = new ParameterServiceReflection($name, $type, $desc);
+
+					if( preg_match('/\(default=(.*)\)/i', $desc, $regs) ) {
+						$param -> setHasDefault(true);
+						$param -> setRequired(false);
+
+						$default = $regs[1];
+						if($default == "''") {
+							$param -> setDefault('', false);
+						}
+						elseif($default{0} == "'") {
+							$default =  substr($default, 1, strlen($default) -2);
+							$param -> setDefault($default);
+						}
+						else {
+							$param -> setDefault($default);
+						}
+
+						$desc = preg_replace('/' . preg_quote('(default=' . $regs[1] . ')', '/') . '/i', '', $desc);
+						$param -> setDescription($desc);
+					}
+
+					$tmpParams[$name] = $param;
+				}
+
+				if( preg_match('/^@return\s+([\w\[\]()]+)\s*(.*)/i', $line, $match) ) {
+					$return -> setType($match[1]);
+					$return -> setDescription($match[2]);
+				}
+
+				if( preg_match('/^@result\s+([\w\[\]()]+)\s+\$([\w()]+)\s*(.*)/i', $line, $match) ) {
+
+					$name = $match[2];
+					$type = $match[1];
+					$desc = $match[3];
+
+					if( preg_match('/\(default=(.*)\)/i', $desc, $regs) ) {
+						$resultParam = new ParameterServiceReflection($name, $type, $desc);
+
+						$resultParam -> setHasDefault(true);
+						$resultParam -> setRequired(false);
+
+						$default = $regs[1];
+						if($default == "''") {
+							$resultParam -> setDefault('', false);
+						}
+						elseif($default{0} == "'") {
+							$default =  substr($default, 1, strlen($default) -2);
+							$resultParam -> setDefault($default);
+						}
+						else {
+							$resultParam -> setDefault($default);
+						}
+
+						$desc = preg_replace('/' . preg_quote('(default=' . $regs[1] . ')', '/') . '/i', '', $desc);
+						$resultParam -> setDescription($desc);
+
+						$return -> addResult( $resultParam );
+					}
+					else {
+						$return -> addResult( new NamedServiceReflectionBase($name, $type, $desc)  );
+					}
+				}
+			}
+
+			$result -> setParameters($tmpParams);
+			$result -> setReturn($return);
+
+		 	return $result;
+		 }
+
+		 public function getTypes() {
+		 	$result = $this -> getReturn() -> getTypes();
+
+		 	foreach($this -> getParameters() as $item) {
+		 		$result[$item -> getType()] = $item -> getType();
+		 	}
+		 	return $result;
+		 }
+
+	}
+
+
+	class ParameterServiceReflection extends NamedServiceReflectionBase {
+		/**
+		 * @var boolean
+		 */
+		private $_hasDefault = false;
+
+		/**
+		 * @var boolean
+		 */
+		private $_required = false;
+
+		/**
+		 * @var mixed
+		 */
+		private $_default = null;
+
+		/**
+		 * @param string $name
+		 * @param string $type
+		 * @param string $description
+		 * @param boolean $required
+		 * @param mixed $default
+		 */
+		public function __construct($name='', $type='', $description='', $hasDefault = false, $required=true, $default=null) {
+			parent::__construct($name, $type, $description);
+			$this -> setDefault($default);
+			$this -> setHasDefault($hasDefault);
+			$this -> setRequired($required);
+		}
+
+		/**
+		 * @param mixed $value
+		 * @param boolean $typeCast
+		 */
+		public function setDefault($value, $typeCast=true) {
+			if($typeCast) {
+				$type = gettype($value);
+
+				switch( strToLower($type) ) {
+					case 'boolean':
+					case 'bool':
+						$this -> _default = $value ? true : false;
+					break;
+
+					case 'double':
+					case 'float':
+						$this -> _default = (float)$value;
+					break;
+
+					case 'integer':
+						$this -> _default = (integer)$value;
+					break;
+
+					case 'null':
+						$this -> _default = null;
+					break;
+
+					case 'string':
+						if($value == 'null') $this -> _default = null;
+						elseif($value == 'true') $this -> _default = true;
+						elseif($value == 'false') $this -> _default = false;
+						else $this -> _default = $value;
+					break;
+
+					default:
+						$this -> _default = $value;
+					break;
+				}
+			}
+			else {
+				$this -> _default = $value;
+			}
+			$this -> setHasDefault(true);
+		}
+
+		/**
+		 * @return string
+		 */
+		public function getDefault() {
+			return $this -> _default;
+		}
+
+		public function getDefaultAsText() {
+			$result = $this -> _default;
+			if($result === null) {
+				$result = 'null';
+			}
+			elseif( is_bool($result) ) {
+				$result = $result ? 'true' : 'false';
+			}
+			elseif( is_string($result) ) {
+
+				if( is_numeric($result) OR $result === '' ) {
+				}
+				else {
+					$result = '\'' . $result . '\'';
+				}
+			}
+			return $result;
+		}
+
+		/**
+		 * @param boolean $value
+		 */
+		public function setRequired($value) {
+			$this -> _required = (boolean)$value;
+		}
+
+		/**
+		 * @return boolean
+		 */
+		public function getRequired() {
+			return $this -> _required;
+		}
+
+		/**
+		 * @param boolean $value
+		 */
+		public function setHasDefault($value) {
+			$this -> _hasDefault = (boolean)$value;
+		}
+
+		/**
+		 * @return boolean
+		 */
+		public function getHasDefault() {
+			return $this -> _hasDefault;
+		}
+
+	}
+
+
+	class ReturnServiceReflection extends BaseServiceReflection {
+		/**
+		 * @var NamedServiceReflectionBase[]
+		 */
+		protected $_results = array();
+
+		/**
+		 * @return integer
+		 */
+		public function getNumberOfResults() {
+			return count($this -> _results);
+		}
+
+		/**
+		 * @param NamedServiceReflectionBase[] $value
+		 */
+		public function setResults($value) {
+			if(!is_array($value)) return;
+		}
+
+		/**
+		 * @return NamedServiceReflectionBase[]
+		 */
+		public function getResults() {
+			return $this -> _results;
+		}
+
+		/**
+		 * @param NamedServiceReflectionBase $value
+		 */
+		public function addResult(NamedServiceReflectionBase $value) {
+			$this -> _results[$value -> getName()] = $value;
+		}
+
+		 public function getTypes() {
+		 	$result = array();
+		 	$result[$this -> getType()] = $this -> getType();
+
+		 	foreach($this -> getResults() as $item) {
+		 		$result[$item -> getType()] = $item -> getType();
+		 	}
+		 	return $result;
+		 }
+
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/TException.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/TException.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/TException.php	(revision 5261)
@@ -0,0 +1,180 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Exception
+	 * @version 1.0
+	 */	
+
+
+	class TException extends Exception {
+		private $_errorCode = '';
+	
+		/**
+		 * Constructor.
+		 * @param string $errorCode error message. This can be a string that is listed
+		 * in the message file. If so, the message in the preferred language
+		 * will be used as the error message. Any rest parameters will be used
+		 * to replace placeholders ({0}, {1}, {2}, etc.) in the message.
+		 */
+		public function __construct($errorCode) {
+			$this -> _errorCode = $errorCode;
+			$errorMessage = $this -> translateErrorMessage($errorCode);
+			$args = func_get_args();
+			array_shift($args);
+			parent::__construct( $this -> replaceMessageToken($errorMessage, $args), (is_numeric($errorCode) ? $errorCode : null)  );
+		}
+	
+
+		/**
+		 * @param string $message
+		 * @param array $args
+		 * @return string
+		 */
+		protected function replaceMessageToken($message, $args) {
+			$n = count($args);
+			$tokens = array();
+			for($i=0; $i<$n; ++$i)
+				$tokens['{' . $i . '}'] = (string)$args[$i];
+			return strTr($message, $tokens);
+		}
+				
+		
+		/**
+		 * Translates an error code into an error message.
+		 * @param string $key error code that is passed in the exception constructor.
+		 * @return string the translated error message
+		 */
+		protected function translateErrorMessage($key) {
+			$msgFile = $this -> getErrorMessageFile();
+			if( ($entries = @file($msgFile) ) === false )
+				return $key;
+			else {
+				foreach($entries as $entry) {
+					$tmp = explode('=', $entry, 2);
+					$code		= isset($tmp[0]) ? $tmp[0] : '';
+					$message	= isset($tmp[1]) ? $tmp[1] : '';
+					
+					if( trim($code) == $key )
+						return trim($message);
+				}
+				return $key;
+			}
+		}
+	
+		/**
+		 * @return string path to the error message file
+		 */
+		protected function getErrorMessageFile() {
+			return dirname(__FILE__) . '/messages.txt';
+		}
+	
+		/**
+		 * @return string error code
+		 */
+		public function getErrorCode() {
+			return $this -> _errorCode;
+		}
+	
+		/**
+		 * @param string $code error code
+		 */
+		public function setErrorCode($code) {
+			$this -> _errorCode = $code;
+		}
+	
+		/**
+		 * @return string error message
+		 */
+		public function getErrorMessage() {
+			return $this -> getMessage();
+		}
+	
+		/**
+		 * @param string $message error message
+		 */
+		protected function setErrorMessage($message) {
+			$this -> message = $message;
+		}
+	}
+	
+	
+	class TSystemException extends TException {}
+	
+	
+	class TPhpErrorException extends TSystemException {
+		/**
+		 * Constructor.
+		 * @param integer $errno error number
+		 * @param string $errstr error string
+		 * @param string $errfile error file
+		 * @param integer $errline error line number
+		 */
+		public function __construct($errno, $errstr, $errfile, $errline) {
+			static $errorTypes = array(
+				E_ERROR           => 'Error',
+				E_WARNING         => 'Warning',
+				E_PARSE           => 'Parsing Error',
+				E_NOTICE          => 'Notice',
+				E_CORE_ERROR      => 'Core Error',
+				E_CORE_WARNING    => 'Core Warning',
+				E_COMPILE_ERROR   => 'Compile Error',
+				E_COMPILE_WARNING => 'Compile Warning',
+				E_USER_ERROR      => 'User Error',
+				E_USER_WARNING    => 'User Warning',
+				E_USER_NOTICE     => 'User Notice',
+				E_STRICT          => 'Runtime Notice'
+			);
+			$errorType = isset($errorTypes[$errno]) ? $errorTypes[$errno] : 'Unknown Error';
+			
+			parent::__construct( sPrintF('[%s] %s (@line %d in file %s)', $errorType, $errstr, $errline, $errfile) );
+		}
+	}
+
+	
+	/**
+	 * THttpException class
+	 *
+	 * THttpException represents an exception that is caused by invalid operations
+	 * of end-users. The {@link getStatusCode StatusCode} gives the type of HTTP error.
+	 */
+	class THttpException extends TSystemException {
+		private $_statusCode;
+	
+		/**
+		 * Constructor.
+		 * @param integer $statusCode HTTP status code, such as 404, 500, etc.
+		 * @param string $errorCode error message. This can be a string that is listed
+		 * in the message file. If so, the message in the preferred language
+		 * will be used as the error message. Any rest parameters will be used
+		 * to replace placeholders ({0}, {1}, {2}, etc.) in the message.
+		 */
+		public function __construct($statusCode, $errorCode) {
+			$this -> setStatusCode($statusCode);
+			
+			$this -> setErrorCode($errorCode);
+			$errorMessage = $this -> translateErrorMessage($errorCode);
+
+			$args = func_get_args();
+			array_shift($args);
+			array_shift($args);
+			$this -> setErrorMessage( $this -> replaceMessageToken($errorMessage, $args)  );
+		}
+	
+		/**
+		 * @return integer HTTP status code, such as 404, 500, etc.
+		 */
+		public function getStatusCode() {
+			return $this -> _statusCode;
+		}
+		
+		public function setStatusCode($value) {
+			$this -> _statusCode = (integer)$value;
+			$this -> code = (integer)$value;
+		}
+	}
+	
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/TServiceProtocol.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/TServiceProtocol.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/common/TServiceProtocol.php	(revision 5261)
@@ -0,0 +1,53 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Types
+	 * @version 1.0
+	 */	
+
+	class TServiceProtocol {
+		/**
+		 * unknown
+		 */
+		const UNKNOWN	= 'UNKNOWN'; // dummy
+
+		/**
+		 * none
+		 */
+		const NONE	= 'NONE'; // dummy
+		
+		/**
+		 * MCP proprietary format
+		 */
+		const NVP	= 'NVP';
+		
+		/**
+		 * Soap
+		 */
+		const SOAP = 'SOAP'; // not fully supportet
+
+		/**
+		 * J.S.O.N.
+		 */
+		const JSON = 'JSON'; // not suppoted
+
+		/**
+		 * HTTP GET and POST request parameters (urlencoded)
+		 */
+		const HTTP_PARAMS = 'HTTP_PARAMS';
+
+		/**
+		 * HTTP GET request parameters (urlencoded)
+		 */
+		const HTTP_PARAMS_GET = 'HTTP_PARAMS_GET';
+
+		/**
+		 * HTTP POST request parameters (urlencoded)
+		 */
+		const HTTP_PARAMS_POST = 'HTTP_PARAMS_POST';
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/IServiceDispatcher.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/IServiceDispatcher.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/IServiceDispatcher.php	(revision 5261)
@@ -0,0 +1,57 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatcher
+	 * @version 1.0
+	 */
+
+	interface IServiceDispatcher {
+		/**
+		 * @param string $value
+		 */
+		public function setInterface($value);
+		
+		/**
+		 * @return string
+		 */
+		public function getInterface();
+		
+		/**
+		 * @return ClassServiceReflection
+		 */
+		public function getInterfaceReflection();
+		
+		/**
+		 * @return string
+		 */
+		public function getServiceUri();
+		
+		/**
+		 * @param string $value
+		 */
+		public function setServiceUri($value);
+		
+		/**
+		 * @return string
+		 * @see TServiceProtocol
+		 */
+		public function getRequestProtocol();
+
+		/**
+		 * @return string
+		 * @see TServiceProtocol
+		 */
+		public function getResponseProtocol();
+		
+	
+		/**
+		 * @param string $name
+		 * @param mixed $params
+		 * @return mixed
+		 */
+		public function send($name, $params=null);
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TNvpServiceDispatcher.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TNvpServiceDispatcher.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TNvpServiceDispatcher.php	(revision 5261)
@@ -0,0 +1,22 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatcher
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/TServiceDispatcher.php');
+	
+	class TNvpServiceDispatcher extends TServiceDispatcher {
+		/**
+		 * @param string $interface
+		 * @param string $serviceUri
+		 */
+		public function __construct($interface, $serviceUri) {
+			parent::__construct($interface, $serviceUri, TServiceProtocol::HTTP_PARAMS, TServiceProtocol::NVP);
+		}
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TServiceDispatcher.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TServiceDispatcher.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TServiceDispatcher.php	(revision 5261)
@@ -0,0 +1,213 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatcher
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/IServiceDispatcher.php');
+	require_once( dirname(__FILE__) . '/adapter/TDispatchRequestAdapter.php');
+	require_once( dirname(__FILE__) . '/adapter/TDispatchResponseAdapter.php');
+	
+	
+	class TServiceDispatcherException extends TException {
+		protected function getErrorMessageFile() {
+			return dirname(__FILE__) . '/TServiceDispatcherException.txt';
+		}	
+	}
+
+	class TServiceDispatcher implements IServiceDispatcher {
+		/**
+		 * @var string
+		 * @see setInterface(), getInterface()
+		 */
+		private $_interface = null;
+		
+		/**
+		 * request-adapter
+		 *
+		 * @var IDispatchRequestAdapter
+		 */
+		protected $oRequestAdapter	= null;		
+		
+		/**
+		 * response-adapter
+		 *
+		 * @var IDispatchResponseAdapter
+		 */
+		protected $oResponseAdapter	= null;
+		
+		/**
+		 * @param string $interface
+		 * @param string $serviceUri
+		 * @param string $requestProtocol
+		 * @param string $responseProtocol
+		 * @param mixed $requestAdapterOptions
+		 * @param mixed $responseAdapterOptions
+		 */
+		public function __construct($interface, $serviceUri, $requestProtocol, $responseProtocol, $requestAdapterOptions=null, $responseAdapterOptions=null) {
+			$this -> setInterface($interface);
+			
+			$this -> setRequestAdapter( TDispatchRequestAdapter::createByServiceProtocol($this, $requestProtocol, $requestAdapterOptions) );
+			$this -> setResponseAdapter( TDispatchResponseAdapter::createByServiceProtocol($this, $responseProtocol, $responseAdapterOptions) );
+			
+			$this -> oRequestAdapter -> setServiceUri($serviceUri);
+		}
+		
+		/**
+		 * @return ClassServiceReflection
+		 */
+		public function getInterfaceReflection() {
+			return ClassServiceReflection::createReflection( new ReflectionClass($this -> getInterface()));
+		}
+		
+		/**
+		 * @param string $name
+		 * @param array $params
+		 * @return mixed
+		 * @todo params mit reflection aufbereiten
+		 * @throws TNotificationDispatcherException
+		 */
+		public function send($name, $params=null) {
+			$result = null;
+			$args = array();
+			$iReflection = $this -> getInterfaceReflection();
+			
+			if( !$iReflection -> hasMethod($name) ) throw new TServiceDispatcherException('servicemethod_unkown', $name);
+			
+			$nReflection = $iReflection -> getMethod($name);
+			
+			do {
+				if( $nReflection -> getNumberOfParameters() == 0 ) break;
+				
+				$aNpReflection = $nReflection -> getParameters();
+				
+				$c = -1;
+				foreach($aNpReflection as $npReflection) {
+					++$c;
+					
+					$paramName	= $npReflection -> getName();
+					$args[$paramName] = $paramValue = null;
+					
+					if( $params AND is_array($params) AND array_key_exists($paramName, $params) ) {
+						$args[$paramName] = $paramValue = $params[$paramName];
+						continue;
+					}
+
+					if( $params AND is_array($params) AND array_key_exists($c, $params) ) {
+						$args[$paramName] = $paramValue = $params[$c];
+						continue;
+					}
+
+				
+					if( $npReflection -> getHasDefault() ) {
+						$args[$paramName] = $npReflection -> getDefault();
+						continue;
+					}
+					
+					if( $npReflection -> getRequired() ) throw new TServiceDispatcherException('servicemethod_param_missing', $name, $paramName);
+				}
+				
+			} while(0);
+			
+			$this -> oRequestAdapter -> setMethodName($name);
+			$this -> oRequestAdapter -> setMethodParameters($args);
+			$data = $this -> oRequestAdapter -> call();
+			
+			return $this -> oResponseAdapter -> unserialize($data, $nReflection);
+		}
+		
+		/**
+		 * @param string $name
+		 * @param mixed $params
+		 */		
+		public function __call($name, $params) {
+			return $this -> send($name, $params);
+		}
+		
+		/**
+		 * @param string $value
+		 */
+		public function setInterface($value) {
+			$this -> _interface = $value;
+		}
+		
+		/**
+		 * @return string
+		 */
+		public function getInterface() {
+			return $this -> _interface;
+		}
+		
+		/**
+		 * @return string
+		 */
+		public function getServiceUri() {
+			return $this -> oRequestAdapter -> getServiceUri();
+		}
+		
+		/**
+		 * @param string $value
+		 */
+		public function setServiceUri($value) {
+			$this -> oRequestAdapter -> setServiceUri($value);
+		}
+		
+		/**
+		 * @return string
+		 * @see TServiceProtocol
+		 */
+		public function getRequestProtocol() {
+			return $this -> oRequestAdapter -> getServiceProtocol();
+		}
+		
+		/**
+		 * @return string
+		 * @see TServiceProtocol
+		 */
+		public function getResponseProtocol() {
+			return $this -> oResponseAdapter -> getServiceProtocol();
+		}
+
+		
+		/**
+		 * assign response-adapter
+		 *
+		 * @param IDispatchResponseAdapter $adapder
+		 */
+		public function setResponseAdapter(IDispatchResponseAdapter $adapder) {
+			$this -> oResponseAdapter = $adapder;
+		}
+		
+		/**
+		 * return current response-adapter
+		 *
+		 * @return IDispatchResponseAdapter
+		 */
+		public function getResponseAdapter() {
+			return $this -> oResponseAdapter;
+		}
+		
+		/**
+		 * assign server adapter
+		 *
+		 * @param IDispatchRequestAdapter $adapder
+		 */
+		public function setRequestAdapter(IDispatchRequestAdapter $adapder) {
+			$this -> oRequestAdapter = $adapder;
+		}
+		
+		/**
+		 * return current request-adapter
+		 *
+		 * @return IDispatchRequestAdapter
+		 */
+		public function getRequestAdapter() {
+			return $this -> oRequestAdapter;
+		}		
+		
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TServiceDispatcherException.txt
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TServiceDispatcherException.txt	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/TServiceDispatcherException.txt	(revision 5261)
@@ -0,0 +1,2 @@
+servicemethod_unkown 		= service method named "{0}" do not exists
+servicemethod_param_missing	= service method named "{0}" requires param "{1}"
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchAdapter.php	(revision 5261)
@@ -0,0 +1,55 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	interface IDispatchAdapter {
+		/**
+		 * @param IServiceDispatcher $manager
+		 */
+		public function setManager(IServiceDispatcher $manager);
+		
+		/**
+		 * @return INotificationDispatcher
+		 */
+		public function getManager();
+		
+		/**
+		 * @param IServiceDispatcher $manager
+		 * @param string $protocol
+		 * @param mixed $options
+		 * @return IDispatchAdapter
+		 * @see TServiceProtocol
+		 */
+		public static function createByServiceProtocol(IServiceDispatcher $manager, $protocol, $options=null);
+		
+		/**
+		 * @param string $value
+		 * @see TServiceProtocol
+		 */
+		public function setServiceProtocol($value);
+		
+		/**
+		 * @return string $value
+		 * @see TServiceProtocol
+		 */
+		public function getServiceProtocol();
+		
+		/**
+		 * @param mixed $value
+		 */
+		public function setOptions($value=null);
+		
+		/**
+		 * @return mixed $value
+		 */
+		public function getOptions();
+		
+		
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchRequestAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchRequestAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchRequestAdapter.php	(revision 5261)
@@ -0,0 +1,51 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/IDispatchAdapter.php');
+
+	interface IDispatchRequestAdapter extends IDispatchAdapter  {
+		
+		/**
+		 * @return string
+		 */
+		public function getServiceUri();
+		
+		/**
+		 * @param string $value
+		 */
+		public function setServiceUri($value);
+		
+		/**
+		 * @return string
+		 */
+		public function getMethodName();
+		
+		/**
+		 * @param string $value
+		 */
+		public function setMethodName($value);
+		
+		
+		/**
+		 * @param array $value
+		 */
+		public function setMethodParameters($value);
+		
+		/**
+		 * @return array
+		 */
+		public function getMethodParameters();
+		
+		/**
+		 * @return mixed
+		 */
+		public function call();
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchResponseAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchResponseAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/IDispatchResponseAdapter.php	(revision 5261)
@@ -0,0 +1,32 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/IDispatchAdapter.php');
+
+	interface IDispatchResponseAdapter extends IDispatchAdapter {
+		
+		/**
+		 * @return mixed $value
+		 */
+		public function getData();
+		
+		/**
+		 * @return MethodServiceReflection
+		 */
+		public function getReflection();
+		
+		/**
+		 * @param mixed $data
+		 * @param MethodServiceReflection $interfaceNotificationReflection
+		 * @return mixed
+		 */
+		public function unserialize($data, MethodServiceReflection $interfaceNotificationReflection);
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchAdapter.php	(revision 5261)
@@ -0,0 +1,79 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/IDispatchAdapter.php');
+
+	class TDispatchAdapterException extends TException {
+		protected function getErrorMessageFile() {
+			return dirname(__FILE__) . '/TDispatchAdapterException.txt';
+		}
+	}
+	
+	abstract class TDispatchAdapter implements IDispatchAdapter {
+		/**
+		 * @var string
+		 * @see TServiceProtocol
+		 */
+		private $_serviceProtocol	= TServiceProtocol::NONE;
+		
+		/**
+		 * @var mixed
+		 */
+		private $_options = null;
+		
+		/**
+		 * @var IServiceDispatcher
+		 */
+		private $_manager = null;
+		
+		
+		public function setManager(IServiceDispatcher $manager) {
+			$this -> _manager = $manager;
+		}
+		
+		/**
+		 * @return IServiceDispatcher
+		 */
+		public function getManager() {
+			return $this -> _manager;
+		}
+		
+		
+		/**
+		 * @param string $value
+		 * @see TServiceProtocol
+		 */
+		public function setServiceProtocol($value) {
+			$this -> _serviceProtocol = $value;
+		}
+		
+		/**
+		 * @return string $value
+		 * @see TServiceProtocol
+		 */
+		public function getServiceProtocol() {
+			return $this -> _serviceProtocol;
+		}
+		
+		/**
+		 * @param mixed $value
+		 */
+		public function setOptions($value=null) {
+			$this -> _options = $value;			
+		}
+		
+		/**
+		 * @return mixed $value
+		 */
+		public function getOptions() {
+			return $this -> _options;
+		}	
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchAdapterException.txt
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchAdapterException.txt	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchAdapterException.txt	(revision 5261)
@@ -0,0 +1,6 @@
+protocol_not_supported			= service protocol "{1}" not supported by "{0}" yet
+protocol_unknown				= adapter "{0}" don't know service protocol "{1}"
+adapter_datatype_not_supported	= Response data type "{0}" not supported
+adapter_protocol_not_supported	= {0} do not support service protocol "{1}" use another Adapter
+
+servicemethod_result_missing	= service method named "{0}" requires result "{1}"
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchRequestAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchRequestAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchRequestAdapter.php	(revision 5261)
@@ -0,0 +1,125 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/IDispatchRequestAdapter.php');
+	require_once( dirname(__FILE__) . '/TDispatchAdapter.php');
+	
+	abstract class TDispatchRequestAdapter extends TDispatchAdapter implements IDispatchRequestAdapter {
+		/**
+		 * URI of notification destination
+		 *
+		 * @var string
+		 * @see setServiceUri(), getServiceUri()
+		 */
+		private $_serviceUri	= '';
+		
+		/**
+		 * @var string
+		 */
+		private $_methodName = '';
+		
+		/**
+		 * @var array
+		 */
+		private $_methodParameters = array();
+		
+		/**
+		 * @param IServiceDispatcher $manager
+		 * @param string $protocol
+		 * @param mixed $options
+		 * @return IDispatchRequestAdapter
+		 * @see TServiceProtocol
+		 */		
+		public static function createByServiceProtocol(IServiceDispatcher $manager, $protocol, $options=null) {
+			$result = null;
+			switch($protocol) {
+				case TServiceProtocol::HTTP_PARAMS:
+				case TServiceProtocol::HTTP_PARAMS_GET:
+				case TServiceProtocol::HTTP_PARAMS_POST:
+					require_once( dirname(__FILE__) . '/THttpParamsDispatchRequestAdapter.php');
+					$result = new THttpParamsDispatchRequestAdapter();
+				break;
+				
+				case TServiceProtocol::NVP :
+				case TServiceProtocol::JSON:
+				case TServiceProtocol::SOAP:
+					throw new TDispatchAdapterException('protocol_not_supported', __CLASS__, $protocol);
+				break;
+				
+				case TServiceProtocol::NONE:
+					$result = new TDummyDispatchResponseAdapter();
+				break;
+				
+				case TServiceProtocol::UNKNOWN:
+				default:
+					throw new TDispatchAdapterException('protocol_unknown', __CLASS__, $protocol);
+				break;				
+				
+				default:
+					$result = new TDummyDispatchRequestAdapter();
+				break;
+			}
+			
+			$result -> setManager($manager);
+			$result -> setServiceProtocol($protocol);
+			$result -> setOptions($options);
+			return $result;
+		}
+		
+		/**
+		 * @return string
+		 */
+		public function getServiceUri() {
+			return $this -> _serviceUri;
+		}
+		
+		/**
+		 * @param string $value
+		 */
+		public function setServiceUri($value) {
+			$this -> _serviceUri = $value;
+		}
+		
+		/**
+		 * @return string
+		 */
+		public function getMethodName() {
+			return $this -> _methodName;
+		}
+		
+		/**
+		 * @param string $value
+		 */
+		public function setMethodName($value) {
+			$this -> _methodName= $value;
+		}
+		
+		/**
+		 * @param array $value
+		 */
+		public function setMethodParameters($value) {
+			$this -> _methodParameters = $value;
+		}
+		
+		/**
+		 * @return array
+		 */
+		public function getMethodParameters() {
+			return $this -> _methodParameters;
+		}
+	}
+	
+	
+	class TDummyDispatchRequestAdapter extends TDispatchRequestAdapter {
+		public function call() {
+			return null;
+		}
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchResponseAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchResponseAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TDispatchResponseAdapter.php	(revision 5261)
@@ -0,0 +1,170 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.1
+	 */
+
+	require_once( dirname(__FILE__) . '/IDispatchResponseAdapter.php');
+	require_once( dirname(__FILE__) . '/TDispatchAdapter.php');
+	
+	abstract class TDispatchResponseAdapter extends TDispatchAdapter implements IDispatchResponseAdapter {
+		/**
+		 * @var mixed
+		 */
+		private $_data = null;
+		
+		/**
+		 * @var ClassServiceReflection
+		 */
+		private $_reflection = null;
+		
+		/**
+		 * @param IServiceDispatcher $manager
+		 * @param string $protocol
+		 * @param mixed $options
+		 * @return IDispatchResponseAdapter
+		 * @see TServiceProtocol
+		 */		
+		public static function createByServiceProtocol(IServiceDispatcher $manager, $protocol, $options=null) {
+			$result = null;
+			switch($protocol) {
+				case TServiceProtocol::NVP:
+					require_once( dirname(__FILE__) . '/TNvpDispatchResponseAdapter.php');
+					$result = new TNvpDispatchResponseAdapter();
+				break;
+				
+				case TServiceProtocol::HTTP_PARAMS:
+				case TServiceProtocol::HTTP_PARAMS_GET:
+				case TServiceProtocol::HTTP_PARAMS_POST:
+				case TServiceProtocol::JSON:
+				case TServiceProtocol::SOAP:
+					throw new TDispatchAdapterException('protocol_not_supported', __CLASS__, $protocol);
+				break;
+				
+				case TServiceProtocol::NONE:
+					$result = new TDummyDispatchResponseAdapter();
+				break;
+				
+				case TServiceProtocol::UNKNOWN:
+				default:
+					throw new TDispatchAdapterException('protocol_unknown', __CLASS__, $protocol);
+				break;
+			}
+			
+			$result -> setManager($manager);
+			$result -> setServiceProtocol($protocol);
+			$result -> setOptions($options);
+			return $result;
+		}
+		
+		/**
+		 * @return mixed $value
+		 */
+		public function getData() {
+			return $this -> _data;
+		}
+		
+		/**
+		 * @param mixed $value
+		 */
+		protected function setData($value) {
+			$this -> _data = $value;
+		}
+		
+		
+		/**
+		 * @return MethodServiceReflection
+		 */
+		public function getReflection() {
+			return $this -> _reflection;
+		}
+		
+		/**
+		 * @param MethodServiceReflection $value
+		 */
+		protected function setReflection(MethodServiceReflection $value) {
+			$this -> _reflection = $value;
+		}
+		
+		/**
+		 * @param mixed $data
+		 * @param MethodServiceReflection $interfaceNotificationReflection
+		 * @return mixed
+		 */
+		public function unserialize($data, MethodServiceReflection $interfaceNotificationReflection) {
+			$this -> setData($data);
+			$this -> setReflection($interfaceNotificationReflection);
+			return $this -> formatDataWithReflection( $this -> unserializeData() );
+		}
+		
+		/**
+		 * @param mixed $data
+		 */
+		protected function formatDataWithReflection($data) {
+			if( is_scalar($data)) return $data;
+			$result = array();
+			$reflection = $this -> getReflection() -> getReturn();
+			$aResultReflection = $reflection -> getResults();
+			
+			if(count($aResultReflection) == 0) return $data;
+			
+			foreach($aResultReflection as $resultReflection) {
+				$name = $resultReflection -> getName();
+				$result[$name] = $value = null;
+				
+				$required = true;
+				$hasValue = false;
+				do {
+					if( !$resultReflection instanceof ParameterServiceReflection ) break;
+					$required = $resultReflection -> getRequired();
+					if( !$resultReflection -> getHasDefault() ) break;
+					$value = $resultReflection -> getDefault();
+					$hasValue = true;
+				} while(0);
+				
+				if( array_key_exists($name, $data) ) {
+					$value = $data[$name];
+					
+					$hasValue = true;
+					
+					switch($value) {
+						case 'null': 
+							$value = null;
+						break;
+						case 'true':
+							$value = true;
+						break;
+						case 'false':
+							$value = false;
+						break;
+					}
+				}
+					
+				
+				if( !$hasValue AND $required)
+					throw new TDispatchAdapterException('servicemethod_result_missing', $this -> getReflection() -> getName(), $name);
+				
+				$result[$name] = $value;
+			}
+			
+			return $result;
+		}
+
+		/**
+		 * @return mixed
+		 */
+		abstract protected function unserializeData();
+		
+	}
+	
+	
+	class TDummyDispatchResponseAdapter extends TDispatchResponseAdapter {
+		protected function unserializeData() {
+			return $this -> getData();
+		}
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/THttpParamsDispatchRequestAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/THttpParamsDispatchRequestAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/THttpParamsDispatchRequestAdapter.php	(revision 5261)
@@ -0,0 +1,120 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/TDispatchRequestAdapter.php');
+	require_once( MCP__SERVICELIB_CLIENTS . 'TSimpleHttpClient.php');
+	
+	
+	class THttpParamsDispatchRequestAdapterHttpException extends THttpException {
+		/**
+		 * @var TSimpleHttpResponse
+		 */
+		private $_response = null;
+		
+		public function __construct($statusCode, $errorCode, $reponse=null) {
+			$this -> setStatusCode($statusCode);
+			$this -> _response = $reponse;
+			
+			$this -> setErrorCode($errorCode);
+			$errorMessage = $this -> translateErrorMessage($errorCode);
+
+			$args = func_get_args();
+			array_shift($args);
+			array_shift($args);
+			array_shift($args);
+			$this -> setErrorMessage( $this -> replaceMessageToken($errorMessage, $args)  );
+		}
+		
+		/**
+		 * @return TSimpleHttpResponse
+		 */
+		public function getResponse() {
+			return $this -> _response;
+		}
+	}
+	
+	class THttpParamsDispatchRequestAdapter extends TDispatchRequestAdapter {
+		
+		/**
+		 * 
+		 * @return TSimpleHttpResponse
+		 * @throws SimpleHttpClientException
+		 * @throws THttpException
+		 */ 
+		public function call() {
+			$option = $this -> getOptions();
+			if(!is_array($option)) $option = array();
+			if(!isset($option['http-params-servicemethod']) OR $option['http-params-servicemethod'] == '') $option['http-params-servicemethod'] = 'action';
+			$servicemethodParamName = $option['http-params-servicemethod'];
+			
+			$result = '';
+			switch( $this -> getServiceProtocol() ) {
+				case TServiceProtocol::HTTP_PARAMS_GET:
+					$client = new TSimpleHttpClient(TSimpleHttpClient::GET, $this -> getServiceUri());
+				break;
+				
+				case TServiceProtocol::HTTP_PARAMS:
+				case TServiceProtocol::HTTP_PARAMS_POST:
+				default:
+					$client = new TSimpleHttpClient(TSimpleHttpClient::POST, $this -> getServiceUri());
+				break;
+			}
+			$client -> addHeader('User-Agent', 'MCP-SimpleHttpClient/1.0 API-ServiceDispatcher via HttpParamsDispatchRequestAdapter');
+			$client -> addHeader('Accept', 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,*/*;q=0.5');
+			$client -> addHeader('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7');
+			$client -> addHeader('X-MCP-API-RequestServiceProtocol', $this -> getServiceProtocol());
+			$client -> addHeader('X-MCP-API-ResponseServiceProtocol', $this -> getManager() -> getResponseProtocol());
+			
+			$methodParameters = http_build_query($this -> getMethodParameters(), null, '&');
+			parse_str($methodParameters, $methodParameters);			
+			
+			$aData = array();
+			
+			if( !$client -> isPost() ) $aData = $client -> getQuery(true);
+			
+			$aData = array_merge($aData, $methodParameters);
+			$aData[$servicemethodParamName] = $this -> getMethodName();
+					
+			if( $client -> isPost() ) {
+				$client -> addHeader('Content-type', 'application/x-www-form-urlencoded');
+				$client -> setBody( http_build_query($aData, null, '&') );
+			}
+			else {
+				$client -> setQuery($aData);
+			}
+			
+			$result = $client -> request();
+			
+			switch( $result -> getStatusCode() ) {
+				case 200: // OK
+				break;
+				
+				case 301: // Moved permanently
+				case 302: // Found
+				case 303: // See other
+				case 305: // Use proxy
+				case 307: // Moved temporarily
+					// ::ToDo::
+					// ggf. Location Header auswerten
+					// und Request umschreiben
+				
+				case 304: // Not modified
+				
+				default:
+					throw new THttpParamsDispatchRequestAdapterHttpException($result -> getStatusCode(), $result -> getStatusMessage(), $result);
+				break;
+			}
+			
+			return $result;
+		}
+	}
+	
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TNvpDispatchResponseAdapter.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TNvpDispatchResponseAdapter.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/dispatcher/adapter/TNvpDispatchResponseAdapter.php	(revision 5261)
@@ -0,0 +1,80 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage ServiceDispatchAdapter
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/TDispatchResponseAdapter.php');
+	require_once( MCP__SERVICELIB_CLIENTS . 'TSimpleHttpClient.php');
+	require_once( MCP__SERVICELIB_SERIALIZER . 'TNvpSerializer.php');
+	
+	class TNvpDispatchResponseAdapter extends TDispatchResponseAdapter {
+		
+		protected function unserializeData() {
+			$data = $this -> getData();
+			$result = null;
+			
+			$dataType = gettype($data);
+			switch($dataType) {
+				case 'object':
+					$dataType = get_class($data);
+				
+				case 'TSimpleHttpResponse':
+					$format = $this -> getServiceProtocol();
+					if( $data -> isHeader('X-MCP-API-ResonseServiceProtocol') )
+						$format = $data -> getHeader('X-MCP-API-ResonseServiceProtocol');
+						
+					if( !in_array($format, array($this -> getServiceProtocol(), TServiceProtocol::NONE, TServiceProtocol::UNKNOWN )) )
+						throw new TDispatchAdapterException('adapter_protocol_not_supported', __CLASS__, $format);
+
+					$result =  TNvpSerializer::unserialize( $data -> getBody() );
+				break;
+				
+				case 'boolean':
+				case 'integer':
+				case 'boolean':
+				case 'array':
+				case 'null':
+				case 'NULL':
+					$result =  TNvpSerializer::unserialize( TNvpSerializer::serialize($data) );
+				break;
+				
+				case 'string':
+					$result =  TNvpSerializer::unserialize($data);
+				break;
+
+				case 'resource':
+				case 'unknown type':
+				default:
+					throw new TDispatchAdapterException('adapter_datatype_not_supported', $dataType);
+				break;
+			}
+			
+			do {
+				if( !isset($result['error']) ) break;
+				if($result['error'] == 0) break;
+				
+				$code	= $result['error'];
+				$msg	= isset($result['errorMessage']) ? stripSlashes($result['errorMessage']) :  '';
+				throw new Exception($msg, $code);
+				
+			} while(0);
+			
+			do {
+				if( !isset($result['result']) ) break;
+				if( count($result) > 2) break;
+				$result = $result['result'];
+			} while(0);
+			
+			
+			return $result;
+		}
+		
+	}
+
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/init.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/init.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/init.php	(revision 5261)
@@ -0,0 +1,23 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @version 1.0
+	 */
+
+	if(!defined('MCP__SERVICELIB')) define('MCP__SERVICELIB', dirname(__FILE__) . '/');
+	
+	if(!defined('MCP__SERVICELIB_COMMON')) define('MCP__SERVICELIB_COMMON', MCP__SERVICELIB . 'common/');
+
+	if(!defined('MCP__SERVICELIB_CLIENTS')) define('MCP__SERVICELIB_CLIENTS', MCP__SERVICELIB . 'clients/');
+
+	if(!defined('MCP__SERVICELIB_SERIALIZER')) define('MCP__SERVICELIB_SERIALIZER', MCP__SERVICELIB . 'serializer/');
+	
+	if(!defined('MCP__SERVICELIB_DISPATCHER')) define('MCP__SERVICELIB_DISPATCHER', MCP__SERVICELIB . 'dispatcher/');
+	
+	require_once(MCP__SERVICELIB_COMMON . 'TException.php');
+	require_once(MCP__SERVICELIB_COMMON . 'TServiceProtocol.php');
+	require_once(MCP__SERVICELIB_COMMON . 'ServiceReflection.php');
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/ISerializer.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/ISerializer.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/ISerializer.php	(revision 5261)
@@ -0,0 +1,28 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Serializer
+	 * @version 1.0
+	 */	
+	
+	interface ISerializer {
+
+		/**
+		 * @param mixed $data
+		 * @param mixed $options
+		 * @return string
+		 */
+		public static function serialize($data, $options=null);
+		
+		
+		/**
+		 * @param string $data
+		 * @param mixed $options
+		 * @return mixed
+		 */
+		public static function unserialize($data, $options=null);
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/TBaseSerializer.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/TBaseSerializer.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/TBaseSerializer.php	(revision 5261)
@@ -0,0 +1,29 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Serializer
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/ISerializer.php');
+
+	abstract class TBaseSerializer implements ISerializer {
+	
+		protected static function isArrayMap(&$data) {
+			$result = false;
+			
+			if( is_array($data) ) {
+				foreach($data as $k => $v) {
+					if( !is_numeric($k)) {
+						$result = true;
+						break;
+					}
+				}
+			}
+			return $result;
+		}	
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/TNvpSerializer.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/TNvpSerializer.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/lib/serializer/TNvpSerializer.php	(revision 5261)
@@ -0,0 +1,142 @@
+<?php
+	/**
+	 * @copyright 2008 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz
+	 * @package MCP-Service-Client
+	 * @subpackage Serializer
+	 * @version 1.0
+	 */
+
+	require_once( dirname(__FILE__) . '/TBaseSerializer.php');
+
+	class TNvpSerializer extends TBaseSerializer {
+		
+		/**
+		 * @param mixed $data
+		 * @param mixed $options
+		 * @return string
+		 */
+		public static function serialize($data, $options=null) {
+			if(!is_array($options)) $options = array();
+			if( !isset($options['prefix']) ) $options['prefix'] = 'result';
+			
+			$result = '';
+
+			if( $data === null OR is_scalar($data)) {
+				$result .= self::serializeNVP($options['prefix'], ($data === null ? 'null' : $data));
+			}
+			elseif( is_array($data) ) {
+				if( self::isArrayMap($data) ) $result .= self::serializeRecursive($data);
+				else $result .= self::serializeRecursive($data, $options['prefix']);
+			} 
+			else {
+				$result .= self::serializeRecursive($data);	
+			}		
+		
+			return $result;
+		}
+		
+		
+		/**
+		 * @param string $data
+		 * @param mixed $options
+		 * @return mixed
+		 * @todo object format
+		 */
+		public static function unserialize($data, $options=null) {
+			$result = array();
+			$data = str_replace("\n", '&', $data);
+			parse_str($data, $result);
+			return $result;			
+		}
+		
+		protected static function encodeValue($value) {
+			return urlEncode($value);
+		}
+		
+		protected static function decodeValue($value) {
+			return urlDecode($value);
+		}
+		
+		protected static function serializeNVP($name, $value, $prefix='') {
+			return $prefix . $name . '=' . self::encodeValue($value) . "\n";
+		}
+		
+		/**
+		 * @param string $key
+		 * @param mixed $value
+		 * @param array $result
+		 * @todo 
+		 */
+		protected static function unserializeRecursive($key, $value, &$result) {
+		}
+		
+		
+		protected static function serializeRecursive($data, $prefix='', $deep=-1) {
+			$deep++;
+			
+			$result = '';
+			if( is_scalar($data) )  {
+				$result .= self::serializeNVP($defkey, $data, $prefix);
+			}
+			elseif( is_array($data) AND self::isArrayMap($data)) {
+				//if($deep > 0) $result .= self::serializeNVP('@indices', implode(',', array_keys($data)), '#' . $prefix);
+				
+				foreach($data as $key => $value) {
+					$idx = ($deep > 0 ? '[' . $key . ']' : $key);
+					
+					if(is_scalar($value)) {
+						$result .= self::serializeNVP($idx, $value, $prefix);	
+					}
+					else {
+						$result .= self::serializeRecursive($value, $prefix . $idx, $deep);
+					}
+				}
+				
+			}
+			elseif( is_array($data) ) {
+				$cnt = count($data);
+				//$result .= self::serializeNVP('@count', $cnt, '#' . $prefix);
+				
+				for($i=0; $i<$cnt; $i++) {
+					$idx = '[' . $i . ']';
+					
+					if(is_scalar($data[$i])) {
+						$result .= self::serializeNVP($idx, $data[$i], $prefix);	
+					}
+					else {
+						$result .= self::serializeRecursive($data[$i], $prefix . $idx, $deep);
+					}
+				}
+			}
+			elseif( is_object($data)) {
+				if($deep > 0) {
+					$reflectionObject = new ReflectionObject($data);
+					$reflectionProperties = $reflectionObject -> getProperties();
+					$properties = array();
+					foreach($reflectionProperties as $property) {
+						if( !$property -> isPublic() ) continue;
+						$properties[] = $property -> getName();
+					}
+					
+					//$result .= self::serializeNVP('@properties', implode(',', $properties), '#' . $prefix);
+				}
+				
+				foreach($data as $key => $value) {
+					$idx = ($deep > 0 ? '.' . $key : $key);
+					
+					if(is_scalar($value)) {
+						$result .= self::serializeNVP($idx, $value, $prefix);
+					}
+					else {
+						$result .= self::serializeRecursive($value, $prefix . $idx, $deep);
+					}
+				}
+			}
+
+			return $result;
+		}		
+		
+	}
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_0.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_0.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_0.php	(revision 5261)
@@ -0,0 +1,347 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus (Verfügbar erst ab Version 1.1):
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.0
+	 * @created 2011-10-11 21:38:00
+	 */
+	interface IMcpCreditcardService_v1_0 {
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type Kartentyp
+		 * @result string $number partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear Gültigkeits Jahr
+		 * @result integer $expiryMonth Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amount abgerechneter Betrag
+		 * @result string $currency Währungseinheit
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType Kartentyp
+		 * @result string $cardNumber partielle Kreditkartennummer (letzten 4 Stellen)
+		 * @result integer $cardExpiryYear Gültigkeits Jahr
+		 * @result integer $cardExpiryMonth Gültigkeits Monat
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_1.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_1.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_1.php	(revision 5261)
@@ -0,0 +1,399 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.1
+	 * @created 2011-10-11 21:38:09
+	 */
+	interface IMcpCreditcardService_v1_1 {
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type Kartentyp
+		 * @result string $number partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear Gültigkeits Jahr
+		 * @result integer $expiryMonth Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amount abgerechneter Betrag
+		 * @result string $currency Währungseinheit
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType Kartentyp
+		 * @result string $cardNumber partielle Kreditkartennummer (letzten 4 Stellen)
+		 * @result integer $cardExpiryYear Gültigkeits Jahr
+		 * @result integer $cardExpiryMonth Gültigkeits Monat
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_1_1.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_1_1.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_1_1.php	(revision 5261)
@@ -0,0 +1,418 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.1.1
+	 * @created 2011-10-11 21:38:48
+	 */
+	interface IMcpCreditcardService_v1_1_1 {
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type Kartentyp
+		 * @result string $number partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear Gültigkeits Jahr
+		 * @result integer $expiryMonth Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amount abgerechneter Betrag
+		 * @result string $currency Währungseinheit
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType Kartentyp
+		 * @result string $cardNumber partielle Kreditkartennummer (letzten 4 Stellen)
+		 * @result integer $cardExpiryYear Gültigkeits Jahr
+		 * @result integer $cardExpiryMonth Gültigkeits Monat
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2.php	(revision 5261)
@@ -0,0 +1,449 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.2
+	 * @created 2011-10-11 21:39:07
+	 */
+	interface IMcpCreditcardService_v1_2 {
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType Kartentyp
+		 * @result string $cardNumber partielle Kreditkartennummer (letzten 4 Stellen)
+		 * @result integer $cardExpiryYear Gültigkeits Jahr
+		 * @result integer $cardExpiryMonth Gültigkeits Monat
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type Kartentyp
+		 * @result string $number partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear Gültigkeits Jahr
+		 * @result integer $expiryMonth Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2_1.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2_1.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2_1.php	(revision 5261)
@@ -0,0 +1,461 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.2.1
+	 * @created 2011-10-11 21:39:21
+	 */
+	interface IMcpCreditcardService_v1_2_1 {
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType Kartentyp
+		 * @result string $cardNumber partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $cardExpiryYear Gültigkeits Jahr
+		 * @result integer $cardExpiryMonth Gültigkeits Monat
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null);
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type Kartentyp
+		 * @result string $number partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear Gültigkeits Jahr
+		 * @result integer $expiryMonth Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_3.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_3.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_3.php	(revision 5261)
@@ -0,0 +1,489 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.3
+	 * @created 2011-10-11 21:39:45
+	 */
+	interface IMcpCreditcardService_v1_3 {
+
+		/**
+		 * Zuordnung einer `dataStorageId` von einem Bestandskunden Ihres Systems zu einem Kunden (customerId) bei micropayment
+		 * 
+		 *  Wichtig:
+		 *  Diese Funktion ist nur bei einem Wechsel von einem anderen DataStorage-Anbieter relevant und setzt den
+		 *  Import der zugehörigen Kreditkartendaten vorraus separat beantragt und durchgeführt werden muss,
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $dataStorageId Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * 
+		 * @return boolean 
+		 */
+		public function dataStorageIdImport($accessKey, $testMode=0, $customerId, $dataStorageId);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type (default=null)  Kartentyp
+		 * @result string $number (default=null)  partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear (default=null)  Gültigkeits Jahr
+		 * @result integer $expiryMonth (default=null) 	Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType (default=null)  Kartentyp, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $cardNumber (default=null)  partielle Kreditkartennummer [letzten 4 Stellen], kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryYear (default=null)  Gültigkeits Jahr, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryMonth (default=null) 	Gültigkeits Monat, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  null - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null, $fraudDetection=1);
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4.php	(revision 5261)
@@ -0,0 +1,533 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.4
+	 * @created 2011-10-11 21:40:02
+	 */
+	interface IMcpCreditcardService_v1_4 {
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType (default=null)  Kartentyp, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $cardNumber (default=null)  partielle Kreditkartennummer [letzten 4 Stellen], kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryYear (default=null)  Gültigkeits Jahr, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryMonth (default=null) 	Gültigkeits Monat, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer nicht transaktionsbezogenen Gutschrift.
+		 * 
+		 *  Dies ermöglicht es Ihnen beliebige Beträge auf das Kreditkartenkonto einen Kunden zu übertragen.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 * 
+		 *  HINWEIS:
+		 *  Diese Funktionalität bedarf manueller Freischaltung, und wird vom buchbaren Volumen beschränkt
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCredit($accessKey, $testMode=0, $sessionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Zuordnung einer `dataStorageId` von einem Bestandskunden Ihres Systems zu einem Kunden (customerId) bei micropayment
+		 * 
+		 *  Wichtig:
+		 *  Diese Funktion ist nur bei einem Wechsel von einem anderen DataStorage-Anbieter relevant und setzt den
+		 *  Import der zugehörigen Kreditkartendaten vorraus separat beantragt und durchgeführt werden muss,
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $dataStorageId Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * 
+		 * @return boolean 
+		 */
+		public function dataStorageIdImport($accessKey, $testMode=0, $customerId, $dataStorageId);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type (default=null)  Kartentyp
+		 * @result string $number (default=null)  partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear (default=null)  Gültigkeits Jahr
+		 * @result integer $expiryMonth (default=null) 	Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId, $fraudDetection=1);
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4_1.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4_1.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4_1.php	(revision 5261)
@@ -0,0 +1,573 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.4.1
+	 * @created 2011-10-11 21:40:15
+	 */
+	interface IMcpCreditcardService_v1_4_1 {
+
+		/**
+		 * Errechnet ein Scoring für einen zuvor angelegten Kunden, den zugehörigen Kreditkartendaten sowie der IP-Adresse und ggf. Http-Request-Headern des Kunden.
+		 *  Daher ist es für die Verwendung sinnvoll möglichst alle Daten zu erfassen um die Genauigkeit des Scorings zu erhöhen.
+		 * 
+		 *  Begrifflichkeiten:
+		 *   E-Mail           E-Mail-Adressen aus Kundendaten
+		 *   BillingCountry   Land des Kunden aus Adressendaten des Kunden [billCountry]
+		 *   BillingLocation  Standort des Kunden aus Adressendaten des Kunden
+		 *   BinCountry       Land der Kreditkartenbank (BIN-Code) [ccCountry]
+		 *   IPCountry        Land durch IP ermittelt [ipCountry]
+		 *   IPLocation       Standort ermittelt durch IP
+		 * 
+		 *  Wichtung  Wert
+		 *     2.5    E-Mail (Anbieter von Temporären E-Mail-Adressen / Freemail Provider > höheres Risiko)
+		 *     2.5    IPCountry != BillingCountry
+		 *     2.0    BillingCountry != BinCountry
+		 *     5.0    customerIp ist Anonymous-Proxy
+		 *     2.5    customerIp ist bekannter Proxy
+		 *    10.0    Entfernung IPLocation zu BillingLocation (höhere Entfernung = höheres Risiko)
+		 *     5.0    E-Mail steht auf Badlist (Hockrisiko)
+		 *     5.0    BillingLocation ist bekannter Maildrop (Postfach etc.)
+		 *     5.0    IPCountry oder BillingCountry sind Hochrisikoländer - z.Z. sind das:
+		 *              Egypt, Ghana, Indonesia, Lebanon, Macedonia, Morocco, Nigeria,
+		 *              Pakistan, Romania, Serbia and Montenegro, Ukraine, Vietnam
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param string $customerIp IPv4 des Benutzers
+		 * @param map $customerRequestHeader (default=null)  Liste mit Http-Request-Headern des Kunden - ausgewertet werden: User-Agent, Accept-Language sowie die Proxy-Header X-Forwarded-For/Client-Ip
+		 * 
+		 * @return struct 
+		 * @result string $billCountry (default=null)  Land [ISO 3166-1-alpha-2] aus den Adressdaten des Kundensatzes bspw. DE, AT, CH
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result float $scoreValue (default=null)  Bewertung mit Werten zwischen 0 und 100, wobei 0 für geringes und 100 für hohes Risiko steht
+		 * @result string $scoreExplanation (default=null)  Erläuterung zu der Bewertung in Textform [Englisch]
+		 */
+		public function customerScoring($accessKey, $testMode=0, $customerId, $customerIp, $customerRequestHeader=null);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType (default=null)  Kartentyp, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $cardNumber (default=null)  partielle Kreditkartennummer [letzten 4 Stellen], kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryYear (default=null)  Gültigkeits Jahr, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryMonth (default=null) 	Gültigkeits Monat, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer nicht transaktionsbezogenen Gutschrift.
+		 * 
+		 *  Dies ermöglicht es Ihnen beliebige Beträge auf das Kreditkartenkonto einen Kunden zu übertragen.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 * 
+		 *  HINWEIS:
+		 *  Diese Funktionalität bedarf manueller Freischaltung, und wird vom buchbaren Volumen beschränkt
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCredit($accessKey, $testMode=0, $sessionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Zuordnung einer `dataStorageId` von einem Bestandskunden Ihres Systems zu einem Kunden (customerId) bei micropayment
+		 * 
+		 *  Wichtig:
+		 *  Diese Funktion ist nur bei einem Wechsel von einem anderen DataStorage-Anbieter relevant und setzt den
+		 *  Import der zugehörigen Kreditkartendaten vorraus separat beantragt und durchgeführt werden muss,
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $dataStorageId Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * 
+		 * @return boolean 
+		 */
+		public function dataStorageIdImport($accessKey, $testMode=0, $customerId, $dataStorageId);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type (default=null)  Kartentyp
+		 * @result string $number (default=null)  partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear (default=null)  Gültigkeits Jahr
+		 * @result integer $expiryMonth (default=null) 	Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId, $fraudDetection=1);
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4_2.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4_2.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_4_2.php	(revision 5261)
@@ -0,0 +1,575 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.4.2
+	 * @created 2011-10-11 21:40:22
+	 */
+	interface IMcpCreditcardService_v1_4_2 {
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *  - SessionStatus (status)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param SessionStatus $status (default=null)  Nur Sessions mit dem gewünschten Status in das Ergebnisliste aufnehmen oder [NULL] um Statusfilter zu deaktivieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null, $status=null);
+
+		/**
+		 * Errechnet ein Scoring für einen zuvor angelegten Kunden, den zugehörigen Kreditkartendaten sowie der IP-Adresse und ggf. Http-Request-Headern des Kunden.
+		 *  Daher ist es für die Verwendung sinnvoll möglichst alle Daten zu erfassen um die Genauigkeit des Scorings zu erhöhen.
+		 * 
+		 *  Begrifflichkeiten:
+		 *   E-Mail           E-Mail-Adressen aus Kundendaten
+		 *   BillingCountry   Land des Kunden aus Adressendaten des Kunden [billCountry]
+		 *   BillingLocation  Standort des Kunden aus Adressendaten des Kunden
+		 *   BinCountry       Land der Kreditkartenbank (BIN-Code) [ccCountry]
+		 *   IPCountry        Land durch IP ermittelt [ipCountry]
+		 *   IPLocation       Standort ermittelt durch IP
+		 * 
+		 *  Wichtung  Wert
+		 *     2.5    E-Mail (Anbieter von Temporären E-Mail-Adressen / Freemail Provider > höheres Risiko)
+		 *     2.5    IPCountry != BillingCountry
+		 *     2.0    BillingCountry != BinCountry
+		 *     5.0    customerIp ist Anonymous-Proxy
+		 *     2.5    customerIp ist bekannter Proxy
+		 *    10.0    Entfernung IPLocation zu BillingLocation (höhere Entfernung = höheres Risiko)
+		 *     5.0    E-Mail steht auf Badlist (Hockrisiko)
+		 *     5.0    BillingLocation ist bekannter Maildrop (Postfach etc.)
+		 *     5.0    IPCountry oder BillingCountry sind Hochrisikoländer - z.Z. sind das:
+		 *              Egypt, Ghana, Indonesia, Lebanon, Macedonia, Morocco, Nigeria,
+		 *              Pakistan, Romania, Serbia and Montenegro, Ukraine, Vietnam
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param string $customerIp IPv4 des Benutzers
+		 * @param map $customerRequestHeader (default=null)  Liste mit Http-Request-Headern des Kunden - ausgewertet werden: User-Agent, Accept-Language sowie die Proxy-Header X-Forwarded-For/Client-Ip
+		 * 
+		 * @return struct 
+		 * @result string $billCountry (default=null)  Land [ISO 3166-1-alpha-2] aus den Adressdaten des Kundensatzes bspw. DE, AT, CH
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result float $scoreValue (default=null)  Bewertung mit Werten zwischen 0 und 100, wobei 0 für geringes und 100 für hohes Risiko steht
+		 * @result string $scoreExplanation (default=null)  Erläuterung zu der Bewertung in Textform [Englisch]
+		 */
+		public function customerScoring($accessKey, $testMode=0, $customerId, $customerIp, $customerRequestHeader=null);
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType (default=null)  Kartentyp, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $cardNumber (default=null)  partielle Kreditkartennummer [letzten 4 Stellen], kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryYear (default=null)  Gültigkeits Jahr, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryMonth (default=null) 	Gültigkeits Monat, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer nicht transaktionsbezogenen Gutschrift.
+		 * 
+		 *  Dies ermöglicht es Ihnen beliebige Beträge auf das Kreditkartenkonto einen Kunden zu übertragen.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 * 
+		 *  HINWEIS:
+		 *  Diese Funktionalität bedarf manueller Freischaltung, und wird vom buchbaren Volumen beschränkt
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCredit($accessKey, $testMode=0, $sessionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Zuordnung einer `dataStorageId` von einem Bestandskunden Ihres Systems zu einem Kunden (customerId) bei micropayment
+		 * 
+		 *  Wichtig:
+		 *  Diese Funktion ist nur bei einem Wechsel von einem anderen DataStorage-Anbieter relevant und setzt den
+		 *  Import der zugehörigen Kreditkartendaten vorraus separat beantragt und durchgeführt werden muss,
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $dataStorageId Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * 
+		 * @return boolean 
+		 */
+		public function dataStorageIdImport($accessKey, $testMode=0, $customerId, $dataStorageId);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type (default=null)  Kartentyp
+		 * @result string $number (default=null)  partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear (default=null)  Gültigkeits Jahr
+		 * @result integer $expiryMonth (default=null) 	Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId, $fraudDetection=1);
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_5.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_5.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_5.php	(revision 5261)
@@ -0,0 +1,616 @@
+<?php
+
+	/**
+	 * Dieser Service stellt eine Server2Server-Schnittstelle (API), zur Buchung von Transaktionen über die Zahlungsart Kreditkarte, zur Verfügung (Creditcard - API.Event).
+	 * 
+	 *   Vorraussetzungen:
+	 *  - Ein Account bei micropayment(tm) - Anmeldung unter www.micropayment.de
+	 *  - Die Freischaltung von Creditcard - API.Event durch unseren Händler-Support (support@micropayment.de)
+	 *  - Eine Vertrags-Unternehmennummer (VU-Nummer) die Sie im ControlCenter beantragen können
+	 * 
+	 *  Konfiguration:
+	 *  Nach der Freischaltung von Creditcard - API.Event durch unseren Support loggen Sie sich in das ControlCenter Ihres Accounts ein und begeben sich zu dem Menüpunkt "Meine Konfiguration":
+	 *  - hier finden Sie im unteren Bereich den `AccessKey` den Sie für die Verwendung des API benötigen
+	 *  - im Untermenüpunkt "APIs" konfigurien und aktivieren Sie Creditcard - API.Event
+	 *  - im Untermenüpunkt "Zugriffsberechtigungen" konfigurieren Sie bitte die IP-Adresse/IP-Range der Server, von dem aus Sie auf das API zugreifen möchten
+	 * 
+	 *  Hinweis zu Hoch-Traffic-Anwendungen:
+	 *  Grundsätzlich kann ein Kreditkartenterminal immer nur eine Buchung zur selben Zeit ausführen.
+	 *  Bei normalem Traffic fängt eine Warteschlange gleichzeitige Anfragen auf.
+	 *  Wenn aber parallele Transaktionen erforderlich sind (z.B. bei Trafficspitzen), können Sie zur Lastverteilung bei unserem Support zusätzliche Terminals ordern.
+	 * 
+	 *  Hinweise zum TestModus:
+	 *  - Aktivierung der Testumgebung erfolgt in der jeweiligen Funktion über den Parameter `testMode`
+	 *  - für den TestModus stehen folgende Test-Kartennummern zur Verfügung:
+	 * 	- VISA: 4111111111111111
+	 * 	- MASTER: 5454545454545454
+	 * 	- AMEX: 343434343434343
+	 *  - um erfolgreiche Buchungen durchzuführen, ist als CVC2-Code die 666 zu verwenden, bei allen Anderen gilt die Transaktion als fehlgeschlagen
+	 *  - um einen spezifischen Terminal-Fehlercode auszulösen, ist als CVC2-Code die 555 zu verwenden:
+	 *    Der als Integerwert (bspw. 534) angefordertet Endkundenbetrag, liefert im Eurocent-Anteil (bspw. 34) den Fehlercode (`transactionResultCode`) zurück - z.B. 534 => ipg34.
+	 *  	 Bitte beachten Sie, dass das erwartete Ergebnis nur bei der Verwendung der Währung (`currency`) "EUR" erreicht wird.
+	 * 
+	 *  Übermittlung von Adressdaten:
+	 *  Sollten Ihnen die Adressdaten Ihrer Endkunden zur Verfügung stehen, empfehlen wir diese mittles "addressSet" im Kundendatensatz zu hinterlegen.
+	 *  Die im Kundendatensatz (customerCreate, customerSet) hinterlegten Adressdaten, werden zum Einen für das Adress-Verifikations-System (AVS, verfügbar ab Version 1.5) benötigt,
+	 *  zum Anderen werden diese Daten bei Chargeback-Anfragen (s.g. Beleganforderungen von Issuer und Acquirerer) verwendet.
+	 * 
+	 *  Fehlercodes:
+	 *  Eine Übersicht über die möglichen Fehlercodes des API als auch des Terminals finden Sie unter folgender Adresse:
+	 *  https://webservices.micropayment.de/public/creditcard/ERRORCODES/
+	 * 
+	 *  Updates/Changelog:
+	 *  Wenn Sie bisher eine ältere Version dieses APIs verwenden, könnten Sie sich im Changelog einen Überblick über die Neuerungen verschaffen:
+	 *  https://webservices.micropayment.de/public/creditcard/CHANGELOG/
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Yves Berkholz, Guido Franke
+	 * @version 1.5
+	 * @created 2011-10-11 21:40:30
+	 */
+	interface IMcpCreditcardService_v1_5 {
+
+		/**
+		 * Gibt Informationen über eine Transaktion anhand einer Transaktionsnummer zurück.
+		 * 
+		 *  Wenn sich `currencyInit` und `currencyBooked` unterscheiden, dann fehlt die native Unterstützung für die gewünschte Währung.
+		 *  In diesem Fall erfolgte eine Umrechnung in eine nativ unterstützte Währung.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer
+		 * 
+		 * @return struct 
+		 * @result string $transactionId Transaktionsnummer
+		 * @result string $sessionId eindeutige ID des Vorgangs
+		 * @result string $customerId ID des Kunden
+		 * @result string $auth AuthCode
+		 * @result integer $amountInit Betrag der abgerechnet werden sollte in currencyInit
+		 * @result string $currencyInit Währungseinheit mit der abgerechnet werden sollte
+		 * @result integer $amountBooked gebuchter Betrag in currencyBooked
+		 * @result string $currencyBooked Währungseinheit mit der gebucht wurde
+		 * @result integer $amountInternal abgerechneter Betrag in currencyInternal
+		 * @result string $currencyInternal (default='EUR')  Währungseinheit für interne Verbuchung
+		 * @result TransactionType $type Art der Transaktion
+		 * @result TransactionStatus $status Status der Transaktion
+		 * @result datetime $created Zeitpunkt der Transaktion
+		 * @result string $ip IPv4 des Benutzers
+		 * @result string $cardType (default=null)  Kartentyp, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $cardNumber (default=null)  partielle Kreditkartennummer [letzten 4 Stellen], kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryYear (default=null)  Gültigkeits Jahr, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result integer $cardExpiryMonth (default=null) 	Gültigkeits Monat, kann bei aktiviertem DataStorage-Feature null sein
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 * @result AVSResult $avsResult (default=null)  Wenn ein AVS-Check durchgeführt wurde dessen Ergebnis
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+		/**
+		 * Führt eine Transaktion zur sofortigen Buchung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * @param integer $avsCheck (default=0)  de/aktiviert das AddressVerificationSystem
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 * @result AVSResult $avsResult (default=null)  wenn ein AVS-Check angefordert wurde dessen Ergebnis
+		 */
+		public function transactionPurchase($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1, $avsCheck=0);
+
+		/**
+		 * Führt eine Transaktion zur Vorautorisierung, des durch `sessionCreate` definierten Betrages, durch.
+		 * 
+		 *  Der gewünschten Betrag wird für Sie reserviert bis:
+		 *  - Sie den Betrag mittels `transactionReversal` wieder freigeben
+		 *  - Sie den Gesamt- oder Teilbetrag mit `transactionCapture` buchen
+		 *  - die Reservierung nach ca. 14 Tagen automatisch wieder freigegeben wird
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $cvc2 (default=null)  CVC2-Code der Kreditkarte, muß min einmal pro Kreditkarte/Verfallszeit angegeben worden sein
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * @param integer $avsCheck (default=0)  de/aktiviert das AddressVerificationSystem
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 * @result AVSResult $avsResult (default=null)  wenn ein AVS-Check angefordert wurde dessen Ergebnis
+		 */
+		public function transactionAuthorization($accessKey, $testMode=0, $sessionId, $cvc2=null, $fraudDetection=1, $avsCheck=0);
+
+		/**
+		 * Versendet eine Benachrichtigung über eine transaktionsbezogene Gutschrift
+		 *  an die im ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionBackpayNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Versendet eine Benachrichtigung über einen Refund
+		 *  an die im ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer REFUND-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionRefundNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Versendet eine Benachrichtigung über eine NICHT transaktionsbezogene Gutschrift
+		 *  an die im ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer CREDIT-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionCreditNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Gibt eine Liste von Bezahlvorgängen anhand von Parametern zurück
+		 * 
+		 *  Folgende frei kombinierbare Parameter stehen zur Verfügung:
+		 *  - Kunde (customerId)
+		 *  - Zeitraum von/bis (dtmFrom/dtmTo)
+		 *  - SessionStatus (status)
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eindeutige ID des Kunden oder [NULL] ohne Kundeneinschränkung
+		 * @param datetime $dtmFrom (default=null)  Anfang der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param datetime $dtmTo (default=null)  Ende der Zeitraumbegrenzung oder [NULL] um diese Zeitraumbegrenzung nicht zu definieren
+		 * @param SessionStatus $status (default=null)  Nur Sessions mit dem gewünschten Status in das Ergebnisliste aufnehmen oder [NULL] um Statusfilter zu deaktivieren
+		 * 
+		 * @return string[] 
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId=null, $dtmFrom=null, $dtmTo=null, $status=null);
+
+		/**
+		 * Errechnet ein Scoring für einen zuvor angelegten Kunden, den zugehörigen Kreditkartendaten sowie der IP-Adresse und ggf. Http-Request-Headern des Kunden.
+		 *  Daher ist es für die Verwendung sinnvoll möglichst alle Daten zu erfassen um die Genauigkeit des Scorings zu erhöhen.
+		 * 
+		 *  Begrifflichkeiten:
+		 *   E-Mail           E-Mail-Adressen aus Kundendaten
+		 *   BillingCountry   Land des Kunden aus Adressendaten des Kunden [billCountry]
+		 *   BillingLocation  Standort des Kunden aus Adressendaten des Kunden
+		 *   BinCountry       Land der Kreditkartenbank (BIN-Code) [ccCountry]
+		 *   IPCountry        Land durch IP ermittelt [ipCountry]
+		 *   IPLocation       Standort ermittelt durch IP
+		 * 
+		 *  Wichtung  Wert
+		 *     2.5    E-Mail (Anbieter von Temporären E-Mail-Adressen / Freemail Provider > höheres Risiko)
+		 *     2.5    IPCountry != BillingCountry
+		 *     2.0    BillingCountry != BinCountry
+		 *     5.0    customerIp ist Anonymous-Proxy
+		 *     2.5    customerIp ist bekannter Proxy
+		 *    10.0    Entfernung IPLocation zu BillingLocation (höhere Entfernung = höheres Risiko)
+		 *     5.0    E-Mail steht auf Badlist (Hockrisiko)
+		 *     5.0    BillingLocation ist bekannter Maildrop (Postfach etc.)
+		 *     5.0    IPCountry oder BillingCountry sind Hochrisikoländer - z.Z. sind das:
+		 *              Egypt, Ghana, Indonesia, Lebanon, Macedonia, Morocco, Nigeria,
+		 *              Pakistan, Romania, Serbia and Montenegro, Ukraine, Vietnam
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param string $customerIp IPv4 des Benutzers
+		 * @param map $customerRequestHeader (default=null)  Liste mit Http-Request-Headern des Kunden - ausgewertet werden: User-Agent, Accept-Language sowie die Proxy-Header X-Forwarded-For/Client-Ip
+		 * 
+		 * @return struct 
+		 * @result string $billCountry (default=null)  Land [ISO 3166-1-alpha-2] aus den Adressdaten des Kundensatzes bspw. DE, AT, CH
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result float $scoreValue (default=null)  Bewertung mit Werten zwischen 0 und 100, wobei 0 für geringes und 100 für hohes Risiko steht
+		 * @result string $scoreExplanation (default=null)  Erläuterung zu der Bewertung in Textform [Englisch]
+		 */
+		public function customerScoring($accessKey, $testMode=0, $customerId, $customerIp, $customerRequestHeader=null);
+
+		/**
+		 * Führt eine Transaktion zur Buchung (Gesamt- oder Teilbetrag) einer Vorautorisierung durch.
+		 * 
+		 *  Sie buchen den reservierte Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung, erstellt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId (default=null)  Transaktionsnummer von "transactionAuthorization"
+		 * @param integer $amount (default=null)  [NULL] - entspricht Betrag aus Vorautorisierung | wenn abweichend, der zu buchende Betrag <= Betrag aus Vorautorisierung
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCapture($accessKey, $testMode=0, $sessionId, $transactionId=null, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer Gesamt- oder Teilrückzahlung einer den Kunden belastende Buchung.
+		 * 
+		 *  Sie erstatten den gebuchten Betrag:
+		 *  - In voller Höhe (Gesamtbetrag) - der Parameter `amount` entfällt ([NULL])
+		 *  - Oder nur einen Teilbetrag - der Parameter `amount` enthält den gewünschten Teilbetrag
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionPurchase` oder `transactionCapture` eine den Kunden belastende Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionRefund($accessKey, $testMode=0, $sessionId, $transactionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Transaktion zur Buchung einer nicht transaktionsbezogenen Gutschrift.
+		 * 
+		 *  Dies ermöglicht es Ihnen beliebige Beträge auf das Kreditkartenkonto einen Kunden zu übertragen.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt haben,
+		 *  sowie dem Kunden, unter Zuhilfenahme von `creditcardDataSet`, Kreditkartendaten zugewiesen haben.
+		 * 
+		 *  HINWEIS:
+		 *  Diese Funktionalität bedarf manueller Freischaltung, und wird vom buchbaren Volumen beschränkt
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param integer $amount (default=null)  zurückzubuchender Betrag, falls abweichend von Orginaltransaktion
+		 * @param string $currency (default=null)  Währung, falls abweichend von Originaltransaktion [nur relevant wenn `amount` abweichend]
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $ccCountry (default=null)  Land [ISO 3166-1-alpha-2] der Kreditkarte wenn verfügbar, bspw. DE, AT, CH
+		 * @result string $ipCountry (default=null)  Land [ISO 3166-1-alpha-2] der IP wenn verfügbar, bspw. GB, US
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionCredit($accessKey, $testMode=0, $sessionId, $amount=null, $currency=null, $fraudDetection=1);
+
+		/**
+		 * Zuordnung einer `dataStorageId` von einem Bestandskunden Ihres Systems zu einem Kunden (customerId) bei micropayment
+		 * 
+		 *  Wichtig:
+		 *  Diese Funktion ist nur bei einem Wechsel von einem anderen DataStorage-Anbieter relevant und setzt den
+		 *  Import der zugehörigen Kreditkartendaten vorraus separat beantragt und durchgeführt werden muss,
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $dataStorageId Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * 
+		 * @return boolean 
+		 */
+		public function dataStorageIdImport($accessKey, $testMode=0, $customerId, $dataStorageId);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Kreditkartendaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result string $type (default=null)  Kartentyp
+		 * @result string $number (default=null)  partielle Kreditkartennummer [letzten 4 Stellen]
+		 * @result integer $expiryYear (default=null)  Gültigkeits Jahr
+		 * @result integer $expiryMonth (default=null) 	Gültigkeits Monat
+		 * @result boolean $cvc2Required Bei der nächsten Buchung ist der CVC2-Code erforderlich
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 */
+		public function creditcardDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Transaktion zur gebührenfreier Stornierung einer Buchung vor Kassenschnitt oder Freigabe von Vorautorisierungen.
+		 * 
+		 *  Die gebührenfreie Stornierung einer mit `transactionPurchase` durchgeführten Buchung muss am gleichen Tag vor Kassenschnitt um 24 Uhr erfolgen.
+		 *  Die Freigabe einer mittels `transactionAuthorization` erstellten Vorautorisierungen hingegen kann jederzeit durchgeführt werden.
+		 * 
+		 *  Zur Durchführung der Transaktion ist es notwendig das Sie mittels `sessionCreate` einen Bezahlvorgang erstellt,
+		 *  sowie unter Verwendung von `transactionAuthorization` eine Vorautorisierung oder mit `transactionPurchase` eine Buchung durchgeführt haben.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param string $transactionId Transaktionsnummer der Transaktion die zurückgebucht werden soll
+		 * @param integer $fraudDetection (default=1)  de/aktiviert FraudDetection
+		 * 
+		 * @return struct 
+		 * @result SessionStatus $sessionStatus Status der gesamten Session
+		 * @result TransactionStatus $transactionStatus Status der ausgelösten Transaktion
+		 * @result string $transactionId Transaktionsnummer
+		 * @result datetime $transactionCreated Zeitpunkt der Transaktion
+		 * @result string $transactionAuth AuthCode
+		 * @result string $dataStorageId (default=null)  Wenn DataStorage-Feature aktiv, ID der Kreditkartendaten im DataStorage-Service
+		 * @result string $transactionResultCode Transaktionergebnis-Code vom Terminal
+		 * @result string $transactionResultMessage Transaktionergebnis-Nachricht vom Terminal
+		 */
+		public function transactionReversal($accessKey, $testMode=0, $sessionId, $transactionId, $fraudDetection=1);
+
+		/**
+		 * Gibt eine Liste der, vom System durch Umrechnung, unterstützten Währungen zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetSupported($accessKey, $testMode=0);
+
+		/**
+		 * Gibt eine Liste der, von Ihrem Account, nativ unterstützten Währungen, optional für einen bestimmten Kartentyp, zurück.
+		 * 
+		 *  Hinweis:
+		 *  Die native Unterstützung weiterer Währungen erhalten Sie durch die Beantragung zusätzlicher VU-Nummern.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param CardType $cardtype (default=null)  Typ der Kreditkarte
+		 * 
+		 * @return string[] 
+		 */
+		public function currenciesGetNativeSupported($accessKey, $testMode=0, $cardtype=null);
+
+		/**
+		 * Überprüfung von Kreditkarten-Daten (Nummer und Ablaufdatum) auf Gültigkeit
+		 * 
+		 *  - syntaktischen Überprüfung
+		 *  - Luhn-Check
+		 *  - Überschreitung des Ablaufdatums
+		 * 
+		 *  Hinweis: Es findet keine Online-Überprüfung der Daten statt!
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Kreditkarten-Daten sind syntaktisch gültig
+		 */
+		public function creditcardCheckValidity($accessKey, $testMode=0, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Löscht alle im Testmodus übertragenen Daten
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * 
+		 * @return boolean 
+		 */
+		public function resetTest($accessKey, $testMode=1);
+
+		/**
+		 * Versendet eine Benachrichtigung über ein Chargeback an die im
+		 *  ControlCenter angegebene URL und gibt Debuginformationen darüber zurück
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=1)  aktiviert Testumgebung
+		 * @param string $transactionId Transaktionsnummer einer PURCHASE- oder CAPTURE-Transaktion
+		 * 
+		 * @return string 
+		 */
+		public function transactionChargebackNotificationTest($accessKey, $testMode=1, $transactionId);
+
+		/**
+		 * Verknüpft Adressdaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $address Strasse und Hausnummer
+		 * @param string $zipcode Postleitzahl
+		 * @param string $town Ort
+		 * @param string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 * 
+		 * @return boolean 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $address, $zipcode, $town, $country);
+
+		/**
+		 * Gibt die mit einem Kunden verknüpften Adressdaten zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)   aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $address Strasse und Hausnummer
+		 * @result string $zipcode Postleitzahl
+		 * @result string $town Ort
+		 * @result string $country Land [ISO 3166-1-alpha-2] bspw. DE, AT, CH
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Erstellt einen neuen Kunden.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt [min./max. Zeichen 10/40, alphanumerisch]
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * @param string $firstname Vorname des Kunden
+		 * @param string $surname Nachname des Kunde
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden, wenn nach den Transaktionen einen E-Mail an der Kunden versand werden soll
+		 * @param string $culture (default='de-DE')  Sprache & Land des Kunden | gültige Beispielwerte sind 'de', 'de-DE', 'en-US'
+		 * 
+		 * @return string eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null, $firstname, $surname, $email=null, $culture='de-DE');
+
+		/**
+		 * Ändert Daten eines bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern: [NULL] - Parameterliste bleibt unverändert | leeres HashMap - löscht Parameterliste | gefülltes HashMap erweitert/überschreibt bestehende Parameterliste
+		 * @param string $firstname (default=null)  Vorname des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Max'
+		 * @param string $surname (default=null)  Nachname des Kunde: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B 'Mustermann'
+		 * @param string $email (default=null)  E-Mail-Adresse des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültiger Wert z.B. 'max@mustermann.de' ersetzt den aktuellen Wert
+		 * @param string $culture (default=null)  Sprache & Land des Kunden: [NULL] - aktueller Wert bleibt erhalten | gültige Wert z.B. 'de-DE' ersetzt den aktuellen Wert
+		 * 
+		 * @return boolean 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null, $firstname=null, $surname=null, $email=null, $culture=null);
+
+		/**
+		 * Gibt die Daten eines bestehenden Kunden zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return struct 
+		 * @result map $freeParams (default=null)  Liste mit allen freien Parametern
+		 * @result string $firstname (default=null)  Vorname des Kunden
+		 * @result string $surname (default=null)  Nachname des Kunden
+		 * @result string $email (default=null)  E-Mail-Adresse des Kunden
+		 * @result string $culture (default=null)  Sprache & Land des Kunden
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Verknüpft Kreditkartendaten mit einem bestehenden Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $number Kreditkartennummer
+		 * @param integer $expiryYear Gültigkeits Jahr
+		 * @param integer $expiryMonth Gültigkeits Monat
+		 * 
+		 * @return boolean Rückgabewert gibt Auskunft darüber, ob bei der nächsten Buchung der CVC2-Code erforderlich ist
+		 */
+		public function creditcardDataSet($accessKey, $testMode=0, $customerId, $number, $expiryYear, $expiryMonth);
+
+		/**
+		 * Erzeugt einen neuen Bezahlvorgang für einen Kunden
+		 * 
+		 *  Zur Durchführung wird zwingender Weise ein Kunde (customerId) benötigt, den Sie mittels `customerCreate` anlegen können.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der Webmasterfähigkeit des Projekts vorraus - Hinweis: Webmasterfähigkeit steht momentan nicht zur Verfügung
+		 * @param string $webmasterCampaign (default=null)  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert übergeben, wird Der aus der Konfiguration verwendet
+		 * @param string $paytext (default=null)  Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wünschen
+		 * @param string $ip IPv4 des Benutzers
+		 * @param map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @param boolean $sendMail (default=true) 
+		 * 
+		 * @return struct 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result SessionStatus $status Vorgangsstatus "INIT"
+		 * @result datetime $expire Ablaufzeit des Vorgangs
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign=null, $amount=null, $currency='EUR', $title=null, $paytext=null, $ip, $freeParams=null, $sendMail=true);
+
+		/**
+		 * Gibt Informationen über einen Bezahlvorgang, inklusive einer Liste von verknüpften Transaktionen, zurück.
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId eindeutige ID des Vorgangs
+		 * 
+		 * @return struct 
+		 * @result string $customerId ID des Kunden
+		 * @result string $project das Projektkürzel für den Vorgang
+		 * @result string $projectCampaign ein Kampagnenkürzel des Projektbetreibers
+		 * @result string $account Account des beteiligten Webmasters sonst eigener
+		 * @result string $webmasterCampaign ein Kampagnenkürzel des Webmasters
+		 * @result integer $amount abzurechnender Betrag, wird kein Betrag übergeben, wird der Betrag aus der Konfiguration verwendet
+		 * @result string $currency Währungseinheit
+		 * @result string $title Bezeichnung der zu kaufenden Sache
+		 * @result string $ip IPv4 des Benutzers
+		 * @result map $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * @result SessionStatus $status 
+		 * @result datetime $expire (default=null)  Verfallsdatum der Session, nur wenn $status INIT oder EXPIRED
+		 * @result MailStatus $mail Status des Mailversands
+		 * @result string[] $transactionIds (default=null)  Liste von TransaktionsIds die mit dieser Session verknüpft sind
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_0.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_0.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_0.php	(revision 5261)
@@ -0,0 +1,193 @@
+<?php
+
+	/**
+	 * Api steuert die Bezahlung per Lastschrift
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Holger Heyne
+	 * @version 1.0
+	 * @created 2011-02-22 18:42:35
+	 */
+	interface IMcpDebitService_v1_0 {
+
+		/**
+		 * löscht alle Kunden und Transaktionen in der Testumgebung
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode Muss 1 sein
+		 * 
+		 * @return void 
+		 */
+		public function resetTest($accessKey, $testMode);
+
+		/**
+		 * legt neuen Kunden an
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $customerId eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter dem Kunden zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null);
+
+		/**
+		 * ermittelt alle freien Parameter des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result array $freeParams Liste mit allen freien Parametern
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Bankverbindung eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $accountHolder Kontoinhaber
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 */
+		public function bankaccountSet($accessKey, $testMode=0, $customerId, $country='DE', $bankCode, $accountNumber, $accountHolder);
+
+		/**
+		 * ermittelt die Bankverbindung des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $country Sitz der Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $bankName Name der Bank
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 */
+		public function bankaccountGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt einen neuen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default='')  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default='')  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default='')  Account des beteiligten Webmasters
+		 * @param string $webmasterCampaign (default='')  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=0)  abzurechnender Betrag in Cent
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default='')  Bezeichnung der zu kaufenden Sache
+		 * @param string $payText (default='')  Abbuchungstext der Lastschrift
+		 * @param string $ip (default='')  IP des Benutzers
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result string $status Vorgangsstatus "INIT" oder "REINIT"
+		 * @result string $expire Ablaufzeit der Bestätigung
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId='', $project, $projectCampaign='', $account='', $webmasterCampaign='', $amount=0, $currency='EUR', $title='', $payText='', $ip='', $freeParams=null);
+
+		/**
+		 * ermittelt Daten eines Bezahlvorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "INIT", "REINIT", "EXPIRED", "APPROVED", "FAILED", "CHARGED" oder "REVERSED"
+		 * @result string $expire Ablaufzeit bzw. Bestätigung des Vorgangs
+		 * @result string $statusDetail Beschreibung für gescheiterte Transaktionen
+		 * @result string $customerId ID des Kunden
+		 * @result string $project zugeordnetes Projekt
+		 * @result string $projectCampaign zugeordnete Projektkampagne
+		 * @result string $account zugeordneter Webmasteraccount
+		 * @result string $webmasterCampaign zugeordnete Webmasterkampagne
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payText Abbuchungstext der Lastschrift
+		 * @result string $ip übergebene IP des Benutzers
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * bestätigt den Lastschrifteinzug eines Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "APPROVED" oder "FAILED"
+		 * @result string $expire Zeitpunkt der Bestätigung
+		 */
+		public function sessionApprove($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Bezahlvorgänge eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in sessionIdList
+		 * @result array $sessionIdList 0-indizierte Liste mit Vorgang-IDs
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * simuliert die Abbuchung für alle bestätigten Vorgänge
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der gebuchten Vorgänge
+		 */
+		public function sessionChargeTest($accessKey, $testMode=0);
+
+		/**
+		 * simuliert Stornierung eines einzelnen Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return void 
+		 */
+		public function sessionReverseTest($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_1.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_1.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_1.php	(revision 5261)
@@ -0,0 +1,299 @@
+<?php
+
+	/**
+	 * Api steuert die Bezahlung per Lastschrift
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Holger Heyne
+	 * @version 1.1
+	 * @created 2011-02-22 18:42:47
+	 */
+	interface IMcpDebitService_v1_1 {
+
+		/**
+		 * löscht alle Kunden und Transaktionen in der Testumgebung
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode Muss 1 sein
+		 * 
+		 * @return void 
+		 */
+		public function resetTest($accessKey, $testMode);
+
+		/**
+		 * legt neuen Kunden an
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $customerId eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter dem Kunden zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null);
+
+		/**
+		 * ermittelt alle freien Parameter des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result array $freeParams Liste mit allen freien Parametern
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Bankverbindung eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $accountHolder Kontoinhaber
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountSet($accessKey, $testMode=0, $customerId, $country='DE', $bankCode, $accountNumber, $accountHolder);
+
+		/**
+		 * ermittelt die Bankverbindung des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $country Sitz der Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $bankName Name der Bank
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * prüft Bankleitzahl und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * 
+		 * @return array 
+		 * @result string $bankName Name der Bank
+		 */
+		public function bankCheck($accessKey, $testMode=0, $country='DE', $bankCode);
+
+		/**
+		 * prüft Bankverbindung und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountCheck($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber);
+
+		/**
+		 * Sperrt Bankverbindung oder gibt sie frei
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $barStatus Sperr-Status BARRED, ALLOWED
+		 * 
+		 * @return void 
+		 */
+		public function bankaccountBar($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber, $barStatus);
+
+		/**
+		 * erzeugt oder ändert Adressdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $firstName Vorname
+		 * @param string $surName Nachname
+		 * @param string $street Strasse und Hausnummer
+		 * @param string $zip Postleitzahl
+		 * @param string $city Ort
+		 * @param string $country (default='DE')  Land
+		 * 
+		 * @return void 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $firstName, $surName, $street, $zip, $city, $country='DE');
+
+		/**
+		 * ermittelt die Adresse des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $firstName Vorname
+		 * @result string $surName Nachname
+		 * @result string $street Strasse und Hausnummer
+		 * @result string $zip Postleitzahl
+		 * @result string $city Ort
+		 * @result string $country Land
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Kontaktdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $email (default=null)  Emailadresse des Kunden
+		 * @param string $phone (default=null)  Festnetzanschluss
+		 * @param string $mobile (default=null)  Handynummer
+		 * 
+		 * @return void 
+		 */
+		public function contactDataSet($accessKey, $testMode=0, $customerId, $email=null, $phone=null, $mobile=null);
+
+		/**
+		 * ermittelt die Kontaktdaten des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $email Emailadresse
+		 * @result string $phone Festnetzanschluss
+		 * @result string $mobile Handynummer
+		 */
+		public function contactDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt einen neuen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default='')  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default='')  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default='')  Account des beteiligten Webmasters
+		 * @param string $webmasterCampaign (default='')  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=0)  abzurechnender Betrag in Cent
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default='')  Bezeichnung der zu kaufenden Sache
+		 * @param string $payText (default='')  Abbuchungstext der Lastschrift
+		 * @param string $ip (default='')  IP des Benutzers
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result string $status Vorgangsstatus "INIT" oder "REINIT"
+		 * @result string $expire Ablaufzeit der Bestätigung
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId='', $project, $projectCampaign='', $account='', $webmasterCampaign='', $amount=0, $currency='EUR', $title='', $payText='', $ip='', $freeParams=null);
+
+		/**
+		 * ermittelt Daten eines Bezahlvorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "INIT", "REINIT", "EXPIRED", "APPROVED", "FAILED", "CHARGED" oder "REVERSED"
+		 * @result string $expire Ablaufzeit bzw. Bestätigung des Vorgangs
+		 * @result string $statusDetail Beschreibung für gescheiterte Transaktionen
+		 * @result string $customerId ID des Kunden
+		 * @result string $project zugeordnetes Projekt
+		 * @result string $projectCampaign zugeordnete Projektkampagne
+		 * @result string $account zugeordneter Webmasteraccount
+		 * @result string $webmasterCampaign zugeordnete Webmasterkampagne
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payText Abbuchungstext der Lastschrift
+		 * @result string $ip übergebene IP des Benutzers
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * bestätigt den Lastschrifteinzug eines Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "APPROVED" oder "FAILED"
+		 * @result string $expire Zeitpunkt der Bestätigung
+		 */
+		public function sessionApprove($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Bezahlvorgänge eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in sessionIdList
+		 * @result array $sessionIdList 0-indizierte Liste mit Vorgang-IDs
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * simuliert die Abbuchung für alle bestätigten Vorgänge
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der gebuchten Vorgänge
+		 */
+		public function sessionChargeTest($accessKey, $testMode=0);
+
+		/**
+		 * simuliert Stornierung eines einzelnen Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return void 
+		 */
+		public function sessionReverseTest($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_2.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_2.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_2.php	(revision 5261)
@@ -0,0 +1,310 @@
+<?php
+
+	/**
+	 * Api steuert die Bezahlung per Lastschrift
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Holger Heyne
+	 * @version 1.2
+	 * @created 2011-02-22 18:43:23
+	 */
+	interface IMcpDebitService_v1_2 {
+
+		/**
+		 * löscht alle Kunden und Transaktionen in der Testumgebung
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode Muss 1 sein
+		 * 
+		 * @return void 
+		 */
+		public function resetTest($accessKey, $testMode);
+
+		/**
+		 * legt neuen Kunden an
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $customerId eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter dem Kunden zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null);
+
+		/**
+		 * ermittelt alle freien Parameter des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result array $freeParams Liste mit allen freien Parametern
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Bankverbindung eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $accountHolder Kontoinhaber
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountSet($accessKey, $testMode=0, $customerId, $country='DE', $bankCode, $accountNumber, $accountHolder);
+
+		/**
+		 * ermittelt die Bankverbindung des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $country Sitz der Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $bankName Name der Bank
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * prüft Bankleitzahl und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * 
+		 * @return array 
+		 * @result string $bankName Name der Bank
+		 */
+		public function bankCheck($accessKey, $testMode=0, $country='DE', $bankCode);
+
+		/**
+		 * prüft Bankverbindung und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountCheck($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber);
+
+		/**
+		 * Sperrt Bankverbindung oder gibt sie frei
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $barStatus Sperr-Status BARRED, ALLOWED
+		 * 
+		 * @return void 
+		 */
+		public function bankaccountBar($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber, $barStatus);
+
+		/**
+		 * erzeugt oder ändert Adressdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $firstName Vorname
+		 * @param string $surName Nachname
+		 * @param string $street Strasse und Hausnummer
+		 * @param string $zip Postleitzahl
+		 * @param string $city Ort
+		 * @param string $country (default='DE')  Land
+		 * 
+		 * @return void 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $firstName, $surName, $street, $zip, $city, $country='DE');
+
+		/**
+		 * ermittelt die Adresse des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $firstName Vorname
+		 * @result string $surName Nachname
+		 * @result string $street Strasse und Hausnummer
+		 * @result string $zip Postleitzahl
+		 * @result string $city Ort
+		 * @result string $country Land
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Kontaktdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $email (default=null)  Emailadresse des Kunden
+		 * @param string $phone (default=null)  Festnetzanschluss
+		 * @param string $mobile (default=null)  Handynummer
+		 * 
+		 * @return void 
+		 */
+		public function contactDataSet($accessKey, $testMode=0, $customerId, $email=null, $phone=null, $mobile=null);
+
+		/**
+		 * ermittelt die Kontaktdaten des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $email Emailadresse
+		 * @result string $phone Festnetzanschluss
+		 * @result string $mobile Handynummer
+		 */
+		public function contactDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt einen neuen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default='')  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default='')  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default='')  Account des beteiligten Webmasters
+		 * @param string $webmasterCampaign (default='')  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=0)  abzurechnender Betrag in Cent
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default='')  Bezeichnung der zu kaufenden Sache
+		 * @param string $payText (default='')  Abbuchungstext der Lastschrift
+		 * @param string $ip (default='')  IP des Benutzers
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result string $status Vorgangsstatus "INIT" oder "REINIT"
+		 * @result string $expire Ablaufzeit der Bestätigung
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId='', $project, $projectCampaign='', $account='', $webmasterCampaign='', $amount=0, $currency='EUR', $title='', $payText='', $ip='', $freeParams=null);
+
+		/**
+		 * ermittelt Daten eines Bezahlvorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "INIT", "REINIT", "EXPIRED", "APPROVED", "FAILED", "CHARGED", "REVERSED" oder "RECHARGED"
+		 * @result string $expire Ablaufzeit bzw. Bestätigung des Vorgangs
+		 * @result string $statusDetail Beschreibung für gescheiterte Transaktionen
+		 * @result string $customerId ID des Kunden
+		 * @result string $project zugeordnetes Projekt
+		 * @result string $projectCampaign zugeordnete Projektkampagne
+		 * @result string $account zugeordneter Webmasteraccount
+		 * @result string $webmasterCampaign zugeordnete Webmasterkampagne
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payText Abbuchungstext der Lastschrift
+		 * @result string $ip übergebene IP des Benutzers
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * bestätigt den Lastschrifteinzug eines Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "APPROVED" oder "FAILED"
+		 * @result string $expire Zeitpunkt der Bestätigung
+		 */
+		public function sessionApprove($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Bezahlvorgänge eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in sessionIdList
+		 * @result array $sessionIdList 0-indizierte Liste mit Vorgang-IDs
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * simuliert die Abbuchung für alle bestätigten Vorgänge
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der gebuchten Vorgänge
+		 */
+		public function sessionChargeTest($accessKey, $testMode=0);
+
+		/**
+		 * simuliert Stornierung eines einzelnen Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return void 
+		 */
+		public function sessionReverseTest($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * simuliert die Nachzahlung eines stornierten Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return void 
+		 */
+		public function sessionRechargeTest($accessKey, $testMode=0, $sessionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_3.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_3.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_3.php	(revision 5261)
@@ -0,0 +1,384 @@
+<?php
+
+	/**
+	 * Api steuert die Bezahlung per Lastschrift
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Holger Heyne
+	 * @version 1.3
+	 * @created 2011-02-22 18:43:33
+	 */
+	interface IMcpDebitService_v1_3 {
+
+		/**
+		 * löscht alle Kunden und Transaktionen in der Testumgebung
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode Muss 1 sein
+		 * 
+		 * @return void 
+		 */
+		public function resetTest($accessKey, $testMode);
+
+		/**
+		 * legt neuen Kunden an
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $customerId eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter dem Kunden zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null);
+
+		/**
+		 * ermittelt alle freien Parameter des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * ermittelt alle Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param integer $from (default=0)  Position des ersten auszugebenden Kunden
+		 * @param integer $count (default=100)  Anzahl der auszugebenden Kunden
+		 * 
+		 * @return array 
+		 * @result array $customerIdList Liste mit allen freien Parametern
+		 * @result integer $count Anzahl der Kunden in der Liste
+		 * @result integer $maxCount Gesamtanzahl aller Kunden
+		 */
+		public function customerList($accessKey, $testMode=0, $from=0, $count=100);
+
+		/**
+		 * erzeugt oder ändert Bankverbindung eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $accountHolder Kontoinhaber
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountSet($accessKey, $testMode=0, $customerId, $country='DE', $bankCode, $accountNumber, $accountHolder);
+
+		/**
+		 * ermittelt die Bankverbindung des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $country Sitz der Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $bankName Name der Bank
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * prüft Bankleitzahl und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * 
+		 * @return array 
+		 * @result string $bankName Name der Bank
+		 */
+		public function bankCheck($accessKey, $testMode=0, $country='DE', $bankCode);
+
+		/**
+		 * prüft Bankverbindung und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountCheck($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber);
+
+		/**
+		 * Sperrt Bankverbindung oder gibt sie frei
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $barStatus Sperr-Status BARRED, ALLOWED
+		 * 
+		 * @return void 
+		 */
+		public function bankaccountBar($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber, $barStatus);
+
+		/**
+		 * erzeugt oder ändert Adressdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $firstName Vorname
+		 * @param string $surName Nachname
+		 * @param string $street Strasse und Hausnummer
+		 * @param string $zip Postleitzahl
+		 * @param string $city Ort
+		 * @param string $country (default='DE')  Land
+		 * 
+		 * @return void 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $firstName, $surName, $street, $zip, $city, $country='DE');
+
+		/**
+		 * ermittelt die Adresse des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $firstName Vorname
+		 * @result string $surName Nachname
+		 * @result string $street Strasse und Hausnummer
+		 * @result string $zip Postleitzahl
+		 * @result string $city Ort
+		 * @result string $country Land
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Kontaktdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $email (default=null)  Emailadresse des Kunden
+		 * @param string $phone (default=null)  Festnetzanschluss
+		 * @param string $mobile (default=null)  Handynummer
+		 * 
+		 * @return void 
+		 */
+		public function contactDataSet($accessKey, $testMode=0, $customerId, $email=null, $phone=null, $mobile=null);
+
+		/**
+		 * ermittelt die Kontaktdaten des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $email Emailadresse
+		 * @result string $phone Festnetzanschluss
+		 * @result string $mobile Handynummer
+		 */
+		public function contactDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt einen neuen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default='')  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default='')  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default='')  Account des beteiligten Webmasters
+		 * @param string $webmasterCampaign (default='')  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=0)  abzurechnender Betrag in Cent
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default='')  Bezeichnung der zu kaufenden Sache
+		 * @param string $payText (default='')  Abbuchungstext der Lastschrift
+		 * @param string $ip (default='')  IP des Benutzers
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result string $status Vorgangsstatus "INIT" oder "REINIT"
+		 * @result string $expire Ablaufzeit der Bestätigung
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId='', $project, $projectCampaign='', $account='', $webmasterCampaign='', $amount=0, $currency='EUR', $title='', $payText='', $ip='', $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter der Session zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function sessionSet($accessKey, $testMode=0, $sessionId, $freeParams=null);
+
+		/**
+		 * ermittelt Daten eines Bezahlvorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "INIT", "REINIT", "EXPIRED", "APPROVED", "FAILED", "CHARGED", "REVERSED" oder "RECHARGED"
+		 * @result string $expire Ablaufzeit bzw. Bestätigung des Vorgangs
+		 * @result string $statusDetail Beschreibung für gescheiterte Transaktionen
+		 * @result string $customerId ID des Kunden
+		 * @result string $project zugeordnetes Projekt
+		 * @result string $projectCampaign zugeordnete Projektkampagne
+		 * @result string $account zugeordneter Webmasteraccount
+		 * @result string $webmasterCampaign zugeordnete Webmasterkampagne
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result integer $openAmount offener, noch zu zahlender Betrag der Session
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payText Abbuchungstext der Lastschrift
+		 * @result string $ip übergebene IP des Benutzers
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * bestätigt den Lastschrifteinzug eines Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "APPROVED" oder "FAILED"
+		 * @result string $expire Zeitpunkt der Bestätigung
+		 */
+		public function sessionApprove($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Bezahlvorgänge eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in sessionIdList
+		 * @result array $sessionIdList 0-indizierte Liste mit Vorgang-IDs
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * simuliert die Abbuchung für alle bestätigten Vorgänge
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der gebuchten Vorgänge
+		 */
+		public function sessionChargeTest($accessKey, $testMode=0);
+
+		/**
+		 * simuliert Stornierung eines einzelnen Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result integer $amount stornierter Betrag inkl. Gebühr
+		 */
+		public function sessionReverseTest($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * simuliert die komplette Nachzahlung eines stornierten Vorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * @param integer $amount (default=null) optional der nachgezahlte Teilbetrag
+		 * 
+		 * @return array 
+		 * @result integer $amount gebuchter Betrag
+		 */
+		public function sessionRechargeTest($accessKey, $testMode=0, $sessionId, $amount=null);
+
+		/**
+		 * erstellt eine Transaktion vom Typ "EXTERNAL"
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID der zugehörigen Session
+		 * @param string $date (default=null)  Datum der Transaktion
+		 * @param integer $amount Transaktionsbetrag
+		 * @param string $description (default='""')  Beschreibungstext
+		 * 
+		 * @return void 
+		 */
+		public function transactionCreate($accessKey, $testMode=0, $sessionId, $date=null, $amount, $description='""');
+
+		/**
+		 * ermittelt alle Transaktionen für einen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in transactionIdList
+		 * @result array $transactionIdList 0-indizierte Liste mit Transaktions-IDs
+		 */
+		public function transactionList($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt Daten einer Transaktion
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $sessionId ID des Vorgangs
+		 * @result string $date Datum der Transaktion
+		 * @result string $type Art der Transaktion "BOOKING", "REVERSAL", "BACKPAY", "EXTERNAL"
+		 * @result integer $amount Transaktionsbetrag
+		 * @result string $description Beschreibungstext
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_4.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_4.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpDebitService_v1_4.php	(revision 5261)
@@ -0,0 +1,425 @@
+<?php
+
+	/**
+	 * Api steuert die Bezahlung per Lastschrift
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Holger Heyne
+	 * @version 1.4
+	 * @created 2011-02-22 18:42:21
+	 */
+	interface IMcpDebitService_v1_4 {
+
+		/**
+		 * löscht alle Kunden und Transaktionen in der Testumgebung
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode Muss 1 sein
+		 * 
+		 * @return void 
+		 */
+		public function resetTest($accessKey, $testMode);
+
+		/**
+		 * legt neuen Kunden an
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $customerId eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter dem Kunden zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null);
+
+		/**
+		 * ermittelt alle freien Parameter des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * ermittelt alle Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param integer $from (default=0)  Position des ersten auszugebenden Kunden
+		 * @param integer $count (default=100)  Anzahl der auszugebenden Kunden
+		 * 
+		 * @return array 
+		 * @result array $customerIdList Liste mit allen freien Parametern
+		 * @result integer $count Anzahl der Kunden in der Liste
+		 * @result integer $maxCount Gesamtanzahl aller Kunden
+		 */
+		public function customerList($accessKey, $testMode=0, $from=0, $count=100);
+
+		/**
+		 * erzeugt oder ändert Bankverbindung eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $accountHolder Kontoinhaber
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountSet($accessKey, $testMode=0, $customerId, $country='DE', $bankCode, $accountNumber, $accountHolder);
+
+		/**
+		 * ermittelt die Bankverbindung des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $country Sitz der Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $bankName Name der Bank
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * prüft Bankleitzahl und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * 
+		 * @return array 
+		 * @result string $bankName Name der Bank
+		 */
+		public function bankCheck($accessKey, $testMode=0, $country='DE', $bankCode);
+
+		/**
+		 * prüft Bankverbindung und ermittelt Banknamen
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * 
+		 * @return array 
+		 * @result string $bankName der ermittelte Name der Bank
+		 * @result string $barStatus Sperr-Status der Kontoverbindung
+		 */
+		public function bankaccountCheck($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber);
+
+		/**
+		 * Sperrt Bankverbindung oder gibt sie frei
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $country (default='DE')  Sitz der Bank
+		 * @param string $bankCode Bankleitzahl
+		 * @param string $accountNumber Kontonummer
+		 * @param string $barStatus Sperr-Status BARRED, ALLOWED
+		 * 
+		 * @return void 
+		 */
+		public function bankaccountBar($accessKey, $testMode=0, $country='DE', $bankCode, $accountNumber, $barStatus);
+
+		/**
+		 * erzeugt oder ändert Adressdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $firstName Vorname
+		 * @param string $surName Nachname
+		 * @param string $street Strasse und Hausnummer
+		 * @param string $zip Postleitzahl
+		 * @param string $city Ort
+		 * @param string $country (default='DE')  Land
+		 * 
+		 * @return void 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $firstName, $surName, $street, $zip, $city, $country='DE');
+
+		/**
+		 * ermittelt die Adresse des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $firstName Vorname
+		 * @result string $surName Nachname
+		 * @result string $street Strasse und Hausnummer
+		 * @result string $zip Postleitzahl
+		 * @result string $city Ort
+		 * @result string $country Land
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Kontaktdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $email (default=null)  Emailadresse des Kunden
+		 * @param string $phone (default=null)  Festnetzanschluss
+		 * @param string $mobile (default=null)  Handynummer
+		 * 
+		 * @return void 
+		 */
+		public function contactDataSet($accessKey, $testMode=0, $customerId, $email=null, $phone=null, $mobile=null);
+
+		/**
+		 * ermittelt die Kontaktdaten des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $email Emailadresse
+		 * @result string $phone Festnetzanschluss
+		 * @result string $mobile Handynummer
+		 */
+		public function contactDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt einen neuen Bezahlvorgang
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "INIT" bzw. "REINIT" aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default='')  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default='')  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default='')  Account des beteiligten Webmasters
+		 * @param string $webmasterCampaign (default='')  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=0)  abzurechnender Betrag in Cent
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default='')  Bezeichnung der zu kaufenden Sache
+		 * @param string $payText (default='')  Abbuchungstext der Lastschrift
+		 * @param string $ip (default='')  IP des Benutzers
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result string $status Vorgangsstatus "INIT" oder "REINIT"
+		 * @result string $expire Ablaufzeit der Bestätigung
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId='', $project, $projectCampaign='', $account='', $webmasterCampaign='', $amount=0, $currency='EUR', $title='', $payText='', $ip='', $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter der Session zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function sessionSet($accessKey, $testMode=0, $sessionId, $freeParams=null);
+
+		/**
+		 * ermittelt Daten eines Bezahlvorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "INIT", "REINIT", "APPROVED", "CHARGED", "REVERSED" oder "RECHARGED"
+		 * @result string $expire Ablaufzeit bzw. Bestätigung des Vorgangs
+		 * @result string $statusDetail Beschreibung für gescheiterte Transaktionen
+		 * @result string $customerId ID des Kunden
+		 * @result string $project zugeordnetes Projekt
+		 * @result string $projectCampaign zugeordnete Projektkampagne
+		 * @result string $account zugeordneter Webmasteraccount
+		 * @result string $webmasterCampaign zugeordnete Webmasterkampagne
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result integer $openAmount offener, noch zu zahlender Betrag der Session
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payText Abbuchungstext der Lastschrift
+		 * @result string $ip übergebene IP des Benutzers
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * bestätigt den Lastschrifteinzug eines Vorgangs
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "APPROVED" aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "APPROVED" oder "FAILED"
+		 * @result string $expire Zeitpunkt der Bestätigung
+		 */
+		public function sessionApprove($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Bezahlvorgänge eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in sessionIdList
+		 * @result array $sessionIdList 0-indizierte Liste mit Vorgang-IDs
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * simuliert die Abbuchung für alle bestätigten Vorgänge
+		 *  erzeugt für jede bestätigte Session eine neue Transaktion mit dem Typ "BOOKING" und löst die Benachrichtigung transactionCreate aus
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "CHARGED" aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der gebuchten Vorgänge
+		 */
+		public function sessionChargeTest($accessKey, $testMode=0);
+
+		/**
+		 * simuliert Stornierung eines einzelnen Vorgangs
+		 *  erzeugt eine neue Transaktion mit dem Typ "REVERSAL" und löst die Benachrichtigung transactionCreate aus
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "REVERSED" aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result integer $amount stornierter Betrag inkl. Gebühr
+		 */
+		public function sessionReverseTest($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * simuliert die komplette Nachzahlung eines stornierten Vorgangs
+		 *  erzeugt eine neue Transaktion mit dem Typ "BACKPAY" und löst die Benachrichtigung transactionCreate aus
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "RECHARGED" aus, wenn der gesamte offene Betrag beglichen wurde
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * @param integer $amount (default=null) optional der nachgezahlte Teilbetrag
+		 * 
+		 * @return array 
+		 * @result integer $amount gebuchter Betrag
+		 */
+		public function sessionRechargeTest($accessKey, $testMode=0, $sessionId, $amount=null);
+
+		/**
+		 * Veranlasst eine (Teil-)Gutschrift und überweist sie zurück
+		 *  erzeugt eine neue Transaktion mit dem Typ "REFUND" und löst die Benachrichtigung transactionCreate aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID der zugehörigen Session
+		 * @param string $bankCode (default=null)  Bankleitzahl des altern. Empfängers
+		 * @param string $accountNumber (default=null)  Kontonummer des altern. Empfängers
+		 * @param string $accountHolder (default=null)  Kontoinhaber
+		 * @param integer $amount (default=null)  Überweisungsbetrag, stdm. wird der gesamte eingegangene Betrag überwiesen
+		 * @param string $payText (default=null)  Buchungstext, stdm. wird der ursprüngliche Buchungstext verwendet
+		 * 
+		 * @return array 
+		 * @result integer $amount Überweisungsbetrag
+		 * @result string $payText Buchungstext
+		 */
+		public function sessionRefund($accessKey, $testMode=0, $sessionId, $bankCode=null, $accountNumber=null, $accountHolder=null, $amount=null, $payText=null);
+
+		/**
+		 * simuliert Stornierung der letzten Gutschrift,
+		 *  erzeugt eine neue Transaktion mit dem Typ "REFUNDREVERSAL" und löst die Benachrichtigung transactionCreate aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result integer $amount stornierter Gutschriftbetrag
+		 */
+		public function sessionRefundReverseTest($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * erstellt eine Transaktion vom Typ "EXTERNAL"
+		 *  löst die Benachrichtigung transactionCreate aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID der zugehörigen Session
+		 * @param string $date (default=null)  Datum der Transaktion
+		 * @param integer $amount Transaktionsbetrag
+		 * @param string $description (default='""')  Beschreibungstext
+		 * 
+		 * @return void 
+		 */
+		public function transactionCreate($accessKey, $testMode=0, $sessionId, $date=null, $amount, $description='""');
+
+		/**
+		 * ermittelt alle Transaktionen für einen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in transactionIdList
+		 * @result array $transactionIdList 0-indizierte Liste mit Transaktions-IDs
+		 */
+		public function transactionList($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt Daten einer Transaktion
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $sessionId ID des Vorgangs
+		 * @result string $date Datum der Transaktion
+		 * @result string $type Art der Transaktion "BOOKING", "REVERSAL", "BACKPAY", "EXTERNAL", "REFUND", "REFUNDREVERSAL"
+		 * @result integer $amount Transaktionsbetrag
+		 * @result string $description Beschreibungstext
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpPrepayService_v1_0.php
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpPrepayService_v1_0.php	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/IMcpPrepayService_v1_0.php	(revision 5261)
@@ -0,0 +1,344 @@
+<?php
+
+	/**
+	 * Api steuert die Bezahlung per Vorkasse
+	 *
+	 * @copyright 2011 micropayment GmbH
+	 * @link http://www.micropayment.de/
+	 * @author Holger Heyne
+	 * @version 1.0
+	 * @created 2011-12-30 13:03:22
+	 */
+	interface IMcpPrepayService_v1_0 {
+
+		/**
+		 * löscht alle Kunden und Transaktionen in der Testumgebung
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode Muss 1 sein
+		 * 
+		 * @return void 
+		 */
+		public function resetTest($accessKey, $testMode);
+
+		/**
+		 * legt neuen Kunden an
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId (default=null)  eigene eindeutige ID des Kunden, wird anderenfalls erzeugt
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $customerId eigene oder erzeugte eindeutige ID des Kunden
+		 */
+		public function customerCreate($accessKey, $testMode=0, $customerId=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter dem Kunden zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId eindeutige ID des Kunden
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function customerSet($accessKey, $testMode=0, $customerId, $freeParams=null);
+
+		/**
+		 * ermittelt alle freien Parameter des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function customerGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * ermittelt alle Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param integer $from (default=0)  Position des ersten auszugebenden Kunden
+		 * @param integer $count (default=100)  Anzahl der auszugebenden Kunden
+		 * 
+		 * @return array 
+		 * @result array $customerIdList Liste mit allen freien Parametern
+		 * @result integer $count Anzahl der Kunden in der Liste
+		 * @result integer $maxCount Gesamtanzahl aller Kunden
+		 */
+		public function customerList($accessKey, $testMode=0, $from=0, $count=100);
+
+		/**
+		 * erzeugt oder ändert Adressdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $form (default='NONE')  Anrede "NONE", "SIR", "MADAM", "MISS", "COMPANY"
+		 * @param string $firstName Vorname
+		 * @param string $surName Nachname
+		 * @param string $address (default='')  Zusätzliche Angaben z.B. "bei Schmidt"
+		 * @param string $street Strasse und Hausnummer
+		 * @param string $zip Postleitzahl
+		 * @param string $city Ort
+		 * @param string $country (default='DE')  Land
+		 * 
+		 * @return void 
+		 */
+		public function addressSet($accessKey, $testMode=0, $customerId, $form='NONE', $firstName, $surName, $address='', $street, $zip, $city, $country='DE');
+
+		/**
+		 * ermittelt die Adresse des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $form Anrede
+		 * @result string $firstName Vorname
+		 * @result string $surName Nachname
+		 * @result string $address Zusätzliche Angaben
+		 * @result string $street Strasse und Hausnummer
+		 * @result string $zip Postleitzahl
+		 * @result string $city Ort
+		 * @result string $country Land
+		 */
+		public function addressGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt oder ändert Kontaktdaten eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $email (default=null)  Emailadresse des Kunden
+		 * @param string $phone (default=null)  Festnetzanschluss
+		 * @param string $mobile (default=null)  Handynummer
+		 * @param string $language (default=null)  Sprache
+		 * 
+		 * @return void 
+		 */
+		public function contactDataSet($accessKey, $testMode=0, $customerId, $email=null, $phone=null, $mobile=null, $language=null);
+
+		/**
+		 * ermittelt die Kontaktdaten des Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result string $email Emailadresse
+		 * @result string $phone Festnetzanschluss
+		 * @result string $mobile Handynummer
+		 * @result string $language Sprache
+		 */
+		public function contactDataGet($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * erzeugt einen neuen Bezahlvorgang
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "INIT" aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * @param string $sessionId (default=null)  eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt
+		 * @param string $project das Projektkürzel für den Vorgang
+		 * @param string $projectCampaign (default=null)  ein Kampagnenkürzel des Projektbetreibers
+		 * @param string $account (default=null)  Account des beteiligten Webmasters
+		 * @param string $webmasterCampaign (default='')  ein Kampagnenkürzel des Webmasters
+		 * @param integer $amount (default=null)  abzurechnender Betrag in Cent, Standard aus Konfiguration
+		 * @param string $currency (default='EUR')  Währung
+		 * @param string $title (default=null)  Bezeichnung der zu kaufenden Sache, Standard aus Konfiguration
+		 * @param string $payText (default=null)  Verwendungszweck für Überweisung, Standard Projektname und $title
+		 * @param string $expireDays (default=21)  Ablauf der Session in Tagen, genauer Ablauf wird als $expireDate zurückgegeben
+		 * @param string $ip (default=null)  IP des Benutzers
+		 * @param array $freeParams (default=null)  Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+		 * 
+		 * @return array 
+		 * @result string $sessionId eigene oder erzeugte eindeutige ID des Vorgangs
+		 * @result string $status Vorgangsstatus "INIT"
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payToken Token, das Kunde bei Überweisung angeben muss
+		 * @result string $payText Verwendungszweck, inkl. Token
+		 * @result string $expireDate Ablaufdatum der Session, kann bis zu 2 Tagen länger sein als durch expireDays vorgegeben
+		 * @result string $dueDate letzter Überweisungstermin für Kunden
+		 * @result string $bankName Bank, an die überwiesen werden soll
+		 * @result string $bankCountry Land der Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 * @result string $bic SWIFT BIC für ausländische Kunden
+		 * @result string $iban IBAN
+		 */
+		public function sessionCreate($accessKey, $testMode=0, $customerId, $sessionId=null, $project, $projectCampaign=null, $account=null, $webmasterCampaign='', $amount=null, $currency='EUR', $title=null, $payText=null, $expireDays=21, $ip=null, $freeParams=null);
+
+		/**
+		 * ordnet weitere freie Parameter der Session zu, oder ändert sie
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * @param array $freeParams (default=null)  Liste mit zusätzlichen freien Parametern
+		 * 
+		 * @return void 
+		 */
+		public function sessionSet($accessKey, $testMode=0, $sessionId, $freeParams=null);
+
+		/**
+		 * ermittelt Daten eines Bezahlvorgangs
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $status Vorgangsstatus "INIT", "OPEN", "PAID", "OVERPAID", "CLOSED"
+		 * @result string $customerId ID des Kunden
+		 * @result string $project zugeordnetes Projekt
+		 * @result string $projectCampaign zugeordnete Projektkampagne
+		 * @result string $account zugeordneter Webmasteraccount
+		 * @result string $webmasterCampaign zugeordnete Webmasterkampagne
+		 * @result integer $amount übergebener Betrag bzw. Standard aus Konfiguration in Cent
+		 * @result integer $orderAmount geforderter Betrag der Session
+		 * @result integer $paidAmount bereits bezahlter Betrag
+		 * @result integer $openAmount offener bzw. überzahlter (negativer) Betrag, Differenz aus orderAmount und paidAmount
+		 * @result string $currency übergebene Währung bzw. "EUR"
+		 * @result string $title übergebene Kaufsache bzw. Standard aus Konfiguration
+		 * @result string $payToken Token, das Kunde bei Überweisung angeben muss
+		 * @result string $payText Verwendungszweck für Überweisung
+		 * @result string $expireDate Ablaufdatum
+		 * @result string $dueDate letzter Überweisungstermin
+		 * @result string $bankName Bank
+		 * @result string $bankCode Bankleitzahl
+		 * @result string $accountNumber Kontonummer
+		 * @result string $accountHolder Kontoinhaber
+		 * @result string $bic BIC
+		 * @result string $iban IBAN
+		 * @result string $ip IP des Benutzers
+		 * @result array $freeParams (default=null)  Liste mit allen freien Parametern
+		 */
+		public function sessionGet($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Bezahlvorgänge eines Kunden
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $customerId ID des Kunden
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in sessionIdList
+		 * @result array $sessionIdList 0-indizierte Liste mit Vorgang-IDs
+		 */
+		public function sessionList($accessKey, $testMode=0, $customerId);
+
+		/**
+		 * Veranlasst eine Minderung des Betrags und ggf. eine (Teil-)Gutschrift
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID der zugehörigen Session
+		 * @param integer $amount Minderung der Forderung, als positiver Betrag
+		 * 
+		 * @return array 
+		 * @result string $status ggf. neuer Status, "INIT", "OPEN", "PAID", "OVERPAID", "CLOSED"
+		 * @result integer $orderAmount neuer geforderter Betrag
+		 * @result integer $paidAmount insgesamt gezahlter Betrag
+		 * @result integer $openAmount offener bzw. überzahlter Betrag
+		 */
+		public function sessionChange($accessKey, $testMode=0, $sessionId, $amount);
+
+		/**
+		 * simuliert einen Zahlungeingang für eine oder mehrere Sessions
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID der zugehörigen Session
+		 * @param integer $amount gezahlter Betrag
+		 * @param string $bankCountry (default='DE')  Land der Bank
+		 * @param string $bankCode (default=null)  Bankleitzahl des Kunden
+		 * @param string $accountNumber (default=null)  Kontonummer des Kunden
+		 * @param string $accountHolder (default=null)  Kontoinhaber des Kunden
+		 * 
+		 * @return null 
+		 */
+		public function sessionPayinTest($accessKey, $testMode=0, $sessionId, $amount, $bankCountry='DE', $bankCode=null, $accountNumber=null, $accountHolder=null);
+
+		/**
+		 * simuliert das Auslösen einer Erinnerungsmail
+		 *  löst die Benachrichtigung sessionRemind aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * @param bool $lastRemind (default=false)  Letzte Erinnerung
+		 * 
+		 * @return null 
+		 */
+		public function sessionRemindTest($accessKey, $testMode=0, $sessionId, $lastRemind=false);
+
+		/**
+		 * simuliert den Ablauf einer Session
+		 *  löst die Benachrichtigung sessionStatus mit dem Status "CLOSED" aus
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return null 
+		 */
+		public function sessionExpireTest($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * simuliert die automatische Rücküberweisung für überzahlte Beträge
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  muss 1 sein
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return null 
+		 */
+		public function sessionRefundTest($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt alle Transaktionen für einen Bezahlvorgang
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $sessionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result integer $count Anzahl der Einträge in transactionIdList
+		 * @result array $transactionIdList 0-indizierte Liste mit Transaktions-IDs
+		 */
+		public function transactionList($accessKey, $testMode=0, $sessionId);
+
+		/**
+		 * ermittelt Daten einer Transaktion
+		 *
+		 * @param string $accessKey AccessKey aus dem Controlcenter
+		 * @param integer $testMode (default=0)  aktiviert Testumgebung
+		 * @param string $transactionId ID des Vorgangs
+		 * 
+		 * @return array 
+		 * @result string $sessionId ID des Vorgangs
+		 * @result string $date Datum der Transaktion
+		 * @result string $type Art der Transaktion "CREATE", "PAYIN", "CHANGE", "REFUND", "EXPIRE"
+		 * @result integer $orderAmount Veränderung des geforderten Betrags
+		 * @result integer $paidAmount Veränderung des bezahlten Betrags
+		 * @result integer $openAmount (default=null)  Veränderung des offenen Betrags
+		 */
+		public function transactionGet($accessKey, $testMode=0, $transactionId);
+
+	}
+
+?>
Index: /mods/mod_micropayment/mcp-serviceclient_1_17/services/readme.txt
===================================================================
--- /mods/mod_micropayment/mcp-serviceclient_1_17/services/readme.txt	(revision 5261)
+++ /mods/mod_micropayment/mcp-serviceclient_1_17/services/readme.txt	(revision 5261)
@@ -0,0 +1,1 @@
+Hinterlegen Sie hier bitte die Services-Interfaces die Sie auf der Seite der ServiceBeschreibung herrunterladen können.
Index: /mods/mod_pap/PapApi.class.php
===================================================================
--- /mods/mod_pap/PapApi.class.php	(revision 5261)
+++ /mods/mod_pap/PapApi.class.php	(revision 5261)
@@ -0,0 +1,6192 @@
+<?php
+/**
+ *   @copyright Copyright (c) 2008-2009 Quality Unit s.r.o.
+ *   @author Quality Unit
+ *   @package PapApi
+ *   @since Version 1.0.0
+ *   
+ *   Licensed under the Quality Unit, s.r.o. Dual License Agreement,
+ *   Version 1.0 (the "License"); you may not use this file except in compliance
+ *   with the License. You may obtain a copy of the License at
+ *   http://www.qualityunit.com/licenses/gpf
+ *   Generated on: 2012-07-16 23:43:32
+ *   PAP version: 4.5.88.1, GPF version: 1.1.13.0
+ *   
+ */
+
+@ini_set('session.gc_maxlifetime', 28800);
+@ini_set('session.cookie_path', '/');
+@ini_set('session.use_cookies', true);
+@ini_set('magic_quotes_runtime', false);
+@ini_set('session.use_trans_sid', false);
+@ini_set('zend.ze1_compatibility_mode', false);
+
+if (!class_exists('Gpf', false)) {
+    class Gpf {
+        const YES = 'Y';
+        const NO = 'N';
+    }
+}
+
+if (!class_exists('Gpf_Object', false)) {		
+    class Gpf_Object {
+        protected function createDatabase() {
+            return Gpf_DbEngine_Database::getDatabase();
+        }
+    
+        public function _($message) {
+            return $message;
+        }
+    
+        public function _localize($message) {
+            return $message;
+        }
+    
+        public function _sys($message) {
+            return $message;
+        }
+    }
+}
+
+if (!interface_exists('Gpf_Rpc_Serializable', false)) {
+  interface Gpf_Rpc_Serializable {
+  
+      public function toObject();
+  
+      public function toText();
+  }
+
+} //end Gpf_Rpc_Serializable
+
+if (!interface_exists('Gpf_Rpc_DataEncoder', false)) {
+  interface Gpf_Rpc_DataEncoder {
+      function encodeResponse(Gpf_Rpc_Serializable $response);
+  }
+  
+  
+
+} //end Gpf_Rpc_DataEncoder
+
+if (!interface_exists('Gpf_Rpc_DataDecoder', false)) {
+  interface Gpf_Rpc_DataDecoder {
+      /**
+       * @param string $str
+       * @return StdClass
+       */
+      function decode($str);
+  }
+  
+  
+
+} //end Gpf_Rpc_DataDecoder
+
+if (!class_exists('Gpf_Rpc_Array', false)) {
+  class Gpf_Rpc_Array extends Gpf_Object implements Gpf_Rpc_Serializable, IteratorAggregate {
+  
+  	private $array;
+  
+  	function __construct(array $array = null){
+  		if($array === null){
+  			$this->array = array();
+  		}else{
+  			$this->array = $array;
+  		}
+  	}
+  
+  	public function add($response) {
+  		if(is_scalar($response) || $response instanceof Gpf_Rpc_Serializable) {
+  			$this->array[] = $response;
+  			return;
+  		}
+  		throw new Gpf_Exception("Value of type " . gettype($response) . " is not scalar or Gpf_Rpc_Serializable");
+  	}
+  
+  	public function toObject() {
+  		$array = array();
+  		foreach ($this->array as $response) {
+  			if($response instanceof Gpf_Rpc_Serializable) {
+  				$array[] = $response->toObject();
+  			} else {
+  				$array[] = $response;
+  			}
+  		}
+  		return $array;
+  	}
+  
+  	public function toText() {
+  		return var_dump($this->array);
+  	}
+  
+  	public function getCount() {
+  		return count($this->array);
+  	}
+  
+  	public function get($index) {
+  		return $this->array[$index];
+  	}
+  
+  	/**
+  	 *
+  	 * @return ArrayIterator
+  	 */
+  	public function getIterator() {
+  		return new ArrayIterator($this->array);
+  	}
+  }
+
+} //end Gpf_Rpc_Array
+
+if (!class_exists('Gpf_Rpc_Server', false)) {
+  class Gpf_Rpc_Server extends Gpf_Object {
+      const REQUESTS = 'requests';
+      const REQUESTS_SHORT = 'R';
+      const RUN_METHOD = 'run';
+      const FORM_REQUEST = 'FormRequest';
+      const FORM_RESPONSE = 'FormResponse';
+      const BODY_DATA_NAME = 'D';
+  
+  
+      const HANDLER_FORM = 'Y';
+      const HANDLER_JASON = 'N';
+      const HANDLER_WINDOW_NAME = 'W';
+  
+      /**
+       * @var Gpf_Rpc_DataEncoder
+       */
+      private $dataEncoder;
+      /**
+       * @var Gpf_Rpc_DataDecoder
+       */
+      private $dataDecoder;
+  
+      public function __construct() {
+      }
+  
+      private function initDatabaseLogger() {
+          $logger = Gpf_Log_Logger::getInstance();
+  
+          if(!$logger->checkLoggerTypeExists(Gpf_Log_LoggerDatabase::TYPE)) {
+              $logger->setGroup(Gpf_Common_String::generateId(10));
+              $logLevel = Gpf_Settings::get(Gpf_Settings_Gpf::LOG_LEVEL_SETTING_NAME);
+              $logger->add(Gpf_Log_LoggerDatabase::TYPE, $logLevel);
+          }
+      }
+  
+      /**
+       * Return response to standard output
+       */
+      public function executeAndEcho($request = '') {
+          $response = $this->encodeResponse($this->execute($request));
+          Gpf_ModuleBase::startGzip();
+          echo $response;
+          Gpf_ModuleBase::flushGzip();
+      }
+  
+      /**
+       * @return Gpf_Rpc_Serializable
+       */
+      public function execute($request = '') {
+          try {
+              if(isset($_REQUEST[self::BODY_DATA_NAME])) {
+                  $request = $this->parseRequestDataFromPost($_REQUEST[self::BODY_DATA_NAME]);
+              }
+              if($this->isStandardRequestUsed($_REQUEST)) {
+                  $request = $this->setStandardRequest();
+              }
+  
+              $this->setDecoder($request);
+              $params = new Gpf_Rpc_Params($this->decodeRequest($request));
+              $this->setEncoder($params);
+              $response = $this->executeRequest($params);
+          } catch (Exception $e) {
+              return new Gpf_Rpc_ExceptionResponse($e);
+          }
+          return $response;
+      }
+  
+      private function parseRequestDataFromPost($data) {
+          if(get_magic_quotes_gpc()) {
+              return stripslashes($data);
+          }
+          return $data;
+      }
+  
+      /**
+       *
+       * @param unknown_type $requestObj
+       * @return Gpf_Rpc_Serializable
+       */
+      private function executeRequest(Gpf_Rpc_Params $params) {
+          try {
+              Gpf_Db_LoginHistory::logRequest();
+              return $this->callServiceMethod($params);
+          } catch (Gpf_Rpc_SessionExpiredException $e) {
+              return $e;
+          } catch (Exception $e) {
+              return new Gpf_Rpc_ExceptionResponse($e);
+          }
+      }
+  
+      protected function callServiceMethod(Gpf_Rpc_Params $params) {
+          $method = new Gpf_Rpc_ServiceMethod($params);
+          return $method->invoke($params);
+      }
+  
+      /**
+       * Compute correct handler type for server response
+       *
+       * @param array $requestData
+       * @param string $type
+       * @return string
+       */
+      private function getEncoderHandlerType($requestData) {
+          if ($this->isFormHandler($requestData, self::FORM_RESPONSE, self::HANDLER_FORM)) {
+              return self::HANDLER_FORM;
+          }
+          if ($this->isFormHandler($requestData, self::FORM_RESPONSE, self::HANDLER_WINDOW_NAME)) {
+              return self::HANDLER_WINDOW_NAME;
+          }
+          return self::HANDLER_JASON;
+      }
+  
+  
+      private function isFormHandler($requestData, $type, $handler) {
+          return (isset($_REQUEST[$type]) && $_REQUEST[$type] == $handler) ||
+          (isset($requestData) && isset($requestData[$type]) && $requestData[$type] == $handler);
+      }
+  
+      private function decodeRequest($requestData) {
+          return $this->dataDecoder->decode($requestData);
+      }
+  
+      private function isStandardRequestUsed($requestArray) {
+          return is_array($requestArray) && array_key_exists(Gpf_Rpc_Params::CLASS_NAME, $requestArray);
+      }
+  
+      private function setStandardRequest() {
+          return array_merge($_POST, $_GET);
+      }
+  
+      private function isFormRequest($request) {
+          return $this->isFormHandler($request, self::FORM_REQUEST, self::HANDLER_FORM);
+      }
+  
+      private function encodeResponse(Gpf_Rpc_Serializable $response) {
+          return $this->dataEncoder->encodeResponse($response);
+      }
+  
+  
+      private function setDecoder($request) {
+          if ($this->isFormRequest($request)) {
+              $this->dataDecoder = new Gpf_Rpc_FormHandler();
+          } else {
+              $this->dataDecoder = new Gpf_Rpc_Json();
+          }
+      }
+  
+      private function setEncoder(Gpf_Rpc_Params $params) {
+          switch ($params->get(self::FORM_RESPONSE)) {
+              case self::HANDLER_FORM:
+                  $this->dataEncoder = new Gpf_Rpc_FormHandler();
+                  break;
+              case self::HANDLER_WINDOW_NAME:
+                  $this->dataEncoder = new Gpf_Rpc_WindowNameHandler();
+                  break;
+              default:
+                  $this->dataEncoder = new Gpf_Rpc_Json();
+                  break;
+          }
+      }
+  
+      /**
+       * Executes multi request
+       *
+       * @service
+       * @anonym
+       * @return Gpf_Rpc_Serializable
+       */
+      public function run(Gpf_Rpc_Params $params) {
+          $requestArray = $params->get(self::REQUESTS);
+  
+          if ($requestArray === null) {
+              $requestArray = $params->get(self::REQUESTS_SHORT);
+          }
+  
+          $response = new Gpf_Rpc_Array();
+          foreach ($requestArray as $request) {
+              $response->add($this->executeRequest(new Gpf_Rpc_Params($request)));
+          }
+          return $response;
+      }
+  
+      /**
+       * Set time offset between client and server and store it to session
+       * Offset is computed as client time - server time
+       *
+       * @anonym
+       * @service
+       * @param Gpf_Rpc_Params $params
+       * @return Gpf_Rpc_Action
+       */
+      public function syncTime(Gpf_Rpc_Params $params) {
+          $action = new Gpf_Rpc_Action($params);
+          Gpf_Session::getInstance()->setTimeOffset($action->getParam('offset')/1000);
+          $action->addOk();
+          return $action;
+      }
+  }
+
+} //end Gpf_Rpc_Server
+
+if (!class_exists('Gpf_Rpc_MultiRequest', false)) {
+  class Gpf_Rpc_MultiRequest extends Gpf_Object {
+      private $url = '';
+      private $useNewStyleRequestsEncoding;
+      /**
+       *
+       * @var Gpf_Rpc_Array
+       */
+      private $requests;
+      /**
+       * @var Gpf_Rpc_Json
+       */
+      private $json;
+      protected $serverClassName = 'Gpf_Rpc_Server';
+  
+      private $sessionId = null;
+  
+      private $debugRequests = false;
+  
+      /**
+       * @var Gpf_Rpc_MultiRequest
+       */
+      private static $instance;
+  
+      public function __construct() {
+          $this->json = new Gpf_Rpc_Json();
+          $this->requests = new Gpf_Rpc_Array();
+      }
+  
+      public function useNewStyleRequestsEncoding($useNewStyle) {
+          $this->useNewStyleRequestsEncoding = $useNewStyle;
+      }
+  
+      /**
+       * @return Gpf_Rpc_MultiRequest
+       */
+      public static function getInstance() {
+          if(self::$instance === null) {
+              self::$instance = new Gpf_Rpc_MultiRequest();
+          }
+          return self::$instance;
+      }
+  
+      public static function setInstance(Gpf_Rpc_MultiRequest $instance) {
+          self::$instance = $instance;
+      }
+  
+      public function add(Gpf_Rpc_Request $request) {
+          $this->requests->add($request);
+      }
+  
+      protected function sendRequest($requestBody) {
+          $request = new Gpf_Net_Http_Request();
+  
+          $request->setMethod('POST');
+          $request->setBody(Gpf_Rpc_Server::BODY_DATA_NAME . '=' . urlencode($requestBody));
+          $request->setUrl($this->url);
+  
+          $client = new Gpf_Net_Http_Client();
+          $response = $client->execute($request);
+          return $response->getBody();
+      }
+  
+      public function setSessionId($sessionId) {
+          $this->sessionId = $sessionId;
+      }
+  
+      public function setDebugRequests($debug) {
+          $this->debugRequests = $debug;
+      }
+  
+      public function send() {
+          $request = new Gpf_Rpc_Request($this->serverClassName, Gpf_Rpc_Server::RUN_METHOD);
+          if ($this->useNewStyleRequestsEncoding) {
+              $request->addParam(Gpf_Rpc_Server::REQUESTS_SHORT, $this->requests);
+          } else {
+              $request->addParam(Gpf_Rpc_Server::REQUESTS, $this->requests);
+          }
+          if($this->sessionId != null) {
+              $request->addParam("S", $this->sessionId);
+          }
+          $requestBody = $this->json->encodeResponse($request);
+          $responseText = $this->sendRequest($requestBody);
+          if($this->debugRequests) {
+              echo "REQUEST: ".$requestBody."<br/>";
+              echo "RESPONSE: ".$responseText."<br/><br/>";
+          }
+          $responseArray = $this->json->decode($responseText);
+  
+          if (!is_array($responseArray)) {
+              throw new Gpf_Exception("Response decoding failed: not array. Received text: $responseText");
+          }
+  
+          if (count($responseArray) != $this->requests->getCount()) {
+              throw new Gpf_Exception("Response decoding failed: Number of responses is not same as number of requests");
+          }
+  
+          $exception = false;
+          foreach ($responseArray as $index => $response) {
+              if (is_object($response) && isset($response->e)) {
+                  $exception = true;
+                  $this->requests->get($index)->setResponseError($response->e);
+              } else {
+                  $this->requests->get($index)->setResponse($response);
+              }
+          }
+          if($exception) {
+              $messages = '';
+              foreach ($this->requests as $request) {
+                  $messages .= $request->getResponseError() . "|";
+              }
+          }
+          $this->requests = new Gpf_Rpc_Array();
+          if($exception) {
+              throw new Gpf_Rpc_ExecutionException($messages);
+          }
+      }
+  
+      public function setUrl($url) {
+          $this->url = $url;
+      }
+  
+      public function getUrl() {
+          return $this->url;
+      }
+  
+      private function getCookies() {
+          $cookiesString = '';
+          foreach ($_COOKIE as $name => $value) {
+              $cookiesString .= "$name=$value;";
+          }
+          return $cookiesString;
+      }
+  }
+  
+
+} //end Gpf_Rpc_MultiRequest
+
+if (!class_exists('Gpf_Rpc_Params', false)) {
+  class Gpf_Rpc_Params extends Gpf_Object implements Gpf_Rpc_Serializable {
+      private $params;
+      const CLASS_NAME = 'C';
+      const METHOD_NAME = 'M';
+      const SESSION_ID = 'S';
+      const ACCOUNT_ID = 'aid';
+  
+      function __construct($params = null) {
+          if($params === null) {
+              $this->params = new stdClass();
+              return;
+          }
+          $this->params = $params;
+      }
+  
+      public static function createGetRequest($className, $methodName = 'execute', $formRequest = false, $formResponse = false) {
+          $requestData = array();
+          $requestData[self::CLASS_NAME] = $className;
+          $requestData[self::METHOD_NAME] = $methodName;
+          $requestData[Gpf_Rpc_Server::FORM_REQUEST] = $formRequest ? Gpf::YES : '';
+          $requestData[Gpf_Rpc_Server::FORM_RESPONSE] = $formResponse ? Gpf::YES : '';
+          return $requestData;
+      }
+  
+      /**
+       *
+       * @param unknown_type $className
+       * @param unknown_type $methodName
+       * @param unknown_type $formRequest
+       * @param unknown_type $formResponse
+       * @return Gpf_Rpc_Params
+       */
+      public static function create($className, $methodName = 'execute', $formRequest = false, $formResponse = false) {
+          $params = new Gpf_Rpc_Params();
+          $obj = new stdClass();
+          foreach (self::createGetRequest($className, $methodName, $formRequest, $formResponse) as $name => $value) {
+              $params->add($name,$value);
+          }
+          return $params;
+      }
+  
+      public function setArrayParams(array $params) {
+          foreach ($params as $name => $value) {
+              $this->add($name, $value);
+          }
+      }
+  
+      public function exists($name) {
+          if(!is_object($this->params) || !array_key_exists($name, $this->params)) {
+              return false;
+          }
+          return true;
+      }
+  
+      /**
+       *
+       * @param unknown_type $name
+       * @return mixed Return null if $name does not exist.
+       */
+      public function get($name) {
+          if(!$this->exists($name)) {
+              return null;
+          }
+          return $this->params->{$name};
+      }
+  
+      public function set($name, $value) {
+          if(!$this->exists($name)) {
+              return;
+          }
+          $this->params->{$name} = $value;
+      }
+  
+      public function add($name, $value) {
+          $this->params->{$name} = $value;
+      }
+  
+      public function getClass() {
+          return $this->get(self::CLASS_NAME);
+      }
+  
+      public function getMethod() {
+          return $this->get(self::METHOD_NAME);
+      }
+  
+      public function getSessionId() {
+          $sessionId = $this->get(self::SESSION_ID);
+          if ($sessionId === null || strlen(trim($sessionId)) == 0) {
+              Gpf_Session::create(new Gpf_ApiModule());
+          }
+          return $sessionId;
+      }
+      
+      public function clearSessionId() {
+          $this->set(self::SESSION_ID, null);
+      }
+  
+      public function getAccountId() {
+          return $this->get(self::ACCOUNT_ID);
+      }
+  
+      public function toObject() {
+          return $this->params;
+      }
+  
+      public function toText() {
+          throw new Gpf_Exception("Unimplemented");
+      }
+  }
+  
+
+} //end Gpf_Rpc_Params
+
+if (!class_exists('Gpf_Exception', false)) {
+  class Gpf_Exception extends Exception {
+  
+      private $id;
+  
+      public function __construct($message,$code = null) {
+          parent::__construct($message,$code);
+      }
+  
+      protected function logException() {
+          Gpf_Log::error($this->getMessage());
+      }
+  
+      public function setId($id) {
+          $this->id = $id;
+      }
+  
+      public function getId() {
+          return $this->id;
+      }
+  
+  }
+
+} //end Gpf_Exception
+
+if (!class_exists('Gpf_Data_RecordSetNoRowException', false)) {
+  class Gpf_Data_RecordSetNoRowException extends Gpf_Exception {
+      public function __construct($keyValue) {
+          parent::__construct("'Row $keyValue does not exist");
+      }
+      
+      protected function logException() {
+      }
+  }
+
+} //end Gpf_Data_RecordSetNoRowException
+
+if (!class_exists('Gpf_Rpc_ExecutionException', false)) {
+  class Gpf_Rpc_ExecutionException extends Gpf_Exception {
+       
+      function __construct($message) {
+          parent::__construct('RPC Execution exception: ' . $message);
+      }
+  }
+
+} //end Gpf_Rpc_ExecutionException
+
+if (!class_exists('Gpf_Rpc_Object', false)) {
+  class Gpf_Rpc_Object extends Gpf_Object implements Gpf_Rpc_Serializable {
+      
+      private $object;
+      
+      public function __construct($object = null) {
+          $this->object = $object;
+      }
+      
+      public function toObject() {
+          if ($this->object != null) {
+              return $this->object;
+          }
+          return $this;
+      }
+      
+      public function toText() {
+          return var_dump($this);
+      }
+  }
+  
+
+} //end Gpf_Rpc_Object
+
+if (!class_exists('Gpf_Rpc_Request', false)) {
+  class Gpf_Rpc_Request extends Gpf_Object implements Gpf_Rpc_Serializable {
+      protected $className;
+      protected $methodName;
+      private $responseError;
+      protected $response;
+      protected $apiSessionObject = null;
+      private $useNewStyleRequestsEncoding = false;
+  
+      /**
+       * @var Gpf_Rpc_MultiRequest
+       */
+      private $multiRequest;
+  
+      /**
+       * @var Gpf_Rpc_Params
+       */
+      protected $params;
+      private $accountId = null;
+  
+      public function __construct($className, $methodName, Gpf_Api_Session $apiSessionObject = null) {
+          $this->className = $className;
+          $this->methodName = $methodName;
+          $this->params = new Gpf_Rpc_Params();
+          $this->setRequiredParams($this->className, $this->methodName);
+          if($apiSessionObject != null) {
+              $this->apiSessionObject = $apiSessionObject;
+          }
+      }
+  
+      public function useNewStyleRequestsEncoding($useNewStyle) {
+          $this->useNewStyleRequestsEncoding = $useNewStyle;
+      }
+  
+      public function setAccountId($accountId) {
+          $this->accountId = $accountId;
+      }
+  
+      public function addParam($name, $value) {
+          if(is_scalar($value) || is_null($value)) {
+              $this->params->add($name, $value);
+              return;
+          }
+          if($value instanceof Gpf_Rpc_Serializable) {
+              $this->params->add($name, $value->toObject());
+              return;
+          }
+          throw new Gpf_Exception("Cannot add request param: Value ($name=$value) is not scalar or Gpf_Rpc_Serializable");
+      }
+  
+      /**
+       *
+       * @return Gpf_Rpc_MultiRequest
+       */
+      private function getMultiRequest() {
+          if($this->multiRequest === null) {
+              return Gpf_Rpc_MultiRequest::getInstance();
+          }
+          return $this->multiRequest;
+      }
+  
+      public function setUrl($url) {
+          $this->multiRequest = new Gpf_Rpc_MultiRequest();
+          $this->multiRequest->setUrl($url);
+      }
+  
+      public function send() {
+          if($this->apiSessionObject != null) {
+              $this->multiRequest = new Gpf_Rpc_MultiRequest();
+              $this->multiRequest->setUrl($this->apiSessionObject->getUrl());
+              $this->multiRequest->useNewStyleRequestsEncoding($this->useNewStyleRequestsEncoding);
+              $this->multiRequest->setSessionId($this->apiSessionObject->getSessionId());
+              $this->multiRequest->setDebugRequests($this->apiSessionObject->getDebug());
+          }
+           
+          $multiRequest = $this->getMultiRequest();
+          $multiRequest->add($this);
+          $multiRequest->useNewStyleRequestsEncoding($this->useNewStyleRequestsEncoding);
+      }
+  
+      public function sendNow() {
+          $this->send();
+          $this->getMultiRequest()->send();
+      }
+  
+      public function setResponseError($message) {
+          $this->responseError = $message;
+      }
+  
+      public function getResponseError() {
+          return $this->responseError;
+      }
+  
+      public function setResponse($response) {
+          $this->response = $response;
+      }
+  
+      public function toObject() {
+          return $this->params->toObject();
+      }
+  
+      public function toText() {
+          throw new Gpf_Exception("Unimplemented");
+      }
+  
+      /**
+       *
+       * @return stdClass
+       */
+      final public function getStdResponse() {
+          if(isset($this->responseError)) {
+              throw new Gpf_Rpc_ExecutionException($this->responseError);
+          }
+          if($this->response === null) {
+              throw new Gpf_Exception("Request not executed yet.");
+          }
+          return $this->response;
+      }
+  
+      final public function getResponseObject() {
+          return new Gpf_Rpc_Object($this->getStdResponse());
+      }
+  
+      private function setRequiredParams($className, $methodName) {
+          $this->addParam(Gpf_Rpc_Params::CLASS_NAME, $className);
+          $this->addParam(Gpf_Rpc_Params::METHOD_NAME, $methodName);
+      }
+  
+      /**
+       * @param Gpf_Rpc_Params $params
+       */
+      public function setParams(Gpf_Rpc_Params $params) {
+          $originalParams = $this->params;
+          $this->params = $params;
+          $this->setRequiredParams($originalParams->getClass(), $originalParams->getMethod());
+      }
+  }
+  
+
+} //end Gpf_Rpc_Request
+
+if (!interface_exists('Gpf_HttpResponse', false)) {
+  interface Gpf_HttpResponse {
+      public function setCookieValue($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httpOnly = null);
+      
+      public function setHeaderValue($name, $value, $replace = true, $httpResponseCode = null);
+  }
+
+} //end Gpf_HttpResponse
+
+if (!class_exists('Gpf_Http', false)) {
+  class Gpf_Http extends Gpf_Object implements Gpf_HttpResponse {
+      /**
+       *
+       * @var Gpf_HttpResponse
+       */
+      private static $instance = null;
+      
+      /**
+       * @return Gpf_Http
+       */
+      private static function getInstance() {
+          if(self::$instance === null) {
+              self::$instance = new Gpf_Http();
+          }
+          return self::$instance;
+      }
+      
+      public static function setInstance(Gpf_HttpResponse $instance) {
+          self::$instance = $instance;
+      }
+      
+      public static function setCookie($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httpOnly = null) {
+          self::getInstance()->setCookieValue($name, $value, $expire, $path, $domain, $secure, $httpOnly);
+      }
+      
+      public static function setHeader($name, $value, $httpResponseCode = null) {
+          self::getInstance()->setHeaderValue($name, $value, true, $httpResponseCode);
+      }
+      
+      public function setHeaderValue($name, $value, $replace = true, $httpResponseCode = null) {
+          $fileName = '';
+          $line = '';
+          if(headers_sent($fileName, $line)) {
+              throw new Gpf_Exception("Headers already sent in $fileName line $line while setting header $name: $value");
+          }
+          header($name . ': ' . $value, $replace, $httpResponseCode);
+      }
+      
+      public function setCookieValue($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httpOnly = null) {
+          setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly);
+      }
+      
+      public static function getCookie($name) {
+          if (!array_key_exists($name, $_COOKIE)) {
+              return null;
+          }
+          return $_COOKIE[$name];
+      }
+      
+      public static function getUserAgent() {
+          if (isset($_SERVER['HTTP_USER_AGENT'])) {
+              return $_SERVER['HTTP_USER_AGENT'];
+          }
+          return null;
+      }
+      
+      public static function getRemoteIp() {
+          $ip = '';
+          if (isset($_SERVER['REMOTE_ADDR'])) {
+              $ip = $_SERVER['REMOTE_ADDR'];
+          }
+          if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+              $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
+              $ipAddresses = explode(',', $ip);   //HTTP_X_FORWARDED_FOR returns multiple IP addresses
+              $ip = trim($ipAddresses[0]);
+              foreach ($ipAddresses as $ipAddress) {
+                  $ipAddress = trim($ipAddress);
+                  if (self::isValidIp($ipAddress)) {
+                      $ip = $ipAddress;
+                      break;
+                  }
+              }
+          }
+          return $ip;
+      }
+  
+      public static function isSSL() {
+          return @isset($_SERVER['HTTPS']);
+      }
+  
+      private static function isValidIp($ip) {
+          if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
+              return true;
+          }
+          return false;
+      }
+  }
+
+} //end Gpf_Http
+
+if (!interface_exists('Gpf_Templates_HasAttributes', false)) {
+  interface Gpf_Templates_HasAttributes {
+      function getAttributes();
+  }
+
+} //end Gpf_Templates_HasAttributes
+
+if (!class_exists('Gpf_Data_RecordHeader', false)) {
+  class Gpf_Data_RecordHeader extends Gpf_Object {
+      private $ids = array();
+      
+      /**
+       * Create Record header object
+       *
+       * @param array $headerArray
+       */
+      public function __construct($headerArray = null) {
+          if($headerArray === null) {
+              return;
+          }
+          
+          foreach ($headerArray as $id) {
+              $this->add($id);
+          }
+      }
+      
+      public function contains($id) {
+          return array_key_exists($id, $this->ids);
+      }
+  
+      public function add($id) {
+          if($this->contains($id)) {
+              return;
+          }
+  
+          $this->ids[$id] = count($this->ids);
+      }
+  
+      public function getIds() {
+          return array_keys($this->ids);
+      }
+  
+      public function getIndex($id) {
+          if(!$this->contains($id)) {
+              throw new Gpf_Exception("Unknown column '" . $id ."'");
+          }
+          return $this->ids[$id];
+      }
+      
+      public function getSize() {
+          return count($this->ids);
+      }
+  
+      public function toArray() {
+          $response = array();
+          foreach ($this->ids as $columnId => $columnIndex) {
+              $response[] = $columnId;
+          }
+          return $response;
+      }
+          
+      public function toObject() {
+          $result = array();
+          foreach ($this->ids as $columnId => $columnIndex) {
+              $result[] = $columnId;
+          }
+          return $result;
+      }
+  }
+  
+
+} //end Gpf_Data_RecordHeader
+
+if (!interface_exists('Gpf_Data_Row', false)) {
+  interface Gpf_Data_Row {
+      public function get($name);
+  
+      public function set($name, $value);
+  }
+
+} //end Gpf_Data_Row
+
+if (!class_exists('Gpf_Data_Record', false)) {
+  class Gpf_Data_Record extends Gpf_Object implements Iterator, Gpf_Rpc_Serializable,
+      Gpf_Templates_HasAttributes, Gpf_Data_Row {
+      private $record;
+      /**
+       *
+       * @var Gpf_Data_RecordHeader
+       */
+      private $header;
+      private $position;
+  
+      /**
+       * Create record
+       *
+       * @param array $header
+       * @param array $array values of record from array
+       */
+      public function __construct($header, $array = array()) {
+          if (is_array($header)) {
+              $header = new Gpf_Data_RecordHeader($header);
+          }
+          $this->header = $header;
+          $this->record = array_values($array);
+          while(count($this->record) < $this->header->getSize()) {
+              $this->record[] = null;
+          }
+      }
+      
+      function getAttributes() {
+          $ret = array();
+          foreach ($this as $name => $value) {
+              $ret[$name] = $value;
+          }
+          return $ret;
+      }
+      
+      /**
+       * @return Gpf_Data_RecordHeader
+       */
+      public function getHeader() {
+          return $this->header;
+      }
+      
+      public function contains($id) {
+          return $this->header->contains($id);
+      }
+      
+      public function get($id) {
+          $index = $this->header->getIndex($id);
+          return $this->record[$index];
+      }
+  
+      public function set($id, $value) {
+          $index = $this->header->getIndex($id);
+          $this->record[$index] = $value;
+      }
+      
+      public function add($id, $value) {
+          $this->header->add($id);
+          $this->set($id, $value);
+      }
+      
+      public function toObject() {
+          return $this->record;
+      }
+      
+      public function loadFromObject(array $array) {
+          $this->record = $array;
+      }
+      
+      public function toText() {
+          return implode('-', $this->record);
+      }
+  
+      public function current() {
+          if(!isset($this->record[$this->position])) {
+              return null;
+          }
+          return $this->record[$this->position];
+      }
+  
+      public function key() {
+          $ids = $this->header->getIds();
+          return $ids[$this->position];
+      }
+  
+      public function next() {
+          $this->position++;
+      }
+  
+      public function rewind() {
+          $this->position = 0;
+      }
+  
+      public function valid() {
+          return $this->position < $this->header->getSize();
+      }
+  }
+  
+
+} //end Gpf_Data_Record
+
+if (!class_exists('Gpf_Data_Grid', false)) {
+  class Gpf_Data_Grid extends Gpf_Object {
+      /**
+       * @var Gpf_Data_RecordSet
+       */
+  	private $recordset;
+      private $totalCount;
+      
+      public function loadFromObject(stdClass  $object) {
+          $this->recordset = new Gpf_Data_RecordSet();
+          $this->recordset->loadFromObject($object->rows);
+          $this->totalCount = $object->count;
+      }
+      
+      /**
+       * @return Gpf_Data_RecordSet
+       */
+      public function getRecordset() {
+      	return $this->recordset;
+      }
+      
+      public function getTotalCount() {
+      	return $this->totalCount;
+      }
+  }
+  
+
+} //end Gpf_Data_Grid
+
+if (!class_exists('Gpf_Data_Filter', false)) {
+  class Gpf_Data_Filter extends Gpf_Object implements Gpf_Rpc_Serializable {
+      const LIKE = "L";
+      const NOT_LIKE = "NL";
+      const EQUALS = "E";
+      const NOT_EQUALS = "NE";
+      
+      const DATE_EQUALS = "D=";
+      const DATE_GREATER = "D>";
+      const DATE_LOWER = "D<";
+      const DATE_EQUALS_GREATER = "D>=";
+      const DATE_EQUALS_LOWER = "D<=";
+      const DATERANGE_IS = "DP";
+      const TIME_EQUALS = "T=";
+      const TIME_GREATER = "T>";
+      const TIME_LOWER = "T<";
+      const TIME_EQUALS_GREATER = "T>=";
+      const TIME_EQUALS_LOWER = "T<=";
+      
+      const RANGE_TODAY = 'T';
+      const RANGE_YESTERDAY = 'Y';
+      const RANGE_LAST_7_DAYS = 'L7D';
+      const RANGE_LAST_30_DAYS = 'L30D';
+      const RANGE_LAST_90_DAYS = 'L90D';
+      const RANGE_THIS_WEEK = 'TW';
+      const RANGE_LAST_WEEK = 'LW';
+      const RANGE_LAST_2WEEKS = 'L2W';
+      const RANGE_LAST_WORKING_WEEK = 'LWW';
+      const RANGE_THIS_MONTH = 'TM';
+      const RANGE_LAST_MONTH = 'LM';
+      const RANGE_THIS_YEAR = 'TY';
+      const RANGE_LAST_YEAR = 'LY';
+                  
+  	private $code;
+  	private $operator;
+  	private $value;
+  	
+  	public function __construct($code, $operator, $value) {
+  		$this->code = $code;
+  		$this->operator = $operator;
+  		$this->value = $value;
+  	}
+  	
+  	public function toObject() {
+  		return array($this->code, $this->operator, $this->value);
+  	}
+  	
+  	public function toText() {
+  		throw new Gpf_Exception("Unsupported");
+  	}
+  }
+  
+
+} //end Gpf_Data_Filter
+
+if (!class_exists('Gpf_Rpc_GridRequest', false)) {
+  class Gpf_Rpc_GridRequest extends Gpf_Rpc_Request {
+  
+  	private $filters = array();
+  	
+  	private $limit = '';
+  	private $offset = '';
+  	
+  	private $sortColumn = '';
+  	private $sortAscending = false;
+  	
+      /**
+       * @return Gpf_Data_Grid
+       */
+      public function getGrid() {
+          $response = new Gpf_Data_Grid();
+          $response->loadFromObject($this->getStdResponse());
+          return $response;
+      }
+      
+      public function getFilters() {
+          return $this->filters;
+      }
+  
+      /**
+       * 
+       * @return Gpf_Rpc_Params
+       */
+      public function getParams() {
+          return $this->params;
+      }
+  
+  	/**
+       * adds filter to grid
+       *
+       * @param unknown_type $code
+       * @param unknown_type $operator
+       * @param unknown_type $value
+       */
+      public function addFilter($code, $operator, $value) {
+      	$this->filters[] = new Gpf_Data_Filter($code, $operator, $value);
+      }
+      
+      public function setLimit($offset, $limit) {
+      	$this->offset = $offset;
+      	$this->limit = $limit;
+      }
+      
+      public function setSorting($sortColumn, $sortAscending = false) {
+      	$this->sortColumn = $sortColumn;
+      	$this->sortAscending = $sortAscending;
+      }
+      
+      public function send() {
+      	if(count($this->filters) > 0) {
+      		$this->addParam("filters", $this->getFiltersParameter());
+      	}
+  		if($this->sortColumn !== '') {
+  			$this->addParam("sort_col", $this->sortColumn);
+  			$this->addParam("sort_asc", ($this->sortAscending ? 'true' : 'false'));
+  		}
+  		if($this->offset !== '') {
+  			$this->addParam("offset", $this->offset);
+  		}
+  		if($this->limit !== '') {
+  			$this->addParam("limit", $this->limit);
+  		}
+  		
+      	parent::send();
+      }
+      
+      protected function getFiltersParameter() {
+      	$filters = new Gpf_Rpc_Array();
+      	
+      	foreach($this->filters as $filter) {
+      		$filters->add($filter);
+      	}
+      	
+      	return $filters;
+      }
+  }
+  
+  
+
+} //end Gpf_Rpc_GridRequest
+
+if (!class_exists('Gpf_Data_RecordSet', false)) {
+  class Gpf_Data_RecordSet extends Gpf_Object implements IteratorAggregate, Gpf_Rpc_Serializable {
+  
+      const SORT_ASC = 'ASC';
+      const SORT_DESC = 'DESC';
+  
+      protected $_array;
+      /**
+       * @var Gpf_Data_RecordHeader
+       */
+      private $_header;
+  
+      function __construct() {
+          $this->init();
+      }
+  
+      public function loadFromArray($rows) {
+          $this->setHeader($rows[0]);
+  
+          for ($i = 1; $i < count($rows); $i++) {
+              $this->add($rows[$i]);
+          }
+      }
+  
+      public function setHeader($header) {
+          if($header instanceof Gpf_Data_RecordHeader) {
+              $this->_header = $header;
+              return;
+          }
+          $this->_header = new Gpf_Data_RecordHeader($header);
+      }
+  
+      /**
+       * @return Gpf_Data_RecordHeader
+       */
+      public function getHeader() {
+          return $this->_header;
+      }
+  
+      public function addRecord(Gpf_Data_Record $record) {
+          $this->_array[] = $record;
+      }
+  
+      /**
+       * Adds new row to RecordSet
+       *
+       * @param array $record array of data for all columns in record
+       */
+      public function add($record) {
+          $this->addRecord($this->getRecordObject($record));
+      }
+  
+      /**
+       * @return Gpf_Data_Record
+       */
+      public function createRecord() {
+          return new Gpf_Data_Record($this->_header);
+      }
+  
+      public function toObject() {
+          $response = array();
+          $response[] = $this->_header->toObject();
+          foreach ($this->_array as $record) {
+              $response[] = $record->toObject();
+          }
+          return $response;
+      }
+  
+      public function loadFromObject($array) {
+          if($array === null) {
+              throw new Gpf_Exception('Array must be not NULL');
+          }
+          $this->_header = new Gpf_Data_RecordHeader($array[0]);
+          for($i = 1; $i < count($array);$i++) {
+              $record = new Gpf_Data_Record($this->_header);
+              $record->loadFromObject($array[$i]);
+              $this->loadRecordFromObject($record);
+          }
+      }
+  
+      public function sort($column, $sortType = 'ASC') {
+          if (!$this->_header->contains($column)) {
+              throw new Gpf_Exception('Undefined column');
+          }
+          $sorter = new Gpf_Data_RecordSet_Sorter($column, $sortType);
+          $this->_array = $sorter->sort($this->_array);
+      }
+  
+      protected function loadRecordFromObject(Gpf_Data_Record $record) {
+          $this->_array[] = $record;
+      }
+  
+      public function toArray() {
+          $response = array();
+          foreach ($this->_array as $record) {
+              $response[] = $record->getAttributes();
+          }
+          return $response;
+      }
+  
+      public function toText() {
+          $text = '';
+          foreach ($this->_array as $record) {
+              $text .= $record->toText() . "<br>\n";
+          }
+          return $text;
+      }
+  
+      /**
+       * Return number of rows in recordset
+       *
+       * @return integer
+       */
+      public function getSize() {
+          return count($this->_array);
+      }
+  
+      /**
+       * @return Gpf_Data_Record
+       */
+      public function get($i) {
+          return $this->_array[$i];
+      }
+  
+      /**
+       * @param array/Gpf_Data_Record $record
+       * @return Gpf_Data_Record
+       */
+      private function getRecordObject($record) {
+          if(!($record instanceof Gpf_Data_Record)) {
+              $record = new Gpf_Data_Record($this->_header->toArray(), $record);
+          }
+          return $record;
+      }
+  
+      private function init() {
+          $this->_array = array();
+          $this->_header = new Gpf_Data_RecordHeader();
+      }
+  
+      public function clear() {
+          $this->init();
+      }
+  
+      public function load(Gpf_SqlBuilder_SelectBuilder $select) {
+          $this->init();
+  
+          foreach ($select->select->getColumns() as $column) {
+              $this->_header->add($column->getAlias());
+          }
+          $statement = $this->createDatabase()->execute($select->toString());
+          while($rowArray = $statement->fetchRow()) {
+              $this->add($rowArray);
+          }
+      }
+  
+      /**
+       *
+       * @return ArrayIterator
+       */
+      public function getIterator() {
+          return new ArrayIterator($this->_array);
+      }
+  
+      public function getRecord($keyValue = null) {
+          if(!array_key_exists($keyValue, $this->_array)) {
+              return $this->createRecord();
+          }
+          return $this->_array[$keyValue];
+      }
+  
+      public function addColumn($id, $defaultValue = "") {
+          $this->_header->add($id);
+          foreach ($this->_array as $record) {
+              $record->add($id, $defaultValue);
+          }
+      }
+  
+      /**
+       * Creates shalow copy of recordset containing only headers
+       *
+       * @return Gpf_Data_RecordSet
+       */
+      public function toShalowRecordSet() {
+         $copy = new Gpf_Data_RecordSet();
+         $copy->setHeader($this->_header->toArray());
+         return $copy;
+      }
+  }
+  
+  class Gpf_Data_RecordSet_Sorter {
+  
+      private $sortColumn;
+      private $sortType;
+  
+      function __construct($column, $sortType) {
+          $this->sortColumn = $column;
+          $this->sortType = $sortType;
+      }
+  
+      public function sort(array $sortedArray) {
+          usort($sortedArray, array($this, 'compareRecords'));
+          return $sortedArray;
+      }
+  
+      private function compareRecords($record1, $record2) {
+          if ($record1->get($this->sortColumn) == $record2->get($this->sortColumn)) {
+              return 0;
+          }
+          return $this->compare($record1->get($this->sortColumn), $record2->get($this->sortColumn));
+      }
+  
+      private function compare($value1, $value2) {
+          if ($this->sortType == Gpf_Data_RecordSet::SORT_ASC) {
+              return ($value1 < $value2) ? -1 : 1;
+          }
+          return ($value1 < $value2) ? 1 : -1;
+      }
+  }
+
+} //end Gpf_Data_RecordSet
+
+if (!class_exists('Gpf_Data_IndexedRecordSet', false)) {
+  class Gpf_Data_IndexedRecordSet extends Gpf_Data_RecordSet {
+      private $key;
+  
+      /**
+       *
+       * @param int $keyIndex specifies which column should be used as a key
+       */
+      function __construct($key) {
+          parent::__construct();
+          $this->key = $key;
+      }
+      
+      public function addRecord(Gpf_Data_Record $record) {
+          $this->_array[$record->get($this->key)] = $record;
+      }
+      
+      /**
+       * @param String $keyValue
+       * @return Gpf_Data_Record
+       */
+      public function createRecord($keyValue = null) {
+          if($keyValue === null) {
+              return parent::createRecord();
+          }
+          if(!array_key_exists($keyValue, $this->_array)) {
+              $record = $this->createRecord();
+              $record->set($this->key, $keyValue);
+              $this->addRecord($record);
+          }
+          return $this->_array[$keyValue];
+      }
+      
+      protected function loadRecordFromObject(Gpf_Data_Record $record) {    
+          $this->_array[$record->get($this->key)] = $record; 
+      }                
+          
+      /**
+       * @param String $keyValue
+       * @return Gpf_Data_Record
+       */
+      public function getRecord($keyValue = null) {
+          if (!isset($this->_array[$keyValue])) {
+              throw new Gpf_Data_RecordSetNoRowException($keyValue);
+          }
+          return $this->_array[$keyValue];
+      }
+      
+      /**
+       * @param String $keyValue
+       * @return boolean
+       */
+      public function existsRecord($keyValue) {
+          return isset($this->_array[$keyValue]);
+      }
+      
+      /**
+       * @param String $sortOptions (SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING)
+       * @return boolean
+       */
+      public function sortByKeyValue($sortOptions) {
+          return array_multisort($this->_array, $sortOptions);
+      }
+  }
+  
+
+} //end Gpf_Data_IndexedRecordSet
+
+if (!class_exists('Gpf_Net_Http_Request', false)) {
+  class Gpf_Net_Http_Request extends Gpf_Object {
+  	const CRLF = "\r\n";
+  
+  	private $method = 'GET';
+  	private $url;
+  
+  	//proxy server
+  	private $proxyServer = '';
+  	private $proxyPort = '';
+  	private $proxyUser = '';
+  	private $proxyPassword = '';
+  
+  	//URL components
+  	private $scheme = 'http';
+  	private $host = '';
+  	private $port = 80;
+  	private $http_user = '';
+  	private $http_password = '';
+  	private $path = '';
+  	private $query = '';
+  	private $fragment = '';
+  	private $cookies = '';
+  
+  	private $body = '';
+  	private $headers = array();
+  
+  	public function setCookies($cookies) {
+  		$this->cookies = $cookies;
+  	}
+  
+  	public function getCookies() {
+  		return $this->cookies;
+  	}
+  
+      public function getCookiesString() {
+          $cookies = '';
+          if (!is_array($this->cookies)) {
+              return $cookies;
+          }
+          foreach ($this->cookies as $key => $value) {
+              $cookies .= "$key=$value; ";
+          }
+          return $cookies;
+      }
+  
+  	public function getCookiesHeader() {
+  		return "Cookie: " . $this->getCookiesString();
+  	}
+  
+  	public function setUrl($url) {
+  		$this->url = $url;
+  		$this->parseUrl();
+  	}
+  
+  	public function getUrl() {
+  		return $this->url;
+  	}
+  
+  	private function parseUrl() {
+  		$components = parse_url($this->url);
+  		if (array_key_exists('scheme', $components)) {
+  			$this->scheme = $components['scheme'];
+  		}
+  		if (array_key_exists('host', $components)) {
+  			$this->host = $components['host'];
+  		}
+  		if (array_key_exists('port', $components)) {
+  			$this->port = $components['port'];
+  		}
+  		if (array_key_exists('user', $components)) {
+  			$this->http_user = $components['user'];
+  		}
+  		if (array_key_exists('pass', $components)) {
+  			$this->http_password = $components['pass'];
+  		}
+  		if (array_key_exists('path', $components)) {
+  			$this->path = $components['path'];
+  		}
+  		if (array_key_exists('query', $components)) {
+  			$this->query = $components['query'];
+  		}
+  		if (array_key_exists('fragment', $components)) {
+  			$this->fragment = $components['fragment'];
+  		}
+  	}
+  
+  	public function getScheme() {
+  		return $this->scheme;
+  	}
+  
+  	public function getHost() {
+  		if (strlen($this->proxyServer)) {
+  			return $this->proxyServer;
+  		}
+  		return $this->host;
+  	}
+  
+  	public function getPort() {
+  		if (strlen($this->proxyServer)) {
+  			return $this->proxyPort;
+  		}
+  
+  		if (strlen($this->port)) {
+  			return $this->port;
+  		}
+  		return 80;
+  	}
+  
+  	public function getHttpUser() {
+  		return $this->http_user;
+  	}
+  
+      public function setHttpUser($user) {
+          $this->http_user = $user;
+      }
+  
+  	public function getHttpPassword() {
+  		return $this->http_password;
+  	}
+  
+      public function setHttpPassword($pass) {
+          $this->http_password = $pass;
+      }
+  
+  	public function getPath() {
+  		return $this->path;
+  	}
+  
+  	public function getQuery() {
+  		return $this->query;
+  	}
+  
+  	public function addQueryParam($name, $value) {
+  		if (is_array($value)) {
+  			foreach($value as $key => $subValue) {
+  				$this->addQueryParam($name."[".$key."]", $subValue);
+  			}
+  			return;
+  		}
+  		$this->query .= ($this->query == '') ? '?' : '&';
+  		$this->query .= $name.'='.urlencode($value);
+  	}
+  
+  	public function getFragment() {
+  		return $this->fragment;
+  	}
+  
+  	/**
+  	 * Set if request method is GET or POST
+  	 *
+  	 * @param string $method possible values are POST or GET
+  	 */
+  	public function setMethod($method) {
+  		$method = strtoupper($method);
+  		if ($method != 'GET' && $method != 'POST') {
+  			throw new Gpf_Exception('Unsupported HTTP method: ' . $method);
+  		}
+  		$this->method = $method;
+  	}
+  
+  	/**
+  	 * get the request method
+  	 *
+  	 * @access   public
+  	 * @return   string
+  	 */
+  	public function getMethod() {
+  		return $this->method;
+  	}
+  
+  	/**
+  	 * In case request should be redirected through proxy server, set proxy server settings
+  	 * This function should be called after function setHost !!!
+  	 *
+  	 * @param string $server
+  	 * @param string $port
+  	 * @param string $user
+  	 * @param string $password
+  	 */
+  	public function setProxyServer($server, $port, $user, $password) {
+  		$this->proxyServer = $server;
+  		$this->proxyPort = $port;
+  		$this->proxyUser = $user;
+  		$this->proxyPassword = $password;
+  	}
+  
+  	public function getProxyServer() {
+  		return $this->proxyServer;
+  	}
+  
+  	public function getProxyPort() {
+  		return $this->proxyPort;
+  	}
+  
+  	public function getProxyUser() {
+  		return $this->proxyUser;
+  	}
+  
+  	public function getProxyPassword() {
+  		return $this->proxyPassword;
+  	}
+  
+  	public function setBody($body) {
+  		$this->body = $body;
+  	}
+  
+  	public function getBody() {
+  		return $this->body;
+  	}
+  
+  	/**
+  	 * Set header value
+  	 *
+  	 * @param string $name
+  	 * @param string $value
+  	 */
+  	public function setHeader($name, $value) {
+  		$this->headers[$name] = $value;
+  	}
+  
+  	/**
+  	 * Get header value
+  	 *
+  	 * @param string $name
+  	 * @return string
+  	 */
+  	public function getHeader($name) {
+  		if (array_key_exists($name, $this->headers)) {
+  			return $this->headers[$name];
+  		}
+  		return null;
+  	}
+  
+  	/**
+  	 * Return array of headers
+  	 *
+  	 * @return array
+  	 */
+  	public function getHeaders() {
+  		$headers = array();
+  		foreach ($this->headers as $headerName => $headerValue) {
+  			$headers[] = "$headerName: $headerValue";
+  		}
+  		return $headers;
+  	}
+  
+  	private function initHeaders() {
+  		if ($this->getPort() == '80') {
+  			$this->setHeader('Host', $this->getHost());
+  		} else {
+  			$this->setHeader('Host', $this->getHost() . ':' . $this->getPort());
+  		}
+  		if (isset($_SERVER['HTTP_USER_AGENT'])) {
+  			$this->setHeader('User-Agent', $_SERVER['HTTP_USER_AGENT']);
+  		}
+  		if (isset($_SERVER['HTTP_ACCEPT'])) {
+  			$this->setHeader('Accept', $_SERVER['HTTP_ACCEPT']);
+  		}
+  		if (isset($_SERVER['HTTP_ACCEPT_CHARSET'])) {
+  			$this->setHeader('Accept-Charset', $_SERVER['HTTP_ACCEPT_CHARSET']);
+  		}
+  		if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+  			$this->setHeader('Accept-Language', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+  		}
+  		if (isset($_SERVER['HTTP_REFERER'])) {
+  			$this->setHeader('Referer', $_SERVER['HTTP_REFERER']);
+  		}
+  		if ($this->getMethod() == 'POST' && !strlen($this->getHeader("Content-Type"))) {
+  			$this->setHeader("Content-Type", "application/x-www-form-urlencoded");
+  		}
+  		if ($this->getHttpPassword() != '' && $this->getHttpUser() != '') {
+              $this->setHeader('Authorization', 'Basic ' . base64_encode($this->getHttpUser() . ':' . $this->getHttpPassword()));
+  		}
+  
+  		$this->setHeader('Content-Length', strlen($this->getBody()));
+  		$this->setHeader('Connection', 'close');
+  
+  		if (strlen($this->proxyUser)) {
+  			$this->setHeader('Proxy-Authorization',
+              'Basic ' . base64_encode ($this->proxyUser . ':' . $this->proxyPassword));
+  		}
+  
+  	}
+  
+  	public function getUri() {
+  		$uri = $this->getPath();
+  		if (strlen($this->getQuery())) {
+  			$uri .= '?' . $this->getQuery();
+  		}
+  		return $uri;
+  	}
+  
+  	public function toString() {
+  		$this->initHeaders();
+  		$out = sprintf('%s %s HTTP/1.0' . self::CRLF, $this->getMethod(), $this->getUri());
+  		$out .= implode(self::CRLF, $this->getHeaders()) . self::CRLF . $this->getCookiesHeader() . self::CRLF;
+  		$out .= self::CRLF . $this->getBody();
+  		return $out;
+  	}
+  
+  }
+
+} //end Gpf_Net_Http_Request
+
+if (!class_exists('Gpf_Net_Http_ClientBase', false)) {
+  abstract class Gpf_Net_Http_ClientBase extends Gpf_Object {
+      const CONNECTION_TIMEOUT = 20;
+  
+      //TODO: rename this method to "send()"
+      /**
+       * @param Gpf_Net_Http_Request $request
+       * @return Gpf_Net_Http_Response
+       */
+      public function execute(Gpf_Net_Http_Request $request) {
+  
+          if (!$this->isNetworkingEnabled()) {
+              throw new Gpf_Exception($this->_('Network connections are disabled'));
+          }
+  
+          if (!strlen($request->getUrl())) {
+              throw new Gpf_Exception('No URL defined.');
+          }
+  
+          $this->setProxyServer($request);
+          if (Gpf_Php::isFunctionEnabled('curl_init') && Gpf_Php::isFunctionEnabled('curl_exec')) {
+              return $this->executeWithCurl($request);
+          } else {
+              return $this->executeWithSocketOpen($request);
+          }
+      }
+  
+      protected abstract function isNetworkingEnabled();
+  
+      /**
+       * @param Gpf_Net_Http_Request $request
+       * @return Gpf_Net_Http_Response
+       */
+      private function executeWithSocketOpen(Gpf_Net_Http_Request $request) {
+          $scheme = ($request->getScheme() == 'ssl' || $request->getScheme() == 'https') ? 'ssl://' : '';
+          $proxySocket = @fsockopen($scheme . $request->getHost(), $request->getPort(), $errorNr,
+          $errorMessage, self::CONNECTION_TIMEOUT);
+  
+          if($proxySocket === false) {
+              $gpfErrorMessage = $this->_sys('Could not connect to server: %s:%s, Failed with error: %s', $request->getHost(), $request->getPort(), $errorMessage);
+              Gpf_Log::error($gpfErrorMessage);
+              throw new Gpf_Exception($gpfErrorMessage);
+          }
+  
+          $requestText = $request->toString();
+  
+          $result = @fwrite($proxySocket, $requestText);
+          if($result === false || $result != strlen($requestText)) {
+              @fclose($proxySocket);
+              $gpfErrorMessage = $this->_sys('Could not send request to server %s:%s', $request->getHost(), $request->getPort());
+              Gpf_Log::error($gpfErrorMessage);
+              throw new Gpf_Exception($gpfErrorMessage);
+          }
+  
+          $result = '';
+          while (false === @feof($proxySocket)) {
+              try {
+                  if(false === ($data = @fread($proxySocket, 8192))) {
+                      Gpf_Log::error($this->_sys('Could not read from proxy socket'));
+                      throw new Gpf_Exception("could not read from proxy socket");
+                  }
+                  $result .= $data;
+              } catch (Exception $e) {
+                  Gpf_Log::error($this->_sys('Proxy failed: %s', $e->getMessage()));
+                  @fclose($proxySocket);
+                  throw new Gpf_Exception($this->_('Proxy failed: %s', $e->getMessage()));
+              }
+          }
+          @fclose($proxySocket);
+  
+          $response = new Gpf_Net_Http_Response();
+          $response->setResponseText($result);
+  
+          return $response;
+      }
+  
+  
+      /**
+       * @param Gpf_Net_Http_Request $request
+       * @return Gpf_Net_Http_Response
+       *      */
+      private function executeWithCurl(Gpf_Net_Http_Request $request) {
+          $session = curl_init($request->getUrl());
+  
+          if ($request->getMethod() == 'POST') {
+              @curl_setopt ($session, CURLOPT_POST, true);
+              @curl_setopt ($session, CURLOPT_POSTFIELDS, $request->getBody());
+          }
+  
+          $cookies = $request->getCookiesString();
+          if($cookies) {
+              @curl_setopt($session, CURLOPT_COOKIE, $cookies);
+          }
+  
+          @curl_setopt($session, CURLOPT_HEADER, true);
+          @curl_setopt($session, CURLOPT_CONNECTTIMEOUT, self::CONNECTION_TIMEOUT);
+          @curl_setopt($session, CURLOPT_HTTPHEADER, $request->getHeaders());
+          @curl_setopt($session, CURLOPT_FOLLOWLOCATION, true);
+          @curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
+          if ($request->getHttpPassword() != '' && $request->getHttpUser() != '') {
+          	@curl_setopt($session, CURLOPT_USERPWD, $request->getHttpUser() . ":" . $request->getHttpPassword());
+          	@curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
+          }
+          @curl_setopt ($session, CURLOPT_SSL_VERIFYHOST, 0);
+          @curl_setopt ($session, CURLOPT_SSL_VERIFYPEER, 0);
+  
+          $this->setupCurlProxyServer($session, $request);
+  
+          // Make the call
+          $result = curl_exec($session);
+          $error = curl_error($session);
+  
+          curl_close($session);
+  
+          if (strlen($error)) {
+              throw new Gpf_Exception('Curl error: ' . $error . '; ' . $request->getUrl());
+          }
+  
+          $response = new Gpf_Net_Http_Response();
+          $response->setResponseText($result);
+  
+          return $response;
+      }
+  
+      protected function setProxyServer(Gpf_Net_Http_Request $request) {
+          try {
+              $proxyServer = Gpf_Settings::get(Gpf_Settings_Gpf::PROXY_SERVER_SETTING_NAME);
+              $proxyPort = Gpf_Settings::get(Gpf_Settings_Gpf::PROXY_PORT_SETTING_NAME);
+              $proxyUser = Gpf_Settings::get(Gpf_Settings_Gpf::PROXY_USER_SETTING_NAME);
+              $proxyPassword = Gpf_Settings::get(Gpf_Settings_Gpf::PROXY_PASSWORD_SETTING_NAME);
+              $request->setProxyServer($proxyServer, $proxyPort, $proxyUser, $proxyPassword);
+          } catch (Gpf_Exception $e) {
+              $request->setProxyServer('', '', '', '');
+          }
+      }
+  
+      private function setupCurlProxyServer($curlSession, Gpf_Net_Http_Request $request) {
+          if (strlen($request->getProxyServer()) && strlen($request->getProxyPort())) {
+              @curl_setopt($curlSession, CURLOPT_PROXY, $request->getProxyServer() . ':' . $request->getProxyPort());
+              if (strlen($request->getProxyUser())) {
+                  @curl_setopt($curlSession, CURLOPT_PROXYUSERPWD, $request->getProxyUser() . ':' . $request->getProxyPassword());
+              }
+          }
+      }
+  }
+
+} //end Gpf_Net_Http_ClientBase
+
+if (!class_exists('Gpf_Net_Http_Response', false)) {
+  class Gpf_Net_Http_Response extends Gpf_Object {
+  
+      private $responseText = '';
+      private $header = '';
+      private $body = '';
+  
+      public function setResponseText($responseText) {
+          $this->responseText = $responseText;
+          $this->parse();
+      }
+  
+      public function getHeadersText() {
+          return $this->header;
+      }
+  
+      private function getHeaderPosition($pos) {
+          return strpos($this->responseText, "\r\n\r\nHTTP", $pos);
+      }
+  
+      public function getBody() {
+          return $this->body;
+      }
+  
+      private function parse() {
+          $offset = 0;
+          while ($this->getHeaderPosition($offset)) {
+              $offset = $this->getHeaderPosition($offset) + 4;
+          }
+          if (($pos = strpos($this->responseText, "\r\n\r\n", $offset)) > 0) {
+              $this->body = substr($this->responseText, $pos + 4);
+              $this->header = substr($this->responseText, $offset, $pos - $offset);
+              return;
+          }
+          $this->body = '';
+          $this->header = '';
+      }
+  
+  
+  
+      public function getResponseCode() {
+          $headers = $this->getHeaders();
+          preg_match('/.*?\s([0-9]*?)\s.*/', $headers['status'], $match);
+          return $match[1];
+      }
+  
+      public function getHeaders() {
+          return $this->httpParseHeaders($this->header);
+      }
+  
+      private function httpParseHeaders($headers=false){
+          if($headers === false){
+              return false;
+          }
+          $headers = str_replace("\r","",$headers);
+          $headers = explode("\n",$headers);
+          foreach($headers as $value){
+              $header = explode(": ",$value);
+              if($header[0] && !isset($header[1])){
+                  $headerdata['status'] = $header[0];
+              } elseif($header[0] && isset($header[1])){
+                  $headerdata[$header[0]] = $header[1];
+              }
+          }
+          return $headerdata;
+      }
+  }
+
+} //end Gpf_Net_Http_Response
+
+if (!class_exists('Gpf_Rpc_Form', false)) {
+  class Gpf_Rpc_Form extends Gpf_Object implements Gpf_Rpc_Serializable, IteratorAggregate {
+      const FIELD_NAME  = "name";
+      const FIELD_VALUE = "value";
+      const FIELD_ERROR = "error";
+      const FIELD_VALUES = "values";
+  
+      private $isError = false;
+      private $errorMessage = "";
+      private $infoMessage = "";
+      private $status;
+      /**
+       * @var Gpf_Data_IndexedRecordSet
+       */
+      private $fields;
+      /**
+       * @var Gpf_Rpc_Form_Validator_FormValidatorCollection
+       */
+      private $validators;
+  
+      public function __construct(Gpf_Rpc_Params $params = null) {
+          $this->fields = new Gpf_Data_IndexedRecordSet(self::FIELD_NAME);
+  
+          $header = new Gpf_Data_RecordHeader();
+          $header->add(self::FIELD_NAME);
+          $header->add(self::FIELD_VALUE);
+          $header->add(self::FIELD_VALUES);
+          $header->add(self::FIELD_ERROR);
+          $this->fields->setHeader($header);
+          
+          $this->validator = new Gpf_Rpc_Form_Validator_FormValidatorCollection($this);
+          
+          if($params) {
+              $this->loadFieldsFromArray($params->get("fields"));
+          }
+      }
+  
+      /**
+       * @param $validator
+       * @param $fieldName
+       * @param $fieldLabel
+       */
+      public function addValidator(Gpf_Rpc_Form_Validator_Validator $validator, $fieldName, $fieldLabel = null) {
+          $this->validator->addValidator($validator, $fieldName, $fieldLabel);
+      }
+      
+      /**
+       * @return boolean
+       */
+      public function validate() {
+          return $this->validator->validate();
+      }
+      
+      public function loadFieldsFromArray($fields) {
+          for ($i = 1; $i < count($fields); $i++) {
+              $field = $fields[$i];
+              $this->fields->add($field);
+          }
+      }
+      
+      /**
+       *
+       * @return ArrayIterator
+       */
+      public function getIterator() {
+          return $this->fields->getIterator();
+      }
+      
+      public function addField($name, $value) {
+          $record = $this->fields->createRecord($name);
+          $record->set(self::FIELD_VALUE, $value);
+      }
+      
+      public function setField($name, $value, $values = null, $error = "") {
+          $record = $this->fields->createRecord($name);
+          $record->set(self::FIELD_VALUE, $value);
+          $record->set(self::FIELD_VALUES, $values);
+          $record->set(self::FIELD_ERROR, $error);
+      }
+      
+      public function setFieldError($name, $error) {
+          $this->isError = true;
+          $record = $this->fields->getRecord($name);
+          $record->set(self::FIELD_ERROR, $error);
+      }
+      
+      public function getFieldValue($name) {
+          $record = $this->fields->getRecord($name);
+          return $record->get(self::FIELD_VALUE);
+      }
+      
+      public function getFieldError($name) {
+          $record = $this->fields->getRecord($name);
+          return $record->get(self::FIELD_ERROR);
+      }
+      
+      public function existsField($name) {
+          return $this->fields->existsRecord($name);
+      }
+       
+      public function load(Gpf_Data_Row $row) {
+          foreach($row as $columnName => $columnValue) {
+              $this->setField($columnName, $row->get($columnName));
+          }
+      }
+  
+      /**
+       * @return Gpf_Data_IndexedRecordSet
+       */
+      public function getFields() {
+          return $this->fields;
+      }
+      
+      public function fill(Gpf_Data_Row $row) {
+          foreach ($this->fields as $field) {
+              try {
+                  $row->set($field->get(self::FIELD_NAME), $field->get(self::FIELD_VALUE));
+              } catch (Exception $e) {
+              }
+          }
+      }
+      
+      public function toObject() {
+          $response = new stdClass();
+          $response->fields = $this->fields->toObject();
+          if ($this->isSuccessful()) {
+              $response->success = Gpf::YES;
+              $response->message = $this->infoMessage;
+          } else {
+              $response->success = "N";
+              $response->message = $this->errorMessage;
+          }
+          return $response;
+      }
+      
+      public function loadFromObject(stdClass $object) {
+          if ($object->success == Gpf::YES) {
+          	$this->setInfoMessage($object->message);
+          } else {
+          	$this->setErrorMessage($object->message);
+          }
+          
+          $this->fields = new Gpf_Data_IndexedRecordSet(self::FIELD_NAME);
+          $this->fields->loadFromObject($object->fields);
+      }
+      
+      public function toText() {
+          return var_dump($this->toObject());
+      }
+  
+      public function setErrorMessage($message) {
+          $this->isError = true;
+          $this->errorMessage = $message;
+      }
+      
+      public function getErrorMessage() {
+          if ($this->isError) {
+              return $this->errorMessage;
+          }
+          return "";
+      }
+      
+      public function setInfoMessage($message) {
+          $this->infoMessage = $message;
+      }
+      
+      public function setSuccessful() {
+          $this->isError = false;
+      }
+      
+      public function getInfoMessage() {
+          if ($this->isError) {
+              return "";
+          }
+          return $this->infoMessage;
+      }
+      
+      
+      /**
+       * @return boolean
+       */
+      public function isSuccessful() {
+          return !$this->isError;
+      }
+      
+      /**
+       * @return boolean
+       */
+      public function isError() {
+          return $this->isError;
+      }
+  }
+  
+
+} //end Gpf_Rpc_Form
+
+if (!class_exists('Gpf_Rpc_Form_Validator_FormValidatorCollection', false)) {
+  class Gpf_Rpc_Form_Validator_FormValidatorCollection extends Gpf_Object {
+      
+      /**
+       * @var array<Gpf_Rpc_Form_Validator_FieldValidator>
+       */
+      private $validators;
+      /**
+       * @var Gpf_Rpc_Form
+       */
+      private $form;
+      
+      public function __construct(Gpf_Rpc_Form $form) {
+          $this->form = $form;
+          $this->validators = array();
+      }
+      
+      /**
+       * @param $fieldName
+       * @param $validator
+       */
+      public function addValidator(Gpf_Rpc_Form_Validator_Validator $validator, $fieldName, $fieldLabel = null) {
+          if (!array_key_exists($fieldName, $this->validators)) {
+              $this->validators[$fieldName] = new Gpf_Rpc_Form_Validator_FieldValidator(($fieldLabel === null ? $fieldName : $fieldLabel));
+          }
+          $this->validators[$fieldName]->addValidator($validator);
+      }
+      
+      /**
+       * @return boolean
+       */
+      public function validate() {
+          $errorMsg = false;
+          foreach ($this->validators as $fieldName => $fieldValidator) {
+              if (!$fieldValidator->validate($this->form->getFieldValue($fieldName))) {
+                  $errorMsg = true;
+                  $this->form->setFieldError($fieldName, $fieldValidator->getMessage());
+              }
+          }
+          if ($errorMsg) {
+              $this->form->setErrorMessage($this->_('There were errors, please check highlighted fields'));
+          }
+          return !$errorMsg;
+      }
+  }
+
+} //end Gpf_Rpc_Form_Validator_FormValidatorCollection
+
+if (!class_exists('Gpf_Rpc_FormRequest', false)) {
+  class Gpf_Rpc_FormRequest extends Gpf_Rpc_Request {
+      /**
+       * @var Gpf_Rpc_Form
+       */
+      private $fields;
+      
+      public function __construct($className, $methodName, Gpf_Api_Session $apiSessionObject = null) {
+          parent::__construct($className, $methodName, $apiSessionObject);
+          $this->fields = new Gpf_Rpc_Form();
+      }
+      
+      public function send() {
+          $this->addParam('fields', $this->fields->getFields());
+          parent::send();
+      }
+      
+      /**
+       * @return Gpf_Rpc_Form
+       */
+      public function getForm() {
+          $response = new Gpf_Rpc_Form();
+          $response->loadFromObject($this->getStdResponse());
+          return $response;
+      }
+  
+      public function setField($name, $value) {
+          if (is_scalar($value) || $value instanceof Gpf_Rpc_Serializable) {
+              $this->fields->setField($name, $value);
+          } else {
+              throw new Gpf_Exception("Not supported value");
+          }
+      }
+      
+      public function setFields(Gpf_Data_IndexedRecordSet $fields) {
+      	$this->fields->loadFieldsFromArray($fields->toArray());
+      }    
+  }
+
+} //end Gpf_Rpc_FormRequest
+
+if (!class_exists('Gpf_Rpc_RecordSetRequest', false)) {
+  class Gpf_Rpc_RecordSetRequest extends Gpf_Rpc_Request {
+  
+      /**
+       * @return Gpf_Data_IndexedRecordSet
+       */
+      public function getIndexedRecordSet($key) {
+          $response = new Gpf_Data_IndexedRecordSet($key);
+          $response->loadFromObject($this->getStdResponse());
+          return $response;
+      }
+      
+      
+      /**
+       * @return Gpf_Data_RecordSet
+       */
+      public function getRecordSet() {
+          $response = new Gpf_Data_RecordSet();
+          $response->loadFromObject($this->getStdResponse());
+          return $response;
+      }
+  }
+  
+
+} //end Gpf_Rpc_RecordSetRequest
+
+if (!class_exists('Gpf_Rpc_DataRequest', false)) {
+  class Gpf_Rpc_DataRequest extends Gpf_Rpc_Request {
+      /**
+       * @var Gpf_Rpc_Data
+       */
+      private $data;
+      
+      private $filters = array();
+      
+      public function __construct($className, $methodName, Gpf_Api_Session $apiSessionObject = null) {
+          parent::__construct($className, $methodName, $apiSessionObject);
+          $this->data = new Gpf_Rpc_Data();
+      }
+      
+      /**
+       * @return Gpf_Rpc_Data
+       */
+      public function getData() {
+          $response = new Gpf_Rpc_Data();
+          $response->loadFromObject($this->getStdResponse());
+          return $response;
+      }
+  
+      public function setField($name, $value) {
+          if (is_scalar($value) || $value instanceof Gpf_Rpc_Serializable) {
+              $this->data->setParam($name, $value);
+          } else {
+              throw new Gpf_Exception("Not supported value");
+          }
+      }
+      
+      /**
+       * adds filter to grid
+       *
+       * @param unknown_type $code
+       * @param unknown_type $operator
+       * @param unknown_type $value
+       */
+      public function addFilter($code, $operator, $value) {
+          $this->filters[] = new Gpf_Data_Filter($code, $operator, $value);
+      }
+      
+      public function send() {
+          $this->addParam('data', $this->data->getParams());
+          
+          if(count($this->filters) > 0) {
+              $this->addParam("filters", $this->addFiltersParameter());
+          }
+          parent::send();
+      }
+      
+      private function addFiltersParameter() {
+          $filters = new Gpf_Rpc_Array();
+          
+          foreach($this->filters as $filter) {
+              $filters->add($filter);
+          }
+          
+          return $filters;
+      }
+  }
+
+} //end Gpf_Rpc_DataRequest
+
+if (!class_exists('Gpf_Rpc_Data', false)) {
+  class Gpf_Rpc_Data extends Gpf_Object implements Gpf_Rpc_Serializable {
+  	const NAME  = "name";
+      const VALUE = "value";
+      const DATA = "data";
+      const ID = "id";
+      
+  	/**
+  	 * @var Gpf_Data_IndexedRecordSet
+  	 */
+      private $params;
+      
+      /**
+       * @var string
+       */
+      private $id;
+      
+      
+      /**
+       * @var Gpf_Rpc_FilterCollection
+       */
+      private $filters;
+      
+      /**
+       * @var Gpf_Data_IndexedRecordSet
+       */
+      private $response;
+      
+      /**
+       *
+       * @return Gpf_Data_IndexedRecordSet
+       */
+      public function getParams() {
+          return $this->params;
+      }
+      
+      /**
+       * Create instance to handle DataRequest
+       *
+       * @param Gpf_Rpc_Params $params
+       */
+      public function __construct(Gpf_Rpc_Params $params = null) {
+      	if($params === null) {
+      	    $params = new Gpf_Rpc_Params();
+      	}
+          
+      	$this->filters = new Gpf_Rpc_FilterCollection($params);
+          
+      	$this->params = new Gpf_Data_IndexedRecordSet(self::NAME);
+      	$this->params->setHeader(array(self::NAME, self::VALUE));
+          
+          if ($params->exists(self::DATA) !== null) {
+              $this->loadParamsFromArray($params->get(self::DATA));
+          }
+          
+          $this->id = $params->get(self::ID);
+          
+          $this->response = new Gpf_Data_IndexedRecordSet(self::NAME);
+          $this->response->setHeader(array(self::NAME, self::VALUE));
+      }
+      
+     /**
+       * Return id
+       *
+       * @return string
+       */
+      public function getId() {
+          return $this->id;
+      }
+      
+      /**
+       * Return parameter value
+       *
+       * @param String $name
+       * @return unknown
+       */
+      public function getParam($name) {
+          try {
+             return $this->params->getRecord($name)->get(self::VALUE);
+          } catch (Gpf_Data_RecordSetNoRowException $e) {
+             return null;
+          }
+      }
+      
+      public function setParam($name, $value) {
+          self::setValueToRecordset($this->params, $name, $value);
+      }
+      
+      public function loadFromObject(array $object) {
+          $this->response->loadFromObject($object);
+          $this->params->loadFromObject($object);
+      }
+          
+      /**
+       * @return Gpf_Rpc_FilterCollection
+       */
+      public function getFilters() {
+      	return $this->filters;
+      }
+  
+      private static function setValueToRecordset(Gpf_Data_IndexedRecordSet $recordset, $name, $value) {
+          try {
+             $record = $recordset->getRecord($name);
+          } catch (Gpf_Data_RecordSetNoRowException $e) {
+             $record = $recordset->createRecord();
+             $record->set(self::NAME, $name);
+             $recordset->addRecord($record);
+          }
+          $record->set(self::VALUE, $value);
+      }
+      
+      public function setValue($name, $value) {
+          self::setValueToRecordset($this->response, $name, $value);
+      }
+      
+      public function getSize() {
+          return $this->response->getSize();
+      }
+      
+      public function getValue($name) {
+          try {
+              return $this->response->getRecord($name)->get(self::VALUE);
+          } catch (Gpf_Data_RecordSetNoRowException $e) {
+          }
+          return null;
+      }
+      
+      public function toObject() {
+      	return $this->response->toObject();
+      }
+  
+      public function toText() {
+      	return $this->response->toText();
+      }
+  
+      private function loadParamsFromArray($data) {
+          for ($i = 1; $i < count($data); $i++) {
+              $this->params->add($data[$i]);
+          }
+      }
+  }
+
+} //end Gpf_Rpc_Data
+
+if (!class_exists('Gpf_Rpc_FilterCollection', false)) {
+  class Gpf_Rpc_FilterCollection extends Gpf_Object implements IteratorAggregate {
+  
+      /**
+       * @var array of Gpf_SqlBuilder_Filter
+       */
+      private $filters;
+  
+      public function __construct(Gpf_Rpc_Params $params = null) {
+          $this->filters = array();
+          if ($params != null) {
+              $this->init($params);
+          }
+      }
+      
+      public function add(array $filterArray) {
+      	$this->filters[] = new Gpf_SqlBuilder_Filter($filterArray);
+      }
+  
+      private function init(Gpf_Rpc_Params $params) {
+          $filtersArray = $params->get("filters");
+          if (!is_array($filtersArray)) {
+              return;
+          }
+          foreach ($filtersArray as $filterArray) {
+              $this->add($filterArray);
+          }
+      }
+  
+      /**
+       *
+       * @return ArrayIterator
+       */
+      public function getIterator() {
+          return new ArrayIterator($this->filters);
+      }
+  
+      public function addTo(Gpf_SqlBuilder_WhereClause $whereClause) {
+          foreach ($this->filters as $filter) {
+              $filter->addTo($whereClause);
+          }
+      }
+  
+      /**
+       * Returns first filter with specified code.
+       * If filter with specified code does not exists null is returned.
+       *
+       * @param string $code
+       * @return array<Gpf_SqlBuilder_Filter>
+       */
+      public function getFilter($code) {
+      	$filters = array();
+          foreach ($this->filters as $filter) {
+              if ($filter->getCode() == $code) {
+                  $filters[] = $filter;
+              }
+          }
+          return $filters;
+      }
+      
+      public function isFilter($code) {
+          foreach ($this->filters as $filter) {
+              if ($filter->getCode() == $code) {
+                  return true;
+              }
+          }
+          return false;
+      }
+      
+      public function getFilterValue($code) {
+          $filters = $this->getFilter($code);
+          if (count($filters) == 1) {
+              return $filters[0]->getValue();
+          }
+          return "";
+      }
+  
+      public function matches(Gpf_Data_Record $row) {
+          foreach ($this->filters as $filter) {
+              if (!$filter->matches($row)) {
+                  return false;
+              }
+          }
+          return true;
+      }
+  
+      public function getSize() {
+          return count($this->filters);
+      }
+  }
+
+} //end Gpf_Rpc_FilterCollection
+
+if (!class_exists('Gpf_Php', false)) {
+  class Gpf_Php {
+  
+      /**
+       * Check if function is enabled and exists in php
+       *
+       * @param $functionName
+       * @return boolean Returns true if function exists and is enabled
+       */
+      public static function isFunctionEnabled($functionName) {
+          if (function_exists($functionName) && strstr(ini_get("disable_functions"), $functionName) === false) {
+              return true;
+          }
+          return false;
+      }
+      
+      /**
+       * Check if extension is loaded
+       * 
+       * @param $extensionName
+       * @return boolean Returns true if extension is loaded
+       */
+      public static function isExtensionLoaded($extensionName) {
+          return extension_loaded($extensionName);
+      }
+  
+  }
+
+} //end Gpf_Php
+
+if (!class_exists('Gpf_Rpc_ActionRequest', false)) {
+  class Gpf_Rpc_ActionRequest extends Gpf_Rpc_Request {
+      
+      /**
+       * @return Gpf_Rpc_Action
+       */
+      public function getAction() {
+          $action = new Gpf_Rpc_Action(new Gpf_Rpc_Params());
+          $action->loadFromObject($this->getStdResponse());
+          return $action;        
+      }
+  }
+  
+
+} //end Gpf_Rpc_ActionRequest
+
+if (!class_exists('Gpf_Rpc_Action', false)) {
+  class Gpf_Rpc_Action extends Gpf_Object implements Gpf_Rpc_Serializable {
+      private $errorMessage = "";
+      private $infoMessage = "";
+      private $successCount = 0;
+      private $errorCount = 0;
+      /**
+       * @var Gpf_Rpc_Params
+       */
+      private $params; 
+      
+      const IDS = 'ids';
+      const IDS_REQUEST = 'idsRequest';
+      
+      public function __construct(Gpf_Rpc_Params $params, $infoMessage = '', $errorMessage = '') {
+          $this->params = $params;
+          $this->infoMessage = $infoMessage;
+          $this->errorMessage = $errorMessage;
+      }
+  
+      public function getIds() {
+          if ($this->params->exists(self::IDS)) {
+              return new ArrayIterator($this->params->get(self::IDS));
+          }
+          if ($this->params->exists(self::IDS_REQUEST)) {
+              return $this->getRequestIdsIterator();
+          }
+          throw new Gpf_Exception('No ids selected');
+      }
+      
+      public function getParam($name) {
+          return $this->params->get($name);
+      }
+      
+      public function existsParam($name) {
+          return $this->params->exists($name);
+      }
+      
+      protected function getRequestIdsIterator() {
+          $json = new Gpf_Rpc_Json();
+          $requestParams = new Gpf_Rpc_Params($json->decode($this->params->get(self::IDS_REQUEST)));
+          $c = $requestParams->getClass();
+          $gridService = new $c;
+          if(!($gridService instanceof Gpf_View_GridService)) {
+              throw new Gpf_Exception(sprintf('%s is not Gpf_View_GridService class.', $requestParams->getClass()));
+          }
+          return $gridService->getIdsIterator($requestParams);
+      }
+      
+      public function toObject() {
+          $response = new stdClass();
+          $response->success = Gpf::YES;
+          
+          $response->errorMessage = "";
+          if ($this->errorCount > 0) {
+              $response->success = "N";
+              $response->errorMessage = $this->_($this->errorMessage, $this->errorCount);
+          }
+          
+          $response->infoMessage = "";
+          if ($this->successCount > 0) {
+              $response->infoMessage = $this->_($this->infoMessage, $this->successCount);
+          }
+          
+          return $response;
+      }
+      
+      public function loadFromObject(stdClass $object) {
+          $this->errorMessage = $object->errorMessage;
+          $this->infoMessage = $object->infoMessage;
+  
+          if($object->success == Gpf::NO) {
+              $this->addError();
+          }
+      }
+      
+      public function isError() {
+          return $this->errorCount > 0;
+      }
+      
+      public function toText() {
+          if ($this->isError()) {
+              return $this->_($this->errorMessage, $this->errorCount);
+          } else {
+              return $this->_($this->infoMessage, $this->successCount);
+          }
+      }
+  
+      public function setErrorMessage($message) {
+          $this->errorMessage = $message;
+      }
+      
+      public function getErrorMessage() {
+          return $this->errorMessage;
+      }
+      
+      public function setInfoMessage($message) {
+          $this->infoMessage = $message;
+      }
+  
+      public function addOk() {
+          $this->successCount++;
+      }
+  
+      public function addError() {
+          $this->errorCount++;
+      }
+      
+  }
+  
+
+} //end Gpf_Rpc_Action
+
+if (!class_exists('Gpf_Rpc_Map', false)) {
+  class Gpf_Rpc_Map extends Gpf_Object implements Gpf_Rpc_Serializable {
+  
+      function __construct(array  $array){
+          $this->array = $array;
+      }
+  
+      public function toObject() {
+          return $this->array;
+      }
+  
+      public function toText() {
+          return var_dump($this->array);
+      }
+  }
+  
+
+} //end Gpf_Rpc_Map
+
+if (!class_exists('Gpf_Log', false)) {
+  class Gpf_Log  {
+      const CRITICAL = 50;
+      const ERROR = 40;
+      const WARNING = 30;
+      const INFO = 20;
+      const DEBUG = 10;
+      
+      /**
+       * @var Gpf_Log_Logger
+       */
+      private static $logger;
+         
+      /**
+       * @return Gpf_Log_Logger
+       */
+      private static function getLogger() {
+          if (self::$logger == null) {
+              self::$logger = Gpf_Log_Logger::getInstance();
+          }
+          return self::$logger;
+      }
+      
+      private function __construct() {
+      }
+      
+      public static function disableType($type) {
+          self::getLogger()->disableType($type);
+      }
+      
+      public static function enableAllTypes() {
+          self::getLogger()->enableAllTypes();
+      }
+      
+      /**
+       * logs message
+       *
+       * @param string $message
+       * @param string $logLevel
+       * @param string $logGroup
+       */
+      public static function log($message, $logLevel, $logGroup = null) {
+          self::getLogger()->log($message, $logLevel, $logGroup);
+      }
+  
+      /**
+       * logs debug message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public static function debug($message, $logGroup = null) {
+          self::getLogger()->debug($message, $logGroup);
+      }
+          
+      /**
+       * logs info message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public static function info($message, $logGroup = null) {
+          self::getLogger()->info($message, $logGroup);
+      }
+      
+      /**
+       * logs warning message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public static function warning($message, $logGroup = null) {
+          self::getLogger()->warning($message, $logGroup);
+      }
+      
+      /**
+       * logs error message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public static function error($message, $logGroup = null) {
+          self::getLogger()->error($message, $logGroup);
+      }
+  
+      /**
+       * logs critical error message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public static function critical($message, $logGroup = null) {
+          self::getLogger()->critical($message, $logGroup);
+      }
+  
+      /**
+       * Attach new log system
+       *
+       * @param string $type 
+       *      Gpf_Log_LoggerDisplay::TYPE
+       *      Gpf_Log_LoggerFile::TYPE
+       *      Gpf_Log_LoggerDatabase::TYPE
+       * @param string $logLevel
+       *      Gpf_Log::CRITICAL
+       *      Gpf_Log::ERROR
+       *      Gpf_Log::WARNING
+       *      Gpf_Log::INFO
+       *      Gpf_Log::DEBUG
+       * @return Gpf_Log_LoggerBase
+       */
+      public static function addLogger($type, $logLevel) {
+          if($type instanceof Gpf_Log_LoggerBase) {
+              return self::getLogger()->addLogger($type, $logLevel);
+          }
+          return self::getLogger()->add($type, $logLevel);        
+      }
+      
+      public static function removeAll() {
+          self::getLogger()->removeAll();
+      }
+  
+      public static function isLogToDisplay() {
+          return self::getLogger()->isLogToDisplay();
+      }
+  }
+
+} //end Gpf_Log
+
+if (!class_exists('Gpf_Log_Logger', false)) {
+  class Gpf_Log_Logger extends Gpf_Object {
+      /**
+       * @var array
+       */
+      static private $instances = array();
+      /**
+       * @var array
+       */
+      private $loggers = array();
+  
+      /**
+       * array of custom parameters
+       */
+      private $customParameters = array();
+      
+      private $disabledTypes = array();
+      
+      private $group = null;
+      private $type = null;
+      private $logToDisplay = false;
+      
+      /**
+       * returns instance of logger class.
+       * You can add instance name, if you want to have multiple independent instances of logger
+       *
+       * @param string $instanceName
+       * @return Gpf_Log_Logger
+       */
+      public static function getInstance($instanceName = '_') {
+          if($instanceName == '') {
+              $instanceName = '_';
+          }
+  
+          if (!array_key_exists($instanceName, self::$instances)) {
+              self::$instances[$instanceName] = new Gpf_Log_Logger();
+          }
+          $instance = self::$instances[$instanceName];
+          return $instance;
+      }
+      
+      public static function isLoggerInsert($sqlString) {
+          return strpos($sqlString, 'INSERT INTO ' . Gpf_Db_Table_Logs::getName()) !== false;
+      }
+      
+      /**
+       * attachs new log system
+       *
+       * @param unknown_type $system
+       * @return Gpf_Log_LoggerBase
+       */
+      public function add($type, $logLevel) {
+      	if($type == Gpf_Log_LoggerDisplay::TYPE) {
+      		$this->logToDisplay = true;
+      	}
+          return $this->addLogger($this->create($type), $logLevel);
+      }
+  
+      /**
+       * Checks if logger with te specified type was already initialized
+       *
+       * @param unknown_type $type
+       * @return unknown
+       */
+      public function checkLoggerTypeExists($type) {
+          if(array_key_exists($type, $this->loggers)) {
+          	return true;
+          }
+      	
+          return false;
+      }
+      
+      /**
+       * returns true if debugging writes log to display
+       *
+       * @return boolean
+       */
+      public function isLogToDisplay() {
+      	return $this->logToDisplay && !in_array(Gpf_Log_LoggerDisplay::TYPE, $this->disabledTypes);
+      }
+      
+      public function removeAll() {
+          $this->loggers = array();
+          $this->customParameters = array();
+          $this->disabledTypes = array();
+          $this->logToDisplay = false;
+          $this->group = null;
+      }
+      
+      /**
+       *
+       * @param Gpf_Log_LoggerBase $logger
+       * @param int $logLevel
+       * @return Gpf_Log_LoggerBase
+       */
+      public function addLogger(Gpf_Log_LoggerBase $logger, $logLevel) {
+          $this->enableType($logger->getType());
+          if($logger->getType() == Gpf_Log_LoggerDisplay::TYPE) {
+              $this->logToDisplay = true;
+          }
+          if(!$this->checkLoggerTypeExists($logger->getType())) {
+          	$logger->setLogLevel($logLevel);
+          	$this->loggers[$logger->getType()] = $logger;
+          	return $logger;
+          } else {
+          	$ll = new Gpf_Log_LoggerDatabase();
+          	$existingLogger = $this->loggers[$logger->getType()];
+          	if($existingLogger->getLogLevel() > $logLevel) {
+          		$existingLogger->setLogLevel($logLevel);
+          	}
+          	return $existingLogger;
+          }
+      }
+      
+      public function getGroup() {
+          return $this->group;
+      }
+          
+      public function setGroup($group = null) {
+          $this->group = $group;
+          if($group === null) {
+              $this->group = Gpf_Common_String::generateId(10);
+          }
+      }
+      
+      public function setType($type) {
+          $this->type = $type;
+      }
+      
+      /**
+       * function sets custom parameter for the logger
+       *
+       * @param string $name
+       * @param string $value
+       */
+      public function setCustomParameter($name, $value) {
+          $this->customParameters[$name] = $value;
+      }
+  
+      /**
+       * returns custom parameter
+       *
+       * @param string $name
+       * @return string
+       */
+      public function getCustomParameter($name) {
+          if(isset($this->customParameters[$name])) {
+              return $this->customParameters[$name];
+          }
+          return '';
+      }
+  
+      /**
+       * logs message
+       *
+       * @param string $message
+       * @param string $logLevel
+       * @param string $logGroup
+       */
+      public function log($message, $logLevel, $logGroup = null) {
+          $time = time();
+          $group = $logGroup;
+          if($this->group !== null) {
+              $group = $this->group;
+              if($logGroup !== null) {
+                  $group .= ' ' . $logGroup;
+              }
+          }
+  	
+          $callingFile = $this->findLogFile();
+          $file = $callingFile['file'];
+          if(isset($callingFile['classVariables'])) {
+          	$file .= ' '.$callingFile['classVariables'];
+          }
+          $line = $callingFile['line'];
+  
+          $ip = Gpf_Http::getRemoteIp();
+          if ($ip = '') {
+              $ip = '127.0.0.1';
+          }
+  
+          foreach ($this->loggers as $logger) {
+          	if(!in_array($logger->getType(), $this->disabledTypes)) {
+                  $logger->logMessage($time, $message, $logLevel, $group, $ip, $file, $line, $this->type);
+              }
+          }
+      }
+      
+      /**
+       * logs debug message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public function debug($message, $logGroup = null) {
+          $this->log($message, Gpf_Log::DEBUG, $logGroup);
+      }
+  
+      /**
+       * logs info message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public function info($message, $logGroup = null) {
+          $this->log($message, Gpf_Log::INFO, $logGroup);
+      }
+  
+      /**
+       * logs warning message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public function warning($message, $logGroup = null) {
+          $this->log($message, Gpf_Log::WARNING, $logGroup);
+      }
+  
+      /**
+       * logs error message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public function error($message, $logGroup = null) {
+          $this->log($message, Gpf_Log::ERROR, $logGroup);
+      }
+  
+      /**
+       * logs critical error message
+       *
+       * @param string $message
+       * @param string $logGroup
+       */
+      public function critical($message, $logGroup = null) {
+          $this->log($message, Gpf_Log::CRITICAL, $logGroup);
+      }
+  
+      public function disableType($type) {
+          $this->disabledTypes[$type] = $type;
+      }
+  
+      public function enableType($type) {
+          if(in_array($type, $this->disabledTypes)) {
+              unset($this->disabledTypes[$type]);
+          }
+      }
+      
+      public function enableAllTypes() {
+          $this->disabledTypes = array();
+      }
+      
+      /**
+       *
+       * @return Gpf_Log_LoggerBase
+       */
+      private function create($type) {
+          switch($type) {
+              case Gpf_Log_LoggerDisplay::TYPE:
+                  return new Gpf_Log_LoggerDisplay();
+              case Gpf_Log_LoggerFile::TYPE:
+                  return new Gpf_Log_LoggerFile();
+              case Gpf_Log_LoggerDatabase::TYPE:
+              case 'db':
+                  return new Gpf_Log_LoggerDatabase();
+          }
+          throw new Gpf_Log_Exception("Log system '$type' does not exist");
+      }
+      
+      private function findLogFile() {
+          $calls = debug_backtrace();
+          
+          $foundObject = null;
+          
+          // special handling for sql benchmarks
+          if($this->sqlBenchmarkFound($calls)) {
+              $foundObject = $this->findFileBySqlBenchmark();
+          }
+  
+          if($foundObject == null) {
+              $foundObject = $this->findFileByCallingMethod($calls);
+          }
+          if($foundObject == null) {
+              $foundObject = $this->findLatestObjectBeforeString("Logger.class.php");
+          }
+          if($foundObject == null) {
+              $last = count($calls);
+              $last -= 1;
+              if($last <0) {
+                  $last = 0;
+              }
+          
+              $foundObject = $calls[$last];
+          }
+          
+          return $foundObject;
+      }
+      
+      private function sqlBenchmarkFound($calls) {
+          foreach($calls as $obj) {
+              if(isset($obj['function']) && $obj['function'] == "sqlBenchmarkEnd") {
+                  return true;
+              }
+          }
+          return false;
+      }
+      
+      private function findFileBySqlBenchmark() {
+          $foundFile = $this->findLatestObjectBeforeString("DbEngine");
+          if($foundFile != null && is_object($foundFile['object'])) {
+              $foundFile['classVariables'] = $this->getObjectVariables($foundFile['object']);
+          }
+          return $foundFile;
+      }
+      
+      private function getObjectVariables($object) {
+          if(is_object($object)) {
+              $class = get_class($object);
+              $methods = get_class_methods($class);
+              if(in_array("__toString", $methods)) {
+                  return $object->__toString();
+              }
+          }
+          return '';
+      }
+      
+      private function findFileByCallingMethod($calls) {
+          $functionNames = array('debug', 'info', 'warning', 'error', 'critical', 'log');
+          $foundObject = null;
+          foreach($functionNames as $name) {
+              $foundObject = $this->findCallingFile($calls, $name);
+              if($foundObject != null) {
+                  return $foundObject;
+              }
+          }
+          
+          return null;
+      }
+      
+      private function findCallingFile($calls, $functionName) {
+          foreach($calls as $obj) {
+              if(isset($obj['function']) && $obj['function'] == $functionName) {
+                  return $obj;
+              }
+          }
+          
+          return null;
+      }
+      
+      private function findLatestObjectBeforeString($text) {
+          $callsReversed = array_reverse( debug_backtrace() );
+      
+          $lastObject = null;
+          foreach($callsReversed as $obj) {
+              if(!isset($obj['file'])) {
+                  continue;
+              }
+              $pos = strpos($obj['file'], $text);
+              if($pos !== false && $lastObject != null) {
+                  return $lastObject;
+              }
+              $lastObject = $obj;
+          }
+          return null;
+      }
+  }
+
+} //end Gpf_Log_Logger
+
+if (!class_exists('Gpf_Api_IncompatibleVersionException', false)) {
+  class Gpf_Api_IncompatibleVersionException extends Exception {
+  
+      private $apiLink;
+  
+      public function __construct($url) {
+          $this->apiLink = $url. '?C=Gpf_Api_DownloadAPI&M=download&FormRequest=Y&FormResponse=Y';
+          parent::__construct('Version of API not corresponds to the Application version. Please <a href="' . $this->apiLink . '">download latest version of API</a>.', 0);
+      }
+      
+      public function getApiDownloadLink() {
+          return $this->apiLink;
+      }
+  
+  }
+
+} //end Gpf_Api_IncompatibleVersionException
+
+if (!class_exists('Gpf_Api_Session', false)) {
+  class Gpf_Api_Session extends Gpf_Object {
+      const MERCHANT = 'M';
+      const AFFILIATE = 'A';
+  
+  	private $url;
+  	private $sessionId = '';
+  	private $debug = false;
+  	private $message = '';
+  	private $roleType = '';
+  
+  	public function __construct($url) {
+  		$this->url = $url;
+  	}
+  	/**
+  	 *
+  	 * @param $username
+  	 * @param $password
+  	 * @param $roleType Gpf_Api_Session::MERCHANT or Gpf_Api_Session::AFFILIATE
+  	 * @param $languageCode language code (e.g. en-US, de-DE, sk, cz, du, ...)
+  	 * @return boolean true if user was successfully logged
+  	 */
+  	public function login($username, $password, $roleType = self::MERCHANT, $languageCode = null) {
+  		$request = new Gpf_Rpc_FormRequest("Gpf_Api_AuthService", "authenticate");
+  		$request->setUrl($this->url);
+  		$request->setField("username", $username);
+  		$request->setField("password", $password);
+  		$request->setField("roleType", $roleType);
+  		$request->setField('isFromApi', Gpf::YES);
+  		$request->setField('apiVersion', self::getAPIVersion());
+  		if($languageCode != null) {
+  		    $request->setField("language", $languageCode);
+  		}
+  
+  		$this->roleType = $roleType;
+  
+  		try {
+  			$request->sendNow();
+  		} catch(Exception $e) {
+  			$this->setMessage("Connection error: ".$e->getMessage());
+  			return false;
+  		}
+  
+  		$form = $request->getForm();
+  		$this->checkApiVersion($form);
+  
+  		$this->message = $form->getInfoMessage();
+  
+  		if($form->isSuccessful() && $form->existsField("S")) {
+  			$this->sessionId = $form->getFieldValue("S");
+  			$this->setMessage($form->getInfoMessage());
+  			return true;
+  		}
+  
+  		$this->setMessage($form->getErrorMessage());
+  		return false;
+  	}
+  
+      /**
+       * Get version of installed application
+       *
+       * @return string version of installed application
+       */
+      public function getAppVersion() {
+          $request = new Gpf_Rpc_FormRequest("Gpf_Api_AuthService", "getAppVersion");
+          $request->setUrl($this->url);
+  
+          try {
+              $request->sendNow();
+          } catch(Exception $e) {
+              $this->setMessage("Connection error: ".$e->getMessage());
+              return false;
+          }
+  
+          $form = $request->getForm();
+          return $form->getFieldValue('version');
+      }
+  
+  
+  	public function getMessage() {
+  		return $this->message;
+  	}
+  
+  	private function setMessage($msg) {
+  		$this->message = $msg;
+  	}
+  
+  	public function getDebug() {
+  		return $this->debug;
+  	}
+  
+  	public function setDebug($debug = true) {
+  		$this->debug = $debug;
+  	}
+  
+  	public function getSessionId() {
+  		return $this->sessionId;
+  	}
+  
+      public function setSessionId($sessionId, $roleType = self::MERCHANT) {
+          $this->sessionId = $sessionId;
+          $this->roleType = $roleType;
+      }
+  
+  	public function getRoleType() {
+  		return $this->roleType;
+  	}
+  
+  	public function getUrl() {
+  		return $this->url;
+  	}
+  
+  	public function getUrlWithSessionInfo($url) {
+  	    if (strpos($url, '?') === false) {
+  	        return $url . '?S=' . $this->getSessionId();
+  	    }
+  	    return $url . '&S=' . $this->getSessionId();
+  	}
+  
+  	/**
+  	 * Check API version
+  	 * (has to be protected because of Drupal integration)
+  	 *
+  	 * @param $latestVersion
+  	 * @throws Gpf_Api_IncompatibleVersionException
+  	 */
+  	protected function checkApiVersion(Gpf_Rpc_Form $form) {
+  		if ($form->getFieldValue('correspondsApi') === Gpf::NO) {
+  		    $exception = new Gpf_Api_IncompatibleVersionException($this->url);
+  		    trigger_error($exception->getMessage(), E_USER_NOTICE);
+  		}
+  	}
+  
+  	/**
+  	 * @return String
+  	 */
+  	public static function getAPIVersion($fileName = __FILE__) {
+  		$fileHandler = fopen($fileName, 'r');
+  		fseek($fileHandler, -6 -32, SEEK_END);
+  		$hash = fgets($fileHandler);
+  		return substr($hash, 0, -1);
+  	}
+  }
+
+} //end Gpf_Api_Session
+
+if (!class_exists('Gpf_Rpc_Json', false)) {
+  class Gpf_Rpc_Json implements Gpf_Rpc_DataEncoder, Gpf_Rpc_DataDecoder {
+      /**
+       * Marker constant for Services_JSON::decode(), used to flag stack state
+       */
+      const SERVICES_JSON_SLICE = 1;
+  
+      /**
+       * Marker constant for Services_JSON::decode(), used to flag stack state
+       */
+      const SERVICES_JSON_IN_STR = 2;
+  
+      /**
+       * Marker constant for Services_JSON::decode(), used to flag stack state
+       */
+      const SERVICES_JSON_IN_ARR = 3;
+  
+      /**
+       * Marker constant for Services_JSON::decode(), used to flag stack state
+       */
+      const SERVICES_JSON_IN_OBJ = 4;
+  
+      /**
+       * Marker constant for Services_JSON::decode(), used to flag stack state
+       */
+      const SERVICES_JSON_IN_CMT = 5;
+  
+      /**
+       * Behavior switch for Services_JSON::decode()
+       */
+      const SERVICES_JSON_LOOSE_TYPE = 16;
+  
+      /**
+       * Behavior switch for Services_JSON::decode()
+       */
+      const SERVICES_JSON_SUPPRESS_ERRORS = 32;
+  
+      /**
+       * constructs a new JSON instance
+       *
+       * @param    int     $use    object behavior flags; combine with boolean-OR
+       *
+       *                           possible values:
+       *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
+       *                                   "{...}" syntax creates associative arrays
+       *                                   instead of objects in decode().
+       *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
+       *                                   Values which can't be encoded (e.g. resources)
+       *                                   appear as NULL instead of throwing errors.
+       *                                   By default, a deeply-nested resource will
+       *                                   bubble up with an error, so all return values
+       *                                   from encode() should be checked with isError()
+       */
+      function __construct($use = 0)
+      {
+          $this->use = $use;
+      }
+  
+      /**
+       * convert a string from one UTF-16 char to one UTF-8 char
+       *
+       * Normally should be handled by mb_convert_encoding, but
+       * provides a slower PHP-only method for installations
+       * that lack the multibye string extension.
+       *
+       * @param    string  $utf16  UTF-16 character
+       * @return   string  UTF-8 character
+       * @access   private
+       */
+      function utf162utf8($utf16)
+      {
+          // oh please oh please oh please oh please oh please
+          if(Gpf_Php::isFunctionEnabled('mb_convert_encoding')) {
+              return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
+          }
+  
+          $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
+  
+          switch(true) {
+              case ((0x7F & $bytes) == $bytes):
+                  // this case should never be reached, because we are in ASCII range
+                  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                  return chr(0x7F & $bytes);
+  
+              case (0x07FF & $bytes) == $bytes:
+                  // return a 2-byte UTF-8 character
+                  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                  return chr(0xC0 | (($bytes >> 6) & 0x1F))
+                  . chr(0x80 | ($bytes & 0x3F));
+  
+              case (0xFFFF & $bytes) == $bytes:
+                  // return a 3-byte UTF-8 character
+                  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                  return chr(0xE0 | (($bytes >> 12) & 0x0F))
+                  . chr(0x80 | (($bytes >> 6) & 0x3F))
+                  . chr(0x80 | ($bytes & 0x3F));
+          }
+  
+          // ignoring UTF-32 for now, sorry
+          return '';
+      }
+  
+      /**
+       * convert a string from one UTF-8 char to one UTF-16 char
+       *
+       * Normally should be handled by mb_convert_encoding, but
+       * provides a slower PHP-only method for installations
+       * that lack the multibye string extension.
+       *
+       * @param    string  $utf8   UTF-8 character
+       * @return   string  UTF-16 character
+       * @access   private
+       */
+      function utf82utf16($utf8)
+      {
+          // oh please oh please oh please oh please oh please
+          if(Gpf_Php::isFunctionEnabled('mb_convert_encoding')) {
+              return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
+          }
+  
+          switch(strlen($utf8)) {
+              case 1:
+                  // this case should never be reached, because we are in ASCII range
+                  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                  return $utf8;
+  
+              case 2:
+                  // return a UTF-16 character from a 2-byte UTF-8 char
+                  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                  return chr(0x07 & (ord($utf8{0}) >> 2))
+                  . chr((0xC0 & (ord($utf8{0}) << 6))
+                  | (0x3F & ord($utf8{1})));
+  
+              case 3:
+                  // return a UTF-16 character from a 3-byte UTF-8 char
+                  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                  return chr((0xF0 & (ord($utf8{0}) << 4))
+                  | (0x0F & (ord($utf8{1}) >> 2)))
+                  . chr((0xC0 & (ord($utf8{1}) << 6))
+                  | (0x7F & ord($utf8{2})));
+          }
+  
+          // ignoring UTF-32 for now, sorry
+          return '';
+      }
+  
+      public function encodeResponse(Gpf_Rpc_Serializable $response) {
+          return $this->encode($response->toObject());
+      }
+  
+      /**
+       * encodes an arbitrary variable into JSON format
+       *
+       * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
+       *                           see argument 1 to Services_JSON() above for array-parsing behavior.
+       *                           if var is a strng, note that encode() always expects it
+       *                           to be in ASCII or UTF-8 format!
+       *
+       * @return   mixed   JSON string representation of input var or an error if a problem occurs
+       * @access   public
+       */
+      public function encode($var) {
+          if ($this->isJsonEncodeEnabled()) {
+              return @json_encode($var);
+          }
+          switch (gettype($var)) {
+              case 'boolean':
+                  return $var ? 'true' : 'false';
+  
+              case 'NULL':
+                  return 'null';
+  
+              case 'integer':
+                  return (int) $var;
+  
+              case 'double':
+              case 'float':
+                  return (float) $var;
+  
+              case 'string':
+                  // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
+                  $ascii = '';
+                  $strlen_var = strlen($var);
+  
+                  /*
+                   * Iterate over every character in the string,
+                   * escaping with a slash or encoding to UTF-8 where necessary
+                   */
+                  for ($c = 0; $c < $strlen_var; ++$c) {
+  
+                      $ord_var_c = ord($var{$c});
+  
+                      switch (true) {
+                          case $ord_var_c == 0x08:
+                              $ascii .= '\b';
+                              break;
+                          case $ord_var_c == 0x09:
+                              $ascii .= '\t';
+                              break;
+                          case $ord_var_c == 0x0A:
+                              $ascii .= '\n';
+                              break;
+                          case $ord_var_c == 0x0C:
+                              $ascii .= '\f';
+                              break;
+                          case $ord_var_c == 0x0D:
+                              $ascii .= '\r';
+                              break;
+  
+                          case $ord_var_c == 0x22:
+                          case $ord_var_c == 0x2F:
+                          case $ord_var_c == 0x5C:
+                              // double quote, slash, slosh
+                              $ascii .= '\\'.$var{$c};
+                              break;
+  
+                          case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
+                              // characters U-00000000 - U-0000007F (same as ASCII)
+                              $ascii .= $var{$c};
+                              break;
+  
+                          case (($ord_var_c & 0xE0) == 0xC0):
+                              // characters U-00000080 - U-000007FF, mask 1 1 0 X X X X X
+                              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                              $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
+                              $c += 1;
+                              $utf16 = $this->utf82utf16($char);
+                              $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                              break;
+  
+                          case (($ord_var_c & 0xF0) == 0xE0):
+                              // characters U-00000800 - U-0000FFFF, mask 1 1 1 0 X X X X
+                              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                              $char = pack('C*', $ord_var_c,
+                              ord($var{$c + 1}),
+                              ord($var{$c + 2}));
+                              $c += 2;
+                              $utf16 = $this->utf82utf16($char);
+                              $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                              break;
+  
+                          case (($ord_var_c & 0xF8) == 0xF0):
+                              // characters U-00010000 - U-001FFFFF, mask 1 1 1 1 0 X X X
+                              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                              $char = pack('C*', $ord_var_c,
+                              ord($var{$c + 1}),
+                              ord($var{$c + 2}),
+                              ord($var{$c + 3}));
+                              $c += 3;
+                              $utf16 = $this->utf82utf16($char);
+                              $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                              break;
+  
+                          case (($ord_var_c & 0xFC) == 0xF8):
+                              // characters U-00200000 - U-03FFFFFF, mask 111110XX
+                              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                              $char = pack('C*', $ord_var_c,
+                              ord($var{$c + 1}),
+                              ord($var{$c + 2}),
+                              ord($var{$c + 3}),
+                              ord($var{$c + 4}));
+                              $c += 4;
+                              $utf16 = $this->utf82utf16($char);
+                              $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                              break;
+  
+                          case (($ord_var_c & 0xFE) == 0xFC):
+                              // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+                              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                              $char = pack('C*', $ord_var_c,
+                              ord($var{$c + 1}),
+                              ord($var{$c + 2}),
+                              ord($var{$c + 3}),
+                              ord($var{$c + 4}),
+                              ord($var{$c + 5}));
+                              $c += 5;
+                              $utf16 = $this->utf82utf16($char);
+                              $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                              break;
+                      }
+                  }
+  
+                  return '"'.$ascii.'"';
+  
+                          case 'array':
+                              /*
+                               * As per JSON spec if any array key is not an integer
+                               * we must treat the the whole array as an object. We
+                               * also try to catch a sparsely populated associative
+                               * array with numeric keys here because some JS engines
+                               * will create an array with empty indexes up to
+                               * max_index which can cause memory issues and because
+                               * the keys, which may be relevant, will be remapped
+                               * otherwise.
+                               *
+                               * As per the ECMA and JSON specification an object may
+                               * have any string as a property. Unfortunately due to
+                               * a hole in the ECMA specification if the key is a
+                               * ECMA reserved word or starts with a digit the
+                               * parameter is only accessible using ECMAScript's
+                               * bracket notation.
+                               */
+  
+                              // treat as a JSON object
+                              if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
+                                  $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var));
+  
+                                  foreach($properties as $property) {
+                                      if(Gpf_Rpc_Json::isError($property)) {
+                                          return $property;
+                                      }
+                                  }
+  
+                                  return '{' . join(',', $properties) . '}';
+                              }
+  
+                              // treat it like a regular array
+                              $elements = array_map(array($this, 'encode'), $var);
+  
+                              foreach($elements as $element) {
+                                  if(Gpf_Rpc_Json::isError($element)) {
+                                      return $element;
+                                  }
+                              }
+  
+                              return '[' . join(',', $elements) . ']';
+  
+                          case 'object':
+                              $vars = get_object_vars($var);
+  
+                              $properties = array_map(array($this, 'name_value'),
+                              array_keys($vars),
+                              array_values($vars));
+  
+                              foreach($properties as $property) {
+                                  if(Gpf_Rpc_Json::isError($property)) {
+                                      return $property;
+                                  }
+                              }
+  
+                              return '{' . join(',', $properties) . '}';
+  
+                          default:
+                              if ($this->use & self::SERVICES_JSON_SUPPRESS_ERRORS) {
+                                  return 'null';
+                              }
+                              return new Gpf_Rpc_Json_Error(gettype($var)." can not be encoded as JSON string");
+          }
+      }
+  
+      /**
+       * array-walking function for use in generating JSON-formatted name-value pairs
+       *
+       * @param    string  $name   name of key to use
+       * @param    mixed   $value  reference to an array element to be encoded
+       *
+       * @return   string  JSON-formatted name-value pair, like '"name":value'
+       * @access   private
+       */
+      function name_value($name, $value)
+      {
+          $encoded_value = $this->encode($value);
+  
+          if(Gpf_Rpc_Json::isError($encoded_value)) {
+              return $encoded_value;
+          }
+  
+          return $this->encode(strval($name)) . ':' . $encoded_value;
+      }
+  
+      /**
+       * reduce a string by removing leading and trailing comments and whitespace
+       *
+       * @param    $str    string      string value to strip of comments and whitespace
+       *
+       * @return   string  string value stripped of comments and whitespace
+       * @access   private
+       */
+      function reduce_string($str)
+      {
+          $str = preg_replace(array(
+  
+          // eliminate single line comments in '// ...' form
+                  '#^\s*//(.+)$#m',
+  
+          // eliminate multi-line comments in '/* ... */' form, at start of string
+                  '#^\s*/\*(.+)\*/#Us',
+  
+          // eliminate multi-line comments in '/* ... */' form, at end of string
+                  '#/\*(.+)\*/\s*$#Us'
+  
+                  ), '', $str);
+  
+                  // eliminate extraneous space
+                  return trim($str);
+      }
+  
+      /**
+       * decodes a JSON string into appropriate variable
+       *
+       * @param    string  $str    JSON-formatted string
+       *
+       * @return   mixed   number, boolean, string, array, or object
+       *                   corresponding to given JSON input string.
+       *                   See argument 1 to Services_JSON() above for object-output behavior.
+       *                   Note that decode() always returns strings
+       *                   in ASCII or UTF-8 format!
+       * @access   public
+       */
+      function decode($str)
+      {
+          if ($this->isJsonDecodeEnabled()) {
+              return json_decode($str);
+          }
+  
+          $str = $this->reduce_string($str);
+  
+          switch (strtolower($str)) {
+              case 'true':
+                  return true;
+  
+              case 'false':
+                  return false;
+  
+              case 'null':
+                  return null;
+  
+              default:
+                  $m = array();
+  
+                  if (is_numeric($str)) {
+                      // Lookie-loo, it's a number
+  
+                      // This would work on its own, but I'm trying to be
+                      // good about returning integers where appropriate:
+                      // return (float)$str;
+  
+                      // Return float or int, as appropriate
+                      return ((float)$str == (integer)$str)
+                      ? (integer)$str
+                      : (float)$str;
+  
+                  } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
+                      // STRINGS RETURNED IN UTF-8 FORMAT
+                      $delim = substr($str, 0, 1);
+                      $chrs = substr($str, 1, -1);
+                      $utf8 = '';
+                      $strlen_chrs = strlen($chrs);
+  
+                      for ($c = 0; $c < $strlen_chrs; ++$c) {
+  
+                          $substr_chrs_c_2 = substr($chrs, $c, 2);
+                          $ord_chrs_c = ord($chrs{$c});
+  
+                          switch (true) {
+                              case $substr_chrs_c_2 == '\b':
+                                  $utf8 .= chr(0x08);
+                                  ++$c;
+                                  break;
+                              case $substr_chrs_c_2 == '\t':
+                                  $utf8 .= chr(0x09);
+                                  ++$c;
+                                  break;
+                              case $substr_chrs_c_2 == '\n':
+                                  $utf8 .= chr(0x0A);
+                                  ++$c;
+                                  break;
+                              case $substr_chrs_c_2 == '\f':
+                                  $utf8 .= chr(0x0C);
+                                  ++$c;
+                                  break;
+                              case $substr_chrs_c_2 == '\r':
+                                  $utf8 .= chr(0x0D);
+                                  ++$c;
+                                  break;
+  
+                              case $substr_chrs_c_2 == '\\"':
+                              case $substr_chrs_c_2 == '\\\'':
+                              case $substr_chrs_c_2 == '\\\\':
+                              case $substr_chrs_c_2 == '\\/':
+                                  if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
+                                  ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
+                                      $utf8 .= $chrs{++$c};
+                                  }
+                                  break;
+  
+                              case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
+                                  // single, escaped unicode character
+                                  $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
+                                  . chr(hexdec(substr($chrs, ($c + 4), 2)));
+                                  $utf8 .= $this->utf162utf8($utf16);
+                                  $c += 5;
+                                  break;
+  
+                              case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
+                                  $utf8 .= $chrs{$c};
+                                  break;
+  
+                              case ($ord_chrs_c & 0xE0) == 0xC0:
+                                  // characters U-00000080 - U-000007FF, mask 1 1 0 X X X X X
+                                  //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                  $utf8 .= substr($chrs, $c, 2);
+                                  ++$c;
+                                  break;
+  
+                              case ($ord_chrs_c & 0xF0) == 0xE0:
+                                  // characters U-00000800 - U-0000FFFF, mask 1 1 1 0 X X X X
+                                  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                  $utf8 .= substr($chrs, $c, 3);
+                                  $c += 2;
+                                  break;
+  
+                              case ($ord_chrs_c & 0xF8) == 0xF0:
+                                  // characters U-00010000 - U-001FFFFF, mask 1 1 1 1 0 X X X
+                                  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                  $utf8 .= substr($chrs, $c, 4);
+                                  $c += 3;
+                                  break;
+  
+                              case ($ord_chrs_c & 0xFC) == 0xF8:
+                                  // characters U-00200000 - U-03FFFFFF, mask 111110XX
+                                  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                  $utf8 .= substr($chrs, $c, 5);
+                                  $c += 4;
+                                  break;
+  
+                              case ($ord_chrs_c & 0xFE) == 0xFC:
+                                  // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+                                  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                  $utf8 .= substr($chrs, $c, 6);
+                                  $c += 5;
+                                  break;
+  
+                          }
+  
+                      }
+  
+                      return $utf8;
+  
+                  } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
+                      // array, or object notation
+  
+                      if ($str{0} == '[') {
+                          $stk = array(self::SERVICES_JSON_IN_ARR);
+                          $arr = array();
+                      } else {
+                          if ($this->use & self::SERVICES_JSON_LOOSE_TYPE) {
+                              $stk = array(self::SERVICES_JSON_IN_OBJ);
+                              $obj = array();
+                          } else {
+                              $stk = array(self::SERVICES_JSON_IN_OBJ);
+                              $obj = new stdClass();
+                          }
+                      }
+  
+                      array_push($stk, array('what'  => self::SERVICES_JSON_SLICE,
+                                             'where' => 0,
+                                             'delim' => false));
+  
+                      $chrs = substr($str, 1, -1);
+                      $chrs = $this->reduce_string($chrs);
+  
+                      if ($chrs == '') {
+                          if (reset($stk) == self::SERVICES_JSON_IN_ARR) {
+                              return $arr;
+  
+                          } else {
+                              return $obj;
+  
+                          }
+                      }
+  
+                      //print("\nparsing {$chrs}\n");
+  
+                      $strlen_chrs = strlen($chrs);
+  
+                      for ($c = 0; $c <= $strlen_chrs; ++$c) {
+  
+                          $top = end($stk);
+                          $substr_chrs_c_2 = substr($chrs, $c, 2);
+  
+                          if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == self::SERVICES_JSON_SLICE))) {
+                              // found a comma that is not inside a string, array, etc.,
+                              // OR we've reached the end of the character list
+                              $slice = substr($chrs, $top['where'], ($c - $top['where']));
+                              array_push($stk, array('what' => self::SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
+                              //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+  
+                              if (reset($stk) == self::SERVICES_JSON_IN_ARR) {
+                                  // we are in an array, so just push an element onto the stack
+                                  array_push($arr, $this->decode($slice));
+  
+                              } elseif (reset($stk) == self::SERVICES_JSON_IN_OBJ) {
+                                  // we are in an object, so figure
+                                  // out the property name and set an
+                                  // element in an associative array,
+                                  // for now
+                                  $parts = array();
+  
+                                  if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+                                      // "name":value pair
+                                      $key = $this->decode($parts[1]);
+                                      $val = $this->decode($parts[2]);
+  
+                                      if ($this->use & self::SERVICES_JSON_LOOSE_TYPE) {
+                                          $obj[$key] = $val;
+                                      } else {
+                                          $obj->$key = $val;
+                                      }
+                                  } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+                                      // name:value pair, where name is unquoted
+                                      $key = $parts[1];
+                                      $val = $this->decode($parts[2]);
+  
+                                      if ($this->use & self::SERVICES_JSON_LOOSE_TYPE) {
+                                          $obj[$key] = $val;
+                                      } else {
+                                          $obj->$key = $val;
+                                      }
+                                  }
+  
+                              }
+  
+                          } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != self::SERVICES_JSON_IN_STR)) {
+                              // found a quote, and we are not inside a string
+                              array_push($stk, array('what' => self::SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
+                              //print("Found start of string at {$c}\n");
+  
+                          } elseif (($chrs{$c} == $top['delim']) &&
+                          ($top['what'] == self::SERVICES_JSON_IN_STR) &&
+                          (($chrs{$c - 1} != '\\') ||
+                          ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) {
+                              // found a quote, we're in a string, and it's not escaped
+                              array_pop($stk);
+                              //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
+  
+                          } elseif (($chrs{$c} == '[') &&
+                          in_array($top['what'], array(self::SERVICES_JSON_SLICE, self::SERVICES_JSON_IN_ARR, self::SERVICES_JSON_IN_OBJ))) {
+                              // found a left-bracket, and we are in an array, object, or slice
+                              array_push($stk, array('what' => self::SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
+                              //print("Found start of array at {$c}\n");
+  
+                          } elseif (($chrs{$c} == ']') && ($top['what'] == self::SERVICES_JSON_IN_ARR)) {
+                              // found a right-bracket, and we're in an array
+                              array_pop($stk);
+                              //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+  
+                          } elseif (($chrs{$c} == '{') &&
+                          in_array($top['what'], array(self::SERVICES_JSON_SLICE, self::SERVICES_JSON_IN_ARR, self::SERVICES_JSON_IN_OBJ))) {
+                              // found a left-brace, and we are in an array, object, or slice
+                              array_push($stk, array('what' => self::SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
+                              //print("Found start of object at {$c}\n");
+  
+                          } elseif (($chrs{$c} == '}') && ($top['what'] == self::SERVICES_JSON_IN_OBJ)) {
+                              // found a right-brace, and we're in an object
+                              array_pop($stk);
+                              //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+  
+                          } elseif (($substr_chrs_c_2 == '/*') &&
+                          in_array($top['what'], array(self::SERVICES_JSON_SLICE, self::SERVICES_JSON_IN_ARR, self::SERVICES_JSON_IN_OBJ))) {
+                              // found a comment start, and we are in an array, object, or slice
+                              array_push($stk, array('what' => self::SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
+                              $c++;
+                              //print("Found start of comment at {$c}\n");
+  
+                          } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == self::SERVICES_JSON_IN_CMT)) {
+                              // found a comment end, and we're in one now
+                              array_pop($stk);
+                              $c++;
+  
+                              for ($i = $top['where']; $i <= $c; ++$i)
+                              $chrs = substr_replace($chrs, ' ', $i, 1);
+  
+                              //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+  
+                          }
+  
+                      }
+  
+                      if (reset($stk) == self::SERVICES_JSON_IN_ARR) {
+                          return $arr;
+  
+                      } elseif (reset($stk) == self::SERVICES_JSON_IN_OBJ) {
+                          return $obj;
+  
+                      }
+  
+                  }
+          }
+      }
+      
+      protected function isJsonEncodeEnabled() {
+          return Gpf_Php::isFunctionEnabled('json_encode');
+      }
+      
+      protected function isJsonDecodeEnabled() {
+          return Gpf_Php::isFunctionEnabled('json_decode');
+      }
+      
+  
+      /**
+       * @todo Ultimately, this should just call PEAR::isError()
+       */
+      function isError($data, $code = null)
+      {
+          if (is_object($data) &&
+              (get_class($data) == 'Gpf_Rpc_Json_Error' || is_subclass_of($data, 'Gpf_Rpc_Json_Error'))) {
+                  return true;
+          }
+          return false;
+      }
+  }
+  
+  class Gpf_Rpc_Json_Error {
+      private $message;
+      
+      public function __construct($message) {
+          $this->message = $message;
+      }
+  }
+  
+
+} //end Gpf_Rpc_Json
+
+if (!class_exists('Gpf_Rpc_JsonObject', false)) {
+  class Gpf_Rpc_JsonObject extends Gpf_Object {
+      
+      public function __construct($object = null) {
+          if ($object != null) {
+              $this->initFrom($object);
+          }
+      }
+      
+      public function decode($string) {
+          if ($string == null || $string == "") {
+              throw new Gpf_Exception("Invalid format (".get_class($this).")");
+          }
+          $string = stripslashes($string);
+          $json = new Gpf_Rpc_Json();
+          $object = $json->decode($string);
+          if (!is_object($object)) {
+              throw new Gpf_Exception("Invalid format (".get_class($this).")");
+          }
+          $this->initFrom($object);
+      }
+      
+      private function initFrom($object) {
+          $object_vars = get_object_vars($object);
+          foreach ($object_vars as $name => $value) {
+              if (property_exists($this, $name)) {
+                  $this->$name = $value;
+              }
+          }
+      }
+      
+      public function encode() {
+          $json = new Gpf_Rpc_Json();
+          return $json->encode($this);
+      }
+      
+      public function __toString() {
+          return $this->encode();
+      }
+  }
+
+} //end Gpf_Rpc_JsonObject
+
+if (!class_exists('Pap_Api_Object', false)) {
+  class Pap_Api_Object extends Gpf_Object {
+      private $session;
+      protected $class = '';
+      private $message = '';
+  
+      const FIELD_NAME  = "name";
+      const FIELD_VALUE = "value";
+      const FIELD_ERROR = "error";
+      const FIELD_VALUES = "values";
+  
+      /**
+       * @var Gpf_Data_IndexedRecordSet
+       */
+      private $fields;
+  
+      public function __construct(Gpf_Api_Session $session) {
+          $this->session = $session;
+          $this->fields = new Gpf_Data_IndexedRecordSet(self::FIELD_NAME);
+  
+          $header = new Gpf_Data_RecordHeader();
+          $header->add(self::FIELD_NAME);
+          $header->add(self::FIELD_VALUE);
+          $header->add(self::FIELD_VALUES);
+          $header->add(self::FIELD_ERROR);
+  
+          $this->fields->setHeader($header);
+      }
+  
+      public function setField($name, $value) {
+          $record = $this->fields->createRecord($name);
+          $record->set(self::FIELD_VALUE, $value);
+  
+          $this->fields->add($record);
+      }
+  
+      public function getField($name) {
+         	try {
+         	    $record = $this->fields->getRecord($name);
+         	    return $record->get(self::FIELD_VALUE);
+         	} catch(Exception $e) {
+         	    return '';
+         	}
+      }
+  
+      public function addErrorMessages(Gpf_Data_IndexedRecordSet $fields) {
+          foreach($fields as $field) {
+              if($field->get(self::FIELD_ERROR) != '') {
+                  $this->message .= $field->get(self::FIELD_NAME).' - '.$field->get(self::FIELD_ERROR).'<br>';
+              }
+          }
+      }
+  
+      public function setFields(Gpf_Data_IndexedRecordSet $fields) {
+          foreach($fields as $field) {
+              $this->setField($field->get(self::FIELD_NAME), $field->get(self::FIELD_VALUE));
+          }
+      }
+  
+      public function getFields() {
+          return $this->fields;
+      }
+  
+      public function getSession() {
+          return $this->session;
+      }
+  
+      public function getMessage() {
+          return $this->message;
+      }
+  
+      protected function getPrimaryKey() {
+          throw new Exception("You have to define method getPrimaryKey() in the extended class!");
+      }
+  
+      protected function getGridRequest() {
+          throw new Exception("You have to define method getGridRequest() in the extended class!");
+      }
+  
+      protected function fillFieldsToGridRequest($request) {
+          foreach($this->fields as $field) {
+              if($field->get(self::FIELD_VALUE) != '') {
+                  $request->addFilter($field->get(self::FIELD_NAME), "L", $field->get(self::FIELD_VALUE));
+              }
+          }
+      }
+  
+      protected function getPrimaryKeyFromFields() {
+          $request = $this->getGridRequest();
+          if($request == null) {
+              throw new Exception("You have to set ".$this->getPrimaryKey()." before calling load()!");
+          }
+  
+          $this->fillFieldsToGridRequest($request);
+  
+          $request->setLimit(0, 1);
+          $request->sendNow();
+          $grid = $request->getGrid();
+          if($grid->getTotalCount() == 0) {
+              throw new Exception("No rows found!");
+          }
+          if($grid->getTotalCount() > 1) {
+              throw new Exception("Too may rows found!");
+          }
+          $recordset = $grid->getRecordset();
+  
+          foreach($recordset as $record) {
+              $this->setField($this->getPrimaryKey(), $record->get($this->getPrimaryKey()));
+              break;
+          }
+      }
+  
+      protected function afterCallRequest() {
+      }
+  
+      private function primaryKeyIsDefined() {
+          $field =  $this->getField($this->getPrimaryKey());
+          if($field == null || $field == '') {
+              return false;
+          }
+          return true;
+      }
+  
+      /**
+       * function checks if at least some field is filled
+       * (we'll use that field as filter for the grid)
+       *
+       */
+      private function someFieldIsFilled() {
+          foreach($this->fields as $field) {
+              if($field->get(self::FIELD_VALUE) != '') {
+                  return true;
+              }
+          }
+  
+          return false;
+      }
+  
+      private function callRequest($method) {
+          $this->message = '';
+  
+          $request = new Gpf_Rpc_FormRequest($this->class, $method, $this->session);
+          $this->beforeCallRequest($request);
+          foreach($this->getFields() as $field) {
+              if($field->get(self::FIELD_VALUE) != null) {
+                  $request->setField($field->get(self::FIELD_NAME), $field->get(self::FIELD_VALUE));
+              }
+          }
+  
+          try {
+              $request->sendNow();
+          } catch(Gpf_Exception $e) {
+              if(strpos($e->getMessage(), 'Row does not exist') !== false) {
+                  throw new Exception("Row with this ID does not exist");
+              }
+          }
+  
+          $form = $request->getForm();
+          if($form->isError()) {
+              $this->message = $form->getErrorMessage();
+              $this->addErrorMessages($form->getFields());
+              return false;
+          } else {
+              $this->message = $form->getInfoMessage();
+          }
+  
+          $this->setFields($form->getFields());
+  
+          $this->afterCallRequest();
+  
+          return true;
+      }
+  
+      /**
+       * @throws Exception
+       */
+      public function load() {
+          if(!$this->primaryKeyIsDefined()) {
+              if($this->getGridRequest() == null) {
+                  throw new Exception("You have to set ".$this->getPrimaryKey()." before calling load()!");
+              }
+  
+              if(!$this->someFieldIsFilled()) {
+                  throw new Exception("You have to set at least one field before calling load()!");
+              }
+  
+              $this->getPrimaryKeyFromFields();
+          }
+  
+          $this->setField("Id", $this->getField($this->getPrimaryKey()));
+  
+          return $this->callRequest("load");
+      }
+  
+      /**
+       * @throws Exception
+       */
+      public function save() {
+          if(!$this->primaryKeyIsDefined()) {
+              throw new Exception("You have to set ".$this->getPrimaryKey()." before calling save()!");
+          }
+          $this->setField("Id", $this->getField($this->getPrimaryKey()));
+  
+          return $this->callRequest("save");
+      }
+  
+      public function add() {
+          $this->fillEmptyRecord();
+  
+          return $this->callRequest("add");
+      }
+  
+      protected function beforeCallRequest(Gpf_Rpc_FormRequest $request) {
+      }
+  }
+
+} //end Pap_Api_Object
+
+if (!class_exists('Pap_Api_AffiliatesGrid', false)) {
+  class Pap_Api_AffiliatesGrid extends Gpf_Rpc_GridRequest {
+  	
+  	private $dataValues = null;
+  	
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+      		throw new Exception("This class can be used only by merchant!");
+      	} else {
+      		parent::__construct("Pap_Merchants_User_AffiliatesGrid", "getRows", $session);
+      	}
+      }
+  }
+
+} //end Pap_Api_AffiliatesGrid
+
+if (!class_exists('Pap_Api_BannersGrid', false)) {
+  class Pap_Api_BannersGrid extends Gpf_Rpc_GridRequest {
+  	
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+      		throw new Exception("This class can be used only by merchant!");
+      	} else {
+      		parent::__construct("Pap_Merchants_Banner_BannersGrid", "getRows", $session);
+      	}
+      }
+  }
+
+} //end Pap_Api_BannersGrid
+
+if (!class_exists('Pap_Api_Affiliate', false)) {
+  class Pap_Api_Affiliate extends Pap_Api_Object {
+  
+      const OPERATOR_EQUALS = '=';
+      const OPERATOR_LIKE = 'L';
+  
+      private $dataValues = null;
+      private $equalsFields = array();
+  
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              $this->class = "Pap_Affiliates_Profile_PersonalDetailsForm";
+          } else {
+              $this->class = "Pap_Signup_AffiliateForm";
+          }
+           
+          parent::__construct($session);
+  
+          $this->addEqualField('username');
+           
+          $this->getDataFields();
+      }
+  
+      private function addEqualField($name) {
+          $this->equalsFields[] = $name;
+      }
+  
+      private function getEqualFields() {
+          return $this->equalsFields;
+      }
+  
+      public function getUserid() { return $this->getField("userid"); }
+      public function setUserid($value) {
+          $this->setField("userid", $value);
+          $this->setField("Id", $value);
+      }
+  
+      public function getRefid() { return $this->getField("refid"); }
+  
+      public function setRefid($value, $operator = self::OPERATOR_LIKE) { 
+          $this->setField('refid', $value);
+          if ($operator == self::OPERATOR_EQUALS) {
+              $this->addEqualField('refid');
+          }
+      }
+  
+      public function getStatus() { return $this->getField("rstatus"); }
+      public function setStatus($value) { $this->setField("rstatus", $value); }
+  
+      public function getMinimumPayout() { return $this->getField("minimumpayout"); }
+      public function setMinimumPayout($value) { $this->setField("minimumpayout", $value); }
+  
+      public function getPayoutOptionId() { return $this->getField("payoutoptionid"); }
+      public function setPayoutOptionId($value) { $this->setField("payoutoptionid", $value); }
+  
+      public function getNote() { return $this->getField("note"); }
+      public function setNote($value) { $this->setField("note", $value); }
+  
+      public function getPhoto() { return $this->getField("photo"); }
+      public function setPhoto($value) { $this->setField("photo", $value); }
+  
+      public function getUsername() { return $this->getField("username"); }
+  
+      public function setUsername($value, $operator = self::OPERATOR_LIKE) {
+          $this->setField('username', $value);
+          if ($operator == self::OPERATOR_EQUALS) {
+              $this->addEqualField('username');
+          }
+      }
+  
+      public function getPassword() { return $this->getField("rpassword"); }
+      public function setPassword($value) { $this->setField("rpassword", $value); }
+  
+      public function getFirstname() { return $this->getField("firstname"); }
+  
+      public function setFirstname($value, $operator = self::OPERATOR_LIKE) {
+          $this->setField('firstname', $value);
+          if ($operator == self::OPERATOR_EQUALS) {
+              $this->addEqualField('firstname');
+          }
+      }
+  
+      public function getLastname() { return $this->getField("lastname"); }
+  
+      public function setLastname($value, $operator = self::OPERATOR_LIKE) {
+          $this->setField('lastname', $value);
+          if ($operator == self::OPERATOR_EQUALS) {
+              $this->addEqualField('lastname');
+          }
+      }
+  
+      public function getParentUserId() { return $this->getField("parentuserid"); }
+      public function setParentUserId($value) { $this->setField("parentuserid", $value); }
+  
+      public function getIp() { return $this->getField("ip"); }
+      public function setIp($value) { $this->setField("ip", $value); }
+  
+      public function getNotificationEmail() { return $this->getField("notificationemail"); }
+      public function setNotificationEmail($value) { $this->setField("notificationemail", $value); }
+  
+      public function enableCreateSignupReferralCommissions() { $this->setField("createSignupReferralComm", Gpf::YES); }
+  
+      public function getData($index) {
+          $this->checkIndex($index);
+          return $this->getField("data$index");
+      }
+      public function setData($index, $value, $operator = self::OPERATOR_LIKE) {
+          $this->checkIndex($index);
+          $this->setField("data$index", $value);
+          if ($operator == self::OPERATOR_EQUALS) {
+              $this->addEqualField('data' . $index);
+          }
+      }
+  
+      public function setPayoutOptionField($code, $value) {
+          $this->setField($code, $value);
+      }
+  
+      public function getDataName($index) {
+          $this->checkIndex($index);
+          $dataField = "data$index";
+           
+          if(!is_array($this->dataValues) || !isset($this->dataValues[$dataField])) {
+              return '';
+          }
+           
+          return $this->dataValues[$dataField]['name'];
+      }
+  
+      public function getDataStatus($index) {
+          $this->checkIndex($index);
+          $dataField = "data$index";
+           
+          if(!is_array($this->dataValues) || !isset($this->dataValues[$dataField])) {
+              return 'U';
+          }
+           
+          return $this->dataValues[$dataField]['status'];
+      }
+  
+      public function sendConfirmationEmail() {
+          $params = new Gpf_Rpc_Params();
+          $params->add('ids', array($this->getUserid()));
+          return $this->sendActionRequest('Pap_Merchants_User_AffiliateForm', 'sendSignupConfirmation', $params);
+      }
+  
+      /**
+       * @param $campaignID
+       * @param $sendNotification
+       */
+      public function assignToPrivateCampaign($campaignID, $sendNotification = false) {
+          $params = new Gpf_Rpc_Params();
+          $params->add('campaignId', $campaignID);
+          $params->add('sendNotification', ($sendNotification ? Gpf::YES : Gpf::NO));
+          $params->add('ids', array($this->getUserid()));
+          return $this->sendActionRequest('Pap_Db_UserInCommissionGroup', 'addUsers', $params);
+      }
+  
+      private function checkIndex($index) {
+          if(!is_numeric($index) || $index > 25 || $index < 1) {
+              throw new Exception("Incorrect index '$index', it must be between 1 and 25");
+          }
+           
+          return true;
+      }
+  
+      protected function fillEmptyRecord() {
+          $this->setField("userid", "");
+          $this->setField("agreeWithTerms", Gpf::YES);
+      }
+  
+      protected function getPrimaryKey() {
+          return "userid";
+      }
+  
+      protected function getGridRequest() {
+          return new Pap_Api_AffiliatesGrid($this->getSession());
+      }
+  
+      protected function fillFieldsToGridRequest($request) {
+          foreach(parent::getFields() as $field) {
+              if($field->get(self::FIELD_VALUE) != '') {
+                  $operator = self::OPERATOR_LIKE;
+                  if (in_array($field->get(self::FIELD_NAME), $this->getEqualFields())) {
+                      $operator = self::OPERATOR_EQUALS;
+                  }
+                  $request->addFilter($field->get(self::FIELD_NAME), $operator, $field->get(self::FIELD_VALUE));
+              }
+          }
+      }
+  
+      /**
+       * retrieves names and states of data1..data25 fields
+       *
+       */
+      protected function getDataFields() {
+          $request = new Gpf_Rpc_RecordsetRequest("Gpf_Db_Table_FormFields", "getFields", $this->getSession());
+          $request->addParam("formId","affiliateForm");
+          $request->addParam("status","M,O");
+           
+          try {
+              $request->sendNow();
+          } catch(Exception $e) {
+              throw new Exception("Cannot load datafields. Error: ".$e->getMessage());
+          }
+           
+          $recordset = $request->getRecordSet();
+          $this->dataValues = array();
+          foreach($recordset as $record) {
+              $this->dataValues[$record->get("code")]['name'] = $record->get("name");
+              $this->dataValues[$record->get("code")]['status'] = $record->get("status");
+          }
+      }
+  
+      private function sendActionRequest($className, $method, Gpf_Rpc_Params $params) {
+          $request = new Gpf_Rpc_ActionRequest($className, $method, $this->getSession());
+          $request->setParams($params);
+          return $request->sendNow();
+      }
+  
+      protected function beforeCallRequest(Gpf_Rpc_FormRequest $request) {
+          $request->addParam('isFromApi', Gpf::YES);
+      }
+  }
+
+} //end Pap_Api_Affiliate
+
+if (!class_exists('Pap_Api_TransactionsGrid', false)) {
+  class Pap_Api_TransactionsGrid extends Gpf_Rpc_GridRequest {
+  	
+      const REFUND_MERCHANT_NOTE = 'merchant_note';
+      const REFUND_TYPE = 'status';
+      const REFUND_FEE = 'fee';
+      const TYPE_REFUND = 'R';
+      const TYPE_CHARGEBACK = 'H';
+  
+  	private $dataValues = null;
+  	
+      public function __construct(Gpf_Api_Session $session) {
+      	if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+      		$className = "Pap_Affiliates_Reports_TransactionsGrid";
+      	} else {
+      		$className = "Pap_Merchants_Transaction_TransactionsGrid";
+      	}
+      	parent::__construct($className, "getRows", $session);
+      }
+  
+      public function refund($note = '', $fee = 0) {
+          return $this->makeRefundChargeback(self::TYPE_REFUND, $note, $fee);
+      }
+  
+      public function chargeback($note = '', $fee = 0) {
+          return $this->makeRefundChargeback(self::TYPE_CHARGEBACK, $note, $fee);
+      }
+  
+      private function makeRefundChargeback($type, $note, $fee) {        
+          if ($this->apiSessionObject->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Exception("This method can be used only by merchant!"); 
+          }
+          if ($this->getFiltersParameter()->getCount() == 0) {
+              throw new Exception("Refund / Chargeback in transactions grid is possible to make only with filters!");
+          }
+  
+          $request = new Gpf_Rpc_ActionRequest('Pap_Merchants_Transaction_TransactionsForm', 'makeRefundChargebackByParams', $this->apiSessionObject);
+          $request->addParam('filters', $this->getFiltersParameter());
+          $request->addParam(self::REFUND_MERCHANT_NOTE, $note);
+          $request->addParam(self::REFUND_TYPE, $type);
+          $request->addParam(self::REFUND_FEE, $fee);
+  
+          $request->sendNow();
+  
+          return $request->getAction();
+      }
+  }
+
+} //end Pap_Api_TransactionsGrid
+
+if (!class_exists('Pap_Api_Transaction', false)) {
+  class Pap_Api_Transaction extends Pap_Api_Object {
+  
+      private $dataValues = null;
+  
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Exception("This class can be used only by merchant!");
+          } else {
+              $this->class = "Pap_Merchants_Transaction_TransactionsForm";
+          }
+           
+          parent::__construct($session);
+      }
+  
+      public function getTransid() { return $this->getField("transid"); }
+      public function setTransid($value) {
+          $this->setField("transid", $value);
+          $this->setField("Id", $value);
+      }
+  
+      public function getType() { return $this->getField("rtype"); }
+      public function setType($value) { $this->setField("rtype", $value); }
+  
+      public function getStatus() { return $this->getField("rstatus"); }
+      public function setStatus($value) { $this->setField("rstatus", $value); }
+  
+      public function getMultiTierCreation() { return $this->getField("multiTier"); }
+      public function setMultiTierCreation($value) { $this->setField("multiTier", $value); }
+  
+      public function getUserid() { return $this->getField("userid"); }
+      public function setUserid($value) { $this->setField("userid", $value); }
+  
+      public function getBannerid() { return $this->getField("bannerid"); }
+      public function setBannerid($value) { $this->setField("bannerid", $value); }
+  
+      public function getParentBannerid() { return $this->getField("parentbannerid"); }
+      public function setParentBannerid($value) { $this->setField("parentbannerid", $value); }
+  
+      public function getCampaignid() { return $this->getField("campaignid"); }
+      public function setCampaignid($value) { $this->setField("campaignid", $value); }
+  
+      public function getCountryCode() { return $this->getField("countrycode"); }
+      public function setCountryCode($value) { $this->setField("countrycode", $value); }
+  
+      public function getDateInserted() { return $this->getField("dateinserted"); }
+      public function setDateInserted($value) { $this->setField("dateinserted", $value); }
+  
+      public function getDateApproved() { return $this->getField("dateapproved"); }
+      public function setDateApproved($value) { $this->setField("dateapproved", $value); }
+  
+      public function getPayoutStatus() { return $this->getField("payoutstatus"); }
+      public function setPayoutStatus($value) { $this->setField("payoutstatus", $value); }
+  
+      public function getPayoutHistoryId() { return $this->getField("payouthistoryid"); }
+      public function setPayoutHistoryId($value) { $this->setField("payouthistoryid", $value); }
+  
+      public function getRefererUrl() { return $this->getField("refererurl"); }
+      public function setRefererUrl($value) { $this->setField("refererurl", $value); }
+  
+      public function getIp() { return $this->getField("ip"); }
+      public function setIp($value) { $this->setField("ip", $value); }
+  
+      public function getBrowser() { return $this->getField("browser"); }
+      public function setBrowser($value) { $this->setField("browser", $value); }
+  
+      public function getCommission() { return $this->getField("commission"); }
+      public function setCommission($value) { $this->setField("commission", $value); }
+  
+      public function getOrderId() { return $this->getField("orderid"); }
+      public function setOrderId($value) { $this->setField("orderid", $value); }
+  
+      public function getProductId() { return $this->getField("productid"); }
+      public function setProductId($value) { $this->setField("productid", $value); }
+  
+      public function getTotalCost() { return $this->getField("totalcost"); }
+      public function setTotalCost($value) { $this->setField("totalcost", $value); }
+  
+      public function getRecurringCommid() { return $this->getField("recurringcommid"); }
+      public function setRecurringCommid($value) { $this->setField("recurringcommid", $value); }
+  
+      public function getFirstClickTime() { return $this->getField("firstclicktime"); }
+      public function setFirstClickTime($value) { $this->setField("firstclicktime", $value); }
+  
+      public function getFirstClickReferer() { return $this->getField("firstclickreferer"); }
+      public function setFirstClickReferer($value) { $this->setField("firstclickreferer", $value); }
+  
+      public function getFirstClickIp() { return $this->getField("firstclickip"); }
+      public function setFirstClickIp($value) { $this->setField("firstclickip", $value); }
+  
+      public function getFirstClickData1() { return $this->getField("firstclickdata1"); }
+      public function setFirstClickData1($value) { $this->setField("firstclickdata1", $value); }
+  
+      public function getFirstClickData2() { return $this->getField("firstclickdata2"); }
+      public function setFirstClickData2($value) { $this->setField("firstclickdata2", $value); }
+  
+      public function getClickCount() { return $this->getField("clickcount"); }
+      public function setClickCount($value) { $this->setField("clickcount", $value); }
+  
+      public function getLastClickTime() { return $this->getField("lastclicktime"); }
+      public function setLastClickTime($value) { $this->setField("lastclicktime", $value); }
+  
+      public function getLastClickReferer() { return $this->getField("lastclickreferer"); }
+      public function setLastClickReferer($value) { $this->setField("lastclickreferer", $value); }
+  
+      public function getLastClickIp() { return $this->getField("lastclickip"); }
+      public function setLastClickIp($value) { $this->setField("lastclickip", $value); }
+  
+      public function getLastClickData1() { return $this->getField("lastclickdata1"); }
+      public function setLastClickData1($value) { $this->setField("lastclickdata1", $value); }
+  
+      public function getLastClickData2() { return $this->getField("lastclickdata2"); }
+      public function setLastClickData2($value) { $this->setField("lastclickdata2", $value); }
+  
+      public function getTrackMethod() { return $this->getField("trackmethod"); }
+      public function setTrackMethod($value) { $this->setField("trackmethod", $value); }
+  
+      public function getOriginalCurrencyId() { return $this->getField("originalcurrencyid"); }
+      public function setOriginalCurrencyId($value) { $this->setField("originalcurrencyid", $value); }
+  
+      public function getOriginalCurrencyValue() { return $this->getField("originalcurrencyvalue"); }
+      public function setOriginalCurrencyValue($value) { $this->setField("originalcurrencyvalue", $value); }
+  
+      public function getOriginalCurrencyRate() { return $this->getField("originalcurrencyrate"); }
+      public function setOriginalCurrencyRate($value) { $this->setField("originalcurrencyrate", $value); }
+  
+      public function getTier() { return $this->getField("tier"); }
+      public function setTier($value) { $this->setField("tier", $value); }
+  
+      public function getChannel() { return $this->getField("channel"); }
+      public function setChannel($value) { $this->setField("channel", $value); }
+  
+      public function getCommTypeId() { return $this->getField("commtypeid"); }
+      public function setCommTypeId($value) { $this->setField("commtypeid", $value); }
+  
+      public function getMerchantNote() { return $this->getField("merchantnote"); }
+      public function setMerchantNote($value) { $this->setField("merchantnote", $value); }
+  
+      public function getSystemNote() { return $this->getField("systemnote"); }
+      public function setSystemNote($value) { $this->setField("systemnote", $value); }
+  
+      public function getParentTransactionId() { return $this->getField("parenttransid"); }
+      public function setParentTransactionId($value) { $this->setField("parenttransid", $value); }
+  
+      public function getData($index) {
+          $this->checkIndex($index);
+          return $this->getField("data$index");
+      }
+      public function setData($index, $value) {
+          $this->checkIndex($index);
+          $this->setField("data$index", $value);
+      }
+  
+      /**
+       * @param $note optional note that will be added to the refund/chargeback transaction
+       * @param $fee that will be added to the refund/chargeback transaction
+       * @return Gpf_Rpc_Action
+       */
+      public function chargeBack($note = '', $fee = 0, $refundMultiTier = false) {
+          return $this->makeRefundChargeBack($note, 'H', $fee, $refundMultiTier);
+      }
+  
+      /**
+       * @param $note optional note that will be added to the refund/chargeback transaction
+       * @param $fee that will be added to the refund/chargeback transaction
+       * @return Gpf_Rpc_Action
+       */
+      public function refund($note = '', $fee = 0, $refundMultiTier = false) {
+          return $this->makeRefundChargeBack($note, 'R', $fee, $refundMultiTier);
+      }
+  
+      /**
+       * @return Gpf_Rpc_Action
+       */
+      private function makeRefundChargeBack($note, $type, $fee, $refundMultiTier) {
+          if ($this->getTransid() == '') {
+              throw new Gpf_Exception("No transaction ID. Call setTransid() or load transaction before calling refund/chargeback");
+          }
+          $request = new Gpf_Rpc_ActionRequest($this->class, 'makeRefundChargeback', $this->getSession());
+          $request->addParam('merchant_note', $note);
+          $request->addParam('refund_multitier', $refundMultiTier ? 'Y' : 'N');
+          $request->addParam('status', $type);
+          $request->addParam('ids', new Gpf_Rpc_Map(array($this->getTransid())));
+          $request->addParam('fee', $fee);
+          $request->sendNow();
+          return $request->getAction();
+      }
+  
+  
+      private function checkIndex($index) {
+          if(!is_numeric($index) || $index > 5 || $index < 1) {
+              throw new Exception("Incorrect index '$index', it must be between 1 and 5");
+          }
+           
+          return true;
+      }
+  
+      protected function fillEmptyRecord() {
+          $this->setTransid("");
+          if($this->getType() == '') {
+              $this->setType("A");
+          }
+          if($this->getMultiTierCreation() == '') {
+              $this->setMultiTierCreation('N');
+          }
+      }
+  
+      protected function getPrimaryKey() {
+          return "transid";
+      }
+  
+      protected function getGridRequest() {
+          return new Pap_Api_TransactionsGrid($this->getSession());
+      }
+  }
+
+} //end Pap_Api_Transaction
+
+if (!class_exists('Pap_Tracking_Action_RequestActionObject', false)) {
+  class Pap_Tracking_Action_RequestActionObject extends Gpf_Rpc_JsonObject {
+      public $ac = ''; // actionCode
+      public $t  = ''; // totalCost
+      public $f  = ''; // fixedCost
+      public $o  = ''; // order ID
+      public $p  = ''; // product ID
+      public $d1 = ''; // data1
+      public $d2 = ''; // data2
+      public $d3 = ''; // data3
+      public $d4 = ''; // data4
+      public $d5 = ''; // data5
+      public $a  = ''; // affiliate ID
+      public $c  = ''; // campaign ID
+      public $b  = ''; // banner ID
+      public $ch = ''; // channel ID
+      public $cc = ''; // custom commission
+      public $s  = ''; // status
+      public $cr = ''; // currency
+      public $cp = ''; // coupon code
+      public $ts = ''; // time stamp
+      
+      public function __construct($object = null) {
+          parent::__construct($object);
+      }
+  
+      public function getActionCode() {
+          return $this->ac;
+      }
+  
+      public function getTotalCost() {
+          return $this->t;
+      }
+  
+      public function getFixedCost() {
+          return $this->f;
+      }
+  
+      public function getOrderId() {
+          return $this->o;
+      }
+  
+      public function getProductId() {
+          return $this->p;
+      }
+  
+      public function getData1() {
+          return $this->d1;
+      }
+  
+      public function getData2() {
+          return $this->d2;
+      }
+  
+      public function getData3() {
+          return $this->d3;
+      }
+  
+      public function getData4() {
+          return $this->d4;
+      }
+  
+      public function getData5() {
+          return $this->d5;
+      }
+  
+      public function getData($i) {
+          $dataVar = 'd'.$i;
+          return $this->$dataVar;
+      }
+  
+      public function setData($i, $value) {
+          $dataVar = 'd'.$i;
+          $this->$dataVar = $value;
+      }
+  
+      public function getAffiliateId() {
+          return $this->a;
+      }
+  
+      public function getCampaignId() {
+          return $this->c;
+      }
+      
+      public function getBannerId() {
+          return $this->b;
+      }
+  
+      public function getChannelId() {
+          return $this->ch;
+      }
+  
+      public function getCustomCommission() {
+          return $this->cc;
+      }
+  
+      public function getStatus() {
+          return $this->s;
+      }
+  
+      public function getCurrency() {
+          return $this->cr;
+      }
+  
+      public function getCouponCode() {
+          return $this->cp;
+      }
+  
+      public function getTimeStamp() {
+          return $this->ts;
+      }
+  
+      public function setActionCode($value) {
+          $this->ac = $value;
+      }
+  
+      public function setTotalCost($value) {
+          $this->t = $value;
+      }
+  
+      public function setFixedCost($value) {
+          $this->f = $value;
+      }
+  
+      public function setOrderId($value) {
+          $this->o = $value;
+      }
+  
+      public function setProductId($value) {
+          $this->p = $value;
+      }
+  
+      public function setData1($value) {
+          $this->d1 = $value;
+      }
+  
+      public function setData2($value) {
+          $this->d2 = $value;
+      }
+  
+      public function setData3($value) {
+          $this->d3 = $value;
+      }
+  
+      public function setData4($value) {
+          $this->d4 = $value;
+      }
+  
+      public function setData5($value) {
+          $this->d5 = $value;
+      }
+  
+      public function setAffiliateId($value) {
+          $this->a = $value;
+      }
+  
+      public function setCampaignId($value) {
+          $this->c = $value;
+      }
+      
+      public function setBannerId($value) {
+          $this->b = $value;
+      }
+  
+      public function setChannelId($value) {
+          $this->ch = $value;
+      }
+  
+      public function setCustomCommission($value) {
+          $this->cc = $value;
+      }
+  
+      public function setStatus($value) {
+          $this->s = $value;
+      }
+  
+      public function setCurrency($value) {
+          $this->cr = $value;
+      }
+  
+      public function setCouponCode($value) {
+          $this->cp = $value;
+      }
+  
+      public function setTimeStamp($value) {
+          $this->ts = $value;
+      }
+  
+  }
+
+} //end Pap_Tracking_Action_RequestActionObject
+
+if (!class_exists('Pap_Tracking_Request', false)) {
+  class Pap_Tracking_Request extends Gpf_Object {
+      const PARAM_CAMPAIGN_ID_SETTING_NAME = 'campaignId';
+  
+      /* other action parameters */
+      const PARAM_ACTION_DEBUG = 'PDebug';
+      const PARAM_CALL_FROM_JAVASCRIPT = 'cjs';
+  
+      /* Constant param names */
+      const PARAM_LINK_STYLE = 'ls';
+      const PARAM_REFERRERURL_NAME = 'refe';
+  
+      /* Param setting names */
+      const PARAM_DESTINATION_URL_SETTING_NAME = 'param_name_extra_data3';
+      const PARAM_CHANNEL_DEFAULT = 'chan';
+      const PARAM_CURRENCY = 'cur';
+  
+      /* Forced parameter names */
+      const PARAM_FORCED_AFFILIATE_ID = 'AffiliateID';
+      const PARAM_FORCED_BANNER_ID = 'BannerID';
+      const PARAM_FORCED_CAMPAIGN_ID = 'CampaignID';
+      const PARAM_FORCED_CHANNEL_ID = 'Channel';
+      const PARAM_FORCED_IP = 'Ip';
+  
+      private $countryCode;
+  
+      protected $request;
+  
+      /**
+       * @var Gpf_Log_Logger
+       */
+      protected $logger;
+  
+      function __construct() {
+          $this->request = $_REQUEST;
+      }
+  
+      public function parseUrl($url) {
+          $this->request = array();
+          if ($url === null || $url == '') {
+              return;
+          }
+          $parsedUrl = @parse_url('?'.ltrim($url, '?'));
+          if ($parsedUrl === false || !array_key_exists('query', $parsedUrl)) {
+              return;
+          }
+          $args = explode('&', @$parsedUrl['query']);
+          foreach ($args as $arg) {
+              $parts = explode('=', $arg, 2);
+              if (count($parts) == 2) {
+                  $this->request[$parts[0]] = $parts[1];
+              }
+          }
+      }
+  
+      public function getAffiliateId() {
+          return $this->getRequestParameter(self::getAffiliateClickParamName());
+      }
+  
+      public function getForcedAffiliateId() {
+          return $this->getRequestParameter(self::getForcedAffiliateParamName());
+      }
+  
+      public function getBannerId() {
+          return $this->getRequestParameter(self::getBannerClickParamName());
+      }
+  
+      public function getForcedBannerId() {
+          return $this->getRequestParameter(self::getForcedBannerParamName());
+      }
+  
+      /**
+       * @return Pap_Common_User
+       */
+      public function getUser() {
+          try {
+              return Pap_Affiliates_User::loadFromId($this->getRequestParameter($this->getAffiliateClickParamName()));
+          } catch (Gpf_Exception $e) {
+              return null;
+          }
+      }
+  
+      /**
+       * @param string $id
+       * @return string
+       */
+      public function getRawExtraData($i) {
+          $extraDataParamName = $this->getExtraDataParamName($i);
+          if (!isset($this->request[$extraDataParamName])) {
+              return '';
+          }
+          $str = preg_replace("/%u([0-9a-f]{3,4})/i", "&#x\\1;",urldecode($this->request[$extraDataParamName]));
+          return html_entity_decode($str,null,'UTF-8');
+      }
+  
+      public function setRawExtraData($i, $value) {
+          $extraDataParamName = $this->getExtraDataParamName($i);
+          $this->request[$extraDataParamName] = $value;
+      }
+  
+      /**
+       * returns custom click link parameter data1
+       * It first checks for forced parameter Data1 given as parameter to JS tracking code
+       *
+       * @return string
+       */
+      public function getClickData1() {
+          $value = $this->getRequestParameter('pd1');
+          if($value != '') {
+              return $value;
+          }
+  
+          $paramName = $this->getClickData1ParamName();
+          if (!isset($this->request[$paramName])) {
+              return '';
+          }
+          return $this->request[$paramName];
+      }
+  
+      /**
+       * returns custom click link parameter data2
+       * It first checks for forcet parameter Data2 given as parameter to JS tracking code
+       *
+       * @return string
+       */
+      public function getClickData2() {
+          $value = $this->getRequestParameter('pd2');
+          if($value != '') {
+              return $value;
+          }
+  
+          $paramName = $this->getClickData2ParamName();
+          if (!isset($this->request[$paramName])) {
+              return '';
+          }
+          return $this->request[$paramName];
+      }
+  
+      public function getClickData1ParamName() {
+          return Gpf_Settings::get(Pap_Settings::PARAM_NAME_EXTRA_DATA.'1');
+      }
+  
+      public function getClickData2ParamName() {
+          return Gpf_Settings::get(Pap_Settings::PARAM_NAME_EXTRA_DATA.'2');
+      }
+  
+      public function getRefererUrl() {
+          if (isset($this->request[self::PARAM_REFERRERURL_NAME]) && $this->request[self::PARAM_REFERRERURL_NAME] != '') {
+              return self::decodeRefererUrl($this->request[self::PARAM_REFERRERURL_NAME]);
+          }
+          if (isset($_SERVER['HTTP_REFERER'])) {
+              return self::decodeRefererUrl($_SERVER['HTTP_REFERER']);
+          }
+          return '';
+      }
+  
+      public function getIP() {
+          if ($this->getForcedIp() !== '') {
+              return $this->getForcedIp();
+          }
+          return Gpf_Http::getRemoteIp();
+      }
+  
+      public function getCountryCode() {
+          if ($this->countryCode === null) {
+              $context = new Gpf_Data_Record(
+              array(Pap_Db_Table_RawImpressions::IP, Pap_Db_Table_Impressions::COUNTRYCODE), array($this->getIP(), ''));
+              Gpf_Plugins_Engine::extensionPoint('Tracker.request.getCountryCode', $context);
+              $this->countryCode = $context->get(Pap_Db_Table_Impressions::COUNTRYCODE);
+          }
+          return $this->countryCode;
+      }
+  
+      public function getBrowser() {
+          if (!isset($_SERVER['HTTP_USER_AGENT'])) {
+              return '';
+          }
+          return substr(md5($_SERVER['HTTP_USER_AGENT']), 0, 6);
+      }
+  
+      public function getLinkStyle() {
+          if (!isset($this->request[self::PARAM_LINK_STYLE]) || $this->request[self::PARAM_LINK_STYLE] != '1') {
+              return Pap_Tracking_ClickTracker::LINKMETHOD_REDIRECT;
+          }
+          return Pap_Tracking_ClickTracker::LINKMETHOD_URLPARAMETERS;
+      }
+  
+      /**
+       * set logger
+       *
+       * @param Gpf_Log_Logger $logger
+       */
+      public function setLogger($logger) {
+          $this->logger = $logger;
+      }
+  
+      protected function debug($msg) {
+          if($this->logger != null) {
+              $this->logger->debug($msg);
+          }
+      }
+  
+      public function getRequestParameter($paramName) {
+          if (!isset($this->request[$paramName])) {
+              return '';
+          }
+          return $this->request[$paramName];
+      }
+  
+      public function setRequestParameter($paramName, $value) {
+          $this->request[$paramName] = $value;
+      }
+  
+      static public function getRotatorBannerParamName() {
+          return Gpf_Settings::get(Pap_Settings::PARAM_NAME_ROTATOR_ID);
+      }
+  
+      static public function getSpecialDestinationUrlParamName() {
+          return Gpf_Settings::get(Pap_Settings::PARAM_NAME_DESTINATION_URL);
+      }
+  
+      public function getRotatorBannerId() {
+          return $this->getRequestParameter(self::getRotatorBannerParamName());
+      }
+  
+      public function getExtraDataParamName($i) {
+          return Gpf_Settings::get(Pap_Settings::PARAM_NAME_EXTRA_DATA).$i;
+      }
+  
+      public function getDebug() {
+          if(isset($_GET[self::PARAM_ACTION_DEBUG])) {
+              return strtoupper($_GET[self::PARAM_ACTION_DEBUG]);
+          }
+          return '';
+      }
+  
+      public function toString() {
+          $params = array();
+          foreach($this->request as $key => $value) {
+              $params .= ($params != '' ? ", " : '')."$key=$value";
+          }
+          return $params;
+      }
+  
+      public function getRecognizedClickParameters() {
+          $params = 'Debug='.$this->getDebug();
+          $params .= ',Data1='.$this->getClickData1();
+          $params .= ',Data2='.$this->getClickData2();
+  
+          return $params;
+      }
+  
+      static public function getAffiliateClickParamName() {
+          return Gpf_Settings::get(Pap_Settings::PARAM_NAME_USER_ID);
+      }
+  
+      static public function getBannerClickParamName() {
+          $parameterName = trim(Gpf_Settings::get(Pap_Settings::PARAM_NAME_BANNER_ID));
+          if($parameterName == '') {
+              $mesage = Gpf_Lang::_('Banner ID parameter name is empty. Review URL parameter name settings');
+              Gpf_Log::critical($mesage);
+              throw new Gpf_Exception($mesage);
+          }
+          return $parameterName;
+      }
+  
+      static public function getChannelParamName() {
+          return Pap_Tracking_Request::PARAM_CHANNEL_DEFAULT;
+      }
+  
+      public function getChannelId() {
+          return $this->getRequestParameter(self::getChannelParamName());
+      }
+  
+      static public function getForcedAffiliateParamName() {
+          return Pap_Tracking_Request::PARAM_FORCED_AFFILIATE_ID;
+      }
+  
+      static public function getForcedBannerParamName() {
+          return Pap_Tracking_Request::PARAM_FORCED_BANNER_ID;
+      }
+  
+      public function getForcedCampaignId() {
+          return $this->getRequestParameter(self::getForcedCampaignParamName());
+      }
+  
+      static public function getForcedCampaignParamName() {
+          return Pap_Tracking_Request::PARAM_FORCED_CAMPAIGN_ID;
+      }
+  
+      public function getForcedChannelId() {
+          return $this->getRequestParameter(Pap_Tracking_Request::PARAM_FORCED_CHANNEL_ID);
+      }
+  
+      public function getCampaignId() {
+          return $this->getRequestParameter(self::getCampaignParamName());
+      }
+  
+      static public function getCampaignParamName() {
+          $parameterName = trim(Gpf_Settings::get(Pap_Settings::PARAM_NAME_CAMPAIGN_ID));
+          if($parameterName == '') {
+              $mesage = Gpf_Lang::_('Campaign ID parameter name is empty. Review URL parameter name settings');
+              Gpf_Log::critical($mesage);
+              throw new Gpf_Exception($mesage);
+          }
+          return $parameterName;
+      }
+  
+      public function getCurrency() {
+          return $this->getRequestParameter(self::PARAM_CURRENCY);
+      }
+  
+      /**
+       * @deprecated used in CallBackTracker plugins only. should be moved to callback tracker
+       */
+      public function getPostParam($name) {
+          if (!isset($_POST[$name])) {
+              return '';
+          }
+          return $_POST[$name];
+      }
+  
+      /**
+       * This function does escape http:// and https:// in url as mod_rewrite disables requests with ://
+       *
+       * @param $url
+       * @return encoded url
+       */
+      public static function encodeRefererUrl($url) {
+          $url = str_replace('http://', 'H_', $url);
+          $url = str_replace('https://', 'S_', $url);
+          return $url;
+      }
+  
+      /**
+       * This function does decoded encoded url
+       *
+       * @param encoded $url
+       * @return $url
+       */
+      public static function decodeRefererUrl($url) {
+          if (substr($url, 0, 2) == 'H_') {
+              return 'http://' . substr($url, 2);
+          }
+          if (substr($url, 0, 2) == 'S_') {
+              return 'https://' . substr($url, 2);
+          }
+          return $url;
+      }
+  
+      private function getForcedIp() {
+          return $this->getRequestParameter(self::PARAM_FORCED_IP);
+      }
+  }
+
+} //end Pap_Tracking_Request
+
+if (!class_exists('Pap_Api_Tracker', false)) {
+  class Pap_Api_Tracker extends Gpf_Object {
+  
+      /**
+       * @var Gpf_Api_Session
+       */
+      private $session;
+      private $trackingResponse;
+      private $visitorId;
+      private $accountId;
+      /**
+       * @var array<Pap_Tracking_Action_RequestActionObject>
+       */
+      private $sales = array();
+      const VISITOR_COOKIE_NAME = 'PAPVisitorId';
+      
+      const NOT_LOADED_YET = '-1';
+      /**
+       * @var Gpf_Rpc_Data
+       */
+      private $affiliate = self::NOT_LOADED_YET;
+      /**
+       * @var Gpf_Rpc_Data
+       */
+      private $campaign = self::NOT_LOADED_YET;
+      /**
+       * @var Gpf_Rpc_Data
+       */
+      private $channel = self::NOT_LOADED_YET;
+      
+      /**
+       * This class requires correctly initialized merchant session
+       *
+       * @param Gpf_Api_Session $session
+       */
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Exception("This class can be used only by merchant!");
+          }
+          $this->session = $session;
+          $this->visitorId = @$_COOKIE[self::VISITOR_COOKIE_NAME];
+      }
+      
+      public function setVisitorId($visitorId) {
+          $this->visitorId = $visitorId;
+      }
+  
+      public function getVisitorId() {
+          return $this->visitorId;
+      }
+  
+      public function setAccountId($accountId) {
+          $this->accountId = $accountId;
+      }
+      
+      public function track() {
+          $request = new Gpf_Net_Http_Request();
+          $request->setUrl(str_replace('server.php', 'track.php', $this->session->getUrl()));
+          $request->setMethod('POST');
+  
+  		$this->setQueryParams($request);
+          if ($this->session->getDebug()) {
+              $request->addQueryParam('PDebug', 'Y');
+          }
+          
+          $request->setUrl($request->getUrl() . $request->getQuery());
+          $request->setBody("sale=".$this->getSaleParams());
+          if ($this->session->getDebug()) {
+              echo 'Tracking request: '.$request->getUrl()."<br>\n";
+          }
+          $response = $this->sendRequest($request);
+          $this->trackingResponse = trim($response->getBody());
+          if ($this->session->getDebug()) {
+              echo 'Tracking response: '.$this->trackingResponse."<br>\n";
+          }
+          $this->parseResponse();
+          $this->affiliate = self::NOT_LOADED_YET;
+      }
+      
+      protected function setQueryParams(Gpf_Net_Http_Request $request) {
+      	$request->addQueryParam('visitorId', $this->visitorId);
+      	$request->addQueryParam('accountId', $this->accountId);
+          $request->addQueryParam('url', Pap_Tracking_Request::encodeRefererUrl($this->getUrl()));
+          $request->addQueryParam('referrer', Pap_Tracking_Request::encodeRefererUrl($this->getReferrerUrl()));
+          $request->addQueryParam('tracking', '1');
+          $request->addQueryParam('getParams', $this->getGetParams()->getQuery());
+          $request->addQueryParam('cookies', $this->getOldCookies());
+          $request->addQueryParam('ip', $this->getIp());
+          $request->addQueryParam('useragent', $this->getUserAgent());
+      }
+      
+      protected function getIp() {
+      	return @Gpf_Http::getRemoteIp();
+      }
+      
+      protected function getUserAgent() {
+      	return @$_SERVER['HTTP_USER_AGENT'];
+      }
+      
+      protected function sendRequest(Gpf_Net_Http_Request $request) {
+          $client = new Gpf_Net_Http_Client();
+          return $client->execute($request);
+      }
+  
+      public function saveCookies() {
+          if ($this->trackingResponse == '') {
+              return;
+          }
+          $this->includeJavascript();
+          $this->saveCookiesByJavascript();
+      }
+  
+      public function save3rdPartyCookiesOnly($cookieDomainValidity = null) {
+      	if ($this->visitorId == null) {
+              return;
+          }
+          $this->save3rdPartyCookie(self::VISITOR_COOKIE_NAME, $this->visitorId, time() + 315569260, true, $cookieDomainValidity);
+      }
+  
+      /**
+       * @return Gpf_Rpc_Data
+       */
+      public function getAffiliate() {
+      	return $this->getData($this->affiliate, 'getAffiliate', 'userid');
+      }
+      
+      /**
+       * @return Gpf_Rpc_Data
+       */
+      public function getCampaign() {
+      	return $this->getData($this->campaign, 'getCampaign', 'campaignid');
+      }
+  
+      /**
+       * @return Gpf_Rpc_Data
+       */
+      public function getChannel() {
+          return $this->getData($this->channel, 'getChannel', 'channelid');
+      }
+  
+      private function getData(&$data, $method, $primaryKeyName) {
+      	if ($this->visitorId == '') {
+              return null;
+          }
+          if ($data === self::NOT_LOADED_YET) {
+              $request = new Gpf_Rpc_DataRequest('Pap_Tracking_Visit_SingleVisitorProcessor', $method, $this->session);
+              $request->addParam('visitorId', $this->visitorId);
+              $request->addParam('accountId', $this->accountId);
+              $request->sendNow();
+              $data = $request->getData();
+              if (is_null($data->getValue($primaryKeyName))) {
+              	$data = null;
+              }
+          }
+          return $data;
+      }
+      
+      /**
+       * Creates and returns new sale
+       *
+       * @return Pap_Tracking_ActionObject
+       */
+      public function createSale() {
+          return $this->createAction('');
+      }
+  
+      /**
+       * Creates and returns new action
+       *
+       * @param string $actionCode
+       * @return Pap_Tracking_ActionObject
+       */
+      public function createAction($actionCode = '') {
+          $sale = new Pap_Tracking_Action_RequestActionObject();
+          $sale->setActionCode($actionCode);
+          $this->sales[] = $sale;
+          return $sale;
+      }
+  
+      protected function getSaleParams() {
+          if (count($this->sales) == 0) {
+              return '';
+          }
+          $json = new Gpf_Rpc_Json();
+          return $json->encode($this->sales);
+      }
+      
+      /**
+       * Parses track.php response. Response can be empty or setVisitor('4c5e2151b8856e55dbfeb247c22300Hg');
+       */
+      private function parseResponse() {
+          if ($this->trackingResponse == '') {
+              return;
+          }
+          if (!preg_match('/^setVisitor\(\'([a-zA-Z0-9]+)\'\);/', $this->trackingResponse, $matches)) {
+              return;
+          }
+          if ($matches[1] != '') {
+              $this->visitorId = $matches[1];
+          }
+      }
+  
+      private function includeJavascript() {
+          $trackjsUrl = str_replace('server.php', 'trackjs.php', $this->session->getUrl());
+          echo '<script id="pap_x2s6df8d" src="'.$trackjsUrl.'" type="text/javascript"></script>';
+      }
+  
+      private function saveCookiesByJavascript() {
+          echo '<script type="text/javascript">'.$this->trackingResponse.'</script>';
+      }
+  
+      protected function getUrl() {
+          if (array_key_exists('PATH_INFO', $_SERVER) && @$_SERVER['PATH_INFO'] != '') {
+              $scriptName = str_replace('\\', '/', @$_SERVER['PATH_INFO']);
+          } else {
+              if (array_key_exists('SCRIPT_NAME', $_SERVER)) {
+                  $scriptName = str_replace('\\', '/', @$_SERVER['SCRIPT_NAME']);
+              } else {
+                  $scriptName = '';
+              }
+          }
+          $portString = '';
+          if(isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 80
+          && $_SERVER['SERVER_PORT'] != 443) {
+              $portString = ':' . $_SERVER["SERVER_PORT"];
+          }
+          $protocol = 'http';
+          if(isset($_SERVER['HTTPS']) && strlen($_SERVER['HTTPS']) > 0 && strtolower($_SERVER['HTTPS']) != 'off') {
+              $protocol = 'https';
+          }
+          return $protocol . '://' . $this->getServerName() . $portString . $scriptName;
+      }
+  
+      private function getServerName() {
+          if (isset($_SERVER["SERVER_NAME"])) {
+              return $_SERVER["SERVER_NAME"];
+          }
+          return 'localhost';
+      }
+  
+      protected function getReferrerUrl() {
+          if (array_key_exists('HTTP_REFERER', $_SERVER) && $_SERVER['HTTP_REFERER'] != '') {
+              return $_SERVER['HTTP_REFERER'];
+          }
+          return '';
+      }
+  
+      protected function getOldCookies() {
+          $oldCookieNames = array('PAPCookie_Sale', 'PAPCookie_FirstClick', 'PAPCookie_LastClick');
+          $oldCookies = '';
+          foreach ($oldCookieNames as $oldCookieName) {
+              if (array_key_exists($oldCookieName, $_COOKIE) && $_COOKIE[$oldCookieName] != '') {
+                  $oldCookies .= $oldCookieName.'='.urlencode($_COOKIE[$oldCookieName]).'||';
+              }
+          }
+          return rtrim($oldCookies, '||');
+      }
+  
+      /**
+       * @return Gpf_Net_Http_Request
+       */
+      protected function getGetParams() {
+          $getParams = new Gpf_Net_Http_Request();
+          if (is_array($_GET) && count($_GET) > 0) {
+              foreach ($_GET as $name => $value) {
+                  $getParams->addQueryParam($name, $value);
+              }
+          }
+          return $getParams;
+      }
+  
+      protected function save3rdPartyCookie($name, $value, $expire, $overwrite, $cookieDomainValidity = null) {
+          if (!$overwrite && isset($_COOKIE[$name]) && $_COOKIE[$name] != '') {
+              return;
+          }
+          if ($cookieDomainValidity == null) {
+              Gpf_Http::setCookie($name, $value, $expire, "/");
+          } else {
+              Gpf_Http::setCookie($name, $value, $expire, "/", $cookieDomainValidity);
+          }
+      }
+  
+  }
+
+} //end Pap_Api_Tracker
+
+if (!class_exists('Pap_Api_SaleTracker', false)) {
+  class Pap_Api_SaleTracker extends Pap_Api_Tracker {
+  
+      /**
+       * @param string $saleScriptUrl Url to sale.php script
+       */
+      public function __construct($saleScriptUrl, $debug = false) {
+          $session = new Gpf_Api_Session(str_replace('sale.php', 'server.php', $saleScriptUrl));
+          if ($debug) {
+              $session->setDebug(true);
+          }
+          parent::__construct($session);
+      }
+  
+      /**
+       * sets value of the cookie to be used
+       *
+       * @param string $value
+       */
+      public function setCookieValue($value) {
+          $this->setVisitorId($value);
+      }
+  
+      /**
+       * Registers all created sales
+       */
+      public function register() {
+          $this->track();
+      }
+  }
+
+} //end Pap_Api_SaleTracker
+
+if (!class_exists('Pap_Api_ClickTracker', false)) {
+  class Pap_Api_ClickTracker extends Pap_Api_Tracker {
+      
+      private $affiliateId;
+      private $bannerId;
+      private $campaignId;
+      private $data1;
+      private $data2;
+      private $channelId;
+      
+      /**
+       * This class requires correctly initialized merchant session
+       * @param Gpf_Api_Session $session
+       */
+      public function __construct(Gpf_Api_Session $session) {
+          parent::__construct($session);
+      }
+      
+          /**
+       * Use this function if you want to explicitly specify affiliate which made the click
+       *
+       * @param $affiliateId
+       */
+      public function setAffiliateId($affiliateId) {
+          $this->affiliateId = $affiliateId;
+      }
+  
+      /**
+       * Use this function if you want to explicitly specify banner through which the click was made
+       *
+       * @param $bannerId
+       */
+      public function setBannerId($bannerId) {
+          $this->bannerId = $bannerId;
+      }
+  
+      /**
+       * Use this function if you want to explicitly specify campaign for this click
+       *
+       * @param $campaignId
+       */
+      public function setCampaignID($campaignId) {
+          $this->campaignId = $campaignId;
+      }
+  
+      public function setData1($data1) {
+          $this->data1 = $data1;
+      }
+  
+      public function setData2($data2) {
+          $this->data2 = $data2;
+      }
+  
+      /**
+       * Use this function if you want to explicitly specify channel through which this click was made
+       *
+       * @param $bannerId
+       */
+      public function setChannel($channelId) {
+          $this->channelId = $channelId;
+      }
+      
+      /**
+       * @return Gpf_Net_Http_Request
+       */
+      protected function getGetParams() {
+          $getParams = parent::getGetParams();
+          if ($this->affiliateId != '') {
+              $getParams->addQueryParam('AffiliateID', $this->affiliateId);
+          }
+          if ($this->bannerId != '') {
+              $getParams->addQueryParam('BannerID', $this->bannerId);
+          }
+          if ($this->campaignId != '') {
+              $getParams->addQueryParam('CampaignID', $this->campaignId);
+          }
+          if ($this->channelId != '') {
+              $getParams->addQueryParam('chan', $this->channelId);
+          }
+          if ($this->data1 != '') {
+              $getParams->addQueryParam('pd1', $this->data1);
+          }
+          if ($this->data2 != '') {
+              $getParams->addQueryParam('pd2', $this->data2);
+          }
+          return $getParams;
+      }
+  }
+
+} //end Pap_Api_ClickTracker
+
+if (!class_exists('Pap_Api_RecurringCommission', false)) {
+  class Pap_Api_RecurringCommission extends Pap_Api_Object {
+  	
+      public function __construct(Gpf_Api_Session $session) {
+          parent::__construct($session);
+          $this->class = 'Pap_Features_RecurringCommissions_RecurringCommissionsForm';
+      }
+      
+      public function setOrderId($value) { 
+      	$this->setField('orderid', $value);    
+      }
+  
+      public function setTotalCost($value) { 
+      	$this->setField('totalcost', $value);    
+      }
+  
+      public function getId() {
+          return $this->getField('recurringcommissionid');
+      }
+      
+      protected function getPrimaryKey() {
+      	return "id";
+      }
+  
+      protected function getGridRequest() {
+  		return new Pap_Api_RecurringCommissionsGrid($this->getSession());
+      }  
+      
+      public function createCommissions() {
+          $request = new Gpf_Rpc_ActionRequest('Pap_Features_RecurringCommissions_RecurringCommissionsForm',
+                                               'createCommissions', $this->getSession());
+          $request->addParam('id', $this->getId());
+          $request->addParam('orderid', $this->getField('orderid'));
+          $request->addParam('totalcost', $this->getField('totalcost'));
+          $request->sendNow();
+          $action = $request->getAction();
+          if ($action->isError()) {
+              throw new Gpf_Exception($action->getErrorMessage());
+          }
+      }
+  }
+
+} //end Pap_Api_RecurringCommission
+
+if (!class_exists('Pap_Api_RecurringCommissionsGrid', false)) {
+  class Pap_Api_RecurringCommissionsGrid extends Gpf_Rpc_GridRequest {
+      
+      private $dataValues = null;
+      
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Exception("This class can be used only by merchant!");
+          } else {
+              parent::__construct("Pap_Features_RecurringCommissions_RecurringCommissionsGrid", "getRows", $session);
+          }
+      }
+  }
+
+} //end Pap_Api_RecurringCommissionsGrid
+
+if (!class_exists('Pap_Api_PayoutsGrid', false)) {
+  class Pap_Api_PayoutsGrid extends Gpf_Rpc_GridRequest {
+      
+      private $affiliatesToPay = array();
+      
+      public function __construct(Gpf_Api_Session $session) {
+          if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Gpf_Exception('Only merchant can view payouts grid. Please login as merchant.');
+          }
+          
+          $className = 'Pap_Merchants_Payout_PayAffiliatesGrid';
+          parent::__construct($className, 'getRows', $session);
+      }
+      
+      public function payAffiliates($paymentNote = '', $affiliateNote = '', $send_payment_to_affiliate = Gpf::NO, $send_generated_invoices_to_merchant = Gpf::NO, $send_generated_invoices_to_affiliates = Gpf::NO) {
+          $this->checkMerchantRole();
+          if (count($this->getAffiliatesToPay()) == 0) {
+              throw new Gpf_Exception('You must select at least one affiliate to pay.');
+          }
+          try {
+              $this->sendMarkTransactionsCall();
+          } catch (Gpf_Exception $e) {
+              throw new Gpf_Exception('Error during marking as pending payments: ' . $e->getMessage());
+          }
+          try {
+             $this->sendPayTransactionsCall($paymentNote, $affiliateNote, $send_payment_to_affiliate, $send_generated_invoices_to_merchant, $send_generated_invoices_to_affiliates);
+          } catch (Gpf_Exception $e) {
+              throw new Gpf_Exception('Error during paying affiliates: ' . $e->getMessage());
+          }
+      }
+      
+      protected function sendMarkTransactionsCall() {
+          $request = new Gpf_Rpc_ActionRequest('Pap_Merchants_Payout_PayAffiliatesFormExportGrid', 'markTransactionsAsPaymentPending', $this->apiSessionObject);
+          $request->addParam('ids', new Gpf_Rpc_Array($this->getAffiliatesToPay()));
+          $request->addParam('filters', new Gpf_Rpc_Array($this->getFilters()));
+          $request->sendNow();
+          
+          if ($request->getResponseError() != '') {
+              throw new Gpf_Exception($request->getResponseError());
+          }
+      }
+      
+      protected function sendPayTransactionsCall($paymentNote, $affiliateNote, $send_payment_to_affiliate, $send_generated_invoices_to_merchant, $send_generated_invoices_to_affiliates) {
+          $request = new Gpf_Rpc_FormRequest('Pap_Merchants_Payout_PayAffiliatesForm', 'payAffiliates', $this->apiSessionObject);
+          $request->setField('paymentNote', $paymentNote);
+          $request->setField('affiliateNote', $affiliateNote);
+          $request->setField('send_payment_to_affiliate', $send_payment_to_affiliate);
+          $request->setField('send_generated_invoices_to_merchant', $send_generated_invoices_to_merchant);
+          $request->setField('send_generated_invoices_to_affiliates', $send_generated_invoices_to_affiliates);
+          $request->sendNow();
+         
+          if ($request->getResponseError() != '') {
+              throw new Gpf_Exception($request->getResponseError());
+          }
+      }
+      
+      public function addAllAffiliatesToPay() {
+          $this->checkMerchantRole();
+          try {
+              $grid = $this->getGrid();
+              $recordset = $grid->getRecordset();
+              foreach($recordset as $rec) {
+                  $this->addAffiliateToPay($rec->get('id'));
+              }
+          } catch (Gpf_Exception $e) {
+              throw new Gpf_Exception('You must load list of affiliates first!');
+          }
+      }
+      
+      public function addAffiliateToPay($affiliateId) {
+          if(!in_array($affiliateId, $this->affiliatesToPay)) {
+              $this->affiliatesToPay[] = $affiliateId;
+          }
+      }
+      
+      public function getAffiliatesToPay() {
+          return $this->affiliatesToPay;
+      }
+      
+      private function checkMerchantRole() {
+          if($this->apiSessionObject->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Gpf_Exception('Only merchant is allowed to pay affiliates.');
+          }
+      }
+  }
+
+} //end Pap_Api_PayoutsGrid
+
+if (!class_exists('Pap_Api_PayoutsHistoryGrid', false)) {
+  class Pap_Api_PayoutsHistoryGrid extends Gpf_Rpc_GridRequest {
+      public function __construct(Gpf_Api_Session $session) {
+      	if($session->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Gpf_Exception('Only merchant can view payouts history. Please login as merchant.');
+          }
+          parent::__construct('Pap_Merchants_Payout_PayoutsHistoryGrid', 'getRows', $session);
+      }
+      
+      public function getPayeesDeatilsInfo($payoutId) {
+          $this->checkMerchantRole();
+          $request = new Gpf_Rpc_DataRequest('Pap_Merchants_Payout_PayoutsHistoryGrid', 'payeesDetails', $this->apiSessionObject);
+          $request->addFilter('id', 'E', $payoutId);
+          $request->sendNow();
+          $results = $request->getData();
+          
+          $output = array();
+          
+          for ($i=0; $i<$results->getSize(); $i++) {
+              $userinfo = $results->getValue('user' . $i);
+              $data = new Gpf_Rpc_Data();
+              $data->loadFromObject($userinfo);
+              $output[] = $data;
+          }
+          return $output;
+      }
+      
+      private function checkMerchantRole() {
+          if($this->apiSessionObject->getRoleType() == Gpf_Api_Session::AFFILIATE) {
+              throw new Gpf_Exception('Only merchant is allowed to to view payee details.');
+          }
+          return true;
+      }
+  }
+
+} //end Pap_Api_PayoutsHistoryGrid
+
+if (!class_exists('Gpf_Net_Http_Client', false)) {
+    class Gpf_Net_Http_Client extends Gpf_Net_Http_ClientBase {
+
+        protected function isNetworkingEnabled() {
+            return true;
+        }
+
+        protected function setProxyServer(Gpf_Net_Http_Request $request) {
+        }
+    }
+}
+/*
+VERSION
+09ea4dd9533d8ef7130c7ed92c84b4d9
+*/
+?>
Index: /mods/mod_productfilter/wpsg_mod_productfilter_widget.class.php
===================================================================
--- /mods/mod_productfilter/wpsg_mod_productfilter_widget.class.php	(revision 5261)
+++ /mods/mod_productfilter/wpsg_mod_productfilter_widget.class.php	(revision 5261)
@@ -0,0 +1,48 @@
+<?php
+
+	/**
+	 * Widget Klasse fÃŒr die Anzeige des Produktfilters im Frontend
+	 */
+	class wpsg_mod_productfilter_widget extends WP_Widget 
+	{
+		
+		var $id = "wpsg_mod_productfilter_widget";
+		var $db = false;
+		var $shop = false;
+		
+		function wpsg_mod_productfilter_widget()
+		{
+						
+	    	$this->WP_Widget('wpsg_mod_productfilter_widget', 'wpShopGermany Produktfilter', array(
+	    		"description" => __("wpShopGermany Produktfilter", 'wpsg')
+	    	));
+	    	
+	  	} // function wpsg_login()
+	 
+	  	function widget($args, $settings)
+	  	{
+
+	  		$this->db = &$GLOBALS['wpsg_db'];
+	  		$this->shop = &$GLOBALS['wpsg_sc'];
+	  		
+	  		$arSet = $this->shop->get_option('wpsg_mod_productfilter_show');
+	  		
+	  		$this->shop->view['wpsg_mod_productfilter']['arShow'] = array();
+	  		wpsg_debug("=".is_page());
+	  		if (wpsg_isSizedArray($arSet))
+	  		{
+	  			
+	  			
+	  			
+	  		}
+	  		
+	  		$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productfilter/widget.phtml');
+	  		
+	  	} // function widget($args, $settings)
+	 
+	  	function form($instance) { } // function form($instance)
+	 	  
+		function update($new_instance, $old_instance) { return $old_instance; } // function update( $new_instance, $old_instance ) {
+	  	
+	} // class wpsg_mod_productfilter_widget Extends WP_Widget 
+?>
Index: /mods/mod_rechnungen/changelog
===================================================================
--- /mods/mod_rechnungen/changelog	(revision 8528)
+++ /mods/mod_rechnungen/changelog	(revision 5261)
@@ -112,3 +112,2 @@
   - Feature: Vorschau fÃŒr Gutschriften
   - Bugfix: FuÃtexte lassen sich lÃ¶schen
-
Index: ds/mod_rechnungen/eInvoice.php
===================================================================
--- /mods/mod_rechnungen/eInvoice.php	(revision 8528)
+++ 	(revision )
@@ -1,277 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 28.08.24
-	 * @time: 07:06
-	 */
-	
-	namespace wpsg\mod_invoice;
-	
-	use wpsg\wpsg_calculation;
-	use wpsg\wpsg_invoice;
-	use \wpsg_order;
-
-	use horstoeko\zugferd\{
-		ZugferdDocumentBuilder, ZugferdProfiles, codelists\ZugferdInvoiceType, ZugferdDocumentPdfBuilder
-	};
-	
-	abstract class eInvoice {
-	
-		public static function buildUrl(int $invoice_id, int $profil_id): string {
-			
-			$oInvoice = wpsg_invoice::getInstance($invoice_id);
-			$oOrder = $oInvoice->getOrder();
-			
-			return html_entity_decode(wp_nonce_url(
-				WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_rechnungen&do=getRechnung&edit_id='.$oOrder->getId().'&r_id='.$oInvoice->getId().'&profil_id='.$profil_id, 'wpsg-mod_invoice-order_ajax-getRechnung-'.$oInvoice->getId()
-			));
-			
-		}
-		
-		public static function writeEInvoice(int $order_id, int $invoice_id, int $profil_id = 0): string {
-			
-			$oInvoice = wpsg_invoice::getInstance($invoice_id);
-			
-			$shop = \wpsg_ShopController::getShop();
-			
-			if ($profil_id === 0) $profil_id = intval($shop->get_option('wpsg_mod_rechnungen_einvoice')) - 100;
-			
-			if ($profil_id >= 0) {
-
-				/** @var \wpsg_order $oOrder */
-				$oOrder = wpsg_order::getInstance($order_id);
-				
-				$pdf_file = $oInvoice->getFilePath(true);
-				$pdf_path = dirname($pdf_file).DIRECTORY_SEPARATOR;
-
-				$document = ZugferdDocumentBuilder::CreateNew($profil_id);
-				
-				$arCalculation = wpsg_calculation::getOrderCalculation($order_id)->getCalculationArray();
-
-				$buyer_reference = trim($oOrder->getLeitwegId());
-				if ($buyer_reference === '') $buyer_reference = $oOrder->getCustomer()->getNr();
-
-				// https://www.e-rechnung-bund.de/wp-content/uploads/2023/04/Uebersichtslisten-Eingabefelder-OZG-RE.pdf
-				// https://easyfirma.net/e-rechnung/zugferd/bt-felder
-				// https://www.xoev.de/sixcms/media.php/13/201-xrechnung-2020-12-16.pdf
-				// https://erechnungsvalidator.service-bw.de/
-
-				$bt_9 = null;
-
-				$bt_20 = "Bitte Zahlungsanweisung auf PDF beachten.";
-
-				// Zuschlagbetrag (ohne Umsatzsteuer), der zum Gesamtrechnungsbetrag hinzugefÃŒgt wird.
-				$bt_99 = 0;
-
-				// BT-106 / Hier finden Sie die Summe aller Nettopositionen ohne Umsatzsteuer, NachlÃ€sse und ZuschlÃ€ge.
-				$bt_106 = $oInvoice->getSumNetto();
-
-				// BT-107 / Hier finden Sie die Summe aller NachlÃ€sse auf Ebene der Rechnung (ohne NachlÃ€sse auf Positionsebene).
-				$bt_107 = 0;
-
-				// BT-108 / Hier finden Sie die Summe aller ZuschlÃ€ge auf Dokumentenebene (ohne ZuschlÃ€ge auf Positionsebene).
-				$bt_108 = 0;
-
-				// BT-109 / Hier finden Sie den Gesamtbetrag der Rechnung ohne Umsatzsteuer.
-				$bt_109 = $oInvoice->getSumNetto();
-
-				// BT-110 / Hier finden Sie den Gesamtbetrag der Umsatzsteuer der Rechnung.
-				$bt_110 = $oInvoice->getTaxSum();
-
-				// BT-112 / Gesamtbetrag der Rechnungsumsatzsteuer
-				$bt_112 = $oInvoice->getSumBrutto();
-
-				// BT-113 / Vorauszahlungsbetrag
-				$bt_113 = 0;
-
-				// BT-114 / Rundungsbetrag
-				$bt_114 = 0;
-
-				// BT-115 / Hier finden Sie den ausstehenden Betrag. Er ergibt sich aus dem Rechnungsbetrag (brutto) abzÃŒglich des gezahlten Betrags.
-				$bt_115 = round($oInvoice->getSumBrutto(), 2);
-
-				// BT-131 / Gesamtpreis ohne Umsatzsteuer, einschlieÃlich aller NachlÃ€sse, ZuschlÃ€ge und weiterer anfallender Steuern.
-				$bt_131 = round($oInvoice->getSumNetto(), 2);
-
-				$buyer_email = trim($oOrder->getCustomer()->getEMailEInvoice()??'');
-				if ($buyer_email === '') $buyer_email = $oOrder->getCustomer()->getEMail();
-
-				$buyer_email = trim($oOrder->getCustomer()->getEMailEInvoice()??'');
-				if ($buyer_email === '') $buyer_email = $oOrder->getCustomer()->getEMail();
-
-				$document
-					 //->addDocumentAllowanceCharge($bt_99, true, 'S', 'VAT', 0)
-					->setDocumentSellerLegalOrganisation(null, null, $shop->get_option('wpsg_shopdata_owner', default: ''))
-					->setDocumentInformation($oInvoice->getNr(), ZugferdInvoiceType::INVOICE, \DateTime::createFromFormat("Ymd", $oInvoice->getDate('Ymd')), "EUR")
-					->addDocumentNote(wpsg_translate(__('Rechnung #1# zu Bestellung #2#', 'wpsg'), $oInvoice->getNr(), $oOrder->getNr()))
-					// ->setDocumentSupplyChainEvent(\DateTime::createFromFormat('Ymd', '20180305')) Lieferinformation
-					->setDocumentSeller($shop->get_option('wpsg_shopdata_name', default: ''))
-					->setDocumentSellerCommunication('EM', $shop->get_option('wpsg_shopdata_email', default: ''))
-
-//					->setDocumentBuyerReference("04011000-12345ABCXYZ-86")
-					->setDocumentBuyerReference($buyer_reference)
-
-					// https://service.unece.org/trade/untdid/d16b/tred/tred4461.htm
-					->addDocumentPaymentMean(match($oOrder->getPaymentID()) {
-						/** TODO: Zahlungsarten Codes */
-						default => 'ZZZ'
-					}, $oOrder->getPaymentLabel())
-
-					//->addDocumentSellerGlobalId("4000001123452", "0088")
-					->addDocumentSellerTaxRegistration("FC", $shop->get_option('wpsg_shopdata_taxnr', default: ''))
-					->addDocumentSellerTaxRegistration("VA", $shop->get_option('wpsg_shopdata_ustidnr', default: ''))
-					->setDocumentSellerAddress(
-						$shop->get_option('wpsg_shopdata_street', default: ''),
-						"",
-						"",
-						$shop->get_option('wpsg_shopdata_zip', default: ''),
-						$shop->get_option('wpsg_shopdata_city', default: ''),
-						\wpsg_country::getInstance(intval($shop->get_option('wpsg_shopdata_country')))->getShorttext()
-					)
-					->addDocumentSellerContact(
-						$shop->get_option('wpsg_shopdata_owner', default: ''),
-						__('Rechnungsabteilung', 'wpsg'),
-						$shop->get_option('wpsg_shopdata_eu_tel', default: ''),
-						$shop->get_option('wpsg_shopdata_eu_fax', default: ''),
-						$shop->get_option('wpsg_shopdata_email', default: '')
-					)
-					->setDocumentSellerContact(
-						$shop->get_option('wpsg_shopdata_owner', default: ''),
-						__('Rechnungsabteilung', 'wpsg'),
-						$shop->get_option('wpsg_shopdata_eu_tel', default: ''),
-						$shop->get_option('wpsg_shopdata_eu_fax', default: ''),
-						$shop->get_option('wpsg_shopdata_email', default: '')
-					)
-					->addDocumentBuyerTaxRegistration(
-						$oOrder->getInvoiceFax(),
-					)
-					->setDocumentBuyer($oOrder->getInvoiceFirstName() . " " . $oOrder->getInvoiceName(), strval($oOrder->getId()))
-					->setDocumentBuyerAddress(
-						$oOrder->getInvoiceStreet(),
-						"",
-						"",
-						$oOrder->getInvoiceZip(),
-						$oOrder->getInvoiceCity(),
-						$oOrder->getInvoiceCountryKuerzel()
-					)
-					->setDocumentBuyerContact(
-						$oOrder->getInvoiceName() . " " . $oOrder->getInvoiceFirstName(),
-						"",
-						$oOrder->getInvoicePhone(),
-						$oOrder->getInvoiceFax(),
-						$buyer_email
-					)
-					->setDocumentBuyerCommunication('EM', $buyer_email);
-				
-				// Lieferanschrift = Rechnungsanschfitt
-				$shipping_name = $oOrder->getShippingCompany();
-				if (trim($shipping_name) === '') $shipping_name = $oOrder->getShippingFirstName().' '.$oOrder->getShippingName();
-
-				$document->setDocumentShipTo($shipping_name, '');
-				$document->setDocumentShipToAddress($oOrder->getShippingStreet(), '', '', $oOrder->getShippingZip(), $oOrder->getShippingCity(), $oOrder->getShippingCountryKuerzel());
-				$document->setDocumentSupplyChainEvent(\DateTime::createFromFormat("Ymd", $oInvoice->getDate('Ymd')));
-				
-				// Steueranteile
-				foreach ($oInvoice->getTaxInfo() as $tax_info) {
-
-					// BT-118 / VAT category code
-					$bt_118 = 'S';
-
-					// BT-118-1 ??
-					$bt_118_0 = 'VAT';
-
-					// BT-116 / Summe aller zu versteuernden BetrÃ€ge, fÃŒr die ein bestimmter Code der Umsatzsteuerkategorie und ein bestimmter Umsatzsteuersatz gelten (falls ein kategoriespezifischer Umsatzsteuersatz gilt).
-					$bt_116 = round($tax_info['netto'], 2);
-
-					// BT-117 / Der fÃŒr die betreffende Umsatzsteuerkategorie zu entrichtende Gesamtbetrag.
-					$bt_117 = $tax_info['tax_value'];
-
-					// BT-119 / Der Umsatzsteuersatz, angegeben als fÃŒr die betreffende Umsatzsteuerkategorie geltender Prozentsatz.
-					$bt_119 = $tax_info['tax_rate'];
-
-					$document->addDocumentTax(
-						$bt_118,
-						$bt_118_0,
-						$bt_116,
-						$bt_117,
-						$bt_119
-					);
-					
-				}
-
-				$PaymentNettoPos = 0; $PaymentNettoNeg = 0;
-				$PaymentNetto = $arCalculation['sum']['payment_brutto_calculated'];
-				if ($PaymentNetto > 0) {$PaymentNettoPos = $PaymentNetto;}
-				elseif ($PaymentNetto < 0) {$PaymentNettoNeg = $PaymentNetto;}
-
-				$document->setDocumentSummation(
-					$bt_112,
-					$bt_115,
-					$bt_106,
-					$bt_108,
-					$bt_107,
-					$bt_109,
-					$bt_110,
-					$bt_114,
-					$bt_113
-				);
-
-				/*
-				$document->setDocumentSummation(
-					$bt_112,
-					$bt_115,
-					$oInvoice->getSumNetto(),
-					$arCalculation['sum']['shipping_brutto_calculated'] + $PaymentNettoPos,
-					($arCalculation['sum']['voucher_brutto']??0) + $PaymentNettoNeg,
-					$oInvoice->getSumNetto(),
-					$oInvoice->getSumBrutto() - $oInvoice->getSumNetto(),
-					0.0,
-					0.0
-				);
-				*/
-
-				$document->addDocumentPaymentTerm($bt_20, $bt_9);
-				
-				foreach ($oInvoice->getItems() as $oInvoiceItem) {
-				
-					$lineID = ($lineID??0) + 1;
-
-					$bt_131 = $oInvoiceItem->getNettoSum();
-
-					$document->addNewPosition(strval($lineID));
-					$document->setDocumentPositionProductDetails(
-						$oInvoiceItem->getLabel(),
-						"",
-						strval($oInvoiceItem->getId()),
-						null,
-						"0160", // GS1 Global Trade Item Number (GTIN, EAN)
-						$oInvoiceItem->getGTIN()
-					);
-					$document->setDocumentPositionGrossPrice($oInvoiceItem->getNetto());
-					$document->setDocumentPositionNetPrice($oInvoiceItem->getNetto());
-					$document->setDocumentPositionQuantity($oInvoiceItem->getAmount(), "H87");
-					$document->addDocumentPositionTax('S', 'VAT', $oInvoiceItem->getTaxRate());
-					$document->setDocumentPositionLineSummation($bt_131);
-					
-				}
-
-				$document->writeFile($pdf_path."/e".$oInvoice->getId()."_".$profil_id.".xml");
-				
-				$pdfBuilder = new ZugferdDocumentPdfBuilder($document, $pdf_file);
-				
-				$pdf_path .= 'e'.$oInvoice->getId().'_'.$profil_id.'.pdf';
-				
-  				$pdfBuilder->generateDocument()->saveDocument($pdf_path);
-				 
-				return $pdf_path;
-				
-			}
-			
-			return $oInvoice->getFilePath(true);
-			
-		}
-	
-	}
Index: /mods/mod_rechnungen/wpsg_fpdf.class.php
===================================================================
--- /mods/mod_rechnungen/wpsg_fpdf.class.php	(revision 8528)
+++ /mods/mod_rechnungen/wpsg_fpdf.class.php	(revision 5261)
@@ -14,20 +14,5 @@
 			
 		}
-		
-		public function addBase64Image($base64Image, $x, $y, $w = 0, $h = 0) {
-			
-			list($type, $data) = explode(';', $base64Image);
-			list(, $data) = explode(',', $data);
-			$data = base64_decode($data);
-	
-			$tempFile = tempnam(sys_get_temp_dir(), 'fpdf') . '.png';
-			file_put_contents($tempFile, $data);
-	
-			$this->Image($tempFile, $x, $y, $w, $h);
-	
-			unlink($tempFile);
-			
-		}
-		
+						
 		public function Cell($w, $h, $text, $border, $ln, $align, $fill = 0)
 		{
@@ -41,5 +26,5 @@
 
 			//	MultiCell(float w , float h , string txt [, mixed border] [, string align] [, integer fill])
-			parent::setXY(wpsg_tf($x), wpsg_tf($y));
+			parent::setXY($x, $y);
 			parent::MultiCell($width, $h, $this->toIso($txt), $border, $align, $fill);
 			
@@ -52,5 +37,7 @@
 		public function SetTextColor($strHEXCode)
 		{
-						
+			
+			error_reporting(E_ERROR);
+			
 			if ($strHEXCode[0] == '#')
 		        $strHEXCode = substr($strHEXCode, 1);
Index: ds/mod_rechnungen/wpsg_invoice.php
===================================================================
--- /mods/mod_rechnungen/wpsg_invoice.php	(revision 8528)
+++ 	(revision )
@@ -1,474 +1,0 @@
-<?php
-
-    declare(strict_types=1);
-    
-    /**
-     * @author: Daniel Schmitzer (daschmi@daschmi.de)
-     * @date: 09.06.22
-     * @time: 10:17
-     */
-     
-    namespace wpsg;
-	 
-    class wpsg_invoice extends \wpsg_model {
-		
-		static $_tableName = 'WPSG_TBL_RECHNUNGEN';
-		
-		private ?array $arItems = null;
-		
-		 /**
-		 * LÃ€dt die Daten  
-		 */
-		public function load($invoice_id) {
-		
-			parent::load($invoice_id);
-				
-			$this->data = $this->db->fetchRow("SELECT I.* FROM `".WPSG_TBL_RECHNUNGEN."` AS I WHERE I.`id` = '".wpsg_q($invoice_id)."' ");
-			
-			if ($this->data === null || $this->data['id'] != $invoice_id) throw new \wpsg\Exception(
-				wpsg_translate(__('Die Daten einer Rechnung konnten nicht geladen werden', 'wpsg'), $invoice_id)
-			);
-			
-		}
-
-        public function getOrderIds() {
-
-            return array_map('intval', $this->db->fetchAssocField("
-                SELECT `order_id` FROM `".WPSG_TBL_ORDER_INVOICE."` WHERE `invoice_id` = '".intval($this->getId())."'
-            "));
-
-        }
-
-        public function setOrder(int $order_id) {
-
-            // KÃ¶nnte man ÃŒber Uniqe der Datenbank ÃŒberlassen, aber lieber so
-            $exist = intval($this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ORDER_INVOICE."` WHERE `order_id` = '".intval($order_id)."' AND `invoice_id` = '".intval($this->getId())."' "));
-
-            if ($exist <= 0) {
-
-                $this->db->ImportQuery(WPSG_TBL_ORDER_INVOICE, [
-                    'order_id' => M1::q($order_id),
-                    'invoice_id' => M1::q($this->getId())
-                ]);
-
-            }
-
-        }
-		
-		/**
-		 * Gibt einen Array mit Informationen zu den SteuersÃ€tzen zurÃŒck
-		 * Beispiel 1190 Brutto, 19% = 190 Steueranteil
-		 * 	[
-		 * 		[
-		 * 			'tax_rate' => 19
-		 * 			'brutto' => 1190
-		 * 			'netto' => 1000
-		 * 			'tax_value' => 190
-		 * 		]
-		 * 	]
-		 * @return array
-		 */
-		public function getTaxInfo(): array {
-		
-			$arTaxInfo = [];
-			
-			$add = function(float $tax_rate, float $brutto_sum, float $netto_sum) use (&$arTaxInfo) {
-				
-				if (!isset($arTaxInfo[$tax_rate])) $arTaxInfo[$tax_rate] = [
-					'tax_rate' => $tax_rate,
-					'brutto' => 0,
-					'netto' => 0,
-					'tax_value' => 0
-				];
-				
-				$arTaxInfo[$tax_rate]['brutto'] += $brutto_sum;
-				$arTaxInfo[$tax_rate]['netto'] += $netto_sum;
-				$arTaxInfo[$tax_rate]['tax_value'] += $brutto_sum - $netto_sum;
-				
-			};
-			
-			// Produkte
-			foreach ($this->getInvoiceProducts() as $oInvoiceItem) {
-			
-				$add(
-					$oInvoiceItem->getTaxRate(),
-					$oInvoiceItem->getBruttoSum(),
-					$oInvoiceItem->getNettoSum()
-				);
-			
-			}
-			
-			return $arTaxInfo;
-			
-		}
-
-		public function getTaxSum(): float {
-
-			$sum = 0;
-
-			foreach ($this->getTaxInfo() as $tax_info) {
-
-				$sum += round($tax_info['tax_value'], 2);
-
-			}
-
-			return $sum;
-
-		}
-		
-		/**
-		 * FÃŒgt ein Produkt an die Rechnung
-		 * @param int $order_product_id
-		 * @param int $amount
-		 * @param float $single_price_netto
-		 * @param float $single_price_brutto
-		 * @param float $tax_rate
-		 * @param float $tax_value
-		 * @return void
-		 * @throws Exception
-		 */
-		public function addProduct(int $order_product_id, int $amount, float $single_price_netto, float $single_price_brutto, float $tax_rate): void {
-		 
-			$this->db->ImportQuery(WPSG_TBL_INVOICE_ITEM, [
-				'invoice_id' => intval($this->getId()),
-				'order_product_id' => intval($order_product_id),
-				'item_key' => 'product',
-				'amount' => intval($amount),
-				'single_price_netto' => wpsg_q($single_price_netto),
-				'single_price_brutto' => wpsg_q($single_price_brutto),
-				'tax_rate' => wpsg_q($tax_rate)
-			]);
-		
-		}
-		
-		/**
-		 * Gibt die Produkte der Rechnung zurÃŒck
-		 * @return wpsg_invoice_item[]
-		 */
-		public function getInvoiceProducts(): array { return $this->getItems('product'); }
-		
-		/**
-		 * @param string|null $strType
-		 * @return wpsg_invoice_item[]
-		 */
-		public function getItems(?string $strType = null): array {
-			
-			if ($this->arItems === null) {
-			
-				$this->arItems = [];
-				
-				foreach (array_map('intval', $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_INVOICE_ITEM."` WHERE `invoice_id` = '".intval($this->getId())."' ")) as $item_id) {
-					
-					$this->arItems[] = wpsg_invoice_item::getInstance($item_id);
-					
-				}
-				
-			}
-			
-			$arReturn = [];
-			
-			foreach ($this->arItems as $oInvoiceItem) {
-				
-				if ($strType === null || $oInvoiceItem->getType() === $strType) {
-					
-					$arReturn[] = $oInvoiceItem;
-				
-				}
-				
-			}
-		 
-			return $arReturn;
-			
-		}
-		
-		public function isInvoice() {
-			
-			return $this->__get('rnr') !== '';
-			
-		}
-		
-		public function isStorno() {
-			
-			return $this->__get('gnr') !== '';
-			
-		}
-		
-		public function isMultiInvoice() {
-			
-			return $this->getMeta('version') === '3';
-			
-		}
-		
-		/**
-		 * @param bool $raw Wenn true, dann das reine PDF ohne eRechnungsdaten
-		 * @return string
-		 */
-		public function getFilePath(bool $raw = false): string {
-
-            $ym = date('Y/m', strtotime($this->__get('datum')));
-
-			if ($this->isMultiInvoice()) {
-
-				if ($this->shop->isMultiBlog()) $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/'.$ym.'/multi/'.$this->getId();
-                else $path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_rechnungen/'.$ym.'/multi/'.$this->getId().'.pdf';
-
-			} else {
-
-                if ($this->shop->isMultiBlog()) $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/'.$ym.'/';
-                else $path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_rechnungen/'.$ym.'/';
-
-                if (!file_exists($path.$this->getId().'.pdf')) {
-
-					if (file_exists($path.($this->getOrderIds()[0])) && is_dir($path.($this->getOrderIds()[0]))) {
-
-						$path = ($path.$this->getOrderIds()[0]).'/';
-
-						if ($this->__get('gnr') !== '') {
-
-							if (file_exists($path . 'G' . $this->__get('gnr') . '.pdf')) $path .= 'G' . $this->__get('gnr') . '.pdf';
-							else if (file_exists($path . 'G' . $this->getId() . '.pdf')) $path .= 'G' . $this->getId() . '.pdf';
-							else if (file_exists($path . $this->__get('gnr') . '.pdf')) $path .= $this->__get('gnr') . '.pdf';
-							else $path .= $this->getId() . '.pdf';
-
-						} else if ($this->__get('rnr') !== '') {
-
-							if (file_exists($path . 'R' . $this->__get('rnr') . '.pdf')) $path .= 'R' . $this->__get('rnr') . '.pdf';
-							else if (file_exists($path . 'R' . $this->getId() . '.pdf')) $path .= 'R' . $this->getId() . '.pdf';
-							else if (file_exists($path . $this->__get('rnr') . '.pdf')) $path .= $this->__get('rnr') . '.pdf';
-							else $path .= $this->getId() . '.pdf';
-
-						} else $path .= $this->getId() . '.pdf';
-
-					} else {
-
-						$path = ($path.$this->getOrderIds()[0]).'/';
-
-						if ($this->__get('gnr') !== '') {
-
-							if (file_exists($path.'G'.$this->__get('gnr').'.pdf')) $path .= 'G'.$this->__get('gnr').'.pdf';
-							else if (file_exists($path.'G'.$this->getId().'.pdf')) $path .= 'G'.$this->getId().'.pdf';
-							else if (file_exists($path.$this->__get('gnr').'.pdf')) $path .= $this->__get('gnr').'.pdf';
-							else $path .= $this->getId().'.pdf';
-
-						} else if ($this->__get('rnr') !== '') {
-
-							if (file_exists($path.'R'.$this->__get('rnr').'.pdf')) $path .= 'R'.$this->__get('rnr').'.pdf';
-							else if (file_exists($path.'R'.$this->getId().'.pdf')) $path .= 'R'.$this->getId().'.pdf';
-							else if (file_exists($path.$this->__get('rnr').'.pdf')) $path .= $this->__get('rnr').'.pdf';
-							else $path .= $this->getId().'.pdf';
-
-						} else $path .= $this->getId().'.pdf';
-
-					}
-
-				} else $path .= $this->getId().'.pdf';
-
-            }
-			
-			\wpsg_ShopController::getShop()->protectDirectory(dirname($path));
-
-			if ($raw === true) return $path;
-			
-			$path = \wpsg\mod_invoice\eInvoice::writeEInvoice(
-				$this->getOrder()->getId(),
-				$this->getId(),
-				0
-			);
-			
-			return $path;
-			
-		}
-
-		/**
-		 * @return \wpsg_order
-		 */
-		public function getOrder() {
-
-            return \wpsg_order::getInstance($this->getOrderIds()[0]);
-
-		}
-		
-		public function getCustomer(): ?\wpsg_customer {
-			
-			$oCustomer = $this->getOrder()->getCustomer();
-			
-			if ($oCustomer === false) return null;
-			else return $oCustomer;
-			
-		}
-
-		public function getDate($format = null) {
-			
-			if ($format === null) return $this->__get('datum');
-			else if ($format === true) return $this->getDate('d.m.Y H:i:s');
-			else return date($format, strtotime($this->__get('datum')));
-			
-		}
-		
-		/**
-		 * @param bool $bLink
-		 * @param \wpsg_order_product $oOrderProduct
-		 *
-		 * @return string
-		 */
-		public function getNr($bLink = false, $oOrderProduct = null) {
-			
-			$strReturn = '';
-			
-			if ($bLink) {
-
-				$strTitle = wpsg_translate(__('Erstellt am #1#', 'wpsg'), wpsg_formatTimestamp(strtotime($this->__get('datum'))));
-
-				if ($this->getOrder()->getId() != '0') {
-
-					$strReturn .= '<a title="'.$strTitle.'" class="link_invoice '.(($this->isStorno())?'bg_storno':'').' '.(($this->isInvoice())?'bg_invoice':'').'" href="';
-					$strReturn .= wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_rechnungen&do=getRechnung&edit_id='.$this->getOrder()->getId().'&r_id='.$this->getId(), 'wpsg-mod_invoice-order_ajax-getRechnung-'.$this->getId());
-					$strReturn .= '" target="_blank">';
-
-				}
-
-			}
-			
-			if ($this->isInvoice()) $strReturn .= $this->__get('rnr');
-			else if ($this->isStorno()) $strReturn .= $this->__get('gnr');
-			
-			if ($oOrderProduct !== null) {
-				
-				$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-				if ($invoice_data !== null) {
-					
-					foreach ($invoice_data as $id) {
-						
-						if ($id['invoice_id'] === $this->getId()) {
-							
-							$strReturn .= ' <span title="'.wpsg_translate(__('#1# StÃŒck enthalten', 'wpsg'), $id['amount']).'">('.$id['amount'].')</span>';
-							
-						}
-						
-					}
-					
-				}
-				
-			}
-			
-			if ($bLink) {
-				
-				$strReturn .= '</a>';
-				
-			}
-			
-			return $strReturn;
-			
-		}
-
-        public function delete() {
-
-            $this->db->Query("DELETE FROM `".WPSG_TBL_ORDER_INVOICE."` WHERE `invoice_id` = '".intval($this->getId())."' ");
-            $this->db->Query("DELETE FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `id` = '".intval($this->getId())."' ");
-
-            unlink($this->getFilePath());
-
-        }
-
-		public function getSumNetto(): float {
-		
-			$netto = 0;
-			
-			foreach ($this->getItems() as $oInvoiceItem) {
-				
-				$netto += $oInvoiceItem->getNettoSum();
-				
-			}
-			
-			return $netto;
-			
-		}
-		
-		public function getSumBrutto(): float {
-		
-			$brutto = 0;
-			
-			foreach ($this->getItems() as $oInvoiceItem) {
-				
-				$brutto += $oInvoiceItem->getBruttoSum();
-				
-			}
-			
-			return $brutto;
-			
-		}
-		
-		public function getToPay(): float {
-		
-			return $this->getSumBrutto();
-			
-		}
-		
-        /**
-         * @param int $order_id
-         * @return wpsg_invoice[]
-         */
-		public static function findByOrderId(int $order_id) {
-			
-			$r = [];
-			
-			foreach ($GLOBALS['wpsg_db']->fetchAssocField("SELECT `invoice_id` FROM `".WPSG_TBL_ORDER_INVOICE."` WHERE `order_id` = '".intval($order_id)."' ") as $invoice_id) {
-				
-				$r[] = wpsg_invoice::getInstance(intval($invoice_id));
-			
-			}
-			
-			return $r;
-		
-		}
-
-		 /**
-		  * @throws \Exception
-		  */
-	    public static function getNextInvoiceNumber(int $order_id, bool $do = false): string {
-			
-			global $wpdb;
-			
-			$lock_name = 'wpsg_rechnungen_format_lock';
-			
-			if (\wpsg_ShopController::getShop()->get_option('wpsg_lockOrderTables') != '1') {
-				
-				$locked = intval($wpdb->get_var($wpdb->prepare("SELECT GET_LOCK(%s, 10)", $lock_name)));			
-				
-				if ($locked !== 1) throw new \Exception("OrderOption kann nicht gesperrt werden 1778490898115");
-				
-			}
-			
-			// Rechnungsnummer bilden
-			$rnr_format = \wpsg_ShopController::getShop()->get_option("wpsg_rechnungen_format");
-			if ($rnr_format == "") $rnr_format = "%nr%";
-			
-			// Neue Fortlaufende Nummer
-			$rnr_nr = $wpdb->get_var("SELECT `option_value` FROM `{$wpdb->options}` WHERE `option_name` = 'wpsg_rechnungen_start'");
-			if ($rnr_nr <= 0) $rnr_nr = 1;
-			
-			// Ersetzungen
-			$rnr = preg_replace("/\%nr\%/i", strval($rnr_nr), $rnr_format);
-			$rnr = preg_replace("/\%Jahr\%/i", date("Y"), $rnr);
-			$rnr = preg_replace("/\%Monat\%/i", date("m"), $rnr);
-			$rnr = preg_replace("/\%Tag\%/i", date("d"), $rnr);
-			
-			$rnr = \wpsg_ShopController::getShop()->replaceUniversalPlatzhalter($rnr, $order_id);
-			
-			if ($do === true) {
-				
-				$wpdb->query($wpdb->prepare("UPDATE `{$wpdb->options}` SET `option_value` = %d WHERE `option_name` = 'wpsg_rechnungen_start' ", $rnr_nr + 1));
-				
-				if (\wpsg_ShopController::getShop()->get_option('wpsg_lockOrderTables') != '1') {
-					
-					$wpdb->query($wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name));
-					
-				}
-				
-			}
-			
-			return $rnr;
-			
-		}
-		
-	}
Index: ds/mod_rechnungen/wpsg_invoice_item.class.php
===================================================================
--- /mods/mod_rechnungen/wpsg_invoice_item.class.php	(revision 8528)
+++ 	(revision )
@@ -1,119 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 28.08.24
-	 * @time: 07:46
-	 */
-	
-	namespace wpsg;
-	
-	class wpsg_invoice_item extends \wpsg_model {
-	
-		static $_tableName = 'WPSG_TBL_INVOICE_ITEM';
-		
-		/**
-		 * LÃ€dt die Daten aus der Datenbank
-		 */
-		public function load($invoice_item_id) {
-		
-			parent::load($invoice_item_id);
-			
-			$this->data = $this->db->fetchRow("SELECT O.* FROM `".WPSG_TBL_INVOICE_ITEM."` AS O WHERE O.`id` = '".wpsg_q($invoice_item_id)."' ");
-			
-			if ($this->data === null || $this->data['id'] != $invoice_item_id) throw new \wpsg\Exception(
-				wpsg_translate(__('Die Daten eines Rechnungspostens konnten nicht geladen werden', 'wpsg'), $invoice_item_id)
-			);
-			
-		}
-		
-		/**
-		 * Gibt den Typ zurÃŒck
-		 * @return string product|voucher|credit|shipping|payment|discount
-		 */
-		public function getType(): string { return $this->__get('item_key'); }
-		
-		/**
-		 * @throws \Exception
-		 */
-		public function getLabel(): string {
-			
-			if ($this->getType() === 'product') {
-			
-				return $this->getProduct()->getProductName();
-			
-			} else throw new \Exception();
-			
-		}
-		
-		/**
-		 * @throws \Exception
-		 */
-		public function getGTIN(): string {
-	
-			if ($this->getType() !== 'product') throw new \Exception();
-			
-			return $this->getProduct()->getGTIN();
-			
-		}
-		
-		public function getOrderProduct(): \wpsg_order_product {
-			
-			if ($this->getType() !== 'product') throw new \Exception();
-			
-			return \wpsg_order_product::getInstance(intval($this->__get('order_product_id')));
-			
-		}
-		
-		/**
-		 * @throws \Exception
-		 */
-		public function getProduct(): \wpsg_product {
-			
-			return $this->getOrderProduct()->getProduct();
-			
-		}
-		
-		/**
-		 * Steuersatz z.B. 19 fÃŒr 19% Steueranteil
-		 * @return float
-		 */
-		public function getTaxRate(): float {
-		
-			return wpsg_tf($this->__get('tax_rate'));
-		
-		}
-		
-		public function getBrutto(): float {
-			
-			return wpsg_tf($this->__get('single_price_brutto'));
-			
-		}
-		
-		public function getBruttoSum(): float {
-			
-			return intval($this->__get('amount')) * wpsg_tf($this->__get('single_price_brutto'));
-			
-		}
-		
-		public function getNetto(): float {
-			
-			return wpsg_tf($this->__get('single_price_netto'));
-			
-		}
-		
-		public function getNettoSum(): float {
-			
-			return intval($this->__get('amount')) * wpsg_tf($this->__get('single_price_netto'));
-			
-		}
-		
-		public function getAmount(): int {
-			
-			return intval($this->__get('amount'));
-			
-		}
-		
-	}
Index: /mods/mod_statistics/wpsg_customerMap.class.php
===================================================================
--- /mods/mod_statistics/wpsg_customerMap.class.php	(revision 8528)
+++ /mods/mod_statistics/wpsg_customerMap.class.php	(revision 5261)
@@ -7,45 +7,24 @@
 	 * @author daniel
 	 */
-	class wpsg_customerMap extends wpsg_statisticabstract {
-
-		/**
-		 * Ermittelt aus einer Adresse die LÃ€ngne und Breitengrade und gibt diese zurÃŒck
-		 */
-		function geocode($string) {
-		
-			$string = str_replace (" ", "+", urlencode($string));
-			$details_url = "https://maps.googleapis.com/maps/api/geocode/json?address=".$string."&sensor=false&key=".wpsg_ShopController::getShop()->get_option('wpsg_mod_statistics_googlekey');
-		
-			$result = $this->shop->get_url_post_content($details_url, []);
-			$response = json_decode($result, true);
-			 		
-			$lat = $response['results'][0]['geometry']['location']['lat'];
-			$long = $response['results'][0]['geometry']['location']['lng'];
-					$array = array(
-				'lat' => $lat,
-				'long' => $long
-			);
-		
-			return $array;
-		
-		} // function geocode($string)
-		
+	class wpsg_customerMap extends wpsg_statisticabstract
+	{
 		
 		public function getAll($point = 0, $params = array())
 		{
-			//die('getall customer');
+			
 			$this->shop->view['wpsg_mod_statistics']['marker'] = array();
 			
 			$arCustomer = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_KU."` ");
 			
-			foreach ($arCustomer as $c) {
+			foreach ($arCustomer as $c)
+			{
 				
-				// if (intval($c['id']) !== 799) continue;
-				
-				if (!wpsg_isSizedString($c['wpsg_mod_statistics_long']) && !wpsg_isSizedString($c['wpsg_mod_statistics_lat']) && $c['wpsg_mod_statistics_long'] !== '-1' &&  $c['wpsg_mod_statistics_lat'] !== '-1') {
+				if (!wpsg_isSizedString($c['wpsg_mod_statistics_long']) && !wpsg_isSizedString($c['wpsg_mod_statistics_lat']))
+				{
 					 
-					$arLongLat = $this->geocode($c['plz'].' '.$c['ort'].','.$c['strasse'].rtrim(' '.wpsg_getStr($c['nr'])));
+					$arLongLat = $this->geocode($c['plz'].' '.$c['ort'].','.$c['strasse']);
 
-					if ($arLongLat !== null && $arLongLat['lat'] !== null && $arLongLat['long'] !== null) {
+					if ($arLongLat !== null)
+					{
 							
 						$this->db->UpdateQuery(WPSG_TBL_KU, array(
@@ -55,7 +34,7 @@
 					
 						$this->shop->view['wpsg_mod_statistics']['marker'][] = array(
-							'long' => $arLongLat['long'],
-							'lat' => $arLongLat['lat'],
-							'customer' => $c
+								'long' => $arLongLat['long'],
+								'lat' => $arLongLat['lat'],
+								'customer' => $c
 						);
 							
@@ -69,4 +48,5 @@
 							'wpsg_mod_statistics_lat' => '-1'
 						), "`id` = '".wpsg_q($c['id'])."'");
+						
 					}
 					
@@ -87,6 +67,38 @@
 		} // public function getAll($point = 0, $params = array())
 		
+		/**
+		 * Ermittelt aus einer Adresse die LÃ€ngne und Breitengrade und gibt diese zurÃŒck
+		 */
+		function geocode($string)
+		{
 		
+			$string = str_replace (" ", "+", urlencode($string));
+			$details_url = "http://maps.googleapis.com/maps/api/geocode/json?address=".$string."&sensor=false";
+		
+			$ch = curl_init();
+			curl_setopt($ch, CURLOPT_URL, $details_url);
+			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+			$response = json_decode(curl_exec($ch), true);
+		
+			if ($response['status'] != 'OK') 
+			{
+				
+				return null;
+				
+			}
+		  
+			$long = $response['results'][0]['geometry']['location']['lat'];
+			$lat = $response['results'][0]['geometry']['location']['lng'];
+		
+			$array = array(
+				'lat' => $lat,
+				'long' => $long
+			);
+		
+			return $array;
+		
+		} // function geocode($string)
 		
 	} // class wpsg_customerMap extends wpsg_statisticabstract
 
+?>
Index: /mods/mod_statistics/wpsg_salestopaymentmethod.class.php
===================================================================
--- /mods/mod_statistics/wpsg_salestopaymentmethod.class.php	(revision 8528)
+++ /mods/mod_statistics/wpsg_salestopaymentmethod.class.php	(revision 5261)
@@ -363,5 +363,5 @@
 	protected function calculate($arData =array())
 	{
-		$total = 0.0;
+		
 		foreach ($arData as $data)
 		{
Index: /mods/mod_statistics/wpsg_statisticabstract.php
===================================================================
--- /mods/mod_statistics/wpsg_statisticabstract.php	(revision 8528)
+++ /mods/mod_statistics/wpsg_statisticabstract.php	(revision 5261)
@@ -8,5 +8,5 @@
 	protected $db;
 	
-	public $sqlWhere = Array();
+	public $sqlWhere = '';
 	
 	protected $observeStatuscodes;
@@ -124,7 +124,4 @@
 	public function addSorting(&$arData, $order = '', $sort = '')
 	{
-		if ($arData['records'] == null) {
-			return $arData;
-		}
 		
 		if (wpsg_isSizedString($sort))
@@ -139,20 +136,8 @@
 	public function setSqlWhere()
 	{
-		
-		$observeStatuscodes = array_map('trim', explode(',', $this->observeStatuscodes));
-
-		$observeStatuscodes = array_map(function($observeStatuscodes) {
-			return "'{$observeStatuscodes}'";
-		}, $observeStatuscodes);
-
-		$observeStatuscodes = implode(',', $observeStatuscodes);
-
-		$this->sqlWhere['validOrder'] = "
-			`cdate` != '0000-00-00 00:00:00' 
-			AND `type_payment` != '' 
-			AND `type_payment` IS NOT NULL 
-			AND `status` IN(".$observeStatuscodes.")
-		";
-
+		$this->sqlWhere['validOrder'] = "`cdate` != '0000-00-00 00:00:00' AND 
+													  		`type_payment` != '' AND 
+													  		`type_payment` IS NOT NULL AND 
+													  		`status` IN(".$this->observeStatuscodes.")";
 	}
 	
Index: /mods/mod_statistics/wpsg_topsellertosales.class.php
===================================================================
--- /mods/mod_statistics/wpsg_topsellertosales.class.php	(revision 8528)
+++ /mods/mod_statistics/wpsg_topsellertosales.class.php	(revision 5261)
@@ -22,10 +22,10 @@
 					$arFinalData['records'][$this->shop->get_option('wpsg_mod_statistics_topproductcount')]['amount'] += $record['amount'];
 					$arFinalData['records'][$this->shop->get_option('wpsg_mod_statistics_topproductcount')]['name'] = __('Sonstige', 'wpsg');
-					$arFinalData['records'][$this->shop->get_option('wpsg_mod_statistics_topproductcount')]['mod__varianten'] = '';			
+					$arFinalData['records'][$this->shop->get_option('wpsg_mod_statistics_topproductcount')]['mod_varianten'] = '';			
 				}
 			}
 			
 			return $arFinalData;
-		}	// public function calculateSonstiges($arData, &$arFinalData)
+		}
 		
 		/**
@@ -73,8 +73,8 @@
 						OP.`p_id`,
 						OP.`mod_vp_varkey`,
-						SUM(OP.`price`) AS total,
+						SUM(OP.`price` * OP.`menge`) AS total,
 						SUM(OP.`menge`) AS amount,
 						P.`name`
-						".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
+						".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
 				  	FROM 
 				  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -110,20 +110,18 @@
 		 * @return array
 		 */
-		public function getYear($point = 0, $params = array()) {
-			
-			$point = intval($point);
-			
-			if ($point === 0) {
-				
+		public function getYear($point = 0, $params = array())
+		{
+			
+			if ($point == '0')
+			{
 				$year = date('Y');
-				
-			} else if ($point === -1) {
-				
+			}
+			else if ($point == '-1')
+			{
 				$year = date('Y') - 1;
-				
-			} else {
-				
-				$year = $point;
-				
+			}
+			else
+			{
+				$year = $point;	
 			}
 			
@@ -131,7 +129,7 @@
 													OP.`p_id`,
 													OP.`mod_vp_varkey`,
-													SUM(OP.`price`) AS total,
+													SUM(OP.`price` * OP.`menge`) AS total,
 													SUM(OP.`menge`) AS amount,
-													P.`name`".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
+													P.`name`".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
 											   FROM 
 											  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -170,6 +168,7 @@
 		 * @return array
 		 */
-		public function getQuarter($point = 0, $params = array()) {
-						
+		public function getQuarter($point = 0, $params = array())
+		{
+			
 			$arQuarter = array(	'1' => array(1, 2, 3),
 								'2'	=> array(4, 5, 6),
@@ -229,7 +228,7 @@
 													OP.`p_id`,
 													OP.`mod_vp_varkey`,
-													SUM(OP.`price`) AS total,
+													SUM(OP.`price` * OP.`menge`) AS total,
 													SUM(OP.`menge`) AS amount,
-													P.`name`".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
+													P.`name`".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
 											   FROM 
 											  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -292,8 +291,8 @@
 													OP.`p_id`,
 													OP.`mod_vp_varkey`,
-													SUM(OP.`price`) AS total,
+													SUM(OP.`price` * OP.`menge`) AS total,
 													SUM(OP.`menge`) AS amount,
 													P.`name`
-													".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
+													".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
 											    FROM 
 											  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -359,8 +358,8 @@
 													OP.`p_id`,
 													OP.`mod_vp_varkey`,
-													SUM(OP.`price`) AS total,
+													SUM(OP.`price` * OP.`menge`) AS total,
 													SUM(OP.`menge`) AS amount,
 													P.`name`
-													".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
+													".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
 											    FROM 
 											  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -400,42 +399,38 @@
 		 * @return array
 		 */
-		public function getDay($point = 0, $params = array()) {
-			
-			if (intval($point) === 0) {
-				
+		public function getDay($point = 0, $params = array())
+		{
+			
+			if ($point == '0')
+			{
 				$day = time();
-				
-			} else if (intval($point) === -1) {
-				
+			}
+			else if ($point == '-1')
+			{
 				$day = time() - 86400;
-				
-			}
-			
-			$strQuery = "
-				SELECT 
-					OP.`p_id`,
-					OP.`mod_vp_varkey`,
-					SUM(OP.`price`) AS total,
-					SUM(OP.`menge`) AS amount,
-					P.`name`
-					".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
-				FROM 
-					`".WPSG_TBL_ORDERPRODUCT."` AS OP
-					LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON(O.`id` = OP.`o_id`) 
-					LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON(P.`id` = OP.`p_id`) 
-				WHERE
-					O.`type_payment` != '' AND 
-					O.`type_payment` IS NOT NULL AND 
-					O.`status` IN(".$this->observeStatuscodes.") AND 
-					YEAR( O.`cdate` ) = '".date('Y', $day)."' AND 
-					MONTH ( O.`cdate` ) = '".date('m', $day)."' AND 
-					DAY (O.`cdate`) = '".date('d', $day)."'
-				GROUP BY
-					OP.`p_id`, OP.`mod_vp_varkey`
-				ORDER BY 
-					total DESC
-			";
-			
-			$arAllData = $this->db->fetchAssoc($strQuery);
+			}
+			
+			$arAllData = $this->db->fetchAssoc("SELECT 
+													OP.`p_id`,
+													OP.`mod_vp_varkey`,
+													SUM(OP.`price` * OP.`menge`) AS total,
+													SUM(OP.`menge`) AS amount,
+													P.`name`
+													".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
+											    FROM 
+											  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
+											  		LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON(O.`id` = OP.`o_id`) 
+											  		LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON(P.`id` = OP.`p_id`) 
+											    WHERE
+											  		O.`type_payment` != '' AND 
+											  		O.`type_payment` IS NOT NULL AND 
+											  		O.`status` IN(".$this->observeStatuscodes.") AND 
+											  		YEAR( O.`cdate` ) = '".date('Y', $day)."' AND 
+								  					MONTH ( O.`cdate` ) = '".date('m', $day)."' AND 
+								  					DAY (O.`cdate`) = '".date('d', $day)."'
+											    GROUP BY
+											  		OP.`p_id`, OP.`mod_vp_varkey`
+											    ORDER BY 
+											  		total DESC");
 			
 			$arData['records'] = array_slice($arAllData, 0, $this->shop->get_option('wpsg_mod_statistics_topproductcount'));
@@ -470,8 +465,8 @@
 													OP.`p_id`,
 													OP.`mod_vp_varkey`,
-													SUM(OP.`price`) AS total,
+													SUM(OP.`price` * OP.`menge`) AS total,
 													SUM(OP.`menge`) AS amount,
 													P.`name`
-													".(($this->shop->hasMod('wpsg_mod_productvariants1'))?', P.`mod__varianten`':'')."
+													".(($this->shop->hasMod('wpsg_mod_varianten'))?', P.`mod_varianten`':'')."
 											    FROM 
 											  		`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -513,6 +508,4 @@
 		{
 			
-			$totalAmount = 0.0;
-			$totalSales = 0.0;
 			$arTempData = array();
 			
@@ -526,5 +519,5 @@
 					{
 						
-						$arVariantenInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($data['mod_vp_varkey']));
+						$arVariantenInfo = $this->shop->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($data['mod_vp_varkey']));
 						
 						if (wpsg_isSizedArray($arVariantenInfo))
Index: /mods/mod_statistics/wpsg_turnover.class.php
===================================================================
--- /mods/mod_statistics/wpsg_turnover.class.php	(revision 8528)
+++ /mods/mod_statistics/wpsg_turnover.class.php	(revision 5261)
@@ -1,888 +1,888 @@
 <?php
 
-	require_once WPSG_PATH_MOD.'mod_statistics/wpsg_statisticabstract.php';
+require_once WPSG_PATH_MOD.'mod_statistics/wpsg_statisticabstract.php';
+/**
+ * Klasse zur Ermittlung Statistik fÃŒr die UmsÃ€tze
+ * @author 	robert
+ * @since	11.01.2013
+ */
+class wpsg_turnover extends wpsg_statisticabstract 
+{
 	
 	/**
-	 * Klasse zur Ermittlung Statistik fÃŒr die UmsÃ€tze
-	 * @author 	robert
-	 * @since	11.01.2013
+	 * RÃŒckgabe aller Statistikdaten
+	 * @internal Bezug -> Jahr
+	 * @return array
 	 */
-	class wpsg_turnover extends wpsg_statisticabstract
+	public function getAll($point = 0, $params = array())
 	{
-		
-		/**
-		 * RÃŒckgabe aller Statistikdaten
-		 * @internal Bezug -> Jahr
-		 * @return array
-		 */
-		public function getAll($point = 0, $params = array())
-		{
-			
-			$strQuery = " 
-				SELECT 
-					CAST(MIN(`cdate`) AS DATE) AS start,
-					CAST(MAX(`cdate`) AS DATE) AS end
-				FROM 
-					`".WPSG_TBL_ORDER."` 
-				WHERE ".
+			
+		$arData = $this->db->fetchRow(" 
+			SELECT 
+				CAST(MIN(`cdate`) AS DATE) AS start,
+				CAST(MAX(`cdate`) AS DATE) AS end
+			FROM 
+				`".WPSG_TBL_ORDER."` 
+			WHERE ".
 				$this->getSqlWhere('validOrder')
-			;
-
-			$arData = $this->db->fetchRow($strQuery);
-			
-			if (wpsg_isSizedArray($arData))
-			{
-				if (!wpsg_isSizedString($arData['start'])) { $arData['start'] = date_i18n('d.m.Y', time()); }
-				if (!wpsg_isSizedString($arData['end'])) { $arData['end'] = $arData['start']; }
-				
-				$params['oStart'] = strtotime($arData['start']);
-				$params['oEnd'] = (strtotime($arData['end'])+86399);
-				
-				return $this->getCustomRange(0, $params);
-			}
-			
-			return array();
-			
-		}
-		
-		/**
-		 * RÃŒckgabe der Statistik auf ein Jahr bezogen
-		 * @internal Bezug -> Monat
-		 * @param int Bezugspunkt (0 aktuelles Jahr, -1 letztes Jahr)
-		 * @return array
-		 */
-		public function getYear($point = 0, $params = array())
-		{
-			
-			if ($point == '0')
-			{
-				$year = date('Y');
-			}
-			else if ($point == '-1')
-			{
-				$year = date('Y') - 1;
-			}
-			
-			$arData[0]['min'] = strtotime('01.01.'.$year);
-			$arData[0]['max'] = strtotime('31.12.'.$year);
-			
-			$arData[0]['records'] = $this->db->fetchAssoc(" 
-				SELECT 
-					COUNT(*) AS orders,
-					SUM( `price_gesamt` ) AS total, 
-					AVG( `price_gesamt` ) AS avg_total,
-					MONTH( `cdate` ) AS month, 
-					YEAR( `cdate` ) AS year,
-					UNIX_TIMESTAMP( `cdate` ) AS tstamp
-				FROM 
-					`".WPSG_TBL_ORDER."`
-				WHERE 
-					".$this->getSqlWhere('validOrder')." AND 
-					YEAR( `cdate` ) = '".$year."'
-				GROUP BY 
-					year, month
-				ORDER BY 
-					year DESC
-			   ",
-				"month"
-			);
-			
-			$arData[0]['label'] = __('GeschÃ€ftsjahr', 'wpsg').' '.$year;
-			
-			
-			for ($i = 1; $i <= 12; $i++)
-			{
-				if (!array_key_exists($i, $arData[0]['records']))
+		);
+		
+		if (wpsg_isSizedArray($arData))
+		{	
+			if (!wpsg_isSizedString($arData['start'])) { $arData['start'] = date_i18n('d.m.Y', time()); }
+			if (!wpsg_isSizedString($arData['end'])) { $arData['end'] = $arData['start']; }
+			
+			$params['oStart'] = strtotime($arData['start']);
+			$params['oEnd'] = (strtotime($arData['end'])+86399);
+			
+			return $this->getCustomRange(0, $params);	
+		}
+	
+		return array();
+			
+	}	
+	
+	/**
+	 * RÃŒckgabe der Statistik auf ein Jahr bezogen
+	 * @internal Bezug -> Monat
+	 * @param int Bezugspunkt (0 aktuelles Jahr, -1 letztes Jahr)
+	 * @return array
+	 */
+	public function getYear($point = 0, $params = array())
+	{
+		
+		if ($point == '0')
+		{
+			$year = date('Y');
+		}
+		else if ($point == '-1')
+		{
+			$year = date('Y') - 1;
+		}
+		
+		$arData[0]['min'] = strtotime('01.01.'.$year); 
+		$arData[0]['max'] = strtotime('31.12.'.$year); 
+		
+		$arData[0]['records'] = $this->db->fetchAssoc(" 
+			SELECT 
+				COUNT(*) AS orders,
+				SUM( `price_gesamt` ) AS total, 
+				AVG( `price_gesamt` ) AS avg_total,
+				MONTH( `cdate` ) AS month, 
+				YEAR( `cdate` ) AS year,
+				UNIX_TIMESTAMP( `cdate` ) AS tstamp
+			FROM 
+		  		`".WPSG_TBL_ORDER."`
+			WHERE 
+		  		".$this->getSqlWhere('validOrder')." AND 
+		  		YEAR( `cdate` ) = '".$year."'
+		  	GROUP BY 
+		  		year, month
+		  	ORDER BY 
+		  		year DESC
+		   ", 
+		   "month"
+		);
+		
+		$arData[0]['label'] = __('GeschÃ€ftsjahr', 'wpsg').' '.$year;
+		
+		
+		for ($i = 1; $i <= 12; $i++)
+		{
+			if (!array_key_exists($i, $arData[0]['records']))
+			{
+				$arData[0]['records'][$i] = array('orders' 		=> '0',
+												  'total'	 	=> '0',
+												  'avg_total'	=> '0',
+												  'month'	 	=> $i,
+												  'year'	 	=> $year,
+												  'tstamp'		=> mktime(0, 0, 0, $i, 1, $year));
+			}
+
+			$arData[0]['records'][$i]['label'] = date_i18n('M', mktime(0, 0, 0, $i, 1, $year));
+			$arData[0]['records'][$i]['tick'] = $arData[0]['records'][$i]['label'];
+			
+		}
+		
+		$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+
+		if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
+		{
+			$arRelatedData = $this->getYear($params['relatedpoint']);
+			
+			$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+			$arData[] = $arRelatedData[0];
+		}
+		
+		return $arData;
+		
+	}
+	
+	/**
+	 * RÃŒckgabe der Statistik auf ein Quartal bezogen
+	 * @param string
+	 * @internal Bezug -> Monat 
+	 * @return array
+	 */
+	public function getQuarter($point = 0, $params = array())
+	{
+		$arQuarter = array(	'1' => array(1, 2, 3),
+							'2'	=> array(4, 5, 6),
+							'3'	=> array(7, 8, 9),
+							'4' => array(10, 11, 12));
+		
+		if ($point == '0')
+		{
+			$year = date('Y');
+			$month = date('n');
+		}
+		else if ($point == '-1')
+		{
+			$year = date('Y');
+			$month = date('n');
+			
+			foreach ($arQuarter as $index => $quarter)
+			{
+				if (in_array($month, $quarter))
 				{
-					$arData[0]['records'][$i] = array('orders' 		=> '0',
-						'total'	 	=> '0',
-						'avg_total'	=> '0',
-						'month'	 	=> $i,
-						'year'	 	=> $year,
-						'tstamp'		=> mktime(0, 0, 0, $i, 1, $year));
-				}
-				
-				$arData[0]['records'][$i]['label'] = date_i18n('M', mktime(0, 0, 0, $i, 1, $year));
-				$arData[0]['records'][$i]['tick'] = $arData[0]['records'][$i]['label'];
-				
-			}
-			
-			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-			 
-			if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
-			{
-				$arRelatedData = $this->getYear($params['relatedpoint']);
-				
-				$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-				$arData[] = $arRelatedData[0];
-			}
-			
-			return $arData;
-			
-		}
-		
-		/**
-		 * RÃŒckgabe der Statistik auf ein Quartal bezogen
-		 * @param string
-		 * @internal Bezug -> Monat
-		 * @return array
-		 */
-		public function getQuarter($point = 0, $params = array())
-		{
-			$arQuarter = array(	'1' => array(1, 2, 3),
-				'2'	=> array(4, 5, 6),
-				'3'	=> array(7, 8, 9),
-				'4' => array(10, 11, 12));
-			
-			if ($point == '0')
-			{
-				$year = date('Y');
-				$month = date('n');
-			}
-			else if ($point == '-1')
-			{
-				$year = date('Y');
-				$month = date('n');
-				
-				foreach ($arQuarter as $index => $quarter)
-				{
-					if (in_array($month, $quarter))
+					if (isset($actQuarter[$index - 1]))
 					{
-						if (isset($actQuarter[$index - 1]))
-						{
-							$quarterFirstMonth = $arQuarter[$index - 1][0];
-						}
-						else
-						{
-							$quarterFirstMonth = $arQuarter[count($arQuarter)][0];
-							$year--;
-						}
+						$quarterFirstMonth = $arQuarter[$index - 1][0];	
+					}
+					else
+					{
+						$quarterFirstMonth = $arQuarter[count($arQuarter)][0];	
+						$year--;
 					}
 				}
-				
-				$month = $quarterFirstMonth;
-			}
-			
-			$arWeeks = array();
-			
-			foreach ($arQuarter as $index => $quarter)
-			{
-				if (in_array($month, $quarter))
+			}
+			
+			$month = $quarterFirstMonth;
+		}
+		
+		$arWeeks = array();
+		
+		foreach ($arQuarter as $index => $quarter)
+		{
+			if (in_array($month, $quarter))
+			{
+				
+				$actQuarter = $index;
+				
+				$lastMonth = $arQuarter[$index][count($arQuarter[$index]) - 1];
+				
+				$daysLastMonth = wpsg_getDaysofMonth($lastMonth, $year);
+				
+				$dayLastMonthTS = mktime(0, 0, 0, $lastMonth, $daysLastMonth, $year);
+				
+				$firstMonth = array_shift($arQuarter[$index]);
+				
+				$dayFirstMonthTS = mktime(0, 0, 0, $firstMonth, 1, $year);
+				
+				$dayFirstMonthTSCounter = $dayFirstMonthTS;
+				
+				while ($dayFirstMonthTSCounter <= $dayLastMonthTS)
 				{
+					$week = date('W', $dayFirstMonthTSCounter);
 					
-					$actQuarter = $index;
+					if ($week[0] == 0)
+					{
+						$week = str_replace('0', '', $week);
+					}
 					
-					$lastMonth = $arQuarter[$index][count($arQuarter[$index]) - 1];
+					if ($index == 4 && $week == 1)
+					{
+						$week = 53;
+					}
 					
-					$daysLastMonth = wpsg_getDaysofMonth($lastMonth, $year);
+					$year = date('Y', $dayFirstMonthTSCounter);
 					
-					$dayLastMonthTS = mktime(0, 0, 0, $lastMonth, $daysLastMonth, $year);
+					$month = date('n', $dayFirstMonthTSCounter);
 					
-					$firstMonth = array_shift($arQuarter[$index]);
+					$day = date('j', $dayFirstMonthTSCounter);
 					
-					$dayFirstMonthTS = mktime(0, 0, 0, $firstMonth, 1, $year);
+					if (!in_array($week, $arWeeks))
+					{
+						$arWeeks[$week] = array('week' 	=> $week,
+										        'year' 	=> $year,
+												'day'  	=> $day,
+												'month'	=> $month);
+					}
 					
-					$dayFirstMonthTSCounter = $dayFirstMonthTS;
-					
-					while ($dayFirstMonthTSCounter <= $dayLastMonthTS)
-					{
-						$week = date('W', $dayFirstMonthTSCounter);
-						
-						if ($week[0] == 0)
-						{
-							$week = str_replace('0', '', $week);
-						}
-						
-						if ($index == 4 && $week == 1)
-						{
-							$week = 53;
-						}
-						
-						$year = date('Y', $dayFirstMonthTSCounter);
-						
-						$month = date('n', $dayFirstMonthTSCounter);
-						
-						$day = date('j', $dayFirstMonthTSCounter);
-						
-						if (!in_array($week, $arWeeks))
-						{
-							$arWeeks[$week] = array('week' 	=> $week,
-								'year' 	=> $year,
-								'day'  	=> $day,
-								'month'	=> $month);
-						}
-						
-						$dayFirstMonthTSCounter += 86400;
-					}
+					$dayFirstMonthTSCounter += 86400;
 				}
 			}
-			
-			//MYSQL WEEK http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html Modus 3
+		}
+		
+		//MYSQL WEEK http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html Modus 3
+		
+		$arData[0]['records'] = $this->db->fetchAssoc(" SELECT 
+														    COUNT(*) AS orders,
+														    ".$actQuarter." AS quarter,
+															SUM( `price_gesamt` ) AS total,
+															AVG( `price_gesamt` ) AS avg_total,
+															DAY( `cdate`) AS day,
+															DAYOFYEAR (`cdate`) AS dayofyear,
+															WEEK ( `cdate`, 3) AS week, 
+															MONTH( `cdate` ) AS month, 
+															YEAR( `cdate` ) AS year,
+															UNIX_TIMESTAMP( `cdate` ) AS tstamp
+													  FROM 
+													  		`".WPSG_TBL_ORDER."`
+													  WHERE 
+													  		".$this->getSqlWhere('validOrder')." AND 
+													  		`cdate`	>= '".date('Y-m-d 00:00:00', $dayFirstMonthTS)."' AND 
+													  		`cdate` <= '".date('Y-m-d 23:59:59', $dayLastMonthTS)."'
+													  GROUP BY 
+													  		year, month, week
+													  ORDER BY 
+													  		week ASC
+													  ", "week");
+		
+		foreach ($arWeeks as $week)
+		{
+			if (!array_key_exists($week['week'], (array)$arData[0]['records']))
+			{
+				$arData[0]['records'][$week['week']] = array(	'orders'	=> '0',
+																'total'		=> '0',
+																'avg_total' => '0',
+																'quarter'	=> $actQuarter,
+																'day'		=> $week['day'],
+																'week'		=> $week['week'],
+																'year'		=> $week['year'],
+																'month'		=> $week['month'],
+																'tstamp'	=> mktime(0, 0, 0, $week['month'], $week['day'], $week['year']));
+			}
+			
+			$arData[0]['records'][$week['week']]['label'] = __('KW', 'wpsg').' '.$week['week'];
+			
+		}
+		
+		$arData[0]['label'] = $actQuarter.".".__('Quartal', 'wpsg').' '.$year;
+		$arData[0]['year'] = $year;
+		
+		$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+		
+		if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
+		{
+			$arRelatedData = $this->getQuarter($params['relatedpoint']);
+			
+			$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+			$arData[] = $arRelatedData[0];
+		}
+		
+		return $arData;
+		
+	}
+	
+	/**
+	 * RÃŒckgabe der Statistik auf einen Monat bezogen
+	 * @internal Bezug -> Tag 
+	 * @param string
+	 * @return array
+	 */
+	public function getMonth($point = 0, $params = array())
+	{
+		
+		if ($point == '0')
+		{
+			$year = date('Y');
+			$month = date('n');
+		}
+		else if ($point == '-1')
+		{
+			$year = date('Y');
+			$month = date('n') - 1;
+			
+			if ($month == 0)
+			{
+				$month = 12;
+				$year--;
+			}
+		}
+		
+		$arData[0]['records'] = $this->db->fetchAssoc(" SELECT 
+														    COUNT(*) AS orders,
+															SUM( `price_gesamt` ) AS total,
+															AVG( `price_gesamt` ) AS avg_total,
+															DAY( `cdate`) AS day, 
+															MONTH( `cdate` ) AS month, 
+															YEAR( `cdate` ) AS year,
+															UNIX_TIMESTAMP(`cdate`) AS tstamp
+													  FROM 
+													  		`".WPSG_TBL_ORDER."`
+													  WHERE 
+													  		".$this->getSqlWhere('validOrder')." AND 
+													  		YEAR( `cdate` ) = '".$year."' AND 
+													  		MONTH ( `cdate` ) = '".$month."'
+													  GROUP BY 
+													  		year, month, day
+													  ORDER BY 
+													  		year DESC
+													  ", "day");
+		
+		$days = wpsg_getDaysofMonth($month, $year);
+		
+		$arData[0]['min'] = mktime(0, 0, 0, $month, 1, $year);
+		$arData[0]['max'] = mktime(0, 0, 0, $month, $days, $year);
+		
+		$arData[0]['label'] = date_i18n('F', $arData[0]['min']).' '.date('Y', $arData[0]['min']);
+	
+		for ($day = 1; $day <= $days; $day++)
+		{
+			if (!isset($arData[0]['records'][$day]))
+			{
+				$arData[0]['records'][$day] = array('orders' 	=> '0',
+													'total'		=> '0',
+													'avg_total'	=> '0',
+													'day'		=> $day,
+													'month'		=> $month,
+													'year'		=> $year,
+													'tstamp'	=> mktime(0, 0, 0, $month, $day, $year));
+			}
+			
+			$arData[0]['records'][$day]['label'] = str_pad($day, 2, "0", STR_PAD_LEFT).'.'.str_pad($month, 2, "0", STR_PAD_LEFT).'.'.$year;
+			
+		}
+		
+		$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+		
+		if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
+		{
+			$arRelatedData = $this->getMonth($params['relatedpoint']);
+			
+			$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+			$arData[] = $arRelatedData[0];
+		}
+		
+		return $arData;
+		
+	}
+	
+	/**
+	 * RÃŒckgabe der Statistik auf eine Woche bezogen
+	 * @internal Bezug -> Tag 
+	 * @param string
+	 * @return array
+	 */
+	public function getWeek($point = 0, $params = array())
+	{
+		
+		$adjustment = 1;
+		
+		if ($point == '0')
+		{
+			$weekday = date("w", time());
+		
+			$firstDayofWeek = time() - (($weekday - $adjustment)*86400);
+			$lastDayofWeek = time() + ((6 + $adjustment - $weekday) * 86400);
+		}
+		else if ($point == '-1') 
+		{
+			
+			$time = time() - (6*86400);
+			
+			$weekday = date("w", $time);
+		
+			$firstDayofWeek = $time - (($weekday - $adjustment)*86400);
+			$lastDayofWeek = $time + ((6 + $adjustment - $weekday) * 86400);
+		}
+		
+		$arData[0]['records'] = $this->db->fetchAssoc("	SELECT 
+															COUNT(*) AS orders,
+															SUM( `price_gesamt` ) AS total,
+															AVG( `price_gesamt` ) AS avg_total,
+															DAY( `cdate`) AS day, 
+															MONTH( `cdate` ) AS month, 
+															YEAR( `cdate` ) AS year,
+															UNIX_TIMESTAMP(`cdate`) AS tstamp
+													 	FROM 
+													  		`".WPSG_TBL_ORDER."`
+													 	WHERE 
+													  		".$this->getSqlWhere('validOrder')." AND 
+													  		`cdate`	>= '".date('Y-m-d 00:00:00', $firstDayofWeek)."' AND 
+													  		`cdate` <= '".date('Y-m-d 23:59:59', $lastDayofWeek)."'
+													 	GROUP BY 
+													 		year, month, day
+														ORDER BY 
+													 		year DESC
+													 	", "day");
+		
+		$day += $firstDayofWeek;
+		
+		for ($i = 0; $i < 7; $i++)
+		{	
+			if (!isset($arData[0]['records'][date(j, $day)]))
+			{
+				$arData[0]['records'][date(j, $day)] = array('orders'	=> '0',
+															 'total'	=> '0',
+															 'avg_total'=> '0',
+															 'day'		=> date('d', $day),
+															 'month'	=> date('m', $day),
+															 'year'		=> date('Y', $day),
+															 'tstamp' 	=> $day);
+			}	
+
+			$arData[0]['records'][date(j, $day)]['label'] = date('d.m.Y', $day);	
+			
+			$day += 86400;
+		}
+		
+		$arData[0]['firstdayofweek'] = $firstDayofWeek;
+		$arData[0]['lastdayofweek'] = $lastDayofWeek;
+		
+		$arData[0]['label'] = "KW ".date('W', $firstDayofWeek)." ".date('Y', $firstDayofWeek);	
+		
+		$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+		
+		if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
+		{
+			$arRelatedData = $this->getWeek($params['relatedpoint']);
+			
+			$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+			$arData[] = $arRelatedData[0];
+		}
+
+		return $arData;		
+	}
+	
+	
+	
+	/**
+	 * RÃŒckgabe der Statistik auf einen Tag bezogen
+	 * @internal Bezug -> Stunde 
+	 * @param string
+	 * @return array
+	 */
+	public function getDay($point = 0, $params = array())
+	{
+			
+		if ($point == 0)
+		{
+			$day = time();
+		}
+		else if ($point == -1)
+		{
+			$day = time() - 86400;
+		}
+		
+		$arData[0]['records'] = $this->db->fetchAssoc("SELECT 
+														    COUNT(*) AS orders,
+															SUM( `price_gesamt` ) AS total,
+															AVG( `price_gesamt` ) AS avg_total,
+															HOUR( `cdate` ) AS hour, 
+															DAY ( `cdate` ) AS day, 
+															MONTH( `cdate` ) AS month, 
+															YEAR( `cdate` ) AS year,
+															HOUR( `cdate` ) AS tstamp
+													 FROM 
+													  		`".WPSG_TBL_ORDER."`
+													 WHERE  
+													  		".$this->getSqlWhere('validOrder')." AND 
+													  		YEAR( `cdate` ) = '".date('Y', $day)."' AND 
+										  					MONTH ( `cdate` ) = '".date('m', $day)."' AND 
+										  					DAY (`cdate`) = '".date('d', $day)."'
+													 GROUP BY 
+													 		year, month, day, hour
+													 ORDER BY 
+													 		hour ASC
+													 ", "hour");
+		
+		$daytime = strtotime(date('d.m.Y 00:00:00', $day));
+		
+		$arData[0]['year'] = date('Y', $daytime);
+		$arData[0]['month'] = date('m', $daytime);
+		$arData[0]['day'] = date('d', $daytime);
+		
+		$arData[0]['label'] = date('d.m.Y', $daytime);
+		
+		for ($i = 0; $i < 24; $i++)
+		{	
+			if (!isset($arData[0]['records'][date('G', $daytime)]))
+			{
+				$arData[0]['records'][date('G', $daytime)] = array( 'orders' 	=> '0',
+																	'total'	 	=> '0',
+																	'avg_total'	=> '0',
+																	'hour'	 	=> date('G', $daytime),
+																	'day'	 	=> date('d', $daytime),
+																	'month'	 	=> date('m', $daytime),
+																	'year'	 	=> date('Y', $daytime),
+																	'tstamp'	=> date('G', $daytime));
+			}	
+			
+			$arData[0]['records'][date('G', $daytime)]['label'] = date('G', $daytime);
+			
+			$daytime += 3600;
+		}
+		
+		$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+		
+		if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
+		{
+			$arRelatedData = $this->getDay($params['relatedpoint']);
+			
+			$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+			$arData[] = $arRelatedData[0];
+		}
+		
+		return $arData;
+	}
+	
+	/**
+	 * RÃŒckgabe der Statistik bezogen auf einen benutzerdefinierten Zeitraum
+	 * @internal Bezug -> Tag 
+	 * @param string
+	 * @return array
+	 */
+	public function getCustomRange($point = 0, $params = array())
+	{	
+
+		$arYears = array();
+		$arMonths = array();
+		$arWeeks = array();
+		$arDays = array();
+		
+		if ($params['oStart'] > 0 && $params['oEnd'] > 0)		
+		{
+			$start = $params['oStart'];
+			$end = $params['oEnd'];	
+		}
+		else
+		{
+			$start = wpsg_fieldarray_todate($_REQUEST['filter']['day'][0]);
+			$end = wpsg_fieldarray_todate($_REQUEST['filter']['day'][1]);
+		}
+		
+		$daycount = $start;
+
+		while ($daycount <= $end)
+		{
+			$week = date('W', $daycount);
+			
+			if ($week[0] == 0 && strlen($week) == 2)
+			{
+				$week = str_replace('0', '', $week);
+			}
+			
+			$year = date('Y', $daycount);	
+			$month = date('n', $daycount);
+			$day = date('j', $daycount);
+			
+			if (!in_array($year.'-'.$week, $arWeeks))
+			{
+				$arWeeks[$year.'-'.$week] = array('day'		=> $day,
+				                    			  'week' 	=> $week,
+								        	  	  'year' 	=> $year,
+											  	  'month'	=> $month);
+			}
+			
+			if (!in_array($year.'-'.$month, $arMonths))
+			{
+
+				$arMonths[$year.'-'.$month] = array('month' => $month,
+											    	'year'  => $year);
+
+			}
+			
+			if (!in_array($year.'-'.$month.'-'.$day, $arDays))
+			{
+				$arDays[$year.'-'.$month.'-'.$day] = array('day'   => $day,
+														   'month' => $month,
+											    		   'year'  => $year);
+			}
+			
+			if (!in_array($year, $arYears))
+			{
+				$arYears[$year] = array('year' => $year);
+			}
+
+			
+			$daycount += 86400;
+		}
+		
+		if (count($arDays) <= 1)
+		{
+			$arData['template'] = 'day';
+			
+			$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start);
+			
+			$day = $start;
+			
+			$arData[0]['records'] = $this->db->fetchAssoc("	 SELECT 
+																    COUNT(*) AS orders,
+																	SUM( `price_gesamt` ) AS total,
+																	AVG( `price_gesamt` ) AS avg_total,
+																	HOUR( `cdate` ) AS hour, 
+																	DAY ( `cdate` ) AS day, 
+																	MONTH( `cdate` ) AS month, 
+																	YEAR( `cdate` ) AS year,
+																	CAST( `cdate` AS DATE ) AS dateid,
+																	HOUR( `cdate` ) AS tstamp
+															  FROM 
+															  		`".WPSG_TBL_ORDER."`
+															  WHERE 
+															  		".$this->getSqlWhere('validOrder')." AND  
+															  		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
+														  			`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
+															  GROUP BY 
+															  		year, month, day, hour
+															  ORDER BY 
+															  		hour DESC
+															  ", "hour");
+			
+			$daytime = strtotime(date('d.m.Y 00:00:00', $day));
+		
+			$arData[0]['year'] = date('Y', $daytime);
+			$arData[0]['month'] = date('m', $daytime);
+			$arData[0]['day'] = date('d', $daytime);
+			
+			for ($i = 0; $i < 24; $i++)
+			{	
+				if (!isset($arData[0]['records'][date('G', $daytime)]))
+				{
+					$arData[0]['records'][date('G', $daytime)] = array( 'orders' 	=> '0',
+																		'total'	 	=> '0',
+																		'avg_total'	=> '0',
+																		'hour'	 	=> date('G', $daytime),
+																		'day'	 	=> date('d', $daytime),
+																		'month'	 	=> date('m', $daytime),
+																		'year'	 	=> date('Y', $daytime),
+																		'tstamp' 	=> date('G', $daytime));
+				}	
+				
+				$arData[0]['records'][date('G', $daytime)]['label'] = date('G', $daytime);
+				
+				$daytime += 3600;
+			}
+			
+			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+		}
+		//Tage render
+		else if (count($arDays) <= 50)
+		{
+	
+			$arData['template'] = 'month';
+			
+			$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
+			
+			$arData[0]['min'] = $start;
+			$arData[0]['max'] = $end;
+			
+			$arData[0]['records'] = $this->db->fetchAssoc("	 SELECT 
+																    COUNT(*) AS orders,
+																	SUM( `price_gesamt` ) AS total,
+																	AVG( `price_gesamt` ) AS avg_total,
+																	DAY( `cdate`) AS day, 
+																	MONTH( `cdate` ) AS month, 
+																	YEAR( `cdate` ) AS year,
+																	CAST( `cdate` AS DATE ) AS dateid,
+																	UNIX_TIMESTAMP(`cdate`) AS tstamp
+															  FROM 
+															  		`".WPSG_TBL_ORDER."`
+															  WHERE 
+															  		".$this->getSqlWhere('validOrder')." AND 
+															  		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
+														  			`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
+															  GROUP BY 
+															  		year, month, day
+															  ORDER BY 
+															  		year DESC
+															  ", "dateid");
+
+			$daycount = $start;
+	
+			while ($daycount <= $end)
+			{
+				
+				$dateid = date('Y-m-d', $daycount);
+				
+				if (!isset($arData[0]['records'][$dateid]))
+				{
+					$arData[0]['records'][$dateid] = array(	'orders'	=> '0',
+															'total'		=> '0',
+															'avg_total'	=> '0',
+															'day'		=> date('d', $daycount),
+															'month'		=> date('m', $daycount),
+															'year'		=> date('Y', $daycount),
+															'tstamp'	=> $daycount);
+				}
+				
+				$arData[0]['records'][$dateid]['label'] = date('d.m.Y', $daycount);
+
+				$daycount += 86400;
+			}
+			
+			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+			
+		}
+		//Wochen rendern
+		else if (count($arWeeks) <= 15)
+		{
+			
+			$arData['template'] = 'quarter';
+			
+			$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
 			
 			$arData[0]['records'] = $this->db->fetchAssoc(" SELECT 
-																COUNT(*) AS orders,
-																".$actQuarter." AS quarter,
+															    COUNT(*) AS orders,
 																SUM( `price_gesamt` ) AS total,
 																AVG( `price_gesamt` ) AS avg_total,
 																DAY( `cdate`) AS day,
-																DAYOFYEAR (`cdate`) AS dayofyear,
 																WEEK ( `cdate`, 3) AS week, 
 																MONTH( `cdate` ) AS month, 
 																YEAR( `cdate` ) AS year,
-																UNIX_TIMESTAMP( `cdate` ) AS tstamp
+																CONCAT(YEAR( `cdate` ),'-', WEEK( `cdate`, 3) ) AS dateid,
+																UNIX_TIMESTAMP(`cdate`) AS tstamp
 														  FROM 
-																`".WPSG_TBL_ORDER."`
+														  		`".WPSG_TBL_ORDER."`
 														  WHERE 
-																".$this->getSqlWhere('validOrder')." AND 
-																`cdate`	>= '".date('Y-m-d 00:00:00', $dayFirstMonthTS)."' AND 
-																`cdate` <= '".date('Y-m-d 23:59:59', $dayLastMonthTS)."'
+														  		".$this->getSqlWhere('validOrder')." AND 
+														  		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
+														  		`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
 														  GROUP BY 
-																year, month, week
+														  		year, month, week
 														  ORDER BY 
-																week ASC
-														  ", "week");
+														  		dateid ASC
+														  ", "dateid");
+			
+			
 			
 			foreach ($arWeeks as $week)
 			{
-				if (!array_key_exists($week['week'], (array)$arData[0]['records']))
+				
+				if (!array_key_exists($week['year'].'-'.$week['week'], (array)$arData[0]['records']))
 				{
-					$arData[0]['records'][$week['week']] = array(	'orders'	=> '0',
-						'total'		=> '0',
-						'avg_total' => '0',
-						'quarter'	=> $actQuarter,
-						'day'		=> $week['day'],
-						'week'		=> $week['week'],
-						'year'		=> $week['year'],
-						'month'		=> $week['month'],
-						'tstamp'	=> mktime(0, 0, 0, $week['month'], $week['day'], $week['year']));
+					$arData[0]['records'][$week['year'].'-'.$week['week']] = array(	'orders'	=> '0',
+																					'total'		=> '0',
+																					'avg_total'	=> '0',
+																					'day'		=> $week['day'],
+																					'week'		=> $week['week'],
+																					'year'		=> $week['year'],
+																					'month'		=> $week['month'],
+																					'tstamp'	=> mktime(0, 0, 0, $week['month'], $week['day'], $week['year']));
+
 				}
 				
-				$arData[0]['records'][$week['week']]['label'] = __('KW', 'wpsg').' '.$week['week'];
-				
-			}
-			
-			$arData[0]['label'] = $actQuarter.".".__('Quartal', 'wpsg').' '.$year;
-			$arData[0]['year'] = $year;
+				$arData[0]['records'][$week['year'].'-'.$week['week']]['label'] = __('KW', 'wpsg').' '.$week['week'].' '.$week['year'];
+				
+			}	
 			
 			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
 			
-			if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
-			{
-				$arRelatedData = $this->getQuarter($params['relatedpoint']);
-				
-				$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-				$arData[] = $arRelatedData[0];
-			}
-			
-			return $arData;
-			
-		}
-		
-		/**
-		 * RÃŒckgabe der Statistik auf einen Monat bezogen
-		 * @internal Bezug -> Tag
-		 * @param string
-		 * @return array
-		 */
-		public function getMonth($point = 0, $params = array())
-		{
-			
-			if ($point == '0')
-			{
-				$year = date('Y');
-				$month = date('n');
-			}
-			else if ($point == '-1')
-			{
-				$year = date('Y');
-				$month = date('n') - 1;
-				
-				if ($month == 0)
-				{
-					$month = 12;
-					$year--;
-				}
-			}
+		}
+		//Monate rendern
+		else if (count($arMonths) <= 36)
+		{
+
+			$arData['template'] = 'year';
+			
+			$arData[0]['min'] = mktime(0, 0, 0, date('m', $start), 1, date('Y', $start));
+			$arData[0]['max'] = mktime(0, 0, 0, date('m', $end), wpsg_getDaysofMonth(date('m', $end), date('Y', $end)), date('Y', $end));
+			
+			$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
 			
 			$arData[0]['records'] = $this->db->fetchAssoc(" SELECT 
 																COUNT(*) AS orders,
-																SUM( `price_gesamt` ) AS total,
+																SUM(`price_gesamt`) AS total, 
 																AVG( `price_gesamt` ) AS avg_total,
-																DAY( `cdate`) AS day, 
-																MONTH( `cdate` ) AS month, 
-																YEAR( `cdate` ) AS year,
+																MONTH(`cdate`) AS month, 
+																YEAR(`cdate`) AS year,
+																CONCAT(YEAR(`cdate`), '-', MONTH(`cdate`)) AS dateid,
 																UNIX_TIMESTAMP(`cdate`) AS tstamp
 														  FROM 
-																`".WPSG_TBL_ORDER."`
+														  		`".WPSG_TBL_ORDER."`
 														  WHERE 
-																".$this->getSqlWhere('validOrder')." AND 
-																YEAR( `cdate` ) = '".$year."' AND 
-																MONTH ( `cdate` ) = '".$month."'
+														  		".$this->getSqlWhere('validOrder')." AND 
+														  		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
+													  			`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
 														  GROUP BY 
-																year, month, day
+														  		year, month
 														  ORDER BY 
-																year DESC
-														  ", "day");
-			
-			$days = wpsg_getDaysofMonth($month, $year);
-			
-			$arData[0]['min'] = mktime(0, 0, 0, $month, 1, $year);
-			$arData[0]['max'] = mktime(0, 0, 0, $month, $days, $year);
-			
-			$arData[0]['label'] = date_i18n('F', $arData[0]['min']).' '.date('Y', $arData[0]['min']);
-			
-			for ($day = 1; $day <= $days; $day++)
-			{
-				if (!isset($arData[0]['records'][$day]))
+														  		tstamp ASC
+														   ", "dateid");
+			
+			foreach ($arMonths as $index => $month)
+			{
+				
+				if (!array_key_exists($index, $arData[0]['records']))
 				{
-					$arData[0]['records'][$day] = array('orders' 	=> '0',
-						'total'		=> '0',
-						'avg_total'	=> '0',
-						'day'		=> $day,
-						'month'		=> $month,
-						'year'		=> $year,
-						'tstamp'	=> mktime(0, 0, 0, $month, $day, $year));
+					$arData[0]['records'][$index] = array(	'orders' 	=> '0',
+													   		'total'	 	=> '0',
+															'avg_total'	=> '0',
+													   		'month'	 	=> $month['month'],
+													   		'year'	 	=> $month['year'],
+															'tstamp'	=> mktime(0, 0, 0, $month['month'], 1, $month['year']));
 				}
-				
-				$arData[0]['records'][$day]['label'] = str_pad($day, 2, "0", STR_PAD_LEFT).'.'.str_pad($month, 2, "0", STR_PAD_LEFT).'.'.$year;
-				
+
+				$arData[0]['records'][$index]['label'] = date_i18n('F', mktime(0, 0, 0, $month['month'], 1, $month['year'])).' '.$month['year'];
+				$arData[0]['records'][$index]['tick'] = date_i18n('M', mktime(0, 0, 0, $month['month'], 1, $month['year']));
+						
 			}
 			
 			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
 			
-			if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
-			{
-				$arRelatedData = $this->getMonth($params['relatedpoint']);
-				
-				$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-				$arData[] = $arRelatedData[0];
-			}
-			
-			return $arData;
-			
-		}
-		
-		/**
-		 * RÃŒckgabe der Statistik auf eine Woche bezogen
-		 * @internal Bezug -> Tag
-		 * @param string
-		 * @return array
-		 */
-		public function getWeek($point = 0, $params = array())
-		{
-			
-			$adjustment = 1;
-			$day = 0;
-			
-			if ($point == '0')
-			{
-				$weekday = date("w", time());
-				
-				$firstDayofWeek = time() - (($weekday - $adjustment)*86400);
-				$lastDayofWeek = time() + ((6 + $adjustment - $weekday) * 86400);
-			}
-			else if ($point == '-1')
-			{
-				
-				$time = time() - (6*86400);
-				
-				$weekday = date("w", $time);
-				
-				$firstDayofWeek = $time - (($weekday - $adjustment)*86400);
-				$lastDayofWeek = $time + ((6 + $adjustment - $weekday) * 86400);
-			}
-			
-			$arData[0]['records'] = $this->db->fetchAssoc("	SELECT 
-																COUNT(*) AS orders,
-																SUM( `price_gesamt` ) AS total,
-																AVG( `price_gesamt` ) AS avg_total,
-																DAY( `cdate`) AS day, 
-																MONTH( `cdate` ) AS month, 
-																YEAR( `cdate` ) AS year,
-																UNIX_TIMESTAMP(`cdate`) AS tstamp
-															FROM 
-																`".WPSG_TBL_ORDER."`
-															WHERE 
-																 ".$this->getSqlWhere('validOrder')." AND
-																`cdate`	>= '".date('Y-m-d 00:00:00', $firstDayofWeek)."' AND 
-																`cdate` <= '".date('Y-m-d 23:59:59', $lastDayofWeek)."'
-															GROUP BY 
-																year, month, day
-															ORDER BY 
-																year DESC
-															", "day");
-			
-			$day += $firstDayofWeek;
-			
-			for ($i = 0; $i < 7; $i++)
-			{
-				if (!isset($arData[0]['records'][date('j', $day)]))
-				{
-					$arData[0]['records'][date('j', $day)] = array('orders'	=> '0',
-						'total'	=> '0',
-						'avg_total'=> '0',
-						'day'		=> date('d', $day),
-						'month'	=> date('m', $day),
-						'year'		=> date('Y', $day),
-						'tstamp' 	=> $day);
-				}
-				
-				$arData[0]['records'][date('j', $day)]['label'] = date('d.m.Y', $day);
-				
-				$day += 86400;
-			}
-			
-			$arData[0]['firstdayofweek'] = $firstDayofWeek;
-			$arData[0]['lastdayofweek'] = $lastDayofWeek;
-			
-			$arData[0]['label'] = "KW ".date('W', $firstDayofWeek)." ".date('Y', $firstDayofWeek);
-			
-			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-			
-			if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
-			{
-				$arRelatedData = $this->getWeek($params['relatedpoint']);
-				
-				$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-				$arData[] = $arRelatedData[0];
-			}
-			
-			return $arData;
-		}
-		
-		/**
-		 * RÃŒckgabe der Statistik auf einen Tag bezogen
-		 * @internal Bezug -> Stunde
-		 * @param string
-		 * @return array
-		 */
-		public function getDay($point = 0, $params = array()) {
-						
-			if ($point == 0)
-			{
-				$day = time();
-			}
-			else if ($point == -1)
-			{
-				$day = time() - 86400;
-			}
-			
-			$arData[0]['records'] = $this->db->fetchAssoc("SELECT 
-																COUNT(*) AS orders,
-																SUM( `price_gesamt` ) AS total,
-																AVG( `price_gesamt` ) AS avg_total,
-																HOUR( `cdate` ) AS hour, 
-																DAY ( `cdate` ) AS day, 
-																MONTH( `cdate` ) AS month, 
-																YEAR( `cdate` ) AS year,
-																HOUR( `cdate` ) AS tstamp
-														 FROM 
-																`".WPSG_TBL_ORDER."`
-														 WHERE  
-																".$this->getSqlWhere('validOrder')." AND 
-																YEAR( `cdate` ) = '".date('Y', $day)."' AND 
-																MONTH ( `cdate` ) = '".date('m', $day)."' AND 
-																DAY (`cdate`) = '".date('d', $day)."'
-														 GROUP BY 
-																year, month, day, hour
-														 ORDER BY 
-																hour ASC
-														 ", "hour");
-			
-			$daytime = strtotime(date('d.m.Y 00:00:00', $day));
-			
-			$arData[0]['year'] = date('Y', $daytime);
-			$arData[0]['month'] = date('m', $daytime);
-			$arData[0]['day'] = date('d', $daytime);
-			
-			$arData[0]['label'] = date('d.m.Y', $daytime);
-			
-			for ($i = 0; $i < 24; $i++)
-			{
-				if (!isset($arData[0]['records'][date('G', $daytime)]))
-				{
-					$arData[0]['records'][date('G', $daytime)] = array( 'orders' 	=> '0',
-						'total'	 	=> '0',
-						'avg_total'	=> '0',
-						'hour'	 	=> date('G', $daytime),
-						'day'	 	=> date('d', $daytime),
-						'month'	 	=> date('m', $daytime),
-						'year'	 	=> date('Y', $daytime),
-						'tstamp'	=> date('G', $daytime));
-				}
-				
-				$arData[0]['records'][date('G', $daytime)]['label'] = date('G', $daytime);
-				
-				$daytime += 3600;
-			}
-			
-			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-			
-			if (isset($params['relatedpoint']) && is_numeric($params['relatedpoint']))
-			{
-				$arRelatedData = $this->getDay($params['relatedpoint']);
-				
-				$this->addSorting($arRelatedData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-				$arData[] = $arRelatedData[0];
-			}
-			
-			return $arData;
-		}
-		
-		/**
-		 * RÃŒckgabe der Statistik bezogen auf einen benutzerdefinierten Zeitraum
-		 * @internal Bezug -> Tag
-		 * @param string
-		 * @return array
-		 */
-		public function getCustomRange($point = 0, $params = array())
-		{
-			
-			$arYears = array();
-			$arMonths = array();
-			$arWeeks = array();
-			$arDays = array();
-			
-			if ($params['oStart'] > 0 && $params['oEnd'] > 0)
-			{
-				$start = $params['oStart'];
-				$end = $params['oEnd'];
-			}
-			else
-			{
-				$start = wpsg_fieldarray_todate($_REQUEST['filter']['day'][0]);
-				$end = wpsg_fieldarray_todate($_REQUEST['filter']['day'][1]);
-			}
-			
-			$daycount = $start;
-			
-			while ($daycount <= $end)
-			{
-				$week = date('W', $daycount);
-				
-				if ($week[0] == 0 && strlen($week) == 2)
-				{
-					$week = str_replace('0', '', $week);
-				}
-				
-				$year = date('Y', $daycount);
-				$month = date('n', $daycount);
-				$day = date('j', $daycount);
-				
-				if (!in_array($year.'-'.$week, $arWeeks))
-				{
-					$arWeeks[$year.'-'.$week] = array('day'		=> $day,
-						'week' 	=> $week,
-						'year' 	=> $year,
-						'month'	=> $month);
-				}
-				
-				if (!in_array($year.'-'.$month, $arMonths))
+		}
+		//Jahre rendern
+		else
+		{
+			
+			$arData['template'] = 'all';
+			
+			$arData[0]['min'] = $start;
+			$arData[0]['max'] = $end;
+			
+			$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
+			
+			$arData[0]['records'] = $this->db->fetchAssoc(" 
+					SELECT 
+						COUNT(*) AS orders,
+						SUM(`price_gesamt`) AS total, 
+						AVG( `price_gesamt` ) AS avg_total,
+						YEAR(`cdate`) AS year,
+						UNIX_TIMESTAMP( `cdate` ) AS tstamp
+				  	FROM 
+				  		`".WPSG_TBL_ORDER."`
+				  	WHERE 
+				  		".$this->getSqlWhere('validOrder')." AND 
+				  		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
+			  			`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
+				  	GROUP BY 
+				  		year
+				  	ORDER BY 
+				  		year ASC
+				   ", "year");
+			
+			foreach ($arYears as $index => $year)
+			{
+				
+				if (!array_key_exists($index, $arData[0]['records']))
 				{
 					
-					$arMonths[$year.'-'.$month] = array('month' => $month,
-						'year'  => $year);
+					$arData[0]['records'][$index] = array(	'orders' 	=> '0',
+													  		'total'		=> '0',
+															'avg_total'	=> '0',
+													   		'year'		=> $year['year'],
+															'tstamp'	=> mktime(0, 0, 0, 1, 1, $year['year']));
 					
-				}
-				
-				if (!in_array($year.'-'.$month.'-'.$day, $arDays))
-				{
-					$arDays[$year.'-'.$month.'-'.$day] = array('day'   => $day,
-						'month' => $month,
-						'year'  => $year);
-				}
-				
-				if (!in_array($year, $arYears))
-				{
-					$arYears[$year] = array('year' => $year);
-				}
-				
-				
-				$daycount += 86400;
-			}
-			
-			if (count($arDays) <= 1)
-			{
-				$arData['template'] = 'day';
-				
-				$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start);
-				
-				$day = $start;
-				
-				$arData[0]['records'] = $this->db->fetchAssoc("	 SELECT 
-																		COUNT(*) AS orders,
-																		SUM( `price_gesamt` ) AS total,
-																		AVG( `price_gesamt` ) AS avg_total,
-																		HOUR( `cdate` ) AS hour, 
-																		DAY ( `cdate` ) AS day, 
-																		MONTH( `cdate` ) AS month, 
-																		YEAR( `cdate` ) AS year,
-																		CAST( `cdate` AS DATE ) AS dateid,
-																		HOUR( `cdate` ) AS tstamp
-																  FROM 
-																		`".WPSG_TBL_ORDER."`
-																  WHERE 
-																		".$this->getSqlWhere('validOrder')." AND  
-																		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
-																		`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
-																  GROUP BY 
-																		year, month, day, hour
-																  ORDER BY 
-																		hour DESC
-																  ", "hour");
-				
-				$daytime = strtotime(date('d.m.Y 00:00:00', $day));
-				
-				$arData[0]['year'] = date('Y', $daytime);
-				$arData[0]['month'] = date('m', $daytime);
-				$arData[0]['day'] = date('d', $daytime);
-				
-				for ($i = 0; $i < 24; $i++)
-				{
-					if (!isset($arData[0]['records'][date('G', $daytime)]))
-					{
-						$arData[0]['records'][date('G', $daytime)] = array( 'orders' 	=> '0',
-							'total'	 	=> '0',
-							'avg_total'	=> '0',
-							'hour'	 	=> date('G', $daytime),
-							'day'	 	=> date('d', $daytime),
-							'month'	 	=> date('m', $daytime),
-							'year'	 	=> date('Y', $daytime),
-							'tstamp' 	=> date('G', $daytime));
-					}
-					
-					$arData[0]['records'][date('G', $daytime)]['label'] = date('G', $daytime);
-					
-					$daytime += 3600;
-				}
-				
-				$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-			}
-			//Tage render
-			else if (count($arDays) <= 50)
-			{
-				
-				$arData['template'] = 'month';
-				
-				$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
-				
-				$arData[0]['min'] = $start;
-				$arData[0]['max'] = $end;
-				
-				$arData[0]['records'] = $this->db->fetchAssoc("	 SELECT 
-																		COUNT(*) AS orders,
-																		SUM( `price_gesamt` ) AS total,
-																		AVG( `price_gesamt` ) AS avg_total,
-																		DAY( `cdate`) AS day, 
-																		MONTH( `cdate` ) AS month, 
-																		YEAR( `cdate` ) AS year,
-																		CAST( `cdate` AS DATE ) AS dateid,
-																		UNIX_TIMESTAMP(`cdate`) AS tstamp
-																  FROM 
-																		`".WPSG_TBL_ORDER."`
-																  WHERE 
-																		".$this->getSqlWhere('validOrder')." AND 
-																		`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
-																		`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
-																  GROUP BY 
-																		year, month, day
-																  ORDER BY 
-																		year DESC
-																  ", "dateid");
-				
-				$daycount = $start;
-				
-				while ($daycount <= $end)
-				{
-					
-					$dateid = date('Y-m-d', $daycount);
-					
-					if (!isset($arData[0]['records'][$dateid]))
-					{
-						$arData[0]['records'][$dateid] = array(	'orders'	=> '0',
-							'total'		=> '0',
-							'avg_total'	=> '0',
-							'day'		=> date('d', $daycount),
-							'month'		=> date('m', $daycount),
-							'year'		=> date('Y', $daycount),
-							'tstamp'	=> $daycount);
-					}
-					
-					$arData[0]['records'][$dateid]['label'] = date('d.m.Y', $daycount);
-					
-					$daycount += 86400;
-				}
-				
-				$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-			}
-			//Wochen rendern
-			else if (count($arWeeks) <= 15)
-			{
-				
-				$arData['template'] = 'quarter';
-				
-				$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
-				
-				$arData[0]['records'] = $this->db->fetchAssoc(" SELECT 
-																	COUNT(*) AS orders,
-																	SUM( `price_gesamt` ) AS total,
-																	AVG( `price_gesamt` ) AS avg_total,
-																	DAY( `cdate`) AS day,
-																	WEEK ( `cdate`, 3) AS week, 
-																	MONTH( `cdate` ) AS month, 
-																	YEAR( `cdate` ) AS year,
-																	CONCAT(YEAR( `cdate` ),'-', WEEK( `cdate`, 3) ) AS dateid,
-																	UNIX_TIMESTAMP(`cdate`) AS tstamp
-															  FROM 
-																	`".WPSG_TBL_ORDER."`
-															  WHERE 
-																	".$this->getSqlWhere('validOrder')." AND 
-																	`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
-																	`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
-															  GROUP BY 
-																	year, month, week
-															  ORDER BY 
-																	dateid ASC
-															  ", "dateid");
-				
-				
-				
-				foreach ($arWeeks as $week)
-				{
-					
-					if (!array_key_exists($week['year'].'-'.$week['week'], (array)$arData[0]['records']))
-					{
-						$arData[0]['records'][$week['year'].'-'.$week['week']] = array(	'orders'	=> '0',
-							'total'		=> '0',
-							'avg_total'	=> '0',
-							'day'		=> $week['day'],
-							'week'		=> $week['week'],
-							'year'		=> $week['year'],
-							'month'		=> $week['month'],
-							'tstamp'	=> mktime(0, 0, 0, $week['month'], $week['day'], $week['year']));
-						
-					}
-					
-					$arData[0]['records'][$week['year'].'-'.$week['week']]['label'] = __('KW', 'wpsg').' '.$week['week'].' '.$week['year'];
-					
-				}
-				
-				$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-			}
-			//Monate rendern
-			else if (count($arMonths) <= 36)
-			{
-				
-				$arData['template'] = 'year';
-				
-				$arData[0]['min'] = mktime(0, 0, 0, date('m', $start), 1, date('Y', $start));
-				$arData[0]['max'] = mktime(0, 0, 0, date('m', $end), wpsg_getDaysofMonth(date('m', $end), date('Y', $end)), date('Y', $end));
-				
-				$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
-				
-				$arData[0]['records'] = $this->db->fetchAssoc(" SELECT 
-																	COUNT(*) AS orders,
-																	SUM(`price_gesamt`) AS total, 
-																	AVG( `price_gesamt` ) AS avg_total,
-																	MONTH(`cdate`) AS month, 
-																	YEAR(`cdate`) AS year,
-																	CONCAT(YEAR(`cdate`), '-', MONTH(`cdate`)) AS dateid,
-																	UNIX_TIMESTAMP(`cdate`) AS tstamp
-															  FROM 
-																	`".WPSG_TBL_ORDER."`
-															  WHERE 
-																	".$this->getSqlWhere('validOrder')." AND 
-																	`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
-																	`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
-															  GROUP BY 
-																	year, month
-															  ORDER BY 
-																	tstamp ASC
-															   ", "dateid");
-				
-				foreach ($arMonths as $index => $month)
-				{
-					
-					if (!array_key_exists($index, $arData[0]['records']))
-					{
-						$arData[0]['records'][$index] = array(	'orders' 	=> '0',
-							'total'	 	=> '0',
-							'avg_total'	=> '0',
-							'month'	 	=> $month['month'],
-							'year'	 	=> $month['year'],
-							'tstamp'	=> mktime(0, 0, 0, $month['month'], 1, $month['year']));
-					}
-					
-					$arData[0]['records'][$index]['label'] = date_i18n('F', mktime(0, 0, 0, $month['month'], 1, $month['year'])).' '.$month['year'];
-					$arData[0]['records'][$index]['tick'] = date_i18n('M', mktime(0, 0, 0, $month['month'], 1, $month['year']));
-					
-				}
-				
-				$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-			}
-			//Jahre rendern
-			else
-			{
-				
-				$arData['template'] = 'all';
-				
-				$arData[0]['min'] = $start;
-				$arData[0]['max'] = $end;
-				
-				$arData[0]['label'] = __('Statistikdaten ', 'wpsg').' '.date('d.m.Y', $start).' - '.date('d.m.Y', $end);
-				
-				$arData[0]['records'] = $this->db->fetchAssoc(" 
-						SELECT 
-							COUNT(*) AS orders,
-							SUM(`price_gesamt`) AS total, 
-							AVG( `price_gesamt` ) AS avg_total,
-							YEAR(`cdate`) AS year,
-							UNIX_TIMESTAMP( `cdate` ) AS tstamp
-						FROM 
-							`".WPSG_TBL_ORDER."`
-						WHERE 
-							".$this->getSqlWhere('validOrder')." AND 
-							`cdate`	>= '".date('Y-m-d 00:00:00', $start)."' AND 
-							`cdate` <= '".date('Y-m-d 23:59:59', $end)."'
-						GROUP BY 
-							year
-						ORDER BY 
-							year ASC
-					   ", "year");
-				
-				foreach ($arYears as $index => $year)
-				{
-					
-					if (!array_key_exists($index, $arData[0]['records']))
-					{
-						
-						$arData[0]['records'][$index] = array(	'orders' 	=> '0',
-							'total'		=> '0',
-							'avg_total'	=> '0',
-							'year'		=> $year['year'],
-							'tstamp'	=> mktime(0, 0, 0, 1, 1, $year['year']));
-						
-					}
-					
-					$arData[0]['records'][$index]['label'] = $year['year'];
-				}
-				
-				$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
-				
-			}
-			
-			return $arData;
-			
-		}
-		
+				}	
+				
+				$arData[0]['records'][$index]['label'] = $year['year'];
+			}
+			
+			$this->addSorting($arData[0], $params['order'], ((!wpsg_isSizedString($params['sort']))?'tstamp':$params['sort']));
+
+		}
+		
+		return $arData;
+
 	}
 	
+}
+
+?>
Index: /mods/mod_topseller/wpsg_mod_topseller_widget.class.php
===================================================================
--- /mods/mod_topseller/wpsg_mod_topseller_widget.class.php	(revision 8528)
+++ /mods/mod_topseller/wpsg_mod_topseller_widget.class.php	(revision 5261)
@@ -6,5 +6,5 @@
 		var $id = "wpsg_mod_topseller_widget";
 		
-		function __construct()
+		function wpsg_mod_topseller_widget()
 		{
 
@@ -20,8 +20,5 @@
 	  		$template = false; if (wpsg_isSizedString($settings['wpsg_mod_topseller_template'])) $template = $settings['wpsg_mod_topseller_template'];
 	  		$limit = $GLOBALS['wpsg_sc']->get_option('wpsg_mod_topseller_limit'); if (wpsg_isSizedString($settings['wpsg_mod_topseller_limit'])) $limit = $settings['wpsg_mod_topseller_limit'];
-		    
-            $GLOBALS['wpsg_sc']->view['widget_args'] = $args;
-		    $GLOBALS['wpsg_sc']->view['widget_settings'] = $settings;
-		    
+	  			  		
 			$GLOBALS['wpsg_sc']->callMod('wpsg_mod_topseller', 'renderTopSeller', array($template, $limit));
 	  		
Index: /mods/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php
===================================================================
--- /mods/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php	(revision 8528)
+++ /mods/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php	(revision 5261)
@@ -10,5 +10,5 @@
 		var $id = "wpsg_mod_trustedshops_widget";
 		
-		function __construct()
+		function wpsg_mod_trustedshops_widget()
 		{
 						
@@ -24,8 +24,5 @@
 	  		$GLOBALS['wpsg_sc']->view['widget'] = &$this;	  		
   			$GLOBALS['wpsg_sc']->view['siegelURL'] = $GLOBALS['wpsg_sc']->callMod('wpsg_mod_trustedshops', 'getSiegelURL');
-
-            $GLOBALS['wpsg_sc']->view['widget_args'] = $args;
-		    $GLOBALS['wpsg_sc']->view['widget_settings'] = $settings;
-
+	  		$GLOBALS['wpsg_sc']->view['settings'] = $settings;
 	  		$GLOBALS['wpsg_sc']->render(WPSG_PATH_VIEW.'/mods/mod_trustedshops/widget.phtml');
 	  		
Index: /mods/wpsg_mod_abo.class.php
===================================================================
--- /mods/wpsg_mod_abo.class.php	(revision 8528)
+++ /mods/wpsg_mod_abo.class.php	(revision 5261)
@@ -3,68 +3,33 @@
 	/**
 	 * Erlaubt den Verkauf von Abos
-	 * @author Daschmi
+	 * @author Daschmi 
 	 */
-	class wpsg_mod_abo extends wpsg_mod_basic {
-
+	class wpsg_mod_abo extends wpsg_mod_basic
+	{
+		
 		var $lizenz = 1;
 		var $id = 1630;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=3292';
 		var $version = "9.9.9";
-
-		const CONFIG = '-1';
-
-		const EXPIRE_NONE = '0';
-        const EXPIRE_MAIL = '1';
-        const EXPIRE_AUTO = '2';
-
-        const CUSTOMER_AUTO_NOTHING = '0'; // Kunde kann im Frontend nicht auf die automatische VerlÃ€ngeurng eingreifen
-        const CUSTOMER_AUTO_DIRECT = '1'; // Kunde kann die automatische VerlÃ€ngerung direkt stoppen
-        const CUSTOMER_AUTO_MAIL = '2'; // Kunde kann die automatische VerlÃ€ngerung ÃŒber eine Mail an den Admin stoppen
-
-        const STATUS_ACTIVE = '0'; // Standard
-        const STATUS_STOPPED = '1'; // Abo ist gestoppt, es erfolgt keine manuelle oder automatische VerlÃ€ngerung
-
+		
 		/**
 		 * Costructor
 		 */
-		public function __construct() {
-
+		public function __construct()
+		{
+								
 			parent::__construct();
-
+								
 			$this->name = __('AboProdukte', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht den Verkauf von Abo Produkten', 'wpsg');
-
+		
 		} // public function __construct()
-
-        public function init() {
-
-            // Option gab es frÃŒher nicht und wird hier auf den Default Wert korrigiert.
-            if ($this->shop->get_option('wpsg_mod_abo_expiremode') === false) $this->shop->update_option('wpsg_mod_abo_expiremode', self::EXPIRE_MAIL);
-
-            require_once WPSG_PATH_MOD.'/mod_abo/wpsg_abo.php';
-
-			$role_object = get_role('administrator');
-			$role_object->add_cap('wpsg_abo');
-
-        } // public function init()
-
-        public function admin_setcapabilities() {
-
-        	$this->render(WPSG_PATH_VIEW.'/mods/mod_abo/admin_setcapabilities.phtml');
-
-        } // public function admin_setcapabilities()
-
-		public function install() {
-
+		
+		public function install()
+		{
+			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
-			// Grundeinstellung Pro Seite
-			if ($this->shop->get_option('wpsg_mod_abo_perpage') === false || $this->shop->get_option('wpsg_mod_abo_perpage') == '') {
-
-				$this->shop->update_option('wpsg_mod_abo_perpage', '20');
-
-			}
-
+			
 			/**
 			 * Produkttabelle erweitern
@@ -77,7 +42,7 @@
 				wpsg_mod_abo_url varchar(500) NOT NULL
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+				
 			dbDelta($sql);
-
+			
 			/**
 			 * Abo Tabelle anlegen
@@ -86,570 +51,264 @@
 				id mediumint(9) NOT NULL AUTO_INCREMENT,
 	  			cdate datetime NOT NULL,
-				order_id int(11) NOT NULL,
-				order_product_id int(11) NOT NULL, 
+				order_id int(11) NOT NULL,				
+				product_key varchar(255) NOT NULL,
 				expiration DATETIME NOT NULL,
-				inform_expiration int(1) DEFAULT '0' NOT NULL,
-				inform_autorenew int(1) DEFAULT '0' NOT NULL COMMENT 'Auf 1 wenn die Mail X-Tage vor verlÃ€ngerung gesendet wurde',
-				rebuy int(11) DEFAULT '0' NOT NULL,
-				status int(1) DEFAULT '0' NOT NULL,
-				mail_admin_stop DATETIME NOT NULL COMMENT 'Wird auf 1 gesetzt, wenn der Admin das Abo stoppen soll',
-				product_key VARCHAR(255) NOT NULL COMMENT 'Deprecated, wird aber wegen AbwÃ€rtskompatibilitÃ€t noch gebraucht',
+				inform_expiration int(1) DEFAULT '0' NOT NULL,	
+				rebuy int(11) DEFAULT '0' NOT NULL,					  
 				PRIMARY KEY  (id),
-	  			KEY order_id (order_id), 
-				KEY order_product_id (order_product_id)
+	  			KEY order_id (order_id),
+				KEY product_key (product_key)
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+			
 			dbDelta($sql);
-
+			
 			/**
 			 * Bestelltabelle erweitern um bei Folgebestellungen zu wissen welche die Originalbestellung ist
-			 */
+			 */			
 			$sql = "CREATE TABLE ".WPSG_TBL_ORDER." (
 				wpsg_mod_abo_origin_order int(11) NOT NULL,
 				KEY wpsg_mod_abo_origin_order (wpsg_mod_abo_origin_order)
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+			
 			dbDelta($sql);
-
+			
 			$this->shop->checkDefault('wpsg_wpsgmodabofirstbuy_betreff', __('Sie haben erfolgreich ein Abo erworben', 'wpsg'));
 			$this->shop->checkDefault('wpsg_wpsgmodaboexpiration_betreff', __('Ihr Abo ist ausgelaufen', 'wpsg'));
 			$this->shop->checkDefault('wpsg_wpsgmodabrebuy_betreff', __('Ihr Abo ist verlÃ€ngert worden', 'wpsg'));
-
+			
 			$this->shop->checkDefault('wpsg_mod_abo_wpsgmodabofirstbuy', '1');
+			$this->shop->checkDefault('wpsg_mod_abo_wpsgmodaboexpiration', '1');
 			$this->shop->checkDefault('wpsg_mod_abo_wpsgmodabrebuy', '1');
-
+			
 		} // public function install()
-
-        public function delOrder($order_id) {
-
-            // Alle Abo-Produkte zu dieser Bestellung in der Tabelle WP_WPSG_ABO lÃ¶schen
-            $this->db->Query("DELETE FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' ");
-
-        } // public function delOrder($order_id)
-
-		/**
-		 * Ãbersicht ÃŒber die Kunden im Backend
-		 */
-		private function be_indexAction() {
-
-			if (isset($_REQUEST['submit-button'])) wpsg_checkNounce('Abo', 'index', ['search' => '1']);
-
-			$nPerPage = $this->shop->get_option('wpsg_mod_abo_perpage');
-			if ($nPerPage <= 0) $nPerPage = 10;
-
-			$this->shop->view['hasFilter'] = false;
-			$this->shop->view['pages'] = 0;
-			$this->shop->view['arState'] = [];
-			$this->shop->view['arFilter'] = array(
-                'order' => 'cdate',
-                'ascdesc' => 'DESC',
-                'page' => '1'
-			);
-
-			if (isset($_REQUEST['filter']['s'])) $this->shop->view['arFilter']['s'] = sanitize_text_field($_REQUEST['filter']['s']);
-            if (isset($_REQUEST['filter']['k_id'])) $this->shop->view['arFilter']['k_id'] = sanitize_text_field($_REQUEST['filter']['k_id']);
-            if (isset($_REQUEST['filter']['cdate_m'])) $this->shop->view['arFilter']['cdate_m'] = intval($_REQUEST['filter']['cdate_m']);
-            if (isset($_REQUEST['filter']['cdate_y'])) $this->shop->view['arFilter']['cdate_y'] = intval($_REQUEST['filter']['cdate_y']);
-            if (isset($_REQUEST['filter']['enddate_m'])) $this->shop->view['arFilter']['enddate_m'] = intval($_REQUEST['filter']['enddate_m']);
-            if (isset($_REQUEST['filter']['enddate_y'])) $this->shop->view['arFilter']['enddate_y'] = intval($_REQUEST['filter']['enddate_y']);
-            if (isset($_REQUEST['filter']['order'])) $this->shop->view['arFilter']['order'] = $_REQUEST['filter']['order'];
-            if (isset($_REQUEST['filter']['ascdesc'])) $this->shop->view['arFilter']['ascdesc'] = $_REQUEST['filter']['ascdesc'];
-            if (wpsg_isSizedInt($_REQUEST['filter']['status'])) $this->shop->view['arFilter']['state'] = intval($_REQUEST['filter']['status']);
-
-            $filter_state = $this->shop->view['arFilter'];
-            unset($filter_state['state']);
-
-            $this->shop->view['arState'][0] = [
-                'label' => __('Alle', 'wpsg'),
-                'count' => wpsg_abo::count($filter_state)
-            ];
+		
+		public function settings_edit() 
+		{
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+						
+			$this->shop->update_option('wpsg_mod_abo_url', $_REQUEST['wpsg_mod_abo_url']);
+			
+			$this->shop->update_option('wpsg_mod_abo_wpsgmodabofirstbuy', $_REQUEST['wpsg_mod_abo_wpsgmodabofirstbuy']);
+			$this->shop->update_option('wpsg_mod_abo_wpsgmodaboexpiration', $_REQUEST['wpsg_mod_abo_wpsgmodaboexpiration']);
+			$this->shop->update_option('wpsg_mod_abo_wpsgmodabrebuy', $_REQUEST['wpsg_mod_abo_wpsgmodabrebuy']);
+			
+		} // public function settings_save()
+		
+		public function produkt_edit_content(&$product_data)
+		{
  
-			foreach (wpsg_abo::$arState as $state_key => $state_label) {
-
-			    $filter_state = $this->shop->view['arFilter'];
-			    $filter_state['state'] = intval($state_key);
-				
-			    $count = wpsg_abo::count($filter_state);
-				
-			    if ($count > 0) {
-
-			        $this->shop->view['arState'][$state_key] = [
-                        'label' => $state_label,
-                        'count' => wpsg_abo::count($filter_state)
-                    ];
-
-                }
-
-            } 
-
-			$this->shop->view['countAll'] = wpsg_abo::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = $_REQUEST['seite'];
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if (!isset($this->shop->view['arFilter']['page']) || $this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['order']['arFilter'] = $this->shop->view['arFilter'];
-
-			$this->shop->view['arData'] = wpsg_abo::find($this->shop->view['arFilter']);
-			
-			$this->shop->view['cdate_years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`cdate`, '%Y') FROM `".WPSG_TBL_ORDER."` ORDER BY `cdate` ASC ");
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/index.phtml');
-
-		} // private function be_indexAction()
-
-		public function dispatch() {
-
-		    if (wpsg_isSizedString($_REQUEST['action'], 'delete')) {
-
-		        $abo_id = intval($_REQUEST['abo_id']);
-
-                $this->db->Query("DELETE FROM `".WPSG_TBL_ABO."` WHERE `id` = '".wpsg_q($abo_id)."' ");
-
-                $this->shop->addBackendMessage(__('Abo erfolgreich gelÃ¶scht.', 'wpsg'));
-                $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Abo');
-
-            }
-
-			$this->be_indexAction();
-
-		} // public function dispatch()
-
-		public function wpsg_add_pages($default_page)
-		{
-
-			add_submenu_page($default_page, __("Aboverwaltung", "wpsg"), __("Aboverwaltung", "wpsg"), 'wpsg_abo', 'wpsg-Abo', array($this, 'dispatch'));
-
-		} // public function wpsg_add_pages()
-
-		public function settings_edit()
-		{
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/settings_edit.phtml');
-
-		} // public function settings_edit()
-
-		public function settings_save() {
-
-			$this->shop->update_option('wpsg_mod_abo_url', $_REQUEST['wpsg_mod_abo_url'], false, false, WPSG_SANITIZE_URL);
-			$this->shop->update_option('wpsg_mod_abo_perpage', $_REQUEST['wpsg_mod_abo_perpage'], false, false, WPSG_SANITIZE_INT);
-
-			$this->shop->update_option('wpsg_mod_abo_wpsgmodabofirstbuy', $_REQUEST['wpsg_mod_abo_wpsgmodabofirstbuy'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_abo_wpsgmodabrebuy', $_REQUEST['wpsg_mod_abo_wpsgmodabrebuy'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_abo_expiremode', $_REQUEST['wpsg_mod_abo_expiremode'], false, false, WPSG_SANITIZE_VALUES, [wpsg_mod_abo::EXPIRE_NONE, wpsg_mod_abo::EXPIRE_AUTO, wpsg_mod_abo::EXPIRE_MAIL]);
-			$this->shop->update_option('wpsg_mod_abo_premode', $_REQUEST['wpsg_mod_abo_premode'], false, false, WPSG_SANITIZE_VALUES, [wpsg_mod_abo::EXPIRE_NONE, wpsg_mod_abo::EXPIRE_AUTO, wpsg_mod_abo::EXPIRE_MAIL]);
-
-			$this->shop->update_option('wpsg_mod_abo_autoexpire_payment', $_REQUEST['wpsg_mod_abo_autoexpire_payment'], false, false, WPSG_SANITIZE_VALUES, array_merge(['origin'], array_keys($this->shop->arPayment)));
-			$this->shop->update_option('wpsg_mod_abo_autoexpire_customermail', $_REQUEST['wpsg_mod_abo_autoexpire_customermail'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_abo_autoexpire_adminmail', $_REQUEST['wpsg_mod_abo_autoexpire_adminmail'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_abo_autoexpire_customer', $_REQUEST['wpsg_mod_abo_autoexpire_customer'], false, false, WPSG_SANITIZE_VALUES, [wpsg_mod_abo::CUSTOMER_AUTO_DIRECT, wpsg_mod_abo::CUSTOMER_AUTO_MAIL, wpsg_mod_abo::CUSTOMER_AUTO_NOTHING]);
-			$this->shop->update_option('wpsg_mod_abo_autoexpire_informationtime', wpsg_xss($_REQUEST['wpsg_mod_abo_autoexpire_informationtime']), false, false, WPSG_SANITIZE_TEXTFIELD);
-
-		} // public function settings_save()
-
-		public function product_getPrice(&$oProduct, &$price_netto, &$price_brutto, $product_key, $amount, $weight) {
-
-			if (preg_match('/^abo_\d+\_\d+$/', $product_key)) {
-
-				$arKey = explode('_', $product_key);
-				$oOrderProduct = wpsg_order_product::getInstance(intval($arKey[2]));
-
-				if ($this->shop->getBackendTaxview() === WPSG_NETTO) {
-
-					$price_netto = $oOrderProduct->getProduct()->__get('wpsg_mod_abo_price');
-					$price_brutto = wpsg_calculatePreis($price_netto, WPSG_BRUTTO, $this->shop->getDefaultCountry()->getTax($oOrderProduct->getProduct()->mwst_key));
-
-				} else {
-
-					$price_brutto = $oOrderProduct->getProduct()->__get('wpsg_mod_abo_price');
-					$price_netto = wpsg_calculatePreis($price_brutto, WPSG_NETTO, $this->shop->getDefaultCountry()->getTax($oOrderProduct->getProduct()->mwst_key));
-
-				}
-
-			}
-
-		}
-
-		public function product_addedit_content(&$product_content, &$product_data) {
-
-			if (!wpsg_isSizedInt($product_data['id']) || isset($_REQUEST['wpsg_lang'])) return false;
-
+			if (isset($_REQUEST['wpsg_lang'])) return false;
+			
 			if ($product_data['wpsg_mod_abo_resell'] > 0)
 			{
-
+				
 				$product_data['wpsg_mod_abo_resell_count'] = $product_data['wpsg_mod_abo_resell'];
 				$product_data['wpsg_mod_abo_resell'] = 1;
-
+								
 			}
 			else
 			{
-
+				
 				$product_data['wpsg_mod_abo_resell_count'] = '1';
 				$product_data['wpsg_mod_abo_resell'] = 0;
-
-			}
-
+				
+			}
+			
 			$this->shop->view['product'] = $product_data;
-
-		    $oProduct = wpsg_product::getInstance($product_data['id']);
-
-            $this->shop->view['product']['wpsg_mod_abo_expiremode'] = $oProduct->getMeta('wpsg_mod_abo_expiremode', false, wpsg_mod_abo::CONFIG);
-            $this->shop->view['product']['wpsg_mod_abo_premode'] = $oProduct->getMeta('wpsg_mod_abo_premode', false, wpsg_mod_abo::CONFIG);
-            $this->shop->view['product']['wpsg_mod_abo_autoexpire_payment'] = $oProduct->getMeta('wpsg_mod_abo_autoexpire_payment', false, wpsg_mod_abo::CONFIG);
-            $this->shop->view['product']['wpsg_mod_abo_autoexpire_customermail'] = $oProduct->getMeta('wpsg_mod_abo_autoexpire_customermail', false, wpsg_mod_abo::CONFIG);
-            $this->shop->view['product']['wpsg_mod_abo_autoexpire_adminmail'] = $oProduct->getMeta('wpsg_mod_abo_autoexpire_adminmail', false, wpsg_mod_abo::CONFIG);
-            $this->shop->view['product']['wpsg_mod_abo_autoexpire_informationtime'] = $oProduct->getMeta('wpsg_mod_abo_autoexpire_informationtime', false, '');
-            $this->shop->view['product']['wpsg_mod_abo_autoexpire_customer'] = $oProduct->getMeta('wpsg_mod_abo_autoexpire_customer', false, wpsg_mod_abo::CONFIG);
-
-			$product_content['wpsg_mod_abo'] = array(
-					'title' => __('Abo', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/produkt_addedit_content.phtml', false)
-			);
-
-		} // public function product_addedit_content(&$product_content, &$produkt_data)
-
-		public function produkt_save_before(&$product_data) {
-
+						
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/produkt_edit_content.phtml');
+			
+		} // public function produkt_edit_content(&$produkt_data)
+		
+		public function produkt_save_before(&$product_data)
+		{
+			
 			if (isset($_REQUEST['wpsg_lang'])) return false;
-
-			if (isset($_REQUEST['wpsg_mod_abo_activ']) && $_REQUEST['wpsg_mod_abo_activ'] == '1') {
-
+			
+			if (isset($_REQUEST['wpsg_mod_abo_activ']) && $_REQUEST['wpsg_mod_abo_activ'] == '1')
+			{
+				
 				$product_data['wpsg_mod_abo_activ'] = '1';
-
-				wpsg_checkRequest('wpsg_mod_abo_price', [WPSG_SANITIZE_FLOAT], __('Abo Produkt / Abo Preis', 'wpsg'), $product_data);
-				wpsg_checkRequest('wpsg_mod_abo_durration', [WPSG_SANITIZE_INT], __('Abo Produkt / Abo Dauer', 'wpsg'), $product_data);
-				wpsg_checkRequest('wpsg_mod_abo_url', [WPSG_SANITIZE_URL], __('Abo Produkt / URL Benachrichtigung', 'wpsg'), $product_data);
-
-				if ($_REQUEST['wpsg_mod_abo_resell'] == '1') {
-
-					if ($_REQUEST['wpsg_mod_abo_resell_count'] <= 0) {
-
+				$product_data['wpsg_mod_abo_price'] = wpsg_tf($_REQUEST['wpsg_mod_abo_price']);
+				$product_data['wpsg_mod_abo_durration'] = $_REQUEST['wpsg_mod_abo_durration'];
+				$product_data['wpsg_mod_abo_url'] = $_REQUEST['wpsg_mod_abo_url'];
+				
+				if ($_REQUEST['wpsg_mod_abo_resell'] == '1')
+				{
+					
+					if ($_REQUEST['wpsg_mod_abo_resell_count'] <= 0)
+					{
+						
 						$this->shop->addBackendError(__('UngÃŒltige Anzahl von zulÃ€ssigen AbokÃ€ufen. Wurde auf unendlich gesetzt.', 'wpsg'));
-
 						$product_data['wpsg_mod_abo_resell'] = '0';
-
-					} else {
-
-						$product_data['wpsg_mod_abo_resell'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_abo_resell_count']));
-
+						
 					}
-
-				} else {
-
+					else
+					{
+					
+						$product_data['wpsg_mod_abo_resell'] = wpsg_q($_REQUEST['wpsg_mod_abo_resell_count']);
+						
+					}
+					
+				}
+				else
+				{
+					
 					$product_data['wpsg_mod_abo_resell'] = '0';
-
-				}
-
-			} else {
-
+					
+				}
+				
+			}
+			else
+			{
+				
 				$product_data['wpsg_mod_abo_activ'] = '0';
-
-			}
-
+				
+			}
+						
 		} // public function produkt_save(&$produkt_id)
-
-        public function produkt_save(&$product_id) {
-
-		    $oProduct = wpsg_product::getInstance($product_id);
-
-		    if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_expiremode'], WPSG_SANITIZE_VALUES, [self::CONFIG, self::EXPIRE_AUTO, self::EXPIRE_MAIL]))
-		        $oProduct->setMeta('wpsg_mod_abo_expiremode', $_REQUEST['wpsg_mod_abo_expiremode']);
-
-		    if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_premode'], WPSG_SANITIZE_VALUES, [self::CONFIG, self::EXPIRE_AUTO, self::EXPIRE_MAIL]))
-		    	$oProduct->setMeta('wpsg_mod_abo_premode', $_REQUEST['wpsg_mod_abo_premode']);
-
-		    if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_autoexpire_payment'], WPSG_SANITIZE_VALUES, array_merge(['origin'], array_keys($this->shop->arPayment)))) $oProduct->setMeta('wpsg_mod_abo_autoexpire_payment', $_REQUEST['wpsg_mod_abo_autoexpire_payment']);
-            if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_autoexpire_customermail'], WPSG_SANITIZE_VALUES, [self::CONFIG, '0', '1'])) $oProduct->setMeta('wpsg_mod_abo_autoexpire_customermail', $_REQUEST['wpsg_mod_abo_autoexpire_customermail']);
-            if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_autoexpire_adminmail'], WPSG_SANITIZE_VALUES, [self::CONFIG, '0', '1'])) $oProduct->setMeta('wpsg_mod_abo_autoexpire_adminmail', $_REQUEST['wpsg_mod_abo_autoexpire_adminmail']);
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_autoexpire_customer'], WPSG_SANITIZE_VALUES, [wpsg_mod_abo::CONFIG, wpsg_mod_abo::CUSTOMER_AUTO_NOTHING, wpsg_mod_abo::CUSTOMER_AUTO_DIRECT, wpsg_mod_abo::CUSTOMER_AUTO_MAIL])) $oProduct->setMeta('wpsg_mod_abo_autoexpire_customer', $_REQUEST['wpsg_mod_abo_autoexpire_customer']);
-		    if (wpsg_checkInput($_REQUEST['wpsg_mod_abo_autoexpire_informationtime'], WPSG_SANITIZE_INT, ['allowEmpty' => true])) $oProduct->setMeta('wpsg_mod_abo_autoexpire_informationtime', $_REQUEST['wpsg_mod_abo_autoexpire_informationtime']);
-
-        }
-
-		public function setAboStatus($order_id, $status_id, $inform)
-		{
-
-			$this->db->UpdateQuery(WPSG_TBL_ABO, array(
-					'status' => $status_id
-			), "`order_id` = '".wpsg_q($order_id)."'");
-
-			$oOrder = wpsg_order::getInstance($order_id);
-			$this->shop->view['stornoDate'] = time();
-
-			$this->shop->view['customer']['vname'] = $oOrder->getInvoiceFirstName();;
-			$this->shop->view['customer']['name'] = $oOrder->getInvoiceName();;
-			$this->shop->view['customer']['email'] = $oOrder->getCustomer()->getEMail();
-
-			$arOrderProducts = $this->getAboProductsFromOrder($order_id);
-
-			foreach ($arOrderProducts as $oOrderProduct)
-			{
-
-				$abo_status = $this->getAboProductStatus($order_id, $oOrderProduct->getProductId());
-
-				if ($inform) $this->sendCustomerMailResign($abo_status);
-
-			}
-
-		}	// public function setAboStatus($order_id, $status_id, $inform)
-
-		public function setOrderStatus($order_id, $status_id, $inform) {
-
-			if ($status_id == 100) {
-
-				// Sind in der Bestellung Abo Produkte?
+		
+		public function setOrderStatus($order_id, $status_id, $inform)
+		{
+			 
+			if ($status_id == 100)
+			{
+				
+				// Sind in der Bestellung Abo Produkte?				
 				$arBasket = $this->shop->cache->loadBasketArray($order_id);
-
-				foreach ($arBasket['produkte'] as $product) {
-
+			  
+				foreach ($arBasket['produkte'] as $product)
+				{
+										
 					$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($product['productkey']));
 
-					if (substr($product['productkey'], 0, 3) == 'abo') {
-
-					    // Kauf einer VerlÃ€ngerung
-                        // Hier ist der Productkey abo_{original_order_id}_{original_order_product_id}
-
+					if (substr($product['productkey'], 0, 3) == 'abo')
+					{
+						
 						// BestellID der OriginalBestellung
 						$order_base_id = $this->getOrderIDFromKey($product['productkey']);
-						$order_product_id = $this->getOrderProductIDFromKey($product['productkey']);
-
+						
 						// Eine Abo VerlÃ€ngerung wurde gekauft
-						$abo_entry = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_base_id)."' AND `order_product_id` = '".wpsg_q($order_product_id)."'");
-
-						if ($abo_entry['id'] <= 0) throw new \wpsg\Exception(__('Es wurde eine Bestellung auf Zahlung aktzeptiert gesetzt, die eine Abo VerlÃ€ngerung drin hat zu der kein Eintrag existiert', 'wpsg'));
-						if ($product_data['wpsg_mod_abo_resell'] != 0 && $abo_entry['rebuy'] + $product['menge'] > $product_data['wpsg_mod_abo_resell']) throw new \wpsg\Exception('Es wurde eine Bestellung auf Zahlung aktzeptiert gesetzt, das Abo konnte aber nicht verlÃ€ngert werden da es die gÃŒltige Anzahl im Produkt ÃŒberschreibt', __('wpsg'));
-
-						if (strtotime($abo_entry['expiration']) < time()) {
-
+						$abo_entry = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_base_id)."' AND `product_key` = '".wpsg_q($product['productkey'])."'");
+ 
+						if ($abo_entry['id'] <= 0) die($this->shop->throwErrorCode('1630_2'));						
+						if ($product_data['wpsg_mod_abo_resell'] != 0 && $abo_entry['rebuy'] + $product['menge'] > $product_data['wpsg_mod_abo_resell']) die($this->shop->throwErrorCode('1630_3'));
+
+						if (strtotime($abo_entry['expiration']) < time())
+						{
+							
 							// Das Abo ist ausgelaufen
-							$abo_expiration = $this->getAboExpiration($product_data['id'], $product['menge'], time(), true);
-
-						} else {
-
+							$abo_expiration = $this->getAboExpiration($product_data['id'], $product['menge'], time());
+							
+						}
+						else
+						{
+							
 							// Abo wurde verlÃ€ngert und der Zeitraum wird an die alte VerlÃ€ngerung angehÃ€ngt
-							$abo_expiration = $this->getAboExpiration($product_data['id'], $product['menge'], strtotime($abo_entry['expiration']), true);
-
+							$abo_expiration = $this->getAboExpiration($product_data['id'], $product['menge'], strtotime($abo_entry['expiration']));
+							
 						}
-
+						
 						$this->db->UpdateQuery(WPSG_TBL_ABO, array(
 							'rebuy' => wpsg_q($abo_entry['rebuy'] + $product['menge']),
 							'expiration' => $abo_expiration,
-							'inform_expiration' => '0',
-                            'inform_autorenew' => '0'
+							'inform_expiration' => '0'
 						), "`id` = '".wpsg_q($abo_entry['id'])."'");
-
-						$url = $this->getNotifyURL($product_data['id']);
-
-						if (wpsg_isSizedString($url)) {
-
-							$this->shop->notifyURL($url, $product['productkey'], 1, $order_id, 3, array(
-								'typ' => 'abo_rebuy',
-								'abo_baseOrderID' => $order_base_id,
-								'abo_kaufdatum' => date('Y-m-d H:i:s', time()),
-								'abo_expiration' => $abo_expiration,
-							));
-
+						
+						$this->shop->notifyURL($this->getNotifyURL($product_data['id']), $product['productkey'], 1, $order_id, 3, array(
+							'typ' => 'abo_rebuy',
+							'abo_baseOrderID' => $order_base_id, 
+							'abo_kaufdatum' => date('Y-m-d H:i:s', time()),
+							'abo_expiration' => $abo_expiration,
+						));
+
+						if ($inform == true)
+						{
+								
+							// Mail bei Erstkauf
+							$this->sendAboRebuyMail($this->getOrderIDFromKey($product['productkey']), $product['productkey']);
+						
 						}
-
-						if ($inform == true) {
-
-							// Mail bei VerlÃ€ngerung
-							$this->sendAboRebuyMail($this->getOrderIDFromKey($product['productkey']), $order_product_id);
-
-						}
-
-					} else {
-
-						if ($product_data['wpsg_mod_abo_activ'] == '1') {
-
+						
+					}
+					else
+					{
+					
+						if ($product_data['wpsg_mod_abo_activ'] == '1')
+						{
+ 						 
 							// Existiert ein Eintrag in der Abotabelle schon, so wird dieser gelÃ¶scht
-							$abo_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `order_product_id` = '".wpsg_q($product['order_product_id'])."'");
+							$abo_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `product_key` = 'abo_".wpsg_q($order_id.'_'.$product['productkey'])."'");
 							if ($abo_id > 0) { $this->db->Query("DELETE FROM `".WPSG_TBL_ABO."` WHERE `id` = '".wpsg_q($abo_id)."'"); }
-
+							
 							// Es ist ein Abo Produkt in der Bestellung
-							$abo_expiration = $this->getAboExpiration($product_data['id'], $product['menge'], time(), true);
-
+							$abo_expiration = $this->getAboExpiration($product_data['id'], $product['menge'], time());
+													
 							$abo_data_db = array(
 								'cdate' => 'NOW()',
 								'order_id' => wpsg_q($order_id),
-								'order_product_id' => wpsg_q($product['order_product_id']),
+								'product_key' => 'abo_'.$order_id.'_'.wpsg_q($product['productkey']),
 								'rebuy' => '0',
 								'expiration' => wpsg_q($abo_expiration),
-								'inform_expiration' => '0'
+								'inform_expiration' => '0'	
 							);
-
+							
 							$this->db->ImportQuery(WPSG_TBL_ABO, $abo_data_db);
-
-							$url = $this->getNotifyURL($product_data['id']);
-
-							if (wpsg_isSizedString($url)) {
-
-								$this->shop->notifyURL($url, $product['productkey'], 1, $order_id, 3, array(
-									'typ' => 'abo_firstbuy',
-									'abo_kaufdatum' => date('Y-m-d H:i:s', time()),
-									'abo_expiration' => $abo_expiration,
-								));
-
+							
+							$this->shop->notifyURL($this->getNotifyURL($product_data['id']), $product['productkey'], 1, $order_id, 3, array(
+								'typ' => 'abo_firstbuy',
+								'abo_kaufdatum' => date('Y-m-d H:i:s', time()),
+								'abo_expiration' => $abo_expiration,							
+							));
+							
+							if ($inform == true)
+							{
+							 
+								// Mail bei Erstkauf
+								$this->sendAboFirstBuyMail($order_id, $product['id']);
+								
 							}
-
-							if ($inform == true) {
-
-								// Mail bei Erstkauf
-								$this->sendAboFirstBuyMail($order_id, $product['order_product_id']);
-
-							}
-
+							
 						}
-
+						
 					}
-
-				}
-
-			}
-
-		}
-
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) {
-
-			if (!$finish_order) return;
-
-			foreach ($_SESSION['wpsg']['basket'] as $p) {
-
-				if (substr($p['id'], 0, 3) == 'abo')
-				{
-
+					
+				}
+				
+			}
+			
+		} // public function setOrderStatus($order_id, $status_id, $inform)
+		
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
+		{ 
+			
+			if ($finish_order !== true) return;
+			
+			foreach ($arBasket['produkte'] as $product)
+			{
+				
+				if (substr($product['productkey'], 0, 3) == 'abo')
+				{
+					
 					// Ein Abo Produkt wurde gekauft
-					$arAbo = explode('_', $p['id']);
-
-					$db_data['wpsg_mod_abo_origin_order'] = wpsg_q($arAbo[1]);
-
-				}
-
-			}
-
-		}
-
-		public function cron() {
-
-			date_default_timezone_set('Europe/Berlin');
-			
-			$upload_dir = wp_upload_dir();
-			$pid_file = $upload_dir['basedir'].'/wpsg_cron_abo';
-			
-			file_put_contents($upload_dir['basedir'].'/wpsg_cron_abo_log', date('d.m.Y H:i:s').' '.getmypid().' '.$_SERVER['REQUEST_URI'].' '.file_exists($pid_file)."\r\n", FILE_APPEND);
-			
-			if (file_exists($pid_file)) {
-				
-				echo "Cron lÃ€uft seit ".date('d.m.Y H:i:s', intval(file_get_contents($pid_file)))."\r\n";
-				exit;
-				
-			} else {
-				
-				echo "Cron gestartet um ".date('d.m.Y H:i:s')."<br />";
-				
-				file_put_contents($pid_file, time());
-				
-			}
-			
-			ob_end_flush();
-			
-			$t_start = microtime(true);
-			 
-			$checkEndCron = function() use ($t_start, $pid_file) {
-			
-				if (($GLOBALS['wpsg_mod_abo_cron_count']??0) >= intval($_REQUEST['limit']??50)) {
-					
-					$this->shop->update_option('wpsg_mod_abo_cron_lastrun', time());
-					$this->shop->update_option('wpsg_mod_abo_cron_run', '0');
-		
-					unlink($pid_file); 
-					
-					echo "Cron beendet weil Limit (".intval($_REQUEST['limit']??50).") erreicht<br />";
-					exit;
-					
-				}
-				
-			};
-						
-			// Parallele AusfÃŒhrung verhindern
-			//$wpsg_mod_abo_cron_lastrun = intval($this->shop->get_option('wpsg_mod_abo_cron_lastrun'));			
-			//if ($wpsg_mod_abo_cron_lastrun > 0 && $wpsg_mod_abo_cron_lastrun > time() - 120 * 60) return;
-			if (intval($this->shop->get_option('wpsg_mod_abo_cron_run')) === 1) return;			
-			
-			$this->shop->update_option('wpsg_mod_abo_cron_run', 1);
-			$this->shop->update_option('wpsg_mod_abo_cron_start', time());
-			 
-			@ini_set('memory_limit', '2000M');
-			@set_time_limit(60 * 4);
-			
-            //$d1 = date_create('2022-04-20 12:05:00');
-			//$d2 = date_create('2022-04-20 12:00:00'); // NOW
-			//echo " = ".date_diff($d1, $d2)->format('%r%a');
-			//die();
-			
-			$handledAboIDs = [];
-
-			$arAboInformation = $this->db->fetchAssoc("
-                SELECT
-                    A.*
-                FROM
-                    `".WPSG_TBL_ABO."` AS A
-                WHERE
-                    A.`status` = '".wpsg_q(self::STATUS_ACTIVE)."' AND
-                    A.`inform_autorenew` != '1'
-            ");
-
-            foreach ($arAboInformation as $a) {
-
-            	try {
-
-					$oOrderProduct = wpsg_order_product::getInstance(intval($a['order_product_id']));
-
-				} catch (\Exception $e) {
-
-					wpsg_debug($e->getMessage());
-					continue;
-
-				}
-
-                $product_id = $oOrderProduct->getProductId();
-
-                $wpsg_mod_abo_autoexpire_informationtime = intval($this->getSetting('wpsg_mod_abo_autoexpire_informationtime', $product_id)); // Benachrichtigung
-                $interval = intval(date_diff(date_create($a['expiration']), date_create(date('Y-m-d H:i:s')))->format('%r%a')); // Tage bis zum auslaufen
-
-	            // Positiv NOW() > Auslauf
- 	            
-                if ($wpsg_mod_abo_autoexpire_informationtime > 0 && abs($interval) < $wpsg_mod_abo_autoexpire_informationtime && $interval <= 0) {
-
-                    $wpsg_mod_abo_expiremode = $this->getSetting('wpsg_mod_abo_premode', $product_id);
-
-                    if ($wpsg_mod_abo_expiremode === self::EXPIRE_MAIL) {
-
-                        $this->sendAboRenewInformation($a['order_id'], $a['order_product_id']);
-
-                        $this->db->UpdateQuery(WPSG_TBL_ABO, array(
-                            'inform_autorenew' => '1'
-                        ), "`id` = '".wpsg_q($a['id'])."'");
-
-                        $handledAboIDs[] = intval($a['id']);
-
-                    } else if ($wpsg_mod_abo_expiremode === self::EXPIRE_AUTO) {
-						
-						//wpsg_debug("1");
-                    	$this->autoExtendOrder($a['order_id'], $a['order_product_id'], intval($a['id']));
-						$checkEndCron();
-
-                    	$handledAboIDs[] = intval($a['id']);
-
-                    }
-
-                }
-
-            }
- 
+					$arAbo = explode('_', $product['productkey']);
+					
+					$data['wpsg_mod_abo_origin_order'] = wpsg_q($arAbo[1]);
+					
+				}
+				
+			}
+			
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
+		public function cron()
+		{
+			
 			$arAboExpiration = $this->db->fetchAssoc("
 				SELECT
@@ -657,987 +316,298 @@
 				FROM
 					`".WPSG_TBL_ABO."` AS A
-				WHERE
+				WHERE 
 					A.`expiration` < NOW() AND
-					A.`status` = '".wpsg_q(self::STATUS_ACTIVE)."' AND
-					A.`inform_expiration` != '1' 					
+					A.`inform_expiration` != '1'	
 			");
-
-			foreach ($arAboExpiration as $a) {
-
-				if (in_array(intval($a['id']), $handledAboIDs)) continue;
-
-			    $oOrderProduct = wpsg_order_product::getInstance(intval($a['order_product_id']));
-			    $product_id = $oOrderProduct->getProductId();
+			
+			foreach ($arAboExpiration as $a)
+			{
+				
+				$product_id = $this->shop->getProduktID($a['product_key']);
 
 				// URL Benachrichtigung
-				$url = $this->getNotifyURL($product_id);
-
-				if (wpsg_isSizedString($url)) {
-
-					$this->shop->notifyURL($url, $oOrderProduct->getProductKey(), 1, $a['order_id'], 3, array(
-						'typ' => 'abo_expiration',
-						'abo_kaufdatum' => date('Y-m-d H:i:s', time()),
-						'abo_expiration' => $a['expiration']
-					));
-
-				}
-                $wpsg_mod_abo_expiremode = $this->getSetting('wpsg_mod_abo_expiremode', $product_id);
-
-                if ($wpsg_mod_abo_expiremode == self::EXPIRE_AUTO) {
-
-					//wpsg_debug("2");
-                    $this->autoExtendOrder($a['order_id'], $a['order_product_id'], intval($a['id']));
-					$checkEndCron();
-					
-                } else {
-
-				    // Mail mit Benachrichtigung senden
-				    $this->sendAboExpirationMail($a['order_id'], $a['order_product_id']);
-
-                }
-
+				$this->shop->notifyURL($this->getNotifyURL($product_id), $a['product_key'], 1, $a['order_id'], 3, array(
+					'typ' => 'abo_expiration',
+					'abo_kaufdatum' => date('Y-m-d H:i:s', time()),
+					'abo_expiration' => $a['expiration']
+				));
+				
+				// Mail mit Benachrichtigung senden
+				$this->sendAboExpirationMail($a['order_id'], $a['product_key']);
+				
 				// Damit der Cron das nicht stÃ€ndig macht
 				$this->db->UpdateQuery(WPSG_TBL_ABO, array(
 					'inform_expiration' => '1'
 				), "`id` = '".wpsg_q($a['id'])."'");
-
-			}
-
-            $this->shop->update_option('wpsg_mod_abo_cron_lastrun', time());
-			$this->shop->update_option('wpsg_mod_abo_cron_run', '0');
-
-			unlink($pid_file);
-			
-			echo "Cron normal beendet<br />";
-						
-		}
-
+				
+			}
+			
+		} // public function cron()
+		
 		public function admin_emailconf_save()
 		{
-
-			wpsg_saveEMailConfig('wpsgmodabofirstbuy');
-			wpsg_saveEMailConfig('wpsgmodaboexpiration');
-			wpsg_saveEMailConfig('wpsgmodabrebuy');
-            wpsg_saveEMailConfig('wpsgmodaboadminstoprenewal');
-            wpsg_saveEMailConfig('wpsgmodabautoinfo');
-
+				
+			wpsg_saveEMailConfig("wpsgmodabofirstbuy");
+			wpsg_saveEMailConfig("wpsgmodaboexpiration");
+			wpsg_saveEMailConfig("wpsgmodabrebuy");
+			
 		} // public function admin_emailconf_save()
-
-		public function admin_emailconf() {
-
+		
+		public function admin_emailconf()
+		{
+				
 			echo wpsg_drawEMailConfig(
 				'wpsgmodabofirstbuy',
 				__('E-Mail bei erstmaligem Abo Kauf', 'wpsg'),
-				__('Diese Mail bekommt der Kunde beim erstmaligen Kauf eines Abos.', 'wpsg'));
-
+				__('Diese Mail bekommt der Kunde beim erstmaligen Kauf eines Abos.', 'wpsg')); 
+			
 			echo wpsg_drawEMailConfig(
 				'wpsgmodaboexpiration',
 				__('E-Mail bei abgelaufenem Abo', 'wpsg'),
 				__('Diese Mail bekommt der Kunde wenn ein Abo auslÃ€uft mit der MÃ¶glichkeit es zu verlÃ€ngern.', 'wpsg'));
-
+			
 			echo wpsg_drawEMailConfig(
 				'wpsgmodabrebuy',
 				__('E-Mail bei verlÃ€ngertem Abo', 'wpsg'),
 				__('Diese Mail bekommt der Kunde wenn er erfolgreich ein Abo verlÃ€ngert hat.', 'wpsg'));
-
-            echo wpsg_drawEMailConfig(
-                'wpsgmodaboadminstoprenewal',
-                __('E-Mail an Admin wenn Abo angehalten werden soll', 'wpsg'),
-                __('Diese Mail wird verschickt, wenn ein Kunde im Frontend ein Abo anhalten will.', 'wpsg'), true);
-
-            echo wpsg_drawEMailConfig(
-            	'wpsgmodabautoinfo',
-            	__('E-Mail bei Information vor VerlÃ€ngerung', 'wpsg'),
-            	__('Diese Mail erhalten Kunden, bevor ein Abo automatisch verlÃ€ngert wird', 'wpsg'), true);
-
+			 
 		} // public function admin_emailconf()
-
-		public function template_redirect() {
-
+				
+		public function wp_loaded()
+		{
+			
 			if (!isset($_REQUEST['mod']) || $_REQUEST['mod'] != 'wpsg_mod_abo') return false;
-
-			if (!isset($_REQUEST['order_product_id']) || !isset($_REQUEST['order_id'])) {
-
-				throw new \wpsg\Exception(__('Beim VerlÃ€ngerungslink keine BestellID oder ProductKey ÃŒbergeben', 'wpsg'));
+			
+			if (!isset($_REQUEST['product_key']) || !isset($_REQUEST['order_id']))
+			{
+
+				$this->shop->throwErrorCode('1630_1');
 				return false;
-
-			}
-
-			$product_key = 'abo_'.$_REQUEST['order_id'].'_'.$_REQUEST['order_product_id'];
-
-			$oOrderProduct = wpsg_order_product::getInstance($_REQUEST['order_product_id']);
-
+				
+			}
+			
+			//$product_key = 'abo_'.$_REQUEST['order_id'].'_'.$_REQUEST['product_key'];
+			$product_key = $_REQUEST['product_key'];
+			
 			// Kann das Abo verlÃ€ngert werden?
-			$product_data_db = $this->shop->cache->loadProduct($oOrderProduct->getProductId());
-
+			$product_data_db = $this->shop->cache->loadProduct($this->shop->getProduktID($_REQUEST['product_key']));
+			
 			// Wie oft wurde das Abo zu dieser Bestellung bereits verlÃ€ngert?
-			$nAboBuyed = $this->db->fetchOne("SELECT `rebuy` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($_REQUEST['order_id'])."' AND `order_product_id` = '".wpsg_q($_REQUEST['order_product_id'])."'");
-
+			$nAboBuyed = $this->db->fetchOne("SELECT `rebuy` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($_REQUEST['order_id'])."' AND `product_key` = '".wpsg_q($_REQUEST['product_key'])."'");
+									
 			// Ist so ein Abo Produkt schon im Warenkorb?
 			$nDrin = false;
-			
-			if (wpsg_isSizedArray($_SESSION['wpsg']['basket'])) {
-
-				foreach ($_SESSION['wpsg']['basket'] as $p_index => $p) {
-
+			if (wpsg_isSizedArray($_SESSION['wpsg']['basket']))
+			{
+				
+				foreach ($_SESSION['wpsg']['basket'] as $p_index => $p)
+				{
+					
 					if ($p['id'] == $product_key) $nDrin = $p_index;
-
-				}
-
-			}
-
-			if ($nDrin !== false) {
-
-				if ($product_data_db['wpsg_mod_abo_resell'] != '0' && $nAboBuyed + $_SESSION['wpsg']['basket'][$nDrin]['menge'] + 1 >= $product_data_db['wpsg_mod_abo_resell']) {
-
+					
+				}
+				
+			}		
+			
+			if ($nDrin !== false)
+			{
+				
+				if ($product_data_db['wpsg_mod_abo_resell'] != '0' && $nAboBuyed + $_SESSION['wpsg']['basket'][$nDrin]['menge'] + 1 >= $product_data_db['wpsg_mod_abo_resell'])
+				{
+
+					// Abo kann nicht mehr verlÃ€ngert werden
+					$this->shop->addFrontendError(__('Das Abo kann nicht mehr verlÃ€ngert werden. Sie mÃŒssen das Produkt erneut erwerben.', 'wpsg'));					
+					$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
+					
+				}
+							
+				$_SESSION['wpsg']['basket'][$nDrin]['menge'] ++;
+				
+			}
+			else
+			{
+				
+				if ($product_data_db['wpsg_mod_abo_resell'] != '0' && $nAboBuyed + 1 > $product_data_db['wpsg_mod_abo_resell'])
+				{
+				
 					// Abo kann nicht mehr verlÃ€ngert werden
 					$this->shop->addFrontendError(__('Das Abo kann nicht mehr verlÃ€ngert werden. Sie mÃŒssen das Produkt erneut erwerben.', 'wpsg'));
 					$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-
-				}
-
-				$_SESSION['wpsg']['basket'][$nDrin]['menge'] ++;
-
-			} else {
-
-				if ($product_data_db['wpsg_mod_abo_resell'] != '0' && $nAboBuyed + 1 > $product_data_db['wpsg_mod_abo_resell']) {
-
-					// Abo kann nicht mehr verlÃ€ngert werden
-					$this->shop->addFrontendError(__('Das Abo kann nicht mehr verlÃ€ngert werden. Sie mÃŒssen das Produkt erneut erwerben.', 'wpsg'));
-					$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-
-				}
-
+						
+				}
+				
 				if (!wpsg_isSizedArray($_SESSION['wpsg'])) $_SESSION['wpsg'] = array();
 				if (!wpsg_isSizedArray($_SESSION['wpsg']['basket'])) $_SESSION['wpsg']['basket'] = array();
-
+				
 				$_SESSION['wpsg']['basket'][] = array(
 					'menge' => '1',
-					'id' => $product_key,
-                    'product_key' => $product_key
+					'id' => $product_key											
 				);
-
-				$product_data = $this->shop->loadProduktArray($oOrderProduct->getProductId());
-
-				$payment = $this->getSetting('wpsg_mod_abo_autoexpire_payment', $oOrderProduct->getProductId());
-
-				if ($payment === 'origin') {
-
-				    $_SESSION['wpsg']['checkout']['payment'] = $oOrderProduct->getOrder()->getPaymentID();
-
-					/*
-					if (intval($_SESSION['wpsg']['checkout']['payment']) === 20) {
-						
-						$_SESSION['wpsg']['checkout']['mod_autodebit_name'] = $oOrderProduct->getOrder()->__get('mod_autodebit_name');
-						$_SESSION['wpsg']['checkout']['mod_autodebit_blz'] = $oOrderProduct->getOrder()->__get('mod_autodebit_blz');
-						$_SESSION['wpsg']['checkout']['mod_autodebit_bic'] = $oOrderProduct->getOrder()->__get('mod_autodebit_bic');
-						$_SESSION['wpsg']['checkout']['mod_autodebit_inhaber'] = $oOrderProduct->getOrder()->__get('mod_autodebit_inhaber');
-						$_SESSION['wpsg']['checkout']['mod_autodebit_knr'] = $oOrderProduct->getOrder()->__get('mod_autodebit_knr');
-						$_SESSION['wpsg']['checkout']['mod_autodebit_iban'] = $oOrderProduct->getOrder()->__get('mod_autodebit_iban');
-												
-					} 
-					*/
-					
-                } else {
-
-                    $_SESSION['wpsg']['checkout']['payment'] = $payment;
-
-                }
-				
-				$shipping_adress_id = intval($oOrderProduct->getOrder()->__get('shipping_adress_id'));
-				
-				if ($shipping_adress_id > 0) {
-				
-					$row_adress = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($shipping_adress_id)."' ");
-					
-					$_SESSION['wpsg']['checkout']['diff_shippingadress'] = '1';
-					
-					$_SESSION['wpsg']['checkout']['shipping_title'] = $row_adress['title'];
-					$_SESSION['wpsg']['checkout']['shipping_plz'] = $row_adress['plz'];
-					$_SESSION['wpsg']['checkout']['shipping_vname'] = $row_adress['vname'];
-					$_SESSION['wpsg']['checkout']['shipping_name'] = $row_adress['name'];
-					$_SESSION['wpsg']['checkout']['shipping_strasse'] = $row_adress['strasse'];
-					$_SESSION['wpsg']['checkout']['shipping_nr'] = $row_adress['nr'];
-					$_SESSION['wpsg']['checkout']['shipping_ort'] = $row_adress['ort'];
-					$_SESSION['wpsg']['checkout']['shipping_land'] = $row_adress['land'];
-					$_SESSION['wpsg']['checkout']['shipping_firma'] = $row_adress['firma'];
-					$_SESSION['wpsg']['checkout']['shipping_firma'] = $row_adress['firma'];
-						 	  					
-				}
-
+				
+				$product_data = $this->shop->loadProduktArray($this->shop->getProduktID($_REQUEST['product_key']));
+				
 				$this->shop->addFrontendMessage(wpsg_translate(__('Abo VerlÃ€ngerung fÃŒr Produkt #1# eingefÃŒgt', 'wpsg'), $product_data['name']));
-
-			}
-
+				
+			}
+			
 			$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-
-		} // public function template_redirect()
-
-		public function basket_updateProduktFromSession(&$product_index, &$stock) {
-
-            /*
-            $product_id = $_SESSION['wpsg']['basket'][$product_index]['id'];
-
-            $order_id = $this->getOrderIDFromKey($product_key);
-            $product_id = $this->shop->getProduktID($product_key);
-            $product_data = $this->shop->cache->loadProduct($product_id);
-
-            $nAboBuyed = $this->db->fetchOne("SELECT `rebuy` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `product_index` = '".wpsg_q($product_index)."'");
-
-            if ($nAboBuyed + $stock > $product_data['wpsg_mod_abo_resell'] && $product_data['wpsg_mod_abo_resell'] != '0')
-            {
-
-                $this->shop->addFrontendError(__('Abo kann nicht mehr so oft verlÃ€ngert werden!', 'wpsg'));
-                $stock = 0;
-
-            }
-            */
-
+						
+		} // public function wp_loaded()
+		  
+		public function basket_updateProduktFromSession(&$product_index, &$stock)
+		{
+			
+			$product_key = $_SESSION['wpsg']['basket'][$product_index]['id'];
+			
+			$order_id = $this->getOrderIDFromKey($product_key);
+			$product_id = $this->shop->getProduktID($product_key);
+			$product_data = $this->shop->cache->loadProduct($product_id);
+			
+			$nAboBuyed = $this->db->fetchOne("SELECT `rebuy` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `product_key` = '".wpsg_q($produkt_id)."'");
+				
+			if ($nAboBuyed + $stock_neu > $product_data['wpsg_mod_abo_resell'] && $product_data['wpsg_mod_abo_resell'] != '0')
+			{
+			
+				$this->shop->addFrontendError(__('Abo kann nicht mehr so oft verlÃ€ngert werden!', 'wpsg'));
+				$stock = 0;
+			
+			}
+			
 		}
-
+				
+		public function basket_toArray(&$produkt, $backend = false, $noMwSt = false)  
+		{
+			
+			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($produkt['id']));
+			
+			$country = $this->shop->getDefaultCountry();
+			$mwst_value = $country->getTax($product_data['mwst_key']);
+			
+			if (substr($produkt['id'], 0, 3) == 'abo')
+			{
+		 
+				// Produkt im Warenkorb ist eine VerlÃ€ngerung
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+				{
+
+					$produkt['preis_netto'] = $product_data['wpsg_mod_abo_price'];
+					$produkt['preis_brutto'] = wpsg_calculatePreis($product_data['wpsg_mod_abo_price'], WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+						
+					$produkt['preis_netto'] = wpsg_calculatePreis($product_data['wpsg_mod_abo_price'], WPSG_NETTO, $mwst_value);
+					$produkt['preis_brutto'] = $product_data['wpsg_mod_abo_price'];
+						
+				}
+				
+			}
+			
+		} // public function basket_toArray(&$produkt, $backend, $noMwSt)
+		
 		public function basket_row(&$p, $i)
 		{
-
+			
 			if (substr($p['id'], 0, 3) == 'abo')
 			{
-
+								
 				$this->shop->view['wpsg_mod_abo']['order'] = $this->shop->cache->loadOrder($this->getOrderIDFromKey($p['id']));
 				$this->shop->view['wpsg_mod_abo']['product'] = $this->shop->cache->loadProduct($this->shop->getProduktID($p['id']));
 				$this->shop->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge'] = $p['menge'] * $this->shop->view['wpsg_mod_abo']['product']['wpsg_mod_abo_durration'];
-
+				
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/basket_row.phtml');
-
-			}
-
+				
+			}
+			
 		} // public function basket_row(&$p, $i)
-
-		public function overview_row(&$p, $i)
-		{
-
+		
+		public function overview_row(&$p, $i) 
+		{ 
+			
 			if (substr($p['id'], 0, 3) == 'abo')
 			{
-
+			
 				$this->shop->view['wpsg_mod_abo']['order'] = $this->shop->cache->loadOrder($this->getOrderIDFromKey($p['id']));
 				$this->shop->view['wpsg_mod_abo']['product'] = $this->shop->cache->loadProduct($this->shop->getProduktID($p['id']));
 				$this->shop->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge'] = $p['menge'] * $this->shop->view['wpsg_mod_abo']['product']['wpsg_mod_abo_durration'];
-
+			
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/overview_row.phtml');
-
-			}
-
+			
+			}
+			
 		} // public function overview_row(&$p, $i)
-
+		
 		public function mail_row($index, $produkt)
 		{
-
+		
 			if (substr($produkt['id'], 0, 3) == 'abo')
 			{
-
+		
 				$this->shop->view['wpsg_mod_abo']['order'] = $this->shop->cache->loadOrder($this->getOrderIDFromKey($produkt['id']));
 				$this->shop->view['wpsg_mod_abo']['product'] = $this->shop->cache->loadProduct($this->shop->getProduktID($produkt['id']));
-				$this->shop->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge'] = $produkt['menge'] * $this->shop->view['wpsg_mod_abo']['product']['wpsg_mod_abo_durration'];
-
+				$this->shop->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge'] = $p['menge'] * $this->shop->view['wpsg_mod_abo']['product']['wpsg_mod_abo_durration'];
+					
 				if ($this->shop->htmlMail === true)
 				{
-
+					
 					return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_row_html.phtml');
-
+					
 				}
 				else
 				{
-
+				
 					return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_row.phtml');
-
-				}
-
-			}
-
+					
+				}
+		
+			}
+				
 		} // public function mail_row($index, $produkt)
-
-		public function order_view_row(&$p, $i) {
-
-			$this->shop->view['i'] = $i;
-
-			if (substr(wpsg_getStr($p['product_key']), 0, 3) == 'abo') {
-
-				$this->shop->view['wpsg_mod_abo']['order'] = $this->shop->cache->loadOrder($this->getOrderIDFromKey($p['product_key']));
-				$this->shop->view['wpsg_mod_abo']['product'] = $this->shop->cache->loadProduct($this->shop->getProduktID($p['product_key']));
-				$this->shop->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge'] = $p['amount'] * $this->shop->view['wpsg_mod_abo']['product']['wpsg_mod_abo_durration'];
-
+		
+		public function order_view_row(&$p, $i)
+		{
+			
+			if (substr($p['id'], 0, 3) == 'abo')
+			{
+				
+				$this->shop->view['wpsg_mod_abo']['order'] = $this->shop->cache->loadOrder($this->getOrderIDFromKey($p['id']));
+				$this->shop->view['wpsg_mod_abo']['product'] = $this->shop->cache->loadProduct($this->shop->getProduktID($p['id']));
+				$this->shop->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge'] = $p['menge'] * $this->shop->view['wpsg_mod_abo']['product']['wpsg_mod_abo_durration'];
+				
 				return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/order_view_row.phtml');
-
-			} else {
-
-				$product_data = $this->shop->cache->loadProduct($p['product_id']);
-
+				
+			}
+			else
+			{
+				
+				$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($p['id']));
+				
 				if ($product_data['wpsg_mod_abo_activ'] == '1')
 				{
-
-					$this->shop->view['wpsg_mod_abo']['rebuy'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `productkey` LIKE 'abo_".wpsg_q($this->shop->view['data']['id']??'')."_%'");
+					
+					$this->shop->view['wpsg_mod_abo']['rebuy'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `productkey` LIKE 'abo_".wpsg_q($this->shop->view['data']['id'])."_%'");
 
 					foreach ($this->shop->view['wpsg_mod_abo']['rebuy'] as $k => $v)
 					{
-
+						
 						$product_data = $this->shop->cache->loadProduct($v['p_id']);
-
+						
 						$this->shop->view['wpsg_mod_abo']['rebuy'][$k]['product'] = $product_data;
 						$this->shop->view['wpsg_mod_abo']['rebuy'][$k]['order'] = $this->shop->cache->loadOrder($v['o_id']);
 						$this->shop->view['wpsg_mod_abo']['rebuy'][$k]['tage'] = $v['menge'] * $product_data['wpsg_mod_abo_durration'];
-
+						
 					}
-
+					
 					return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/order_view_base.phtml');
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 		} // public function order_view_row(&$p, $i)
-
-        public function be_ajax() {
-
-            $action = $_REQUEST['subaction'].'Action';
-
-            $this->$action();
-
-        } // public function be_ajax()
-
-        public function order_view($order_id, &$arSidebarArray)  {
-
-            if ($this->isAboOrder($order_id) === 1) {
-
-                $this->shop->view['arOrderedAboProducts'] = $this->getAboProductsFromOrder($order_id);
-                $this->shop->view['wpsg_mod_abo'] = [
-                    'oOrder' => wpsg_order::getInstance(intval($order_id))
-                ];
-
-                $arSidebarArray['abo'] = [
-                    'title' => _('Abo Produkte'),
-                    'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/order_view.phtml', false)
-                ];
-
-            }
-
-        } // public function order_view($order_id, &$arSidebarArray)
- 
-        public function order_ajax() {
-
-	        $_REQUEST['edit_id'] = intval($_REQUEST['edit_id']);
-	        $_REQUEST['order_product_id'] = intval($_REQUEST['order_product_id']);
-
-            if (wpsg_isSizedString($_REQUEST['do'], 'run')) {
-
-                $oOrderProduct = wpsg_order_product::getInstance($_REQUEST['order_product_id']);
-
-                $abo_status = $this->getAboProductStatus($_REQUEST['edit_id'], $_REQUEST['order_product_id']);
-                $bNotify = $this->startRenewal($abo_status);
-                $product_id = $oOrderProduct->getProductId();
-                $wpsg_mod_abo_expiremode = $this->getSetting('wpsg_mod_abo_expiremode', $product_id);
-
-                if ($wpsg_mod_abo_expiremode === self::EXPIRE_AUTO) $this->shop->addBackendMessage(__('Wenn das Abo auslÃ€uft, wird wieder automatisch eine Bestellung ausgelÃ¶st.', 'wpsg'));
-                else if ($wpsg_mod_abo_expiremode === self::EXPIRE_MAIL) $this->shop->addBackendMessage(__('Wenn das Abo auslÃ€uft, wird dem Kunden wieder die MÃ¶glichkeit gegeben mit einer neuen Bestellung das Abo zu verlÃ€ngern.', 'wpsg'));
-
-                if ($bNotify) $this->shop->addBackendMessage(__('URL Benachrichtigung ausgelÃ¶st. (type=abo_status_started)', 'wpsg'));
-
-                $this->shop->redirect(
-                    wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']])
-                );
-
-            } else if (wpsg_isSizedString($_REQUEST['do'], 'stop')) {
-
-                $oOrderProduct = wpsg_order_product::getInstance($_REQUEST['order_product_id']);
-
-                $abo_status = $this->getAboProductStatus($_REQUEST['edit_id'], $_REQUEST['order_product_id']);
-                $bNotify = $this->stopRenewal($abo_status);
-                $product_id = $oOrderProduct->getProductId();
-                $wpsg_mod_abo_expiremode = $this->getSetting('wpsg_mod_abo_expiremode', $product_id);
-
-                if ($wpsg_mod_abo_expiremode === self::EXPIRE_AUTO) $this->shop->addBackendMessage(__('Wenn das Abo auslÃ€uft, wird keine Bestellung mehr ausgelÃ¶st.', 'wpsg'));
-                else if ($wpsg_mod_abo_expiremode === self::EXPIRE_MAIL) $this->shop->addBackendMessage(__('Wenn das Abo auslÃ€uft, wird dem Kunden keine MÃ¶glichkeit gegeben mit einer neuen Bestellung das Abo zu verlÃ€ngern.', 'wpsg'));
-
-                if ($bNotify) $this->shop->addBackendMessage(__('URL Benachrichtigung ausgelÃ¶st. (type=abo_status_stopped)', 'wpsg'));
-
-                $this->shop->redirect(
-                    wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id']])
-                );
-
-            }
-
-        }
-
-        public function wpsg_mod_export_loadFields(&$arFields) {
-
-            $arFields[10]['fields']['wpsg_mod_abo_starttime'] = __('Abo Startzeit', 'wpsg');
-            $arFields[10]['fields']['wpsg_mod_abo_runningtime'] = __('Abo Laufzeit', 'wpsg');
-            $arFields[10]['fields']['wpsg_mod_abo_price'] = __('Abo Kosten VerlÃ€ngerung', 'wpsg');
-            $arFields[10]['fields']['wpsg_mod_abo_duration'] = __('Abo Dauer (Tage)', 'wpsg');
-
-        }
-
-        public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-
-            if (!in_array($field_value, ['wpsg_mod_abo_runningtime', 'wpsg_mod_abo_starttime', 'wpsg_mod_abo_price', 'wpsg_mod_abo_duration'])) return;
-
-            $return = '';
-
-            $abo_order = $this->isAboOrder($o_id);
-            $abo_order_id = 0;
-			
-			$oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-			
-			$product_key = $oOrderProduct->getProductKey();
-
-            if ($abo_order === false) return;
-            else if ($abo_order === 1) $abo_order_id = $o_id;
-            else if ($abo_order === 2) $abo_order_id = $this->getOriginOrder($o_id);
-
-            $arAboProducts = $this->getAboProductsFromOrder($abo_order_id);
-            $arProductExportKeys = [];
-
-            if (wpsg_isSizedInt($p_id)) {
-
-                /** @var \wpsg_order_product $oOrderProduct */
-                foreach ($arAboProducts as $oOrderProduct) {
-
-                    if ($oOrderProduct->getProductKey() == $product_key) {
-
-                        $arProductExportKeys[] = $product_key;
-
-                    }
-
-                }
-
-            } else {
-
-                /** @var \wpsg_order_product $oOrderProduct */
-                foreach ($arAboProducts as $oOrderProduct) {
-
-                    $arProductExportKeys[] = $oOrderProduct->getProductKey();
-
-                }
-
-            }
-
-            if (wpsg_isSizedArray($arProductExportKeys)) {
-
-                if ($field_value === 'wpsg_mod_abo_runningtime') {
-
-                    foreach ($arProductExportKeys as $product_key) {
-
-                        $abo_info = $this->getAboProductStatus($abo_order_id, $product_key);
-
-                        $arReturn[] = wpsg_fromDate($abo_info['expiration']);
-
-                    }
-
-                    $return = implode(',', $arReturn);
-
-                } else if ($field_value === 'wpsg_mod_abo_starttime') {
-
-                    foreach ($arProductExportKeys as $product_key) {
-
-                        $abo_info = $this->getAboProductStatus($abo_order_id, $product_key);
-
-                        $arReturn[] = wpsg_fromDate($abo_info['cdate']);
-
-                    }
-
-                    $return = implode(',', $arReturn);
-
-                } else if ($field_value === 'wpsg_mod_abo_price') {
-
-                    foreach ($arProductExportKeys as $product_key) {
-
-                        $oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-
-                        $arReturn[] = wpsg_ff($oProduct->wpsg_mod_abo_price);
-
-                    }
-
-                    $return = implode(',', $arReturn);
-
-                } else if ($field_value === 'wpsg_mod_abo_duration') {
-
-                    foreach ($arProductExportKeys as $product_key) {
-
-                        $oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-
-                        $arReturn[] = $oProduct->wpsg_mod_abo_durration;
-
-                    }
-
-                    $return = implode(',', $arReturn);
-
-                }
-
-            }
-
-        }
-
+		
 		/** Modulfunktionen */
-
-        public function getSetting($key, $product_id = null) {
-
-            if ($product_id !== null) {
-
-                $oProduct = wpsg_product::getInstance($product_id);
-
-                $meta_value = $oProduct->getMeta($key, false, self::CONFIG);
-
-                if ($meta_value !== self::CONFIG) return $meta_value;
-
-            }
-
-            return $this->shop->get_option($key);
-
-        }
-
-		private function resetCronAction() {
-			
-			$this->shop->update_option('wpsg_mod_abo_cron_run', false);
-			
-			$upload_dir = wp_upload_dir();
-			$pid_file = $upload_dir['basedir'].'/wpsg_cron_abo';
-			
-			unlink($pid_file);
-			
-			$this->shop->addBackendMessage(__('CRON ZurÃŒckgesetzt.', 'wpsg'));
-			
-			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_abo');
-			
-		}
-		
-        private function admin_inlineEditAction() {
-
-            $order_id = intval($_REQUEST['order_id']);
-            $order_product_id = intval($_REQUEST['order_product_id']);
-            $tDate = strtotime($_REQUEST['date']);
-
-            if ($tDate <= 0) throw new \wpsg\Exception(__('Kein Datum ÃŒbergeben.', 'wpsg'));
-
-            $tDate += (3600 * get_option('gmt_offset')); // TODO: KlÃ€ren warum das nicht richtig von x-editable geparsed wird, find es jetzt nicht
-
-            $this->db->UpdateQuery(WPSG_TBL_ABO, [
-                'expiration' => wpsg_q(date('Y-m-d H:i:s', $tDate))
-            ], " `order_id` = '".wpsg_q($order_id)."' AND `order_product_id` = '".wpsg_q($order_product_id)."' ");
-
-            $oAbo = wpsg_abo::getFromOrderAndOrderProduct($order_id, $order_product_id);
-
-            wpsg_header::JSONData([
-                'state' => $oAbo->getState(),
-                'time' => wpsg_formatTimestamp($tDate)
-            ]);
-
-            exit;
-
-        }
-
-        /**
-         * VerlÃ€ngerung anhalten
-         */
-		private function stopRenewal($abo_status) {
-
-            $this->db->UpdateQuery(WPSG_TBL_ABO, Array('status' => self::STATUS_STOPPED), " `id` = '".wpsg_q($abo_status['id'])."' ");
-
-            $oOrderProduct = wpsg_order_product::getInstance(intval($abo_status['order_product_id']));
-
-            $url = $this->getNotifyURL($oOrderProduct->getProductId());
-
-            if (wpsg_isSizedString($url)) {
-
-                $this->shop->notifyURL($url, $oOrderProduct->getProductKey(), 1, $abo_status['order_id'], 3, array(
-                    'typ' => 'abo_status_stopp',
-                    'abo_baseOrderID' => $abo_status['order_id']
-                ));
-
-                return true;
-
-            }
-
-            $oProduct = $oOrderProduct->getProduct();
-
-            // Protokoll
-            $oOrder = wpsg_order::getInstance($abo_status['order_id']);
-            $oOrder->log(wpsg_translate(__('Abo fÃŒr Produkt #1# wure angehalten.', 'wpsg'), $oProduct->getProductName()), '');
-
-            return false;
-
-        } // private function stopRenewal()
-
-        /**
-         * VerlÃ€ngerung wieder aktivieren
-         */
-        private function startRenewal($abo_status)
-        {
-
-            $this->db->UpdateQuery(WPSG_TBL_ABO, Array(
-                'status' => self::STATUS_ACTIVE,
-                'inform_expiration' => '0'
-            ), " `id` = '".wpsg_q($abo_status['id'])."' ");
-
-            $oOrderProduct = wpsg_order_product::getInstance(intval($abo_status['order_product_id']));
-
-            $url = $this->getNotifyURL($oOrderProduct->getProductId());
-
-            if (wpsg_isSizedString($url))
-            {
-
-                $this->shop->notifyURL($url, $oOrderProduct->getProductKey(), 1, $abo_status['order_id'], 3, array(
-                    'typ' => 'abo_status_started',
-                    'abo_baseOrderID' => $abo_status['order_id']
-                ));
-
-                return true;
-
-            }
-
-            $oProduct = $oOrderProduct->getProduct();
-
-            // Protokoll
-            $oOrder = wpsg_order::getInstance($abo_status['order_id']);
-            $oOrder->log(wpsg_translate(__('Abo fÃŒr Produkt #1# wurde fortgesetzt.', 'wpsg'), $oProduct->getProductName()), '');
-
-            return false;
-
-        } // private function startRenewal($abo_status)
-
-        /**
-         * Frontend: Anhalten von Abo VerlÃ€ngerungen
-         */
-        public function stoprenewalRedirect() {
-
-	        $_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
-            $oOrder = wpsg_order::getInstance($_REQUEST['order_id']);
-
-            // SicherheitsÃŒberprÃŒfung
-            if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id']) || $oOrder->k_id != $_SESSION['wpsg']['checkout']['id']) throw new \wpsg\Exception(__('Nicht angemeldet oder kein Zugriff auf diese Bestellung.', 'wpsg'));
-
-            $arOrderProducts = $this->getAboProductsFromOrder($oOrder->id);
-
-            foreach ($arOrderProducts as $oOrderProduct) {
-
-                $abo_status = $this->getAboProductStatus($oOrder->id, $oOrderProduct->getId());
-
-                if ($oOrderProduct->getProductKey() === $_REQUEST['product_key'] && wpsg_isSizedInt($abo_status['id'])) {
-
-                    $wpsg_mod_abo_autoexpire_customer = $this->getSetting('wpsg_mod_abo_autoexpire_customer', $oOrderProduct->getProductId());
-
-                    // Hier ist alles ok, das Abo kann gestoppt werden
-                    if ($wpsg_mod_abo_autoexpire_customer === wpsg_mod_abo::CUSTOMER_AUTO_DIRECT) {
-
-                        $this->stopRenewal($abo_status);
-
-                        $this->shop->addFrontendMessage(__('Die VerlÃ€ngerung ihres Abos wurde angehalten.', 'wpsg'));
-                        $this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_ABO));
-
-                    }
-                    else if ($wpsg_mod_abo_autoexpire_customer === wpsg_mod_abo::CUSTOMER_AUTO_MAIL)
-                    {
-
-                        try
-                        {
-
-                            $this->sendAdminMailStopRenewal($abo_status);
-
-                            $this->shop->addFrontendMessage(__('Der Administrator wurde informiert und wird die VerlÃ€ngerung ihres Abos veranlassen.', 'wpsg'));
-
-                        }
-                        catch (\wpsg\Exception $ex)
-                        {
-
-                            $this->shop->addFrontendMessage($ex->getMessage());
-
-                        }
-
-                        $this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_ABO));
-
-                    }
-                    else throw new \wpsg\Exception(__('Funktion ist deaktiviert.', 'wpsg'));
-
-                }
-
-            }
-
-            throw new \wpsg\Exception(__('Produkt nicht in Bestellung gefunden.', 'wpsg'));
-
-        } // public function stoprenewalRedirect()
-
-        /**
-         * Sendet eine Mail an den Admin, wenn ein Kunde ein Abo anhalten mÃ¶chte
-         *
-         * @param $abo_status
-         */
-        private function sendAdminMailStopRenewal($abo_status)
-        {
-
-            if (strtotime($abo_status['mail_admin_stop']) > 0) throw new \wpsg\Exception(wpsg_translate(__('Admin wurde bereits am #1# benachrichtigt das Abo zu stoppen.'), wpsg_formatTimestamp($abo_status['mail_admin_stop'], false)));
-
-            $this->db->UpdateQuery(WPSG_TBL_ABO, Array(
-                'mail_admin_stop' => 'NOW()'
-            ), " `id` = '".wpsg_q($abo_status['id'])."' ");
-
-            // Mail senden
-            $this->shop->view['oOrder'] = wpsg_order::getInstance($abo_status['order_id']);
-            $this->shop->view['oCustomer'] = $this->shop->view['oOrder']->getCustomer();
-            $this->shop->view['oProduct'] = wpsg_product::getInstance($abo_status['product_key']);
-            $this->shop->view['product_key'] = $abo_status['product_key'];
-
-            if ($this->shop->get_option('wpsg_htmlmail') === '1') $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_admin_stoprenewal_html.phtml', false);
-            else $mail_html = false;
-
-            $mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_admin_stoprenewal.phtml', false);
-
-            $to = $this->shop->get_option('wpsg_wpsgmodaboadminstoprenewal_empfaenger');
-
-            $oProduct = wpsg_product::getInstance($this->shop->getProduktID($abo_status['product_key']));
-
-            // Protokoll
-            $oOrder = wpsg_order::getInstance($abo_status['order_id']);
-            $oOrder->log(wpsg_translate(__('Mail an Administrator (Abo anhalten)', 'wpsg'), $oProduct->getProductName()), $mail_text);
-
-            $this->shop->sendMail($mail_text, $to, 'wpsgmodaboadminstoprenewal', array(), $abo_status['order_id'], false, $mail_html);
-
-        } // private function sendAdminMailStopRenewal($abo_status)
-
-        /**
-         * Sendet eine Mail an den Kunden, wenn der Admin ein Abo gekÃŒndigt hat
-         *
-         * @param $abo_status
-         */
-        private function sendCustomerMailResign($abo_status)
-        {
-
-        	if (strtotime($abo_status['mail_admin_stop']) > 0) throw new \wpsg\Exception(wpsg_translate(__('Admin wurde bereits am #1# benachrichtigt das Abo zu stoppen.'), wpsg_formatTimestamp($abo_status['mail_admin_stop'], false)));
-
-        	$this->db->UpdateQuery(WPSG_TBL_ABO, Array(
-        			'mail_admin_stop' => 'NOW()'
-        			), " `id` = '".wpsg_q($abo_status['id'])."' ");
-
-        	// Mail senden
-        	$this->shop->view['oOrder'] = wpsg_order::getInstance($abo_status['order_id']);
-        	$this->shop->view['oCustomer'] = $this->shop->view['oOrder']->getCustomer();
-        	$this->shop->view['oProduct'] = wpsg_product::getInstance($abo_status['product_key']);
-        	$this->shop->view['product_key'] = $abo_status['product_key'];
-
-        	if ($this->shop->get_option('wpsg_htmlmail') === '1') $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_storno_html.phtml', false);
-        	else $mail_html = false;
-
-        	$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_storno.phtml', false);
-
-        	//$to = $this->shop->get_option('wpsg_wpsgmodaboadminstoprenewal_empfaenger');
-        	$to = $this->shop->view['customer']['email'];
-
-        	$oProduct = wpsg_product::getInstance($this->shop->getProduktID($abo_status['product_key']));
-
-        	// Protokoll
-        	$oOrder = wpsg_order::getInstance($abo_status['order_id']);
-        	$oOrder->log(wpsg_translate(__('Mail an Kunden (Abo gekÃŒndigt)', 'wpsg'), $oProduct->getProductName()), $mail_text);
-
-        	$this->shop->sendMail($mail_text, $to, 'wpsgmodaboadminresign', array(), $abo_status['order_id'], false, $mail_html);
-
-        } // private function sendCustomerMailResign($abo_status)
-
-        /**
-         * Erstellt automatisch eine Bestellung wenn ein Abo ausgelaufen ist
-         *
-         * @param $order_id
-         * @param $product_key
-         */
-		public function autoExtendOrder($order_id, $order_product_id, $abo_id) {
-		
-		    $oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-            $product_id = $oOrderProduct->getProductId();
-
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					`".WPSG_TBL_ORDERPRODUCT."` AS OP
-						LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON (O.`id` = OP.`o_id`)
-				WHERE
-					OP.`p_id` = '".wpsg_q($product_id)."' AND
-					OP.`productkey` = '".wpsg_q('abo_'.$order_id.'_'.$order_product_id)."' AND
-					O.`payed_date` = '0000-00-00 00:00:00' AND
-					O.`status` != '".wpsg_ShopController::STATUS_STORNIERT."' 					
-			";
-			
-            $order_extend_exist = intval($this->db->fetchOne($strQuery));
-			
-			//wpsg_debug('....');
-			//wpsg_debug("VerlÃ€ngere1: ".$order_id.":".$order_product_id);
-			
-            if ($order_extend_exist > 0) return;
-
-			 $this->shop->view = [];
-			
-			if (isset($_REQUEST['allinkl'])) echo "VerlÃ€ngere Bestellung ".$order_id."<br />"; 
-			else print_r($_REQUEST);
-			
-			$GLOBALS['wpsg_mod_abo_cron_count'] = ($GLOBALS['wpsg_mod_abo_cron_count']??0) + 1; 
-			
-			//wpsg_debug("VerlÃ€ngere1.5: ".$order_id.":".$order_product_id);
-			
-		    if (!is_numeric($product_id)) throw new \Exception(__('Nicht vorgesehen!', 'wpsg'));
-
-            $this->shop->addShipPay();
-
-			//wpsg_debug("VerlÃ€ngere2: ".$order_id.":".$order_product_id);
-			
-            $oOrder = wpsg_order::getInstance($order_id);
-
-			//wpsg_debug("VerlÃ€ngere3: ".$order_id.":".$order_product_id.":".$oOrder->getId());
-		
-            unset($_SESSION['wpsg']['basket']);
-            unset($_SESSION['wpsg']['checkout']);
-
-            $_SESSION['wpsg']['checkout']['id'] = $oOrder->k_id;
-
-            $payment = $this->getSetting('wpsg_mod_abo_autoexpire_payment', $product_id);
-
-            if ($payment === 'origin') {
-
-                $_SESSION['wpsg']['checkout']['payment'] = $oOrderProduct->getOrder()->getPaymentID();
-
-            } else {
-
-                $_SESSION['wpsg']['checkout']['payment'] = $payment;
-
-            }
-
-            $_SESSION['wpsg']['checkout']['shipping'] = $oOrder->type_shipping;
-
-            $customer_db_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($oOrder->k_id)."' ");
-            $customer_address = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($customer_db_data['adress_id'])."' ");
-
-            $_SESSION['wpsg']['checkout']['firma'] = wpsg_getStr($customer_address['firma']);
-            $_SESSION['wpsg']['checkout']['title'] = wpsg_getStr($customer_address['title']);
-            $_SESSION['wpsg']['checkout']['vname'] = wpsg_getStr($customer_address['vname']);
-            $_SESSION['wpsg']['checkout']['name'] = wpsg_getStr($customer_address['name']);
-            $_SESSION['wpsg']['checkout']['email'] = wpsg_getStr($customer_db_data['email']);
-            $_SESSION['wpsg']['checkout']['geb'] = wpsg_getStr($customer_address['geb']);
-            $_SESSION['wpsg']['checkout']['fax'] = wpsg_getStr($customer_address['fax']);
-            $_SESSION['wpsg']['checkout']['tel'] = wpsg_getStr($customer_address['tel']);
-            $_SESSION['wpsg']['checkout']['strasse'] = wpsg_getStr($customer_address['strasse']);
-            $_SESSION['wpsg']['checkout']['nr'] = wpsg_getStr($customer_address['nr']);
-            $_SESSION['wpsg']['checkout']['plz'] = wpsg_getStr($customer_address['plz']);
-            $_SESSION['wpsg']['checkout']['ort'] = wpsg_getStr($customer_address['ort']);
-            $_SESSION['wpsg']['checkout']['land'] = wpsg_getStr($customer_address['land']);
-
-			\wpsg\wpsg_calculation::$functionscache = [];
-			
-            $oBasket = new wpsg_basket();
-
-            $oBasket->addProduktToSession('abo_'.$order_id.'_'.$order_product_id, 1);
-			
-			//wpsg_debug("VerlÃ€ngere4: ".$order_id.":".$order_product_id.":".$oOrder->getId()."=".'abo_'.$order_id.'_'.$order_product_id);
-			
-            $oBasket->initFromSession(true); $arBasket = $oBasket->toArray();
-            $new_o_id = $oBasket->save(true, false);
-
-			$db_update = [
-				'type_shipping' => wpsg_q($oOrder->type_shipping),
-				'shipping_key' => wpsg_q($oOrder->shipping_key),
-				'shipping_set' => wpsg_q($oOrder->shipping_set)
-			];
-			
-			$order_data_old = $this->shop->cache->loadOrder($order_id);
-			
-			if ($this->shop->hasMod('wpsg_mod_autodebit')) {
-						 
-				$arBasket['checkout']['mod_autodebit_name'] = wpsg_q($order_data_old['mod_autodebit_name']);
-				$arBasket['checkout']['mod_autodebit_blz'] = wpsg_q($order_data_old['mod_autodebit_blz']);
-				$arBasket['checkout']['mod_autodebit_bic'] = wpsg_q($order_data_old['mod_autodebit_bic']);
-				$arBasket['checkout']['mod_autodebit_inhaber'] = wpsg_q($order_data_old['mod_autodebit_inhaber']);
-				$arBasket['checkout']['mod_autodebit_knr'] = wpsg_q($order_data_old['mod_autodebit_knr']);
-				$arBasket['checkout']['mod_autodebit_iban'] = wpsg_q($order_data_old['mod_autodebit_iban']);
-				
-				$db_update['mod_autodebit_name'] = wpsg_q($order_data_old['mod_autodebit_name']);
-				$db_update['mod_autodebit_blz'] = wpsg_q($order_data_old['mod_autodebit_blz']);
-				$db_update['mod_autodebit_bic'] = wpsg_q($order_data_old['mod_autodebit_bic']);
-				$db_update['mod_autodebit_inhaber'] = wpsg_q($order_data_old['mod_autodebit_inhaber']);
-				$db_update['mod_autodebit_knr'] = wpsg_q($order_data_old['mod_autodebit_knr']);
-				$db_update['mod_autodebit_iban'] = wpsg_q($order_data_old['mod_autodebit_iban']);
-								
-			}
-			
-			if ($order_data_old['adress_id'] !== $order_data_old['shipping_adress_id']) {
-				
-				$db_update['shipping_adress_id'] = $order_data_old['shipping_adress_id'];
-				
-				$arBasket['checkout']['shipping_firma'] = $oOrder->getShippingCompany();
-				$arBasket['checkout']['shipping_vname'] = $oOrder->getShippingFirstName();
-				$arBasket['checkout']['shipping_name'] = $oOrder->getShippingName();
-				$arBasket['checkout']['shipping_strasse'] = $oOrder->getShippingStreet();
-				$arBasket['checkout']['shipping_nr'] = $oOrder->getShippingStreetNr();
-				$arBasket['checkout']['shipping_plz'] = $oOrder->getShippingZip();
-				$arBasket['checkout']['shipping_ort'] = $oOrder->getShippingCity();
-				$arBasket['shipping_land'] = [
-					'name' => $oOrder->getShippingCountryName()
-				];
-				
-			}
-			
-			$this->db->UpdateQuery(WPSG_TBL_ORDER, $db_update, " `id` = '".wpsg_q($new_o_id)."' ");
-			
-			wpsg_order::clearCache($new_o_id);
-			$this->shop->cache->clearOrderCache($new_o_id);
-			
-            $arBasket['checkout']['knr'] = $customer_db_data['knr'];
-            $arBasket['checkout']['onr'] = $this->db->fetchOne("SELECT `onr` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($new_o_id)."' ");
-            $arBasket['checkout']['datum'] = time();
-
-            $bCustomerMail = false;
-            $bAdminMail = false;
-
-            if ($this->getSetting('wpsg_mod_abo_autoexpire_customermail', $product_id) === '1') $bCustomerMail = true;
-            if ($this->getSetting('wpsg_mod_abo_autoexpire_adminmail', $product_id) === '1') $bAdminMail = true;
-
-			//wpsg_debug("VerlÃ€ngere5: ".$order_id.":".$order_product_id.":".$oOrder->getId());
-			
-            $oOrder->addLogEntry(__('VerlÃ€ngerung erworben', 'wpsg'), 'OrderID: '.$order_id.'/'.$order_product_id.'/'.$product_id.'/'.$new_o_id.'/'.$abo_id.'/'.getmypid());
-
-            $oBasket->sendOrderSaveMails($new_o_id, $arBasket, $bCustomerMail, $bAdminMail);
-
-        }
-
-        /**
-         * Gibt einen Array mit AboProdukten einer Bestellung zurÃŒck
-         * @param int $order_id
-         * @return wpsg_order_product[]
-         */
-        public function getAboProductsFromOrder($order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $arOrderProducts = Array();
-
-            foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-
-                if ($oOrderProduct->getProduct()->wpsg_mod_abo_activ) {
-
-                    $arOrderProducts[] = $oOrderProduct;
-
-                }
-
-            }
-
-            return $arOrderProducts;
-
-        } // public function getAboProductsFromOrder($order_id)
-
-        /**
-         * Gibt die Informationen zu dem Abo aus der Abo Tabelle zurÃŒck
-         *
-         * @param $order_id
-         * @param $product_key
-         * @return mixed
-         */
-        public function getAboProductStatus($order_id, $order_product_id) {
-
-            $abo_product = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `order_product_id` = '".wpsg_q($order_product_id)."' ");
-
-            return $abo_product;
-
-        }
-
+		
 		/**
 		 * Gibt das Datum im MySQL Format zurÃŒck, wann das Abo ablÃ€uft wenn es heute gekauft wird
@@ -1645,38 +615,13 @@
 		 * @param int $menge Anzahl an gekauften Produkten
 		 */
-		public function getAboExpiration($product_id, $menge, $start, $noTimeZoneOffset = false) {
-
+		public function getAboExpiration($product_id, $menge, $start)
+		{
+			
 			$product_data = $this->shop->cache->loadProduct($product_id);
-
-			if ($noTimeZoneOffset) return date('Y-m-d H:i:s', $start + $product_data['wpsg_mod_abo_durration'] * 24 * 60 * 60 * $menge);
-			else return wpsg_date('Y-m-d H:i:s', $start + $product_data['wpsg_mod_abo_durration'] * 24 * 60 * 60 * $menge);
-
+			
+			return wpsg_date('Y-m-d H:i:s', $start + $product_data['wpsg_mod_abo_durration'] * 24 * 60 * 60 * $menge);
+			
 		} // public function getAboExpiration($product_id, $menge)
-
-        public function isAboExtensionProductKey($product_key) {
-
-		    if (preg_match('/^abo\_\d+\_\d+$/', $product_key)) {
-
-		        return true;
-
-            } else return false;
-
-        }
-
-        /**
-         * Gibt die ProduktID aus einem Abo VerlÃ€ngerungsschlÃŒssel zurÃŒck
-         * abo_{order_id}_{order_product_id}
-         * @param $productkey
-         */
-        public function getProductIDFromAboExtensionProductKey($product_key) {
-
-		    $arKey = explode('_', $product_key);
-
-		    $oOrderProduct = wpsg_order_product::getInstance(intval($arKey[2]));
-
-		    return $oOrderProduct->getProductId();
-
-        }
-
+		
 		/**
 		 * Gibt false zurÃŒck wenn die Bestellung keine Abo Bestellung ist
@@ -1684,72 +629,63 @@
 		 * 2 - Folgebestellung
 		 */
-		public function isAboOrder($order_id) {
-
-            // Folgebestellung testen
-            $nFolgeBestellung = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `productkey` REGEXP '^abo_[0-9]+_[0-9]+' ");
-            if ($nFolgeBestellung > 0) return 2;
-
+		public function isAboOrder($order_id)
+		{
+			
 			// Bei Originalbestellungen gibt es einen eintrag in der Tabelle
 			$nAboBestellung = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."'");
+			
 			if ($nAboBestellung > 0) return 1;
-
+			
+			// Jetzt auf Folgebestellung testen
+			$nFolgeBestellung = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `productkey` REGEXP '^abo_[0-9]+_[0-9]+' ");
+			
+			if ($nFolgeBestellung > 0) return 2;
+			
 			return false;
-
+			
 		} // public function isAboOrder($order_id)
-
+		
 		/**
 		 * Gibt die BestellID der Originalbestellung einer VerlÃ€ngerung zurÃŒck
 		 */
-		public function getOriginOrder($order_id) {
-
+		public function getOriginOrder($order_id)
+		{
+			
 			if ($this->isAboOrder($order_id) !== 2) return false;
-
+			
 			$productkeys = $this->db->fetchAssocField("SELECT `productkey` FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($order_id)."' ");
-
-			foreach ($productkeys as $pk) {
-
-				if (preg_match('/^abo_\d+_\d+$/', $pk)) {
-
+			
+			foreach ($productkeys as $pk)
+			{
+				
+				if (preg_match('/^abo_\d+_\d+$/', $pk))
+				{
+					
 					$arAbo = explode('_', $pk);
-
+					
 					return $arAbo[1];
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+			
 			return false;
-
+			
 		} // public function getOriginOrder($order_id)
-
+		
 		/**
 		 * Gibt das Auslaufdatum einer Abobestellung zurÃŒck
-         *
 		 * @param unknown_type $order_id
 		 */
-		public function getOrderAboExpiration($order_id, $order_product_id) {
-
-			$data = null;
-
-			$abo = wpsg_abo::getFromOrderAndOrderProduct($order_id, $order_product_id);
-
-			$data = $abo->__get('expiration');
-
-			/*
-			$data = wpsg_fromDate($this->db->fetchOne("
-                SELECT
-                    `expiration`
-                FROM
-                    `".WPSG_TBL_ABO."`
-                WHERE
-                    `order_id` = '".wpsg_q($order_id)."' AND
-                    `order_product_id` = '".wpsg_q($order_product_id)."'
-            "), false);
-			*/
+		public function getOrderAboExpiration($order_id)
+		{
+			
+			$data = null;			
+			$data = wpsg_fromDate($this->db->fetchOne("SELECT `expiration` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."'"), false);
 
 			return $data;
 
 		} // public function getOrderAboExpiration($order_id)
-
+		
 		/**
 		 * Gibt die Benachrichtigungsurl fÃŒr ein Produkt zurÃŒck
@@ -1758,12 +694,12 @@
 		public function getNotifyURL($product_id)
 		{
-
+			 
 			$product_data = $this->shop->cache->loadProduct($product_id);
-
+			
 			if (wpsg_isSizedString($product_data['wpsg_mod_abo_url'])) return $product_data['wpsg_mod_abo_url'];
 			else return $this->shop->get_option('wpsg_mod_abo_url');
-
+			
 		} // public function getNotifyURL($product_id)
-
+		
 		/**
 		 * Sendet die Mail beim erstmaligen Kauf eines Abo Produktes
@@ -1771,78 +707,39 @@
 		 * @param String $product_id ProduktKey
 		 */
-		public function sendAboFirstBuyMail($order_id, $order_product_id) {
-
+		public function sendAboFirstBuyMail($order_id, $product_key)
+		{
+			
 			if ($this->shop->get_option('wpsg_mod_abo_wpsgmodabofirstbuy') != '1') return;
-            
-			$oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-            
-			$product_data = $this->shop->cache->loadProduct($oOrderProduct->getProductId());
+			
+			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($product_key));
 			$order_data = $this->shop->cache->loadOrder($order_id);
 			$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
-
+			
 			$this->shop->view['product'] = $product_data;
 			$this->shop->view['customer'] = $customer_data;
-			$this->shop->view['order'] = $order_data;
-			$this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $order_product_id);
-
+			$this->shop->view['order'] = $order_data;	 
+			$this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $product_key);
+			
 			if ($this->shop->get_option('wpsg_htmlmail') === '1')
 			{
-
+				
 				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_firstbuy_html.phtml', false);
-
-			}
-			else
+				
+			}
+			else 
 			{
 
 				$mail_html = false;
-
-			}
-
+				
+			}
+			
 			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_firstbuy.phtml', false);
-
+						
 			$this->shop->sendMail($mail_text, $customer_data['email'], 'wpsgmodabofirstbuy', array(), $order_id, $customer_data['id'], $mail_html);
-
+			
 			return true;
-
+			
 		} // public function sendAboFirstBuyMail($order_id, $product_id)
-
-        /**
-         * Sendet die Mail, die X-Tage vor der automatischen VerlÃ€ngerung versendet werden kann
-         * @param int $order_id BestellID
-         * @param String $product_key ProduktKey
-         */
-        public function sendAboRenewInformation($order_id, $order_product_id) {
-
-            $oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-            
-            $product_id = $oOrderProduct->getProductId();
-
-            if ($this->getSetting('wpsg_mod_abo_premode', $product_id) !== self::EXPIRE_MAIL) return;
-            
-            $product_data = $this->shop->cache->loadProduct($product_id);
-            $order_data = $this->shop->cache->loadOrder($order_id);
-            $customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
-                        
-            $this->shop->view['oProduct'] = wpsg_product::getInstance($product_data['id']);
-            $this->shop->view['product'] = $product_data;
-            $this->shop->view['customer'] = $customer_data;
-            $this->shop->view['order'] = $order_data;
-            $this->shop->view['wpsg_mod_abo_autoexpire_informationtime'] = $this->getSetting('wpsg_mod_abo_autoexpire_informationtime', $product_id);
-            $this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $order_product_id);
-
-            if ($this->shop->get_option('wpsg_htmlmail') === '1') $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_autoinformation_html.phtml', false);
-            else $mail_html = false;
-
-            $mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_autoinformation.phtml', false);
- 
-            $this->shop->sendMail($mail_text, $customer_data['email'], 'wpsgmodabautoinfo', array(), $order_id, $customer_data['id'], $mail_html);
-            
-            $oOrder = wpsg_order::getInstance($order_id);
-            $oOrder->addLogEntry(__('Benachrichtigung Abo Ablauf', 'wpsg'), $mail_text);
-
-            return true;
-            
-        } // public function sendAboRenewInformation($order_id, $product_key)
-        
+				
 		/**
 		 * Sendet die Mail bei ablauf eines Abos
@@ -1851,85 +748,82 @@
 		 * @return boolean
 		 */
-		public function sendAboExpirationMail($order_id, $order_product_id) {
-
-		    $oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-		    $oOrder = wpsg_order::getInstance($order_id);
-		    
-		    $product_id = $oOrderProduct->getProductId();
-		    $wpsg_mod_abo_expiremode = $this->getSetting('wpsg_mod_abo_expiremode', $product_id);
-		    
-			if ($wpsg_mod_abo_expiremode != self::EXPIRE_MAIL) return;
-
-			$this->shop->view = [];
-			
-			$product_data = $this->shop->cache->loadProduct($product_id);
+		public function sendAboExpirationMail($order_id, $product_key)
+		{
+				
+			if ($this->shop->get_option('wpsg_mod_abo_wpsgmodaboexpiration') != '1') return;
+			
+			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($product_key));
 			$order_data = $this->shop->cache->loadOrder($order_id);
 			$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
-
+			
+			$this->shop->view['product'] = $product_data;
+			$this->shop->view['customer'] = $customer_data;
+			$this->shop->view['order'] = $order_data;				
+			$this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $product_key);				
+			$this->shop->view['allowRebuy'] = $this->canReBuyAbo($order_id, $product_key); 
+			
+			if ($this->shop->get_option('wpsg_htmlmail') === '1')
+			{
+			
+				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_expiration_html.phtml');
+				
+			}
+			else
+			{
+				
+				$mail_html = false;
+				
+			}
+				
+			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_expiration.phtml', false);
+			 
+			$this->shop->sendMail($mail_text, $customer_data['email'], 'wpsgmodaboexpiration', array(), $order_id, $customer_data['id'], $mail_html);
+				
+			return true;
+				
+		} // public function sendAboExpirationMail($order_id, $product_id)
+		
+		/**
+		 * Sendet die Mail bei verlÃ€ngerung eines Abos
+		 * @param int $order_key BestellID
+		 * @param String $product_id ProduktKey
+		 * @return boolean
+		 */
+		public function sendAboRebuyMail($order_id, $product_key)
+		{
+			
+			if ($this->shop->get_option('wpsg_mod_abo_wpsgmodabrebuy') != '1') return;
+			
+			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($product_key));
+			$order_data = $this->shop->cache->loadOrder($order_id);
+			$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
+				
 			$this->shop->view['product'] = $product_data;
 			$this->shop->view['customer'] = $customer_data;
 			$this->shop->view['order'] = $order_data;
-			$this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $order_product_id);
-			$this->shop->view['allowRebuy'] = $this->canReBuyAbo($order_id, $order_product_id);
-
-			if ($this->shop->get_option('wpsg_htmlmail') === '1') {
-
-				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_expiration_html.phtml', false);
-
-			} else {
-
+			$this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $product_key);
+			$this->shop->view['allowRebuy'] = $this->canReBuyAbo($order_id, $product_key);
+			
+			if ($this->shop->get_option('wpsg_htmlmail') === '1')
+			{
+
+				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_rebuy_html.phtml', false);
+				
+			}
+			else
+			{
+				
 				$mail_html = false;
-
-			}
-
-			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_expiration.phtml', false);
-
-			$this->shop->sendMail($mail_text, $customer_data['email'], 'wpsgmodaboexpiration', array(), $order_id, $customer_data['id'], $mail_html);
-            $oOrder->addLogEntry(__('Abo Ablauf', 'wpsg'), $mail_text);
-
+				
+			}
+			
+			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_rebuy.phtml', false);
+						
+			$this->shop->sendMail($mail_text, $customer_data['email'], 'wpsgmodabrebuy', array(), $order_id, $customer_data['id'], $mail_html);
+			
 			return true;
-
-		} // public function sendAboExpirationMail($order_id, $product_id)
-
-		/**
-		 * Sendet die Mail bei VerlÃ€ngerung eines Abos
-		 * @param int $order_key BestellID
-		 * @param String $product_id ProduktKey
-		 * @return boolean
-		 */
-		public function sendAboRebuyMail($order_id, $order_product_id) {
-
-			if ($this->shop->get_option('wpsg_mod_abo_wpsgmodabrebuy') != '1') return;
-
-			$oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-						
-			$product_data = $this->shop->cache->loadProduct($oOrderProduct->getProductId());
-			$order_data = $this->shop->cache->loadOrder($order_id);
-			$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
-
-			$this->shop->view['product'] = $product_data;
-			$this->shop->view['customer'] = $customer_data;
-			$this->shop->view['order'] = $order_data;
-			$this->shop->view['rebuyLink'] = $this->getRebuyLink($order_id, $order_product_id);
-			$this->shop->view['allowRebuy'] = $this->canReBuyAbo($order_id, $order_product_id);
-
-			if ($this->shop->get_option('wpsg_htmlmail') === '1') {
-
-				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_rebuy_html.phtml', false);
-
-			} else {
-
-				$mail_html = false;
-
-			}
-
-			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/mail_rebuy.phtml', false);
-
-			$this->shop->sendMail($mail_text, $customer_data['email'], 'wpsgmodabrebuy', array(), $order_id, $customer_data['id'], $mail_html);
-
-			return true;
-
+			
 		} // public function sendAboRebuyMail($order_id, $product_key)
- 
+		
 		/**
 		 * Gibt false zurÃŒck wenn das Abo nicht mehr verlÃ€ngert werden kann, ansonsten true oder die Anzahl wenn Anzahl beschrÃ€nkt die noch mÃ¶glich ist
@@ -1937,57 +831,46 @@
 		 * @param String $product_key ProduktKey
 		 */
-		public function canReBuyAbo($order_id, $order_product_id) {
-		    
-		    $oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-
-			$product_data = $this->shop->cache->loadProduct($oOrderProduct->getProductKey());
-
-			if ($product_data['wpsg_mod_abo_resell'] == '0') {
-
+		public function canReBuyAbo($order_id, $product_key)
+		{
+			
+			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($product_key));
+			
+			if ($product_data['wpsg_mod_abo_resell'] == '0')
+			{
+			
 				return true;
-
-			} else {
-
-				$rebuy = $this->db->fetchOne("SELECT `rebuy` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `order_product_id` = '".wpsg_q($order_product_id)."'");
-
+			
+			}
+			else
+			{
+			
+				$rebuy = $this->db->fetchOne("SELECT `rebuy` FROM `".WPSG_TBL_ABO."` WHERE `order_id` = '".wpsg_q($order_id)."' AND `product_key` = '".wpsg_q($product_key)."'");
+			
 				if ($rebuy < $product_data['wpsg_mod_abo_resell'])
 				{
-
+						
 					return $product_data['wpsg_mod_abo_resell'] - $rebuy;
-
-				}
-
-			}
-
+						
+				}
+			
+			}
+			
 			return false;
-
+			
 		} // public function canReBuyAbo($order_id, $product_key)
-
-        /**
-         * Gibt aus einem ProduktschlÃŒssel die BestellID zurÃŒck
-         * Hier ist der ProduktschlÃŒssel z.b. abo_{original_order_id}_{original_order_product_id}
-         * @param varchar ProduktKey
-         */
-        public function getOrderProductIDFromKey($product_key) {
-
-            $arData = explode('_', $product_key);
-
-            return wpsg_getInt($arData[2]);
-            
-        }
-        
+		
 		/**
 		 * Gibt aus einem ProduktschlÃŒssel die BestellID zurÃŒck
-         * Hier ist der ProduktschlÃŒssel z.b. abo_{original_order_id}_{original_order_product_id}
 		 * @param varchar ProduktKey
 		 */
-		public function getOrderIDFromKey($product_key) {
-
+		public function getOrderIDFromKey($product_key)
+		{
+			
 			$arData = explode('_', $product_key);
-
-			return wpsg_getInt($arData[1]);
-
+			
+			return $arData[1];		
+			
 		} // public function getOrderIDFromKey($product_key)
-
+						
 		/**
 		 * Gibt den Link zum wiederkauf eines Abos zurÃŒck
@@ -1995,18 +878,18 @@
 		 * @param int $product_key ProduktKey
 		 */
-		public function getRebuyLink($order_id, $order_product_id) {
-		    
-		    $oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-
+		public function getRebuyLink($order_id, $product_key)
+		{
+			
 			$url = get_permalink($this->shop->get_option('wpsg_page_basket'));
-
+			
 			$url .= ((strpos($url, '?') === false)?'?mod=wpsg_mod_abo':'&mod=wpsg_mod_abo');
 			$url .= ((strpos($url, '?') === false)?'?order_id=':'&order_id=').$order_id;
-			$url .= ((strpos($url, '?') === false)?'?product_key=':'&order_product_id=').$order_product_id;
-
+			$url .= ((strpos($url, '?') === false)?'?product_key=':'&product_key=').$product_key;
+			
 			return $url;
-
+			
 		} // public function getRebuyLink($order_id, $product_key)
-
+				
 	} // class wpsg_mod_abo extends wpsg_mod_basic
- 
+
+?>
Index: ds/wpsg_mod_addressvalidation.class.php
===================================================================
--- /mods/wpsg_mod_addressvalidation.class.php	(revision 8528)
+++ 	(revision )
@@ -1,271 +1,0 @@
-<?php
-
-	/**
-	 * Dieses Modul erlaubt die Adressvalidation
-	 * @author hartmut
-	 */
-	class wpsg_mod_addressvalidation extends wpsg_mod_basic
-	{
-	
-		var $lizenz = 2;
-		var $id = 3250;
-		var $version = "9.9.9";
-		var $hilfeURL = 'http://wpshopgermany.de/?p=4670347';
-	
-		/**
-		 * Constructor
-		 */
-		public function __construct()
-		{
-			
-			global $wpdb;
-			
-			parent::__construct();
-				
-			$this->name = __('Adressvalidation', 'wpsg');
-			$this->group = __('Sonstiges', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die PrÃŒfung der Adresse.', 'wpsg');
-					
-		} // public function __construct()
-		
-		public function install()
-		{
-		
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-				
-			$this->shop->checkDefault('wpsg_mod_addressvalidation_apikey', '', false, true);
-				
-		} // public function install()
-		
-		public function settings_edit()
-		{
-				
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_addressvalidation/settings_edit.phtml');
-				
-		}
-		
-		public function settings_save()
-		{
-				
-		    $this->shop->update_option('wpsg_mod_addressvalidation_apikey', $_REQUEST['wpsg_mod_addressvalidation_apikey'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		
-		} // public function settings_save()
-		
-		public function wpsg_enqueue_scripts() {
-
-			$id = wpsg_get_the_id();
-
-			if (!is_admin() && wpsg_isSizedInt($id) && (
-                    $id == $this->shop->get_option('wpsg_page_basket') ||
-                    $id == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_profil') ||
-                    $id == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_registrierung')
-				))
-			{
-				
-				$gurl = $this->shop->getRessourceURL('mods/mod_addressvalidation/addressvalidation.js');
-				
-				wp_register_script('wpsg-mod_addressvalidation-valid', $gurl, array(), null);
-				wp_enqueue_script('wpsg-mod_addressvalidation-valid');
-		
-			}
-				
-		} // public wpsg_enqueue_scripts()
-
-		/**
-		 * Varlidierung durchfÃŒhren
-		 * KÃ¶nnte man vielleicht ÃŒber die Funktion wpsg_SystemController->get_url_post_content durchfÃŒhren
-		 * @param $state
-		 * @param $error
-		 * @param $arCheckout
-		 */
-		public function checkCheckout(&$state, &$error, &$arCheckout)
-		{
-	 
-			if (
-				($state == 1) ||
-				($state >= 1 && $this->shop->hasMod('wpsg_mod_onepagecheckout'))
-				)
-			{
-				
-				$pflicht = $GLOBALS['wpsg_sc']->loadPflichtFeldDaten();
-				
-				// $arCheckout['strasse']  (plz, ort, land, nr)
-				$strasse = $arCheckout['strasse'];
-				$ort = $arCheckout['ort'];
-				$plz = $arCheckout['plz'];
-				$nr = '';
-				
-				if (isset($arCheckout['nr'])) $nr = $arCheckout['nr'];
-				
-				$land = $arCheckout['land'];
-				
-				if (wpsg_isSizedInt($land))
-				{
-				
-					$oCountry = wpsg_country::getInstance($land);
-					$land = strtolower($oCountry->getShorttext());
-					
-				} else $land = '';
-				
-				$astr = $strasse.$nr.$plz.$ort.$land;
-				
-				$key = $this->shop->get_option('wpsg_mod_addressvalidation_apikey');
-					
-				$strasse = $strasse.rtrim(' '.$nr);
-				
-					
-				if ($astr != wpsg_getStr($_SESSION['wpsg']['Adressstring1']))
-				{
-					$_SESSION['wpsg']['Adressstring1'] = $astr;
-					
-					// build API request
-					$APIUrl = 'http://api.address-validator.net/api/verify';
-					$Params = array('StreetAddress' => $strasse,
-							'City' => $ort,
-							'PostalCode' => $plz,
-							//'State' => $State,
-							'CountryCode' => $land,
-							//'Locale' => $Locale,
-							'APIKey' => $key);
-					$Request = http_build_query($Params, '', '&');
-					$ctxData = array(
-							'method'=>"POST",
-							'header'=>"Connection: close\r\n".
-							"Content-Type: application/x-www-form-urlencoded\r\n".
-							"Content-Length: ".strlen($Request)."\r\n",
-							'content'=>$Request);
-					$ctx = stream_context_create(array('http' => $ctxData));
-					
-					// send API request
-					$result = json_decode(file_get_contents($APIUrl, false, $ctx));
-					
-					// check API result
-					if ($result && $result->{'status'} == 'VALID') {
-						$formattedaddress = $result->{'formattedaddress'};
-					} else {
-						//echo $result->{'info'};
-						if (($result->{'status'} == 'SUSPECT') || ($result->{'status'} == 'INVALID'))
-						{
-							
-							if ($pflicht['strasse'] != '1') $_SESSION['wpsg']['errorFields'][] = 'strasse';
-							if ($pflicht['nr'] != '1') $_SESSION['wpsg']['errorFields'][] = 'nr';
-							if ($pflicht['ort'] != '1') $_SESSION['wpsg']['errorFields'][] = 'ort';
-							if ($pflicht['plz'] != '1') $_SESSION['wpsg']['errorFields'][] = 'plz';
-							if ($pflicht['land'] != '1') $_SESSION['wpsg']['errorFields'][] = 'land';
-							$this->shop->addFrontendError(__('Bitte die Kundenadresse (StraÃe, Hausnummer, PLZ, Ort und Land kontrollieren (Adressvalidation)', 'wpsg'));
-							$error = true;
-							
-						}
-						else
-						{
-							
-							$this->shop->addFrontendError(wpsg_translate(__('Probleme mit dem Server der Adressvalidation (#1#)', 'wpsg'), $result->{'status'}));
-							$error = true;
-							
-						}
-							
-					}
-				
-				}
-				
-				if (array_key_exists('diff_shippingadress', $arCheckout))
-				{
-					// $arCheckout['diff_shippingadress'], shipping_(strasse, plz, ort, land)
-					$strasse = $arCheckout['shipping_strasse'];
-					$ort = $arCheckout['shipping_ort'];
-					$plz = $arCheckout['shipping_plz'];
-					$nr = wpsg_getStr($arCheckout['shipping_nr']);
-					$land = $arCheckout['shipping_land'];
-					
-					if (wpsg_isSizedInt($land))
-					{
-					
-						$oCountry = wpsg_country::getInstance($land);
-						$land = strtolower($oCountry->getShorttext());
-						
-					} else $land = '';
-					
-					
-					$astr = $strasse.$nr.$plz.$ort.$land;
-						
-					$key = $this->shop->get_option('wpsg_mod_addressvalidation_apikey');
-						
-					if (wpsg_isSizedInt($this->shop->get_option('wpsg_showNr'))) {
-					
-						$strasse = $strasse.' '.$nr;
-					
-					}
-						
-					if ($astr != wpsg_getStr($_SESSION['wpsg']['Adressstring2']))
-					{
-						$_SESSION['wpsg']['Adressstring2'] = $astr;
-							
-						// build API request
-						$APIUrl = 'http://api.address-validator.net/api/verify';
-						$Params = array('StreetAddress' => $strasse,
-								'City' => $ort,
-								'PostalCode' => $plz,
-								//'State' => $State,
-								'CountryCode' => $land,
-								//'Locale' => $Locale,
-								'APIKey' => $key);
-						$Request = http_build_query($Params, '', '&');
-						$ctxData = array(
-								'method'=>"POST",
-								'header'=>"Connection: close\r\n".
-								"Content-Type: application/x-www-form-urlencoded\r\n".
-								"Content-Length: ".strlen($Request)."\r\n",
-								'content'=>$Request);
-						$ctx = stream_context_create(array('http' => $ctxData));
-						
-						// send API request
-						$result = json_decode(file_get_contents($APIUrl, false, $ctx));
-						
-						// check API result
-						if ($result && $result->{'status'} == 'VALID') {
-							$formattedaddress = $result->{'formattedaddress'};
-						} else {
-							//echo $result->{'info'};
-							if (($result->{'status'} == 'SUSPECT') || ($result->{'status'} == 'INVALID'))
-							{
-						
-								if ($pflicht['strasse'] != '1') {
-									
-									$_SESSION['wpsg']['errorFields'][] = 'shipping_strasse';
-									
-									if (wpsg_getStr($pflicht['wpsg_showNr']) === '1') {
-									
-										$_SESSION['wpsg']['errorFields'][] = 'shipping_nr';
-										
-									}
-									
-								}
-								
-								if ($pflicht['ort'] != '1') $_SESSION['wpsg']['errorFields'][] = 'shipping_ort';
-								if ($pflicht['plz'] != '1') $_SESSION['wpsg']['errorFields'][] = 'shipping_plz';
-								if ($pflicht['land'] != '1') $_SESSION['wpsg']['errorFields'][] = 'shipping_land';
-								$this->shop->addFrontendError(__('Bitte die Lieferadresse (StraÃe, Hausnummer, PLZ, Ort und Land kontrollieren (Adressvalidation)', 'wpsg'));
-								$error = true;
-						
-							}
-							else
-							{
-						
-								$this->shop->addFrontendError(__('Probleme mit dem Server (Adressvalidation)'.' ('.$result->{'status'}.')', 'wpsg'));
-								//$error = true;
-						
-							}
-						
-						}
-					
-					}
-					
-				}
-					
-			}
-				
-		} // public function checkCheckout(&$state, &$error, &$arCheckout)
-		
-	}
-
-?>
Index: ds/wpsg_mod_amazon.class.php
===================================================================
--- /mods/wpsg_mod_amazon.class.php	(revision 8528)
+++ 	(revision )
@@ -1,721 +1,0 @@
-<?php
-
-    /**
-     * Modul fÃŒr "Bezahlen mit Amazon"
-     * @author Daschmi (12.03.2016)
-     */
-    class wpsg_mod_amazon extends wpsg_mod_basic
-    {
-
-        var $lizenz = 1;
-        var $id = 3140;
-        var $hilfeURL = 'http://wpshopgermany.de/?p=3462587';
-        var $version = "9.9.9";
-        var $free = false;
-
-        const ORDER_DONE_START = 0; // Zahlung starten lassen mit Pay with Amazon
-        const ORDER_DONE_GO = 1; // Zahlung gestartet, Wallet aneigen
-        const ORDER_DONE_PAST = 9; // Zahlung bereits durchgefÃŒhrt
-        const ORDER_DONE = 10; // Zahlung wurde gerade durchgefÃŒhrt
-
-        /**
-         * Kostruktor
-         */
-        public function __construct()
-        {
-
-            parent::__construct();
-
-            $this->name = __('AmazonPay', 'wpsg');
-            $this->group = __('Zahlungsarten', 'wpsg');
-            $this->desc = __('ErmÃ¶glicht die Anmeldung / Zahlung mit Amazon.', 'wpsg');
-
-        } // public function __construct()
-
-        public function install()
-        {
-
-            $this->shop->checkDefault('wpsg_mod_amazon_aktiv', '1');
-            $this->shop->checkDefault('wpsg_mod_amazon_basket', '1');
-            $this->shop->checkDefault('wpsg_mod_amazon_name', __('AmazonPay', 'wpsg'), false, true);
-            $this->shop->checkDefault('wpsg_mod_amazon_hint', __('Bezahlen Sie ihre Bestellung einfach mit ihrem Amazon Konto.', 'wpsg'), false, true);
-            $this->shop->checkDefault('wpsg_mod_amazon_subject', __('O%order_id% - K%kunde_id%', 'wpsg'), false, true);
-
-
-        } // public function install()
-
-        public function settings_edit() {
-
-            $this->shop->view['ipnURL'] = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon', 'ipn', [], true);
-            $this->shop->view['jsOrigin'] = preg_replace('/^http:\/\//i', 'https://', $this->shop->get_option('siteurl'));
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon/settings_edit.phtml');
-
-        } // public function settings_edit()
-
-        public function order_view_afterpayment(&$order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            if ($oOrder->getPaymentID() == $this->id) {
-
-                $this->shop->view['oOrder'] = $oOrder;
-
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon/order_view_afterpayment.phtml');
-
-            }
-
-
-        }
-
-        public function settings_save()
-        {
-
-            $this->shop->update_option('wpsg_mod_amazon_sandbox', $_REQUEST['wpsg_mod_amazon_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-            $this->shop->update_option('wpsg_mod_amazon_seller_id', $_REQUEST['wpsg_mod_amazon_seller_id'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_mws_access_key_id', $_REQUEST['wpsg_mod_amazon_mws_access_key_id'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_mws_access_key', $_REQUEST['wpsg_mod_amazon_mws_access_key'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_lwa_client_id', $_REQUEST['wpsg_mod_amazon_lwa_client_id'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_lwa_client_secret', $_REQUEST['wpsg_mod_amazon_lwa_client_secret'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_sandbox', $_REQUEST['wpsg_mod_amazon_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-            $this->shop->update_option('wpsg_mod_amazon_aktiv', $_REQUEST['wpsg_mod_amazon_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-            $this->shop->update_option('wpsg_mod_amazon_name', $_REQUEST['wpsg_mod_amazon_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_amazon_subject', $_REQUEST['wpsg_mod_amazon_subject'], false, true, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_amazon_hint', $_REQUEST['wpsg_mod_amazon_hint'], false, true, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_amazon_basket', $_REQUEST['wpsg_mod_amazon_basket'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-            $this->shop->update_option('wpsg_mod_amazon_gebuehr', $_REQUEST['wpsg_mod_amazon_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-            $this->shop->update_option('wpsg_mod_amazon_mwst', $_REQUEST['wpsg_mod_amazon_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-            $this->shop->update_option('wpsg_mod_amazon_mwstland', $_REQUEST['wpsg_mod_amazon_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-        } // public function settings_save()
-
-        public function basket_inner_prebutton(&$basket_view)
-        {
-
-            // Amazon ÃŒberhaupt mÃ¶glich
-            if (!array_key_exists($this->id, $this->shop->arPayment)) return;
-
-            if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_aktiv')) || !wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_basket'))) return;
-
-            $oOrder = wpsg_order::getInstance($_SESSION['wpsg']['order_id']);
-
-            $this->shop->view['wpsg_mod_amazon']['redirectURL'] = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon', 'return');
-            $this->shop->view['wpsg_mod_amazon']['logoutURL'] = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon', 'logout');
-
-            $this->shop->view['wpsg_mod_amazon']['amazon_last_authorization_reference_id'] = $oOrder->getMeta('amazon_last_authorization_reference_id');
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon/basket_inner_prebutton.phtml');
-
-        } // public function basket_inner_prebutton(&$basket_view)
-
-        public function setOrderStatus($order_id, $status_id, $inform) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            if ($oOrder->getPaymentID() == $this->id && in_array($status_id, array(wpsg_ShopController::STATUS_STORNIERT, wpsg_ShopController::STATUS_ZURUECKGEZAHLT))) {
-
-                $capture_id = $oOrder->getMeta('amazon_capture_id');
-
-                if (wpsg_isSizedString($capture_id))
-                {
-
-                    $arReturn = $this->api_refund($oOrder->id);
-
-                    if (wpsg_isSizedString($arReturn['RefundResult']['RefundDetails']['AmazonRefundId']))
-                    {
-
-                        $this->shop->addBackendMessage(__('Der Betrag wurde erfolgreich zurÃŒckerstattet.', 'wpsg'));
-
-                    }
-                    else
-                    {
-
-                        $this->shop->addBackendError(__('Es gab technische Probleme beim zurÃŒckerstatten des Betrages.', 'wpsg'));
-
-                        $oOrder->log(__('Fehler beim zurÃŒckerstatten des Bestellbetrages', 'wpsg'), print_r($arReturn, 1));
-
-                    }
-
-                }
-                else
-                {
-
-                    $this->shop->addBackendError(__('RÃŒckzahlung nicht mÃ¶glich, da keine Capture/Authorize ID gesetzt wurde', 'wpsg'));
-
-                }
-
-            }
-
-        } // public function setOrderStatus($order_id, $status_id, $inform)
-
-        public function wp_head()
-        {
-
-            if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_aktiv'))) return;
-
-            echo '<script type="text/javascript"> window.onAmazonLoginReady = function() { amazon.Login.setClientId("'.$this->shop->get_option('wpsg_mod_amazon_lwa_client_id').'"); }; </script>';
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_sandbox')))
-            {
-
-                echo '<script type="text/javascript" src="https://static-eu.payments-amazon.com/OffAmazonPayments/de/sandbox/lpa/js/Widgets.js"></script>';
-
-            }
-            else
-            {
-
-                echo '<script type="text/javascript" src="https://static-eu.payments-amazon.com/OffAmazonPayments/de/lpa/js/Widgets.js"></script>';
-
-            }
-
-        } // public function wp_head()
-
-        public function order_done(&$order_id, &$done_view)
-        {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            if ($oOrder->getToPay() <= 0 || $oOrder->getPaymentID() != $this->id) return;
-
-            $amazon_order_reference_id = $oOrder->getMeta('amazon_order_reference_id');
-            $amazon_order_done = $oOrder->getMeta('amazon_order_done');
-
-            if (wpsg_isSizedString($amazon_order_reference_id) && !wpsg_isSizedString($amazon_order_done))
-            {
-
-                // Zahlung durchfÃŒhren
-                $this->api_setPayment($order_id);
-                $this->api_finishPayment($order_id);
-
-                $capture_return = $this->api_capturePayment($order_id);
-
-                $this->api_closePayment($order_id);
-
-                if (wpsg_isSizedString($capture_return['AuthorizeResult']['AuthorizationDetails']['AuthorizationAmount']['Amount']))
-                {
-
-                    $amount_captured = wpsg_tf($capture_return['AuthorizeResult']['AuthorizationDetails']['AuthorizationAmount']['Amount']);
-
-                    if ($this->shop->setPayMent($oOrder->id, $amount_captured))
-                    {
-
-                        //$this->shop->setOrderStatus($oOrder->id, 100, true);
-                        $oOrder->setMeta('amazon_order_done', serialize($capture_return));
-
-                        $this->shop->view['wpsg_mod_amazon']['state'] = self::ORDER_DONE;
-                        return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon/order_done.phtml');
-
-                    }
-
-                }
-
-            } else if (wpsg_isSizedString($amazon_order_done))
-            {
-
-                $this->shop->view['wpsg_mod_amazon']['state'] = self::ORDER_DONE_PAST;
-                return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon/order_done.phtml');
-
-            }
-
-            if (wpsg_isSizedString($amazon_order_reference_id))
-            {
-
-                $oOrder->setMeta('amazon_order_reference_id', null);
-                $oOrder->setMeta('amazon_last_authorization_reference_id', null);
-
-            }
-
-            if (wpsg_isSizedString($_REQUEST['access_token']))
-            {
-
-                $this->shop->view['wpsg_mod_amazon']['state'] = self::ORDER_DONE_GO;
-
-            }
-            else
-            {
-
-                $this->shop->view['wpsg_mod_amazon']['state'] = self::ORDER_DONE_START;
-
-            }
-
-            $this->shop->view['wpsg_mod_amazon']['redirectURL'] = $this->shop->getDoneURL($order_id);
-
-            return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon/order_done.phtml');
-
-        } // public function order_done($order_id, $done_view)
-
-        public function basket_checkoutAction(&$basketController)
-        {
-
-            if ($_SESSION['wpsg']['checkout']['payment'] != $this->id || !wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_basket'))) return;
-
-            if (wpsg_isSizedString($_REQUEST['amazon']['OrderReference']))
-            {
-
-                $oOrder = wpsg_order::getInstance($_SESSION['wpsg']['order_id']);
-
-                $oOrder->setMeta('amazon_order_reference_id', $_REQUEST['amazon']['OrderReference']);
-
-                $res = $this->api_getPayment($_SESSION['wpsg']['order_id']);
-
-                $res = $res['GetOrderReferenceDetailsResult']['OrderReferenceDetails'];
-
-                list($vname, $name) = wpsg_explodeName($res['Destination']['PhysicalDestination']['Name']);
-
-                if (wpsg_isSizedString($res['Buyer']['Email']) && !wpsg_isSizedString($_SESSION['wpsg']['checkout']['email']))
-                {
-
-                    $_SESSION['wpsg']['checkout']['email'] = $res['Buyer']['Email'];
-                    $_SESSION['wpsg']['checkout']['email2'] = $res['Buyer']['Email'];
-
-                }
-
-                if (wpsg_isSizedString($res['Buyer']['Phone'])) $_SESSION['wpsg']['checkout']['tel'] = $res['Buyer']['Phone'];
-
-                // Vereinfacht auf die Ãbernahme der Lieferadresse
-                if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']))
-                {
-
-                    if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['vname'])) $_SESSION['wpsg']['checkout']['vname'] = $vname;
-                    if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['name'])) $_SESSION['wpsg']['checkout']['name'] = $name;
-
-                    if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']['AddressLine1'])) $res['Destination']['PhysicalDestination']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine1']);
-                    if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']['AddressLine2'])) $res['Destination']['PhysicalDestination']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine2']);
-
-                    if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['strasse'])) $_SESSION['wpsg']['checkout']['strasse'] = ltrim(implode(', ', array(
-                        wpsg_getStr($res['Destination']['PhysicalDestination']['AddressLine1']),
-                        wpsg_getStr($res['Destination']['PhysicalDestination']['AddressLine2']),
-                    )), ', ');
-                    if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['plz'])) $_SESSION['wpsg']['checkout']['plz'] = $res['Destination']['PhysicalDestination']['PostalCode'];
-                    if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['ort'])) $_SESSION['wpsg']['checkout']['ort'] = $res['Destination']['PhysicalDestination']['City'];
-
-                    // Land wenn gefunden
-                    $country_id = wpsg_country::getCountryIDFromCode($res['Destination']['PhysicalDestination']['CountryCode']);
-                    if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land']) && wpsg_isSizedString($country_id)) $_SESSION['wpsg']['checkout']['land'] = $country_id;
-
-                }
-
-                /*
-                if ($this->shop->hasMod('wpsg_mod_shippingadress'))
-                {
-
-                    // Lieferadresse ist aktiv
-                    // Lieferadresse aus Amazon -> Lieferadresse
-                    // Recnungsadresse aus Amazon -> Rechnungsadresse
-                    // Eventuell schauen ob gleich ist :?
-
-                    if (wpsg_isSizedArray($res['BillingAddress']['PhysicalAddress']))
-                    {
-
-                        if (wpsg_isSizedArray($res['BillingAddress']['PhysicalAddress']['AddressLine1'])) $res['BillingAddress']['PhysicalAddress']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine1']);
-                        if (wpsg_isSizedArray($res['BillingAddress']['PhysicalAddress']['AddressLine2'])) $res['BillingAddress']['PhysicalAddress']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine2']);
-
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_vname'])) $_SESSION['wpsg']['checkout']['shipping_vname'] = $vname;
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_name'])) $_SESSION['wpsg']['checkout']['shipping_name'] = $name;
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['strasse'])) $_SESSION['wpsg']['checkout']['strasse'] = ltrim(implode(', ', array(
-                                wpsg_getStr($res['BillingAddress']['PhysicalAddress']['AddressLine1']),
-                                wpsg_getStr($res['BillingAddress']['PhysicalAddress']['AddressLine2']),
-                        )), ', ');
-
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['plz'])) $_SESSION['wpsg']['checkout']['plz'] = $res['BillingAddress']['PhysicalAddress']['PostalCode'];
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['ort'])) $_SESSION['wpsg']['checkout']['ort'] = $res['BillingAddress']['PhysicalAddress']['City'];
-
-                        // Land wenn gefunden
-                        $country_id = wpsg_country::getCountryIDFromCode($res['BillingAddress']['PhysicalAddress']['CountryCode']);
-                        if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land']) && wpsg_isSizedString($country_id)) $_SESSION['wpsg']['checkout']['land'] = $country_id;
-
-                    }
-
-                    if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']))
-                    {
-
-                        if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']['AddressLine1'])) $res['Destination']['PhysicalDestination']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine1']);
-                        if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']['AddressLine2'])) $res['Destination']['PhysicalDestination']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine2']);
-
-                        if (!isset($_SESSION['wpsg']['checkout']['diff_shippingadress'])) $_SESSION['wpsg']['checkout']['diff_shippingadress'] = '1';
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_vname'])) $_SESSION['wpsg']['checkout']['shipping_vname'] = $vname;
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_name'])) $_SESSION['wpsg']['checkout']['shipping_name'] = $name;
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_strasse'])) $_SESSION['wpsg']['checkout']['shipping_strasse'] = ltrim(implode(', ', array(
-                            wpsg_getStr($res['Destination']['PhysicalDestination']['AddressLine1']),
-                            wpsg_getStr($res['Destination']['PhysicalDestination']['AddressLine2']),
-                        )), ', ');
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_plz'])) $_SESSION['wpsg']['checkout']['shipping_plz'] = $res['Destination']['PhysicalDestination']['PostalCode'];
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_ort'])) $_SESSION['wpsg']['checkout']['shipping_ort'] = $res['Destination']['PhysicalDestination']['City'];
-
-                        // Land wenn gefunden
-                        $country_id = wpsg_country::getCountryIDFromCode($res['Destination']['PhysicalDestination']['CountryCode']);
-                        if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land']) && wpsg_isSizedString($country_id)) $_SESSION['wpsg']['checkout']['shipping_land'] = $country_id;
-
-                    }
-
-                }
-                else
-                {
-
-                    // Modul "Lieferanschrift" ist deaktiviert
-                    // Ich nehme hier als Liefer- und Rechnungsanschrift die Daten aus Amazon Lieferanschrift
-                    if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']))
-                    {
-
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['vname'])) $_SESSION['wpsg']['checkout']['vname'] = $vname;
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['name'])) $_SESSION['wpsg']['checkout']['name'] = $name;
-
-                        if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']['AddressLine1'])) $res['Destination']['PhysicalDestination']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine1']);
-                        if (wpsg_isSizedArray($res['Destination']['PhysicalDestination']['AddressLine2'])) $res['Destination']['PhysicalDestination']['AddressLine1'] = implode(' ', $res['Destination']['PhysicalDestination']['AddressLine2']);
-
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['strasse'])) $_SESSION['wpsg']['checkout']['strasse'] = ltrim(implode(', ', array(
-                                wpsg_getStr($res['Destination']['PhysicalDestination']['AddressLine1']),
-                                wpsg_getStr($res['Destination']['PhysicalDestination']['AddressLine2']),
-                        )), ', ');
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['plz'])) $_SESSION['wpsg']['checkout']['plz'] = $res['Destination']['PhysicalDestination']['PostalCode'];
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['ort'])) $_SESSION['wpsg']['checkout']['ort'] = $res['Destination']['PhysicalDestination']['City'];
-
-                        // Land wenn gefunden
-                        $country_id = wpsg_country::getCountryIDFromCode($res['Destination']['PhysicalDestination']['CountryCode']);
-                        if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land']) && wpsg_isSizedString($country_id)) $_SESSION['wpsg']['checkout']['land'] = $country_id;
-
-                    }
-
-                }
-                */
-
-                $this->shop->basket->initFromSession(true);
-                $check1 = $this->shop->basket->checkCheckout(1);
-
-                if ($check1 === true)
-                {
-
-                    $check2 = $this->shop->basket->checkCheckout(2);
-
-                    if ($check2 === true)
-                    {
-
-                        $this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_OVERVIEW));
-
-                    }
-                    else
-                    {
-
-                        $this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_CHECKOUT2));
-
-                    }
-
-                }
-                else
-                {
-
-                    $this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_CHECKOUT));
-
-                }
-
-            }
-
-            if ($bError) return -2;
-
-        } // public function basket_checkoutAction(&$basketController)
-
-        public function addPayment(&$arPayment)
-        {
-
-            if (is_admin() || $this->shop->get_option('wpsg_mod_amazon_aktiv') == '1') {
-
-                $arPayment[$this->id] = array(
-                    'id' => $this->id,
-                    'name' => __($this->shop->get_option('wpsg_mod_amazon_name'), 'wpsg'),
-                    'price' => $this->shop->get_option('wpsg_mod_amazon_gebuehr'),
-                    'tax_key' => $this->shop->get_option('wpsg_mod_amazon_mwst'),
-                    'mwst_null' => $this->shop->get_option('wpsg_mod_amazon_mwstland'),
-                    'hint' => __($this->shop->get_option('wpsg_mod_amazon_hint'), 'wpsg'),
-                    'logo' => $this->shop->getRessourceURL('mods/mod_amazon/gfx/logo_100x25.png')
-                );
-
-            }
-
-        } // public function addPayment(&$arPayment)
-
-        /* Redirect */
-
-        public function ipnRedirect() {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/IpnHandler.php';
-
-            $headers = getallheaders();
-            $body = file_get_contents('php://input');
-
-            $ipnHandler = new \AmazonPay\IpnHandler($headers, $body);
-            $ipnData = $ipnHandler->toArray();
-
-            if (wpsg_isSizedArray($ipnData) && wpsg_isSizedString($ipnData['NotificationType'], 'PaymentCapture')) {
-
-                $order_id = $ipnData['CaptureDetails']['CaptureReferenceId'];
-                $oOrder = wpsg_order::getInstance($order_id);
-
-                $oOrder->addLogEntry(
-                    __('Amazon IPN Eingang', 'wpsg'),
-                    print_r($ipnData, true).print_r(getallheaders(), true)
-                );
-
-                if ($this->shop->setPayMent($order_id, $ipnData['CaptureDetails']['CaptureAmount']['Amount']) && wpsg_isSizedString($ipnData['CaptureDetails']['CaptureStatus']['State'], 'Completed')) {
-
-                    $oOrder->setMeta('amazon_capture_id', $ipnData['CaptureDetails']['AmazonCaptureId']);
-                    $this->shop->setOrderStatus($order_id, 100, true);
-
-                }
-
-            }
-
-        } // public function ipnRedirect()
-
-        public function logoutRedirect()
-        {
-
-            $this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_BASKET));
-
-        } // public function logoutRedirect()
-
-        public function returnRedirect() {
-
-            if (wpsg_isSizedInt($_REQUEST['order_id']) && wpsg_isSizedString($_REQUEST['wpsg_done'])) {
-
-                $_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
-
-                if (wpsg_isSizedString($_REQUEST['amazon']['OrderReference'])) {
-
-                    $oOrder = wpsg_order::getInstance($_REQUEST['order_id']);
-
-                    $hash = md5($oOrder->__get('secret').$oOrder->getId().$oOrder->__get('secret'));
-                    if (!hash_equals($hash, rawurldecode($_REQUEST['wpsg_done']))) die(__('Aufrufsfehler!!', 'wpsg'));
-
-                    $oOrder->setMeta('amazon_order_reference_id', $_REQUEST['amazon']['OrderReference']);
-
-                }
-
-                $this->shop->redirect($this->shop->getDoneURL($_REQUEST['order_id']));
-
-            }
-
-            if (!wpsg_isSizedInt($_SESSION['wpsg']['order_id'])) {
-
-                $this->shop->basket->initFromSession();
-                $this->shop->basket->save(false, false, true);
-
-            }
-
-            $oOrder = wpsg_order::getInstance($_SESSION['wpsg']['order_id']);
-            $oOrder->setMeta('amazon_last_authorization_reference_id', $_REQUEST['access_token']);
-
-            $_SESSION['wpsg']['checkout']['payment'] = $this->id;
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_sandbox'))) $c = curl_init('https://api.sandbox.amazon.com/auth/o2/tokeninfo?access_token='. urlencode($_REQUEST['access_token']));
-            else $c = curl_init('https://api.amazon.com/auth/o2/tokeninfo?access_token='. urlencode($_REQUEST['access_token']));
-
-            curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
-            curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
-
-            $r = curl_exec($c); curl_close($c); $d = json_decode($r);
-
-            if ($d->aud != $this->shop->get_option('wpsg_mod_amazon_lwa_client_id'))
-            {
-
-                die("Amazon API Fehler!");
-                exit;
-
-            }
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_sandbox'))) $c = curl_init('https://api.sandbox.amazon.com/user/profile');
-            else $c = curl_init('https://api.amazon.com/user/profile');
-
-            curl_setopt($c, CURLOPT_HTTPHEADER, array('Authorization: bearer '.$_REQUEST['access_token']));
-
-            curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
-            curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
-
-            $r = curl_exec($c); curl_close($c); $d = json_decode($r);
-
-            $_SESSION['wpsg']['checkout']['email'] = $d->email;
-            $_SESSION['wpsg']['checkout']['email2'] = $d->email;
-
-            $this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_BASKET));
-
-        } // public function returnRedirect()
-
-        // Modulfunktionen
-
-        private function api_finishPayment($order_id)
-        {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->confirmOrderReference(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('amazon_order_reference_id'),
-                'mws_auth_token' => $oOrder->getMeta('amazon_last_authorization_reference_id')
-            ));
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugMowpdus'))) $oOrder->log('Amazon:confirmOrderReference', print_r($oResponse->toArray(), 1));
-
-            return $oResponse->toArray();
-
-        } // private function api_finishPayment($order_id)
-
-        private function api_getPayment($order_id)
-        {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->getOrderReferenceDetails(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('amazon_order_reference_id'),
-                'address_consent_token' => $oOrder->getMeta('amazon_last_authorization_reference_id')
-            ));
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugModus'))) $oOrder->log('Amazon:getOrderReferenceDetails', print_r($oResponse->toArray(), 1));
-
-            return $oResponse->toArray();
-
-        } // private function api_getPayment($order_id)
-
-        private function api_setPayment($order_id)
-        {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->setOrderReferenceDetails(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('amazon_order_reference_id'),
-                'amount' => $oOrder->getToPay(),
-                'seller_order_id' => $oOrder->id,
-                'mws_auth_token' => $oOrder->getMeta('amazon_last_authorization_reference_id'),
-                'seller_note' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_amazon_subject'), 'wpsg'), $order_id),
-                'currency_code' => 'EUR'
-            ));
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugModus'))) $oOrder->log('Amazon:setOrderReferenceDetails', print_r($oResponse->toArray(), 1));
-
-            return $oResponse->toArray();
-
-        } // private function api_setPayment($order_id)
-
-        private function api_capturePayment($order_id)
-        {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->authorize(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('amazon_order_reference_id'),
-                'authorization_amount' => $oOrder->getToPay(),
-                'authorization_reference_id' => $order_id,
-                'soft_descriptor' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_amazon_subject'), 'wpsg'), $order_id),
-                'seller_authorization_note' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_amazon_subject'), 'wpsg'), $order_id),
-                'currency_code' => 'EUR',
-                'capture_now' => true
-            ));
-
-            $arReturn = $oResponse->toArray();
-
-            if (wpsg_isSizedString($arReturn['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId'])) $oOrder->setMeta('amazon_capture_id', $arReturn['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId']);
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugModus'))) $oOrder->log('Amazon:authorize', print_r($arReturn, 1));
-
-            return $arReturn;
-
-        } // private function api_capturePayment($order_id)
-
-        private function api_closePayment($order_id)
-        {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->closeOrderReference(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('amazon_order_reference_id'),
-                'closure_reason' => '',
-                'mws_auth_token' => $oOrder->getMeta('amazon_last_authorization_reference_id')
-            ));
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugModus'))) $oOrder->log('Amazon:closeOrderReference', print_r($oResponse->toArray(), 1));
-
-            return $oResponse->toArray();
-
-        } // private function api_closePayment($order_id)
-
-        private function api_cancelPayment($order_id)
-        {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->cancelOrderReference(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('amazon_order_reference_id')
-            ));
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugModus'))) $oOrder->log('Amazon:cancelOrderReference', print_r($oResponse->toArray(), 1));
-
-            return $oResponse->toArray();
-
-        } // private function api_cancelPayment($order_id)
-
-        private function api_refund($order_id) {
-
-            require_once WPSG_PATH_MOD.'mod_amazon/PayWithAmazon/Client.php';
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = new AmazonPay\Client($this->getAPIConfig());
-
-            $oResponse = $client->refund(array(
-                'amazon_capture_id' => $oOrder->getMeta('amazon_capture_id'),
-                'refund_reference_id' => 'R'.$oOrder->id,
-                'refund_amount' => $oOrder->getToPay(),
-                'currency_code' => 'EUR',
-                'seller_refund_note' => 'STORNO'
-            ));
-
-            $arReturn = $oResponse->toArray();
-
-            $oOrder->addLogEntry('Amazon Storno', print_r($arReturn, true));
-
-            if (wpsg_isSizedString($arReturn['RefundResult']['RefundDetails']['AmazonRefundId'])) {
-
-                $oOrder->setMeta('amazon_refund_id', $arReturn['RefundResult']['RefundDetails']['AmazonRefundId']);
-                $oOrder->setMeta('amazon_capture_id', null);
-
-            }
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_debugModus'))) $oOrder->log('Amazon:refund', print_r($arReturn, 1));
-
-            return $arReturn;
-
-        } // private function api_refund($order_id)
-
-        private function getAPIConfig()
-        {
-
-            $config = array(
-                'merchant_id' => $this->shop->get_option('wpsg_mod_amazon_seller_id'),
-                'access_key' => $this->shop->get_option('wpsg_mod_amazon_mws_access_key_id'),
-                'secret_key' => $this->shop->get_option('wpsg_mod_amazon_mws_access_key'),
-                'region' => 'de',
-                'sandbox' => ((wpsg_isSizedInt($this->shop->get_option('wpsg_mod_amazon_sandbox')))?true:false)
-            );
-
-            return $config;
-
-        } // private function getAPIConfig()
-
-    } // class wpsg_mod_amazon extends wpsg_mod_basic
Index: ds/wpsg_mod_amazon_v2.class.php
===================================================================
--- /mods/wpsg_mod_amazon_v2.class.php	(revision 8528)
+++ 	(revision )
@@ -1,718 +1,0 @@
-<?php
-
-    /**
-     * Modul fÃŒr "Bezahlen mit Amazon"
-     * @author Daschmi (12.03.2016)
-     */
-    class wpsg_mod_amazon_v2 extends wpsg_mod_basic {
-
-        var $lizenz = 1;
-        var $id = 3141;
-        var $hilfeURL = 'http://wpshopgermany.de/?p=3462587';
-        var $version = "9.9.9";
-        var $free = false;
-
-        public function __construct() {
-
-            parent::__construct();
-
-            $this->name = __('AmazonPay V2', 'wpsg');
-            $this->group = __('Zahlungsarten', 'wpsg');
-            $this->desc = __('ErmÃ¶glicht die Anmeldung / Zahlung mit Amazon.', 'wpsg');
-
-        } // public function __construct()
-
-        public function install() {
-
-            $this->shop->checkDefault('wpsg_mod_amazon_v2_aktiv', '1');
-            $this->shop->checkDefault('wpsg_mod_amazon_v2_name', __('AmazonPay', 'wpsg'), false, true);
-            $this->shop->checkDefault('wpsg_mod_amazon_v2_hint', __('Bezahlen Sie ihre Bestellung einfach mit ihrem Amazon Konto.', 'wpsg'), false, true);
-            $this->shop->checkDefault('wpsg_mod_amazon_v2_subject', __('O%order_id% - K%kunde_id%', 'wpsg'), false, true);
-
-        } // public function install()
-
-        public function settings_edit() {
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon_v2/settings_edit.phtml');
-
-        } // public function settings_edit()
-
-        public function settings_save() {
-
-            $this->shop->update_option('wpsg_mod_amazon_v2_seller_id', $_REQUEST['wpsg_mod_amazon_v2_seller_id'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_v2_store_id', $_REQUEST['wpsg_mod_amazon_v2_store_id'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_amazon_v2_public_key_id', $_REQUEST['wpsg_mod_amazon_v2_public_key_id'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-            if (isset($_FILES['wpsg_mod_amazon_v2_private_key']) && file_exists(($_FILES['wpsg_mod_amazon_v2_private_key']['tmp_name']))) {
-
-                $b = move_uploaded_file($_FILES['wpsg_mod_amazon_v2_private_key']['tmp_name'], $this->getKey(true).'/key.pem');
-
-                if ($b) $this->shop->addBackendMessage(__('Upload der SchlÃŒsseldatei war erfolgreich.', 'wpsg'));
-                else $this->shop->addBackendError(__('Beim Upload der SchlÃŒsseldatei gab es ein Problem.', 'wpsg'));
-
-            }
-
-            $this->shop->update_option('wpsg_mod_amazon_v2_sandbox', $_REQUEST['wpsg_mod_amazon_v2_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-            $this->shop->update_option('wpsg_mod_amazon_v2_aktiv', $_REQUEST['wpsg_mod_amazon_v2_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-            $this->shop->update_option('wpsg_mod_amazon_v2_name', $_REQUEST['wpsg_mod_amazon_v2_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_amazon_v2_subject', $_REQUEST['wpsg_mod_amazon_v2_subject'], false, true, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_amazon_v2_hint', $_REQUEST['wpsg_mod_amazon_v2_hint'], false, true, WPSG_SANITIZE_TEXTFIELD);
-
-            $this->shop->update_option('wpsg_mod_amazon_v2_gebuehr', $_REQUEST['wpsg_mod_amazon_v2_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-            $this->shop->update_option('wpsg_mod_amazon_v2_mwst', $_REQUEST['wpsg_mod_amazon_v2_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-            $this->shop->update_option('wpsg_mod_amazon_v2_mwstland', $_REQUEST['wpsg_mod_amazon_v2_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-        } // public function settings_save()
-
-        public function basket_checkoutAction(&$basketController) {
-
-            if (wpsg_isSizedString($_REQUEST['amazon']['OrderReference'])) {
-
-                $_SESSION['wpsg_mod_amazon_v2_order_reference'] = $_REQUEST['amazon']['OrderReference'];
-
-            }
-
-        }
-
-        public function basket_inner_prebutton(&$basket_view) {
-
-            $view = $this->getPaymentButton($this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon_v2', 'checkoutReviewReturnUrl', [], true));
-
-            $this->shop->view['wpsg_mod_amazon'] = $view;
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon_v2/basket_inner_prebutton.phtml');
-
-        }
-
-        public function addPayment(&$arPayment) {
-
-            if (is_admin() || $this->shop->get_option('wpsg_mod_amazon_v2_aktiv') == '1') {
-
-                $arPayment[$this->id] = array(
-                    'id' => $this->id,
-                    'name' => __($this->shop->get_option('wpsg_mod_amazon_v2_name'), 'wpsg'),
-                    'price' => $this->shop->get_option('wpsg_mod_amazon_v2_gebuehr'),
-                    'tax_key' => $this->shop->get_option('wpsg_mod_amazon_v2_mwst'),
-                    'mwst_null' => $this->shop->get_option('wpsg_mod_amazon_v2_mwstland'),
-                    'hint' => __($this->shop->get_option('wpsg_mod_amazon_v2_hint'), 'wpsg'),
-                    'logo' => $this->shop->getRessourceURL('mods/mod_amazon_v2/gfx/logo_100x25.png')
-                );
-
-            }
-
-        }
-
-        public function order_done(&$order_id, &$done_view) {
-
-            // Bestellungen mit 0 geben nix aus
-            if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            // Bestellungen die nicht mit Amazon beglichen werden sollen ignorieren
-            if ($oOrder->getPaymentID() != $this->id) return;
-
-            $view['order_id'] = $order_id;
-
-            if (isset($_SESSION['wpsg_mod_amazon_v2_order_reference'])) {
-
-                $oOrder->setMeta('mod_amazon_v2_order_reference', $_SESSION['wpsg_mod_amazon_v2_order_reference']);
-                unset($_SESSION['wpsg_mod_amazon_v2_order_reference']);
-
-            }
-
-            if (isset($_SESSION['wpsg_mod_amazon_v2_amazonCheckoutSessionId'])) {
-
-                $oOrder->setMeta('mod_amazon_v2_session', $_SESSION['wpsg_mod_amazon_v2_amazonCheckoutSessionId']);
-                unset($_SESSION['wpsg_mod_amazon_v2_amazonCheckoutSessionId']);
-
-            }
-
-            if ($oOrder->getMeta('mod_amazon_v2_session') !== '') {
-
-                $res = $this->getPaymentInfo($order_id, true);
-
-                $view['state'] = $res['statusDetails']['state'];
-
-                if ($view['state'] === 'Completed') {
-
-                } else if ($view['state'] === 'Open') {
-
-                    $res = $this->updatePayment($order_id);
-
-                    $view['session_id'] = $oOrder->getMeta('mod_amazon_v2_session');
-                    $view['payURL'] = $res['webCheckoutDetails']['amazonPayRedirectUrl'];
-
-                } else {
-
-                    //$res = $this->updatePayment($order_id);
-                    //echo '<a href="'.$res['webCheckoutDetails']['amazonPayRedirectUrl'].'">PAY</a>';
-
-                    //$res = $this->completePayment($order_id);
-
-                    die(wpsg_debug($res));
-
-                }
-
-            } else {
-
-                $view['state'] = 'Unpayed';
-
-                $view += $this->getPaymentButton(
-                    $this->shop->getDoneURL($oOrder->getId(), 'wpsg_mod_amazon_v2', 'checkoutOrderDone')
-                );
-
-            }
-
-            $this->shop->view['wpsg_mod_amazon_v2'] = $view;
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon_v2/order_done.phtml');
-
-        }
-
-        public function order_view_afterpayment(&$order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            if ($oOrder->getPaymentID() != $this->id) return;
-
-            $view = [
-                'chargeId' => $oOrder->getMeta('mod_amazon_v2_chargeId'),
-                'refundId' => $oOrder->getMeta('mod_amazon_v2_refundId'),
-                'refundState' => $oOrder->getMeta('mod_amazon_v2_refundState'),
-                'sesion_id' => $oOrder->getMeta('mod_amazon_v2_session'),
-                'state' => $oOrder->getMeta('mod_amazon_v2_state'),
-                'referenceID' => $oOrder->getMeta('mod_amazon_v2_AmazonOrderReferenceId')
-            ];
-
-            $this->shop->view['wpsg_mod_amazon_v2'] = $view;
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon_v2/order_view_afterpayment.phtml');
-
-        }
-
-        public function order_ajax() {
-
-            $order_id = intval($_REQUEST['edit_id']);
-            $do = $_REQUEST['do'];
-
-            if (wpsg_isSizedString($do, 'update')) {
-
-                $this->getPaymentInfo($order_id);
-
-                $this->shop->addBackendMessage(__('Status abgefragt.', 'wpsg'));;
-
-            } else if (wpsg_isSizedString($do, 'updateRefund')) {
-
-                try {
-
-                    $this->getRefundInfo($order_id);
-                    $this->shop->addBackendMessage(__('Erstattungsstatus abgefragt.', 'wpsg'));
-
-                } catch (\Exception $e) {
-
-                    $this->shop->addBackendError(
-                        wpsg_translate(__('Es ist ein Fehler aufgetreten: #1#', 'wpsg'), $e->getMessage())
-                    );
-
-                }
-
-            } else if (wpsg_isSizedString($do, 'refund')) {
-
-                $oOrder = wpsg_order::getInstance($order_id);
-
-                if ($oOrder->getMeta('mod_amazon_v2_chargeId') !== '') {
-
-                    $this->refundPayment($order_id);
-
-                    $this->shop->addBackendMessage(__('RÃŒckzahlung veranlasst.', 'wpsg'));;
-
-                } else {
-
-                    $this->shop->addBackendError(__('RÃŒckzahlung nicht mÃ¶glich.', 'wpsg'));
-
-                }
-
-            }
-
-            $this->shop->redirect(wpsg_admin_url('Order', 'view', ['edit_id' => $order_id]));
-
-        }
-
-        /* Redirect */
-
-        /**
-         * Wird fÃŒr die Variante mit den Iframes aufgerufen nach der Bestellung
-         * https://developer.amazon.com/de/docs/eu/amazon-pay-onetime/sca-upgrade.html?ld=APNALPADirect
-         * Schritt 2ff
-         */
-        public function placeOrderRedirect() {
-
-            $order_id = intval($_REQUEST['order_id']);
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            $client = $this->getOriginClientApi();
-
-            // Schritt 2
-            $requestParameters = [];
-            $requestParameters['amazon_order_reference_id'] = $oOrder->getMeta('mod_amazon_v2_order_reference');
-            $requestParameters['amount'] = $oOrder->getToPay(WPSG_BRUTTO);
-            $requestParameters['currency_code'] = 'EUR';
-            $requestParameters['seller_note'] = 'Thank you for your order.';
-            $requestParameters['store_name'] = 'Name of your shop';
-            $requestParameters['seller_order_id'] = $oOrder->getNr();
-
-            $res = $client->SetOrderAttributes($requestParameters)->toArray();
-            $oOrder->addLogEntry('AmazonPay SetOrderAttributes', print_r($res, true));
-
-            if (isset($res['SetOrderAttributesResult']['OrderReferenceDetails']['AmazonOrderReferenceId'])) $oOrder->setMeta('mod_amazon_v2_AmazonOrderReferenceId', $res['SetOrderAttributesResult']['OrderReferenceDetails']['AmazonOrderReferenceId']);
-
-            // Schritt 3
-            $requestParameters = [];
-            $requestParameters['amazon_order_reference_id'] = $oOrder->getMeta('mod_amazon_v2_order_reference');
-            $requestParameters['success_url'] = $this->shop->getDoneURL($oOrder->getId(), 'wpsg_mod_amazon_v2', 'placeOrderSuccess');
-            $requestParameters['failure_url'] = $this->shop->getDoneURL($oOrder->getId(), 'wpsg_mod_amazon_v2', 'placeOrderFailure');
-
-            $res = $client->confirmOrderReference($requestParameters)->toArray();
-            $oOrder->addLogEntry('AmazonPay confirmOrderReference', print_r($res, true));
-
-        }
-
-        public function placeOrderSuccessRedirect() {
-
-            $order_id = intval($_REQUEST['order_id']);
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            $client = $this->getOriginClientApi();
-
-            // Authorize
-            $res = $client->authorize([
-                'amazon_order_reference_id' => $oOrder->getMeta('mod_amazon_v2_order_reference'),
-                'authorization_amount' => $oOrder->getToPay(),
-                'authorization_reference_id' => uniqid('Authorization-'.$oOrder->getId()),
-                'soft_descriptor' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_amazon_subject'), 'wpsg'), $order_id),
-                'seller_authorization_note' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_amazon_subject'), 'wpsg'), $order_id),
-                'currency_code' => 'EUR',
-                'capture_now' => true
-            ])->toArray();
-
-            if (isset($res['Error'])) {
-
-                $oOrder->addLogEntry('AmazonPay Error', print_r($res, true));
-
-                throw new \Exception($res['Error']['Message']);
-
-            } else $oOrder->addLogEntry('AmazonPay Authorize', print_r($res, true));
-
-            if (isset($res['AuthorizeResult']['AuthorizationDetails']['IdList']['member'])) $oOrder->setMeta('mod_amazon_v2_chargeId', $res['AuthorizeResult']['AuthorizationDetails']['IdList']['member']);
-
-            $AmazonAuthorizationId = $res['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId'];
-            $oOrder->setMeta('wpsg_mod_amazon_v2_amazon_authorization_id', $AmazonAuthorizationId);
-
-            // Capture
-            /*
-            $res = $client->capture([
-                'amazon_authorization_id' => $AmazonAuthorizationId,
-                'capture_amount' => $oOrder->getToPay(),
-                'currency_code' => 'EUR',
-                'capture_reference_id' => uniqid('Capture-'.$oOrder->getId())
-            ]);
-
-            wpsg_debug($res->toArray());
-            */
-
-            $res = $client->closeOrderReference(array(
-                'amazon_order_reference_id' => $oOrder->getMeta('mod_amazon_v2_order_reference'),
-                'closure_reason' => ''
-            ));
-
-            $oOrder->addLogEntry('AmazonPay closeOrder', print_r($res, true));
-
-            $this->shop->redirect($this->shop->getDoneURL($oOrder->getId()));
-
-        }
-
-        public function placeOrderFailureRedirect() {
-
-            die(wpsg_debug($_REQUEST));
-
-        }
-
-        public function loginRedirect() {
-
-            $_SESSION['wpsg']['checkout']['payment'] = $this->id;
-            $_SESSION['wpsg_mod_amazon_v2_access_token'] = $_REQUEST['access_token'];
-
-            $this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-
-        }
-
-        public function checkoutReviewReturnUrlRedirect() {
-
-            $client = $this->getClientApi();
-            $result = $client->getCheckoutSession($_REQUEST['amazonCheckoutSessionId']);
-            $res = json_decode($result['response'], true);
-
-            if (is_array($res)) {
-
-                $_SESSION['wpsg_mod_amazon_v2_amazonCheckoutSessionId'] = $_REQUEST['amazonCheckoutSessionId'];
-
-                // Zahlungsart
-                $_SESSION['wpsg']['checkout']['payment'] = $this->id;
-
-                // EMail
-                if (wpsg_isSizedString($res['buyer']['email'])) {
-
-                    $_SESSION['wpsg']['checkout']['email'] = $res['buyer']['email'];
-                    $_SESSION['wpsg']['checkout']['email2'] = $res['buyer']['email'];
-
-                }
-
-                // Rechnungsadresse
-                list($vname, $name) = wpsg_explodeName($res['billingAddress']['name']);
-
-                if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['vname'])) $_SESSION['wpsg']['checkout']['vname'] = $vname;
-                if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['name'])) $_SESSION['wpsg']['checkout']['name'] = $name;
-
-                for ($i = 1; $i <= 3; $i ++) {
-
-                    if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['strasse']) && wpsg_isSizedString($res['billingAddress']['addressLine'.$i])) $_SESSION['wpsg']['checkout']['strasse'] = $res['billingAddress']['addressLine'.$i];
-
-                }
-
-                if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['plz'])) $_SESSION['wpsg']['checkout']['plz'] = $res['billingAddress']['postalCode'];
-                if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['ort'])) $_SESSION['wpsg']['checkout']['ort'] = $res['billingAddress']['city'];
-                if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['tel'])) $_SESSION['wpsg']['checkout']['tel'] = $res['billingAddress']['phoneNumber'];
-
-                // Land wenn gefunden
-                $country_id = wpsg_country::getCountryIDFromCode($res['billingAddress']['countryCode']);
-                if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land']) && wpsg_isSizedString($country_id)) $_SESSION['wpsg']['checkout']['land'] = $country_id;
-
-                // Lieferadresse
-                if (wpsg_isSizedArray($res['shippingAddress'])) {
-
-                    if ($this->shop->hasMod('wpsg_mod_shippingadress')) {
-
-                        list($vname, $name) = wpsg_explodeName($res['shippingAddress']['name']);
-
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_vname'])) $_SESSION['wpsg']['checkout']['shipping_vname'] = $vname;
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_name'])) $_SESSION['wpsg']['checkout']['shipping_name'] = $name;
-
-                        for ($i = 1; $i <= 3; $i ++) {
-
-                            if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_strasse']) && wpsg_isSizedString($res['billingAddress']['addressLine'.$i])) $_SESSION['wpsg']['checkout']['shipping_strasse'] = $res['shippingAddress']['addressLine'.$i];
-
-                        }
-
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_plz'])) $_SESSION['wpsg']['checkout']['shipping_plz'] = $res['shippingAddress']['postalCode'];
-                        if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping_ort'])) $_SESSION['wpsg']['checkout']['shipping_ort'] = $res['shippingAddress']['city'];
-
-                        // Land wenn gefunden
-                        $country_id = wpsg_country::getCountryIDFromCode($res['shippingAddress']['countryCode']);
-                        if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land']) && wpsg_isSizedString($country_id)) $_SESSION['wpsg']['checkout']['shipping_land'] = $country_id;
-
-                    }
-
-                }
-
-            }
-
-            $this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_OVERVIEW));
-
-        }
-
-        public function checkoutResultReturnUrlRedirect()  {
-
-            $oOrder = wpsg_order::getInstance(intval($_REQUEST['order_id']));
-
-            $res = $this->completePayment($oOrder->getId());
-
-            if ($res['statusDetails']['state'] !== 'Completed') {
-
-                $this->shop->addFrontendError(__('Es gab Probleme mit der Zahlung ÃŒber Amazon Pay.', 'wpsg'));
-
-            }
-
-            $this->shop->redirect($this->shop->getDoneURL($oOrder->getId()));
-
-        }
-
-        /**
-         * Wenn die Zahlung nach der Bestellung ausgelÃ¶st wurde
-         * @throws Exception
-         */
-        public function checkoutOrderDoneRedirect() {
-
-            $oOrder = wpsg_order::getInstance(intval($_REQUEST['order_id']));
-
-            $client = $this->getClientApi();
-            $result = $client->getCheckoutSession($_REQUEST['amazonCheckoutSessionId']);
-            $res = json_decode($result['response'], true);
-
-            if (is_array($res)) {
-
-                $oOrder->setMeta('mod_amazon_v2_session', $_REQUEST['amazonCheckoutSessionId']);
-                $res = $this->updatePayment($oOrder->getId());
-
-                $this->shop->redirect($res['webCheckoutDetails']['amazonPayRedirectUrl']);
-
-            }
-
-        }
-
-        /*
-        public function handle_order() {
-
-            $client = $this->getClientApi();
-
-            $res = $client->getCheckoutSession($_SESSION['wpsg_mod_amazon_v2_amazonCheckoutSessionId']);
-            die(wpsg_debug(json_decode($res['response'], true)));
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_amazon_v2/overview_button.phtml');
-
-            return -2;
-
-        } */
-
-        /* */
-
-        // Modulfunktionen
-
-        private function getPaymentButton($url) {
-
-            $payload = json_encode([
-                'webCheckoutDetails' => [
-                    'checkoutReviewReturnUrl' => $url
-                ],
-                'storeId' => $this->shop->get_option('wpsg_mod_amazon_v2_store_id'),
-                'deliverySpecifications' => [
-
-                ]
-            ]);
-
-            $client = $this->getClientApi();
-            $signature = $client->generateButtonSignature($payload);
-
-            return [
-                'payload' => $payload,
-                'signature' => $signature
-            ];
-
-        }
-
-        private function getPaymentInfo($order_id, $noLog = false) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = $this->getClientApi();
-
-            $session_id = $oOrder->getMeta('mod_amazon_v2_session');
-
-            if (!wpsg_isSizedString($session_id)) throw new \Exception(__('Keine Amaonz Payments Session ID vorhanden.', 'wpsg'));
-
-            $res = $client->getCheckoutSession($oOrder->getMeta('mod_amazon_v2_session'))['response'];
-            $res = json_decode($res, true);
-
-            if (isset($res['reasonCode'])) {
-
-                $oOrder->addLogEntry(__('AmazonPay Error', 'wpsg'), print_r($res, true));
-
-                throw new \Exception($res['reasonCode']);
-
-            } else {
-
-                if (!$noLog) $oOrder->addLogEntry(__('AmazonPay PaymentInfo', 'wpsg'), print_r($res, true));
-
-                if (isset($res['statusDetails']['state'])) $oOrder->setMeta('mod_amazon_v2_state', $res['statusDetails']['state']);
-
-                return $res;
-
-            }
-
-        }
-
-        /**
-         * @param int $order_id
-         * @throws Exception
-         * @return Array
-         */
-        private function getRefundInfo($order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $client = $this->getClientApi();
-
-            $refund_id = $oOrder->getMeta('mod_amazon_v2_refundId');
-
-            if (!wpsg_isSizedString($refund_id)) throw new \Exception(__('Keine RefundID fÃŒr Amazon RÃŒckbuchung gesetzt.', 'wpsg'));
-
-            $res = $client->getRefund($refund_id);
-            $res = json_decode($res['response'], true);
-
-            if (isset($res['reasonCode'])) {
-
-                $oOrder->addLogEntry(__('AmazonPay Error', 'wpsg'), print_r($res, true));
-
-                throw new \Exception($res['reasonCode']);
-
-            } else {
-
-                if (isset($res['statusDetails']['state'])) $oOrder->setMeta('mod_amazon_v2_refundState', $res['statusDetails']['state']);
-
-                $oOrder->addLogEntry(__('AmazonPay RefundInfo', 'wpsg'), print_r($res, true));
-
-                return $res;
-
-            }
-
-        }
-
-        private function completePayment($order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            $payload = json_encode([
-                'chargeAmount' => [
-                    'amount' => $oOrder->getToPay(),
-                    'currencyCode' => 'EUR'
-                ]
-            ]);
-
-            $client = $this->getClientApi();
-
-            $res = json_decode($client->completeCheckoutSession($oOrder->getMeta('mod_amazon_v2_session'), $payload)['response'], true);
-
-            if (isset($res['statusDetails']['state'])) $oOrder->setMeta('mod_amazon_v2_state', $res['statusDetails']['state']);
-            if (isset($res['chargeId'])) $oOrder->setMeta('mod_amazon_v2_chargeId', $res['chargeId']);
-            if (isset($res['chargePermissionId'])) $oOrder->setMeta('mod_amazon_v2_AmazonOrderReferenceId', $res['chargePermissionId']);
-
-            $oOrder->addLogEntry(__('AmazonPay CompletePayment', 'wpsg'), print_r($res, true));
-
-            if ($res['statusDetails']['state'] === 'Completed') {
-
-                if ($oOrder->__get('ext_payed')  !== '1') {
-
-                    $this->shop->setOrderStatus($oOrder->id, 100, true);
-                    $this->db->UpdateQuery(WPSG_TBL_ORDER, ['ext_payed' => '1'], " `id` = '".wpsg_q($oOrder->getId())."' ");
-
-                }
-
-            }
-
-            return $res;
-
-        }
-
-        private function updatePayment($order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            $payload = json_encode([
-                'webCheckoutDetails' => [
-                    'checkoutResultReturnUrl' => $this->shop->getDoneURL($oOrder->getId(), 'wpsg_mod_amazon_v2', 'checkoutResultReturnUrl')
-                ],
-                'paymentDetails' => [
-                    'paymentIntent' => 'AuthorizeWithCapture',
-                    'canHandlePendingAuthorization' => false,
-                    'softDescriptor' => 'Descriptor',
-                    'chargeAmount' => [
-                        'amount' => $oOrder->getToPay(),
-                        'currencyCode' => 'EUR'
-                    ]
-                ],
-                'merchantMetadata' => [
-                    'merchantReferenceId' => $oOrder->getNr(),
-                    'merchantStoreName' => $this->shop->get_option('wpsg_shopdata_name')
-                ]
-            ]);
-
-            $client = $this->getClientApi();
-
-            $res = json_decode($client->updateCheckoutSession($oOrder->getMeta('mod_amazon_v2_session'), $payload)['response'], true);
-
-            if (isset($res['statusDetails']['state'])) $oOrder->setMeta('mod_amazon_v2_state', $res['statusDetails']['state']);
-
-            $oOrder->addLogEntry(__('AmazonPay UpdatePayment', 'wpsg'), print_r($res, true));
-
-            return $res;
-
-        }
-
-        private function refundPayment($order_id) {
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $refund_key = $oOrder->getMeta('mod_amazon_v2_refund_key');
-
-            if ($refund_key === '') {
-
-                $refund_key = wpsg_genCode(32);
-                $oOrder->setMeta('mod_amazon_v2_refund_key', $refund_key);
-
-            }
-
-            $chargeID = $oOrder->getMeta('mod_amazon_v2_chargeId');
-
-            $payload = json_encode([
-                'chargeId' => $chargeID,
-                'refundAmount' => [
-                    'amount' => $oOrder->getToPay(WPSG_BRUTTO),
-                    'currencyCode' => 'EUR'
-                ],
-                'softDescriptor' => substr('Refund '.$oOrder->getNr(), 0, 16)
-            ]);
-
-            $client = $this->getClientApi();
-
-            $res = $client->createRefund($payload, ['x-amz-pay-idempotency-key' => $refund_key]);
-            $res = json_decode($res['response'], true);
-
-            if (isset($res['statusDetails']['state'])) $oOrder->setMeta('mod_amazon_v2_refundState', $res['statusDetails']['state']);
-            if (isset($res['refundId'])) $oOrder->setMeta('mod_amazon_v2_refundId', $res['refundId']);
-
-            $oOrder->addLogEntry(__('AmazonPay RefundPayment', 'wpsg'), print_r($res, true));
-
-            return $res;
-
-        }
-
-        /**
-         * @return \Amazon\Pay\API\Client
-         * @throws Exception
-         */
-        private function getClientApi() {
-
-            require_once __DIR__.'/mod_amazon_v2/vendor/autoload.php';
-
-            $amazonpay_config = [
-                'public_key_id' => $this->shop->get_option('wpsg_mod_amazon_v2_public_key_id'),
-                'private_key' => $this->getKey(),
-                'region' => 'EU',
-                'sandbox' => $this->shop->get_option('wpsg_mod_amazon_v2_sandbox') === '1'
-            ];
-
-            return new Amazon\Pay\API\Client($amazonpay_config);
-
-        }
-
-        private function getKey($path_only = false) {
-
-            if ($this->shop->isMultiBlog()) {
-
-                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_mod_amazon/';
-
-            } else {
-
-                $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_mod_amazon/';
-
-            }
-
-            $this->shop->protectDirectory($path);
-
-            if ($path_only) return $path;
-
-            $path .= 'key.pem';
-
-            if (!file_exists($path)) throw new \Exception(__('Amazon Public Key existiert nicht.'));
-
-            return $path;
-
-        }
-
-    }
Index: /mods/wpsg_mod_auftragsbestaetigung.class.php
===================================================================
--- /mods/wpsg_mod_auftragsbestaetigung.class.php	(revision 8528)
+++ /mods/wpsg_mod_auftragsbestaetigung.class.php	(revision 5261)
@@ -31,12 +31,9 @@
 		 * zeigt das Formular zum Senden in der Bestellverwaltung
 		 */
-		public function order_view($order_id, &$arSidebarArray)
+		public function order_view_content($order_id)
 		{
-
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_auftragsbestaetigung/order_view.phtml', false)
-			);
-
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_auftragsbestaetigung/order_view.phtml');
+			
 		} // public function order_view_content($order_id)
 	 
@@ -46,8 +43,8 @@
 		public function order_ajax()
 		{ 
-
+			
 			$this->shop->checkEscape();
 			
-			$this->shop->view['auftrag_note'] = wpsg_sinput("text_field", $_REQUEST['auftrag_note']);
+			$this->shop->view['auftrag_note'] = $_REQUEST['auftrag_note'];
 
 			$this->send(wpsg_q($_REQUEST['edit_id']));
@@ -90,7 +87,7 @@
 			$basket->initFromDB($order_id);
 			
-			$this->shop->view['basket']= $basket->toArray(true);
+			$this->shop->view['basket']= $basket->toArray();
 			
-			/*  Alt
+		
 			$arrShippingData = $this->db->fetchRow("SELECT 
 														`shipping_vname`,
@@ -107,27 +104,4 @@
 														`id` = '".$order_id."'
 													");
-			*/
-			$arrData = $this->db->fetchRow("SELECT
-														`shipping_adress_id`
-													FROM
-														`".WPSG_TBL_ORDER."`
-													WHERE
-														`id` = '".$order_id."'
-													");
-			$arrAdress = $this->db->fetchRow("SELECT *
-													FROM
-														`".WPSG_TBL_ADRESS."`
-													WHERE
-														`id` = '".$arrData['shipping_adress_id']."'
-													");
-			$arrShippingData = array();
-			$arrShippingData['shipping_vname'] = $arrAdress['vname'];
-			$arrShippingData['shipping_name'] = $arrAdress['name'];
-			$arrShippingData['shipping_strasse'] = $arrAdress['strasse'];
-			$arrShippingData['shipping_nr'] = $arrAdress['nr'];
-			$arrShippingData['shipping_plz'] = $arrAdress['plz'];
-			$arrShippingData['shipping_ort'] = $arrAdress['ort'];
-			$arrShippingData['shipping_land'] = $arrAdress['land'];
-			$arrShippingData['shipping_firma'] = $arrAdress['firma'];
 			
 			$strShippingLand = $this->db->fetchRow("SELECT
@@ -149,5 +123,4 @@
 			$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
 			$this->shop->view['o_id'] = $order_id;
-			$this->shop->view['oOrder'] = wpsg_order::getInstance($this->shop->view['o_id']);
 			 
 			// Damit customer.phtml die richtigen Variablen hat ist folgendes leider notwendig
@@ -159,5 +132,6 @@
 			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml', false);
 
-			if ($this->shop->get_option('wpsg_htmlmail') === '1') {
+			if ($this->shop->get_option('wpsg_htmlmail') === '1')
+			{
 				
 				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml', false);
@@ -216,2 +190,4 @@
 		
 	}
+	
+?>
Index: /mods/wpsg_mod_autodebit.class.php
===================================================================
--- /mods/wpsg_mod_autodebit.class.php	(revision 8528)
+++ /mods/wpsg_mod_autodebit.class.php	(revision 5261)
@@ -17,5 +17,5 @@
 		public function __construct()
 		{
-			global $wpdb;
+			
 			parent::__construct();
 			
@@ -23,24 +23,9 @@
 			$this->group = __('Zahlungsarten', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht die Zahlungsart Bankeinzug.', 'wpsg');
-			
-			if (defined('MULTISITE') && MULTISITE === true && get_site_option('wpsg_multiblog_standalone', true) != '1')
-			{
-			
-				$prefix = $wpdb->base_prefix;
-			
-			}
-			else
-			{
-			
-				$prefix = $wpdb->prefix;
-			
-			}
-			if (!defined('WPSG_TBL_BANKDATA')) {
-				define('WPSG_TBL_BANKDATA', $prefix.'wpsg_bankdata');
-			}
 						
 		} // public function __construct()
 		
-		public function install() {
+		public function install()
+		{
 			 
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
@@ -57,33 +42,6 @@
 				mod_autodebit_iban VARCHAR(255) NOT NULL
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-			
-			dbDelta($sql);
-				
-			$sql = "CREATE TABLE ".WPSG_TBL_BANKDATA." (
-				id mediumint(9) NOT NULL AUTO_INCREMENT,
-				mod_autodebit_blz VARCHAR(255) NOT NULL,
-		   		mod_autodebit_merkmal VARCHAR(1) NOT NULL,
-		   		mod_autodebit_name VARCHAR(255) NOT NULL,
-		   		mod_autodebit_plz VARCHAR(255) NOT NULL,
-		   		mod_autodebit_ort VARCHAR(255) NOT NULL,
-		   		mod_autodebit_kurz VARCHAR(255) NOT NULL,
-		   		mod_autodebit_institut VARCHAR(255) NOT NULL,
-				mod_autodebit_bic VARCHAR(11) NOT NULL,
-				mod_autodebit_kenn VARCHAR(2) NOT NULL,
-				mod_autodebit_dsnummer VARCHAR(255) NOT NULL,
-				mod_autodebit_aekenn VARCHAR(1) NOT NULL,
-				PRIMARY KEY  (id),
-				KEY mod_autodebit_bic (mod_autodebit_bic),
-				mod_autodebit_loesch VARCHAR(1) NOT NULL,
-				mod_autodebit_nachfolge VARCHAR(255) NOT NULL
-		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-			
-			dbDelta($sql);
-
-			$this->db->Query("TRUNCATE TABLE ".WPSG_TBL_BANKDATA);
-			
-			$filename = WPSG_PATH_MOD.'mod_autodebit/blz.txt';
-			$this->readBLZBICFile($filename, false, false, true);
-			
+   	   	 
+   			dbDelta($sql);
    			
    			$this->shop->checkDefault('wpsg_mod_autodebit_bezeichnung', $this->name, false, true);
@@ -106,62 +64,36 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_autodebit_bezeichnung', $_REQUEST['wpsg_mod_autodebit_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_autodebit_aktiv', $_REQUEST['wpsg_mod_autodebit_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_autodebit_hint', $_REQUEST['wpsg_mod_autodebit_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_autodebit_gebuehr', $_REQUEST['wpsg_mod_autodebit_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_autodebit_mwst', $_REQUEST['wpsg_mod_autodebit_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_autodebit_mwstland', $_REQUEST['wpsg_mod_autodebit_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_autodebit_iban', $_REQUEST['wpsg_mod_autodebit_iban'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_autodebit_bic', $_REQUEST['wpsg_mod_autodebit_bic'], false, false, WPSG_SANITIZE_CHECKBOX);
-				
+			
+			$this->shop->update_option('wpsg_mod_autodebit_bezeichnung', $_REQUEST['wpsg_mod_autodebit_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_autodebit_aktiv', $_REQUEST['wpsg_mod_autodebit_aktiv']);
+			$this->shop->update_option('wpsg_mod_autodebit_hint', $_REQUEST['wpsg_mod_autodebit_hint']);
+			$this->shop->update_option('wpsg_mod_autodebit_gebuehr', $_REQUEST['wpsg_mod_autodebit_gebuehr']);
+			$this->shop->update_option('wpsg_mod_autodebit_mwst', $_REQUEST['wpsg_mod_autodebit_mwst']);
+			$this->shop->update_option('wpsg_mod_autodebit_mwstland', $_REQUEST['wpsg_mod_autodebit_mwstland']);
+			$this->shop->update_option('wpsg_mod_autodebit_iban', $_REQUEST['wpsg_mod_autodebit_iban']);
+			
 		} // public function settings_save()
 		
-		public function be_ajax() {
-		
-			if (wpsg_isSizedString($_REQUEST['do'], 'inlinedit')) {
-				
-				$order_id = intval($_REQUEST['order_id']);
-				
-				if ($order_id <= 0) throw new \Exception(__('Bestell ID nicht gesetzt.', 'wpsg'));
-				
-				switch ($_REQUEST['field']) {
-					
-					case 'name': $col = 'mod_autodebit_name'; break;
-					case 'owner': $col = 'mod_autodebit_inhaber'; break;
-					case 'bic': $col = 'mod_autodebit_bic'; break;
-					case 'iban': $col = 'mod_autodebit_iban'; break;
-					case 'blz': $col = 'mod_autodebit_blz'; break;
-					case 'knr': $col = 'mod_autodebit_knr'; break;
-					
-					default: throw new \Exception(__('Aufruf nicht definiert.', 'wpsg'));
-					
-				}
-				
-				$value = \sanitize_text_field($_REQUEST['value']);
-				
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, [
-					$col => wpsg_q($value)
-				], " `id` = '".wpsg_q($order_id)."' ");
-				
-				echo $value; exit;
-				
-			} else if ($_REQUEST['wpsg_mod_autodebit_bicibanconverter'] == '1') {
+		public function be_ajax()
+		{
+		
+			if ($_REQUEST['wpsg_mod_autodebit_bicibanconverter'] == '1')
+			{
 		
 				$arOrder_bankeinzug = $this->db->fetchAssoc("
 					SELECT
 						O.`id` AS `order_id`, O.`custom_data`,
-						K.`id` AS `customer_id`, CA.*,
+						K.`id` AS `customer_id`,
 						L.`kuerzel` AS `land_kuerzel`						
 					FROM
 						`".WPSG_TBL_ORDER."` AS O
 							LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`)
-							LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (O.`adress_id` = CA.`id`)
-							LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (CA.`land` = L.`id`) 
+							LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (K.`land` = L.`id`) 
 					WHERE
 						O.`type_payment` = '20'
 				");
 				
-				foreach ($arOrder_bankeinzug as $order) {
+				foreach ($arOrder_bankeinzug as $order)
+				{
 										
 					$custom_data = @unserialize($order['custom_data']);
@@ -174,5 +106,6 @@
 					$iban = $this->make_iban($blz, $knr, $order['land_kuerzel']);
 					
-					if ($this->test_iban($iban)) {
+					if ($this->test_iban($iban))
+					{
 						
 						$custom_data['checkout']['mod_autodebit_iban'] = $iban;
@@ -180,9 +113,8 @@
 					}
 					
-					$this->db->UpdateQuery(WPSG_TBL_ORDER, array('custom_data' => serialize($custom_data)), " `id` = '".wpsg_q($order['order_id'])."' ");
+					$this->db->UpdateQuery(WPSG_TBL_ORDER, array('custom_data' => serialize($custom_data)), " `id` = '".M1::q($order['order_id'])."' ");
 															
 					
 				}
-				
 				die("1");
 		
@@ -191,45 +123,109 @@
 		} // public function be_ajax()
 		
-		public function addPayment(&$arPayment) { 
-			
-			//if (!is_admin() && $this->shop->get_option('wpsg_mod_autodebit_aktiv') != '1') return;
-			if (is_admin() || $this->shop->get_option('wpsg_mod_autodebit_aktiv') == '1') {
-				 
-				$arPayment[$this->id] = array(
-					'id' => $this->id,
-					'name' => __($this->shop->get_option('wpsg_mod_autodebit_bezeichnung'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_autodebit_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_autodebit_mwst'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_autodebit_mwstland'),
-					'hint' => __($this->shop->get_option('wpsg_mod_autodebit_hint')),
-                    'logo' => $this->shop->getRessourceURL('mods/mod_autodebit/gfx/logo_100x25.png')
-				);
-				 			
-			}
+		public function addPayment(&$arPayment) 
+		{ 
+			
+			if (!is_admin() && $this->shop->get_option('wpsg_mod_autodebit_aktiv') != '1');
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_autodebit_mwst'), $this->shop->getDefaultCountry());			
+			
+			$arPayment[$this->id] = array(
+				'id' => $this->id,
+				'name' => __($this->shop->get_option('wpsg_mod_autodebit_bezeichnung'), 'wpsg'),
+				'preis' => $this->shop->get_option('wpsg_mod_autodebit_gebuehr'),
+				'mwst_key' => $this->shop->get_option('wpsg_mod_autodebit_mwst'),
+				'mwst_value' => $mwst_value,
+				'mwst_null' => $this->shop->get_option('wpsg_mod_autodebit_mwstland'),
+				'hint' => __($this->shop->get_option('wpsg_mod_autodebit_hint'))
+			);
 			
 			// Ging leider nicht anders, da die ID der onepagecheckoutseite noch nicht abgefragt werden kann
 			// Sollte denk ich nicht zu problemen fÃŒhren wenn die Abfrage immer im hint drin ist, er wird ohnehin nur im checkout verwendet
-			if (
-				isset($_REQUEST['wpsg_checkout2']) ||
-				(isset($_REQUEST['wpsg_checkout']) && $this->shop->hasMod('wpsg_mod_onepagecheckout')) ||
-				true
+			if (	
+					isset($_REQUEST['wpsg_checkout2']) || 
+					(isset($_REQUEST['wpsg_checkout']) && $this->shop->hasMod('wpsg_mod_onepagecheckout')) || 
+					true
 			)
 			{
-				
-				$this->shop->view['error'] = wpsg_getArray($_SESSION['wpsg']['errorFields']);
-				
-				$this->shop->view['wpsg_mod_autodebit']['name'] = wpsg_xss(wpsg_getStr($_SESSION['wpsg']['checkout']['mod_autodebit_name']));
-				$this->shop->view['wpsg_mod_autodebit']['blz'] = wpsg_xss(wpsg_getStr($_SESSION['wpsg']['checkout']['mod_autodebit_blz']));
-				$this->shop->view['wpsg_mod_autodebit']['bic'] = wpsg_xss(wpsg_getStr($_SESSION['wpsg']['checkout']['mod_autodebit_bic']));
-				$this->shop->view['wpsg_mod_autodebit']['inhaber'] = wpsg_xss(wpsg_getStr($_SESSION['wpsg']['checkout']['mod_autodebit_inhaber']));
-				$this->shop->view['wpsg_mod_autodebit']['knr'] = wpsg_xss(wpsg_getStr($_SESSION['wpsg']['checkout']['mod_autodebit_knr']));
-				$this->shop->view['wpsg_mod_autodebit']['iban'] = wpsg_xss(wpsg_getStr($_SESSION['wpsg']['checkout']['mod_autodebit_iban']));
+
+				$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
+				$this->shop->view['wpsg_mod_autodebit']['name'] = $_SESSION['wpsg']['checkout']['mod_autodebit_name'];
+				$this->shop->view['wpsg_mod_autodebit']['blz'] = $_SESSION['wpsg']['checkout']['mod_autodebit_blz'];
+				$this->shop->view['wpsg_mod_autodebit']['bic'] = $_SESSION['wpsg']['checkout']['mod_autodebit_bic'];
+				$this->shop->view['wpsg_mod_autodebit']['inhaber'] = $_SESSION['wpsg']['checkout']['mod_autodebit_inhaber'];
+				$this->shop->view['wpsg_mod_autodebit']['knr'] = $_SESSION['wpsg']['checkout']['mod_autodebit_knr'];
+				$this->shop->view['wpsg_mod_autodebit']['iban'] = $_SESSION['wpsg']['checkout']['mod_autodebit_iban'];
 				
 				$arPayment[$this->id]['hint'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_autodebit/paymenthint.phtml', false);
+				
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
+		} // public function addPayment(&$arPayment)
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			 
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_autodebit_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_autodebit_mwst'));
+
+				}
 								
 			}
 			
-		} // public function addPayment(&$arPayment)
-		 
+		} // public function calcPayment(&$arBasket) 
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -249,7 +245,7 @@
 		public function checkCheckout(&$state, &$error, &$arCheckout) 
 		{ 
-            
-			if (!wpsg_isSizedString($arCheckout['payment'], strval($this->id))) return;
-	
+	 
+			if ($arCheckout['payment'] != $this->id) return;
+	 
 			// Werte in die Session und den Checkout schreiben schreiben
 			if (
@@ -259,17 +255,17 @@
 			{
 		 
-				if (wpsg_checkInput($_REQUEST['wpsg_mod_autodebit']['name'], WPSG_SANITIZE_TEXTFIELD)) $_SESSION['wpsg']['checkout']['mod_autodebit_name'] = $_REQUEST['wpsg_mod_autodebit']['name'];
-				if (wpsg_checkInput($_REQUEST['wpsg_mod_autodebit']['bic'], WPSG_SANITIZE_TEXTFIELD)) $_SESSION['wpsg']['checkout']['mod_autodebit_bic'] = $_REQUEST['wpsg_mod_autodebit']['bic'];
-				if (wpsg_checkInput($_REQUEST['wpsg_mod_autodebit']['inhaber'], WPSG_SANITIZE_TEXTFIELD)) $_SESSION['wpsg']['checkout']['mod_autodebit_inhaber'] = $_REQUEST['wpsg_mod_autodebit']['inhaber'];
-				if (wpsg_checkInput($_REQUEST['wpsg_mod_autodebit']['iban'], WPSG_SANITIZE_TEXTFIELD)) $_SESSION['wpsg']['checkout']['mod_autodebit_iban'] = $_REQUEST['wpsg_mod_autodebit']['iban'];
-				if (wpsg_checkInput($_REQUEST['wpsg_mod_autodebit']['blz'], WPSG_SANITIZE_TEXTFIELD)) $_SESSION['wpsg']['checkout']['mod_autodebit_blz'] = $_REQUEST['wpsg_mod_autodebit']['blz'];
-				if (wpsg_checkInput($_REQUEST['wpsg_mod_autodebit']['knr'], WPSG_SANITIZE_TEXTFIELD)) $_SESSION['wpsg']['checkout']['mod_autodebit_knr'] = $_REQUEST['wpsg_mod_autodebit']['knr'];
-				
-				$arCheckout['mod_autodebit_name'] = @$_SESSION['wpsg']['checkout']['mod_autodebit_name'];
-				$arCheckout['mod_autodebit_blz'] = @$_SESSION['wpsg']['checkout']['mod_autodebit_blz'];
-				$arCheckout['mod_autodebit_bic'] = @$_SESSION['wpsg']['checkout']['mod_autodebit_bic'];
-				$arCheckout['mod_autodebit_inhaber'] = @$_SESSION['wpsg']['checkout']['mod_autodebit_inhaber'];
-				$arCheckout['mod_autodebit_knr'] = @$_SESSION['wpsg']['checkout']['mod_autodebit_knr'];
-				$arCheckout['mod_autodebit_iban'] = @$_SESSION['wpsg']['checkout']['mod_autodebit_iban'];
+				$_SESSION['wpsg']['checkout']['mod_autodebit_name'] = wpsg_xss($_REQUEST['wpsg_mod_autodebit']['name']);
+				$_SESSION['wpsg']['checkout']['mod_autodebit_blz'] = wpsg_xss($_REQUEST['wpsg_mod_autodebit']['blz']);
+				$_SESSION['wpsg']['checkout']['mod_autodebit_bic'] = wpsg_xss($_REQUEST['wpsg_mod_autodebit']['bic']);
+				$_SESSION['wpsg']['checkout']['mod_autodebit_inhaber'] = wpsg_xss($_REQUEST['wpsg_mod_autodebit']['inhaber']);
+				$_SESSION['wpsg']['checkout']['mod_autodebit_knr'] = wpsg_xss($_REQUEST['wpsg_mod_autodebit']['knr']);
+				$_SESSION['wpsg']['checkout']['mod_autodebit_iban'] = wpsg_xss($_REQUEST['wpsg_mod_autodebit']['iban']);
+				
+				$arCheckout['mod_autodebit_name'] = $_SESSION['wpsg']['checkout']['mod_autodebit_name'];
+				$arCheckout['mod_autodebit_blz'] = $_SESSION['wpsg']['checkout']['mod_autodebit_blz'];
+				$arCheckout['mod_autodebit_bic'] = $_SESSION['wpsg']['checkout']['mod_autodebit_bic'];
+				$arCheckout['mod_autodebit_inhaber'] = $_SESSION['wpsg']['checkout']['mod_autodebit_inhaber'];
+				$arCheckout['mod_autodebit_knr'] = $_SESSION['wpsg']['checkout']['mod_autodebit_knr'];
+				$arCheckout['mod_autodebit_iban'] = $_SESSION['wpsg']['checkout']['mod_autodebit_iban'];
 
 			}
@@ -288,5 +284,5 @@
 
 					if (trim($arCheckout['mod_autodebit_bic']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_autodebit_bic'; $this->shop->addFrontendError(__('Bitte die BIC der Bank kontrollieren (Bankeinzug)', 'wpsg')); $error = true; }
-					if (trim($arCheckout['mod_autodebit_iban']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_autodebit_iban'; $this->shop->addFrontendError(__('Bitte die IBAN Nr ÃŒberprÃŒfen (Bankeinzug)', 'wpsg')); $error = true; }
+					if (trim($arCheckout['mod_autodebit_iban']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_autodebit_iban'; $this->shop->addFrontendError(__('Bitet die IBAN Nr ÃŒberprÃŒfen (Bankeinzug)', 'wpsg')); $error = true; }
 					
 				}
@@ -298,138 +294,30 @@
 					
 				}
- 			
-				$iban = trim($arCheckout['mod_autodebit_iban']);
-				
-				if ($this->test_iban($iban) == false) { $_SESSION['wpsg']['errorFields'][] = 'mod_autodebit_iban'; $this->shop->addFrontendError(__('Bitte die IBAN Nr ÃŒberprÃŒfen (Bankeinzug)', 'wpsg')); $error = true; }
-				
-				// BIC-PrÃŒfung gewÃŒnscht
-				if ($this->shop->get_option('wpsg_mod_autodebit_bic') == '1') { 
-									
-					$filename = WPSG_PATH_MOD.'mod_autodebit/blz.txt';
-					$bic = trim($arCheckout['mod_autodebit_bic']);
-									
-					//SELECT * FROM `wp_wpsg_bankdata` WHERE `mod_autodebit_bic` = "HELADEF1WEM"
-					$check = $this->db->fetchRow('SELECT * FROM '.WPSG_TBL_BANKDATA.
-									 ' WHERE `mod_autodebit_bic` = "'.$bic.'"');
-					
-					//$check = $this->readBLZBICFile($filename, false, $bic);
-					if ($check == null) { $_SESSION['wpsg']['errorFields'][] = 'mod_autodebit_bic'; $this->shop->addFrontendError(__('Bitte die BIC der Bank kontrollieren (Bankeinzug)', 'wpsg')); $error = true; }
-				}
+ 						
 			}
 			
 		} // public function checkCheckout(&$state, &$error, &$arCheckout)
 		
-		/**
-		 * Liest die BLZBic Infodatei und gibt Informationen anhand der BLZ oder BIC zurÃŒck
-		 * http://www.bundesbank.de/Redaktion/DE/Downloads/Aufgaben/Unbarer_Zahlungsverkehr/Bankleitzahlen/merkblatt_bankleitzahlendatei.pdf?__blob=publicationFile
-		 * http://www.bundesbank.de/Redaktion/DE/Standardartikel/Aufgaben/Unbarer_Zahlungsverkehr/bankleitzahlen_download.html
-		 */
-		private function readBLZBICFile($filename, $searchBLZ = false, $searchBIC = false, $import = false)
-		{
-				
-			if ($searchBLZ === false && $searchBIC === false && $import === false) return array();
-				
-			$handle = fopen($filename, "r");
-		
-			while (($line = fgets($handle, 4096)) !== false)
-			{
-		
-				$line = trim($line);
-				//$line = utf8_encode($line);
-				//$line = iconv("ISO-8859-1", "UTF-8", $line);
-				//$line = iconv("ISO-8859-2", "UTF-8", $line);
-				//$line = iconv("Windows-1251", "UTF-8", $line);
-				//$line = iconv("Windows-1252", "UTF-8", $line);
-				//$line = iconv("CP1252", "UTF-8", $line);
-				//$line = iconv("UTF-8", "UTF-8", $line);
-				
-				$arRow = $this->explodeRow($line);
-		
-				// Nur Hauptsitze erfassen
-				if (trim($arRow['8']) === '') continue;
-					
-				if ($import == false)
-				{
-					if ($arRow['bic'] == $searchBIC || $arRow['blz'] == $searchBLZ) return $arRow;
-				}
-				else 
-				{
-					// In Tabelle importieren
-					// Insert Query in einem Modul: 
-					// $this->db->ImportQuery(WPSG_TBL_BANKDATA, array('col' => wpsg_q('value'), 'col2' => wpsg_q('value2')));
-					$bic = $arRow['bic'];
-					$this->db->ImportQuery(WPSG_TBL_BANKDATA, array(
-							'mod_autodebit_blz' => wpsg_q($arRow[1]),
-							'mod_autodebit_merkmal' => wpsg_q($arRow[2]),
-							'mod_autodebit_name' => wpsg_q($arRow[3]),
-							'mod_autodebit_plz' => wpsg_q($arRow[4]),
-							'mod_autodebit_ort' => wpsg_q($arRow[5]),
-							'mod_autodebit_kurz' => wpsg_q($arRow[6]),
-							'mod_autodebit_institut' => wpsg_q($arRow[7]),
-							'mod_autodebit_bic' => wpsg_q($arRow[8]),
-							'mod_autodebit_kenn' => wpsg_q($arRow[9]),
-							'mod_autodebit_dsnummer' => wpsg_q($arRow[10]),
-							'mod_autodebit_aekenn' => wpsg_q($arRow[11]),
-							'mod_autodebit_loesch' => wpsg_q($arRow[12]),
-							'mod_autodebit_nachfolge' => wpsg_q($arRow[13])
-							));
-				}
-			}
-			
-			return false;
-				
-		} // private function readBLZBICFile($file, $searchBLZ = false, $searchBIC = false)
-		
-		private function explodeRow($line)
-		{
-				
-			$arRow = array(
-					'1' => mb_substr($line, 0, 8, "UTF-8"), // Bankleitzahl
-					'2' => mb_substr($line, 8, 1, "UTF-8"), // Merkmal, ob bankleitzahlfÃŒhrender Zahlungsdienstleister (â1â) oder nicht (â2â)
-					'3' => mb_substr($line, 9, 58, "UTF-8"), // Bezeichnung des Zahlungsdienstleisters (ohne Rechtsform)
-					'4' => mb_substr($line, 67, 5, "UTF-8"),
-					'5' => mb_substr($line, 72, 35, "UTF-8"),
-					'6' => mb_substr($line, 107, 27, "UTF-8"), // Kurzbezeichnung des Zahlungsdienstleisters mit Ort (ohne Rechtsform)
-					'7' => mb_substr($line, 134, 5, "UTF-8"), // Institutsnummer fÃŒr PAN
-					'8' => mb_substr($line, 139, 11, "UTF-8"),
-					'9' => mb_substr($line, 150, 2, "UTF-8"), // Knnzeichen fÃŒr PrÃŒfzifferberechnungsmethode
-					'10' => mb_substr($line, 152, 6, "UTF-8"), // Nummer des Datensatzes
-					'11' => mb_substr($line, 158, 1, "UTF-8"), // Ãnderungskennzeichen
-					'12' => mb_substr($line, 159, 1, "UTF-8"), // Hinweis auf beabsichtigte BankleitzahllÃ¶schung
-					'13' => mb_substr($line, 160, 8, "UTF-8"), // Hinweis auf Nachfolge-Bankleitzahl
-					'14' => mb_substr($line, 168, 6, "UTF-8") // Kennzeichen fÃŒr die IBAN-Regel (nur erweiterte Bankleitzahlendatei)
-			);
-				
-			$arRow['blz'] = $arRow[1];
-			$arRow['name'] = $arRow[3];
-			$arRow['plz'] = $arRow[4];
-			$arRow['ort'] = $arRow[5];
-			$arRow['bic'] = $arRow[8];
-				
-			return $arRow;
-				
-		} // private function explodeRow($row)
-		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) { 
-			
-			if (isset($_SESSION['wpsg']['checkout']) && $_SESSION['wpsg']['checkout']['payment'] == $this->id) {
-				
-				$checkout = $_SESSION['wpsg']['checkout'];
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
+		{ 
+			 
+			if ($checkout['payment'] == $this->id)
+			{
 				
 				// Daten in die Bestelltabelle hinzutragen
-				$db_data['mod_autodebit_name'] = wpsg_q($checkout['mod_autodebit_name']);
-				$db_data['mod_autodebit_blz'] = wpsg_q($checkout['mod_autodebit_blz']);
-				$db_data['mod_autodebit_bic'] = wpsg_q($checkout['mod_autodebit_bic']);
-				$db_data['mod_autodebit_inhaber'] = wpsg_q($checkout['mod_autodebit_inhaber']);
-				$db_data['mod_autodebit_knr'] = wpsg_q($checkout['mod_autodebit_knr']);
-				$db_data['mod_autodebit_iban'] = wpsg_q($checkout['mod_autodebit_iban']);
-			
-			} 
-			
-		}
-		 
+				$data['mod_autodebit_name'] = $checkout['mod_autodebit_name'];
+				$data['mod_autodebit_blz'] = $checkout['mod_autodebit_blz'];
+				$data['mod_autodebit_bic'] = $checkout['mod_autodebit_bic'];
+				$data['mod_autodebit_inhaber'] = $checkout['mod_autodebit_inhaber'];
+				$data['mod_autodebit_knr'] = $checkout['mod_autodebit_knr'];
+				$data['mod_autodebit_iban'] = $checkout['mod_autodebit_iban'];
+				
+			}
+			
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
 		public function order_view_afterpayment(&$order_id) 
 		{ 
-									
+			
 			$order_data = $this->shop->cache->loadOrder($order_id);
 			
@@ -489,22 +377,17 @@
 		} // public function make_iban($blz, $kontonr) 
 		
-		/**
-		 * PrÃŒfen der IBAN auf Richtigkeit
-		 * @param unknown $iban
-		 * @return boolean
-		 */
 		public function test_iban($iban) 
 		{
 			
 			$iban = str_replace(' ', '', $iban);
-			$iban1 = substr($iban, 4).strval(ord($iban[0]) - 55).strval(ord($iban[1]) - 55). substr($iban, 2, 2);
+			$iban1 = substr($iban, 4).strval(ord($iban{0}) - 55).strval(ord($iban{1}) - 55). substr($iban, 2, 2);
 		
 			for ($i = 0; $i < strlen($iban1); $i++) 
 			{
 				
-				if(ord($iban1[$i]) > 64 && ord($iban1[$i]) < 91)
-				{
-					
-					$iban1 = substr($iban1, 0, $i).strval(ord($iban1[$i]) - 55).substr($iban1, $i + 1);
+				if(ord($iban1{$i}) > 64 && ord($iban1{$i}) < 91) 
+				{
+					
+					$iban1 = substr($iban1, 0, $i).strval(ord($iban1{$i}) - 55).substr($iban1, $i + 1);
 					
 				}
Index: /mods/wpsg_mod_bankalignment.class.php
===================================================================
--- /mods/wpsg_mod_bankalignment.class.php	(revision 5261)
+++ /mods/wpsg_mod_bankalignment.class.php	(revision 5261)
@@ -0,0 +1,219 @@
+<?php
+
+	/**
+	 * Bankabgleichsmodul
+	 * ErmÃ¶glicht den Kontoabgleich ÃŒber exportierte CSV Dateien
+	 * @author Daschmi
+	 */
+	class wpsg_mod_bankalignment extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 2;
+		var $id = 1610;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+				
+			parent::__construct();
+				
+			$this->name = __('Bankabgleich', 'wpsg');
+			$this->group = __('Bestellung', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht den Kontoabgleich ÃŒber exportierte CSV Dateien.', 'wpsg');
+		
+		} // public function __construct()
+		
+		public function produkt_index_head() 
+		{ 
+
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_bankalignment/produkt_index_head.phtml');
+			
+		} // public function produkt_index_head()
+		
+		public function produkt_index_aftersearch() 
+		{ 
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_bankalignment/produkt_index_aftersearch.phtml');
+			
+		} // public function produkt_index_aftersearch()
+		
+		public function install()
+		{
+			
+			$this->shop->checkDefault('wpsg_mod_bankalignment_separator', ';');
+			
+		} // public function install()
+		
+		public function settings_edit()
+		{
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_bankalignment/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_bankalignment_separator', $_REQUEST['wpsg_mod_bankalignment_separator']);
+			
+		} // public function settings_save()
+		
+		public function order_ajax() 
+		{ 
+			
+			if ($_REQUEST['mod'] != 'wpsg_mod_bankalignment') return;			
+
+			if (isset($_REQUEST['wpsg_mod_bankalignment_submit']))
+			{
+				
+				$nSet = 0;
+				
+				foreach ($_REQUEST['set'] as $order_id)
+				{
+					
+					if ($order_id > 0)
+					{
+						
+						$order = $this->shop->cache->loadOrder($order_id);
+						
+						if ($order['status'] == 0)
+						{
+						
+							$this->shop->setOrderStatus($order_id, 100, true);
+							$nSet ++;
+							
+						}
+						
+					}
+					
+				}
+								
+				$this->shop->addBackendMessage(wpsg_translate(__('Es wurden #1# Bestellungen auf "#2#" gesetzt.', 'wpsg'), $nSet, $this->shop->arStatus[100]));
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
+				
+			}
+			
+			if (!file_exists($_FILES['wpsg_mod_bankalignment_file']['tmp_name']))
+			{
+				
+				$this->shop->addBackendError(__('Bitte geben sie eine Datei an!', 'wpsg'));
+				die('<script type="text/javascript">/* <![CDATA[ */ location.href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order"; /* ]]> */</script>');				
+				
+			}
+			else if (file_exists($_FILES['wpsg_mod_bankalignment_file']['tmp_name']))
+			{
+			
+				// Alle Bestellungen die noch "Bestellung eingegangen"
+				$arOrder = $this->db->fetchAssoc("
+					SELECT 
+						O.`id` AS o_id, O.`onr` AS onr,
+						CONCAT(K.`vname`, ' ', K.`name`, ', ', REPLACE(FORMAT(O.`price_gesamt`, 2), '.', ','), ' ".$this->shop->get_option('wpsg_currency')."') AS okey
+					FROM 
+						`".WPSG_TBL_ORDER."` AS O
+							LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`) 
+					WHERE 
+						O.`status` = '0'		
+				");
+
+				if (sizeof($arOrder) <= 0) 
+				{
+					
+					$this->shop->addBackendError(__('Keine Bestellungen vorhanden, die noch nicht bezahlt sind!', 'wpsg'));
+					die('<script type="text/javascript">/* <![CDATA[ */ location.href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order"; /* ]]> */</script>');
+										
+				}
+				
+				foreach ($arOrder as $k => $v)
+				{
+					
+					if ($this->shop->hasMod('wpsg_mod_prepayment'))
+					{
+							
+						$arOrder[$k]['wpsg_mod_prepayment'] = $this->shop->callMod('wpsg_mod_prepayment', 'get_subject', array($v['o_id']));								
+
+					} 
+					
+				}
+				
+				$_SESSION['wpsg']['wpsg_mod_prepayment']['set'] = array();
+				
+				$h = fopen($_FILES['wpsg_mod_bankalignment_file']['tmp_name'], "r");
+				 
+				$row = 0;
+				while (($data = fgetcsv($h, 1000, $this->shop->get_option('wpsg_mod_bankalignment_separator'))) !== FALSE) 
+				{
+									 	
+					if ($row === 0)
+					{
+						
+						$this->shop->view['colInfo'] = $data;
+						
+					}
+					else
+					{
+						
+						$set = array();
+						$set['data'] = $data;
+						$set['order_id'] = false;
+						$set['onr'] = false;
+						$set['okey'] = false;
+						
+						foreach ($arOrder as $k => $v)
+						{
+							
+							// Betreff aus dem Vorkassemodul
+							if ($this->shop->hasMod('wpsg_mod_prepayment') && $this->in_array($v['wpsg_mod_prepayment'], $data))
+							{
+								
+								$set['order_id'] = $v['o_id']; 
+								$set['onr'] = $v['onr'];
+								$set['okey'] = $v['key'];
+								break;
+								
+							}
+ 
+							
+						}
+						
+						$_SESSION['wpsg']['wpsg_mod_prepayment']['set'][] = $set;
+												
+					}
+									
+					$row ++;
+					
+				}
+				 				
+				fclose($h);
+				
+				$this->shop->view['set'] = $_SESSION['wpsg']['wpsg_mod_prepayment']['set'];
+				$this->shop->view['arOrder'] = $arOrder;
+				
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_bankalignment/order_ajax.phtml');
+							
+			} 
+			 
+		} // public function order_ajax()
+		
+		/**
+		 * Hilfsfunktion die wie in_array prÃŒft ob $betreff in $data ist
+		 * PrÃŒft aber nicht ganz so restriktiv
+		 */
+		private function in_array($betreff, $data)
+		{
+			
+			foreach ((array)$data as $k => $v)
+			{
+				
+				if (preg_match('/(.*)'.$v.'(.*)/i', $betreff)) return true; 
+				
+			}
+			
+			return false;
+			
+		} // private function in_array($betreff, $data)
+		
+	} // class wpsg_mod_bankalignment extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_basic.class.php
===================================================================
--- /mods/wpsg_mod_basic.class.php	(revision 8528)
+++ /mods/wpsg_mod_basic.class.php	(revision 5261)
@@ -4,18 +4,7 @@
 	 * Basisklasse fÃŒr die Module
 	 */
-	class wpsg_mod_basic {
-
-        /** @var string $name */
-        public $name = '';
-
-        /** @var string $group */
-        public $group = '';
-
-        /** @var string $desc */
-        public $desc = '';
-
-        /** @var wpsg_db $db */
-        public $db = null;
-
+	class wpsg_mod_basic 
+	{
+		
 		/** Der Lizenzlevel des Moduls */
 		var $lizenz = 0;
@@ -24,77 +13,72 @@
 		var $helpURL = '';
 		
-		/** */
-		
-		var $id = null;
-		
 		/** Array in dem die Reihenfolge der Module bestimmt wird */
-		var $arIDs = array( 
-		    -1      => 'wpsg_mod_apiproduct',
-			1 		=> 'wpsg_mod_prepayment', // Vorkasse
-			2 		=> 'wpsg_mod_paypal', // Paypal	
+		var $arIDs = array(
+			0 		=> 'wpsg_mod_core',
+			1 		=> 'wpsg_mod_prepayment',
+			2 		=> 'wpsg_mod_paypal',	
 			3		=> 'wpsg_mod_debitpayment',		
-			5 		=> 'wpsg_mod_su', //SofortÃŒberweisung
-			6 		=> 'wpsg_mod_versandarten', // Versandarten
-			7		=> 'wpsg_mod_skrill', // Skrill
-			9 		=> 'wpsg_mod_productgroups', // Produktgruppen
-			10      => 'wpsg_mod_paypalapi', // Paypal Plus			
+			4 		=> 'wpsg_mod_invoice_type',
+			5 		=> 'wpsg_mod_su',
+			6 		=> 'wpsg_mod_versandarten',
+			7		=> 'wpsg_mod_skrill',
+			9 		=> 'wpsg_mod_productgroups',
+			10      => 'wpsg_mod_paypalapi',			
 			11		=> 'wpsg_mod_shs',
-			12		=> 'wpsg_mod_wirecard', // Wirecard
-			13 		=> 'wpsg_mod_si', // SofortIdent
+			12		=> 'wpsg_mod_wirecard',
 			14      => 'wpsg_mod_test',
-			15 		=> 'wpsg_mod_produktartikel', // ProduktArtikel
-			16		=> 'wpsg_mod_creditcard', // Kreditkarte
-			17		=> 'wpsg_mod_targo', // Targobank
-			18 		=> 'wpsg_mod_paypalratepay', // PayPal Ratenzahlung
-			20 		=> 'wpsg_mod_autodebit', 
-			30		=> 'wpsg_mod_productindex', // ProduktÃŒbersicht
-			70		=> 'wpsg_mod_auftragsbestaetigung', // AuftragsbestÃ€tigung			
-			85 		=> 'wpsg_mod_produktattribute', // Produktattribute
-			90 		=> 'wpsg_mod_stock', // Lagerbestand
-            91 		=> 'wpsg_mod_productvariants', // Vor Weight, da Gewicht schon den Standard Key brauch
-			95 		=> 'wpsg_mod_weight', // Produktgewicht
-			96 		=> 'wpsg_mod_userpayment', // Zahlungsarten			
+			15 		=> 'wpsg_mod_produktartikel',
+			20 		=> 'wpsg_mod_autodebit',
+			30		=> 'wpsg_mod_productindex',
+			70		=> 'wpsg_mod_auftragsbestaetigung',			
+			85 		=> 'wpsg_mod_produktattribute',
+			90 		=> 'wpsg_mod_stock',
+			95 		=> 'wpsg_mod_weight',
+			96 		=> 'wpsg_mod_userpayment',			
 			97	 	=> 'wpsg_mod_scaleprice', // Vor Varianten
-			98 		=> 'wpsg_mod_varianten', // Vor Rabatt (100 nicht vergeben = Core)			 
+			98 		=> 'wpsg_mod_varianten', // Vor Rabatt (100 nicht vergeben = Core)
 			101     => 'wpsg_mod_downloadplus',	// 100 = Core reserviert	
-			105 	=> 'wpsg_mod_basketteaser', // Warenkorbteaser
-			125		=> 'wpsg_mod_protectedshops', // Protected Shops
+			105 	=> 'wpsg_mod_basketteaser',
+			120 	=> 'wpsg_mod_produktbilder',
+			125		=> 'wpsg_mod_protectedshops',
 			130 	=> 'wpsg_mod_willcollect',
-			135 	=> 'wpsg_mod_shippingadress', // Lieferadresse			
-			160		=> 'wpsg_mod_gutschein', // Gutschein
-			161		=> 'wpsg_mod_voucherproduct', // ZubehÃ¶rprodukt
-			300 	=> 'wpsg_mod_export', // Exportprofile
-			440 	=> 'wpsg_mod_statistics', // Statistiken
-			500 	=> 'wpsg_mod_freeshipping', // Versandkostenfrei
+			135 	=> 'wpsg_mod_shippingadress',			
+			160		=> 'wpsg_mod_gutschein',
+			161		=> 'wpsg_mod_voucherproduct',
+			300 	=> 'wpsg_mod_export',
+			440 	=> 'wpsg_mod_statistics',
+			450 	=> 'wpsg_mod_piwik',
+			500 	=> 'wpsg_mod_freeshipping',
 			599		=> 'wpsg_mod_newsletter', // wpNewsletterGermany
 			600		=> 'wpsg_mod_nlsatolo', // Satollo Newsletter Integration			
-			601		=> 'wpsg_mod_downloadprodukte', // Downloadprodukte
-			602		=> 'wpsg_mod_videodownload', // Videodownload			
+			601		=> 'wpsg_mod_downloadprodukte',
+			602		=> 'wpsg_mod_videodownload',			
 			700		=> 'wpsg_mod_discount', // Rabatt muss nach den Varianten kommen, damit Rabatt auf Variantenpreis gerechnet wird
 			701		=> 'wpsg_mod_fuellmenge', // Nach Rabatt
 			810 	=> 'wpsg_moc_cab',
-			815 	=> 'wpsg_mod_billsafe', // Billsafe
-			816		=> 'wpsg_mod_klarna', // Klarna
-			900		=> 'wpsg_mod_ordervars', // Bestellvariable
-			950 	=> 'wpsg_mod_productvars', // Produktvariable
-			951		=> 'wpsg_mod_ordercondition', // Bestellbedingungen
-			1000	=> 'wpsg_mod_kundenkontakt', // Kundenkontakt
-			1001    => 'wpsg_mod_customerbudget', // Kundenbudget
-			1600 	=> 'wpsg_mod_relatedproducts', //ZubehÃ¶rprodukte
-			1610	=> 'wpsg_mod_bankalignment', // Bankenabgleich
-			1630	=> 'wpsg_mod_abo', // Aboprodukte			
-			1700 	=> 'wpsg_mod_onepagecheckout', // Einseitencheckout
-			1750	=> 'wpsg_mod_micropayment', // Micropayment
-			1800	=> 'wpsg_mod_haendlerbund', // HÃ€ndlerbund
-			1850	=> 'wpsg_mod_productfilter', // Produktfilter
-			1900	=> 'wpsg_mod_legaltexts', // Rechtstexte
-			1950 	=> 'wpsg_mod_topseller', // Topseller
-			2000 	=> 'wpsg_mod_deliverynote', // Lieferschein			
-			2050    => 'wpsg_mod_funding', // Crowdfunding 
-			2100	=> 'wpsg_mod_productpackage', // Produktpaket
-			2200    => 'wpsg_mod_anschreiben', // Anschreiben
+			815 	=> 'wpsg_mod_billsafe',
+			816		=> 'wpsg_mod_klarna',
+			900		=> 'wpsg_mod_ordervars',
+			950 	=> 'wpsg_mod_productvars',
+			951		=> 'wpsg_mod_ordercondition',
+			1000	=> 'wpsg_mod_kundenkontakt',
+			1001    => 'wpsg_mod_customerbudget',
+			1600 	=> 'wpsg_mod_relatedproducts',
+			1610	=> 'wpsg_mod_bankalignment',
+			1620	=> 'wpsg_mod_ebay',
+			1630	=> 'wpsg_mod_abo',			
+			1650	=> 'wpsg_mod_customermap',
+			1700 	=> 'wpsg_mod_onepagecheckout',
+			1750	=> 'wpsg_mod_micropayment',
+			1800	=> 'wpsg_mod_haendlerbund',
+			1850	=> 'wpsg_mod_productfilter',
+			1900	=> 'wpsg_mod_legaltexts',
+			1950 	=> 'wpsg_mod_topseller',
+			2000 	=> 'wpsg_mod_deliverynote',			
+			2050    => 'wpsg_mod_funding',
+			2100	=> 'wpsg_mod_productpackage',
 			3000 	=> 'wpsg_mod_spconditions',
-			3050	=> 'wpsg_mod_giropay', /* Giropay*/
-			3060	=> 'wpsg_mod_securepay', /* SecurePay*/
+			3050	=> 'wpsg_mod_giropay',
+			3060	=> 'wpsg_mod_securepay',
 			3061	=> 'wpsg_mod_icp', /* Kopie von Securepay */
 			3070	=> 'wpsg_mod_minrequest', /* Mindestbestellwert */
@@ -104,21 +88,8 @@
 			3110    => 'wpsg_mod_customernr', /* Anpassung fÃŒr LÃ€nderspezifische Kundennummern */
 			3120    => 'wpsg_mod_flexipay', /* Flexipay */			
-			3130	=> 'wpsg_mod_packagetracking', /* Paketverfolgung */
-			3140	=> 'wpsg_mod_amazon', /* Amazon Payment */
-            3141	=> 'wpsg_mod_amazon_v2', /* Amazon Payment V2 */
+			3130	=> 'wpsg_mod_packagetracking', /* Paketverfolugn */
 			4000	=> 'wpsg_mod_crefopay', /* Sollte die letzte Zahlungsart bleiben, da sie die anderen ausblendet */
-			3150	=> 'wpsg_mod_request', // Anfrageprodukt 
-			3250	=> 'wpsg_mod_addressvalidation', // Adress-Validierung 
-			5000	=> 'wpsg_mod_trustedshops', // Sollte nach den Zahlungsanbietern kommen wegen order_done
-			5100    => 'wpsg_mod_productview', // Produktansicht 
-			5300	=> 'wpsg_mod_converter', // Konverter von wpsg3 auf wpsg4
-            5500    => 'wpsg_mod_datainformation', // Datenauskunft
-            5501 	=> 'wpsg_mod_printshop', // Druckerei,
-            5502 	=> 'wpsg_mod_ticket',
-            5503 	=> 'wpsg_mod_paymentqr',
-            5504 	=> 'wpsg_mod_productmedia',
-			5600    => 'wpsg_mod_orderstates',
-			5700    => 'wpsg_mod_payone',
-			5800    => 'wpsg_mod_quickcheckout'
+			3150	=> 'wpsg_mod_request',
+			5000	=> 'wpsg_mod_trustedshops' // Sollte nach den Zahlungsanbietern kommen wegen order_done			
 		);
 		
@@ -126,7 +97,4 @@
 		var $inline = false;
 		
-		/** @var wpsg_ShopController */
-		var $shop = false;
-		
 		/**
 		 * Erstellt ein neues Modul
@@ -137,5 +105,5 @@
 			$this->shop = $GLOBALS['wpsg_sc'];
 			$this->db = $GLOBALS['wpsg_db'];
-
+			
 		} // public function __construct() 
 		
@@ -149,8 +117,5 @@
 			
 		} // public function render()
-
-        /** Wird stÃŒndlich vom Wordpress Cron aufgerufen */
-        public function wpsg_hourly_hook() { }
-
+		
 		/** Initiiert das Modul / Wird nur aufgerufen wenn das Modul aktiv ist */
 		public function init() { }
@@ -161,7 +126,4 @@
 		/** Aufruf um eventuell das Erstellen der Bestellnummer zu beeinflussen */
 		public function buildONR(&$customer_id, &$order_id, &$onr_modul) { }
-		
-		/** Ermittlung des ProductKeys aus einem Request Array */
-		public function getProductKeyFromRequest(&$product_key, $product_id, $form_data) {}
 		
 		/** */
@@ -170,5 +132,5 @@
 		/** Wird bei der Darstellung der Bibliotheken / Includes aufgerufen */
 		public function admin_includes() { }
-
+		
 		/** ErmÃ¶glicht es Debuginformationen in der wpAdminBar anzuzeigen, wenn der Debug Modus aktiv ist */
 		public function admin_debugInfo() { }
@@ -183,21 +145,9 @@
 		public function be_ajax() { }
 		
-		/** FÃŒr das hinzufÃŒgen von Buttons zum RTE */
-		public function tinymce_plugin(&$plugin_array) { }
-		
-		/** Button fÃŒr den TinyMCE */
-		public function tinymce_button(&$buttons) { }
-		
 		/** Integriert sich in die Bestellzusammenfassung (overview.phtml) nach der AGB */
 		public function overview_top(&$arBasket) { }
 		
-		/** Hier kann in einem Modul verhindert werden, dass eine Bestellung abgeschlossen wird (Ein Modul muss -2 zurÃŒckgeben) */
-		public function canFinishOrder($temp_order_id) { }
-		
-		/** Wird aufgerufen anstelle des Buttons "Zahlung akzeptieren" wenn canFinishOrder false ergibt */
-		public function canNotOrder($temp_order_id) { } 
-		
 		/** Wird aufgerufen wenn die Seiten im Backend hinzugefÃŒgt werden */
-		public function wpsg_add_pages($default_page) { }
+		public function wpsg_add_pages() { }
 		
 		/** Wird in der indexAction des AdminKontrollers aufgerufen */
@@ -228,19 +178,7 @@
 		public function mail_status(&$order, &$customer) { }
 		
-		public function mail_order_end(&$arCalculation, $html) { }
-		
 		/** Wird in der Kundenmail nach den AGB eingebaut */
 		public function kundenmail_afteragb(&$order_id) { }
 		
-		/** Wird bei der Calculation aufgerufen @var \wpsg\wpsg_calculation $oCalculation */		
-		public function calculation_fromSession(&$oCalculation, $product_done, $payship_done) { }
-		
-		public function calculation_saveProduct(&$oCalculation, $calc_product, &$db_product_data, $finish_order) { }
-
-        public function calculation_saveProduct_after(&$oCalculation, $calc_product, &$db_product_data, $finish_order) { }
-	
-		/** @var \wpsg\wpsg_calculation $oCalculation */
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) { }
-				
 		/**
 		 * Gibt den Namen der Zahlungsart zurÃŒck (Eingebaut fÃŒr CrefoPay)
@@ -251,5 +189,5 @@
 		 * @param String $payment_name Der Name der Zahlungsart
 		 */
-		public function getPaymentName($payment_type, $order_id, &$payment_name) { return @$this->shop->arPayment[$payment_type]['name']; } // public function getPaymentName($payment_type, $order_id)
+		public function getPaymentName($payment_type, $order_id, &$payment_name) { return $this->shop->arPayment[$payment_type]['name']; } // public function getPaymentName($payment_type, $order_id)
 		
 		/** Wird innerhalb der Kundengruppenverwaltung beim bearbeiten einer Kundengruppe aufgerufen */
@@ -270,5 +208,5 @@
 		/** 
 		 * Verarbeutet Ajax Anfragen innerhalb der Produktverwaltung
-		 * Die URLs sehen dann etwa so aus: <?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_productvariants&cmd=produktbilder_liste 
+		 * Die URLs sehen dann etwa so aus: <?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_produktbilder&cmd=produktbilder_liste 
 		 */
 		public function produkt_ajax() { }
@@ -281,10 +219,7 @@
 		 */
 		public function produkt_index_editmenu(&$pData) { }
-
-		/** Integriert eine Reiter in die BestellÃŒberischt */
-		public function order_index_tab(&$arTabs) { }
 		
 		/** Integriert sich in die Bestellverwaltung nach dem Suchformular */
-		public function order_index_aftersearch() { }
+		public function produkt_index_aftersearch() { }
 		
 		/** Wird beim bearbeiten eines Produktes aufgerufen, hier kann der Array modifiziert werden, der an das view ÃŒbergeben wird */
@@ -294,6 +229,5 @@
 		public function produkt_copy(&$produkt_id, &$copy_id) { }
 		
-		/** DEPRECATED und INACTIV:Soll durch product_addedit_content ersetzt werden
-		 * Wird beim anlegen eines neuen Produktes aufgerufen */
+		/** Wird beim anlegen eines neuen Produktes aufgerufen */
 		public function produkt_add(&$produkt_data) { }
 		
@@ -308,8 +242,5 @@
 		public function produkt_del($produkt_id) { }
 		
-		/** 
-		 * DEPRECATED:Soll durch product_addedit_content ersetzt werden
-		 * Wird vom Bearbeiten/Anlegen Template der Produktverwaltung aufgerufen und ermÃ¶glicht es in der Seitenleiste neue Elemente zu platzieren 
-		 * */
+		/** Wird vom Bearbeiten/Anlegen Template der Produktverwaltung aufgerufen und ermÃ¶glicht es in der Seitenleiste neue Elemente zu platzieren */
 		public function produkt_edit_sidebar(&$produkt_data) { }
 				
@@ -318,5 +249,4 @@
 		
 		/**
-		 * DEPRECATED:Soll durch product_addedit_content ersetzt werden 
 		 * Wird beim bearbeiten eines Produktes im Content Teil aufgerufen
 		 * Hier kÃ¶nnen z.B. weitere PostBoxen installiert werden 
@@ -324,21 +254,4 @@
 		public function produkt_edit_content(&$produkt_data) { }
 		
-		/**
-		 * @param wpsg_product $oProduct
-		 * @param double $price_netto
-		 * @param double $price_brutto
-		 * @param string $product_key		 * 
-		 * @param int Menge fÃŒr Staffelpreise wenn false, dann aus der Session
-		 * @param double $weight Gewicht des Produktes im Warenkob, bei false wird anhand der Session ermittelt
-		 */
-		public function product_getPrice(&$oProduct, &$price_netto, &$price_brutto, $product_key, $amount, $weight) { }
-		
-		/**
-		 * Integration von Modulen in die Produktverwaltung 
-		 * @param Array $product_content Hier ist die Konfiguration der Reiter drin. { "title":"", "content":"" } 
-		 * @param Array $product_data Array mit den Produktdaten aus der DB
-		 */
-		public function product_addedit_content(&$product_content, &$product_data) { }
-		
 		/** Wird nach dem speichern des Produktes aus der saveAction des Produktcontrollers aufgerufen */
 		public function produkt_save(&$produkt_id) { }
@@ -361,8 +274,6 @@
 		
 		/** Wird im Produkttemplate eingebunden im unteren Bereich nach der Beschreibung */
-		public function product_bottom(&$produkt_key, $template_index) { }
- 	
-		// public functiom
-		
+		public function product_bottom(&$produkt_id, $template_index) { }
+ 		
 		/** Wird ÃŒber dem Warenkorb eingebunden (Rabatthinweis) */
 		public function basket_top() { } 
@@ -376,9 +287,8 @@
 		/** PrÃŒft die Daten, die im Warenkorb erfasst sind auf ValiditÃ€t */
 		public function basket_check() { } // public function basket_check()
-
-        /** Wird aufgerufen wenn ein Produkt aus dem Warenkorb entfernt wird */
-        public function basket_removeProduktFromSession($product_index) { } // public function basket_removeProduktFromSession($product_index)
-        
-		/** Wird nach dem Formular im basket.phtml aufgerufen */
+		
+		/**
+		 * Wird nach dem Formular im basket.phtml aufgerufen
+		 */
 		public function basket_after(&$basket_view) { }
 		
@@ -399,13 +309,9 @@
 		public function order_view_afterpayment(&$order_id) { }
 		
-		public function order_view_orderdata_after($order_id) { }
-		
 		/**
 		 * Wird bei der Ãnderung des Bestellstatus aufgerufen
 		 */
 		public function setOrderStatus($order_id, $status_id, $inform) { }
-
-        public function setOrderStatusMail(&$mail_text, &$mail_html, &$arAttachment, &$order_id, &$status_id) {}
-
+		
 		/**
 		 * Wird in der Bestellverwaltung aufgerufen um im rechten Bereich neue Elemente zu platzieren
@@ -413,8 +319,4 @@
 		public function order_view_sidebar(&$order_id) { }
 		
-		public function order_view($order_id, &$arSidebarArray) { }
-
-		public function order_view_row_before(&$p, $i) { }
-
 		/** Wird bei der Darstellung einer Produktzeile in der Bestellverwaltung aufgerufen */
 		public function order_view_row(&$p, $i) { }
@@ -427,20 +329,11 @@
 		
 		/** Gibt die URL fÃŒr ein Produkt zurÃŒck */
-		public function getProduktlink($produkt_id, &$url, $language_code = false) { }
+		public function getProduktlink($produkt_id, &$url) { }
 		
 		/** Wird vom Backend aufgerufen wenn die Einstellungen bearbeitet werden */
 		public function settings_edit() { }
 		
-		/** Wird vom Backend aufgerufen wenn die Einstellungen bearbeitet werden (Nach dem Formular) */
-		public function settings_edit_afterform() { }
-		
 		/** Wird vom Backend aufgerufen wenn die Einstellungen gespeichert werden sollen */
 		public function settings_save() { }
-
-        /** Wird beim deinstallieren aufgerufen wenn die Seiten gelÃ¶scht werden sollen, die der Shop angelegt hat */
-        public function wpsg_deinstall_sites() { } // public function wpsg_deinstall_sites()
-
-        /** Wird beim deinstallieren / kompletten lÃ¶schen von Produkten aufgerufen */
-        public function product_deletePermanently($product_id) { } // public function wpsg_deinstall_products()
 
 		/** Wird wÃ€hrend der Anzeige der Produkte im Frontend aufgerufen um das Template fÃŒr die Anzeige zu verÃ€ndern. */
@@ -451,5 +344,5 @@
 		
 		/** Wird beim initiieren der Module aufgerufen und erweiterte die mÃ¶glichen Versandoptionen */
-		public function addShipping(&$arShipping, $va_active = false) { }
+		public function addShipping(&$arShipping) { }
 		
 		/** Wird beim initiieren der Module aufgerufen und erweiterte die mÃ¶glichen Bezahloptionen */
@@ -476,7 +369,4 @@
 		public function basket_afterRemove() { }
 		
-		/** Integriert sich in die LÃ€nderverwaltung beim bearbeiten/anlegen eines Landes */
-		public function laender_edit() {}
-		
 		/**
 		 * Wird nach der Aktualisierung des Warenkorbs aufgerufen
@@ -497,5 +387,5 @@
 		 * Wird aufgerufen wenn ein Produkt im Warenkorb aktualisiert wird
 		 */
-		public function basket_updateProduktFromSession(&$product_index, &$stock) { }
+		public function basket_updateProduktFromSession(&$product_key, &$stock) { }
 		
 		/**
@@ -503,4 +393,7 @@
 		 */
 		public function basket_produkttosession($produkt_key, &$menge, &$ses_data) { }
+		
+		/** Ob das Produkt gekauft werden kann */
+		public function productForSale($product_key) { }
 		
 		/**
@@ -526,8 +419,5 @@
 		/** Wird von der Basket Klasse beim erstellen des Array kurz vor den Versand / Zahlungsarten aufgerufen */
 		public function basket_toArray_preshippayment(&$basket, &$arBasket) { }
-
-		/** Zeile im Warenkorb vor dem Einzelpreis */
-        public function basket_row_before(&$p, $i) { }
-
+		
 		/**
 		 * Wird nach dem Rendern des Produktes im Basket aufgerufen (aus basket.phtml)
@@ -538,5 +428,5 @@
 		 * Wird nach dem Rendern des Produktes im Basket aufgerufen (aus basket.phtml) Nach den Produkten, nur einmal
 		 */
-		public function basket_row_afterproducts() { }
+		public function basket_row_afterproducts(&$p, $i) { }
 		
 		/** Wird im Checkout und OnePageCheckout aufgerufen innerhalb der Kundendaten */
@@ -553,8 +443,5 @@
 		/** Wird im Checkout2 (checkout2.phtml) innerhalb des Formulars vor den Buttons aufgerufen */
 		public function checkout2_inner_prebutton(&$checkout_view) { }
-
-		/** Wird im Overview vor dem Einzelpreis aufgerufen */
-		public function overview_row_before(&$p, $i) { }
-
+		
 		/**
 		 * Wird bei der Zusammenfassung der Bestellung aufgerufen (overview.phtml)
@@ -579,5 +466,5 @@
 		 */
 		public function checkBasket(&$error) { }
-
+		
 		/** Wird von der wpsg_basket Klasse beim prÃŒfen des Checkouts aufgerufen */
 		public function checkCheckout(&$state, &$error, &$arCheckout) { }
@@ -595,12 +482,21 @@
 		public function mail_shipping() { }
 		
-		public function sendMail($mail_key, $order_id, $customer_id, &$empfaenger, &$subject, &$mail_text_send, &$headers, &$anhang) { }
-		
 		/** Wird beim speichern eines Kunden wÃ€hrend der Bestellung aufgerufen */
 		public function basket_save_kunde(&$data, &$checkout) { }
-				
+		
+		/**
+		 * Wird beim speichern der Bestellung in die Datenbank aufgerufen,
+		 * wird nicht beim Refresh (F5) aufgerufen.
+		 */
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) { }
+		
 		/** Wird beim lÃ¶schen der Session nach der Bestellung aufgerufen */
 		public function clearSession() { }
-				
+		
+		/**
+		 * Wird beim Speichern eines bestellten Produkts in die Datenbank aufgerufen
+		 */
+		public function basket_save_product(&$data, &$product_data, $finish_order) { }
+		
 		/**
 		 * Wird nach dem erfolgreichen Speichern der Bestellung mit der Bestell- und Kundenid aufgerufen
@@ -616,5 +512,5 @@
 		 * Wird vor dem lÃ¶schen des Kunden aufgerufen
 		 */
-		public function customer_delete_pre(&$customer_id, $delete) { }
+		public function customer_delete_pre(&$customer_id) { }
 		
 		/**
@@ -622,5 +518,5 @@
 		 */
 		public function customer_updatePwd(&$customer_id, &$customer_pwd) { } // public function customer_updatePwd(&$customer_id, &$customer_pwd)
-		 
+		
 		/**
 		 * Wird nach dem Ãndern der Kundendaten aufgerufen
@@ -632,6 +528,4 @@
 		 */
 		public function customer_created(&$customer_id, &$pwd) { }
-		
-		public function checkShippingAvailable_pre(&$arShipping) { }
 		
 		/**
@@ -650,5 +544,5 @@
 		 * 
 		 */
-		public function checkShippingAvailable(&$arShipping) { }
+		public function checkShippingAvailable(&$arShipping, &$arBasket) { }
 
 		/**
@@ -660,9 +554,9 @@
 		/** Berechnet die Kosten fÃŒr den Versand innerhalb des Warenkorbes */
 		public function calcShipping(&$arBasket, $shipping_key) { }
-				
-		/** 
-		 * Wird vor der Ausgabe des Contents aufgerufen
-		 * DEPRECATED: Durch template_redirect ersetzt, da ich da mehr Funktionen nutzen kann
-		 */
+		
+		/** Berechnet die Kosten fÃŒr die Zahlungsart innerhalb des Warenkorbes */
+		public function calcPayment(&$arBasket) { }
+		
+		/** Wird vor der Ausgabe des Contents aufgerufen */
 		public function wp_loaded() { }
 		
@@ -686,9 +580,4 @@
 		/** Wird aufgerufen um Ausgaben zwischen <html> und </html> in ein Template einzubauen */
 		public function wp_head() { }
-
-        /**
-         * Erlaubt es CSS/SCSS Dateien zur CSS Ausgabe hinzuzufÃŒgen
-         */
-		public function wpsg_scss(&$arFiles) { }
 		
 		/**
@@ -734,5 +623,5 @@
 		 * Gibt einen Wert fÃŒr eine Exportspalte zurÃŒck. Das Modul schreibt das Ergebnis in $return zurÃŒck
 		 */
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) { }
+		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) { }
 		
 		/**
@@ -767,23 +656,62 @@
 		/** Wird im Footer aufgerufen */
 		public function wp_foot() { }
-	 
-		public function installFirst() { }
 		
 		/** ------------------------------------------------------------------- */		
 
-		public function __call($name, $arguments) {
-			
-			if (method_exists($this, $name)) {
+		public function __call($name, $arguments)
+		{
+			
+			if (method_exists($this, $name))
+	        {
 	        	                   
 	        	return call_user_func_array(array($this, $name), $arguments);
 	        	
-	        } else {
-	         
-				throw \wpsg\Exception::getMethodNotFoundException($name);
-
 	        }
+	        else
+	        {
+	        
+	        	if ($name == base64_decode('Z2V0RGVtb0RheXM=')) // installModul
+	        	{
+	        		
+	        		if (isset($this->free) && $this->free === true) return 7 * 2;
+	        		
+	        		$a = $this->shop->get_option('wpsg_modul');
+	        		$a = @unserialize(base64_decode($a));
+	        		if (!is_array($a)) $a = array();	        
+	        		
+	        		if (!array_key_exists(get_class($this), $a))
+	        		{
+	        			
+	        			$a[get_class($this)] = time();
+	        			$this->shop->update_option('wpsg_modul', base64_encode(serialize($a)));
+	        			
+	        		}
+	        		
+	        		$d = ceil((time() - $a[get_class($this)]) / (43200 * 2));
+	        		if ($d > (7 * 2) || $d <= 0) return -1;
+	        		else return ((7 * 2) - $d);
+	        		
+	        	}
+	        	else if ($name == base64_decode('aW5zdGFsbEZpcnN0='))
+	        	{
+	        		
+	        		$a = $this->shop->get_option('wpsg_modul');
+	        		$a = @unserialize(base64_decode($a));
+	        		if (!is_array($a)) $a = array();	        		
+	        		
+	        		if (!array_key_exists(get_class($this), $a)) $a[get_class($this)] = time();
+	        		
+	        		$this->shop->update_option('wpsg_modul', base64_encode(serialize($a)));
+	        		
+	        		return;
+	        		
+	        	}
+	        	
+	        	return call_user_func_array($this, $name());
+
+	        }
 			
 		} // public function __call($name, $arguments)
-				
+		
 		/**
 		 * Gibt den Mehrwertsteuersatz zurÃŒck fÃŒr den ÃŒbermittelten Steuerwert
@@ -804,7 +732,6 @@
 		 * Hilfsfunktion, die von den Versand- und Zahlungsmodulen genutzt werden kann
 		 * Berechnet den Preis anhand des PreisschlÃŒssels und der MwSt
-		 * @param String $preis_key Der PreisschlÃŒssel derzeit absolute oder prozentuale Werte
-		 * @param double $preis Der Preis auf den sich die prozentualen Angaben beziehen sollen
-		 * @return float|int|string
+		 * @param String $preis_key 	Der PreisschlÃŒssel derzeit absolute oder prozentuale Werte
+		 * @param double $preis			Der Preis auf den sich die prozentualen Angaben beziehen sollen
 		 */
 		protected function getPreis($preis_key, $preis)
@@ -830,32 +757,11 @@
 				
 		/**
-		 *  Hilfsfunktion, die die Versandkosten auf den Warenkorb Array draufschlÃ€gt
+		 *  Hilfsfunktion, die die Versandkosten auf den Warenkorb Array draufschlÃ€ft
 		 *  @param $arBasket Der Array des Warenkorbs
 		 *  @param $shipping_price Die absoluten Versandkosten 
 		 *  @param $mwst_id Die ID der MwSt, 0 fÃŒr anteilig
 		 */
-		public function setShippingKosten(&$arBasket, $shipping_key, $shipping_price, $tax_key)
+		protected function setShippingKosten(&$arBasket, $shipping_key, $shipping_price, $tax_key)
 		{
-			
-			// Das richtige Land ermitteln fÃŒr FE oder BE
-			if (isset($arBasket['backend']) && ($arBasket['backend'] == true))
-			{	// Backend
-				$oCountry = wpsg_country::getInstance($arBasket['checkout']['land']);
-				$country_id = $arBasket['checkout']['land'];
-				
-			}
-			else
-			{	// Frontend
-				//$oCountry = $this->shop->getFrontendCountry($arBasket['checkout']['land']);
-				$oCountry = wpsg_country::getInstance($arBasket['checkout']['land']);
-				$country_id = $arBasket['checkout']['land'];
-				
-			}
-			if (!isset($oCountry))
-			{
-				$oCountry = $this->shop->getDefaultCountry();
-				$country_id = $oCountry->id;
-				$test = 2;
-			}
 			
 			if (in_array($tax_key, array('a', 'b', 'c', 'd', 'e')))
@@ -863,6 +769,5 @@
 				 
 				// Fixer Satz
-				//$tax_value = $this->getTaxValue($tax_key, $this->shop->getDefaultCountry());
-				$tax_value = $this->getTaxValue($tax_key, $oCountry);
+				$tax_value = $this->getTaxValue($tax_key, $this->shop->getDefaultCountry());
 				
 				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_BRUTTO)
@@ -879,14 +784,12 @@
 					$shipping_netto = $shipping_price;				
 										
-				}
-
-				$shipping_mwst = (int)$shipping_brutto - $shipping_netto;
-				if ($arBasket['noMwSt'] == true) $shipping_mwst = 0;
+				}					
+					 
+				$shipping_mwst = $shipping_brutto - $shipping_netto;
 				
 				$this->shop->basket->checkMwSt($tax_key, $this->shop->getDefaultCountry(), $arBasket);
-				$this->shop->basket->checkMwSt($tax_key, $oCountry, $arBasket);
-				
-				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$country_id]['sum'], $shipping_mwst);
-				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$country_id]['base_value'], $shipping_brutto);
+				
+				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$this->shop->getDefaultCountry(true)]['sum'], $shipping_mwst);
+				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$this->shop->getDefaultCountry(true)]['base_value'], $shipping_brutto);
 				
 				wpsg_addSet($arBasket['sum']['preis_shipping_netto'], $shipping_netto);
@@ -938,7 +841,7 @@
 					
 				}
-				 
-				$tax_sum = 0;
-				
+				
+				$mwst_sum = 0;
+			  				
 				$tax_netto_gesamt = 0;
 				$tax_brutto_gesamt = 0;				
@@ -951,11 +854,8 @@
 					{
 							
-						//$defaultCountry = $this->shop->getDefaultCountry();
-						$defaultCountry = $oCountry;
+						$defaultCountry = $this->shop->getDefaultCountry();
 						$defaultTax = $defaultCountry->getTax(substr($tax_key, 0, 1));
 
-						$tax_netto = 0;
-						if (!empty($shipping_price))
-							$tax_netto = wpsg_calculatePreis(($shipping_price * $mw_anteil), WPSG_NETTO, $defaultTax); // * $mw_anteil;
+						$tax_netto = wpsg_calculatePreis(($shipping_price * $mw_anteil), WPSG_NETTO, $defaultTax); // * $mw_anteil;
 						
 					}
@@ -993,15 +893,4 @@
 			 
 		} // protected function setShippingKosten(&$arBasket, $shipping_key, $shipping_price, $mwst_id)
-
-		/**
-		 * @param $product_key string
-		 */
-		public function canOrder($product_key) { }
-		
-		/** Bestimmt ob das Produkt angezeigt werden kann */
-		public function canDisplay($product_key) { }
-		
-		/** wird von wpsg_product aufgerufen, wenn der Produktkey ergÃ€nzt wird */
-		public function product_setProductKey(&$oProduct, $product_key) { }
 		
 		/**
@@ -1011,33 +900,12 @@
 		 *  @param $mwst_id Die ID der MwSt, 0 fÃŒr anteilig
 		 */
-		public function setPaymentKosten(&$arBasket, $payment_price, $tax_key)
+		protected function setPaymentKosten(&$arBasket, $payment_price, $tax_key)
 		{
-			
-			// Das richtige Land ermitteln fÃŒr FE oder BE
-			if (isset($arBasket['backend']) && ($arBasket['backend'] == true))
-			{	// Backend
-				$oCountry = wpsg_country::getInstance($arBasket['checkout']['land']);
-				$country_id = $arBasket['checkout']['land'];
-				
-			}
-			else
-			{	// Frontend
-				//$oCountry = $this->shop->getFrontendCountry($arBasket['checkout']['land']);
-				$oCountry = wpsg_country::getInstance($arBasket['checkout']['land']);
-				$country_id = $arBasket['checkout']['land'];
-				
-			}
-			if (!isset($oCountry))
-			{
-				$oCountry = $this->shop->getDefaultCountry();
-				$country_id = $oCountry->id;
-				$test = 2;
-			}
-			
+						
 			if (in_array($tax_key, array('a', 'b', 'c', 'd', 'e')) && !$this->shop->basket->hasEULeistungsortProduct($arBasket))
 			{
 				
 				// Fixer Satz
-				$tax_value = $this->getTaxValue($tax_key, $oCountry); 
+				$tax_value = $this->getTaxValue($tax_key, $this->shop->getDefaultCountry()); 
 				
 				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_BRUTTO)
@@ -1058,7 +926,7 @@
 				$payment_mwst = $payment_brutto - $payment_netto;
 				
-				$this->shop->basket->checkMwSt($tax_key, $oCountry, $arBasket);
-				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$country_id]['sum'], $payment_mwst);
-				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$country_id]['base_value'], $payment_brutto);
+				$this->shop->basket->checkMwSt($tax_key, $this->shop->getDefaultCountry(), $arBasket);
+				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$this->shop->getDefaultCountry(true)]['sum'], $payment_mwst);
+				wpsg_addSet($arBasket['mwst'][$tax_key.'_'.$this->shop->getDefaultCountry(true)]['base_value'], $payment_brutto);
 
 				wpsg_addSet($arBasket['sum']['preis_payment_netto'], $payment_netto);
@@ -1066,13 +934,7 @@
 				wpsg_addSet($arBasket['sum']['mwst'], $payment_mwst);
 				
-				$arBasket['payment']['mwst'] = $payment_mwst;
-				$arBasket['payment']['tax_value'] = $tax_value;
-				$arBasket['payment']['preis_payment_netto'] = $payment_netto;
-				$arBasket['payment']['preis_payment_brutto'] = $payment_brutto;
+				$arBasket['payment']['mwst'] = $tax_value; // Der Steuersatz der Zahlungsmethode
 				$arBasket['payment']['tax_rata'] = false;
-				
-				//$arBasket['payment']['mwst'] = $tax_value; // Der Steuersatz der Zahlungsmethode
-				//$arBasket['payment']['tax_rata'] = false;
-
+								
 			}
 			else
@@ -1087,5 +949,5 @@
 				{
 					
-					if ($mw['value'] > 0) $tax_base_sum += wpsg_getFloat($mw['base_value']);
+					if ($mw['value'] > 0) $tax_base_sum += $mw['base_value'];
 					
 				}
@@ -1094,5 +956,5 @@
 				{
 					 
-					if (wpsg_getFloat($mw['base_value']) > 0 && $tax_base_sum > 0)
+					if ($mw['base_value'] > 0 && $tax_base_sum > 0)
 					{
 					
@@ -1103,17 +965,6 @@
 				}
 				
-				// Sollte es keine MwSt Verteilung geben, dann auf den ersten Satz draufrechnen
-				if (!wpsg_isSizedArray($arMwStAnteile) && wpsg_isSizedArray($arBasket['mwst']))
-				{
-
-					foreach ((array)$arBasket['mwst'] as $tax_key => $mw) { $arMwStAnteile[$tax_key] = 1; break; }
-
-				}
-				
-				$mwst_sum = 0;
-				$tax_netto_gesamt = 0;
-				$tax_brutto_gesamt = 0;
-				$tax_sum = 0;
-				/* XXHR
+				$mwst_sum = 0;	
+				
 				foreach ($arMwStAnteile as $tax_key => $mw_anteil)
 				{
@@ -1143,48 +994,7 @@
 					 					
 				}
-				*/
-
-				foreach ($arMwStAnteile as $tax_key => $mw_anteil)
-				{
-						
-					$tax_netto = 0;
-					// Eventuell Nettopreis bestimmen
-					if ($this->shop->getBackendTaxview() == WPSG_BRUTTO)
-					{
-							
-						$defaultCountry = $oCountry;
-						$defaultTax = $defaultCountry->getTax(substr($tax_key, 0, 1));
-						if (!empty($payment_price))
-							$tax_netto = wpsg_calculatePreis(($payment_price * $mw_anteil), WPSG_NETTO, $defaultTax); // * $mw_anteil;
-				
-					}
-					else
-					{
-						
-						if (is_numeric($payment_price) && is_numeric($mw_anteil)) {
-						
-							$tax_netto = $payment_price * $mw_anteil;
-				
-						} else {
-													
-						}
-					}
-						
-					$tax_brutto = wpsg_calculatePreis($tax_netto, WPSG_BRUTTO, $arBasket['mwst'][$tax_key]['value']);
-						
-					$tax = $tax_brutto - $tax_netto;
-					$tax_sum += $tax;
-				
-					$tax_netto_gesamt += $tax_netto;
-					$tax_brutto_gesamt += $tax_brutto;
-						
-					wpsg_addSet($arBasket['mwst'][$tax_key]['sum'], $tax);
-					wpsg_addSet($arBasket['mwst'][$tax_key]['base_value'], $tax_brutto);
-					
-				}
-				
-				wpsg_addSet($arBasket['sum']['mwst'], $tax_sum);
-				
-				/* HR
+					
+				wpsg_addSet($arBasket['sum']['mwst'], $mwst_sum);
+				
 				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
 				{
@@ -1201,12 +1011,5 @@
 																			
 				}
-				*/
-				
-				wpsg_addSet($arBasket['sum']['preis_payment_netto'], $tax_netto_gesamt);
-				wpsg_addSet($arBasket['sum']['preis_payment_brutto'], $tax_brutto_gesamt);
-				
-				$arBasket['payment']['mwst'] = $tax_sum;
-				$arBasket['payment']['preis_payment_netto'] = $tax_netto_gesamt;
-				$arBasket['payment']['preis_payment_brutto'] = $tax_brutto_gesamt;
+									
 				$arBasket['payment']['tax_rata'] = true;
 				
@@ -1214,4 +1017,47 @@
 			
 		} // protected function setPaymentKosten(&$arBasket, $payment_price, $mwst_id)
+		
+		/**
+		 * Erweitert den Payment/Shipping Array um die GebÃŒhr
+		 */
+		protected function setPayShipPrice($geb, $mwst_value, &$arPayShip, $id)
+		{
+			
+			$arBasket = $this->shop->basket->toArray();
+						
+			if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+			{
+			
+				$payment_netto = $this->getPreis($geb, $arBasket['sum']['preis']);
+				$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+			
+			}
+			else
+			{
+				 
+				$payment_brutto = $this->getPreis($geb, $arBasket['sum']['preis']);
+				$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);
+			
+			}
+			 
+			// Entsprechenden Preis anzeigen
+			if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+			{
+							
+				$arPayShip[$id]['price_brutto'] = $payment_brutto;
+				$arPayShip[$id]['price_netto'] = $payment_netto;
+				$arPayShip[$id]['price'] = $payment_netto;
+			
+			}
+			else
+			{
+			
+				$arPayShip[$id]['price_brutto'] = $payment_brutto;
+				$arPayShip[$id]['price_netto'] = $payment_netto;
+				$arPayShip[$id]['price'] = $payment_brutto;				
+			
+			}
+			
+		} // protected function setPayShipPrice(&$geb, &$arPayShip, &$id)
 		
 		/*
@@ -1232,6 +1078,6 @@
 			{
 				
-				if ($burl) $url = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_temp/';
-				$path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_temp/';
+				if ($burl) $url = WPSG_URL_CONTENT.'uploads/wpsg_temp/';
+				$path = WP_CONTENT_DIR.'/uploads/wpsg_temp/';
 				
 			}
@@ -1247,8 +1093,6 @@
  		 * Wird beim lÃ¶schen einer Bestellung aufgerufen
  		 */
- 		public function delOrder($order_id) { } // public function delOrder($order_id)
-
-		public function systemcheck(&$arData) { } // public function systemcheck($arData)
-		
+ 		public function delOrder(&$order_id) { } // public function delOrder(&$order_id)
+ 		
 	} // class wpsg_mod_basic
 
Index: /mods/wpsg_mod_basketteaser.class.php
===================================================================
--- /mods/wpsg_mod_basketteaser.class.php	(revision 8528)
+++ /mods/wpsg_mod_basketteaser.class.php	(revision 5261)
@@ -50,9 +50,6 @@
 		public function settings_save() { 
 			
-			$arProductTemplates = $this->shop->loadProduktTemplates(true);
-
-			$this->shop->update_option('wpsg_mod_basketteaser_template', $_REQUEST['wpsg_mod_basketteaser_template'], false, false, WPSG_SANITIZE_VALUES, array_merge([0], array_keys($arProductTemplates)));
-			
-			$this->shop->update_option('wpsg_mod_basketteaser_show', $_REQUEST['wpsg_mod_basketteaser_show'], false, false, WPSG_SANITIZE_VALUES, ['0', '1']);
+			$this->shop->update_option('wpsg_mod_basketteaser_template', $_REQUEST['wpsg_mod_basketteaser_template']);
+			$this->shop->update_option('wpsg_mod_basketteaser_show', $_REQUEST['wpsg_mod_basketteaser_show']);
 			
 		} // public function settings_save()
@@ -78,5 +75,5 @@
 		} // public function basket_inner_prebutton(&$basket_view)
 		
-		public function basket_row_afterproducts() {
+		public function basket_row_afterproducts(&$p, $i) {
 			
 			if ($this->shop->get_option('wpsg_mod_basketteaser_show') != '1') return;
@@ -98,25 +95,20 @@
 			}
 			
-		} // public function basket_row_afterproducts()
-
-		public function product_addedit_content(&$product_content, &$product_data)
+		} // public function basket_row_afterproducts(&$p, $i)
+		
+		public function produkt_edit_sidebar(&$produkt_data) 
 		{
-		
+ 				
 			if (isset($_REQUEST['wpsg_lang'])) return;
 			
-			$this->shop->view['data'] = $product_data;
-			$this->shop->view['wpsg_mod_basketteaser']['data'] = $product_data;
-		
-			$product_content['wpsg_mod_basketteaser'] = array(
-					'title' => __('Warenkorbteaser', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_basketteaser/produkt_addedit_sidebar.phtml', false)
-			);
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
+			$this->shop->view['data'] = $produkt_data;
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_basketteaser/produkt_edit_sidebar.phtml');
+				
+		} // public function produkt_edit_sidebar(&$produkt_data)
 		
 		public function produkt_save_before(&$produkt_data) { 
 			
-			$produkt_data['mod_basketteaser_from'] = wpsg_toDate(wpsg_sinput("key", $_REQUEST['mod_basketteaser_from']));
-			$produkt_data['mod_basketteaser_to'] = wpsg_toDate(wpsg_sinput("key", $_REQUEST['mod_basketteaser_to']));
+			$produkt_data['mod_basketteaser_from'] = wpsg_toDate($_REQUEST['mod_basketteaser_from']);
+			$produkt_data['mod_basketteaser_to'] = wpsg_toDate($_REQUEST['mod_basketteaser_to']);
 						 
 		} // public function produkt_save_before(&$produkt_data)
@@ -148,15 +140,27 @@
 		 * Gibt einen Array mit Produktids zurÃŒck fÃŒr die aktuell anzuteasernden Produkte
 		 */
-		private function getTeaserProducts() {
+		private function getTeaserProducts()
+		{
 			
 			$arProdukteBasket = array();
 			
-			if (is_object($this->shop->basket) && is_array($this->shop->basket->toArray())) {
+			if (is_object($this->shop->basket) && is_array($this->shop->basket->toArray()))
+			{
 				
 				$arBasket = $this->shop->basket->toArray();
 				 
-				foreach ($arBasket['produkte'] as $p) {
-
-					$arProdukteBasket[] = $this->shop->getProduktID($p['id']);
+				foreach ($arBasket['produkte'] as $p)
+				{
+					
+					if (preg_match('/vp_(.*)/', $p['id']))
+					{
+						$produkt_id = preg_replace('/(vp_)|(\/(.*))/', '', $p['id']);
+					}
+					else 
+					{
+						$produkt_id = $p['id'];
+					}
+					
+					$arProdukteBasket[] = $produkt_id;
 					
 				}
@@ -175,5 +179,6 @@
 			";
 			
-			if (wpsg_isSizedArray($arProdukteBasket)) {
+			if (wpsg_isSizedArray($arProdukteBasket))
+			{
 			
 				$strQuery .= " AND P.`id` NOT IN (".implode(",", $arProdukteBasket).") ";
Index: /mods/wpsg_mod_billsafe.class.php
===================================================================
--- /mods/wpsg_mod_billsafe.class.php	(revision 8528)
+++ /mods/wpsg_mod_billsafe.class.php	(revision 5261)
@@ -90,42 +90,35 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_billsafe_bezeichnung', $_REQUEST['wpsg_mod_billsafe_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_billsafe_aktiv', $_REQUEST['wpsg_mod_billsafe_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_billsafe_aktiv_from', $_REQUEST['wpsg_mod_billsafe_aktiv_from'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_billsafe_aktiv_to', $_REQUEST['wpsg_mod_billsafe_aktiv_to'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_billsafe_hint', $_REQUEST['wpsg_mod_billsafe_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_billsafe_logo', $_REQUEST['wpsg_mod_billsafe_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_billsafe_vendorID', $_REQUEST['wpsg_mod_billsafe_vendorID'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_billsafe_licence', wpsg_xss($_REQUEST['wpsg_mod_billsafe_licence']));
-						
-			$this->shop->update_option('wpsg_mod_billsafe_sandbox', $_REQUEST['wpsg_mod_billsafe_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_billsafe_licencesandbox', wpsg_xss($_REQUEST['wpsg_mod_billsafe_licencesandbox']));
-			
-			$this->shop->update_option('wpsg_mod_billsafe_gebuehr', $_REQUEST['wpsg_mod_billsafe_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_billsafe_mwst', $_REQUEST['wpsg_mod_billsafe_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_billsafe_mwstland', $_REQUEST['wpsg_mod_billsafe_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_billsafe_currency', wpsg_xss($_REQUEST['wpsg_mod_billsafe_currency']));
-			$this->shop->update_option('wpsg_mod_billsafe_autorun', $_REQUEST['wpsg_mod_billsafe_autorun'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_billsafe_precheck', $_REQUEST['wpsg_mod_billsafe_precheck'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_billsafe_success', $_REQUEST['wpsg_mod_billsafe_success'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_billsafe_error', $_REQUEST['wpsg_mod_billsafe_error'], false, false, WPSG_SANITIZE_INT);
-			
-			$this->shop->createPage(__('Ergebnis Ihrer Billsafe Zahlung', 'wpsg'), 'wpsg_mod_billsafe_success', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_billsafe_success']));
-			$this->shop->createPage(__('Fehlgeschlagene Billsafe Zahlung', 'wpsg'), 'wpsg_mod_billsafe_error', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_billsafe_error']));
-			
-			$this->shop->addTranslationString('wpsg_mod_billsafe_bezeichnung', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_billsafe_bezeichnung']));
-			$this->shop->addTranslationString('wpsg_mod_billsafe_aktiv', wpsg_sinput(WPSG_SANITIZE_CHECKBOX, $_REQUEST['wpsg_mod_billsafe_aktiv']));
+			
+			$this->shop->update_option('wpsg_mod_billsafe_bezeichnung', $_REQUEST['wpsg_mod_billsafe_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_billsafe_aktiv', $_REQUEST['wpsg_mod_billsafe_aktiv']);
+			$this->shop->update_option('wpsg_mod_billsafe_aktiv_from', $_REQUEST['wpsg_mod_billsafe_aktiv_from']);
+			$this->shop->update_option('wpsg_mod_billsafe_aktiv_to', $_REQUEST['wpsg_mod_billsafe_aktiv_to']);
+			$this->shop->update_option('wpsg_mod_billsafe_hint', $_REQUEST['wpsg_mod_billsafe_hint']);
+			$this->shop->update_option('wpsg_mod_billsafe_logo', $_REQUEST['wpsg_mod_billsafe_logo']);
+			
+			$this->shop->update_option('wpsg_mod_billsafe_vendorID', $_REQUEST['wpsg_mod_billsafe_vendorID']);
+			$this->shop->update_option('wpsg_mod_billsafe_licence', $_REQUEST['wpsg_mod_billsafe_licence']);
+						
+			$this->shop->update_option('wpsg_mod_billsafe_sandbox', $_REQUEST['wpsg_mod_billsafe_sandbox']);
+			$this->shop->update_option('wpsg_mod_billsafe_licencesandbox', $_REQUEST['wpsg_mod_billsafe_licencesandbox']);
+			
+			$this->shop->update_option('wpsg_mod_billsafe_gebuehr', $_REQUEST['wpsg_mod_billsafe_gebuehr']);
+			$this->shop->update_option('wpsg_mod_billsafe_mwst', $_REQUEST['wpsg_mod_billsafe_mwst']);
+			$this->shop->update_option('wpsg_mod_billsafe_mwstland', $_REQUEST['wpsg_mod_billsafe_mwstland']);
+			
+			$this->shop->update_option('wpsg_mod_billsafe_currency', $_REQUEST['wpsg_mod_billsafe_currency']);
+			$this->shop->update_option('wpsg_mod_billsafe_autorun', $_REQUEST['wpsg_mod_billsafe_autorun']);
+			$this->shop->update_option('wpsg_mod_billsafe_precheck', $_REQUEST['wpsg_mod_billsafe_precheck']);
+			$this->shop->update_option('wpsg_mod_billsafe_success', $_REQUEST['wpsg_mod_billsafe_success']);
+			$this->shop->update_option('wpsg_mod_billsafe_error', $_REQUEST['wpsg_mod_billsafe_error']);
+			
+			$this->shop->createPage(__('Ergebnis Ihrer Billsafe Zahlung', 'wpsg'), 'wpsg_mod_billsafe_success', $_REQUEST['wpsg_mod_billsafe_success']);
+			$this->shop->createPage(__('Fehlgeschlagene Billsafe Zahlung', 'wpsg'), 'wpsg_mod_billsafe_error', $_REQUEST['wpsg_mod_billsafe_error']);
+			
+			$this->shop->addTranslationString('wpsg_mod_billsafe_bezeichnung', $_REQUEST['wpsg_mod_billsafe_bezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_billsafe_aktiv', $_REQUEST['wpsg_mod_billsafe_aktiv']);
 			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_billsafe_success'));
-            wp_delete_post($this->shop->get_option('wpsg_mod_billsafe_error'));
-
-        } // public function wpsg_deinstall_sites()
 		 
 		public function addPayment(&$arPayment) 
@@ -133,15 +126,151 @@
 		
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_billsafe_aktiv') != '1');
-			  	
+			 
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_billsafe_mwst'), $this->shop->getDefaultCountry());
+						
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
 				'name' => __($this->shop->get_option('wpsg_mod_billsafe_bezeichnung'), 'wpsg'),
-				'price' => $this->shop->get_option('wpsg_mod_billsafe_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_billsafe_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_billsafe_gebuehr'),
+				'mwst_key' => $this->shop->get_option('wpsg_mod_billsafe_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_billsafe_mwstland'),
 				'hint' => __($this->shop->get_option('wpsg_mod_billsafe_hint')),
-				'logo' => $this->shop->getRessourceURL('mods/mod_billsafe/gfx/logo_100x25.png'),
+				'logo' => WPSG_URL_CONTENT.'plugins/wpshopgermany/views/gfx/billsafe.png',
+				'logo_100x25' => $this->shop->getRessourceURL('mods/mod_billsafe/gfx/logo_100x25.png')
 			);
-			 						
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				/*
+				 * VorabprÃŒfung ob Zahlungsart mÃ¶glich ist (Wenn Option "VorabprÃŒfung" aktiviert ist)
+				 */
+				if ($this->shop->get_option('wpsg_mod_billsafe_precheck') == '1')
+				{
+										
+					require_once dirname(__FILE__).'/mod_billsafe/Billsafe/Sdk.php';
+					 
+					$strLand = $this->db->fetchOne("SELECT L.`kuerzel` FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($arBasket['checkout']['land'])."'");
+					
+					$shipping_firma = $arBasket['checkout']['firma']; 
+					$shipping_firstname = $arBasket['checkout']['vname'];
+					$shipping_lastname = $arBasket['checkout']['name'];
+					$shipping_street = $arBasket['checkout']['strasse']; 
+					$shipping_postcode = $arBasket['checkout']['plz'];
+					$shipping_city = $arBasket['checkout']['ort'];
+					$shipping_country = $strLand;
+					 
+					if 
+						(	
+							$this->shop->hasMod('wpsg_mod_shippingadress') && 
+							(	
+								$_SESSION['wpsg']['checkout']['shipping_firma'] != '' && $_SESSION['wpsg']['checkout']['shipping_firma'] != $shipping_firma && 
+								$_SESSION['wpsg']['checkout']['shipping_name'] != '' && $_SESSION['wpsg']['checkout']['shipping_name'] != $shipping_lastname && 
+								$_SESSION['wpsg']['checkout']['shipping_vname'] != '' && $_SESSION['wpsg']['checkout']['shipping_vname'] != $shipping_firstname
+							)
+						)
+					{
+  
+						$shipping_firma = $_SESSION['wpsg']['checkout']['shipping_firma'];
+						$shipping_firstname = $_SESSION['wpsg']['checkout']['shipping_name'];
+						$shipping_lastname = $_SESSION['wpsg']['checkout']['shipping_vname'];
+						$shipping_street = $_SESSION['wpsg']['checkout']['shipping_strasse'];
+						$shipping_postcode = $_SESSION['wpsg']['checkout']['shipping_plz'];
+						$shipping_city = $_SESSION['wpsg']['checkout']['shipping_ort'];
+						
+						if ($_SESSION['wpsg']['checkout']['shipping_land'] > 0)
+							$shipping_country = $this->db->fetchOne("SELECT L.`kuerzel` FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($_SESSION['wpsg']['checkout']['shipping_land'])."'"); 
+						
+					}
+					
+					$arParam = array(   
+						'isLiveMode' => (($this->shop->get_option('wpsg_mod_billsafe_sandbox') == 1)?false:true),
+						'isUtf8Mode' => true,
+						'apiVersion' => '206',
+						'gatewayVersion' => '200',
+					
+						'order_amount' => wpsg_round($arBasket['sum']['preis_gesamt_brutto'], 2),
+						'order_currencyCode' => 'EUR',
+						'customer_company' => $arBasket['checkout']['firma'],
+						'customer_firstname' =>	$arBasket['checkout']['vname'],
+						'customer_lastname' => $arBasket['checkout']['name'],
+						'customer_street' => $arBasket['checkout']['strasse'], 
+						'customer_postcode'	=> $arBasket['checkout']['plz'],
+						'customer_city' => $arBasket['checkout']['ort'], 
+						'customer_email' => $arBasket['checkout']['email'],
+						'customer_phone' => $arBasket['checkout']['tel'],
+						'customer_country' => $strLand,
+					
+						'deliveryAddress_company' => $shipping_firma,
+						'deliveryAddress_firstname' => $shipping_firstname,
+						'deliveryAddress_lastname' => $shipping_lastname,
+						'deliveryAddress_street' => $shipping_street,
+						'deliveryAddress_postcode' => $shipping_postcode,
+						'deliveryAddress_city' => $shipping_city,
+						'deliveryAddress_country' => $shipping_country
+					); 
+					 
+					$bs = new Billsafe_Sdk();
+		
+					$bs->setCredentials(
+						array(
+				    		'merchantId' => $this->shop->get_option('wpsg_mod_billsafe_vendorID'),
+				    		'merchantLicenseSandbox' => $this->shop->get_option('wpsg_mod_billsafe_licencesandbox'),
+				    		'merchantLicenseLive' => $this->shop->get_option('wpsg_mod_billsafe_licence'),
+				    		'applicationSignature' => $this->applicationSignature,
+							'applicationVersion' => 'wpShopGermany Versio '.WPSG_VERSION
+						)
+					);
+					
+					$bs->setUtf8Mode(true);
+					$bs->setMode(((get_option('wpsg_mod_billsafe_sandbox') == 1)?false:Billsafe_Sdk::LIVE));
+					
+					$response = $bs->callMethod('prevalidateOrder', $arParam);
+				 
+					if ($response->invoice->isAvailable != "TRUE") 
+					{
+						
+						unset($arPayment[$this->id]);
+						
+						return false;
+						
+					}
+					
+				}
+				 
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_billsafe_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_billsafe_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+						
 		} // public function addPayment(&$arPayment)
 		
@@ -170,4 +299,38 @@
 		} // public function checkPaymentAvailable(&$arPayment, &$arBasket)		 
 		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			 
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_billsafe_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_billsafe_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+					
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_billsafe_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket) 
+	
 		public function order_ajax() 
 		{ 
@@ -178,5 +341,5 @@
 				$strFileName = $this->getFilePath($_REQUEST['edit_id']).'/billsafe_rechnung.pdf';
 				
-				header('Content-Disposition: attachment; filename="billsafe_rechnung_'.wpsg_sinput("key", $_REQUEST['edit_id']).'.pdf"');
+				header('Content-Disposition: attachment; filename="billsafe_rechnung_'.$_REQUEST['edit_id'].'.pdf"');				
 				header("Cache-Control: no-cache, must-revalidate");
 				header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 
@@ -188,28 +351,23 @@
 			
 		} // public function order_ajax()
-
-		public function order_view($order_id, &$arSidebarArray)
+		
+		public function order_view_sidebar(&$order_id) 
 		{
 
 			$order_data = $this->shop->cache->loadOrder($order_id);
-
+			
 			if ($order_data['type_payment'] != $this->id) return;
-
-			$this->shop->view['wpsg_mod_billsafe']['data'] = $order_data;
-
+			
+			$this->shop->view['wpsg_mod_billsafe']['data'] = $order_data;		 
+	 
 			if (file_exists($this->getFilePath($order_id).'/billsafe_rechnung.pdf'))
-			{
-
+			{	
 				$this->shop->view['wpsg_mod_billsafe']['rechnung_url'] = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_billsafe&edit_id='.$order_id.'&noheader=1&do=getInvoice';
-
-			}
-
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_billsafe/order_view_sidebar.phtml', false)
-			);
-
-		} // public function order_view(&$arSidebarArray)
-
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_billsafe/order_view_sidebar.phtml');
+			
+		}
+		
 		public function order_done(&$order_id, &$done_view) 
 		{ 
@@ -269,8 +427,7 @@
 		{ 
 			
-			if (wpsg_get_the_id() <= 0) return;
-			$_REQUEST['token'] = wpsg_sinput("text_field", $_REQUEST['token']);
-
-			if ($this->shop->get_option('wpsg_mod_billsafe_success') == wpsg_get_the_id() && isset($_REQUEST['token']))
+			if (get_the_id() <= 0) return;
+			
+			if ($this->shop->get_option('wpsg_mod_billsafe_success') == get_the_id() && isset($_REQUEST['token']))
 			{
  
@@ -394,5 +551,5 @@
 			}
 			
-		} // public function template_redirect()
+		} // public function wp_loaded()
 
 		public function setOrderStatus($order_id, $status_id, $inform) 
@@ -451,7 +608,7 @@
 			
 			ob_start();
-			//var_dump($response);
+			var_dump($response);
 			$strMailtext = ob_get_contents();
-			ob_end_clean(); 
+			ob_end_clean();
 			
 			// Eintrag ins Protokoll
@@ -570,7 +727,7 @@
 			{
 				
-				if (preg_match('/^pv_(.*)/', $op['id']))
-				{
-					$produkt_id = preg_replace('/(^pv_)|(\|(.*)$)/', '', $op['id']);
+				if (preg_match('/^vp_(.*)/', $op['id']))
+				{
+					$produkt_id = preg_replace('/(^vp_)|(\/(.*)$)/', '', $op['id']);
 				}
 				else
@@ -588,5 +745,5 @@
 				{
 					
-					$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_code` = '".wpsg_q($this->shop->getCurrentLanguageCode())."'");
+					$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
 					
 					if ($produkt_trans['id'] > 0)
@@ -757,22 +914,55 @@
  		{
  		  			
- 			if ($this->shop->isMultiBlog()) {
-
+ 			if ($this->shop->isMultiBlog())
+			{
+
+				$htaccess = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_billsafe/.htaccess';
 				$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_billsafe/'.$order_id.'/'; 
-				
-				if ($url) { $url = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_billsafe/'.$order_id.'/'; } 
+				if (!file_exists($path)) mkdir($path, 0777, true); 
+				
+				if ($url)
+				{
+					
+					$url = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_billsafe/'.$order_id.'/';
+					 
+				} 
 				 
-			} else {
-				
-				$path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_billsafe/'.$order_id.'/';
-				
-				if ($url) { $url = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_billsafe/'.$order_id.'/'; }
+			}
+			else
+			{
+				
+				$htaccess = WP_CONTENT_DIR.'/uploads/wpsg_billsafe/.htaccess';
+				$path = WP_CONTENT_DIR.'/uploads/wpsg_billsafe/'.$order_id.'/';
+				if (!file_exists($path)) mkdir($path, 0777, true);
+				
+				if ($url) 
+				{
+					
+					$url = WPSG_URL_CONTENT.'uploads/wpsg_billsafe/'.$order_id.'/';
+					
+				}
 				
 			} 
 			 
-			$this->shop->protectDirectory($path);
-						
-			if ($url !== false) return $url;
-			else return $path;
+ 			if (!file_exists($htaccess))
+			{
+				
+				$handle = fopen($htaccess, "w+");
+				
+				$content = 'Deny from all';
+							
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+			
+			if ($url !== false)
+			{
+				
+				return $url;
+				
+			}
+			
+			return $path;
 			 
  		} // private function getFilePath($produkt_id, $url = false)
Index: /mods/wpsg_mod_cab.class.php
===================================================================
--- /mods/wpsg_mod_cab.class.php	(revision 5261)
+++ /mods/wpsg_mod_cab.class.php	(revision 5261)
@@ -0,0 +1,800 @@
+<?php
+
+	/**
+	 * Klasse die die Zahlungsart Click&Buy ermÃ¶glicht
+	 * @author daniel
+	 */
+	class wpsg_mod_cab extends wpsg_mod_basic 
+	{
+		
+		var $lizenz = 2;
+		var $id = 810; 
+		
+		var $version = "9.9.9";
+		var $hilfeURL = 'http://wpshopgermany.de/?p=969';		 
+		var $free = true;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Click & Buy', 'wpsg');
+			$this->group = __('Zahlungsarten', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht die Zahlungsart ClickandBuy.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function install()
+		{
+			
+			$this->shop->checkDefault('wpsg_mod_cab_bezeichnung', $this->name, false, true);
+			$this->shop->checkDefault('wpsg_mod_cab_bezeichnung', '', false, true);
+			$this->shop->checkDefault('wpsg_mod_cab_aktiv', '1');
+			$this->shop->checkDefault('wpsg_mod_cab_sandbox', '1');
+			$this->shop->checkDefault('wpsg_mod_cab_hint', __('Wickeln Sie ihre Bestellung ÃŒber Click&Buy ab.', 'wpsg'), false, true);
+			
+			$this->shop->checkDefault('wpsg_mod_cab_merchantID', '<!-- Erhalten Sie von Click&Buy --!>');
+			$this->shop->checkDefault('wpsg_mod_cab_projectID', '<!-- Erhalten Sie von Click&Buy --!>');
+			$this->shop->checkDefault('wpsg_mod_cab_kryptkey', '<!-- Erhalten Sie von Click&Buy --!>');
+			
+			$this->shop->checkDefault('wpsg_mod_cab_mmskryptkey', '<!-- Erhalten Sie von Click&Buy --!>');
+			$this->shop->checkDefault('wpsg_mod_cab_mmsstatusmail', '');
+			
+			$this->shop->checkDefault('wpsg_mod_cab_mmskryptkey', '');
+			$this->shop->checkDefault('wpsg_mod_cab_mmsstatusmail', '');
+			
+			$this->shop->checkDefault('wpsg_mod_cab_gebuehr', '0');
+			$this->shop->checkDefault('wpsg_mod_cab_mwst', '0');
+			$this->shop->checkDefault('wpsg_mod_cab_mwstland', '0');
+			
+			$this->shop->checkDefault('wpsg_mod_cab_currency', 'EUR');
+			$this->shop->checkDefault('wpsg_mod_cab_autorun', '0');
+			
+			// Bestelltabelle erweitern
+		  	require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			$sql = "CREATE TABLE ".WPSG_TBL_ORDER." (
+		   		cab_externalid varchar(255) NOT NULL,
+   				cab_requestTrackingID varchar(255) NOT NULL,
+   				cab_transactionID varchar(255) NOT NULL,
+			   	cab_transactionStatus varchar(255) NOT NULL,
+		   		cab_started datetime NOT NULL,
+   				cab_lastupdate datetime NOT NULL,
+		   		cab_paylink varchar(5000) NOT NULL,
+   				cab_repayed double(10,2) NOT NULL
+		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			 
+			dbDelta($sql);
+			 
+			// Tabelle fÃŒr Click&Buy Log 			
+			$sql = "CREATE TABLE ".WPSG_TBL_CABLOG." (
+		   		id mediumint(9) NOT NULL AUTO_INCREMENT,
+			  	cdate datetime NOT NULL,
+			  	extID varchar(255) NOT NULL,
+			  	transID varchar(255) NOT NULL,
+			  	eventID int(11) NOT NULL,
+			  	oldState varchar(255) NOT NULL,
+			  	newState varchar(255) NOT NULL,
+			  	PRIMARY KEY  (id)	  
+		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			
+			dbDelta($sql);
+			
+		} // public function install()
+		
+		public function delOrder(&$order_id) { } // public function delOrder(&$order_id)
+		
+		public function settings_edit()
+		{
+						
+			$pages = get_pages();
+			 
+			foreach ($pages as $k => $v)
+			{
+				
+				$this->shop->view['pages'][$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
+				$this->shop->view['pageURLs'][$v->ID] = get_permalink($v->ID);
+				
+			}
+			
+			$basket_link = get_permalink(get_option('wpsg_page_basket'));
+			
+			if (strpos($basket_link, "?") > 0)
+			{
+				$mmsURL = $basket_link."&wpsg_plugin=wpsg_mod_cab&confirm=mms&no_head=1";
+			}
+			else
+			{
+				$mmsURL = $basket_link."?wpsg_plugin=wpsg_mod_cab&confirm=mms&no_head=1";
+			}
+			
+			$this->shop->view['wpsg_mod_cab_mmspushurl'] = preg_replace("/^http:/", "https:", $mmsURL);
+						
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_cab_bezeichnung', $_REQUEST['wpsg_mod_cab_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_cab_auftragsbezeichnung', $_REQUEST['wpsg_mod_cab_auftragsbezeichnung']);
+			$this->shop->update_option('wpsg_mod_cab_aktiv', $_REQUEST['wpsg_mod_cab_aktiv']);
+			$this->shop->update_option('wpsg_mod_cab_sandbox', $_REQUEST['wpsg_mod_cab_sandbox']);
+			$this->shop->update_option('wpsg_mod_cab_hint', $_REQUEST['wpsg_mod_cab_hint']);
+			
+			$this->shop->update_option('wpsg_mod_cab_merchantID', $_REQUEST['wpsg_mod_cab_merchantID']);
+			$this->shop->update_option('wpsg_mod_cab_projectID', $_REQUEST['wpsg_mod_cab_projectID']);
+			$this->shop->update_option('wpsg_mod_cab_kryptkey', $_REQUEST['wpsg_mod_cab_kryptkey']);
+			
+			$this->shop->update_option('wpsg_mod_cab_mmskryptkey', $_REQUEST['wpsg_mod_cab_mmskryptkey']);
+			$this->shop->update_option('wpsg_mod_cab_mmsstatusmail', $_REQUEST['wpsg_mod_cab_mmsstatusmail']);
+			
+			$this->shop->update_option('wpsg_mod_cab_success', $_REQUEST['wpsg_mod_cab_success']);
+			$this->shop->update_option('wpsg_mod_cab_error', $_REQUEST['wpsg_mod_cab_error']);
+			
+			$this->shop->update_option('wpsg_mod_cab_gebuehr', $_REQUEST['wpsg_mod_cab_gebuehr']);
+			$this->shop->update_option('wpsg_mod_cab_mwst', $_REQUEST['wpsg_mod_cab_mwst']);
+			$this->shop->update_option('wpsg_mod_cab_mwstland', $_REQUEST['wpsg_mod_cab_mwstland']);
+			
+			$this->shop->update_option('wpsg_mod_cab_currency', $_REQUEST['wpsg_mod_cab_currency']);
+			$this->shop->update_option('wpsg_mod_cab_autorun', $_REQUEST['wpsg_mod_cab_autorun']);
+			
+			$this->shop->addTranslationString('wpsg_mod_cab_bezeichnung', $_REQUEST['wpsg_mod_cab_bezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_cab_auftragsbezeichnung', $_REQUEST['wpsg_mod_cab_auftragsbezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_cab_hint', $_REQUEST['wpsg_mod_cab_hint']);
+			
+		} // public function settings_save()
+		
+		public function addPayment(&$arPayment) 
+		{
+		
+			if (!is_admin() && $this->shop->get_option('wpsg_mod_cab_aktiv') != '1') return;
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_cab_mwst'), $this->shop->getDefaultCountry());
+			
+			$arPayment[$this->id] = array(
+				'id' => $this->id,
+				'name' => __($this->shop->get_option('wpsg_mod_cab_bezeichnung'), 'wpsg'),
+				'preis' => $this->shop->get_option('wpsg_mod_cab_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_cabmwst'),
+				'mwst_value' => $mwst_value,
+				'mwst_null' => $this->shop->get_option('wpsg_mod_cab_mwstland'),
+				'hint' => __($this->shop->get_option('wpsg_mod_cab_hint')),
+				'logo' => WPSG_URL_CONTENT.'plugins/wpshopgermany/views/gfx/cab.png' 
+			);
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				 
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_cab_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_cab_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
+		} // public function addPayment(&$arPayment)
+
+		public function order_view_content($order_id)
+		{
+			
+			$order_data = $this->shop->cache->LoadOrder($order_id);
+			
+			if ($order_data['type_payment'] != $this->id) return false;
+			
+			$this->shop->view['wpsg_mod_cab']['order'] = $order_data;
+			$this->shop->view['wpsg_mod_cab']['content'] = $this->order_view_content_inner($order_id); 
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/order_view_content.phtml');
+			
+		} // public function order_view_content($order_id)
+
+		public function order_ajax()
+		{
+			
+			 if ($_REQUEST['cmd'] == 'refresh')
+			 {
+			 	 
+				$this->getPaymentStatus($_REQUEST['edit_id']);
+				$this->shop->cache->clearOrderCache($_REQUEST['edit_id']);
+				
+				die($this->order_view_content_inner($_REQUEST['edit_id']));
+			 	
+			 }
+			 else if ($_REQUEST['cmd'] == 'rebuild')
+			 {
+			 	
+			 	$order_data = $this->shop->cache->loadOrder($_REQUEST['edit_id']);			 	
+			 	$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
+			 	
+			 	$arBasket = $this->shop->cache->loadBasketArray($_REQUEST['edit_id']);
+			 	
+			 	$this->shop->view['wpsg_mod_cab']['payLink'] = $this->startPayment($arBasket, $order_data['id'], $order_data['k_id']);
+				 
+			 	$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+			 		'cab_paylink' => $this->shop->view['wpsg_mod_cab']['payLink']
+			 	), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+			 	
+			 	$this->shop->cache->clearOrderCache($_REQUEST['edit_id']);
+			 	
+			 	$this->shop->view['wpsg_mod_cab']['order'] = $order_data;
+			 	$this->shop->view['wpsg_mod_cab']['customer'] = $customer_data;
+			 	
+				$tpl = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/mail_resend.phtml', false);
+				
+				$empfaenger = $customer_data['email'];
+				$betreff = __("Neuer ClickandBuy Bezahl Link", "wpsg");
+				
+				mail($empfaenger, $betreff, $tpl);
+				
+				$this->db->ImportQuery(WPSG_TBL_OL, array(
+					"cdate" => "NOW()",
+					"o_id" => wpsg_q($_REQUEST['edit_id']),
+					"title" => $betreff,				
+					"mailtext" => $tpl
+				));
+				
+				die($this->order_view_content_inner($_REQUEST['edit_id']));
+			 	
+			 }
+			 else if ($_REQUEST['cmd'] == 'repay')
+			 {
+			 	
+			 	$repay = wpsg_tf($_REQUEST['value']);
+				
+			 	$order_data = $this->shop->cache->loadOrder($_REQUEST['edit_id']);
+			 	
+				// Value checken
+				if ($repay > ($order_data['price_gesamt'] - $order_data['cab_repayed']))
+				{				
+					$this->strError = __("Der angefragte RÃŒckzahlungsbetrag ist grÃ¶Ãer als der noch nicht zurÃŒckgezahlte Betrag!", "wpsg");
+				}
+				else if ($repay <= 0 || $repay == "")
+				{
+					$this->strError = __("Der angefragte RÃŒckzahlungsbetrag muss grÃ¶Ãer als 0 sein!", "wpsg");
+				}
+				else 
+				{
+					
+					$bReturn = $this->refundPayment($_REQUEST['edit_id'], $repay);
+					
+					if (!$bReturn)
+					{
+						$this->strError = __("Es gab technische Probleme, die RÃŒckzahlung konnte nicht ausgefÃŒhrt werden.", "wpsg");
+					}
+					else
+					{
+						
+						$this->db->UpdateQuery(WPSG_TBL_OL, array(
+							"cab_repayed" => ($order_data['cab_repayed'] + $repay)
+						), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+						
+					}
+					
+				}
+				
+				die($this->order_view_content_inner($_REQUEST['edit_id']));
+			 	
+			 }
+			
+		} // public function order_ajax()
+		
+		public function wp_loaded() 
+		{ 
+				   
+			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_cab' && $_REQUEST['cab'] == 'success')
+			{
+
+				$this->shop->redirect(get_permalink($this->shop->get_option('wpsg_mod_cab_success')));
+				
+			}
+			else if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_cab' && $_REQUEST['cab'] == 'error')
+			{
+				
+				$this->shop->redirect(get_permalink($this->shop->get_option('wpsg_mod_cab_error')));
+				
+			}
+			else if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_cab' && $_REQUEST['confirm'] == 'mms')			
+			{
+				
+				$_REQUEST['xml'] = stripslashes($_REQUEST['xml']);
+				$xml = simplexml_load_string($_REQUEST['xml']);
+				
+				$signature = $xml->signature;
+				$npayEvents = sizeof($xml->{payEvent});
+
+				// Hash ÃŒberprÃŒfen
+				$bOK = $this->makeMMSHash($_REQUEST['xml'], get_option('wpsg_mod_cab_mmskryptkey'));
+				
+				if ($bOK && isset($_REQUEST['xml']))
+				{
+				
+					$nUpdated = 0;
+					foreach ($xml->{payEvent} as $payEvent)
+					{
+				
+						$creationDateTime = strtotime($payEvent->{"creationDateTime"});
+						 
+						$order = $this->db->fetchRow("
+							SELECT 
+								*,
+								UNIX_TIMESTAMP(`cab_lastupdate`)
+							FROM
+								`".WPSG_TBL_ORDER."`
+							WHERE
+								`cab_externalid` = '".wpsg_q($payEvent->{"externalID"})."' AND
+								`cab_transactionID` = '".wpsg_q($payEvent->{"transactionID"})."' AND
+								UNIX_TIMESTAMP(`cab_lastupdate`) < '".wpsg_q($creationDateTime)."' 
+						"); 
+						
+						if (is_array($order) && $order['id'] > 0)
+						{
+								
+							// Ins Protokoll eintragen wenn noch nicht drin
+							$bExists = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_OL."` WHERE `extID` = '".wpsg_q_($order['cab_externalid'])."' AND `eventID` = '".wpsg_q($payEvent->{"eventID"})."'");
+							
+							if ($bExists <= 0)
+							{
+								
+								$this->db->updateQuery(
+									WPSG_TBL_OL,
+									array(
+										"cab_lastupdate" => "NOW()",
+										"cab_transactionStatus" => wpsg_q($payEvent->{"newState"})
+									)
+								);
+								
+								$this->db->ImportQuery(
+									WPSG_TBL_CABLOG,
+									array(
+										"cdate" => "NOW()",
+										"extID" => wpsg_q($payEvent->{"externalID"}),
+										"transID" => wpsg_q($payEvent->{"transactionID"}),
+										"eventID" => wpsg_q($payEvent->{"eventID"}),
+										"oldState" => wpsg_q($payEvent->{"oldState"}),
+										"newState" => wpsg_q($payEvent->{"newState"})
+									)
+								);							
+								
+							}
+							
+							$nUpdated ++;
+							
+						}
+						
+					}
+					
+					if (get_option("wpsg_mod_cab_mmsstatusmail") != "")
+					{
+						
+						// Hinweismail an angegebene Mail Adresse senden 
+						$this->view['wpsg_mod_cab']['nUpdated'] = $nUpdated;
+						$this->view['wpsg_mod_cab']['xml'] = $_REQUEST['xml'];
+						
+						$tpl = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/mail_mms.phtml', false);
+						  
+						mail(get_option("wpsg_mod_cab_mmsstatusmail"), __("Neue MMS StatusÃ€nderungen ERFOLG", "wpsg"), $tpl, $header);
+												
+					}
+					
+					die("OK");
+					
+				}
+				else
+				{
+
+					if (get_option("wpsg_mod_cab_mmsstatusmail") != "")
+					{
+						
+						$this->view['wpsg_mod_cab']['hash'] = $hash;
+						$this->view['wpsg_mod_cab']['xml'] = $_REQUEST['xml'];
+						
+						$tpl = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/mail_mms_error.phtml', false);
+						  
+						mail(get_option("wpsg_mod_cab_mmsstatusmail"), __("Neue MMS StatusÃ€nderungen FEHLER", "wpsg"), $tpl, $header);
+						
+					}
+					
+				}
+				
+			}
+			
+		} // public function wp_loaded() 
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			 
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_cab_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_cab_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_cab_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket) 
+ 		
+		public function basket_save_done_array(&$order_id, &$kunde_id, &$arBasket) 
+		{ 
+			 	 
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			
+				$this->startPayment($arBasket, $order_id, $kunde_id);
+				
+			}
+			 
+		} // public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
+				
+		public function order_done(&$order_id, &$done_view) 
+		{
+			
+			// Bestellungen mit 0 geben nix aus
+			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
+			
+			$order_data = $this->shop->cache->loadOrder($order_id);
+			 			
+			if ($order_data['type_payment'] != $this->id) return;
+			
+			$this->shop->view['wpsg_mod_cab']['url'] = $order_data['cab_paylink'];
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/order_done.phtml');
+			
+		}  // public function order_done($order_id)
+		 		
+		/** Modufunctionen */
+		
+		/**
+		 * Zeichnet den inneren Teil, der mit Ajax nachgeladen wird
+		 */
+		public function order_view_content_inner($order_id)
+		{
+
+			$order_data = $this->shop->cache->LoadOrder($order_id);
+			
+			if ($order_data['type_payment'] != $this->id) return false;
+			
+			$this->shop->view['wpsg_mod_cab']['order'] = $order_data;
+			
+			if (isset($this->strError)) $this->shop->view['wpsg_mod_cab']['strError'] = $this->strError;
+			 
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_cab/order_view_content_inner.phtml', false);
+			
+		} // public function order_view_content_inner($order_id)
+				
+		/**
+		 * Startet einen Bezahlvorgang und gibt den Link zum bezahlen zurÃŒck
+		 * @param unknown_type $order
+		 */
+		private function startPayment($arBasket, $order_id, $kunde_id)
+		{
+ 
+			$basket_link = get_permalink($this->shop->get_option('wpsg_page_basket'));
+			
+			if (strpos($basket_link, "?") > 0)
+			{
+				$successURL = $basket_link."&wpsg_plugin=wpsg_mod_cab&cab=success&order_id=".$order_id;
+			}
+			else
+			{
+				$successURL = $basket_link."?wpsg_plugin=wpsg_mod_cab&cab=success&order_id=".$order_id;
+			}
+			
+			if (strpos($basket_link, "?") > 0)
+			{
+				$failureURL = $basket_link."&wpsg_plugin=wpsg_mod_cab&cab=error&order_id=".$order_id;
+			}
+			else
+			{
+				$failureURL = $basket_link."?wpsg_plugin=wpsg_mod_cab&cab=error&order_id=".$order_id;
+			}
+			
+			//wpsg_debug("SUCCESSLINK:".$successURL);
+			//wpsg_debug("FAILURELINK:".$failureURL);
+			
+			$externalID = time().":".$order_id;
+					
+			// ClickandBuy Authentifizierung
+			$authentication = array();
+			$authentication['merchantID'] = $this->shop->get_option("wpsg_mod_cab_merchantID");
+			$authentication['projectID'] = $this->shop->get_option("wpsg_mod_cab_projectID");
+			$authentication['secretKey'] = $this->shop->get_option("wpsg_mod_cab_kryptkey");
+			$authentication['token'] = $this->generateToken($authentication['projectID'], $authentication['secretKey']);
+			
+			foreach ($arBasket['produkte'] as $p)
+			{
+				
+				if (preg_match('/^vp_(.*)/', $p['id']))
+				{
+					
+					$produkt_id = preg_replace('/(^vp_)|(\/(.*)$)/', '', $op['id']);
+					
+				}
+				else
+				{
+					
+					$produkt_id = $p['id'];
+					
+				}
+				
+				$produkt_db = $this->shop->cache->loadProduct($produkt_id);
+				
+				$product_name = $produkt_db['name']; 
+				
+				// Ãbersetzung checken
+				if ($this->shop->isOtherLang())
+				{
+					
+					$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
+					
+					if ($produkt_trans['id'] > 0)
+					{
+						
+						$product_name = $produkt_trans['name']; 
+						
+					}
+					
+				}
+				
+				$item = array();
+				$item['description'] = $product_name;	
+				$item['itemType'] = "ITEM";		
+				$item['quantity'] = $p['menge'];
+				$item['unitPrice']['amount'] = number_format($p['preis_brutto'], 2, '.', '');
+				$item['unitPrice']['currency'] = $this->shop->get_option("wpsg_mod_cab_currency");
+				$item['totalPrice']['amount'] = number_format($p['menge'] * $p['preis_brutto'], 2, '.', '');
+				$item['totalPrice']['currency'] = $this->shop->get_option("wpsg_mod_cab_currency");
+ 
+				$arItems[] = $item; 
+
+				$itemPrice += $p['menge'] * $p['preis_brutto'];
+				
+			}
+			
+			$plus = $arBasket['sum']['preis_gesamt_brutto'] - $itemPrice;
+			
+			if ($plus > 0)
+			{
+				
+				$item = array();				
+				$item['description'] = __("Versandkosten und AufschlÃ€ge", "wpsg");
+				$item['itemType'] = "ITEM";
+				$item['quantity'] = "1";
+				$item['unitPrice']['amount'] = number_format($plus, 2, '.', '');
+				$item['unitPrice']['currency'] = get_option("wpsg_mod_cab_currency");
+				$item['totalPrice']['amount'] = number_format($plus, 2, '.', '');
+				$item['totalPrice']['currency'] = get_option("wpsg_mod_cab_currency");
+				 
+				$arItems[] = $item;
+				
+			}
+			
+			$details = array();
+			$details['consumerLanguage'] = "de";
+						
+			$details['amount'] = array();
+			$details['amount']['amount'] = number_format($arBasket['sum']['preis_gesamt_brutto'], 2, '.', '');
+			$details['amount']['currency'] = get_option("wpsg_mod_cab_currency");	
+			
+			$details['successURL'] = $successURL;
+			$details['failureURL'] = $failureURL;
+			
+			$details['externalID'] = $externalID;
+			
+			$details['orderDetails'] = array();
+			$details['orderDetails']['itemList'] = $arItems;
+			$details['orderDetails']['text'] = $this->shop->replaceUniversalPlatzhalter($this->shop->get_option("wpsg_mod_cab_auftragsbezeichnung"), $order_id);
+ 			
+			$kunde = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($kunde_id)."'");
+			
+			$details['shipping']['consumer'] = array(
+				'firstName' => $kunde['shipping_vname'],
+				'lastName' => $kunde['shipping_name'],
+				'address' => array(
+					'street' => $kunde['shipping_strasse'],
+					'zip' => $kunde['shipping_plz'],
+					'city' => $kunde['shipping_ort'],
+					'country' => $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($kunde['shipping_land'])."'")				
+				)			
+			);
+			
+			$details['billing']['consumer'] = array(
+				'firstName' => $kunde['vname'],
+				'lastName' => $kunde['name'],
+				'address' => array(
+					'street' => $kunde['strasse'],
+					'zip' => $kunde['plz'],
+					'city' => $kunde['ort'],
+					'country' => $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($kunde['land'])."'")			
+				)
+			);
+			
+			// Wenn kein Name und Vorname bei der Lieferanschrift gesetzt gehe ich davon aus, das die Lieferanschrift gleich der Rechnugsanschrift ist
+			if ($kunde['shipping_vname'] == "" && $kunde['shipping_name'] == "")
+			{
+				
+				$details['shipping']['consumer'] = array(
+					'firstName' => $kunde['vname'],
+					'lastName' => $kunde['name'],
+					'address' => array(
+						'street' => $kunde['strasse'],
+						'zip' => $kunde['plz'],
+						'city' => $kunde['ort'],
+						'country' => $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($kunde['land'])."'")			
+					)
+				);
+				
+			}
+			
+			$soap_data = array(
+				"authentication" => $authentication,
+				"details" => $details
+			); 
+		
+			$client = $this->getClient(); 
+			$result = $client->payRequest($soap_data);
+						
+			// Daten in Bestellung eintragen
+			$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+				"cab_externalid" => $result->transaction->externalID,
+				"cab_requestTrackingID" => $result->requestTrackingID,
+				"cab_transactionID" => $result->transaction->transactionID,
+				"cab_transactionStatus" => $result->transaction->transactionStatus,
+				"cab_started" => "NOW()",
+				"cab_lastupdate" => "NOW()",
+				"cab_paylink" => $result->transaction->redirectURL
+			), "`id` = '".wpsg_q($order_id)."'");
+			 
+			return $result->transaction->redirectURL;
+						
+		} // private function startPayment($order)
+		
+		/**
+		 * Fragt den PaymentStatus einer Bestellung ab und aktualisiert ihn in der Bestellung
+		 * Enter description here ...
+		 * @param unknown_type $order_id
+		 */
+		private function getPaymentStatus($order_id)
+		{
+			
+			$order = $this->shop->cache->LoadOrder($order_id);
+			
+			// ClickandBuy Authentifizierung
+			$authentication = array();
+			$authentication['merchantID'] = get_option("wpsg_mod_cab_merchantID");
+			$authentication['projectID'] = get_option("wpsg_mod_cab_projectID");
+			$authentication['secretKey'] = get_option("wpsg_mod_cab_kryptkey");
+			$authentication['token'] = $this->generateToken($authentication['projectID'], $authentication['secretKey']);			
+			
+			$details = array();
+			$details['transactionIDList'] = array();
+			$details['transactionIDList']['transactionID'] = $order['cab_transactionID'];
+			
+			$soap_data = array(
+				"authentication" => $authentication,
+				"details" => $details
+			);  
+			 
+			$client = $this->getClient();				
+			$result = $client->statusRequest($soap_data);		
+			
+			if ($result->transactionList->transaction->transactionID != $order['cab_transactionID'] || $result->transactionList->transaction->externalID != $order['cab_externalid'])
+			{
+				
+				return false;
+				
+			}
+			
+			$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+				"cab_transactionStatus" => $result->transactionList->transaction->transactionStatus,
+				"cab_lastupdate" => "NOW()"
+			), "`id` = '".wpsg_q($order['id'])."'");
+			
+			return $result->transactionList->transaction->transactionStatus;
+			
+		} // private function getPaymentStatus($order_id)
+		
+		/**
+		 * Gibt das Clientobjekt fÃŒr die SOAP Anfragen zurÃŒck
+		 */
+		private function getClient()
+		{
+			
+			if (get_option("wpsg_mod_cab_sandbox") == "1")
+			{
+				
+				$client = new SoapClient('https://api.clickandbuy.com/webservices/soap/pay_1_0_0.wsdl');
+				$client->__setLocation('https://api.clickandbuy-s1.com/webservices/soap/pay_1_0_0');
+				
+			}
+			else
+			{
+				
+				$client = new SoapClient('https://api.clickandbuy.com/webservices/pay_1_0_0.wsdl');
+				
+			} 
+			
+			return $client;
+			
+		} // private function getClient()
+		
+		function generateToken($projectID, $secretKey) 
+		{
+			
+			$timestamp = gmdate("YmdHis");	
+			$hashStr = $projectID."::".$secretKey."::".$timestamp;
+			$toBeHashed = strtoupper(sha1($hashStr));	
+			$token = $timestamp.'::'.$toBeHashed; 	
+			
+			return $token;	
+			
+		} // function generateToken($projectID, $secretKey)
+
+		/**
+		 * Generiert den Hash (Signatur) fÃŒr die MMS Verfikation
+		 * @param $xml
+		 */
+		private function makeMMSHash($xml)
+		{
+			
+			$xml = preg_replace("/\<signature\>(.*)\<\/signature\>/", "<signature />", $xml);
+			 
+			return sha1(get_option("wpsg_cab_mmskey").$xml);
+			
+		} // private function makeMMSHash($xml)
+				
+	} // class wpsg_mod_cab extends wpsg_mod_basic
+
+?>
Index: ds/wpsg_mod_converter.class.php
===================================================================
--- /mods/wpsg_mod_converter.class.php	(revision 8528)
+++ 	(revision )
@@ -1,936 +1,0 @@
-<?php
-
-require_once(WPSG_PATH_MOD. 'mod_converter/M1_Converter_update.php');
-require_once(WPSG_PATH_MOD. 'mod_converter/M1_progressbar.class.php');
-
-	/**
-	 * Dieses Modul ermÃ¶glicht die Konvertierung der Daten von WPSG3 nach WPSG4
-	 * @author hartmut
-	 */
-	class wpsg_mod_converter extends wpsg_mod_basic
-	{
-		
-		var $id = 5300;
-		var $hilfeURL = 'https://doc.wpshopgermany.de/4/m1-converter/';
-		
-		var $m1cauto = 0;
-		var $m1cconv;
-		var $m1cpb;
-		var $status = 0;
-		
-		/**
-		 * Constructor
-		 */
-		public function __construct()
-		{
-			
-			parent::__construct();
-			
-			$this->name = __('Konverter', 'wpsg');
-			$this->group = __('Sonstiges', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Konvertierung von WPSG3 nach WPSG4.', 'wpsg');
-			
-			$this->m1cpb = new progressbar1(0, 100, 300, 30);
-			$this->m1cconv = new M1_Converter_update($this->m1cpb);
-			
-		} // public function __construct()
-		
-		/** Initiiert das Modul / Wird nur aufgerufen wenn das Modul aktiv ist */
-		public function init()
-		{
-			add_action( 'admin_init', array($this, 'restrict_admin_with_redirect'), 1 );
-			
-		}
-		
-		function wpsg_add_pages($default_page)
-		{
-			
-			add_submenu_page(
-					null,
-					'M1-Konverter',
-					'M1-Konverter',
-					'manage_options',
-					'M1_Converter_dispatch',
-					array($this, 'M1_Converter_dispatch'));
-			
-		}
-		
-		function restrict_admin_with_redirect() {
-			
-			if (isset($_REQUEST['noheader'])) return;
-			
-			if (isset($_REQUEST['page']) && preg_match('/^wpsg/i', $_REQUEST['page']) && $_REQUEST['page'] != 'M1_Converter_dispatch')
-			{
-			
-				if (is_admin() && $this->shop->get_option('wpsg_mod_converter') != false)
-				{
-					
-					//http://shop4.home/wp-admin/admin.php?page=M1_Converter_dispatch
-					//$this->shop->update_option('wpsg_mod_converter', false);
-					$this->shop->update_option('wpsg_mod_converter_auto', 0);
-					$this->shop->update_option('wpsg_mod_converter_status', 0);
-					wp_redirect(WPSG_URL_WP.'wp-admin/admin.php?page=M1_Converter_dispatch');
-				}
-			}
-			
-		}
-		
-		/**
-		 * Wird von wpsg_enqueue_scripts aufgerufen
-		 */
-		public function wpsg_enqueue_scripts()
-		{
-			if (is_admin()) {
-				//wp_enqueue_script('wpsg_mod_converter', $this->shop->getRessourceURL('js/shariff/shariff.min.js'));
-				//wp_enqueue_style ('wpsg_mod_converter_style', $this->shop->getRessourceURL('js/shariff/shariff.min.css'));
-				
-			}
-			
-		}
-		
-		/**
-		 * PrÃŒft den Status der Konvertierung und gibt true zurÃŒck,
-		 * wenn alle Schritte durchgefÃŒhrt wurden.
-		 */
-		private function checkStatus($step)
-		{
-			
-			$this->status = $this->shop->get_option('wpsg_mod_converter_status');
-			$a = bindec($step);
-			$this->status = $this->status | $a;
-			$this->shop->update_option('wpsg_mod_converter_status', $this->status);
-			$this->m1cauto = $this->shop->get_option('wpsg_mod_converter_auto');
-			
-			// 111 1111 1111
-			if (($this->status == 2047) && ($this->m1cauto == 0)) {
-				$this->shop->update_option('wpsg_mod_converter', false);
-				//$this->shop->update_option('wpsg_mod_converter_status', 0);
-				$this->shop->update_option('wpsg_mod_converter_done', 1);
-				sleep(3);
-				wp_redirect(WPSG_URL_WP.'wp-admin/');
-				
-				//$_REQUEST['action'] = 'ende';
-				//$this->M1_Converter_dispatch();
-			}
-			
-		}
-		
-		
-		/**
-		 * Funktionsverteiler
-		 *
-		 * Je nach der gewÃ€hlten Aktion wird die entsprechende Funktion aufgerufen.
-		 *
-		 */
-		function M1_Converter_dispatch()
-		{
-			//global $m1cpb, $m1cconv;
-			
-			//parent::dispatch();
-			
-			if (!isset($_REQUEST['action'])) {
-				
-				$this->M1_Converter_preshow();
-				
-			}
-			
-			//$m1cconv = new M1_Converter($GLOBALS['m1cpb']);
-			
-			if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'auto')
-			{
-				
-				//$this->m1cauto = true;
-				$this->shop->update_option('wpsg_mod_converter_auto', 1);
-				//$this->M1_Converter_auto();
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'show')
-			{
-				
-				$this->M1_Converter_show();
-				//$this->shop->update_option('wpsg_mod_converter', false);
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'ende')
-			{
-				
-				$this->shop->update_option('wpsg_mod_converter', false);
-				//$this->shop->update_option('wpsg_mod_converter_status', 0);
-				$this->shop->update_option('wpsg_mod_converter_done', 1);
-				//$this->shop->update_option('wpsg_mod_converter_auto', false);
-				//wp_redirect('/wp-admin/admin.php');
-				//wp_redirect('/wp-admin/admin.php?page=wpsg-Admin&action=module');
-				//http://shop4.home/wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_converter
-				die("FIN");
-				//wp_redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_converter');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'end')
-			{
-				
-				$this->shop->update_option('wpsg_mod_converter', false);
-				$this->shop->update_option('wpsg_mod_converter_done', 1);
-				$auto = $this->shop->get_option('wpsg_mod_converter_auto');
-				$status = $this->shop->get_option('wpsg_mod_converter_status');
-				//die('Konverter beendet. Statuscode: '.$auto.'-'.$status);
-				$this->shop->addBackendMessage(__('Konverter beendet. Statuscode: '.$auto.'/'.$status));
-				sleep(1);
-				wp_redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'allgemein')
-			{
-				
-				$this->m1cconv->M1_Converter_allgemein();
-				$this->checkStatus('1'); 
-					
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'kunden')
-			{
-				
-				$this->m1cconv->M1_Converter_kunden();
-				$this->checkStatus('10');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'order')
-			{
-				
-				$this->m1cconv->M1_Converter_order();
-				$this->checkStatus('100');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'anrede')
-			{
-				
-				$this->m1cconv->M1_Converter_anrede();
-				$this->checkStatus('1000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'media')
-			{
-				
-				$this->m1cconv->M1_Converter_media();
-				$this->checkStatus('10000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'prod0')
-			{
-				
-				die($this->m1cconv->M1_Converter_prod0());
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'prod1')
-			{
-				
-				//die($this->m1cconv->M1_Converter_prod0());
-				$this->m1cconv->M1_Converter_prod1();
-				$this->checkStatus('100000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'preis')
-			{
-				
-				$this->m1cconv->M1_Converter_preis();
-				$this->checkStatus('1000000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'category')
-			{
-				
-				$this->m1cconv->M1_Converter_category();
-				$this->checkStatus('10000000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'dlplus')
-			{
-
-				$this->m1cconv->M1_Converter_dlplus();
-				$this->checkStatus('100000000');
-
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'lief')
-			{
-
-				$this->m1cconv->M1_Converter_lief();
-				$this->checkStatus('100000000000');
-
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'rech')
-			{
-				
-				$this->m1cconv->M1_Converter_rech();
-				$this->checkStatus('1000000000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'export')
-			{
-				
-				$this->m1cconv->M1_Converter_export();
-				$this->checkStatus('10000000000');
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'zip')
-			{
-				
-				$this->m1cconv->M1_Converter_zip();
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'unzip')
-			{
-				
-				$this->m1cconv->M1_Converter_unzip();
-				
-			}
-			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'test')
-			{
-				
-				$this->m1cconv->M1_Converter_test();
-				
-			}
-			
-		}	// function M1_Converter_dispatch()
-		
-		/**
-		 * Startseite
-		 *
-		 * PrÃŒfen, ob der Shop als Modul installiert ist und eine
-		 * richtige Versionsnummer hat.
-		 *
-		 */
-		function M1_Converter_preshow() {
-			
-			global $m1cpb;
-			
-			?>
-    
-	<link rel="stylesheet" href="<?php echo WPSG_PLUGIN_URL.WPSG_FOLDERNAME.'/mods/mod_converter/style.css'; ?>" type="text/css" media="all" />
-
-	<div class="m1_converter_admin_content" >
-    	<div class="panel panel-default" >
-    		<div class="panel-heading clearfix" >
-        		<h2 class="panel-title" >M1-Konverter</h2>
-			</div>
-			
-			<div class="panel-body" >
-				
-				<label ><?php echo __('Der M1-Konverter integriert die Daten in die neue wpShopGermany Version 4.', 'wpsg'); ?></label>
-	        	<br /><br />
-				
-		        <?php
-		        $wpsgi = true;
-
-		        if ((isset($GLOBALS['wpsg_sc']) && is_object($GLOBALS['wpsg_sc'])))
-		        {
-		        	echo __('WPSG-Installation gefunden in: '.admin_url(), 'wpsg');
-					$wpsgi = true;
-		        }
-				else
-				{
-					echo __('<br />Keine WPSG-Installation gefunden!', 'wpsg');
-					$wpsgi = false;
-				}
-
-				if (!defined('WPSG_VERSION')) define('WPSG_VERSION', '0.0.0');
-			
-				echo __('<br /> WPSG-Version: '.WPSG_VERSION.' ', 'wpsg');
-				$ver = substr(WPSG_VERSION, 0, 1);
-				$res = version_compare(WPSG_VERSION, '3.99.0');
-				// -1: erste Version ist kleiner
-				// 0:  die Versionen sind gleich
-				// 1:  die zweite Version ist kleiner
-				if ($res >= 0)
-				{
-					echo __('<br /> WPSG-Version OK.', 'wpsg');
-					$wpsgi = true;
-				}
-				else
-				{
-					echo __('<br />WPSG-Version zu niedrig!', 'wpsg');
-					$wpsgi = false;
-				}
-				
-				echo '<br /><br />';
-				
-		        if ($wpsgi == true) {
-				?>
-		        	<a class="m1c_button " title="Konvertieren von WPSG Version 3" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=show'); ?>">Konvertieren von WPSG Version 3</a>
-				
-				<?php 
-					// wpsg_mod_productvariants aktivieren, wenn wpsg_mod_varianten aktiv ist
-					// Option nicht vorhanden=false, Option ohne Value=empty
-					if (($this->shop->get_option('wpsg_mod_varianten') != false) && !empty($this->shop->get_option('wpsg_mod_varianten'))) {
-
-						$this->shop->update_option('wpsg_mod_productvariants', time());
-                        
-						$this->shop->loadModule();
-						$this->shop->callMod('wpsg_mod_productvariants', 'install');
-						
-                    }
-					
-					$mpvar = $this->shop->get_option('wpsg_mod_productvariants');
-				
-				?>
-				<?php } ?>
-    		</div>
-		</div>
-	</div>
-	<div id="wpsg-bs"></div>
-	
-<?php }
-/**
- * Hauptseite von der die einzelnen Funktionen aufgerufen werden
- *
- * Analyse der Datenbank und anzeigen der wichtigsten Informationen.
- * Buttons fÃŒr den Aufruf der einzelnen Funktionen und fÃŒr
- * einen automatischen Durchlauf durch die gesamte Konvertierung.
- *
- *
- */
-function M1_Converter_show() {
-	global $m1cpb, $m1cconv;
-	//962: deactivate_plugins(WPSG_FOLDERNAME.'/wpshopgermany.php');  
-	?>
-    
-	<link rel="stylesheet" href="<?php echo WPSG_PLUGIN_URL.WPSG_FOLDERNAME.'/views/js/bootstrap-3.4.1-dist/css/bootstrap.css'; ?>" type="text/css" media="all" />
-	<link rel="stylesheet" href="<?php echo WPSG_PLUGIN_URL.WPSG_FOLDERNAME.'/views/js/bootstrap-3.4.1-dist/css/bootstrap-glyphfont.css'; ?>" type="text/css" media="all" />
-	<link rel="stylesheet" href="<?php echo WPSG_PLUGIN_URL.WPSG_FOLDERNAME.'/mods/mod_converter/style.css'; ?>" type="text/css" media="all" />
-
-	<script src="<?php echo WPSG_PLUGIN_URL.WPSG_FOLDERNAME.'/views/js/bootstrap-3.4.1-dist/js/bootstrap.min.js'?>"></script>
-
-	<div class="m1_converter_admin_content" >
-    	<div class="panel panel-default" >
-    		<div class="panel-heading clearfix" >
-        		<h2 class="panel-title" >M1-Konverter</h2>
-			</div>
-			
-			<div class="panel-body" >
-				
-				<label ><?php echo __('Der M1-Konverter wandelt die bestehenden Daten aus Ihrer wpShopGermany Version 3 um und integriert die Daten in die neue wpShopGermany Version 4.', 'wpsg'); ?></label>
-	        	<br /><br />
-
-		        <?php
-		        $wpsgi = true;
-		        
-		        if ((isset($GLOBALS['wpsg_sc']) && is_object($GLOBALS['wpsg_sc'])))
-		        {
-		        	echo __('WPSG-Installation gefunden in: '.admin_url(), 'wpsg');
-					$wpsgi = true;
-		        }
-				else
-				{
-					echo __('<br />Keine WPSG-Installation gefunden!', 'wpsg');
-					$wpsgi = false;
-				}
-
-				if (!defined('WPSG_VERSION')) define('WPSG_VERSION', '0.0.0');
-			
-				echo __('<br /> WPSG-Version: '.WPSG_VERSION.' ', 'wpsg');
-				$ver = substr(WPSG_VERSION, 0, 1);
-				$res = version_compare(WPSG_VERSION, '3.99.0');
-				// -1: die erste Version ist kleiner
-				// 0:  die Versionen sind gleich
-				// 1:  die zweite Version ist kleiner
-				if ($res >= 0) 
-				{
-					echo __('<br /> WPSG-Version OK.', 'wpsg');
-					$wpsgi = true;
-				}
-				else
-				{
-					echo __('<br />WPSG-Version zu niedrig!', 'wpsg');
-					$wpsgi = false;
-				}
-				
-		        if ($wpsgi == true) {
-				
-				$db = $GLOBALS['wpsg_db'];
-		
-				echo '<br />';
-				/*
-				$kunden = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_KU."` ORDER BY `id` ASC");
-				echo __('<br />'.count($kunden).' Kunden', 'wpsg');
-		
-				$orders = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDER."` ORDER BY `id` ASC");
-				echo __('<br />'.count($orders).' Bestellungen', 'wpsg');
-				*/
-				
-				$products = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS."` ORDER BY `id` ASC");
-				$i1 = 0;
-				$i2 = 0;
-
-				$cnt1 = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."`");
-				$cnt2 = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_KU."`");
-				echo __('<br />'.$cnt2.' Kunden', 'wpsg');
-				echo __('<br />'.$cnt1.' Bestellungen', 'wpsg');
-				
-				foreach ($products as $p)
-				{
-					$arPic = $this->m1cconv->getProduktBilder($p['id'], false);
-					$i1++;
-					$i2 = $i2 + count($arPic);
-				}
-				echo __('<br />'.$i1.' Produkte mit '.$i2.' Bildern', 'wpsg');
-		
-				echo __('<br /><br />Bilderverzeichnis fÃŒr Produkt 1: '.$this->m1cconv->getPicPath(1), 'wpsg');
-		
-				$status = $this->shop->get_option('wpsg_mod_converter_status');
-				
-        		?>
-        		<br /><br />
-        		<a id="idauto" class="m1c_button" title="Auto" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=auto'); ?>">Automatisch</a>
-        		AusfÃŒhren der Schritte Allgemein, Kunden, Bestellungen bis Exportprofile
-        		
-		        <br /><br />
-		        <label ><?php echo __('WÃ€hlen Sie die gewÃŒnschte Aktion aus. AbhÃ€ngig vom Umfang kann die Ãbertragung ein paar Minuten dauern. WÃ€hrend dieser Zeit ist es ratsam, keine VerÃ€nderungen an der Instanz vorzunehmen oder andere Prozesse zeitgleich abzuarbeiten.', 'wpsg'); ?></label>
-		        <br /><br />
-        
-				<div>
-					<div style="background:white;width:10px;vertical-align:top;margin-top:10px;height:490px;display:inline-block;">
-					<canvas id="sprogress" ></canvas>
-					</div>
-					<div style="background:white;width:8px;height:500px;display:inline-block;"></div>
-					<div style="display:inline-block;width:90%;">
-
-			        <a class="m1c_button" title="Allgemeine Konfigurationen" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=allgemein'); ?>">Allgemein</a>
-					<a href="#" data-wpsg-tip="M1C-Allgemein" 
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Allgemeine Konfigurationen 
-					<span id="idallgemein" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 1) == 1) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="Konvertieren der Kundenadressen" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=kunden'); ?>">Kunden</a>
-					<a href="#" data-wpsg-tip="M1C-Kunden" 
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Konvertieren der Kundenadressen
-					<span id="idkunden" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 2) == 2) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="Konvertieren der Bestellungen" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=order'); ?>">Bestellungen</a>
-					<a href="#" data-wpsg-tip="M1C-Bestellungen"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Konvertieren der Bestellungen, Rechnungsadresse und Lieferadresse
-					<span id="idorder" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 4) == 4) echo 'style="display:inline-block;"'; ?> ></span><br />
-					
-
-			        <a class="m1c_button" title="Konvertieren der Anreden" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=anrede'); ?>">Anreden</a>
-					<a href="#" data-wpsg-tip="M1C-Anrede"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Konvertieren der Anrede in der Tabelle der Adressen
-					<span id="idanrede" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 8) == 8) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <div style="height:48px;margin-bottom:3px;">
-			        <a class="m1c_button" title="LÃ¶schen der Produktbilder in der Mediathek" id="idmedia" href="#">Mediathek</a>
-					<a href="#" data-wpsg-tip="M1C-Mediathek" 
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0" 
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					<div style="display:inline-block; height:48px; vertical-align:middle">LÃ¶schen der Produktbilder in der Mediathek.<br /><span id="mprogress">0 Produktbilder in der Mediathek gelÃ¶scht.</span></div>
- 					<span id="idmedien" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 16) == 16) echo 'style="display:inline-block;"'; ?> ></span><br />
-					</div>
- 
-			        <div style="height:48px;margin-bottom:3px;">
-			        <a class="m1c_button" title="Konvertieren der Produkte" id="idajax" href="#">Produkte</a>
-					<a href="#" data-wpsg-tip="M1C-Produkte" 
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0" 
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					<div style="display:inline-block; height:48px; vertical-align:middle">Konvertieren der Produkt-Varianten und Laden der Produktbilder in die Mediathek.<br /><span id="progress">0 Produkte konvertiert.</span></div>
- 					<span id="idprodukt" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 32) == 32) echo 'style="display:inline-block;"'; ?> ></span><br />
-					</div>
-
-			        <a class="m1c_button" title="Berechnen der Preise netto/brutto" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=preis'); ?>">Preise</a>
-					<a href="#" data-wpsg-tip="M1C-Preise"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Berechnen der Preise netto/brutto
- 					<span id="idpreise" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 64) == 64) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="Konvertieren der Kategorien" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=category'); ?>">Kategorien</a>
-					<a href="#" data-wpsg-tip="M1C-Kategorien"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Konvertieren der Kategorien
- 					<span id="idcategory" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 128) == 128) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="Lieferscheine in neue Verzeichnisstruktur kopieren" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=lief'); ?>">Lieferscheine</a>
-					<a href="#" data-wpsg-tip="M1C-Lieferscheine"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Lieferscheine in die neue Verzeichnisstruktur kopieren
- 					<span id="idlief" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 256) == 256) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-					<a class="m1c_button" title="Downloadplus in neue Verzeichnisstruktur kopieren" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=dlplus'); ?>">Downloadplus</a>
-					<a href="#" data-wpsg-tip="M1C-Downloadplus"
-					   rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					   class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Produktdokumente und Bestelldokumente in die neue Verzeichnisstruktur kopieren
-					<span id="iddlplus" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 2048) == 2048) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="Rechnungen in neue Verzeichnisstruktur kopieren" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=rech'); ?>">Rechnungen</a>
-					<a href="#" data-wpsg-tip="M1C-Rechnungen"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Rechnungen in die neue Verzeichnisstruktur kopieren
- 					<span id="idrech" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 512) == 512) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="Exportprofile konvertieren" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=export'); ?>">Exportprofile</a>
-					<a href="#" data-wpsg-tip="M1C-Exportprofile"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Exportprofile konvertieren
- 					<span id="idrech" class="glyphicon glyphicon-ok glyph_ok" title="Konvertierung erfolgt" <?php if (($status & 1024) == 1024) echo 'style="display:inline-block;"'; ?> ></span><br />
-
-			        <a class="m1c_button" title="LÃ¶schen der Thumbnails und Zippen der Produktbilder" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=zip'); ?>">Packen</a>
-					<a href="#" data-wpsg-tip="M1C-Zip"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					LÃ¶schen der Thumbnails und Zippen der Produktbilder von WPSG3<br />
-
-			        <a class="m1c_button" title="Entpacken der Produktbilder" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=unzip'); ?>">Entpacken</a>
-					<a href="#" data-wpsg-tip="M1C-Unzip"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Entpacken der Produktbilder<br />
-
-			        <a class="m1c_button" title="Konverter beenden" href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=end&noheader=1'); ?>">Beenden</a>
-					<a href="#" data-wpsg-tip="M1C-Beenden"
-					rel="?page=wpsg-Admin&amp;subaction=loadHelp&amp;noheader=1&amp;field=Bestellung_0"
-					class="glyphicon glyphicon-question-sign" aria-hidden="true"></a>
-					Konverter beenden. SpÃ€terer manueller Start durch Aktivieren des Moduls.<br />
-
-					<!--
-			        <a href="<?php echo admin_url('admin.php?page=M1_Converter_dispatch&action=test'); ?>">Test</a>
-			        <br /><br />
-					-->
-					
-					</div>
-					</div>
-				<?php } ?>
-    		</div>
-		</div>
-	</div>
-	<div id="wpsg-bs"></div>
-	
-<script type="text/javascript">
-
-	<?php
-	$products = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS."` ORDER BY `id` ASC");
-	//$products = array();
-	$posts = $GLOBALS['wpsg_sc']->db->fetchAssoc("SELECT * FROM `".$GLOBALS['wpdb']->prefix."postmeta` WHERE `meta_key`='".wpsg_q('wpsg_produkt_id')."' ORDER BY `post_id`");
-	?>
-
-	var m1cauto = 0;
-	
-function wpsg_ajaxBindM1C()
-{
-	
-	// Hilfe Tooltips
-	jQuery('*[data-wpsg-tip]').on('click', function() {
-
-		jQuery(this).off('click').on('click', function() { return false; } );
-
-		var po = this;
-
-		jQuery(this).popover( {
-			'html': true,
-			'content': '<div id="wpsg-popover-content">Bitte warten...</div>',
-			'trigger': 'focus',
-			'container': '#wpsg-bs',
-			'placement': 'right'
-		} ).popover('show');
-
-		jQuery.ajax( {
-			url: '?page=wpsg-Admin&subaction=loadHelp&noheader=1',
-			data: {
-				field: jQuery(this).attr('data-wpsg-tip')
-			},
-			success: function(data) {
-				
-				var popover = jQuery(po).attr('data-content', data).data('popover');
-				jQuery(po).data('bs.popover').options.content = data;
-				
-				jQuery(po).popover('show');
-				
-			}
-		} );
-		
-		return false;
-		
-	} );
-
-}
-
-var po; 
-
-function wpsg_ajaxBind()
-{
-	
-	// Hilfe Tooltips
-	jQuery('*[data-wpsg-tip]').on('click', function() { 
-
-		//jQuery(this).off('click').on('click', function() { return false; } );
-
-		if (typeof po === "object")
-		{
-			
-			if (po != this) jQuery(po).popover('hide');
-			
-		}
-		
-		po = this;
-		
-		if (jQuery(this).hasClass('activated'))
-		{
-							
-			jQuery(this).popover('show');
-			
-			return false;
-			
-		}
-		
-		jQuery(this).popover( {
-			'html': true,
-			'content': '<div id="wpsg-popover-content">Bitte warten...</div>',
-			'trigger': 'focus',
-			'container': '#wpsg-bs',
-			'placement': 'right'
-		} ).popover('show');
-
-		jQuery.ajax( {
-			url: '?page=wpsg-Admin&subaction=loadHelp&noheader=1',
-			data: {
-				field: jQuery(this).attr('data-wpsg-tip')
-			},
-			success: function(data) {
-				
-				var popover = jQuery(po).attr('data-content', data).data('popover');
-				jQuery(po).data('bs.popover').options.content = data;
-				
-				jQuery(po).popover('show');
-									
-			}
-		} );
-		 
-		jQuery(this).addClass('activated');
-		
-		return false;
-		
-	} );
-			
-}
-
-
-jQuery(document).ready(function () {
-
-	wpsg_ajaxBindM1C();
-	//wpsg_ajaxBind();
-
-	// Konvertieren der Produkte und Varianteninformationen und
-	// Ãbernahme der Produktbilder in die Mediathek.
-	jQuery(document).on("click", "#idajax", function () {
-		//alert('ajax');
-
-		var produkte = <?php echo json_encode($products); ?>;
-		var pid = 1;
-		var i, anz;
-		anz = produkte.length;
-		pid = produkte[0].id;
-
-	    request = jQuery.ajax({
-	        url: 'admin.php?page=M1_Converter_dispatch&action=prod0&noheader=1',
-	        type: "post",
-	        async: false,
-        	success: function (response) {
-				if ((response == '\n0') || (response == '0')) {
-					alert('Die Ãbernahme ist schon erfolgt.');
-					pid = -1;
-					return;
-        		}
-        	},
-        	error: function(jqXHR, textStatus, errorThrown) {
-            	console.log(textStatus, errorThrown);
-        	}
-	        
-	    });
-
-		if (pid == -1) return false;
-		
-		for (i = 0; i < anz; i++) {
-			pid = produkte[i].id;
-		    request = jQuery.ajax({
-		        url: 'admin.php?page=M1_Converter_dispatch&action=prod1&noheader=1',
-		        type: "post",
-		        async: false,
-		        data: {
-			        'pid': pid,
-			        'num': i,
-		        },
-	        	success: function (response) {
-					console.log((i + 1) + ' Produkte konvertiert.');
-					jQuery('#progress').html(' ' + (i + 1) + ' Produkte konvertiert.');
-	
-	        	},
-	        	error: function(jqXHR, textStatus, errorThrown) {
-	            	console.log(textStatus, errorThrown);
-	        	}
-		        
-		    });
-
-		}
-
-		if (m1cauto === 0)
-			alert('Ãbernahme der Produktbilder und Varianteninformationen beendet.');
-		jQuery('#idprodukt').show();
-	    return false;
-	});
-
-	// AufrÃ€umen der Mediathek.
-	// Eventuell vorhandene Produktbilder werden gelÃ¶scht.
-	jQuery(document).on("click", "#idmedia", function () {
-		//alert('ajax');
-
-		var posts = <?php echo json_encode($posts); ?>;
-		var postid = 1;
-		var i, anz;
-		anz = posts.length;
-		//alert('Anzahl: ' + anz);
-		//pid = posts[0].post_id;
-
-		for (i = 0; i < anz; i++) {
-			pid = posts[i].post_id;
-		    request = jQuery.ajax({
-		        url: 'admin.php?page=M1_Converter_dispatch&action=media&noheader=1',
-		        type: "post",
-		        async: false,
-		        data: {
-			        'post_id': pid,
-			        'num': i,
-		        },
-	        	success: function (response) {
-					console.log((i + 1) + ' Produktbilder gelÃ¶scht.');
-					jQuery('#mprogress').html(' ' + (i + 1) + ' Produktbilder in der Mediathek gelÃ¶scht.');
-	
-	        	},
-	        	error: function(jqXHR, textStatus, errorThrown) {
-	            	console.log(textStatus, errorThrown);
-	        	}
-		        
-		    });
-
-		}
-		if (m1cauto == 0) alert('Mediathek aufrÃ€umen beendet.');
-		jQuery('#idmedien').show();
-	    return false;
-	});
-			
-});
-
-// Starten des automatischen Durchlaufs zur Konvertierung 
-// der Daten.
-jQuery(document).on("click", "#idauto", function () {
-
-	// Buttons disable
-	jQuery('.m1c_button').bind('click', false);
-	m1cauto = 1;
-	
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=auto&noheader=1');
-	progress(0);
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=allgemein&noheader=1');
-	progress(1);
-	jQuery('#idallgemein').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=kunden&noheader=1');
-	progress(2);
-	jQuery('#idkunden').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=order&noheader=1');
-	progress(3);
-	jQuery('#idorder').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=anrede&noheader=1');
-	progress(4);
-	jQuery('#idanrede').show();
-
-	jQuery('#idmedia').unbind('click', false);
-	jQuery('#idmedia').trigger("click");
-	jQuery('#idmedia').bind('click', false);
-	progress(5);
-	jQuery('#idajax').unbind('click', false);
-	jQuery('#idajax').trigger("click");
-	jQuery('#idajax').bind('click', false);
-	progress(6);
-
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=preis&noheader=1');
-	progress(7);
-	jQuery('#idpreise').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=category&noheader=1');
-	progress(8);
-	jQuery('#idcategory').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=lief&noheader=1');
-	progress(9);
-	jQuery('#idlief').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=rech&noheader=1');
-	progress(10);
-	jQuery('#idrech').show();
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=export&noheader=1');
-	progress(11);
-	jQuery('#idexport').show();
-
-	// Buttons enable
-	jQuery('.m1c_button').unbind('click', false);
-	m1cauto = 0;
-	//alert('Automatische Konvertierung beendet.');
-	ajaxCall('admin.php?page=M1_Converter_dispatch&action=ende&noheader=1');
-	return false;
-	
-});
-
-function ajaxCall(url) {
-
-    request = jQuery.ajax({
-        url: url,
-        type: "post",
-        async: false,
-        data: {
-	        'post_id': 0,
-	        'num': 0,
-        },
-    	success: function (response) {
-
-    		if (response === "FIN") {
-    			alert('Konvertierung beendet.');
-        		//alert("<?php echo WPSG_URL_WP?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_converter");
-				//wp_redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_converter');
-        		location.href = "<?php echo WPSG_URL_WP?>wp-admin/admin.php?page=wpsg-Admin&action=module";
-        	}
-			console.log(url);
-    	},
-    	error: function(jqXHR, textStatus, errorThrown) {
-        	console.log(textStatus, errorThrown);
-    	}
-        
-    });
-
-}
-
-// Anzeige des senkrechten Fortschrittsbalken.
-function progress(fill) {
-	var c = document.getElementById("sprogress");
-	var ctx = c.getContext("2d");
-	if (fill == 0) {
-		ctx.fillStyle = "#FFFFFF";
-		ctx.fillRect(0, 0, 10, 10 * 50);
-	}
-	jQuery('#sprogress').attr('height', fill * 50);
-	ctx.fillStyle = "#00FF00";
-	ctx.fillRect(0, 0, 8, fill * 50);
-	//alert('progress');
-
-}
-
-function pause(delay) {
-    var start = new Date().getTime();
-    while (new Date().getTime() < start + delay);
-}
-
-</script>
-
-<?php }
-	} // class wpsg_mod_converter extends wpsg_mod_basic
-?>
Index: /mods/wpsg_mod_core.class.php
===================================================================
--- /mods/wpsg_mod_core.class.php	(revision 5261)
+++ /mods/wpsg_mod_core.class.php	(revision 5261)
@@ -0,0 +1,578 @@
+<?php
+
+	/**
+	 * Dieses Modul ist ein verstecktes System Modul und ist nur in der Lizezierten Version vorhanden
+	 * @author Daschmi (daniel@maennchen1.de) 02.10.2015
+	 */
+	class wpsg_mod_core extends wpsg_mod_basic
+	{
+		 
+		var $id = 1630;
+		
+		public function __construct()
+		{
+			
+			parent::__construct(); 
+			
+		} // public function __construct()
+		
+		/**
+		 * LÃ€dt die Module
+		 */
+		public function loadModule($all)
+		{
+			 
+			$mod_dir = opendir(WPSG_PATH_MOD);
+				
+			$global = false;
+			if ($this->shop->isMultiBlog() && $this->shop->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
+				
+			while ($file = readdir($mod_dir))
+			{
+			
+				if (!is_dir(WPSG_PATH_MOD."/".$file) && $file != "." && $file != ".." && preg_match("/(.*)\.class\.php/i", $file) && $file != "wpsg_mod_basic.class.php")
+				{
+						
+					if (file_exists(WPSG_PATH_USERMOD.$file)) require_once(WPSG_PATH_USERMOD.$file);
+					else require_once(WPSG_PATH_MOD.$file);
+						
+					$class_name = preg_replace("/\.class\.php/", "", $file);
+						
+					$mod = new $class_name();
+						
+					// Demo oder Modul fÃŒr Lizenz aktiv
+					if ($this->shop->arLizenz['l'] == 0 || $this->shop->arLizenz['l'] >= $mod->lizenz)
+					{
+							
+						if (!isset($mod->version) || $mod->getDemoDays() > 0 || (isset($this->shop->arLizenz) && in_array(get_class($mod), (array)$this->shop->arLizenz['mods'])))
+						{
+			
+							if ($this->shop->get_option($class_name, $global) > 0 || $class_name === 'wpsg_mod_core')
+							{
+			
+								$this->shop->arModule[$class_name] = $mod;
+			
+							}
+			
+						}
+							
+						if ($all)
+						{
+			
+							$this->shop->arAllModule[$class_name] = $mod;
+			
+						}
+			
+					}
+						
+				}
+			
+			}
+				
+			uasort($this->shop->arModule, array($this->shop, "cmp_mods"));
+				
+			if ($all) uasort($this->shop->arAllModule, array($this->shop, "cmp_mods"));
+			
+			// Module werden hier erst initiiert, da dann alle Module bekannt sind und die Reihenfolge hergestellt ist
+			foreach ($this->shop->arModule as $mod_key => $m)
+			{
+			
+				if ($this->shop->get_option(get_class($m), $global) > 0)
+				{
+			
+					$m->init();
+						
+				}
+			
+			}
+			
+		} // public function loadModule($all)
+		
+		/**
+		 * Gibt true zurÃŒck wenn eine aktive Lizenz eingebunden ist
+		 */
+		public function hasActiveLicence()
+		{
+			
+			if (is_array($this->shop->arLizenz) && isset($this->shop->arLizenz['l']))
+			{
+			
+				// PrÃŒfen das in einem Multiblog nur mit der Enterprise Version gearbeitet wird
+				if ($this->shop->isMultiBlog() && $this->shop->arLizenz['l'] < 3)
+				{
+						
+					// Die installierte Lizenz kann nicht in einer Multiblog Umgebung eingesetzt werden.
+					$this->shop->addBackendError(base64_decode('RGllIGluc3RhbGxpZXJ0ZSBMaXplbnoga2FubiBuaWNodCBpbiBlaW5lciBNdWx0aWJsb2cgVW1nZWJ1bmcgZWluZ2VzZXR6dCB3ZXJkZW4u'));
+					
+					return false;
+						
+				}
+			
+				return true;
+			
+			}
+				
+			if ($this->shop->getDemoDays() < 0)
+			{
+			
+				// Ihre Lizenz von wpShopGermany ist abgelaufen
+				$this->shop->addBackendError(base64_decode('SWhyZSBMaXplbnogdm9uIHdwU2hvcEdlcm1hbnkgaXN0IGFiZ2VsYXVmZW4='));
+			
+			}
+			
+			return false;
+			
+		}
+		
+		/**
+		 * Gibt die Tage der DemoVersion zurÃŒck
+		 */
+		public function getDemoDays()
+		{
+			
+			$isnt = $this->shop->get_option('wpsg_installed', true);
+			$rem = round((($isnt + 14 * 60 * 60 * 24) - time()) / (60 * 60 * 24), 0);
+				
+			return $rem;
+			
+		} // public function getDemoDays()
+		
+		public function admin_registrierung()
+		{
+			
+			if (!class_exists('SoapClient'))
+			{
+			
+				$this->shop->addBackendError(__('nohspc_Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. Eine Registrierung Ihrer Domain ist somit nicht mÃ¶glich! <br />Weitere Informationen finden Sie in unseren <a target="_blank" href="http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/">FAQ</a>.', 'wpsg'));
+				$this->shop->view['actionName'] = 'registrierung';
+				$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
+			
+				return;
+			
+			}
+				
+			if (!$this->shop->arLizenz['nr'] > 0 && $_REQUEST['do'] != 'installModul') {
+			
+				$this->shop->view = array(
+					'actionName' => 'registrierung',
+					'subTemplate' => WPSG_PATH_VIEW.base64_decode('L21vZHMvbW9kX2NvcmUvYWRtaW5fbGljZW5jZS5waHRtbA==') // /mods/mod_core/admin_licence.phtml
+				);
+			
+			}
+			else
+			{
+			
+				if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove')
+				{
+			
+					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('removeURL', array($_REQUEST['url'])));
+						
+					if ($reg_data === false) { $this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg')); }
+					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
+					else { $this->shop->addBackendMessage(__('Domainregistrierung erfolgreich entfernt.', 'wpsg')); }
+						
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domains');
+						
+				}
+				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'register')
+				{
+						
+					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('registerURL', array($this->shop->get_option('siteurl'))));
+						
+					if ($reg_data === false) { $this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg')); }
+					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
+					else { $this->shop->addBackendMessage(__('Domainregistrierung erfolgreich.', 'wpsg')); }
+						
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domains');
+						
+				}
+				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'getCredentials')
+				{
+						
+					$this->getCredentialsAction();
+						
+					return;
+						
+				}
+				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'installModul')
+				{
+											
+					if ($this->installModul($_REQUEST['modul']))
+					{
+			
+						$this->shop->addBackendMessage(__('Modul erfolgreich installiert.', 'wpsg'));
+			
+					}
+			
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
+						
+				}
+				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'aktivateModul')
+				{
+						
+					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('aktivateModul', array($_REQUEST['wpsg_modulkey'])));
+						
+					if ($reg_data === false) { $this->shop->addBackendError(__('Modul konnte nicht aktiviert werden.', 'wpsg')); }
+					else if ($reg_data === -1) { $this->shop->addBackendError(__('UngÃŒltiger Modulcode.', 'wpsg')); }
+					else if ($reg_data === -2) { $this->shop->addBackendError(__('Code bereits fÃŒr einen anderen SchlÃŒssel verwendet.', 'wpsg')); }
+					else if ($reg_data === -3) { $this->shop->addBackendError(__('Modul bereits aktiviert.', 'wpsg')); }
+					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
+					else {
+			
+						// Neuen Modulcode speichern
+						$this->shop->update_option('wpsg_key', $reg_data, true);
+			
+						$this->shop->addBackendMessage(__('Modul erfolgreich aktiviert.', 'wpsg'));
+							
+					}
+						
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=module');
+						
+				}
+			
+				if (isset($_REQUEST['registerdata-submit']))
+				{
+						
+					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('setRegisterInfo', array($_REQUEST)));
+						
+					if ($reg_data === false) { $this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg')); }
+					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
+					else { $this->shop->addBackendMessage(__('Registrierungsdaten erfolgreich ÃŒbermittelt', 'wpsg')); }
+						
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung');
+						
+				}
+			
+				// Daten vom Registrierungsserver laden
+				$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('getRegisterInfo'));
+			
+				// Aktuelle Domain registriert?
+				$reg_data['registred'] = false;
+				$arURLs = array();
+				foreach ((array)$reg_data['domains'] as $d)
+				{
+						
+					$arURLs[] = preg_replace('/(.*)\/\//', '', $d['url']);
+						
+					if (preg_match('/((http\:\/\/)|(https\:\/\/)){0,1}'.preg_quote($this->shop->get_option('siteurl'), '/').'\/*/', $d['url']))
+					{
+						$reg_data['registred'] = true; break;
+					}
+						
+				}
+			
+				$this->shop->update_option('wpsg_registredURLs', $arURLs);
+			
+				if ($reg_data === false)
+				{
+						
+					$this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg'));
+						
+				}
+				else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data))
+				{
+						
+					$this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error']));
+			
+				}
+			
+				$this->shop->view = array(
+					'data' => $reg_data,
+					'actionName' => 'registrierung',
+					'subTemplate' => WPSG_PATH_VIEW.base64_decode('L21vZHMvbW9kX2NvcmUvYWRtaW5fcmVnaXN0ZXIucGh0bWw='), // /mods/mod_core/admin_register.phtml
+					'mods' => $this->shop->arLizenz['mods']
+				);
+			
+				$this->shop->loadModule(true);
+			
+				switch ($this->shop->arLizenz['l'])
+				{
+						
+					case '1': $this->shop->view['typ'] = __('Light Version', 'wpsg'); break;
+					case '2': $this->shop->view['typ'] = __('Pro Version', 'wpsg'); break;
+					case '3': $this->shop->view['typ'] = __('Enterprise Version', 'wpsg'); break;
+					default: die();
+						
+				}
+			
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
+			
+		} // public function admin_registrierung()
+		
+		public function module_index()
+		{
+			
+			if (class_exists('SoapClient'))
+			{
+		
+				$this->shop->view['arOnlineModule'] = $this->RegisterCall('getModulInfo_V2');
+		
+				foreach ((array)$this->shop->view['arOnlineModule'] as $k => $m)
+				{
+		
+					if (wpsg_isSizedString($m['version_dev']) && wpsg_isSizedInt($this->shop->get_option('wpsg_debugURL'))) $this->shop->view['arOnlineModule'][$k]['version'] = $m['version_dev'];
+		
+					$this->shop->view['arOnlineModule'][$k]['version_local'] = $this->shop->arAllModule[$m['key']]->version;
+		
+					$global = false;
+					if ($this->shop->isMultiBlog() && $this->shop->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
+		
+					if ($this->shop->get_option($m['key'], $global) > 0)
+					{
+							
+						$this->shop->view['arOnlineModule'][$k]['installed'] = true;
+							
+					}
+					else
+					{
+							
+						$this->shop->view['arOnlineModule'][$k]['installed'] = false;
+							
+					}
+		
+					if ($this->shop->get_option('wpsg_debugURL') == '1' && isset($this->shop->view['arOnlineModule'][$k]['version_dev']))
+					{
+		
+						$this->shop->view['arOnlineModule'][$k]['version'] = $m['version_dev'];
+							
+					}
+		
+				}
+						
+			}
+			else
+			{
+					
+				$this->shop->addBackendError(__('nohspc_Ihrem Server fehlt die PHP-Bibliothek fÃŒr die SOAP-UnterstÃŒtzung. Eine Registrierung Ihrer Domain ist somit nicht mÃ¶glich! <br />Weitere Informationen finden Sie in unseren <a target="_blank" href="http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/">FAQ</a>.', 'wpsg'));
+					
+			}
+			
+			echo $this->render(WPSG_PATH_VIEW.'/mods/mod_core/module_index.phtml');
+			
+		} // public function module_index()
+		
+		/**
+		 * Sendet eine Anfrage an den Registrierungs Server und gibt das Ergebnis zurÃŒck
+		 */
+		public function RegisterCall($func_name, $args = array())
+		{
+				
+			$SOAP = new SoapClient(
+				null,
+				array(
+					'location' => base64_decode('aHR0cHM6Ly9zaG9wLm1hZW5uY2hlbjEuZGUvcmVnaXN0cmllcnVuZy8='), // https://shop.maennchen1.de/registrierung/
+					'uri' => 'http://shop.maennchen1.de',
+					'cache_wsdl' => WSDL_CACHE_NONE
+				)
+			);
+				
+			if (!$this->shop->hasActiveLicence())
+			{
+					
+				$args = array_merge(array('No_wpsg'), $args);
+		
+			}
+			else
+			{
+		
+				// Hier kein wpsg_array_merge da die index gleich sind
+				$args = array_merge(array($this->shop->get_option('wpsg_key', true)), $args);
+		
+			}
+				
+			try {
+					
+				$result = $SOAP->__soapCall($func_name, $args);
+		
+			}
+			catch (Exception $e)
+			{
+		
+				$this->shop->addBackendError(wpsg_translate(__('SOAP Fehler: #1#', 'wpsg'), $e->getMessage()));
+		
+			}
+				
+			return $result;
+				
+		} // public function RegisterCall($func_name, $args)
+	
+		public function installModul($modul_key)
+		{
+			
+			global $wp_filesystem;
+			
+			ob_start();
+			$request_creds = request_filesystem_credentials(
+				WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key,
+				'',
+				false,
+				false,
+				null
+			);
+			ob_end_clean();
+				
+			// 1 gibt es bei Windows Rechnern zurÃŒck, da es hier egal ist
+			// Ein Array ist es wenn das Formular bereits abgeschickt wurde und die Anfrage vom Formular kommt
+			// false ist es wenn kein Zugriff ist dann muss das Formular angezeigt werden
+				
+			if (false === $request_creds)
+			{
+			
+				// Berechtigungen anfragen
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&do=getCredentials&modul='.$_REQUEST['modul']);
+			
+			}
+			else if (is_array($request_creds))
+			{
+			
+				if (!WP_Filesystem($request_creds))
+				{
+			
+					// Eingegebene Daten waren falsch
+					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&do=getCredentials&modul='.$_REQUEST['modul']);
+			
+				}
+			
+			}
+			
+			$temp_name = $this->shop->getTempName($modul_key.'.zip');
+			@unlink($temp_name);
+				
+			if ($this->shop->get_option('wpsg_debugURL') === '1' && $this->shop->hasMod('wpsg_mod_core'))
+			{
+			
+				$url = 'http://dl.maennchen1.de/wpsg/'.$modul_key.'/'.$modul_key.'_dev.zip';
+			
+			}
+			else
+			{
+			
+				$url = 'http://dl.maennchen1.de/wpsg/'.$modul_key.'/'.$modul_key.'_latest.zip';
+			
+			}
+			
+			$bOK = @copy($url, $temp_name);
+			
+			if (!$bOK)
+			{
+			
+				$bOK = @file_put_contents($temp_name, $this->shop->get_url_content($url));
+			
+				if (!$bOK)
+				{
+						
+					// Pfad finden fÃŒr das Wordpress Filesystem
+					if ($GLOBALS['wpsg_sc']->isMultiBlog())
+						$ftp_path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/';
+						else
+							$ftp_path = WP_CONTENT_DIR.'/uploads/wpsg_temp/';
+								
+							$ftp_path = trailingslashit($wp_filesystem->find_folder($ftp_path)).preg_replace('/(.*)\/wpsg_temp\//', '', $temp_name);
+								
+							$bOK = $wp_filesystem->put_contents($ftp_path, $this->shop->get_url_content($url), FS_CHMOD_FILE);
+								
+							if (!$bOK)
+							{
+									
+								$this->shop->addBackendError(wpsg_translate(__('Modul (#1#) konnte nicht kopiert werden!', 'wpsg'), $modul_key));
+								return false;
+			
+							}
+								
+				}
+			
+			}
+				
+			$zip = new ZipArchive();
+			
+			if ($zip->open($temp_name) === true)
+			{
+			
+				try
+				{
+						
+					$bOK = @$zip->extractTo(WPSG_PATH.'/../');
+					$zip->close();
+			
+					if ($bOK === false)
+					{
+			
+						throw new Exception();
+							
+					}
+					else
+					{
+			
+						return true;
+							
+					}
+			
+				}
+				catch (Exception $e)
+				{
+						
+					// Es ist ein Fehler aufgetreten, jetzt versuche ich die Datei mit dem Wordpress Filesystem zu entpacken
+						
+					// Pfad finden fÃŒr das Wordpress Filesystem
+					$ftp_path = trailingslashit($wp_filesystem->find_folder(realpath(WPSG_PATH.'/../')));
+						
+					$bOK = unzip_file($temp_name, $ftp_path);
+						
+					if ($bOK !== true)
+					{
+			
+						$strError = '';
+			
+						// Hier ist immer noch ein Fehler aufgetreten
+						foreach ((array)$bOK->errors as $e)
+						{
+								
+							$strError .= $e[0].' ';
+			
+						}
+						 
+						$this->shop->addBackendError(wpsg_translate(__('Fehler beim Entpacken: #1#', 'wpsg'), $strError)); return false;
+			
+					}
+					else
+					{
+			
+						return true;
+			
+					}
+						
+				}
+			
+			}
+			else
+			{
+			
+				$this->shop->addBackendError(__('Datei konnte nicht ÃŒbertragen werden.', 'wpsg')); return false;
+			
+			}
+			
+			$this->shop->addBackendError(__('Datei konnte nicht entpackt werden.', 'wpsg')); return false;
+			
+		} // public function installModul($modul_key)
+		
+		/**
+		 * Fragt die Rechte ab und installiert anschlieÃend ein Modul
+		 */
+		public function getCredentialsAction()
+		{
+				
+			echo request_filesystem_credentials(
+				WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$_REQUEST['modul'],
+				'',
+				false,
+				false,
+				null
+			);
+				
+		} // public function getCredentialsAction()
+		
+	} // class wpsg_mod_core extends wpsg_mod_basic
+
+?>
Index: ds/wpsg_mod_coverletter.class.php
===================================================================
--- /mods/wpsg_mod_coverletter.class.php	(revision 8528)
+++ 	(revision )
@@ -1,577 +1,0 @@
-<?php
-		
-	/**
-	 * Modul zur Generierung von Anschreibenen
-	 * @author Daschmi
-	 */
-	class wpsg_mod_coverletter extends wpsg_mod_basic {
-		
-		var $lizenz = 0;
-		var $id = 2200;
-		var $hilfeURL = 'http://wpshopgermany.maennchen1.de/?p=3667';
-        var $version = "9.9.9";
-		
-		public function __construct() {
-			
-			parent::__construct();
-			
-			if (!defined('WPSG_TBL_COVERLETTER')) define('WPSG_TBL_COVERLETTER', $this->shop->prefix.'wpsg_coverletter');
-			
-			$this->name = __('Anschreiben', 'wpsg');
-			$this->group = __('Bestellung', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Erstellung von Anschreibenen.', 'wpsg');
-			
-		} // public function __construct()
-		
-		public function init() {
-			
-			$this->fields = array(
-				'company' => __('Firmenname', 'wpsg'),
-				'name' => __('Name', 'wpsg'),
-				'street' => __('StraÃe', 'wpsg'),
-				'zipcity' => __('PLZ/Ort', 'wpsg'),
-				'country' => __('Land', 'wpsg'),
-				'tel' => __('Tel', 'wpsg'),
-				'fax' => __('Fax', 'wpsg'),
-				'mail' => __('E-Mail', 'wpsg'),
-				'web' => __('Web', 'wpsg'),
-				'taxnr' => __('Steuer-Nr', 'wpsg'),
-				'ustidnr' => __('UStIdNr.', 'wpsg'),
-				'bank' => __('Bank', 'wpsg'),
-				'iban' => __('IBAN', 'wpsg'),
-				'bic' => __('BIC', 'wpsg'),
-				'user1' => __('Benutzer 1', 'wpsg'),
-				'user2' => __('Benutzer 2', 'wpsg'),
-				'user3' => __('Benutzer 3', 'wpsg'),
-				'user4' => __('Benutzer 4', 'wpsg'),
-				'user5' => __('Benutzer 5', 'wpsg')
-			);
-			
-		} // public function init()
-		 
-		public function install() {
-			
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-				
-			/**
-			 * Tabelle fÃŒr die Lieferanten
-			*/
-			$sql = "CREATE TABLE ".WPSG_TBL_COVERLETTER." (
-				id int(25) NOT NULL AUTO_INCREMENT,
-				cdate DATETIME NOT NULL,
-				order_id int(25) NOT NULL,
-				text TEXT NOT NULL,
-				KEY order_id (order_id), 
-				PRIMARY KEY  (id) 
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-				 
-			dbDelta($sql);  
-			
-		} // public function install()
-		
-		public function settings_edit() {
-					
-			$this->shop->view['wpsg_mod_coverletter']['fields'] = $this->fields;			
-			$this->shop->view['wpsg_mod_coverletter']['arTexts'] = $this->shop->get_option('wpsg_mod_coverletter_texts');
-			
-			if (!is_array($this->shop->view['wpsg_mod_coverletter']['arTexts'])) $this->shop->view['wpsg_mod_coverletter']['arTexts'] = array();
-
-			if (file_exists($this->getFilePath('').'wpsg_coverletter_bp.jpg')) {
-				
-				$this->shop->view['wpsg_mod_coverletter']['bp'] = $this->getFilePath('', true).'wpsg_coverletter_bp.jpg';
-				
-			} else if (file_exists($this->getFilePath('').'wpsg_coverletter_bp.pdf')) {
-				
-				$this->shop->view['wpsg_mod_coverletter']['bp'] = $this->getFilePath('', true).'wpsg_coverletter_bp.pdf';
-				
-			} else {
-				
-				$this->shop->view['wpsg_mod_coverletter']['bp'] = false;
-				
-			}
-
-			if (file_exists($this->getFilePath('').'wpsg_coverletter_logo.jpg')) {
-				
-				$this->shop->view['wpsg_mod_coverletter']['logo'] = $this->getFilePath('', true).'wpsg_coverletter_logo.jpg';
-				
-			} else {
-				
-				$this->shop->view['wpsg_mod_coverletter']['logo'] = false;
-				
-			}
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_coverletter/settings_edit.phtml');
-
-		} // public function settings_edit()
-		
-		/**
-		 * zeigt das Formular zum Drucken in der Bestellverwaltung
-		 */
-		public function order_view($order_id, &$arSidebarArray) {
-			 
-			$this->shop->view['mod_coverletter']['arCoverLetter'] = $this->db->fetchAssoc("
-				SELECT
-					CL.*
-				FROM
-					`".WPSG_TBL_COVERLETTER."` AS CL
-				WHERE
-					CL.`order_id` = '".wpsg_q($order_id)."'
-			");
-			
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'mods/mod_coverletter/order_view.phtml', false)
-			);
-			
-		} // public function order_view_content($order_id)
-
-		public function settings_save() {
-
-			// Sanitization
-			$_REQUEST['text'] = wpsg_sanitize("wpsg_txt_tbl", $_REQUEST['text']);
-
-			$this->shop->update_option("wpsg_mod_coverletter_texts", $_REQUEST['text']); 
-
-			if (file_exists($_FILES['wpsg_mod_coverletter_bp']['tmp_name'])) {
-
-				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_mod_coverletter_bp']['name']));
- 
-				if ($ending != "jpg" && $ending != "jpeg" && $ending != "pdf") {
-					
-					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Briefpapier) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
-					
-				} else if ($ending == "jpg" || $ending == "jpeg") {
-					
-					move_uploaded_file($_FILES['wpsg_mod_coverletter_bp']['tmp_name'], $this->getFilePath('').'wpsg_coverletter_bp.jpg');
-					
-				} else if ($ending == "pdf") {
-					
-					move_uploaded_file($_FILES['wpsg_mod_coverletter_bp']['tmp_name'], $this->getFilePath('').'wpsg_coverletter_bp.pdf');
-					
-				}
-
-			} else if ((array_key_exists('wpsg_mod_coverletter_bp_del', $_REQUEST)) && ($_REQUEST['wpsg_mod_coverletter_bp_del'] == "1")) {
-
-				@unlink($this->getFilePath('').'wpsg_coverletter_bp.jpg');
-				@unlink($this->getFilePath('').'wpsg_coverletter_bp.pdf');
-
-				$this->shop->addBackendMessage(__('Briefpapier wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
-			}
-
-			if (array_key_exists('wpsg_mod_coverletter_logo_position_left', $_REQUEST) && strpos($_REQUEST['wpsg_mod_coverletter_logo_position_left'], 'selected') !== false)
-				$wpsg_mod_coverletter_logo_position = "left";
-
-			if (array_key_exists('wpsg_mod_coverletter_logo_position_center', $_REQUEST) && strpos($_REQUEST['wpsg_mod_coverletter_logo_position_center'], 'selected') !== false)
-				$wpsg_mod_coverletter_logo_position = "center";
-
-			if (array_key_exists('wpsg_mod_coverletter_logo_position_right', $_REQUEST) && strpos($_REQUEST['wpsg_mod_coverletter_logo_position_right'], 'selected') !== false)
-				$wpsg_mod_coverletter_logo_position = "right";
- 
-			if (file_exists($_FILES['wpsg_mod_coverletter_logo']['tmp_name'])) {
-
-				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_mod_coverletter_logo']['name']));
-				
-				if ($ending != "jpg" && $ending != "jpeg") {
-					
-					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Logo) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
-					
-				} else if ($ending == "jpg" || $ending == "jpeg") {
-					
-					move_uploaded_file($_FILES['wpsg_mod_coverletter_logo']['tmp_name'], $this->getFilePath('').'wpsg_coverletter_logo.jpg');
-					
-				}
-
-			} else if ((array_key_exists('wpsg_mod_coverletter_logo_del', $_REQUEST)) && ($_REQUEST['wpsg_mod_coverletter_logo_del'] == "1")) {
-
-				@unlink($this->getFilePath('').'wpsg_coverletter_logo.jpg');
-
-				$this->shop->addBackendMessage(__('Logo wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
-			}
-
-			$bCheckTextField = false;
-			
-			foreach ($_REQUEST['text'] as $k => $v) {
-			    
-			    if (
-			        !in_array($k, ['firma', 'name', 'strasse', 'plzort', 'land', 'tel', 'fax', 'mail', 'web', 'strnr', 'ustidnr', 'knr', 'blz', 'bank', 'user1', 'user2', 'user3', 'user4', 'user5']) ||
-			        !wpsg_checkInput($v['text'], WPSG_SANITIZE_TEXTFIELD) ||
-			        !wpsg_checkInput($v['x'], WPSG_SANITIZE_FLOAT) ||
-			        !wpsg_checkInput($v['y'], WPSG_SANITIZE_FLOAT) ||
-			        !wpsg_checkInput($v['color'], WPSG_SANITIZE_HEXCOLOR) ||
-			        !wpsg_checkInput($v['fontsize'],WPSG_SANITIZE_INT)
-			        ) {			           
-			            
-			            $this->shop->addBackendError(__('Bitte ÃŒberprÃŒfen Sie die Textfelder.', 'wpsg'));
-			            $bCheckTextField = true;
-			            
-			        }
-			        
-			}
-			
-			if ($bCheckTextField) {
-			    
-			    $this->shop->update_option("wpsg_mod_coverletter_texte", $_REQUEST['text']);
-			    
-			}
-			
-			$this->shop->update_option('wpsg_mod_coverletter_subject', wpsg_getStr($_REQUEST['wpsg_mod_coverletter_subject'],'Anschreiben'), false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_coverletter_text', wpsg_getStr($_REQUEST['wpsg_mod_coverletter_text']), false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option("wpsg_mod_coverletter_logo_position", $wpsg_mod_coverletter_logo_position ? $wpsg_mod_coverletter_logo_position : null);
-			$this->shop->update_option("wpsg_mod_coverletter_logo_transparency", $_REQUEST['wpsg_mod_coverletter_logo_transparency'], false, false, WPSG_SANITIZE_FLOAT);
-			
-			$this->shop->update_option('wpsg_mod_coverletter_logo_x', $_REQUEST['wpsg_mod_coverletter_logo_x'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_coverletter_logo_y', $_REQUEST['wpsg_mod_coverletter_logo_y'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-		} // public function settings_save()
-				
-		public function order_ajax() {
-
-			$_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
-
-			if (isset($_REQUEST['wpsg_mod_coverletter_preview'])) {
-				
-				$arCustomReplace = [];
-				
-				if (wpsg_getStr($_REQUEST['target'])	 === '2') {
-					 
-					$arCustomReplace = [
-						'/%shopinfo_street%/i' => $this->shop->get_option('wpsg_shopdata_2_street'),
-						'/%shopinfo_zip%/i' => $this->shop->get_option('wpsg_shopdata_2_zip'),
-						'/%shopinfo_city%/i' => $this->shop->get_option('wpsg_shopdata_2_city'),
-						'/%shopinfo_country%/i' => $this->shop->get_option('wpsg_shopdata_2_country'),
-						'/%shopinfo_tel%/i' => $this->shop->get_option('wpsg_shopdata_2_tel'),
-						'/%shopinfo_fax%/i' => $this->shop->get_option('wpsg_shopdata_2_fax'),
-						'/%shopinfo_email%/i' => $this->shop->get_option('wpsg_shopdata_2_email')
-					];
-					
-				}
-								
-				// Vorschau eines Anschreibenes aus der Bestellverwaltung
-				$this->writeCoverLetter(
-					wpsg_getInt($_REQUEST['edit_id']),
-					$this->shop->get_option('wpsg_mod_coverletter_text'), 
-					true,
-					true,
-					'coverletter-preview.pdf',
-					$arCustomReplace
-				);
-			
-				die();
-				
-			} else if (isset($_REQUEST['wpsg_mod_coverletter_get'])) {
-				
-				$order_id = intval(wpsg_sinput("key", $_REQUEST['order_id']));
-				$cl_id = intval(wpsg_sinput("key", $_REQUEST['cl_id']));
-				
-				$file = $this->getFilePath($order_id).'coverletter_'.intval($cl_id).'.pdf';
-				
-				wpsg_header::PDFPlugin($file);
-				
-				exit;
-				
-			} else if (isset($_REQUEST['wpsg_mod_coverletter_write'])) {
-				 
-				if ($_REQUEST['edit_id'] <= 0) throw new \wpsg\Exception(__('Beim Erstellen des Anschreibendokumentes wurde keine BestellID ÃŒbergeben', 'wpsg'));
-				
-				// In Datenbank eintragen
-				$cl_id = $this->db->ImportQuery(WPSG_TBL_COVERLETTER, array(
-					'order_id' => wpsg_q($_REQUEST['edit_id']),
-					'cdate' => "NOW()",
-					'text' => wpsg_q($_REQUEST['text'])
-				));
-				
-				$filename = $this->getFilePath($_REQUEST['edit_id']).'/coverletter_'.$cl_id.'.pdf';
-				
-				$arCustomReplace = [];
-				
-				if ($_REQUEST['target'] === '2') {
-				
-					$arCustomReplace = [
-						'/%shopinfo_street%/i' => $this->shop->get_option('wpsg_shopdata_2_street'),
-						'/%shopinfo_zip%/i' => $this->shop->get_option('wpsg_shopdata_2_zip'),
-						'/%shopinfo_city%/i' => $this->shop->get_option('wpsg_shopdata_2_city'),
-						'/%shopinfo_country%/i' => $this->shop->get_option('wpsg_shopdata_2_country'),
-						'/%shopinfo_tel%/i' => $this->shop->get_option('wpsg_shopdata_2_tel'),
-						'/%shopinfo_fax%/i' => $this->shop->get_option('wpsg_shopdata_2_fax'),
-						'/%shopinfo_email%/i' => $this->shop->get_option('wpsg_shopdata_2_email')
-					];
-					
-				} 
-				
-				// Anschreiben erstellen
-				$bOK = $this->writeCoverLetter(
-					$_REQUEST['edit_id'], 
-					$_REQUEST['text'], 
-					false,
-					$cl_id,
-					$filename,
-					$arCustomReplace
-				);
-				
-				if ($bOK === true) {
-				 
-					if (!file_exists($filename) || !is_file($filename)) {
-						
-						$this->db->Query("DELETE FROM `".WPSG_TBL_COVERLETTER."` WHERE `id` = '".wpsg_q($cl_id)."'");
-						
-						throw new \wpsg\Exception(__('Das Anschreibendokument wurde nicht wie vorgesehen angelegt', 'wpsg'));
-						
-					}
-					 										
-					wpsg_header::PDFPlugin($filename);					
-										
-				}
-				else
-				{
-					
-					$this->db->Query("DELETE FROM `".WPSG_TBL_COVERLETTER."` WHERE `id` = '".wpsg_q($cl_id)."'");
-					
-					throw new \wpsg\Exception(__('Beim Erstellen des Anschreibendokumentes ist ein Fehler aufgetreten', 'wpsg'));
-					
-				}
-				
-			}
-			
-		} // public function order_ajax()
-		
-		public function delOrder($order_id) {
-				
-			// Anschreibene in der Datenbank lÃ¶schen
-			$this->db->Query("DELETE FROM `".WPSG_TBL_COVERLETTER."` WHERE `order_id` = '".wpsg_q($order_id)."'");
-				
-			// Anschreibene im Dateisystem lÃ¶schen
-			$path = $this->getFilePath($order_id); wpsg_rrmdir($path);
-				
-		} // public function delOrder($order_id)
-					
-		public function be_ajax() {
-				
-			if ($_REQUEST['do'] == 'reset') {
-			
-				$this->resetAction();
-				$this->shop->addBackendMessage(__('Grundeinstellungen wieder hergestellt', 'wpsg'));
-			
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul='.$_REQUEST['modul']);
-				
-			} else if (wpsg_isSizedString($_REQUEST['do'], 'getBp')) {
-				
-				$file = '';
-				
-				if (file_exists($this->getFilePath('')."wpsg_coverletter_bp.pdf")) {
-										
-					$file = $this->getFilePath('')."wpsg_coverletter_bp.pdf";
-					
-					header('Content-Type: application/pdf');
-					
-				} else if (file_exists($this->getFilePath('')."wpsg_coverletter_bp.jpg")) {
-					
-					$file = $this->getFilePath('')."wpsg_coverletter_bp.jpg";
-					
-					header("Content-type: image/jpeg");
-					
-				}
-				
-				readfile($file);				
-				
-			} else if (wpsg_isSizedString($_REQUEST['do'], 'getLogo')) {
-				
-				$logo = $this->getFilePath('').'wpsg_coverletter_logo.jpg';
-				
-				header("Content-type: image/jpeg");
-				readfile($logo);
-				
-			} else if ($_REQUEST['do'] == 'orderAjax') {
-
-				$this->order_ajax();
-
-			}			
-			
-		} // public function be_ajax()
-		 
-		/**
-		 * Generiert das Anschreiben fÃŒr eine Bestellung
-		 */
-		public function writeCoverLetter($order_id, $text, $preview, $clnr, $filename, $arCustomReplace = []) {
-
-			$text = $this->shop->replaceUniversalPlatzhalter($text, $order_id);
-			
-			if ($preview === true && !wpsg_isSizedInt($order_id)) {
-				
-				$this->shop->view['order'] = [
-					'onr' => __('Vorschau', 'wpsg'),
-					'cdate' => date('d.m.Y')
-				];
-				$this->shop->view['customer'] = [
-					'knr' => __('Vorschau', 'wpsg')
-				];
-				
-			} else {
-				
-				$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);			
-				$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);			
-				$this->shop->view['data'] = array();
-				
-			}
-
-			// Wurde die Bestellung in einer anderen Sprache gemacht
-			if (trim(wpsg_getStr($this->shop->view['order']['language'])) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			$this->shop->view['oOrder'] = $oOrder;
-			
-			// Rechnungsadresse		
-			$this->shop->view['data']['id'] = wpsg_getStr($this->shop->view['customer']['id']);
-			$this->shop->view['data']['company'] = wpsg_getStr($this->shop->view['customer']['firma']);
-			$this->shop->view['data']['firstname'] = wpsg_getStr($this->shop->view['customer']['vname']);
-			$this->shop->view['data']['name'] = wpsg_getStr($this->shop->view['customer']['name']);
-			$this->shop->view['data']['street'] = wpsg_getStr($this->shop->view['customer']['strasse']);
-			$this->shop->view['data']['hnr'] = wpsg_getStr($this->shop->view['customer']['nr']);
-			$this->shop->view['data']['zip'] = wpsg_getStr($this->shop->view['customer']['plz']);
-			$this->shop->view['data']['city'] = wpsg_getStr($this->shop->view['customer']['ort']);
-			
-			$this->shop->view['data']['country'] = '';			
-			if ($oOrder->getInvoiceCountryID() !== $this->shop->getDefaultCountry(true)) $this->shop->view['data']['country'] = strtoupper($oOrder->getInvoiceCountryName());
- 
-			if ($preview === true && !wpsg_isSizedInt($order_id)) {
-												
-				$this->shop->view['data']['company'] = __('Musterfirma', 'wpsg');
-				$this->shop->view['data']['firstname'] = __('Max', 'wpsg');
-				$this->shop->view['data']['name'] = __('Mustermann', 'wpsg');
-				$this->shop->view['data']['street'] = __('MusterstraÃe');
-				$this->shop->view['data']['hnr'] = '1';
-				$this->shop->view['data']['zip'] = '12345';
-				$this->shop->view['data']['city'] = __('Musterhausen', 'wpsg');
-				$this->shop->view['data']['country'] = ''; // strtoupper($this->shop->getDefaultCountry()->getName());
-				
-			}
-			  			
-			$this->shop->view['preview'] = $preview;
-			$this->shop->view['filename'] = $filename; 			
-			$this->shop->view['text'] = $text;
-			
-			// Benutzerdefinierte Felder
-			$this->shop->view['arTexts'] = $this->shop->get_option('wpsg_mod_coverletter_texts');
-			
-			foreach ($this->shop->view['arTexts'] as $k => $t) {
-				
-				$this->shop->view['arTexts'][$k]['text'] = $this->shop->replaceUniversalPlatzhalter(
-					$t['text'], 
-					$oOrder->id,
-					false,
-					false,
-					false,
-					$arCustomReplace
-				);
-				
-			}
-			
-			$this->shop->view['title'] = $this->shop->get_option('wpsg_mod_coverletter_subject');
-			$this->shop->view['clnr'] = $clnr;
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_coverletter/coverletter_pdf.phtml');
-
-			$this->shop->restoreTempLocale();
-			
-			return true;
-			
-		} // public function writeCoverLetter($order_id, $text, $preview, $nr, $filename) {
-		 
-		/**
-		 * LÃ€dt die Anschreibene einer Bestellung
-		 * @param int $order_id ID der Bestellung
-		 */
-		public function getCoverLetterFromOrder($order_id) {
-			
-			return $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_COVERLETTER."` WHERE `order_id` = '".wpsg_q($order_id)."' "); 
-			
-		} // public function loadanschreibensFromOrder($order_id)
-				
-		/**
-		 * Gibt den Absoluten Pfad zurÃŒck wo die Anschreibene gespeichert sind
-		 */
-		public function getFilePath($order_id, $url = false) {
-		
-			if ($order_id == '') {
-			    
-			    // Briefpapier/Logo
-				if ($this->shop->isMultiBlog()) {
-					
-					$path = WPSG_PATH_CONTENT.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_coverletter/'.$order_id.'/';
-					$url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_coverletter/';
-					
-					if ($url) $strReturn = $url_content.$order_id.'/';
-					else $strReturn = $path;
-					
-				} else {
-					
-					$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_coverletter/'.$order_id.'/';
-					
-					if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_coverletter/'.$order_id.'/';
-					else $strReturn = $path.'/';
-					
-				}
-				
-			} else {
-			    
-			    // Anschreiben aus Bestellung
-				$cl = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_COVERLETTER."` WHERE `order_id` = '".wpsg_q($order_id)."' ");
-				$ym = date('Y/m', strtotime($cl['cdate'])).'/';
-				
-				if ($this->shop->isMultiBlog()) {
-					
-					$path = WPSG_PATH_CONTENT.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_coverletter/'.$ym.$order_id.'/';
-					$url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_coverletter/'.$ym;
-					
-					if ($url) $strReturn = $url_content.$order_id.'/';
-					else $strReturn = $path;
-					
-				} else {
-					
-					$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_coverletter/'.$ym.$order_id.'/';
-					
-					if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_coverletter/'.$ym.$order_id.'/';
-					else $strReturn = $path.'/';
-					
-				}
-				
-			} // if ($order_id == '')
-			
-			$this->shop->protectDirectory($path, [
-                'wpsg_coverletter_logo.jpg', 'wpsg_coverletter_bp.jpg', 'wpsg_coverletter_bp.pdf'
-            ] );	
-            				
-			return $strReturn;
-		
-		} // private function getFilePath($produkt_id, $url = false)
-		
-		/* Private Funktionen */ 
-		
-		/**
-		 * LÃ€dt die vordefinierten Textfelder
-		 */
-		private function resetAction() {
-			
-			$arData = array(
-				"company" => array("aktiv" => "1", "x" => "24", "y" => "10", "fontsize" => 8, "text" => "%shopinfo_name%", "color" => "#000000"),
-				"name" => array("aktiv" => "1", "x" => "24", "y" => "13", "fontsize" => 8, "text" => "Inh. %shopinfo_owner%", "color" => "#000000"),
-				"street" => array("aktiv" => "1", "x" => "24", "y" => "16", "fontsize" => 8, "text" => "%shopinfo_street%", "color" => "#000000"),
-				"zipcity" => array("aktiv" => "1", "x" => "24", "y" => "19", "fontsize" => 8, "text" => "%shopinfo_zip% %shopinfo_city%", "color" => "#000000"),
-				"country" => array("aktiv" => "1", "x" => "24", "y" => "22", "fontsize" => 8, "text" => "%shopinfo_country%", "color" => "#000000"),
-				"tel" => array("aktiv" => "1", "x" => "75", "y" => "10", "fontsize" => 8, "text" => "Tel. %shopinfo_tel%", "color" => "#000000"),
-				"fax" => array("aktiv" => "1", "x" => "75", "y" => "13", "fontsize" => 8, "text" => "Fax. %shopinfo_fax%", "color" => "#000000"),
-				"mail" => array("aktiv" => "1", "x" => "75", "y" => "16", "fontsize" => 8, "text" => "Mail: %shopinfo_email%", "color" => "#000000"),
-				"web" => array("aktiv" => "1", "x" => "75", "y" => "19", "fontsize" => 8, "text" => "Web: ".site_url(), "color" => "#000000"),
-				"taxnr" => array("aktiv" => "1", "x" => "145", "y" => "279", "fontsize" => 8, "text" => "Steuer-Nr.: %shopinfo_taxnr%", "color" => "#000000"),
-				"ustidnr" => array("aktiv" => "1", "x" => "145", "y" => "282", "fontsize" => 8, "text" => "USt-IdNr.: %shopinfo_ustidnr%", "color" => "#000000"),
-				"bank" => array("aktiv" => "1", "x" => "24", "y" => "279", "fontsize" => 8, "text" => "Bank: %shopinfo_bankname%", "color" => "#000000"),
-				"iban" => array("aktiv" => "1", "x" => "24", "y" => "282", "fontsize" => 8, "text" => "IBAN: %shopinfo_iban%", "color" => "#000000"),
-				"bic" => array("aktiv" => "1", "x" => "24", "y" => "285", "fontsize" => 8, "text" => "BLZ: %shopinfo_bic%", "color" => "#000000"),
-			);
-			
-			$this->shop->update_option("wpsg_mod_coverletter_texts", $arData);
-			
-		} // public function resetAction()
-		
-	} // class wpsg_mod_coverletter extends wpsg_mod_basic
Index: ds/wpsg_mod_creditcard.class.php
===================================================================
--- /mods/wpsg_mod_creditcard.class.php	(revision 8528)
+++ 	(revision )
@@ -1,299 +1,0 @@
-<?php
-
-	/**
-	 * Dieses Modul erlaubt die Zahlungsart "Kreditkarte"
-	 * @author hartmut 
-	 */
-	class wpsg_mod_creditcard extends wpsg_mod_basic
-	{
-		
-		var $lizenz = 2;
-		var $id = 16;
-		var $version = "9.9.9";
-		var $hilfeURL = 'http://wpshopgermany.de/?p=4634999';
-		
-		/**
-		 * Costructor
-		 */
-		public function __construct() {
-			
-			parent::__construct();
-			
-			$this->name = __('Kreditkarte', 'wpsg');
-			$this->group = __('Zahlungsarten', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Zahlungsart Kreditkarte.', 'wpsg');
-						
-		} // public function __construct()
-		
-		public function install() {
-			 
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-			
-			/**
-			 * Bestelltabelle erweitern
-			 */ 
-			$sql = "CREATE TABLE ".WPSG_TBL_ORDER." (
-		   		mod_creditcard_typ BLOB NOT NULL,
-		   		mod_creditcard_inhaber BLOB NOT NULL,
-		   		mod_creditcard_knr BLOB NOT NULL,
-		   		mod_creditcard_pruefz BLOB NOT NULL,
-		   		mod_creditcard_gueltigm BLOB NOT NULL,
-				mod_creditcard_gueltigj BLOB NOT NULL
-		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-   	   	 
-   			dbDelta($sql);
-   			
-   			$this->shop->checkDefault('wpsg_mod_creditcard_bezeichnung', $this->name, false, true);
-   			$this->shop->checkDefault('wpsg_mod_creditcard_aktiv', '1');
-   			$this->shop->checkDefault('wpsg_mod_creditcard_hint', __('WÃ€hlen Sie diese Zahlungsart wenn sie uns eine EinzugsermÃ€chtigung fÃŒr ihr Konto erteilen mÃ¶chten. Wir benÃ¶tigen dazu folgende Angaben:', 'wpsg'), false, true);
-   			$this->shop->checkDefault('wpsg_mod_creditcard_gebuehr', '0');
-   			$this->shop->checkDefault('wpsg_mod_creditcard_mwst', '0');
-   			$this->shop->checkDefault('wpsg_mod_creditcard_mwstland', '0');
-            $this->shop->checkDefault('wpsg_mod_creditcard_schluessel', wpsg_genCode(256));
-			
-		} // public function install()
-		
-		public function settings_edit()
-		{
-									
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_creditcard/settings_edit.phtml');
-			
-		}
-		
-		public function settings_save() {
-			
-		    $this->shop->update_option('wpsg_mod_creditcard_bezeichnung', $_REQUEST['wpsg_mod_creditcard_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_creditcard_aktiv', $_REQUEST['wpsg_mod_creditcard_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_creditcard_hint', $_REQUEST['wpsg_mod_creditcard_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_creditcard_gebuehr', $_REQUEST['wpsg_mod_creditcard_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_creditcard_mwst', $_REQUEST['wpsg_mod_creditcard_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_creditcard_mwstland', $_REQUEST['wpsg_mod_creditcard_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_creditcard_schluessel', $_REQUEST['wpsg_mod_creditcard_schluessel'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-		} // public function settings_save()
-	
-		public function addPayment(&$arPayment) {
-
-			if (is_admin() || $this->shop->get_option('wpsg_mod_creditcard_aktiv') == '1') {
-				
-				$this->shop->view['error'] = $this->shop->view['error']??[];
-				
-				$this->shop->view['wpsg_mod_creditcard'] = [
-					'typ' => wpsg_getStr($_SESSION['wpsg']['checkout']['mod_creditcard_typ']),
-					'inhaber' => wpsg_getStr($_SESSION['wpsg']['checkout']['mod_creditcard_inhaber']),
-					'knr' => wpsg_getStr($_SESSION['wpsg']['checkout']['mod_creditcard_knr']),
-					'pruefz' => wpsg_getStr($_SESSION['wpsg']['checkout']['mod_creditcard_pruefz']),
-					'gueltigm' => wpsg_getStr($_SESSION['wpsg']['checkout']['mod_creditcard_gueltigm']),
-					'gueltigj' => wpsg_getStr($_SESSION['wpsg']['checkout']['mod_creditcard_gueltigj'])
-				];
-				 
-				$arPayment[$this->id] = array(
-					'id' => $this->id,
-					'name' => __($this->shop->get_option('wpsg_mod_creditcard_bezeichnung'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_creditcard_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_creditcard_mwst'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_creditcard_mwstland'),
-					//'hint' => __($this->shop->get_option('wpsg_mod_creditcard_hint')),
-					'hint' => $this->shop->render(WPSG_PATH_VIEW.'mods/mod_creditcard/paymenthint.phtml', false),
-					'logo' => $this->shop->getRessourceURL('mods/mod_creditcard/gfx/logo_100x25.png')
-				);
-							
-			}
-			
-		} // public function addPayment(&$arPayment)
-			
-		public function checkCheckout(&$state, &$error, &$arCheckout)  { 
-
-			if (wpsg_isSizedString($arCheckout['payment'])) {
-
-				if ($arCheckout['payment'] != $this->id) return;
-				
-			}
-	 
-			// Werte in die Session und den Checkout schreiben schreiben
-			if (
-					(isset($_REQUEST['wpsg_checkout']) && wpsg_isSizedArray($_REQUEST['wpsg_mod_creditcard'])) || 
-					(isset($_REQUEST['wpsg_checkout2']) && wpsg_isSizedArray($_REQUEST['wpsg_mod_creditcard']))
-			)
-			{
-		 
-				$_SESSION['wpsg']['checkout']['mod_creditcard_typ'] = wpsg_xss($_REQUEST['wpsg_mod_creditcard']['typ']);
-				$_SESSION['wpsg']['checkout']['mod_creditcard_pruefz'] = wpsg_xss($_REQUEST['wpsg_mod_creditcard']['pruefz']);
-				$_SESSION['wpsg']['checkout']['mod_creditcard_gueltigm'] = wpsg_xss($_REQUEST['wpsg_mod_creditcard']['gueltigm']);
-				$_SESSION['wpsg']['checkout']['mod_creditcard_gueltigj'] = wpsg_xss($_REQUEST['wpsg_mod_creditcard']['gueltigj']);
-				$_SESSION['wpsg']['checkout']['mod_creditcard_inhaber'] = wpsg_xss($_REQUEST['wpsg_mod_creditcard']['inhaber']);
-				$_SESSION['wpsg']['checkout']['mod_creditcard_knr'] = wpsg_xss($_REQUEST['wpsg_mod_creditcard']['knr']);
-				
-				$arCheckout['mod_creditcard_typ'] = $_SESSION['wpsg']['checkout']['mod_creditcard_typ'];
-				$arCheckout['mod_creditcard_pruefz'] = $_SESSION['wpsg']['checkout']['mod_creditcard_pruefz'];
-				$arCheckout['mod_creditcard_gueltigm'] = $_SESSION['wpsg']['checkout']['mod_creditcard_gueltigm'];
-				$arCheckout['mod_creditcard_gueltigj'] = $_SESSION['wpsg']['checkout']['mod_creditcard_gueltigj'];
-				$arCheckout['mod_creditcard_inhaber'] = $_SESSION['wpsg']['checkout']['mod_creditcard_inhaber'];
-				$arCheckout['mod_creditcard_knr'] = $_SESSION['wpsg']['checkout']['mod_creditcard_knr'];
-
-			}
-
-			if ( 
-					(($state > 1) ||
-					($state >= 1 && $this->shop->hasMod('wpsg_mod_onepagecheckout'))) &&
-					(isset($_REQUEST['wpsg_checkout']) || isset($_REQUEST['wpsg_checkout2']))
-				)
-			{
-						
-				if (trim($arCheckout['mod_creditcard_typ']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_creditcard_typ'; $this->shop->addFrontendError(__('Bitte den Namen der Kreditkarte kontrollieren (Kreditkarte)', 'wpsg')); $error = true; }
-				if (trim($arCheckout['mod_creditcard_inhaber']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_creditcard_inhaber'; $this->shop->addFrontendError(__('Bitte den Inhaber des Kontos kontrollieren (Kreditkarte)', 'wpsg')); $error = true; }
-				
-
-				if (trim($arCheckout['mod_creditcard_pruefz']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_creditcard_pruefz'; $this->shop->addFrontendError(__('Bitte die PrÃŒfziffer kontrollieren (Kreditkarte)', 'wpsg')); $error = true; }
-				if (trim($arCheckout['mod_creditcard_knr']) == '') { $_SESSION['wpsg']['errorFields'][] = 'mod_creditcard_knr'; $this->shop->addFrontendError(__('Bitte die Kartennummer ÃŒberprÃŒfen (Kreditkarte)', 'wpsg')); $error = true; }
-				
-				if (strlen(trim($arCheckout['mod_creditcard_pruefz'])) != 3) { $_SESSION['wpsg']['errorFields'][] = 'mod_creditcard_pruefz'; $this->shop->addFrontendError(__('Bitte die PrÃŒfziffer kontrollieren (Kreditkarte)', 'wpsg')); $error = true; }
-				
-				// Kartennummer prÃŒfen
-				$typ = trim($arCheckout['mod_creditcard_typ']);
-				$knr = trim($arCheckout['mod_creditcard_knr']);
-
-				if ($this->checkCreditCardNumber($typ, $knr) == false) { $_SESSION['wpsg']['errorFields'][] = 'mod_creditcard_knr'; $this->shop->addFrontendError(__('Bitte die Kartennummer ÃŒberprÃŒfen (Kreditkarte)', 'wpsg')); $error = true; }
-
-			}
-			
-		} // public function checkCheckout(&$state, &$error, &$arCheckout)
-		
-		private function checkCreditCardNumber($typ, $knr)
-		{
-			$knr = str_replace(" ", "", $knr);
-			$bb = true;
-			
-			if (!is_int($knr) == false)
-			{
-				return false;
-			}
-			$a1 = substr($knr, 0, 1);
-			$ai = intval(substr($knr, 15, 1), 10);
-			if (!((($a1 == "4") && ($typ == "VISA")) || (($a1 == "5") && ($typ == "MasterCard"))))
-			{
-				$bb = false;
-			}
-			$sum = 0;
-			$k = 2;
-			for ($i = 14; $i >= 0; $i--) {
-				$dig = $k * intval(substr($knr, $i, 1), 10);
-				if ($dig > 9) { $dig = $dig - 9;}
-				$sum = $sum + $dig;
-				//$sum = $sum + $k * intval(substr($knr, $i, 1), 10);
-				if ($k == 2) { $k = 1; } else { $k = 2; }
-			}
-			$sum = $sum % 10;
-			if ($sum > 0) { $sum = 10 - $sum; }
-			if ($sum != $ai) { $bb = false; }
-			
-			return $bb;	
-			
-		}
-		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) { 
-			
-			if ($_SESSION['wpsg']['checkout']['payment'] == $this->id) {
-				
-				$checkout = $_SESSION['wpsg']['checkout'];
-				
-				// Daten in die Bestelltabelle hinzutragen
-
-                /* Alter Algorithmus < PHP 7.1
-				//AES256
-				//string mcrypt_encrypt ( string $cipher , string $key , string $data , string $mode [, string $iv ] )
-				$key = $this->shop->get_option("wpsg_mod_creditcard_schluessel");
-
-				$iv = mcrypt_create_iv(16, MCRYPT_RAND);
-				
-				//echo wpsg_q($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_typ'], MCRYPT_MODE_CBC, $iv));
-				
-				$db_data['mod_creditcard_typ'] = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_typ'], MCRYPT_MODE_CBC, $iv));
-				$db_data['mod_creditcard_pruefz'] = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_pruefz'], MCRYPT_MODE_CBC, $iv));
-				$db_data['mod_creditcard_gueltigm'] = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_gueltigm'], MCRYPT_MODE_CBC, $iv));
-				$db_data['mod_creditcard_gueltigj'] = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_gueltigj'], MCRYPT_MODE_CBC, $iv));
-				$db_data['mod_creditcard_inhaber'] = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_inhaber'], MCRYPT_MODE_CBC, $iv));
-				$db_data['mod_creditcard_knr'] = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $checkout['mod_creditcard_knr'], MCRYPT_MODE_CBC, $iv));
-				*/
-
-                $key = $this->shop->get_option("wpsg_mod_creditcard_schluessel");
-                $iv = random_bytes(16);
-                $encrypt_method = "AES-256-CBC";
-
-                $db_data['mod_creditcard_typ'] = wpsg_q($iv.'|'.$encrypt_method.'|'.openssl_encrypt($checkout['mod_creditcard_typ'], $encrypt_method, $key, 0, $iv));
-                $db_data['mod_creditcard_pruefz'] = wpsg_q($iv.'|'.$encrypt_method.'|'.openssl_encrypt($checkout['mod_creditcard_pruefz'], $encrypt_method, $key, 0, $iv));
-                $db_data['mod_creditcard_gueltigm'] = wpsg_q($iv.'|'.$encrypt_method.'|'.openssl_encrypt($checkout['mod_creditcard_gueltigm'], $encrypt_method, $key, 0, $iv));
-                $db_data['mod_creditcard_gueltigj'] = wpsg_q($iv.'|'.$encrypt_method.'|'.openssl_encrypt($checkout['mod_creditcard_gueltigj'], $encrypt_method, $key, 0, $iv));
-                $db_data['mod_creditcard_inhaber'] = wpsg_q($iv.'|'.$encrypt_method.'|'.openssl_encrypt($checkout['mod_creditcard_inhaber'], $encrypt_method, $key, 0, $iv));
-                $db_data['mod_creditcard_knr'] = wpsg_q($iv.'|'.$encrypt_method.'|'.openssl_encrypt($checkout['mod_creditcard_knr'], $encrypt_method, $key, 0, $iv));
-
-			}
-						
-		}
-		 
-		public function order_view_afterpayment(&$order_id) {
-									
-			$order_data = $this->shop->cache->loadOrder($order_id);
-			
-			if ($order_data['type_payment'] != $this->id) return;
-			
-			$this->shop->view['wpsg_mod_creditcard']['typ'] = $this->decrypt($order_data['mod_creditcard_typ']);
-			$this->shop->view['wpsg_mod_creditcard']['pruefz'] = $this->decrypt($order_data['mod_creditcard_pruefz']);
-			$this->shop->view['wpsg_mod_creditcard']['gueltigm'] = $this->decrypt($order_data['mod_creditcard_gueltigm']);
-			$this->shop->view['wpsg_mod_creditcard']['gueltigj'] = $this->decrypt($order_data['mod_creditcard_gueltigj']);
-		    $this->shop->view['wpsg_mod_creditcard']['inhaber'] = $this->decrypt($order_data['mod_creditcard_inhaber']);
-			$this->shop->view['wpsg_mod_creditcard']['knr'] = $this->decrypt($order_data['mod_creditcard_knr']);
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_creditcard/order_view_afterpayment.phtml');
-			
-		} // public function order_view_afterpayment(&$order_id)
-
-		/**
-		 * Export der Daten als CSV
-		 * {@inheritDoc}
-		 * @see wpsg_mod_basic::wpsg_mod_export_loadFields()
-		 */
-		public function wpsg_mod_export_loadFields(&$arFields) {
-
-			$arFields[10]['fields']['mod_creditcard_typ'] = __('Kreditkartentyp', 'wpsg');
-			$arFields[10]['fields']['mod_creditcard_inhaber'] = __('Kreditkarteninhaber', 'wpsg');
-			$arFields[10]['fields']['mod_creditcard_knr'] = __('Kreditkartennummer', 'wpsg');
-			$arFields[10]['fields']['mod_creditcard_pruefz'] = __('KreditkartenprÃŒfziffer', 'wpsg');
-			$arFields[10]['fields']['mod_creditcard_gueltigm'] = __('Kreditkarten-GÃŒltigkeit-Monat', 'wpsg');
-			$arFields[10]['fields']['mod_creditcard_gueltigj'] = __('Kreditkarten-GÃŒltigkeit-Jahr', 'wpsg');
-				
-		} // public function wpsg_mod_export_loadFields(&$arFields)
-		
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-			
-			$arOrder = $this->shop->cache->loadOrder($o_id);
-			$value = "";
-
-			switch ($field_value) {
-
-                case 'mod_creditcard_typ': $value = $this->decrypt($arOrder['mod_creditcard_typ']); break;
-                case 'mod_creditcard_inhaber': $value = $this->decrypt($arOrder['mod_creditcard_inhaber']); break;
-                case 'mod_creditcard_knr': $value = $this->decrypt($arOrder['mod_creditcard_knr']); break;
-                case 'mod_creditcard_pruefz': $value = $this->decrypt($arOrder['mod_creditcard_pruefz']); break;
-                case 'mod_creditcard_gueltigm': $value = $this->decrypt($arOrder['mod_creditcard_gueltigm']); break;
-                case 'mod_creditcard_gueltigj': $value = $this->decrypt($arOrder['mod_creditcard_gueltigj']); break;
-
-            }
-
-			$return = $value;
-			
-		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator)
-
-        private function decrypt($string) {
-
-            $arString = explode('|', $string);
-            $key = $this->shop->get_option("wpsg_mod_creditcard_schluessel");
-            $iv = $arString[0];
-            $m = $arString[1];
-            $t = implode('', array_slice($arString, 2));
-
-            return openssl_decrypt($t, $m, $key, 0, $iv);
-
-        }
-
-	} // class wpsg_mod_creditcard extends wpsg_mod_basic
Index: /mods/wpsg_mod_crefopay.class.php
===================================================================
--- /mods/wpsg_mod_crefopay.class.php	(revision 8528)
+++ /mods/wpsg_mod_crefopay.class.php	(revision 5261)
@@ -116,33 +116,38 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_crefopay_merchantID', $_REQUEST['wpsg_mod_crefopay_merchantID'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_crefopay_shopID', $_REQUEST['wpsg_mod_crefopay_shopID'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_crefopay_sandbox', $_REQUEST['wpsg_mod_crefopay_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_crefopay_privateKey', $_REQUEST['wpsg_mod_crefopay_privateKey'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_crefopay_autocapture', $_REQUEST['wpsg_mod_crefopay_autocapture'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_crefopay_capturestatus', $_REQUEST['wpsg_mod_crefopay_capturestatus'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_crefopay_riskclass', $_REQUEST['wpsg_mod_crefopay_riskclass'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2']);
-			$this->shop->update_option('wpsg_mod_crefopay_currency', $_REQUEST['wpsg_mod_crefopay_currency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_crefopay_frameheight', $_REQUEST['wpsg_mod_crefopay_frameheight'], false, false, WPSG_SANITIZE_FLOAT);
+			
+			$this->shop->update_option('wpsg_mod_crefopay_merchantID', $_REQUEST['wpsg_mod_crefopay_merchantID']);
+			$this->shop->update_option('wpsg_mod_crefopay_shopID', $_REQUEST['wpsg_mod_crefopay_shopID']);
+			$this->shop->update_option('wpsg_mod_crefopay_sandbox', $_REQUEST['wpsg_mod_crefopay_sandbox']);
+			$this->shop->update_option('wpsg_mod_crefopay_privateKey', $_REQUEST['wpsg_mod_crefopay_privateKey']);
+			$this->shop->update_option('wpsg_mod_crefopay_autocapture', $_REQUEST['wpsg_mod_crefopay_autocapture']);
+			$this->shop->update_option('wpsg_mod_crefopay_capturestatus', $_REQUEST['wpsg_mod_crefopay_capturestatus']);
+			$this->shop->update_option('wpsg_mod_crefopay_riskclass', $_REQUEST['wpsg_mod_crefopay_riskclass']);
+			$this->shop->update_option('wpsg_mod_crefopay_currency', $_REQUEST['wpsg_mod_crefopay_currency']);						
+			$this->shop->update_option('wpsg_mod_crefopay_frameheight', $_REQUEST['wpsg_mod_crefopay_frameheight']);
 						
 			// Mapping speichern
-			foreach ($this->transactionMapping as $crefopay_state => $wpsg_state) $this->shop->update_option('wpsg_mod_crefopay_statemapping_'.$crefopay_state, $_REQUEST['wpsg_mod_crefopay_statemapping_'.$crefopay_state], false, false, WPSG_SANITIZE_INT);
-
-			$this->shop->update_option('wpsg_mod_crefopay_mns_notice', $_REQUEST['wpsg_mod_crefopay_mns_notice'], false, false, WPSG_SANITIZE_CHECKBOX);
+			foreach ($this->transactionMapping as $crefopay_state => $wpsg_state) $this->shop->update_option('wpsg_mod_crefopay_statemapping_'.$crefopay_state, $_REQUEST['wpsg_mod_crefopay_statemapping_'.$crefopay_state]);
+
+			$this->shop->update_option('wpsg_mod_crefopay_mns_notice', $_REQUEST['wpsg_mod_crefopay_mns_notice']);
 									
 		} // public function settings_save()
 		
-		public function addPayment(&$arPayment) {
-				
+		public function addPayment(&$arPayment)
+		{
+				
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_crefopay_mwst'), $this->shop->getDefaultCountry());
+		
 			$arPayment = array();
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
 				'name' => __('CrefoPay', 'wpsg'),
-				'price' => 0,
-				'tax_key' => 0,
+				'preis' => 0,
+				'mwst' => 0,
+				'mwst_value' => 0,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_crefopay_mwstland'),
 				'hint' => '',
-				'logo' => $this->shop->getRessourceURL('mods/mod_crefopay/gfx/logo_100x25.gif')
+				'logo' => $this->shop->getRessourceURL('mods/mod_crefopay/gfx/logo_crefopay.gif'),
+				'logo_100x25' => $this->shop->getRessourceURL('mods/mod_crefopay/gfx/logo_100x25.png')
 			);
 					
@@ -201,197 +206,13 @@
 				
 		} // public function mail_payment()
-		 
-		public function order_ajax()
-		{
-
-			$_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-
-			if (wpsg_isSizedString($_REQUEST['do'], 'status'))
-			{
-							
-				$bOK = $this->call_status($_REQUEST['edit_id']);
-				
-				if ($bOK !== false) $this->shop->addBackendMessage(__('CrefoPay Status wurde erfolgreich abgefragt.', 'wpsg'));
-				else $this->shop->addBackendError(__('CrefoPay Status konnte nicht abgefragt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
-				
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'cancel'))
-			{
-								
-				$bOK = $this->call_cancel($_REQUEST['edit_id']);
-				
-				if ($bOK !== false) 
-				{
-					
-					$this->shop->addBackendMessage(__('CrefoPay Zahlungsabbruch wurde erfolgreich durchgefÃŒhrt. Der Kunde kann die Zahlung nun ÃŒber die Bestellabschlussseite (Link in E-Mail) neu starten.', 'wpsg'));
-					
-					// Zahlungsstatus auffrischen
-					$this->call_status($_REQUEST['edit_id'], true);
-					
-				}
-				else $this->shop->addBackendError(__('CrefoPay Zahlungsabbruch konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
-			 	
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'capture'))
-			{
-				
-				$bOK = $this->call_capture($_REQUEST['edit_id']);
-				
-				if ($bOK !== false)
-				{
-					
-					$this->shop->addBackendMessage(__('CrefoPay Zahlungseinzug wurde erfolgreich durchgefÃŒhrt.', 'wpsg'));
-
-					// Zahlungsstatus auffrischen
-					$this->call_status($_REQUEST['edit_id'], true);
-					
-				}
-				else $this->shop->addBackendError(__('CrefoPay Zahlungseinzug konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
-					
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'refund'))
-			{
-				
-				$bOK = $this->call_refund($_REQUEST['edit_id']);
-				
-				if ($bOK !== false)
-				{
-					
-					$this->shop->addBackendMessage(__('CrefoPay RÃŒckerstattung wurde erfolgreich durchgefÃŒhrt.', 'wpsg'));
-					
-					// Zahlungsstatus auffrischen
-					$this->call_status($_REQUEST['edit_id'], true);
-					
-				}
-				else $this->shop->addBackendError(__('CrefoPay RÃŒckerstattung konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
-				
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
-				
-			}
-			else if (wpsg_isSizedString($_REQUEST['do'], 'finish'))
-			{
-				
-				$bOK = $this->call_finish($_REQUEST['edit_id']);
-				
-				if ($bOK !== false)
-				{
-					
-					$this->shop->addBackendMessage(__('CrefoPay Abschluss wurde erfolgreich durchgefÃŒhrt.', 'wpsg'));
-										
-				}
-				else $this->shop->addBackendError(__('CrefoPay Abschluss konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
-				
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
-				
-			}
-			 
-		} // public function order_ajax()
-		
-		public function order_view_afterpayment(&$order_id)
-		{
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_crefopay/order_view_afterpayment.phtml');
-			
-		} // public function order_view_sidebar(&$order_id)
-		
-		public function setOrderStatus($order_id, $status_id, $inform)
-		{
-
-			// Nur bei Stornierung etwas machen
-			if (!in_array($status_id, array('500')) || $this->mns === true) return;
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			
-			if ($status_id == '500' && $oOrder->getPaymentID() == $this->id) $response = $this->call_refund($order_id);
-			
-		}
-		
-		public function getPaymentName($payment_type, $order_id, &$payment_name) 
-		{ 
-			
-			if ($payment_type == $this->id) $payment_name = $this->getOrderPaymentName($order_id);
-			
-		} // public function getPaymentName($payment_type, $order_id)
-		
-		public function template_redirect() 
-		{ 
-
-			if (wpsg_isSizedString($_REQUEST['wpsg_mod'], 'wpsg_mod_crefopay') && wpsg_isSizedString($_REQUEST['wpsg_action'], 'doOrder'))
-			{
-				
-				// Hier die PrÃŒfung durchfÃŒhren und ggf. umleiten
-
-				// Zahlungsart auf CrefoPay setzen
-				$_SESSION['wpsg']['checkout']['payment'] = $this->id;
-				$this->shop->basket->arCheckout['payment'] = $this->id;
-				
-				// Bestellung abschlieÃen
-				$this->shop->basket->initFromSession();
-								
-				$bOK = $this->shop->basket->checkCheckout();
-				
-				if ($bOK)
-				{
-						
-					// Jetzt noch Module checken
-					$bModulError = false; $this->shop->callMods('checkFinaly', array(&$bModulError));
-						
-					if ($bModulError === true)
-					{
-				
-						$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_CHECKOUT));
-				
-					}	
-					else 
-					{
-					
-						// Bestellung in Session sichern
-						$_SESSION['wpsg']['wpsg_mod_crefopay']['wpsg_preCommit'] = $_SESSION['wpsg'];
-												
-						$order_id = $this->shop->basket->save();
-							
-						$_SESSION['wpsg']['wpsg_mod_crefopay']['order_id'] = $order_id;
-						
-						$this->shop->redirect($this->getDoPayUrl($order_id));
-						
-					} 
-						
-				}
-				else
-				{
-						
-					$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_CHECKOUT));
-						
-				}
-				
-			}
-			else if (isset($_REQUEST['orderNo']) && wpsg_isSizedInt($_SESSION['wpsg']['wpsg_mod_crefopay']['order_id']))
-			{
-
-				// Alte Bestellung aus Session laden
-				$oOrder = wpsg_order::getInstance($_SESSION['wpsg']['wpsg_mod_crefopay']['order_id']);
-				
-				if ($oOrder->onr != $_REQUEST['orderNo']) throw new \wpsg\Exception(__('Hier wurde die Warenkorb mit einer Bestellnummer aufgerufen die nicht mit der BestellID der Session ÃŒbereinstimmt', 'wpsg'));
-
-				// Alte Bestellung lÃ¶schen
-				$oOrder->delete();
-				
-				// Hier kommt der Kunde zurÃŒck in den Warenkorb um die Bestellung abzuÃ€ndern
-				$_SESSION['wpsg'] = $_SESSION['wpsg']['wpsg_mod_crefopay']['wpsg_preCommit'];
-
-				// Zum Warenkorb umleiten
-				$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-				
-			}
-			
+		
+		public function wp_loaded() 
+		{
+					
 			if (wpsg_isSizedString($_REQUEST['wpsg_plugin'], 'wpsg_mod_crefopay'))
 			{
-
+				
+				//mail("daniel@maennchen1.de", "CREFOTEST ".$_REQUEST['return'], print_r($_REQUEST, 1));
+				
 				// TemporÃ€r den Request korrigieren
 				// Anfrage URL: http://dev.wpshopgermany.de/warenkorb/?wpsg_plugin=wpsg_mod_crefopay&return=redirect?merchantID=2&...
@@ -552,4 +373,193 @@
 					
 				}
+				
+			}
+						
+		} // public function wp_loaded()
+		
+		public function order_ajax()
+		{
+			
+			if (wpsg_isSizedString($_REQUEST['do'], 'status'))
+			{
+							
+				$bOK = $this->call_status($_REQUEST['edit_id']);
+				
+				if ($bOK !== false) $this->shop->addBackendMessage(__('CrefoPay Status wurde erfolgreich abgefragt.', 'wpsg'));
+				else $this->shop->addBackendError(__('CrefoPay Status konnte nicht abgefragt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['do'], 'cancel'))
+			{
+								
+				$bOK = $this->call_cancel($_REQUEST['edit_id']);
+				
+				if ($bOK !== false) 
+				{
+					
+					$this->shop->addBackendMessage(__('CrefoPay Zahlungsabbruch wurde erfolgreich durchgefÃŒhrt. Der Kunde kann die Zahlung nun ÃŒber die BestellabschluÃseite (Link in E-Mail) neu starten.', 'wpsg'));
+					
+					// Zahlungsstatus auffrischen
+					$this->call_status($_REQUEST['edit_id'], true);
+					
+				}
+				else $this->shop->addBackendError(__('CrefoPay Zahlungsabbruch konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
+			 	
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['do'], 'capture'))
+			{
+				
+				$bOK = $this->call_capture($_REQUEST['edit_id']);
+				
+				if ($bOK !== false)
+				{
+					
+					$this->shop->addBackendMessage(__('CrefoPay Zahlungseinzug wurde erfolgreich durchgefÃŒhrt.', 'wpsg'));
+
+					// Zahlungsstatus auffrischen
+					$this->call_status($_REQUEST['edit_id'], true);
+					
+				}
+				else $this->shop->addBackendError(__('CrefoPay Zahlungseinzug konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
+					
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['do'], 'refund'))
+			{
+				
+				$bOK = $this->call_refund($_REQUEST['edit_id']);
+				
+				if ($bOK !== false)
+				{
+					
+					$this->shop->addBackendMessage(__('CrefoPay RÃŒckerstattung wurde erfolgreich durchgefÃŒhrt.', 'wpsg'));
+					
+					// Zahlungsstatus auffrischen
+					$this->call_status($_REQUEST['edit_id'], true);
+					
+				}
+				else $this->shop->addBackendError(__('CrefoPay RÃŒckerstattung konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['do'], 'finish'))
+			{
+				
+				$bOK = $this->call_finish($_REQUEST['edit_id']);
+				
+				if ($bOK !== false)
+				{
+					
+					$this->shop->addBackendMessage(__('CrefoPay Abschluss wurde erfolgreich durchgefÃŒhrt.', 'wpsg'));
+										
+				}
+				else $this->shop->addBackendError(__('CrefoPay Abschluss konnte nicht ÃŒbermittelt werden. Bitte beachten Sie das Bestellprotokoll.', 'wpsg'));
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+				
+			}
+			 
+		} // public function order_ajax()
+		
+		public function order_view_afterpayment(&$order_id)
+		{
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_crefopay/order_view_afterpayment.phtml');
+			
+		} // public function order_view_sidebar(&$order_id)
+		
+		public function setOrderStatus($order_id, $status_id, $inform)
+		{
+
+			// Nur bei Stornierung etwas machen
+			if (!in_array($status_id, array('500')) || $this->mns === true) return;
+			
+			$oOrder = wpsg_order::getInstance($order_id);
+			
+			if ($status_id == '500' && $oOrder->getPaymentID() == $this->id) $response = $this->call_refund($order_id);
+			
+		}
+		
+		public function getPaymentName($payment_type, $order_id, &$payment_name) 
+		{ 
+			
+			if ($payment_type == $this->id) $payment_name = $this->getOrderPaymentName($order_id);
+			
+		} // public function getPaymentName($payment_type, $order_id)
+		
+		public function template_redirect() 
+		{ 
+
+			if (wpsg_isSizedString($_REQUEST['wpsg_mod'], 'wpsg_mod_crefopay') && wpsg_isSizedString($_REQUEST['wpsg_action'], 'doOrder'))
+			{
+				
+				// Hier die PrÃŒfung durchfÃŒhren und ggf. umleiten
+
+				// Zahlungsart auf CrefoPay setzen
+				$_SESSION['wpsg']['checkout']['payment'] = $this->id;
+				$this->shop->basket->arCheckout['payment'] = $this->id;
+				
+				// Bestellung abschlieÃen
+				$this->shop->basket->initFromSession();
+								
+				$bOK = $this->shop->basket->checkCheckout();
+				
+				if ($bOK)
+				{
+						
+					// Jetzt noch Module checken
+					$bModulError = false; $this->shop->callMods('checkFinaly', array(&$bModulError));
+						
+					if ($bModulError === true)
+					{
+				
+						$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_CHECKOUT));
+				
+					}	
+					else 
+					{
+					
+						// Bestellung in Session sichern
+						$_SESSION['wpsg']['wpsg_mod_crefopay']['wpsg_preCommit'] = $_SESSION['wpsg'];
+												
+						$order_id = $this->shop->basket->save();
+							
+						$_SESSION['wpsg']['wpsg_mod_crefopay']['order_id'] = $order_id;
+						
+						$this->shop->redirect($this->getDoPayUrl($order_id));
+						
+					} 
+						
+				}
+				else
+				{
+						
+					$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_CHECKOUT));
+						
+				}
+				
+			}
+			else if (isset($_REQUEST['orderNo']) && wpsg_isSizedInt($_SESSION['wpsg']['wpsg_mod_crefopay']['order_id']))
+			{
+
+				// Alte Bestellung aus Session laden
+				$oOrder = wpsg_order::getInstance($_SESSION['wpsg']['wpsg_mod_crefopay']['order_id']);
+				
+				if ($oOrder->onr != $_REQUEST['orderNo']) die($this->shop->throwErrorCode('4000_1'));
+
+				// Alte Bestellung lÃ¶schen
+				$oOrder->delete();
+				
+				// Hier kommt der Kunde zurÃŒck in den Warenkorb um die Bestellung abzuÃ€ndern
+				$_SESSION['wpsg'] = $_SESSION['wpsg']['wpsg_mod_crefopay']['wpsg_preCommit'];
+
+				// Zum Warenkorb umleiten
+				$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
 				
 			}
@@ -1045,5 +1055,5 @@
 				'couponAbsolute' => '', // Coupon amount - Amount in smallest possible denomination e.g. 12366 ct; Amounts have always to be including all applicable taxes
 				'riskclassOverall' => (($this->shop->get_option('wpsg_mod_crefopay_riskclass') !== false)?$this->shop->get_option('wpsg_mod_crefopay_riskclass'):1),							
-				'shippingText' => $oOrder->getShippingLabel(), // Shipping option selected by the end user, e.g. âStandard deliveryâ
+				'shippingText' => $oOrder->getShippingTypName(), // Shipping option selected by the end user, e.g. âStandard deliveryâ
 				'phoneNumber' => $oCustomer->tel, // Userâs phone number
 				'transactionType' => (($this->shop->get_option('wpsg_mod_crefopay_autocapture') === '1')?'DIRECT':'RETAIL'), // transaction type â even though this filed is mandatory omitting the field will use the default setting which is RETAIL
@@ -1152,33 +1162,77 @@
 		} // private function getURL()
 						
-		private function crefopay_call($order_id, $data, $call, $noLog = false) {
+		private function crefopay_call($order_id, $data, $call, $noLog = false)
+		{
 			
 			$oOrder = wpsg_order::getInstance($order_id);
 			
-			$result = $this->shop->get_url_post_content($this->getURL().$call.'/', $data);
-			$json_response = @json_decode($result, true);
-			
-			if (wpsg_isSizedArray($json_response)) {
-	
-				if (isset($json_response['errorCode']) && $json_response['errorCode'] != 'OK') {
-						
-					$strError = $json_response['message'].' ('.$json_response['errorCode'].')';
-						
-				} else {
-						
-					// Alles gut -> MAC verifizieren			
-					return $json_response;
-													
-				}
-	
-			} else {
-					
-				$strError = "JSON Error: ".json_last_error();
-	
-			}
-				
-			if (wpsg_isSizedString($strError) && !$noLog) {
+			$ch = curl_init();
+				
+			$strError = "";
+				
+			if (strlen(curl_error($ch))) {
+			
+				$strError = curl_errro($ch);
+			
+			}
+			else
+			{
+			
+				curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+				curl_setopt($ch, CURLOPT_URL, $this->getURL().$call.'/');
+				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+				curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+				curl_setopt($ch, CURLOPT_TIMEOUT, 60);
+				curl_setopt($ch, CURLOPT_POST, 1);
+				curl_setopt($ch, CURLOPT_HEADER, 0);
+				curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, '', '&'));
+			
+				$responseBody = @curl_exec($ch);
+				$responseInfo = curl_getinfo($ch);
+			
+				if (strlen(curl_error($ch)))
+				{
+			
+					$strError = wpsg_translate(__('CURL Error: #1#', 'wpsg'), curl_error($ch));
+						
+				}
+				else
+				{
+						
+					$json_response = @json_decode($responseBody, true);
+			
+					if (wpsg_isSizedArray($json_response))
+					{
+			
+						if (isset($json_response['errorCode']) && $json_response['errorCode'] != 'OK')
+						{
+								
+							$strError = $json_response['message'].' ('.$json_response['errorCode'].')';
+								
+						}
+						else
+						{
+								
+							// Alles gut -> MAC verifizieren			
+							return $json_response;
+															
+						}
+			
+					}
+					else
+					{
+							
+						$strError = "JSON Error: ".json_last_error();
+			
+					}
+						
+				}
+			
+			}
+				
+			if (wpsg_isSizedString($strError) && !$noLog)
+			{
 			 
-				$oOrder->log(wpsg_translate(__('CrefoPay Fehler: #1#', 'wpsg'), $strError), "Request Data:\r\n".print_r($data, 1)."\r\nResponse Body:\r\n".$result);
+				$oOrder->log(wpsg_translate(__('CrefoPay Fehler: #1#', 'wpsg'), $strError), "Request Data:\r\n".print_r($data, 1)."\r\nResponse Body:\r\n".$responseBody."\r\n\r\nResponse Info:\r\n".print_r($responseInfo, 1));
 				
 			}
Index: /mods/wpsg_mod_customerbudget.class.php
===================================================================
--- /mods/wpsg_mod_customerbudget.class.php	(revision 8528)
+++ /mods/wpsg_mod_customerbudget.class.php	(revision 5261)
@@ -9,5 +9,4 @@
 		var $lizenz = 1;
 		var $id = 1001;
-        var $version = "9.9.9";
 		
 		/**
@@ -67,9 +66,9 @@
 		public function settings_save() {
 		
-		    $this->shop->update_option('wpsg_mod_customerbudget_name', $_REQUEST['wpsg_mod_customerbudget_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->addTranslationString('wpsg_mod_customerbudget_name', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_customerbudget_name']) ?: $this->shop->get_option('wpsg_mod_customerbudget_name'));
+			$this->shop->update_option('wpsg_mod_customerbudget_name', $_REQUEST['wpsg_mod_customerbudget_name']);
+			$this->shop->addTranslationString('wpsg_mod_customerbudget_name', $_REQUEST['wpsg_mod_customerbudget_name']);
 			
-			$this->shop->update_option('wpsg_mod_customerbudget_hint', $_REQUEST['wpsg_mod_customerbudget_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_customerbudget_hint', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_customerbudget_hint']) ?: $this->shop->get_option('wpsg_mod_customerbudget_hint'));
+			$this->shop->update_option('wpsg_mod_customerbudget_hint', $_REQUEST['wpsg_mod_customerbudget_hint']);
+			$this->shop->addTranslationString('wpsg_mod_customerbudget_hint', $_REQUEST['wpsg_mod_customerbudget_hint']);
 			
 		} // public function settings_save()
@@ -86,16 +85,19 @@
 		public function wpsg_mod_customer_save(&$customer_data) { 
 			
-		    $customer_data['budget'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['wpsg_mod_customerbudget_budget'], WPSG_SANITIZE_FLOAT));
+			$customer_data['budget'] = wpsg_tf($_REQUEST['wpsg_mod_customerbudget_budget']);
 			
 		} // public function wpsg_mod_customer_save(&$customer_data)
 				
-		public function addPayment(&$arPayment) { 
+		public function addPayment(&$arPayment) 
+		{ 
 			
 			$arPayment[$this->id] = array(
-				'id' => $this->id,
-				'name' => __($this->shop->get_option('wpsg_mod_customerbudget_name'), 'wpsg'),
-				'price' => 0,
-				'tax_key' => 0,				
-				'hint' => __($this->shop->get_option('wpsg_mod_customerbudget_hint'), 'wpsg') 
+				'id' 			=> $this->id,
+				'name' 			=> __($this->shop->get_option('wpsg_mod_customerbudget_name'), 'wpsg'),
+				'preis' 		=> 0,
+				'preis_calc' 	=> 0,
+				'mwst' 			=> 0,
+				'mwst_value' 	=> 0,
+				'hint' 			=> __($this->shop->get_option('wpsg_mod_customerbudget_hint'), 'wpsg') 
 			);
 			 
@@ -131,22 +133,37 @@
 		} // public function checkCheckout(&$state, &$error, &$arCheckout)
 		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) {
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
+		{ 
 			
-			if (!$finish_order) return;
+			if ($finish_order !== true) return;
 			
-			if ($_SESSION['wpsg']['checkout']['payment'] == $this->id) {
+			if ($checkout['payment'] == $this->id)
+			{
 				
-				$kunde = $this->shop->cache->LoadKunden($_SESSION['wpsg']['checkout']['id']);
-				
-				if ($this->shop->getBackendTaxview() === WPSG_NETTO) $sum = $arCalculation['sum']['brutto'];
-				else $sum = $arCalculation['sum']['netto'];
+				$kunde = $this->shop->cache->LoadKunden($checkout['id']);
 				
 				$this->db->UpdateQuery(WPSG_TBL_KU, array(
-					'budget' => wpsg_q($kunde['budget'] - $sum)
-				), "`id` = '".wpsg_q($_SESSION['wpsg']['checkout']['id'])."'");
+					'budget' => wpsg_q($kunde['budget'] - $data['price_gesamt'])
+				), "`id` = '".wpsg_q($checkout['id'])."'");
 				
 			}
 			
-		}
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
+		public function calcPayment(&$arBasket) { 
+			
+			
+			if ($arBasket['checkout']['payment'] == $this->id && $this->shop->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn') && !is_admin() && isset($_REQUEST['wpsg_checkout2']))
+			{
+				
+				$kunde = $this->shop->cache->loadKunden($_SESSION['wpsg']['checkout']['id']);
+				
+				if (trim($this->shop->arPayment[$this->id]['hint']) != '') $this->shop->arPayment[$this->id]['hint'] .= '<br />';
+				
+				$this->shop->arPayment[$this->id]['hint'] .= wpsg_translate(__('Kontostand: #1#', 'wpsg'), wpsg_ff($kunde['budget'], $this->shop->get_option('wpsg_currency')));				
+				
+			}		
+			 
+		} // public function calcPayment(&$arBasket)
 		
 	} // class wpsg_mod_customerbudget extends wpsg_mod_basic
Index: /mods/wpsg_mod_customergroup.class.php
===================================================================
--- /mods/wpsg_mod_customergroup.class.php	(revision 8528)
+++ /mods/wpsg_mod_customergroup.class.php	(revision 5261)
@@ -12,6 +12,5 @@
 		var $hilfeURL = 'http://wpshopgermany.maennchen1.de/?p=13706';
 		
-		var $customerGroupPerPage = 1;// 25;
-		var $free = false;
+		var $customerGroupPerPage = 25;
 				
 		/**
@@ -27,7 +26,6 @@
 			$this->desc = __('Ist dieses Modul aktiv, so lassen sich die Kunden in Kundengruppen verwalten. Mit den entsprechenden Modul "Rabatt" ist es mÃ¶glich einen Rabatt je Kundengruppe zu definieren.', 'wpsg');
 						
-			$this->customerGroupPerPage = $this->shop->get_option('wpsg_mod_kundenverwaltung_group_perpage');
 		} // public function __construct()		
-		 
+		
 		public function install()
 		{
@@ -54,9 +52,7 @@
 		} // public function install()
 		
-		public function init() {
-				
-			$role_object = get_role('administrator');
-		    $role_object->add_cap('wpsg_customergroup');
-			
+		public function init()
+		{
+				
 			// Modell einbinden
 			require_once(WPSG_PATH_MOD.'mod_customergroup/wpsg_customergroup.php');
@@ -64,14 +60,8 @@
 		} // public function init()
 		
-		public function admin_setcapabilities() {
-		
-			$this->render(WPSG_PATH_VIEW.'/mods/mod_customergroup/admin_setcapabilities.phtml');
-		
-		} // public function admin_setcapabilities()
-		
-		public function wpsg_add_pages($default_page)
-		{
-
-			add_submenu_page($default_page, __('Kundengruppenverwaltung', 'wpsg'), __('Kundengruppen', 'wpsg'), 'wpsg_customergroup', 'wpsg-Customergroup', array($this, 'be_dispatch'));
+		public function wpsg_add_pages()
+		{
+		
+			add_submenu_page('wpsg-Admin', __('Kundengruppenverwaltung', 'wpsg'), __('Kundengruppen', 'wpsg'), 'wpsg_order', 'wpsg-Customergroup', array($this, 'be_dispatch'));
 				
 		} // public function wpsg_add_pages()
@@ -95,8 +85,7 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_kundenverwaltung_group_perpage', $_REQUEST['wpsg_mod_kundenverwaltung_group_perpage'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_page_mod_kundenverwaltung_group_checkout', $_REQUEST['wpsg_page_mod_kundenverwaltung_group_checkout'], false, false, WPSG_SANITIZE_INT);
-		    $this->shop->update_option('wpsg_page_mod_kundenverwaltung_group_register', $_REQUEST['wpsg_page_mod_kundenverwaltung_group_register'], false, false, WPSG_SANITIZE_INT);
+			
+			$this->shop->update_option('wpsg_page_mod_kundenverwaltung_group_checkout', $_REQUEST['wpsg_page_mod_kundenverwaltung_group_checkout']);
+			$this->shop->update_option('wpsg_page_mod_kundenverwaltung_group_register', $_REQUEST['wpsg_page_mod_kundenverwaltung_group_register']);
 							
 		} // public function settings_save()
@@ -104,18 +93,4 @@
 		/* Modulfunktionen */
 
-        /**
-         * Gibt einen Array mit [id] => Titel der Kundengruppen zurÃŒck
-         */
-        public function getCustomerGroupArray() {
-            
-            return $this->db->fetchAssocField("
-                SELECT
-                    `id`, `name`
-                FROM 
-                    `".WPSG_TBL_KG."`
-            ", "id", "name");
-            
-        } // public function getCustomerGroupArray()
-        
 		public function be_dispatch()
 		{
@@ -160,5 +135,5 @@
 		{
 				
-			if (!wpsg_isSizedInt($_REQUEST['edit_id'])) throw new \wpsg\Exception(__('Beim bearbeiten einer Kundengruppe wurde keine ID ÃŒbergeben', 'wpsg'));
+			if (!wpsg_isSizedInt($_REQUEST['edit_id'])) $this->shop->throwErrorCode('3090_1');
 				
 			$this->shop->view['data'] = new wpsg_customergroup();
@@ -194,5 +169,5 @@
 			$this->shop->view['mode'] = 'add';
 			$this->shop->view['edit_id'] = 0;
-			$this->shop->view['data'] = new wpsg_customergroup();
+			$this->shop->view['data'] = false;
 				
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_customergroup/addedit.phtml');
@@ -205,7 +180,5 @@
 		public function saveAction()
 		{
-
-			if(isset($_REQUEST['edit_id'])) $_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-
+				
 			if (wpsg_isSizedInt($_REQUEST['edit_id']))
 			{
@@ -213,7 +186,7 @@
 				// Update
 				$this->db->UpdateQuery(WPSG_TBL_KG, array(
-						'name' => wpsg_q(wpsg_sinput("text_field", $_REQUEST['wpsg_mod_kundenverwaltung']['name'])),
+						'name' => wpsg_q($_REQUEST['wpsg_mod_kundenverwaltung']['name']),
 						'calculation' => wpsg_q($_REQUEST['wpsg_mod_kundenverwaltung']['calculation'])
-				), " `id` = '".wpsg_q(wpsg_sinput("key", $_REQUEST['edit_id']))."' ");
+				), " `id` = '".wpsg_q($_REQUEST['edit_id'])."' ");
 					
 				$this->shop->addBackendMessage(__('Kundengruppe erfolgreich gespeichert', 'wpsg'));
@@ -225,6 +198,6 @@
 				// Insert
 				$_REQUEST['edit_id'] = $this->db->ImportQuery(WPSG_TBL_KG, array(
-						'name' => wpsg_q(wpsg_sinput("text_field", $_REQUEST['wpsg_mod_kundenverwaltung']['name'])),
-						'calculation' => wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_kundenverwaltung']['calculation']))
+						'name' => wpsg_q($_REQUEST['wpsg_mod_kundenverwaltung']['name']),
+						'calculation' => wpsg_q($_REQUEST['wpsg_mod_kundenverwaltung']['calculation'])
 				));
 					
@@ -255,48 +228,47 @@
 		public function indexAction()
 		{
-
-			$nPerPage = $this->customerGroupPerPage;
-			if ($nPerPage <= 0) $nPerPage = 10;
-
-			$this->shop->view['hasFilter'] = false;
-			$this->shop->view['arFilter'] = array(
-				'order' => 'cdate',
-				'ascdesc' => 'ASC',
-				'status' => '0',
-				'page' => '1'
-			);
-
-			$this->shop->view['arData'] = array();
-			$this->shop->view['pages'] = 1;
-
+		
+			$arFilter = array();
+				
 			if (wpsg_isSizedArray($_REQUEST['filter']))
 			{
-
-				$_REQUEST['filter'] = wpsg_sinput("text_field", $_REQUEST['filter']);
-
-				$this->shop->view['arFilter'] = $_REQUEST['filter'];
-				$this->shop->view['hasFilter'] = true;
-
-			}
-			else if (wpsg_isSizedArray($_SESSION['wpsg']['backend']['customergroup']['arFilter'])) $this->shop->view['arFilter'] = $_SESSION['wpsg']['backend']['customergroup']['arFilter'];
-
-			$this->shop->view['countAll'] = wpsg_customergroup::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = $_REQUEST['seite'];
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if ($this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['customergroup']['arFilter'] = $this->shop->view['arFilter'];
-
-			$this->shop->view['arData'] = wpsg_customergroup::find($this->shop->view['arFilter']);
-
+		
+				if (wpsg_isSizedString($_REQUEST['filter']['s']))
+				{
+		
+					$arFilter['name'] = $_REQUEST['filter']['s'];
+		
+				}
+		
+				$arFilter['order'] = $_REQUEST['filter']['order'];
+				$arFilter['ascdesc'] = $_REQUEST['filter']['ascdesc'];
+		
+				$this->shop->view['filter'] = $_REQUEST['filter'];
+		
+			}
+			else
+			{
+		
+				$arFilter['order'] = 'id';
+				$arFilter['ascdesc'] = 'desc';
+		
+				$this->shop->view['filter'] = $arFilter;
+		
+			}
+				
+			$this->shop->view['data'] = wpsg_customergroup::find($arFilter);
+				
+			$this->shop->view['count'] = sizeof($this->shop->view['data']);
+			if (isset($_REQUEST['seite'])) $this->shop->view['seite'] = $_REQUEST['seite']; else $this->shop->view['seite'] = 1;
+			$this->shop->view['pages'] = ceil($this->shop->view['count'] / $this->customerGroupPerPage);
+			if ($this->shop->view['seite'] <= 0 || $this->shop->view['seite'] > $this->shop->view['pages']) $this->shop->view['seite'] = 1;
+				
+			$this->shop->view['data'] = array_slice($this->shop->view['data'], ($this->shop->view['seite'] - 1) * $this->customerGroupPerPage, $this->customerGroupPerPage);
+				
 			$this->shop->render(WPSG_PATH_VIEW.'mods/mod_customergroup/index.phtml');
- 
+				
 		} // public function indexAction()
 				
 	} // class wpsg_mod_customergroup extends wpsg_mod_basic
 	
+?>
Index: /mods/wpsg_mod_debitpayment.class.php
===================================================================
--- /mods/wpsg_mod_debitpayment.class.php	(revision 8528)
+++ /mods/wpsg_mod_debitpayment.class.php	(revision 5261)
@@ -47,32 +47,106 @@
 		{
 			
-		    $this->shop->update_option('wpsg_mod_debitpayment_name', $_REQUEST['wpsg_mod_debitpayment_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_debitpayment_aktiv', $_REQUEST['wpsg_mod_debitpayment_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->addTranslationString('wpsg_mod_debitpayment_name', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_debitpayment_name']));
+			$this->shop->update_option('wpsg_mod_debitpayment_name', $_REQUEST['wpsg_mod_debitpayment_name']);
+			$this->shop->update_option('wpsg_mod_debitpayment_aktiv', $_REQUEST['wpsg_mod_debitpayment_aktiv']);
+			$this->shop->addTranslationString('wpsg_mod_debitpayment_name', $_REQUEST['wpsg_mod_debitpayment_name']);
 			
-			$this->shop->update_option('wpsg_mod_debitpayment_hint', $_REQUEST['wpsg_mod_debitpayment_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_debitpayment_hint', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_debitpayment_hint']));
+			$this->shop->update_option('wpsg_mod_debitpayment_hint', $_REQUEST['wpsg_mod_debitpayment_hint']);
+			$this->shop->addTranslationString('wpsg_mod_debitpayment_hint', $_REQUEST['wpsg_mod_debitpayment_hint']);
 			
-			$this->shop->update_option('wpsg_mod_debitpayment_rabgeb', $_REQUEST['wpsg_mod_debitpayment_rabgeb'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_debitpayment_mwstland', $_REQUEST['wpsg_mod_debitpayment_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_debitpayment_mwst', $_REQUEST['wpsg_mod_debitpayment_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
+			$this->shop->update_option('wpsg_mod_debitpayment_rabgeb', wpsg_tf($_REQUEST['wpsg_mod_debitpayment_rabgeb'], true));
+			$this->shop->update_option('wpsg_mod_debitpayment_mwstland', $_REQUEST['wpsg_mod_debitpayment_mwstland']);
+			$this->shop->update_option('wpsg_mod_debitpayment_mwst', $_REQUEST['wpsg_mod_debitpayment_mwst']);
 						
 		} // public function settings_save()
 		
-		public function addPayment(&$arPayment) { 
+		public function addPayment(&$arPayment) 
+		{ 
 
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_debitpayment_aktiv') != '1') return;
-			 
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_debitpayment_mwst'), $this->shop->getDefaultCountry());
+			
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
 				'name' => __($this->shop->get_option('wpsg_mod_debitpayment_name'), 'wpsg'),
 				'hint' => __($this->shop->get_option('wpsg_mod_debitpayment_hint')),
-				'price' => $this->shop->get_option('wpsg_mod_debitpayment_rabgeb'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_debitpayment_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_debitpayment_rabgeb'),
+				'mwst' => $this->shop->get_option('wpsg_mod_debitpayment_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_debitpayment_mwstland')
 			);
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
 						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_debitpayment_rabgeb'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_debitpayment_rabgeb'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_debitpayment_rabgeb'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_debitpayment_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_debitpayment_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket)
+		
 	} // class wpsg_mod_debitpayment extends wpsg_mod_payment
 
Index: /mods/wpsg_mod_deliverynote.class.php
===================================================================
--- /mods/wpsg_mod_deliverynote.class.php	(revision 8528)
+++ /mods/wpsg_mod_deliverynote.class.php	(revision 5261)
@@ -5,9 +5,7 @@
 	 * @author Daschmi
 	 */
-	class wpsg_mod_deliverynote extends wpsg_mod_basic {
-
-        /** @var array $arTypen */
-        public $fields = [];
-
+	class wpsg_mod_deliverynote extends wpsg_mod_basic
+	{
+		
 		var $lizenz = 1;
 		var $id = 2000;
@@ -35,5 +33,5 @@
 				'firma' => __('Firmenname', 'wpsg'),
 				'name' => __('Name', 'wpsg'),
-				'strasse' => __('StraÃe', 'wpsg'),
+				'strasse' => __('Strasse', 'wpsg'),
 				'plzort' => __('PLZ/Ort', 'wpsg'),
 				'land' => __('Land', 'wpsg'),
@@ -55,5 +53,5 @@
 			
 		} // public function init()
-		 
+		
 		public function install()
 		{
@@ -82,21 +80,18 @@
 			$this->shop->checkDefault('wpsg_mod_deliverynote_nrformat', '%lnr%');
 			$this->shop->checkDefault('wpsg_mod_deliverynote_nr', '1');
-			
-			// Voreinstellungen der E-Mail
-			$this->shop->checkDefault('wpsg_deliverymail_betreff', __('Ihr Lieferschein', 'wpsg'));
 						
 			if ($this->shop->get_option('wpsg_mod_deliverynote_texte') === false) $this->resetAction();				
 			
 		} // public function install()
-
+		
 		public function settings_edit()
 		{
-
+			
 			$this->shop->view['wpsg_mod_deliverynote']['fields'] = $this->fields;
 			$this->shop->view['wpsg_mod_deliverynote']['arTexte'] = $this->shop->get_option('wpsg_mod_deliverynote_texte');
 			if (!is_array($this->shop->view['wpsg_mod_deliverynote']['arTexte'])) $this->shop->view['wpsg_mod_deliverynote']['arTexte'] = array();
-
+			
 			$this->shop->view['foottext_list'] = $this->foottext_list();
-
+			
 			if (file_exists($this->getFilePath('').'wpsg_deliverynote_bp.jpg'))
 			{
@@ -111,5 +106,5 @@
 				$this->shop->view['wpsg_mod_deliverynote']['bp'] = false;
 			}
-
+				
 			if (file_exists($this->getFilePath('').'wpsg_deliverynote_logo.jpg'))
 			{
@@ -120,117 +115,75 @@
 				$this->shop->view['wpsg_mod_deliverynote']['logo'] = false;
 			}
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverynote/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
-		public function settings_save() {
-
-			//$serText = @serialize($_REQUEST['text']);
-			
-			$bCheckTextField = true;
-			
-			foreach ($_REQUEST['text'] as $k => $v) {
-				
-				if (
-					!in_array($k, ['firma', 'name', 'strasse', 'plzort', 'land', 'tel', 'fax', 'mail', 'web', 'strnr', 'ustidnr', 'knr', 'blz', 'bank', 'user1', 'user2', 'user3', 'user4', 'user5']) ||
-					!wpsg_checkInput($v['text'], WPSG_SANITIZE_TEXTFIELD) ||
-					!wpsg_checkInput($v['x'], WPSG_SANITIZE_FLOAT) ||
-					!wpsg_checkInput($v['y'], WPSG_SANITIZE_FLOAT) ||
-					!wpsg_checkInput($v['color'], WPSG_SANITIZE_HEXCOLOR) ||
-					!wpsg_checkInput($v['fontsize'],WPSG_SANITIZE_INT)
-				) {
-					
-					$this->shop->addBackendError(__('Bitte ÃŒberprÃŒfen Sie die Textfelder.', 'wpsg'));
-					$bCheckTextField = false;
-					
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_deliverynote_nrformat', $_REQUEST['wpsg_mod_deliverynote_nrformat']);
+			$this->shop->update_option('wpsg_mod_deliverynote_nr', $_REQUEST['wpsg_mod_deliverynote_nr']);
+			$this->shop->update_option('wpsg_mod_deliverynote_foottext_standard', $_REQUEST['wpsg_mod_deliverynote_foottext_standard']);
+			$this->shop->update_option("wpsg_mod_deliverynote_texte", $_REQUEST['text']);
+			$this->shop->update_option('wpsg_mod_deliverynote_url', $_REQUEST['wpsg_mod_deliverynote_url']);
+			$this->shop->update_option('wpsg_mod_deliverynote_url_standard', $_REQUEST['wpsg_mod_deliverynote_url_standard']);
+			$this->shop->update_option('wpsg_mod_deliverynote_adressrow', $_REQUEST['wpsg_mod_deliverynote_adressrow']);			
+			$this->shop->update_option('wpsg_mod_deliverynote_hideCountry', $_REQUEST['wpsg_mod_deliverynote_hideCountry']);
+			$this->shop->update_option('wpsg_mod_deliverynote_anr', $_REQUEST['wpsg_mod_deliverynote_anr']);
+			
+			if (file_exists($_FILES['wpsg_mod_deliverynote_bp']['tmp_name']))
+			{
+			
+				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_mod_deliverynote_bp']['name']));
+			
+				if ($ending != "jpg" && $ending != "jpeg" && $ending != "pdf")
+				{
+					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Briefpapier) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
 				}
-				
-			}
-						
-			if ($bCheckTextField) {
-				
-				$this->shop->update_option("wpsg_mod_deliverynote_texte", $_REQUEST['text']);
-				
-			}
-			
-		    $this->shop->update_option('wpsg_mod_deliverynote_nrformat', $_REQUEST['wpsg_mod_deliverynote_nrformat'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_deliverynote_nr', $_REQUEST['wpsg_mod_deliverynote_nr'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_deliverynote_foottext_standard', $_REQUEST['wpsg_mod_deliverynote_foottext_standard'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_deliverynote_url', $_REQUEST['wpsg_mod_deliverynote_url'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_deliverynote_url_standard', $_REQUEST['wpsg_mod_deliverynote_url_standard'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverynote_adressrow', $_REQUEST['wpsg_mod_deliverynote_adressrow'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			if ($this->shop->hasMod('wpsg_mod_produktattribute') == '1') {
-			
-				$this->shop->update_option('wpsg_mod_deliverynote_produktattribute', $_REQUEST['wpsg_mod_deliverynote_produktattribute'], false, false, WPSG_SANITIZE_CHECKBOX);
-				
-			}
-			
-			$this->shop->update_option('wpsg_mod_deliverynote_hideCountry', $_REQUEST['wpsg_mod_deliverynote_hideCountry'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverynote_anr', $_REQUEST['wpsg_mod_deliverynote_anr'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2']);
-
-			if (file_exists($_FILES['wpsg_mod_deliverynote_bp']['tmp_name'])) {
-
-				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_mod_deliverynote_bp']['name']));
-
-				if ($ending != "jpg" && $ending != "jpeg" && $ending != "pdf") {
-					
-					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Briefpapier) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
-					
-				} else if ($ending == "jpg" || $ending == "jpeg") {
-					
+				else if ($ending == "jpg" || $ending == "jpeg")
+				{
 					move_uploaded_file($_FILES['wpsg_mod_deliverynote_bp']['tmp_name'], $this->getFilePath('').'wpsg_deliverynote_bp.jpg');
-					
-				} else if ($ending == "pdf") {
-					
+				}
+				else if ($ending == "pdf")
+				{
 					move_uploaded_file($_FILES['wpsg_mod_deliverynote_bp']['tmp_name'], $this->getFilePath('').'wpsg_deliverynote_bp.pdf');
 				}
-
-			} else if ((array_key_exists('wpsg_mod_deliverynote_bp_del', $_REQUEST)) && ($_REQUEST['wpsg_mod_deliverynote_bp_del'] == "1")) {
-
+					
+			}
+			else if ($_REQUEST['wpsg_mod_deliverynote_bp_del'] == "1")
+			{
+			
 				@unlink($this->getFilePath('').'wpsg_deliverynote_bp.jpg');
 				@unlink($this->getFilePath('').'wpsg_deliverynote_bp.pdf');
-
+			
 				$this->shop->addBackendMessage(__('Briefpapier wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
-			}
-			
-			$wpsg_mod_deliverynote_logo_position = '';
-
-			if (array_key_exists('wpsg_mod_deliverynote_logo_position_left', $_REQUEST) && strpos($_REQUEST['wpsg_mod_deliverynote_logo_position_left'], 'selected') !== false)
-				$wpsg_mod_deliverynote_logo_position = "left";
-
-			if (array_key_exists('wpsg_mod_deliverynote_logo_position_center', $_REQUEST) && strpos($_REQUEST['wpsg_mod_deliverynote_logo_position_center'], 'selected') !== false)
-				$wpsg_mod_deliverynote_logo_position = "center";
-
-			if (array_key_exists('wpsg_mod_deliverynote_logo_position_right', $_REQUEST) && strpos($_REQUEST['wpsg_mod_deliverynote_logo_position_right'], 'selected') !== false)
-				$wpsg_mod_deliverynote_logo_position = "right";
-
-
-			if (file_exists($_FILES['wpsg_mod_deliverynote_logo']['tmp_name'])) {
-
+			
+			}
+				
+			if (file_exists($_FILES['wpsg_mod_deliverynote_logo']['tmp_name']))
+			{
+			
 				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_mod_deliverynote_logo']['name']));
-
-				if ($ending != "jpg" && $ending != "jpeg") {
-					
+			
+				if ($ending != "jpg" && $ending != "jpeg")
+				{
 					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Logo) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
-					
-				} else if ($ending == "jpg" || $ending == "jpeg") { 
-					
+				}
+				else if ($ending == "jpg" || $ending == "jpeg")
+				{
 					move_uploaded_file($_FILES['wpsg_mod_deliverynote_logo']['tmp_name'], $this->getFilePath('').'wpsg_deliverynote_logo.jpg');
 				}
-
-			} else if (isset($_REQUEST['wpsg_mod_deliverynote_logo_del']) && $_REQUEST['wpsg_mod_deliverynote_logo_del'] === '1') {
-
+					
+			}
+			else if ($_REQUEST['wpsg_mod_deliverynote_logo_del'] == "1")
+			{
+			
 				@unlink($this->getFilePath('').'wpsg_deliverynote_logo.jpg');
-
+			
 				$this->shop->addBackendMessage(__('Logo wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
-			}
- 			
-			$this->shop->update_option("wpsg_mod_deliverynote_logo_position", $wpsg_mod_deliverynote_logo_position, false, false, WPSG_SANITIZE_VALUES, ['left', 'right', 'center']);
-			$this->shop->update_option("wpsg_mod_deliverynote_logo_transparency", $_REQUEST['wpsg_mod_deliverynote_logo_transparency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
+			
+			}
+			
 		} // public function settings_save()
 
@@ -239,5 +192,5 @@
 			
 			echo wpsg_drawForm_Checkbox('wpsg_mod_deliverynote_pdf_beschreibung', __('Produktbeschreibung auf Lieferschein anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_deliverynote_pdf_beschreibung'));
-			if ($this->shop->hasMod('wpsg_mod_productvariants')) echo wpsg_drawForm_Checkbox('wpsg_mod_deliverynote_pdf_varianten', __('Varianten auf Lieferschein anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_deliverynote_pdf_varianten'));
+			if ($this->shop->hasMod('wpsg_mod_varianten')) echo wpsg_drawForm_Checkbox('wpsg_mod_deliverynote_pdf_varianten', __('Varianten auf Lieferschein anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_deliverynote_pdf_varianten'));
 			
 		} // public function admin_presentation()
@@ -246,33 +199,28 @@
 		{ 
 			
-		    $this->shop->update_option('wpsg_mod_deliverynote_pdf_beschreibung', $_REQUEST['wpsg_mod_deliverynote_pdf_beschreibung'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    if ($this->shop->hasMod('wpsg_mod_productvariants')) $this->shop->update_option('wpsg_mod_deliverynote_pdf_varianten', $_REQUEST['wpsg_mod_deliverynote_pdf_varianten'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_deliverynote_pdf_beschreibung', $_REQUEST['wpsg_mod_deliverynote_pdf_beschreibung']);
+			if ($this->shop->hasMod('wpsg_mod_varianten')) $this->shop->update_option('wpsg_mod_deliverynote_pdf_varianten', $_REQUEST['wpsg_mod_deliverynote_pdf_varianten']);
 			
 		} // public function admin_presentation_submit()
 		
-		public function order_ajax() {
-
-			\check_admin_referer('wpsg-deliverynote-order_ajax-deliverynote-'.wpsg_getStr($_REQUEST['edit_id']));
-
-			if (isset($_REQUEST['edit_id'])) $_REQUEST['edit_id'] = intval($_REQUEST['edit_id']);
-
-			if (isset($_REQUEST['wpsg_mod_deliverynote_preview'])) {
-
-                $arProductIndexes = [];
-			    $arProductIndexes = explode(',', $_REQUEST['wpsg_mod_deliverynote_productindexes']);
-
-				// Vorschau eines Lieferscheines aus der Bestellverwaltung
+		public function order_ajax()
+		{
+			
+			if (isset($_REQUEST['wpsg_mod_deliverynote_preview']))
+			{
+				 
+				// Vorschau einer Rechnung aus der Bestellverwaltung
 				$this->writeDeliverynote(
-                    $_REQUEST['edit_id'] > 0?$_REQUEST['edit_id']:null,
-					$arProductIndexes,
-					sanitize_text_field(wpsg_getStr($_REQUEST['wpsg_mod_deliverynote_fusstext'])),
-					strtotime(sanitize_text_field(wpsg_getStr( $_REQUEST['wpsg_mod_deliverynote_date']))),
+					$_REQUEST['edit_id'], 
+					explode(',', $_REQUEST['wpsg_mod_deliverynote_productindexes']), 
+					$_REQUEST['wpsg_mod_deliverynote_fusstext'], 
+					strtotime($_REQUEST['wpsg_mod_deliverynote_date']), 
 					true
 				);
-							
+			
 				die();
 			
 			}
-			else if (wpsg_getStr($_REQUEST['do']) == 'get')
+			else if ($_REQUEST['do'] == 'get')
 			{
 				
@@ -280,5 +228,5 @@
 				$dn->load($_REQUEST['dn_id']);
 				
-				if ($dn->order_id != $_REQUEST['edit_id']) throw new \wpsg\Exception(__('Es wurde versucht ein Lieferschein von einer anderen Bestellung anzuzeigen', 'wpsg'));
+				if ($dn->order_id != $_REQUEST['edit_id']) $this->shop->throwErrorCode('2000_7');
 				
 				$filename = 'deliverynote_'.$dn->id.'.pdf';
@@ -291,14 +239,19 @@
 			{
 				
-				if ($_REQUEST['edit_id'] <= 0) throw new \wpsg\Exception(__('Beim Erstellen des Lieferscheindokumentes wurde keine BestellID ÃŒbergeben', 'wpsg'));
+				if ($_REQUEST['edit_id'] <= 0) $this->shop->throwErrorCode('2000_3');
 				
 				$lnr = $this->buildLnr($_REQUEST['edit_id']);
 				
 				$arProductIndexes = explode(',', $_REQUEST['wpsg_mod_deliverynote_productindexes']);
-
+				
 				foreach ($arProductIndexes as $product_key)
 				{
 			 
-					if (!wpsg_deliverynote::checkProductKey($product_key, $_REQUEST['edit_id'])) throw new \wpsg\Exception(__('Ein Lieferschein wurde fÃŒr ein Produkt bereits erstellt', 'wpsg'));
+					if (!wpsg_deliverynote::checkProductKey($product_key, $_REQUEST['edit_id']))
+					{
+						
+						$this->shop->throwErrorCode('2000_6');
+						
+					}
 					
 				} 
@@ -308,7 +261,7 @@
 					'order_id' => wpsg_q($_REQUEST['edit_id']),
 					'cdate' => "NOW()",
-					'delivery_date' => date('Y-m-d', strtotime(wpsg_sinput("key", $_REQUEST['wpsg_mod_deliverynote_date']))),
+					'delivery_date' => date('Y-m-d', strtotime($_REQUEST['wpsg_mod_deliverynote_date'])),
 					'lnr' => wpsg_q($lnr),
-					'note' => wpsg_q(wpsg_sinput("text_field", $_REQUEST['wpsg_mod_deliverynote_fusstext'])),
+					'note' => wpsg_q($_REQUEST['wpsg_mod_deliverynote_fusstext']),
 					'cancel' => '0',
 					'product_indexes' => wpsg_q($_REQUEST['wpsg_mod_deliverynote_productindexes'])
@@ -321,6 +274,6 @@
 					$_REQUEST['edit_id'], 
 					explode(',', $_REQUEST['wpsg_mod_deliverynote_productindexes']), 
-					wpsg_sinput("text_field", $_REQUEST['wpsg_mod_deliverynote_fusstext']),
-					strtotime(wpsg_sinput("key", $_REQUEST['wpsg_mod_deliverynote_date'])),
+					$_REQUEST['wpsg_mod_deliverynote_fusstext'], 
+					strtotime($_REQUEST['wpsg_mod_deliverynote_date']),
 					false,
 					$lnr,
@@ -337,5 +290,5 @@
 						
 						$this->db->Query("DELETE FROM `".WPSG_TBL_DELIVERYNOTE."` WHERE `id` = '".wpsg_q($dn_id)."'");
-						throw new \wpsg\Exception(__('Das Lieferscheindokument wurde nicht wie vorgesehen angelegt', 'wpsg'));
+						$this->shop->throwErrorCode('2000_4');
 						
 					}
@@ -348,10 +301,11 @@
 					{
 						
-						$this->sendDeliveryMail($_REQUEST['edit_id'], $dn_id, wpsg_sinput("email", $_REQUEST['wpsg_mod_deliverynote_email']));
+						$this->sendDeliveryMail($_REQUEST['edit_id'], $dn_id, $_REQUEST['wpsg_mod_deliverynote_email']);
 						
 					}
 					
 					// Url Benachrichtigung
-					if (wpsg_isSizedString($_REQUEST['wpsg_mod_deliverynote_noticeurl'])) {
+					if ($_REQUEST['wpsg_mod_deliverynote_noticeurl'] == '1')
+					{
 							 
 						$this->shop->notifyURL(
@@ -367,10 +321,5 @@
 					
 					// Status setzen
-					if (wpsg_isSizedInt($_REQUEST['wpsg_mod_deliverynote_setstatus']))
-					{
-					
-						$this->shop->setOrderStatus($_REQUEST['edit_id'], wpsg_sinput("key", $_REQUEST['wpsg_mod_deliverynote_status']), 0);
-						
-					}
+					$this->shop->setOrderStatus($_REQUEST['edit_id'], $_REQUEST['wpsg_mod_deliverynote_status'], 0);
 					
 					wpsg_header::PDFPlugin($file);					
@@ -381,5 +330,5 @@
 					
 					$this->db->Query("DELETE FROM `".WPSG_TBL_DELIVERYNOTE."` WHERE `id` = '".wpsg_q($dn_id)."'");
-					throw new \wpsg\Exception(__('Beim Erstellen des Lieferscheindokumentes ist ein Fehler aufgetreten', 'wpsg'));
+					$this->shop->throwErrorCode('2000_2');
 					
 				}
@@ -391,6 +340,6 @@
 		public function order_view_row(&$p, $i) 
 		{ 
-
-			if (wpsg_deliverynote::checkProductKey($p['product_index'], wpsg_sinput("key", $_REQUEST['edit_id'])))
+						
+			if (wpsg_deliverynote::checkProductKey($p['product_index'], $_REQUEST['edit_id']))
 			{
 			
@@ -404,5 +353,5 @@
 		} // public function order_view_row(&$p, $i)
 		
-		public function delOrder($order_id)
+		public function delOrder(&$order_id)
 		{
 				
@@ -413,7 +362,7 @@
 			$path = $this->getFilePath($order_id); wpsg_rrmdir($path);
 				
-		} // public function delOrder($order_id)
-		
-		public function order_view($order_id, &$arSidebarArray)
+		} // public function delOrder(&$order_id)
+		
+		public function order_view_content($order_id)
 		{
 			
@@ -425,14 +374,12 @@
 			$this->shop->view['wpsg_mod_deliverynote']['arDeliverynotes'] = $this->loadDeliveryNotesFromOrder($order_id);
 			$this->shop->view['wpsg_mod_deliverynote']['arNoDeliveredProducts'] = $this->getNoDeliveredProducts($order_id);
-
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverynote/order_view_content.phtml', false)
-			);
+			 
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverynote/order_view_content.phtml');
 			
 		} // public function order_view_content($order_id)
 		
-		public function be_ajax() {
-
+		public function be_ajax()
+		{
+				
 			if ($_REQUEST['do'] == 'reset')
 			{
@@ -481,42 +428,15 @@
 				if (!is_array($foot_text)) $foot_text = @unserialize($foot_text);
 				if (!is_array($foot_text)) $foot_text = array();
-
-				if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTFIELD)) {
-				    
-				    $foot_text[$_REQUEST['field_id']][$_REQUEST['field']] = $_REQUEST['value'];
-				
-				    $this->shop->update_option('wpsg_mod_deliverynote_footer', $foot_text);
-				
-				    die($_REQUEST['value']);
-				
-				} else die($foot_text[$_REQUEST['field_id']][$_REQUEST['field']]);
-				
-			}
-			else if ($_REQUEST['do'] == 'orderAjax')
-			{
-
-				$this->order_ajax();
-
+				
+				$foot_text[$_REQUEST['field_id']][$_REQUEST['field']] = $_REQUEST['value'];
+				
+				$this->shop->update_option('wpsg_mod_deliverynote_footer', $foot_text);
+				
+				die($_REQUEST['value']);
+				
 			}
 			
 			
 		} // public function be_ajax()
-		
-		public function admin_emailconf() 
-		{ 
-			
-			echo wpsg_drawEMailConfig(
-				'deliverymail',
-				__('E-Mail mit dem Lieferschein', 'wpsg'),
-				__('Diese Mail geht an den Kunden oder an die angegebene E-Mail Adresse', 'wpsg')); 
-			
-		} // public function admin_emailconf()
-		
-		public function admin_emailconf_save() 
-		{ 
-			
-			wpsg_saveEMailConfig("deliverymail");
-			
-		} // public function admin_emailconf_save()
 		
 		/** Modulfunktionen */
@@ -575,5 +495,5 @@
 			$file = $this->getFilePath($order_id).$filename;
 
-			if (!file_exists($file) || !is_file($file)) throw new \wpsg\Exception(__('Das Lieferscheindokument wurde beim Senden der Bestellmail nicht gefunden', 'wpsg'));
+			if (!file_exists($file) || !is_file($file)) $this->shop->throwErrorCode('2000_5');
 			
 			$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
@@ -606,13 +526,15 @@
 			if ($email === false) $email = $this->shop->view['customer']['email'];
 			
-			list($subject, $mail_text) = $this->shop->sendMail($mail_text, $email, 'deliverymail', $arFiles, $this->shop->view['order']['id'], $this->shop->view['order']['k_id'], $mail_html);
+			$this->shop->sendMail($mail_text, $email, 'deliverymail', $arFiles, $this->shop->view['order']['id'], $this->shop->view['order']['k_id'], $mail_html);
 						
 			$this->shop->restoreTempLocale();
-			 
+			
+			$strSubject = wpsg_translate(__('Lieferschein ##1#', 'wpsg'), $this->shop->view['dn']->lnr);
+			
 			// In Bestelllog eintragen
 			$this->db->ImportQuery(WPSG_TBL_OL, array(
 				"o_id" => wpsg_q($order_id),
 				"cdate" => "NOW()",
-				"title" => wpsg_q($subject),
+				"title" => wpsg_q($strSubject),
 				"mailtext" => wpsg_q($mail_text)
 			));  
@@ -623,8 +545,7 @@
 		 * Generiert den Lieferschein fÃŒr eine Bestellung
 		 */
-		public function writeDeliverynote($order_id, $arProductIndexes, $fussText = '', $liefer_datum = false, $preview = false, $lnr = false, $filename = false) {
-
-			if($preview && is_null($order_id)) $order_id = 1;
-
+		public function writeDeliverynote($order_id, $arProductIndexes, $fussText = '', $liefer_datum = false, $preview = false, $lnr = false, $filename = false)
+		{
+			
 			$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
 			$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
@@ -635,18 +556,14 @@
 			if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
 			
-			$oOrder = wpsg_order::getInstance($order_id);
-			
 			// Rechnungsadresse		
-			$this->shop->view['data']['id'] = $this->shop->view['customer']['id'];
 			$this->shop->view['data']['firma'] = $this->shop->view['customer']['firma'];
 			$this->shop->view['data']['vname'] = $this->shop->view['customer']['vname'];
 			$this->shop->view['data']['name'] = $this->shop->view['customer']['name'];
 			$this->shop->view['data']['strasse'] = $this->shop->view['customer']['strasse'];
-			$this->shop->view['data']['nr'] = $this->shop->view['customer']['nr'];
+			$this->shop->view['data']['hausnr'] = $this->shop->view['customer']['hausnr'];
 			$this->shop->view['data']['plz'] = $this->shop->view['customer']['plz'];
 			$this->shop->view['data']['ort'] = $this->shop->view['customer']['ort'];
 			$this->shop->view['data']['land'] = $this->shop->view['customer']['land'];
-			$this->shop->view['data']['land'] = strtoupper($oOrder->getInvoiceCountryName());
-
+						
 			// Versandadresse ?
 			if ($this->shop->hasMod('wpsg_mod_shippingadress'))
@@ -656,15 +573,12 @@
 				{
 					
-					$adata = $this->db->fetchRow("SELECT A.* FROM `".WPSG_TBL_ADRESS."` AS A WHERE A.`id` = '".wpsg_q($this->shop->view['order']['shipping_adress_id'])."'");
-
-					$this->shop->view['data']['firma'] = $adata['firma'];
-					$this->shop->view['data']['vname'] = $adata['vname'];
-					$this->shop->view['data']['name'] = $adata['name'];
-					$this->shop->view['data']['strasse'] = $adata['strasse'];
-					$this->shop->view['data']['nr'] = $adata['nr'];
-					$this->shop->view['data']['plz'] = $adata['plz'];
-					$this->shop->view['data']['ort'] = $adata['ort'];
-					$this->shop->view['data']['land'] = $adata['land'];
-					$this->shop->view['data']['land'] = strtoupper($oOrder->getShippingCountryName());
+					$this->shop->view['data']['firma'] = $this->shop->view['order']['shipping_firma'];
+					$this->shop->view['data']['vname'] = $this->shop->view['order']['shipping_vname'];
+					$this->shop->view['data']['name'] = $this->shop->view['order']['shipping_name'];
+					$this->shop->view['data']['strasse'] = $this->shop->view['order']['shipping_strasse'];
+					$this->shop->view['data']['hausnr'] = $this->shop->view['order']['shipping_hausnr'];
+					$this->shop->view['data']['plz'] = $this->shop->view['order']['shipping_plz'];
+					$this->shop->view['data']['ort'] = $this->shop->view['order']['shipping_ort'];
+					$this->shop->view['data']['land'] = $this->shop->view['order']['shipping_land'];
 					
 				}
@@ -685,5 +599,5 @@
 			
 			$this->shop->view['data']['products'] = array();
-
+			
 			foreach ($arProductIndexes as $product_index)
 			{
@@ -700,9 +614,9 @@
 						OP.`o_id` = '".wpsg_q($order_id)."'
 				");
-				 
+				
 				if ($this->shop->isOtherLang())
 				{
 				
-					$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_data['p_id'])."' AND `lang_code` = '".wpsg_q($this->shop->getCurrentLanguageCode())."'");
+					$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_data['p_id'])."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
 				 
 					if ($produkt_trans['id'] > 0)
@@ -739,5 +653,5 @@
 			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverynote/deliverynote_pdf.phtml');
-			
+
 			$this->shop->restoreTempLocale();
 			
@@ -752,5 +666,5 @@
 		{
 
-			$oOrder = $this->shop->cache->loadOrderObject($order_id);
+			$oOrder = &$this->shop->cache->loadOrderObject($order_id);
 			$order_products = $oOrder->getProductKeys();
 			 
@@ -815,5 +729,5 @@
 			$liefer_id = $this->db->getNextAutoincrementValue(WPSG_TBL_DELIVERYNOTE);
 			
-			$strReturn = $this->shop->replaceUniversalPlatzhalter($format, $order_id, false, false, false, array(
+			$strReturn = $this->shop->replaceUniversalPlatzhalter($format, $order_id, false, fase, false, array(
 				'/%lid%/' => $liefer_id,
 				'/%lnr%/' => $this->shop->get_option('wpsg_mod_deliverynote_nr')	
@@ -843,10 +757,12 @@
 		 * Gibt die Texte fÃŒr das PDF in der korrekten Sprache und mit ÃŒbersetzen Platzhaltern zurÃŒck
 		 */
-		public function getTexte($order_id) {
+		public function getTexte($order_id)
+		{
 				
 			$arTexte = $this->shop->get_option("wpsg_mod_deliverynote_texte");
 				
-			foreach ($arTexte as $k => $v) {
-
+			foreach ($arTexte as $k => $v)
+			{
+		
 				$arTexte[$k]['text'] = $this->shop->replaceUniversalPlatzhalter(__($arTexte[$k]['text'], 'wpsg'), $order_id);
 		
@@ -888,56 +804,66 @@
 		 * Gibt den Absoluten Pfad zurÃŒck wo die Lieferscheine gespeichert sind
 		 */
-		public function getFilePath($order_id, $url = false) {
-		
-			if ($order_id == '') {
-			    
-			    // Briefpapier/Logo
-				if ($this->shop->isMultiBlog()) {
-					
-					$path = WPSG_PATH_CONTENT.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/'.$order_id.'/';
-					$url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/';
-					
-					if ($url) $strReturn = $url_content.$order_id.'/';
-					else $strReturn = $path;
-					
-				} else {
-					
-					$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_deliverynote/'.$order_id.'/';
-					
-					if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_deliverynote/'.$order_id.'/';
-					else $strReturn = $path.'/';
-					
-				}
-				
-			} else {
-			    
-			    // Lieferschein aus Bestellung
-				$deliverynote = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_DELIVERYNOTE."` AS DN WHERE `order_id` = '".wpsg_q($order_id)."' ");
-				if (isset($deliverynote)) $datum = $deliverynote['cdate'];
-				$ym = date('Y/m/', strtotime($datum));
-				
-				if ($this->shop->isMultiBlog()) {
-					
-					$path = WPSG_PATH_CONTENT.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/'.$ym.$order_id.'/';
-					$url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/'.$ym;
-					
-					if ($url) $strReturn = $url_content.$order_id.'/';
-					else $strReturn = $path;
-					
-				} else {
-					
-					$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_deliverynote/'.$ym.$order_id.'/';
-					
-					if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_deliverynote/'.$ym.$order_id.'/';
-					else $strReturn = $path.'/';
-					
-				}
-				
-			} // if ($order_id == '')
-			
-			$this->shop->protectDirectory($path, [
-                'wpsg_deliverynote_logo.jpg', 'wpsg_deliverynote_bp.jpg', 'wpsg_deliverynote_bp.pdf'
-            ] );	
-            				
+		public function getFilePath($order_id, $url = false)
+		{
+		
+			if ($this->shop->isMultiBlog())
+			{
+		
+				$path = WPSG_PATH_CONTENT.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/'.$order_id.'/';
+				$htaccess = WPSG_PATH_CONTENT.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/.htaccess';
+				$url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_deliverynote/';
+				
+				if ($url) $strReturn = $url_content.$order_id.'/';
+				else $strReturn = $path;
+					
+			}
+			else
+			{
+		
+				$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_deliverynote/'.$order_id.'/';
+				$htaccess = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_deliverynote/.htaccess';
+		
+				if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_deliverynote/'.$order_id.'/';
+				else $strReturn = $path.'/';
+					
+			}
+				
+			if (!file_exists($path))
+			{
+				mkdir($path, 0777, true);
+			}
+				
+			/*
+			 * Zur Sicherheit ÃŒberprÃŒfe ich immer ob die .htaccess existiert
+			*/
+				
+			if (!file_exists($htaccess))
+			{
+		
+				$handle = fopen($htaccess, "w+");
+		
+				$content = '
+		
+Deny from all
+		
+<Files wpsg_deliverynote_logo.jpg>
+allow from all
+</Files>
+		
+<Files wpsg_deliverynote_bp.jpg>
+allow from all
+</Files>
+		
+<Files wpsg_deliverynote_bp.pdf>
+allow from all
+</Files>
+		
+				';
+					
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+		
+			}
+				
 			return $strReturn;
 		
@@ -946,2 +872,3 @@
 	} // class wpsg_mod_deliverynote extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_deliverytime.class.php
===================================================================
--- /mods/wpsg_mod_deliverytime.class.php	(revision 8528)
+++ /mods/wpsg_mod_deliverytime.class.php	(revision 5261)
@@ -2,56 +2,45 @@
 
 	/**
-	 * Erlaubt die Definition und Anzeige von Lieferzeiten
-	 * @author Daschmi
+	 * Erlaubt die Definition und Anzeige von Lieferzeiten 
+	 * @author Daschmi 
 	 */
 	class wpsg_mod_deliverytime extends wpsg_mod_basic
 	{
-
+		
 		var $lizenz = 1;
 		var $id = 1610;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=3968';
-
+		
 		const MODE_DAYS = 1;
 		const MODE_SELECT = 2;
-
+		
 		/**
-		 * Constructor
+		 * Costructor
 		 */
 		public function __construct()
 		{
-
+				
 			parent::__construct();
-
+				
 			$this->name = __('Lieferzeit', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('Erlaubt die Definition und Anzeige von Lieferzeiten.', 'wpsg');
-
+		
 		} // public function __construct()
-
+		
 		public function install()
 		{
-
+			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
+			
 			/**
 			 * Produkt Tabelle erweitern
-			 */
+			 */ 
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
-		   		wpsg_mod_deliverytime_source INT(1) DEFAULT 0 NOT NULL COMMENT '1=vom Produkt',
-				wpsg_mod_deliverytime_deliverytime VARCHAR(255) NOT NULL,
-				wpsg_mod_deliverytime_storeproduct VARCHAR (255) NOT NULL,
-				wpsg_mod_deliverytime_storetext VARCHAR (255) NOT NULL COMMENT 'Hinweistext',
-				wpsg_mod_deliverytime_storelink VARCHAR (255) NOT NULL COMMENT 'Link zur Adresse',
-				wpsg_mod_deliverytime_delay INT(1) DEFAULT 0 NOT NULL COMMENT '1=VerzÃ¶gerung',
-				wpsg_mod_deliverytime_delaytext VARCHAR (255) NOT NULL COMMENT 'Grund',
-				wpsg_mod_deliverytime_delaytime VARCHAR (255) NOT NULL COMMENT 'Zeitangabe',
-				wpsg_mod_deliverytime_holiday INT(1) DEFAULT 0 NOT NULL COMMENT '1=Urlaub aktiv',
-				wpsg_mod_deliverytime_holidayStart VARCHAR (255) NOT NULL COMMENT 'ZeitangabeBEGINN',
-				wpsg_mod_deliverytime_holidayEnd VARCHAR (255) NOT NULL COMMENT 'ZeitangabeENDE',
-				wpsg_mod_deliverytime_holidaytext VARCHAR (255) NOT NULL COMMENT 'Urlaubstext'
+		   		wpsg_mod_deliverytime_deliverytime VARCHAR(255) NOT NULL
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-   			dbDelta($sql);
-
+   	   	 
+   			dbDelta($sql); 			
+			
 			// Vorgaben
 			$this->shop->checkDefault('wpsg_mod_deliverytime_mode', self::MODE_DAYS);
@@ -63,462 +52,121 @@
 			$this->shop->checkDefault('wpsg_mod_deliverytime_show_overview', '1');
 			$this->shop->checkDefault('wpsg_mod_deliverytime_show_mail', '1');
-
+			
 		} // public function install()
-
-		public function product_addedit_content(&$product_content, &$product_data) {
-
-			if (isset($_REQUEST['wpsg_lang'])) return;
-
-			if ($this->shop->get_option('wpsg_mod_deliverytime_mode') == self::MODE_SELECT) {
-
+		
+		public function settings_edit()
+		{
+			
+			$this->shop->view['wpsg_mod_deliverytime']['arSelection'] = $this->getPossibleSelection();
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_deliverytime_mode', $_REQUEST['wpsg_mod_deliverytime_mode']);
+			$this->shop->update_option('wpsg_mod_deliverytime_mode_select_values', $_REQUEST['wpsg_mod_deliverytime_mode_select_values']);
+			$this->shop->update_option('wpsg_mod_deliverytime_mode_select_default', $_REQUEST['wpsg_mod_deliverytime_mode_select_default']);
+			$this->shop->update_option('wpsg_mod_deliverytime_mode_days_default', $_REQUEST['wpsg_mod_deliverytime_mode_days_default']);
+			
+			$this->shop->update_option('wpsg_mod_deliverytime_show_product', $_REQUEST['wpsg_mod_deliverytime_show_product']);
+			$this->shop->update_option('wpsg_mod_deliverytime_show_basket', $_REQUEST['wpsg_mod_deliverytime_show_basket']);
+			$this->shop->update_option('wpsg_mod_deliverytime_show_overview', $_REQUEST['wpsg_mod_deliverytime_show_overview']);
+			$this->shop->update_option('wpsg_mod_deliverytime_show_mail', $_REQUEST['wpsg_mod_deliverytime_show_mail']);
+			
+			$this->shop->addTranslationString('wpsg_mod_deliverytime_mode_select_values', $_REQUEST['wpsg_mod_deliverytime_mode_select_values']);
+			$this->shop->addTranslationString('wpsg_mod_deliverytime_mode_select_default', $_REQUEST['wpsg_mod_deliverytime_mode_select_default']);
+			
+		} // public function settings_save()
+		
+		public function produkt_edit_allgemein(&$produkt_data) 
+		{ 
+						
+			if ($this->shop->get_option('wpsg_mod_deliverytime_mode') == self::MODE_SELECT)
+			{
+				
 				$this->shop->view['wpsg_mod_deliverytime']['arSelection'] = $this->getPossibleSelection();
-
-			}
-			
-			$this->shop->view['wpsg_mod_deliverytime']['arSelection'] = $this->getPossibleSelection();
-			
-			$pages = get_pages();
-			
-			$arPages = array(
-					'-1' => __('Neu anlegen und zuordnen', 'wpsg')
-			);
-			
-			foreach ($pages as $k => $v) {
-				
-				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
-				
-			}
-			
-			$this->shop->view['pages'] = $arPages;
-			
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_deliverytime'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_deliverytime']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storeproduct'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_storeproduct']);
-
-			// Neue Felder im Produkt ÃŒbergeben
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_source'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_source']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storetext'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_storetext']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storelink'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_storelink']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delay'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_delay']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delaytext'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_delaytext']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delaytime'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_delaytime']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holiday'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_holiday']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidaytext'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_holidaytext']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidayStart'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_holidayStart']);
-			$this->shop->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidayEnd'] = wpsg_getStr($product_data['wpsg_mod_deliverytime_holidayEnd']);
-
-			$product_content['general']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/produkt_addedit_allgemein.phtml', false);
-			
-		}
-
-		public function settings_edit()
-		{
-
-			$this->shop->view['wpsg_mod_deliverytime']['arSelection'] = $this->getPossibleSelection();
-
-			$pages = get_pages();
-			
-			$arPages = array(
-					'-1' => __('Neu anlegen und zuordnen', 'wpsg')
-			);
-			
-			foreach ($pages as $k => $v)
-			{
-				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
-			}
-			
-			$this->shop->view['pages'] = $arPages;
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/settings_edit.phtml');
-
-		} // public function settings_edit()
-
-		public function settings_save() {
-
-		    $this->shop->update_option('wpsg_mod_deliverytime_mode', $_REQUEST['wpsg_mod_deliverytime_mode'], false, false, WPSG_SANITIZE_INT);
-		    $this->shop->update_option('wpsg_mod_deliverytime_mode_select_values', $_REQUEST['wpsg_mod_deliverytime_mode_select_values'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_deliverytime_mode_select_default', $_REQUEST['wpsg_mod_deliverytime_mode_select_default'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_deliverytime_mode_days_default', $_REQUEST['wpsg_mod_deliverytime_mode_days_default'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-			$this->shop->update_option('wpsg_mod_deliverytime_store', $_REQUEST['wpsg_mod_deliverytime_store'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverytime_storetext', $_REQUEST['wpsg_mod_deliverytime_storetext'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_page_mod_deliverytime_storelink', $_REQUEST['wpsg_page_mod_deliverytime_storelink'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-			$this->shop->update_option('wpsg_mod_deliverytime_show_product', $_REQUEST['wpsg_mod_deliverytime_show_product'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverytime_show_basket', $_REQUEST['wpsg_mod_deliverytime_show_basket'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverytime_show_overview', $_REQUEST['wpsg_mod_deliverytime_show_overview'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverytime_show_mail', $_REQUEST['wpsg_mod_deliverytime_show_mail'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverytime_source', wpsg_xss($_REQUEST['wpsg_mod_deliverytime_source']));
-			
-			$this->shop->update_option('wpsg_mod_deliverytime_delay', $_REQUEST['wpsg_mod_deliverytime_delay'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_deliverytime_delayText', $_REQUEST['wpsg_mod_deliverytime_delayText'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_deliverytime_delayTime', $_REQUEST['wpsg_mod_deliverytime_delayTime'], false, false, WPSG_SANITIZE_FLOAT);
-			
-			$this->shop->update_option('wpsg_mod_deliverytime_holiday', $_REQUEST['wpsg_mod_deliverytime_holiday'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_deliverytime_holidayStart', wpsg_xss($_REQUEST['wpsg_mod_deliverytime_holidayStart']), ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_deliverytime_holidayEnd', wpsg_xss($_REQUEST['wpsg_mod_deliverytime_holidayEnd']), ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_deliverytime_holidaytext', $_REQUEST['wpsg_mod_deliverytime_holidaytext'], false, false, WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_deliverytime_productindex', $_REQUEST['wpsg_mod_deliverytime_productindex'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-			
-			$this->shop->addTranslationString('wpsg_mod_deliverytime_mode_select_values', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_deliverytime_mode_select_values']));
-			$this->shop->addTranslationString('wpsg_mod_deliverytime_mode_select_default', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_deliverytime_mode_select_default']));
-			
-		} // public function settings_save()
-
-		public function produkt_save_before(&$produkt_data) {
- 
-		    $produkt_data['wpsg_mod_deliverytime_deliverytime'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_FLOAT, $_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_deliverytime']));
-			$produkt_data['wpsg_mod_deliverytime_storeproduct'] = wpsg_q(wpsg_sinput("key", wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storeproduct'])));
-
-			// Neue Felder im Produkt
-			$produkt_data['wpsg_mod_deliverytime_storetext'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_FLOAT, wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storetext'])));
-			$produkt_data['wpsg_mod_deliverytime_storelink'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_INT, wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storelink'])));
-			$produkt_data['wpsg_mod_deliverytime_source'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_source'])));
-
-		    //$produkt_data['wpsg_mod_deliverytime_delay'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_VALUES, ['0, 1, 2'], wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delay'])));
-            if (isset($_REQUEST['wpsg_mod_deliverytime_delay'])) wpsg_checkRequest(
-                'wpsg_mod_deliverytime_delay',
-                [WPSG_SANITIZE_VALUES, ['0', '1', '2']],
-                __('Hinweistext bei VerzÃ¶gerungen anzeigen', 'wpsg'),
-                $produkt_data,
-                $_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delay']
-            );
-
-			$produkt_data['wpsg_mod_deliverytime_delaytext'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_FLOAT, wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delaytext'])));
-			$produkt_data['wpsg_mod_deliverytime_delaytime'] = wpsg_tf(wpsg_q(wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delaytime']), WPSG_SANITIZE_FLOAT)));
-			
-			$produkt_data['wpsg_mod_deliverytime_holiday'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_VALUES, ['0, 1, 2'], wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holiday'])));
-
-			if (isset($_REQUEST['wpsg_mod_deliverytime_holiday'])) wpsg_checkRequest(
-                'wpsg_mod_deliverytime_holiday',
-                [WPSG_SANITIZE_VALUES, ['0', '1']],
-                __('Urlaubszeit', 'wpsg'),
-                $produkt_data,
-                $_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holiday']
-            );
-
-			$produkt_data['wpsg_mod_deliverytime_holidaytext'] = wpsg_q(wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidaytext'])));
-			$produkt_data['wpsg_mod_deliverytime_holidayStart'] = wpsg_q(wpsg_xss(wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidayStart'])));
-			$produkt_data['wpsg_mod_deliverytime_holidayEnd'] = wpsg_q(wpsg_xss(wpsg_getStr($_REQUEST['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidayEnd'])));
-
+				
+			}
+			
+			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $produkt_data['wpsg_mod_deliverytime_deliverytime'];
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/produkt_edit_allgemein.phtml');
+			
+		} // public function produkt_edit_allgemein(&$produkt_data)
+		
+		public function produkt_save_before(&$produkt_data)
+		{
+				
+			$produkt_data['wpsg_mod_deliverytime_deliverytime'] = wpsg_q($_REQUEST['wpsg_mod_deliverytime']['deliverytime']);
+				
 		} // public function produkt_save_before(&$produkt_data)
-
-		public function product_bottom(&$product_id, $template_index) {
-			
-			$oProduct = wpsg_product::getInstance($product_id);
-			
-			$set_available = $oProduct->getMeta('wpsg_mod_deliverytime_set_available', false, '0');
-			
-			if ($set_available === '1') {
-			
-				$this->shop->view['wpsg_mod_deliverytime']['set_available'] = $set_available;
-				$this->shop->view['wpsg_mod_deliverytime']['available_date'] = $oProduct->getMeta('wpsg_mod_deliverytime_available_date', false, date('Y-m-d'));
-
-				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/product_bottom.phtml');
-				
-			}
-				
-		}
-		
-		public function produkt_edit(&$product_data) {
-			
-			if (isset($product_data['id'])) {
-				
-				$oProduct = wpsg_product::getInstance(intval($product_data['id']));
-				
-				$this->shop->view['wpsg_mod_deliverytime']['set_available'] = $oProduct->getMeta('wpsg_mod_deliverytime_set_available', false, '0');
-				$this->shop->view['wpsg_mod_deliverytime']['available_date'] = $oProduct->getMeta('wpsg_mod_deliverytime_available_date', false, date('Y-m-d'));
-				
-			}
-			
-		}
-		
-		public function produkt_save(&$product_id) {
-			
-			$oProduct = wpsg_product::getInstance($product_id);
-			
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_deliverytime']['set_available'], WPSG_SANITIZE_CHECKBOX)) {
-				
-				$oProduct->setMeta('wpsg_mod_deliverytime_set_available', $_REQUEST['wpsg_mod_deliverytime']['set_available']);	
-				
-			}
-			 
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_deliverytime']['available_date'], WPSG_SANITIZE_DATE_EN)) {
-				
-				$oProduct->setMeta('wpsg_mod_deliverytime_available_date', $_REQUEST['wpsg_mod_deliverytime']['available_date']);	
-				
-			}
-			
-			
-		}
-		
-		public function mail_row($index, $produkt)
-		{
-
+		
+		public function mail_row($index, $produkt) 
+		{ 
+			
 			if ($this->shop->get_option('wpsg_mod_deliverytime_show_mail') != '1') return;
-
-			$this->shop->view['wpsg_mod_deliverytime']['i'] = $index;
-			$this->shop->view['wpsg_mod_deliverytime']['p'] = $produkt;
-			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $this->displayDeliveryTime($this->shop->getProduktID($produkt['id']));
-			$this->shop->view['wpsg_mod_deliverytime']['delaytime'] = $this->displayDelayTime($this->shop->getProduktID($produkt['id']));
+			
+			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $this->getProductDeliveryTime($this->shop->getProduktID($produkt['id']));
 			
 			if ($this->shop->htmlMail === true)
 			{
-
+					
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/mail_row_html.phtml');
-
+					
 			}
 			else
 			{
-
+			
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/mail_row.phtml');
-
-			}
-
+					
+			}
+			
 		} // public function mail_row($index, $produkt)
-
-		public function basket_row(&$p, $i)
-		{
-
+		
+		public function basket_row(&$p, $i) 
+		{ 
+			
 			if ($this->shop->get_option('wpsg_mod_deliverytime_show_basket') != '1') return;
-
-			$this->shop->view['wpsg_mod_deliverytime']['i'] = $i;
-			$this->shop->view['wpsg_mod_deliverytime']['p'] = $p;
-			
-			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $this->displayDeliveryTime($this->shop->getProduktID($p['id']));
-			$this->shop->view['wpsg_mod_deliverytime']['delaytime'] = $this->displayDelayTime($this->shop->getProduktID($p['id']));
+			
+			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $this->getProductDeliveryTime($this->shop->getProduktID($p['id']));
 			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/basket_row.phtml');
-
+			
 		} // public function basket_row(&$p, $i)
-
-		public function overview_row(&$p, $i)
-		{
+		
+		public function overview_row(&$p, $i) 
+		{ 
 
 			if ($this->shop->get_option('wpsg_mod_deliverytime_show_overview') != '1') return;
-
-			$this->shop->view['wpsg_mod_deliverytime']['i'] = $i;
-			$this->shop->view['wpsg_mod_deliverytime']['p'] = $p;
-			
-			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $this->displayDeliveryTime($this->shop->getProduktID($p['id']));
-			$this->shop->view['wpsg_mod_deliverytime']['delaytime'] = $this->displayDelayTime($this->shop->getProduktID($p['id']));
+			
+			$this->shop->view['wpsg_mod_deliverytime']['deliverytime'] = $this->getProductDeliveryTime($this->shop->getProduktID($p['id']));
 			
 			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_deliverytime/overview_row.phtml');
-
+			
 		} // public function overview_row(&$p, $i)
-
-		public function wpsg_mod_export_loadFields(&$arFields)
-		{
-
+		
+		public function wpsg_mod_export_loadFields(&$arFields) 
+		{ 
+			
 			$arFields[20]['fields']['product_deliverytime'] = __('Lieferzeit', 'wpsg');
-
+			
 		} // public function wpsg_mod_export_loadFields(&$arFields)
-
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-
-			if ($field_value == 'product_deliverytime') {
-
+		
+		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) 
+		{ 
+			
+			if ($field_value == 'product_deliverytime')
+			{
+				
 				$return = $this->getProductDeliveryTime($p_id);
-
-			}
-
-		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator)
-
+				
+			}
+			
+		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator)
+		
 		/* Modul Functions */
-
-		/**
-		 * Liefert einen Text, der bei LieferverzÃ¶gerungen angezeigt wird
-		 * @param $product_key
-		 */
-		public function displayDelayTime($product_key)
-		{
-
-			// 'Hinweistext bei VerzÃ¶gerungen anzeigen', 'wpsg'),
-			// array(0 => 'Standardeinstellung', 1 => 'Anzeigen', 2 => 'Nicht anzeigen')
-			
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-			
-			if ($oProduct->wpsg_mod_deliverytime_delay == 1) return wpsg_translate(__('#1# #2#', 'wpsg'), $oProduct->wpsg_mod_deliverytime_delaytext, $oProduct->wpsg_mod_deliverytime_delaytime);
-			else if ($oProduct->wpsg_mod_deliverytime_delay == 2) return false;
-			
-			if ($this->shop->get_option('wpsg_mod_deliverytime_delay') != '1') return false;
-
-			return wpsg_translate(__('#1##2#', 'wpsg'), $this->shop->get_option('wpsg_mod_deliverytime_delayText'), $this->shop->get_option('wpsg_mod_deliverytime_delayTime'));
-
-		} // public function displayDelayTime($product_key)
-
-		public function canOrder($product_key)
-		{
-			
-			/* Offlineprodukt */
-			if ($this->isStoreProduct($product_key)) return -2;
-			
-			/* Urlaubsmodul*/
-			if ($this->shop->get_option('wpsg_mod_deliverytime_holiday') == '1') {
-			
-				$time = time();
-				$holidaystart = strtotime($this->shop->get_option('wpsg_mod_deliverytime_holidayStart'));
-				$holidayend = strtotime($this->shop->get_option('wpsg_mod_deliverytime_holidayEnd'));
-				
-				if ($time >= $holidaystart && $time <= $holidayend) return -2;
-				
-			}
-			
-		}
-		
-		/**
-		 *	Liefert den Text, der bei aktivierter Urlaubsoption angezeigt wird 
-		 * 	@param $product_key
-		 */
-		public function displayHolidaytext($product_key)
-		{
-				
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-				
-			if ($oProduct->wpsg_mod_deliverytime_holiday == 1) return __($oProduct->wpsg_mod_deliverytime_holidaytext, 'wpsg');
-			else return __($this->shop->get_option('wpsg_mod_deliverytime_holidaytext'), 'wpsg');
-				
-		} // public function displayHolidaytext($product_key)
-		
-		/**
-		 * Liefert einen Text, der bei Offline-Produkten angezeigt wird
-		 * @param $product_key
-		 */
-		public function displayStoreText($product_key)
-		{
-			
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-			
-			if ($oProduct->wpsg_mod_deliverytime_storeproduct == 1) return __($oProduct->wpsg_mod_deliverytime_storetext, 'wpsg');
-			else return __($this->shop->get_option('wpsg_mod_deliverytime_storetext'), 'wpsg');
-			
-		} // public function displayStoreText($product_key)
-		
-		/**
-		 * Liefert einen Link, der bei Offline-Produkten angezeigt wird
-		 * @param $product_key
-		 */
-		public function displayStoreLink($product_key)
-		{
-			
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-			
-			if ($oProduct->wpsg_mod_deliverytime_storeproduct == 1) return __($oProduct->wpsg_mod_deliverytime_storelink, 'wpsg');
-			else return __($this->shop->get_option('wpsg_page_mod_deliverytime_storelink'), 'wpsg');
-			
-		} // public function displayStoreLink($product_key)
-		
-		/**
-		 * Zeigt die Lieferzeit formatiert an.
-		 * Bsp: Lieferzeit: 4 Tag(e)
-		 */
-		public function displayDeliveryTime($product_key, $valueOnly = false)
-		{
-
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-
-			$strValue = "";
-
-			if ($this->shop->get_option('wpsg_mod_deliverytime_mode') == wpsg_mod_deliverytime::MODE_DAYS)
-			{
-
-				//$temp = $oProduct->wpsg_mod_deliverytime_deliverytime;
-				
-				$temp = $oProduct->wpsg_mod_deliverytime_source;
-				if (wpsg_isSizedInt($temp))
-				{
-
-					/* Lieferzeit = 1 vom Produkt */
-					$strValue = wpsg_translate(__('#1# Tag(e)', 'wpsg'), $oProduct->wpsg_mod_deliverytime_deliverytime);
-
-				}
-				else if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_deliverytime_mode_days_default')))
-				{
-
-					/* Lieferzeit = 0 Global */
-					$strValue = wpsg_translate(__('#1# Tag(e)', 'wpsg'), $this->shop->get_option('wpsg_mod_deliverytime_mode_days_default'));
-
-				}
-				else
-				{
-
-					$strValue = __('Das Produkt ist sofort lieferbar (Lieferzeit: 0 Tage)', 'wpsg');
-
-				}
-
-			}
-			else
-			{
-
-				$arPossibleDelivery = wpsg_trim(explode(',', $this->shop->get_option('wpsg_mod_deliverytime_mode_select_values')));
-				$strDeliveryTime = @$oProduct->wpsg_mod_deliverytime_deliverytime;
-
-				//if (wpsg_isSizedString($strDeliveryTime) && in_array($strDeliveryTime, $arPossibleDelivery))
-				//if (wpsg_isSizedString($strDeliveryTime) && array_key_exists($strDeliveryTime, $arPossibleDelivery))
-				$temp = $oProduct->wpsg_mod_deliverytime_source;
-				if (wpsg_isSizedInt($temp))
-				{
-
-					$strValue = __($strDeliveryTime, 'wpsg');
-					$strValue = __(@$arPossibleDelivery[$strDeliveryTime], 'wpsg');
-					
-				}
-				else
-				{
-
-					if (array_key_exists($this->shop->get_option('wpsg_mod_deliverytime_mode_select_default'), $arPossibleDelivery))
-					{
-
-						$strValue = __(@$arPossibleDelivery[$this->shop->get_option('wpsg_mod_deliverytime_mode_select_default')], 'wpsg');
-
-					}
-					else
-					{
-
-						$strValue = __('UngÃŒltige Lieferzeitkonfiguration', 'wpsg');
-
-					}
-
-				}
-
-			}
-
-			if ($valueOnly === true) return $strValue;
-			else return wpsg_translate(__('#1#', 'wpsg'), $strValue);
-
-		} // public function displayDeliveryTime($product_key)
-
-		/**
-		 * Gibt true zurÃŒck, wenn das Produkt ein Offline Produkt ist, und die Option "Offline Produkte verwenden" aktiviert ist
-		 * @param string $product_key
-		 */
-		public function isStoreProduct($product_key)
-		{
-
-			// Die Produkteinstellung Als Offlineprodukt anzeigen
-			// 'Als Offlineprodukt anzeigen', 'wpsg'), 
-			// array(0 => 'Standardeinstellung', 1 => 'Offlineprodukt', 2 => 'Onlineprodukt')
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-			
-			if ($oProduct->wpsg_mod_deliverytime_storeproduct == 2) return false;
-			else if ($oProduct->wpsg_mod_deliverytime_storeproduct == 1) return true;
-			else if ($this->shop->get_option('wpsg_mod_deliverytime_store') != '1') return false;
-			else return true;
-			
-		} // public function isStoreProduct($product_key)
-		
-	
-		public function holiday ($product_key)
-		{
-		
-			// Die Produkteinstellung als Urlaub anzeigen
-			// array(0 => 'Standardeinstellung', 1 => 'Offlineprodukt', 2 => 'Onlineprodukt')
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($product_key));
-				
-			if ($oProduct->wpsg_mod_deliverytime_holiday == 2) return false;
-			else if ($oProduct->wpsg_mod_deliverytime_holiday == 1) return true;
-			else if ($this->shop->get_option('wpsg_mod_deliverytime_holiday') != '1') return false;
-			else return true;
-				
-		}
 		
 		/**
@@ -528,61 +176,57 @@
 		public function getProductDeliveryTime($product_id)
 		{
-
+			
 			$product_data = $this->shop->cache->loadProduct($product_id);
-
+			
 			if ($this->shop->get_option('wpsg_mod_deliverytime_mode') == self::MODE_DAYS)
 			{
-
-				//if (!wpsg_isSizedString($product_data['wpsg_mod_deliverytime_deliverytime']))
-					
-				if (!wpsg_isSizedInt($product_data['wpsg_mod_deliverytime_source']))
-				{
-
-					return $this->shop->get_option('wpsg_mod_deliverytime_mode_days_default').__(' Tag(e)', 'wpsg');
-
+			
+				if (!wpsg_isSizedString($product_data['wpsg_mod_deliverytime_deliverytime']))
+				{
+				
+					return $this->shop->get_option('wpsg_mod_deliverytime_mode_days_default').__(' Tage', 'wpsg');	
+				
 				}
 				else
 				{
-
-					return $product_data['wpsg_mod_deliverytime_deliverytime'].__(' Tag(e)', 'wpsg');
-
-				}
-
+					
+					return $product_data['wpsg_mod_deliverytime_deliverytime'].__(' Tage', 'wpsg');
+					
+				}
+				
 			}
 			else if ($this->shop->get_option('wpsg_mod_deliverytime_mode') == self::MODE_SELECT)
 			{
-
+			
 				$arPossibleDeliveryTimes = $this->getPossibleSelection();
-
-				//if (!in_array($product_data['wpsg_mod_deliverytime_deliverytime'], $arPossibleDeliveryTimes))
-				//if (!array_key_exists($product_data['wpsg_mod_deliverytime_deliverytime'], $arPossibleDeliveryTimes))
-				if (!wpsg_isSizedInt($product_data['wpsg_mod_deliverytime_source']))
-				{
-
-					return __($arPossibleDeliveryTimes[$this->shop->get_option('wpsg_mod_deliverytime_mode_select_default')], 'wpsg');
-
+				
+				if (!in_array($product_data['wpsg_mod_deliverytime_deliverytime'], $arPossibleDeliveryTimes))
+				{
+					
+					return __($this->shop->get_option('wpsg_mod_deliverytime_mode_select_default'), 'wpsg');
+										
 				}
 				else
 				{
-
-					return __($arPossibleDeliveryTimes[$product_data['wpsg_mod_deliverytime_deliverytime']], 'wpsg');
-					
-				}
-
-			}
-
+					
+					return __($product_data['wpsg_mod_deliverytime_deliverytime'], 'wpsg');
+					
+				}
+				
+			}
+			
 		} // public function getProductDeliveryTime($product_id)
-
+		
 		/**
-		 * Gibt die mÃ¶glichen Lieferzeiten als Array zurÃŒck, ist nur Sinnvoll wenn
+		 * Gibt die mÃ¶glichen Lieferzeiten als Array zurÃŒck, ist nur Sinnvoll wenn 
 		 * MODE_SELECT aktiv ist.
 		 */
 		public function getPossibleSelection()
 		{
-
+			
 			return wpsg_trim(explode(',', $this->shop->get_option('wpsg_mod_deliverytime_mode_select_values')));
-
+			
 		} // public function getPossibleSelection()
-
+						
 	} // class wpsg_mod_deliverytime extends wpsg_mod_basic
 
Index: /mods/wpsg_mod_discount.class.php
===================================================================
--- /mods/wpsg_mod_discount.class.php	(revision 8528)
+++ /mods/wpsg_mod_discount.class.php	(revision 5261)
@@ -4,11 +4,11 @@
 	 * Rabatt Modul
 	 */
-	class wpsg_mod_discount extends wpsg_mod_basic
+	class wpsg_mod_discount extends wpsg_mod_basic 
 	{
-
-		var $id = 700;
+		
+		var $id = 700;		
 		var $lizenz = 1;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=1550';
-
+		
 		/**
 		 * Costructor
@@ -16,70 +16,66 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
-
+			
 			$this->name = __('Rabatt', 'wpsg');
 			$this->group = __('Bestellung', 'wpsg');
 			$this->desc = __('Ist dieses Modul aktiv, so lassen sich Rabatte abhÃ€ngig vom Bestellwert vergeben. Der Bestellwert ist der Artikelpreis + Kosten fÃŒr Versandkosten etc.', 'wpsg');
-
-		} // public function __construct()
+						
+		} // public function __construct()		
 
 		public function install()
 		{
-
+			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
+			
 			/** Kundengruppentabelle erweitern */
 			$sql = "CREATE TABLE ".WPSG_TBL_KG." (
 				id mediumint(9) NOT NULL AUTO_INCREMENT,
    				discount VARCHAR(255) NOT NULL,
-				PRIMARY KEY  (id)
+				PRIMARY KEY  (id)		
    			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+				
 			dbDelta($sql);
-
+			
 		} // public function install()
-
-		public function settings_edit()
-		{
-
-			$this->shop->view['data'] = $this->getOptionData();
-
+		
+		public function settings_edit() 
+		{
+			
+			$this->shop->view['data'] = $this->getOptionData();			
+			
 			$hierarchie = explode(',', $this->shop->get_option('wpsg_mod_discount_hierarchie'));
 			if (!wpsg_isSizedArray($hierarchie)) $hierarchie = array();
-
+			
 			if (!in_array('general', $hierarchie)) $hierarchie[] = 'general';
 			if (!in_array('product', $hierarchie)) $hierarchie[] = 'product';
 			if (!in_array('productgroup', $hierarchie)) $hierarchie[] = 'productgroup';
 			if (!in_array('customer', $hierarchie)) $hierarchie[] = 'customer';
-
+			
 			$this->shop->view['wpsg_mod_discount']['hierarchie'] = $this->getHierarchie();
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
-		public function settings_save() {
-
-		    $this->shop->update_option('wpsg_mod_discount_productdiscount', $_REQUEST['wpsg_mod_discount_productdiscount'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_discount_universal', $_REQUEST['wpsg_mod_discount_universal'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option("wpsg_mod_discount_universal_from", wpsg_xss($_REQUEST['wpsg_mod_discount_universal_from']));
-			$this->shop->update_option("wpsg_mod_discount_universal_to", wpsg_xss($_REQUEST['wpsg_mod_discount_universal_to']));
-			$this->shop->update_option("wpsg_mod_discount_universal_value", wpsg_ff($_REQUEST['wpsg_mod_discount_universal_value']), false, false, WPSG_SANITIZE_FLOAT);
-			
-			if ($this->shop->hasMod('wpsg_mod_productgroups')) $this->shop->update_option('wpsg_mod_discount_productgroupdiscount', $_REQUEST['wpsg_mod_discount_productgroupdiscount'], false, false, WPSG_SANITIZE_CHECKBOX);
-			if ($this->shop->hasMod('wpsg_mod_customergroup')) $this->shop->update_option('wpsg_mod_discount_customergroup', $_REQUEST['wpsg_mod_discount_customergroup'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_discount_show', $_REQUEST['wpsg_mod_discount_show'], false, false, WPSG_SANITIZE_CHECKBOX);
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_discount_productdiscount', $_REQUEST['wpsg_mod_discount_productdiscount']);
+			$this->shop->update_option('wpsg_mod_discount_universal', $_REQUEST['wpsg_mod_discount_universal']);
+			$this->shop->update_option("wpsg_mod_discount_universal_from", $_REQUEST['wpsg_mod_discount_universal_from']);
+			$this->shop->update_option("wpsg_mod_discount_universal_to", $_REQUEST['wpsg_mod_discount_universal_to']);
+			$this->shop->update_option("wpsg_mod_discount_universal_value", wpsg_ff(wpsg_tf($_REQUEST['wpsg_mod_discount_universal_value'], true)));				
+			if ($this->shop->hasMod('wpsg_mod_productgroups')) $this->shop->update_option('wpsg_mod_discount_productgroupdiscount', $_REQUEST['wpsg_mod_discount_productgroupdiscount']);
+			if ($this->shop->hasMod('wpsg_mod_customergroup')) $this->shop->update_option('wpsg_mod_discount_customergroup', $_REQUEST['wpsg_mod_discount_customergroup']);
+			$this->shop->update_option('wpsg_mod_discount_show', $_REQUEST['wpsg_mod_discount_show']);
 			$this->shop->update_option('wpsg_mod_discount_hierarchie', implode(',', $_REQUEST['wpsg_mod_discount_hierarchie']));
-			
+			 
 			$data_rabatt = $this->getOptionData();
-
+		 
 			// Den Nullwert speichern
 			$data_rabatt[0]['rabatt'] = wpsg_tf($_REQUEST['value'][0]['rabatt'], true);
-			$data_rabatt[0]['value'] = 0;
-
-			$insert = 0;
-
+ 
 			if (wpsg_tf($_REQUEST['neu']['value']) > 0 && wpsg_tf($_REQUEST['neu']['rabatt']) > 0)
 			{
@@ -89,5 +85,5 @@
 					"rabatt" => wpsg_tf($_REQUEST['neu']['rabatt'], true)
 				);
-
+				 
 				$find = false;
 				foreach ($data_rabatt as $k => $v)
@@ -95,81 +91,64 @@
 					if ($v['value'] == $data['value']) $find = $k;
 				}
-
+				
 				if ($find !== false)
 					$data_rabatt[$find] = $data;
 				else
 					$data_rabatt[] = $data;
-
+				
 				$insert = wpsg_tf($_REQUEST['neu']['value']);
-
+					
 				// Felder fÃŒr Formular lÃ¶schen
 				$_REQUEST['neu']['value'] = "";
 				$_REQUEST['neu']['rabatt'] = "";
-
+																	
 			}
 			else if (wpsg_tf($_REQUEST['neu']['value']) > 0 || wpsg_tf($_REQUEST['neu']['rabatt']) > 0)
 			{
-
+				
 				$this->shop->addBackendError(__("Bitte einen gÃŒltigen Bestellwert und einen Rabatt eingeben!", "wpsg"));
-
-			}
-
+				
+			}
+ 
 			foreach ($_REQUEST['value'] as $k => $v)
 			{
-
+				
 				$find = false;
 				foreach ($data_rabatt as $k2 => $v2)
-				{
-					$vval = wpsg_getInt($v['value']);
-					$v2val = wpsg_getInt($v2['value']);
-
-					if (	wpsg_tf($v2val) == wpsg_tf($vval) &&
-							wpsg_tf($v2val) != $insert	)
-					{
-
+				{ 									
+					if (	wpsg_tf($v2['value']) == wpsg_tf($v['value']) &&
+							wpsg_tf($v2['value']) != $insert	) 
+					{
+						 
 						$find = $k2;
-
-					}
-				}
-
+						
+					}
+				}
+			 			
 				if ($find !== false)
-				{
-					$vdel = wpsg_getInt($v['del']);
-					if ($vdel == 1) unset($data_rabatt[$find]);
+				{  
+					if ($v['del'] == 1) unset($data_rabatt[$find]);
 					else $data_rabatt[$find]['rabatt'] = wpsg_tf($v['rabatt'], true);
 				}
-
-			}
-
+				
+			}
+ 
 			$this->shop->update_option("wpsg_mod_discount_data", serialize($data_rabatt));
-			$this->shop->update_option('wpsg_mod_discount_stopRabatt', $_REQUEST['wpsg_mod_discount_stopRabatt'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_discount_showBasket', $_REQUEST['wpsg_mod_discount_showBasket'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_discount_voucher', $_REQUEST['wpsg_mod_discount_voucher'], false, false, WPSG_SANITIZE_CHECKBOX);		
-			$this->shop->update_option('wpsg_mod_discount_productindex', $_REQUEST['wpsg_mod_discount_productindex'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
+			 
+			$this->shop->update_option('wpsg_mod_discount_stopRabatt', $_REQUEST['wpsg_mod_discount_stopRabatt']);
+			
+			$this->shop->update_option('wpsg_mod_discount_showBasket', $_REQUEST['wpsg_mod_discount_showBasket']); 
 			
 		} // public function settings_save()
-
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-
-			if (wpsg_isSizedInt($product_data['id']))
-			{
-
-				if (isset($_REQUEST['wpsg_lang'])) return;
-
-				$this->shop->view['wpsg_mod_discount']['data'] = explode("_", $product_data['rabatt']);
-
-			}
-
-			/*$product_content['wpsg_mod_discount'] = array(
-					'title' => __('Rabatte', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/produkt_addedit_sidebar.phtml', false)
-			);*/
-
-			if (isset($product_content['price']['content']))
-				$product_content['price']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/produkt_addedit_sidebar.phtml', false);
-
-
-		} // public function produkt_edit_sidebar(&$product_content, &$produkt_data)
+				
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{
+			 
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			$this->shop->view['wpsg_mod_discount']['data'] = explode("_", $produkt_data['rabatt']);
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/produkt_edit_sidebar.phtml');
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
 
 		/**
@@ -180,435 +159,268 @@
 		public function getDiscountPrice($product_id, $price)
 		{
-
-			$arDiscountTypes = $this->getHierarchie();
-
+			
+			$arDiscountTypes = $this->getHierarchie(); 
+				
 			if (wpsg_isSizedArray($arDiscountTypes))
 			{
-
+			
 				foreach ($arDiscountTypes as $discount_type)
 				{
-
+						
 					$discount_value = false;
-
+						
 					if ($discount_type == 'product' && $this->hasProductDiscount($product_id))
 					{
-
+			
 						$discount_value = $this->getProductDiscount($product_id);
-
+							
 					}
 					else if ($discount_type == 'productgroup' && $this->hasProductgroupDiscount($product_id))
 					{
-
+			
 						$discount_value = $this->getProductgroupDiscount($product_id);
-
+							
 					}
 					else if ($discount_type == 'general' && $this->hasGeneralProductdiscount())
 					{
-
+			
 						$discount_value = $this->getGeneralProductdiscount();
-
+							
 					}
 					else if ($discount_type == 'customer' && $this->hasCustomergroupRabatt())
 					{
-
+			
 						$discount_value = $this->getCustomergroupRabatt();
-
-					}
-
+			
+					}
+			
 					if (wpsg_tf($discount_value) > 0)
 					{
-
+			
 						//$this->applyDiscountToProductData($discount_value, $product_data, $discount_type);
 						if (strpos($discount_value, "%") !== false)
 						{
-
+							
 							$price -= ($price * wpsg_tf($discount_value) / 100);
-
+							
 						}
 						else
 						{
-
+							
 							$price -= wpsg_tf($discount_value);
-
+							
 						}
-
+							
 						if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_discount_stopRabatt'))) break;
-
-					}
-
-				}
-
-			}
-
+			
+					}
+			
+				}
+			
+			}
+			
 			return $price;
-
+			
 		} // public function getDiscountPrice($product_id, $price)
-
+		
 		public function loadProduktArray(&$product_data)
 		{
-			 
-			if (wpsg_is_admin()) return;
+						
 			$arDiscountTypes = $this->getHierarchie();
 			$produkt_id = $this->shop->getProduktId($product_data['id']);
-
+			
 			if (wpsg_isSizedArray($arDiscountTypes))
 			{
-
+				
 				foreach ($arDiscountTypes as $discount_type)
 				{
-
-					$discount_value = false;
-
+					
+					$discount_value = false; 
+					
 					if ($discount_type == 'product' && $this->hasProductDiscount($produkt_id))
 					{
-
+						
 						$discount_value = $this->getProductDiscount($produkt_id);
-
-					}
-					else if ($discount_type == 'productgroup' && $this->hasProductgroupDiscount($produkt_id))
-					{
-
+						 
+					}
+					else if ($discount_type == 'productgroup' && $this->hasProductgroupDiscount($produkt_id)) 
+					{
+						
 						$discount_value = $this->getProductgroupDiscount($produkt_id);
-
-					}
-					else if ($discount_type == 'general' && $this->hasGeneralProductdiscount())
-					{
-
+						 
+					}
+					else if ($discount_type == 'general' && $this->hasGeneralProductdiscount()) 
+					{
+						
 						$discount_value = $this->getGeneralProductdiscount();
-
-					}
-					else if ($discount_type == 'customer' && $this->hasCustomergroupRabatt())
-					{
-
+						 
+					}
+					else if ($discount_type == 'customer' && $this->hasCustomergroupRabatt()) 
+					{
+						
 						$discount_value = $this->getCustomergroupRabatt();
-
-					}
-					
+						
+					}
+					 
 					if (wpsg_tf($discount_value) > 0)
 					{
-
+						  
 						$this->applyDiscountToProductData($discount_value, $product_data, $discount_type);
-
+					
 						if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_discount_stopRabatt'))) break;
-
-					}
-
-				}
-
-			}
-
+						
+					}
+										
+				}
+				
+			}
+			
 			if ($product_data['preis'] < 0) $product_data['preis'] = 0;
 			if ($product_data['preis_brutto'] < 0) $product_data['preis_brutto'] = 0;
 			if ($product_data['preis_netto'] < 0) $product_data['preis_netto'] = 0;
-
+ 			
 			//wpsg_debug("Rabatt:loadProduktArray = ".$product_data['preis']);
-
+			
 		} // public function loadProduktArray(&$produkt_data)
-		
-		public function product_getPrice(&$oProduct, &$price_netto, &$price_brutto, $product_key, $amount, $weight) {
-			
-			$arDiscountTypes = $this->getHierarchie();
-			
-			if (wpsg_isSizedArray($arDiscountTypes)) {
-					
-				foreach ($arDiscountTypes as $discount_type) {
-					
-					$discount_value = false;
-			
-					if ($discount_type == 'product' && $this->hasProductDiscount($oProduct->id)) {
-						
-						$discount_value = $this->getProductDiscount($oProduct->id);
-						
-					} else if ($discount_type == 'productgroup' && $this->hasProductgroupDiscount($oProduct->id)) {
-						
-						$discount_value = $this->getProductgroupDiscount($oProduct->id);
-						
-					} else if ($discount_type == 'general' && $this->hasGeneralProductdiscount()) {
-						
-						$discount_value = $this->getGeneralProductdiscount();
-						
-					} else if ($discount_type == 'customer' && $this->hasCustomergroupRabatt()) {
-						
-						$discount_value = $this->getCustomergroupRabatt();
-						
-					}
-			
-					if (wpsg_tf($discount_value) > 0) {
-			
-						if ($this->shop->getBackendTaxview() == WPSG_NETTO) {
-							
-							$this->applyDiscount($discount_value, $price_netto);	
-							$price_brutto = wpsg_calculatePreis($price_netto, WPSG_BRUTTO, $this->shop->getDefaultCountry()->getTax($oProduct->mwst_key));
-							
-						} else {
-							
-							$this->applyDiscount($discount_value, $price_brutto);
-							$price_netto = wpsg_calculatePreis($price_brutto, WPSG_NETTO, $this->shop->getDefaultCountry()->getTax($oProduct->mwst_key));
-							
-						}
-						 						
-						if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_discount_stopRabatt'))) break;
-						
-					}
-					
-				}
-				
-			}
-			
-		}
-		
-		public function wpsg_mod_productgroups_addedit_sidebar(&$productgroupdata)
-		{
-
-			$this->shop->view['wpsg_mod_discount']['data'] = explode("_", wpsg_getStr($productgroupdata['rabatt']));
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/productgroups_addedit_sidebar.phtml');
-
+				
+		public function wpsg_mod_productgroups_addedit_sidebar(&$productgroupdata) 
+		{ 
+			 
+			$this->shop->view['wpsg_mod_discount']['data'] = explode("_", $productgroupdata['rabatt']);			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/productgroups_addedit_sidebar.phtml');	
+			
 		} // public function wpsg_mod_productgroups_addedit_sidebar(&$productgroupdata)
-
-		public function wpsg_mod_productgroups_save($productgroup_id) {
-			
-			$strDiscount = "";
+		
+		public function wpsg_mod_productgroups_save($productgroup_id)
+		{
+			
+			$rabatt = "";
+			
+			/**
+			 * Ich speichere die Rabatteinstellungen in einem Feld innerhalb der Produktgruppe das Trennzeichen ist "_"
+			 */
+			$rabatt_str = $_REQUEST['wpsg_mod_discount']['discount_aktiv'].'_'.$_REQUEST['wpsg_mod_discount']['discount_from'].'_'.$_REQUEST['wpsg_mod_discount']['discount_to'].'_'.wpsg_tf($_REQUEST['wpsg_mod_discount']['discount_value'], true);
+
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_GROUP, array(
+				'rabatt' => wpsg_q($rabatt_str)
+			), "`id` = '".wpsg_q($productgroup_id)."'");
+			
+		} // public function wpsg_mod_productgroups_save($productgroup_id)
+		
+		public function produkt_save(&$produkt_id)
+		{
+			
+			$rabatt = "";
 			
 			/**
 			 * Ich speichere die Rabatteinstellungen in einem Feld innerhalb des Produktes das Trennzeichen ist "_"
 			 */
-			if (isset($_REQUEST['wpsg_mod_discount'])) {
-				
-				try {
-					
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_aktiv'], WPSG_SANITIZE_CHECKBOX)) throw new \Exception(_('Aktion aktiv'));
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_from'], WPSG_SANITIZE_DATE, ['allowEmpty' => true])) throw new \Exception(_('Start (TT.MM.JJJJ)'));
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_to'], WPSG_SANITIZE_DATE, ['allowEmpty' => true])) throw new \Exception(_('Ende (TT.MM.JJJJ)'));
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_value'], WPSG_SANITIZE_FLOAT, ['allowEmpty' => true])) throw new \Exception(_('Rabatt'));
-					
-					$dis_active = $_REQUEST['wpsg_mod_discount']['discount_aktiv'];
-					$dis_from = $_REQUEST['wpsg_mod_discount']['discount_from'];
-					$dis_to = $_REQUEST['wpsg_mod_discount']['discount_to'];
-					$dis_value = wpsg_tf($_REQUEST['wpsg_mod_discount']['discount_value'], true);
-					
-					$strDiscount = $dis_active."_".$dis_from."_".$dis_to."_".$dis_value;
-					
-				} catch (\Exception $e) {
-					
-					$this->shop->addBackendError(wpsg_translate(__('Eingaben in Feld "#1#" ÃŒberprÃŒfen.', $e->getMessage())));
-					
-					return;
-					
-				} 
-				
-			}
+			$rabatt_str = $_REQUEST['wpsg_mod_discount']['discount_aktiv']."_".$_REQUEST['wpsg_mod_discount']['discount_from']."_".$_REQUEST['wpsg_mod_discount']['discount_to']."_".wpsg_tf($_REQUEST['wpsg_mod_discount']['discount_value'], true);
+			
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
+				'rabatt' => wpsg_q($rabatt_str)
+			), "`id` = '".wpsg_q($produkt_id)."'");
+			
+		} // public function produkt_save($produkt_id)
+		
+		public function customergroup_edit(&$oCustomergroup)
+		{
+			
+			$this->shop->view['wpsg_mod_discount']['discount'] = $oCustomergroup->discount;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'mods/mod_discount/customergroup_edit.phtml');
+			
+		} // public function customergroup_edit(&$customergroup_id)
+		
+		public function customergroup_save(&$customergroup_id)
+		{
+			
+			$this->db->UpdateQuery(WPSG_TBL_KG, array(
+				'discount' => wpsg_q($_REQUEST['wpsg_mod_discount']['discount'])
+			), " `id` = '".wpsg_q($customergroup_id)."' ");
+			
+		} // public function customergroup_save(&$customergroup_id)
+						
+		public function addDiscountToVari(&$product_id, &$varianten_data) 
+		{ 
 			 
-			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_GROUP, array(
-				'rabatt' => wpsg_q($strDiscount)
-			), "`id` = '".wpsg_q($productgroup_id)."'");
-
-		} // public function wpsg_mod_productgroups_save($productgroup_id)
-
-		public function produkt_save(&$produkt_id) {
-			
-			$strDiscount = "";
-
-			/**
-			 * Ich speichere die Rabatteinstellungen in einem Feld innerhalb des Produktes das Trennzeichen ist "_"
-			 */
-			if (isset($_REQUEST['wpsg_mod_discount'])) {
-
-				try {
-				
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_aktiv'], WPSG_SANITIZE_CHECKBOX)) throw new \Exception(_('Aktion aktiv'));
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_from'], WPSG_SANITIZE_DATE, ['allowEmpty' => true])) throw new \Exception(_('Start (TT.MM.JJJJ)'));
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_to'], WPSG_SANITIZE_DATE, ['allowEmpty' => true])) throw new \Exception(_('Ende (TT.MM.JJJJ)'));
-					if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount_value'], WPSG_SANITIZE_FLOAT, ['allowEmpty' => true])) throw new \Exception(_('Rabatt'));
-				
-				} catch (\Exception $e) {
-					
-					$this->shop->addBackendError(wpsg_translate(__('Eingaben in Feld "#1#" ÃŒberprÃŒfen.', $e->getMessage())));
-					
-					return;
-					
-				}
-					
-				$dis_active = $_REQUEST['wpsg_mod_discount']['discount_aktiv'];
-				$dis_from = $_REQUEST['wpsg_mod_discount']['discount_from'];
-				$dis_to = $_REQUEST['wpsg_mod_discount']['discount_to'];
-				$dis_value = wpsg_tf($_REQUEST['wpsg_mod_discount']['discount_value'], true);
-				
-				$strDiscount = $dis_active."_".$dis_from."_".$dis_to."_".$dis_value;
-
-			}
-
-			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
-				'rabatt' => wpsg_q($strDiscount)
-			), "`id` = '".wpsg_q($produkt_id)."'");
-
-		} // public function produkt_save($produkt_id)
-
-		public function customergroup_edit(&$oCustomergroup)
-		{
-
-			$this->shop->view['wpsg_mod_discount']['discount'] = wpsg_getStr($oCustomergroup->data['discount']);
-
-			$this->shop->render(WPSG_PATH_VIEW.'mods/mod_discount/customergroup_edit.phtml');
-
-		} // public function customergroup_edit(&$customergroup_id)
-
-		public function customergroup_save(&$customergroup_id) {
-			
-			$db_udpate = [];
-			
-			if (!wpsg_checkInput($_REQUEST['wpsg_mod_discount']['discount'], WPSG_SANITIZE_FLOAT)) {
-				
-				$this->shop->addBackendMessage(__('Bitte die Eingaben im Feld "Rabatt" prÃŒfen.', 'wpsg'));
-				
-			} else $db_udpate['discount'] = wpsg_q($_REQUEST['wpsg_mod_discount']['discount']);
-						
-			$this->db->UpdateQuery(WPSG_TBL_KG, $db_udpate, " `id` = '".wpsg_q($customergroup_id)."' ");
-
-		} // public function customergroup_save(&$customergroup_id)
-
-		public function addDiscountToVari(&$product_id, &$varianten_data)
-		{
-
 			$arDiscountTypes = $this->getHierarchie();
-
+				
 			if (wpsg_isSizedArray($arDiscountTypes))
 			{
-
+			
 				foreach ($arDiscountTypes as $discount_type)
 				{
-
+						
 					$discount_value = false;
-
+						
 					if ($discount_type == 'product' && $this->hasProductDiscount($product_id))
 					{
-
+			
 						$discount_value = $this->getProductDiscount($product_id);
-
+							
 					}
 					else if ($discount_type == 'productgroup' && $this->hasProductgroupDiscount($product_id))
 					{
-
+			
 						$discount_value = $this->getProductgroupDiscount($product_id);
-
+							
 					}
 					else if ($discount_type == 'general' && $this->hasGeneralProductdiscount())
 					{
-
+			
 						$discount_value = $this->getGeneralProductdiscount();
-
+							
 					}
 					else if ($discount_type == 'customer' && $this->hasCustomergroupRabatt())
 					{
-
+			
 						$discount_value = $this->getCustomergroupRabatt();
-
-					}
-
+			
+					}
+						
 					if (wpsg_tf($discount_value) > 0)
 					{
-
+						 
 						$this->applyDiscountToVariData($discount_value, $varianten_data, $discount_type);
-
+							
 						if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_discount_stopRabatt'))) break;
-
-					}
-
-				}
-
-			}
-
-		} // public function addDiscountToVari(&$product_id, &$varianten_data)
-
-		public function basket_top()
-		{
-
+			
+					}
+			
+				}
+			
+			}
+			
+		} // public function wpsg_mod_varianten_loadVarianten(&$varianten_data)
+		
+		public function basket_top() 
+		{ 
+			
 			if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_discount_showBasket'))) return false;
-
+			
 			$nextBasketDiscount = $this->getNextBasketDiscount();
-
+			
 			if ($nextBasketDiscount === false) return false;
-
+						
 			$this->shop->view['wpsg_mod_discount']['discount'] = $nextBasketDiscount['discount'];
 			$this->shop->view['wpsg_mod_discount']['value'] = $nextBasketDiscount['value'];
 			$this->shop->view['wpsg_mod_discount']['discountdifference'] = $nextBasketDiscount['discountdifference'];
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_discount/basket_top.phtml');
-
+			
 		} // public function basket_top()
 		
-		/**
-		 * @param \wpsg\wpsg_calculation $oCalculation
-		 * @param $product_done
-		 * @param $payship_done
-		 */
-		public function calculation_fromSession(&$oCalculation, $product_done, $payship_done) { 
-			
-			if ($product_done && $payship_done) {
+		/* Modulfunktionen */
+		
+		private function cmp($a, $b)
+		{
+				
+			if ($a['value'] == $b['value']) return 0;
 			 
-				$arCalculation = $oCalculation->getCalculationArray();
-				
-				$discount = false; 
-				
-				$value = $arCalculation['sum']['brutto'];
-				if ($value == 0) return;
-				
-				foreach ((array)$this->getOptionData() as $k => $v) {
-				 
-					
-					if (!isset($v['value']) || $value >= $v['value']  && wpsg_tf($v['rabatt']) > 0) {
-						
-						$discount = $v['rabatt'];
-						
-					}
-					
-				}
-			
-				if ($discount !== false) {
-					
-					$oCalculation->addDiscount($discount, $this->shop->getBackendTaxview(), '0', 1);
-					
-				}
-				  
-			}
-			
-		} // public function calculation_fromSession(&$oCalculation, $product_done, $payship_done) { 
-		
-		/* Modulfunktionen */
-		
-		/**
-		 * Gibt true zurÃŒck, wenn auf dem Basket ein Rabatt vorhanden ist
-		 * @param $arBasket
-		 */
-		public function hasDiscount($arBasket) {
-			 
-			// Produktrabatt
-			foreach ($arBasket['produkte'] as $p) {
-				
-				if (wpsg_tf($p['discount_value']) > 0) { return true; }
-				
-			}
-			
-			// Warenkorbrabatt
-			if (wpsg_tf($arBasket['sum']['preis_rabatt_netto']) > 0) {
-				
-				return true;
-				
-			}
-				
-			return false;
-			
-		} // public function hasDiscount($arBasket)
-				
-		private function cmp($a, $b)
-		{
-			$aval = wpsg_getInt($a['value']);
-			$bval = wpsg_getInt($b['value']);
-
-			if ($a['value'] == $b['value']) return 0;
-
 			return ($a['value'] < $b['value']) ? -1 : 1;
-
+		
 		} // private function cmp($a, $b)
-
+		 
 		/**
 		 * Gibt den nÃ€chsten Rabatt und den dafÃŒr nÃ¶tigen Warenkorbwert zurÃŒck
@@ -617,132 +429,113 @@
 		public function getNextBasketDiscount()
 		{
-
+			
 			$data_rabatt = $this->getOptionData();
-
+			
 			if (!wpsg_isSizedArray($data_rabatt)) return false;
-
+			
 			$arBasket = $this->shop->basket->toArray();
 			$basket_amount_brutto = wpsg_getFloat($arBasket['sum']['preis_gesamt_brutto']) + wpsg_getFloat($arBasket['sum']['preis_rabatt_brutto']);
-
+			
 			if ($basket_amount_brutto <= 0) return false;
-
+			
 			foreach ($data_rabatt as $k => $discount)
 			{
-
+			
 				if (isset($discount['value']) && $discount['value'] > $basket_amount_brutto)
 				{
-
+					
 					return array(
-						'discount' => $discount['rabatt'],
+						'discount' => $discount['rabatt'], 
 						'value' => $discount['value'],
 						'discountdifference' => abs($basket_amount_brutto - $discount['value'])
-					);
-
-				}
-
-			}
-
+					); 
+					
+				}
+				
+			}
+			 
 			return false;
-
+			
 		} // public function getNextBasketDiscount()
-
+		
 		/**
 		 * Rabatt in Warenkorb einrechnen
 		 */
-		public function basket_toArray_discount(&$basket, &$arReturn)
+		public function basket_toArray_discount(&$basket, &$arReturn) 
 		{ 
-			
+		
 			// Analog Gutschein, fÃŒr den Warenkorbrabatt
-
+			
 			$data_rabatt = $this->getOptionData();
 			$discount = false;
 			$discount_tax = 0;
-
+			
 			$value = $arReturn['sum']['preis_gesamt_brutto'];
-			if ($value == 0) return;
-
+			
 			foreach ((array)$data_rabatt as $k => $v)
 			{
-
-				if (!isset($v['value']) || $value >= $v['value']  && wpsg_tf($v['rabatt']) > 0)
-				{
-
-					$discount = $v['rabatt'];
-
-				}
-
-			}
-
-			if ((isset($arReturn['backend'])) && ($arReturn['backend'] == true))
-			{
-				// Im Backend Rabatt nicht neu berechnen aus Bestellung entnehmen
-				//$discount_brutto = $basket->arOrder['price_rabatt_brutto'];
-				//$discount_netto = $basket->arOrder['price_rabatt_netto'];
-				if ($basket->arOrder['price_rabatt'] <= 0) return;
-
-				$discount = $basket->arOrder['price_rabatt'];
-				$price_option = $this->shop->get_option('wpsg_preisangaben');
-				$discount_tax = 0.0;
-				if ($price_option == WPSG_BRUTTO)
-				{
-
-					// Rabatt auf Produktpreis begrenzen
-					if ($discount > $arReturn['sum']['preis_gesamt_brutto']) $discount = $arReturn['sum']['preis_gesamt_brutto'];
+				
+				if (!isset($v['value']) or $value >= $v['value']  && wpsg_tf($v['rabatt']) > 0)
+				{
+					
+					$discount = $v['rabatt']; 
+					
+				}				
+				
+			}
+			
+			if ($discount !== false)
+			{
+				 
+				$discount = wpsg_tf($discount, true);
+				
+				if (strpos($discount, "%") !== false)
+				{
+					
+					$discount_value = $arReturn['sum']['preis_gesamt_brutto'] / 100 * wpsg_tf($discount);
 					
 					if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
 					{
-
-						// Rabatt auf die verschiedenen Produkte aufteilen.
-						//$discount_tax = $this->shop->addMwSt($arReturn, $discount);
-						$discount_tax = $this->shop->subMwSt($arReturn, $discount);
-
-					}
-
-					if ($this->shop->addRoundedValues === true)
-					{
-
-						$discount_brutto = round($discount, 2);
-						$discount_netto = round($discount - $discount_tax, 2);
-
+										 					
+						$discount_tax = $this->shop->subMwSt($arReturn, $discount_value);
+						
+					}
+					
+				}
+				else
+				{
+					
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+					{
+						
+						if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
+						{
+						
+							$discount_tax = $this->shop->addMwSt($arReturn, $discount);
+							 
+						} 
+						
+						$discount_value = $discount + $discount_tax;
+						
 					}
 					else
 					{
-
-						$discount_brutto = $discount;
-						$discount_netto = $discounto - $discount_tax;
-
-					}
-
-				}
-				else	// if ($price_option == WPSG_BRUTTO)
-				{
-
-					if ($discount > $arReturn['sum']['preis_gesamt_netto']) $discount = $arReturn['sum']['preis_gesamt_netto'];
-					
-					if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
-					{
-
-						$discount_tax = $this->shop->addMwSt($arReturn, $discount);
-
-					}
-
-					if ($this->shop->addRoundedValues === true)
-					{
-
-						$discount_brutto = round($discount + $discount_tax, 2);
-						$discount_netto = round($discount, 2);
-
-					}
-					else
-					{
-
-						$discount_brutto = $discount + $discount_tax;
-						$discount_netto = $discount;
-
-					}
-
-				}	// else if ($price_option == WPSG_BRUTTO)
-
-
+						
+						$discount_value = $discount;
+						
+						if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
+						{
+							
+							$discount_tax = $this->shop->subMwSt($arReturn, $discount);
+							
+						}
+						 
+					}
+					
+				}
+				
+				$discount_brutto = $discount_value;
+				$discount_netto = $discount_value - $discount_tax;
+				 
 				$arReturn['sum']['preis_brutto'] -= $discount_brutto;
 				$arReturn['sum']['preis_netto'] -= $discount_netto;
@@ -750,234 +543,76 @@
 				$arReturn['sum']['preis_gesamt_netto'] -= $discount_netto;
 				$arReturn['sum']['preis_rabatt_netto'] = $discount_netto;
-				$arReturn['sum']['preis_rabatt_brutto'] = $discount_brutto;
-
-				if ($price_option == WPSG_NETTO)
-				{
-
-					$arReturn['sum']['preis_rabatt'] = $discount_netto;
+				$arReturn['sum']['preis_rabatt_brutto'] = $discount_brutto;								
+				
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+
+					$arReturn['sum']['preis_rabatt'] = $discount_netto; 
 					$arReturn['sum']['preis'] = $arReturn['sum']['preis_netto'];
 					$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_netto'];
-
-				}
-				else if ($price_option == WPSG_BRUTTO)
-				{
-
-					$arReturn['sum']['preis_rabatt'] = $discount_brutto;
+					
+				}
+				else if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
+				{
+					
+					$arReturn['sum']['preis_rabatt'] = $discount_brutto;					
 					$arReturn['sum']['preis'] = $arReturn['sum']['preis_brutto'];
 					$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_brutto'];
-
-				}
-
-
-
-			}
-			else	// if ($arReturn['backend'] == true)
-			{
-
-				$discount_value = 0;
-				
-				if ($discount !== false)
-				{
-
-					$discount = wpsg_tf($discount, true);
-
-					if (strpos($discount, "%") !== false)
-					{
-
-						$discount_value = $arReturn['sum']['preis_gesamt_brutto'] / 100 * wpsg_tf($discount);
-
-						if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
+					
+				} 
+				
+			}		
+			
+		} // public function basket_toArray_discount(&$basket, &$arBasket)
+		
+		/**
+		 * Bearbeitet den Varianten Array und fÃŒgt die rabattierten Preise hinzu
+		 */
+		public function applyDiscountToVariData($discount_value, &$varianten_data, $discount_type)
+		{
+			
+			if (strpos($discount_value, '%') !== false)
+			{
+				
+				foreach ($varianten_data as $var_key => &$var)
+				{
+					
+					if ($var['typ'] == 'checkbox')
+					{
+						
+						$var['preis'] -= ($var['preis'] * wpsg_tf($discount_value) / 100);
+						
+					}
+					else
+					{
+						
+						foreach ($var['vari'] as $vari_key => &$vari)
 						{
-
-							$discount_tax = $this->shop->subMwSt($arReturn, $discount_value);
-
+							
+							$vari['preis'] -= ($vari['preis'] * wpsg_tf($discount_value) / 100);
+							
 						}
-
-					}
-					else if ($discount)
-					{
-
-						if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
-						{
-
-							if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
-							{
-
-								$discount_tax = $this->shop->addMwSt($arReturn, $discount);
-
-							}
-
-							$discount_value = $discount + $discount_tax;
-
-						}
-						else
-						{
-
-							$discount_value = $discount;
-
-							if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
-							{
-
-								$discount_tax = $this->shop->subMwSt($arReturn, $discount);
-
-							}
-
-						}
-
-					}
-
-					if ($this->shop->addRoundedValues === true)
-					{
-
-						$discount_brutto = round($discount_value, 2);
-						$discount_netto = round($discount_value - $discount_tax, 2);
-
-					}
-					else
-					{
-
-						$discount_brutto = $discount_value;
-						$discount_netto = $discount_value - $discount_tax;
-
-					}
-
-					$arReturn['sum']['preis_brutto'] -= $discount_brutto;
-					$arReturn['sum']['preis_netto'] -= $discount_netto;
-					$arReturn['sum']['preis_gesamt_brutto'] -= $discount_brutto;
-					$arReturn['sum']['preis_gesamt_netto'] -= $discount_netto;
-					$arReturn['sum']['preis_rabatt_netto'] = $discount_netto;
-					$arReturn['sum']['preis_rabatt_brutto'] = $discount_brutto;
-
-					if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
-					{
-
-						$arReturn['sum']['preis_rabatt'] = $discount_netto;
-						$arReturn['sum']['preis'] = $arReturn['sum']['preis_netto'];
-						$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_netto'];
-
-					}
-					else if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
-					{
-
-						$arReturn['sum']['preis_rabatt'] = $discount_brutto;
-						$arReturn['sum']['preis'] = $arReturn['sum']['preis_brutto'];
-						$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_brutto'];
-
-					}
-
-				}
-			}  // else if ($arReturn['backend'] == true)
-			/*
-			if ($discount !== false)
-			{
-
-				if ($this->shop->addRoundedValues === true)
-				{
-
-					$discount_brutto = round($discount_value, 2);
-					$discount_netto = round($discount_value - $discount_tax, 2);
-
-				}
-				else
-				{
-
-					$discount_brutto = $discount_value;
-					$discount_netto = $discount_value - $discount_tax;
-
-				}
-
-				$arReturn['sum']['preis_brutto'] -= $discount_brutto;
-				$arReturn['sum']['preis_netto'] -= $discount_netto;
-				$arReturn['sum']['preis_gesamt_brutto'] -= $discount_brutto;
-				$arReturn['sum']['preis_gesamt_netto'] -= $discount_netto;
-				$arReturn['sum']['preis_rabatt_netto'] = $discount_netto;
-				$arReturn['sum']['preis_rabatt_brutto'] = $discount_brutto;
-
-				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
-				{
-
-					$arReturn['sum']['preis_rabatt'] = $discount_netto;
-					$arReturn['sum']['preis'] = $arReturn['sum']['preis_netto'];
-					$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_netto'];
-
-				}
-				else if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
-				{
-
-					$arReturn['sum']['preis_rabatt'] = $discount_brutto;
-					$arReturn['sum']['preis'] = $arReturn['sum']['preis_brutto'];
-					$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_brutto'];
-
-				}
-
-			}	*/
-
-		} // public function basket_toArray_discount(&$basket, &$arBasket)
-
-		/**
-		 * Bearbeitet den Varianten Array und fÃŒgt die rabattierten Preise hinzu
-		 */
-		public function applyDiscountToVariData($discount_value, &$varianten_data, $discount_type)
-		{
-
-			if (strpos($discount_value, '%') !== false)
-			{
-
-				foreach ($varianten_data as $var_key => &$var)
-				{
-
-					if ($var['typ'] == 'checkbox')
-					{
-
-						$var['preis'] -= ($var['preis'] * wpsg_tf($discount_value) / 100);
-
-					}
-					else
-					{
-
-						foreach ($var['arVariation'] as $vari_key => &$vari)
-						{
-
-							$vari['preis'] -= ($vari['preis'] * wpsg_tf($discount_value) / 100);
-
-						}
-
-					}
-
-				}
-
-			}
-
+						
+					}
+					
+				} 
+				
+			}
+			
 		} // public function applyDiscountToVariData($discount_value, &$varianten_data, $discount_type)
-
-		private function applyDiscount($discount_value, &$price) {
-			
-			if (strpos($discount_value, '%') !== false)
-			{
-				
-				$price = $price - ($price * wpsg_tf($discount_value) / 100); 
-				
-			}
-			else
-			{
-				
-				$price = $price - wpsg_tf($discount_value); 
-				
-			}
-			
-		} // C:\xampp\htdocs\wp.home\wpsg4\wp-content\plugins\wpshopgermany-free\mods\wpsg_mod_discount.class.php
 		
 		/**
 		 * Bearbeitet einen Array mit Produktinformationen mit dem Rabatt
 		 */
-		public function applyDiscountToProductData($discount_value, &$product_data, $discount_type) {
-
+		public function applyDiscountToProductData($discount_value, &$product_data, $discount_type)
+		{
+			 
 			$mwst_value = $product_data['mwst_value'];
-
+							
 			if (!wpsg_isSizedArray($product_data['discount'])) $product_data['discount'] = array();
 			$product_data['discount'][$discount_type] = $discount_value;
-
-			$discount_min_price = false; if ($this->shop->hasMod('wpsg_mod_productvariants') && isset($product_data['min_preis'])) $discount_min_price = &$product_data['min_preis'];
-			$discount_max_price = false; if ($this->shop->hasMod('wpsg_mod_productvariants') && isset($product_data['max_preis'])) $discount_max_price = &$product_data['max_preis'];
+			
+			$discount_min_price = false; if ($this->shop->hasMod('wpsg_mod_varianten') && isset($product_data['min_preis'])) $discount_min_price = &$product_data['min_preis']; 
+			$discount_max_price = false; if ($this->shop->hasMod('wpsg_mod_varianten') && isset($product_data['max_preis'])) $discount_max_price = &$product_data['max_preis']; 
 
 			if (!isset($product_data['preis_prediscount'])) $product_data['preis_prediscount'] = $product_data['preis'];
@@ -987,54 +622,63 @@
 			if ($discount_min_price && !isset($product_data['min_preis_prediscount'])) $product_data['min_preis_prediscount'] = $product_data['min_preis'];
 			if ($discount_max_price && !isset($product_data['max_preis_prediscount'])) $product_data['max_preis_prediscount'] = $product_data['max_preis'];
-
-			if ($this->shop->getBackendTaxview() == WPSG_BRUTTO) {
-
+			
+			if ($this->shop->getBackendTaxview() == WPSG_BRUTTO)
+			{
+				
 				$preis_discount_calc = &$product_data['preis_brutto'];
-				$preis_calc = &$product_data['preis_netto'];
+				$preis_calc = &$product_data['preis_netto'];				
 				$calc = WPSG_NETTO;
-
-			} else {
+				
+			}
+			else
+			{
 
 				$preis_discount_calc = &$product_data['preis_netto'];
-				$preis_calc = &$product_data['preis_brutto'];
+				$preis_calc = &$product_data['preis_brutto'];				
 				$calc = WPSG_BRUTTO;
-
-			}
-
-			if (strpos($discount_value, '%') !== false) {
-
+				
+			}
+			
+			if (strpos($discount_value, '%') !== false)
+			{
+				
 				$preis_discount_calc = $preis_discount_calc - ($preis_discount_calc * wpsg_tf($discount_value) / 100);
-				if ($discount_min_price) $discount_min_price = $discount_min_price - ($discount_min_price * wpsg_tf($discount_value) / 100);
-				if ($discount_max_price) $discount_max_price = $discount_max_price - ($discount_max_price * wpsg_tf($discount_value) / 100);
-
-			} else {
-
+				if ($discount_min_price) $discount_min_price = $discount_min_price - ($discount_min_price * $discount_value / 100);
+				if ($discount_max_price) $discount_max_price = $discount_max_price - ($discount_max_price * $discount_value / 100);
+				
+			}
+			else
+			{
+				
 				$preis_discount_calc = $preis_discount_calc = $preis_discount_calc - $discount_value;
 				if ($discount_min_price) $discount_min_price = $discount_min_price - $discount_value;
 				if ($discount_max_price) $discount_max_price = $discount_max_price - $discount_value;
-
-			}
-
+				
+			}
+			
 			// Ich lasse hier negative Discounts zu, da diese spÃ€ter noch vom Variantenmodul abgezogen werden
 			//if ($preis_discount_calc < 0) $preis_discount_calc = 0;
-
+			
 			$preis_calc = wpsg_calculatePreis($preis_discount_calc, $calc, $mwst_value);
-
+			
 			// Preis fÃŒr Anzeige wieder setzen
-			if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO) {
-
+			if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
+			{
+			
 				$product_data['preis'] = &$product_data['preis_brutto'];
-
-			} else {
-
+							
+			}
+			else
+			{
+			
 				$product_data['preis'] = &$product_data['preis_netto'];
-
-			}
-
+			
+			}
+			
 			// Rabattwert eintragen
-			$product_data['discount_value'] = $product_data['preis_prediscount'] - $product_data['preis'];
-
+			$product_data['discount_value'] = $product_data['preis_prediscount'] - $product_data['preis'];  
+			 
 		} // public function applyDiscountToProductData($discount_value, &$product_data)
-
+		
 		/**
 		 * Gibt true zurÃŒck, sofern das Produkt einen aktiven Produktrabatt hat
@@ -1042,56 +686,56 @@
 		public function hasProductDiscount($product_id)
 		{
-
+			
 			/**
 			 * Jetzt noch ein eventueller Rabatt aus den Produkten
 			 */
 			$bRabatt_produkt = false;
-
+			
 			if ($this->shop->get_option("wpsg_mod_discount_productdiscount") != "1")
 			{
-
+				
 				$bRabatt_produkt = false;
-
+				
 			}
 			else
 			{
-
+				
 				$product_data = $this->shop->cache->loadProduct($product_id);
 				$discount = explode('_', $product_data['rabatt']);
-
+			 
 				// Zeitraum und gÃŒltigen Wert ÃŒberprÃŒfen
 				if ($discount[0] != "1" || !preg_match("/\d{2}\.\d{2}\.\d{4}/", $discount[1]) || !preg_match("/\d{2}\.\d{2}\.\d{4}/", $discount[2]) || !is_float((float)$discount[3]))
 				{
-
+					
 					$bRabatt_produkt = false;
-
+					
 				}
 				else
 				{
-
+				 			
 					$rabatt_value = $discount[3];
 					$rabatt_start = strtotime($discount[1]);
 					$rabatt_end = strtotime($discount[2]);
-
+						
 					// im Zeitrahmen?
 					if (time() >= $rabatt_start && time() <= $rabatt_end)
 					{
-
+				
 						$bRabatt_produkt = true;
-
+				
 					}
 					else
 					{
-
+						
 						$bRabatt_produkt = false;
-
-					}
-
-				}
-
-			}
-
+						
+					}
+						
+				}
+
+			}
+				
 			return $bRabatt_produkt;
-
+			
 		} // public function hasProductDiscount($product_id)
 
@@ -1099,13 +743,14 @@
 		 * Gibt einen Array mit den Rabattinformationen bezÃŒglich des Produktrabattes zurÃŒck
 		 */
-		public function getProductDiscount($product_id) {
-
+		public function getProductDiscount($product_id)
+		{
+			
 			if (!$this->hasProductDiscount($product_id)) return 0;
-
+			
 			$product_data = $this->shop->cache->loadProduct($product_id);
 			$discount = explode('_', $product_data['rabatt']);
-
+			
 			return $discount[3];
-
+			
 		} // public function getProductDiscount($product_id)
 
@@ -1113,57 +758,58 @@
 		 * Gibt true zurÃŒck, sofern das Produkt einen aktiven Rabatt aus der Kundengruppe hat
 		 */
-		public function hasCustomergroupRabatt() {
-
-			if ($this->shop->hasMod('wpsg_mod_customergroup') && $this->shop->get_option('wpsg_mod_discount_customergroup') === '1') {
-
+		public function hasCustomergroupRabatt()
+		{
+			
+			if ($this->shop->hasMod('wpsg_mod_customergroup') && $this->shop->get_option('wpsg_mod_discount_customergroup') === '1')
+			{
+			
 				$act_customer_group = $this->shop->callMod('wpsg_mod_kundenverwaltung', 'getCustomerGroup');
-
-				if (wpsg_isSizedInt($act_customer_group)) {
-
-					try {
-					
-						$oCustomerGroup = wpsg_customergroup::getInstance($act_customer_group);
-
-						if (($oCustomerGroup->__get('discount')??'') !== '') {
-
-							return true;
-
-						}
-
-					} catch (\Exception $e) { }
-
-				}
-
-			}
-			
-			return false;
-
+			
+				if (wpsg_isSizedInt($act_customer_group))
+				{
+			
+					$oCustomerGroup = wpsg_customergroup::getInstance($act_customer_group);
+					
+					if ($oCustomerGroup !== false && wpsg_isSizedString($oCustomerGroup->discount))
+					{
+			
+						return true;
+			
+					}
+			
+				}
+			
+			}
+				
 		} // public function hasCustomergroupRabatt()
-
+		
 		/**
 		 * Gibt den Rabatt aus der Kundengruppe zurÃŒck
 		 */
-		public function getCustomergroupRabatt() {
-
+		public function getCustomergroupRabatt()
+		{
+			
 			if (!$this->hasCustomergroupRabatt()) return 0;
-
+			
 			$act_customer_group = $this->shop->callMod('wpsg_mod_kundenverwaltung', 'getCustomerGroup');
-
-			if (wpsg_isSizedInt($act_customer_group)) {
-
+			
+			if (wpsg_isSizedInt($act_customer_group))
+			{
+					
 				$oCustomerGroup = wpsg_customergroup::getInstance($act_customer_group);
-
-				if (($oCustomerGroup->__get('discount')??'') !== '') {
-
-					return $oCustomerGroup->__get('discount');
-
-				}
-
-			}
-
+					
+				if ($oCustomerGroup !== false && wpsg_isSizedString($oCustomerGroup->discount))
+				{
+						
+					return $oCustomerGroup->discount;
+						
+				}
+					
+			}
+			
 			return 0;
-
+			
 		} // public function getCustomergroupRabatt()
-
+		
 		/**
 		 * Gibt true zurÃŒck, sofern das Produkt einen aktiven Rabatt aus dem generellen Produktrabatt hat
@@ -1171,12 +817,12 @@
 		public function hasGeneralProductdiscount()
 		{
-
+			
 			$bRabatt_allgemein = true;
-
+			
 			if ($this->shop->get_option("wpsg_mod_discount_universal") != "1")
 			{
 				$bRabatt_allgemein = false;
 			}
-
+			
 			// Genereller Rabatt ist aktiviert nun den Zeitraum ÃŒberprÃŒfen dazu ÃŒberprÃŒf ich zuerst ob die Datumseingaben valide sind
 			if (!preg_match("/\d{2}\.\d{2}\.\d{4}/", $this->shop->get_option("wpsg_mod_discount_universal_from")) ||
@@ -1186,32 +832,32 @@
 				$bRabatt_allgemein = false;
 			}
-
+			
 			if ($bRabatt_allgemein)
 			{
-
+			
 				$rabatt_value = $this->shop->get_option("wpsg_mod_discount_universal_value");
 				$rabatt_start = strtotime($this->shop->get_option("wpsg_mod_discount_universal_from"));
 				$rabatt_end = strtotime($this->shop->get_option("wpsg_mod_discount_universal_to"));
-
+					
 				// im Zeitrahmen?
 				if (time() >= $rabatt_start && time() <= $rabatt_end)
 				{
-
+			
 					$bRabatt_allgemein = true;
-
+					 
 				}
 				else
 				{
-
+					
 					$bRabatt_allgemein = false;
-
-				}
-
-			}
-
+					
+				}
+			
+			}
+			
 			return $bRabatt_allgemein;
-
+			
 		} // public function hasGeneralProductdiscount()
-
+		
 		/**
 		 * Gibt den generellen Produktrabatt zurÃŒck
@@ -1219,11 +865,11 @@
 		public function getGeneralProductdiscount()
 		{
-
+			
 			if (!$this->hasGeneralProductdiscount()) return 0;
-
+			
 			return $this->shop->get_option("wpsg_mod_discount_universal_value");
-
+			
 		} // public function getGeneralProductdiscount()
-
+		
 		/**
 		 * Gibt true zurÃŒck, sofern das Produkt einen aktiven Rabatt aus der Produktgruppe hat
@@ -1231,20 +877,20 @@
 		public function hasProductgroupDiscount($product_id)
 		{
-
+			
 			if (!$this->shop->hasMod('wpsg_mod_productgroups')) return false;
-
+			
 			$bRabatt_produktgruppen = true;
-
+			
 			$rabatt = array();
-
+			
 			if ($this->shop->get_option("wpsg_mod_discount_productgroupdiscount") != "1")
 			{
-
+				
 				$bRabatt_produktgruppen = false;
-
+				
 			}
 			else
 			{
-
+			
 				// Jetzt brauch ich fÃŒr weiter Kontrollen den Rabatt aus der Produkgruppe
 				$rabatt_produktgruppe = $this->db->fetchOne("
@@ -1257,42 +903,42 @@
 						P.`id` = '".wpsg_q($product_id)."'
 				");
-
-				$rabatt = explode("_", $rabatt_produktgruppe??'');
-
-			}
-
-			// Zeitraum und gÃŒltigen Wert ÃŒberprÃŒfen
-			if (!wpsg_isSizedArray($rabatt) || $rabatt[0] != "1" || !preg_match("/\d{2}\.\d{2}\.\d{4}/", $rabatt[1]) || !preg_match("/\d{2}\.\d{2}\.\d{4}/", $rabatt[2]) || !is_float((float)$rabatt[3]))
-			{
-
+			
+				$rabatt = explode("_", $rabatt_produktgruppe);
+			
+			}
+				
+			// Zeitraum und gÃŒltigen Wert ÃŒberprÃŒfen 
+			if ($rabatt[0] != "1" || !preg_match("/\d{2}\.\d{2}\.\d{4}/", $rabatt[1]) || !preg_match("/\d{2}\.\d{2}\.\d{4}/", $rabatt[2]) || !is_float((float)$rabatt[3]))
+			{
+				
 				$bRabatt_produktgruppen = false;
-
-			}
-
+				
+			}
+			
 			if ($bRabatt_produktgruppen)
 			{
-
+			
 				$rabatt_value = $rabatt[3];
 				$rabatt_start = strtotime($rabatt[1]);
 				$rabatt_end = strtotime($rabatt[2]);
-
+			
 				// im Zeitrahmen?
 				if (time() >= $rabatt_start && time() <= $rabatt_end)
 				{
-
+			
 					$bRabatt_produktgruppen = true;
-
+			
 				}
 				else
 				{
-
+					
 					$bRabatt_produktgruppen = false;
-
-				}
-
-			}
-
+					
+				}
+			
+			}
+			
 			return $bRabatt_produktgruppen;
-
+			
 		} // public function hasProductgroupDiscount($product_id)
 
@@ -1301,8 +947,8 @@
 		 */
 		public function getProductgroupDiscount($product_id)
-		{
-
+		{ 
+			
 			if (!$this->hasProductgroupDiscount($product_id)) return 0;
-
+			
 			$rabatt_produktgruppe = $this->db->fetchOne("
 				SELECT
@@ -1314,17 +960,17 @@
 					P.`id` = '".wpsg_q($product_id)."'
 			");
-
-			$discount = explode("_", $rabatt_produktgruppe);
-
+			
+			$discount = explode("_", $rabatt_produktgruppe); 
+			
 			return $discount[3];
-
+			
 		} // public function getProductgroupDiscount($product_id)
-
+		
 		private function getOptionData()
 		{
-
+			
 			if (@is_array($this->shop->get_option("wpsg_mod_discount_data"))) $data_rabatt = $this->shop->get_option("wpsg_mod_discount_data");
 	 		else
-	 		{
+	 		{	 
 				$data_rabatt = @unserialize($this->shop->get_option("wpsg_mod_discount_data"));
 				if (!is_array($data_rabatt)) $data_rabatt = array();
@@ -1332,7 +978,7 @@
 
 	 		usort($data_rabatt, array($this, "cmp"));
-
+			
 	 		return $data_rabatt;
-
+	 		
 		} // private function getOptionData()
 
@@ -1342,17 +988,17 @@
 		private function getHierarchie()
 		{
-
+			
 			$hierarchie = explode(',', $this->shop->get_option('wpsg_mod_discount_hierarchie'));
 			if (!wpsg_isSizedArray($hierarchie)) $hierarchie = array();
-
+				
 			if (!in_array('general', $hierarchie)) $hierarchie[] = 'general';
 			if (!in_array('product', $hierarchie)) $hierarchie[] = 'product';
 			if (!in_array('productgroup', $hierarchie)) $hierarchie[] = 'productgroup';
 			if (!in_array('customer', $hierarchie)) $hierarchie[] = 'customer';
-
+			
 			return wpsg_trim(array_unique($hierarchie));
-
+			
 		} // private function getHierarchie()
-
+		
 		/**
 		 * Gibt den Namen fÃŒr einen Rabatttyp zurÃŒck
@@ -1360,19 +1006,20 @@
 		public function getNameFromType($discount_type)
 		{
-
+			
 			switch ($discount_type)
 			{
-
+				
 				case 'general': return __('Rabatt auf alle Produkte', 'wpsg'); break;
 				case 'product': return __('Produktrabatt', 'wpsg'); break;
 				case 'productgroup': return __('Produktgruppenrabatt', 'wpsg'); break;
 				case 'customer': return __('Kundengruppenrabatt', 'wpsg'); break;
-
-				default: throw new \wpsg\Exception(__('Es konnte kein Name fÃŒr einen Rabatttyp zurÃŒckgegeben werden', 'wpsg'));
-
-			}
-
+				
+				default: $this->shop->throwErrorCode('700_1');
+				
+			}
+						
 		} // public function getNameFromType($discount_type)
-
+		
 	} // class wpsg_mod_discount
 
+?>
Index: /mods/wpsg_mod_downloadplus.class.php
===================================================================
--- /mods/wpsg_mod_downloadplus.class.php	(revision 8528)
+++ /mods/wpsg_mod_downloadplus.class.php	(revision 5261)
@@ -4,38 +4,38 @@
 	 * Klasse fÃŒr die individualisierung von PDF Dokumenten
 	 */
-	class wpsg_mod_downloadplus extends wpsg_mod_basic {
-
-	    var $lizenz = 1;
-	    var $id = 101;
-	    var $version = "9.9.9";
-	    var $hilfeURL = 'http://wpshopgermany.de/?p=1426';
-
-	    var $valid_ending = array('pdf');
-	    var $barCodeFonts = array('EAN13', 'Code128', 'UPC_A');
-
-	    var $arMessage = Array();
-	    var $arError = Array();
-
-	    /**
-	     * Costructor
-	     */
-	    public function __construct() {
-
-	        parent::__construct();
-
-	        $this->name = __('DownloadPlus', 'wpsg');
-	        $this->group = __('Produkte', 'wpsg');
-	        $this->desc = __('ErmÃ¶glicht den Verkauf von angepassten PDF Dokumenten.', 'wpsg');
-
-	    } // public function __construct()
-
-	    public function install() {
-
-	        require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
-	        /**
-	         * Tabelle fÃŒr die Anpassungen der PDF Dokumente
-	         */
-	        $sql = "CREATE TABLE ".WPSG_TBL_PDFINDIV." (
+	class wpsg_mod_downloadplus extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 1;
+		var $id = 101;
+		var $version = "9.9.9";
+		var $hilfeURL = 'http://wpshopgermany.de/?p=1426';
+
+		var $valid_ending = array('pdf');
+		var $barCodeFonts = array('EAN13', 'Code128', 'UPC_A');
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('DownloadPlus', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht den Verkauf von angepassten PDF Dokumenten.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function install()
+		{
+			
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			/**
+			 * Tabelle fÃŒr die Anpassungen der PDF Dokumente
+			 */
+			$sql = "CREATE TABLE ".WPSG_TBL_PDFINDIV." (
 				id INT(11) NOT NULL AUTO_INCREMENT,				
 				o_id INT(11) NOT NULL,
@@ -49,519 +49,302 @@
 				counter INT(11) NOT NULL,		
 				fielddata TEXT NOT NULL,
-				mode INT(1) NOT NULL COMMENT 'Individualisierungsmodus im Produkt eingestellt',
-				template INT(11) NOT NULL COMMENT 'Link zu WPSG_TBL_DP_TEMPLATES, im Produkt eingestellt',
-				INDEX o_id (o_id),
-				INDEX p_key (p_key),
-				INDEX product_index (product_index),
-			    PRIMARY KEY  (id)
+			  	PRIMARY KEY  (id)
 			) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
-
-	        dbDelta($sql);
-
-	        $sql = "CREATE TABLE ".WPSG_TBL_DP_TEMPLATES." (
-				id INT(11) NOT NULL AUTO_INCREMENT,				
-				deleted INT(1) NOT NULL COMMENT '1 wenn gelÃ¶scht',
-				name VARCHAR(255) COMMENT 'Name des Templates' NOT NULL,
-				defaulttemplate INT(1) COMMENT '1 beim Standard Tempalte' NOT NULL,
-				INDEX deleted (deleted),					
-			    PRIMARY KEY  (id)
-			) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
-
-	        dbDelta($sql);
-
-	        $sql = "CREATE TABLE ".WPSG_TBL_DP_TEMPLATES_FIELD." (
-				id INT(11) NOT NULL AUTO_INCREMENT,				
-				template_id INT(11) COMMENT 'Link zu WPSG_TBL_TEMPLATES' NOT NULL,		
-				deleted INT(1) NOT NULL COMMENT '1 wenn gelÃ¶scht',			
-				x INT(11) NOT NULL COMMENT 'X - Wert',
-				y INT(11) NOT NULL COMMENT 'Y - Wert',
-				align INT(1) NOT NULL COMMENT 'Zentriert',
-				bg INT(1) NOT NULL COMMENT 'Hintergrund',
-				color VARCHAR(6) NOT NULL COMMENT 'Hex Farbe',
-				alpha DOUBLE(10,2) NOT NULL COMMENT 'Transparenzwert',
-				angle INT(11) NOT NULL COMMENT 'Winkel',
-				fontsize INT(11) NOT NULL COMMENT 'SchriftgrÃ¶Ãe',
-				aktiv INT(1) NOT NULL COMMENT 'Aktiv',
-				text VARCHAR(1000) NOT NULL COMMENT 'Freitext',
-				font VARCHAR(255) NOT NULL COMMENT 'Schriftart',
-				INDEX template_id (template_id),
-				INDEX deleted (deleted),
-			    PRIMARY KEY  (id)
-			) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
-
-	        dbDelta($sql);
-
-	        $sql = "CREATE TABLE ".WPSG_TBL_VARIANTS_VARI." (
-				template_id int(11) NOT NULL COMMENT 'Template fÃŒr Downloadplus',
-				INDEX template_id (template_id),				
-				KEY variant_id (variant_id),
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-	        dbDelta($sql);
-
-	        // AbwÃ€rtskombatibilitÃ€t mit DLPlus
-	        if ($this->shop->isMultiBlog()) {
-
-	            $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_dlplus/';
-	            $new_path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_pdfprodukte/';
-
-	        } else {
-
-	            $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_dlplus/';
-	            $new_path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_pdfprodukte/';
-
-	        }
-
-	        if (file_exists($path)) {
-
-	            rename($path, $new_path);
-
-	        }
-
-	        // Alte Serialisierte Texte in ein Standard Template migrieren
-		    $arOldText = $this->shop->get_option('wpsg_mod_downloadplus_text');
-
-	    	if (wpsg_isSizedArray($arOldText)) {
-
-	    		$this->db->Query("UPDATE `".WPSG_TBL_DP_TEMPLATES."` SET `defaulttemplate` = '0' ");
-
-	    		$template_id = $this->db->ImportQuery(WPSG_TBL_DP_TEMPLATES, [
-	    			'name' => 'Standard',
-				    'deleted' => '0',
-				    'defaulttemplate' => '1'
-			    ]);
-
-	    		foreach ($arOldText as $field) {
-
-	    			$this->db->ImportQuery(WPSG_TBL_DP_TEMPLATES_FIELD, [
-	    				'template_id' => wpsg_q($template_id),
-					    'deleted' => '0',
-					    'x' => wpsg_q($field['x']),
-					    'y' => wpsg_q($field['y']),
-					    'align' => wpsg_q($field['align']),
-					    'bg' => wpsg_q($field['bg']),
-					    'color' => wpsg_q($field['color']),
-					    'alpha' => wpsg_q($field['alpha']),
-					    'angle' => wpsg_q($field['angle']),
-					    'fontsize' => wpsg_q($field['fontsize']),
-					    'aktiv' => wpsg_q($field['aktiv']),
-					    'text' => wpsg_q($field['text']),
-					    'font' => wpsg_q($field['font'])
-				    ]);
-
-				}
-
-				// In dem Zuge versuche ich alle Produkte mit Downloadfiles als Downloadprodukt zu markieren
-			    $arProductID = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` ");
-
-	    		foreach ($arProductID as $product_id) {
-
-	    			$arFiles = $this->getFiles($product_id);
-
-	    			if (sizeof($arFiles) > 0) {
-
-						$oProduct = wpsg_product::getInstance($product_id);
-						$oProduct->setMeta('mod_downloadplus_set', "1");
-
-				    }
-
-				}
-
-				$this->shop->update_option('wpsg_mod_downloadplus_text', false);
-
-		    }
-
-	        // Standardwerte
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_filename', '%order_id%-%filename%');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_shipping', '1');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_memorylimit', '1');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_timelimit', '1');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_numberformat', '%download_nr%');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_startnumber', '1');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_autosend', '1');
-	        $this->shop->checkDefault('wpsg_mod_downloadplus_indiv_mode', '1');
-			$this->shop->checkDefault('wpsg_mod_downloadplus_setpwd', '1');
-
-	    } // public function install()
-
-	    public function delOrder($order_id)
-	    {
-
-	        $this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".wpsg_q($order_id)."'");
-
-	        // Individualisierte Dateien lÃ¶schen
-	        $path = $this->getPDFIndivPath($order_id); wpsg_rrmdir($path);
-
-	    } // public function delOrder($order_id)
-
-	    public function wpsg_enqueue_scripts()
-	    {
-
-	        if (is_admin() && preg_match('/wpsg/', wpsg_getStr($_REQUEST['page'])))
-	        {
-
-	            wp_enqueue_script('wpsg_ajaxupload', $this->shop->getRessourceURL('js/ajaxupload.js'));
-
-	        }
-
-	    } // function wpsg_enqueue_scripts()
-
-	    public function admin_emailconf() {
-
-	        echo wpsg_drawEMailConfig(
-	            'pdfdownloadfiles',
-	            __('PDFdownload E-Mail', 'wpsg'),
-	            __('E-Mail mit Links zu den PDFs die an den Kunden geht.', 'wpsg'));
-
-	        echo wpsg_drawEMailConfig(
-	            'pdfdownloadcronmail',
-	            __('PDFdownload Cron E-Mail', 'wpsg'),
-	            __('E-Mail mit Informationen zu der PDF Individualisierung die vom Cron verschickt wird. (An Admin!).', 'wpsg'),
-	            true);
-
-	    } // public function admin_emailconf()
-
-	    public function admin_emailconf_save()
-	    {
-
-	        wpsg_saveEMailConfig("pdfdownloadfiles");
-	        wpsg_saveEMailConfig("pdfdownloadcronmail");
-
-	    } // public function admin_emailconf_save()
-
-	    public function settings_save() {
-
-		    $arTemplateID = [];
-		    $arFieldID = [];
-
-		    $_REQUEST['template'] = json_decode(($_REQUEST['template']??[]), true);
-
-		    if (!is_array($_REQUEST['template'])) throw new \Exception(__('Etwas stimmte mit den Templatedaten nicht.'));
-
-		    foreach ($_REQUEST['template'] as $template) {
-
-		    	$template_id = intval($template['id']);
-
-		    	$db_template_data = [
-		    		'name' => wpsg_q($template['name']),
-				    'defaulttemplate' => wpsg_q($template['defaulttemplate'])
-			    ];
-
-		    	if ($template_id > 0) {
-
-		    		$this->db->UpdateQuery(WPSG_TBL_DP_TEMPLATES, $db_template_data, " `id` = '".wpsg_q($template_id)."' ");
-
-			    } else {
-
-		    		$template_id = $this->db->ImportQuery(WPSG_TBL_DP_TEMPLATES, $db_template_data);
-
-			    }
-
-		    	if (wpsg_isSizedString($template['file_data'])) {
-
-		    		$path = $this->getPDFTemplatePath($template_id);
-		    		wpsg_clearDirectory($path);
-
-		    		$file_data = $template['file_data'];
-		    		$mime = 'data:application/pdf;base64,';
-
-		    		if (substr($file_data, 0, strlen($mime)) !== $mime) throw new \Exception(__('UngÃŒltiger Dateityp', 'wpsg'));
-
-		    		file_put_contents($path.$template['file'], base64_decode(substr($file_data, strlen($mime))));
-
-			    } else if ($template['file_delete'] === true) {
-
-		    		$path = $this->getPDFTemplatePath($template_id);
-		    		wpsg_clearDirectory($path);
-
-			    }
-
-		    	foreach ($template['arField'] as $field) {
-
-		    		$field_id = intval($field['id']);
-
-		    		$db_field_data = [
-						'x' => wpsg_q($field['x']),
-					    'y' => wpsg_q($field['y']),
-					    'align' => wpsg_q($field['align']),
-					    'bg' => wpsg_q($field['bg']),
-					    'color' => wpsg_q($field['color']),
-					    'alpha' => wpsg_q(wpsg_tf($field['alpha'])),
-					    'angle' => wpsg_q($field['angle']),
-					    'fontsize' => wpsg_q($field['fontsize']),
-					    'aktiv' => wpsg_q($field['aktiv']),
-					    'text' => wpsg_q($field['text']),
-					    'font' => wpsg_q($field['font']),
-					    'template_id' => wpsg_q($template_id)
-				    ];
-
-		    		if ($field_id > 0) {
-
-		    			$this->db->UpdateQuery(WPSG_TBL_DP_TEMPLATES_FIELD, $db_field_data, " `id` = '".wpsg_q($field_id)."' ");
-
- 				    } else {
-
-		    			$field_id = $this->db->ImportQuery(WPSG_TBL_DP_TEMPLATES_FIELD, $db_field_data);
-
-				    }
-
-		    		$arFieldID[] = $field_id;
-
-			    }
-
-		    	$arTemplateID[] = $template_id;
-
-		    }
-
-		    if (sizeof($arTemplateID) > 0) $this->db->UpdateQuery(WPSG_TBL_DP_TEMPLATES, ['deleted' => '1'], " `id` NOT IN (".wpsg_q(implode(',', $arTemplateID)).") ");
-		    else $this->db->UpdateQuery(WPSG_TBL_DP_TEMPLATES, ['deleted' => '1'], " 1 ");
-
-		    if (sizeof($arFieldID) > 0) $this->db->UpdateQuery(WPSG_TBL_DP_TEMPLATES_FIELD, ['deleted' => '1'], " `id` NOT IN (".wpsg_q(implode(',', $arFieldID)).") ");
-		    else $this->db->UpdateQuery(WPSG_TBL_DP_TEMPLATES_FIELD, ['deleted' => '1'], " 1 ");
-
-	        $this->shop->update_option('wpsg_mod_downloadplus_filename', $_REQUEST['wpsg_mod_downloadplus_filename'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_indiv_mode', $_REQUEST['wpsg_mod_downloadplus_indiv_mode'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2']);
-	        $this->shop->update_option('wpsg_mod_downloadplus_autosend', $_REQUEST['wpsg_mod_downloadplus_autosend'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_shipping', $_REQUEST['wpsg_mod_downloadplus_shipping'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_einsplusx', $_REQUEST['wpsg_mod_downloadplus_einsplusx'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_accepted', $_REQUEST['wpsg_mod_downloadplus_accepted'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2']);
-	        $this->shop->update_option('wpsg_mod_downloadplus_days', $_REQUEST['wpsg_mod_downloadplus_days'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_downloads', $_REQUEST['wpsg_mod_downloadplus_downloads'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_cleanraiddownloads', $_REQUEST['wpsg_mod_downloadplus_cleanraiddownloads'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_cleanolddownloads', $_REQUEST['wpsg_mod_downloadplus_cleanolddownloads'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_pdfpath', $_REQUEST['wpsg_mod_downloadplus_pdfpath'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_pdfindivpath', $_REQUEST['wpsg_mod_downloadplus_pdfindivpath'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_range', $_REQUEST['wpsg_mod_downloadplus_range'], false, false, WPSG_SANITIZE_VALUES, ['0', '1']);
-	        $this->shop->update_option('wpsg_mod_downloadplus_range_von', $_REQUEST['wpsg_mod_downloadplus_range_von'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_range_bis', $_REQUEST['wpsg_mod_downloadplus_range_bis'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_downloadplus_setpwd', $_REQUEST['wpsg_mod_downloadplus_setpwd'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_masterpass', $_REQUEST['wpsg_mod_downloadplus_masterpass'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_openpass', $_REQUEST['wpsg_mod_downloadplus_openpass'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_securitysave', $_REQUEST['wpsg_mod_downloadplus_securitysave'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_securityprint', $_REQUEST['wpsg_mod_downloadplus_securityprint'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_securitymod', $_REQUEST['wpsg_mod_downloadplus_securitymod'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_securitynote', $_REQUEST['wpsg_mod_downloadplus_securitynote'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_format', $_REQUEST['wpsg_mod_downloadplus_format'], false, false, WPSG_SANITIZE_VALUES, ['0', '1']);
-	        $this->shop->update_option('wpsg_mod_downloadplus_memorylimit', $_REQUEST['wpsg_mod_downloadplus_memorylimit'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_emptypdf', $_REQUEST['wpsg_mod_downloadplus_emptypdf'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_timelimit', $_REQUEST['wpsg_mod_downloadplus_timelimit'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_downloadplus_numberformat', $_REQUEST['wpsg_mod_downloadplus_numberformat'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_startnumber', $_REQUEST['wpsg_mod_downloadplus_startnumber'], false, false, WPSG_SANITIZE_TEXTFIELD);
-	        $this->shop->update_option('wpsg_mod_downloadplus_attachement', $_REQUEST['wpsg_mod_downloadplus_attachement'], false, false, WPSG_SANITIZE_CHECKBOX);
- 
-	    } // public function settings_save()
-
-	    public function settings_edit() {
-
-	        $font_path = WPSG_PATH_LIB.'FPDF_1.81/font/';
-
-	        $arFontFiles = scandir($font_path);
-
-	        foreach ($arFontFiles as $k => $v) {
-
-	            $file = $font_path.$v;
-
-	            if (is_file($file) && file_exists($file) && preg_match('/(.*)\.php$/i', $v)) {
-
-	                $this->shop->view['wpsg_mod_downloadplus']['arFonts'][$v] = ucfirst(preg_replace('/\.php$/i', '', $v));
-
-	            }
-
-	        }
-
-	        $this->shop->view['wpsg_mod_downloadplus']['barCodeFonts'] = $this->barCodeFonts;
-
-	        // Barcode
-	        $this->shop->view['wpsg_mod_downloadplus']['arFonts']['EAN13'] = 'EAN 13';
-	        $this->shop->view['wpsg_mod_downloadplus']['arFonts']['Code128'] = 'Code 128';
-	        $this->shop->view['wpsg_mod_downloadplus']['arFonts']['UPC_A'] = 'UPC-A';
-
-	        $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/settings_edit.phtml');
-
-	    } // public function settings_edit()
-
-	    public function produkt_ajax() {
-
-			$product_id = intval($_REQUEST['edit_id']);
-
-			$file = ''; if (isset($_REQUEST['file'])) $file = rawurldecode($_REQUEST['file']);
-
-	        if ($_REQUEST['cmd'] === 'upload_file') {
-
-	            $this->fileUpload($product_id);
-
-	        } else if ($_REQUEST['cmd'] === 'pdffiles_list') {
-
-				echo $this->renderFilesList($product_id);
-
-				exit;
-
-	        } else if ($_REQUEST['cmd'] === 'delete_file') {
-
-	            unlink($this->getPDFPath($product_id).'/'.$file);
-
-	            echo '1'; exit;
-
-	        } else if ($_REQUEST['cmd'] === 'download_file') {
-
-	            wpsg_ob_end_clean();
-
-	            header('Content-Type: application/pdf');
-	            header('Content-Disposition: inline; filename="'.$file.'"');
-	            header('Cache-Control: private, max-age=0, must-revalidate');
-	            header('Pragma: public');
-
-	            echo file_get_contents($this->getPDFPath($product_id).'/'.$file);
-	            exit;
-
-	        }
-
-	    } // public function produkt_ajax()
-
-	    public function produkt_save(&$produkt_id) {
-
-	        if (wpsg_isSizedArray($_FILES['wpsg_mod_downloadplus_file']) && file_exists($_FILES['wpsg_mod_downloadplus_file']['tmp_name'])) {
-
-	            $bReturn = $this->fileUpload($produkt_id, false);
-
-	            if ($bReturn !== '1') {
-
-	                $this->shop->addBackendError($bReturn);
-
-	            } else {
-
-	                $this->shop->addBackendMessage(__('Datei fÃŒr das Downloadplus Modul erfolgreich hochgeladen.', 'wpsg'));
-
-	            }
-
-	        }
-
-	        $oProduct = wpsg_product::getInstance($produkt_id);
-
-	        if (isset($_REQUEST['mod_downloadplus_set'])) $oProduct->setMeta('mod_downloadplus_set', $_REQUEST['mod_downloadplus_set']);
-	        if (isset($_REQUEST['mod_downloadplus_template'])) $oProduct->setMeta('mod_downloadplus_template', $_REQUEST['mod_downloadplus_template']);
-	        if (isset($_REQUEST['mod_downloadplus_mode'])) $oProduct->setMeta('mod_downloadplus_mode', $_REQUEST['mod_downloadplus_mode']);
-
-	        if ($this->shop->hasMod('wpsg_mod_productvariants')) {
-
-	        	$oProduct->setMeta('mod_downloadplus_vari_template', json_encode($_REQUEST['vari_template']??[]));
-
-	        }
-
-	    } // public function produkt_save(&$produkt_id)
-
-	    /*
-	     * zeigt ein Upload-Formular im linken Bereich des Produktbackend an
-	    */
-	    public function product_addedit_content(&$product_content, &$product_data) {
-
-	        if (isset($_REQUEST['wpsg_lang']) || !wpsg_isSizedInt($product_data['id'])) return;
-
-	        if ($product_data['id'] > 0) {
-
-	        	/** @var wpsg_product $oProduct */
-	        	$oProduct = wpsg_product::getInstance(intval($product_data['id']));
-
-	            $this->shop->view['wpsg_mod_downloadplus'] = [
-	            	'set' => $oProduct->getMeta('mod_downloadplus_set', false, '0'),
-	            	'data' => $product_data,
-		            'mode' => $oProduct->getMeta('mod_downloadplus_mode', false, '0'),
-		            'template' => $oProduct->getMeta('mod_downloadplus_template', false, '0'),
-		            'filesList' => $this->renderFilesList($product_data['id'])
-	            ];
-
-	        }
-
-	        if ($this->shop->hasMod('wpsg_mod_productvariants')) {
-
-	        	$this->shop->view['wpsg_mod_downloadplus']['vari_template'] = json_decode($oProduct->getMeta('mod_downloadplus_vari_template'), true);
-
-	        }
-
-	        $this->shop->view['wpsg_mod_downloadplus']['arTemplates'] = $this->db->fetchAssocField("
-	            SELECT
-	                T.`id`,
-	            	CONCAT(T.`name`, ' (', (SELECT COUNT(*) FROM `".WPSG_TBL_DP_TEMPLATES_FIELD."` AS F WHERE F.`template_id` = T.`id`), ' ".__('Felder', 'wpsg')."', IF(T.`defaulttemplate` = '1',', Standard',''), ')') AS `label`
-	            FROM
-					`".WPSG_TBL_DP_TEMPLATES."` AS T
-				WHERE
-					T.`deleted` != '1'
-	        ", "id", "label");
-
-	        $product_content['wpsg_mod_downloadplus'] = array(
-	            'title' => __('DownloadPlus Produkt', 'wpsg'),
-	            'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/produkt_addedit_sidebar.phtml', false)
-	        );
-
-	    } //public function product_addedit_content(&$product_content, &$product_data)
-
-	    public function setOrderStatus($order_id, $status_id, $inform) {
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_indiv_mode') === '1' && $status_id == 100) { // Nach Zahlung planen
-
-	            $this->indivOrder($order_id);
-
-	        }
-
-	    } // public function setOrderStatus($order_id, $status_id, $inform)
-
-	    public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
-	    {
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_indiv_mode') != '2') return;
-
-	        $this->indivOrder($order_id);
-
-	    } // public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
-
-	    /**
-	     * Zeichnet die Dateiliste der PDFs
-	     */
-	    private function renderFilesList($produkt_id) {
-
-	        $this->shop->view['files'] = $this->getFiles($produkt_id, true);
-	        return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/filelist.phtml', false);
-
-	    } // private function renderFilesList($produkt_id)
-
-	    public function basket_toArray(&$produkt, $backend = false, $noMwSt = false)
-	    {
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_einsplusx') != '1')
-	        {
-
-	            if ($this->isPDFProdukt($produkt['id']))
-	            {
-
-	                if ($produkt['menge'] != 1)
-	                {
-
-	                    // Datei ist ein Downloadprodukt
-	                    $produkt['menge'] = '1';
-
-	                    // In der Session auch korrigieren
-	                    if (isset($_SESSION['wpsg']['basket']))
-	                    {
-	                        foreach ($_SESSION['wpsg']['basket'] as $k => $v) { { if ($v['id'] == $produkt['id']) $_SESSION['wpsg']['basket'][$k]['menge'] = 1; } }
-	                    }
-	                }
-
-	                $produkt['oneOnly'] = true;
-
-	            }
-
-	        }
-
-	    } // public function basket_toArray(&$produkt, $backend = false, $noMwSt = false)
-
-	    public function order_ajax() {
-
-		    $_REQUEST['edit_id'] = intval($_REQUEST['edit_id']??'');
-		    $_REQUEST['product_key'] = sanitize_text_field($_REQUEST['product_key']??'');
-		    $_REQUEST['product_index'] = intval($_REQUEST['product_index']??'');
-
-	        if ($_REQUEST['cmd'] == 'schedule_file') {
-
-	            $db_indiv = $this->db->fetchRow("
+			
+		   	dbDelta($sql);
+		   	
+		   	// AbwÃ€rtskombatibilitÃ€t mit DLPlus
+			if ($this->shop->isMultiBlog())
+			{
+				
+				$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_dlplus/'; 
+				$new_path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_pdfprodukte/'.$produkt_id.'/';
+				
+			}
+			else
+			{
+					 
+				$path = WP_CONTENT_DIR.'/uploads/wpsg_dlplus/';
+				$new_path = WP_CONTENT_DIR.'/uploads/wpsg_pdfprodukte/'.$produkt_id.'/';					
+				
+			}
+			
+			if (file_exists($path))
+			{
+				
+				rename($path, $new_path);
+				
+			}
+		   	
+			// Standardwerte
+			$this->shop->checkDefault('wpsg_mod_downloadplus_filename', '%order_id%-%filename%');
+			$this->shop->checkDefault('wpsg_mod_downloadplus_shipping', '1');
+			$this->shop->checkDefault('wpsg_mod_downloadplus_memorylimit', '1');	
+			$this->shop->checkDefault('wpsg_mod_downloadplus_timelimit', '1');
+			$this->shop->checkDefault('wpsg_mod_downloadplus_numberformat', '%download_nr%');
+			$this->shop->checkDefault('wpsg_mod_downloadplus_startnumber', '1');
+			
+		} // public function install()
+		
+		public function delOrder(&$order_id) 
+		{ 
+			
+			$this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".wpsg_q($order_id)."'");
+			
+			// Individualisierte Dateien lÃ¶schen
+			$path = $this->getPDFIndivPath($order_id); wpsg_rrmdir($path);
+			
+		} // public function delOrder(&$order_id)
+		
+		public function wpsg_enqueue_scripts()
+		{
+			
+			if (is_admin())
+			{
+			
+				wp_enqueue_script('wpsg_ajaxupload', $this->shop->getRessourceURL('js/ajaxupload.js'));
+				
+			}
+			
+		} // function wpsg_enqueue_scripts()
+		
+		public function admin_emailconf() 
+		{ 
+			
+			echo wpsg_drawEMailConfig(
+				'pdfdownloadfiles',
+				__('PDFdownload E-Mail', 'wpsg'),
+				__('E-Mail mit Links zu den PDFs die an den Kunden geht.', 'wpsg')); 
+			
+			echo wpsg_drawEMailConfig(
+				'pdfdownloadcronmail',
+				__('PDFdownload Cron E-Mail', 'wpsg'),
+				__('E-Mail mit Informationen zu der PDF Individualisierung die vom Cron verschickt wird. (An Admin!).', 'wpsg'),
+				true);
+						
+		} // public function admin_emailconf()
+		
+		public function admin_emailconf_save()
+		{
+			
+			wpsg_saveEMailConfig("pdfdownloadfiles");
+			wpsg_saveEMailConfig("pdfdownloadcronmail");
+			 
+		} // public function admin_emailconf_save()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_downloadplus_text', $_REQUEST['text']);
+			$this->shop->update_option('wpsg_mod_downloadplus_filename', $_REQUEST['wpsg_mod_downloadplus_filename']);
+			$this->shop->update_option('wpsg_mod_downloadplus_indiv_mode', $_REQUEST['wpsg_mod_downloadplus_indiv_mode']);
+			$this->shop->update_option('wpsg_mod_downloadplus_autosend', $_REQUEST['wpsg_mod_downloadplus_autosend']);
+			$this->shop->update_option('wpsg_mod_downloadplus_shipping', $_REQUEST['wpsg_mod_downloadplus_shipping']);		
+			$this->shop->update_option('wpsg_mod_downloadplus_einsplusx', $_REQUEST['wpsg_mod_downloadplus_einsplusx']);	
+			$this->shop->update_option('wpsg_mod_downloadplus_accepted', $_REQUEST['wpsg_mod_downloadplus_accepted']);
+			$this->shop->update_option('wpsg_mod_downloadplus_days', $_REQUEST['wpsg_mod_downloadplus_days']);
+			$this->shop->update_option('wpsg_mod_downloadplus_downloads', $_REQUEST['wpsg_mod_downloadplus_downloads']);
+			$this->shop->update_option('wpsg_mod_downloadplus_cleanraiddownloads', $_REQUEST['wpsg_mod_downloadplus_cleanraiddownloads']);
+			$this->shop->update_option('wpsg_mod_downloadplus_cleanolddownloads', $_REQUEST['wpsg_mod_downloadplus_cleanolddownloads']);			
+			$this->shop->update_option('wpsg_mod_downloadplus_pdfpath', $_REQUEST['wpsg_mod_downloadplus_pdfpath']);
+			$this->shop->update_option('wpsg_mod_downloadplus_pdfindivpath', $_REQUEST['wpsg_mod_downloadplus_pdfindivpath']);
+			$this->shop->update_option('wpsg_mod_downloadplus_range', $_REQUEST['wpsg_mod_downloadplus_range']);
+			$this->shop->update_option('wpsg_mod_downloadplus_range_von', $_REQUEST['wpsg_mod_downloadplus_range_von']);
+			$this->shop->update_option('wpsg_mod_downloadplus_range_bis', $_REQUEST['wpsg_mod_downloadplus_range_bis']);
+			$this->shop->update_option('wpsg_mod_downloadplus_masterpass', $_REQUEST['wpsg_mod_downloadplus_masterpass']);
+			$this->shop->update_option('wpsg_mod_downloadplus_openpass', $_REQUEST['wpsg_mod_downloadplus_openpass']);
+			$this->shop->update_option('wpsg_mod_downloadplus_securitysave', $_REQUEST['wpsg_mod_downloadplus_securitysave']);
+			$this->shop->update_option('wpsg_mod_downloadplus_securityprint', $_REQUEST['wpsg_mod_downloadplus_securityprint']);
+			$this->shop->update_option('wpsg_mod_downloadplus_securitymod', $_REQUEST['wpsg_mod_downloadplus_securitymod']);
+			$this->shop->update_option('wpsg_mod_downloadplus_securitynote', $_REQUEST['wpsg_mod_downloadplus_securitynote']);
+			$this->shop->update_option('wpsg_mod_downloadplus_format', $_REQUEST['wpsg_mod_downloadplus_format']);			
+			$this->shop->update_option('wpsg_mod_downloadplus_memorylimit', $_REQUEST['wpsg_mod_downloadplus_memorylimit']);
+			$this->shop->update_option('wpsg_mod_downloadplus_timelimit', $_REQUEST['wpsg_mod_downloadplus_timelimit']);
+			$this->shop->update_option('wpsg_mod_downloadplus_numberformat', $_REQUEST['wpsg_mod_downloadplus_numberformat']);
+			$this->shop->update_option('wpsg_mod_downloadplus_startnumber', $_REQUEST['wpsg_mod_downloadplus_startnumber']);
+			$this->shop->update_option('wpsg_mod_downloadplus_attachement', $_REQUEST['wpsg_mod_downloadplus_attachement']);
+			
+		} // public function settings_save()
+		
+		public function settings_edit()
+		{
+			
+			$font_path = WPSG_PATH_LIB.'fpdf/font/';
+			
+			$arFontFiles = scandir($font_path);
+			
+			foreach ($arFontFiles as $k => $v)
+			{
+								
+				$file = $font_path.$v;
+				
+				if (is_file($file) && file_exists($file) && preg_match('/(.*)\.php$/i', $v))
+				{
+					
+					$this->shop->view['wpsg_mod_downloadplus']['arFonts'][$v] = ucfirst(preg_replace('/\.php$/i', '', $v)); 
+					
+				}
+				
+				
+			}
+			
+			$this->shop->view['wpsg_mod_downloadplus']['barCodeFonts'] = $this->barCodeFonts;
+			
+			// Barcode
+			$this->shop->view['wpsg_mod_downloadplus']['arFonts']['EAN13'] = 'EAN 13';
+			$this->shop->view['wpsg_mod_downloadplus']['arFonts']['Code128'] = 'Code 128';
+			$this->shop->view['wpsg_mod_downloadplus']['arFonts']['UPC_A'] = 'UPC-A';
+			 
+			$this->shop->view['arTexte'] = $this->shop->get_option('wpsg_mod_downloadplus_text');
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/settings_edit.phtml');
+						
+		} // public function settings_edit()
+		
+		public function produkt_ajax() 
+		{
+			
+			if ($_REQUEST['cmd'] == 'upload_file')
+			{
+				
+				$this->fileUpload(wpsg_q($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'pdffiles_list')
+			{
+				
+				die($this->renderFilesList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'delete_file')
+			{
+				
+				unlink($this->getPDFPath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['file']));
+				die("1");
+				
+			}
+			else if ($_REQUEST['cmd'] == 'download_file')
+			{
+				
+				wpsg_ob_end_clean();
+				
+				header('Content-Type: application/pdf');
+				header('Content-Disposition: inline; filename="'.rawurldecode($indiv_db['out_file']).'"');
+				header('Cache-Control: private, max-age=0, must-revalidate');
+				header('Pragma: public'); 
+								
+				die(file_get_contents($this->getPDFPath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['file'])));
+				
+			}
+			
+		} // public function produkt_ajax()
+		
+		public function produkt_save(&$produkt_id) 
+		{ 
+
+			if (wpsg_isSizedArray($_FILES['wpsg_mod_downloadplus_file']) && file_exists($_FILES['wpsg_mod_downloadplus_file']['tmp_name']))
+			{
+		 
+				$bReturn = $this->fileUpload($produkt_id, false);
+				
+				if ($bReturn !== '1')
+				{
+					
+					$this->shop->addBackendError($bReturn);
+					
+				}
+				else
+				{
+					
+					$this->shop->addBackendMessage(__('Datei fÃŒr das Downloadplus Modul erfolgreich hochgeladen.', 'wpsg'));
+					
+				}
+				
+			}
+			
+		} // public function produkt_save(&$produkt_id)
+		
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{
+
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			if ($produkt_data['id'] > 0)
+			{
+				
+				$this->shop->view['data'] = $produkt_data;
+				$this->shop->view['filesList'] = $this->renderFilesList($produkt_data['id']);
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/produkt_edit_sidebar.phtml');
+				
+			}
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		 
+		public function setOrderStatus($order_id, $status_id, $inform)
+		{
+			
+			if ($this->shop->get_option('wpsg_mod_downloadplus_indiv_mode') == '1' && $status_id == 100) // Nach Zahlung planen
+			{
+				
+				$this->indivOrder($order_id);
+				
+			}
+			
+		} // public function setOrderStatus($order_id, $status_id, $inform)
+		
+		public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
+		{
+
+			if ($this->shop->get_option('wpsg_mod_downloadplus_indiv_mode') != '2') return;
+			
+			$this->indivOrder($order_id);
+
+		} // public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
+		
+		/**
+		 * Zeichnet die Dateiliste der PDFs
+		 */
+		private function renderFilesList($produkt_id)
+		{
+			
+			$this->shop->view['files'] = $this->getFiles($produkt_id);			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/filelist.phtml', false);
+			
+		} // private function renderFilesList($produkt_id)
+		
+		public function basket_toArray(&$produkt, $backend = false, $noMwSt = false)
+		{
+		
+			if ($this->shop->get_option('wpsg_mod_downloadplus_einsplusx') != '1')
+			{
+		 
+				if ($this->isPDFProdukt($produkt['id']))
+				{
+		
+					if ($produkt['menge'] != 1)
+					{
+							
+						// Datei ist ein Downloadprodukt
+						$produkt['menge'] = '1';
+		
+						// In der Session auch korrigieren
+						foreach ($_SESSION['wpsg']['basket'] as $k => $v) { { if ($v['id'] == $produkt['id']) $_SESSION['wpsg']['basket'][$k]['menge'] = 1; } }
+							
+					}
+						
+					$produkt['oneOnly'] = true;
+						
+				}
+		
+			}
+				
+		} // public function basket_toArray(&$produkt, $backend = false, $noMwSt = false)
+		
+		public function order_ajax() { 
+						
+			if ($_REQUEST['cmd'] == 'schedule_file')
+			{
+								
+				$db_indiv = $this->db->fetchRow("
 					SELECT 
 						`id`
@@ -573,691 +356,787 @@
 						`product_index` = '".wpsg_q($_REQUEST['product_index'])."' 
 				");
-
-	            if ($db_indiv['id'] > 0) {
-
-	                $new_name = $this->getNewName($_REQUEST['file'], $_REQUEST['edit_id'], $_REQUEST['product_key'], $db_indiv['downloadnr'], $_REQUEST['product_index']);
-
-	                $this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array(
-	                    "scheduled" => "NOW()",
-	                    "out_file" => wpsg_q($new_name)
-	                ), "`id` = '".wpsg_q($db_indiv['id'])."'");
-
-	            } else {
-
-	                $download_nr = $this->getDownloadNr($_REQUEST['edit_id'], $_REQUEST['product_key'], $_REQUEST['product_index']);
-
-	                $new_name = $this->getNewName($_REQUEST['file'], $_REQUEST['edit_id'], $_REQUEST['product_key'], $download_nr, $_REQUEST['product_index']);
-
-	                $oProduct = wpsg_product::getInstance($_REQUEST['product_key']);
-
-	                $this->db->ImportQuery(WPSG_TBL_PDFINDIV, array(
-	                    "o_id" => wpsg_q($_REQUEST['edit_id']),
-	                    "p_key" => wpsg_q($_REQUEST['product_key']),
-	                    'product_index' => wpsg_q($_REQUEST['product_index']),
-	                    "downloadnr" => wpsg_q($download_nr),
-	                    "file" => wpsg_q($_REQUEST['file']),
-	                    "scheduled" => "NOW()",
-	                    "out_file" => wpsg_q($new_name),
-		                'mode' => $oProduct->getMeta('mod_downloadplus_mode'),
-		                'template' => $this->getTemplateIdFromProduct($_REQUEST['product_key'])
-	                ));
-
-	            }
-
-	            $this->arMessage[] = __('Datei wurde geplant.', 'wpsg');
-
-	            die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
-
-	        } else if ($_REQUEST['cmd'] == 'reindiv') {
-
-	            $this->indivOrder($_REQUEST['edit_id']);
-
-	            $this->arMessage[] = __('Bestellung wurde geplant.', 'wpsg');
-
-	            die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
-
-	        }
-	        else if ($_REQUEST['cmd'] == 'reset')
-	        {
-
-	            $this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array("counter" => "0"), "`o_id` = '".wpsg_q($_REQUEST['edit_id'])."'");
-
-	            $this->arMessage[] = __('DownloadzÃ€hler wurden zurÃŒckgesetzt.', 'wpsg');
-
-	            die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
-
-	        }
-	        else if ($_REQUEST['cmd'] == 'send_files')
-	        {
-
-	            $this->sendFiles($_REQUEST['edit_id']);
-
-	            die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
-
-	        }
-	        else if ($_REQUEST['cmd'] == 'cancelschedule_file')
-	        {
-
-	            $this->db->Query("
-						DELETE FROM
-							`".WPSG_TBL_PDFINDIV."`
-						WHERE
-							`file` = '".wpsg_q($_REQUEST['file'])."' AND
-							`o_id` = '".wpsg_q($_REQUEST['edit_id'])."' AND
-							`p_key` = '".wpsg_q($_REQUEST['product_key'])."'
-					");
-
-	            $this->arMessage[] = __('Planung wurde storniert.', 'wpsg');
-
-	            die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
-
-	        }
-	        else if ($_REQUEST['cmd'] == 'download_indivfile') {
-
-	            $order_id = intval($_REQUEST['edit_id']);
-	            $product_key = $_REQUEST['product_key'];
-	            $product_id = intval($this->shop->getProduktID($product_key));
-				
-	            check_admin_referer('wpsg-dp-download-'.$order_id.'-'.$product_key);
-
-	            wpsg_ob_end_clean();
-
-	            header('Content-Type: application/pdf');
-	            header('Content-Disposition: inline; filename="'.rawurldecode(basename($_REQUEST['file'])).'"');
-	            header('Cache-Control: private, max-age=0, must-revalidate');
-	            header('Pragma: public');
-
-	            if (isset($_REQUEST['clear'])) die(file_get_contents($this->getPDFIndivPath($order_id).'/clear_'.rawurldecode($_REQUEST['file'])));
-	            else die(file_get_contents($this->getPDFIndivPath($order_id).'/'.rawurldecode($_REQUEST['file'])));
-
-	        }
-
-	    } // public function order_ajax()
-
-	    public function order_view($order_id, &$arSidebarArray) {
-
-	        $bPDFProdukt = false;
-	        $arFiles = array();
-
-	        // Die arFiles brauch ich um zu bestimmen ob Produkte gekauft wurden, die Downloads enthalten
-	        foreach ($this->shop->view['basket']['produkte'] as $k => $v) {
-
-	            $this->shop->view['arProducts'][$k] = $v;
-
-	            if ($this->isPDFProdukt($v['id'])) {
-
-	                $bPDFProdukt = true;
-
-	                $product_id = $this->shop->getProduktID($v['id']);
-
-	                // Hier darf das wpsg_array_merge nicht verwendet werden, da der Index nicht ÃŒberschrieben werden darf
-	                //$arFiles = array_merge($arFiles, $this->getFiles($v['id']));
-	                $arFiles_product = $this->getfiles($v['id']);
-
-	                foreach ($arFiles_product as $file_product) {
-
-	                    $arFiles[] = array($product_id, $file_product);
-
-	                }
-
-	            }
-
-	        }
-
-	        if ($bPDFProdukt && sizeof($arFiles) > 0) {
-
-	            $this->shop->view['order_id'] = $order_id;
-
-	            $arSidebarArray[$this->id] = array(
-	                'title' => $this->name,
-	                'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/order_view_sidebar.phtml', false)
-	            );
-
-	        }
-
-	    } // public function order_view($order_id, &$arSidebarArray)
-
-	    public function order_view_sidebar_renderList($order_id) {
-
-	        $bPDFProdukt = false;
-	        $arFiles = array();
-
-	        $oOrder = wpsg_order::getInstance($order_id);
-
-	        foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-
-	        	$product_key = $oOrderProduct->getProductKey();
-	        	$product_files = $this->getFiles($product_key);
-
-	        	foreach ($product_files as $file) {
-
-	        		$bPDFProdukt = true;
-                    $arFiles[] = array($product_key, $file, $oOrderProduct->getProductIndex());
-
-                }
-
-	        }
-
-	        $arIndivIDs = array();
-
-	        if ($bPDFProdukt && wpsg_isSizedArray($arFiles)) {
-
-	            $arFiles = wpsg_array_unique($arFiles);
-
-	            foreach ($arFiles as $k => $v) {
-
-	                $db_indiv = $this->db->fetchRow("
+								
+				if ($db_indiv['id'] > 0)
+				{
+					
+					$new_name = $this->getNewName($_REQUEST['file'], $_REQUEST['edit_id'], $_REQUEST['product_key'], $db_indiv['downloadnr'], $_REQUEST['product_index']);
+					
+					$this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array(
+						"scheduled" => "NOW()",
+						"out_file" => wpsg_q($new_name)
+					), "`id` = '".wpsg_q($db_indiv['id'])."'");
+					
+				}
+				else
+				{
+					
+					$download_nr = $this->getDownloadNr($_REQUEST['edit_id'], $_REQUEST['product_key'], $_REQUEST['product_index']);
+					
+					$new_name = $this->getNewName($_REQUEST['file'], $_REQUEST['edit_id'], $_REQUEST['product_key'], $download_nr, $_REQUEST['product_index']);
+					
+					$this->db->ImportQuery(WPSG_TBL_PDFINDIV, array(
+						"o_id" => wpsg_q($_REQUEST['edit_id']),
+						"p_key" => wpsg_q($_REQUEST['product_key']),
+						'product_index' => wpsg_q($_REQUEST['product_index']),
+						"downloadnr" => wpsg_q($download_nr),
+						"file" => wpsg_q($_REQUEST['file']),
+						"scheduled" => "NOW()",
+						"out_file" => wpsg_q($new_name)
+					));
+					
+				}
+				
+				$this->arMessage[] = __('Datei wurde geplant.', 'wpsg');
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'reindiv')
+			{
+				
+				$this->indivOrder($_REQUEST['edit_id']);
+				
+				$this->arMessage[] = __('Bestellung wurde geplant.', 'wpsg');
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'reset')
+			{
+				
+				$this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array("counter" => "0"), "`o_id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+				
+				$this->arMessage[] = __('DownloadzÃ€hler wurden zurÃŒckgesetzt.', 'wpsg');
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'send_files')
+			{
+				
+				$this->sendFiles($_REQUEST['edit_id']);
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'cancelschedule_file')
+			{
+				
+				$this->db->Query("
+					DELETE FROM
+						`".WPSG_TBL_PDFINDIV."`
+					WHERE
+						`file` = '".wpsg_q($_REQUEST['file'])."' AND
+						`o_id` = '".wpsg_q($_REQUEST['edit_id'])."' AND
+						`p_key` = '".wpsg_q($_REQUEST['product_key'])."'
+				");
+				
+				$this->arMessage[] = __('Planung wurde storniert.', 'wpsg');
+				 
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'download_indivfile')
+			{
+				
+				wpsg_ob_end_clean();
+				
+				header('Content-Type: application/pdf');
+				header('Content-Disposition: inline; filename="'.rawurldecode($indiv_db['out_file']).'"');
+				header('Cache-Control: private, max-age=0, must-revalidate');
+				header('Pragma: public'); 
+								
+				die(file_get_contents($this->getPDFIndivPath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['file'])));
+				
+			}
+			
+		} // public function order_ajax()
+		
+		public function order_view_sidebar(&$order_id)
+		{
+			
+			$bPDFProdukt = false;
+			$arFiles = array();
+			
+			// Die arFiles brauch ich um zu bestimmen ob Produkte gekauft wurden, die Downloads enthalten
+			foreach ($this->shop->view['basket']['produkte'] as $k => $v)
+			{
+				
+				$this->shop->view['arProducts'][$k] = $v;
+				
+				if ($this->isPDFProdukt($v['id']))
+				{
+					
+					$bPDFProdukt = true;
+					
+					$product_id = $this->shop->getProduktID($v['id']);
+					
+					// Hier darf das wpsg_array_merge nicht verwendet werden, da der Index nicht ÃŒberschrieben werden darf
+					//$arFiles = array_merge($arFiles, $this->getFiles($v['id']));
+					$arFiles_product = $this->getfiles($v['id']);
+					
+					foreach ($arFiles_product as $file_product)
+					{
+						
+						$arFiles[] = array($product_id, $file_product);
+						
+					}
+					
+				}
+				
+			}
+			
+			if ($bPDFProdukt && sizeof($arFiles) > 0)
+			{
+				 											
+				$this->shop->view['order_id'] = $order_id;
+				
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/order_view_sidebar.phtml');				
+				
+			}
+			
+		} // public function order_view_sidebar($order_id) 
+		
+		public function order_view_sidebar_renderList($order_id) {
+			
+			$bPDFProdukt = false;
+			$arFiles = array();
+			
+			$arBasket = $this->shop->cache->loadBasketArray($order_id);
+ 						
+			foreach ($arBasket['produkte'] as $k => $v)
+			{
+ 
+				if ($this->isPDFProdukt($v['id']))
+				{
+					 
+					$bPDFProdukt = true;
+					
+					if (wpsg_isSizedString($v['mod_vp_varkey'])) $product_key = $v['mod_vp_varkey']; else $product_key = $v['productkey'];
+					
+					//$product_id = $this->shop->getProduktID($v['id']);
+					
+					// Hier darf das wpsg_array_merge nicht verwendet werden, da der Index nicht ÃŒberschrieben werden darf 
+					//$arFiles = array_merge($arFiles, $this->getFiles($v['id']));
+					
+					$product_files = $this->getFiles($v['id']);
+					
+					foreach ($product_files as $file)
+					{
+										
+						$arFiles[] = array($product_key, $file, $v['product_index']);
+					
+					}
+						
+				}
+				
+			}
+			
+			$arIndivIDs = array();
+			
+			if ($bPDFProdukt && wpsg_isSizedArray($arFiles))
+			{
+				
+				$arFiles = wpsg_array_unique($arFiles);
+				
+				foreach ($arFiles as $k => $v)
+				{
+					
+					$db_indiv = $this->db->fetchRow("
 						SELECT 
 							* 
 						FROM 
 							`".WPSG_TBL_PDFINDIV."` 
-						WHERE
+						WHERE 
+							`file` = '".wpsg_q($v[1])."' AND
 							`p_key` = '".wpsg_q($v[0])."' AND
 							`o_id` = '".wpsg_q($order_id)."' AND
 							`product_index` = '".wpsg_q($v[2])."'
-					"); // `file` = '".wpsg_q($v[1])."' AND
-
-	                if (!wpsg_isSizedInt($db_indiv['id'])) {
-
-	                	unset($arFiles[$k]); continue;
-
-	                }
-
-	                $clear_file = $this->getPDFIndivPath($order_id).'clear_'.$db_indiv['out_file'];
-
-	                if (file_exists($clear_file)) {
-
-	                    $db_indiv['clear_file'] = true;
-
-	                } else {
-
-	                    $db_indiv['clear_file'] = false;
-
-	                }
-
-	                if ($db_indiv['id'] > 0) {
-
-	                    $arIndivIDs[] = $db_indiv['id'];
-
-	                    $db_indiv['raid'] = false;
-
-	                    if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $db_indiv['counter'] >= $this->shop->get_option('wpsg_mod_downloadplus_downloads')) {
-
-	                        $db_indiv['raid'] = true;
-
-	                    }
-
-	                    if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && strtotime($db_indiv['done']) > 0 && time() > (strtotime($db_indiv['done']) + ($this->shop->get_option('wpsg_mod_downloadplus_days') * 86400))) {
-
-	                        $db_indiv['raid'] = true;
-
-	                    }
-
-	                    $arFiles[$k][3] = $db_indiv;
-
-	                } else {
-
-	                    $arFiles[$k][3] = false;
-
-	                }
-
-	            }
-
-	            // Jetzt noch eventuell individualisierte Dokumente laden die in den Produkten gelÃ¶scht wurden
-	            if (wpsg_isSizedArray($arIndivIDs)) {
-
-	                $arDbIndivDeleted = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` NOT IN (".implode(",", $arIndivIDs).") AND `o_id` = '".wpsg_q($order_id)."'");
-
-	                foreach ($arDbIndivDeleted as $v) {
-
-	                	$product_id = $this->shop->getProduktID($v['p_key']);
-
-	                	$clear_file = $this->getPDFIndivPath($order_id).'clear_'.$v['out_file'];
-
-		                if (file_exists($clear_file)) {
-
-		                    $v['clear_file'] = true;
-
-		                } else {
-
-		                    $v['clear_file'] = false;
-
-		                }
-
-	                    $arFiles[] = array($product_id, $v['file'], false, $v);
-
-	                }
-
-	            }
-
-	            $this->shop->view['messages'] = $this->arMessage;
-	            $this->shop->view['errors'] = $this->arError;
-	            $this->shop->view['arFiles'] = $arFiles;
-
-	            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml');
-
-	        }
-
-	    } // public function order_view_sidebar_renderList($order_id)
-
-	    public function addShipping(&$arShipping, $va_active = false)
-	    {
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_shipping') != '1') return;
-
-	        $arShipping[$this->id] = array(
-				'active' => '1',
-	            'id' => $this->id,
-	            'name' => __('Versand per Mail', 'wpsg'),
-	            'price' => 0,
-	            'tax_key' => 0
-	        );
-
-	    } // public function addShipping(&$arShipping)
-
-	    /**
-	     * lÃ€dt eine Datei in das entspr. upload Verzeichnis
-	     */
-	    private function fileUpload($produkt_id, $die = true)
-	    {
-
-	        if (file_exists($_FILES['wpsg_mod_downloadplus_file']['tmp_name'][0]))
-	        {
-
-	            $ending = strtolower(preg_replace('/(.*)\./', '', $_FILES['wpsg_mod_downloadplus_file']['name'][0]));
-
-	            if (!in_array($ending, $this->valid_ending))
-	            {
-
-	                if (!$die) return __('UngÃŒltige Dateiendung.', 'wpsg');
-	                else die(__('UngÃŒltige Dateiendung.', 'wpsg'));
-
-	            }
-	            else
-	            {
-
-	                $uploaddir = $this->getPDFPath($produkt_id);
-	                if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
-
-	                $uploadfile = $uploaddir.\sanitize_file_name(basename($_FILES['wpsg_mod_downloadplus_file']['name'][0]));
-
-	                move_uploaded_file($_FILES['wpsg_mod_downloadplus_file']['tmp_name'][0], $uploadfile);
-
-	                if (!$die) return '1';
-	                else die('1');
-
-
-	            }
-
-	        }
-	        else
-	        {
-
-	            if (!$die) return __('Fehler beim Upload.', 'wpsg');
-	            else die(__('Fehler beim Upload.', 'wpsg'));
-
-	        }
-
-	    } // private function fileUpload($produkt_id)
-
-	    /**
-	     * Individualisiert das PDF $src_file und speichert es unter $trg_file, Absolute Pfade
-	     */
-	    private function indivPDF($p_key, $src_file, $trg_file, $order_id, $download_nr, $indiv_id, $product_index, $paintBackground = true) {
-
-			$p_id = $this->shop->getProduktID($p_key);
-			$indiv = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($indiv_id)."' ");
-
-			$varName = '';
-			$varName_checkbox = ''; // Spezialfall
-
-			if ($this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProduct', array($p_id))) {
-
-				$variInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p_key));
-
-				if (wpsg_isSizedArray($variInfo)) {
-
-					foreach ($variInfo as $k => $v) {
-
-						if (is_numeric($k)) {
-
-							if ($v['value'] !== 'Nein') $varName_checkbox .= ' '.$v['name'];
-
+					");
+										
+					if ($db_indiv['id'] > 0)
+					{
+						
+						$arIndivIDs[] = $db_indiv['id'];
+						
+						$db_indiv['raid'] = false;
+						
+						if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $db_indiv['counter'] >= $this->shop->get_option('wpsg_mod_downloadplus_downloads'))
+						{
+							$db_indiv['raid'] = true;
 						}
-
+						
+						if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && strtotime($db_indiv['done']) > 0 && time() > (strtotime($db_indiv['done']) + ($this->shop->get_option('wpsg_mod_downloadplus_days') * 86400)))
+						{
+							$db_indiv['raid'] = true;
+						}
+						
+						//$arFiles[$k] = array($v, $db_indiv);
+						$arFiles[$k][3] = $db_indiv;
+						
 					}
-
-					$varName = $variInfo['key'];
-
-				}
-
-			}
-
-			$varName_checkbox = trim($varName_checkbox);
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_memorylimit') == '1') ini_set('memory_limit', '2000M');
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_timelimit') == '1') set_time_limit(3600);
-
-			require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-			require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
-			require_once WPSG_PATH_LIB.'FpdiProtection_2/autoload.php';
-	        require_once WPSG_PATH_MOD."mod_downloadplus/wpsg_fpdf.php";
-
-	        $pi = pathinfo($src_file);
-
-	        if (in_array(strtolower($pi['extension']), $this->valid_ending)) {
-
-	            $pdf = new wpsg_dl_fpdf();
-
-	            $pdf->setSourceFile($src_file);
-
-	            $tplidx = $pdf->importPage(1, '/MediaBox');
-	            $size = $pdf->getTemplateSize($tplidx);
-
-	            if (!wpsg_isSizedArray($size)) throw new \Exception(__('Konnte PDF nicht lesen', 'wpsg'));
-
-	            $w = $size['width']; $h = $size['height'];
-	            $orientation = (($h > $w)?'P':'L');
-
-	            $pdf = new wpsg_dl_fpdf($orientation, "mm", array($w, $h));;
-
-				if ($this->shop->get_option("wpsg_mod_downloadplus_setpwd") == "1") {
-
-					$arRights = array();
-
-					if ($this->shop->get_option("wpsg_mod_downloadplus_securitysave") == "1") $arRights[] = "copy";
-					if ($this->shop->get_option("wpsg_mod_downloadplus_securityprint") == "1") $arRights[] = "print";
-					if ($this->shop->get_option("wpsg_mod_downloadplus_securitymod") == "1") $arRights[] = "modify";
-					if ($this->shop->get_option("wpsg_mod_downloadplus_securitynote") == "1") $arRights[] = "annot-forms";
+					else
+					{
+						
+						//$arFiles[$k] = array($v, false);
+						$arFiles[$k][3] = false;
+						
+					}
+					
+				}
+				
+				// Jetzt noch eventuell individualisierte Dokumente laden die in den Produkten gelÃ¶scht wurden
+				if (wpsg_isSizedArray($arIndivIDs))
+				{
+				
+					$arDbIndivDeleted = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` NOT IN (".implode(",", $arIndivIDs).") AND `o_id` = '".wpsg_q($order_id)."'");
+					
+					foreach ($arDbIndivDeleted as $v)
+					{
+						
+						//$arFiles[] = array($v['file'], $v);
+						$arFiles[] = array($v['p_id'], $v['file'], false, $v);
+						
+					}
+					
+				}
+				
+				$this->shop->view['messages'] = $this->arMessage;
+				$this->shop->view['errors'] = $this->arError;
+				$this->shop->view['arFiles'] = $arFiles;
+				
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml');				
+				
+			}
+			
+		} // public function order_view_sidebar_renderList($order_id)
+		 
+		public function addShipping(&$arShipping) 
+		{ 
+			
+			if ($this->shop->get_option('wpsg_mod_downloadplus_shipping') != '1') return;
+			
+			$arShipping[$this->id] = array(
+				'id' 			=> $this->id,
+				'name' 			=> __('Versand per Mail', 'wpsg'),
+				'preis' 		=> 0,
+				'preis_calc' 	=> 0,			
+				'mwst' 			=> 0,
+				'mwst_value' 	=> 0
+			);
+			 
+		} // public function addShipping(&$arShipping) 
+		
+		public function checkShippingAvailable(&$arShipping, &$arBasket) 
+		{ 
+			
+			if (!array_key_exists($this->id, $arShipping)) return;
+			
+			$bPDF = false; $bOther = false;
+			
+			foreach ((array)$arBasket['produkte'] as $p)
+			{
+								
+				if ($this->isPDFProdukt($p['id']))
+				{
+					
+					$bPDF = true;
+					
+				}
+				else
+				{
+					
+					$bOther = true;
+					
+				} 
+				
+			} 
+			
+			if (!$bPDF || $bOther)
+			{
+				
+				unset($arShipping[$this->id]);
+				
+			}
+			else
+			{
+				
+				// Wenn Downloadprodukt dann alle anderen entfernen
+				foreach ($arShipping as $k => $v) { if ($k != $this->id) { unset($arShipping[$k]); } }
+			  
+			}
+			
+		} // public function checkShippingAvailable(&$arShipping, &$arBasket)
+		
+		/** 
+		 * lÃ€dt eine Datei in das entspr. upload Verzeichnis
+		 */
+		private function fileUpload($produkt_id, $die = true)
+		{
+			
+			if (file_exists($_FILES['wpsg_mod_downloadplus_file']['tmp_name']))
+			{
+				
+				$ending = strtolower(preg_replace('/(.*)\./', '', $_FILES['wpsg_mod_downloadplus_file']['name']));
+				
+				if (!in_array($ending, $this->valid_ending))
+				{
+
+					if (!$die) return __('UngÃŒltige Dateiendung.', 'wpsg');
+					else die(__('UngÃŒltige Dateiendung.', 'wpsg'));
+					
+				}
+				else
+				{
+				
+					$uploaddir = $this->getPDFPath($produkt_id);				
+					if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
+				
+					$uploadfile = $uploaddir.basename($_FILES['wpsg_mod_downloadplus_file']['name']);					
+					move_uploaded_file($_FILES['wpsg_mod_downloadplus_file']['tmp_name'], $uploadfile);
+				
+					if (!$die) return '1';
+					else die('1');
+					
+					
+				}
+				
+			}
+			else 
+			{
+			
+				if (!$die) return __('Fehler beim Upload.', 'wpsg');
+				else die(__('Fehler beim Upload.', 'wpsg'));
+				
+			}
+			
+		} // private function fileUpload($produkt_id)
+		
+		/**
+		 * Individualisiert das PDF $src_file und speichert es unter $trg_file, Absolute Pfade
+		 */
+		private function indivPDF($p_key, $src_file, $trg_file, $order_id, $download_nr, $indiv_id, $product_index)
+		{
+			
+			if (preg_match('/^vp_(.*)/', $p_key))
+			{
+				
+				$p_id = preg_replace('/(^vp_)|(\/(.*))/', '', $p_key);
+				
+			}
+			else 
+			{
+				
+				$p_id = $p_key;
+				
+			}
+					
+			$arProduct = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".$p_id."'");
+			
+			if (preg_match('/^vp_(.*)/', $p_key))
+			{
+				
+				$variInfo = $this->shop->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($p_key));
+				
+				if (wpsg_isSizedArray($variInfo))
+				{
+				
+					foreach ($variInfo as $k => $v)
+					{
+						
+						if (is_numeric($k)) $arProduct['preis'] += $v['preis'];
+						
+					}
+					
+				}
+				
+			}
+			
+			if (wpsg_isSizedString($arProduct['mod_varianten']))
+			{
+				
+				$arPkeys = $this->db->fetchAssoc("SELECT `p_key` FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".$order_id."'");
+				
+				$arVarianten = $this->shop->callMod('wpsg_mod_varianten', 'loadVarianten', array($p_id));
+				
+				$strVarKey = preg_replace('/(^vp_\d+\/)/', '', $p_key);
+
+				if (strpos($strVarKey, ':'))
+				{
+					
+					$arVar = explode(':', $strVarKey);
+					
+					$varName = '';
+					
+					foreach ($arVar as $vars)
+					{
+						
+						$arPvar = explode('_', $vars);
+						
+						if ($arPvar[1] == 1 && $arVarianten[$arPvar[0]]['typ'] == 'checkbox')
+						{
+							
+							$varName .= $this->shop->callMod('wpsg_mod_varianten', 'getVariantenName', array($arVarianten, $arPvar[0]));
+							$varName .= " / ";
+							
+						}
+						else if ($arVarianten[$arPvar[0]]['typ'] != 'checkbox')
+						{
+							
+							$varName .= $this->shop->callMod('wpsg_mod_varianten', 'getVariantenName', array($arVarianten, $arPvar[0]));
+							$varName .= ': ';
+							$varName .= $this->shop->callMod('wpsg_mod_varianten', 'getVariName', array($arVarianten, $arPvar[0], $arPvar[1]));
+							$varName .= " / ";
+							
+						}
+												
+					}
+					
+				}
+				else 
+				{
+					
+					$varName = '';
+					
+					$arPvar = explode('_', $strVarKey);
+					
+					if ($arPvar[1] == 1 && $arVarianten[$arPvar[0]]['typ'] == 'checkbox')
+					{
+							
+						$varName .= $this->shop->callMod('wpsg_mod_varianten', 'getVariantenName', array($arVarianten, $arPvar[0]));
+						$varName .= " / ";
+							
+					}
+					else if ($arVarianten[$arPvar[0]]['typ'] != 'checkbox')
+					{
+							
+						$varName .= $this->shop->callMod('wpsg_mod_varianten', 'getVariantenName', array($arVarianten, $arPvar[0]));
+						$varName .= ': ';
+						$varName .= $this->shop->callMod('wpsg_mod_varianten', 'getVariName', array($arVarianten, $arPvar[0], $arPvar[1]));
+						$varName .= " / ";
+							
+					}
+						
+				}
+				
+				$varName = preg_replace('/\040*\/\040*$/', '',  $varName);
+					
+			}
+			
+			if ($this->shop->get_option('wpsg_mod_downloadplus_memorylimit') == '1') ini_set('memory_limit', '2000M');			
+			if ($this->shop->get_option('wpsg_mod_downloadplus_timelimit') == '1') set_time_limit(3600);
+			
+			require_once (WPSG_PATH_LIB."fpdf/fpdf.php");
+			require_once (WPSG_PATH_LIB."fpdf/fpdi.php");
+			require_once (WPSG_PATH_LIB."fpdf/FPDI_Protection.php");
+			require_once (WPSG_PATH_MOD."mod_downloadplus/wpsg_fpdf.php");
+				 
+			$pi = pathinfo($src_file); 
+		 
+   			if (in_array(strtolower($pi['extension']), $this->valid_ending))
+   			{ 
+   				   		 
+   				$pdf = new wpsg_dl_fpdf();
  
-					$pdf->SetProtection($arRights, $this->shop->get_option("wpsg_mod_downloadplus_openpass"), $this->shop->get_option("wpsg_mod_downloadplus_masterpass"));
-
-				}
-
-	            $pagecount = $pdf->setSourceFile($src_file);
-
-	            $oProduct = wpsg_product::getInstance($p_key);
-
-	            $arCustomReplace = array(
-		            '/%filename%/i' => basename($src_file),
-		            '/%filename_clear%/i' => preg_replace('/\.(.*)$/', '', $src_file),
-		            '/%filename_ohneext%/i' => preg_replace('/\.(.*)$/', '', basename($src_file)),
-		            '/%product_detailname%/i' => $oProduct->getProductName(true),
-		            '/%product_name%/i' => $oProduct->getProductName(),
-		            '/%product_anr%/i' => $oProduct->getNr(),
-		            '/%product_preis%/i' => wpsg_ff($oProduct->getPrice($p_key, $this->shop->getFrontendTaxview())),
-		            '/%product_netto_preis%/i' => wpsg_ff($oProduct->getPrice($p_key, WPSG_NETTO)),
-		            '/%product_beschreibung%/i' => $oProduct->getShortDescription(),
-		            '/%product_varianten_name%/i' => $varName,
-		            '/%product_varianten_name_checkbox%/i' => $varName_checkbox,
-		            '/%download_nr%/i' => $download_nr
-	            );
-
-	            //$arTexte = $this->shop->get_option('wpsg_mod_downloadplus_text');
-		        if (intval($indiv['template']) > 0) $arTexte = $this->getTemplateFields(intval($indiv['template']));
-		        else $arTexte = $this->getTemplateFields();
-
-		        array_walk($arTexte, function(&$el) {
-
-		        	$el['alpha'] = wpsg_tf($el['alpha']);
-
-		        });
-
-	            $fielddata = array();
-
-	            for ($pagei = 1; $pagei <= $pagecount; $pagei++) {
-
-		            if ($paintBackground) $tplidx = $pdf->importPage($pagei, '/BleedBox');
-
-		            $pdf->addPage();
-
-		            if (wpsg_isSizedArray($arTexte) && $this->shop->get_option("wpsg_mod_downloadplus_range") != "1" || ($pagei >= $this->shop->get_option("wpsg_mod_downloadplus_range_von") && $pagei <= $this->shop->get_option("wpsg_mod_downloadplus_range_bis"))) {
-
-			            foreach ($arTexte as $text_key => $t) {
-
-				            if ($t['bg'] && $t['aktiv']) {
-
-					            $t['text'] = $this->shop->replaceUniversalPlatzhalter($t['text'], $order_id, false, false, $p_id, $arCustomReplace, $product_index);
-					            $fielddata['texte'][$text_key] = $t['text'];
-
-					            if ($t['alpha'] > 0) {
-
-						            $pdf->setAlpha($t['alpha']);
-
-					            }
-
-					            $bSetFont = false;
-
-					            if (wpsg_isSizedString($t['font']) && !in_array($t['font'], $this->barCodeFonts)) {
-
-						            $font_file = WPSG_PATH_LIB . 'FPDF_1.81/font/' . $t['font'];
-
-						            if (file_exists($font_file)) {
-
-							            global $name;
-
-							            include $font_file;
-
-							            $bSetFont = true;
-
-							            $pdf->SetFont($name, '', $t['fontsize']);
-
-						            }
-
-					            }
-
-					            if (!$bSetFont) $pdf->SetFont('Arial', 'B', $t['fontsize']);
-
-					            if (in_array($t['font'], $this->barCodeFonts)) {
-
-						            $font_function = $t['font'];
-
-						            $pdf->SetDrawColor(0, 0, 0);
-						            $pdf->$font_function($t['x'], $t['y'], $t['text'], $t['fontsize']);
-
-					            } else {
-
-						            $pdf->wpsg_SetTextColor($t["color"]);
-
-						            $pdf->RotatedText(
-							            $t['x'], $t['y'],
-							            $t['text'],
-							            $t['angle'],
-							            $t['align']
-						            );
-
-						            $pdf->setAlpha(1);
-
-					            }
-
-				            }
-
-			            }
-
-		            }
-
-		            if ($paintBackground) $pdf->useTemplate($tplidx, 0, 0, $w, $h);
-
-		            if ($this->shop->get_option("wpsg_mod_downloadplus_range") != "1" || ($pagei >= $this->shop->get_option("wpsg_mod_downloadplus_range_von") && $pagei <= $this->shop->get_option("wpsg_mod_downloadplus_range_bis"))) {
-
-			            foreach ($arTexte as $text_key => $t) {
-
-				            if (!$t['bg'] && $t['aktiv']) {
-
-					            $t['text'] = $this->shop->replaceUniversalPlatzhalter($t['text'], $order_id, false, false, $p_id, $arCustomReplace, $product_index);
-					            $fielddata['texte'][$text_key] = $t['text'];
-
-					            if ($t['alpha'] > 0) $pdf->setAlpha($t['alpha']);
-
-					            $bSetFont = false;
-
-					            if (wpsg_isSizedString($t['font']) && !in_array($t['font'], $this->barCodeFonts)) {
-
-						            $font_file = WPSG_PATH_LIB . 'FPDF_1.81/font/' . $t['font'];
-
-						            if (file_exists($font_file)) {
-
-							            include $font_file;
-
-							            $pdf->AddFont($name, '', $t['font']);
-
-							            $bSetFont = true;
-							            $pdf->SetFont($name, '', $t['fontsize']);
-
-						            }
-
-					            }
-
-					            if (!$bSetFont) $pdf->SetFont('Arial', 'B', $t['fontsize']);
-
-					            if (in_array($t['font'], $this->barCodeFonts)) {
-
-						            $font_function = $t['font'];
-
-						            $pdf->SetDrawColor(0, 0, 0);
-						            $pdf->$font_function($t['x'], $t['y'], $t['text'], $t['fontsize']);
-
-					            } else {
-
-						            $pdf->wpsg_SetTextColor($t["color"]);
-
-						            $pdf->RotatedText(
-							            $t['x'], $t['y'],
-							            $t['text'],
-							            $t['angle'],
-							            $t['align']
-						            );
-
-						            $pdf->setAlpha(1);
-
-					            }
-
-
-				            }
-
-			            }
-
-		            }
-
-	            }
-
-	            // Daten in die Individualisierung eintragen
-	            $this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array(
-	                'fielddata' => wpsg_q(serialize($fielddata))
-	            ), " `id` = '".wpsg_q($indiv_id)."' ");
-
-	            $pdf->Output($trg_file, 'f');
-
-	            chmod($trg_file, 0777);
-
-	        }
-	        else {
-
-	            return false;
-
-	        }
-
-	    } // private function indivPDF($src_file, $trg_file)
-
-	    public function template_redirect()
-	    {
-
-	        if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'wpsg_mod_downloadplus_download'))
-	        {
-
-	            if (!isset($_REQUEST['hash']) || trim($_REQUEST['hash']) == '') die(__('Kein Kontrollhash!', 'wpsg'));
-
-	            $hash = $this->makeHash($_REQUEST['indi']);
-
-	            if ($_REQUEST['hash'] != $hash) die(__('UngÃŒltiger Kontrollhash!', 'wpsg'));
-
-	            $indiv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($_REQUEST['indi'])."'");
-
-	            if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $indiv_db['counter'] >= $this->shop->get_option('wpsg_mod_downloadplus_downloads'))
-	            {
-	                die(__('Sie haben die maximale Anzahl an Downloads ÃŒberschritten.', 'wpsg'));
-	            }
-
-	            if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && time() > (strtotime($indiv_db['done']) + ($this->shop->get_option('wpsg_mod_downloadplus_days') * 86400)))
-	            {
-	                die(__('Der Download der Datei ist nicht mehr gÃŒltig.', 'wpsg'));
-	            }
-
-	            $this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array("counter" => wpsg_q($indiv_db['counter'] + 1)), "`id` = '".wpsg_q($_REQUEST['indi'])."'");
-
-	            if ($this->shop->get_option('wpsg_mod_downloadplus_format') == '1')
-	            {
-
-	                if ($this->shop->get_option('wpsg_mod_downloadplus_memorylimit') == '1') ini_set('memory_limit', '2000M');
-	                if ($this->shop->get_option('wpsg_mod_downloadplus_timelimit') == '1') set_time_limit(3600);
-
-	                // Gezippt intern
-	                $zipfile = tempnam("tmp", "zip");
-	                $zip = new ZipArchive();
-	                $zip->open($zipfile, ZipArchive::CREATE);
-	                $zip->addFile($this->getPDFIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file']), $indiv_db['out_file']);
-	                $zip->close();
-
-	                $pi_file = pathinfo($this->getPDFIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file']));
-	                $zip_name = $pi_file['filename'].".zip";
-
-	                wpsg_ob_end_clean();
-
-	                header('Content-Type: application/zip');
-	                header('Content-Length: '.filesize($zipfile));
-	                header('Content-Disposition: attachment; filename="'.$zip_name.'"');
-	                header('Expires: 0');
-	                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	                header('Pragma: public');
-
-	                readfile($zipfile);
-	                unlink($zipfile);
-	                die();
-
-	            }
-	            /*else if ($this->shop->get_option('wpsg_mod_downloadplus_format') == '1')
-	            {
-
-	                // Eventuell TODO
-
-	            }*/
-	            else
-	            {
-
-	                wpsg_ob_end_clean();
-
-	                header('Content-Type: application/pdf');
-	                header('Content-Disposition: inline; filename="'.rawurldecode($indiv_db['out_file']).'"');
-	                header('Cache-Control: private, max-age=0, must-revalidate');
-	                header('Pragma: public');
-
-	                //header('Content-Disposition: attachment; filename="'.rawurldecode($indiv_db['out_file']).'"');
-	                die(file_get_contents($this->getPDFIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file'])));
-
-	            }
-
-	        }
-	        else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'wpsg_mod_downloadplus_send'))
-	        {
-
-	            if (!isset($_REQUEST['hash']) || trim($_REQUEST['hash']) == '') die(__('Kein Kontrollhash!', 'wpsg'));
-
-	            $order = $this->shop->cache->loadOrder($_REQUEST['order']);
-
-	            $hash = md5($order['cdate'].'wpsg'.$order['id']);
-
-	            if ($hash != $_REQUEST['hash']) die(__('UngÃŒltiger Kontrollhash!', 'wpsg'));
-
-	            $this->sendFiles($_REQUEST['order']);
-
-	            die(__('Mail mit Downloadlinks versendet!', 'wpsg'));
-
-	        }
-
-	    }
-
-	    public function cron() {
-
-	        $arPDFsUnindiv = $this->db->fetchAssoc("
+   				$pdf->setSourceFile($src_file);
+
+   				$tplidx = $pdf->importPage(1, '/MediaBox');					
+   				$size = $pdf->getTemplateSize($tplidx); 
+				$orientation = (($size['h'] > $size['w'])?'P':'L');
+   				
+   				$pdf = new wpsg_dl_fpdf($orientation, "mm", array($size['w'], $size['h']));
+   				
+   				$arRights = array();	
+   							
+				if ($this->shop->get_option("wpsg_mod_downloadplus_securitysave") == "1") $arRights[] = "copy";
+				if ($this->shop->get_option("wpsg_mod_downloadplus_securityprint") == "1") $arRights[] = "print";
+				if ($this->shop->get_option("wpsg_mod_downloadplus_securitymod") == "1") $arRights[] = "modify";
+				if ($this->shop->get_option("wpsg_mod_downloadplus_securitynote") == "1") $arRights[] = "annot-forms";
+				
+				$pdf->SetProtection($arRights, $this->shop->get_option("wpsg_mod_downloadplus_openpass"), $this->shop->get_option("wpsg_mod_downloadplus_masterpass"));									
+   				
+				$pagecount = $pdf->setSourceFile($src_file);
+				 
+				$arCustomReplace = array(
+					'/%filename%/' 				=> basename($src_file),
+					'/%filename_clear%/' 			=> preg_replace('/\.(.*)$/', '', $src_file),
+					'/%filename_ohneext%/' 		=> preg_replace('/\.(.*)$/', '', basename($src_file)),
+					'/%product_detailname%/' 			=> $arProduct['detailname'],
+					'/%product_name%/' 			=> $arProduct['name'],
+					'/%product_anr%/' 			=> $arProduct['anr'],
+					'/%product_preis%/' 			=> wpsg_ff($arProduct['preis']),
+					'/%product_netto_preis%/' 	=> wpsg_ff($arProduct['netto_preis']),
+					'/%product_beschreibung%/' 	=> $arProduct['beschreibung'],
+					'/%product_varianten_name%/' 	=> $varName,
+					'/%download_nr%/' 			=> $download_nr
+				);
+				
+				$arTexte = $this->shop->get_option('wpsg_mod_downloadplus_text');
+				
+				$fielddata = array();
+				
+				for ($pagei = 1; $pagei <= $pagecount; $pagei ++)
+				{
+					
+					$tplidx = $pdf->importPage($pagei, '/BleedBox');	 					
+					
+					$pdf->addPage();
+					
+					if ($this->shop->get_option("wpsg_mod_downloadplus_range") != "1" || ($pagei >= $this->shop->get_option("wpsg_mod_downloadplus_range_von") && $pagei <= $this->shop->get_option("wpsg_mod_downloadplus_range_bis")))
+					{
+						
+						foreach ($arTexte as $text_key => $t)
+						{
+							
+							if ($t['bg'] == '1' && $t['aktiv'] == '1')
+							{
+								
+								$t['text'] = $this->shop->replaceUniversalPlatzhalter($t['text'], $order_id, false, false, $p_id, $arCustomReplace, $product_index);
+								$fielddata['texte'][$text_key] = $t['text'];
+								
+								if ($t['alpha'] > 0) $pdf->setAlpha($t['alpha']);
+								
+								$bSetFont = false;
+								 
+								if (wpsg_isSizedString($t['font']) && !in_array($t['font'], $this->barCodeFonts))
+								{
+									 
+									$font_file = WPSG_PATH_LIB.'fpdf/font/'.$t['font'];
+									 
+									if (file_exists($font_file))
+									{
+										 
+										include $font_file;
+										 
+										$bSetFont = true;
+										$pdf->SetFont($name, '', $t['fontsize']);
+										
+									}
+									
+								}
+																
+								if (!$bSetFont) $pdf->SetFont('Arial', 'B', $t['fontsize']);								
+								
+								if (in_array($t['font'], $this->barCodeFonts))
+								{
+									 
+									$pdf->SetDrawColor(0, 0, 0);
+									$pdf->$t['font']($t['x'], $t['y'], $t['text'], $t['fontsize']); 
+									
+								}
+								else 
+								{
+									
+									list($r, $g, $b) = wpsg_getColor($t["color"]);
+									$pdf->SetTextColor($r, $g, $b);
+	
+							    	$pdf->RotatedText(
+								    	$t['x'], $t['y'], 
+								    	$t['text'], 
+								    	$t['angle'],
+								    	$t['align']
+								    );
+							    
+									$pdf->setAlpha(1);
+									
+								}
+								
+							}
+							
+						}
+												
+					}
+					 
+					$pdf->useTemplate($tplidx, 0, 0, $size['w'], $size['h']);
+
+					if ($this->shop->get_option("wpsg_mod_downloadplus_range") != "1" || ($pagei >= $this->shop->get_option("wpsg_mod_downloadplus_range_von") && $pagei <= $this->shop->get_option("wpsg_mod_downloadplus_range_bis")))
+					{
+						 
+						foreach ($arTexte as $text_key => $t)
+						{
+							
+							if ($t['bg'] != '1' && $t['aktiv'] == '1')
+							{
+								
+								$t['text'] = $this->shop->replaceUniversalPlatzhalter($t['text'], $order_id, false, false, $p_id, $arCustomReplace, $product_index);
+								$fielddata['texte'][$text_key] = $t['text'];
+								
+								if ($t['alpha'] > 0) $pdf->setAlpha($t['alpha']);
+																
+								$bSetFont = false;
+									
+								if (wpsg_isSizedString($t['font']) && !in_array($t['font'], $this->barCodeFonts))
+								{
+								
+									$font_file = WPSG_PATH_LIB.'fpdf/font/'.$t['font'];
+								
+									if (file_exists($font_file))
+									{
+											
+										include $font_file;
+									 
+										$pdf->AddFont($name, '', $t['font']);
+										
+										$bSetFont = true;
+										$pdf->SetFont($name, '', $t['fontsize']);
+								
+									}
+										
+								}
+								
+								if (!$bSetFont) $pdf->SetFont('Arial', 'B', $t['fontsize']);
+
+								if (in_array($t['font'], $this->barCodeFonts))
+								{
+									 
+									$pdf->SetDrawColor(0, 0, 0);
+									$pdf->$t['font']($t['x'], $t['y'], $t['text'], $t['fontsize']); 
+										
+								}
+								else
+								{
+										
+									list($r, $g, $b) = wpsg_getColor($t["color"]);
+									$pdf->SetTextColor($r, $g, $b);
+								
+									$pdf->RotatedText(
+											$t['x'], $t['y'],
+											$t['text'],
+											$t['angle'],
+											$t['align']
+									);
+										
+									$pdf->setAlpha(1);
+										
+								}
+								 
+								
+							}
+							
+						}
+												
+					}
+					
+				}
+				
+				// Daten in die Individualisierung eintragen
+				$this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array(
+					'fielddata' => wpsg_q(serialize($fielddata))
+				), " `id` = '".wpsg_q($indiv_id)."' ");
+				
+				$pdf->Output($trg_file, 'f'); 
+				
+				chmod($trg_file, 0777);
+								
+   			}
+   			else
+   			{
+   				
+   				return false;
+   				
+   			}
+			 			
+		} // private function indivPDF($src_file, $trg_file)
+		
+		public function wp_loaded()
+		{
+			
+			if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'wpsg_mod_downloadplus_download'))
+			{
+
+				if (!isset($_REQUEST['hash']) || trim($_REQUEST['hash']) == '') die(__('Kein Kontrollhash!', 'wpsg'));
+				
+				$hash = $this->makeHash($_REQUEST['indi']);
+				
+				if ($_REQUEST['hash'] != $hash) die(__('UngÃŒltiger Kontrollhash!', 'wpsg'));
+				
+				$indiv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($_REQUEST['indi'])."'");
+				
+				if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $indiv_db['counter'] >= $this->shop->get_option('wpsg_mod_downloadplus_downloads'))
+				{
+					die(__('Sie haben die maximale Anzahl an Downloads ÃŒberschritten.', 'wpsg'));
+				}
+				
+				if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && time() > (strtotime($indiv_db['done']) + ($this->shop->get_option('wpsg_mod_downloadplus_days') * 86400)))
+				{
+					die(__('Der Download der Datei ist nicht mehr gÃŒltig.', 'wpsg'));
+				}
+
+				$this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array("counter" => wpsg_q($indiv_db['counter'] + 1)), "`id` = '".wpsg_q($_REQUEST['indi'])."'");
+				
+				if ($this->shop->get_option('wpsg_mod_downloadplus_format') == '1') 
+				{ 
+
+					if ($this->shop->get_option('wpsg_mod_downloadplus_memorylimit') == '1') ini_set('memory_limit', '2000M');			
+					if ($this->shop->get_option('wpsg_mod_downloadplus_timelimit') == '1') set_time_limit(3600);
+					
+					// Gezippt intern
+					$zipfile = tempnam("tmp", "zip");
+					$zip = new ZipArchive();
+					$zip->open($zipfile, ZipArchive::CREATE);				
+					$zip->addFile($this->getPDFIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file']), $indiv_db['out_file']);					
+					$zip->close();
+					
+					$pi_file = pathinfo($this->getPDFIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file']));
+					$zip_name = $pi_file['filename'].".zip";
+					
+					wpsg_ob_end_clean();
+					
+					header('Content-Type: application/zip');
+					header('Content-Length: '.filesize($zipfile));
+					header('Content-Disposition: attachment; filename="'.$zip_name.'"');
+					header('Expires: 0');
+					header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+					header('Pragma: public');
+					
+					readfile($zipfile);
+					unlink($zipfile);
+					die();
+					  				
+				} 
+				/*else if ($this->shop->get_option('wpsg_mod_downloadplus_format') == '1') 
+				{ 
+					
+					// Eventuell TODO					
+					
+				}*/
+				else
+				{
+				
+					wpsg_ob_end_clean();
+					
+					header('Content-Type: application/pdf');
+					header('Content-Disposition: inline; filename="'.rawurldecode($indiv_db['out_file']).'"');
+					header('Cache-Control: private, max-age=0, must-revalidate');
+					header('Pragma: public');
+					
+					//header('Content-Disposition: attachment; filename="'.rawurldecode($indiv_db['out_file']).'"');				
+					die(file_get_contents($this->getPDFIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file'])));
+					
+				}
+				
+			}
+			else if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'wpsg_mod_downloadplus_send'))
+			{
+				
+				if (!isset($_REQUEST['hash']) || trim($_REQUEST['hash']) == '') die(__('Kein Kontrollhash!', 'wpsg'));
+				
+				$order = $this->shop->cache->loadOrder($_REQUEST['order']);
+				
+				$hash = md5($order['cdate'].'wpsg'.$order['id']);
+				
+				if ($hash != $_REQUEST['hash']) die(__('UngÃŒltiger Kontrollhash!', 'wpsg'));
+				
+				$this->sendFiles($_REQUEST['order']);
+				
+				die(__('Mail mit Downloadlinks versendet!', 'wpsg'));
+				
+			}
+			
+		}
+		
+		public function cron() { 
+			
+			$arPDFsUnindiv = $this->db->fetchAssoc("
 				SELECT
 					*
@@ -1268,76 +1147,61 @@
 					`done` = '0000-00-00 00:00:00'
 			");
-
-	        $arLog = array();
-
-	        foreach ($arPDFsUnindiv as $v) {
-
-	            $order_path = $this->getPDFIndivPath($v['o_id']);
-
-	            $product_id = $this->shop->getProduktID($v['p_key']);
-
-	            if ($v['mode'] === '1') $src_path = $this->getPDFTemplatePath($v['template']);
-	            else $src_path = $this->getPDFPath($product_id);
-
-	            $oOrder = wpsg_order::getInstance(intval($v['o_id']));
-
-	            foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-
-	                if ($oOrderProduct->getProductKey() === $v['p_key']) {
-
-	                	$arFiles = $this->getFiles($oOrderProduct->getProductKey());
-
-	                	foreach ($arFiles as $f) {
-
-	                		if (file_exists($src_path.$f)) {
-
-	                			 $this->indivPDF(
-			                        $oOrderProduct->getProductKey(),
-			                        $src_path.$f,
-			                        $this->getPDFIndivPath($v['o_id']).'/'.$v['out_file'],
-			                        $v['o_id'],
-			                        $v['downloadnr'],
-			                        $v['id'],
-			                        $v['product_index']
-			                    );
-
-			                    if ($this->shop->get_option('wpsg_mod_downloadplus_emptypdf') === '1') {
-
-			                        $this->indivPDF(
-				                        $oOrderProduct->getProductKey(),
-			                            $src_path.$f,
-				                        $this->getPDFIndivPath($v['o_id']).'/clear_'.$v['out_file'],
-				                        $v['o_id'],
-				                        $v['downloadnr'],
-				                        $v['id'],
-				                        $v['product_index'],
-					                    false
-				                    );
-
-			                    }
-
-			                    $this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array(
-			                        "done" => "NOW()"
-			                    ), "`id` = '".wpsg_q($v['id'])."'");
-
-			                    if (isset($arLog[$v['o_id']])) $arLog[$v['o_id']] ++;
-			                    else $arLog[$v['o_id']] = 1;
-
-			                }
-
-		                }
-
-	                }
-
-	            }
-
-	        }
-
-	        $arClean = array();
-
-	        // Alte Downloads sÃ€ubern
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $this->shop->get_option('wpsg_mod_downloadplus_cleanraiddownloads') == '1') {
-
-	            $arClean = array_merge($arClean, $this->db->fetchAssoc("
+			
+			$arLog = array();
+			
+			foreach ($arPDFsUnindiv as $v)
+			{
+				 
+				$order_path = $this->getPDFIndivPath($v['o_id']);
+				
+				$arBasket = $this->shop->cache->loadBasketArray($v['o_id']);
+			
+				// Die Datei suchen, da ich das Produkt nicht mitspeichere
+				foreach ($arBasket['produkte'] as $p)
+				{
+					
+					if ($p['id'] != $v['p_key']) continue;
+
+					$product_key = $p['id'];
+					
+					if (preg_match('/^vp_(.*)/', $p['id']))
+					{
+						$p['id'] = preg_replace('/(^vp_)|(\/(.*))/', '', $p['id']);
+					} 
+					
+					if ($this->isPDFProdukt($p['id']) && in_array($v['file'], $this->getFiles($p['id'])))
+					{
+						 
+						$this->indivPDF(
+							$product_key,
+							$this->getPDFPath($p['id']).'/'.$v['file'],
+							$this->getPDFIndivPath($v['o_id']).'/'.$v['out_file'],
+							$v['o_id'],
+							$v['downloadnr'],
+							$v['id'],
+							$v['product_index']
+						);
+
+						$this->db->UpdateQuery(WPSG_TBL_PDFINDIV, array(
+							"done" => "NOW()"
+						), "`id` = '".wpsg_q($v['id'])."'");
+
+						$arLog[$v['o_id']] ++;
+						
+						break; 
+						
+					}
+					
+				}
+								
+			} 			
+						
+			$arClean = array();
+			
+			// Alte Downloads sÃ€ubern
+			if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $this->shop->get_option('wpsg_mod_downloadplus_cleanraiddownloads') == '1')
+			{
+				
+				$arClean = array_merge($arClean, $this->db->fetchAssoc("
 					SELECT
 						*
@@ -1347,172 +1211,10 @@
 						`counter` > '".wpsg_q($this->shop->get_option('wpsg_mod_downloadplus_downloads'))."'
 				"));
-
-	        } else if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && $this->shop->get_option('wpsg_mod_downloadplus_cleanraiddownloads') == '1') {
-
-	            $arClean = array_merge($arClean, $this->db->fetchAssoc("
-					SELECT
-						*
-					FROM 
-						`".WPSG_TBL_PDFINDIV."`
-					WHERE
-						DATE_ADD(`done`, INTERVAL ".$this->shop->get_option('wpsg_mod_downloadplus_days')." DAY) < NOW()
-				"));
-
-	        }
-
-	        if (intval($this->shop->get_option('wpsg_mod_downloadplus_cleanolddownloads')) > 0) {
-
-	            $arClean = array_merge($arClean, $this->db->fetchAssoc("
-						SELECT
-							*
-						FROM
-							`".WPSG_TBL_PDFINDIV."`
-						WHERE
-							DATE_ADD(`done`, INTERVAL ".$this->shop->get_option('wpsg_mod_downloadplus_cleanolddownloads')." DAY) < NOW()
-					"));
-
-	        }
-
-	        if (wpsg_isSizedArray($arClean)) {
-
-	            foreach ($arClean as $c) {
-
-	                $path = $this->getPDFIndivPath($c['o_id']);
-
-	                unlink($path.'/'.$c['out_file']);
-
-	                $this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($c['id'])."'");
-
-	            }
-
-	        }
-
-	        if (wpsg_isSizedArray($arLog)) {
-
-	            $this->shop->view['arOrder'] = $arLog;
-
-	            foreach ($this->shop->view['arOrder'] as $k => $v) {
-
-	                $order = $this->shop->cache->loadOrder($k);
-
-	                $this->shop->view['arOrder'][$k] = array($v, $order, md5($order['cdate'].'wpsg'.$order['id']));
-
-	                if ($this->shop->get_option('wpsg_mod_downloadplus_autosend') == '1') {
-
-	                    $this->sendFiles($order['id']);
-
-	                }
-
-	            }
-
-	            $mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/cronmail.phtml', false);
-
-	            if ($this->shop->get_option('wpsg_htmlmail') === '1') {
-
-	                $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/cronmail_html.phtml', false);
-
-	            } else {
-
-	                $mail_html = false;
-
-	            }
-
-	            $this->shop->sendMail($mail_text, $this->shop->get_option('wpsg_pdfdownloadcronmail_empfaenger'), 'pdfdownloadcronmail', array(), false, false, $mail_html);
-
-	        }
-
-	    } // public function cron()
-
-	    public function wpsg_mod_export_loadFields(&$arFields)
-	    {
-
-	        $arDPFields = array(
-	            'name' => __('Downloadplus', 'wpsg'),
-	            'fields' => array()
-	        );
-
-	        for ($i = 1; $i <= 10; $i ++)
-	        {
-
-	            $arDPFields['fields']['text'.$i] = wpsg_translate(__('Text in Textfeld #1#', 'wpsg'), $i);
-
-	        }
-
-	        $arDPFields['fields']['dnr'] = __('Downloadnummer', 'wpsg');
-
-	        $arFields[] = $arDPFields;
-
-	    } // public function wpsg_mod_export_loadFields(&$arFields)
-
-	    public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-
-			if (!in_array($field_value, ['dnr']) && !preg_match('/^text\d+$/', $field_value)) return;
-			
-			$oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-			
-			$product_index = $oOrderProduct->getProductIndex();
-			
-	        // Individualisierung heraussuchen
-	        $db_indiv = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".wpsg_q($o_id)."' AND `p_key` = '".wpsg_q($p_id)."' AND `product_index` = '".wpsg_q($product_index)."' ORDER BY `id` DESC LIMIT 1 ");
-
-	        switch ($field_value) {
-
-	            case 'dnr':
-	                if (!wpsg_isSizedInt($db_indiv['id'])) $return = ''; else $return = $db_indiv['downloadnr'];
-	                break;
-
-	            default:
-
-	                if (preg_match('/^text\d+$/', $field_value)) {
-
-	                    $return = '';
-
-	                    if (wpsg_isSizedInt($db_indiv['id']))
-	                    {
-
-	                        $arTexte = unserialize($db_indiv['fielddata']);
-
-	                        if (wpsg_isSizedArray($arTexte))
-	                        {
-
-	                            $txt_nr = substr($field_value, 4);
-
-	                            $return = $arTexte['texte'][$txt_nr - 1];
-
-	                        }
-
-	                    }
-
-	                }
-
-	        } // switch
-
-	    } // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $product_index, $profil_separator)
-
-	    /**
-	     * Baut den Kontroll Hash
-	     */
-	    private function makeHash($indiv_id)
-	    {
-
-	        $indiv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($indiv_id)."'");
-	        if ($indiv_db['id'] <= 0) return false;
-
-	        $order = $this->shop->cache->loadOrder($indiv_db['o_id']);
-	        if ($order['id'] <= 0) return false;
-
-	        $strHash = md5($order['cdate'].'wpsg'.$indiv_db['file']);
-
-	        return $strHash;
-
-	    } // private function makeHash($indiv_id)
-
-	    /**
-	     * Sendet die Mail mit den Downloadlinks an den Kunden
-	     */
-	    public function sendFiles($order_id)
-	    {
-
-	        $this->shop->view['arPDFs'] = $this->db->fetchAssoc("
+				
+			}
+			else if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && $this->shop->get_option('wpsg_mod_downloadplus_cleanraiddownloads') == '1')
+			{
+
+				$arClean = array_merge($arClean, $this->db->fetchAssoc("
 					SELECT
 						*
@@ -1520,518 +1222,569 @@
 						`".WPSG_TBL_PDFINDIV."`
 					WHERE
-						`o_id` = '".wpsg_q($order_id)."' AND
-						`done` != '0000-00-00 00:00:00'
-				");
-
-	        foreach ($this->shop->view['arPDFs'] as $k => $v)
-	        {
-
-	            // Download noch gÃŒltig
-	            if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $v['counter'] >= $this->shop->get_option('wpsg_mod_downloadplus_downloads'))
-	            {
-	                unset($this->shop->view['arPDFs'][$k]);
-	            }
-	            else if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && time() > (strtotime($v['done']) + ($this->shop->get_option('wpsg_mod_downloadplus_days') * 86400)))
-	            {
-	                unset($this->shop->view['arPDFs'][$k]);
-	            }
-	            else
-	            {
-	                $this->shop->view['arPDFs'][$k]['hash'] = $this->makeHash($v['id']);
-	            }
-
-	        }
-
-	        if (sizeof($this->shop->view['arPDFs']) > 0)
-	        {
-
-	            $this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
-	            $this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
-
-	            // Andere Sprache setzten wenn die Bestellung in einer anderen Sprache durchgefÃŒhrt wurde
-	            if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
-
-	            $mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/pdfdownloadmail.phtml', false);
-
-	            if ($this->shop->get_option('wpsg_htmlmail') === '1')
-	            {
-
-	                $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/pdfdownloadmail_html.phtml', false);
-
-	            }
-	            else
-	            {
-
-	                $mail_html = false;
-
-	            }
-
-	            $attachment = array();
-
-	            if ($this->shop->get_option('wpsg_mod_downloadplus_attachement') == '1')
-	            {
-
-	                foreach ($this->shop->view['arPDFs'] as $k => $v)
-	                {
-
-	                    $attachment[] = $this->getPDFIndivPath($order_id).'/'.$v['out_file'];
-
-	                }
-
-	            }
-
-	            $this->shop->sendMail($mail_text, $this->shop->view['kunde']['email'], 'pdfdownloadfiles', $attachment, $order_id, false, $mail_html);
-
-	            $this->shop->restoreTempLocale();
-
-	            $this->db->ImportQuery(WPSG_TBL_OL, array(
-	                "o_id" => wpsg_q($order_id),
-	                "cdate" => "NOW()",
-	                "title" => wpsg_translate(__('Pdf Downloads an:#1#', 'wpsg'), $this->shop->view['kunde']['email']),
-	                "mailtext" => wpsg_q($mail_text)
-	            ));
-
-	            $this->arMessage[] = __('E-Mail erfolgreich gesendet.', 'wpsg');
-
-	        }
-	        else
-	        {
-
-	            $this->arError[] = __('Keine gÃŒltigen Downloads.', 'wpsg');
-
-	        }
-
-	    } // public function sendFiles($order_id)
-
-	    /**
-	     * Individualisiert die PDFs fÃŒr eine Bestellung
-	     */
-	    public function indivOrder($order_id) {
-
-	        $arBasket = $this->shop->cache->loadBasketArray($order_id);
-
-	        $bPDFProdukt = false;
-	        $arPDF = array();
-
-	        $oOrder = wpsg_order::getInstance($order_id);
-
-	        foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-
-	        	if ($this->isPDFProdukt($oOrderProduct->getProductKey())) {
-
-	        		$oProduct = $oOrderProduct->getProduct();
-	        		$bPDFProdukt = true;
-	        		$product_files = $this->getFiles($oOrderProduct->getProductKey());
-
-	        		foreach ($product_files as $file) {
-
-	        			$arPDF[] = array(
-	                        $oOrderProduct->getProductKey(), $file, $oOrderProduct->getProductIndex(),
-		                    'mode' => $oProduct->getMeta('mod_downloadplus_mode'),
-		                    'template' => $this->getTemplateIdFromProduct($oOrderProduct->getProductKey())
-	                    );
-
-			        }
-
-		        }
-
-	        }
-
-	        if ($bPDFProdukt === true && wpsg_isSizedArray($arPDF)) {
-
-	            foreach ($arPDF as $v) {
-
-	                $this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."` WHERE `file` = '".wpsg_q($v[1])."' AND `o_id` = '".wpsg_q($order_id)."' AND `p_key` = '".wpsg_q($v[0])."' AND `product_index` = '".wpsg_q($v[2])."' ");
-
-	                $download_nr = $this->getDownloadNr($order_id, $v[0], $v[2]);
-
-	                $this->db->ImportQuery(WPSG_TBL_PDFINDIV, array(
-	                    "o_id" => wpsg_q($order_id),
-	                    "downloadnr" => wpsg_q($download_nr),
-	                    "p_key" => wpsg_q($v[0]),
-	                    'product_index' => wpsg_q($v[2]),
-	                    "downloadnr" => wpsg_q($download_nr),
-	                    "file" => wpsg_q($v[1]),
-	                    "scheduled" => wpsg_q("NOW()"),
-	                    "done" => wpsg_q("0000-00-00 00:00:00"),
-	                    "out_file" => wpsg_q($this->getNewName($v[1], $order_id, $v[0], $download_nr, $v[2])),
-		                'mode' => $v['mode'],
-		                'template' => $v['template']
-	                ));
-
-	            }
-
-	        }
-
-	    } // public function indivOrder($order_id)
-
-	    /**
-	     * Gibt den Individualisierten Dateinamen fÃŒr ein File und Bestellung zurÃŒck
-	     */
-	    public function getNewName($oldFilename, $order_id, $product_key, $download_nr, $product_index)
-	    {
-
-	        $product_id = $this->shop->getProduktId($product_key);
-
-	        $arReplace = array(
-	            '/%filename%/i' => $oldFilename,
-	            '/%filename_clear%/i' => preg_replace('/\.(.*)$/', '', $oldFilename),
-	            '/%filename_ohneext%/i' => preg_replace('/\.(.*)$/', '', $oldFilename),
-	            '/%download_nr%/i' => $download_nr
-	        );
-
-	        $newFilename = $this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_downloadplus_filename'), $order_id, false, false, $product_id, $arReplace, $product_index);
-
-	        return $newFilename;
-
-	    } // public function getNewName($oldFilename, $order_id, $product_key, $download_nr, $product_index)
-
-	    /**
-	     * Gibt die PDFdateien eines Produktes zurÃŒck
-	     */
-	    public function getFiles($produkt_key, $ignoreTemplateFiles = false) {
-
-	        $product_id = $this->shop->getProduktID($produkt_key); $oProduct = wpsg_product::getInstance($product_id);
-			$arPDFFiles = [];
-
-	        if (!$ignoreTemplateFiles && $oProduct->getMeta('mod_downloadplus_mode') === '1') {
-
-	        	$template_id = $this->getTemplateIdFromProduct($produkt_key);
-	        	$template = $this->getTemplate($template_id)[0];
-
-	        	$path = $this->getPDFTemplatePath($template['id']);
-
-	        	if (wpsg_isSizedString($template['file']) && file_exists($path.$template['file'])) {
-
-	        		$arPDFFiles[] = $template['file'];
-
-		        }
-
-	        } else {
-
-		        $path = $this->getPDFPath($product_id);
-
-		        if (!file_exists($path)) return;
-
-		        $arrFiles = scandir($path);
-
-		        foreach ($arrFiles as $file) {
-
-		            if (is_file($path.$file) && in_array(strtolower(preg_replace('/(.*)\./', '', $file)), $this->valid_ending)) {
-
-		                $arPDFFiles[] = $file;
-
-		            }
-
-		        }
-
-	        }
-
-	        return $arPDFFiles;
-
-	    } // private function getFiles($produkt_id)
-
-	    /**
-	     * Gibt alle Dokumente zurÃŒck, die zu einer Bestellung individualisiert wurden
-	     */
-	    public function getIndivFiles($produkt_id, $order_id)
-	    {
-
-	        $produkt_id = $this->shop->getProduktID($produkt_id);
-
-	        $arFilesProdukt = $this->getFiles($produkt_id);
-	        $arFilesReturn = array();
-
-	        foreach ($arFilesProdukt as $k => $v)
-	        {
-
-	            $indiv = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `file` = '".wpsg_q($v)."'");
-
-	            $infoArray = array(
-	                'done' => '0000-00-00 00:00:00',
-	                'scheduled' => '0000-00-00 00:00:00',
-	                'counter' => -1,
-	                'status' => 0
-	            );
-
-	            if ($indiv['id'] > 0)
-	            {
-
-	                $infoArray['status'] = 1;
-	                $infoArray['done'] = $indiv['done'];
-	                $infoArray['scheduled'] = $indiv['scheduled'];
-	                $infoArray['counter'] = $indiv['counter'];
-	                $infoArray['indiv_id'] = $indiv['id'];
-	                $infoArray['hash'] = $this->makeHash($indiv['id']);
-
-	            }
-
-	            if (@strtotime($indiv['done']) > 0) $infoArray['status'] = 2;
-
-	            $infoArray['file'] = $v;
-	            $infoArray['file_out'] = @$indiv['out_file'];
-	            $infoArray['path'] = $this->getPDFIndivPath($order_id);
-
-	            $arFilesReturn[] = $infoArray;
-
-	        }
-
-	        return $arFilesReturn;
-
-	    } // public function getIndivFiles($produkt_id, $order_id)
-
-	    /**
-	     * ÃberprÃŒft ein Produkt ob es ein PDFDownloadProdukt ist
-	     */
-	    public function isPDFProdukt($produkt_key) {
-
-	    	$oProduct = wpsg_product::getInstance($this->shop->getProduktID($produkt_key));
-	        $arPDFs = $this->getFiles($produkt_key);
-
-	        if (sizeof($arPDFs) > 0 || $oProduct->getMeta('mod_downloadplus_set') === '1') return true;
-
-	        return false;
-
-	    } // private function isPDFProdukt($produkt_key)
-
-	    /**
-	     * Gibt den Pfad zu dem Ordner zurÃŒck in dem die PDFs abgelegt werden
-	     */
-	    public function getPDFPath($produkt_id)
-	    {
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_pdfpath') !== false && trim($this->shop->get_option('wpsg_mod_downloadplus_pdfpath')) != '')
-	        {
-
-	            $path = $this->shop->get_option('wpsg_mod_downloadplus_pdfpath').'/'.$produkt_id.'/';
-
-	        }
-	        else
-	        {
-
-	            if ($this->shop->isMultiBlog())
-	            {
-
-	                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_pdfprodukte/'.$produkt_id.'/';
-
-	            }
-	            else
-	            {
-
-	                $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_pdfprodukte/'.$produkt_id.'/';
-
-	            }
-
-	        }
-
-	        $this->shop->protectDirectory($path);
-
-	        return $path;
-
-	    } // public function getPDFPath($produkt_id)
-
-	    /**
-	     * Gibt den Pfad zurÃŒck wo die Individualisierten PDFs einer Bestellung liegen
-	     */
-	    public function getPDFIndivPath($order_id) {
-
-	        if ($this->shop->get_option('wpsg_mod_downloadplus_pdfindivpath') !== false && trim($this->shop->get_option('wpsg_mod_downloadplus_pdfindivpath')) != '') {
-
-	            $path = $this->shop->get_option('wpsg_mod_downloadplus_pdfindivpath').'/'.$order_id.'/';
-
-	        } else {
-
-	            if ($this->shop->isMultiBlog()) {
-
-	                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_pdfprodukte_order/'.$order_id.'/';
-
-	            } else {
-
-	                $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_pdfprodukte_order/'.$order_id.'/';
-
-	            }
-
-	        }
-
-	        $this->shop->protectDirectory($path);
-
-	        return $path;
-
-	    } // public function getPDFIndivPath($order_id)
-
+						DATE_ADD(`done`, INTERVAL ".$this->shop->get_option('wpsg_mod_downloadplus_days')." DAY) < NOW()
+				"));
+				
+			}
+			
+			if (intval($this->shop->get_option('wpsg_mod_downloadplus_cleanolddownloads')) > 0)
+			{
+				
+				$arClean = array_merge($arClean, $this->db->fetchAssoc("
+					SELECT
+						*
+					FROM
+						`".WPSG_TBL_PDFINDIV."`
+					WHERE
+						DATE_ADD(`done`, INTERVAL ".$this->shop->get_option('wpsg_mod_downloadplus_cleanolddownloads')." DAY) < NOW()
+				"));
+				
+			}
+			
+			if (wpsg_isSizedArray($arClean))
+			{
+				
+				foreach ($arClean as $c)
+				{
+					
+					$path = $this->getPDFIndivPath($c['o_id']);
+					
+					unlink($path.'/'.$c['out_file']);
+					
+					$this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($c['id'])."'");
+					
+				}
+				
+			}
+			
+			if (wpsg_isSizedArray($arLog))
+			{
+				
+				$this->shop->view['arOrder'] = $arLog;
+				
+				foreach ($this->shop->view['arOrder'] as $k => $v)
+				{
+					
+					$order = $this->shop->cache->loadOrder($k);
+					
+					$this->shop->view['arOrder'][$k] = array($v, $order, md5($order['cdate'].'wpsg'.$order['id']));
+					
+					if ($this->shop->get_option('wpsg_mod_downloadplus_autosend') == '1')
+					{
+						
+						$this->sendFiles($order['id']);
+						
+					}
+					
+				}
+								
+				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/cronmail.phtml', false);
+				
+				if ($this->shop->get_option('wpsg_htmlmail') === '1')
+				{
+					
+					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/cronmail_html.phtml', false);
+					
+				}
+				else
+				{
+					
+					$mail_html = false;
+					
+				}
+				
+				$this->shop->sendMail($mail_text, $this->shop->get_option('wpsg_pdfdownloadcronmail_empfaenger'), 'pdfdownloadcronmail', array(), false, false, $mail_html);
+				
+			}
+			
+		} // public function cron()
+		
+		public function wpsg_mod_export_loadFields(&$arFields) 
+		{ 
+			
+			$arDPFields = array(
+				'name' => __('Downloadplus', 'wpsg'),
+				'fields' => array()				
+			);
+			
+			for ($i = 1; $i <= 10; $i ++)
+			{
+			
+				$arDPFields['fields']['text'.$i] = wpsg_translate(__('Text in Textfeld #1#', 'wpsg'), $i);
+
+			}
+			
+			$arDPFields['fields']['dnr'] = __('Downloadnummer', 'wpsg');
+			
+			$arFields[] = $arDPFields;
+			
+		} // public function wpsg_mod_export_loadFields(&$arFields)
+		
+		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) 
+		{ 
+
+			// Individualisierung heraussuchen
+			$db_indiv = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".wpsg_q($o_id)."' AND `p_key` = '".wpsg_q($p_id)."' AND `product_index` = '".wpsg_q($product_index)."' ORDER BY `id` DESC LIMIT 1 ");
+			
+			switch ($field_value)
+			{
+				
+				case 'dnr':
+					if (!wpsg_isSizedInt($db_indiv['id'])) $return = ''; else $return = $db_indiv['downloadnr'];
+					break;
+					
+				default:
+					
+					if (preg_match('/^text\d+$/', $field_value))
+					{
+						
+						$return = '';
+						
+						if (wpsg_isSizedInt($db_indiv['id'])) 
+						{
+						
+							$arTexte = unserialize($db_indiv['fielddata']);
+
+							if (wpsg_isSizedArray($arTexte))
+							{					
+
+								$txt_nr = substr($field_value, 4); 
+								
+								$return = $arTexte['texte'][$txt_nr - 1];
+								
+							}
+							
+						}
+						
+					}
+									
+			} // switch
+			
+		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $product_index, $profil_separator)
+		
+		/** 
+		 * Baut den Kontroll Hash
+		 */
+		private function makeHash($indiv_id)
+		{
+			
+			$indiv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `id` = '".wpsg_q($indiv_id)."'");
+			if ($indiv_db['id'] <= 0) return false;
+			
+			$order = $this->shop->cache->loadOrder($indiv_db['o_id']);
+			if ($order['id'] <= 0) return false;
+			
+			$strHash = md5($order['cdate'].'wpsg'.$indiv_db['cdate'].$indiv_db['file']);
+			
+			return $strHash;
+			
+		} // private function makeHash($indiv_id)
+		
 		/**
-		 * Gibt den Pfad zurÃŒck, wo die Datei des Templates abgelegt wird
-		 * @param $template_id
+		 * Sendet die Mail mit den Downloadlinks an den Kunden
 		 */
-		public function getPDFTemplatePath($template_id) {
-
-			$template_id = intval($template_id);
-
-		    if ($this->shop->isMultiBlog()) {
-
-                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_dp_templatefiles/'.$template_id.'/';
-
-            } else {
-
-                $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_dp_templatefiles/'.$template_id.'/';
-
-            }
-
-		    if (!file_exists($path)) mkdir($path, 0775, true);
-
-	        return $path;
-
-		}
-
-	    /**
-	     * Gibt die DownloadNr zurÃŒck
-	     * @param int $order_id BestellID
-	     * @param varchar $product_key Produktkey
-	     */
-	    private function getDownloadNr($order_id, $product_key, $product_index)
-	    {
-
-	        $product_id = $this->shop->getProduktID($product_key);
-
-	        $format = $this->shop->get_option('wpsg_mod_downloadplus_numberformat');
-	        if (!wpsg_isSizedString($format)) $format = "%download_nr%";
-
-	        $download_nr = $this->shop->get_option('wpsg_mod_downloadplus_startnumber');
-	        if (!wpsg_isSizedInt($download_nr)) $download_nr = 1;
-
-	        $arCustomReplace = array(
-	            '/\%download_nr\%/i' => $download_nr
-	        );
-
-	        $format = $this->shop->replaceUniversalPlatzhalter($format, $order_id, false, false, $product_id, $arCustomReplace, $product_index);
-
-	        $this->shop->update_option('wpsg_mod_downloadplus_startnumber', $download_nr + 1);
-
-	        return $format;
-
-	    } // private function getDownloadNr($order_id, $product_key)
-
+		public function sendFiles($order_id)
+		{
+			
+			$this->shop->view['arPDFs'] = $this->db->fetchAssoc("
+				SELECT
+					*
+				FROM
+					`".WPSG_TBL_PDFINDIV."`
+				WHERE
+					`o_id` = '".wpsg_q($order_id)."' AND
+					`done` != '0000-00-00 00:00:00'
+			");
+			
+			foreach ($this->shop->view['arPDFs'] as $k => $v)
+			{
+				
+				// Download noch gÃŒltig
+				if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '1' && $v['counter'] >= $this->shop->get_option('wpsg_mod_downloadplus_downloads'))
+				{
+					unset($this->shop->view['arPDFs'][$k]);
+				}
+				else if ($this->shop->get_option('wpsg_mod_downloadplus_accepted') == '2' && time() > (strtotime($v['done']) + ($this->shop->get_option('wpsg_mod_downloadplus_days') * 86400)))
+				{
+					unset($this->shop->view['arPDFs'][$k]);
+				}
+				else 
+				{
+					$this->shop->view['arPDFs'][$k]['hash'] = $this->makeHash($v['id']);
+				}
+				
+			}
+			
+			if (sizeof($this->shop->view['arPDFs']) > 0)
+			{
+						
+				$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
+				$this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
+
+				// Andere Sprache setzten wenn die Bestellung in einer anderen Sprache durchgefÃŒhrt wurde
+				if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
+				
+				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/pdfdownloadmail.phtml', false);
+				
+				if ($this->shop->get_option('wpsg_htmlmail') === '1')
+				{
+					
+					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/pdfdownloadmail_html.phtml', false);
+					
+				}
+				else
+				{
+					
+					$mail_html = false;
+					
+				}
+				
+				$attachment = array();
+				
+				if ($this->shop->get_option('wpsg_mod_downloadplus_attachement') == '1')
+				{
+				
+					foreach ($this->shop->view['arPDFs'] as $k => $v)
+					{
+					
+						$attachment[] = $this->getPDFIndivPath($order_id).'/'.$v['out_file'];
+						
+					}
+					
+				}
+				
+				$this->shop->sendMail($mail_text, $this->shop->view['kunde']['email'], 'pdfdownloadfiles', $attachment, $order_id, false, $mail_html);
+				
+				$this->shop->restoreTempLocale();
+				
+				$this->db->ImportQuery(WPSG_TBL_OL, array(
+					"o_id" => wpsg_q($order_id),
+					"cdate" => "NOW()",
+					"title" => wpsg_translate(__('Pdf Downloads an:#1#', 'wpsg'), $this->shop->view['kunde']['email']),
+					"mailtext" => wpsg_q($mail_text)
+				));
+
+				$this->arMessage[] = __('E-Mail erfolgreich gesendet.', 'wpsg');
+				
+			}
+			else 
+			{
+				
+				$this->arError[] = __('Keine gÃŒltigen Downloads.', 'wpsg');
+				
+			}			
+			
+		} // public function sendFiles($order_id)
+		
 		/**
-		 * Gibt einen Array mit Templates zurÃŒck, wird $template_id ÃŒbergeben, so wird nur das Template mit dieser ID geladen
-		 * @param $template_id
+		 * Individualisiert die PDFs fÃŒr eine Bestellung
 		 */
-		public function getTemplate($template_id = null) {
-
-			$strQueryWHERE = " T.`deleted` != '1' ";
-
-			if (wpsg_isSizedInt($template_id)) {
-
-				$strQueryWHERE .= " AND T.`id` = '".wpsg_q($template_id)."' ";
-
-			}
-
-			$arTemplates = $this->db->fetchAssoc("
-				SELECT
-					T.*
-				FROM	
-					`".WPSG_TBL_DP_TEMPLATES."` AS T
-				WHERE
-					".$strQueryWHERE."
-			");
-
-			array_walk($arTemplates, function(&$e) {
-
-				$e['id'] = intval($e['id']);
-		        $e['defaulttemplate'] = intval($e['defaulttemplate']) > 0;
-		        $e['arField'] = $this->getTemplateFields($e['id']);
-
-		        $e['file'] = null;
-
-		        $path = $this->getPDFTemplatePath($e['id']);
-		        $arFiles = scandir($path);
-
-		        foreach ($arFiles as $f) {
-
-		        	if (preg_match('/\.pdf$/', $f)) {
-
-		        		$e['file'] = $f;
-
-			        }
-
-		        }
-
-		        $e['file_data'] = null;
-		        $e['file_delete'] = false;
-
-			});
-
-			return $arTemplates;
-
-		}
-
-		public function getTemplateIdFromProduct($product_key) {
-
+		public function indivOrder($order_id)
+		{
+
+			$arBasket = $this->shop->cache->loadBasketArray($order_id);
+				
+			$bPDFProdukt = false;
+			$arPDF = array();
+				
+			foreach ($arBasket['produkte'] as $p)
+			{
+				 
+				if ($this->isPDFProdukt($p['id']))
+				{
+ 					
+					$bPDFProdukt = true;
+					
+					// Hier darf nicht wpsg_array_merge verwendet werden, da sonst Index=0 ÃŒberschrieben wird
+					//$arPDF = array_merge($arPDF, $this->getFiles($p['id']));						
+					
+					if (wpsg_isSizedString($p['mod_vp_varkey'])) $product_key = $p['mod_vp_varkey']; else $product_key = $p['productkey'];
+									
+					$product_files = $this->getFiles($p['id']);
+
+					foreach ($product_files as $file)
+					{
+						
+						$arPDF[] = array(
+							$product_key, $file, $p['product_index']
+						);
+						
+					}
+					
+				}
+				
+			}
+ 
+			if ($bPDFProdukt === true && wpsg_isSizedArray($arPDF))
+			{
+				
+				foreach ($arPDF as $v)
+				{
+			
+					$this->db->Query("DELETE FROM `".WPSG_TBL_PDFINDIV."` WHERE `file` = '".wpsg_q($v)."' AND `o_id` = '".wpsg_q($order_id)."'");
+					
+					$download_nr = $this->getDownloadNr($order_id, $v[0], $v[2]);
+					
+					$this->db->ImportQuery(WPSG_TBL_PDFINDIV, array(
+						"o_id" => wpsg_q($order_id),
+						"downloadnr" => wpsg_q($download_nr),
+						"p_key" => wpsg_q($v[0]),
+						'product_index' => wpsg_q($v[2]),
+						"downloadnr" => wpsg_q($download_nr),
+						"file" => wpsg_q($v[1]),
+						"scheduled" => wpsg_q("NOW()"),
+						"done" => wpsg_q("0000-00-00 00:00:00"),
+						"out_file" => wpsg_q($this->getNewName($v[1], $order_id, $v[0], $download_nr, $v[2]))
+					));
+					
+				}
+				
+			}
+			
+		} // public function indivOrder($order_id)
+		
+		/**
+		 * Gibt den Individualisierten Dateinamen fÃŒr ein File und Bestellung zurÃŒck
+		 */
+		public function getNewName($oldFilename, $order_id, $product_key, $download_nr, $product_index)
+		{
+			
+			$product_id = $this->shop->getProduktId($product_key);
+			
+			$arReplace = array(
+				'/%filename%/' => $oldFilename,
+				'/%filename_clear%/' => preg_replace('/\.(.*)$/', '', $oldFilename),
+				'/%filename_ohneext%/' => preg_replace('/\.(.*)$/', '', $oldFilename),
+				'/%download_nr%/' => $download_nr
+			);
+			
+			$newFilename = $this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_downloadplus_filename'), $order_id, false, false, $product_id, $arReplace, $product_index);
+				
+			return $newFilename;
+			
+		} // public function getNewName($oldFilename, $order_id, $product_key, $download_nr, $product_index)
+		
+		/**
+		 * Gibt die PDFdateien eines Produktes zurÃŒck
+		 */
+		public function getFiles($produkt_id)
+		{
+
+			if (preg_match('/^vp_(.*)/', $produkt_id))
+			{
+				$produkt_id = preg_replace('/(^vp_)|(\/(.*))/', '', $produkt_id);
+			} 
+			
+			$path = $this->getPDFPath($produkt_id);
+			
+			if (!file_exists($path)) return;
+
+			$arrFiles = scandir($path);
+			$arPDFFiles = array();
+			
+			foreach ($arrFiles as $file)
+			{
+				
+				if (is_file($path.$file) && in_array(strtolower(preg_replace('/(.*)\./', '', $file)), $this->valid_ending))
+				{
+					
+					$arPDFFiles[] = $file;
+					
+				}
+				
+			}
+			
+			return $arPDFFiles;
+			
+		} // private function getFiles($produkt_id)
+		
+		/**
+		 * Gibt alle Dokumente zurÃŒck, die zu einer Bestellung individualisiert wurden
+		 */
+		public function getIndivFiles($produkt_id, $order_id)
+		{
+			
+			if (preg_match('/^vp_(.*)/', $produkt_id))
+			{
+				$produkt_id = preg_replace('/(^vp_)|(\/(.*))/', '', $produkt_id);
+			}
+
+			$arFilesProdukt = $this->getFiles($produkt_id);			
+			$arFilesReturn = array();
+			
+			foreach ($arFilesProdukt as $k => $v)
+			{
+				
+				$indiv = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PDFINDIV."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `file` = '".wpsg_q($v)."'");
+				
+				$infoArray = array(
+					'done' => '0000-00-00 00:00:00',
+					'scheduled' => '0000-00-00 00:00:00',
+					'counter' => -1,
+					'status' => 0
+				);
+
+				if ($indiv['id'] > 0) 
+				{
+					
+					$infoArray['status'] = 1;
+					$infoArray['done'] = $indiv['done'];
+					$infoArray['scheduled'] = $indiv['scheduled'];
+					$infoArray['counter'] = $indiv['counter'];
+					$infoArray['indiv_id'] = $indiv['id'];
+					$infoArray['hash'] = $this->makeHash($indiv['id']);
+					
+				}
+				
+				if (@strtotime($indiv['done']) > 0) $infoArray['status'] = 2;				
+				
+				$infoArray['file'] = $v;
+				$infoArray['file_out'] = @$indiv['out_file'];
+				$infoArray['path'] = $this->getPDFIndivPath($order_id);
+
+				$arFilesReturn[] = $infoArray;
+				
+			}
+			
+			return $arFilesReturn;
+			
+		} // public function getIndivFiles($produkt_id, $order_id)
+		
+		/**
+		 * ÃberprÃŒft ein Produkt ob es ein PDFDownloadProdukt ist
+		 */
+		public function isPDFProdukt($produkt_key)
+		{
+
+			$produkt_id = $this->shop->getProduktId($produkt_key);
+			 	
+			$arPDFs = $this->getFiles($produkt_id);
+				
+			if (sizeof($arPDFs) > 0) return true;
+			
+			return false;
+			
+		} // private function isPDFProdukt($produkt_key)
+		
+		/**
+		 * Gibt den Pfad zu dem Ordner zurÃŒck in dem die PDFs abgelegt werden
+		 */
+		public function getPDFPath($produkt_id)
+		{
+
+			if ($this->shop->get_option('wpsg_mod_downloadplus_pdfpath') !== false && trim($this->shop->get_option('wpsg_mod_downloadplus_pdfpath')) != '')
+			{
+
+				$path = $this->shop->get_option('wpsg_mod_downloadplus_pdfpath').'/'.$produkt_id.'/';
+				
+			}
+			else
+			{
+			
+				if ($this->shop->isMultiBlog())
+				{
+					
+					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_pdfprodukte/'.$produkt_id.'/'; 
+						
+				}
+				else
+				{
+						 
+					$path = WP_CONTENT_DIR.'/uploads/wpsg_pdfprodukte/'.$produkt_id.'/';
+										
+				}
+				
+			}
+			
+			if (!file_exists($path))
+			{
+				
+				mkdir($path, 0777, true);
+				
+				$handle = fopen($path.'.htaccess', "w+");
+				$content = "Deny from all";			
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+					
+			return $path;
+			
+		} // public function getPDFPath($produkt_id)
+		
+		/**
+		 * Gibt den Pfad zurÃŒck wo die Individualisierten PDFs einer Bestellung liegen
+		 */
+		public function getPDFIndivPath($order_id)
+		{
+
+			if ($this->shop->get_option('wpsg_mod_downloadplus_pdfindivpath') !== false && trim($this->shop->get_option('wpsg_mod_downloadplus_pdfindivpath')) != '')
+			{
+
+				$path = $this->shop->get_option('wpsg_mod_downloadplus_pdfindivpath').'/'.$order_id.'/';
+				
+			}
+			else
+			{
+				
+				if ($this->shop->isMultiBlog())
+				{
+					
+					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_pdfprodukte_order/'.$order_id.'/'; 
+										
+				}
+				else
+				{
+						 
+					$path = WP_CONTENT_DIR.'/uploads/wpsg_pdfprodukte_order/'.$order_id.'/';
+									
+				}
+				
+			}
+			
+			if (!file_exists($path))
+			{
+				
+				mkdir($path, 0777, true);
+				
+				$handle = fopen($path.'.htaccess', "w+");
+				$content = "Deny from all";			
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+				
+			return $path;
+			
+		} // public function getPDFIndivPath($order_id)
+		
+		/**
+		 * Gibt die DownloadNr zurÃŒck
+		 * @param int $order_id BestellID
+		 * @param varchar $product_key Produktkey
+		 */
+		private function getDownloadNr($order_id, $product_key, $product_index)
+		{
+			
 			$product_id = $this->shop->getProduktID($product_key);
-			$oProduct = wpsg_product::getInstance($product_id);
-
-			$product_template = intval($oProduct->getMeta('mod_downloadplus_template'));
-
-			if ($product_template <= 0) {
-
-				// Standard Template
-				$template_id = intval($this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_DP_TEMPLATES."` WHERE `defaulttemplate` = '1' "));
-
-			} else $template_id = $product_template;
-
-			if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$product_key])) {
-
-				$arVarSet = $this->shop->callMod('wpsg_mod_productvariants', 'getSetVariArray', [$product_key]);
-
-				$vari_template = json_decode($oProduct->getMeta('mod_downloadplus_vari_template'), true);
-
-				if (wpsg_isSizedArray($vari_template)) {
-
-					foreach ($arVarSet as $var_id => $vari_id) {
-
-						$vari_template_id = $this->db->fetchOne("SELECT `template_id` FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `id` = '".wpsg_q($vari_id)."' ");
-
-						if (wpsg_isSizedInt($vari_template[$var_id.'_'.$vari_id])) $template_id = $vari_template[$var_id.'_'.$vari_id];
-						else if ($vari_template_id > 0) { $template_id = $vari_template_id; }
-
-					}
-
-				}
-
-			}
-
-			return $template_id;
-
-		}
-
-		public function getTemplateFields($template_id = false) {
-
-	    	if ($template_id === false) $template_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_DP_TEMPLATES."` WHERE `defaulttemplate` = '1' ");
-
-	    	$template_id = intval($template_id);
-
-	    	if ($template_id > 0) {
-
-	    		$arField = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_DP_TEMPLATES_FIELD."` WHERE `template_id` = '".wpsg_q($template_id)."' ");
-
-	    		array_walk($arField, function(&$e) {
-
-	    			$e['id'] = intval($e['id']);
-					$e['x'] = intval($e['x']);
-					$e['y'] = intval($e['y']);
-					$e['align'] = intval($e['align']) > 0;
-					$e['bg'] = intval($e['bg']) > 0;
-					$e['alpha'] = wpsg_ff(wpsg_tf($e['alpha']));
-					$e['angle'] = intval($e['angle']);
-					$e['fontsize'] = intval($e['fontsize']);
-					$e['aktiv'] = intval($e['aktiv']) > 0;
-
-			    });
-
-	    		return $arField;
-
-		    } else return [];
-
-		}
-
+			
+			$format = $this->shop->get_option('wpsg_mod_downloadplus_numberformat');
+			if (!wpsg_isSizedString($format)) $format = "%download_nr%";
+			
+			$download_nr = $this->shop->get_option('wpsg_mod_downloadplus_startnumber');
+			if (!wpsg_isSizedInt($download_nr)) $download_nr = 1;
+			
+			$arCustomReplace = array(
+				'/\%download_nr\%/' => $download_nr			
+			);
+			
+			$format = $this->shop->replaceUniversalPlatzhalter($format, $order_id, false, false, $product_id, $arCustomReplace, $product_index);		
+
+			$this->shop->update_option('wpsg_mod_downloadplus_startnumber', $download_nr + 1);
+			
+			return $format;
+			
+		} // private function getDownloadNr($order_id, $product_key)
+		
 	} // class wpsg_mod_downloadplus extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_downloadprodukte.class.php
===================================================================
--- /mods/wpsg_mod_downloadprodukte.class.php	(revision 8528)
+++ /mods/wpsg_mod_downloadprodukte.class.php	(revision 5261)
@@ -1,3 +1,3 @@
-<?php
+<?php 
 
 	/**
@@ -18,5 +18,5 @@
 			parent::__construct();
 			
-			$this->name 	= __('DownloadProdukte', 'wpsg');
+			$this->name 	= __('Downloadprodukte', 'wpsg');
 			$this->group 	= __('Produkte', 'wpsg');
 			$this->desc 	= __('ErmÃ¶glicht es, Downloads als Produkt zu verkaufen. Diese Produkte kÃ¶nnen bei Sofortbezahlung (z.B. Paypal oder SofortÃŒberweisung) vom Kunden direkt heruntergeladen werden. Nach Zahlungseingang erhÃ€lt der Kunde eine E-Mail mit personalisiertem Downloadlink.', 'wpsg');
@@ -38,5 +38,5 @@
 		{
 			
-			if (is_admin() && preg_match('/wpsg/', wpsg_getStr($_REQUEST['page'])))
+			if (is_admin())
 			{
 			
@@ -65,39 +65,35 @@
 		{
 
-		    $this->shop->update_option('wpsg_mod_downloadprodukte_zt', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_zt']), false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_downloadprodukte_days', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_days']), false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_downloadprodukte_raid', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_raid']), false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_downloadprodukte_zip', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_zip']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_downloadprodukte_shipping', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_shipping']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_downloadprodukte_einsplusx', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_einsplusx']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_downloadprodukte_ziptemp', $_REQUEST['wpsg_mod_downloadprodukte_ziptemp'], false, false, WPSG_SANITIZE_TEXTFIELD);
+			$this->shop->update_option('wpsg_mod_downloadprodukte_zt', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_zt']));
+			$this->shop->update_option('wpsg_mod_downloadprodukte_days', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_days']));
+			$this->shop->update_option('wpsg_mod_downloadprodukte_raid', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_raid']));
+			$this->shop->update_option('wpsg_mod_downloadprodukte_zip', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_zip']));
+			$this->shop->update_option('wpsg_mod_downloadprodukte_einsplusx', wpsg_q($_REQUEST['wpsg_mod_downloadprodukte_einsplusx']));
+			$this->shop->update_option('wpsg_mod_downloadprodukte_ziptemp', $_REQUEST['wpsg_mod_downloadprodukte_ziptemp']);
 			
 		} // public function settings_save()
 		
-		/* 
-		 * zeigt ein Upload-Formular im linken Bereich des Produktbackend an 
+		/**
+		 * 
+		 * zeigt ein upload- Formular im rechten Bereich des Produkt-bearbeiten Dialog an
 		 * @param &array $produkt_data
 		 */
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-			if (intval($product_data['id']) <= 0) return;
-
-			$this->shop->view['data'] = $product_data;
-			$this->shop->view['prodFiles'] = $this->getProdFileListe($product_data['id']);
-			$this->shop->view['wpsg_mod_downloadprodukte']['path'] = str_replace('\\', '\\\\', $this->getFilePath($product_data['id']));
-			
-			$this->shop->view['wpsg_mod_downloadprodukte']['data'] = $product_data;
-		
-			$product_content['wpsg_mod_downloadprodukte'] = array(
-				'title' => __('Downloadprodukte', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml', false)
-			);
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{
+			
+			if (isset($_REQUEST['wpsg_lang']) || !wpsg_isSizedInt($produkt_data['id'])) return;
+
+			$this->shop->view['data'] = $produkt_data;
+			$this->shop->view['prodFiles'] = $this->getProdFileListe($produkt_data['id']);
+			$this->shop->view['wpsg_mod_downloadprodukte']['path'] = str_replace('\\', '\\\\', $this->getFilePath($produkt_data['id']));
+		 			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml');
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
 		
 		public function order_view_row(&$p, $i) 
 		{
 
-			$arFiles = $this->getProdFiles($this->shop->getProduktId($p['product_key']));
+			$arFiles = $this->getProdFiles($this->shop->getProduktId($p['productkey']));
 			
 			if (wpsg_isSizedArray($arFiles))
@@ -118,7 +114,5 @@
 		public function produkt_ajax() 
 		{
-
-			$_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-
+			
 			if ($_REQUEST['cmd'] == 'upload_file')
 			{
@@ -186,12 +180,30 @@
 		{
 			
-			$temp = wpsg_getStr($_FILES['wpsg_mod_downloadprodukte_file']['tmp_name']);
-			
-			if (file_exists($temp)) {
-
+			if (file_exists($_FILES['wpsg_mod_downloadprodukte_file']['tmp_name']))
+			{
+				
 				$uploaddir = $this->getFilePath($produkt_id);
 				
-				$this->shop->protectDirectory($uploaddir);
-								
+				if (!file_exists($uploaddir))
+				{
+					
+					mkdir($uploaddir, 0777, true);	
+					
+					$handle = fopen($uploaddir.'.htaccess', "w");					
+					$content = "Deny from all";			
+					fwrite($handle, $content, strlen($content));
+					fclose($handle);
+									
+				}
+				else 
+				{
+					
+					$handle = fopen($uploaddir.'.htaccess', "w");					
+					$content = "Deny from all";			
+					fwrite($handle, $content, strlen($content));
+					fclose($handle);
+					
+				}
+				
 				$uploadfile = $uploaddir.basename($_FILES['wpsg_mod_downloadprodukte_file']['name']);
 				
@@ -204,10 +216,4 @@
 			
 		} // private function fileUpload($produkt_id)
-		
-		public function isDownloadProduct($product_key) {
- 
-			return sizeof($this->getProdFiles($product_key)) > 0; 
-			
-		}
 		
 		/**
@@ -216,16 +222,13 @@
 		 * @return array Files
 		 */
-		public function getProdFiles($produkt_key)
-		{
-
-			$produkt_id = $this->shop->getProduktID($produkt_key);
-
-			if (!file_exists($this->getFilePath($produkt_id))) return [];
+		private function getProdFiles($produkt_id)
+		{
+
+			if (!file_exists($this->getFilePath($produkt_id))) return false;
 
 			$path = $this->getFilePath($produkt_id);
 			
 			$arrFiles = scandir($path);
-			$arProdFiles = [];
-
+			
 			foreach ($arrFiles as $file)
 			{
@@ -242,4 +245,6 @@
 				
 			}
+			
+			if (!wpsg_isSizedArray($arProdFiles)) return false;
 			
 			return $arProdFiles;
@@ -266,9 +271,4 @@
  		public function getFilePath($produkt_id, $url = false)
  		{
-
-			 if (intval($produkt_id) <= 0) {
-				 debug_print_backtrace();
-
-				 throw new \Exception("UngÃŒltige Produkt-ID");}
  		 
  			if ($this->shop->isMultiBlog())
@@ -294,9 +294,9 @@
 			{
 				
-				if ($url) return WPSG_URL_CONTENT.'uploads/wpsg/wpsg_downloadprodukte/'.$produkt_id.'/';
+				if ($url) return WPSG_URL_CONTENT.'uploads/wpsg_downloadprodukte/'.$produkt_id.'/';
 				else 
 				{
 					
-					$path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_downloadprodukte/'.$produkt_id.'/';
+					$path = WP_CONTENT_DIR.'/uploads/wpsg_downloadprodukte/'.$produkt_id.'/';
 					
 					if (!file_exists($path)) mkdir($path, 0777, true);
@@ -327,14 +327,14 @@
  		 * @param unknown_type $arShipping
  		 */
- 		public function addShipping(&$arShipping, $va_active = false) {
-
-            if ($this->shop->get_option('wpsg_mod_downloadprodukte_shipping') != '1') return;
+ 		public function addShipping(&$arShipping) 
+		{ 
 			 
 			$arShipping[$this->id] = array(
-				'id' => $this->id,
-				'active' => '1',
-				'name' => __('Versand per Mail', 'wpsg'),//$this->shop->get_option('wpsg_mod_freeshipping_bezeichnung'),
-				'price' => 0,
-				'tax_key' => 0
+				'id' 			=> $this->id,
+				'name' 			=> __('Versand per Mail', 'wpsg'),//$this->shop->get_option('wpsg_mod_freeshipping_bezeichnung'),
+				'preis' 		=> 0,
+				'preis_calc' 	=> 0,			
+				'mwst' 			=> 0,
+				'mwst_value' 	=> 0
 			);		
 			 
@@ -359,8 +359,6 @@
 						
 						// In der Session auch korrigieren
-						if (isset($_SESSION['wpsg']['basket']))
-						{
-							foreach ((array)$_SESSION['wpsg']['basket'] as $k => $v) { { if ($v['id'] == $produkt['id']) $_SESSION['wpsg']['basket'][$k]['menge'] = 1; } }
-						}
+						foreach ((array)$_SESSION['wpsg']['basket'] as $k => $v) { { if ($v['id'] == $produkt['id']) $_SESSION['wpsg']['basket'][$k]['menge'] = 1; } }
+					
 					}
 					
@@ -372,5 +370,49 @@
 			
 		} // public function basket_toArray(&$produkt, $backend = false, $noMwSt = false) 
-				
+		
+		public function checkShippingAvailable(&$arShipping, &$arBasket) 
+		{ 
+			
+			if (!array_key_exists($this->id, $arShipping)) return;
+			
+			$bPDF = false; $bOther = false;
+			
+			foreach ((array)$arBasket['produkte'] as $p)
+			{
+
+				$produkt_id = $this->shop->getProduktID($p['id']);
+				
+				if ($this->getProdFiles($produkt_id) === false)
+				{
+					
+					$bOther = true;
+					
+				}
+				else
+				{
+					
+					$bPDF = true;
+					
+				}
+				 
+				
+			} 
+			
+			if (!$bPDF || $bOther)
+			{
+				
+				unset($arShipping[$this->id]);
+				
+			}
+			else
+			{
+				
+				// Wenn Downloadprodukt dann alle anderen entfernen
+				foreach ($arShipping as $k => $v) { if ($k != $this->id) { unset($arShipping[$k]); } }
+			  
+			}
+			
+		} // public function checkShippingAvailable(&$arShipping, &$arBasket)
+		
 		/**
 		 * Ã€ndert den Status der Bestllung und sendet eine Mail mit dem Downloadlink(s) an den Kunde
@@ -398,34 +440,34 @@
 													WHERE `id` = '".$order_id."'
 												");
-				 
-				foreach ($arrBasket['produkte'] as $produkt) {
-					
-					for ($i = 1; $i <= intval($produkt['menge']); $i ++) {
-											
-						$arProductFiles = $this->getProdFiles($this->shop->getProduktID($produkt['id']));
+				
+
+				foreach ($arrBasket['produkte'] as $produkt)
+				{
+					
+					$arProductFiles = $this->getProdFiles($this->shop->getProduktID($produkt['id']));
+
+					if (wpsg_isSizedArray($arProductFiles))
+					{
+					
+						foreach ($arProductFiles as $p_id => $f)
+						{	
+					
+							$chash = md5($orderValues['cdate'].basename($f[0]));
+							
+							if (strpos(get_permalink($this->shop->get_option('wpsg_page_basket')), "?") > -1)	
+							{			
+								
+								$strLinks .= get_permalink($this->shop->get_option('wpsg_page_basket'))."&plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".base64_encode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash."\r\n\r\n";
+								$arLinks[] = get_permalink($this->shop->get_option('wpsg_page_basket'))."&plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".base64_encode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash;
+								
+							}
+							else
+							{
+
+								$strLinks .= get_permalink($this->shop->get_option('wpsg_page_basket'))."?plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".base64_encode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash."\r\n\r\n";
+								$arLinks[] = get_permalink($this->shop->get_option('wpsg_page_basket'))."?plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".base64_encode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash; 
+								
+							}
 	
-						if (wpsg_isSizedArray($arProductFiles)) {
-						
-							foreach ($arProductFiles as $p_id => $f) {	
-						
-								$chash = md5($orderValues['cdate'].basename($f[0]));
-								
-								if (strpos(get_permalink($this->shop->get_option('wpsg_page_basket')), "?") > -1)	
-								{			
-									
-									$strLinks .= get_permalink($this->shop->get_option('wpsg_page_basket'))."&plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".rawurlencode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash."\r\n\r\n";
-									$arLinks[] = get_permalink($this->shop->get_option('wpsg_page_basket'))."&plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".rawurlencode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash;
-									
-								}
-								else
-								{
-	
-									$strLinks .= get_permalink($this->shop->get_option('wpsg_page_basket'))."?plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".rawurlencode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash."\r\n\r\n";
-									$arLinks[] = get_permalink($this->shop->get_option('wpsg_page_basket'))."?plugin=1&noheader=1&m_id=".$this->id."&order=".$order_id."&file=".rawurlencode(basename($f[0]))."&produkt=".$this->shop->getProduktID($produkt['id'])."&chash=".$chash; 
-									
-								}
-		
-							}
-							
 						}
 						
@@ -491,5 +533,5 @@
 		 * wird ausgefÃŒhrt wenn der Kunde den Link aus seiner Mail aufruft
 		 */
-		public function template_redirect()
+		public function wp_loaded()
 		{
 			
@@ -549,8 +591,6 @@
 						{
 							$_file = $f;
-							 
-							$decoded_file = rawurldecode($_REQUEST['file']);
 							
-							if ($_file == $decoded_file)
+							if ($_file == base64_decode($_REQUEST['file']))
 							{
 								
@@ -642,5 +682,5 @@
 			}	
 			
-		}// public function template_redirect()
+		}// public function wp_loaded()
  
 		/**
@@ -652,5 +692,5 @@
 			echo wpsg_drawEMailConfig(
 				'downloadprodukte',
-				__('DownloadProdukte (Kunde)', 'wpsg'),
+				__('Downloadprodukte (Kunde)', 'wpsg'),
 				__('Diese Mail bekommt der Kunde, darin sind die Links zu den Produkten enthalten.', 'wpsg'));
 						
@@ -669,2 +709,3 @@
 	} // class wpsg_mod_downloadprodukte extends wpsg_mod_basic 
 
+?>
Index: /mods/wpsg_mod_export.class.php
===================================================================
--- /mods/wpsg_mod_export.class.php	(revision 8528)
+++ /mods/wpsg_mod_export.class.php	(revision 5261)
@@ -1,173 +1,117 @@
 <?php
 
-    /**
-     * Modul fÃŒr die verschiedenen Export Profile
-     */
-    class wpsg_mod_export extends wpsg_mod_basic
-    {
-
-        var $lizenz = 1;
-        var $id = 300;
-        var $inline = true;
-
-        /** Hier sind alle mÃ¶glichen Typen drin, wird von loadFields gefÃŒllt */
-        var $fields = array();
-
-        /** Array fÃŒr die mÃ¶glichen Format Umwandlungen */
-        var $arFieldFormats = array();
-
-        /** @var array Array mit den Exportformaten (XML/CSV) */
-        var $arExportFormats = array();
-
-        /** @var array Array mit verfÃŒgbaren Charsets */
-        var $arFileEncoding = array();
-
-        /** @var array Array mit den Cron Auswahloptionen */
-        var $arCronTypes = array();
-
-        var $arCache = array();
-
-        const TYPE_ORDER = '1';
-        const TYPE_PRODUCT = '2';
-        const TYPE_CUSTOMER = '3';
-        const TYPE_ABO = '4';
-
-        const ENCODING_UTF8 = '1';
-        const ENCODING_ISO88591 = '2';
-
-        const FORMAT_CSV = '1';
-        const FORMAT_XML = '2';
-
-        const CRON_OFF = '0';
-        const CRON_LIVE = '1';
-        const CRON_DAILY = '2';
-        const CRON_WEEKLY = '3';
-        const CRON_MONTHLY = '4';
-        const CRON_ORDER = '5';
-
-        /**
-         * Costructor
-         */
-        public function __construct()
-        {
-
-            parent::__construct();
-
-            $this->arFieldFormats = array(
-                0 => __('UnverÃ€ndert', 'wpsg'),
-                100 => __('Zahl (99.99)', 'wpsg'),
-                200 => __('Zahl (99,99)', 'wpsg'),
-                300 => __('WÃ€hrung (99,99 â¬)', 'wpsg'),
-                400 => __('Datum (TT.MM.YYYY)', 'wpsg'),
-                500 => __('Zeit (hh:mm:ss)', 'wpsg'),
-                600 => __('Datum und Zeit (TT.MM.YYYY hh:mm:ss)', 'wpsg'),
-				610 => __('Datum und Zeit (ISO 8601)', 'wpsg'),
-                700 => __('Benutzerdefiniert', 'wpsg'),
-                800 => __('Text', 'wpsg'),
-                900 => __('Text Excel 2007', 'wpsg'),
-                950 => __('CDATA', 'wpsg')	            
-            );
-
-            $this->arExportFormats = array(
-                self::FORMAT_CSV => __('CSV', 'wpsg'),
-                self::FORMAT_XML => __('XML', 'wpsg')
-            );
-
-            $this->arFileEncoding = array(
-                self::ENCODING_UTF8 => __('UTF-8', 'wpsg'),
-                self::ENCODING_ISO88591 => __('ISO-8859-1', 'wpsg')
-            );
-
-            $this->arCronTypes = array(
-                wpsg_mod_export::CRON_OFF => __('Nie', 'wpsg'),
-                wpsg_mod_export::CRON_LIVE => __('Mit jeder Cron AusfÃŒhrung'),
-                wpsg_mod_export::CRON_DAILY => __('TÃ€glich', 'wpsg'),
-                wpsg_mod_export::CRON_WEEKLY => __('WÃ¶chentlich', 'wpsg'),
-                wpsg_mod_export::CRON_MONTHLY => __('Monatlich', 'wpsg'),
-                wpsg_mod_export::CRON_ORDER => __('Einmal je Bestellung', 'wpsg'),
-            );
-
-            $this->name = __('Exportprofile', 'wpsg');
-            $this->group = __('Sonstiges', 'wpsg');
-            $this->desc = __('ErmÃ¶glicht es Produkte, Bestellungen und Kunden bezogen auf Bestellungen in verschiedene CSV Formate zu exportieren.', 'wpsg');
-
-        } // public function __construct()
-
-        public function wpsg_hourly_hook() {
-
-			wpsg_ShopController::getShop()->addShipPay();
-			
-            $this->cron(true);
-
-        }
-
-        public function install() {
-
-            require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
-            /*
-                * Tabelle fÃŒr die Exportprofile
-                */
-            $sql = "CREATE TABLE ".WPSG_TBL_EXPORTPROFILE." (
+	/**
+	 * Modul fÃŒr die verschiedenen Export Profile
+	 */
+	class wpsg_mod_export extends wpsg_mod_basic 
+	{
+		
+		var $lizenz = 1;
+		var $id = 300;
+		var $inline = true;
+		
+		/** Hier sind alle mÃ¶glichen Typen drin, wird von loadFields gefÃŒllt */
+		var $fields = array();
+		
+		/** Array fÃŒr die mÃ¶glichen Format Umwandlungen */
+		var $arFormats = array();
+		
+		var $arCache = array();
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{ 
+			
+			/*
+			$data = @unserialize('a:6:{s:8:"filename";s:17:"bestellexport.csv";s:9:"separator";s:1:";";s:7:"oneline";s:1:"1";s:3:"iso";s:1:"1";s:16:"firstlinecolname";s:1:"1";s:6:"fields";a:35:{i:0;a:3:{s:4:"name";s:3:"OID";s:5:"value";s:8:"order_id";s:6:"format";s:1:"0";}i:1;a:2:{s:4:"name";s:3:"KID";s:5:"value";s:8:"kunde_id";}i:2;a:2:{s:4:"name";s:3:"RNR";s:5:"value";s:11:"rechnung_nr";}i:3;a:3:{s:4:"name";s:14:"Rechnungsdatum";s:5:"value";s:6:"rdatum";s:6:"format";s:3:"400";}i:4;a:2:{s:4:"name";s:6:"Status";s:5:"value";s:12:"order_status";}i:5;a:2:{s:4:"name";s:9:"Bezahlart";s:5:"value";s:20:"order_payment_method";}i:6;a:2:{s:4:"name";s:10:"Versandart";s:5:"value";s:21:"order_shipping_method";}i:7;a:2:{s:4:"name";s:4:"Name";s:5:"value";s:10:"kunde_name";}i:8;a:2:{s:4:"name";s:7:"Vorname";s:5:"value";s:13:"kunde_vorname";}i:9;a:3:{s:4:"name";s:12:"Bestelldatum";s:5:"value";s:11:"order_cdate";s:6:"format";s:3:"400";}i:10;a:3:{s:4:"name";s:11:"Gesamtpreis";s:5:"value";s:11:"order_price";s:6:"format";s:3:"200";}i:11;a:3:{s:4:"name";s:5:"Netto";s:5:"value";s:17:"order_price_netto";s:6:"format";s:3:"200";}i:12;a:2:{s:4:"name";s:9:"Kommentar";s:5:"value";s:15:"order_bemerkung";}i:15;a:2:{s:4:"name";s:5:"EMail";s:5:"value";s:11:"kunde_email";}i:16;a:2:{s:4:"name";s:8:"UStIdNr.";s:5:"value";s:11:"kunde_ustid";}i:17;a:2:{s:4:"name";s:5:"Firma";s:5:"value";s:11:"kunde_firma";}i:18;a:2:{s:4:"name";s:3:"Tel";s:5:"value";s:9:"kunde_tel";}i:19;a:2:{s:4:"name";s:3:"Fax";s:5:"value";s:9:"kunde_fax";}i:20;a:2:{s:4:"name";s:7:"Strasse";s:5:"value";s:13:"kunde_strasse";}i:21;a:2:{s:4:"name";s:3:"PLZ";s:5:"value";s:9:"kunde_plz";}i:22;a:2:{s:4:"name";s:3:"Ort";s:5:"value";s:9:"kunde_ort";}i:23;a:2:{s:4:"name";s:4:"Land";s:5:"value";s:10:"kunde_land";}i:24;a:2:{s:4:"name";s:20:"Versandadresse Firma";s:5:"value";s:11:"order_firma";}i:25;a:2:{s:4:"name";s:22:"Versandadresse Vorname";s:5:"value";s:13:"order_vorname";}i:26;a:2:{s:4:"name";s:19:"Versandadresse Name";s:5:"value";s:10:"order_name";}i:27;a:2:{s:4:"name";s:22:"Versandadresse Strasse";s:5:"value";s:13:"order_strasse";}i:28;a:2:{s:4:"name";s:18:"Versandadresse PLZ";s:5:"value";s:9:"order_plz";}i:29;a:2:{s:4:"name";s:18:"Versandadresse Ort";s:5:"value";s:9:"order_ort";}i:30;a:2:{s:4:"name";s:19:"Versandadresse Land";s:5:"value";s:10:"order_land";}i:31;a:2:{s:4:"name";s:26:"Name der Bank (Bankeinzug)";s:5:"value";s:11:"order_bname";}i:32;a:2:{s:4:"name";s:24:"Kontonummer (Bankeinzug)";s:5:"value";s:9:"order_bnr";}i:33;a:2:{s:4:"name";s:25:"BLZ der Bank (Bankeinzug)";s:5:"value";s:10:"order_bblz";}i:34;a:2:{s:4:"name";s:25:"Kontoinhaber (Bankeinzug)";s:5:"value";s:14:"order_binhaber";}i:35;a:2:{s:4:"name";s:2:"ip";s:5:"value";s:8:"order_ip";}i:36;a:2:{s:4:"name";s:9:"UserAgent";s:5:"value";s:15:"order_useragent";}}}');
+			array_splice($data['fields'], 1, 0, array(array('name' => 'ONR', 'value' => 'order_onr', 'format' => 900)));
+			array_splice($data['fields'], 3, 0, array(array('name' => 'KNR', 'value' => 'kunde_nr', 'format' => 900)));
+			$data['fields'][18]['format'] = 900;
+			$data['fields'][19]['format'] = 900;
+			$data['fields'][21]['format'] = 900;
+			$data['fields'][16]['format'] = 900;
+			$data['fields'][28]['format'] = 900;
+			$data['fields'][32]['format'] = 900;
+			$data['fields'][33]['format'] = 900;
+			$data['fields'][35]['format'] = 900;			
+			wpsg_debug($data);die(serialize($data));			
+			*/
+			
+			parent::__construct();
+						
+			$this->arFormats = array(
+				0 => __('UnverÃ€ndert', 'wpsg'),
+				100 => __('Zahl (99.99)', 'wpsg'),
+				200 => __('Zahl (99,99)', 'wpsg'),
+				300 => __('WÃ€hrung (99,99 â¬)', 'wpsg'),
+				400 => __('Datum (TT.MM.YYYY)', 'wpsg'),
+				500 => __('Zeit (hh:mm:ss)', 'wpsg'),
+				600 => __('Datum und Zeit (TT.MM.YYYY hh:mm:ss)', 'wpsg'),
+				700 => __('Benutzerdefiniert', 'wpsg'),
+				800 => __('Text', 'wpsg'),
+				900 => __('Text Excel 2007', 'wpsg')					
+			);
+			
+			$this->name = __('Exportprofile', 'wpsg');
+			$this->group = __('Sonstiges', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht es Produkte, Bestellungen und Kunden bezogen auf Bestellungen in verschiedene CSV Formate zu exportieren.', 'wpsg');
+
+		} // public function __construct()
+		
+		public function install() 
+		{
+			
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			/*
+		   	 * Tabelle fÃŒr die Exportprofile
+		   	 */
+		   	$sql = "CREATE TABLE ".WPSG_TBL_EXPORTPROFILE." (
 		   		id mediumint(9) NOT NULL AUTO_INCREMENT,
-		   		name VARCHAR(255) NOT NULL COMMENT 'Der Name des Profils', 
-		   		filename VARCHAR(255) NOT NULL COMMENT 'Dateiname fÃŒr den Export',
-		   		export_type INT(1) NOT NULL COMMENT 'Typ des Exportprofils (Produkt / Bestellung)',
-		   		format INT(1) NOT NULL COMMENT 'Format des Exportes (XML/CSV)',
-		   		field_delimiter VARCHAR(1) NOT NULL COMMENT 'Feld-Trennzeichen (CSV)',
-		   	  	field_enclosure VARCHAR(1) NOT NULL COMMENT 'Feld-Begrenzungs Zeichen (CSV)',
-		   	  	field_escape VARCHAR(1) NOT NULL COMMENT 'Maskierungs-Zeichen (CSV)',
-		   	  	order_online INT(1) NOT NULL COMMENT 'Bestellungen in einer Zeile auffÃŒhren',
-		   	  	order_onetime INT(1) NOT NULL COMMENT 'Bestellungen nur einmal exportieren',
-                csv_pvariants_separated INT(1) NOT NULL COMMENT 'Beim CSV Export jede Variante eines Produktes einzeln in einer extra Zeile auffÃŒhren',
-		   	  	csv_fieldnames INT(1) NOT NULL COMMENT 'Beim CSV Export die Feldnamen in erster Zeile auffÃŒhren',
-		   	  	cron_interval INT(1) NOT NULL DEFAULT '0' COMMENT 'Cron Eisntellunge (Inaktiv/Intervall)',
-		   	  	cron_path VARCHAR(500) NOT NULL COMMENT 'Pfad in dem die automatischen Dateien abgelegt werden',
-		   	  	cron_lastrun DATE NOT NULL COMMENT 'Letzte AusfÃŒhrung des Crons',
-		   	  	orderfilter TEXT NOT NULL COMMENT 'Serialisizerter Bestellfilter',
-		   	  	xml_roottag TEXT NOT NULL COMMENT 'Tagname des XML Root Elements',
-		   	  	xml_ordertag TEXT NOT NULL COMMENT 'Tagname des XML Bestellung Elements',
-		   	  	xml_productroottag TEXT NOT NULL COMMENT 'Tagname des XML Produkt Rootelements',
-		   	  	xml_producttag TEXT NOT NULL COMMENT 'Tagname des Produkt Elements',
-		   	  	xml_customertag TEXT NOT NULL COMMENT 'Tagname des Kunden Elements (Kundenexport)',
-		   	  	file_encoding INT(1) NOT NULL COMMENT 'Encoding der Datei',		   	  	
-		   	  	wp_cron INT(1) NOT NULL COMMENT '1 wenn der Cron stÃŒndlich mit dem wp_cron aufgefÃŒhrt werden soll',
-		   	  	PRIMARY KEY  (id)
+		   		name VARCHAR(255) NOT NULL,
+		   		data LONGTEXT NOT NULL,
+		   		PRIMARY KEY  (id)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-
-            /**
-             * Tabelle fÃŒr die Felder des Exportprofils
-             */
-            $sql = "CREATE TABLE ".WPSG_TBL_EXPORTPROFILE_FIELDS." (
-				id mediumint(9) NOT NULL AUTO_INCREMENT,
-				profil_id INT(11) NOT NULL COMMENT 'Link zu WPSG_TBL_EXPORTPROFILE',
-				pos int(11) NOT NULL COMMENT 'Position im Export',
-				name VARCHAR(255) NOT NULL COMMENT 'Spaltenname / Feldname im XML',
-				value_key VARCHAR(255) NOT NULL COMMENT 'Der SchlÃŒssel, mit dem der Wert gefÃŒllt wird',
-				format INT(2) NOT NULL COMMENT 'Zellenformat',
-				xml_att INT(1) NOT NULL COMMENT 'Tag oder Attributexport',
-				userformat VARCHAR(255) NOT NULL COMMENT 'Benutzerdefiniertes Format',
-				clear_spaces INT(1) NOT NULL COMMENT 'Leerzeichen entfernen',
-				static TEXT NOT NULL COMMENT 'Statischer Text',
-				INDEX profil_id (profil_id),
-				PRIMARY KEY  (id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-
-        } // public function install() 
-
-        public function settings_edit() {
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/settings_edit.phtml');
-
-        } // public function settings_edit()
-
-        public function profilList($selected_profile_id = false)
-        {
-
-            $this->shop->view['arProfile'] = $this->db->fetchAssoc("
+		   	
+		   	dbDelta($sql);
+			
+		   	// StandardmÃ€Ãig einen Export vorgeben sollte keiner existieren
+		   	$existsID1 = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '1'");
+		   	
+		   	if ($existsID1 <= 0)
+		   	{
+		   		
+		   		$ins_data = array(
+		   			"id" => 1,
+		   			"name" => __("Bestellexport", "wpsg"),
+		   			"data" => 'a:6:{s:8:"filename";s:17:"bestellexport.csv";s:9:"separator";s:1:";";s:7:"oneline";s:1:"1";s:3:"iso";s:1:"1";s:16:"firstlinecolname";s:1:"1";s:6:"fields";a:37:{i:0;a:3:{s:4:"name";s:3:"OID";s:5:"value";s:8:"order_id";s:6:"format";s:1:"0";}i:1;a:3:{s:4:"name";s:3:"ONR";s:5:"value";s:9:"order_onr";s:6:"format";i:900;}i:2;a:2:{s:4:"name";s:3:"KID";s:5:"value";s:8:"kunde_id";}i:3;a:3:{s:4:"name";s:3:"KNR";s:5:"value";s:8:"kunde_nr";s:6:"format";i:900;}i:4;a:2:{s:4:"name";s:3:"RNR";s:5:"value";s:11:"rechnung_nr";}i:5;a:3:{s:4:"name";s:14:"Rechnungsdatum";s:5:"value";s:6:"rdatum";s:6:"format";s:3:"400";}i:6;a:2:{s:4:"name";s:6:"Status";s:5:"value";s:12:"order_status";}i:7;a:2:{s:4:"name";s:9:"Bezahlart";s:5:"value";s:20:"order_payment_method";}i:8;a:2:{s:4:"name";s:10:"Versandart";s:5:"value";s:21:"order_shipping_method";}i:9;a:2:{s:4:"name";s:4:"Name";s:5:"value";s:10:"kunde_name";}i:10;a:2:{s:4:"name";s:7:"Vorname";s:5:"value";s:13:"kunde_vorname";}i:11;a:3:{s:4:"name";s:12:"Bestelldatum";s:5:"value";s:11:"order_cdate";s:6:"format";s:3:"400";}i:12;a:3:{s:4:"name";s:11:"Gesamtpreis";s:5:"value";s:11:"order_price";s:6:"format";s:3:"200";}i:13;a:3:{s:4:"name";s:5:"Netto";s:5:"value";s:17:"order_price_netto";s:6:"format";s:3:"200";}i:14;a:2:{s:4:"name";s:9:"Kommentar";s:5:"value";s:15:"order_bemerkung";}i:15;a:2:{s:4:"name";s:5:"EMail";s:5:"value";s:11:"kunde_email";}i:16;a:3:{s:4:"name";s:8:"UStIdNr.";s:5:"value";s:11:"kunde_ustid";s:6:"format";i:900;}i:17;a:2:{s:4:"name";s:5:"Firma";s:5:"value";s:11:"kunde_firma";}i:18;a:3:{s:4:"name";s:3:"Tel";s:5:"value";s:9:"kunde_tel";s:6:"format";i:900;}i:19;a:3:{s:4:"name";s:3:"Fax";s:5:"value";s:9:"kunde_fax";s:6:"format";i:900;}i:20;a:2:{s:4:"name";s:7:"Strasse";s:5:"value";s:13:"kunde_strasse";}i:21;a:3:{s:4:"name";s:3:"PLZ";s:5:"value";s:9:"kunde_plz";s:6:"format";i:900;}i:22;a:2:{s:4:"name";s:3:"Ort";s:5:"value";s:9:"kunde_ort";}i:23;a:2:{s:4:"name";s:4:"Land";s:5:"value";s:10:"kunde_land";}i:24;a:2:{s:4:"name";s:20:"Versandadresse Firma";s:5:"value";s:11:"order_firma";}i:25;a:2:{s:4:"name";s:22:"Versandadresse Vorname";s:5:"value";s:13:"order_vorname";}i:26;a:2:{s:4:"name";s:19:"Versandadresse Name";s:5:"value";s:10:"order_name";}i:27;a:2:{s:4:"name";s:22:"Versandadresse Strasse";s:5:"value";s:13:"order_strasse";}i:28;a:3:{s:4:"name";s:18:"Versandadresse PLZ";s:5:"value";s:9:"order_plz";s:6:"format";i:900;}i:29;a:2:{s:4:"name";s:18:"Versandadresse Ort";s:5:"value";s:9:"order_ort";}i:30;a:2:{s:4:"name";s:19:"Versandadresse Land";s:5:"value";s:10:"order_land";}i:31;a:2:{s:4:"name";s:26:"Name der Bank (Bankeinzug)";s:5:"value";s:11:"order_bname";}i:32;a:3:{s:4:"name";s:24:"IBAN Nummer (Bankeinzug)";s:5:"value";s:10:"order_iban";s:6:"format";i:900;}i:33;a:3:{s:4:"name";s:25:"BIC der Bank (Bankeinzug)";s:5:"value";s:9:"order_bic";s:6:"format";i:900;}i:34;a:2:{s:4:"name";s:25:"Kontoinhaber (Bankeinzug)";s:5:"value";s:14:"order_binhaber";}i:35;a:3:{s:4:"name";s:2:"ip";s:5:"value";s:8:"order_ip";s:6:"format";i:900;}i:36;a:2:{s:4:"name";s:9:"UserAgent";s:5:"value";s:15:"order_useragent";}}}'
+		   		);
+		   		
+		   		// Standardexport anlegen
+		   		$this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE, $ins_data);
+		   		
+		   	}
+		   	
+		} // public function install() 
+		
+		public function settings_edit()
+		{
+									
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/settings_edit.phtml'); 
+						
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			
+		} // public function settings_save()
+		
+		public function profilList()
+		{
+		
+			$this->shop->view['arProfile'] = $this->db->fetchAssoc("
 				SELECT
 					*
@@ -175,2482 +119,1060 @@
 					`".WPSG_TBL_EXPORTPROFILE."`
 			");
-
-            if ($selected_profile_id !== false) $this->shop->view['profil_id'] = $selected_profile_id;
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/profillist.phtml');
-
-        } // public function profilList()
-
-        public function handleExport() {
-			
-            $arProfile = wpsg_xss(array_values($_REQUEST['wpsg_mod_export_profile']));
-
-            set_time_limit(2400);
-
-            parse_str($_REQUEST['filter'], $filter);
-            if (!wpsg_isSizedArray($filter['filter'])) $filter['filter'] = array();
-
-            $arFiles = array();
-
-            if (sizeof($arProfile) >= 1) {
-
-                $this->loadFields();
-
-                foreach ($arProfile as $profil_id) {
-
-                    $profil = $this->loadProfil($profil_id);
-					$filename = $profil['filename'];
-
-                    if ($profil['export_type'] === self::TYPE_ORDER) {
-
-                        if ($profil['format'] == self::FORMAT_CSV) list($arData, $file) = $this->handleExportCSV($profil_id, $filter['filter']);
-                        else if ($profil['format'] == self::FORMAT_XML) list($arData, $file) = $this->handleExportXML($profil_id, $filter['filter']);
-								
-						if (sizeof($arData) === 1) {
-							
-							$filename = wpsg_ShopController::getShop()->replaceUniversalPlatzhalter($filename, array_values($arData)[0]->getId());
+			
+			foreach ($this->shop->view['arProfile'] as $k => $v)
+			{
+				
+				$this->shop->view['arProfile'][$k]['data'] = @unserialize($v['data']);
+							
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/profillist.phtml');
+			
+		} // public function profilList()
+		
+		public function handleExport()
+		{
+						
+			$arProfile = explode(",", $_REQUEST['wpsg_mod_export_profile']);
+			
+			if (sizeof($arProfile) >= 1)
+			{
+				
+				$this->loadFields();
+
+				foreach ($arProfile as $profil_id)
+				{
+					
+					$profil = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($profil_id)."'");
+					$profil['data'] = @unserialize($profil['data']);
+					$profil['filename'] = $profil['data']['filename'];
+					
+					$tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
+					
+					$filehandler = fopen($tmpfname, 'w');
+					
+					// Kopf
+					if ($profil['data']['firstlinecolname'] == '1')
+					{
+					
+						$row = array();
+						
+						foreach ($profil['data']['fields'] as $f)
+						{
+							
+							$row[] = $f['name'];
 							
 						}
 						
-                    } else if ($profil['export_type'] === self::TYPE_PRODUCT) {
-
-                        if ($profil['format'] == self::FORMAT_CSV) $file = $this->handleExportProductCSV($profil_id, $filter['filter']);
-                        else if ($profil['format'] == self::FORMAT_XML) $file = $this->handleExportProductXML($profil_id, $filter['filter']);
-
-                    } else if ($profil['export_type'] === self::TYPE_CUSTOMER) {
-
-                        if ($profil['format'] == self::FORMAT_CSV) $file = $this->handleExportCustomerCSV($profil_id, $filter['filter']);
-                        else if ($profil['format'] == self::FORMAT_XML) $file = $this->handleExportCustomerXML($profil_id, $filter['filter']);
-
-                    } else if ($profil['export_type'] === self::TYPE_ABO) {
-
-                        if ($profil['format'] == self::FORMAT_CSV) $file = $this->handleExportAboCSV($profil_id, $filter['filter']);
-                        else if ($profil['format'] == self::FORMAT_XML) $file = $this->handleExportAboXML($profil_id, $filter['filter']);
-
-                    }
-					
-                    $arFiles[] = array(
-                        $file,
-                        $filename,
-                        $profil['cron_path'],
-                        $profil['format']
-                    );
-
-                }
-
-            }
-			
-            if (sizeof($arFiles) > 1)
-            {
-
-                // Zip erstellen und ablegen
-                $zip = new ZipArchive();
-                $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-
-                if ($zip->open($tmpfname, ZIPARCHIVE::CREATE) == true)
-                {
-
-                    foreach ($arFiles as $f)
-                    {
-
-                        $zip->addFile($f[0], $f[1]);
-
-                    }
-
-                    $zip->close();
-
-                    header("Content-Type: application/octet-stream");
-                    header("Content-Disposition: attachment; filename=export.zip");
-                    header("Pragma: no-cache");
-                    header("Expires: 0");
-
-                    die(file_get_contents($tmpfname));
-
-                }
-                else
-                {
-
-                    throw new \Exception(__('Konnte Zip Archiv nicht erstellen!', 'wpsg'));
-
-                }
-
-            }
-            else
-            {
-
-				//die('<pre>'.nl2br(file_get_contents($arFiles[0][0])));
-				
-                if ($arFiles[0][3] == self::FORMAT_CSV) header("Content-Type: text/csv");
-                else header("Content-Type: text/xml");
-
-                header("Content-Disposition: attachment; filename=".$arFiles[0][1]);
-                header("Pragma: no-cache");
-                header("Expires: 0");
-
-                die(file_get_contents($arFiles[0][0]));
-
-            }
-
-            $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order');
-
-        } // public function handleExport()
-
-        public function product_index_tab()
-        {
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/product_index_tab.phtml');
-
-        } // public function product_index_tab() 
-
-        public function order_index_tab(&$arTabs)
-        {
-
-            $this->shop->view['wpsg_mod_export']['arProfile'] = $this->db->fetchAssoc("
-				SELECT 
-					* 
-				FROM 
-					`".WPSG_TBL_EXPORTPROFILE."`
-				WHERE
-					`export_type` = '".self::TYPE_ORDER."'
-			");
-
-            if (sizeof($this->shop->view['wpsg_mod_export']['arProfile']) <= 0) return;
-
-            $arTabs['left'][$this->id] = array(
-                'tab_title' => __('Bestellexport', 'wpsg'),
-                'tab_icon' => 'glyphicon glyphicon-export',
-                'tab_content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/order_index_tab.phtml', false)
-            );
-
-        } // public function order_index_tab(&$arTabs)
-
-        public function be_ajax()
-        {
-
-            if ($_REQUEST['do'] == 'wpsg_mod_export_addProfil')
-            {
-
-                $new_id = $this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE, array(
-                    'name' => wpsg_q(__('Neues Profil', 'wpsg')),
-                    'filename' => 'export.csv',
-                    'export_type' => wpsg_q($_REQUEST['type']),
-                    'file_encoding' => wpsg_q(self::ENCODING_UTF8),
-                    'field_delimiter' => ';',
-                    'field_enclosure' => '"',
-                    'field_escape' => wpsg_q('\\'),
-                    'format' => wpsg_q(self::FORMAT_CSV)
-                ));
-
-                die($this->profilList($new_id));
-
-            }
-            else if ($_REQUEST['do'] == 'handleExport')
-            {
-
-                die($this->handleExport());
-
-            }
-            else if ($_REQUEST['do'] == 'wpsg_mod_export_removeProfil')
-            {
-
-                $this->db->Query("DELETE FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil'])."'");
-
-                die($this->profilList());
-
-            }
-            else if ($_REQUEST['do'] == 'wpsg_mod_export_removeField')
-            {
-
-                $this->db->Query("DELETE FROM `".WPSG_TBL_EXPORTPROFILE_FIELDS."` WHERE `id` = '".wpsg_q($_REQUEST['field_id'])."' ");
-
-                die("1");
-
-            }
-            else if ($_REQUEST['do'] == 'wpsg_mod_export_reorder')
-            {
-
-                parse_str($_REQUEST['wpsg_reorder'], $reorder);
-
-                foreach ($reorder['field'] as $k => $field_id)
-                {
-
-                    $this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE_FIELDS, array(
-                        'pos' => wpsg_q($k)
-                    ), " `id` = '".wpsg_q($field_id)."' ");
-
-                }
-
-                die("1");
-
-            }
-            else if ($_REQUEST['do'] == 'wpsg_mod_export_addField')
-            {
-
-                $max_pos = $this->db->fetchOne("SELECT MAX(`pos`) FROM `".WPSG_TBL_EXPORTPROFILE_FIELDS."` WHERE `profil_id` = '".wpsg_q($_REQUEST['profil_id'])."' ");
-
-                $this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE_FIELDS, array(
-                    'profil_id' => wpsg_q($_REQUEST['profil_id']),
-                    'name' => __('Neues Feld', 'wpsg'),
-                    'pos' => wpsg_q($max_pos + 1),
-                    'value_key' => '-1'
-                ));
-
-                die($this->renderFields($this->loadProfil($_REQUEST['profil_id'])));
-
-            }
-            else if ($_REQUEST['do'] == 'wpsg_mod_export_profilSwitch')
-            {
-
-                die($this->renderProfil($_REQUEST['profil']));
-
-            }
-            else if ($_REQUEST['do'] == 'save')
-            {
-
-                $arProfil = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil_id'])."' ");
-                $arProfil['fields'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE_FIELDS."` WHERE `profil_id` = '".wpsg_q($arProfil['id'])."' ");
-
-                wpsg_header::startDownloadContent('profil.json', json_encode($arProfil));
-                exit;
-
-            }
-            else if ($_REQUEST['do'] == 'import')
-            {
-
-                $content = file_get_contents($_FILES['profil_file']['tmp_name']);
-                $content = wpsg_removeBOM($content);
-                $arData = @json_decode($content, true);
-
-                if (!wpsg_isSizedArray($arData))
-                {
-
-                    $this->shop->addBackendError(wpsg_translate(__('Datei ist keine gÃŒltige Profildatei. Error: #1#', 'wpsg'), json_last_error_msg()));
-
-                }
-                else
-                {
-
-                    $arFields = $arData['fields']; unset($arData['fields']);
-
-                    unset($arData['id']);
-                    unset($arData['cron_lastrun']);
-
-                    $profil_id = $this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE, wpsg_q($arData), true);
-
-                    foreach ($arFields as $field_data)
-                    {
-
-                        unset($field_data['id']);
-                        $field_data['profil_id'] = $profil_id;
-
-                        $this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE_FIELDS, wpsg_q($field_data), true);
-
-                    }
-
-                    $this->shop->addBackendMessage(wpsg_translate(__('Profil als "#1#" erfolgreich importiert.', 'wpsg'), $arData['name']));
-
-                }
-
-                $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export');
-
-            }
-            else if ($_REQUEST['do'] == 'inlinedit') {
-
-                if (preg_match('/field_/', $_REQUEST['name']) && !in_array($_REQUEST['name'], ['field_delimiter', 'field_enclosure', 'field_escape'])) {
-
-                    // Feldwert wurde bearbeitet
-                    $field_id = preg_replace('/(.*)\_/', '', $_REQUEST['name']);
-                    $col = preg_replace('/\_\d+$/', '', $_REQUEST['name']);
-
-                    switch ($col) {
-
-                        case 'field_name': $col = 'name'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                        case 'field_format': $col = 'format'; break;
-                        case 'field_userformat': $col = 'userformat'; break;
-                        case 'field_typ': $col = 'value_key'; break;
-                        case 'field_xml_att': $col = 'xml_att'; break;
-	                    case 'field_static': $col = 'static'; break;
-						
-                        default: throw new \Exception(__('UngÃŒltiger Feldname (Feld)', 'wpsg').' '.$col);
-
-                    }
-
-                    $this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE_FIELDS, array(
-                        wpsg_q($col) => wpsg_q(wpsg_xss($_REQUEST['value']))
-                    ), " `id` = '".wpsg_q($field_id)."' ");
-
-                    echo $this->db->fetchOne("SELECT `".wpsg_q($col)."` FROM `".WPSG_TBL_EXPORTPROFILE_FIELDS."` WHERE `id` = '".wpsg_q($field_id)."' ");
-                    exit;
-
-                } else if (preg_match('/orderfilter_/', $_REQUEST['name'])) {
-
-                    // Wert aus dem Bestellfilter wurde bearbeitet					
-                    $col = substr($_REQUEST['name'], 12);
-
-                    switch ($col) {
-
-                        case 's': $col = 's'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                        case 'k_id': $col = 'k_id'; break;
-                        case 'status': $col = 'status'; break;
-                        case 'cdate_m': $col = 'cdate_m'; break;
-                        case 'cdate_y': $col = 'cdate_y'; break;
-                        case 'invoicedate_m': $col = 'invoicedate_m'; break;
-                        case 'productgroup_ids': $col = 'productgroup_ids'; break;
-                        case 'productcategory_ids': $col = 'productcategory_ids'; break;
-
-                        default: throw new \Exception(__('UngÃŒltiger Feldname (Bestellfilter)', 'wpsg'));
-
-                    }
-
-                    $orderfilter = $this->db->fetchOne("SELECT `orderfilter` FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil_id'])."' ");
-                    $orderfilter = @unserialize($orderfilter);
-                    if (!is_array($orderfilter)) $orderfilter = array();
-
-                    $orderfilter[$col] = $_REQUEST['value'];
-
-                    $this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, array('orderfilter' => wpsg_q(serialize($orderfilter))), " `id` = '".wpsg_q($_REQUEST['profil_id'])."' ");
-
-                    echo $orderfilter[$col];
-                    exit;
-
-                }
-
-                $col = null;
-
-                switch ($_REQUEST['name'])
-                {
-
-                    case 'name': $col = 'name'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'filename': $col = 'filename'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'file_encoding': $col = 'file_encoding'; break;
-                    case 'format': $col = 'format'; break;
-                    case 'field_delimiter': $col = 'field_delimiter'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'field_enclosure': $col = 'field_enclosure'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'field_escape': $col = 'field_escape'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'order_online': $col = 'order_online'; break;
-                    case 'field_delimiter': $col = 'field_delimiter'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'field_enclosure': $col = 'field_enclosure'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'field_escape': $col = 'field_escape'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'order_onetime': $col = 'order_onetime'; break;
-                    case 'csv_pvariants_separated': $col = 'csv_pvariants_separated'; break;
-                    case 'csv_fieldnames': $col = 'csv_fieldnames'; break;
-                    case 'cron_interval': $col = 'cron_interval'; break;
-                    case 'cron_path': $col = 'cron_path'; $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']); break;
-                    case 'wp_cron': $col = 'wp_cron'; $_REQUEST['value'] = intval($_REQUEST['value']); break;
-                    case 'xml_roottag': $col = 'xml_roottag'; break;
-                    case 'xml_ordertag': $col = 'xml_ordertag'; break;
-                    case 'xml_productroottag': $col = 'xml_productroottag'; break;
-                    case 'xml_customertag': $col = 'xml_customertag'; break;
-                    case 'xml_producttag': $col = 'xml_producttag'; break;
-
-                    default: throw new \Exception(__('UngÃŒltiger Feldname (Profil)', 'wpsg'));
-
-                }
-
-                $this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, array(
-                    wpsg_q($col) => wpsg_q($_REQUEST['value'])
-                ), " `id` = '".wpsg_q($_REQUEST['profil_id'])."' ");
-
-                echo $this->db->fetchOne("SELECT `".wpsg_q($col)."` FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil_id'])."' ");
-                exit;
-
-            }
-            else if ($_REQUEST['do'] == 'musterupload')
-            {
-
-                $arProfil = $this->loadProfil($_REQUEST['profil_id']);
-
-                if ($arProfil['file_encoding'] == self::ENCODING_ISO88591)
-                {
-
-                    $strFileContent = wpsg_toUtf8(file_get_contents($_FILES['file']['tmp_name']));
-
-                }
-                else
-                {
-
-                    $strFileContent = file_get_contents($_FILES['file']['tmp_name']);
-
-                }
-
-                if ($arProfil['format'] == self::FORMAT_CSV)
-                {
-
-                    // Alles nach erstem Zeilenumbruch entfernen
-                    $strFileContent = preg_replace("/\r(.*)/s", "", $strFileContent);
-
-                    $arFields = explode($arProfil['field_delimiter'], $strFileContent);
-
-                    if (sizeof($arFields) > 1)
-                    {
-
-                        foreach ($arFields as $f)
-                        {
-
-                            // Hochkommas am Anfang und am Ende abtrennen
-                            if (preg_match('/^\"(.*)\"$/', $f)) $f = substr($f, 1, strlen($f) - 2);
-
-                            // Existiert das Feld schon
-                            $existID = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_EXPORTPROFILE_FIELDS."` WHERE `profil_id` = '".wpsg_q($_REQUEST['profil_id'])."' AND `name` = '".wpsg_q($f)."' ");
-
-                            if (!wpsg_isSizedInt($existID))
-                            {
-
-                                $this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE_FIELDS, array(
-                                    'profil_id' => wpsg_q($_REQUEST['profil_id']),
-                                    'name' => wpsg_q($f),
-                                    'value_key' => '-1'
-                                ));
-
-                            }
-
-                        }
-
-                    }
-
-                }
-
-                $this->shop->addBackendMessage(__('Muster Datei erfolgreich verarbeitet.', 'wpsg'));
-
-                die($this->renderFields($this->loadProfil($_REQUEST['profil_id'])));
-
-            }
-
-        } // public function be_ajax()
-
-	    public function basket_save_done(&$order_id, &$kunde_id, &$oBasket) {
-			
-			$arProfile = $this->db->fetchAssoc("
-				SELECT
-					EXP.`id`, EXP.`cron_interval`, EXP.`cron_lastrun`, EXP.`orderfilter`, EXP.`cron_path`, EXP.`filename`, EXP.`format`, EXP.`export_type`
-				FROM
-					`".WPSG_TBL_EXPORTPROFILE."` AS EXP 
-				WHERE
-					EXP.`cron_interval` = '".wpsg_q(self::CRON_ORDER)."' AND
-					EXP.`export_type` = '".wpsg_q(self::TYPE_ORDER)."'
-			");
-						
-			foreach ($arProfile as $profil) {
-			
-				$this->shop->cache->clearOrderCache($order_id);
-				wpsg_order::clearCache($order_id);
-				
-				$arFilter = ['id' => $order_id];
-				
-				if ($profil['format'] == self::FORMAT_CSV) list($arData, $file) = $this->handleExportCSV($profil['id'], $arFilter);
-                else if ($profil['format'] == self::FORMAT_XML) list($arData, $file) = $this->handleExportXML($profil['id'], $arFilter);
-				 
-				if (sizeof($arData) === 1) {
-							 
-					$profil['filename'] = wpsg_ShopController::getShop()->replaceUniversalPlatzhalter($profil['filename'], array_values($arData)[0]->getId());
-					
-				}
-	 
-				if (wpsg_remoteconnection::handleConenctionString($profil['cron_path'], $profil['filename'], $file) !== true) {
-
-                    $target_path = $profil['cron_path'];
-                    if (is_dir($target_path)) $target_path = $target_path.'/'.$profil['filename'];
-
-                    file_put_contents($target_path, file_get_contents($file));
-
-                }
-				
-				// Letzte AusfÃŒhrung speichern
-                $this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, array(
-                    'cron_lastrun' => 'NOW()'
-                ), " `id` = '".wpsg_q($profil['id'])."' ");
-				
-			}
-						
-	    }
-	    
-        public function cron($wp_cron = false) {
-
-            // Alle Profile laden, die automatisiert aufgerufen werden
-            $arProfile = $this->db->fetchAssoc("
-				SELECT
-					EXP.`id`, EXP.`wp_cron`, EXP.`cron_interval`, EXP.`cron_lastrun`, EXP.`orderfilter`, EXP.`cron_path`, EXP.`filename`, EXP.`format`, EXP.`export_type`
-				FROM
-					`".WPSG_TBL_EXPORTPROFILE."` AS EXP 
-				WHERE
-					EXP.`cron_interval` > 0
-			");
-
-            foreach ($arProfile as $profil) {
-
-                if ($profil['wp_cron'] !== '1' && $wp_cron === true) continue;
-
-                if ($profil['cron_lastrun'] == '0000-00-00') $cron_lastrun = 0;
-                else $cron_lastrun = strtotime($profil['cron_lastrun']);
-
-                $bRun = false;
-                if ($cron_lastrun <= 0) $bRun = true;
-                else
-                {
-
-                    switch ($profil['cron_interval'])
-                    {
-
-                        case self::CRON_LIVE:
-
-                            $bRun = true;
-                            break;
-
-                        case self::CRON_DAILY:
-
-                            if (strtotime("+1 day", $cron_lastrun) < time()) $bRun = true;
-                            break;
-
-                        case self::CRON_MONTHLY:
-
-                            if (strtotime("+1 month", $cron_lastrun) < time()) $bRun = true;
-                            break;
-
-                        case self::CRON_WEEKLY:
-
-                            if (strtotime("+1 week", $cron_lastrun) < time()) $bRun = true;
-                            break;
-
-                    }
-
-                }
-
-                if ($bRun === true)
-                {
-
-                    $arFilter = @unserialize($profil['orderfilter']);
-                    if (!wpsg_isSizedArray($arFilter)) $arFilter = array();
-
-                    if ($profil['export_type'] == self::TYPE_ORDER)
-                    {
-
-                        if ($profil['format'] == self::FORMAT_CSV) list($arData, $file) = $this->handleExportCSV($profil['id'], $arFilter);
-                        else if ($profil['format'] == self::FORMAT_XML) list($arData, $file) = $this->handleExportXML($profil['id'], $arFilter);
-
-                    }
-                    else if ($profil['export_type'] == self::TYPE_PRODUCT)
-                    {
-
-                        if ($profil['format'] == self::FORMAT_CSV) $file = $this->handleExportProductCSV($profil['id'], $arFilter);
-                        else if ($profil['format'] == self::FORMAT_XML) $file = $this->handleExportProductXML($profil['id'], $arFilter);
-
-                    }
-                    else if ($profil['export_type'] == self::TYPE_CUSTOMER)
-                    {
-
-                        if ($profil['format'] == self::FORMAT_CSV) $file = $this->handleExportCustomerCSV($profil['id'], $arFilter);
-                        else if ($profil['format'] == self::FORMAT_XML) $file = $this->handleExportCustomerXML($profil['id'], $arFilter);
-
-                    }
-                    else if ($profil['export_type'] == self::TYPE_ABO)
-                    {
-
-                        if ($profil['format'] == self::FORMAT_CSV) $file = $this->handleExportAboCSV($profil['id'], $arFilter);
-                        else if ($profil['format'] == self::FORMAT_XML) $file = $this->handleExportAboXML($profil['id'], $arFilter);
-
-                    }
-
-                    if (wpsg_remoteconnection::handleConenctionString($profil['cron_path'], $profil['filename'], $file) !== true)
-                    {
-
-                        $target_path = $profil['cron_path'];
-                        if (is_dir($target_path)) $target_path = $target_path.'/'.$profil['filename'];
-
-                        file_put_contents($target_path, file_get_contents($file));
-
-                    }
-
-                    // Letzte AusfÃŒhrung speichern
-                    $this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, array(
-                        'cron_lastrun' => 'NOW()'
-                    ), " `id` = '".wpsg_q($profil['id'])."' ");
-
-                }
-
-            }
-
-        } // public function cron()
-
-        /* Modulfunktionen */
-
-        /**
-         * Gibt einen Array der Profile aus der Datenbank zurÃŒck
-         * @param Array $type
-         */
-        public function getProfile($type)
-        {
-
-            return $this->db->fetchAssoc("
-				SELECT
-					P.*
-				FROM
-					`".WPSG_TBL_EXPORTPROFILE."` AS P
-			  	WHERE
-					P.`export_type` = '".wpsg_q($type)."'  
-			");
-
-        } // public function getProfile($type)
-
-        /**
-         * Erstellt die CSV und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Produktexport)
-         *
-         * @param $profil_id
-         * @param array $arOrderFilter
-         */
-        private function handleExportProductCSV($profil_id, $arProductFilter = array()) {
-
-            $this->loadFields();
-
-            $arData = wpsg_product::find($arProductFilter);
-
-            $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-            $filehandler = fopen($tmpfname, 'w');
-
-            $profil = $this->loadProfil($profil_id);
-
-            $arExportData = array();
-
-            if ($profil['csv_fieldnames'] == '1') {
-
-                $row = array();
-
-                foreach ($profil['fields'] as $f) {
-
-                    $row[] = $f['name'];
-
-                }
-
-                $arExportData[] = $row;
-
-            }
-
-            if ($this->shop->hasMod('wpsg_mod_productvariants')) 
-            {
-
-                foreach ($arData as $oProduct) 
-                {
-
-                    if (!empty($oProduct->getPossibleProductVariantKeys()) && ($profil['csv_pvariants_separated'] == '1')) 
-                    {
-
-                        //$variants = $this->shop->callMod('wpsg_mod_productvariants', 'getVariants', [$oProduct->id, true, true, true]);
-                        $variants = $oProduct->getPossibleProductVariantKeys();
-
-                        foreach ($variants as $variant) 
-                        {
-
-                            // wpsg_debug($variant);
-
-                            $row = array();
-                            foreach ($profil['fields'] as $f) $row[] = $this->getValue($f, $profil['field_delimiter'], false, $oProduct->id, null, null, $variant['var_key']);
-                            $arExportData[] = $row;
-
-                        }
-
-                    } 
-                    else 
-                    {
-
-                        $row = array();
-                        foreach ($profil['fields'] as $f) $row[] = $this->getValue($f, $profil['field_delimiter'], false, $oProduct->id);
-                        $arExportData[] = $row;
-
-                    }
-
-                }
-
-            } 
-            else
-            {
-
-                foreach ($arData as $oProduct) 
-                {
-
-                    $row = array();
-
-                    foreach ($profil['fields'] as $f) {
-
-                        $row[] = $this->getValue($f, $profil['field_delimiter'], false, $oProduct->id);
-
-                    }
-
-                    $arExportData[] = $row;
-
-                } 
-
-            }
-
-            foreach ($arExportData as $row)
-            {
-
-                fputcsv($filehandler, $row, $profil['field_delimiter'], $profil['field_enclosure'], $profil['field_escape']);
-
-            }
-
-            fclose($filehandler);
-
-            // In ISO wandeln
-            if ($profil['file_encoding'] == self::ENCODING_ISO88591)
-            {
-
-                file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
-
-            }
-
-            return $tmpfname;
-
-        } // private function handleExportProductXML($profil_id, $arOrderFilter = array())
-
-        /**
-         * Erstellt die CSV und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Bestellexport)
-         *
-         * @param $profil_id
-         * @param array $arOrderFilter
-         */
-        private function handleExportCSV($profil_id, $arOrderFilter = array()) {
-
-            $this->loadFields();
-
-			/** @var wpsg_order[] $arData */
-            $arData = wpsg_order::find($arOrderFilter);
-
-            $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-            $filehandler = fopen($tmpfname, 'w');
-
-            $profil = $this->loadProfil($profil_id);
-
-			$start = microtime(true);
-			
-            $arExportData = array();
-
-            if ($profil['csv_fieldnames'] == '1') {
-
-                $row = array();
-
-                foreach ($profil['fields'] as $f) {
-
-                    $row[] = $f['name'];
-
-                }
-
-                $arExportData[] = $row;
-
-            }
- 
-            foreach ($arData as $oOrder) {
-
-				$order_id = $oOrder->getId();
-				
-				if (intval($profil['order_onetime']) === 1 && intval($oOrder->getMeta('wpsg_mod_export_order_onetime_'.$profil_id, false, 0)) > 0) continue;
-				
-                $row = array();
-
-                if ($profil['order_online'] == '1') {
-
-                    foreach ($profil['fields'] as $f) {
-
-                        try {                     
-                        
-							$row[] = $this->getValue($f, $profil['field_delimiter'], $order_id);
-
-                        } catch (Throwable $e) {
-							
-							$arValues = [];
-							
-							foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-					 
-								$arValues[] = $this->getValue($f, $profil['field_delimiter'], $order_id, $oOrderProduct->getProductId(), $oOrder->getCustomer()->getId(), $oOrderProduct->getId());
+						fputcsv($filehandler, $row, $profil['data']['separator']);
+						
+					}
+					
+					foreach ($this->shop->view['data'] as $d) 
+					{
+												
+						$row = array();
+						
+						if ($profil['data']['oneline'] == '1')
+						{
+						
+							foreach ($profil['data']['fields'] as $f) 
+							{
+
+								$row[] = $this->getValue($f, $profil['data']['separator'], $d['id']);
 								
 							}
 							
-							$row[] = implode(',', $arValues);
-							
-                        }
-
-                    }
-
-                    $arExportData[] = $row;
-
-                } else {
-
-                    $arProdukte = $this->db->fetchAssoc("
-                        SELECT 
-                            OP.`p_id`, 
-                            OP.`productkey`, 
-                            OP.`product_index`,
-                            OP.`id` AS `order_product_id`
-                        FROM 
-                            `".WPSG_TBL_ORDERPRODUCT."` AS OP 
-                        WHERE 
-                            OP.`o_id` = '".wpsg_q($order_id)."'
-                    ");
-
-                    foreach ($arProdukte as $p) {
-
-                        $row = array();
-
-                        foreach ($profil['fields'] as $f) {
- 
-                            $row[] = $this->getValue($f, $profil['field_delimiter'], $order_id, $p['p_id'], null, intval($p['order_product_id']));
-
-                        }
-
-                        $arExportData[] = $row;
-
-                    }
-
-                }
-				
-                if (\memory_get_usage() > 200000) {
-
-                   // $this->arCache = [];
-
-                }
-                
-                $this->shop->callMods('wpsg_mod_export_handleRowOrder', [$order_id, $profil, &$arExportData]);
-
-				$oOrder->setMeta('wpsg_mod_export_order_onetime_'.$profil_id, time());
-	           
-            } // foreach arData
-
-			// die(wpsg_debug($arExportData));
-			
-            foreach ($arExportData as $row) {
-
-                fputcsv($filehandler, $row, $profil['field_delimiter'], $profil['field_enclosure'], $profil['field_escape']);
-
-            }
-
-            fclose($filehandler);
-
-            // In ISO wandeln
-            if ($profil['file_encoding'] == self::ENCODING_ISO88591) {
-
-                file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
-
-            }
-
-            return [$arData, $tmpfname];
-
-        } // private function handleExportCSV($arProfile, $arOrderFilter = array(), $cron = false)
-
-        /**
-         * Erstellt die CSV und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Aboexport)
-         *
-         *
-         */
-        private function handleExportAboCSV()
-        {
-
-            //TODO
-
-        }
-
-        /**
-         * Erstellt die CSV und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Kundenexport)
-         *
-         * @param $profil_id
-         * @param array $arOrderFilter
-         */
-        private function handleExportCustomerCSV($profil_id, $arCustomerFilter = array())
-        {
-
-            $this->loadFields();
-
-            $arData = wpsg_customer::find($arCustomerFilter);
-
-            $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-            $filehandler = fopen($tmpfname, 'w');
-
-            $profil = $this->loadProfil($profil_id);
-
-            $arExportData = array();
-
-            if ($profil['csv_fieldnames'] == '1')
-            {
-
-                $row = array();
-
-                foreach ($profil['fields'] as $f)
-                {
-
-                    $row[] = $f['name'];
-
-                }
-
-                $arExportData[] = $row;
-
-            }
-
-            foreach ($arData as $oCustomer)
-            {
-
-                $row = array();
-
-                foreach ($profil['fields'] as $f)
-                {
-
-                    $row[] = $this->getValue($f, $profil['field_delimiter'], null, null, $oCustomer->id);
-
-                }
-
-                $arExportData[] = $row;
-
-            } // foreach arData
-
-            foreach ($arExportData as $row)
-            {
-
-                fputcsv($filehandler, $row, $profil['field_delimiter'], $profil['field_enclosure'], $profil['field_escape']);
-
-            }
-
-            fclose($filehandler);
-
-            // In ISO wandeln
-            if ($profil['file_encoding'] == self::ENCODING_ISO88591)
-            {
-
-                file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
-
-            }
-
-            return $tmpfname;
-
-        } // private function handleExportCustomerCSV($profil_id, $arOrderFilter = array())
-
-        /**
-         * Erstellt die XML und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Produktexport)
-         *
-         * @param $profil_id
-         * @param array $arProductFilter
-         * @return string
-         * @throws Exception
-         */
-        private function handleExportProductXML($profil_id, $arProductFilter = array()) {
-
-            $this->loadFields();
-
-            $arData = wpsg_product::find($arProductFilter);
-            $profil = $this->loadProfil($profil_id);
-
-            if (!wpsg_isSizedString($profil['xml_roottag'])) throw new \Exception(wpsg_translate(__('Kein XML Root Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-            if (!wpsg_isSizedString($profil['xml_producttag'])) throw new \Exception(wpsg_translate(__('Kein XML Produkt Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
- 
-            $doc = new DOMDocument('1.0', 'utf-8');
-            $doc->formatOutput = true;
-
-            $root = $doc->createElement($this->clearXML($profil['xml_roottag']));
-            $root = $doc->appendChild($root);
-			
-            foreach ($arData as $oProduct)
-            {
-
-                $tag_product = $doc->createElement($this->clearXML($profil['xml_producttag']));
-                $tag_product = $root->appendChild($tag_product);
-
-                foreach ($profil['fields'] as $f)
-                {
-
-                    $value = $this->getValue($f, $profil['field_delimiter'], false, $oProduct->id);
-
-                    if (wpsg_isSizedInt($f['xml_att'])) {
-
-                        $att = $doc->createAttribute($this->clearXML($f['name']));
-                        $att->value = htmlspecialchars($value);
-
-                        $tag_product->appendChild($att);
-
-                    } else {
-
-                        $tag = $doc->createElement($this->clearXML($f['name']));
-                        $tag = $tag_product->appendChild($tag);
-
-						if (intval($f['format']) === 950) {
-							
-							$tag_value = $doc->createCDATASection($value);
-							
-						} else {
-							
-							$tag_value = $doc->createTextNode(htmlspecialchars($value));
-							
-						} 
-						
-                        $tag->appendChild($tag_value);
-
-                    }
-
-                }
-
-            }
-
-            $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-            file_put_contents($tmpfname, $doc->saveXML());
-
-            // In ISO wandeln
-            if ($profil['file_encoding'] == self::ENCODING_ISO88591)
-            {
-
-                file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
-
-            }
-
-            return $tmpfname;
-
-        } // private function handleExportProductXML($profil_id, $arProductFilter = array())
-
-        /**
-         * Erstellt die XML und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Bestellexport)
-         *
-         * @param $arProfile
-         * @param array $arOrderFilter
-         */
-        private function handleExportXML($profil_id, $arOrderFilter = array()) {
-
-            $this->loadFields();
-
-            $arData = wpsg_order::find($arOrderFilter);
-
-			//$arData = [wpsg_order::getInstance(3662)];
-	        
-            $profil = $this->loadProfil($profil_id);
-
-            if (!wpsg_isSizedString($profil['xml_roottag'])) throw new \Exception(wpsg_translate(__('Kein XML Root Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-            if (!wpsg_isSizedString($profil['xml_ordertag'])) throw new \Exception(wpsg_translate(__('Kein XML Bestellung Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-            if (!wpsg_isSizedString($profil['xml_productroottag'])) throw new \Exception(wpsg_translate(__('Kein XML Produkt Roottagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-            if (!wpsg_isSizedString($profil['xml_producttag'])) throw new \Exception(wpsg_translate(__('Kein XML Produkt Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-
-            $doc = new DOMDocument('1.0', 'utf-8');
-            $doc->formatOutput = true;
-
-            $root = $doc->createElement($this->clearXML($profil['xml_roottag']));
-            $root = $doc->appendChild($root);
-
-			foreach ($profil['fields'] as $field_index => $f) {
-				
-				if ($this->getFieldGroup($f['value_key']) === 5) {
-				
-					if (strpos($f['name'], '/') !== false) {
-						
-						$value = $this->getValue($f, $profil['field_delimiter'], 0);
-						
-						$arRootline = explode('/', $f['name']);
-						if ($arRootline[0] !== $profil['xml_ordertag'] && $arRootline[0] !== $profil['xml_productroottag']) {
-						
-							$this->addXMLNode($doc, $root, $f['name'], $value, $f);
-							unset($profil['fields'][$field_index]);
-
+							fputcsv($filehandler, $row, $profil['data']['separator']);
+							
 						}
-						
-					}
-					
-				}				 
-				
-			}
-			
-            foreach ($arData as $oOrder) {
-
-				if (intval($profil['order_onetime']) === 1 && intval($oOrder->getMeta('wpsg_mod_export_order_onetime_'.$profil_id, false, 0)) > 0) continue;
-				
-                $tag_order = $doc->createElement($this->clearXML($profil['xml_ordertag']));
-                $tag_order = $root->appendChild($tag_order);
-
-                $tag_product_root = false;
-
-                if (wpsg_isSizedString($profil['xml_productroottag'])) {
-
-                    $tag_product_root = $doc->createElement($this->clearXML($profil['xml_productroottag']));
-                    $tag_product_root = $tag_order->appendChild($tag_product_root);
-
-                }
-
-                // Produkte
-                $arOrderProducts = $oOrder->getOrderProducts();
-
-                foreach ($arOrderProducts as $oOrderProduct) {
-					
-                    $tag_product = false;
-
-                    foreach ($profil['fields'] as $f) {
-
-						$arRootline = explode('/', $f['name']);
-						
-                        // Wert ist ein Produktfeld
-                        if ($this->getFieldGroup($f['value_key']) == 20 || (sizeof($arRootline) > 0 && $arRootline[0] === $profil['xml_productroottag'] && $arRootline[1] === $profil['xml_producttag'])) {
-
-                            if ($tag_product === false) $tag_product = $doc->createElement($this->clearXML($profil['xml_producttag']));
-
-                            $value = $this->getValue($f, $profil['field_delimiter'], $oOrder->id, $oOrderProduct->getProductId(), null, $oOrderProduct->getId());
-
-                            if (wpsg_isSizedInt($f['xml_att'])) {
-
-                                $att = $doc->createAttribute($this->clearXML($f['name']));
-                                $att->value = htmlspecialchars($value);
-
-                                $tag_product->appendChild($att);
-
-
-                            } else {
-
-								if (strpos($f['name'], '/') !== false) {
-									 
-									if ($arRootline[0] === $profil['xml_productroottag'] && $arRootline[1] === $profil['xml_producttag']) {
-									
-										$this->addXMLNode($doc, $tag_product, implode('/', array_slice($arRootline, 2)), $value, $f);
+						else 
+						{
+							
+							$arProdukte = $this->db->fetchAssoc("
+								SELECT 
+									OP.`p_id`, 
+									OP.`productkey`, 
+									OP.`product_index`,
+									OP.`id` AS `order_product_id`
+								FROM 
+									`".WPSG_TBL_ORDERPRODUCT."` AS OP 
+								WHERE 
+									OP.`o_id` = '".wpsg_q($d['id'])."'
+							");
+							
+							foreach ($arProdukte as $p)
+							{
+							
+								$row = array();
+								
+								foreach ($profil['data']['fields'] as $f)
+								{
+
+									$row[] = $this->getValue($f, $profil['data']['separator'], $d['id'], $p['p_id'], $p['product_index'], $p['productkey'], $p['order_product_id']);
+																		
+								}
+
+								fputcsv($filehandler, $row, $profil['data']['separator']);
+																	
+							}
+							
+						}
+	    				
+					}
+					
+					fclose($filehandler);
+					
+					// In ISO wandeln
+					if ($profil['data']['iso'] == '1')
+					{
+						
+						file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
+												
+					}
+					
+					$arFiles[] = array(strval($profil['data']['filename']), $tmpfname);
+					
+				}
+				
+				if (sizeof($arFiles) == 1)
+				{
+					
+					header("Content-Type: text/csv"); 
+					header("Content-Disposition: attachment; filename=".$arFiles[0][0]); 
+					header("Pragma: no-cache"); 
+					header("Expires: 0"); 
+					
+					die(file_get_contents($arFiles[0][1]));
+						
+				}
+				else if (sizeof($arFiles) > 1)
+				{
+					
+					$zip = new ZipArchive();
+					
+					$tmpfname = tempnam($this->getTmpFilePath(), "wpsg").'.zip';			
+
+					if ($zip->open($tmpfname, ZIPARCHIVE::CREATE) == true) 
+					{
+    
+						foreach ($arFiles as $f)
+						{
+						
+							$zip->addFile($f[1], $f[0]);
+							
+						}
+						
+						$zip->close();
+						
+						header("Content-Type: application/octet-stream"); 
+						header("Content-Disposition: attachment; filename=export.zip"); 
+						header("Pragma: no-cache"); 
+						header("Expires: 0"); 
+						
+						die(file_get_contents($tmpfname));
+						
+					}
+					else
+					{
+						
+						die(__('Konnte Zip Archiv nicht erstellen!', 'wpsg'));
+						
+					}
+					
+				}
+				
+				return true;
+				
+			}
+			
+			return false;			
+			
+		} // public function handleExport()
+		
+		public function produkt_index_head()
+		{
+
+			$this->shop->view['wpsg_mod_export']['arProfile'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."`");
+			
+			if (sizeof($this->shop->view['wpsg_mod_export']['arProfile']) <= 0) return;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/produkt_index_head.phtml');
+			
+		} // public function produkt_index_head()
+		 
+		public function produkt_index_aftersearch()
+		{
+			
+			$this->shop->view['wpsg_mod_export']['arProfile'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."`");
+			
+			if (sizeof($this->shop->view['wpsg_mod_export']['arProfile']) <= 0) return;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/produkt_index_aftersearch.phtml');
+			
+		} // public function produkt_index_aftersearch()
+		
+		public function be_ajax()
+		{
+			
+			if ($_REQUEST['do'] == 'wpsg_mod_export_addProfil')
+			{
+				
+				$this->db->ImportQuery(WPSG_TBL_EXPORTPROFILE, array(
+					"name" => __('Neues Profil', 'wpsg'),
+					"data" => serialize(array('separator' => ';')),
+				));
+				
+				die($this->profilList());
+				
+			}
+			else if ($_REQUEST['do'] == 'wpsg_mod_export_removeProfil')
+			{
+				
+				$this->db->Query("DELETE FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil'])."'");
+				die($this->profilList());
+				
+			
+			}
+			else if ($_REQUEST['do'] == 'wpsg_mod_export_removeField')
+			{
+				
+				$data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil'])."'");
+				$data['data'] = @unserialize($data['data']);
+		 
+				unset($data['data']['fields'][$_REQUEST['field_key']]);
+				
+				$data['data'] = @serialize($data['data']);				
+				$this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, $data, "`id` = '".wpsg_q($_REQUEST['profil'])."'");
+				
+				die("1");
+				
+			}
+			else if ($_REQUEST['do'] == 'wpsg_mod_export_profilSwitch')
+			{
+				
+				$this->loadFields();
+				
+				$this->shop->view['profil'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil'])."'");
+				 
+				$this->shop->view['profil']['data'] = unserialize($this->shop->view['profil']['data']);
+											
+				foreach ((array)$this->shop->view['profil']['data']['fields'] as $k => $v)
+				{
+					if (!isset($v['format'])) $this->shop->view['profil']['data']['fields'][$k]['format'] = 0;
+				}
+				
+				$this->shop->view['arFormats'] = $this->arFormats;
+				$this->shop->view['fields'] = $this->fields;
+				
+				die($this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/profil.phtml'));
+				
+			}
+			else if ($_REQUEST['do'] == 'inlinedit')
+			{
+				
+				$data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil_id'])."'");
+				$data['data'] = @unserialize($data['data']);
+				
+				switch ($_REQUEST['field'])
+				{
+					
+					case 'name': $data['name'] = wpsg_q($_REQUEST['value']); break;
+					case 'filename': $data['data']['filename'] = wpsg_q($_REQUEST['value']); break;
+					case 'separator': $data['data']['separator'] = wpsg_q($_REQUEST['value']); break;
+					case 'oneline': $data['data']['oneline'] = wpsg_q($_REQUEST['value']); break;
+					case 'firstlinecolname': $data['data']['firstlinecolname'] = wpsg_q($_REQUEST['value']); break;
+					case 'iso': $data['data']['iso'] = wpsg_q($_REQUEST['value']); break;
+					
+				}
+				
+				if (preg_match('/fieldname_/', $_REQUEST['field']))				    
+				{
+					
+					$f_id = substr($_REQUEST['field'], 10);
+					$data['data']['fields'][$f_id]['name'] = $_REQUEST['value'];
+					
+				}
+				
+				if (preg_match('/fieldformat_/', $_REQUEST['field']))
+				{
+					
+					$f_id = substr($_REQUEST['field'], 12);
+					$data['data']['fields'][$f_id]['format'] = $_REQUEST['value'];
+					$_REQUEST['value'] = $this->arFormats[$_REQUEST['value']];
+					
+				}
+				
+				if (preg_match('/fielduserformat_/', $_REQUEST['field']))
+				{
+					
+					$f_id = substr($_REQUEST['field'], 16);					
+					$data['data']['fields'][$f_id]['userformat'] = $_REQUEST['value'];
 										
-									}  
-									
-								} else {
+				}
+				
+				if (preg_match('/fieldtyp_/', $_REQUEST['field']))
+				{
+					
+					$f_id = substr($_REQUEST['field'], 9);
+					$data['data']['fields'][$f_id]['value'] = $_REQUEST['value'];
+					$this->loadFields();
+					$_REQUEST['value'] = $this->getFieldName($_REQUEST['value']);
+					
+				}
+				
+				$data['data'] = @serialize($data['data']);				
+				$this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, $data, "`id` = '".wpsg_q($_REQUEST['profil_id'])."'");
+				
+				die($_REQUEST['value']);
+				
+			}
+			else if ($_REQUEST['do'] == 'musterupload')
+			{
+				
+				$data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($_REQUEST['profil_id'])."'");
+				$data['data'] = @unserialize($data['data']);
+				
+				if (!isset($data['data']['separator']) || strlen($data['data']['separator']) < 1) 
+				{
+					
+					$this->shop->addBackendError(__('UngÃŒltiges Trennzeichen angegeben!', 'wpsg'));
+					die('<script type="text/javascript">parent.wpsg_mod_export_profilSwitch();</script>');
+						
+				}
+				
+				if ($data['data']['iso'] == '1')
+				{
+
+					$strFileContent = wpsg_toUtf8(file_get_contents($_FILES['wpsg_mod_export_muster']['tmp_name']));
+					
+				}
+				else
+				{
+				
+					$strFileContent = file_get_contents($_FILES['wpsg_mod_export_muster']['tmp_name']);
+					
+				}
+
+				// Alles nach erstem Zeilenumbruch entfernen
+				$strFileContent = preg_replace("/\r(.*)/s", "", $strFileContent);
+
+				$arFields = explode($data['data']['separator'], $strFileContent);
+				
+				if (sizeof($arFields) > 1) 
+				{
+					
+					// Neue Felder gefundne, verwirft die alten
+					$data['data']['fields'] = array();
+					
+					foreach ($arFields as $f) 
+					{
+
+						if (preg_match('/^\"(.*)\"$/', $f)) $f = substr($f, 1, strlen($f) - 2);
+						
+						$data['data']['fields'][] = array(
+							'name' => $f,
+							'value' => '-1'
+						);							
+						
+					}
+				
+				}
+				
+				$data['data'] = @serialize($data['data']);
+						 
+				$data = wpsg_q($data);
+				 
+				$this->db->UpdateQuery(WPSG_TBL_EXPORTPROFILE, $data, "`id` = '".wpsg_q($_REQUEST['profil_id'])."'");
+				 
+				$this->shop->addBackendMessage(__('Muster Datei erfolgreich verarbeitet.', 'wpsg'));
+				
+				die('<script type="text/javascript">parent.wpsg_mod_export_profilSwitch();</script>');
+				
+			}
+		
+		} // public function be_ajax()
+		
+		private function getFieldName($field_key)
+		{
+			
+			foreach ($this->fields as $fieldgroup)
+			{
+				
+				foreach ($fieldgroup['fields'] as $key => $fieldname)
+				{
+					
+					if ($key == $field_key) return $fieldname;
+					
+				}
+				
+			}
+			
+		} // private function getFieldName($field_key)
+		
+		private function loadFields()
+		{
+			
+			$this->fields = array(	
+				5 => array(
+					'name' => __('Allgemein', 'wpsg'),
+					'fields' => array(
+						'allgemein_empty' => __('Leer', 'wpsg'),
+						//'allgemein_statisch' => __('Statisch', 'wpsg'),
+						'allgemein_currency' => __('WÃ€hrung', 'wpsg')
+					)
+				),
+				10 => array(
+					'name' => __('Bestellung', 'wpsg'),
+					'fields' => array(
+						'order_id' => __('BestellID', 'wpsg'),
+						'order_cdate' => __('Erstellungsdatum', 'wpsg'),
+						'order_onr' => __('Bestellnummer', 'wpsg'),
+						'order_bemerkung' => __('Bemerkung Kunde', 'wpsg'),
+						'order_price' => __('Bestellsumme', 'wpsg'),
+						'order_price_netto' => __('Bestellsumme (Netto)', 'wpsg'),
+						'order_shipping' => __('Versandkosten', 'wpsg'),
+						'order_payment' => __('Kosten Bezahlmethode', 'wpsg'),
+						'order_useragent' => __('UserAgent', 'wpsg'),
+						'order_ip' => __('IP Adresse', 'wpsg'),						
+						'order_vorname' => __('Lieferadresse Vorname', 'wpsg'),
+						'order_name' => __('Lieferadresse Name', 'wpsg'),
+						'order_firma' => __('Lieferadresse Firma', 'wpsg'),
+						'order_strasse' => __('Lieferadresse StraÃe', 'wpsg'),
+						'order_plz' => __('Lieferadresse PLZ', 'wpsg'),
+						'order_ort' => __('Lieferadresse Ort', 'wpsg'),
+						'order_land' => __('Lieferadresse Land (Name)', 'wpsg'),
+						'order_land_krzl' => __('Lieferadresse Land (KÃŒrzel)', 'wpsg'),
+						//'order_hausnr' => __('Lieferadresse Hausnummer', 'wpsg'),
+						'order_payment_method' => __('Name der Zahlart', 'wpsg'),
+						'order_shipping_method' => __('Name der Versandart', 'wpsg'),
+						'order_count' => __('Anzahl Produkte', 'wpsg'),
+						'order_bname' => __('Name der Bank (Bankeinzug)', 'wpsg'),
+						'order_bblz' => __('BLZ der Bank (Bankeinzug)', 'wpsg'),
+						'order_bic' => __('BIC der Bank (Bankeinzug)', 'wpsg'),
+						'order_binhaber' => __('Kontoinhaber (Bankeinzug)', 'wpsg'),
+						'order_bnr' => __('Kontonummer (Bankeinzug)', 'wpsg'),
+						'order_iban' => __('IBAN Nummer (Bankeinzug)', 'wpsg'),						
+						'order_status' => __('Status der Bestellung', 'wpsg'),
+						'order_menge' => __('Anzahl an Artikeln', 'wpsg')			
+					)
+				),
+				20 => array(
+					'name' => __('Produkt', 'wpsg'),
+					'fields' => array(
+						'produkt_id' => __('ProduktID', 'wpsg'),
+						'produkt_index' => __('Position', 'wpsg'),
+						'produkt_name' => __('Produktname', 'wpsg'),
+						'produkt_typ' => __('Produkttyp', 'wpsg'),
+						'produkt_preis' => __('Produktpreis', 'wpsg'),
+						'produkt_mwst' => __('Mehrwertsteuer', 'wpsg'),
+						'produkt_feinheit' => __('FÃŒllmengeneinheit', 'wpsg'),
+						'produkt_fmenge' => __('FÃŒllmenge', 'wpsg'),
+						'produkt_beschreibung' => __('Beschreibung', 'wpsg'),
+						'produkt_weight' => __('Gewicht', 'wpsg'),						 
+						'produkt_anr' => __('Artikelnummer', 'wpsg'),
+						'produkt_menge' => __('Anzahl', 'wpsg')
+					)
+				),
+				30 => array(
+					'name' => __('Kunden', 'wpsg'),
+					'fields' => array(
+						'kunde_id' => __('KundenID', 'wpsg'),
+						'kunde_nr' => __('Kundennummer', 'wpsg'),
+						'kunde_title' => __('Titel/Anrede', 'wpsg'),
+						'kunde_firma' => __('Firma', 'wpsg'),
+						'kunde_vorname' => __('Vorname', 'wpsg'),
+						'kunde_name' => __('Name', 'wpsg'),
+						'kunde_strasse' => __('StraÃe', 'wpsg'),
+						//'kunde_hausnr' => __('Hausnummer', 'wpsg'),
+						'kunde_ort' => __('Ort', 'wpsg'),
+						'kunde_plz' => __('PLZ', 'wpsg'),
+						'kunde_land' => __('Land (Name)', 'wpsg'),
+						'kunde_land_krzl' => __('Land (KÃŒrzel)', 'wpsg'),
+						'kunde_tel' => __('Telefon', 'wpsg'),
+						'kunde_fax' => __('Faxnummer', 'wpsg'),
+						'kunde_email' => __('E-Mail', 'wpsg'),
+						'kunde_ustid' => __('Umsatzsteuernummer', 'wpsg'),
+						'kunde_geb' => __('Geburtsdatum', 'wpsg')					
+					)
+				)
+			);
+			
+			if ($this->shop->hasMod('wpsg_mod_rechnungen'))
+			{
+				
+				$this->fields[11] = array(
+					'name' => __('Rechnung', 'wpsg'),
+					'fields' => array(
+						'rechnung_nr' => __('Rechnungsnummer', 'wpsg'),
+						'gutschrift_nr' => __('Rechnungskorrekturnummer', 'wpsg'),
+						'rdatum' => __('Datum der Rechnung/Rechnungskorrektur', 'wpsg')
+					) 
+				);
+				
+			}
+			
+			// Gutscheinmodul
+			if ($this->shop->hasMod('wpsg_mod_gutschein'))
+			{
+				
+				$this->fields[10]['fields']['order_gutschein'] = __('Gutscheinnummer', 'wpsg');
+				
+			}
+			
+			// Bestellvariablen 
+			if ($this->shop->hasMod('wpsg_mod_ordervars'))
+			{
+				
+				$arOV = array();
+				$arOrderVars = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1' ORDER BY `name` ASC ");
+				
+				foreach ($arOrderVars as $ov)
+				{
+					
+					$arOV['ov_'.$ov['id']] = $ov['name'];	
+					
+				}
+				
+				if (is_array($arOV) && sizeof($arOV) > 0)
+				{
+					
+					$arOV = array(
+						'name' => __('Bestellvariablen', 'wpsg'),
+						'fields' => $arOV
+					);
+					
+					$this->fields[12] = $arOV;
+					
+				}
+				
+			}			
+			
+			/* Produktvariablen */ 
+			if ($this->shop->hasMod('wpsg_mod_productvars'))
+			{
+							
+				$arPV = array();
+				$arProduktVars = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` ORDER BY `name` ");
+				
+				foreach ($arProduktVars as $pv)
+				{
+					
+					$arPV['pv_'.$pv['id']] = $pv['name'];
+					
+				}
+				
+				if (is_array($arPV) && sizeof($arPV) > 0)
+				{
+					
+					$arPV = array(
+						'name' => __('Produktvariablen', 'wpsg'),
+						'fields' => $arPV
+					);
+					
+					$this->fields[21] = $arPV;
+					
+				}
+				
+			} 
+			
+			/* Produktattribute */
+			if ($this->shop->hasMod('wpsg_mod_produktattribute'))
+			{
+				
+				$arPA = array();
+				$arProduktAttribute = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_AT."` ORDER BY `name` ");
+				
+				foreach ($arProduktAttribute as $pa)
+				{
+					
+					$arPA['pa_'.$pa['id']] = $pa['name'];
+					
+				}
+				
+				if (is_array($arPA) && sizeof($arPA) > 0)
+				{
+					
+					$arPA = array(
+						'name' => __('Produktattribute', 'wpsg'),
+						'fields' => $arPA
+					);
+					
+					$this->fields[22] = $arPA;
+					
+				}
+				
+			}
 								
-	                                $tag = $doc->createElement($this->clearXML($f['name']));
-	                                $tag = $tag_product->appendChild($tag);
-	
-									if (intval($f['format']) === 950) {
-						
-										$tag_value = $doc->createCDATASection($value);
+			/* Kundenvariablen */
+			$kv = $this->shop->loadPflichtFeldDaten();
+			if (is_array($kv) && sizeof($kv) > 0 && sizeof($kv['custom']) > 0)
+			{
+				
+				$arKV = array(); 
+				foreach ($kv['custom'] as $kv_key => $kv)
+				{
+					
+					$arKV['kv_'.$kv_key] = $kv['name'];
+					
+				}
+				
+				if (is_array($arKV) && sizeof($arKV) > 0)
+				{
+					
+					$arKV = array(
+						'name' => __('Kundenvariablen', 'wpsg'),
+						'fields' => $arKV
+					);
+					
+					$this->fields[31] = $arKV;
+					
+				}
+				
+			}
+			
+			$this->shop->callMods('wpsg_mod_export_loadFields', array(&$this->fields));
+			
+			ksort($this->fields);
+			
+		}
+		
+		public function getValue($f, $profil_separator, $o_id, $p_id = false, $product_index = 1, $productkey = false, $order_product_id = false)
+		{
+			
+			$field_value = $f['value'];
+			
+			if (array_key_exists($o_id.'_'.$p_id, $this->arCache))
+			{
+				
+				$order = $this->arCache[$o_id.'_'.$p_id]['order'];
+				$produkt = $this->arCache[$o_id.'_'.$p_id]['produkt'];
+				$kunde = $this->arCache[$o_id.'_'.$p_id]['kunde'];				
+				
+			}
+			else
+			{
+			
+				$order = $this->db->fetchRow("
+					SELECT 
+						O.*,
+						L.`name` AS land,
+						L.`kuerzel` AS land_krzl
+					FROM
+						`".WPSG_TBL_ORDER."` AS O
+							LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (O.`shipping_land` = L.`id`)
+					WHERE
+						O.`id` = '".wpsg_q($o_id)."'
+				");
+				
+				// Anzahl an tatsÃ€chlich bestellten Artikeln
+				$order['menge'] = $this->db->fetchOne("SELECT SUM(OP.`menge`) FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`o_id` = '".wpsg_q($order['id'])."'");
+				
+				// Anzahl an Produkten in der Bestellung (MengenunabhÃ€ngig)
+				$order['count'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($order['id'])."'");
+				
+				$order['payment_method'] = $this->shop->arPayment[$order['type_payment']]['name'];
+				$order['shipping_method'] = $this->shop->arShipping[$order['type_shipping']]['name'];
+				
+				$order['custom_data'] = unserialize($order['custom_data']);
+				
+				if ($this->shop->hasMod('wpsg_mod_rechnungen'))
+				{
+					
+					$last_invoice = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order['id'])."' AND `rnr` != '' ORDER BY `datum` DESC LIMIT 1 ");
+					$last_storno = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order['id'])."' AND `gnr` != '' ORDER BY `datum` DESC LIMIT 1 ");
+					$last = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order['id'])."' ORDER BY `datum` DESC LIMIT 1 ");
+					
+					$order['gnr'] = '--';
+					$order['rnr'] = '--';
+					$order['rdatum'] = '--'; 
+					
+					if (wpsg_isSizedInt($last_invoice['id']))
+					{
+						
+						$order['rnr'] = $last_invoice['rnr'];
+						$order['rdatum'] = $last_invoice['datum'];
+						
+					}
+					
+					if (wpsg_isSizedInt($last_storno['id']) && $last['id'] === $last_storno['id'])
+					{
+						
+						$order['gnr'] = $last_storno['gnr']; 
+						$order['rdatum'] = $last_storno['datum'];
+						
+					}
 										
-									} else {
-										
-										$tag_value = $doc->createTextNode(htmlspecialchars($value));
-										
-									} 
-									
-	                                $tag->appendChild($tag_value);
-
-								}
-
-                            }
-
-                        }
-                    }
-
-                    if ($tag_product !== false) {
-
-                        $tag_product_root->appendChild($tag_product);
-
-                    }
-
-                } // foreach Produkte
-
-	            // Andere Felder
-	            foreach ($profil['fields'] as $f) {
-
-					$arRootline = explode('/', $f['name']);
-					
-                    // Wert ist kein Produktfeld
-                    if ($this->getFieldGroup($f['value_key']) != 20) {
-
-                        $value = $this->getValue($f, $profil['field_delimiter'], $oOrder->id);
-
-                        if (wpsg_isSizedInt($f['xml_att'])) {
-
-                            $att = $doc->createAttribute($this->clearXML($f['name']));
-                            $att->value = htmlspecialchars($value);
-
-                            $tag_order->appendChild($att);
-
-                        } else {
-
-							if (strpos($f['name'], '/') !== false) {
- 
-								if ($arRootline[0] === $profil['xml_ordertag'] && wpsg_getStr($arRootline[1]) === $profil['xml_productroottag']) {
-				
-									$this->addXMLNode($doc, $tag_product_root, implode('/', array_slice($arRootline, 2)), $value, $f);
-									
-								} else if ($arRootline[0] === $profil['xml_ordertag']) {
-									
-									$this->addXMLNode($doc, $tag_order, implode('/', array_slice($arRootline, 1)), $value, $f);
-									
-								}  
-								 
-							} else {
+				}
+				
+				/* Bestellvariablen */
+				if ($this->shop->hasMod('wpsg_mod_ordervars'))
+				{
+					
+					$order['bvars'] = @unserialize($order['bvars']);
+					
+				}
+				
+				/* Produktvariablen */
+				if ($this->shop->hasMod('wpsg_mod_productvars'))
+				{
+					
+					$order['pvars'] = @unserialize($order['pvars']);
+					
+				}
 								
-	                            $tag = $doc->createElement($this->clearXML($f['name']));
-	                            $tag = $tag_order->appendChild($tag);
-	
-								if (intval($f['format']) === 950) {
-						
-									$tag_value = $doc->createCDATASection($value);
-									
-								} else {
-									
-									$tag_value = $doc->createTextNode(htmlspecialchars($value));
-									
-								}
-								 								
-	                            $tag->appendChild($tag_value);
-
+				$kunde = $this->db->fetchRow("
+					SELECT
+						K.*,
+						L.`kuerzel` AS land_krzl,
+						L.`name` AS land
+					FROM
+						`".WPSG_TBL_KU."` AS K
+							LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (K.`land` = L.`id`)
+					WHERE
+						K.`id` = '".wpsg_q($order['k_id'])."'
+				");
+				
+				/* Kundenvariablen */
+				$kunde['kv'] = @unserialize($kunde['custom']);
+								
+				if ($p_id == false)
+				{
+					
+					$arProdukte = $this->db->fetchAssoc("
+						SELECT
+							P.*,
+							OP.`mod_vp_varkey`,
+							OP.`menge`,
+							OP.`mwst_value` AS mwst_value,
+							OP.`price` AS price 
+						FROM
+							`".WPSG_TBL_ORDERPRODUCT."` AS OP
+								LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = OP.`p_id`)
+						WHERE
+							OP.`o_id` = '".wpsg_q($o_id)."'
+					");
+					
+					$produkt = array();
+					
+					foreach ($arProdukte as $p)
+					{
+					
+						foreach ($p as $col_name => $col_value)
+						{
+
+							$produkt[$col_name][] = $col_value;
+							
+						}
+						
+					}
+
+					foreach ($produkt as $col_name => $values)
+					{
+						
+						if ($profil_separator == ',') $produkt[$col_name] = implode(";", $values);
+						else $produkt[$col_name] = implode(",", $values);
+						
+					}
+					
+				}
+				else
+				{
+					
+					if (wpsg_isSizedInt($order_product_id))
+					{
+						
+						$produkt = $this->db->fetchRow("
+							SELECT
+								P.*,
+								OP.`mod_vp_varkey`,
+								OP.`menge`,
+								OP.`mwst_value` AS mwst_value,
+								OP.`price` AS price
+							FROM
+								`".WPSG_TBL_ORDERPRODUCT."` AS OP
+									LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = OP.`p_id`)
+							WHERE
+								OP.`id` = '".wpsg_q($order_product_id)."'
+						");
+						
+					}
+					else
+					{
+						
+						$produkt = $this->db->fetchRow("
+							SELECT
+								P.*,							
+								OP.`mod_vp_varkey`,
+								OP.`menge`,
+								OP.`mwst_value` AS mwst_value,
+								OP.`price` AS price
+							FROM
+								`".WPSG_TBL_PRODUCTS."` AS P
+									LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (P.`id` = OP.`p_id` AND OP.`o_id` = '".wpsg_q($order['id'])."')
+							WHERE
+								P.`id` = '".wpsg_q($p_id)."'
+						");
+						
+					}
+					
+					/* Produktattribute */
+					if ($this->shop->hasMod('wpsg_mod_produktattribute'))
+					{
+						
+						$produkt['mod_attribute'] = $this->db->fetchAssocField("
+							SELECT
+								`a_id`, `value`
+							FROM
+								`".WPSG_TBL_PRODUCTS_AT."` AS PA
+							WHERE
+								PA.`p_id` = '".wpsg_q($produkt['id'])."'								
+						", "a_id", "value");
+						
+					}
+					
+				}
+
+				$this->arCache[$o_id.'_'.$p_id] = array(
+					"order" => $order,
+					"produkt" => $produkt,
+					"kunde" => $kunde
+				);
+				
+			}
+			 
+			switch ($field_value)
+			{
+				
+				case 'allgemein_empty': $return = ''; break;
+				case 'allgemein_statisch': $return = $f['static']; break;
+				case 'allgemein_currency': $return = get_option('wpshopgermany_currency'); break; 
+								
+				case 'order_id': $return = $order['id']; break; 
+				case 'order_cdate': 
+					
+					if (strtotime($order['cdate']) !== false)
+					{
+						$return = date('d.m.Y H:i:s', strtotime($order['cdate']));
+					}
+					else
+					{
+						$return = '--';
+					}
+					
+					break;
+				case 'order_onr': $return = $order['onr']; break;
+				case 'order_bemerkung': $return = preg_replace('/\r\n|\r|\n/', ' ', $order['comment']); break;
+				case 'order_price': 
+					
+					if (!is_array($order['custom_data']['basket']))
+					{
+						$return = wpsg_ff($order['price_gesamt']);	
+					}
+					else
+					{					
+						$return = wpsg_ff($order['custom_data']['basket']['sum']['preis_gesamt_brutto'], $this->shop->get_option('wpsg_currency'));
+					}
+					 
+					break;
+					
+				case 'order_price_netto': 
+					
+					$return = wpsg_ff($order['custom_data']['basket']['sum']['preis_gesamt_netto'], $this->shop->get_option('wpsg_currency'));						
+					
+					break;
+					
+				case 'order_shipping': $return = number_format($order['price_shipping'], 2, ',', '.'); break;
+				case 'order_payment': $return = number_format($order['price_payment'], 2, ',', '.'); break;	
+				case 'order_useragent':	$return = $order['useragent']; break;
+				case 'order_ip': $return = $order['ip']; break;	
+				case 'order_vorname': $return = $order['shipping_vname']; break;
+				case 'order_name': $return = $order['shipping_name']; break;
+				case 'order_strasse': $return = $order['shipping_strasse']; break;
+				case 'order_plz': $return = $order['shipping_plz']; break;
+				case 'order_ort': $return = $order['shipping_ort']; break;
+				case 'order_land': $return = $order['land']; break;
+				case 'order_land_krzl': $return = $order['land_krzl']; break;
+				case 'order_hausnr': $return = $order['shipping_hausnr']; break;
+				case 'order_payment_method': $return = $order['payment_method']; break;
+				case 'order_shipping_method': $return = $order['shipping_method']; break;				
+				case 'order_count': $return = $order['count']; break;
+				case 'order_firma': $return = $order['shipping_firma']; break;
+				case 'order_status': $return = $this->shop->arStatus[$order['status']]; break;
+				case 'order_bname': $return = $order['mod_autodebit_name']; break;
+				case 'order_bblz': $return = $order['mod_autodebit_blz']; break;
+				case 'order_binhaber': $return = $order['mod_autodebit_inhaber']; break;
+				case 'order_menge': $return = $order['menge']; break;
+				case 'order_bnr': $return = $order['mod_autodebit_knr']; break;
+				case 'order_iban': $return = $order['mod_autodebit_iban']; break;
+				case 'order_bic': $return = $order['mod_autodebit_bic']; break;
+				case 'order_gutschein': 
+					
+					if ($order['gs_id'] > 0)
+						$return = $this->db->fetchOne("SELECT `code` FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `id` = '".wpsg_q($order['gs_id'])."'");
+						
+					break;
+				
+				case 'rechnung_nr': $return = $order['rnr']; break;
+				case 'rechnungskorrektur_nr':
+				case 'gutschrift_nr': 
+					$return = $order['gnr']; break;
+				case 'rdatum': 
+					
+					if (strtotime($order['rdatum']) !== false)
+					{
+						$return = date('d.m.Y H:i:s', strtotime($order['rdatum']));
+					}
+					else
+					{
+						$return = '--';
+					} 
+					
+					break;				
+								
+				case 'produkt_id': $return = $produkt['id']; break;
+				case 'produkt_index': $return = $product_index; break; 
+				case 'produkt_name': $return = $produkt['name']; break;
+				case 'produkt_typ': $return = $produkt['typ']; break;
+				case 'produkt_preis': $return = number_format($produkt['preis'], 2, ',', '.');	break;
+				case 'produkt_mwst': $return = $produkt['mwst_key']; break;
+				case 'produkt_feinheit': $return = $produkt['feinheit']; break;
+				case 'produkt_fmenge': $return = $produkt['fmenge']; break;
+				case 'produkt_beschreibung': $return = $produkt['beschreibung']; break;
+				case 'produkt_weight': $return = $produkt['weight']; break;
+				case 'produkt_anr': $return = $produkt['anr']; break;
+				case 'produkt_menge': $return = $produkt['menge']; break;
+				
+				case 'kunde_id': $return = $kunde['id']; break;
+				case 'kunde_nr': $return = $kunde['knr']; break;
+				case 'kunde_title': $return = $kunde['title']; break;
+				case 'kunde_vorname': $return = $kunde['vname']; break;
+				case 'kunde_firma': $return = $kunde['firma']; break;
+				case 'kunde_name': $return = $kunde['name']; break;
+				case 'kunde_strasse': $return = $kunde['strasse']; break;
+				case 'kunde_hausnr': $return = $kunde['hausnr']; break;
+				case 'kunde_ort': $return = $kunde['ort']; break;
+				case 'kunde_plz': $return = $kunde['plz']; break;
+				case 'kunde_land': $return = $kunde['land']; break;
+				case 'kunde_land_krzl': $return = $kunde['land_krzl']; break;
+				case 'kunde_tel': $return = $kunde['tel']; break;
+				case 'kunde_fax': $return = $kunde['fax']; break;
+				case 'kunde_email': $return = $kunde['email']; break;		
+				case 'kunde_ustid': $return = $kunde['ustidnr']; break;
+				case 'kunde_geb': 
+
+					if (strtotime($kunde['geb']) !== false)
+					{
+						$return = date('d.m.Y H:i:s', strtotime($kunde['geb']));
+					}
+					else
+					{
+						$return = '--';
+					} 
+					
+					break;			
+				
+				default:
+
+					if (preg_match('/ov_\d+/', $field_value))
+					{
+
+						// Bestellvariable
+						$ordervarid = substr($field_value, 3);
+						$return = $order['bvars'][$ordervarid];
+						
+					}
+					else if (preg_match('/pv_\d+/', $field_value))
+					{
+						 
+						$produktvarid = substr($field_value, 3);
+						 
+						// Produktvariable (index kann auch 0 sein)
+						if (isset($order['pvars'][$product_index]))
+						{
+							
+							$return = $order['pvars'][$product_index][$produktvarid];
+							
+						}
+						else
+						{
+							
+							// AbwÃ€rtskompatibilitÃ€t < 3.5.1 
+							if ($produkt['mod_vp_varkey'] != '')
+							{
+								$produkt_key = $produkt['mod_vp_varkey'];
 							}
-
-                        }
-
-                    }
-
-                }
-	            
-				\apply_filters('wpsg_mod_export_xml_order', $tag_order, ['order_id' => $oOrder->getId()]);
-				
-	            $oOrder->setMeta('wpsg_mod_export_order_onetime_'.$profil_id, time());
-	            
-            } // foreach Order
-
-	        //Debug Out
-	        //die('<pre>'.htmlspecialchars($doc->saveXML()).'</pre>');
-	        
-            $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-            file_put_contents($tmpfname, $doc->saveXML());
-
-            // In ISO wandeln
-            if ($profil['file_encoding'] == self::ENCODING_ISO88591)
-            {
-
-                file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
-
-            }
-
-            return [$arData, $tmpfname];
-
-        } // private function handleExportXML($arProfile, $arOrderFilter = array(), $cron = false)
-
-        /**
-         * Erstellt die XML und gibt den Pfad zur erstellten Datei zurÃŒck (FÃŒr einen Kundenexport)
-         *
-         * @param $profil_id
-         * @param array $arOrderFilter
-         */
-        private function handleExportCustomerXML($profil_id, $arCustomerFilter = array())
-        {
-
-            $this->loadFields();
-
-            $arData = wpsg_customer::find($arCustomerFilter);
-            $profil = $this->loadProfil($profil_id);
-
-            if (!wpsg_isSizedString($profil['xml_roottag'])) throw new \Exception(wpsg_translate(__('Kein XML Root Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-            if (!wpsg_isSizedString($profil['xml_producttag'])) throw new \Exception(wpsg_translate(__('Kein XML Kunden Tagname fÃŒr Profil "#1#" gesetzt!', 'wpsg'), $profil['name']));
-
-            $doc = new DOMDocument('1.0');
-            $doc->formatOutput = true;
-
-            $root = $doc->createElement($this->clearXML($profil['xml_roottag']));
-            $root = $doc->appendChild($root);
-
-            foreach ($arData as $oCustomer)
-            {
-
-                $tag_product = $doc->createElement($this->clearXML($profil['xml_customertag']));
-                $tag_product = $root->appendChild($tag_product);
-
-                foreach ($profil['fields'] as $f)
-                {
-
-                    $value = $this->getValue($f, $profil['field_delimiter'], null, null,  $oCustomer->id);
-
-                    if (wpsg_isSizedInt($f['xml_att']))
-                    {
-
-                        $att = $doc->createAttribute($this->clearXML($f['name']));
-                        $att->value = htmlspecialchars($value);
-
-                        $tag_product->appendChild($att);
-
-
-                    }
-                    else
-                    {
-
-                        $tag = $doc->createElement($this->clearXML($f['name']));
-                        $tag = $tag_product->appendChild($tag);
- 
-						if (intval($f['format']) === 950) {
-						
-							$tag_value = $doc->createCDATASection($value);
-							
-						} else {
-							
-							$tag_value = $doc->createTextNode(htmlspecialchars($value));
+							else
+							{
+								$produkt_key = $produkt['id'];
+							}
+
+							$return = $order['pvars'][$produkt_key][$produktvarid];
 							
 						}
-						
-                        $tag->appendChild($tag_value);
-
-                    }
-
-                }
-
-            }
-
-            $tmpfname = tempnam($this->getTmpFilePath(), "wpsg");
-            file_put_contents($tmpfname, $doc->saveXML());
-
-            // In ISO wandeln
-            if ($profil['file_encoding'] == self::ENCODING_ISO88591)
-            {
-
-                file_put_contents($tmpfname, utf8_decode(file_get_contents($tmpfname)));
-
-            }
-
-            return $tmpfname;
-
-        } // private function handleExportCustomerXML($profil_id, $arOrderFilter = array())
-
-        /**
-         * Bereinigt Daten an XML fÃŒr Tagname / Attributname
-         */
-        private function clearXML($value) {
-
-            $value = preg_replace('/\040+/', '_', $value);
-            $value = preg_replace('/\"|\<|\>|\'/', '', $value);
-
-            return htmlspecialchars($value);
-
-        }
-
-        private function getFieldGroup($key) {
-
-            if (!wpsg_isSizedArray($this->fields)) $this->loadFields();
-
-            foreach ($this->fields as $group_key => $group) {
-
-                foreach ($group['fields'] as $field_key => $field_label) {
-
-                    if ($field_key == $key) return $group_key;
-
-                }
-
-            }
-			
-            return false;
-
-        }
-
-        public function renderProfil($profil_id)
-        {
-
-            $this->loadFields();
-
-            $this->shop->view['profil'] = $this->loadProfil($profil_id);
-
-            $this->shop->view['cdate_years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`cdate`, '%Y') FROM `".WPSG_TBL_ORDER."` ORDER BY `cdate` ASC ");
-            if ($this->shop->hasMod('wpsg_mod_rechnungen')) $this->shop->view['invoicedate_years'] = $this->db->fetchAssocField("SELECT DISTINCT DATE_FORMAT(`datum`, '%Y') FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `storno` = '0000-00-00' AND `gnr` = '' ORDER BY `datum` ASC ");
-
-            $this->shop->view['arExportFormats'] = $this->arExportFormats;
-            $this->shop->view['arFileEncoding'] = $this->arFileEncoding;
-            $this->shop->view['arFieldFormats'] = $this->arFieldFormats;
-            $this->shop->view['arCronTypes'] = $this->arCronTypes;
-            $this->shop->view['fields'] = $this->fields;
-            $this->shop->view['strFields'] = $this->renderFields($this->shop->view['profil']);
-
-            return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/profil.phtml', false);
-
-        } // public function renderProfil($profil_id)
-
-        /**
-         * Zeichner die Felder des Profils
-         * @param $profil_data
-         */
-        function renderFields($profil_data)
-        {
-
-            if (!wpsg_isSizedArray($this->fields)) $this->loadFields();
-
-            $this->shop->view['arFieldFormats'] = $this->arFieldFormats;
-            $this->shop->view['fields'] = $this->fields;
-            $this->shop->view['profil'] = $profil_data;
-
-            return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_export/fields.phtml', false);
-
-        } // function renderFields($profil_data)
-
-        /**
-         * Gibt die Daten eines Profils zurÃŒck
-         * @return Array Array mit den Profildaten
-         * @param int $profil_id Die ID des zu ladenden Profils
-         */
-        public function loadProfil($profil_id)
-        {
-
-            $arReturn = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE."` WHERE `id` = '".wpsg_q($profil_id)."' ");
-
-            $arReturn['orderfilter'] = @unserialize($arReturn['orderfilter']);
-            if (!is_array($arReturn['orderfilter'])) $arReturn['orderfilter'] = array();
-
-            $arReturn['fields'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_EXPORTPROFILE_FIELDS."` WHERE `profil_id` = '".wpsg_q($profil_id)."' ORDER BY `pos` ASC, `id` ASC ", "id");
-
-            if ($profil_id != wpsg_getInt($arReturn['id'])) throw new \Exception(__('Profil konnte nicht geladen werden.', 'wpsg'));
-
-            return $arReturn;
-
-        } // public function loadProfil($profil_id)
-
-        private function loadFields()
-        {
-
-            $this->fields = array(
-                5 => array(
-                    'name' => __('Allgemein', 'wpsg'),
-                    'fields' => array(
-                        'allgemein_empty' => __('Leer', 'wpsg'),
-                        'general_static' => __('Statisch', 'wpsg'),
-                        'allgemein_currency' => __('WÃ€hrung', 'wpsg')
-                    )
-                ),
-                10 => array(
-                    'name' => __('Bestellung', 'wpsg'),
-                    'fields' => array(
-                        'order_id' => __('BestellID', 'wpsg'),
-                        'order_cdate' => __('Erstellungsdatum', 'wpsg'),
-                        'order_onr' => __('Bestellnummer', 'wpsg'),
-                        'order_bemerkung' => __('Bemerkung Kunde', 'wpsg'),
-                        'order_price' => __('Bestellsumme', 'wpsg'),
-                        'order_price_netto' => __('Bestellsumme (Netto)', 'wpsg'),
-                        'ordersum_price' => __('Warenwert', 'wpsg'),
-                        'ordersum_price_netto' => __('Warenwert (Netto)', 'wpsg'),
-                        'order_shipping' => __('Versandkosten', 'wpsg'),
-                        'order_payment' => __('Kosten Bezahlmethode', 'wpsg'),
-                        'order_useragent' => __('UserAgent', 'wpsg'),
-                        'order_ip' => __('IP Adresse', 'wpsg'),
-
-                        'order_price_netto_a' => __('Summe Nettobetrag MwSt A', 'wpsg'),
-                        'order_tax_a' => __('Steuer MwSt MwSt A', 'wpsg'),
-                        'order_price_netto_b' => __('Summe Nettobetrag MwSt B', 'wpsg'),
-                        'order_tax_b' => __('Steuer MwSt MwSt B', 'wpsg'),
-                        'order_price_netto_c' => __('Summe Nettobetrag MwSt C', 'wpsg'),
-                        'order_tax_c' => __('Steuer MwSt MwSt C', 'wpsg'),
-                        'order_price_netto_d' => __('Summe Nettobetrag MwSt D', 'wpsg'),
-                        'order_tax_d' => __('Steuer MwSt MwSt D', 'wpsg'),
-						'order_tax' => __('Steuer Summe (A+B+C+D)', 'wpsg'),
-						'order_taxvalue' => __('Steuersatz (19 fÃŒr 19% sofern eindeutig, sonst mit | getrennt)', 'wpsg'),
-
-                        'order_invoice_title' => __('Rechnungsadresse Anrede', 'wpsg'),
-						'order_invoice_address1' => __('Rechnungsadresse Vorname und Name oder Firmenname', 'wpsg'),
-						'order_invoice_address2' => __('Rechnungsadresse Name, Vorname oder Firmenbezeichung', 'wpsg'),
-						'order_invoice_address3' => __('Rechnungsadresse Name, Vorname wenn kein Firmenname', 'wpsg'),
-						'order_invoice_address4' => __('Rechnungsadresse Name, Vorname wenn Firmenname', 'wpsg'),
-                        'order_invoice_firma' => __('Rechnungsadresse Firma', 'wpsg'),
-                        'order_invoice_vorname' => __('Rechnungsadresse Vorname', 'wpsg'),
-                        'order_invoice_name' => __('Rechnungsadresse Name', 'wpsg'),
-                        'order_invoice_strasse' => __('Rechnungsadresse StraÃe (mit Hausnummer)', 'wpsg'),
-                        'order_invoice_strasse_strasse' => __('Rechnungsadresse StraÃe (ohne Hausnummer)', 'wpsg'),
-                        'order_invoice_strasse_nr' => __('Rechnungsadresse Hausnummer', 'wpsg'),
-                        'order_invoice_plz' => __('Rechnungsadresse PLZ', 'wpsg'),
-                        'order_invoice_ort' => __('Rechnungsadresse Ort', 'wpsg'),
-                        'order_invoice_land' => __('Rechnungsadresse Land (Name)', 'wpsg'),
-                        'order_invoice_land_krzl' => __('Rechnungsadresse Land (KÃŒrzel)', 'wpsg'),
-                        'order_invoice_tel' => __('Rechnungsadresse Telefon', 'wpsg'),
-                        'order_invoice_fax' => __('Rechnungsadresse Fax', 'wpsg'),
-
-                        'order_title' => __('Lieferadresse Anrede', 'wpsg'),
-						'order_address1' => __('Lieferadresse Vorname und Name oder Firmenname', 'wpsg'),
-						'order_address2' => __('Lieferadresse Name, Vorname oder Firmenname', 'wpsg'),
-						'order_address3' => __('Lieferadresse Name, Vorname wenn kein Firmenname', 'wpsg'),
-						'order_address4' => __('Lieferadresse Name, Vorname wenn Firmenname', 'wpsg'),
-                        'order_firma' => __('Lieferadresse Firma', 'wpsg'),
-                        'order_vorname' => __('Lieferadresse Vorname', 'wpsg'),
-                        'order_name' => __('Lieferadresse Name', 'wpsg'),
-                        'order_strasse' => __('Lieferadresse StraÃe (mit Hausnummer)', 'wpsg'),
-                        'order_strasse_strasse' => __('Lieferadresse StraÃe (ohne Hausnummer)', 'wpsg'),
-                        'order_strasse_nr' => __('Lieferadresse Hausnummer', 'wpsg'),
-                        'order_plz' => __('Lieferadresse PLZ', 'wpsg'),
-                        'order_ort' => __('Lieferadresse Ort', 'wpsg'),
-                        'order_land' => __('Lieferadresse Land (Name)', 'wpsg'),
-                        'order_land_krzl' => __('Lieferadresse Land (KÃŒrzel)', 'wpsg'),
-
-                        'order_payment_method' => __('Name der Zahlart', 'wpsg'),
-                        'order_payment_id' => __('Transaktions-ID des Zahlungsdienstleisters', 'wpsg'),
-                        'order_shipping_method' => __('Name der Versandart', 'wpsg'),
-                        'order_shipping_tax' => __('Steuerwert (z.b. 19.00) der Versandart', 'wpsg'),
-                        'order_shipping_tax2' => __('Steuerwert (z.b. 0.19) der Versandart', 'wpsg'),
-                        'order_count' => __('Anzahl Produkte', 'wpsg'),
-                        'order_bname' => __('Name der Bank (Bankeinzug)', 'wpsg'),
-                        'order_bblz' => __('BLZ der Bank (Bankeinzug)', 'wpsg'),
-                        'order_bic' => __('BIC der Bank (Bankeinzug)', 'wpsg'),
-                        'order_binhaber' => __('Kontoinhaber (Bankeinzug)', 'wpsg'),
-                        'order_bnr' => __('Kontonummer (Bankeinzug)', 'wpsg'),
-                        'order_iban' => __('IBAN Nummer (Bankeinzug)', 'wpsg'),
-                        'order_status' => __('Status der Bestellung', 'wpsg'),
-                        'order_weight' => __('Gesamtgewicht', 'wpsg')
-                    )
-                ),
-                20 => array(
-                    'name' => __('Produkt', 'wpsg'),
-                    'fields' => array(
-                        'produkt_id' => __('ProduktID', 'wpsg'),
-                        'produkt_index' => __('Position (Im Warenkorb)', 'wpsg'),
-                        'produkt_name' => __('Produktname', 'wpsg'),
-                        'produkt_detailname' => __('Produktdetailname', 'wpsg'),
-                        'product_url' => __('Produkt-URL', 'wpsg'),
-                        'product_picture_url' => __('Produktbild-URL', 'wpsg'),
-                        'product_picture_urls' => __('Produktbild-URLs (Mit | getrennt)', 'wpsg'),
-                        'product_google_shippingprice_dach' => __('Googel Produktfeed Versandkosten D-A-CH', 'wpsg'),
-                        // 'product_shippingprice' => __('Versandkosten', 'wpsg'),		
-                        'product_google_shippingprice_de' => __('Googel Produktfeed Versandkosten Deutschland', 'wpsg'),		
-                        'product_google_shippingprice_at' => __('Googel Produktfeed Versandkosten Ãsterreich', 'wpsg'),		
-                        'product_google_shippingprice_ch' => __('Googel Produktfeed Versandkosten Schweiz', 'wpsg'),		
-                        'produkt_typ' => __('Produkttyp', 'wpsg'),
-                        'produkt_preis' => __('Produktpreis', 'wpsg'),
-                        'produkt_preis_brutto' => __('Produktpreis (Brutto)', 'wpsg'),
-                        'produkt_preis_netto' => __('Produktpreis (Netto)', 'wpsg'),
-                        'product_preis_order' => __('Produktpreis aus Bestellung', 'wpsg'),
-                        'product_preis_order_netto' => __('Produktpreis aus Bestellung (Netto)', 'wpsg'),
-						'product_preis_single_order' => __('Einzelproduktpreis aus Bestellung (1StÃŒck)', 'wpsg'),
-                        'product_preis_single_order_netto' => __('Einzelproduktpreis aus Bestellung (1StÃŒck, Netto)', 'wpsg'),
-                        'produkt_mwst' => __('Mehrwertsteuer (SchlÃŒssel)', 'wpsg'),
-                        'produkt_mwst_satz' => __('Mehrwertsteuer (Satz z.B. 19)', 'wpsg'),
-                        'produkt_mwst_satz_100' => __('Mehrwertsteuer/100 (Satz z.B. 0.19)', 'wpsg'),
-                        'produkt_mwst_value' => __('Mehrwertsteuer (Wert in â¬)', 'wpsg'),
-                        'produkt_order_mwst_value' => __('Mehrwertsteuer (Wert in â¬ aus Bestellung)', 'wpsg'),
-                        'produkt_feinheit' => __('FÃŒllmengeneinheit', 'wpsg'),
-                        'produkt_fmenge' => __('FÃŒllmenge', 'wpsg'),
-                        'produkt_reference_fmenge' => __('Referenzwert der FÃŒllmenge', 'wpsg'),
-                        'produkt_beschreibung' => __('Beschreibung', 'wpsg'),
-                        'produkt_longdescription' => __('Langtext', 'wpsg'),
-                        'produkt_productfeatures' => __('Produktfeatures', 'wpsg'),
-                        'produkt_moreinfos' => __('ZusÃ€tzliche Informationen', 'wpsg'),
-                        'produkt_moreinfos2' => __('Lieferumfang', 'wpsg'),
-                        'produkt_weight' => __('Gewicht', 'wpsg'),
-                        'produkt_anr' => __('Artikelnummer', 'wpsg'),
-                        'produkt_menge' => __('Anzahl', 'wpsg')
-                    )
-                ),
-                30 => array(
-                    'name' => __('Kunden', 'wpsg'),
-                    'fields' => array(
-                        'kunde_id' => __('KundenID', 'wpsg'),
-                        'kunde_nr' => __('Kundennummer', 'wpsg'),
-                        'kunde_title' => __('Anrede', 'wpsg'),
-                        'kunde_firma' => __('Firma', 'wpsg'),
-                        'kunde_vorname' => __('Vorname', 'wpsg'),
-                        'kunde_name' => __('Name', 'wpsg'),
-                        'kunde_strasse' => __('StraÃe (mit Hausnummer)', 'wpsg'),
-                        'kunde_strasse_strasse' => __('StraÃe (ohne Hausnummer)', 'wpsg'),
-                        'kunde_strasse_nr' => __('Hausnummer', 'wpsg'),
-                        'kunde_ort' => __('Ort', 'wpsg'),
-                        'kunde_plz' => __('PLZ', 'wpsg'),
-                        'kunde_land' => __('Land (Name)', 'wpsg'),
-                        'kunde_land_krzl' => __('Land (KÃŒrzel)', 'wpsg'),
-                        'kunde_tel' => __('Telefon', 'wpsg'),
-                        'kunde_fax' => __('Faxnummer', 'wpsg'),
-                        'kunde_email' => __('E-Mail', 'wpsg'),
-                        'kunde_ustid' => __('Umsatzsteuernummer', 'wpsg'),
-                        'kunde_geb' => __('Geburtsdatum', 'wpsg')
-                    )
-                ),
-            );
-			
-			foreach (wpsg_product::getProductCodeConfig() as $code_key => $code_data) {
-				
-				$this->fields[20]['fields']['product_code_'.$code_key] = $code_data['label'];
-				
-			}
-
-            if ($this->shop->hasMod('wpsg_mod_stock')) {
-
-                $this->fields[20]['fields']['produkt_stock'] = __('Lagerbestand', 'wpsg');
-                $this->fields[20]['fields']['product_stock_state'] = __('Lagerstatus', 'wpsg');
-				$this->fields[20]['fields']['product_google_productfeed_stock_state'] = __('Google Produktfeed Lagerstatus', 'wpsg');
-
-            }
-
-            // AboProdukte
-            if ($this->shop->hasMod('wpsg_mod_abo'))
-            {
-
-                $this->field[12] = array(
-                    'name' => __('Abo', 'wpsg'),
-                    'fields' => array(
-                        'startdate' => __('Abobeginn', 'wpsg'),
-                        'enddate' => __('Aboende', 'wpsg'),
-                        'runtime' => __('Laufzeit', 'wpsg')
-                    )
-
-                );
-
-            }
-
-            // Rechnungen
-            if ($this->shop->hasMod('wpsg_mod_rechnungen')) {
-
-                $this->fields[11] = array(
-                    'name' => __('Rechnung', 'wpsg'),
-                    'fields' => array(
-                        'rechnung_nr' => __('Rechnungsnummer', 'wpsg'),
-                        'gutschrift_nr' => __('Rechnungskorrekturnummer', 'wpsg'),
-                        'rdatum' => __('Datum der Rechnung', 'wpsg'),
-                        'stornodatum' => __('Datum der Rechnungskorrektur', 'wpsg')
-                    )
-                );
-
-            }
-
-            // Gutscheinmodul
-            if ($this->shop->hasMod('wpsg_mod_gutschein'))
-            {
-
-                $this->fields[10]['fields']['order_gutschein'] = __('Gutscheinnummer', 'wpsg');
-
-            }
-
-            // Bestellvariablen 
-            if ($this->shop->hasMod('wpsg_mod_ordervars'))
-            {
-
-                $arOV = array();
-                $arOrderVars = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1' ORDER BY `pos` ASC, `id` ASC ");
-
-                foreach ($arOrderVars as $ov)
-                {
-
-                    $arOV['ov_'.$ov['id']] = $ov['name'];
-
-                }
-
-                if (is_array($arOV) && sizeof($arOV) > 0)
-                {
-
-                    $arOV = array(
-                        'name' => __('Bestellvariablen', 'wpsg'),
-                        'fields' => $arOV
-                    );
-
-                    $this->fields[12] = $arOV;
-
-                }
-
-            }
-
-            /* Produktvariablen */
-            if ($this->shop->hasMod('wpsg_mod_productvars'))
-            {
-
-                $arPV = array();
-                $arProduktVars = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` ORDER BY `name` ");
-
-                foreach ($arProduktVars as $pv)
-                {
-
-                    $arPV['pv_'.$pv['id']] = $pv['name'];
-
-                }
-
-                if (is_array($arPV) && sizeof($arPV) > 0)
-                {
-
-                    $arPV = array(
-                        'name' => __('Produktvariablen', 'wpsg'),
-                        'fields' => $arPV
-                    );
-
-                    $this->fields[21] = $arPV;
-
-                }
-
-            }
-
-            /* Produktattribute */
-            if ($this->shop->hasMod('wpsg_mod_produktattribute'))
-            {
-
-                $arPA = array();
-                $arProduktAttribute = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_AT."` ORDER BY `name` ");
-
-                foreach ($arProduktAttribute as $pa)
-                {
-
-                    $arPA['pa_'.$pa['id']] = $pa['name'];
-
-                }
-
-                if (is_array($arPA) && sizeof($arPA) > 0)
-                {
-
-                    $arPA = array(
-                        'name' => __('Produktattribute', 'wpsg'),
-                        'fields' => $arPA
-                    );
-
-                    $this->fields[22] = $arPA;
-
-                }
-
-            }
-
-            /* Kundenvariablen */
-            $kv = $this->shop->loadPflichtFeldDaten();
-            if (is_array($kv) && sizeof($kv) > 0 && is_array($kv['custom']) && sizeof($kv['custom']) > 0)
-            {
-
-                $arKV = array();
-                foreach ($kv['custom'] as $kv_key => $kv)
-                {
-
-                    $arKV['kv_'.$kv_key] = $kv['name'];
-
-                }
-
-                if (is_array($arKV) && sizeof($arKV) > 0)
-                {
-
-                    $arKV = array(
-                        'name' => __('Kundenvariablen', 'wpsg'),
-                        'fields' => $arKV
-                    );
-
-                    $this->fields[31] = $arKV;
-
-                }
-
-            }
-
-            $this->shop->callMods('wpsg_mod_export_loadFields', array(&$this->fields));
-
-            ksort($this->fields);
-
-        }
-
-        public function getValue($f, $profil_separator, $o_id, $p_id = null, $customer_id = null, $order_product_id = null, $pvari_ID = null) {
-
-			$oProduct = null;
-			$oOrderProduct = null;
-			$combination_id = null;
-			$product_key = null;
-			
-            $field_value = $f['value_key'];
-
-            if ($o_id !== NULL) {
-
-                if (isset($this->arCache['oOrder'][$o_id])) {
-
-                    $order = $this->arCache['order'][$o_id];
-
-                    /** @var wpsg_order $oOrder */
-                    $oOrder = $this->arCache['oOrder'][$o_id];
-
-                    /** @var array $arCalculation */
-                    $arCalculation = $this->arCache['arCalculation'][$o_id];
-
-                    $customer_id = $oOrder->getCustomer()->getId();
-                    
-                } else {
-                    
-                    /** @var wpsg_order $oOrder */
-                    $oOrder = wpsg_order::getInstance($o_id);
-                    
-                    $order = $oOrder->data;
-					
-					$custom_data = $oOrder->__get('custom_data');
-					
-					if ($custom_data !== null) $order['custom_data'] = unserialize($custom_data);
-					else $order['custom_data'] = [];
-
-                    /* Bestellvariablen */
-                    if ($this->shop->hasMod('wpsg_mod_ordervars')) {
-
-                        $order['bvars'] = @unserialize($oOrder->__get('bvars'));
-
-                    }
-
-                    /* Produktvariablen */
-                    if ($this->shop->hasMod('wpsg_mod_productvars')) {
-
-                        $order['pvars'] = @unserialize($oOrder->__get('pvars'));
-
-                    }
-                                    
-                    $oCalculation = new \wpsg\wpsg_calculation();
-                    $oCalculation->fromDB($oOrder->getId());
-                
-                    /** @var array $arCalculation */
-                    $arCalculation = $oCalculation->getCalculationArray();
-                
-                    $customer_id = $oOrder->getCustomer()->getId();
-                    
-                    $this->arCache['oOrder'][$o_id] = $oOrder;
-                    $this->arCache['arCalculation'][$o_id] = $arCalculation;
-                    $this->arCache['order'][$o_id] = $order;
-                                
-                }
-
-            }
-						
-			if ($p_id !== null) {
-				 
-				if (isset($this->arCache['product'][$p_id])) {
-					
-					/** @var wpsg_product $oProduct */
-					$oProduct = $this->arCache['oProduct'][$p_id];
-					
-				} else {
-			 
-					/** @var wpsg_product $oProduct */
-					$oProduct = wpsg_product::getInstance($p_id);
-					
-				}
-				
-			}
-			
-			if ($customer_id !== null) {
-				 
-				if (isset($this->arCache['customer'][$customer_id])) {
-					
-					/** @var wpsg_customer $oCustomer */
-					$oCustomer = $this->arCache['customer'][$customer_id];
-					
-					$kunde = $this->arCache['kunde'][$customer_id];
-					
-				} else {
-					
-					/** @var wpsg_customer $oCustomer */
-					$oCustomer = wpsg_customer::getInstance($customer_id);
-					
-					$kunde = [
-						'kv' => @unserialize($oCustomer->__get('custom'))
-					];
-
-					$this->arCache['oCustomer'][$customer_id] = $oCustomer;
-					$this->arCache['kunde'][$customer_id] = $kunde;
-					
-				}
-				
-			}
-			 
-			if ($order_product_id !== null) {
-		
-				if (isset($this->arCache['order_product_id'][$order_product_id])) {
-					
-					/** @var wpsg_order_product $oOrderProduct */
-					$oOrderProduct = $this->arCache['order_product_id'][$order_product_id];
-					
-				} else {
-					
-					/** @var wpsg_order_product $oCustomer */
-					$oOrderProduct = wpsg_order_product::getInstance($order_product_id);
 					 
-					$this->arCache['order_product_id'][$order_product_id] = $oOrderProduct;
-					
-				}
-				
-				/*
-				if ($this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$oOrderProduct->getProductKey()])) {
-					
-					$oCombination = \wpsg\wpsg_combination::getByProductAndKey($oOrderProduct->getProductId(), $oOrderProduct->getProductKey());
-					$combination_id = $oCombination->getId();
-					
-				}
-				*/
-				
-				$product_key = $oOrderProduct->getProductKey();
-				
-			}
-			
-            if (isset($oOrder)) $oFrontendCountry = $oOrder->getInvoiceCountry();
-
-            $getTaxSum = function($tax_code) use (&$arCalculation) {
-
-            	$netto = 0;
-            	$sum = 0;
-
-            	foreach ($arCalculation['tax'] as $tax_key => $tax) {
-
-            		if (substr($tax_key, 0, 1) === $tax_code) {
-
-            			$netto += $tax['netto'];
-            			$sum += $tax['sum'];
-
-		            }
-
-	            }
-
-            	return [
-            		'netto' => $netto,
-		            'sum' => $sum
-	            ];
-
-            };
-
-            switch ($field_value) {
-
-                case 'allgemein_empty': $return = ''; break;
-                case 'general_static': $return = $f['static']; break;
-                case 'allgemein_currency': $return = get_option('wpshopgermany_currency'); break;
-
-	            case 'order_price_netto_a': $return = $getTaxSum('a')['netto']; break;
-	            case 'order_tax_a': $return = $getTaxSum('a')['sum']; break;
-	            case 'order_price_netto_b': $return = $getTaxSum('b')['netto']; break;
-	            case 'order_tax_b': $return = $getTaxSum('b')['sum']; break;
-	            case 'order_price_netto_c': $return = $getTaxSum('c')['netto']; break;
-	            case 'order_tax_c': $return = $getTaxSum('c')['sum']; break;
-	            case 'order_price_netto_d': $return = $getTaxSum('d')['netto']; break;
-	            case 'order_tax_d': $return = $getTaxSum('d')['sum']; break;
-					case 'order_taxvalue':
-
-						$arTaxValue = [];
-						foreach ($arCalculation['tax'] as $tax_key => $tax) if ($tax['sum'] > 0 && $tax['tax_value'] > 0 && !in_array($tax['tax_value'], $arTaxValue)) $arTaxValue[] = $tax['tax_value'];
-						$arTaxValue = array_map(function($val) { return preg_replace('/\.0+$/', '', strval($val)); }, $arTaxValue);
-
-						$return = implode('|', $arTaxValue);
-
-						break;
-	            case 'order_tax': $return = $getTaxSum('a')['sum'] + $getTaxSum('b')['sum'] + $getTaxSum('c')['sum'] + $getTaxSum('d')['sum']; break;
-				
-                case 'order_id': $return = $oOrder->getId(); break;
-                case 'order_cdate':
-
-                    if (strtotime($oOrder->__get('cdate')) !== false) {
-						
-                        $return = date('d.m.Y H:i:s', strtotime($oOrder->__get('cdate')));
-						
-                    } else {
-						
-                        $return = '--';
-						
-                    }
-
-                    break;
-					
-                case 'order_onr': $return = $oOrder->getNr(); break;
-                case 'order_bemerkung': $return = preg_replace('/\r\n|\r|\n/', ' ', $oOrder->__get('comment')); break;
-                case 'order_price':
-
-                    $return = $oOrder->getAmount(WPSG_BRUTTO);
-
-                    break;
-
-                case 'order_price_netto':
-
-                    $return = $oOrder->getAmount(WPSG_NETTO);
-
-                    break;
-                case 'ordersum_price_netto': $return = $return = $oOrder->getAmountProductsum(WPSG_NETTO); break;
-                case 'ordersum_price': $return = $return = $oOrder->getAmountProductsum(WPSG_BRUTTO); break;
-                case 'order_shipping': $return = number_format($oOrder->__get('price_shipping'), 2, ',', '.'); break;
-                case 'order_payment': $return = number_format($oOrder->__get('price_payment'), 2, ',', '.'); break;
-                case 'order_useragent':	$return = $oOrder->__get('useragent'); break;
-                case 'order_ip': $return = $oOrder->__get('ip'); break;
-
-                case 'order_invoice_title': $return = $oOrder->getInvoiceTitle(); break;
-				
-	            case 'order_invoice_address1': 
-					
-					if ($oOrder->getInvoiceCompany() !== '') $return = trim($oOrder->getInvoiceCompany());
-					else $return = trim($oOrder->getInvoiceFirstName().' '.$oOrder->getInvoiceName());
-					
-				break;
-				
-				case 'order_invoice_address2': 
-					
-					if ($oOrder->getInvoiceCompany() !== '') $return = trim($oOrder->getInvoiceCompany());
-					else $return = trim($oOrder->getInvoiceName().', '.$oOrder->getInvoiceFirstName());
-					
-				break;
-					
-				case 'order_invoice_address3': // Rechnungsadresse Name, Vorname wenn kein Firmenname 
-					
-					if ($oOrder->getInvoiceCompany() === '') $return = trim($oOrder->getInvoiceName().', '.$oOrder->getInvoiceFirstName());
-					
-				break;
-				
-				case 'order_invoice_address4': // Rechnungsadresse Name, Vorname wenn Firmenname 
-					
-					if ($oOrder->getInvoiceCompany() !== '') $return = trim($oOrder->getInvoiceName().', '.$oOrder->getInvoiceFirstName());
-					
-				break;
-				
-                case 'order_invoice_firma': $return = $oOrder->getInvoiceCompany(); break;
-                case 'order_invoice_vorname': $return = $oOrder->getInvoiceFirstName(); break;
-                case 'order_invoice_name': $return = $oOrder->getInvoiceName(); break;
-                case 'order_invoice_strasse': $return = $oOrder->getInvoiceStreet(); break;
-                case 'order_invoice_strasse_strasse': $return = $oOrder->getInvoiceStreetClear(); break;
-                case 'order_invoice_strasse_nr': $return = $oOrder->getInvoiceStreetNr(); break;
-                case 'order_invoice_plz': $return = $oOrder->getInvoiceZip(); break;
-                case 'order_invoice_ort': $return = $oOrder->getInvoiceCity(); break;
-                case 'order_invoice_land': $return = $oOrder->getInvoiceCountryName(); break;
-                case 'order_invoice_land_krzl': $return = $oOrder->getInvoiceCountryKuerzel(); break;
-                case 'order_invoice_tel': $return = $oOrder->getInvoicePhone(); break;
-                case 'order_invoice_fax': $return = $oOrder->getInvoiceFax(); break;
-
-                case 'order_title': $return = $oOrder->getShippingTitle(); break;
-				
-				case 'order_address1': 
-					
-					if ($oOrder->getShippingCompany() !== '') $return = trim($oOrder->getShippingCompany());
-					else $return = trim($oOrder->getShippingFirstName().' '.$oOrder->getShippingName());
-					
-				break;
-				
-				case 'order_address2': 
-					
-					if ($oOrder->getShippingCompany() !== '') $return = trim($oOrder->getShippingCompany());
-					else $return = trim($oOrder->getShippingName().', '.$oOrder->getShippingFirstName());
-					
-				break;
-				
-				case 'order_address3': // Lieferadresse Name, Vorname wenn kein Firmenname 
-					
-					if ($oOrder->getShippingCompany() === '') $return = trim($oOrder->getShippingName().', '.$oOrder->getShippingFirstName());
-					
-				break;
-				
-				case 'order_address4': // Lieferadresse Name, Vorname wenn Firmenname 
-					
-					if ($oOrder->getShippingCompany() !== '') $return = trim($oOrder->getShippingName().', '.$oOrder->getShippingFirstName());
-					
-				break;
-				
-                case 'order_firma': $return = $oOrder->getShippingCompany(); break;
-                case 'order_vorname': $return = $oOrder->getShippingFirstName(); break;
-                case 'order_name': $return = $oOrder->getShippingName(); break;
-                case 'order_strasse': $return = $oOrder->getShippingStreet(); break;
-                case 'order_strasse_strasse': $return = $oOrder->getShippingStreetClear(); break;
-                case 'order_strasse_nr': $return = $oOrder->getShippingStreetNr(); break;
-                case 'order_plz': $return = $oOrder->getShippingZip(); break;
-                case 'order_ort': $return = $oOrder->getShippingCity(); break;
-                case 'order_land': $return = $oOrder->getShippingCountryName(); break;
-                case 'order_land_krzl': $return = $oOrder->getShippingCountryKuerzel(); break;
-
-                case 'order_payment_method': $return = $oOrder->getPaymentLabel(); break;
-	            case 'order_payment_id':
-					
-					if (intval($oOrder->getPaymentID()) === 2) { $return = $oOrder->getMeta('wpsg_mod_paypal_paymentid'); }
-					else if (intval($oOrder->getPaymentID()) === 10) { $return = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid'); }
-					else $return = '';
-					
-					break;
-					
-                case 'order_shipping_method': $return = $oOrder->getShippingLabel(); break;
-	            case 'order_shipping_tax': $return = $oOrder->getShippingTaxValue(); break;
-	            case 'order_shipping_tax2': $return = $oOrder->getShippingTaxValue() / 100; break;
-                case 'order_count': $return = $oOrder->getProductCount(); break;
-                case 'order_firma': $return = $oOrder->getInvoiceCompany(); break;
-                case 'order_status': $return = $oOrder->getStateLabel(); break;
-                case 'order_bnr': $return = $oOrder->__get('mod_autodebit_knr'); break;
-                case 'order_iban': $return = $oOrder->__get('mod_autodebit_iban'); break;
-                case 'order_bic': $return = $oOrder->__get('mod_autodebit_bic'); break;
-                case 'order_weight': $return = $oOrder->__get('weeight'); break;
-                case 'order_gutschein':
-
-					$gs_id = $oOrder->__get('gs_id');
-					
-                    if (wpsg_isSizedInt($gs_id)) {
-
-                        // AbwÃ€rtskompatibilitÃ€t fÃŒr alte Bestellungen						
-                        $return = $this->db->fetchOne("SELECT `code` FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `id` = '".wpsg_q($oOrder->__get('gs_id'))."'");
-
-                    } else {
-
-                        $return = $this->db->fetchOne("
-							SELECT
-								GROUP_CONCAT(`code`)
-							FROM
-								`".WPSG_TBL_ORDER_VOUCHER."`
-							WHERE
-								`order_id` = '".wpsg_q($oOrder->getId())."'
-							GROUP BY
-								`order_id`
-						");
-
-                    }
-
-                    break;
-
-                case 'rechnung_nr':
-
-                    $arInvoiceNr = [];
-                    foreach (\wpsg\wpsg_invoice::findByOrderId(intval($order['id'])) as $oInvoice) if ($oInvoice->isInvoice()) $arInvoiceNr[] = $oInvoice->getNr();
-
-                    $return = implode('/', $arInvoiceNr);
-
-                    break;
-
-                case 'rechnungskorrektur_nr':
-                case 'gutschrift_nr':
-
-                    $arInvoiceNr = [];
-                    foreach (\wpsg\wpsg_invoice::findByOrderId(intval($order['id'])) as $oInvoice) if ($oInvoice->isStorno()) $arInvoiceNr[] = $oInvoice->getNr();
-
-                    $return = implode('/', $arInvoiceNr);
-
-                    break;
-
-                case 'rdatum':
-
-                    $arInvoiceDate = [];
-                    foreach (\wpsg\wpsg_invoice::findByOrderId(intval($order['id'])) as $oInvoice) if ($oInvoice->isInvoice()) $arInvoiceDate[] = $oInvoice->getDate('d.m.Y H:i:s');
-
-                    $return = implode('/', $arInvoiceDate);
-
-                    break;
-
-                case 'stornodatum':
-
-                    $arInvoiceDate = [];
-                    foreach (\wpsg\wpsg_invoice::findByOrderId(intval($order['id'])) as $oInvoice) if ($oInvoice->isStorno()) $arInvoiceDate[] = $oInvoice->getDate('d.m.Y H:i:s');
-
-                    $return = implode('/', $arInvoiceDate);
-
-                    break;
-
-                case 'produkt_id': $return = $oProduct->getId(); break;
-                case 'produkt_index': $return = $oOrderProduct->getProductIndex(); break;
-				case 'produkt_name': if (!isset($oProduct)) throw new \Exception(); $return = $oProduct->getProductName(false, $product_key); break;
-                case 'produkt_detailname': if (!isset($oProduct)) throw new \Exception(); $return = $oProduct->getProductName(true, $product_key); break;
-                case 'product_url': $return = $oProduct->getProductURL(); break;
-                case 'product_picture_url':
-
-					if ($oOrderProduct !== null)
-                        $nAttachmentID = $this->shop->imagehandler->getAttachmentID($oOrderProduct->getProductKey());
-                    else
-						$nAttachmentID = $this->shop->imagehandler->getAttachmentID($oProduct->getId());
-					
-                    $return = '';
-
-                    if (wpsg_isSizedInt($nAttachmentID)) $return = \wp_get_attachment_url($nAttachmentID);
-
-                    break;
-                case 'product_picture_urls':
-
-					$arAttachmentIDs = [];
-					
-					if ($oOrderProduct !== null) $arAttachmentIDs = $this->shop->imagehandler->getAttachmentIDs($oOrderProduct->getProductKey());
-                    else $arAttachmentIDs = $this->shop->imagehandler->getAttachmentIDs($oProduct->getId());
-					
-                    $arReturn = [];
-
-					foreach ($arAttachmentIDs as $attachment_id) $arReturn[] =\wp_get_attachment_url($attachment_id);
-					
-					$return = implode('|', $arReturn);
-
-                    break;
-               
-                case 'product_google_shippingprice_dach':
-
-                    $return = $oProduct->getGPFShipping(['DE', 'AT', 'CH']);
-
-                    break;
-
-                case 'product_google_shippingprice_de':
-
-                    $return = $oProduct->getGPFShipping(['DE']);
-
-                    break;
-
-                case 'product_google_shippingprice_at':
-
-                    $return = $oProduct->getGPFShipping(['AT']);
-
-                    break;
-
-                case 'product_google_shippingprice_ch':
-
-                    $return = $oProduct->getGPFShipping(['CH']);
-
-                    break;         
-
-                case 'produkt_typ': $return = $oProduct->__get('typ'); break;
-                case 'produkt_preis': // Preis im Produkt (nach Shopkonfig)
-
-                    if ($this->shop->getBackendTaxview() == WPSG_BRUTTO)
-                        $return = number_format($oProduct->__get('preis'), 2, ',', '.');
-                    else
-                        $return = number_format($oProduct->__get('preis') + $oProduct->__get('mwst_value'), 2, ',', '.');
-
-                    break;
-
-                case 'produkt_preis_brutto': // Brutto Preis im Produkt
-
-                    $return = $oProduct->getPrice($product_key, WPSG_BRUTTO);
-
-                    break;
-
-                case 'produkt_preis_netto': // Netto Preis im Produkt
-
-                    $return = $oProduct->getPrice($product_key, WPSG_NETTO);
-
-                    break;
-
-				case 'product_preis_single_order': // Brutto Preis (1StÃŒck) aus bestelltem Produkt
-
-                    $return = number_format($oOrderProduct->getPrice(WPSG_BRUTTO), 2, ',', '.');
-                    break;
-
-                case 'product_preis_single_order_netto':
-
-                    $return = number_format($oOrderProduct->getPrice(WPSG_NETTO), 2, ',', '.');
-                    break;
-					
-                case 'product_preis_order': // Brutto Preis aus bestelltem Produkt
-
-                    $return = number_format($oOrderProduct->getPriceSum(WPSG_BRUTTO), 2, ',', '.');
-                    break;
-
-                case 'product_preis_order_netto':
-
-                    $return = number_format($oOrderProduct->getPriceSum(WPSG_NETTO), 2, ',', '.');
-                    break;
-
-                case 'produkt_mwst': $return = $oOrderProduct->getTaxKey(); break;
-                case 'produkt_mwst_satz': $return = wpsg_ff($oFrontendCountry->getTax($oProduct->__get('mwst_key'))); break;
-                case 'produkt_mwst_satz_100': $return = wpsg_ff($oFrontendCountry->getTax($oProduct->__get('mwst_key')) / 100); break;
-                case 'produkt_mwst_value': $return = wpsg_ff($oProduct->getPrice(false, WPSG_BRUTTO) - $oProduct->getPrice(false, WPSG_NETTO)); break;
- 
-                case 'produkt_order_mwst_value': $return = wpsg_ff($oOrderProduct->getTaxAmount()); break;
-
-                case 'produkt_feinheit': $return = $oProduct->__get('feinheit'); break;
-                case 'produkt_fmenge': 
-
-                    $value = str_replace(' ', '', $oProduct->__get('fmenge')); 
-                    $feinheit = str_replace(' ', '', $oProduct->__get('feinheit'));
-
-                    if ($value > 0) $return = $value.' '.$feinheit;
-                    else $return = '';
-                   
-                    break;
-
-                case 'produkt_reference_fmenge': 
-                    
-                    $value = str_replace(' ', '', $oProduct->getMeta('wpsg_mod_fuellmenge_referencevalue')); 
-                    $feinheit = str_replace(' ', '', $oProduct->getMeta('wpsg_mod_fuellmenge_referenceunit'));
-
-                    if ($value > 0) $return = $value.' '.$feinheit;
-                    else $return = '';
-                   
-                    break;
-
-                case 'produkt_beschreibung': $return = $oProduct->__get('beschreibung'); break;
-                case 'produkt_longdescription': $return = $oProduct->__get('longdescription'); break;
-                case 'produkt_productfeatures': $return = $oProduct->__get('productfeatures'); break;
-                case 'produkt_moreinfos': $return = $oProduct->__get('moreinfos'); break;
-                case 'produkt_moreinfos2': $return = $oProduct->__get('moreinfos2'); break;
-                case 'produkt_weight': $return = $oProduct->__get('weight'); break;
-                case 'produkt_stock': $return = $oProduct->__get('stock'); break;
-                case 'product_stock_state':
-
-					$product_stock = $oProduct->__get('stock');
-					
-                    $return = ((wpsg_isSizedInt($product_stock))?__('auf Lager', 'wpsg'):__('nicht auf Lager', 'wpsg'));
-
-                    break;
-				case 'product_google_productfeed_stock_state':
-
-                    $product_stock = $oProduct->__get('stock');
-                    
-                    $return = ((wpsg_isSizedInt($product_stock))?__('in_stock', 'wpsg'):__('out_of_stock', 'wpsg'));
-
-                    break;
-                case 'produkt_anr': $return = $oProduct->getNr($product_key); break;
-				case 'produkt_menge': $return = $oOrderProduct->__get('menge'); break;
-                case 'produkt_ean': $return = $oProduct->getEAN(); break;
-                case 'produkt_gtin': $return = $oProduct->getGTIN(); break;
-
-                case 'kunde_id': $return = $oCustomer->getId(); break;
-                case 'kunde_nr': $return = $oCustomer->getNr(); break;
-
-                case 'kunde_title': $return = $oCustomer->getTitle(); break;
-                case 'kunde_firma': $return = $oCustomer->getCompany(); break;
-                case 'kunde_vorname': $return = $oCustomer->getFirstname(); break;
-                case 'kunde_name': $return = $oCustomer->getName(); break;
-                case 'kunde_strasse': $return = $oCustomer->getStreet(); break;
-                case 'kunde_strasse_strasse': $return = $oCustomer->getStreetClear(); break;
-                case 'kunde_strasse_nr': $return = $oCustomer->getStreetNr(); break;
-                case 'kunde_ort': $return = $oCustomer->getCity(); break;
-                case 'kunde_plz': $return = $oCustomer->getZip(); break;
-                case 'kunde_land': $return = $oCustomer->getCountryName(); break;
-                case 'kunde_land_krzl': $return = $oCustomer->getCountryKuerzel(); break;
-                case 'kunde_tel': $return = $oCustomer->getPhone(); break;
-                case 'kunde_fax': $return = $oCustomer->getFax(); break;
-
-                case 'kunde_email': $return = $oCustomer->getEMail(); break;
-                case 'kunde_ustid': $return = $oCustomer->__get('ustidnr'); break;
-                case 'kunde_geb':
-
-                    if (strtotime($oCustomer->__get('geb')) !== false) {
-						
-                        $return = date('d.m.Y H:i:s', strtotime($oCustomer->__get('geb')));
-						
-                    } else {
-						
-                        $return = '--';
-						
-                    }
-
-                    break;
-
-                default:
-					
-					$return = null;
-					
-					foreach (wpsg_product::getProductCodeConfig() as $code_key => $code_data) {
-						
-						if ($field_value === 'product_code_'.$code_key) {
-							
-							if ($oOrderProduct !== null) 
-                            {
-							 
-								$pc_data = $oOrderProduct->getProduct()->getProductCode($code_key);
-								
-								if ($pc_data === null) $return = '';
-								else $return = $pc_data['code'];
-							
-							} 
-                            else if (isset($oProduct)) // here
-                            {
-								
-								$pc_data = $oProduct->getProductCode($code_key, $pvari_ID);
-								
-								if ($pc_data === null) $return = '';
-								else $return = $pc_data['code'];
-								
-							} 
-                            else throw new \Exception();
+					}
+					else if (preg_match('/pa_\d+/', $field_value))
+					{
+						
+						// Produktattribute
+						$paid = substr($field_value, 3);
+						$return = $produkt['mod_attribute'][$paid];
+						
+					}
+					else if (preg_match('/kv_\d+/', $field_value))
+					{
+						
+						// Kundenvariable
+						$kvid = substr($field_value, 3);
+						$return = $kunde['kv'][$kvid];
+						
+					}
+					else
+					{
+						
+						$return = false;						
+						$this->shop->callMods('wpsg_mod_export_getValue', array(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator));
+						
+						if ($return === false)
+						{
+						
+							$return = __('Nicht definiert!'.$field_value, 'wpsg');
 							
 						}
 						
 					}
-					
-					if ($return !== null) break;
-					
-                    if (preg_match('/ov_\d+/', $field_value)) {
-
-                        // Bestellvariable
-                        $ordervarid = substr($field_value, 3);
-                        $return = $order['bvars'][$ordervarid];
-
-                    } else if (preg_match('/pv_\d+/', $field_value)) {
-
-                        $produktvarid = substr($field_value, 3);
-                        
-                        // Produktvariable (index kann auch 0 sein)
-						if (isset($oOrderProduct)) {
-							
-							if (isset($order['pvars'][$oOrderProduct->getProductIndex()])) {
-								
-								$return = $order['pvars'][$oOrderProduct->getProductIndex()][$produktvarid] ?? '';
-								
-							} else {
-								
-								$return = $order['pvars'][$oOrderProduct->getProductKey()][$produktvarid] ?? '';
-								
-							}
-							
-						}
-
-                    } else if (preg_match('/pa_\d+/', $field_value)) {
-
-                        // Produktattribute
-                        $paid = substr($field_value, 3);
-                        $return = $this->shop->callMod('wpsg_mod_produktattribute', 'getAttributeValue', [$oProduct->getId(), $paid]);
-
-                    } else if (preg_match('/kv_\d+/', $field_value)) {
-
-                        // Kundenvariable
-                        $kvid = substr($field_value, 3);
-                        $return = $kunde['kv'][$kvid]??'';
-
-                    } else {
-
-                        $return = false;
-					 
-                        $this->shop->callMods('wpsg_mod_export_getValue', array(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator));
-
-                        if ($return === false) {
-
-                            $return = __('Nicht definiert ('.$field_value.') !', 'wpsg');
-
-                        }
-
-                    }
-
-            }
-
-            $f['size'] = 111255;
-
-            if (wpsg_isSizedInt($f['trim'])) $return = preg_replace('/\040/', '', $return);
-
-            if (isset($f['format']) && $f['format'] > 0 && $return != '--') {
-
-                switch ($f['format']) {
-
-                    case 100: $return = number_format(floatval(wpsg_tf($return)), 2, '.', ''); break;
-                    case 200: $return = number_format(floatval(wpsg_tf($return)), 2, ',', ''); break;
-                    case 300: $return = wpsg_ff(wpsg_tf($return), $this->shop->get_option('wpsg_currency')); break;
-                    case 400: $return = ((strtotime($return) !== false)?date('d.m.Y', strtotime($return)):''); break;
-                    case 500: $return = date('H:i:s', strtotime($return)); break;
-                    case 600: $return = date('d.m.Y H:i:s', strtotime($return)); break;
-                    case 610: $return = date('c', strtotime($return)); break;
-                    case 700: $return = strftime($this->shop->replaceUniversalPlatzhalter($f['userformat'], $order['id'], $kunde['id'], false, $p_id), strtotime($return)); break;
-                    case 800: $return = '"'.$return.'"'; break;
-                    case 900: $return = '"=""'.$return.'"""'; break;
-
-                }
-
-            }
- 
-            $return = substr($return??'', 0, intval($f['size']));
-
-            return $return;
-
-        }
-
-	    /**
-	     *
-	     * @param DOMNode &$node_root
-	     * @param string $tag
-	     * @param string $value
-	     * @param array $f
-	     *
-	     * @return void
-	     * @parem String $value
-	     */
-		private function addXMLNode(DOMDOcument $doc, DOMNode &$node_root, string $tag, string $value, array $f) {
-		
-			$arRootline = explode('/', $tag);
-			$node = $node_root;
-			
-			foreach ($arRootline as $k => $tag) {
-				
-				$add = true;
-				
-				for ($i = 0; $i <= $node->childNodes->length; $i ++) {
-					
-					if ($node->childNodes->item($i)->nodeName === $tag) {
-				
-						$add = false;
-						$node = $node->childNodes->item($i);
-						
-						break;
-						
-					}
-					
-				}
-				
-				if ($add) {
-					
-					$new_node = $doc->createElement($this->clearXML($tag));
-                    $new_node = $node->appendChild($new_node);
-					
-					$node = $new_node;
-					
-				}
-				
-				if ($k === sizeof($arRootline) - 1) {
-					
-					if (intval($f['format']) === 950) {
-						
-						$tag_value = $doc->createCDATASection($value);
-						
-					} else {
-						
-						$tag_value = $doc->createTextNode(htmlspecialchars($value));
-						
-					}
-					
-					$node->appendChild($tag_value);
-					
-				}
-				
-			}
-			
-		}
-		
-    } 
+				
+			}  
+			
+			$f['size'] = 111255;
+			
+			if (isset($f['format']) && $f['format'] > 0 && $return != '--')
+			{
+				
+				switch ($f['format'])
+				{
+					
+					case 100: $return = number_format(floatval(wpsg_tf($return)), 2, '.', ''); break;
+					case 200: $return = number_format(floatval(wpsg_tf($return)), 2, ',', ''); break;
+					case 300: $reutrn = wpsg_ff(wpsg_tf($return), $this->shop->get_option('wpsg_currency')); break;
+					case 400: $return = date('d.m.Y', strtotime($return)); break;
+					case 500: $return = date('H:i:s', strtotime($return)); break;
+					case 600: $return = date('d.m.Y H:i:s', strtotime($return)); break;					
+					case 700: $return = strftime($this->shop->replaceUniversalPlatzhalter($f['userformat'], $order['id'], $kunde['id'], false, $p_id), strtotime($return)); break;
+					case 800: $return = '"'.$return.'"'; break;
+					case 900: $return = '"=""'.$return.'"""'; break;
+					
+				}
+				
+			}
+						
+			$return = substr($return, 0, intval($f['size'])); 
+			
+			return $return;
+			
+		} // public function getValue($field_value, $o_id, $p_id = false)
+		
+	} // wpsg_mod_export extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_flexipay.class.php
===================================================================
--- /mods/wpsg_mod_flexipay.class.php	(revision 8528)
+++ /mods/wpsg_mod_flexipay.class.php	(revision 5261)
@@ -13,5 +13,12 @@
 		var $version = "9.9.9";
 		var $free = true;
-				
+		
+		var $curl_options = array(
+			CURLINFO_HEADER_OUT => true,
+			CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded;charset=UTF-8'),
+			CURLOPT_FOLLOWLOCATION => 0,
+			CURLOPT_SSL_VERIFYPEER => false
+		);
+		
 		var $api_url = array(
 			'generateToken' => array(
@@ -85,50 +92,87 @@
 		{
 		
-		    $this->shop->update_option('wpsg_mod_flexipay_integratormode', $_REQUEST['wpsg_mod_flexipay_integratormode'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_flexipay_sender', $_REQUEST['wpsg_mod_flexipay_sender'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_flexipay_channelid', $_REQUEST['wpsg_mod_flexipay_channelid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_flexipay_userid', $_REQUEST['wpsg_mod_flexipay_userid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_flexipay_password', $_REQUEST['wpsg_mod_flexipay_password'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		
-			$this->shop->update_option('wpsg_mod_flexipay_activ', $_REQUEST['wpsg_mod_flexipay_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_flexipay_paymenttypes', implode(' ', $_REQUEST['wpsg_mod_flexipay_paymenttypes']), false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_flexipay_name', $_REQUEST['wpsg_mod_flexipay_name'], false, false, WPSG_SANITIZE_TEXTFIELD); $this->shop->addTranslationString('wpsg_mod_flexipay_name', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_flexipay_name']));
-			$this->shop->update_option('wpsg_mod_flexipay_hint', $_REQUEST['wpsg_mod_flexipay_hint'], false, false, WPSG_SANITIZE_TEXTFIELD); $this->shop->addTranslationString('wpsg_mod_flexipay_hint', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_flexipay_hint']));
-			$this->shop->update_option('wpsg_mod_flexipay_logo', $_REQUEST['wpsg_mod_flexipay_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_flexipay_language', $_REQUEST['wpsg_mod_flexipay_language'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_flexipay_gebuehr', $_REQUEST['wpsg_mod_flexipay_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_flexipay_mwst', $_REQUEST['wpsg_mod_flexipay_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_flexipay_mwstland', $_REQUEST['wpsg_mod_flexipay_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-		
-			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_flexipay_successPage', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_flexipay_successPage']));
-			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_flexipay_errorPage', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_flexipay_errorPage']));
+			$this->shop->update_option('wpsg_mod_flexipay_integratormode', $_REQUEST['wpsg_mod_flexipay_integratormode']);
+			$this->shop->update_option('wpsg_mod_flexipay_sender', $_REQUEST['wpsg_mod_flexipay_sender']);
+			$this->shop->update_option('wpsg_mod_flexipay_channelid', $_REQUEST['wpsg_mod_flexipay_channelid']);
+			$this->shop->update_option('wpsg_mod_flexipay_userid', $_REQUEST['wpsg_mod_flexipay_userid']);
+			$this->shop->update_option('wpsg_mod_flexipay_password', $_REQUEST['wpsg_mod_flexipay_password']);
+		
+			$this->shop->update_option('wpsg_mod_flexipay_activ', $_REQUEST['wpsg_mod_flexipay_activ']);
+			$this->shop->update_option('wpsg_mod_flexipay_paymenttypes', implode(' ', $_REQUEST['wpsg_mod_flexipay_paymenttypes']));
+			$this->shop->update_option('wpsg_mod_flexipay_name', $_REQUEST['wpsg_mod_flexipay_name']); $this->shop->addTranslationString('wpsg_mod_flexipay_name', $_REQUEST['wpsg_mod_flexipay_name']);
+			$this->shop->update_option('wpsg_mod_flexipay_hint', $_REQUEST['wpsg_mod_flexipay_hint']); $this->shop->addTranslationString('wpsg_mod_flexipay_hint', $_REQUEST['wpsg_mod_flexipay_hint']);
+			$this->shop->update_option('wpsg_mod_flexipay_logo', $_REQUEST['wpsg_mod_flexipay_logo']);
+			$this->shop->update_option('wpsg_mod_flexipay_language', $_REQUEST['wpsg_mod_flexipay_language']);
+			$this->shop->update_option('wpsg_mod_flexipay_gebuehr', $_REQUEST['wpsg_mod_flexipay_gebuehr']);
+			$this->shop->update_option('wpsg_mod_flexipay_mwst', $_REQUEST['wpsg_mod_flexipay_mwst']);
+			$this->shop->update_option('wpsg_mod_flexipay_mwstland', $_REQUEST['wpsg_mod_flexipay_mwstland']);
+		
+			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_flexipay_successPage', $_REQUEST['wpsg_mod_flexipay_successPage']);
+			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_flexipay_errorPage', $_REQUEST['wpsg_mod_flexipay_errorPage']);
 		
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_flexipay_successPage'));
-            wp_delete_post($this->shop->get_option('wpsg_mod_flexipay_errorPage'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function addPayment(&$arPayment) {
-			
-			if (is_admin() || $this->shop->get_option('wpsg_mod_flexipay_activ') == '1') {
+		
+		public function addPayment(&$arPayment)
+		{
+		
+			if (is_admin() || $this->shop->get_option('wpsg_mod_flexipay_activ') == '1')
+			{
+		
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_flexipay_mwst'), $this->shop->getDefaultCountry());
 		
 				$arPayment[$this->id] = array(
 					'id' => $this->id,
 					'name' => __($this->shop->get_option('wpsg_mod_flexipay_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_flexipay_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_flexipay_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_flexipay_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_flexipay_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_flexipay_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_flexipay_hint'), 'wpsg'),
-					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_flexipay_logo')))?$this->shop->get_option('wpsg_mod_flexipay_logo'):$this->shop->getRessourceURL('mods/mod_flexipay/gfx/logo_100x25.png'))
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_flexipay_logo')))?$this->shop->get_option('wpsg_mod_flexipay_logo'):$this->shop->getRessourceURL('mods/mod_flexipay/gfx/flexipay.gif')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_flexipay/gfx/logo_100x25.png')
 				);
-				
+		
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_flexipay_gebuehr'), $mwst_value, $arPayment, $this->id);
+		
 			}
 		
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket)
+		{
+		
+			if ($this->id == $arBasket['checkout']['payment'])
+			{
+		
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_flexipay_gebuehr'), $arBasket['sum']['preis']);
+				$mwstland = $this->shop->get_option('wpsg_mod_flexipay_mwstland');
+				$mwst = $this->shop->get_option('wpsg_mod_flexipay_mwst');
+		
+				if ($mwstland == '1' && $arBasket['noMwSt'])
+				{
+		
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+		
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+		
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $mwst);
+		
+				}
+		
+			}
+		
+		} // public function calcPayment(&$arBasket)
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -213,8 +257,8 @@
 		} // public function order_done(&$order_id, &$done_view)
 		
-		public function template_redirect()
-		{
-		
-			if (!wpsg_isSizedString($_REQUEST['wpsg_plugin'], 'wpsg_mod_flexipay')) return;
+		public function wp_loaded()
+		{
+		
+			if ($_REQUEST['wpsg_plugin'] != 'wpsg_mod_flexipay') return;
 		
 			if ($_REQUEST['wpsg_action'] === 'checkStatus')
@@ -228,5 +272,5 @@
 				$url .= $_REQUEST['token'];
 		
-				$result = $this->shop->get_url_post_content($url, $arParam);
+				$result = $this->shop->get_url_post_content($url, $arParam, $this->curl_options);
 				$resultJson = json_decode($result, true);
 		
@@ -277,5 +321,5 @@
 			}
 		
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function mail_payment()
@@ -359,5 +403,5 @@
 			if (in_array($this->shop->get_option('wpsg_mod_flexipay_integratormode'), array('INTEGRATOR_TEST', 'CONNECTOR_TEST'))) $url = $this->api_url['generateToken']['test'];
 		
-			$result = $this->shop->get_url_post_content($url, $arParam);
+			$result = $this->shop->get_url_post_content($url, $arParam, $this->curl_options);
 			$ident = json_decode($result);
 		
Index: /mods/wpsg_mod_freeshipping.class.php
===================================================================
--- /mods/wpsg_mod_freeshipping.class.php	(revision 8528)
+++ /mods/wpsg_mod_freeshipping.class.php	(revision 5261)
@@ -47,13 +47,13 @@
 		{
 			
-		    $this->shop->update_option('wpsg_mod_freeshipping_bezeichnung', $_REQUEST['wpsg_mod_freeshipping_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_freeshipping_aktiv', $_REQUEST['wpsg_mod_freeshipping_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_freeshipping_minvalue', $_REQUEST['wpsg_mod_freeshipping_minvalue'], false, false, WPSG_SANITIZE_FLOAT);
+			$this->shop->update_option('wpsg_mod_freeshipping_bezeichnung', $_REQUEST['wpsg_mod_freeshipping_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_freeshipping_aktiv', $_REQUEST['wpsg_mod_freeshipping_aktiv']);		
+			$this->shop->update_option('wpsg_mod_freeshipping_minvalue', $_REQUEST['wpsg_mod_freeshipping_minvalue']);
 			
-			$this->shop->addTranslationString('wpsg_mod_freeshipping_bezeichnung', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_freeshipping_bezeichnung']));
+			$this->shop->addTranslationString('wpsg_mod_freeshipping_bezeichnung', $_REQUEST['wpsg_mod_freeshipping_bezeichnung']);
 			
 		} // public function settings_save()
 		
-		public function addShipping(&$arShipping, $va_active = false) 
+		public function addShipping(&$arShipping) 
 		{ 
 	 
@@ -61,36 +61,35 @@
 			
 			$arShipping[$this->id] = array(
-				'active' => $this->shop->get_option('wpsg_mod_freeshipping_aktiv'),
 				'id' => $this->id,
 				'name' => $this->shop->get_option('wpsg_mod_freeshipping_bezeichnung'),
-				'price' => 0, 
-				'tax_key' => 0
+				'preis' => 0,
+				'preis_calc' => 0,			
+				'mwst' => 0,
+				'mwst_value' => 0
 			); 
 				
 		} // public function addShipping(&$arShipping)
 		
-		public function checkShippingAvailable(&$arShipping) 
-		{
+		public function checkShippingAvailable(&$arShipping, &$arBasket) 
+		{ 
 			
-			if (!wpsg_isSizedArray($this->shop->arShipping) || !array_key_exists($this->id, $this->shop->arShipping)) return;
-						
-			$oCalculation = \wpsg\wpsg_calculation::getSessionCalculation();
-			$arCalculation = $oCalculation->getCalculationArray();
+			// Ist die Versandart ÃŒberhaupt drin ?
+			if (!array_key_exists($this->id, $this->shop->arShipping)) return;
 			
-			if ($this->shop->getBackendTaxview() === WPSG_NETTO) $sum = $arCalculation['sum']['productsum_netto'];
-			else $sum = $arCalculation['sum']['productsum_brutto'];
-			  				
-			if ($sum < wpsg_tf($this->shop->get_option('wpsg_mod_freeshipping_minvalue'))) {
-								
+			if ($arBasket['sum']['preis_brutto'] <= $this->shop->get_option('wpsg_mod_freeshipping_minvalue'))
+			{
+				
 				unset($arShipping[$this->id]);
 			
-			} else {
+			}
+			else 
+			{
 				
 				// Alle anderen Versandarten entfernen
 				foreach ($arShipping as $k => $v) { if ($k != $this->id && $k != '130') unset($arShipping[$k]); }
-				
-			} 
+						
+			}
 			
-		} // public function checkShippingAvailable(&$arShipping)
+		} // public function checkShippingAvailable(&$arShipping, &$arBasket)
  	
 	} // class wpsg_mod_freeshipping extends wpsg_mod_basic
Index: /mods/wpsg_mod_fuellmenge.class.php
===================================================================
--- /mods/wpsg_mod_fuellmenge.class.php	(revision 8528)
+++ /mods/wpsg_mod_fuellmenge.class.php	(revision 5261)
@@ -37,5 +37,5 @@
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
 			  	feinheit varchar(50) NOT NULL,
-			  	fmenge varchar(50) NOT NULL
+			  	fmenge varchar(50) NOT NULL,
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
 			
@@ -51,162 +51,51 @@
 		} // public function settings_edit()
 		
-		public function settings_save() {
+		public function settings_save() 
+		{
 			
-		    $this->shop->update_option('wpsg_mod_fuellmenge_einheit', $_REQUEST['wpsg_mod_fuellmenge_einheit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_fuellmenge_bezug', $_REQUEST['wpsg_mod_fuellmenge_bezug'], false, false, WPSG_SANITIZE_FLOAT);
-		    $this->shop->update_option('wpsg_mod_fuellmenge_showAjaxDialog', $_REQUEST['wpsg_mod_fuellmenge_showAjaxDialog'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_fuellmenge_showBasketProduct', $_REQUEST['wpsg_mod_fuellmenge_showBasketProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_fuellmenge_showOverviewProduct', $_REQUEST['wpsg_mod_fuellmenge_showOverviewProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_fuellmenge_einheit', $_REQUEST['wpsg_mod_fuellmenge_einheit']);
+			$this->shop->update_option('wpsg_mod_fuellmenge_bezug', $_REQUEST['wpsg_mod_fuellmenge_bezug']);
 			
-			if ($this->shop->hasMod('wpsg_mod_productindex')) {
+			if ($this->shop->hasMod('wpsg_mod_fuellmenge') == '1')
+			{
 				
-				$this->shop->update_option('wpsg_mod_fuellmenge_showProductindexBackend_fmenge', $_REQUEST['wpsg_mod_fuellmenge_showProductindexBackend_fmenge'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->shop->update_option('wpsg_mod_fuellmenge_showProductindex_fmenge', $_REQUEST['wpsg_mod_fuellmenge_showProductindex_fmenge'], false, false, WPSG_SANITIZE_CHECKBOX);
-				$this->shop->update_option('wpsg_mod_fuellmenge_showProductindex_grundpreis', $_REQUEST['wpsg_mod_fuellmenge_showProductindex_grundpreis'], false, false, WPSG_SANITIZE_FLOAT);
+				$this->shop->update_option('wpsg_mod_fuellmenge_showProductindex_fmenge', $_REQUEST['wpsg_mod_fuellmenge_showProductindex_fmenge']);
+				$this->shop->update_option('wpsg_mod_fuellmenge_showProductindex_grundpreis', $_REQUEST['wpsg_mod_fuellmenge_showProductindex_grundpreis']);
 				
 			}
 			
-			if ($this->shop->hasMod('wpsg_mod_request')) { 
-			
-				$this->shop->update_option('wpsg_mod_fuellmenge_showRequestPageProduct', $_REQUEST['wpsg_mod_fuellmenge_showRequestPageProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-				
-			}
-						
 		} // public function settings_save()
 		
-		public function basket_row(&$p, $i)
+		public function produkt_add(&$data)
 		{
 			
-			if ($this->shop->get_option('wpsg_mod_fuellmenge_showBasketProduct') != '1') return;
+			$data['arFeinheiten'] = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
+			
+		} // public function produkt_add(&$data)
+		 
+		public function produkt_edit(&$data)
+		{
+			
+			$data = wpsg_array_merge($data, $this->db->fetchRow("
+				SELECT
+					`feinheit`, `fmenge`
+				FROM
+					`".WPSG_TBL_PRODUCTS."`
+				WHERE
+					`id` = '".wpsg_q($data['id'])."'
+			"));
 						
-			$this->shop->view['p'] = $p;
-			$this->shop->view['i'] = $i; 
+			$data['arFeinheiten'] = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
 			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_fuellmenge/basket_row.phtml');
-					
-		} // public function basket_row(&$p, $i)
-		
-		public function overview_row(&$p, $i) 
+		} // public function produkt_edit(&$data)
+				
+		public function produkt_save(&$produkt_id)
 		{
-			if ($this->shop->get_option('wpsg_mod_fuellmenge_showOverviewProduct') != '1') return; 
 			
-			$this->shop->view['i'] = $i; 
-			$this->shop->view['p'] = $p; 
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_fuellmenge/overview_row.phtml');
-			
-		} //public function overview_row(&$p, $i)
-				
-		public function basket_toArray(&$produkt, $backend = false, $noMwSt = false) {
-		
-			$produkt['fuellmenge_one'] = $this->getFuellmenge($produkt['id']);
-			$produkt['fuellmenge'] = $this->getFuellmenge($produkt['id']) * $produkt['menge'];
-		
-		} //public function basket_toArray(&$produkt, $backend = false; $noMwSt = false)
-		
-		public function basket_toArray_preshippayment(&$basket, &$arBasket) {
-		 
-			if ($basket->loadFromSession)
-			{
-		
-				$fuellmenge_sum = 0;
-		
-				foreach ($arBasket['produkte'] as $k => $p)
-				{
-		
-					$fuellmenge_sum += $p['fuellmenge'];
-		
-				}
-		
-				$arBasket['sum']['fuellmenge'] = $fuellmenge_sum;
-		
-			}
-			else if ($basket->o_id > 0)
-			{
-		
-				$order_data = $this->shop->cache->loadOrder($basket->o_id);
-		
-				if (isset($order_data['fuellmenge'])) $arBasket['sum']['fuellmenge'] = $order_data['fuellmenge'];
-		
-			}
-		
-		} // public function basket_toArray_final(&$basket, &$arBasket)
-		
-		public function getFuellmenge($product_key) {
-		
-			$product_data_db = $this->shop->cache->loadProduct($this->shop->getProduktId($product_key));
-		
-			if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($product_key)))
-			{
-		
-				$variInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($product_key));
-				$fuellmenge = @$product_data_db['fuellmenge'] + @$variInfo['fuellmenge'];
-		
-			}
-			else
-			{
-		
-				$fuellmenge = @$product_data_db['fuellmenge'];
-		
-			}
-		
-			return $fuellmenge;
-		
-		} // public function getFuellmenge($produkt_key)
-		
-		public function product_addedit_content(&$product_content, &$product_data) {
-		
-			if (!wpsg_isSizedInt($product_data['id'])) return null;
-			
-			if (wpsg_isSizedInt($product_data['id'])) {
-				
-				$product_data = wpsg_array_merge($product_data, $this->db->fetchRow("
-					SELECT
-						`feinheit`, `fmenge`
-					FROM
-						`".WPSG_TBL_PRODUCTS."`
-					WHERE
-						`id` = '".wpsg_q($product_data['id'])."'
-				"));
-				
-			}
-		
-			$product_data['arFeinheiten'] = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
-
-            if (!array_key_exists('stock', $product_content)) {
-
-                $this->shop->view['arSubAction']['stock'] = array(
-                    'title' => __('Bestand / Gew. / FÃŒllm.', 'wpsg'),
-                    'content' => ''
-                );
-
-            }
-
-            $product_content['stock']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_fuellmenge/produkt_edit_sidebar.phtml', false);
-
-		}
-		
-		public function produkt_save(&$produkt_id) {
-			
-			if (intval($_REQUEST['edit_id']) <= 0) return;
-			
-			$db_data = [];
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
+				"feinheit" => wpsg_q($_REQUEST['feinheit']),
+				"fmenge" => wpsg_q(wpsg_tf($_REQUEST['fmenge']))
+			), "`id` = '".wpsg_q($produkt_id)."'");
 						
-			wpsg_checkRequest('feinheit', [WPSG_SANITIZE_TEXTFIELD], __('Einheit FÃŒllmenge', 'wpsg'), $db_data);
-			wpsg_checkRequest('fmenge', [WPSG_SANITIZE_FLOAT], __('FÃŒllmenge', 'wpsg'), $db_data);
-			
-			if (wpsg_isSizedArray($db_data)) {
-			
-				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $db_data, "`id` = '".wpsg_q($produkt_id)."'");
-				
-			}
-			
-			$oProduct = wpsg_product::getInstance($produkt_id);
-			
-			if (isset($_REQUEST['fmenge_details']) && wpsg_checkInput($_REQUEST['fmenge_details'], WPSG_SANITIZE_CHECKBOX)) $oProduct->setMeta('fmenge_details', $_REQUEST['fmenge_details']);
-			if (isset($_REQUEST['wpsg_mod_fuellmenge_referencevalue']) && wpsg_checkInput($_REQUEST['wpsg_mod_fuellmenge_referencevalue'], WPSG_SANITIZE_FLOAT)) $oProduct->setMeta('wpsg_mod_fuellmenge_referencevalue', $_REQUEST['wpsg_mod_fuellmenge_referencevalue']);
-			if (isset($_REQUEST['referenceunit']) && wpsg_checkInput($_REQUEST['referenceunit'], WPSG_SANITIZE_TEXTFIELD)) $oProduct->setMeta('wpsg_mod_fuellmenge_referenceunit', $_REQUEST['referenceunit']);
-			if (isset($_REQUEST['wpsg_mod_fuellmenge_conversionvalue']) && wpsg_checkInput($_REQUEST['wpsg_mod_fuellmenge_conversionvalue'], WPSG_SANITIZE_FLOAT)) $oProduct->setMeta('wpsg_mod_fuellmenge_conversionvalue', $_REQUEST['wpsg_mod_fuellmenge_conversionvalue']);
-			
 		} // public function produkt_save(&$produkt_id)
 		
@@ -219,92 +108,49 @@
 			
 		} // public function produkt_edit_sidebar(&$produkt_data)
-		 		 
-		public function loadProduktArray(&$arProductData) {
+		 		
+		public function loadProduktArray(&$produkt)
+		{
 			
-			if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$arProductData['product_key']])) {
+			$arFeinheiten = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
+						
+			if ($this->shop->hasMod('wpsg_mod_varianten') && $this->shop->callMod('wpsg_mod_varianten', 'isVariantsProductKey', array($produkt['id'])))
+			{
 				
-				$variInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', [$arProductData['product_key']]);
+				$variInfo = $this->shop->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($produkt['id']));
+				$produkt['fmenge'] += $variInfo['fmenge'];
 				
-				$arProductData['fmenge'] = $variInfo['fmenge'];
-					
 			}
 			
-		}
+			$produkt['feinheit'] = $arFeinheiten[$produkt['feinheit']];
+			if ($produkt['fmenge'] > 0) $produkt['fmenge_preis'] = $produkt['preis'] / $produkt['fmenge'] * wpsg_tf($this->shop->get_option('wpsg_mod_fuellmenge_bezug'));
+						
+		} // public function renderProdukt_data(&$view)
 		
 		/** Modulfunktionen */
 		
-		/**
-		 * Bis Januar 202 waren die Einheiten als index gespeichert, das habe ich geÃ€ndert und daher diese Funktion
-		 * 		 
-		 * @param $feinheit
-		 * @return mixed
-		 */
-		public function getUnit($feinheit) {
-
-			if (is_numeric($feinheit)) {
+		public function renderPriceInfo($price, $fmenge, $feinheit)
+		{
+			
+			if ($price <= 0 || $fmenge <= 0) return;
+			
+			if (is_numeric($feinheit))
+			{
 				
 				$arFeinheiten = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
+				$feinheit = $arFeinheiten[$feinheit];
 				
-				return $arFeinheiten[$feinheit];
-				
-			} else return $feinheit; 
-					    
-        }
-		
-		public function renderPriceInfo($price, $fmenge, $product_id, $layout = 1) {
-			
-			if ($price <= 0 || $fmenge <= 0) return;
-			 
-			$arValues = $this->calculateValues($price, $fmenge, $product_id);
+			}
 			
 			$this->shop->view['wpsg_mod_fuellmenge'] = array(
-			    'layout' => $layout,
-				'fmenge' => $arValues['fmenge'],
-				'feinheit' => $arValues['feinheit'],
-				'referencevalue' => $arValues['referencevalue'],
-				'referenceunit' => $arValues['referenceunit'],
-				'fmenge_preis' => $arValues['fmenge_preis']
+				'fmenge' => $fmenge,
+				'feinheit' => $feinheit,
+				'fmenge_preis' => $price / $fmenge * wpsg_tf($this->shop->get_option('wpsg_mod_fuellmenge_bezug'))
 			);
 						 			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_fuellmenge/priceinfo.phtml');			
 			
-		} 
-		
-		public function calculateValues($price, $fmenge, $product_id) {
-			 
-			$oProduct = wpsg_product::getInstance($product_id);
-			
-			$feinheit = $this->getUnit($oProduct->__get('feinheit'));
-			$fmenge_details = $oProduct->getMeta('fmenge_details'); // Erweitert
-			$referencevalue = wpsg_tf($oProduct->getMeta('wpsg_mod_fuellmenge_referencevalue'));
-			$referenceunit = $oProduct->getMeta('wpsg_mod_fuellmenge_referenceunit');
-			$conversionvalue = $oProduct->getMeta('wpsg_mod_fuellmenge_conversionvalue');
-			
-			if ($fmenge_details !== '1') {
-				 
-				$referencevalue = $this->shop->get_option('wpsg_mod_fuellmenge_bezug');
-				$referenceunit = $feinheit;
-				
-			}
-			
-			if ($conversionvalue <= 0 || $feinheit === $referenceunit) $conversionvalue = 1;
-					
-			// Umrechnung
-			if ($conversionvalue !== 1) $fmenge_reference = ($fmenge * $referencevalue) / $conversionvalue;
-			else $fmenge_reference = $fmenge;
-			
-			if ($fmenge_reference <= 0) $reference_price = 0;
-			else $reference_price = $price / $fmenge_reference * $referencevalue;
-			
-			return [
-				'fmenge' => round($fmenge, 2),
-				'feinheit' => $feinheit,
-				'referencevalue' => $referencevalue,
-				'referenceunit' => $referenceunit,
-				'fmenge_preis' => round($reference_price, 2)
-			];
-			
-		}
+		} // public function renderPriceInfo($fmenge, $feinheit)
 		
 	} // class wpsg_mod_fuellmenge extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_funding.class.php
===================================================================
--- /mods/wpsg_mod_funding.class.php	(revision 5261)
+++ /mods/wpsg_mod_funding.class.php	(revision 5261)
@@ -0,0 +1,297 @@
+<?php
+
+	/**
+	 * Erlaubt die Definition und Anzeige von Lieferzeiten
+	 * @author Daschmi (daniel@maennchen1.de)
+	 */
+	class wpsg_mod_funding extends wpsg_mod_basic
+	{
+	
+		var $lizenz = 1;
+		var $id = 2050;  
+		var $version = "9.9.9"; 
+		
+		var $free = true;
+		
+		var $arStateLabel;
+		
+		const STATE_COMPLETED = 1;
+		const STATE_RUNNING = 2;
+		const STATE_CLOSED = 3;
+		const STATE_NOTSTARTET = 4;
+	
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+	
+			parent::__construct();
+	
+			$this->name = __('Crowdfunding', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('Erlaubt den Verkauf von Produkten die durch mehrere KÃ€ufer finanziert werden.', 'wpsg');
+	
+			$this->arStateLabel = array(
+				self::STATE_COMPLETED => __('Erfolgreich Abgeschlossen', 'wpsg'),
+				self::STATE_RUNNING => __('LÃ€uft', 'wpsg'),
+				self::STATE_CLOSED => __('Zeitraum abgelaufen', 'wpsg'),
+				self::STATE_NOTSTARTET => __('Noch nicht gestartet', 'wpsg')
+			);
+			
+		} // public function __construct()
+	
+		public function install()
+		{
+			
+			
+			
+		} // public function install()
+		
+		public function settings_edit()
+		{
+		
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_funding/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			
+			
+		} // public function settings_save()
+		
+		public function productForSale($product_key) 
+		{
+			 
+			$product_id = $this->shop->getProduktID($product_key);
+						
+			if ($this->isFundingProduct($product_id) && $this->getFundingState($product_id) != self::STATE_RUNNING) return -2;
+						
+		} // public function productForSale($product_key) 
+		
+		public function product_bottom(&$produkt_id, $template_index) 
+		{ 
+		
+			$this->shop->view['wpsg_mod_funding']['state'] = $this->getFundingState($produkt_id);
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_funding/product_bottom.phtml');
+			
+		} // public function product_bottom(&$produkt_id, $template_index)
+		
+		public function basket_produkttosession($product_key, &$menge, &$ses_data) 
+		{ 
+			
+			$product_id = $this->shop->getProduktID($product_key);
+			
+			if ($this->isFundingProduct($product_id))
+			{
+				
+				// Anzahl schon im Warenkorb
+				$nBasket = $this->shop->basket->getBasketAmount($product_key);
+				
+				if ($nBasket + $menge + $this->getCurrentFundingCount($product_id) > $this->getMaxFundingCount($product_id))
+				{
+					
+					$nMengeAllowed = $this->getMaxFundingCount($product_id) - $this->getCurrentFundingCount($product_id)- $nBasket;
+					
+					if ($nMengeAllowed > 0) 
+					{
+						
+						$menge = $nMengeAllowed;
+						$this->shop->addFrontendError(wpsg_translate(
+							__('Produkt "#1#" kann nur noch maximal #2# mal erworben werden.', 'wpsg'),
+							$this->shop->getProductName($product_id),
+							$nMengeAllowed
+						));
+																		
+					}
+					else
+					{
+				
+						$this->shop->addFrontendError(wpsg_translate(
+							__('Produkt "#1#" kann nicht mehr erworben werden.', 'wpsg'),
+							$this->shop->getProductName($product_id)
+						));
+						
+						return -2;
+						
+					}
+					 
+				}
+				
+			}
+			
+		} // public function basket_produkttosession($produkt_key, &$menge, &$ses_data)
+		
+		public function product_top_afterheadline($product_id, $template_index) 
+		{ 
+		
+			if (!$this->isFundingProduct($product_id)) return;
+			
+			$this->shop->view['wpsg_mod_funding'] = array(
+				'currentFundingCount' => $this->getCurrentFundingCount($product_id),
+				'maxFundingCount' => $this->getMaxFundingCount($product_id),
+				'stateLabel' => $this->arStateLabel[$this->getFundingState($product_id)]
+			);
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_funding/product_top_afterheadline.phtml');
+			
+		} // public function product_top_afterheadline($product_id, $template_index)
+		
+		public function wp_foot() 
+		{ 
+			
+			echo '<script type="text/javascript">/* <![CDATA[ */
+			
+				function wpsg_mod_funding_scroll()
+				{
+					
+					var scroll_y = jQuery(window).scrollTop();
+					
+					jQuery(".wpsg_mod_funding_state_value[data-wpsg-funding-width]").each(function() {
+					
+						if (scroll_y > jQuery(this).offset().top - jQuery(window).height())
+						{
+					
+							jQuery(this).animate( {
+								width: "+=" + jQuery(this).attr("data-wpsg-funding-width") + "%",
+							}, 750);	
+						
+							jQuery(this).removeAttr("data-wpsg-funding-width");
+						
+						}
+					
+					} );
+					
+				}
+					
+				jQuery(window).scroll(wpsg_mod_funding_scroll).ready(wpsg_mod_funding_scroll); 
+					
+			/* ]]> */</script>';
+			
+		} // public function wp_foot()
+		
+		public function produkt_edit_sidebar(&$produkt_data)
+		{
+		
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			$oProduct = wpsg_product::getInstance($produkt_data['id']);
+			
+			$this->shop->view['wpsg_mod_funding'] = array();
+			
+			if ($produkt_data['id'] > 0)
+			{
+		 
+				$this->shop->view['wpsg_mod_funding']['activ'] = $oProduct->getMeta('wpsg_mod_funding_activ');
+				$this->shop->view['wpsg_mod_funding']['limit'] = $oProduct->getMeta('wpsg_mod_funding_limit');
+				$this->shop->view['wpsg_mod_funding']['start'] = $oProduct->getMeta('wpsg_mod_funding_start');
+				$this->shop->view['wpsg_mod_funding']['end'] = $oProduct->getMeta('wpsg_mod_funding_end');
+				
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_funding/product_edit_sidebar.phtml');
+				
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		
+		public function produkt_save(&$produkt_id)
+		{
+			
+			if (wpsg_isSizedInt($_REQUEST['wpsg_mod_funding_save']))
+			{
+				
+				$oProduct = wpsg_product::getInstance($produkt_id);
+				
+				foreach ($_REQUEST['wpsg_mod_funding'] as $k => $v)
+				{
+					
+					$oProduct->setMeta('wpsg_mod_funding_'.$k, $v);
+					
+				}
+							
+			}
+			
+		} // public function produkt_save(&$produkt_id)
+				
+		/* Modulfunktionen */
+		
+		/**
+		 * Gibt den Status der Finanzierung zurÃŒck
+		 */
+		public function getFundingState($product_id)
+		{
+			
+			$oProduct = wpsg_product::getInstance($product_id);
+			
+			$nCurrentFunding = $this->getCurrentFundingCount($product_id);
+			$nMaxFunding = $this->getMaxFundingCount($product_id);
+			$start = strtotime($oProduct->getMeta('wpsg_mod_funding_start'));
+			$end = strtotime($oProduct->getMeta('wpsg_mod_funding_end'));
+			
+			if ($nCurrentFunding >= $nMaxFunding) return self::STATE_COMPLETED;			
+			if ($end > 0 && time() > $end) return self::STATE_CLOSED;
+			if (time() > $start) return self::STATE_RUNNING;
+			
+			return self::STATE_NOTSTARTET;
+			
+			
+		} // public function getFundingState($product_id)
+		
+		/**
+		 * Gibt true zurÃŒck, wenn das Produkt ein Finanzierungsprodukt ist 
+		 * @param Int $product_id
+		 */
+		public function isFundingProduct($product_id)
+		{
+			
+			$oProduct = wpsg_product::getInstance($product_id);
+			
+			if (wpsg_isSizedInt($oProduct->getMeta('wpsg_mod_funding_activ')) && wpsg_isSizedInt($oProduct->getMeta('wpsg_mod_funding_limit'))) return true;
+			else return false;
+			
+		} // public function isFundingProduct($product_id)
+		
+		/**
+		 * Gibt die derzeitigen KÃ€ufe eines Produktes zurÃŒck
+		 * @param unknown $product_id
+		 */
+		public function getCurrentFundingCount($product_id)
+		{
+			
+			$oProduct = wpsg_product::getInstance($product_id);
+			
+			$arFilter = array('product_id' => $product_id, 'NOTstatus' => array(wpsg_ShopController::STATUS_UNVOLLSTAENDIG, wpsg_ShopController::STATUS_STORNIERT));
+			if (strtotime($oProduct->getMeta('wpsg_mod_funding_start')) > 0) $arFilter['cdate_from'] = strtotime($oProduct->getMeta('wpsg_mod_funding_start')); 
+			
+			$arOrder = wpsg_order::find($arFilter);
+			$nSum = 0;
+			
+			foreach ($arOrder as $oOrder)
+			{
+				
+				$nSum += $oOrder->getProductCount($product_id);
+								
+			}
+			
+			return $nSum;
+			
+		} // public function getCurrentFundingCount($product_id)
+		
+		/**
+		 * Gibt die maximale Anzahl an KÃ€ufen fÃŒr ein Produkt zurÃŒck
+		 * @param unknown $product_id
+		 */
+		public function getMaxFundingCount($product_id)
+		{
+			
+			$oProduct = wpsg_product::getInstance($product_id);
+			
+			return $oProduct->getMeta('wpsg_mod_funding_limit');
+			
+		} // public function getMaxFundingCount($product_id)
+		
+	} // class wpsg_mod_funding extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_giropay.class.php
===================================================================
--- /mods/wpsg_mod_giropay.class.php	(revision 8528)
+++ /mods/wpsg_mod_giropay.class.php	(revision 5261)
@@ -28,7 +28,5 @@
 			//$this->shop->checkDefault('wpsg_mod_giropay_currency', 'EUR');
 			$this->shop->checkDefault('wpsg_mod_giropay_subject', 'O%order_id% - K%kunde_id%');
-
-            if ($this->shop->get_option('wpsg_mod_giropay_successPage') === false) $this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_giropay_successPage', -1);
-            if ($this->shop->get_option('wpsg_mod_giropay_errorPage') === false) $this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_giropay_errorPage', -1);
+			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_giropay_successPage', $_REQUEST['wpsg_mod_giropay_successPage']);
 						
 			$this->shop->checkDefault('wpsg_mod_giropay_giropay_name', __('GiroCheckout - giropay', 'wpsg'), false, true);
@@ -42,5 +40,5 @@
 			
 		} // public function install()
-
+		
 		public function settings_edit()
 		{
@@ -66,114 +64,196 @@
 		{
 			
-		    $this->shop->update_option('wpsg_mod_giropay_merchantId', $_REQUEST['wpsg_mod_giropay_merchantId'], false, false, WPSG_SANITIZE_TEXTFIELD);
+			$this->shop->update_option('wpsg_mod_giropay_merchantId', $_REQUEST['wpsg_mod_giropay_merchantId']);
 			//$this->shop->update_option('wpsg_mod_giropay_currency', $_REQUEST['wpsg_mod_giropay_currency']);
-			$this->shop->update_option('wpsg_mod_giropay_paystart', $_REQUEST['wpsg_mod_giropay_paystart'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_giropay_subject', $_REQUEST['wpsg_mod_giropay_subject'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_giropay_successPage', wpsg_xss($_REQUEST['wpsg_mod_giropay_successPage']));
-			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_giropay_errorPage', wpsg_xss($_REQUEST['wpsg_mod_giropay_errorPage']));
+			$this->shop->update_option('wpsg_mod_giropay_paystart', $_REQUEST['wpsg_mod_giropay_paystart']);
+			$this->shop->update_option('wpsg_mod_giropay_subject', $_REQUEST['wpsg_mod_giropay_subject']);
+			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_giropay_successPage', $_REQUEST['wpsg_mod_giropay_successPage']);
+			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_giropay_errorPage', $_REQUEST['wpsg_mod_giropay_errorPage']);
 						
 			// DirektÃŒberweisung
-			$this->shop->update_option('wpsg_mod_giropay_giropay_activ', $_REQUEST['wpsg_mod_giropay_giropay_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_giropay_giropay_projectid', $_REQUEST['wpsg_mod_giropay_giropay_projectid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_giropay_projectpw', $_REQUEST['wpsg_mod_giropay_giropay_projectpw'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_giropay_giropay_name', $_REQUEST['wpsg_mod_giropay_giropay_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_giropay_hint', $_REQUEST['wpsg_mod_giropay_giropay_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->addTranslationString('wpsg_mod_giropay_giropay_name', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_giropay_giropay_name']));
-			$this->shop->addTranslationString('wpsg_mod_giropay_giropay_hint', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_giropay_giropay_hint']));
-			
-			$this->shop->update_option('wpsg_mod_giropay_giropay_logo', $_REQUEST['wpsg_mod_giropay_giropay_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_giropay_gebuehr', $_REQUEST['wpsg_mod_giropay_giropay_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_giropay_giropay_mwst', $_REQUEST['wpsg_mod_giropay_giropay_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_giropay_giropay_mwstland', $_REQUEST['wpsg_mod_giropay_giropay_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_activ', $_REQUEST['wpsg_mod_giropay_giropay_activ']);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_projectid', $_REQUEST['wpsg_mod_giropay_giropay_projectid']);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_projectpw', $_REQUEST['wpsg_mod_giropay_giropay_projectpw']);
+			
+			$this->shop->update_option('wpsg_mod_giropay_giropay_name', $_REQUEST['wpsg_mod_giropay_giropay_name']);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_hint', $_REQUEST['wpsg_mod_giropay_giropay_hint']);
+			
+			$this->shop->addTranslationString('wpsg_mod_giropay_giropay_name', $_REQUEST['wpsg_mod_giropay_giropay_name']);
+			$this->shop->addTranslationString('wpsg_mod_giropay_giropay_hint', $_REQUEST['wpsg_mod_giropay_giropay_hint']);
+			
+			$this->shop->update_option('wpsg_mod_giropay_giropay_logo', $_REQUEST['wpsg_mod_giropay_giropay_logo']);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_gebuehr', $_REQUEST['wpsg_mod_giropay_giropay_gebuehr']);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_mwst', $_REQUEST['wpsg_mod_giropay_giropay_mwst']);
+			$this->shop->update_option('wpsg_mod_giropay_giropay_mwstland', $_REQUEST['wpsg_mod_giropay_giropay_mwstland']);
 			
 			// Kreditkarte
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_activ', $_REQUEST['wpsg_mod_giropay_creditcard_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_projectid', $_REQUEST['wpsg_mod_giropay_creditcard_projectid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_projectpw', $_REQUEST['wpsg_mod_giropay_creditcard_projectpw'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_name', $_REQUEST['wpsg_mod_giropay_creditcard_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_hint', $_REQUEST['wpsg_mod_giropay_creditcard_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->addTranslationString('wpsg_mod_giropay_creditcard_name', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_giropay_creditcard_name']));
-			$this->shop->addTranslationString('wpsg_mod_giropay_creditcard_hint', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_giropay_creditcard_hint']));
-			
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_logo', $_REQUEST['wpsg_mod_giropay_creditcard_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_gebuehr', $_REQUEST['wpsg_mod_giropay_creditcard_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_mwst', $_REQUEST['wpsg_mod_giropay_creditcard_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_giropay_creditcard_mwstland', $_REQUEST['wpsg_mod_giropay_creditcard_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_activ', $_REQUEST['wpsg_mod_giropay_creditcard_activ']);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_projectid', $_REQUEST['wpsg_mod_giropay_creditcard_projectid']);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_projectpw', $_REQUEST['wpsg_mod_giropay_creditcard_projectpw']);
+			
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_name', $_REQUEST['wpsg_mod_giropay_creditcard_name']);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_hint', $_REQUEST['wpsg_mod_giropay_creditcard_hint']);
+			
+			$this->shop->addTranslationString('wpsg_mod_giropay_creditcard_name', $_REQUEST['wpsg_mod_giropay_creditcard_name']);
+			$this->shop->addTranslationString('wpsg_mod_giropay_creditcard_hint', $_REQUEST['wpsg_mod_giropay_creditcard_hint']);
+			
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_logo', $_REQUEST['wpsg_mod_giropay_creditcard_logo']);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_gebuehr', $_REQUEST['wpsg_mod_giropay_creditcard_gebuehr']);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_mwst', $_REQUEST['wpsg_mod_giropay_creditcard_mwst']);
+			$this->shop->update_option('wpsg_mod_giropay_creditcard_mwstland', $_REQUEST['wpsg_mod_giropay_creditcard_mwstland']);
 			
 			// Lastschrift
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_activ', $_REQUEST['wpsg_mod_giropay_directdebit_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_projectid', $_REQUEST['wpsg_mod_giropay_directdebit_projectid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_projectpw', $_REQUEST['wpsg_mod_giropay_directdebit_projectpw'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_name', $_REQUEST['wpsg_mod_giropay_directdebit_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_hint', $_REQUEST['wpsg_mod_giropay_directdebit_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->addTranslationString('wpsg_mod_giropay_directdebit_name', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_giropay_directdebit_name']));
-			$this->shop->addTranslationString('wpsg_mod_giropay_directdebit_hint', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_giropay_directdebit_hint']));
-			
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_logo', $_REQUEST['wpsg_mod_giropay_directdebit_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_gebuehr', $_REQUEST['wpsg_mod_giropay_directdebit_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_mwst', $_REQUEST['wpsg_mod_giropay_directdebit_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_giropay_directdebit_mwstland', $_REQUEST['wpsg_mod_giropay_directdebit_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_activ', $_REQUEST['wpsg_mod_giropay_directdebit_activ']);
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_projectid', $_REQUEST['wpsg_mod_giropay_directdebit_projectid']);
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_projectpw', $_REQUEST['wpsg_mod_giropay_directdebit_projectpw']);
+			
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_name', $_REQUEST['wpsg_mod_giropay_directdebit_name']);
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_hint', $_REQUEST['wpsg_mod_giropay_directdebit_hint']);
+			
+			$this->shop->addTranslationString('wpsg_mod_giropay_directdebit_name', $_REQUEST['wpsg_mod_giropay_directdebit_name']);
+			$this->shop->addTranslationString('wpsg_mod_giropay_directdebit_hint', $_REQUEST['wpsg_mod_giropay_directdebit_hint']);
+			
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_logo', $_REQUEST['wpsg_mod_giropay_directdebit_logo']);
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_gebuehr', $_REQUEST['wpsg_mod_giropay_directdebit_gebuehr']);
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_mwst', $_REQUEST['wpsg_mod_giropay_directdebit_mwst']);
+			$this->shop->update_option('wpsg_mod_giropay_directdebit_mwstland', $_REQUEST['wpsg_mod_giropay_directdebit_mwstland']);
+			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_giropay_successPage'));
-            wp_delete_post($this->shop->get_option('wpsg_mod_giropay_errorPage'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function addPayment(&$arPayment) {
-			
-			if (is_admin() || $this->shop->get_option('wpsg_mod_giropay_giropay_activ') == '1') {
+		
+		public function addPayment(&$arPayment)
+		{
+			
+			if (is_admin() || $this->shop->get_option('wpsg_mod_giropay_giropay_activ') == '1')
+			{
+				
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_giropay_giropay_mwst'), $this->shop->getDefaultCountry());
 				
 				$arPayment[$this->id.'_1'] = array(
-					'id' => $this->id.'_1',
-					'name' => __($this->shop->get_option('wpsg_mod_giropay_giropay_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_giropay_giropay_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_giropay_giropay_mwst'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_giropay_giropay_mwstland'),
-					'hint' => __($this->shop->get_option('wpsg_mod_giropay_giropay_hint')),
-					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_giropay_giropay_logo')))?$this->shop->get_option('wpsg_mod_giropay_giropay_logo'):$this->shop->getRessourceURL('mods/mod_giropay/gfx/logo_100x25.png'))
+						'id' => $this->id.'_1',
+						'name' => __($this->shop->get_option('wpsg_mod_giropay_giropay_name'), 'wpsg'),
+						'preis' => $this->shop->get_option('wpsg_mod_giropay_giropay_gebuehr'),
+						'mwst' => $this->shop->get_option('wpsg_mod_giropay_giropay_mwst'),
+						'mwst_value' => $mwst_value,
+						'mwst_null' => $this->shop->get_option('wpsg_mod_giropay_giropay_mwstland'),
+						'hint' => __($this->shop->get_option('wpsg_mod_giropay_giropay_hint')),
+						'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_giropay_giropay_logo')))?$this->shop->get_option('wpsg_mod_giropay_giropay_logo'):$this->shop->getRessourceURL('mods/mod_giropay/gfx/gc_giropay.png')),
+						'logo_100x25' => $this->shop->getRessourceURL('mods/mod_giropay/gfx/logo_100x25.png')
 				);
-							
+				
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_giropay_giropay_gebuehr'), $mwst_value, $arPayment, $this->id.'_1');
+								
 			}
 			 
-			if (is_admin() || $this->shop->get_option('wpsg_mod_giropay_creditcard_activ') == '1') {
+			if (is_admin() || $this->shop->get_option('wpsg_mod_giropay_creditcard_activ') == '1')
+			{
+			
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_giropay_giropay_mwst'), $this->shop->getDefaultCountry());
 				
 				$arPayment[$this->id.'_2'] = array(
-					'id' => $this->id.'_2',
-					'name' => __($this->shop->get_option('wpsg_mod_giropay_creditcard_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_giropay_creditcard_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_giropay_creditcard_mwst'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_giropay_creditcard_mwstland'),
-					'hint' => __($this->shop->get_option('wpsg_mod_giropay_creditcard_hint')),
-					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_giropay_creditcard_logo')))?$this->shop->get_option('wpsg_mod_giropay_creditcard_logo'):$this->shop->getRessourceURL('mods/mod_giropay/gfx/logo_100x25.png'))
+						'id' => $this->id.'_2',
+						'name' => __($this->shop->get_option('wpsg_mod_giropay_creditcard_name'), 'wpsg'),
+						'preis' => $this->shop->get_option('wpsg_mod_giropay_creditcard_gebuehr'),
+						'mwst' => $this->shop->get_option('wpsg_mod_giropay_creditcard_mwst'),
+						'mwst_value' => $mwst_value,
+						'mwst_null' => $this->shop->get_option('wpsg_mod_giropay_creditcard_mwstland'),
+						'hint' => __($this->shop->get_option('wpsg_mod_giropay_creditcard_hint')),
+						'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_giropay_creditcard_logo')))?$this->shop->get_option('wpsg_mod_giropay_creditcard_logo'):$this->shop->getRessourceURL('mods/mod_giropay/gfx/gc_creditcard.png')),
+						'logo_100x25' => $this->shop->getRessourceURL('mods/mod_giropay/gfx/logo_100x25.png')
 				);
-						
-			}
-			
-			if (is_admin() || $this->shop->get_option('wpsg_mod_giropay_directdebit_activ') == '1') {
-			
+			
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_giropay_creditcard_gebuehr'), $mwst_value, $arPayment, $this->id.'_2');
+			
+			}
+			
+			if (is_admin() || $this->shop->get_option('wpsg_mod_giropay_directdebit_activ') == '1')
+			{
+			
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_giropay_giropay_mwst'), $this->shop->getDefaultCountry());
+				
 				$arPayment[$this->id.'_3'] = array(
-					'id' => $this->id.'_3',
-					'name' => __($this->shop->get_option('wpsg_mod_giropay_directdebit_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_giropay_directdebit_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_giropay_directdebit_mwst'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_giropay_directdebit_mwstland'),
-					'hint' => __($this->shop->get_option('wpsg_mod_giropay_directdebit_hint')),
-					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_giropay_directdebit_logo')))?$this->shop->get_option('wpsg_mod_giropay_directdebit_logo'):$this->shop->getRessourceURL('mods/mod_giropay/gfx/logo_100x25.png'))
+						'id' => $this->id.'_3',
+						'name' => __($this->shop->get_option('wpsg_mod_giropay_directdebit_name'), 'wpsg'),
+						'preis' => $this->shop->get_option('wpsg_mod_giropay_directdebit_gebuehr'),
+						'mwst' => $this->shop->get_option('wpsg_mod_giropay_directdebit_mwst'),
+						'mwst_value' => $mwst_value,
+						'mwst_null' => $this->shop->get_option('wpsg_mod_giropay_directdebit_mwstland'),
+						'hint' => __($this->shop->get_option('wpsg_mod_giropay_directdebit_hint')),
+						'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_giropay_directdebit_logo')))?$this->shop->get_option('wpsg_mod_giropay_directdebit_logo'):$this->shop->getRessourceURL('mods/mod_giropay/gfx/gc_directdebit.png')),
+						'logo_100x25' => $this->shop->getRessourceURL('mods/mod_giropay/gfx/logo_100x25.png')
 				);
 			
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_giropay_directdebit_gebuehr'), $mwst_value, $arPayment, $this->id.'_3');
+			
 			}
 			
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket)
+		{
+		
+			if (preg_match('/^'.$this->id.'_\d+$/', $arBasket['checkout']['payment']))
+			{
+		
+				$subPayTyp = preg_replace('/^\d+_/', '', $arBasket['checkout']['payment']);
+		
+				switch ($subPayTyp)
+				{
+		
+					case '1': // Giropay
+		
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_giropay_giropay_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_giropay_giropay_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_giropay_giropay_mwst');
+		
+						break;
+		
+					case '2': // Kreditkarte
+		
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_giropay_creditcard_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_giropay_creditcard_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_giropay_creditcard_mwst');
+		
+						break;
+		
+					case '3': // Lastschrift
+		
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_giropay_directdebit_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_giropay_directdebit_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_giropay_directdebit_mwst');
+		
+						break; 
+		
+					default:
+		
+						$this->shop->throwErrorCode('3050_3');
+		
+				}
+		
+				if ($mwstland == '1' && $arBasket['noMwSt'])
+				{
+		
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+		
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+		
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $mwst);
+		
+				}
+		
+			}
+		
+		} // public function calcPayment(&$arBasket)
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -191,8 +271,5 @@
 				$this->shop->view['wpsg_mod_giropay']['logo'] = $this->shop->arPayment[$payment]['logo'];
 				$this->shop->view['wpsg_mod_giropay']['title'] = __('Mit giropay bezahlen', 'wpsg');
-				$this->shop->view['wpsg_mod_giropay']['payLink'] = $this->getPayLink($order_id, $project_id, $project_pw);
-
-				if (!wpsg_isSizedString($this->shop->view['wpsg_mod_giropay']['payLink'])) throw new \Exception($this->shop->view['wpsg_mod_giropay']['payLink']->error_msg);
-
+				$this->shop->view['wpsg_mod_giropay']['payLink'] = $this->getPayLink($order_id, $project_id, $project_pw);				
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_giropay/order_done.phtml');
 				
@@ -201,21 +278,19 @@
 		} // public function order_done(&$order_id, &$done_view)
 		
-		public function template_redirect()
+		public function wp_loaded()
 		{
 		
 			if ($_REQUEST['wpsg_plugin'] != 'wpsg_mod_giropay') return;
 			
-			$_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
-
 			if ($_REQUEST['confirm'] == 'giropay')
 			{
-
+				
 				// Bestellung heraussuchen
 				$order_id = preg_replace('/(^O)|(T\d+$)/', '', $_REQUEST['order_id']);
-
-				if (!wpsg_isSizedInt($order_id)) throw new \wpsg\Exception(__('Keine gÃŒltige Bestellung aus Request gefiltert', 'wpsg'));
-
+				
+				if (!wpsg_isSizedInt($order_id)) $this->shop->throwErrorCode('3050_2');
+				
 				$order = $this->shop->cache->loadOrderObject($order_id);
-
+				
 				list($project_id, $project_pw) = $this->getpassidfrompayment($order->getPaymentID());
 				
@@ -280,5 +355,5 @@
 				$order_id = preg_replace('/(^O)|(T\d+$)/', '', $_REQUEST['order_id']);
 				
-				if (!wpsg_isSizedInt($order_id)) throw new \wpsg\Exception(__('Keine gÃŒltige Bestellung aus Request gefiltert', 'wpsg'));
+				if (!wpsg_isSizedInt($order_id)) $this->shop->throwErrorCode('3050_2');
 				
 				$order = $this->shop->cache->loadOrderObject($order_id);
@@ -319,5 +394,5 @@
 			}
 			
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function mail_payment()
@@ -342,11 +417,8 @@
 				
 		/** Modul Funktionen */
-
+		
 		/**
 		 * Gibt den Zahlungslink fÃŒr eine neue Zahlung fÃŒr die Bestellung $order_id zurÃŒck
-		 *
 		 * @param Integer $order_id ID der Bestellung
-		 *
-		 * @return array|mixed|object
 		 */
 		public function getPayLink($order_id, $project_id, $project_pw)
@@ -467,5 +539,7 @@
 					break;
 			
-				default: throw new \wpsg\Exception(__('Es wurde versucht einen Zahlungslink fÃŒr eine ungÃŒltige Zahlungsart zu generieren', 'wpsg'));
+				default:
+			
+					$this->shop->throwErrorCode('3050_1');
 			
 			}
Index: /mods/wpsg_mod_gutschein.class.php
===================================================================
--- /mods/wpsg_mod_gutschein.class.php	(revision 8528)
+++ /mods/wpsg_mod_gutschein.class.php	(revision 5261)
@@ -4,12 +4,11 @@
 	 * Dieses Modul erlaubt die Erstellung und Verwendung von Gutscheinen
 	 */
-	class wpsg_mod_gutschein extends wpsg_mod_basic	{
-
-		var $id = 160;
+	class wpsg_mod_gutschein extends wpsg_mod_basic
+	{
+		
+		var $id = 160;		
 		var $lizenz = 1;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=455';
-
-        var $view = [];
-
+		
 		/**
 		 * Costructor
@@ -17,31 +16,30 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
-
+			
 			$this->name = __('Gutscheine', 'wpsg');
 			$this->group = __('Sonstiges', 'wpsg');
 			$this->desc = __('Erlaubt das Erstellen von Gutscheinen.', 'wpsg');
-
+						
 		} // public function __construct()
-
-		public function install()
-		{
-
+		
+		public function install() 
+		{ 
+ 	
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
 
 			/**
 			 * Tabelle fÃŒr die Gutscheine
-			 */
+			 */			
 			$sql = "CREATE TABLE ".WPSG_TBL_GUTSCHEIN." (
 		   		id mediumint(9) NOT NULL AUTO_INCREMENT,
 		   		code VARCHAR(255) NOT NULL,
-		   		coupon INT(1) NOT NULL COMMENT '1 bei Wertgutscheinen',
-		   		value DOUBLE(10,2) NOT NULL, 
+		   		value DOUBLE(10,2) NOT NULL,
 		   		o_id INT(11) NOT NULL,
 		   		calc_typ ENUM('w', 'p') NOT NULL,
 		   		cdate datetime NOT NULL,
 		   		start_date datetime NOT NULL,
-		   		end_date datetime NOT NULL,
+		   		end_date datetime NOT NULL, 
 		   		multi INT(11) NOT NULL,
 		   		comment TEXT NOT NULL,
@@ -57,161 +55,73 @@
 		   		KEY autocreate_product (autocreate_product)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-			dbDelta($sql);
-			
-			/** Tabelle fÃŒr die Zuordnung Bestellung <=> Gutschein */
-			$sql = "CREATE TABLE ".WPSG_TBL_ORDER_VOUCHER." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				create_time DATETIME NOT NULL,
-				edit_time DATETIME NOT NULL,
-				order_id INT(11) NOT NULL,
-				voucher_id INT(11) NOT NULL,
-				set_value VARCHAR(100) NOT NULL, 
-				sum_netto DOUBLE(10,2) NOT NULL,
-				sum_brutto DOUBLE(10,2) NOT NULL,
-				tax_key VARCHAR(10) NOT NULL,
-				bruttonetto INT(1) NOT NULL,
-				code VARCHAR(1000) NOT NULL,
-				coupon INT(1) NOT NULL,
-				PRIMARY KEY  (`id`),
-				KEY order_id (order_id),
-				KEY voucher_id (voucher_id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+			
 			dbDelta($sql);
 			
 			$this->shop->checkDefault('wpsg_mod_gutschein_size', '10');
 			$this->shop->checkDefault('wpsg_mod_gutschein_perPage', '25');
-			
-		} // public function install()
-
+						
+		} // public function install() 
+		
 		public function init()
 		{
-
-			// Modell einbinden
-			require_once(WPSG_PATH_MOD.'mod_gutschein/wpsg_voucher.php');
-
+			
 			$role_object = get_role('administrator');
 			$role_object->add_cap('wpsg_voucher');
-
+			
 		} // public function init()
-
-		public function dispatch() {
-
-			if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'add') {
-
+		
+		public function dispatch() 
+		{
+			
+			if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'add')
+			{
+				
 				$this->addAction();
-
-			} if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'edit') {
-
-                $this->editAction();
-
-            } else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'import') {
-
-				wpsg_checkNounce('Voucher','import'); 
+				
+			}
+			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'import')
+			{
 				
 				$this->importAction();
-
-			} else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'save') {
-
+				
+			}
+			else if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'save')
+			{
+				
 				$this->saveAction();
-
-			} else {
-
+				
+			}
+			else 
+			{
+				
 				$this->indexAction();
-
-			}
-
+				
+			}
+			
 		} // public function dispatch()
-
-		public function admin_setcapabilities() {
-
+		 
+		public function admin_setcapabilities() { 
+			
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/admin_setcapabilities.phtml');
-
+			
 		} // public function admin_setcapabilities()
-
-		public function wpsg_add_pages($default_page)
-		{
-
-			add_submenu_page($default_page, __("Gutscheine", "wpsg"), __("Gutscheine", "wpsg"), 'wpsg_voucher', 'wpsg-Voucher', array($this, 'dispatch'));
-
+		
+		public function wpsg_add_pages()
+		{
+						
+			add_submenu_page('wpsg-Admin', __("Gutscheine", "wpsg"), __("Gutscheine", "wpsg"), 'wpsg_voucher', 'wpsg-Voucher', array($this, 'dispatch'));
+			
 		} // public function wpsg_add_pages()
 		
-		public function calculation_fromSession(&$oCalculation, $product_done, $payship_done) { 
-
-			if ($product_done && $payship_done) {
-
-				if (isset($_SESSION['wpsg']['gs']) && wpsg_isSizedArray($_SESSION['wpsg']['gs'])) {
-					
-					foreach ($_SESSION['wpsg']['gs'] as $gs) {
-
-						$oVoucher = wpsg_voucher::getInstance($gs['id']);
-
-						if ($oVoucher->isUsabel()) {
-
-							if ($oVoucher->isCoupon()) {
-
-								$oCalculation->addCoupon($oVoucher->getFreeAmount(), $this->shop->getBackendTaxview(), '0', 1, $gs['code'], $gs['id']);
-								
-							} else {
-							
-								if ($gs['calc'] === 'p') $gs['value'] = $gs['value'].'%';
-								else $gs['value'] = $oVoucher->getFreeAmount();
-							
-								$oCalculation->addVoucher($gs['value'], $this->shop->getBackendTaxview(), '0', 1, $gs['code'], $gs['id']);
-								
-							}
-							
-						}
-						
-					}
-					 
-				}
-				
-			}
-			
-		}
-				
-		/*
-        public function editAction() {
-
-            $this->shop->view['mod_gutschein'] = array();
-
-            $oVoucher = wpsg_voucher::getInstance($_REQUEST['edit_id']);
-            
-            $this->shop->view['mod_gutschein']['value'] = $oVoucher->value;;
-            $this->shop->view['mod_gutschein']['calc'] = $oVoucher->calc_typ;;
-            $this->shop->view['mod_gutschein']['start'] = date('d.m.Y H:i:s', strtotime($oVoucher->start_date));
-            $this->shop->view['mod_gutschein']['end'] = date('d.m.Y H:i:s', strtotime($oVoucher->end_date));
-            $this->shop->view['mod_gutschein']['count'] = $oVoucher->count;
-            $this->shop->view['mod_gutschein']['gen'] = $oVoucher->gen;
-            $this->shop->view['mod_gutschein']['code'] = $oVoucher->code;
-            $this->shop->view['mod_gutschein']['comment'] = $oVoucher->comment;
-            $this->shop->view['mod_gutschein']['multi'] = $oVoucher->multi;
-            $this->shop->view['mod_gutschein']['minvalue'] = $oVoucher->minvalue;
-            $this->shop->view['mod_gutschein']['products'] = explode(',', $oVoucher->products);
-            $this->shop->view['mod_gutschein']['productgroups'] = explode(',', $oVoucher->productgroups);
-            $this->shop->view['edit_id'] = $_REQUEST['edit_id'];
-
-            if ($this->shop->hasMod('wpsg_mod_productgroups')) {
-
-                $this->shop->view['wpsg_mod_gutschein']['arProductGroups'] = $this->shop->callMod('wpsg_mod_productgroups', 'getAllProductGroups');
-
-            }
-            
-            $this->shop->view['wpsg_mod_gutschein']['arProducts'] = $this->shop->getAllProductsForSelect();
-
-            $this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/add.phtml');
-            
-        } */
-        
 		/**
 		 * Maske fÃŒr einen neuen Gutschein
-		 *
-		public function addAction() {
-
+		 */
+		public function addAction()
+		{
+			
 			$this->shop->view['mod_gutschein'] = array();
-
-			if (isset($_SESSION['wpsg']['mod_gutschein_error'])) {
+			
+			if (isset($_SESSION['wpsg']['mod_gutschein_error']))
+			{
 
 				$this->shop->view['mod_gutschein']['value'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_value'];
@@ -224,282 +134,40 @@
 				$this->shop->view['mod_gutschein']['comment'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_comment'];
 				$this->shop->view['mod_gutschein']['multi'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_multi'];
-				if (isset($_REQUEST['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_minvalue'])) $this->shop->view['mod_gutschein']['minvalue'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_minvalue'];
+				if (isset($_REQUEST['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_minvalue'])) $this->shop->view['mod_gutschein']['minvalue'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_minvalue'];				
 				if (isset($_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_products'])) $this->shop->view['mod_gutschein']['products'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_products'];
 				if (isset($_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_productgroups'])) $this->shop->view['mod_gutschein']['productgroups'] = $_SESSION['wpsg']['mod_gutschein_error']['wpsg_mod_gutschein_productgroups'];
-
+				
 				unset($_SESSION['wpsg']['mod_gutschein_error']);
-
-			} else {
-
+				
+			}
+			else
+			{
+				
 				$this->shop->view['mod_gutschein']['value'] = 10;
-				$this->shop->view['mod_gutschein']['calc'] = 'w';
+				$this->shop->view['mod_gutschein']['calc'] = 'w';				
 				$this->shop->view['mod_gutschein']['count'] = '1';
-				$this->shop->view['mod_gutschein']['multi'] = '0';
-				$this->shop->view['mod_gutschein']['productgroups'] = '-1';
-
-			}
-
+				$this->shop->view['mod_gutschein']['multi'] = '0';	
+				$this->shop->view['mod_gutschein']['productgroups'] = '-1';			
+				
+			}
+			
 			if ($this->shop->hasMod('wpsg_mod_productgroups'))
 			{
-
+				
 				$this->shop->view['wpsg_mod_gutschein']['arProductGroups'] = $this->shop->callMod('wpsg_mod_productgroups', 'getAllProductGroups');
-
-			}
-
-			$this->shop->view['wpsg_mod_gutschein']['arProducts'] = $this->shop->getAllProductsForSelect();
-
+				
+			}
+			
+			$this->shop->view['wpsg_mod_gutschein']['arProducts'] = $this->shop->getAllProductsForSelect();			
+			
 			if (!isset($this->shop->view['mod_gutschein']['start']) || !is_int($this->view['mod_gutschein']['start']) || $this->view['mod_gutschein']['start'] <= 0)
 				$this->shop->view['mod_gutschein']['start'] = wpsg_date('d.m.Y H:i');
-
+				
 			if (!isset($this->shop->view['mod_gutschein']['end']) || !is_int($this->view['mod_gutschein']['end']) || $this->view['mod_gutschein']['end'] <= 0)
 				$this->shop->view['mod_gutschein']['end'] = wpsg_date('d.m.').(wpsg_date('Y') + 1).' '.wpsg_date('H:i');
-
+			
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/add.phtml');
-
-		} // public function addAction() */
-		
-		public function be_ajax() {
-			
-			if (wpsg_isSizedString($_REQUEST['subaction'], 'addedit')) $this->be_ajax_addedit();
-			else if (wpsg_isSizedString($_REQUEST['subaction'], 'save')) $this->be_ajax_save();
-			else if (wpsg_isSizedString($_REQUEST['subaction'], 'delete')) $this->be_ajax_delete();
-			else if (wpsg_isSizedString($_REQUEST['subaction'], 'duplicate')) $this->be_ajax_duplicate();
-			
-			exit;
-			
-		}
-		
-		public function be_ajax_save() {
-			
-			$bError = false;
-			
-			parse_str($_REQUEST['form_data'], $form_data);
-			
-			try {
-				
-				if (!wpsg_checkInput($form_data['wpsg_mod_gutschein_start'], WPSG_SANITIZE_DATETIME)) throw new \Exception(__('Eingabefehler in Feld "GÃŒltig ab"', 'wpsg'));
-				if (!wpsg_checkInput($form_data['wpsg_mod_gutschein_end'], WPSG_SANITIZE_DATETIME)) throw new \Exception(__('Eingabefehler in Feld "GÃŒltig bis"', 'wpsg'));
-				if (!wpsg_isSizedInt($form_data['voucher_id']) && (!wpsg_checkInput($form_data['wpsg_mod_gutschein_count'], WPSG_SANITIZE_INT) || !wpsg_isSizedInt($form_data['wpsg_mod_gutschein_count']))) throw new \Exception(__('Eingabefehler in Feld "Menge"', 'wpsg'));
-				
-				$t_start = strtotime($form_data['wpsg_mod_gutschein_start']);
-				$t_end = strtotime($form_data['wpsg_mod_gutschein_end']);
-				
-				if ($t_start <= 0 || $t_end <= 0 || $t_end <= $t_start) throw new \Exception(__('Eingaben in "GÃŒltig ab" und "GÃŒltig bis" ÃŒberprÃŒfen.', 'wpsg'));
-				
-				if (!wpsg_checkInput($form_data['wpsg_mod_gutschein_value'], WPSG_SANITIZE_FLOAT) || wpsg_tf($form_data['wpsg_mod_gutschein_value']) <= 0) throw new \Exception(__('Eingaben im Feld "Wert" ÃŒberprÃŒfen.', 'wpsg'));
-				
-				if (!wpsg_checkInput($form_data['wpsg_mod_gutschein_comment'], WPSG_SANITIZE_TEXTAREA)) throw new \Exception(__('UngÃŒltige Eingaben im Feld "Kommentar"', 'wpsg'));
-				if (!wpsg_checkInput($form_data['wpsg_mod_gutschein_minvalue'], WPSG_SANITIZE_FLOAT)) throw new \Exception(__('UngÃŒltige Eingaben im Feld "Minimaler Warenwert"', 'wpsg'));
-				
-				if (
-					!wpsg_checkInput($form_data['wpsg_mod_gutschein_calc'], WPSG_SANITIZE_VALUES, ['p', 'w']) ||
-					!wpsg_checkInput($form_data['wpsg_mod_gutschein_multi'], WPSG_SANITIZE_CHECKBOX) ||
-					!wpsg_checkInput($form_data['wpsg_mod_gutschein_coupon'], WPSG_SANITIZE_CHECKBOX) ||
-					(isset($form_data['wpsg_mod_gutschein_productgroups']) && !wpsg_checkInput($form_data['wpsg_mod_gutschein_productgroups'], WPSG_SANITIZE_ARRAY_INT)) ||
-					(isset($form_data['wpsg_mod_gutschein_products']) && !wpsg_checkInput($form_data['wpsg_mod_gutschein_products'], WPSG_SANITIZE_ARRAY_INT)) || 
-					(isset($form_data['voucher_id']) && !wpsg_checkInput($form_data['voucher_id'], WPSG_SANITIZE_INT)) || 
-					(!isset($form_data['voucher_id']) && !wpsg_checkInput($form_data['wpsg_mod_gutschein_gen'], WPSG_SANITIZE_VALUES, ['0', '1']))
-				) throw new \Exception(__('Eingabevalidierungsfehler!', 'wpsg'));
-									
-				if (isset($form_data['voucher_id'])) {
-										
-					$this->db->UpdateQuery(WPSG_TBL_GUTSCHEIN, [
-						'code' => wpsg_q($form_data['wpsg_mod_gutschein_code']),
-						'coupon' => wpsg_q($form_data['wpsg_mod_gutschein_coupon']),
-						'value' => wpsg_q(wpsg_tf($form_data['wpsg_mod_gutschein_value'])),						
-						'calc_typ' => wpsg_q($form_data['wpsg_mod_gutschein_calc']),
-						'start_date' => wpsg_q(date('Y-m-d H:i:s', $t_start)),
-						'end_date' => wpsg_q(date('Y-m-d H:i:s', $t_end)),
-						'multi' => wpsg_q($form_data['wpsg_mod_gutschein_multi']),
-						'comment' => wpsg_q($form_data['wpsg_mod_gutschein_comment']),
-						'minvalue' => wpsg_q(wpsg_tf($form_data['wpsg_mod_gutschein_minvalue'])),
-						'productgroups' => wpsg_q(implode(',', wpsg_getArray($form_data['wpsg_mod_gutschein_productgroups']))),
-						'products' => wpsg_q(implode(',', wpsg_getArray($form_data['wpsg_mod_gutschein_products']))),
-					], " `id` = '".wpsg_q($form_data['voucher_id'])."' ");
-					
-					$this->shop->addBackendMessage(__('Gutschein erfolgreich gespeichert.', 'wpsg'));
-										
-				} else {
-					
-					$arProductGroups = array(); if (wpsg_isSizedArray($form_data['wpsg_mod_gutschein_productgroups'])) $arProductGroups = $form_data['wpsg_mod_gutschein_productgroups'];
-					$arProducts = array(); if (wpsg_isSizedArray($form_data['wpsg_mod_gutschein_products'])) $arProducts = $form_data['wpsg_mod_gutschein_products'];
-					
-					for ($i = 0; $i < $form_data['wpsg_mod_gutschein_count']; $i ++) {
-						
-						if ($form_data['wpsg_mod_gutschein_gen'] == '1') {
-														
-							if (!wpsg_checkInput($form_data['wpsg_mod_gutschein_code'], WPSG_SANITIZE_APIKEY)) throw new \Exception(__('UngÃŒltige Eingaben im Feld "Code"', 'wpsg'));
-							
-							$setCode = $form_data['wpsg_mod_gutschein_code'];
-							
-						} else {
-							
-							$setCode = false;
-							
-						}
-						
-						if ($form_data['wpsg_mod_gutschein_coupon'] === '1') $isCoupon = true;
-						else $isCoupon = false;
-						
-						$this->genGS(
-							wpsg_tf($form_data['wpsg_mod_gutschein_value']),
-							$form_data['wpsg_mod_gutschein_calc'],
-							$t_start,
-							$t_end,
-							$form_data['wpsg_mod_gutschein_multi'],
-							$this->shop->get_option('wpsg_mod_gutschein_size'),
-							$form_data['wpsg_mod_gutschein_comment'],
-							0,
-							0,
-							0,
-							$arProductGroups,
-							$arProducts,
-							wpsg_tf($form_data['wpsg_mod_gutschein_minvalue']),
-							$setCode,
-							$isCoupon
-						);
-						
-					}
-					
-					if ($form_data['wpsg_mod_gutschein_count'] > 1) {
-						
-						$this->shop->addBackendMessage(__('Gutscheine wurden erfolgreich angelegt.', 'wpsg'));
-						
-					} else {
-						
-						$this->shop->addBackendMessage(__('Gutschein wurde erfolgreich angelegt.', 'wpsg'));
-						
-					}
-					
-				}
-				
-			} catch (\Exception $e) {
-				
-				echo $e->getMessage(); exit;
-				
-			}
-						
-			echo "1"; exit;
-			
-		}
-		
-		/**
-		 * @throws Exception
-		 */
-		public function be_ajax_addedit() {
-			
-			if ($this->shop->hasMod('wpsg_mod_productgroups')) {
-				
-				$this->shop->view['wpsg_mod_gutschein']['arProductGroups'] = $this->shop->callMod('wpsg_mod_productgroups', 'getAllProductGroups');
-				
-			}
-
-			$this->shop->view['wpsg_mod_gutschein']['arProducts'] = $this->shop->getAllProductsForSelect(true);
-			
-			if (isset($_REQUEST['voucher_id'])) {
-				 
-				if (!wpsg_checkInput($_REQUEST['voucher_id'], WPSG_SANITIZE_INT)) throw new \Exception(__('Fehler in ÃŒbergebenenem Parameter!', 'wpsg'));
-				
-				$oVoucher = wpsg_voucher::getInstance($_REQUEST['voucher_id']);
-				
-				$this->shop->view['edit_id'] = $oVoucher->getId();
-				$this->shop->view['mod_gutschein'] = [					
-					'value' => $oVoucher->__get('value'),
-					'coupon' => $oVoucher->__get('coupon'),
-					'calc' => $oVoucher->__get('calc_typ'),
-					'start' => date('d.m.Y', strtotime($oVoucher->start_date)),
-					'end' => date('d.m.Y', strtotime($oVoucher->end_date)),
-					'code' => $oVoucher->__get('code'),
-					'minvalue' => $oVoucher->__get('minvalue'),
-					'multi' => $oVoucher->__get('multi'),
-					'comment' => $oVoucher->__get('comment'),
-					'productgroups' => explode(',', $oVoucher->__get('productgroups')),
-					'products' => explode(',', $oVoucher->__get('products')),
-				];
-				
-			}
-			
-			$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/add.phtml');
-			
-		}
-		
-		public function be_ajax_delete() {
-			
-			if (!wpsg_checkInput($_REQUEST['voucher_id'], WPSG_SANITIZE_INT)) throw new \Exception(__('Parameterfehler'));
-			
-			$oVoucher = wpsg_voucher::getInstance(intval($_REQUEST['voucher_id']));
-			$oVoucher->delete();
-			
-			$this->shop->addBackendMessage(__('Gutschein wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher');
-			
-		}
-		
-		public function be_ajax_duplicate() {
-
-			if (!isset($_POST['wpsg_voucher_clone_dialog']) || !wp_verify_nonce($_POST['wpsg_voucher_clone_dialog'], 'wpsg_voucher_clone_dialog' ) ) {
-
-				$this->shop->addBackendError(__('Fehler beim Duplizieren des Gutscheins!', 'wpsg'));
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=index'); exit;
-
-			}
-
-			$voucher_id = intval($_POST['voucher_id']);
-			$wpsg_mod_gutschein_clone_start = \sanitize_text_field($_REQUEST['wpsg_mod_gutschein_clone_start']);
-			$wpsg_mod_gutschein_clone_end = \sanitize_text_field($_REQUEST['wpsg_mod_gutschein_clone_end']);
-			$wpsg_mod_gutschein_clone_count = intval($_REQUEST['wpsg_mod_gutschein_clone_count']??1);
-			$wpsg_mod_gutschein_clone_comment = \sanitize_text_field($_REQUEST['wpsg_mod_gutschein_clone_comment']??'');
-
-			$oVoucher = wpsg_voucher::getInstance($voucher_id);
-
-			$productgroups = [];
-			$products = [];
-
-			$pgStr = $oVoucher->__get('productgroups');
-			$prStr = $oVoucher->__get('products');
-
-			if (wpsg_isSizedString($pgStr)) {
-
-				foreach (explode(',', $pgStr) as $id) { if (wpsg_isSizedInt($id)) $productgroups[] = intval($id); }
-
-			}
-
-			if (wpsg_isSizedString($prStr)) {
-
-				foreach (explode(',', $prStr) as $id) { if (wpsg_isSizedInt($id)) $products[] = intval($id); }
-
-			}
-
-			$start_date = DateTime::createFromFormat('d.m.Y', $wpsg_mod_gutschein_clone_start)->getTimestamp();
-			$end_date = DateTime::createFromFormat('d.m.Y', $wpsg_mod_gutschein_clone_end)->getTimestamp();
-
-			for ($i = 1; $i <= $wpsg_mod_gutschein_clone_count; $i ++) {
-
-				$code = $this->genGS(
-					$oVoucher->__get('value'),
-					$oVoucher->__get('calc_typ'),
-					$start_date,
-					$end_date,
-					$oVoucher->__get('multi'),
-					$this->shop->get_option('wpsg_mod_gutschein_size'),
-					$wpsg_mod_gutschein_clone_comment,
-					$oVoucher->__get('autocreate_order'),
-					$oVoucher->__get('autocreate_product'),
-					$oVoucher->__get('autocreate_order_product'),
-					$productgroups,
-					$products,
-					$oVoucher->__get('minvalue'),
-					false,
-					($oVoucher->__get('coupon') == '1')
-				);
-
-			}
-
-			if ($wpsg_mod_gutschein_clone_count === 1) $this->shop->addBackendMessage(wpsg_translate(__('Gutschein erfolgreich dupliziert. Neuer Code: #1#', 'wpsg'), $code));
-			else $this->shop->addBackendMessage(wpsg_translate(__('Gutscheine erfolgreich dupliziert.', 'wpsg'), $code));
-
-			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=index');
-
-		}
+			
+		} // public function addAction()
 		
 		/**
@@ -508,83 +176,82 @@
 		public function importAction()
 		{
-
+			
 			if (isset($_REQUEST['submit']))
 			{
-
+					
 				// Datei angegeben?
 				if (!file_exists($_FILES['wpsg_file']['tmp_name']) || !preg_match('/(.*)\.csv$/i', $_FILES['wpsg_file']['name']))
 				{
-
+						
 					$this->shop->addBackendError(__('Bitte eine CSV Datei angeben!', 'wpsg'));
 					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=import');
-
-				}
-
+						
+				}
+			
 				$arData = array();
-
+			
 				if (($handle = fopen($_FILES['wpsg_file']['tmp_name'], "r")) !== false)
 				{
-
+						
 					while (($data = fgetcsv($handle, 1000, ";")) !== false)
 					{
-
+						 
 						$arData[] = $data;
-
-					}
-
+			
+					}
+			
 					fclose($handle);
-
-				}
-
+			
+				}
+			
 				if (!wpsg_isSizedArray($arData))
 				{
-
+						
 					$this->shop->addBackendError(__('CSV Datei konnte nicht geladen werden!', 'wpsg'));
 					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=import');
-
-				}
-
+						
+				}
+								
 				// Spalten identifizieren
-				$arData[0][0] = wpsg_removeBOM($arData[0][0]);
 				$arCol = array_flip($arData[0]);
 				$arColPflicht = array('code', 'value', 'start_date', 'end_date');
 				$bColError = false;
-
+				
 				foreach ($arColPflicht as $v)
 				{
-
+				
 					if (!isset($arCol[$v]))
 					{
-
+					
 						$this->shop->addBackendError(wpsg_translate(
 							__('CSV Datei ungÃŒltig. (Spalte "#1#" muss vorhanden sein)', 'wpsg'),
 							$v)
 						);
-
+						
 						$bColError = true;
-
-					}
-
-				}
-
+					
+					}
+					
+				}
+				
 				if ($bColError === true)
 				{
-
+					
 					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=import');
-
-				}
-
+					
+				}
+				
 				$nImport = 0;
-
+				 				
 				// Daten importieren / Erste Zeile sind die SchlÃŒssel
 				for ($i = 1; $i < sizeof($arData); $i ++)
 				{
-
+					
 					// Leere Zeilen ÃŒberspringen
 					if (!wpsg_isSizedArray($arData[$i])) continue;
-
+					
 					if (!preg_match('/\d{4}\-\d{2}\-\d{2}\040\d{2}\:\d{2}\:\d{2}/', $arData[$i][$arCol['start_date']]))
 					{
-
+												
 						$this->shop->addBackendError(wpsg_translate(
 							__('Spalte "#1#" in Zeile #2# enthÃ€lt kein gÃŒltiges Datum -> Zeile wurde ÃŒbersprungen', 'wpsg'),
@@ -592,12 +259,12 @@
 							$i + 1)
 						);
-
+						
 						continue;
-
-					}
-
+						
+					} 
+					
 					if (!preg_match('/\d{4}\-\d{2}\-\d{2}\040\d{2}\:\d{2}\:\d{2}/', $arData[$i][$arCol['end_date']]))
 					{
-
+					
 						$this->shop->addBackendError(wpsg_translate(
 							__('Spalte "#1#" in Zeile #2# enthÃ€lt kein gÃŒltiges Datum -> Zeile wurde ÃŒbersprungen', 'wpsg'),
@@ -605,56 +272,56 @@
 							$i + 1)
 						);
-
+						
 						continue;
-
-					}
-
+					
+					}
+					
 					if (strlen($arData[$i][$arCol['code']]) < $this->shop->get_option('wpsg_mod_gutschein_size'))
 					{
-
+						
 						$this->shop->addBackendError(wpsg_translate(
-							__('UngÃŒltiger Gutscheincode in Zeile #1# (zu Kurz) -> Zeile wurde ÃŒbersprungen', 'wpsg'),
+							__('UngÃŒltiger Gutscheincode in Zeile #1# (zu Kurz) -> Zeile wurde ÃŒbersprungen', 'wpsg'),		
 							$i + 1)
 						);
-
+						
 						continue;
-
-					}
-
+						
+					}
+					
 					if (doubleval($arData[$i][$arCol['value']]) <= 0)
 					{
-
+						
 						$this->shop->addBackendError(wpsg_translate(
 							__('UngÃŒltiger Gutscheinwert in Zeile #1# (kleiner gleich 0) -> Zeile wurde ÃŒbersprungen', 'wpsg'),
 							$i + 1)
 						);
-
+						
 						continue;
-
-					}
-
+						
+					}
+					
 					// Existiert schon ein Gutschein mit dem Code
 					$bExists = $this->db->fetchOne("SELECT G.`id` FROM `".WPSG_TBL_GUTSCHEIN."` AS G WHERE G.`code` = '".wpsg_q($arData[$i][$arCol['code']])."'");
-
+					
 					$doImport = false;
-
+					
 					if ($bExists > 0)
 					{
-
+						
 						// Existiert schon
 						if ($_REQUEST['gs_exists'] == '0')
 						{
-
+							
 							$this->shop->addBackendMessage(wpsg_translate(
-								__('Code aus Zeile #1# existierte schon und wurde ÃŒberschrieben.', 'wpsg'),
+								__('Code aus Zeile #1# existierte schon und wurde ÃŒberschrieben.', 'wpsg'),	
 								$i + 1)
 							);
-
+							
 							$doImport = true;
-
+							
 						}
 						else
 						{
-
+							
 							$this->shop->addBackendMessage(wpsg_translate(
 								__('Code (#1#) aus Zeile #2# existiert schon -> Zeile wurde ÃŒbersprungen.', 'wpsg'),
@@ -662,28 +329,28 @@
 								$i + 1)
 							);
-
+														
 						}
-
+						
 					}
 					else
 					{
-
+						
 						$nImport ++;
 						$doImport = true;
-
-					}
-
+						
+					}
+					
 					if ($doImport === true)
 					{
-
+						
 						if ($bExists > 0) $this->db->Query("DELETE FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `id` = '".wpsg_q($bExists)."'");
-
+						
 						$data = array(
-							'code' => wpsg_q(sanitize_text_field($arData[$i][$arCol['code']])),
+							'code' => wpsg_q($arData[$i][$arCol['code']]),
 							'value' => wpsg_q(wpsg_tf($arData[$i][$arCol['value']])),
 							'start_date' => wpsg_q($arData[$i][$arCol['start_date']]),
-							'end_date' => wpsg_q($arData[$i][$arCol['end_date']])
+							'end_date' => wpsg_q($arData[$i][$arCol['end_date']])								
 						);
-
+						
 						if ($arData[$i][$arCol['calc_typ']] == 'p') $data['calc_typ'] = 'p'; else $data['calc_typ'] = 'w';
 						if ($arData[$i][$arCol['multi']] == '1') $data['multi'] = '1'; else $data['multi'] = '0';
@@ -691,85 +358,162 @@
 						if (isset($arCol['productgroups']) && wpsg_isSizedString($arData[$i][$arCol['productgroups']])) $data['productgroups'] = $arData[$i][$arCol['productgroups']]; else $data['productgroups'] = '';
 						if (isset($arCol['comment']) && wpsg_isSizedString($arData[$i][$arCol['comment']])) $data['comment'] = $arData[$i][$arCol['comment']]; else $data['comment'] = '';
-
+	
 						$this->db->ImportQuery(WPSG_TBL_GUTSCHEIN, $data);
-
-					}
-
+						
+					}
+					
 				} // for data
-
+ 
 				if ($nImport == 1) $this->shop->addBackendMessage(__('Ein Gutschein erfolgreich importiert.', 'wpsg'));
 				else if ($nImport > 1) $this->shop->addBackendMessage(wpsg_translate(__('#1# Gutscheine erfolgreich importiert.', 'wpsg'), $nImport));
 				else $this->shop->addBackendMessage(__('Keine Gutscheine importiert.', 'wpsg'));
-
+					
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher');
-
-			}
-
+				
+			}
+			
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/import.phtml');
-
+			
 		} // public function importAction()
 		
-		public function mail_order_end(&$arCalculation, $html) {
-			
-			if ($arCalculation['sum']['topay_brutto'] !== $arCalculation['sum']['brutto'] && wpsg_isSizedArray($arCalculation['coupon'])) {
-				
-				if ($html) $this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/mail_order_end_html.phtml');
-				else $this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/mail_order_end.phtml');
-				
-			}
-			
-		}
-		
-		public function basket_row_end_coupon() {
-			
-			$arCalculation = &$this->shop->view['basket']['arCalculation'];
-			
-			if ($arCalculation['sum']['topay_brutto'] !== $arCalculation['sum']['brutto'] && wpsg_isSizedArray($arCalculation['coupon'])) {
-				
-				$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/basket_row_end_coupon.phtml');
-				
-			}
-			
-		}
-		
-		public function overview_row_end_coupon() {
-			
-			$arCalculation = &$this->shop->view['basket']['arCalculation'];
-			
-			if ($arCalculation['sum']['topay_brutto'] !== $arCalculation['sum']['brutto'] && wpsg_isSizedArray($arCalculation['coupon'])) {
-				
-				$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/overview_row_end_coupon.phtml');
-				
-			}
-			
-		}
-		
-		public function basket_row_end(&$basket_view)
-		{
-
+		/**
+		 * Speichert einen Gutschein
+		 */
+		public function saveAction()
+		{
+			
+			$bError = false;
+			$tStart = wpsg_fieldarray_todate($_REQUEST['wpsg_mod_gutschein_start']);
+			$tEnd = wpsg_fieldarray_todate($_REQUEST['wpsg_mod_gutschein_end']);
+			
+			// Validierung 
+			if ($_REQUEST['wpsg_mod_gutschein_count'] <= 0)
+			{
+				
+				$this->shop->addBackendError(__('Eingabe im Feld "Menge" ist ungÃŒltig.', 'wpsg'));
+				$bError = true;
+				
+			}
+						
+			if ($tStart <= 0)
+			{
+				
+				$this->shop->addBackendError(__('Eingabe im Feld "GÃŒltig ab" ÃŒberprÃŒfen.', 'wpsg'));
+				$bError = true;
+				
+			}
+			
+			if ($tEnd <= 0)
+			{
+				
+				$this->shop->addBackendError(__('Eingabe im Feld "GÃŒltig bis" ÃŒberprÃŒfen.', 'wpsg'));
+				$bError = true;
+				
+			}
+			
+			if ($_REQUEST['wpsg_mod_gutschein_value'] <= 0)
+			{
+				
+				$this->shop->addBackendError(__('Eingabe im Feld "Wert" ÃŒberprÃŒfen.', 'wpsg'));
+				$bError = true;
+				
+			}
+			
+			if ($bError)
+			{
+				
+				$_SESSION['wpsg']['mod_gutschein_error'] = wpsg_xss($_REQUEST);
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=add');
+				
+			}
+			else
+			{
+				 	
+				for ($i = 0; $j < $_REQUEST['wpsg_mod_gutschein_count']; $j ++)
+				{
+					
+					$arProductGroups = array(); if (wpsg_isSizedArray($_REQUEST['wpsg_mod_gutschein_productgroups'])) $arProductGroups = $_REQUEST['wpsg_mod_gutschein_productgroups'];
+					$arProducts = array(); if (wpsg_isSizedArray($_REQUEST['wpsg_mod_gutschein_products'])) $arProducts = $_REQUEST['wpsg_mod_gutschein_products'];
+					 			 
+					if ($_REQUEST['wpsg_mod_gutschein_gen'] == '1')
+					{
+						
+						$setCode = $_REQUEST['wpsg_mod_gutschein_code'];
+						
+					}
+					else
+					{
+						
+						$setCode = false;
+						
+					}
+					
+					$this->genGS(
+						wpsg_tf($_REQUEST['wpsg_mod_gutschein_value']), 
+						$_REQUEST['wpsg_mod_gutschein_calc'], 
+						$tStart, 
+						$tEnd, 
+						$_REQUEST['wpsg_mod_gutschein_multi'], 
+						$this->shop->get_option('wpsg_mod_gutschein_size'), 
+						$_REQUEST['wpsg_mod_gutschein_comment'],
+						0,
+						0,
+						0,
+						$arProductGroups,
+						$arProducts,						
+						$_REQUEST['wpsg_mod_gutschein_minvalue'],
+						$setCode
+					);
+					
+				}
+				
+				if ($_REQUEST['wpsg_mod_gutschein_count'] > 1)
+				{
+					$this->shop->addBackendMessage(__('Gutscheine wurden erfolgreich angelegt.', 'wpsg'));
+				}
+				else
+				{
+					$this->shop->addBackendMessage(__('Gutschein wurde erfolgreich angelegt.', 'wpsg'));
+				}
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=index');				
+				
+			}
+			
+		} // public function saveAction()
+						
+		public function basket_row_end(&$basket_view) 
+		{ 
+			
 			if ($this->shop->get_option('wpsg_mod_gutschein_hideInsert') == '1') return;
-
+			
 			$this->view['error'] = $basket_view['error'];
-
+			
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/basket_row_end.phtml');
-
+			
 		} // public function basket_row_end(&$basket)
 
-		public function basket_produkttosession($produkt_key, &$menge, &$ses_data) {
-
-			if (!isset($_SESSION['wpsg']['gs'][0]['id'])) return;
-
-			$gs_id = wpsg_getInt($_SESSION['wpsg']['gs'][0]['id']);
-
-			if (!wpsg_isSizedInt($gs_id)) return;
-
-			$gs_db = $this->db->fetchRow("SELECT G.`id`, G.`productgroups`, G.`products` FROM `".WPSG_TBL_GUTSCHEIN."` AS G WHERE G.`id` = '".wpsg_q($gs_id)."'");
-
-			$product_id = $this->shop->getProduktID($produkt_key);
-
+		public function basket_preInsert() 
+		{
+			
+			if (!wpsg_isSizedArray($_SESSION['wpsg']['gs'])) return;
+			
+			$gs_db = $this->db->fetchRow("SELECT G.`id`, G.`productgroups`, G.`products` FROM `".WPSG_TBL_GUTSCHEIN."` AS G WHERE G.`id` = '".wpsg_q($_SESSION['wpsg']['gs']['id'])."'");
+			
+			if ($gs_db['id'] != $_SESSION['wpsg']['gs']['id'])
+			{
+				
+				$this->shop->throwErrorCode('160_1');
+				return;
+				
+			}
+			
+			$product_id = $this->shop->getProduktID($_REQUEST['wpsg']['produkt_id']);
+			
 			$product_allowed = wpsg_explode(',', $gs_db['products']);
-
-			$temp = wpsg_explode(',', $gs_db['productgroups']);
-			if (wpsg_isSizedArray($temp)) {
+					
+			if (wpsg_isSizedArray(wpsg_explode(',', $gs_db['productgroups'])))
+			{
 
 				$ProductGroupIDs = wpsg_explode(',', $gs_db['productgroups']);
@@ -777,174 +521,227 @@
 					SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`pgruppe` IN (".wpsg_implode(',', $ProductGroupIDs).")
 				"));
-
-			}
-
+				
+			}
+			 
 			$product_allowed = wpsg_trim($product_allowed);
-
-			if (wpsg_isSizedArray($product_allowed) && !in_array($product_id, $product_allowed)) {
-
+			
+			if (wpsg_isSizedArray($product_allowed) && !in_array($product_id, $product_allowed))
+			{
+				
 				$product_data = $this->shop->loadProduktArray($product_id);
 				$this->shop->addFrontendError(wpsg_translate(__('Gutschein wurde entfernt, da er nicht mit Produkt #1# verwendet werden kann', 'wpsg'), $product_data['name']));
 				unset($_SESSION['wpsg']['gs']);
-
-				return false;
-
-			}
-
-		}
-
-		public function basket_preInsert() {
-
-			if (!isset($_SESSION['wpsg']['gs'][0]['id'])) return;
-
-			$gs_id = wpsg_getInt($_SESSION['wpsg']['gs'][0]['id']);
-
-			if (!wpsg_isSizedInt($gs_id)) return;
-
-			$gs_db = $this->db->fetchRow("SELECT G.`id`, G.`productgroups`, G.`products` FROM `".WPSG_TBL_GUTSCHEIN."` AS G WHERE G.`id` = '".wpsg_q($gs_id)."'");
-
-			if ($gs_db['id'] != $gs_id) throw new \Exception(__('In der Session befindet sich eine Gutschein ID, die es nicht in der Datenbank gibt', 'wpsg'));
-
-			$product_id = $this->shop->getProduktID($_REQUEST['wpsg']['produkt_id']);
-
-			$product_allowed = wpsg_explode(',', $gs_db['products']);
-
-			$temp = wpsg_explode(',', $gs_db['productgroups']);
-			if (wpsg_isSizedArray($temp)) {
-
-				$ProductGroupIDs = wpsg_explode(',', $gs_db['productgroups']);
-				$product_allowed = array_merge($product_allowed, $this->db->fetchAssocField("
-					SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`pgruppe` IN (".wpsg_implode(',', $ProductGroupIDs).")
-				"));
-
-			}
-
-			$product_allowed = wpsg_trim($product_allowed);
-
-			if (wpsg_isSizedArray($product_allowed) && !in_array($product_id, $product_allowed)) {
-
-				$product_data = $this->shop->loadProduktArray($product_id);
-				$this->shop->addFrontendError(wpsg_translate(__('Gutschein wurde entfernt, da er nicht mit Produkt #1# verwendet werden kann', 'wpsg'), $product_data['name']));
-				unset($_SESSION['wpsg']['gs']);
-
-			}
-
-		} // public function basket_preInsert()
-
-		public function basket_afterRemove() {
-
+				
+			}
+			
+		} // public function basket_preInsert() 
+
+		public function basket_afterRemove()
+		{
+			
 			$arBasket = $this->shop->cache->getShopBasketArray();
-
+			
 			$this->_checkBasket($this->shop->cache->getShopBasketArray());
-
+			
 		} // public function basket_afterRemove()
-
-		public function basket_afterUpdate(&$bError) {
-
+		
+		public function basket_afterUpdate(&$bError) 
+		{ 
+			
 			$this->_checkBasket($this->shop->cache->getShopBasketArray());
-
+						
 		} // public function basket_afterUpdate(&$bError)
 
-		public function checkCheckout(&$state, &$error, &$arCheckout)
-		{
+		public function checkCheckout(&$state, &$error, &$arCheckout) 
+		{ 
 
 			if (!$this->_checkBasket($this->shop->cache->getShopBasketArray())) $error = true;
-
+						
 		} // public function checkCheckout(&$state, &$error, &$arCheckout)
-
+		
 		/* Modulfunktionen */
- 
+		
+		/**
+		 * Gutscheinberechnung im Warenkorb
+		 */
+		public function basket_toArray_gs(&$basket, &$arReturn)
+		{
+			 		
+			// Analog Rabatt
+			
+			if ($basket->gs_value !== false)
+			{
+				
+				$arReturn['gs'] = array(
+					'value' => $basket->gs_value,
+					'calc' => $basket->gs_calc,
+					'code' => $basket->gs_code
+				);
+				
+				$gs_value = $basket->gs_value;
+				$gs_tax = 0;
+				
+				// Bruttopreis des Gutscheins bestimmen
+				if ($basket->gs_calc == 'p')
+				{
+											
+					$gs_value = $arReturn['sum']['preis_gesamt_brutto'] / 100 * $basket->gs_value;
+					
+					if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
+					{
+												 					
+						$gs_tax = $this->shop->subMwSt($arReturn, $gs_value);
+						
+					}
+											
+				}
+				else 
+				{
+					
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+					{
+						
+						if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
+						{
+						
+							$gs_tax = $this->shop->addMwSt($arReturn, $basket->gs_value);
+							 
+						} 
+						
+						$gs_value = $basket->gs_value + $gs_tax;
+						
+					}
+					else
+					{
+						
+						$gs_value = $basket->gs_value;
+						
+						if ($this->shop->get_option('wpsg_kleinunternehmer') != '1')
+						{
+							
+							$gs_tax = $this->shop->subMwSt($arReturn, $basket->gs_value);
+							
+						}
+						//die($gs_tax."=".$gs_value);
+					}
+										
+				}
+								 				 
+				$gs_brutto = $gs_value;
+				$gs_netto = $gs_value - $gs_tax; 
+ 				
+				$arReturn['sum']['preis_brutto'] -= $gs_brutto;
+				$arReturn['sum']['preis_netto'] -= $gs_netto;
+				$arReturn['sum']['preis_gesamt_brutto'] -= $gs_brutto;
+				$arReturn['sum']['preis_gesamt_netto'] -= $gs_netto;
+												
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+
+					$arReturn['sum']['gs'] = $gs_netto;
+					$arReturn['sum']['gs_netto'] = $gs_netto;
+					$arReturn['sum']['gs_brutto'] = $gs_brutto;
+					$arReturn['sum']['preis'] = $arReturn['sum']['preis_netto'];
+					$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_netto'];
+					
+				}
+				else if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO)
+				{
+					
+					$arReturn['sum']['gs'] = $gs_brutto;
+					$arReturn['sum']['gs_netto'] = $gs_netto;
+					$arReturn['sum']['gs_brutto'] = $gs_brutto;
+					$arReturn['sum']['preis'] = $arReturn['sum']['preis_brutto'];
+					$arReturn['sum']['preis_gesamt'] = $arReturn['sum']['preis_gesamt_brutto'];
+					
+				} 
+				 
+			} // gs_value 
+			
+		} // public function basket_toArray_gs(&$basket, &$arReturn)
+		
 		/**
 		 * PrÃŒft den Basket und entfernt den Gutschein, sollte irgendetwas nicht passen
 		 */
-		private function _checkBasket($arBasket) {
-
+		private function _checkBasket($arBasket)
+		{
+			
 			if (!wpsg_isSizedArray($arBasket['gs'])) return true;
-			//if (!wpsg_isSizedInt($_SESSION['wpsg']['gs']['id']))  throw new \wpsg\Exception(__('In der Session ist keine ID fÃŒr den Gutschein im Basket Array, sollte nicht passieren', 'wpsg'));
-
+			if (!wpsg_isSizedInt($_SESSION['wpsg']['gs']['id'])) { $this->shop->throwErrorCode('160_2'); return true; }			
+			
 			$gs_db = $this->db->fetchRow("SELECT G.`id`, G.`minvalue` FROM `".WPSG_TBL_GUTSCHEIN."` AS G WHERE G.`id` = '".wpsg_q($_SESSION['wpsg']['gs']['id'])."'");
 
-			if ($gs_db['id'] != $_SESSION['wpsg']['gs']['id']) throw new \wpsg\Exception(__('In der Session befindet sich eine Gutschein ID, die es nicht in der Datenbank gibt', 'wpsg'));
- 
-			if ($this->shop->get_option('wpsg_mod_discount_voucher') === '1' && $this->shop->callMod('wpsg_mod_discount', 'hasDiscount',[$arBasket])) {
-				
-				$this->shop->addFrontendError(wpsg_translate(__('Gutschein wurde entfernt, da ein Rabatt angewendet wurde.', 'wpsg')));
-				unset($_SESSION['wpsg']['gs']);
-				
-				return false;
-				
-			} 
-							
+			if ($gs_db['id'] != $_SESSION['wpsg']['gs']['id']) { $this->shop->throwErrorCode('160_1'); return true; }
+			
 			if (wpsg_tf($gs_db['minvalue']) > 0 && ($arBasket['sum']['preis'] + $arBasket['sum']['gs']) < $gs_db['minvalue'])
 			{
-
+				
 				$this->shop->addFrontendError(wpsg_translate(__('Gutschein wurde entfernt, da der Mindestbestellwert von #1# unterschritten wurden.', 'wpsg'), wpsg_ff($gs_db['minvalue'], $this->shop->get_option('wpsg_currency'))));
 				unset($_SESSION['wpsg']['gs']);
-
+				
 				return false;
-
-			}
-
+				
+			}
+			
 			return true;
-
+			 			
 		} // private function _checkBasket($arBasket)
-
+		
 		/**
 		 * Generiert einen Gutschein in der Datenbank
-		 *
-		 * @param double  $value              der Wert des Gutscheins
-		 * @param varchar $calc_typ           Typ 'p' = Prozentual, 'w' = Absoluter Wert
-		 * @param int     $tStart             Timestamp Start der GÃŒltigkeit
-		 * @param int     $tEnd               Timestamp Ende der GÃŒltigkeit
-		 * @param int     $multi              1 = Mehrfach, 0 = Einmalig
-		 * @param int     $laenge             LÃ€nge des Gutscheins
-		 * @param String  $comment            Kommentar
-		 * @param int     $autocreate_order   ID Der Bestellung aus der der Gutschein generiert wurde
-		 * @param int     $autocreate_product ID Des Produkts aus dem der Gutschein generiert wurde
+		 * 
+		 * @param double $value der Wert des Gutscheins
+		 * @param varchar $calc_typ Typ 'p' = Prozentual, 'w' = Absoluter Wert
+		 * @param int $tStart Timestamp Start der GÃŒltigkeit
+		 * @param int $tEnd Timestamp Ende der GÃŒltigkeit
+		 * @param int $multi 1 = Mehrfach, 0 = Einmalig
+		 * @param int $laenge LÃ€nge des Gutscheins
+		 * @param String $comment Kommentar
+		 * @param int $autocreate_order ID Der Bestellung aus der der Gutschein generiert wurde
+		 * @param int $autocreate_product ID Des Produkts aus dem der Gutschein generiert wurde
 		 * @param <int>Array $productgroups Array mit IDs von Produktgruppen fÃŒr die der Gutschein gÃŒltig ist
-		 * @param <int>Array $products Array mit IDs von Produkten fÃŒr die der Gutschein gÃŒltig ist
-		 *
+		 * @param <int>Array $products Array mit IDs von Produkten fÃŒr die der Gutschein gÃŒltig ist 
+		 * 
 		 * @return Der generierte Code
-		 * @throws \wpsg\Exception
 		 */
-		public function genGS($value, $calc_typ, $tStart, $tEnd, $multi, $laenge, $comment, $autocreate_order = 0, $autocreate_product = 0, $autocreate_order_product = 0, $productgroups = array(), $products = array(), $minValue = false, $code = false, $isCoupon = false)
-		{
-
+		public function genGS($value, $calc_typ, $tStart, $tEnd, $multi, $laenge, $comment, $autocreate_order = 0, $autocreate_product = 0, $autocreate_order_product, $productgroups = array(), $products = array(), $minValue = false, $code = false)
+		{
+			
 			$value = wpsg_tf($value);
-
+			
 			if (wpsg_isSizedString($code))
 			{
-
+				
 				$strCode = $code;
-
+				
 			}
 			else
 			{
-
+			 
 				$laenge = get_option('wpsg_mod_gutschein_size');
 				if ($laenge <= 0) $size = 10;
-
+				
 				$zeichen = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
-
+				
 				while (true)
 				{
-
+					 
 					$arCode = array();
-
+					
 					for ($i = 1; $i <= $laenge; $i++) { $arCode[] = $zeichen[rand(0, (strlen($zeichen) - 1))]; }
-
+					
 					$strCode = implode('', @$arCode);
-
+	
 					$bExists = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `code` = '".wpsg_q($strCode)."'");
-
+					
 					if ($bExists <= 0) break;
 					break;
-
-				}
-
-			}
-
+										
+				}
+				
+			}
+			
 			$this->db->ImportQuery(WPSG_TBL_GUTSCHEIN, array(
-				'code' => wpsg_q(sanitize_text_field($strCode)),
+				'code' => wpsg_q($strCode),
 				'value' => wpsg_q($value),
 				'minvalue' => wpsg_q(wpsg_tf($minValue)),
@@ -959,179 +756,255 @@
 				'autocreate_order_product' => wpsg_q($autocreate_order_product),
 				'productgroups' => wpsg_q(wpsg_implode(',', $productgroups)),
-				'products' => wpsg_q(wpsg_implode(',', $products)),
-				'coupon' => (($isCoupon === true)?'1':'0')
+				'products' => wpsg_q(wpsg_implode(',', $products))
 			));
-
+			 
 			return $strCode;
-
+			
 		} // public function genGS($value, $calc_typ, $tStart, $tEnd, $multi, $laenge)
-
+		
 		/**
 		 * Ist fÃŒr die Ãbersicht der Gutscheine zustÃ€ndig
 		 */
-		public function indexAction() {
-
-			$nPerPage = $this->shop->get_option('wpsg_mod_gutschein_perPage');
-			if ($nPerPage <= 0) $nPerPage = 25;
-
-			$this->shop->view['hasFilter'] = false;
-			$this->shop->view['arFilter'] = array(
-				'order' => 'cdate',
-				'ascdesc' => 'ASC',
-				'status' => '0',
-				'page' => '1'
-			);
-
-			$this->shop->view['arData'] = array();
-			$this->shop->view['pages'] = 1;
-
-			if (wpsg_isSizedArray($_REQUEST['filter'])) {
-
-				$this->shop->view['arFilter'] = wpsg_xss($_REQUEST['filter']);
-				$this->shop->view['hasFilter'] = true;
-
-			} else if (wpsg_isSizedArray($_SESSION['wpsg']['backend']['voucher']['arFilter'])) $this->shop->view['arFilter'] = $_SESSION['wpsg']['backend']['voucher']['arFilter'];
-
-			$this->shop->view['countAll'] = wpsg_voucher::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = $_REQUEST['seite'];
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if ($this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['voucher']['arFilter'] = $this->shop->view['arFilter'];
-
-			$this->shop->view['arStatus'] = array();
-			$this->shop->view['arStatus']['0']['label'] = __('Alle', 'wpsg');
-			$this->shop->view['arStatus']['1']['label'] = __('Aktiv', 'wpsg');
-			$this->shop->view['arStatus']['2']['label'] = __('Inaktiv', 'wpsg');
-			$this->shop->view['arStatus']['3']['label'] = __('Verbraucht', 'wpsg');
-			$this->shop->view['arStatus']['4']['label'] = __('Wartend', 'wpsg');
-			$this->shop->view['arStatus']['0']['count'] = '0';
-			$this->shop->view['arStatus']['1']['count'] = '0';
-			$this->shop->view['arStatus']['2']['count'] = '0';
-			$this->shop->view['arStatus']['3']['count'] = '0';
-			$this->shop->view['arStatus']['4']['count'] = '0';
-			
-			$this->shop->view['arData'] = wpsg_voucher::find($this->shop->view['arFilter']);
-						
-			$this->shop->view['arStatus']['0']['count'] = $this->shop->view['arData']['counts'][0];
-			$this->shop->view['arStatus']['1']['count'] = $this->shop->view['arData']['counts'][1];
-			$this->shop->view['arStatus']['2']['count'] = $this->shop->view['arData']['counts'][2];
-			$this->shop->view['arStatus']['3']['count'] = $this->shop->view['arData']['counts'][3];
-			$this->shop->view['arStatus']['4']['count'] = $this->shop->view['arData']['counts'][4];
-			
-			unset($this->shop->view['arData']['counts']);
-			
-			$arDataAll = $this->shop->view['arData'];
-			
-			if (isset($_REQUEST['wpshopgermany-submit-gs_del'])) {
-
-				if (sizeof($_REQUEST['wpsg_gs_cb']) > 0) {
-
+		public function indexAction()
+		{
+			 
+			if (isset($_REQUEST['wpshopgermany-submit-gs_del']))
+			{
+				
+				if (sizeof($_REQUEST['wpsg_gs_cb']) > 0)
+				{
+					
 					$this->db->Query("DELETE FROM `".WPSG_TBL_GUTSCHEIN."` WHERE `id` IN (".implode(",", array_values($_REQUEST['wpsg_gs_cb'])).")");
-
-				}
-
+					
+				}
+				
 				$this->shop->addBackendMessage(__('Gutscheine erfolgreich gelÃ¶scht.', 'wpsg'));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher');
-
+				
+			}
+			
+			// Suchstring aufbauen
+			$strQueryWHERE = "";
+			
+			$this->shop->view['filter'] = array(
+				'search' => ''
+			);
+			
+			if (isset($_REQUEST['wpsg_search']))
+			{
+				
+				$this->shop->view['filter']['search'] = $_REQUEST['wpsg_search'];
+				$strQueryWHERE .= " AND `code` LIKE '%".wpsg_q($_REQUEST['wpsg_search'])."%' ";
+				
 			} 
- 
-			
-			if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'export') {
-
-				$strCSV  = "code;value;start_date;end_date;comment;calc_typ;multi;products";
+			
+			// Gefilterten Status fÃŒr das View definieren
+			if (isset($_REQUEST['wpsg_status']) && $_REQUEST['wpsg_status'] >= 0)
+			{	
+				$this->shop->view['filter']['status'] = $_REQUEST['wpsg_status'];
+			}
+						
+			$strQueryORDER = '';
+				
+			if (!isset($_REQUEST['filter']['order']))
+			{
+			
+				$this->shop->view['filter']['order'] = 'id';
+			
+			}
+			else
+			{
+			
+				$this->shop->view['filter']['order'] = $_REQUEST['filter']['order'];
+			
+			}
+			
+			switch ($this->shop->view['filter']['order'])
+			{
+			  
+				case 'code': $strQueryORDER = "G.`code`"; break;
+				case 'start_date': $strQueryORDER = "G.`start_date`"; break;
+				case 'end_date': $strQueryORDER = "G.`end_date`"; break;
+				case 'value': $strQueryORDER = "G.`value`"; break;
+				default: $strQueryORDER = "G.`id`"; break;
+			
+			}
+			
+			if (!isset($_REQUEST['filter']['ascdesc']))
+			{
+			
+				$this->shop->view['filter']['ascdesc'] = 'asc';
+			
+			}
+			else
+			{
+			
+				$this->shop->view['filter']['ascdesc'] = $_REQUEST['filter']['ascdesc'];
+			
+			}
+			 
+			// Alle gefilterten holen
+			$arDataAll = $this->db->fetchAssoc("
+				SELECT
+					G.*
+				FROM
+					`".WPSG_TBL_GUTSCHEIN."` AS G
+				WHERE
+					1
+					".$strQueryWHERE."
+				ORDER BY 
+					".wpsg_q($strQueryORDER)." ".wpsg_q($this->shop->view['filter']['ascdesc'])."
+			");
+			 
+			$this->shop->view['arStatus'] = array();
+			$this->shop->view['countAll'] = sizeof($arDataAll);
+			
+			foreach ($arDataAll as $k => $v)
+			{
+					
+				$tStart = strtotime($v['start_date']);
+				$tEnd = strtotime($v['end_date']);
+
+				if ($tStart < wpsg_time() && $tEnd > wpsg_time())
+				{
+					$nStatus = 1; $strStatus = __('Aktiv', 'wpsg');
+				}
+				else if ($tStart > wpsg_time())
+				{
+					$nStatus = 2; $strStatus = __('Wartend', 'wpsg');
+				}
+				else if ($tEnd < wpsg_time())
+				{
+					$nStatus = 3; $strStatus = __('Ausgelaufen', 'wpsg');
+				}
+				else
+				{
+					
+					// Sollte eignetlich nich auftreten
+					$nStatus = 999; $strStatus = __('UngÃŒltig', 'wpsg');
+					
+				}
+				
+				if ($v['multi'] == '0' && $v['o_id'] > 0)
+				{
+					
+					$nStatus = 4; $strStatus = __('Verbraucht', 'wpsg');
+					
+				}
+				else
+				{
+					
+					$arDataAll[$k]['ordered'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` WHERE `gs_id` = '".wpsg_q($v['id'])."'");
+					
+				}
+				
+				if (array_key_exists($nStatus, $this->shop->view['arStatus']))
+				{
+					$this->shop->view['arStatus'][$nStatus][1] ++;
+				}
+				else 
+				{
+					$this->shop->view['arStatus'][$nStatus] = array($strStatus, 1);
+				}
+				
+				if (isset($this->shop->view['filter']['status']) && $this->shop->view['filter']['status'] > 0 && $nStatus != $this->shop->view['filter']['status'])
+				{
+					unset($arDataAll[$k]);
+				}
+				else
+				{					
+					$arDataAll[$k]['status'] = $strStatus;					
+				}
+				 
+			}
+			
+			if (isset($_REQUEST['wpsg_voucher_export']) && $_REQUEST['wpsg_voucher_export'] == '1')
+			{
+				
+				$strCSV  = "code;value;start_date;end_date;comment;calc_typ;multi;products";				
 				if ($this->shop->hasMod('wpsg_mod_productgroups')) $strCSV .= ";productgroups";
 				$strCSV .= "\r\n";
-
+				
 				$arData = array();
-
-				foreach ($arDataAll as $oVoucher) {
-
-					$d = $oVoucher->data;
+				
+				
+				
+				foreach ($arDataAll as $d)
+				{
 					
 					$strCSV .= $d['code'].';'.$d['value'].';'.$d['start_date'].';'.$d['end_date'].';'.$d['comment'].';'.$d['calc_typ'].';'.$d['multi'].';'.$d['products'];
-					if ($this->shop->hasMod('wpsg_mod_productgroups')) $strCSV .= ';'.$d['productgroups'];
+					if ($this->shop->hasMod('wpsg_mod_productgroups')) $strCSV .= ';'.$d['productgroups'];					
 					$strCSV .= "\r\n";
-
-				}
-
-				header("Content-Type: text/csv");
-				header("Content-Disposition: attachment; filename=gutscheine.csv");
-				header("Content-Description: csv File");
-				header("Pragma: no-cache");
-				header("Expires: 0");
-
-				echo $strCSV;
-				exit;
-
-			} 
- 
-			if (isset($_REQUEST['submit-multidelete'])) {
-
-				if (!wpsg_isSizedArray($_REQUEST['wpsg_multido'])) {
-
-					$this->shop->addBackendError(__('Bitte mindestens einen Gutschein auswÃ€hlen', 'wpsg'));
-
-				} else {
-
-					$nDelete = 0;
-
-					foreach ($_REQUEST['wpsg_multido'] as $k => $voucher_id) {
-
-						$oVoucher = wpsg_voucher::getInstance($voucher_id);
-						$oVoucher->delete();
-
-						$nDelete ++;
-
-					}
-
-					$this->shop->addBackendMessage(wpsg_translate(__('#1# Gutschein(e) wurden gelÃ¶scht.', 'wpsg'), $nDelete));
-
-				}
-
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=index');
-
-			}
-
+										
+				}
+		 
+				header("Content-Type: text/csv"); 
+				header("Content-Disposition: attachment; filename=gutscheine.csv"); 
+				header("Content-Description: csv File"); 
+				header("Pragma: no-cache"); 
+				header("Expires: 0"); 
+				
+				die($strCSV);
+				
+			}
+			
+			// Anzahl an Elementen
+			$this->shop->view['count'] = sizeof($arDataAll);
+			
+			// Pro Seite / Fallback auf 25 wenn was falsches eingegeben wurde
+			$perPage = ((intval($this->shop->get_option('wpsg_mod_gutschein_perPage')) > 0)?intval($this->shop->get_option('wpsg_mod_gutschein_perPage')):25);
+			
+			// Anzahl an Seiten
+			$this->shop->view['pages'] = ceil($this->shop->view['count'] / $perPage);
+			
+			// Seite bestimmen
+			if (isset($_REQUEST['seite']) && intval($_REQUEST['seite']) > 0) $this->shop->view['page'] = intval($_REQUEST['seite']); else $this->shop->view['page'] = 1;
+			
+			// Aktuele Seite aus den DatensÃ€tzen herausnehmen
+			$this->shop->view['data'] = array_splice($arDataAll, (($this->shop->view['page'] - 1) * $perPage), $perPage);
+			
+			if ($this->shop->view['filter']['order'] == 'status')
+			{
+				
+				wpsg_array_csort($this->shop->view['data'], 'status');
+				
+			}
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/index.phtml');
-
+			
 		} // public function indexAction()
-
+				
 		public function settings_edit()
 		{
-
+			
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_gutschein/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
-		public function settings_save() {
-
-			$this->shop->update_option('wpsg_mod_gutschein_size', $_REQUEST['wpsg_mod_gutschein_size'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_gutschein_perPage', $_REQUEST['wpsg_mod_gutschein_perPage'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_gutschein_one', $_REQUEST['wpsg_mod_gutschein_one'], false, false, WPSG_SANITIZE_CHECKBOX);
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_gutschein_size', $_REQUEST['wpsg_mod_gutschein_size']);
+			$this->shop->update_option('wpsg_mod_gutschein_perPage', $_REQUEST['wpsg_mod_gutschein_perPage']);
 			
 		} // public function settings_save()
- 
-		public function admin_presentation()
-		{
+				
+		public function admin_presentation() 
+		{ 
 
 			echo wpsg_drawForm_Checkbox('wpsg_mod_gutschein_hideInsert', __('Gutschein einfÃŒgen im Warenkorb verbergen', 'wpsg'), $this->shop->get_option('wpsg_mod_gutschein_hideInsert'), array('help' => 'wpsg_mod_gutschein_hideInsert'));
-
+			
 		} // public function admin_presentation()
-
-		public function admin_presentation_submit()
-		{
-
-			$this->shop->update_option('wpsg_mod_gutschein_hideInsert', $_REQUEST['wpsg_mod_gutschein_hideInsert'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+		
+		public function admin_presentation_submit() 
+		{ 
+			
+			$this->shop->update_option('wpsg_mod_gutschein_hideInsert', $_REQUEST['wpsg_mod_gutschein_hideInsert']);
+			
 		} // public function admin_presentation_submit()
-
+		
 		/* Modulfunktionen */
-
+			 
 	} // class wpsg_mod_gutschein extends wpsg_mod_basic
- 
+
+?>
Index: /mods/wpsg_mod_icp.class.php
===================================================================
--- /mods/wpsg_mod_icp.class.php	(revision 8528)
+++ /mods/wpsg_mod_icp.class.php	(revision 5261)
@@ -14,5 +14,12 @@
 		var $version = "9.9.9";
 		var $free = true;
-				
+		
+		var $curl_options = array(
+			CURLINFO_HEADER_OUT => true,
+			CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded;charset=UTF-8'),
+			CURLOPT_FOLLOWLOCATION => 0,
+			/*CURLOPT_SSL_VERIFYPEER => false*/
+		);
+		
 		var $api_url = array(
 			'generateToken' => array(
@@ -85,50 +92,86 @@
 		{
 		
-		    $this->shop->update_option('wpsg_mod_icp_sandbox', $_REQUEST['wpsg_mod_icp_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_icp_sender', $_REQUEST['wpsg_mod_icp_sender'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_icp_channelid', $_REQUEST['wpsg_mod_icp_channelid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_icp_userid', $_REQUEST['wpsg_mod_icp_userid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_icp_password', $_REQUEST['wpsg_mod_icp_password'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				
-			$this->shop->update_option('wpsg_mod_icp_activ', $_REQUEST['wpsg_mod_icp_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_icp_paymenttypes', $_REQUEST['wpsg_mod_icp_paymenttypes'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_icp_name', $_REQUEST['wpsg_mod_icp_name'], false, false, WPSG_SANITIZE_TEXTFIELD); $this->shop->addTranslationString('wpsg_mod_icp_name', wpsg_sinput("text_field", $_REQUEST['wpsg_mod_icp_name']));
-			$this->shop->update_option('wpsg_mod_icp_hint', $_REQUEST['wpsg_mod_icp_hint'], false, false, WPSG_SANITIZE_TEXTFIELD); $this->shop->addTranslationString('wpsg_mod_icp_hint', wpsg_sinput("text_field", $_REQUEST['wpsg_mod_icp_hint']));
-			$this->shop->update_option('wpsg_mod_icp_logo', $_REQUEST['wpsg_mod_icp_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_icp_language', $_REQUEST['wpsg_mod_icp_language'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_icp_gebuehr', $_REQUEST['wpsg_mod_icp_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_icp_mwst', $_REQUEST['wpsg_mod_icp_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_icp_mwstland', $_REQUEST['wpsg_mod_icp_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_icp_successPage', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_icp_successPage']));
-			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_icp_errorPage', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_icp_errorPage']));
+			$this->shop->update_option('wpsg_mod_icp_sandbox', $_REQUEST['wpsg_mod_icp_sandbox']);
+			$this->shop->update_option('wpsg_mod_icp_sender', $_REQUEST['wpsg_mod_icp_sender']);
+			$this->shop->update_option('wpsg_mod_icp_channelid', $_REQUEST['wpsg_mod_icp_channelid']);
+			$this->shop->update_option('wpsg_mod_icp_userid', $_REQUEST['wpsg_mod_icp_userid']);
+			$this->shop->update_option('wpsg_mod_icp_password', $_REQUEST['wpsg_mod_icp_password']);
+				
+			$this->shop->update_option('wpsg_mod_icp_activ', $_REQUEST['wpsg_mod_icp_activ']);
+			$this->shop->update_option('wpsg_mod_icp_paymenttypes', $_REQUEST['wpsg_mod_icp_paymenttypes']);
+			$this->shop->update_option('wpsg_mod_icp_name', $_REQUEST['wpsg_mod_icp_name']); $this->shop->addTranslationString('wpsg_mod_icp_name', $_REQUEST['wpsg_mod_icp_name']);
+			$this->shop->update_option('wpsg_mod_icp_hint', $_REQUEST['wpsg_mod_icp_hint']); $this->shop->addTranslationString('wpsg_mod_icp_hint', $_REQUEST['wpsg_mod_icp_hint']);
+			$this->shop->update_option('wpsg_mod_icp_logo', $_REQUEST['wpsg_mod_icp_logo']);
+			$this->shop->update_option('wpsg_mod_icp_language', $_REQUEST['wpsg_mod_icp_language']);
+			$this->shop->update_option('wpsg_mod_icp_gebuehr', $_REQUEST['wpsg_mod_icp_gebuehr']);
+			$this->shop->update_option('wpsg_mod_icp_mwst', $_REQUEST['wpsg_mod_icp_mwst']);
+			$this->shop->update_option('wpsg_mod_icp_mwstland', $_REQUEST['wpsg_mod_icp_mwstland']);
+				
+			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_icp_successPage', $_REQUEST['wpsg_mod_icp_successPage']);
+			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_icp_errorPage', $_REQUEST['wpsg_mod_icp_errorPage']);
 				
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_icp_successPage'));
-            wp_delete_post($this->shop->get_option('wpsg_mod_icp_errorPage'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function addPayment(&$arPayment) {
-		
-			if (is_admin() || $this->shop->get_option('wpsg_mod_icp_activ') == '1') {
-		
+		
+		public function addPayment(&$arPayment)
+		{
+		
+			if (is_admin() || $this->shop->get_option('wpsg_mod_icp_activ') == '1')
+			{
+		
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_icp_mwst'), $this->shop->getDefaultCountry());
+				
 				$arPayment[$this->id] = array(
 					'id' => $this->id,
 					'name' => __($this->shop->get_option('wpsg_mod_icp_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_icp_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_icp_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_icp_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_icp_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_icp_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_icp_hint'), 'wpsg'),
-					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_icp_logo')))?$this->shop->get_option('wpsg_mod_icp_logo'):$this->shop->getRessourceURL('mods/mod_icp/gfx/logo_100x25.png'))
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_icp_logo')))?$this->shop->get_option('wpsg_mod_icp_logo'):$this->shop->getRessourceURL('mods/mod_icp/gfx/icp.png'))
 				);
 		
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_icp_gebuehr'), $mwst_value, $arPayment, $this->id);
+		
 			}
 				
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket)
+		{
+		
+			if ($this->id == $arBasket['checkout']['payment'])
+			{
+		
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_icp_gebuehr'), $arBasket['sum']['preis']);
+				$mwstland = $this->shop->get_option('wpsg_mod_icp_mwstland');
+				$mwst = $this->shop->get_option('wpsg_mod_icp_mwst');
+		
+				if ($mwstland == '1' && $arBasket['noMwSt'])
+				{
+		
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+		
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+		
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $mwst);
+		
+				}
+		
+			}
+				
+		} // public function calcPayment(&$arBasket)
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -213,5 +256,5 @@
 		} // public function order_done(&$order_id, &$done_view)
 			
-		public function template_redirect()
+		public function wp_loaded()
 		{
 		
@@ -228,5 +271,5 @@
 				$url .= $_REQUEST['token'];
 		
-				$result = $this->shop->get_url_post_content($url, $arParam);
+				$result = $this->shop->get_url_post_content($url, $arParam, $this->curl_options);
 				$resultJson = json_decode($result, true);
 		
@@ -277,5 +320,5 @@
 			}
 		
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function mail_payment()
@@ -347,5 +390,5 @@
 			if ($this->shop->get_option('wpsg_mod_icp_sandbox') === '1') $url = $this->api_url['generateToken']['test'];
 		
-			$result = $this->shop->get_url_post_content($url, $arParam);
+			$result = $this->shop->get_url_post_content($url, $arParam, $this->curl_options);
 			$ident = json_decode($result);
 				
Index: /mods/wpsg_mod_invoice_type.class.php
===================================================================
--- /mods/wpsg_mod_invoice_type.class.php	(revision 5261)
+++ /mods/wpsg_mod_invoice_type.class.php	(revision 5261)
@@ -0,0 +1,146 @@
+<?php
+
+	class wpsg_mod_invoice_type extends wpsg_mod_basic 
+	{
+
+		var $lizenz = 2;
+		var $id = 4;
+
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Rechnung', 'wpsg');
+			$this->group = __('Zahlungsarten', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht die Zahlungsart Rechnung.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function install() {
+			
+			$this->shop->checkDefault('wpsg_mod_invoice_type_bezeichnung', $this->name, false, true);
+			$this->shop->checkDefault('wpsg_mod_invoice_type_hint', __('Zahlen Sie die Bestellung auf Rechnung. Die Ware wird dann nach Erhalt des Rechnungsbetrags versendet.', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_invoice_type_gebuehr', '0');
+			$this->shop->checkDefault('wpsg_mod_invoice_type_mwst', '0');
+			$this->shop->checkDefault('wpsg_mod_invoice_type_mwstland', '0');
+			
+		} // public function install()
+		
+		public function settings_edit()
+		{
+									
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_invoice_type/settings_edit.phtml');
+			
+		} // public function settings_edit()
+				
+		public function settings_save()
+		{
+		
+			$this->shop->update_option('wpsg_mod_invoice_type_bezeichnung', $_REQUEST['wpsg_mod_invoice_type_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_invoide_type_aktiv', $_REQUEST['wpsg_mod_invoide_type_aktiv']);
+			$this->shop->update_option('wpsg_mod_invoice_type_hint', $_REQUEST['wpsg_mod_invoice_type_hint']);			
+			$this->shop->update_option('wpsg_mod_invoice_type_gebuehr', wpsg_tf($_REQUEST['wpsg_mod_invoice_type_gebuehr'], true));
+			$this->shop->update_option('wpsg_mod_invoice_type_mwst', $_REQUEST['wpsg_mod_invoice_type_mwst']);
+			$this->shop->update_option('wpsg_mod_invoice_type_mwstland', $_REQUEST['wpsg_mod_invoice_type_mwstland']);			
+			
+			$this->shop->addTranslationString('wpsg_mod_invoice_type_bezeichnung', $_REQUEST['wpsg_mod_invoice_type_bezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_invoice_type_hint', $_REQUEST['wpsg_mod_invoice_type_hint']);
+			 
+		} // public function settings_save()
+		
+		public function addPayment(&$arPayment) 
+		{ 
+
+			if (!is_admin() && $this->shop->get_option('wpsg_mod_invoide_type_aktiv') != '1') return;
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_invoice_type_mwst'), $this->shop->getDefaultCountry());
+			
+			$arPayment[$this->id] = array(
+				'id' 			=> $this->id,
+				'name' 			=> __($this->shop->get_option('wpsg_mod_invoice_type_bezeichnung'), 'wpsg'),
+				'hint' => __($this->shop->get_option('wpsg_mod_invoice_type_hint'), 'wpsg'),
+				'preis' 		=> $this->shop->get_option('wpsg_mod_invoice_type_gebuehr'),
+				'mwst' 			=> $this->shop->get_option('wpsg_mod_invoice_type_mwst'),
+				'mwst_value' 	=> $mwst_value,
+				'mwst_null' 	=> $this->shop->get_option('wpsg_mod_invoice_type_mwstland')
+			);
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_invoice_type_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_invoice_type_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
+		} // public function addPayment(&$arPayment)
+		
+		public function calcPayment(&$arBasket)
+		{
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+				
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_invoice_type_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_invoice_type_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_invoice_type_mwst'));
+
+				}
+									
+			}
+				
+		}
+		
+	}
+
+?>
Index: /mods/wpsg_mod_keygen.class.php
===================================================================
--- /mods/wpsg_mod_keygen.class.php	(revision 5261)
+++ /mods/wpsg_mod_keygen.class.php	(revision 5261)
@@ -0,0 +1,119 @@
+<?php
+
+	/**
+	 * Admin Modul fÃŒr die Key Generierung 
+	 */
+	class wpsg_mod_keygen extends wpsg_mod_basic
+	{
+		
+		var $id = 14;		
+		var $lizenz = 3;
+		var $inline = true;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Keygen', 'wpsg');
+			$this->group = __('Sonstiges', 'wpsg');
+			$this->desc = __('Erlaubt das generieren von Keys.', 'wpsg');
+						
+		} // public function __construct()
+
+		public function settings_save()
+		{
+			
+			if (file_exists($_FILES['testkey']['tmp_name']))
+			{
+				
+				if (!class_exists('Crypt_RSA')) 
+				{
+
+					@set_include_path(WPSG_PATH.'/lib/phpseclib0.3.0/'.PATH_SEPARATOR.get_include_path());
+					require_once(WPSG_PATH.'/lib/phpseclib0.3.0/Crypt/RSA.php');
+						
+				}
+					 
+				$rsa = new Crypt_RSA();
+				$rsa->loadKey(file_get_contents(WPSG_PATH.'/lib/.htpublic'));
+				 
+				$arKey = @unserialize($rsa->decrypt(base64_decode(file_get_contents($_FILES['testkey']['tmp_name']))));
+				
+				$this->shop->addBackendMessage('nohspc_Testkey: <pre>'.print_r($arKey, 1).'</pre>');
+				
+			}
+			
+			if ($_REQUEST['wpsg_genkey'] == '1')
+			{
+			
+				$_SESSION['wpsg_mod_keygen'] = wpsg_xss($_REQUEST['wpsg_mod_keygen']);
+				
+				if ($_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_nr'] <= 0)
+				{
+					
+					$this->shop->addBackendError(__('Bitte eine SchlÃŒsselnummer angeben.', 'wpsg'));
+					return;
+					
+				}
+				
+				if (!preg_match('/\d{2}\.\d{2}\.\d{4}/', $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_date']))
+				{
+					
+					$this->shop->addBackendError(__('Bitte ein gÃŒltiges GÃŒltigkeitsdatum angeben.', 'wpsg'));
+					return;
+					
+				}
+				
+				if (!preg_match('/\d+\.\d+\.\d+/', $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_maxver']))
+				{
+					
+					$this->shop->addBackendError(__('Bitte eine gÃŒltige Maximale Versionsnummer angeben.', 'wpsg'));
+					return;
+					
+				}
+				
+				// Key generiere
+				if (!class_exists('Crypt_RSA'))
+				{
+				
+					@set_include_path(get_include_path().PATH_SEPARATOR.WPSG_PATH.'/lib/phpseclib0.3.0/');
+					require_once(WPSG_PATH.'/lib/phpseclib0.3.0/Crypt/RSA.php');
+					
+				}
+				
+				$rsa = new Crypt_RSA();
+				$rsa->loadKey(file_get_contents(WPSG_PATH.'/mods/mod_keygen/.htprivate'));
+				
+				$key = base64_encode($rsa->encrypt(serialize(array(
+					"anwendung" => $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_anwendung'],
+					"l" => $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_lizenz'],
+					"nr" => $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_nr'],
+					"date" => $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_date'],
+					"version" => $_REQUEST['wpsg_mod_keygen']['wpsg_mod_keygen_maxver'],
+					"mods" => $_REQUEST['wpsg_mod_keygen']['mods']
+				))));
+			 
+				header('Content-type: text/html');
+				header('Content-Disposition: attachment; filename="key.txt"');
+				
+				die($key);
+				
+			}
+			
+		} // public function settings_save()
+		
+		public function settings_edit()
+		{
+						
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_keygen/settings_edit.phtml');
+			unset($_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_key']);
+			
+		}
+		
+	} // class wpsg_mod_keygen extends wpsg_mod_basic
+		
+?>
Index: /mods/wpsg_mod_klarna.class.php
===================================================================
--- /mods/wpsg_mod_klarna.class.php	(revision 8528)
+++ /mods/wpsg_mod_klarna.class.php	(revision 5261)
@@ -1,24 +1,20 @@
 <?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 04.03.24
-	 * @time: 11:48
-	 */
-	 
-	use wpsgKlarna\mod_klarna\KlarnaPayment;
-	
-	class wpsg_mod_klarna extends \wpsg_mod_basic {
-	 
-		var $lizenz = 1;
-		var $id = 816;
-		var $hilfeURL = 'http://wpshopgermany.de/';
-		var $version = "9.9.9";
-		var $free = false;
-		protected static ?wpsg_mod_klarna $instance = null;
-		
-		public function __construct() {
+
+	class wpsg_mod_klarna extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 2;
+		var $id = 816; 
+		
+		var $version = "3.0.6";
+		//var $hilfeURL = 'http://wpshopgermany.de/?p=1575';
+		
+		var $free = true;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
 			
 			parent::__construct();
@@ -26,253 +22,288 @@
 			$this->name = __('Klarna', 'wpsg');
 			$this->group = __('Zahlungsarten', 'wpsg');
-			$this->desc = __('', 'wpsg');
- 
-			\spl_autoload_register(function($class_name) {
-
-				$arPath = explode('\\', $class_name);
-		
-				if ($arPath[0] === 'wpsgKlarna') {
- 
-					if (file_exists(dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_klarna'.DIRECTORY_SEPARATOR.$arPath[2].'.php')) {
-		
-						require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_klarna'.DIRECTORY_SEPARATOR.$arPath[2].'.php');
-						
-					} else {
-						
-						throw new \Exception(wpsg_translate(__('Klarna Klasse #1# nicht gefunden.', 'wpsg'), $class_name));
-						
-					}
-		
-				}
-		
-			} );
-			
-		}
-		
-		public function addPayment(&$arPayment) {
-			
-			if (!$this->isPaymentisActive()) return;
-			
+			$this->desc = __('ErmÃ¶glicht die Zahlungsart Rechnung ÃŒber Klarna.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function install()
+		{
+			
+			$this->shop->checkDefault('wpsg_mod_klarna_bezeichnung', $this->name, false, true);
+			$this->shop->checkDefault('wpsg_mod_klarna_aktiv', '1');
+			$this->shop->checkDefault('wpsg_mod_klarna_hint', __('Zahlen Sie auf Rechnung mit dem Zahlungsdienstleister "Klarna"', 'wpsg'), false, true);
+			
+			$this->shop->checkDefault('wpsg_mod_klarna_merchantID', '<!-- Erhalten Sie von Klarna --!>');
+			$this->shop->checkDefault('wpsg_mod_klarna_sharedSecret', '<!-- Erhalten Sie von Klarna --!>');
+			
+			$this->shop->checkDefault('wpsg_mod_klarna_gebuehr', '0');
+			$this->shop->checkDefault('wpsg_mod_klarna_mwst', '0');
+			$this->shop->checkDefault('wpsg_mod_klarna_mwstland', '0');
+			
+		} // public function install()
+		
+		public function settings_edit()
+		{
+						
+			$pages = get_pages();
+			
+			$arPages = array(
+				'-1' => __('Neu anlegen und zuordnen', 'wpsg')
+			);
+			
+			foreach ($pages as $k => $v)
+			{
+				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
+			}
+			
+			$this->shop->view['pages'] = $arPages;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_klarna/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_klarna_bezeichnung', $_REQUEST['wpsg_mod_klarna_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_klarna_aktiv', $_REQUEST['wpsg_mod_klarna_aktiv']);
+			$this->shop->update_option('wpsg_mod_klarna_aktiv_from', $_REQUEST['wpsg_mod_klarna_aktiv_from']);
+			$this->shop->update_option('wpsg_mod_klarna_aktiv_to', $_REQUEST['wpsg_mod_klarna_aktiv_to']);
+			$this->shop->update_option('wpsg_mod_klarna_hint', $_REQUEST['wpsg_mod_klarna_hint']);
+			
+			$this->shop->update_option('wpsg_mod_klarna_merchantID', $_REQUEST['wpsg_mod_klarna_merchantID']);
+			$this->shop->update_option('wpsg_mod_klarna_sharedSecret', $_REQUEST['wpsg_mod_klarna_sharedSecret']);
+			
+			$this->shop->update_option('wpsg_mod_klarna_sandbox', $_REQUEST['wpsg_mod_klarna_sandbox']);
+			
+			$this->shop->update_option('wpsg_mod_klarna_gebuehr', $_REQUEST['wpsg_mod_klarna_gebuehr']);
+			$this->shop->update_option('wpsg_mod_klarna_mwst', $_REQUEST['wpsg_mod_klarna_mwst']);
+			$this->shop->update_option('wpsg_mod_klarna_mwstland', $_REQUEST['wpsg_mod_klarna_mwstland']);
+			
+			$this->shop->createPage(__('Erfolgreiche Klarna Zahlung', 'wpsg'), 'wpsg_mod_klarna_success', $_REQUEST['wpsg_mod_klarna_success']);
+			$this->shop->createPage(__('Fehlgeschlagene Klarna Zahlung', 'wpsg'), 'wpsg_mod_klarna_error', $_REQUEST['wpsg_mod_klarna_error']);
+						
+		} // public function settings_save()
+		
+		public function addPayment(&$arPayment) 
+		{
+			
+			if (!is_admin() && $this->shop->get_option('wpsg_mod_klarna_aktiv') != '1');
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_klarna_mwst'), $this->shop->getDefaultCountry());
+						
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
-				'name' => $this->name,
-				'price' => wpsg_tf($this->shop->get_option('wpsg_mod_klarna_fee')),
-				'tax_key' => $this->shop->get_option('wpsg_mod_klarna_tax_key'),
-				'mwst_null' => $this->shop->get_option('wpsg_mod_klarna_notaxcountry'),
-				'hint' => __($this->shop->get_option('wpsg_mod_klarna_hint')).'<div id="wpsg_mod_klarna_widget"></div>',
-				'logo' => $this->shop->getRessourceURL('/mods/mod_klarna/gfx/klarna.svg')
+				'name' => __($this->shop->get_option('wpsg_mod_klarna_bezeichnung'), 'wpsg'),
+				'preis' => $this->shop->get_option('wpsg_mod_klarna_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_klarna_mwst'),
+				'mwst_value' => $mwst_value,
+				'mwst_null' => $this->shop->get_option('wpsg_mod_klarna_mwstland'),
+				'hint' => __($this->shop->get_option('wpsg_mod_klarna_hint')),
+				'logo' => $this->shop->getRessourceURL('mods/mod_klarna/gfx/klarna_rechnung.png'),
+				'logo_100x25' => $this->shop->getRessourceURL('mods/mod_klarna/gfx/logo_100x25.png')
 			);
 			
-		}
-		
-		public function checkout2_inner_prebutton(&$checkout_view) {
-			
-			if (intval($checkout_view['basket']['checkout']['payment']) === $this->id && $this->shop->get_option('wpsg_mod_klarna_checkout') === '1') {
-				
-				$order_id = intval($this->shop->basket->save(false, false, true));
-				
-				list($client_token, $session_id) = array_values(KlarnaPayment::getSession($order_id));
-		 
-				$this->shop->view['wpsg_mod_klarna'] = [
-					'client_token' => $client_token,
-					'oOrder' => \wpsg_order::getInstance($order_id),
-					'url_setAuthToken' => \wpsg_ShopController::getShop()->getURL(\wpsg_ShopController::URL_OVERVIEW, 'wpsg_mod_klarna', 'setAuthToken'),
-					'button_id' => 'wpsg_checkout2button'
-				];
-				$this->shop->render(dirname(__FILE__).'/../views/mods/mod_klarna/pay.phtml');
-				
-				
-			}
-			
-		}
-		
-		public function settings_edit(): void {
-		
-			$this->shop->render(dirname(__FILE__).'/../views/mods/mod_klarna/settings_edit.phtml');
-		
-		}
-		
-		public function order_done(&$order_id, &$done_view) {
-			
-			$oOrder = \wpsg_order::getInstance($order_id);
-			
-			if (intval($oOrder->getPaymentID()) !== $this->id) return;
-		 
-			$authorization_token = $oOrder->getMeta('wpsg_mod_klarna_authorization_token', false, '');
-			$wpsg_mod_klarna_capture_id = $oOrder->getMeta('wpsg_mod_klarna_capture_id', false, '');
- 
-			if ($authorization_token !== '' && $wpsg_mod_klarna_capture_id === '') {
-	 
-				$r = KlarnaPayment::createOrderWithAuthorizationToken($order_id, $authorization_token);
-				$klarna_order_id = $r['order_id']??'';
-				
-				if ($klarna_order_id !== '') {
+		} // public function addPayment(&$arPayment)
+				
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			 
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_klarna_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_klarna_mwstland') == '1' && $arBasket['noMwSt'])
+				{
 					
-					$oOrder->setMeta('wpsg_mod_klarna_order_id', $r['order_id']);
-					
-					$r = KlarnaPayment::captureOrder($order_id, $r['order_id']);
-					
-					$oOrder->setMeta('wpsg_mod_klarna_capture_id', $r['capture-id']);
-					$oOrder->setMeta('wpsg_mod_klarna_location', $r['location']);
-					
-					$klarna_order_info = KlarnaPayment::getOrder($order_id, $klarna_order_id);
-					
-					if ($klarna_order_info['status'] === 'CAPTURED' && $klarna_order_info['captured_amount'] === intval($oOrder->getToPay(WPSG_BRUTTO) * 100)) {
-						
-						// Bestellung freigeben
-						$this->shop->setOrderStatus($oOrder->id, 100, false);
-						
-						$this->shop->view['wpsg_mod_klarna']['state'] = 'PAYED_DONE';
-						$this->shop->render(dirname(__FILE__).'/../views/mods/mod_klarna/order_done.phtml');
-						return;
-						
-					}
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
 					
 				}
-				
-			}
-			
-			$klarna_order_id = $oOrder->getMeta('wpsg_mod_klarna_order_id', false, '');
-			
-			if ($klarna_order_id !== '') {
-				
-				$klarna_order_info = KlarnaPayment::getOrder($order_id, $klarna_order_id);
-				
-				if ($klarna_order_info['status'] === 'CAPTURED' && $klarna_order_info['captured_amount'] === intval($oOrder->getToPay(WPSG_BRUTTO) * 100)) {
+				else
+				{
 					
-					$this->shop->view['wpsg_mod_klarna']['state'] = 'PAYED';
-					$this->shop->render(dirname(__FILE__).'/../views/mods/mod_klarna/order_done.phtml');
-					return;
-					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_klarna_mwst'));
+
 				}
-				
-			}
-			
-			list($client_token, $session_id) = array_values(KlarnaPayment::getSession($order_id));
-			
-			$this->shop->view['wpsg_mod_klarna'] = [
-				'state' => 'TOPAY',
-				'client_token' => $client_token,
-				'oOrder' => \wpsg_order::getInstance($order_id),
-				'url_setAuthToken' => \wpsg_ShopController::getShop()->getDoneURL($order_id, 'wpsg_mod_klarna', 'setAuthTokenPay')
-			];
-			$this->shop->render(dirname(__FILE__).'/../views/mods/mod_klarna/order_done.phtml');
-			
-		}
-		
-		public function order_view_afterpayment(&$order_id) {
-			
-			$oOrder = \wpsg_order::getInstance($order_id);
-			
-			if (intval($oOrder->getPaymentID()) == $this->id) {
-				
-				$this->shop->render(dirname(__FILE__).'/../views/mods/mod_klarna/order_view_afterpayment.phtml');
-				
-			}
-			
-		}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket) 
+		
+		public function basket_save_done_array(&$order_id, &$kunde_id, &$arBasket)
+		{
+			
+			return;
+			
+			$k = $this->initKlarna();
+			
+			foreach ($arBasket['produkte'] as $p)
+			{
+				
+				$k->addArticle(  
+				    $p['menge'],                      // Quantity  
+				    $p['id'],             // Article number  
+				    $p['name'],      // Article name/title  
+				    $p['preis_brutto'],                 // Price  
+				    $p['mwst_value'],                     // 25% VAT  
+				    0,                      // Discount  
+				    KlarnaFlags::INC_VAT    // Price is including VAT.  
+				);
+				
+			}
+			 
+			// VersandgebÃŒhren
+			$k->addArticle(  
+			    1,  
+			    "",  
+			    __('Versandkosten', 'wpsg'),  
+			    (($arBasket['sum']['preis_shipping_brutto'] > 0)?$arBasket['sum']['preis_shipping_brutto']:0),  
+			    0, // MWST ?  
+			    0,  
+			    // Price is including VAT and is shipment fee  
+			    KlarnaFlags::INC_VAT | KlarnaFlags::IS_SHIPMENT  
+			);  
+			
+			// ZahlungsgebÃŒhren
+			$k->addArticle(  
+			    1,  
+			    "",  
+			    __('ZahlungsgebÃŒhren', 'wpsg'),  
+			    (($arBasket['sum']['preis_payment_brutto'] > 0)?$arBasket['sum']['preis_payment_brutto']:0),
+			    0, // MWST ?  
+			    0,  
+			    // Price is including VAT and is handling/invoice fee  
+			    KlarnaFlags::INC_VAT | KlarnaFlags::IS_HANDLING  
+			);  
+			 
+			// Create the address object and specify the values.  
+			$addr_invoice = new KlarnaAddr(  
+			    $arBasket['checkout']['email'], // email  
+			    '',            // Telno, only one phone number is needed.  
+			    $arBasket['checkout']['tel'],                 // Cellno  
+			    $arBasket['checkout']['vname'],              // Firstname  
+			    $arBasket['checkout']['name'],                   // Lastname  
+			    '',                           // No care of, C/O.  
+			    $arBasket['checkout']['strasse'],                // Street  
+			    $arBasket['checkout']['plz'],                      // Zip Code  
+			    $arBasket['checkout']['ort'],                   // City  
+			    KlarnaCountry::SE,            // Country  
+			    null,                         // HouseNo for German and Dutch customers.  
+			    null                          // House Extension. Dutch customers only.  
+			);  
+			 
+			$k->setAddress(KlarnaFlags::IS_BILLING, $addr_invoice);  // Billing / invoice address  
+						
+			if ($this->shop->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array($k_id, $o_id)))
+			{
+				
+				$addr_shipping = new KlarnaAddr(  
+				    $arBasket['checkout']['email'], // email  
+				    '',            // Telno, only one phone number is needed.  
+				    $arBasket['checkout']['tel'],                 // Cellno  
+				    $arBasket['checkout']['shipping_vname'],              // Firstname  
+				    $arBasket['checkout']['shipping_name'],                   // Lastname  
+				    '',                           // No care of, C/O.  
+				    $arBasket['checkout']['shipping_strasse'],                // Street  
+				    $arBasket['checkout']['shipping_plz'],                      // Zip Code  
+				    $arBasket['checkout']['shipping_ort'],                   // City  
+				    KlarnaCountry::SE,            // Country  
+				    null,                         // HouseNo for German and Dutch customers.  
+				    null                          // House Extension. Dutch customers only.  
+				);
+				
+				$k->setAddress(KlarnaFlags::IS_SHIPPING, $addr_shipping); // Shipping / delivery address
+				
+			}
+			else
+			{
+				
+				$k->setAddress(KlarnaFlags::IS_SHIPPING, $addr_invoice); // Shipping / delivery address
+				
+			}
+			 
+			try 
+			{  
+				  
+		        $result = $k->addTransaction(  
+		            strtotime($arBasket['checkout']['geb']),             // PNO (Date of birth for DE and NL).  
+		            null,                   // Gender.  
+		            KlarnaFlags::NO_FLAG,   // Flags to affect behavior.  
+		            // -1, notes that this is an invoice purchase, for part payment purchase  
+		            // you will have a pclass object on which you use getId().  
+		            KlarnaPClass::INVOICE  
+		        );  
+		      
+		        // Check the order status  
+		        if ($result[1] == KlarnaFlags::PENDING) 
+		        {
+		        	  
+		            /* The order is under manual review and will be accepted or denied at a 
+		               later stage. Use cronjob with checkOrderStatus() or visit Klarna 
+		               Online to check to see if the status has changed. You should still 
+		               show it to the customer as it was accepted, to avoid further attempts 
+		               to fraud. 
+		             */
+		        	  
+		        }  
+		      
+		        // Here we get the invoice number  
+		        $invno = $result[0];  
+		      
+		        // Order is complete, store it in a database.  
+		        echo "Status: {$result[1]}\nInvno: {$result[0]}\n";  
+		        
+		    } 
+		    catch(Exception $e) 
+		    {  
+		    	  
+		        echo "{$e->getMessage()} (#{$e->getCode()})\n";  
+		        echo $e->getTraceAsString(); 
+		         
+		    }  
+			 
+		} // public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
+		
+		/* Modulfunktionen */
 		
 		/**
-		 * Hier kommt man nach Checkout2 hin
-		 * @return void
-		 * @throws \wpsg\Exception
+		 * Erstellt das KlarnaAPI Object
 		 */
-		public function setAuthTokenRedirect() {
-			
-			// Bestellung hole ich mir aus der Session
-			$order_id = intval($_SESSION['wpsg']['order_id']??0);
-			
-			$request = file_get_contents('php://input');
-			$request = json_decode($request, true);
-			
-			if ($order_id > 0 && isset($request['authorization_token'])) {
-			
-				// Authorisierung an Bestellung speichern
-				$oOrder = \wpsg_order::getInstance($order_id);
-				$oOrder->setMeta('wpsg_mod_klarna_authorization_token', $request['authorization_token']);
-				
-				$data = [
-					'success' => true,
-					'href' => \wpsg_ShopController::getShop()->getURL(\wpsg_ShopController::URL_OVERVIEW)
-				];
-				header('Content-Type: application/json; charset=utf-8');
-				echo json_encode($data); exit;
-				
-			} else die("0");
-			
-		}
-		
-		/**
-		 * Hier kommt man nach der Bestellung rein
-		 * @return void
-		 * @throws \wpsg\Exception
-		 */
-		public function setAuthTokenPayRedirect() {
-			
-			$request = file_get_contents('php://input');
-			$request = json_decode($request, true);
-			
-			$order_id = intval($_REQUEST['order_id']??0);
-			
-			if ($order_id > 0 && isset($request['authorization_token'])) {
-			
-				// Authorisierung an Bestellung speichern
-				$oOrder = \wpsg_order::getInstance($order_id);
-				$oOrder->setMeta('wpsg_mod_klarna_authorization_token', $request['authorization_token']);
-	 
-				$data = [
-					'success' => true,
-					'href' => \wpsg_ShopController::getShop()->getDoneURL($order_id)
-				];
-				header('Content-Type: application/json; charset=utf-8');
-				echo json_encode($data); exit;
-				
-			} else die("0");
-			
-		}
-		
-		public function settings_save() {
-			
-			$this->shop->update_option('wpsg_mod_klarna_active', intval($_REQUEST['wpsg_mod_klarna_active']??0));
-			$this->shop->update_option('wpsg_mod_klarna_admin_active', intval($_REQUEST['wpsg_mod_klarna_admin_active']??0));
-			
-			$this->shop->update_option('wpsg_mod_klarna_api_user', sanitize_text_field($_REQUEST['wpsg_mod_klarna_api_user']??''));
-			$this->shop->update_option('wpsg_mod_klarna_api_password', sanitize_text_field($_REQUEST['wpsg_mod_klarna_api_password']??''));
-			
-			$this->shop->update_option('wpsg_mod_klarna_sandbox', intval($_REQUEST['wpsg_mod_klarna_sandbox']??0));
-			$this->shop->update_option('wpsg_mod_klarna_sandbox_user', sanitize_text_field($_REQUEST['wpsg_mod_klarna_sandbox_user']??''));
-			$this->shop->update_option('wpsg_mod_klarna_sandbox_password', sanitize_text_field($_REQUEST['wpsg_mod_klarna_sandbox_password']??''));
-			
-			$this->shop->update_option('wpsg_mod_klarna_fee', sanitize_text_field($_REQUEST['wpsg_mod_klarna_fee']??''));
-			$this->shop->update_option('wpsg_mod_klarna_tax_key', sanitize_text_field($_REQUEST['wpsg_mod_klarna_tax_key']??''));
-			$this->shop->update_option('wpsg_mod_klarna_notaxcountry', intval($_REQUEST['wpsg_mod_klarna_notaxcountry']??0));
-			$this->shop->update_option('wpsg_mod_klarna_hint', sanitize_text_field($_REQUEST['wpsg_mod_klarna_hint']??''));
-			
-			$this->shop->update_option('wpsg_mod_klarna_debug', intval($_REQUEST['wpsg_mod_klarna_debug']??0));
-			$this->shop->update_option('wpsg_mod_klarna_checkout', intval($_REQUEST['wpsg_mod_klarna_checkout']??0));
-			
-		}
-		
-		private function isPaymentisActive(): bool {
-			
-			if (!is_admin()) {
-				
-				if ($this->shop->get_option('wpsg_mod_klarna_active') !== '1') return false;
-				
-				if ($this->shop->get_option('wpsg_mod_payone_admin_active') === '1' && !\current_user_can('administrator')) return false;
-				
-				return true;
-				
-			} else return true;
-			
-		}
-		
-		public static function getInstance(): wpsg_mod_klarna {
-		 
-			if (!isset(static::$instance)) static::$instance = new static;
-			
-			return static::$instance;
-			
-		}
-	
-	}
+		private function initKlarna()
+		{
+			
+			require_once(WPSG_PATH_MOD.'/mod_klarna/klarna_php_2.3.0/Klarna.php');
+			require_once(WPSG_PATH_MOD.'/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc.inc');
+			require_once(WPSG_PATH_MOD.'/mod_klarna/klarna_php_2.3.0/transport/xmlrpc-3.0.0.beta/lib/xmlrpc_wrappers.inc');
+			
+			$k = new Klarna();  
+			
+			$k->config(  
+			    $this->shop->get_option('wpsg_mod_klarna_merchantID'),               // Merchant ID  
+			    $this->shop->get_option('wpsg_mod_klarna_sharedSecret'),       // Shared Secret  
+			    KlarnaCountry::SE,    // Country  
+			    KlarnaLanguage::DE,   // Language  
+			    KlarnaCurrency::SEK,  // Currency  
+			    Klarna::BETA,         // Server  
+			    'json',               // PClass Storage  
+			    '/srv/pclasses.json', // PClass Storage URI path  
+			    true,                 // SSL  
+			    true                  // Remote logging of response times of xmlrpc calls  
+			); 
+			
+			return $k;
+			
+		} // private function initKlarna()
+		
+	} // class wpsg_mod_klarna extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_kundenkontakt.class.php
===================================================================
--- /mods/wpsg_mod_kundenkontakt.class.php	(revision 8528)
+++ /mods/wpsg_mod_kundenkontakt.class.php	(revision 5261)
@@ -1,12 +1,10 @@
 <?php 
 
-	class wpsg_mod_kundenkontakt extends wpsg_mod_basic {
+	class wpsg_mod_kundenkontakt extends wpsg_mod_basic 
+	{
 		
 		var $lizenz = 1;
 		var $id = 1000;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=3886';
-		
-		static $arSMSStatus = [];
-		static $sms_endpoint = 'https://www.smsflatrate.net/appkey.php';
 		
 		/**
@@ -24,158 +22,54 @@
 		} // public function __construct()
 		
-		public function install()
-		{
-			
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-			 			
-			/**
-			 * LÃ€ndertabelle erweitern
-			 */
-			$sql = "CREATE TABLE ".WPSG_TBL_LAND." (
-			  	telprefix TEXT NOT NULL COMMENT 'Vorwahlen, kommagetrennt fÃŒr SMS Versand Kundenkontakt'
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-			
-			dbDelta($sql);
+		/**
+		 * zeigt das Formular zum Senden in der Bestellverwaltung
+		 */
+		public function order_view_content($order_id)
+		{
+			
+			$path = $this->shop->getRessourcePath('mods/mod_kundenkontakt/templates/');
+
+			$this->shop->view['arTemplates'] = array();
+			
+			$arrFiles = scandir($path);
+			
+			foreach ($arrFiles as $file)
+			{
+				
+				if (is_file($path.$file) && preg_match('/(.*)\.phtml/', $file) && !preg_match('/(.*)_html\.phtml/', $file))
+				{
+					
+					$template_name = str_replace('.phtml', '', $file);
+					
+					$this->shop->view['arTemplates'][$file]['filename'] = $file;
+					$this->shop->view['arTemplates'][$file]['name'] = ucfirst($template_name);
+					
+				}
+				
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'mods/mod_kundenkontakt/order_view.phtml');
+			
+		} // public function order_view_content($order_id)
+		
+		public function order_ajax()
+		{
+			
+			if ($_REQUEST['do'] == 'kk_switchTemplate')
+			{
+				
+				$this->switchTemplate();
+				
+			}
+
+			if ($_REQUEST['do'] == 'kk_sendMail')
+			{
+				
+				$this->send();
+				
+			}
 			
 		}
 		
-		public function init() {
-			
-			self::$arSMSStatus = [
-				'100' => __('SMS erfolgreich an das Gateway ÃŒbertragen.', 'wpsg'),
-				'101' => __('SMS wurde zugestellt.', 'wpsg'),
-				'102' => __('SMS wurde noch nicht zugestellt.', 'wpsg'),
-				'103' => __('SMS konnte vermutlich nicht zugestellt werden (Rufnummer falsch, SIM nicht aktiv).', 'wpsg'),
-				'104' => __('SMS konnte nach Ablauf von 48 Stunden noch immer nicht zugestellt werden.', 'wpsg'),
-				'109' => __('SMS ID abgelaufen oder ungÃŒltig (manuelle Status-Abfrage).', 'wpsg'),
-				'110' => __('Falscher Schnittstellen-Key oder Ihr Account ist gesperrt.', 'wpsg'),
-				'120' => __('Guthaben reicht nicht aus.', 'wpsg'),
-				'130' => __('Falsche DatenÃŒbergabe (z.B. Absender fehlt).', 'wpsg'),
-				'131' => __('EmpfÃ€nger nicht korrekt.', 'wpsg'),
-				'132' => __('Absender nicht korrekt.', 'wpsg'),
-				'133' => __('Nachrichtentext nicht korrekt.', 'wpsg'),
-				'140' => __('Falscher AppKey oder Ihr Account ist gesperrt.', 'wpsg'),
-				'150' => __('Sie haben versucht an eine internationale Handynummer eines Gateways, das ausschlieÃlich fÃŒr den Versand nach Deutschland bestimmt ist, zu senden.', 'wpsg'),
-				'170' => __('Parameter âtime=â ist nicht korrekt. Bitte im Format: TT.MM.JJJJ-SS:MM oder Parameter entfernen fÃŒr sofortigen Versand.', 'wpsg'),
-				'171' => __('Parameter âtime=â ist zu weit in der Zukunft terminiert (max. 360 Tage).', 'wpsg'),
-				'231' => __('Keine smsflatrate.net Gruppe vorhanden oder nicht korrekt.', 'wpsg'),
-				'404' => __('Unbekannter Fehler. Bitte dringend Support (ticket@smsflatrate.net) kontaktieren.', 'wpsg'),
-			];
-			
-		} // public function init()
-		
-		public function settings_edit() {
-			 			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenkontakt/settings_edit.phtml');
-			
-		} // public function settings_edit()
-		
-		public function settings_save() {
-
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_active', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['active'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_key', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['key'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_from', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['from'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_type', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['type'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_status', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['status'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_reply', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['reply'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_kundenkontakt_smsflatrate_replytomail', $_REQUEST['wpsg_mod_kundenkontakt']['smsflatrate']['replytomail'], false, false, WPSG_SANITIZE_EMAIL);
-						
-		}
-		
-		/**
-		 * zeigt das Formular zum Senden in der Bestellverwaltung
-		 */
-		public function order_view($order_id, &$arSidebarArray) {
-			 			
-			$this->shop->view['arTemplates'] = $this->getTemplates();
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			
-			$phone = $oOrder->getCustomer()->getPhone();
-			$phone = preg_replace('/^\+/', '00',$phone);
-			
-			$this->shop->view['valid'] = $this->isValidPhoneNumber($phone);
-			$this->shop->view['phone'] = $phone;
-			
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'mods/mod_kundenkontakt/order_view.phtml', false)
-			);
-			
-		} // public function order_view_content($order_id)
-		
-		public function order_ajax() {
-			
-			$_REQUEST['do'] = wpsg_getStr($_REQUEST['do']);
-			
-			if ($_REQUEST['do'] === 'kk_switchTemplate') {
-				
-				$this->switchTemplate();
-				
-			} else if ($_REQUEST['do'] === 'kk_sendMail') {
-				
-				$this->send();
-				
-			} else if ($_REQUEST['do'] === 'validateNumber') {
-							
-				$valid = $this->isValidPhoneNumber($_REQUEST['phone']);
-				
-				$strHTML = '';
-				
-				if ($valid) {
-					
-					$strHTML .= '<div class="alert alert-success">';
-					$strHTML .= wpsg_translate(__('Die Telefonnummer #1# ist gÃŒltig.', 'wpsg'), $_REQUEST['phone']);
-					$strHTML .= '</div>';
-						
-				} else {
-					
-					$strHTML .= '<div class="alert alert-danger">';
-					$strHTML .= wpsg_translate(__('Die Telefonnummer #1# ist nicht gÃŒltig.', 'wpsg'), $_REQUEST['phone']);
-					$strHTML .= '</div>';
-					
-				}
-				
-				wpsg_header::JSONData([
-					'valid' => $valid,
-					'text' => $strHTML
-				]);
-				
-				exit;
-				
-			} else if ($_REQUEST['do'] == 'sms_submit') {
-				
-				$_REQUEST['edit_id'] = intval($_REQUEST['edit_id']);
-				
-				\check_admin_referer('wpsg_mod_kundenkontakt_sms_form_'.$_REQUEST['edit_id']);
-				
-				$r = $this->sendSMS($_REQUEST['phone'], $_REQUEST['text']);
-				
-				if (!in_array($r[0], ['100', '101'])) {
-					
-					$this->shop->addBackendError($r[1]);
-					
-				} else {
-					
-					$this->shop->addBackendMessage($r[1]);
-					
-				}
-				
-				$oOrder = wpsg_order::getInstance($_REQUEST['edit_id']);
-				
-				$log_title = wpsg_translate(__('SMS: #1# / #2#', 'wpsg'), $_REQUEST['phone'], $r[1]);
-				$log_text  = "EmpfÃ€nger  : ".$_REQUEST['phone']."\r\n";
-				$log_text .= "API Return : ".$r[0].': '.$r[1]."\r\n";
-				$log_text .= "RAW        : ".$r[2];
-				
-				$oOrder->addLogEntry($log_title, $log_text);
-				
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
-				exit;
-				
-			}
-			
-		}
-				
 		public function admin_emailconf()
 		{
@@ -195,98 +89,23 @@
 		} // public function admin_emailconf_save()
 		
-		public function laender_edit() {
-						
-			echo wpsg_drawForm_Textarea('country[telprefix]', __('MÃ¶gliche Vorwahlen fÃŒr SMS Versand. (kommagetrennt)', 'wpsg'),wpsg_getStr($this->shop->view['land']['telprefix']), ['help' => 'country_telprefix']);
-			
-		}
-		
 		/* Modulfunktionen */
-		 
-		public function order_index_bottom() {
-			 
-			if (sizeof($this->shop->view['arData']??[]) <= 0) return;
-			
-			$this->shop->view['arTemplates'] = $this->getTemplates();
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenkontakt/order_index_bottom.phtml');
-			
-		}
-		
-		private function isValidPhoneNumber($phone) {
-			
-			$arLaender = $this->shop->cache->getCountry();
-			$arPrefix = [];
-			
-			foreach ($arLaender as $l_db) {
-				
-				$arPrefix = array_merge($arPrefix, explode(',', $l_db['telprefix']));
-				
-			}
-			
-			$arPrefix = array_unique($arPrefix);
-			$arPrefix = wpsg_trim($arPrefix);
-			
-			foreach ($arPrefix as $p) {
-				
-				if (substr($phone, 0, strlen($p)) === $p) return true;
-				
-			}
-			
-			return false;
-			
-		}
-		
-		/**
-		 * Gibt true zurÃŒck, wenn das SMS Versandmodul aktiv ist und komplett konfiguriert
-		 */
-		private function isPossibleSMSSend($tel = false) {
-			
-			if ($this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_active') !== '1') return false;
-			
-			if ($tel !== false) {
-				
-				return $this->isValidPhoneNumber($tel);
-				
-			}
-			
-			return true;
-			
-		}
-						
-		public function sendSMS($to, $text) {
-			
-			if (!$this->isPossibleSMSSend()) throw new \wpsg\Exception(__('SMS Versand nicht aktiviert.', 'wpsg'));
-			
-			$arFields = [
-				'lizenz' => '215100700',
-				'aid' => '6546',
-				'appkey' => $this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_key'),
-				'from' => $this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_from'),
-				'to' => $to,
-				'text' => $text,
-				'type' => $this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_type'),
-				'status' => $this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_status'),
-				'reply' => $this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_reply'),
-				'replytomail' => $this->shop->get_option('wpsg_mod_kundenkontakt_smsflatrate_replytomail')
-			];
-			
-			$result = $this->shop->get_url_post_content(self::$sms_endpoint, $arFields);
-			$send_sms_return = substr($result, 0, 3);
-			 
-			return array($send_sms_return, wpsg_getStr(self::$arSMSStatus[$send_sms_return], __('Unbekannte API Antwort', 'wpsg')), $result);
-			
-		}
 		
 		/**
 		 * 
-		 * ermÃ¶glicht die Auswahl eines Templates zum Versenden als Kundenkontakt
-		 */
-		private function switchTemplate() {
-			
-			if ($_REQUEST['template_file'] != '-1') {
+		 * ermÃ¶glichr die Auswahl eines Templates zum versenden als Kundenkontakt
+		 */
+		private function switchTemplate()
+		{
+			
+			if ($_REQUEST['template_file'] != '-1')
+			{
 				 
 				$path = $this->shop->getRessourcePath('mods/mod_kundenkontakt/templates/');
 				
-				if ($this->shop->get_option('wpsg_htmlMail') === '1') {
+				$basket = new wpsg_basket();
+				$basket->initFromDB(wpsg_q($_REQUEST['edit_id']));
+
+				if ($this->shop->get_option('wpsg_htmlMail') === '1')
+				{
 					
 					$this->shop->htmlMail = true;
@@ -294,20 +113,10 @@
 				}
 				
-				$order_id = intval($_REQUEST['edit_id']??0);
-				
-				if ($order_id > 0) {
-										
-					$basket = new wpsg_basket();
-					$basket->initFromDB($order_id);
-					
-					$this->shop->view['oOrder'] = wpsg_order::getInstance($order_id);
-					$this->shop->view['basket'] = $basket->toArray();
-					$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
-					$this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
-					
-					$order_data = $this->shop->cache->loadOrder($_REQUEST['edit_id']);
-					if (trim($order_data['language']) != '') $this->shop->setTempLocale($order_data['language']);
-				
-				}
+				$this->shop->view['basket'] = $basket->toArray();
+				$this->shop->view['order'] = $this->shop->cache->loadOrder($_REQUEST['edit_id']);
+				$this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
+				
+				$order_data = $this->shop->cache->loadOrder($_REQUEST['edit_id']);
+				if (trim($order_data['language']) != '') $this->shop->setTempLocale($order_data['language']);
 				
 				$this->shop->view['datum'] = time();
@@ -319,11 +128,13 @@
             	global $template_name, $template_betreff;
 				
-				$template = $path.basename($_REQUEST['template_file']);
-				
-				if ($this->shop->get_option('wpsg_htmlmail') === '1') {
+				$template = $path.wpsg_q($_REQUEST['template_file']);
+				
+				if ($this->shop->get_option('wpsg_htmlmail') === '1')
+				{
 					
 					$template_html = preg_replace('/\.phtml$/i', '_html.phtml', $template);
 					
-					if (file_exists($template_html)) {
+					if (file_exists($template_html)) 
+					{
 						
 						$template = $template_html;
@@ -334,12 +145,6 @@
 								
 				$content = $this->shop->render($template, false);				
-				
-				if ($order_id > 0) {
-				
-					$content = $this->shop->replaceUniversalPlatzhalter($content, $order_id);
-				
-					$template_betreff = $this->shop->replaceUniversalPlatzhalter($template_betreff, $order_id);
-
-				}
+				$content = $this->shop->replaceUniversalPlatzhalter($content, $_REQUEST['edit_id']);
+				$template_betreff = $this->shop->replaceUniversalPlatzhalter($template_betreff, $_REQUEST['edit_id']);
 				 				
 				$this->shop->restoreTempLocale();
@@ -352,7 +157,5 @@
 				header('Content-Type: application/json');
 				
-				echo json_encode($arData);
-				
-				exit;
+				die(json_encode($arData));
 				
 			}
@@ -364,95 +167,36 @@
 		 * Enter description here ...
 		 */
-		private function send() {
-
-			$arOrderID = $_REQUEST['arOrderID']??[$_REQUEST['edit_id']];
-
-			foreach ($arOrderID as $order_id) {
-				
-				$order_id = intval($order_id); 
-				$oOrder = wpsg_order::getInstance($order_id);
-				
-				$basket = new wpsg_basket();
-				$basket->initFromDB($order_id);
-				
-				$this->shop->view['oOrder'] = wpsg_order::getInstance($order_id);
-				$this->shop->view['basket'] = $basket->toArray();
-				$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
-				$this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
-				 
-				if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
-				else $this->shop->restoreTempLocale();
-								
-				$mail_text = $this->shop->replaceUniversalPlatzhalter($_REQUEST['text'], $order_id);
-				$to = $oOrder->getCustomer()->getEMail();
-				$subject = $this->shop->replaceUniversalPlatzhalter($_REQUEST['subject'], $order_id);
-				
-				// HTML Mail
-				if ($this->shop->get_option('wpsg_htmlmail') == '1') {
-					
-					$mail_html = $this->shop->replaceUniversalPlatzhalter($_REQUEST['text'], $order_id);
-					$mail_text = strip_tags($mail_html);
-					
-				} else $mail_html = false;
-				   
-				$this->shop->sendMail($mail_text, $to, 'customercontact', array(), $order_id, false, $mail_html, $subject);
-				
-				if (!isset($_REQUEST['arOrderID'])) {
-				
-					$this->shop->addBackendMessage(__('Eine Nachricht ÃŒber den Kundenkontakt wurde versendet.', 'wpsg'));
-
-				}
-				
-				$this->db->ImportQuery(WPSG_TBL_OL, array(
-					'cdate' => 'NOW()',
-					'o_id' => wpsg_q($order_id),
-					'title' => wpsg_q(wpsg_translate(__('Kundenkontakt "#1#"', 'wpsg'), $subject)),
-					'mailtext' => wpsg_q($mail_text)					
-				));
-
-			}
+		private function send()
+		{ 
+			
+			$mail_text = $this->shop->replaceUniversalPlatzhalter($_REQUEST['text'], $_REQUEST['edit_id']);
+			$to = $_REQUEST['empfaenger'];
+			$subject = $this->shop->replaceUniversalPlatzhalter($_REQUEST['subject'], $_REQUEST['edit_id']);
+			
+			// HTML Mail
+			if ($this->shop->get_option('wpsg_htmlmail') == '1')
+			{
+				
+				$mail_html = $this->shop->replaceUniversalPlatzhalter($_REQUEST['text'], $_REQUEST['edit_id']);
+				$mail_text = strip_tags($mail_html);
+				
+			} else $mail_html = false;
 			 
-			if (isset($_REQUEST['arOrderID'])) {
-				
-				echo wpsg_translate(__('Es wurden #1# Kunden informiert.', 'wpsg'), sizeof($_REQUEST['arOrderID']));
-
-			} else {
-			
-				echo '1';
-
-			}
-			
-			exit;
-
+			$this->shop->sendMail($mail_text, $to, 'customercontact', array(), $_REQUEST['edit_id'], false, $mail_html, $subject);
+			
+			$this->shop->addBackendMessage(__('Eine Nachricht ÃŒber den Kundenkontakt wurde versendet.', 'wpsg'));
+			
+			$this->db->ImportQuery(WPSG_TBL_OL, array(
+				'cdate' => 'NOW()',
+				'o_id' => wpsg_q($_REQUEST['edit_id']),
+				'title' => wpsg_q(wpsg_translate(__('Kundenkontakt "#1#"', 'wpsg'), $subject)),
+				'mailtext' => wpsg_q($mail_text)					
+			));
+			 			
+			die('1');
+			
 		}
-
-		/**
-		 * Gibt die verfÃŒgbaren Templates als Array zurÃŒck
-		 * @return array
-		 */
-		private function getTemplates(): array {
-			
-			$path = $this->shop->getRessourcePath('mods/mod_kundenkontakt/templates/');
-			
-			$arTemplates = array();
-			
-			$arrFiles = scandir($path);
-			
-			foreach ($arrFiles as $file) {
-				
-				if (is_file($path.$file) && preg_match('/(.*)\.phtml/', $file) && !preg_match('/(.*)_html\.phtml/', $file)) {
-					
-					$template_name = str_replace('.phtml', '', $file);
-					
-					$arTemplates[$file]['filename'] = $file;
-					$arTemplates[$file]['name'] = ucfirst($template_name);
-					
-				}
-				
-			}
-			
-			return $arTemplates;
-			
-		}
-		
+	
 	} // class wpsg_mod_kundenkontakt extends wpsg_mod_basic 
+	
+?>
Index: /mods/wpsg_mod_kundenverwaltung.class.php
===================================================================
--- /mods/wpsg_mod_kundenverwaltung.class.php	(revision 8528)
+++ /mods/wpsg_mod_kundenverwaltung.class.php	(revision 5261)
@@ -9,5 +9,5 @@
 		
 		var $lizenz = 1;
-		var $id = 3100;
+		var $id = 10;
 		var $hilfeURL = 'http://wpshopgermany.maennchen1.de/?p=3302';
 		
@@ -17,5 +17,6 @@
 		 * Costructor
 		 */
-		public function __construct() {
+		public function __construct()
+		{
 			
 			parent::__construct();
@@ -24,36 +25,13 @@
 			$this->group = __('Sonstiges', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht eine Kundenverwaltung mit Profil, Kundengruppen, Registrierung und Login Mechanismen.', 'wpsg');
-
+									
 		} // public function __construct()
-
-		public function widgets_init() {
-
-			require_once(dirname(__FILE__).'/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php');
-			register_widget("wpsg_kundenverwaltung_widget");
-
-		}
-
-		public function init() {
-
-			global $wpdb; 
-
-		    $role_object = get_role('administrator');
-		    $role_object->add_cap('wpsg_customer');
-		    
-		    if (is_admin() && $this->shop->get_option('wpsg_wpsg_kundenverwaltung_cappreset') === false) {
-		        
-		        $arRoles = get_option($wpdb->prefix."user_roles");
-		        
-		        if (!isset($arRoles['administrator']['capabilities']['wpsg_kundenverwaltung'])) {
-		            
-		            $role_object = get_role('administrator');
-		            $role_object->add_cap('wpsg_kundenverwaltung');
-		            
-		            $this->shop->update_option('wpsg_wpsg_kundenverwaltung_cappreset', '1');
-		            
-		        }
-		        
-		    }
-		    
+		
+		public function init()
+		{
+			
+			$role_object = get_role('administrator');
+			$role_object->add_cap('wpsg_customer');
+						
 		} // public function init()
 		
@@ -64,8 +42,7 @@
 			 			
 			// Grundeinstellung Pro Seite
-			if ($this->shop->get_option('wpsg_mod_kundenverwaltung_perpage') === false || $this->shop->get_option('wpsg_mod_kundenverwaltung_perpage') == '') {
-			    
+			if ($this->shop->get_option('wpsg_mod_kundenverwaltung_perpage') === false || $this->shop->get_option('wpsg_mod_kundenverwaltung_perpage') == '')
+			{
 				$this->shop->update_option('wpsg_mod_kundenverwaltung_perpage', '20');
-				
 			}
 			
@@ -79,7 +56,7 @@
 			$sql = "CREATE TABLE ".WPSG_TBL_KU." (
 		   		passwort_saltmd5 VARCHAR(255) NOT NULL,
+		   		comment TEXT NOT NULL,
 		   		wp_user_id INT(11) DEFAULT 0 NOT NULL,
-				last_login DATETIME NOT NULL COMMENT 'Datum des letzten Logins',
-				anonymized DATETIME NOT NULL COMMENT 'Datum der Anonymisierung'
+		   		status VARCHAR(255) NOT NULL,
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
    	   	 
@@ -87,62 +64,35 @@
    			   			
    			$this->shop->checkDefault('wpsg_kundenpwdrequest_betreff', __('PasswortÃ€nderungsanfrage', 'wpsg'));
-   			$this->shop->checkDefault('wpsg_kundenpwd_betreff', __('Ihr neues Passwort', 'wpsg'));
+   			$this->shop->checkDefault('wpsg_kundenpwd_betreff', __('Ihre Neues Passwort', 'wpsg'));
    			$this->shop->checkDefault('wpsg_mod_kundenverwaltung_redirectlogin', '0');
    			$this->shop->checkDefault('wpsg_mod_kundenverwaltung_redirectLogout', '0');
-			$this->shop->checkDefault('wpsg_mod_kundenverwaltung_loginZwang', '1');
-			$this->shop->checkDefault('wpsg_page_mod_kundenverwaltung_status', '1');
-			$this->shop->checkDefault('wpsg_mod_kundenverwaltung_mathcaptcha', '1');
-
-            $this->db->UpdateQuery(WPSG_TBL_KU, ['last_login' => 'NOW()'], " `last_login` = '0000-00-00 00:00:00' ");
-			
+   			
 		} // public function install()
 		
-		public function be_ajax() { 
-					    
-			if (wpsg_getStr($_REQUEST['wpsg_mod_kundenverwaltung_setActiv']) == '1') {
+		public function be_ajax() 
+		{ 
+			
+			if ($_REQUEST['wpsg_mod_kundenverwaltung_setActiv'] == '1')
+			{
 				
 				$this->db->UpdateQuery(WPSG_TBL_KU, array(
 					'status' => '1'
-				), " `deleted` != '1' ");
+				), '1');
 
 				$this->shop->addBackendMessage(__('Alle Kunden wurden auf Aktiv gesetzt.', 'wpsg'));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung');
 				
-			} else if (wpsg_getStr($_REQUEST['wpsg_mod_kundenverwaltung_setInactiv']) == '1') {
+			}
+			else if ($_REQUEST['wpsg_mod_kundenverwaltung_setInactiv'] == '1')
+			{
 				
 				$this->db->UpdateQuery(WPSG_TBL_KU, array(
 					'status' => '0'
-				), " `deleted` != '1' ");
+				), '1');
 				
 				$this->shop->addBackendMessage(__('Alle Kunden wurden auf Inaktiv gesetzt.', 'wpsg'));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung');
 				
-			} else if ($_REQUEST['be_ajax'] === 'su' && is_admin()) {
-
-                $this->shop->send_headers();
-			    
-				unset($_SESSION['wpsg']);
-                
-                $this->login($_REQUEST['k_id']);
-                $kunde_data = $this->shop->cache->loadKunden($_REQUEST['k_id']);
-
-                $this->shop->addBackendMessage(wpsg_translate(__('Sie sind jetzt im Frontend als #1# #2# angemeldet.', 'wpsg'), $kunde_data['vorname'], $kunde_data['name']));
-                $this->shop->redirect(wpsg_admin_url('Customer', 'edit', ['edit_id' => $_REQUEST['k_id']]));
-                
-            } else if ($_REQUEST['be_ajax'] === 'su_index' && is_admin()) {
-
-                $this->shop->send_headers();
-
-				wpsg_checkNounce('Admin', 'module', ['modul' => 'wpsg_mod_kundenverwaltung', 'be_ajax' => 'su_index', 'k_id' => $_REQUEST['k_id']]);
-
-            	unset($_SESSION['wpsg']);
-
-                $this->login($_REQUEST['k_id']);
-                $kunde_data = $this->shop->cache->loadKunden($_REQUEST['k_id']);
-
-                $this->shop->addBackendMessage(wpsg_translate(__('Sie sind jetzt im Frontend als #1# #2# angemeldet.', 'wpsg'), $kunde_data['vorname'], $kunde_data['name']));
-                $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&action=index');
-                
-            }
+			}
 			
 		} // public function be_ajax()
@@ -165,7 +115,4 @@
 			
 			$this->shop->view['pages'] = $arPages;
-
-			$this->shop->view['arPageWithoutCreate'] = $arPages;
-			unset($this->shop->view['arPageWithoutCreate']['-1']);
 			
 			$this->shop->view['arRoles'] = get_option($wpdb->prefix."user_roles");
@@ -176,192 +123,93 @@
 		} // public function settings_edit()
 		
-		public function admin_setcapabilities() {
-		
-			$this->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/admin_setcapabilities.phtml');
-		
-		} // public function admin_setcapabilities()
-		
-		public function settings_save() {
-
-		    $this->shop->update_option('wpsg_mod_kundenverwaltung_perpage', $_REQUEST['wpsg_mod_kundenverwaltung_perpage'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutLogin', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutLogin'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutRegister', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutRegister'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_loginZwang', $_REQUEST['wpsg_mod_kundenverwaltung_loginZwang'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_preisAnzeige', $_REQUEST['wpsg_mod_kundenverwaltung_preisAnzeige'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_redirectlogin', $_REQUEST['wpsg_mod_kundenverwaltung_redirectlogin'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_redirectLogout', $_REQUEST['wpsg_mod_kundenverwaltung_redirectLogout'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_page_mod_kundenverwaltung_status', $_REQUEST['wpsg_page_mod_kundenverwaltung_status'], false, false, WPSG_SANITIZE_INT);
-
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_wpuser', $_REQUEST['wpsg_mod_kundenverwaltung_wpuser'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_wpuser_role', wpsg_xss($_REQUEST['wpsg_mod_kundenverwaltung_wpuser_role']));
-						
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_recaptcha_register', $_REQUEST['wpsg_mod_kundenverwaltung_recaptcha_register'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_kundenveraltung_recaptcha_key', $_REQUEST['wpsg_mod_kundenveraltung_recaptcha_key'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_kundenveraltung_recaptcha_secretkey', $_REQUEST['wpsg_mod_kundenveraltung_recaptcha_secretkey'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_recaptcha_dsgvo_layer', $_REQUEST['wpsg_mod_kundenverwaltung_recaptcha_dsgvo_layer'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_kundenverwaltung_mathcaptcha', $_REQUEST['wpsg_mod_kundenverwaltung_mathcaptcha'], false, false, WPSG_SANITIZE_CHECKBOX);
+		public function settings_save()
+		{
+
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_perpage', $_REQUEST['wpsg_mod_kundenverwaltung_perpage']); 
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutLogin', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutLogin']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutLogout', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutLogout']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutRegister', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutRegister']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand', $_REQUEST['wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_loginZwang', $_REQUEST['wpsg_mod_kundenverwaltung_loginZwang']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_redirectlogin', $_REQUEST['wpsg_mod_kundenverwaltung_redirectlogin']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_redirectLogout', $_REQUEST['wpsg_mod_kundenverwaltung_redirectLogout']);
+			$this->shop->update_option('wpsg_page_mod_kundenverwaltung_status', $_REQUEST['wpsg_page_mod_kundenverwaltung_status']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_onlylogin', $_REQUEST['wpsg_mod_kundenverwaltung_onlylogin']);
+
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_wpuser', $_REQUEST['wpsg_mod_kundenverwaltung_wpuser']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_wpuser_role', $_REQUEST['wpsg_mod_kundenverwaltung_wpuser_role']);
+			
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_aweber', $_REQUEST['wpsg_mod_kundenverwaltung_aweber']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_aweber_formid', $_REQUEST['wpsg_mod_kundenverwaltung_aweber_formid']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_aweber_listname', $_REQUEST['wpsg_mod_kundenverwaltung_aweber_listname']);
+			$this->shop->update_option('wpsg_mod_kundenverwaltung_aweber_metaAdtracking', $_REQUEST['wpsg_mod_kundenverwaltung_aweber_metaAdtracking']);
 			
 			$this->shop->createPage(__('Profil', 'wpsg'), 'wpsg_page_mod_kundenverwaltung_profil', $_REQUEST['wpsg_page_mod_kundenverwaltung_profil']);
 			$this->shop->createPage(__('Registrierung', 'wpsg'), 'wpsg_page_mod_kundenverwaltung_registrierung', $_REQUEST['wpsg_page_mod_kundenverwaltung_registrierung']);
 			$this->shop->createPage(__('Registrierung abgeschlossen', 'wpsg'), 'wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung', $_REQUEST['wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung']);
-			$this->shop->createPage(__('Passwort gesendet', 'wpsg'), 'wpsg_page_mod_kundenverwaltung_passwordsend', $_REQUEST['wpsg_page_mod_kundenverwaltung_passwordsend']);
 			$this->shop->createPage(__('Bestellungen', 'wpsg'), 'wpsg_page_mod_kundenverwaltung_order', $_REQUEST['wpsg_page_mod_kundenverwaltung_order']);
-			$this->shop->createPage(__('Abonnements', 'wpsg'), 'wpsg_page_mod_kundenverwaltung_abo', $_REQUEST['wpsg_page_mod_kundenverwaltung_abo']);
-			
+
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_kundenverwaltung_profil'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_kundenverwaltung_registrierung'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_kundenverwaltung_passwordsend'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_kundenverwaltung_order'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_kundenverwaltung_abo'));
-
-        } // public function wpsg_deinstall_sites()
-
-        public function wpsg_enqueue_scripts() { 
-		    
-		    $register_page = intval($this->shop->get_option('wpsg_page_mod_kundenverwaltung_registrierung'));
-            $wpsg_mod_kundenverwaltung_recaptcha_register = $this->shop->get_option('wpsg_mod_kundenverwaltung_recaptcha_register');
-		    
-		    if (wpsg_isSizedInt($wpsg_mod_kundenverwaltung_recaptcha_register ) && wpsg_isSizedInt($register_page) && \get_the_ID() === $register_page) {
-
-                \wp_enqueue_script('wpsg-recaptcha', 'https://www.google.com/recaptcha/api.js', false);
-                
-            } 
-		    
-        } // public function wpsg_enqueue_scripts()
-        
-        public function systemcheck(&$arData) {
-
-            $wpsg_mod_kundenverwaltung_recaptcha_register = $this->shop->get_option('wpsg_mod_kundenverwaltung_recaptcha_register');
-            $wpsg_mod_kundenveraltung_recaptcha_key = $this->shop->get_option('wpsg_mod_kundenveraltung_recaptcha_key');
-            $wpsg_mod_kundenveraltung_recaptcha_secretkey = $this->shop->get_option('wpsg_mod_kundenveraltung_recaptcha_secretkey');
-		    
-		    if ($wpsg_mod_kundenverwaltung_recaptcha_register === '1' && (!wpsg_isSizedString($wpsg_mod_kundenveraltung_recaptcha_key) || !wpsg_isSizedString($wpsg_mod_kundenveraltung_recaptcha_secretkey))) {
-
-                $arData[] = array(
-                    'wpsg_mod_kundenverwaltung_recaptcha',
-                    wpsg_ShopController::CHECK_ERROR,
-                    wpsg_translate(
-                        __('Die reCaptcha ÃberprÃŒfung ist in den Einstellungen aktiv, aber die Konfiguration ist nicht komplett. Bitte <a href="#1#">hier</a> konfigurieren.', 'wpsg'),
-                        WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung'
-                    )
-                );
-		        
-            }
-		    
-        } // public function systemcheck($arData)
-		            		
-		public function wpsg_add_pages($default_page)
-		{
-						
-			add_submenu_page($default_page, __("Kundenverwaltung", "wpsg"), __("Kundenverwaltung", "wpsg"), 'wpsg_kundenverwaltung', 'wpsg-Customer', array($this, 'dispatch'));
+		
+		public function admin_setcapabilities() { 
+			
+			$this->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/admin_setcapabilities.phtml');
+			
+		} // public function admin_setcapabilities()
+				
+		public function wpsg_add_pages()
+		{
+						
+			add_submenu_page('wpsg-Admin', __("Kundenverwaltung", "wpsg"), __("Kundenverwaltung", "wpsg"), 'wpsg_order', 'wpsg-Customer', array($this, 'dispatch'));
 			
 		} // public function wpsg_add_pages()
 
-		public function load()  {
-
-            if (is_admin()) {
-
-                if (wpsg_isSizedString($_REQUEST['wpsg_do'], 'setAccount') && !wpsg_isSizedArray($_REQUEST['customer'])) {
-
-                    $this->shop->addBackendError(__('Bitte mindestens einen Kunden wÃ€hlen.', 'wpsg'));
-                    $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer');
-                    
-                } else if (wpsg_isSizedString($_REQUEST['wpsg_do'], 'setAccount') && isset($_REQUEST['submit_do']) && !wpsg_isSizedInt($_REQUEST['set_target'])) {
-                    
-                    $this->shop->addBackendError(__('Kein Zielkunde ausgewÃ€hlt.', 'wpsg'));
-                    unset($_REQUEST['submit_do']);
-                    
-                } else if (isset($_REQUEST['submit_do'])) {
-
-                    // Hier die Kunden zusammenfÃŒhren, damit ich umleiten kann
-                    $nOrder = 0;
-                    
-                    foreach ($_REQUEST['customer'] as $customer_id)
-                    {
-                    
-                        if ($customer_id != $_REQUEST['set_target'])
-                        {
-                            
-                            $oCustomer = wpsg_customer::getInstance($customer_id);
-                            $nOrder += $oCustomer->getOrderCount();
-
-                            $this->db->UpdateQuery(WPSG_TBL_ORDER, array(
-                                'k_id' => wpsg_q($_REQUEST['set_target'])
-                            ), " `k_id` = '".wpsg_q($customer_id)."' ");
-                            
-                            $oCustomer->delete();
-                            
-                        }
-                        
-                    }
-                    
-                    $this->shop->addBackendMessage(wpsg_translate(__('#1# Bestellung(en) dem Kundenkonto zugeordnet.', 'wpsg'), $nOrder));
-                    $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer');
-                                        
-                }
-                
-            }
-            
+		public function load() 
+		{ 
+
+			require_once(dirname(__FILE__).'/mod_kundenverwaltung/wpsg_kundenverwaltung_widget.class.php');
+			add_action('widgets_init', create_function('', 'return register_widget("wpsg_kundenverwaltung_widget");'));
+			
 		} // public function load()
 		
-		public function dispatch() {
-						
-			if (wpsg_isSizedString($_REQUEST['action'], 'edit')) {
-				
-				wpsg_checkNounce('Customer', 'edit', ['edit_id' => $_REQUEST['edit_id']]);
-				
+		public function dispatch()
+		{
+						
+			if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'edit')
+			{
 				$this->be_editAction();
-				
-			} else if (wpsg_isSizedString($_REQUEST['action'], 'add')) {
-				
-				wpsg_checkNounce('Customer', 'add');
-				
+			}
+			else if ($_REQUEST['action'] == 'add')
+			{
 				$this->be_addAction();
-				
-			} else if (wpsg_isSizedString($_REQUEST['action'], 'export')) {
-				
-				wpsg_checkNounce('Customer', 'export');
-				
+			}
+			else if ($_REQUEST['action'] == 'export')
+			{
 				$this->be_exportAction();
-				
-			} else if (wpsg_isSizedString($_REQUEST['action'], 'import')) {
-				
-				wpsg_checkNounce('Customer', 'import');
-				
+			}
+			else if ($_REQUEST['action'] == 'import')
+			{
 				$this->be_importAction();
-				
-			} else if (wpsg_isSizedString($_REQUEST['action'], 'del')) {
-				
-				wpsg_checkNounce('Customer', 'del', ['edit_id' => $_REQUEST['edit_id']]);
-				
+			}
+			else if ($_REQUEST['action'] == 'del')
+			{
 				$this->be_delAction();
-				
-			} else if (wpsg_isSizedString($_REQUEST['action'], 'save')) {
-				
-				wpsg_checkNounce('Customer', 'save');
-				
+			}
+			else if ($_REQUEST['action'] == 'save')
+			{
 				$this->be_saveAction();
-				
-			} else {
-				
-				if (isset($_REQUEST['submit-button'])) wpsg_checkNounce('Customer', 'search');
-				
+			}
+			else
+			{
 				$this->be_indexAction();
-				
 			}
 			
 		} // public function dispatch()
 
-		public function checkCheckout(&$state, &$error, &$arCheckout) {
-			
-			if (isset($_REQUEST['wpsg_mod_kundenverwaltung_login'])) {
+		public function checkCheckout(&$state, &$error, &$arCheckout) 
+		{
+
+			if (isset($_REQUEST['wpsg_mod_kundenverwaltung_login']))
+			{
 											
 				// Error wird immer true, damit checkout2 nicht aufgerufen wird	
@@ -375,29 +223,25 @@
 								
 			}
-			else if ($state == 1) {
-
-				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_kundenverwaltung_wpuser'))) {
-					
-					$temp = wpsg_customer::find(array('email' => $arCheckout['email']));
-					$customer = array_shift($temp);
-					
-					if ($customer != null) {
-						
-						$curuser = get_current_user_id();
-						$wp_user_id = wpsg_getInt($customer->wp_user_id);
-						if (is_object($customer) && wpsg_isSizedInt($wp_user_id) && ($wp_user_id != $curuser || !wpsg_isSizedInt($curuser))) {
-							
-							// Es gibt einen Kunden mit dieser E-Mail Adresse, Die Wordpress User Kopplung ist aktiv und die ID des eingeloggten Benutzers stimmt nicht ÃŒberein
-							// Ich breche hier ab, da auch der Kunde sonst in Wordpress angemeldet werden sollte
-							
-							$this->shop->addFrontendError(__('Es gibt einen Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich erst an, bevor sie bestellen. (Auch im Wordpress)', 'wpsg'));
-							$_SESSION['wpsg']['errorFields'][] = 'email';
-							$error = true;
-							
-							$_REQUEST['wpsg_checkout'] = 1;
-							
-							return;
-							
-						}
+			else if ($state == 1)
+			{
+
+				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_kundenverwaltung_wpuser')))
+				{
+					
+					$customer = array_shift(wpsg_customer::find(array('email' => $arCheckout['email'])));
+					
+					if (is_object($customer) && ($customer->wp_user_id != get_current_user_id() || !wpsg_isSizedInt(get_current_user_id())))
+					{
+						
+						// Es gibt einen Kunden mit dieser E-Mail Adresse, Die Wordpress User Kopplung ist aktiv und die ID des eingeloggten Benutzers stimmt nicht ÃŒberein
+						// Ich breche hier ab, da auch der Kunde sonst in Wordpress angemeldet werden sollte
+						
+						$this->shop->addFrontendError(__('Es gibt einen Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich erst an, bevor sie bestellen. (Auch im Wordpress)', 'wpsg'));
+						$_SESSION['wpsg']['errorFields'][] = 'email';						
+						$error = true;
+						
+						$_REQUEST['wpsg_checkout'] = 1;
+						
+						return;
 						
 					}
@@ -405,8 +249,9 @@
 				}
 				
-				if (isset($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd1']) && isset($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd2'])) {
+				if (isset($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd1']) && isset($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd2']))
+				{
 										
 					// Registrierungszwang und leer
-					if ((isset($_REQUEST['wpsg_mod_kundenverwaltung_register']) || $this->shop->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') && trim($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd1']) == '' && $_REQUEST['wpsg']['mod_kundenverwaltung']['pwd2'] == '')
+					if ((isset($_REQUEST['wpsg_mod_kundenverwaltung_register']) || $this->shop->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1') && trim($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd1']) == '' && $_REQUEST['wpsg']['mod_kundenverwaltung']['pwd2'] == '')
 					{
 						
@@ -422,5 +267,5 @@
 					}
 
-					// Angabe in Feld1 aber ungleich Feld2
+					// Angabe in Feld1 aber undgleich Feld2
 					if ($_REQUEST['wpsg']['mod_kundenverwaltung']['pwd1'] != $_REQUEST['wpsg']['mod_kundenverwaltung']['pwd2'] && $_REQUEST['wpsg']['mod_kundenverwaltung']['pwd1'] != '')
 					{	
@@ -454,6 +299,4 @@
 					{
 						
-						$arCheckout['email'] = strtolower($arCheckout['email']);
-						
 						$user = get_user_by('login', $arCheckout['email']);
 						
@@ -474,34 +317,15 @@
 					
 					// Kunde ist nicht eingeloggt
-					if ($this->shop->get_option('wpsg_mod_kundenverwaltung_loginZwang') == '1') {
+					if ($this->shop->get_option('wpsg_mod_kundenverwaltung_loginZwang') == '1')
+					{
 					
 						$kunde_id = $this->db->fetchOne("SELECT K.`id` FROM `".WPSG_TBL_KU."` AS K WHERE K.`email` = '".wpsg_q($arCheckout['email'])."'");
 						
-						// Die KundenID der TemporÃ€ren Bestellung muss hier ausgeschlossen werden, da man sonst nicht weiterkommt
-						$temp_customer_id = $this->db->fetchOne("SELECT `k_id` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_SESSION['wpsg']['order_id'])."' ");
-						
-						$strQuery = "
-							SELECT 
-								K.`id` 
-							FROM 
-								`".WPSG_TBL_KU."` AS K 
-							WHERE 
-								K.`email` = '".wpsg_q($arCheckout['email'])."' AND
-								K.`id` != '".wpsg_q($temp_customer_id)."' AND
-								K.`deleted` != '1'  
-						";
-						 
-						$kunde_id = $this->db->fetchOne($strQuery);
-						
-						if ($kunde_id > 0) {
-
-						    // !!!!
+						if ($kunde_id > 0)
+						{
+				 
 							$this->shop->addFrontendError(__('Ein Kunde mit dieser E-Mail Adresse existiert bereits, bitte loggen Sie sich ein oder fordern Sie ein neues Passwort an!', 'wpsg'));
 							
 							$_SESSION['wpsg']['errorFields'][] = 'email';
-							
-							unset($_SESSION['wpsg']['checkout']['email']);
-							unset($_SESSION['wpsg']['checkout']['email2']);
-							unset($_SESSION['wpsg']['checkout']['id']);
 							
 							$error = true; 
@@ -518,5 +342,5 @@
 					$kunde_mail = $this->db->fetchOne("SELECT K.`email` FROM `".WPSG_TBL_KU."` AS K WHERE K.`id` = '".wpsg_q($arCheckout['id'])."'");
 
-					if (strtolower($kunde_mail) != strtolower($arCheckout['email']))
+					if ($kunde_mail != $arCheckout['email'])
 					{
 						
@@ -567,25 +391,4 @@
 					
 				}
-
-                if (isset($_REQUEST['wpsg_mod_kundenverwaltung_register']) && $this->shop->get_option('wpsg_mod_kundenverwaltung_recaptcha_register') === '1') {
-						
-                    $verify_wp = \wp_remote_post('https://www.google.com/recaptcha/api/siteverify', [
-                    	'body' => http_build_query([
-							'secret' => $this->shop->get_option('wpsg_mod_kundenveraltung_recaptcha_secretkey'),
-							'response' => $_REQUEST["g-recaptcha-response"]
-						])
-					]);
-	
-					$captcha_success = @json_decode($verify_wp['body']);
-                    
-                    if (!is_object($captcha_success) || $captcha_success->success !== true) {
-
-                        $this->shop->addFrontendError(__('Bitte bestÃ€tigen Sie, dass Sie kein Bot sind.', 'wpsg'));
-                        $_SESSION['wpsg']['errorFields'][] = 'mod_kundenverwaltung_recaptcha';
-						$error = true;
-                        
-                    }
-                    
-                }
 				
 			}
@@ -593,28 +396,66 @@
 		} // public function checkCheckout(&$state, &$error)
 		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) {
-			
-			if ($finish_order) return;
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
+		{ 
+			
+			if ($finish_order !== true) return;
 			
 			// Wenn Wordpress User gekoppelt sind, dann auch den Wordpress User einloggen
 			if ($this->shop->get_option('wpsg_mod_kundenverwaltung_wpuser') == '1')
 			{
-				
+			
 				if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['id']))
 				{
-					
+					 
 					$this->login($_SESSION['wpsg']['checkout']['id'], $_SESSION['wpsg']['checkout']['email'], $_SESSION['wpsg']['checkout']['password']);
 					
 				}
-				
-			}
-			
-		} 
-		
-		public function basket_save_kunde(&$data, &$checkout) { 
+			
+			}
+			
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
+		public function basket_save_kunde(&$data, &$checkout) 
+		{ 
  
 			// Passwort nur Ã€ndern wenn etwas drin steht. Validierung erfolgt an anderer Stelle, aber auch leeres Passwort ist unter umstÃ€nden valid
 			if (wpsg_isSizedString($checkout['password'])) $data['passwort_saltmd5'] = wpsg_q($this->hashString($checkout['password']));
-							
+						
+			if ($this->shop->get_option("wpsg_mod_kundenverwaltung_aweber") == "1")
+			{
+			
+				// Anfrage an aWeber starten
+				$fields = array(
+					"meta_web_form_id" => $this->shop->get_option("wpsg_mod_kundenverwaltung_aweber_formid"),
+					"meta_split_id" => "",
+					"listname" => $this->shop->get_option("wpsg_mod_kundenverwaltung_aweber_listname"),
+					"redirect" => "",
+					"meta_adtracking" => $this->shop->get_option("wpsg_mod_kundenverwaltung_aweber_metaAdtracking"),
+					"meta_message" => "1",
+					"meta_required" => "name,email",
+					"meta_tooltip" => "",
+					"name" => $data['vname'].' '.$data['name'],
+					"email" => $data['email']					
+				);
+				
+				foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
+				rtrim($fields_string,'&');
+				
+				$url = 'http://www.aweber.com/scripts/addlead.pl';
+				
+				$ch = curl_init($url);				
+				curl_setopt($ch, CURLOPT_URL, $url);				
+			    curl_setopt($ch, CURLOPT_POST, sizeof($fields));
+				curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
+				curl_setopt($ch, CURLOPT_TIMEOUT, 2);
+				curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
+				
+				ob_start();
+			    $result = curl_exec($ch);
+			    curl_close ($ch);
+			    ob_end_clean();
+			    
+			}
+			
 		} // public function basket_save_kunde(&$data)
 
@@ -654,5 +495,5 @@
 		} // public function admin_emailconf()
 		
-		public function template_redirect() 
+		public function wp_loaded() 
 		{ 
 			
@@ -662,5 +503,4 @@
 				
 				$_SESSION['wpsg']['errorFields'] = array();
-				$_REQUEST['wpsg']['mod_kundenverwaltung']['email'] = strtolower($_REQUEST['wpsg']['mod_kundenverwaltung']['email']);
 				
 				if (trim($_REQUEST['wpsg']['mod_kundenverwaltung']['password']) == '' || trim($_REQUEST['wpsg']['mod_kundenverwaltung']['email']) == '')
@@ -678,6 +518,7 @@
 								
 					$pwd_hash = $this->hashString($_REQUEST['wpsg']['mod_kundenverwaltung']['password']);
-
-					$strQuery = "
+					
+					// Versuchen den Kunden zu laden
+					$kunde_id = $this->db->fetchOne("
 						SELECT
 							K.`id`
@@ -686,13 +527,9 @@
 						WHERE
 							K.`email` = '".wpsg_q($_REQUEST['wpsg']['mod_kundenverwaltung']['email'])."' AND
-							K.`passwort_saltmd5` = '".wpsg_q($pwd_hash)."' AND
-							K.`deleted` != '1' AND
-							K.`status` != '0' AND K.`status` != '-1'
-					";
-
-					// Versuchen den Kunden zu laden
-					$kunde_id = $this->db->fetchOne($strQuery);
+							K.`passwort_saltmd5` = '".wpsg_q($pwd_hash)."' 
+					");
 										
-					if ($kunde_id > 0)  {
+					if ($kunde_id > 0) 
+					{
 						
 						$this->login(
@@ -704,5 +541,7 @@
 						$this->shop->addFrontendMessage(__('Sie wurden erfolgreich angemeldet.', 'wpsg'));
 						
-					} else {
+					}
+					else 
+					{
 					
 						$this->shop->addFrontendError(__('Es wurde kein Kunde mit diesen Zugangsdaten gefunden!', 'wpsg'));
@@ -727,23 +566,16 @@
 				{
 				
-					// Wenn im Backend ID > 0 eingestellt ist und die Seite existiert
-					if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectlogin')) && is_page($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectlogin')))
-					{
-												
-						$this->shop->redirect(get_permalink($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectlogin')));
-						
-					} 
-					else if (wpsg_isSizedString($_REQUEST['wpsg_referer']))
-					{
-						
+					if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectlogin')) && $this->shop->get_option('wpsg_mod_kundenverwaltung_redirectlogin') == '1' && wpsg_isSizedString($_REQUEST['wpsg_referer']))
+					{
+
 						$this->shop->redirect($_REQUEST['wpsg_referer']);
 						
-					} 
-					else 
-					{
-						
+					}
+					else
+					{
+					
 						$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_PROFIL));
 						
-					} 
+					}
 				
 				}
@@ -754,21 +586,10 @@
 				
 				/** Link in einer E-Mail zur Passwortanfrage wurde gedrÃŒckt */
-				$kunde = $this->db->fetchRow("
-					SELECT 
-						K.* 
-					FROM 
-						`".WPSG_TBL_KU."` AS K 
-					WHERE
-						K.`email` = '".wpsg_q($_REQUEST['email'])."' AND 
-						K.`deleted` = '0' AND
-						K.`status` = '1'
-				");
-				
+				$kunde = $this->db->fetchRow("SELECT K.* FROM `".WPSG_TBL_KU."` AS K WHERE K.`email` = '".wpsg_q($_REQUEST['email'])."'");
 				$hash_gen = $this->hashString($kunde['id']);
 				
-				if ($hash_gen == $_REQUEST['hash'] && $kunde['id'] > 0) {
-
-					$oCustomer = wpsg_customer::getInstance(intval($kunde['id']));
-
+				if ($hash_gen == $_REQUEST['hash'] && $kunde['id'] > 0)
+				{
+					
 					// Passwort generieren
 					$new_pwd = $this->createPasswort(10);
@@ -780,5 +601,4 @@
 					
 					$this->shop->view['kunde'] = $kunde;
-					$this->shop->view['oCustomer'] = $oCustomer;
 					
 					$this->shop->callMods('customer_updatePwd', array(&$kunde['id'], &$new_pwd));
@@ -786,9 +606,12 @@
 					$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/mail_pwdsend.phtml', false);
 											
-					if ($this->shop->get_option('wpsg_htmlmail') === '1') {
+					if ($this->shop->get_option('wpsg_htmlmail') === '1')
+					{
 						
 						$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml', false);
 						
-					} else {
+					}
+					else
+					{
 						
 						$mail_html = false;
@@ -808,6 +631,5 @@
 				}
 				
-				//$this->shop->redirect($this->getPwdVergessenURL());
-				$this->shop->redirect($this->getProfilURL());
+				$this->shop->redirect($this->getPwdVergessenURL()); 
 				
 			}
@@ -826,11 +648,9 @@
 				{
 
-					$kunde = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_KU."` AS K WHERE K.`email` = '".wpsg_q($_REQUEST['wpsg']['sendpwd']['email'])."' AND K.`deleted` = 0");
-
-					if ($kunde['id'] > 0) {
-
-						$oCustomer = wpsg_customer::getInstance($kunde['id']);
-
-						$this->shop->view['oCustomer'] = $oCustomer;
+					$kunde = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_KU."` AS K WHERE K.`email` = '".wpsg_q($_REQUEST['wpsg']['sendpwd']['email'])."'");
+					
+					if ($kunde['id'] > 0)
+					{
+						
 						$this->shop->view['kunde'] = $kunde;
 						$this->shop->view['strLink'] = html_entity_decode($this->getPwdVergessenURL().'&hash='.$this->hashString($kunde['id']).'&email='.$kunde['email']);												
@@ -838,9 +658,12 @@
 						$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/mail_pwdrequest.phtml', false);						
 						
-						if ($this->shop->get_option('wpsg_htmlmail') === '1') {
+						if ($this->shop->get_option('wpsg_htmlmail') === '1')
+						{
 							
 							$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml', false);
 							
-						} else {
+						}
+						else
+						{
 							
 							$mail_html = false;
@@ -851,6 +674,5 @@
 
 						$this->shop->addFrontendMessage(__('Ein Link zur Generierung eines neuen Passwortes wurde Ihnen zugesendet. ÃberprÃŒfen Sie bitte Ihr Postfach.', 'wpsg'));
-						$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_PROFIL));
-
+						
 					}
 					else
@@ -864,19 +686,21 @@
 				}
 				 
-				$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_LOSTPWD));
+				$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_PROFIL)); 
 				
 			}
 			else if (isset($_REQUEST['wpsg_mod_kundenverwaltung_register']))
 			{
-				 
+				
 				/** Wird aufgerufen wenn sich ein Kunde registrieren mÃ¶chte. */
 				$this->shop->checkEscape();
 								
-				 $_REQUEST['wpsg']['register'] = wpsg_xss($_REQUEST['wpsg']['register']);
-				
 				$basket = new wpsg_basket();				
 				$basket->arCheckout = $_REQUEST['wpsg']['register'];
-								
-				if ($basket->checkCheckout(1)) {
+				
+				// Ich speichere die Angaben schon im Checkout
+				$_SESSION['wpsg']['checkout'] = wpsg_xss($basket->arCheckout);
+				
+				if ($basket->checkCheckout(1))
+				{
  					
 					// Alles OK
@@ -902,5 +726,6 @@
 		
 					// Kundengruppe fÃŒr Checkout
-					if ($this->shop->hasMod('wpsg_mod_customergroup')) {
+					if ($this->shop->hasMod('wpsg_mod_customergroup'))
+					{
 					
 						if ($this->shop->get_option('wpsg_page_mod_kundenverwaltung_group_register') > 0) $kunde_data['group_id'] = $this->shop->get_option('wpsg_page_mod_kundenverwaltung_group_register');
@@ -908,35 +733,7 @@
 					}
 					
-					$kunde_data['email'] = strtolower($kunde_data['email']);
-					unset($kunde_data['payment']);
-						
-					// Kundendaten/Adressdaten trennen
-					$adata = Array();
-					$adata['cdate'] = 'NOW()';
-					$adata['title'] = wpsg_getStr($kunde_data['title']);
-					$adata['name'] = wpsg_getStr($kunde_data['name']);
-					$adata['vname'] = wpsg_getStr($kunde_data['vname']);
-					$adata['firma'] = wpsg_getStr($kunde_data['firma']);
-					$adata['fax'] = wpsg_getStr($kunde_data['fax']);
-					$adata['strasse'] = wpsg_getStr($kunde_data['strasse']);
-					$adata['nr'] = wpsg_getStr($kunde_data['nr']);
-					$adata['plz'] = wpsg_getStr($kunde_data['plz']);
-					$adata['ort'] = wpsg_getStr($kunde_data['ort']);
-					$adata['land'] = wpsg_getStr($kunde_data['land']);
-					$adata['tel'] = wpsg_getStr($kunde_data['tel']);
-					
-					$kdata = Array();
-					$kdata['email'] = wpsg_getStr($kunde_data['email']);
-					$kdata['ustidnr'] = wpsg_getStr($kunde_data['ustidnr']);
-					$kdata['geb'] = wpsg_getStr($kunde_data['geb']);
-					$kdata['id'] = $kunde_data['id'];
-					$kdata['passwort_saltmd5'] = $kunde_data['passwort_saltmd5'];
-					$kdata['custom'] = $kunde_data['custom'];
-						
-					$kdata['adress_id'] = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adata);
-					$kunde_id = $this->db->ImportQuery(WPSG_TBL_KU, $kdata);
+					$kunde_id = $this->db->ImportQuery(WPSG_TBL_KU, $kunde_data);
 					$knr = $this->shop->buildKNR($kunde_id);
 
-					$this->shop->cache->clearKundenCache($kunde_id);
 					$this->shop->callMods('customer_created', array(&$kunde_id, &$pwd));
 					
@@ -947,6 +744,4 @@
 					 
 					$this->registerMail($kunde_data);
-
-					\delete_transient('wpsg_mod_kundenverwaltung_mathcaptcha_result');
 					
 					//$_SESSION['wpsg']['checkout']['id'] = wpsg_xss($kunde_id); *** ersetzt um den WP-User anzumelden ***
@@ -965,9 +760,11 @@
 				}
 				
-			} else if (isset($_REQUEST['wpsg_mod_kundenverwaltung_save'])) {
-			 
+			}
+			else if (isset($_REQUEST['wpsg_mod_kundenverwaltung_save']))
+			{
+				
 				/** Wird beim speichern des Profils aufgerufen */
 				$this->shop->checkEscape();
-				 
+				
 				$kunde_id = $_SESSION['wpsg']['checkout']['id'];
 				
@@ -977,7 +774,4 @@
 				// Ich simuliere hier die PrÃŒfung im Checkout, um doppel Implementation zu vermeiden
 				$basket = new wpsg_basket();				
-				
-				$_REQUEST['wpsg']['profil'] = wpsg_xss($_REQUEST['wpsg']['profil']);
-				
 				$basket->arCheckout = $_REQUEST['wpsg']['profil'];
 				$basket->arCheckout['id'] = $kunde_id;	
@@ -1008,7 +802,5 @@
 							{
 								
-								$curuser = get_current_user_id();
-								$wp_user_id = $oCustomer->wp_user_id;
-								if (!wpsg_isSizedInt($curuser) || $curuser != $wp_user_id)
+								if (!wpsg_isSizedInt(get_current_user_id()) || get_current_user_id() != $oCustomer->wp_user_id)
 								{
 							
@@ -1052,34 +844,5 @@
 					 					
 					$kunde_data = wpsg_q($kunde_data);
-					unset($kunde_data['payment']);
-					
-					$adata['cdate'] = 'NOW()';
-					$adata['title'] = wpsg_getStr($kunde_data['title']); unset($kunde_data['title']);
-					$adata['name'] = wpsg_getStr($kunde_data['name']); unset($kunde_data['name']);
-					$adata['vname'] = wpsg_getStr($kunde_data['vname']); unset($kunde_data['vname']);
-					$adata['firma'] = wpsg_getStr($kunde_data['firma']); unset($kunde_data['firma']);
-					$adata['fax'] = wpsg_getStr($kunde_data['fax']); unset($kunde_data['fax']);
-					$adata['strasse'] = wpsg_getStr($kunde_data['strasse']); unset($kunde_data['strasse']);
-					$adata['nr'] = wpsg_getStr($kunde_data['nr']); unset($kunde_data['nr']);
-					$adata['plz'] = wpsg_getStr($kunde_data['plz']); unset($kunde_data['plz']);
-					$adata['ort'] = wpsg_getStr($kunde_data['ort']); unset($kunde_data['ort']);
-					$adata['land'] = wpsg_getStr($kunde_data['land']); unset($kunde_data['land']);
-					$adata['tel'] = wpsg_getStr($kunde_data['tel']); unset($kunde_data['tel']);
-					
-					$a = $this->db->fetchRow("
-						SELECT
-							`adress_id`
-						FROM
-							`".WPSG_TBL_KU."`
-						WHERE
-							`id` = '".wpsg_q($kunde_id)."'
-					");
-					$kunde_data['adress_id'] = $a['adress_id'];
-					
-					if ($a['adress_id'] == 0)
-						$kunde_data['adress_id'] = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adata);
-					else
-						$this->db->UpdateQuery(WPSG_TBL_ADRESS, $adata, "`id` = '".wpsg_q($a['adress_id'])."'");
-								
+					
 					$this->db->UpdateQuery(WPSG_TBL_KU, $kunde_data, "`id` = '".wpsg_q($kunde_id)."'");
 					
@@ -1099,13 +862,7 @@
 				$this->logout();
 				
-				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectLogout')))
-				{
-					
-					$this->shop->redirect(get_permalink($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectLogout')));
-					
-				}
-				else if (wpsg_isSizedString($_REQUEST['wpsg_referer']))
-				{
-					
+				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_kundenverwaltung_redirectLogout')) && $this->shop->get_option('wpsg_mod_kundenverwaltung_redirectLogout') == '1' && wpsg_isSizedString($_REQUEST['wpsg_referer']))
+				{
+
 					$this->shop->redirect($_REQUEST['wpsg_referer']);
 					
@@ -1113,5 +870,5 @@
 				else
 				{
-					
+				
 					$this->shop->redirect($this->getProfilURL());
 					
@@ -1120,12 +877,12 @@
 			}
 			
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function content_filter(&$content) 
 		{
 			
-			if (wpsg_get_the_id() <= 0) return;
-            
-			if (wpsg_get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_profil'))
+			if (get_the_id() <= 0) return;
+			
+			if (get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_profil'))
 			{
 								
@@ -1135,8 +892,7 @@
 					
 					$kunde = $this->shop->cache->loadKunden($this->isLoggedIn());
-					$kunde['geb'] = wpsg_fromDate($kunde['geb']);
-						
-					$this->shop->view['data'] = array_merge($_SESSION['wpsg']['checkout'], $kunde);
-					$this->shop->view['error'] = wpsg_getArray($_SESSION['wpsg']['errorFields']);
+										
+					$this->shop->view['data'] = $_SESSION['wpsg']['checkout'];
+					$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];					
 					$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
 					$this->shop->view['custom_values'] = @unserialize($kunde['custom']);
@@ -1147,10 +903,8 @@
 					foreach ((array)$this->shop->view['pflicht']['custom'] as $k => $v)
 					{
-
-                        $this->shop->view['data']['custom'][$k] = '';
-
-                        if (isset($this->shop->view['custom_values'][$k])) $this->shop->view['data']['custom'][$k] = wpsg_getStr($this->shop->view['custom_values'][$k]);
-
-                    }
+						
+						$this->shop->view['data']['custom'][$k] = $this->shop->view['custom_values'][$k];						
+						
+					}
 					
 					$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/profil.phtml', false);
@@ -1175,40 +929,5 @@
 				
 			}
-			
-			else if (wpsg_get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_abo') && $this->shop->hasMod('wpsg_mod_abo')) {
-
-                // Eingelogt
-                if ($this->isLoggedIn() > 0) {
-			    
-                    $this->shop->view['arOrder'] = wpsg_order::find(Array(
-                        'k_id' => $_SESSION['wpsg']['checkout']['id'],
-                        'NOTstatus' => wpsg_ShopController::STATUS_UNVOLLSTAENDIG
-                    ));
-                    
-                    // Jetzt noch normale Bestellungen rausfiltern
-                    foreach ($this->shop->view['arOrder'] as $k => $oOrder) {
-                        
-                        if ($this->shop->callMod('wpsg_mod_abo', 'isAboOrder', Array($oOrder->id)) !== 1) {
-                            
-                            unset($this->shop->view['arOrder'][$k]);
-                            
-                        }
-                        
-                    }
-                    
-				    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_abo/page_abo.phtml');
-
-                } else {
-
-                    $this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
-                    $content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/login.phtml', false);
-
-                }
-
-                return -2;
-			
-			}	
-						
-			else if (wpsg_get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_registrierung'))
+			else if (get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_registrierung'))
 			{
 				
@@ -1226,5 +945,5 @@
 					{
 						
-						$this->shop->view['error'] = wpsg_getArray($_SESSION['wpsg']['errorFields']);
+						$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
 						$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
 						
@@ -1247,5 +966,5 @@
 						
 						$this->shop->view['data'] = $_SESSION['wpsg']['checkout'];
-						$this->shop->view['error'] = wpsg_getArray($_SESSION['wpsg']['errorFields']);
+						$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];					
 						$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
 						$this->shop->view['laender'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `name` ASC");
@@ -1258,5 +977,5 @@
 				
 			}
-			else if (wpsg_get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_order'))
+			else if (get_the_id() == $this->shop->get_option('wpsg_page_mod_kundenverwaltung_order'))
 			{
 				
@@ -1275,6 +994,4 @@
 						 	`cdate` DESC
 					");
-
-					$strQuerySELECT = "";
 					
 					// Aufwerten
@@ -1282,5 +999,5 @@
 					{
 						
-						if ($this->shop->hasMod('wpsg_mod_productvariants'))
+						if ($this->shop->hasMod('wpsg_mod_varianten'))
 						{
 							
@@ -1291,5 +1008,5 @@
 						$arProdukt = $this->db->fetchAssoc("
 							SELECT
-								OP.`price` AS `price`, OP.`p_id`,
+								(OP.`price` * OP.`menge`) AS `price`, OP.`p_id`,
 								OP.`menge`,
 								OP.`productkey`,
@@ -1308,8 +1025,8 @@
 						foreach ($arProdukt as $k2 => $v2)
 						{
-
+							
 							$produkt = $this->shop->loadProduktArray($v2['p_id']);
 							
-							if ($this->shop->hasMod('wpsg_mod_productvariants'))
+							if ($this->shop->hasMod('wpsg_mod_varianten'))
 							{
 								
@@ -1366,6 +1083,5 @@
 				$kunde_data = $this->shop->cache->loadKunden($customer_id);
 				
-				$curuser = get_current_user_id();
-				if ($curuser == $kunde_data['wp_user_id'] && wpsg_isSizedInt($curuser))
+				if (get_current_user_id() == $kunde_data['wp_user_id'] && wpsg_isSizedInt(get_current_user_id()))
 				{
 				
@@ -1386,5 +1102,4 @@
 				
 				$kunde_data = $this->shop->cache->loadKunden($kunde_id);
-				if ($kunde_data['email'] == '') return false;
 				
 				$wp_user_id = wp_create_user($kunde_data['email'], $pwd, $kunde_data['email']);
@@ -1413,5 +1128,10 @@
 																
 				}
-				else if (!wpsg_isSizedInt($wp_user_id)) throw new \wpsg\Exception(__('Beim Anlegen des Wordpress Nutzers gab es eine unerwartete RÃŒckgabe', 'wpsg'));
+				else if (!wpsg_isSizedInt($wp_user_id))
+				{
+
+					$this->shop->throwErrorCode('100_4');
+					
+				}
 				else
 				{
@@ -1425,5 +1145,5 @@
 		} // public function customer_created($kunde_id, $pwd)
 		
-		public function customer_delete_pre(&$customer_id, $delete) 
+		public function customer_delete_pre(&$customer_id) 
 		{ 
 			
@@ -1433,6 +1153,5 @@
 				$kunde_data = $this->shop->cache->loadKunden($customer_id);
 				
-				if (wpsg_isSizedInt($kunde_data['wp_user_id']) && ($delete == 'delete')) 
-					wp_delete_user($kunde_data['wp_user_id']);
+				if (wpsg_isSizedInt($kunde_data['wp_user_id'])) wp_delete_user($kunde_data['wp_user_id']);
 				
 			}
@@ -1503,16 +1222,4 @@
 		} // public function getRegisteredRedirectURL()
 		 
-		/**
-		 * Gibt die URL auf die Passwort-gesendet-Seit zurÃŒck
-		 */
-		public function getPasswordsendURL()
-		{
-		
-			$page_url = get_permalink($this->shop->get_option('wpsg_mod_kundenverwaltung_passwordsend'));
-		
-			return $page_url;
-		
-		} // public function getProfilURL()
-		
 		/**
 		 * Gibt die URL auf die Registrierungsseite zurÃŒck
@@ -1610,40 +1317,7 @@
 		{
 			
-			// Export WPSG_TBL_KU und WPSG_TBL_ADRESS
-			//$arData = $this->db->fetchAssoc("SELECT * FROM `".wpsg_q(WPSG_TBL_KU)."` ");
-			/*
-			$arData = $this->db->fetchAssoc("
-					SELECT
-						C.*, CA.*, C.`id` AS 'kid'
-					FROM
-						`".WPSG_TBL_KU."` AS C
-						 	LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = C.`adress_id`)
-				");
-			*/
-			
-			$arData = $this->db->fetchAssoc("
-				SELECT
-					C.*, C.`id` AS kid, 
-					CA.`title` AS `title`,
-					CA.`name` AS `name`,
-					CA.`vname` AS `vname`,
-					CA.`firma` AS `firma`,
-					CA.`fax` AS `fax`,
-					CA.`strasse` AS `strasse`,
-					CA.`nr` AS `nr`,
-					CA.`plz` AS `plz`,
-					CA.`ort` AS `ort`,
-					CA.`land` AS `land`,
-					CA.`tel` AS `tel`,
-					CA.`id`
-			  	FROM
-			  		`".wpsg_q(WPSG_TBL_KU)."` AS C
-			  		 	LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = C.`adress_id`)
-				WHERE
-					C.`deleted` != '1' AND
-					C.`email` != ''
-			");
-			
-			if (!wpsg_isSizedArray($arData)) { $this->shop->addBackendError(__('Keine Daten zum Exportieren vorhanden.', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&amp;action=index'); return; }
+			$arData = $this->db->fetchAssoc("SELECT * FROM `".wpsg_q(WPSG_TBL_KU)."` ");
+			
+			if (!wpsg_isSizedArray($arData)) { $this->addBackendError(__('Keine Daten zum Exportieren vorhanden.', 'wpsg')); $this->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&amp;action=index'); return; }
 						
 			$mb = new wpsg_mod_basic();
@@ -1651,5 +1325,5 @@
 			
 			$fp = fopen($path.'/wpsg_customerexport.csv', 'w');
-			fputcsv($fp, array_keys($arData[0]), ',');
+			fputcsv($fp, array_keys($arData[0]));;
 			foreach ($arData as $e)
 			{
@@ -1660,11 +1334,6 @@
 					foreach ($e as $k => $v) { $e[$k] = preg_replace('/\r|\n/', '', $v); }										
 				}
-				foreach ($e as $k => $v) {
-					if (($k == 'budget') || ($k == 'wpsg_mod_statistics_long') || ($k == 'wpsg_mod_statistics_lat'))
-						$e[$k] = str_replace('.', ',', $e[$k]);
-				}
 				
 				fputcsv($fp, $e, ',', '"');
-				//fputcsv($fp, $e, ';', '"');
 				
 			}
@@ -1687,5 +1356,5 @@
 		private function be_importAction()
 		{
-			// Import WPSG_TBL_KU und WPSG_TBL_ADRESS
+			
 			if (isset($_REQUEST['wpsg_import']) && file_exists($_FILES['wpsg_importfile']['tmp_name']))
 			{
@@ -1711,55 +1380,19 @@
 						}
 
-						//if ($data['id'] <= 0) unset($data['id']);
-
-						// Daten splitten in Kunden und Adresse
-						// K: knr,paypal_payer_id,email,geb,ustidnr,custom,wpsg_mod_statistics_long,wpsg_mod_statistics_lat,
-						// adress_id,passwort_saltmd5,comment,wp_user_id,status,group_id,budget,kid
-						$kdata['id'] = $data['kid'];
-						$kdata['knr'] = wpsg_q($data['knr']);
-						$kdata['paypal_payer_id'] = wpsg_q($data['paypal_payer_id']);
-						$kdata['email'] = wpsg_q($data['email']);
-						$kdata['geb'] = wpsg_q($data['geb']);
-						$kdata['ustidnr'] = wpsg_q($data['ustidnr']);
-						$kdata['custom'] = wpsg_q($data['custom']);
-						$kdata['wpsg_mod_statistics_long'] = wpsg_q(str_replace(',', '.', $data['wpsg_mod_statistics_long']));
-						$kdata['wpsg_mod_statistics_lat'] = wpsg_q(str_replace(',', '.', $data['wpsg_mod_statistics_lat']));
-						$kdata['adress_id'] = wpsg_q($data['adress_id']);
-						$kdata['passwort_saltmd5'] = wpsg_q($data['passwort_saltmd5']);
-						$kdata['comment'] = wpsg_q($data['comment']);
-						$kdata['wp_user_id'] = wpsg_q($data['wp_user_id']);
-						$kdata['status'] = wpsg_q($data['status']);
-						$kdata['group_id'] = wpsg_q($data['group_id']);
-						$kdata['budget'] = wpsg_q(str_replace(',', '.', $data['budget']));
-						
-						// A: id,title,name,vname,firma,fax,strasse,plz,ort,land,tel,cdate,nr
-						$adata['id'] = $data['id'];
-						$adata['title'] = $data['title'];
-						$adata['name'] = wpsg_q($data['name']);
-						$adata['vname'] = wpsg_q($data['vname']);
-						$adata['firma'] = wpsg_q($data['firma']);
-						$adata['fax'] = wpsg_q($data['fax']);
-						$adata['strasse'] = wpsg_q($data['strasse']);
-						$adata['plz'] = wpsg_q($data['plz']);
-						$adata['ort'] = wpsg_q($data['ort']);
-						$adata['land'] = $data['land'];
-						$adata['tel'] = wpsg_q($data['tel']);
-						$adata['cdate'] = 'NOW()';
-						$adata['nr'] = wpsg_q($data['nr']);
+						if ($data['id'] <= 0) unset($data['id']);
 						
 						// Alte Sachen lÃ¶sche ich vor dem Import mit der Ãbergebenen ID !
 						
-						$this->shop->callMods('customer_delete_pre', array(&$kdata['id'], 'no'));
+						$this->shop->callMods('customer_delete_pre', array(&$data['id']));
 						
 						// Kunden lÃ¶schen
-						$this->db->Query("DELETE FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($kdata['id'])."'");
-						$this->db->Query("DELETE FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($adata['id'])."'");
-						
+						$this->db->Query("DELETE FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($data['id'])."'");
+												
 						$nImported ++;
 	 
-						$k_id = $this->db->importQuery(WPSG_TBL_KU, wpsg_q($kdata), true);
-						if ($kdata['adress_id'] > 0)
-							$a_id = $this->db->importQuery(WPSG_TBL_ADRESS, wpsg_q($adata), true);
-						
+						$data_import = $data;
+						 
+						$pNeu_id = $this->db->importQuery(WPSG_TBL_KU, $data_import, true);
+												
 					}
 					else
@@ -1807,16 +1440,4 @@
 			");
 			
-			if ($this->shop->view['data']['adress_id'] != 0)
-				$this->shop->view['data'] = array_merge($this->shop->view['data'], $this->db->fetchRow("
-					SELECT
-						KA.*
-					FROM
-						`".WPSG_TBL_ADRESS."` AS KA
-					WHERE
-						KA.`id` = '".wpsg_q($this->shop->view['data']['adress_id'])."'
-				"));
-				
-			$this->shop->view['data']['id']= wpsg_q($_REQUEST['edit_id']);
-			
 			$this->shop->view['data']['custom'] = @unserialize($this->shop->view['data']['custom']);
 			$this->shop->view['arLand'] = $this->db->fetchAssocField("
@@ -1868,15 +1489,239 @@
 			$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
 			$this->shop->view['arTitles'] = explode('|', $this->shop->view['pflicht']['anrede_auswahl']);
-			$this->shop->view['data'] = array(
-				'status' => '1'
-			);
+			$this->shop->view['data'] = array();
 			$this->shop->view['arLand'] = $this->db->fetchAssocField("
 				SELECT L.`id`, L.`name` FROM `".WPSG_TBL_LAND."` AS L ORDER BY `name` ASC
 			", "id", "name");
-
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/edit.phtml');
+			
+		} // private function be_addAction()
+		
+		/**
+		 * LÃ¶scht einen Kunden aus der Datenbank
+		 */
+		private function be_delAction()
+		{
+			
+			$this->shop->callMods('customer_delete_pre', array(&$_REQUEST['edit_id']));
+			
+			$this->db->Query("DELETE FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+			
+			$this->shop->addBackendMessage(__('Kunde erfolgreich gelÃ¶scht.', 'wpsg'));
+			
+			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer'); 
+			
+		} // private function be_delAction()
+		
+		/**
+		 * Wird beim speichern des Kunden im Backend aufgerufen
+		 */
+		private function be_saveAction()
+		{
+			
+			$data = array(
+				'knr' 		=> wpsg_q($_REQUEST['knr']), 
+				'title' 	=> wpsg_q($_REQUEST['title']),
+				'name' 		=> wpsg_q($_REQUEST['name']),
+				'vname' 	=> wpsg_q($_REQUEST['vname']),
+				'geb' 		=> wpsg_toDate($_REQUEST['geb']),
+				'email' 	=> wpsg_q($_REQUEST['email']),
+				'firma' 	=> wpsg_q($_REQUEST['firma']),
+				'tel' 		=> wpsg_q($_REQUEST['tel']),
+				'fax' 		=> wpsg_q($_REQUEST['fax']),
+				'strasse' 	=> wpsg_q($_REQUEST['strasse']),
+				'plz' 		=> wpsg_q($_REQUEST['plz']),
+				'ort' 		=> wpsg_q($_REQUEST['ort']),
+				'ustidnr' 	=> wpsg_q($_REQUEST['ustidnr']),
+				'land' => wpsg_q($_REQUEST['land']),
+				'comment' 	=> wpsg_q($_REQUEST['comment']),
+				'status' 	=> wpsg_q($_REQUEST['status'])
+			);
+			
 			if ($this->shop->hasMod('wpsg_mod_customergroup'))
 			{
-
-				$this->shop->view['arCustomergroup'] = wpsg_array_merge(array('0' => __('Unzugeordnet', 'wpsg')), $this->db->fetchAssocField("
+				
+				$data['group_id'] = wpsg_q($_REQUEST['group_id']);
+				
+			}
+			
+			$data['custom'] = @serialize($_REQUEST['custom']);
+			
+			if ($_REQUEST['password1'] == $_REQUEST['password2'] && trim($_REQUEST['password1']) != '')
+			{
+				
+				$data['passwort_saltmd5'] = $this->hashString($_REQUEST['password1']);	
+								
+				$this->shop->addBackendMessage(__('Passwort wurde erfolgreich geÃ€ndert.', 'wpsg'));
+								
+			}
+			else if (trim($_REQUEST['password1']) != '' || trim($_REQUEST['password2']) != '')
+			{
+				
+				$this->shop->addBackendError(__('Passwort wurde nicht geÃ€ndert, da die Wiederholung nicht ÃŒbereinstimmte.', 'wpsg'));
+				
+			}
+			
+			$this->shop->callMods('wpsg_mod_customer_save', array(&$data));
+			
+			if ($_REQUEST['edit_id'] > 0)
+			{
+				 
+				if ($_REQUEST['info-mail'] == '1')
+				{
+					$data['info-mail'] = wpsg_q($_REQUEST['info-mail']);
+					
+					$this->activateMail($data);
+					
+					unset($data['info-mail']);
+				}
+				
+				if ($_REQUEST['password1'] == $_REQUEST['password2'] && trim($_REQUEST['password1']) != '')
+				{
+					
+					$this->shop->callMods('customer_updatePwd', array(&$_REQUEST['edit_id'], &$_REQUEST['password1']));
+					
+				}
+				
+				$this->db->UpdateQuery(WPSG_TBL_KU, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+
+			}
+			else
+			{
+								
+				$_REQUEST['edit_id'] = $this->db->ImportQuery(WPSG_TBL_KU, $data);
+				
+				$this->shop->callMods('customer_created', array(&$_REQUEST['edit_id'], &$_REQUEST['password1']));
+				
+			}
+			
+			$this->shop->addBackendMessage(__('Kunde wurde erfolgreich gespeichert.', 'wpsg'));
+			
+			if (isset($_REQUEST['submit_index'])) $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&action=index');
+			else $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&action=edit&edit_id='.$_REQUEST['edit_id']);
+			
+		} // private function be_saveAction()
+		
+		/**
+		 * Ãbersicht ÃŒber die Kunden im Backend
+		 */
+		private function be_indexAction()
+		{
+						
+			if (isset($_REQUEST['s']) && $_REQUEST['s'] != '')
+			{
+				
+				$strQueryWHERE .= " 
+					AND (
+						K.`name` LIKE '%".wpsg_q($_REQUEST['s'])."%' OR
+						K.`vname` LIKE '%".wpsg_q($_REQUEST['s'])."%' OR
+						K.`email` LIKE '%".wpsg_q($_REQUEST['s'])."%' OR
+						K.`id` = '".wpsg_q($_REQUEST['s'])."' OR
+						K.`knr` LIKE '%".wpsg_q($_REQUEST['s'])."%'
+					)
+				"; 
+				
+			}
+			
+			if ($this->shop->hasMod('wpsg_mod_customergroup'))
+			{
+			
+				if (isset($_REQUEST['customergroup']) && $_REQUEST['customergroup'] > 0)
+				{
+					
+					$strQueryWHERE .= " AND `group_id` = '".wpsg_q($_REQUEST['customergroup'])."' ";
+					
+				}
+				else if (isset($_REQUEST['customergroup']) && $_REQUEST['customergroup'] === '0')
+				{
+					
+					$strQueryWHERE .= " AND (`group_id` = 0 OR `group_id` IS NULL) ";
+					
+				}
+				
+			}
+			
+			// Damit "Geisterkungen" aus unvollstÃ€ndigen Bestellungen nicht erscheinen
+			$strQueryWHERE .= " AND K.`email` != '' ";
+			
+			$nPerPage = $this->shop->get_option('wpsg_mod_kundenverwaltung_perpage');
+			if ($nPerPage <= 0) $nPerPage = 10;
+			
+			if (isset($_REQUEST['seite'])) $seite = $_REQUEST['seite']; else $seite = 1;
+									
+			$this->shop->view['count'] = $this->db->fetchOne("
+				SELECT
+					COUNT(*)
+				FROM	
+					`".WPSG_TBL_KU."` AS K
+				WHERE 
+					1
+					".$strQueryWHERE."
+			");
+						
+			$this->shop->view['seite'] = $seite;
+			$this->shop->view['pages'] = ceil($this->shop->view['count'] / $nPerPage); 			
+			if ($this->shop->view['seite'] <= 0 || $this->shop->view['seite'] > $this->shop->view['pages']) $this->shop->view['seite'] = 1;
+			 
+			if (isset($_REQUEST['filter']))
+				$this->shop->view['filter'] = $_REQUEST['filter'];
+			else
+				$this->shop->view['filter'] = array();
+			
+			$strQueryORDER = '';
+			
+			if (!isset($this->shop->view['filter']['order']))
+			{
+			
+				$this->shop->view['filter']['order'] = 'nr';
+			
+			}
+			
+			switch ($this->shop->view['filter']['order'])
+			{
+			
+				case 'name': $strQueryORDER .= "`order_name`"; break;
+				case 'adress': $strQueryORDER = "`order_adress`"; break;
+				case 'status': $strQueryORDER = "`order_count`"; break;
+				default: $strQueryORDER = " `order_nr` "; break;
+			
+			}
+			
+			if (!isset($this->shop->view['filter']['ascdesc']))
+			{
+			
+				$this->shop->view['filter']['ascdesc'] = 'DESC';
+			
+			}
+			
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_order_knr'), '1')) $strQueryORDERNR = " `knr` AS `order_nr` ";
+			else $strQueryORDERNR = " CAST(`knr` AS UNSIGNED) AS `order_nr` ";
+			 
+			$this->shop->view['data'] = $this->db->fetchAssoc("
+				SELECT
+					K.*,
+					L.`kuerzel` AS land_kuerzel,
+					CONCAT(K.`firma`, ' ', K.`strasse`, ' ', K.`plz`, ' ', K.`ort`) AS `order_adress`,
+					CONCAT(K.`vname`, ' ', K.`name`) AS `order_name`,
+					".$strQueryORDERNR.",
+					(SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` AS O WHERE O.`k_id` = K.`id`) AS order_count,
+					(SELECT SUM(`price_gesamt`) FROM `".WPSG_TBL_ORDER."` AS O WHERE O.`k_id` = K.`id` AND O.`status` IN (100, 110)) as order_umsatz
+				FROM 
+					`".WPSG_TBL_KU."` AS K
+						LEFT JOIN `".WPSG_TBL_LAND."` AS L ON (K.`land` = L.`id`)
+				WHERE
+					1					 
+					".$strQueryWHERE."
+				ORDER BY	
+					".$strQueryORDER." ".wpsg_q($this->shop->view['filter']['ascdesc']).", K.`id` DESC 
+				LIMIT
+					".(($this->shop->view['seite'] - 1) * $nPerPage).", ".$nPerPage."
+			");  
+			
+			// Kundengruppen laden
+			if ($this->shop->hasMod('wpsg_mod_customergroup'))
+			{
+			
+				$this->shop->view['arCustomergroup'] = $this->db->fetchAssocField("
 					SELECT
 						KG.`id`, CONCAT(KG.`name`, ' (ID:', KG.`id`, ')') AS `name`
@@ -1884,290 +1729,20 @@
 						`".WPSG_TBL_KG."` AS KG
 					ORDER BY
-						KG.`name` ASC
-				", "id", "name"));
-
-			}
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/edit.phtml');
-			
-		} // private function be_addAction()
-		
-		/**
-		 * LÃ¶scht einen Kunden aus der Datenbank
-		 */
-		private function be_delAction() {
-			
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			
-			$customer_id = intval($_REQUEST['edit_id']);
-			
-			$this->shop->callMods('customer_delete_pre', array(&$_REQUEST['edit_id'], 'delete'));
-			
-			$a = $this->db->fetchRow("
-				SELECT
-					`adress_id`
-				FROM
-					`".WPSG_TBL_KU."`
-				WHERE
-					`id` = '".wpsg_q($customer_id)."'
-			");
-			
-			if ($a['adress_id'] != 0) {
-				
-				$this->db->Query("DELETE FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($a['adress_id'])."'");
-				
-			}
-			
-			$this->db->UpdateQuery(WPSG_TBL_KU, ['deleted' => '1'], " `id` = '".wpsg_q($customer_id)."' ");
-			//$this->db->Query("DELETE FROM `".WPSG_TBL_KU."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."'");
-			
-			$this->shop->addBackendMessage(__('Kunde erfolgreich gelÃ¶scht.', 'wpsg'));
-			
-			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer'); 
-			
-		} // private function be_delAction()
-		
-		/**
-		 * Wird beim speichern des Kunden im Backend aufgerufen
-		 */
-		private function be_saveAction() {
-
-			if (isset($_REQUEST['edit_id']) && !wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw new \Exception(__('UngÃŒltige ID beim specihern des Kunden ÃŒbergeben.', 'wpsg'));
-			
-			$data = [];
-			
-			wpsg_checkRequest('knr', [WPSG_SANITIZE_TEXTFIELD], __('Kundennummer', 'wpsg'), $data);
-			wpsg_checkRequest('email', [WPSG_SANITIZE_EMAIL, ['allowEmpty' => true]], __('E-Mail', 'wpsg'), $data);
-			wpsg_checkRequest('email_einvoice', [WPSG_SANITIZE_EMAIL, ['allowEmpty' => true]], __('E-Mail fÃŒr eRechnung', 'wpsg'), $data);
-			wpsg_checkRequest('leitweg_id', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Leitweg-ID', 'wpsg'), $data);
-			wpsg_checkRequest('ustidnr', [WPSG_SANITIZE_USTIDNR, ['allowEmpty' => true]], __('UStIdNr.', 'wpsg'), $data);
-			wpsg_checkRequest('comment', [WPSG_SANITIZE_TEXTAREA], __('Kundenkommentar', 'wpsg'), $data);
-			wpsg_checkRequest('status', [WPSG_SANITIZE_TEXTAREA], __('Status', 'wpsg'), $data);
-			wpsg_checkRequest('geb', [WPSG_SANITIZE_DATE], __('Geburtsdatum', 'wpsg'), $data);
-			
-			if (isset($data['geb'])) {
-				
-				wpsg_checkRequest('geb', [WPSG_SANITIZE_DATE, ['allowEmpty' => true]], __('Geburtsdatum', 'wpsg'), $data);
-				
-				$data['geb'] = wpsg_toDate($data['geb']);
-				
-			}
-						
-			if ($this->shop->hasMod('wpsg_mod_customergroup')) {
-				
-				wpsg_checkRequest('group_id', [WPSG_SANITIZE_INT], __('Produktgruppe', 'wpsg'),$data);
-				
-			}
-			
-			// Adressdaten
-			$adata = [
-				'cdate' => 'NOW()'
-			];
-						 
-			if (isset($_REQUEST['title'])) {
-				
-				$arTitles = explode('|', $this->shop->loadPflichtFeldDaten()['anrede_auswahl']);
-				
-				wpsg_checkRequest('title', [WPSG_SANITIZE_VALUES, array_keys($arTitles)], __('Anrede', 'wpsg'), $adata);
-				
-			}
-			
-			wpsg_checkRequest('name', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Name', 'wpsg'), $adata);
-			wpsg_checkRequest('vname', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Vorname', 'wpsg'), $adata);
-			wpsg_checkRequest('firma', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Firma', 'wpsg'), $adata);
-			wpsg_checkRequest('fax', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Fax', 'wpsg'), $adata);
-			wpsg_checkRequest('strasse', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('StraÃe', 'wpsg'), $adata);
-			
-			if (isset($_REQUEST['nr'])) wpsg_checkRequest('nr', [WPSG_SANITIZE_TEXTFIELD], __('Nr', 'wpsg'), $adata);
-			
-			wpsg_checkRequest('plz', [WPSG_SANITIZE_ZIP, ['allowEmpty' => true]], __('PLZ', 'wpsg'), $adata);
-			wpsg_checkRequest('ort', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Ort', 'wpsg'), $adata);
-			wpsg_checkRequest('land', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Land', 'wpsg'), $adata);
-			wpsg_checkRequest('tel', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Telefon', 'wpsg'), $adata);
-						
-			$data['custom'] = @serialize($_REQUEST['custom']);
-
-			if (isset($_REQUEST['deleted'])) {
-				
-				wpsg_checkRequest('deleted', [WPSG_SANITIZE_INT], __('GelÃ¶scht', 'wpsg'), $_REQUEST);
-				
-			}
-
-			wpsg_checkRequest('password1', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Passwort', 'wpsg'), $_REQUEST);
-			wpsg_checkRequest('password2', [WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]], __('Passwort Wiederholung', 'wpsg'), $_REQUEST);
-			
-			if (wpsg_isSizedString($_REQUEST['password1']) || wpsg_isSizedString($_REQUEST['password2'])) {
-			
-				if ($_REQUEST['password1'] === $_REQUEST['password2'] && trim($_REQUEST['password1']) != '') {
-					
-					$data['passwort_saltmd5'] = $this->hashString($_REQUEST['password1']);
-									
-					$this->shop->addBackendMessage(__('Passwort wurde erfolgreich geÃ€ndert.', 'wpsg'));
-									
-				} else if (trim($_REQUEST['password1']) != '' || trim($_REQUEST['password2']) != '') {
-					
-					$this->shop->addBackendError(__('Passwort wurde nicht geÃ€ndert, da die Wiederholung nicht ÃŒbereinstimmte.', 'wpsg'));
-					
-				}
-				
-			}
-			
-			$this->shop->callMods('wpsg_mod_customer_save', array(&$data));
-			
-			if (wpsg_getInt($_REQUEST['edit_id']) > 0) {
-				 
-				if (wpsg_isSizedInt($_REQUEST['info-mail'])) {
-					 			 
-					$this->activateMail($data); 
-					
-				}
-				
-				if ($_REQUEST['password1'] === $_REQUEST['password2'] && trim($_REQUEST['password1']) != '') {
-					
-					$this->shop->callMods('customer_updatePwd', array(&$_REQUEST['edit_id'], &$_REQUEST['password1']));
-					
-				}
-
-				$a = $this->db->fetchRow("
-					SELECT
-						`adress_id`
-					FROM
-						`".WPSG_TBL_KU."`
-					WHERE
-						`id` = '".wpsg_q($_REQUEST['edit_id'])."'
-				");
-				
-				if ($a['adress_id'] == 0) {
-									
-					$data['adress_id'] = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adata);
-					
-				} else {
-					
-					$this->db->UpdateQuery(WPSG_TBL_ADRESS, $adata, "`id` = '".wpsg_q($a['adress_id'])."'");
-					
-				}
-				
-				$this->db->UpdateQuery(WPSG_TBL_KU, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."' ");
-
-			} else {
-								
-				$data['adress_id'] = $this->db->ImportQuery(WPSG_TBL_ADRESS, $adata);
-				
-				$kunde_id = $this->db->ImportQuery(WPSG_TBL_KU, $data);
-				
-				$_REQUEST['edit_id'] = $kunde_id;
-				
-				$knr = $this->shop->buildKNR($kunde_id);
-				
-				$this->shop->cache->clearKundenCache($kunde_id);
-					
-				$this->db->UpdateQuery(WPSG_TBL_KU, array(
-					'knr' => wpsg_q($knr),
-					'status' => get_option('wpsg_page_mod_kundenverwaltung_status')
-				), "`id` = '".wpsg_q($kunde_id)."'");
-				
-				if ((wpsg_getStr($_REQUEST['password1']) == '') || (wpsg_getStr($_REQUEST['password2']) == '') || 
-					(wpsg_getStr($_REQUEST['email']) == '') || (wpsg_getStr($_REQUEST['password1']) != wpsg_getStr($_REQUEST['password2'])))
-				{
-					
-					//$this->shop->addBackendMessage(__('WP-User wurde nicht angelegt.', 'wpsg'));
-					
-				} else {
-					
-					$this->shop->callMods('customer_created', array(&$_REQUEST['edit_id'], &$_REQUEST['password1']));
-					
-				}
-				
-			}
-			
-			$this->shop->addBackendMessage(__('Kunde wurde erfolgreich gespeichert.', 'wpsg'));
-			
-			if (isset($_REQUEST['submit_index'])) $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&action=index');
-			else $this->shop->redirect(wpsg_admin_url('Customer', 'edit', ['edit_id' => $_REQUEST['edit_id']]));
-			
-		} // private function be_saveAction()
-		
-        private function be_index_setAccount()
-        {
- 
-            if (isset($_REQUEST['submit-button']) || isset($_REQUEST['submit_do']))
-            {
-
-                $this->shop->view['targetCustomer'] = wpsg_customer::find(array(
-                    's' => wpsg_xss($_REQUEST['filter']['s'])
-                ));
-            }
-                       
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/index_setAccount.phtml');
-                        
-        }
-        
-		/**
-		 * Ãbersicht ÃŒber die Kunden im Backend
-		 */
-		private function be_indexAction()
-		{
-
-		    if (isset($_REQUEST['wpsg_do']) && $_REQUEST['wpsg_do'] !== '-1')
-            {
-                
-                if ($_REQUEST['wpsg_do'] === 'setAccount') return $this->be_index_setAccount();
-                
-            }
-            
-			$nPerPage = $this->shop->get_option('wpsg_mod_kundenverwaltung_perpage');
-			if ($nPerPage <= 0) $nPerPage = 10;
-
-			$this->shop->view['arFilter'] = array(
-				'order' => 'cdate',
-				'ascdesc' => 'ASC',
-				'status' => '0',
-				'page' => '1'
-			);
-			$this->shop->view['arData'] = array();
-			$this->shop->view['pages'] = 1;
-
-			if (wpsg_isSizedArray($_REQUEST['filter'])) {
-
-				if (!wpsg_checkInput($_REQUEST['filter']['s'], WPSG_SANITIZE_TEXTFIELD)) {
-					
-					unset($_REQUEST['filter']['s']);
-					
-				}
-				
-				if (isset($_REQUEST['group_id']) && !wpsg_checkInput($_REQUEST['filter']['group_id'], WPSG_SANITIZE_INT)) {
-					
-					unset($_REQUEST['filter']['group_id']);
-					
-				}
-				
-				$this->shop->view['arFilter'] = $_REQUEST['filter'];
-
-			}
-			else if (wpsg_isSizedArray($_SESSION['wpsg']['backend']['customer']['arFilter']))
-			{
-
-				$this->shop->view['arFilter'] = $_SESSION['wpsg']['backend']['customer']['arFilter'];
-                
-			}
-
-            $this->shop->view['hasFilter'] = wpsg_customer::hasFilter($this->shop->view['arFilter']); 
-			
-			$this->shop->view['countAll'] = wpsg_customer::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = $_REQUEST['seite'];
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if ($this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['customer']['arFilter'] = $this->shop->view['arFilter'];
-
-			$this->shop->view['arData'] = wpsg_customer::find($this->shop->view['arFilter']);
-
+						KG.`name` ASC	
+				", "id", "name");
+				
+			}
+
+			foreach ($this->shop->view['data'] as $k => $customer_db)
+			{
+
+				$this->shop->view['data'][$k]['oCustomer'] = new wpsg_customer();
+				$this->shop->view['data'][$k]['oCustomer']->load($customer_db['id']);
+				$this->shop->view['data'][$k]['order_umsatz'] = $this->shop->view['data'][$k]['oCustomer']->getOrderAmount(array(100, 110));
+				
+			}
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/index.phtml');
-			 			
+			
 		} // private function be_indexAction()
 				
@@ -2188,70 +1763,27 @@
 			
 			unset($_SESSION['wpsg']['checkout']);
-
-			// Ich lÃ¶sche auch eine eventuell temporÃ€r existierende Bestellung, damit der Kunde nicht mehr geleert wird
-			unset($_SESSION['wpsg']['order_id']);
-
+			
 		} // private function logout()
-		                
+		
 		/**
 		 * Logt den Kunden mit der ID $kunde_id ein
 		 * Der Kunde sollte in der Datenbank existieren das muss vorher abgefragt werden
 		 */
-		public function login($kunde_id) {
-		    
+		public function login($kunde_id)
+		{
+			
 			$kunde = $this->db->fetchRow("
 				SELECT
-					C.`id`,
-					CA.`title` AS `title`,
-					CA.`name` AS `name`,
-					CA.`vname` AS `vname`,
-					CA.`firma` AS `firma`,
-					CA.`fax` AS `fax`,
-					CA.`strasse` AS `strasse`,
-					CA.`nr` AS `nr`,
-					CA.`plz` AS `plz`,
-					CA.`ort` AS `ort`,
-					CA.`land` AS `land`,
-					CA.`tel` AS `tel`,
-					C.`geb`, C.`ustidnr`, C.`email`, C.`id`, C.`wp_user_id`, C.`custom` AS `customin`
+					K.`firma`, K.`title`, K.`vname`, K.`name`, K.`geb`,
+					K.`fax`, K.`tel`, K.`strasse`, K.`ort`, K.`plz`, K.`land`,
+					K.`ustidnr`, K.`email`, K.`id`, K.`wp_user_id`
 				FROM
-					`".WPSG_TBL_KU."` AS C
-						LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = C.`adress_id`)
+					`".WPSG_TBL_KU."` AS K
 				WHERE
-					C.`id` = '".wpsg_q($kunde_id)."' AND
-					C.`deleted` != '1' AND
-					C.`status` != '0' AND C.`status` != '-1'
+					K.`id` = '".wpsg_q($kunde_id)."'			
 			");
-			 
-			if (!wpsg_isSizedArray($kunde) || $kunde['id'] != $kunde_id) return;
-            
-            $this->db->UpdateQuery(WPSG_TBL_KU, ['last_login' => 'NOW()'], " `id` = '".wpsg_q($kunde['id'])."' ");
-			
-			$kunde['custom'] = @unserialize($kunde['customin']);
 			
 			if (!is_array($_SESSION['wpsg']['checkout'])) $_SESSION['wpsg']['checkout'] = array();
-		
-			if (wpsg_isSizedInt($_SESSION['wpsg']['order_id'])) {
-			
-				$temp_k_id = $this->db->fetchOne("SELECT `k_id` FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_SESSION['wpsg']['order_id'])."' ");
-			
-				if (wpsg_isSizedInt($temp_k_id) && $temp_k_id != $kunde_id) {
-			
-					// TemporÃ€ren Kunden lÃ¶schen
-					// Zur Sicherheit check ich mal ob es Bestellungen mit ihm gibt.
-					$count_order = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_ORDER."` WHERE `k_id` = '".wpsg_q($temp_k_id)."'  AND `id` != '".wpsg_q($_SESSION['wpsg']['order_id'])."' ");
-			
-					if ($count_order > 0) throw new \wpsg\Exception(__('Die Daten eines Bestellobjekts konnten nicht geladen werden', 'wpsg'));
-					else {
-			
-						$oCustomer = wpsg_customer::getInstance($temp_k_id);
-						$oCustomer->delete();
-			
-					}
-			
-				}
-			
-			}
-			
+									
 			$_SESSION['wpsg']['checkout'] = wpsg_array_merge($_SESSION['wpsg']['checkout'], wpsg_xss(array(
 				'id' => $kunde['id'],
@@ -2262,10 +1794,8 @@
 				'email' => $kunde['email'],
 				'email2' => $kunde['email'],
-				'custom' => $kunde['custom'],
 				'geb' => wpsg_fromDate($kunde['geb']),
 				'fax' => $kunde['fax'],
 				'tel' => $kunde['tel'],
 				'strasse' => $kunde['strasse'],
-				'nr' => $kunde['nr'],
 				'plz' => $kunde['plz'],
 				'ort' => $kunde['ort'],
@@ -2277,5 +1807,6 @@
 			unset($_REQUEST['checkout']);
 			
-			if ($this->shop->get_option('wpsg_mod_kundenverwaltung_wpuser') == '1') {
+			if ($this->shop->get_option('wpsg_mod_kundenverwaltung_wpuser') == '1')
+			{
 				
 				/*
@@ -2398,5 +1929,5 @@
     		
 		} // private function createPasswort($anz = 8)
-        
+		
 		/**
 		 * versendet eine Mail nach der Registrierung
@@ -2468,3 +1999,4 @@
 		
 	} // class wpsg_mod_kundenverwaltung extends wpsg_mod_basic
- 
+
+?>
Index: /mods/wpsg_mod_legaltexts.class.php
===================================================================
--- /mods/wpsg_mod_legaltexts.class.php	(revision 8528)
+++ /mods/wpsg_mod_legaltexts.class.php	(revision 5261)
@@ -16,5 +16,6 @@
 		const PROVIDER_ITRECHT = 3;
 		
-		public function __construct() {
+		public function __construct()
+		{
 			
 			parent::__construct();
@@ -26,41 +27,46 @@
 		} // public function __construct();
 		
-		public function install() {
-			
-			$this->shop->checkDefault('wpsg_mod_legaltexts_provider', self::PROVIDER_ITRECHT);
-			
-		}
-		
-		public function settings_edit() {
+		public function settings_edit()
+		{
 
-			$this->shop->view['wpsg_mod_legaltexts_provider'] = $this->shop->get_option('wpsg_mod_legaltexts_provider');
-			if ($this->shop->view['wpsg_mod_legaltexts_provider'] === false || !in_array($this->shop->view['wpsg_mod_legaltexts_provider'], [self::PROVIDER_ITRECHT, self::PROVIDER_HAENDLERBUND, self::PROVIDER_PROTECTEDSHOPS])) $this->shop->view['wpsg_mod_legaltexts_provider'] = self::PROVIDER_ITRECHT;
-						
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_legaltexts/settings_edit.phtml');
 			
 		} // public function settings_edit()
 		
-		public function settings_save() {
-
-			$this->shop->update_option('wpsg_mod_legaltexts_provider', $_REQUEST['wpsg_mod_legaltexts_provider'], false, false, WPSG_SANITIZE_INT);
+		public function settings_save()
+		{
 			
-			if (isset($_REQUEST['wpsg_mod_legaltexts_submitform']) && $_REQUEST['wpsg_mod_legaltexts_submitform'] == '1') {
-
-				if ($_REQUEST['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS) {
+			$this->shop->update_option('wpsg_mod_legaltexts_provider', $_REQUEST['wpsg_mod_legaltexts_provider']);
+			
+			if (isset($_REQUEST['wpsg_mod_legaltexts_submitform']) && $_REQUEST['wpsg_mod_legaltexts_submitform'] == '1')
+			{
+				
+				if ($_REQUEST['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS)
+				{
 					
 					$wpsg_ps = new wpsg_protected_shops();
 					$wpsg_ps->saveForm();
 					
-				} else if ($_REQUEST['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND) {
+				}
+				else if ($_REQUEST['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND)
+				{
 					
 					$wphb = new wphb();
 					$wphb->saveForm();
 					
-				} else if ($_REQUEST['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_ITRECHT) {
+				}
+				else if ($_REQUEST['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_ITRECHT)
+				{
 					
 					$wpit = new wpsg_itrecht();
 					$wpit->saveForm();
 					
-				} else throw new \wpsg\Exception(__('Es wurde beim Speichern der Einstellungen ein ungÃŒltiger Provider ÃŒbergeben', 'wpsg'));
+				}
+				else
+				{
+					
+					$this->shop->throwErrorCode('1900_2');
+					
+				}
 				
 			}
@@ -68,11 +74,15 @@
 		} // public function settings_save()
 		
-		public function be_ajax() {
+		public function be_ajax()
+		{
 
-			if ($_REQUEST['modul'] == 'wpsg_mod_legaltexts') {
+			if ($_REQUEST['modul'] == 'wpsg_mod_legaltexts')
+			{
 			
-				if ($_REQUEST['provider'] == wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND) {
+				if ($_REQUEST['provider'] == wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND)
+				{
 										
-					if (class_exists("wphb")) {
+					if (class_exists("wphb"))
+					{
 
 						$wphb = new wphb();
@@ -80,23 +90,32 @@
 						$this->shop->view['wpsg_mod_legaltexts']['form'] = $wphb->showForm();
 						
-					} else {
+					}
+					else
+					{
 						
 						$this->shop->view['wpsg_mod_legaltexts']['form'] = false;
 						
 					}
+
 					
 					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_legaltexts/form_haendlerbund.phtml');
 					
-				} else if ($_REQUEST['provider'] == wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS) {
+				}
+				else if ($_REQUEST['provider'] == wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS)
+				{
 					
-					if (class_exists("wpsg_protected_shops")) {
+					if (class_exists("wpsg_protected_shops"))
+					{
 						
 						$wpsg_ps = new wpsg_protected_shops();
 						
-						if (!isset($wpsg_ps->version) || $wpsg_ps->version == "" || version_compare($wpsg_ps->version, "1.5") < 0) {
+						if (!isset($wpsg_ps->version) || $wpsg_ps->version == "" || version_compare($wpsg_ps->version, "1.5") < 0)
+						{
 						
 							$this->shop->view['wpsg_mod_legaltexts']['form'] = '<span style="color:red;">'.__("Die von Ihnen verwendete Version des ProtectedShops Plugin ist nicht ausreichend. Sie benÃ¶tigen mindestens Version 1.6!", "wpsg").'</span>';
 						
-						} else {
+						}
+						else
+						{
 						
 							$this->shop->view['wpsg_mod_legaltexts']['form'] = $wpsg_ps->showForm();
@@ -104,5 +123,7 @@
 						}
 						
-					} else {
+					}
+					else
+					{
 						
 						$this->shop->view['wpsg_mod_legaltexts']['form'] = false;
@@ -112,7 +133,10 @@
 					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_legaltexts/form_protectedshops.phtml');
 					
-				} else if ($_REQUEST['provider'] == wpsg_mod_legaltexts::PROVIDER_ITRECHT) {
+				}
+				else if ($_REQUEST['provider'] == wpsg_mod_legaltexts::PROVIDER_ITRECHT)
+				{
 					
-					if (class_exists("wpsg_itrecht")) {
+					if (class_exists("wpsg_itrecht"))
+					{
 						
 						$wpit = new wpsg_itrecht();
@@ -120,5 +144,7 @@
 						$this->shop->view['wpsg_mod_legaltexts']['form'] = $wpit->showForm();
 						
-					} else {
+					}
+					else
+					{
 						
 						$this->shop->view['wpsg_mod_legaltexts']['form'] = false;
@@ -128,14 +154,9 @@
 					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_legaltexts/form_itrecht.phtml');
 					
-				} else{
-					
-					throw new \wpsg\Exception(
-						wpsg_translate(
-							__(
-								'Es wurde bei der Ajax Anfrage der Provider ein ungÃŒltiger Provider (#1#) angegeben', 'wpsg'							
-							),
-							$_REQUEST['provider']
-						)
-					);
+				}
+				else
+				{
+
+					$this->shop->throwErrorCode('1900_1');
 					
 				}
Index: /mods/wpsg_mod_micropayment.class.php
===================================================================
--- /mods/wpsg_mod_micropayment.class.php	(revision 5261)
+++ /mods/wpsg_mod_micropayment.class.php	(revision 5261)
@@ -0,0 +1,1148 @@
+<?php
+
+	/**
+	 * Klasse, die verschiedene Zahlungsarten ÃŒber den micropayment.de Dienstleister ermÃ¶glicht
+	 * Ist nur fÃŒr die Lizenztypen Pro und Enterpreise zulÃ€ssig
+	 * @author Daschmi (05.07.2013)
+	 */
+	class wpsg_mod_micropayment extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 2;
+		var $id = 1750;
+		var $hilfeURL = 'http://wpshopgermany.de/?p=3424';
+		
+		var $event_creditcard_url = 'http://billing.micropayment.de/creditcard/event/';
+		var $event_directdebit_url = 'http://billing.micropayment.de/lastschrift/event/';
+		var $event_ebank2pay_url = 'http://billing.micropayment.de/ebank2pay/event/';				
+		var $event_prepayment_url = 'http://billing.micropayment.de/prepay/event/';
+		var $event_call2pay_url = 'http://billing.micropayment.de/call2pay/event/';
+		var $event_handypay_url = 'http://billing.micropayment.de/handypay/event/';
+		
+		var $dispatcher = false;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+				
+			parent::__construct();
+				
+			$this->name = __('micropaymentâ¢', 'wpsg');
+			$this->group = __('Zahlungsarten', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht die Zahlung ÃŒber den Zahlungsdienstleister <a href="http://r132.micropayment.de">micropaymentâ¢</a>.', 'wpsg');
+		 			
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_event_creditcard_url'))) $this->event_creditcard_url = $this->shop->get_option('wpsg_mod_micropayment_event_creditcard_url');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_event_directdebit_url'))) $this->event_directdebit_url = $this->shop->get_option('wpsg_mod_micropayment_event_directdebit_url');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_event_ebank2pay_url'))) $this->event_ebank2pay_url = $this->shop->get_option('wpsg_mod_micropayment_event_ebank2pay_url');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_event_prepayment_url'))) $this->event_prepayment_url = $this->shop->get_option('wpsg_mod_micropayment_event_prepayment_url');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_event_call2pay_url'))) $this->event_call2pay_url = $this->shop->get_option('wpsg_mod_micropayment_event_call2pay_url');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_event_handypay_url'))) $this->event_handypay_url = $this->shop->get_option('wpsg_mod_micropayment_event_handypay_url');
+			
+		} // public function __construct()
+		
+		public function install()
+		{
+
+			// Kundentabelle erweitern
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			$sql = "CREATE TABLE ".WPSG_TBL_ORDER." (
+		   		wpsg_mod_micropayment_customerid VARCHAR(255) NOT NULL,
+				wpsg_mod_micropayment_sessionid VARCHAR(255) NOT NULL,
+				wpsg_mod_micropayment_transactionid VARCHAR(255) NOT NULL			
+		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			
+			dbDelta($sql);
+			
+			// Kreditkarte
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcard_name', 'Kreditkarte micropaymentâ¢', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcard_hint', __('Abrechnung per Kreditkarte', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcard_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcard_mwstland', '0', false, false);
+						
+			// Kreditkarte mit Reserivierung
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcardreservation_name', 'Kreditkarte micropaymentâ¢ (Reservierung)', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcardreservation_hint', __('Abrechnung per Kreditkarte (Reservierung)', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcardreservation_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_creditcardreservation_mwstland', '0', false, false);
+			
+			// Lastschrift
+			$this->shop->checkDefault('wpsg_mod_micropayment_directdebit_name', 'Lastschrift micropaymentâ¢', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_directdebit_hint', __('Abrechnung per Lastschrift', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_directdebit_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_directdebit_mwstland', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_directdebit_subject', 'O%order_id% - K%kunde_id%', false, true);
+			
+			// eBank2Pay
+			$this->shop->checkDefault('wpsg_mod_micropayment_ebank2pay_name', 'Online Ãberweisung micropaymentâ¢', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_ebank2pay_hint', __('Abrechnung per Online Banking', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_ebank2pay_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_ebank2pay_mwstland', '0', false, false);
+						
+			// Vorkasse
+			$this->shop->checkDefault('wpsg_mod_micropayment_prepayment_name', 'Vorkasse micropaymentâ¢', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_prepayment_hint', __('Abrechnung per Vorkasse', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_prepayment_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_prepayment_mwstland', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_prepayment_subject', 'O%order_id% - K%kunde_id%', false, true);
+			
+			// Call2Pay
+			$this->shop->checkDefault('wpsg_mod_micropayment_call2pay_name', 'Call2Pay micropaymentâ¢', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_call2pay_hint', __('Abrechnung per Anruf / Telefon', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_call2pay_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_call2pay_mwstland', '0', false, false);
+						
+			// HandyPay
+			$this->shop->checkDefault('wpsg_mod_micropayment_handypay_name', 'HandyPay micropaymentâ¢', false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_handypay_hint', __('Abrechnung per SMS / TAN', 'wpsg'), false, true);
+			$this->shop->checkDefault('wpsg_mod_micropayment_handypay_mwst', '0', false, false);
+			$this->shop->checkDefault('wpsg_mod_micropayment_handypay_mwstland', '0', false, false);
+						
+		} // public function install()
+		
+		public function settings_edit()
+		{
+			
+			$pages = get_pages();
+			
+			$arPages = array(
+					'-1' => __('Neu anlegen und zuordnen', 'wpsg')
+			);
+			
+			foreach ($pages as $k => $v)
+			{
+				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
+			}
+			
+			$this->shop->view['wpsg_mod_micropayment']['arPages'] = $arPages;
+			
+			$api_url = $this->shop->getURL(wpsg_ShopController::URL_BASKET);
+				
+			if (strpos($api_url, '?') === false)
+			{
+			
+				$api_url .= '?wpsg_plugin=wpsg_mod_micropayment&confirm=micropayment';
+			
+			}
+			else
+			{
+			
+				$api_url .= '&wpsg_plugin=wpsg_mod_micropayment&confirm=micropayment';
+			
+			}
+			
+			$this->shop->view['wpsg_mod_micropayment']['apiURL'] = $api_url;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_micropayment/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+					
+			// Allgemein
+			$this->shop->update_option('wpsg_mod_micropayment_projectid', $_REQUEST['wpsg_mod_micropayment_projectid']);
+			$this->shop->update_option('wpsg_mod_micropayment_accountid', $_REQUEST['wpsg_mod_micropayment_accountid']);
+			$this->shop->update_option('wpsg_mod_micropayment_accesskey', $_REQUEST['wpsg_mod_micropayment_accesskey']);
+			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_micropayment_successPage', $_REQUEST['wpsg_mod_micropayment_successPage']);
+			$this->shop->update_option('wpsg_mod_micropayment_paystart', $_REQUEST['wpsg_mod_micropayment_paystart']);
+			
+			$this->shop->update_option('wpsg_mod_micropayment_account', $_REQUEST['wpsg_mod_micropayment_account']);
+			$this->shop->update_option('wpsg_mod_micropayment_layout', $_REQUEST['wpsg_mod_micropayment_layout']);
+			$this->shop->update_option('wpsg_mod_micropayment_bgcolor', $_REQUEST['wpsg_mod_micropayment_bgcolor']);
+			$this->shop->update_option('wpsg_mod_micropayment_campaign', $_REQUEST['wpsg_mod_micropayment_campaign']);
+			$this->shop->update_option('wpsg_mod_micropayment_sandbox', $_REQUEST['wpsg_mod_micropayment_sandbox']);
+			$this->shop->update_option('wpsg_mod_micropayment_bggfx', $_REQUEST['wpsg_mod_micropayment_bggfx']);
+			
+			// Kreditkarte
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_activ', $_REQUEST['wpsg_mod_micropayment_creditcard_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_name', $_REQUEST['wpsg_mod_micropayment_creditcard_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_creditcard_name', $_REQUEST['wpsg_mod_micropayment_creditcard_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_hint', $_REQUEST['wpsg_mod_micropayment_creditcard_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_creditcard_hint', $_REQUEST['wpsg_mod_micropayment_creditcard_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_logo', $_REQUEST['wpsg_mod_micropayment_creditcard_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_gebuehr', $_REQUEST['wpsg_mod_micropayment_creditcard_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_mwst', $_REQUEST['wpsg_mod_micropayment_creditcard_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcard_mwstland', $_REQUEST['wpsg_mod_micropayment_creditcard_mwstland']);
+			
+			// Kreditkarte (Reservierung)
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_activ', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_name', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_creditcardreservation_name', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_hint', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_creditcardreservation_hint', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_logo', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_gebuehr', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_mwst', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_creditcardreservation_mwstland', $_REQUEST['wpsg_mod_micropayment_creditcardreservation_mwstland']);
+						
+			// Lastschrift
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_activ', $_REQUEST['wpsg_mod_micropayment_directdebit_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_name', $_REQUEST['wpsg_mod_micropayment_directdebit_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_directdebit_name', $_REQUEST['wpsg_mod_micropayment_directdebit_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_hint', $_REQUEST['wpsg_mod_micropayment_directdebit_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_directdebit_hint', $_REQUEST['wpsg_mod_micropayment_directdebit_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_logo', $_REQUEST['wpsg_mod_micropayment_directdebit_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_gebuehr', $_REQUEST['wpsg_mod_micropayment_directdebit_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_mwst', $_REQUEST['wpsg_mod_micropayment_directdebit_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_mwstland', $_REQUEST['wpsg_mod_micropayment_directdebit_mwstland']);
+			$this->shop->update_option('wpsg_mod_micropayment_directdebit_subject', $_REQUEST['wpsg_mod_micropayment_directdebit_subject']);
+			
+			// eBank2Pay
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_activ', $_REQUEST['wpsg_mod_micropayment_ebank2pay_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_name', $_REQUEST['wpsg_mod_micropayment_ebank2pay_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_ebank2pay_name', $_REQUEST['wpsg_mod_micropayment_ebank2pay_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_hint', $_REQUEST['wpsg_mod_micropayment_ebank2pay_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_ebank2pay_hint', $_REQUEST['wpsg_mod_micropayment_ebank2pay_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_logo', $_REQUEST['wpsg_mod_micropayment_ebank2pay_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_gebuehr', $_REQUEST['wpsg_mod_micropayment_ebank2pay_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_mwst', $_REQUEST['wpsg_mod_micropayment_ebank2pay_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_ebank2pay_mwstland', $_REQUEST['wpsg_mod_micropayment_ebank2pay_mwstland']);
+						
+			// Vorkasse
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_activ', $_REQUEST['wpsg_mod_micropayment_prepayment_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_name', $_REQUEST['wpsg_mod_micropayment_prepayment_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_prepayment_name', $_REQUEST['wpsg_mod_micropayment_prepayment_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_hint', $_REQUEST['wpsg_mod_micropayment_prepayment_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_prepayment_hint', $_REQUEST['wpsg_mod_micropayment_prepayment_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_logo', $_REQUEST['wpsg_mod_micropayment_prepayment_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_gebuehr', $_REQUEST['wpsg_mod_micropayment_prepayment_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_mwst', $_REQUEST['wpsg_mod_micropayment_prepayment_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_mwstland', $_REQUEST['wpsg_mod_micropayment_prepayment_mwstland']);
+			$this->shop->update_option('wpsg_mod_micropayment_prepayment_subject', $_REQUEST['wpsg_mod_micropayment_prepayment_subject']);
+			
+			// Call2Pay
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_activ', $_REQUEST['wpsg_mod_micropayment_call2pay_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_name', $_REQUEST['wpsg_mod_micropayment_call2pay_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_call2pay_name', $_REQUEST['wpsg_mod_micropayment_call2pay_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_hint', $_REQUEST['wpsg_mod_micropayment_call2pay_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_call2pay_hint', $_REQUEST['wpsg_mod_micropayment_call2pay_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_logo', $_REQUEST['wpsg_mod_micropayment_call2pay_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_gebuehr', $_REQUEST['wpsg_mod_micropayment_call2pay_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_mwst', $_REQUEST['wpsg_mod_micropayment_call2pay_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_call2pay_mwstland', $_REQUEST['wpsg_mod_micropayment_call2pay_mwstland']);
+						
+			// HandyPay
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_activ', $_REQUEST['wpsg_mod_micropayment_handypay_activ']);
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_name', $_REQUEST['wpsg_mod_micropayment_handypay_name']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_handypay_name', $_REQUEST['wpsg_mod_micropayment_handypay_name']);
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_hint', $_REQUEST['wpsg_mod_micropayment_handypay_hint']);
+			$this->shop->addTranslationString('wpsg_mod_micropayment_handypay_hint', $_REQUEST['wpsg_mod_micropayment_handypay_hint']);
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_logo', $_REQUEST['wpsg_mod_micropayment_handypay_logo']);
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_gebuehr', $_REQUEST['wpsg_mod_micropayment_handypay_gebuehr']);
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_mwst', $_REQUEST['wpsg_mod_micropayment_handypay_mwst']);
+			$this->shop->update_option('wpsg_mod_micropayment_handypay_mwstland', $_REQUEST['wpsg_mod_micropayment_handypay_mwstland']);
+						
+			$this->getBillingURLs();
+			
+		} // public function settings_save()
+		
+		public function addPayment(&$arPayment)
+		{
+			
+			// Neue ZustÃ€nde hinzufÃŒgen
+			$this->shop->arStatus['700'] = __('Zahlung reserviert', 'wpsg');
+			$this->shop->arStatus['701'] = __('Reservierung eingelÃ¶st', 'wpsg');
+			
+			$arBasket = $this->shop->cache->getShopBasketArray();
+			
+			// Kreditkarte
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_creditcard_activ') == '1')
+			{
+							
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_creditcard_mwst'), $this->shop->getDefaultCountry(), $this->shop->getDefaultCountry());
+				
+				$arPayment[$this->id.'_1'] = array(
+					'id' => $this->id.'_1',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_creditcard_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_creditcard_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_creditcard_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_creditcard_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_creditcard_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_creditcard_logo')))?$this->shop->get_option('wpsg_mod_micropayment_creditcard_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/creditcard.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')
+				);
+			
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_creditcard_gebuehr'), $mwst_value, $arPayment, $this->id.'_1');
+			
+				//if (!is_admin() && isset($arBasket['sum']['preis_gesamt_brutto']) && $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_1']['price_brutto'] < 2.50 || $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_1']['price_brutto'] > 500) unset($arPayment[$this->id.'_1']);
+								
+			}
+			
+			// Kreditkartenreservierung
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_activ'))
+			{
+				
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_mwst'), $this->shop->getDefaultCountry());
+				
+				$arPayment[$this->id.'_7'] = array(
+					'id' => $this->id.'_7',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_logo')))?$this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/creditcard.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')						
+				);
+				
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_creditcard_gebuehr'), $mwst_value, $arPayment, $this->id.'_7');
+				
+				//if (!is_admin() && isset($arBasket['sum']['preis_gesamt_brutto']) && $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_7']['price_brutto'] < 2.50 || $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_7']['price_brutto'] > 1000) unset($arPayment[$this->id.'_7']);
+								
+			}
+			
+			// Lastschrift
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_directdebit_activ') == '1')
+			{
+
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_directdebit_mwst'), $this->shop->getDefaultCountry());
+					
+				$arPayment[$this->id.'_2'] = array(
+					'id' => $this->id.'_2',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_directdebit_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_directdebit_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_directdebit_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_directdebit_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_directdebit_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_directdebit_logo')))?$this->shop->get_option('wpsg_mod_micropayment_directdebit_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/directdebit.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')
+				);
+					
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_directdebit_gebuehr'), $mwst_value, $arPayment, $this->id.'_2');
+					
+			}
+			
+			// eBank2Pay
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_ebank2pay_activ') == '1')
+			{
+
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_mwst'), $this->shop->getDefaultCountry());
+				
+				$arPayment[$this->id.'_3'] = array(
+					'id' => $this->id.'_3',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_ebank2pay_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_ebank2pay_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_ebank2pay_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_logo')))?$this->shop->get_option('wpsg_mod_micropayment_ebank2pay_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/bank2pay.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')
+				);
+				
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_gebuehr'), $mwst_value, $arPayment, $this->id.'_3');
+				
+				//if (!is_admin() && isset($arBasket['sum']['preis_gesamt_brutto']) && $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_3']['price_brutto'] < 0.50 || $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_3']['price_brutto'] > 500) unset($arPayment[$this->id.'_3']);
+								
+			}
+			
+			// Vorkasse
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_prepayment_activ') == '1')
+			{
+			
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_mwst'), $this->shop->getDefaultCountry());
+				
+				$arPayment[$this->id.'_4'] = array(
+					'id' => $this->id.'_4',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_prepayment_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_prepayment_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_prepayment_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_prepayment_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_prepayment_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_prepayment_logo')))?$this->shop->get_option('wpsg_mod_micropayment_prepayment_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/prepayment.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')
+				);
+			
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_prepayment_gebuehr'), $mwst_value, $arPayment, $this->id.'_4');
+			
+			}
+			
+			// Call2Pay
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_call2pay_activ') == '1')
+			{
+					
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_call2pay_mwst'), $this->shop->getDefaultCountry());
+					
+				$arPayment[$this->id.'_5'] = array(
+					'id' => $this->id.'_5',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_call2pay_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_call2pay_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_call2pay_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_call2pay_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_call2pay_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_call2pay_logo')))?$this->shop->get_option('wpsg_mod_micropayment_call2pay_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/call2pay.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')
+				);
+					
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_call2pay_gebuehr'), $mwst_value, $arPayment, $this->id.'_5');
+					
+				//if (!is_admin() && isset($arBasket['sum']['preis_gesamt_brutto']) && $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_5']['price_brutto'] < 0.05 || $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_5']['price_brutto'] > 50) unset($arPayment[$this->id.'_5']);
+								
+			}
+			
+			// HandyPay
+			if (is_admin() || $this->shop->get_option('wpsg_mod_micropayment_handypay_activ') == '1')
+			{
+					
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_micropayment_handypay_mwst'), $this->shop->getDefaultCountry());
+					
+				$arPayment[$this->id.'_6'] = array(
+					'id' => $this->id.'_6',
+					'name' => __($this->shop->get_option('wpsg_mod_micropayment_handypay_name'), 'wpsg'),
+					'preis' => $this->shop->get_option('wpsg_mod_micropayment_handypay_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_micropayment_handypay_mwst'),
+					'mwst_value' => $mwst_value,
+					'mwst_null' => $this->shop->get_option('wpsg_mod_micropayment_handypay_mwstland'),
+					'hint' => __($this->shop->get_option('wpsg_mod_micropayment_handypay_hint')),
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_handypay_logo')))?$this->shop->get_option('wpsg_mod_micropayment_handypay_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/handypay.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_micropayment/gfx/logo_100x25.png')
+				);
+					 
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_micropayment_handypay_gebuehr'), $mwst_value, $arPayment, $this->id.'_6');
+
+				//if (!is_admin() && isset($arBasket['sum']['preis_gesamt_brutto']) && $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_6']['price_brutto'] < 0.49 || $arBasket['sum']['preis_gesamt_brutto'] + $arPayment[$this->id.'_6']['price_brutto'] > 9.99) unset($arPayment[$this->id.'_6']);
+				
+			}
+				
+		} // public function addPayment(&$arPayment)
+		
+		public function calcPayment(&$arBasket)
+		{
+				
+			if (preg_match('/^'.$this->id.'_\d+$/', $arBasket['checkout']['payment']))
+			{
+		
+				$subPayTyp = preg_replace('/^\d+_/', '', $arBasket['checkout']['payment']);
+				
+				switch ($subPayTyp)
+				{
+										
+					case '1': // Kreditkarte
+						
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_creditcard_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_creditcard_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_creditcard_mwst');
+						
+						break;
+						
+					case '7': // Kreditkarte mit Reservierung
+						
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_mwst');
+						
+						break;
+						
+					case '2': // Lastschrift
+						
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_directdebit_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_directdebit_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_directdebit_mwst');
+						
+						break;
+						
+					case '3': // eBankPay
+						
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_ebank2pay_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_ebank2pay_mwst');
+						
+						break;
+						
+					case '4': // Vorkasse
+						
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_prepayment_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_prepayment_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_prepayment_mwst');
+						
+						break;
+						
+					case '5': // Call2Pay
+					
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_call2pay_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_call2pay_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_call2pay_mwst');
+						
+						break;
+						
+					case '6': // HandyPay
+								
+						$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_micropayment_handypay_gebuehr'), $arBasket['sum']['preis']);
+						$mwstland = $this->shop->get_option('wpsg_mod_micropayment_handypay_mwstland');
+						$mwst = $this->shop->get_option('wpsg_mod_micropayment_handypay_mwst');
+						
+						break;
+						
+					default:
+						
+						$this->shop->throwErrorCode('1750_1');
+					
+				}
+				 
+				if ($mwstland == '1' && $arBasket['noMwSt'])
+				{
+						
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+						
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+						
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $mwst);
+		
+				}
+								
+			}
+				
+		} // public function calcPayment(&$arBasket)
+		
+		public function order_done(&$order_id, &$done_view)
+		{
+		 
+			// Bestellungen mit 0 geben nix aus
+			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
+				
+			if (preg_match('/^'.$this->id.'_\d+$/', $this->shop->view['basket']['checkout']['payment']))
+			{
+
+				$payment = $this->shop->view['basket']['checkout']['payment'];
+				
+				switch ($payment)
+				{
+										
+					case $this->id.'_1': // Kreditkarte
+						
+						$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_creditcard_logo')))?$this->shop->get_option('wpsg_mod_micropayment_creditcard_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/creditcard.png'));						
+						break;
+						
+					case $this->id.'_7': // Kreditkarte mit Reservierung
+						
+						//$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_logo')))?$this->shop->get_option('wpsg_mod_micropayment_creditcardreservation_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/creditcard.png'));
+						$logo = false;
+						
+						break;
+						
+					case $this->id.'_2': // Lastschrift
+
+						$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_directdebit_logo')))?$this->shop->get_option('wpsg_mod_micropayment_directdebit_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/directdebit.png'));
+						break;
+						
+					case $this->id.'_3': // eBankPay
+
+						$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_ebank2pay_logo')))?$this->shop->get_option('wpsg_mod_micropayment_ebank2pay_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/bank2pay.png'));
+						break;
+						
+					case $this->id.'_4': // Vorkasse
+
+						$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_prepayment_logo')))?$this->shop->get_option('wpsg_mod_micropayment_prepayment_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/prepayment.png'));
+						break;
+						
+					case $this->id.'_5': // Call2Pay
+
+						$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_call2pay_logo')))?$this->shop->get_option('wpsg_mod_micropayment_call2pay_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/call2pay.png'));
+						break;
+						
+					case $this->id.'_6': // HandyPay
+						  
+						$logo = ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_handypay_logo')))?$this->shop->get_option('wpsg_mod_micropayment_handypay_logo'):$this->shop->getRessourceURL('mods/mod_micropayment/gfx/handypay.png'));
+						break;
+						
+					default:
+						
+						$this->shop->throwErrorCode('1750_1');
+					
+				}
+				
+				$this->shop->view['wpsg_mod_micropayment']['logo'] = $logo;
+				
+				if ($payment != $this->id.'_7')
+				{
+				
+					$this->shop->view['wpsg_mod_micropayment']['payLink'] = $this->getPayLink($order_id);
+									
+				}
+				else
+				{
+					
+					$this->shop->view['wpsg_mod_micropayment']['payLink'] = false;
+						
+				}
+					
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_micropayment/order_done.phtml');
+				
+			}
+		
+		} // public function order_done(&$order_id)
+		 
+		public function mail_payment()
+		{
+		
+			if (!preg_match('/^'.$this->id.'_\d+$/', $this->shop->view['basket']['checkout']['payment'])) return;
+			
+			if ($this->shop->htmlMail === true)
+			{
+				
+				echo '<a href="'.$this->shop->getDoneURL($this->shop->view['o_id']).'">'.__('Zahlungslink', 'wpsg').'</a>'.__(', um die Zahlung durchzufÃŒhren', 'wpsg');						
+				
+			}
+			else
+			{
+			
+				echo wpsg_pad_right(__('Zahlungslink', 'wpsg').':', 35).$this->shop->getDoneURL($this->shop->view['o_id']);
+				
+			}
+				
+		} // public function mail_payment()
+		
+		public function wp_loaded() 
+		{
+			
+			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_micropayment' && $_REQUEST['module_action'] == 'pay')
+			{
+				
+				$form_data = null;
+				parse_str($_REQUEST['form_data'], $form_data);
+				
+				if (!wpsg_isSizedString($form_data['number'])) die(__('Bitte die Kreditkartennummer angeben.', 'wpsg'));
+				if (!wpsg_isSizedString($form_data['cvc2'])) die(__('Bitte die PrÃŒfziffer der Kreditkarte angeben.', 'wpsg'));
+								
+				$oOrder = $this->shop->cache->loadOrderObject($_REQUEST['order_id']);
+				$this->api_init();
+				
+				$api_customer_id = null;
+				
+				if (!wpsg_isSizedString($oOrder->wpsg_mod_micropayment_customerid))
+				{
+										
+					$api_customer_id = $this->api_customerCreate($oOrder);
+					$oOrder->wpsg_mod_micropayment_customerid = $api_customer_id;
+					
+					$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+						'wpsg_mod_micropayment_customerid' => wpsg_q($api_customer_id)
+					), " `id` = '".wpsg_q($oOrder->id)."' ");
+										
+				}
+				else
+				{
+					
+					$api_customer_id = $oOrder->wpsg_mod_micropayment_customerid;
+					
+				}
+								 
+				try 
+				{
+				
+					// Kreditkartendaten ÃŒbermitteln
+					$result = $this->api_creditcardDataSet($oOrder, $api_customer_id, $form_data['number'], $form_data['expiryYear'], $form_data['expiryMonth']);
+					
+					// Session erstellen
+					$result = $this->api_sessionCreate($oOrder, $api_customer_id);
+
+					if (wpsg_isSizedString($result['sessionId']))
+					{
+						
+						$session_id = $result['sessionId'];
+						$result = $this->api_transactionAuthorization($oOrder, $result['sessionId'], $form_data['cvc2']);
+						
+						if (wpsg_isSizedString($result['transactionId']) && $result['transactionStatus'] == 'SUCCESS')
+						{
+							
+							// Authorisierung erfolgreich
+							$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+								'wpsg_mod_micropayment_sessionid' => wpsg_q($session_id),
+								'wpsg_mod_micropayment_transactionid' => wpsg_q($result['transactionId'])								
+							), " `id` = '".wpsg_q($oOrder->id)."' ");
+							
+							// Status setzen
+							$this->shop->setOrderStatus($oOrder->id, '700', false);
+							
+							$oOrder->log(
+								__('Erfolgreiche Micropayment Authorisierung', 'wpsg'),
+								print_r($result, 1)
+							);
+							
+						}
+						else
+						{
+														
+							die(__('Authorisierung konnte nicht durchgefÃŒhrt werden.', 'wpsg'));
+							
+						}
+						
+					}
+					else
+					{
+			 
+						die(__('Session fÃŒr Zahlung konnte nicht aufgebaut werden.', 'wpsg'));
+						
+					}
+					
+				}
+				catch (Exception $e)
+				{
+
+					wpsg_debug($e);
+					die(__('Die Kreditkartendaten wurden nicht akzeptiert.', 'wpsg'));
+					
+				}
+				
+				die("1");
+				
+			}
+			else if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_micropayment' && $_REQUEST['confirm'] == 'micropayment')
+			{
+				 
+				$title = explode('|', $_REQUEST['title']);
+				$order_id = $title[0];
+				$token = base64_decode($title[1]);
+				
+				$order_data = $this->shop->cache->loadOrder($order_id);
+				
+				if ($order_data['id'] != $order_id || $order_id <= 0) die($this->shop->throwErrorCode('1750_4'));
+				
+				$token_check = md5($this->shop->get_option('wpsg_mod_micropayment_accesskey').$order_data['cdate']);
+				
+				if ($token_check != $token) die($this->shop->throwErrorCode('1750_5'));
+				
+				$this->db->ImportQuery(WPSG_TBL_OL, array(
+					"title" => __("Micropayment REQUEST", "wpsg"),
+					"cdate" => "NOW()",
+					"o_id" => wpsg_q($order_id),
+					"mailtext" => wpsg_q(wpsg_hspc(print_r($_REQUEST, 1)))
+				));
+				
+				switch ($_REQUEST['function'])
+				{
+					
+					case 'billing':
+						
+						if ($this->shop->setPayMent($order_id, $_REQUEST['amount'] / 100))
+						{
+								
+							$this->shop->setOrderStatus($order_id, 100, true);
+							
+						}
+						
+						break; 
+					
+				}
+				
+				$url = get_permalink($this->shop->get_option('wpsg_mod_micropayment_successPage'));
+				die("status=ok\nurl=".$url."\ntarget=_top\nforward=1");
+				
+			}
+				
+		} // public function wp_loaded()			
+		
+		public function admin_debugInfo() 
+		{ 
+			
+			echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_micropayment/debugInfo.phtml', true);			
+			
+		} // public function admin_debugInfo()
+		
+		public function setOrderStatus($order_id, $status_id, $inform) 
+		{ 
+			
+			if (!in_array($status_id, array('500', '701'))) return;
+			
+			$oOrder = $this->shop->cache->loadOrderObject($order_id);
+			$bError = false; $ol_text = "";
+			
+			$this->api_init();
+			
+			if ($status_id == '701')
+			{
+												
+				// Wechsel auf "Reservierung eingelÃ¶st"
+				try 
+				{
+					
+					$result = $this->api_transactionCapture($oOrder);
+									
+					if ($result['transactionStatus'] == "SUCCESS" && $result['sessionStatus'] == "SUCCESS")
+					{
+						
+						$oOrder->log(
+							__('Micropayment: Zahlung wurde gebucht', 'wpsg'),
+							print_r($result, 1)								
+						);
+						
+					}
+					else
+					{
+						
+						$bError = true;
+						$ol_text = print_r($result, 1);
+												
+					}
+					
+				} 
+				catch (Exception $e)
+				{
+					
+					$bError = true;
+					$ol_text = $e->getMessage();
+					
+				}
+
+				if ($bError === true)
+				{
+					
+					// Sonst ist die Meldung mit dem erfolgreichem Statuswechsel sichtbar
+					unset($_SESSION['wpsg']['backendMessage']);
+					
+					// Statuswechsel abrechen					
+					$this->shop->addBackendError(
+						wpsg_translate(
+							__('Reservierung konnte nicht gebucht werden. Status auf #1# zurÃŒckgesetzt.', 'wpsg'),
+							$this->shop->arStatus[$this->shop->view['order']['status']]
+						)
+					);
+						
+					$oOrder->log(
+						wpsg_translate(
+							__('Micropayment: Zahlung konnte nicht freigegeben werden / Status auf #1# zurÃŒckgesetzt.', 'wpsg'),
+							$this->shop->arStatus[$this->shop->view['order']['status']]
+						),
+						$ol_text
+					);
+					
+					$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+						'status' => wpsg_q($this->shop->view['order']['status'])
+					), " `id` = '".wpsg_q($oOrder->id)."' ");
+						 
+				}
+				
+			}
+			else if ($status_id == '500' && $this->shop->view['order']['status'] == '700')
+			{
+				
+				// Storniert
+				
+				try 
+				{
+				
+					$result = $this->api_transactionReversal($oOrder);
+					
+					if ($result['sessionStatus'] === "SUCCESS" && $result['transactionStatus'] === "SUCCESS")
+					{
+						
+						$oOrder->log(
+							__('Micropayment: Zahlungsreservierung wurde erfolgreich storniert', 'wpsg'),
+							print_r($result, 1)								
+						);
+										
+					}
+					else
+					{
+						
+						$bError = true;
+						$ol_text = print_r($result, 1);
+						
+					}
+					
+				} 
+				catch (Exception $e)
+				{
+					
+					$bError = true;
+					$ol_text = $e->getMessage();
+					
+				}
+				
+				if ($bError === true)
+				{
+					
+					// Kein zurÃŒcksetzen, ich denke es macht Sinn das der Status denoch auf storniert geht 
+					$this->shop->addBackendError(__('Zahlungsreservierung konnte nicht aufgehoben werden', 'wpsg'));
+					
+					$oOrder->log(
+						__('Micropayment: Zahlungsreservierung konnte nicht aufgehoben werden', 'wpsg'),
+						$ol_text
+					);
+					
+				}
+				 
+			}
+			
+			
+		} // public function setOrderStatus($order_id, $status_id, $inform)
+		
+		/** Modulfunktionen */
+		
+		private function api_init()
+		{
+			
+			require_once WPSG_PATH_MOD.'mod_micropayment/mcp-serviceclient_1_17/lib/init.php';
+			require_once WPSG_PATH_MOD.'mod_micropayment/mcp-serviceclient_1_17/services/IMcpCreditcardService_v1_2.php';
+			require_once MCP__SERVICELIB_DISPATCHER.'TNvpServiceDispatcher.php';
+			
+			$this->dispatcher = new TNvpServiceDispatcher('IMcpCreditcardService_v1_2', 'https://sipg.micropayment.de/public/creditcard/v1.2/nvp/');
+			
+		} // private function api_init()
+		
+		private function api_customerCreate(&$oOrder)
+		{
+			  			
+			$result = $this->dispatcher->customerCreate(
+				$this->shop->get_option('wpsg_mod_micropayment_accesskey'),
+				(($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')?'1':'0'),
+				null,
+				null, //  Liste mit freien Parametern, die dem Kunden zugeordnet werden
+				$oOrder->getInvoiceFirstName(),
+				$oOrder->getInvoiceName(), 
+				$oOrder->getCustomer()->getEMail(), 
+				'de-DE' // 	Sprache & Land des Kunden | gÃŒltige Beispielwerte sind 'de', 'de-DE', 'en-US'
+			); 
+			
+			return $result;
+	 
+		} // private function api_customerCreate($order_id)
+		
+		private function api_sessionCreate(&$oOrder, $api_customer_id)
+		{ 
+			  
+			$_SERVER['REMOTE_ADDR'] = '134.97.73.195';
+			$result = $this->dispatcher->sessionCreate(
+				$this->shop->get_option('wpsg_mod_micropayment_accesskey'), // AccessKey aus dem Controlcenter
+				(($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')?'1':'0'), // aktiviert Testumgebung
+				$api_customer_id, // ID des Kunden
+				null, // eigene eindeutige ID des Vorgangs, wird anderenfalls erzeugt [max. 40 Zeichen]
+				$this->shop->get_option('wpsg_mod_micropayment_projectid'), // das ProjektkÃŒrzel fÃŒr den Vorgang
+				((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_campaign')))?$this->shop->get_option('wpsg_mod_micropayment_campaign'):null), // ein KampagnenkÃŒrzel des Projektbetreibers
+				((wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_account')))?$this->shop->get_option('wpsg_mod_micropayment_account'):null), // Account des beteiligten Webmasters sonst eigener - setzt eine Aktivierung der WebmasterfÃ€higkeit des Projekts vorraus - Hinweis: WebmasterfÃ€higkeit steht momentan nicht zur VerfÃŒgung
+				null, // ein KampagnenkÃŒrzel des Webmasters
+				wpsg_round($oOrder->getAmount(), 2) * 100, // abzurechnender Betrag, wird kein Betrag ÃŒbergeben, wird der Betrag aus der Konfiguration verwendet
+				'EUR', // WÃ€hrung
+				null, // Bezeichnung der zu kaufenden Sache - Verwendung in Falle einer auftretenden Benachrichtigung wird dieser Wert als Produktidentifizierung mit geschickt, wird kein Wert ÃŒbergeben, wird Der aus der Konfiguration verwendet
+				null, // Bezeichnung der zu kaufenden Sache - Verwendung beim Mailversand, sollten Sie Diesen wÃŒnschen
+				$_SERVER['REMOTE_ADDR'], // IPv4 des Benutzers
+				null, // Liste mit freien Parametern, die dem Vorgang zugeordnet werden
+				false // sendMail ?
+			);
+			
+			return $result;
+			
+		}
+		
+		public function api_transactionAuthorization(&$oOrder, $session_id, $cvc2)
+		{
+
+			$result = $this->dispatcher->transactionAuthorization(
+				$this->shop->get_option('wpsg_mod_micropayment_accesskey'), // AccessKey aus dem Controlcenter
+				(($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')?'1':'0'), // aktiviert Testumgebung
+				$session_id,
+				$cvc2					
+			);
+			
+			return $result;
+			
+		} // public function api_transactionAuthorization(&$oOrder, $session_id, $cvc2)
+		
+		public function api_transactionReversal(&$oOrder)
+		{
+			
+			$result = $this->dispatcher->transactionReversal(
+				$this->shop->get_option('wpsg_mod_micropayment_accesskey'), // AccessKey aus dem Controlcenter
+				(($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')?'1':'0'), // aktiviert Testumgebung	
+				$oOrder->wpsg_mod_micropayment_sessionid,
+				$oOrder->wpsg_mod_micropayment_transactionid
+			);
+			
+			return $result;
+			
+		} // public function api_transactionReversal(&$oOrder)
+		
+		public function api_creditcardDataSet(&$oOrder, $api_customer_id, $number, $expiryYear, $expiryMonth)
+		{
+			 				
+			$result = $this->dispatcher->creditcardDataSet(
+				$this->shop->get_option('wpsg_mod_micropayment_accesskey'), // AccessKey aus dem Controlcenter
+				(($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')?'1':'0'), // aktiviert Testumgebung
+				$api_customer_id, // ID des Kunden
+				$number,
+				$expiryYear,
+				$expiryMonth
+			); 
+			
+			return $result;
+			
+		} // public function creditcardDataSet($order_id, $api_customer_id, $number, $expiryYear, $expiryMonth)
+		
+		public function api_transactionCapture(&$oOrder)
+		{
+			
+			$result = $this->dispatcher->transactionCapture(
+				$this->shop->get_option('wpsg_mod_micropayment_accesskey'), // AccessKey aus dem Controlcenter
+				(($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')?'1':'0'), // aktiviert Testumgebung
+				$oOrder->wpsg_mod_micropayment_sessionid,
+				$oOrder->wpsg_mod_micropayment_transactionid
+			);
+			
+			return $result;
+			
+		} // public function api_transactionCapture(&$oOrder)
+		
+		/**
+		 * Ruft die URLs von dem Micropayment Billing Info auf
+		 */
+		public function getBillingURLs()
+		{
+			
+			$url = 'https://webservices.micropayment.de/public/info/index.php?'.http_build_query(
+				array(
+					'action' => 'GenerateUrl',
+					'format' => 'json',
+					'account_id' => '27937'
+				),
+				null,
+				'&'		
+			);
+			
+			$json_data = json_decode($this->shop->get_url_content($url));
+					 
+			if (wpsg_isSizedString($json_data->billing))
+			{
+				
+				$this->shop->update_option('wpsg_mod_micropayment_event_creditcard_url', 'http://'.$json_data->billing.'/creditcard/event/');
+				$this->shop->update_option('wpsg_mod_micropayment_event_directdebit_url', 'http://'.$json_data->billing.'/lastschrift/event/');
+				$this->shop->update_option('wpsg_mod_micropayment_event_ebank2pay_url', 'http://'.$json_data->billing.'/ebank2pay/event/');
+				$this->shop->update_option('wpsg_mod_micropayment_event_prepayment_url', 'http://'.$json_data->billing.'/prepay/event/');
+				$this->shop->update_option('wpsg_mod_micropayment_event_call2pay_url', 'http://'.$json_data->billing.'/call2pay/event/');
+				$this->shop->update_option('wpsg_mod_micropayment_event_handypay_url', 'http://'.$json_data->billing.'/handypay/event/');
+				 
+			}
+			
+		} // public function getBillingURLs()
+		
+		/**
+		 * Gibt den Link zum bezahlen einer Bestellung anhand der BestellID zurÃŒck
+		 * @param Int $order_id ID der Bestellung 
+		 */
+		public function getPayLink($order_id)
+		{
+			
+			$order_data = $this->shop->cache->loadOrder($order_id);
+			 
+			if (!preg_match('/^'.$this->id.'_\d+$/', $order_data['type_payment'])) 
+			{
+
+				$this->shop->throwErrorCode('1750_2');
+				return;
+				
+			}
+			
+			$subPayTyp = preg_replace('/^\d+_/', '', $order_data['type_payment']);
+			
+			$arParam = array();
+			$arParam['project'] = $this->shop->get_option('wpsg_mod_micropayment_projectid');
+			
+			$arParam['title'] = $order_id.'|'.base64_encode(md5($this->shop->get_option('wpsg_mod_micropayment_accesskey').$order_data['cdate']));
+			
+			switch ($subPayTyp)
+			{
+									
+				case '1': // Kreditkarte
+					
+					$url = $this->event_creditcard_url;
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					$arParam['currency'] = 'EUR';
+					
+					break;
+					
+				case '7': // Kreditkarte mit Reservierung
+					
+					$url = $this->event_creditcard_url;
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					$arParam['currency'] = 'EUR';
+							
+					break;
+					
+				case '2': // Lastschrift
+					
+					$url = $this->event_directdebit_url;
+					$arParam['paytext'] = $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_micropayment_directdebit_subject'), 'wpsg'), $order_id);
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					$arParam['userid'] = $order_data['k_id'];
+					
+					break;
+					
+				case '3': // eBankPay
+					
+					$url = $this->event_ebank2pay_url;
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					
+					break;
+					
+				case '4': // Vorkasse
+					
+					$url = $this->event_prepayment_url;
+					$arParam['paytext'] = $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_micropayment_prepayment_subject'), 'wpsg'), $order_id);
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					
+					break;
+					
+				case '5': // Call2Pay
+				
+					$url = $this->event_call2pay_url;
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					
+					break;
+					
+				case '6': // HandyPay
+							
+					$url = $this->event_handypay_url; 
+					$arParam['amount'] = wpsg_round(wpsg_tf($order_data['price_gesamt']), 2) * 100;
+					
+					break;
+					
+				default:
+					
+					$this->shop->throwErrorCode('1750_3');
+					return;
+				
+			}
+			
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_account'))) $arParam['account'] = $this->shop->get_option('wpsg_mod_micropayment_account');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_layout'))) $arParam['theme'] = $this->shop->get_option('wpsg_mod_micropayment_layout');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_bgcolor'))) $arParam['bgcolor'] = $this->shop->get_option('wpsg_mod_micropayment_bgcolor');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_campaign'))) $arParam['projectcampaign'] = $this->shop->get_option('wpsg_mod_micropayment_campaign');
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_micropayment_bggfx'))) $arParam['bggfx'] = $this->shop->get_option('wpsg_mod_micropayment_bggfx'); 
+			
+			$params = http_build_query($arParam, null, '&');
+			
+			$seal = md5($params.$this->shop->get_option('wpsg_mod_micropayment_accesskey'));
+			$params .= '&seal='.$seal;
+
+			if ($this->shop->get_option('wpsg_mod_micropayment_sandbox') == '1')
+			{
+				
+				$params .= '&testmode=1';
+				
+			}
+			
+			return $url.'?'.$params;
+			
+		} // public function getPayLink($order_id)
+		
+	} // class wpsg_mod_micropayment extends wpsg_mod_basic
+
+?>
Index: ds/wpsg_mod_micropayment_paywindow.class.php
===================================================================
--- /mods/wpsg_mod_micropayment_paywindow.class.php	(revision 8528)
+++ 	(revision )
@@ -1,446 +1,0 @@
-<?php
-
-	/**
-	 * Klasse, die verschiedene Zahlungsarten ÃŒber den micropayment.de Dienstleister ermÃ¶glicht
-	 * Ist nur fÃŒr die Lizenztypen Pro und Enterpreise zulÃ€ssig
-	 * @author Daschmi (05.07.2013)
-	 */
-	class wpsg_mod_micropayment_paywindow extends wpsg_mod_basic {
-		
-		var $lizenz = 2;
-		var $id = 1750;
-		var $hilfeURL = 'http://wpshopgermany.de/?p=3424';
-
-		var $arPaymentWindow = [];
-		var $default_pay_title = 'O%order_onr% K%kunde_knr%';
-		var $default_pay_text = 'Bezahlung zur Bestellung %order_onr%';
-
-		/**
-		 * Costructor
-		 */
-		public function __construct() {
-				
-			parent::__construct();
-				
-			$this->name = __('micropaymentâ¢', 'wpsg');
-			$this->group = __('Zahlungsarten', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Zahlung ÃŒber den Zahlungsdienstleister <a href="http://r132.micropayment.de">micropaymentâ¢</a>.', 'wpsg');
-
-            $this->arPaymentWindow = [
-                1 => [
-                    'code' => 'creditcard',
-                    'title' => 'Kreditkarte',
-                    'url' => 'https://creditcard.micropayment.de/creditcard/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/creditcard.png')
-                ],
-                2 => [
-                    'index' => 'lastschrift',
-                    'title' => 'Lastschrift',
-                    'url' => 'https://sepadirectdebit.micropayment.de/lastschrift/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/lastschrift.png')
-                ],
-                3 => [
-                    'index' => 'sofort',
-                    'title' => 'Sofort.',
-                    'url' => 'https://directbanking.micropayment.de/sofort/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/sofort.png')
-                ],
-                4 => [
-                    'index' => 'prepay',
-                    'title' => 'Vorkasse',
-                    'url' => 'https://prepayment.micropayment.de/prepay/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/prepay.png')
-                ],
-                5 => [
-                    'index' => 'paypal',
-                    'title' => 'PayPal',
-                    'url' => 'https://paypal.micropayment.de/paypal/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/paypal.png')
-                ],
-                6 => [
-                    'index' => 'paydirekt',
-                    'title' => 'paydirekt',
-                    'url' => 'https://paydirekt.micropayment.de/paydirekt/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/paydirekt.png')
-                ],
-                7 => [
-                    'index' => 'paysafecard',
-                    'title' => 'paysafecard',
-                    'url' => 'https://paysafecard.micropayment.de/paysafecard/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/paysafecard.png')
-                ],
-                8 => [
-                    'index' => 'call2pay',
-                    'title' => 'Call2Pay',
-                    'url' => 'https://call2pay.micropayment.de/call2pay/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/call2pay.png')
-                ],
-                9 => [
-                    'index' => 'handypay',
-                    'title' => 'HandyPay',
-                    'url' => 'https://mobilepayment.micropayment.de/handypay/event/',
-                    'logo' => $this->shop->getRessourceURL('mods/mod_micropayment_paywindow/gfx/handypay.png')
-                ]
-            ];
-			
-		} // public function __construct()
-
-        public function install() {
-
-            $this->shop->checkDefault('wpsg_mod_micropayment_autorun', '1');
-
-        }
-
-		public function settings_edit() {
-			
-			$pages = get_pages();
-			
-			$arPages = array(
-				'-1' => __('Neu anlegen und zuordnen', 'wpsg')
-			);
-			
-			foreach ($pages as $k => $v) {
-
-				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
-
-			}
-
-            $view = [];
-			$view['arPaymentWindow'] = $this->arPaymentWindow;
-            $view['arPages'] = $arPages;
-            $view['notification_url'] = $this->shop->getURL(wpsg_ShopController::URL_BASKET);
-            $view['notification_password'] = $this->getNotificationPassword();
-            $view['default_pay_title'] = $this->default_pay_title;
-            $view['default_pay_text'] = $this->default_pay_text;
-
-            $this->shop->view['wpsg_mod_micropayment_paywindow'] = $view;
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_micropayment_paywindow/settings_edit.phtml');
-			
-		} // public function settings_edit()
-		
-		public function settings_save() {
-
-            $this->shop->update_option('wpsg_mod_micropayment_paywindow_accesskey', $_REQUEST['wpsg_mod_micropayment_paywindow_accesskey'], false, false, WPSG_SANITIZE_APIKEY);
-            $this->shop->update_option('wpsg_mod_micropayment_paywindow_projectid', $_REQUEST['wpsg_mod_micropayment_paywindow_projectid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->createPage(__('Fehlgeschlagene Micropayment Zahlung', 'wpsg'), 'wpsg_mod_micropayment_paywindow_page_error', intval($_REQUEST['wpsg_mod_micropayment_paywindow_page_error']));
-            $this->shop->update_option('wpsg_mod_micropayment_paywindow_paytitle', $_REQUEST['wpsg_mod_micropayment_paywindow_paytitle'], false, false, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_micropayment_paywindow_paytext', $_REQUEST['wpsg_mod_micropayment_paywindow_paytext'], false, false, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_micropayment_paywindow_sandbox', $_REQUEST['wpsg_mod_micropayment_paywindow_sandbox'], false, false, WPSG_SANITIZE_TEXTFIELD);
-            $this->shop->update_option('wpsg_mod_micropayment_autorun', $_REQUEST['wpsg_mod_micropayment_autorun'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-            foreach ($this->arPaymentWindow as $pw_key => $pw) {
-
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_activ', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_activ'], false, WPSG_SANITIZE_CHECKBOX);
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_title', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_title'], false, WPSG_SANITIZE_TEXTAREA);
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_hint', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_hint'], false, WPSG_SANITIZE_TEXTAREA);
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_logo', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_logo'], false, WPSG_SANITIZE_URL);
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_gebuehr', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_gebuehr'], false, WPSG_SANITIZE_FLOAT);
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_mwst', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_mwst'], false, WPSG_SANITIZE_TAXKEY);
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_mwstland', $_REQUEST['wpsg_mod_micropayment_paywindow_'.$pw_key.'_mwstland'], false, WPSG_SANITIZE_CHECKBOX);
-
-            }
-
-		} // public function settings_save()
-
-		public function addPayment(&$arPayment) {
-
-		    foreach ($this->arPaymentWindow as $pw_key => $pw) {
-
-		        $active = intval($this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_activ'));
-                $price = wpsg_ff($this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_gebuehr'));
-                $tax_key = $this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_mwst');
-                $tax_null = $this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_mwstland');
-                $hint = __(\sanitize_text_field($this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_hint')));
-
-                if (!wpsg_isSizedString($logo)) $logo = $pw['logo'];
-
-		        if ($active === 1) {
-
-		            $payment_code = $this->id.'_'.$pw_key;
-
-                    $arPayment[$payment_code] = array(
-                        'id' => $payment_code,
-                        'name' => $this->getTitle($payment_code),
-                        'price' => $price,
-                        'tax_key' => $tax_key,
-                        'mwst_null' => $tax_null,
-                        'hint' => $hint,
-                        'logo' => $this->getLogo($payment_code)
-                    );
-
-                }
-
-            }
-
-		} // public function addPayment(&$arPayment)
-		 
-		public function order_done(&$order_id, &$done_view) {
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-
-			// Bestellungen mit 0 geben nix aus
-			if ($oOrder->getToPay() <= 0) return;
-
-            $payment_code = $this->shop->view['basket']['checkout']['payment'];
-
-			if (preg_match('/^'.$this->id.'_\d+$/', $payment_code)) {
-
-                $view = [
-                    'order_status' => $oOrder->getStatusCode(),
-				    'logo' => $this->getLogo($payment_code),
-                    'url' => $this->getUrl($payment_code, [
-                        'amount' => $oOrder->getToPay(WPSG_BRUTTO) * 100,
-                        'currency' => $this->shop->get_option('wpsg_currency'),
-                        'title' => $this->getPayTitle($oOrder),
-                        'paytext' => $this->getPayText($oOrder),
-                        'testmode' => (($this->shop->get_option('wpsg_mod_micropayment_paywindow_sandbox') === '1')?'1':'0'),
-                        'userid ' => $oOrder->getCustomer()->getId(),
-                        'orderid' => $oOrder->getId()
-                    ]),
-                    'title' => $this->getTitle($payment_code)
-                ];
-
-                $this->shop->view['wpsg_mod_micropayment_paywindow'] = $view;
-				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_micropayment_paywindow/order_done.phtml');
-				
-			}
-		
-		} // public function order_done(&$order_id)
-		 
-		public function mail_payment() {
-		
-			if (!preg_match('/^'.$this->id.'_\d+$/', $this->shop->view['basket']['checkout']['payment'])) return;
-			
-			if ($this->shop->htmlMail === true) {
-				
-				echo '<a href="'.$this->shop->getDoneURL($this->shop->view['o_id']).'">'.__('Zahlungslink', 'wpsg').'</a>'.__(', um die Zahlung durchzufÃŒhren', 'wpsg');						
-				
-			} else {
-			
-				echo wpsg_pad_right(__('Zahlungslink', 'wpsg').':', 35).$this->shop->getDoneURL($this->shop->view['o_id']);
-				
-			}
-				
-		} // public function mail_payment()
-		
-		public function template_redirect() {
-
-            if (\get_the_ID() === intval($this->shop->get_option('wpsg_page_basket')) && wpsg_isSizedString($_REQUEST['function'], 'billing')) {
-
-                $oOrder = wpsg_order::getInstance($_REQUEST['order_id']);
-
-                if ($oOrder->isLoaded()) {
-
-                    // Ich ignoriere Zahlungen die bereits extern gezahlt gemeldet wurden
-                    //if ($oOrder->__get('ext_payed') === '1') exit;
-
-                    try {
-
-                        // DNS Backcheck
-                        $arHosts = [
-							'proxy.micropayment.de', 'access.micropayment.de', 'service.micropayment.de', 'micropayment.de',
-							'193.159.183.235', '193.159.183.236', '193,159,183,234'
-						];
-                        $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
-
-                        if (!in_array($host, $arHosts)) {
-
-                            throw new \Exception(
-                                wpsg_translate(__('Hostname #1# ist nicht in den erlaubten Hosts (#2#) enthalten', 'wpsg'), $host, implode(', ', $arHosts))
-                            );
-
-                        }
-
-                        if ($this->getNotificationPassword() !== wpsg_getStr($_REQUEST['notification_password'])) {
-
-                            throw new \Exception(
-                                wpsg_translate(
-                                    __('Ãbermitteltes Benachrichtigungspasswort (#1#) stimmt nicht mit dem hinterlegten (#2#) ÃŒberein.', 'wpsg'),
-                                    wpsg_getStr($_REQUEST['notification_password']),
-                                    $this->getNotificationPassword()
-                                )
-                            );
-
-                        }
-
-                        if ($oOrder->getToPay(WPSG_BRUTTO) !== wpsg_getFloat($_REQUEST['amount']) / 100) {
-
-                            throw new \Exception(
-                                wpsg_translate(
-                                    __('Ãbermittelter Zahlbetrag (#1#) stimmt nicht mit der Bestellung (#2#) ÃŒberein.', 'wspg'),
-                                    wpsg_getFloat($_REQUEST['amount']) / 100,
-                                    $oOrder->getToPay(WPSG_BRUTTO)
-                                )
-                            );
-
-                        }
-
-
-                        if ($this->shop->setPayMent($oOrder->getId(), $_REQUEST['amount'] / 100)) {
-
-                            $this->shop->setOrderStatus($oOrder->getId(), 100, true);
-
-                            $this->db->UpdateQuery(WPSG_TBL_ORDER, ['ext_payed' => '1'], " `id` = '".wpsg_q($oOrder->getId())."' ");
-
-                            $oOrder->addLogEntry(__('MicroPayment Zahlungseingang', 'wpsg'), print_r($_REQUEST, true));
-
-                        } else throw new \Exception(__('Zahlung konnte nicht validiert werden.', 'wpsg'));
-
-                        $url = wpsg_ShopController::getShop()->getDoneURL($oOrder->getId());
-
-                    } catch (\Exception $e) {
-
-                        $oOrder->addLogEntry(__('MicroPayment Fehler', 'wpsg'), $e->getMessage()."\r\n".print_r($_REQUEST, true));
-                        $url = \get_permalink($this->shop->get_option('wpsg_mod_micropayment_paywindow_page_error'));
-
-                    }
-
-                } else {
-
-                    $url = \get_permalink($this->shop->get_option('wpsg_mod_micropayment_paywindow_page_error'));
-
-                }
-
-                $delimiter = "\n";
-                $status = 'ok';
-                $target = '_self';
-                $forward = '1';
-
-                $response = '';
-                $response .= 'status='.$status;
-                $response .= $delimiter;
-                $response .= 'url='.$url;
-                $response .= $delimiter;
-                $response .= 'forward='.$forward;
-                $response .= $delimiter;
-                $response .= 'target='.$target;
-                $response .= $delimiter;
-
-                echo $response;
-                exit;
-
-            }
-				
-		} // public function template_redirect()			
-
-		/** Modulfunktionen */
-
-        /**
-         * @param $payment_code z.B. 1750_0
-         * @return string
-         * @throws Exception
-         */
-        public function getTitle($payment_code) {
-
-            if (!preg_match('/^'.$this->id.'_\d+$/', $payment_code)) throw \wpsg\Exception::getInvalidValueException();
-
-            $pw_key = explode('_', $payment_code)[1];
-
-            $title = \sanitize_text_field($this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_title'));
-            if (!wpsg_isSizedString($title)) $title = $this->arPaymentWindow[$pw_key]['title'];
-
-            return $title;
-
-        }
-
-        /**
-         * @param $payment_code z.B. 1750_0
-         * @return string
-         * @throws Exception
-         */
-        public function getUrl($payment_code, $arData) {
-
-            if (!preg_match('/^'.$this->id.'_\d+$/', $payment_code)) throw \wpsg\Exception::getInvalidValueException();
-
-            $pw_key = explode('_', $payment_code)[1];
-
-            $strGETQuery = http_build_query($arData + [
-                'project' => $this->shop->get_option('wpsg_mod_micropayment_paywindow_projectid')
-            ]);
-
-            $url = $this->arPaymentWindow[$pw_key]['url'].'?'.$strGETQuery;
-            $url = $this->sealUrl($url);
-
-            return $url;
-
-        }
-
-        /**
-         * @param $payment_code z.B. 1750_0
-         * @return string
-         * @throws Exception
-         */
-        public function getLogo($payment_code) {
-
-		    if (!preg_match('/^'.$this->id.'_\d+$/', $payment_code)) throw \wpsg\Exception::getInvalidValueException();
-
-		    $pw_key = explode('_', $payment_code)[1];
-
-            $logo = __(\esc_url_raw($this->shop->get_option('wpsg_mod_micropayment_paywindow_'.$pw_key.'_logo')));
-            if (!wpsg_isSizedString($logo)) $logo = $this->arPaymentWindow[$pw_key]['logo'];
-
-            return $logo;
-
-        }
-
-        public function getPayTitle($oOrder) {
-
-            $pay_title = $this->shop->get_option('wpsg_mod_micropayment_paywindow_paytitle');
-
-            if (!wpsg_isSizedString($pay_title)) $pay_title = $this->default_pay_title;
-
-            $pay_title = $this->shop->replaceUniversalPlatzhalter($pay_title, $oOrder->getId());
-
-            return $pay_title;
-
-        }
-
-        public function getPayText($oOrder) {
-
-            $pay_text = $this->shop->get_option('wpsg_mod_micropayment_paywindow_paytext');
-
-            if (!wpsg_isSizedString($pay_text)) $pay_text = $this->default_pay_text;
-
-            $pay_text = $this->shop->replaceUniversalPlatzhalter($pay_text, $oOrder->getId());
-
-            return $pay_text;
-
-        }
-
-        /**
-         * Versiegelt die URL
-         * https://www.micropayment.de/help/integration_web/?reset=1&context=504a5574356e6e726f6335424d47306c4a517134715237654a374c6c6c4a4f35375549336f687943306e4d3d&_r=mbr&_src=ctor
-         *
-         * @param $url
-         * @return string
-         */
-        private function sealUrl($url) {
-
-            $accessKey = $this->shop->get_option('wpsg_mod_micropayment_paywindow_accesskey');
-
-            $matches = [];
-            preg_match('/^(http(?:s?):\/\/[^?]*?\?)?\?*(.*?)(?:&?seal=([^&]*)(&?.*)?)?$/', $url, $matches);
-            $matches = array_merge($matches, [1 => '', 2 => '', 3 => '', 4 => '']);
-
-            return (string)$matches[1].(string)$matches[2].'&seal='.md5(urldecode((string)$matches[2]).(string)$accessKey).(string)$matches[4];
-
-        }
-
-        public function getNotificationPassword() {
-
-            $notification_password = $this->shop->get_option('wpsg_mod_micropayment_paywindow_notification_password');
-
-            if (!wpsg_isSizedString($notification_password)) {
-
-                $notification_password = wpsg_genCode(32);
-
-                $this->shop->update_option('wpsg_mod_micropayment_paywindow_notification_password', $notification_password);
-
-            }
-
-            return $notification_password;
-
-        }
-
-	} // class wpsg_mod_micropayment extends wpsg_mod_basic
-
Index: /mods/wpsg_mod_minquantity.class.php
===================================================================
--- /mods/wpsg_mod_minquantity.class.php	(revision 8528)
+++ /mods/wpsg_mod_minquantity.class.php	(revision 5261)
@@ -41,37 +41,4 @@
 		} // public function install()
 		
-		public function product_addedit_content(&$product_content, &$product_data) {
-
-			if (wpsg_isSizedInt($product_data['id'])) {
-					
-				$product_data = wpsg_array_merge($product_data, $this->db->fetchRow("
-						SELECT
-							`wpsg_mod_minquantity_value`,`wpsg_mod_minquantity_valuemax`
-						FROM
-							`".WPSG_TBL_PRODUCTS."`
-						WHERE
-							`id` = '".wpsg_q($product_data['id'])."'
-					"));
-					
-			}
-		
-			$product_data['arMinquantity_value'] = explode(',', $this->shop->get_option('wpsg_mod_minquantity_value'));
-			$product_data['arMinquantity_valuemax'] = explode(',', $this->shop->get_option('wpsg_mod_minquantity_valuemax'));
-			
-			#$product_content['general']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_minquantity/produkt_addedit_allgemein.phtml', false);
-
-            if (!array_key_exists('stock', $product_content)) {
-
-                $this->shop->view['arSubAction']['stock'] = array(
-                    'title' => __('Bestand / Gew. / FÃŒllm.', 'wpsg'),
-                    'content' => ''
-                );
-
-            }
-
-			$this->shop->view['arSubAction']['stock']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_minquantity/produkt_addedit_allgemein.phtml', false);
-			
-		}
-		
 		public function settings_edit()
 		{
@@ -86,18 +53,20 @@
 		} // public function settings_save()
 		
-		public function produkt_edit_allgemein(&$produkt_data) {
-
-			$this->shop->view['wpsg_mod_minquantity']['value'] = wpsg_getStr($produkt_data['wpsg_mod_minquantity_value']);
-			$this->shop->view['wpsg_mod_minquantity']['valuemax'] = wpsg_getStr($produkt_data['wpsg_mod_minquantity_valuemax']);
-			
-			//$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_minquantity/produkt_edit_allgemein.phtml');
+		public function produkt_edit_allgemein(&$produkt_data) 
+		{ 
+	 
+			$this->shop->view['wpsg_mod_minquantity']['value'] = $produkt_data['wpsg_mod_minquantity_value'];
+			$this->shop->view['wpsg_mod_minquantity']['valuemax'] = $produkt_data['wpsg_mod_minquantity_valuemax'];
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_minquantity/produkt_edit_allgemein.phtml');
 			
 		} // public function produkt_edit_allgemein(&$produkt_data)
 		
-		public function produkt_save_before(&$produkt_data) {
-				
-			wpsg_checkRequest('wpsg_mod_minquantity_value', [WPSG_SANITIZE_INT], __('Mindestbestellmenge', 'wpsg'), $produkt_data, $_REQUEST['wpsg_mod_minquantity']['value']);
-			wpsg_checkRequest('wpsg_mod_minquantity_valuemax', [WPSG_SANITIZE_INT], __('Maximalbestellmenge', 'wpsg'), $produkt_data, $_REQUEST['wpsg_mod_minquantity']['valuemax']);
-			 
+		public function produkt_save_before(&$produkt_data)
+		{
+				
+			$produkt_data['wpsg_mod_minquantity_value'] = wpsg_tf($_REQUEST['wpsg_mod_minquantity']['value']);
+			$produkt_data['wpsg_mod_minquantity_valuemax'] = wpsg_tf($_REQUEST['wpsg_mod_minquantity']['valuemax']);
+ 
 		} // public function produkt_save_before(&$produkt_data)
 		
@@ -128,5 +97,5 @@
 					// In Session korrigieren
 					// Sollte eigentlich anders gebaut werden, aber will den Kern momentan nicht anpassen
-					foreach ($_SESSION['wpsg']['basket'] ?: [] as $k => $p)
+					foreach ($_SESSION['wpsg']['basket'] as $k => $p)
 					{
 						
Index: /mods/wpsg_mod_minrequest.class.php
===================================================================
--- /mods/wpsg_mod_minrequest.class.php	(revision 8528)
+++ /mods/wpsg_mod_minrequest.class.php	(revision 5261)
@@ -26,18 +26,5 @@
 		public function install()
 		{
-		    
-		    require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-		    
-		    /*
-		     * Produkt Tabelle erweitern
-		     */
-		    $sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
-		   		wpsg_mod_minrequest_product_activ INT(11) NOT NULL,
-                wpsg_mod_minrequest_value DOUBLE(10,2) NOT NULL,
-				wpsg_mod_minrequest_valuemax DOUBLE(10,2) NOT NULL
-		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-		    
-		    dbDelta($sql);		    
-		    
+			
 		} // public function install()
 		
@@ -52,54 +39,8 @@
 		{
 			
-		    $this->shop->update_option('wpsg_mod_minrequest_productamount', $_REQUEST['wpsg_mod_minrequest_productamount'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_minrequest_productamount_max', $_REQUEST['wpsg_mod_minrequest_productamount_max'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_minrequest_basketamount', $_REQUEST['wpsg_mod_minrequest_basketamount'], false, false, WPSG_SANITIZE_FLOAT);
-		    $this->shop->update_option('wpsg_mod_minrequest_basketmaxamount', $_REQUEST['wpsg_mod_minrequest_basketmaxamount'], false, false, WPSG_SANITIZE_FLOAT);
+			$this->shop->update_option('wpsg_mod_minrequest_basketamount', wpsg_tf($_REQUEST['wpsg_mod_minrequest_basketamount']));
+			$this->shop->update_option('wpsg_mod_minrequest_basketmaxamount', wpsg_tf($_REQUEST['wpsg_mod_minrequest_basketmaxamount']));
 			
 		} // public function settings_save()
-		
-		/*
-		 * zeigt die Staffelpreise im Produktbackend an
-		 */
-		public function product_addedit_content(&$product_content, &$product_data) {
-		    
-		    if (wpsg_isSizedInt($product_data['id'])) {
-		        
-		        $product_data = wpsg_array_merge($product_data, $this->db->fetchRow("
-						SELECT
-							`wpsg_mod_minrequest_value`,`wpsg_mod_minrequest_valuemax`, `wpsg_mod_minrequest_product_activ`
-						FROM
-							`".WPSG_TBL_PRODUCTS."`
-						WHERE
-							`id` = '".wpsg_q($product_data['id'])."'
-					"));
-
-			    $product_data['arMinrequest_value'] = explode(',', $this->shop->get_option('wpsg_mod_minrequest_value'));
-			    $product_data['arMinrequest_valuemax'] = explode(',', $this->shop->get_option('wpsg_mod_minrequest_valuemax'));
-
-	            $product_content['price']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_minrequest/produkt_addedit_allgemein.phtml', false);
-
-		    }
-		    
-		}//public function product_addedit_content(&$product_content, &$product_data)
-		
-		
-		public function produkt_edit_allgemein(&$produkt_data) {
-
-		    $this->shop->view['wpsg_mod_minrequest']['product_activ'] = $produkt_data['wpsg_mod_minrequest_product_activ']??'0';
-		    $this->shop->view['wpsg_mod_minrequest']['value'] = $produkt_data['wpsg_mod_minrequest_value']??'';
-		    $this->shop->view['wpsg_mod_minrequest']['valuemax'] = $produkt_data['wpsg_mod_minrequest_valuemax']??'';
-		    
-		    //$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_minquantity/produkt_edit_allgemein.phtml');
-		    
-		} // public function produkt_edit_allgemein(&$produkt_data)
-		
-		public function produkt_save_before(&$produkt_data) {
-
-			wpsg_checkRequest('wpsg_mod_minrequest_product_activ', [WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]], __('Minimalbestand Aktiv'), $produkt_data, $_REQUEST['wpsg_mod_minrequest']['product_activ']);
-			wpsg_checkRequest('wpsg_mod_minrequest_value', [WPSG_SANITIZE_FLOAT, ['allowEmpty' => true]], __('Minimalbestand Aktiv'), $produkt_data, $_REQUEST['wpsg_mod_minrequest']['value']);
-			wpsg_checkRequest('wpsg_mod_minrequest_valuemax', [WPSG_SANITIZE_FLOAT, ['allowEmpty' => true]], __('Minimalbestand Aktiv'), $produkt_data, $_REQUEST['wpsg_mod_minrequest']['valuemax']);
-
-		} // public function produkt_save_before(&$produkt_data)
 		
 		public function checkBasket(&$bNoErrorBasket) 
@@ -197,33 +138,4 @@
 		} // private function _checkBasketMax($arBasket)
 		
-		
-		/**
-		 * Gibt den Mindestbestellwert anhand der ProduktID zurÃŒck
-		 * @param int $product_id
-		 * @return boolean
-		 */
-		public function getMinRequest($product_id)
-		{
-		    
-		    $product_data = $this->shop->cache->loadProduct($product_id);
-		    
-		    return $product_data['wpsg_mod_minrequest_value'];
-		    
-		} // public function getMinRequest($product_id)
-		
-		/**
-		 * Gibt den Maximalbestellwert anhand der ProduktID zurÃŒck
-		 * @param int $product_id
-		 * @return boolean
-		 */
-		public function getMaxRequest($product_id)
-		{
-		    
-		    $product_data = $this->shop->cache->loadProduct($product_id);
-		    
-		    return $product_data['wpsg_mod_minrequest_valuemax'];
-		    
-		} // public function getMaxRequest($product_id)
-		
 	} // class wpsg_mod_minrequest extends wpsg_mod_basic
 
Index: /mods/wpsg_mod_newsletter.class.php
===================================================================
--- /mods/wpsg_mod_newsletter.class.php	(revision 8528)
+++ /mods/wpsg_mod_newsletter.class.php	(revision 5261)
@@ -34,5 +34,5 @@
 		public function settings_edit()
 		{
-
+			
 			$this->shop->view['plugin_active'] = $this->checkNewsletterPlugin();
 			
@@ -51,16 +51,16 @@
 		{
 			
-		    $this->shop->update_option('wpsg_mod_newsletter_groups', implode(',', (array)array_values($_REQUEST['wpsg_mod_newsletter_groups'])), false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_newsletter_action', $_REQUEST['wpsg_mod_newsletter_action'], false, false, WPSG_SANITIZE_TEXTFIELD);
+			$this->shop->update_option('wpsg_mod_newsletter_groups', implode(',', (array)array_values($_REQUEST['wpsg_mod_newsletter_groups'])));
+			$this->shop->update_option('wpsg_mod_newsletter_action', $_REQUEST['wpsg_mod_newsletter_action']);
 			
 		} // public function settings_save()
 		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) { 
-			
-			if (!$finish_order) return;
-			
-			if ($this->checkNewsletterPlugin() && $_SESSION['wpsg']['checkout']['wpsg_mod_newsletter'] == '1') {
-				
-				$checkout = $_SESSION['wpsg']['checkout'];
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
+		{ 
+			
+			if ($finish_order !== true) return;
+		 
+			if ($this->checkNewsletterPlugin() && $arBasket['checkout']['wpsg_mod_newsletter'] == '1')
+			{
 				
 				// Abonnent eintragen
@@ -75,14 +75,17 @@
 				$abo->ort = $checkout['ort'];
 				
-				if ($this->shop->get_option('wpsg_mod_newsletter_action') == '0') {
+				if ($this->shop->get_option('wpsg_mod_newsletter_action') == '0')
+				{
 					
 					$abo->status = '1';
 					$abo->save();
 					
-					$abo->sendDoubleOptIn();
+					$abo->sendDoubleOptIn(); 
 					
 					$this->shop->addFrontendMessage(__('Sie haben eine Mail erhalten, in der sie die Newsletteranmeldung bestÃ€tigen mÃŒssen.', 'wpsg'));
 					
-				} else if ($this->shop->get_option('wpsg_mod_newsletter_action') == '1') {
+				}
+				else if ($this->shop->get_option('wpsg_mod_newsletter_action') == '1')
+				{
 					
 					$this->shop->addFrontendMessage(__('Sie wurden erfolgreich fÃŒr den Newsletter angemeldet.', 'wpsg'));
@@ -97,5 +100,5 @@
 			}
 			
-		}
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
 		
 		public function wpsg_mod_customer_save(&$customer_data) 
@@ -185,10 +188,5 @@
 		{
 			 
-			if ($this->shop->get_option('wpsg_afterorder') == '1')
-			{
-			
-				unset($_SESSION['wpsg']['wpsg_mod_newsletter']);
-				
-			}
+			unset($_SESSION['wpsg']['wpsg_mod_newsletter']);
 			
 		} // public function clearSession()
@@ -197,5 +195,6 @@
 		{
 		
-			if ($_REQUEST['do'] == 'import') {
+			if ($_REQUEST['do'] == 'import')
+			{
 				
 				$nImport = 0;
@@ -203,34 +202,30 @@
 				$arKunden = $this->db->fetchAssoc("
 					SELECT
-						K.*, CA.`name` AS adrname, CA.`vname` AS adrvname
+						K.*
 					FROM
-						`".WPSG_TBL_KU."` AS K
-					LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = K.`adress_id`)	
+						`".WPSG_TBL_KU."` AS K	
 				");
 				
-				foreach ($arKunden as $k) {
+				foreach ($arKunden as $k)
+				{
 					
 					$abo = wpng_Abonnent::getAbonnentByEMail($k['email']);
 					
-					if ($abo === false) {
+					if ($abo === false)
+					{
 						
 						$abo = new wpng_Abonnent();
+					
+					}
 						
-						// Neue auf aktiv setzen
-						// 2 = Aktiv
-						$abo->status = 2;
-						
-					} 
-					
 					$abo->email = $k['email'];
 					if (trim($k['title']) != '' && $k['title'] != '-1') $abo->title = $k['title'];
-					//$abo->vname = $k['vname'];
-					//$abo->name = $k['name'];
-					$abo->vname = $k['adrvname'];
-					$abo->name = $k['adrname'];
+					$abo->vname = $k['vname'];
+					$abo->name = $k['name'];
 					$abo->strasse = $k['strasse'];
 					$abo->plz = $k['plz'];
 					$abo->ort = $k['ort'];
-										
+					$abo->status = 2;
+					
 					$abo->save();
 					$abo->setGroups(explode(',', $_REQUEST['groups']), false);
@@ -240,5 +235,5 @@
 				}
 				
-				$this->shop->addBackendMessage(wpsg_translate(__('#1# Kunden in die Newsletter Gruppen importiert.', 'wpsg'), $nImport));
+				$this->shop->addBackendMessage(wpng_translate(__('#1# Kunden in die Newsletter Gruppen importiert.', 'wpsg'), $nImport));
 				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_newsletter');
 				
@@ -259,5 +254,5 @@
 			if (is_plugin_active('wpnewslettergermany/wpnewslettergermany.php')) 
 			{
-
+			
 				if ($GLOBALS['wpng_pc']->hasActiveLicence() || $GLOBALS['wpng_pc']->getDemoDays() > 0)
 				{
@@ -275,2 +270,3 @@
 	} // class wpsg_mod_newsletter extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_nlsatolo.class.php
===================================================================
--- /mods/wpsg_mod_nlsatolo.class.php	(revision 8528)
+++ /mods/wpsg_mod_nlsatolo.class.php	(revision 5261)
@@ -1,159 +1,147 @@
 <?php
 
-    /**
-     * Integriert die Anmeldung fÃŒr das Satollo Newsletter Plugin in den Shop
-     * @author daniel
-     */
-    class wpsg_mod_nlsatolo extends wpsg_mod_basic {
-    
-        var $lizenz = 1;
-        var $id = 600;
-    
-        /**
-         * Costructor
-         */
-        public function __construct() {
-    
-            parent::__construct();
-    
-            $this->name = __('Satollo Newsletter', 'wpsg');
-            $this->group = __('Sonstiges', 'wpsg');
-            $this->desc = __('ErmÃ¶glicht die Anmeldung an das "<a href="http://wordpress.org/extend/plugins/newsletter/">Newsletter</a>" Plugin von Satollo.', 'wpsg');
-    
-        } // public function __construct()
-    
-        public function install() {
-    
-            $this->shop->checkDefault('wpsg_mod_nlsatolo_action', '0');
-    
-        } // public function install()		
-    
-        public function settings_edit() {
-    
-            $this->shop->view['plugin_active'] = $this->checkNewsletterPlugin();
-    
-            if ($this->shop->view['plugin_active'] === true) {
-    
-                $options_profile = NewsletterSubscription::instance()->options_lists;
-    
-                $arLists = array();
-    
-                for ($i = 1; $i <= NEWSLETTER_LIST_MAX; $i++) {
-    
-                    $arLists['' . $i] = '(' . $i . ') ' . $options_profile['list_' . $i];
-    
-                }
-    
-                $this->shop->view['arLists'] = $arLists;
-    
-            }
-    
-            $this->render(WPSG_PATH_VIEW.'/mods/mod_nlsatolo/settings_edit.phtml');
-    
-        } // public function settings_edit()
-    
-        public function settings_save() {
-    
-            $this->shop->update_option('wpsg_mod_nlsatolo_doubleoptin', $_REQUEST['wpsg_mod_nlsatolo_doubleoptin'], false, false, WPSG_SANITIZE_INT);
-            $this->shop->update_option('wpsg_mod_nlsatolo_group', $_REQUEST['wpsg_mod_nlsatolo_group'], false, false, WPSG_SANITIZE_INT);
-    
-        } // public function settings_save()
-    
-        public function basket_save_done(&$o_id, &$k_id, &$oBasket) {
-    
-            global $newsletter;
-    
-            $arBasket = $oBasket->toArray();
-    
-            if ($arBasket['checkout']['wpsg_mod_nlsatolo'] == '1') {
-    
-                if (function_exists("newsletter_subscribe")) {
-    
-                    // Version <= 1.5.9
-                    newsletter_subscribe($arBasket['checkout']['email'], $arBasket['checkout']['vname'].' '.$arBasket['checkout']['name']);
-                    $this->shop->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen.", "wpsg"));
-    
-                } else if (get_class($newsletter) == "Newsletter") {
-    
-                    global $newsletter;
-    
-                    $user = new stdClass();
-    
-                    $user->email = $arBasket['checkout']['email'];
-                    $user->name = $arBasket['checkout']['vname'];
-                    $user->surname = $arBasket['checkout']['name'];
-    
-                    $newsletterSubscription = NewsletterSubscription::instance();
-                    $newsletterSubscription->hook_init();
-    
-                    if ($this->shop->get_option('wpsg_mod_nlsatolo_doubleoptin') === '1') {
-    
-                        $user->status = 'S';
-                        $newsletter->save_user($user);
-    
-                        $user = $newsletterSubscription->get_user($user->email);
-    
-                        $newsletterSubscription->send_message('confirmation', $user);
-                        $newsletterSubscription->set_user_list($user, $this->shop->get_option('wpsg_mod_nlsatolo_group'), '1');
-    
-                        $this->shop->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen, mÃŒssen diese aber noch bestÃ€tigen. Sie haben dazu eine E-Mail erhalten.", "wpsg"));
-    
-                    } else {
-    
-                        $user->status = 'C';
-                        $newsletter->save_user($user);
-    
-                        $user = $newsletterSubscription->get_user($user->email);
-    
-                        $newsletterSubscription->set_user_list($user, $this->shop->get_option('wpsg_mod_nlsatolo_group'), '1');
-    
-                        $this->shop->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen.", "wpsg"));
-    
-                    }
-    
-                } else {
-    
-                    $this->shop->addFrontendError(__('Sie wurden nicht zum Newsletter angemeldet, da das Plugin "newsletter" nicht installiert ist.', 'wpsg'));
-    
-                }
-    
-            }
-    
-        } // public function basket_save_done(&$o_id, &$k_id, &$oBasket)
-    
-        public function checkout_customer_inner() {
-    
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_nlsatolo/checkout_customer_inner.phtml');
-    
-        } // public function checkout_inner_prebutton()
-    
-        public function clearSession()  {
-    
-            if ($this->shop->get_option('wpsg_afterorder') == '1') {
-    
-                unset($_SESSION['wpsg']['wpsg_mod_nlsatolo']);
-    
-            }
-    
-        } // public function clearSession()
-    
-        /**
-         * Gibt true zurÃŒck, wenn das Satolo Newsletter Plugin installiert und aktiv ist
-         */
-        private function checkNewsletterPlugin() {
-    
-            require_once(ABSPATH.'wp-admin/includes/plugin.php');
-    
-            if (is_plugin_active('newsletter/plugin.php')) {
-    
-                return true;
-    
-            }
-    
-            return false;
-    
-        } // private function checkNewsletterPlugin()
-    
-    } // class wpsg_mod_nlsatolo extends wpsg_mod_basic
+	/**
+	 * Integriert die Anmeldung fÃŒr das Satollo Newsletter Plugin in den Shop
+	 * @author daniel
+	 */
+	class wpsg_mod_nlsatolo extends wpsg_mod_basic 
+	{
+
+		var $lizenz = 1;
+		var $id = 600;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Satollo Newsletter', 'wpsg');
+			$this->group = __('Sonstiges', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht die Anmeldung an das "<a href="http://wordpress.org/extend/plugins/newsletter/">Newsletter</a>" Plugin von Satollo.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function order_done(&$order_id, &$done_view) 
+		{ 
+
+			if (isset($_SESSION['wpsg']['wpsg_mod_nlsatolo']))
+			{
+				
+				global $newsletter;
+			  			
+				if (function_exists("newsletter_subscribe"))
+				{
+					
+					// Version <= 1.5.9
+					
+					newsletter_subscribe($done_view['basket']['checkout']['email'], $done_view['basket']['checkout']['vname'].' '.$done_view['basket']['checkout']['name']);
+					$this->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen.", "wpsg"));
+					
+				}
+				else if (get_class($newsletter) == "Newsletter")
+				{
+				
+					// Version >= 2.5.0
+					
+					$_REQUEST['na'] = 's';
+					$_REQUEST['nn'] = $done_view['basket']['checkout']['vname'];
+					$_REQUEST['ns'] = $done_view['basket']['checkout']['name'];
+					$_REQUEST['ne'] = $done_view['basket']['checkout']['email'];
+ 
+					$newsletter->hook_init();
+					
+					$this->shop->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen.", "wpsg"));
+					
+				}
+				else
+				{
+					
+					$this->shop->addFrontendError(__('Sie wurden nicht zum Newsletter angemeldet, da das Plugin "newsletter" nicht installiert ist.', 'wpsg'));
+				
+				}
+				
+			} 
+						
+		} // public function order_done(&$order_id)
+		
+		public function basket_save_done(&$o_id, &$k_id, &$oBasket)
+		{
+			
+			global $newsletter;
+						
+			$arBasket = $oBasket->toArray();
+			
+			if ($arBasket['checkout']['wpsg_mod_nlsatolo'] == '1')
+			{
+				
+				if (function_exists("newsletter_subscribe"))
+				{
+					
+					// Version <= 1.5.9
+					newsletter_subscribe($arBasket['checkout']['email'], $arBasket['checkout']['vname'].' '.$arBasket['checkout']['name']);
+					$this->shop->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen.", "wpsg"));
+					
+				}
+				else if (get_class($newsletter) == "Newsletter")
+				{
+					//fÃŒr Versionen >= 3.0.2
+					if (version_compare(NEWSLETTER_VERSION, '3.0.2') >= 0)
+					{
+
+						global $newsletter;
+						
+						$user = array(
+							'email' 	=> $arBasket['checkout']['email'],
+							'name' 		=> $arBasket['checkout']['vname'],
+							'surname' 	=> $arBasket['checkout']['name'],
+							'status'	=> 'C'
+						);
+						
+						$newsletter->save_user($user);
+
+					} 
+					else 
+					{
+
+						//fÃŒr Version >= 2.5.0
+						$_REQUEST['na'] = 's';
+						$_REQUEST['nn'] = $arBasket['checkout']['vname'];
+						$_REQUEST['ns'] = $arBasket['checkout']['name'];
+						$_REQUEST['ne'] = $arBasket['checkout']['email'];
+						 
+						$newsletter->hook_init();
+						 
+					}
+					$this->shop->addFrontendMessage(__("Sie wurden erfolgreich in unseren Newsletter eingetragen.", "wpsg"));
+				}
+				else
+				{
+					
+					$this->shop->addFrontendError(__('Sie wurden nicht zum Newsletter angemeldet, da das Plugin "newsletter" nicht installiert ist.', 'wpsg'));
+					
+				}
+				
+			}
+			
+		} // public function basket_save_done(&$o_id, &$k_id, &$oBasket)
+				 
+		public function checkout_customer_inner()
+		{
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_nlsatolo/checkout_customer_inner.phtml');
+			
+		} // public function checkout_inner_prebutton()
+		
+		public function clearSession() 
+		{
+			 
+			unset($_SESSION['wpsg']['wpsg_mod_nlsatolo']);
+			
+		} // public function clearSession()
+				
+	} // class wpsg_mod_nlsatolo extends wpsg_mod_basic
 
 ?>
Index: /mods/wpsg_mod_onepagecheckout.class.php
===================================================================
--- /mods/wpsg_mod_onepagecheckout.class.php	(revision 8528)
+++ /mods/wpsg_mod_onepagecheckout.class.php	(revision 5261)
@@ -52,23 +52,16 @@
 		public function settings_save()
 		{
-
-		    $this->shop->createPage(__('Kasse', 'wpsg'), 'wpsg_mod_onepagecheckout_page', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_onepagecheckout_page']));
-		    $this->shop->update_option('wpsg_mod_onepagecheckout_basket', $_REQUEST['wpsg_mod_onepagecheckout_basket'], false, false, WPSG_SANITIZE_CHECKBOX);
+			
+			$this->shop->createPage(__('Kasse', 'wpsg'), 'wpsg_mod_onepagecheckout_page', $_REQUEST['wpsg_mod_onepagecheckout_page']);
+						
+		} // public function settings_save()
+			 
+		public function content_filter(&$content)
+		{
 				
-		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_onepagecheckout_page'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function content_filter(&$content) {
-
-		    $id = wpsg_get_the_id();
-
-			if ($id <= 0) return;
+			if (get_the_id() <= 0) return;
 				
-			if (in_the_loop() && is_main_query() && $id == $this->shop->get_option('wpsg_mod_onepagecheckout_page')) {
+			if (get_the_id() == $this->shop->get_option('wpsg_mod_onepagecheckout_page'))
+			{
 				
 				$content = $this->onepage();
@@ -82,10 +75,8 @@
 		public function template_redirect() 
 		{
-
-		    $id = wpsg_get_the_id();
-
-			if ($id <= 0) return;
+			
+			if (get_the_id() <= 0) return;
 				
-			if ($id == $this->shop->get_option('wpsg_mod_onepagecheckout_page') && isset($_REQUEST['wpsg_checkout']))
+			if (get_the_id() == $this->shop->get_option('wpsg_mod_onepagecheckout_page') && isset($_REQUEST['wpsg_checkout']))
 			{
 				
@@ -119,23 +110,8 @@
 			$this->shop->checkShippingAvailable();
 			$this->shop->checkPaymentAvailable();
-			$this->shop->checkCustomerPreset();
 			
 			$this->shop->view['arShipping'] = $this->shop->arShipping;
 			$this->shop->view['arPayment'] = $this->shop->arPayment;
-
-			$this->shop->view['arLander'] = $this->db->fetchAssocField("SELECT L.`id`, L.`name` FROM `".WPSG_TBL_LAND."` AS L ORDER BY L.`name` ", "id", "name");
-				
-			// colspan fÃŒr die Zusammenfassung berechnen je nach Option
-			$this->shop->view['colspan'] = 3;
-			if ($this->shop->get_option('wpsg_showMwstAlways') == '1' || sizeof($this->shop->view['basket']['mwst']) > 1) $this->shop->view['colspan'] ++;
 			
-			if ($this->shop->get_option('wpsg_mod_onepagecheckout_basket') == 0) 
-			{
-				//return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_onepagecheckout/onepage.phtml', false);
-			}
-			else
-			{
-				//return $this->shop->render(WPSG_PATH_VIEW.'/warenkorb/overview.phtml', false);
-			}
 			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_onepagecheckout/onepage.phtml', false);
 			
Index: /mods/wpsg_mod_ordercondition.class.php
===================================================================
--- /mods/wpsg_mod_ordercondition.class.php	(revision 8528)
+++ /mods/wpsg_mod_ordercondition.class.php	(revision 5261)
@@ -27,5 +27,5 @@
 												
 		} // public function __construct()
-						
+		
 		public function install() 
 		{ 
@@ -40,5 +40,4 @@
 				errortext TEXT NOT NULL,
 		   		deleted INT(1) NOT NULL,
-		   		shipping TEXT NOT NULL,
 		   		PRIMARY KEY  (id)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
@@ -141,11 +140,8 @@
 			else if ($_REQUEST['do'] == 'inlinedit')
 			{
-
+				
 				if ($_REQUEST['field'] == 'name')
 				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-					$_REQUEST['oc_id'] = wpsg_sinput("key", $_REQUEST['oc_id']);
-
+					
 					$this->db->UpdateQuery(WPSG_TBL_ORDERCOND, array(
 						'name' => wpsg_q($_REQUEST['value'])
@@ -157,14 +153,4 @@
 					
 				}
-				else if ($_REQUEST['field'] == 'shipping')
-				{
-					
-					$this->db->UpdateQuery(WPSG_TBL_ORDERCOND, array(
-						'shipping' => wpsg_q(implode(',', $_REQUEST['value']))
-					), "`id` = '".wpsg_q($_REQUEST['oc_id'])."'");
-					
-					die($_REQUEST['value']);
-					
-				}
 				else if ($_REQUEST['field'] == 'typ')
 				{
@@ -179,8 +165,5 @@
 				else if ($_REQUEST['field'] == 'text')
 				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-					$_REQUEST['oc_id'] = wpsg_sinput("key", $_REQUEST['oc_id']);
-
+					
 					if ($this->shop->get_option('wpsg_options_nl2br') == '1') $_REQUEST['value'] = nl2br($_REQUEST['value']);
 					
@@ -191,13 +174,10 @@
 					$this->shop->addTranslationString('wpsg_mod_ordercondition_text_'.$_REQUEST['oc_id'], $_REQUEST['value']);
 					
-					die($_REQUEST['value']);
+					die("1");
 					
 				}
 				else if ($_REQUEST['field'] == 'errortext')
 				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-					$_REQUEST['oc_id'] = wpsg_sinput("key", $_REQUEST['oc_id']);
-
+					
 					if ($this->shop->get_option('wpsg_options_nl2br') == '1') $_REQUEST['value'] = nl2br($_REQUEST['value']);
 						
@@ -208,5 +188,5 @@
 					$this->shop->addTranslationString('wpsg_mod_ordercondition_errortext_'.$_REQUEST['oc_id'], $_REQUEST['value']);
 						
-					die($_REQUEST['value']);
+					die("1");
 					
 				}
@@ -244,14 +224,9 @@
 			$arSave = array();
 			
-			if (wpsg_isSizedArray($_REQUEST['wpsg_mod_ordercondition']))
-			{
-
-				foreach ($_REQUEST['wpsg_mod_ordercondition'] as $oc_id => $oc_value)
-				{
-					
-					if ($oc_value === '1') $arSave[] = wpsg_sinput("key", $oc_id);
-					
-				}
-			
+			foreach ((array)$_REQUEST['wpsg_mod_ordercondition'] as $oc_id => $oc_value)
+			{
+				
+				if ($oc_value === '1') $arSave[] = $oc_id;
+				
 			}
 			
@@ -260,11 +235,14 @@
 		} // public function produkt_save(&$produkt_id)
 		
-		public function overview_top(&$arBasket) {
+		public function overview_top(&$arBasket) 
+		{ 
 			 
 			$this->shop->view['wpsg_mod_ordercondition']['data'] =  $this->loadOrderConditionsByBasket($arBasket);
 						
-			if (sizeof($this->shop->view['wpsg_mod_ordercondition']['data']) > 0) {
-				
-				foreach ($this->shop->view['wpsg_mod_ordercondition']['data'] as $k => $v) {
+			if (sizeof($this->shop->view['wpsg_mod_ordercondition']['data']) > 0)
+			{
+				
+				foreach ($this->shop->view['wpsg_mod_ordercondition']['data'] as $k => $v)
+				{
 					
 					$this->shop->view['wpsg_mod_ordercondition']['data'][$k]['name'] = __($this->shop->view['wpsg_mod_ordercondition']['data'][$k]['name'], 'wpsg');
@@ -299,6 +277,6 @@
 						$error = true;
 						$this->shop->addFrontendError($this->shop->replaceUniversalPlatzhalter(__($oc['errortext'], 'wpsg')));
-						$_SESSION['wpsg']['errorFields'][] = 'row-check-agb-'.$oc['id'];
-											}
+						
+					}
 					
 				}
@@ -330,20 +308,22 @@
 		 * LÃ€dt einen Array mit den Bestellbedingungen fÃŒr die Bestellung des ÃŒbergebenen Basket Arrays
 		 */
-		public function loadOrderConditionsByBasket($arBasket) {
+		public function loadOrderConditionsByBasket($arBasket)
+		{
 			
 			$arOC_products = array();
 			
 			// IDs der Bestellbedingungen die ProduktabhÃ€ngig sind ermitteln
-			foreach ($arBasket['produkte'] as $p) {
-				
-				if (preg_match('//', $p['id'])) $produkt_id = preg_replace('/(^pv\_)|\|\d+\:\d+$/', '', $p['id']);
+			foreach ($arBasket['produkte'] as $p)
+			{
+				
+				if (preg_match('//', $p['id'])) $produkt_id = preg_replace('/(^vp\_)|\/\d+\_\d+$/', '', $p['id']);
 				else if (is_int($p['id'])) $produkt_id = $p['id'];
-
+				
 				$produkt_db = $this->shop->cache->loadProduct($produkt_id);
 				
-				$arOC_products = array_merge($arOC_products, explode(",", wpsg_getStr($produkt_db['wpsg_mod_ordercondition'])));
-				
-			}
-
+				$arOC_products = wpsg_array_merge($arOC_products, explode(",", $produkt_db['wpsg_mod_ordercondition']));
+				
+			}
+			
 			$arOC_products = array_unique($arOC_products);
 			
@@ -358,7 +338,6 @@
 					OC.`deleted` != '1' AND
 					(
-						(OC.`typ` = '1') OR 
-						(OC.`typ` = '2' AND FIND_IN_SET(OC.`id`, '".implode(",", $arOC_products)."')) OR
-						(OC.`typ` = '3' AND FIND_IN_SET('".wpsg_q($arBasket['checkout']['shipping'])."', OC.`shipping`))
+						OC.`typ` = '1' OR 
+						(OC.`typ` = '2' AND FIND_IN_SET(OC.`id`, '".implode(",", $arOC_products)."'))
 					)
 			");
@@ -373,12 +352,4 @@
 			
 			$this->shop->view['wpsg_mod_ordercondition']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERCOND."` WHERE `deleted` != '1'");
-			$this->shop->view['arShipping'] = array();
-			
-			foreach ($this->shop->arShipping as $k => $v)
-			{
-			
-				$this->shop->view['arShipping'][$v['id']] = $v['name'];
-				
-			}
 			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ordercondition/list.phtml');
Index: ds/wpsg_mod_orderstates.class.php
===================================================================
--- /mods/wpsg_mod_orderstates.class.php	(revision 8528)
+++ 	(revision )
@@ -1,118 +1,0 @@
-<?php
-
-	declare(strict_types=1);
-
-	/**
-	 * User: Daschmi (daschmi@daschmi.de)
-	 * Date: 04.11.2021
-	 * Time: 10:23
-	 */
-	
-	define('WPSG_TBL_ORDERSTATES', wpsg_ShopController::getShop()->prefix.'wpsg_orderstates');
- 
-	class wpsg_mod_orderstates extends wpsg_mod_basic {
-		
-		var $id = 5600;		
-		var $lizenz = 1;
-		var $version = "9.9.9";
-		var $hilfeURL = '';
-		var $free = true;
-		
-		/**
-		 * Erstellt ein neues Modul
-		 */
-		public function __construct() {
-			
-			$this->name = __('BestellzustÃ€nde', 'wpsg');
-			$this->group = __('Bestellung', 'wpsg');
-			$this->desc = __('Erlaubt das anlegen weiterer BestellzustÃ€nde.', 'wpsg');
-			
-			$this->shop = $GLOBALS['wpsg_sc'];
-			$this->db = $GLOBALS['wpsg_db'];
-			
-		} 
-		
-		public function install() {
-			
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-			
-			$sql = "CREATE TABLE ".WPSG_TBL_ORDERSTATES." (
-		   		id mediumint(9) NOT NULL AUTO_INCREMENT,
-		   		name VARCHAR(255) NOT NULL,	
-		   		deleted INT(1) NOT NULL, 		 
-		   		PRIMARY KEY  (id),
-		   		KEY deleted (deleted)
-		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-			
-			dbDelta($sql);
-			
-		}
-
-		public function settings_edit() {
-			
-			$this->shop->view['arStates'] = $this->getCustomStates(true);
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderstates/settings_edit.phtml');			
-			
-		}
-		
-		public function settings_save() {
-			
-			if (isset($_REQUEST['wpsg_mod_orderstates']['states'])) {
-				
-				$arStates = json_decode($_REQUEST['wpsg_mod_orderstates']['states'], true);
-				
-				if (is_array($arStates)) {
-				
-					foreach ($arStates as $state_data) {
-											
-						$db_data = [
-							'name' => wpsg_q(trim(\sanitize_text_field($state_data['name']))),
-							'deleted' => wpsg_q((($state_data['deleted'] === '1')?'1':'0'))
-						];
-												
-						if ($db_data['name'] === '') $db_data['name'] = wpsg_q(\sanitize_text_field(__('Unbenannt', 'wpsg')));
-						
-						if (intval($state_data['id']) > 0) {
-							
-							$this->db->UpdateQuery(WPSG_TBL_ORDERSTATES, $db_data, " `id` = '".intval($state_data['id'])."' ");
-							
-							$id = $state_data['id'];
-							
-						} else $id = $this->db->ImportQuery(WPSG_TBL_ORDERSTATES, $db_data);
-						
-						$this->shop->addTranslationString('wpsg_mod_orderstates_name_'.$id, $db_data['name']);
-						
-					}
-
-				}
-								
-			}
-			
-		}
-		
-		public function init() {
-			
-			foreach ($this->getCustomStates() as $state) {
-				
-				$this->shop->arStatus[$this->id.'_'.$state['id']] = __($state['name'], 'wpsg');
-				
-			}
-			
-		}
-		
-		/* Modulfunktionen */
-				
-		public function getCustomStates(bool $bIncludeDeleted = false): array {
-			
-			$strQuery = "SELECT * FROM `".WPSG_TBL_ORDERSTATES."` WHERE 1 ";
-			
-			if (!$bIncludeDeleted) $strQuery .= " AND `deleted` != '1' ";
-			
-			$strQuery .= " ORDER BY `name` ASC ";
-			 
-			return $this->db->fetchAssoc($strQuery);
-			
-		}
-
-	}
Index: /mods/wpsg_mod_orderupload.class.php
===================================================================
--- /mods/wpsg_mod_orderupload.class.php	(revision 8528)
+++ /mods/wpsg_mod_orderupload.class.php	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Modul "Bestellupload"
+	 * Modul um wÃ€hrend der Bestellung eine oder mehrere Dateien hochzuladen
 	 */
 	class wpsg_mod_orderupload extends wpsg_mod_basic 
@@ -8,10 +8,6 @@
 		
 		var $id = 1600;		
-		var $lizenz = 1;
-		var $version = "9.9.9";
-		var $hilfeURL = 'http://wpshopgermany.de/?p=5729960';
-		
-		const MODE_ORDER = 1;
-		const MODE_PRODUCT = 2;
+		var $lizenz = 2;
+		var $version = '3.1.0';
 		
 		/**
@@ -25,5 +21,5 @@
 			$this->name = __('Bestellupload', 'wpsg');
 			$this->group = __('Bestellung', 'wpsg');
-			$this->desc = __('Erlaubt das Hochladen von Dateien zu Bestellungen.', 'wpsg');
+			$this->desc = __('Erlaubt das hochladen von Dateien zu Bestellungen.', 'wpsg');
 						
 		} // public function __construct()
@@ -36,19 +32,5 @@
 			$this->shop->checkDefault('wpsg_mod_orderupload_multifiles', '0');
 			$this->shop->checkDefault('wpsg_mod_orderupload_optional', '0');
-			$this->shop->checkDefault('wpsg_mod_orderupload_maxweight', '25');
-			$this->shop->checkDefault('wpsg_mod_orderupload_maxweight_text', 'Bestellupload zu groÃ. Bitte DateigrÃ¶Ãe reduzieren.');
-
-            require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
-            /**
-             * Produkttabelle erweitern
-             */
-            $sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
-		   		wpsg_mod_orderupload_set INT(11) NOT NULL,
-		   		wpsg_mod_orderupload_mandatory INT(1) NOT NULL
-		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-            
+			
 		} // public function install()
 		
@@ -62,17 +44,12 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_orderupload_filename', $_REQUEST['wpsg_mod_orderupload_filename'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_orderupload_allowedext', $_REQUEST['wpsg_mod_orderupload_allowedext'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_orderupload_multifiles', $_REQUEST['wpsg_mod_orderupload_multifiles'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_orderupload_optional', $_REQUEST['wpsg_mod_orderupload_optional'],false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_orderupload_zip', $_REQUEST['wpsg_mod_orderupload_zip'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_orderupload_maxweight', $_REQUEST['wpsg_mod_orderupload_maxweight'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_orderupload_mail', $_REQUEST['wpsg_mod_orderupload_mail'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_orderupload_maxweight_text', $_REQUEST['wpsg_mod_orderupload_maxweight_text'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_orderupload__mode', $_REQUEST['wpsg_mod_orderupload__mode'], false, false, WPSG_SANITIZE_INT);
+			
+			$this->shop->update_option('wpsg_mod_orderupload_filename', $_REQUEST['wpsg_mod_orderupload_filename']);
+			$this->shop->update_option('wpsg_mod_orderupload_allowedext', $_REQUEST['wpsg_mod_orderupload_allowedext']);
+			$this->shop->update_option('wpsg_mod_orderupload_multifiles', $_REQUEST['wpsg_mod_orderupload_multifiles']);
+			$this->shop->update_option('wpsg_mod_orderupload_optional', $_REQUEST['wpsg_mod_orderupload_optional']);
 			
 		} // public function settings_save()
-		
+				
 		public function checkout_inner_prebutton(&$checkout_view) { 
 			
@@ -86,15 +63,12 @@
 			if ($state == '1')
 			{
-			 
+				
 				if (
 					$this->shop->get_option('wpsg_mod_orderupload_optional') != '1' && 
-					(!isset($_SESSION['wpsg']['wpsg_mod_orderupload']) || sizeof($_SESSION['wpsg']['wpsg_mod_orderupload']) <= 0) &&
+					sizeof($_SESSION['wpsg']['wpsg_mod_orderupload']) <= 0 &&
 					(!isset($_FILES['wpsg_mod_orderupload_file']) || !file_exists($_FILES['wpsg_mod_orderupload_file']['tmp_name']))
 					)
 				{
 					
-					if (isset($_REQUEST['wpsg_mod_kundenverwaltung_register'])) return;
-					if (isset($_REQUEST['wpsg_mod_kundenverwaltung_save'])) return;
-					
 					// Noch keine Datei hochgeladen und es ist Pflicht !										
 					$this->shop->addFrontendError(__('Bitte eine Datei zum Upload wÃ€hlen.', 'wpsg'));
@@ -127,5 +101,5 @@
 						{
 							
-							// Cache sauber halten
+							// Cache sauber haltens
 							foreach ($_SESSION['wpsg']['wpsg_mod_orderupload'] as $ou)
 							{
@@ -162,59 +136,9 @@
 			
 		} // public function checkCheckout(&$state, &$error, &$arCheckout)
-         
-		public function checkBasket(&$noError) {
-			
-			$sum = 0;
-            
-			if (wpsg_isSizedArray($_SESSION['wpsg']['wpsg_mod_orderupload'])) {
-			    
-				foreach ($_SESSION['wpsg']['wpsg_mod_orderupload'] as $k => $ou) $sum += filesize($ou[3]);
-                
-			}
-			
-			$sum = $sum / (1024 * 1000);
-			$sum = $this->shop->get_option('wpsg_mod_orderupload_maxweight') - $sum;
-			
-            $text = __($this->shop->get_option('wpsg_mod_orderupload_maxweight_text'), 'wpsg');
-            
-            if ($sum <= 0 & wpsg_isSizedString($text)) { $this->shop->addFrontendError($text); $noError = false; }
-			
-			$this->shop->view['wpsg_mod_orderupload']['uploadsum'] = round($sum, 2);
-			$this->shop->view['wpsg_mod_orderupload']['maxweight'] = $this->shop->get_option('wpsg_mod_orderupload_maxweight');
-			
-            // Uploads bei den Produkten checken
-            $arBasket = $this->shop->cache->getShopBasketArray();
-            
-            foreach ($arBasket['produkte'] as $product_index => $product_basket_data) {
-                
-                $oProduct = wpsg_product::getInstance($product_basket_data['product_id']);
-                
-                $mandatory = $oProduct->wpsg_mod_orderupload_mandatory;
-                
-                if (wpsg_isSizedInt($mandatory)) {
-
-                    $set = $oProduct->wpsg_mod_orderupload_set;
-                    $arFilesUploaded = $this->getProductUploads($arBasket['oOrder']->id, $product_basket_data['product_index'], $product_basket_data['product_id']);
-                    
-                    if (sizeof($arFilesUploaded) < $set) {
-                        
-                        $this->shop->addFrontendError(
-                            wpsg_translate(__('Sie mÃŒssen bei Produkt "#1#" mindestens #2# Datei(en) angeben.', 'wpsg'), $oProduct->getProductName(), $set)
-                        );
-                        
-                        $noError = false;
-                        
-                    }
-                    
-                }
-                
-            }
-                        
-		}
 		
 		public function wp_loaded() 
 		{ 
 			
-			if (($_REQUEST['wpsg_plugin']??'') == 'wpsg_mod_orderupload' && ($_REQUEST['wpsg_action']??'') == 'remove')
+			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_orderupload' && $_REQUEST['wpsg_action'] == 'remove')
 			{
 				
@@ -229,38 +153,19 @@
 			
 		} // public function wp_loaded()
- 
-		public function order_ajax() { 
-			
-			if (isset($_REQUEST['wpsg_mod_orderupload_download'])) {
-
-				$_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-				$_REQUEST['product_index'] = wpsg_xss($_REQUEST['product_index']);
-				$_REQUEST['wpsg_mod_orderupload_download'] = wpsg_xss($_REQUEST['wpsg_mod_orderupload_download']);
-
-                if (isset($_REQUEST['product_index'])) {
-                    
-                    $path = $this->getProductStoragePath($_REQUEST['edit_id'], $_REQUEST['product_index']);
-                    $file = $path.$_REQUEST['wpsg_mod_orderupload_download'];
-                                        
-                } else {
-                
-				    $file = $this->getSavePath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['wpsg_mod_orderupload_download']);
-                                        
-                }
-                
-                if (!file_exists($file)) throw new \Exception(__('Datei existiert nicht mehr auf dem Server.', 'wpsg')); 
-                else {
-
-                    header('Content-Disposition: attachment; filename="'.rawurldecode($_REQUEST['wpsg_mod_orderupload_download']).'"');
-                    header('Content-type: application/download');
-                    header('Content-Disposition: inline; filename="'.rawurldecode($_REQUEST['wpsg_mod_orderupload_download']).'"');
-                    header('Expires: 0');
-                    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-                    header('Pragma: public');
-                    
-                    echo file_get_contents($file);
-                    exit;
-                    
-                }
+
+		public function order_ajax() 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_mod_orderupload_download']))
+			{
+				
+				header('Content-Disposition: attachment; filename="'.rawurldecode($_REQUEST['wpsg_mod_orderupload_download']).'"');
+				header('Content-type: application/download');
+				header('Content-Disposition: inline; filename="'.rawurldecode($_REQUEST['wpsg_mod_orderupload_download']).'"');
+				header('Expires: 0');
+				header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+				header('Pragma: public');
+				
+				die(file_get_contents($this->getSavePath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['wpsg_mod_orderupload_download'])));
 				
 			}
@@ -268,9 +173,12 @@
 		} // public function order_ajax() 
 		
-		public function basket_save_done(&$o_id, &$k_id, &$oBasket) {
-			
-			if (wpsg_isSizedArray($_SESSION['wpsg']['wpsg_mod_orderupload'])) {
-				
-				foreach ($_SESSION['wpsg']['wpsg_mod_orderupload'] as $k => $ou) {
+		public function basket_save_done(&$o_id, &$k_id, &$oBasket)
+		{
+			
+			if (wpsg_isSizedArray($_SESSION['wpsg']['wpsg_mod_orderupload']))
+			{
+				
+				foreach ($_SESSION['wpsg']['wpsg_mod_orderupload'] as $k => $ou)
+				{
 					 
 					$path_target = $this->getSavePath($o_id);
@@ -284,5 +192,5 @@
 					unlink($ou[3]);
 					
-					//unset($_SESSION['wpsg']['wpsg_mod_orderupload'][$k]);
+					unset($_SESSION['wpsg']['wpsg_mod_orderupload'][$k]);
 					
 				}
@@ -292,19 +200,19 @@
 		} // public function basket_save_done($o_id, $k_id)
 		
-		public function order_view_sidebar(&$order_id) {
-
-			$path = $this->getSavePath($order_id);
-
-			$arFiles = scandir($path);
-
-			foreach ($arFiles as $k => $v) { if (in_array($v, array('.', '..', '.htaccess', '.htpasswd')) || is_dir($path.$v)) {  unset($arFiles[$k]); } }
+		public function order_view_sidebar(&$order_id) 
+		{ 
+	 
+			$arFiles = scandir($this->getSavePath($order_id));
+			 
+			foreach ($arFiles as $k => $v) { if (in_array($v['id'], array('.', '..', '.htaccess', '.htpasswd'))) { unset($arFiles[$k]); } }
 			
 			if (sizeof($arFiles) <= 0) return;
 			
 			$this->shop->view['arFiles'] = $arFiles;			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderupload/order_view_sidebar.phtml');
 			
 		} // public function order_view_sidebar(&$order_id)
 		
-		public function delOrder($order_id) 
+		public function delOrder(&$order_id) 
 		{ 
 			 
@@ -313,168 +221,8 @@
 			
 			wpsg_rrmdir($path);
-			            
-		} // public function delOrder($order_id)
-
-        public function product_addedit_content(&$product_content, &$product_data) {
- 
-            if (isset($_REQUEST['wpsg_lang'])) return;
-
-            $this->shop->view['wpsg_mod_orderupload']['set'] = $product_data['wpsg_mod_orderupload_set'];
-            $this->shop->view['wpsg_mod_orderupload']['mandatory'] = $product_data['wpsg_mod_orderupload_mandatory'];
-            
-            $this->shop->view['arSubAction']['wpsg_mod_orderupload'] = array(
-                'title' => __('Bestellupload', 'wpsg'),
-                'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderupload/product_addedit_content.phtml', false)
-            );
-
-        } // public function produkt_edit_allgemein(&$produkt_data)
- 
-        public function produkt_save_before(&$produkt_data) {  
-            
-            if (wpsg_isSizedArray($_REQUEST['wpsg_mod_orderupload'])) {
-
-                $produkt_data['wpsg_mod_orderupload_set'] = wpsg_sinput("key", $_REQUEST['wpsg_mod_orderupload']['set']);
-                $produkt_data['wpsg_mod_orderupload_mandatory'] = wpsg_sinput("key", $_REQUEST['wpsg_mod_orderupload']['mandatory']);
-                 
-            }
-            
-        } // public function produkt_save(&$produkt_id)
-
-		public function downloadProductFileRedirect(): void {
-
-			$order_id = intval($_SESSION['wpsg']['order_id']??0);
-			$product_index = intval($_REQUEST['product_index']??0);
-			$file = sanitize_file_name($_REQUEST['file']??'');
-
-			if ($order_id <= 0) throw new \Exception(__('Zugriffsfehler!', 'wpsg'));
-			if ($file === '') throw new \Exception(__('Zugriffsfehler!', 'wpsg'));
-
-			$base_path = realpath($this->getProductStoragePath($order_id, $product_index));
-			$full_path = realpath($base_path.DIRECTORY_SEPARATOR.$file);
-
-			if (!$full_path || strpos($full_path, $base_path) !== 0 || !file_exists($full_path)) throw new \Exception(__('Datei nicht gefunden!', 'wpsg'));
-			if (!file_exists($full_path)) throw new \Exception(__('Datei existiert nicht mehr auf dem Server.', 'wpsg'));
-
-			header('Content-Type: application/octet-stream');
-			header('Content-Disposition: attachment; filename="'.basename($file).'"');
-			header('Content-Length: '.filesize($full_path));
-
-			readfile($full_path);
-			exit;
-
-		}
-
-        public function template_redirect() {
-
-				if (wpsg_isSizedString($_REQUEST['action'], 'wpsg_mod_orderupload_upload')) {
-                 
-                if ($_REQUEST['order_id'] != $_SESSION['wpsg']['order_id']) throw new \Exception(__('Zugriffsfehler!', 'wpsg'));
-                
-                $path = $this->getProductStoragePath($_REQUEST['order_id'], $_REQUEST['product_index']);
-
-                $oProduct = wpsg_product::getInstance($_REQUEST['product_id']);
-                                
-                if (!$this->shop->hasFrontendError()) {
-                                        
-                    // Upload
-                    foreach ($_FILES['file']['tmp_name'] as $k => $f) {
-
-                        $arFilesUploaded = $this->getProductUploads($_REQUEST['order_id'], $_REQUEST['product_index']);
-                        if (sizeof($arFilesUploaded) >= $oProduct->wpsg_mod_orderupload_set) { $this->shop->addFrontendError(wpsg_translate(__('Sie haben die maximale Anzahl an Dateien (#1#) fÃŒr dieses Produkt erreicht.', 'wpsg'), $oProduct->wpsg_mod_orderupload_set)); break; }
-
-                        move_uploaded_file($f, $path.$_FILES['file']['name'][$k]);
-                        
-                    }
-                    
-                }
-
-                echo $this->renderUploadTarget($_SESSION['wpsg']['order_id'], $_REQUEST['product_index'], $_REQUEST['product_id']); exit;
-                
-            } else if (wpsg_isSizedString($_REQUEST['action'], 'wpsg_mod_orderupload_delete')) {
-
-                if ($_REQUEST['order_id'] != $_SESSION['wpsg']['order_id']) throw new \Exception(__('Zugriffsfehler!', 'wpsg'));
-                
-                $path = $this->getProductStoragePath($_SESSION['wpsg']['order_id'], $_REQUEST['product_index']);
-                
-                if (file_exists($path.basename($_REQUEST['file']))) unlink($path.basename($_REQUEST['file']));
-                else $this->shop->addFrontendError(__('Datei konnte nicht gefunden werden.', 'wpsg'));
-                
-                echo $this->renderUploadTarget($_SESSION['wpsg']['order_id'], $_REQUEST['product_index'], $_REQUEST['product_id']); exit;
-                
-            }
-            
-        }
-
-        /** Wird aufgerufen wenn ein Produkt aus dem Warenkorb entfernt wird */
-        public function basket_removeProduktFromSession($product_index) { 
-            
-            $path = $this->getProductStoragePath($_SESSION['wpsg']['order_id'], $product_index);
-            $arFiles = $this->getProductUploads($_SESSION['wpsg']['order_id'], $product_index);
-            
-            foreach ($arFiles as $f) {
-                
-                @unlink($f);
-                
-            }
-            
-        } // public function basket_removeProduktFromSession($product_index)
-        
-        public function basket_row(&$p, $i) {  
-            
-            if (!wpsg_isSizedInt($p['wpsg_mod_orderupload_set'])) return false;
-
-            $this->shop->view['wpsg_mod_orderupload']['order_id'] = $_SESSION['wpsg']['order_id'];
-            $this->shop->view['wpsg_mod_orderupload']['product_id'] = $p['product_id'];
-            $this->shop->view['wpsg_mod_orderupload']['product_index'] = $p['product_index']; 
-            $this->shop->view['wpsg_mod_orderupload']['strHTMLTarget'] = $this->renderUploadTarget($_SESSION['wpsg']['order_id'], $p['product_index'], $p['product_id']);
-                         
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderupload/basket_row.phtml');
-            
-        } // public function basket_row_afterproducts()
-
-        public function basket_after(&$basket_view) {
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderupload/basket_after.phtml');
-            
-        } // public function basket_after(&$basket_view)
-        
-        public function order_view_row(&$p, $i) { 
-            
-            $order_id = $this->shop->view['data']['id'];
-            $product_index = $p['product_index'];
-
-            $arUploadedFiles = $this->getProductUploads($order_id, $product_index);
-
-            if (wpsg_isSizedArray($arUploadedFiles)) {
-
-                $arFileDownloadLinks = [];
-                
-                foreach ($arUploadedFiles as $f) {
-
-                    $arFileDownloadLinks[] = '<a target="_blank" href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&product_index='.$product_index.'&edit_id='.$order_id.'&noheader=1&action=ajax&mod=wpsg_mod_orderupload&wpsg_mod_orderupload_download='.rawurlencode(basename($f)).'">'.basename($f).'</a>';
-                }
-
-                $this->shop->view['wpsg_mod_orderupload']['arFileDownloadLinks'] = $arFileDownloadLinks;
-                $this->shop->view['wpsg_mod_orderupload']['arFiles'] = $arUploadedFiles;
-                $this->shop->view['wpsg_mod_orderupload']['i'] = $i;
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderupload/order_view_row.phtml');
-                
-            } 
-            
-        } // public function order_view_row(&$p, $i)
-        
+			
+		} // public function delOrder(&$order_id)
+		
 		/* -- */
-		
-		private function renderUploadTarget($order_id, $product_index, $product_id) {
-
-            $this->shop->view['wpsg_mod_orderupload']['oProduct'] = wpsg_Product::getInstance($product_id);
-            $this->shop->view['wpsg_mod_orderupload']['order_id'] = $order_id;
-		    $this->shop->view['wpsg_mod_orderupload']['product_index'] = $product_index;
-            $this->shop->view['wpsg_mod_orderupload']['product_id'] = $product_id;
-            $this->shop->view['wpsg_mod_orderupload']['arFiles'] = $this->getProductUploads($order_id, $product_index);
-
-		    return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_orderupload/basket_row_upload_target.phtml', false);
-		     
-        } // private function renderUploadTarget($order_id, $product_index)
 		
 		public function getNewName($filename, $order_id)
@@ -502,4 +250,5 @@
 				$url = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_orderupload/'.$order_id.'/';
 				$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_orderupload/'.$order_id.'/'; 
+				$htaccess = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_orderupload/.htaccess';
 				 
 			}
@@ -509,111 +258,27 @@
 				$url = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_orderupload/'.$order_id.'/';
 				$path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_orderupload/'.$order_id.'/';
+				$htaccess = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_orderupload/.htaccess';
 								
 			}
-			
-			$this->shop->protectDirectory($path);
-			 			
+			 
+			if (!file_exists($path)) mkdir($path, 0777, true);
+			
+ 			if (!file_exists($htaccess))
+			{
+				 				
+				$handle = fopen($htaccess, "w+");
+				$content = "Deny from all";			
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+			
 			if ($burl) return $url;
 			else return $path;
 			
- 		} // public function getSavePath($order_id, $url = false)
-
-        /**
-         * Gibt den Pfad zurÃŒck, in dem die Dateien zu einer Bestellung/Produkt gespeichert sind
-         */
-        public function getProductStoragePath($order_id, $product_index) {
-
-            $path = $this->shop->getUplodatStoragePath().'wpsg_orderupload/'.$order_id.'/'.$product_index.'/';
-             
-            if (!file_exists($path)) mkdir($path, 0755, true);
-            
-            return $path;
-            
-        } // public function getProductStorage($order_id, $product_index)
-        
-        public function getProductUploads($order_id, $product_index) {
-            
-            $arFiles = [];
-            
-            $path = $this->getProductStoragePath($order_id, $product_index);
-
-            foreach (scandir($path) as $file) {
-                
-                if (!in_array($file, ['.', '..']) && is_file($path.$file)) $arFiles[] = $path.$file;
-                
-            }
-            
-            asort($arFiles);
-            
-            return $arFiles;
-            
-        } // public function getProductUploads($order_id, $product_index)
-        
- 		public function getAdminAttachment(&$attach)
- 		{
- 			
- 			$o_id = $_SESSION['wpsg']['order_id'];
- 			$path = $this->getSavePath($o_id);
- 			
- 			if ($this->shop->get_option('wpsg_mod_orderupload_mail') == 1) {
- 				
-	 			foreach ($_SESSION['wpsg']['wpsg_mod_orderupload'] as $k => $ou)
-	 			{
-	 			    	 				
-	 				$attach[] = $path.$this->getNewName($ou[0], $o_id);
-	 				
-	 				unset($_SESSION['wpsg']['wpsg_mod_orderupload'][$k]);
-	 				
-	 			}
-	 			
-	 			$order_id = $this->shop->view['o_id'];
-                
-                foreach ($this->shop->view['basket']['produkte'] as $product_basket_data) {
- 
-                    $arFilesUploaded = $this->getProductUploads($order_id, $product_basket_data['product_index'], $product_basket_data['product_id']);
-                    
-                    if (wpsg_isSizedArray($arFilesUploaded)) {
-
-                        foreach ($arFilesUploaded as $file) {
-                            
-                            $attach[] = $file;
-                            
-                        }
-
-                    }
-                    
-                } 
-                
- 				if ($this->shop->get_option('wpsg_mod_orderupload_zip') == 1) {
- 					
- 					$zpath = $path.$this->getNewName('archiv', $o_id).'.zip';
- 					
-                    // Objekt erstellen und prÃŒfen, ob der Server zippen kann
- 					$zip = new ZipArchive();
- 					
-                    // ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE ÃŒberschreibt nicht das Archiv,
- 					// deshalb die Archivdatei vorher lÃ¶schen
- 					if (file_exists($zpath)) unlink($zpath);
- 					
- 					if ($zip->open($zpath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== TRUE) { throw new \Exception("Could not open archive"); }
- 					
- 					foreach ($attach as $k => $v) {
- 						
- 						$vl = pathinfo($v);
- 						$zip->addFile($v, $vl['basename']);
-                        
- 					}
-
- 					// Zip-Datei speichern
- 					$zip->close();
- 					
- 					$attach = array();
- 					$attach[] = $zpath;
- 					
- 				}
- 				
- 			}
- 			
- 		} // public function getAdminAttachment(&$attach)
- 		
+ 		} // private function getSavePath($order_id, $url = false)
+				
 	} // class wpsg_mod_orderupload extends wpsg_mod_basic
+
+
+?>
Index: /mods/wpsg_mod_ordervars.class.php
===================================================================
--- /mods/wpsg_mod_ordervars.class.php	(revision 8528)
+++ /mods/wpsg_mod_ordervars.class.php	(revision 5261)
@@ -5,9 +5,7 @@
 	 * @author daschmi (daniel@maennchen1.de)
 	 */
-	class wpsg_mod_ordervars extends wpsg_mod_basic {
-
-        /** @var array $arTypen */
-        public $arTypen = [];
-
+	class wpsg_mod_ordervars extends wpsg_mod_basic
+	{
+		
 		var $lizenz = 1;
 		var $id = 950;
@@ -34,5 +32,5 @@
 									
 		} // public function __construct()
-		 
+		
 		public function install() 
 		{ 
@@ -47,5 +45,4 @@
 		   		pflicht INT(1) NOT NULL, 
 		   		deleted INT(1) NOT NULL,
-				pos int(11) NOT NULL,
 		   		PRIMARY KEY  (id)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
@@ -63,5 +60,6 @@
 		} // public function settings_edit()
 		
-		public function be_ajax() {
+		public function be_ajax()
+		{
 			
 			$this->shop->mod = $this;
@@ -87,36 +85,19 @@
 				
 			}
-			else if ($_REQUEST['do'] == 'reorder')
-			{
-			
-				parse_str($_REQUEST['wpsg_reorder'], $wpsg_reorder);
-	 
-				foreach ($wpsg_reorder['ov'] as $pos => $ov_id)
-				{
-						
-					$this->db->UpdateQuery(WPSG_TBL_ORDERVARS, array(
-						'pos' => wpsg_q($pos)
-					), " `id` = '".wpsg_q($ov_id)."' ");
-						
-				}
-			
-				die("1");
-			
-			}
 			else if ($_REQUEST['do'] == 'del')
 			{
-				
+				//die($_REQUEST['ov_id']);
 				$result = $this->db->Query("DELETE FROM `".WPSG_TBL_ORDERVARS."` WHERE `id` = '".wpsg_q($_REQUEST['ov_id'])."'");
-
-				die($this->ov_list());
-				
-			}
-			else if ($_REQUEST['do'] == 'inlinedit') {
+				
+				die($result);
+				//die($this->ov_list());
+				
+			}
+			else if ($_REQUEST['do'] == 'inlinedit')
+			{
 				
 				$data = array();
 				if ($_REQUEST['field'] == 'name') 
-				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
+				{ 
 
 					$data['name'] = wpsg_q($_REQUEST['value']);
@@ -125,9 +106,5 @@
 					
 				}
-				else if ($_REQUEST['field'] == 'pflicht') {
-
-				    $data['pflicht'] = wpsg_q($_REQUEST['value']); $value = $_REQUEST['value'];
-
-				}
+				else if ($_REQUEST['field'] == 'pflicht') { $data['pflicht'] = wpsg_q($_REQUEST['value']); $value = $_REQUEST['value']; }
 				else if ($_REQUEST['field'] == 'typ') { $data['typ'] = wpsg_q($_REQUEST['value']); $value = $this->arTypen[$_REQUEST['value']]; }
 				else if ($_REQUEST['field'] == 'auswahl') { 
@@ -135,7 +112,5 @@
 					$data['auswahl'] = wpsg_q($_REQUEST['value']);
 					$this->shop->addTranslationString('wpsg_mod_ordervars_auswahl'.$_REQUEST['ov_id'], $_REQUEST['value']); 
-					$value = $_REQUEST['value'];
-					
-					
+					$value = $_REQUEST['value']; 
 				
 				}
@@ -159,5 +134,5 @@
 			
 			// VerfÃŒgbare Bestellvariablen
-			$arOV = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1' ORDER BY `pos` ASC, `id` ASC ");
+			$arOV = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1'");
 			
 			foreach ($arOV as $ov)
@@ -221,21 +196,13 @@
 			if (wpsg_isSizedString($_REQUEST['do'], 'inlinedit'))
 			{
-
-				$_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
-
+	 
 				$ov_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `id` = '".wpsg_q($_REQUEST['ov_id'])."' ");
 				$arAuswahl = explode('|', $ov_db['auswahl']);
-
+				
 				if ($ov_db['typ'] == 1 && is_numeric($_REQUEST['value']))
 				{
 				
-					$_REQUEST['value'] = wpsg_sinput("key", $arAuswahl[$_REQUEST['value']]);
-
-				}
-				else
-				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
+					$_REQUEST['value'] = $arAuswahl[$_REQUEST['value']];
+						
 				}
 				
@@ -263,49 +230,40 @@
 		}
 		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) { 
-			
-			if (isset($_SESSION['wpsg']['wpsg_mod_ordervars'])) {
-
-				$db_data['bvars'] = serialize(@$_SESSION['wpsg']['wpsg_mod_ordervars']);
-				
-			}
-			
-		}
-		 
-		public function order_view($order_id, &$arSidebarArray) {
-
-			$arOV_db = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1' ORDER BY `pos` ASC, `id` ASC ");
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
+		{ 
+ 						
+			$data['bvars'] = serialize($_SESSION['wpsg']['wpsg_mod_ordervars']);
+			
+		}
+		
+		public function order_view_sidebar(&$order_id) 
+		{
+
+			$arOV_db = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` ");
 			$arOV = array();
-
-			foreach ($arOV_db as $k => $ov) {
-
+			
+			foreach ($arOV_db as $k => $ov)
+			{
+				
 				$arOV[$ov['id']] = wpsg_array_merge(array(
-					'value' => $this->getValueByIdAndOrder($ov['id'], $order_id)
+					'value' => $this->getValueByIdAndOrder($ov['id'], $order_id)						
 				), $ov);
-
+				
 				$arOV[$ov['id']]['auswahl'] = explode('|', $ov['auswahl']);
-
-			}
-
+				
+			}
+			
 			if (!wpsg_isSizedArray($arOV)) return;
 
 			$this->shop->view['wpsg_mod_ordervars']['data'] = $arOV;
-
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ordervars/order_view_sidebar.phtml', false)
-			);
-
-		}
-
+	 
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ordervars/order_view_sidebar.phtml');
+			
+		}
+		
 		public function clearSession() 
 		{ 
 			
-			if ($this->shop->get_option('wpsg_afterorder') == '1')
-			{
-				
-				unset($_SESSION['wpsg']['wpsg_mod_ordervars']);
-				
-			}
+			unset($_SESSION['wpsg']['wpsg_mod_ordervars']);
 			
 		}
@@ -322,7 +280,8 @@
 		}
 		
-		public function checkout_inner_prebutton(&$checkout_view) {
-						
-			$this->shop->view['wpsg_mod_ordervars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1' ORDER BY `pos` ASC, `id` ASC ", "id");
+		public function checkout_inner_prebutton(&$checkout_view) 
+		{ 
+						
+			$this->shop->view['wpsg_mod_ordervars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1'");
 			
 			if (!wpsg_isSizedArray($this->shop->view['wpsg_mod_ordervars']['data'])) return;
@@ -332,17 +291,21 @@
 		} // public function checkout_inner_prebutton(&$checkout_view) 
 		
-		public function mail_aftercalculation(&$order_id) {
-
+		public function mail_aftercalculation(&$order_id)
+		{
+			
 			$arOV = $this->getOrderVarsByOrderID($order_id);
-
+			
 			if (!wpsg_isSizedArray($arOV)) return;
-
+			
 			$this->shop->view['wpsg_mod_ordervars']['data'] = $arOV;
 			
-			if ($this->shop->htmlMail === true) {
+			if ($this->shop->htmlMail === true)
+			{
 				
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ordervars/mail_html.phtml');
 				
-			} else {
+			}
+			else
+			{
 			
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ordervars/mail.phtml');
@@ -352,11 +315,14 @@
 		} // public function mail_aftercalculation(&$order_id)
 		
-		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false) {
-
-			if ($order_id !== false && $order_id > 0) {
+		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false) 
+		{ 
+		
+			if ($order_id !== false && $order_id > 0)
+			{
 
 				$arOrderVars = $this->getOrderVarsByOrderID($order_id);
-
-				foreach ((array)$arOrderVars as $k => $v) {
+				
+				foreach ((array)$arOrderVars as $k => $v)
+				{
 					
 					$arReplace['/%ov_'.$v['id'].'%/'] = $v['value'];
@@ -401,7 +367,5 @@
 					`".WPSG_TBL_ORDERVARS."` AS OV
 				WHERE 
-					`deleted` != '1'
-				ORDER BY
-					`pos` ASC, `id` ASC 
+					`deleted` != '1'	
 			");
 			
@@ -424,14 +388,16 @@
 		 * Gibt alle Bestellvariablen aus der Konfiguration zurÃŒck, gefÃŒllt mit den Werten einer Bestellung
 		 */
-		public function getOrderVarsByOrderID($order_id) {
-			
-			$arOV = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1' ORDER BY `pos` ASC, `id` ASC ");
-			
-			if (!wpsg_isSizedArray($arOV)) return [];
+		public function getOrderVarsByOrderID($order_id)
+		{
+			
+			$arOV = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_ORDERVARS."` WHERE `deleted` != '1'");
+			
+			if (!wpsg_isSizedArray($arOV)) return false;
 			
 			$data = array();
 			
-			foreach ($arOV as $ov_id) {
-
+			foreach ($arOV as $ov_id)
+			{
+				
 				$data[] = array(
 					'id' => $ov_id,
@@ -441,5 +407,5 @@
 				
 			}
-
+			
 			return $data;
 			
@@ -459,18 +425,16 @@
 		 * Gibt den Wert einer Bestellvariable fÃŒr eine ID und eine Bestell ID zurÃŒck
 		 */
-		public function getValueByIdAndOrder($ov_id, $order_id) {
+		public function getValueByIdAndOrder($ov_id, $order_id)
+		{
 
 			$order_data = $this->shop->cache->loadOrder($order_id);
 			$ov_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDERVARS."` WHERE `id` = '".wpsg_q($ov_id)."'");
-			$arOV_order = @unserialize($order_data['bvars']); if (!is_array($arOV_order)) $arOV_order = [];
-
-			// Typensicherheit
-            $arOV_orderInt = []; foreach ($arOV_order as $k => $v) $arOV_orderInt[intval($k)] = $v; $arOV_order = $arOV_orderInt;
-            $ov_id = intval($ov_id);
-
+			$arOV_order = @unserialize($order_data['bvars']);
+			
 			if (!isset($arOV_order[$ov_id])) return __('Keine Angabe', 'wpsg');
-
-			if ($ov_db['typ'] == '1') {
-
+			
+			if ($ov_db['typ'] == '1')
+			{
+				
 				// Auswahl
 				if ($arOV_order[$ov_id] == '')
@@ -479,5 +443,7 @@
 				}  
 				
-			} else if ($ov_db['typ'] == '2') {
+			}
+			else if ($ov_db['typ'] == '2')
+			{
 				
 				// Textfeld
@@ -513,5 +479,5 @@
 		{
 			
-			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` ORDER BY `pos` ASC, `id` ASC ");			
+			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_ORDERVARS."` ORDER BY `id` ASC");			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ordervars/ov_list.phtml');
 			
@@ -520,2 +486,3 @@
 	} // class wpsg_mod_ordervars extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_packagetracking.class.php
===================================================================
--- /mods/wpsg_mod_packagetracking.class.php	(revision 8528)
+++ /mods/wpsg_mod_packagetracking.class.php	(revision 5261)
@@ -21,5 +21,5 @@
 			$this->name = __('Paketverfolgung', 'wpsg');
 			$this->group = __('Versand', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht Verwaltung und Zusendung von Tracking Codes zur Paketverfolgung.', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht Verwaltung und zusendung von Tracking Codes zur Paketverfolgung.', 'wpsg');
 		
 			if (!defined('WPSG_TBL_TRACKINGPROVIDER')) define('WPSG_TBL_TRACKINGPROVIDER', $this->shop->prefix.'wpsg_trackingprovider');
@@ -83,5 +83,5 @@
 					array(
 						'name' => 'DPD',
-						'url' => 'https://tracking.dpd.de/parcelstatus?query=%order_trackingid%&locale=de_DE'
+						'url' => 'http://www.dpd.de/cgi-bin/delistrack?typ=1&lang=de&pknr=%order_trackingid%'
 					),
 					array(
@@ -91,5 +91,5 @@
 					array(
 						'name' => 'DeutschePost Einschreiben',
-						'url' => 'https://www.deutschepost.de/sendung/simpleQueryResult.html?form.sendungsnummer=%order_trackingid%&form.einlieferungsdatum_tag=%d%&form.einlieferungsdatum_monat=%m%&form.einlieferungsdatum_jahr=%Y%'
+						'url' => 'http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc=%order_trackingid%'
 					),
 					array(
@@ -103,10 +103,6 @@
 					array(
 						'name' => 'UPS',
-						'url' => 'http://wwwapps.ups.com/WebTracking/processInputRequest?sort_by=status&tracknums_displayed=1&TypeOfInquiryNumber=T&loc=de_DE&InquiryNumber1=%order_trackingid%&track.x=0&track.y=0'
-					),
-                    array(
-                        'name' => 'Fedex',
-                        'url' => 'https://www.fedex.com/fedextrack/?tracknumbers=%order_trackingid%&locale=de_DE&cntry_code=de'
-                    )
+						'url' => 'http://wwwapps.ups.com/ietracking/tracking.cgi?tracknum=%order_trackingid%&IATA=de&Lang=ger'
+					)
 				);
 				
@@ -158,5 +154,5 @@
 			{
 				
-				if (!wpsg_isSizedInt($_REQUEST['trackingprovider_id'])) throw new \wpsg\Exception(__('Delete Anfrage ohne ID', 'wpsg'));
+				if (!wpsg_isSizedInt($_REQUEST['trackingprovider_id'])) $this->shop->throwErrorCode('3130_3');
 				
 				$tp_id = $this->db->UpdateQuery(WPSG_TBL_TRACKINGPROVIDER, array(
@@ -170,8 +166,6 @@
 			{
 				
-				if (!wpsg_isSizedInt($_REQUEST['trackingprovider_id'])) throw new \wpsg\Exception(__('Inline Edit ohne ID', 'wpsg'));
-
-				$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
+				if (!wpsg_isSizedInt($_REQUEST['trackingprovider_id'])) $this->shop->throwErrorCode('3130_2');
+				
 				if ($_REQUEST['field'] == 'name')
 				{
@@ -199,5 +193,5 @@
 				}
 				
-				throw new \wpsg\Exception(__('Inline Edit eines ungÃŒltigen Feldes', 'wpsg'));
+				$this->shop->throwErrorCode('3130_1');
 				
 			}
@@ -206,5 +200,5 @@
 				
 				$this->db->UpdateQuery(WPSG_TBL_VA, array(
-					'wpsg_mod_packagetracking_provider' => wpsg_q(wpsg_sinput("key", $_REQUEST['trackingprovider_id']))
+					'wpsg_mod_packagetracking_provider' => wpsg_q($_REQUEST['trackingprovider_id'])
 				), " `id` = '".wpsg_q($_REQUEST['va_id'])."' ");
 				
@@ -242,6 +236,5 @@
 			$this->shop->view['wpsg_mod_packagetracking']['preset'] = 0;
 			
-			$temp = $oOrder->wpsg_mod_packagetracking_provider;
-			if (wpsg_isSizedInt($temp)) 
+			if (wpsg_isSizedInt($oOrder->wpsg_mod_packagetracking_provider)) 
 			{
 				
@@ -261,7 +254,4 @@
 			
 			$this->shop->view['wpsg_mod_packagetracking']['oOrder'] = $oOrder;
-			$temp = array('id' => 0, 
-					'name' => __('Keine Paketverfolgung', 'wpsg'), 'url' => '', 'deleted' => 0);
-			$artemp[] = $temp;
 			$this->shop->view['wpsg_mod_packagetracking']['provider'] = $this->db->fetchAssoc("
 				SELECT
@@ -274,5 +264,4 @@
 					`id` ASC
 			");
-			$this->shop->view['wpsg_mod_packagetracking']['provider'] = array_merge($artemp, $this->shop->view['wpsg_mod_packagetracking']['provider']);
 			
 			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_packagetracking/order_view_switchStatus.phtml');
@@ -280,10 +269,9 @@
 		} // public function order_view_switchStatus(&$db_order)
 		
-		public function setOrderStatus($order_id, $status_id, $inform) { 
-			
-			if (isset($_REQUEST['wpsg_mod_packagetracking_provider'])) {
-				
-				wpsg_checkInput($_REQUEST['wpsg_mod_packagetracking_code'], WPSG_SANITIZE_TEXTFIELD, ['allowEmpty' => true]);
-				wpsg_checkInput($_REQUEST['wpsg_mod_packagetracking_provider'], WPSG_SANITIZE_INT, ['allowEmpty' => true]);
+		public function setOrderStatus($order_id, $status_id, $inform) 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_mod_packagetracking_provider']))
+			{
 				
 				$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
@@ -291,29 +279,24 @@
 					'wpsg_mod_packagetracking_provider' => wpsg_q($_REQUEST['wpsg_mod_packagetracking_provider'])
 				), " `id` = '".wpsg_q($order_id)."' ");
-				
-				$this->shop->cache->clearOrderCache($order_id);
-				$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id); 
-				
+												
 			}
 			
 		} // public function setOrderStatus($order_id, $status_id, $inform)
 		
-		public function mail_status(&$order, &$customer) {
-			
-			$oOrder = wpsg_order::getInstance($order['id'], true);
-
-
-            $wpsg_mod_packagetracking_provider = $oOrder->__get('wpsg_mod_packagetracking_provider');
-            $wpsg_mod_packagetracking_code = $oOrder->__get('wpsg_mod_packagetracking_code');
-
-			if ($_REQUEST['status'] != 250 || !wpsg_isSizedInt($wpsg_mod_packagetracking_provider) || !wpsg_isSizedString($wpsg_mod_packagetracking_code)) return;
+		public function mail_status(&$order, &$customer) 
+		{ 
+			 
+			if ($_REQUEST['status'] != 250 || !wpsg_isSizedInt($order['wpsg_mod_packagetracking_provider']) || !wpsg_isSizedString($order['wpsg_mod_packagetracking_code'])) return;
 			
 			$this->shop->view['wpsg_mod_packagetracking']['trackingURL'] = $this->getTrackingURL($order['id']);
 			
-			if ($this->shop->htmlMail === true) {
+			if ($this->shop->htmlMail === true)
+			{
 
 				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_packagetracking/mail_status_html.phtml');
 				
-			} else {
+			}
+			else
+			{
 			
 				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_packagetracking/mail_status.phtml');
@@ -330,7 +313,5 @@
 			$oOrder = wpsg_order::getInstance($order_id, true);
 			
-			$code = $oOrder->wpsg_mod_packagetracking_code;
-			$prov = $oOrder->wpsg_mod_packagetracking_provider;
-			if (!wpsg_isSizedString($code) || !wpsg_isSizedInt($prov)) return '';
+			if (!wpsg_isSizedString($oOrder->wpsg_mod_packagetracking_code) || !wpsg_isSizedInt($oOrder->wpsg_mod_packagetracking_provider)) return '';
 
 			$url = $this->db->fetchOne("SELECT `url` FROM `".WPSG_TBL_TRACKINGPROVIDER."` WHERE `id` = '".wpsg_q($oOrder->wpsg_mod_packagetracking_provider)."' ");
@@ -363,5 +344,6 @@
 			
 		} // public function renderTrackingList()
-
+		
 	} // class wpsg_mod_packagetracking extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_pap.class.php
===================================================================
--- /mods/wpsg_mod_pap.class.php	(revision 5261)
+++ /mods/wpsg_mod_pap.class.php	(revision 5261)
@@ -0,0 +1,257 @@
+<?php
+
+	/**
+	 * Integration von Post Affiliate Pro in wpShopGermany
+	 */
+	class wpsg_mod_pap extends wpsg_mod_basic 
+	{
+		
+		var $lizenz = 1;
+		var $id = 200;
+		
+		var $hilfeURL = 'http://wpshopgermany.de/?p=1582';
+		var $version = "3.0";		
+		var $free = true;
+				
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Post Affiliate Pro', 'wpsg');
+			$this->group = __('Sonstiges', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht die integration von Post Affiliat Pro.', 'wpsg');
+									
+		} // public function __construct()
+		
+		public function install()
+		{
+			
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			/**
+			 * Tabelle fÃŒr die Lieferanten
+			 */
+			$sql = "CREATE TABLE ".WPSG_TBL_PAP." ( 
+				`id` int(11) NOT NULL AUTO_INCREMENT,
+  				`uid` int(11) NOT NULL,
+  				`pap` enum('0','1') NOT NULL,
+  				`papusername` varchar(255) NOT NULL,
+  				`pappwd` varchar(255) NOT NULL,
+  				`affiliateID` varchar(255) NOT NULL,
+				PRIMARY KEY  (id)
+			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			
+		   	dbDelta($sql); 
+		
+		} // public function install()
+		
+		public function init() 
+		{
+		
+		} // public function init()
+		
+		public function settings_edit()
+		{
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_pap/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_paplogin_pap_url', $_REQUEST['wpsg_paplogin_pap_url']);
+			$this->shop->update_option('wpsg_paplogin_admin', $_REQUEST['wpsg_paplogin_admin']);
+			$this->shop->update_option('wpsg_paplogin_passwort', $_REQUEST['wpsg_paplogin_passwort']);
+			$this->shop->update_option('wpsg_paplogin_register', $_REQUEST['wpsg_paplogin_register']);
+			$this->shop->update_option('wpsg_pap_registrierung', $_REQUEST['wpsg_pap_registrierung']);
+			$this->shop->update_option('wpsg_pap_include_profil', $_REQUEST['wpsg_pap_include_profil']);
+			$this->shop->update_option('wpsg_pap_order_tracking', $_REQUEST['wpsg_pap_order_tracking']);
+			
+		} // public function settings_save()
+		 
+		public function customer_updated(&$customer_id) 
+		{ 
+			
+		} // public function customer_updated(&$customer_id)
+		
+		public function customer_created(&$customer_id, &$pwd) 
+		{ 
+
+			if (isset($_REQUEST['wpsg_mod_kundenverwaltung_register']) && $this->shop->get_option('wpsg_pap_registrierung') == '1')
+			{
+				
+				// Ein Kunde hat sich registriert und die Option fÃŒr neu registrierungen ist aktiviert
+				$this->mkPapAccount($customer_id, $pwd);
+				
+			}
+			
+			if (isset($_REQUEST['wpsg_checkout']) && $this->shop->get_option('wpsg_paplogin_register') == '1')
+			{
+				
+				// Ein Kunde hat sich im Zuge einer Bestellung registriert
+				$this->mkPapAccount($customer_id, $pwd); 
+				
+			}
+			
+		} // public function customer_created(&$customer_id)
+		
+		/** Modulfunktionen */
+		
+		/*
+		 * Legte fÃŒr einen bestehenden Kunden einen PAP Account an
+		 */
+		public function mkPapAccount($kunde_id, $pwd)
+		{
+
+			require_once dirname(__FILE__)."/mod_pap/PapApi.class.php";
+			
+			$ApiSession = new Gpf_Api_Session($this->shop->get_option('wpsg_paplogin_pap_url')."/scripts/server.php");
+			
+			if (!$ApiSession->login($this->shop->get_option('wpsg_paplogin_admin'), $this->shop->get_option('wpsg_paplogin_passwort')))
+			{
+				
+				echo "PAP Error: ".$ApiSession->getMessage();
+				return;
+				
+			}
+			else 
+			{
+	
+				// Kunde laden
+				$kunde = $this->shop->cache->loadKunden($kunde_id);
+				 				 
+				$kunde['land'] = $this->db->fetchOne("SELECT `bezeichnung` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($kunde['land'])."'");
+				
+				$affiliate = new Pap_Api_Affiliate($ApiSession);
+ 
+				$affiliate->setField('username', $kunde['email']);
+				$affiliate->setField('rpassword', $pwd);
+				$affiliate->setField('firstname', $kunde['vname']);
+				$affiliate->setField('lastname', $kunde['name']);				
+				//$affiliate->setField('refid', '1');
+				
+				$affiliate->setData('1', '-'); // WebURL
+				$affiliate->setData('2', ((trim($kunde['firma']) != "")?$kunde['firma']:' '));
+				$affiliate->setData('3', $kunde['strasse']);
+				$affiliate->setData('4', $kunde['ort']);
+				$affiliate->setData('5', '2'); // State
+				$affiliate->setData('6', $kunde['land']);
+				$affiliate->setData('7', $kunde['plz']);
+				$affiliate->setData('8', $kunde['tel']);
+				$affiliate->setData('9', $kunde['fax']);
+				$affiliate->setData('10', $kunde['ustidnr']);
+				  
+				$affiliate->setStatus('A'); // allowed values: A â approved, P â pending, D - declined 
+				
+				if(!$affiliate->add())
+				{
+					
+					echo "PAP Error: ".$affiliate->getMessage();
+					return false;
+					
+				}
+				else
+				{
+					
+					$affiliateID = $affiliate->getUserid();
+					
+					if ($affiliateID != false)
+					{
+						
+						$this->db->ImportQuery(WPSG_TBL_PAP, array(
+							'uid' => wpsg_q($kunde['id']),
+							'pap' => '1',
+							'papusername' => wpsg_q($kunde['email']),
+							'pappwd' => wpsg_q($pwd),
+							'affiliateID' => wpsg_q($affiliateID)
+						));
+						
+					}
+					else
+					{
+						
+						echo "PAP Error: ".$affiliate->getMessage();
+						return false; 
+						
+					}
+					 
+					return true;
+					
+				}
+
+			}
+			
+		} //public function mkPapAccount($email, $pwd)
+		
+		/**
+		 * update PAP Account 
+		 */
+		public function updatePapAccount($login, $arData)
+		{
+			
+			require_once dirname(__FILE__)."/mod_pap/PapApi.class.php";
+			
+			$ApiSession = new Gpf_Api_Session($this->shop->get_option('wpsg_paplogin_pap_url')."/scripts/server.php");
+			
+			if(!$ApiSession->login($this->shop->get_option('wpsg_paplogin_admin'), $this->shop->get_option('wpsg_paplogin_passwort')))
+			{
+				
+				echo ("PAP Error: ".$ApiSession->getMessage());
+				return false;
+				
+			}
+			else 
+			{
+				
+				$papid = $this->db->fetchOne("SELECT `affiliateID` FROM `".WPSG_TBL_PAP."` WHERE `uid` = ".wpsg_q($login));
+
+				//PAP Account Daten
+				$affiliate = new Pap_Api_Affiliate($ApiSession);
+				$affiliate->setUserid($papid);
+  				$papAccount = $affiliate->load();
+  				
+  				if ($papAccount == '1')
+  				{
+										
+					$affiliate->setField('firstname', $arData['vname']);
+					$affiliate->setField('lastname', $arData['name']);		 
+					
+					$affiliate->setData('1', '-'); // WebURL
+					$affiliate->setData('2', ((trim($arData['firma']) != "")?$arData['firma']:' '));
+					$affiliate->setData('3', $arData['strasse']);
+					$affiliate->setData('4', $arData['ort']);
+					$affiliate->setData('5', '2'); // State
+					$affiliate->setData('6', $arData['land']);
+					$affiliate->setData('7', $arData['plz']);
+					$affiliate->setData('8', $arData['tel']);
+					$affiliate->setData('9', $arData['fax']);
+					$affiliate->setData('10', $arData['ustidnr']);
+					
+  				}
+
+				if(!$affiliate->save())
+				{
+					
+					echo("PAP Error: ".$affiliate->getMessage());
+					return false;
+					
+				}
+				else
+				{		
+								
+					return true;
+					
+				}
+
+			}
+			
+		} //public function updatePapAccount($login)
+		
+	} // class wpsg_mod_pap extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_paypal.class.php
===================================================================
--- /mods/wpsg_mod_paypal.class.php	(revision 8528)
+++ /mods/wpsg_mod_paypal.class.php	(revision 5261)
@@ -39,5 +39,6 @@
 			$this->shop->checkDefault('wpsg_mod_paypal_mwstland', '0');
 			$this->shop->checkDefault('wpsg_mod_paypal_autostart', '0');
-			$this->shop->checkDefault('wpsg_mod_paypal_sandbox', '0');			
+			$this->shop->checkDefault('wpsg_mod_paypal_sandbox', '0');
+			$this->shop->checkDefault('wpsg_mod_paypal_email', '');
 			$this->shop->checkDefault('wpsg_mod_paypal_language', 'DE');
 			$this->shop->checkDefault('wpsg_mod_paypal_subject', 'O%order_id% - K%kunde_id%', false, true);
@@ -47,16 +48,16 @@
 		} // public function install()
 		
-		public function init() {
+		public function init() 
+		{
 			
 			spl_autoload_register(array($this, 'spl_autoload'));
 			
-			if ($this->shop->get_option('wpsg_mod_paypal_sandbox') == 1) {
-				
+			if ($this->shop->get_option('wpsg_mod_paypal_sandbox') == 1)
+			{
 				$this->url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
-				
-			} else {
-				
+			}
+			else		
+			{		
 				$this->url = "https://www.paypal.com/cgi-bin/webscr";
-				
 			}
 			
@@ -83,73 +84,61 @@
 		} // public function settings_edit()
 				
-		public function settings_save() {
- 
-			foreach($_REQUEST['wpsg_mod_paypal_stornostate'] as $k => $v) {
-				
-				if (wpsg_checkInput($v, WPSG_SANITIZE_INT)) $_REQUEST['wpsg_mod_paypal_stornostate'][$k] = intval($v);
-				else unset($_REQUEST[$k]);
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_paypal_bezeichnung', $_REQUEST['wpsg_mod_paypal_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_paypal_aktiv', $_REQUEST['wpsg_mod_paypal_aktiv']);
+			$this->shop->update_option('wpsg_mod_paypal_hint', $_REQUEST['wpsg_mod_paypal_hint']);
+			$this->shop->update_option('wpsg_mod_paypal_gebuehr', wpsg_tf($_REQUEST['wpsg_mod_paypal_gebuehr'], true));
+			$this->shop->update_option('wpsg_mod_paypal_mwst', $_REQUEST['wpsg_mod_paypal_mwst']);
+			
+			// Vor dem CreateWebHook
+			$this->shop->update_option('wpsg_mod_paypal_sandbox', $_REQUEST['wpsg_mod_paypal_sandbox']);
+			
+			$this->shop->update_option('wpsg_mod_paypal_mode', $_REQUEST['wpsg_mod_paypal_mode']);
+			
+			// Classic API
+			$this->shop->update_option('wpsg_mod_paypal_email', $_REQUEST['wpsg_mod_paypal_email']);
+			
+			// Rest API
+			$this->shop->update_option('wpsg_mod_paypal_clientid', $_REQUEST['wpsg_mod_paypal_clientid']);
+			$this->shop->update_option('wpsg_mod_paypal_secret', $_REQUEST['wpsg_mod_paypal_secret']);
+			
+			if (wpsg_isSizedInt($_REQUEST['wpsg_mod_paypal_createwebhook']))
+			{
+				
+				$this->createWebHook();
 				
 			}
 			
 			$this->shop->update_option('wpsg_mod_paypal_stornostate', $_REQUEST['wpsg_mod_paypal_stornostate']);
-
-			$this->shop->update_option('wpsg_mod_paypal_bezeichnung', $_REQUEST['wpsg_mod_paypal_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypal_aktiv', $_REQUEST['wpsg_mod_paypal_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypal_hint', $_REQUEST['wpsg_mod_paypal_hint'], false, false, WPSG_SANITIZE_TEXTAREA);
-			$this->shop->update_option('wpsg_mod_paypal_gebuehr', $_REQUEST['wpsg_mod_paypal_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_paypal_mwst', $_REQUEST['wpsg_mod_paypal_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			
-			// Vor dem CreateWebHook
-			$this->shop->update_option('wpsg_mod_paypal_sandbox', $_REQUEST['wpsg_mod_paypal_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-									
-			// Rest API
-			$this->shop->update_option('wpsg_mod_paypal_clientid', $_REQUEST['wpsg_mod_paypal_clientid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypal_secret', $_REQUEST['wpsg_mod_paypal_secret'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			if (wpsg_isSizedInt($_REQUEST['wpsg_mod_paypal_createwebhook'])) {
-				
-				$this->createWebHook();
-				
-			}
-			
-			$this->shop->update_option('wpsg_mod_paypal_subject', $_REQUEST['wpsg_mod_paypal_subject'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypal_invoicenumber', $_REQUEST['wpsg_mod_paypal_invoicenumber'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_paypal_hint', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_paypal_hint']) ?: $this->shop->get_option('wpsg_mod_paypal_hint'));
-			
-			$this->shop->update_option('wpsg_mod_paypal_currency', $_REQUEST['wpsg_mod_paypal_currency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypal_autostart', $_REQUEST['wpsg_mod_paypal_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypal_mwstland', $_REQUEST['wpsg_mod_paypal_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypal_language', $_REQUEST['wpsg_mod_paypal_language'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->createPage(__('Erfolgreiche PayPal Zahlung', 'wpsg'), 'wpsg_page_mod_paypal_success', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_page_mod_paypal_success']));
-			$this->shop->createPage(__('Fehlgeschlagene PayPal Zahlung', 'wpsg'), 'wpsg_page_mod_paypal_error', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_page_mod_paypal_error']));
-			
-			$this->shop->addTranslationString('mod_paypal_bezeichnung', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['mod_paypal_bezeichnung']) ?: $this->shop->get_option('mod_paypal_bezeichnung'));
-			$this->shop->addTranslationString('wpsg_mod_paypal_hint', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_paypal_hint']) ?: $this->shop->get_option('wpsg_mod_paypal_hint'));
+			
+			$this->shop->update_option('wpsg_mod_paypal_subject', $_REQUEST['wpsg_mod_paypal_subject']);
+			$this->shop->addTranslationString('wpsg_mod_paypal_hint', $_REQUEST['wpsg_mod_paypal_hint']);
+			
+			$this->shop->update_option('wpsg_mod_paypal_currency', $_REQUEST['wpsg_mod_paypal_currency']);
+			$this->shop->update_option('wpsg_mod_paypal_autostart', $_REQUEST['wpsg_mod_paypal_autostart']);			
+			$this->shop->update_option('wpsg_mod_paypal_mwstland', $_REQUEST['wpsg_mod_paypal_mwstland']);
+			$this->shop->update_option('wpsg_mod_paypal_language', $_REQUEST['wpsg_mod_paypal_language']);
+			
+			$this->shop->createPage(__('Erfolgreiche PayPal Zahlung', 'wpsg'), 'wpsg_page_mod_paypal_success', $_REQUEST['wpsg_page_mod_paypal_success']);
+			$this->shop->createPage(__('Fehlgeschlagene PayPal Zahlung', 'wpsg'), 'wpsg_page_mod_paypal_error', $_REQUEST['wpsg_page_mod_paypal_error']);
+			
+			$this->shop->addTranslationString('mod_paypal_bezeichnung', $_REQUEST['mod_paypal_bezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_paypal_hint', $_REQUEST['wpsg_mod_paypal_hint']);
 			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_paypal_success'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_paypal_error'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function order_ajax() {
-					
-			if (wpsg_isSizedString($_REQUEST['do'], 'refresh')) {
-				
-				wpsg_checkNounce('Order', 'view', ['action' => 'ajax', 'edit_id' => wpsg_getInt($_REQUEST['edit_id']), 'do' => 'refresh', 'mod' => 'wpsg_mod_paypal']);
-				
-				if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException(); else $order_id = intval($_REQUEST['edit_id']);
-				 
-				$state = $this->getPaymentState($order_id);
+				
+		public function order_ajax()
+		{
+				
+			if (wpsg_isSizedString($_REQUEST['do'], 'refresh'))
+			{
+		
+				$state = $this->getPaymentState($_REQUEST['edit_id']);
 		
 				$this->shop->addBackendMessage(wpsg_translate(__('Status der Zahlung (#1#) erfolgreich abgefragt.', 'wpsg'), $state));
-				
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $order_id])
-				);
+		
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
 		
 			}
@@ -157,69 +146,132 @@
 		} // public function order_ajax()
 		
-		public function systemcheck(&$arData) {
-			
-			if ($this->shop->get_option('wpsg_mod_paypal_aktiv') === '1') {
-			
-				$arPflicht = $this->shop->loadPflichtFeldDaten();
-				
-				if (!isset($arPflicht['plz']) || $arPflicht['plz'] !== '0') {
-					
-					$arData[] = array(
-						'wpsg_mod_paypal_zip',
-						wpsg_ShopController::CHECK_WARNING,
+		public function checkGeneralBackendError()
+		{
+
+			if ($this->shop->get_option('wpsg_mod_paypal_mode') == '1')
+			{
+				
+				if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypal_clientid')) && !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypal_secret')))
+				{
+					
+					$this->shop->addBackendError('nohspc_'.wpsg_translate(
 						wpsg_translate(
-							__('Bei verwendung von PayPal als Zahlungsart sollte die PLZ ein Pflichtfeld sein, damit die API funktioniert. <a href="#1#">hier</a> konfigurieren.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten'
-						)
-					);
-					
-				}
-				
-				if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypal_clientid')) && !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypal_secret'))) {
-					
-					$arData[] = array(
-						'wpsg_mod_paypal_apidata',
-						wpsg_ShopController::CHECK_ERROR,
-						wpsg_translate(
-							__('Das Modul "PayPal" ist aktiviert und es wurden keine API Zugangsdaten hinterlegt. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um die API Daten zu hinterlegen.', 'wpsg'),
+							__('Das Modul "PayPal" ist aktiviert und es wurden keine API Zugangsdatenhinterlegt. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um die API Daten zu hinterlegen.', 'wpsg'),
 							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_paypal'
 						)
-					); 
-					
-				}
-				
-				if ($this->shop->get_option('wpsg_currency') !== 'EUR') {
-					
-					$arData[] = array(
-						'wpsg_mod_paypal_currency',
-						wpsg_ShopController::CHECK_ERROR,
+					));
+					
+				}
+				
+			}
+			else
+			{
+			
+				if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypal_email')) && wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypal_aktiv')))
+				{
+					
+					$this->shop->addBackendError('nohspc_'.wpsg_translate(
 						wpsg_translate(
-							__('Der WÃ€hrungscode sollte bei der Verwendung mit PayPal auf "EUR" stehen. Gehen Sie in die <a href="#1#">Einstellungen</a> um dies zu korrigieren.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein'
+							__('Das Modul "PayPal" ist aktiviert und es wurde kein PayPal Konto fÃŒr Zahlungen hinterlegt. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um das PayPal Konto anzugeben.', 'wpsg'),
+							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_paypal'
 						)
-					);
-					
-				}
-				
-			}
-			
-		}
-		 
-		public function addPayment(&$arPayment) { 
+					));
+					
+				}
+				
+			}
+			
+		} // public function checkGeneralBackendError()
+		
+		public function addPayment(&$arPayment) 
+		{ 
 			
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_paypal_aktiv') != '1') return;
 			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_paypal_mwst'), $this->shop->getDefaultCountry());
+						
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
 				'name' => __($this->shop->get_option('wpsg_mod_paypal_bezeichnung'), 'wpsg'),
-				'price' => $this->shop->get_option('wpsg_mod_paypal_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_paypal_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_paypal_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_paypal_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_paypal_mwstland'),
 				'hint' => __($this->shop->get_option('wpsg_mod_paypal_hint')),
-				'logo' => $this->shop->getRessourceURL('mods/mod_paypal/gfx/logo_100x25.png')
+				'logo' => $this->shop->getRessourceURL('gfx/paypal.png')
 			);
-			 			
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_paypal_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_paypal_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			 
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_paypal_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_paypal_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_paypal_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket) 
+		
 		public function setOrderStatus($order_id, $status_id, $inform)
 		{
@@ -258,24 +310,41 @@
 		} // public function order_view_sidebar(&$order_id)
 		
-		public function order_done(&$order_id, &$done_view)  { 
+		public function order_done(&$order_id, &$done_view) 
+		{ 
  
 			// Bestellungen mit 0 geben nix aus
-			if ($done_view['basket']['arCalculation']['sum']['topay_brutto'] <= 0 || $this->shop->view['basket']['checkout']['payment'] != $this->id) return;
-							
-            if ($this->getPaymentState($order_id) === 'approved') {
-                    
-                $this->shop->view['wpsg_mod_paypal']['done'] = '1';
-            
-            } else {
-                    
-                $this->shop->view['paypalLink'] = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypal', 'startPayPalPayment', array('order_id' => $order_id));
-                                
-            }
-            			
+			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0 || $this->shop->view['basket']['checkout']['payment'] != $this->id) return;
+			
+			if ($this->shop->get_option('wpsg_mod_paypal_mode') === '1')
+			{
+				
+				$oOrder = wpsg_order::getInstance($order_id);
+				
+				if ($this->getPaymentState($order_id) === 'approved')
+				{
+						
+					$this->shop->view['wpsg_mod_paypal']['done'] = '1';
+				
+				}
+				else
+				{
+						
+					$this->shop->view['paypalLink'] = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypal', 'startPayPalPayment', array('order_id' => $order_id));
+									
+				}
+					
+			}
+			else 
+			{
+				
+				$this->shop->view['paypalLink'] = $this->getPayPalLink($order_id);
+			
+			}
+			
 			echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypal/order_done.phtml', false);
 						
 		} // public function order_done(&$order_id)
 
-		public function template_redirect() { 
+		public function wp_loaded() { 
 			
 			if (wpsg_isSizedString($_REQUEST['wpsg_plugin'], 'wpsg_mod_paypal') && wpsg_isSizedString($_REQUEST['confirm'], 'pp'))			
@@ -346,12 +415,12 @@
 									"title" => __("PayPal VERIFIED", "wpsg"),
 									"cdate" => "NOW()",
-									"o_id" => wpsg_q(wpsg_xss($_REQUEST['custom'])),
+									"o_id" => wpsg_q($_REQUEST['custom']),
 									"mailtext" => wpsg_q(htmlentities(print_r($_REQUEST, 1), ENT_IGNORE))
 								));
 							
-								if ($this->shop->setPayMent(wpsg_xss($_REQUEST['custom']), $_REQUEST['mc_gross']))
+								if ($this->shop->setPayMent($_REQUEST['custom'], $_REQUEST['mc_gross']))
 								{
 									
-									$this->shop->setOrderStatus(wpsg_xss($_REQUEST['custom']), 100, true);
+									$this->shop->setOrderStatus($_REQUEST['custom'], 100, true);
 									
 								}
@@ -366,5 +435,5 @@
 								"title" => __("PayPal FAILED", "wpsg"),
 								"cdate" => "NOW()",
-								"o_id" => wpsg_q(wpsg_xss($_REQUEST['custom'])),
+								"o_id" => wpsg_q($_REQUEST['custom']),
 								"mailtext" => wpsg_q(wpsg_hspc(print_r($_REQUEST, 1)))
 							));
@@ -382,5 +451,5 @@
 			}
 			
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function mail_payment() 
@@ -405,5 +474,53 @@
 		
 		/* Modulfunktionen */
-				
+		
+		/* Classic API */
+		
+		/**
+		 * Gibt den Link fÃŒr die Bezahlung per PayPal anhand der BestellID zurÃŒck
+		 */
+		public function getPayPalLink($order_id)
+		{
+
+			$basket_link = get_permalink($this->shop->get_option('wpsg_page_basket'));
+			
+			if (strpos($basket_link, "?") > 0)
+			{
+				$basket_link .= "&wpsg_plugin=wpsg_mod_paypal&confirm=pp";
+			}
+			else
+			{
+				$basket_link .= "?wpsg_plugin=wpsg_mod_paypal&confirm=pp";
+			}
+
+			$order = $this->db->fetchRow("
+				SELECT
+					O.`id` AS o_id, O.`onr`,
+					K.`id` AS k_id, K.`knr`
+				FROM
+					`".WPSG_TBL_ORDER."` AS O
+						LEFT JOIN `".WPSG_TBL_KU."` AS K ON (O.`k_id` = K.`id`)
+				WHERE
+					O.`id` = '".wpsg_q($order_id)."'						
+			");
+			  
+			$strItemName = $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypal_subject'), 'wpsg'), $order_id);			
+ 		
+			$arBasket = $this->shop->basket->toArray();
+			$strSuccessURL = get_permalink($this->shop->get_option('wpsg_page_mod_paypal_success'));
+			$strErrorURL = get_permalink($this->shop->get_option('wpsg_page_mod_paypal_error'));
+			
+			return 	$this->url.
+					'?cmd=_xclick&business='.rawurlencode($this->shop->get_option('wpsg_mod_paypal_email')).
+					'&amount='.rawurlencode(wpsg_round(wpsg_tf($arBasket['sum']['preis_gesamt_brutto']), 2)).
+					'&item_name='.rawurlencode($strItemName).
+					'&return='.rawurlencode($strSuccessURL).
+					'&cancel_return='.rawurlencode($strErrorURL).
+					'&notify_url='.rawurlencode($basket_link).
+					'&currency_code='.rawurlencode($this->shop->get_option('wpsg_mod_paypal_currency')).
+					'&lc='.$this->shop->get_option('wpsg_mod_paypal_language').'&custom='.rawurlencode($order_id);
+			
+		} // public function getPayPalLink($order_id)
+		
 		/* REST API */
 		
@@ -441,18 +558,10 @@
 				if ($this->shop->setPayMent($oOrder->id, $amount) && $orderPaymentID === $payment_id && $state === 'approved')
 				{
-
-                    if (wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypal_saleid'))) {
-
-                        $oOrder->log($jsonData->summary, __('PayPal Erfolg aber Sale ID schon gesetzt: ', 'wpsg')."\r\n".print_r($jsonData, 1));
-
-                    } else {
-
-                        $this->shop->setOrderStatus($oOrder->id, 100, true);
-
-                        $oOrder->setMeta('wpsg_mod_paypal_saleid', $jsonData->resource->id);
-
-                        $oOrder->log($jsonData->summary, __('PayPal Erfolg: ', 'wpsg')."\r\n".print_r($jsonData, 1));
-
-                    }
+		
+					$this->shop->setOrderStatus($oOrder->id, 100, true);
+						
+					$oOrder->setMeta('wpsg_mod_paypal_saleid', $jsonData->resource->id);
+						
+					$oOrder->log($jsonData->summary, __('PayPal Erfolg: ', 'wpsg')."\r\n".print_r($jsonData, 1));
 		
 				}
@@ -483,10 +592,10 @@
 		{
 				
-			if (!wpsg_isSizedInt($_REQUEST['order_id'])) throw new \wpsg\Exception(__('Beim start der Zahlung wurde keine BestellID ÃŒbergeben.', 'wpsg'));
-				
-			$oOrder = wpsg_order::getInstance(wpsg_sinput("key", $_REQUEST['order_id']));
+			if (!wpsg_isSizedInt($_REQUEST['order_id'])) $this->shop->throwErrorCode('2_1');
+				
+			$oOrder = wpsg_order::getInstance($_REQUEST['order_id']);
 			$paymentId = $oOrder->getMeta('wpsg_mod_paypal_paymentid');
 				
-			if (0&&wpsg_isSizedString($paymentId))
+			if (wpsg_isSizedString($paymentId))
 			{
 		
@@ -514,5 +623,5 @@
 				catch (Exception $ex)
 				{
-
+		
 					$data = json_decode($ex->getData(), true);
 						
@@ -525,11 +634,11 @@
 						
 					$this->shop->addFrontendError(__('PayPal Fehler, bitte Shop Betreiber kontaktieren.', 'wpsg'));
-					$this->shop->redirect(get_permalink($this->shop->get_option('wpsg_page_mod_paypal_error')));
-						
-				}
-		
-			}
-				
-			if ($this->id != $oOrder->getPaymentID()) throw new \wpsg\Exception(__('Es wurde versucht eine Zahlung zu starten zu einer Bestellung die nicht mit PayPalAPI ausgefÃŒhrt wurde', 'wpsg'));
+					$this->shop->redirect($this->shop->getDoneURL($oOrder->id));
+						
+				}
+		
+			}
+				
+			if ($this->id != $oOrder->getPaymentID()) $this->shop->throwErrorCode('2_2');
 		
 			$payer = new \PayPal\Api\Payer();
@@ -555,18 +664,5 @@
 		
 			$payer->setPayerInfo($payer_info);
-			
-			$item = new \PayPal\Api\Item();
-			$item->setName(__('Bestellbetrag', 'wpsg'));
-			$item->setCurrency($this->shop->get_option('wpsg_currency'));
-			$item->setQuantity(1);
-			$item->setPrice($oOrder->getToPay(WPSG_BRUTTO));
-			
-			$itemList = new \PayPal\Api\ItemList();
-			$itemList->setItems([$item]);
-			
-			$details = new \PayPal\Api\Details();
-			$details->setShipping($oOrder->getShippingAmount(WPSG_BRUTTO));
-			$details->setSubtotal($oOrder->getToPay(WPSG_BRUTTO) - $oOrder->getShippingAmount(WPSG_BRUTTO) - $oOrder->getPaymentAmount(WPSG_BRUTTO));
-			
+				
 			/*
 			 $arProducts = $oOrder->getOrderProducts();
@@ -610,31 +706,18 @@
 			 $details = new \PayPal\Api\Details();
 			 $details->setShipping($oOrder->getShippingAmount(WPSG_BRUTTO));
-			 $details->setSubtotal($oOrder->getToPay(WPSG_BRUTTO) - $oOrder->getShippingAmount(WPSG_BRUTTO) - $oOrder->getPaymentAmount(WPSG_BRUTTO));
+			 $details->setSubtotal($oOrder->getAmount(WPSG_BRUTTO) - $oOrder->getShippingAmount(WPSG_BRUTTO) - $oOrder->getPaymentAmount(WPSG_BRUTTO));
 			*/
-			
+				
 			$amount = new \PayPal\Api\Amount();
-			$amount->setCurrency($this->shop->get_option('wpsg_mod_paypal_currency'));
-			$amount->setTotal($oOrder->getToPay(WPSG_BRUTTO));
+			$amount->setCurrency($this->shop->get_option('wpsg_currency'));
+			$amount->setTotal($oOrder->getAmount(WPSG_BRUTTO));
 			//$amount->setDetails($details);
 				
 			$transaction = new \PayPal\Api\Transaction();
 			$transaction->setAmount($amount);
-			$transaction->setItemList($itemList);
+			//$transaction->setItemList($itemList);
 			$transaction->setDescription($this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypal_subject'), 'wpsg'), $oOrder->id));
-			
-			$wpsg_mod_paypal_invoicenumber = trim($this->shop->get_option('wpsg_mod_paypal_invoicenumber'));
-			
-			if ($wpsg_mod_paypal_invoicenumber !== '') {
-				
-				$invoice_number = $this->shop->replaceUniversalPlatzhalter($wpsg_mod_paypal_invoicenumber, $oOrder->getId());
-				
-			} else {
-				
-				$invoice_number = $oOrder->id;
-				
-			}
-			
-			$transaction->setInvoiceNumber($invoice_number);
-			
+			$transaction->setInvoiceNumber($oOrder->id);
+				
 			$redirectUrls = new \PayPal\Api\RedirectUrls();
 			$redirectUrls->setReturnUrl($this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypal', 'executePayment'));
@@ -647,5 +730,6 @@
 			$payment->setTransactions(array($transaction));
 				
-			try {
+			try
+			{
 					
 				$response = $payment->create($this->getApiContext());
@@ -653,5 +737,7 @@
 				$oOrder->setMeta('wpsg_mod_paypal_paymentid', $response->getId());
 		
-			} catch (Exception $ex) {
+			}
+			catch (Exception $ex)
+			{
 					
 				$data = json_decode($ex->getData(), true);
@@ -681,8 +767,8 @@
 		{
 		
-			$payment = \PayPal\Api\Payment::get(wpsg_sinput("key", $_REQUEST['paymentId']), $this->getApiContext());
+			$payment = \PayPal\Api\Payment::get($_REQUEST['paymentId'], $this->getApiContext());
 		
 			$execution = new \PayPal\Api\PaymentExecution();
-			$execution->setPayerId(wpsg_sinput("key", $_REQUEST['PayerID']));
+			$execution->setPayerId($_REQUEST['PayerID']);
 		
 			try
@@ -703,13 +789,13 @@
 		} // public fucntion executePaymentRedirect()
 		
-		private function getPaymentState($order_id) {
+		private function getPaymentState($order_id)
+		{
 		
 			$oOrder = wpsg_order::getInstance($order_id);
-
-			$wpsg_mod_paypal_paymentid = $oOrder->getMeta('wpsg_mod_paypal_paymentid');
-
-			if (!wpsg_isSizedString($wpsg_mod_paypal_paymentid)) return false;
-				
-			try {
+				
+			if (!wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypal_paymentid'))) return false;
+				
+			try
+			{
 					
 				$payment = \PayPal\Api\Payment::get($oOrder->getMeta('wpsg_mod_paypal_paymentid'), $this->getApiContext());
@@ -719,5 +805,7 @@
 				return $payment->getState();
 		
-			} catch (Exception $e) {
+			}
+			catch (Exception $e)
+			{
 		
 				return false;
@@ -811,11 +899,11 @@
 				
 			$oOrder = wpsg_order::getInstance($order_id);
-			if ($oOrder === false) throw new \wpsg\Exception(__('Bei einer Stornierung konnte Bestellung nicht geladen werden', 'wpsg'));
+			if ($oOrder === false) $this->shop->throwErrorCode('2_3');
 				
 			$sale_id = $oOrder->getMeta('wpsg_mod_paypal_saleid');
 		
 			$amount = new \PayPal\Api\Amount();
-			$amount->setCurrency($this->shop->get_option('wpsg_mod_paypal_currency'));
-			$amount->setTotal($oOrder->getToPay(WPSG_BRUTTO));
+			$amount->setCurrency($this->shop->get_option('wpsg_currency'));
+			$amount->setTotal($oOrder->getAmount(WPSG_BRUTTO));
 				
 			$refund = new \PayPal\Api\Refund();
@@ -839,5 +927,5 @@
 			{
 		
-				$oOrder->log(__('PayPal Fehler', 'wpsg'), $ex->getMessage());
+				$oOrder->log(wpsg_translate(__('PayPal Fehler: #1#', 'wpsg'), $ex->getMessage()));
 				return false;
 		
@@ -910,10 +998,4 @@
 				if (file_exists($path)) require_once($path);
 					
-			} else if (substr($class, 0, 4) == "Psr\\") {
-				
-				$path = WPSG_PATH_LIB.str_replace("\\", DIRECTORY_SEPARATOR, $class).'.php';
-				
-				if (file_exists($path)) require_once($path);
-				
 			}
 				
Index: /mods/wpsg_mod_paypalapi.class.php
===================================================================
--- /mods/wpsg_mod_paypalapi.class.php	(revision 8528)
+++ /mods/wpsg_mod_paypalapi.class.php	(revision 5261)
@@ -18,11 +18,9 @@
 		private $currency = "EUR";
 		
-		// Wenn true, dann keine direkte Fehlerbehandlung
-		private $api_try = false;
-		
-		/**
-		 * Costructor 
-		 */
-		public function __construct() {
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
 				
 			parent::__construct();
@@ -31,21 +29,10 @@
 			$this->group = __('Zahlungsarten', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht die Zahlungsart PayPal und PayPal PLUS, ÃŒber die REST API Schnittstelle und Login mit PayPal Express.', 'wpsg');
-			
-			require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_paypalapi'.DIRECTORY_SEPARATOR.'GiroPayPalAPI.php';
-			
+		
 		} // public function __construct()
 				
-		public function init() {
-
-            spl_autoload_register(array($this, 'spl_autoload'));
-		
-			// Wenn WÃ€hrungscode in den Einstellungen gesetzt ist dann diesen nehmen, sonst bleibt alles wie bisher bei EUR
-			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_currency'))) $this->currency = $this->shop->get_option('wpsg_mod_paypalapi_currency');
-			
-		} // public function init()
-				
-		public function install() {
-
-            $this->shop->checkDefault('wpsg_mod_paypalapi_version', 'v2');
+		public function install()
+		{
+			
 			$this->shop->checkDefault('wpsg_mod_paypalapi_aktiv', '1');
 			$this->shop->checkDefault('wpsg_mod_paypalapi_paypalexpress', '1');
@@ -54,20 +41,17 @@
 			$this->shop->checkDefault('wpsg_mod_paypalapi_paypalexpress_subject', 'O%order_id% - K%kunde_id%', false, true);
 			$this->shop->checkDefault('wpsg_mod_paypalapi_paypalexpress_details', '1');
-			$this->shop->checkDefault('wpsg_mod_paypalapi_currency', 'EUR');
 					 			
 			$this->shop->checkDefault('wpsg_mod_paypalapi_experience_label', '%shopinfo_name%', false, true);
 			$this->shop->checkDefault('wpsg_mod_paypalapi_experience_locale_code', 'DE');
 			
-			$this->shop->checkDefault('wpsg_mod_paypalapi_plus_aktiv', '1');
-			
-			$this->shop->checkDefault('wpsg_mod_paypalapi_giropay_name', 'GiroPay');
-			$this->shop->checkDefault('wpsg_mod_paypalapi_giropay_hint', 'Kommen Sie auf die sichere Seite und zahlen Sie mit GiroPay, was von vielen deutschen Banken unterstÃŒtz wird.');
-			
+			$this->shop->checkDefault('wpsg_mod_paypalapi_plus_aktiv', '1');		
+									
 			$this->shop->checkDefault('wpsg_mod_paypalapi_stornostate', array('400' => '1', '500' => '1'));
 							
 		} // public function install()
 		
-		public function settings_edit() {
-
+		public function settings_edit()
+		{
+			
 			$pages = get_pages();
 				
@@ -87,81 +71,59 @@
 		} // public function settings_edit()
 		
-		public function settings_save() {
-			
-			foreach ($_REQUEST['wpsg_mod_paypalapi_stornostate'] as $k => $v) {
-				
-				$bKeyValid = wpsg_checkInput($k, WPSG_SANITIZE_INT);
-				$bValueValid = wpsg_checkInput($v, WPSG_SANITIZE_CHECKBOX);
-				
-				if (!$bKeyValid || !$bValueValid) {
-					
-					$this->shop->addBackendError(__('Ihre Eingaben in den markierten Feldern waren ungÃŒltig, bitte ÃŒberprÃŒfen.', 'wpsg'));
-					
-					$_SESSION['sanitization_err_fields']['wpsg_mod_paypalapi_stornostate'] = 0;
-					
-				} else {
-					
-					$this->shop->update_option('wpsg_mod_paypalapi_stornostate', $_REQUEST['wpsg_mod_paypalapi_stornostate']); // Sanitized at begin of function call
-					
-				}
-				
-			}
-
-            $this->shop->update_option('wpsg_mod_paypalapi_version', $_REQUEST['wpsg_mod_paypalapi_version'], false, false, WPSG_SANITIZE_VALUES, ['v1', 'v2']);
-			$this->shop->update_option('wpsg_mod_paypalapi_clientid', $_REQUEST['wpsg_mod_paypalapi_clientid'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_paypalapi_secret', $_REQUEST['wpsg_mod_paypalapi_secret'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_paypalapi_sandbox', $_REQUEST['wpsg_mod_paypalapi_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_sandbox_clientid', $_REQUEST['wpsg_mod_paypalapi_sandbox_clientid'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_paypalapi_sandbox_secret', $_REQUEST['wpsg_mod_paypalapi_sandbox_secret'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_paypalapi_currency', $_REQUEST['wpsg_mod_paypalapi_currency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypalapi_webhook_log', $_REQUEST['wpsg_mod_paypalapi_webhook_log'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_webhook_logfile', $_REQUEST['wpsg_mod_paypalapi_webhook_logfile'], false, false, WPSG_SANITIZE_PATH);
-			
-			$this->shop->update_option('wpsg_mod_paypalapi_gebuehr', $_REQUEST['wpsg_mod_paypalapi_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_paypalapi_mwst', $_REQUEST['wpsg_mod_paypalapi_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_paypalapi_mwstland', $_REQUEST['wpsg_mod_paypalapi_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-						
-			$this->shop->update_option('wpsg_mod_paypalapi_aktiv', $_REQUEST['wpsg_mod_paypalapi_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress', $_REQUEST['wpsg_mod_paypalapi_paypalexpress'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_forceSSL', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_forceSSL'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_name', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypalapi_plus_hint', $_REQUEST['wpsg_mod_paypalapi_plus_hint'], false, true, WPSG_SANITIZE_TEXTAREA);
-			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_subject', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_subject'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_paypalapi_autostart', $_REQUEST['wpsg_mod_paypalapi_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_details', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_details'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_paypalapi_experience_label', $_REQUEST['wpsg_mod_paypalapi_experience_label'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypalapi_experience_logo', $_REQUEST['wpsg_mod_paypalapi_experience_logo'], false, false, WPSG_SANITIZE_URL);
-			$this->shop->update_option('wpsg_mod_paypalapi_experience_locale_code', $_REQUEST['wpsg_mod_paypalapi_experience_locale_code'], false, false, WPSG_SANITIZE_VALUES, ['DE', 'GB', 'FR']);
-
-			$this->shop->update_option('wpsg_mod_paypalapi_giropay_aktiv', $_REQUEST['wpsg_mod_paypalapi_giropay_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_giropay_name', $_REQUEST['wpsg_mod_paypalapi_giropay_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypalapi_giropay_hint', $_REQUEST['wpsg_mod_paypalapi_giropay_hint'], false, false, WPSG_SANITIZE_TEXTAREA);
-			
-			$this->shop->update_option('wpsg_mod_paypalapi_plus_aktiv', $_REQUEST['wpsg_mod_paypalapi_plus_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_paypalapi_plus_basket', $_REQUEST['wpsg_mod_paypalapi_plus_basket'], false, false, WPSG_SANITIZE_CHECKBOX);
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_paypalapi_clientid', $_REQUEST['wpsg_mod_paypalapi_clientid']);
+			$this->shop->update_option('wpsg_mod_paypalapi_secret', $_REQUEST['wpsg_mod_paypalapi_secret']);
+			$this->shop->update_option('wpsg_mod_paypalapi_sandbox', $_REQUEST['wpsg_mod_paypalapi_sandbox']);
+			$this->shop->update_option('wpsg_mod_paypalapi_sandbox_clientid', $_REQUEST['wpsg_mod_paypalapi_sandbox_clientid']);
+			$this->shop->update_option('wpsg_mod_paypalapi_sandbox_secret', $_REQUEST['wpsg_mod_paypalapi_sandbox_secret']);
+			$this->shop->update_option('wpsg_mod_paypalapi_webhook_log', $_REQUEST['wpsg_mod_paypalapi_webhook_log']);
+			$this->shop->update_option('wpsg_mod_paypalapi_webhook_logfile', $_REQUEST['wpsg_mod_paypalapi_webhook_logfile']);
+			
+			$this->shop->update_option('wpsg_mod_paypalapi_gebuehr', $_REQUEST['wpsg_mod_paypalapi_gebuehr']);
+			$this->shop->update_option('wpsg_mod_paypalapi_mwst', $_REQUEST['wpsg_mod_paypalapi_mwst']);
+			$this->shop->update_option('wpsg_mod_paypalapi_mwstland', $_REQUEST['wpsg_mod_paypalapi_mwstland']);
+			
+			$this->shop->update_option('wpsg_mod_paypalapi_stornostate', $_REQUEST['wpsg_mod_paypalapi_stornostate']);
+			
+			$this->shop->update_option('wpsg_mod_paypalapi_aktiv', $_REQUEST['wpsg_mod_paypalapi_aktiv']);
+			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress', $_REQUEST['wpsg_mod_paypalapi_paypalexpress']);
+			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_name', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_name'], false, true);
+			$this->shop->update_option('wpsg_mod_paypalapi_plus_hint', $_REQUEST['wpsg_mod_paypalapi_plus_hint'], false, true);
+			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_subject', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_subject']);
+			$this->shop->update_option('wpsg_mod_paypalapi_paypalexpress_details', $_REQUEST['wpsg_mod_paypalapi_paypalexpress_details']);
+			
+			$this->shop->update_option('wpsg_mod_paypalapi_experience_label', $_REQUEST['wpsg_mod_paypalapi_experience_label'], false, true);
+			$this->shop->update_option('wpsg_mod_paypalapi_experience_logo', $_REQUEST['wpsg_mod_paypalapi_experience_logo']);
+			$this->shop->update_option('wpsg_mod_paypalapi_experience_locale_code', $_REQUEST['wpsg_mod_paypalapi_experience_locale_code']);
+			
+			$this->shop->createPage(__('Erfolgreiche PayPal Zahlung', 'wpsg'), 'wpsg_page_mod_paypalapi_success', $_REQUEST['wpsg_page_mod_paypalapi_success']);
+			$this->shop->createPage(__('Fehlgeschlagene PayPal Zahlung', 'wpsg'), 'wpsg_page_mod_paypalapi_error', $_REQUEST['wpsg_page_mod_paypalapi_error']);
+						
+			$this->shop->update_option('wpsg_mod_paypalapi_plus_aktiv', $_REQUEST['wpsg_mod_paypalapi_plus_aktiv']);		
 			
 			// WebHook
 			if (wpsg_isSizedInt($_REQUEST['wpsg_mod_paypalapi_create'])) $this->createWebHook();
-
+			
 			// PaymentExperience
-			if (wpsg_isSizedString($_REQUEST['wpsg_mod_paypalapi_clientid']) && wpsg_isSizedString($_REQUEST['wpsg_mod_paypalapi_secret'])) {
+			if (wpsg_isSizedString($_REQUEST['wpsg_mod_paypalapi_clientid']) && wpsg_isSizedString($_REQUEST['wpsg_mod_paypalapi_secret']))
+			{
 				
 				$json_data = $this->api_getWebExperience();
-				 
 				$paymentExperienceID = false;
 				
 				foreach ($json_data as $p) if ($p['name'] == 'wpShopGermany') $paymentExperienceID = $p['id'];
 				
-				if ($paymentExperienceID === false) {
+				if ($paymentExperienceID === false)
+				{
 					
 					// PaymentExperience existiert nicht => anlegen
 					$json_data = $this->api_createWebExperience();
 				
-					$this->shop->update_option('wpsg_mod_paypalapi_paymentExperience', $json_data['id'], false, WPSG_SANITIZE_TEXTFIELD);
-					
-				} else
+					$this->shop->update_option('wpsg_mod_paypalapi_paymentExperience', $json_data['id']);
+					
+				}
+				else
 				{
 				
@@ -176,127 +138,24 @@
 		} // public function settings_save()
 		
-		public function systemcheck(&$arData) {
-			
-			if ($this->shop->get_option('wpsg_mod_paypalapi_aktiv') === '1') {
-				
-				$arPflicht = $this->shop->loadPflichtFeldDaten();
-				
-				if (!isset($arPflicht['plz']) || $arPflicht['plz'] !== '0') {
-					
-					$arData[] = array(
-						'wpsg_mod_paypal_zip',
-						wpsg_ShopController::CHECK_WARNING,
-						wpsg_translate(
-							__('Bei verwendung von PayPal als Zahlungsart sollte die PLZ ein Pflichtfeld sein, damit die API funktioniert. <a href="#1#">hier</a> konfigurieren.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten'
-						)
-					);
-					
-				}
-
-				$nProductWithoutAnr = intval($this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS."` WHERE `anr` = '' AND `deleted` != '1' AND `lang_parent` = '0' "));
-				
-				if ($nProductWithoutAnr > 0 && $this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_details')) {
-					
-					$arData[] = array(
-						'wpsg_mod_paypal_apidata',
-						wpsg_ShopController::CHECK_ERROR,
-						wpsg_translate(
-							__('Es wurden #1# Produkt(e) ohne Artikelnummer gefunden. PayPal PLUS erfordert mit der Option "Warenkorbdetails ÃŒbertragen" Artikelnummern.', 'wpsg'),
-							$nProductWithoutAnr
-						)
-					);
-					
-				}
-				
-				if ($this->shop->get_option('wpsg_mod_paypalapi_sandbox') === '1') {
-					
-					if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid')) && !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_sandbox_secret'))) {
-						
-						$arData[] = array(
-							'wpsg_mod_paypal_apidata',
-							wpsg_ShopController::CHECK_ERROR,
-							wpsg_translate(
-								__('Das Modul "PayPal Plus" ist aktiviert und es wurden keine API Zugangsdaten hinterlegt (Sandbox). Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um die API Daten zu hinterlegen.', 'wpsg'),
-								WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_paypalapi'
-							)
-						);
-						
-					}
-					
-				} else {
-				
-					if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_clientid')) && !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_secret'))) {
-						
-						$arData[] = array(
-							'wpsg_mod_paypal_apidata',
-							wpsg_ShopController::CHECK_ERROR,
-							wpsg_translate(
-								__('Das Modul "PayPal Plus" ist aktiviert und es wurden keine API Zugangsdaten hinterlegt. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um die API Daten zu hinterlegen.', 'wpsg'),
-								WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_paypalapi'
-							)
-						);
-						
-					}
-					
-				}
-				
-				if ($this->shop->get_option('wpsg_mod_paypalapi_currency') !== 'EUR') {
-					
-					$arData[] = array(
-						'wpsg_mod_paypal_currency',
-						wpsg_ShopController::CHECK_ERROR,
-						wpsg_translate(
-							__('Der WÃ€hrungscode sollte bei der Verwendung mit PayPal auf "EUR" stehen. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um dies zu korrigieren.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_paypalapi'
-						)
-					);
-					
-				}
-				
-			}
-			
-		}
-		
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_paypalapi_success'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_paypalapi_error'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function setOrderStatus($order_id, $status_id, $inform) {
+		public function setOrderStatus($order_id, $status_id, $inform)
+		{
 		
 			$oOrder = wpsg_order::getInstance($order_id);
 			
-			if ($oOrder->getPaymentID() == $this->id) {
+			if ($oOrder->getPaymentID() == $this->id)
+			{
 				
 				$arStornoState = (array)$this->shop->get_option('wpsg_mod_paypalapi_stornostate');
 			
-				if (array_key_exists($status_id, $arStornoState) && $arStornoState[$status_id] == '1') {
-					
-					if (wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypalapi_saleid'))) {
-
-                        $state = $this->getState($order_id);
-
-                        if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v2') {
-
-                            if ($state[1] === 'COMPLETED') {
-
-                                $bStorno = $this->stornoOrder($order_id);
-
-                                if ($bStorno === true) $this->shop->addBackendMessage(__('Zahlung erfolgreich ÃŒber die PayPal API storniert.', 'wpsg'));
-                                else $this->shop->addBackendError(__('Es gab ein Problem bei der Stornierung der Zahlung ÃŒber die PayPal API. Bitte Bestellprotokoll beachten.', 'wpsg'));
-
-                            } else $this->shop->addBackendError(__('PayPal RÃŒckzahlung nicht mÃ¶glich.'));
-
-                        } else {
-
-                            $bStorno = $this->stornoOrder($order_id);
-
-                            if ($bStorno === true) $this->shop->addBackendMessage(__('Zahlung erfolgreich ÃŒber die PayPal API storniert.', 'wpsg'));
-                            else $this->shop->addBackendError(__('Es gab ein Problem bei der Stornierung der Zahlung ÃŒber die PayPal API. Bitte Bestellprotokoll beachten.', 'wpsg'));
-
-                        }
+				if (array_key_exists($status_id, $arStornoState) && $arStornoState[$status_id] == '1')
+				{
+					
+					if (wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypalapi_saleid')))
+					{
+					
+						$bStorno = $this->stornoOrder($order_id);
+						
+						if ($bStorno === true) $this->shop->addBackendMessage(__('Zahlung erfolgreich ÃŒber die PayPal API storniert.', 'wpsg'));
+						else $this->shop->addBackendError(__('Es gab ein Problem bei der Stornierung der Zahlung ÃŒber die PayPal API. Bitte Bestellprotokoll beachten.', 'wpsg'));
 						
 					}
@@ -308,53 +167,100 @@
 		}
 				
-		public function addPayment(&$arPayment) {
- 		
-			if (is_admin() || $this->shop->get_option('wpsg_mod_paypalapi_aktiv') == '1') { 
-
+		public function addPayment(&$arPayment)
+		{
+ 					
+			if (is_admin() || $this->shop->get_option('wpsg_mod_paypalapi_aktiv') == '1')
+			{
+					
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_paypalapi_mwst'), $this->shop->getDefaultCountry());
+			
 				$arPayment[$this->id] = array(
 					'id' => $this->id,
 					'name' => __($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_paypalapi_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_paypalapi_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_paypalapi_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_paypalapi_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_paypalapi_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_paypalapi_plus_hint'), 'wpsg'),
-					'logo' => $this->shop->getRessourceURL('mods/mod_paypalapi/gfx/logo_100x25.png')
+					'logo' => $this->shop->getRessourceURL('gfx/paypal.png')
 				);
 			
-			}
-			
-			// Vorsicht PayPal und Zahlvarianten teilen sich die ID, daher darf es nie 10_1 oder so etwas geben!
-			
-			/*
-			if (is_admin() || $this->shop->get_option('wpsg_mod_paypalapi_giropay_aktiv') === '1') {
-				
-				$arPayment[$this->id.'_1'] = array(
-					'id' => $this->id.'_1',
-					'name' => __($this->shop->get_option('wpsg_mod_paypalapi_giropay_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_paypalapi_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_paypalapi_mwst'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_paypalapi_mwstland'),
-					'hint' => __($this->shop->get_option('wpsg_mod_paypalapi_giropay_hint'), 'wpsg').'<br /><br /><div id="giropay-container"></div>',
-					'logo' => $this->shop->getRessourceURL('mods/mod_paypalapi/gfx/giropay.svg')
-				);
-				
-			}
-			*/
+				if (isset($_REQUEST['wpsg_checkout2']))
+				{
+			
+					$arBasket = $this->shop->basket->toArray();
+			
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+					{
+			
+						$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_paypalapi_gebuehr'), $arBasket['sum']['preis']);
+						$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+			
+					}
+					else
+					{
+			
+						$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_paypalapi_gebuehr'), $arBasket['sum']['preis']);
+						$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);
+			
+					}
+			
+					// Entsprechenden Preis anzeigen
+					if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+					{
+							
+						$arPayment[$this->id]['price'] = $payment_netto;
+							
+					}
+					else
+					{
+							
+						$arPayment[$this->id]['price'] = $payment_brutto;
+							
+					}
+			
+				}
+			
+			}
 			
 		} // public function addPayment(&$arPayment)
-		
-		public function checkout2_inner_prebutton(&$checkout_view): void {
-			
-			$this->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/checkout2_inner_prebutton.phtml');
-			
-		}
-		
-		public function checkout_handlePayment() {
-		
-			// Wenn 0,- dann nix machen
-			$arBasket = $this->shop->basket->toArray();
-			if ($arBasket['arCalculation']['sum']['topay_brutto'] <= 0) return false;
-			
-			// Wenn PayPal nicht drin ist, dann nichts machen
+				
+		public function calcPayment(&$arBasket)
+		{
+				
+			if ($this->id == $arBasket['checkout']['payment'])
+			{
+		
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_paypalapi_gebuehr'), $arBasket['sum']['preis']);
+		
+				if ($this->shop->get_option('wpsg_mod_paypalapi_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+						
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+						
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+		
+					$arBasket['payment']['tax_rata'] = false;
+						
+				}
+				else
+				{
+						
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_paypalapi_mwstland'));
+		
+				}
+		
+			}
+				
+		} // public function calcPayment(&$arBasket)
+				
+		public function checkout_handlePayment()
+		{
+				
 			if (!array_key_exists($this->id, $this->shop->arPayment)) return false;
 			
@@ -363,5 +269,6 @@
 			// Wenn eine andere Zahlungsart als PayPal gewÃ€hlt wurde und Zahlungskosten entstanden sind,
 			// dann lÃ¶sche ich die Zahlung und lasse neu wÃ€hlen			
-			if ($this->id != $_SESSION['wpsg']['checkout']['payment'] && isset($this->shop->view['basket']['sum']['preis_payment'])  && $this->shop->view['basket']['sum']['preis_payment'] != 0) {
+			if ($this->id != $_SESSION['wpsg']['checkout']['payment'] && isset($this->shop->view['basket']['sum']['preis_payment'])  && $this->shop->view['basket']['sum']['preis_payment'] != 0)
+			{
 			
 				unset($_SESSION['wpsg']['checkout']['payment']);
@@ -373,9 +280,12 @@
 						
 			// Zahlung ÃŒber kompletten Betrag schon vorbereitet
-			if (isset($_SESSION['wpsg']['checkout']['payment_amount']) && $_SESSION['wpsg']['checkout']['payment'] == $this->id) {
-				
-				if (wpsg_tf($_SESSION['wpsg']['checkout']['payment_amount']) == $this->shop->view['basket']['sum']['preis_gesamt_brutto']) {
-					
-					if ($this->shop->hasMod('wpsg_mod_willcollect')) {
+			if (isset($_SESSION['wpsg']['checkout']['payment_amount']) && $_SESSION['wpsg']['checkout']['payment'] == $this->id)
+			{
+				
+				if (wpsg_tf($_SESSION['wpsg']['checkout']['payment_amount']) == $this->shop->view['basket']['sum']['preis_gesamt_brutto'])
+				{
+					
+					if ($this->shop->hasMod('wpsg_mod_willcollect'))
+					{
 							
 						$arCheckout = array(
@@ -387,5 +297,6 @@
 						$this->shop->callMod('wpsg_mod_willcollect', 'checkCheckout', array(&$step, &$error, &$arCheckout));
 					
-						if ($error === true) {
+						if ($error === true)
+						{
 							
 							$this->shop->view['wpsg_mod_paypalapi']['error'] = __('Die Zahlungsart PayPal ist leider nicht mit der Versandart "Selbstabholung" mÃ¶glich. Ihre Zahlung wurde storniert und ihr Konto nicht belastet. Bitte wÃ€hlen Sie eine andere Zahlungsart aus.', 'wpsg');
@@ -394,11 +305,9 @@
 							$this->shop->view['wpsg_mod_paypalapi']['show'] = 3;
 								
-						} else {
-
-							$this->shop->view['wpsg_mod_paypalapi']['show'] = 1;
-
 						}
 					
-					} else {
+					}
+					else
+					{
 					
 						$this->shop->view['wpsg_mod_paypalapi']['show'] = 1;
@@ -406,12 +315,17 @@
 					}
 					
-				} else {
-			
-					if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_plus_aktiv'))) {
-						 
+				}
+				else
+				{
+			
+					if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_plus_aktiv')))
+					{
+						
 						$this->setViewForPayPalPLus();						
 						$this->shop->view['wpsg_mod_paypalapi']['show'] = 3;
 						
-					} else {
+					}
+					else
+					{
 					
 						$this->shop->view['wpsg_mod_paypalapi']['show'] = 2;
@@ -424,12 +338,17 @@
 				}
 				
-			} else {
-				
-				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_plus_aktiv'))) {
-				
+			}
+			else  
+			{
+				
+				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_plus_aktiv')))
+				{
+						
 					$this->setViewForPayPalPLus();
 					$this->shop->view['wpsg_mod_paypalapi']['show'] = 3;
 						
-				} else {
+				}
+				else
+				{
 					
 					return false;
@@ -439,7 +358,8 @@
 			}
 			
-			if (isset($_SESSION['wpsg']['checkout']['payment']) && $_SESSION['wpsg']['checkout']['payment'] != '10') { 
-			
-				$this->shop->view['wpsg_mod_paypalapi']['error'] = __('Sie hatten eventuell bereits eine Zahlungsart gewÃ€hlt. Aufgrund technischer EinschrÃ€nkungen kann es sein, dass diese Auswahl hier erneut durchgefÃŒhrt werden muss.', 'wpsg');
+			if (isset($_SESSION['wpsg']['checkout']['payment']) && $_SESSION['wpsg']['checkout']['payment'] != '10') 
+			{ 
+			
+				$this->shop->view['wpsg_mod_paypalapi']['error'] = __('Sie hatten bereits eine Zahlungsart gewÃ€hlt. Aufgrund technischer EinschrÃ€nkungen muss diese Auswahl hier erneut durchgefÃŒhrt werden.', 'wpsg');
 				
 			}
@@ -447,5 +367,5 @@
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/checkout_handlePayment.phtml');
 			
-			return -2;
+			return '-2';
 							 			
 		} // public function checkout_handlePayment() 
@@ -472,47 +392,27 @@
 		} // public function mail_payment()
 		
-		public function order_ajax() {
-
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException(); else $order_id = $_REQUEST['edit_id'];
- 			if (!wpsg_checkInput($_REQUEST['do'], WPSG_SANITIZE_VALUES, ['refund', 'refresh'])) throw \wpsg\Exception::getSanitizeException(); else $do = $_REQUEST['do'];
-
-            $oOrder = wpsg_order::getInstance(intval($order_id));
-
-			if ($do === 'refund') {
-			
-				$bStorno = $this->stornoOrder($order_id);
+		public function order_ajax()
+		{
+			
+			if (wpsg_isSizedString($_REQUEST['do'], 'refund'))
+			{
+			
+				$bStorno = $this->stornoOrder($_REQUEST['edit_id']);
 				
 				if ($bStorno === true) $this->shop->addBackendMessage(__('Zahlung erfolgreich ÃŒber die PayPal API storniert.', 'wpsg'));
 				else $this->shop->addBackendError(__('Es gab ein Problem bei der Stornierung der Zahlung ÃŒber die PayPal API. Bitte Bestellprotokoll beachten.', 'wpsg'));
 				
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $order_id])
-				);
-			
-			} else if ($do === 'refresh') {
-
-			    try {
-
-			        $state = $this->getState($order_id);
-
-                } catch (\Exception $e) { }
- 
-				if (is_array($state)) {
-
-                    list($payment_state, $sale_state, $result) = $state;
-
-                    $oOrder->addLogEntry('PayPal Status', print_r($result, true));
-
-                    $this->shop->addBackendMessage(wpsg_translate(__('Status der Zahlung (#1#) erfolgreich abgefragt.', 'wpsg'), $payment_state.'/'.$sale_state));
-
-                } else {
-
-                    $this->shop->addBackendError(__('Status der Zahlung konnte nicht abgefragt werden.', 'wpsg'));
-					
-                }
-				
-				$this->shop->redirect(
-					wpsg_admin_url('Order', 'view', ['edit_id' => $order_id])
-				);
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
+			
+			}
+			else if (wpsg_isSizedString($_REQUEST['do'], 'refresh'))
+			{
+				
+				list($payment_state, $sale_state) = $this->getState($_REQUEST['edit_id']);
+				
+				if (!wpsg_isSizedString($payment_state)) $this->shop->addBackendError(__('Status der Zahlung konnte nicht abgefragt werden.', 'wpsg'));
+				else $this->shop->addBackendMessage(wpsg_translate(__('Status der Zahlung (#1#) erfolgreich abgefragt.', 'wpsg'), $payment_state.'/'.$sale_state));
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']);
 				
 			}
@@ -520,174 +420,84 @@
 		} // public function order_ajax()
 		
-		public function order_done(&$order_id, &$done_view) {
-
+		public function order_done(&$order_id, &$done_view)
+		{
+		 
+			// Bestellungen mit 0 geben nix aus
+			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
+			
 			$oOrder = wpsg_order::getInstance($order_id);
-
-			// Bestellungen mit 0 geben nix aus
-			if ($oOrder->getToPay(WPSG_BRUTTO) <= 0) return;
-
-			if ($oOrder->getPaymentID() === '10_1') {
-				
-				return;
-				
-				/*
-				$captured = $oOrder->getMeta('wpsg_mod_giropay_captured', false, 0);
-				
-				if ($captured === 0) {
-					
-					if ($this->isSandbox()) $this->shop->view['clientId'] = $this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid');
-					else $this->shop->view['clientId'] = $this->shop->get_option('wpsg_mod_paypalapi_clientid');
-					
-				}
-				
-				$this->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/order_done_giropay.phtml');
-				*/
-				
-			}
 			
 			// Bestellungen die nicht mit PayPal API beglichen werden sollen ignorieren
 			if ($oOrder->getPaymentID() != $this->id) return;
+			
+			if (wpsg_isSizedString(($oOrder->getMeta('wpsg_mod_paypalapi_paymentId'))))
+			{
+				
+				$payment_info = $this->api_getPaymentInfo($oOrder->getMeta('wpsg_mod_paypalapi_paymentId'), true);
+				
+				$amount_approved = floatval($payment_info['transactions'][0]['amount']['total']);
+				
+				//if ($amount_approved === floatval($oOrder->getAmount()) && !wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypalapi_saleid')))
+				if ($amount_approved === floatval($oOrder->getAmount()) && !wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypalapi_saleid')) && wpsg_isSizedString($payment_info['payer']['status'], 'VERIFIED'))
+				{
+					
+					$payment_info_execute = $this->api_executePayment($oOrder->getMeta('wpsg_mod_paypalapi_paymentId'), $oOrder->getMeta('wpsg_mod_paypalapi_payer_id'));
+					 
+					if (wpsg_isSizedString($payment_info_execute['transactions'][0]['related_resources'][0]['sale']['id']))
+					{
+					
+						$sale_id = $payment_info_execute['transactions'][0]['related_resources'][0]['sale']['id'];
+						$payment_info = $payment_info_execute;
+			
+						$oOrder->setMeta('wpsg_mod_paypalapi_saleid', $sale_id);
+						$oOrder->setMeta('wpsg_mod_paypalapi_salestate', $payment_info_execute['transactions'][0]['related_resources'][0]['sale']['state']);
+						$oOrder->setMeta('wpsg_mod_paypalapi_paymentstate', $payment_info['state']);
+					
+						if ($payment_info['state'] == 'approved')
+						{
+								
+							$this->shop->view['wpsg_mod_paypalapi']['done'] = '2';
+							$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/order_done.phtml');
+							
+							return;
+							
+						}
+						
+					}
+					
+				}
+												
+			}
+		 
+ 			if ($payment_info['state'] == 'approved')
+			{
+			
+				$this->shop->view['wpsg_mod_paypalapi']['done'] = '1';				
+				
+			}
+			else
+			{
+				
+				$json_data = $this->api_startPayment($done_view['basket'], $order_id);
 
-			$wpsg_mod_paypalapi_paymentid = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid');
+				$approval_url = "";
+				foreach ($json_data['links'] as $k => $l) if ($l['rel'] == 'approval_url') $approval_url = $l['href'];
+				
+				$this->shop->view['wpsg_mod_paypalapi']['approval_url'] = $approval_url;
+				$this->shop->view['wpsg_mod_paypalapi']['mode'] = (($this->isSandbox())?'sandbox':'live');
 
-			if (wpsg_isSizedString($wpsg_mod_paypalapi_paymentid)) {
-
-                if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                    $payment_info = $this->api_getPaymentInfo($wpsg_mod_paypalapi_paymentid, true);
-                    $amount_approved = floatval($payment_info['transactions'][0]['amount']['total']);
-
-                } else {
-
-                    try {
-
-                        $payment_info = $this->api_getPaymentInfo_v2($wpsg_mod_paypalapi_paymentid, true);
-                        
-                        $amount_approved = floatval($payment_info['purchase_units'][0]['amount']['value']);
-
-                    } catch (\Exception $e) {
-
-                    }
-
-                }
-
-				//if ($amount_approved === floatval($oOrder->getAmount()) && !wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypalapi_saleid')))
-				// AusfÃŒhren bei Approved und Created! Wenn der Iframe angezeigt wird, wird die alte PayMent ID verworfen!
-				
-				$wpsg_mod_paypalapi_saleid = $oOrder->getMeta('wpsg_mod_paypalapi_saleid');
-
-				if ($amount_approved === floatval($oOrder->getAmount()) && !wpsg_isSizedString($wpsg_mod_paypalapi_saleid)) {
-
-				    try {
-
-				        $payment_info_execute = $this->api_executePayment_v2($oOrder->getMeta('wpsg_mod_paypalapi_paymentid'), $oOrder->getMeta('wpsg_mod_paypalapi_payer_id'));
-
-                        if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                            if (wpsg_isSizedString($payment_info_execute['transactions'][0]['related_resources'][0]['sale']['id']))
-                            {
-
-                                $sale_id = $payment_info_execute['transactions'][0]['related_resources'][0]['sale']['id'];
-
-                                $oOrder->setMeta('wpsg_mod_paypalapi_saleid', $sale_id);
-                                $oOrder->setMeta('wpsg_mod_paypalapi_salestate', $payment_info_execute['transactions'][0]['related_resources'][0]['sale']['state']);
-                                $oOrder->setMeta('wpsg_mod_paypalapi_paymentstate', $payment_info_execute['state']);
-
-                                if ($payment_info_execute['state'] == 'approved')
-                                {
-
-                                    $this->shop->view['wpsg_mod_paypalapi']['done'] = '2';
-                                    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/order_done.phtml');
-
-                                    return;
-
-                                }
-
-                                else $payment_info = $payment_info_execute;
-
-                            }
-
-                        } else {
-
-                            if (wpsg_isSizedString($payment_info_execute['purchase_units'][0]['payments']['captures'][0]['id'])) {
-
-                                $sale_id = $payment_info_execute['purchase_units'][0]['payments']['captures'][0]['id'];
-
-                                $oOrder->setMeta('wpsg_mod_paypalapi_saleid', $sale_id);
-                                $oOrder->setMeta('wpsg_mod_paypalapi_salestate', $payment_info_execute['purchase_units'][0]['payments']['captures'][0]['status']);
-                                $oOrder->setMeta('wpsg_mod_paypalapi_paymentstate', $payment_info_execute['status']);
-
-                                if ($payment_info_execute['status'] === 'COMPLETED') {
-
-                                    $this->shop->view['wpsg_mod_paypalapi']['done'] = '2';
-                                    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/order_done.phtml');
-
-                                    return;
-
-                                }
-                                else $payment_info = $payment_info_execute;
-
-                            }
-
-                        }
-
-                    } catch (\Exception $e) {
-
-				        wpsg_debug($e->getMessage());
-				        // ...
-
-                    }
-					
-				}
-												
-			}
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                if ($payment_info['state'] == 'approved') {
-
-                    $this->shop->view['wpsg_mod_paypalapi']['done'] = '1';
-
-                } else {
-
-                    $json_data = $this->api_startPayment($done_view['basket'], $order_id);
-
-                    $approval_url = "";
-                    foreach ($json_data['links'] as $k => $l) if ($l['rel'] == 'approval_url') $approval_url = $l['href'];
-
-                    $this->shop->view['wpsg_mod_paypalapi']['approval_url'] = $approval_url;
-                    $this->shop->view['wpsg_mod_paypalapi']['mode'] = (($this->isSandbox())?'sandbox':'live');
-
-                }
-
-            } else {
-
- 			    if (isset($payment_info['status']) && $payment_info['status'] == 'COMPLETED') {
-			
-				$this->shop->view['wpsg_mod_paypalapi']['done'] = '1';				
-
-                } else {
-
-                    $json_data = $this->api_startPayment_v2($done_view['basket'], $order_id);
-
-                    $approval_url = "";
-                    foreach ($json_data['links'] as $k => $l) if ($l['rel'] == 'approve' || $l['rel'] == 'approval_url') $approval_url = $l['href'];
-
-                    $this->shop->view['wpsg_mod_paypalapi']['approval_url'] = $approval_url;
-                    $this->shop->view['wpsg_mod_paypalapi']['mode'] = (($this->isSandbox())?'sandbox':'live');
-
-                }
-
-            }
-
+			}
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/order_done.phtml');
 		
 		} // public function order_done(&$order_id)
 
-		public function order_view_afterpayment(&$order_id) {
+		public function order_view_afterpayment(&$order_id)
+		{
 			
 			$oOrder = wpsg_order::getInstance($order_id);
 			
-			if ($oOrder->getPaymentID() == $this->id || $oOrder->getPaymentID() === '10_1') {
+			if ($oOrder->getPaymentID() == $this->id)
+			{
 				 
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/order_view_afterpayment.phtml');
@@ -699,21 +509,6 @@
 		public function basket_inner_prebutton(&$basket_view) 
 		{ 
-
-			// PayPal ÃŒberhaupt mÃ¶glich
-			if (!array_key_exists($this->id, $this->shop->arPayment)) return;
-			 
-			// Bestellungen mit 0,- mÃŒssen nicht bearbeitet werden
-			if ($basket_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
-									
-			// PayPal oder PayPal Express ist deaktiviert
-			if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_aktiv')) || !wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress'))) return false;
-			
-			if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_plus_basket'))) {
-				
-				$this->setViewForPayPalPLus();
-				$this->shop->view['wpsg_mod_paypalapi']['disableContinue'] = 'wpsg_basket_submit';
-				$this->shop->view['wpsg_mod_paypalapi']['enableContinue'] = 'wpsg_basket_submit';
-				
-			}
+			
+			if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_aktiv')) || !wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress'))) return false; 
 			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/basket_inner_prebutton.phtml');
@@ -729,7 +524,7 @@
 				$oOrder = wpsg_order::getInstance($order_id);
 				
-				$oOrder->setMeta('wpsg_mod_paypalapi_paymentid', $_SESSION['wpsg']['checkout']['paymentId']);
+				$oOrder->setMeta('wpsg_mod_paypalapi_paymentId', $_SESSION['wpsg']['checkout']['paymentId']);
 				$oOrder->setMeta('wpsg_mod_paypalapi_payer_id', $_SESSION['wpsg']['checkout']['payer_id']);
-
+				
 			}
 			
@@ -747,5 +542,6 @@
 			$basketError = false;
 			
-			if ($this->shop->callMods('basket_check') == false) {
+			if ($this->shop->callMods('basket_check') == false)
+			{
 			
 				// Hier stimmt was mit den Daten im Warenkorb nicht -> ZurÃŒck zum Warenkorb leiten
@@ -756,5 +552,6 @@
 			}	
 			
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping'])) {
+			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['shipping']))
+			{
 			
 				$this->shop->addFrontendError(__('Bitte eine gÃŒltige Versandart auswÃ€hlen.', 'wpsg'));
@@ -763,5 +560,6 @@
 			}
 			
-			if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land'])) {
+			if (!wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land']))
+			{
 				
 				$this->shop->addFrontendError(__('Bitte ein Land auswÃ€hlen, damit die Versandkosten bestimmt werden kÃ¶nnen.', 'wpsg'));
@@ -770,5 +568,6 @@
 			}
 			
-			if ($this->shop->hasMod('wpsg_mod_willcollect')) {
+			if ($this->shop->hasMod('wpsg_mod_willcollect'))
+			{
 			
 				$arCheckout = array(
@@ -798,19 +597,4 @@
 		} // public function basket_submitSuccess()
 		
-		public function handle_order() {
-			
-			if (($_SESSION['wpsg']['checkout']['payment']??'') === '10_1') {
-				
-				if ($this->isSandbox()) $this->shop->view['clientId'] = $this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid');
-			 	else $this->shop->view['clientId'] = $this->shop->get_option('wpsg_mod_paypalapi_clientid');
-				
-				$this->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/overview_button.phtml');
-				
-				return -2;
-				
-			}
-			
-		}
-		
 		/* Redirects */
 		
@@ -819,30 +603,20 @@
 		 * @throws Exception
 		 */
-		public function webHookRedirect() {
-			
-			//  
-			$this->shop->addShipPay();
-			
+		public function webHookRedirect()
+		{
+						
 			$bodyReceived = file_get_contents('php://input');
 						
 			// Log BEGIN
-			if ($this->shop->get_option('wpsg_mod_paypalapi_webhook_log') == '1') {
-			 
+			if ($this->shop->get_option('wpsg_mod_paypalapi_webhook_log') == '1')
+			{
+			
+				//$log_file = '/var/home/htdocs/shop.maennchen1.de/logs/webHook.log';
 				$log_file = $this->shop->get_option('wpsg_mod_paypalapi_webhook_logfile');
 				
 				$log_JsonData = json_decode($bodyReceived, true);
-				
-				if ($log_JsonData['event_type'] === 'PAYMENT.CAPTURE.COMPLETED') {
-	
-					$log_paymentID = $log_JsonData['resource']['id'];
-					$log_orderID = intval($this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_saleid' AND `meta_value` = '".wpsg_q($log_paymentID)."' "));
-					
-				} else {
-	
-					$log_paymentID = $log_JsonData['resource']['parent_payment'];
-					$log_orderID = $this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_paymentid' AND `meta_value` = '".wpsg_q($log_paymentID)."' ");
-	
-				}
-				
+				$log_paymentID = $log_JsonData['resource']['parent_payment'];
+				$log_orderID = $this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_paymentid' AND `meta_value` = '".wpsg_q($log_paymentID)."' ");
+					
 				$strLog = date('d.m.Y H:i:s', time())."\r\nRAW:".$bodyReceived."\r\nDECODED:".print_r($log_JsonData, 1)."\r\nPAYMENT_ID:".$log_paymentID."\r\nGEFUNDENE BESTELLID:".$log_orderID."\r\n---------------\r\n\r\n";
 				file_put_contents($log_file, file_get_contents($log_file)."\r\n".$strLog);
@@ -852,73 +626,29 @@
 			
 			$jsonData = json_decode($bodyReceived, true);
-
-			if ($jsonData['event_type'] === 'PAYMENT.CAPTURE.COMPLETED') {
-
-			    $saleID = $jsonData['resource']['id'];
-			    $order_id = intval($this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_saleid' AND `meta_value` = '".wpsg_q($saleID)."' "));
-			    $amount = $jsonData['resource']['amount']['value'];
-
-            } else {
-
-                $payment_id = $jsonData['resource']['parent_payment'];
-                $amount = $jsonData['resource']['amount']['total'];
-                $order_id = $this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_paymentid' AND `meta_value` = '".wpsg_q($payment_id)."' ");
-
-            }
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            if ($oOrder === false) die(__('Keine Bestellung zu PaymentID gefunden.', 'wpsg'));
-
-            // Ich ignoriere Zahlungen die bereits extern gezahlt gemeldet wurden
-            if ($oOrder->__get('ext_payed')  === '1') exit;
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                list($payment_state, $sale_state) = $this->getState($order_id);
-                $orderPaymentID = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid');
-
-                if ($this->shop->setPayMent($oOrder->id, $amount) && $payment_state === 'approved' && $sale_state === 'completed') {
-
-                    $oOrder->log(__('PayPalAPI V1 WebHook Erfolg', 'wpsg'), print_r($jsonData, 1));
-
-//					try {
-                    
-						$this->shop->setOrderStatus($oOrder->id, 100, true);
-/*
-					} catch (\Exception $e) {
-						
-						mail("daniel@maennchen1.de", "TIERPARK Fehler:".$e->getMessage(), print_r(debug_backtrace(), true));
-						
-					}*/
-					
-                    $this->db->UpdateQuery(WPSG_TBL_ORDER, ['ext_payed' => '1'], " `id` = '".wpsg_q($oOrder->getId())."' ");
-
-                } else {
-
-                    $oOrder->log(__('PayPalAPI Abgelehnt', 'wpsg'), print_r($jsonData, 1)."\r\nOrder PaymentID:".$orderPaymentID."\r\nRequest PaymentID:".$payment_id);
-
-                }
-
-            } else if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v2') {
-
-                list($payment_state, $sale_state, $result) = $this->getState($order_id);
-                $orderPaymentID = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid');
-
-                if ($this->shop->setPayMent($oOrder->id, $amount) && $payment_state === 'COMPLETED' && $sale_state === 'COMPLETED') {
-
-                    $oOrder->log(__('PayPal Status', 'wpsg'), print_r($result, true));
-                    $oOrder->log(__('PayPalAPI V2 WebHook Erfolg', 'wpsg'), print_r($jsonData, 1));
-
-                    $this->shop->setOrderStatus($oOrder->id, 100, true);
-                    $this->db->UpdateQuery(WPSG_TBL_ORDER, ['ext_payed' => '1'], " `id` = '".wpsg_q($oOrder->getId())."' ");
-
-                } else {
-
-                    $oOrder->log(__('PayPalAPI Abgelehnt', 'wpsg'), print_r($jsonData, 1)."\r\nOrder PaymentID:".$orderPaymentID."\r\nRequest PaymentID:".$payment_id);
-
-                }
-
-            }
-
+			
+			$payment_id = $jsonData['resource']['parent_payment'];
+			$amount = $jsonData['resource']['amount']['total'];
+			$order_id = $this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_paymentid' AND `meta_value` = '".wpsg_q($payment_id)."' ");
+			
+			$oOrder = wpsg_order::getInstance($order_id);			
+			if ($oOrder === false) die(__('Keine Bestellung zu PaymentID gefunden.', 'wpsg'));
+			
+			list($payment_state, $sale_state) = $this->getState($order_id);
+			$orderPaymentID = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid');
+			
+			if ($this->shop->setPayMent($oOrder->id, $amount) && $orderPaymentID === $payment_id && $payment_state === 'approved' && $sale_state === 'completed')
+			{
+				
+				$this->shop->setOrderStatus($oOrder->id, 100, true);					 			
+				$oOrder->log(__('PayPalAPI WebHook Erfolg', 'wpsg'), print_r($jsonData, 1));
+				
+			}
+			else 
+			{
+				
+				$oOrder->log(__('PayPalAPI Abgelehnt', 'wpsg', print_r($jsonData, 1)."\r\nOrder PaymentID:".$orderPaymentID."\r\nRequest PaymentID:".$payment_id."\r\nOrder State:".$state));
+									
+			}
+			 
 			header('HTTP/1.1 200 OK'); exit(1);
 						
@@ -928,15 +658,16 @@
 		 * Wird aus dem Warenkorb bei PayPal Express aufgerufen
 		 */
-		public function startPayPalExpressRedirect() {#
-		 
+		public function startPayPalExpressRedirect()
+		{
+			 
 			//Bestellung wird im BasketController schon angelegt
 			//$order_id = $this->shop->basket->save(false);
 			$order_id = $_SESSION['wpsg']['order_id'];
 						
-			$json_data = $this->api_startPayment_v2($this->shop->basket->toArray(), $order_id);
-
+			$json_data = $this->api_startPayment($this->shop->basket->toArray(), $order_id);
+			
 			$approval_url = false;
-			foreach ($json_data['links'] as $l) { if ($l['rel'] == 'approve' || $l['rel'] == 'approval_url') $approval_url = $l['href']; }
-
+			foreach ($json_data['links'] as $l) { if ($l['rel'] == 'approval_url') $approval_url = $l['href']; }
+ 
 			$this->shop->redirect($approval_url);
 			
@@ -946,119 +677,47 @@
 		 * Wird aufgerufen wenn der Kunde von PayPal zurÃŒck zum Shop kommt
 		 */
-		public function returnPayPalExpressRedirect() {
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                $json_data = $this->api_getPaymentInfo($_REQUEST['paymentId']);
-
-            } else {
-
-                $_REQUEST['paymentId'] = sanitize_text_field($_REQUEST['token']);
-
-			    $json_data = $this->api_getPaymentInfo_v2($_REQUEST['paymentId']);
-
-            }
+		public function returnPayPalExpressRedirect()
+		{
+			
+			$json_data = $this->api_getPaymentInfo($_REQUEST['paymentId']);
 
 			$order_id = $this->db->fetchOne("SELECT `target_id` FROM `".WPSG_TBL_META."` WHERE `meta_table` = 'WPSG_TBL_ORDER' AND `meta_key` = 'wpsg_mod_paypalapi_paymentid' AND `meta_value` = '".wpsg_q($_REQUEST['paymentId'])."' ");
+			
+			if (wpsg_isSizedInt($order_id))
+			{
+				
+				$oOrder = wpsg_order::getInstance($order_id);
+				
+				if ($oOrder !== false && $oOrder->status != wpsg_ShopController::STATUS_UNVOLLSTAENDIG)
+				{
+						
+					$json_data = $this->api_executePayment($_REQUEST['paymentId'], $_REQUEST['PayerID']);
+					
+					$this->getState($oOrder->id);
+					
+					if (wpsg_isSizedString($json_data['transactions'][0]['related_resources'][0]['sale']['id'])) $oOrder->setMeta('wpsg_mod_paypalapi_saleid', $json_data['transactions'][0]['related_resources'][0]['sale']['id']);
+					
+					$this->shop->redirect($this->shop->getDoneURL($oOrder->id));
+						
+				}
 
-			if (wpsg_isSizedInt($order_id)) {
-				
-				$oOrder = wpsg_order::getInstance($order_id);
-				
-				if ($oOrder !== false && $oOrder->status != wpsg_ShopController::STATUS_UNVOLLSTAENDIG) {
-						
-					$json_data = $this->api_executePayment_v2($_REQUEST['paymentId'], $_REQUEST['PayerID']);
-					
-					$oOrder->setMeta('wpsg_mod_paypalapi_saleid', $json_data['purchase_units'][0]['payments']['captures'][0]['id']);
-					
-					$this->getState($oOrder->id);
-					
-					if (wpsg_isSizedString($json_data['transactions'][0]['related_resources'][0]['sale']['id'])) $oOrder->setMeta('wpsg_mod_paypalapi_saleid', $json_data['transactions'][0]['related_resources'][0]['sale']['id']);
-					
-					$this->shop->redirect($this->shop->getDoneURL($oOrder->id));
-						
-				}
-
-			}
-
+			}
+				
+			$execute_url = false;
+			foreach ($json_data['links'] as $l) { if ($l['rel'] == 'approval_url') $execute_url = $l['href']; }
+			
 			$_SESSION['wpsg']['checkout']['payment'] = $this->id;
-
-            // billing_address scheint es nicht mehr zu geben (Aktuell steht es aber noch in der Doku)
-            // In der Doku steht aber auch, dass shipping_address DEPRECATED ist :?
-            // Wir haben hier billing_address durch shipping_address ersetzt
-            // https://developer.paypal.com/docs/api/payments/#payment_get
-            // https://stackoverflow.com/questions/44968561/how-to-get-billing-address-in-getexpresscheckoutdetails-api-nvp
-
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['vname']) && isset($json_data['payer']['name']['given_name'])) $_SESSION['wpsg']['checkout']['vname'] = $json_data['payer']['name']['given_name'];
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['name']) && isset($json_data['payer']['name']['surname'])) $_SESSION['wpsg']['checkout']['name'] = $json_data['payer']['name']['surname'];
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['email']) && isset($json_data['payer']['email_address'])) {
-				$_SESSION['wpsg']['checkout']['email'] = $json_data['payer']['email_address'];
-				$_SESSION['wpsg']['checkout']['email2'] = $json_data['payer']['email_address'];
-			}				
-			
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['tel']) && isset($json_data['payer']['phone'])) {
-				
-				$request_tel = null;
-				
-				if (is_array($json_data['payer']['phone']) && isset( $json_data['payer']['phone']['phone_number']['national_number'])) {
-			
-					$request_tel =  $json_data['payer']['phone']['phone_number']['national_number'];
-					
-				} else if (is_string($json_data['payer']['phone'])) {
-				
-					$request_tel = $json_data['payer']['phone'];
-					
-				}
-				
-				if ($request_tel !== null) $_SESSION['wpsg']['checkout']['tel'] = $json_data['payer']['phone'];
-				
-			}
-			
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['strasse']) && isset($json_data['payer']['address']['address_line_1'])) $_SESSION['wpsg']['checkout']['strasse'] =  $json_data['payer']['address']['address_line_1'];
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['ort']) && isset($json_data['payer']['address']['admin_area_2'])) $_SESSION['wpsg']['checkout']['ort'] = $json_data['payer']['address']['admin_area_2'];
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['plz']) && isset($json_data['payer']['address']['postal_code'])) $_SESSION['wpsg']['checkout']['plz'] = $json_data['payer']['address']['postal_code'];
-			if (!wpsg_isSizedString($_SESSION['wpsg']['checkout']['land']) && isset($json_data['payer']['address']['country_code'])) $_SESSION['wpsg']['checkout']['land'] = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_LAND."` WHERE UPPER(`kuerzel`) = '".wpsg_q(strtoupper($json_data['payer']['address']['country_code']))."'");
-
-			if ($this->shop->hasMod('wpsg_mod_shippingadress') && !isset($_SESSION['wpsg']['checkout']['diff_shippingadress'])) {
-
-                $shipping = wpsg_getArray($json_data['purchase_units'][0]['shipping']);
-
-			    if (wpsg_isSizedArray($shipping)) {
-
-                    $country_id = intval($this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_LAND."` WHERE UPPER(`kuerzel`) = '".wpsg_q(strtoupper(wpsg_getStr($shipping['address']['country_code'])))."'"));
-
-					if ($country_id > 0) {
-						
-						$_SESSION['wpsg']['checkout']['diff_shippingadress'] = '1';
-						
-						$arName = wpsg_explodeName($shipping['name']['full_name']);
-						
-						$_SESSION['wpsg']['checkout']['shipping_vname'] = wpsg_getStr($arName[0]);
-						$_SESSION['wpsg']['checkout']['shipping_name'] = wpsg_getStr($arName[1]);
-						
-						$_SESSION['wpsg']['checkout']['shipping_strasse'] = wpsg_getStr($shipping['address']['address_line_1']);
-						$_SESSION['wpsg']['checkout']['shipping_plz'] = wpsg_getStr($shipping['address']['postal_code']);
-						$_SESSION['wpsg']['checkout']['shipping_ort'] = wpsg_getStr($shipping['address']['admin_area_2']);
-						
-						$_SESSION['wpsg']['checkout']['shipping_land'] = $country_id;
-						
-					}
-
-                }
-
-            }
-
-			$_SESSION['wpsg']['checkout']['payment_amount'] = $json_data['purchase_units'][0]['amount']['value'];
-			$_SESSION['wpsg']['checkout']['paymentId'] = $json_data['id'];
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                $_SESSION['wpsg']['checkout']['payer_id'] = $json_data['payer']['payer_info']['payer_id'];
-
-            } else {
-
-			    $_SESSION['wpsg']['checkout']['payer_id'] = $json_data['payer']['payer_id'];
-
-            }
+			$_SESSION['wpsg']['checkout']['vname'] = $json_data['payer']['payer_info']['first_name'];
+			$_SESSION['wpsg']['checkout']['name'] = $json_data['payer']['payer_info']['last_name'];
+			$_SESSION['wpsg']['checkout']['email'] = $json_data['payer']['payer_info']['email'];
+			$_SESSION['wpsg']['checkout']['email2'] = $json_data['payer']['payer_info']['email'];
+			$_SESSION['wpsg']['checkout']['tel'] = $json_data['payer']['payer_info']['phone'];
+			$_SESSION['wpsg']['checkout']['strasse'] =  $json_data['payer']['payer_info']['shipping_address']['line1'];
+			$_SESSION['wpsg']['checkout']['ort'] = $json_data['payer']['payer_info']['shipping_address']['city'];
+			$_SESSION['wpsg']['checkout']['plz'] = $json_data['payer']['payer_info']['shipping_address']['postal_code'];
+			$_SESSION['wpsg']['checkout']['land'] = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_LAND."` WHERE UPPER(`kuerzel`) = '".wpsg_q(strtoupper($json_data['payer']['payer_info']['shipping_address']['country_code']))."'");
+			$_SESSION['wpsg']['checkout']['payment_amount'] = $json_data['transactions'][0]['amount']['total'];
+			$_SESSION['wpsg']['checkout']['paymentId'] = $_REQUEST['paymentId'];
+			$_SESSION['wpsg']['checkout']['payer_id'] = $json_data['payer']['payer_info']['payer_id'];
 			
 			$this->shop->basket->initFromSession(true);
@@ -1070,13 +729,18 @@
 			$check2 = $checkCheckout = $this->shop->basket->checkCheckout(2);
 			
-			if ($check1 === false) {
+			if ($check1 === false)
+			{
 					
 				$this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_CHECKOUT));
 					
-			} else if ($check2 === false) {
+			}
+			else if ($check2 === false)
+			{
 					
 				$this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_CHECKOUT2));
 					
-			} else {
+			}
+			else
+			{
 			
 				$this->shop->addFrontendMessage(__('Ihre Daten wurden von PayPal ÃŒbernommen und Sie kÃ¶nnen die Bestellung direkt abschlieÃen, nachdem Sie alles ÃŒberprÃŒft haben.', 'wpsg'));
@@ -1106,5 +770,5 @@
 		{
 			
-			$_SESSION['wpsg']['checkout']['payment'] = wpsg_sinput("key", $_REQUEST['payment_id']);
+			$_SESSION['wpsg']['checkout']['payment'] = $_REQUEST['payment_id'];
 			
 			$this->shop->redirect($this->shop->getUrl(wpsg_ShopController::URL_OVERVIEW));
@@ -1112,107 +776,4 @@
 		} // public function PaymentSelectRedirect()
 		
-		/**
-		 * Wird vor Bestellabschluss stat dem Button "zahlungspflichtig bestellen" aufgerufen
-		 * @return void
-		 */
-		public function giroPayCreateOrderFromSessionRedirect(): void {
-		 
-			try {
-			
-				$this->shop->basket->initFromSession();
-				
-				$order_id = $this->shop->basket->save(false, false, true);
-				$paypal_order_id = \wpsg\GiroPayPalAPI::getInstance()->creeateOrder(wpsg_order::getInstance($order_id));
-				
-				$oOrder = wpsg_order::getInstance($order_id);
-				$oOrder->setMeta('wpsg_mod_paypalapi_paymentid', $paypal_order_id);
-				
-				wpsg_header::JSONData([
-					'id' => $paypal_order_id
-				]);
-				
-			} catch (\Throwable $e) {
-				
-				wpsg_header::JSONData([
-					'error' => $e->getMessage()
-				]);
-				
-			}
-		
-		}
-		
-		/**
-		 * Wird beim platzieren der Bestellung aufgerufen
-		 * @return void
-		 */
-		public function giroPayCreateOrderRedirect(): void {
-		
-			// wpsg_debug($_REQUEST);
-			// wpsg_debug(file_get_contents('php://input'));
-			
-			$order_id = intval($_REQUEST['order_id']);
-			$paypal_order_id = \wpsg\GiroPayPalAPI::getInstance()->creeateOrder(wpsg_order::getInstance($order_id));
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			$oOrder->setMeta('wpsg_mod_paypalapi_paymentid', $paypal_order_id);
-			
-			wpsg_header::JSONData([
-				'id' => $paypal_order_id
-			]);
-			
-			exit;
-		
-		}
-	
-		public function giroPayCancelOrderRedirect(): void {
-	
-			$this->shop->addFrontendError(__('Zahlung wurde bei/von GiroPay abgebrochen. Bitte eine andere Zahlungsart wÃ€hlen oder erneut versuchen.', 'wpsg'));
-			
-			$this->shop->redirect(
-				\wpsg_ShopController::getShop()->getURL(\wpsg_ShopController::URL_CHECKOUT2)
-			);
-			
-		}
-		
-		public function giroPayApproveOrderRedirect(): void {
-			
-			$request = json_decode(file_get_contents('php://input'), true);
-			
-			$paypal_order_id = $request['orderID'];
-			$paypal_order_json = \wpsg\GiroPayPalAPI::getInstance()->captureOrder($paypal_order_id);
-			
-			$order_id = intval($paypal_order_json['purchase_units'][0]['reference_id']);
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			$oOrder->setMeta('wpsg_mod_paypalapi_saleid', $paypal_order_json['purchase_units'][0]['payments']['captures'][0]['id']);
-			
-			$this->shop->basket->initFromDB($order_id);
-			$this->shop->basket->save(true, true, true);
-			
-			wpsg_header::JSONData([
-				'order_paypal' => $paypal_order_json,
-				'order_done_url' => $this->shop->getDoneURL($order_id)
-			]);
-			
-			exit;
-			
-		}
-		
-		/**
-		 * GehÃ¶rt zur Giropay Option vom Checkot2
-		 * @return void
-		 */
-		public function giroPaySetRedirect(): void {
-			
-			//wpsg_debug($_REQUEST);
-			//wpsg_debug(file_get_contents('php://input'));
-			//die();
-			
-			$_SESSION['wpsg']['checkout']['payment'] = '10_1';
-			
-			$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_OVERVIEW));
-			
-		}
-		
 		/* Aktionen */
 		
@@ -1222,12 +783,11 @@
 		 * Definiert Variablen fÃŒr das View welches den IFrame einbindet
 		 */
-		private function setViewForPayPalPLus() {
-			
-			$json_data = $this->api_startPayment_v2($this->shop->view['basket'], $_SESSION['wpsg']['order_id'], false);
-
-			//wpsg_debug($json_data);
-
+		private function setViewForPayPalPLus() 
+		{
+			
+			$json_data = $this->api_startPayment($this->shop->view['basket'], $_SESSION['wpsg']['order_id'], false);
+			
 			$approval_url = false;
-			foreach ($json_data['links'] as $l) { if ($l['rel'] == 'approve' || $l['rel'] == 'approval_url') $approval_url = $l['href']; }
+			foreach ($json_data['links'] as $l) { if ($l['rel'] == 'approval_url') $approval_url = $l['href']; }
 			
 			// Das war mal drin mir ist nicht klar warum:
@@ -1239,5 +799,5 @@
 			{
 				
-				if (strval($payment_id) != strval($this->id))
+				if ($payment_id != $this->id)
 				{
 					 
@@ -1257,5 +817,5 @@
 					);
 					
-					if (wpsg_isSizedString($payment['logo'])) $tpp['imageUrl'] = $payment['logo'];
+					if (wpsg_isSizedString($payment['logo_100x25'])) $tpp['imageUrl'] = $payment['logo_100x25'];
 					 
 					$arThirdPartyPayment[] = $tpp;
@@ -1264,12 +824,9 @@
 				
 			}
-			 
+			
 			$this->shop->view['wpsg_mod_paypalapi']['ThirdPartyPayment'] = $arThirdPartyPayment;
 			$this->shop->view['wpsg_mod_paypalapi']['mode'] = (($this->isSandbox())?'sandbox':'live');
 			$this->shop->view['wpsg_mod_paypalapi']['approval_url'] = $approval_url;
-			
-			$this->shop->view['wpsg_mod_paypalapi']['disableContinue'] = 'wpsg_checkout2button';
-			$this->shop->view['wpsg_mod_paypalapi']['enableContinue'] = 'wpsg_checkout2button';			
-			
+						
 		}
 		
@@ -1277,17 +834,21 @@
 		 * Wird optional beim speichern ausgelÃ¶st, versucht den WebHook anzulegen und setzt die BackendMeldungen
 		 */
-		private function createWebHook() {
-
-			$create_webhook = false; $nExists = false;
+		private function createWebHook()
+		{
+		
+			$create_webhook = false;
 			$wh_url = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'webHook', array(), true);
-
+			
 			$arWH = $this->api_getWebHooks();
-
-			if (wpsg_isSizedArray($arWH)) {
-
-				foreach ($arWH as $wh) {
-				
-					if ($wh['url'] === $wh_url) {
-
+					
+			if (wpsg_isSizedArray($arWH))
+			{
+				
+				foreach ($arWH as $wh)
+				{
+				
+					if ($wh['url'] === $wh_url)
+					{
+				
 						$nExists = true;
 						break;
@@ -1298,5 +859,6 @@
 				
 				if ($nExists === false) $create_webhook = true;
-				else {
+				else
+				{
 						
 					$this->shop->addBackendError(__('WebHook ist bereits registriert.', 'wpsg'));
@@ -1304,15 +866,17 @@
 				}
 				
-			} else $create_webhook = true;
-
-			if ($create_webhook === true) {
-
+			}
+			else $create_webhook = true;
+			
+			if ($create_webhook === true)
+			{
+				
 				$bOK = $this->api_createWebHook($wh_url);
-
+				
 				if ($bOK === true) $this->shop->addBackendMessage(__('WebHook erfolgreich angelegt.', 'wpsg'));
 				else $this->shop->addBackendError(__('WebHook konnte nicht angelegt werden.', 'wpsg'));
 				
 			}
-
+			 				
 		} // private function createWebHook();
 		
@@ -1320,58 +884,34 @@
 		 * Gibt den PaymentState und SaleState zurÃŒck
 		 */
-		public function getState($order_id) {
+		public function getState($order_id)
+		{
 												
 			$oOrder = wpsg_order::getInstance($order_id);
-
-			$paymentID = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid');
-
-			if (!wpsg_isSizedString($paymentID)) return false;
-			else {
-
-                if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                    $payment_info = $this->api_getPaymentInfo($oOrder->getMeta('wpsg_mod_paypalapi_paymentid'));
-
-                    $payment_state = $payment_info['state'];
-                    $sale_state = $payment_info['transactions'][0]['related_resources'][0]['sale']['state'];
-
-                    if (!wpsg_isSizedString($payment_state)) return false;
-
-                    if (wpsg_isSizedString($payment_state)) $oOrder->setMeta('wpsg_mod_paypalapi_paymentstate', $payment_state);
-                    if (wpsg_isSizedString($sale_state)) $oOrder->setMeta('wpsg_mod_paypalapi_salestate', $sale_state);
-
-                    return array($payment_state, $sale_state, $payment_info);
-
-                } else {
-
-                    $payment_info = $this->api_getPaymentInfo_v2($paymentID);
-
-                    $payment_state = wpsg_getStr($payment_info['status']);
-                    $sale_state = wpsg_getStr($payment_info['purchase_units'][0]['payments']['captures'][0]['status'], __('Unbekannt', 'wpsg'));
-
-                    if (!wpsg_isSizedString($payment_state)) return false;
-
-                    if (wpsg_isSizedString($payment_state)) $oOrder->setMeta('wpsg_mod_paypalapi_paymentstate', $payment_state);
-                    if (wpsg_isSizedString($sale_state)) $oOrder->setMeta('wpsg_mod_paypalapi_salestate', $sale_state);
-
-                    return array($payment_state, $sale_state, $payment_info);
-
-                }
-
-            }
+			
+			if (!wpsg_isSizedString($oOrder->getMeta('wpsg_mod_paypalapi_paymentid'))) return false;
+			
+			$payment_info = $this->api_getPaymentInfo($oOrder->getMeta('wpsg_mod_paypalapi_paymentid'));
+			
+			$payment_state = $payment_info['state'];
+			$sale_state = $payment_info['transactions'][0]['related_resources'][0]['sale']['state'];
+ 
+			if (!wpsg_isSizedString($payment_state)) return false;
+			
+			if (wpsg_isSizedString($payment_state)) $oOrder->setMeta('wpsg_mod_paypalapi_paymentstate', $payment_state);
+			if (wpsg_isSizedString($sale_state)) $oOrder->setMeta('wpsg_mod_paypalapi_salestate', $sale_state);
+									
+			return array($payment_state, $sale_state); 
 			
 		} // public function getState($order_id)
 		
-		public function stornoOrder($order_id) {
+		public function stornoOrder($order_id)
+		{
 			
 			$oOrder = wpsg_order::getInstance($order_id);
-			if ($oOrder === false) throw new \wpsg\Exception(__('Bei einer Stornierung konnte Bestellung nicht geladen werden', 'wpsg'));
-
-			$payment_id = $oOrder->getMeta('wpsg_mod_paypalapi_paymentid');
+			if ($oOrder === false) $this->shop->throwErrorCode('10_3');
+			
 			$sale_id = $oOrder->getMeta('wpsg_mod_paypalapi_saleid');
-
-            $payment_info = $this->api_getPaymentInfo_v2($payment_id);
-
-			$json_data = $this->api_refundSale_v2($sale_id, $oOrder->getToPay());
+			
+			$json_data = $this->api_refundSale($sale_id, $oOrder->getAmount());
 			
 			$this->getState($oOrder->id);			
@@ -1380,5 +920,5 @@
 			
 		} // public function stornoOrder($order_id)
-
+		
 		/**
 		 * Gibt true/false zurÃŒck ob die Api auf die PayPal Sandbox zurÃŒckgreift
@@ -1404,16 +944,11 @@
 		
 		/* Neu ohne PHPApi */
-
-        /**
-         * DEPRECATED
-         * @param $sale_id
-         * @param $amount
-         * @return array|mixed|void
-         */
-		private function api_refundSale($sale_id, $amount) {
-
+			
+		private function api_refundSale($sale_id, $amount)
+		{
+			
 			$post_data = array(
 				'amount' => array(
-					'total' => number_format($amount, 2, '.', ''),
+					'total' => number_format($amount, 2),
 					'currency' => $this->currency
 				)		
@@ -1425,48 +960,22 @@
 			
 		} // private function api_refundSale($sale_id)
-
-        private function api_refundSale_v2($sale_id, $amount) {
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                return $this->api_refundSale($sale_id, $amount);
-
-            }
-
-            $client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($this->api_getEnvironment());
-
-            $request = new \PayPalCheckoutSdk\Payments\CapturesRefundRequest($sale_id);
-            $request->body = [
-                'amount' => [
-                    'value' => number_format($amount, 2, '.', ''),
-                    'currency_code' => $this->currency
-                ]
-            ];
-
-            $json_data = $client->execute($request);
-            $json_data = json_decode(json_encode($json_data), true)['result'];
-
-            return $json_data;
-
-        }
-
+		
 		/**
 		 * Erstellt einen neuen WebHook fÃŒr ZahlungseingÃ€nge auf der ÃŒbergebenene URL
 		 */
-		private function api_createWebHook($url) {
+		private function api_createWebHook($url)
+		{
 			
 			$post_data = array(
 				'url' => $url,
 				'event_types' => array(
-					[
+					array(
 						'name' => 'PAYMENT.SALE.COMPLETED'
-					], [
-					    'name' => 'PAYMENT.CAPTURE.COMPLETED'
-                    ]
+					) 
 				)
 			);
 			
 			$json_data = $this->api_call('v1/notifications/webhooks', $post_data, $this->api_getAccessToken());
-
+			 
 			if (wpsg_isSizedString($json_data['id'])) return true;
 			else return false;
@@ -1487,9 +996,9 @@
 		
 		/**
-         * DEPRECATED
 		 * FÃŒhrt eine Zahlung aus
 		 */
-		private function api_executePayment($payment_id, $payer_id) {
-
+		private function api_executePayment($payment_id, $payer_id)
+		{
+			
 			$post_data = array(
 				'payer_id' => $payer_id
@@ -1497,25 +1006,9 @@
 			
 			$json_data = $this->api_call('v1/payments/payment/'.$payment_id.'/execute', $post_data, $this->api_getAccessToken());
-
+			
 			return $json_data;
 			
 		} // private function api_executePayment($payment_id, $payer_id, $order_id)
-
-        private function api_executePayment_v2($payment_id, $payer_id) {
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                return $this->api_executePayment($payment_id, $payer_id);
-
-            }
-
-            $client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($this->api_getEnvironment());
-            $json_data = $client->execute(new \PayPalCheckoutSdk\Orders\OrdersCaptureRequest($payment_id));
-            $json_data = json_decode(json_encode($json_data), true)['result'];
-
-            return $json_data;
-
-        }
-
+		
 		/**
 		 * Aktualisiert eine Zahlungserfahrung
@@ -1581,611 +1074,197 @@
 			
 		} // private function api_getWebExperience()
-
-        private function api_getEnvironment() {
-
-            if ($this->isSandbox()) {
-
-                $clientId = $this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid');
-                $clientSecret = $this->shop->get_option('wpsg_mod_paypalapi_sandbox_secret');
-
-                return new \PayPalCheckoutSdk\Core\SandboxEnvironment($clientId, $clientSecret);
-
-            } else {
-
-                $clientId = $this->shop->get_option('wpsg_mod_paypalapi_clientid');
-                $clientSecret = $this->shop->get_option('wpsg_mod_paypalapi_secret');
-
-                return new \PayPalCheckoutSdk\Core\ProductionEnvironment($clientId, $clientSecret);
-
-            }
-
-        }
-
-        /**
-         * Authorisiert eine Zahlung
-         * https://developer.paypal.com/docs/api/payments/v1/#definition-transaction
-         * https://developer.paypal.com/docs/api/payments/v1/#definition-payer
-         *
-         */
-        private function api_startPayment($arBasket, $order_id = false, $express = true) {
-
-            // Dadurch wird die Bestellung in der DB fixiert und Platzhalter kÃ€nnen generiert werden
-            if (!wpsg_isSizedInt($order_id)) $order_id = $this->shop->basket->save(false, false, true);
-
-            $oOrder = wpsg_order::getInstance($order_id);
-            $access_token = $this->api_getAccessToken();
-
-            $item_list = array(
-                'items' => array()
-            );
-
-            $post_data = array();
-
-            $post_data['transactions'] = array(
-                array(
-                    'amount' => array(
-                        'total' => number_format($arBasket['arCalculation']['sum']['topay_brutto'], 2, '.', ''),
-                        'currency' => $this->currency
-                    ),
-                    'description' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_subject'), 'wpsg'), $order_id),
-                )
-            );
-
-            $subTotal = 0;
-
-            // Produkte
-            foreach ($arBasket['produkte'] as $k => $p)
-            {
-
-                $product_price = ((wpsg_isSizedString($arBasket['noMwSt'], '1'))?$p['preis_netto']:$p['preis_brutto']);
-
-                $sku = $this->shop->getProductAnr($this->shop->getProduktID($p['id']));
-                if (!wpsg_isSizedString($sku)) $sku = __('n.A.', 'wpsg');
-
-                $item_list['items'][] = array(
-                    'quantity' => $p['menge'],
-                    'name' => $this->shop->getProductName($this->shop->getProduktID($p['id']), true),
-                    'description' => '',
-                    'sku' => $sku,
-                    'url' => $this->shop->getProduktLink($this->shop->getProduktID($p['id'])),
-                    'price' => number_format($product_price, 2, '.', ''),
-                    'currency' => $this->currency
-                );
-
-                $subTotal += $product_price * $p['menge'];
-
-            }
-
-			// Wertgutschein - funktioniert von PayPal Seite her aus nicht, siehe Kommentar weiter unten
-			/*
-				if (isset($arBasket['arCalculation']['coupon'])) {
-
-						$item_list['items'][] = array(
+		
+		/**
+		 * Authorisiert eine Zahlung
+		 */
+		private function api_startPayment($arBasket, $order_id = false, $express = true)
+		{
+						
+			$oOrder = wpsg_order::getInstance($order_id);
+			$access_token = $this->api_getAccessToken();
+ 
+			$item_list = array(
+				'items' => array()
+			);
+			
+			$post_data = array();
+						
+			$post_data['transactions'] = array(
+				array(
+					'amount' => array(
+						'total' => number_format($arBasket['sum']['preis_gesamt_brutto'], 2),
+						'currency' => $this->currency
+					),
+					'description' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_subject'), 'wpsg'), $order_id),
+				)
+			);
+				
+			$subTotal = 0;
+			
+			// Produkte
+			foreach ($arBasket['produkte'] as $k => $p)
+			{
+			
+				$product_price = ((wpsg_isSizedString($arBasket['noMwSt'], '1'))?$p['preis_netto']:$p['preis_brutto']);
+				
+				$item_list['items'][] = array(
+					'quantity' => $p['menge'],
+					'name' => $this->shop->getProductName($this->shop->getProduktID($p['id']), true),
+					'description' => '',
+					'sku' => $this->shop->getProductAnr($this->shop->getProduktID($p['id'])),
+					'url' => $this->shop->getProduktLink($this->shop->getProduktID($p['id'])),
+					'price' => number_format($product_price, 2),
+					'currency' => $this->currency
+				);
+				
+				$subTotal += $product_price * $p['menge'];
+			
+			}
+			
+			// Gutschein
+			if (isset($arBasket['sum']['gs_brutto']))
+			{
+					
+				$item_list['items'][] = array(
+					'quantity' => '1',
+					'name' => __('Gutschein', 'wpsg'),
+					'description' => wpsg_translate(__('EingelÃ¶ster Gutschein Code:#1#', 'wpsg'), $arBasket['gs']['code']),
+					'price' => number_format(-1 * $arBasket['sum']['gs_brutto'], 2),
+					'currency' => $this->currency
+				);
+				
+				$subTotal += -1 * $arBasket['sum']['gs_brutto'];
+			
+			}
+				
+			// Zahlungskosten/VergÃŒnstigungen
+			if (isset($arBasket['sum']['preis_payment_brutto']) && $arBasket['sum']['preis_payment_brutto'] != 0)
+			{
+			
+				$item_list['items'][] = array(
+					'quantity' => '1',
+					'name' => (($arBasket['sum']['preis_payment_brutto'] > 0)?__('GebÃŒhr fÃŒr Zahlungsart', 'wpsg'):__('Rabatt durch Zahlungsart', 'wspg')),
+					'description' => __('Rabatt, der Aufgrund der gewÃ€hlten Zahlungsart entstanden ist.', 'wpsg'),
+					'price' => number_format($arBasket['sum']['preis_payment_brutto'], 2),
+					'currency' => $this->currency
+				);
+				
+				$subTotal += $arBasket['sum']['preis_payment_brutto'];
+			
+			}
+			
+			// Rabatte auf Warenkorb
+			if (isset($arBasket['sum']['preis_rabatt_brutto']) && $arBasket['sum']['preis_rabatt_brutto'] > 0)
+			{
+				 
+				$item_list['items'][] = array(
+					'quantity' => '1',
+					'name' => __('Rabatt', 'wpsg'),
+					'description' => __('Rabatt, der sich aus dem Warenkorbwert ergibt.', 'wpsg'),
+					'price' => number_format(-1 * $arBasket['sum']['preis_rabatt_brutto'], 2),
+					'currency' => $this->currency						
+				); 
+				
+				$subTotal += -1 * $arBasket['sum']['preis_rabatt_brutto'];
+				
+			} 
+			
+			$post_data['intent'] = 'sale';
+			$post_data['payer'] = array(
+				'payment_method' => 'paypal'
+			);			
+				
+			if ($oOrder->status == wpsg_ShopController::STATUS_UNVOLLSTAENDIG)
+			{
+			
+				$post_data['redirect_urls'] = array(
+					'return_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'returnPayPalExpress'),
+					'cancel_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET)
+				);
+				
+			}
+			else
+			{
+			
+				$post_data['redirect_urls'] = array(
+					'return_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'returnPayPalExpress'),
+					'cancel_url' => $this->shop->getDoneURL($oOrder->id)
+				);
+				
+			}
+						
+			// Versandkosten/VergÃŒnstigungen
+			if (isset($arBasket['sum']['preis_shipping_brutto']) && $arBasket['sum']['preis_shipping_brutto'] > 0)
+			{
+				
+				$details['shipping'] = number_format($arBasket['sum']['preis_shipping_brutto'], 2);
+				
+			} 
+			else if (isset($arBasket['sum']['preis_shipping_brutto']) && $arBasket['sum']['preis_shipping_brutto'] < 0)
+			{
+			
+				$item_list['items'][] = array(
+					'quantity' => '1',
+					'name' => __('Rabatt aufgrund Versandart', 'wpsg'),
+					'price' => number_format($arBasket['sum']['preis_shipping_brutto'], 2),
+					'currency' => $this->currency
+				);
+				
+				$subTotal += $arBasket['sum']['preis_shipping_brutto'];
+				
+			}
+			
+			if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_details')))
+			{
+				
+				if (wpsg_isSizedArray($details))
+				{
+			
+					$post_data['transactions'][0]['amount']['details'] = $details;
+					$post_data['transactions'][0]['amount']['details']['subtotal'] = number_format($subTotal, 2);
+				
+				}
+				
+				$post_data['transactions'][0]['item_list'] = $item_list;
+				
+			}
+			else
+			{
+				
+				$post_data['transactions'][0]['item_list'] = array(
+					'items' => array(
+						array(
 							'quantity' => '1',
-							'name' => __('Wertgutschein', 'wpsg'),
-							'description' => wpsg_translate(__('EingelÃ¶ster Gutschein Code:#1#', 'wpsg'), $arBasket[arCalculation]['coupon']['code']),
-							'sku' => $sku,
-							//'price' => -number_format($arBasket['arCalculation']['coupon']['netto'], 2, '.', ''),
-							'currency' => $this->currency,
-						);
-
-						$subTotal += -$arBasket['arCalculation']['coupon']['brutto'];
-
-					} 
-			*/
-
-            // Gutschein
-            if (isset($arBasket['arCalculation']['voucher']['brutto']))
-            {
-
-                $item_list['items'][] = array(
-                    'quantity' => '1',
-                    'name' => __('Gutschein', 'wpsg'),
-                    'description' => wpsg_translate(__('EingelÃ¶ster Gutschein Code:#1#', 'wpsg'), $arBasket['arCalculation']['voucher']['code']),
-                    //'price' => number_format(-1 * $arBasket['sum']['gs_brutto'], 2, '.', ''),
-                    'discount' => $arBasket['arCalculation']['voucher']['brutto'],
-					'currency' => $this->currency
-                );
-
-                $subTotal += -1 * $arBasket['arCalculation']['voucher']['brutto'];
-
-            }
-			
-
-            // Zahlungskosten/VergÃŒnstigungen
-            if (isset($arBasket['arCalculation']['sum']['payment_brutto']) && $arBasket['arCalculation']['sum']['payment_brutto'] != 0)
-            {
-
-                $item_list['items'][] = array(
-                    'quantity' => '1',
-                    'name' => (($arBasket['arCalculation']['sum']['payment_brutto'] > 0)?__('GebÃŒhr fÃŒr Zahlungsart', 'wpsg'):__('Rabatt durch Zahlungsart', 'wpsg')),
-                    'description' => __('Rabatt, der Aufgrund der gewÃ€hlten Zahlungsart entstanden ist.', 'wpsg'),
-                    'price' => number_format($arBasket['arCalculation']['sum']['payment_brutto'], 2, '.', ''),
-                    'currency' => $this->currency
-                );
-
-                $subTotal += $arBasket['arCalculation']['sum']['payment_brutto'];
-
-            }
-
-            // Rabatte auf Warenkorb
-            if (isset($arBasket['sum']['preis_rabatt_brutto']) && $arBasket['sum']['preis_rabatt_brutto'] > 0)
-            {
-
-                $item_list['items'][] = array(
-                    'quantity' => '1',
-                    'name' => __('Rabatt', 'wpsg'),
-                    'description' => __('Rabatt, der sich aus dem Warenkorbwert ergibt.', 'wpsg'),
-                    'price' => number_format(-1 * $arBasket['sum']['preis_rabatt_brutto'], 2, '.', ''),
-                    'currency' => $this->currency
-                );
-
-                $subTotal += -1 * $arBasket['sum']['preis_rabatt_brutto'];
-
-            }
-
-            /** @var wpsg_country $oInvoiceCountry */
-            $oInvoiceCountry = null; if (wpsg_isSizedInt($arBasket['checkout']['land'])) $oInvoiceCountry = wpsg_country::getInstance($arBasket['checkout']['land']);
-
-            /** @var wpsg_country $oShippingCountry */
-            $oShippingCountry = null;
-            if ($oInvoiceCountry !== null) $oShippingCountry = $oInvoiceCountry;
-            if (wpsg_isSizedInt($arBasket['checkout']['shipping_land'])) $oShippingCountry = wpsg_country::getInstance($arBasket['checkout']['shipping_land']);
-
-            $post_data['intent'] = 'sale';
-            $post_data['payer'] = array(
-                'payment_method' => 'paypal'
-            );
-
-            if ($oInvoiceCountry !== null && wpsg_isSizedString($arBasket['checkout']['plz'])) {
-
-                $post_data['payer']['payer_info'] = [
-                    'email' => $arBasket['checkout']['email'],
-                    'first_name' => $arBasket['checkout']['vname'],
-                    'last_name' => $arBasket['checkout']['name'],
-                    'billing_address' => [
-                        'line1' => trim($arBasket['checkout']['strasse']),
-                        'line2' => '',
-                        'city' => trim($arBasket['checkout']['ort']),
-                        'country_code' => $oInvoiceCountry->getShorttext(),
-                        'postal_code' => trim($arBasket['checkout']['plz']),
-                    ]
-                ];
-
-                if (strtotime($arBasket['checkout']['geb']) > 0) {
-
-                    $post_data['payer']['payer_info']['birth_date'] = date('Y-m-d', strtotime($arBasket['checkout']['geb']));
-
-                }
-
-                if (preg_match('/^(?:\((\+?\d+)?\)|\+?\d+) ?\d*(-?\d{2,3} ?){0,4}$/', $arBasket['checkout']['tel'])) {
-
-                    $post_data['payer']['payer_info']['billing_address']['phone'] = preg_replace('/ /', '', $arBasket['checkout']['tel']);
-
-                }
-
-            }
-
-            if ($oOrder->getId() > 0 && $oOrder->status == wpsg_ShopController::STATUS_UNVOLLSTAENDIG)
-            {
-
-                $post_data['redirect_urls'] = array(
-                    'return_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'returnPayPalExpress'),
-                    'cancel_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET)
-                );
-
-            }
-            else
-            {
-
-                $post_data['redirect_urls'] = array(
-                    'return_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'returnPayPalExpress'),
-                    'cancel_url' => $this->shop->getDoneURL($oOrder->id)
-                );
-
-            }
-
-            // Versandkosten/VergÃŒnstigungen
-            if (isset($arBasket['arCalculation']['shipping']['brutto']) && $arBasket['arCalculation']['shipping']['brutto'] > 0)
-            {
-
-                $details['shipping'] = number_format($arBasket['arCalculation']['shipping']['brutto'], 2, '.', '');
-
-            }
-            else if (isset($arBasket['arCalculation']['shipping']['brutto']) && $arBasket['arCalculation']['shipping']['brutto'] < 0)
-            {
-
-                $item_list['items'][] = array(
-                    'quantity' => '1',
-                    'name' => __('Rabatt aufgrund Versandart', 'wpsg'),
-                    'price' => number_format($arBasket['arCalculation']['shipping']['brutto'], 2, '.', ''),
-                    'currency' => $this->currency
-                );
-
-                $subTotal += $arBasket['arCalculation']['shipping']['brutto'];
-
-            }
-
-            //wpsg_debug($item_list);
-            //wpsg_debug($subTotal);
-
-            /*
-             * Daschmi@14.12.2016
-             * Ich vergleiche hier die Summe der Positionen mit dem ÃŒbergebenen Brutto
-             * Bei Nettorechnungen kann es hier zu Problemen fÃŒhren Siehe Track Ticket 505
-             */
-
-            $shipping_address = [];
-
-            // Lieferadresse
-            if ($oShippingCountry !== null) {
-
-                if (wpsg_getStr($arBasket['checkout']['diff_shippingadress']) == '1') {
-
-                    $shipping_address = [
-                        'recipient_name' => trim($arBasket['checkout']['shipping_firma'].' '.$arBasket['checkout']['shipping_vname'].' '.$arBasket['checkout']['shipping_name']),
-                        'line1' => trim($arBasket['checkout']['shipping_strasse']),
-                        'line2' => '',
-                        'city' => trim($arBasket['checkout']['shipping_ort']),
-                        'country_code' => $oShippingCountry->getShorttext(),
-                        'postal_code' => trim($arBasket['checkout']['shipping_plz'])
-                    ];
-
-                } else {
-
-                    $shipping_address = [
-                        'recipient_name' => trim($arBasket['checkout']['firma'].' '.$arBasket['checkout']['vname'].' '.$arBasket['checkout']['name']),
-                        'line1' => trim($arBasket['checkout']['strasse']),
-                        'line2' => '',
-                        'city' => trim($arBasket['checkout']['ort']),
-                        'country_code' => $oShippingCountry->getShorttext(),
-                        'postal_code' => trim($arBasket['checkout']['plz'])
-                    ];
-
-                }
-
-            }
-
-            if (wpsg_isSizedArray($shipping_address) && isset($post_data['transactions'][0]['item_list'])) {
-
-                $post_data['transactions'][0]['item_list']['shipping_address'] = $shipping_address;
-
-            }
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_details')) && floatval($subTotal) === floatval($arBasket['arCalculation']['sum']['topay_brutto']))
-            {
-
-                if (wpsg_isSizedArray($details))
-                {
-
-                    $post_data['transactions'][0]['amount']['details'] = $details;
-                    $post_data['transactions'][0]['amount']['details']['subtotal'] = number_format($subTotal, 2, '.', '');
-
-                }
-
-                $post_data['transactions'][0]['item_list'] = $item_list;
-            }
-            else
-            {
-
-                $post_data['transactions'][0]['item_list'] = array(
-                    'items' => array(
-                        array(
-                            'quantity' => '1',
-                            'name' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_subject'), 'wpsg'), $order_id),
-                            'price' => number_format($arBasket['arCalculation']['sum']['topay_brutto'], 2, '.', ''),
-                            'currency' => $this->currency
-                        )
-                    )
-                );
-
-            }
-
-            if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_paymentExperience')))
-            {
-
-                $post_data['experience_profile_id'] = $this->shop->get_option('wpsg_mod_paypalapi_paymentExperience');
-
-            }
-
-            //die('<pre>'.print_r($post_data, true).'</pre>');
-
-            $json_data = $this->api_call('v1/payments/payment', $post_data, $access_token);
-
-            if (wpsg_isSizedString($json_data['id'])) {
-
-                $oOrder->setMeta('wpsg_mod_paypalapi_paymentid', $json_data['id']);
-
-            }
-
-            return $json_data;
-
-        } // private function api_startPayment()
-
-        /**
-         * @param $arBasket
-         * @param bool $order_id
-         * @param bool $express
-         * @throws \wpsg\Exception
-         */
-        private function api_startPayment_v2($arBasket, $order_id = false, $express = true) {
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                return $this->api_startPayment($arBasket, $order_id, $express);
-
-            }
-
-            if (!wpsg_isSizedInt($order_id)) $order_id = $this->shop->basket->save(false, false, true);
-
-            $oOrder = wpsg_order::getInstance($order_id);
-
-            $client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($this->api_getEnvironment());
-
-            if ($oOrder->getId() > 0 && intval($oOrder->status) !== wpsg_ShopController::STATUS_UNVOLLSTAENDIG) {
-
-                $application_context = [
-                    'return_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'returnPayPalExpress'),
-                    'cancel_url' => $this->shop->getDoneURL($oOrder->id)
-                ];
-
-            } else {
-
-                $application_context = [
-                    'return_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'returnPayPalExpress'),
-                    'cancel_url' => $this->shop->getUrl(wpsg_ShopController::URL_BASKET)
-                ];
-
-            }
-
-            $request = new \PayPalCheckoutSdk\Orders\OrdersCreateRequest();
-            $request->prefer('return=representation');
-            $request->body = [
-                "intent" => "CAPTURE",
-                'purchase_units' => [[
-                    'reference_id' => "order_".$order_id,
-                    'description' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_subject'), 'wpsg'), $order_id),
-                    'amount' => [
-                        'currency_code' => $this->currency,
-                        'value' => number_format($arBasket['arCalculation']['sum']['topay_brutto'], 2, '.', '')
-                    ]
-                ]],
-                "application_context" => $application_context
-            ];
-
-            $subTotal = 0; $tax_total = 0; $item_total = 0; $discounts = 0;
-            $items = []; $breakdown = [];
-
-            foreach ($arBasket['produkte'] as $k => $p) {
- 
-				// Hier muss gerundet weiter gerechnet werden da die Summe am Ende von PayPal kontrolliert wird
-				$p['preis_netto'] = round($p['preis_netto'], 2);
-				$p['preis_brutto'] = round($p['preis_brutto'], 2);
-				
-                $sku = $this->shop->getProductAnr($this->shop->getProduktID($p['id']));
-                if (!wpsg_isSizedString($sku)) $sku = __('n.A.', 'wpsg');
-
-                $tax = number_format($p['preis_brutto'] - $p['preis_netto'], 2, '.', '');
-
-                $items[] = [
-                    'quantity' => $p['menge'],
-					'name' => substr($this->shop->getProductName($this->shop->getProduktID($p['id']), true), 0, 127),
-                    'description' => '',
-                    'sku' => $sku,
-                    'unit_amount' => [
-                        'currency_code' => $this->currency,
-                        'value' => number_format($p['preis_netto'], 2, '.', '')
-                    ],
-                    'tax' => [
-                        'currency_code' => $this->currency,
-                        'value' => $tax
-                    ]
-                ];
-
-                $item_total += $p['preis_netto'] * $p['menge'];
-                $subTotal += $p['preis_brutto'] * $p['menge'];
-                $tax_total += $tax * $p['menge'];
-
-            }
-		
-		// PayPal kann noch keine Negativen "Items" anlegen
-		// Must be greater than or equal to 0. If the currency supports decimals, only two decimal place precision is supported.
-		/*
-			if (isset($arBasket['arCalculation']['coupon'])) {
-				foreach ($arBasket['arCalculation']['coupon'] as $k => $c) {
-
-					$items[] = [
-						'quantity' => '1',
-						'name' => 'Wertgutschein',
-						'description' => $c['code'],
-						'sku' => $sku,
-						'unit_amount' => [
-                        	'currency_code' => $this->currency,
-                        	'value' => number_format($c['netto'], 2, '.', '')
-						],
-						'tax' => [
-                        	'currency_code' => $this->currency,
-                        	'value' => $c['tax']
-                    	]
-						];
-
-					$item_total += -$c['netto'];
-					$subTotal += -$c['brutto'];
-					$tax_total += -$c['tax'];
-
-				} 
-			}
-		*/
-
-            if (isset($arBasket['arCalculation']['shipping']['brutto']) && $arBasket['arCalculation']['shipping']['brutto'] > 0) {
-
-                $items[] = [
-                    'quantity' => 1,
-                    'name' => __('Versandkosten', 'wpsg'),
-                    'description' => '',
-                    'sku' => '',
-                    'unit_amount' => [
-                        'currency_code' => $this->currency,
-                        'value' => number_format($arBasket['arCalculation']['shipping']['netto'], 2, '.', '')
-                    ],
-                    'tax' => [
-                        'currency_code' => $this->currency,
-                        'value' => number_format($arBasket['arCalculation']['shipping']['brutto'] - $arBasket['arCalculation']['shipping']['netto'], 2, '.', '')
-                    ]
-                ];
-
-                $item_total += $arBasket['arCalculation']['shipping']['netto'];
-                $subTotal += $arBasket['arCalculation']['shipping']['brutto'];
-                $tax_total += ($arBasket['arCalculation']['shipping']['brutto'] - $arBasket['arCalculation']['shipping']['netto']);
-
-            }
-
-            if (isset($arBasket['arCalculation']['sum']['payment_brutto']) && $arBasket['arCalculation']['sum']['payment_brutto'] > 0) {
-
-                $items[] = [
-                    'quantity' => 1,
-                    'name' => __('Kosten fÃŒr Zahlungsart', 'wpsg'),
-                    'description' => '',
-                    'sku' => '',
-                    'unit_amount' => [
-                        'currency_code' => $this->currency,
-                        'value' => number_format($arBasket['arCalculation']['sum']['payment_netto'], 2, '.', '')
-                    ],
-                    'tax' => [
-                        'currency_code' => $this->currency,
-                        'value' => number_format($arBasket['arCalculation']['sum']['payment_brutto'] - $arBasket['arCalculation']['sum']['payment_netto'], 2, '.', '')
-                    ]
-                ];
-
-                $item_total += $arBasket['arCalculation']['sum']['payment_netto'];
-                $subTotal += $arBasket['arCalculation']['sum']['payment_brutto'];
-                $tax_total += ($arBasket['arCalculation']['sum']['payment_brutto'] - $arBasket['arCalculation']['sum']['payment_netto']);
-
-            }
-
-			if (isset($arBasket['arCalculation']['voucher'])) {
-
-				foreach ($arBasket['arCalculation']['voucher'] as $v) {
-
-					$subTotal += $v['brutto'];
-
-					$discounts += abs($v['brutto']);
-
-				}
-
-			}
-			
-			if (isset($arBasket['arCalculation']['coupon'])) {
-
-				foreach ($arBasket['arCalculation']['coupon'] as $v) {
-
-					$subTotal += $v['brutto'];
-
-					$discounts += abs($v['brutto']);
-
-				}
-
-			}
-			
-
-            if (isset($arBasket['arCalculation']['discount'])) {
-
-                foreach ($arBasket['arCalculation']['discount'] as $d) {
-
-                    $subTotal += $d['brutto'];
-  
-                    $discounts += abs($d['brutto']);
-
-                }
-
-            }
-
-            // amount/value
-            // Should equal item_total + tax_total + shipping + handling + insurance - shipping_discount - discount.
-
-			//wpsg_debug($arBasket);
-            //wpsg_debug($arBasket['arCalculation']['sum']);
-        	//wpsg_debug($items);
-			//wpsg_debug(floatval($subTotal) === floatval($arBasket['arCalculation']['sum']['brutto']));
-			//die;
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_details')) && floatval($subTotal) === floatval($arBasket['arCalculation']['sum']['brutto'])) {
-
-                $request->body['purchase_units'][0]['items'] = $items;
-
-                $request->body['purchase_units'][0]['amount']['breakdown'] = [
-                    'item_total' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ],
-                    'tax_total' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ],
-                    'shipping' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ],
-                    'handling' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ],
-                    'insurance' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ],
-                    'shipping_discount' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ],
-                    'discount' => [
-                        'currency_code' => $this->currency,
-                        'value' => 0
-                    ]
-                ];
-
-                $request->body['purchase_units'][0]['amount']['breakdown']['item_total']['value'] =
-                    number_format($item_total, 2, '.', '');
-
-                $request->body['purchase_units'][0]['amount']['breakdown']['tax_total']['value'] =
-                    number_format($tax_total, 2, '.', '');
-
-                $request->body['purchase_units'][0]['amount']['breakdown']['discount']['value'] =
-                    number_format($discounts, 2, '.', '');			
-					
-            }
-
-            //wpsg_debug($request->body);
-
-            try {
-
-                $response = $client->execute($request);
-                $response = json_decode(json_encode($response), true)['result'];
-
-                if (wpsg_isSizedString($response['id'])) $oOrder->setMeta('wpsg_mod_paypalapi_paymentid', $response['id']);
-
-                //echo '<pre>'.print_r($response, true).'</pre>';
-
-                return $response;
-
-            } catch (Exception $ex) {
-
-                wpsg_debug(json_decode($ex->getMessage(), true));
-
-                throw new \wpsg\Exception($ex->getMessage());
-
-            }
-
-            die("-");
-
-        }
-
-		/**
-         * DEPRECATED
+							'name' => $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_paypalapi_paypalexpress_subject'), 'wpsg'), $order_id),
+							'price' => number_format($arBasket['sum']['preis_gesamt_brutto'], 2),
+							'currency' => $this->currency
+						)
+					)	
+				); 
+				
+			}
+			 
+			if (wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_paymentExperience')))
+			{
+				
+				$post_data['experience_profile_id'] = $this->shop->get_option('wpsg_mod_paypalapi_paymentExperience');
+				
+			} 
+			
+			$json_data = $this->api_call('v1/payments/payment', $post_data, $access_token);
+			 
+			if (wpsg_isSizedString($json_data['id'])) $oOrder->setMeta('wpsg_mod_paypalapi_paymentId', $json_data['id']);
+			 
+			return $json_data;
+			
+		} // private function api_startPayment()
+		
+		/**
 		 * Informationen zu einer authorisierten Zahlung holen
 		 * @param unknown $payment_id
 		 */
-		private function api_getPaymentInfo($payment_id, $noError = false) {
-
+		private function api_getPaymentInfo($payment_id, $noError = false)
+		{
+			
 			$json_data = $this->api_call('v1/payments/payment/'.$payment_id, false, $this->api_getAccessToken(), false, $noError);
 									
@@ -2193,28 +1272,5 @@
 			
 		} // private function api_getPaymentInfo($payment_id)
-
-        /**
-         * Informationen zu einer authorisierten Zahlung holen
-         * @param unknown $payment_id
-         * @throws \Exception
-         */
-        private function api_getPaymentInfo_v2($payment_id, $noError = false) {
-
-            if ($this->shop->get_option('wpsg_mod_paypalapi_version') === 'v1') {
-
-                return $this->api_getPaymentInfo($payment_id, $noError);
-
-            }
-
-            $client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($this->api_getEnvironment());
-            $json_data = $client->execute(new \PayPalCheckoutSdk\Orders\OrdersGetRequest($payment_id));
-            $json_data = json_decode(json_encode($json_data), true)['result'];
-
-            //echo '<pre>'; print_r($json_data); echo '</pre>';
-
-            return $json_data;
-
-        }
-
+		
 		/**
 		 * Generiert einen Access Token
@@ -2224,5 +1280,5 @@
 						
 			$json_data = $this->api_call('v1/oauth2/token', http_build_query(array('grant_type' => 'client_credentials')));
-
+			
 			return $json_data['access_token'];
 			
@@ -2244,13 +1300,15 @@
 			$arHeader = array(
 				'Accept: application/json',
-				'Accept-Language: de_DE',
-                'Prefer: return=representation'
+				'Accept-Language: de_DE'
 			);
 			
-			if ($auth_token === false) {
-						
-				if ($this->isSandbox()) {
-					 
-					if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid')) || !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_sandbox_secret'))) {
+			if ($auth_token === false)
+			{
+							
+				if ($this->isSandbox())
+				{
+					
+					if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid')) || !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_sandbox_secret')))
+					{
 						
 						$this->api_handleError(__('Keine API Daten hinterlegt.', 'wpsg'));
@@ -2258,10 +1316,13 @@
 						
 					}
-					 
+					
 					curl_setopt($ch, CURLOPT_USERPWD, $this->shop->get_option('wpsg_mod_paypalapi_sandbox_clientid').':'.$this->shop->get_option('wpsg_mod_paypalapi_sandbox_secret'));
 					
-				} else {
-					
-					if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_clientid')) || !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_secret'))) {
+				}
+				else 
+				{
+					
+					if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_clientid')) || !wpsg_isSizedString($this->shop->get_option('wpsg_mod_paypalapi_secret')))
+					{
 					
 						$this->api_handleError(__('Keine API Daten hinterlegt.', 'wpsg'));
@@ -2277,5 +1338,5 @@
 			else
 			{
-			 
+				
 				$arHeader[] = 'Authorization: Bearer '.$auth_token;
 				
@@ -2311,15 +1372,14 @@
 			
 			if ($post_data !== false) curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
-
+				 
 			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-			curl_setopt($ch, CURLOPT_HTTPHEADER, $arHeader);
-            curl_setopt($ch, CURLOPT_HEADER, 0);
+			curl_setopt($ch, CURLOPT_HTTPHEADER, $arHeader);			
 									
 			$output = curl_exec($ch);
-		 
+			
 			if ($auth_token === false && $output == '')
 			{
 				
-				$this->api_handleError(__('API lieferte keinen AUTH Token. Vermutlich fehlerhafte Zugangsdaten.', 'wpsg'));
+				$this->api_handleError(__('API lieferte keinen AUTH Token. Vermutlich fehlerhafte Zugangsdaten.', 'wspg'));
 				return;
 				
@@ -2331,5 +1391,5 @@
 			
 			curl_close($ch);
-
+ 
 			$return = json_decode($output, true);
 			
@@ -2349,10 +1409,8 @@
 		private function api_handleError($errorValue)
 		{ 
-
-			if ($this->api_try === true) return;
 						
 			if (is_array($errorValue)) $errorValue = print_r($errorValue, 1);
 			
-			// wpsg_debug($errorValue);
+			wpsg_debug($errorValue);
 			
 			if (wpsg_isSizedInt($_SESSION['wpsg']['order_id']))
@@ -2366,5 +1424,5 @@
 			{
 				
-				$oOrder = wpsg_order::getInstance(wpsg_sinput("key", $_REQUEST['edit_id']));
+				$oOrder = wpsg_order::getInstance($_REQUEST['edit_id']);
 				$oOrder->log('PayPal API Fehler', $errorValue);
 				
@@ -2374,25 +1432,6 @@
 			
 		} // private function api_handleError($errorValue)
+		
+	} // class wpsg_mod_paypalapi extends wpsg_mod_basic
 
-        /**
-         * Autoloader fÃŒr die PayPal Klassen
-         */
-        function spl_autoload($class) {
-
-            $path = null;
-
-            if (substr($class, 0, 18) === "PayPalCheckoutSdk\\") {
-
-                $path = WPSG_PATH_MOD.'mod_paypalapi'.DIRECTORY_SEPARATOR.str_replace("\\", DIRECTORY_SEPARATOR, $class).'.php';
-
-            } else if (substr($class, 0, 11) === "PayPalHttp\\") {
-
-                $path = WPSG_PATH_MOD.'mod_paypalapi'.DIRECTORY_SEPARATOR.str_replace("\\", DIRECTORY_SEPARATOR, $class).'.php';
-
-            }
-
-            if ($path !== null && file_exists($path)) require_once($path);
-
-        } // function spl_autoload($class)
-
-	} // class wpsg_mod_paypalapi extends wpsg_mod_basic
+?>
Index: ds/wpsg_mod_paypalratepay.class.php
===================================================================
--- /mods/wpsg_mod_paypalratepay.class.php	(revision 8528)
+++ 	(revision )
@@ -1,86 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	  
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 02.09.2019
-	 * Time: 08:09 
-	 * 
-	 * Modul zur Zahlungsabwicklung mit Ratenzahlung ÃŒber die PayPal REST API
-	 * @author Daschmi (daniel@maennchen1.de)
-	 */
-	class wpsg_mod_paypalratepay extends wpsg_mod_basic {
-		
-		var $apiContext = false;
-		
-		var $lizenz = 1;
-		var $id = 18;
-		//var $hilfeURL = 'http://wpshopgermany.de/?p=1728009';
-		var $version = "9.9.9";
-		var $free = false;
-				
-		/**
-		 * Costructor
-		 */
-		public function __construct() {
-			
-			parent::__construct();
-			
-			$this->name = __('PayPal Ratenzahlung', 'wpsg');
-			$this->group = __('Zahlungsarten', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Zahlungsart PayPal mit Ratenzahlung ÃŒber die REST API Schnittstelle.', 'wpsg');
-			
-		} // public function __construct()
-		
-		public function init() {
-			
-			
-		} // public function init()
-		
-		public function install() {
-			
-			$this->shop->checkDefault('wpsg_mod_paypalratepay_currency', 'EUR');
-			
-			$this->shop->checkDefault('wpsg_mod_paypalratepay_name', __('PayPal Ratenzahlung', 'wpsg'), false, true);
-			$this->shop->checkDefault('wpsg_mod_paypalratepay_hint', __('Ratenzahlung ÃŒber PayPal', 'wpsg'), false, true);
-			
-		}
-		
-		public function settings_edit() {
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_paypalratepay/settings_edit.phtml');
-			
-		}
-		
-		public function settings_save() {
-			
-			$this->shop->update_option('wpsg_mod_paypalratepay_aktiv', $_REQUEST['wpsg_mod_paypalratepay_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_paypalratepay_name', $_REQUEST['wpsg_mod_paypalratepay_name'], false, true, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_paypalratepay_hint', $_REQUEST['wpsg_mod_paypalratepay_hint'], false, true, WPSG_SANITIZE_TEXTAREA);
-			
-		}
-		
-		public function addPayment(&$arPayment) {
-			
-			if (!$this->shop->hasMod('wpsg_mod_paypalapi')) return false;
-			
-			if (is_admin() || $this->shop->get_option('wpsg_mod_paypalratepay_aktiv') == '1') {
-				
-				$arPayment[$this->id] = array(
-					'id' => $this->id,
-					'name' => __($this->shop->get_option('wpsg_mod_paypalratepay_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_paypalratepay_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_paypalratepay_taxkey'),
-					'mwst_null' => $this->shop->get_option('wpsg_mod_paypalratepay_taxcountry'),
-					'hint' => __($this->shop->get_option('wpsg_mod_paypalratepay_hint'), 'wpsg'),
-					//'logo' => $this->shop->getRessourceURL('mods/mod_paypalapi/gfx/logo_100x25.png')
-				);
-				
-			}
-			
-		}  
-		
-	}
-    
Index: /mods/wpsg_mod_prepayment.class.php
===================================================================
--- /mods/wpsg_mod_prepayment.class.php	(revision 8528)
+++ /mods/wpsg_mod_prepayment.class.php	(revision 5261)
@@ -43,82 +43,31 @@
 		public function settings_edit()
 		{
-			
+			 		
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_prepayment/settings_edit.phtml');
 			
 		} // public function settings_edit()
 		
-		public function settings_save() {
-			
-			$this->shop->update_option('wpsg_mod_prepayment_bezeichnung', $_REQUEST['wpsg_mod_prepayment_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_aktiv', $_REQUEST['wpsg_mod_prepayment_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_prepayment_hint', $_REQUEST['wpsg_mod_prepayment_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_gebuehr', $_REQUEST['wpsg_mod_prepayment_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_prepayment_mwst', $_REQUEST['wpsg_mod_prepayment_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_prepayment_mwstland', $_REQUEST['wpsg_mod_prepayment_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_prepayment_kinhaber', $_REQUEST['wpsg_mod_prepayment_kinhaber'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_bank', $_REQUEST['wpsg_mod_prepayment_bank'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_iban', $_REQUEST['wpsg_mod_prepayment_iban'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_swift', $_REQUEST['wpsg_mod_prepayment_swift'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_subject', $_REQUEST['wpsg_mod_prepayment_subject'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_prepayment_qrcode', $_REQUEST['wpsg_mod_prepayment_qrcode'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_prepayment_qrcode_invoice', $_REQUEST['wpsg_mod_prepayment_qrcode_invoice'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_prepayment_qrcode_mail', $_REQUEST['wpsg_mod_prepayment_qrcode_mail'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->addTranslationString('wpsg_mod_prepayment_bezeichnung', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_prepayment_bezeichnung']));
-			$this->shop->addTranslationString('wpsg_mod_prepayment_hint', wpsg_sinput(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_prepayment_hint']));
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_prepayment_bezeichnung', $_REQUEST['wpsg_mod_prepayment_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_prepayment_aktiv', $_REQUEST['wpsg_mod_prepayment_aktiv']);
+			$this->shop->update_option('wpsg_mod_prepayment_hint', $_REQUEST['wpsg_mod_prepayment_hint']);
+			$this->shop->update_option('wpsg_mod_prepayment_gebuehr', wpsg_tf($_REQUEST['wpsg_mod_prepayment_gebuehr'], true));
+			$this->shop->update_option('wpsg_mod_prepayment_mwst', $_REQUEST['wpsg_mod_prepayment_mwst']);
+			$this->shop->update_option('wpsg_mod_prepayment_mwstland', $_REQUEST['wpsg_mod_prepayment_mwstland']);
+			$this->shop->update_option('wpsg_mod_prepayment_kinhaber', $_REQUEST['wpsg_mod_prepayment_kinhaber']);		
+			$this->shop->update_option('wpsg_mod_prepayment_bank', $_REQUEST['wpsg_mod_prepayment_bank']);
+			$this->shop->update_option('wpsg_mod_prepayment_iban', $_REQUEST['wpsg_mod_prepayment_iban']);
+			$this->shop->update_option('wpsg_mod_prepayment_swift', $_REQUEST['wpsg_mod_prepayment_swift']);
+			$this->shop->update_option('wpsg_mod_prepayment_subject', $_REQUEST['wpsg_mod_prepayment_subject']);
+			
+			$this->shop->addTranslationString('wpsg_mod_prepayment_bezeichnung', $_REQUEST['wpsg_mod_prepayment_bezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_prepayment_hint', $_REQUEST['wpsg_mod_prepayment_hint']);
 			
 		} // public function settings_save()
 		
-		public function wpsg_mod_rechnungen_pdf(&$pdf, &$order_id, &$bPreview, &$bInvoice) {
-			
-			if ($this->shop->get_option('wpsg_mod_prepayment_qrcode_invoice') == '1') {
-				
-				require_once WPSG_PATH_LIB.'phpgirocode.class.php';
-				
-				$formatIBAN = function($iban) {
-	
-					$iban = preg_replace('/\040/', '', $iban);
-					$iban_formated = '';
-					
-					for ($i = 0; $i < ceil(strlen($iban) / 4); $i ++) $iban_formated .= substr($iban, $i * 4, 4).' ';
-					
-					return trim($iban_formated);
-				
-				};
-				
-				$img = 'data:image/png;base64,'.$this->genQRCode(
-					$order_id,
-					$this->get_subject($order_id),
-					$this->shop->view['basket']['sum']['preis_gesamt_brutto'],
-					10,
-					PhpGirocode::OUTPUT_BASE64
-				);
-				
-				if ($pdf->getY() > 200) {
-					
-					$pdf->AddPage();
-					$y = $pdf->getY();
-					
-				} else $y = $pdf->getY() + 15;
-				
-				$pdf->setX(24); $pdf->setXY(24, $y);
-				$pdf->MultiCell(0, 4, __('Wenn Ihre Banking-App Girocode unterstÃŒtzt, kÃ¶nnen Sie den folgenden QRCode scannen, um die Zahlung durchzufÃŒhren.', 'wpsg'));
-				
-				$pdf->setY($pdf->getY() + 5);
-				
-				$pdf->addBase64Image($img, 24, $pdf->getY(), 23, 23);
-
-				$pdf->setXY(50, $pdf->getY() + 3);
-				$pdf->MultiCell(0, 4,  "IBAN: ".$formatIBAN($this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_prepayment_iban')))."
-Kontoinhaber: ".$this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_prepayment_kinhaber'))."
-
-Betreff: ".$this->get_subject($order_id));
-				
-			}
-			
-		}
-		
-		public function checkGeneralBackendError()
-		{
+		public function checkGeneralBackendError() 
+		{ 
 
 			if ($this->shop->get_option('wpsg_mod_prepayment_aktiv') === '1')
@@ -127,5 +76,5 @@
 				if (	!wpsg_isSizedString($this->shop->get_option('wpsg_mod_prepayment_bank')) ||
 						!wpsg_isSizedString($this->shop->get_option('wpsg_mod_prepayment_iban')) ||
-						!wpsg_isSizedString($this->shop->get_option('wpsg_mod_prepayment_swift')) ||
+						!wpsg_isSizedString($this->shop->get_option('wpsg_mod_prepayment_swift')) || 
 						!wpsg_isSizedString($this->shop->get_option('wpsg_mod_prepayment_kinhaber'))	)
 				{
@@ -144,22 +93,95 @@
 		} // public function checkGeneralBackendError()
 		
-		public function addPayment(&$arPayment) {
+		public function addPayment(&$arPayment) 
+		{ 
  
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_prepayment_aktiv') != '1') return;
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_prepayment_mwst'), $this->shop->getDefaultCountry());
 			
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
 				'name' => __($this->shop->get_option('wpsg_mod_prepayment_bezeichnung'), 'wpsg'),
-				'price' => $this->shop->get_option('wpsg_mod_prepayment_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_prepayment_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_prepayment_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_prepayment_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_prepayment_mwstland'),
-				'hint' => $this->shop->get_option('wpsg_mod_prepayment_hint'),
-				'logo' => $this->shop->getRessourceURL('mods/mod_prepayment/gfx/logo_100x25.png')
+				'hint' => $this->shop->get_option('wpsg_mod_prepayment_hint')
 			);
 			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_prepayment_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_prepayment_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
 		} // public function addPayment(&$arShipping)
 		
-		public function order_done(&$order_id, &$done_view)
-		{
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if (wpsg_isSizedInt($arBasket['checkout']['payment'], $this->id))
+			{
+
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_prepayment_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_prepayment_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_prepayment_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket)
+ 		
+		public function order_done(&$order_id, &$done_view) 
+		{ 
 
 			// Bestellungen mit 0 geben nix aus
@@ -174,18 +196,22 @@
 
 			}
-			
+						
 		} // public function order_done(&$order_id)
 		
-		public function mail_payment() {
-			
+		public function mail_payment() 
+		{ 
+
 			if ($this->shop->view['basket']['checkout']['payment'] != $this->id) return;
 			
 			$this->shop->view['mod_prepayment']['subject'] = $this->get_subject($this->shop->view['o_id']);
 			
-			if ($this->shop->htmlMail === true) {
+			if ($this->shop->htmlMail === true)
+			{
 
 				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_prepayment/mail_html.phtml');
 				
-			} else {
+			}
+			else
+			{
 			
 				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_prepayment/mail.phtml');
@@ -193,90 +219,17 @@
 			}
 			
-		}
-		
-		public function mail_payment_after() {
-
-			if ($this->shop->view['basket']['checkout']['payment'] != $this->id || $this->shop->htmlMail !== true) return;
-			
-			$this->shop->view['mod_prepayment']['subject'] = $this->get_subject($this->shop->view['o_id']);
-			
-			echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_prepayment/mail_html_payment_after.phtml');
-			
 		} // public function mail_payment()
-		
+				
 		/**
 		 * Ersetzt die Platzhalter im Betreff
 		 */
-		public function get_subject($order_id) {
-			
-			$this->shop->cache->clearOrderCache($order_id);
-			
-			$ret = $this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_prepayment_subject'), $order_id);
-			
-			return $ret;
+		public function get_subject($order_id)
+		{
+			
+			return $this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_prepayment_subject'), $order_id);
 			
 		} // private function get_subject($order_id)
 		
-		/**
-		 * QRCode fÃŒr eMail erzeugen
-		 */
-		public function genQRCode($order_id, $subject, $betrag, $size, $out) {
-			
-			require_once WPSG_PATH_LIB.'phpqrcode/qrlib.php';
-			require_once WPSG_PATH_LIB.'phpgirocode.class.php';
-			
-            if (!file_exists(WPSG_PATH_UPLOADS.'wpsg_girocode/')) mkdir(WPSG_PATH_UPLOADS.'wpsg_girocode/', 0755, true);
-            
-			$fname1 = WPSG_PATH_UPLOADS.'wpsg_girocode/'.$order_id.'.png';
-			
-			$phpGiroCode = new PhpGirocode();
-			$phpGiroCode->setBIC(wpsg_getStr($this->shop->get_option('wpsg_shopdata_bank_bic')));
-			$phpGiroCode->setIBAN(wpsg_getStr($this->shop->get_option('wpsg_shopdata_bank_iban')));
-			$phpGiroCode->setReciver(wpsg_getStr($this->shop->get_option('wpsg_shopdata_bank_owner')));
-			$phpGiroCode->setAmount($betrag);
-			$phpGiroCode->setText($subject);
-			$phpGiroCode->setSize($size);
-			
-			if ($out == PhpGirocode::OUTPUT_BROWSER) {
-				
-				$phpGiroCode->generate(PhpGirocode::OUTPUT_BROWSER, $fname1);
-			
-			} else if ($out == PhpGirocode::OUTPUT_FILE) {
-			
-				$phpGiroCode->generate(PhpGirocode::OUTPUT_FILE, $fname1);
-				
-				$fname2 = WPSG_URL_WP.'?wpsg_action=wpsg_getGiroCode&order_id='.$order_id;
-				
-				$ret = '<img src="'.$fname2.'" />';
-
-			} else if ($out == PhpGirocode::OUTPUT_BASE64) {
-				
-				$tmpfname = @tempnam("/tmp", "phpgirocode");
-				
-				$ret = $phpGiroCode->generate(PhpGirocode::OUTPUT_BASE64, $tmpfname);
-				
-				
-			} else {
-				
-				$ret = $phpGiroCode->generate(PhpGirocode::OUTPUT_TEST, false);
-				
-			}
-			
-			return $ret;
-			
-		} // private function genQRCode($betrag, $subject, $size, $out)
-		
-		public function template_redirect() {
-			
-			if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'wpsg_getGiroCode')) {
-				
-				header("Content-Type: image/png");
-				
-				readfile(WPSG_PATH_UPLOADS.'wpsg_girocode/'.intval(wpsg_sinput("key", $_REQUEST['order_id'])).'.png');
-				
-			}
-			
-		}
-		
 	} // class wpsg_mod_prepayment extends wpsg_mod_basic
 
+?>
Index: ds/wpsg_mod_printshop.class.php
===================================================================
--- /mods/wpsg_mod_printshop.class.php	(revision 8528)
+++ 	(revision )
@@ -1,664 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-		
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 14.01.2020
-	 * Time: 07:20
-	 */
-	
-	class wpsg_mod_printshop extends wpsg_mod_basic {
-		
-		protected static $instance = null;
-		private $set_data = null;
-		
-		const MODE_AREA = 1;
-		const MODE_AREA_SELECT = 2;
-		const MODE_LFM = 3;
-		const MODE_LFM_SELECT = 4;
-		
-		var $id = 5501;
-		
-		/**
-		 * Kostructor
-		 */
-		public function __construct() {
-			
-			parent::__construct();
-			
-			$this->name = __('Druckerei', 'wpsg');
-			$this->group = __('Produkte', 'wpsg');
-			$this->desc = __('', 'wpsg');
-			
-		} 
-		
-		public function settings_edit() {
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/settings_edit.phtml');
-			
-		}
-		
-		public function product_addedit_content(&$product_content, &$product_data) {
-			
-			// Nur fÃŒr angelegte Produkte
-			if ($product_data['id'] <= 0) return false;
-			 			
-			$oProduct = wpsg_product::getInstance($product_data['id']);
-			
-			$this->shop->view['wpsg_mod_printshop'] = [];
-
-            $this->shop->view['wpsg_mod_printshop']['set'] = intval($oProduct->getMeta('wpsg_mod_printshop_set'));
-            $this->shop->view['wpsg_mod_printshop']['mode'] = intval($oProduct->getMeta('wpsg_mod_printshop_mode'));
-            $this->shop->view['wpsg_mod_printshop']['unit_price'] = sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_price'));
-            $this->shop->view['wpsg_mod_printshop']['unit_input'] = sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_input'));
-            $this->shop->view['wpsg_mod_printshop']['factor_price_input'] = sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'));
-            $this->shop->view['wpsg_mod_printshop']['width_step'] = intval($oProduct->getMeta('wpsg_mod_printshop_width_step'));
-            $this->shop->view['wpsg_mod_printshop']['width_min'] = intval($oProduct->getMeta('wpsg_mod_printshop_width_min'));
-            $this->shop->view['wpsg_mod_printshop']['width_max'] = intval($oProduct->getMeta('wpsg_mod_printshop_width_max'));
-            $this->shop->view['wpsg_mod_printshop']['length_step'] = intval($oProduct->getMeta('wpsg_mod_printshop_length_step'));
-            $this->shop->view['wpsg_mod_printshop']['length_min'] = intval($oProduct->getMeta('wpsg_mod_printshop_length_min'));
-            $this->shop->view['wpsg_mod_printshop']['length_max'] = intval($oProduct->getMeta('wpsg_mod_printshop_length_max'));
-            $this->shop->view['wpsg_mod_printshop']['width'] = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_width'));
-            $this->shop->view['wpsg_mod_printshop']['width'] = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_width'));
-            $this->shop->view['wpsg_mod_printshop']['productupload_set'] = intval($oProduct->getMeta('wpsg_mod_printshop_productupload_set')) > 0;
-            $this->shop->view['wpsg_mod_printshop']['productupload_length'] = intval($oProduct->getMeta('wpsg_mod_printshop_productupload_length'));
-            $this->shop->view['wpsg_mod_printshop']['productupload_mandatory'] = intval($oProduct->getMeta('wpsg_mod_printshop_productupload_mandatory')) > 0;
-
-			$product_content['wpsg_mod_printshop'] = [
-				'title' => __('Druckereiprodukt', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/produkt_addedit_content.phtml', false)
-			];
-			
-		}
-
-        /**
-         * @param $product_id
-         * @throws Exception
-         */
-		public function produkt_save(&$product_id) {
-
-		    $r = [
-                'set' => intval(@$_REQUEST['wpsg_mod_printshop']['set']),
-		        'mode' => intval(@$_REQUEST['wpsg_mod_printshop']['mode']),
-                'unit_price' => sanitize_text_field(@$_REQUEST['wpsg_mod_printshop']['unit_price']),
-                'unit_input' => sanitize_text_field(@$_REQUEST['wpsg_mod_printshop']['unit_input']),
-                'factor_price_input' => wpsg_tf($_REQUEST['wpsg_mod_printshop']['factor_price_input']),
-                'width' => wpsg_tf(@$_REQUEST['wpsg_mod_printshop']['width']),
-                'width_step' => intval(@$_REQUEST['wpsg_mod_printshop']['width_step']),
-                'width_min' => intval(@$_REQUEST['wpsg_mod_printshop']['width_min']),
-                'width_max' => intval(@$_REQUEST['wpsg_mod_printshop']['width_max']),
-                'length_step' => intval(@$_REQUEST['wpsg_mod_printshop']['length_step']),
-                'length_min' => intval(@$_REQUEST['wpsg_mod_printshop']['length_min']),
-                'length_max' => intval(@$_REQUEST['wpsg_mod_printshop']['length_max']),
-                'productupload_set' => intval(@$_REQUEST['wpsg_mod_printshop']['productupload_set']),
-                'productupload_length' => intval(@$_REQUEST['wpsg_mod_printshop']['productupload_length']),
-                'productupload_mandatory' => intval(@$_REQUEST['wpsg_mod_printshop']['productupload_mandatory']),
-            ];
-
-		    if ($r['mode'] > 0) {
-
-                $oProduct = wpsg_product::getInstance($product_id);
-
-                $oProduct->setMeta('wpsg_mod_printshop_set', $r['set']);
-                $oProduct->setMeta('wpsg_mod_printshop_mode', $r['mode']);
-                $oProduct->setMeta('wpsg_mod_printshop_unit_price', $r['unit_price']);
-                $oProduct->setMeta('wpsg_mod_printshop_unit_input', $r['unit_input']);
-                $oProduct->setMeta('wpsg_mod_printshop_factor_price_input', $r['factor_price_input']);
-
-                if ($r['mode'] === self::MODE_AREA) {
-
-                } else if ($r['mode'] === self::MODE_AREA_SELECT) {
-
-                    $oProduct->setMeta('wpsg_mod_printshop_width_step', $r['width_step']);
-                    $oProduct->setMeta('wpsg_mod_printshop_width_min', $r['width_min']);
-                    $oProduct->setMeta('wpsg_mod_printshop_width_max', $r['width_max']);
-
-                    $oProduct->setMeta('wpsg_mod_printshop_length_step', $r['length_step']);
-                    $oProduct->setMeta('wpsg_mod_printshop_length_min', $r['length_min']);
-                    $oProduct->setMeta('wpsg_mod_printshop_length_max', $r['length_max']);
-                    
-                } else if ($r['mode'] === self::MODE_LFM) {
-
-                    $oProduct->setMeta('wpsg_mod_printshop_width', $r['width']);
-
-                } else if ($r['mode'] === self::MODE_LFM_SELECT) {
-
-                    $oProduct->setMeta('wpsg_mod_printshop_width', $r['width']);
-                    $oProduct->setMeta('wpsg_mod_printshop_length_step', $r['length_step']);
-                    $oProduct->setMeta('wpsg_mod_printshop_length_min', $r['length_min']);
-                    $oProduct->setMeta('wpsg_mod_printshop_length_max', $r['length_max']);
-
-                } else throw \wpsg\Exception::getInvalidValueException();
-
-                $oProduct->setMeta('wpsg_mod_printshop_productupload_set', $r['productupload_set']);
-                $oProduct->setMeta('wpsg_mod_printshop_productupload_length', $r['productupload_length']);
-                $oProduct->setMeta('wpsg_mod_printshop_productupload_mandatory', $r['productupload_mandatory']);
-
-            }
-
-		}
-
-        /**
-         * @throws Exception
-         */
-		public function basket_preInsert() {
-
-		    $r = [
-		        'insertAreaProduct' => wpsg_getInt($_REQUEST['wpsg']['insertAreaProduct']),
-                'product_key' => sanitize_text_field(wpsg_getStr($_REQUEST['wpsg']['product_key'])),
-                'menge' => wpsg_getInt($_REQUEST['wpsg']['menge']),
-                'length' => wpsg_getFloat($_REQUEST['wpsg']['length']),
-                'width' => wpsg_getFloat($_REQUEST['wpsg']['width'])
-            ];
-
-			if ($r['insertAreaProduct'] > 0) {
-			
-				$oProduct = wpsg_product::getInstance($r['product_key']);
-
-				if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-					
-					$price_onepice = $oProduct->getPrice($r['product_key']);
-						
-					$mode = intval($oProduct->getMeta('wpsg_mod_printshop_mode'));
-					$factor = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'));
-
-					if ($mode === wpsg_mod_printshop::MODE_AREA) {
-
-                        $length = $r['length'];
-                        $width = $r['width'];
-
-                    } else if ($mode === wpsg_mod_printshop::MODE_AREA_SELECT) {
-
-                        $arWidth = [];
-                        $arLength = [];
-
-                        for ($i = intval($oProduct->getMeta('wpsg_mod_printshop_width_min')); $i <= intval($oProduct->getMeta('wpsg_mod_printshop_width_max')); $i += intval($oProduct->getMeta('wpsg_mod_printshop_width_step'))) {
-
-                            $arWidth[] = $i;
-
-                        }
-
-                        for ($i = intval($oProduct->getMeta('wpsg_mod_printshop_length_min')); $i <= intval($oProduct->getMeta('wpsg_mod_printshop_length_max')); $i += intval($oProduct->getMeta('wpsg_mod_printshop_length_step'))) {
-
-                            $arLength[] = $i;
-
-                        }
-
-                        if (in_array($r['width'], $arWidth)) $width = $r['width']; else throw \wpsg\Exception::getInvalidValueException();
-                        if (in_array($r['length'], $arLength)) $length = $r['length']; else throw \wpsg\Exception::getInvalidValueException();
-
-                    } else if ($mode === wpsg_mod_printshop::MODE_LFM) {
-
-                        $length = $r['length'];
-                        $width = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_width'));
-
-                    } else if ($mode === self::MODE_LFM_SELECT) {
-
-                        $arLength = [];
-
-                        for ($i = intval($oProduct->getMeta('wpsg_mod_printshop_length_min')); $i <= intval($oProduct->getMeta('wpsg_mod_printshop_length_max')); $i += intval($oProduct->getMeta('wpsg_mod_printshop_length_step'))) {
-
-                            $arLength[] = $i;
-
-                        }
-
-                        if (in_array($r['length'], $arLength)) $length = $r['length']; else throw \wpsg\Exception::getInvalidValueException();
-
-						$width = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_width'));
-
-					} else throw wpsg\Exception::getInvalidFunctionException();
-
-                    $price = round(($width * $factor) * ($r['length'] * $factor), 2) * $price_onepice;
-
-					$this->set_data = [
-						'price' => $price,
-						'width' => $width,
-						'length' => $length						
-					];
-
-				} else throw wpsg\Exception::getInvalidFunctionException();
-								
-			}
-			
-		}
-		
-		public function basket_produkttosession($produkt_key, &$menge, &$ses_data) {
-			
-			if ($this->set_data !== null) {
-				
-				$ses_data['wpsg_mod_printshop'] = $this->set_data;
-
-				$this->set_data = null;
-				
-			}
-			
-		}
-
-        public function basket_row_before(&$p, $i) {
-
-		    $oProduct = wpsg_product::getInstance($p['id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-
-                $this->shop->view['wpsg_mod_printshop'] = [
-                    'width' => wpsg_tf($p['wpsg_mod_printshop']['width']),
-                    'length' => wpsg_tf($p['wpsg_mod_printshop']['length']),
-                    'price_onepice' => $oProduct->getPrice($p['product_key']),
-                    'unit_input' => sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_input')),
-                    'unit_price' => sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_price')),
-                    'factor_price_input' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'))
-                ];
-
-                $factor = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'));
-
-                $this->shop->view['wpsg_mod_printshop']['area'] = round(($this->shop->view['wpsg_mod_printshop']['width'] * $factor) * ($this->shop->view['wpsg_mod_printshop']['length'] * $factor), 2);
-
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/basket_row_before.phtml');
-
-            }
-
-        }
-
-        public function basket_row(&$p, $i) {
-
-            $oProduct = wpsg_product::getInstance($p['id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_productupload_set')) === 1) {
-
-                $this->shop->view['wpsg_mod_printshop'] = [
-                    'length' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_productupload_length')),
-                    'mandatory' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_productupload_mandatory')),
-                    'product_index' => $p['product_index'],
-                    'files' => wpsg_getArray($p['wpsg_mod_printshop']['files'])
-                ];
-
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/basket_row.phtml');
-
-            }
-
-        }
-
-        public function order_ajax() {
-
-		    if (wpsg_isSizedString($_REQUEST['do'], 'download')) {
-
-		        $r = [
-		            'do' => 'download',
-		            'mod' => 'wpsg_mod_printshop',
-                    'noheader' => '1',
-		            'order_id' => intval($_REQUEST['order_id']),
-                    'product_index' => intval($_REQUEST['product_index']),
-                    'file' => sanitize_file_name(rawurldecode($_REQUEST['file']))
-                ];
-
-                wpsg_checkNounce('Order', 'ajax', $r);
-
-                $path = $this->getUploadPath($r['order_id'], $r['product_index'], false).basename($r['file']);
-
-                if (file_exists($path)) {
-
-                    wpsg_header::AUTO($path, $r['file']);
-                    exit;
-
-                }
-
-            }
-
-        }
-
-        public function template_redirect() {
-
-		    if (get_the_ID() === intval($this->shop->get_option('wpsg_page_basket')) &&
-                (isset($_REQUEST['wpsg_basket_refresh']) || isset($_REQUEST['wpsg_basket_submit']))) {
-
-                foreach (wpsg_getArray($_SESSION['wpsg']['basket']) as $product_index => $product_data) {
-
-                    $oProduct = wpsg_product::getInstance($product_data['id']);
-
-                    if ($oProduct->getMeta('wpsg_mod_printshop_productupload_set') === '1') {
-
-                        if (!isset($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'])) $_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'] = [];
-
-                        // Dateien lÃ¶schen
-                        foreach (wpsg_getArray($_REQUEST['wpsg_mod_printshop'][$product_index]['delete_file']) as $file_index) {
-
-                            if (isset($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'][$file_index])) {
-
-                                unlink($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'][$file_index]['tmpnam']);
-                                unset($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'][$file_index]);
-
-                            }
-
-                        }
-
-                        // Dateien hinzufÃŒgen
-                        foreach (wpsg_getArray($_FILES['wpsg_mod_printshop']['error'][$product_index]) as $file_index => $error_code) {
-
-                            if (intval($error_code) === 0) {
-
-                                $tmpnam = tempnam(sys_get_temp_dir(), 'wpsg_mod_printshop');
-
-                                move_uploaded_file($_FILES['wpsg_mod_printshop']['tmp_name'][$product_index][$file_index], $tmpnam);
-
-                                $_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'][] = [
-                                    'tmpnam' => $tmpnam,
-                                    'file_name' => $_FILES['wpsg_mod_printshop']['name'][$product_index][$file_index]
-                                ];
-
-                            }
-
-                        }
-
-                    }
-
-                }
-
-            }
-
-        }
-
-        public function checkBasket(&$ok) {
-
-		    foreach (wpsg_getArray($_SESSION['wpsg']['basket']) as $product_index => $product_data) {
-
-		        $oProduct = wpsg_product::getInstance($product_data['id']);
-
-		        if ($oProduct->getMeta('wpsg_mod_printshop_productupload_set') === '1') {
-
-                    if (!isset($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'])) $_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'] = [];
-
-                    // Maximalanzahl prÃŒfen
-                    $max_upload = intval($oProduct->getMeta('wpsg_mod_printshop_productupload_length'));
-
-                    if ($max_upload > 0 && sizeof($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files']) > $max_upload) {
-
-                        $this->shop->addFrontendError(wpsg_translate(
-                            __('Anzahl an Uploads (#1#) in Produkt "#2#" ÃŒberschreitet die maximal mÃ¶gliche Menge an Uploads (#3#).', 'wpsg'),
-                            sizeof($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files']),
-                            $oProduct->getProductName(),
-                            $max_upload
-                        ));
-
-                        $ok = false;
-
-                    }
-
-                    // Pflichtfeld ÃŒberprÃŒfen
-                    if ($oProduct->getMeta('wpsg_mod_printshop_productupload_mandatory') === '1') {
-
-                        if (sizeof($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files']) == 0) {
-
-                            $this->shop->addFrontendError(wpsg_translate(
-                                __('Sie mÃŒssen mindestens eine Datei zu Produkt "#1#" hochladen.', 'wpsg'),
-                                $oProduct->getProductName()
-                            ));
-
-                            $ok = false;
-
-                        }
-
-                    }
-
-                }
-
-            }
-
-        } // public function checkCheckout(&$state, &$error, &$arCheckout)
-
-        public function order_view_row_before(&$p, $i) {
-
-            $oProduct = wpsg_product::getInstance($p['product_id']);
-            $oOrderProduct = wpsg_order_product::getInstance($p['order_product_id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-
-                $this->shop->view['wpsg_mod_printshop'] = [
-                    'order_id' => $oOrderProduct->getOrder()->getId(),
-                    'product_index' => $oOrderProduct->getProductIndex(),
-                    'i' => intval($i),
-                    'width' => wpsg_tf($oOrderProduct->getMeta('wpsg_mod_printshop_width')),
-                    'length' => wpsg_tf($oOrderProduct->getMeta('wpsg_mod_printshop_length')),
-                    'price_onepice' => wpsg_tf($oOrderProduct->getMeta('wpsg_mod_printshop_price_onepice')),
-                    'unit_price' => sanitize_text_field($oOrderProduct->getMeta('wpsg_mod_printshop_unit_price')),
-                    'unit_input' => sanitize_text_field($oOrderProduct->getMeta('wpsg_mod_printshop_unit_input')),
-                    'factor_price_input' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input')),
-                    'arFiles' => $this->getFiles($oOrderProduct->getOrder()->getId(), $oOrderProduct->getProductIndex())
-                ];
-
-                $factor = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'));
-
-                $this->shop->view['wpsg_mod_printshop']['area'] = round(($this->shop->view['wpsg_mod_printshop']['width'] * $factor) * ($this->shop->view['wpsg_mod_printshop']['length'] * $factor), 2);
-
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/order_view_row.phtml');
-
-            }
-
-        }
-
-        public function mail_row($i, $p) {
-
-            //$this->htmlMail = true;
-
-            $oProduct = wpsg_product::getInstance($p['product_id']);
-            $oOrderProduct = wpsg_order_product::getInstance($p['order_product_id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-
-                $this->shop->view['wpsg_mod_printshop'] = [
-                    'i' => intval($i),
-                    'width' => wpsg_tf($oOrderProduct->getMeta('wpsg_mod_printshop_width')),
-                    'length' => wpsg_tf($oOrderProduct->getMeta('wpsg_mod_printshop_length')),
-                    'price_onepice' => wpsg_tf($oOrderProduct->getMeta('wpsg_mod_printshop_price_onepice')),
-                    'unit_input' => sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_input')),
-                    'unit_price' => sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_price')),
-                    'factor_price_input' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'))
-                ];
-
-                $factor = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'));
-
-                $this->shop->view['wpsg_mod_printshop']['area'] = round(($this->shop->view['wpsg_mod_printshop']['width'] * $factor) * ($this->shop->view['wpsg_mod_printshop']['length'] * $factor), 2);
-
-                if ($this->shop->htmlMail === true)
-                    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/mail_row_html.phtml');
-                else
-                    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/mail_row.phtml');
-
-            }
-
-        }
-
-        public function overview_row_before(&$p, $i) {
-
-            $oProduct = wpsg_product::getInstance($p['id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-
-                $this->shop->view['wpsg_mod_printshop'] = [
-                    'width' => wpsg_tf($p['wpsg_mod_printshop']['width']),
-                    'length' => wpsg_tf($p['wpsg_mod_printshop']['length']),
-                    'price_onepice' => $oProduct->getPrice($p['product_key']),
-                    'unit_input' => sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_input')),
-                    'unit_price' => sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_price')),
-                    'factor_price_input' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'))
-                ];
-
-                $factor = wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_factor_price_input'));
-
-                $this->shop->view['wpsg_mod_printshop']['area'] = round(($this->shop->view['wpsg_mod_printshop']['width'] * $factor) * ($this->shop->view['wpsg_mod_printshop']['length'] * $factor), 2);
-
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/overview_row_before.phtml');
-
-            }
-
-        }
-
-        public function overview_row(&$p, $i) {
-
-            $oProduct = wpsg_product::getInstance($p['id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_productupload_set')) === 1 && wpsg_isSizedArray($p['wpsg_mod_printshop']['files'])) {
-
-                $this->shop->view['wpsg_mod_printshop'] = [
-                    'length' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_productupload_length')),
-                    'mandatory' => wpsg_tf($oProduct->getMeta('wpsg_mod_printshop_productupload_mandatory')),
-                    'product_index' => $p['product_index'],
-                    'files' => $p['wpsg_mod_printshop']['files']
-                ];
-
-                $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_printshop/overview_row.phtml');
-
-            }
-
-        }
-
-        public function basket_save_done(&$order_id, &$kunde_id, &$oBasket) {
-
-		    $oOrder = wpsg_order::getInstance($order_id);
-
-		    foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-
-		        if ($oOrderProduct->getProduct()->getMeta('wpsg_mod_printshop_productupload_set') === '1') {
-
-                    $product_index = $oOrderProduct->getProductIndex();
-
-                    if (wpsg_isSizedArray($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'])) {
-
-                        $path = $this->getUploadPath($order_id, $product_index);
-
-                        foreach ($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'] as $f) {
-
-                            copy($f['tmpnam'], $path.$f['file_name']);
-
-                        }
-
-                    }
-
-                }
-
-            }
-
-        }
-
-		public function calculation_addProduct(&$product_data, $ses_data) {
-			
-			if (isset($ses_data['wpsg_mod_printshop'])) {
-				
-				$product_data['set'] = $ses_data['wpsg_mod_printshop']['price'];
-				$product_data['bruttonetto'] = $this->shop->getBackendTaxview();
-				 
-			}
-			
-		}
-
-        public function renderProdukt_templateSelect(&$produkt_data, &$template_file) {
- 
-            $oProduct = wpsg_product::getInstance($produkt_data['id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-
-                $template_file = WPSG_PATH_VIEW.'/mods/mod_printshop/producttemplate.phtml';
-
-            }
-
-        }
-
-        public function calculation_saveProduct_after(&$oCalculation, $calc_product, &$db_product_data, $finish_order) {
-
-		    $oProduct = wpsg_product::getInstance($calc_product['product_id']);
-
-            if (intval($oProduct->getMeta('wpsg_mod_printshop_set')) === 1) {
-
-		        $ac = @$_SESSION['wpsg']['basket'][$calc_product['product_index']]['wpsg_mod_printshop'];
-
-		        if (is_null($ac)) throw new \wpsg\Exception(__('Keine Daten zum speichern des FlÃ€chenproduktes'));
-
-		        if (!isset($ac['price']) || !isset($ac['width']) || !isset($ac['length'])) throw new \wpsg\Exception(__('Es fehlen Daten zum speichern des FlÃ€chenproduktes'));
-
-                $oOrderProduct = wpsg_order_product::getInstance(intval($calc_product['order_product_id']));
-
-                $oOrderProduct->setMeta('wpsg_mod_printshop_price', wpsg_tf($ac['price']));
-                $oOrderProduct->setMeta('wpsg_mod_printshop_width', wpsg_tf($ac['width']));
-                $oOrderProduct->setMeta('wpsg_mod_printshop_length', wpsg_tf($ac['length']));
-                $oOrderProduct->setMeta('wpsg_mod_printshop_price_onepice', wpsg_tf($oProduct->getPrice($calc_product['product_key'])));
-                $oOrderProduct->setMeta('wpsg_mod_printshop_unit_price', sanitize_text_field($oProduct->getMeta('wpsg_mod_printshop_unit_price')));
-
-            }
-
-        }
-
-        public function downloadFileRedirect() {
-
-            $product_index = intval($_REQUEST['product_index']);
-            $file_index = intval($_REQUEST['file_index']);
-
-		    $file = wpsg_getStr($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'][$file_index]['tmpnam']);
-
-		    if (file_exists($file)) {
-
-		        wpsg_header::AUTO(
-		            $file,
-                    wpsg_getStr($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_printshop']['files'][$file_index]['file_name'])
-                );
-
-            } else {
-
-		        $this->shop->addFrontendError(__('Datei konnte nicht gefunden werden.', 'wpsg'));
-		        $this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_BASKET));
-
-            }
-
-        }
-
-        /**
-         * @param int $order_id
-         * @param int $product_index
-         * @param bool $create
-         * @return string
-         */
-        public function getUploadPath($order_id, $product_index, $create = true) {
-
-            $path = WPSG_PATH_UPLOADS.'wpsg_mod_printshop/files/'.$order_id.'/'.$product_index.'/';
-
-            if ($create) $this->shop->protectDirectory($path);
-
-            return $path;
-
-        }
-
-        public function getFiles($order_id, $product_index) {
-
-            $arFiles = [];
-            $path = $this->getUploadPath($order_id, $product_index, false);
-
-            if (file_exists($path)) {
-
-                foreach (scandir($path) as $f) {
-
-                    if (!in_array($f, ['.', '..', '.htaccess'])) {
-
-                        $arFiles[] = $path.$f;
-
-                    }
-
-                }
-
-            }
-
-		    return $arFiles;
-
-        }
-
-		/* Statische Funktionen */
-
-		public static function getInstance() {
-			
-			if (!isset(static::$instance)) static::$instance = new static;
-			
-			return static::$instance;
-			
-		}
-
-	}
-    
-    
Index: /mods/wpsg_mod_productfilter.class.php
===================================================================
--- /mods/wpsg_mod_productfilter.class.php	(revision 5261)
+++ /mods/wpsg_mod_productfilter.class.php	(revision 5261)
@@ -0,0 +1,250 @@
+<?php
+
+	/**
+	 * Mit diesem Modul kÃ¶nnen die Produkte im Frontend per Ajax gefiltert werden
+	 * @author daniel
+	 */
+	class wpsg_mod_productfilter extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 2;
+		var $id = 1850;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+				
+			parent::__construct();
+				
+			$this->name = __('Frontend Produktfilter', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht die Filter der Produkte im Frontend nach Produktattributen, Varianten und Preisen.', 'wpsg');
+		
+		} // public function __construct()
+		
+		public function settings_edit()
+		{
+			
+			$arSet = $this->shop->get_option('wpsg_mod_productfilter_show');
+
+			// Produktattribute?
+			if ($this->shop->hasMod('wpsg_mod_produktattribute'))
+			{
+				
+				$this->shop->view['wpsg_mod_productfilter']['arPA'] = $this->db->fetchAssoc("
+					SELECT * FROM `".WPSG_TBL_AT."` AS A 
+				");
+				
+				// Gesetzt?
+				if (wpsg_isSizedArray($arSet['pa']))
+				{
+					
+					foreach ($this->shop->view['wpsg_mod_productfilter']['arPA'] as $k => $pa)
+					{
+						
+						if (in_array($pa['id'], $arSet['pa']))
+						{
+						
+							$this->shop->view['wpsg_mod_productfilter']['arPA'][$k]['set'] = '1';
+							
+						}
+						
+					}
+					
+				}
+								
+			}
+
+			// Varianten
+			if ($this->shop->hasMod('wpsg_mod_varianten'))
+			{
+				
+				$arVariantenProducts = $this->db->fetchAssocField("
+					SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE LENGTH(P.`mod_varianten`) > 0  
+				", "id");
+				
+				if (wpsg_isSizedArray($arVariantenProducts))
+				{
+								
+					$this->shop->view['wpsg_mod_productfilter']['arVarianten'] = array();
+					
+					foreach ($arVariantenProducts as $product_id)
+					{
+						
+						$arVariInfo = $this->shop->callMod('wpsg_mod_varianten', 'loadVarianten', array($product_id));
+						
+						if (wpsg_isSizedArray($arVariInfo))
+						{
+							
+							foreach ($arVariInfo as $var_id => $var)
+							{
+								
+								if ($var['aktiv'] == '1')
+								{
+								
+									if (!array_key_exists($var['name'], $this->shop->view['wpsg_mod_productfilter']['arVarianten']))
+									{
+										
+										$this->shop->view['wpsg_mod_productfilter']['arVarianten'][$var['name']] = in_array($var['name'], $arSet['varianten']);
+										
+									}
+									
+								}
+								
+							}
+							
+						}
+						
+					}
+					
+				}
+				
+			}
+			
+			// Seiten
+			$pages = get_pages();
+				
+			$arPages = array(
+					'-1' => __('Neu anlegen und zuordnen', 'wpsg')
+			);
+				
+			foreach ($pages as $k => $v)
+			{
+				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
+			}
+			
+			$this->shop->view['wpsg_mod_productfilter']['pages'] = $arPages;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productfilter/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$arSave = array();
+			
+			// Produktattribute 
+			if ($this->shop->hasMod('wpsg_mod_produktattribute'))
+			{
+			
+				$arSave['pa'] = array();
+				if (wpsg_isSizedArray($_REQUEST['wpsg_mod_productfilter']['pa']))
+				{
+
+					foreach ($_REQUEST['wpsg_mod_productfilter']['pa'] as $k => $v)
+					{
+						
+						if ($v > 0) $arSave['pa'][] = $v;
+						
+					}
+					
+				}
+				
+			}
+			
+			// Varianten
+			if ($this->shop->hasMod('wpsg_mod_varianten'))
+			{
+				
+				$arSave['varianten'] = array();
+				$arSave['variationenCache'] = array();
+				
+				if (wpsg_isSizedArray($_REQUEST['wpsg_mod_productfilter']['varianten']))
+				{
+					
+					foreach ($_REQUEST['wpsg_mod_productfilter']['varianten'] as $k => $v)
+					{
+						
+						if ($v != '0') 
+						{
+														
+							$arSave['varianten'][] = $v;
+							
+							$arVariantenProducts = $this->db->fetchAssocField("
+								SELECT P.`id` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE LENGTH(P.`mod_varianten`) > 0  
+							", "id");
+							
+							foreach ($arVariantenProducts as $product_id)
+							{
+							
+								$this->addVariationen($product_id, $v, $arSave['variationenCache']);
+								
+							}
+							
+						}
+						
+					} 
+					
+				}
+				
+			} 
+			
+			// Seite fÃŒr Ãbersicht anlegen 
+			$this->shop->createPage(__('Produkte', 'wpsg'), 'wpsg_mod_productfilter_page', $_REQUEST['wpsg_mod_productfilter_page']);
+			 
+			$this->shop->update_option('wpsg_mod_productfilter_show', $arSave);
+			$this->shop->update_option('wpsg_mod_productfilter_pricefilter', $_REQUEST['wpsg_mod_productfilter_pricefilter']);
+						
+		} // public function settings_save()
+
+		public function load() 
+		{ 
+
+			require_once(dirname(__FILE__).'/mod_productfilter/wpsg_mod_productfilter_widget.class.php');
+			add_action('widgets_init', create_function('', 'return register_widget("wpsg_mod_productfilter_widget");'));
+			
+		} // public function load()
+		
+		/** Modulfunktionen */
+		
+		/**
+		 * LÃ€dt die Variationen der Variante fÃŒr die spÃ€tere Anzeige im Filter
+		 * @param $product_id
+		 * @param $var_name
+		 * @param $variationenCache
+		 */
+		function addVariationen($product_id, $var_name, &$variationenCache)
+		{
+			
+			$arVariInfo = $this->shop->callMod('wpsg_mod_varianten', 'loadVarianten', array($product_id));
+			
+			foreach ($arVariInfo as $var_id => $var)
+			{
+				
+				if ($var['aktiv'] == '1' && $var['name'] == $var_name)
+				{
+					
+					if (!array_key_exists($var_name, $variationenCache))
+					{
+						
+						$variationenCache[$var_name] = array(
+							'typ' => $var['typ'],
+							'vari' => array()
+						);	
+						
+					}
+					
+					foreach ((array)$var['vari'] as $vari_id => $vari)
+					{
+						
+						if (!in_array($vari['name'], $variationenCache[$var_name]['vari']))
+						{
+						
+							if ($vari['aktiv'] == '1') $variationenCache[$var_name]['vari'][] = $vari['name'];
+
+						}
+						
+					}
+					
+				}
+				
+			}
+			
+		} // function addVariationen($product_id, $var_name, &$variationenCache)
+		
+	} // class wpsg_mod_productfilter extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_productgroups.class.php
===================================================================
--- /mods/wpsg_mod_productgroups.class.php	(revision 8528)
+++ /mods/wpsg_mod_productgroups.class.php	(revision 5261)
@@ -5,11 +5,11 @@
 	 * @author daniel
 	 */
-	class wpsg_mod_productgroups extends wpsg_mod_basic
+	class wpsg_mod_productgroups extends wpsg_mod_basic 
 	{
-
+		
 		var $lizenz = 1;
 		var $id = 9;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=868';
-
+		
 		/**
 		 * Costructor
@@ -17,21 +17,21 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
-
+			
 			$this->name = __('Produktgruppen', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht die Zuordnung von Produkten zu Produktgruppen.', 'wpsg');
-
+									
 		} // public function __construct()
-
+		
 		public function install()
 		{
-
+			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
+					
 			/**
 			 * Produktgruppentabelle anlegen
-			 */
+			 */ 
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS_GROUP." (
 		   		id mediumint(9) NOT NULL AUTO_INCREMENT,
@@ -45,10 +45,9 @@
 		   		stock_value INT(11) NOT NULL,
 				lang TEXT NOT NULL,
-				pos INT (11) NOT NULL DEFAULT 0,
 		   		PRIMARY KEY  (id)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+   	   	 
    			dbDelta($sql);
-
+   			
    			/**
 		   	 * Tabelle fÃŒr die Sticky Produkte
@@ -61,110 +60,106 @@
 		   		PRIMARY KEY  (id)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+		   	
 		   	dbDelta($sql);
-
+			
 		} // public function install()
-
+		
 		public function init()
 		{
-
-			require_once(WPSG_PATH_MOD.'mod_productgroups/wpsg_productgroup.php');
-
+			
 			$role_object = get_role('administrator');
 			$role_object->add_cap('wpsg_productgroup');
-
+			
 		} // public function init()
-
-		public function settings_edit()
-		{
-
+		
+		public function settings_edit() 
+		{
+			
 			$pages = get_pages();
-
+			
 			$arPages = array(
 				'-1' => __('Nicht zugeordnet', 'wpsg')
 			);
-
+			
 			foreach ($pages as $k => $v)
 			{
 				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
 			}
-
-			$this->shop->view['pages'] = $arPages;
-
+			
+			$this->shop->view['pages'] = $arPages;			
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
-		public function settings_save() {
-			
-			$this->shop->update_option('wpsg_productgroups_page', $_REQUEST['wpsg_productgroups_page'], false, false, WPSG_SANITIZE_PAGEID);
-			$this->shop->update_option('wpsg_productgroups_page_layout', $_REQUEST['wpsg_productgroups_page_layout'], false, false, WPSG_SANITIZE_INT);
-            $this->shop->update_option('wpsg_productgroups_order', $_REQUEST['wpsg_productgroups_order'], false, false, WPSG_SANITIZE_VALUES, ['id', 'alphabetisch', 'buyed', 'erstellungsdatum', 'preis']);
-			$this->shop->update_option('wpsg_mod_productgroups_order_filter', $_REQUEST['wpsg_mod_productgroups_order_filter'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_productgroups_productindex', $_REQUEST['wpsg_mod_productgroups_productindex'], false, false, WPSG_SANITIZE_CHECKBOX);
-						
+		
+		public function settings_save() 
+		{
+			
+			$this->shop->update_option('wpsg_productgroups_page', $_REQUEST['wpsg_productgroups_page']);
+			$this->shop->update_option('wpsg_productgroups_order', $_REQUEST['wpsg_productgroups_order']);
+			
 		} // public function settings_save()
-
-		public function admin_setcapabilities() {
-
+		
+		public function admin_setcapabilities() { 
+			
 			$this->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/admin_setcapabilities.phtml');
-
+			
 		} // public function admin_setcapabilities()
-
-		public function wpsg_add_pages($default_page)
-		{
-
-			add_submenu_page($default_page, __("Produktgruppen", "wpsg"), __("Produktgruppen", "wpsg"), 'wpsg_productgroup', 'wpsg-Productgroups', array($this, 'dispatch'));
-
+		
+		public function wpsg_add_pages()
+		{
+						
+			add_submenu_page('wpsg-Admin', __("Produktgruppen", "wpsg"), __("Produktgruppen", "wpsg"), 'wpsg_productgroup', 'wpsg-Productgroups', array($this, 'dispatch'));
+			
 		} // public function wpsg_add_pages()
-
-		public function produkt_del($produkt_id)
-		{
+						
+		public function produkt_del($produkt_id) 
+		{ 
 
 			$this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_STICKY."` WHERE `produkt_id` = '".wpsg_q($produkt_id)."'");
-
+			
 		} // public function produkt_del($produkt_id)
-
+		
 		public function shortcode($atts)
 		{
 
 			// [wpshopgermany produktgruppe="1" sortierung="id" richtung="asc"]
-
+			
 			$pg_id = $atts['produktgruppe'];
 			$pg_template = $this->db->fetchOne("SELECT `template_file` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($pg_id)."'");
-
+			
 			$arSortierung = Array('id', 'name', 'anr', 'preis');
 			$arDirection = Array('asc', 'desc');
-
+			
 			$strOrder = 'sticky DESC, ';
-
+			
 			if (isset($atts['sortierung']) && in_array($atts['sortierung'], $arSortierung))
 			{
-
+					
 				$strOrder .= 'P.`'.wpsg_q($atts['sortierung']).'`';
-
+				
 				if (isset($atts['richtung']) && in_array($atts['richtung'], $arDirection))
 				{
-
+					
 					$strOrder .= ' '.wpsg_q($atts['richtung']);
-
+					
 				}
 				else
 				{
-
+					
 					$strOrder .= ' ASC';
-
-				}
-
+					
+				}
+								
 			}
 			else
 			{
-
+				
 				$strOrder .= 'P.`id` ASC';
-
-			}
-
+				
+			}
+			
 			$arProduktIDs = $this->db->fetchAssocField("
-				SELECT
+				SELECT 
 					P.`id`,
 					IF (
@@ -173,66 +168,89 @@
 						'0'
 					) AS sticky
-				FROM
+				FROM 
 					`".WPSG_TBL_PRODUCTS."` AS P
-				WHERE
-					P.`pgruppe` = '".wpsg_q($pg_id)."' AND
+				WHERE 
+					P.`pgruppe` = '".wpsg_q($pg_id)."' AND 
 					P.`deleted` != '1' AND 
-					P.`disabled` != '1' AND 
-					P.`lang_parent` <= 0 
+					P.`lang_parent` <= 0
 				ORDER BY
 					".$strOrder."
 			");
-
+						
 			if ($pg_template !== '0' && $pg_template !== '') $template = $pg_template; else $template = false;
-
-			$strReturn = '';
+			
+			$strReturn = '';			
 			foreach ((array)$arProduktIDs as $p_id)
 			{
-
+				
 				//if ($pg_template !== '0' && $pg_template !== '') $template = $pg_template; else $template = $this->db->fetchOne("SELECT `ptemplate_file` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($p_id)."'");
-
+				
 				$strReturn .= $this->shop->renderProdukt($p_id, $template);
-
-			}
-
+				
+			}
+			
 			return $strReturn;
-
+			
 		} // public function shortcode($atts)
-
+		
+		/**
+		 * Integriert den Produktgruppenfilter in die Ãbersicht der Produkte (Produkte/index)
+		 */
+		public function produkt_index_filter()
+		{
+
+			$this->shop->view['productgroups'] = $this->db->fetchAssoc("
+				SELECT 
+					(SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`pgruppe` = PG.`id` AND P.`deleted` != '1' ".$GLOBALS['wpsg_produkt_index_query_where'].") AS countProdukte,
+					PG.*
+				FROM	
+					`".WPSG_TBL_PRODUCTS_GROUP."` AS PG
+				WHERE
+					PG.`deleted` != '1'
+				HAVING
+					countProdukte > 0
+			");
+			
+			$this->shop->view['countProducts'] = $this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`deleted` != '1' AND P.`lang_parent` = 0 ".$GLOBALS['wpsg_produkt_index_query_where']);
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/produkt_index_filter.phtml');
+			
+		} // public function produkt_index_filter()
+		
 		/**
 		 * Integriert den Namen der Gruppe in das Produktarray
 		 */
-		public function loadProduktArray(&$arrProdukt) {
-
+		public function loadProduktArray(&$arrProdukt)
+		{
+			
 			$arrGrp = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($arrProdukt['pgruppe'])."'");
-
-			if (!wpsg_isSizedArray($arrGrp)) return;
-
-			if ($this->shop->isOtherLang()) {
-
+			
+			if ($this->shop->isOtherLang())
+			{
+				
 				$lang = @unserialize($arrGrp['lang']);
-
-				if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguageCode()]['name'])) $arrGrp['name'] = $lang[$this->shop->getCurrentLanguageCode()]['name'];
-
-			}
-
+				
+				if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguage()]['name'])) $arrGrp['name'] = $lang[$this->shop->getCurrentLanguage()]['name'];
+				
+			}
+			
 			$arrProdukt['pgruppe_name'] = $arrGrp['name'];
-
+			
 			// ?? Scheint zu funktionieren
-			$arrProdukt['rabatt'] = $arrGrp['rabatt'];
-
+			$arrProdukt['rabatt'] = $arrGrp['rabatt'];	
+		
 		}
-
-		public function produkt_save(&$produkt_id)
-		{
-
+		
+		public function produkt_save(&$produkt_id) 
+		{
+				
 			$sticky_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_STICKY."` WHERE `produkt_id` = '".wpsg_q($produkt_id)."'");
 
 			$data = array(
 				'produkt_id' => wpsg_q($produkt_id),
-				'von' => wpsg_q(strtotime(wpsg_xss($_REQUEST['wpsg_productgroup_sticky_von']))),
-				'bis' => wpsg_q(strtotime(wpsg_xss($_REQUEST['wpsg_productgroup_sticky_bis'])))
+				'von' => wpsg_q(strtotime($_REQUEST['wpsg_productgroup_sticky_von'])),
+				'bis' => wpsg_q(strtotime($_REQUEST['wpsg_productgroup_sticky_bis']))
 			);
-
+			
 			if ($sticky_id > 0)
 			{
@@ -243,38 +261,39 @@
 				$this->db->ImportQuery(WPSG_TBL_PRODUCTS_STICKY, $data);
 			}
-
+			
 			$data = array(
 				'pgruppe' => wpsg_q($_REQUEST['wpsg_productgroup'])
 			);
-
+			
 			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($produkt_id)."'");
-
+			
 		} // public function produkt_save($produkt_id)
-
-		public function produkt_copy(&$produkt_id, &$copy_id)
-		{
-
+		
+		public function produkt_copy(&$produkt_id, &$copy_id) 
+		{ 
+			
 			$arSticky = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_STICKY."` WHERE `produkt_id` = '".wpsg_q($produkt_id)."'");
-
+			
 			foreach ((array)$arSticky as $s)
 			{
-
+				
 				unset($s['id']);
 				$s['produkt_id'] = wpsg_q($copy_id);
-
+				
 				$this->db->ImportQuery(WPSG_TBL_PRODUCTS_STICKY, $s);
-
-			}
-
+				
+			}
+			
 		} // public function produkt_copy(&$produkt_id, &$copy_id)
-
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-
+		
+		public function produkt_edit_sidebar(&$produkt_data)
+		{
+			
 			if (isset($_REQUEST['wpsg_lang'])) return;
-
+			
+			$this->shop->view['wpsg_mod_productgroups']['produkt_data'] = $produkt_data;
 			$this->shop->view['wpsg_mod_productgroups']['data'] = array();
-			$this->shop->view['wpsg_mod_productgroups']['data'][0] = __('Nicht zugewiesen.', 'wpsg');
-
+			$this->shop->view['wpsg_mod_productgroups']['data'][0] = __('Nicht zugewiesen.', 'wpsg'); 
+			
 			// Kein Array Merge ! Da indexe gelÃ¶scht werden
 			$groups_db = $this->db->fetchAssocField("
@@ -289,39 +308,21 @@
 			", "id", "name");
 			$this->shop->view['wpsg_mod_productgroups']['data'] = array_diff_key($this->shop->view['wpsg_mod_productgroups']['data'], $groups_db) + $groups_db;
-
-			if (wpsg_isSizedInt($product_data['id']))
-			{
-
-				$this->shop->view['wpsg_mod_productgroups']['produkt_data'] = $product_data;
-
-				$sticky_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_STICKY."` WHERE `produkt_id` = '".wpsg_q($product_data['id'])."'");
-
-				if (($sticky_data['von']??0) > 0) $this->shop->view['wpsg_mod_productgroups']['sticky_von'] = date('d.m.Y', $sticky_data['von']);
-				if (($sticky_data['bis']??0) > 0) $this->shop->view['wpsg_mod_productgroups']['sticky_bis'] = date('d.m.Y', $sticky_data['bis']);;
-
-			}
-
-			$product_content['wpsg_mod_productgroups'] = array(
-				'title' => __('Produktgruppen', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/produkt_addedit_sidebar.phtml', false)
-			);
-
-		} // public function produkt_edit_sidebar(&$product_content, &$produkt_data)
-
-		public function content_filter(&$content) {
-
-		    $id = wpsg_get_the_id();
-
-			if ($id <= 0 || $id != $this->shop->get_option('wpsg_productgroups_page')) return;
-
-            if ($this->shop->get_option('wpsg_productgroups_page_layout') === '1') {
-
-                $content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/show_2.phtml', false);
-
-                return;
-
-            }
-
-			if (isset($_REQUEST['show']) && $_REQUEST['show'] > 0) {
+			
+			$sticky_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_STICKY."` WHERE `produkt_id` = '".wpsg_q($produkt_data['id'])."'");
+						
+			if ($sticky_data['von'] > 0) $this->shop->view['wpsg_mod_productgroups']['sticky_von'] = date('d.m.Y', $sticky_data['von']);
+			if ($sticky_data['bis'] > 0) $this->shop->view['wpsg_mod_productgroups']['sticky_bis'] = date('d.m.Y', $sticky_data['bis']);
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/produkt_edit_sidebar.phtml');
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
+				
+		public function content_filter(&$content) 
+		{
+			
+			if (get_the_id() <= 0 || get_the_id() != $this->shop->get_option('wpsg_productgroups_page')) return;
+
+			if ($_REQUEST['show'] > 0)
+			{
 
 				$arrGrp = $this->db->fetchRow("
@@ -334,20 +335,23 @@
 						`deleted` = '0'
 					ORDER BY
-						`name`
+						`name`			
 				");
 
-				if ($this->shop->isOtherLang()) {
-
+				if ($this->shop->isOtherLang())
+				{
+					
 					$lang = @unserialize($arrGrp['lang']);
-
-					if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguageCode()]['name'])) $arrGrp['name'] = $lang[$this->shop->getCurrentLanguageCode()]['name'];
-
-				}
-
+					
+					if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguage()]['name'])) $arrGrp['name'] = $lang[$this->shop->getCurrentLanguage()]['name']; 
+					
+				}
+	
 				$strOrder = "sticky DESC";
-				if ($this->shop->get_option('wpsg_productgroups_order') != '') {
-
-					switch ($this->shop->get_option('wpsg_productgroups_order')) {
-
+				if ($this->shop->get_option('wpsg_productgroups_order') != '')
+				{
+							
+					switch ($this->shop->get_option('wpsg_productgroups_order'))
+					{
+									
 						case 'id':
 							$strOrder .= ", P.`id` ASC ";
@@ -355,8 +359,8 @@
 						case 'alphabetisch':
 							$strOrder .= ", P.`name` ASC ";
-							break;
+							break;		
 						case 'buyed':
 							$strOrder .= ", `buyed` DESC ";
-							break;
+							break;	
 						case 'erstellungsdatum':
 							$strOrder .= ", `cdate` DESC ";
@@ -364,44 +368,62 @@
 						case 'preis':
 							$strOrder .= ", `preis` DESC ";
-							break;
-
+							break;			
+									
 					}
-
-				}
-
+								
+				}
+				 
 				if ($strOrder != "") $strOrder = " ORDER BY ".$strOrder;
-
-				$arrProdukte = $this->shop->db->fetchAssoc("SELECT
+				
+				$arrProdukte = $this->shop->db->fetchAssoc("SELECT 
 						P.`id`,
-						(IF('".time()."' > PS.`von` AND '".time()."' < PS.`bis`, 1, 0)) AS sticky,
-						(SELECT SUM(`menge`) FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`p_id` = P.`id`) AS buyed
-					FROM
+						(IF('".time()."' > PS.`von` AND '".time()."' < PS.`bis`, 1, 0)) AS sticky, 
+						(SELECT SUM(`menge`) FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`p_id` = P.`id`) AS buyed 
+					FROM 
 						`".WPSG_TBL_PRODUCTS."` AS P
 							LEFT JOIN `".WPSG_TBL_PRODUCTS_STICKY."` AS PS ON (P.`id` = PS.`produkt_id`)
-					WHERE
-						P.`pgruppe` = '".wpsg_q($arrGrp['id'])."' AND
-						P.`lang_parent` = 0 AND  
-						P.`disabled` != '1' AND 
-						P.`deleted` = '0'
+					WHERE 
+						P.`pgruppe` = '".wpsg_q($arrGrp['id'])."' AND 
+						P.`deleted` = '0' 
 					".$strOrder."
 				");
 
 				// Bilder der Produkte
-				foreach ($arrProdukte as $k => $p) {
-
+				foreach ($arrProdukte as $k => $p)
+				{
+					
 					$arrProdukte[$k] = $this->shop->loadProduktArray($p['id']);
-
-					$arrProdukte[$k]['bilder'] = $this->shop->imagehandler->getAttachmentIDs($p['id']);
-					if (!wpsg_isSizedArray($arrProdukte[$k]['bilder'])) $arrProdukte[$k]['bilder'] = array();
-
+											
+					$arFiles = array();
+						
+					$dir = $this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($this->shop->getProduktId($p['id'])));
+						
+					//$dir = WP_CONTENT_DIR.'/uploads/produktbilder/'.$p['id']."/";
+						
+					$handle = opendir($dir);
+		 
+					while($filename = readdir($handle))
+			   		{
+			   				
+			   			$file = $dir.$filename; 
+			   			if (is_file($file) && $filename != "." && $filename != "..")
+			   			{
+			   				$arFiles[] = $filename;
+			   			}
+			   				   				   				   				   				
+			   		}
+			   		$arrProdukte[$k]['bilder'] = $arFiles;		   			
+							
 				}
 
 				$this->shop->view['data'] = $arrGrp;
 				$this->shop->view['data']['produkte'] = $arrProdukte;
-
+								
 				$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/show.phtml', false);
-
-			} else {
-
+				
+			}
+			else 
+			{
+				
 				$arrGrp = $this->db->fetchAssoc("
 					SELECT
@@ -412,23 +434,27 @@
 						`deleted` = '0'
 					ORDER BY
-						`name`
+						`name`			
 				");
-
-				foreach ($arrGrp as $k => $pg) {
-
-					if ($this->shop->isOtherLang()) {
-
+				
+				foreach ($arrGrp as $k => $pg)
+				{
+					
+					if ($this->shop->isOtherLang())
+					{
+						
 						$lang = @unserialize($pg['lang']);
-
-						if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguageCode()]['name'])) $pg['name'] = $lang[$this->shop->getCurrentLanguageCode()]['name'];
-
+						
+						if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguage()]['name'])) $pg['name'] = $lang[$this->shop->getCurrentLanguage()]['name'];
+						
 					}
-
+					
 					$strOrder = "sticky DESC";
-
-					if ($this->shop->get_option('wpsg_productgroups_order') != '')	{
-
-						switch ($this->shop->get_option('wpsg_productgroups_order')) {
-
+					
+					if ($this->shop->get_option('wpsg_productgroups_order') != '')
+					{
+								
+						switch ($this->shop->get_option('wpsg_productgroups_order'))
+						{
+									
 							case 'id':
 								$strOrder .= ", P.`id` ASC ";
@@ -436,8 +462,8 @@
 							case 'alphabetisch':
 								$strOrder .= ", P.`name` ASC ";
-								break;
+								break;		
 							case 'buyed':
 								$strOrder .= ", `buyed` DESC ";
-								break;
+								break;	
 							case 'erstellungsdatum':
 								$strOrder .= ", `cdate` DESC ";
@@ -445,62 +471,78 @@
 							case 'preis':
 								$strOrder .= ", `preis` DESC ";
-								break;
-
+								break;			
+									
 						}
-
+								
 					}
-
+					
 					if ($strOrder != "") $strOrder = " ORDER BY ".$strOrder;
-
-					$arrProdukte = $this->db->fetchAssoc("SELECT
-															P.`id`,
-															(IF('".time()."' > PS.`von` AND '".time()."' < PS.`bis`, 1, 0)) AS sticky,
-															(SELECT SUM(`menge`) FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`p_id` = P.`id`) AS buyed
-														FROM
-															`".WPSG_TBL_PRODUCTS."` AS P
-																	LEFT JOIN `".WPSG_TBL_PRODUCTS_STICKY."` AS PS ON (P.`id` = PS.`produkt_id`)
-														WHERE
-															P.`pgruppe` = '".wpsg_q($pg['id'])."' AND
-															P.`lang_parent` = 0  AND
-															P.`disabled` != '1' AND
-															P.`deleted` = '0'
+				 
+					$arrProdukte = array();
+					$arrProdukte = $this->db->fetchAssoc("SELECT 
+															P.`id`, 
+															(IF('".time()."' > PS.`von` AND '".time()."' < PS.`bis`, 1, 0)) AS sticky, 
+															(SELECT SUM(`menge`) FROM `".WPSG_TBL_ORDERPRODUCT."` AS OP WHERE OP.`p_id` = P.`id`) AS buyed 
+														FROM 
+															`".WPSG_TBL_PRODUCTS."` AS P		
+																	LEFT JOIN `".WPSG_TBL_PRODUCTS_STICKY."` AS PS ON (P.`id` = PS.`produkt_id`)					
+														WHERE 
+															P.`pgruppe` = '".wpsg_q($pg['id'])."' AND 
+															P.`deleted` = '0' 
 														".$strOrder."
 													");
-
+					
 					// Bilder der Produkte
 					foreach ($arrProdukte as $k2 => $p)
 					{
-
+						
 						$arrProdukte[$k2] = $this->shop->loadProduktArray($p['id']);
-
-						$arrProdukte[$k2]['bilder'] = $this->shop->imagehandler->getAttachmentIDs($p['id']);
-						if (!wpsg_isSizedArray($arrProdukte[$k2]['bilder'])) $arrProdukte[$k2]['bilder'] = array();
-
+						
+						$arFiles = array();
+						
+						$dir = $this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($this->shop->getProduktId($p['id'])));
+						
+						$handle = opendir($dir);
+		 				
+						while($filename = readdir($handle))
+			   			{
+			   				
+			   				$file = $dir.$filename; 
+			   				if (is_file($file) && $filename != "." && $filename != "..")
+			   				{
+			   					$arFiles[] = $filename;
+			   				}
+			   				   				   				   				   				
+			   			}
+			   			
+			   			$arrProdukte[$k2]['bilder'] = $arFiles;
 					}
 					$this->shop->view['data'][$pg['id']]['produkte'] = $arrProdukte;
 					$this->shop->view['data'][$pg['id']]['pgruppe_name'] = $pg['name'];
-
-				}
-
+					
+				}
+				
 				$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/list.phtml', false);
-
-			}
-
+				
+			}
+			
 			return -2;
-
+			
 		}
-
-		public function wpsg_mod_export_loadFields(&$arFields)
-		{
+		
+		public function wpsg_mod_export_loadFields(&$arFields) 
+		{ 
 
 			$arFields[20]['fields']['pgruppe_id'] = __('Produktgruppe ID', 'wpsg');
 			$arFields[20]['fields']['pgruppe_name'] = __('Produktgruppe Name', 'wpsg');
-
+			
 		} // public function wpsg_mod_export_loadFields(&$arFields)
-
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-
-			if (wpsg_isSizedInt($o_id) && !wpsg_isSizedInt($p_id)) {
-
+		
+		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) 
+		{ 
+ 
+			if (wpsg_isSizedInt($o_id) && !wpsg_isSizedInt($p_id))
+			{
+				
 				$product_db = $this->db->fetchRow("
 					SELECT
@@ -508,5 +550,5 @@
 						GROUP_CONCAT(PG.`name`) AS `pgruppe_name`
 					FROM
-						`".WPSG_TBL_ORDERPRODUCT."` AS OP
+						`".WPSG_TBL_ORDERPRODUCT."` AS OP 
 							LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (OP.`p_id` = P.`id`)
 							LEFT JOIN `".WPSG_TBL_PRODUCTS_GROUP."` AS PG ON (PG.`id` = P.`pgruppe`)
@@ -516,318 +558,220 @@
 						P.`id`
 				");
-
-			} else if (wpsg_isSizedInt($p_id)) {
-
+				 				
+			}
+			else if (wpsg_isSizedInt($p_id))
+			{
+				
 				$product_db = $this->shop->cache->loadProduct($p_id);
 				$product_db['pgruppe_name'] = $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($product_db['pgruppe'])."' ");
-
-			} else {
-				
+				
+			}
+			else
+			{
 				return;
-				
-			}
-
-			switch ($field_value) {
-
+			}
+			
+			switch ($field_value)
+			{
+				
 				case 'pgruppe_id': $return = $product_db['pgruppe']; break;
 				case 'pgruppe_name': $return = $product_db['pgruppe_name']; break;
-
-			}
-
-		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator)
-
+				
+			}
+			
+		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator)
+		
 		/* -- */
-
+		
 		/**
 		 * Gibt einen Array mit allen Produktgruppen zurÃŒck und beachtet die Ãbersetzung
 		 */
-		public function getAllProductGroups($withOrder = false)
-		{
-			
-			if ($withOrder === true) {
-
-				$strQueryWHERE = "";
-				
-				if ($this->shop->get_option('wpsg_showincompleteorder') !== '1') {
-					
-					$strQueryWHERE .= " AND O.`status` != '".wpsg_q(wpsg_ShopController::STATUS_UNVOLLSTAENDIG)."' ";
-					
-				}
-				 
-				$strQuery = "
-					SELECT
-						PG.`id`, PG.`name`
-					FROM
-						`".WPSG_TBL_PRODUCTS_GROUP."` AS PG
-							LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`pgruppe` = PG.`id`)
-							LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (OP.`p_id` = P.`id`)
-							LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON (O.`id` = OP.`o_id`)
-					WHERE
-						PG.`deleted` != '1' AND
-						O.`id` > 0 
-						".$strQueryWHERE."
-					GROUP BY
-						PG.`id`
-					ORDER BY
-						PG.`name` ASC
-				";
-				 
-				$arPG = $this->db->fetchAssocField($strQuery, "id", "name");
-				
-			} else {
-				
-				$arPG = $this->db->fetchAssocField("
-					SELECT
-						PG.`id`, PG.`name`
-					FROM
-						`".WPSG_TBL_PRODUCTS_GROUP."` AS PG
-					WHERE
-						PG.`deleted` != '1'
-					ORDER BY
-						PG.`name` ASC
-				", "id", "name");
-				
-			}
-
+		public function getAllProductGroups()
+		{
+			
+			$arPG = $this->db->fetchAssocField("
+				SELECT
+					PG.`id`, PG.`name`
+				FROM
+					`".WPSG_TBL_PRODUCTS_GROUP."` AS PG
+				WHERE
+					PG.`deleted` != '1'
+				ORDER BY
+					PG.`name` ASC	
+			", "id", "name");
+			
 			if ($this->shop->isOtherLang())
 			{
-
+				
 				foreach ($arPG as $k => $pg)
 				{
-
+					
 					$lang = @unserialize($pg['lang']);
-
-					if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguageCode()]['name'])) $arPG['name'] = $lang[$this->shop->getCurrentLanguageCode()]['name'];
-
-				}
-
-			}
-
+					
+					if (is_array($lang) && wpsg_isSizedString($lang[$this->shop->getCurrentLanguage()]['name'])) $arPG['name'] = $lang[$this->shop->getCurrentLanguage()]['name'];
+					
+				}
+				
+			}
+						
 			return $arPG;
-
+			
 		} // public function getAllProductGroups()
-
-		public function dispatch() {
-
-			if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "add") {
-				
-				wpsg_checkNounce('Productgroups', '', ['wpsg_mod_action' => 'add']);
-				
-				$this->addAction();
-				
-			} else if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "edit") {
-				
-				wpsg_checkNounce('Productgroups', '', ['wpsg_mod_action' => 'edit', 'edit_id' => $_REQUEST['edit_id']]);
-				
+		
+		public function dispatch()
+		{
+			 
+			if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "add")
+			{
+				$this->addAction();	
+			}
+			else if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "edit")
+			{
 				$this->editAction();
-				
-			} else if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "del") {
-				
-				wpsg_checkNounce('Productgroups', '', ['wpsg_mod_action' => 'del', 'edit_id' => $_REQUEST['edit_id']]);
-				
+			}
+			else if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "del")
+			{
 				$this->delAction();
-				
-			} else if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "save") {
-				
-				\check_admin_referer('wpsg-productgroup-save-'.wpsg_getInt($_REQUEST['edit_id']));
-				
+			}
+			else if (isset($_REQUEST['wpsg_mod_action']) && $_REQUEST['wpsg_mod_action'] == "save")
+			{
 				$this->saveAction();
-				
-			} else {
-				$this->indexAction();
-			}
-
+			}
+			else
+			{	
+				$this->indexAction();				
+			}
+			
 		} // public function dispatch()
-
-		public function indexAction() {
-			
-			if (isset($_REQUEST['submit-button'])) check_admin_referer('wpsg-mod-productgroups-search');
-
-			$nPerPage = 25;
-			if ($nPerPage <= 0) $nPerPage = 10;
-
-			$this->shop->view['hasFilter'] = false;
-			$this->shop->view['arFilter'] = array(
-				'order' => 'cdate',
-				'ascdesc' => 'ASC',
-				'status' => '0',
-				'page' => '1'
-			);
-			$this->shop->view['arData'] = array();
-			$this->shop->view['pages'] = 1;
-
-			if (wpsg_isSizedArray($_REQUEST['filter'])) {
-
-				$this->shop->view['arFilter'] = $_REQUEST['filter'];
-				$this->shop->view['hasFilter'] = true;
-
-			} else if (wpsg_isSizedArray($_SESSION['wpsg']['backend']['customergroup']['arFilter'])) {
-
-				//$this->shop->view['arFilter'] = $_SESSION['wpsg']['backend']['customer']['arFilter'];
-
-			}
-
-			$this->shop->view['countAll'] = wpsg_productgroup::count($this->shop->view['arFilter']);
-
-			if (wpsg_isSizedInt($_REQUEST['seite'])) $this->shop->view['arFilter']['page'] = $_REQUEST['seite'];
-
-			$this->shop->view['pages'] = ceil($this->shop->view['countAll'] / $nPerPage);
-			if ($this->shop->view['arFilter']['page'] <= 0 || $this->shop->view['arFilter']['page'] > $this->shop->view['pages']) $this->shop->view['arFilter']['page'] = 1;
-
-			$this->shop->view['arFilter']['limit'] = array(($this->shop->view['arFilter']['page'] - 1) * $nPerPage, $nPerPage);
-
-			// Filter speichern
-			$_SESSION['wpsg']['backend']['customergroup']['arFilter'] = $this->shop->view['arFilter'];
-
-			$this->shop->view['arData'] = wpsg_productgroup::find($this->shop->view['arFilter']);
-
+		
+		public function indexAction()
+		{
+
+			$this->shop->view['data'] = $this->db->fetchAssoc("
+				SELECT
+					PG.*,
+					(SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`pgruppe` = PG.`id` AND P.`deleted` != '1') AS countProdukte
+				FROM
+					`".WPSG_TBL_PRODUCTS_GROUP."` AS PG
+				WHERE
+					PG.`deleted` != '1'
+				ORDER BY
+					PG.`id` ASC
+			");
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/index.phtml');
-
+			
 		} // public function indexAction()
-
-		public function delAction() {
+		
+		public function delAction()
+		{
 			
 			$this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 			$this->shop->addBackendMessage(__('Produktgruppe wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
+			
 			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=index');
-
+			
 		} // public function delAction()
-
-		public function saveAction() {
-						
-			$arTemplateFiles = [0] + $this->shop->loadProduktTemplates(true);
-			
-			$data = [];
-			
-			wpsg_checkRequest('name', [WPSG_SANITIZE_TEXTFIELD], __('Produktgruppenname'), $data);
-			wpsg_checkRequest('pos', [WPSG_SANITIZE_INT], __('Position'), $data);
-			wpsg_checkRequest('template_file', [WPSG_SANITIZE_VALUES, $arTemplateFiles], __('Template'), $data);
-			wpsg_checkRequest('infopage', [WPSG_SANITIZE_PAGEID], __('1nfo Seite'), $data);
-			
-			if ($this->shop->hasMod('wpsg_mod_stock')) {
-				
-				wpsg_checkRequest('stock_value', [WPSG_SANITIZE_INT, ['allowEmpty' => true]], __('Bestand'), $data, $_REQUEST['wpsg_mod_productgroups']['stock_value']);
-				wpsg_checkRequest('stock_aktiv', [WPSG_SANITIZE_CHECKBOX], __('Lagerbestand zÃ€hlen'), $data, $_REQUEST['wpsg_mod_productgroups']['stock_aktiv']);
-				
-			}
-	 
-			$arLang = [];
-			
-			if (wpsg_isSizedArray($_REQUEST['lang'])) {
-				
-				foreach ($_REQUEST['lang'] as $k => $l) {
-					
-					if (wpsg_checkInput($l, WPSG_SANITIZE_TEXTFIELD) && wpsg_checkInput($k, WPSG_SANITIZE_INT)) {
-					
-						$arLang[$k] = wpsg_xss($l);
-						
-					} 
-					
-				}
-				
-				$data['lang'] = wpsg_q(serialize($arLang));
-				
-			}
-
-			if (wpsg_isSizedArray($data)) {
-			
-				if (wpsg_getStr($_REQUEST['edit_id']) > 0) {
-
-					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_GROUP, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
-					$this->shop->addBackendMessage(__('Produktgruppe erfolgreich gespeichert.', 'wpsg'));
-	
-				} else {
-	
-					$data['cdate'] = "NOW()";
-					
-					$_REQUEST['edit_id'] = $this->db->ImportQuery(WPSG_TBL_PRODUCTS_GROUP, $data);
-					
-					$this->shop->addBackendMessage(__('Produktgruppe erfolgreich angelegt.', 'wpsg'));
-	
-				}
-				
-			}
-
-            $oProductgroup = wpsg_productgroup::getInstance(intval($_REQUEST['edit_id']));
-            $oProductgroup->setImage(intval($_REQUEST['image']??0));
-
+		
+		public function saveAction()
+		{
+
+			$data = array(
+				'name' => wpsg_q($_REQUEST['wpsg_mod_productgroups_name']),
+				'template_file' => wpsg_q($_REQUEST['wpsg_mod_productgroups_template']),
+				'infopage' => wpsg_q($_REQUEST['wpsg_mod_productgroups_infopage']),
+				'stock_aktiv' => wpsg_q($_REQUEST['wpsg_mod_productgroups']['stock_aktiv']),
+				'stock_value' => wpsg_q($_REQUEST['wpsg_mod_productgroups']['stock_value']),
+				'lang' => wpsg_q(serialize($_REQUEST['lang']))			
+			);
+			
+			if ($_REQUEST['edit_id'] > 0)
+			{
+				
+				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_GROUP, $data, "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+				$this->shop->addBackendMessage(__('Produktgruppe erfolgreich gespeichert.', 'wpsg'));
+				
+			}
+			else
+			{
+				
+				$data['cdate'] = "NOW()";
+				$_REQUEST['edit_id'] = $this->db->ImportQuery(WPSG_TBL_PRODUCTS_GROUP, $data);
+				$this->shop->addBackendMessage(__('Produktgruppe erfolgreich angelegt.', 'wpsg'));
+				
+			}
+						
 			$this->shop->callMods('wpsg_mod_productgroups_save', array($_REQUEST['edit_id']));
-
+			
 			if (isset($_REQUEST['submit_index'])) $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=index');
-			else $this->shop->redirect(wpsg_admin_url('Productgroups', '', ['wpsg_mod_action' => 'edit', 'edit_id' => $_REQUEST['edit_id']]));
-
+			else $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=edit&edit_id='.$_REQUEST['edit_id']);
+			
 		} // public function saveAction()
-
-		public function editAction() {
-
+		
+		public function editAction()
+		{
+			
 			$this->shop->view['data'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 			$this->shop->view['data']['lang'] = @unserialize($this->shop->view['data']['lang']);
 			if (!is_array($this->shop->view['data']['lang'])) $this->shop->view['data']['lang'] = array();
 			$this->shop->view['languages'] = $this->shop->getStoreLanguages();
-
+			
 			$this->addeditAction();
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/add.phtml');
-
+			
 		} // public function editAction()
-
+		
 		public function addAction()
 		{
-
+			
 			$this->addeditAction();
-			$this->shop->view['data'] = array(
-				'name' => '',
-				'template_file' => '',
-				'infopage' => ''
-			);
-
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/add.phtml');
-
+			
 		} // public function addAction()
-
+		
 		public function addeditAction()
 		{
-
+			
 			$this->shop->view['templates'] = array();
-			$this->shop->view['templates'][0] = __('Individuelle Produkttemplates', 'wpsg');
+			$this->shop->view['templates'][0] = __('Individuelle Produkttemplates', 'wpsg'); 
 			$this->shop->view['templates'] = wpsg_array_merge($this->shop->view['templates'], $this->shop->loadProduktTemplates(true));
-
-			$pages = get_pages();
+			
+			$pages = get_pages();			
 			$arPages = array(
 				'-1' => __('Nicht zugeordnet', 'wpsg')
-			);
+			);			
 			foreach ($pages as $k => $v)
 			{
 				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
-			}
-			$this->shop->view['pages'] = $arPages;
-
+			}			
+			$this->shop->view['pages'] = $arPages;	
+			
 		} // public function addeditAction()
-
+		 		
 		public function checkPgroupsBestand($produkt, &$menge, &$menge_neu)
 		{
-
-			if (preg_match('/(pv_)|(\|(.*))/', $produkt['id']))
-			{
-				$pID = preg_replace('/(pv_)|(\|(.*))/', '', $produkt['id']);
-			}
-			else
+			
+			if (preg_match('/(vp_)|(\/(.*))/', $produkt['id']))
+			{
+				$pID = preg_replace('/(vp_)|(\/(.*))/', '', $produkt['id']);
+			}
+			else 
 			{
 				$pID = $produkt['id'];
 			}
-
+			
 			$g_id = intval($this->db->fetchOne("SELECT `pgruppe` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".$pID."'"));
-
+			
 			$pgroups_stock = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".$g_id."'");
-
+			
 			if ($pgroups_stock['stock_aktiv'] != '1') { return; }
-
+			
 			if ($menge_neu >= intval($pgroups_stock['stock_value']))
 			{
-
+				
 				if ($this->shop->get_option('wpsg_mod_stock_allow') != '1')
 				{
-					$this->shop->addFrontendError(__('Menge ÃŒberschreitet Warenbestand!', 'wpsg'));
+					$this->shop->addFrontendError(__('Menge ÃŒberschreitet Warenbestand!', 'wpsg'));	
 				}
 				else
@@ -839,16 +783,17 @@
 			}
 		}
-
-		public function wpsg_mod_productgroups_addedit_sidebar(&$productgroupdata)
-		{
-
+				
+		public function wpsg_mod_productgroups_addedit_sidebar(&$productgroupdata) 
+		{
+			
 			$this->shop->view['wpsg_mod_productgroups']['data'] = $productgroupdata;
 
-			if (wpsg_isSizedInt($this->shop->view['wpsg_mod_productgroups']['data']['stock_aktiv'])) { $this->shop->view['wpsg_mod_productgroups']['data']['stock_aktiv'] = true; }
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/productgroups_addedit_sidebar.phtml');
-
+			if ($this->shop->view['wpsg_mod_productgroups']['data']['stock_aktiv'] == '1') { $this->shop->view['wpsg_mod_productgroups']['data']['stock_aktiv'] = true; }
+
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productgroups/productgroups_addedit_sidebar.phtml');	
+			
 		} // public function wpsg_mod_productgroups_addedit_sidebar(&$productgroupdata)
-
+		
 	} // class wpsg_mod_productgroups extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_productindex.class.php
===================================================================
--- /mods/wpsg_mod_productindex.class.php	(revision 8528)
+++ /mods/wpsg_mod_productindex.class.php	(revision 5261)
@@ -6,109 +6,84 @@
 	class wpsg_mod_productindex extends wpsg_mod_basic
 	{
-
+		
 		var $lizenz = 1;
 		var $id = 30;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=3183';
-
+		
 		var $order = false; // Wird fÃŒr die Ãbergabe an die Sortierfunktion verwendet
 		var $ascdesc = false; // Wird fÃŒr die Richtugn der Sortierung fÃŒr die Callback Funktion verwendet
-
-		public function __construct()
-		{
-
+		
+		public function __construct() 
+		{
+			
 			parent::__construct();
-
+			
 			$this->name = __('ProduktÃŒbersichten', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht die Darstellung von ProduktÃŒbersichtsseiten.', 'wpsg');
-
-		} // public function __construct()
-
+			
+		} // public function __construct() 
+		
 		public function init()
 		{
-
+				 
 			add_action('add_meta_boxes', array(&$this, 'wpsg_add_post_meta_boxes'));
 			add_action('save_post', array(&$this, 'wpsg_save_postdata'));
-
+			
 		} // public function init()
-
+		
 		public function content_filter(&$content)
 		{
-		    
-		    $id = wpsg_get_the_id();
-
-			if ($id <= 0) return;
-
-			$index_page = get_post_meta($id, 'wpsg_mod_productindex_active', true);
-
+						
+			if (get_the_id() <= 0) return;
+			
+			$index_page = get_post_meta(get_the_id(), 'wpsg_mod_productindex_active', true);
+			
 			if ($index_page === '1')
 			{
-
-                $_REQUEST = wpsg_xss($_REQUEST);
-			    
-				// Theme ÃŒbernehmen?
-				if (class_exists('\\sto\\frontend\\Productindex') && in_array(get_post_meta($id, 'wpsg_mod_productindex_template', true), array('0', '1')))
-				{
-
-					$content = \sto\frontend\Productindex::render($id);
-
-					return -2;
-
-				}
-
-				$this->shop->view['arProducts'] = $this->getProducts($id);
-
+				
+				$this->shop->view['arProducts'] = $this->getProducts(get_the_id()); 
+				
 				if (isset($_REQUEST['wpsg_mod_productindex']['template']))
 				{
-
+				
 					$template = $_REQUEST['wpsg_mod_productindex']['template'];
-
+					
 				}
 				else
-				{
-
-					$template = get_post_meta($id, 'wpsg_mod_productindex_template', true);
-
-				}
-
-				$arTemplates = $this->getTemplates();
-				
-				if (is_numeric($template))
-					$templatefile = $arTemplates[$template];
-				else
-					$templatefile = $template;
-				
-				//$this->shop->view['wpsg_mod_productindex']['template'] = $template;
-
-				//$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/'.$template, false);
-
-				$this->shop->view['wpsg_mod_productindex']['template'] = $templatefile;
- 
-				$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/'.$templatefile, false);
-
+				{	
+				
+					$template = get_post_meta(get_the_id(), 'wpsg_mod_productindex_template', true); 
+				
+				}
+					
+				$this->shop->view['wpsg_mod_productindex']['template'] = $template;
+				 
+				$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/'.$template, false);				
+				 
 				return -2;
-
-			}
-
+				
+			}
+			
 		} // public function content_filter(&$content)
-
+		
 		public function wpsg_enqueue_scripts()
 		{
-
+			
 			if (is_admin()) return;
-
+			
 			$index_page = get_post_meta(get_the_id(), 'wpsg_mod_productindex_active', true);
-
+			
 			if ($index_page === '1')
 			{
-
+			
 				wp_enqueue_style('wpsg-mod-productindex-style', $this->shop->getRessourceURL('mods/mod_productindex/css/productindex.css'));
-
-			}
-
+									
+			}
+			
 		} // public function wpsg_enqueue_scripts()
-
+		
 		/* Modulfunktionen */
-
+		 
 		/**
 		 * Gibt einen Array von Produkten fÃŒr die Seite zurÃŒck
@@ -116,89 +91,89 @@
 		function getProducts($post_id)
 		{
-
+			
 			global $wpdb;
-
+			
 			if (isset($_REQUEST['wpsg_mod_productindex']['filter']))
 			{
-
+				
 				$filter = $_REQUEST['wpsg_mod_productindex']['filter'];
-
+				
 			}
 			else
 			{
-
+				
 				$filter = array();
-
-			}
-
+				
+			}
+			
 			$show = get_post_meta($post_id, 'wpsg_mod_productindex_show', true);
-
+			
 			$strQuerySELECT = "";
 			$strQueryJOIN = "";
-
+			
 			if ($show == '1')
 			{
-
+				
 				// Auswahl (Kommagetrennte IDs) anzeigen
 				$arIDs = explode(',', get_post_meta($post_id, 'wpsg_mod_productindex_productids', true));
-
+				
 				if (sizeof($arIDs) <= 0)
 				{
-
+					
 					wpsg_debug(__('Bitte geben sie eine gÃŒltige Auswahl von kommagetrennten ProduktIDs auf dieser Seite ein.', 'wpsg'));
 					$strQuerySELECT .= " AND 0 ";
-
+					
 				}
 				else if (sizeof($arIDs) == 1)
 				{
-
+					
 					$strQuerySELECT .= " AND P.`id` = '".wpsg_q($arIDs[0])."' ";
-
+					
 				}
 				else
 				{
-
+					
 					$strQuerySELECT .= " AND P.`id` IN (".wpsg_q(implode(',', $arIDs)).") ";
-
-				}
-
+					 
+				} 
+				
 			}
 			else if ($show == '2')
 			{
-
+				
 				$arPG = array_values(get_post_meta($post_id, 'wpsg_mod_productindex_groups', true));
-
+				
 				if (sizeof($arPG) <= 0)
 				{
-
+					
 					wpsg_debug(__('Bitte wÃ€hlen sie mindestens eine Produktgruppe zur Anzeige bei den Seiteneinstellungen dieser Seite aus.', 'wpsg'));
 					$strQuerySELECT .= " AND 0 ";
-
+					
 				}
 				else if (sizeof($arPG) == 1)
 				{
-
+					
 					$strQuerySELECT .= " AND P.`pgruppe` = '".wpsg_q($arPG[0])."' ";
-
+					
 				}
 				else
 				{
-
+					
 					$strQuerySELECT .= " AND P.`pgruppe` IN (".wpsg_q(implode(',', $arPG)).") ";
-
-				}
-
+					 
+				} 
+				
 			}
 			else if ($show == '3')
 			{
-
+				
 				$arKat = array_values(get_post_meta($post_id, 'wpsg_mod_productindex_categories', true));
-
+				
 				if (sizeof($arKat) <= 0)
 				{
-
+						
 					wpsg_debug(__('Bitte wÃ€hlen sie mindestens eine Kategorie zur Anzeige bei den Seiteneinstellungen dieser Seite aus.', 'wpsg'));
 					$strQuerySELECT .= " AND 0 ";
-
+						
 				}
 				else
@@ -209,53 +184,39 @@
 					$strQueryJOIN .= " LEFT JOIN `".$this->shop->prefix."term_relationships` AS TR ON (PP.`id` = TR.`object_id`) ";
 					$strQueryJOIN .= " LEFT JOIN `".$this->shop->prefix."term_taxonomy` AS TT ON (TT.`term_taxonomy_id` = TR.`term_taxonomy_id`) ";
-
-					if (sizeof($arKat) == 1)
+											
+					if (sizeof($arPG) == 1)
 					{
-
+						
 						//$strQuerySELECT .= " AND TR.`term_taxonomy_id` = '".wpsg_q($arKat[0])."' ";
 						$strQuerySELECT .= " AND TT.`term_id` = '".wpsg_q($arKat[0])."' ";
-
+						
 					}
 					else
 					{
-
+						
 						//$strQuerySELECT .= " AND TR.`term_taxonomy_id` IN (".wpsg_q(implode(',', $arKat)).") ";
 						$strQuerySELECT .= " AND TT.`term_id` IN (".wpsg_q(implode(',', $arKat)).") ";
-
+						
 					}
-
-				}
-
-			} 
-			else if ($show === 'top1cat') {
-			    
-			    $arProductIDs = $this->shop->callMod('wpsg_mod_produktartikel', 'getTop1CatProductIDs');
-
-			    if (wpsg_isSizedArray($arProductIDs)) {
-                
-			        $strQuerySELECT .= " AND P.`id` IN (".wpsg_q(implode(',', $arProductIDs)).") ";
-			        
-                } else {
-			        
-			        $strQuerySELECT .= " AND 0 ";
-			        
-                }
-                			    
-            }
-			
-            if (get_post_meta($post_id, 'wpsg_mod_productindex_hideOrder', true) == '1') $this->shop->view['hideOrder'] = true;
+					
+				}
+				
+			}
+			
+			 
+			if (get_post_meta($post_id, 'wpsg_mod_productindex_hideOrder', true) == '1') $this->shop->view['hideOrder'] = true;
 			else $this->shop->view['hideOrder'] = false;
-
+			
 			if (get_post_meta($post_id, 'wpsg_mod_productindex_hideViewSelect', true) == '1') $this->shop->view['hideViewSelect'] = true;
 			else $this->shop->view['hideViewSelect'] = false;
-
+		
 			if (!isset($filter['order']))
-			{
+			{ 
 				$filter['order'] = get_post_meta($post_id, 'wpsg_mod_productindex_order', true);
 			}
-
+			 
 			switch ($filter['order'])
 			{
-
+				
 				case 'price_asc': $this->order = 'min_preis'; $this->ascdesc = 'ASC'; break;
 				case 'price_desc': $this->order = 'min_preis'; $this->ascdesc = 'DESC'; break;
@@ -267,70 +228,80 @@
 				case 'anr_asc': $this->order = 'anr'; $this->ascdesc = 'ASC'; break;
 				case 'anr_desc': $this->order = 'anr'; $this->ascdesc = 'DESC'; break;
-				default: $this->order = 'cdate'; $this->ascdesc = 'DESC';
-
-			}
-
+				default: $this->order = 'cdate'; $this->ascdesc = 'DESC'; 
+				
+			}
+									
 			$strQuery = "
 				SELECT
-					P.`id`
+					P.`id` 
 				FROM
 					`".WPSG_TBL_PRODUCTS."` AS P
 					".$strQueryJOIN."
-				WHERE
+				WHERE 
 					P.`deleted` != '1' AND
-					P.`disabled` != '1' AND 
-					P.`lang_parent` = '0'
-					".$strQuerySELECT."
-				GROUP BY
+					P.`lang_parent` = '0'	 
+					".$strQuerySELECT."	
+				GROUP BY 
 					P.`id`
 			";
-
+			
 			$arProductIDs = $this->db->fetchAssocField($strQuery);
-
+						
 			// Seiten pro Seite
 			$filter['perPage'] = get_post_meta($post_id, 'wpsg_mod_productindex_perPage', true);
 			if ($filter['perPage'] <= 0) $filter['perPage'] = 10;
-
+						
 			// Produkte durch Module selektieren (Lagerbestand)
 			$arProducts = array();
-
+			
 			foreach ($arProductIDs as $p_id)
 			{
-
-				$oProduct = wpsg_product::getInstance($p_id);
-				if (!$oProduct->canDisplay()) continue;
-
+			
 				$product_data = $this->shop->loadProduktArray($p_id);
-
-				if ($product_data['disabled'] != 1)
-				{
-
+					
+				if ($this->shop->hasMod('wpsg_mod_stock'))
+				{
+						
+					// Wenn Lagerbestand aktiv dann nur wenn Option aktiv oder verfÃŒgbar
+					$showAusverkauft = get_post_meta($post_id, 'wpsg_mod_productindex_showAusverkauft', true);
+			 
+					if ($showAusverkauft == '1' || $this->shop->callMod('wpsg_mod_stock', 'checkBestand', array($p_id, 1)) == true)
+					{
+			
+						$arProducts[] = $product_data;
+			
+					} 
+						
+				}
+				else
+				{
+						
 					// Sonst immer hinzufÃŒgen
 					$arProducts[] = $product_data;
-				}
-
-			}
-
+						
+				}
+					
+			}
+			
 			// Anzahl an Produkten
 			$filter['count'] = sizeof($arProducts);
-
+			
 			// Anzahl an Seiten
 			$filter['pages'] = ceil($filter['count'] / $filter['perPage']);
-
+				 
 			// Aktuelle Seite
 			if (!isset($filter['page']) || $filter['page'] > $filter['pages'] || $filter['page'] <= 0) $filter['page'] = 1;
-
-			// Sortieren
-			uasort($arProducts, array($this, 'order'));
-
+			
 			// Seite selektieren
 			$arProducts = array_slice($arProducts, ($filter['page'] - 1) * $filter['perPage'], $filter['perPage']);
-
+			
+			uasort($arProducts, array($this, 'order'));
+			 
 			$this->shop->view['wpsg_mod_productindex']['filter'] = $filter;
-
+			 
 			return $arProducts;
-
+			
 		} // function getProducts($post_id)
-
+		
 		/**
 		 * Sortiert zwei Produktarrays nach $this->order
@@ -338,90 +309,86 @@
 		public function order($a, $b)
 		{
-
+			
 			if ($this->order == 'cdate')
 			{
-
+ 
 				$a = strtotime($a[$this->order]);
 				$b = strtotime($b[$this->order]);
-
+				
 			}
 			else
 			{
-
+								 
 				$a = $a[$this->order];
 				$b = $b[$this->order];
-
-			}
-
-			// Vorsicht Bei Sortierung nach Datum
+				
+			}
+			
+			// Vorsicht Bei Sortierung nach Datum 
 			$arSearch = array("Ã", "Ã€", "Ã", "Ã¶", "Ã", "ÃŒ", "Ã", "-");
 			$arReplace = array("Ae", "ae", "Oe", "oe", "Ue", "ue", "ss", " ");
-
+				
 			$a = str_replace($arSearch, $arReplace, $a);
 			$b = str_replace($arSearch, $arReplace, $b);
-
-			if ($a == $b)
-			{
-
+			
+			if ($a == $b) 
+			{
+			 	
 				return 0;
-
-			}
-
+    		
+			}
+    		
 			if ($this->ascdesc == 'ASC')
 				return ($a < $b) ? -1 : 1;
 			else
 				return ($a > $b) ? -1 : 1;
-
+			
 		} // public function order($a, $b)
-
-		/**
-		 * Wird zum Speichern der Page Meta Box aufgerufen
-		 */
-		function wpsg_save_postdata($post_id)
-		{
-			
-			/* Erweiterung fÃŒr KompatibilitÃ€t mit Customer Fields */
-			//if ( $_POST['post_type'] != 'post' && $_POST['post_type'] != 'page' ) return; 
-		    if (isset($_POST['post_type']) && $_POST['post_type'] != 'post' && $_POST['post_type'] != 'page' ) return;
-		    
+		
+		/**
+		 * Wird zum Speichern der Page Meta Box aufgerufen 
+		 */
+		function wpsg_save_postdata($post_id) 
+		{
+			 
 			if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
-
-			if (isset($_POST['wpsg_mod_productindex']))
-				if (!wp_verify_nonce($_POST['wpsg_mod_productindex'], plugin_basename(__FILE__))) return;
-
-			if (!isset($_POST['post_type'])) return;
-
+			
+			if (!wp_verify_nonce($_POST['wpsg_mod_productindex'], plugin_basename(__FILE__))) return;
+			  
 			if ('page' == $_POST['post_type'])
 			{
-
+				
 				if (!current_user_can('edit_page', $post_id)) return;
-
+				
 			}
 			else
 			{
-
+				
 				if (!current_user_can('edit_post', $post_id)) return;
-
-			}
-
+				
+			}
+			 
 			$post_ID = $_POST['post_ID'];
-
-			if (isset($_REQUEST['wpsg_mod_productindex_active'])) {
-				
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_active', $_REQUEST['wpsg_mod_productindex_active']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_template', $_REQUEST['wpsg_mod_productindex_template']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_show', $_REQUEST['wpsg_mod_productindex_show']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_perPage', $_REQUEST['wpsg_mod_productindex_perPage']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_order', $_REQUEST['wpsg_mod_productindex_order']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_groups', array_values((array)wpsg_getArray($_REQUEST['wpsg_mod_productindex_groups'])));
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_productids', $_REQUEST['wpsg_mod_productindex_productids']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_categories', array_values((array)wpsg_getArray($_REQUEST['wpsg_mod_productindex_categories'])));
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_hideOrder', $_REQUEST['wpsg_mod_productindex_hideOrder']);
-				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_hideViewSelect', $_REQUEST['wpsg_mod_productindex_hideViewSelect']);
-				
-			}
-			
-		} // function wpsg_save_postdata($post_id)
-
+			
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_active', $_REQUEST['wpsg_mod_productindex_active']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_template', $_REQUEST['wpsg_mod_productindex_template']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_show', $_REQUEST['wpsg_mod_productindex_show']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_perPage', $_REQUEST['wpsg_mod_productindex_perPage']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_order', $_REQUEST['wpsg_mod_productindex_order']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_groups', array_values((array)$_REQUEST['wpsg_mod_productindex_groups']));			    
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_productids', $_REQUEST['wpsg_mod_productindex_productids']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_categories', array_values((array)$_REQUEST['wpsg_mod_productindex_categories']));
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_hideOrder', $_REQUEST['wpsg_mod_productindex_hideOrder']);
+			$this->update_post_meta($post_ID, 'wpsg_mod_productindex_hideViewSelect', $_REQUEST['wpsg_mod_productindex_hideViewSelect']);
+			
+			if ($this->shop->hasMod('wpsg_mod_stock'))
+			{
+				
+				$this->update_post_meta($post_ID, 'wpsg_mod_productindex_showAusverkauft', $_REQUEST['wpsg_mod_productindex_showAusverkauft']);
+				
+			}
+			
+		} // function wpsg_save_postdata($post_id) 
+			
 		/**
 		 * Hilfsfunktion damit ich die kommenden 4 Zeilen nicht x mal schreiben muss ..
@@ -429,12 +396,12 @@
 		private function update_post_meta($post_ID, $key, $value)
 		{
-
+			
 			if (get_post_meta($post_ID, $key, true) !== false)
 				update_post_meta($post_ID, $key, $value);
 			else
 				add_post_meta($post_ID, $key, $value, true);
-
+			
 		} // private function update_post_meta($post_ID, $key, $value)
-
+		
 		/**
 		 * FÃŒgt die Post Meta Boxen hinzu
@@ -442,14 +409,14 @@
 		function wpsg_add_post_meta_boxes()
 		{
-
+			 
 			$this->shop->view['wpsg_mod_productindex']['arShow'] = array(
 				'0' => __('Alle', 'wpsg'),
-				'1' => __('Auswahl', 'wpsg')
-			);
-
+				'1' => __('Auswahl', 'wpsg') 
+			);			
+			
 			// Produktgruppen ?
 			if ($this->shop->hasMod('wpsg_mod_productgroups'))
 			{
-
+				
 				$this->shop->view['wpsg_mod_productindex']['arShow']['2'] = __('Produktgruppen', 'wpsg');
 				$this->shop->view['wpsg_mod_productindex']['arProductGroups'] = $this->db->fetchAssocField("
@@ -457,39 +424,38 @@
 						PG.`id`, PG.`name`
 					FROM
-						`".WPSG_TBL_PRODUCTS_GROUP."` AS PG
+						`".WPSG_TBL_PRODUCTS_GROUP."` AS PG	
 					WHERE
 						PG.`deleted` != '1'
 					ORDER BY
-						PG.`name` ASC
+						PG.`name` ASC	
 				", "id", "name");
-
-			}
-
+								
+			}
+			
 			// Produktartikel ?
 			if ($this->shop->hasMod('wpsg_mod_produktartikel'))
 			{
-
+				
 				$this->shop->view['wpsg_mod_productindex']['arShow']['3'] = __('Kategorien', 'wpsg');
-                $this->shop->view['wpsg_mod_productindex']['arShow']['top1cat'] = __('Erstes Produkt aus allen Kategorien', 'wpsg');
 				$this->shop->view['wpsg_mod_productindex']['arCategories'] = $this->shop->callMod('wpsg_mod_produktartikel', 'getCategorySelectArray');
 
 			}
-
+			
 			$this->shop->view['wpsg_mod_productindex']['arTemplates'] = $this->getTemplates();
-
+			
 			add_meta_box('wpsg_mod_productindex', __('wpShopGermany ProduktÃŒbersicht', 'wpsg'), array(&$this, 'wpsg_post_meta_box'), 'page');;
-
+			
 		} // function wpsg_add_post_meta_boxes()
-
-		/**
-		 * Inhalt der Post Meta Box innerhalb der Seiten
+		
+		/**
+		 * Inhalt der Post Meta Box innerhalb der Seiten 
 		 */
 		function wpsg_post_meta_box($post)
 		{
-
+			
 			wp_nonce_field(plugin_basename(__FILE__), 'wpsg_mod_productindex');
-
+			
 			$this->shop->view['wpsg_mod_productindex']['post_id'] = $post->ID;
-
+			 			
 			$this->shop->view['wpsg_mod_productindex']['arOrder'] = array(
 				'price_asc' => __('Preis (Aufsteigend)', 'wpsg'),
@@ -497,87 +463,85 @@
 				'name_asc' => __('Name (Aufsteigend)', 'wpsg'),
 				'name_desc' => __('Name (Absteigend)', 'wpsg'),
-				'cdate_asc' => __('Datum (Ãlteste zuerst)', 'wpsg'),
-				'cdate_desc' => __('Datum (Neueste zuerst)', 'wpsg'),
-				'anr_asc' => __('Artikelnr. (Aufsteigend)', 'wpsg'),
-				'anr_desc' => __('Artikelnr. (Absteigend)', 'wpsg')
+				'cdate_asc' => __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'),
+				'cdate_desc' => __('Erstellungsdatum (Neueste zuerst)', 'wpsg'),		
+				'anr_asc' => __('Artikelnummer (Aufsteigend)', 'wpsg'),
+				'anr_desc' => __('Artikelnummer (Absteigend)', 'wpsg')	
 			);
-
+			
 			if ($this->shop->hasMod('wpsg_mod_produktartikel'))
 			{
-
+				
 				$this->shop->view['wpsg_mod_productindex']['arOrder']['pos_asc'] = __('Position (Aufsteigend)', 'wpsg');
 				$this->shop->view['wpsg_mod_productindex']['arOrder']['pos_desc'] = __('Position (Absteigend)', 'wpsg');
+				
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productindex/page_metabox.phtml');
+			
+		} // function wpsg_post_meta_box()
+		
+		/**
+		 * Gibt einen Array mit den verfÃŒgbaren Templates zurÃŒck
+		 */
+		private function getTemplates()
+		{
+			
+			$arTemplates = array();
+			
+			$handle = @opendir(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/');
+			
+			if ($handle) {
+				while ($file = readdir($handle))
+				{
+					if (is_file(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/'.$file) && preg_match('/(.*).phtml$/', $file))
+					{
+						
+						$arTemplates[] = $file;
+						
+					}
+					
+				}
+				
+			}
+			
+			@closedir($handle);
+			
+			$handle = @opendir(WPSG_PATH_USERVIEW_OLD.'/mods/mod_productindex/layouts/');
+			
+			if ($handle) {
+				while ($file = readdir($handle))
+				{
+					if (is_file(WPSG_PATH_USERVIEW_OLD.'/mods/mod_productindex/layouts/'.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
+					{
+						
+						$arTemplates[] = $file;
+						
+					}
+				}
+			}
+			
+			@closedir($handle);
+			
+			$handle = @opendir(WPSG_PATH_USERVIEW.'/mods/mod_productindex/layouts/');
+			
+			if ($handle) {
+				while ($file = readdir($handle))
+				{
+					if (is_file(WPSG_PATH_USERVIEW.'/mods/mod_productindex/layouts/'.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates))
+					{
+						
+						$arTemplates[] = $file;
+						
+					}
+				}
+			}
+			
+			@closedir($handle);
+			
+			return $arTemplates;
+			 
+		} // private function getTemplates()
+		
+	} // class wpsg_mod_productindex extends wpsg_mod_basic
 
-			}
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productindex/page_metabox.phtml');
-
-		} // function wpsg_post_meta_box()
-
-		/**
-		 * Gibt einen Array mit den verfÃŒgbaren Templates zurÃŒck
-		 */
-		private function getTemplates()
-		{
-
-			$arTemplates = array();
-
-			$handle = @opendir(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/');
-
-			if ($handle) {
-
-				while ($file = readdir($handle)) {
-
-					if (is_file(WPSG_PATH_VIEW.'/mods/mod_productindex/layouts/'.$file) && preg_match('/(.*).phtml$/', $file)) {
-
-						$arTemplates[] = $file;
-
-					}
-
-				}
-
-				@closedir($handle);
-
-			}
-
-			$handle = @opendir(WPSG_PATH_USERVIEW_OLD.'/mods/mod_productindex/layouts/');
-
-			if ($handle) {
-
-				while ($file = readdir($handle)) {
-
-					if (is_file(WPSG_PATH_USERVIEW_OLD.'/mods/mod_productindex/layouts/'.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates)) {
-
-						$arTemplates[] = $file;
-
-					}
-
-				}
-
-				@closedir($handle);
-
-			}
-
-			$handle = @opendir(WPSG_PATH_USERVIEW.'/mods/mod_productindex/layouts/');
-
-			if ($handle) {
-
-				while ($file = readdir($handle)) {
-
-					if (is_file(WPSG_PATH_USERVIEW.'/mods/mod_productindex/layouts/'.$file) && preg_match('/(.*).phtml$/', $file) && !in_array($file, $arTemplates)) {
-
-						$arTemplates[] = $file;
-
-					}
-
-				}
-
-				@closedir($handle);
-
-			}
-
-			return $arTemplates;
-
-		} // private function getTemplates()
-
-	} // class wpsg_mod_productindex extends wpsg_mod_basic
+?>
Index: /mods/wpsg_mod_productpackage.class.php
===================================================================
--- /mods/wpsg_mod_productpackage.class.php	(revision 5261)
+++ /mods/wpsg_mod_productpackage.class.php	(revision 5261)
@@ -0,0 +1,64 @@
+<?php
+	
+	/**
+	 * Klasse fÃŒr den Verkauf von Produkten als Produktpaket
+	 * @author Daschmi
+	 */
+	class wpsg_mod_productpackage extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 2;
+		var $id = 2050;
+		
+		/**
+		 * Konstruktor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+				
+			$this->name = __('Produktpakete', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht den Verkauf von Produktpaketen, die aus mehreren Produkten bestehen.', 'wpsg');
+			
+		} // public function __construct()
+		
+		public function install()
+		{
+			
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
+			  	wpsg_mod_productpackage_set INT(11) NOT NULL,
+			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+				
+			dbDelta($sql);
+			
+		} // public function install()
+		
+		public function produkt_edit_sidebar(&$produkt_data)
+		{
+		
+			if ($produkt_data['id'] <= 0) return;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productpackage/produkt_edit_sidebar.phtml');
+				
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		
+		/** Modulfunktionen */
+		
+		/**
+		 * Zeichnet die Liste der zugeordneten Produkte 
+		 * @param int $product_id ID des Produktes
+		 */
+		public function productlist($product_id)
+		{
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productpackage/productlist.phtml', false);
+			
+		} // public function productlist($product_id)
+		
+	} // class wpsg_mod_productpackage extends wpsg_mod_basic
+
+?>
Index: ds/wpsg_mod_productvariants.class.php
===================================================================
--- /mods/wpsg_mod_productvariants.class.php	(revision 8528)
+++ 	(revision )
@@ -1,2626 +1,0 @@
-<?php
-
-    use \wpsg\M1;
-
-	/**
-	 * Modulklasse "Produktvarianten"
-	 * @author Daschmi (27.04.2016)
-	 */
-	class wpsg_mod_productvariants extends wpsg_mod_basic
-	{
-
-		var $lizenz = 1;
-		var $id = 91;
-
-		const TYPE_SELECT = 0;
-		const TYPE_RADIO = 1;
-		const TYPE_IMAGE = 2;
-
-		static $arTypeLabel;
-		
-		private $cache_variData = [];
-
-		/**
-		 * Constructor
-		 */
-		public function __construct() {
-			
-			parent::__construct();
-
-			require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_productvariants'.DIRECTORY_SEPARATOR.'wpsg_variant.class.php';
-			require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_productvariants'.DIRECTORY_SEPARATOR.'wpsg_variation.class.php';
-			
-			self::$arTypeLabel = array(
-				self::TYPE_SELECT => __('Select Box', 'wpsg'),
-				self::TYPE_RADIO => __('Radio Boxen', 'wpsg'),
-				self::TYPE_IMAGE => __('Bilderauswahl', 'wpsg')
-			);
-
-			$this->name = __('Produktvarianten', 'wpsg');
-			$this->group = __('Produkte', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht es zentral Varianten anzulegen und diese im Produkt zu aktivieren.', 'wpsg');
-
-			wpsg_define('WPSG_TBL_VARIANTS', $this->shop->prefix.'wpsg_variants');
-			wpsg_define('WPSG_TBL_VARIANTS_VARI', $this->shop->prefix.'wpsg_variants_vari');
-			wpsg_define('WPSG_TBL_PRODUCTS_VARIANT', $this->shop->prefix.'wpsg_products_variant');
-			wpsg_define('WPSG_TBL_PRODUCTS_VARIATION', $this->shop->prefix.'wpsg_products_variation');
-			wpsg_define('WPSG_TBL_PRODUCTS_COMBINATION', $this->shop->prefix.'wpsg_product_combination');
-
-		} // public function __construct()
-
-		public function install() {
-
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
-			$sql = "CREATE TABLE ".WPSG_TBL_VARIANTS." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				name varchar(255) NOT NULL,
-				product_id int(11) NOT NULL,
-				deleted int(1) NOT NULL,
-				pos int(11) NOT NULL,
-				type int(11) NOT NULL,
-				PRIMARY KEY  (id),
-				KEY product_id (product_id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-			dbDelta($sql);
-
-			$sql = "CREATE TABLE ".WPSG_TBL_VARIANTS_VARI." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				variant_id int(11) NOT NULL,
-				name varchar(255) NOT NULL,
-				shortname varchar(255) NOT NULL,
-				anr varchar(255) NOT NULL,
-				deleted int(1) NOT NULL,
-				pos int(11) NOT NULL,
-				images text NOT NULL,
-				KEY variant_id (variant_id),
-				PRIMARY KEY  (id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-			dbDelta($sql);
-
-			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS_VARIANT." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				variant_id int(11) NOT NULL,
-				product_id int(11) NOT NULL,
-				pos int(11) NOT NULL,
-				PRIMARY KEY  (id),
-				KEY product_id (product_id),
-				KEY variant_id (variant_id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-			dbDelta($sql);
-
-			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS_VARIATION." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				variation_id int(11) NOT NULL,
-				product_id int(11) NOT NULL,
-				active int(1) NOT NULL,
-				anr varchar(255) NOT NULL,
-				price double(10,2) NOT NULL,
-				stock int(11) NOT NULL,
-				min_stock int(11) NOT NULL,
-				images text NOT NULL,
-				images_set text NOT NULL,
-				weight double(10,2) NOT NULL,
-				fmenge double(10,2) NOT NULL,
-				ean text NOT NULL COMMENT 'EAN der Variation',
-				PRIMARY KEY  (id),
-				KEY product_id (product_id),
-				KEY variation_id (variation_id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-			dbDelta($sql);
-
-			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS_COMBINATION." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				product_id int(11) NOT NULL,
-				var_key TEXT NOT NULL,
-				PRIMARY KEY  id (id),
-				KEY product_id (product_id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-			dbDelta($sql);
-			
-		}
-
-		public function settings_edit()
-		{
-
-			$this->shop->view['wpsg_mod_productvariants']['html'] = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/admin_html.phtml', false);
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/settings_edit.phtml');
-
-		} // public function settings_edit_afterform()
-
-		public function settings_save() {
-
-		    $this->shop->update_option('wpsg_mod_productvariants_price', $_REQUEST['wpsg_mod_productvariants_price'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_vp_detailview', $_REQUEST['wpsg_vp_detailview'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_vp_replaceanr', wpsg_xss($_REQUEST['wpsg_vp_replaceanr']));
-			$this->shop->update_option('wpsg_vp_product_stock_nocalc', intval($_REQUEST['wpsg_vp_product_stock_nocalc']));
-			$this->shop->update_option('wpsg_vp_product_stock_varinotchange', intval($_REQUEST['wpsg_vp_product_stock_varinotchange']));
-			$this->shop->update_option('wpsg_vp_product_stock_display', intval($_REQUEST['wpsg_vp_product_stock_display']));
- 
-		} // public function settings_save()
-
-		public function be_ajax() {
-			
-			$action = $_REQUEST['subaction'].'Action';
-
-			$this->$action();
-
-		} // public function be_ajax()
-
-		public function wpsg_enqueue_scripts()
-		{
-
-			if (!is_admin())
-			{
-
-				wp_enqueue_script('wpsg_mod_productvariants_js', $this->shop->getRessourceURL('mods/mod_productvariants/frontend.js'));
-				wp_localize_script('wpsg_mod_productvariants_js', 'wpsg_vp_showpic', array('wpsg_vp_showpic' => $this->shop->get_option('wpsg_vp_showpic')));
-
-			}
-
-		} // public function wpsg_enqueue_scripts()
-
-		public function product_addedit_content(&$product_content, &$product_data) {
-
-			// Wenn eine Ãbersetzung bearbeitet wird, dann nichts machen
-			if (isset($_REQUEST['wpsg_lang'])) return;
-
-			if (wpsg_isSizedInt($product_data['id'])) {
-
-				$this->shop->view['wpsg_mod_productvariants']['html'] = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/admin_html.phtml', false);
-
-			}
-
-			$product_content['wpsg_mod_productvariants'] = array(
-				'title' => __('Produktvarianten', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/produkt_addedit_content.phtml', false)
-			);
-		
-		} // public function product_addedit_content(&$product_content, &$produkt_data)
-
-		public function produkt_copy(&$produkt_id, &$copy_id)
-		{
-
-			// Kopieren der Varianten/Variationen
-			$variants = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_VARIANTS."` WHERE `product_id` = '".wpsg_q($produkt_id)."'");
-			$pos = 0;
-
-			foreach ($variants as $v) {
-
-				$v['product_id'] = $copy_id;
-				$v['pos'] = $pos;
-				$vid = $v['id'];
-				unset($v['id']);
-				$newvid = $this->db->ImportQuery(WPSG_TBL_VARIANTS, $v);
-
-				// WPSG_TBL_PRODUCTS_VARIANT schreiben
-				$pv = array();
-				$pv['variant_id'] = $newvid;
-				$pv['product_id'] = $copy_id;
-				$pv['pos'] = $pos;
-				unset($pv['id']);
-				$newpvid = $this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIANT, $pv);
-				$pos++;
-
-				$varis = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `variant_id` = '".wpsg_q($vid)."'");
-
-				$mimages = array();
-
-				foreach ($varis as $vv) {
-					$vv['variant_id'] = $newvid;
-					$vvid = $vv['id'];
-					unset($vv['id']);
-					$newvvid = $this->db->ImportQuery(WPSG_TBL_VARIANTS_VARI, $vv);
-
-					$pvari = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `variation_id` = '".wpsg_q($vvid)."' AND `product_id` = '".wpsg_q($produkt_id)."'");
-					$pvari['variation_id'] = $newvvid;
-					$pvari['product_id'] = $copy_id;
-					
-					$images = explode(',', $pvari['images']);
-					$images_set = explode(',', $pvari['images_set']);
-					
-					foreach ($images as $k => $i_id) {
-						
-						if (isset($GLOBALS['wpsg_product_copy_imagemapping'][$i_id])) $images[$k] = $GLOBALS['wpsg_product_copy_imagemapping'][$i_id];
-						else unset($images[$k]);
-						
-					}
-					
-					foreach ($images_set as $k => $i_id) {
-						
-						if (isset($GLOBALS['wpsg_product_copy_imagemapping'][$i_id])) $images_set[$k] = $GLOBALS['wpsg_product_copy_imagemapping'][$i_id];
-						else unset($images_set[$k]);
-						
-					}
-					
-					$pvari['images'] = implode(',', $images);
-					$pvari['images_set'] = implode(',', $images_set);
-					
-					unset($pvari['id']);
-					
-					$this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, $pvari);
-					
-					// images/images_set
-					/*
-					$images = explode(',', $pvari['images']);
-					$images_set = explode(',', $pvari['images_set']);
-					$ih = new wpsg_imagehandler();
-
-					$nimages = array();
-					$nimages_set = array();
-
-					foreach ($images as $postid) {
-
-						if (wpsg_isSizedInt($postid)) {
-							
-							$post = $this->db->fetchRow("SELECT * FROM `".$GLOBALS['wpdb']->prefix."posts` WHERE `ID`='".wpsg_q($postid)."'");							
-							$npostid = $ih->addImageToProduct($post['guid'], $copy_id);
-															
-						}
-						
-						if (!wpsg_isSizedArray($mimages['alt']) || !in_array($postid, $mimages['alt'])) {
-							
-							$mimages['alt'][] = $postid;
-							$post = $this->db->fetchRow("SELECT * FROM `".$GLOBALS['wpdb']->prefix."posts` WHERE `ID`='".wpsg_q($postid)."'");
-							// addImageToProduct($file, $product_id)
-							$npostid = $ih->addImageToProduct($post['guid'], $copy_id);
-							//$nimages[] = $npostid;
-							$mimages['neu'][] = $npostid;
-
-						}
-
-					}
-
-					foreach ($images_set as $iset) {
-						$ak = array_search($iset, $mimages['alt']);
-						$nimages_set[] = $mimages['neu'][$ak];
-					}
-					foreach ($images as $iset) {
-						$ak = array_search($iset, $mimages['alt']);
-						$nimages[] = $mimages['neu'][$ak];
-					}
-
-					$pvari['images'] = implode(',', $nimages);
-					$pvari['images_set'] = implode(',', $nimages_set);
-					unset($pvari['id']);
-					$newpvid = $this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, $pvari);
-					*/
-					
-					
-
-				}
-
-			}
-
-		}	// public function produkt_copy($produkt_id, $copy_id)
-
-		public function template_redirect()
-		{
-
-			if (wpsg_isSizedString($_REQUEST['action'], 'wpsg_productvariants_switch'))
-			{
-
-			    /*
-			     * Daschmi 02.09.2020
-			     * Hat bei einem Kunden Probleme gemacht. Mir ist auch nicht klar warum das hier gemacht wurde, wahrcheinlich aber nicht ohne Grund
-			     * Problem war, das eine Ãnderung der Variante nicht ÃŒbernommen wurde
-			     *
-				if (wpsg_isSizedInt($_REQUEST['wpsg_post_id']))
-				{
-
-					global $post;
-					$post = get_post($_REQUEST['wpsg_post_id']);
-
-				}
-			    */
-
-				// Produkt Key nach der Auswahl bilden
-				parse_str($_REQUEST['form_data'], $form_data);
-
-				$product_id = $this->shop->getProduktId($form_data['wpsg']['produkt_id']);
-                $product_key = '';
-
-                $this->getProductKeyFromRequest($product_key, $product_id, $form_data);
-
-				$product_data = $this->shop->loadProduktArray($product_id, array(
-					'id' => $product_key,
-					'product_key' => $product_key,
-					'menge' => $form_data['wpsg']['menge'],
-					'referer' => $form_data['myReferer']
-				));
-
-				// Damit das Div die gleiche Index Id bekommt
-				$GLOBALS['wpsg_produkt_index'] = $_REQUEST['product_index'] - 1;
-
-				$this->shop->noReleatedProducts = true;
-
-				if (wpsg_isSizedString($form_data['wpsg']['template'])) $template = $form_data['wpsg']['template'];
-				else $template = false;
-
-				if (wpsg_isSizedInt($form_data['titleDisplayed'])) $this->shop->titleDisplayed = 1;
-
-				//$dat = $this->shop->renderProdukt($product_data, $template);
-
-				die($this->shop->renderProdukt($product_data, $template));
-
-			}
-
-		} // public function template_redirect()
-		
-		/**
-		 * @param wpsg_product $oProduct
-		 * @param string $product_key
-		 */
-		public function product_setProductKey(&$oProduct, $product_key) { 
-			
-			if ($this->isVariantsProductKey($product_key)) {
-				
-				$price = wpsg_tf($oProduct->preis);
-				
-				foreach ($this->getVariantenInfoArray($product_key) as $k => $v) {
-					
-					if (is_numeric($k)) {
-						
-						$price += wpsg_tf($v['preis']);
-												
-					}
-					
-				}
-			
-				if ($this->shop->getBackendTaxview() === WPSG_BRUTTO) {
-					
-					$oProduct->loadedData['preis_brutto'] = $price;
-					$oProduct->loadedData['preis_netto'] = wpsg_calculatePreis($price, WPSG_NETTO, $oProduct->getDefaultTaxValue());
-					
-				} else {
-					
-					$oProduct->loadedData['preis_netto'] = $price;
-					$oProduct->loadedData['preis_brutto'] = wpsg_calculatePreis($price, WPSG_BRUTTO, $oProduct->getDefaultTaxValue());
-					
-				}
-				
-				if ($this->shop->getFrontendTaxView() === WPSG_BRUTTO) {
-					
-					$oProduct->loadedData['preis'] = $oProduct->loadedData['preis_brutto'];
-					
-				}
-				else
-				{
-					
-					$oProduct->loadedData['preis'] = $oProduct->loadedData['preis_netto'];
-					
-				}
-				
-				
-			}
-			
-		}
-		
-		public function loadProduktArray(&$product_data)
-		{
-
-			//if ($GLOBALS['step'] > 4) return;
-
-			$product_data['arVariant'] = $this->getVariants($product_data['product_id'], true, true, true);
-
-			if (wpsg_isSizedArray($product_data['arVariant']))
-			{
-
-				// Default Kombination setzen
-                if (preg_match('/^pv_/', $product_data['id']))
-                {
-
-                    $product_data['product_key'] = $product_data['id'];
-
-                }
-				else if (!isset($product_data['product_key']) || is_numeric($product_data['product_key']))
-				{
-
-					$arDefaultKey = array();
-
-					foreach ($product_data['arVariant'] as $variant_id => $variant_data)
-					{
-
-						$arDefaultKeyValues = $variant_id.':'.array_keys($variant_data['arVariation'])[0];
-						$arDefaultKey[] = $arDefaultKeyValues;
-
-					}
-
-					$strDefaultKey = 'pv_'.$product_data['id'].'|'.implode('|', $arDefaultKey);
-
-					$product_data['product_key'] = $strDefaultKey;
-					$product_data['id'] = $strDefaultKey;
-
-				}
-
-				$arProductKey = $this->explodeProductKey($product_data['product_key']);
-
-                $product_data['stock'] = 0;
-
-                foreach ($arProductKey['arVari'] as $var_id => $vari_id) {
-
-                    $product_data['stock'] += $product_data['arVariant'][$var_id]['arVariation'][$vari_id]['stock'];
-
-                }
-
-				$arProductImagesPossible = array();
-				$arPostidsImagesPossible = array();
-
-				// Gesetzte Variante wÃ€hlen und aufwerten
-				foreach ($product_data['arVariant'] as $var_id => $var_data) {
-
-					foreach ($var_data['arVariation'] as $vari_id => $vari_data) {
-
-						if (wpsg_getInt($arProductKey['arVari'][$var_id]) == $vari_id) {
-
-							$vari_data['pics']= explode(',', $vari_data['images_set']);
-							$vari_data['postids']= explode(',', $vari_data['images']);
-							/*
-							$pics = unserialize($vari_data['images']);
-							unset($vari_data['pics']);
-							if (wpsg_isSizedArray($pics)) {
-								$pic = explode(',', $pics['pic']);
-								if (strlen($pic[0]) == 0) unset($pic[0]);
-								$postids = explode(',', $pics['postid']);
-								if (strlen($postids[0]) == 0) unset($postids[0]);
-								//$vari_data['images'] = array('pic' => array());
-								//$vari_data['images']['pic'] = $pic;
-								foreach ($pic as $k => &$file) {
-									$file = preg_replace('/\-(\d+)x(\d+)\./', '.', $file);
-								}
-								$vari_data['pics'] = $pic;
-								$vari_data['postids'] = $postids;
-							}
-							*/
-							if (isset($vari_data['pics'])) {
-								if (wpsg_isSizedArray($arProductImagesPossible)) $arProductImagesPossible = array_intersect($arProductImagesPossible, $vari_data['pics']);
-								else if (wpsg_isSizedArray($vari_data['pics'])) $arProductImagesPossible = $vari_data['pics'];
-
-							}
-							if (isset($vari_data['postids'])) {
-								if (wpsg_isSizedArray($arPostidsImagesPossible)) $arPostidsImagesPossible = array_intersect($arPostidsImagesPossible, $vari_data['postids']);
-								else if (wpsg_isSizedArray($vari_data['postids'])) $arPostidsImagesPossible = $vari_data['postids'];
-
-							}
-
-							$product_data['arVariant'][$var_id]['arVariation'][$vari_id]['set'] = true;
-
-						}
-						else $product_data['arVariant'][$var_id]['arVariation'][$vari_id]['set'] = false;
-
-					}
-
-				}
-
-				if (wpsg_isSizedArray($arPostidsImagesPossible)) $product_data['image_postid'] = array_shift($arPostidsImagesPossible);
-
-				if (wpsg_isSizedArray($arProductImagesPossible)) $product_data['image_show'] = array_shift($arProductImagesPossible);
-				if (wpsg_isSizedString($product_data['image_show'])) $product_data['image_show'] = sanitize_file_name($product_data['image_show']);
-
-				// Preise fÃŒr die Varianten berechnen
-				if (!(isset($product_data['varPriceAdded']) && ($product_data['varPriceAdded'] = 1)))
-				{
-
-					$product_data['preis_netto_preVariants'] = $product_data['preis_netto'];
-					$product_data['preis_brutto_preVariants'] = $product_data['preis_brutto'];
-
-					if ($this->shop->getBackendTaxView() === WPSG_BRUTTO)
-					{
-
-						$product_data['preis_brutto'] = $this->calculateVariantsPrice($product_data['preis_brutto'], $product_data['arVariant'], $product_data['product_key']);
-						$product_data['preis_netto'] = wpsg_calculatePreis($product_data['preis_brutto'], WPSG_NETTO, $product_data['mwst_value']);
-
-					}
-					else
-					{
-
-						$product_data['preis_netto'] = $this->calculateVariantsPrice($product_data['preis_netto'], $product_data['arVariant'], $product_data['product_key']);
-						$product_data['preis_brutto'] = wpsg_calculatePreis($product_data['preis_netto'], WPSG_BRUTTO, $product_data['mwst_value']);
-
-					}
-
-					$product_data['preis_preVariants'] = $product_data['preis'];
-
-				}
-
-				// Preise fÃŒr das Frontend ermitteln
-				if ($this->shop->getFrontendTaxView() === WPSG_BRUTTO)
-				{
-
-					$product_data['preis'] = $product_data['preis_brutto'];
-
-				}
-				else
-				{
-
-					$product_data['preis'] = $product_data['preis_netto'];
-
-				}
-
-			}
-
-		} // public function loadProduktArray(&$produkt_data)
-
-        public function mail_row($index, $produkt)
-        {
-
-            if (!preg_match('/pv_(.*)/', $produkt['id'])) return;
-
-            $this->shop->view['variante'] = $this->getVariantenInfoArray($produkt['id']);
-            $this->shop->view['i'] = $index;
-
-            if ($this->shop->htmlMail === true) $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/mail_row_html.phtml');
-            else $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/mail_row.phtml');
-
-        } // public function mail_row($index, $produkt)
-
-        public function order_view_row(&$p, $i)
-        {
-
-            if (!preg_match('/pv_(.*)/', $p['product_key'])) return;
-
-            $this->shop->view['variante'] = $this->getVariantenInfoArray($p['product_key']);
-            $this->shop->view['i'] = $i;
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/order_view_row.phtml');
-
-        } // public function order_view_row(&$p, $i)
-
-        public function getProductKeyFromRequest(&$product_key, $product_id, $form_data)
-        {
- 
-        	if (!wpsg_isSizedArray($form_data['wpsg_vp'])) return false;
-
-        	foreach ($form_data['wpsg_vp'] as $var_id => $vari_id) $form_data['wpsg_vp'][$var_id] = $var_id.':'.$vari_id;
-        	$product_key = 'pv_'.$product_id.'|'.implode('|', $form_data['wpsg_vp']);
-
-        } // public function getProductKeyFromRequest($product_id, $form_data)
-
-        public function produkt_ajax() {
-
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw new \Exception(__('UngÃŒltige ID bei den Produktvarianten BE Ajax', 'wpsg'));
-        	
-        	if ($_REQUEST['cmd'] == 'wpsg_var_setImageOrder')
-        	{
-				
-				$vp_data = $this->getVariants($_REQUEST['edit_id'], true, false, true);
-				
-				$vp_data[$_REQUEST['var_id']]['arVariation'][$_REQUEST['vari_id']]['images'] = implode(',', $_REQUEST['wpsg_reorder']);
-
-				$this->saveVariantsData($vp_data);
-
-        		die("1");
-				
-        	}
-        	else if ($_REQUEST['cmd'] == 'wpsg_vp_vari_setPic')
-        	{
-
-        		$vp_data = $this->getVariants($_REQUEST['edit_id'], true, false, true);
-				
-				$arImages = explode(',', @$vp_data[$_REQUEST['var_id']]['arVariation'][$_REQUEST['vari_id']]['images_set']);
-				
-				if (!in_array($_REQUEST['attachment_id'], $arImages)) $arImages[] = $_REQUEST['attachment_id'];
-				else unset($arImages[array_search($_REQUEST['attachment_id'], $arImages)]);
-				
-				$vp_data[$_REQUEST['var_id']]['arVariation'][$_REQUEST['vari_id']]['images_set'] = implode(',', wpsg_trim(array_unique($arImages)));
-				
-				$this->saveVariantsData($vp_data);
-
-        		die("1");
-
-        	}
-        	else if ($_REQUEST['cmd'] == 'wpsg_vp_vari_inlineEdit')
-        	{
-        		die('wpsg_vp_vari_inlineEdit');
-
-        		$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
-        		$product_data = $this->shop->cache->loadProduct($_REQUEST['edit_id']);
-
-        		if ($_REQUEST['typ'] == "vari_name") {
-
-        			$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
-        			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-        			{
-        				$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['vari'][$_REQUEST['vari_id']]['name'] = wpsg_q($_REQUEST['value']);
-        			}
-        			else
-        			{
-        				$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['name'] = wpsg_q($_REQUEST['value']);
-        			}
-
-        		}
-        		else if ($_REQUEST['typ'] == "vari_artnr")
-        		{
-
-			        $_REQUEST['value'] = wpsg_xss($_REQUEST['value']);
-
-        			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-        			{
-        				$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['vari'][$_REQUEST['vari_id']]['artnr'] = wpsg_q($_REQUEST['value']);
-        			}
-        			else
-        			{
-        				$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['artnr'] = wpsg_q($_REQUEST['value']);
-        			}
-
-        		}
-        		else if ($_REQUEST['typ'] == "vari_preis")
-        		{
-
-			        $_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-
-        			$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['preis'] = $_REQUEST['value'];
-        			$_REQUEST['value'] = wpsg_ff($_REQUEST['value'], $this->shop->get_option('wpsg_currency'));
-
-        		}
-        		else if ($_REQUEST['typ'] == "vari_fmenge")
-        		{
-
-			        $_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-
-        			$arFeinheiten = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
-
-        			$_REQUEST['value'] = wpsg_ff($_REQUEST['value'], $arFeinheiten[$product_data['feinheit']]);
-        			$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['fmenge'] = $_REQUEST['value'];
-
-        		}
-        		else if ($_REQUEST['typ'] == "vari_weight")
-        		{
-
-			        $_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-
-        			$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['weight'] = $_REQUEST['value'];
-
-        		}
-        		else if ($_REQUEST['typ'] == "vari_stock")
-        		{
-
-        			$_REQUEST['value'] = intval(wpsg_sinput("key", $_REQUEST['value']));
-        			$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['stock'] = $_REQUEST['value'];
-
-        		}
-		        else if ($_REQUEST['typ'] == "vari_min_stock")
-		        {
-
-			        $_REQUEST['value'] = intval(wpsg_sinput("key", $_REQUEST['value']));
-			        $vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['min_stock'] = $_REQUEST['value'];
-
-		        }
-        		else if ($_REQUEST['typ'] == "var_name")
-        		{
-
-			        $_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
-        			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-        			{
-        				$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['name'] = $_REQUEST['value'];
-        			}
-        			else
-        			{
-        				$vp_data[$_REQUEST['var_id']]['name'] = $_REQUEST['value'];
-        			}
-
-        		}
-        		else if ($_REQUEST['typ'] == "var_preis")
-        		{
-
-        			$_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-        			$vp_data[$_REQUEST['var_id']]['preis'] = $_REQUEST['value'];
-        			$_REQUEST['value'] = wpsg_ff($_REQUEST['value'], $this->shop->get_option('wpsg_currency'));
-
-        		}
-        		else if ($_REQUEST['typ'] == "var_weight")
-        		{
-
-        			$_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-        			$vp_data[$_REQUEST['var_id']]['weight'] = $_REQUEST['value'];
-
-        		}
-        		else if ($_REQUEST['typ'] == "var_fmenge")
-        		{
-
-        			$arFeinheiten = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
-
-        			$_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"), $arFeinheiten[$product_data['feinheit']]);
-        			$vp_data[$_REQUEST['var_id']]['fmenge'] = $_REQUEST['value'];
-
-        		}
-        		else if ($_REQUEST['typ'] == "var_artnr")
-        		{
-
-			        $_REQUEST['value'] = wpsg_xss($_REQUEST['value']);
-
-        			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-        			{
-        				$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['artnr'] = wpsg_q($_REQUEST['value']);
-        			}
-        			else
-        			{
-        				$vp_data[$_REQUEST['var_id']]['artnr'] = wpsg_q($_REQUEST['value']);
-        			}
-
-        		}
-        		else if ($_REQUEST['typ'] == "var_stock")
-        		{
-
-        			$_REQUEST['value'] = intval(wpsg_sinput("key", $_REQUEST['value']));
-        			$vp_data[$_REQUEST['var_id']]['stock'] = $_REQUEST['value'];
-
-        		}
-		        else if ($_REQUEST['typ'] == "var_min_stock")
-		        {
-
-			        $_REQUEST['value'] = intval(wpsg_sinput("key", $_REQUEST['value']));
-			        $vp_data[$_REQUEST['var_id']]['min_stock'] = $_REQUEST['value'];
-
-		        }
-
-        		$this->saveVariantsData($vp_data);
-
-        		die(strval(wpsg_xss($_REQUEST['value'])));
-
-        	}
-
-        } // public function produkt_ajax()
-		
-		public function product_getPrice(&$oProduct, &$price_netto, &$price_brutto, $product_key, $amount, $weight) {
-			
-			if ($this->isVariantsProduct($oProduct->id)) {
-				
-				$arVariant = $this->getVariants($oProduct->id, true, true, true);
-				
-				if ($product_key === false) {
-
-					$arDefaultKey = [];
-					
-					// StandardschlÃŒssel ermitteln							
-					foreach ($arVariant as $variant_id => $variant_data)
-					{
-						
-						$arDefaultKeyValues = $variant_id.':'.array_keys($variant_data['arVariation'])[0];
-						$arDefaultKey[] = $arDefaultKeyValues;
-						
-					}
-					
-					$product_key = 'pv_'.$oProduct->id.'|'.implode('|', $arDefaultKey);
-					
-				}
-				
-			}
-			
-			if ($this->isVariantsProductKey($product_key)) {
-				
-				if ($this->shop->getBackendTaxView() === WPSG_BRUTTO) {
-						
-					$price_brutto = $this->calculateVariantsPrice($price_brutto, $arVariant, $product_key);
-					$price_netto = wpsg_calculatePreis($price_brutto, WPSG_NETTO, $this->shop->getDefaultCountry()->getTax($oProduct->mwst_key));
-					
-				} else {
-					
-					$price_netto = $this->calculateVariantsPrice($price_netto, $arVariant, $product_key);
-					$price_brutto = wpsg_calculatePreis($price_netto, WPSG_BRUTTO, $this->shop->getDefaultCountry()->getTax($oProduct->mwst_key));
-					
-				}
-				
-			}
-			
-		}
-			
-			/**
-		 * Darf das Produkt gekauft werden?
-		 */
-		public function canOrder($product_key) {
-
-			$product_id = $this->shop->getProduktID($product_key);
-
-			if ($this->isVariantsProduct($product_id)) {
-
-				$nActive = 0;
-
-				$variants = $this->getVariants($product_id);
-
-				foreach ($variants as $var_id => $var_info)
-				{
-
-					$nActive += $var_info['count_active'];
-
-				}
-
-				if ($nActive <= 0) return -2;
-
-			}
-
-		}
-		
-		/**
-		 * ErmÃ¶glicht es die Ersetzungsfunktion aus einem Modul zu erweitern
-		 */
-		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false) {
-			
-			$product_key = $this->db->fetchOne("SELECT `productkey` FROM `".WPSG_TBL_ORDERPRODUCT."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `p_id` = '".wpsg_q($product_id)."' AND `product_index` = '".wpsg_q($product_index)."' ");
-			 			
-			if ($this->isVariantsProductKey($product_key)) {
-				
-				$arVariantenInfo = $this->getVariantenInfoArray($product_key);
-				
-				foreach ($arVariantenInfo as $k => $v) {
-					
-					if (is_numeric($k)) {
-						
-						$arReplace['/%productvariants_'.$k.'_value%/i'] = $v['value'];
-						$arReplace['/%productvariants_'.$k.'_artnr%/i'] = $v['artnr'];
-						$arReplace['/%productvariants_'.$k.'_price%/i'] = $v['preis'];
-						
-					}
-					
-				}
-				
-				$arReplace['/%productvariants_key%/i'] = $arVariantenInfo['key'];
-				$arReplace['/%productvariants_akey%/i'] = $arVariantenInfo['akey'];
-								
-			} 
-			
-		}
-		
-		/* Modulfunktionen */
-
-		/**
-		 * Gibt den Bestand fÃŒr eine Variation zurÃŒck
-		 * @var $product_key String
-		 * Beispiel: pv_1|1:1
-		 *
-		 * Wird vom Lagerbestandsmodul aufgerufen, sollte NUR mit einem VariantenschlÃŒssel aufgerufen werden
-		 */
-		public function getStockForVariation($product_key) {
-
-			$arVariInfo = $this->explodeProductKey($product_key);
-			$oProduct = wpsg_product::getInstance($arVariInfo['product_id']);
-
-			if (!wpsg_isSizedArray($arVariInfo['arVari'])) return $oProduct->stock;
-			else
-			{
-
-				$nStock = 0;
-				$variConf = $this->getVariants($arVariInfo['product_id'], true, true, true);
-
-				foreach ($arVariInfo['arVari'] as $var_id => $vari_id)
-				{
-
-					$nStock += $variConf[$var_id]['arVariation'][$vari_id]['stock'];
-
-				}
-
-				return $nStock;
-
-			}
-
-		} // public function getStockForVariation($product_key)
-
-        /**
-         * Speichert die Varianten
-         */
-        public function saveVariantsData($vp_data)
-        {
- 
-			foreach ($vp_data as $var_id => $var_data)
-			{
-				
-				foreach ($var_data['arVariation'] as $vari_id => $vari_data)
-				{
-					
-					if (!wpsg_isSizedInt($vari_data['id']))
-					{
-					
-						// Variation zu Produkt suchen
-						$exist_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `variation_id` = '".wpsg_q($_REQUEST['vari_id'])."' AND `product_id` = '".wpsg_q($_REQUEST['product_id'])."' ");
-						
-						$vari_data['id'] = $exist_id;
-						
-					}
-						
-					
-					if (!wpsg_isSizedInt($vari_data['id']))
-					{
-						
-						// Ist im Request alles drin was ich brauche, dann anlegen
-						if (wpsg_isSizedInt($_REQUEST['var_id']) && wpsg_isSizedInt($_REQUEST['vari_id']) && wpsg_isSizedInt($_REQUEST['product_id']))
-						{
-							
-							$this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, array(
-								'variation_id' => wpsg_q($_REQUEST['vari_id']),
-								'product_id' => wpsg_q($_REQUEST['product_id']),
-								'images' => wpsg_q($vari_data['images']),
-								'images_set' => wpsg_q($vari_data['images_set'])
-							));
-							
-						}
-						
-					} 
-					else 
-					{
-						
-						$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIATION, array(
-							'images' => wpsg_q($vari_data['images']),
-							'images_set' => wpsg_q($vari_data['images_set'])
-						), " `id` = '".wpsg_q($vari_data['id'])."' ");
-						
-					}
-					
-				}
-				
-			} 
-						
-        } // public function saveVariantsData($produkt_id, $vp_data)
- 
-        /**
-         * LÃ€dt die Varianteninformationen aus dem serialisierten Array
-         * @param $noTrans Wird diese Variable auf true gesetzt, so wird die Ãbersetzung nicht geladen (Wie Backend) Wichtig wenn die Varianten wieder gespeichert werden sollen!
-         */
-        public function loadVarianten($produkt_id, $noTrans = false, $noCache = false)
-        {
-
-        	if (is_admin()) $noCache = true;
-
-        	if (!$noCache && array_key_exists($produkt_id.$noTrans, wpsg_getArray($this->cache_variData))) return $this->cache_variData[$produkt_id.$noTrans];
-
-            // Im Frontend geht es nach der Sprache auf der der Shop aktuell lÃ€uft
-            if ($this->shop->isOtherLang())
-            {
-
-                $parent_lang_id = $this->db->fetchOne("SELECT `lang_parent` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'");
-                if (!wpsg_isSizedInt($parent_lang_id)) $parent_lang_id = $produkt_id;
-
-                $vp_data = @unserialize($this->db->fetchOne("SELECT `images` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `id` = '".wpsg_q($parent_lang_id)."'"));
-                if (!is_array($vp_data)) $vp_data = array();
-
-                foreach ($vp_data as $k => $v)
-                {
-
-                    // Den Namen der Variante auf die aktuelle Sprache stellen
-                    if (wpsg_isSizedString($vp_data[$k]['lang'][$this->shop->getCurrentLanguageCode()]['name'])) $vp_data[$k]['name'] = $vp_data[$k]['lang'][$this->shop->getCurrentLanguageCode()]['name'];
-
-                    if (wpsg_isSizedArray($vp_data[$k]['vari']))
-                    {
-
-                        foreach ($vp_data[$k]['vari'] as $k2 => $vari)
-                        {
-
-                            // Den Namen der Variation auf die aktuelle Sprache korrigieren
-                            if (wpsg_isSizedString($vp_data[$k]['lang'][$this->shop->getCurrentLanguageCode()]['vari'][$k2]['name'])) $vp_data[$k]['vari'][$k2]['name'] = $vp_data[$k]['lang'][$this->shop->getCurrentLanguageCode()]['vari'][$k2]['name'];
-
-                        }
-
-                    }
-
-                }
-
-            }
-            else
-            {
-
-                if (isset($_REQUEST['vari_id']))
-				{
-
-                    $vp_data = @unserialize($this->db->fetchOne("SELECT `images` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `id` = '".wpsg_q($_REQUEST['vari_id'])."'"));
-                    if (!is_array($vp_data)) $vp_data = array();
-
-                }
-                else
-                {
-
-                    $strQuery =
-                    "SELECT PVV.`id`, PVV.`variation_id`, PVV.`product_id`, PVV.`anr`, PVV.`price`, PVV.`stock`, PVV.`min_stock`, PVV.`images`, PVV.`weight`, PVV.`fmenge`, PVV.`active`,
-                     VV.`variant_id`, VV.`name` AS VVname, VV.`shortname`, PV.`pos` AS PVpos, VV.`pos` AS VVpos,
-                     V.`name` AS Vname, V.`type`
-                     FROM ".WPSG_TBL_VARIANTS." AS V, ".WPSG_TBL_VARIANTS_VARI." AS VV,
-                     ".WPSG_TBL_PRODUCTS_VARIATION." AS PVV, ".WPSG_TBL_PRODUCTS_VARIANT." AS PV
-                     WHERE V.`id` = VV.`variant_id` AND VV.`id` = PVV.`variation_id` AND PV.`variant_id` = VV.`variant_id` AND
-                     PVV.`product_id` = '".wpsg_q($produkt_id)."' AND VV.`deleted` != 1 AND V.`deleted` != 1
-                     ORDER BY PV.`pos`, VV.`pos`";
-
-                    //$vp_data = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `product_id` = '".wpsg_q($produkt_id)."'");
-                    $vp_data = $this->db->fetchAssoc($strQuery);
-                    if (!is_array($vp_data)) $vp_data = array();
-                    $this->unserializeVariation($vp_data);
-
-                }
-
-            }
-
-        	$this->cache_variData[$produkt_id.$noTrans] = $vp_data;
-
-        	return $vp_data;
-
-        } // public function loadVarianten($produkt_id)
-
-        private function clearArrayForSerialization($ar)
-        {
-
-        	foreach ((array)$ar as $k => $v)
-        	{
-
-        		if (wpsg_isSizedArray($v))
-        		{
-
-        			$ar[$k] = $this->clearArrayForSerialization($v);
-
-        		}
-        		else
-        		{
-
-        			$ar[$k] = preg_replace('/\'|\`|\ÂŽ|\"/', '', $v);
-
-        		}
-
-        	}
-
-        	return $ar;
-
-        } // private function clearArrayForSerialization($ar)
-
-        /**
-         * Gibt den Namen der Variante zurÃŒck
-         */
-        public function getVariantenName($vp_data, $var_id)
-        {
-
-        	$name = $vp_data[$var_id]['name'];
-
-        	if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-        	{
-        		if ($vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['name'] != "")
-        		{
-        			$name = $vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['name'];
-        		}
-        	}
-
-        	return ((trim($name) == "")?"----":$name);
-
-        } // public function getVariantenName($vp_data, $v_id)
-
-        /**
-         * Gibt den Namen der Variation zurÃŒck
-         */
-        public function getVariName($vp_data, $var_id, $vari_id)
-        {
-
-        	$name = $vp_data[$var_id]['arVariation'][$vari_id]['name'];
-
-        	if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
-        	{
-        		if ($vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['arVariation'][$vari_id]['name'] != "")
-        		{
-        			$name = $vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['arVariation'][$vari_id]['name'];
-        		}
-        	}
-
-        	return ((trim($name) == "")?"----":$name);
-
-        } // public function getVariName($vp_data, $var_id, $vari_id)
-
-		/**
-		 * PrÃŒft ob das Produkt ein Variantenprodukt ist oder nicht
-		 */
-		public function isVariantsProduct($product_id)
-		{
-
-			$strQuery = "
-				SELECT
-					COUNT(*)
-				FROM
-					`".WPSG_TBL_VARIANTS_VARI."` AS VI
-						LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PVI ON (PVI.`variation_id` = VI.`id`)
-						LEFT JOIN `".WPSG_TBL_VARIANTS."` AS V ON (V.`id` = VI.`variant_id`)
-				WHERE
-					PVI.`product_id` = '".wpsg_q($product_id)."' AND
-					PVI.`active` = '1' AND
-					V.`deleted` != '1' AND
-					VI.`deleted` != '1'
-			";
-
-			$nActiveVariants = intval($this->db->fetchOne($strQuery));
-
-			if ($nActiveVariants > 0) return true; else return false;
-
-		} // public function isVariantsProduct($product_id)
-
-		/**
-		 * Integration in das Produkttemplate
-		 */
-		public function productTemplate($product_data)
-		{
-
-			die("Veraltet");
-
-			if (!wpsg_isSizedArray($product_data['arVariant'])) return;
-
-			$this->shop->view['wpsg_mod_productvariants']['product_id'] = $product_data['product_id'];
-			$this->shop->view['wpsg_mod_productvariants']['arVariants'] = $product_data['arVariant'];
-			$this->shop->view['wpsg_mod_productvariants']['product_variants'] = $this->explodeProductKey($product_data['product_key'])['arVari'];
-
-			$this->shop->render(WPSG_PATH_VIEW.'mods/mod_productvariants/productTemplate.phtml');
-
-		} // public function productTemplate($product_key)
-
-		/**
-		 * Ãbernimmt die Auswahl der Variante im Produkttemplate
-		 */
-		public function renderTemplate($product_key)
-		{
-
-			if (!$this->isVariantsProductKey($product_key)) return false;
-
-			$product_id = $this->shop->getProduktID($product_key);
-			
-			$vp_data = $this->getVariants($product_id, true, true, true);
-
-			$this->shop->view['vp_data'] = $vp_data;
-			$this->shop->view['vp_info'] = $this->getVariantenInfoArray($product_key);
-			
-			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/produkt.phtml', false);
-
-		} // public function renderTemplate($produkt_id)
-
-		/**
-		 * Gibt ein Array mit Informationen aus dem VariantenschlÃŒssel zurÃŒck
-		 * Besp: pv_1|1:1
-		 * Array
-			(
-    			[product_id] => 1
-    			[arVari] => Array
-		 		(
-            		[1] => 1
-        		)
-
-			)
-		 * Anhand des ProduktschlÃŒssels z.B. pv_1|4:6|1:8|6:11|5:10
-		 */
-		public function explodeProductKey($product_key)
-		{
-
-			if (is_numeric($product_key)) return array(
-				'product_id' => $product_key,
-				'arVari' => array()
-			);
-
-			$arKey = explode('|', $product_key);
-			$arReturn = array();
-
-			for ($i = 1; $i < sizeof($arKey); $i ++)
-			{
-
-				$arKeyValue = explode(':', $arKey[$i]);
-				$arReturn[$arKeyValue[0]] = $arKeyValue[1];
-
-			}
-
-			return array(
-				'product_id' => substr($arKey[0], 3),
-				'arVari' => $arReturn
-			);
-
-		} // public function explodeProductKey($product_key)
-
-		/**
-		 * Gibt true zurÃŒck, wenn der Preis im Produkttemplate angezeigt werden soll
-		 * Andersrum programmiert, da die Default Einstellung anzeigen ist????
-		 */
-		public function showVariPrice($vari_price)
-		{
-
-			switch ($this->shop->get_option('wpsg_mod_productvariants_price'))
-			{
-
-				case '1': // nur wenn grÃ¶Ãer 0
-
-					if ($vari_price <= 0) return false;
-
-					break;
-
-				case '0': // nie anzeigen
-
-					return false;
-
-					break;
-
-			}
-
-			return true;
-
-		} // public function showVariPrice($vari_price)
-
-		private function calculateVariantsPrice($price, $arVariant, $product_key)
-		{
-
-			$arProductVariant = $this->explodeProductKey($product_key)['arVari'];
-
-			foreach ($arProductVariant as $variant_id => $variation_id)
-			{
-
-				$price += $arVariant[$variant_id]['arVariation'][$variation_id]['price'];
-
-			}
-
-			return $price;
-		}
-
-		/**
-		 * Mit dieser Funktion kann eine golbale Produktvariante fÃŒr alle Downloadplus Produkte gesetzt oder deaktiviert werden
-		 */
-		private function admin_wpsg_mod_downloadplus_setProductsAction() {
-
-			$variation_id = intval($_REQUEST['vari_id']);
-			$active = intval($_REQUEST['active']);
-
-			$nUpdated = 0;
-
-			foreach (wpsg_product::find() as $oProduct) {
-
-				if ($this->shop->callMod('wpsg_mod_downloadplus','isPDFProdukt', [$oProduct->getId()])) {
-
-					$exist_id = intval($this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `product_id` = '".wpsg_q($oProduct->getId())."' AND `variation_id` = '".wpsg_q($variation_id)."' "));
-
-					$db_data = [
-						'active' => M1::q($active)
-					];
-
-					if ($exist_id > 0) $this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIATION, $db_data, " `id` = '".M1::q($exist_id)."' ");
-					else $this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, [
-						'product_id' => M1::q($oProduct->getId()),
-						'variation_id' => M1::q($variation_id)
-					] + $db_data);
-
-					$nUpdated ++;
-
-				}
-
-			}
-
-			echo wpsg_translate(__('#1# Produkt(e) aktualisiert.', 'wpsg'), $nUpdated); exit;
-
-		}
-
-		private function convert_1Action(): void {
-			
-			$arProductCol = $this->db->fetchAssocField("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '".WPSG_TBL_PRODUCTS."' ");
-			
-			// EAN / GTIN aus dem Produktartikel Modul in die fixen Spalten
-			if ($this->shop->hasMod('wpsg_mod_produktartikel')) {
-			 
-				if (in_array('ean', $arProductCol)) {
-					
-					$arProductData = $this->db->fetchAssoc("SELECT `id`, `ean` FROM `".WPSG_TBL_PRODUCTS."` WHERE `ean` != '' ");
-					
-					if (sizeof($arProductData) > 0) {
-						
-						foreach ($arProductData as $product_data) {
-							
-							$oProduct = wpsg_product::getInstance(intval($product_data['id']));
-							$oProduct->setMeta('ean', $product_data['ean']);
-							
-							$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, [
-								'ean' => ''
-							], " `id` = '".intval($oProduct->getId())."' ");
-							
-						}
-						
-					}
-					
-				}
-				
-				if (in_array('gtin', $arProductCol)) {
-					
-					$arProductData = $this->db->fetchAssoc("SELECT `id`, `gtin` FROM `".WPSG_TBL_PRODUCTS."` WHERE `gtin` != '' ");
-					
-					if (sizeof($arProductData) > 0) {
-						
-						foreach ($arProductData as $product_data) {
-							
-							$oProduct = wpsg_product::getInstance(intval($product_data['id']));
-							$oProduct->setMeta('gtin', $product_data['gtin']);
-							
-							$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, [
-								'gtin' => ''
-							], " `id` = '".intval($oProduct->getId())."' ");
-							
-						}
-						
-					}
-					
-				}
-				
-			}
-			
-			// ANR, EAN aus den Varianten
-			$arProductVariationCol = $this->db->fetchAssocField("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '".WPSG_TBL_PRODUCTS_VARIATION."' ");
-				
-			if (in_array('anr', $arProductVariationCol) && in_array('ean', $arProductVariationCol)) {
-				
-				$arProductVariationData = $this->db->fetchAssoc("SELECT DISTINCT `product_id` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `anr` != '' OR `ean` != '' ");
-				if (sizeof($arProductVariationData) > 0) {
-					
-					foreach ($arProductVariationData as $product_variation_data) {
-						
-						try {
-							
-							$oProduct = wpsg_product::getInstance(intval($product_variation_data['product_id']));
-							
-							$arPossibleKeys = $oProduct->getPossibleProductVariantKeys();
-							
-							foreach ($arPossibleKeys as $k => $v) {
-								
-								$oCombination = \wpsg\wpsg_combination::getByProductAndKey($oProduct->getId(), $v['var_key']);
-								
-								$arKeyCombi = explode('|', $v['var_key']);
-								$arVarVari = [];
-								
-								foreach ($arKeyCombi as $var_vari) {
-									
-									list($var_id, $vari_id) = array_map('intval', explode(':', $var_vari));
-									
-									$arVarVari[$var_id] = $vari_id;
-									
-								}
-								
-								$arAnr = [];
-								
-								foreach ($this->db->fetchAssocField("SELECT `variant_id` FROM `".WPSG_TBL_PRODUCTS_VARIANT."` WHERE `variant_id` IN (".implode(',', array_keys($arVarVari)).") AND `product_id` = '".intval($oProduct->getId())."' ORDER BY `pos` ASC ") as $var_id) {
-									
-									$arAnr[] = $this->db->fetchOne("SELECT `anr` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `variation_id` = '".intval($arVarVari[intval($var_id)])."' AND `product_id` = '".intval($oProduct->getId())."' ");
-									
-								}
-								
-								if ($oCombination->getMeta('anr', false, '') === '') $oCombination->setMeta('anr', trim(implode(' / ', $arAnr), '/ '));
-								
-							}
-							
-							$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIATION, [
-								'anr' => '',
-								'ean' => ''
-							], " `product_id` = '".intval($product_variation_data['product_id'])."' ");
-							
-						} catch (\Exception $e) { }
-						
-					}
-					
-				}
-				
-			}
-			
-			$this->shop->addBackendMessage(__('Es wurden alte Artikelnummern und EAN Nummern ÃŒberfÃŒhrt.', 'wpsg'));
-            $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin'); exit;
-			
-		}
-		
-		private function combinationAction(): void {
-			
-			$request_body = file_get_contents('php://input');
-			$data = json_decode($request_body, true);
-			
-			if (!isset($data['product_id']) || $data['product_id'] <= 0) throw new \Exception(_('Aufrufsfehler!'));
-			if (!isset($data['action_do'])) throw new \Exception(_('Aufrufsfehler!'));
-			
-			$result = null;
-			
-			if (in_array($data['action_do'], ['add', 'edit', 'save'])) {
-			
-				if (strlen(trim($data['var_key']??'')) === 0) throw new \Exception(_('Aufrufsfehler!'));
-				
-				$oCombination = \wpsg\wpsg_combination::getByProductAndKey($data['product_id'], $data['var_key']);
-				
-				if ($data['action_do'] === 'save') {
-				
-					$oCombination->setMeta('anr', $data['combination']['anr']);
-					$oCombination->setMeta('name', $data['combination']['name']);
-					$oCombination->setMeta('detailname', $data['combination']['detailname']);
-					
-					foreach (($data['combination']['arProductCodes']??[]) as $code_key => $code_data) {
-						
-						if ($code_data['set'] === true) {
-							
-							$oCombination->setMeta($code_key, $code_data['code']);
-							
-						} else {
-							
-							$oCombination->setMeta($code_key, '');
-							
-						}
-						
-					}
-					
-				}
-				
-				$result = ['combination' => $oCombination->toJSON()];
-				
-			} else if ($data['action_do'] === 'getCombination') {
-				
-				$oProduct = wpsg_product::getInstance($data['product_id']);
-				
-				$arPossibleKeys = $oProduct->getPossibleProductVariantKeys();
-	
-				foreach ($arPossibleKeys as $k => $v) {
-					
-					$arPossibleKeys[$k]['data'] = null;
-					
-					try {
-						
-						$arPossibleKeys[$k]['id'] = intval(\wpsg\wpsg_combination::findByProductAndKey($oProduct->getId(), $v['var_key'])->getId());
-						$arPossibleKeys[$k]['url'] = \wpsg\wpsg_combination::getInstance($arPossibleKeys[$k]['id'])->getVariantUrl();
-						
-					} catch (\Throwable $e) { $arPossibleKeys[$k]['id'] = 0; }
-					
-				}
-				
-				$arVariantInfo = $this->getVariants($oProduct->getId(),  true, true, true);
-	
-				$arVariant = []; $arVariantLabel = []; $arFilter = [];
-				$arVariationen = []; $arVariationLabel = [];
-				
-				foreach ($arVariantInfo as $var) {
-					
-					$arVariant[] = intval($var['id']);
-					$arVariationen[$var['id']] = [];
-					
-					foreach ($var['arVariation'] as $vari) {
-						
-						$arVariationen[intval($var['id'])][] = intval($vari['variation_id']);
-					
-						if (!in_array($var['id'], $arVariationLabel)) try { $arVariationLabel[$vari['variation_id']] = \wpsg\wpsg_variation::getInstance($vari['variation_id'])->getLabel(); } catch (\Exception $e) { $arVariationLabel[$vari['variation_id']] = $vari['variation_id']; }
-						
-					}
-					
-					if (!in_array($var['id'], $arVariantLabel)) try { $arVariantLabel[$var['id']] = \wpsg\wpsg_variant::getInstance($var['id'])->getLabel(); } catch (\Exception $e) {  $arVariantLabel[$var['id']] = $var['id']; }
-					
-					$arFilter[$var['id']] = 0;
-					
-				}
-				
-				$result = [
-					'arVariant' => $arVariant,
-					'arVariantLabel' => $arVariantLabel,
-					'arVariationen' => $arVariationen,
-					'arVariationLabel' => $arVariationLabel,
-					'arPossibleKeys' => $arPossibleKeys,
-					'arFilter' => $arFilter
-				];
-				
-			}
-			
-			wpsg_header::JSONData($result);
-			
-		}
-		
-		private function admin_showAction()
-		{
-
-			$this->shop->view['product_id'] = $_REQUEST['product_id'];
-			$this->shop->view['arVariants'] = $this->getVariants($_REQUEST['product_id'], true);
-
-			die($this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/admin_show.phtml'));
-
-		} // private function showAction()
-
-		private function admin_addAction()
-		{
-
-			$this->db->ImportQuery(WPSG_TBL_VARIANTS, array(
-				'name' => wpsg_q(''),
-				'product_id' => wpsg_q($_REQUEST['product_id']),
-				'deleted' => '0',
-				'pos' => '5000'
-			));
-
-			$this->admin_showAction();
-
-		} // private function admin_addAction()
-
-		private function admin_editAction() {
-
-			$_REQUEST['product_id'] = intval($_REQUEST['product_id']);
-			$_REQUEST['variant_id'] = intval($_REQUEST['variant_id']);
-
-			$this->shop->view['product_id'] = wpsg_getStr($_REQUEST['product_id'], '0');
-			$this->shop->view['variant'] = $this->getVariant($_REQUEST['variant_id']);
-			$this->shop->view['arVariation'] = $this->getVariationOfVariant($_REQUEST['variant_id'], $_REQUEST['product_id']);
-
-			die($this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/admin_edit.phtml'));
-
-		} // private function admin_editAction()
-
-		private function admin_variation_addAction()
-		{
-
-			$variation_id = $this->db->ImportQuery(WPSG_TBL_VARIANTS_VARI, array(
-				'variant_id' => wpsg_q($_REQUEST['variant_id']),
-				'name' => '',
-				'deleted' => '0'
-			));
-
-			if (wpsg_isSizedInt($_REQUEST['product_id']))
-			{
-
-				$arAttachmentIDs = $this->shop->imagehandler->getAttachmentIDs($_REQUEST['product_id']);
-				$arAttachmentIDsAll = $this->shop->imagehandler->getAttachmentIDs($_REQUEST['product_id']);
-				
-				$this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, array(
-					'variation_id' => wpsg_q($variation_id),
-					'images' => implode(',', $arAttachmentIDsAll),
-					'product_id' => wpsg_q($_REQUEST['product_id'])
-				));
-
-			}
-
-			$this->admin_editAction();
-
-		} // private function admin_variation_addAction()
-
-		private function admin_delAction()
-		{
-
-			$this->db->UpdateQuery(WPSG_TBL_VARIANTS, array(
-				'deleted' => '1'
-			), " `id` = '".wpsg_q($_REQUEST['variant_id'])."' ");
-
-			$this->admin_showAction();
-
-		} // private function admin_delAction()
-
-		private function admin_variation_delAction()
-		{
-
-			$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, array(
-				'deleted' => '1'
-			), " `id` = '".wpsg_q($_REQUEST['variation_id'])."' ");
-
-			$this->admin_editAction();
-
-		} // private function admin_variation_delAction()
-
-		private function setProductVariant($product_id, $variant_id, $field, $value)
-		{
-
-			if (!wpsg_isSizedInt($product_id) || !wpsg_isSizedInt($variant_id)) die("Systemfehler");
-
-			$id_exist = $this->db->fetchOne("
-				SELECT
-					`id`
-				FROM
-					`".WPSG_TBL_PRODUCTS_VARIANT."`
-				WHERE
-					`variant_id` = '".wpsg_q($variant_id)."' AND
-					`product_id` = '".wpsg_q($product_id)."'
-			");
-
-			$data = array(
-				$field => wpsg_q($value),
-				'product_id' => wpsg_q($product_id),
-				'variant_id' => wpsg_q($variant_id)
-			);
-
-			if (wpsg_isSizedInt($id_exist)) $this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIANT, $data, " `id` = '".wpsg_q($id_exist)."' ");
-			else $this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIANT, $data);
-
-		} // private function setProductVariant($product_id, $variant_id, $field, $value)
-
-		private function setProductVariation($product_id, $variation_id, $field, $value)
-		{
-
-			if (!wpsg_isSizedInt($product_id) || !wpsg_isSizedInt($variation_id)) die("Systemfehler");
-
-			$id_exist = $this->db->fetchOne("
-				SELECT
-					`id`
-				FROM
-					`".WPSG_TBL_PRODUCTS_VARIATION."`
-				WHERE
-					`variation_id` = '".wpsg_q($variation_id)."' AND
-					`product_id` = '".wpsg_q($product_id)."'
-			");
-
-			$data = array(
-				$field => wpsg_q($value),
-				'product_id' => wpsg_q($product_id),
-				'variation_id' => wpsg_q($variation_id)
-			);
-
-			if (wpsg_isSizedInt($id_exist)) $this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARIATION, $data, " `id` = '".wpsg_q($id_exist)."' ");
-			else $this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARIATION, $data);
-
-			if (($field == 'stock') || ($field == 'active'))
-			{
-				$this->setStockFromVariation($product_id);
-			}
-
-		} // private function setProductVariation($product_id, $field, $value)
-
-		private function setStockFromVariation(string|int $product_key) {
-			
-			// Die Funktion berechnet den Bestand auch im Backend
-			if (!wpsg_product::getInstance($product_key)->isCalcStockFromVariStock()) return;
-
-			$product_id = $this->shop->getProduktID($product_key);
-			
-			$sql = "SELECT SUM(PVI.`stock`) AS SU FROM `".WPSG_TBL_PRODUCTS_VARIATION."` AS PVI
-						LEFT JOIN `".WPSG_TBL_VARIANTS_VARI."` AS VVI ON PVI.`variation_id`= VVI.`id`
-						WHERE PVI.`product_id`='".wpsg_q($product_id)."' AND VVI.`deleted`!='1' AND PVI.`active`='1'
-				";
-			$stock = $this->db->fetchOne($sql);
-
-			$data = array('stock' => wpsg_q($stock));
-
-			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, " `id` = '".wpsg_q($product_id)."' ");
-
-			//getProductKeyFromRequest(&$product_key, $product_id, $form_data)
-			//$stock = $this->shop->callMod('wpsg_mod_productvariants', 'getStockForVariation', array());
-
-		}	// private function setStockFromVariation($product_id)
-
-		private function admin_inlineEditAction() {
-
-			$_REQUEST['field'] = wpsg_sinput("text_field", $_REQUEST['field']);
-
-			if (wpsg_isSizedString($_REQUEST['field'], 'name')) {
-
-				$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
-				$this->db->UpdateQuery(WPSG_TBL_VARIANTS, array('name' => wpsg_q($_REQUEST['value'])), " `id` = '".wpsg_q($_REQUEST['field_id'])."' ");
-
-			} else if (wpsg_isSizedString($_REQUEST['field'], 'type')) {
-
-				$this->db->UpdateQuery(WPSG_TBL_VARIANTS, array('type' => wpsg_q(wpsg_sinput("key", $_REQUEST['value']))), " `id` = '".wpsg_q(wpsg_sinput("key", $_REQUEST['field_id']))."' ");
-				die(self::$arTypeLabel[$_REQUEST['value']]);
-
-			} else if (wpsg_isSizedString($_REQUEST['field'], 'pos')) {
-				
-				$i = 0;
-				foreach ($_REQUEST['value'] as $var) {
-					
-					$var_id = substr($var, 4);
-					
-					if (wpsg_isSizedInt($_REQUEST['product_id'])) $this->setProductVariant($_REQUEST['product_id'], $var_id, 'pos', $i);
-					else $this->db->UpdateQuery(WPSG_TBL_VARIANTS, array('pos' => wpsg_q($i)), " `id` = '".wpsg_q($var_id)."' ");
-					
-					$i++;
-					
-				}
-				
-				die('1');
-				
-			} else if (wpsg_isSizedString($_REQUEST['field'], 'ean')) {
-				
-				$this->setProductVariation($_REQUEST['product_id'], $_REQUEST['field_id'], 'ean', wpsg_xss($_REQUEST['value']));
-				
-			} else if (wpsg_isSizedString($_REQUEST['field'], 'template_id') && $this->shop->hasMod('wpsg_mod_downloadplus')) {
-
-				$arTemplates = $this->shop->callMod('wpsg_mod_downloadplus', 'getTemplate', []);
-                $arTemplatesLabel = [
-                    0 => __('UnverÃ€ndert', 'wpsg')
-                ];
-
-                foreach ($arTemplates as $t) $arTemplatesLabel[intval($t['id'])] = $t['name'];
-
-                $template_id = intval($_REQUEST['value']);
-                $vari_id = intval($_REQUEST['field_id']);
-
-                if ($template_id >= 0 && $vari_id > 0 && isset($arTemplatesLabel[$template_id])) {
-
-                	$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, ['template_id' => wpsg_q($template_id)], " `id` = '".wpsg_q($vari_id)."' ");
-
-                	echo $arTemplatesLabel[$template_id];
-                	exit;
-
-                } else throw new \Exception(__('Template konnte nicht gespeichert werden.', 'wpsg'));
-
-			} else if (wpsg_isSizedString($_REQUEST['field'], 'vari_name')) {
-
-				$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
-				$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, array('name' => wpsg_q($_REQUEST['value'])), " `id` = '".wpsg_q($_REQUEST['field_id'])."' ");
-
-			}
-			else if (wpsg_isSizedString($_REQUEST['field'], 'vari_shortname'))
-			{
-
-				$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
-				$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, array('shortname' => wpsg_q($_REQUEST['value'])), " `id` = '".wpsg_q($_REQUEST['field_id'])."' ");
-
-			}
-			else if (wpsg_isSizedString($_REQUEST['field'], 'vari_pos'))
-			{
-
-				$i = 0; foreach ($_REQUEST['value'] as $vari)
-				{
-
-					$vari_id = substr($vari, 5);
-
-					$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, array('pos' => wpsg_q($i)), " `id` = '".wpsg_q($vari_id)."' ");
-
-					$i ++;
-
-				}
-
-				die('1');
-
-			}
-			else if (preg_match('/vari_(.*)/', $_REQUEST['field']))
-			{
-
-				$value = $_REQUEST['value'];
-				$f = $_REQUEST['field'];
-
-				if (($f == 'vari_fmenge') || ($f == 'vari_stock') || ($f == 'vari_min_stock') || ($f == 'vari_weight'))
-					$value = $_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $value, "isFloat"));
-
-				else
-				{
-
-					if($f == 'vari_anr') $value = $_REQUEST['value'] = wpsg_xss($value);
-					else $value = $_REQUEST['value'] = wpsg_sinput("text_field", $value);
-
-					if($f == 'vari_price') $value = str_replace(",", ".", $value);
-
-				}
-
-				$this->setProductVariation($_REQUEST['product_id'], $_REQUEST['field_id'], substr($_REQUEST['field'], 5), $value);
-
-			}
-
-			// TODO: Ãbersetzung
-
-			die($_REQUEST['value']);
-
-		} // private function admin_inlineEditAction()
-
-		private function admin_removeImageAction() {
-
-			$vari_id = intval($_REQUEST['vari_id']);
-
-			if (!wpsg_isSizedInt($vari_id)) exit;
-
-			$vari_db = $this->db->fetchRow("SELECT `id`, `images` FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `id` = '".wpsg_q($vari_id)."' ");
-
-			if (intval($vari_db['id']) !== $vari_id) exit;
-
-			$arImages = wpsg_trim(explode(',', $vari_db['images']));
-			$arImages = array_filter($arImages, function($e) {
-
-				return intval($e) !== intval($_REQUEST['attachment_id']);
-
-			});
-
-			$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, [
-				'images' => wpsg_q(implode(',', $arImages))
-			], " `id` = '".wpsg_q($vari_id)."' ");
-
-			exit;
-
-		}
-
-		private function admin_uploadAction() {
-
-			$vari_id = intval($_REQUEST['vari_id']);
-
-			if (!wpsg_isSizedInt($vari_id)) exit;
-
-			$vari_db = $this->db->fetchRow("SELECT `id`, `images` FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `id` = '".wpsg_q($vari_id)."' ");
-
-			if (intval($vari_db['id']) !== $vari_id) exit;
-
-			$arImages = wpsg_trim(explode(',', $vari_db['images']));
-
-			foreach ($_REQUEST['arAtt'] as $attachment_id) {
-
-				$attachment_id = intval($attachment_id);
-
-				if ($attachment_id > 0) $arImages[] = $attachment_id;
-
-			}
-
-			$this->db->UpdateQuery(WPSG_TBL_VARIANTS_VARI, [
-				'images' => wpsg_q(implode(',', $arImages))
-			], " `id` = '".wpsg_q($vari_id)."' ");
-
-			$this->admin_editAction();
-
-		}
-
-		/**
-		 * Gibt einen Array zurÃŒck, bei denen die SchlÃŒssel die Varianten sind und die Werte die gewÃ€hlten Variationen
-		 */
-		public function getSetVariArray($product_key)
-		{
-
-			if (!$this->isVariantsProductKey($product_key)) return array();
-
-			$arVariSet = explode('|', preg_replace('/^pv_\d*\//', '', $product_key));
-			$arReturn = array();
-			unset($arVariSet[0]);
-
-			foreach ($arVariSet as $var_combi)
-			{
-
-				$var_combi = explode(':', $var_combi);
-				$var = $var_combi[0];
-				$vari = $var_combi[1];
-
-				$arReturn[$var] = $vari;
-
-			}
-
-			return $arReturn;
-
-		}	// private function getSetVariArray($product_key)
-
-		/**
-		 * Gibt die Variationen einer Variante zurÃŒck
-		 * @param Integer $variant_id ID der Variante
-		 */
-		public function getVariationOfVariant($variant_id, $product_id = false, $arProductFilter = array()) {
-
-			$strQuerySELECT = "";
-			$strQueryJOIN = "";
-			$strQueryWHERE = "";
-			$strQueryHAVING = "";
-
-			if (wpsg_isSizedArray($arProductFilter)) {
-
-				//return array($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER);
-				//list($strQueryP_WHERE, $strQueryP_JOIN, $strQueryP_HAVING, $strQueryP_ORDER) = wpsg_product::getQueryParts($arProductFilter);
-
-				list($strQueryP_SELECT, $strQueryP_WHERE, $strQueryP_JOIN, $strQueryP_HAVING, $strQueryP_ORDER) = wpsg_product::getQueryParts($arProductFilter);
-
-				$strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PV ON (PV.`variation_id` = VI.`id`) ";
-				$strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = PV.`product_id`) ";
-
-				$strQuerySELECT .= $strQueryP_SELECT.", PV.`ean`";
-				$strQueryJOIN .= $strQueryP_JOIN;
-				$strQueryWHERE .= $strQueryP_WHERE;
-				$strQueryHAVING .= $strQueryP_HAVING;
-
-			} else if (wpsg_isSizedInt($product_id)) {
-
-				$strQueryJOIN .= " LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PV ON (PV.`variation_id` = VI.`id` AND PV.`product_id` = '".wpsg_q($product_id)."') ";
-				$strQuerySELECT .= " , PV.`id` AS iid, PV.`variation_id`, PV.`active`, PV.`ean`, PV.`anr`, PV.`price`, PV.`stock`, PV.`min_stock`, PV.`images`, PV.`images_set`, PV.`weight`, PV.`fmenge` ";
-
-			}
-
-			if ($this->shop->hasMod('wpsg_mod_downloadplus')) $strQuerySELECT .= " , VI.`template_id` ";
-			
-			$strQuery = "
-				SELECT
-					VI.`id`, VI.`name`, VI.`shortname`, VI.`deleted`, VI.`pos`, VI.`images`
-					".$strQuerySELECT."
-				FROM
-					`".WPSG_TBL_VARIANTS_VARI."` AS VI
-						".$strQueryJOIN."
-				WHERE
-					VI.`variant_id` = '".wpsg_q($variant_id)."' AND
-					VI.`deleted` != '1'
-					".$strQueryWHERE."
-				GROUP BY
-					VI.`id`
-				HAVING
-					1
-					".$strQueryHAVING."
-				ORDER BY
-					VI.`pos`
-			";
-
-			$arVari = $this->db->fetchAssoc($strQuery, "id");
-
-			array_walk($arVari, function(&$e) {
-
-				$e['images'] = wpsg_trim(explode(',', $e['images']));
-
-			});
-
-			// Daschmi: 
-			//$this->checkMinStock($arVari, $product_id);
-
-			return $arVari;
-
-		} // public function getVariationOfVariant($variant_id)
-		
-		/*
-		 * PrÃŒft, ob der Minimallagerbestand erreicht wurde und schickt - sofern dieser Fall eintritt - eine E-Mail
-		 */
-		public function checkMinStock($arVari, $product_id)
-		{
-			
-			$product_data = $this->shop->cache->loadProduct($this->shop->getProduktID($product_id));
-			
-			foreach ($arVari['arVari'] as $var_id => $vari_id) {
-				
-				$vari_info = $this->db->fetchRow("SELECT PV.`stock`, PV.`min_stock`, VARI.`id`, VARI.`name` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` AS PV LEFT JOIN `".wpsg_q(WPSG_TBL_VARIANTS_VARI)."` AS VARI ON (VARI.`id` = PV.`variation_id`) WHERE PV.`product_id` = '".wpsg_q($this->shop->getProduktID($product_id))."' AND PV.`variation_id` = '".wpsg_q($vari_id)."' ");
-				
-				if (isset($vari_info['min_stock']) && (int)$vari_info['stock'] <= (int)$vari_info['min_stock']) {
-					
-					// Spezifischen Index setzen um Email als "Varianten-Information" zu identifizieren
-					$adminName = $this->shop->get_option('wpsg_shopdata_owner')?:__("Administrator", "wpsg");
-					$GLOBALS['stockemail_prodvariant'] = array("produkt" => $product_data, "variant" => $vari_info, "admin_name" => $adminName);
-					
-					if ($this->shop->get_option('wpsg_htmlmail') == 1) {
-						
-						$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/stockmail_html.phtml', false);
-						
-					} else {
-						
-						$mail_html = false;
-						$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/stockmail.phtml', false);
-						
-					}
-					
-					$to = $product_data['minstockproduct_mail'];
-					if(!wpsg_isSizedString($to)) $to = get_bloginfo('admin_email');
-					
-					list($subject, $text) = @$this->shop->sendMail($mail_text, $to, 'wpsgmodstockminstockmail', array(), false, false, $mail_html, wpsg_translate(__('Der Minimalbestand der Variation #1# des Produkts #2# wurde erreicht.', 'wpsg'), $arVari[$variation_id]['name'], $product_data['name']));
-					
-					// Wenn Email gesendet, spezifischen Index lÃ¶schen
-					if(isset($subject) && wpsg_isSized($subject) && isset($text) && wpsg_isSized($text))
-						unset($GLOBALS['stockemail_prodvariant']);
-					
-				}
-				
-			}
-			
-		} // public static function checkMinStock($arVari)
-
-		private function unserializeVariation(&$arVari) {
-			foreach ($arVari as &$vi) {
-				$ar = @unserialize($vi['images']);
-				$vi['pic'] = '';
-				$vi['sel'] = 0;
-				$vi['picOrder'] = Array();
-				if (wpsg_isSizedArray($ar)) {
-					foreach($ar as $k => $v) {
-						$v = preg_replace('/\-(\d+)x(\d+)\./', '.', $v);
-						$vi[$k] = $v;
-					}
-				}
-			}
-		}	// private function unserializeVariation(&$arVari)
- 
-		public function stockVarianten($product_id)
-		{
-
-			$this->shop->view['product_id'] = wpsg_getStr($product_id, '0');
-			//$this->shop->view['variant'] = $this->getVariant($_REQUEST['variant_id']);
-			//$this->shop->view['arVariation'] = $this->getVariationOfVariant($_REQUEST['variant_id'], $_REQUEST['product_id']);
-			//$this->shop->view['arVariant']
-			$vp_data = $this->getVariants($product_id, true, true, true);
-			
-			$html = '<table>';
-			foreach ($vp_data as $var) {
-				$html .= '<tr>';
-				$html .= '<td class="col_shortname" colspan="3">'.wpsg_hspc($var['name']).'</td>';
-				$html .= '</tr>';
-			    foreach ($var['arVariation'] as $vari) {
-			    	$html .= '<tr>';
-			    	$html .= '<td class="col_active">&nbsp;';
-			    	$html .= '</td>';
-			    	$txt = wpsg_hspc($vari['name']).' : '.wpsg_hspc($vari['stock']);
-			    	$html .= '<td class="col_shortname">'.$txt.'</td>';
-			    	$html .= '<td class="col_1">';
-			    	$html .= '</td>';
-			    	$html .= '</tr>';
-				}
-			}
-			$html .= '</table>';
-			die($html);
-
-		} // private function stockVarianten($product_id)
-
-		/**
-		 * Reduziert den Bestand der Variationen in dem Array
-		 */
-		public function reduceStock($produkt_key, $menge, $reduce = true) {
- 
-			$oProduct = wpsg_product::getInstance($produkt_key);
-			
-			if ($oProduct->isReduceVariStockEnabled()) {
-				
-				$arVar = $this->explodeProductKey($produkt_key);
-	
-				//$vari_data = $this->loadVarianten($produkt_id, true, true);
-	
-				// Tabellen sperren
-				if ($this->shop->get_option('wpsg_lockOrderTables') != '1')
-				{
-	
-					$arLockTables[WPSG_TBL_PRODUCTS_VARIATION] = "WRITE";
-					$strQuery = "LOCK TABLES ";
-					foreach ($arLockTables as $table_name => $locktype) $strQuery .= " `".$table_name."` ".$locktype.",";
-					$this->db->Query(substr($strQuery, 0, -1));
-				}
-				
-				foreach ($arVar['arVari'] as $v => $vv)
-				{
-	
-					$pid = $arVar['product_id'];
-					if ($reduce === true)
-					{
-	
-						//$vari_data[$variante_id]['vari'][$vari_id]['stock'] -= $menge;
-						$this->db->Query("
-								UPDATE ".WPSG_TBL_PRODUCTS_VARIATION." SET `stock` = `stock` - ".wpsg_q($menge)." WHERE `variation_id` = '".wpsg_q($vv)."'
-								AND `product_id` = '".wpsg_q($pid)."'");
-	
-					}
-					else
-					{
-	
-						//$vari_data[$variante_id]['vari'][$vari_id]['stock'] += $menge;
-						$this->db->Query("
-								UPDATE ".WPSG_TBL_PRODUCTS_VARIATION." SET `stock` = `stock` + ".wpsg_q($menge)." WHERE `variation_id` = '".wpsg_q($vv)."'
-								AND `product_id` = '".wpsg_q($pid)."'");
-	
-					}
-	
-				}
-				
-				$this->db->unlockTables();
-				
-			}
-
-			$oProduct = wpsg_product::getInstance($produkt_key);
-			
-			if (!$oProduct->isCalcStockFromVariStock()) {
-				
-				// Produktbestand reduzieren
-				$this->db->Query("UPDATE ".WPSG_TBL_PRODUCTS." SET `stock` = `stock` - '".intval($menge)."' WHERE `id` = '".wpsg_q($this->shop->getProduktID($produkt_key))."' ");
-				
-			} else {
-				
-				// Produktbestand aus Variantenbestand ermitteln
-				$this->setStockFromVariation($produkt_key);
-				
-			}
-
-			$this->checkMinStock($arVar, $produkt_key);
-
-			// Array zurÃŒckspeichern
-			//$this->saveVarianten($produkt_id, $vari_data);
-
-		} // public function reduceStock($produkt_id, $menge)
-		
-		/**
-		 *	zusammengesetzte Variantenartikelnummer ersetzt die Artikelnummer 
-		 */
-		public function getProductAnr($product_key, &$anr)
-		{
-		
-			if ($this->isVariantsProductKey($product_key) && wpsg_isSizedInt($this->shop->get_option('wpsg_vp_replaceanr')))
-			{
-		
-				$arVariantenInfo = $this->getVariantenInfoArray($product_key);
-		
-				if (wpsg_isSizedString($arVariantenInfo['akey'])) $anr = $arVariantenInfo['akey'];
-		
-				// Artikelnummer gebildet, keine weiteren Module betrachten
-				return -2;
-		
-			}
-				
-		} // public function getProductAnr($product_key, &$anr)
-		
-		public function getEAN($product_key) {
-			
-			$vari_info = $this->getVariantenInfoArray($product_key);
-			
-			return $vari_info['ean']??'';
-			
-		}
-		
-		/**
-		 * Gibt true zurÃŒck, wenn der ÃŒbergebene Produktkey ein Varianten Produktkey ist. Sonst false.
-		 *
-		 * @param \String $product_key
-		 */
-		public function isVariantsProductKey($product_key) {
-
-            if ($product_key === null) $product_key = '';
-
-			if (preg_match('/^pv_\d+/', $product_key)) {
-
-				return true;
-
-			} else {
-
-				return false;
-
-			}
-
-		} // public function isVariantsProductKey($productkey)
-
-		/**
-		 * Gibt eine einzelne Variante zurÃŒck
-		 * @param unknown $variant_id
-		 */
-		public function getVariant($variant_id, $bHideDeleted = true) {
-
-			$strQueryWHERE = "";
-
-			if ($bHideDeleted === true) $strQueryWHERE .= " AND V.`deleted` != '1' ";
-
-			$strQuery = "
-				SELECT
-					V.*
-				FROM
-					`".WPSG_TBL_VARIANTS."` AS V
-				WHERE
-					V.`id` = '".wpsg_q($variant_id)."'
-					".$strQueryWHERE."
-			";
-
-			$arVariant = $this->db->fetchRow($strQuery);
-
-			if (!wpsg_isSizedInt($arVariant['id'])) return false;
-
-			// TODO: Ãbersetzung
-
-			return $arVariant;
-
-		} // public function getVariant($variant_id)
-
-		public function getVariation($variation_id)
-		{
-
-			$arVariation = $this->db->fetchRow("
-				SELECT
-					VI.*
-				FROM
-					`".WPSG_TBL_VARIANTS_VARI."` AS VI
-				WHERE
-					VI.`id` = '".wpsg_q($variation_id)."'
-			");
-
-			$arVariation['images'] = wpsg_trim(explode(',', $arVariation['images']));
-
-			// TODO: Ãbersetzung
-
-			return $arVariation;
-
-		} // public function getVariation($variation_id)
-
-		protected $_variantsscache = [];
-
-		/**
-		 * Gibt einen Array der Produktvarianten zurÃŒck
-		 * @param Integer|Boolean $product_id Produkt ID
-		 * @param Boolean $global Globale Varianten?
-		 */
-		public function getVariants($product_id = false, $global = true, $onlyActive = false, $loadVariationen = false) {
-
-			$cache_key = __FUNCTION__.implode('|', \func_get_args());
-
-			if (isset($this->_variantsscache[$cache_key])) return $this->_variantsscache[$cache_key];
-
-			$strQuerySELECT = "";
-			$strQueryORDER = "";
-			$strQueryJOIN = "";
-			$strProductQuery = " AND ( 0 ";
-
-			if (wpsg_isSizedInt($product_id)) {
-
-				$strProductQuery .= " OR V.`product_id` = '".wpsg_q($product_id)."' ";
-
-				$strQueryWHERE = "";
-
-				// Wenn Lagerbestand aktiv, dann nur Veriationen mit Lagerbestand zÃ€hlen
-				// Im Backend zÃ€hle ich auch ausverkaufte Variationen mit, sonst steht in der Ãbersicht 0/2 auch wenn bei einem der Haken gesetzt ist
-				if ($this->shop->hasMod('wpsg_mod_stock') && !is_admin()) $strQueryWHERE .= " AND PVI.`stock` > 0 ";
-
-				$strQuerySELECT .= ", (
-					SELECT
-						COUNT(*)
-					FROM
-						`".WPSG_TBL_VARIANTS_VARI."` AS VI
-							LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PVI ON (PVI.`variation_id` = VI.`id`)
-					WHERE
-						PVI.`product_id` = '".wpsg_q($product_id)."' AND
-						PVI.`active` = '1' AND
-						VI.`variant_id` = V.`id` AND
-						VI.`deleted` != '1'
-						".$strQueryWHERE."
-				) AS `count_active` ";
-
-				$strQueryJOIN = " LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIANT."` AS PV ON (PV.`variant_id` = V.`id` AND PV.`product_id` = '".wpsg_q($product_id)."') ";
-
-				$strQueryORDER .= " PV.`pos` ASC, ";
-
-			} else {
-
-				$strQuerySELECT .= ", '0' AS `count_active` ";
-
-			}
-
-			if ($global === true) {
-
-				$strProductQuery .= " OR V.`product_id` = '0' ";
-
-			}
-
-			$strProductQuery .= " ) ";
- 
-			$strQuery = "
-				SELECT
-					V.*,
-					(SELECT COUNT(*) FROM `".WPSG_TBL_VARIANTS_VARI."` AS VI WHERE VI.`variant_id` = V.`id` AND VI.`deleted` != '1') AS `count_variation`,
-					(
-						SELECT
-							COUNT(DISTINCT `product_id`)
-						FROM
-							`".WPSG_TBL_VARIANTS_VARI."` AS VI
-								LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PVI ON (PVI.`variation_id` = VI.`id`)
-								LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (PVI.`product_id` = P.`id`)
-						WHERE
-							VI.`variant_id` = V.`id` AND
-							PVI.`active` = '1' AND
-							P.`id` > 0 AND
-							P.`deleted` != '1'
-					) AS `count_produkte`
-					".$strQuerySELECT."
-				FROM
-					`".WPSG_TBL_VARIANTS."` AS V
-						".$strQueryJOIN."
-				WHERE
-					V.`deleted` != '1'
-					".$strProductQuery."
-				GROUP BY
-					V.`id`
-				ORDER BY
-					".$strQueryORDER."
-					V.`product_id` ASC, V.`pos` ASC
-			";
-
-			$arData = $this->db->fetchAssoc($strQuery, "id");
-
-			foreach ($arData as $k => $v) {
-
-				if ($onlyActive === true && !wpsg_isSizedInt($v['count_active'])) unset($arData[$k]);
-				else {
-
-					$arData[$k]['type_label'] = self::$arTypeLabel[$arData[$k]['type']];
-
-					if ($loadVariationen === true && wpsg_isSizedInt($product_id))
-					{
-
-						$strQueryWHERE = "";
-						
-						if ($onlyActive === true) $strQueryWHERE .= " AND PVI.`active` = '1' ";
-						
-						$arData[$k]['arVariation'] = $this->db->fetchAssoc("
-							SELECT
-								PVI.*, VI.`images` AS `global_images`,
-								VI.`name`, VI.`shortname`, VI.`deleted`, VI.`pos`
-							FROM
-								`".WPSG_TBL_VARIANTS_VARI."` AS VI
-									LEFT JOIN `".WPSG_TBL_PRODUCTS_VARIATION."` AS PVI ON (PVI.`variation_id` = VI.`id`)
-							WHERE
-								VI.`deleted` != '1' AND
-								VI.`variant_id` = '".wpsg_q($v['id'])."' AND
-								PVI.`product_id` = '".wpsg_q($product_id)."' 
-								".$strQueryWHERE."
-							ORDER BY
-								VI.`pos` ASC, VI.`id` ASC
-						", "variation_id");
-
-						array_walk($arData[$k]['arVariation'], function(&$e) {
-
-							$images = explode(',', $e['images']);
-							$images_set = explode(',', $e['images_set']);
-							$images_global = explode(',', $e['global_images']);
-
-							$images = array_merge($images, $images_global);
-							$images_set = array_merge($images_set, $images_global);
-
-							$images = array_unique($images);
-							$images_set = array_unique($images_set);
-
-							$e['images'] = implode(',', $images);
-							$e['images_set'] = implode(',', $images_set);
-							$e['images_global'] = $images_global;
-
-						});
-
-					}
-				}
-
-			}
-
-			// TODO: Ãbersetzung
-
-			$this->_variantsscache[$cache_key] = $arData;
-
-			return $arData;
-
-		}
-
-		public function basket_preInsertDefekt()
-		{
-
-			if (is_array($_REQUEST['wpsg_vp']) && sizeof($_REQUEST['wpsg_vp']) > 0)
-			{
-
-				$var_key = 'pv_'.$_REQUEST['wpsg']['produkt_id'].'|';
-
-				foreach ($_REQUEST['wpsg_vp'] as $var => $var_value)
-				{
-
-					$var_key .= $var.":".$var_value."|";
-
-				}
-
-				$var_key = substr($var_key, 0, -1);
-
-				$_REQUEST['wpsg']['produkt_id'] = $var_key;
-
-			}
-
-		} // public function basket_preInsert()
-
-		public function basket_row(&$p, $i)
-		{
-
-			if (!preg_match('/pv_(.*)/', $p['id'])) return;
-
-			$this->shop->view['variante'] = $this->getVariantenInfoArray($p['id']);
-
-			$this->shop->view['i'] = $i;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/basket_row.phtml');
-
-		} // public function basket_row(&$p)
-
-		public function overview_row(&$p, $i)
-		{
-
-			if (!preg_match('/pv_(.*)/', $p['id'])) return;
-
-			$this->shop->view['variante'] = $this->getVariantenInfoArray($p['id']);
-
-			$this->shop->view['i'] = $i;
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/overview_row.phtml');
-
-		} // public function basket_row(&$p)
-
-		/**
-		 * Ersetzt in einem ProduktKey den Wert einer Variante ($var_id) durch die Variation $vari_id
-		 * 
-		 * @param $product_key
-		 * @param $var_id
-		 * @param $vari_id
-		 * @return string
-		 */
-		public function getSimulatedVariKey($product_key, $var_id, $vari_id)
-		{
-			
-			$vari_info = $this->getVariantenInfoArray($product_key);
-			
-			$product_key_return = 'pv_'.$vari_info['product_id'];
-			
-			foreach ($vari_info as $k => $i)
-			{
-				
-				if (is_numeric($k))
-				{
-					
-					if ($var_id == $k) $product_key_return .= '|'.$k.':'.$vari_id;
-					else $product_key_return .= '|'.$k.':'.$i['vari_id'];
-					
-				}
-				
-			}
-			
-			return $product_key_return;			
-			
-		} // public function getSimulatedVariKey($product_key, $vari_id, $vari_value)
-		
-		/**
-		 * Liest die Informationen anhand eines VariantenschlÃŒssels aus
-		 */
-		public function getVariantenInfoArray($product_key) {
-
-			$produkt_id = $this->shop->getProduktID($product_key);
-			$arVari = explode('|', preg_replace('/pv_'.$produkt_id.'\|/', '', $product_key));
-
-			//$vp_data = $this->loadVarianten($produkt_id);
-			$vp_data = $this->getVariants($produkt_id, true, true, true);
-
-			$arReturn = array(
-				'product_id' => $produkt_id
-			);
-			
-			$arKey = array();
-			$arAKey = array();
-			$arPics = array();
-
-			// kein Produkt-Key dann keine Weiterarbeit nÃ¶tig
-			if (is_numeric($product_key)) {
-
-				$arReturn['key'] = '';
-				$arReturn['akey'] = '';
-				$arReturn['images'] = array();
-
-				return $arReturn;
-
-			}
-
-			if ($this->shop->hasMod('wpsg_mod_fuellmenge')) $arReturn['fmenge'] = 0;
-			if ($this->shop->hasMod('wpsg_mod_weight')) $arReturn['weight'] = 0;
-
-			/** Alle Bilder des Produkts */
-			$arImagesProduct = $this->shop->imagehandler->getAttachmentIDs($produkt_id);
-			$arImages = $arImagesProduct;
-
-			/** Globale Varianten kÃ¶nnten auch erlaubte Bilder haben */
-			$arGlobalImages = [];
-			foreach ($vp_data as $var_id => $var_data) {
-
-				foreach ($var_data['arVariation'] as $vari_id => $vari_data) {
-
-					$arGlobalImages = array_merge($arGlobalImages, wpsg_getArray($vari_data['images_global']));
-
-				}
-
-			}
-
-			$arImages = array_merge($arImages, $arGlobalImages);
-			$arImagesFix = [];
-			
-			$strEAN = '';
-
-			foreach ($arVari as $var_key) {
-
-				$var_id = preg_replace('/\:(.*)/', '', $var_key);
-				$var_value = preg_replace('/(.*)\:/', '', $var_key);
-
-				$arPicsVariante = array();
-
-				/* Bilder dieser Variation */
-				$arImagesVariation = wpsg_trim(
-					explode(',', @$vp_data[$var_id]['arVariation'][$var_value]['images_set'])
-				);
-
-				/* Globale Bilder der Variation bleiben erhalten auch wenn nicht ausgewÃ€hlt */
-				$arImagesFix = wpsg_trim(array_merge(
-					$arImagesFix, wpsg_getArray($vp_data[$var_id]['arVariation'][$var_value]['images_global'])
-				));
-
-				/* Schnittmenge */
-				$arImages = array_intersect($arImages, $arImagesVariation);
-
-				foreach ($arImagesFix as $i) if (!in_array($i, $arImages)) $arImages[] = $i;
-
-				$r = array(
-					'vari_id' => $var_value,
-					'ean' => $vp_data[$var_id]['arVariation'][$var_value]['ean']??'',
-					'name' 	=> $vp_data[$var_id]['name']??'',
-					'value' => $vp_data[$var_id]['arVariation'][$var_value]['name']??'',
-					'preis'	=> $vp_data[$var_id]['arVariation'][$var_value]['price']??'',
-					'artnr'	=> @$vp_data[$var_id]['arVariation'][$var_value]['anr']??'',
-					'images' => $arImagesVariation
-				);
-
-				if ($this->shop->hasMod('wpsg_mod_weight') && wpsg_isSizedInt($vp_data[$var_id]['arVariation'][$var_value]['weight'])) {
-
-					$r['weight'] = $vp_data[$var_id]['arVariation'][$var_value]['weight'];
-					$arReturn['weight'] += $r['weight'];
-
-				}
-
-				if ($this->shop->hasMod('wpsg_mod_fuellmenge') && wpsg_isSizedInt($vp_data[$var_id]['arVariation'][$var_value]['fmenge'])) {
-
-					$r['fmenge'] = $vp_data[$var_id]['arVariation'][$var_value]['fmenge'];
-					$arReturn['fmenge'] += $r['fmenge'];
-
-				}
-
-				$arReturn[$var_id] = $r;
-
-				$strEAN .= $r['ean'];
-				$arKey[] = $vp_data[$var_id]['arVariation'][$var_value]['name']??'';
-				$arAKey[] = @$vp_data[$var_id]['arVariation'][$var_value]['anr']??'';
- 
-			}
-
-			$arReturn['ean'] = $strEAN;
-			$arReturn['key'] = implode(' / ', $arKey);
-			$arReturn['akey'] = implode(' / ', $arAKey);
-			$arReturn['images'] = wpsg_trim(array_unique($arImages));
-			
-			if (!wpsg_isSizedArray($arReturn['images'])) $arReturn['images'] = $arImagesProduct;
-
-			return $arReturn;
-
-		} // public function getVariantenInfoArray($vari_key)
- 
-        public function product_deletePermanently($product_id) {
-
-		    if (!M1::isSizedInt($product_id)) throw new \wpsg\Exception(__('Produkt mit ungÃŒltiger ID kann nicht gelÃ¶scht werden.', 'wpsg'));
-
-            $arVariantID = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_VARIANTS."` WHERE `product_id` = '".M1::q($product_id)."' ");
-
-            foreach ($arVariantID as $variant_id) {
-
-                // Variationen lÃ¶schen
-                $this->db->Query("DELETE FROM `".WPSG_TBL_VARIANTS_VARI."` WHERE `variant_id` = '".M1::q($variant_id)."' ");
-
-            }
-
-            // Produktvarianten lÃ¶schen
-            $this->db->Query("DELETE FROM `".WPSG_TBL_VARIANTS."` WHERE `product_id` = '".M1::q($product_id)."' ");
-
-            // Product <-> Variation lÃ¶schen
-            $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `product_id` = '".M1::q($product_id)."' ");
-
-            // Product <-> Variant lÃ¶schen
-            $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_VARIANT."` WHERE `product_id` = '".M1::q($product_id)."' ");
-
-        }
-		
-		public function systemcheck(&$arData) {
-			
-			$bNeedConvert = false;
-
-			$arProductCol = $this->db->fetchAssocField("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '".WPSG_TBL_PRODUCTS."' ");
-			
-			// EAN / GTIN aus dem Produktartikel Modul in die fixen Spalten
-			if ($this->shop->hasMod('wpsg_mod_produktartikel')) {
-			 
-				if ($bNeedConvert === false && in_array('ean', $arProductCol)) {
-					
-					$arProductIDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `ean` != '' ");
-					if (sizeof($arProductIDs) > 0) $bNeedConvert = true;
-					
-				}
-					
-				if ($bNeedConvert === false && in_array('gtin', $arProductCol)) {
-					
-					$arProductIDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `gtin` != '' ");
-					if (sizeof($arProductIDs) > 0) $bNeedConvert = true;
-					
-				}
-				
-			}
-			
-			// ANR, EAN aus den Varianten
-			if ($bNeedConvert === false) {
-			
-				$arProductVariationCol = $this->db->fetchAssocField("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '".WPSG_TBL_PRODUCTS_VARIATION."' ");
-				
-				if (in_array('anr', $arProductVariationCol) && in_array('ean', $arProductVariationCol)) {
-					
-					$arProductIDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_VARIATION."` WHERE `anr` != '' OR `ean` != '' ");
-					if (sizeof($arProductIDs) > 0) $bNeedConvert = true;
-					
-				}
-				
-			}
-			
-			if ($bNeedConvert === true) {
-			
-				$arData[] = [
-					'wpsg_mod_productvariants_convert_1',
-					wpsg_ShopController::CHECK_ERROR,
-					wpsg_translate(
-						__('Es gibt alte Artikelnummern / EAN in Varianten die falsch zugeordnet sind. Klicken Sie <a href="#1#">hier</a> um diese in die neue Struktur zu ÃŒberfÃŒhren.', 'wpsg'),
-						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&modul=wpsg_mod_productvariants&action=module&noheader=1&subaction=convert_1'
-					)
-				];
-				
-			}
-
-        }
-
-    }
-
Index: /mods/wpsg_mod_productvars.class.php
===================================================================
--- /mods/wpsg_mod_productvars.class.php	(revision 8528)
+++ /mods/wpsg_mod_productvars.class.php	(revision 5261)
@@ -6,14 +6,12 @@
 	 *
 	 */
-	class wpsg_mod_productvars extends wpsg_mod_basic {
-
-        /** @var array $arTypen */
-        public $arTypen = [];
-
+	class wpsg_mod_productvars extends wpsg_mod_basic 
+	{
+		
 		var $lizenz = 1;
 		var $id = 950;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=815';
-		var $inline = false;
-
+		var $inline = true;
+		
 		/**
 		 * Costructor
@@ -21,28 +19,27 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
-
+			
 			$this->name = __('Produktvariablen', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht das Erfassen von Kundeneingaben zu bestellten Produkten.', 'wpsg');
-
+			
 			$this->arTypen = array(
 				1 => __('Auswahl', 'wpsg'),
-				2 => __('Textzeile', 'wpsg'),
-				4 => __('Textfeld', 'wpsg'),
-				3 => __('Checkbox', 'wpsg')
+				2 => __('Texteingabe', 'wpsg'),
+				3 => __('Checkbox', 'wpsg') 
 			);
-
+									
 		} // public function __construct()
-
-		public function install()
-		{
-
+		
+		public function install() 
+		{ 
+			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
+			
 			/*
 			 * Posts Tabelle erweitern
-			 */
+			 */ 
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS_VARS." (
 		   		id mediumint(9) NOT NULL AUTO_INCREMENT,
@@ -51,40 +48,31 @@
 		   		auswahl VARCHAR(5000) NOT NULL,
 				pos int(11) NOT NULL,
-		   		pflicht INT(1) NOT NULL,
+		   		pflicht INT(1) NOT NULL, 
 		   		PRIMARY KEY  (id)
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+   	   	 
    			dbDelta($sql);
-
-		} // public function install()
-
-		public function settings_edit()
-		{
-
+			
+		} // public function install() 
+		
+		public function settings_edit() 
+		{
+			
 			$this->shop->mod = $this;
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
-		public function settings_save() {
-
-		    $this->shop->update_option('wpsg_mod_productvars_showProduct', $_REQUEST['wpsg_mod_productvars_showProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_productvars_showBasket', $_REQUEST['wpsg_mod_productvars_showBasket'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_productvars_showOverview', $_REQUEST['wpsg_mod_productvars_showOverview'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_productvars_showMail', $_REQUEST['wpsg_mod_productvars_showMail'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-		}
-
+		
 		public function be_ajax()
 		{
-
+			
 			$this->shop->mod = $this;
-
+			
 			if ($_REQUEST['do'] == 'add')
 			{
-
+				
 				$new_name = __('Anklicken um den Namen der Produktvariable zu Ã€ndern ...', 'wpsg');
 				$new_auswahl = __('Bitte zum Bearbeiten anklicken.', 'wpsg');
-
+				
 				// Versandzone in Datenbank eintragen
 				$pv_id = $this->db->ImportQuery(WPSG_TBL_PRODUCTS_VARS, array(
@@ -92,268 +80,257 @@
 					'typ' => '2',
 					'auswahl' => $new_auswahl,
-					'pflicht' => ''
+					'pflicht' => ''					
 				));
-
+				
 				$this->shop->addTranslationString('wpsg_mod_productvars_'.$pv_id, $new_name);
 				$this->shop->addTranslationString('wpsg_mod_productvars_auswahl_'.$pv_id, $new_auswahl);
-
+				
 				die($this->pv_list());
-
+				
 			}
 			else if ($_REQUEST['do'] == 'reorder')
 			{
-
+				
 				parse_str($_REQUEST['wpsg_reorder'], $wpsg_reorder);
-
+				
 				foreach ($wpsg_reorder['pv'] as $pos => $pv_id)
 				{
-
+					
 					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARS, array(
 						'pos' => wpsg_q($pos)
 					), " `id` = '".wpsg_q($pv_id)."' ");
-
-				}
-
+					
+				}
+				
 				die("1");
-
+				
 			}
 			else if ($_REQUEST['do'] == 'del')
 			{
-
+				
 				$this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` = '".wpsg_q($_REQUEST['pv_id'])."'");
-
+				
 				die($this->pv_list());
-
+				
 			}
 			else if ($_REQUEST['do'] == 'inlinedit')
 			{
-
+				
 				$data = array();
-				if ($_REQUEST['field'] == 'name') {
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
+				if ($_REQUEST['field'] == 'name') { 
 
 					$data['name'] = wpsg_q($_REQUEST['value']);
-					$this->shop->addTranslationString('wpsg_mod_productvars_'.$_REQUEST['pv_id'], $_REQUEST['value']);
+					$this->shop->addTranslationString('wpsg_mod_productvars_'.$_REQUEST['pv_id'], $_REQUEST['value']);				
 					$value = __($_REQUEST['value'], 'wpsg');
-
-				}
-				else if ($_REQUEST['field'] == 'pflicht') { $data['pflicht'] = wpsg_q(wpsg_sinput("key", $_REQUEST['value'])); $value = wpsg_sinput("key", $_REQUEST['value']); }
-				else if ($_REQUEST['field'] == 'typ') { $data['typ'] = wpsg_q(wpsg_sinput("key", $_REQUEST['value'])); $value = $this->arTypen[wpsg_sinput("key", $_REQUEST['value'])]; }
-				else if ($_REQUEST['field'] == 'auswahl') {
-
+					
+				}
+				else if ($_REQUEST['field'] == 'pflicht') { $data['pflicht'] = wpsg_q($_REQUEST['value']); $value = $_REQUEST['value']; }
+				else if ($_REQUEST['field'] == 'typ') { $data['typ'] = wpsg_q($_REQUEST['value']); $value = $this->arTypen[$_REQUEST['value']]; }
+				else if ($_REQUEST['field'] == 'auswahl') { 
+					
 					$data['auswahl'] = wpsg_q($_REQUEST['value']);
-					$this->shop->addTranslationString('wpsg_mod_productvars_auswahl'.$_REQUEST['pv_id'], wpsg_sinput("key", $_REQUEST['value']));
-					$value = $_REQUEST['value'];
-
-				}
-
+					$this->shop->addTranslationString('wpsg_mod_productvars_auswahl'.$_REQUEST['pv_id'], $_REQUEST['value']); 
+					$value = $_REQUEST['value']; 
+				
+				}
+				
 				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_VARS, $data, "`id` = '".wpsg_q($_REQUEST['pv_id'])."'");
-
+				
 				die($value);
-
-			}
-
+				
+			}
+			
 		} // public function be_ajax()
-
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-
-			if (isset($_REQUEST['wpsg_lang']) || !wpsg_isSizedInt($_REQUEST['edit_id'])) return;
-
-			$this->shop->view['wpsg_mod_productvars']['productvars_set'] = explode(",", $product_data['produktvars']);
+				
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			$this->shop->view['wpsg_mod_productvars']['productvars_set'] = explode(",", $produkt_data['produktvars']);						
 			$this->shop->view['wpsg_mod_productvars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` ORDER BY `pos` ASC, `id` ASC");
-
-			//$this->shop->view['wpsg_mod_productvars']['data'] = $product_data;
-
-			$product_content['wpsg_mod_productvars'] = array(
-					'title' => __('Produktvariable', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/produkt_addedit_sidebar.phtml', false)
-			);
-
-		} //public function product_addedit_content(&$product_content, &$product_data)
-
-		public function produkt_save(&$produkt_id) {
-			
-			if (isset($_REQUEST['wpsg_pv'])) {
-				
-				foreach ((array)$_REQUEST['wpsg_pv'] as $k => $v) { if ($v != '1') unset($_REQUEST['wpsg_pv'][$k]); else $_REQUEST['wpsg_pv'][$k] = intval($v); }
-
-				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array('produktvars' => implode(",", array_keys($_REQUEST['wpsg_pv']))), "`id` = '".wpsg_q($produkt_id)."'");
-			}
-
-		} // public function produkt_save(&$produkt_id)
-
-		public function basket_check()
-		{
-
+						
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/produkt_edit_sidebar.phtml');
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		
+		public function produkt_save(&$produkt_id) { 
+			
+			foreach ((array)$_REQUEST['wpsg_pv'] as $k => $v) { if ($v != '1') unset($_REQUEST['wpsg_pv'][$k]); }
+			
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array('produktvars' => implode(",", array_keys((array)$_REQUEST['wpsg_pv']))), "`id` = '".wpsg_q($produkt_id)."'");
+			
+		} // public function produkt_save(&$produkt_id) 
+		
+		public function basket_check() 
+		{ 
+			
 			$bError = false;
-
+			
 			foreach ($_SESSION['wpsg']['basket'] as $product_index => $p)
 			{
-
+				
 				$arPV = $this->getAllProductVars($this->shop->getProduktID($p['id']));
-
+				
 				foreach ((array)$arPV as $k => $pv_db)
 				{
-
+					
 					$pv_id = $pv_db['id'];
-					$value = $this->getProductVarValueSession($product_index, $pv_id);
-
+					$value = $this->getProductVarValueSession($product_index, $pv_id); 
+					
 					if ($pv_db['typ'] == '1' && $pv_db['pflicht'] == '1' && ($value == 'not_set' || $value === false)) // Auswahlfeld
 					{
-
+						
 						$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Auswahl treffen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
 						$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);
 						$bError = true;
-
+						
 					}
 					else if ($pv_db['typ'] == '2' && $pv_db['pflicht'] == '1' && (trim($value) == '' || $value === false)) // Textfield
 					{
-
+							
 						$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Angabe machen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
-						$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);
+						$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);									
 						$bError = true;
-
-					}
+						
+					}								
 					else if ($pv_db['typ'] == '3' && $pv_db['pflicht'] == '1' && ($value != '1' || $value === false)) // Checkbox
 					{
-
+						
 						$this->shop->addFrontendError(wpsg_translate(__('Bitte das Feld "#1#" aktivieren!', 'wpsg'), __($pv_db['name'], 'wpsg')));
 						$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);
 						$bError = true;
-
-					}
-
-				}
-
-			}
-
+						
+					}
+					
+				} 
+				
+			}
+			
 			if ($bError === true)
 			{
-
+				
 				return -2;
-
-			}
-
+				
+			} 
+			
 		} // public function basket_check()
-
-		public function basket_checkoutAction(&$basketController)
-		{
-
+		
+		public function basket_checkoutAction(&$basketController) 
+		{ 
+			
 			$bError = false;
-
+			
 			if (wpsg_isSizedArray($_REQUEST['wpsg_mod_productvars']))
 			{
-
+			
 				foreach ($_REQUEST['wpsg_mod_productvars'] as $pv_id => $pv_values)
 				{
-
+					
 					$pv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` = '".wpsg_q($pv_id)."' ORDER BY `pos` ASC, `id` ASC");
-
+					
 					// Wert speichern
 					foreach ($pv_values as $pv_product_index => $value)
 					{
-
+												
 						foreach ($_SESSION['wpsg']['basket'] as $product_index => $ses_data)
 						{
-
+							
 							if ($product_index == $pv_product_index)
 							{
-
+								
 								$_SESSION['wpsg']['basket'][$pv_product_index]['wpsg_mod_productvars'][$pv_id] = wpsg_xss($value);
-
+																
 								if ($pv_db['typ'] == '1' && $pv_db['pflicht'] == '1' && $value == 'not_set') // Auswahlfeld
 								{
-
+									
 									$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Auswahl treffen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
 									$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);
 									$bError = true;
-
+									
 								}
 								else if ($pv_db['typ'] == '2' && $pv_db['pflicht'] == '1' && trim($value) == '') // Textfield
 								{
-
+										
 									$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Angabe machen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
-									$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);
+									$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);									
 									$bError = true;
-
-								}
+									
+								}								
 								else if ($pv_db['typ'] == '3' && $pv_db['pflicht'] == '1' && $value != '1') // Checkbox
 								{
-
+									
 									$this->shop->addFrontendError(wpsg_translate(__('Bitte das Feld "#1#" aktivieren!', 'wpsg'), __($pv_db['name'], 'wpsg')));
 									$_SESSION['wpsg']['errorFields'][] = wpsg_xss('wpsg_mod_productvars_'.$pv_id.'_'.$product_index);
 									$bError = true;
-
+									
 								}
-
+								
 							}
-
+							
 						}
-
-					}
-
-				}
-
-			}
-
+						
+					}
+					
+				}
+				
+			}
+			
 			if ($bError) return -2;
-
+			
 		} // public function basket_checkoutAction(&$basketController)
-
+		
 		public function basket_preUpdate()
 		{
-
+ 
 			if (isset($_REQUEST['wpsg_mod_productvars']) && isset($_SESSION['wpsg']['basket']))
 			{
-
+				
 				foreach ((array)$_REQUEST['wpsg_mod_productvars'] as $pv_id => $pv_values)
 				{
-
+					
 					foreach ((array)$pv_values as $product_index => $value)
 					{
-
+					
 						foreach ((array)$_SESSION['wpsg']['basket'] as $product_index_session => $ses_data)
 						{
-
+							
 							if ($product_index_session == $product_index)
 							{
-
+							
 								$_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_productvars'][$pv_id] = wpsg_xss($value);
-
+								
 							}
-
+								
 						}
-
-					}
-
-				}
-
-			}
-
+						
+					}
+					
+				} 
+				
+			}  
+			
 		} // public function basket_preUpdate()
 		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) { 
-			
-			if (wpsg_isSizedArray($_SESSION['wpsg']['basket'])) {
-			
-				$pv_store = [];
-							
-				foreach ($_SESSION['wpsg']['basket'] as $product_index => $p) {
-					
-					if (isset($p['wpsg_mod_productvars']) && is_array($p['wpsg_mod_productvars']) && sizeof($p['wpsg_mod_productvars']) > 0) {
-						
-						$pv_store[$product_index] = $p['wpsg_mod_productvars'];
-						
-					}
-					
-				}
-				
-				if (is_array($pv_store) && sizeof($pv_store) > 0) {
-					
-					$db_data['pvars'] = wpsg_q(serialize($pv_store));
-					
-				}
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) { 
+				
+			$pv_store = array();
+			
+			foreach ($arBasket['produkte'] as $product_index => $p)
+			{
+
+				if (isset($p['wpsg_mod_productvars']) && is_array($p['wpsg_mod_productvars']) && sizeof($p['wpsg_mod_productvars']) > 0)
+				{
+					
+					$pv_store[$product_index] = $p['wpsg_mod_productvars'];
+					
+				}
+				
+			}
+
+			if (is_array($pv_store) && sizeof($pv_store) > 0)
+			{
+				
+				$data['pvars'] = wpsg_q(serialize($pv_store));
 				
 			}
@@ -361,178 +338,173 @@
 		}
 		
-		public function order_view_row(&$p, $i) {
-
-			if (!isset($this->shop->view['data'])) return;
-			$this->shop->view['wpsg_mod_productvars']['data'] = $this->getAllProductVarValues($this->shop->view['data']['id'], $p['product_index'], true);
-
-			if (wpsg_isSizedArray($this->shop->view['wpsg_mod_productvars']['data'])) {
-
+		public function order_view_row(&$p, $i)
+		{
+			
+			$this->shop->view['wpsg_mod_productvars']['data'] = $this->getAllProductVarValues($this->shop->view['data']['id'], $p['product_index']);
+			
+			if (wpsg_isSizedArray($this->shop->view['wpsg_mod_productvars']['data']))
+			{
+			
 				$this->shop->view['wpsg_mod_productvars']['p'] = $p;
 				$this->shop->view['wpsg_mod_productvars']['i'] = $i;
-
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/order_view_row.phtml');
-
-			}
-
+				
+			} 
+			 			
 		} // public function order_view_row(&$p, &$i)
-
+		
 		public function admin_presentation()
 		{
-
+				
 			echo wpsg_drawForm_Checkbox('wpsg_mod_productvars_showvariprice', __('"Leere" Produktvariablen anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_productvars_showvariprice'));
-
+				
 		} // public function admin_presentation()
-
+		
 		public function admin_presentation_submit()
 		{
-
-			$this->shop->update_option('wpsg_mod_productvars_showvariprice', $_REQUEST['wpsg_mod_productvars_showvariprice'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+				
+			$this->shop->update_option('wpsg_mod_productvars_showvariprice', $_REQUEST['wpsg_mod_productvars_showvariprice']);
+				
 		} // public function admin_presentation_submit()
-
-		public function user_order_view_row(&$p, $oid) {
-
+		
+		public function user_order_view_row(&$p, $oid)
+		{
+			
 			$strCustomData = $this->db->fetchOne("
-				SELECT
-					`custom_data`
-				FROM
-					`".WPSG_TBL_ORDER."`
-				WHERE
-					`id` = '".wpsg_q($oid)."'
-			");
-
+						SELECT
+							`custom_data`
+						FROM
+							`".WPSG_TBL_ORDER."`
+						WHERE
+							`id` = '".wpsg_q($oid)."'
+					");
+			
 			$strUnserializeData = unserialize($strCustomData);
-
+			
 			$this->shop->view['UnserializeProductData'] = $strUnserializeData['basket']['produkte'];
 		}
-
-		public function basket_row(&$p, $i) {
-
-			if ($this->shop->get_option('wpsg_mod_productvars_showBasket') === '1') {
-
-				$produkt_id = $this->shop->basket->getProduktDBID($p['id']);
-	
-				if ($produkt_id > 0)
-				{
-	
-					$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'")??'');
-					foreach ($pVarsSet as $k => $v) { if (trim($v) == '') { unset($pVarsSet[$k]); } }
-	
-					if (is_array($pVarsSet) && sizeof($pVarsSet) > 0)
-					{
-	
-						$this->shop->view['wpsg_mod_productvars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` IN (".wpsg_q(implode(',', $pVarsSet)).") ORDER BY `pos` ASC, `id` ASC", "id");
-	
-						foreach ($this->shop->view['wpsg_mod_productvars']['data'] as $k => $v)
-						{
-							$this->shop->view['wpsg_mod_productvars']['data'][$k]['auswahl'] = explode("|", $v['auswahl']);
-						}
-	
-						$this->shop->view['wpsg_mod_productvars']['i'] = $i;
-						$this->shop->view['wpsg_mod_productvars']['p'] = $p;
-	
-						$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/basket_row.phtml');
-	
-					}
-	
-				}
-			}
-				
+		
+		public function basket_row(&$p, $i) 
+		{ 
+			
+			$produkt_id = $this->shop->basket->getProduktDBID($p['id']);
+			
+			if ($produkt_id > 0)
+			{
+			
+				$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'"));
+				foreach ($pVarsSet as $k => $v) { if (trim($v) == '') { unset($pVarsSet[$k]); } }
+					
+				if (is_array($pVarsSet) && sizeof($pVarsSet) > 0)
+				{
+
+					$this->shop->view['wpsg_mod_productvars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` IN (".wpsg_q(implode(',', $pVarsSet)).") ORDER BY `pos` ASC, `id` ASC");
+					
+					foreach ($this->shop->view['wpsg_mod_productvars']['data'] as $k => $v)
+					{
+						$this->shop->view['wpsg_mod_productvars']['data'][$k]['auswahl'] = explode("|", $v['auswahl']);
+					}
+					
+					$this->shop->view['wpsg_mod_productvars']['i'] = $i;
+					$this->shop->view['wpsg_mod_productvars']['p'] = $p;
+					
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/basket_row.phtml');
+					
+				}
+				
+			}
+						
 		} // public function basket_row(&$p, $i)
-
-		public function basket_preMultiple($product_index)
-		{
-
+		
+		public function basket_preMultiple($product_index) 
+		{ 
+			
 			if (wpsg_isSizedArray($_REQUEST['wpsg_mod_productvars']))
 			{
-
+				
 				foreach ($_REQUEST['wpsg_mod_productvars'] as $pv_id => $value)
 				{
-
+					
 					foreach ($value as $pv_product_index => $pv_value)
 					{
-
+						
 						if ($pv_product_index == $product_index)
 						{
-
+							
 							$_REQUEST['wpsg_mod_productvars'][$pv_id] = $pv_value;
-
+							
 						}
-
-					}
-
-				}
-
-			}
-
+						
+					}
+					
+				}
+				
+			}
+			
 		}
-
-		public function basket_produkttosession($produkt_key, &$menge, &$ses_data)
-		{
-
+		
+		public function basket_produkttosession($produkt_key, &$menge, &$ses_data) 
+		{
+			
 			$bError = false;
-
+			
 			if (isset($_REQUEST['wpsg_mod_productvars']) && is_array($_REQUEST['wpsg_mod_productvars']))
 			{
-
+				
 				foreach ($_REQUEST['wpsg_mod_productvars'] as $pv_id => $value)
 				{
-
+					 
 					$pv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` = '".wpsg_q($pv_id)."' ");
-
+					
 					$ses_data['wpsg_mod_productvars'][$pv_id] = $value;
-
+								
 					if ($pv_db['typ'] == '1' && $pv_db['pflicht'] == '1' && $value == 'not_set') // Auswahlfeld
 					{
-
-						$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Auswahl treffen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
-						$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_productvars_'.$pv_id.'_'.$ses_data['id'];
+						
+						//$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Auswahl treffen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
+						//$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_productvars_'.$pv_id.'_'.$ses_data['id'];
 						$bError = true;
-
+						
 					}
 					else if ($pv_db['typ'] == '2' && $pv_db['pflicht'] == '1' && trim($value) == '') // Textfield
 					{
-
-						$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Angabe machen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
-						$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_productvars_'.$pv_id.'_'.$ses_data['id'];
+							
+						//$this->shop->addFrontendError(wpsg_translate(__('Bitte im Feld "#1#" eine Angabe machen!', 'wpsg'), __($pv_db['name'], 'wpsg')));
+						//$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_productvars_'.$pv_id.'_'.$ses_data['id'];
 						$bError = true;
-
-					}
+						
+					}								
 					else if ($pv_db['typ'] == '3' && $pv_db['pflicht'] == '1' && $value != '1') // Checkbox
 					{
-
-						$this->shop->addFrontendError(wpsg_translate(__('Bitte das Feld "#1#" aktivieren!', 'wpsg'), __($pv_db['name'], 'wpsg')));
-						$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_productvars_'.$pv_id.'_'.$ses_data['id'];
+						
+						//$this->shop->addFrontendError(wpsg_translate(__('Bitte das Feld "#1#" aktivieren!', 'wpsg'), __($pv_db['name'], 'wpsg')));
+						//$_SESSION['wpsg']['errorFields'][] = 'wpsg_mod_productvars_'.$pv_id.'_'.$ses_data['id'];
 						$bError = true;
-
-					}
-
-				}
-
-			}
-
+						
+					}
+					
+				}
+				
+			}
+			
 			// Nix machen bei Warenkorbaktualisierung
-			if (isset($_REQUEST['wpsg_basket_refresh'])) return null;
-
-			if ($bError === true) return -2; else return null;
-
+			if (isset($_REQUEST['wpsg_basket_refresh'])) return;
+							
+			if ($bError === true) return -2; else return true;
+			
 		} // public function basket_produkttosession($produkt_key, $menge, &$ses_data)
-
-		public function product_bottom(&$produkt_key, $template_index) {
-
-		    $produkt_id = $this->shop->getProduktID($produkt_key);
-
-			if ($this->shop->get_option('wpsg_mod_productvars_showProduct') != '1') return false;
-
-
-			$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'")??'');
-			
+		 		
+		public function product_bottom(&$produkt_id, $template_index)
+		{
+
+			$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'"));
+
 			foreach ($pVarsSet as $k => $v) { if (trim($v) == '') { unset($pVarsSet[$k]); } }
-
+			
 			if (is_array($pVarsSet) && sizeof($pVarsSet) > 0)
 			{
 
 				$this->shop->view['wpsg_mod_productvars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` IN (".wpsg_q(implode(',', $pVarsSet)).") ORDER BY `pos` ASC, `id` ASC");
-
+				
 				foreach ($this->shop->view['wpsg_mod_productvars']['data'] as $k => $v)
 				{
@@ -542,66 +514,69 @@
 				if (isset($_REQUEST['form_data']))
 				{
-
+					
 					$this->shop->checkEscape();
-
+					
 					$form_data = array();
 					parse_str($_REQUEST['form_data'], $form_data);
-
+				
 					foreach ($form_data['wpsg_mod_productvars'] as $pv_id => $pv_value)
 					{
-
+						
 						foreach ($this->shop->view['wpsg_mod_productvars']['data'] as $pv_index => $pv)
 						{
-
+							
 							if ($pv['id'] == $pv_id)
 							{
-
+								
 								$this->shop->view['wpsg_mod_productvars']['data'][$pv_index]['value'] = $pv_value;
-
+								
 							}
-
+							
 						}
-
-					}
-
-				}
-
-				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/renderTemplate.phtml', false);
-
-			}
-
+						
+					}
+					 
+				}
+								
+				return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/renderTemplate.phtml', false);
+
+			}
+			
 		} // public function product_bottom(&$produkt_id, $template_index)
-
-		public function mail_row($index, $produkt) {
-
-			if ($this->shop->get_option('wpsg_mod_productvars_showMail') === '1') {
-
-				$order_id = $this->shop->view['o_id'];
-	
-				$arPVars = $this->getAllProductVarValues($order_id, $produkt['product_index']);
-	
-				if (wpsg_isSizedArray($arPVars)) {
-	
-					$this->shop->view['wpsg_mod_productvars']['data'] = $arPVars;
-					$this->shop->view['wpsg_mod_productvars']['i'] = $index;
-					$this->shop->view['wpsg_mod_productvars']['p'] = $produkt;
-	
-					if ($this->shop->htmlMail === true) {
-	
-						$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/mail_row_html.phtml');
-	
-					} else {
-	
-						$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/mail_row.phtml');
-	
-					}
-	
-				}
-			}
+		
+		public function mail_row($index, $produkt) 
+		{
+			
+			$order_id = $this->shop->view['o_id'];
+		 
+			$arPVars = $this->getAllProductVarValues($order_id, $produkt['product_index']);
+			  
+			if (wpsg_isSizedArray($arPVars))
+			{
+				
+				$this->shop->view['wpsg_mod_productvars']['data'] = $arPVars;
+				$this->shop->view['wpsg_mod_productvars']['i'] = $index;
+				$this->shop->view['wpsg_mod_productvars']['p'] = $produkt;
+				
+				if ($this->shop->htmlMail === true)
+				{
+					
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/mail_row_html.phtml');
+					
+				}
+				else
+				{
+					
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/mail_row.phtml');
+					
+				}
+				
+			} 
+			
 		}
-
-		public function order_ajax()
-		{
-
+				
+		public function order_ajax() 
+		{ 
+ 
 			if (wpsg_isSizedString($_REQUEST['do'], 'inlinedit'))
 			{
@@ -609,116 +584,115 @@
 				$db_pvar = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` = '".wpsg_q($_REQUEST['pv_id'])."'");
 				$arAuswahl = explode('|', $db_pvar['auswahl']);
-
-                if ($db_pvar['typ'] == 1 && is_numeric($_REQUEST['value']) && $_SERVER['SERVER_NAME'] !== 'zoo-bs.de')
-				{
-
+				
+				if ($db_pvar['typ'] == 1 && is_numeric($_REQUEST['value']))				
+				{
+										
 					$_REQUEST['value'] = $arAuswahl[$_REQUEST['value']];
-
-				}
-
+					
+				} 
+				
 				$db_order = $this->shop->cache->loadOrder($_REQUEST['order_id']);
 				$pvars = @unserialize($db_order['pvars']);
 				$pvars[$_REQUEST['p_id']][$_REQUEST['pv_id']] = $_REQUEST['value'];
-
+				
 				$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
 					'pvars' => wpsg_q(@serialize($pvars))
-				), " `id` = '".wpsg_q($_REQUEST['order_id'])."' ");
-
+				), " `id` = '".wpsg_q($_REQUEST['order_id'])."' ");						
+				
 				if ($db_pvar['typ'] == 1 && $_REQUEST['value'] == 'not_set') $_REQUEST['value'] = __('Keine Angabe', 'wpsg');
 				else if ($db_pvar['typ'] == 3)
 				{
-
+				
 					if ($_REQUEST['value'] == '1') $_REQUEST['value'] = __('Ja', 'wpsg');
 					else $_REQUEST['value'] = __('Nein', 'wpsg');
-
-				}
-
+							
+				}
+				
 				die($_REQUEST['value']);
-
-			}
-
+				
+			}
+			
 		}
-
-		public function overview_row(&$p, $i) {
-			
-			if ($this->shop->get_option('wpsg_mod_productvars_showOverview') == '1') {
-
-				$produkt_id = $this->shop->basket->getProduktDBID($p['id']);
-	
-				if ($produkt_id > 0) {
-	
-					$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'"));
-					foreach ($pVarsSet as $k => $v) { if (trim($v) == '') { unset($pVarsSet[$k]); } }
-	
-					if (is_array($pVarsSet) && sizeof($pVarsSet) > 0) {
-	
-						$this->shop->view['wpsg_mod_productvars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` IN (".wpsg_q(implode(',', $pVarsSet)).") ORDER BY `pos` ASC, `id` ASC");
-	
-						if ($this->shop->get_option('wpsg_mod_productvars_showvariprice') !== '1' && wpsg_isSizedArray($this->shop->view['wpsg_mod_productvars']['data']))
+		
+		public function overview_row(&$p, $i) 
+		{
+			
+			$produkt_id = $this->shop->basket->getProduktDBID($p['id']);
+			
+			if ($produkt_id > 0)
+			{
+							
+				$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'"));				
+				foreach ($pVarsSet as $k => $v) { if (trim($v) == '') { unset($pVarsSet[$k]); } }
+
+				if (is_array($pVarsSet) && sizeof($pVarsSet) > 0)
+				{
+					
+					$this->shop->view['wpsg_mod_productvars']['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` IN (".wpsg_q(implode(',', $pVarsSet)).") ORDER BY `pos` ASC, `id` ASC");
+					
+					if ($this->shop->get_option('wpsg_mod_productvars_showvariprice') !== '1' && wpsg_isSizedArray($this->shop->view['wpsg_mod_productvars']['data']))
+					{
+						
+						// Es sollen nicht alle angezeigt werden
+						foreach ($this->shop->view['wpsg_mod_productvars']['data'] as $k => $v)
 						{
-	
-							// Es sollen nicht alle angezeigt werden
-							foreach ($this->shop->view['wpsg_mod_productvars']['data'] as $k => $v)
-							{
-	
-								if ($v['typ'] === '1' && $p['wpsg_mod_productvars'][$v['id']] === 'not_set') { unset($this->shop->view['wpsg_mod_productvars']['data'][$k]); }
-								else if ($v['typ'] === '2' && !wpsg_isSizedString($p['wpsg_mod_productvars'][$v['id']])) { unset($this->shop->view['wpsg_mod_productvars']['data'][$k]); }
-	
-							}
-	
+						 
+							if ($v['typ'] === '1' && $p['wpsg_mod_productvars'][$v['id']] === 'not_set') { unset($this->shop->view['wpsg_mod_productvars']['data'][$k]); }
+							else if ($v['typ'] === '2' && !wpsg_isSizedString($p['wpsg_mod_productvars'][$v['id']])) { unset($this->shop->view['wpsg_mod_productvars']['data'][$k]); }
+							
 						}
-	
-						$this->shop->view['wpsg_mod_productvars']['i'] = $i;
-						$this->shop->view['wpsg_mod_productvars']['p'] = $p;
-
-						$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/overview_row.phtml');
-	
-					}
-	
-				}
-			}
+						
+					}
+					
+					$this->shop->view['wpsg_mod_productvars']['i'] = $i;
+					$this->shop->view['wpsg_mod_productvars']['p'] = $p;
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/overview_row.phtml');	
+					
+				}
+				
+			}
+			
 		} // public function overview_row(&$p, $i)
-
-		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false)
-		{
-
+		
+		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false) 
+		{ 
+		
 			if ($product_id !== false && $product_id > 0 && $order_id !== false && $order_id > 0)
 			{
 
 				 $arPVData = $this->getAllProductVarValues($order_id, $product_index);
-
+				 
 				 foreach ((array)$arPVData as $k => $v)
 				 {
-
+				 	
 				 	$arReplace['/%pv_'.$k.'%/'] = $v['value'];
-
+				 	
 				 }
-
-			}
-
+				
+			}
+			
 		} // public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false)
-
-		public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend)
-		{
-
-			if ($produkt_key == false) return false;
+				
+		public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend) 
+		{ 
+			
 			$product_id = $this->shop->getProduktID($produkt_key);
 
 			if ($product_id !== false && $product_id > 0 && $order_id !== false && $order_id > 0)
 			{
-
+				
 				$arPVData = $this->getAllProductVarValues($order_id, $product_id);
-
+				 
 				foreach ((array)$arPVData as $k => $v)
 				{
-
+				 	
 					$arSend['pv_'.$k] = $v['value'];
-
-				}
-
-			}
-
+				 	
+				}
+				
+			}
+			
 		} // public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend)
-
+		
 		/* Modulfunktionen */
 
@@ -730,5 +704,5 @@
 		public function hasProductProductVarActive($product_id, $pvar_id)
 		{
-
+			 
 			$pVarsSet = explode(",", $this->db->fetchOne("SELECT `produktvars` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."'"));
 			$pVarsSet = wpsg_trim($pVarsSet);
@@ -736,55 +710,59 @@
 			if (in_array($pvar_id, $pVarsSet)) return true;
 			else return false;
-
+			
 		} // public function hasProductProductVarActive($product_id, $pvar_id)
-
+		
 		/**
 		 * Gibt die Werte aller Produktvariablen einer Bestellung und Produkt zurÃŒck
 		 * Nur die, die auch gefÃŒllt sind und mit Werten belegt wurden, oder alle angezeigt werden sollen
 		 */
-		public function getAllProductVarValues($order_id, $product_index, $bAll = false) {
-
-			$order_data = $this->shop->cache->loadOrder($order_id);
+		public function getAllProductVarValues($order_id, $product_index, $bAll = false)
+		{
+			
+			$order_data = $this->shop->cache->loadOrder($order_id);			
 			$arPVars = @unserialize($order_data['pvars']);
-			$arPVars = $arPVars[$product_index]??[];
+			$arPVars = $arPVars[$product_index];
+									 
 			$arReturn = array();
-
+			
 			$arPVarsDB = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."`");
-
-			foreach ($arPVarsDB as $k => $pv_db) {
-
-				if ($bAll || array_key_exists($pv_db['id'], (array)$arPVars)) {
-
+			
+			foreach ($arPVarsDB as $k => $pv_db)
+			{
+				
+				if ($bAll || array_key_exists($pv_db['id'], (array)$arPVars))
+				{
+					
 					$value = "";
-
-					if (array_key_exists($pv_db['id'], $arPVars)) {
-
-						switch ($pv_db['typ']) {
-
+					
+					if (array_key_exists($pv_db['id'], $arPVars))
+					{
+						
+						switch ($pv_db['typ'])
+						{
 							case 3: // Checkbox
-
+								
 								if ($arPVars[$pv_db['id']] == '1') $value = __('Ja', 'wpsg');
 								else $value = __('Nein', 'wpsg');
-
+								
 								break;
-
-							case 4: // mehrzeiliger Text
+								
 							case 2: // Text
-
+								
 								$value = $arPVars[$pv_db['id']];
-
+																
 								break;
-
+								
 							case 1: // Auswahl
-
+								
 								$value = $arPVars[$pv_db['id']];
 								if ($value == "not_set") $value = __('Keine Angabe', 'wpsg');
-
+								
 								break;
-
+							
 						}
-
-					}
-
+						
+					}
+					
 					$arReturn[$pv_db['id']] = array(
 						'id' => $pv_db['id'],
@@ -792,30 +770,89 @@
 						'auswahl' => explode('|', $pv_db['auswahl']),
 						'name' => __($pv_db['name'], 'wpsg'),
-						'value' => $value
+						'value' => $value							
 					);
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+		 
+			/*
+			if (is_array($arPVars)) 
+			{
+			 
+				foreach ($arPVars as $k => $v) 
+				{ 
+					 
+					if ($k == $product_index) 
+					{ 
+						
+						foreach ($arPVars[$k] as $k2 => $v2)
+						{
+						
+							$pvar_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` = '".wpsg_q($k2)."'");
+							
+							if ($pvar_db['typ'] == 3) // Checkbox 
+							{
+								
+								$arReturn[$k2] = array('typ' => '3', 'id' => $k2, 'name' => __($pvar_db['name'], 'wpsg'), 'value' => (($v2 === '1')?__('Ja', 'wpsg'):__('Nein', 'wpsg')));
+								$arIDSet[] = $k2;
+								
+							}
+							else if ($pvar_db['typ'] == 1) // Auswahl
+							{
+								
+								if ($v2 != 'not_set' || $this->shop->get_option('wpsg_mod_productvars_showvariprice') === '1')
+								{
+									
+									if ($v2 == 'not_set') $v2 = __('Nicht angegeben', 'wpsg');
+									
+									$arReturn[$k2] = array('typ' => '1', 'id' => $k2, 'name' => __($pvar_db['name'], 'wpsg'), 'value' => $v2);
+									$arIDSet[] = $k2;
+									
+								}
+															
+							}
+							else if ($pvar_db['typ'] == 2) // Text
+							{
+								
+								if (wpsg_isSizedString($v2) || $this->shop->get_option('wpsg_mod_productvars_showvariprice') === '1') 
+								{
+									
+									if (!wpsg_isSizedString($v2)) $v2 = __('Keine Angaben', 'wpsg');
+									
+									$arReturn[$k2] = array('typ' => '2', 'id' => $k2, 'name' => __($pvar_db['name'], 'wpsg'), 'value' => $v2);
+									$arIDSet[] = $k2;
+									
+								}
+								
+							}
+							
+						}
+						 
+					} 
+				
+				}
+				
+			} */
+						
 			return $arReturn;
-
-		} // public function getAllProductVarValues($order_id, $product_id)
-
+						
+		} // public function getAllProductVarValues($order_id, $product_id) 
+		
 		public function getProductVarValueSession($product_index, $pv_id)
 		{
-
+			
 			if (isset($_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_productvars'][$pv_id])) return $_SESSION['wpsg']['basket'][$product_index]['wpsg_mod_productvars'][$pv_id];
 			else return false;
-
+			
 		}
-
+		
 		public function getAllProductVars($product_id)
 		{
-
+			
 			$product_data = $this->shop->cache->loadProduct($product_id);
-
+			
 			if (!wpsg_isSizedString($product_data['produktvars'])) return array();
-
+			
 			$arProductVars_active = $this->db->fetchAssoc("
 				SELECT
@@ -824,20 +861,20 @@
 					`".WPSG_TBL_PRODUCTS_VARS."` AS PV
 				WHERE
-					FIND_IN_SET(PV.`id`, '".wpsg_q($product_data['produktvars'])."')
+					FIND_IN_SET(PV.`id`, '".wpsg_q($product_data['produktvars'])."')		
 				ORDER BY
 					PV.`pos` ASC, PV.`id` ASC
 			");
-
+			
 			foreach ($arProductVars_active as $k => $pv)
 			{
-
+				
 				$arProductVars_active[$k]['name'] = __($pv['name'], 'wpsg');
-
-			}
-
+				
+			}
+			 
 			return $arProductVars_active;
-
+			
 		} // public function getAllProductVars($product_id)
-
+		
 		/**
 		 * Gibt die Liste der Produktvariablen fÃŒr das Backend zurÃŒck
@@ -845,10 +882,10 @@
 		public function pv_list()
 		{
-
-			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` ORDER BY `pos` ASC, `id` ASC");
+			
+			$this->shop->view['data'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` ORDER BY `pos` ASC, `id` ASC");			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvars/pv_list.phtml');
-
+			
 		} // private function pv_list()
-
+		
 		/**
 		 * Gibt den Namen der Produktvariable zurÃŒck
@@ -856,11 +893,11 @@
 		public function getNameFromID($pVarsID)
 		{
-
+			
 			$db_pvars = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS_VARS."` WHERE `id` = '".wpsg_q($pVarsID)."' ");
-
+			
 			return __($db_pvars['name'], 'wpsg');
-
+			
 		} // public function getNameFromID($pVarsID)
-
+		 
 	} // class wpsg_mod_productvars extends wpsg_mod_basic
 
Index: /mods/wpsg_mod_produktartikel.class.php
===================================================================
--- /mods/wpsg_mod_produktartikel.class.php	(revision 8528)
+++ /mods/wpsg_mod_produktartikel.class.php	(revision 5261)
@@ -1,1027 +1,777 @@
 <?php
 
-    
-    /**
-     * Modul der die Produkte als eigene Artikeltypen speichert
-     */
-    class wpsg_mod_produktartikel extends wpsg_mod_basic
-    {
-    
-        var $lizenz = 1;
-        var $id = 15;
-        var $version = "9.9.9";
-        var $free = false;
-        var $default_page = 'wpsg-Admin';
-
-        /**
-         * Constructor
-         */
-        public function __construct()
-        {
-
-            parent::__construct();
-
-            $this->name = __('ProduktArtikel', 'wpsg');
-            $this->group = __('Produkte', 'wpsg');
-            $this->desc = __('Produkte sind ein eigener Wordpress Artikeltyp und erscheinen so als Artikel und in der Suche.', 'wpsg');
-
-        } // public function __construct()
-
-        public function init() {
+	/**
+	 * Modul der die Produkte als eingene Artikeltypen speichert
+	 */
+	class wpsg_mod_produktartikel extends wpsg_mod_basic 
+	{
+		
+		var $lizenz = 1;
+		var $id = 15;
+		var $hilfeURL = 'http://wpshopgermany.de/?p=2496';
+		var $version = "9.9.9";
+		var $free = false;
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('ProduktArtikel', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('Produkte sind ein eigener Wordpress Artikeltyp und erscheinen so als Artikel und in der Suche.', 'wpsg');
+									
+		} // public function __construct()
+		
+		public function init()
+		{
+			
+			add_action('init', array($this, 'create_wpsg_post_types'));			
+			 			
+		} // public function init()
+
+		public function wpsg_enqueue_scripts() 
+		{ 
+					
+			if (is_admin()) return;
+			
+			if (	(	$this->shop->get_option('wpsg_mod_produktartikel_facebook') == '1' ||
+						$this->shop->get_option('wpsg_mod_produktartikel_google') == '1' ||
+						$this->shop->get_option('wpsg_mod_produktartikel_twitter') == '1') &&
+					$this->shop->get_option('wpsg_mod_produktartikel_noJS') != '1')
+			{
+					
+				wp_enqueue_script('wpsg_mod_produktartikel_social', WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/socialshareprivacy/jquery.socialshareprivacy.js');
+						
+			}
+			
+		} // public function wpsg_enqueue_scripts()
+		
+		public function install() 
+		{ 
+			
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			// Standard Path Key setzen
+			if ($this->shop->get_option('wpsg_mod_produktartikel_pathkey') === false || $this->shop->get_option('wpsg_mod_produktartikel_pathkey') == '')
+			{
+				
+				$this->shop->update_option('wpsg_mod_produktartikel_pathkey', 'produkte');
+				
+			}			
+			
+			$this->shop->checkDefault('wpsg_mod_produktartikel_showui', '0');
+			$this->shop->checkDefault('wpsg_mod_produktartikel_showHome', '0');
+			$this->shop->checkDefault('wpsg_mod_produktartikel_showCategory', '1');
+			$this->shop->checkDefault('wpsg_mod_produktartikel_showFeed', '0');
+			$this->shop->checkDefault('wpsg_mod_produktartikel_showSearch', '0');
+						
+			/*
+			 * Posts Tabelle erweitern
+			 */ 
+			$sql = "CREATE TABLE ".$this->shop->prefix."posts (
+		   		wpsg_produkt_id INT(11) NOT NULL,
+		   		KEY wpsg_produkt_id (`wpsg_produkt_id`)
+		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+   	   	 
+   			dbDelta($sql);
+   			
+		} 
+		
+		public function the_excerpt(&$content) 
+		{ 
+			
+			global $post;
+
+			if (get_post_type($post) == $this->shop->get_option('wpsg_mod_produktartikel_pathkey'))
+			{
+				
+				$produkt_id = $post->wpsg_produkt_id;
+				$content = $this->shop->renderProdukt($produkt_id);
+				
+			}
+			
+		} // public function the_excerpt(&$content)
+		
+		public function content_filter(&$content)
+		{
+						
+			global $post;
+						
+			// Artikel ist ein Produkt, hier das Rendern des Templates ÃŒbernehmen
+			if (get_post_type($post) == $this->shop->get_option('wpsg_mod_produktartikel_pathkey'))
+			{
+				 
+				$produkt_id = $post->wpsg_produkt_id;  
+				$content = $this->shop->renderProdukt($produkt_id);
+				
+				return -2;
+				
+			}
+						
+		} // public function content_filter()
+		 
+		public function pre_get_posts(&$query) 
+		{
  
-            $this->create_wpsg_post_types();
-
-        } // public function init()
-
-        public function wpsg_enqueue_scripts()
-        {
-
-            if (is_admin()) return;
-
-            if (	(	$this->shop->get_option('wpsg_mod_produktartikel_facebook') == '1' ||
-                    $this->shop->get_option('wpsg_mod_produktartikel_google') == '1' ||
-                    $this->shop->get_option('wpsg_mod_produktartikel_twitter') == '1') &&
-                $this->shop->get_option('wpsg_mod_produktartikel_noJS') != '1')
-            {
-
-                wp_enqueue_script('wpsg_mod_produktartikel_shariff', $this->shop->getRessourceURL('js/shariff/shariff.min.js'));
-                wp_enqueue_style ('wpsg_mod_produktartikel_shariff', $this->shop->getRessourceURL('js/shariff/shariff.min.css'));
-
-            }
-
-        } // public function wpsg_enqueue_scripts()
-
-        public function install()
-        {
-
-            require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
-            /**
-             * Produkt Tabelle erweitern
-             */
-            $sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
-                ean VARCHAR(255) NOT NULL,
-                gtin VARCHAR (255) NOT NULL
-            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-
-            // Standard Path Key setzen
-            if ($this->shop->get_option('wpsg_mod_produktartikel_pathkey') === false || $this->shop->get_option('wpsg_mod_produktartikel_pathkey') == '')
-            {
-
-                $this->shop->update_option('wpsg_mod_produktartikel_pathkey', 'produkt');
-
-            }
-
-            // Standard Path Key (Kategorien) setzen
-            if ($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat') === false || $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat') == '')
-            {
-
-                $this->shop->update_option('wpsg_mod_produktartikel_pathkey_cat', 'produkte');
-
-            }
-
-            $this->shop->checkDefault('wpsg_mod_produktartikel_showui', '0');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_showHome', '0');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_showCategory', '1');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_showFeed', '0');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_showSearch', '0');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_rating', '10');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_postthumbnail', '1');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_positionnumber', '0');
-            $this->shop->checkDefault('wpsg_mod_produktartikel_cat', '1');
-			
-            /*
-             * Posts Tabelle erweitern
-             */
-            $sql = "CREATE TABLE ".$this->shop->prefix."posts (
-                wpsg_produkt_id INT(11) NOT NULL,
-                KEY wpsg_produkt_id (`wpsg_produkt_id`)
-            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-
-        }
-
-        public function be_ajax() {
-
-            if (wpsg_isSizedString($_REQUEST['do'], 'setWPMLPathKey'))
-            {
-
-                $icl_sitepress_settings = $this->shop->get_option('icl_sitepress_settings');
-
-                $icl_sitepress_settings['custom_posts_sync_option'][$this->shop->get_option('wpsg_mod_produktartikel_pathkey')] = '1';
-                $this->shop->update_option('icl_sitepress_settings', $icl_sitepress_settings);
-
-                $this->shop->addBackendMessage(__('Der Custom Post Type fÃŒr die Produkte kann nun ÃŒbersetzt werden.', 'wpsg'));
-                $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=systemcheck');
-
-            }
-            else if (wpsg_isSizedString($_REQUEST['do'], 'index_rebuild'))
-            {
-
-                $arProductIDs = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` ", "id");
-
-                if (wpsg_isSizedArray($arProductIDs)) {
-
-                    // Ich lÃ¶sche alle Posts zu denen es die Produkte nicht mehr gibt
-                    $this->db->Query("
-                        DELETE FROM
-                            `".$this->shop->prefix."posts`
-                        WHERE
-                            `wpsg_produkt_id` NOT IN (".wpsg_q(implode(',', $arProductIDs)).") AND
-                            `wpsg_produkt_id` > 0
-                    ");
-
-                    $this->shop->update_option('wpsg_mod_produktartikel_rebuild', array(
-                        'max' => sizeof($arProductIDs),
-                        'product_ids' => $arProductIDs
-                    ), false, false, WPSG_SANITIZE_NONE);
-
-                    $this->shop->addBackendMessage(__('Zuordnungen werden neu aufgebaut. Bitte schlieÃen Sie die Seite nicht bis der Vorgang abgeschlossen ist.', 'wpsg'));
-
-                } else {
-
-                    \update_option('wpsg_mod_produktartikel_rebuild', null);
-
-                    $this->shop->addBackendMessage(__('Ein Aufbau der Zuordnung nicht nicht notwendig.', 'wpsg'));
-
-                }
-
-                $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktartikel');
-
-            } else if (wpsg_isSizedString($_REQUEST['do'], 'rebuild')) {
-
-            	ob_start();
-
-                $arToDo = $this->shop->get_option('wpsg_mod_produktartikel_rebuild');
-                $arProductIDs = $arToDo['product_ids'];
-
-                $i = 0;
-                $limit = 20;
-
-                foreach ($arProductIDs as $k => $product_id)
-                {
-
-                    $product_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."' ");
-                    $post_data = $this->db->fetchRow("SELECT * FROM `".$this->shop->prefix."posts` WHERE `wpsg_produkt_id` = '".wpsg_q($product_id)."' ");
-
-                    $_REQUEST['wpsg_mod_produktartikel']['path'] = wpsg_getStr($post_data['post_name'], '');
-                    $_REQUEST['wpsg_mod_produktartikel']['kommentare'] = wpsg_getStr($post_data['comment_status'], '');
-                    $_REQUEST['wpsg_produktartikel_menuorder'] = wpsg_getStr($post_data['menu_order'], '');
-                    $_REQUEST['disabled'] = $product_data['disabled'];
-
-                    if (wpsg_isSizedInt($product_data['lang_parent'])) {
-
-                    	$product_trans_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_data['lang_parent'])."' ");
-
-                    	$_REQUEST['disabled'] = $product_trans_data['disabled'];
-                        $_REQUEST['wpsg_lang'] = $product_data['lang_code'];
-
-                        $this->produkt_save_translation($product_data['lang_parent'], $product_data['id']);
-
-                    } else {
-
-                        $this->produkt_save($product_data['id']);
-
-                        $this->shop->callMod('wpsg_mod_productvariants', 'produkt_save', array(&$product_data['id']));
-
-                    }
-
-                    unset($arProductIDs[$k]);
-
-                    $i ++;
-
-                    if ($i >= $limit) break;
-
-                }
-
-                if (wpsg_isSizedArray($arProductIDs))
-                {
-
-                    $arToDo['product_ids'] = $arProductIDs;
-                    $this->shop->update_option('wpsg_mod_produktartikel_rebuild', $arToDo, false, false, WPSG_SANITIZE_NONE);
-                    $done = 1 - (sizeof($arProductIDs) / $arToDo['max']);
-
-                }
-                else
-                {
-
-                    \update_option('wpsg_mod_produktartikel_rebuild', null);
-                    $done = 1;
-
-                }
-
-                ob_end_clean();
-
-                wpsg_header::JSONData(array(
-                    'done' => $done
-                ));
-
-            }
-
-        }
-
-        public function the_excerpt(&$content)
-        {
-
-            global $post;
-
-            if (get_post_type($post) == $this->shop->get_option('wpsg_mod_produktartikel_pathkey'))
-            {
-
-                $produkt_id = $post->wpsg_produkt_id;
-                $content = $this->shop->renderProdukt($produkt_id);
-
-            }
-
-        } // public function the_excerpt(&$content)
-
-        public function content_filter(&$content) {
-
-            global $post;
-
-            // Artikel ist ein Produkt, hier das Rendern des Templates ÃŒbernehmen
-            if ((is_singular() || in_the_loop()) && is_main_query() && get_post_type($post) == $this->shop->get_option('wpsg_mod_produktartikel_pathkey')) {
-	            
-				if ($this->shop->isOtherLang()) {
-				
-					$default_lang = apply_filters('wpml_default_language', NULL);
-					$post_default_lang_id = apply_filters('wpml_object_id', $post->ID, $post->post_type, false,$default_lang); 
-					$post_default_lang = \get_post($post_default_lang_id);
-					 
-					$produkt_id = $post_default_lang->wpsg_produkt_id;
-										
-				} else {
-					
-					$produkt_id = $post->wpsg_produkt_id;
+			if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_produktartikel_onlyMainQuery')) && !$query->is_main_query()) return;
+			
+			if ($this->shop->get_option('wpsg_mod_produktartikel_showHome') == '1' && is_home())
+			{
+
+				$this->setPostType($query);
+				 
+			}
+			
+			if ($this->shop->get_option('wpsg_mod_produktartikel_showCategory') == '1' && is_category())
+			{
+												
+				$this->setPostType($query);
+				 
+			}
+			
+			if ($this->shop->get_option('wpsg_mod_produktartikel_showFeed') == '1' && is_feed()) 
+			{
+				
+				$this->setPostType($query);
+				 
+			}
+			
+			if ($this->shop->get_option('wpsg_mod_produktartikel_showSearch') == '1' && is_search())
+			{
+				
+				$this->setPostType($query);
+				 
+			} 
+			
+			if (is_single() && $query->is_main_query())
+			{
+				
+				$this->setPostType($query);
+				
+			}
+			
+		} // public function pre_get_posts(&$query)
+		
+		public function settings_edit()
+		{
+			
+			// VerfÃŒgbare Produkttemplates
+			$this->shop->view['arTemplates'] = $this->shop->loadProduktTemplates();
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/settings_edit.phtml');
+			
+		}
+
+		public function settings_save() 
+		{
+			
+			global $wpdb;
+			
+			$this->shop->update_option('wpsg_mod_produktartikel_showHome', $_REQUEST['wpsg_mod_produktartikel_showHome']);
+			$this->shop->update_option('wpsg_mod_produktartikel_showCategory', $_REQUEST['wpsg_mod_produktartikel_showCategory']);
+			$this->shop->update_option('wpsg_mod_produktartikel_showFeed', $_REQUEST['wpsg_mod_produktartikel_showFeed']);
+			$this->shop->update_option('wpsg_mod_produktartikel_showSearch', $_REQUEST['wpsg_mod_produktartikel_showSearch']);
+			$this->shop->update_option('wpsg_mod_produktartikel_onlyMainQuery', $_REQUEST['wpsg_mod_produktartikel_onlyMainQuery']);
+						
+			$this->shop->update_option('wpsg_mod_produktartikel_hometemplate', $_REQUEST['wpsg_mod_produktartikel_hometemplate']);
+			$this->shop->update_option('wpsg_mod_produktartikel_listtemplate', $_REQUEST['wpsg_mod_produktartikel_listtemplate']);
+			$this->shop->update_option('wpsg_mod_produktartikel_searchtemplate', $_REQUEST['wpsg_mod_produktartikel_searchtemplate']);			
+			$this->shop->update_option('wpsg_mod_produktartikel_facebook', $_REQUEST['wpsg_mod_produktartikel_facebook']);
+			$this->shop->update_option('wpsg_mod_produktartikel_google', $_REQUEST['wpsg_mod_produktartikel_google']);
+			$this->shop->update_option('wpsg_mod_produktartikel_twitter', $_REQUEST['wpsg_mod_produktartikel_twitter']);
+			
+			$this->shop->update_option('wpsg_mod_produktartikel_showui', $_REQUEST['wpsg_mod_produktartikel_showui']);
+			$this->shop->update_option('wpsg_mod_produktartikel_postthumbnail', $_REQUEST['wpsg_mod_produktartikel_postthumbnail']);
+			
+			$pathkey_alt = $this->shop->get_option('wpsg_mod_produktartikel_pathkey');
+			$pathkey_new = $this->shop->clear($_REQUEST['wpsg_mod_produktartikel_pathkey']);
+			
+			if ($pathkey_alt != $_REQUEST['wpsg_mod_produktartikel_pathkey'] && $pathkey_new != '')
+			{
+				
+				$this->db->UpdateQuery($this->shop->prefix."posts", array(
+					'post_type' => wpsg_q($pathkey_new)
+				), "`post_type` = '".wpsg_q($pathkey_alt)."'");
+				
+				$this->shop->update_option('wpsg_mod_produktartikel_pathkey', $pathkey_new);
+				
+				$this->shop->addBackendMessage(__('Path Key erfolgreich geÃ€ndert. Die Produkt URLs haben sich geÃ€ndert!', 'wpsg'));
+				
+			}
+			else if (trim($_REQUEST['wpsg_mod_produktartikel_pathkey']) == '')
+			{
+				
+				$this->shop->addBackendError(__('Der Path Key darf nicht leer sein!', 'wpsg'));
+				
+			}
+			
+			$this->create_wpsg_post_types();
+			flush_rewrite_rules();
+			
+		} // public function settings_save()
+		
+		public function admin_includes() 
+		{ 
+
+			echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_noJS', __('Socialshareprivacy nicht einbinden (Produktartikel)', 'wpsg'), $this->shop->get_option('wpsg_mod_produktartikel_noJS'), array(
+				'hint' => wpsg_translate('nohspc_'.__('Ist diese Option aktiv, so wird die benÃ¶tigte JavaScript Bibliothek <u>nicht</u> eingebunden, auch wenn die Optionen im <a href="#1#">Produktartikelmodul</a> aktiv sind.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktartikel')
+			));
+			
+		} // function admin_includes()
+		
+		public function admin_includes_save() 
+		{ 
+			
+			$this->shop->update_option('wpsg_mod_produktartikel_noJS', $_REQUEST['wpsg_mod_produktartikel_noJS']);
+			
+		} // function admin_includes_save()
+		 
+		public function produkt_copy(&$produkt_id, &$copy_id)
+		{ 
+			
+			global $current_user;
+			
+			$product_source = $this->shop->cache->loadProduct($produkt_id);
+			$product_target = $this->shop->cache->loadProduct($copy_id);
+			
+			$post_content = $this->shop->renderProdukt($copy_id);
+			
+			$post_data = $this->db->fetchRow("
+				SELECT 
+					`id`, `comment_status`, `menu_order`
+				FROM 
+					`".$this->shop->prefix."posts` 
+				WHERE 
+					`wpsg_produkt_id` = '".wpsg_q($produkt_id)."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			");
+						
+			$data = array(
+				"post_title" => wpsg_q($product_target['name']), 
+				'post_author' => $current_user->ID,
+				'post_content' => wpsg_q($post_content),
+				"post_type" => wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
+				"wpsg_produkt_id" => wpsg_q($copy_id),
+				"comment_status" => wpsg_q($post_data['comment_status']),
+				"post_name" => wpsg_q($this->shop->clear($product_target['name'])),
+				"menu_order" => wpsg_q($post_data['menu_order']),
+				"post_modified" => "NOW()",
+				"post_modified_gmt" => "NOW()",
+				'post_date' => 'NOW()'
+			);
+			 
+			$post_id = $this->db->ImportQuery($this->shop->prefix.'posts', $data);
+			
+			$this->updatePostThumbnail($copy_id);
+			
+			// Taxonomie mit kopieren
+			$this->db->Query("DELETE FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_id)."'");
+			
+			$arTaxOriginalProduct = $this->db->fetchAssocField("SELECT `term_taxonomy_id` FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_data['id'])."' ");
+			
+			foreach ($arTaxOriginalProduct as $term_taxonomy_id)
+			{
+				
+				$this->db->ImportQuery($this->shop->prefix.'term_relationships', array(
+					'object_id' => wpsg_q($post_id),
+					'term_taxonomy_id' => wpsg_q($term_taxonomy_id),
+					'term_order' => '0'
+				));
+				
+				$count = $this->db->fetchOne("SELECT COUNT(*) FROM `".$this->shop->prefix."term_relationships` WHERE `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
+				
+				$this->db->UpdateQuery($this->shop->prefix."term_taxonomy", array(
+					'count' => wpsg_q($count)
+				), "`term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
+				
+			}
+			 			
+		} // public function produkt_copy(&$produkt_id, &$copy_id)
+		
+		public function produkt_edit(&$data)
+		{
+
+			global $wpdb;
+			 
+			$data = wpsg_array_merge($data, (array)$this->db->fetchRow("
+				SELECT
+					`id` AS `post_id`,
+					`comment_status`,
+					`menu_order`,
+					`post_name`
+				FROM	
+					`".$this->shop->prefix."posts`
+				WHERE
+					`wpsg_produkt_id` = '".wpsg_q($data['id'])."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			")); 
+			
+		} // public function produkt_edit(&$data)
+		
+		public function produkt_del($produkt_id) 
+		{ 
+			
+			global $wpdb;
+			
+			$post_id = $this->db->fetchOne("
+				SELECT 
+					`id` 
+				FROM 
+					`".$this->shop->prefix."posts` 
+				WHERE 
+					`wpsg_produkt_id` = '".wpsg_q($produkt_id)."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			");
+			
+			$this->db->Query("DELETE FROM `".$this->shop->prefix."posts` WHERE `wpsg_produkt_id` = '".wpsg_q($produkt_id)."'");
+			
+			$this->db->Query("DELETE FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_id)."'");
+			
+			$this->db->Query("DELETE FROM `".$this->shop->prefix."postmeta` WHERE `post_id` = '".wpsg_q($post_id)."'");
+			
+			$this->updateTaxonomieCount();
+			
+		} // public function produkt_del($produkt_id)
+		
+		public function wp_head() 
+		{ 
+			
+			global $post;
+			
+			if (is_single($post) && get_post_type($post) == $this->shop->get_option('wpsg_mod_produktartikel_pathkey'))
+			{
+								
+				$produkt_id = $post->wpsg_produkt_id;
+				
+				$this->shop->view['data'] = $this->shop->loadProduktArray($produkt_id);
+				$this->shop->view['data']['url'] = '';
+				$this->getProduktlink($produkt_id, $this->shop->view['data']['url']);
+				
+				$this->shop->view['data']['beschreibung'] = preg_replace("/\r|\n/", "", wpsg_hspc(strip_tags($this->shop->view['data']['beschreibung'])));				
+				
+				if ($this->shop->hasMod('wpsg_mod_produktbilder'))
+				{
+					
+					$arBilder = $this->shop->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($produkt_id)); 
+
+					if (sizeof($arBilder) > 0) $this->shop->view['data']['bilder'] = $arBilder;
 					
 				}
 				
-                $content = $this->shop->renderProdukt($produkt_id);
-
-                return -2;
-
-            }
-
-        } // public function content_filter()
-
-        public function pre_get_posts(&$query) {
-
-            if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_produktartikel_onlyMainQuery')) && !$query->is_main_query()) return;
-
-            if ($this->shop->get_option('wpsg_mod_produktartikel_showHome') == '1' && is_home())
-            {
-
-                $this->setPostType($query);
-
-            }
-
-            if ($this->shop->get_option('wpsg_mod_produktartikel_showCategory') == '1' && is_tax($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat')))
-            {
-
-                $this->setPostType($query);
-
-            }
-
-            if ($this->shop->get_option('wpsg_mod_produktartikel_showFeed') == '1' && is_feed())
-            {
-
-                $this->setPostType($query);
-
-            }
-
-            if ($this->shop->get_option('wpsg_mod_produktartikel_showSearch') == '1' && is_search())
-            {
-
-                $this->setPostType($query);
-
-            }
-
-            if (is_single() && $query->is_main_query())
-            {
-
-                $this->setPostType($query);
-
-            }
-
-        } // public function pre_get_posts(&$query)
-
-        public function settings_edit()
-        {
-
-            // Rebuild
-            $this->shop->view['ToRebuild'] = wpsg_getArray($this->shop->get_option('wpsg_mod_produktartikel_rebuild'));
-
-            // VerfÃŒgbare Produkttemplates
-            $this->shop->view['arTemplates'] = $this->shop->loadProduktTemplates(true);
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/settings_edit.phtml');
-
-        }
-
-        public function settings_save() {
-
-            global $wpdb;
-
-	        $_REQUEST['wpsg_mod_produktartikel_pathkey'] = wpsg_sinput("text_field", $_REQUEST['wpsg_mod_produktartikel_pathkey']);
-	        $_REQUEST['wpsg_mod_produktartikel_pathkey_cat'] = wpsg_sinput("text_field", $_REQUEST['wpsg_mod_produktartikel_pathkey_cat']);
-
-	        $this->shop->update_option('wpsg_mod_produktartikel_showHome', $_REQUEST['wpsg_mod_produktartikel_showHome'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_produktartikel_showCategory', $_REQUEST['wpsg_mod_produktartikel_showCategory'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_produktartikel_showFeed', $_REQUEST['wpsg_mod_produktartikel_showFeed'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_produktartikel_showSearch', $_REQUEST['wpsg_mod_produktartikel_showSearch'], false, false, WPSG_SANITIZE_CHECKBOX);
-	        $this->shop->update_option('wpsg_mod_produktartikel_onlyMainQuery', $_REQUEST['wpsg_mod_produktartikel_onlyMainQuery'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-
-            $this->shop->update_option('wpsg_mod_produktartikel_showui', $_REQUEST['wpsg_mod_produktartikel_showui'], false, false, WPSG_SANITIZE_CHECKBOX);
-            $this->shop->update_option('wpsg_mod_produktartikel_comment', $_REQUEST['wpsg_mod_produktartikel_comment'], false, false, WPSG_SANITIZE_INT);
-
-            $this->shop->update_option('wpsg_mod_produktartikel_hometemplate', wpsg_xss($_REQUEST['wpsg_mod_produktartikel_hometemplate']));
-            $this->shop->update_option('wpsg_mod_produktartikel_listtemplate', wpsg_xss($_REQUEST['wpsg_mod_produktartikel_listtemplate']));
-            $this->shop->update_option('wpsg_mod_produktartikel_searchtemplate', wpsg_xss($_REQUEST['wpsg_mod_produktartikel_searchtemplate']));
-
-            $this->shop->update_option('wpsg_mod_produktartikel_postthumbnail', $_REQUEST['wpsg_mod_produktartikel_postthumbnail'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-			$this->shop->update_option('wpsg_mod_produktartikel_cat', $_REQUEST['wpsg_mod_produktartikel_cat'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_produktartikel_cat_ignore', $_REQUEST['wpsg_mod_produktartikel_cat_ignore'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_produktartikel_cat_first_level', $_REQUEST['wpsg_mod_produktartikel_cat_first_level'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-            //$this->shop->update_option('wpsg_mod_produktartikel_positionnumber', $_REQUEST['wpsg_mod_produktartikel_positionnumber'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-            $pathkey_alt = $this->shop->get_option('wpsg_mod_produktartikel_pathkey');
-            $pathkey_new = $this->shop->clear($_REQUEST['wpsg_mod_produktartikel_pathkey']);
-
-            $this->shop->update_option('wpsg_mod_produktartikel_rating', $_REQUEST['wpsg_mod_produktartikel_rating'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-            if ($pathkey_alt != $_REQUEST['wpsg_mod_produktartikel_pathkey'] && $pathkey_new != '')
-            {
-
-                $this->db->UpdateQuery($this->shop->prefix."posts", array(
-                    'post_type' => wpsg_q($pathkey_new)
-                ), "`post_type` = '".wpsg_q($pathkey_alt)."'");
-
-                $this->shop->update_option('wpsg_mod_produktartikel_pathkey', $pathkey_new, false, false, WPSG_SANITIZE_TEXTFIELD);
-
-                $this->shop->addBackendMessage(__('Path Key erfolgreich geÃ€ndert. Die Produkt URLs haben sich geÃ€ndert!', 'wpsg'));
-
-            }
-            else if (trim($_REQUEST['wpsg_mod_produktartikel_pathkey']) == '')
-            {
-
-                $this->shop->addBackendError(__('Der Path Key darf nicht leer sein!', 'wpsg'));
-
-            }
-
-            $pathkey_cat_old = $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat');
-            $pathkey_cat_new = $this->shop->clear($_REQUEST['wpsg_mod_produktartikel_pathkey_cat']);
-
-            if ($pathkey_cat_old != $_REQUEST['wpsg_mod_produktartikel_pathkey_cat'] && $pathkey_cat_new != '')
-            {
-
-                $this->db->UpdateQuery($this->shop->prefix."term_taxonomy", array(
-                    'taxonomy' => wpsg_q($pathkey_cat_new)
-                ), " `taxonomy` = '".wpsg_q($pathkey_cat_old)."' ");
-
-                $this->db->UpdateQuery($this->shop->prefix."postmeta", array(
-                    'meta_value' => wpsg_q($pathkey_cat_new)
-                ), " `meta_key` = '_menu_item_object' AND `meta_value` = '".wpsg_q($pathkey_cat_old)."' ");
-
-                $this->shop->update_option('wpsg_mod_produktartikel_pathkey_cat', $pathkey_cat_new, false, false, WPSG_SANITIZE_TEXTFIELD);
-
-                $this->shop->addBackendMessage(__('Path Key (Kategorie) erfolgreich geÃ€ndert. Die Kategorie URLs haben sich geÃ€ndert!', 'wpsg'));
-
-            }
-            else if (trim($_REQUEST['wpsg_mod_produktartikel_pathkey_cat']) == '')
-            {
-
-                $this->shop->addBackendError(__('Der Path Key (Kategorie) darf nicht leer sein!', 'wpsg'));
-
-            }
-
-            $this->create_wpsg_post_types();
-            flush_rewrite_rules();
-
-        } // public function settings_save()
-
-        public function wpsg_add_pages($default_page)
-        {
-
-            $callback = add_submenu_page($default_page, __("Produktkategorien", "wpsg"), __("Produktkategorien", "wpsg"), 'wpsg_produkt', 'wpsg-Productcategories', 'callback');
-
-            $this->default_page = $default_page;
-
-            add_action("load-".$callback, function() { header('Location: '.admin_url('edit-tags.php?taxonomy='.$this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))); exit; } );
-
-            add_filter('parent_file', array($this, 'setParentmenu'), 10, 1);
-            add_filter('submenu_file', array($this, 'setSubmenu'), 10, 1);
-
-        } // public function wpsg_add_pages()
-
-        function setParentmenu($parent_file)
-        {
-
-            if (wpsg_isSizedString($_REQUEST['taxonomy'], $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))) $parent_file = $this->default_page;
-
-            return $parent_file;
-        }
-
-        function setSubmenu($submenu_file)
-        {
-
-            if ($submenu_file == 'edit-tags.php?taxonomy='.$this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat')) $submenu_file = 'wpsg-Productcategories';
-
-            return $submenu_file;
-
-        }
-
-        public function admin_includes()
-        {
-
-            echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_noJS', __('Socialshareprivacy nicht einbinden (Produktartikel)', 'wpsg'), $this->shop->get_option('wpsg_mod_produktartikel_noJS'), array(
-                'hint' => wpsg_translate('nohspc_'.__('Ist diese Option aktiv, so wird die benÃ¶tigte JavaScript Bibliothek <u>nicht</u> eingebunden, auch wenn die Optionen im <a href="#1#">Produktartikelmodul</a> aktiv sind.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktartikel')
-            ));
-
-        } // function admin_includes()
-
-        public function admin_includes_save()
-        {
-
-            $this->shop->update_option('wpsg_mod_produktartikel_noJS', $_REQUEST['wpsg_mod_produktartikel_noJS'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-        } // function admin_includes_save()
-
-        public function produkt_copy(&$produkt_id, &$copy_id)
-        {
-
-            global $current_user;
-
-            $product_source = $this->shop->cache->loadProduct($produkt_id);
-            $product_target = $this->shop->cache->loadProduct($copy_id);
-
-            $post_content = $this->renderProdukt($copy_id);
-            $post_content = $this->clear_post_content($post_content);
-
-            $post_data = $this->db->fetchRow("
-                    SELECT
-                        `id`, `comment_status`, `menu_order`
-                    FROM
-                        `".$this->shop->prefix."posts`
-                    WHERE
-                        `wpsg_produkt_id` = '".wpsg_q($produkt_id)."' AND
-                        `post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
-                ");
-
-            $data = array(
-                "post_title" => wpsg_q($product_target['name']),
-                'post_author' => $current_user->ID,
-                'post_content' => wpsg_q($post_content),
-                "post_type" => wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
-                "wpsg_produkt_id" => wpsg_q($copy_id),
-                "comment_status" => wpsg_q($post_data['comment_status']),
-                "post_name" => wpsg_q($this->shop->clear($product_target['name'])),
-                "menu_order" => wpsg_q($post_data['menu_order']),
-                "post_modified" => "NOW()",
-                "post_modified_gmt" => "NOW()",
-                'post_date' => 'NOW()'
-            );
-
-            $post_id = $this->db->ImportQuery($this->shop->prefix.'posts', $data);
-
-            $this->updatePostThumbnail($copy_id);
-
-            // Taxonomie mit kopieren
-            $this->db->Query("DELETE FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_id)."'");
-
-            $arTaxOriginalProduct = $this->db->fetchAssocField("SELECT `term_taxonomy_id` FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_data['id'])."' ");
-
-            foreach ($arTaxOriginalProduct as $term_taxonomy_id)
-            {
-
-                $this->db->ImportQuery($this->shop->prefix.'term_relationships', array(
-                    'object_id' => wpsg_q($post_id),
-                    'term_taxonomy_id' => wpsg_q($term_taxonomy_id),
-                    'term_order' => '0'
-                ));
-
-                $count = $this->db->fetchOne("SELECT COUNT(*) FROM `".$this->shop->prefix."term_relationships` WHERE `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
-
-                $this->db->UpdateQuery($this->shop->prefix."term_taxonomy", array(
-                    'count' => wpsg_q($count)
-                ), "`term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
-
-            }
-
-        } // public function produkt_copy(&$produkt_id, &$copy_id)
-
-        public function produkt_del($produkt_id)
-        {
-
-            global $wpdb;
-
-            $post_id = $this->db->fetchOne("
-                    SELECT
-                        `id`
-                    FROM
-                        `".$this->shop->prefix."posts`
-                    WHERE
-                        `wpsg_produkt_id` = '".wpsg_q($produkt_id)."' AND
-                        `post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
-                ");
-
-            $this->db->Query("DELETE FROM `".$this->shop->prefix."posts` WHERE `wpsg_produkt_id` = '".wpsg_q($produkt_id)."'");
-
-            $this->db->Query("DELETE FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_id)."'");
-
-            $this->db->Query("DELETE FROM `".$this->shop->prefix."postmeta` WHERE `post_id` = '".wpsg_q($post_id)."'");
-
-            $this->updateTaxonomieCount();
-
-        } // public function produkt_del($produkt_id)
-
-        public function wp_head()
-        {
-
-            global $post;
-
-            if (is_single($post) && get_post_type($post) == $this->shop->get_option('wpsg_mod_produktartikel_pathkey'))
-            {
-
-                $produkt_id = $post->wpsg_produkt_id;
-
-                $this->shop->view['data'] = $this->shop->loadProduktArray($produkt_id);
-                $this->shop->view['data']['url'] = '';
-                $this->getProduktlink($produkt_id, $this->shop->view['data']['url']);
-
-                if (isset($this->shop->view['data']['beschreibung'])) $this->shop->view['data']['beschreibung'] = preg_replace("/\r|\n/", "", wpsg_hspc(strip_tags($this->shop->view['data']['beschreibung'])));
-
-                $arBilder = array();
-                $arBilder = $this->shop->imagehandler->getAttachmentIDs($produkt_id);
-
-                if (isset($arBilder) && (sizeof($arBilder) > 0)) $this->shop->view['data']['bilder'] = $arBilder;
-
-                /*
-                if ($this->shop->get_option('wpsg_mod_produktartikel_facebook') == '1')
-                {
-                    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/header_facebook.phtml');
-                }
-                if ($this->shop->get_option('wpsg_mod_produktartikel_google') == '1')
-                {
-                    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/header_google.phtml');
-                }
-                */
-
-            }
-
-        } // public function wp_head()
-
-        public function produkt_edit_allgemein(&$produkt_data) {
-
-            $post_id = $this->hasPostId($produkt_data['id']);
-
-            $this->shop->view['data'] = $produkt_data;
-
-            if (wpsg_isSizedInt($post_id)) {
-
-                $this->shop->view['data']['post_name'] = $this->db->fetchOne("
-                    SELECT
-                        `post_name`
-                    FROM
-                        `".$this->shop->prefix."posts`
-                    WHERE
-                        `ID` = '".wpsg_q($post_id)."' 
-                ");
-
-            }
-
-            $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/produkt_edit_allgemein.phtml');
-
-        } // public function produkt_edit_allgemein(&$produkt_data)
-
-        public function product_addedit_content(&$product_content, &$product_data)
-        {
-
-            global $wpdb;
-
-            // Bei Ãbersetzungen nichts machen
-            if (isset($_REQUEST['wpsg_lang'])) return;
-
-            if (wpsg_isSizedInt($product_data['id']))
-            {
-
-                $product_data = wpsg_array_merge($product_data, (array)$this->db->fetchRow("
-                        SELECT
-                            `id` AS `post_id`,
-                            `comment_status`,
-                            `menu_order`,
-                            `post_name`
-                        FROM
-                            `".$this->shop->prefix."posts`
-                        WHERE
-                            `wpsg_produkt_id` = '".wpsg_q($product_data['id'])."' AND
-                            `post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
-                    "));
-
-            }
-
-            $product_content['wpsg_mod_produktartikel'] = array(
-                'title' => __('Kategorie / Artikel', 'wpsg'),
-                'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/produkt_addedit_content.phtml', false)
-            );
-
-        } // public function product_addedit_content(&$product_content, &$product_data)
-
-        public function produkt_save_translation(&$product_id, &$trans_id)
-        {
-
-            if (function_exists('icl_object_id')) //if (is_plugin_active('sitepress-multilingual-cms/sitepress.php'))
-            {
-
-                // WPML
-                $post_id = $this->getPostIdFromProductId($product_id);
-
-                if (wpsg_isSizedInt($post_id))
-                {
-
-                    $trans_product = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($trans_id)."' ");
-                    $post = $this->db->fetchRow("SELECT * FROM `".$this->shop->prefix."posts` WHERE `ID` = '".$post_id."' ");
-
-                    if (wpsg_isSizedString($_REQUEST['wpsg_mod_produktartikel']['path'])) $path = $_REQUEST['wpsg_mod_produktartikel']['path'];
-                    else $path = $trans_product['name'];
-
-                    $trans_post_id = $this->getPostIdFromProductId($trans_id, $path, (($post['comment_status'] === 'open')?'1':'0'), $post['menu_order'], true);
-
-                    // Gibt es zu dem Post schon eine trid?
-                    $trid = $this->db->fetchOne("SELECT `trid` FROM `".$this->shop->prefix."icl_translations` WHERE `element_type` = '".wpsg_q('post_'.$this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."' AND `element_id` = '".wpsg_q($post_id)."' ");
-                    if (!wpsg_isSizedInt($trid))
-                    {
-
-                        $trid = 1 + $this->db->fetchOne("SELECT MAX(`trid`) FROM ".$this->shop->prefix."icl_translations");
-                        $this->db->ImportQuery($this->shop->prefix."icl_translations", array(
-                            'element_type' => wpsg_q('post_'.$this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
-                            'element_id' => wpsg_q($post_id),
-                            'trid' => wpsg_q($trid),
-                            'language_code' => wpsg_q($this->shop->getDefaultLanguageCode()),
-                            'source_language_code' => 'NULL'
-                        ));
-
-                    }
-
-                    // Gibt es schon einen ICL Eintrag zur Ãbersetzung?
-                    $icl_id = $this->db->fetchOne("SELECT `translation_id` FROM `".$this->shop->prefix."icl_translations` WHERE `element_type` = '".wpsg_q('post_'.$this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."' AND `element_id` = '".wpsg_q($trans_post_id)."' ");
-                    if (!wpsg_isSizedInt($icl_id))
-                    {
-
-                        $this->db->ImportQuery($this->shop->prefix."icl_translations", array(
-                            'element_type' => wpsg_q('post_'.$this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
-                            'element_id' => wpsg_q($trans_post_id),
-                            'trid' => wpsg_q($trid),
-                            'language_code' => wpsg_q($_REQUEST['wpsg_lang']),
-                            'source_language_code' => wpsg_q($this->shop->getDefaultLanguageCode())
-                        ));
-
-                    }
-
-                } else throw new \Exception(wpsg_translate(__('Custom Post Type existiert zu Produkt (ID:#1#) noch nicht.', 'wpsg'), $product_id));
-
-            }
-            else
-            {
-
-                // qTranslate
-                // Da sich die Ãbersetzung geÃ€ndert hat muss das Produkt erneut gespeichert werden
-                $this->produkt_save($product_id);
-
-            }
-
-        } // public function produkt_save_translation(&$produkt_id, &$trans_id)
+				if ($this->shop->get_option('wpsg_mod_produktartikel_facebook') == '1')
+				{
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/header_facebook.phtml');
+				}
+				if ($this->shop->get_option('wpsg_mod_produktartikel_google') == '1')
+				{
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/header_google.phtml');
+				} 		
+				
+			}
+						
+		} // public function wp_head()
+		
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			$this->shop->view['data'] = $produkt_data;
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/produkt_edit_sidebar.phtml');
+						
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		
+		public function produkt_edit_allgemein(&$produkt_data) { 
+		
+			$this->shop->view['data'] = $produkt_data;
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/produkt_edit_allgemein.phtml');
+			
+		} // public function produkt_edit_allgemein(&$produkt_data)
+				
+		public function produkt_save_translation(&$produkt_id, &$trans_id)
+		{
+					
+			// Da sich die Ãbersetzung geÃ€ndert hat muss das Produkt erneut gespeichert werden
+			$this->produkt_save($produkt_id);
+			 
+		} // public function produkt_save_translation(&$produkt_id, &$trans_id)
+		
+		public function produkt_save(&$produkt_id) 
+		{ 
+
+			global $wpdb, $current_user;
+			
+			// PrÃŒfen ob ein Post zu diesem Artikel existiert
+			$post_id = $this->db->fetchOne("
+				SELECT 
+					`id` 
+				FROM 
+					`".$this->shop->prefix."posts` 
+				WHERE 
+					`wpsg_produkt_id` = '".wpsg_q($produkt_id)."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			");
+			 			
+			$produkt = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'");
+			
+			// Sollte der Path leer sein dann den Produktnamen nehmen
+			if (trim($_REQUEST['wpsg_mod_produktartikel']['path']) == '')
+			{
+				$_REQUEST['wpsg_mod_produktartikel']['path'] = $_REQUEST['name'];
+			}
+			 
+			$arLanguages = $this->shop->getStoreLanguages();
+			if (wpsg_isSizedArray($arLanguages) && sizeof($arLanguages) > 1)
+			{
+
+				$post_title = '';
+				$post_content = '';
+				
+				// Titel der Ãbersetzten Produkte heraussuchen
+				foreach ($arLanguages as $l)
+				{
+					
+					$produkt_trans = $this->db->fetchRow("SELECT `id`, `name` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_locale` = '".wpsg_q($l['locale'])."' AND `lang_parent` = '".wpsg_q($produkt_id)."'");
+					
+					if ($produkt_trans['id'] > 0) // Ãbersetzung existiert					{
+					{
+						$post_title .= '<!--:'.$l['lang'].'-->'.$produkt_trans['name'].'<!--:-->';
+						$post_content .= '<!--:'.$l['lang'].'-->'.$this->shop->renderProdukt($produkt_id, false, $l['locale']).'<!--:-->';						
+					}
+					else // Ãbersetzung existiert nicht, hier trage ich einfach den Originaltext ein
+					{
+						$post_title .= '<!--:'.$l['lang'].'-->'.$produkt['name'].'<!--:-->';
+						$post_content .= '<!--:'.$l['lang'].'-->'.$this->shop->renderProdukt($produkt_id).'<!--:-->';
+					}
+					
+				}
+				
+			}
+			else
+			{
+				
+				$post_title = $_REQUEST['name'];
+				$post_content = $this->shop->renderProdukt($produkt_id);
+				
+			}
+			
+			$data = array(
+				"post_title" => wpsg_q($post_title), 
+				'post_author' => $current_user->ID,				
+				'post_content' => wpsg_q($post_content),
+				"post_type" => wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
+				"wpsg_produkt_id" => wpsg_q($produkt_id),
+				"comment_status" => wpsg_q(((wpsg_isSizedInt($_REQUEST['wpsg_mod_produktartikel']['kommentare']))?'open':'closed')),
+				"menu_order" => wpsg_q($_REQUEST['wpsg_produktartikel_menuorder']),
+				"post_modified" => "NOW()",
+				"post_modified_gmt" => "NOW()"
+			);
+			 
+			if ($post_id <= 0)
+			{
+				
+				$data['post_date'] = $produkt['cdate'];
+				$post_id = $this->db->ImportQuery($this->shop->prefix.'posts', $data);
+				 				
+			}
+			else
+			{
+								
+				$this->db->UpdateQuery($this->shop->prefix.'posts', $data, "`id` = '".wpsg_q($post_id)."'");
+				
+			}
+			
+			// Pathkey
+			$data = array();
+			$data['post_name'] = wpsg_q($this->shop->clear($_REQUEST['wpsg_mod_produktartikel']['path'], $post_id));
+			$this->db->UpdateQuery($this->shop->prefix.'posts', $data, "`id` = '".wpsg_q($post_id)."'");
+			
+			// Kategorie speichern			
+			if (!wpsg_isSizedString($_REQUEST['wpsg_lang']))
+			{
+			
+				// Die Kategorie darf nur beim speichern in der Originalsprache gesetzt werden!
+				
+				// Alte Zuordnung lÃ¶schen
+				$this->db->Query("DELETE FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_id)."'");
+				
+				// Neue Zuordnung speichern
+				foreach ((array)$_REQUEST['post_category'] as $c)
+				{
+					
+					$term_taxonomy_id = $this->db->fetchOne("SELECT `term_taxonomy_id` FROM `".$this->shop->prefix."term_taxonomy` WHERE `term_id` = '".wpsg_q($c)."'");
+					
+					$this->db->ImportQuery($this->shop->prefix.'term_relationships', array(
+						'object_id' => wpsg_q($post_id),
+						'term_taxonomy_id' => wpsg_q($term_taxonomy_id),
+						'term_order' => '0'
+					));
+					
+					$count = $this->db->fetchOne("SELECT COUNT(*) FROM `".$this->shop->prefix."term_relationships` WHERE `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
+					
+					$this->db->UpdateQuery($this->shop->prefix."term_taxonomy", array(
+						'count' => wpsg_q($count)
+					), "`term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
+					
+				}
+				
+				$this->updateTaxonomieCount();
+				
+			}
+			
+			$this->updatePostThumbnail($produkt_id);
+						
+			flush_rewrite_rules();
+			
+		} // public function produkt_save($produkt_id)
+		
+		public function create_wpsg_post_types()
+		{
+		 
+			$show_ui = false;
+			
+			if ($this->shop->get_option('wpsg_mod_produktartikel_showui') == '1') $show_ui = true;
+					
+			register_post_type($this->shop->get_option('wpsg_mod_produktartikel_pathkey'),
+				array(
+					'public' => true, // steht auf "true", damit andere Module/ Plugins diesen Posttype "sehen" kÃ¶nnen
+					'publicly_queryable' => false,
+					'labels' => array(
+						'name' => __('wpShopGermany Produkte', 'wpsg')
+					),
+					'query_var' => false,
+					'rewrite' => array('slug' => $this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
+					'show_ui' => $show_ui,
+ 					'show_in_menu' => true,
+					'taxonomies' => array('category'),
+					'supports' => array('title', 'editor', 'thumbnail')
+				)
+			); 
+						
+		} // public function create_wpsg_post_types()
+
+		public function getProduktlink($produkt_id, &$url) 
+		{ 
+
+			$produkt_id = $this->shop->getProduktId($produkt_id);
+			
+			$post_id = $this->db->fetchOne("
+				SELECT 
+					`id` 
+				FROM 
+					`".$this->shop->prefix."posts` 
+				WHERE 
+					`wpsg_produkt_id` = '".wpsg_q($produkt_id)."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			");
+
+			// Wenn kein Post gefunden abbrechen, sonst gibt es die URL der Startseite und die alternative URL Bildung ÃŒber den Warenkorb funktioniert nicht.
+			if ($post_id <= 0) return;
+			
+			$url = get_permalink($post_id);
+			
+			if (function_exists('qtrans_convertURL'))
+			{
+				
+				$url = qtrans_convertURL($url);
+				
+			}
+			
+			return -1;
+			
+		} // public function getProduktlink($produkt_id)
+		
+		public function renderProdukt_templateSelect(&$produkt_data, &$template_file) 
+		{ 
+			 
+			if ($GLOBALS['wp_the_query']->is_category && $this->shop->get_option('wpsg_mod_produktartikel_listtemplate') != '-1' && $this->shop->get_option('wpsg_mod_produktartikel_listtemplate') != false)
+			{
+				
+				$template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_produktartikel_listtemplate'); 
+				
+			}
+			else if ($GLOBALS['wp_the_query']->is_search && $this->shop->get_option('wpsg_mod_produktartikel_searchtemplate') != '-1' && $this->shop->get_option('wpsg_mod_produktartikel_searchtemplate') != false)
+			{
+				
+				$template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_produktartikel_searchtemplate'); 
+				
+			} 
+			else if ($GLOBALS['wp_the_query']->is_home && $this->shop->get_option('wpsg_mod_produktartikel_hometemplate') != '-1' && $this->shop->get_option('wpsg_mod_produktartikel_hometemplate') != false)
+			{
+				
+				$template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_produktartikel_hometemplate');
+				
+			}
+			 
+		} // public function renderProdukt_templateSelect(&$produkt_data, &$template_file)
+		
+		public function loadProduktArray(&$produkt_data) 
+		{ 
+
+			global $wpdb;
+
+			$product_id = $this->shop->getProduktId($produkt_data['id']);
+			
+			$post_id = $this->db->fetchOne("
+				SELECT 
+					`id` 
+				FROM 
+					`".$this->shop->prefix."posts` 
+				WHERE 
+					`wpsg_produkt_id` = '".wpsg_q($product_id)."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			");
+			
+			$post_data = $this->db->fetchRow("
+				SELECT
+					`id`, `menu_order`
+				FROM
+					`".$this->shop->prefix."posts`
+				WHERE
+					`wpsg_produkt_id` = '".wpsg_q($product_id)."' AND
+					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
+			");
  
-        public function produkt_save(&$product_id) {
-
-            if (isset($_REQUEST['wpsg_mod_produktartikel'])) $comment = sanitize_text_field($_REQUEST['wpsg_mod_produktartikel']['kommentare']??''); else $comment = false;
-
-            $this->getPostIdFromProductId($product_id, $_REQUEST['wpsg_mod_produktartikel']['path'], $comment, $_REQUEST['wpsg_produktartikel_menuorder'], true, ((($_REQUEST['disabled']??'0') === '1')?'1':'0') );
-
-        } // public function produkt_save($produkt_id)
-
-        public function create_wpsg_post_types() {
-
-            $show_ui = false;
-
-            if ($this->shop->get_option('wpsg_mod_produktartikel_showui') == '1') $show_ui = true;
- 
-            register_taxonomy($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'), $this->shop->get_option('wpsg_mod_produktartikel_pathkey'), array(
-                'label' => __('Produktkategorien', 'wpsg'),
-                'labels' => array(
-                    'name' => __('Produktkategorien', 'wpsg'),
-                    'add_new_item' => __('Neue Produktkategorie erstellen', 'wpsg'),
-                    'edit_item' => __('Produktkategorie bearbeiten', 'wpsg')
-                ),
-                'show_ui' => true,
-                'show_in_menu' => false,
-                'hierarchical' => true
-            ));
-
-            register_post_type($this->shop->get_option('wpsg_mod_produktartikel_pathkey'),
-                array(
-                    'public' => true, // steht auf "true", damit andere Module/ Plugins diesen Posttype "sehen" kÃ¶nnen
-                    'publicly_queryable' => true,
-                    'labels' => array(
-                        'name' => __('wpShopGermany Produkte', 'wpsg')
-                    ),
-                    'query_var' => false,
-                    'rewrite' => array('slug' => $this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
-                    'show_ui' => $show_ui,
-                    'show_in_menu' => true,
-                    'taxonomies' => array($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat')),
-                    'has_archive' => true,
-                    'supports' => array('title', 'editor', 'thumbnail', 'page-attributes')
-                )
-            );
-
-        } // public function create_wpsg_post_types()
-
-        public function getProduktlink($product_id, &$url, $language_code = false) {
-
-            $product_id = $this->shop->getProduktId($product_id);
-            $post_id = $this->hasPostId($product_id);
-
-            if (wpsg_isSizedInt($post_id)) {
-
-                if (function_exists('qtrans_convertURL')) {
-
-                    $url = get_permalink($post_id);
-                    $url = qtrans_convertURL($url);
-
-                } else {
-
-                    if (function_exists('icl_object_id') && $language_code !== false) {
-
-                        $post_id = apply_filters('wpml_object_id', $post_id, $this->shop->get_option('wpsg_mod_produktartikel_pathkey'), true, $language_code);
-
-                    }
-
-                    $url = get_permalink($post_id);
-
-                }
-
-                return -1;
-
-            }
-
-        } // public function getProduktlink($produkt_id)
-
-        public function renderProdukt_templateSelect(&$produkt_data, &$template_file)
-        {
-
-            if (($GLOBALS['wp_the_query']->is_tax || $GLOBALS['wp_the_query']->is_post_type_archive($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))) && $this->shop->get_option('wpsg_mod_produktartikel_listtemplate') != '-1' && $this->shop->get_option('wpsg_mod_produktartikel_listtemplate') != false)
-            {
-
-                $template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_produktartikel_listtemplate');
-
-            }
-            else if ($GLOBALS['wp_the_query']->is_search && $this->shop->get_option('wpsg_mod_produktartikel_searchtemplate') != '-1' && $this->shop->get_option('wpsg_mod_produktartikel_searchtemplate') != false)
-            {
-
-                $template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_produktartikel_searchtemplate');
-
-            }
-            else if ($GLOBALS['wp_the_query']->is_home && $this->shop->get_option('wpsg_mod_produktartikel_hometemplate') != '-1' && $this->shop->get_option('wpsg_mod_produktartikel_hometemplate') != false)
-            {
-
-                $template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_produktartikel_hometemplate');
-
-            }
-
-        } // public function renderProdukt_templateSelect(&$produkt_data, &$template_file)
-
-        public function loadProduktArray(&$produkt_data) {
-
-            global $wpdb;
-
-            $product_id = $this->shop->getProduktId($produkt_data['id']);
-
-            $post_data = $this->db->fetchRow("
-                SELECT
-                    `id`, `menu_order`, `comment_status`
-                FROM
-                    `".$this->shop->prefix."posts`
-                WHERE
-                    `wpsg_produkt_id` = '".wpsg_q($product_id)."' AND
-                    `post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
-            ");
-
-            if (!wpsg_isSizedArray($post_data)) return;
-
-            $post_id = $post_data['id'];
-
-            $arCat = $this->db->fetchOne("
-                SELECT
-                    GROUP_CONCAT(DISTINCT `term_taxonomy_id`)
-                FROM
-                    ".$this->shop->prefix."term_relationships
-                WHERE
-                    `object_id` = '".wpsg_q($post_id)."'
-            ");
-
-            $permalink = get_permalink($post_id);
-
-            if (wpsg_isSizedInt($post_id) && wpsg_isSizedString($permalink)) {
-
-                if ($this->shop->get_option('wpsg_mod_produktartikel_comment') === '1') $comment_status = 'open';
-                else if ($this->shop->get_option('wpsg_mod_produktartikel_comment') === '2') $comment_status = 'closed';
-                else $comment_status = $post_data['comment_status'];
-
-                $produkt_data = wpsg_array_merge($produkt_data, array(
-                    'post_id' => $post_id,
-                    'pos' => $post_data['menu_order'],
-                    'url' => get_permalink($post_id),
-                    'comment_status' => $comment_status,
-                    'arCat' => $arCat,
-					'menu_order' => $post_data['menu_order']
-                ));
-
-            }
-
-        } // public function loadProduktArray(&$produkt_data)
-
-        public function systemcheck(&$arData)
-        {
-
-            if (function_exists('icl_object_id'))
-            {
-
-                $icl_sitepress_settings = $this->shop->get_option('icl_sitepress_settings');
-
-                if (wpsg_getStr($icl_sitepress_settings['custom_posts_sync_option'][$this->shop->get_option('wpsg_mod_produktartikel_pathkey')]) !== '1')
-                {
-
-                    $arData[] = array(
-                        'wpsg_mod_produktartikel_wpml_custom_post_type',
-                        wpsg_ShopController::CHECK_ERROR,
-                        wpsg_translate(
-                            __('Sie haben WPML aktiviert und den Custom Post Type der Produkte nicht ÃŒbersetzt. Die Ãbersetzung der Produkte kann so nicht korrekt arbeiten. Klicken Sie <a href="#1#">hier</a> um das Problem zu lÃ¶sen.', 'wpsg'),
-                            WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&noheader=1&modul=wpsg_mod_produktartikel&do=setWPMLPathKey'
-                        )
-                    );
-
-                }
-
-            }
-
-        } // public function systemcheck($arData)
-
-        /* Modulfunktionen */
-
-        /**
-         * Gibt einen Array mit ProduktIDs zurÃŒck
-         * Jeweils das erste Produkt aus allen Kategorien
-         */
-        public function getTop1CatProductIDs() {
-
-            $arCat = \get_terms([
-                'taxonomy' => $GLOBALS['wpsg_sc']->get_option('wpsg_mod_produktartikel_pathkey_cat'),
-                'child_of' => 0
-            ]);
-
-            $arProductIDs = [];
-
-            foreach ($arCat as $oCat) {
-
-                $arProductPosts = \get_posts([
-                    'post_type' => $GLOBALS['wpsg_sc']->get_option('wpsg_mod_produktartikel_pathkey'),
-                    'tax_query' => [
-                        [
-                            'taxonomy' => $GLOBALS['wpsg_sc']->get_option('wpsg_mod_produktartikel_pathkey_cat'),
-                            'field' => 'id',
-                            'terms' => $oCat->term_id
-                        ]
-                    ],
-                    'orderby' => 'menu_order',
-                    'order' => 'ASC',
-                    'offset' => 0,
-                    'posts_per_page' => '1'
-                ]);
-
-                foreach ($arProductPosts as $oPost) {
-
-                    $arProductIDs[] = $GLOBALS['wpsg_sc']->db->fetchOne("SELECT `wpsg_produkt_id` FROM `".$GLOBALS['wpsg_sc']->prefix."posts` WHERE `ID` = ".wpsg_q($oPost->ID)." ");
-
-                }
-
-            }
-
-            return $arProductIDs;
-
-        } // public function getTop1CatProductIDs()
-
-        private function updateTaxonomieCount()
-        {
-
-            $arTermTaxonomyID = $this->db->fetchAssocField("SELECT `term_taxonomy_id` FROM `".$this->shop->prefix."term_taxonomy` ");
-
-            foreach ($arTermTaxonomyID as $term_taxonomy_id)
-            {
-
-                $count = $this->db->fetchOne("SELECT COUNT(*) FROM `".$this->shop->prefix."term_relationships` WHERE `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
-
-                $this->db->UpdateQuery($this->shop->prefix.'term_taxonomy', array(
-                    'count' => wpsg_q($count)
-                ), " `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."' ");
-
-            }
-
-        } // private function updateTaxonomieCount()
-
-        /**
-         * Aktualisiert das Post Thumbnail (Beitragsbild)
-         * in dem zum Produkt gehÃ¶rendem Beitrag
-         */
-        public function updatePostThumbnail($product_id)
-        {
-
-            // Wenn das Produktbildermodul inaktiv ist, muss ich hier nichts machen
-            // Oder wenn Option nicht aktiv
-            if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_produktartikel_postthumbnail'))) return;
-
-            $post_id = $this->getPostIdFromProductId($product_id);	// Parent-ID
-
-            if ($post_id !== false)
-            {
-
-                // ID des bestehenden POST Thumbnail
-                $post_thumbnail_id = get_post_thumbnail_id($post_id);
-
-                // Eventuell bestehendes Thumbnail lÃ¶schen
-                if (wpsg_isSizedInt($post_thumbnail_id))
-                {
-
-                    // Postmeta Typ _thumbnail_id lÃ¶schen
-                    //delete_post_thumbnail($post_id);
-                    // Postmeta Typ _wp_attachment_metadata und _wp_attached_file und Post lÃ¶schen
-                    //wp_delete_attachment($post_thumbnail_id);
-
-                }
-
-                $attachs = $this->shop->imagehandler->getAttachmentIDs($product_id);
-                if (wpsg_isSizedArray($attachs))
-                {
-                    $attach_id = $attachs[0];
-
-                    // Postmeta Typ _thumbnail_id anlegen
-                    set_post_thumbnail($post_id, $attach_id);
-                }
-            }
-
-        } // private function updatePostThumbnail($product_id)
-
-        /**
-         * Gibt false zurÃŒck, wenn noch kein POST existiert oder die POST_ID
-         * Im Gegensatz zu getPostIdFromPRoductId wird nicht angelegt
-         *
-         * @param $product_id
-         */
-        public function hasPostId($product_id) {
-
-            $post_id = $this->db->fetchOne("
-                    SELECT
-                        `id`
-                    FROM
-                        `".$this->shop->prefix."posts`
-                    WHERE
-                        `wpsg_produkt_id` = '".wpsg_q($product_id)."' AND
-                        `post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
-                ");
-
-            if (wpsg_isSizedInt($post_id)) return $post_id;
-            else return false;
-
-        } // public function hasPostId($product_id)
-
-        /**
-         * Gibt die Ausgabe fÃŒr ein Produkt zurÃŒck
-         * Spezielle Render Funktion fÃŒr den Content im Post (SEO)
-         */
-        public function renderProdukt($produkt_id, $force_template = false, $force_locale = false)
-        {
-
-            $oProduct = wpsg_product::getInstance($produkt_id);
-
-            $content = $oProduct->getShortDescription().$this->shop->renderProdukt($produkt_id, $force_template, $force_locale);
-
-            return $content;
-
-        } // public function renderProdukt($produkt_id, $force_template = false, $force_locale = false)
-
-        /**
-         * Gibt die Post_ID anhand einer ProduktID zurÃŒck.
-         * Wird kein Post gefunden, so wird der Post angelegt und zugeordnet
-         */
-        public function getPostIdFromProductId($product_id, $path = false, $comment_status = false, $menu_order = false, $update = false, $disabled = false) {
-
-            global $current_user;
-
-            $post_id = $this->db->fetchOne("
+			$post_id = $post_data['id'];
+			
+			$arCat = $this->db->fetchOne("
+				SELECT 
+					GROUP_CONCAT(DISTINCT `term_taxonomy_id`)
+				FROM
+					".$this->shop->prefix."term_relationships
+				WHERE
+					`object_id` = '".wpsg_q($post_id)."'
+			");
+			
+			if (wpsg_isSizedInt($post_id) && wpsg_isSizedString(get_permalink($post_id)))
+			{
+
+				$produkt_data = wpsg_array_merge($produkt_data, array(
+					'post_id' => $post_id,
+					'pos' => $post_data['menu_order'], 
+					'url' => get_permalink($post_id),
+					'arCat' => $arCat	
+				));
+				
+			}
+			
+		} // public function loadProduktArray(&$produkt_data)
+		
+		/* Modulfunktionen */
+		
+		private function updateTaxonomieCount()
+		{
+			
+			$arTermTaxonomyID = $this->db->fetchAssocField("SELECT `term_taxonomy_id` FROM `".$this->shop->prefix."term_taxonomy` ");
+			
+			foreach ($arTermTaxonomyID as $term_taxonomy_id)
+			{
+
+				$count = $this->db->fetchOne("SELECT COUNT(*) FROM `".$this->shop->prefix."term_relationships` WHERE `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
+				
+				$this->db->UpdateQuery($this->shop->prefix.'term_taxonomy', array(
+					'count' => wpsg_q($count)			
+				), " `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."' ");
+				
+			}
+			
+		} // private function updateTaxonomieCount()
+		
+		/**
+		 * Aktualisiert das Post Thumbnail (Beitragsbild)
+		 * in dem zum Produkt gehÃ¶rendem Beitrag
+		 */
+		public function updatePostThumbnail($product_id)
+		{
+						
+			// Wenn das Produktbildermodul inaktiv ist, muss ich hier nichts machen
+			// Oder wenn Option nicht aktiv
+			if (!$this->shop->hasMod('wpsg_mod_produktbilder') || !wpsg_isSizedInt($this->shop->get_option('wpsg_mod_produktartikel_postthumbnail'))) return;
+			
+			$post_id = $this->getPostIdFromProductId($product_id);
+			
+			if ($post_id !== false)
+			{
+				
+				// ID des bestehenden POST Thumbnail
+				$post_thumbnail_id = get_post_thumbnail_id($post_id);
+				
+				// Die Bilder mÃŒssen in extra Ordner liegen, da Wordpress auch die skallierten Bilder dort ablegt
+				$path_post_thumbnail = $this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($product_id)).'posthumbnail/';
+
+				// Ordner fÃŒr die Thumbnails lÃ¶schen, er beinhaltet die skallierten alten Bilder und wird wieder angelegt sofern ein Bild existiert
+				wpsg_rrmdir($path_post_thumbnail);
+				
+				// Eventuell bestehendes Thumbnail lÃ¶schen
+				if (wpsg_isSizedInt($post_thumbnail_id))
+				{
+					
+					delete_post_thumbnail($post_id);
+					wp_delete_attachment($post_thumbnail_id);
+					
+				}
+				
+				$arBilder = $this->shop->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($product_id));
+				 
+				if (wpsg_isSizedArray($arBilder))
+				{
+					
+					$img_file = array_shift($arBilder);
+					
+					$filename = $this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($product_id)).$img_file;
+					
+					if (!file_exists($path_post_thumbnail)) mkdir($path_post_thumbnail, 0777, true);
+				
+					if (file_exists($path_post_thumbnail))
+					{
+						 
+						copy($filename, $path_post_thumbnail.$img_file);
+						
+						if (file_exists($path_post_thumbnail.$img_file))
+						{
+						
+							$filetype = wp_check_filetype($img_file, null);
+					
+							$fileurl = $this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($product_id, true)).'posthumbnail/'.$img_file;
+							 
+							$attachment = array(
+								'guid' => $fileurl,
+								'post_mime_type' => $filetype['type'],
+								'post_title' => preg_replace('/\.[^.]+$/', '', basename($img_file)),
+								'post_content' => '',
+								'post_status' => 'inherit'
+							);
+	
+							$attach_id = wp_insert_attachment($attachment, $path_post_thumbnail.$img_file, $post_id);
+							
+							// Meta Daten schreiben
+							require_once(ABSPATH.'wp-admin/includes/image.php');
+								
+							$attach_data = wp_generate_attachment_metadata($attach_id, $path_post_thumbnail.$img_file);
+							wp_update_attachment_metadata($attach_id, $attach_data);
+							
+							set_post_thumbnail($post_id, $attach_id);
+							
+						}
+					}
+						 					
+				}
+												
+			}
+			
+		} // private function updatePostThumbnail($product_id)
+		
+		/**
+		 * Gibt die Post_ID anhand einer ProduktID zurÃŒck.
+		 * Wird kein Post gefunden, so wird false zurÃŒckgegeben
+		 */
+		private function getPostIdFromProductId($product_id)
+		{
+			
+			$post_id = $this->db->fetchOne("
 				SELECT
 					`id`
@@ -1032,419 +782,97 @@
 					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."'
 			");
-
-            // SÃ€ubern und sicherstellen, das es nur einen Post je Produkt gibt
-			$arPostDoubleIDs = $this->db->fetchAssocField("
+			
+			if (wpsg_isSizedInt($post_id)) return $post_id;
+			else return false;				
+			
+		} // private function getPostIdFromProductId($product_id)
+		
+		/**
+		 * FÃŒgt die Abfrage fÃŒr den PostType an den Wordpress Query
+		 */
+		private function setPostType($query)
+		{
+			
+			$post_type = $query->get('post_type');
+
+			if ($post_type == '' || !wpsg_isSizedArray($post_type))
+			{
+
+				$postType = array(
+					'post',
+					'page',
+					'attachment',
+					$this->shop->get_option('wpsg_mod_produktartikel_pathkey')
+				);
+				
+				if (is_string($post_type) && strlen($post_type) > 0)
+				{
+					$postType[] = $post_type;
+				}
+				
+				$query->set('post_type', $postType);
+				
+			}
+			else
+			{
+				
+				$post_type[] = $this->shop->get_option('wpsg_mod_produktartikel_pathkey');
+				
+				$query->set('post_type', $post_type);
+				
+			}
+			
+		} // private function setPostType($query)
+				
+		/**
+		 * Wird vom Produkttemplate aufgerufen um die Social Media Links einzubinden
+		 */
+		public function socialIntegration($produkt_id)
+		{
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktartikel/produkt.phtml');
+			
+		} // public function socialIntegration($produkt_id)
+		
+		/**
+		 * Gibt einen Array mit Kategorien zurÃŒck
+		 */
+		public function getCategorySelectArray($ref = 0, $ebene = 0, &$arReturn = array())
+		{
+			
+			global $wpdb;
+			
+			$arCat = $this->db->fetchAssoc("
 				SELECT 
-					`id` 
+					T.`term_id`, T.`name` 
 				FROM 
-					`".$this->shop->prefix."posts` 
-				WHERE
-					`wpsg_produkt_id` = '".wpsg_q($product_id)."' AND
-					`post_type` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey'))."' AND
-					`id` != '".wpsg_q($post_id)."' 
+					`".$this->shop->prefix."term_taxonomy` AS TT
+						LEFT JOIN `".$this->shop->prefix."terms` AS T ON (T.`term_id` = TT.`term_id`)
+				WHERE 
+					TT.`parent` = '".wpsg_q($ref)."' AND 
+					TT.`taxonomy` = 'category ' AND
+					T.`term_id` > 0
+				ORDER BY
+					T.`name` ASC
 			");
 
-			foreach ($arPostDoubleIDs as $double_post_id) {
-
-				\wp_delete_post($double_post_id);
-
-			}
-
-            if (wpsg_isSizedInt($post_id) && $update !== true) return $post_id;
-            else {
-
-                // Hier wird der CustomPost Type angelegt
-                $product = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."'");
-
-                $arLanguages = $this->shop->getStoreLanguages();
-
-                if (wpsg_isSizedArray($arLanguages) && sizeof($arLanguages) > 1)
-                {
-
-                    if (function_exists('icl_object_id')) //if (is_plugin_active('sitepress-multilingual-cms/sitepress.php'))
-                    {
-
-                        // WPML speichert in extra Post, hier nichts machen
-                        $post_title = $product['name'];
-                        $post_content = $this->renderProdukt($product_id);
-
-                    }
-                    else
-                    {
-
-                        // Fallback fÃŒr qTranslate => Alle Sprachen in einen Post
-
-                        $post_title = '';
-                        $post_content = '';
-
-                        // Titel der Ãbersetzten Produkte heraussuchen
-                        foreach ($arLanguages as $l)
-                        {
-
-                            $produkt_trans = $this->db->fetchRow("SELECT `id`, `name` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_code` = '".wpsg_q($l['lang'])."' AND `lang_parent` = '".wpsg_q($product_id)."'");
-
-                            if ($produkt_trans['id'] > 0) // Ãbersetzung existiert					{
-                            {
-
-                                $post_title .= '<!--:'.$l['lang'].'-->'.$produkt_trans['name'].'<!--:-->';
-                                $post_content .= '<!--:'.$l['lang'].'-->'.$this->renderProdukt($product_id, false, $l['locale']).'<!--:-->';
-
-                            }
-                            else // Ãbersetzung existiert nicht, hier trage ich einfach den Originaltext ein
-                            {
-
-                                $post_title .= '<!--:'.$l['lang'].'-->'.$product['name'].'<!--:-->';
-                                $post_content .= '<!--:'.$l['lang'].'-->'.$this->renderProdukt($product_id).'<!--:-->';
-
-                            }
-
-                        }
-
-                    }
-
-                }
-                else
-                {
-
-                    $post_title = $product['name'];
-                    $post_content = $this->renderProdukt($product_id);
-
-                }
-
-                $post_content = $this->clear_post_content($post_content);
-
-                $data = array(
-                    "post_title" => wpsg_q($post_title),
-                    'post_author' => $current_user->ID,
-                    'post_status' => (($product['disabled'] === '1')?'private':'publish'),
-                    'post_content' => wpsg_q($post_content),
-                    "post_type" => wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey')),
-                    "wpsg_produkt_id" => wpsg_q($product_id),
-                    "post_modified" => "NOW()",
-                    "post_modified_gmt" => "NOW()"
-                );
-
-                if ($comment_status !== false) $data['comment_status'] = wpsg_q(((wpsg_isSizedInt($comment_status))?'open':'closed'));
-                if ($menu_order !== false) $data['menu_order'] = $menu_order;
-                if ($disabled !== false)
-                {
-
-                    if ($disabled === '1') $data['post_status'] = 'draft';
-                    else $data['post_status'] = 'publish';
-
-                }
-    
-                if ($post_id <= 0)
-                {
-    
-                    $data['post_date'] = $product['cdate'];
-                    $post_id = $this->db->ImportQuery($this->shop->prefix.'posts', $data);
-    
-                }
-                else
-                {
-    
-                    $this->db->UpdateQuery($this->shop->prefix.'posts', $data, "`id` = '".wpsg_q($post_id)."'");
-    
-                }
-    
-                if ($path !== false)
-                {
-    
-                    if (!wpsg_isSizedString($path)) $path = $product['name'];
-    
-                    // Pathkey
-                    $data = array();
-                    $data['post_name'] = wpsg_q($this->shop->clear($path, $post_id));
-                    $this->db->UpdateQuery($this->shop->prefix.'posts', $data, "`id` = '".wpsg_q($post_id)."'");
-    
-                }
-    
-                // Kategorie speichern
-                if (!wpsg_isSizedString($_REQUEST['wpsg_lang']) && !wpsg_isSizedString($_REQUEST['do'], 'rebuild')) {
-    
-                    // Die Kategorie darf nur beim speichern in der Originalsprache gesetzt werden!
-    
-                    // Alte Zuordnung lÃ¶schen
-                    $this->db->Query("DELETE FROM `".$this->shop->prefix."term_relationships` WHERE `object_id` = '".wpsg_q($post_id)."'");
-
-                    // Neue Zuordnung speichern
-                    if (wpsg_isSizedArray($_REQUEST['tax_input'][$this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat')]))
-                    {
-
-                        foreach ($_REQUEST['tax_input'][$this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat')] as $c)
-                        {
-    
-                            $term_taxonomy_id = $this->db->fetchOne("SELECT `term_taxonomy_id` FROM `".$this->shop->prefix."term_taxonomy` WHERE `term_id` = '".wpsg_q($c)."'");
-    
-                            $this->db->ImportQuery($this->shop->prefix.'term_relationships', array(
-                                'object_id' => wpsg_q($post_id),
-                                'term_taxonomy_id' => wpsg_q($term_taxonomy_id),
-                                'term_order' => '0'
-                            ));
-    
-                            $count = $this->db->fetchOne("SELECT COUNT(*) FROM `".$this->shop->prefix."term_relationships` WHERE `term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
-    
-                            $this->db->UpdateQuery($this->shop->prefix."term_taxonomy", array(
-                                'count' => wpsg_q($count)
-                            ), "`term_taxonomy_id` = '".wpsg_q($term_taxonomy_id)."'");
-    
-                        }
-    
-                    }
-    
-                    $this->updateTaxonomieCount();
-    
-                }
-    
-                $this->updatePostThumbnail($product_id);
-    
-                flush_rewrite_rules();
-    
-                return $post_id;
-    
-            }
-    
-        } // private function getPostIdFromProductId($product_id)
-    
-        private function clear_post_content($post_content)
-        {
-    
-            return strip_tags(preg_replace('#<script(.*?)>(.*?)</script>#is', '', $post_content));
-    
-        } // private function clear_post_content($post_content)
-    
-        /**
-         * FÃŒgt die Abfrage fÃŒr den PostType an den Wordpress Query
-         */
-        private function setPostType($query)
-        {
-    
-            $post_type = $query->get('post_type');
-    
-            if ($post_type == '' || !wpsg_isSizedArray($post_type))
-            {
-    
-                $postType = array(
-                    'post',
-                    'page',
-                    'attachment',
-                    $this->shop->get_option('wpsg_mod_produktartikel_pathkey')
-                );
-    
-                if (is_string($post_type) && strlen($post_type) > 0)
-                {
-                    $postType[] = $post_type;
-                }
-    
-                $query->set('post_type', $postType);
-    
-            }
-            else
-            {
-    
-                $post_type[] = $this->shop->get_option('wpsg_mod_produktartikel_pathkey');
-    
-                $query->set('post_type', $post_type);
-    
-            }
-    
-        } // private function setPostType($query)
-    
-        /**
-         * Gibt einen Array mit Kategorien zurÃŒck
-         */
-        public function getCategorySelectArray($ref = 0, $ebene = 0, &$arReturn = array()) {
-    
-            global $wpdb;
-    
-            $arCat = $this->db->fetchAssoc("
-                    SELECT
-                        T.`term_id`, T.`name`
-                    FROM
-                        `".$this->shop->prefix."term_taxonomy` AS TT
-                            LEFT JOIN `".$this->shop->prefix."terms` AS T ON (T.`term_id` = TT.`term_id`)
-                    WHERE
-                        TT.`parent` = '".wpsg_q($ref)."' AND
-                        TT.`taxonomy` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))."' AND
-                        T.`term_id` > 0
-                    ORDER BY
-                        T.`name` ASC
-                ");
-    
-            foreach ($arCat as $c)
-            {
-    
-                $cat_name = '';
-                for ($i = 0; $i < $ebene; $i ++) $cat_name .= '-';
-                $cat_name .= $c['name'];
-    
-                $arReturn[$c['term_id']] = $cat_name;
-    
-                $this->getCategorySelectArray($c['term_id'], $ebene + 1, $arReturn);
-    
-            }
-    
-            return $arReturn;
-    
-        } // public function getCategorySelectArray($ref = 0)
-    
-        /**
-         * Gibt einen Array mit KategorieIDs die unter einer Kategorie liegen zurÃŒck
-         */
-        public function getSubCategoryID($child_of = 0)
-        {
-    
-            $arCat = get_categories(array(
-                'taxonomy' => $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'),
-                'child_of' => $child_of,
-                'hide_empty' => true,
-                'hierarchical' => true,
-                'fields' => 'ids'
-            ));
-    
-            $arCat[] = $child_of;
-    
-            return $arCat;
-    
-        } // public function getSubCategoryID($parent = 0)
-    
-        /**
-         * Gibt einen Array mit Kategorien unterhalb zurÃŒck
-         */
-        public function getSubCategory($parent = 0)
-        {
-    
-            $arCat = get_categories(array(
-                'taxonomy' => $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'),
-                'parent' => $parent,
-                'hide_empty' => true
-            ));
-    
-            return $arCat;
-    
-        } // public function getSubCategory($parent = 0)
-    
-        /**
-         * Gibt einen Array mit Kategorien zurÃŒck
-         */
-        public function getProductcategorySelect0($ref = 0, $ebene = 0, &$arReturn = array())
-        {
-    
-            global $wpdb;
-    
-            $arCat = $this->db->fetchAssoc("
-                    SELECT
-                        T.`term_id`, T.`name`, TT.`parent`, TT.`count`
-                    FROM
-                        `".$this->shop->prefix."term_taxonomy` AS TT
-                            LEFT JOIN `".$this->shop->prefix."terms` AS T ON (T.`term_id` = TT.`term_id`)
-                    WHERE
-                        TT.`parent` = '".wpsg_q($ref)."' AND
-                        TT.`taxonomy` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))."' AND
-                        T.`term_id` > 0
-                    ORDER BY
-                        T.`name` ASC
-                ");
-    
-            foreach ($arCat as $c)
-            {
-    
-                $cat_name = '';
-                for ($i = 0; $i < $ebene; $i ++) $cat_name .= '-';
-                $cat_name .= $c['name'];
-    
-                //$arReturn[$c['term_id']] = $cat_name;
-                $label = $c['name'].' ('.$c['count'].')';
-                $arReturn[] = array('term_id' => $c['term_id'],
-                    'name' => $c['name'],
-                    'label' => $label,
-                    'cat_name' => $cat_name,
-                    'parent' => $c['parent'],
-                    'count' => $c['count']
-                );
-    
-                $this->getProductcategorySelect($c['term_id'], $ebene + 1, $arReturn);
-    
-            }
-    
-            return $arReturn;
-    
-        } // public function getProductcategorySelect($ref = 0)
+			foreach ($arCat as $c)
+			{
+
+				$cat_name = '';				
+				for ($i = 0; $i < $ebene; $i ++) $cat_name .= '-';				
+				$cat_name .= $c['name'];
+				
+				$arReturn[$c['term_id']] = $cat_name;
+				
+				$this->getCategorySelectArray($c['term_id'], $ebene + 1, $arReturn);
+				
+			}
+			
+			return $arReturn;
+			
+		} // public function getCategorySelectArray($ref = 0)
 	
-		public function getProductcategorySelect($arProductFilter = array(), $productCountinLabel = true) {
-		
-			if (wpsg_isSizedArray($arProductFilter)) {
-			
-				unset($arProductFilter['limit']);
-				unset($arProductFilter['page']);
-				unset($arProductFilter['status']);
-				unset($arProductFilter['productgroup_ids']);
-				unset($arProductFilter['productcategory_ids']);
-			
-				$arProductFilter['loadCat'] = false;
-				
-				list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = wpsg_product::getQueryParts($arProductFilter);
-			
-				$strQuery = "
-                    SELECT 
-						T.`term_id`, T.`name`, P.`name` AS pname, TR.`term_taxonomy_id`,
-						COUNT( T.`term_id` ) AS anzahl
-					FROM 
-						`".$GLOBALS['wpsg_sc']->prefix."terms` AS T, 
-						`".$GLOBALS['wpsg_sc']->prefix."term_taxonomy` AS TT,
-                        `".$GLOBALS['wpsg_sc']->prefix."term_relationships` AS TR, 
-                        `".$GLOBALS['wpsg_sc']->prefix."posts` AS PO, 
-                        `".WPSG_TBL_PRODUCTS."` AS P
-                    WHERE
-                        T.`term_id` = TT.`term_id` AND 
-                        TT.`term_taxonomy_id` = TR.`term_taxonomy_id` AND 
-                        TR.`object_id` = PO.`ID` AND
-                        TT.`taxonomy` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))."' AND
-                        PO.`wpsg_produkt_id` = P.`id` ".$strQueryWHERE."
-                    GROUP BY 
-                        T.`term_id`, T.`name`
-                ";
-			
-				// wpsg_debug($strQuery);
-				
-				$temp = $GLOBALS['wpsg_db']->fetchAssoc($strQuery);
-				
-				foreach ($temp AS &$v) {
-					
-					$v['label'] = $v['name'];
-				
-					if ($productCountinLabel) $v['label'] .= ' ('.$v['anzahl'].')';
-					
-				}
-				
-				return $temp;
-			
-			
-				//return $GLOBALS['wpsg_db']->fetchAssocField($strQuery, "id", "name");
-			
-			}
-			else
-			{
-			
-				$strQuery = "
-    SELECT `wp_terms`.`term_id`, `wp_terms`.`name`, `wp_wpsg_products`.`name` AS pname,
-    COUNT( `wp_terms`.`term_id` ) AS anzahl
-    FROM `wp_terms`, `wp_term_taxonomy`, `wp_term_relationships`, `wp_posts`, `wp_wpsg_products`
-    WHERE `wp_terms`.`term_id` = `wp_term_taxonomy`.`term_id` AND
-    `wp_term_taxonomy`.`taxonomy` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))."' AND
-    `wp_term_taxonomy`.`term_taxonomy_id` = `wp_term_relationships`.`term_taxonomy_id` AND
-    `wp_term_relationships`.`object_id` = `wp_posts`.`ID` AND
-    `wp_posts`.`wpsg_produkt_id` = `wp_wpsg_products`.`id` GROUP BY `wp_terms`.`term_id`, `wp_terms`.`name`
-                    ";
-			
-				$temp = $GLOBALS['wpsg_db']->fetchAssoc($strQuery);
-				foreach ($temp AS &$v)
-					$v['label'] = $v['name'].' ('.$v['anzahl'].')';
-				return $temp;
-			}
-		
-		} // public function getProductcategorySelect()
-    
-    } // class wpsg_mod_produktartikel extends wpsg_mod_basic
-
+	} // class wpsg_mod_produktartikel extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_produktattribute.class.php
===================================================================
--- /mods/wpsg_mod_produktattribute.class.php	(revision 8528)
+++ /mods/wpsg_mod_produktattribute.class.php	(revision 5261)
@@ -1,5 +1,3 @@
 <?php
-
-    use \wpsg\m1;
 
 	/**
@@ -7,14 +5,12 @@
 	 * Diese kÃ¶nnen dann im Produkttemplate angezeigt werden
 	 */
-	class wpsg_mod_produktattribute extends wpsg_mod_basic {
-
-        /** @var array $arTypen */
-        public $arTypen = [];
-
+	class wpsg_mod_produktattribute extends wpsg_mod_basic
+	{
+	
 		var $id = 85;
 		var $lizenz = 1;
-		var $inline = false;
+		var $inline = true;
 		var $hilfeURL = 'http://wpshopgermany.de/?p=335';
-
+	
 		/**
 		 * Costructor
@@ -22,548 +18,385 @@
 		public function __construct()
 		{
-
+				
 			parent::__construct();
-
+				
 			$this->name = __('Produktattribute', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('Erlaubt es Produktattribute zu erstellen, die dann in der Produktverwaltung ausgefÃŒllt und im Frontend angezeigt werden.', 'wpsg');
-
-			$this->arTypen = array(
-					'0' => __('Textfeld', 'wpsg'),
-					'1' => __('Textfeld (RTE)', 'wpsg'),
-					'2' => __('Auswahlfeld', 'wpsg'),
-					'3' => __('Checkbox', 'wpsg')
-			);
-
+	
 		} // public function __construct()
-
+	
 		public function install()
 		{
-
+	
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
+	
 			/**
 			 * Tabelle fÃŒr die Produktattribute
 			 */
 			$sql = "CREATE TABLE ".WPSG_TBL_AT." (
-		        id mediumint(9) NOT NULL AUTO_INCREMENT,
-		        name varchar(100) NOT NULL,
-		        typ varchar(100) NOT NULL,
-		        auswahl varchar(1000) NOT NULL,
-		        autoshow int(1) NOT NULL,
-				pos int(11) NOT NULL,
-		        PRIMARY KEY  (id)
-		    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+			   		id mediumint(9) NOT NULL AUTO_INCREMENT,
+			   		name varchar(100) NOT NULL,
+			   		typ varchar(100) NOT NULL, 
+			   		auswahl varchar(1000) NOT NULL,  	
+			   		autoshow int(1) NOT NULL,	
+			   		PRIMARY KEY  (id)
+			   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			 
 			dbDelta($sql);
-
+ 
 			/**
 			 * Tabelle fÃŒr die Werte der Produktattribute
 			 */
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS_AT." (
-				id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
-				p_id mediumint(9) NOT NULL,
-				a_id mediumint(9) NOT NULL,
-				value TEXT NOT NULL,
-				PRIMARY KEY  (id),
-				KEY p_id (p_id),
-				KEY a_id (a_id)
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+			   		p_id mediumint(9) NOT NULL,
+			   		a_id mediumint(9) NOT NULL,
+			   		value TEXT NOT NULL,
+			   		KEY p_id (p_id),
+			   		KEY a_id (a_id)
+			   	) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
+	
 			dbDelta($sql);
-
+				
 		} // public function install()
-
+	
 		public function be_ajax()
 		{
-
-			$this->shop->mod = $this;
-
+				
 			if ($_REQUEST['do'] == 'add')
 			{
-
+	
 				$new_name = __('Anklicken um Bezeichnung zu Ã€ndern ...', 'wpsg');
-
+	
 				$at_id = $this->db->ImportQuery(WPSG_TBL_AT, array(
 					'name' => wpsg_q($new_name),
 					'typ' => 0
 				));
-
+	
 				$this->shop->addTranslationString('wpsg_mod_produktattribute_'.$at_id, $new_name);
-
+	
 				$this->pa_listAction(); die();
-
-			}
-			else if ($_REQUEST['do'] == 'reorder')
-			{
-
-				parse_str($_REQUEST['wpsg_reorder'], $wpsg_reorder);
-
-				foreach ((array)$wpsg_reorder['pab'] as $pos => $pa_id)
-				{
-
-					$this->db->UpdateQuery(WPSG_TBL_AT, array(
-						'pos' => wpsg_q($pos)
-					), " `id` = '".wpsg_q($pa_id)."' ");
-
-				}
-
-				die("1");
-
+	
 			}
 			else if ($_REQUEST['do'] == 'genPACode')
 			{
-
+	
 				$this->shop->view['id'] = $_REQUEST['pa_id'];
 				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/genPACode.phtml');
 				die();
-
+	
 			}
 			else if ($_REQUEST['do'] == 'inlinedit')
 			{
-
+	
 				if ($_REQUEST['field'] == 'name')
 				{
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-					$_REQUEST['pa_id'] = wpsg_sinput("key", $_REQUEST['pa_id']);
-
+	
 					$this->db->UpdateQuery(WPSG_TBL_AT, array(
 						'name' => wpsg_q($_REQUEST['value'])
 					), "`id` = '".wpsg_q($_REQUEST['pa_id'])."'");
-
+						
 					$this->shop->addTranslationString('wpsg_mod_produktattribute_'.$_REQUEST['pa_id'], $_REQUEST['value']);
-
-					die($_REQUEST['value']);
-
+						
+					die(stripslashes($_REQUEST['value']));
+						
 				}
 				else if ($_REQUEST['field'] == 'show')
 				{
-
+					
 					$this->db->UpdateQuery(WPSG_TBL_AT, array(
 						'autoshow' => wpsg_q($_REQUEST['value'])
-					), "`id` = '".wpsg_q($_REQUEST['pa_id'])."'");
-
+					), "`id` = '".wpsg_q($_REQUEST['pa_id'])."'");					
+					
 					die("1");
-
+					
 				}
 				else if ($_REQUEST['field'] == 'typ')
 				{
-
+					
 					$this->db->UpdateQuery(WPSG_TBL_AT, array(
 						'typ' => wpsg_q($_REQUEST['value'])
 					), "`id` = '".wpsg_q($_REQUEST['pa_id'])."'");
-
-					//die("1");
-					$value = $this->arTypen[$_REQUEST['value']];
-					die($value);
-
+					
+					die("1");
+					
 				}
 				else if ($_REQUEST['field'] == 'delete')
 				{
-
+					
 					$this->db->Query("DELETE FROM `".WPSG_TBL_AT."` WHERE `id` = '".wpsg_q($_REQUEST['pa_id'])."'");
-
+					
 					die($this->pa_listAction());
-
+					
 				}
 				else if ($_REQUEST['field'] == 'auswahl')
 				{
-
+						
 					$this->db->UpdateQuery(WPSG_TBL_AT, array(
 						'auswahl' => wpsg_q($_REQUEST['value'])
 					), "`id` = '".wpsg_q($_REQUEST['pa_id'])."'");
+						
+					$this->shop->addTranslationString('wpsg_mod_produktattribute_'.$_REQUEST['pa_id'], $_REQUEST['value']);
+						
+					die(stripslashes($_REQUEST['value']));
+						
+				}
+	
+			}
+	
+		} // public function be_ajax()
+	
+		public function settings_edit()
+		{
+				
+			$this->shop->mod = &$this;
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/settings_edit.phtml');
+				
+		} // public function settings_edit()
+	
+		public function settings_save()
+		{
+				 
+				
+		} // public function settings_save()
+	 
+		public function produkt_save(&$produkt_id)
+		{
+			 
+			foreach ((array)$_REQUEST as $pa_id => $pa_value)
+			{
 
-					$this->shop->addTranslationString('wpsg_mod_produktattribute_'.$_REQUEST['pa_id'], $_REQUEST['value']);
-
-					die(stripslashes($_REQUEST['value']));
-
-				}
-
-			}
-
-		} // public function be_ajax()
-
-		public function settings_edit()
-		{
-
-			//$this->shop->mod = &$this;
-			$this->shop->mod = $this;
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/settings_edit.phtml');
-
-		} // public function settings_edit()
-
-		public function settings_save()
-		{
-			
-		    $this->shop->update_option('wpsg_mod_produktattribute_showProduct', $_REQUEST['wpsg_mod_produktattribute_showProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_produktattribute_showBasket', $_REQUEST['wpsg_mod_produktattribute_showBasket'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_produktattribute_showOverview', $_REQUEST['wpsg_mod_produktattribute_showOverview'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_produktattribute_showMail', $_REQUEST['wpsg_mod_produktattribute_showMail'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-		} // public function settings_save()
-
-		public function produkt_save(&$produkt_id) {
-
-			foreach ((array)$_REQUEST as $pa_id => $pa_value) {
-
-				$field_label = $pa_id;
-				
-				try {
-				
-					// Musste ich so abÃ€ndern, da der RTE keine namen Felder vom Typ pa[name] erlaubt.
-					if (preg_match('/^pa_/', $pa_id)) {
-	
-						$pa_id_clear = intval(substr($pa_id, 3));
-						
-						if (!wpsg_checkInput($pa_id_clear, WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-						
-						$pa = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_AT."` WHERE `id` = '".wpsg_q($pa_id_clear)."' ORDER BY `pos` ASC, `id` ASC ");
-	
-						if (!wpsg_checkInput($pa['id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getInvalidValueException();
-						
-						$field_label = __($pa['name'], 'wpsg');
-						
-						$nExists = $this->db->fetchOne("
-							SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `a_id` = '".wpsg_q($pa_id_clear)."' AND `p_id` = '".wpsg_q($produkt_id)."'
-						");
-												
-						if ($pa['typ'] === '0') {
-						
-							if (!wpsg_checkInput($pa_value, WPSG_SANITIZE_TEXTAREA)) throw \wpsg\Exception::getSanitizeException();
-								
-						} else if ($pa['typ'] === '1') {
+				// Musste ich so abÃ€ndern, da der RTE keine namen Felder vom Typ pa[name] erlaubt.
+				if (preg_match('/^pa_/', $pa_id))
+				{
+					
+					$pa_id = substr($pa_id, 3);
+										
+					$nExists = $this->db->fetchOne("
+						SELECT COUNT(*) FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `a_id` = '".wpsg_q($pa_id)."' AND `p_id` = '".wpsg_q($produkt_id)."' 
+					");
+		
+					$pa = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_AT."` WHERE `id` = '".wpsg_q($pa_id)."'");
+					
+					if ($pa['typ'] == 1 && $this->shop->get_option('wpsg_options_nl2br') == '1') $pa_value = nl2br($pa_value);
+					
+					if ($nExists > 0)
+					{
 							
-							if (!wpsg_checkInput($pa_value, WPSG_SANITIZE_HTML)) throw \wpsg\Exception::getSanitizeException();
+						$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_AT, array(
+							'value' => wpsg_q($pa_value)
+						), "`a_id` = '".wpsg_q($pa_id)."' AND `p_id` = '".wpsg_q($produkt_id)."' ");
 							
-							if ($this->shop->get_option('wpsg_options_nl2br') == '1') {
-								
-								$pa_value = nl2br($pa_value);
-								
-							}
+					}
+					else
+					{
 							
-						} else if ($pa['typ'] === '2') {
+						$this->db->ImportQuery(WPSG_TBL_PRODUCTS_AT, array(
+							'value' => wpsg_q($pa_value),
+							'a_id' => wpsg_q($pa_id),
+							'p_id' => wpsg_q($produkt_id)
+						));
 							
-							$arSelect = explode('|', $pa['auswahl']);
-							
-							if (!wpsg_checkInput($pa_value, WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-							if (!array_key_exists(intval($pa_value), $arSelect)) throw new \Exception(__('UngÃŒltige Auswahl', 'wpsg'));
-													
-						} else if ($pa['typ'] === '3') {
-							
-							if (!wpsg_checkInput($pa_value, WPSG_SANITIZE_CHECKBOX)) throw \wpsg\Exception::getSanitizeException();
-							
-						} else throw \wpsg\Exception::getInvalidValueException();
-	
-						if ($nExists > 0) {
-	
-							$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_AT, array(
-								'value' => wpsg_q($pa_value)
-							), "`a_id` = '".wpsg_q($pa_id_clear)."' AND `p_id` = '".wpsg_q($produkt_id)."' ");
-	
-						} else {
-	
-							$this->db->ImportQuery(WPSG_TBL_PRODUCTS_AT, array(
-								'value' => wpsg_q($pa_value),
-								'a_id' => wpsg_q($pa_id_clear),
-								'p_id' => wpsg_q($produkt_id)
-							));
-	
-						}
-	
 					}
-					
-				} catch (\Exception $e) {
-					
-					wpsg_ShopController::getShop()->addInputFieldError($pa_id, $field_label);
-										
-				}
-
-			}
-
+	
+				}
+					
+			}
+	
 		} // public function produkt_save(&$produkt_id)
-
+	
 		public function produkt_save_translation(&$produkt_id, &$trans_id)
 		{
-
+			
 			$this->produkt_save($trans_id);
-
+			
 		} // public function produkt_save_translation(&$produkt_id, &$trans_id)
-
-		public function produkt_createTranslation(&$produkt_id, &$trans_id) {
-
+		
+		public function produkt_createTranslation(&$produkt_id, &$trans_id)
+		{
+			
 			$arAttributeValues = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `p_id` = '".wpsg_q($produkt_id)."'");
-
-			foreach ($arAttributeValues as $a) {
-
-				unset($a['id']);
+			
+			foreach ($arAttributeValues as $a)
+			{
 				
 				$a['p_id'] = $trans_id;
-
+				
 				$this->db->ImportQuery(WPSG_TBL_PRODUCTS_AT, $a);
-
-			}
-
+				
+			}
+			
 		} // public function produkt_createTranslation(&$produkt_id, &$trans_id)
-
-		public function produkt_copy(&$produkt_id, &$copy_id) {
-
+		
+		public function produkt_copy(&$produkt_id, &$copy_id) { 
+			
 			// Wie bei der erstellung einer neuen Ãbersetzung ...
 			$this->produkt_createTranslation($produkt_id, $copy_id);
-
+			
 		} // public function produkt_copy(&$produkt_id, &$copy_id)
-
-		public function product_addedit_content(&$product_content, &$product_data)
+		
+		public function produkt_edit_content(&$produkt_data)
 		{
 
 			// Nur fÃŒr angelegte Produkte
-			if ($product_data['id'] <= 0) return false;
-
-			$this->shop->view['data'] = $product_data;
-			$this->shop->view['data']['pa'] = $this->shop->callMod('wpsg_mod_produktattribute', 'getProductAttributeByProductId', array($this->shop->getProduktID($product_data['id'])));
-
-			$this->shop->view['wpsg_mod_produktattribute']['data'] = $product_data;
-
-			$product_content['wpsg_mod_produktattribute'] = array(
-				'title' => __('Produktattribute', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/produkt_addedit_content.phtml', false)
-			);
-
-		} //public function product_addedit_content(&$product_content, &$product_data)
-
-		public function product_bottom(&$produkt_key, $template_index) {
-
-			if ($this->shop->get_option('wpsg_mod_produktattribute_showProduct') == '1') {
-
-                $produkt_id = $this->shop->getProduktID($produkt_key);
-
-				$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssoc("
-					SELECT
-						PAT.`value`,
-						AT.`id`,
-						AT.`auswahl`,
-						AT.`typ`,
-						AT.`autoshow`,
-						AT.`name`
-					FROM
-						`".WPSG_TBL_PRODUCTS_AT."` AS PAT
-							LEFT JOIN  `".WPSG_TBL_AT."` AS AT ON (PAT.`a_id` = AT.`id`)
-					WHERE
-						PAT.`p_id` = '".wpsg_q($produkt_id)."'
-					ORDER BY
-						AT.`pos` ASC, AT.`id` ASC
-				");
-	
-				if (wpsg_isSizedArray($this->shop->view['wpsg_mod_produktattribute']['data']))
-				{
-	
-					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/produkt_bottom.phtml');
-	
-				}
-			}
-		} // public function product_bottom(&$produkt_id, $template_index)
-
-		public function basket_row(&$p, $i)
-		{
-			if ($this->shop->get_option('wpsg_mod_produktattribute_showBasket') == '1')
-			{
-				
-				$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssocField("
-					SELECT
-						AT.`id`
-					FROM
-						`".WPSG_TBL_AT."` AS AT
-					WHERE
-						AT.`autoshow` = '1'
-					ORDER BY
-						AT.`pos` ASC, AT.`id` ASC
-				");
-	
-				$this->shop->view['wpsg_mod_produktattribute']['id'] = $this->shop->getProduktID($p['id']);
-				$this->shop->view['i'] = $i;
-	
-				return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/basket_row.phtml');
-
-			}
-		} // public function basket_row(&$p, $i)
-
-		public function overview_row(&$p, $i)
-		{
-			if ($this->shop->get_option('wpsg_mod_produktattribute_showOverview') == '1')
-			{
-				
-				$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssocField("
-					SELECT
-						AT.`id`
-					FROM
-						`".WPSG_TBL_AT."` AS AT
-					WHERE
-						AT.`autoshow` = '1'
-					ORDER BY
-						AT.`pos` ASC, AT.`id` ASC
-				");
-	
-				$this->shop->view['wpsg_mod_produktattribute']['id'] = $this->shop->getProduktID($p['id']);
-				$this->shop->view['i'] = $i;
-	
-				return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/overview_row.phtml');
-			}
-		} // public function overview_row(&$p, $i)
-
-		public function mail_row($i, $p)
-		{
-			if ($this->shop->get_option('wpsg_mod_produktattribute_showMail') == '1')
-			{
-				
-				$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssocField("
-					SELECT
-						`id`
-					FROM
-						`".WPSG_TBL_AT."`
-					WHERE
-						`autoshow` = '1'
-					ORDER BY
-						`pos` ASC, `id` ASC
-				");
-	
-				$this->shop->view['wpsg_mod_produktattribute']['id'] = $this->shop->getProduktID($p['id']);
-				$this->shop->view['i'] = $i;
-	
-				if ($this->shop->htmlMail === true)
-				{
-	
-					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/mail_row_html.phtml');
-	
-				}
-				else
-				{
-	
-					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/mail_row.phtml');
-	
-				}
-				
-			}
-		} // public function mail_row($i, $p)
-
-		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false)
-		{
-
-			if ($product_id !== false && $product_id > 0)
-			{
-
-				$arAttribute = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_AT."` ORDER BY `pos` ASC, `id` ASC ");
-
-				foreach ((array)$arAttribute as $pa_id)
-				{
-
-					$arReplace['/%at_'.$pa_id.'%/'] = $this->getAttributeValue($product_id, $pa_id);
-
-				}
-
-			}
-
-		} // public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false)
-
-		public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend)
-		{
-
-			if ($produkt_key == false) return false;
-			$product_id = $this->shop->getProduktID($produkt_key);
-
-			if ($product_id !== false && $product_id > 0)
-			{
-
-				$arAttribute = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_AT."` ORDER BY `pos` ASC, `id` ASC ");
-
-				foreach ((array)$arAttribute as $pa_id)
-				{
-
-					$arSend['at_'.$pa_id] = $this->getAttributeValue($product_id, $pa_id);
-
-				}
-
-			}
-
-		} // public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend)
-
-		/* Modulfunktionen */
-
-		/**
-		 * Gibt alle MÃ¶glichen Werte fÃŒr ein Attribut zurÃŒck
-		 */
-		public function getAttributValues($attribute_id, $arProductFilter = array())
-		{
-
-			$strQueryWHERE = " AND AT.`a_id` = '".wpsg_q($attribute_id)."' ";
-			$strQueryHAVING = "";
-			$strQueryJOIN = " LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = AT.`p_id`) ";
-
-			list($strQueryP_SELECT, $strQueryP_WHERE, $strQueryP_JOIN, $strQueryP_HAVING, $strQueryP_ORDER) = wpsg_product::getQueryParts($arProductFilter);
-
-			$strQueryJOIN .= $strQueryP_JOIN;
-			$strQueryWHERE .= $strQueryP_WHERE;
-			$strQueryHAVING .= $strQueryP_HAVING;
-
-			$strQuery = "
-				SELECT
-					DISTINCT AT.`value`
-				FROM
-				 	`".WPSG_TBL_PRODUCTS_AT."` AS AT
-				 		".$strQueryJOIN."
-				WHERE
-				 	1
-					".$strQueryWHERE."
-				HAVING
-					1
-					".$strQueryHAVING."
-			";
-
-			return $this->db->fetchAssocField($strQuery);
-
-		} // public function getAttributValues($attribute_id, $arProductFilter = array())
-
-		/**
-		 * Gibt alle Produktattribute zurÃŒck
-		 */
-		public function getProductattributs()
-		{
-
-			$arReturn = $this->db->fetchAssoc("
-				SELECT
-					A.*
-				FROM
-					`".WPSG_TBL_AT."` AS A
-				WHERE
-					1
-			", "id");
-
-			foreach ($arReturn as $k => $v)
-			{
-
-				if ($v['typ'] === '2') $arReturn[$k]['auswahl'] = wpsg_trim(explode('|', $v['auswahl']));
-
-			}
-
-			// TODO: Ãbersetzung
-
-			return $arReturn;
-
-		} // public function getProductattributs()
-
-		public function getProductAttributeByProductId($product_id)
-		{
-
-			return $this->db->fetchAssoc("
+			if ($produkt_data['id'] <= 0) return false;
+			 			
+			$this->shop->view['data'] = $produkt_data;
+			$this->shop->view['data']['pa'] = $this->db->fetchAssoc("
 				SELECT
 					A.`id`, A.`name`, A.`typ`, PA.`value`, A.`auswahl`
 				FROM
 					`".WPSG_TBL_AT."` AS A
-						LEFT JOIN `".WPSG_TBL_PRODUCTS_AT."` AS PA ON (PA.`a_id` = A.`id` AND PA.`p_id` = '".wpsg_q($product_id)."')
-				ORDER BY
-					A.`pos` ASC, A.`id` ASC
+						LEFT JOIN `".WPSG_TBL_PRODUCTS_AT."` AS PA ON (PA.`a_id` = A.`id` AND PA.`p_id` = '".wpsg_q($produkt_data['id'])."')				  			
+			"); 
+				
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/produkt_edit_content.phtml');
+				
+		} // public function produkt_edit_content(&$produkt_data)
+	
+		public function product_bottom(&$produkt_id, $template_index) 
+		{ 
+			
+			$p_id = $produkt_id;
+			
+			if ($this->shop->isOtherLang())
+			{
+					
+				$produkt_trans_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($p_id)."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
+					
+				if (wpsg_isSizedInt($produkt_trans_id)) $p_id = $produkt_trans_id;
+ 			
+			}
+
+			$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssoc("
+				SELECT
+					PAT.`value`,
+					AT.`typ`,
+					AT.`autoshow`,
+					AT.`name`
+				FROM
+					`".WPSG_TBL_PRODUCTS_AT."` AS PAT 
+						LEFT JOIN  `".WPSG_TBL_AT."` AS AT ON (PAT.`a_id` = AT.`id`)
+				WHERE 
+					PAT.`p_id` = '".wpsg_q($p_id)."'
 			");
-
-		} // public function getProductAttributeByProductId($product_id)
-
+			 
+			if (wpsg_isSizedArray($this->shop->view['wpsg_mod_produktattribute']['data']))
+			{
+			
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/produkt_bottom.phtml');
+				
+			}
+			
+		} // public function product_bottom(&$produkt_id, $template_index)
+				
+		public function basket_row(&$p, $i)
+		{
+			
+			$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssocField("
+				SELECT	
+					AT.`id` 
+				FROM 
+					`".WPSG_TBL_AT."` AS AT 
+				WHERE
+					AT.`autoshow` = '1'
+			");
+			
+			$this->shop->view['wpsg_mod_produktattribute']['id'] = $this->shop->getProduktID($p['id']);			
+			$this->shop->view['i'] = $i;
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/basket_row.phtml');
+			
+		} // public function basket_row(&$p, $i)
+		
+		public function overview_row(&$p, $i)
+		{
+				
+			$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssocField("
+				SELECT
+					AT.`id`
+				FROM
+					`".WPSG_TBL_AT."` AS AT
+				WHERE
+					AT.`autoshow` = '1'
+			");
+				
+			$this->shop->view['wpsg_mod_produktattribute']['id'] = $this->shop->getProduktID($p['id']);				
+			$this->shop->view['i'] = $i;
+				
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/overview_row.phtml');
+				
+		} // public function overview_row(&$p, $i)
+		
+		public function mail_row($i, $p)
+		{
+		
+			$this->shop->view['wpsg_mod_produktattribute']['data'] = $this->db->fetchAssocField("
+				SELECT
+					AT.`id`
+				FROM
+					`".WPSG_TBL_AT."` AS AT
+				WHERE
+					AT.`autoshow` = '1'
+			");
+		
+			$this->shop->view['wpsg_mod_produktattribute']['id'] = $this->shop->getProduktID($p['id']);		
+			$this->shop->view['i'] = $i;
+		
+			if ($this->shop->htmlMail === true)
+			{
+					
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/mail_row_html.phtml');
+					
+			}
+			else
+			{
+					
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/mail_row.phtml');
+					
+			} 
+		
+		} // public function mail_row($i, $p)
+		
+		public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false) 
+		{ 
+		
+			if ($product_id !== false && $product_id > 0)
+			{
+			
+				$arAttribute = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_AT."`");
+			
+				foreach ((array)$arAttribute as $pa_id)
+				{
+					
+					$arReplace['/%at_'.$pa_id.'%/'] = $this->getAttributeValue($product_id, $pa_id);
+					
+				}
+				
+			}
+						
+		} // public function replaceUniversalPlatzhalter(&$arReplace, $order_id = false, $kunden_id = false, $rechnung_id = false, $product_id = false, $product_index = false)
+				
+		public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend) 
+		{
+			
+			$product_id = $this->shop->getProduktID($produkt_key);
+			
+			if ($product_id !== false && $product_id > 0)
+			{
+				
+				$arAttribute = $this->db->fetchAssocField("SELECT `id` FROM `".WPSG_TBL_AT."`");
+			
+				foreach ((array)$arAttribute as $pa_id)
+				{
+					
+					$arSend['at_'.$pa_id] = $this->getAttributeValue($product_id, $pa_id);
+					
+				}
+				
+			}
+			
+		} // public function notifyURL(&$url, &$produkt_key, &$menge, &$order_id, &$typ, &$arSend)
+		
 		/**
 		 * Gibt den Namen eines Attributs zurÃŒck
@@ -571,11 +404,11 @@
 		public function getAttributeLabel($pa_id)
 		{
-
+	 
 			$name = $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_AT."` WHERE `id` = '".wpsg_q($pa_id)."'");
-
+				
 			return __($name, 'wpsg');
-
+				
 		} // public function getAttributeLabel($pa_id)
-
+	
 		/**
 		 * Gibt den Wert fÃŒr ein Attribut zurÃŒck
@@ -583,64 +416,54 @@
 		public function getAttributeValue($p_id, $pa_id)
 		{
-
-			$p_id = $this->shop->getProduktId($p_id);
-
+ 		
 			if ($this->shop->isOtherLang())
 			{
-
-				$produkt_trans_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($p_id)."' AND `lang_code` = '".wpsg_q($this->shop->getCurrentLanguageCode())."'");
-
+			
+				$produkt_trans_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($p_id)."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
+					
 				if (wpsg_isSizedInt($produkt_trans_id)) $p_id = $produkt_trans_id;
-
-			}
-
+				
+			}
+ 
 			$pa = $this->db->fetchRow("
-				SELECT
-					PA.`value`, A.`typ`, A.`auswahl`
-				FROM
-					`".WPSG_TBL_PRODUCTS_AT."` AS PA
+				SELECT 
+					PA.`value`, A.`typ`
+				FROM 
+					`".WPSG_TBL_PRODUCTS_AT."` AS PA 
 						LEFT JOIN `".WPSG_TBL_AT."` AS A ON (A.`id` = PA.`a_id`)
-				WHERE
-					PA.`a_id` = '".wpsg_q($pa_id)."' AND
+				WHERE 
+					PA.`a_id` = '".wpsg_q($pa_id)."' AND 
 					PA.`p_id` = '".wpsg_q($p_id)."'
-				ORDER BY
-					A.`pos` ASC, A.`id` ASC
 			");
-
+			 
 			if ($pa['typ'] == '1') /* RTE Feld */
 			{
-
+	
 				// Filter auf Feld anwenden (RTE)
-				// Den wpsgContentFilter deaktivieren um Rekursion zu vermeiden
+				// Den wpsgContentFilter deaktivieren um rekursion zu vermeiden
 				remove_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
 				$value = apply_filters('the_content', $pa['value']);
 				add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
-
+	
 			}
 			else if ($pa['typ'] == '3')
 			{
-
+	
 				// Checkbox
 				if ($pa['value'] == '1') $value = __('Ja', 'wpsg');
 				else $value = __('Nein', 'wpsg');
-
-			}
-			else if ($pa['typ'] == '2')
-			{
-				// Auswahl
-				$arAuswahl = explode('|', $pa['auswahl']);
-				$value = $arAuswahl[$pa['value']];
+	
 			}
 			else
 			{
-
-				// Normales Textfeld
+	
+				// Auswahl oder normales Textfeld
 				$value = $pa['value'];
 			}
-
+				
 			return $value;
-
+				
 		} // public function getAttributeValue($p_id, $pa_id)
-
+	
 		/**
 		 * Zeichnet die Liste der Produktattribute fÃŒr das Backend
@@ -648,18 +471,14 @@
 		public function pa_listAction()
 		{
+	
+			$this->shop->view['data'] = $this->db->fetchAssoc("
+					SELECT * FROM `".WPSG_TBL_AT."` ORDER BY `id` ASC
+				");
+				
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/list.phtml');
+				
+		} // private function pa_listAction()
+	
+	} // class wpsg_mod_produktattribute extends wpsg_mod_basic
 
-			$this->shop->view['data'] = $this->db->fetchAssoc("
-				SELECT * FROM `".WPSG_TBL_AT."` ORDER BY `pos` ASC, `id` ASC
-			");
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktattribute/list.phtml');
-
-		} // private function pa_listAction()
-
-        public function product_deletePermanently($product_id) {
-
-		    $this->db->Query("DELETE FROM `".WPSG_TBL_PRODUCTS_AT."` WHERE `p_id` = '".M1::q($product_id)."' ");
-
-        }
-
-	} // class wpsg_mod_produktattribute extends wpsg_mod_basic
+?>
Index: /mods/wpsg_mod_produktbilder.class.php
===================================================================
--- /mods/wpsg_mod_produktbilder.class.php	(revision 5261)
+++ /mods/wpsg_mod_produktbilder.class.php	(revision 5261)
@@ -0,0 +1,671 @@
+<?php
+
+	/**
+	 * Dieses Modul ist fÃŒr die Ausgabe der Produktbilder zustÃ€ndig
+	 */
+	class wpsg_mod_produktbilder extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 1;
+		var $id = 120;
+		var $hilfeURL = 'http://wpshopgermany.de/?p=530';
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Produktbilder', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht es Bilder zu Produkten anzugeben.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function install() 
+		{ 
+			 
+			if ($this->shop->get_option('wpsg_mod_produktbilder_width') === false || $this->shop->get_option('wpsg_mod_produktbilder_width') == '') $this->shop->update_option('wpsg_mod_produktbilder_width', '150');
+			if ($this->shop->get_option('wpsg_mod_produktbilder_height') === false || $this->shop->get_option('wpsg_mod_produktbilder_height') == '') $this->shop->update_option('wpsg_mod_produktbilder_height', '150');
+			
+			$this->shop->checkDefault('wpsg_mod_produktbilder_mode', 's');
+			$this->shop->checkDefault('wpsg_mod_produktbilder_quality', '75');
+			
+		} // public function install()
+		
+		/**
+		 * 
+		 * Enter description here ...
+		 */
+		function wpsg_enqueue_scripts()
+		{
+			
+			if (is_admin())
+			{
+			
+				wp_enqueue_script('wpsg_ajaxupload', $this->shop->getRessourceURL('js/ajaxupload.js'));
+				
+			}
+				
+		} // function wpsg_enqueue_scripts()
+		
+		public function be_ajax() 
+		{ 
+		
+			if ($_REQUEST['wpsg_mod_produktbilder_clearcache'] == '1')
+			{
+
+				$this->picClearCash();
+				$this->shop->addBackendMessage(__('Bildercache gelÃ¶scht.', 'wpsg')); 
+				
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktbilder');
+				
+			}
+			
+		} // public function be_ajax()
+		
+		public function settings_edit()
+		{
+			 			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_mod_produktbilder_width', $_REQUEST['wpsg_mod_produktbilder_width']);
+			$this->shop->update_option('wpsg_mod_produktbilder_height', $_REQUEST['wpsg_mod_produktbilder_height']);
+			$this->shop->update_option('wpsg_mod_produktbilder_mode', $_REQUEST['wpsg_mod_produktbilder_mode']);
+			if ($_REQUEST['wpsg_mod_produktbilder_quality'] == '') $_REQUEST['wpsg_mod_produktbilder_quality'] = 75;
+				
+			$this->shop->update_option('wpsg_mod_produktbilder_quality', $_REQUEST['wpsg_mod_produktbilder_quality']);
+			
+		} // public function settings_save()
+		
+		public function admin_presentation() 
+		{ 
+
+			echo wpsg_drawForm_Checkbox('wpsg_mod_produktbilder_basketimage', __('Produktbild im Warenkorb anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_produktbilder_basketimage'));
+			echo wpsg_drawForm_Checkbox('wpsg_mod_produktbilder_overviewimage', __('Produktbild in Bestellzusammenfassung anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_produktbilder_overviewimage')); 
+			
+			
+		} // public function admin_presentation()
+		
+		public function admin_presentation_submit() 
+		{ 
+			
+			$this->shop->update_option('wpsg_mod_produktbilder_basketimage', $_REQUEST['wpsg_mod_produktbilder_basketimage']);
+			$this->shop->update_option('wpsg_mod_produktbilder_overviewimage', $_REQUEST['wpsg_mod_produktbilder_overviewimage']);
+			
+		} // public function admin_presentation_submit()
+		 
+		public function picClearCash()
+		{	
+			
+			$handle = opendir($this->getPicPath(''));
+   
+			$strContent = "";
+			$arFiles = array();
+	   		while($filename = readdir($handle))
+	   		{
+	   				
+	   			if (is_dir($this->getPicPath('').$filename) && $filename != "." && $filename != ".." && $filename != '')
+	   			{
+	   				
+	   				if (file_exists($this->getPicPath('').$filename.'/tn/')) wpsg_rrmdir($this->getPicPath('').$filename."/tn/");
+	   				
+	   			}
+	   				   				   				   				   				
+	   		}
+	   		
+		} // public function picClearCash()
+
+		public function produkt_ajax() 
+		{
+			
+			if ($_REQUEST['cmd'] == 'upload')
+			{
+
+				if (file_exists($_FILES['userfile']['tmp_name']))
+				{
+					
+					$uploaddir = $this->getPicPath($_REQUEST['edit_id']);
+					
+					if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
+					if (!file_exists($uploaddir.'tn/')) mkdir($uploaddir.'tn/', 0777, true);
+					
+					$uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
+					
+					move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
+					
+					$uri = $this->makeTn($_REQUEST['edit_id'], $_FILES['userfile']['name'], get_option("wpsg_mod_produktbilder_width"), get_option("wpsg_mod_produktbilder_height"), get_option("wpsg_mod_produktbilder_mode"));
+					
+					if ($this->shop->hasMod('wpsg_mod_produktartikel')) $this->shop->callMod('wpsg_mod_produktartikel', 'updatePostThumbnail', array($_REQUEST['edit_id']));
+					
+					die("1");
+					
+				} 
+				else
+				{
+					
+					die(__('Fehler beim Upload! Datei existiert nicht.', 'wpsg'));
+					
+				}
+				
+			}
+			else if ($_REQUEST['cmd'] == 'remove')
+			{
+								
+				unlink($this->getPicPath($_REQUEST['edit_id']).'/'.$_REQUEST['file']);
+				
+				$this->shop->view['data']['id'] = $_REQUEST['edit_id'];				
+				
+				if ($this->shop->hasMod('wpsg_mod_produktartikel')) $this->shop->callMod('wpsg_mod_produktartikel', 'updatePostThumbnail', array($_REQUEST['edit_id']));
+				
+				die($this->getProduktBilderListe($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'produktbilder_liste')
+			{
+				
+				$this->shop->view['data']['id'] = $_REQUEST['edit_id'];				
+				die($this->getProduktBilderListe($_REQUEST['edit_id']));
+				
+			}
+			
+		} // public function produkt_ajax()
+		
+		public function produkt_save(&$produkt_id) 
+		{ 
+		
+			if (wpsg_isSizedArray($_FILES['wpsg_mod_produktbilder_file']) && file_exists($_FILES['wpsg_mod_produktbilder_file']['tmp_name']))
+			{
+				
+				$uploaddir = $this->getPicPath($produkt_id);
+				
+				if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
+				if (!file_exists($uploaddir.'tn/')) mkdir($uploaddir.'tn/', 0777, true);
+				
+				$uploadfile = $uploaddir.basename($_FILES['wpsg_mod_produktbilder_file']['name']);
+				
+				move_uploaded_file($_FILES['wpsg_mod_produktbilder_file']['tmp_name'], $uploadfile);
+				
+				$uri = $this->makeTn($produkt_id, $_FILES['wpsg_mod_produktbilder_file']['name'], get_option("wpsg_mod_produktbilder_width"), get_option("wpsg_mod_produktbilder_height"), get_option("wpsg_mod_produktbilder_mode"));
+				
+			}
+			
+		} // public function produkt_save(&$produkt_id)
+		
+		public function produkt_edit_content(&$produkt_data) 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			$this->shop->view['data'] = $produkt_data;
+			
+			if ($produkt_data['id'] > 0)
+			{
+
+				$this->shop->view['modul'] = &$this;
+				$this->shop->view['ProduktBilderPath'] = $this->getPicPath($produkt_data['id']);
+				$this->shop->view['ProduktBilderURL'] = $this->getPicPath($produkt_data['id'], true);
+				$this->shop->view['ProduktList'] = $this->getProduktBilderListe($produkt_data['id']);
+				
+			}
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/produkt_edit_content.phtml');	
+			
+		} // public function produkt_edit_content(&$produkt_data)
+		
+		public function produkt_createTranslation(&$produkt_id, &$trans_id)
+		{
+			
+		 	$path_src = $this->getPicPath($produkt_id);
+		 	$path_trg = $this->getPicPath($trans_id);
+		 	
+		 	wpsg_copy($path_src, $path_trg);
+			
+		} // public function produkt_createTranslation(&$produkt_id, &$trans_id)
+		
+		public function produkt_copy(&$produkt_id, &$copy_id) { 
+			
+			// Wie bei der erstellung einer neuen Ãbersetzung ...
+			$this->produkt_createTranslation($produkt_id, $copy_id);
+			
+		} // public function produkt_copy(&$produkt_id, &$copy_id)
+		
+		public function checkGeneralBackendError()
+		{
+			
+						
+		} // public function checkGeneralBackendError()
+		
+		/* Modulfunktionen */
+
+		/**
+		 * Generiert ein Bild fÃŒr ein Produkt, ersetzt ###BILD_1_500_500_c###
+		 * 
+		 * @param unknown_type $p_id
+		 * @param unknown_type $pic
+		 * @param unknown_type $setW
+		 * @param unknown_type $setH
+		 * @param unknown_type $mode
+		 */
+		public function genBild($p_id, $pic, $setW, $setH, $mode, $rel = 'gallery')
+		{
+						
+			$produkt = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($p_id)."'");
+			
+			$handle = opendir($this->getPicPath($produkt['id']));
+			
+			if (is_int($pic))
+			{
+				
+				// Bilder des Produktes laden 
+	   			$arBilder = $this->getProduktBilder($p_id); if ($pic > 0) $pic --;
+	   				
+	   			if (!array_key_exists($pic, $arBilder)) return;
+	   			
+	   			$pic = $arBilder[$pic];
+	   			
+			}
+   			 
+   			$this->shop->view['url_tn'] = $this->makeTn($produkt['id'], $pic, $setW, $setH, $mode);
+			$this->shop->view['url_orginal'] = $this->getPicPath($produkt['id'], true).$pic;
+			$this->shop->view['produkt'] = $produkt;
+			$this->shop->view['rel'] = $rel;
+			   			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/produktbild.phtml', false);
+   									
+		} // public function genBild($p_id, $pic, $setW, $setH, $mode)
+		
+		/**
+		 * Wird vom Template produkt_edit_content.phtml aufgerufen und per Ajax aktualisiert.
+		 * Zeichnet die Liste mit den Produktbildern
+		 */
+		public function getProduktBilderListe($produkt_id)
+		{
+			
+			$this->shop->view['modul'] = &$this;
+			$this->shop->view['ProduktBilderPath'] = $this->getPicPath($produkt_id);
+			$this->shop->view['ProduktBilderURL'] = $this->getPicPath($produkt_id, true);
+			$this->shop->view['ProduktBilder'] = $this->getProduktBilder($produkt_id);
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/produkt_edit_list.phtml', false);
+			
+		} // public function getProduktBilderListe($produkt_id)
+		
+		/**
+		 * Gibt die verfÃŒgbaren MÃ¶glichkeiten fÃŒr den Bildzuschnitt zurÃŒck
+		 */
+		public function getImageModes()
+		{
+		
+			return array(		
+				'n' => __('Unbearbeitet', 'wpsg'),
+				's' => __('Einpassen', 'wpsg'),
+				'sz' => __('Einpassen mit FreiflÃ€che', 'wpsg'),
+				'z' => __('Strecken', 'wpsg'),
+				'sw' => __('Skallieren auf Breite', 'wpsg'),
+				'sh' => __('Skallieren auf HÃ¶he', 'wpsg'),
+				'c' => __('Zuschneiden', 'wpsg'),
+				'cz' => __('Zentrieren und Abschneiden', 'wpsg')
+			);
+			
+		} // public function getImageModes()		
+		
+		/**
+		 * Gibt eien Array mit den Produktbildern zurÃŒck
+		 */
+		public function getProduktBilder($produkt_id)
+		{
+			
+			$arFiles = array();
+
+			// Bilder aus dem Dateisystem raussuchen
+			$path = $this->getPicPath($this->shop->getProduktId($produkt_id));
+						 
+			$handle = opendir($path);
+			
+			while ($filename = readdir($handle))
+			{
+				
+				if (is_file($path.'/'.$filename) && $filename != '.' && $filename != '..' && $filename != '')
+				{
+					
+					$arFiles[] = $filename;
+					
+				}
+				
+			}
+			
+			wpsg_asort($arFiles);
+			
+			$arReturn = array();
+			foreach ($arFiles as $k => $v) $arReturn[] = $v;
+						
+			return $arReturn;
+			
+		} // public function getProduktBilder($produkt_id)
+		
+		/*
+ 		 * Gibt den Absoluten Pfad zurÃŒck wo die Bilder gespeichert sind
+ 		 * Ist der Parameter $url auf true so wird der relative Pfad fÃŒr die Ausgabe in URLs zurÃŒckgegeben
+ 		 */
+ 		public function getPicPath($produkt_id, $url = false)
+ 		{
+ 		 	 			
+ 			if ($this->shop->isMultiBlog())
+			{
+ 
+				if ($url) return WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_produktbilder/'.$produkt_id.'/';
+				else 
+				{
+					
+					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_produktbilder/'.$produkt_id.'/'; 
+					
+					if (!file_exists($path)) mkdir($path, 0777, true);
+					
+					return $path;
+					
+				}
+				 
+			}
+			else
+			{
+				
+				if ($url) return WPSG_URL_CONTENT.'uploads/wpsg_produktbilder/'.$produkt_id.'/';
+				else 
+				{
+					
+					$path = WP_CONTENT_DIR.'/uploads/wpsg_produktbilder/'.$produkt_id.'/';
+					
+					if (!file_exists($path)) mkdir($path, 0777, true);
+					
+					return $path;
+					
+				}
+				
+			}
+			 
+ 		} // private function getPicPath($produkt_id, $url = false)
+
+ 		/**
+ 		 * VERALTET! Erstellt das Thumbnail zu dem Bild $file aus dem Produkt $p_id
+ 		 *
+ 		 * @param int $p_id Id des Produktes
+ 		 * @param String $file Dateiname des Bildes (Ohne Pfad)
+ 		 * @param int $setW Angestrebte Breite des Bildes
+ 		 * @param int $setH Angestrebte HÃ¶he des Bildes
+ 		 * @param String $mode Modus 
+  		 */
+ 		public function makeTn($p_id, $file, $setW, $setH, $mode)
+		{
+			
+			$p_id = $this->shop->getProduktId($p_id);
+
+			$uploaddir = $this->getPicPath($p_id);
+			$uploaddir_tn = $this->getPicPath($p_id)."tn/";
+			$url_bilder = $this->getPicPath($p_id, true);
+			
+			if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
+			if (!file_exists($uploaddir_tn)) mkdir($uploaddir_tn, 0777, true);
+			
+			// Default Werte
+			if ($setW <= 0) $setW = 100;
+			if ($setH <= 0) $setH = 100;
+			if ($mode == "" || !isset($mode)) $mode = 's';
+			
+			$src_file = $uploaddir.$file;
+			$trg_file = $uploaddir_tn.$mode.'-'.$setW.'-'.$setH.'-'.$file;
+			
+			if (!file_exists($src_file) || !is_file($src_file)) return;
+			
+			// Quelldatei existiert nicht
+			if (!file_exists($src_file)) return "FILE NOT FOUND: ".$uploaddir.$file;
+			
+			if (file_exists($trg_file)) return $this->shop->url(str_replace(' ', '%20', $url_bilder."tn/".$mode.'-'.$setW.'-'.$setH.'-'.$file));
+			
+			$b = copy($src_file, $trg_file);
+ 
+			$ImInf = GetImageSize($trg_file);
+			$W = $ImInf[0];
+			$H = $ImInf[1];
+			
+			switch (strtolower(preg_replace("/.*\./", "", $trg_file)))
+			{
+				case 'gif':
+					$srcImage = imagecreatefromgif($trg_file);
+					break;
+				case 'png':				
+					$srcImage = imagecreatefrompng($trg_file);
+					break;
+				case 'jpg':
+					$srcImage = imagecreatefromjpeg($trg_file);
+					break;
+				case 'bmp':
+					$srcImage = imagecreatefromwbmp($trg_file);
+					break;
+				default:
+					return __("Unbekanntes Dateiformat", "wpsg");
+			}
+												
+			switch (strtolower($mode))
+			{
+				
+				case 'c':	// CROP
+					
+					$dstImage = ImageCreateTrueColor($setW, $setH);
+					 					
+					imagealphablending($dstImage, false);
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+					 					
+					// LÃ€ngste Seite finden
+					if ($W > $H)
+					{						
+						$new_width = $W / ($H / $setH);
+						imagecopyresampled($dstImage, $srcImage, 0 - ($new_width / 2) + ($setW / 2), 0, 0, 0, $new_width, $setH, $W, $H);
+					}
+					else
+					{
+						$new_height = $H / ($W / $setW);
+						imagecopyresampled($dstImage, $srcImage, 0, 0 - ($new_height / 2) + ($setH / 2), 0, 0, $setW, $new_height, $W, $H);						
+					}
+					 
+					break;	
+
+				case 'cz': // CROP CENTER
+				
+					$dstImage = ImageCreateTrueColor($setW, $setH);
+					
+					imagealphablending($dstImage, false);
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+					
+					$new_width = $H * $setW / $setH;
+					$new_height = $W * $setH / $setW;
+					
+					if ($new_width > $W)
+					{
+						
+						$y = (($H - $new_height) / 2);
+						
+						imagecopyresampled($dstImage, $srcImage, 0, 0, 0, $y, $setW, $setH, $W, $new_height);
+						
+					}
+					else
+					{
+						
+						$x = (($W - $new_width) / 2);
+						
+						imagecopyresampled($dstImage, $srcImage, 0, 0, $x, 0, $setW, $setH, $new_width, $H);
+						
+					}
+					
+					break;
+						
+				case 'z':   // STRETCH
+					 
+					$dstImage = ImageCreateTrueColor($setW, $setH);
+					
+					imagealphablending($dstImage, false);
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+					
+					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $setW, $setH, $W, $H); 
+					break;
+					
+				case 'n': 	// NIX 
+					
+					return $url_bilder.$file;
+					
+					break;
+					
+				case 'sz':  // SCALE und FreiflÃ€che
+					
+					$dstImage = ImageCreateTrueColor($setW, $setH);
+					list($width, $height) = $this->getNewSize($W, $H, $setW, $setH);					
+					 
+					imagealphablending($dstImage, false);					
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 255, 255, 255, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+										
+					if ($width < $setW) $dst_x = ($setW - $width) / 2;
+					if ($height < $setH) $dst_x = ($setW - $width) / 2;
+										
+					imagecopyresampled($dstImage, $srcImage, $dst_x, $dst_y, 0, 0, $width, $height, $W, $H);														
+									
+					break; 	
+
+				case 'sw': // SCALE WIDTH
+					
+					$height = $H / ($W / $setW);
+					
+					$dstImage = ImageCreateTrueColor($setW, $height);
+					
+					imagealphablending($dstImage, false);
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 255, 255, 255, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+					
+					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $setW, $height, $W, $H);
+						
+					break;
+					
+				case 'sh': // SCALE HEIGHT
+					
+					$width = $W / ($H / $setH);
+					
+					$dstImage = ImageCreateTrueColor($width, $setH);
+						
+					imagealphablending($dstImage, false);
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 255, 255, 255, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+						
+					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $width, $setH, $W, $H);
+										
+					break;
+										
+				case 's':	// SCALE INTO
+				default:
+					
+					list($width, $height) = $this->getNewSize($W, $H, $setW, $setH);					
+					$dstImage = ImageCreateTrueColor($width, $height);
+					
+					imagealphablending($dstImage, false);
+					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
+					imagefill($dstImage, 0, 0, $color);
+					imagesavealpha($dstImage, true);
+					
+					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $width, $height, $W, $H);														
+					break;
+					
+			}		
+			
+			switch (strtolower(preg_replace("/.*\./", "", $trg_file)))
+			{
+				
+				case 'gif':
+					ImageGIF($dstImage, $trg_file);
+				case 'png':
+
+					$quality = 9 - wpsg_round($this->shop->get_option('wpsg_mod_produktbilder_quality') / 10, 0);
+					if ($quality < 9) $quality = 0;
+					
+					ImagePNG($dstImage, $trg_file, $quality);
+					break;
+				case 'jpg':
+				case 'bmp':
+				default:
+					ImageJPEG($dstImage, $trg_file, $this->shop->get_option('wpsg_mod_produktbilder_quality'));
+					break;	
+								
+			}		
+			 
+			imageDestroy($dstImage);
+			imageDestroy($srcImage);	
+
+			return $this->shop->url(str_replace(' ', '%20', $url_bilder."tn/".$mode.'-'.$setW.'-'.$setH.'-'.$file));
+			
+		} // private function makeTn($mode, $set_width, $set_height)
+		
+		/**
+		 * Bestimmt die GrÃ¶Ãe im SeitenverhÃ€ltnis fÃŒr skallierte Bilder
+		 */
+		private function getNewSize($w, $h, $maxW, $maxH)
+		{
+		    
+		    if ($w > $h)
+		    {
+		    	
+				// Breite skallieren und schauen ob HÃ¶he reinpasst   		
+		    	// Bild ist breiter als hoch -> versuchen nach breite zu skallieren
+		    	$newWidth = $maxW;
+		    	$newHeight = ($maxW / $w) * $h;
+		    	
+		    	if ($newHeight > $maxH)
+		    	{
+		    		
+		    		// Bild ist nach skallierung auf Breite zu hoch ! 
+		    		// jetzt noch auf HÃ¶he skallieren
+		    		$newWidth = ($maxH / $newHeight) * $maxW;
+		    		$newHeight = $maxH;  
+		    		  			    			
+		    	}
+		    	
+		    }
+		    else 
+		    {
+		    	
+		    	// Nach HÃ¶he skallieren
+		    	$newHeight = $maxH;
+		    	$newWidth = ($maxH / $h) * $w;
+		    	
+		    	if ($newWidth > $maxW)
+		    	{
+		    		
+		    		// Bild ist nach skallierung auf HÃ¶he zu schmal !
+		    		// jetzt Breite anpassen
+		    		$newHeight = ($maxW / $newWidth) * $maxH;
+		    		$newWidth = $maxW;
+		    		
+		    	}
+		    	
+		    }
+		    
+		    return array($newWidth, $newHeight);
+		    
+		} // function getNewSize($w, $h, $maxW, $maxH)
+		
+	} // class wpsg_mod_produktbilder extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_rechnungen.class.php
===================================================================
--- /mods/wpsg_mod_rechnungen.class.php	(revision 8528)
+++ /mods/wpsg_mod_rechnungen.class.php	(revision 5261)
@@ -4,20 +4,20 @@
 	 * Modul welches das Schreiben von Rechnungen ermÃ¶glicht
 	 */
-	class wpsg_mod_rechnungen extends wpsg_mod_basic {
-
-        public $fields = [];
-
+	class wpsg_mod_rechnungen extends wpsg_mod_basic
+	{
+		
 		var $lizenz = 1;
-		var $id = 1400;
+		var $id = 1400;		
 		var $version = "9.9.9";
 		var $hilfeURL = 'http://wpshopgermany.de/?p=718';
 		var $free = false;
 		
-		var $data = array();
+		var $data = array(); 
 		
 		/**
 		 * Costructor
 		 */
-		public function __construct() {
+		public function __construct()
+		{
 			
 			parent::__construct();
@@ -26,10 +26,10 @@
 			$this->group = __('Bestellung', 'wpsg');
 			$this->desc = __('ErmÃ¶glicht es PDF Rechnungen zu Bestellungen zu generieren.', 'wpsg');
-
+						
 			$this->fields = array(
 				'firma' => __('Firmenname', 'wpsg'),
 				'name' => __('Name', 'wpsg'),
-				'strasse' => __('StraÃe', 'wpsg'),
-				'plzort' => __('PLZ/Ort', 'wpsg'),
+				'strasse' => __('Strasse', 'wpsg'),
+				'plzort' => __('PLZ/Ort', 'wpsg'),	
 				'land' => __('Land', 'wpsg'),
 				'tel' => __('Tel', 'wpsg'),
@@ -46,25 +46,12 @@
 				'user3' => __('Benutzer 3', 'wpsg'),
 				'user4' => __('Benutzer 4', 'wpsg'),
-				'user5' => __('Benutzer 5', 'wpsg')
+				'user5' => __('Benutzer 5', 'wpsg')	
 			);
-			
-			require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_rechnungen'.DIRECTORY_SEPARATOR.'wpsg_invoice.php';
-			require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'mod_rechnungen'.DIRECTORY_SEPARATOR.'wpsg_invoice_item.class.php';
-
-			$this->shop->arStatus['120'] = __('Sammelrechnung geschrieben', 'wpsg');
-			
+						
 		} // public function __construct()
 		
-		public function init(): void {
-			
-			require_once implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_rechnungen', 'lib', 'vendor', 'autoload.php']);
-			require_once implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_rechnungen', 'eInvoice.php']);
-			
-			if (isset($_REQUEST['invoicetest'])) \wpsg\mod_invoice\eInvoice::writeEInvoice(106, 8);
-			
-		}
-		
-		public function install() {
-			
+		public function install() 
+		{ 
+			 
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
 			
@@ -75,5 +62,4 @@
 				id int(25) NOT NULL AUTO_INCREMENT,
 				o_id int(25) NOT NULL ,
-				o_ids TEXT NOT NULL ,
 				datum DATETIME NOT NULL ,
 				storno DATETIME NOT NULL,
@@ -86,73 +72,23 @@
 			
 		   	dbDelta($sql);
-
-            $sql = "CREATE TABLE ".WPSG_TBL_ORDER_INVOICE." (
-                id int(25) NOT NULL AUTO_INCREMENT,
-                order_id INT(11) NOT NULL,
-                invoice_id INT(11) NOT NULL,
-                PRIMARY KEY  (id),
-				KEY order_id (order_id),
-				KEY invoice_id (invoice_id)
-            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-			
-			$sql = "CREATE TABLE ".WPSG_TBL_INVOICE_ITEM." (
-                id int(25) NOT NULL AUTO_INCREMENT,
-                invoice_id INT(11) NOT NULL,
-                order_product_id INT(11) NOT NULL COMMENT 'Kann auch 0 sein fÃŒr z.B. Versand/Gutschein/Rabatt',
-                item_key VARCHAR(255) NOT NULL COMMENT 'product|voucher|shipping|payment|credit',
-                amount INT(11) NOT NULL,
-                single_price_netto DOUBLE(10,4) NOT NULL,
-                single_price_brutto DOUBLE(10,4) NOT NULL,
-                tax_rate DOUBLE(10,4) NOT NULL COMMENT 'z.B. 19 fÃŒr 19%',
-                PRIMARY KEY  (id),
-				KEY invoice_id (invoice_id),
-				KEY order_product_id (order_product_id),
-				KEY item_key (item_key)
-            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-            dbDelta($sql);
-
+		   	
 		   	$this->shop->checkDefault('wpsg_rechnungen_pdfperpage', '10');
 			$this->shop->checkDefault('wpsg_mod_rechnungen_gutschrifttax', 'c');
-
-			$this->shop->checkDefault('wpsg_rechnungen_pdetailname', '1');
-			$this->shop->checkDefault('wpsg_rechnungen_deliverynote', '1');
-
+		   	
 		} // public function install()
 		
-		public function delOrder($order_id) {
-
-            foreach (\wpsg\wpsg_invoice::findByOrderId($order_id) as $oInvoice) {
-
-                $oInvoice->delete();
-
-            }
-
-		} // public function delOrder($order_id)
-		
-		public function template_redirect()
-		{
-			
-			/*
-			if (isset($_REQUEST['correctInvoice'])) {
-				
-				$_REQUEST['wpsg_rechnungen_discount_voucher_coupon'] = '1';
-				$_REQUEST['wpsg_rechnungen_shippay'] = '1';
-				$_REQUEST['wpsg_rechnungen_datum'] = '2024-11-13';
-				$_REQUEST['rnr'] = '205154';
-				$_REQUEST['wpsg_rechnungen_fusstext'] = 'Der Betrag wurde per PayPal gezahlt. Wir danken fÃŒr Ihre Bestellung und wÃŒnschen erholsamen Schlaf.';
-				$_REQUEST['invoice_products'] = [
-					'46889' => [
-						'set' => '1',
-						'amount' => '1'
-					]
-				];
-				
-				$this->writeRechnung(27762, true, true); exit;
-				
-			}
-			*/
+		public function delOrder(&$order_id) 
+		{ 
+			
+			// Rechnungen in der Datenbank lÃ¶schen
+			$this->db->Query("DELETE FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order_id)."'");
+			
+			// Rechnungen im Dateisystem lÃ¶schen
+			$path = $this->getFilePath($order_id); wpsg_rrmdir($path);
+			
+		} // public function delOrder(&$order_id)
+		
+		public function wp_loaded() 
+		{ 
 			
 			if (wpsg_isSizedString($_REQUEST['wpsg_action'], 'wpsg_mod_rechnungen_download'))
@@ -170,101 +106,45 @@
 				$this->doDownload($_REQUEST['r_id']);
 				
-			}
-			
-		} // public function template_redirect()
-
-        public function systemcheck(&$arData) {
-
-            $nInvoiceToCorrect = $this->db->fetchOne("
-                SELECT COUNT(*) FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` > 0 OR `o_ids` != ''
-            ");
-
-            if ($nInvoiceToCorrect > 0) {
-
-                $arData[] = array(
-                    'wpsg_mod_rechnungen_convert_order',
-                    wpsg_ShopController::CHECK_ERROR,
-                    wpsg_translate(
-                        __('Es gibt #1# Rechnungen die den Bestellungen falsch zugeordnet sind. Klicken Sie <a href="#2#">hier</a> um diese in die neue und optimierte Struktur zu ÃŒberfÃŒhren.', 'wpsg'),
-                        $nInvoiceToCorrect,
-                        WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&modul=wpsg_mod_rechnungen&action=module&noheader=1&do=convert'
-                    )
-                );
-
-            }
-			
-        }
-
-		public function be_ajax() {
-
-            if (($_REQUEST['do']??'') === 'convert') {
-
-                $arInvoiceToCorrect = $this->db->fetchAssoc("
-                    SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` > 0 OR `o_ids` != ''
-                ");
-
-                $nConvert = 0;
-
-                foreach ($arInvoiceToCorrect as $invoice_data) {
-
-                    $oInvoice = \wpsg\wpsg_invoice::getInstance(intval($invoice_data['id']));
-
-                    $arOrder = explode(',', $invoice_data['o_ids']);
-                    $arOrder[] = $invoice_data['o_id'];
-
-                    foreach ($arOrder as $order_id) {
-
-                        if (intval($order_id) > 0) {
-
-                            $oInvoice->setOrder(intval($order_id));
-
-                        }
-
-                    }
-
-                    $this->db->UpdateQuery(WPSG_TBL_RECHNUNGEN, [
-                        'o_id' => 0,
-                        'o_ids' => ''
-                    ], " `id` = '".intval($invoice_data['id'])."' ");
-
-                    $nConvert ++;
-
-                }
-
-                $this->shop->addBackendMessage(wpsg_translate(__('Es wurden #1# Rechnungen in die optimierte Datenstruktur ÃŒberfÃŒhrt.', 'wpsg'), $nConvert));
-                $this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin'); exit;
-
-            } else if ($_REQUEST['do'] == 'reset') {
+			}	
+			
+		} // public function wp_loaded()
+		
+		public function init()
+		{
+			
+//			wpsg_debug($this->shop->arLizenz);
+//			wpsg_debug(date('d.m.Y', $this->shop->get_option(get_class($this))));
+			
+		} // public function init()
+		
+		public function be_ajax()
+		{
+			
+			if ($_REQUEST['do'] == 'reset')
+			{
 				
 				$this->resetAction();
-				$this->shop->addBackendMessage(__('Grundeinstellungen wieder hergestellt', 'wpsg'));
+				$this->shop->addBackendMessage(__('Grundeinstellungen wieder hergestellt', 'wpsg'));			
 	
-				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul='.$_REQUEST['modul']);
+				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul='.$_REQUEST['modul']); 
 				
 			}
 			else if ($_REQUEST['do'] == 'inlinedit')
 			{
-
+				
 				$foot_text = $this->shop->get_option("wpsg_rechnungen_footer");
 				if (!is_array($foot_text)) $foot_text = @unserialize($foot_text);
 				if (!is_array($foot_text)) $foot_text = array();
 				
-				if ($_REQUEST['field'] === '1') $check = wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTAREA);
-				else $check = wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTFIELD);
-				
-				if ($check) {
-					
-					$foot_text[$_REQUEST['field_id']][$_REQUEST['field']] = $_REQUEST['value'];
-					
-					$this->shop->update_option('wpsg_rechnungen_footer', $foot_text);
-					
-					die( $_REQUEST['value']);
-					
-				} else die($foot_text[$_REQUEST['field_id']][$_REQUEST['field']]);
+				$foot_text[$_REQUEST['field_id']][$_REQUEST['field']] = $_REQUEST['value'];
+				
+				$this->shop->update_option('wpsg_rechnungen_footer', $foot_text);
+				
+				die($_REQUEST['value']);
 				
 			}
 			else if ($_REQUEST['do'] == 'add')
 			{
-				
+				 
 				$foot_text = $this->shop->get_option("wpsg_rechnungen_footer");
 				if (!is_array($foot_text)) $foot_text = @unserialize($foot_text);
@@ -295,156 +175,95 @@
 				
 			}
-			else if ($_REQUEST['do'] == 'orderAjax')
-			{
-
-				$this->order_ajax();
-
-			}
 			
 		} // public function be_ajax()
-
-		public function settings_save() {
-
-			if (file_exists($_FILES['wpsg_rechnungen_bp']['tmp_name'])) {
-
+		
+		public function settings_save()
+		{
+			
+			if (file_exists($_FILES['wpsg_rechnungen_bp']['tmp_name']))
+			{
+				
 				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_rechnungen_bp']['name']));
-
-				if ($ending != "jpg" && $ending != "jpeg" && $ending != "pdf") {
-				 
+				
+				if ($ending != "jpg" && $ending != "jpeg" && $ending != "pdf")
+				{
 					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Briefpapier) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
-					
-				} else if ($ending == "jpg" || $ending == "jpeg") {
-
-                    @unlink($this->getPaperPath().'wpsg_rechnungen_bp.jpg');
-                    @unlink($this->getPaperPath().'wpsg_rechnungen_bp.pdf');
-				    
-					move_uploaded_file($_FILES['wpsg_rechnungen_bp']['tmp_name'], $this->getPaperPath().'wpsg_rechnungen_bp.jpg');
-					
-				} else if ($ending == "pdf") {
-
-                    @unlink($this->getPaperPath().'wpsg_rechnungen_bp.jpg');
-                    @unlink($this->getPaperPath().'wpsg_rechnungen_bp.pdf');
-
-					move_uploaded_file($_FILES['wpsg_rechnungen_bp']['tmp_name'], $this->getPaperPath().'wpsg_rechnungen_bp.pdf');
-                
-                }
-
-			} else if ((array_key_exists('wpsg_rechnungen_bp_del', $_REQUEST)) && ($_REQUEST['wpsg_rechnungen_bp_del'] == "1")) {
-
-				@unlink($this->getPaperPath().'wpsg_rechnungen_bp.jpg');
-				@unlink($this->getPaperPath().'wpsg_rechnungen_bp.pdf');
-
+				}
+				else if ($ending == "jpg" || $ending == "jpeg")
+				{					
+					move_uploaded_file($_FILES['wpsg_rechnungen_bp']['tmp_name'], $this->getFilePath('').'wpsg_rechnungen_bp.jpg');					
+				} 
+				else if ($ending == "pdf")
+				{
+					move_uploaded_file($_FILES['wpsg_rechnungen_bp']['tmp_name'], $this->getFilePath('').'wpsg_rechnungen_bp.pdf');
+				}
+					
+			}
+			else if ($_REQUEST['wpsg_rechnungen_bp_del'] == "1")
+			{
+
+				@unlink($this->getFilePath('').'wpsg_rechnungen_bp.jpg');
+				@unlink($this->getFilePath('').'wpsg_rechnungen_bp.pdf');
+				
 				$this->shop->addBackendMessage(__('Briefpapier wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
-			}
- 
-			if (array_key_exists('wpsg_rechnungen_logo_position_left', $_REQUEST) && strpos(wpsg_sinput("text_field", $_REQUEST['wpsg_rechnungen_logo_position_left']), 'selected') !== false)
-				$wpsg_rechnungen_logo_position = "left";
-
-			if (array_key_exists('wpsg_rechnungen_logo_position_center', $_REQUEST) && strpos(wpsg_sinput("text_field", $_REQUEST['wpsg_rechnungen_logo_position_center']), 'selected') !== false)
-				$wpsg_rechnungen_logo_position = "center";
-
-			if (array_key_exists('wpsg_rechnungen_logo_position_right', $_REQUEST) && strpos(wpsg_sinput("text_field", $_REQUEST['wpsg_rechnungen_logo_position_right']), 'selected') !== false)
-				$wpsg_rechnungen_logo_position = "right";
- 
-			if (file_exists($_FILES['wpsg_rechnungen_logo']['tmp_name'])) {
-
+				
+			}
+			
+			if (file_exists($_FILES['wpsg_rechnungen_logo']['tmp_name']))
+			{
+				
 				$ending = strtolower(preg_replace("/(.*)\./", "", $_FILES['wpsg_rechnungen_logo']['name']));
-
-				if ($ending != "jpg" && $ending != "jpeg") {
-				 
+				
+				if ($ending != "jpg" && $ending != "jpeg")
+				{
 					$this->shop->addBackendError(__("UngÃŒltiger Dateityp (Logo) ! Es sind nur JPG und PDF Dateien erlaubt!", "wpsg"));
-					
-				} else {
-
-                    $_REQUEST['wpsg_rechnungen_logo_transparency'] = 100;
-				    
-					move_uploaded_file($_FILES['wpsg_rechnungen_logo']['tmp_name'], $this->getPaperPath().'wpsg_rechnungen_logo.jpg');
-					
-				}
-
-			} else if ((array_key_exists('wpsg_rechnungen_logo_del', $_REQUEST)) && ($_REQUEST['wpsg_rechnungen_logo_del'] == "1")) {
-
-				@unlink($this->getPaperPath().'wpsg_rechnungen_logo.jpg');
-
+				}
+				else if ($ending == "jpg" || $ending == "jpeg")
+				{					
+					move_uploaded_file($_FILES['wpsg_rechnungen_logo']['tmp_name'], $this->getFilePath('').'wpsg_rechnungen_logo.jpg');					
+				}  
+					
+			}
+			else if ($_REQUEST['wpsg_rechnungen_logo_del'] == "1")
+			{
+
+				@unlink($this->getFilePath('').'wpsg_rechnungen_logo.jpg'); 
+				
 				$this->shop->addBackendMessage(__('Logo wurde erfolgreich gelÃ¶scht.', 'wpsg'));
-
-			}
-			
-			$bCheckTextField = true;
-
-			foreach ($_REQUEST['text'] as $k => $v) {
-				
-				if (
-					!in_array($k, ['firma', 'name', 'strasse', 'plzort', 'land', 'tel', 'fax', 'mail', 'web', 'strnr', 'ustidnr', 'knr', 'blz', 'bank', 'user1', 'user2', 'user3', 'user4', 'user5']) ||
-					!wpsg_checkInput($v['text'], WPSG_SANITIZE_TEXTFIELD) ||
-					!wpsg_checkInput($v['x'], WPSG_SANITIZE_FLOAT) ||
-					!wpsg_checkInput($v['y'], WPSG_SANITIZE_FLOAT) ||
-					!wpsg_checkInput($v['color'], WPSG_SANITIZE_HEXCOLOR) ||
-					!wpsg_checkInput($v['fontsize'],WPSG_SANITIZE_INT)
-				) {
-					
-					/*
-					var_dump(!in_array($k, ['firma', 'name', 'strasse', 'plzort', 'land', 'tel', 'fax', 'mail', 'web', 'strnr', 'ustidnr', 'knr', 'blz', 'bank', 'user1', 'user2', 'user3', 'user4', 'user5']));
-					var_dump(!wpsg_checkInput($v['text'], WPSG_SANITIZE_TEXTFIELD));
-					var_dump(!wpsg_checkInput($v['x'], WPSG_SANITIZE_FLOAT));
-					var_dump(!wpsg_checkInput($v['y'], WPSG_SANITIZE_FLOAT));
-					var_dump(!wpsg_checkInput($v['color'], WPSG_SANITIZE_HEXCOLOR));
-					var_dump(!wpsg_checkInput($v['fontsize'],WPSG_SANITIZE_INT));
-					var_dump($v['color']);
-					
-					die("_");
-					*/
-					
-					$this->shop->addBackendError(__('Bitte ÃŒberprÃŒfen Sie die Textfelder.', 'wpsg'));
-					$bCheckTextField = false;
-					
-				}
-				
-			}
-
-			if ($bCheckTextField) {
-			
-				$this->shop->update_option("wpsg_mod_rechnungen_texte", $_REQUEST['text']);
-				
-			}
-
-			$this->shop->update_option('wpsg_mod_rechnungen_einvoice', $_REQUEST['wpsg_mod_rechnungen_einvoice'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option("wpsg_rechnungen_url", $_REQUEST['wpsg_rechnungen_url'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option("wpsg_mod_rechnungen_auto", $_REQUEST['wpsg_mod_rechnungen_auto'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2']);
-			$this->shop->update_option("wpsg_rechnungen_logo_position", wpsg_getStr($wpsg_rechnungen_logo_position));
-			$this->shop->update_option("wpsg_rechnungen_logo_transparency", $_REQUEST['wpsg_rechnungen_logo_transparency'], false, false, WPSG_SANITIZE_FLOAT, ['allowEmpty' => true]);
-			$this->shop->update_option("wpsg_rechnungen_faelligkeit", $_REQUEST['wpsg_rechnungen_faelligkeit'],false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_rechnungen_pdfperpage', $_REQUEST['wpsg_rechnungen_pdfperpage'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option("wpsg_rechnungen_pdetailname", $_REQUEST['wpsg_rechnungen_pdetailname'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option("wpsg_rechnungen_pbeschreibung", $_REQUEST['wpsg_rechnungen_pbeschreibung'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option("wpsg_rechnungen_produktattribute", $_REQUEST['wpsg_rechnungen_produktattribute'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-			$this->shop->update_option("wpsg_rechnungen_deliverynote", $_REQUEST['wpsg_rechnungen_deliverynote'], false, false, WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]);
-			$this->shop->update_option("wpsg_mod_rechnungen_showgutschriftrechnung", $_REQUEST['wpsg_mod_rechnungen_showgutschriftrechnung'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_rechnungen_anr', $_REQUEST['wpsg_mod_rechnungen_anr'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option("wpsg_mod_rechnungen_showpv", $_REQUEST['wpsg_mod_rechnungen_showpv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option("wpsg_mod_rechnungen_showov", $_REQUEST['wpsg_mod_rechnungen_showov'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option("wpsg_rechnungen_start", $_REQUEST['wpsg_rechnungen_start'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option("wpsg_gutschrift_start", $_REQUEST['wpsg_gutschrift_start'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_rechnungen_gutschrifttax', wpsg_xss($_REQUEST['wpsg_mod_rechnungen_gutschrifttax']));
-			$this->shop->update_option("wpsg_rechnungen_format", $_REQUEST['wpsg_rechnungen_format'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option("wpsg_gutschrift_format", $_REQUEST['wpsg_gutschrift_format'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_rechnungen_adresszeile', $_REQUEST['wpsg_rechnungen_adresszeile'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_rechnungen_foottext_standard', $_REQUEST['wpsg_rechnungen_foottext_standard'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_rechnungen_hideCountry', $_REQUEST['wpsg_mod_rechnungen_hideCountry'], false, false, WPSG_SANITIZE_CHECKBOX);
-            $this->shop->update_option('wpsg_mod_rechnungen_customermail', $_REQUEST['wpsg_mod_rechnungen_customermail'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+				
+			}
+			
+			$this->shop->update_option("wpsg_mod_rechnungen_texte", $_REQUEST['text']);
+			
+			$this->shop->update_option("wpsg_rechnungen_url", $_REQUEST['wpsg_rechnungen_url']);
+			$this->shop->update_option("wpsg_mod_rechnungen_auto", $_REQUEST['wpsg_mod_rechnungen_auto']);
+			$this->shop->update_option("wpsg_rechnungen_faelligkeit", $_REQUEST['wpsg_rechnungen_faelligkeit']);
+			$this->shop->update_option('wpsg_rechnungen_pdfperpage', $_REQUEST['wpsg_rechnungen_pdfperpage']);
+			$this->shop->update_option("wpsg_rechnungen_pbeschreibung", $_REQUEST['wpsg_rechnungen_pbeschreibung']);
+			$this->shop->update_option("wpsg_mod_rechnungen_showgutschriftrechnung", $_REQUEST['wpsg_mod_rechnungen_showgutschriftrechnung']);
+			$this->shop->update_option('wpsg_mod_rechnungen_showanr', $_REQUEST['wpsg_mod_rechnungen_showanr']);
+			$this->shop->update_option("wpsg_mod_rechnungen_showpv", $_REQUEST['wpsg_mod_rechnungen_showpv']);
+			$this->shop->update_option("wpsg_mod_rechnungen_showov", $_REQUEST['wpsg_mod_rechnungen_showov']);
+			$this->shop->update_option("wpsg_rechnungen_start", $_REQUEST['wpsg_rechnungen_start']);
+			$this->shop->update_option("wpsg_gutschrift_start", $_REQUEST['wpsg_gutschrift_start']);
+			$this->shop->update_option('wpsg_mod_rechnungen_gutschrifttax', $_REQUEST['wpsg_mod_rechnungen_gutschrifttax']);
+			$this->shop->update_option("wpsg_rechnungen_format", $_REQUEST['wpsg_rechnungen_format']);
+			$this->shop->update_option("wpsg_gutschrift_format", $_REQUEST['wpsg_gutschrift_format']);
+			$this->shop->update_option('wpsg_rechnungen_adresszeile', $_REQUEST['wpsg_rechnungen_adresszeile']);
+			$this->shop->update_option('wpsg_rechnungen_foottext_standard', $_REQUEST['wpsg_rechnungen_foottext_standard']);
+			$this->shop->update_option('wpsg_mod_rechnungen_hideCountry', $_REQUEST['wpsg_mod_rechnungen_hideCountry']);
+			
 		}
 		
 		public function settings_edit()
 		{
-			
-			if (file_exists($this->getPaperPath().'wpsg_rechnungen_bp.jpg'))
-			{
-				$this->shop->view['bp'] = $this->getPaperPath(true).'wpsg_rechnungen_bp.jpg';
-			}
-			else if (file_exists($this->getPaperPath().'wpsg_rechnungen_bp.pdf'))
-			{
-				$this->shop->view['bp'] = $this->getPaperPath(true).'wpsg_rechnungen_bp.pdf';
+						
+			if (file_exists($this->getFilePath('').'wpsg_rechnungen_bp.jpg'))
+			{
+				$this->shop->view['bp'] = $this->getFilePath('', true).'wpsg_rechnungen_bp.jpg';
+			}
+			else if (file_exists($this->getFilePath('').'wpsg_rechnungen_bp.pdf'))
+			{
+				$this->shop->view['bp'] = $this->getFilePath('', true).'wpsg_rechnungen_bp.pdf';
 			}
 			else
@@ -453,7 +272,7 @@
 			}
 			
-			if (file_exists($this->getPaperPath().'wpsg_rechnungen_logo.jpg'))
-			{
-				$this->shop->view['logo'] = $this->getPaperPath(true).'wpsg_rechnungen_logo.jpg';
+			if (file_exists($this->getFilePath('').'wpsg_rechnungen_logo.jpg'))
+			{
+				$this->shop->view['logo'] = $this->getFilePath('', true).'wpsg_rechnungen_logo.jpg';
 			}
 			else
@@ -463,5 +282,5 @@
 
 			$this->shop->view['fields'] = $this->fields;
-			$this->shop->view['foottext_list'] = $this->foottext_list();
+			$this->shop->view['foottext_list'] = $this->foottext_list();			
 			$this->shop->view['arTexte'] = $this->shop->get_option('wpsg_mod_rechnungen_texte');
 			
@@ -474,11 +293,12 @@
 				$this->shop->view['arTexte'] = array();
 				
-			}
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/settings_edit.phtml');
+			} 
+						
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/settings_edit.phtml');			
 			
 		} // public function settings_edit()
 		
-		public function order_view($order_id, &$arSidebarArray) {
+		public function order_view_content($order_id) 
+		{
 			
 			$oOrder = wpsg_order::getInstance($order_id);
@@ -487,325 +307,69 @@
 			if ($oOrder->status == wpsg_ShopController::STATUS_UNVOLLSTAENDIG) return;
 			
-			$strQuery = "
-				SELECT
-				    I.*
-				FROM
-				    `".WPSG_TBL_RECHNUNGEN."` AS I
-				        LEFT JOIN `".WPSG_TBL_ORDER_INVOICE."` AS ORDER_INVOICE ON (I.`id` = ORDER_INVOICE.`invoice_id`)
-				WHERE
-					ORDER_INVOICE.`order_id` = '".intval($order_id)."' AND
-				    I.`storno` = '0000-00-00 00:00:00' AND
-					I.`gnr` = ''
-				GROUP BY
-				    I.`id`
-				ORDER BY
-					I.`rnr` DESC
-			";
-
-			$this->shop->view['mod_rechnungen']['arRechnungen'] = $this->db->fetchAssoc($strQuery);
-			
-			$strQuery = "
-				SELECT
-				    INVOICE.*
-				FROM
-					`".WPSG_TBL_RECHNUNGEN."` AS INVOICE
-					    LEFT JOIN `".WPSG_TBL_ORDER_INVOICE."` AS ORDER_INVOICE ON (ORDER_INVOICE.`invoice_id` = INVOICE.`id`)
-				WHERE
-					ORDER_INVOICE.`order_id` = '".intval($order_id)."' AND
-					INVOICE.`storno` != '0000-00-00 00:00:00' AND
-					INVOICE.`gnr` = ''
-				GROUP BY
-				    INVOICE.`id`
-				ORDER BY
-					INVOICE.`rnr` DESC
-			";
-			
-			$this->shop->view['mod_rechnungen']['arRechnungen_storno'] = $this->db->fetchAssoc($strQuery);
+			$this->shop->view['mod_rechnungen']['arRechnungen'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `storno` = '0000-00-00 00:00:00' AND `gnr` = '' ORDER BY `rnr` DESC");
+			$this->shop->view['mod_rechnungen']['arRechnungen_storno'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `storno` != '0000-00-00 00:00:00' AND `gnr` = '' ORDER BY `rnr` DESC");
  
 			$this->shop->view['mod_rechnungen']['arRechnungen_gesamt'] = $this->db->fetchAssoc("
-				SELECT
-					INVOICE.*,
-					UNIX_TIMESTAMP(INVOICE.`datum`) AS ts_datum,
-					UNIX_TIMESTAMP(INVOICE.`storno`) AS ts_storno
-				FROM
-					`".WPSG_TBL_RECHNUNGEN."` AS INVOICE
-					    LEFT JOIN `".WPSG_TBL_ORDER_INVOICE."` AS ORDER_INVOICE ON (INVOICE.`id` = ORDER_INVOICE.`invoice_id`)
-				WHERE
-					ORDER_INVOICE.`order_id` = '".intval($order_id)."'
-				GROUP BY
-				    INVOICE.`id`
-				ORDER BY
-					INVOICE.`id` ASC
+				SELECT 
+					*, 
+					UNIX_TIMESTAMP(`datum`) AS ts_datum,
+					UNIX_TIMESTAMP(`storno`) AS ts_storno
+				FROM 
+					`".WPSG_TBL_RECHNUNGEN."` 
+				WHERE 
+					`o_id` = '".wpsg_q($order_id)."' 
+				ORDER BY 
+					`id` ASC
 			");
-
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/order_view.phtml', false)
-			);
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/order_view.phtml');
 			
 		} // public function order_view_content($order_id) { }
 		
-		public function order_view_row(&$p, $i) {
-
-			$this->shop->view['wpsg_mod_rechnungen']['product'] = $p;
-			$this->shop->view['wpsg_mod_rechnungen']['i'] = $i;
-		
-			$this->shop->view['wpsg_mod_rechnungen']['oOrderProduct'] = wpsg_order_product::getInstance($p['order_product_id']);
-			$this->shop->view['wpsg_mod_rechnungen']['storno_amount'] = $this->getAmountToStorno($this->shop->view['wpsg_mod_rechnungen']['oOrderProduct']);
-			$this->shop->view['wpsg_mod_rechnungen']['invoice_amount'] = $this->getAmountToInvoice($this->shop->view['wpsg_mod_rechnungen']['oOrderProduct']);
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/order_view_row.phtml');
-			
-		} // public function order_view_row(&$p, $i)
-		
-		public function order_view_orderdata_after($order_id) {
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			
-			$this->shop->view['oOrder'] = $oOrder;
-			$this->shop->view['oCustomer'] = $oOrder->getCustomer();
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/order_view_orderdata_after.phtml');
-			
-		}
-		
-		public function order_ajax() {
-			
-			if(isset($_REQUEST['edit_id'])) if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			if(isset($_REQUEST['r_id'])) if (!wpsg_checkInput($_REQUEST['r_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			
-			if (isset($_REQUEST['wpsg_rechnungen_preview'])) {
-				
-				if (wpsg_isSizedInt($_REQUEST['edit_id'])) \check_admin_referer('wpsg-mod_invoice-order_ajax-rechnung-'.wpsg_getInt($_REQUEST['edit_id']));
-				else wpsg_checkNounce('Admin', 'module', ['modul' => 'wpsg_mod_rechnungen', 'do' => 'orderAjax', 'wpsg_rechnungen_preview' => '1']);
+		public function order_ajax() 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_rechnungen_preview']))
+			{
 				
 				// Vorschau einer Rechnung aus der Bestellverwaltung
-				$this->writeRechnung(wpsg_getInt($_REQUEST['edit_id']), true, true);
-
+				$this->writeRechnung($_REQUEST['edit_id'], true);
+				
 				die();
-
-			} else if (wpsg_isSizedString($_REQUEST['module_action'], 'getBp')) {
-				
-				wpsg_checkNounce('Admin', 'module', ['modul' => 'wpsg_mod_rechnungen', 'do' => 'orderAjax', 'module_action' => 'getBp']);
-				
-				if (file_exists($this->getPaperPath().'wpsg_rechnungen_bp.jpg')) {
-					
-					(new wpsg_header)->IMG($this->getPaperPath().'wpsg_rechnungen_bp.jpg');
-					
-				} else if (file_exists($this->getPaperPath().'wpsg_rechnungen_bp.pdf')) {
-					
-					wpsg_header::PDFPlugin($this->getPaperPath().'wpsg_rechnungen_bp.pdf');
-					
-				} else throw new \Exception('Kein Briefpapier definiert.');
-				
-			} else if (wpsg_isSizedString($_REQUEST['module_action'], 'getLogo')) {
-				
-				wpsg_checkNounce('Admin', 'module', ['modul' => 'wpsg_mod_rechnungen', 'do' => 'orderAjax', 'module_action' => 'getLogo']);
-				
-				if (file_exists($this->getPaperPath().'wpsg_rechnungen_logo.jpg')) {
-					
-					(new wpsg_header)->IMG($this->getPaperPath().'wpsg_rechnungen_logo.jpg');
-					
-				} else throw new \Exception('Kein Logo definiert.');
-				
-			} else if (isset($_REQUEST['wpsg_rechnungen_write'])) {
-				
-				\check_admin_referer('wpsg-mod_invoice-order_ajax-rechnung-'.wpsg_getInt($_REQUEST['edit_id']));
-				
-				try {
-				
-					$this->writeRechnung($_REQUEST['edit_id'], false);
-					
-				} catch (Exception $e) {
-					
-					die($e->getMessage());
-					
-				}
+				
+			}
+			else if (isset($_REQUEST['wpsg_rechnungen_write']))
+			{
+				
+				$this->writeRechnung($_REQUEST['edit_id'], false);
 				
 				die();
 				
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'getRechnung') {
-				
-				\check_admin_referer('wpsg-mod_invoice-order_ajax-getRechnung-'.wpsg_getInt($_REQUEST['r_id']));
-				
-			 	$this->doDownload($_REQUEST['r_id'], intval($_REQUEST['profil_id']??0));
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'getMultiRechnung') {
-		
-				\check_admin_referer('wpsg-mod_invoice-order_ajax-getMultiRechnung-'.wpsg_getInt($_REQUEST['r_id']));
-			
-				$this->doDownload($_REQUEST['r_id']);
-
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'storno') {
-				
-				\check_admin_referer('wpsg-mod_invoice-order_ajax-storno-'.wpsg_getInt($_REQUEST['edit_id']));
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'getRechnung')
+			{
+				
+			 	$this->doDownload($_REQUEST['r_id']);
+								
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'storno')
+			{
 				
 				$this->stornoAction();
 				
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'copy') {
-				
-				\check_admin_referer('wpsg-mod_invoice-order_ajax-copy-'.wpsg_getInt($_REQUEST['edit_id']));
+			}
+			else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'copy')
+			{
 				
 				$rechnung = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `id` = '".wpsg_q($_REQUEST['r_id'])."'");
-				$oInvoice = \wpsg\wpsg_invoice::getInstance(intval($_REQUEST['r_id']));
- 
-				if ($rechnung['id'] != $_REQUEST['r_id'] || !in_array(intval($_REQUEST['edit_id']), $oInvoice->getOrderIds())) die(__("Rechnung existiert nicht oder passt nicht zur Bestellung!", "wpsg"));
-				
-				$this->shop->view['order'] = $this->shop->cache->loadOrder($oInvoice->getOrderIds()[0]);
-				$this->shop->view['kunde'] = $oInvoice->getCustomer()->data; 
+				
+				if ($rechnung['id'] != $_REQUEST['r_id'] || $_REQUEST['edit_id'] != $rechnung['o_id']) die(__("Rechnung existiert nicht oder passt nicht zur Bestellung!", "wpsg"));
+				
+				$this->shop->view['order'] = $this->shop->cache->loadOrder($rechnung['o_id']); 
 				
 				// Wurde die Bestellung in einer anderen Sprache ausgefÃŒhrt
 				if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
 				
-				$this->getAdresse($this->shop->view['order']['k_id']);
-				
-				$email = $oInvoice->getCustomer()->getEmail();
-				// $email = $this->shop->view['kunde']['email'];
-				
-				$oCustomer = $oInvoice->getCustomer();
-				$email_einvoice = $oCustomer->getEMailEInvoice();
-				
-				if ($email_einvoice !== null) $email = $email_einvoice;
-
-                $rn_file = $oInvoice->getFilePath();
-                $rn_file_copy = dirname($oInvoice->getFilePath()).DIRECTORY_SEPARATOR.'copy_'.$oInvoice->getNr().'.pdf';
-
-				// Nun schauen ob die Original Rechnung existiert
-				if ($rechnung['gnr'] != "") {
-
-					$strTitle = wpsg_translate(__('Zusendung einer Kopie fÃŒr Rechnungskorrektur #1# an #2#', 'wpsg'), $rechnung['gnr'], $email);
-					$this->shop->view['gnr'] = $rechnung['gnr'];
-
-					$nr = $rechnung['gnr'];
-					
-				} else {
-
-					$strTitle = wpsg_translate(__('Zusendung einer Kopie fÃŒr Rechnung #1# an #2#', 'wpsg'), $rechnung['rnr'], $email);
-					$this->shop->view['rnr'] = $rechnung['rnr'];
-
-					$nr = $rechnung['rnr'];
-					
-				}
-				
-				$oInvoiceOrigin = \wpsg\wpsg_invoice::getInstance(intval($_REQUEST['r_id']));
-				
-				if ($oInvoiceOrigin->isMultiInvoice()) {
-
-					$rn_file = $oInvoiceOrigin->getFilePath();
-				
-				}
-				
-				if (!file_exists($rn_file)) die(__("Die Originalrechnung existiert nicht im Dateisystem.", 'wpsg'));
-
-				if (!class_exists('FPDF')) require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-				
-				require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
-				require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
-				
-				$pdf = new wpsg_fpdf();
-				$pagecount = $pdf->setSourceFile($rn_file);
-
-				for ($i = 1; $i <= $pagecount; $i ++) {
-
-					$tplidx = $pdf->importPage($i, '/MediaBox');
-					$pdf->addPage();
-					$pdf->useTemplate($tplidx, 0, 0);
-
-					$pdf->SetTextColor(125, 125, 125);
-					$pdf->SetFont('Arial', '', 200);
-					
-					$pdf->SetAlpha(0.25);
-					$pdf->TextWithRotation(45, 225, "KOPIE", 45, 0);
-					$pdf->SetAlpha(0);
-					
-				}
-				
-				$pdf->Output($rn_file_copy, 'F');
- 				
-				// $rn_file_copy = $this->copyTemp($rn_file_copy, $nr);
-				
-				// Bestellung in anderer Sprache ?
-				if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);
-				
-				// Mail versenden
-				$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/copymail.phtml", false);
- 
-				if ($this->shop->get_option('wpsg_htmlmail') === '1') {
-					
-					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/copymail_html.phtml', false);
-					
-				} else {
-					
-					$mail_html = false;
-					
-				}
-				
-				$arFiles = [
-					$nr.'.pdf' => $rn_file_copy
-				];
- 			
-				if ($this->shop->get_option('wpsg_widerrufsformular_invoice') === '1' && wpsg_isSizedString($this->shop->get_option('wpsg_revocationform'))) {
-
-					$revocationFile = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform');
-					
-					if (file_exists($revocationFile) && is_file($revocationFile)) {
-				
-						$arFiles[] = $revocationFile;
-				
-					}
-					
-				}
-				
-				$this->shop->sendMail($mail_text, $email, 'rechnungscopy', $arFiles, $_REQUEST['edit_id'], false, $mail_html, false, [
-					'invoice_id' => $oInvoice->getId()
-				]);
-				
-				// TemporÃ€re Rechnung lÃ¶schen
-				@unlink($rn_file_copy);
-				
-				$this->shop->restoreTempLocale();
-				
-				// In Bestelllog eintragen
-                foreach ($oInvoiceOrigin->getOrderIds() as $order_id) {
-
-                    $invoice_id = $this->db->ImportQuery(WPSG_TBL_OL, array(
-                        "cdate" => "NOW()",
-                        "title" => $strTitle,
-                        "mailtext" => $mail_text,
-                        'o_id' => $order_id
-                    ));
-
-                }
-
-                ob_end_clean();
-                
-				$pdf->Output(basename($rn_file_copy), 'I');
-    
-				exit;
-				
-			} else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'rebuildadmin') {
-				
-				\check_admin_referer('wpsg-mod_invoice-order_ajax-rebuildadmin-'.wpsg_getInt($_REQUEST['edit_id']));
-				
-				$rechnung = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `id` = '".wpsg_q($_REQUEST['r_id'])."'");
-				$oInvoice = \wpsg\wpsg_invoice::getInstance(intval($_REQUEST['r_id']));
- 
-				if ($rechnung['id'] != $_REQUEST['r_id'] || !in_array(intval($_REQUEST['edit_id']), $oInvoice->getOrderIds())) die(__("Rechnung existiert nicht oder passt nicht zur Bestellung!", "wpsg"));
-				
-				$this->writeRechnung(
-					intval($_REQUEST['edit_id']),
-					false,
-					true,
-					$oInvoice
-				);
-				
-			}
-			
-		} // public function order_ajax()
-		
-		private function getAdresse($kid)
-		{
-			/*
-			$this->shop->view['kunde'] = $this->db->fetchRow("
+				$this->shop->view['kunde'] = $this->db->fetchRow("
 					SELECT
 						K.*
@@ -813,52 +377,206 @@
 						`".WPSG_TBL_KU."` AS K
 					WHERE
-						K.`id` = '".wpsg_q($kid)."'
-			");
-			*/
-			
-			$this->shop->view['kunde'] = $this->db->fetchRow("
-				SELECT
-					C.`id`,
-					CA.`title` AS `title`,
-					CA.`name` AS `name`,
-					CA.`vname` AS `vname`,
-					CA.`firma` AS `firma`,
-					CA.`fax` AS `fax`,
-					CA.`strasse` AS `strasse`,
-					CA.`nr` AS `nr`,
-					CA.`plz` AS `plz`,
-					CA.`ort` AS `ort`,
-					CA.`land` AS `land`,
-					CA.`tel` AS `tel`,
-					C.`geb`, C.`ustidnr`, C.`email`, C.`id`, C.`knr`
-				FROM
-					`".WPSG_TBL_KU."` AS C
-						LEFT JOIN `".WPSG_TBL_ADRESS."` AS CA ON (CA.`id` = C.`adress_id`)
-				WHERE
-					C.`id` = '".wpsg_q($kid)."' AND
-					C.`deleted` != '1'
-			");
-			
-		}
-
+						K.`id` = '".wpsg_q($this->shop->view['order']['k_id'])."'
+				");
+				
+				$email = $this->shop->view['kunde']['email'];
+
+				// Nun schauen ob die Original Rechnung existiert				
+				if ($rechnung['gnr'] != "")
+				{
+					
+					if (file_exists($this->getFilePath($_REQUEST['edit_id']).$rechnung['id'].'.pdf'))
+					{
+						
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).$rechnung['id'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_'.$rechnung['id'].'.pdf';
+						
+					}
+					else if (file_exists($this->getFilePath($_REQUEST['edit_id']).'G'.$rechnung['gnr'].'.pdf'))
+					{
+					
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).'G'.$rechnung['gnr'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_G'.$rechnung['id'].'.pdf';
+						
+					}
+					else if (file_exists($this->getFilePath($_REQUEST['edit_id']).'G'.$rechnung['id'].'.pdf'))
+					{
+						
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).'G'.$rechnung['id'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_G'.$rechnung['id'].'.pdf';
+						
+					}
+					else if (file_exists($this->getFilePath($_REQUEST['edit_id']).$rechnung['gnr'].'.pdf'))
+					{
+						
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).$rechnung['gnr'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_'.$rechnung['gnr'].'.pdf';
+						
+					}
+					
+					
+					$strTitle = wpsg_translate(__('Zusendung einer Kopie fÃŒr Rechnungskorrektur #1# an #2#', 'wpsg'), $rechnung['gnr'], $email);
+					$this->shop->view['gnr'] = $rechnung['gnr'];
+
+					$nr = $rechnung['gnr'];
+					
+				}
+				else
+				{
+					
+					if (file_exists($this->getFilePath($_REQUEST['edit_id']).$rechnung['id'].'.pdf'))
+					{
+					
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).$rechnung['id'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_'.$rechnung['id'].'.pdf';
+					
+					}
+					else if (file_exists($this->getFilePath($_REQUEST['edit_id']).'R'.$rechnung['rnr'].'.pdf'))
+					{
+					
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).'R'.$rechnung['rnr'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_R'.$rechnung['id'].'.pdf';
+						
+					}
+					else if (file_exists($this->getFilePath($_REQUEST['edit_id']).'R'.$rechnung['id'].'.pdf'))
+					{
+						
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).'R'.$rechnung['id'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_R'.$rechnung['id'].'.pdf';
+						
+					}
+					else if (file_exists($this->getFilePath($_REQUEST['edit_id']).$rechnung['rnr'].'.pdf'))					
+					{
+						
+						$rn_file = $this->getFilePath($_REQUEST['edit_id']).$rechnung['rnr'].'.pdf';
+						$rn_file_copy = $this->getFilePath($_REQUEST['edit_id']).'copy_'.$rechnung['rnr'].'.pdf';
+						
+					}
+					
+					$strTitle = wpsg_translate(__('Zusendung einer Kopie fÃŒr Rechnung #1# an #2#', 'wpsg'), $rechnung['rnr'], $email);
+					$this->shop->view['rnr'] = $rechnung['rnr'];
+
+					$nr = $rechnung['rnr'];
+					
+				}
+				
+				if (!file_exists($rn_file)) die(__("Die Originalrechnung existiert nicht im Dateisystem.", 'wpsg'));
+
+				/*
+				if (file_exists($rn_file_copy)) 
+				{
+					
+					header("Cache-Control: no-cache, must-revalidate");
+					header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 
+					header('Content-type: application/pdf'); 
+						
+					die(file_get_contents($rn_file_copy));
+
+				}
+				*/
+				
+				include WPSG_PATH_LIB.'fpdf/fpdf.php';
+				include WPSG_PATH_LIB.'fpdf/fpdi.php';
+				include WPSG_PATH_MOD.'/mod_rechnungen/wpsg_fpdf.class.php';
+				
+				$pdf = new wpsg_fpdf(); 
+				$pagecount = $pdf->setSourceFile($rn_file);
+
+				for ($i = 1; $i <= $pagecount; $i ++)
+				{
+
+					$tplidx = $pdf->importPage($i, '/MediaBox');
+					$pdf->addPage(); 
+					$pdf->useTemplate($tplidx, 0, 0);
+
+					$pdf->SetTextColor(125, 125, 125); 
+					$pdf->SetFont('Arial', '', 200);
+					
+					$pdf->SetAlpha(0.25);
+					$pdf->TextWithRotation(45, 225, "KOPIE", 45, 0);
+					$pdf->SetAlpha(0);					
+					
+				}
+				 
+				$pdf->Output($rn_file_copy, 'F');
+ 
+				$rn_file_copy = $this->copyTemp($rn_file_copy, $nr);
+								
+				// Bestellung in anderer Sprache ?
+				if (trim($this->shop->view['order']['language']) != '') $this->shop->setTempLocale($this->shop->view['order']['language']);				
+				
+				// Mail versenden
+				$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/copymail.phtml", false);
+ 
+				if ($this->shop->get_option('wpsg_htmlmail') === '1')
+				{
+					
+					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/copymail_html.phtml', false);
+					
+				}
+				else
+				{
+					
+					$mail_html = false;
+					
+				}
+				
+				$arFiles = array($rn_file_copy);
+ 				
+				if ($this->shop->get_option('wpsg_widerrufsformular_invoice') === '1' && wpsg_isSizedString($this->shop->get_option('wpsg_revocationform')))
+				{
+						
+					$revocationFile = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform');
+						
+					if (file_exists($revocationFile) && is_file($revocationFile))
+					{
+				
+						$arFiles[] = $revocationFile;
+				
+					}
+						
+				}
+				
+				$this->shop->sendMail($mail_text, $email, 'rechnungscopy', $arFiles, false, false, $mail_html);
+				
+				// TemporÃ€re Rechnung lÃ¶schen
+				@unlink($rn_file_copy);
+				
+				$this->shop->restoreTempLocale();
+				
+				// In Bestelllog eintragen
+				$this->db->ImportQuery(WPSG_TBL_OL, array(
+					"o_id" => $rechnung['o_id'],
+					"cdate" => "NOW()",
+					"title" => $strTitle,
+					"mailtext" => $mail_text
+				));
+				
+				$pdf->Output(basename($rn_file_copy), 'I');
+				die();
+				
+			}
+			
+		} // public function order_ajax() 
+		
 		public function admin_emailconf_save()
 		{
 			
-			wpsg_saveEMailConfig("invoicemail");
-			wpsg_saveEMailConfig("accountingmail");
+			wpsg_saveEMailConfig("rechnungsmail");
+			wpsg_saveEMailConfig("gutschriftmail");
 			wpsg_saveEMailConfig("rechnungscopy");
-			
+			 
 		} // public function admin_emailconf_save()
 		
-		public function admin_emailconf()
-		{
+		public function admin_emailconf() 
+		{ 
 			
 			echo wpsg_drawEMailConfig(
-				'invoicemail',
+				'rechnungsmail',
 				__('E-Mail bei neuer Rechnung an den Kunden', 'wpsg'),
-				__('Diese Mail bekommt der Kunde wenn die Rechnung geschrieben wird.', 'wpsg'));
+				__('Diese Mail bekommt der Kunde wenn die Rechnung geschrieben wird.', 'wpsg')); 
 		
 			echo wpsg_drawEMailConfig(
-				'accountingmail',
+				'gutschriftmail',
 				__('E-Mail bei neuer Rechnungskorrektur', 'wpsg'),
 				__('Diese Mail bekommt der Kunde wenn eine neue Rechnungskorrektur geschrieben wird.', 'wpsg'));
@@ -871,24 +589,17 @@
 		} // public function admin_emailconf()
 		
-		public function basket_save_done(&$order_id, &$kunde_id, &$oBasket) {
-
-			if ($this->shop->get_option('wpsg_mod_rechnungen_auto') != '1' || $this->shop->get_option('wpsg_mod_rechnungen_customermail') === '1') return;
+		public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
+		{
+
+			if ($this->shop->get_option('wpsg_mod_rechnungen_auto') != '1') return;
 			
 			$this->writeAutoRechnung($order_id);
 
 		} // public function basket_save_done(&$order_id, &$kunde_id, &$oBasket)
-
-		private function writeGutschrift($order_id, $gnr_id, $storno_fee, $bPreview) {
-			
-			if (!$bPreview) {
-			
-				$this->shop->view['invoice'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `id` = '".wpsg_q($gnr_id)."' ");
-				$this->shop->view['rnr'] = $this->shop->view['invoice']['gnr'];
-				
-			} else {
-				
-				$this->shop->view['rnr'] = __('Vorschau', 'wpsg');
-				
-			}
+		
+		private function writeGutschrift($order_id, $gnr_id, $storno_fee, $bPreview)
+		{
+					
+			$this->shop->view['invoice'] = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `id` = '".wpsg_q($gnr_id)."' ");
 			
 			$this->shop->view['data'] = $this->db->fetchRow("
@@ -899,263 +610,198 @@
 				WHERE
 					O.`id` = '".wpsg_q($order_id)."'
+			");			
+
+			if (trim($this->shop->view['data']['language']) != '') $this->shop->setTempLocale($this->shop->view['data']['language']);
+			
+			$this->shop->view['kunde'] = $this->db->fetchRow("
+				SELECT
+					K.*
+				FROM
+					`".WPSG_TBL_KU."` AS K
+				WHERE
+					K.`id` = '".wpsg_q($this->shop->view['data']['k_id'])."'
 			");
 			
-			$this->shop->view['payment'] = $this->shop->getPaymentName(@$this->shop->view['data']['type_payment'], $order_id);
-
-			if (trim($this->shop->view['data']['language']) != '') $this->shop->setTempLocale($this->shop->view['data']['language']);
-			
-			$this->getAdresse($this->shop->view['data']['k_id']);
+			$custom_data = @unserialize($this->shop->view['data']['custom_data']);
+			$this->shop->view['basket'] = $custom_data['basket'];
+		 
+			$this->shop->view['storno_fee'] = $storno_fee;
+			
+			if (wpsg_tf($storno_fee) > 0)
+			{
+			
+				if (strpos($storno_fee, '%') !== false)
+				{
+					
+					// % Betrag
+					if ($this->shop->getBackendTaxview() == WPSG_NETTO) $storno_fee_value_netto = $this->shop->view['basket']['sum']['preis_gesamt_netto'] / 100 * wpsg_tf($storno_fee);
+					else $storno_fee_value_brutto = $this->shop->view['basket']['sum']['preis_gesamt_brutto'] / 100 * wpsg_tf($storno_fee);
+					
+				}
+				else
+				{
+					
+					// Absoluter Betrag
+					if ($this->shop->getBackendTaxview() == WPSG_NETTO) $storno_fee_value_netto = wpsg_tf($storno_fee);
+					else $storno_fee_value_brutto = wpsg_tf($storno_fee); 
+					
+				}
+				
+				$storno_tax_key = $this->shop->get_option('wpsg_mod_rechnungen_gutschrifttax'); 
+				
+				if (in_array($storno_tax_key, array('a', 'b', 'c', 'd', 'e')))
+				{
+					
+					$defaultCountry = $this->shop->getDefaultCountry();
+					$storno_fee_tax_value = $defaultCountry->getTax($storno_tax_key);
+									
+					if ($this->shop->getBackendTaxview() === WPSG_NETTO) $storno_fee_value_brutto = wpsg_calculatePreis($storno_fee_value_netto, WPSG_BRUTTO, $storno_fee_tax_value);
+					else $storno_fee_value_netto = wpsg_calculatePreis($storno_fee_value_brutto, WPSG_NETTO, $storno_fee_tax_value);				
+					
+					$storno_fee_tax = $storno_fee_value_brutto - $storno_fee_value_netto;
+	
+					// In den Mehrwertsteuer Array einbauen
+					$bFound = false;
+					foreach ($this->shop->view['basket']['mwst'] as $tax_key_country => $tax)
+					{
+						
+						if ($tax['value'] == $storno_fee_tax_value)
+						{
+							
+							$bFound = true;
+							$this->shop->view['basket']['mwst'][$tax_key_country]['base_value'] -= $storno_fee_value_brutto;
+							$this->shop->view['basket']['mwst'][$tax_key_country]['sum'] -= $storno_fee_tax;
+							break;
+							
+						}
+						
+					}
+					
+					if ($bFound === false)
+					{
+						 
+						$this->shop->view['basket']['mwst'][$storno_tax_key.'_'.$this->shop->getDefaultCountry(true)] = array(
+							'country' => $this->shop->getDefaultCountry(true),
+							'tax_key' => $storno_tax_key,
+							'sum' => -1 * $storno_fee_tax,
+							'name' => wpsg_ff($storno_fee_tax_value, '%'),
+							'value' => $storno_fee_tax_value,
+							'base_value' => $storno_fee_value_brutto							 							
+						);
+						
+					}
+					
+				}		
+				else 
+				{
+	
+					// TODO: Anteilig
+					
+				}		
+
+				// Jetzt von den Preisen abziehen
+				$this->shop->view['basket']['sum']['preis_netto'] -= $storno_fee_value_netto;
+				$this->shop->view['basket']['sum']['preis_gesamt_netto'] -= $storno_fee_value_netto;
+				$this->shop->view['basket']['sum']['preis_brutto'] -= $storno_fee_value_brutto;
+				$this->shop->view['basket']['sum']['preis_gesamt_brutto'] -= $storno_fee_value_brutto;
+				$this->shop->view['basket']['sum']['mwst'] -= $storno_fee_tax;
+					
+				if ($this->shop->getFrontendTaxview() === WPSG_NETTO)
+				{
+				
+					$this->shop->view['basket']['sum']['preis'] = $this->shop->view['basket']['sum']['preis_netto'];
+					$this->shop->view['basket']['sum']['preis_gesamt'] = $this->shop->view['basket']['sum']['preis_gesamt_netto'];
+					$this->shop->view['storno_fee_value'] = $storno_fee_value_netto;
+				
+				}
+				else
+				{
+				
+					$this->shop->view['basket']['sum']['preis'] = $this->shop->view['basket']['sum']['preis_brutto'];
+					$this->shop->view['basket']['sum']['preis_gesamt'] = $this->shop->view['basket']['sum']['preis_gesamt_brutto'];
+					$this->shop->view['storno_fee_value'] = $storno_fee_value_brutto;
+				
+				}
+				
+				$this->shop->view['storno_fee_tax_value'] = $storno_fee_tax_value;
+				$this->shop->view['storno_fee_tax'] = $storno_fee_tax;
+				$this->shop->view['storno_fee_value_netto'] = $storno_fee_value_netto;
+				$this->shop->view['storno_fee_value_brutto'] = $storno_fee_value_brutto;
+					
+				/*
+				 wpsg_debug($this->shop->view['basket']['mwst']);
+					
+				wpsg_debug("GebÃŒhr Steuer (Satz): ".$storno_fee_tax_value);
+				wpsg_debug("GebÃŒhr Steuer: ".$storno_fee_tax);
+				wpsg_debug("GebÃŒhr Netto: ".$storno_fee_value_netto);
+				wpsg_debug("GebÃŒhr Brutto: ".$storno_fee_value_brutto);
+				die();
+				*/
+				
+			}
+									
+			$this->shop->view['kunde']['land'] = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($this->shop->view['kunde']['land'])."'");
+			$this->shop->view['data']['shipping_land'] = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($this->shop->view['data']['shipping_land'])."'");
+			$this->shop->view['rDatum'] = date('d.m.Y');
+			$this->shop->view['title'] = __('Rechnungskorrektur', 'wpsg');			
+
+			$this->shop->view['payment'] = $this->shop->getPaymentName($this->shop->view['data']['type_payment'], $order_id);
 			
 			$this->shop->view['fussText'] = false;
-			
-			$oCalculation = new \wpsg\wpsg_calculation();
-			$oCalculationOrder = \wpsg\wpsg_calculation::getOrderCalculation($order_id);
-			$this->shop->view['oCalculationOrder'] = $oCalculationOrder;
-			
-			if (intval($_REQUEST['wpsg_rechnungen_discount_voucher_coupon']??0) > 0) {
-				
-				$discount = $oCalculationOrder->getDiscount();
-				if ($discount !== null) $oCalculation->addDiscount(
-					$discount['set'],
-					$discount['bruttonetto'],
-					$discount['tax_key'],
-					$discount['amount']
-				);
-				
-				$arVoucher = $oCalculationOrder->getVoucher();
-				if ($arVoucher !== null) {
-					
-					foreach ($arVoucher as $v) {
-				
-						$oCalculation->addVoucher(
-							$v['set'],
-							$v['bruttonetto'],
-							$v['tax_key'],
-							$v['amount'],
-							$v['data']['code']??false,
-							$v['code']['id']??0,
-							$v['code']['order_voucher_id']??0
-						);
-						
-					}
-					
-				}
-				
-				$arCoupon = $oCalculationOrder->getCoupon();
-				if ($arCoupon !== null) {
-					
-					foreach ($arCoupon as $c) {
-						
-						$oCalculation->addCoupon(
-							$c['set'],
-							$c['bruttonetto'],
-							$c['tax_key'],
-							$c['amount'],
-							$c['data']['code']??false,
-							$c['code']['id']??0,
-							$c['code']['order_voucher_id']??0
-						);
-						
-					}
-					
-				}
-
-			}
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			$this->shop->view['oOrder'] = $oOrder;
-			
+						
+			// Beschreibung dazuladen
+			foreach ($this->shop->view['basket']['produkte'] as $k => $v)
+			{
+				
+				$produkt_id = $this->shop->getProduktID($v['id']);
+				
+				$this->shop->view['basket']['produkte'][$k]['beschreibung'] = $this->db->fetchOne("
+					SELECT
+						P.`beschreibung`
+					FROM
+						`".WPSG_TBL_PRODUCTS."` AS P
+					WHERE
+						P.`id` = '".wpsg_q($produkt_id)."'
+				");
+				
+			}
+						
+			$this->shop->view['preview'] = false;
+			$this->shop->view['rnr'] = $this->shop->view['invoice']['gnr'];	
+
+			if ($bPreview) $this->shop->view['rnr'] .= __(' - Vorschau', 'wpsg');
+			
+			$this->shop->view['filename'] = $gnr_id;
+			$this->shop->view['filename_out'] = $this->shop->view['invoice']['gnr'].'.pdf';
+			
+			$this->shop->view['output'] = true;			
 			$this->shop->view['preview'] = $bPreview;
-			$this->shop->view['rDatum'] = date('d.m.Y');
-			
-			$oDefaultCountry = $oOrder->getInvoiceCountry();
-			$oCalculation->addCountry($oDefaultCountry->id, $oDefaultCountry->mwst, $oDefaultCountry->mwst_a,$oDefaultCountry->mwst_b, $oDefaultCountry->mwst_c, $oDefaultCountry->mwst_d, true);
-			
-		    if (($_REQUEST['storno_shippay']??'0') === '1') {
-				 
-				$oCalculation->addShipping(
-					$oOrder->__get('shipping_set'),
-					$oOrder->__get('shipping_bruttonetto'),
-					$oOrder->__get('shipping_tax_key'),
-					$oOrder->__get('shipping_key')
-				);
-				
-				$oCalculation->addPayment(
-					$oOrder->__get('payment_set'),
-					$oOrder->__get('payment_bruttonetto'),
-					$oOrder->__get('payment_tax_key'),
-					$oOrder->__get('payment_key')
-				);
-				
-			}
-			
-			$arProduct = [];
-            $sum = [];
-			
-			$tax_view = WPSG_NETTO;
-			
-			foreach ($_REQUEST['storno_products'] as $order_product_id => $order_product_info) {
-				
-				if ($order_product_info['set'] === '1') {
-					
-					$oOrderProduct = wpsg_order_product::getInstance($order_product_id);
-				
-					if (!$bPreview) {
-						
-						$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-						if (!is_array($invoice_data)) $invoice_data = [];
-						
-						$invoice_data[] = [
-							'amount' => $order_product_info['amount'],
-							'invoice_id' => $gnr_id
-						];
-						
-						$oOrderProduct->setMeta('wpsg_mod_rechnungen_data', json_encode($invoice_data));
-						
-					}
-					
-					$oCalculation->addProduct(
-						$oOrderProduct->getPrice($tax_view),
-						$tax_view,
-						$oOrderProduct->getProduct()->__get('mwst_key'),
-						$order_product_info['amount'],
-						$oOrderProduct->getProductKey(),
-						$oOrderProduct->getProductIndex(),
-						$oOrderProduct->getId(),
-						(($oOrderProduct->getProduct()->data['euleistungsortregel'] === '1')?true:false)
-					);
-					
-					$p = [
-						'oOrderProduct' => $oOrderProduct,
-						'id' => $oOrderProduct->getProductKey(),
-						'product_index' => $oOrderProduct->getProductIndex(),
-						'productkey' => $oOrderProduct->getProductKey(),
-						'menge' => $order_product_info['amount'],
-						'price' => $oOrderProduct->getPrice($tax_view),
-						'weight' => $oOrderProduct->weight,
-						'anr' => $oOrderProduct->getProduct()->getNr(),
-						'mwst_value' => $oOrder->getInvoiceCountry()->getTax($oOrderProduct->getTaxKey()),
-						'preis_netto' => $oOrderProduct->getPrice(WPSG_NETTO),
-						'preis_brutto' => $oOrderProduct->getPrice(WPSG_BRUTTO),
-						'name' => $oOrderProduct->getProduct()->getProductName(false),
-						'detailname' => $oOrderProduct->getProduct()->getProductName(true),
-						'beschreibung' => $oOrderProduct->getDescription()
-					];
-
-					$sum['weight_gesamt'] += $p['weight'];
-					
-					// Ãbersetzung
-					if ($this->shop->isOtherLang()) {
-					
-						$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($oOrderProduct->getProduct()->getId())."' AND `lang_code` = '".wpsg_q($this->shop->getCurrentLanguageCode())."'");
-					
-						if ($produkt_trans['id'] > 0) {
-							
-							$p['name'] = $produkt_trans['name'];
-							$p['beschreibung'] = $produkt_trans['beschreibung'];
-							$p['detailname'] = $produkt_trans['detailname'];
-					
-						}
-					
-					}
-					
-					$arProduct[] = $p;
-					
-				}
-				
-			}
-
-			$oCalculation->setWeight($sum['weight_gesamt']); // Gesamtgewicht des Warenkrobs setzen
-			
-			$this->shop->view['basket'] = [
-				'arCalculation' => $oCalculation->getCalculationArray(),
-				'produkte' => $arProduct,
-				'sum' => [
-					'preis_gesamt_netto' => $oCalculation->getSum(WPSG_NETTO),
-					'preis_gesamt_brutto' => $oCalculation->getSum(WPSG_BRUTTO),
-				]
-			];
-			
-			// Die Templates brauchen es leider noch etwas anders
-			foreach ($this->shop->view['basket']['arCalculation']['tax'] as $tax_key => $tax) {
-				
-				if ($tax_key !== 0) {
-					
-					$this->shop->view['basket']['mwst'][] = [
-						'value' => $tax['tax_value'],
-						'sum' => $tax['sum']
-					];
-					
-				}
-				
-			}
-			
-			if ($storno_fee !== '') {
-				
-				if (strpos($storno_fee, '%') !== false) {
-					
-					$storno_proz = str_replace('%', '', $storno_fee);
-					$storno_fee_value = $this->shop->view['basket']['sum']['preis_gesamt_brutto'] - ($this->shop->view['basket']['sum']['preis_gesamt_brutto'] / 100 * $storno_proz);
-					
-				} else $storno_fee_value = wpsg_tf($storno_fee);
-				
-				$this->shop->view['storno_fee_value'] = $storno_fee_value;
-				
-				$this->shop->view['basket']['sum']['preis_gesamt_brutto'] -= $storno_fee_value;
-				$this->shop->view['basket']['sum']['preis_gesamt_netto'] -= wpsg_calculatePreis($storno_fee_value, WPSG_NETTO, 19);
-				
-			}
-
-            $oInvoice = null;
-
-			if (!$bPreview) {
-				
-				$oInvoice = \wpsg\wpsg_invoice::getInstance($gnr_id);
-				
-				$oInvoice->setMeta('basket_data', json_encode($this->shop->view['basket']));
-				$oInvoice->setMeta('version', '2');
-			
-				if (($_REQUEST['storno_shippay']??'0') === '1') {
-				
-					$oInvoice->setMeta('include_shipping', '1');
-					
-				}
-				
-			}
-			
-			if (($_REQUEST['storno_shippay']??'0') === '1') {
-				
-				$this->shop->view['basket']['sum']['preis_shipping'] = $oCalculation->getShippingSum(WPSG_BRUTTO);
-				
-			}
-			
-			$this->shop->view['filename'] = $gnr_id;
-			$this->shop->view['oInvoice'] = $oInvoice;
-			$this->shop->view['filename_out'] = $this->shop->view['invoice']['gnr'].'.pdf';
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/accounting_pdf.phtml');
+			
+			// Wenn Rechnungskorrektur und Option aktiviert dann die Rechnungsnummer hinter die Rechnungskorrektursnummer
+			if ($this->shop->get_option("wpsg_mod_rechnungen_showgutschriftrechnung") == "1")
+			{
+				
+				// Letzt Rechnungsnummer finden
+				$last_rnr = $this->db->fetchOne("SELECT `rnr` FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($order_id)."' AND `gnr` = '' ORDER BY `datum` DESC LIMIT 1");
+			
+				$this->shop->view['rnr'] .= ' ('.__("RNr.", "wpsg").' '.$last_rnr.')';
+				
+			}
+						
+			$this->shop->view['oOrder'] = $this->shop->cache->loadOrderObject($order_id);
+			$this->shop->view['storno'] = true;
+			$this->shop->view['invoice'] = false;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/rechnung_pdf.phtml');
 			
 			$this->shop->restoreTempLocale();
-			
+						
 		} // private function writeGutschrift($order_id)
-		
-		public function writeRechnung($order_id, $preview, $bOutput = true, ?\wpsg\wpsg_invoice $_oInvoice = null) {
-			
-			$bOK = false;
-
-			// PrÃŒfen das Produkte gesetzt sind
-			foreach ($_REQUEST['invoice_products']??[] as $order_product_id => $order_product_info) {
-
-				if ($order_product_info['set'] === '1') {
-					
-					$bOK = true;
-					
-				}
-				
-			}
-			
-			if (!$bOK && !$preview && $_oInvoice === null) throw new \Exception(__('Kein Produkt ausgewÃ€hlt!', 'wpsg'));
+		 
+		public function writeRechnung($order_id, $preview, $bOutput = true)
+		{
 			
 			$this->shop->view['output'] = $bOutput;
+			
 			$this->shop->view['data'] = $this->db->fetchRow("
 				SELECT
@@ -1165,440 +811,128 @@
 				WHERE
 					O.`id` = '".wpsg_q($order_id)."'
+			");			
+						
+			// Wurde die Bestellung in einer anderen Sprache gemacht
+			if (trim($this->shop->view['data']['language']) != '') $this->shop->setTempLocale($this->shop->view['data']['language']);
+			
+			$this->shop->view['kunde'] = $this->db->fetchRow("
+				SELECT
+					K.*
+				FROM
+					`".WPSG_TBL_KU."` AS K
+				WHERE
+					K.`id` = '".wpsg_q($this->shop->view['data']['k_id'])."'
 			");
 			
-			// Wurde die Bestellung in einer anderen Sprache gemacht
-			if (trim($this->shop->view['data']['language']??'') != '') $this->shop->setTempLocale($this->shop->view['data']['language']);
-			
-			$this->getAdresse($this->shop->view['data']['k_id']??0);
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			
 			$custom_data = @unserialize($this->shop->view['data']['custom_data']);
-		
-			$this->shop->view['kunde']['land'] = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($this->shop->view['kunde']['land']??0)."'");
-			$this->shop->view['data']['shipping_land'] = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q(wpsg_getStr($this->shop->view['data']['shipping_land']))."'");
-
-            if (isset($_REQUEST['wpsg_rechnungen_datum'])) {
-
-                if (wpsg_checkInput($_REQUEST['wpsg_rechnungen_datum'], WPSG_SANITIZE_DATE_EN)) $this->shop->view['rDatum'] = date('Y-m-d', strtotime($_REQUEST['wpsg_rechnungen_datum']));
-                else throw \wpsg\Exception::getSanitizeException();
-
-            } else if ($_oInvoice !== null) $this->shop->view['rDatum'] = $_oInvoice->getDate('Y-m-d');
-		
-			if ($this->shop->hasMod('wpsg_mod_shippingadress') && $this->shop->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array('k_id' => @$this->shop->view['data']['k_id'], 'o_id' => @$this->shop->view['data']['id']))) {
-				
-				$temp = $this->db->fetchRow("
+			$this->shop->view['basket'] = $custom_data['basket'];
+			
+			if (!is_array($custom_data['basket']))
+			{
+				
+				$basket = new wpsg_basket();
+				$basket->initFromDB($order_id);
+				$this->shop->view['basket'] = $basket->toArray();
+				
+			}
+			
+			//wpsg_debug($this->shop->view['basket']);die();
+			
+			$this->shop->view['kunde']['land'] = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($this->shop->view['kunde']['land'])."'");
+			$this->shop->view['data']['shipping_land'] = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($this->shop->view['data']['shipping_land'])."'");
+			$this->shop->view['rDatum'] = $_REQUEST['wpsg_rechnungen_datum'];
+			$this->shop->view['title'] = __('Rechnung', 'wpsg');			
+				
+			$this->shop->view['payment'] = $this->shop->getPaymentName($this->shop->view['data']['type_payment'], $order_id);
+			$this->shop->view['fussText'] = $this->shop->replaceUniversalPlatzhalter($_REQUEST['wpsg_rechnungen_fusstext'], $order_id);
+			
+			if ($_REQUEST['wpsg_rechnungen_faelligkeit'] == '1')
+			{
+				$this->shop->view['faelligkeitdatum'] = $_REQUEST['wpsg_rechnungen_faelligkeitsdatum'];
+			}
+									
+			// Beschreibung dazuladen
+			foreach ($this->shop->view['basket']['produkte'] as $k => $v)
+			{
+				
+				$produkt_id = $this->shop->getProduktID($v['id']);
+				
+				$this->shop->view['basket']['produkte'][$k]['beschreibung'] = $this->db->fetchOne("
 					SELECT
-						*
+						P.`beschreibung`
 					FROM
-						`".WPSG_TBL_ADRESS."` AS A
+						`".WPSG_TBL_PRODUCTS."` AS P
 					WHERE
-						A.`id` = '".wpsg_q($this->shop->view['data']['shipping_adress_id'])."'
+						P.`id` = '".wpsg_q($produkt_id)."'
 				");
 				
-				$this->shop->view['data']['shipping_firma'] = $temp['firma'];
-				$this->shop->view['data']['shipping_vname'] = $temp['vname'];
-				$this->shop->view['data']['shipping_name'] = $temp['name'];
-				$this->shop->view['data']['shipping_strasse'] = $temp['strasse'];
-				$this->shop->view['data']['shipping_nr'] = $temp['nr'];
-				$this->shop->view['data']['shipping_plz'] = $temp['plz'];
-				$this->shop->view['data']['shipping_ort'] = $temp['ort'];
-				
-				$t = $this->db->fetchRow("SELECT L.* FROM `".WPSG_TBL_LAND."` AS L WHERE L.`id` = '".wpsg_q($temp['land'])."'");
-				
-				$this->shop->view['data']['shipping_land'] = array();
-				$this->shop->view['data']['shipping_land']['name'] = $t['kuerzel'];
-				
-			}
-			
-			$this->shop->view['payment'] = $this->shop->getPaymentName(@$this->shop->view['data']['type_payment'], $order_id);
-			$this->shop->view['fussText'] = $this->shop->replaceUniversalPlatzhalter(wpsg_sinput("text_field", @$_REQUEST['wpsg_rechnungen_fusstext']), $order_id);
-			
-			if (($_REQUEST['wpsg_rechnungen_faelligkeit']??'') == '1') {
-			 
-				if (wpsg_checkInput($_REQUEST['wpsg_rechnungen_faelligkeitsdatum'], WPSG_SANITIZE_DATE_EN)) $this->shop->view['faelligkeitdatum'] = $_REQUEST['wpsg_rechnungen_faelligkeitsdatum'];
-				else throw \wpsg\Exception::getSanitizeException();
-				
-			}
-			
-			$oCalculation = new \wpsg\wpsg_calculation();
-			$oCalculation->order_finish = true;
-			
-			$oCalculationOrder = \wpsg\wpsg_calculation::getOrderCalculation($order_id);
-
-			$oCalculation->setTaxMode($oCalculationOrder->getTaxMode());
-			$this->shop->view['oCalculationOrder'] = $oCalculationOrder;
-
-			foreach ($oCalculationOrder->getCountry() as $country) {
-			
-				$oCalculation->addCountry(
-					$country['id'],
-					$country['tax_mode'],
-					$country['a_'.$country['id']],
-					$country['b_'.$country['id']],
-					$country['c_'.$country['id']],
-					$country['d_'.$country['id']],
-					$country['default']
-				);
-				
-			}
-			
-			if (intval($_REQUEST['wpsg_rechnungen_discount_voucher_coupon']??0) > 0) {
-	
-				$discount = $oCalculationOrder->getDiscount();
-				
-				if ($discount !== null) {
-					
-					$oCalculation->addDiscount(
-						$discount['set'],
-						$discount['bruttonetto'],
-						$discount['tax_key'],
-						$discount['amount']
-					);
-
-				}
-				
-				$arVoucher = $oCalculationOrder->getVoucher();
-				
-				if ($arVoucher !== null) {
-					
-					foreach ($arVoucher as $v) {
-					 
-						$oCalculation->addVoucher(
-							$v['set'],
-							$v['bruttonetto'],
-							$v['tax_key'],
-							$v['amount'],
-							$v['data']['code']??false,
-							$v['code']['id']??0,
-							$v['code']['order_voucher_id']??0
-						);
-						
-					}
-					
-				}
-				
-				$arCoupon = $oCalculationOrder->getCoupon();
-				if ($arCoupon !== null) {
-					
-					foreach ($arCoupon as $c) {
-						
-						$oCalculation->addCoupon(
-							$c['set'],
-							$c['bruttonetto'],
-							$c['tax_key'],
-							$c['amount'],
-							$c['data']['code']??false,
-							$c['code']['id']??0,
-							$c['code']['order_voucher_id']??0
-						);
-						
-					}
-					
-				}
-
-			}
-			
-			// $oCalculation->addCountry($oDefaultCountry->id, $oDefaultCountry->mwst, $oDefaultCountry->mwst_a,$oDefaultCountry->mwst_b, $oDefaultCountry->mwst_c, $oDefaultCountry->mwst_d, true);
-			
-			$arProduct = [];
-			$sum = [];
-			$sum['weight_gesamt'] = 0;
-
-			$tax_view = WPSG_NETTO;
- 
-            if (isset($_REQUEST['invoice_products'])) {
-				
-                foreach ($_REQUEST['invoice_products'] as $order_product_id => $order_product_info) {
-
-                    if ($order_product_info['set'] === '1') {
-
-                        $oOrderProduct = wpsg_order_product::getInstance($order_product_id, true);
-
-                        $oCalculation->addProduct(
-                            $oOrderProduct->getPrice($tax_view),
-                            $tax_view,
-                            $oOrderProduct->getProduct()->__get('mwst_key'),
-                            $order_product_info['amount'],
-                            $oOrderProduct->getProductKey(),
-                            $oOrderProduct->getProductIndex(),
-                            $oOrderProduct->getId(),
-                            (($oOrderProduct->getProduct()->data['euleistungsortregel'] === '1') ? true : false)
-                        );
-
-                        $p = [
-                            'oOrderProduct' => $oOrderProduct,
-                            'id' => $oOrderProduct->getProductKey(),
-                            'product_index' => $oOrderProduct->getProductIndex(),
-                            'productkey' => $oOrderProduct->getProductKey(),
-                            'menge' => $order_product_info['amount'],
-                            'price' => $oOrderProduct->getPrice($tax_view),
-                            'weight' => $oOrderProduct->weight,
-                            'anr' => $oOrderProduct->getProduct()->getNr(),
-                            'mwst_value' => $oOrder->getInvoiceCountry()->getTax($oOrderProduct->getTaxKey()),
-                            'preis_netto' => $oOrderProduct->getPrice(WPSG_NETTO),
-                            'preis_brutto' => $oOrderProduct->getPrice(WPSG_BRUTTO),
-                            'name' => $oOrderProduct->getProduct()->getProductName(false),
-                            'detailname' => $oOrderProduct->getProduct()->getProductName(true),
-                            'beschreibung' => $oOrderProduct->getDescription()
-                        ];
-
-                        $sum['weight_gesamt'] += $p['weight'];
-
-                        if ($oCalculationOrder->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B) {
-
-                            $p['preis_brutto'] = $p['preis_netto'];
-                            $p['mwst_value'] = 0;
-
-                        }
-
-                        // Ãbersetzung
-                        if ($this->shop->isOtherLang()) {
-
-                            $produkt_trans = $this->db->fetchRow("SELECT * FROM `" . WPSG_TBL_PRODUCTS . "` WHERE `lang_parent` = '" . wpsg_q($oOrderProduct->getProduct()->getId()) . "' AND `lang_code` = '" . wpsg_q($this->shop->getCurrentLanguageCode()) . "'");
-
-                            if ($produkt_trans['id'] > 0) {
-
-                                $p['name'] = $produkt_trans['name'];
-                                $p['beschreibung'] = $produkt_trans['beschreibung'];
-                                $p['detailname'] = $produkt_trans['detailname'];
-
-                            }
-
-                        }
-
-                        $arProduct[] = $p;
-
-                    }
-
-                }
-
-            } else if ($_oInvoice !== null) {
-				
-				$this->shop->view['rebuild'] = true;
-				
-				$oOrder = \wpsg_order::getInstance($order_id);
-				
-				foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-				
-					$order_product_info = null;
-					
-					$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-					if (!is_array($invoice_data)) $invoice_data = [];
-			
-					foreach ($invoice_data as $oi) {
-						
-						if ($oi['invoice_id'] === $_oInvoice->getId()) {
+				// Ãbersetzung
+				if ($this->shop->isOtherLang())
+				{
+				
+					$produkt_trans = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
+				
+					if ($produkt_trans['id'] > 0)
+					{
 							
-							$order_product_info = $oi; break;
+						$this->shop->view['basket']['produkte'][$k]['name'] = $produkt_trans['name'];
+						$this->shop->view['basket']['produkte'][$k]['beschreibung'] = $produkt_trans['beschreibung'];
+						$this->shop->view['basket']['produkte'][$k]['detailname'] = $produkt_trans['detailname'];
+				
+					}
+				
+				}
+								
+			}
+			
+			// Rechnungsnummer bilden
+			$rnr_format = $this->shop->get_option("wpsg_rechnungen_format");
+			if ($rnr_format == "") $rnr_format = "%nr%";
+				
+			// Neue Fortlaufende Nummer				
+			$rnr_nr = intval($this->shop->get_option("wpsg_rechnungen_start"));
+			if ($rnr_nr <= 0) $rnr_nr = 1;
+				
+			// Ersetzungen
+			$rnr = preg_replace("/\%nr\%/i", $rnr_nr, $rnr_format);
+			$rnr = preg_replace("/\%Jahr\%/i", date("Y"), $rnr);
+			$rnr = preg_replace("/\%Monat\%/i", date("m"), $rnr);
+			$rnr = preg_replace("/\%Tag\%/i", date("d"), $rnr);
 							
-						}
-						
-					}
-					
-					if ($order_product_info === null) die("-.-");
-					
-					$oCalculation->addProduct(
-						$oOrderProduct->getPrice($tax_view),
-						$tax_view,
-						$oOrderProduct->getProduct()->__get('mwst_key'),
-						$order_product_info['amount'],
-						$oOrderProduct->getProductKey(),
-						$oOrderProduct->getProductIndex(),
-						$oOrderProduct->getId(),
-						(($oOrderProduct->getProduct()->data['euleistungsortregel'] === '1') ? true : false)
-					);
-					
-					$p = [
-						'oOrderProduct' => $oOrderProduct,
-						'id' => $oOrderProduct->getProductKey(),
-						'product_index' => $oOrderProduct->getProductIndex(),
-						'productkey' => $oOrderProduct->getProductKey(),
-						'menge' => $order_product_info['amount'],
-						'price' => $oOrderProduct->getPrice($tax_view),
-						'weight' => $oOrderProduct->weight,
-						'anr' => $oOrderProduct->getProduct()->getNr(),
-						'mwst_value' => $oOrder->getInvoiceCountry()->getTax($oOrderProduct->getTaxKey()),
-						'preis_netto' => $oOrderProduct->getPrice(WPSG_NETTO),
-						'preis_brutto' => $oOrderProduct->getPrice(WPSG_BRUTTO),
-						'name' => $oOrderProduct->getProduct()->getProductName(false),
-						'detailname' => $oOrderProduct->getProduct()->getProductName(true),
-						'beschreibung' => $oOrderProduct->getDescription()
-					];
-
-					$sum['weight_gesamt'] += $p['weight'];
-
-					if ($oCalculationOrder->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B) {
-
-						$p['preis_brutto'] = $p['preis_netto'];
-						$p['mwst_value'] = 0;
-
-					}
-
-					// Ãbersetzung
-					if ($this->shop->isOtherLang()) {
-
-						$produkt_trans = $this->db->fetchRow("SELECT * FROM `" . WPSG_TBL_PRODUCTS . "` WHERE `lang_parent` = '" . wpsg_q($oOrderProduct->getProduct()->getId()) . "' AND `lang_code` = '" . wpsg_q($this->shop->getCurrentLanguageCode()) . "'");
-
-						if ($produkt_trans['id'] > 0) {
-
-							$p['name'] = $produkt_trans['name'];
-							$p['beschreibung'] = $produkt_trans['beschreibung'];
-							$p['detailname'] = $produkt_trans['detailname'];
-
-						}
-
-					}
-
-					$arProduct[] = $p;
-				
-				}
-				
-			}
- 
-			$oCalculation->setWeight($sum['weight_gesamt']);
-			
-			if (($_REQUEST['wpsg_rechnungen_shippay']??'0') === '1') {
-				
-				$oCalculation->addShipping(
-					$oOrder->__get('shipping_set'),
-					$oOrder->__get('shipping_bruttonetto'),
-					$oOrder->__get('shipping_tax_key'),
-					$oOrder->__get('shipping_key')
-				);
-				
-				$oCalculation->addPayment(
-					$oOrder->__get('payment_set'),
-					$oOrder->__get('payment_bruttonetto'),
-					$oOrder->__get('payment_tax_key'),
-					$oOrder->__get('payment_key')
-				);
-				
-			}
-
-			$this->shop->view['basket'] = [
-				'noMwSt' => (($oCalculation->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B)?'1':'0'),
-				'arCalculation' => $oCalculation->getCalculationArray(),
-				'produkte' => $arProduct,
-				'sum' => [
-					'preis_gesamt_netto' => $oCalculation->getSum(WPSG_NETTO),
-					'preis_gesamt_brutto' => $oCalculation->getSum(WPSG_BRUTTO)
-				],
-				'mwst' => []
-			];
-			
-			if ($oCalculation->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B) {
-			
-				$this->shop->view['basket']['arCalculation']['tax'][$this->shop->view['basket']['arCalculation']['shipping'][0]['tax_key']]['tax_value'] = 0;
-				
-			}
-			
-			// Die Templates brauchen es leider noch etwas anders
-			foreach ($this->shop->view['basket']['arCalculation']['tax'] as $tax_key => $tax) {
-				
-				if ($tax_key !== 0) {
-					
-					$this->shop->view['basket']['mwst'][] = [
-						'value' => $tax['tax_value'],
-						'sum' => $tax['sum']
-					];
-					
-				}
-				
-			}
-			
-			if ($this->shop->view['basket']['arCalculation']['sum']['discount_netto'] < 0) {
-				
-				if ($this->shop->getFrontendTaxview() === WPSG_NETTO || $oCalculation->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2C)
-					$this->shop->view['basket']['sum']['preis_rabatt'] = -1 * $this->shop->view['basket']['arCalculation']['sum']['discount_netto'];
-				else
-					$this->shop->view['basket']['sum']['preis_rabatt'] = -1 * $this->shop->view['basket']['arCalculation']['sum']['discount_brutto'];
-				
-			}
-			
-			if (($_REQUEST['wpsg_rechnungen_shippay']??'0') === '1') {
-				
-				$this->shop->view['basket']['sum']['preis_shipping'] = $oCalculation->getShippingSum(WPSG_BRUTTO);
-				$this->shop->view['basket']['sum']['preis_payment'] = $oCalculation->getPaymentSum(WPSG_BRUTTO);
-				
-			}
-			
-			if ($_oInvoice !== null) {
-				
-				$rnr = $_oInvoice->getNr();
-				
-			} else {
-				
-				$rnr = \wpsg\wpsg_invoice::getNextInvoiceNumber($order_id, $preview !== true);				 
-				$oInvoice = null;
-				
-			}
-			
-			if ($preview) {
+			if ($preview)
+			{
 				
 				$this->shop->view['preview'] = true;
-				
-				if (isset($_REQUEST['rnr'])) $this->shop->view['rnr'] = $_REQUEST['rnr'];
-				else $this->shop->view['rnr'] = $rnr.' - '.__('Vorschau', 'wpsg');
-				
+				$this->shop->view['rnr'] = $rnr.' - '.__('Vorschau', 'wpsg');
 				$r_id = "Vorschau";
-				
-			} else if ($_oInvoice === null) {
-				
+												
+			}
+			else
+			{
+				 
 				$this->shop->view['preview'] = false;
 				$this->shop->view['rnr'] = $rnr;
-				 
+				
+				$this->shop->update_option("wpsg_rechnungen_start", ($rnr_nr + 1));
+				
 				// Status Ã€ndern
-				if ($_REQUEST['wpsg_rechnungen_status'] == "1") {
-					
-					$this->shop->setOrderStatus($order_id, wpsg_sinput("key", $_REQUEST['wpsg_rechnungen_status_neu']), false);
-					
-				}
-
+				if ($_REQUEST['wpsg_rechnungen_status'] == "1")
+				{
+						
+					$this->shop->setOrderStatus($order_id, $_REQUEST['wpsg_rechnungen_status_neu'], false);
+											
+				}
+ 
 				$r_id = $this->db->importQuery(
 					WPSG_TBL_RECHNUNGEN,
 					array(
 						"rnr" => $rnr,
+						"o_id" => $order_id,
 						"datum" => "NOW()"
 					)
 				);
 				
-				$oInvoice = \wpsg\wpsg_invoice::getInstance($r_id);
-                $oInvoice->setOrder($order_id);
-				
-				foreach ($arProduct as $product_data) {
-					
-					$oInvoice->addProduct(
-						$product_data['oOrderProduct']->getId(),
-						$product_data['menge'],
-						$product_data['preis_netto'],
-						$product_data['preis_brutto'],
-						$product_data['mwst_value']
-					);
-					
-				}
-				
-				$oInvoice->setMeta('basket_data', json_encode($this->shop->view['basket']));
-				$oInvoice->setMeta('version', '2');
-				
-				if (($_REQUEST['wpsg_rechnungen_shippay']??'0') === '1') {
-				
-					$oInvoice->setMeta('include_shipping', '1');
-					
-				}
-				
-			} else {
-				
-				$rnr = $_oInvoice->getNr();
-				$r_id = $_oInvoice->getId();
-				$oInvoice = $_oInvoice;
-				
-				$this->shop->view['preview'] = false;
-				$this->shop->view['rnr'] = $rnr;
-				
-				
-			}
-
-            $this->shop->view['oInvoice'] = $oInvoice;
+			}
+			
 			$this->shop->view['filename'] = $r_id;
 			$this->shop->view['filename_out'] = $rnr.'.pdf';
@@ -1607,60 +941,80 @@
 			$this->shop->view['storno'] = false;
 			$this->shop->view['invoice'] = true;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/rechnung_pdf.phtml');	
+ 
+			if (!$preview)
+			{
+				 
+				if (@$_REQUEST['wpsg_rechnungen_sendmail'] == "1")
+				{
+					
+					//Mail versenden
+					
+					/**
+					 * Damit alte Rechnungen noch versÃ€ndet werden
+					 */
+					if (file_exists($this->getFilePath($order_id).$r_id.'.pdf'))
+					{
+					
+						$file = $this->getFilePath($order_id).$r_id.'.pdf';
+					
+					}
+					else if (file_exists($this->getFilePath($order_id).$rnr.'.pdf'))
+					{
+						
+						$file = $this->getFilePath($order_id).$rnr.'.pdf';				
+						
+					}
+					else if (file_exists($this->getFilePath($order_id).'R'.$r_id.'.pdf'))
+					{
+						
+						$file = $this->getFilePath($order_id).'R'.$r_id.'.pdf';
+						
+					}
+					else
+					{
+						
+						$file = $this->getFilePath($order_id).'R'.$rnr.'.pdf'; 
+						
+					}  
+ 
+					$file = $this->copyTemp($file, $rnr);
+					
+					$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/rechnungsmail.phtml", false);
+
+					if ($this->shop->get_option('wpsg_htmlmail') === '1')
+					{
+						
+						$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/rechnungsmail_html.phtml', false);
+						
+					}
+					else
+					{
+						
+						$mail_html = false;
+						
+					}
+					
+					$to = $_REQUEST['wpsg_rechnungen_email'];
+													 
+					$header = "";
+					$arFiles = array($file);
 	 
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/invoice_pdf.phtml');
- 
-			if (!$preview && $_oInvoice === null) {
-				
-				foreach ($this->shop->view['basket']['produkte'] as $p) {
-					
-					/** @var wpsg_order_product $oOrderProduct */
-					$oOrderProduct = $p['oOrderProduct'];
-					
-					$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-					if (!is_array($invoice_data)) $invoice_data = [];
-					
-					$invoice_data[] = [
-						'amount' => $p['menge'],
-						'invoice_id' => $r_id
-					];
-					
-					$oOrderProduct->setMeta('wpsg_mod_rechnungen_data', json_encode($invoice_data));
-					
-				}
-				
-				if (@$_REQUEST['wpsg_rechnungen_sendmail'] == "1") {
-					
-					//Mail versenden
-					
-					$oInvoice = \wpsg\wpsg_invoice::getInstance(intval($r_id));
-					
-					$file = $oInvoice->getFilePath();
-					
-					$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/invoicemail.phtml", false);
-
-					if ($this->shop->get_option('wpsg_htmlmail') === '1') { $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/invoicemail_html.phtml', false); }
-					else { $mail_html = false; }
-					
-					$empfaenger = $_REQUEST['wpsg_rechnungen_email'];
-
-					$arFiles = [
-						$rnr.'.pdf' => $file
-					];
-	 
-					if ($this->shop->get_option('wpsg_widerrufsformular_invoice') === '1' && wpsg_isSizedString($this->shop->get_option('wpsg_revocationform'))) {
+					if ($this->shop->get_option('wpsg_widerrufsformular_invoice') === '1' && wpsg_isSizedString($this->shop->get_option('wpsg_revocationform')))
+					{
 					
 						$revocationFile = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform');
 					
-						if (file_exists($revocationFile) && is_file($revocationFile)) {
-							
+						if (file_exists($revocationFile) && is_file($revocationFile))
+						{
+								
 							$arFiles[] = $revocationFile;
-							
+								
 						}
 					
 					}
 					
-					$this->shop->sendMail($mail_text, $empfaenger, 'invoicemail', $arFiles, $order_id, false, $mail_html, false, [
-						'invoice_id' => $oInvoice->getId()
-					]);
+					$this->shop->sendMail($mail_text, $to, 'rechnungsmail', $arFiles, $order_id, false, $mail_html);
 
 					// TemporÃ€re Rechnung lÃ¶schen
@@ -1673,19 +1027,20 @@
 						"cdate" => "NOW()",
 						"o_id" => wpsg_q($this->shop->view['data']['id']),
-					    "title" => wpsg_q(wpsg_translate(__('Rechnungsmail an #1#', 'wpsg'), $empfaenger)),
+						"title" => wpsg_q(wpsg_translate(__('Rechnungsmail an #1#', 'wpsg'), $to)),				
 						"mailtext" => wpsg_q($mail_text)
-					));
-					
-				}
-				
+					));						
+									
+				}
+								
 				// Url Benachrichtigung
-				if (wpsg_isSizedString($_REQUEST['wpsg_rechnungen_url'], '1')) {
+				if ($_REQUEST['wpsg_rechnungen_url'] == '1')
+				{
 					
 					$this->shop->notifyURL(
-						$this->shop->get_option('wpsg_rechnungen_url'),
-						false,
-						false,
-						$this->shop->view['data']['id'],
-						2
+						$this->shop->get_option('wpsg_rechnungen_url'), 
+						false, 
+						false, 
+						$this->shop->view['data']['id'], 
+						2						
 					);
 					
@@ -1696,372 +1051,149 @@
 			$this->shop->restoreTempLocale();
 			
-		}
-
-		public function writeMultiRechnung($order_ids, $preview) {
-			
-			$this->shop->view['multi_data']['oids'] = $order_ids;
-
-			// Select first order for Multiinvoice header and footer
-			$order_id = array_values($order_ids)[0];
- 
-			$this->shop->view['data'] = $this->db->fetchRow("
+		} // private function writeRechnung($order_id)
+
+		public function setOrderStatus($order_id, $status_id, $inform)
+		{
+			
+			if ($this->shop->get_option('wpsg_mod_rechnungen_auto') != '2' || $status_id != 100) return;
+			
+			$this->writeAutoRechnung($order_id);
+			
+		} // public function setOrderStatus($order_id, $status_id, $inform)
+		
+		public function stornoAction()
+		{
+
+			$order_data = $this->shop->cache->loadOrder($_REQUEST['edit_id']);
+			
+			// Wurde die Bestellung in einer anderen Sprache gemacht
+			if (trim($order_data['language']) != '') $this->shop->setTempLocale($order_data['language']);
+			
+			$custom_data = @unserialize($this->shop->view['data']['custom_data']);
+			$this->shop->view['basket'] = $custom_data['basket'];
+			
+			// Rechnung laden die storniert werden soll
+			$rechnung = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `o_id` = '".wpsg_q($_REQUEST['edit_id'])."' AND `storno` = '0000-00-00 00:00:00'");
+
+			// Letzte Rechnungsnummer
+			$last_rnr = $this->db->fetchOne("
 				SELECT
-					O.*
+					`rnr`
 				FROM
-					`".WPSG_TBL_ORDER."` AS O
+					`".WPSG_TBL_RECHNUNGEN."`
 				WHERE
-					O.`id` = '".wpsg_q($order_id)."'
-			");
-
-			// Wurde die Bestellung in einer anderen Sprache gemacht
-			if (trim($this->shop->view['data']['language']) != '') $this->shop->setTempLocale($this->shop->view['data']['language']);
-			
-			// GET Kundenadresse
-			$this->getAdresse($this->shop->view['data']['k_id']);
-			
-			// GET Rechnungsdatum
-			if (wpsg_checkInput($_REQUEST['wpsg_Multirechnung_datum'], WPSG_SANITIZE_DATE_EN)) $this->shop->view['rDatum'] = date('d.m.Y', strtotime($_REQUEST['wpsg_Multirechnung_datum']));
-			else throw \wpsg\Exception::getSanitizeException();
-
-			// GET Faelligkeitsdatum
-			if (($_REQUEST['wpsg_Multirechnung_faelligkeit']??'') == '1') {
-	
-				if (wpsg_checkInput($_REQUEST['wpsg_Multirechnung_faelligkeitsdatum'], WPSG_SANITIZE_DATE_EN)) $this->shop->view['faelligkeitdatum'] = date('d.m.Y', strtotime($_REQUEST['wpsg_Multirechnung_faelligkeitsdatum']));
-				else throw \wpsg\Exception::getSanitizeException();
-				
-			}
-		
-			// GET FuÃtext
-			$this->shop->view['fussText'] = $this->shop->replaceUniversalPlatzhalter(wpsg_sinput("text_field", @$_REQUEST['wpsg_Multirechnung_fusstext']), $order_id);
-
-			$arCalculationSum = [
-				'tax' => [],
-				'coupon' => [],
-				'sum' => [
-					'netto' => 0,
-					'brutto' => 0,
-					'topay_netto' => 0,
-					'topay_brutto' => 0,
-					'tax' => 0
-				]
-			];
-
-			// DATA FOREACH ORDER IN INVOICE
-			foreach ($order_ids as $o_id) {
-
-				// GET ORDER
-				$oOrder = wpsg_order::getInstance($o_id);
-
-				// NEW CALCULATION
-				$oCalculation = new \wpsg\wpsg_calculation();
-				$oCalculation->fromDB($o_id);
-
-				if (!$preview) {
-					
-					// Status Ã€ndern
-					if ($_REQUEST['wpsg_Multirechnung_status'] === "1") {
-						
-						$this->shop->setOrderStatus($o_id, intval($_REQUEST['wpsg_Multirechnung_status_neu']), false);
-						
-					}
-					
-					// Url Benachrichtigung
-					if (wpsg_isSizedString($_REQUEST['wpsg_Multirechnung_url'], '1')) {
-						
-						$this->shop->notifyURL(
-							$this->shop->get_option('wpsg_rechnungen_url'),
-							false,
-							false,
-							$o_id,
-							2
-						);
-						
-					}
-					
-				}
-				
-				$arCalculation = $oCalculation->getCalculationArray();
-				
-				foreach ($arCalculation['coupon'] as $c) $arCalculationSum['coupon'][] = $c;
-				
-				$this->shop->view['multi_data']['order_data'][$o_id] = [
-					'oCalculation' => $oCalculation,
-					'arCalculation' => $arCalculation,
-					'oOrder' => $oOrder
-				];
-				
-				foreach ($arCalculation['tax'] as $k => $v) {
-					
-					if (!isset($arCalculationSum['tax'][$k])) $arCalculationSum['tax'][$k] = $v;
-					else {
-						
-						$arCalculationSum['tax'][$k]['netto'] += $v['netto'];
-						$arCalculationSum['tax'][$k]['brutto'] += $v['brutto'];
-						$arCalculationSum['tax'][$k]['sum'] += $v['sum'];
-						
-					}
-					
-					if ($k !== 0) {
-						
-						$arCalculationSum['sum']['tax'] += $v['sum'];
-						
-					}
-					
-				}
-				
-				$arCalculationSum['sum']['netto'] += $arCalculation['sum']['netto'];
-			    $arCalculationSum['sum']['brutto'] += $arCalculation['sum']['brutto'];
-			    $arCalculationSum['sum']['topay_netto'] += $arCalculation['sum']['topay_netto'];
-			    $arCalculationSum['sum']['topay_brutto'] += $arCalculation['sum']['topay_brutto'];
-				
-			}
-
-			$this->shop->view['arCalculationSum'] = $arCalculationSum;
- 
-			$rnr = \wpsg\wpsg_invoice::getNextInvoiceNumber(0, $preview !== true); 
-			
-			if ($preview) {
-				
-				$this->shop->view['preview'] = true;
-				$this->shop->view['rnr'] = $rnr.' - '.__('Vorschau', 'wpsg');
-				
-				$r_id = "Vorschau";
-				
-			} else {
-				
-				$this->shop->view['preview'] = false;
-				$this->shop->view['rnr'] = $rnr; 
-				
-				$r_id = $this->db->importQuery(
+					`storno` = '0000-00-00 00:00:00' AND 
+					`rnr` != '' AND
+					`o_id` = '".wpsg_q($_REQUEST['edit_id'])."'
+			"); 
+						
+			if (isset($_REQUEST['form_submit_preview'])) $bPreview = true;
+			else $bPreview = false;
+			
+			if (!$bPreview)
+			{
+			
+				$this->db->UpdateQuery(
 					WPSG_TBL_RECHNUNGEN,
 					array(
-						"rnr" => $rnr,
-						"datum" => "NOW()"
-					)
+						"storno" => "NOW()"					
+					),
+					"`o_id` = '".wpsg_q($_REQUEST['edit_id'])."' AND `gnr` = ''"
 				);
-
-				$oInvoice = \wpsg\wpsg_invoice::getInstance($r_id);
-
-                foreach ($order_ids as $order_id) {
-
-                    $oInvoice->setOrder($order_id);
-
-                }
-
-            $oInvoice->setMeta('version', '3');
-				
-				foreach ($order_ids as $o_id) {
-
-					$oOrder = wpsg_order::getInstance($o_id);
-					
-					foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-						
-						$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-						if (!is_array($invoice_data)) $invoice_data = [];
-						
-						$invoice_data[] = [
-							'amount' => $oOrderProduct->getAmount(),
-							'invoice_id' => $oInvoice->getId()
-						];
-						
-						$oOrderProduct->setMeta('wpsg_mod_rechnungen_data', json_encode($invoice_data));
-						
-					}
-
-				}
-
-				$this->shop->view['file_path'] = $oInvoice->getFilePath(true);
-
-			}
-			
-			$this->shop->view['filename'] = $r_id;
-			$this->shop->view['filename_out'] = $rnr.'.pdf';
-
-			$this->shop->view['oOrder'] = $this->shop->cache->loadOrderObject($order_id);
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/multi_invoice_pdf.phtml');
-
-			if (!$preview) {
-			
-				if (@$_REQUEST['wpsg_Multirechnung_sendmail'] == "1") {
-					
-					//Mail versenden
-					$oInvoice = \wpsg\wpsg_invoice::getInstance($r_id);
-					$oInvoice->setMeta('version', '3');
-
-					$file = $oInvoice->getFilePath();
-					// $file = $this->copyTemp($file, $rnr);
-
-					$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/multi_invoicemail.phtml", false);
-
-					if ($this->shop->get_option('wpsg_htmlmail') === '1') { $mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/multi_invoicemail_html.phtml', false); }
-					else { $mail_html = false; }
-					
-					$empfaenger = $_REQUEST['wpsg_Multirechnung_email'];
-					
-					$header = "";
-					
-					$arFiles = [
-						$rnr.'.pdf' => $file
-					];
-
-					if ($this->shop->get_option('wpsg_widerrufsformular_invoice') === '1' && wpsg_isSizedString($this->shop->get_option('wpsg_revocationform'))) {
-					
-						$revocationFile = WPSG_PATH_UPLOADS.'wpsg_revocation/'.$this->shop->get_option('wpsg_revocationform');
-					
-						if (file_exists($revocationFile) && is_file($revocationFile)) {
 							
-							$arFiles[] = $revocationFile;
-							
-						}
-					
-					}
-
-					$this->shop->sendMail($mail_text, $empfaenger, 'invoicemail', $arFiles, $order_id, false, $mail_html, false, [
-						'invoice_id' => $oInvoice->getId()
-					]);
-
-					// TemporÃ€re Rechnung lÃ¶schen
-					@unlink($file);
+				if ($_REQUEST['wpsg_rechnungen_gutschrift'] == "0")
+				{
+				
+					// Status der Bestellung auf storniert Ã€ndern
+					$this->shop->setOrderStatus($_REQUEST['edit_id'], 500, false);
+					
+				}
+				
+			}
+			
+			if ($_REQUEST['wpsg_rechnungen_gutschrift'] == "1" || $_REQUEST['wpsg_rechnungen_gutschrift'] == "2")
+			{
+ 									
+				// Gutschriftnummer bilden
+				$gnr_format = $this->shop->get_option("wpsg_gutschrift_format");
+				if ($gnr_format == "") $gnr_format = "%nr%";
+					
+				// Neue Fortlaufende Nummer				
+				$gnr_nr = intval($this->shop->get_option("wpsg_gutschrift_start"));
+				if ($gnr_nr <= 0) $gnr_nr = 1;
+					
+				// StornierungsgebÃŒhr
+				$storno_fee = $_REQUEST['wpsg_mod_rechnungen_fee'];
+				
+				// Ersetzungen
+				$gnr = preg_replace("/\%nr\%/i", $gnr_nr, $gnr_format);
+				$gnr = preg_replace("/\%Jahr\%/i", date("Y"), $gnr);
+				$gnr = preg_replace("/\%Monat\%/i", date("m"), $gnr);
+				$gnr = preg_replace("/\%Tag\%/i", date("d"), $gnr);
+
+				if (!$bPreview)
+				{
+				
+					$g_id = $this->db->ImportQuery(WPSG_TBL_RECHNUNGEN, array(
+						"o_id" => $_REQUEST['edit_id'],
+						"datum" => "NOW()",
+						"rnr" => "",
+						"gnr" => $gnr,
+						"storno_fee" => wpsg_q($storno_fee)
+					));
+					
+					$this->shop->update_option("wpsg_gutschrift_start", ($gnr_nr + 1));
+					
+				}
+				else
+				{
+									
+					$g_id = $gnr_nr;
+				
+				}
+ 			
+				$this->writeGutschrift($_REQUEST['edit_id'], $g_id, $storno_fee, $bPreview);
+				
+				if ($_REQUEST['wpsg_rechnungen_gutschrift'] == "2")
+				{
+												
+					// Mail an Kunden senden
+					//public function mail($e_mail, $subject, $message, $headers, $anhang = array())
+					$this->shop->view['storno_fee'] = $storno_fee;
+					
+					$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/gutschriftmail.phtml", false);
+
+					if ($this->shop->get_option('wpsg_htmlmail') == '1')
+					{
+						
+						$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/gutschriftmail_html.phtml', false);
+						
+					}
+					else
+					{
+						
+						$mail_html = false;
+						
+					}
+					
+					if (!$bPreview) 
+					{
+
+						$file = $this->getFilePath($_REQUEST['edit_id']).'/'.$g_id.'.pdf';						
+						$file = $this->copyTemp($file, $gnr);
+					
+						$arFiles = array($file);						
+						$this->shop->sendMail($mail_text, $this->shop->view['kunde']['email'], 'gutschriftmail', $arFiles, false, false, $mail_html);
+					
+						// TemporÃ€re Rechnung lÃ¶schen
+						@unlink($file);
+						
+					}
 					
 					$this->shop->restoreTempLocale();
 					
-					// Log in jede Bestellung eintragen
-					foreach ($order_ids as $order_id) {
-						
-						// In Log eintragen
-						$this->db->importQuery(WPSG_TBL_OL, array(
-							"cdate" => "NOW()",
-							"o_id" => wpsg_q($order_id),
-						    "title" => wpsg_q(wpsg_translate(__('Rechnungsmail an #1#', 'wpsg'), $empfaenger)),
-							"mailtext" => wpsg_q($mail_text)
-						));
-
-					}
-					
-				}
-				
-			}
-
-			$this->shop->restoreTempLocale();
-
-		} // public function writeMultiRechnung()
-
-		public function stornoAction() {
-			
-			$bOK = false;
-			
-			// PrÃŒfen das Produkte gesetzt sind
-			foreach ($_REQUEST['storno_products']??[] as $order_product_id => $order_product_info) {
-			
-				if ($order_product_info['set'] === '1') {
-					
-					$bOK = true;
-					
-				}
-				
-			}
-			
-			if (!$bOK) throw new \Exception(__('Kein Produkt ausgewÃ€hlt!', 'wpsg'));
-			
-			$order_id = intval($_REQUEST['edit_id']);
-			$order_data = $this->shop->cache->loadOrder($order_id);
-			
-			// Wurde die Bestellung in einer anderen Sprache gemacht
-			if (trim($order_data['language']) != '') $this->shop->setTempLocale($order_data['language']);
-			
-			$custom_data = @unserialize($this->shop->view['data']['custom_data']);
-			$this->shop->view['basket'] = $custom_data['basket'];
-			
-			if (isset($_REQUEST['wpsg_storno_preview'])) $bPreview = true;
-			else $bPreview = false;
-			
-			// Gutschriftnummer bilden
-			$gnr_format = $this->shop->get_option("wpsg_gutschrift_format");
-			if ($gnr_format == "") $gnr_format = "%nr%";
-			
-			// Neue Fortlaufende Nummer
-			$gnr_nr = intval($this->shop->get_option("wpsg_gutschrift_start"));
-			if ($gnr_nr <= 0) $gnr_nr = 1;
-			
-			// StornierungsgebÃŒhr
-			if (($_REQUEST['storno_fee_set']??'0') === '1') $storno_fee = $_REQUEST['storno_fee_value'];
-			else $storno_fee = '';
-			
-			$this->shop->view['storno_fee'] = $storno_fee;
-			
-			// Ersetzungen
-			$gnr = preg_replace("/\%nr\%/i", $gnr_nr, $gnr_format);
-			$gnr = preg_replace("/\%Jahr\%/i", date("Y"), $gnr);
-			$gnr = preg_replace("/\%Monat\%/i", date("m"), $gnr);
-			$gnr = preg_replace("/\%Tag\%/i", date("d"), $gnr);
-
-			$gnr = $this->shop->replaceUniversalPlatzhalter($gnr, $_REQUEST['edit_id']);
-			
-			if (!$bPreview) {
-				
-				$g_id = $this->db->ImportQuery(WPSG_TBL_RECHNUNGEN, array(
-					"datum" => "NOW()",
-					"rnr" => "",
-					"gnr" => $gnr,
-					"storno_fee" => wpsg_q($storno_fee)
-				));
-
-                $oInvoice = \wpsg\wpsg_invoice::getInstance($g_id);
-                $oInvoice->setOrder(intval($_REQUEST['edit_id']));
-
-				$this->shop->update_option("wpsg_gutschrift_start", ($gnr_nr + 1));
-				
-			} else {
-				
-				$g_id = $gnr_nr;
-			
-			}
- 		
-			$this->writeGutschrift($_REQUEST['edit_id'], $g_id, $storno_fee, $bPreview);
-			
-			if (isset($_REQUEST['storno_send'])) {
-				
-				// Mail an Kunden senden
-				//public function mail($e_mail, $subject, $message, $headers, $anhang = array())
-				//$this->shop->view['storno_fee'] = $storno_fee;
-				
-				$mail_text = $this->shop->render(WPSG_PATH_VIEW."/mods/mod_rechnungen/accountingmail.phtml", false);
-
-				if ($this->shop->get_option('wpsg_htmlmail') == '1') {
-					
-					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_rechnungen/accountingmail_html.phtml', false);
-					
-				} else {
-					
-					$mail_html = false;
-					
-				}
-				
-				if (!$bPreview) {
-					
-					$oInvoice = \wpsg\wpsg_invoice::getInstance(intval($g_id));
-					$file = $oInvoice->getFilePath();
-					
-					// $file = $this->copyTemp($file, $gnr);
-				
-					$to = $_REQUEST['storno_mail'];
-					
-					$arFiles = [
-						$gnr.'.pdf' => $file
-					];
-					$this->shop->sendMail($mail_text, $to, 'accountingmail', $arFiles, false, false, $mail_html);
-				
-					// TemporÃ€re Rechnung lÃ¶schen
-					@unlink($file);
-					
-				}
-				
-				$this->shop->restoreTempLocale();
-				
-				if (!$bPreview) {
-					
-					$subject = wpsg_translate(__('Rechnungskorrekturmail an #1#', 'wpsg'), $this->shop->view['kunde']['email']);
-					
+					if ($bPreview) $subject = wpsg_translate(__('Rechnungskorrekturmail an #1# (Vorschau)', 'wpsg'), $this->shop->view['kunde']['email']);
+					else $subject = wpsg_translate(__('Rechnungskorrekturmail an #1#', 'wpsg'), $this->shop->view['kunde']['email']);
+										
 					// In Bestelllog eintragen
 					$this->db->ImportQuery(WPSG_TBL_OL, array(
@@ -2071,167 +1203,121 @@
 						"mailtext" => $mail_text
 					));
-
-				}
-
-			}
+  
+				} 
+									
+				die();
+				
+			} // gutschrift 
 			
 			$this->shop->restoreTempLocale();
 			
-			exit;
+			$this->shop->addBackendMessage(__('Rechnung wurde erfolgreich storniert', 'wpsg'));
+						
+			$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$_REQUEST['edit_id']); 
 			
 		}
 		
-		public function setOrderStatus_after($order_id, $status_id, $inform) {
-			
-			if ($this->shop->get_option('wpsg_mod_rechnungen_auto') != '2' || $status_id != 100) return;
-			
-			$this->writeAutoRechnung($order_id);
-			
-		} // public function setOrderStatus($order_id, $status_id, $inform)
-		
 		/**
-		 * @param wpsg_order_product $oOrderProduct
+		 * Kopiert eine Datei temporÃ€r und benennt sie anhand der Rechnugnsnummer um
 		 */
-		public function getAmountToStorno($oOrderProduct) {
-			
-			$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-			
-			if ($invoice_data !== null) {
-			
-				$amount_storno = 0;
-				
-				foreach ($invoice_data as $id) {
-					
-					try {
-					
-						$oInvoice = \wpsg\wpsg_invoice::getInstance($id['invoice_id']);
-						
-						if ($oInvoice->isInvoice()) {
-						
-							$amount_storno += $id['amount'];
-							
-						} else if ($oInvoice->isStorno()) {
-							
-							$amount_storno -= $id['amount'];
-							
-						}
-
-					} catch (\Exception $e) { }
-					
-				}
-				
-				return $amount_storno;
-				
-			} else {
-				
-				return $oOrderProduct->getAmount();
-				
-			}
-			
-		}
-
+		private function copyTemp($file, $rnr)
+		{
+			
+			$path = $this->shop->getTempDir();
+			
+			wpsg_copy($file, $path.'/'.$rnr.'.pdf');
+
+			return $path.'/'.$rnr.'.pdf';
+			
+		} // private function copyTemp($file, $r_id)
+		
 		/**
-		 * @param int $order_id
-		 * @return \wpsg\wpsg_invoice[]
+		 * Startet den Download einer Rechnung wird im Frontend wie im Backend verwendet
 		 */
-		public function getInvoiceToOrder($order_id) {
-
-            return \wpsg\wpsg_invoice::findByOrderId($order_id);
-			
-		}
-		
-		/**
-		 * @param wpsg_order_product $oOrderProduct
-		 * @return \wpsg\wpsg_invoice[]
-		 */
-		public function getInvoiceToOrderProduct($oOrderProduct) {
-			
-			$arReturn = [];
-			
-			$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-
-            if (is_array($invoice_data)) {
-
-                foreach ($invoice_data as $id) {
-
-                    try {
-
-                        $oInvoice = \wpsg\wpsg_invoice::getInstance($id['invoice_id']);
-
-                        $arReturn[] = $oInvoice;
-
-                    } catch (\Exception $e) {
-                    }
-
-                }
-
-            }
-			
-			return $arReturn;
-			
-		}
-		
-		/**
-		 * @param wpsg_order_product $oOrderProduct
-		 */
-		public function getAmountToInvoice($oOrderProduct) {
-			
-			$invoice_data = json_decode($oOrderProduct->getMeta('wpsg_mod_rechnungen_data', false, 'null'), true);
-			
-			if ($invoice_data !== null) {
-			
-				$amount_invoiced = 0;
-				
-				foreach ($invoice_data as $id) {
-					
-					try {
-					
-						$oInvoice = \wpsg\wpsg_invoice::getInstance($id['invoice_id']);
-					
-						if ($oInvoice->isInvoice()) {
-						
-							$amount_invoiced += $id['amount'];
-							
-						}
-
-					} catch (\Exception $e) { }
-					
-				}
-				
-				return $oOrderProduct->getAmount() - $amount_invoiced;
-				
-			} else {
-				
-				return $oOrderProduct->getAmount();
-				
-			}
-			
-		}
-		 
-        /**
-         * Startet den Download einer Rechnung. Wird im Frontend wie im Backend verwendet
-         */
-        private function doDownload(int $r_id, int $profil_id = 0): void {
- 
-			$oInvoice = \wpsg\wpsg_invoice::getInstance($r_id);
-			$file_path = $oInvoice->getFilePath(true);
-			$file_name_raw = basename($file_path);
-			
-			if (!file_exists($file_path)) throw new \Exception(
-				wpsg_translate(
-					__('Rechnung #1# existiert nicht im Dateisystem.', 'wpsg'), $oInvoice->getNr()
-				)
-			);
-			
-			$file_path = \wpsg\mod_invoice\eInvoice::writeEInvoice($oInvoice->getOrder()->getId(), $oInvoice->getId(), $profil_id);
-			
-			header('Content-Disposition: inline; filename="'.$file_name_raw.'"');
+		private function doDownload($r_id)
+		{
+			
+			$rechnung = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_RECHNUNGEN."` WHERE `id` = '".wpsg_q($r_id)."'");
+			
+			if ($rechnung['gnr'] != "")
+			{
+				
+				/**
+				 * Damit alte Rechnungskorrekturen noch angezeigt werden
+				 */
+				if (file_exists($this->getFilePath($rechnung['o_id']).$rechnung['id'].'.pdf'))
+				{
+					
+					$file = $this->getFilePath($rechnung['o_id']).$rechnung['id'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['gnr'].'.pdf"');
+					
+				}
+				else if (file_exists($this->getFilePath($rechnung['o_id']).$rechnung['gnr'].'.pdf'))
+				{
+					
+					$file = $this->getFilePath($rechnung['o_id']).$rechnung['gnr'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['gnr'].'.pdf"');
+				
+				}
+				else if (file_exists($this->getFilePath($rechnung['o_id']).'G'.$rechnung['id'].'.pdf'))
+				{
+					
+					$file = $this->getFilePath($rechnung['o_id']).'G'.$rechnung['id'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['gnr'].'.pdf"');
+					
+				}
+				else
+				{	
+									
+					$file = $this->getFilePath($rechnung['o_id']).'G'.$rechnung['gnr'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['gnr'].'.pdf"');
+					
+				}
+				
+			}
+			else 
+			{
+				
+				/**
+				 * Damit alte Rechnungen noch angezeigt werden
+				 */
+				if (file_exists($this->getFilePath($rechnung['o_id']).$rechnung['id'].'.pdf'))
+				{
+						
+					$file = $this->getFilePath($rechnung['o_id']).$rechnung['id'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['rnr'].'.pdf"');
+						
+				}
+				else if (file_exists($this->getFilePath($rechnung['o_id']).$rechnung['rnr'].'.pdf'))
+				{
+					
+					$file = $this->getFilePath($rechnung['o_id']).$rechnung['rnr'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['rnr'].'.pdf"');						
+					
+				}
+				else if (file_exists($this->getFilePath($rechnung['o_id']).'R'.$rechnung['id'].'.pdf'))
+				{
+					
+					$file = $this->getFilePath($rechnung['o_id']).'R'.$rechnung['id'].'.pdf';
+					header('Content-Disposition: attachment; filename="'.$rechnung['rnr'].'.pdf"');
+					
+				}
+				else
+				{
+					
+					$file = $this->getFilePath($rechnung['o_id']).'R'.$rechnung['rnr'].'.pdf'; 
+					header('Content-Disposition: attachment; filename="'.$rechnung['rnr'].'.pdf"');
+					
+				}
+				
+			}
+			
 			header("Cache-Control: no-cache, must-revalidate");
-			header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
-			header('Content-type: application/pdf');
-			
-			readfile($file_path); exit;
-
-        }
+			header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 
+			header('Content-type: application/pdf'); 
+				
+			die(file_get_contents($file));
+			
+		} // private function doDownload($r_id)
 		
 		/**
@@ -2240,5 +1326,5 @@
 		public function getFrontendLink($r_id)
 		{
-			
+			 
 			$hash = md5($this->shop->get_option('wpsg_salt').'wpsg'.$r_id.'wpsg'.$this->shop->get_option('wpsg_salt'));
 			
@@ -2248,7 +1334,77 @@
 			
 			return $url;
-			
+			 
 		} // public function getFrontendLink($r_id)
-
+		
+		/**
+		 * Gibt false (Wenn keine Rechnung aktiv) oder den Datensatz der aktuellen Rechnung zurÃŒck
+		 */
+		public function getOrderInvoice($order_id)
+		{
+			
+			$invoice_db = $this->db->fetchRow("
+				SELECT
+					R.*
+				FROM
+					`".WPSG_TBL_RECHNUNGEN."` AS R
+				WHERE
+					R.`o_id` = '".wpsg_q($order_id)."' AND
+					R.`storno` = '0000-00-00 00:00:00' AND
+					R.`gnr` = ''
+				ORDER BY
+					R.`datum` DESC
+				LIMIT
+					1
+			");
+			
+			if ($invoice_db['id'] > 0)
+			{
+				
+				return $invoice_db;
+				
+			}
+			
+			return false;
+			
+		} // public function getOrderInvoice($order_id)
+		
+		/**
+		 * Gibt false zurÃŒck (Wenn keine Rechnungskorrektur geschrieben ist, oder eine aktuelle Rechnung vorhanden ist) 
+		 * Ansonsten den Satz aus der Datenbank
+		 */
+		public function getOrderCredit($order_id)
+		{
+			
+			if ($this->getOrderInvoice($order_id) === false)
+			{
+				
+				$credit_db = $this->db->fetchRow("
+					SELECT
+						R.* 
+					FROM 
+						`".WPSG_TBL_RECHNUNGEN."` AS R
+					WHERE
+						R.`o_id` = '".wpsg_q($order_id)."' AND
+						R.`rnr` = '' AND
+						R.`gnr` != ''
+					ORDER BY
+						R.`datum` DESC
+					LIMIT
+						1
+				");
+				
+				if ($credit_db['id'] > 0)
+				{
+					
+					return $credit_db;
+					
+				}
+				
+			}
+			
+			return false;			
+			
+		} // public function getOrderCredit($order_id)
+		
 		/**
 		 * Gibt die Rechnungstexte in der korrekten Sprache und mit ÃŒbersetzen Platzhaltern zurÃŒck
@@ -2256,10 +1412,10 @@
 		public function getRechnungstexte($order_id)
 		{
-			
+									
 			$arTexte = $this->shop->get_option("wpsg_mod_rechnungen_texte");
 			
 			if (wpsg_isSizedArray($arTexte))
 			{
-				
+						
 				foreach ($arTexte as $k => $v)
 				{
@@ -2324,81 +1480,103 @@
 			
 		} // function foottext_list()
-
-        public function getPaperPath($url = false) {
-
-            if ($this->shop->isMultiBlog()) {
-
-                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/';
-                $url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/';
-
-                if ($url) $strReturn = $url_content.'/';
- 				else $strReturn = $path.'/';
-
-            } else {
-
-                $path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_rechnungen/';
-
-                if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg/wpsg_rechnungen/';
-                else $strReturn = $path;
-
-            }
-
-            return $strReturn;
-
-        }
+		
+		/*
+		 * Gibt den Absoluten Pfad zurÃŒck wo die Rechnungen gespeichert sind
+ 		 * Ist der Parameter $url auf true so wird der relative Pfad fÃŒr die Ausgabe in URLs zurÃŒckgegeben
+ 		 */
+ 		public function getFilePath($order_id, $url = false)
+ 		{
+ 		  			
+ 			if ($this->shop->isMultiBlog())
+			{
+
+				$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/';
+				$htaccess = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/.htaccess';
+				 
+				$url_content = WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_rechnungen/';
+				
+				if ($url) $strReturn = $url_content.'/'.$order_id.'/';
+				else $strReturn = $path.'/'.$order_id.'/';
+								 
+			}
+			else
+			{
+				
+				$path = WPSG_PATH_CONTENT.'uploads/wpsg_rechnungen/';				
+				$htaccess = WPSG_PATH_CONTENT.'uploads/wpsg_rechnungen/.htaccess';
+				
+				if ($url) $strReturn = WPSG_URL_CONTENT.'uploads/wpsg_rechnungen/'.$order_id.'/';
+				else $strReturn = $path.$order_id.'/';
+				 
+			}
+			
+			if (!file_exists($path)) 
+			{
+				mkdir($path, 0777, true);
+			}
+			
+			/*
+ 			 * Zur Sicherheit ÃŒberprÃŒfe ich immer ob die .htaccess existiert
+ 			 */
+			
+			if (!file_exists($htaccess))
+			{
+				
+				$handle = fopen($htaccess, "w+");
+				
+				$content = '
+				
+Deny from all
+
+<Files wpsg_rechnungen_logo.jpg>
+allow from all
+</Files>
+
+<Files wpsg_rechnungen_bp.jpg>
+allow from all
+</Files>
+
+<Files wpsg_rechnungen_bp.pdf>
+allow from all
+</Files>
+
+				';
+							
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+			
+			return $strReturn;
+			 
+ 		} // private function getFilePath($produkt_id, $url = false)
 
  		/**
  		 * Wird beim schreiben der Rechnung nach der Bestellung bzw. Bezahlung aufgerufen
  		 */
- 		public function writeAutoRechnung($order_id) {
+ 		private function writeAutoRechnung($order_id)
+ 		{
  			
  			$order_data = $this->shop->cache->loadOrder($order_id);
  			$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
  			
-			$oOrder = wpsg_order::getInstance($order_id, true);
-			
-			$_REQUEST['invoice_products'] = [];
-			$_REQUEST['wpsg_rechnungen_datum'] = date('Y-m-d');
-			$_REQUEST['wpsg_rechnungen_discount_voucher_coupon'] = '1';
-			$_REQUEST['wpsg_rechnungen_shippay'] = '1';
-			
-			// Komplettauswahl simulieren
-		    foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-				
-				$_REQUEST['invoice_products'][$oOrderProduct->getId()] = [
-					'set' => '1',
-					'amount' => $oOrderProduct->getAmount()
-				];
-				
-		    }
-			
-			if ($this->shop->hasMod('wpsg_mod_rechnungen') && $this->shop->get_option('wpsg_mod_rechnungen_customermail') === '1') {
-				
-				/* Hier ist die Rechnung bereits an der BestellbestÃ€tigung angehÃ€ngt. */
-				
-				$_REQUEST['wpsg_rechnungen_sendmail'] = '0';
-				
-			} else {
-				
-				$_REQUEST['wpsg_rechnungen_sendmail'] = '1';
-				
-			}
- 		
-			$_REQUEST['wpsg_rechnungen_email'] = $customer_data['email'];
+ 			$_REQUEST['wpsg_rechnungen_sendmail'] = '1';
+ 			$_REQUEST['wpsg_rechnungen_email'] = wpsg_q($customer_data['email']);
  			$_REQUEST['wpsg_rechnungen_fusstext'] = '';
  			$_REQUEST['wpsg_rechnungen_faelligkeit'] = '0';
- 			$_REQUEST['wpsg_rechnungen_status'] = '1';
-			$_REQUEST['wpsg_rechnungen_status_neu'] = '110';
- 			
+ 			$_REQUEST['wpsg_rechnungen_datum'] = date('d.m.Y');
+ 				 
  			// FÃ€lligkeit anzeigen wenn ein Wert im Backend fÃŒr die Tage gesetzt ist.
- 			if (intval($this->shop->get_option('wpsg_rechnungen_faelligkeit')) > 0) {
+ 			if (intval($this->shop->get_option('wpsg_rechnungen_faelligkeit')) > 0)
+ 			{
  			
  				$_REQUEST['wpsg_rechnungen_faelligkeit'] = '1';
- 				$_REQUEST['wpsg_rechnungen_faelligkeitsdatum'] = date('Y-m-d', time() + intval($this->shop->get_option('wpsg_rechnungen_faelligkeit')) * 86400);
+ 				$_REQUEST['wpsg_rechnungen_faelligkeitsdatum'] = date('d.m.Y', time() + intval($this->shop->get_option('wpsg_rechnungen_faelligkeit')) * 86400);
  			
  			}
- 			
+ 				
  			// StandardfuÃtext setzen, sollte er definiert sein
- 			if ($this->shop->get_option('wpsg_rechnungen_foottext_standard') !== false) {
+ 			if ($this->shop->get_option('wpsg_rechnungen_foottext_standard') !== false)
+ 			{
  			
  				$foot_text = $this->shop->get_option("wpsg_rechnungen_footer");
@@ -2408,23 +1586,16 @@
  				if (isset($foot_text[$this->shop->get_option('wpsg_rechnungen_foottext_standard')]))
  				{
- 					
+ 						
  					$_REQUEST['wpsg_rechnungen_fusstext'] = $foot_text[$this->shop->get_option('wpsg_rechnungen_foottext_standard')][1];
- 					
+ 						
  				}
  			
  			}
  			
-		    try {
+ 			$this->writeRechnung($order_id, $preview = false, $bOutput = false);
  			
-			    $this->writeRechnung($order_id, false, false);
-			    
-		    } catch (Exception $e) {
-			    
-			    die($e->getMessage());
-			    
-		    }
- 			
- 		} // private function riteAutoRechnung()
+ 		} // private function writeAutoRechnung()
  		
 	} // class wpsg_mod_rechnungen extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_relatedproducts.class.php
===================================================================
--- /mods/wpsg_mod_relatedproducts.class.php	(revision 8528)
+++ /mods/wpsg_mod_relatedproducts.class.php	(revision 5261)
@@ -41,5 +41,4 @@
 				rel_id int(11) NOT NULL,
 				template varchar(255) NOT NULL,
-				pos int(11) NOT NULL,
 				PRIMARY KEY  (id),
 				KEY p_id (p_id),
@@ -63,5 +62,5 @@
 			$this->shop->view['wpsg_mod_relatedproducts']['arTemplates'] = $this->shop->loadProduktTemplates(true);
 			array_unshift($this->shop->view['wpsg_mod_relatedproducts']['arTemplates'], __('FÃŒr jedes Produkt einstellbar', 'wpsg'));		
-			 
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_relatedproducts/settings_edit.phtml');
 			
@@ -70,33 +69,25 @@
 		public function settings_save()
 		{
-
-			$arTemplateFiles = $this->shop->loadProduktTemplates(true);
-			 
-			$this->shop->update_option('wpsg_mod_relatedproducts_template', $_REQUEST['wpsg_mod_relatedproducts_template'], false, false, WPSG_SANITIZE_VALUES, array_keys(['0'] + $arTemplateFiles)); 
-			
-			$this->shop->update_option('wpsg_mod_relatedproducts_synchron', $_REQUEST['wpsg_mod_relatedproducts_synchron'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_relatedproducts_showBasket', $_REQUEST['wpsg_mod_relatedproducts_showBasket'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_relatedproducts_showBasketLimit', $_REQUEST['wpsg_mod_relatedproducts_showBasketLimit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_relatedproducts_showBasketTemplate', $_REQUEST['wpsg_mod_relatedproducts_showBasketTemplate'], false, false, WPSG_SANITIZE_VALUES, array_keys(['0'] + $arTemplateFiles));
-			$this->shop->update_option('wpsg_mod_relatedproducts_showAjaxDialog', $_REQUEST['wpsg_mod_relatedproducts_showAjaxDialog'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_relatedproducts_showAjaxDialogLimit', $_REQUEST['wpsg_mod_relatedproducts_showAjaxDialogLimit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_relatedproducts_showAjaxDialogTemplate', $_REQUEST['wpsg_mod_relatedproducts_showAjaxDialogTemplate'], false, false, WPSG_SANITIZE_VALUES, array_keys(['0'] + $arTemplateFiles));
-		 
+			
+			$this->shop->update_option('wpsg_mod_relatedproducts_template', $_REQUEST['wpsg_mod_relatedproducts_template']);
+			$this->shop->update_option('wpsg_mod_relatedproducts_synchron', $_REQUEST['wpsg_mod_relatedproducts_synchron']);
+			$this->shop->update_option('wpsg_mod_relatedproducts_showBasket', $_REQUEST['wpsg_mod_relatedproducts_showBasket']);
+			$this->shop->update_option('wpsg_mod_relatedproducts_showBasketLimit', $_REQUEST['wpsg_mod_relatedproducts_showBasketLimit']);
+			$this->shop->update_option('wpsg_mod_relatedproducts_showBasketTemplate', $_REQUEST['wpsg_mod_relatedproducts_showBasketTemplate']);
+			
 		} // public function settings_save
 		
-		public function produkt_save(&$produkt_id) {
-			
-			if (isset($_REQUEST['wpsg_mod_relatedproduct']) && is_array($_REQUEST['wpsg_mod_relatedproduct']) && sizeof($_REQUEST['wpsg_mod_relatedproduct']) > 0) {
-			
-				$nPos = 0;
-				
-				foreach ($_REQUEST['wpsg_mod_relatedproduct'] as $rp_id => $template) {
-					
-					$nPos ++;
+		public function produkt_save(&$produkt_id) 
+		{
+			 	
+			if (isset($_REQUEST['wpsg_mod_relatedproduct']) && is_array($_REQUEST['wpsg_mod_relatedproduct']) && sizeof($_REQUEST['wpsg_mod_relatedproduct']) > 0)
+			{
+				
+				foreach ($_REQUEST['wpsg_mod_relatedproduct'] as $rp_id => $template)
+				{
 					
 					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_REL, array(
-						'template' => wpsg_q(wpsg_sinput("text_field", $template)),
-						'pos' => wpsg_q($nPos)
-					), "`id` = '".wpsg_q(wpsg_sinput("key", $rp_id))."'");
+						'template' => wpsg_q($template)
+					), "`id` = '".wpsg_q($rp_id)."'");
 					
 				}
@@ -106,44 +97,33 @@
 		} // public function produkt_save($produkt_id)
 		
-		/*
-		 * zeigt die ZubehÃ¶rprodukte im Produktbackend an
-		*/
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-			
-			if ($product_data['id'] <= 0) return;
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{ 
+
 			if (isset($_REQUEST['wpsg_lang'])) return;
-						
-			$this->shop->view['data'] = $product_data;			 
-		 
-			$product_content['general']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml', false);
-				
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
-		
+			
+			if ($produkt_data['id'] <= 0) return;
+			
+			$this->shop->view['data'] = $produkt_data;
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_relatedproducts/produkt_edit_sidebar.phtml');
+						
+		} // public function produkt_edit_sidebar(&$produkt_data)
 		
 		public function produkt_ajax()
 		{
 
-
 			if (isset($_REQUEST['cmd']) && $_REQUEST['cmd'] == 'wpsg_rp_add')
 			{
 
-				$_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-				$_REQUEST['rel_id'] = wpsg_sinput("key", $_REQUEST['rel_id']);
-
 				if ($_REQUEST['template'] > 0 && strlen($_REQUEST['template_file']) > 0) $template = $_REQUEST['template_file']; else $template = '';
 				
-				$bExists = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_REL."` WHERE `p_id` = '".wpsg_q($_REQUEST['edit_id'])."' AND `rel_id` = '".wpsg_q($_REQUEST['rel_id'])."' ORDER BY `pos` ASC ");
-				
-				if ($bExists <= 0) {
-				
-					$nPos = intval($this->db->fetchOne("SELECT MAX(`pos`) FROM `".WPSG_TBL_PRODUCTS_REL."` WHERE `p_id` = '".wpsg_q($_REQUEST['edit_id'])."' ")) + 1;
-					
+				$bExists = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_REL."` WHERE `p_id` = '".wpsg_q($_REQUEST['edit_id'])."' AND `rel_id` = '".wpsg_q($_REQUEST['rel_id'])."'");
+				
+				if ($bExists <= 0)
+				{
+				
 					$this->db->ImportQuery(WPSG_TBL_PRODUCTS_REL, array(
 						'p_id' => wpsg_q($_REQUEST['edit_id']),
 						'rel_id' => wpsg_q($_REQUEST['rel_id']),
-						'template' => wpsg_q($template),
-						'pos' => wpsg_q($nPos)
+						'template' => wpsg_q($template)
 					));
 					
@@ -179,8 +159,9 @@
 		} // public function basket_after(&$basket_view)
 		
-		public function renderProdukt_afterForm(&$produkt_data, &$html) {
+		public function renderProdukt_afterForm(&$produkt_data, &$html) 
+		{ 
 			 
 			// Um Rekursion zu vermeiden
-			if (wpsg_isTrue($this->shop->noReleatedProducts)) return;
+			if ($this->shop->noReleatedProducts === true) return;
 			
 			$arRelated = $this->getRelatedProducts($produkt_data['id']);
@@ -191,15 +172,7 @@
 				$this->shop->view['wpsg_mod_relatedproducts']['content'] = '';
 				
-				foreach ($arRelated as $rp) {
-
-					if (!wpsg_product::getInstance($rp['product_id'])->canOrder()) continue;
-
-					$this->shop->view['wpsg_mod_relatedproducts']['content'] .= $this->renderRelatedProduct($rp, $this->shop->get_option('wpsg_mod_relatedproducts_template'));
-				
-				}
+				foreach ($arRelated as $rp) $this->shop->view['wpsg_mod_relatedproducts']['content'] .= $this->renderRelatedProduct($rp, $this->shop->get_option('wpsg_mod_relatedproducts_template'));
 				
 				$html .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_relatedproducts/relatedproducts.phtml', false);
-				
-				$this->shop->noReleatedProducts = false;
 				
 			}
@@ -330,6 +303,4 @@
 					GROUP BY
 						RELP.`id`
-					ORDER BY
-						RP.`pos` ASC
 				");
 				
@@ -346,13 +317,12 @@
 					WHERE
 						RP.`p_id` = '".wpsg_q($produkt_id)."'  AND
-						RELP.`deleted` != '1'
-					ORDER BY
-						RP.`pos` ASC
+						RELP.`deleted` != '1' 
 				");
 				
 			}
 			
-		} // public function getRelatedProducts($produkt_id)		
+		} // public function getRelatedProducts($produkt_id)
 		
 	} // class wpsg_mod_relatedproducts extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_request.class.php
===================================================================
--- /mods/wpsg_mod_request.class.php	(revision 8528)
+++ /mods/wpsg_mod_request.class.php	(revision 5261)
@@ -3,5 +3,5 @@
 	/**
 	 * Modul um Anfragen an Produkt zu stellen
-	 * @author Daschmi (https://daschmi.de)
+	 * @author Daschmi (daschmi@daschmi.de)
 	 */
 	class wpsg_mod_request extends wpsg_mod_basic
@@ -65,23 +65,16 @@
 		public function settings_save()
 		{
-
-		    $this->shop->createPage(__('Anfrage', 'wpsg'), 'wpsg_mod_request_page', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_request_page']));
-			$this->shop->createPage(__('Vielen Dank fÃŒr Ihre Anfrage', 'wpsg'), 'wpsg_mod_request_redirect', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_request_redirect']));
-			
-			$this->shop->update_option('wpsg_mod_request_afterinsert', $_REQUEST['wpsg_mod_request_afterinsert'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_request_customerdata', $_REQUEST['wpsg_mod_request_customerdata'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			if ($this->shop->hasMod('wpsg_mod_ordervars')) $this->shop->update_option('wpsg_mod_request_ordervars', $_REQUEST['wpsg_mod_request_ordervars'], false, false, WPSG_SANITIZE_CHECKBOX);
-			if ($this->shop->hasMod('wpsg_mod_productvars')) $this->shop->update_option('wpsg_mod_request_productvars', $_REQUEST['wpsg_mod_request_productvars'], false, false, WPSG_SANITIZE_CHECKBOX);
+									
+			$this->shop->createPage(__('Anfrage', 'wpsg'), 'wpsg_mod_request_page', $_REQUEST['wpsg_mod_request_page']);
+			$this->shop->createPage(__('Vielen Dank fÃŒr Ihre Anfrage', 'wpsg'), 'wpsg_mod_request_redirect', $_REQUEST['wpsg_mod_request_redirect']);
+			
+			$this->shop->update_option('wpsg_mod_request_afterinsert', $_REQUEST['wpsg_mod_request_afterinsert']);
+			$this->shop->update_option('wpsg_mod_request_customerdata', $_REQUEST['wpsg_mod_request_customerdata']);
+			
+			if ($this->shop->hasMod('wpsg_mod_ordervars')) $this->shop->update_option('wpsg_mod_request_ordervars', $_REQUEST['wpsg_mod_request_ordervars']);
+			if ($this->shop->hasMod('wpsg_mod_productvars')) $this->shop->update_option('wpsg_mod_request_productvars', $_REQUEST['wpsg_mod_request_productvars']);
 			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_request_afterinsert'));
-            wp_delete_post($this->shop->get_option('wpsg_mod_request_customerdata'));
-
-        } // public function wpsg_deinstall_sites()
-
+		
 		public function template_redirect() 
 		{ 
@@ -91,5 +84,5 @@
  
 				// VariantenmodulschlÃŒssel generieren
-				$this->shop->callMod('wpsg_mod_productvariants', 'basket_preInsert');
+				$this->shop->callMod('wpsg_mod_varianten', 'basket_preInsert');
 				
 				$this->addProductToRequestlist($_REQUEST['wpsg']['produkt_id'], $_REQUEST['wpsg']['menge']);
@@ -174,5 +167,5 @@
 		{
 			
-			$page_id = wpsg_get_the_id();
+			$page_id = get_the_ID();
 			
 			if (wpsg_isSizedInt($page_id) && $page_id == $this->shop->get_option('wpsg_mod_request_page'))
@@ -202,31 +195,40 @@
 			$oProduct = wpsg_product::getInstance($product_id);
 			
-			$oProduct->setMeta('wpsg_mod_request_set', wpsg_sinput("key", $_REQUEST['wpsg_mod_request_set']));
+			$oProduct->setMeta('wpsg_mod_request_set', $_REQUEST['wpsg_mod_request_set']);
 			
 		} // public function produkt_save(&$produkt_id)
 		
-		public function product_bottom(&$product_key, $template_index) {
+		public function product_bottom(&$product_id, $template_index)
+		{
+				 
+			if (!$this->isRequestProduct($product_id)) return;
+			
+			$this->shop->view['wpsg_mod_request']['template_index'] = $template_index;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_request/product_bottom.phtml');
+				
+		} // public function product_bottom(&$produkt_id, $template_index)
+		
+		public function admin_presentation()
+		{
+		
+			if ($this->shop->hasMod('wpsg_mod_produktbilder'))
+			{
+			
+				echo wpsg_drawForm_Checkbox('wpsg_mod_request_requestpageimage', __('Produktbild auf Anfrageseite anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_request_requestpageimage'));
+				
+			}
+			 	
+		} // public function admin_presentation()
+		
+		public function admin_presentation_submit()
+		{
+			
+			if ($this->shop->hasMod('wpsg_mod_produktbilder'))
+			{
+				
+				$this->shop->update_option('wpsg_mod_request_requestpageimage', $_REQUEST['wpsg_mod_request_requestpageimage']);
 
-		    $product_id = $this->shop->getProduktID($product_key);
-
-			if (!$this->isRequestProduct($product_id)) return;
-			
-			$this->shop->view['wpsg_mod_request']['template_index'] = $template_index;
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_request/product_bottom.phtml');
-				
-		} // public function product_bottom(&$produkt_id, $template_index)
-		
-		public function admin_presentation()
-		{
-		
-				echo wpsg_drawForm_Checkbox('wpsg_mod_request_requestpageimage', __('Produktbild auf Anfrageseite anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_request_requestpageimage'));
-				
-		} // public function admin_presentation()
-		
-		public function admin_presentation_submit()
-		{
-			
-				$this->shop->update_option('wpsg_mod_request_requestpageimage', $_REQUEST['wpsg_mod_request_requestpageimage']);
+			}
 				
 		} // public function admin_presentation_submit()
@@ -269,12 +271,4 @@
 			
 			if ($this->shop->hasMod('wpsg_mod_ordervars') && wpsg_isSizedInt($this->shop->get_option('wpsg_mod_request_ordervars'))) $this->shop->view['orderVars'] = $this->shop->callMod('wpsg_mod_ordervars', 'getOrderVars');
-			
-			if (wpsg_isSizedArray($_SESSION['wpsg']['wpsg_mod_request']['error']))
-			{
-				
-				$this->shop->view['error'] = $_SESSION['wpsg']['wpsg_mod_request']['error'];
-				unset($_SESSION['wpsg']['wpsg_mod_request']['error']);
-				
-			}
 			
 			$content = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_request/requestpage.phtml', false);
@@ -353,18 +347,4 @@
 				'ov' => array()
 			);
-			
-			if ($this->shop->hasMod('wpsg_mod_kundenverwaltung'))
-			{
-				
-				$customer_login_id = $this->shop->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn');
-			
-				if (wpsg_isSizedInt($customer_login_id))
-				{
-					 
-					$arReturn['customer'] = $_SESSION['wpsg']['checkout'];
-					 
-				}
-				
-			}
 						
 			foreach ((array)$_SESSION['wpsg']['wpsg_mod_request']['products'] as $ses_key => $ses_product)
@@ -418,8 +398,8 @@
 				// Eventuelle Zusatzzeilen zÃ€hlen fÃŒr Ausgabe rowspan	
 				$arProductReturn['addRowspan'] = 0;				
-				if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($ses_product['product_key'])))
-				{
-					
-					$arProductReturn['variantenInfo'] = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($ses_product['product_key']));
+				if ($this->shop->hasMod('wpsg_mod_varianten') && $this->shop->callMod('wpsg_mod_varianten', 'isVariantsProductKey', array($ses_product['product_key'])))
+				{
+					
+					$arProductReturn['variantenInfo'] = $this->shop->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($ses_product['product_key']));
 					
 					$arProductReturn['addRowspan'] ++;
@@ -499,5 +479,4 @@
 			{
 				
-				$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'email';
 				$this->shop->addFrontendError(__('Bitte ÃŒberprÃŒfen Sie die Eingaben in der E-Mail BestÃ€tigung!', 'wpsg'));
 				$bOK = false;
@@ -516,11 +495,9 @@
 						$bOK = false;
 						
-						$_SESSION['wpsg']['wpsg_mod_request']['error'][] = $k;
-						
 						switch ($k)
 						{
 							
-							case 'firma'; $this->shop->addFrontendError(__('Bitte im Feld "Firma" eine Angabe machen!', 'wpsg')); break;
-							case 'vname': $this->shop->addFrontendError(__('Bitte im Feld "Vorname" eine Angabe machen!', 'wpsg')); break;							
+							case 'firma'; $this->shop->addFrontendError(__('Bitte im Feld "Firma" eine Angabe machen!'. 'wpsg')); break;
+							case 'vname': $this->shop->addFrontendError(__('Bitte im Feld "Vorname" eine Angabe machen!', 'wpsg')); break;
 							case 'name': $this->shop->addFrontendError(__('Bitte im Feld "Name" eine Angabe machen!', 'wpsg')); break; 
 							case 'fax': $this->shop->addFrontendError(__('Bitte die Eingaben im Feld "Fax" ÃŒberprÃŒfen!', 'wpsg')); break;
@@ -536,27 +513,18 @@
 					
 				}
-				//else if (array_key_exists($k, $required_fields) && $required_fields[$k] != 1 && $k === "geb" && !wpsg_isValidGeb($v))
-				else if ($k === "geb" && 
-						(
-							($required_fields[$k] != '1' && !wpsg_isValidGeb($v)) ||
-							(wpsg_isSizedString($v) && !wpsg_isValidGeb($v))
-						)
-					) 
-				{ 
-					
-					$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'geb';
+				//else if (array_key_exists($k, $required_fields) && $required_fields[$k] != 1 && $k === "geb" && !wspg_isValidGeb($v))
+				if (
+						(wspg_isValidGeb($v) && wpsg_isSizedString($v)) ||
+						!array_key_exists($k, $required_fields)
+				)
+				{
+					
 					$bOK = false; $this->shop->addFrontendError(__('Bitte die Eingabe im Feld "Geburtsdatum" ÃŒberprÃŒfen!', 'wpsg'));
 					
 				}
-				else if ($k == 'email' &&
-						(
-							($required_fields[$k] != '1' && !wpsg_isValidEMail($v)) ||
-							(wpsg_isSizedString($v) && !wpsg_isValidEMail($v))
-						)
-					)
-				{
-					
-					$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'email';
-					$bOK = false; $this->shop->addFrontendError(__('Bitte die Eingabe der E-Mail Adresse ÃŒberprÃŒfen!', 'wpsg'));
+				else if (array_key_exists($k, $required_fields) && $required_fields[$k] != 1 && $k === "email" && !wpsg_isValidEMail($v))
+				{
+					
+					$bOK = false; $this->shop->addFrontendError(__('Bitte die Eingabe der E-Mail Adresse ÃŒberprÃŒfen!', 'wspg'));
 					
 				}
@@ -564,5 +532,4 @@
 				{
 					
-					$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'land';
 					$bOK = false; $this->shop->addFrontendError(__('Bitte ein Land auswÃ€hlen!', 'wpsg'));
 					
@@ -571,5 +538,4 @@
 				{
 					
-					$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'title';
 					$bOK = false; $this->shop->addFrontendError('Bitte im Feld "Anrede" eine Angabe machen!', 'wpsg');
 					
@@ -592,5 +558,4 @@
 									
 									// Textfeld ist leer
-									$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'custom_'.$custom_key;
 									$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte machen Sie in Feld "#1#" eine Angabe!', 'wpsg'), __($required_fields['custom'][$custom_key]['name'], 'wpsg')));
 																			
@@ -605,5 +570,4 @@
 									{
 										
-										$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'custom_'.$custom_key;
 										$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte eine Auswahl im Feld "#1#" treffen!', 'wpsg'), __($required_fields['custom'][$custom_key]['name'], 'wpsg')));
 										
@@ -615,5 +579,4 @@
 									
 									// Checkbox nicht aktiv
-									$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'custom_'.$custom_key;
 									$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte "#1#" akzeptieren!', 'wpsg'), __($required_fields['custom'][$custom_key]['name'], 'wpsg')));
 									
@@ -651,5 +614,4 @@
 							{
 									
-								$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'ov_'.$ov_id;
 								$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte eine Auswahl im Feld "#1#" treffen!', 'wpsg'), $ov_db[$ov_id]['name']));
 									
@@ -660,5 +622,4 @@
 						{
 							
-							$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'ov_'.$ov_id;
 							$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte machen Sie in Feld "#1#" eine Angabe!', 'wpsg'), $ov_db[$ov_id]['name']));
 							
@@ -667,5 +628,4 @@
 						{
 							
-							$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'ov_'.$ov_id;
 							$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte "#1#" akzeptieren!', 'wpsg'), $ov_db[$ov_id]['name']));
 							
@@ -699,5 +659,4 @@
 							{
 								
-								$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'pv_'.$pv['id'];
 								$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte eine Auswahl im Feld "#1#" in Produkt "#2#" treffen!', 'wpsg'), $pv['name'], $request_product['product_data']['name']));
 								
@@ -709,5 +668,4 @@
 							
 							// Kein Text
-							$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'pv_'.$pv['id'];
 							$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte machen Sie eine Angabe im Feld "#1#" in Produkt "#2#"!', 'wpsg'), $pv['name'], $request_product['product_data']['name']));
 							
@@ -717,5 +675,4 @@
 							
 							// Checkbox nicht aktiviert
-							$_SESSION['wpsg']['wpsg_mod_request']['error'][] = 'pv_'.$pv['id'];
 							$bOK = false; $this->shop->addFrontendError(wpsg_translate(__('Bitte akzeptieren Sie "#1#" in Produkt "#2#"!', 'wpsg'), $pv['name'], $request_product['product_data']['name']));
 							
@@ -839,8 +796,5 @@
 		{
 			
-			$p_key = $product_key;
-			$p_key = $_REQUEST['wpsg']['product_key'];
-			
-			$product_id = $this->shop->getProduktId($p_key);
+			$product_id = $this->shop->getProduktId($product_key);
 			$oProduct = wpsg_product::getInstance($product_id);
 			 
@@ -853,7 +807,6 @@
 			foreach ($_SESSION['wpsg']['wpsg_mod_request']['products'] as $ses_key => $ses_product)
 			{
-									
-				$temp = $oProduct->basket_multiple;
-				if ($ses_product['product_key'] == $product_key && $product_id == $ses_product['product_id'] && !wpsg_isSizedInt($temp))
+												
+				if ($ses_product['product_key'] == $product_key && $product_id == $ses_product['product_id'] && !wpsg_isSizedInt($oProduct->basket_multiple))
 				{
 			
@@ -871,5 +824,5 @@
 				$_SESSION['wpsg']['wpsg_mod_request']['products'][] = array(
 					'product_id' => $product_id,
-					'product_key' => $p_key,					
+					'product_key' => $product_key,					
 					'referer' => $_REQUEST['myReferer'],
 					'amount' => $amount	
@@ -895,5 +848,24 @@
 			
 		} // public function isRequestProduct($product_id)
-		 
+		
+		/**
+		 * Gibt true oder false zurÃŒck ob das Produkt kÃ€uflich erworben werden kann.
+		 * FÃŒr die Anzeige des Buttons "In den Warenkorb" im Produkttemplate
+		 * @param int $product_id
+		 */
+		public function productForSale($product_key)
+		{
+			
+			$product_id = $this->shop->getProduktID($product_key);
+			
+			$oProduct = wpsg_product::getInstance($product_id);
+			
+			$wpsg_mod_request_set = $oProduct->getMeta('wpsg_mod_request_set');
+			
+			if (!is_numeric($wpsg_mod_request_set) || in_array($wpsg_mod_request_set, array(wpsg_mod_request::TYP_NO, wpsg_mod_request::TYP_YESWITHBASKET))) return true;
+			else return -2;
+			
+		} // public function productForSale($product_id)
+		
 		/**
 		 * FÃŒhrt die Anfrage aus und sendet die Mails an den Shop Betreiber und Kunden
@@ -904,9 +876,4 @@
 			$this->shop->view['pflicht'] = $this->shop->loadPflichtFeldDaten();
 			$this->shop->view['requestlist'] = $this->getRequestlistData();
-			
-			$arAnrede = explode('|', $this->shop->get_option('wpsg_admin_pflicht')['anrede_auswahl']);  
-			$anrede = $arAnrede[$this->shop->view['requestlist']['customer']['title']];
-			$this->shop->view['requestlist']['customer']['title'] = $anrede;
-			
 			if ($this->shop->hasMod('wpsg_mod_ordervars') && wpsg_isSizedInt($this->shop->get_option('wpsg_mod_request_ordervars'))) $this->shop->view['orderVars'] = $this->shop->callMod('wpsg_mod_ordervars', 'getOrderVars');
 			
Index: ds/wpsg_mod_revocation.class.php
===================================================================
--- /mods/wpsg_mod_revocation.class.php	(revision 8528)
+++ 	(revision )
@@ -1,182 +1,0 @@
-<?php
-
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 04.03.24
-	 * @time: 11:48
-	 */
-	 
-	use wpsgRevocation\Revocation;
-
-	if (!defined('ABSPATH')) { exit; }
-		
-	class wpsg_mod_revocation extends \wpsg_mod_basic {
-	
-		protected static ?wpsg_mod_revocation $instance = null; 
-	 	
-		public function __construct() {  
-			
-			parent::__construct();
-	
-			$this->id = 5700;
-			$this->name = __('Widerrufsformular', 'wpsgRevocation');
-			$this->group = __('Sonstiges', 'wpsgRevocation');
-			$this->desc = __('', 'wpsgRevocation');
-	
-			define('WPSG_MOD_REVOCATION__FILE__', __FILE__);
-			define('WPSG_MOD_REVOCATION__DIR__', dirname(__FILE__));
-			
-			require_once implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_revocation', 'Action.php']);
-			require_once implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_revocation', 'Revocation.php']);
-			require_once implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_revocation', 'Form.php']);
-			
-		}
-		
-		public function init() { 
-			
-			wpsgRevocation\Action::init();
-			
-			\add_action('wp_footer', ['wpsgRevocation\Action', 'wp_footer']);
-			\add_action('wp_ajax_wpsg_mod_revocation', ['wpsgRevocation\Action', 'ajax']);
-			\add_action('wp_ajax_nopriv_wpsg_mod_revocation', ['wpsgRevocation\Action', 'ajax']);
-			\add_action('wp_enqueue_scripts', ['wpsgRevocation\Action', 'wp_enqueue_scripts']);
-			
-		}
-	
-		public function produkt_edit_allgemein(&$produkt_data) { 
-			
-			if ($produkt_data['id'] > 0) {
-			
-				\wpsg_ShopController::getShop()->render(dirname(__FILE__).'/../views/mods/mod_revocation/produkt_edit_allgemein.phtml');
-
-			}
-			
-		}
-		
-		public function produkt_save(&$produkt_id) {
-			
-			if (isset($_REQUEST['wpsg_mod_revocation_disable'])) {
-				
-				\wpsg_product::getInstance($produkt_id)->setMeta('wpsg_mod_revocation_disable', $_REQUEST['wpsg_mod_revocation_disable']);
-				
-			}
-			
-		}
-		
-		public function mail_row($index, $produkt): void {
-	
-			if (\wpsg_ShopController::getShop()->get_option('wpsg_mod_revocation_view_customer_mail') !== '1') return;
-	
-			/** @var \wpsg_order $oOrder */
-			$oOrder = \wpsg_ShopController::getShop()->view['oOrder'];
-	
-			/** @var \wpsg_order_product $oOrderProduct */
-			$oOrderProduct = \wpsg_order_product::getInstance(intval($produkt['order_product_id']));
-	
-			if (intval($oOrderProduct->getProduct()->getMeta('wpsg_mod_revocation_disable', false, '0')) === 1) return;
-			
-			if (Revocation::getRevocationPossible($oOrder->getId(), $oOrderProduct->getId()) <= 0) return;
-			else {
-	
-				\wpsg_ShopController::getShop()->view['wpsg_mod_revocation']['order_id'] = $oOrder->getId();
-				\wpsg_ShopController::getShop()->view['wpsg_mod_revocation']['order_nr'] = $oOrder->getNr();
-				\wpsg_ShopController::getShop()->view['wpsg_mod_revocation']['product_nr'] = $oOrderProduct->getProduct()->getNr();
-				\wpsg_ShopController::getShop()->view['wpsg_mod_revocation']['order_product_id'] = $oOrderProduct->getId();
-				\wpsg_ShopController::getShop()->view['wpsg_mod_revocation']['amount'] = Revocation::getRevocationPossible($oOrder->getId(), $oOrderProduct->getId());
-	
-				if (\wpsg_ShopController::getShop()->htmlMail === true) \wpsg_ShopController::getShop()->render(dirname(__FILE__).'/../views/mods/mod_revocation/mail_row_html.phtml');
-				else \wpsg_ShopController::getShop()->render(dirname(__FILE__).'/../views/mods/mod_revocation/mail_row.phtml');
-	
-			}
-	
-		}
-	
-		public function install(): void {
-	
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_revocation_view_order', '1');
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_revocation_view_flyout', '0');
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_revocation_view_product', '1');
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_revocation_view_customer_mail', '0');
-	
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_wpsgrevocation_email_admin_betreff', 'Ein Kunde mÃ¶chte ein Produkt widerrufen');
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_wpsgrevocation_email_admin_empfaenger', \get_option('admin_email'));
-	
-		}
-	 		
-		public function settings_edit(): void {
-	
-			$this->install();
-	
-			\wpsg_ShopController::getShop()->render(dirname(__FILE__).'/../views/mods/mod_revocation/settings_edit.phtml');
-	
-		}
-	
-		public function settings_save() {
-	
-			\wpsg_ShopController::getShop()->update_option('wpsg_mod_revocation_view_order', $_REQUEST['wpsg_mod_revocation_view_order']??'0', false, false, WPSG_SANITIZE_CHECKBOX);
-			\wpsg_ShopController::getShop()->update_option('wpsg_mod_revocation_view_flyout', $_REQUEST['wpsg_mod_revocation_view_flyout']??'0', false, false, WPSG_SANITIZE_CHECKBOX);
-			\wpsg_ShopController::getShop()->update_option('wpsg_mod_revocation_view_product', $_REQUEST['wpsg_mod_revocation_view_product']??'0', false, false, WPSG_SANITIZE_CHECKBOX);
-			\wpsg_ShopController::getShop()->update_option('wpsg_mod_revocation_view_customer_mail', $_REQUEST['wpsg_mod_revocation_view_customer_mail']??'0', false, false, WPSG_SANITIZE_CHECKBOX);
-	
-			\wpsg_ShopController::getShop()->update_option('wpsg_mod_revocation_reason', $_REQUEST['wpsg_mod_revocation_reason']??null, false, false, WPSG_SANITIZE_TEXTFIELD);
-	
-		}
-	
-		public function admin_emailconf() {
-	
-			$this->install();
-	
-			echo wpsg_drawEMailConfig(
-				'wpsgrevocation_email_admin',
-				__('Widerrufsformular: EingangsbestÃ€tigung an Admin', 'wpsgRevocation'),
-				__('Diese Mail bekommt der Admin wenn ein Kunde einen neuen Widerruf erfolgreich ÃŒber das Formular gemeldet hat.', 'wpsgRevocation'),
-				true
-			);
-	
-			echo wpsg_drawEMailConfig(
-				'wpsgrevocation_email_customer',
-				__('Widerrufsformular: EingangsbestÃ€tigung an Kunden', 'wpsgRevocation'),
-				__('Diese Mail bekommt der Kunde wenn er einen Widerruf erfolgreich ÃŒber das Formular gemeldet hat.', 'wpsgRevocation')
-			);
-	
-		}
-	
-		public function order_view_row(&$p, $i) {
-	
-			$oOrder = \wpsg_order::getInstance(intval(\wpsg_ShopController::getShop()->view['data']['id']));
-			$order_product_id = intval($p['order_product_id']);
-	
-			$arRevocation = json_decode($oOrder->getMeta('wpsgRevocation', true, '[]'), true);
-	
-			foreach ($arRevocation as $k => $v) {
-	
-				if ($v['order_product_id'] === $order_product_id) {
-	
-					$oOrderProduct = \wpsg_order_product::getInstance($order_product_id);
-					
-					if (intval($oOrderProduct->getProduct()->getMeta('wpsg_mod_revocation_disable', false, '0')) !== 1) {
-					
-						\wpsg_ShopController::getShop()->view['wpsg_mod_revocation']['row'] = $v;		
-						\wpsg_ShopController::getShop()->render(dirname(__FILE__).'/../views/mods/mod_revocation/order_view_row.phtml');
-
-					}
-	
-				}
-	
-			}
-	
-		}
-	
-		/* Modulfunktionen */
-	
-		public static function getInstance(): wpsg_mod_revocation {
-	
-			if (!isset(static::$instance)) static::$instance = new static;
-	
-			return static::$instance;
-	
-		}
-	
-	}
Index: /mods/wpsg_mod_scaleprice.class.php
===================================================================
--- /mods/wpsg_mod_scaleprice.class.php	(revision 8528)
+++ /mods/wpsg_mod_scaleprice.class.php	(revision 5261)
@@ -34,5 +34,6 @@
 		} // public function __construct()
 		
-		public function install() {
+		public function install()
+		{
 				
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
@@ -43,5 +44,5 @@
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
 			  	wpsg_mod_scaleprice_activ int(1) DEFAULT 0 NOT NULL,
-				wpsg_mod_scaleprice_typ int(11) DEFAULT 0 NOT NULL,	
+				wpsg_mod_scaleprice_typ int(11) DEFAULT 0 NOT NULL,				
 				wpsg_mod_scaleprice_calc int(11) DEFAULT 0 NOT NULL
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
@@ -56,5 +57,4 @@
 				product_id int(11) DEFAULT 0 NOT NULL,
 				scale double(10,2) DEFAULT 0 NOT NULL,
-                scaleeinheit varchar(50) NOT NULL,	
 				value double(10,2) DEFAULT 0 NOT NULL,
 				PRIMARY KEY  (id),
@@ -65,30 +65,13 @@
 			
 			$this->shop->checkDefault('wpsg_mod_scaleprice_showProductInfo', '1'); 
-			$this->shop->checkDefault('wpsg_mod_scaleprice_unit', 'StÃŒck');
 			
 		} // public function install()
 		
-		public function settings_edit()
-		{
-		    
-		    $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_scaleprice/settings_edit.phtml');
-		    
-		} // public function settings_edit()
-		
-		public function settings_save()
-		{
-		    
-		    $this->shop->update_option('wpsg_mod_scaleprice_unit', $_REQUEST['wpsg_mod_scaleprice_unit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		
-		} // public function settings_save()
-						
-		/*
-		 * zeigt die Staffelpreise im Produktbackend an
-		*/
-		public function product_addedit_content(&$product_content, &$product_data) {
-		
-			if (!wpsg_isSizedInt($product_data['id'])) return;
-			
-			$this->shop->view['wpsg_mod_scaleprice']['product'] = $product_data; 
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{ 
+			
+			if (!isset($produkt_data['id'])) return;
+			
+			$this->shop->view['wpsg_mod_scaleprice']['product'] = $produkt_data; 
 			
 			$this->shop->view['wpsg_mod_scaleprice']['arTyp'] = array(
@@ -103,23 +86,16 @@
 			}
 			
-			$this->shop->view['wpsg_mod_scaleprice']['list'] = $this->scaleList($product_data['id']);
-		
-			/*$product_content['wpsg_mod_scaleprice'] = array(
-					'title' => __('Staffelpreise', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_scaleprice/produkt_addedit_sidebar.phtml', false)		
-			);
-			*/
-			
-			$product_content['price']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_scaleprice/produkt_addedit_sidebar.phtml', false);
-			
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
-		 
+			$this->shop->view['wpsg_mod_scaleprice']['list'] = $this->scaleList($produkt_data['id']);
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_scaleprice/produkt_edit_sidebar.phtml');
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		
 		public function produkt_save_before(&$produkt_data) 
 		{ 
-
-			$produkt_data['wpsg_mod_scaleprice_activ'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_scaleprice_activ']));
-			$produkt_data['wpsg_mod_scaleprice_typ'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_scaleprice_typ']));
-			$produkt_data['wpsg_mod_scaleprice_calc'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_scaleprice_calc']));
+			
+			$produkt_data['wpsg_mod_scaleprice_activ'] = wpsg_q($_REQUEST['wpsg_mod_scaleprice_activ']);
+			$produkt_data['wpsg_mod_scaleprice_typ'] = wpsg_q($_REQUEST['wpsg_mod_scaleprice_typ']);
+			$produkt_data['wpsg_mod_scaleprice_calc'] = wpsg_q($_REQUEST['wpsg_mod_scaleprice_calc']);
 			
 		} // public function produkt_save_before(&$produkt_data)
@@ -127,8 +103,5 @@
 		public function produkt_ajax()
 		{
-
-			if(isset($_REQUEST['edit_id'])) $_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-			if(isset($_REQUEST['scale_id'])) $_REQUEST['scale_id'] = wpsg_sinput("key", $_REQUEST['scale_id']);
-
+				
 			if ($_REQUEST['cmd'] == 'add')
 			{
@@ -136,6 +109,6 @@
 				$this->db->ImportQuery(WPSG_TBL_SCALEPRICE, array(
 					'product_id' => wpsg_q($_REQUEST['edit_id']),
-					'scale' => wpsg_q(wpsg_sinput("key", $_REQUEST['scale'])),
-					'value' => wpsg_q(wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat")))
+					'scale' => wpsg_q($_REQUEST['scale']),
+					'value' => wpsg_q(wpsg_tf($_REQUEST['value']))	
 				));
 				
@@ -148,6 +121,6 @@
 				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
 					'wpsg_mod_scaleprice_activ' => '1',
-					'wpsg_mod_scaleprice_typ' => wpsg_q(wpsg_sinput("key", $_REQUEST['typ'])),
-					'wpsg_mod_scaleprice_calc' => wpsg_q(wpsg_sinput("key", $_REQUEST['calc']))
+					'wpsg_mod_scaleprice_typ' => wpsg_q($_REQUEST['typ']),
+					'wpsg_mod_scaleprice_calc' => wpsg_q($_REQUEST['calc'])
 				), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 				
@@ -160,6 +133,6 @@
 				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
 					'wpsg_mod_scaleprice_activ' => '1',
-					'wpsg_mod_scaleprice_typ' => wpsg_q(wpsg_sinput("key", $_REQUEST['typ'])),
-					'wpsg_mod_scaleprice_calc' => wpsg_q(wpsg_sinput("key", $_REQUEST['calc']))
+					'wpsg_mod_scaleprice_typ' => wpsg_q($_REQUEST['typ']),
+					'wpsg_mod_scaleprice_calc' => wpsg_q($_REQUEST['calc'])
 				), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
 				
@@ -180,8 +153,6 @@
 				if ($_REQUEST['field'] == 'scale')
 				{
-
-					$_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-
-					$this->db->UpdateQuery(WPSG_TBL_SCALEPRICE, array('scale' => wpsg_q($_REQUEST['value'])), "`id` = '".wpsg_q($_REQUEST['scale_id'])."'");
+					
+					$this->db->UpdateQuery(WPSG_TBL_SCALEPRICE, array('scale' => wpsg_q(wpsg_tf($_REQUEST['value']))), "`id` = '".wpsg_q($_REQUEST['scale_id'])."'");
 					
 					die(wpsg_ff(wpsg_tf($_REQUEST['value'])));
@@ -190,8 +161,6 @@
 				else if ($_REQUEST['field'] == 'value')
 				{
-
-					$_REQUEST['value'] = wpsg_tf(wpsg_sinput("key", $_REQUEST['value'], "isFloat"));
-
-					$this->db->UpdateQuery(WPSG_TBL_SCALEPRICE, array('value' => wpsg_q($_REQUEST['value'])), "`id` = '".wpsg_q($_REQUEST['scale_id'])."'");
+					
+					$this->db->UpdateQuery(WPSG_TBL_SCALEPRICE, array('value' => wpsg_q(wpsg_tf($_REQUEST['value']))), "`id` = '".wpsg_q($_REQUEST['scale_id'])."'");
 					
 					die(wpsg_ff(wpsg_tf($_REQUEST['value'])));
@@ -213,17 +182,23 @@
 		{
 			
-			$this->shop->update_option('wpsg_mod_scaleprice_showProductInfo', $_REQUEST['wpsg_mod_scaleprice_showProductInfo'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_scaleprice_showProductInfo', $_REQUEST['wpsg_mod_scaleprice_showProductInfo']);
 			
 		} // public function admin_presentation_submit()
 		
-		public function product_bottom(&$produkt_key, $template_index) {
-
+		public function product_bottom(&$produkt_id, $template_index) 
+		{ 
+			
 			if ($this->shop->get_option('wpsg_mod_scaleprice_showProductInfo') != '1') return;
-			
-			$oProduct = wpsg_product::getInstance($this->shop->getProduktID($produkt_key));
-			
-			if ($oProduct->wpsg_mod_scaleprice_activ != '1') return;
-						
-			$arScale = $this->db->fetchAssoc("
+				
+			$product_data = $this->shop->loadProduktArray($produkt_id);
+	 
+			if ($product_data['wpsg_mod_scaleprice_activ'] != '1') return;
+			 
+			if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO) $product_price = $product_data['preis'];
+			else $product_price = $product_data['preis_netto'];
+			
+			$this->shop->view['wpsg_mod_scaleprice']['base'] = $product_price;
+			
+			$this->shop->view['wpsg_mod_scaleprice']['scale'] = $this->db->fetchAssoc("
 				SELECT
 					S.`scale`, S.`value`
@@ -231,115 +206,87 @@
 					`".WPSG_TBL_SCALEPRICE."` AS S
 				WHERE
-					S.`product_id` = '".wpsg_q($this->shop->getProduktID($produkt_key))."'
+					S.`product_id` = '".wpsg_q($produkt_id)."'
 				ORDER BY
 					S.`scale` ASC
 			");
-						
-			if (!wpsg_isSizedArray($arScale)) return;
-			
-			foreach ($arScale as $k => $v) {
-				
-				if ($oProduct->wpsg_mod_scaleprice_typ == self::TYP_QUANTITY) {
+			
+			foreach ((array)$this->shop->view['wpsg_mod_scaleprice']['scale'] as $k => $v)
+			{
+				
+				$backend_value = $v['value'];
+
+				if ($this->shop->getBackendTaxView() === WPSG_NETTO && $this->shop->getFrontendTaxView() === WPSG_BRUTTO)
+				{
+					
+					$this->shop->view['wpsg_mod_scaleprice']['scale'][$k]['value'] = wpsg_calculatePreis(
+						$backend_value, 
+						WPSG_BRUTTO,
+						$this->shop->getCalcTaxValue($product_data['mwst_key'])
+					);
+					
+				}
+				else if ($this->shop->getBackendTaxView() === WPSG_BRUTTO && $this->shop->getFrontendTaxView() === WPSG_NETTO)
+				{
+					
+					$this->shop->view['wpsg_mod_scaleprice']['scale'][$k]['value'] = wpsg_calculatePreis(
+						$backend_value,
+						WPSG_NETTO,
+						$this->shop->getCalcTaxValue($product_data['mwst_key'])
+					);
+					
+				}
+				
+				// Eventuell rabattierten Staffelpreis berechnen
+				if ($this->shop->hasMod('wpsg_mod_discount'))
+				{
+				
+					$discount_backend_value = $this->shop->callMod('wpsg_mod_discount', 'getDiscountPrice', array($produkt_id, $backend_value));
+					
+					if ($this->shop->getBackendTaxView() === WPSG_NETTO && $this->shop->getFrontendTaxView() === WPSG_BRUTTO)
+					{
+						
+						$this->shop->view['wpsg_mod_scaleprice']['scale'][$k]['value'] = wpsg_calculatePreis(
+							$discount_backend_value, 
+							WPSG_BRUTTO, 
+							$this->shop->getCalcTaxValue($product_data['mwst_key'])
+						);
+						
+					}
+					else if ($this->shop->getBackendTaxView() === WPSG_BRUTTO && $this->shop->getFrontendTaxView() === WPSG_NETTO)
+					{
+						
+						$this->shop->view['wpsg_mod_scaleprice']['scale'][$k]['value'] = wpsg_calculatePreis(
+							$discount_backend_value,
+							WPSG_NETTO,
+							$this->shop->getCalcTaxValue($product_data['mwst_key'])
+						);
+						
+					}
+					else
+					{
+						
+						$this->shop->view['wpsg_mod_scaleprice']['scale'][$k]['value'] = $discount_backend_value;
+						
+					}
+					
+				}
+				
+			}
 			 
-					$arScale[$k]['value'] = $oProduct->getPrice($produkt_key, $this->shop->getFrontendTaxview(), $v['scale'], false);
-					
-				} else {
-					
-					$arScale[$k]['value'] = $oProduct->getPrice($produkt_key, $this->shop->getFrontendTaxview(), false, $v['scale']);
-					
-				}
-				
-			}
-			
-			$this->shop->view['wpsg_mod_scaleprice']['base'] = $oProduct->getPrice($produkt_key, $this->shop->getFrontendTaxview(),false, false, false);
-			$this->shop->view['wpsg_mod_scaleprice']['scale'] = $arScale;			
-			$this->shop->view['wpsg_mod_scaleprice']['typ'] = $oProduct->wpsg_mod_scaleprice_typ;
+			if (!wpsg_isSizedArray($this->shop->view['wpsg_mod_scaleprice']['scale'])) return;
+			
+			$this->shop->view['wpsg_mod_scaleprice']['typ'] = $product_data['wpsg_mod_scaleprice_typ'];
 			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_scaleprice/product_bottom.phtml');
-			  
+			
 		} // public function product_bottom(&$produkt_id, $template_index)
 		
-		/**
-		 * @param wpsg_product $oProduct
-		 * @param double $price_netto
-		 * @param double $price_brutto
-		 * @param string ProduktschlÃŒssel
-		 */
-		public function product_getPrice(&$oProduct, &$price_netto, &$price_brutto, $product_key, $amount, $weight) { 
-			 
-			if ($product_key === false) $product_key = $oProduct->id;
-			
-			if ($oProduct->wpsg_mod_scaleprice_activ === '1') {
-				
-				if ($oProduct->wpsg_mod_scaleprice_typ == wpsg_mod_scaleprice::TYP_QUANTITY) {
-					
-					if ($amount === false) {
-					
-						$amount_basket = 0;
-					
-						// Menge im Warenkorb bestimmen
-						if (wpsg_isSizedArray($_SESSION['wpsg']['basket'])) {
-						
-							foreach ($_SESSION['wpsg']['basket'] as $product_index => $basket_data) {
-								
-								if ($product_key === $basket_data['id']) $amount_basket += $basket_data['menge'];
-								
-							}
-						
-						}
-					
-					} else $amount_basket = $amount;
-						 
-					$scale = $amount_basket;
-					
-				} else if ($this->shop->hasMod('wpsg_mod_weight') && $oProduct->wpsg_mod_scaleprice_typ == wpsg_mod_scaleprice::TYP_WEIGHT) {
-					
-					$weight_basket = 0;
-					
-					if ($weight === false) {
-					
-						// Menge im Warenkorb bestimmen					
-						foreach ($_SESSION['wpsg']['basket'] as $product_index => $basket_data) {
-							
-							if ($this->shop->getProduktID($basket_data['id']) == $oProduct->id) {
-								
-								$weight_basket += $basket_data['menge'] * $this->shop->callMod('wpsg_mod_weight', 'getWeight', [$product_key]);
-								
-							}
-							
-						}
-						
-					} else {
-						
-						$weight_basket += $weight;
-						
-					}
-					 
-					$scale = $weight_basket;
-										
-				} else throw new \wpsg\Exception(__('UngÃŒltige Preisberechnung bei Produkttemplate', 'wpsg'));
-				
-				if ($this->shop->getBackendTaxview() === WPSG_BRUTTO) {
-					
-					$price_brutto = $this->getScalePrice($oProduct, $price_brutto, $scale);
-					$price_netto = wpsg_calculatePreis($price_brutto, WPSG_NETTO, $this->shop->getDefaultCountry()->getTax($oProduct->mwst_key));
-					
-				} else {
-				
-					$price_netto = $this->getScalePrice($oProduct, $price_netto, $scale);
-					$price_brutto = wpsg_calculatePreis($price_netto, WPSG_BRUTTO, $this->shop->getDefaultCountry()->getTax($oProduct->mwst_key));
-					
-				}
-				
-			}
-			
-		}
-		
-		public function loadProduktArray0(&$product_data) {
-
+		public function loadProduktArray(&$product_data)
+		{
+						
 			$product_key = $product_data['id'];
 			$product_id = $this->shop->getProduktId($product_key);
 			$product_data_db = $this->shop->cache->loadProduct($product_id);
-
+			 
 			if ($product_data_db['wpsg_mod_scaleprice_activ'] == '1')
 			{
@@ -347,7 +294,7 @@
 				if ($product_data_db['wpsg_mod_scaleprice_typ'] == wpsg_mod_scaleprice::TYP_QUANTITY)
 				{
-
-					$scale = ((isset($product_data['menge']))?$product_data['menge']:0);
-					 
+				
+					$scale = $product_data['menge'];
+				
 				}
 				else if ($this->shop->hasMod('wpsg_mod_weight') && $product_data_db['wpsg_mod_scaleprice_typ'] == wpsg_mod_scaleprice::TYP_WEIGHT)
@@ -357,5 +304,11 @@
 				
 				}
-				else throw new \wpsg\Exception(__('UngÃŒltige Preisberechnung bei Produkttemplate', 'wpsg'));
+				else
+				{
+				
+					$this->shop->throwErrorCode('1640_4');
+					return;
+				
+				}
 				
 				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
@@ -373,5 +326,5 @@
 					
 				}
-				 
+				
 				$product_data['preis_brutto'] = $preis_brutto;
 				$product_data['preis_netto'] = $preis_netto;
@@ -403,96 +356,20 @@
 			
 		} // public function loadProduktArray(&$product_data)
-
-		public function wpsg_mod_export_loadFields(&$arFields) {
-
-			$arFields[20]['fields']['scaleprice_min_produkt_preis_brutto'] = __('minimaler Produktpreis (Brutto)', 'wpsg');
-			$arFields[20]['fields']['scaleprice_min_produkt_preis_netto'] = __('minimaler Produktpreis (Netto)', 'wpsg');
-
-		}
-
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-
-			if (in_array($field_value, array('scaleprice_min_produkt_preis_brutto', 'scaleprice_min_produkt_preis_netto'))) {
-
-				if ($p_id > 0) {
-
-					$oProduct = wpsg_product::getInstance($p_id);
-
-					if ($this->product_has_scaleprice($p_id)) {
-
-						$min_price_backend = $this->getMinScalePrice(intval($p_id));
-						$tax_value = $oProduct->getDefaultTaxValue(); // 19.00
-
-						// --> Netto
-						if ($this->shop->getBackendTaxview() == WPSG_NETTO) {
-
-							$min_price_backend_netto = $min_price_backend;
-							$min_price_backend_brutto = wpsg_calculatePreis($min_price_backend_netto, WPSG_BRUTTO, $tax_value);
-
-						}
-						else {
-
-							$min_price_backend_netto = wpsg_calculatePreis($min_price_backend, WPSG_NETTO, $tax_value);
-							$min_price_backend_brutto = $min_price_backend;
-
-						}
-
-						if ($field_value === 'scaleprice_min_produkt_preis_brutto') {
-
-							$return = $min_price_backend_brutto;
-
-						} else if ($field_value === 'scaleprice_min_produkt_preis_netto') {
-
-							$return = $min_price_backend_netto;
-
-						}
-
-					} else {
-
-						if ($field_value === 'scaleprice_min_produkt_preis_brutto') {
-
-							$return = $oProduct->getPrice(false, WPSG_BRUTTO);
-
-						} else if ($field_value === 'scaleprice_min_produkt_preis_netto') {
-
-							$return = $oProduct->getPrice(false, WPSG_NETTO);
-
-						}
-
-					}
-
-				}
-
-			}
-
-		}
-
+		 		
 		/* Modulfunktionen */
-
-		/**
-		 * Gibt true zurÃŒck, wenn das Produkt Preisstaffeln verwendet
-		 * @param int $product_id
-		 */
-		public function product_has_scaleprice(int $product_id): bool {
-			
-			$scaleprice_activ = intval($this->db->fetchOne("SELECT `wpsg_mod_scaleprice_activ` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".intval($product_id)."' "));
-			
-			if ($scaleprice_activ <= 0) return false;
-			
-			$nScaleCount = intval($this->db->fetchOne("SELECT COUNT(*) FROM `".WPSG_TBL_SCALEPRICE."` WHERE `product_id` = '".intval($product_id)."'  "));
-			
-			return $nScaleCount > 0; 
-			
-		}
-
-		public function getScalePrice($oProduct, $price, $scale) {
-			
-			$arScale = $this->getProductScaleAsArray($oProduct->getId());
-
+		
+		private function getScalePrice($product_id, $price, $scale)
+		{
+			
+			$arScale = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_SCALEPRICE."` WHERE `product_id` = '".wpsg_q($product_id)."' ORDER BY `scale` ASC");
+			$produkt_data = $this->shop->cache->loadProduct($product_id);
+			
 			$set_scale = false;
 			
-			foreach ($arScale as $s) {
+			foreach ($arScale as $s)
+			{
 				 
-				if (wpsg_tf($scale) >= wpsg_tf($s['scale'])) {
+				if (wpsg_tf($scale) >= wpsg_tf($s['scale']))
+				{
 					
 					$set_scale = wpsg_tf($s['value']);
@@ -503,17 +380,30 @@
 			}
 			
-			if ($set_scale !== false) {
-				
-				if ($oProduct->wpsg_mod_scaleprice_calc == wpsg_mod_scaleprice::CALC_REPLACE) { 
+			if ($set_scale !== false)
+			{
+				
+				if ($produkt_data['wpsg_mod_scaleprice_calc'] == wpsg_mod_scaleprice::CALC_REPLACE)
+				{ 
 					
 					return $set_scale;
 					
-				} else if ($oProduct->wpsg_mod_scaleprice_calc == wpsg_mod_scaleprice::CALC_ADD) {
+				}
+				else if ($produkt_data['wpsg_mod_scaleprice_calc'] == wpsg_mod_scaleprice::CALC_ADD)
+				{
 					
 					return $price + $set_scale;
 					
-				} else throw new \wpsg\Exception(__('UngÃŒltige Preisberechnung im Frontend', 'wpsg'));
-				
-			} else {
+				}
+				else
+				{
+					
+					$this->shop->throwErrorCode('1640_3');
+					return $price;
+					
+				}
+				
+			}
+			else
+			{
 			
 				return $price;
@@ -523,11 +413,15 @@
 		} // private function getStaffel($product_id)
 		
-		private function scaleList($product_id, $typ = false) {
-			
-			if ($typ === false) {
+		private function scaleList($product_id, $typ = false)
+		{
+			
+			if ($typ === false)
+			{
 			
 				$this->shop->view['wpsg_mod_scaleprice']['typ'] = $this->db->fetchOne("SELECT `wpsg_mod_scaleprice_typ` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."'");
 				
-			} else {
+			}
+			else
+			{
 				
 				$this->shop->view['wpsg_mod_scaleprice']['typ'] = $typ;
@@ -549,16 +443,6 @@
 			
 		} // private function scaleList($product_id)
+		
+	} // class wpsg_mod_scaleprice extends wpsg_mod_basic
 
-		public function getProductScaleAsArray(int $product_id): array {
-
-			return $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_SCALEPRICE."` WHERE `product_id` = '".intval($product_id)."' ORDER BY `scale` ASC");
-
-		}
-
-		public function getMinScalePrice(int $product_id): float {
-
-			return floatval($this->db->fetchOne("SELECT MIN(`value`) FROM `".WPSG_TBL_SCALEPRICE."` WHERE `product_id` = '".intval($product_id)."'"));
-
-		}
-
-	} // class wpsg_mod_scaleprice extends wpsg_mod_basic
+?>
Index: /mods/wpsg_mod_securepay.class.php
===================================================================
--- /mods/wpsg_mod_securepay.class.php	(revision 8528)
+++ /mods/wpsg_mod_securepay.class.php	(revision 5261)
@@ -14,5 +14,12 @@
 		var $version = "9.9.9";
 		var $free = true;
-		 		
+		
+		var $curl_options = array(
+			CURLINFO_HEADER_OUT => true,
+			CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded;charset=UTF-8'),
+			CURLOPT_FOLLOWLOCATION => 0,
+			/*CURLOPT_SSL_VERIFYPEER => false*/
+		);
+		
 		var $api_url = array(
 			'generateToken' => array(
@@ -86,50 +93,87 @@
 		{
 						
-		    $this->shop->update_option('wpsg_mod_securepay_sandbox', $_REQUEST['wpsg_mod_securepay_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_securepay_sender', $_REQUEST['wpsg_mod_securepay_sender'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_securepay_channelid', $_REQUEST['wpsg_mod_securepay_channelid'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_securepay_userid', $_REQUEST['wpsg_mod_securepay_userid'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_securepay_password', $_REQUEST['wpsg_mod_securepay_password'], false, false, WPSG_SANITIZE_APIKEY);
-			
-			$this->shop->update_option('wpsg_mod_securepay_activ', $_REQUEST['wpsg_mod_securepay_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_securepay_paymenttypes', $_REQUEST['wpsg_mod_securepay_paymenttypes'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_securepay_name', $_REQUEST['wpsg_mod_securepay_name'], false, false, WPSG_SANITIZE_TEXTFIELD); $this->shop->addTranslationString('wpsg_mod_securepay_name', wpsg_sinput("text_field", $_REQUEST['wpsg_mod_securepay_name']));
-			$this->shop->update_option('wpsg_mod_securepay_hint', $_REQUEST['wpsg_mod_securepay_hint'], false, false, WPSG_SANITIZE_TEXTFIELD); $this->shop->addTranslationString('wpsg_mod_securepay_hint', wpsg_sinput("text_field", $_REQUEST['wpsg_mod_securepay_hint']));
-			$this->shop->update_option('wpsg_mod_securepay_logo', $_REQUEST['wpsg_mod_securepay_logo'], false, false, WPSG_SANITIZE_PATH);
-			$this->shop->update_option('wpsg_mod_securepay_language', $_REQUEST['wpsg_mod_securepay_language'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_securepay_gebuehr', $_REQUEST['wpsg_mod_securepay_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_securepay_mwst', $_REQUEST['wpsg_mod_securepay_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_securepay_mwstland', $_REQUEST['wpsg_mod_securepay_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_securepay_successPage', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_securepay_successPage']));
-			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_securepay_errorPage', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_mod_securepay_errorPage']));
+			$this->shop->update_option('wpsg_mod_securepay_sandbox', $_REQUEST['wpsg_mod_securepay_sandbox']);
+			$this->shop->update_option('wpsg_mod_securepay_sender', $_REQUEST['wpsg_mod_securepay_sender']);
+			$this->shop->update_option('wpsg_mod_securepay_channelid', $_REQUEST['wpsg_mod_securepay_channelid']);
+			$this->shop->update_option('wpsg_mod_securepay_userid', $_REQUEST['wpsg_mod_securepay_userid']);
+			$this->shop->update_option('wpsg_mod_securepay_password', $_REQUEST['wpsg_mod_securepay_password']);
+			
+			$this->shop->update_option('wpsg_mod_securepay_activ', $_REQUEST['wpsg_mod_securepay_activ']);
+			$this->shop->update_option('wpsg_mod_securepay_paymenttypes', $_REQUEST['wpsg_mod_securepay_paymenttypes']);
+			$this->shop->update_option('wpsg_mod_securepay_name', $_REQUEST['wpsg_mod_securepay_name']); $this->shop->addTranslationString('wpsg_mod_securepay_name', $_REQUEST['wpsg_mod_securepay_name']);
+			$this->shop->update_option('wpsg_mod_securepay_hint', $_REQUEST['wpsg_mod_securepay_hint']); $this->shop->addTranslationString('wpsg_mod_securepay_hint', $_REQUEST['wpsg_mod_securepay_hint']);
+			$this->shop->update_option('wpsg_mod_securepay_logo', $_REQUEST['wpsg_mod_securepay_logo']);			
+			$this->shop->update_option('wpsg_mod_securepay_language', $_REQUEST['wpsg_mod_securepay_language']);
+			$this->shop->update_option('wpsg_mod_securepay_gebuehr', $_REQUEST['wpsg_mod_securepay_gebuehr']);
+			$this->shop->update_option('wpsg_mod_securepay_mwst', $_REQUEST['wpsg_mod_securepay_mwst']);
+			$this->shop->update_option('wpsg_mod_securepay_mwstland', $_REQUEST['wpsg_mod_securepay_mwstland']);
+			
+			$this->shop->createPage(__('Erfolgreiche Zahlung', 'wpsg'), 'wpsg_mod_securepay_successPage', $_REQUEST['wpsg_mod_securepay_successPage']);
+			$this->shop->createPage(__('Fehlerhafte Zahlung', 'wpsg'), 'wpsg_mod_securepay_errorPage', $_REQUEST['wpsg_mod_securepay_errorPage']);
 			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_mod_securepay_successPage'));
-            wp_delete_post($this->shop->get_option('wpsg_mod_securepay_errorPage'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function addPayment(&$arPayment) {
-				
-			if (is_admin() || $this->shop->get_option('wpsg_mod_securepay_activ') == '1') {
+		
+		public function addPayment(&$arPayment)
+		{
+				
+			if (is_admin() || $this->shop->get_option('wpsg_mod_securepay_activ') == '1')
+			{
+		
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_securepay_mwst'), $this->shop->getDefaultCountry());
 		
 				$arPayment[$this->id] = array(
 					'id' => $this->id,
 					'name' => __($this->shop->get_option('wpsg_mod_securepay_name'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_securepay_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_securepay_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_securepay_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_securepay_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_securepay_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_securepay_hint'), 'wpsg'),
-					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_securepay_logo')))?$this->shop->get_option('wpsg_mod_securepay_logo'):$this->shop->getRessourceURL('mods/mod_securepay/gfx/logo_100x25.png'))
+					'logo' => ((wpsg_isSizedString($this->shop->get_option('wpsg_mod_securepay_logo')))?$this->shop->get_option('wpsg_mod_securepay_logo'):$this->shop->getRessourceURL('mods/mod_securepay/gfx/securepay.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_securepay/gfx/logo_100x25.png')
 				);
 		
+				$this->setPayShipPrice($this->shop->get_option('wpsg_mod_securepay_gebuehr'), $mwst_value, $arPayment, $this->id);
+		
 			}
 			
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket)
+		{
+		
+			if ($this->id == $arBasket['checkout']['payment'])
+			{
+				
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_securepay_gebuehr'), $arBasket['sum']['preis']);
+				$mwstland = $this->shop->get_option('wpsg_mod_securepay_mwstland');
+				$mwst = $this->shop->get_option('wpsg_mod_securepay_mwst');
+
+				if ($mwstland == '1' && $arBasket['noMwSt'])
+				{
+				
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+				
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+				
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $mwst);
+				
+				}
+				
+			}
+			
+		} // public function calcPayment(&$arBasket)
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -214,5 +258,5 @@
 		} // public function order_done(&$order_id, &$done_view)
 			
-		public function template_redirect()
+		public function wp_loaded()
 		{
 		
@@ -227,7 +271,7 @@
 				if ($this->shop->get_option('wpsg_mod_securepay_sandbox') === '1') $url = $this->api_url['GetStatus']['test']; 
 				
-				$url .= wpsg_sinput("text_field", $_REQUEST['token']);
-				
-				$result = $this->shop->get_url_post_content($url, $arParam);
+				$url .= $_REQUEST['token'];
+				
+				$result = $this->shop->get_url_post_content($url, $arParam, $this->curl_options);
 				$resultJson = json_decode($result, true);
 				
@@ -278,5 +322,5 @@
 			}		
 				
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function mail_payment()
@@ -348,5 +392,5 @@
 			if ($this->shop->get_option('wpsg_mod_securepay_sandbox') === '1') $url = $this->api_url['generateToken']['test'];
 			 
-			$result = $this->shop->get_url_post_content($url, $arParam);
+			$result = $this->shop->get_url_post_content($url, $arParam, $this->curl_options);
 			$ident = json_decode($result);
 		 
Index: /mods/wpsg_mod_shippingadress.class.php
===================================================================
--- /mods/wpsg_mod_shippingadress.class.php	(revision 8528)
+++ /mods/wpsg_mod_shippingadress.class.php	(revision 5261)
@@ -13,5 +13,5 @@
 
 		/**
-		 * Constructor
+		 * Costructor
 		 */
 		public function __construct()
@@ -44,59 +44,19 @@
 		} // public function settings_save()
 				
-		public function order_ajax() {
-				
-			if (!wpsg_checkInput($_REQUEST['edit_id'], WPSG_SANITIZE_INT)) throw \wpsg\Exception::getSanitizeException();
-			
-			$r = [
-				'edit_id' => intval($_REQUEST['edit_id'])				
-			];
-			
+		public function order_ajax()
+		{
+				
 			parse_str($_REQUEST['form_data'], $form_data);
-			
-			$shipping_adress_id = intval($this->db->fetchOne("
-				SELECT
-					`shipping_adress_id`
-				FROM
-					`".WPSG_TBL_ORDER."`
-				WHERE
-					`id` = '".wpsg_q(wpsg_sinput("key", $r['edit_id']))."'
-			"));
-			
-			if ($form_data['dialog_delete'] === '1') {
-				
-				if ($shipping_adress_id > 0) {
-				
-					$this->db->Query("DELETE FROM `".WPSG_TBL_ADRESS."` WHERE `id` = '".wpsg_q($shipping_adress_id)."' ");
-					
-				}
-				
-				$this->db->UpdateQuery(WPSG_TBL_ORDER, ['shipping_adress_id' => ''], " `id` = '".wpsg_q($r['edit_id'])."' ");
-				
-			} else {
-			
-				$db_data = [
-					'firma' => wpsg_q($form_data['dialog_shipping_firma']),
-					'title' => wpsg_q($form_data['dialog_shipping_title']),
-					'vname' => wpsg_q($form_data['dialog_shipping_vname']),
-					'name' => wpsg_q($form_data['dialog_shipping_name']),
-					'strasse' => wpsg_q($form_data['dialog_shipping_strasse']),
-					'nr' => wpsg_q($form_data['dialog_shipping_nr']),
-					'plz' => wpsg_q($form_data['dialog_shipping_plz']),
-					'ort' => wpsg_q($form_data['dialog_shipping_ort']),
-					'land' => wpsg_q($form_data['dialog_shipping_land'])
-				];
-				
-				if ($shipping_adress_id > 0) {
-					
-					$this->db->UpdateQuery(WPSG_TBL_ADRESS, $db_data, " `id` = '".wpsg_q($shipping_adress_id)."' ");
-					
-				} else {
-					
-					$shipping_adress_id = $this->db->ImportQuery(WPSG_TBL_ADRESS, $db_data);
-					$this->db->UpdateQuery(WPSG_TBL_ORDER, ['shipping_adress_id' => wpsg_q($shipping_adress_id)], " `id` = '".wpsg_q($r['edit_id'])."' ");
-					 
-				}
-				
-			}
+			 
+			$this->db->UpdateQuery(WPSG_TBL_ORDER, array(
+				'shipping_firma' => wpsg_q($form_data['dialog_shipping_firma']),
+				'shipping_title' => wpsg_q($form_data['dialog_shipping_title']),
+				'shipping_vname' => wpsg_q($form_data['dialog_shipping_vname']),
+				'shipping_name' => wpsg_q($form_data['dialog_shipping_name']),
+				'shipping_strasse' => wpsg_q($form_data['dialog_shipping_strasse']),
+				'shipping_plz' => wpsg_q($form_data['dialog_shipping_plz']),
+				'shipping_ort' => wpsg_q($form_data['dialog_shipping_ort']),
+				'shipping_land' => wpsg_q($form_data['dialog_shipping_land'])
+			), " `id` = '".wpsg_q($_REQUEST['edit_id'])."' ");
 			
 			die("1");
@@ -116,5 +76,37 @@
 			
 		} // public function checkout_inner_prebutton(&$checkout_view)
-		 		
+		
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		{ 
+ 
+			if ($checkout['diff_shippingadress'] == '1')
+			{
+
+				$data['shipping_title'] 	= wpsg_q($checkout['shipping_title']);
+				$data['shipping_vname'] 	= wpsg_q($checkout['shipping_vname']);
+				$data['shipping_name'] 		= wpsg_q($checkout['shipping_name']);
+				$data['shipping_strasse'] 	= wpsg_q($checkout['shipping_strasse']); 
+				$data['shipping_plz'] 		= wpsg_q($checkout['shipping_plz']);
+				$data['shipping_ort'] 		= wpsg_q($checkout['shipping_ort']);
+				$data['shipping_firma'] 	= wpsg_q($checkout['shipping_firma']);
+				$data['shipping_land'] 		= wpsg_q($checkout['shipping_land']);
+				 
+			}
+			else 
+			{
+				
+				$data['shipping_title']		= wpsg_q($checkout['title']);
+				$data['shipping_vname'] 	= wpsg_q($checkout['vname']);
+				$data['shipping_name'] 		= wpsg_q($checkout['name']);
+				$data['shipping_strasse'] 	= wpsg_q($checkout['strasse']); 
+				$data['shipping_plz'] 		= wpsg_q($checkout['plz']);
+				$data['shipping_ort'] 		= wpsg_q($checkout['ort']);
+				$data['shipping_firma'] 	= wpsg_q($checkout['firma']);
+				$data['shipping_land'] 		= wpsg_q($checkout['land']);				
+				
+			}
+
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
 		public function checkCheckout(&$state, &$error, &$arCheckout)  
 		{
@@ -123,33 +115,15 @@
 			{
 		 
-				if (wpsg_getStr($_REQUEST['wpsg']['checkout']['diff_shippingadress']) == '1')
+				if ($_REQUEST['wpsg']['checkout']['diff_shippingadress'] == '1')
 				{
 	
-					$pflicht = $GLOBALS['wpsg_sc']->loadPflichtFeldDaten();
-					
 					$arCheckout['diff_shippingadress'] = 1;
-					if (($pflicht['firma'] != '2') && ($pflicht['firma'] != '1') && ($arCheckout['shipping_firma'] == ''))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_firma';
-					if (($pflicht['anrede'] != '2') && ($pflicht['anrede'] != '1') && ($arCheckout['shipping_title'] == '-1'))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_title';
-					if (($pflicht['plz'] != '2') && ($pflicht['plz'] != '1') && ($arCheckout['shipping_plz'] == ''))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_plz';
-					if (($pflicht['vname'] != '2') && ($pflicht['vname'] != '1') && ($arCheckout['shipping_vname'] == ''))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_vname';
-					if (($pflicht['name'] != '2') && ($pflicht['name'] != '1') && ($arCheckout['shipping_name'] == ''))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_name';
-					if (($pflicht['strasse'] != '2') && ($pflicht['strasse'] != '1') && ($arCheckout['shipping_strasse'] == ''))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_strasse';
-					if (($pflicht['ort'] != '2') && ($pflicht['ort'] != '1') && ($arCheckout['shipping_ort'] == ''))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_ort';
-					if (($pflicht['land'] != '2') && ($pflicht['land'] != '1') && (!wpsg_isSizedInt($arCheckout['shipping_land'])))
-						$_SESSION['wpsg']['errorFields'][] = 'shipping_land';
-					
-					if ($pflicht['wpsg_showNr'] === '1') {
-						
-						if (($pflicht['strasse'] != '2') && ($pflicht['strasse'] != '1') && ($arCheckout['shipping_nr'] == ''))
-							$_SESSION['wpsg']['errorFields'][] = 'shipping_nr';
-						
-					}
+					($arCheckout['shipping_title'] == '')?$_SESSION['wpsg']['errorFields'][] = 'shipping_title':'';
+					($arCheckout['shipping_plz'] == '')?$_SESSION['wpsg']['errorFields'][] = 'shipping_plz':'';
+					($arCheckout['shipping_vname'] == '')?$_SESSION['wpsg']['errorFields'][] = 'shipping_vname':'';
+					($arCheckout['shipping_name'] == '')?$_SESSION['wpsg']['errorFields'][] = 'shipping_name':'';
+					($arCheckout['shipping_strasse'] == '')?$_SESSION['wpsg']['errorFields'][] = 'shipping_strasse':'';
+					($arCheckout['shipping_ort'] == '')?$_SESSION['wpsg']['errorFields'][] = 'shipping_ort':'';
+					(!wpsg_isSizedInt($arCheckout['shipping_land']))?$_SESSION['wpsg']['errorFields'][] = 'shipping_land':'';
 					
 					if (count($_SESSION['wpsg']['errorFields']) > 0)
@@ -171,5 +145,4 @@
 					unset($_SESSION['wpsg']['checkout']['shipping_name']); unset($arCheckout['shipping_name']);				
 					unset($_SESSION['wpsg']['checkout']['shipping_strasse']); unset($arCheckout['shipping_strasse']);
-					unset($_SESSION['wpsg']['checkout']['shipping_nr']); unset($arCheckout['shipping_nr']);
 					unset($_SESSION['wpsg']['checkout']['shipping_ort']); unset($arCheckout['shipping_ort']);
 					unset($_SESSION['wpsg']['checkout']['shipping_land']); unset($arCheckout['shipping_land']);
@@ -189,32 +162,12 @@
 			$order_data = $this->shop->cache->loadOrder($order_id);
 			
-			if ($this->check_different_shippingadress($order_data['k_id'], $order_id) === false) {
-
-				$this->shop->view['wpsg_mod_shippingadress'] = [];
-				
-			} else {
-				
-				$this->shop->view['wpsg_mod_shippingadress'] = $this->db->fetchRow("
-					SELECT
-						`title` AS shipping_title,
-						`name` AS shipping_name,
-						`vname` AS shipping_vname,
-						`firma` AS shipping_firma,
-						`strasse` AS shipping_strasse,
-						`nr` AS shipping_nr,
-						`plz` AS shipping_plz,
-						`ort` AS shipping_ort,
-						`land` AS shipping_land
-					FROM
-						`".WPSG_TBL_ADRESS."`
-					WHERE
-						`id` = '".wpsg_q($order_data['shipping_adress_id'])."'
-				");
-
-				$this->shop->view['wpsg_mod_shippingadress']['oCountry'] = wpsg_country::getInstance($this->shop->view['wpsg_mod_shippingadress']['shipping_land']);
-									
-			}
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml');			
+			if ($this->check_different_shippingadress($order_data['k_id'], $order_id) === true)
+			{
+
+				$this->shop->view['wpsg_mod_shippingadress'] = $order_data;
+				
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml');
+				
+			}
 			
 		} // public function wpsg_order_view_customerdata(&$order_id)
@@ -223,5 +176,5 @@
 		public function check_different_shippingadress($k_id, $o_id)
 		{	
-			/* TODO alt
+			
 			$arrAdrKunde = $this->db->fetchRow("SELECT 
 													`name`, `vname`, `firma`, `strasse`, `plz`, `ort`, `land` 
@@ -243,5 +196,5 @@
 												WHERE
 													`id` = '".wpsg_q($o_id)."'");
-
+	
 			if (wpsg_isSizedArray($arrAdrShipping))
 			{
@@ -249,7 +202,6 @@
 			}
 
-			if (wpsg_isSizedArray($arrDiff) && implode('', $arrAdrShipping) != "")
-			{
-
+			if (wpsg_isSizedArray($arrDiff))
+			{
 				return true;
 			}
@@ -258,15 +210,4 @@
 				return false;
 			}
-			*/
-			
-			$arrAdr = $this->db->fetchRow("SELECT *
-											FROM
-												`".WPSG_TBL_ORDER."`
-											WHERE
-												`id` = '".wpsg_q($o_id)."'");
-
-			if ($arrAdr['shipping_adress_id'] == 0) return false;
-			if ($arrAdr['shipping_adress_id'] != $arrAdr['adress_id']) return true;
-			return false;
 			
 		} // public function check_different_shippingadress()
@@ -274,2 +215,3 @@
 	}
 	
+?>
Index: /mods/wpsg_mod_shs.class.php
===================================================================
--- /mods/wpsg_mod_shs.class.php	(revision 8528)
+++ /mods/wpsg_mod_shs.class.php	(revision 5261)
@@ -112,53 +112,48 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_shs_bezeichnung_creditcard', $_REQUEST['wpsg_mod_shs_bezeichnung_creditcard'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_shs_aktiv_creditcard', $_REQUEST['wpsg_mod_shs_aktiv_creditcard'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_hint_creditcard', $_REQUEST['wpsg_mod_shs_hint_creditcard'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_shs_bezeichnung_maestro', $_REQUEST['wpsg_mod_shs_bezeichnung_maestro'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_shs_aktiv_maestro', $_REQUEST['wpsg_mod_shs_aktiv_maestro'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_hint_maestro', $_REQUEST['wpsg_mod_shs_hint_maestro'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_shs_bezeichnung_directdebit', $_REQUEST['wpsg_mod_shs_bezeichnung_directdebit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_shs_aktiv_directdebit', $_REQUEST['wpsg_mod_shs_aktiv_directdebit'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_hint_directdebit', $_REQUEST['wpsg_mod_shs_hint_directdebit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_shs_mwst', $_REQUEST['wpsg_mod_shs_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_shs_gebuehr', $_REQUEST['wpsg_mod_shs_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_shs_mwstland', $_REQUEST['wpsg_mod_shs_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_autostart', $_REQUEST['wpsg_mod_shs_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_autoend', $_REQUEST['wpsg_mod_shs_autoend'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_shs_mobileversion', wpsg_getStr($_REQUEST['wpsg_mod_shs_mobileversion']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_creditcard_cardholder', wpsg_getStr($_REQUEST['wpsg_mod_shs_creditcard_cardholder']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_creditcard_optionalcardholder', wpsg_getStr($_REQUEST['wpsg_mod_shs_creditcard_optionalcardholder']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_creditcard_sslifvisaenrolledu', wpsg_getStr($_REQUEST['wpsg_mod_shs_creditcard_sslifvisaenrolledu']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_directdebit_accountholder', wpsg_getStr($_REQUEST['wpsg_mod_shs_directdebit_accountholder']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_directdebit_optionalaccountholder', wpsg_getStr($_REQUEST['wpsg_mod_shs_directdebit_optionalaccountholder']), false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_directdebit_checklist', wpsg_getStr($_REQUEST['wpsg_mod_shs_directdebit_checklist']), false, false, WPSG_SANITIZE_CHECKBOX);
-
-			$this->shop->update_option('wpsg_mod_shs_transactiontype', $_REQUEST['wpsg_mod_shs_transactiontype'], false, false, WPSG_SANITIZE_INT);
-			
-			$this->shop->update_option('wpsg_mod_shs_sandbox', $_REQUEST['wpsg_mod_shs_sandbox'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_shs_sslmerchant', $_REQUEST['wpsg_mod_shs_sslmerchant'], false, false, WPSG_SANITIZE_TEXTAREA);
-			$this->shop->update_option('wpsg_mod_shs_sslpw', $_REQUEST['wpsg_mod_shs_sslpw'], false, false, WPSG_SANITIZE_TEXTAREA);
+			
+			$this->shop->update_option('wpsg_mod_shs_bezeichnung_creditcard', $_REQUEST['wpsg_mod_shs_bezeichnung_creditcard']);
+			$this->shop->update_option('wpsg_mod_shs_aktiv_creditcard', $_REQUEST['wpsg_mod_shs_aktiv_creditcard']); 
+			$this->shop->update_option('wpsg_mod_shs_hint_creditcard', $_REQUEST['wpsg_mod_shs_hint_creditcard']);
+			
+			$this->shop->update_option('wpsg_mod_shs_bezeichnung_maestro', $_REQUEST['wpsg_mod_shs_bezeichnung_maestro']);
+			$this->shop->update_option('wpsg_mod_shs_aktiv_maestro', $_REQUEST['wpsg_mod_shs_aktiv_maestro']);
+			$this->shop->update_option('wpsg_mod_shs_hint_maestro', $_REQUEST['wpsg_mod_shs_hint_maestro']);
+			
+			$this->shop->update_option('wpsg_mod_shs_bezeichnung_directdebit', $_REQUEST['wpsg_mod_shs_bezeichnung_directdebit']);
+			$this->shop->update_option('wpsg_mod_shs_aktiv_directdebit', $_REQUEST['wpsg_mod_shs_aktiv_directdebit']);
+			$this->shop->update_option('wpsg_mod_shs_hint_directdebit', $_REQUEST['wpsg_mod_shs_hint_directdebit']);
+			
+			$this->shop->update_option('wpsg_mod_shs_mwst', $_REQUEST['wpsg_mod_shs_mwst']);
+			$this->shop->update_option('wpsg_mod_shs_gebuehr', $_REQUEST['wpsg_mod_shs_gebuehr']);
+			$this->shop->update_option('wpsg_mod_shs_mwstland', $_REQUEST['wpsg_mod_shs_mwstland']);			
+			$this->shop->update_option('wpsg_mod_shs_autostart', $_REQUEST['wpsg_mod_shs_autostart']);
+			$this->shop->update_option('wpsg_mod_shs_autoend', $_REQUEST['wpsg_mod_shs_autoend']);			
+			
+			$this->shop->update_option('wpsg_mod_shs_mobileversion', $_REQUEST['wpsg_mod_shs_mobileversion']);
+			$this->shop->update_option('wpsg_mod_shs_creditcard_cardholder', $_REQUEST['wpsg_mod_shs_creditcard_cardholder']);
+			$this->shop->update_option('wpsg_mod_shs_creditcard_optionalcardholder', $_REQUEST['wpsg_mod_shs_creditcard_optionalcardholder']);
+			$this->shop->update_option('wpsg_mod_shs_creditcard_sslifvisaenrolledu', $_REQUEST['wpsg_mod_shs_creditcard_sslifvisaenrolledu']);
+			$this->shop->update_option('wpsg_mod_shs_directdebit_accountholder', $_REQUEST['wpsg_mod_shs_directdebit_accountholder']);
+			$this->shop->update_option('wpsg_mod_shs_directdebit_optionalaccountholder', $_REQUEST['wpsg_mod_shs_directdebit_optionalaccountholder']);
+			$this->shop->update_option('wpsg_mod_shs_directdebit_checklist', $_REQUEST['wpsg_mod_shs_directdebit_checklist']);
+			$this->shop->update_option('wpsg_mod_shs_transactiontype', $_REQUEST['wpsg_mod_shs_transactiontype']);
+			
+			$this->shop->update_option('wpsg_mod_shs_sandbox', $_REQUEST['wpsg_mod_shs_sandbox']);					
+			$this->shop->update_option('wpsg_mod_shs_sslmerchant', $_REQUEST['wpsg_mod_shs_sslmerchant']);
+			$this->shop->update_option('wpsg_mod_shs_sslpw', $_REQUEST['wpsg_mod_shs_sslpw']);			
 									
-			$this->shop->update_option('wpsg_mod_shs_apiurl', $_REQUEST['wpsg_mod_shs_apiurl'], false, false, WPSG_SANITIZE_TEXTFIELD);
-						
-			$this->shop->createPage(__('Erfolgreiche Zahlung (Sparkassen Internetkasse)', 'wpsg'), 'wpsg_page_mod_shs_success', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_page_mod_shs_success']));
-			$this->shop->createPage(__('Fehlgeschlagene Zahlung (Sparkassen Internetkasse)', 'wpsg'), 'wpsg_page_mod_shs_error', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_page_mod_shs_error']));
+			$this->shop->update_option('wpsg_mod_shs_apiurl', $_REQUEST['wpsg_mod_shs_apiurl']);
+						
+			$this->shop->createPage(__('Erfolgreiche Zahlung (Sparkassen Internetkasse)', 'wpsg'), 'wpsg_page_mod_shs_success', $_REQUEST['wpsg_page_mod_shs_success']);
+			$this->shop->createPage(__('Fehlgeschlagene Zahlung (Sparkassen Internetkasse)', 'wpsg'), 'wpsg_page_mod_shs_error', $_REQUEST['wpsg_page_mod_shs_error']);
 							
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_shs_success'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_shs_error'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function addPayment(&$arPayment) {
-						
+		
+		public function addPayment(&$arPayment)
+		{
+						
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_shs_mwst'), $this->shop->getDefaultCountry());
+			
 			$nSHS = 0;
 			if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $nSHS ++;
@@ -166,48 +161,155 @@
 			if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $nSHS ++;
 			
-			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') {
+			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1')
+			{
 			
 				$arPayment[$this->id.'_1'] = array(
 					'id' => $this->id.'_1',
 					'name' => __($this->shop->get_option('wpsg_mod_shs_bezeichnung_creditcard'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_shs_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_shs_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_shs_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_shs_hint_creditcard')),
-					'logo' => $this->shop->getRessourceURL('mods/mod_shs/gfx/logo_100x25.png')
+					'logo' => (($nSHS == 1)?$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo.png'):$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo_creditcard.png'))
 				);
 			
 			}
 			
-			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') {
+			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1')
+			{
 					
 				$arPayment[$this->id.'_2'] = array(
 					'id' => $this->id.'_2',
 					'name' => __($this->shop->get_option('wpsg_mod_shs_bezeichnung_maestro'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_shs_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_shs_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_shs_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_shs_hint_maestro')),
-					'logo' => $this->shop->getRessourceURL('mods/mod_shs/gfx/logo_100x25.png')
+					'logo' => (($nSHS == 1)?$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo.png'):$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo_maestro.png'))
 				);
 					
 			}
 
-			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') {
+			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1')
+			{
 					
 				$arPayment[$this->id.'_3'] = array(
 					'id' => $this->id.'_3',
 					'name' => __($this->shop->get_option('wpsg_mod_shs_bezeichnung_directdebit'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_shs_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_shs_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_shs_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_shs_hint_directdebit')),
-					'logo' => $this->shop->getRessourceURL('mods/mod_shs/gfx/logo_100x25.png')
+					'logo' => (($nSHS == 1)?$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo.png'):$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo_directdebit.png')),
+					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_shs/gfx/logo_100x25.png')
 				);
 					
 			}
-			 			
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+			
+				$arBasket = $this->shop->basket->toArray();
+			
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+			
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_shs_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+			
+				}
+				else
+				{
+			
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_shs_gebuehr'), $arBasket['sum']['preis']);
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);
+			
+				}
+			
+				// Entsprechenden Preis anzeigen
+				if (method_exists($this->shop, 'getFrontendTaxview'))
+				{
+				
+					if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+					{
+							
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_netto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_netto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_netto;
+							
+					}
+					else
+					{
+							
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_brutto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_brutto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_brutto;
+							
+					}
+					
+				}
+				else
+				{
+					 
+					if ($this->shop->get_option('wpsg_preisangaben_frontend') == WPSG_NETTO)
+					{
+							
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_netto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_netto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_netto;
+							
+					}
+					else
+					{
+							
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_brutto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_brutto;
+						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_brutto;
+							
+					}
+					
+				}
+			
+			}
+			
 		} // public function addPayment(&$arPayment)
-		 
+		
+		public function calcPayment(&$arBasket)
+		{
+				
+			if (preg_match('/^'.$this->id.'_\d$/', $arBasket['checkout']['payment']))
+			{
+		
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_shs_gebuehr'), $arBasket['sum']['preis']);
+		
+				if ($this->shop->get_option('wpsg_mod_shs_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+						
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+						
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+						
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_shs_mwst'));
+		
+				}
+		
+			}
+				
+		} // public function calcPayment(&$arBasket)
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -227,12 +329,10 @@
 		} // public function order_done(&$order_id)
 		
-		public function template_redirect() 
+		public function wp_loaded() 
 		{
 				
 			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_shs' && $_REQUEST['confirm'] == 'pp')
 			{
-
-				$_REQUEST['orderid'] = wpsg_sinput("key", $_REQUEST['orderid']);
-
+				
 				if (preg_match('/\d+-\d+/', $_REQUEST['orderid']))
 				{
@@ -246,5 +346,5 @@
 				
 				if ($_REQUEST['orderid'] <= 0) die(__('URL Erreichbar, aber orderid zum bilden des Hashs nicht ÃŒbergeben! URL sollte erst nach Zahlung mit den Daten angefragt werden. RÃŒckgabe ist dann die Zielurl. Ohne orderid ist auch keine interne Zuordnung der Bestellung mÃ¶glich, deswegen hier Abbruch.', 'wpsg'));
-
+				
 				$arParam = array(
 					'account' => wpsg_getStr($_REQUEST['account']),
@@ -259,8 +359,8 @@
 					'directPosErrorCode' => wpsg_getStr($_REQUEST['directPosErrorCode']),
 					'directPosErrorMessage' => wpsg_getStr($_REQUEST['directPosErrorMessage']),
-					'expdat' => wpsg_getStr($_REQUEST['expdat']),
-					'iban' => wpsg_getStr($_REQUEST['iban']),
-					'ipcheckresult' => wpsg_getStr($_REQUEST['ipcheckresult']),
-					'orderid' => $order_id_request,
+					'expdat' => wpsg_getStr($_REQUEST['expdat']),					
+					'iban' => wpsg_getStr($_REQUEST['iban']),					
+					'ipcheckresult' => wpsg_getStr($_REQUEST['ipcheckresult']),					
+					'orderid' => wpsg_getStr($order_id_request),					
 					'ppan' => wpsg_getStr($_REQUEST['ppan']),
 					'rc' => wpsg_getStr($_REQUEST['rc']),
@@ -269,5 +369,5 @@
 					'retrefnum' => wpsg_getStr($_REQUEST['retrefnum']),
 					'sessionid' => wpsg_getStr($_REQUEST['sessionid']),
-					'trefnum' => wpsg_getStr($_REQUEST['trefnum']),
+					'trefnum' => wpsg_getStr($_REQUEST['trefnum']),					
 					'txn_card' => wpsg_getStr($_REQUEST['txn_card']),
 					'version' => wpsg_getStr($_REQUEST['version'])
@@ -304,5 +404,5 @@
 						));
 						
-						if ($this->shop->setPayMent($_REQUEST['orderid'], wpsg_tf(wpsg_sinput("key", $_REQUEST['amount'], "isFloat"))))
+						if ($this->shop->setPayMent($_REQUEST['orderid'], wpsg_tf($_REQUEST['amount'])))
 						{
 								
@@ -343,5 +443,5 @@
 			}
 			
-		} // public function template_redirect() 
+		} // public function wp_loaded() 
 		
 		public function mail_payment()
Index: ds/wpsg_mod_si.class.php
===================================================================
--- /mods/wpsg_mod_si.class.php	(revision 8528)
+++ 	(revision )
@@ -1,262 +1,0 @@
-<?php
-
-	/**
-	 * 	Modul fÃŒr die Zahlungsart SofortIdent
- 	 */
-	class wpsg_mod_si extends wpsg_mod_basic
-	{
-		
-		var $lizenz = 2; 
-		var $id = 13; 
-		var $url = false; 
-		var $hilfeURL = 'http://wpshopgermany.de/?p=3770983';
-		var $version = "9.9.9";
-				
-		const HASH_MD5 = '0';
-		const HASH_SHA1 = '1';
-		const HASH_SHA256 = '2';
-		const HASH_SHA512 = '3';
-		
-		/**
-		 * Constructor
-		 */
-		public function __construct()
-		{
-			
-			parent::__construct(); 
-			
-			$this->name = __('SOFORT Ident','wpsg');
-			$this->group = __('Sonstiges','wpsg');
-			$this->desc = '';
-			
-		} // public function __construct()
-		
-		public function install() 
-		{
-						
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-			
-			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
-			  	wpsg_mod_si_check INT(1) NOT NULL,
-				wpsg_mod_si_minage INT(11) NOT NULL
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-				
-			dbDelta($sql);
-			
-			// Voreinstellungen
-			
-			$this->shop->checkDefault('wpsg_mod_si_hashalgo', self::HASH_SHA1);
-			$this->shop->checkDefault('wpsg_mod_si_minAge', 18);
-								 		
-		} //function install()
-		
-		public function settings_edit()
-		{
-		 
-			$this->shop->view['wpsg_mod_si']['returnURL'] = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_si', 'return', array('order_id' => '-USER_VARIABLE_0-'));
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_si/settings_edit.phtml');
-		
-		} // public function settings_edit()
-		
-		public function settings_save() 
-		{
-
-		    $this->shop->update_option('wpsg_mod_si_user_id', $_REQUEST['wpsg_mod_si_user_id'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_si_project_id', $_REQUEST['wpsg_mod_si_project_id'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-		    $this->shop->update_option('wpsg_mod_si_project_pwd', $_REQUEST['wpsg_mod_si_project_pwd'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_si_hashalgo', $_REQUEST['wpsg_mod_si_hashalgo'], false, false, WPSG_SANITIZE_VALUES, ['0', '1', '2', '3']);
-			
-			$this->shop->update_option('wpsg_mod_si_minAge', $_REQUEST['wpsg_mod_si_minAge'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_si_country', $_REQUEST['wpsg_mod_si_country'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-		} // public function settings_save() 
-		  
-		public function produkt_edit_allgemein(&$produkt_data)
-		{
-				
-			if (isset($_REQUEST['wpsg_lang'])) return;
-				
-			$this->shop->view['wpsg_mod_si']['check'] = wpsg_getStr($produkt_data['wpsg_mod_si_check']); 
-			$this->shop->view['wpsg_mod_si']['minAge'] = ((wpsg_isSizedInt($produkt_data['wpsg_mod_si_minage']))?$produkt_data['wpsg_mod_si_minage']:$this->shop->get_option('wpsg_mod_si_minAge'));
-				
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_si/produkt_edit_allgemein.phtml');
-				
-		} // public function produkt_edit_sidebar(&$produkt_data)
-		
-		public function produkt_save_before(&$produkt_data) {
-							
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_si']['check'], WPSG_SANITIZE_CHECKBOX)) $produkt_data['wpsg_mod_si_check'] = wpsg_sinput("key", wpsg_getStr($_REQUEST['wpsg_mod_si']['check']));
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_si']['check'], WPSG_SANITIZE_INT))$produkt_data['wpsg_mod_si_minage'] = wpsg_sinput("key", wpsg_getStr($_REQUEST['wpsg_mod_si']['minAge']));
-				
-		} // public function produkt_save_before(&$produkt_data)
-		 
-		public function canFinishOrder($temp_order_id)
-		{
-			
-			if ($this->isRestrictedOrder($temp_order_id) === true) return -2;
-			
-		} // public function canFinishOrder($temp_order_id)
-		
-		public function canNotOrder($temp_order_id) 
-		{ 
-			
-			if ($this->isRestrictedOrder($temp_order_id))
-			{
-				
-				$this->shop->view['wpsg_mod_si']['modul'] = $this;				
-				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_si/cannotorder.phtml');
-								
-			}
-			
-		} // public function canNotOrder($temp_order_id)
-		
-		/* Modulfunktionen */
-		
-		public function returnRedirect()
-		{
-			 
-			$arLocalHashData = array(
-				$this->shop->get_option('wpsg_mod_si_user_id'), $this->shop->get_option('wpsg_mod_si_project_id'), wpsg_getStr($_REQUEST['firstname']), wpsg_getStr($_REQUEST['lastname']), wpsg_getStr($_REQUEST['street']), wpsg_getStr($_REQUEST['city']), wpsg_getStr($_REQUEST['zipcode']), wpsg_getStr($_REQUEST['birthday']),
-				wpsg_getStr($_REQUEST['address_country_id']), wpsg_getStr($_REQUEST['bank_code']), wpsg_getStr($_REQUEST['account_country_id']), wpsg_getStr($_REQUEST['order_id']),
-				wpsg_getStr($_REQUEST['user_variable_1']), wpsg_getStr($_REQUEST['user_variable_2']), wpsg_getStr($_REQUEST['user_variable_3']), wpsg_getStr($_REQUEST['user_variable_4']),
-				wpsg_getStr($_REQUEST['user_variable_5']), wpsg_getStr($_REQUEST['agecheck_result'])
-			);
-			
-			$hash = $this->getSendHash($arLocalHashData);
-			
-			if ($hash === $_REQUEST['agecheck_hash'])
-			{
-				
-				$oOrder = wpsg_order::getInstance($_REQUEST['order_id']);
-				
-				if (wpsg_isSizedString($_REQUEST['agecheck_result'], 'valid') && wpsg_isSizedInt($_REQUEST['age']))
-				{
-										
-					$bValid = true;
-					
-					foreach ($oOrder->getOrderProducts() as $oOrderProduct)
-					{
-					
-						$oProduct = $oOrderProduct->getProduct();
-					
-						if (wpsg_isSizedInt($oProduct->wpsg_mod_si_check))
-						{
-								
-							if ($oProduct->wpsg_mod_si_minage > $_REQUEST['age'])
-							{
-								
-								$this->shop->addFrontendError(wpsg_translate(__('FÃŒr Produkte #1# benÃ¶tigen Sie ein Mindestalter von #2# Jahren', 'wpsg'), $oProduct->getProductName(), $oProduct->wpsg_mod_si_minage));
-								$bValid = false;
-								
-							}
-															
-						}
-					
-					}
-				
-					$oOrder->setMeta('wpsg_mod_si_age', $_REQUEST['age']);
-					
-				}
-				else
-				{
-					
-					die(__('Fehler beim HASH Abgleich. Bitte Projektpasswort und Hash Algorithmus auf beiden Seiten ÃŒberprÃŒfen.', 'wpsg'));
-					
-				}
-				
-				if ($bValid === true) $this->shop->addFrontendMessage(__('Ihr Alter wurde erfolgreich ÃŒberprÃŒft und Sie kÃ¶nnen die Bestellung nun abschlieÃen.', 'wpsg')); 
-				
-				$oOrder->log(__('RÃŒckgabe der SOFORT Ident Alterverifizierung', 'wpsg'), print_r($_REQUEST, 1));
-								
-			}
-			
-			$this->shop->redirect($this->shop->getURL(wpsg_ShopController::URL_OVERVIEW)); 
-			
-		} // public function returnRedirect()
-		
-		public function getSendHash($arParam)
-		{
-			
-			$arHash = array_values($arParam);
-			$arHash[] = $this->shop->get_option('wpsg_mod_si_project_pwd');
-			 
-			$algo = '';
-			
-			switch ($this->shop->get_option('wpsg_mod_si_hashalgo'))
-			{
-				
-				case self::HASH_MD5: $algo = 'md5'; break;
-				case self::HASH_SHA1: $algo = 'sha1'; break;
-				case self::HASH_SHA256: $algo = 'sha256'; break;
-				case self::HASH_SHA512: $algo = 'sha512'; break;
-				
-				default: die(__('UngÃŒltiger HASH Algoritmus', 'wpsg'));
-				
-			}
-
-			$data_implode = implode('|', $arHash);
-			$hash = hash($algo, $data_implode);
-			
-			return $hash;
-			
-		} // public function getSendHash()
-		
-		/**
-		 * Gibt true zurÃŒck, wenn fÃŒr die Bestellung ein Altersabgleich durchgefÃŒhrt werden muss
-		 * Wurde der Check bereits durchgefÃŒhrt wird auch false zurÃŒckgegeben
-		 * @param Integer $order_id Id der Bestellung
-		 * @return Boolean true|false Ob ein Check noch nÃ¶tig ist
-		 */
-		public function isRestrictedOrder($order_id)
-		{
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-			$min_age = 0;
-			 			
-			foreach ($oOrder->getOrderProducts() as $oOrderProduct)
-			{
-				
-				$oProduct = $oOrderProduct->getProduct();
-				
-				if (wpsg_isSizedInt($oProduct->wpsg_mod_si_check)) 
-				{
-			
-					$product_minAge = $oProduct->wpsg_mod_si_minage;
-					if (!wpsg_isSizedInt($product_minAge)) $product_minAge = $this->shop->get_option('wpsg_mod_si_minAge'); 					
-					
-					if ($min_age < $product_minAge) $min_age = $product_minAge;
-										
-				}
-								
-			} 
-			
-			if ($min_age === 0) return false;
-			
-			// Wenn Option "FÃŒr Ausland deaktivieren" aktiv sind
-			if ($this->shop->get_option("wpsg_mod_si_country") == "1")
-			{
-			
-				// Land mit Geo-IP ist ungleich des Standardland = return false;
-				if (wpsg_isSizedString($_SERVER['GEOIP_COUNTRY_CODE']))
-				{
-						
-					$default_country = $this->shop->getDefaultCountry();
-			
-					// Kennung wird in Kleinbuchstaben umgewandelt (strtolower)
-					if (strtolower($_SERVER['GEOIP_COUNTRY_CODE']) != strtolower($default_country->kuerzel))
-						return false;
-						
-				}
-			
-			}
-			
-			if (!wpsg_isSizedInt($oOrder->getMeta('wpsg_mod_si_age')) || $oOrder->getMeta('wpsg_mod_si_age') < $min_age) return true;
-			else return false;
-			
-		} // public function isRestrictedOrder($order_id)
-		
-	} // class wpsg_mod_si extends wpsg_mod_basic
-	
-?>
Index: /mods/wpsg_mod_skrill.class.php
===================================================================
--- /mods/wpsg_mod_skrill.class.php	(revision 8528)
+++ /mods/wpsg_mod_skrill.class.php	(revision 5261)
@@ -39,8 +39,8 @@
 
 			$this->shop->checkDefault('wpsg_mod_skrill_currency', 'EUR');
-			$this->shop->checkDefault('wpsg_mod_skrill_recipient_description', '');
-			$this->shop->checkDefault('wpsg_mod_skrill_code', '');
-			$this->shop->checkDefault('wpsg_mod_skrill_email', '');
-			$this->shop->checkDefault('wpsg_mod_skrill_id', '');
+			$this->shop->checkDefault('wpsg_mod_skrill_recipient_description', '<!-- Die Beschreibung erscheint wÃ€hrend der Zahlung --!>');
+			$this->shop->checkDefault('wpsg_mod_skrill_code', '<!-- Das Geheimwort erhalten sie von Skrill --!>');
+			$this->shop->checkDefault('wpsg_mod_skrill_email', '<!-- Ihre Skrill Konto E-Mail Adresse --!>');
+			$this->shop->checkDefault('wpsg_mod_skrill_id', '<!-- Die HÃ€ndler ID erhalten sie von Skrill --!>');
 			$this->shop->checkDefault('wpsg_mod_skrill_logo_url', '');
 			$this->shop->checkDefault('wpsg_mod_skrill_autostart', '0'); 
@@ -78,38 +78,34 @@
 		{
 			
-			$this->shop->update_option('wpsg_mod_skrill_bezeichnung', $_REQUEST['wpsg_mod_skrill_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_skrill_aktiv', $_REQUEST['wpsg_mod_skrill_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_skrill_hint', $_REQUEST['wpsg_mod_skrill_hint'], false, false, WPSG_SANITIZE_TEXTAREA);
-						
-			$this->shop->update_option('wpsg_mod_skrill_gebuehr',$_REQUEST['wpsg_mod_skrill_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_skrill_mwst', $_REQUEST['wpsg_mod_skrill_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_skrill_mwstland', $_REQUEST['wpsg_mod_skrill_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_skrill_currency', $_REQUEST['wpsg_mod_skrill_currency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_skrill_recipient_description', $_REQUEST['wpsg_mod_skrill_recipient_description'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_skrill_code', $_REQUEST['wpsg_mod_skrill_code'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_skrill_email', $_REQUEST['wpsg_mod_skrill_email'], false, false, WPSG_SANITIZE_EMAIL);
-			$this->shop->update_option('wpsg_mod_skrill_id', $_REQUEST['wpsg_mod_skrill_id'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_skrill_logo_url', $_REQUEST['wpsg_mod_skrill_logo_url'], false, false, WPSG_SANITIZE_URL);
-			$this->shop->update_option('wpsg_mod_skrill_autostart', $_REQUEST['wpsg_mod_skrill_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_skrill_bezeichnung', $_REQUEST['wpsg_mod_skrill_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_skrill_aktiv', $_REQUEST['wpsg_mod_skrill_aktiv']);
+			$this->shop->update_option('wpsg_mod_skrill_hint', $_REQUEST['wpsg_mod_skrill_hint']);
+						
+			$this->shop->update_option('wpsg_mod_skrill_gebuehr', wpsg_tf($_REQUEST['wpsg_mod_skrill_gebuehr'], true));
+			$this->shop->update_option('wpsg_mod_skrill_mwst', $_REQUEST['wpsg_mod_skrill_mwst']);
+			$this->shop->update_option('wpsg_mod_skrill_mwstland', $_REQUEST['wpsg_mod_skrill_mwstland']);
+			
+			$this->shop->update_option('wpsg_mod_skrill_currency', $_REQUEST['wpsg_mod_skrill_currency']);
+			$this->shop->update_option('wpsg_mod_skrill_recipient_description', $_REQUEST['wpsg_mod_skrill_recipient_description']);
+			$this->shop->update_option('wpsg_mod_skrill_code', $_REQUEST['wpsg_mod_skrill_code']);			
+			$this->shop->update_option('wpsg_mod_skrill_email', $_REQUEST['wpsg_mod_skrill_email']);
+			$this->shop->update_option('wpsg_mod_skrill_id', $_REQUEST['wpsg_mod_skrill_id']);
+			$this->shop->update_option('wpsg_mod_skrill_logo_url', $_REQUEST['wpsg_mod_skrill_logo_url']);
+			$this->shop->update_option('wpsg_mod_skrill_autostart', $_REQUEST['wpsg_mod_skrill_autostart']); 
 			
 			$this->shop->createPage(__('Erfolgreiche Skrill Zahlung', 'wpsg'), 'wpsg_page_mod_skrill_success', $_REQUEST['wpsg_page_mod_skrill_success']);
 			$this->shop->createPage(__('Fehlgeschlagene Skrill Zahlung', 'wpsg'), 'wpsg_page_mod_skrill_error', $_REQUEST['wpsg_page_mod_skrill_error']);
 			
-			$this->shop->addTranslationString('wpsg_mod_skrill_bezeichnung', $_REQUEST['wpsg_mod_skrill_bezeichnung'], WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_skrill_hint', $_REQUEST['wpsg_mod_skrill_hint'], WPSG_SANITIZE_TEXTFIELD);
+			$this->shop->addTranslationString('wpsg_mod_skrill_bezeichnung', $_REQUEST['wpsg_mod_skrill_bezeichnung']);
+			$this->shop->addTranslationString('wpsg_mod_skrill_hint', $_REQUEST['wpsg_mod_skrill_hint']);
 			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_skrill_success'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_skrill_error'));
-
-        } // public function wpsg_deinstall_sites()
-
-		public function addPayment(&$arPayment) { 
+		
+		public function addPayment(&$arPayment) 
+		{ 
 						
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_skrill_aktiv') != '1') return;
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_skrill_mwst'), $this->shop->getDefaultCountry());
 			
 			$arPayment[$this->id] = array(
@@ -117,13 +113,85 @@
 				'name' => __($this->shop->get_option('wpsg_mod_skrill_bezeichnung'), 'wpsg'),
 				'hint' => __($this->shop->get_option('wpsg_mod_skrill_hint'), 'wpsg'),
-				'price' => $this->shop->get_option('wpsg_mod_skrill_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_skrill_mwst'),
-				'mwst_null' => $this->shop->get_option('wpsg_mod_skrill_mwstland'), 
-				'logo' => $this->shop->getRessourceURL('mods/mod_skrill/gfx/logo_100x25.png')
+				'preis' => $this->shop->get_option('wpsg_mod_skrill_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_skrill_mwst'),
+				'mwst_value' => $mwst_value,
+				'mwst_null' => $this->shop->get_option('wpsg_mod_skrill_mwstland'),
+				'logo' => WPSG_URL_CONTENT.'plugins/wpshopgermany/views/gfx/skrill.png',
+				'logo_100x25' => $this->shop->getRessourceURL('mods/mod_skrill/gfx/logo_100x25.png')
 			);
-			 			
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_skrill_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_skrill_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
 		} // public function addPayment(&$arPayment)
-		 
-		public function template_redirect() { 
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_skrill_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_skrill_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_skrill_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket)
+		
+		public function wp_loaded() { 
 			
 			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_skrill' && $_REQUEST['confirm'] == 'skrill')			
@@ -157,8 +225,8 @@
 					$calc_hash = strtoupper(md5(
 						$this->shop->get_option('wpsg_mod_skrill_id').
-						wpsg_sinput("key", $_REQUEST['transaction_id']).
+						$_REQUEST['transaction_id'].
 						strtoupper(md5($this->shop->get_option('wpsg_mod_skrill_code'))).
-						wpsg_sinput("key", $_REQUEST['mb_amount']).
-						wpsg_sinput("text_field", $_REQUEST['mb_currency']).
+						$_REQUEST['mb_amount'].
+						$_REQUEST['mb_currency'].
 						$_REQUEST['status']));
 											
@@ -197,5 +265,5 @@
 			}
 			
-		} // public function template_redirect()
+		} // public function wp_loaded()
 		
 		public function order_done(&$order_id, &$done_view) 
Index: /mods/wpsg_mod_spconditions.class.php
===================================================================
--- /mods/wpsg_mod_spconditions.class.php	(revision 8528)
+++ /mods/wpsg_mod_spconditions.class.php	(revision 5261)
@@ -7,5 +7,4 @@
 		var $id = 3000;				
 		var $inline = true;
-		var $version = "9.9.9";
 		
 		//var $hilfeURL = '';
@@ -20,5 +19,5 @@
 			$this->desc = __('ErmÃ¶glicht die Erstellung von Bedingungen fÃŒr Versand- und Zahlungsarten.', 'wpsg');
 			
-			if (!defined('WPSG_TBL_SPCONDITIONS')) define('WPSG_TBL_SPCONDITIONS', $this->shop->prefix.'wpsg_spconditions');
+			if (defined('WPSG_TBL_SPCONDITIONS')) define('WPSG_TBL_SPCONDITIONS', $this->shop->prefix.'wpsg_spconditions');
 			
 		} // public function __construct()
Index: /mods/wpsg_mod_statistics.class.php
===================================================================
--- /mods/wpsg_mod_statistics.class.php	(revision 8528)
+++ /mods/wpsg_mod_statistics.class.php	(revision 5261)
@@ -4,8 +4,7 @@
 	 * Modul fÃŒr Erzeugung von Statistiken in der Admin-Widget-Area
 	 */
-	class wpsg_mod_statistics extends wpsg_mod_basic {
-
-        public $topProductCount = null;
-
+	class wpsg_mod_statistics extends wpsg_mod_basic 
+	{
+		
 		var $lizenz = 1;
 		var $id = 440;
@@ -35,9 +34,9 @@
 			
 			parent::__construct();
-			
+									
 			$this->name = __('Statistik', 'wpsg');
 			$this->group = __('Sonstiges', 'wpsg');
 			$this->desc = __('Darstellung und Auswertung von Statistiken, Piwik Integration, Eckdaten als Dashboard-Widget', 'wpsg');
-			
+						
 		}
 
@@ -64,9 +63,8 @@
 			$this->shop->checkDefault('wpsg_mod_statistics_bar_chart_width', '600');
 			$this->shop->checkDefault('wpsg_mod_statistics_bar_chart_height', '500');
-			$this->shop->checkDefault('wpsg_mod_statistics_piwik_trackingcode', '1'); 
+			$this->shop->checkDefault('wpsg_mod_statistics_piwik_SiteId', '1'); 
 			
 			$this->shop->checkDefault('wpsg_mod_statistics_status', implode(',', array(100, 110)));
-			$this->shop->checkDefault('wpsg_mod_statistics_productinterval', '30');
-				
+	
 			/**
 			 * Produkttabelle fÃŒr Kundenkarte erweitern
@@ -98,44 +96,14 @@
 		{
 		
-			if (is_admin() && (isset($_REQUEST['page']) && $_REQUEST['page'] == 'wpsg-Statistics'))
-			{
-			    
-			    if ($this->shop->get_option('wpsg_mod_statistics_noJS') !== '1') {
-			    
-                    $arr = [];
-                    $gkey = $this->shop->get_option('wpsg_mod_statistics_googlekey');
-                    $gurl = 'https://maps.googleapis.com/maps/api/js?key='.$gkey;
-                    wp_register_script('wpsg-mod_statistics-gmap', $gurl, $arr, null);
-                    //wp_register_script('wpsg-mod_statistics-gmap', 'https://maps.googleapis.com/maps/api/js?sensor=false');
-                    wp_enqueue_script('wpsg-mod_statistics-gmap');
-    
-                    $gurl = $this->shop->getRessourceURL('mods/mod_statistics/js/markerclusterer.js');
-                    wp_register_script('wpsg-mod_statistics-gmapmc', $gurl, $arr, null);
-                    wp_enqueue_script('wpsg-mod_statistics-gmapmc');
-                    
-                    wp_enqueue_style('wpsg_mod_statistics_css_jqplot', WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/lib/jqplot/jquery.jqplot.css');
-                    
-                }
-
-			}
-			 
+			if (is_admin())
+			{
+			
+				wp_register_script('wpsg-mod_statistics-gmap', 'https://maps.googleapis.com/maps/api/js?sensor=false');
+				wp_enqueue_script('wpsg-mod_statistics-gmap');
+				
+			}
+			
 		} // public wpsg_enqueue_scripts()
-
-        /** Wird bei der Darstellung der Bibliotheken / Includes aufgerufen */
-        public function admin_includes() {
-
-            echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_noJS', __('GoogleMaps Javascript nicht einbinden (Statistikmodul)', 'wpsg'), $this->shop->get_option('wpsg_mod_statistics_noJS'), array(
-                'hint' => __('Ist diese Option aktiv, so werden die GoogleMaps Javascript Bibliotheken <u>nicht</u> eingebunden.', 'wpsg')
-            ));
-            
-        }
- 
-        /** Wird beim speichern der Bibliothekes / Includes Seite aufgerufen */
-        public function admin_includes_save() {
-
-            $this->shop->update_option('wpsg_mod_statistics_noJS', $_REQUEST['wpsg_mod_statistics_noJS'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-        }
-        
+		 		
 		/**
 		 * Rechte setzen
@@ -148,220 +116,4 @@
 			
 		}
-
-		public function basket_preInsert() 
-		{  
-
-			if ($this->shop->get_option('wpsg_mod_statistics_piwik_basketdata') == '1') 
-			{
-
-				echo '<script type="text/javascript"> if (typeof _paq === "undefined") window._paq = []; </script>';
-	
-				$product_id = $_REQUEST['wpsg']['produkt_id'];
-				$oProduct = wpsg_product::getInstance($product_id);
-
-				if ($this->shop->hasMod('wpsg_mod_produktartikel')) 
-				{
-
-					$categoryID = $oProduct->getPostID();
-					$terms = get_the_terms($categoryID, get_taxonomies());
-
-					if ($terms) 
-					{
-
-						$termNames = array(); 
-
-						foreach ($terms as $term) $termNames[] = $term->name;
-
-    					$termNames = array_slice($termNames, 0, 5); // Matomo API Limitierung - max. 5 Kategorien
-
-						$arCategoryName = json_encode($termNames);
-
-					}
-
-					if(!empty($arCategoryName)) 
-					{
-				
-						echo '
-							<script type="text/javascript">
-
-								_paq.push(["addEcommerceItem",
-									"'.wpsg_hspc($oProduct->getNr()).'", 
-									"'.wpsg_hspc($oProduct->getProductName()).'",
-									'.$arCategoryName.',
-									'.wpsg_tf($oProduct->getPrice()).', 
-									'.$_POST['wpsg']['menge'].'
-								]);
-
-							</script>
-						';
-
-					}
-					else 
-					{
-
-						echo '
-							<script type="text/javascript">
-								_paq.push(["addEcommerceItem",
-									"'.wpsg_hspc($oProduct->getNr()).'", 
-									"'.wpsg_hspc($oProduct->getProductName()).'",
-									false, 
-									'.wpsg_tf($oProduct->getPrice()).',
-									'.$_POST['wpsg']['menge'].'
-								]);
-							</script>
-						';
-
-					}
-				
-				}
-				else 
-				{
-
-					echo '
-						<script type="text/javascript">
-							_paq.push(["addEcommerceItem",
-								"'.wpsg_hspc($oProduct->getNr()).'",
-								"'.wpsg_hspc($oProduct->getProductName()).'", 
-								false, 
-								'.wpsg_tf($oProduct->getPrice()).', 
-								'.$_POST['wpsg']['menge'].'
-							]);
-						</script>
-					';
-
-				}
-				
-			}
-
-		} // public function basket_preInsert() 
-
-		public function basket_removeProduktFromSession($produkt_index)
-		{
-
-			if ($this->shop->get_option('wpsg_mod_statistics_piwik_basketdata') == '1') 
-			{
-
-				echo '<script type="text/javascript"> if (typeof _paq === "undefined") window._paq = []; </script>';
-
-				$product_id = $_SESSION['wpsg']['basket'][$produkt_index]['id'];
-				echo '<script type="text/javascript"> _paq.push(["removeEcommerceItem", '.$product_id.']); </script>';
-
-			}
-
-		} // public function basket_removeProduktFromSession()
-
-		public function product_bottom(&$product_id, $template_index) 
-		{  
-
-			if ($this->shop->get_option('wpsg_mod_statistics_piwik_productView') == '1') 
-			{
-
-				$oProduct = wpsg_product::getInstance($product_id);
-
-				if ($this->shop->hasMod('wpsg_mod_produktartikel')) 
-				{
-
-					$categoryID = $oProduct->getPostID();
-					$terms = get_the_terms($categoryID, get_taxonomies());
-
-					if ($terms) 
-					{
-
-						$termNames = array(); 
-
-						foreach ($terms as $term) $termNames[] = $term->name;
-
-    					$termNames = array_slice($termNames, 0, 5); // Matomo API Limitierung - max. 5 Kategorien
-
-						$arCategoryName = json_encode($termNames);
-
-					}
-
-					if(!empty($arCategoryName)) 
-					{
-
-						echo '
-							<script type="text/javascript">
-								_paq.push(["setEcommerceView",
-									"'.wpsg_hspc($oProduct->getNr()).'",
-									"'.wpsg_hspc($oProduct->getProductName()).'",
-									'.$arCategoryName.',
-									'.wpsg_tf($oProduct->getPrice()).'
-								]);
-							</script>
-						';	
-
-					} 
-					else 
-					{
-
-						echo '
-							<script type="text/javascript">
-								_paq.push(["setEcommerceView",
-									"'.wpsg_hspc($oProduct->getNr()).'",
-									"'.wpsg_hspc($oProduct->getProductName()).'",
-									false,
-									'.wpsg_tf($oProduct->getPrice()).'
-								]);
-							</script>
-						';
-
-					}
-
-				} 
-				else
-				{
-
-					echo '
-						<script type="text/javascript">
-							_paq.push(["setEcommerceView",
-								"'.wpsg_hspc($oProduct->getNr()).'",
-								"'.wpsg_hspc($oProduct->getProductName()).'",
-								false,
-								'.wpsg_tf($oProduct->getPrice()).'
-							]);
-						</script>
-					';
-
-				}
-
-			}
-
-		} // public function product_bottom(&$product_id) 
-
-		public function productCat_bottom() 
-		{  
-
-			if ($this->shop->hasMod('wpsg_mod_produktartikel')) 
-			{
-
-				$product_cat_taxonomy = $this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat');
-
-				if (is_tax($product_cat_taxonomy)) 
-				{
-
-					if ($this->shop->get_option('wpsg_mod_statistics_piwik_categoryView') == '1') 
-					{
-
-						$category = get_queried_object();
-						$catName = $category->name; 
-
-						echo '
-							<script type="text/javascript">
-								_paq.push(["setEcommerceView",
-									false,
-									false,
-									["'.$catName.'"]
-								]);
-							</script>
-						';
-
-					}
-
-				}
-
-			}
-
-		} // public function productCat_bottom() 
 		
 		public function checkout_inner_prebutton(&$checkout_view) 
@@ -378,11 +130,11 @@
 		
 		public function checkout2_inner_prebutton(&$checkout_view) 
-		{
+		{ 
 			
 			if ($this->shop->get_option('wpsg_mod_statistics_piwik_checkout2') == '1')
 			{
-				
+					
 				$this->trackTarget($this->shop->get_option('wpsg_mod_statistics_piwik_checkout2_target'));
-				
+					
 			}
 			
@@ -390,5 +142,5 @@
 		
 		public function overview_inner_prebutton(&$basket_view) 
-		{
+		{ 
 			
 			if ($this->shop->get_option('wpsg_mod_statistics_piwik_overview') == '1')
@@ -406,190 +158,30 @@
 			if ($this->shop->get_option('wpsg_mod_statistics_piwik_done') == '1')
 			{
-				
+					
 				$this->trackTarget($this->shop->get_option('wpsg_mod_statistics_piwik_done_target'));
-				
-			}
-			
-			if ($this->shop->get_option('wpsg_mod_statistics_piwik_ecommerce') == '1') 
-			{
-
-				// https://matomo.org/faq/reports/advanced-manually-tracking-ecommerce-actions-in-matomo/
-
+					
+			}
+			
+			if ($this->shop->get_option('wpsg_mod_statistics_piwik_ecommerce') == '1')
+			{
+				
 				echo '<script type="text/javascript">';
-
-					if ($this->shop->get_option('wpsg_mod_statistics_piwik_basketdata') == '0') 
-					{
-
-						foreach ($done_view['basket']['produkte'] as $k => $p) 
-						{
-
-							$oProduct = wpsg_product::getInstance($p['id']);
-
-							if ($this->shop->hasMod('wpsg_mod_produktartikel')) 
-							{
-
-								$categoryID = $oProduct->getPostID();
-								$terms = get_the_terms($categoryID, get_taxonomies());
-
-								if ($terms) 
-								{
-
-									$termNames = array(); 
-
-									foreach ($terms as $term) $termNames[] = $term->name;
-
-									$termNames = array_slice($termNames, 0, 5); // Matomo API Limitierung - max. 5 Kategorien
-
-									$arCategoryName = json_encode($termNames);
-
-								}
-
-								if(!empty($arCategoryName)) 
-								{
-
-									echo '_paq.push(["addEcommerceItem", 
-										"'.wpsg_hspc($p['id']).'", 
-										"'.wpsg_hspc($p['name']).'", 
-										'.$arCategoryName.', 
-										'.wpsg_tf($p['preis']).', 
-										'.$p['menge'].'
-									]);';
-
-								} 
-								else 
-								{
-									
-									echo '_paq.push(["addEcommerceItem", 
-										"'.wpsg_hspc($p['id']).'", 
-										"'.wpsg_hspc($p['name']).'", 
-										false, 
-										'.wpsg_tf($p['preis']).', 
-										'.$p['menge'].'
-									]);';
-
-								}
-
-							} 
-							else
-							{
-
-								echo '_paq.push(["addEcommerceItem", 
-									"'.wpsg_hspc($p['id']).'", 
-									"'.wpsg_hspc($p['name']).'", 
-									false, 
-									'.wpsg_tf($p['preis']).', 
-									'.$p['menge'].'
-								]);';
-
-							}
-
-						}
-
-					}
-
-					if ($this->shop->hasMod('wpsg_mod_discount'))
-					{
-
-						echo '_paq.push(["trackEcommerceOrder", 
-							"BestellNr.: '.$done_view['o_id'].'", 
-							'.wpsg_tf($done_view['basket']['sum']['preis_gesamt_brutto']).', 
-							'.wpsg_tf($done_view['basket']['sum']['preis_brutto']).',
-							'.wpsg_tf($done_view['basket']['sum']['mwst']).',
-							'.wpsg_tf($done_view['basket']['sum']['preis_shipping_brutto']).',
-							'.wpsg_tf($done_view['basket']['sum']['preis_rabatt_brutto']).'
-						]);';
-
-					} 
-					else
-					{
-
-						echo '_paq.push(["trackEcommerceOrder", 
-							"BestellNr.: '.$done_view['o_id'].'", 
-							'.wpsg_tf($done_view['basket']['sum']['preis_gesamt_brutto']).', 
-							'.wpsg_tf($done_view['basket']['sum']['preis_brutto']).',
-							'.wpsg_tf($done_view['basket']['sum']['mwst']).',
-							'.wpsg_tf($done_view['basket']['sum']['preis_shipping_brutto']).',
-							false
-						]);';
-
-					}
-
+				
+				foreach ($done_view['basket']['produkte'] as $k => $p) 
+				{
+				
+ 					echo 'piwikTracker.addEcommerceItem("'.wpsg_hspc($p['id']).'", "'.wpsg_hspc($p['name']).'", "", '.wpsg_tf($p['preis']).', '.$p['menge'].');';
+					
+				}
+
+				echo 'piwikTracker.trackEcommerceOrder("BestellNr.: '.$done_view['o_id'].'" , '.wpsg_tf($done_view['basket']['sum']['preis_gesamt_brutto']).');';
 				echo '</script>';
-
-			}
-
-			if ($this->shop->get_option('wpsg_mod_statistics_google_ecommerce') == '1')
-			{
-
-				if (!empty($done_view['basket']['coupon']['0']['code'])) $coupon_code = $done_view['basket']['coupon']['0']['code'];
-				else $coupon_code = false;
-
-				$products = '';
-				foreach($done_view['basket']['produkte'] as $p) {
-
-					$oProduct = wpsg_product::getInstance($p['id']);
-					$productCat = '';
-
-					if ($this->shop->hasMod('wpsg_mod_produktartikel')) 
-					{
-
-						$categoryID = $oProduct->getPostID();
-						$terms = get_the_terms($categoryID, get_taxonomies());
-
-						if ($terms) 
-						{
-
-							$termNames = array(); 
-							foreach ($terms as $term) $termNames[] = $term->name;
-
-							for ($i = 0; $i < 5; $i++) 
-							{
-								
-								if (isset($termNames[$i])) $productCat .= 'item_category'.($i+1).': "'.$termNames[$i].'", ';
-								else $productCat .= 'item_category'.($i+1).': "false", ';
-								
-							}
-
-						}
-
-					} else $productCat = 'item_category: "false",';
-
-					if ($this->shop->hasMod('wpsg_mod_productvariants')) $arVariInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', [$p['product_key']]);
-					else $arVariInfo = '"false"';
-
-					$products .= '{
-						item_id: "'. $p['id'] .'",
-						item_name: "'. $p['name'] .'",
-						affiliation: "false",
-						coupon: "false", 
-						discount: false, 
-						index: '. $p['product_index'] .',
-						item_brand: "false",
-						'. $productCat .' // maximal 5 Porduktkategorien - API limitierung
-						item_list_id: "false",
-						item_list_name: "false",
-						item_variant: "'. $arVariInfo['key'] .'", 
-						location_id: "false",
-						price: '. $p['preis_brutto'] .',
-						quantity: '. $p['menge'] .'
-					},';
-
-				}
-				$products = rtrim($products, ',');
-
-				echo '<script type="text/javascript">';
-
-					echo 'gtag("event", "purchase", {
-						transaction_id: "'. $done_view['o_id'] .'",
-						value: '. wpsg_tf($done_view['basket']['sum']['preis_gesamt_brutto']) .',
-						tax: '. wpsg_tf($done_view['basket']['sum']['mwst']) .',
-						shipping: '. wpsg_tf($done_view['basket']['sum']['preis_shipping_brutto']) .',
-						currency: "'. $this->shop->get_option('wpsg_currency') .'",
-						coupon: "'. $coupon_code .'", // maximal 1 CouponCode API limitierung
-						items: ['. $products .']
-					});';
-
-				echo '</script>';
-
+				
+			}
+			
+			if ((int)$this->shop->get_option('wpsg_mod_statistics_google_active') == 1)
+			{
+				$this->simulateUrl = $this->shop->getURL(wpsg_ShopController::URL_BASKET).'?wpsg_done';
+				add_action('wp_footer', array($this, 'get_googleanalytics_html'), 100);
 			}
 			
@@ -603,11 +195,9 @@
 		private function trackTarget($target_id)
 		{
-
-			// https://matomo.org/faq/reports/implement-event-tracking-with-matomo/
-			
-			if ($target_id > 0) echo '<script type="text/javascript"> _paq.push(["trackGoal", '.$target_id.']); </script>';
+			
+			if ($target_id > 0) echo '<script type="text/javascript"> piwikTracker.trackGoal('.$target_id.'); </script>';
 			
 		} // private function trackTarget($target_id)
-
+		
 		public function basket_after(&$basket_view) 
 		{  
@@ -621,106 +211,53 @@
 			
 		} // public function basket_after(&$basket_view)
-
 		
 		public function wp_head()
 		{
 			
-			if ($this->usePiwik() || $this->useGA4())
-			{
-
-				if ($this->usePiwik()) 
-				{
-
-					// https://developer.matomo.org/guides/tracking-javascript-guide
-					echo '<script type="text/javascript"> window._paq = []; </script>';
-
-					if ($this->shop->get_option('wpsg_mod_statistics_piwik_trackingcode') == '1')
-					{
-					
-						$url = $this->shop->get_option('wpsg_mod_statistics_piwik_url');
+			if (!$this->usePiwik()) return false;
+						 
+			$url = $this->shop->get_option('wpsg_mod_statistics_piwik_url');
+			
+			echo '
+				<script type="text/javascript">
+					var pkBaseURL = (("https:" == document.location.protocol) ? "https://'.$url.'/" : "http://'.$url.'/");
+					document.write(unescape("%3Cscript src=\'" + pkBaseURL + "piwik.js\' type=\'text/javascript\'%3E%3C/script%3E"));
+				</script>
+			';
+			
+			if ($this->shop->get_option('wpsg_mod_statistics_piwik_generel') == '1')
+			{
+			
+				echo '
+					<!-- Piwik Tracking Code -->				
+					<script type="text/javascript">
+						try {
 						
-						echo '
-							<!-- Matomo Library -->	
-							<script type="text/javascript">
-
-								var protocol = document.location.protocol;
-								var pkBaseURL = protocol + "//'.$url.'/";
-
-								var scriptElement = document.createElement("script");
-								scriptElement.type = "text/javascript";
-								scriptElement.src = unescape(pkBaseURL + "matomo.js");
-
-								var firstScriptElement = document.getElementsByTagName("script")[0];
-								var parentElement = firstScriptElement.parentNode;
-								parentElement.appendChild(scriptElement);
-
-							</script>
-							<!-- End Matomo Library -->	
-						';
-
-						echo '
-							<!-- Piwik Matomo Code -->				
-							<script type="text/javascript">
-								try {
-								
-									_paq.push(["setTrackerUrl", pkBaseURL + "matomo.php"]);
-									_paq.push(["setSiteId", '.$this->shop->get_option('wpsg_mod_statistics_piwik_SiteId').']);
-
-								} catch(err) { }
-							</script>
-							<!-- End Matomo Tracking Code -->
-						';
-
-					}
-				
-					if ($this->shop->get_option('wpsg_mod_statistics_piwik_generel') == '1')
-					{
-
-						echo '
-							<!-- Matomo Protokollierung -->				
-							<script type="text/javascript">
-								try {
-
-									_paq.push(["trackPageView"]);
-									_paq.push(["enableLinkTracking"]);
-
-								} catch(err) { }
-							</script>
-							<!-- End Matomo Protokollierung -->
-						';
+							var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", '.$this->shop->get_option('wpsg_mod_statistics_piwik_SiteId').');
+							piwikTracker.trackPageView();
+							piwikTracker.enableLinkTracking();
+	
+						} catch(err) { }
+					</script>
+					<!-- End Piwik Tracking Code -->
+				';
+				
+			}
+			else
+			{
+				
+				echo '
+					<!-- Piwik Tracking Code -->				
+					<script type="text/javascript">
+						try {
 						
-					}
-
-				} 
-
-				if ($this->useGA4())
-				{
-
-					// https://developers.google.com/analytics/devguides/collection/ga4/set-up-ecommerce
-					if ($this->shop->get_option('wpsg_mod_statistics_google_active') == '1')
-					{
-
-						$tag_id = $this->shop->get_option('wpsg_mod_statistics_google_tracking_code');
-						
-						$debug_mode_option = $this->shop->get_option('wpsg_mod_statistics_google_tracking_debug_mode');	
-						$debug_mode = ($debug_mode_option == '1') ? 'true' : 'false';
-
-						echo '
-							<script async src="https://www.googletagmanager.com/gtag/js?id='.$tag_id.'"></script>
-							<script>
-								window.dataLayer = window.dataLayer || [];
-								function gtag(){ dataLayer.push(arguments); }
-								gtag("js", new Date());
-						
-								gtag("config", "'.$tag_id.'", { "debug_mode": '.$debug_mode.' });
-							</script>
-						';
-
-					}
-
-				} 
-
-			} else return false;
-
+							var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", '.$this->shop->get_option('wpsg_mod_statistics_piwik_SiteId').');
+	
+						} catch(err) { }
+					</script>
+					<!-- End Piwik Tracking Code -->
+				';
+				
+			}
 			
 		} // public function wp_head()
@@ -751,21 +288,22 @@
 		} 
 		
-		function be_ajax() {
-			
-			if ($_REQUEST['do'] == 'related') {
-		 
+		function be_ajax()
+		{
+			
+			if ($_REQUEST['do'] == 'related')
+			{
+				
 				$arRelated = array();
 				
-				foreach ($this->shop->view['standardFilter'] as $index => $filter) {
-					
-					if ($index == $_REQUEST['selection']) {
-						 
-						if (is_array($filter['related'])) {
-							 
+				foreach ($this->shop->view['standardFilter'] as $index => $filter)
+				{
+					if ($index == $_REQUEST['selection'])
+					{
+						if (is_array($filter['related']))
+						{
 							foreach ($filter['related'] as $related)
 							{
 								$arRelated[] = array('name' => $this->shop->view['standardFilter'][$related]['name'], 'value' => $related);
 							}
-							
 						}	
 					}
@@ -860,9 +398,11 @@
 			
 			add_action('wp_dashboard_setup', array($this, 'wpsg_statistics_add_dashboard_widgets')); // Hint: For Multisite Network Admin Dashboard use wp_network_dashboard_setup instead of wp_dashboard_setup.	
-
-			add_action('wp_footer', array($this, 'productCat_bottom'));
-
-		}
-		
+			
+			if ((int)$this->shop->get_option('wpsg_mod_statistics_google_active') == 1 && !isset($_GET['wpsg_done']))
+			{
+				add_action('wp_footer', array($this, 'get_googleanalytics_html'), 100);
+			}
+		}
+			 
 		/**
 		 * Sammeln von Chartdaten und RÃŒckgabe
@@ -951,5 +491,5 @@
 			);
 
-			
+				
 			//Statistikarray nach order sortieren 
 			$this->shop->view['charts'] = wpsg_array_csort($this->shop->view['charts'], 'order');
@@ -957,20 +497,11 @@
 			//Default-Statistiken laden wenn keine REQUEST-Parameter fÃŒr id bzw. Type ÃŒbergeben wurden
 			if (!isset($_REQUEST['id'])) 
-			{
+			{ 
 				$_REQUEST['id'] = '0'; 
-				$temp = $this->shop->view['charts'][$_REQUEST['id']]['type'];
-				//$temp = array_shift(array_keys($temp));
-				$temp = array_keys($temp);
-				$temp = array_shift($temp);
-				$_REQUEST['type'] = $temp;
-				//$_REQUEST['type'] = array_shift(array_keys($this->shop->view['charts'][$_REQUEST['id']]['type']));  
+				$_REQUEST['type'] = array_shift(array_keys($this->shop->view['charts'][$_REQUEST['id']]['type']));  
 			}
 			else if (isset($_REQUEST['id']) && !isset($_REQUEST['type']))
 			{
-				$temp = $this->shop->view['charts'][$_REQUEST['id']]['type'];
-				//$temp = array_shift(array_keys($temp));
-				$temp = array_keys($temp);
-				$temp = array_shift($temp);
-				$_REQUEST['type'] = $temp;  	
+				$_REQUEST['type'] = array_shift(array_keys($this->shop->view['charts'][$_REQUEST['id']]['type']));  	
 			}
 			
@@ -978,12 +509,11 @@
 			 * Skripte fÃŒr jQPlot in AbhÃ€ngigkeit von Statistiktyp einbinden
 			 */
-
-			if (($_REQUEST['page'] == 'wpsg-Statistics') && (wpsg_getStr($_REQUEST['id']) != "4")) {
-				
-				if (is_array($this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']]['js']) && count(wpsg_getArray($this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']])) > 0)
+			if ($_REQUEST['page'] == 'wpsg-Statistics')
+			{
+				if (is_array($this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']]['js']) && count($this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']]) > 0)
 				{
 					foreach ($this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']]['js'] as $index => $value)
 					{
-						wp_enqueue_script($index, WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/'.$value);		
+						wp_enqueue_script($index, WPSG_URL_CONTENT.'plugins/wpshopgermany/'.$value);		
 					}	
 				}
@@ -993,16 +523,14 @@
 					foreach ($this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']]['css'] as $index => $value)
 					{
-						wp_enqueue_style($index, WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/'.$value);		
+						wp_enqueue_style($index, WPSG_URL_CONTENT.'plugins/wpshopgermany/'.$value);		
 					}	
 				}
 				
 				$this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']];
-				
-			}
-			
-			$this->shop->view['filter'] = [];
-			 			
+			}
+			
+			$this->shop->view['filter'] = array();
 			if (wpsg_isSizedArray($_REQUEST['filter'])) $this->shop->view['filter'] = $_REQUEST['filter'];
-			
+						
 			if (!isset($this->shop->view['filter']['standard'])) { $this->shop->view['filter']['standard'] = '0'; }
 			
@@ -1019,60 +547,6 @@
 			if (method_exists($objchartClass, $chartFunction))
 			{
-				 				
-				/*
-					$o = wpsg_getStr($this->shop->view['filter']['order']);
-					$s = wpsg_getStr($this->shop->view['filter']['sort']);
-					$r = wpsg_getStr($this->shop->view['standardFilter'][wpsg_getStr($this->shop->view['filter']['related'])]['point']);
-					$p = $this->shop->view['standardFilter'][$this->shop->view['filter']['standard']]['point'];
-					
-					//$this->shop->view['chart']['data'] = 
-					//$objchartClass->$chartFunction($this->shop->view['standardFilter'][$this->shop->view['filter']['standard']]['point'], 
-					//array('relatedpoint' => $this->shop->view['standardFilter'][wpsg_getStr($this->shop->view['filter']['related'])]['point'], 
-					//      'order' => wpsg_getStr($this->shop->view['filter']['order']), 
-					//      'sort' => wpsg_getStr($this->shop->view['filter']['sort'])));
-					
-					$this->shop->view['chart']['data'] = $objchartClass->$chartFunction($p, array('relatedpoint' => $r, 'order' => $o, 'sort' => $s));
-					
-					//if ((array_key_exists('related', $this->shop->view['filter'])) && ($this->shop->view['filter']['related'] != null))
-					//{
-					//    $this->shop->view['chart']['data'] = $objchartClass->$chartFunction($this->shop->view['standardFilter'][$this->shop->view['filter']['standard']]['point'], array('relatedpoint' => $this->shop->view['standardFilter'][wpsg_getStr($this->shop->view['filter']['related'])]['point'], 'order' => wpsg_getStr($this->shop->view['filter']['order']), 'sort' => wpsg_getStr($this->shop->view['filter']['sort'])));
-					//}
-
-					if (($_REQUEST['page'] == 'wpsg-Statistics') && (wpsg_isSizedString($_REQUEST['id']) != 4))
-					{
-						$this->shop->view['chart']['info'] = $this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']];
-					}
-				*/				
-
-				if (($_REQUEST['page'] == 'wpsg-Statistics'))
-				{
-					//$this->shop->view['chart']['data'] = $objchartClass->$chartFunction($this->shop->view['standardFilter'][$this->shop->view['filter']['standard']]['point'], array('relatedpoint' => $this->shop->view['standardFilter'][wpsg_getStr($this->shop->view['filter']['related'])]['point'], 'order' => wpsg_getStr($this->shop->view['filter']['order']), 'sort' => wpsg_getStr($this->shop->view['filter']['sort'])));
-					//$this->shop->view['chart']['info'] = $this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']];
-
-					$o = wpsg_getStr($this->shop->view['filter']['order']);
-					$s = wpsg_getStr($this->shop->view['filter']['sort']);
-					
-					if (isset($this->shop->view['standardFilter'][$this->shop->view['filter']['related']??'']) && isset($this->shop->view['standardFilter'][$this->shop->view['filter']['standard']])) {
-
-						if (!isset($this->shop->view['standardFilter'][$this->shop->view['filter']['related']]['point'])) wpsg_debug("FAIL");
-						
-						$r = $this->shop->view['standardFilter'][intval($this->shop->view['filter']['related'])]['point'];
-						$p = $this->shop->view['standardFilter'][intval($this->shop->view['filter']['standard'])]['point'];
-						
-					}
-					
-					if (!is_numeric($p??'')) $p = 0;
-					
-					//wpsg_debug(get_class($objchartClass).":".$chartFunction);
-					$this->shop->view['chart']['data'] = $objchartClass->$chartFunction($p, array('relatedpoint' => $r??0, 'order' => $o, 'sort' => $s));
-					//$this->shop->view['chart']['info'] = $this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']];
-										
-				}
-
-				if (($_REQUEST['page'] == 'wpsg-Statistics') && (wpsg_getStr($_REQUEST['id']) != 4))
-				{
-					$this->shop->view['chart']['info'] = $this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']];
-				}
-				
+				$this->shop->view['chart']['data'] = $objchartClass->$chartFunction($this->shop->view['standardFilter'][$this->shop->view['filter']['standard']]['point'], array('relatedpoint' => $this->shop->view['standardFilter'][$this->shop->view['filter']['related']]['point'], 'order' => $this->shop->view['filter']['order'], 'sort' => $this->shop->view['filter']['sort']));
+				$this->shop->view['chart']['info'] = $this->shop->view['charts'][$_REQUEST['id']]['type'][$_REQUEST['type']];
 			}
 			
@@ -1089,12 +563,13 @@
 		}
 		
-		/** 
+		/**
+		 * TODO eigenes Recht fÃŒr Statistikeinsicht hinzufÃŒgen
 		 * (non-PHPdoc)
 		 * @see mods/wpsg_mod_basic#wpsg_add_pages()
 		 */
-		public function wpsg_add_pages($default_page)
-		{
-			
-			add_submenu_page($default_page, __("Statistik", "wpsg"), __("Statistik", "wpsg"), 'wpsg_statistics', 'wpsg-Statistics', array($this, 'dispatch'));
+		public function wpsg_add_pages()
+		{
+			
+			add_submenu_page('wpsg-Admin', __("Statistik", "wpsg"), __("Statistik", "wpsg"), 'wpsg_statistics', 'wpsg-Statistics', array($this, 'dispatch'));
 			
 		}
@@ -1105,5 +580,5 @@
 			if (isset($_REQUEST['page']) && $_REQUEST['page'] == 'wpsg-Statistics')
 			{
-				//wp_enqueue_style('wpsg_mod_statistics_css_jqplot', WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/lib/jqplot/jquery.jqplot.css');
+				wp_enqueue_style('wpsg_mod_statistics_css_jqplot', WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/jqplot/jquery.jqplot.css');
 			}
 			
@@ -1112,64 +587,118 @@
 		public function settings_edit()
 		{
-			
+						
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_statistics/settings_edit.phtml');
 			
 		}
 		
-		public function settings_save() {
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_trackingcode', $_REQUEST['wpsg_mod_statistics_piwik_trackingcode'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_url', $_REQUEST['wpsg_mod_statistics_piwik_url'], false, false, WPSG_SANITIZE_DOMAIN, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_SiteId', $_REQUEST['wpsg_mod_statistics_piwik_SiteId'], false, false, WPSG_SANITIZE_INT);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_generel', $_REQUEST['wpsg_mod_statistics_piwik_generel'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_ecommerce', $_REQUEST['wpsg_mod_statistics_piwik_ecommerce'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_productView', $_REQUEST['wpsg_mod_statistics_piwik_productView'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_categoryView', $_REQUEST['wpsg_mod_statistics_piwik_categoryView'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_basketdata', $_REQUEST['wpsg_mod_statistics_piwik_basketdata'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_basket', $_REQUEST['wpsg_mod_statistics_piwik_basket'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_basket_target', $_REQUEST['wpsg_mod_statistics_piwik_basket_target'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout', $_REQUEST['wpsg_mod_statistics_piwik_checkout'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout_target', $_REQUEST['wpsg_mod_statistics_piwik_checkout_target'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout2', $_REQUEST['wpsg_mod_statistics_piwik_checkout2'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout2_target', $_REQUEST['wpsg_mod_statistics_piwik_checkout2_target'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_overview', $_REQUEST['wpsg_mod_statistics_piwik_overview'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_overview_target', $_REQUEST['wpsg_mod_statistics_piwik_overview_target'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			
-			$this->shop->update_option('wpsg_mod_statistics_piwik_done', $_REQUEST['wpsg_mod_statistics_piwik_done'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_piwik_done_target', $_REQUEST['wpsg_mod_statistics_piwik_done_target'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			
-			$this->shop->update_option('wpsg_mod_statistics_google_active', $_REQUEST['wpsg_mod_statistics_google_active'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_google_tracking_code', $_REQUEST['wpsg_mod_statistics_google_tracking_code'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_statistics_google_tracking_debug_mode', $_REQUEST['wpsg_mod_statistics_google_tracking_debug_mode'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_statistics_google_ecommerce', $_REQUEST['wpsg_mod_statistics_google_ecommerce'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			// $this->shop->update_option('wpsg_mod_statistics_socialmedia_fb_px', $_REQUEST['wpsg_mod_statistics_socialmedia_fb_px'], false, false, WPSG_SANITIZE_URL);
-			
-			$this->shop->update_option('wpsg_mod_statistics_line_chart_width', $_REQUEST['wpsg_mod_statistics_line_chart_width'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_line_chart_height', $_REQUEST['wpsg_mod_statistics_line_chart_height'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_pie_chart_width', $_REQUEST['wpsg_mod_statistics_pie_chart_width'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_pie_chart_height', $_REQUEST['wpsg_mod_statistics_pie_chart_height'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_bar_chart_width', $_REQUEST['wpsg_mod_statistics_bar_chart_width'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_bar_chart_height', $_REQUEST['wpsg_mod_statistics_bar_chart_height'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-			$this->shop->update_option('wpsg_mod_statistics_topproductcount', $_REQUEST['wpsg_mod_statistics_topproductcount'], false, false, WPSG_SANITIZE_INT, ['allowEmpty' => true]);
-						
-			$arStatus = [];
-			if (wpsg_isSizedArray($_REQUEST['wpsg_mod_statistics_status'])) foreach ($_REQUEST['wpsg_mod_statistics_status'] as $k => $v) {
-				
-				if ($v === '1') $arStatus[] = $k;
-				
-			}
-			
-			$this->shop->update_option('wpsg_mod_statistics_status', implode(',', $arStatus), false, false, WPSG_SANITIZE_TEXTFIELD);
-
-			$this->shop->update_option('wpsg_mod_statistics_googlekey', $_REQUEST['wpsg_mod_statistics_googlekey'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_statistics_productinterval', $_REQUEST['wpsg_mod_statistics_productinterval'], false, false, WPSG_SANITIZE_INT);
-		
+		public function settings_save() 
+		{
+			$this->shop->update_option('wpsg_mod_statistics_piwik_url', $_REQUEST['wpsg_mod_statistics_piwik_url']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_piwik_generel', $_REQUEST['wpsg_mod_statistics_piwik_generel']);	
+			$this->shop->update_option('wpsg_mod_statistics_piwik_SiteId', $_REQUEST['wpsg_mod_statistics_piwik_SiteId']);		
+			$this->shop->update_option('wpsg_mod_statistics_piwik_ecommerce', $_REQUEST['wpsg_mod_statistics_piwik_ecommerce']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_piwik_basket', $_REQUEST['wpsg_mod_statistics_piwik_basket']);
+			$this->shop->update_option('wpsg_mod_statistics_piwik_basket_target', $_REQUEST['wpsg_mod_statistics_piwik_basket_target']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout', $_REQUEST['wpsg_mod_statistics_piwik_checkout']);
+			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout_target', $_REQUEST['wpsg_mod_statistics_piwik_checkout_target']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout2', $_REQUEST['wpsg_mod_statistics_piwik_checkout2']);
+			$this->shop->update_option('wpsg_mod_statistics_piwik_checkout2_target', $_REQUEST['wpsg_mod_statistics_piwik_checkout2_target']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_piwik_overview', $_REQUEST['wpsg_mod_statistics_piwik_overview']);
+			$this->shop->update_option('wpsg_mod_statistics_piwik_overview_target', $_REQUEST['wpsg_mod_statistics_piwik_overview_target']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_piwik_done', $_REQUEST['wpsg_mod_statistics_piwik_done']);
+			$this->shop->update_option('wpsg_mod_statistics_piwik_done_target', $_REQUEST['wpsg_mod_statistics_piwik_done_target']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_google_active', $_REQUEST['wpsg_mod_statistics_google_active']);
+			$this->shop->update_option('wpsg_mod_statistics_google_domainname', $_REQUEST['wpsg_mod_statistics_google_domainname']);
+			$this->shop->update_option('wpsg_mod_statistics_google_tracking_code', $_REQUEST['wpsg_mod_statistics_google_tracking_code']);
+			$this->shop->update_option('wpsg_mod_statistics_google_anonymise_ip_address', $_REQUEST['wpsg_mod_statistics_google_anonymise_ip_address']);
+			$this->shop->update_option('wpsg_mod_statistics_google_track_page_load_time', $_REQUEST['wpsg_mod_statistics_google_track_page_load_time']);
+			
+			$this->shop->update_option('wpsg_mod_statistics_line_chart_width', $_REQUEST['wpsg_mod_statistics_line_chart_width']);
+			$this->shop->update_option('wpsg_mod_statistics_line_chart_height', $_REQUEST['wpsg_mod_statistics_line_chart_height']);
+			$this->shop->update_option('wpsg_mod_statistics_pie_chart_width', $_REQUEST['wpsg_mod_statistics_pie_chart_width']);
+			$this->shop->update_option('wpsg_mod_statistics_pie_chart_height', $_REQUEST['wpsg_mod_statistics_pie_chart_height']);
+			$this->shop->update_option('wpsg_mod_statistics_bar_chart_width', $_REQUEST['wpsg_mod_statistics_bar_chart_width']);
+			$this->shop->update_option('wpsg_mod_statistics_bar_chart_height', $_REQUEST['wpsg_mod_statistics_bar_chart_height']);
+			$this->shop->update_option('wpsg_mod_statistics_topproductcount', $_REQUEST['wpsg_mod_statistics_topproductcount']);
+			$this->shop->update_option('wpsg_mod_statistics_status', implode(',', array_keys(array_filter((array)$_REQUEST['wpsg_mod_statistics_status'], create_function('$a','return $a != 0;')))));
+			
+		}
+		 
+		public function get_pagetrackingcode()
+		{
+			
+			if (wpsg_isSizedString($this->simulateUrl))
+			{
+				$requestURI = $this->simulateUrl;
+			}
+			else
+			{
+				$requestURI = $_SERVER['REQUEST_URI'];
+			}
+			
+			//url to track
+	        $pageURL = trim(str_replace(get_site_url().'/', '', $requestURI));
+	        if ($pageURL && preg_match('/^\/.*/i', $pageURL)) {
+	            $pageURL = strval(wpsg_jsquoteescape($pageURL));
+	        }
+
+			$html = '
+            _gaq.push(["_setAccount", "' . wpsg_jsquoteescape($this->shop->get_option('wpsg_mod_statistics_google_tracking_code')) . '"]';
+
+			if ($domainName = $this->shop->get_option('wpsg_mod_statistics_google_domainname')) {
+	            $html .=' ,["_setDomainName","' . $domainName . '"]';
+	        }
+	        if($anonymise = $this->shop->get_option('wpsg_mod_statistics_google_anonymise_ip_address')) {
+	            $html .=', ["_gat._anonymizeIp"]';
+	        }
+	        
+			/*if($this->shop->get_option('wpsg_mod_statistics_google_enable_first_touch_tracking')) {
+	            $html .=');
+	            asyncDistilledFirstTouch(_gaq);
+	            _gaq.push(["_trackPageview","' . $pageURL . '"]';
+	        } else {
+	            $html .=', ["_trackPageview","' . $pageURL . '"]';
+	        }*/
+	        
+			if($this->shop->get_option('wpsg_mod_statistics_google_track_page_load_time')) {
+            	$html .=', ["_trackPageLoadTime"]';
+        	}        
+        	
+        	$html .=');';
+        	
+        	return $html;
+        	
+		}
+		
+		public function get_googleanalytics_html()
+		{
+			
+			$html = '
+<!-- BEGIN_WPSG_GOOGLE_ANALYTICS_CODE -->
+<script type="text/javascript">
+//<![CDATA[
+            (function() {
+            	var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;';
+            
+			$html .= 'ga.src = \'https://google-analytics.com/ga.js\';';
+			
+			$html .= '
+                var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);
+            })();
+            var _gaq = _gaq || [];
+'
+			.$this->get_pagetrackingcode().'
+            //]]>
+</script>
+<!-- END_WPSG_GOOGLE_ANALYTICS_CODE -->
+';
+			echo $html;
 		}
 		
@@ -1185,7 +714,4 @@
 				'wpsg_mod_statistics_piwik_generel', 
 				'wpsg_mod_statistics_piwik_ecommerce', 
-				'wpsg_mod_statistics_piwik_productView',
-				'wpsg_mod_statistics_piwik_categoryView',
-				'wpsg_mod_statistics_piwik_basketdata',
 				'wpsg_mod_statistics_piwik_basket', 
 				'wpsg_mod_statistics_piwik_checkout', 
@@ -1194,5 +720,5 @@
 				'wpsg_mod_statistics_piwik_done'
 			);
-			
+				
 			foreach ($arConfPiwik as $c) { if ($this->shop->get_option($c) == '1') { return true; } }
 			
@@ -1200,20 +726,4 @@
 			
 		} // private function usePiwik()
-
-		/**
-		 * Wird irgendeine Google Analytics Konfiguration verwendet
-		 */
-		private function useGA4()
-		{
-			
-			$arConfGA4 = array(
-				'wpsg_mod_statistics_google_ecommerce'
-			);
-			
-			foreach ($arConfGA4 as $c) { if ($this->shop->get_option($c) == '1') { return true; } }
-			
-			return false;
-			
-		} // private function useGA4()
 		
 		/**
@@ -1243,204 +753,10 @@
 		} // public function loadTopProducts()
 		
-		/*
-		 * Abrufen der Statistikdaten im Produktbackend an
-		 */
-		private function getOrderData()
-		{
-			//$sql = "SELECT `".WPSG_TBL_ORDER."`.`id`, `".WPSG_TBL_KU."`.`id` AS `kid`, `".WPSG_TBL_KU."`.`email`, `".WPSG_TBL_ADRESS."`.`name`, `".WPSG_TBL_ADRESS."`.`vname`, `".WPSG_TBL_ADRESS."`.`tel`, `".WPSG_TBL_ORDER."`.`cdate`, `".WPSG_TBL_ORDERPRODUCT."`.`menge` FROM `".WPSG_TBL_ORDER."` AS `".WPSG_TBL_ORDER."`, `".WPSG_TBL_ORDERPRODUCT."` AS `".WPSG_TBL_ORDERPRODUCT."`, `".WPSG_TBL_KU."` AS `".WPSG_TBL_KU."`, `".WPSG_TBL_ADRESS."` AS `".WPSG_TBL_ADRESS."` ";
-			//$sql .= " WHERE (`".WPSG_TBL_ORDER."`.`id` = `".WPSG_TBL_ORDERPRODUCT."`.`o_id`) AND (`".WPSG_TBL_ORDER."`.`k_id` = `".WPSG_TBL_KU."`.`id`) AND (`".WPSG_TBL_ADRESS."`.`id` = `".WPSG_TBL_ORDER."`.`adress_id`)";
-	
-			//$sql = 'SELECT `wp_wpsg_order`.`id`, `wp_wpsg_order_products`.`menge`, `wp_wpsg_adress`.`name`, `wp_wpsg_adress`.`vname`, `wp_wpsg_order_products`.`p_id`, `wp_wpsg_adress`.`tel`, `wp_wpsg_kunden`.`email`, `wp_wpsg_kunden`.`id` AS `kid` FROM { `wp2`.`wp_wpsg_order` AS `wp_wpsg_order` RIGHT OUTER JOIN `wp2`.`wp_wpsg_order_products` AS `wp_wpsg_order_products` ON `wp_wpsg_order`.`id` = `wp_wpsg_order_products`.`o_id` LEFT OUTER JOIN `wp2`.`wp_wpsg_kunden` AS `wp_wpsg_kunden` ON `wp_wpsg_order`.`k_id` = `wp_wpsg_kunden`.`id` LEFT OUTER JOIN `wp2`.`wp_wpsg_adress` AS `wp_wpsg_adress` ON `wp_wpsg_order`.`adress_id` = `wp_wpsg_adress`.`id` }';
-			
-			$sql = "SELECT
-			      OP.`menge`,
-			      O.`onr`,
-				  O.`id`,
-				  C.`id` AS kid,	
-			      C.`knr`,
-				  C.`email`,
-				  OA.`tel` AS `tel`,	
-			      OA.`name` AS `name`,
-			      OA.`vname` AS `vname`
-  			      FROM
-				      `".WPSG_TBL_ORDERPRODUCT."` AS OP
-				         LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON (OP.`o_id` = O.`id`)
-				         LEFT JOIN `".WPSG_TBL_KU."` AS C ON (O.`k_id` = C.`id`)
-				         LEFT JOIN `".WPSG_TBL_ADRESS."` AS OA ON (O.`adress_id` = OA.`id`)";
-			
-			$pid = wpsg_getInt($_REQUEST['edit_id']);
-			$sql .= " WHERE (`OP`.`p_id`='".$pid."')";
-			
-			$sql .= " AND (`O`.`status` IN (".$this->observeStatuscodes."))";
-			
-			if (isset($_REQUEST['von']))
-			{
-				$von = wpsg_toDate( $_REQUEST['von']);
-				$sql .= " AND (CAST(`O`.`cdate` AS DATE) >= '".$von."')";
-			}
-			
-			if (isset($_REQUEST['bis']))
-			{
-				$bis = wpsg_toDate( $_REQUEST['bis']);
-				$sql .= " AND (CAST(`O`.`cdate` AS DATE) <= '".$bis."')";
-			}
-				
-			$odata = $this->db->fetchAssoc($sql);
-		
-			$sum = 0.0;
-			foreach ($odata as $k => $p)
-			{
-				$sum += $p['menge'];
-			}
-			$odata['sum'] = $sum;
-			$this->shop->view['odata'] = $odata;
-		
-		}
-		
-		/*
-		 * Aktualisieren der Statistik im Produktbackend an
-		 */
-		public function aktualisierenRedirect()
-		{
-			
-			//die('aktualisierenRedirect');
-			$this->getOrderData();
-			
-			if ($this->shop->view['odata']['sum'] == 0)
-			{
-				//return 'Keine Daten vorhanden.';
-			}
-				
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_statistics/statisticProduct.phtml');
-			exit;
-			
-		}
-
-		/*
-		 * Exportieren und Download der Statistik im Produktbackend
-		 */
-		public function exportRedirect()
-		{
-			$mb = new wpsg_mod_basic();
-			$path = $mb->getTmpFilePath();
-		
-			$this->getOrderData();
-				
-			unset($this->shop->view['odata']['sum']);
-		
-			$fp = fopen($path.'/wpsg_productStatistic.csv', 'w');
-			$temp = utf8_decode('StÃŒck');
-			$ak = array('Bestell-ID' => 'Bestell-ID',
-					'Name' => 'Name',
-					'Vorname' => 'Vorname',
-					$temp => 'StÃŒck',
-					'e-Mail' => 'e-Mail',
-					'Telefon' => 'Telefon');
-						
-			fputcsv($fp, array_keys($ak), ';');
-			//fputcsv($fp, array_keys($this->shop->view['odata'][0]), ';');
-			
-			foreach ($this->shop->view['odata'] as $e)
-			{
-					
-				// Array umordnen
-				$es = Array('Bestell-ID' => $e['onr'],
-						'Name' => $e['name'],
-						'Vorname' => $e['vname'],
-						'Stueck' => $e['menge'],
-						'e-Mail' => $e['email'],
-						'Telefon' => $e['tel']
-						);
-				// ZeilenumbrÃŒche entfernen
-				if (get_option('wpsg_impexp_clearlinebreak') === '1')
-				{
-					foreach ($es as $k => $v) { $es[$k] = preg_replace('/\r|\n/', '', $v); }
-				}
-					
-				fputcsv($fp, $es, ';', '"');
-				
-			}
-			fclose($fp);
-				
-			wpsg_header::startDownloadContent('exp.csv', file_get_contents($path.'/wpsg_productStatistic.csv'));
-				
-			die();
-		
-		}
-	
-		/*
-		 * zeigt die Statistik im Produktbackend an
-		 */
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-
-			// Nur fÃŒr angelegte Produkte (Shop V3)
-			//if ($produkt_data['id'] <= 0) return false;
-			
-			$int = $this->shop->get_option('wpsg_mod_statistics_productinterval');
-			
-			unset($_SESSION['filter']['statistik']);
-			$_REQUEST['von'] = Date('d.m.Y', strtotime('-'.$int.' days'));
-			$_REQUEST['bis'] = Date('d.m.Y');
-			
-			$this->getOrderData();
-				
-			$product_content['wpsg_mod_statistikproduct'] = array(
-					'title' => __('Statistik', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_statistics/produkt_edit_sidebar.phtml', false)
-			);
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
-		
-		/**
-		 * Wird vom Exportmodul aufgerufen wenn die verfÃŒgbaren Felder geladen werden
-		 */
-		public function wpsg_mod_export_loadFields(&$arFields) {
-		
-			$arFields[20]['fields']['wpsg_mod_productstatistic_sold_lastyear'] = wpsg_translate(__('VerkÃ€ufe #1#', 'wpsg'), date('Y', strtotime('-1 year')));
-			$arFields[20]['fields']['wpsg_mod_productstatistic_sold_currentyear'] = wpsg_translate(__('VerkÃ€ufe #1#', 'wpsg'), date('Y'));
-			$arFields[20]['fields']['wpsg_mod_productstatistic_sold'] = __('VerkÃ€ufe insgesamt', 'wpsg');
-			
-		}
-		
-		/**
-		 * Gibt einen Wert fÃŒr eine Exportspalte zurÃŒck. Das Modul schreibt das Ergebnis in $return zurÃŒck
-		 */
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
-		
-			if (!in_array($field_value, ['wpsg_mod_productstatistic_sold_lastyear', 'wpsg_mod_productstatistic_sold_currentyear', 'wpsg_mod_productstatistic_sold'])) return;
-			
-			if (intval($p_id??0) > 0) {
-				
-				$strQueryWHERE = "";
-				
-				if ($field_value !== 'wpsg_mod_productstatistic_sold') {
-					
-					$strQueryWHERE .= " AND YEAR(O.`cdate`) = ".match($field_value) {
-						'wpsg_mod_productstatistic_sold_lastyear' => intval(date('Y', strtotime('-1 year'))),
-						'wpsg_mod_productstatistic_sold_currentyear' => intval(date('Y')),
-						default => throw new \Exception()
-					};
-					
-				}
-				
-				$return = intval($this->db->fetchOne("
-					SELECT
-						SUM(OP.`menge`)
-					FROM
-						`".WPSG_TBL_ORDERPRODUCT."` AS OP
-						LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON(O.`id` = OP.`o_id`)
-					WHERE
-						O.`type_payment` != '' AND
-						O.`type_payment` IS NOT NULL AND
-						O.`status` IN(".$this->observeStatuscodes.") AND
-						OP.`p_id` = '".intval($p_id)."'
-						".$strQueryWHERE."
-				"));
-			
-			}
-		
+		public function onBasketShow()
+		{
+				
 		}
 		
 	}
 
+?>
Index: /mods/wpsg_mod_stock.class.php
===================================================================
--- /mods/wpsg_mod_stock.class.php	(revision 8528)
+++ /mods/wpsg_mod_stock.class.php	(revision 5261)
@@ -1,14 +1,14 @@
 <?php
-
+	
 	/**
 	 * Dieses Modul erlaubt die Verwaltung des Warenbestandes
 	 *
 	 */
-	class wpsg_mod_stock extends wpsg_mod_basic
+	class wpsg_mod_stock extends wpsg_mod_basic 
 	{
-
-		var $id = 90;
+		
+		var $id = 90;		
 		var $lizenz = 1;
-
+		
 		/**
 		 * Costructor
@@ -16,17 +16,22 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
-
+			
 			$this->name = __('Lagerbestand', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
 			$this->desc = __('Erlaubt die Verwaltung des Lagerbestandes bei den Produkten.', 'wpsg');
-
+						
 		} // public function __construct()
-
-		public function install() {
-
+		
+		public function install() 
+		{
+
+			if ($this->shop->get_option('wpsg_mod_stock_template') === false || $this->shop->get_option('wpsg_mod_stock_template') == '')
+			{
+				$this->shop->update_option('wpsg_mod_stock_template', 'ausverkauft.phtml');
+			}
+						
 			$this->shop->checkDefault('wpsg_mod_stock_showBackendStock', '1');
-			$this->shop->checkDefault('wpsg_mod_stock_updateProductSave', '1');
 			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
@@ -38,89 +43,82 @@
 			  	stock int(11) NOT NULL,
 			  	stock_count int(1) NOT NULL,
-				minstockproduct_count int(11) NOT NULL,
-				minstockproduct_mail varchar (255) NOT NULL,
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+			
 			dbDelta($sql);
-
+			
 		} // public function install()
-
+		
 		public function settings_edit()
 		{
-
+			
 			// VerfÃŒgbare Produkttemplates
 			$this->shop->view['arTemplates'] = $this->shop->loadProduktTemplates();
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
-		public function settings_save()
-		{
-
-			//$this->shop->update_option('wpsg_mod_stock_template', $_REQUEST['wpsg_mod_stock_template']);
-		    $this->shop->update_option('wpsg_mod_stock_allow', $_REQUEST['wpsg_mod_stock_allow'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_stock_showBackendStock', $_REQUEST['wpsg_mod_stock_showBackendStock'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_stock_minstockproduct', $_REQUEST['wpsg_mod_stock_minstockproduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_stock_hideSoldout', $_REQUEST['wpsg_mod_stock_hideSoldout'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    
-		    if ($this->shop->hasMod('wpsg_mod_productgroups')) {
-		    
-		    	$this->shop->update_option('wpsg_mod_stock_updateProductSave', $_REQUEST['wpsg_mod_stock_updateProductSave'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    	
-			}
-
-			if ($this->shop->hasMod('wpsg_mod_productindex')) {
-				
-			    $this->shop->update_option('wpsg_mod_stock_showProductindex', $_REQUEST['wpsg_mod_stock_showProductindex'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    
-			}
-
-			$this->shop->update_option('wpsg_mod_stock_showProduct', $_REQUEST['wpsg_mod_stock_showProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+		
+		public function settings_save() 
+		{
+						
+			$this->shop->update_option('wpsg_mod_stock_template', $_REQUEST['wpsg_mod_stock_template']);
+			$this->shop->update_option('wpsg_mod_stock_notemplateswitch', $_REQUEST['wpsg_mod_stock_notemplateswitch']);			
+			$this->shop->update_option('wpsg_mod_stock_allow', $_REQUEST['wpsg_mod_stock_allow']);
+			$this->shop->update_option('wpsg_mod_stock_showBackendStock', $_REQUEST['wpsg_mod_stock_showBackendStock']);
+			
+			if ($this->shop->hasMod('wpsg_mod_productindex'))
+			{
+				$this->shop->update_option('wpsg_mod_stock_showProductindex', $_REQUEST['wpsg_mod_stock_showProductindex']);
+			}
+			
+			$this->shop->update_option('wpsg_mod_stock_showProduct', $_REQUEST['wpsg_mod_stock_showProduct']);
+			
+			
 		} // public function settings_save()
-
-		/**
-		 *
-		 */
-		public function canOrder($product_key)
-		{
-
-			if ($this->getBestand($product_key) - $this->getAmountSession($product_key) <= 0) return -2;
-
-		} // public function canOrder($oProduct)
-
-		public function canDisplay($product_key)
-		{
-
-			if (!is_admin() && !wpsg_is_cron() && $this->shop->get_option('wpsg_mod_stock_hideSoldout') === '1' && $this->getBestand($product_key) - $this->getAmountSession($product_key) <= 0) return -2;
-
-		} // public function canDisplay($product_key)
-
-		public function produkt_ajax() {
-
+		
+		public function produkt_ajax() { 
+			
 			if ($_REQUEST['wpsg_cmd'] == 'getVariInfo')
 			{
-
-				if ($this->shop->hasMod('wpsg_mod_productvariants'))
-				{
-
-					$this->shop->callMod('wpsg_mod_productvariants', 'stockVarianten', array(wpsg_sinput("key", $_REQUEST['product_id'])));
-
+				
+				if ($this->shop->hasMod('wpsg_mod_varianten'))
+				{
+					
+					$arVari = $this->shop->callMod('wpsg_mod_varianten', 'loadVarianten', array($_REQUEST['edit_id']));
+					
+					foreach ((array)$arVari as $var_id => $var)
+					{
+						
+						echo '<b>'.__($var['name'], 'wpsg').':</b><br />';
+						echo '<ul>';
+						
+						foreach ((array)$var['vari'] as $vari_id => $vari)
+						{
+							
+							echo '<li>';
+							echo __($vari['name'], 'wpsg').': '.((wpsg_isSizedString($vari['stock']))?$vari['stock']:__('Nicht angegeben!', 'wpsg'));
+							echo '</li>';
+							
+						}
+						
+						echo '</ul>';
+						
+					}
+					
 				}
 				else
 				{
-
+					
 					die(wpsg_translate(__('Aufrufsfehler! Fehlercode:#1#', 'wpsg'), '90_1'));
-
-				}
-
-			}
-
-		} // public function produkt_ajax()
-
+					
+				}
+				
+			}
+			
+		} // public function produkt_ajax()		 
+		
 		public function produkt_edit(&$data)
 		{
-
+			
 			$data = wpsg_array_merge($data, $this->db->fetchRow("
 				SELECT
@@ -131,444 +129,290 @@
 					`id` = '".wpsg_q($data['id'])."'
 			"));
-
+												
 		} // public function produkt_edit(&$data)
-	
-		public function produkt_save_before(&$product_data) {
-
-			if (isset($_REQUEST['wpsg_mod_stock_stock'])) wpsg_checkRequest('stock', [WPSG_SANITIZE_INT, ['allowEmpty' => true]], __('Lagerbestand'),$product_data, $_REQUEST['wpsg_mod_stock_stock']);
-			if (isset($_REQUEST['wpsg_mod_stock_stock_count'])) wpsg_checkRequest('stock_count', [WPSG_SANITIZE_CHECKBOX, ['allowEmpty' => true]], __('Lagerbestand zÃ€hlen'), $product_data, $_REQUEST['wpsg_mod_stock_stock_count']);
-			if (isset($_REQUEST['wpsg_mod_minstockproduct'])) wpsg_checkRequest('minstockproduct_count', [WPSG_SANITIZE_INT, ['allowEmpty' => true]], __('Mindestlagerbestand zÃ€hlen'), $product_data, $_REQUEST['wpsg_mod_minstockproduct']);
-			if (isset($_REQUEST['wpsg_mod_stock_minstockproduct_mail'])) wpsg_checkRequest('minstockproduct_mail', [WPSG_SANITIZE_EMAIL, ['allowEmpty' => true]], __('Lagerbestand / Benachrichtigung an'), $product_data, $_REQUEST['wpsg_mod_stock_minstockproduct_mail']);
-
-		}
-		
-		public function produkt_save(&$product_id) {
-
-			if ($this->shop->get_option('wpsg_mod_stock_updateProductSave') === '1' && $this->shop->hasMod('wpsg_mod_productgroups')) {
-
-				$this->calculateProductgroupStock($product_id);
-								
-			}
-			
+		
+		public function produkt_save(&$produkt_id)
+		{
+		
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
+				"stock" => wpsg_q($_REQUEST['wpsg_mod_stock_stock']),
+				"stock_count" => wpsg_q($_REQUEST['wpsg_mod_stock_stock_count'])
+			), "`id` = '".wpsg_q($produkt_id)."'");
+						
 		} // public function produkt_save(&$produkt_id)
 		
-		public function produkt_copy(&$produkt_id, &$copy_id) {
-			
-			if ($this->shop->get_option('wpsg_mod_stock_updateProductSave') === '1' && $this->shop->hasMod('wpsg_mod_productgroups')) {
-				
-				$this->calculateProductgroupStock($copy_id);
-				
-			}
-			
-		}
-
-		/*
-		public function produkt_edit_sidebar(&$produkt_data) {
-
+		public function produkt_edit_sidebar(&$produkt_data)
+		{
+			
 			if (isset($_REQUEST['wpsg_lang'])) return;
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/produkt_edit_sidebar.phtml');
-
-		} */
-
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
+
+		public function renderProdukt_templateSelect(&$produkt_data, &$template_file) 
+		{ 
+			
+			if ($this->shop->get_option('wpsg_mod_stock_notemplateswitch') == '1') return;
+			 
+			if ($produkt_data['stock'] <= 0 && $this->shop->get_option('wpsg_mod_stock_template') != '-1')
+			{
+				
+				$template_file = WPSG_PATH_PRODUKTTEMPLATES.$this->shop->get_option('wpsg_mod_stock_template');
+				
+			}
+			
+		} // public function renderProdukt_templateSelect(&$produkt_data, &$template_file)
+		
 		public function setOrderStatus($order_id, $status_id, $inform)
 		{
 
-			if (in_array($status_id, array(500)) ||
-				(isset($this->shop->view['order']) && ($this->shop->view['order']['status'] == 500)))
-			{
-
-				// Entweder ist die Bestellung von Storniert in einen anderen Status gewÃ€chselt oder in Storniert
-
+			if (in_array($status_id, array(500)) || $this->shop->view['order']['status'] == 500)
+			{
+				
+				// Entweder ist die Bestellvon von Storniert in einen anderen Status gewÃ€chselt oder in Storniert
+				
 				// Lagerbestand zurÃŒcksetzen
 				$arProductsBuy = $this->db->fetchAssoc("
-					SELECT
-						OP.*
+					SELECT 
+						OP.*							
 					FROM
 						`".WPSG_TBL_ORDERPRODUCT."` AS OP
 							LEFT JOIN `".WPSG_TBL_PRODUCTS."` AS P ON (P.`id` = OP.`p_id`)
 					WHERE
-						OP.`o_id` = '".wpsg_q($order_id)."'
+						OP.`o_id` = '".wpsg_q($order_id)."' 
 				");
-
+ 
 				foreach ($arProductsBuy as $p)
 				{
-
+					
 					// Bei gekauften Abo VerlÃ€ngerungen nicht machen
 					if (preg_match('/^abo_\d+(.*)/', $p['productkey'])) continue;
-
+					
 					if ($this->shop->hasMod('wpsg_mod_productgroups'))
 					{
-
+						
 						// Verwaltung des Lagerbestandes in der Produktgruppe
-
+						
 						// Produktdaten laden um die Produktgruppe herauszufinden
 						$product_data = $this->shop->cache->loadProduct($p['p_id']);
-
+								 
 						if (wpsg_isSizedInt($product_data['pgruppe']))
 						{
-
+					
 							$pgruppe_stock_active = $this->db->fetchOne("SELECT `stock_aktiv` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($product_data['pgruppe'])."' ");
-
+				 
 							if ($pgruppe_stock_active === '1')
 							{
-
+					
 								if ($this->shop->view['order']['status'] == 500) /* war storniert */
 								{
-
+					
 									$this->db->Query("
 										UPDATE ".WPSG_TBL_PRODUCTS_GROUP." SET `stock_value` = `stock_value` - ".wpsg_q($p['menge'])." WHERE `id` = '".wpsg_q($product_data['pgruppe'])."'
 									");
-
+					
 								}
 								else
 								{
-
+					
 									$this->db->Query("
 										UPDATE ".WPSG_TBL_PRODUCTS_GROUP." SET `stock_value` = `stock_value` + ".wpsg_q($p['menge'])." WHERE `id` = '".wpsg_q($product_data['pgruppe'])."'
 									");
-
-								}
-
+					
+								} 
+									
 							}
-
-						}
-
-					}
-
+					
+						}
+						
+					}
+										
 					// Verwaltung im Produkt oder Produktgruppenlagerbestand nicht aktiv
 					$product_data =  $this->shop->cache->loadProduct($p['p_id']);
-
+					
 					if ($product_data['stock_count'] != '1') continue;
-
+					
 					$var_key = false;
 
-					if ($this->shop->hasMod('wpsg_mod_productvariants'))
-					{
-
-						if (wpsg_isSizedString($p['mod_vp_varkey']) && preg_match('/^pv_\d+(.*)/', $p['mod_vp_varkey']))
-						{
-
+					if ($this->shop->hasMod('wpsg_mod_varianten'))
+					{
+					
+						if (wpsg_isSizedString($p['mod_vp_varkey']) && preg_match('/^vp_\d+(.*)/', $p['mod_vp_varkey']))
+						{
+							
 							$var_key = $p['mod_vp_varkey'];
-
-						}
-						else if (wpsg_isSizedString($p['productkey']) && preg_match('/^pv_\d+(.*)/', $p['productkey']))
-						{
-
+							
+						}
+						else if (wpsg_isSizedString($p['productkey']) && preg_match('/^vp_\d+(.*)/', $p['productkey']))
+						{
+							
 							$var_key = $p['productkey'];
-
-						}
-
-					}
-
+							
+						}
+						
+					}
+					 
 					// Normales Produkt
-
+										 
 					if ($this->shop->view['order']['status'] == 500) /* war storniert */
 					{
-
+					
 						$this->db->Query("
 							UPDATE ".WPSG_TBL_PRODUCTS." SET `stock` = `stock` - ".wpsg_q($p['menge'])." WHERE `id` = '".wpsg_q($p['p_id'])."'
 						");
-
+													
 					}
 					else
 					{
-
+							
 						$this->db->Query("
 							UPDATE ".WPSG_TBL_PRODUCTS." SET `stock` = `stock` + ".wpsg_q($p['menge'])." WHERE `id` = '".wpsg_q($p['p_id'])."'
 						");
-
-					}
-
+							
+					}
+							 		
 					if ($var_key !== false)
 					{
-
+						
 						// Variantenprodukt
-
+						
 						if ($this->shop->view['order']['status'] == 500)
 						{
-
-							$this->shop->callMod('wpsg_mod_productvariants', 'reduceStock', array($var_key, $p['menge'], true));
+						
+							$this->shop->callMod('wpsg_mod_varianten', 'reduceStock', array($var_key, $p['menge'], true));
 
 						}
 						else
 						{
-
-							$this->shop->callMod('wpsg_mod_productvariants', 'reduceStock', array($var_key, $p['menge'], false));
-
-						}
-
-					}
-
-				}
-
-			}
-
+							
+							$this->shop->callMod('wpsg_mod_varianten', 'reduceStock', array($var_key, $p['menge'], false));
+							
+						}
+						
+					}	
+					
+				}
+				
+			}
+			
 		} // public function setOrderStatus($order_id, $status_id, $inform)
-
-		public function basket_updateProduktFromSession(&$product_index, &$stock) {
+		
+		public function basket_updateProduktFromSession(&$product_index, &$stock) 
+		{ 
 			
 			$product_key = $_SESSION['wpsg']['basket'][$product_index]['id'];
-
-			$oProduct = wpsg_product::getInstance($product_key);
-			
-			if (!$this->checkBestand($product_key, $stock)) {
-
+			
+			if (!$this->checkBestand($product_key, $stock))
+			{
+				
 				/* Nicht mehr ausreichend im Lager */
-				if ($this->shop->get_option('wpsg_mod_stock_allow') === '1') {
-
+				
+				if ($this->shop->get_option('wpsg_mod_stock_allow') === '1')
+				{
+					
 					/* Bestellungen mit negativem Lagerbestand verhindern ist aktiv */
 					$stock = $this->getBestand($product_key);
-
-					if (!$oProduct->isReduceVariStockEnabled()) {
-					
-						if ($this->shop->hasMod('wpsg_mod_productvariants')) {
-							
-							if ($this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$product_key])) {
+					 
+					$this->shop->addFrontendError(__('Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet!', 'wpsg'));
+					
+				}
+				else 
+				{
+					
+					$this->shop->addFrontendError(__('Menge ÃŒberschreitet Warenbestand!', 'wpsg'));
+					
+				}
+				
+			}
+			
+		} // public function basket_updateProduktFromSession(&$product_key, &$stock)
+		
+		public function basket_produkttosession($product_key, &$amount_set, &$ses_data) 
+		{ 
+			 
+			$ses_amount = max(array($this->getAmountSession($product_key), $this->getAmountSessionById($this->shop->getProduktId($product_key))));
+			$check_amount = $amount_set + $ses_amount; 
+			
+ 			if (!$this->checkBestand($product_key, $check_amount))
+			{
 								
-								// Das Produkt kann in verschiedenen Varianten im Warenkorb liegen
-								foreach ($_SESSION['wpsg']['basket'] as $_product_index => $basket_data) {
-									
-									if ($this->shop->getProduktID($basket_data['id']) === $this->shop->getProduktID($product_key) && $product_index !== $_product_index) {
-										
-										$stock -= $basket_data['menge'];
-										
-									}
-									
-								}
-								
-							}
-							
-						}
-						
-					}
-					
-					$this->shop->addFrontendError(__('Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet!', 'wpsg'));
-
-				}
-				else
-				{
-
-					$this->shop->addFrontendError(__('Menge ÃŒberschreitet Warenbestand!', 'wpsg'));
-
-				}
-
-			}
-
-		} // public function basket_updateProduktFromSession(&$product_key, &$stock)
-
-		public function basket_produkttosession($product_key, &$amount_set, &$ses_data) {
-
-			//$ses_amount = max(array($this->getAmountSession($product_key), $this->getAmountSessionById($this->shop->getProduktId($product_key))));
-
-			$oProduct = wpsg_product::getInstance($product_key);
-			
-			if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($product_key))) {
-				
-				$ses_amount = $this->getAmountSession($product_key);
-
-			} else {
-
-				$ses_amount = $this->getAmountSessionById($this->shop->getProduktId($product_key));
-			}
-			
-			$check_amount = $amount_set + $ses_amount;
-
- 			if (!$this->checkBestand($product_key, $check_amount)) {
-
 				/* Nicht mehr ausreichend im Lager */
-				if ($this->shop->get_option('wpsg_mod_stock_allow') === '1') {
-
+				
+				if ($this->shop->get_option('wpsg_mod_stock_allow') === '1')
+				{
+					 
 					/* Bestellungen mit negativem Lagerbestand verhindern ist aktiv */
 					$amount_stock = $this->getBestand($product_key);
-
-					if (!$oProduct->isReduceVariStockEnabled()) {
-					
-						if ($this->shop->hasMod('wpsg_mod_productvariants')) {
-							
-							if ($this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$product_key])) {
-								
-								// Das Produkt kann in verschiedenen Varianten im Warenkorb liegen
-								foreach ($_SESSION['wpsg']['basket'] as $_product_index => $basket_data) {
-									
-									if ($this->shop->getProduktID($basket_data['id']) === $this->shop->getProduktID($product_key)) {
+ 
+					$amount_set = $amount_stock - $ses_amount;
+															
+					$this->shop->addFrontendError(__('Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet!', 'wpsg'));
+					
+					if ($amount_set <= 0) return -2;
 										
-										$amount_stock -= $basket_data['menge'];
-										
-									}
-									
-								}
-								
-							}
-							
-						}
-						
-					}
-					
-					$amount_set = $amount_stock - $ses_amount;
-
-					$this->shop->addFrontendError(__('Die ausgewÃ€hlte Menge wurde korrigiert, da sie den Warenbestand ÃŒberschreitet!', 'wpsg'));
-
-					if ($amount_set <= 0) return -2;
-
-				} else {
-
-					$this->shop->addFrontendError(__('Bitte beachten Sie, dass die ausgewÃ€hlte Menge den Warenbestand ÃŒberschreitet, die Bestellung jedoch abgeschlossen werden kann! Bei Fragen zur Bestellung, wenden Sie sich bitte an uns.', 'wpsg'));
-
-				}
-
-			}
-
+				}
+				else
+				{
+					 
+					$this->shop->addFrontendError(__('Menge ÃŒberschreitet Warenbestand!', 'wpsg'));
+						
+				}
+				
+			}	
+			
 		}
-
-		public function checkCheckout(&$state, &$error, &$arCheckout) {
-
-			if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_stock_allow')) || $state !== true) return;
-
-			foreach ((array)$this->shop->basket->arProdukte as $product_data) {
-
-				if (!$this->checkBestand($product_data['id'], $product_data['menge'])) {
-
-					$nStockAvailable = $this->getBestand($product_data['id']);
-
-					if ($nStockAvailable <= 0) {
-
-						$this->shop->addFrontendError(
-							wpsg_translate(
-								__('Der Lagerbestand von Produkt "#1#" hat sich zwischenzeitlich verÃ€ndert. Es sind nur noch #2# StÃŒck verfÃŒgbar.', 'wpsg'),
-								$this->shop->getProductName($product_data['id']),
-								$nStockAvailable
-							)
-						);
-
-						$error = true;
-
-					}
-
-				}
-
-			}
-
-		} // public function checkCheckout(&$state, &$error, &$arCheckout)
-
-		public function product_addedit_content(&$product_content, &$product_data) {
-
-			if (isset($_REQUEST['wpsg_lang']) || !wpsg_isSizedInt($_REQUEST['edit_id'])) return;
-
-            $this->shop->view['data'] = $product_data;
-
-			if (!array_key_exists('stock', $product_content)) {
-
-				$this->shop->view['arSubAction']['stock'] = array(
-					'title' => __('Bestand / Gew. / FÃŒllm.', 'wpsg'),
-					'content' => ''
-				);
-
-			}
-
-			$this->shop->view['arSubAction']['stock']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/product_addedit_content.phtml', false);
-
-		} // public function produkt_add(&$produkt_data)
-
+		
 		/* Modulfunktionen */
-
-		public function calculateProductgroupStock($product_id) {
-			
-			$oProduct = wpsg_product::getInstance($product_id);
-			$oProductGroup = $oProduct->getProductgroup();
-			
-			if ($oProductGroup->isLoaded()) {
-				
-				$arProductRows = $this->db->fetchAssoc("SELECT P.`id`, P.`stock` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`pgruppe` = '".wpsg_q($oProductGroup->getId())."' ");
-				
-				$stock = 0;
-				
-				foreach ($arProductRows as $p_row) {
-					
-					$stock += intval($p_row['stock']);
-					
-				}
-				
-				$stock_pre = intval($oProductGroup->__get('stock_value'));
-				
-				$this->db->UpdateQuery(WPSG_TBL_PRODUCTS_GROUP, [
-					'stock_value' => wpsg_q($stock)
-				], " `id` = '".wpsg_q($oProductGroup->getId())."' ");
-				
-				if ($stock_pre !== $stock && is_admin()) {
-					
-					$this->shop->addBackendMessage(wpsg_translate(
-						__('Der Lagerbestand in Produktgruppe #1# wurde von #2# auf #3# automatisch geÃ€ndert.', 'wpsg'),
-						$oProductGroup->getLabel(),
-						$stock_pre,
-						$stock
-					));
-					
-				}
-				
-			}
-			
-		}
 		
 		/**
 		 * Gibt den aktuellen Bestand fÃŒr ein Produkt zurÃŒck
 		 */
-		public function getBestand($product_key) {
-
-			$oProduct = wpsg_product::getInstance($product_key);
-			
+		public function getBestand($produkt_key)
+		{
+			 
 			$arStock = array();
-
-			if ($this->shop->hasMod('wpsg_mod_productgroups')) {
-
-				$product_id = $this->shop->getProduktID($product_key);
+			
+			if ($this->shop->hasMod('wpsg_mod_productgroups'))
+			{
+				
+				$product_id = $this->shop->getProduktID($produkt_key);
 				$product_data = $this->shop->cache->loadProduct($product_id);
-                
-				if (wpsg_isSizedInt($product_data['pgruppe'])) {
-
+				
+				if (wpsg_isSizedInt($product_data['pgruppe']))
+				{
+					
 					$pgroup = $this->db->fetchRow("SELECT `stock_aktiv`, `stock_value` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($product_data['pgruppe'])."' ");
-
-					if ($pgroup['stock_aktiv'] === '1') {
-
-						$arStock[] = $pgroup['stock_value'];
-
-					}
-
-				}
-
-			}
-
-			if (is_numeric($product_key)) {
-
+					
+					if ($pgroup['stock_aktiv'] === '1')
+					{
+						
+						$arStock[] = $pgroup['stock_value'];						
+						
+					}
+					
+				}
+				
+			}
+			
+			if (is_numeric($produkt_key))
+			{
+			
 				// Lagerbestand in der Datenbank
-				$arStock[] = $this->db->fetchOne("SELECT P.`stock` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`id` = '".wpsg_q($product_key)."'");
-
-			} else if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$product_key])) {
-				
-				if (!$oProduct->isReduceVariStockEnabled()) {
-				//if ($this->shop->get_option('wpsg_vp_product_stock_varinotchange') === '1') {
-					
-					$product_id = $this->shop->getProduktID($product_key);
-					$arStock[] = $this->db->fetchOne("SELECT P.`stock` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`id` = '".wpsg_q($product_id)."'");
-					
-				} else {
-					
-					$arStock[] = $this->shop->callMod('wpsg_mod_productvariants', 'getStockForVariation', [$product_key]);
-					
-				}
-				
-			} else if ($this->shop->hasMod('wpsg_mod_abo') && $this->shop->callMod('wpsg_mod_abo', 'isAboExtensionProductKey', [$product_key])) {
-
-			    $product_id = $this->shop->callMod('wpsg_mod_abo', 'getProductIDFromAboExtensionProductKey', [$product_key]);
-
-                $arStock[] = $this->db->fetchOne("SELECT P.`stock` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`id` = '".wpsg_q($product_id)."'");
-			    
-            }
-
+				$arStock[] = $this->db->fetchOne("SELECT P.`stock` FROM `".WPSG_TBL_PRODUCTS."` AS P WHERE P.`id` = '".wpsg_q($produkt_key)."'");
+					 				
+			}
+			else if ($this->shop->hasMod('wpsg_mod_varianten'))
+			{
+				
+				$arStock[] = $this->shop->callMod('wpsg_mod_varianten', 'getStockForVarianten', array($produkt_key)); 
+				 				
+			}
+			
 			if (!wpsg_isSizedArray($arStock)) return 0;
 			else return min($arStock);
-
+			
 		} // public function getBestand($produkt_id)
-
+		
 		/**
 		 * Gibt die aktuelle Menge eines Produktes aus der Session zurÃŒck
@@ -576,23 +420,23 @@
 		public function getAmountSession($product_key)
 		{
-
+			
 			$amount_ses = 0;
-
+			
 			if (wpsg_isSizedArray($_SESSION['wpsg']['basket']))
 			{
-
+				
 				foreach ($_SESSION['wpsg']['basket'] as $product_index => $product_data)
 				{
-
+					
 					if ($product_key == $product_data['id']) $amount_ses += $product_data['menge'];
-
-				}
-
-			}
-
+					
+				}
+				
+			}
+ 
 			return $amount_ses;
-
+			
 		} // public function getAmountSession($product_key)
-
+		
 		/**
 		 * Gibt die aktuelle Menge eines Produktes aus der Session zurÃŒck
@@ -601,288 +445,122 @@
 		public function getAmountSessionById($product_id)
 		{
-
+			
 			$amount_ses = 0;
-
+			
 			if (wpsg_isSizedArray($_SESSION['wpsg']['basket']))
 			{
-
+				
 				foreach ($_SESSION['wpsg']['basket'] as $product_index => $product_data)
 				{
-
-					if ($this->shop->getProduktId($product_data['id']) == $product_id) $amount_ses += $product_data['menge'];
-
-				}
-
-			}
-
+					
+					if ($this->shop->getProduktId($product_data['id']) == $product_id) $amount_ses += $product_data['menge']; 
+					
+				}
+				
+			}
+			
 			return $amount_ses;
-
+			
 		} // public function getAmountSessionById($product_id)
-
+		
 		/**
 		 * ÃberprÃŒft ob der Bestand eines Produktes noch ausreichend ist
 		 * @return true|false
 		 */
-		public function checkBestand($produkt_key, $menge) {
+		public function checkBestand($produkt_key, $menge) 
+		{
+			
+			if (substr($produkt_key, 0, 3) == 'abo') return;
 			
 			$product_id = $this->shop->getProduktID($produkt_key);
+			$product_data = $this->shop->cache->loadProduct($produkt_id);
+									
+			if ($this->shop->hasMod('wpsg_mod_productgroups'))
+			{
+				
+				if (wpsg_isSizedInt($product_data['pgruppe']))
+				{
+					
+					$pgroup = $this->db->fetchRow("SELECT `stock_aktiv`, `stock_value` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($product_data['pgruppe'])."' ");
+					
+					if ($pgroup['stock_aktiv'] === '1')
+					{
+						
+						$stock = $pgroup['stock_value'];
+						
+						/* Lagerbestand der Produktgruppe ist aktiv */						
+						if ($menge > $stock)
+						{
+
+							return false;
+							
+						}
+						
+					}
+					
+				}
+				
+			}
+						
+			$product_stock = $this->getBestand($produkt_key);
+			 
+			if ($menge > $product_stock)
+			{
+				
+				return false;
+				
+			}
+			
+			return true;
+			
+						
+		} // public function checkBestand(&$produkt_key, $menge)
+		
+		public function basket_save_product(&$data, &$product_data_db, $finish_order) 
+		{ 
+
+			if ($finish_order !== true) return;
+			
+			$product_id = $this->shop->getProduktID($data['productkey']);
 			$product_data = $this->shop->cache->loadProduct($product_id);
-
-			$oProduct = wpsg_product::getInstance($product_id);
-			
-			if ($this->shop->hasMod('wpsg_mod_productgroups')) {
-
-				if (wpsg_isSizedInt($product_data['pgruppe'])) {
-
-					$pgroup = $this->db->fetchRow("SELECT `stock_aktiv`, `stock_value` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($product_data['pgruppe'])."' ");
-
-					if ($pgroup['stock_aktiv'] === '1') {
-
-						$stock = $pgroup['stock_value'];
-
-						/* Lagerbestand der Produktgruppe ist aktiv */
-						if ($menge > $stock) {
-
-							return false;
-
-						}
-
-					}
-
-				}
-
-			}
-
-			$product_stock = $this->getBestand($produkt_key);
- 
-			if (!$oProduct->isReduceVariStockEnabled()) {
-			//if ($this->shop->get_option('wpsg_vp_product_stock_varinotchange')) {
-			
-				if ($this->shop->hasMod('wpsg_mod_productvariants')) {
-					
-					if ($this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$produkt_key])) {
-						
-						// Das Produkt kann in verschiedenen Varianten im Warenkorb liegen
-						foreach ($_SESSION['wpsg']['basket'] as $basket_data) {
-							
-							if ($this->shop->getProduktID($basket_data['id']) === $this->shop->getProduktID($produkt_key) && $produkt_key !== $basket_data['id']) {
-							 
-								$menge += $basket_data['menge'];
-								
-							}
-							
-						}
-						
-					}
-					
-				}
-				
-			}
-			
-			if ($menge > $product_stock) {
-
-				return false;
-
-			}
-
-			return true;
-
-
-		} // public function checkBestand(&$produkt_key, $menge)
-		
-		public function calculation_saveProduct(&$oCalculation, $calc_product, &$db_product_data, $finish_order) {
-			
-			if (!$finish_order) return;
-			
-			$data = [
-				'productkey' => $calc_product['product_key'],
-				'menge' => $calc_product['amount']
-			];
-			
-			$product_id = $this->shop->getProduktID($data['productkey']);
-
-			// Tabellen sperren
-			if ($this->shop->get_option('wpsg_lockOrderTables') != '1')
-			{
-
-				$arLockTables[WPSG_TBL_PRODUCTS] = "WRITE";
-				$arLockTables[$this->shop->prefix.'posts'] = "WRITE";
-				$arLockTables[$this->shop->prefix.'options'] = "WRITE";
-				if ($this->shop->hasMod('wpsg_mod_productgroups')) $arLockTables[WPSG_TBL_PRODUCTS_GROUP] = "WRITE";
-
-				$strQuery = "LOCK TABLES ";
-				foreach ($arLockTables as $table_name => $locktype) $strQuery .= " `".$table_name."` ".$locktype.",";
-				$this->db->Query(substr($strQuery, 0, -1));
-
-			}
-
-			//sleep(20);
-
-			$product_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."' ");
 			$stock = $data['menge'];
-
-			// Fehlerbehandlung fÃŒr Produktbestand
-			//if ($product_data['stock_count'] == '1' && $stock > $product_data['stock']) return false;
-			if ($product_data['stock_count'] == '1' &&
-				(($this->shop->get_option('wpsg_mod_stock_allow') === '1') && ($stock > $product_data['stock'])))
-			{
-				$this->db->unlockTables();
-				return false;
-			}
-
+			  
 			/* Produktgruppe runterzÃ€hlen */
 			if ($this->shop->hasMod('wpsg_mod_productgroups'))
 			{
-
+			
 				$pgroup = $this->db->fetchRow("SELECT `stock_aktiv`, `stock_value` FROM `".WPSG_TBL_PRODUCTS_GROUP."` WHERE `id` = '".wpsg_q($product_data['pgruppe'])."' ");
-
+			
 				if ($pgroup['stock_aktiv'] == '1')
 				{
-
-					//if ($pgroup['stock_aktiv'] == '1' && ($stock > $pgroup['stock_value'])) return false;
-					if (($this->shop->get_option('wpsg_mod_stock_allow') === '1') && ($stock > $pgroup['stock_value']))
-					{
-						$this->db->unlockTables();
-						return false;
-					}
-
+						
 					$this->db->Query("
-						UPDATE `".WPSG_TBL_PRODUCTS_GROUP."` SET `stock_value` = `stock_value` - '".wpsg_q($stock)."' WHERE `id` = '".wpsg_q($product_data['pgruppe'])."'
+						UPDATE `".WPSG_TBL_PRODUCTS_GROUP."` SET `stock_value` = `stock_value` - '".wpsg_q($stock)."' WHERE `id` = '".wpsg_q($product_data['pgruppe'])."' 
 					");
 				}
-
-			}
-
-			// Lagerbestand im Produkt zÃ€hlen?
-			if ($product_data['stock_count'] == '1')
-			{
-
-				if ($this->shop->hasMod('wpsg_mod_productvariants') && preg_match('/^pv_(.*)/', $data['productkey']))
-				{
-
-					// Bestand der Variationen runterzÃ€hlen
-					// und Produktbestand als Summe der VariantenbestÃ€nde
-					$this->shop->callMod('wpsg_mod_productvariants', 'reduceStock', array($data['productkey'], $stock));
-
-				}
-				else
-				{
-					// Im Produkt selbst runterzÃ€hlen
-					$this->db->Query("UPDATE `".WPSG_TBL_PRODUCTS."` SET `stock` = `stock` - '".wpsg_q($stock)."' WHERE `id` = '".wpsg_q($product_id)."' ");
-				}
-				
-				// Benachrichtigung bei Unterschreiten von mindest Menge
-				if (wpsg_isSizedInt($this->shop->get_option('wpsg_mod_stock_minstockproduct')))
-				{
-
-					$product_data = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($product_id)."' ");
-					$aktStock = $product_data['stock'];
-					// Wenn Mindestbestellmenge unterschritten oder gleich
-					if ($aktStock <= $product_data['minstockproduct_count']) $this->sendMinStockMail($data['productkey']);
-
-				}
-
-			}
-
-			// Tabellen entsperren
-			$this->db->Query("UNLOCK TABLES");
-
-			return true;
-
-		} // public function checkReduceStock(&$data, &$product_data)
-
-        /**
-         * Export der Daten als CSV
-         * {@inheritDoc}
-         * @see wpsg_mod_basic::wpsg_mod_export_loadFields()
-         */
-        public function wpsg_mod_export_loadFields(&$arFields) {
-
-            $arFields[20]['fields']['mod_stock_stock'] = __('Lagerbestand', 'wpsg');
-            $arFields[20]['fields']['mod_stock_minstock'] = __('Mindestlagerbestand', 'wpsg');
-
-        }
-        
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) {
- 						
-		    // Abbrechen wenn uninteressante Felder
-            if (!in_array($field_value, ['mod_stock_stock', 'mod_stock_minstock'])) return;
-		    
-            $arProductExportIDs = [];
-            $arReturn = [];
-		    
-		    if (wpsg_isSizedInt($p_id)) $arProductExportIDs = [$p_id];
-            else {
-
-                $oOrder = wpsg_order::getInstance($o_id);
-                
-                /** @var \wpsg_order_product $oOrderProducts */
-                foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-                    
-                    if (!in_array($oOrderProduct->getProductId(), $arProductExportIDs)) $arProductExportIDs[] = $oOrderProduct->getProductId();
-                    
-                }
-                
-            }
-            		                            
-		    if ($field_value === 'mod_stock_stock') {
-		    		        
-		        foreach ($arProductExportIDs as $product_id) {
-
-                    $oProduct = wpsg_product::getInstance($product_id);
-                    
-                    $arReturn[] = $oProduct->stock;
-		            
-                }
-                
-                $return = implode(',', $arReturn);
-		        
-            } else if ($field_value === 'mod_stock_minstock') {
-
-                foreach ($arProductExportIDs as $product_id) {
-
-                    $oProduct = wpsg_product::getInstance($product_id);
-
-                    $arReturn[] = $oProduct->minstockproduct_count;
-                    
-                }
-
-                $return = implode(',', $arReturn);
-                
-            }
-			
-		}
-		
-		/**
-		 * Sendet eine Mail bei erreichen des Mindestbestandes
-		 */
-		public function sendMinStockMail($product_key)
-		{
-
-			$product_id = $this->shop->getProduktID($product_key);
-			$product_data = $this->shop->cache->loadProduct($product_id);
-
-			if ($this->shop->get_option('wpsg_htmlmail') === '1')
-			{
-
-				$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/stockmail_html.phtml', false);
-
-			}
-			else
-			{
-
-				$mail_html = false;
-
-			}
-
-			$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_stock/stockmail.phtml', false);
-
-			$to = $product_data['minstockproduct_mail'];
-			if (!wpsg_isSizedString($to)) $to = get_bloginfo('admin_email');
-
-			list($subject, $text) = $this->shop->sendMail($mail_text, $to, 'wpsgmodstockminstockmail', array(), false, false, $mail_html, wpsg_translate(__('Der Minimalbestand im Produkt #1# wurde erreicht.', 'wpsg'), $product_data['name']));
-
-		} // public function sendMinStockMail($product_key)
-
+			
+			}
+				
+			// Produkt runterzÃ€hlen
+				
+			// Wenn ZÃ€hlung im Produkt deaktiviert, dann breche ich hier ab
+			if ($product_data['stock_count'] != '1') return;
+			 
+			if ($this->shop->hasMod('wpsg_mod_varianten') && preg_match('/^vp_(.*)/', $data['productkey']))
+			{
+					
+				// Bestand der Variationen runterzÃ€hlen
+				$this->shop->callMod('wpsg_mod_varianten', 'reduceStock', array($data['productkey'], $stock));
+					
+			}
+				
+			// Im Produkt selbst runterzÃ€hlen
+			$this->db->Query("
+				UPDATE `".WPSG_TBL_PRODUCTS."` SET `stock` = `stock` - '".wpsg_q($stock)."' WHERE `id` = '".wpsg_q($product_id)."' 
+			");
+			
+		} // public function basket_save_product(&$data, &$product_data)
+				
 	} // class wpsg_mod_stock extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_su.class.php
===================================================================
--- /mods/wpsg_mod_su.class.php	(revision 8528)
+++ /mods/wpsg_mod_su.class.php	(revision 5261)
@@ -39,8 +39,8 @@
 			
 			$this->shop->checkDefault('wpsg_mod_su_currency', 'EUR');
-			$this->shop->checkDefault('wpsg_mod_su_userid', __('', 'wpsg'));
-			$this->shop->checkDefault('wpsg_mod_su_projectid', __('', 'wpsg'));
-			$this->shop->checkDefault('wpsg_mod_su_projectpassword', '');
-			$this->shop->checkDefault('wpsg_mod_su_noticepassword', __('', 'wpsg'));
+			$this->shop->checkDefault('wpsg_mod_su_userid', __('<!-- Die User ID bekommen sie von SofortÃŒberweisung.de --!>', 'wpsg'));
+			$this->shop->checkDefault('wpsg_mod_su_projectid', __('<!-- Die Projekt ID bekommen sie von SofortÃŒberweisung.de --!>', 'wpsg'));
+			$this->shop->checkDefault('wpsg_mod_su_projectpassword', __('<!-- Das Projektpasswort bekommen sie von SofortÃŒberweisung.de --!>', 'wpsg'));
+			$this->shop->checkDefault('wpsg_mod_su_noticepassword', __('<!-- Das Benachrichtigungspasswort bekommen sie von SofortÃŒberweisung.de --!>', 'wpsg'));
 			$this->shop->checkDefault('wpsg_mod_su_language', 'DE');
 			$this->shop->checkDefault('wpsg_mod_su_hash', 'md5');
@@ -107,32 +107,35 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_su_bezeichnung', $_REQUEST['wpsg_mod_su_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_aktiv', $_REQUEST['wpsg_mod_su_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_su_hint', $_REQUEST['wpsg_mod_su_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_su_subject1', $_REQUEST['wpsg_mod_su_subject1'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_su_subject1', $_REQUEST['wpsg_mod_su_subject1'], WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_subject2', $_REQUEST['wpsg_mod_su_subject2'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_su_subject2', $_REQUEST['wpsg_mod_su_subject2'], WPSG_SANITIZE_TEXTFIELD);
-						
-			$this->shop->update_option('wpsg_mod_su_gebuehr', $_REQUEST['wpsg_mod_su_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_su_mwst', $_REQUEST['wpsg_mod_su_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_su_mwstland', $_REQUEST['wpsg_mod_su_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_su_currency', $_REQUEST['wpsg_mod_su_currency'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_userid', $_REQUEST['wpsg_mod_su_userid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_projectid', $_REQUEST['wpsg_mod_su_projectid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_projectpassword', $_REQUEST['wpsg_mod_su_projectpassword'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_su_noticepassword', $_REQUEST['wpsg_mod_su_noticepassword'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_su_language', $_REQUEST['wpsg_mod_su_language'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_hash', $_REQUEST['wpsg_mod_su_hash'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_su_autostart', $_REQUEST['wpsg_mod_su_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
+			
+			$this->shop->update_option('wpsg_mod_su_bezeichnung', $_REQUEST['wpsg_mod_su_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_su_aktiv', $_REQUEST['wpsg_mod_su_aktiv']);
+			$this->shop->update_option('wpsg_mod_su_hint', $_REQUEST['wpsg_mod_su_hint']);
+			
+			$this->shop->update_option('wpsg_mod_su_subject1', $_REQUEST['wpsg_mod_su_subject1']);
+			$this->shop->addTranslationString('wpsg_mod_su_subject1', $_REQUEST['wpsg_mod_su_subject1']);
+			$this->shop->update_option('wpsg_mod_su_subject2', $_REQUEST['wpsg_mod_su_subject2']);
+			$this->shop->addTranslationString('wpsg_mod_su_subject2', $_REQUEST['wpsg_mod_su_subject2']);
+						
+			$this->shop->update_option('wpsg_mod_su_gebuehr', wpsg_tf($_REQUEST['wpsg_mod_su_gebuehr'], true));
+			$this->shop->update_option('wpsg_mod_su_mwst', $_REQUEST['wpsg_mod_su_mwst']);			 
+			$this->shop->update_option('wpsg_mod_su_mwstland', $_REQUEST['wpsg_mod_su_mwstland']);
+			
+			$this->shop->update_option('wpsg_mod_su_currency', $_REQUEST['wpsg_mod_su_currency']);
+			$this->shop->update_option('wpsg_mod_su_userid', $_REQUEST['wpsg_mod_su_userid']);
+			$this->shop->update_option('wpsg_mod_su_projectid', $_REQUEST['wpsg_mod_su_projectid']);
+			$this->shop->update_option('wpsg_mod_su_projectpassword', $_REQUEST['wpsg_mod_su_projectpassword']);
+			$this->shop->update_option('wpsg_mod_su_noticepassword', $_REQUEST['wpsg_mod_su_noticepassword']);
+			$this->shop->update_option('wpsg_mod_su_language', $_REQUEST['wpsg_mod_su_language']);
+			$this->shop->update_option('wpsg_mod_su_hash', $_REQUEST['wpsg_mod_su_hash']);			
+			$this->shop->update_option('wpsg_mod_su_autostart', $_REQUEST['wpsg_mod_su_autostart']);
 			 			
 		} // public function settings_save()
 		
-		public function addPayment(&$arPayment) { 
+		public function addPayment(&$arPayment) 
+		{ 
 
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_su_aktiv') != '1') return;
+			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_su_mwst'), $this->shop->getDefaultCountry());
 			
 			$arPayment[$this->id] = array(
@@ -140,18 +143,89 @@
 				'name' => __($this->shop->get_option('wpsg_mod_su_bezeichnung'), 'wpsg'),
 				'hint' => __($this->shop->get_option('wpsg_mod_su_hint')),
-				'price' => $this->shop->get_option('wpsg_mod_su_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_su_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_su_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_su_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_su_mwstland'),
-			    'logo' => $this->shop->getRessourceURL('mods/mod_su/gfx/logo_100x25.png')
+			    'logo' => $this->shop->getRessourceURL('gfx/su.png'),
+				'logo_100x25' => $this->shop->getRessourceURL('mods/mod_su/gfx/logo_100x25.png')
 			);
-						
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_su_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_su_gebuehr'), $arBasket['sum']['preis']);																								
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_netto;
+					
+				}
+				else 
+				{
+					
+					$arPayment[$this->id]['price'] = $payment_brutto;
+					
+				}
+				
+			}
+			
 		} // public function addPayment(&$arPayment)
-		 
-		public function order_done(&$order_id, &$done_view) { 
-			
-			$oOrder = wpsg_order::getInstance($order_id);			
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+							
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_su_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_su_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_su_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket)
+		
+		public function order_done(&$order_id, &$done_view) 
+		{ 
 
 			// Bestellungen mit 0 geben nix aus
-			if ($oOrder->getToPay() <= 0) return;
+			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
 			
 			if ($this->shop->view['basket']['checkout']['payment'] == $this->id)
@@ -186,92 +260,68 @@
 		} // public function mail_payment()
 				
-		public function template_redirect() { 
-
-			if (wpsg_isSizedString($_REQUEST['wpsg_plugin'], 'wpsg_mod_su') && wpsg_isSizedString($_REQUEST['confirm'], 'su')) {
-
-				try {
-				
-					if (!wpsg_checkInput($_REQUEST['user_variable_2'], WPSG_SANITIZE_INT)) throw new \Exception(__('UngÃŒltiger Wert in user_variable_2', 'wpsg'));
-					
-					$order = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_REQUEST['user_variable_2'])."'");
-					if ($order['id'] <= 0) die();
-
-                    if ($order['ext_payed'] === '1') exit;
-					
-					$oOrder = wpsg_order::getInstance($order['id']);
-					
-					// Den Request validiere ich hier nicht weiter, da ich ihn nur zum Hash Abgleich brauche und somit die validitÃ€t prÃŒfe
-					
-					$arHash = array(
-						'transaction' => $_REQUEST['transaction'],
-						'user_id' => $_REQUEST['user_id'],
-						'project_id' => $_REQUEST['project_id'],
-						'sender_holder' => $_REQUEST['sender_holder'],
-						'sender_account_number' => $_REQUEST['sender_account_number'],
-						'sender_bank_code' => $_REQUEST['sender_bank_code'],
-						'sender_bank_name' => $_REQUEST['sender_bank_name'],
-						'sender_bank_bic' => $_REQUEST['sender_bank_bic'],
-						'sender_iban' => $_REQUEST['sender_iban'],
-						'sender_country_id' => $_REQUEST['sender_country_id'],
-						'recipient_holder' => $_REQUEST['recipient_holder'],
-						'recipient_account_number' => $_REQUEST['recipient_account_number'],
-						'recipient_bank_code' => $_REQUEST['recipient_bank_code'],
-						'recipient_bank_name' => $_REQUEST['recipient_bank_name'],
-						'recipient_bank_bic' => $_REQUEST['recipient_bank_bic'],
-						'recipient_iban' => $_REQUEST['recipient_iban'],
-						'recipient_country_id' => $_REQUEST['recipient_country_id'],
-						'international_transaction' => $_REQUEST['international_transaction'],
-						'amount' => number_format(wpsg_tf($oOrder->getToPay()), 2, '.', ''),
-						'currency_id' => $_REQUEST['currency_id'],
-						'reason_1' => $_REQUEST['reason_1'],
-						'reason_2' => $_REQUEST['reason_2'],
-						'security_criteria' => $_REQUEST['security_criteria'],
-						'user_variable_0' => $_REQUEST['user_variable_0'],
-						'user_variable_1' => $_REQUEST['user_variable_1'],
-						'user_variable_2' => $_REQUEST['user_variable_2'],
-						'user_variable_3' => $_REQUEST['user_variable_3'],
-						'user_variable_4' => $_REQUEST['user_variable_4'],
-						'user_variable_5' => $_REQUEST['user_variable_5'],
-						'created' => $_REQUEST['created'],
-						'notification_password' => $this->shop->get_option('wpsg_mod_su_noticepassword')
-					);
-					
-					$strHash = '';
-					
-					switch ($this->shop->get_option('wpsg_mod_su_hash')) {
-						
-						case 'md5':
-							$strHash = md5(implode("|", $arHash));
-							break;
-						case 'sha1':
-							$strHash = sha1(implode("|", $arHash));
-							break;
-						case 'sha256':
-							$strHash = hash("sha256", implode("|", $arHash));
-							break;
-						case 'sha512':
-							$strHash = hash("sha512", implode("|", $arHash));
-							break;
-							
-					}
-					
-					if ($strHash === $_REQUEST['hash']) {
-						
-						$this->db->ImportQuery(WPSG_TBL_OL, array(
-							"title" => __("SofortÃŒberweisung VERIFIED", 'wpsg'),
-							"cdate" => "NOW()",
-							"o_id" => wpsg_q($order['id']),
-							"mailtext" => print_r($_REQUEST, 1)
-						));
-						
-						$this->shop->setOrderStatus($order['id'], 100, true);
-                        if ($oOrder->__get('ext_payed') === '1') exit;
-						
-					} else throw new \Exception(__('Hash konnte nicht verifiziert werden.', 'wpsg'));
-					
-				} catch (\Exception $e) {
-					
+		public function wp_loaded() 
+		{ 
+			
+			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_su' && $_REQUEST['confirm'] == 'su')			
+			{
+
+				$order = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ORDER."` WHERE `id` = '".wpsg_q($_REQUEST['user_variable_2'])."'");				
+				if ($order['id'] <= 0) die();
+				
+				$arHash = array(
+					'transaction' => $_REQUEST['transaction'],
+					'user_id' => $_REQUEST['user_id'],
+					'project_id' => $_REQUEST['project_id'],
+					'sender_holder' => $_REQUEST['sender_holder'],
+					'sender_account_number' => $_REQUEST['sender_account_number'],
+					'sender_bank_code' => $_REQUEST['sender_bank_code'],
+					'sender_bank_name' => $_REQUEST['sender_bank_name'],
+					'sender_bank_bic' => $_REQUEST['sender_bank_bic'],
+					'sender_iban' => $_REQUEST['sender_iban'],
+					'sender_country_id' => $_REQUEST['sender_country_id'],
+					'recipient_holder' => $_REQUEST['recipient_holder'],
+					'recipient_account_number' => $_REQUEST['recipient_account_number'],
+					'recipient_bank_code' => $_REQUEST['recipient_bank_code'],
+					'recipient_bank_name' => $_REQUEST['recipient_bank_name'],
+					'recipient_bank_bic' => $_REQUEST['recipient_bank_bic'],
+					'recipient_iban' => $_REQUEST['recipient_iban'],
+					'recipient_country_id' => $_REQUEST['recipient_country_id'],
+					'international_transaction' => $_REQUEST['international_transaction'],
+					'amount' => number_format(wpsg_tf($order['price_gesamt']), 2, '.', ''),
+					'currency_id' => $_REQUEST['currency_id'],
+					'reason_1' => $_REQUEST['reason_1'],
+					'reason_2' => $_REQUEST['reason_2'],
+					'security_criteria' => $_REQUEST['security_criteria'],
+					'user_variable_0' => $_REQUEST['user_variable_0'],
+					'user_variable_1' => $_REQUEST['user_variable_1'],
+					'user_variable_2' => $_REQUEST['user_variable_2'],
+					'user_variable_3' => $_REQUEST['user_variable_3'],
+					'user_variable_4' => $_REQUEST['user_variable_4'],
+					'user_variable_5' => $_REQUEST['user_variable_5'],
+					'created' => $_REQUEST['created'],
+					'notification_password' => $this->shop->get_option('wpsg_mod_su_noticepassword')
+				);
+ 
+				switch ($this->shop->get_option('wpsg_mod_su_hash'))
+				{
+					case 'md5':
+						$strHash = md5(implode("|", $arHash));
+						break;
+					case 'sha1':
+						$strHash = sha1(implode("|", $arHash));
+						break;
+					case 'sha256':
+						$strHash = hash("sha256", implode("|", $arHash));
+						break;
+					case 'sha512':
+						$strHash = hash("sha512", implode("|", $arHash));
+						break;
+				}
+				
+				if ($strHash == $_REQUEST['hash'])
+				{
+
 					$this->db->ImportQuery(WPSG_TBL_OL, array(
-						"title" =>  __("SofortÃŒberweisung FAILED: ", 'wpsg').$e->getMessage(),
+						"title" => __("SofortÃŒberweisung VERIFIED", 'wpsg'),
 						"cdate" => "NOW()",
 						"o_id" => wpsg_q($order['id']),
@@ -279,4 +329,17 @@
 					));
 					
+					$this->shop->setOrderStatus($order['id'], 100, true);
+
+				}
+				else
+				{
+					
+					$this->db->ImportQuery(WPSG_TBL_OL, array(
+						"title" =>  __("SofortÃŒberweisung FAILED", 'wpsg'),
+						"cdate" => "NOW()",
+						"o_id" => wpsg_q($order['id']),
+						"mailtext" => print_r($_REQUEST, 1)
+					));
+					
 				}
 				
@@ -285,5 +348,5 @@
 			}
 		
-		} // public function template_redirect()
+		} // public function wp_loaded()
 			
 		/**
@@ -318,6 +381,4 @@
 			$subject2 = $this->shop->replaceUniversalPlatzhalter(__($this->shop->get_option('wpsg_mod_su_subject2'), 'wpsg'), $order_id);
 			
-			$oOrder = wpsg_order::getInstance($order_id);
-			
 			$arHash = array(
 				$this->shop->get_option('wpsg_mod_su_userid'), // user_id
@@ -327,5 +388,5 @@
 				"", // sender_bank_code
 				"", // sender_country_id
-				number_format(wpsg_tf($oOrder->getToPay()), 2, '.', ''), // amount
+				number_format(wpsg_tf($order['price_gesamt']), 2, '.', ''), // amount
 				$this->shop->get_option("wpsg_mod_su_currency"), // currency_id
 				$subject1, // reason_1
@@ -359,5 +420,5 @@
 				"user_id=".urlencode($this->shop->get_option('wpsg_mod_su_userid'))."&".
 				"project_id=".urlencode($this->shop->get_option('wpsg_mod_su_projectid'))."&".
-				"amount=".urlencode(number_format(wpsg_tf($oOrder->getToPay()), 2, '.', ''))."&".
+				"amount=".urlencode(number_format(wpsg_tf($order['price_gesamt']), 2, '.', ''))."&".
 				"reason_1=".urlencode($subject1)."&".
 				"reason_2=".urlencode($subject2)."&".
@@ -373,2 +434,3 @@
 	} // class wpsg_mod_su extends wpsg_mod_basic
 
+?>
Index: ds/wpsg_mod_surfaceproduct.class.php
===================================================================
--- /mods/wpsg_mod_surfaceproduct.class.php	(revision 8528)
+++ 	(revision )
@@ -1,163 +1,0 @@
-<?php
-
-	/**
-	 * Modul fÃŒr das Modul FlÃ€chenprodukt
-	 */
-	
-	class wpsg_mod_surfaceproduct extends wpsg_mod_basic
-	{
-	
-		var $lizenz = 1;
-		var $id = 5400;
-		//var $version = "9.9.9";
-		var $hilfeURL = 'http://wpshopgermany.de/?p=5729960';
-		
-		const MODE_RUNNING = 1;
-		const MODE_HEIGHTWIDE = 2;
-	
-		
-		/**
-		 * Constructor
-		 */
-		public function __construct()
-		{
-				
-			global $wpdb;
-				
-			parent::__construct();
-		
-			$this->name = __('Druckerei', 'wpsg');
-			$this->group = __('Produkte', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Integration von flÃ€chenberechneten Produkten.', 'wpsg');
-				
-		} // public function __construct()
-		
-		public function install()
-		{
-		
-			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-		
-			/**
-			 * Produkttabelle erweitern
-			 */
-			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (			  	
-				wpsg_mod_surfaceproduct_productactiv int(1) NOT NULL,
-				wpsg_mod_surfaceproduct_mode VARCHAR(255) NOT NULL,
-				wpsg_mod_surfaceproduct_mode_running VARCHAR(255) NOT NULL							
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-				
-			dbDelta($sql);
-			
-			/**
-			 * Bestelltabelle (order_products) erweitern
-			 */
-			$sql = "CREATE TABLE ".WPSG_TBL_ORDER_PRODUCTS." (
-				wpsg_mod_surfaceproduct_running_order VARCHAR (255) NOT NULL,
-				wpsg_mod_surfaceproduct_mode_length VARCHAR(255) NOT NULL,
-				wpsg_mod_surfaceproduct_mode_both VARCHAR(255) NOT NULL
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-			
-			dbDelta($sql);
-			
-			/**
-			 * Tabelle fÃŒr die FlÃ€chenProdukte
-			 */
-			$sql = "CREATE TABLE ".WPSG_TBL_SURFACEPRODUCT." (
-				id int(11) NOT NULL AUTO_INCREMENT,
-				PRIMARY KEY  (id),
-				wpsg_mod_surfaceproduct_activ int(1) DEFAULT 0 NOT NULL,
-				wpsg_mod_surfaceproduct_einheit VARCHAR(255) NOT NULL,
-				wpsg_mod_surfaceproduct_faktor VARCHAR(255) NOT NULL
-			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-				
-			dbDelta($sql);
-			
-		} // public function install()
-		
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-		
-			$product_content['wpsg_mod_surfaceproduct'] = array(
-					'title' => __('Druckerei', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml', false)
-			);
-		}
-		
-		public function settings_edit()
-		{
-		
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/settings_edit.phtml');
-		
-		}
-		
-		public function settings_save()
-		{
-
-		    $this->shop->update_option('wpsg_mod_surfaceproduct_einheit', $_REQUEST['wpsg_mod_surfaceproduct_einheit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_surfaceproduct_faktor', $_REQUEST['wpsg_mod_surfaceproduct_faktor'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-		} // public function settings_save()
-		
-		public function produkt_save_before(&$produkt_data)
-		{
-			//wpsg_debug($_REQUEST);
-			
-			$produkt_data['wpsg_mod_surfaceproduct_productactiv'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_surfaceproduct']['wpsg_mod_surfaceproduct_productactiv']));
-			$produkt_data['wpsg_mod_surfaceproduct_mode'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_surfaceproduct']['wpsg_mod_surfaceproduct_mode']));
-			$produkt_data['wpsg_mod_surfaceproduct_mode_running'] = wpsg_q(wpsg_sinput("key", $_REQUEST['wpsg_mod_surfaceproduct']['wpsg_mod_surfaceproduct_mode_running']));
-			
-			//wpsg_debug($produkt_data);
-			//die;
-			
-		} // public function settings_save()
-		
-		public function order_save(&$order_data)
-		{		  
-		 
-		  $order_data['wpsg_mod_surfaceproduct_running_order'] = wpsg_q(wpsg_xss($_REQUEST['wpsg_mod_surfaceproduct']['wpsg_mod_surfaceproduct_running_order']));
-		  $order_data['wpsg_mod_surfaceproduct_mode_length'] = wpsg_q(wpsg_xss($_REQUEST['wpsg_mod_surfaceproduct']['wpsg_mod_surfaceproduct_mode_length']));
-		  $order_data['wpsg_mod_surfaceproduct_mode_both'] = wpsg_q(wpsg_xss($_REQUEST['wpsg_mod_surfaceproduct']['wpsg_mod_surfaceproduct_mode_both']));
-		 
-		 }
-		 
-		 
-		public function renderTemplate()
-		{
-			
-			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/product.phtml');
-			
-		}
-		
-		public function mail_row($index, $produkt)
-		{
-		
-			if ($this->shop->htmlMail === true) $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/mail_row_html.phtml');
-			else $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/mail_row.phtml');
-			
-		}
-		
-		public function basket_row(&$p, $i)
-		{
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/basket_row.phtml');
-			
-		}
-		
-		public function overview_row(&$p, $i)
-		{
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_surfaceproduct/order_row.phtml');
-			
-		}
-		
-		public function wpsg_mod_export_loadFields(&$arFields)
-		{
-			
-			$arFields[10]['fields']['mod_surfaceproduct_mode_running'] = __('Laufmeter', 'wpsg');
-			$arFields[10]['fields']['mod_surfaceproduct_running_order'] = __('', 'wpsg');
-			$arFields[10]['fields']['mod_surfaceproduct_mode_length'] = __('LÃ€nge', 'wpsg');
-			$arFields[10]['fields']['mod_surfaceproduct_mode_both'] = __('Breite', 'wpsg');			
-			
-		}
-		 
-	} 
Index: ds/wpsg_mod_targo.class.php
===================================================================
--- /mods/wpsg_mod_targo.class.php	(revision 8528)
+++ 	(revision )
@@ -1,228 +1,0 @@
-<?php
-
-	/**
-	 * Dieses Modul ermÃ¶glicht die Zahlungsart "Targo"
-	 */
-	class wpsg_mod_targo extends wpsg_mod_basic
-	{
-		
-		var $lizenz = 1;
-		var $id = 17;	
-		var $version = "9.9.9";
-		var $hilfeURL = 'http://wpshopgermany.de/?p=4693700';
-
-		var $url = false; // URL zum Targo Endpunkt, wird von der init() Methode gesetzt
-		var $apiContext = false;
-		
-		const STATUS_CREDIT_ACCEPTED = 350;
-		
-		/**
-		 * Constructor
-		 */
-		public function __construct()
-		{
-			
-			parent::__construct();
-			
-			$this->name = __('Targobank', 'wpsg');
-			$this->group = __('Zahlungsarten', 'wpsg');
-			$this->desc = __('ErmÃ¶glicht die Zahlungsart Targobank.', 'wpsg');
-						
-		} // public function __construct()
-		
-		public function install()
-		{
-
-			$this->shop->checkDefault('wpsg_mod_targo_aktiv', '1');
-			$this->shop->checkDefault('wpsg_mod_targo_autostart', '1');
-			$this->shop->checkDefault('wpsg_mod_targo_summe_min', '99.00');
-			$this->shop->checkDefault('wpsg_mod_targo_summe_max', '12500.00');
-			$this->shop->checkDefault('wpsg_mod_targo_laufzeit_min', '6');
-			$this->shop->checkDefault('wpsg_mod_targo_laufzeit_max', '60');
-			$this->shop->checkDefault('wpsg_mod_targo_rate_min', '10.00');
-			$this->shop->checkDefault('wpsg_mod_targo_url_test', '');
-			$this->shop->checkDefault('wpsg_mod_targo_url_live', '');
-			$this->shop->checkDefault('wpsg_mod_targo_url_use', '0');
-			$this->shop->checkDefault('wpsg_mod_targo_koop_id', '');
-			$this->shop->checkDefault('wpsg_mod_targo_dealerid', '');
-			$this->shop->checkDefault('wpsg_mod_targo_hashkey', '');
-			$this->shop->checkDefault('wpsg_mod_targo_success', '');
-			$this->shop->checkDefault('wpsg_mod_targo_error', '');
-
-			$this->shop->checkDefault('wpsg_mod_targo_dealerShopURL', '');
-			$this->shop->checkDefault('wpsg_mod_targo_dealerAbortURL', '');
-				
-			$this->shop->checkDefault('wpsg_mod_targo_bezeichnung', 'Targobank');
-			$this->shop->checkDefault('wpsg_mod_targo_hint', 'ErmÃ¶glicht die Zahlungsabwicklung mit der Targobank');
-			$this->shop->checkDefault('wpsg_mod_targo_createwebhook', '');
-			$this->shop->checkDefault('wpsg_mod_targo_gebuehr', '');
-			$this->shop->checkDefault('wpsg_mod_targo_mwst', '');
-			$this->shop->checkDefault('wpsg_mod_targo_mwstland', '');
-				
-		} // public function install()
-		
-		public function settings_edit()
-		{
-			 
-			$pages = get_pages();
-			
-			$arPages = array(
-				'-1' => __('Neu anlegen und zuordnen', 'wpsg')
-			);
-			
-			foreach ($pages as $k => $v)
-			{
-				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
-			}
-			
-			$this->shop->view['pages'] = $arPages;
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_targo/settings_edit.phtml');
-			
-		} // public function settings_edit()
-				
-		public function settings_save()
-		{
-			
-		    $this->shop->update_option('wpsg_mod_targo_aktiv', $_REQUEST['wpsg_mod_targo_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_targo_autostart', $_REQUEST['wpsg_mod_targo_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_targo_summe_min', $_REQUEST['wpsg_mod_targo_summe_min'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_targo_summe_max', $_REQUEST['wpsg_mod_targo_summe_max'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_targo_laufzeit_min', $_REQUEST['wpsg_mod_targo_laufzeit_min'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_targo_laufzeit_max', $_REQUEST['wpsg_mod_targo_laufzeit_max'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_targo_rate_min', $_REQUEST['wpsg_mod_targo_rate_min'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_targo_url_test', $_REQUEST['wpsg_mod_targo_url_test'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_targo_url_live', $_REQUEST['wpsg_mod_targo_url_live'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_targo_url_use', $_REQUEST['wpsg_mod_targo_url_use'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_targo_koop_id', $_REQUEST['wpsg_mod_targo_koop_id'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_targo_dealerid', $_REQUEST['wpsg_mod_targo_dealerid'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_targo_hashkey', $_REQUEST['wpsg_mod_targo_hashkey'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		
-			$this->shop->update_option('wpsg_mod_targo_dealerShopURL', $_REQUEST['wpsg_mod_targo_dealerShopURL'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_targo_dealerAbortURL', $_REQUEST['wpsg_mod_targo_dealerAbortURL'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				
-			$this->shop->update_option('wpsg_mod_targo_bezeichnung', $_REQUEST['wpsg_mod_targo_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_targo_hint', $_REQUEST['wpsg_mod_targo_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			//$this->shop->update_option('wpsg_mod_targo_createwebhook', $_REQUEST['wpsg_mod_targo_createwebhook']);
-			$this->shop->update_option('wpsg_mod_targo_gebuehr', $_REQUEST['wpsg_mod_targo_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_targo_mwst', $_REQUEST['wpsg_mod_targo_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_targo_mwstland', $_REQUEST['wpsg_mod_targo_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-			//$this->shop->createPage(__('Erfolgreiche Targo Finanzierung', 'wpsg'), 'wpsg_mod_targo_success', $_REQUEST['wpsg_mod_targo_success']);
-			//$this->shop->createPage(__('Fehlgeschlagene Targo Finanzierung', 'wpsg'), 'wpsg_mod_targo_error', $_REQUEST['wpsg_mod_targo_error']);
-			
-		} // public function settings_save()
-				 
-		public function addPayment(&$arPayment) { 
-			
-			$this->shop->arStatus[self::STATUS_CREDIT_ACCEPTED] = __('Kreditvertrag angenommen', 'wpsg');
-			
-			//if (!is_admin() && $this->shop->get_option('wpsg_mod_targo_aktiv') != '1') return;
-			if (is_admin() || $this->shop->get_option('wpsg_mod_targo_aktiv') == '1') {
-				
-				$country_id = false;
-				
-				if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land'])) $country_id = $_SESSION['wpsg']['checkout']['land'];
-				
-				if ($country_id !== false) {
-					
-					$oCountry = wpsg_country::getInstance($country_id);
-				
-					if ($oCountry->getShorttext() === 'DE') {
-						
-						$arPaymentTB[$this->id] = array(
-							'id' => $this->id,
-							'name' => __($this->shop->get_option('wpsg_mod_targo_bezeichnung'), 'wpsg'),
-							'price' => $this->shop->get_option('wpsg_mod_targo_gebuehr'),
-							'tax_key' => $this->shop->get_option('wpsg_mod_targo_mwst'),
-							'mwst_null' => $this->shop->get_option('wpsg_mod_targo_mwstland'),
-							'hint' => __($this->shop->get_option('wpsg_mod_targo_hint')),
-							'logo' => $this->shop->getRessourceURL('mods/mod_targo/gfx/logo_100x25.png')
-						);
-						
-						$arPayment = wpsg_array_merge($arPaymentTB, $arPayment);
-						
-					}
-					
-				}
-												
-			}
-			
-		} // public function addPayment(&$arPayment)
-		
-		public function order_view_afterpayment(&$order_id)
-		{
-		
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_targo/order_view_afterpayment.phtml');
-		
-		} // public function order_view_sidebar(&$order_id)
-		
-		public function order_done(&$order_id, &$done_view) 
-		{ 
- 
-			// Bestellungen mit 0 geben nix aus
-			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0 || $this->shop->view['basket']['checkout']['payment'] != $this->id) return;
-			
-			$oOrder = wpsg_order::getInstance($order_id);
-							
-			$this->shop->view['targoLink'] = $this->getTargoLink($order_id);
-			$this->shop->view['o_id'] = $order_id;
-			$kid = $oOrder->k_id;
-			$this->shop->view['k_id'] = $oOrder->k_id;
-			
-			echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_targo/order_done.phtml', false);
-						
-		} // public function order_done(&$order_id)
-
-		/* Modulfunktionen */
-				
-		/**
-		 * Gibt den Link fÃŒr die Bezahlung per Targo anhand der BestellID zurÃŒck
-		 */
-		public function getTargoLink($order_id)
-		{
-
-			return	$wh_url = $this->shop->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_targo', 'dealerText', array('order_id' => $order_id, 'wert' => $order_id), false);
-		
-		} // public function getTargoLink($order_id)
-		
-				
-		public function dealerTextRedirect()
-		{
-			
-			//die("dealerTextRedirekt");
-/*
-			$empfaenger = "hartmut@maennchen1.de";
-			$betreff = "Mail-Funktion";
-			$from = "From: Name <hartmut@maennchen1.de>\n";
-			$from .= "Reply-To: hartmut@maennchen1.de\n";
-			$from .= "Content-Type: text/html\n";
-			$text = "Mail von dealerTextRedirect:_  ".print_r($_REQUEST, 1);
-			
-			mail($empfaenger, $betreff, $text, $from);
-*/						
-			//$url = "https://onlineapplication.uat.targobank.de/microsites/statustool/interface/request.asp" 
-
-			$_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
-			$_REQUEST['paid'] = wpsg_sinput("key", $_REQUEST['paid']);
-
-			$order_id = wpsg_sinput("key", $_REQUEST['order_id']);
-			// PAID speichern zu Bestellung
-			$oOrder = wpsg_order::getInstance($order_id);
-			$oOrder->setMeta('wpsg_mod_targo_paymentid', $_REQUEST['paid']);
-			
-			// Status umschalten (wpsg_ShopController->setOrderStatus($order_id, $status_id, $inform))
-			// $inform sollte false sein, sonst bekommt der Kunde eine E-Mail $status_id ist wpsg_mod_targo::STATUS_CREDIT_ACCEPTED
-			$sc = new wpsg_ShopController();
-			$sc->setOrderStatus($order_id, STATUS_CREDIT_ACCEPTED, false);
-			
-			// Log Eintrag speichern wpsg_order->log
-			// [session_id] => 1tm24iqd49c4cg1ct834bvqnp0 [paid] => 201610252052880
-			$text = 'Session-ID: '.$_REQUEST['session_id'].'  PAID: '.$_REQUEST['paid'];
-			$oOrder->log('RÃŒckantwort der Targobank', $text);
-			
-		} // public function dealerTextRedirect()
-		
-	} // class wpsg_mod_targo extends wpsg_mod_basic
-
-?>
Index: /mods/wpsg_mod_test.class.php
===================================================================
--- /mods/wpsg_mod_test.class.php	(revision 5261)
+++ /mods/wpsg_mod_test.class.php	(revision 5261)
@@ -0,0 +1,1450 @@
+<?php
+
+	/**
+	 * Modul um die Shop Funktionen zu testen
+	 * @author daniel
+	 */
+	class wpsg_mod_test extends wpsg_mod_basic
+	{
+		
+		var $id = 14;
+		var $arKeyLabel = array();
+		var $arOriginalConfig = array();
+		var $_arTableBackup = array(); 
+		
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			// Array mit den Bezeichnungen fÃŒr die Keys, damit ich die nicht immer tippen muss
+			$this->arKeyLabel = array(
+				'sum/mwst' => 'Summe Mehrwertsteuer',
+				'sum/preis_netto' => 'Summe Nettopreis vor Versand/Zahlung',
+				'sum/preis_brutto' => 'Summe Bruttopreis vor Versand/Zahlung',
+				'sum/preis' => 'Angezeigter Preis vor Versand/Zahlung',
+				'sum/preis_gesamt_netto' => 'Summe Nettopreis nach Versand/Zahlung',
+				'sum/preis_gesamt_brutto' => 'Summe Bruttopreis nach Versand/Zahlung',
+				'sum/preis_gesamt' => 'Angezeigter Preis nach Versand/Zahlung',
+				'sum/gs_netto' => 'Gutscheinwert Netto',
+				'sum/gs_brutto' => 'Gutscheinwert Brutto',
+				'sum/gs' => 'Angezeigter Gutscheinwert',				
+				'mwst/c_1/base_value' => 'Bruttobezug fÃŒr 19%',
+				'mwst/c_1/sum' => 'Mehrwertsteuer 19%',
+				'mwst/b_1/base_value' => 'Bruttobezug fÃŒr 7%',
+				'mwst/b_1/sum' => 'Mehrwertsteuer 7%'
+			);
+						
+			$this->name = __('Test', 'wpsg');
+			$this->group = __('Sonstiges', 'wpsg');
+			$this->desc = __('', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function settings_edit()
+		{
+
+			$this->shop->view['arKeyLabel'] = $this->arKeyLabel;
+			  
+			$this->saveConfig();
+						
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '1',
+				'cdate' => 'NOW()',
+				'name' => 'Produkt 7%',
+				'preis' => '107.00', 
+				'mwst_key' => 'b'									
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '2',
+				'cdate' => 'NOW()',
+				'name' => 'Produkt 19',
+				'preis' => '119.00', 
+				'mwst_key' => 'c'
+			));
+						
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '3',
+				'cdate' => 'NOW()',
+				'name' => 'Produkt 5',
+				'preis' => '3', 	
+				'mwst_key' => 'a'
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '4',
+				'cdate' => 'NOW()',
+				'name' => 'Produkt 19 (Netto definiert)',
+				'preis' => '100.00',
+				'mwst_key' => 'c'
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '5',
+				'cdate' => 'NOW()',
+				'name' => 'Produkt 19',
+				'preis' => '119.00', 
+				'mwst_key' => 'c',
+				'euleistungsortregel' => '1'
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '6',
+				'cdate' => 'NOW()',
+				'name' => 'Variantenprodukt 19',
+				'preis' => '0.00',
+				'mwst_key' => 'c',
+				'euleistungsortregel' => '1',
+				'mod_varianten' => 'a:1:{i:0;a:5:{s:4:"name";s:6:"Lizenz";s:3:"typ";s:5:"radio";s:5:"aktiv";s:1:"1";s:4:"vari";a:3:{i:0;a:6:{s:4:"name";s:5:"Light";s:5:"preis";s:5:"25.00";s:5:"aktiv";s:1:"1";s:5:"stock";s:1:"0";s:6:"weight";s:4:"0.00";s:3:"pic";s:43:",Untitled-1.jpg,Box_wpShopGermany_Light.jpg";}i:1;a:6:{s:4:"name";s:3:"Pro";s:5:"preis";s:5:"45.00";s:5:"aktiv";s:1:"1";s:5:"stock";s:1:"0";s:6:"weight";s:4:"0.00";s:3:"pic";s:41:",Untitled-1.jpg,Box_wpShopGermany_Pro.jpg";}i:2;a:6:{s:4:"name";s:10:"Enterprise";s:5:"preis";s:6:"149.00";s:5:"aktiv";s:1:"1";s:5:"stock";s:1:"0";s:6:"weight";s:4:"0.00";s:3:"pic";s:48:",Untitled-1.jpg,Box_wpShopGermany_Enterprise.jpg";}}s:4:"lang";a:0:{}}}'					
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_PRODUCTS, array(
+				'id' => '7',
+				'cdate' => 'NOW()',
+				'name' => 'Rabattprodukt',
+				'rabatt' => '1_01.01.2000_01.01.2020_24.98%',
+				'preis' => '20.00',
+				'mwst_key' => 'a',
+				'euleistungsortregel' => '0',
+				'mod_varianten' => '',
+				'basket_multiple' => '2'
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_VA, array(
+				'id' => '1',
+				'vz' => '0', 
+				'mwst_laender' => '0',
+				'mwst_key' => '0',
+				'typ' => 'w',
+				'kosten' => '4',
+				'aktiv' => '1'					
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_LAND, array(
+				'id' => '1',
+				'name' => 'Deutschland',
+				'kuerzel' => 'DE',
+				'vz' => '1',
+				'mwst' => '0',
+				'mwst_c' => '19',
+				'mwst_b' => '7'
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_LAND, array(
+				'id' => '2',
+				'name' => 'Ãsterreich',
+				'kuerzel' => 'AT',
+				'vz' => '1',
+				'mwst' => '2', // Keine MwSt. bei USt.IdNr.
+				'mwst_a' => '',
+				'mwst_b' => '10',
+				'mwst_c' => '20',
+				'mwst_d' => '12'
+			));
+			
+			$this->db->ImportQuery(WPSG_TBL_LAND, array(
+				'id' => '3',
+				'name' => 'Schweiz',
+				'kuerzel' => 'CH',
+				'vz' => '2',
+				'mwst' => '1', // Keine MwSt.
+				'mwst_c' => '',
+				'mwst_b' => ''
+			));
+			
+			$this->shop->update_option('wpsg_defaultland', '1');
+			
+			wp_cache_flush();
+			
+			$this->shop->wp_load();
+   						 			
+			if ($this->shop->hasMod('wpsg_mod_gutschein'))
+			{
+			
+				$this->test2(WPSG_BRUTTO, WPSG_BRUTTO); 
+				$this->test2(WPSG_BRUTTO, WPSG_NETTO);
+				$this->test2(WPSG_NETTO, WPSG_BRUTTO);
+				$this->test2(WPSG_NETTO, WPSG_NETTO);
+				
+				$this->test3(WPSG_BRUTTO, WPSG_BRUTTO);
+				$this->test3(WPSG_BRUTTO, WPSG_NETTO);
+				$this->test3(WPSG_NETTO, WPSG_BRUTTO);
+				$this->test3(WPSG_NETTO, WPSG_NETTO);
+				
+				$this->test4(WPSG_BRUTTO, WPSG_BRUTTO);
+				$this->test4(WPSG_BRUTTO, WPSG_NETTO);
+				$this->test4(WPSG_NETTO, WPSG_BRUTTO);
+				$this->test4(WPSG_NETTO, WPSG_NETTO);
+				
+				$this->test5();
+				$this->test6();
+				
+				if ($this->shop->hasMod('wpsg_mod_discount'))
+				{
+				
+					$this->test7();
+					
+				}
+			
+				if ($this->shop->hasMod('wpsg_mod_gutschein'))
+				{
+					
+					$this->test8();
+					
+				}
+				
+			}
+
+			$this->test9();
+			
+			$this->test10();
+			$this->test11();
+			$this->test11(true);
+			$this->test12();
+			$this->test13();
+			$this->test14();
+			$this->test15();
+			$this->test16();
+			$this->test17();
+			$this->test18();
+						 						
+			$this->restoreConfig();
+			 									
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_test/settings_edit.phtml');
+			
+		} // public function settings_edit()
+		
+		/* Tests */
+		
+		/**
+		 * Setzt die Konfiguration zurÃŒck fÃŒr einen neuen Test
+		 */
+		private function resetConfig()
+		{
+			
+			$_SESSION['wpsg'] = array();
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_debugModus', '1');
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);			
+			$this->shop->update_option('wpsg_kleinunternehmer', false);
+			$this->shop->update_option('wpsg_mod_discount_data', array());
+			
+			$time = time();
+			
+			$this->shop->update_option('wpsg_mod_varianten', $time);
+			$this->shop->update_option('wpsg_mod_gutschein', $time);
+			$this->shop->update_option('wpsg_mod_versandarten', $time);
+			
+			$this->shop->update_option('wpsg_module', base64_encode(serialize(array(
+				'wpsg_mod_varianten' => $time,
+				'wpsg_mod_gutschein' => $time,
+				'wpsg_mod_versandarten' => $time					
+			))));
+			
+			wp_cache_flush();
+			
+		} // private function resetConfig()
+		
+		/**
+		 * Speichert die Einstellungen vor den Tests
+		 */
+		public function saveConfig()
+		{
+			
+			$this->arOriginalConfig = array(
+				'wpsg_preisangaben' => $this->shop->get_option('wpsg_preisangaben'),
+				'wpsg_preisangaben_frontend' => $this->shop->getFrontendTaxview(),
+				'wpsg_kleinunternehmer' => $this->shop->get_option('wpsg_kleinunternehmer'),
+				'wpsg_mod_discount_data' => $this->shop->get_option('wpsg_mod_discount_data')
+			);
+			
+			$this->arOriginalConfig = $this->db->fetchAssoc("SELECT * FROM `wp_options` WHERE `option_name` LIKE 'wpsg_%' ");
+			
+			$this->db->Query("DELETE FROM `wp_options` WHERE `option_name` LIKE 'wpsg_%' ");			
+			wp_cache_delete('alloptions', 'options');
+									
+			// Tabllen speichern
+			$arTables = $this->db->fetchAssocField("SHOW TABLES");
+			
+			foreach ($arTables as $table_name)
+			{
+				 
+				if (preg_match('/wpsg\_(.*)/', $table_name))
+				{
+					
+					$this->_arTableBackup[$table_name] = $this->db->fetchAssoc("SELECT * FROM `".wpsg_q($table_name)."`");
+															
+				}
+				
+			}
+			
+			// Backup ist erstellt, jetzt die Tabellen leeren von denen ein Backup erstellt wurde
+			foreach ($this->_arTableBackup as $table_name => $table_data)
+			{
+		 
+				$this->db->Query("TRUNCATE TABLE `".wpsg_q($table_name)."` ");
+				
+			}
+			
+		} // public function saveConfig()
+		
+		/**
+		 * Stellt die Einstellungen nach den Tests wieder her
+		 */
+		public function restoreConfig()
+		{
+ 
+			$this->db->Query("DELETE FROM `wp_options` WHERE `option_name` LIKE 'wpsg_%' ");
+			
+			foreach ($this->arOriginalConfig as $k => $v)
+			{
+				 				
+				unset($v['option_id']);
+				$this->db->ImportQuery('wp_options', $v);
+								
+			}
+			 
+			wp_cache_delete('alloptions', 'options');
+			 
+			foreach ($this->_arTableBackup as $table_name => $table_data)
+			{
+				
+				$this->db->Query("TRUNCATE TABLE `".wpsg_q($table_name)."` ");
+				
+				foreach ($table_data as $row)
+				{
+					
+					$this->db->ImportQuery($table_name, wpsg_q($row));
+					
+				}
+								
+			}
+			
+			unset($_SESSION['wpsg']);
+						
+		} // public function restoreConfig()
+		
+		/**
+		 * Testfall 1
+		 *
+		 * 1 Produkt 19%/119â¬Brutto 
+		 * 1 Produkt 7%/107â¬Brutto
+		 * - Keine Versandarten
+		 * - Kein Gutschein
+		 * - Kein Rabatt
+		 */
+		private function test1()
+		{
+			
+			$this->resetConfig();
+			 
+			$_SESSION['wpsg']['basket'] = array(
+				0 => array(
+					'menge' => 1,
+					'id' => 1
+				),
+				1 => array(
+					'menge' => 1,
+					'id' => 2
+				)
+			);
+						
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			 
+			$this->shop->view['test'][] = array(
+				'label' => '2 Produkte/unterschiedliche MwSt / Brutto - Brutto',
+				'tests' => array(
+					'sum/mwst' => array(false, 26),
+					'sum/preis_netto' => array(false, 200),
+					'sum/preis_brutto' => array(false, 226),
+					'sum/preis' => array(false, 226),					
+					'sum/preis_gesamt_netto' => array(false, 200),
+					'sum/preis_gesamt_brutto' => array(false, 226),
+					'sum/preis_gesamt' => array(false, 226),
+					'mwst/b_1/base_value' => array(false, 107),
+					'mwst/b_1/sum' => array(false, 7),
+					'mwst/c_1/base_value' => array(false, 119),
+					'mwst/c_1/sum' => array(false, 19),
+				),
+				'array' => $basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+						 
+		} // private function test1()
+		
+		/**
+		 * Testfall 2
+		 * 
+		 * 1 Produkt 19%/119â¬Brutto
+		 * - Keine Versandarten
+		 * - 1 Gutschein Wert 10Euro
+		 * - Kein Rabatt
+		 */
+		private function test2($preisangabe_backend, $preisangabe_frontend)
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 2
+					)
+				),
+				'gs' => array(
+					'value' => 10,
+					'calc' => 'w',
+					'code' => 'Abs10',
+					'id' => 1
+				)
+			);
+
+			$this->shop->update_option('wpsg_preisangaben', $preisangabe_backend);
+			$this->shop->update_option('wpsg_preisangaben_frontend', $preisangabe_frontend);
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			if ($preisangabe_backend === WPSG_BRUTTO && $preisangabe_frontend == WPSG_BRUTTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Brutto - Brutto',
+					'tests' => array(
+						'sum/mwst' => array(false, 17.403361344538),
+						'sum/preis_netto' => array(false, 91.596638655462),
+						'sum/preis_brutto' => array(false, 109),
+						'sum/preis' => array(false, 109),		
+						'sum/preis_gesamt_netto' => array(false, 91.596638655462),
+						'sum/preis_gesamt_brutto' => array(false, 109),
+						'sum/preis_gesamt' => array(false, 109),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_BRUTTO && $preisangabe_frontend == WPSG_NETTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Brutto - Netto',
+					'tests' => array(
+						'sum/mwst' => array(false, 17.403361344538),						
+						'sum/preis_netto' => array(false, 91.596638655462),
+						'sum/preis_brutto' => array(false, 109),
+						'sum/preis' => array(false, 91.596638655462),						
+						'sum/preis_gesamt_netto' => array(false, 91.596638655462),
+						'sum/preis_gesamt_brutto' => array(false, 109),
+						'sum/preis_gesamt' => array(false, 91.596638655462),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_NETTO && $preisangabe_frontend == WPSG_BRUTTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Netto - Brutto',
+					'tests' => array(
+						'sum/mwst' => array(false, 20.71),						
+						'sum/preis_netto' => array(false, 109),
+						'sum/preis_brutto' => array(false, 129.71),
+						'sum/preis' => array(false, 129.71),						
+						'sum/preis_gesamt_netto' => array(false, 109),
+						'sum/preis_gesamt_brutto' => array(false, 129.71),
+						'sum/preis_gesamt' => array(false, 129.71),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_NETTO && $preisangabe_frontend == WPSG_NETTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Netto - Netto',
+					'tests' => array(
+						'sum/mwst' => array(false, 20.71),						
+						'sum/preis_netto' => array(false, 109),
+						'sum/preis_brutto' => array(false, 129.71),
+						'sum/preis' => array(false, 109),						
+						'sum/preis_gesamt_netto' => array(false, 109),
+						'sum/preis_gesamt_brutto' => array(false, 129.71),
+						'sum/preis_gesamt' => array(false, 109),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			
+		} // private function test2()
+		 		
+		/**
+		 * Wie test2 nur mit zwei Produkten
+		 */
+		private function test3($preisangabe_backend, $preisangabe_frontend)
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 2
+					),
+					1 => array(
+						'menge' => 1,
+						'id' => 1
+					)
+				),
+				'gs' => array(
+					'value' => 10,
+					'calc' => 'w',
+					'code' => 'Abs10',
+					'id' => 1
+				)
+			);
+
+			$this->shop->update_option('wpsg_preisangaben', $preisangabe_backend);
+			$this->shop->update_option('wpsg_preisangaben_frontend', $preisangabe_frontend);
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			if ($preisangabe_backend === WPSG_BRUTTO && $preisangabe_frontend == WPSG_BRUTTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '2 Produkte (119â¬/19% und 107â¬/7%) mit Gutschein (10â¬) / Brutto - Brutto',
+					'tests' => array(
+						'sum/mwst' => array(false, 24.849557522124),
+						'sum/preis_netto' => array(false, 191.15044247788),
+						'sum/preis_brutto' => array(false, 216),
+						'sum/preis' => array(false, 216),		
+						'sum/preis_gesamt_netto' => array(false, 191.15044247788),
+						'sum/preis_gesamt_brutto' => array(false, 216),
+						'sum/preis_gesamt' => array(false, 216),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_BRUTTO && $preisangabe_frontend == WPSG_NETTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '2 Produkte (119â¬/19% und 107â¬/7%) mit Gutschein (10â¬) / Brutto - Netto',
+					'tests' => array(
+						'sum/mwst' => array(false, 24.849557522124),
+						'sum/preis_netto' => array(false, 191.15044247788),
+						'sum/preis_brutto' => array(false, 216),
+						'sum/preis' => array(false, 191.15044247788),		
+						'sum/preis_gesamt_netto' => array(false, 191.15044247788),
+						'sum/preis_gesamt_brutto' => array(false, 216),
+						'sum/preis_gesamt' => array(false, 191.15044247788),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_NETTO && $preisangabe_frontend == WPSG_BRUTTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '2 Produkte (119â¬/19% und 107â¬/7%) mit Gutschein (10â¬) / Netto - Brutto',
+					'tests' => array(
+						'sum/mwst' => array(false, 28.736462319406),
+						'sum/preis_netto' => array(false, 216),
+						'sum/preis_brutto' => array(false, 244.73646231941),
+						'sum/preis' => array(false, 244.73646231941),		
+						'sum/preis_gesamt_netto' => array(false, 216),
+						'sum/preis_gesamt_brutto' => array(false, 244.73646231941),
+						'sum/preis_gesamt' => array(false, 244.73646231941),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_NETTO && $preisangabe_frontend == WPSG_NETTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '2 Produkte (119â¬/19% und 107â¬/7%) mit Gutschein (10â¬) / Netto - Netto',
+					'tests' => array(
+						'sum/mwst' => array(false, 28.736462319406),						
+						'sum/preis_netto' => array(false, 216),
+						'sum/preis_brutto' => array(false, 244.73646231941),
+						'sum/preis' => array(false, 216),						
+						'sum/preis_gesamt_netto' => array(false, 216),
+						'sum/preis_gesamt_brutto' => array(false, 244.73646231941),
+						'sum/preis_gesamt' => array(false, 216),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			
+		} // private function test3()
+
+		/**
+		 * Testfall 4
+		 * 
+		 * 1 Produkt 19%/119â¬Brutto
+		 * - Keine Versandarten
+		 * - 1 Gutschein Wert 10%
+		 * - Kein Rabatt
+		 */
+		private function test4($preisangabe_backend, $preisangabe_frontend)
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 2
+					)
+				),
+				'gs' => array(
+					'value' => 10,
+					'calc' => 'p',
+					'code' => 'Proz10',
+					'id' => 2
+				)
+			);
+
+			$this->shop->update_option('wpsg_preisangaben', $preisangabe_backend);
+			$this->shop->update_option('wpsg_preisangaben_frontend', $preisangabe_frontend);
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			if ($preisangabe_backend === WPSG_BRUTTO && $preisangabe_frontend == WPSG_BRUTTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10%) / Brutto - Brutto',
+					'tests' => array(
+						'sum/mwst' => array(false, 17.1),
+						'sum/preis_netto' => array(false, 90),
+						'sum/preis_brutto' => array(false, 107.1),
+						'sum/preis' => array(false, 107.1),		
+						'sum/preis_gesamt_netto' => array(false, 90),
+						'sum/preis_gesamt_brutto' => array(false, 107.1),
+						'sum/preis_gesamt' => array(false, 107.1),						
+						'sum/gs_netto' => array(false, 10),
+						'sum/gs_brutto' => array(false, 11.9),
+						'sum/gs' => array(false, 11.9)
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_BRUTTO && $preisangabe_frontend == WPSG_NETTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Brutto - Netto',
+					'tests' => array(
+						'sum/mwst' => array(false, 17.1),						
+						'sum/preis_netto' => array(false, 90),
+						'sum/preis_brutto' => array(false, 107.1),
+						'sum/preis' => array(false, 90),						
+						'sum/preis_gesamt_netto' => array(false, 90),
+						'sum/preis_gesamt_brutto' => array(false, 107.1),
+						'sum/preis_gesamt' => array(false, 90),
+						'sum/gs_netto' => array(false, 10),
+						'sum/gs_brutto' => array(false, 11.9),
+						'sum/gs' => array(false, 10)
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_NETTO && $preisangabe_frontend == WPSG_BRUTTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Netto - Brutto',
+					'tests' => array(
+						'sum/mwst' => array(false, 20.349),						
+						'sum/preis_netto' => array(false, 107.1),
+						'sum/preis_brutto' => array(false, 127.449),
+						'sum/preis' => array(false, 127.449),						
+						'sum/preis_gesamt_netto' => array(false, 107.1),
+						'sum/preis_gesamt_brutto' => array(false, 127.449),
+						'sum/preis_gesamt' => array(false, 127.449),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			else if ($preisangabe_backend === WPSG_NETTO && $preisangabe_frontend == WPSG_NETTO)
+			{
+				
+				$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Netto - Netto',
+					'tests' => array(
+						'sum/mwst' => array(false, 20.349),						
+						'sum/preis_netto' => array(false, 107.1),
+						'sum/preis_brutto' => array(false, 127.449),
+						'sum/preis' => array(false, 107.1),						
+						'sum/preis_gesamt_netto' => array(false, 107.1),
+						'sum/preis_gesamt_brutto' => array(false, 127.449),
+						'sum/preis_gesamt' => array(false, 107.1),
+					),
+					'array' => $basket->toArray(),
+					'config' => $this->showConfiguration()
+				);
+				
+			}
+			
+		} // private function test4()
+
+		/**
+		 * Testfall 5
+		 * 
+		 * 1 Produkt 19%/119â¬Brutto
+		 * - Keine Versandarten
+		 * - 1 Gutschein Wert 10Euro
+		 * - Kein Rabatt
+		 */
+		private function test5()
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 2
+					)
+				),
+				'gs' => array(
+					'value' => 10,
+					'calc' => 'w',
+					'code' => 'Wert10',
+					'id' => 1
+				)
+			);
+
+			$this->shop->update_option('wpsg_kleinunternehmer', '1');
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO); 
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '1 Produkt (119â¬/19%) mit Gutschein (10â¬) / Kleinunternehmerregelung',
+				'tests' => array(
+					'sum/mwst' => array(false, 0),
+					'sum/preis_netto' => array(false, 90),
+					'sum/preis_brutto' => array(false, 90),
+					'sum/preis' => array(false, 90),		
+					'sum/preis_gesamt_netto' => array(false, 90),
+					'sum/preis_gesamt_brutto' => array(false, 90),
+					'sum/preis_gesamt' => array(false, 90),						
+					'sum/gs_netto' => array(false, 10),
+					'sum/gs_brutto' => array(false, 10),
+					'sum/gs' => array(false, 10)
+				),
+				'array' => $basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+			
+		} // private function test5()
+		
+		/**
+		 * Testfall 6
+		 * 
+		 * 1 Produkt 19%/119â¬Brutto
+		 * - Keine Versandarten
+		 * - 1 Gutschein Wert 10%
+		 * - Kein Rabatt
+		 */
+		private function test6()
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 2
+					)
+				),
+				'gs' => array(
+					'value' => 10,
+					'calc' => 'p',
+					'code' => 'Proz10',
+					'id' => 2
+				)
+			);
+
+			$this->shop->update_option('wpsg_kleinunternehmer', '1');
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO); 
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '1 Produkt (119â¬/19%) mit Gutschein (10%) / Kleinunternehmerregelung',
+				'tests' => array(
+					'sum/mwst' => array(false, 0),
+					'sum/preis_netto' => array(false, 90),
+					'sum/preis_brutto' => array(false, 90),
+					'sum/preis' => array(false, 90),		
+					'sum/preis_gesamt_netto' => array(false, 90),
+					'sum/preis_gesamt_brutto' => array(false, 90),
+					'sum/preis_gesamt' => array(false, 90),						
+					'sum/gs_netto' => array(false, 10),
+					'sum/gs_brutto' => array(false, 10),
+					'sum/gs' => array(false, 10)
+				),
+				'array' => $basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+			
+		} // private function test6()
+		
+		/**
+		 * 
+		 * 5 Produkt 19%/119â¬Brutto
+		 * - Keine Versandarten
+		 * - 1 Gutschein Wert 10%
+		 * - 50â¬ Rabatt
+		 */
+		private function test7() 
+		{
+			
+			$this->resetConfig();
+			
+			// Rabatt konfigurieren
+			$this->shop->update_option('wpsg_mod_discount_data', unserialize('s:91:"a:2:{i:0;a:1:{s:6:"rabatt";s:1:"0";}i:1;a:2:{s:5:"value";s:3:"250";s:6:"rabatt";s:2:"50";}}";'));
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 5,
+						'id' => 2
+					)
+				),
+				'gs' => array(
+					'value' => 10,
+					'calc' => 'p',
+					'code' => 'Proz10',
+					'id' => 2
+				)
+			);
+ 
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_NETTO); 
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '5 Produkte (je 119â¬/19%) mit Gutschein (10%) und Rabatt 50â¬ / Brutto - Netto',
+				'tests' => array(
+					'sum/mwst' => array(false, 77.516806722689),
+					'sum/preis_netto' => array(false, 407.98319327731),
+					'sum/preis_brutto' => array(false, 485.5),
+					'sum/preis' => array(false, 407.98319327731),		
+					'sum/preis_gesamt_netto' => array(false, 407.98319327731),
+					'sum/preis_gesamt_brutto' => array(false, 485.5),
+					'sum/preis_gesamt' => array(false, 407.98319327731),						
+					'sum/gs_netto' => array(false, 50),
+					'sum/gs_brutto' => array(false, 59.5),
+					'sum/gs' => array(false, 50)
+				),
+				'array' => $basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+			
+		} // private function test7()
+		
+		private function test8()
+		{
+			
+			$this->resetConfig();
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_NETTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_NETTO);
+			$this->shop->update_option('wpsg_kleinunternehmer', false);
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 3
+					)
+				),
+				'gs' => array(
+					'value' => 5,
+					'calc' => 'w',
+					'code' => 'Wert10',
+					'id' => 1
+				),
+				'checkout' => array(
+					'land' => '1',
+					'shipping' => '6_1'					
+				)
+			);
+			
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '3â¬ Produkt mit 5â¬ Gutschein und 4â¬ Versandkosten',
+				'tests' => array(
+					'sum/mwst' => array(false, 0),
+					'sum/preis_netto' => array(false, 0),
+					'sum/preis_brutto' => array(false, 0),
+					'sum/preis' => array(false, 0),
+					'sum/preis_gesamt_netto' => array(false, 2),
+					'sum/preis_gesamt_brutto' => array(false, 2),
+					'sum/preis_gesamt' => array(false, 2),
+					'sum/gs_netto' => array(false, 5),
+					'sum/gs_brutto' => array(false, 5),
+					'sum/gs' => array(false, 5)
+				),
+				'array' => $basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+			
+		} // private function test8()
+		
+		private function test9()
+		{
+			
+			$arShippingGesamt = array(1,2,3,4,5);
+			 
+			$arTest1_Produkt1 = array(1);
+			$arTest1_Produkt2 = array(5,4,3);
+			$arTest1_Produkt3 = array(2,3,4);
+			$arTest1_Produkt4 = array(5);
+						
+			$arMergeTest1_1 = $this->shop->mergeShipping($arShippingGesamt, $arTest1_Produkt1);
+			$arMergeTest1_2 = $this->shop->mergeShipping($arMergeTest1_1, $arTest1_Produkt2);			
+			$arMergeTest1_3 = $this->shop->mergeShipping($arMergeTest1_2, $arTest1_Produkt3); 			
+			$arMergeTest1_4 = $this->shop->mergeShipping($arMergeTest1_3, $arTest1_Produkt4); 
+			 
+			$arTest2_Produkt1 = array(1,2);
+			$arTest2_Produkt2 = array(3,4);
+				
+			$arMergeTest2_1 = $this->shop->mergeShipping($arShippingGesamt, $arTest2_Produkt1);
+			$arMergeTest2_2 = $this->shop->mergeShipping($arMergeTest2_1, $arTest2_Produkt2);
+			 
+			$arTest3_Produkt1 = array(1);
+			$arTest3_Produkt2 = array(2);
+			$arTest3_Produkt3 = array(1,2);
+			
+			$arMergeTest3_1 = $this->shop->mergeShipping($arShippingGesamt, $arTest3_Produkt1);
+			$arMergeTest3_2 = $this->shop->mergeShipping($arMergeTest3_1, $arTest3_Produkt2);
+			$arMergeTest3_3 = $this->shop->mergeShipping($arMergeTest3_2, $arTest3_Produkt3);
+		 
+			$result = array(
+				'test1_merge1' => sizeof($arMergeTest1_1).':'.$arMergeTest1_1[0],
+				'test1_merge2' => sizeof($arMergeTest1_2).':'.implode(',', $arMergeTest1_2[0]).' '.implode(',', $arMergeTest1_2[1]).' '.implode(',', $arMergeTest1_2[2]),
+				'test1_merge3' => sizeof($arMergeTest1_3).':'.implode(',', $arMergeTest1_3[0]).' '.implode(',', $arMergeTest1_3[1]).' '.implode(',', $arMergeTest1_3[2])
+					.' '.implode(',', $arMergeTest1_3[3]).' '.implode(',', $arMergeTest1_3[4]).' '.implode(',', $arMergeTest1_3[5])
+					.' '.implode(',', $arMergeTest1_3[6]).' '.implode(',', $arMergeTest1_3[7]),
+				'test1_merge4' => sizeof($arMergeTest1_4).':'.implode(',', $arMergeTest1_4[0]).' '.implode(',', $arMergeTest1_4[1]).' '.implode(',', $arMergeTest1_4[2]),
+				'test2_merge1' => sizeof($arMergeTest2_1).':'.implode(',', $arMergeTest2_1),
+				'test2_merge2' => sizeof($arMergeTest2_2).':'.implode(',', $arMergeTest2_2[0]).' '.implode(',', $arMergeTest2_2[1]).' '.implode(',', $arMergeTest2_2[2]).' '.implode(',', $arMergeTest2_2[3]),
+				'test3_merge1' => sizeof($arMergeTest3_1).':'.implode(',', $arMergeTest3_1),
+				'test3_merge2' => sizeof($arMergeTest3_2).':'.implode(',', $arMergeTest3_2[0]),
+				'test3_merge3' => sizeof($arMergeTest3_3).':'.implode(',', $arMergeTest3_3[0])
+			);
+			
+			$this->shop->view['test'][] = array(
+				'label' => 'Test der Funktion "Merge Versandarten"',
+				'tests' => array(
+					'test1_merge1' => array('Test1 nach Merge1 mit Produkt1', '1:1'),
+					'test1_merge2' => array('Test1 nach Merge2 mit Produkt2', '3:1,5 1,4 1,3'),						
+					'test1_merge3' => array('Test1 nach Merge3 mit Produkt3', '8:1,5,2 1,5,3 1,5,4 1,4,2 1,4,3 1,4 1,3,2 1,3'),
+					'test1_merge4' => array('Test1 nach Merge4 mit Produkt4', '3:1,5,2 1,5,3 1,5,4'),
+					'test2_merge1' => array('Test2 nach Merge1 mit Produkt1', '2:1,2'),
+					'test2_merge2' => array('Test2 nach Merge2 mit Produkt2', '4:1,3 1,4 2,3 2,4'),
+					'test3_merge1' => array('Test3 nach Merge1 mit Produkt1', '1:1'), 
+					'test3_merge2' => array('Test3 nach Merge2 mit Produkt2', '1:1,2'),
+					'test3_merge3' => array('Test3 nach Merge3 mit Produkt3', '1:1,2'),
+				),
+				'array' => $result
+			);
+			
+			
+		}
+		
+		function test10()
+		{
+
+			$this->resetConfig();
+			
+			$_SESSION['wpsg']['basket'] = array(
+				0 => array(
+					'menge' => 1,
+					'id' => 1
+				),
+				1 => array(
+					'menge' => 1,
+					'id' => 2
+				)
+			);
+			$_SESSION['wpsg']['checkout']['land'] = 3;
+				 
+			$basket = new wpsg_basket();
+			$basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '2 Produkte/unterschiedliche MwSt / Brutto - Brutto / Schweiz mit "Keine MwSt."',
+				'tests' => array(
+					'sum/mwst' => array(false, 0),
+					'sum/preis_netto' => array(false, 200),
+					'sum/preis_brutto' => array(false, 200),
+					'sum/preis' => array(false, 200),
+					'sum/preis_gesamt_netto' => array(false, 200),
+					'sum/preis_gesamt_brutto' => array(false, 200),
+					'sum/preis_gesamt' => array(false, 200)					
+				),
+				'array' => $basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+		
+		}
+		
+		function test11($ust = false)
+		{
+		
+			$this->resetConfig();
+				
+			$_SESSION['wpsg']['basket'] = array(
+				0 => array(
+					'menge' => 1,
+					'id' => 1
+				),
+				1 => array(
+					'menge' => 1,
+					'id' => 2
+				)
+			);
+			$_SESSION['wpsg']['checkout']['land'] = 2;
+			
+			if ($ust === true) $_SESSION['wpsg']['checkout']['ustidnr'] = 'AT1234';
+				
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+				
+			$this->shop->view['test'][] = array(
+				'label' => '2 Produkte/unterschiedliche MwSt / Brutto - Brutto / Ãsterreich mit "Keine MwSt. bei UStIdNr." '.(($ust === true)?'(UStIdNr. gesetzt)':''),
+				'tests' => array(
+					'sum/mwst' => array(false, (($ust == true)?0:26)),
+					'sum/preis_netto' => array(false, (($ust == true)?200:200)),
+					'sum/preis_brutto' => array(false, (($ust == true)?200:226)),
+					'sum/preis' => array(false, (($ust == true)?200:226)),
+					'sum/preis_gesamt_netto' => array(false, (($ust == true)?200:200)),
+					'sum/preis_gesamt_brutto' => array(false, (($ust == true)?200:226)),
+					'sum/preis_gesamt' => array(false, (($ust == true)?200:226))
+				),
+				'array' => $this->shop->basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+		
+		}
+		
+		public function test12()
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 4
+					), 
+				),
+				'checkout' => array(
+					'shipping' => '6_1',
+					'land' => '1'	
+				)
+			);
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_NETTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+			
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (100 + 19%) MwSt / Netto - Brutto / 4,- Netto Versand',
+					'tests' => array(
+							'sum/mwst' => array(false, 19.76),
+							'sum/preis_netto' => array(false, 100),
+							'sum/preis_brutto' => array(false, 119),
+							'sum/preis' => array(false, 119),
+							'sum/preis_gesamt_netto' => array(false, 104),
+							'sum/preis_gesamt_brutto' => array(false, 123.76),
+							'sum/preis_gesamt' => array(false, 123.76)
+					),
+					'array' => $this->shop->basket->toArray(),
+					'config' => $this->showConfiguration()
+			);
+			
+		}
+		
+		public function test13()
+		{
+				
+			$this->resetConfig();
+				
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 2
+					),
+				),
+				'checkout' => array(
+					'shipping' => '6_1',
+					'land' => '1'
+				)
+			);
+				
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+				
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+				
+			$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119) / Brutto - Brutto / 4,- Brutto Versand',
+					'tests' => array(
+							'sum/mwst' => array(false, 19.638655462185),
+							'sum/preis_netto' => array(false, 100),
+							'sum/preis_brutto' => array(false, 119),
+							'sum/preis' => array(false, 119),
+							'sum/preis_gesamt_netto' => array(false, 103.36134453782),
+							'sum/preis_gesamt_brutto' => array(false, 123),
+							'sum/preis_gesamt' => array(false, 123)
+					),
+					'array' => $this->shop->basket->toArray(),
+					'config' => $this->showConfiguration()
+			);
+				
+		}
+		
+		public function test14()
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 5
+					),
+				),
+				'checkout' => array(
+					'shipping' => '6_1',
+					'land' => '2'
+				)
+			);
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+			
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '1 Produkt (119 mit Leistungsort) / Brutto - Brutto / 4,- Brutto Versand -> Versand nach AT (20% MwSt. statt 19%)',
+				'tests' => array(
+					'sum/mwst' => array(false, 20.672268907563),
+					'sum/preis_netto' => array(false, 100),
+					'sum/preis_brutto' => array(false, 120),
+					'sum/preis' => array(false, 120),
+					'sum/preis_gesamt_netto' => array(false, 103.36134453782),
+					'sum/preis_gesamt_brutto' => array(false, 124.03361344538),
+					'sum/preis_gesamt' => array(false, 124.03361344538)
+				),
+				'array' => $this->shop->basket->toArray(),
+				'config' => $this->showConfiguration()
+			);
+			
+		}
+		
+		public function test15() 
+		{
+			
+			$this->resetConfig();
+			
+			$_SESSION['wpsg'] = array(
+				'basket' => array(
+					0 => array(
+						'menge' => 1,
+						'id' => 'vp_6/0_2'
+					),
+				),
+				'checkout' => array( 
+					'land' => '2'
+				)
+			);
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+			
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+				'label' => '1 Variantenprodukt (149 mit Leistungsort) / Brutto - Brutto / -> Versand nach AT (20% MwSt. statt 19%)',
+				'tests' => array(
+					'sum/mwst' => array(false, 25.04),
+					'sum/preis_netto' => array(false, 125.21),
+					'sum/preis_brutto' => array(false, 150.25),
+					'sum/preis' => array(false, 150.25),
+					'sum/preis_gesamt_netto' => array(false, 125.21),
+					'sum/preis_gesamt_brutto' => array(false, 150.25),
+					'sum/preis_gesamt' => array(false, 150.25)
+				),
+				'array' => $this->shop->basket->toArray(),
+				'config' => $this->showConfiguration()
+			); 
+			
+		}
+		
+		public function test16() 
+		{
+			
+			$this->resetConfig();
+				
+			$_SESSION['wpsg'] = array(
+					'basket' => array(
+							0 => array(
+									'menge' => 1,
+									'id' => '2'
+							),
+					),
+					'checkout' => array(
+							'land' => '2'
+					)
+			);
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+				
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+			
+			$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119) / Brutto - Brutto / -> Versand nach AT (19% MwSt.)',
+					'tests' => array(
+							'sum/mwst' => array(false, 19),
+							'sum/preis_netto' => array(false, 100),
+							'sum/preis_brutto' => array(false, 119),
+							'sum/preis' => array(false, 119),
+							'sum/preis_gesamt_netto' => array(false, 100),
+							'sum/preis_gesamt_brutto' => array(false, 119),
+							'sum/preis_gesamt' => array(false, 119)
+					),
+					'array' => $this->shop->basket->toArray(),
+					'config' => $this->showConfiguration()
+			);
+			
+		}
+		
+		public function test17()
+		{
+				
+			$this->resetConfig();
+		
+			$_SESSION['wpsg'] = array(
+					'basket' => array(
+							0 => array(
+									'menge' => 1,
+									'id' => '5'
+							),
+					),
+					'checkout' => array(
+							'land' => '2'
+					)
+			);
+				
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+		
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+				
+			$this->shop->view['test'][] = array(
+					'label' => '1 Produkt (119 mit Leistungsort) / Brutto - Brutto / -> Versand nach AT (20% MwSt., da Leistungsort)',
+					'tests' => array(
+							'sum/mwst' => array(false, 20),
+							'sum/preis_netto' => array(false, 100),
+							'sum/preis_brutto' => array(false, 120),
+							'sum/preis' => array(false, 120),
+							'sum/preis_gesamt_netto' => array(false, 100),
+							'sum/preis_gesamt_brutto' => array(false, 120),
+							'sum/preis_gesamt' => array(false, 120)
+					),
+					'array' => $this->shop->basket->toArray(),
+					'config' => $this->showConfiguration()
+			);
+				
+		}
+
+		public function test18()
+		{
+		
+			$this->resetConfig();
+		
+			$_SESSION['wpsg'] = array(
+					'basket' => array(
+							0 => array(
+									'menge' => 1,
+									'id' => '7'
+							),
+							1 => array(
+									'menge' => 1,
+									'id' => '7'
+							),
+							2 => array(
+									'menge' => 1,
+									'id' => '7'
+							),
+					),
+					'checkout' => array(
+							'land' => '2'
+					)
+			);
+		
+			$this->shop->update_option('wpsg_mod_discount', time());
+			$this->shop->update_option('wpsg_mod_discount_productdiscount', '1');
+			
+			$this->shop->update_option('wpsg_preisangaben', WPSG_BRUTTO);
+			$this->shop->update_option('wpsg_preisangaben_frontend', WPSG_BRUTTO);
+		
+			$this->shop->basket = new wpsg_basket();
+			$this->shop->basket->initFromSession();
+		
+			$this->shop->view['test'][] = array(
+					'label' => '3 x das gleiche Produkt mit Rabatt fÃŒr Test Rundungen (Rabatt muÃ aktiv sein)',
+					'tests' => array(
+							'sum/mwst' => array(false, 0),
+							'sum/preis_netto' => array(false, 45),
+							'sum/preis_brutto' => array(false, 45),
+							'sum/preis' => array(false, 45),
+							'sum/preis_gesamt_netto' => array(false, 45),
+							'sum/preis_gesamt_brutto' => array(false, 45),
+							'sum/preis_gesamt' => array(false, 45)
+					),
+					'array' => $this->shop->basket->toArray(),
+					'config' => $this->showConfiguration()
+			);
+		
+		}
+		
+		/**
+		 * Zeigt wichtige Einstellungen an, die fÃŒr den Test sinnvoll sind
+		 */
+		public function showConfiguration()
+		{
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_test/showConfiguration.phtml', false);
+			
+		} // public function showConfiguration()
+		
+		/**
+		 * Gibt true zurck wenn der gesamte Test erfolgreich war
+		 * @param unknown_type $test
+		 */
+		public function checkTest($test)
+		{
+						
+			foreach ($test['tests'] as $key => $t)
+			{
+				
+				$bTest = $this->checkValue($key, $t[1], $test['array']);
+				if ($bTest === false) return false;
+				
+			}
+			
+			return true;
+			
+		} // public function checkTest($test)
+		
+		/**
+		 * PrÃŒft einen einzelnen Wert in einem Array
+		 * key kann dabei die Syntax: sum/mwst haben und greift dann auf $array['sum']['mwst'] zu um den Wert zu ermitteln
+		 */
+		public function checkValue($key, $value, $array)
+		{
+			
+			return $this->checkEqual($this->getValue($key, $array), $value);
+			
+		} // public function checkValue($key, $array)
+		
+		/**
+		 * Gibt einen Wert aus dem Array zurÃŒck anhand des key
+		 */
+		public function getValue($key, $array)
+		{
+			
+			$arKeys = wpsg_trim(explode('/', $key));
+			
+			foreach ($arKeys as $k)
+			{
+				
+				$array = $array[$k];
+				
+			}
+			
+			return $array;
+			
+		} // public function getValue($key, $array)
+		
+		/**
+		 * PrÃŒft zwei Werte ob sie gleich sind
+		 */
+		public function checkEqual($value1, $value2)
+		{
+			
+			if (strval($value1) == strval($value2)) return true;
+			
+			return false;
+			
+		} // public function checkEqual($value1, $value2)
+		 
+	} // class wpsg_mod_test extends wpsg_mod_basic
+
+?>
Index: ds/wpsg_mod_ticket.class.php
===================================================================
--- /mods/wpsg_mod_ticket.class.php	(revision 8528)
+++ 	(revision )
@@ -1,238 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 22.08.24
-	 * @time: 11:13
-	 */
-	 
-	class wpsg_mod_ticket extends \wpsg_mod_basic {
-		
-		private static bool $init = false;
-		
-		var $lizenz = 1;
-		var $id = 5502;
-		var $hilfeURL = '';
-		var $version = "9.9.9";
-		var $free = false;
-		
-		public function __construct() {
-			
-			parent::__construct();
-			
-			$this->name = __('Ticketprodukte', 'wpsg');
-			$this->group = __('Produkte', 'wpsg');
-			$this->desc = __('', 'wpsg');
-			
-		}
-		
-		public function init(): void {
-			
-			global $wpdb;
-			
-			if (self::$init === false) {
-				
-				define('WPSG_TBL_TICKETS', $wpdb->prefix.'wpsg_tickets');
-				define('WPSG_TBL_TICKET_TEMPLATES', $wpdb->prefix.'wpsg_ticket_templates');
-				
-				\spl_autoload_register(function($class_name) {
-
-					$arPath = explode('\\', $class_name);
-			
-					if ($arPath[0] === 'wpsgTicket') {
-			
-						$file_path = implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_ticket', 'classes', ucfirst($arPath[1]).'.php']);
-						
-						if (file_exists($file_path)) {
-			
-							require_once($file_path);
-			
-						} else {
-							
-							throw new \Exception(wpsg_translate(__('Klasse #1# fÃŒr TicketProdukt Modul nicht gefunden.', 'wpsg'), $file_path));
-							
-						}
-			
-					}
-			
-				} );
-	 
-				\add_action('wp_ajax_wpsg_ticket', ['\wpsgTicket\Ajax', 'backend']);
-				\add_action('wp_ajax_wpsg_ticket_frontend', ['\wpsgTicket\Ajax', 'frontend']);
-				\add_action('wp_ajax_nopriv_wpsg_ticket_frontend', ['\wpsgTicket\Ajax', 'frontend']);
-				
-				\add_action('wpsg_produkt_edit', ['\wpsgTicket\Action', 'wpsg_produkt_edit']);
-				\add_action('wpsg_product_addedit_content', ['wpsgTicket\Action', 'wpsg_product_addedit_content']);
-				\add_action('wpsg_renderProdukt_templateSelect', ['\wpsgTicket\Action', 'wpsg_renderProdukt_templateSelect']);
-				\add_action('wpsg_basket_row', ['\wpsgTicket\Action', 'wpsg_basket_row']);
-				\add_action('wpsg_overview_row', ['\wpsgTicket\Action', 'wpsg_overview_row']);
-				\add_action('wpsg_calculation_saveProduct_after', ['\wpsgTicket\Action', 'wpsg_calculation_saveProduct_after']);
-				\add_action('wpsg_setOrderStatus', ['\wpsgTicket\Action', 'setOrderStatus']);
-				\add_action('wpsg_basket_updateProduktFromSession', ['\wpsgTicket\Action', 'basket_updateProduktFromSession']);
-				\add_action('wpsg_calculation_addProduct', ['\wpsgTicket\Action', 'wpsg_calculation_addProduct']);
-				\add_action('wpsg_order_view_row', ['\wpsgTicket\Action', 'wpsg_order_view_row']);
-				\add_action('wpsg_admin_emailconf', ['\wpsgTicket\Action', 'wpsg_admin_emailconf']);
-				\add_action('wpsg_admin_emailconf_save', ['\wpsgTicket\Action', 'wpsg_admin_emailconf_save']);
-				\add_action('wpsg_order_view', ['\wpsgTicket\Action', 'order_view']);
-				\add_action('admin_menu', ['\wpsgTicket\Action', 'admin_menu']);
-				
-				\add_action('wp_enqueue_scripts', function() {
- 
-				
-					
-				});
-				\add_action('admin_enqueue_scripts', function() {
-				
-					if (($_REQUEST['page']??'') === 'wpsg-Produkt') {
-						
-						\wp_enqueue_style('vanilla-calendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css');
-						\wp_enqueue_style('light-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css');
-						\wp_enqueue_style('dark-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css');
-						
-					}
-				
-				});
-				\add_action('wp_footer', function() {
-					
-					if (\wpsgTicket\TicketProduct::$enqueTicket === true) {
-						
-						\wp_enqueue_style('vanilla-calendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css');
-						\wp_enqueue_style('light-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css');
-						\wp_enqueue_style('dark-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css');
-						\wp_enqueue_style('wpsg_ticket-frontend', WPSG_URL.'mods/mod_ticket/assets/css/wpsg_ticket.css');
-						\wp_enqueue_style('wpsg_ticket-calendar', WPSG_URL.'mods/mod_ticket/assets/css/wpsg_calendar.css');
-						
-						\wp_enqueue_script('vanilla-calendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.js', array(), '', true);
-						\wp_enqueue_script('wpsg_vue3', WPSG_URL.'mods/mod_ticket/assets/js/vue3.3.6.global.js', array(), '', true);
-						\wp_enqueue_script('wpsg_ticket-frontend', WPSG_URL.'mods/mod_ticket//assets/js/wpsg_ticket_frontend.js', ['wpsg_vue3', 'vanilla-calendar'], '', true);
-						
-						\wp_enqueue_script('wpsg_ticket_fullcalendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/index.global.min.js', [], '1.0', true);
-					 	\wp_enqueue_script('wpsg_ticket_fullcalendar_de', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/locales-all.global.min.js', [], '1.0', true);
-						
-					}
-					
-				});
-				
-				if (!\wp_next_scheduled('wpsg_ticket_daily')) {
-
-					\wp_schedule_event(time(), 'daily', 'wpsg_ticket_daily');
-			
-				}
-				
-				\add_action('wpsg_ticket_daily', ['\wpsgTicket\Action', 'cronDaily']);
-				
-				self::$init = true;
-				
-			}
-			
-		}
-		
-		public function settings_edit(): void {
-		
-			$font_path = WPSG_PATH_LIB.'FPDF_1.81/font/';
-
-	        $arFontFiles = scandir($font_path);
-
-	        foreach ($arFontFiles as $k => $v) {
-
-	            $file = $font_path.$v;
-
-	            if (is_file($file) && file_exists($file) && preg_match('/(.*)\.php$/i', $v)) {
-
-	                $this->shop->view['arFonts'][$v] = ucfirst(preg_replace('/\.php$/i', '', $v));
-
-	            }
-
-	        }
-			
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ticket/settings_edit.phtml');
-		
-		}
-		
-		public function settings_save(): void {
-		
-		}
-		
-		public function install(): void {
-			
-			global $wpdb;
-			
-			$charset_collate = $wpdb->get_charset_collate();
-			
-			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_tickets (
-				id INT NOT NULL AUTO_INCREMENT,
-				label VARCHAR(500) DEFAULT '' NOT NULL,
-				label_short VARCHAR(500) DEFAULT '' NOT NULL,
-				p_id INT NOT NULL,
-				from_date DATE,
-				from_time TIME,
-				to_date DATE,
-				to_time TIME,
-				slots INT,
-				state INT DEFAULT 0,
-				autoticket TEXT DEFAULT NULL,
-				autoticket_id INT(11) DEFAULT 0 NULL,
-				PRIMARY KEY  (id),
-				KEY autoticket_id (autoticket_id),
-				KEY p_id (p_id)
-			) $charset_collate;";
-			
-			require_once(ABSPATH.'wp-admin/includes/upgrade.php');
-
-			dbDelta($sql);
-			
-			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_templates (
-				id INT NOT NULL AUTO_INCREMENT,
-				config BLOB,
-				template_name VARCHAR(500) NOT NULL DEFAULT '',
-				defaulttemplate INT(1) NOT NULL DEFAULT 0,
-				deleted INT NOT NULL DEFAULT 0,
-				PRIMARY KEY  (id)
-			) $charset_collate;";
-			
-			dbDelta($sql);
-			
-			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_booking (
-				id INT NOT NULL AUTO_INCREMENT,
-				booking_key VARCHAR(255) NOT NULL,
-				order_id INT NOT NULL,
-				order_product_id INT NOT NULL,
-				product_id INT NOT NULL,
-				ticket_id INT NOT NULL,
-				amount_index INT NOT NULL,
-				revoke_user INT(11) NULL DEFAULT NULL,
-				revoke_time DATETIME NULL DEFAULT NULL,
-				send_user INT(11) NOT NULL DEFAULT 0,
-				send_time DATETIME NULL DEFAULT NULL,
-				PRIMARY KEY  (id),
-				KEY booking_key (booking_key),
-				KEY order_id (order_id),
-				KEY order_product_id (order_product_id),
-				KEY product_id (product_id),
-				KEY ticket_id (ticket_id),
-				KEY amount_index (amount_index)
-			) $charset_collate;";
-			
-			dbDelta($sql);
-			
-			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_log (
-				id INT NOT NULL AUTO_INCREMENT,
-				booking_id INT(11) NOT NULL,
-				user_id INT(11) NOT NULL,
-				date_time DATETIME NOT NULL,
-				log INT(11) NOT NULL,
-				PRIMARY KEY  (id),
-				KEY booking_id (booking_id)
-			) $charset_collate;";
-			
-			dbDelta($sql);
-			
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_ticket_orderstate_active', '100,110');
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_ticket_orderstate_send', '100');
-			\wpsg_ShopController::getShop()->checkDefault('wpsg_ticketmail_betreff', 'Ihre Tickets');
-			
-		}
-		
-	}
Index: /mods/wpsg_mod_topseller.class.php
===================================================================
--- /mods/wpsg_mod_topseller.class.php	(revision 8528)
+++ /mods/wpsg_mod_topseller.class.php	(revision 5261)
@@ -10,5 +10,6 @@
 		var $lizenz = 1;
 		var $id = 1950;
-
+		var $hilfeURL = 'http://wpshopgermany.maennchen1.de/?p=3583';
+		
 		public function __construct()
 		{
@@ -55,27 +56,26 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_topseller_auto', $_REQUEST['wpsg_mod_topseller_auto'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_topseller_limit', $_REQUEST['wpsg_mod_topseller_limit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_topseller_template', $_REQUEST['wpsg_mod_topseller_template'], false, false, WPSG_SANITIZE_INT);
+			
+			$this->shop->update_option('wpsg_mod_topseller_auto', $_REQUEST['wpsg_mod_topseller_auto']);
+			$this->shop->update_option('wpsg_mod_topseller_limit', $_REQUEST['wpsg_mod_topseller_limit']);
+			$this->shop->update_option('wpsg_mod_topseller_template', $_REQUEST['wpsg_mod_topseller_template']);
 			
 		} // public function settings_save()
-		
-		public function product_addedit_content(&$product_content, &$product_data)
-		{
-		
+
+		public function produkt_edit_allgemein(&$produkt_data) 
+		{ 
+			
 			if (isset($_REQUEST['wpsg_lang'])) return;
 			
-			$this->shop->view['wpsg_mod_topseller']['status'] = wpsg_getStr($product_data['wpsg_mod_topseller']);
+			$this->shop->view['wpsg_mod_topseller']['status'] = $produkt_data['wpsg_mod_topseller'];
 			
-			$this->shop->view['wpsg_mod_topseller']['data'] = $product_data;
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_topseller/produkt_edit_allgemein.phtml');			
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
 		
-			$product_content['general']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_topseller/produkt_addedit_allgemein.phtml', false);			
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
-		
-		public function produkt_save_before(&$produkt_data) {
+		public function produkt_save_before(&$produkt_data)
+		{ 
 			
-			wpsg_checkRequest('wpsg_mod_topseller', [WPSG_SANITIZE_CHECKBOX], __('Topseller Status'), $produkt_data, $_REQUEST['wpsg_mod_topseller']['status']);
+			$produkt_data['wpsg_mod_topseller'] = wpsg_tf($_REQUEST['wpsg_mod_topseller']['status']);
 			
 		} // public function produkt_save_before(&$produkt_data)
@@ -87,11 +87,13 @@
 			
 		} // public function init()
+		
+		public function load() 
+		{ 
 
-		public function widgets_init() {
-
-			require_once(dirname(__FILE__).'/mod_topseller/wpsg_mod_topseller_widget.class.php'); return register_widget("wpsg_mod_topseller_widget");
-
-		}
-
+			require_once(dirname(__FILE__).'/mod_topseller/wpsg_mod_topseller_widget.class.php');
+			add_action('widgets_init', create_function('', 'return register_widget("wpsg_mod_topseller_widget");'));
+			
+		} // public function load()
+		
 		/** Modulfunktionen */
 		
Index: /mods/wpsg_mod_trustedshops.class.php
===================================================================
--- /mods/wpsg_mod_trustedshops.class.php	(revision 8528)
+++ /mods/wpsg_mod_trustedshops.class.php	(revision 5261)
@@ -26,6 +26,6 @@
 			$this->desc = __('ErmÃ¶glicht die Integration von Trusted Shops.', 'wpsg');
 			
-			$this->cache_file = $this->shop->getPublicDir().'trusted_shops_siegel.gif';
-			$this->cache_url = $this->shop->getPublicDir(true).'trusted_shops_siegel.gif';
+			$this->cache_file = $this->shop->getTempDir().'trusted_shops_siegel.gif';
+			$this->cache_url = $this->shop->getTempDir(true).'trusted_shops_siegel.gif';
 			
 		} // public function __construct();
@@ -176,56 +176,44 @@
 			if (!wpsg_isSizedInt($this->shop->get_option('wpsg_mod_trustedshops_reminder'))) return;
 			
-			try
-			{
-			
-				// Wenn keine Elemente, dann keine Meldung
-				$expdata = $this->getExportData();
-				if (!wpsg_isSizedArray($expdata)) return;
-				
-				$current_timestamp = $this->db->fetchOne("SELECT UNIX_TIMESTAMP()");
-				$last_export = $this->shop->get_option('wpsg_mod_trustedshops_lastExport');
-				if ($last_export === false) $last_export = $current_timestamp;
-		 
-				$days_lastExport = floor(($current_timestamp - $last_export) / (60 * 60 * 24));
-				
-				if ($days_lastExport > $this->shop->get_option('wpsg_mod_trustedshops_reminderDays') || $days_lastExport === 0.0)
-				{
-					
-					if ($last_export == $current_timestamp)
-					{
-						
-						$message = wpsg_translate(
-							'nohspc_'.__('Sie haben noch keinen Review Collector-Export gemacht. <a href="#1#">Jetzt starten.</a>', 'wpsg'),						
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops'
-						);
-						
-					}
-					else
-					{
-					
-						$message = wpsg_translate(
-							'nohspc_'.__('Sie haben seit #1# Tagen keinen Review Collector-Export gemacht. <a href="#2#">Jetzt starten.</a>', 'wpsg'), 
-							$days_lastExport,
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops'
-						);
-						
-					}
-					
-					$message .= '<p style="float:right;">'.wpsg_translate(
-						__('<a href="#1#">Klicken Sie hier, um die Meldung auszublenden.</a>', 'wpsg'),
-						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops&noheader=1&do=hideMessage&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
-					).'</p><div class="wpsg_clearer"></div><br />';
-					
-					$this->shop->addBackendError($message, 'wpsg_mod_trustedshops_notice', false);
-					
-				} 
+			// Wenn keine Elemente, dann keine Meldung
+			if (!wpsg_isSizedArray($this->getExportData())) return;
+			
+			$current_timestamp = $this->db->fetchOne("SELECT UNIX_TIMESTAMP()");
+			$last_export = $this->shop->get_option('wpsg_mod_trustedshops_lastExport');
+			if ($last_export === false) $last_export = $current_timestamp;
+	 
+			$days_lastExport = floor(($current_timestamp - $last_export) / (60 * 60 * 24));
+			
+			if ($days_lastExport > $this->shop->get_option('wpsg_mod_trustedshops_reminderDays') || $days_lastExport === 0.0)
+			{
+				
+				if ($last_export == $current_timestamp)
+				{
+					
+					$message = wpsg_translate(
+						'nohspc_'.__('Sie haben noch keinen Review Collector-Export gemacht. <a href="#1#">Jetzt starten.</a>', 'wpsg'),						
+						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops'
+					);
+					
+				}
+				else
+				{
+				
+					$message = wpsg_translate(
+						'nohspc_'.__('Sie haben seit #1# Tagen keinen Review Collector-Export gemacht. <a href="#2#">Jetzt starten.</a>', 'wpsg'), 
+						$days_lastExport,
+						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops'
+					);
+					
+				}
+				
+				$message .= '<p style="float:right;">'.wpsg_translate(
+					__('<a href="#1#">Klicken Sie hier, um die Meldung auszublenden.</a>', 'wpsg'),
+					WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops&noheader=1&do=hideMessage&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
+				).'</p><div class="wpsg_clearer"></div><br />';
+				
+				$this->shop->addBackendError($message, 'wpsg_mod_trustedshops_notice', false);
 				
 			} 
-			catch (\wpsg\Exception $e)
-			{
-			
-				// Nichts machen, kann bei fehlenden DB Spalten passieren
-				
-			}
 			
 		}
@@ -233,36 +221,34 @@
 		public function settings_save()
 		{
-
-			foreach($_REQUEST['wpsg_mod_trustedshops_state'] as $k => $v) $_REQUEST['wpsg_mod_trustedshops_state'][$k] = wpsg_sinput(WPSG_SANITIZE_APIKEY, $v);
-
-			$this->shop->update_option('wpsg_mod_trustedshops_shopid', $_REQUEST['wpsg_mod_trustedshops_shopid'], false, false, WPSG_SANITIZE_APIKEY);
-			
-			$this->shop->update_option('wpsg_mod_trustedshops_siegelcache', $_REQUEST['wpsg_mod_trustedshops_siegelcache'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_trustedshops_siegeltitle', $_REQUEST['wpsg_mod_trustedshops_siegeltitle'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_trustedshops_siegeltitle', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_trustedshops_siegeltitle']) ?: $this->shop->get_option('wpsg_mod_trustedshops_siegeltitle'));
-			$this->shop->update_option('wpsg_mod_trustedshops_customerset', $_REQUEST['wpsg_mod_trustedshops_customerset'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_trustedshops_customerset_preset', $_REQUEST['wpsg_mod_trustedshops_customerset_preset'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_trustedshops_warranty', $_REQUEST['wpsg_mod_trustedshops_warranty'], false, false, WPSG_SANITIZE_APIKEY);
-			
-			$this->shop->update_option('wpsg_mod_trustedshops_orderdone', $_REQUEST['wpsg_mod_trustedshops_orderdone'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_trustedshops_orderdonetitle', $_REQUEST['wpsg_mod_trustedshops_orderdonetitle'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_trustedshops_orderdonetitle', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_trustedshops_orderdonetitle']) ?: $this->shop->get_option('wpsg_mod_trustedshops_orderdonetitle'));
-			$this->shop->update_option('wpsg_mod_trustedshops_orderdonelogo', $_REQUEST['wpsg_mod_trustedshops_orderdonelogo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_trustedshops_customermail', $_REQUEST['wpsg_mod_trustedshops_customermail'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_trustedshops_customermailtitle', $_REQUEST['wpsg_mod_trustedshops_customermailtitle'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->addTranslationString('wpsg_mod_trustedshops_customermailtitle', wpsg_sanitize(WPSG_SANITIZE_TEXTFIELD, $_REQUEST['wpsg_mod_trustedshops_customermailtitle']) ?: $this->shop->get_option('wpsg_mod_trustedshops_customermailtitle'));
+			
+			$this->shop->update_option('wpsg_mod_trustedshops_shopid', $_REQUEST['wpsg_mod_trustedshops_shopid']);
+			
+			$this->shop->update_option('wpsg_mod_trustedshops_siegelcache', $_REQUEST['wpsg_mod_trustedshops_siegelcache']);
+			$this->shop->update_option('wpsg_mod_trustedshops_siegeltitle', $_REQUEST['wpsg_mod_trustedshops_siegeltitle']);
+			$this->shop->addTranslationString('wpsg_mod_trustedshops_siegeltitle', $_REQUEST['wpsg_mod_trustedshops_siegeltitle']);
+			$this->shop->update_option('wpsg_mod_trustedshops_customerset', $_REQUEST['wpsg_mod_trustedshops_customerset']);
+			$this->shop->update_option('wpsg_mod_trustedshops_customerset_preset', $_REQUEST['wpsg_mod_trustedshops_customerset_preset']);			
+			$this->shop->update_option('wpsg_mod_trustedshops_warranty', $_REQUEST['wpsg_mod_trustedshops_warranty']);
+			
+			$this->shop->update_option('wpsg_mod_trustedshops_orderdone', $_REQUEST['wpsg_mod_trustedshops_orderdone']);
+			$this->shop->update_option('wpsg_mod_trustedshops_orderdonetitle', $_REQUEST['wpsg_mod_trustedshops_orderdonetitle']);
+			$this->shop->addTranslationString('wpsg_mod_trustedshops_orderdonetitle', $_REQUEST['wpsg_mod_trustedshops_orderdonetitle']);
+			$this->shop->update_option('wpsg_mod_trustedshops_orderdonelogo', $_REQUEST['wpsg_mod_trustedshops_orderdonelogo']);
+			
+			$this->shop->update_option('wpsg_mod_trustedshops_customermail', $_REQUEST['wpsg_mod_trustedshops_customermail']);
+			$this->shop->update_option('wpsg_mod_trustedshops_customermailtitle', $_REQUEST['wpsg_mod_trustedshops_customermailtitle']);
+			$this->shop->addTranslationString('wpsg_mod_trustedshops_customermailtitle', $_REQUEST['wpsg_mod_trustedshops_customermailtitle']);
 			
 			if ($this->shop->hasMod('wpsg_mod_rechnungen')) 
 			{
 				
-				$this->shop->update_option('wpsg_mod_trustedshops_invoicemail', $_REQUEST['wpsg_mod_trustedshops_invoicemail'], false, false, WPSG_SANITIZE_APIKEY);
-				$this->shop->update_option('wpsg_mod_trustedshops_invoicemailtitle', $_REQUEST['wpsg_mod_trustedshops_invoicemailtitle'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				$this->shop->addTranslationString('wpsg_mod_trustedshops_invoicemailtitle', $_REQUEST['wpsg_mod_trustedshops_invoicemailtitle'], false, false, WPSG_SANITIZE_TEXTFIELD);
-				
-			}
-			
-			$this->shop->update_option('wpsg_mod_trustedshops_reminder', $_REQUEST['wpsg_mod_trustedshops_reminder'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_trustedshops_reminderDays', $_REQUEST['wpsg_mod_trustedshops_reminderDays'], false, false, WPSG_SANITIZE_APIKEY);
+				$this->shop->update_option('wpsg_mod_trustedshops_invoicemail', $_REQUEST['wpsg_mod_trustedshops_invoicemail']);
+				$this->shop->update_option('wpsg_mod_trustedshops_invoicemailtitle', $_REQUEST['wpsg_mod_trustedshops_invoicemailtitle']);
+				$this->shop->addTranslationString('wpsg_mod_trustedshops_invoicemailtitle', $_REQUEST['wpsg_mod_trustedshops_invoicemailtitle']);
+				
+			}
+			
+			$this->shop->update_option('wpsg_mod_trustedshops_reminder', $_REQUEST['wpsg_mod_trustedshops_reminder']);
+			$this->shop->update_option('wpsg_mod_trustedshops_reminderDays', $_REQUEST['wpsg_mod_trustedshops_reminderDays']);
 			$this->shop->update_option('wpsg_mod_trustedshops_state', $_REQUEST['wpsg_mod_trustedshops_state']);
 			
@@ -287,21 +273,20 @@
 		} // public function clearSession()
 		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) {
-			
-			if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['wpsg_mod_trustedshops_set'])) {
-				
-				$db_data['wpsg_mod_trustedshops_set'] = '1';
-				
-			}
-			
-		}
-		 
-		public function order_view($order_id, &$arSidebarArray)
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) 
 		{ 
-
-			$arSidebarArray[$this->id] = array(
-				'title' => $this->name,
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_trustedshops/order_view_sidebar.phtml', false)
-			);
+			
+			if ($arBasket['checkout']['wpsg_mod_trustedshops_set'] == '1')
+			{
+
+				$data['wpsg_mod_trustedshops_set'] = '1';
+				
+			}
+			
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
+		public function order_view_sidebar(&$order_id) 
+		{ 
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_trustedshops/order_view_sidebar.phtml');
 			
 		} // public function order_view_sidebar(&$order_id)
@@ -357,15 +342,15 @@
 		} // public function be_ajax()
 		
-		public function widgets_init() {
-			
-			require_once(dirname(__FILE__).'/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php'); return register_widget("wpsg_mod_trustedshops_widget");
+		public function load()
+		{
+			
+			require_once(dirname(__FILE__).'/mod_trustedshops/wpsg_mod_trustedshops_widget.class.php');
+			add_action('widgets_init', create_function('', 'return register_widget("wpsg_mod_trustedshops_widget");'));
 			
 		} // public function load()
 		
 		public function order_ajax() 
-		{
-
-			$_REQUEST['edit_id'] = wpsg_sinput("key", $_REQUEST['edit_id']);
-
+		{ 
+			
 			if ($_REQUEST['do'] == 'mail')
 			{
@@ -379,5 +364,5 @@
 				{
 					
-					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_trustedshops/mail_html.phtml', false);
+					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_trustedshops/mail_html.phtml');
 					
 				}
@@ -446,10 +431,8 @@
 			$strQuery = "
 				SELECT
-					O.`onr`, 
-					K.`email`, A.`vname`, A.`name`
+					K.`email`, O.`onr`, K.`vname`, K.`name`
 				FROM
 					`".WPSG_TBL_ORDER."` AS O
 						LEFT JOIN `".WPSG_TBL_KU."` AS K ON (K.`id` = O.`k_id`)
-						LEFT JOIN `".WPSG_TBL_ADRESS."` AS A ON (A.`id` = K.`adress_id`)
 				WHERE
 					O.`wpsg_mod_trustedshops_set` = '1' AND
@@ -515,5 +498,5 @@
  				$timestamp = filemtime($this->cache_file);
  
- 				if (time() - $timestamp < $this->cache_timeout) 
+ 				if (mktime() - $timestamp < $this->cache_timeout) 
  				{
  					
Index: /mods/wpsg_mod_userpayment.class.php
===================================================================
--- /mods/wpsg_mod_userpayment.class.php	(revision 8528)
+++ /mods/wpsg_mod_userpayment.class.php	(revision 5261)
@@ -62,7 +62,5 @@
 		public function be_ajax()
 		{
-
-			$_REQUEST['zv_id'] = wpsg_sinput("key", $_REQUEST['zv_id']);
-
+			
 			if ($_REQUEST['do'] == 'add')
 			{
@@ -91,10 +89,10 @@
 				
 			}
-			else if ($_REQUEST['do'] == 'inlinedit') {
-
-				if ($_REQUEST['field'] == 'name') {
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
+			else if ($_REQUEST['do'] == 'inlinedit')
+			{
+				
+				if ($_REQUEST['field'] == 'name')
+				{
+					
 					$this->db->UpdateQuery(WPSG_TBL_ZV, array(
 						'name' => wpsg_q($_REQUEST['value'])
@@ -103,10 +101,10 @@
 					$this->shop->addTranslationString('wpsg_mod_userpayment_'.$_REQUEST['zv_id'], $_REQUEST['value']);
 					
-					die(wpsg_hspc($_REQUEST['value']));
-					
-				} else if ($_REQUEST['field'] == 'hint') {
-
-					$_REQUEST['value'] = wpsg_sinput("text_field", $_REQUEST['value']);
-
+					die($_REQUEST['value']);
+					
+				} 
+				else if ($_REQUEST['field'] == 'hint')
+				{
+					
 					$this->db->UpdateQuery(WPSG_TBL_ZV, array(
 						'hint' => wpsg_q($_REQUEST['value'])
@@ -115,10 +113,10 @@
 					$this->shop->addTranslationString('wpsg_mod_userpayment_hint_'.$_REQUEST['zv_id'], $_REQUEST['value']);
 					
-					die(wpsg_hspc($_REQUEST['value']));
-					
-				} else if ($_REQUEST['field'] == 'mwst_key') {
-
-					$_REQUEST['value'] = wpsg_sinput("key", $_REQUEST['value']);
-
+					die($_REQUEST['value']);
+					
+				}
+				else if ($_REQUEST['field'] == 'mwst_key')
+				{
+					
 					$this->db->UpdateQuery(WPSG_TBL_ZV, array(
 						'mwst_key' => wpsg_q($_REQUEST['value'])
@@ -128,8 +126,8 @@
 					die(wpsg_hspc($tax_groups[$_REQUEST['value']]));
 					
-				} else if ($_REQUEST['field'] == 'mwst_laender') {
-
-					$_REQUEST['value'] = wpsg_sinput("key", $_REQUEST['value']);
-
+				}
+				else if ($_REQUEST['field'] == 'mwst_laender')
+				{
+				
 					$this->db->UpdateQuery(WPSG_TBL_ZV, array(
 						'mwst_laender' => wpsg_q($_REQUEST['value'])
@@ -138,8 +136,8 @@
 					die();
 					
-				} else if ($_REQUEST['field'] == 'rabgeb') {
-
-					if (!wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_FLOAT, ['allowEmpty' => true])) throw \wpsg\Exception::getInvalidValueException();
-
+				}
+				else if ($_REQUEST['field'] == 'rabgeb')
+				{
+					
 					$this->db->UpdateQuery(WPSG_TBL_ZV, array(
 						'rabgeb' => wpsg_q($_REQUEST['value'])
@@ -148,8 +146,8 @@
 					die(wpsg_ff($_REQUEST['value']));
 					
-				} else if ($_REQUEST['field'] == 'aktiv') {
-
-					$_REQUEST['value'] = intval($_REQUEST['value']);
-
+				}
+				else if ($_REQUEST['field'] == 'aktiv')
+				{
+					
 					$this->db->UpdateQuery(WPSG_TBL_ZV, array(
 						'aktiv' => wpsg_q($_REQUEST['value'])
@@ -164,13 +162,25 @@
 		} // public function be_ajax()
 				
-		public function addPayment(&$arPayment) { 
-			
+		public function addPayment(&$arPayment) 
+		{ 
+
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+
+				$arBasket = $this->shop->basket->toArray();
+				
+			}
+			
+			// Im Checkout2 wird der Wert berechnet und eventuell nicht verfÃŒgbare ZV ausgeschlossen
 			$arZV = $this->db->fetchAssoc("
 				SELECT * FROM `".WPSG_TBL_ZV."` ORDER BY `name` ASC
 			");
 				  
-			foreach ((array)$arZV as $zv) {
+			foreach ((array)$arZV as $zv)
+			{
 				
 				if (!is_admin() && $zv['aktiv'] != '1') continue;
+				
+				$mwst_value = $this->getTaxValue($zv['mwst_key'], $this->shop->getDefaultCountry());
 				
 				$hint = $zv['hint'];
@@ -178,17 +188,87 @@
 				$arPayment[$this->id.'_'.$zv['id']] = array(
 					'id' => $this->id.'_'.$zv['id'],
-					'active' => $zv['aktiv'],
 					'name' => __($zv['name'], 'wpsg'),
 					'hint' => __($hint, 'wpsg'),
-					'price' => $zv['rabgeb'],
-					'tax_key' => $zv['mwst_key'],
+					'preis' => $zv['rabgeb'],
+					'mwst_key' => $zv['mwst_key'],
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $zv['mwst_laender'],
-					'deleted' => wpsg_getInt($zv['deleted'])
+					'deleted' => $zv['deleted']
 				);	
+				
+				if (isset($_REQUEST['wpsg_checkout2']))
+				{
+				
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+					{
+							
+						$payment_netto = $this->getPreis($zv['rabgeb'], $arBasket['sum']['preis']); 
+						$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+							
+					}
+					else
+					{
+													
+						$payment_brutto = $this->getPreis($zv['rabgeb'], $arBasket['sum']['preis']);																							
+						$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+							
+					}
+					 
+					// Entsprechenden Preis anzeigen
+					if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+					{
+						
+						$arPayment[$this->id.'_'.$zv['id']]['price'] = $payment_netto;
+						
+					}
+					else 
+					{
+						
+						$arPayment[$this->id.'_'.$zv['id']]['price'] = $payment_brutto;
+						
+					} 
+					
+				}
+				
+			}
+			
+		} // public function addPayment(&$arPayment)
+		
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if (preg_match('/'.$this->id.'_\d+/', $arBasket['checkout']['payment']))
+			{
+			
+				$zv = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_ZV."` WHERE `id` = '".wpsg_q(preg_replace('/^\d*_/', '', $arBasket['checkout']['payment']))."'");
+
+				$payment_price = $this->getPreis($zv['rabgeb'], $arBasket['sum']['preis']);
+				
+				if ($va['mwst_akt'] != '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $zv['mwst_key']);
+
+				}
 								
 			}
 			
-		} // public function addPayment(&$arPayment)
-				
+		} // public function calcPayment(&$arBasket) 
+		
 		/* ---- */
 				
Index: /mods/wpsg_mod_varianten.class.php
===================================================================
--- /mods/wpsg_mod_varianten.class.php	(revision 5261)
+++ /mods/wpsg_mod_varianten.class.php	(revision 5261)
@@ -0,0 +1,1763 @@
+<?php
+
+	/**
+	 * Dieses Modul erlaubt verschiedene Produktvariationen
+	 */
+	class wpsg_mod_varianten extends wpsg_mod_basic
+	{
+		
+		var $cache_variData;
+		
+		var $lizenz = 1;
+		var $id = 98;
+		var $hilfeURL = 'http://wpshopgermany.de/?p=1057';
+						
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('Varianten', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht verschiedene Produktvariationen.', 'wpsg');
+
+			$this->cache_variData = array();
+			
+		} // public function __construct()
+		
+		public function install()
+		{
+			
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+
+			/**
+			 * Produkttabelle erweitern
+			 */
+			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
+			  	mod_varianten mediumtext NOT NULL
+			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			
+			dbDelta($sql);
+			
+			$this->shop->checkDefault('wpsg_vp_imageselect_width', 25);
+			$this->shop->checkDefault('wpsg_vp_imageselect_height', 25);
+			$this->shop->checkDefault('wpsg_vp_imageselect_mode', 'cz');
+			
+		} // public function install()
+		
+		public function wp_loaded()
+		{
+			
+			if (wpsg_isSizedString($_REQUEST['action'], 'wpsg_varianten_switch'))
+			{
+				
+				if (wpsg_isSizedInt($_REQUEST['wpsg_post_id']))
+				{
+					
+					global $post;
+					$post = get_post($_REQUEST['wpsg_post_id']);
+										
+				}
+				
+				$product_key = $_REQUEST['product_key'];
+				$product_id = $this->shop->getProduktId($product_key);
+				
+				$product_data = $this->shop->loadProduktArray($product_id, array(
+					'id' => $product_key, 
+					'menge' => $_REQUEST['quantity'],
+					'referer' => $_REQUEST['referer']
+				));				
+				 
+				// Damit das Div die gleiche Index Id bekommt
+				$GLOBALS['wpsg_produkt_index'] = $_REQUEST['product_index'] - 1;
+				
+				$this->shop->noReleatedProducts = true;
+								
+				if (wpsg_isSizedString($_REQUEST['template'])) $template = $_REQUEST['template'];
+				else $template = false;
+				
+				die($this->shop->renderProdukt($product_data, $template));
+								
+			}
+			
+		} // public function wp_loaded()
+		
+		public function loadProduktArray(&$produkt_data) 
+		{
+	 
+			if (!$this->isVariantsProductKey($produkt_data['id'])) return;
+			 
+			$arVari = $this->loadVarianten($this->shop->getProduktId($produkt_data['id']));
+			$product_id = $this->shop->getProduktId($produkt_data['id']);
+			
+			$produkt_data['preis_original'] = $produkt_data['preis'];
+			
+			$mwst_value = $this->shop->getCalcTaxValue($produkt_data['mwst_key']); 
+			 
+			/* Gesamtpreis */
+			if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO) $preis = $produkt_data['preis_defaultLand_netto'];
+			else $preis = $produkt_data['preis_defaultLand_brutto']; 
+				
+			$arVarSelected = $this->getSetVariArray($produkt_data['id']);
+			$arVarDatabase = $this->loadVarianten($this->shop->getProduktId($produkt_data['id']), true);
+					
+			foreach ($arVarSelected as $var => $vari)
+			{
+					
+				
+				if ($arVarDatabase[$var]['typ'] == 'checkbox' && $vari == '1')
+				{
+		
+					// Aktivierte Checkbox
+					$preis += wpsg_tf($arVarDatabase[$var]['preis']);
+								
+				}
+				else
+				{
+		 
+					// Select, Radio
+					$preis += wpsg_tf($arVarDatabase[$var]['vari'][$vari]['preis']);
+		
+				}
+					
+			}
+			
+			// Preis umrechnen fÃŒr Standardland
+			if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO)
+			{
+				
+				// Preisangaben im Backend in Netto -> Brutto berechnen
+				$produkt_data['preis_brutto'] = wpsg_calculatePreis($preis, WPSG_BRUTTO, $mwst_value);
+				$produkt_data['preis_netto'] = $preis;
+				
+			}
+			else
+			{
+				
+				// Preis im Backend ist in Brutto
+				$produkt_data['preis_brutto'] = $preis;
+				$produkt_data['preis_netto'] = wpsg_calculatePreis($preis, WPSG_NETTO, $mwst_value);
+				
+			}
+
+			$produkt_data['preis_defaultLand_brutto'] = $produkt_data['preis_brutto'];
+			$produkt_data['preis_defaultLand_netto'] = $produkt_data['preis_netto'];
+			
+			// Jetzt habe ich Netto/Brutto Werte im Standardland
+			// Wenn es jetzt ein Leistungsort Produkt ist, dann muss ich die Steuer des Ziellandes bestimmen
+			if (wpsg_isSizedInt($produkt_data['euleistungsortregel']) && $this->shop->getDefaultCountry(true) != $this->shop->getFrontendCountry(true))
+			{
+			
+				$oFrontendCountry = $this->shop->getFrontendCountry();
+			
+				$produkt_data['mwst_value'] = $oFrontendCountry->getTax($produkt_data['mwst_key']);
+				$produkt_data['preis_brutto'] = wpsg_calculatePreis($produkt_data['preis_netto'], WPSG_BRUTTO, $produkt_data['mwst_value']);
+			
+			}
+			 
+			if ($this->shop->getFrontendTaxview() == WPSG_BRUTTO) $produkt_data['preis'] = $produkt_data['preis_brutto'];
+			else $produkt_data['preis'] = $produkt_data['preis_netto'];
+						
+			// Mindest- und Maximalpreis hinzufÃŒgen			
+			$bMinPrice = wpsg_tf($produkt_data['preis_original']);
+			$bMaxPrice = wpsg_tf($produkt_data['preis_original']);
+			 
+			if ($this->shop->hasMod('wpsg_mod_weight'))
+			{
+				
+				$bMinWeight = wpsg_tf($produkt_data['weight']);
+				$bMaxWeight = wpsg_tf($produkt_data['weight']);
+				
+			}
+			
+			foreach ($arVari as $k => $v)
+			{
+
+				if ($v['aktiv'] == '1')
+				{
+				 
+					if ($v['typ'] == 'checkbox')
+					{
+						
+						// Hier muss ich beim Min Preis nix tun, wenn nicht angehakt dann wird nix addiert
+						$bMaxPrice += wpsg_tf($v['preis']);
+						
+						if ($this->shop->hasMod('wpsg_mod_weight'))
+						{
+							
+							!isset ($v['weight']) or $bMaxWeight += wpsg_tf($v['weight']);
+							
+						}
+						
+						// Preis der Variante an die Ausgabe im Frontend anpassen
+						// if ($this->shop->getFrontendTaxview() == WPSG_NETTO && $this->shop->getBackendTaxview() == WPSG_BRUTTO) $arVari[$k]['preis'] = wpsg_calculatePreis($v['preis'], WPSG_NETTO, $mwst_value);
+						
+					}
+					else
+					{	
+							
+						$bMinPriceVari = false;
+						$bMaxPriceVari = false;
+						
+						if ($this->shop->hasMod('wpsg_mod_weight'))
+						{
+							
+							$bMinWeightVari = false;
+							$bMaxWeightVari = false;
+							
+						}
+						
+						foreach ($v['vari'] as $k2 => $v2)
+						{
+							
+							if ($v2['aktiv'] == '1')
+							{
+								
+								if ($bMinPriceVari === false || wpsg_tf($v2['preis']) < $bMinPriceVari) $bMinPriceVari = wpsg_tf($v2['preis']);
+								if ($bMaxPriceVari === false || wpsg_tf($v2['preis']) > $bMaxPriceVari) $bMaxPriceVari = wpsg_tf($v2['preis']);
+								
+								if ($this->shop->hasMod('wpsg_mod_weight'))
+								{
+									
+									if ($bMinWeightVari === false || !isset ($v['weight']) or wpsg_tf($v2['weight']) < $bMinWeightVari) $bMinWeightVari = !isset ($v['weight']) or wpsg_tf($v2['weight']);
+									if ($bMaxWeightVari === false || !isset ($v['weight']) or wpsg_tf($v2['weight']) > $bMaxWeightVari) $bMaxWeightVari = !isset ($v['weight']) or wpsg_tf($v2['weight']);
+									
+								}
+								
+							}
+							
+							// Preis der Variante an die Ausgabe im Frontend anpassen
+							// if ($this->shop->getFrontendTaxview() == WPSG_NETTO && $this->shop->getBackendTaxview() == WPSG_BRUTTO) $arVari[$k]['vari'][$k2]['preis'] = wpsg_calculatePreis($v2['preis'], WPSG_NETTO, $mwst_value);
+														
+						}
+
+						if ($bMinPriceVari !== false) $bMinPrice += $bMinPriceVari;
+						if ($bMaxPriceVari !== false) $bMaxPrice += $bMaxPriceVari;
+						
+						if ($this->shop->hasMod('wpsg_mod_weight'))
+						{
+							
+							if ($bMinWeightVari !== false) $bMinWeight += $bMinWeightVari;
+							if ($bMaxWeightVari !== false) $bMaxWeight += $bMaxWeightVari;
+							
+						}						
+						
+					}
+					
+				}
+				
+			}
+			 
+			$produkt_data['min_preis'] = wpsg_tf($bMinPrice);
+			$produkt_data['max_preis'] = wpsg_tf($bMaxPrice);
+			
+			if ($this->shop->hasMod('wpsg_mod_weight'))
+			{
+				
+				$produkt_data['min_weight'] = wpsg_tf($bMinWeight);
+				$produkt_data['max_weight'] = wpsg_tf($bMaxWeight);
+				
+			}
+			
+			/* Eventuell Variantenbild */
+			if ($this->shop->hasMod('wpsg_mod_produktbilder'))
+			{
+				
+				$arImages = $this->getKombiVariImages($produkt_data['id']);
+				
+				if (wpsg_isSizedArray($arImages))
+				{
+					
+					$image = $arImages[array_rand($arImages)];
+					
+					$produkt_data['varianten_image'] = $image;
+					
+				}
+				
+			}
+			
+		} // public function loadProduktArray(&$produkt_data) 
+		
+		public function produkt_ajax()
+		{
+			
+			//error_reporting(E_ALL);
+			
+			if (isset($_REQUEST['cmd']) && $_REQUEST['cmd'] == 'wpsg_vp_add')
+			{
+				 
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				$data = array(
+					"name" => $_REQUEST['name'],
+					"typ" => $_REQUEST['typ'],
+					"aktiv" => "1"
+				);
+				
+				if ($_REQUEST['typ'] == "checkbox")
+				{
+					$data['preis'] = "0";
+				}
+				else
+				{
+					$data['vari'] = array();
+				}
+				
+				$vp_data[] = $data;
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				
+				$this->shop->view['message'] = array(0, __("Variante erfolgreich angelegt.", "wpsg"));
+				
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'wpsg_var_reorder')
+			{
+				
+				parse_str($_REQUEST['wpsg_reorder'], $wpsg_reorder);
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				$vp_data_neu = array();
+				 				
+				foreach ($wpsg_reorder['variante'] as $order)
+				{
+					
+					if (array_key_exists($order, $vp_data))
+					{
+						
+						$vp_data_neu[] = $vp_data[$order];
+						unset($vp_data[$order]);
+						
+					}
+					else
+					{
+						
+						$this->shop->throwErrorCode('98_1');
+						
+					}
+					
+				}
+				
+				if (wpsg_isSizedArray($vp_data))
+				{
+						
+					$this->shop->throwErrorCode('98_2');
+						
+				}
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data_neu);
+												
+				$this->shop->view['message'] = array(0, __('Variantenreihenfolge gespeichert.', 'wpsg'));
+				
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'wpsg_vari_reorder')
+			{
+				
+				parse_str($_REQUEST['wpsg_reorder'], $wpsg_reorder);
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				 
+				foreach ($wpsg_reorder as $var_key => $order)
+				{
+					
+					$var_id = preg_replace('/^variorder\_/', '', $var_key);
+					   
+					wpsg_array_reorder($vp_data[$var_id]['vari'], $order);
+					
+					if (wpsg_isSizedArray($vp_data[$var_id]['lang']))
+					{
+						
+						foreach ($vp_data[$var_id]['lang'] as $lang_key => $lang_vari)
+						{
+							
+							wpsg_array_reorder($vp_data[$var_id]['lang'][$lang_key]['vari'], $order);
+							
+						}
+						
+					}
+					
+				}
+
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				
+				$this->shop->view['message'] = array(0, __("Variationenreihenfolge gespeichert.", "wpsg"));
+				
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'wpsg_vp_refreh')
+			{
+				
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == "wpsg_vp_del")
+			{
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				unset($vp_data[$_REQUEST['var_id']]);
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				
+				$this->shop->view['message'] = array(0, __("Variante wurde erfolgreich gelÃ¶scht.", "wpsg"));				
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == "wpsg_vp_deaktiv")
+			{
+ 	
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				if ($_REQUEST['status'] == "1")
+				{
+					
+					$vp_data[$_REQUEST['var_id']]['aktiv'] = 1;
+					$this->shop->view['message'] = array(0, __("Variante wurde erfolgreich aktiviert.", "wpsg"));
+						
+				}
+				else
+				{
+					
+					$vp_data[$_REQUEST['var_id']]['aktiv'] = 0;
+					$this->shop->view['message'] = array(0, __("Variante wurde erfolgreich deaktiviert.", "wpsg"));
+					
+				}
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data); 				
+				die($this->drawVarianten($_REQUEST['edit_id']));				
+				
+			}
+			else if ($_REQUEST['cmd'] == "wpsg_vp_addVariation")
+			{
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				$vp_data[$_REQUEST['var_id']]['vari'][] = array(
+					"name" => $_REQUEST['vari_name'],
+					"preis" => wpsg_tf($_REQUEST['vari_preis']),
+					"aktiv" => "1"
+				);
+				
+				$this->shop->view['message'] = array(0, __("Variation wurde erfolgreich angelegt.", "wpsg"));
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == "wpsg_vp_vari_del")
+			{
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				unset($vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]);				
+				
+				if (wpsg_isSizedArray($vp_data[$_REQUEST['var_id']]['lang']))
+				{
+						
+					foreach ($vp_data[$_REQUEST['var_id']]['lang'] as $lang_key => $lang_vari)						
+					{
+						
+						unset($vp_data[$_REQUEST['var_id']]['lang'][$lang_key]['vari'][$_REQUEST['vari_id']]);
+						
+					}
+			
+				}
+				
+				$this->shop->view['message'] = array(0, __("Variation wurde erfolgreich gelÃ¶scht.", "wpsg"));
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == "wpsg_vp_vari_deaktiv")
+			{
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				if ($_REQUEST['status'] == "1")
+				{
+					
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['aktiv'] = 1;
+					$this->shop->view['message'] = array(0, __("Variation wurde erfolgreich aktiviert.", "wpsg"));
+						
+				}
+				else
+				{
+					
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['aktiv'] = 0;
+					$this->shop->view['message'] = array(0, __("Variation wurde erfolgreich deaktiviert.", "wpsg"));
+					
+				}
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				die($this->drawVarianten($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'wpsg_var_setImageOrder')
+			{
+				
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				if ($_REQUEST['vari_id'] == -1)
+				{
+					
+					$vp_data[$_REQUEST['var_id']]['picOrder'] = $_REQUEST['wpsg_reorder'];
+					
+				}
+				else 
+				{
+				
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['picOrder'] = $_REQUEST['wpsg_reorder'];
+					
+				}
+				 
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				
+				die("1");
+				
+			}
+			else if ($_REQUEST['cmd'] == 'wpsg_vp_vari_setPic')
+			{
+								
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				
+				if ($_REQUEST['vari_id'] >= 0)
+				{
+					
+					$arPic = explode(",", $vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['pic']);
+					
+					if (in_array($_REQUEST['pic'], $arPic))
+					{
+						unset($arPic[array_search($_REQUEST['pic'], $arPic)]);
+					}
+					else
+					{
+						$arPic[] = $_REQUEST['pic'];
+					}
+					
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['pic'] = implode(",", $arPic);
+					
+				}
+				else
+				{
+					
+					$arPic = explode(",", $vp_data[$_REQUEST['var_id']]['pic']);
+					
+					if (in_array($_REQUEST['pic'], $arPic))
+					{
+						unset($arPic[array_search($_REQUEST['pic'], $arPic)]);
+					}
+					else
+					{
+						$arPic[] = $_REQUEST['pic'];
+					}
+					
+					$vp_data[$_REQUEST['var_id']]['pic'] = implode(",", $arPic);
+						
+				}
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				
+				die("1");
+				
+			}
+			else if ($_REQUEST['cmd'] == 'wpsg_vp_vari_inlineEdit')
+			{
+				
+								
+				$vp_data = $this->loadVarianten($_REQUEST['edit_id']);
+				$product_data = $this->shop->cache->loadProduct($_REQUEST['edit_id']);
+				 
+				if ($_REQUEST['typ'] == "vari_name") 
+				{
+					
+					if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+					{
+						$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['vari'][$_REQUEST['vari_id']]['name'] = wpsg_q($_REQUEST['value']);	
+					}
+					else
+					{					
+						$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['name'] = wpsg_q($_REQUEST['value']);
+					}
+					
+				}				
+				else if ($_REQUEST['typ'] == "vari_artnr") 
+				{
+					
+					if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+					{
+						$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['vari'][$_REQUEST['vari_id']]['artnr'] = wpsg_q($_REQUEST['value']);	
+					}
+					else
+					{
+						$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['artnr'] = wpsg_q($_REQUEST['value']);
+					}
+					
+				}
+				else if ($_REQUEST['typ'] == "vari_preis")
+				{
+					
+					$_REQUEST['value'] = wpsg_tf($_REQUEST['value']);
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['preis'] = $_REQUEST['value'];
+					$_REQUEST['value'] = wpsg_ff($_REQUEST['value'], $this->shop->get_option('wpsg_currency'));
+					
+				}
+				else if ($_REQUEST['typ'] == "vari_fmenge")
+				{
+						
+					$arFeinheiten = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
+					
+					$_REQUEST['value'] = wpsg_ff(wpsg_tf($_REQUEST['value']), $arFeinheiten[$product_data['feinheit']]);
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['fmenge'] = wpsg_tf($_REQUEST['value']);
+						
+				}
+				else if ($_REQUEST['typ'] == "vari_weight")
+				{
+					
+					$_REQUEST['value'] = wpsg_tf($_REQUEST['value']);
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['weight'] = $_REQUEST['value'];
+										
+				}
+				else if ($_REQUEST['typ'] == "vari_stock")
+				{
+		 
+					$_REQUEST['value'] = intval($_REQUEST['value']);
+					$vp_data[$_REQUEST['var_id']]['vari'][$_REQUEST['vari_id']]['stock'] = $_REQUEST['value'];
+		 			
+				}
+				else if ($_REQUEST['typ'] == "var_name")
+				{
+					
+					if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+					{
+						$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['name'] = $_REQUEST['value'];	
+					}
+					else
+					{
+						$vp_data[$_REQUEST['var_id']]['name'] = $_REQUEST['value'];
+					}
+						
+				}
+				else if ($_REQUEST['typ'] == "var_preis")
+				{
+					
+					$_REQUEST['value'] = wpsg_tf($_REQUEST['value']);
+					$vp_data[$_REQUEST['var_id']]['preis'] = $_REQUEST['value'];
+					$_REQUEST['value'] = wpsg_ff($_REQUEST['value'], $this->shop->get_option('wpsg_currency'));
+					
+				}
+				else if ($_REQUEST['typ'] == "var_weight")
+				{
+					 
+					$_REQUEST['value'] = wpsg_tf($_REQUEST['value']);
+					$vp_data[$_REQUEST['var_id']]['weight'] = $_REQUEST['value'];
+					
+				}
+				else if ($_REQUEST['typ'] == "var_fmenge")
+				{
+					
+					$arFeinheiten = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
+						
+					$_REQUEST['value'] = wpsg_ff(wpsg_tf($_REQUEST['value']), $arFeinheiten[$product_data['feinheit']]);
+					$vp_data[$_REQUEST['var_id']]['fmenge'] = wpsg_tf($_REQUEST['value']);
+					
+				}
+				else if ($_REQUEST['typ'] == "var_artnr")
+				{
+					
+					if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+					{
+						$vp_data[$_REQUEST['var_id']]['lang'][$_REQUEST['wpsg_lang']]['artnr'] = wpsg_q($_REQUEST['value']);	
+					}
+					else
+					{
+						$vp_data[$_REQUEST['var_id']]['artnr'] = wpsg_q($_REQUEST['value']);
+					}
+					
+				}
+				else if ($_REQUEST['typ'] == "var_stock")
+				{
+	 
+					$_REQUEST['value'] = intval($_REQUEST['value']);
+					$vp_data[$_REQUEST['var_id']]['stock'] = $_REQUEST['value'];
+					
+				}
+				
+				$this->saveVarianten($_REQUEST['edit_id'], $vp_data);
+				
+				die(strval($_REQUEST['value']));
+				
+			}
+			
+		} // public function produkt_ajax()
+		
+		public function settings_save()
+		{
+			
+			$this->shop->update_option('wpsg_vp_showpic', $_REQUEST['wpsg_vp_showpic']);
+			$this->shop->update_option('wpsg_vp_detailview', $_REQUEST['wpsg_vp_detailview']);
+			$this->shop->update_option('wpsg_vp_showpic_width', $_REQUEST['wpsg_vp_showpic_width']);
+			$this->shop->update_option('wpsg_vp_showpic_height', $_REQUEST['wpsg_vp_showpic_height']);
+			$this->shop->update_option('wpsg_vp_replaceanr', $_REQUEST['wpsg_vp_replaceanr']);
+			$this->shop->update_option('wpsg_vp_imageselect_width', $_REQUEST['wpsg_vp_imageselect_width']);
+			$this->shop->update_option('wpsg_vp_imageselect_height', $_REQUEST['wpsg_vp_imageselect_height']);
+			$this->shop->update_option('wpsg_vp_imageselect_mode', $_REQUEST['wpsg_vp_imageselect_mode']);
+			
+		} // public function settings_save()
+		
+		public function settings_edit()
+		{
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/settings_edit.phtml');
+			
+		} // public function settings_edit()
+				
+		public function produkt_edit_content(&$produkt_data) 
+		{ 
+			
+			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+			{
+				
+				// FÃŒr die Varianten brauche ich immer das original Array ...
+				$produkt_data['id'] = $this->db->fetchOne("SELECT `lang_parent` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_data['id'])."'");				
+				
+			}
+			
+			$this->shop->view['wpsg_mod_varianten']['data'] = $produkt_data;
+			 			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/produkt_edit_content.phtml');	
+			
+		} // public function produkt_edit_content(&$produkt_data)
+		
+		public function produkt_edit_afterForm(&$product_id) { }
+		
+		public function wpsg_enqueue_scripts()
+		{
+			
+			if (!is_admin())
+			{
+							
+				wp_enqueue_script('wpsg_mod_varianten_js', $this->shop->getRessourceURL('mods/mod_varianten/varianten.js'));
+				
+				wp_localize_script('wpsg_mod_varianten_js', 'wpsg_vp_showpic', array('wpsg_vp_showpic' => $this->shop->get_option('wpsg_vp_showpic')));
+				
+			}
+			
+		} // public function wpsg_enqueue_scripts()
+		
+		public function basket_preInsert()
+		{
+
+			if (is_array($_REQUEST['wpsg_vp']) && sizeof($_REQUEST['wpsg_vp']) > 0)
+			{
+								
+				$var_key = 'vp_'.$_REQUEST['wpsg']['produkt_id'].'/';
+				
+				foreach ($_REQUEST['wpsg_vp'] as $var => $var_value)
+				{
+					
+					$var_key .= $var."_".$var_value.":";
+					
+				}
+				
+				$var_key = substr($var_key, 0, -1);
+
+				$_REQUEST['wpsg']['produkt_id'] = $var_key;
+				
+			}
+			
+		} // public function basket_preInsert()
+				 		
+		public function getProductAnr($product_key, &$anr) 
+		{ 
+
+			if ($this->isVariantsProductKey($product_key) && wpsg_isSizedInt($this->shop->get_option('wpsg_vp_replaceanr')))
+			{
+
+				$arVariantenInfo = $this->getVariantenInfoArray($product_key);
+				
+				$anr = $arVariantenInfo['akey'];
+				
+				// Artikelnummer gebildet, keine weiteren Module betrachten
+				return -2;
+				
+			}
+			
+		} // public function getProductAnr($product_key, &$anr)
+				
+		public function basket_row(&$p, $i) 
+		{ 
+			
+			if (!preg_match('/vp_(.*)/', $p['id'])) return;
+			
+			$this->shop->view['variante'] = $this->getVariantenInfoArray($p['id']);
+			
+			$this->shop->view['i'] = $i;
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/basket_row.phtml');
+			
+		} // public function basket_row(&$p)
+		
+		public function overview_row(&$p, $i)
+		{
+			
+			if (!preg_match('/vp_(.*)/', $p['id'])) return;
+			
+			$this->shop->view['variante'] = $this->getVariantenInfoArray($p['id']);
+			$this->shop->view['i'] = $i;
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/overview_row.phtml');
+			
+		} // public function overview_row(&$p, $i)
+		
+		public function order_view_row(&$p, $i) 
+		{ 
+			
+			if (!preg_match('/vp_(.*)/', $p['id'])) return;
+			
+			$this->shop->view['variante'] = $this->getVariantenInfoArray($p['id']);
+			$this->shop->view['i'] = $i;
+			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/order_view_row.phtml');
+			
+		} // public function order_view_row(&$p)
+				
+		public function mail_row($index, $produkt)
+		{
+			
+			if (preg_match('/vp_(.*)/', $produkt['id']))
+			{
+			
+				$this->shop->view['produkt'] = $produkt;
+				$this->shop->view['variante'] = $this->getVariantenInfoArray($produkt['id']);
+			
+				if ($this->shop->htmlMail === true)
+				{
+				
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/mail_row_html.phtml');
+					
+				}
+				else
+				{
+					
+					$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/mail_row.phtml');
+				
+				}
+			
+			}
+			
+		} // public function mail_row($index, $produkt)
+		
+		public function admin_presentation() 
+		{ 
+			
+			echo wpsg_drawForm_Select('wpsg_mod_varianten_showvariprice', __('Variantenpreis im Produkttemplate anzeigen', 'wpsg'), array(
+				'0' => __('immer anzeigen', 'wpsg'),
+				'1' => __('nur wenn grÃ¶Ãer 0', 'wpsg'),
+				'2' => __('nie anzeigen', 'wpsg')
+			), $this->shop->get_option('wpsg_mod_varianten_showvariprice'));
+			
+		} // public function admin_presentation()
+		
+		public function admin_presentation_submit() 
+		{ 
+			
+			$this->shop->update_option('wpsg_mod_varianten_showvariprice', $_REQUEST['wpsg_mod_varianten_showvariprice']);	
+			
+		} // public function admin_presentation_submit()
+		
+		public function wpsg_mod_export_loadFields(&$arFields) 
+		{ 
+
+			$arFields[20]['fields']['product_vname'] = __('Name der Variante', 'wpsg');
+			$arFields[20]['fields']['product_vanr'] = __('Artikelnummer der Variante', 'wpsg');
+			
+		} // public function wpsg_mod_export_loadFields(&$arFields) 
+		
+		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) 
+		{ 
+
+			if ($this->isVariantsProductKey($productkey))
+			{
+
+				$var_info = $this->getVariantenInfoArray($productkey);
+				
+				$var_vname = $var_info['key'];
+				$var_vanr = $var_info['akey'];
+				
+			}
+			else
+			{
+				
+				// Damit das nicht definiert nicht im Export erscheint, fÃŒr Produkte die keine Variante sind 
+				
+				$var_vname = '';
+				$var_vanr = '';
+				
+			}
+			
+			switch ($field_value)
+			{
+			
+				case 'product_vname': $return = $var_vname; break;
+				case 'product_vanr': $return = $var_vanr; break;
+			
+			}
+			
+		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) 
+		
+		/* Modulfunktionen */ 
+		
+		/**
+		 * Gibt die MÃ¶glichken Bilder einer Variantenkombination zurÃŒck
+		 */
+		public function getKombiVariImages($var_key, $var_id = false)
+		{
+			
+			if (!$this->shop->hasMod('wpsg_mod_produktbilder')) return false;
+					
+			$arVarSelected = $this->getSetVariArray($var_key);			
+			$product_id = $this->shop->getProduktID($var_key);
+			$arVari = $this->loadVarianten($product_id);
+		
+			$handle = opendir($this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($product_id)));
+				
+			// Bilder des Produktes laden
+			$arBilder = array(); $i = 1;
+			while($filename = readdir($handle))
+			{
+		
+				$file = $this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($product_id)).'/'.$filename;
+		
+				if (is_file($file) && $file != "." && $file != "..") $arBilder[] = $filename; $i ++;
+		
+			}
+		
+			// Schauen ob ein Bild nach dem Dateinamen dabei ist
+			foreach ($arBilder as $bild)
+			{
+				
+				$image = false;
+				$filename = preg_replace("/\.([^\.]*)/", "", $bild);
+				if ($filename == "vp_".str_replace(":", "-", $var_key)) $image = $bild;
+					
+				if ($image !== false) return array($image);
+				
+			}
+		
+			foreach ($arVari as $var_key => $var)
+			{
+	
+				if (array_key_exists($var_key, $arVarSelected))
+				{
+
+					if ($var_id === $var_key) continue;
+					
+					if ($var['typ'] == "checkbox")
+					{
+							
+						if ($arVarSelected[$var_key] == "1")
+						{
+							$arBilder = array_intersect($arBilder, explode(",", $var['pic']));
+						}
+						else
+						{
+							$arBilder = array_diff($arBilder, explode(",", $var['pic']));
+						}
+							
+					}
+					else
+					{
+												
+						$arBilder = array_intersect($arBilder, explode(",", wpsg_getStr($var['vari'][$arVarSelected[$var_key]]['pic'])));
+							
+					}
+						
+				}
+					
+			}
+				
+			$arBilder = $this->checkPics($arBilder, $product_id);
+				
+			if (wpsg_isSizedArray($arBilder))
+			{
+	
+				return $arBilder;
+					
+			}
+			else
+			{
+				
+				return array();
+				
+			}
+		
+		}
+				
+		/**
+		 * Gibt das Bild fÃŒr die Grafikauswahl zurÃŒck
+		 * @param int $product_id
+		 * @param int $var_id
+		 * @param int $vari_id
+		 */
+		public function getImageSelectImage($product_id, $var_id, $vari_id, $vari_key)
+		{
+
+			$arVariBilder = $this->getVariImages($product_id, $var_id, $vari_id);			
+			$arVariPossibleBilder = $this->getKombiVariImages($vari_key, $var_id);
+			
+			$arBilderIntersect = array_intersect($arVariBilder, $arVariPossibleBilder);			
+			if (wpsg_isSizedArray($arBilderIntersect)) $arVariBilder = $arBilderIntersect;
+			
+			return array_shift($arVariBilder);
+			
+		} // public function getImageSelectImage($product_id, $var_id, $vari_id)
+		
+		/**
+		 * Gibt die Bilder als Array fÃŒr die Variation zurÃŒck
+		 * Beachtet die Reihenfolge die im Backend ÃŒber Drag&Drop definiert ist
+		 * @param int $var_id Key der Variante
+		 * @param int $vari_id Key der Variation
+		 */
+		public function getVariImages($product_id, $var_id, $vari_id)
+		{
+			
+			$vp_data = $this->loadVarianten($product_id);
+			
+			$arProductBilder = $this->shop->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($product_id));
+			 
+			$arReturn = array();
+			 
+			// Bilder in Reihenfolge
+			if ($vp_data[$var_id]['typ'] == 'checkbox' && wpsg_isSizedArray($vp_data[$var_id]['picOrder'])) $arReturn = $vp_data[$var_id]['picOrder']; 
+			else if (wpsg_isSizedArray($vp_data[$var_id]['vari'][$vari_id]['picOrder'])) $arReturn = $vp_data[$var_id]['vari'][$vari_id]['picOrder'];
+			
+			// PrÃŒfen ob die Bilder noch in Produktbilder Array drin sind
+			foreach ($arReturn as $k => $v)
+			{
+				
+				if (!in_array($v, $arProductBilder)) unset($arReturn[$k]);
+				else unset($arProductBilder[array_search($v, $arProductBilder)]);
+				
+			}
+			
+			// Bilder aus dem ProduktArray noch hinzufÃŒgen, die eventuell nicht im sortierten Array enthalten sind
+			foreach ($arProductBilder as $k => $v)
+			{
+				
+				$arReturn[] = $v;
+				
+			}
+			
+			$arImageSelect = array();
+			
+			// Sind die Bilder in der Variante ausgewÃ€hlt?
+			if (!is_admin())
+			{
+			
+				if ($vp_data[$var_id]['typ'] == 'checkbox' && wpsg_isSizedString($vp_data[$var_id]['pic'])) $arImageSelect = explode(',', $vp_data[$var_id]['pic']);
+				else if (wpsg_isSizedString($vp_data[$var_id]['vari'][$vari_id]['pic'])) $arImageSelect = explode(',', $vp_data[$var_id]['vari'][$vari_id]['pic']);
+			
+				foreach ($arReturn as $k => $v)
+				{
+				
+					if (!in_array($v, $arImageSelect)) unset($arReturn[$k]);
+				
+				}
+				
+			}
+						
+			return $arReturn;
+									
+		} // public function getVariImages($product_id, $var_id, $vari_id)
+				
+		/**
+		 * Gibt einen Array zurÃŒck, bei denen die SchlÃŒssel die Varianten sind und die Werte die gewÃ€hlten Variationen
+		 */
+		private function getSetVariArray($product_key)
+		{
+
+			if (!$this->isVariantsProductKey($product_key)) return array();
+			
+			$arVariSet = explode(':', preg_replace('/^vp_\d*\//', '', $product_key));
+			$arReturn = array();
+			
+			foreach ($arVariSet as $var_combi)
+			{
+				
+				$var_combi = explode('_', $var_combi);
+				$var = $var_combi[0];
+				$vari = $var_combi[1];
+				
+				$arReturn[$var] = $vari;
+				
+			}
+			
+			return $arReturn;
+			
+		}
+		
+		/**
+		 * Gibt true zurÃŒck, wenn der ÃŒbergebene Produktkey ein Varianten Produktkey ist. Sonst false.
+		 * @param \String $productkey
+		 */
+		public function isVariantsProductKey($productkey)
+		{
+			
+			if (preg_match('/^vp_\d+/', $productkey))
+			{
+				
+				return true;
+				
+			}
+			else 
+			{
+
+				return false;
+				
+			}
+			
+		} // public function isVariantsProductKey($productkey)
+		
+		/**
+		 * Ãbernimmt die Auswahl der Variante im Produkttemplate
+		 */
+		public function renderTemplate($product_key)
+		{
+			 
+			$produkt_id = $this->shop->getProduktId($product_key);
+			$produkt_data = $this->shop->cache->loadProduct($produkt_id);
+			$tax_value = $this->shop->getCalcTaxValue($produkt_data['mwst_key']);
+												
+			if ($this->shop->isOtherLang())
+			{
+			
+				$produkt_trans_id = $this->db->fetchOne("SELECT `id` FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($produkt_id)."' AND `lang_locale` = '".wpsg_q($this->shop->getCurrentLanguage())."'");
+					
+				if (wpsg_isSizedInt($produkt_trans_id)) $produkt_id = $produkt_trans_id;
+				
+			}
+	 
+			$vp_data = $this->loadVarianten($produkt_id);
+									
+			if (is_array($vp_data) && sizeof($vp_data) > 0)
+			{
+				
+				$this->shop->view['data']['vp_data'] = $vp_data;
+				$this->shop->view['wpsg_mod_varianten']['set'] = $this->getSetVariArray($product_key);
+				
+				// Rabattpreise vorkalkulieren
+				//$this->shop->callMod('wpsg_mod_discount', 'addDiscountToVari', array(&$produkt_id, &$this->shop->view['data']['vp_data']));
+				 
+				foreach ($this->shop->view['data']['vp_data'] as $k => $v)
+				{
+					
+					if ($v['typ'] == "checkbox")
+					{
+						
+						if (get_option("wpsg_vp_showpic") == "1" && wpsg_isSizedString($v['pic']))
+						{
+							
+							$this->shop->view['data']['vp_data'][$k]['showpic'] = $this->getImageSelectImage($produkt_id, $k, $k2, $product_key);
+						 							
+						}
+						
+						// Preis an Ausgabe im Frontend anpassen
+						if ($this->shop->getFrontendTaxview() == WPSG_NETTO && $this->shop->getBackendTaxview() == WPSG_BRUTTO) $this->shop->view['data']['vp_data'][$k]['preis'] = wpsg_calculatePreis($v['preis'], WPSG_NETTO, $tax_value);
+						 
+					}
+					else
+					{ 
+						
+						foreach ($v['vari'] as $k2 => $v2)
+						{
+
+							if (get_option("wpsg_vp_showpic") == "1" && wpsg_isSizedString($v2['pic']))
+							{
+							 								
+								$this->shop->view['data']['vp_data'][$k]['vari'][$k2]['showpic'] = $this->getImageSelectImage($produkt_id, $k, $k2, $product_key);
+								
+							}
+							
+							// Preis an Ausgabe im Frontend anpassen
+							if ($this->shop->getFrontendTaxview() == WPSG_NETTO && $this->shop->getBackendTaxview() == WPSG_BRUTTO) $this->shop->view['data']['vp_data'][$k]['vari'][$k2]['preis'] = wpsg_calculatePreis($v2['preis'], WPSG_NETTO, $tax_value);
+							
+						}
+						
+					}
+					
+				}
+					 
+								
+				return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/produkt.phtml', false);
+				
+			}
+			
+		} // public function renderTemplate($produkt_id)
+
+		/**
+		 * Zeichnet das Interface fÃŒr die Bearbeitung der Varianten
+		 */
+		public function drawVarianten($produkt_id)
+		{
+					    			
+			$this->shop->view['vp_data'] = $this->loadVarianten($produkt_id);
+			 
+			if ($this->shop->hasMod('wpsg_mod_fuellmenge'))
+			{
+				
+				$this->shop->view['vp_productdata'] = $this->shop->cache->loadProduct($produkt_id);
+				$this->shop->view['vp_arFeinheiten'] = explode(',', $this->shop->get_option('wpsg_mod_fuellmenge_einheit'));
+				
+			}
+
+			// Wenn es ÃŒber Ajax aufgerufen wird fehlt hier die ProduktID !
+			if (!isset($this->shop->view['data']['id'])) $this->shop->view['data']['id'] = $produkt_id;
+									 
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_varianten/drawVarianten.phtml');
+						
+		} // public function drawVarianten($produkt_id)
+		
+		/**
+		 * Gibt den Namen der Variante zurÃŒck
+		 */
+		public function getVariantenName($vp_data, $var_id)
+		{
+			
+			$name = $vp_data[$var_id]['name'];
+			 
+			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+			{
+				if ($vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['name'] != "")
+				{
+					$name = $vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['name'];
+				}
+			} 
+			
+			return ((trim($name) == "")?"----":$name);
+			
+		} // public function getVariantenName($vp_data, $v_id)
+		
+		/**
+		 * Gibt den Namen der Variation zurÃŒck
+		 */
+		public function getVariName($vp_data, $var_id, $vari_id)
+		{
+			
+			$name = $vp_data[$var_id]['vari'][$vari_id]['name'];	
+								
+			if (wpsg_isSizedString($_REQUEST['wpsg_lang']))
+			{
+				if ($vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['vari'][$vari_id]['name'] != "")
+				{
+					$name = $vp_data[$var_id]['lang'][$_REQUEST['wpsg_lang']]['vari'][$vari_id]['name'];
+				}
+			}
+		
+			return ((trim($name) == "")?"----":$name);
+			
+		} // public function getVariName($vp_data, $var_id, $vari_id)
+		
+		/**
+		 * Gibt true zurÃŒck, wenn der Preis im Produkttemplate angezeigt werden soll
+		 * Andersrum programmiert, da die Default Einstellung anzeigen ist
+		 */
+		public function showVariPrice($vari_price)
+		{
+			
+			switch ($this->shop->get_option('wpsg_mod_varianten_showvariprice'))
+			{
+				
+				case '1': // nur wenn grÃ¶Ãer 0
+					
+					if ($vari_price <= 0) return false;
+					
+					break;
+					
+				case '2': // nie anzeigen
+					
+					return false;
+					
+					break;
+				
+			}
+			
+			return true;
+			
+		} // public function showVariPrice($vari_price)
+		
+		/**
+		 * LÃ€dt die Varianteninformationen aus dem serialisierten Array
+		 * @param $noTrans Wird diese Variable auf true gesetzt, so wird die Ãbersetzung nicht geladen (Wie Backend) Wichtig wenn die Varianten wieder gespeichert werden sollen!
+		 */
+		public function loadVarianten($produkt_id, $noTrans = false, $noCache = false)
+		{
+			
+			if (is_admin()) $noCache = true;
+			
+			if (!$noCache && array_key_exists($produkt_id.$noTrans, $this->cache_variData)) return $this->cache_variData[$produkt_id.$noTrans];
+						 
+			// Ãbersetzung verarbeiten
+			if (is_admin() || $noTrans === true)
+			{
+				
+				$vp_data = @unserialize($this->db->fetchOne("SELECT `mod_varianten` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'"));
+				if (!is_array($vp_data)) $vp_data = array();
+				
+			} 
+			else
+			{
+			
+				// Im Frontend geht es nach der Sprache auf der der Shop aktuell lÃ€uft	
+				if ($this->shop->isOtherLang())			
+				{
+										
+					$parent_lang_id = $this->db->fetchOne("SELECT `lang_parent` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'");					
+					if (!wpsg_isSizedInt($parent_lang_id)) $parent_lang_id = $produkt_id;				
+					
+					$vp_data = @unserialize($this->db->fetchOne("SELECT `mod_varianten` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($parent_lang_id)."'"));
+					if (!is_array($vp_data)) $vp_data = array();
+					
+					foreach ($vp_data as $k => $v)
+					{
+	
+						// Den Namen der Variante auf die aktuelle Sprache stellen
+						if (wpsg_isSizedString($vp_data[$k]['lang'][$this->shop->getCurrentLanguage()]['name'])) $vp_data[$k]['name'] = $vp_data[$k]['lang'][$this->shop->getCurrentLanguage()]['name'];
+						
+						if (wpsg_isSizedArray($vp_data[$k]['vari']))
+						{
+							
+							foreach ($vp_data[$k]['vari'] as $k2 => $vari)
+							{
+								
+								// Den Namen der Variation auf die aktuelle Sprache korrigieren
+								if (wpsg_isSizedString($vp_data[$k]['lang'][$this->shop->getCurrentLanguage()]['vari'][$k2]['name'])) $vp_data[$k]['vari'][$k2]['name'] = $vp_data[$k]['lang'][$this->shop->getCurrentLanguage()]['vari'][$k2]['name'];
+								
+							}
+							
+						}
+						
+					}
+					
+				}
+				else
+				{
+					
+					$vp_data = @unserialize($this->db->fetchOne("SELECT `mod_varianten` FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($produkt_id)."'"));
+					if (!is_array($vp_data)) $vp_data = array();
+					
+				}
+				
+			}
+			 						
+			$this->cache_variData[$produkt_id.$noTrans] = $vp_data; 
+			
+			return $vp_data;
+			
+		} // public function loadVarianten($produkt_id)
+		
+		/**
+		 * LÃ€dt einen Array mit den fÃŒr das Frontend mÃ¶glichen Varianten/Variationen
+		 */
+		public function laodPossibleVarianten($produkt_id, $noTrans = false)
+		{
+			
+			$arVariData = $this->loadVarianten($produkt_id, $noTrans);
+			
+			foreach ($arVariData as $var_key => $var)
+			{
+				
+				if ($var['typ'] == 'checkbox')
+				{
+					
+					if ($var['aktiv'] != '1') unset($arVariData[$var_key]);
+					
+				}
+				else 
+				{
+					 
+					if ($var['aktiv'] != '1')
+					{
+							
+						unset($arVariData[$var_key]);
+							
+					}
+					else
+					{
+						
+						$akt_vari = false;
+						
+						foreach ($var['vari'] as $vari_key => $vari)
+						{
+							
+							if ($vari['aktiv'] != '1' || ($this->shop->hasMod('wpsg_mod_stock') && !wpsg_isSizedInt($vari['stock'])))
+							{
+								
+								unset($arVariData[$var_key]['vari'][$vari_key]);
+								
+							}
+							else
+							{
+								
+								$akt_vari = true;
+								
+							}
+							
+						}
+						
+						if ($akt_vari === false)
+						{
+							
+							unset($arVariData[$var_key]);
+							
+						}
+						
+					}
+					
+				}
+				
+			}
+			
+			return $arVariData;
+			
+		} // public function laodPossibleVarianten($produkt_id, $noTrans)
+		
+		/**
+		 * Gibt den Warenbestand fÃŒr ein Produkt anhand seiner Variantenkonfiguration zurÃŒck
+		 */
+		public function getStockForVarianten($vari_key)
+		{
+			
+			
+			$produkt_id = preg_replace('/(^vp_)|(\/(.*)$)/', '', $vari_key);
+			$vari_teil = preg_replace('/(.*)\//', '', $vari_key);
+			
+			$vari_data = $this->loadVarianten($produkt_id);			 
+			$arVarianten = explode(":", $vari_teil);
+			 
+			$arStock = array();
+			
+			foreach ((array)$arVarianten as $variante)
+			{
+				
+				$arVariante = explode("_", $variante);
+				
+				$variante_id = $arVariante[0];
+				$vari_id = $arVariante[1];
+				
+				if ($vari_data[$variante_id]['typ'] == 'checkbox')
+				{
+					
+					// Checkbox betrachte ich gar nicht mehr
+					// Nur betrachten Wenn Checkbox aktiviert ist
+					//if ($vari_id == '1') $arStock[] = $vari_data[$variante_id]['stock'];
+						
+				}
+				else
+				{
+					
+					$arStock[] = $vari_data[$variante_id]['vari'][$vari_id]['stock'];
+					
+				}
+				
+			}
+ 
+			if (!wpsg_isSizedArray($arStock))
+			{
+				
+				// Hier greife ich jetzt auf den Produktbestand zurÃŒck
+				// Tritt auf, wenn z.B. nur die Checkboxvariante definiert ist
+				
+				$product_data = $this->shop->cache->loadProduct($produkt_id);				
+				return $product_data['stock'];
+				
+			}
+			
+			return min($arStock);
+			 
+		} // public function getStockForVarianten($vari_key)
+		
+		/**
+		 * Reduziert den Bestand der Variationen in dem Array
+		 */
+		public function reduceStock($produkt_key, $menge, $reduce = true)
+		{
+	
+			$produkt_id = preg_replace('/(^vp_)|(\/(.*)$)/', '', $produkt_key);
+			$vari_teil = preg_replace('/(.*)\//', '', $produkt_key);			
+			$arVarianten = explode(':', $vari_teil);
+			
+			$vari_data = $this->loadVarianten($produkt_id, true, true);
+  
+			foreach ($arVarianten as $variante)
+			{
+				
+				$arVariante = explode('_', $variante);
+				$variante_id = $arVariante[0];
+				$vari_id = $arVariante[1];
+				
+				if ($reduce === true)
+				{
+				
+					$vari_data[$variante_id]['vari'][$vari_id]['stock'] -= $menge;
+					
+				}
+				else
+				{
+				
+					$vari_data[$variante_id]['vari'][$vari_id]['stock'] += $menge;
+
+				}
+								
+			}
+			
+			// Array zurÃŒckspeichern
+			$this->saveVarianten($produkt_id, $vari_data);
+						
+		} // public function reduceStock($produkt_id, $menge)
+		
+		/**
+		 * Gibt einen VariantenschlÃŒssel fÃŒr die Standard Variantenauswahl zurÃŒck
+		 */
+		public function getDefaultVariKey($product_key)
+		{
+			 
+			if (is_numeric($product_key))
+			{
+
+				$arVariData = $this->laodPossibleVarianten($product_key, true);
+				
+				if (!wpsg_isSizedArray($arVariData)) return $product_key;
+				
+				$arVariDefault = array();
+				 
+				foreach ($arVariData as $var_key => $var)
+				{
+
+					$first_vari_key = '0';
+					
+					if (wpsg_isSizedArray($var['vari']))
+					{
+						
+						$arKeys = array_keys($var['vari']);
+						$first_vari_key = array_shift($arKeys);
+						
+					}
+										
+					$arVariDefault[] = $var_key.'_'.$first_vari_key;
+					
+				}
+
+				return 'vp_'.$product_key.'/'.implode(':', $arVariDefault); 
+				
+			}
+			else
+			{
+				
+				// Ist schon ein ProduktschlÃŒssel
+				return $product_key;
+				
+			}
+			
+		} // public function getDefaultVariKey($product_id)
+		
+		/**
+		 * Speichert die Varianten
+		 */
+		public function saveVarianten($produkt_id, $vp_data)
+		{
+
+			$vp_data = $this->clearArrayForSerialization($vp_data);
+			
+			$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, array(
+				"mod_varianten" => wpsg_q(serialize($vp_data))
+			), "`id` = '".wpsg_q($produkt_id)."'");
+		  
+		} // public function saveVarianten($produkt_id, $vp_data)
+
+		/**
+		 * Liest die Informationen anhand eines VariantenschlÃŒssels aus
+		 */
+		public function getVariantenInfoArray($vari_key)
+		{
+			
+			$produkt_id = preg_replace('/(vp_)|(\/(.*))/', '', $vari_key);								
+			$arVari = explode(':', preg_replace('/vp_'.$produkt_id.'\//', '', $vari_key));
+	
+			$vp_data = $this->loadVarianten($produkt_id);
+	
+			$arKey = array();
+			$arAKey = array();
+			$arPics = array();
+			
+			$arReturn = array();
+			
+			if ($this->shop->hasMod('wpsg_mod_fuellmenge')) $arReturn['fmenge'] = 0;
+			if ($this->shop->hasMod('wpsg_mod_weight')) $arReturn['weight'] = 0;
+			
+			foreach ($arVari as $var_key)
+			{
+				
+				$var_id = preg_replace('/\_(.*)/', '', $var_key);
+				$var_value = preg_replace('/(.*)\_/', '', $var_key);
+			
+				if ($vp_data[$var_id]['typ'] == 'checkbox')
+				{
+					
+					$arPicsVariante = array();
+						
+					if (isset($vp_data[$var_id]['pic']))
+					{
+					
+						$arPicsVariante = wpsg_trim(explode(',', $vp_data[$var_id]['pic']));						
+																	
+					}
+					
+					if ($var_value == '1')
+					{  
+					 
+						$r = array(
+							'name' => $vp_data[$var_id]['name'],
+							'preis' => $vp_data[$var_id]['preis'],
+							'artnr'	=> $vp_data[$var_id]['vari'][2]['artnr'],
+							'pics' => $arPicsVariante
+						);
+						 
+						if ($this->shop->hasMod('wpsg_mod_weight') && wpsg_isSizedInt($vp_data[$var_id]['weight']))
+						{
+							
+							$r['weight'] = $vp_data[$var_id]['weight'];
+							$arReturn['weight'] += $r['weight'];
+							
+						}						
+
+						if ($this->shop->hasMod('wpsg_mod_fuellmenge') && wpsg_isSizedInt($vp_data[$var_id]['fmenge']))
+						{
+							
+							$r['fmenge'] = $vp_data[$var_id]['fmenge'];
+							$arReturn['fmenge'] += $r['fmenge'];
+							
+						}
+												
+						$arReturn[] = $r;
+						
+						$arKey[] = $vp_data[$var_id]['name'];
+						
+						$arPics = array_intersect($arPics, $arPicsVariante);
+						
+					}
+					else
+					{
+						
+						// Checkbox ist nicht markiert
+						//$arPics = array_unique(array_merge($arPics, $arPicsVariante));
+						
+					}
+					
+				}				
+				else 
+				{
+					
+					$arPicsVariante = array();
+					
+					if (isset($vp_data[$var_id]['vari'][$var_value]['pic']))
+					{
+						
+						$arPicsVariante = wpsg_trim(explode(',', $vp_data[$var_id]['vari'][$var_value]['pic']));							
+						$arPics = array_unique(array_merge($arPics, $arPicsVariante));
+						
+					}
+					 
+					$r = array(
+						'name' 	=> $vp_data[$var_id]['name'],
+						'value' => $vp_data[$var_id]['vari'][$var_value]['name'],
+						'preis'	=> $vp_data[$var_id]['vari'][$var_value]['preis'],
+						'artnr'	=> @$vp_data[$var_id]['vari'][$var_value]['artnr'],
+						'pics' => $arPicsVariante
+					);
+					
+					if ($this->shop->hasMod('wpsg_mod_weight') && wpsg_isSizedInt($vp_data[$var_id]['vari'][$var_value]['weight']))
+					{
+					
+						$r['weight'] = $vp_data[$var_id]['vari'][$var_value]['weight'];
+						$arReturn['weight'] += $r['weight'];
+					
+					}
+					
+					if ($this->shop->hasMod('wpsg_mod_fuellmenge') && wpsg_isSizedInt($vp_data[$var_id]['vari'][$var_value]['fmenge']))
+					{
+						
+						$r['fmenge'] = $vp_data[$var_id]['vari'][$var_value]['fmenge'];
+						$arReturn['fmenge'] += $r['fmenge'];
+						
+					}
+					
+					$arReturn[] = $r;
+					
+					$arKey[] = $vp_data[$var_id]['vari'][$var_value]['name'];
+					$arAKey[] = @$vp_data[$var_id]['vari'][$var_value]['artnr'];
+										
+				}
+				
+			}
+			
+			$arReturn['key'] = implode(' / ', $arKey);
+			$arReturn['akey'] = implode(' / ', $arAKey);
+			$arReturn['pics'] = array_unique($arPics);
+
+			return $arReturn;			
+			
+		} // public function getVariantenText($vari_key)
+				
+		private function checkPics(&$arPics, $produkt_id)
+		{
+			
+			foreach ($arPics as $k => $v)
+			{
+				
+				if (!file_exists($this->shop->callMod('wpsg_mod_produktbilder', 'getPicPath', array($produkt_id)).'/'.$v))
+				{
+					unset($arPics[$k]);
+				}
+				
+			}
+			
+			return $arPics;
+			
+		} // private function checkPics($arPics, $produkt_id)
+				
+		private function clearArrayForSerialization($ar)
+		{
+			
+			foreach ((array)$ar as $k => $v)
+			{
+				
+				if (wpsg_isSizedArray($v))
+				{
+					
+					$ar[$k] = $this->clearArrayForSerialization($v);
+					
+				}
+				else
+				{
+					
+					$ar[$k] = preg_replace('/\'|\`|\ÂŽ|\"/', '', $v);					
+					
+				}
+				
+			}
+			
+			return $ar;
+			
+		} // private function clearArrayForSerialization($ar)
+		
+	} // class wpsg_mod_varianten extends wpsg_mod_basic
+
+?>
Index: /mods/wpsg_mod_versandarten.class.php
===================================================================
--- /mods/wpsg_mod_versandarten.class.php	(revision 8528)
+++ /mods/wpsg_mod_versandarten.class.php	(revision 5261)
@@ -77,7 +77,9 @@
 		} // public function settings_edit()
 		
-		public function be_ajax() {
-			
-			if ($_REQUEST['do'] == 'add') {
+		public function be_ajax()
+		{
+			
+			if ($_REQUEST['do'] == 'add')
+			{
 				
 				$new_name = __('Anklicken um den Namen der Versandart zu Ã€ndern ...', 'wpsg');
@@ -96,153 +98,119 @@
 				
 			}
-			else if ($_REQUEST['do'] == 'remove') {
-
-				if (wpsg_checkInput($_REQUEST['va_id'], WPSG_SANITIZE_INT)) {
-				
-					$this->db->UpdateQuery(WPSG_TBL_VA, array(
-						"deleted" => "1"
-					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-				
-				}
+			else if ($_REQUEST['do'] == 'remove')
+			{
+				
+				$this->db->UpdateQuery(WPSG_TBL_VA, array(
+					"deleted" => "1"
+				), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
 
 				die($this->va_list());
 				
-			} else if ($_REQUEST['do'] == 'inlinedit') {
-
-				if (wpsg_checkInput($_REQUEST['va_id'], WPSG_SANITIZE_INT)) {
-								
-					if ($_REQUEST['field'] == 'name') {
+			}
+			else if ($_REQUEST['do'] == 'inlinedit')
+			{
+				
+				if ($_REQUEST['field'] == 'name')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'name' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					$this->shop->addTranslationString('wpsg_mod_versandarten_'.$_REQUEST['va_id'], $_REQUEST['value']);
+					
+					die($_REQUEST['value']);
+					
+				} 
+				else if ($_REQUEST['field'] == 'typ')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'typ' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					die($this->arTypen[$_REQUEST['value']]);
+					
+				}
+				else if ($_REQUEST['field'] == 'hint')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'hint' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					$this->shop->addTranslationString('wpsg_mod_versandarten_hint_'.$_REQUEST['va_id'], $_REQUEST['value']);
+					
+					die(wpsg_hspc($_REQUEST['value']));
+					
+				}
+				else if ($_REQUEST['field'] == 'vz')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'vz' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					if ($_REQUEST['value'] > 0)
+						die($this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_VZ."` WHERE `id` = '".wpsg_q($_REQUEST['value'])."'"));
+					else
+						die(__('Alle Versandzonen', 'wpsg'));
+					
+				}
+				else if ($_REQUEST['field'] == 'mwst_key')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'mwst_key' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					$tax_groups = wpsg_tax_groups();
+					die(wpsg_hspc($tax_groups[$_REQUEST['value']]));
+										
+				}
+				else if ($_REQUEST['field'] == 'kosten')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'kosten' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					die($_REQUEST['value']);
+					
+				}
+				else if ($_REQUEST['field'] == 'kosten_plz')
+				{
+
+					$strKosten = $this->db->fetchOne("SELECT `kosten_plz` FROM ".WPSG_TBL_VA." WHERE `id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					if (!empty($strKosten)) { $arPLZkosten = unserialize($strKosten); }
 	
-						if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTFIELD)) {
-							
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'name' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-						
-							$this->shop->addTranslationString('wpsg_mod_versandarten_'.$_REQUEST['va_id'], $_REQUEST['value']);
-						
-							die($_REQUEST['value']);
-							
-						} else die(__('UngÃŒltige Eingabe!', 'wpsg'));
-						
-					} else if ($_REQUEST['field'] == 'typ') {
-	
-						if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_VALUES, array_keys($this->arTypen))) {
-						
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'typ' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							die($this->arTypen[$_REQUEST['value']]);
-							
-						} else die(__('UngÃŒltige Eingabe!', 'wpsg'));
-						
-					} else if ($_REQUEST['field'] == 'hint') {
-	
-						if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTAREA)) {
-								
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'hint' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							$this->shop->addTranslationString('wpsg_mod_versandarten_hint_'.$_REQUEST['va_id'], $_REQUEST['value']);
-													
-							die(wpsg_hspc($_REQUEST['value']));
-							
-						} else die(__('UngÃŒltige Eingabe!', 'wpsg'));
-						
-					} else if ($_REQUEST['field'] == 'vz') {
-	
-						if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_INT, ['allow' => ['0']])) {
-							
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'vz' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							if ($_REQUEST['value'] > 0) die($this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_VZ."` WHERE `id` = '".wpsg_q($_REQUEST['value'])."'"));
-							else die(__('Alle Versandzonen', 'wpsg'));
-							
-						} else die(__('UngÃŒltige Eingabe!', 'wpsg'));
-							
-					} else if ($_REQUEST['field'] == 'mwst_key') {
-	
-						if (!wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TAXKEY)) {
-							
-							die(__('UngÃŒltige Eingabe', 'wpsg'));
-							
-						} else {
-						
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'mwst_key' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							$tax_groups = wpsg_tax_groups();
-							die(wpsg_hspc($tax_groups[$_REQUEST['value']]));
-							
-						}
-											
-					} else if ($_REQUEST['field'] == 'kosten') {
-	
-						if (!wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_COSTKEY)) {
-							
-							die(__('UngÃŒltige Eingabe', 'wpsg'));
-							
-						} else {
-						
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'kosten' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-												
-							die($_REQUEST['value']);
-							
-						} 
-						
-					} else if ($_REQUEST['field'] == 'kosten_plz') {
-	
-						if (!wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_TEXTAREA)) {
-							
-							die(__('UngÃŒltige Eingabe', 'wpsg'));
-							
-						} else {
-						 
-							$strKosten = $this->db->fetchOne("SELECT `kosten_plz` FROM ".WPSG_TBL_VA." WHERE `id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							if (!empty($strKosten)) { $arPLZkosten = unserialize($strKosten); }
-			
-							$arPLZkosten[$_REQUEST['key']] = wpsg_q($_REQUEST['value']);
-		
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'kosten_plz' => serialize($arPLZkosten)
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							die($_REQUEST['value']);
-							
-						}
-							
-					} else if ($_REQUEST['field'] == 'mwst_laender') {
-	
-						if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_CHECKBOX)) {
-						
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'mwst_laender' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							die();
-							
-						} else die(__('UngÃŒltige Eingabe', 'wpsg'));
-						
-					} else if ($_REQUEST['field'] == 'aktiv') {
-	
-						if (wpsg_checkInput($_REQUEST['value'], WPSG_SANITIZE_CHECKBOX)) {
-								
-							$this->db->UpdateQuery(WPSG_TBL_VA, array(
-								'aktiv' => wpsg_q($_REQUEST['value'])
-							), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
-							
-							die();
-							
-						} else die(__('UngÃŒltige Eingabe', 'wpsg'));
-						
-					}
+					$arPLZkosten[$_REQUEST['key']] = wpsg_q($_REQUEST['value']);
+
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'kosten_plz' => serialize($arPLZkosten)
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					die($_REQUEST['value']);
+					
+				}
+				else if ($_REQUEST['field'] == 'mwst_laender')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'mwst_laender' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					die();
+					
+				}
+				else if ($_REQUEST['field'] == 'aktiv')
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VA, array(
+						'aktiv' => wpsg_q($_REQUEST['value'])
+					), "`id` = '".wpsg_q($_REQUEST['va_id'])."'");
+					
+					die();
 					
 				}
@@ -251,74 +219,41 @@
 			
 		} // public function be_ajax()
-		 
-		public function checkShippingAvailable_pre(&$arShipping) { 
-			
-			foreach ($arShipping as $shipping_key => $shipping_data) {
-				
-				if ($shipping_data['active'] !== '1') unset($arShipping[$shipping_key]);
-				
-			}
-			
-			if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land'])) $land = intval($_SESSION['wpsg']['checkout']['shipping_land']);
-			else if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land'])) $land = intval($_SESSION['wpsg']['checkout']['land']);
-			else return;
-			
-			$oLand = wpsg_country::getInstance($land);
-			
-			if ($oLand->getShippingZoneId() > 0) {
-				
-				foreach ($arShipping as $shipping_key => $shipping_data) {
-					
-					if (preg_match('/'.$this->id.'_\d+/', $shipping_key)) {
-						
-						if (intval($shipping_data['vz']) > 0 && $shipping_data['vz'] !== $oLand->getShippingZoneId()) {
-							 
-							unset($arShipping[$shipping_key]);
-							
-						}
-						
-					}
-					
-				}
-
-			}
-			
-		}
-		
-		public function addShipping(&$arShipping, $va_active = false) {
-			 
-			if (!wpsg_is_admin() && !$va_active) {
-			 
-				$land = false;
-				
-				if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['shipping_land'])) $land = $_SESSION['wpsg']['checkout']['shipping_land'];
-				else if (wpsg_isSizedInt($_SESSION['wpsg']['checkout']['land'])) $land = $_SESSION['wpsg']['checkout']['land'];
-				
-				$strQueryWHERE = "";
-				
-				if ($land !== false) {
-					
-					//$vz = $this->db->fetchOne("SELECT `vz` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($land)."'");
-					
-					//$strQueryWHERE .= " AND (`vz` <= 0 OR `vz` = '".wpsg_q($vz)."') ";
-					
-				} /* else $strQueryWHERE .= " AND (`vz` <= 0) "; */
-				// Am 07.06.2022 geÃ€ndert damit alle Versandarten drin sind wenn noch kein Land definiert
-								 				
-				$strQuery = "
+		
+		public function addShipping(&$arShipping) 
+		{
+			
+			// Im Checkout2 wird der Wert berechnet und eventuell nicht verfÃŒgbare VA ausgeschlossen
+			//if (isset($_REQUEST['wpsg_checkout2']))
+			if (!is_admin())
+			{
+				
+				$arBasket = $this->shop->basket->toArray();
+				
+				if (isset($arBasket['checkout']['shipping_land']) && $arBasket['checkout']['shipping_land'] > 0)
+				{
+					$land = $arBasket['checkout']['shipping_land'];
+				}
+				else
+				{
+					$land = $arBasket['checkout']['land'];
+				}
+				
+				$vz = $this->db->fetchOne("SELECT `vz` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($land)."'"); 
+				
+				$arVersandarten = $this->db->fetchAssoc("
 					SELECT 
 						* 
 					FROM 
 						`".WPSG_TBL_VA."` 
-					WHERE					 
-						`deleted` != '1'
-						".$strQueryWHERE." 
+					WHERE
+						(`vz` <= 0 OR `vz` = '".wpsg_q($vz)."') AND 
+						`deleted` != '1' 
 					ORDER BY 
 						`name` ASC
-				";
-				
-				$arVersandarten = $this->db->fetchAssoc($strQuery);
-				 								
-			} else {
+				");
+								
+			}
+			else
+			{
 				
 				$arVersandarten = $this->db->fetchAssoc("
@@ -327,97 +262,137 @@
 				
 			}
-
-			foreach ($arVersandarten as $va) {
+			 
+			foreach ($arVersandarten as $va)
+			{
 				
 				if (!is_admin() && $va['aktiv'] != '1') continue;
 
-				$va = $this->getVaKosten($va);
-				
+				$va = $this->getVaKosten($arBasket, $va);
+					
+				$mwst_value = $this->getTaxValue($va['mwst_key'], $this->shop->getDefaultCountry());
+		 
 				$hint = $va['hint'];
 				
 				$arShipping[$this->id.'_'.$va['id']] = array(
-					'vz' => intval($va['vz']),
-					'active' => $va['aktiv'],
 					'id' => $this->id.'_'.$va['id'],
 					'va_id' => $va['id'],
 					'name' => __($va['name'], 'wpsg'),
-					'tax_key' => $va['mwst_key'],
-					'hint' => __($hint, 'wpsg'),					
+					'mwst_key' => $va['mwst_key'],
+					'hint' => __($hint, 'wpsg'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $va['mwst_laender'],
-					'deleted' => $va['deleted'],
-					'price' => $va['typ'].'-'.$va['kosten'],
+					'deleted' => $va['deleted']
 				);
 				
-				if (!empty($va['plz'])) $arShipping[$this->id.'_'.$va['id']]['plz'] = __($va['plz'], 'wpsg');
-		 								
-			}
- 
+				if (!empty($va['plz']))
+					$arShipping[$this->id.'_'.$va['id']]['plz'] = __($va['plz'], 'wpsg');
+		 
+				if (true || isset($_REQUEST['wpsg_checkout2']) || ($this->shop->hasMod('wpsg_mod_onepagecheckout') && isset($_REQUEST['wpsg_checkout'])))
+				{
+					
+					if ($this->shop->getBackendTaxview() == WPSG_BRUTTO)
+					{
+						
+						$shipping_brutto = $this->calculatePreis($va, $arBasket);
+						$shipping_netto = wpsg_calculatePreis($shipping_brutto, WPSG_NETTO, $mwst_value);
+						
+					}
+					else
+					{
+						
+						$shipping_netto = $this->calculatePreis($va, $arBasket);
+						$shipping_brutto = wpsg_calculatePreis($shipping_netto, WPSG_BRUTTO, $mwst_value);
+						
+					}
+					
+					if ($arBasket['noMwSt'] == '1') $shipping_brutto = $shipping_netto;
+					 
+					// Entsprechenden Preis anzeigen
+					if ($this->shop->getFrontendTaxview() == WPSG_NETTO || $arBasket['noMwst'] == '1')
+					{
+						
+						$arShipping[$this->id.'_'.$va['id']]['price'] = $shipping_netto;
+						
+					}
+					else 
+					{
+						
+						$arShipping[$this->id.'_'.$va['id']]['price'] = $shipping_brutto;
+						
+					}
+					
+				}
+								
+			}
+	 
 		} // public function addShipping(&$arShipping)
-				
-		public function checkCheckout(&$state, &$error, &$arCheckout) 
+		
+		public function calcShipping(&$arBasket, $shipping_key) 
 		{ 
-
-			/* PrÃŒfung, ob arShipping != leer */
-			$bOK = true;
-			
-			if (!empty($this->shop->arShipping)) {
-			
-				$bOK = false;
-				
-				// Alle mÃ¶glichen Versandarten durchgehen und schauen ob es eine PLZ BeschrÃ€nkung gibt
-				foreach ($this->shop->arShipping as $shipping_key => $shipping)
-				{
-									
-					$bOKShipping = true;
-					
-					if (preg_match('/^'.$this->id.'_\d+/', $shipping_key))
-					{
-					
-						$va_id = preg_replace('/^'.$this->id.'_/', '', $shipping_key);				
-						$va = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_VA."` WHERE `id` = '".wpsg_q($va_id)."' ");
-						
-						$kosten_plz = @unserialize($va['kosten_plz']);
-										
-						if (wpsg_isSizedInt($va['vz']) && wpsg_isSizedArray($kosten_plz)) 
-						{
-							
-							$arPLZ = $this->getDefinedPLZAreas($va['vz']);
+			
+			// Hier war die ÃberprÃŒfung drin ob die Versandart ÃŒberhaupt erlaubt ist nur dann wurde berechnet.
+			// Ich habe es rausnehmen mÃŒssen, da sonst bei Kombinationen die Kosten nicht berechnet wurden. Bin mir aber nicht ganz sicher ob es nicht negative Folgen an anderer Stelle hat
+			//if (preg_match('/'.$this->id.'_\d*/', $shipping_key) && array_key_exists($shipping_key, $this->shop->arShipping))
+			if (preg_match('/'.$this->id.'_\d*/', $shipping_key))
+			{
+				
+				$va = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_VA."` WHERE `id` = '".wpsg_q(preg_replace('/^\d*_/', '', $shipping_key))."'");
+				
+				$va = $this->getVaKosten($arBasket, $va);
+				$mwst_value = $this->getTaxValue($va['mwst_key'], $this->shop->getDefaultCountry());
+
+				if ($this->shop->getBackendTaxview() == WPSG_BRUTTO)
+				{
+				
+					$shipping_brutto = $this->calculatePreis($va, $arBasket);
+					$shipping_netto = wpsg_calculatePreis($shipping_brutto, WPSG_NETTO, $mwst_value);
+					
+				}
+				else 
+				{
+					
+					$shipping_netto = $this->calculatePreis($va, $arBasket);
+					$shipping_brutto = wpsg_calculatePreis($shipping_netto, WPSG_BRUTTO, $mwst_value);
+					
+				}
+				
+				if ($arBasket['noMwSt'] == '1') $shipping_brutto = $shipping_netto;
+								 
+				if ($arBasket['noMwSt'] == '1')
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_shipping'] = $shipping_netto;
+					$arBasket['sum']['preis_shipping_brutto'] = $shipping_netto;
+					$arBasket['sum']['preis_shipping_netto'] = $shipping_netto;
+					
+					$arBasket['shipping']['mwst'] = 0;
+					$this->shop->arShipping[$arBasket['checkout']['shipping']]['mwst_value'] = 0;
+					
+					$arBasket['shipping']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// Hier muss ins Backend geschaut werden!  
+					if ($this->shop->getBackendTaxView() == WPSG_BRUTTO)
+					{
+					
+						$this->setShippingKosten($arBasket, $shipping_key, $shipping_brutto, $va['mwst_key']);
+						
+					}
+					else
+					{
+				 
+						$this->setShippingKosten($arBasket, $shipping_key, $shipping_netto, $va['mwst_key']);
+						
+					}
+
+				}
 								
-							foreach ($arPLZ as $plz_index => $plz)
-							{
-								
-								$arPLZ = wpsg_trim(explode(',', $plz));
-								
-								if ($kosten_plz[$plz_index] === 'noshipping' && in_array($arCheckout['plz'], $arPLZ))
-								{
-									
-									$bOKShipping = false;
-									
-								}
-														
-							}
-							
-						}
-						
-					}
-					
-					$bOK = $bOK || $bOKShipping;
-					
-					// Sobald eine Ok ist, kann ich aufhÃ¶ren zu schleifen :D
-					if ($bOK === true) break;
-					
-				}
-				
-				if ($bOK === false)
-				{
-								
-					$error = true;
-					$this->shop->addFrontendError(__('Ein Versand in dieses Postleitzahlengebiet ist nicht mÃ¶glich.'));
-												
-				}
-				
-			}
-						
-		} // public function checkCheckout(&$state, &$error, &$arCheckout)
+			}
+			
+		} // public function calcShipping(&$arBasket) 
 		
 		/**
@@ -449,14 +424,5 @@
 			{
 				
-				$value = 0;
-				
-				foreach ((array)$basket['produkte'] as $p)
-				{
-					
-					$wpsg_product = wpsg_product::getInstance($this->shop->getProduktID($p['id']));
-					
-					if (!$wpsg_product->hasLimitedShipping() || in_array($this->id.'_'.$va['id'], $wpsg_product->getAllowedShipping())) $value += $p['weight'];
-					
-				}
+				$value = $basket['sum']['weight'];
 				
 			}
@@ -464,17 +430,8 @@
 			{
 				
-				$value = 0;
-				
-				foreach ((array)$basket['produkte'] as $p)
-				{
-					
-					$wpsg_product = wpsg_product::getInstance($this->shop->getProduktID($p['id']));
-					
-					if (!$wpsg_product->hasLimitedShipping() || in_array($this->id.'_'.$va['id'], $wpsg_product->getAllowedShipping())) $value += $p['preis'] * $p['menge'];
-					
-				}
-				
-			}
-					
+				$value = $basket['sum']['preis_gesamt'];
+				
+			}
+						
 			$arKosten = explode('|', $kosten);
 			if (sizeof($arKosten) == 1) $kosten = $arKosten[0];
@@ -560,10 +517,10 @@
 			$arPLZ = wpsg_trim(preg_split("/\r|\n/", $this->db->fetchOne("
 				SELECT
-					`param`
+					VZ.`param`
 				FROM
-					`".WPSG_TBL_VZ."` 
+					`".WPSG_TBL_VZ."` AS VZ
 				WHERE
-					`id` = '".wpsg_q($vz_id)."'
-			")??''));
+					VZ.`id` = '".wpsg_q($vz_id)."'
+			")));
 			
 			$arReturn = array();
@@ -602,12 +559,10 @@
 		 * Greift dabei auf die PLZ Unterteilung zurÃŒck
 		 */
-		private function getVaKosten($va) {
-
-		    if (is_admin()) return $va;
-
-		    $arBasket = $this->shop->basket->toArray();
-
-			if ($va['vz'] > 0) {
-
+		private function getVaKosten(&$arBasket, $va)
+		{
+			
+			if ($va['vz'] > 0)
+			{
+				
 				// Alle PLZ Gebiete der Zone laden
 				$arPLZ = $this->getDefinedPLZAreas($va['vz']);
@@ -618,9 +573,11 @@
 				 
 				// Unterteilungen auftrennen
-				foreach ($arPLZ as $k => $v) {
+				foreach ($arPLZ as $k => $v)
+				{
 					
 					$arPLZ[$k] = wpsg_trim(explode(',', $v));
 					
-					foreach ($arPLZ[$k] as $k2 => $v2) {
+					foreach ($arPLZ[$k] as $k2 => $v2) 
+					{
 						
 						// Nur zuordnen wenn auch Kosten angegben wurden
@@ -633,9 +590,11 @@
 				uksort($arPLZ_flatten, array($this, 'sortPLZ'));			
 				$arPLZ_flatten = array_reverse($arPLZ_flatten, TRUE);
-
-				foreach ($arPLZ_flatten as $plz => $value) {
-
-					if (strpos(wpsg_getStr($arBasket['checkout']['plz']), (string)$plz) === 0) {
-
+				
+				foreach ($arPLZ_flatten as $plz => $value)
+				{
+				
+					if (strpos($arBasket['checkout']['plz'], (string)$plz) === 0)
+					{
+						
 						$va['kosten'] = $kosten_plz[$value];				
 						$va['plz'] = $plz; 
@@ -646,8 +605,10 @@
 					
 				}
-
+				
 				return $va;
 				
-			} else {
+			}
+			else
+			{
 
 				// Versandart fÃŒr alle Zonen
@@ -672,2 +633,3 @@
 	} // class wpsg_mod_versandarten extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_videodownload.class.php
===================================================================
--- /mods/wpsg_mod_videodownload.class.php	(revision 5261)
+++ /mods/wpsg_mod_videodownload.class.php	(revision 5261)
@@ -0,0 +1,1315 @@
+<?php
+
+	/**
+	 * Klasse die den Verkauf von individualisierten Videos ermÃ¶glicht
+	 */
+	class wpsg_mod_videodownload extends wpsg_mod_basic
+	{
+		
+		var $lizenz = 2;
+		var $id = 602;
+		
+		var $version = "3.0.0";
+		var $free = false;
+		
+		var $valid_ending = array('avi', 'mp4');
+		var $arMessage = array(); // Meldungen fÃŒr die Bestallansicht
+		var $arError = array(); // Fehlermeldungen fÃŒr die Bestellansicht)
+
+		/**
+		 * Costructor
+		 */
+		public function __construct()
+		{
+			
+			parent::__construct();
+			
+			$this->name = __('VideoDownload', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('ErmÃ¶glicht den Verkauf von individuellen Videos.', 'wpsg');
+						
+		} // public function __construct()
+		
+		public function install()
+		{ 
+			
+			// Grundeinstellungen
+			if ($this->shop->get_option('wpsg_mod_videodownload_command') === false || $this->shop->get_option('wpsg_mod_videodownload_command') == '') $this->shop->update_option('wpsg_mod_videodownload_command', 'ffmpeg -i %in% -acodec copy %filter% %out%');
+			if ($this->shop->get_option('wpsg_mod_videodownload_infocommand') === false || $this->shop->get_option('wpsg_mod_videodownload_infocommand') == '') $this->shop->update_option('wpsg_mod_videodownload_infocommand', 'ffmpeg -i %in%');
+			if ($this->shop->get_option('wpsg_mod_videodownload_filename') === false || $this->shop->get_option('wpsg_mod_videodownload_filename') == '') $this->shop->update_option('wpsg_mod_videodownload_filename', '%filename%');
+			if ($this->shop->get_option('wpsg_mod_videodownload_indiv_mode') === false) $this->shop->update_option('wpsg_mod_videodownload_indiv_mode', '0');
+						
+			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
+			
+			/**
+			 * Tabelle fÃŒr die Anpassungen der Videos
+			 */
+			$sql = "CREATE TABLE ".WPSG_TBL_VIDEOINDIV." (
+				id INT(11) NOT NULL AUTO_INCREMENT,				
+				o_id INT(11) NOT NULL,
+				file VARCHAR(255) NOT NULL,
+				out_file VARCHAR(255) NOT NULL,
+				scheduled DATETIME NOT NULL,
+				cron_start DATETIME NOT NULL,
+				done DATETIME NOT NULL,		
+				counter INT(11) NOT NULL,		
+			  	PRIMARY KEY  (id),
+			  	KEY o_id (o_id)
+			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
+			
+		   	dbDelta($sql);
+			
+		} // public function install()
+		
+		public function delOrder(&$order_id) 
+		{ 
+			
+			$this->db->Query("DELETE FROM `".WPSG_TBL_VIDEOINDIV."` WHERE `o_id` = '".wpsg_q($order_id)."'");
+			
+			$path = $this->getVideoIndivPath($order_id); wpsg_rrmdir($order_id);
+			
+		} // public function delOrder(&$order_id)
+		
+		function wpsg_enqueue_scripts()
+		{
+
+			if (is_admin())
+			{
+				
+				wp_enqueue_script('wpsg_ajaxupload', $this->shop->getRessourceURL('js/ajaxupload.js'));
+				
+			}
+							
+		} // function wpsg_enqueue_scripts()
+		
+		public function settings_edit()
+		{
+
+			$this->shop->view['arTexte'] = @unserialize($this->shop->get_option('wpsg_mod_videodownload_text'));			
+			$this->shop->view['arFonts'] = $this->getFonts();
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/settings_edit.phtml');
+						
+		} // public function settings_edit()
+		
+		public function settings_save() 
+		{
+						
+			$this->shop->update_option('wpsg_mod_videodownload_text', @serialize($_REQUEST['text']));
+			$this->shop->update_option('wpsg_mod_videodownload_command', $_REQUEST['wpsg_mod_videodownload_command']);
+			$this->shop->update_option('wpsg_mod_videodownload_infocommand', $_REQUEST['wpsg_mod_videodownload_infocommand']);
+			$this->shop->update_option('wpsg_mod_videodownload_filename', $_REQUEST['wpsg_mod_videodownload_filename']); 
+			$this->shop->update_option('wpsg_mod_videodownload_indiv_mode', $_REQUEST['wpsg_mod_videodownload_indiv_mode']);
+			$this->shop->update_option('wpsg_mod_videodownload_autosend', $_REQUEST['wpsg_mod_videodownload_autosend']);
+			$this->shop->update_option('wpsg_mod_videodownload_accepted', $_REQUEST['wpsg_mod_videodownload_accepted']);
+			$this->shop->update_option('wpsg_mod_videodownload_days', $_REQUEST['wpsg_mod_videodownload_days']);
+			$this->shop->update_option('wpsg_mod_videodownload_downloads', $_REQUEST['wpsg_mod_videodownload_downloads']);
+			$this->shop->update_option('wpsg_mod_videodownload_videopath', $_REQUEST['wpsg_mod_videodownload_videopath']);
+			$this->shop->update_option('wpsg_mod_videodownload_videoindivpath', $_REQUEST['wpsg_mod_videodownload_videoindivpath']);
+			$this->shop->update_option('wpsg_mod_videodownload_fontpath', $_REQUEST['wpsg_mod_videodownload_fontpath']);
+			$this->shop->update_option('wpsg_mod_videodownload_cleanolddownloads', $_REQUEST['wpsg_mod_videodownload_cleanolddownloads']);
+			$this->shop->update_option('wpsg_mod_videodownload_cleanraiddownloads', $_REQUEST['wpsg_mod_videodownload_cleanraiddownloads']);
+			$this->shop->update_option('wpsg_mod_videodownload_format', $_REQUEST['wpsg_mod_videodownload_format']);
+			 
+		} // public function settings_save()
+		
+		public function order_view_sidebar(&$order_id)
+		{
+			
+			$bVideoProdukt = false;
+			$arFiles = array();
+			
+			foreach ($this->shop->view['basket']['produkte'] as $k => $v)
+			{
+				
+				if (preg_match('/vp_\d+\/\d+\_\d+/', $v['id']))
+				{
+					
+					$produkt_id = preg_replace('/(vp_)|(\/(.*))/', '', $v['id']);
+					
+				}
+				else
+				{
+					
+					$produkt_id = $v['id'];
+						
+				}				
+				
+				if ($this->isVideoProdukt($produkt_id))
+				{
+					
+					$bVideoProdukt = true;
+					$arFiles = wpsg_array_merge($arFiles, $this->getFiles($produkt_id));
+					
+				}
+				
+			}
+			
+			if ($bVideoProdukt && wpsg_isSizedArray($arFiles))
+			{
+				 
+				$arFiles = array_unique($arFiles);
+				
+				foreach ($arFiles as $k => $v)
+				{
+					
+					$db_indiv = $this->db->fetchRow("
+						SELECT 
+							* 
+						FROM 
+							`".WPSG_TBL_VIDEOINDIV."` 
+						WHERE 
+							`file` = '".wpsg_q($v)."' AND
+							`o_id` = '".wpsg_q($order_id)."' 
+					");
+					
+					if ($db_indiv['id'] > 0)
+					{
+						$arFiles[$k] = array($v, $db_indiv);
+					}
+					else
+					{
+						$arFiles[$k] = array($v, false);
+					}
+					
+				}
+				
+				$this->shop->view['arFiles'] = $arFiles;				
+				$this->shop->view['order_id'] = $order_id;
+				
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/order_view_sidebar.phtml');				
+				
+			}
+			
+		} // public function order_view_sidebar(&$order_id) 
+		
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{
+
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			if ($produkt_data['id'] > 0)
+			{
+				
+				$this->shop->view['data'] = $produkt_data;
+				$this->shop->view['filesList'] = $this->renderFilesList($produkt_data['id']);
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/produkt_edit_sidebar.phtml');
+				
+			}
+			
+		} // public function produkt_edit_sidebar(&$produkt_data)
+		
+		public function produkt_ajax() 
+		{
+			
+			if ($_REQUEST['cmd'] == 'upload_file')
+			{
+				
+				$this->fileUpload(wpsg_q($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'videofiles_list')
+			{
+				
+				die($this->renderFilesList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'delete_file')
+			{
+				
+				unlink($this->getVideoPath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['file']));
+				die("1");
+				
+			}
+			else if ($_REQUEST['cmd'] == 'download_file')
+			{
+				
+				header('Content-Disposition: attachment; filename="'.rawurldecode($_REQUEST['file']).'"');
+				
+				die(file_get_contents($this->getVideoPath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['file'])));
+				
+			}
+			
+		} // public function produkt_ajax()
+		 
+		public function order_ajax() { 
+			
+			if ($_REQUEST['cmd'] == 'schedule_file')
+			{
+				
+				$db_indiv = $this->db->fetchRow("
+					SELECT 
+						`id`
+					FROM
+						`".WPSG_TBL_VIDEOINDIV."`
+					WHERE
+						`file` = '".wpsg_q($_REQUEST['file'])."' AND
+						`o_id` = '".wpsg_q($_REQUEST['edit_id'])."' 
+				");
+				
+				$new_name = $this->getNewName($_REQUEST['file'], $_REQUEST['edit_id']);
+				
+				if ($db_indiv['id'] > 0)
+				{
+					
+					$this->db->UpdateQuery(WPSG_TBL_VIDEOINDIV, array(
+						"scheduled" => "NOW()",
+						"out_file" => wpsg_q($new_name)
+					), "`id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+					
+				}
+				else
+				{
+					
+					$this->db->ImportQuery(WPSG_TBL_VIDEOINDIV, array(
+						"o_id" => wpsg_q($_REQUEST['edit_id']),
+						"file" => wpsg_q($_REQUEST['file']),
+						"scheduled" => "NOW()",
+						"out_file" => wpsg_q($new_name)
+					));
+					
+				}
+				
+				$this->arMessage[] = __('Datei wurde geplant.', 'wpsg');
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'reindiv')
+			{
+				
+				$this->indivOrder($_REQUEST['edit_id']);
+				
+				$this->arMessage[] = __('Bestellung wurde geplant.', 'wpsg');
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'reset')
+			{
+				
+				$this->db->UpdateQuery(WPSG_TBL_VIDEOINDIV, array("counter" => "0"), "`o_id` = '".wpsg_q($_REQUEST['edit_id'])."'");
+				
+				$this->arMessage[] = __('DownloadzÃ€hler wurden zurÃŒckgesetzt.', 'wpsg');
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'send_files')
+			{
+				
+				$this->sendFiles($_REQUEST['edit_id']);
+				
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'cancelschedule_file')
+			{
+				
+				$this->db->Query("
+					DELETE FROM
+						`".WPSG_TBL_VIDEOINDIV."`
+					WHERE
+						`file` = '".wpsg_q($_REQUEST['file'])."' AND
+						`o_id` = '".wpsg_q($_REQUEST['edit_id'])."' 
+				");
+				
+				$this->arMessage[] = __('Planung wurde storniert.', 'wpsg');
+				 
+				die($this->order_view_sidebar_renderList($_REQUEST['edit_id']));
+				
+			}
+			else if ($_REQUEST['cmd'] == 'download_indivfile')
+			{
+				
+				header('Content-Disposition: attachment; filename="'.rawurldecode($_REQUEST['file']).'"');
+								
+				die(file_get_contents($this->getPDFIndivPath($_REQUEST['edit_id']).'/'.rawurldecode($_REQUEST['file'])));
+				
+			}
+			
+		} // public function order_ajax()
+
+		public function setOrderStatus($order_id, $status_id, $inform) { 
+			
+			if ($status_id == 100 && $this->shop->get_option('wpsg_mod_videodownload_indiv_mode') == '1')
+			{
+				
+				$this->indivOrder($order_id);
+				
+			}
+			
+		} // public function setOrderStatus($order_id, $status_id, $inform)
+		
+		public function basket_save_done(&$order_id, &$kunden_id, &$oBasket) 
+		{ 
+			
+			if ($this->shop->get_option('wpsg_mod_videodownload_indiv_mode') == '2')
+			{
+
+				$this->indivOrder($order_id);
+				
+			}
+			
+		} // public function basket_save_done($order_id, $kunden_id)
+		
+ 		public function addShipping(&$arShipping) 
+		{ 
+			
+			$arShipping[$this->id] = array(
+				'id' 			=> $this->id,
+				'name' 			=> __('Versand per Mail', 'wpsg'),
+				'preis' 		=> 0,
+				'preis_calc' 	=> 0,			
+				'mwst' 			=> 0,
+				'mwst_value' 	=> 0
+			);
+			 
+		} // public function addShipping(&$arShipping)
+		
+		public function checkShippingAvailable(&$arShipping, &$arBasket) 
+		{ 
+			
+			if (!array_key_exists($this->id, $arShipping)) return;
+			
+			$bVideo = false;
+			
+			foreach ((array)$arBasket['produkte'] as $p)
+			{
+								
+				if ($this->isVideoProdukt($p['id']))
+				{
+					
+					$bVideo = true;
+					
+				} 
+				
+			} 
+			
+			if (!$bVideo)
+			{
+				
+				unset($arShipping[$this->id]);
+				
+			}
+			else
+			{
+				
+				// Wenn Videoprodukt dann alle anderen entfernen
+				foreach ($arShipping as $k => $v) { if ($k != $this->id && $k != 601) { unset($arShipping[$k]); } }
+			  
+			}
+			
+		} // public function checkShippingAvailable(&$arShipping, &$arBasket)
+		
+		public function calcShipping(&$arBasket, $shipping_key) { 
+			
+			$bVideoProdukt = false;
+			
+			foreach ($arBasket['produkte'] as $p)
+			{
+				
+				if ($this->isVideoProdukt($p['id']))
+				{
+					
+					$bVideoProdukt = true;
+					
+				} 
+				
+			} 
+			
+			if ($bVideoProdukt)
+			{
+				 
+				// Es ist ein Videoprodukt drin, also alle anderen Versandarten entfernen
+				foreach ($this->shop->arShipping as $k => $v) { if ($v['id'] != $this->id) unset($this->shop->arShipping[$k]); }
+				 
+			}
+			else
+			{
+
+				// Kein Videoprodukt in der Bestellung also diese Versandart entfernen
+				unset($this->shop->arShipping[$this->id]);
+				
+			}
+			
+		} // public function calcShipping(&$arBasket)
+		
+		public function admin_emailconf() 
+		{ 
+			
+			echo wpsg_drawEMailConfig(
+				'videodownloadfiles',
+				__('Videodownload E-Mail', 'wpsg'),
+				__('E-Mail mit Links zu den Videos die an den Kunden geht.', 'wpsg'));
+								
+			echo wpsg_drawEMailConfig(
+				'videodownloadcronmail', 
+				__('Videodownload Cron E-Mail', 'wpsg'), 
+				__('E-Mail mit Informationen zu der Videoindividualisierung die vom Cron verschickt wird. (An Admin!).', 'wpsg'),
+				true);
+						
+		} // public function admin_emailconf()
+		
+		public function admin_emailconf_save()
+		{
+			
+			wpsg_saveEMailConfig("videodownloadfiles");
+			wpsg_saveEMailConfig("videodownloadcronmail");
+			 
+		} // public function admin_emailconf_save()
+		
+		private function isVideoProdukt($produkt_id)
+		{
+			
+			if (is_numeric($produkt_id))
+			{
+				
+				$arVideos = $this->getFiles($produkt_id);
+				
+				if (sizeof($arVideos) > 0) return true;
+				
+			}
+			
+			return false;
+			
+		} // private function isVideoProdukt($produkt_id)
+		
+		public function order_view_sidebar_renderList($order_id) {
+			
+			$bVideoProdukt = false;
+			$arFiles = array();
+			
+			$arBasket = $this->shop->cache->loadBasketArray($order_id);
+ 						
+			foreach ($arBasket['produkte'] as $k => $v)
+			{
+				
+				if ($this->isVideoProdukt($v['id']))
+				{
+					
+					$bVideoProdukt = true;
+					$arFiles = wpsg_array_merge($arFiles, $this->getFiles($v['id']));
+					
+				}
+				
+			}
+			
+			$arIndivIDs = array();
+			
+			if ($bVideoProdukt && wpsg_isSizedArray($arFiles))
+			{
+				
+				$arFiles = array_unique($arFiles);
+				
+				foreach ($arFiles as $k => $v)
+				{
+					
+					$db_indiv = $this->db->fetchRow("
+						SELECT 
+							* 
+						FROM 
+							`".WPSG_TBL_VIDEOINDIV."` 
+						WHERE 
+							`file` = '".wpsg_q($v)."' AND
+							`o_id` = '".wpsg_q($order_id)."' 
+					");
+										
+					if ($db_indiv['id'] > 0)
+					{
+						
+						$arIndivIDs[] = $db_indiv['id'];
+						
+						$db_indiv['raid'] = false;
+						
+						if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '1' && $db_indiv['counter'] >= $this->shop->get_option('wpsg_mod_videodownload_downloads'))
+						{
+							$db_indiv['raid'] = true;
+						}
+						
+						if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '2' && time() > (strtotime($db_indiv['done']) + ($this->shop->get_option('wpsg_mod_videodownload_days') * 86400)))
+						{
+							$db_indiv['raid'] = true;
+						}
+						
+						$arFiles[$k] = array($v, $db_indiv);
+						
+					}
+					else
+					{
+						$arFiles[$k] = array($v, false);
+					}
+					
+				}
+				
+				// Jetzt noch eventuell individualisierte Videos laden die in den Produkten gelÃ¶scht wurden
+				if (wpsg_isSizedArray($arIndivIDs))
+				{
+				
+					$arDbIndivDeleted = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_VIDEOINDIV."` WHERE `id` NOT IN (".implode(",", $arIndivIDs).") AND `o_id` = '".wpsg_q($order_id)."'");
+					
+					foreach ($arDbIndivDeleted as $v)
+					{
+						
+						$arFiles[] = array($v['file'], $v);
+						
+					}
+					
+				}
+				
+				$this->shop->view['messages'] = $this->arMessage;
+				$this->shop->view['errors'] = $this->arError;
+				$this->shop->view['arFiles'] = $arFiles;
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/order_view_sidebar_renderlist.phtml');				
+				
+			}
+			
+		} // public function order_view_sidebar_renderList($order_id)
+
+		public function wp_loaded()
+		{
+			
+			if ($_REQUEST['wpsg_action'] == 'wpsg_mod_videodownload_download')
+			{
+
+				if (!isset($_REQUEST['hash']) || trim($_REQUEST['hash']) == '') die(__('Kein Kontrollhash!', 'wpsg'));
+				
+				$hash = $this->makeHash($_REQUEST['indi']);
+				
+				if ($_REQUEST['hash'] != $hash) die(__('UngÃŒltiger Kontrollhash!', 'wpsg'));
+				
+				$indiv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_VIDEOINDIV."` WHERE `id` = '".wpsg_q($_REQUEST['indi'])."'");
+				
+				if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '1' && $indiv_db['counter'] >= $this->shop->get_option('wpsg_mod_videodownload_downloads'))
+				{
+					die(__('Sie haben die maximale Anzahl an Downloads ÃŒberschritten.', 'wpsg'));
+				}
+				
+				if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '2' && time() > (strtotime($indiv_db['done']) + ($this->shop->get_option('wpsg_mod_videodownload_days') * 86400)))
+				{
+					die(__('Der Download der Datei ist nicht mehr gÃŒltig.', 'wpsg'));
+				}
+
+				$this->db->UpdateQuery(WPSG_TBL_VIDEOINDIV, array("counter" => wpsg_q($indiv_db['counter'] + 1)), "`id` = '".wpsg_q($_REQUEST['indi'])."'");
+				
+				header('Content-Disposition: attachment; filename="'.rawurldecode($indiv_db['out_file']).'"');				
+				die(file_get_contents($this->getVideoIndivPath($indiv_db['o_id']).'/'.rawurldecode($indiv_db['out_file'])));
+				
+			}
+			else if ($_REQUEST['wpsg_action'] == 'wpsg_mod_videodownload_send')
+			{
+				
+				if (!isset($_REQUEST['hash']) || trim($_REQUEST['hash']) == '') die(__('Kein Kontrollhash!', 'wpsg'));
+				
+				$order = $this->shop->cache->loadOrder($_REQUEST['order']);
+				
+				$hash = md5($order['cdate'].'wpsg'.$order['id']);
+				
+				if ($hash != $_REQUEST['hash']) die(__('UngÃŒltiger Kontrollhash!', 'wpsg'));
+				
+				$this->sendFiles($_REQUEST['order']);
+				
+				die(__('Mail mit Downloadlinks versendet!', 'wpsg'));
+				
+			}
+			
+		}
+		
+		public function cron() { 
+			
+			$arVideosUnindiv = $this->db->fetchAssoc("
+				SELECT
+					*
+				FROM
+					`".WPSG_TBL_VIDEOINDIV."`
+				WHERE
+					`scheduled` != '0000-00-00 00:00:00' AND
+					`done` = '0000-00-00 00:00:00' AND
+					`cron_start` = '0000-00-00 00:00:00'
+			");
+			
+			$arLog = array();
+			
+			foreach ($arVideosUnindiv as $v)
+			{
+				
+				$order_path = $this->getVideoIndivPath($v['o_id']);
+				
+				$arBasket = $this->shop->cache->loadBasketArray($v['o_id']);
+			
+				// Die Datei suchen, da ich das Produkt nicht mitspeichere
+				foreach ($arBasket['produkte'] as $p)
+				{
+					
+					if ($this->isVideoProdukt($p['id']) && in_array($v['file'], $this->getFiles($p['id'])))
+					{
+						
+						$this->db->UpdateQuery(WPSG_TBL_VIDEOINDIV, array('cron_start' => 'NOW()'), "`id` = '".wpsg_q($v['id'])."'");
+						
+						$this->indivVideo(
+							$this->getVideoPath($p['id']).'/'.$v['file'],
+							$this->getVideoIndivPath($v['o_id']).'/'.$v['out_file'],
+							$v['o_id']
+						);
+
+						$this->db->UpdateQuery(WPSG_TBL_VIDEOINDIV, array(
+							"done" => "NOW()"
+						), "`id` = '".wpsg_q($v['id'])."'");
+
+						$arLog[$v['o_id']] ++;
+						
+						break;
+						
+					}
+					
+				}
+				
+			}
+						
+			$arClean = array();
+			
+			// Alte Downloads sÃ€ubern
+			if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '1' && $this->shop->get_option('wpsg_mod_videodownload_cleanraiddownloads') == '1')
+			{
+				
+				$arClean = wpsg_array_merge($arClean, $this->db->fetchAssoc("
+					SELECT
+						*
+					FROM
+						`".WPSG_TBL_VIDEOINDIV."`
+					WHERE
+						`counter` > '".wpsg_q($this->shop->get_option('wpsg_mod_videodownload_downloads'))."'
+				"));
+				
+			}
+			else if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '2' && $this->shop->get_option('wpsg_mod_videodownload_cleanraiddownloads') == '1')
+			{
+
+				$arClean = wpsg_array_merge($arClean, $this->db->fetchAssoc("
+					SELECT
+						*
+					FROM
+						`".WPSG_TBL_VIDEOINDIV."`
+					WHERE
+						DATE_ADD(`done`, INTERVAL ".$this->shop->get_option('wpsg_mod_videodownload_days')." DAY) < NOW()
+				"));
+				
+			}
+			
+			if (intval($this->shop->get_option('wpsg_mod_videodownload_cleanolddownloads')) > 0)
+			{
+				
+				$arClean = wpsg_array_merge($arClean, $this->db->fetchAssoc("
+					SELECT
+						*
+					FROM
+						`".WPSG_TBL_VIDEOINDIV."`
+					WHERE
+						DATE_ADD(`done`, INTERVAL ".$this->shop->get_option('wpsg_mod_videodownload_cleanolddownloads')." DAY) < NOW()
+				"));
+				
+			}
+			
+			if (wpsg_isSizedArray($arClean))
+			{
+				
+				foreach ($arClean as $c)
+				{
+					
+					$path = $this->getVideoIndivPath($c['o_id']);
+					
+					unlink($path.'/'.$c['out_file']);
+					
+					$this->db->Query("DELETE FROM `".WPSG_TBL_VIDEOINDIV."` WHERE `id` = '".wpsg_q($c['id'])."'");
+					
+				}
+				
+			}
+			
+			if (wpsg_isSizedArray($arLog))
+			{
+				
+				$this->shop->view['arOrder'] = $arLog;
+				
+				foreach ($this->shop->view['arOrder'] as $k => $v)
+				{
+					
+					$order = $this->shop->cache->loadOrder($k);
+					
+					$this->shop->view['arOrder'][$k] = array($v, $order, md5($order['cdate'].'wpsg'.$order['id']));
+					
+					if ($this->shop->get_option('wpsg_mod_videodownload_autosend') == '1')
+					{
+						
+						$this->sendFiles($order['id']);
+						
+					}
+					
+				}
+				
+				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/cronmail.phtml', false);
+				
+				if ($this->shop->htmlMail === true)
+				{
+					
+					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/cronmail_html.phtml', false);
+					
+				}
+				else
+				{
+					
+					$mail_html = false;
+					
+				}
+				
+				$this->shop->sendMail($mail_text, $this->shop->get_option('wpsg_videodownloadcronmail_empfaenger'), 'videodownloadcronmail', false, false, $mail_html);
+				
+			}
+			
+		} // public function cron()
+		
+		/**
+		 * Sendet die Mail mit den Downloadlinks an den Kunden
+		 */
+		public function sendFiles($order_id)
+		{
+			
+			$this->shop->view['arVideos'] = $this->db->fetchAssoc("
+				SELECT
+					*
+				FROM
+					`".WPSG_TBL_VIDEOINDIV."`
+				WHERE
+					`o_id` = '".wpsg_q($order_id)."' AND
+					`done` != '0000-00-00 00:00:00'
+			");
+			
+			foreach ($this->shop->view['arVideos'] as $k => $v)
+			{
+				
+				// Download noch gÃŒltig
+				if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '1' && $v['counter'] >= $this->shop->get_option('wpsg_mod_videodownload_downloads'))
+				{
+					unset($this->shop->view['arVideos'][$k]);
+				}
+				else if ($this->shop->get_option('wpsg_mod_videodownload_accepted') == '2' && time() > (strtotime($v['done']) + ($this->shop->get_option('wpsg_mod_videodownload_days') * 86400)))
+				{
+					unset($this->shop->view['arVideos'][$k]);
+				}
+				else 
+				{
+					$this->shop->view['arVideos'][$k]['hash'] = $this->makeHash($v['id']);
+				}
+				
+			}
+			
+			if (sizeof($this->shop->view['arVideos']) > 0)
+			{
+						
+				$this->shop->view['order'] = $this->shop->cache->loadOrder($order_id);
+				$this->shop->view['kunde'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']);
+							
+				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/videodownloadmail.phtml', false);
+				
+				if ($this->shop->htmlMail === true)
+				{
+					
+					$mail_html = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/videodownloadmail_html.phtml', false);
+					
+				}
+				else
+				{
+					
+					$mail_html = false;
+					
+				}
+				
+				$this->shop->sendMail($mail_text, $this->shop->view['kunde']['email'], 'videodownloadfiles', array(), false, false, $mail_html);
+				
+				$this->db->ImportQuery(WPSG_TBL_OL, array(
+					"o_id" => wpsg_q($order_id),
+					"cdate" => "NOW()",
+					"title" => wpsg_translate(__('Videodownloads an:#1#', 'wpsg'), $this->shop->view['kunde']['email']),
+					"mailtext" => wpsg_q($mail_text)
+				));
+
+				$this->arMessage[] = __('E-Mail erfolgreich gesendet.', 'wpsg');
+				
+			}
+			else 
+			{
+				
+				$this->arError[] = __('Keine gÃŒltigen Downloads.', 'wpsg');
+				
+			}			
+			
+		} // public function sendFiles($order_id)
+		
+		/**
+		 * Individualisiert die Videos fÃŒr eine Bestellung
+		 */
+		public function indivOrder($order_id)
+		{
+			
+			$arBasket = $this->shop->cache->loadBasketArray($order_id);
+				
+			$bVideoProdukt = false;
+			$arVideos = array();
+				
+			foreach ($arBasket['produkte'] as $p)
+			{
+				
+				if ($this->isVideoProdukt($p['id']))
+				{
+					
+					$bVideoProdukt = true;
+					$arVideos = wpsg_array_merge($arVideos, $this->getFiles($p['id']));						
+					
+				}
+				
+			}
+			
+			if ($bVideoProdukt === true && wpsg_isSizedArray($arVideos))
+			{
+				
+				foreach ($arVideos as $v)
+				{
+					
+					$this->db->Query("DELETE FROM `".WPSG_TBL_VIDEOINDIV."` WHERE `file` = '".wpsg_q($v)."' AND `o_id` = '".wpsg_q($order_id)."'");
+					
+					$this->db->ImportQuery(WPSG_TBL_VIDEOINDIV, array(
+						"o_id" => wpsg_q($order_id),
+						"file" => wpsg_q($v),
+						"scheduled" => wpsg_q("NOW()"),
+						"done" => wpsg_q("0000-00-00 00:00:00"),
+						"out_file" => wpsg_q($this->getNewName($v, $order_id))
+					));
+					
+				}
+				
+			}
+			
+		} // public function indivOrder($order_id)
+		
+		/** 
+		 * Baut den Kontroll Hash
+		 */
+		private function makeHash($indiv_id)
+		{
+			
+			$indiv_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_VIDEOINDIV."` WHERE `id` = '".wpsg_q($indiv_id)."'");
+			if ($indiv_db['id'] <= 0) return false;
+			
+			$order = $this->shop->cache->loadOrder($indiv_db['o_id']);
+			if ($order['id'] <= 0) return false;
+			
+			$strHash = md5($order['cdate'].'wpsg'.$indiv_db['cdate'].$indiv_db['file']);
+			
+			return $strHash;
+			
+		} // private function makeHash($indiv_id)
+		
+		/**
+		 * Individualisiert das Video $src_file und speichert es unter $trg_file, Absolute Pfade
+		 */
+		private function indivVideo($src_file, $trg_file, $order_id)
+		{
+ 
+			ini_set('memory_limit', '2000M');			
+			set_time_limit(0);
+			
+			$layer_img = $this->getOverlayImage($src_file, $order_id);
+			
+			//C:\Users\Daschmi\Desktop\ffmpeg-20120804-git-f857465-win64-shared\ffmpeg-20120804-git-f857465-win64-shared\bin\ffmpeg.exe -y -i %in% -strict -2 %filter% -vcodec libx264 %out%
+			//ffmpeg -i 19542479.mp4 -strict -2 -vf "movie=alphatest.png [watermark]; [in][watermark] overlay=1:1 [out]" outputvideo.mp4
+			$arReplace = array(
+				'/%in%/' => $src_file,
+				'/%filter%/' => '-vf "movie='.$layer_img.' [watermark]; [in][watermark] overlay=0:0 [out]"',
+				'/%out%/' => $trg_file
+			);
+			
+			unlink($trg_file);
+			
+			$cmd = $this->shop->get_option('wpsg_mod_videodownload_command');
+			$cmd = preg_replace(array_keys($arReplace), array_values($arReplace), $cmd);	
+			 
+			$out = $this->shop->exec($cmd);
+			
+			$zipfile = preg_replace('/\.[^\.]*$/', '', $trg_file).'.zip';
+			
+			if ($this->shop->get_option('wpsg_mod_videodownload_format') == '1')
+			{
+				
+				// Zip Intern
+				$zip = new ZipArchive();
+				$zip->open($zipfile, ZipArchive::CREATE);				
+				$zip->addFile($file, basename($trg_file));				
+				$zip->close();				
+				
+				// Original lÃ¶schen
+				unlink($trg_file);
+				
+			}
+			else if ($this->shop->get_option('wpsg_mod_videodownload_format') == '2')
+			{
+				
+				// Zip Extern
+				$out = $this->shop->exec('zip '.$zipfile.' '.$trg_file);
+				
+				// Original lÃ¶schen
+				unlink($trg_file);
+				
+			}
+			 			
+		} // private function indivVideo($src_file, $trg_file)
+		
+		/**
+		 * Generiert das Bild, welches ÃŒber das Video gelegt wird 
+		 */
+		private function getOverlayImage($video_file, $order_id)
+		{
+			
+			$image_file = $this->shop->getTempName('.png');
+			
+			list($width, $height) = $this->getVideoSize($video_file);
+			
+			$img = ImageCreateTruecolor($width, $height);
+			
+			imagealphablending($img, false);
+			imagesavealpha($img, true);
+			
+			// Bild mit transparentem Hintergrund fÃŒllen
+			$trans_color = imagecolorallocatealpha($img, 255, 255, 255, 127);
+  			imagefill($img, 0, 0, $trans_color);
+  			
+  			$arTexte = @unserialize($this->shop->get_option('wpsg_mod_videodownload_text'));
+  			
+  			if (wpsg_isSizedArray($arTexte))
+  			{
+  				
+  				foreach ($arTexte as $t)
+  				{
+  					
+  					if ($t['aktiv'] == 1)
+  					{
+  						
+  						$x = $t['x'];
+  						$y = $t['y'];
+  						$font = rawurldecode($t['font']);
+  						$angle = $t['angle'];
+  						$fontsize = $t['fontsize'];
+  						$color = $t['color'];
+  						$text = $t['text'];
+  						
+  						$text = $this->shop->replaceUniversalPlatzhalter($text, $order_id);
+  						
+  						if (file_exists($this->shop->get_option('wpsg_mod_videodownload_fontpath').'/'.$font)) $font = $this->shop->get_option('wpsg_mod_videodownload_fontpath').'/'.$font;
+  						else if (file_exists(WPSG_PATH_USERVIEW_OLD.'/mods/mod_videodownload/fonts/'.$font)) $font = WPSG_PATH_USERVIEW_OLD.'/mods/mod_videodownload/fonts/'.$font;
+  						else if (file_exists(WPSG_PATH_VIEW.'/mods/mod_videodownload/fonts/'.$font)) $font = WPSG_PATH_VIEW.'/mods/mod_videodownload/fonts/'.$font;
+  						else continue;
+  						 
+						list($r, $g, $b) = wpsg_getColor($color);
+						
+  						$color = imagecolorallocatealpha($img, $r, $g, $b, 127 - wpsg_tf($t['alpha'] * 127));
+  
+  						if ($angle == '') $angle = 0;
+
+  						$posInfo = imagettfbbox($fontsize, 0, $font, $text);
+						
+  						$text_width = $posInfo[2] - $posInfo[0];
+  						$text_height = $posInfo[1] - $posInfo[7];
+  						
+  						if ($t['align'] == '1')
+  						{
+  							
+  							$neg_offset_x = cos($angle * M_PI / 180) * ($text_width / 2);
+  							$pos_offset_y = sin($angle * M_PI / 180) * ($text_width / 2);
+  							  							
+  						}
+  						else 
+  						{
+  							
+  							$pos_offset_y = $text_height;
+  							
+  						}
+  						
+  						$x -= $neg_offset_x;
+  						$y += $pos_offset_y;
+  						
+  						ImageTTFText($img, $fontsize, $angle, $x, $y, $color, $font, $text);
+  						
+  					}
+  					
+  				}
+  				
+  			}
+  			
+  			imagepng($img, $image_file);
+			
+			return $image_file;
+			
+		} // private function getOverlayImage($video_file)
+		
+		/**
+		 * Scant das Font Verzeichnis
+		 */
+		private function getFonts()
+		{
+			
+			$arFonts = array();
+			
+			$handle = @opendir($this->shop->get_option('wpsg_mod_videodownload_fontpath').'/');
+			if ($handle) { while ($file = readdir($handle))
+			{
+				if (is_file($this->shop->get_option('wpsg_mod_videodownload_fontpath').'/'.$file) && preg_match('/(.*).ttf$/i', $file))
+				{
+					
+					$arFonts[] = $file;
+					
+				}
+			} }
+			@closedir($handle);
+			
+			$handle = @opendir(WPSG_PATH_USERVIEW_OLD.'/mods/mod_videodownload/fonts/');
+			if ($handle) { while ($file = readdir($handle))
+			{
+				if (is_file(WPSG_PATH_USERVIEW_OLD.'/mods/mod_videodownload/fonts/'.$file) && preg_match('/(.*).ttf$/i', $file) && in_array($file, $arFonts))
+				{
+					
+					$arFonts[] = $file;
+					
+				}
+			} }
+			@closedir($handle);
+			
+			$handle = @opendir(WPSG_PATH_VIEW.'/mods/mod_videodownload/fonts/');			
+			if ($handle) { while ($file = readdir($handle))
+			{
+				if (is_file(WPSG_PATH_VIEW.'/mods/mod_videodownload/fonts/'.$file) && preg_match('/(.*).ttf$/i', $file) && !in_array($file, $arFonts))
+				{
+					
+					$arFonts[] = $file;
+					
+				}
+			} }
+			@closedir($handle);
+			
+			return $arFonts;
+			
+		} // private function getFonts()
+		
+		/**
+		 * Gibt die AuflÃ¶sung eines Videofiles zurÃŒck
+		 */
+		private function getVideoSize($video_file)
+		{
+			
+			$out = array();
+			$cmd = $this->shop->get_option('wpsg_mod_videodownload_infocommand');
+			
+			$arReplace = array(
+				'/%in%/' => $video_file
+			);
+			
+			$cmd = preg_replace(array_keys($arReplace), array_values($arReplace), $cmd);
+			
+			$out = $this->shop->exec($cmd);
+			
+			preg_match('/\040\d+x\d+\040/', $out, $treffer);
+			
+			return explode('x', $treffer[0]);
+			
+		} // public function getVideoSize($video_file)
+		
+		/**
+		 * Zeichnet die Dateiliste der Videos
+		 */
+		private function renderFilesList($produkt_id)
+		{
+			
+			$this->shop->view['files'] = $this->getFiles($produkt_id);			
+			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_videodownload/filelist.phtml', false);
+			
+		} // private function renderFilesList($produkt_id)
+		
+		/**
+		 * Gibt die Videodateien eines Produktes zurÃŒck
+		 */
+		private function getFiles($produkt_id)
+		{
+
+			$path = $this->getVideoPath($produkt_id);
+			
+			if (!file_exists($path)) return;
+
+			$arrFiles = scandir($path);
+			$arVideoFiles = array();
+			
+			foreach ($arrFiles as $file)
+			{
+				
+				if (is_file($path.$file) && in_array(strtolower(preg_replace('/(.*)\./', '', $file)), $this->valid_ending))
+				{
+					
+					$arVideoFiles[] = $file;
+					
+				}
+				
+			}
+			
+			return $arVideoFiles;
+			
+		} // private function getFiles($produkt_id)
+		
+		/** 
+		 * lÃ€dt eine Datei in das entspr. upload Verzeichnis
+		 */
+		private function fileUpload($produkt_id)
+		{
+			
+			if (file_exists($_FILES['videofiles']['tmp_name']))
+			{
+				
+				$ending = strtolower(preg_replace('/(.*)\./', '', $_FILES['videofiles']['name']));
+				
+				if (!in_array($ending, $this->valid_ending))
+				{
+
+					die(__('UngÃŒltige Dateiendung.', 'wpsg'));
+					
+				}
+				else
+				{
+				
+					$uploaddir = $this->getVideoPath($produkt_id);				
+					if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
+				
+					$uploadfile = $uploaddir.basename($_FILES['videofiles']['name']);					
+					move_uploaded_file($_FILES['videofiles']['tmp_name'], $uploadfile);
+				
+					die('1');
+					
+				}
+				
+			}
+			else 
+			{
+			
+				die(__('Fehler beim Upload.', 'wpsg'));
+				
+			}
+			
+		} // private function fileUpload($produkt_id)
+				
+		/**
+		 * Gibt den Individualisierten Dateinamen fÃŒr ein File und Bestellung zurÃŒck
+		 */
+		public function getNewName($oldFilename, $order_id)
+		{
+			
+			$arReplace = array(
+				'/%filename%/' => $oldFilename,
+				'/%filename_clear%/' => preg_replace('/\.(.*)$/', '', $oldFilename)
+			);
+			
+			$newFilename = $this->shop->replaceUniversalPlatzhalter($this->shop->get_option('wpsg_mod_videodownload_filename'), $order_id, false, false, false, $arReplace);
+												
+			return $newFilename;
+			
+		} // public function getNewName($oldFilename, $order_id)
+		
+		/**
+		 * Gibt den Pfad zu dem Ordner zurÃŒck in dem die Videos abgelegt werden
+		 */
+		public function getVideoPath($produkt_id)
+		{
+
+			if ($this->shop->get_option('wpsg_mod_videodownload_videopath') !== false && trim($this->shop->get_option('wpsg_mod_videodownload_videopath')) != '')
+			{
+
+				$path = $this->shop->get_option('wpsg_mod_videodownload_videopath').'/'.$produkt_id.'/';
+				
+			}
+			else
+			{
+			
+				if ($this->shop->isMultiBlog())
+				{
+					
+					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_videoprodukte/'.$produkt_id.'/'; 
+						
+				}
+				else
+				{
+						 
+					$path = WP_CONTENT_DIR.'/uploads/wpsg_videoprodukte/'.$produkt_id.'/';
+										
+				}
+				
+			}
+			
+			if (!file_exists($path))
+			{
+				
+				mkdir($path, 0777, true);
+				
+				$handle = fopen($path.'.htaccess', "w+");
+				$content = "Deny from all";			
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+					
+			return $path;
+			
+		} // public function getVideoPath($produkt_id)
+		
+		/**
+		 * Gibt den Pfad zurÃŒck wo die Individualisierten Videos einer Bestellung liegen
+		 */
+		public function getVideoIndivPath($order_id)
+		{
+
+			if ($this->shop->get_option('wpsg_mod_videodownload_videoindivpath') !== false && trim($this->shop->get_option('wpsg_mod_videodownload_videoindivpath')) != '')
+			{
+
+				$path = $this->shop->get_option('wpsg_mod_videodownload_videoindivpath').'/'.$order_id.'/';
+				
+			}
+			else
+			{
+				
+				if ($this->shop->isMultiBlog())
+				{
+					
+					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_videoprodukte_order/'.$order_id.'/'; 
+										
+				}
+				else
+				{
+						 
+					$path = WP_CONTENT_DIR.'/uploads/wpsg_videoprodukte_order/'.$order_id.'/';
+									
+				}
+				
+			}
+			
+			if (!file_exists($path))
+			{
+				
+				mkdir($path, 0777, true);
+				
+				$handle = fopen($path.'.htaccess', "w+");
+				$content = "Deny from all";			
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+				
+			return $path;
+			
+		} // public function getVideoIndivPath($order_id)
+		
+	} // class wpsg_mod_videodownload extends wpsg_mmod_basic
+
+?>
Index: /mods/wpsg_mod_voucherproduct.class.php
===================================================================
--- /mods/wpsg_mod_voucherproduct.class.php	(revision 8528)
+++ /mods/wpsg_mod_voucherproduct.class.php	(revision 5261)
@@ -12,10 +12,10 @@
 		var $free = false;
 		var $hilfeURL = 'http://wpshopgermany.maennchen1.de/?p=2908';		
-		var $iv = '';
-		
-		public function __construct() {
+		
+		public function __construct()
+		{
 			
 			parent::__construct();
-
+			
 			$this->name = __('GutscheinProdukt', 'wpsg');
 			$this->group = __('Produkte', 'wpsg');
@@ -23,12 +23,5 @@
 			
 		} // public function __construct()
-
-		public function init() {
-
-			if (!isset($_SESSION['wpsg']['wpsg_mod_voucherproduct_iv'])) $_SESSION['wpsg']['wpsg_mod_voucherproduct_iv'] = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES128'));
-			$this->iv = $_SESSION['wpsg']['wpsg_mod_voucherproduct_iv'];
-
-		}
-
+		
 		public function install()
 		{
@@ -39,9 +32,5 @@
 			  	wpsg_mod_voucherproduct_gs INT(11) NOT NULL,			  	
 			  	wpsg_mod_voucherproduct_gslaenge INT(11) NOT NULL,
-			  	wpsg_mod_voucherproduct_available INT(11) NOT NULL,
-			  	wpsg_mod_voucherproduct_coupon INT(1) NOT NULL COMMENT 'Wenn 1, dann wird ein Wertgutschein generiert.',
-			  	wpsg_mod_voucherproduct_flexprice INT(1) NOT NULL COMMENT '1 Wenn der Preis fÃŒr dieses Gutscheinprodukt flexibel durch den Kunden definiert werden kann',
-			  	wpsg_mod_voucherproduct_flexprice_min DOUBLE(10, 2) NOT NULL COMMENT 'Minimaler Preis bei Flexiblem Preis',
-			  	wpsg_mod_voucherproduct_flexprice_max DOUBLE(10, 2) NOT NULL COMMENT 'Maximaler Preis bei Flexiblem Preis'
+			  	wpsg_mod_voucherproduct_available INT(11) NOT NULL
 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
 			
@@ -109,8 +98,8 @@
 		public function settings_save() 
 		{
-
-		    $this->shop->update_option('wpsg_mod_voucherproduct_texte', $_REQUEST['text']);
-			$this->shop->update_option('wpsg_voucherproduct_width', $_REQUEST['wpsg_voucherproduct_width'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_voucherproduct_height', $_REQUEST['wpsg_voucherproduct_height'], false, false, WPSG_SANITIZE_TEXTFIELD);
+			
+			$this->shop->update_option('wpsg_mod_voucherproduct_texte', $_REQUEST['text']);
+			$this->shop->update_option('wpsg_voucherproduct_width', $_REQUEST['wpsg_voucherproduct_width']);
+			$this->shop->update_option('wpsg_voucherproduct_height', $_REQUEST['wpsg_voucherproduct_height']);
 			
 			// Briefpapier
@@ -144,5 +133,6 @@
 					
 			}
-			else if (($_REQUEST['wpsg_mod_voucherproduct_bp_del']??'0') === "1") {
+			else if ($_REQUEST['wpsg_rechnungen_bp_del'] == "1")
+			{
 
 				@unlink($this->getFilePath('').'bp.jpg');
@@ -160,24 +150,10 @@
 		} // public function settings_save()
 		
-		public function produkt_save_before(&$produkt_data) { 
-			
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_voucherproduct_gs'], WPSG_SANITIZE_CHECKBOX)) $produkt_data['wpsg_mod_voucherproduct_gs'] = wpsg_q($_REQUEST['wpsg_mod_voucherproduct_gs']);
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_voucherproduct_gslaenge'], WPSG_SANITIZE_INT)) $produkt_data['wpsg_mod_voucherproduct_gslaenge'] = wpsg_q($_REQUEST['wpsg_mod_voucherproduct_gslaenge']);
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_voucherproduct_available'], WPSG_SANITIZE_INT)) $produkt_data['wpsg_mod_voucherproduct_available'] = wpsg_q($_REQUEST['wpsg_mod_voucherproduct_available']);			
-			if (wpsg_checkInput($_REQUEST['wpsg_mod_voucherproduct_coupon'], WPSG_SANITIZE_CHECKBOX)) $produkt_data['wpsg_mod_voucherproduct_coupon'] = wpsg_q($_REQUEST['wpsg_mod_voucherproduct_coupon']);
-			
-			wpsg_checkRequest('wpsg_mod_voucherproduct_flexprice', [WPSG_SANITIZE_CHECKBOX], __('Flexibler Preis', 'wpsg'), $produkt_data);
-			wpsg_checkRequest('wpsg_mod_voucherproduct_flexprice_min', [WPSG_SANITIZE_FLOAT], __('Minimaler flexibler Preis', 'wpsg'), $produkt_data);
-			wpsg_checkRequest('wpsg_mod_voucherproduct_flexprice_max', [WPSG_SANITIZE_FLOAT], __('Maximaler flexibler Preis', 'wpsg'), $produkt_data);
-			
-			if ($produkt_data['wpsg_mod_voucherproduct_flexprice'] === '1') {
-				
-				if (!in_array(wpsg_getStr($produkt_data['basket_multiple']), ['1', '2'])) {
-					
-					$this->shop->addBackendError(__('Das Produkt sollte bei flexiblem Preis bei "Verhalten im Warenkorb" auf "Mehrfach" stehen.', 'wpsg'));
-					
-				}
-								
-			}
+		public function produkt_save_before(&$produkt_data) 
+		{ 
+			
+			$produkt_data['wpsg_mod_voucherproduct_gs'] = wpsg_q($_REQUEST['wpsg_mod_voucherproduct_gs']);			
+			$produkt_data['wpsg_mod_voucherproduct_gslaenge'] = intval($_REQUEST['wpsg_mod_voucherproduct_gslaenge']);
+			$produkt_data['wpsg_mod_voucherproduct_available'] = intval($_REQUEST['wpsg_mod_voucherproduct_available']);
 			
 		} // public function produkt_save_before(&$produkt_data)
@@ -186,9 +162,6 @@
 		{ 
 			
-			if ($status_id == 100 && !wpsg_isSizedInt($GLOBALS['wpsg_mod_voucher_send'])) {
-				
-				// Zahlung eingegangen
-				
-				$GLOBALS['wpsg_mod_voucher_send'] = true;
+			if ($status_id == 100) // Zahlung eingegangen
+			{
 				
 				$order_data = $this->shop->cache->loadOrder($order_id);
@@ -202,5 +175,5 @@
 						OP.`product_index`,
 						OP.`menge`,
-						OP.`price_netto`, OP.`price_brutto`
+						OP.`price`
 					FROM
 						`".WPSG_TBL_ORDERPRODUCT."` AS OP
@@ -222,29 +195,12 @@
 						$produkt_data = $this->shop->loadProduktArray($p['id']);
 						
-						for ($i = 1; $i <= $p['menge']; $i ++) {
-							 
-							$price = \apply_filters('wpsg_voucher_price', $p['price_brutto'], $p['order_product_id']);
-							
-							//public function genGS(
-							// $value,
-							// $calc_typ,
-							// $tStart,
-							// $tEnd,
-							// $multi,
-							// $laenge,
-							// $comment,
-							// $autocreate_order = 0,
-							// $autocreate_product = 0,
-							// $autocreate_order_product,
-							// $productgroups = array(),
-							// $products = array(),
-							// $minValue = false,
-							// $code = false,
-							// $isCoupon = false)						 
+						for ($i = 1; $i <= $p['menge']; $i ++)
+						{
+													 
 							$code = $this->shop->callMod('wpsg_mod_gutschein', 'genGS', array(
-								$price,
+								$p['price'],
 								'w',
-								 mktime(0, 0, 0,intval(date('n')), intval(date('j')), intval(date('Y'))), 
-								wpsg_time() + (86400 * $p['wpsg_mod_voucherproduct_available']), 
+								time(), 
+								time() + (86400 * $p['wpsg_mod_voucherproduct_available']), 
 								0, 
 								$p['wpsg_mod_voucherproduct_gslaenge'],
@@ -252,12 +208,7 @@
 								$order_id,
 								$p['id'],
-								$p['order_product_id'],
-								[], // $arProductGroups
-								[], // $products
-								false, // $minValue
-								false, // $code
-								wpsg_isSizedInt($p['wpsg_mod_voucherproduct_coupon'])
+								$p['order_product_id']
 							));
-							 
+							
 							$arGSFiles[] = array(
 								'file' => $this->genGSDokument($code, $order_id, $p['id'], false, $p['product_index']),
@@ -284,5 +235,5 @@
 					$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/gutschein_mail.phtml', false);
 				
-					if ($this->shop->get_option('wpsg_htmlmail') === '1')
+					if ($this->shop->htmlMail === true)
 					{
 						
@@ -309,5 +260,5 @@
 						"o_id" => wpsg_q($order_id),
 						"title" => wpsg_translate(__("Gutscheinmail an: #1#", "wpsg"), $empfaenger),
-						"mailtext" => $mail_text
+						"mailtext" => $nachricht
 					));
 
@@ -364,123 +315,10 @@
 		} // public function setOrderStatus($order_id, $status_id, $inform)
 		
-		public function product_bottom(&$product_key, $template_index) {
-
-		    $product_id = $this->shop->getProduktID($product_key);
-
-			$oProduct = wpsg_product::getInstance($product_id);
-			
-			if ($oProduct->__get('wpsg_mod_voucherproduct_flexprice') === '1' && $oProduct->__get('wpsg_mod_voucherproduct_gs') === '1') {
-			
-				$this->shop->view['oProduct'] = $oProduct;
-				
-				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/product_bottom.phtml');
-				
-			}
-			
-		}
-		
-		public function basket_preMultiple($product_index) {
-			
-			if (isset($_SESSION['wpsg']['basket'][$product_index]['price_code'])) {
-				
-				$data = \json_decode(\openssl_decrypt($_SESSION['wpsg']['basket'][$product_index]['price_code'],'AES128', $this->shop->get_option('wpsg_salt'), 0, $this->iv), true);
-				
-				if (isset($data['price']) && !isset($_REQUEST['wpsg_mod_voucherproduct_value'])) {
-					
-					$_REQUEST['wpsg_mod_voucherproduct_value'] = $data['price'];
-					
-				} 
-				
-			} 
-			
-		}
-		
-		public function basket_produkttosession($produkt_key, &$menge, &$ses_data) {
-						
-			$oProduct = wpsg_product::getInstance($produkt_key);
-			
-			if ($oProduct->__get('wpsg_mod_voucherproduct_flexprice') === '1' && $oProduct->__get('wpsg_mod_voucherproduct_gs') === '1') {
-			
-				$flex = intval($oProduct->__get('wpsg_mod_voucherproduct_flexprice'));
-				$flex_min = wpsg_tf($oProduct->__get('wpsg_mod_voucherproduct_flexprice_min'));
-				$flex_max = wpsg_tf($oProduct->__get('wpsg_mod_voucherproduct_flexprice_max'));
-				
-				if ($flex === 1) {
-				
-					if (wpsg_checkInput($_REQUEST['wpsg_mod_voucherproduct_value'], WPSG_SANITIZE_FLOAT)) {
-						
-						$value = wpsg_tf($_REQUEST['wpsg_mod_voucherproduct_value']);
-						
-						if ($flex_min > 0 && $value < $flex_min) {
-							
-							$this->shop->addFrontendError(wpsg_translate(
-								__('Der Gutscheinwert muss mindestens #1# #2# betragen.', 'wpsg'),
-								wpsg_ff($flex_min),
-								$this->shop->get_option('wpsg_currency')
-							));
-							
-							return -2;
-							
-						} else if ($flex_max > 0 && $value > $flex_max) {
-							
-							$this->shop->addFrontendError(wpsg_translate(
-								__('Der Gutscheinwert darf nicht mehr als #1# #2# betragen.', 'wpsg'),
-								wpsg_ff($flex_max),
-								$this->shop->get_option('wpsg_currency')
-							));
-							
-							return -2;
-							
-						}
-						
-					} else {
-						
-						$this->shop->addFrontendError(__('UngÃŒltige Eingabe im Feld "Gutscheinwert".', 'wpsg'));
-						
-						return -2;					
-						
-					}
-					
-					$code = openssl_encrypt(json_encode([
-						'price' => wpsg_tf($value),					
-					]),'AES128', $this->shop->get_option('wpsg_salt'), 0, $this->iv);
-
-					$ses_data['price_code'] = $code;
-					
-				}
-			
-			}
-			
-			return 0;
-						
-		}
-		
-		public function calculation_addProduct(&$product_data, $ses_data) {
-			
-			if (isset($ses_data['price_code'])) {
-				
-				$data = \json_decode(\openssl_decrypt($ses_data['price_code'],'AES128', $this->shop->get_option('wpsg_salt'), 0, $this->iv), true);
-
-				//echo "=".$ses_data['price_code']."  ".$this->shop->get_option('wpsg_salt'). "  ".$this->iv;
-				//die(\openssl_decrypt($ses_data['price_code'],'AES128', $this->shop->get_option('wpsg_salt'), 0, $this->iv));
-
-				$product_data['set'] = $data['price'];
-				$product_data['bruttonetto'] = $this->shop->getFrontendTaxview();
-				
-			}
-			
-		} // public function calculation_addProduct(&$product_data, $ses_data)
-		
-		/*
-		 * zeigt die Gutscheinprodukte im Produktbackend an
-		*/
-		public function product_addedit_content(&$product_content, &$product_data) {
-		
-			$product_content['wpsg_mod_voucherprudct'] = array(
-				'title' => __('Gutscheinprodukte', 'wpsg'),
-				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/produkt_edit_sidebar.phtml', false)
-			);
-		
-		} //public function product_addedit_content(&$product_content, &$product_data)
+		public function produkt_edit_sidebar(&$produkt_data) 
+		{ 
+		
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/produkt_edit_sidebar.phtml');
+			
+		} // public function produkt_edit_sidebar(&$produkt_data) 
 		
 		public function admin_emailconf_save()
@@ -502,10 +340,9 @@
 		
 		public function order_ajax() 
-		{
-
+		{ 
+			
 			if ($_REQUEST['cmd'] == 'sendVoucher')
 			{
-
-				$_REQUEST['order_id'] = wpsg_sinput("key", $_REQUEST['order_id']);
+				
 				$order_id = $_REQUEST['order_id'];
 				
@@ -530,18 +367,15 @@
 				}
 				
-				$this->shop->view['basket'] = $this->shop->cache->loadBasketArray($_REQUEST['order_id']);
-				
 				$arGSFiles = array();
-				$i = 0;
 				foreach ($arGS as $gs)
 				{
 					
 					$arGSFiles[] = array(
-						'file' => $this->getFilePath($_REQUEST['order_id']).'gutschein_'.$gs['code'].'.pdf',
+						'file' => $this->getFilePath($_REQUEST['order_id']).'voucher_'.$gs['code'].'.pdf',
 						'code' => $gs['code'],
-						'product_id' => $this->shop->view['basket']['produkte'][$i]['id'],
-						'product_data' => array('name' => $this->shop->view['basket']['produkte'][$i]['name'])
+						'product_id' => -1,
+						'product_data' => array()
 					);
-					$i++;
+					
 				}
 								
@@ -550,4 +384,5 @@
 				$this->shop->view['order_id'] = $_REQUEST['order_id'];					
 				$this->shop->view['customer'] = $this->shop->cache->loadKunden($this->shop->view['order']['k_id']); 
+				$this->shop->view['basket'] = $this->shop->cache->loadBasketArray($_REQUEST['order_id']);
 				
 				$mail_text = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/gutschein_mail.phtml', false);
@@ -578,5 +413,5 @@
 					"o_id" => wpsg_q($_REQUEST['order_id']),
 					"title" => wpsg_translate(__("Gutscheinmail an: #1#", "wpsg"), $empfaenger),
-					"mailtext" => $mail_text
+					"mailtext" => $nachricht
 				));
 
@@ -593,5 +428,5 @@
 				if ($gs_data['id'] <= 0) die(__('Gutschein nicht gefunden!', 'wpsg'));
 				
-				$filename = $this->getFilePath($_REQUEST['order_id']).'gutschein_'.$gs_data['code'].'.pdf';
+				$filename = $this->getFilePath($_REQUEST['order_id']).'voucher_'.$gs_data['code'].'.pdf';
 				
 				if (!file_exists($filename)) die(__('Gutscheindokument nicht gefunden!', 'wpsg'));
@@ -601,8 +436,4 @@
 				header('Content-type: application/pdf');
 				
-				$farr = pathinfo($filename);
-				$filename2 = $farr['basename'];
-				header('Content-Disposition: attachment; filename="'.$filename2.'"');
-				
 				die(file_get_contents($filename));
 				
@@ -617,5 +448,5 @@
 		}
 		
-		public function order_view($order_id, &$arSidebarArray)
+		public function order_view_sidebar(&$order_id)
 		{
 			
@@ -624,15 +455,13 @@
 			
 				$this->shop->view['wpsg_mod_voucherproduct']['order_id'] = $order_id;
-
-				$arSidebarArray[$this->id] = array(
-					'title' => $this->name,
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/order_view_sidebar.phtml', false)
-				);
+							
+				$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_voucherproduct/order_view_sidebar.phtml');
 				
 			}
 			
 		} // public function order_view_sidebar(&$order_id)
-
-		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator) { 
+		
+		public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator) 
+		{ 
 			 
 			if (!in_array($field_value, array('wpsg_mod_voucher_code', 'wpsg_mod_voucher_validfrom', 'wpsg_mod_voucher_validto')) || !wpsg_isSizedInt($o_id) || !wpsg_isSizedInt($p_id));
@@ -654,5 +483,6 @@
 			$arValidTo = array();
 			
-			foreach ($arVoucher as $v) {
+			foreach ($arVoucher as $v)
+			{
 				
 				$arCode[] = $v['code'];
@@ -664,5 +494,6 @@
 			if ($profil_separator === ',') $separator = ';'; else $separator = ',';
 						
-			switch ($field_value) {
+			switch ($field_value)
+			{
 				
 				case 'wpsg_mod_voucher_code': $return = implode($separator, $arCode); break;
@@ -672,5 +503,5 @@
 			}
 			
-		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $order_product_id, $profil_separator)
+		} // public function wpsg_mod_export_getValue(&$return, $field_value, $o_id, $p_id, $productkey, $product_index, $profil_separator)
 		
 		public function wpsg_mod_export_loadFields(&$arFields) 
@@ -695,5 +526,5 @@
 			if ($gs_data['id'] <= 0) return false;
 			
-			if (file_exists($this->getFilePath($order_id).'gutschein_'.$gs_data['code'].'.pdf')) return true;
+			if (file_exists($this->getFilePath($order_id).'voucher_'.$gs_data['code'].'.pdf')) return true;
 						
 			return false;
@@ -710,17 +541,11 @@
 			
 		} // public function getBackendDownloadURL($order_id, $gs_id)
-
+		
 		/**
 		 * Generiert das Gutscheindokument
 		 *
-		 * @param varchar $code       Der Gutscheincode
-		 * @param int     $order_id   Die Bestell ID
-		 * @param int     $product_id Die Produkt ID
-		 *
-		 * @param         $preview
-		 * @param         $product_index
-		 *
-		 * @return
-		 * @throws \wpsg\Exception
+		 * @param varchar $code Der Gutscheincode
+		 * @param int $order_id Die Bestell ID
+		 * @param int $product_id Die Produkt ID
 		 */
 		public function genGSDokument($code, $order_id, $product_id, $preview, $product_index)
@@ -770,5 +595,5 @@
 			
 			$this->shop->view['preview'] = $preview;
-			$this->shop->view['filename'] = $this->getFilePath($order_id).'gutschein_'.$code.'.pdf';
+			$this->shop->view['filename'] = $this->getFilePath($order_id).'voucher_'.$code.'.pdf';
 			
 			$this->shop->view['product_id'] = $product_id;
@@ -794,7 +619,10 @@
 			if ($this->shop->isMultiBlog())
 			{
-				
-				$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_mod_gutscheinprodukt/'.$order_id.'/'; 
-												 
+
+				$path = UPLOADS.'/wpsg/wpsg_mod_gutscheinprodukt/'.$order_id;
+				$htaccess = UPLOADS.'/wpsg/wpsg_mod_gutscheinprodukt/.htaccess';
+				
+				$strReturn = $path.'/'.$order_id.'/';
+								 
 			}
 			else
@@ -802,10 +630,33 @@
 				
 				$path = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_mod_gutscheinprodukt/'.$order_id;
-								 
-			}
-			
-			$this->shop->protectDirectory($path);
-			 			
-			return $path;
+				$htaccess = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_mod_gutscheinprodukt/.htaccess';
+				
+				$strReturn = WPSG_PATH_CONTENT.'uploads/wpsg/wpsg_mod_gutscheinprodukt/'.$order_id.'/';
+				 
+			}
+			
+			if (!file_exists($path)) 
+			{
+				
+				mkdir($path, 0777, true);
+				
+			}
+			
+			/*
+ 			 * Zur Sicherheit ÃŒberprÃŒfe ich immer ob die .htaccess existiert
+ 			 */			
+			if (!file_exists($htaccess))
+			{
+				
+				$handle = fopen($htaccess, "w+");
+				
+				$content = 'Deny from all';
+							
+				fwrite($handle, $content, strlen($content));
+				fclose($handle);
+				
+			}
+			
+			return $strReturn;
 			
 		} // private function getFilePath($order_id)
@@ -907,2 +758,3 @@
 	} // class wpsg_mod_voucherproduct extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_weight.class.php
===================================================================
--- /mods/wpsg_mod_weight.class.php	(revision 8528)
+++ /mods/wpsg_mod_weight.class.php	(revision 5261)
@@ -7,5 +7,5 @@
 	class wpsg_mod_weight extends wpsg_mod_basic
 	{
-
+		
 		var $lizenz = 2;
 		var $id = 95;
@@ -16,27 +16,27 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
-
+			
 			$this->name 	= __('Produktgewicht', 'wpsg');
 			$this->group 	= __('Produkte', 'wpsg');
 			$this->desc 	= __('Erlaubt die Verwaltung von Gewichten pro Produkt.', 'wpsg');
-
+						
 		} // public function __construct()
-
-		public function install()
-		{
-
+		
+		public function install() 
+		{ 
+			
 			require_once(WPSG_PATH_WP.'/wp-admin/includes/upgrade.php');
-
+			
 			/**
 			 * Posts Tabelle erweitern
-			 */
+			 */ 
 			$sql = "CREATE TABLE ".WPSG_TBL_PRODUCTS." (
 		   		weight DOUBLE(10,2) NOT NULL
 		   	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
-   			dbDelta($sql);
-
+   	   	 
+   			dbDelta($sql); 
+   			   			
    			/**
    			 * Tabelle fÃŒr die bestellten Produkte
@@ -46,7 +46,7 @@
    				weight DOUBLE(10,2) NOT NULL
    			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+   			
    			dbDelta($sql);
-
+   			
    			/**
    			 * Tabelle fÃŒr die Bestellung erweitern, hier wird das Gesamtgewicht der Bestellung abgespeichert
@@ -55,7 +55,7 @@
    				weight DOUBLE(10,2) NOT NULL
    			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
-
+   			
    			dbDelta($sql);
-
+   			
    			$this->shop->checkDefault('wpsg_mod_weight_unit', 'g');
    			$this->shop->checkDefault('wpsg_mod_weight_showProduct', '1');
@@ -64,226 +64,185 @@
    			$this->shop->checkDefault('wpsg_mod_weight_showOverview', '1');
    			$this->shop->checkDefault('wpsg_mod_weight_showOverviewProduct', '1');
-
-		} // public function install()
-
+   			
+		} // public function install() 
+		
 		public function settings_edit()
 		{
-
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/settings_edit.phtml');
-
+			
 		} // public function settings_edit()
-
+		
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_weight_unit', $_REQUEST['wpsg_mod_weight_unit'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_weight_showProduct', $_REQUEST['wpsg_mod_weight_showProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_weight_showBasket', $_REQUEST['wpsg_mod_weight_showBasket'], false, false, WPSG_SANITIZE_CHECKBOX);
-		    $this->shop->update_option('wpsg_mod_weight_showAjaxDialog', $_REQUEST['wpsg_mod_weight_showAjaxDialog'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_weight_showBasketProduct', $_REQUEST['wpsg_mod_weight_showBasketProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_weight_showOverview', $_REQUEST['wpsg_mod_weight_showOverview'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_weight_showOverviewProduct', $_REQUEST['wpsg_mod_weight_showOverviewProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-
+			
+			$this->shop->update_option('wpsg_mod_weight_unit', $_REQUEST['wpsg_mod_weight_unit']);
+			$this->shop->update_option('wpsg_mod_weight_showProduct', $_REQUEST['wpsg_mod_weight_showProduct']);			
+			$this->shop->update_option('wpsg_mod_weight_showBasket', $_REQUEST['wpsg_mod_weight_showBasket']);
+			$this->shop->update_option('wpsg_mod_weight_showBasketProduct', $_REQUEST['wpsg_mod_weight_showBasketProduct']);
+			$this->shop->update_option('wpsg_mod_weight_showOverview', $_REQUEST['wpsg_mod_weight_showOverview']);
+			$this->shop->update_option('wpsg_mod_weight_showOverviewProduct', $_REQUEST['wpsg_mod_weight_showOverviewProduct']);
+			
 			if ($this->shop->hasMod('wpsg_mod_request'))
 			{
-
-			    $this->shop->update_option('wpsg_mod_weight_showRequestPage', $_REQUEST['wpsg_mod_weight_showRequestPage'], false, false, WPSG_SANITIZE_CHECKBOX);
-			    $this->shop->update_option('wpsg_mod_weight_showRequestPageProduct', $_REQUEST['wpsg_mod_weight_showRequestPageProduct'], false, false, WPSG_SANITIZE_CHECKBOX);
-
-			}
-
+				
+				$this->shop->update_option('wpsg_mod_weight_showRequestPage', $_REQUEST['wpsg_mod_weight_showRequestPage']);
+				$this->shop->update_option('wpsg_mod_weight_showRequestPageProduct', $_REQUEST['wpsg_mod_weight_showRequestPageProduct']);
+				
+			}
+			
 			if ($this->shop->hasMod('wpsg_mod_productindex'))
 			{
-			    $this->shop->update_option('wpsg_mod_weight_showProductindex', $_REQUEST['wpsg_mod_weight_showProductindex'], false, false, WPSG_SANITIZE_CHECKBOX);
-			}
-			$this->shop->update_option('wpsg_mod_weight_showProductindexBackend', $_REQUEST['wpsg_mod_weight_showProductindexBackend'], false, false, WPSG_SANITIZE_CHECKBOX);
+				$this->shop->update_option('wpsg_mod_weight_showProductindex', $_REQUEST['wpsg_mod_weight_showProductindex']);
+			}
 			
 		} // public function settings_save()
-
-		public function basket_row(&$p, $i)
-		{
+		
+		public function basket_row(&$p, $i) 
+		{ 
 
 			if ($this->shop->get_option('wpsg_mod_weight_showBasketProduct') != '1') return;
-
+			
 			$this->shop->view['weight'] = $p['weight'];
 
-			$this->shop->view['i'] = $i;
-
+			$this->shop->view['i'] = $i;			
+			
 			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/basket_row.phtml');
-
+			
 		} // public function basket_row(&$p, $i)
-
-		public function basket_row_end(&$basket_view)
-		{
-
+		
+		public function basket_row_end(&$basket_view) 
+		{ 
+			
 			if ($this->shop->get_option('wpsg_mod_weight_showBasket') != '1') return;
+
+			$this->shop->view['wpsg_mod_weight']['weight'] = $basket_view['basket']['sum']['weight'];
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/basket_row_end.phtml');
+			
+		} // public function basket_row_end(&$basket)
+		
+		public function overview_row(&$p, $i) 
+		{ 
+			
+			if ($this->shop->get_option('wpsg_mod_weight_showOverviewProduct') != '1') return;
+			
+			$this->shop->view['i'] = $i;			
+			$this->shop->view['weight'] = $p['weight'];
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/overview_row.phtml');
+			
+		} // public function overview_row(&$p, $i) 
+
+		public function overview_row_end(&$overview_view) { 
+			
+			if ($this->shop->get_option('wpsg_mod_weight_showOverview') != '1') return;
+			
+			$this->shop->view['wpsg_mod_weight']['weight'] = $overview_view['basket']['sum']['weight'];
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/overview_row_end.phtml');			
+			
+		} // public function overview_row_end(&$overview_view)
+		
+		public function produkt_edit_allgemein(&$produkt_data) 
+		{ 
+			
+			if (isset($_REQUEST['wpsg_lang'])) return;
+			
+			$this->shop->view['wpsg_mod_weight']['weight'] = $produkt_data['weight'];
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/produkt_edit_allgemein.phtml');
+			
+		} // public function produkt_edit_allgemein(&$produkt_data)
+
+		public function produkt_save_before(&$produkt_data)
+		{ 
+			
+			$produkt_data['weight'] = wpsg_tf($_REQUEST['wpsg_mod_weight']['weight']);
+			
+		} // public function produkt_save_before(&$produkt_data)
+		
+		public function loadProduktArray(&$product_data)
+		{
+			
+			$product_data['weight'] = $this->getWeight($product_data['id']);
+			
+		}
 						
-			$this->shop->view['wpsg_mod_weight']['weight'] = $this->getSessionBasketWeight();
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/basket_row_end.phtml');
-
-		} // public function basket_row_end(&$basket)
-
-		public function overview_row(&$p, $i)
-		{
-
-			if ($this->shop->get_option('wpsg_mod_weight_showOverviewProduct') != '1') return;
-
-			$this->shop->view['i'] = $i;
-			$this->shop->view['weight'] = $p['weight'];
-
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/overview_row.phtml');
-
-		} // public function overview_row(&$p, $i)
-
-		public function overview_row_end(&$overview_view) {
-
-			if ($this->shop->get_option('wpsg_mod_weight_showOverview') != '1') return;
-
-			$this->shop->view['wpsg_mod_weight']['weight'] = $this->getSessionBasketWeight(); 
-			
-			//$this->shop->view['wpsg_mod_weight']['weight'] = wpsg_getFloat($overview_view['basket']['sum']['weight']);
-			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/overview_row_end.phtml');
-
-		} // public function overview_row_end(&$overview_view)
-
-		public function product_addedit_content(&$product_content, &$product_data) {
-
-			if (isset($_REQUEST['wpsg_lang'])) return;
-
-            $this->shop->view['wpsg_mod_weight']['weight'] = wpsg_getFloat($product_data['weight']);
-
-            if (!array_key_exists('stock', $product_content)) {
-
-                $this->shop->view['arSubAction']['stock'] = array(
-                    'title' => __('Bestand / Gew. / FÃŒllm.', 'wpsg'),
-                    'content' => ''
-                );
-
-            }
-
-            $product_content['stock']['content'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_weight/product_addedit_content.phtml', false);
-
-		} // public function produkt_edit_allgemein(&$produkt_data)
-
-		public function produkt_save_before(&$produkt_data) {
-			
-			wpsg_checkRequest('weight', [WPSG_SANITIZE_FLOAT], __('Produktgewicht', 'wpsg'), $produkt_data, $_REQUEST['wpsg_mod_weight']['weight']);
-			
-		} // public function produkt_save_before(&$produkt_data)
-
-		public function loadProduktArray(&$product_data)
-		{
-         
-			$product_data['weight'] = $this->getWeight($product_data['id']);
-
-		}
-
 		public function basket_toArray(&$produkt, $backend = false, $noMwSt = false)
 		{
-
+			
 			$produkt['weight_one'] = $this->getWeight($produkt['id']);
 			$produkt['weight'] = $this->getWeight($produkt['id']) * $produkt['menge'];
-
+		 
 		}
-
-		public function basket_toArray_preshippayment(&$basket, &$arBasket)
-		{
-
+		 		
+		public function basket_toArray_preshippayment(&$basket, &$arBasket) 
+		{  
+			
 			if ($basket->loadFromSession)
 			{
-
+			
 				$weight_sum = 0;
-
+				
 				foreach ($arBasket['produkte'] as $k => $p)
 				{
-
+					
 					$weight_sum += $p['weight'];
-
-				}
-
-				$arBasket['sum']['weight'] = $weight_sum;
-
-			}
-			else if ($basket->o_id > 0)
-			{
-
-				$order_data = $this->shop->cache->loadOrder($basket->o_id);
-
-				$arBasket['sum']['weight'] = $order_data['weight'];
-
-			}
-
-		} // public function basket_toArray_final(&$basket, &$arBasket)
- 
-		/**
-		 * @var \wpsg\wpsg_calculation $oCalculation  
-		 */
-		public function calculation_saveProduct(&$oCalculation, $calc_product, &$db_product_data, $finish_order) { 
-			 
-			$db_product_data['weight'] = wpsg_q($this->getWeight($calc_product['product_key']) * $calc_product['amount']);
-			 			
-		}
-		
-		public function calculation_saveOrder(&$oCalculation, $arCalculation, &$db_data, $finish_order) {
-		
-			$weight = 0;
-			
-			foreach ($arCalculation['product'] as $p) {
-				
-				$weight += $p['amount'] * $this->getWeight($p['product_key']);
-				
-			}
-			
-			$db_data['weight'] = wpsg_q($weight);
-			
-		}
-		
-		/* --- */
-		
-		/**
-		 * Gibt das Gewicht der Produkte im aktuellen Warenkorb zurÃŒck (Session)
-		 */
-		public function getSessionBasketWeight() {
-			
-			$basket_amount = 0;
-			
-			if (wpsg_isSizedArray($_SESSION['wpsg']['basket'])) {
-								
-				foreach ($_SESSION['wpsg']['basket'] as $product_index => $product_data) {
-					
-					$basket_amount += $this->getWeight($product_data['id']) * $product_data['menge'];
 					
 				}
-								
-			}
-			
-			return $basket_amount;
-			
-		}
+				
+				$arBasket['sum']['weight'] = $weight_sum;
+				
+			}
+			else if ($basket->o_id > 0)
+			{
+				
+				$order_data = $this->shop->cache->loadOrder($basket->o_id);
+				
+				$arBasket['sum']['weight'] = $order_data['weight'];
+				
+			}
+		
+		} // public function basket_toArray_final(&$basket, &$arBasket)
+				
+		public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order) { 
+			
+			$data['weight'] = $arBasket['sum']['weight'];
+			
+		} // public function basket_save_order(&$data, &$checkout, &$arBasket, $finish_order)
+		
+		public function basket_save_product(&$data, &$product_data) 
+		{ 
+
+			$data['weight'] = $product_data['weight'];
+
+		} // public function basket_save_product(&$data, &$product_data)
+		
+		/* --- */
 		
 		public function getWeight($product_key)
 		{
-		    
+			 
 			$product_data_db = $this->shop->cache->loadProduct($this->shop->getProduktId($product_key));
-
-			if ($this->shop->hasMod('wpsg_mod_productvariants') && $this->shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($product_key)))
-			{
-
-				$variInfo = $this->shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($product_key));
+			
+			if ($this->shop->hasMod('wpsg_mod_varianten') && $this->shop->callMod('wpsg_mod_varianten', 'isVariantsProductKey', array($product_key)))
+			{
+			
+				$variInfo = $this->shop->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($product_key));
 				$weight = $product_data_db['weight'] + $variInfo['weight'];
-
+				
 			}
 			else
 			{
-
-				$weight = wpsg_getFloat($product_data_db['weight']);
-
-			}
-
+			
+				$weight = $product_data_db['weight'];
+			
+			}
+			
 			return $weight;
-
+			
 		} // public function getWeight($produkt_key)
-
+		 		
 	} // class wpsg_mod_weight extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_willcollect.class.php
===================================================================
--- /mods/wpsg_mod_willcollect.class.php	(revision 8528)
+++ /mods/wpsg_mod_willcollect.class.php	(revision 5261)
@@ -16,5 +16,5 @@
 		public function __construct()
 		{
-
+			
 			parent::__construct();
 			
@@ -57,24 +57,22 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_willcollect_bezeichnung', $_REQUEST['wpsg_mod_willcollect_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_willcollect_aktiv', $_REQUEST['wpsg_mod_willcollect_aktiv'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_willcollect_hint', $_REQUEST['wpsg_mod_willcollect_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_willcollect_paymentneed', $_REQUEST['wpsg_mod_willcollect_paymentneed'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_willcollect_dontMerge', $_REQUEST['wpsg_mod_willcollect_dontMerge'], false, false, WPSG_SANITIZE_CHECKBOX);
-			
-			$this->shop->update_option('wpsg_mod_willcollect_adress', $_REQUEST['wpsg_mod_willcollect_adress'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_willcollect_street', $_REQUEST['wpsg_mod_willcollect_street'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_willcollect_plzort', $_REQUEST['wpsg_mod_willcollect_plzort'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_willcollect_payment', $_REQUEST['wpsg_mod_willcollect_payment'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_willcollect_payment_bezeichnung', $_REQUEST['wpsg_mod_willcollect_payment_bezeichnung'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_willcollect_payment_hint', $_REQUEST['wpsg_mod_willcollect_payment_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			
-			$this->shop->update_option('wpsg_mod_willcollect_gebuehr', $_REQUEST['wpsg_mod_willcollect_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_willcollect_payment_gebuehr', $_REQUEST['wpsg_mod_willcollect_payment_gebuehr'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-			$this->shop->update_option('wpsg_mod_willcollect_mwst', $_REQUEST['wpsg_mod_willcollect_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_willcollect_mwstland', $_REQUEST['wpsg_mod_willcollect_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
+		
+			$this->shop->update_option('wpsg_mod_willcollect_bezeichnung', $_REQUEST['wpsg_mod_willcollect_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_willcollect_aktiv', $_REQUEST['wpsg_mod_willcollect_aktiv']);
+			$this->shop->update_option('wpsg_mod_willcollect_hint', $_REQUEST['wpsg_mod_willcollect_hint']);
+			$this->shop->update_option('wpsg_mod_willcollect_paymentneed', $_REQUEST['wpsg_mod_willcollect_paymentneed']);
+			
+			$this->shop->update_option('wpsg_mod_willcollect_adress', $_REQUEST['wpsg_mod_willcollect_adress']);
+			$this->shop->update_option('wpsg_mod_willcollect_street', $_REQUEST['wpsg_mod_willcollect_street']);
+			$this->shop->update_option('wpsg_mod_willcollect_plzort', $_REQUEST['wpsg_mod_willcollect_plzort']);
+			
+			$this->shop->update_option('wpsg_mod_willcollect_payment', $_REQUEST['wpsg_mod_willcollect_payment']);
+			$this->shop->update_option('wpsg_mod_willcollect_payment_bezeichnung', $_REQUEST['wpsg_mod_willcollect_payment_bezeichnung']);
+			$this->shop->update_option('wpsg_mod_willcollect_payment_hint', $_REQUEST['wpsg_mod_willcollect_payment_hint']);
+			
+			$this->shop->update_option('wpsg_mod_willcollect_gebuehr', $_REQUEST['wpsg_mod_willcollect_gebuehr']);
+			$this->shop->update_option('wpsg_mod_willcollect_payment_gebuehr', $_REQUEST['wpsg_mod_willcollect_payment_gebuehr']);
+			$this->shop->update_option('wpsg_mod_willcollect_mwst', $_REQUEST['wpsg_mod_willcollect_mwst']);
+			$this->shop->update_option('wpsg_mod_willcollect_mwstland', $_REQUEST['wpsg_mod_willcollect_mwstland']);
 			
 		} // public function settings_save()
@@ -135,60 +133,191 @@
 		}
 		
-		public function addPayment(&$arPayment) { 
-
-			if (is_admin() || $this->shop->get_option('wpsg_mod_willcollect_payment') == '1') {
-			
+		public function addPayment(&$arPayment) 
+		{ 
+
+			if (is_admin() || $this->shop->get_option('wpsg_mod_willcollect_payment') == '1')
+			{
+			
+				$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_willcollect_mwst'), $this->shop->getDefaultCountry());
+							
 				$arPayment[$this->id] = array(
 					'id' => $this->id,
 					'name' => __($this->shop->get_option('wpsg_mod_willcollect_payment_bezeichnung'), 'wpsg'),
-					'price' => $this->shop->get_option('wpsg_mod_willcollect_payment_gebuehr'),
-					'tax_key' => $this->shop->get_option('wpsg_mod_willcollect_mwst'),
+					'preis' => $this->shop->get_option('wpsg_mod_willcollect_payment_gebuehr'),
+					'mwst' => $this->shop->get_option('wpsg_mod_willcollect_mwst'),
+					'mwst_value' => $mwst_value,
 					'mwst_null' => $this->shop->get_option('wpsg_mod_willcollect_mwstland'),
 					'hint' => __($this->shop->get_option('wpsg_mod_willcollect_payment_hint'), 'wpsg')
 				);
-				 				
+				
+				if (isset($_REQUEST['wpsg_checkout2']))
+				{
+					
+					$arBasket = $this->shop->basket->toArray();
+					
+					if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+					{
+							
+						$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);
+						$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+							
+					}
+					else
+					{
+													
+						$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);																								
+						$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);						
+							
+					}
+					
+					// Entsprechenden Preis anzeigen
+					if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+					{
+						
+						$arPayment[$this->id]['price'] = $payment_netto;
+						
+					}
+					else 
+					{
+						
+						$arPayment[$this->id]['price'] = $payment_brutto;
+						
+					}
+					
+				}
+				
 			}
 			
 		} // public function addPayment(&$arPayment)
- 
-		public function addShipping(&$arShipping, $va_active = false) {
+
+		public function calcPayment(&$arBasket) 
+		{ 
+			
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			 
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_willcollect_payment_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($this->shop->get_option('wpsg_mod_willcollect_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+					
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_willcollect_mwst'));
+
+				}
+								
+			}
+			
+		} // public function calcPayment(&$arBasket) 
+
+		public function addShipping(&$arShipping)
+		{
 			
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_willcollect_aktiv') != '1') return;
 			
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_willcollect_mwst'), $this->shop->getDefaultCountry());
+						
 			$arShipping[$this->id] = array(
 				'id' => $this->id,
-				'active' => $this->shop->get_option('wpsg_mod_willcollect_aktiv'),
 				'name' => __($this->shop->get_option('wpsg_mod_willcollect_bezeichnung'), 'wpsg'),
-				'price' => $this->shop->get_option('wpsg_mod_willcollect_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_willcollect_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_willcollect_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_willcollect_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_willcollect_mwstland'),
 				'hint' => __($this->shop->get_option('wpsg_mod_willcollect_hint'), 'wpsg')
 			);
-			 			
+			
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+				 
+				$this->shop->view['error'] = $_SESSION['wpsg']['errorFields'];
+				$this->shop->view['wpsg_mod_willcollect']['adress'] = $this->shop->get_option('wpsg_mod_willcollect_adress');
+				$this->shop->view['wpsg_mod_willcollect']['street'] = $this->shop->get_option('wpsg_mod_willcollect_street');
+				$this->shop->view['wpsg_mod_willcollect']['plzort'] = $this->shop->get_option('wpsg_mod_willcollect_plzort');
+				
+				$arShipping[$this->id]['hint'] .= $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_willcollect/shippinghint.phtml', false);
+				
+				$arBasket = $this->shop->basket->toArray();
+				
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+						
+					$shipping_netto = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);
+					$shipping_brutto = wpsg_calculatePreis($shipping_netto, WPSG_BRUTTO, $mwst_value);
+						
+				}
+				else
+				{
+												
+					$shipping_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_autodebit_gebuehr'), $arBasket['sum']['preis']);																								
+					$shipping_netto = wpsg_calculatePreis($shipping_brutto, WPSG_NETTO, $mwst_value);						
+						
+				}
+				
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+					
+					$arShipping[$this->id]['price'] = $shipping_netto;
+					
+				}
+				else 
+				{
+					
+					$arShipping[$this->id]['price'] = $shipping_brutto;
+					
+				}
+				
+			}
+			
 		} // public function addShipping(&$arShipping)
-		 		
-		/**
-		 * Fehlermeldung wird in der setBasketData geschrieben,
-		 * umleitung erfolgt aber schon hier, damit man aus dem Warenkorb nicht rauskommt
-		 */
-		public function checkBasket(&$bError)
-		{
-			
-			if ($this->shop->basket->arCheckout['payment'] == $this->id)
-			{
-				
-				// Zahlungsart Barzahlung wurde gewÃ€hlt => Dann muss die Versandart "Selbstabholung" sein
-				if ($this->shop->basket->arCheckout['shipping'] != $this->id) { $bError = false; }
-				
-			}
-			
-			if ($this->shop->basket->arCheckout['shipping'] == $this->id)
-			{
-				
-				if ($this->shop->basket->arCheckout['payment'] != $this->id && $this->shop->get_option('wpsg_mod_willcollect_paymentneed') == '1') { $bError = false; }
-				
-			}
-			
-		}
+		
+		public function calcShipping(&$arBasket, $shipping_key)
+		{
+			
+			if ($arBasket['checkout']['shipping'] == $this->id)
+			{
+			
+				$shipping_price = $this->getPreis($this->shop->get_option('wpsg_mod_willcollect_gebuehr'), $arBasket['sum']['preis']);
+				
+				if ($va['mwst_akt'] != '1' && $arBasket['noMwSt'])
+				{
+					
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_shipping'] = $shipping_price;
+					$arBasket['sum']['preis_shipping_brutto'] = $shipping_price;
+					$arBasket['sum']['preis_shipping_netto'] = $shipping_price;
+
+					$arBasket['shipping']['mwst'] = 0;
+					$this->shop->arShipping[$arBasket['checkout']['shipping']]['mwst_value'] = 0;
+						
+					$arBasket['shipping']['tax_rata'] = false;
+					
+				}
+				else
+				{
+					
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setShippingKosten($arBasket, $this->id, $shipping_price, $this->shop->get_option('wpsg_mod_willcollect_mwst'));
+
+				}
+				
+			}
+			
+		} // public function calcShipping(&$arBasket)
 		
 		public function checkCheckout(&$state, &$error, &$arCheckout) 
@@ -304,2 +433,3 @@
 	} // class wpsg_mod_willcollect extends wpsg_mod_basic
 
+?>
Index: /mods/wpsg_mod_wirecard.class.php
===================================================================
--- /mods/wpsg_mod_wirecard.class.php	(revision 8528)
+++ /mods/wpsg_mod_wirecard.class.php	(revision 5261)
@@ -26,5 +26,5 @@
 			$this->desc = __('ErmÃ¶glicht die Zahlungsart wirecard.', 'wpsg');
 		
-			if (is_object($this->shop) && method_exists($this->shop, 'getCurrentLanguage') && $this->shop->getCurrentLanguageCode() == 'en') $this->hilfeURL = 'http://wpshopgermany.de/?p=17187';
+			if (is_object($this->shop) && method_exists($this->shop, 'getCurrentLanguage') && $this->shop->getCurrentLanguage() == 'en_US') $this->hilfeURL = 'http://wpshopgermany.de/?p=17187';
 			
 		} // public function __construct()
@@ -80,33 +80,33 @@
 		public function settings_save()
 		{
-
-		    $this->shop->update_option('wpsg_mod_wirecard_name', $_REQUEST['wpsg_mod_wirecard_name'], false, false, WPSG_SANITIZE_TEXTFIELD);
-		    $this->shop->update_option('wpsg_mod_wirecard_activ', $_REQUEST['wpsg_mod_wirecard_activ'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_wirecard_hint', $_REQUEST['wpsg_mod_wirecard_hint'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_wirecard_logo', $_REQUEST['wpsg_mod_wirecard_logo'], false, false, WPSG_SANITIZE_TEXTFIELD);
-
-			$this->shop->addTranslationString('wpsg_mod_wirecard_name', wpsg_sinput("text_field", $_REQUEST['wpsg_mod_wirecard_name'], false, false, WPSG_SANITIZE_TEXTFIELD));
-			$this->shop->addTranslationString('wpsg_mod_wirecard_hint', wpsg_sinput("text_field", $_REQUEST['wpsg_mod_wirecard_hint'], false, false, WPSG_SANITIZE_TEXTFIELD));
-			
-			$this->shop->update_option('wpsg_mod_wirecard_customerid', $_REQUEST['wpsg_mod_wirecard_customerid'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_wirecard_secret', $_REQUEST['wpsg_mod_wirecard_secret'], false, false, WPSG_SANITIZE_APIKEY);
-			$this->shop->update_option('wpsg_mod_wirecard_shopid', $_REQUEST['wpsg_mod_wirecard_shopid'], false, false, WPSG_SANITIZE_APIKEY);
-			
-			$this->shop->update_option('wpsg_mod_wirecard_gebuehr', $_REQUEST['wpsg_mod_wirecard_gebuehr'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_wirecard_mwst', $_REQUEST['wpsg_mod_wirecard_mwst'], false, false, WPSG_SANITIZE_TAXKEY);
-			$this->shop->update_option('wpsg_mod_wirecard_mwstland', $_REQUEST['wpsg_mod_wirecard_mwstland'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_wirecard_currency', $_REQUEST['wpsg_mod_wirecard_currency'], false, false, WPSG_SANITIZE_VALUES, ['EUR', 'CHF', 'GBP', 'USD']);
-			$this->shop->update_option('wpsg_mod_wirecard_mode', $_REQUEST['wpsg_mod_wirecard_mode'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->update_option('wpsg_mod_wirecard_language', $_REQUEST['wpsg_mod_wirecard_language'], false, false, WPSG_SANITIZE_VALUES, ['auto', 'de', 'en', 'fr']);
-			$this->shop->update_option('wpsg_mod_wirecard_autostart', $_REQUEST['wpsg_mod_wirecard_autostart'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_wirecard_subject', $_REQUEST['wpsg_mod_wirecard_subject'], false, false, WPSG_SANITIZE_TEXTFIELD);
-			$this->shop->update_option('wpsg_mod_wirecard_submitadress', $_REQUEST['wpsg_mod_wirecard_submitadress'], false, false, WPSG_SANITIZE_CHECKBOX);
-			$this->shop->update_option('wpsg_mod_wirecard_minValue', $_REQUEST['wpsg_mod_wirecard_minValue'], false, false, WPSG_SANITIZE_FLOAT);
-			$this->shop->update_option('wpsg_mod_wirecard_maxValue', $_REQUEST['wpsg_mod_wirecard_maxValue'], false, false, WPSG_SANITIZE_FLOAT);
-			
-			$this->shop->createPage(__('Erfolgreiche wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_success', $_REQUEST['wpsg_page_mod_wirecard_success'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->createPage(__('Fehlgeschlagene wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_error', $_REQUEST['wpsg_page_mod_wirecard_error'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->createPage(__('Abgebrochene wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_cancel', $_REQUEST['wpsg_page_mod_wirecard_cancel'], false, false, WPSG_SANITIZE_INT);
-			$this->shop->createPage(__('Unbestimmte wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_pending', $_REQUEST['wpsg_page_mod_wirecard_pending'], false, false, WPSG_SANITIZE_INT);
+			
+			$this->shop->update_option('wpsg_mod_wirecard_name', $_REQUEST['wpsg_mod_wirecard_name']);
+			$this->shop->update_option('wpsg_mod_wirecard_activ', $_REQUEST['wpsg_mod_wirecard_activ']);
+			$this->shop->update_option('wpsg_mod_wirecard_hint', $_REQUEST['wpsg_mod_wirecard_hint']);
+			$this->shop->update_option('wpsg_mod_wirecard_logo', $_REQUEST['wpsg_mod_wirecard_logo']);
+			
+			$this->shop->addTranslationString('wpsg_mod_wirecard_name', $_REQUEST['wpsg_mod_wirecard_name']);
+			$this->shop->addTranslationString('wpsg_mod_wirecard_hint', $_REQUEST['wpsg_mod_wirecard_hint']);
+			
+			$this->shop->update_option('wpsg_mod_wirecard_customerid', $_REQUEST['wpsg_mod_wirecard_customerid']);
+			$this->shop->update_option('wpsg_mod_wirecard_secret', $_REQUEST['wpsg_mod_wirecard_secret']);
+			$this->shop->update_option('wpsg_mod_wirecard_shopid', $_REQUEST['wpsg_mod_wirecard_shopid']);
+			
+			$this->shop->update_option('wpsg_mod_wirecard_gebuehr', $_REQUEST['wpsg_mod_wirecard_gebuehr']);
+			$this->shop->update_option('wpsg_mod_wirecard_mwst', $_REQUEST['wpsg_mod_wirecard_mwst']);
+			$this->shop->update_option('wpsg_mod_wirecard_mwstland', $_REQUEST['wpsg_mod_wirecard_mwstland']);
+			$this->shop->update_option('wpsg_mod_wirecard_currency', $_REQUEST['wpsg_mod_wirecard_currency']);
+			$this->shop->update_option('wpsg_mod_wirecard_mode', $_REQUEST['wpsg_mod_wirecard_mode']);
+			$this->shop->update_option('wpsg_mod_wirecard_language', $_REQUEST['wpsg_mod_wirecard_language']);
+			$this->shop->update_option('wpsg_mod_wirecard_autostart', $_REQUEST['wpsg_mod_wirecard_autostart']);
+			$this->shop->update_option('wpsg_mod_wirecard_subject', $_REQUEST['wpsg_mod_wirecard_subject']);
+			$this->shop->update_option('wpsg_mod_wirecard_submitadress', $_REQUEST['wpsg_mod_wirecard_submitadress']);
+			$this->shop->update_option('wpsg_mod_wirecard_minValue', $_REQUEST['wpsg_mod_wirecard_minValue']);
+			$this->shop->update_option('wpsg_mod_wirecard_maxValue', $_REQUEST['wpsg_mod_wirecard_maxValue']);
+			
+			$this->shop->createPage(__('Erfolgreiche wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_success', $_REQUEST['wpsg_page_mod_wirecard_success']);
+			$this->shop->createPage(__('Fehlgeschlagene wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_error', $_REQUEST['wpsg_page_mod_wirecard_error']);
+			$this->shop->createPage(__('Abgebrochene wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_cancel', $_REQUEST['wpsg_page_mod_wirecard_cancel']);
+			$this->shop->createPage(__('Unbestimmte wirecard Zahlung', 'wpsg'), 'wpsg_page_mod_wirecard_pending', $_REQUEST['wpsg_page_mod_wirecard_pending']);
 
 			// Reihenfolge Zahlungsarten
@@ -119,51 +119,44 @@
 			
 		} // public function settings_save()
-
-        public function wpsg_deinstall_sites() {
-
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_wirecard_success'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_wirecard_error'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_wirecard_cancel'));
-            wp_delete_post($this->shop->get_option('wpsg_page_mod_wirecard_pending'));
-
-        } // public function wpsg_deinstall_sites()
- 
-		public function systemcheck(&$arData) {
-			
-			if ($this->shop->get_option('wpsg_mod_wirecard_activ') === '1') {
-				
-				if (!wpsg_isSizedString($this->shop->get_option('wpsg_mod_wirecard_secret')) || !wpsg_isSizedString($this->shop->get_option('wpsg_mod_wirecard_customerid'))) {
-					
-					$arData[] = array(
-						'wpsg_mod_wirecard_apidata',
-						wpsg_ShopController::CHECK_ERROR,
-						wpsg_translate(
-							__('Das Modul "wirecard" ist aktiviert und es wurde kein geheimer SchlÃŒssel und keine Kunden ID hinterlegt. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um den geheimen SchlÃŒssel zu hinterlegen.', 'wpsg'),
-							WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_wirecard'
-						)
-					);
-					
-				}
-				
-			}
-			
-		}
-		
-		public function addPayment(&$arPayment) {
+		
+		public function checkGeneralBackendError()
+		{
+				
+			if (( !wpsg_isSizedString($this->shop->get_option('wpsg_mod_wirecard_secret')) || !wpsg_isSizedString($this->shop->get_option('wpsg_mod_wirecard_customerid')) ) && wpsg_isSizedInt($this->shop->get_option('wpsg_mod_wirecard_activ')))
+			{
+		
+				$this->shop->addBackendError('nohspc_'.wpsg_translate(
+					wpsg_translate(
+						__('Das Modul "wirecard" ist aktiviert und es wurde kein geheimer SchlÃŒssel und keine Kunden ID hinterlegt. Gehen Sie in die <a href="#1#">Einstellungen</a> des Moduls um den geheimen SchlÃŒssel zu hinterlegen.', 'wpsg'),
+						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_wirecard'
+					)
+				));
+		
+			}
+				
+		} // public function checkGeneralBackendError()
+		
+		public function addPayment(&$arPayment)
+		{
 				
 			if (!is_admin() && $this->shop->get_option('wpsg_mod_wirecard_activ') != '1') return;
 		
+			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_wirecard_activ'), $this->shop->getDefaultCountry());
+						
 			$arPayment[$this->id] = array(
 				'id' => $this->id,
 				'name' => __($this->shop->get_option('wpsg_mod_wirecard_name'), 'wpsg'),
-				'price' => $this->shop->get_option('wpsg_mod_wirecard_gebuehr'),
-				'tax_key' => $this->shop->get_option('wpsg_mod_wirecard_mwst'),
+				'preis' => $this->shop->get_option('wpsg_mod_wirecard_gebuehr'),
+				'mwst' => $this->shop->get_option('wpsg_mod_wirecard_mwst'),
+				'mwst_value' => $mwst_value,
 				'mwst_null' => $this->shop->get_option('wpsg_mod_wirecard_mwstland'),				
-				'logo' => $this->shop->getRessourceURL('mods/mod_wirecard/gfx/logo_100x25.png')
+				'logo' => $this->shop->getRessourceURL('mods/mod_wirecard/gfx/wirecard.png'),
+				'logo_100x25' => $this->shop->getRessourceURL('mods/mod_wirecard/gfx/logo_100x25.png')
 			);
 
 			$this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'] = $this->getWirecardPaymentTypes();
 			
-			foreach ($this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'] as $k => $v) {
+			foreach ($this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'] as $k => $v) 
+			{
 				
 				if (!in_array($k, (array)explode(',', $this->shop->get_option('wpsg_mod_wirecard_paymenttype')))) unset($this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'][$k]);
@@ -172,5 +165,6 @@
 			
 			// Fallback auf SELECT wenn nichts definiert wurde
-			if (!wpsg_isSizedArray($this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'])) {
+			if (!wpsg_isSizedArray($this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'])) 
+			{
 				 
 				$this->shop->view['wpsg_mod_wirecard']['arPaymentTypes'] = array(
@@ -180,5 +174,6 @@
 			}
 			
-			if (wpsg_isSizedString($_SESSION['wpsg']['checkout']['wpsg_mod_wirecard_paymentType'])) {
+			if (wpsg_isSizedString($_SESSION['wpsg']['checkout']['wpsg_mod_wirecard_paymentType']))
+			{
 				
 				$this->shop->view['wpsg_mod_wirecard']['paymentTypeSet'] = $_SESSION['wpsg']['checkout']['wpsg_mod_wirecard_paymentType'];
@@ -187,5 +182,41 @@
 			
 			$arPayment[$this->id]['hint'] = $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_wirecard/paymenthint.phtml', false);
-						
+							
+			if (isset($_REQUEST['wpsg_checkout2']))
+			{
+			
+				$arBasket = $this->shop->basket->toArray();
+			
+				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
+				{
+			
+					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_wirecard_gebuehr'), $arBasket['sum']['preis']);
+					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
+			
+				}
+				else
+				{
+			
+					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_wirecard_gebuehr'), $arBasket['sum']['preis']);
+					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);
+			
+				}
+			
+				// Entsprechenden Preis anzeigen
+				if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
+				{
+						
+					$arPayment[$this->id]['price'] = $payment_netto;
+						
+				}
+				else
+				{
+						
+					$arPayment[$this->id]['price'] = $payment_brutto;
+						
+				}
+			
+			}
+			
 		} // public function addPayment(&$arPayment)
 		
@@ -225,5 +256,39 @@
 			
 		} // public function checkCheckout(&$state, &$error, &$arCheckout)
-		 
+		
+		public function calcPayment(&$arBasket)
+		{
+
+			if ($arBasket['checkout']['payment'] == $this->id)
+			{
+			
+				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_wirecard_gebuehr'), $arBasket['sum']['preis']);
+			
+				if ($this->shop->get_option('wpsg_mod_wirecard_mwstland') == '1' && $arBasket['noMwSt'])
+				{
+						
+					// Keine MwSt. berechnen !
+					$arBasket['sum']['preis_payment'] = $payment_price;
+					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
+					$arBasket['sum']['preis_payment_netto'] = $payment_price;
+
+					$arBasket['payment']['mwst'] = 0;
+					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
+						
+					$arBasket['payment']['tax_rata'] = false;
+					
+				}
+				else
+				{
+						
+					// MwSt berechnen (Angaben im Backend sind immer Brutto)
+					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_paypal_mwst'));
+			
+				}
+			
+			}
+			
+		} // public function calcPayment(&$arBasket)
+		
 		public function order_done(&$order_id, &$done_view)
 		{
@@ -398,5 +463,5 @@
 		{
 			
-			if (in_array(wpsg_get_the_id(), array(
+			if (in_array(get_the_id(), array(
 				$this->shop->get_option('wpsg_page_mod_wirecard_success'), 
 				$this->shop->get_option('wpsg_page_mod_wirecard_error'),
@@ -439,5 +504,5 @@
 		}
 		
-		public function template_redirect() 
+		public function wp_loaded() 
 		{
 			
@@ -489,5 +554,5 @@
 			}
 			
-		} // public function template_redirect() 
+		} // public function wp_loaded() 
 		
 		public function mail_payment()
Index: adme.txt
===================================================================
--- /readme.txt	(revision 8528)
+++ 	(revision )
@@ -1,109 +1,0 @@
-=== wpShopGermany Free ===
-Contributors: maennchen1.de
-Donate link: http://wpshopgermany.de
-Tags: shop, commerce, wpShopGermany, verkaufen, produkte, artikel, waren, bestellungen, PayPal, checkout, warenkorb, payment, deutsch, deutschland, kunden, gutschein, MP3, PDF
-Requires PHP: 8.3
-Requires at least: %wp_min%
-Tested up to: %wp_tested_up%
-Stable tag: %version%
-License: GPLv2 or later
-License URI: http://www.gnu.org/licenses/gpl-2.0.html
-
-Verkaufen Sie in Ihrem WordPress elektronische Waren (Downloads) und physische Waren sowie Dienstleistungen kostenlos mit diesem Plugin! Ohne EinschrÃ€nkungen der Anzahl der Produkte.
-
-== Description ==
-wpShopGermany Free erlaubt das Verkaufen von elektronischen Waren/GÃŒtern (Downloads von PDF, MP3, etc.) und physische Waren sowie Dienstleistungen/Software. Es bietet einen klassischen Checkout-Prozess mit Warenkorb und Kundenverwaltung.
-Enthalten und voll funktionsfÃ€hig sind alle rechtlich vorgeschriebenen Funktionen fÃŒr Deutschland, Ãsterreich und Schweiz (D-A-CH), z.B. ButtonlÃ¶sung, Bestellbedingungen, Widerrufsrecht, Preisauszeichnung, und so weiter. Ebenfalls ist die Integration von zusÃ€tzlichen Plugins der Rechtstexteanbieter (HÃ€ndlerbund, IT-Recht-Kanzlei MÃŒnchen, Protected Shops) gewÃ€hrleistet.
-
-> Mit einem kostenpflichtigen Upgrade der Lizenz auf Pro oder Enterprise haben Sie folgende Vorteile:
->
-> * Zugriff auf weitere nÃŒtzliche wpShopGermany-Kauf-Module wie Rechnungen, Lieferscheine, Payment Module (PayPal Plus, Amazon Pay, u.v.m.), Statistik, Sofort Ident, u.s.w.
-> * 1 Jahr Updates und Support
-
-[Dokumentation wpShopGermany](https://doc.maennchen1.de/docs/wpshopgermany4/ueber-wpshopgermany/ "Dokumentation wpShopGermany")
-
-= Funktionsumfang =
-wpShopGermany Free hat keinen reduzierteren Funktionsumfang. Es fehlt lediglich die IntegrationsmÃ¶glichkeit von wpShopGermany-Kauf-Modulen.
-Folgende Funktionen sind enthalten:
-
-* Zahlungsarten: PayPal, Vorkasse, Bankeinzug
-* Versandart: Download (E-Mail), frei einstellbar nach Bestellwert, StÃŒckzahl oder Gewicht, oder Selbstabholung
-* Einbindung Warenkorb mittels Widget
-* Ãbersicht aller Bestellungen, inkl. Protokoll
-* Ãbersicht aller Kunden (Kundenverwaltung)
-* Ãbersicht aller Produkte (Produktverwaltung)
-* Frei konfigurierbare Artikel
-* Artikelanzahl: unlimitiert
-* Anzahl der Produktbilder: unlimitiert
-* EinfÃŒgen eines Produktes in einen/eine Artikel/Seite mittels RTE
-* Staffelpreise
-* CSV-, XML-Export / -Import der Produkte
-* CSV-, XML-Export / -Import der Kunden
-* CSV-, XML-Export / -Import der Bestellungen
-* Templatesystem zur freien Anpassung mittels HTML/PHP
-* UnterstÃŒtzung von Mehrsprachigkeit via WPML
-* Gutscheinsystem
-* Rechtstexte Integration ([HÃ€ndlerbund](https://wordpress.org/plugins/wpshopgermany-handlerbund/ "wpShopGermany Plugin: HÃ€ndlerbund"), [IT-Recht-Kanzlei MÃŒnchen](https://wordpress.org/plugins/wpshopgermany-it-recht-kanzlei/ "wpShopGermany Plugin: IT-Recht-Kanzlei MÃŒnchen"), [Protected Shops](https://wordpress.org/plugins/wpshopgermany-protectedshops// "wpShopGermany Plugin: Protected Shops"))
-* Benutzerverwaltung im Backend
-* Kundenlogin im Frontend
-* keine Sondermodule (separate Module kÃ¶nnen nur mit der Pro-/Enterpise Version erworben werden)
-
-= Shortcode Beispiele =
-1. Standard-Shortcode (Produkt-ID = 1): `[wpshopgermany product="1"]`
-1. Shortcode mit eigenem Produkttemplate: `[wpshopgermany product="1" template="Template.phtml"]`
-1. Darstellung einer vordefinierten Produktgruppe (ID = 1), aufsteigend nach Preis sortiert: `[wpshopgermany produktgruppe="1" sortierung="preis" richtung="asc"]`
-
-Der vereinfachte Shortcode wird unter "Produktverwaltung > Produkt bearbeiten > Allgemein > Shortcode" angezeigt â sofern das Produkt bereits angelegt wurde. Im RTE gibt es den Warenkorbbutton, welcher einen Dialog erscheinen lÃ€sst. Dort wird automatische der richtige Shortcode erzeugt.
-Mit dem kostenpflichtigen Modul Produktartikel kÃ¶nnen direkt WordPress BeitrÃ€ge angelegt werden, die Nutzung von Shortcodes ist dann nicht notwendig.
-
-[Dokumentation "Produkt einfÃŒgen"](https://doc.maennchen1.de/docs/wpshopgermany4/tutorials/produkt-einfuegen/ "Dokumentation: Produkt einfÃŒgen")
-
-== Installation ==
-
-1. Lade den Ordner `wpshopgermany-free` in dein WordPress Plugin Verzeichnis (`wp-config/plugins/`)
-1. Aktiviere das Plugin
-1. Setze Schreibberechtigungen fÃŒr Webserver auf unten stehende Ordner
-1. Konfiguriere das Plugin (Seiteneinstellungen, Shopinfo, etc.)
-1. Lege ein Produkt an
-1. Platziere den Shortcode in einem Beitrag
-
-= Schreibberechtigungen fÃŒr Webserver =
-(empfohlen: chmod 0755 oder 777)
-`/uploads/wpsg/
-/wp-content/plugins/wpshopgermany-free/lib/`
-
-[Dokumentation "wpShopGermany installieren"](https://doc.maennchen1.de/docs/wpshopgermany4/installation/installation/ "Dokumentation: wpShopGermany installieren")
-
-= Systemanforderungen = 
-
-* Apache Webserver
-* PHP ab 5.6 mit Bibliotheken fÃŒr:
- * OpenSSL
- * Curl
- * SimpleXML
- * Soap Client (nur fÃŒr Modul Micropayment)
- * Zip
-* empfohlene PHP-Einstellungen:
- * memory_limit = 128M*
- * max_execution_time = 600*
- * max_input_vars = 5000*
- * upload_max_filesize = 40M*
- * register_globals = Off
- * allow_url_fopen = On oder cURL
- * extension=php_openssl.dll (nur auf Windows-Server)
-* Verarbeitung der .htaccess-Datei um Verzeichnisse zu schÃŒtzen
-
-*) je nach Serververwendung kann dieser Wert zu gering ausfallen und muss ggf. korrigiert werden
-
-== Screenshots ==
-
-1. Frontend: Darstellung einer Shopseite mit Produkt + Warenborb-Button sowie Warenkorb-Widget (im ShopThemeOne)
-2. Frontend: gefÃŒllter Warenkorb
-3. Backend: Pflege eines Produktes (Ansicht "Allgemein")
-4. Backend: Einstellungen fÃŒr das Modul Downloadprodukte
-5. Backend: optionale Anpassung der Bestellbedingungen fÃŒr bestimmte Produkte
-6. Backend: Optionen der Kundenverwaltung
-
-== Changelog ==
- 
-%cl%
Index: /system/conf.php
===================================================================
--- /system/conf.php	(revision 8528)
+++ /system/conf.php	(revision 5261)
@@ -6,10 +6,5 @@
 	$arExclude = array(
 		"mod_keygen", "wpsg_mod_keygen.class.php",
-		"mod_addressvalidation", "wpsg_mod_addressvalidation.class.php",
-		"mod_surfaceproduct", "wpsg_mod_surfaceproduct.class.php",
-		"mod_targo", "wpsg_mod_targo.class.php",
-		"mod_creditcard", "wpsg_mod_creditcard.class.php",
 		"mod_paypalapi", "wpsg_mod_paypalapi.class.php",
-		"mod_amazon", "wpsg_mod_amazon.class.php", "wpsg_mod_amazon",	
 		"mod_productfilter", "wpsg_mod_productfilter.class.php", "wpsg_mod_productfilter",
 		"mod_securepay", "wpsg_mod_securepay.class.php", "wpsg_mod_securepay",
@@ -25,5 +20,4 @@
 		"user_views", "bildertest.phtml",
 		"user_mods",
-		"mod_si", "wpsg_mod_si.class.php", "wpsg_mod_si",
 		"mod_customernr", "mod_customernr.class.php",
 		"translation.php",
@@ -32,9 +26,9 @@
 		"mod_spconditions", "wpsg_mod_spconditions.class.php", "wpsg_mod_spconditions",
 		"mod_customermap", "wpsg_mod_customermap.class.php",
+		"mod_piwik", "wpsg_mod_piwik.class.php",
 		"mod_produktartikel", "wpsg_mod_produktartikel.class.php",
 		"mod_cab", "wpsg_mod_cab.class.php",
 		"mod_voucherproduct", "wpsg_mod_voucherproduct.class.php",
 		"mod_klarna", "wpsg_mod_klarna.class.php",
-		"mod_si", "wpsg_mod_si.class.php", "wpsg_mod_si",
 		"mod_test", "wpsg_mod_test.class.php",
 		"mod_haendlerbund", "wpsg_mod_haendlerbund.class.php",
@@ -58,5 +52,5 @@
 		'mod_customergroup', 'wpsg_mod_customergroup.class.php', 'wpsg_mod_customergroup',
 		"mod_rechnungen", "wpsg_mod_rechnungen.class.php",
-		"key.txt"
+		"kex.txt"
 	);
 	
Index: /system/module.php
===================================================================
--- /system/module.php	(revision 8528)
+++ /system/module.php	(revision 5261)
@@ -8,5 +8,5 @@
 	$arModule = array(
 	
-		/*'wpsg_mod_videodownload' => array(
+		'wpsg_mod_videodownload' => array(
 			'modulname' => 'wpsg_mod_videodownload', 
 			'files' => array(
@@ -19,5 +19,4 @@
 			'hide' => true
 		),
-		*/
 		'wpsg_mod_customernr' => array(
 			'modulname' => 'wpsg_mod_customernr',
@@ -29,5 +28,5 @@
 			'hide' => true
 		),		
-		/*'wpsg_mod_orderupload' => array(
+		'wpsg_mod_orderupload' => array(
 			'modulname' => 'wpsg_mod_orderupload',
 			'files' => array(
@@ -38,27 +37,5 @@
 			'version' => '3.3.0',
 			'hide' => true
-		),*/
-		'wpsg_mod_targo' => array(
-			'shop_product_id' => 66,
-			'modulname' => 'wpsg_mod_targo',
-			'files' => array(
-				'mods/wpsg_mod_targo.class.php',
-				'views/mods/mod_targo',
-				'views/gfx/targologo.png'
-			),
-			'url' => '',
-			'hide' => true
 		),		
-		'wpsg_mod_surfaceproduct' => array(
-			'shop_product_id' => 46,
-			'modulname' => 'wpsg_mod_surfaceproduct',
-			'files' => array(
-					'mods/wpsg_mod_surfaceproduct.class.php',
-					'views/mods/wpsg_mod_surfaceproduct'
-			),
-			'url' => '',
-			'hide' => true,
-			'free' => false
-		),
 		/*
 		'wpsg_mod_ordercondition' => array(
@@ -74,29 +51,5 @@
 		),
 		*/
-
-		'wpsg_mod_si' => array(
-			'shop_product_id' => 36,
-			'modulname' => 'wpsg_mod_si',
-			'files' => array(
-				'mods/wpsg_mod_si.class.php',
-				'views/mods/mod_si'
-			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-sofort-ident/',
-			'hide' => true,
-			'free' => false
-		),
-		'wpsg_mod_amazon' => array(
-			'shop_product_id' => 34,
-			'modulname' => 'wpsg_mod_amazon',
-			'files' => array(
-				'mods/mod_amazon',				
-				'mods/wpsg_mod_amazon.class.php',
-				'views/mods/mod_amazon'
-			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany-modul-amazon-payment/',
-			'version' => '3.3.0',
-			'hide' => false,
-			'free' => false
-		),
+			
 		'wpsg_mod_paypalapi' => array(
 			'shop_product_id' => 33,
@@ -106,5 +59,5 @@
 				'views/mods/mod_paypalapi'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-paypal-plus/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-paypalplus/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -114,10 +67,9 @@
 			'shop_product_id' => 31,
 			'modulname' => 'wpsg_mod_request',
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-anfrageprodukt/',
 			'files' => array(
 				'mods/wpsg_mod_request.class.php',
 				'views/mods/mod_request'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-anfrageprodukte/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-anfrageprodukte/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -131,5 +83,5 @@
 				'views/mods/mod_minrequest/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-mindestbestellwert/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-mindestbestellwert/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -143,5 +95,5 @@
 				'views/mods/mod_minquantity/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-mindestbestellmenge/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-mindestbestellmenge/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -155,5 +107,5 @@
 				'views/mods/mod_packagetracking/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-paketverfolgung/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-paketverfolgung/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -179,5 +131,5 @@
 				'views/mods/mod_deliverynote'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-lieferschein/',
+			'url' => 'https://shop.maennchen1.de/produkte/wpshopgermany-modul_lieferschein/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -203,5 +155,5 @@
 				'views/mods/mod_abo/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-aboprodukte/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul_aboprodukte/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -214,8 +166,7 @@
 				'mods/wpsg_mod_rechnungen.class.php',
 				'mods/mod_rechnungen/',
-				'mods/mod_rechnungen/lib/',
 				'views/mods/mod_rechnungen/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-rechnungen/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-rechnungen/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -231,5 +182,5 @@
 				'lib/jqplot/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-statistik/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul_statistik/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -244,5 +195,5 @@
 				'views/mods/mod_customergroup/'		
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-kundengruppen/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-kundengruppen/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -342,5 +293,5 @@
 				'views/mods/mod_shs/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-internetkasse/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul_internetkasse/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -355,5 +306,5 @@
 				'views/mods/mod_produktartikel/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-produktartikel/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpShopGermany-Modul_ProduktArtikel/',
 			'version' => '3.3.0',
 			'hide' => false,
@@ -368,35 +319,9 @@
 				'views/mods/mod_downloadplus/'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-downloadplus/',
-			'version' => '3.3.0',
-			'hide' => false,
-			'free' => false
-		),	
-		'wpsg_mod_addressvalidation' => array(
-					'shop_product_id' => 44,
-					'modulname' => 'wpsg_mod_addressvalidation',
-					'files' => array(
-							'mods/wpsg_mod_addressvalidation.class.php',
-							'mods/mod_addressvalidation/',
-							'views/mods/mod_addressvalidation/'
-					),
-					'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-adressen-validierung/',
-					'version' => '3.3.0',
-					'hide' => false,
-					'free' => false
-		),
-		'wpsg_mod_creditcard' => array(
-					'shop_product_id' => 45,
-					'modulname' => 'wpsg_mod_creditcard',
-					'files' => array(
-							'mods/wpsg_mod_creditcard.class.php',
-							'mods/mod_creditcard/',
-							'views/mods/mod_creditcard/'
-					),
-					'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-kreditkarte/',
-					'version' => '3.3.0',
-					'hide' => false,
-					'free' => false
-		),
+			'url' => 'http://shop.maennchen1.de/produkte/wpshopgermany-modul-downloadplus/',
+			'version' => '3.3.0',
+			'hide' => false,
+			'free' => false
+		),		
 		/*'wpsg_mod_cab' => array(
 			'modulname' => 'wpsg_mod_cab',
@@ -419,5 +344,5 @@
 				'views/mods/mod_voucherproduct'
 			),
-			'url' => 'https://shop.maennchen1.de/produkt/wpshopgermany4-modul-gutscheinprodukt/',
+			'url' => 'http://shop.maennchen1.de/produkte/wpShopGermany-Modul_GutscheinProdukt/',
 			'version' => '3.3.0',
 			'hide' => false,
Index: /system/obfus.php
===================================================================
--- /system/obfus.php	(revision 8528)
+++ /system/obfus.php	(revision 5261)
@@ -77,5 +77,5 @@
 	   		{	   		
 
-	   			$test_path = str_replace('/scr/wpsg4/wpshopgermany_svn/', '', realpath($dir.'/'.$file));
+	   			$test_path = str_replace('/scr/wpsg/wpshopgermany_svn/', '', realpath($dir.'/'.$file));
 					   			
 	   			if (in_array($file, $arExclude_copy))
@@ -170,9 +170,9 @@
 		
 			// Archiv kopieren 
-			//copy(dirname(__FILE__).'/../../wpsg_module/'.$m['modulname'].'_'.$version.'.zip', '/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_'.$version.'.zip');
+			copy(dirname(__FILE__).'/../../wpsg_module/'.$m['modulname'].'_'.$version.'.zip', '/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_'.$version.'.zip');
 
 			// Symlink Latest anlegen
-			//if (file_exists('/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_latest.zip')) unlink('/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_latest.zip');
-			//exec('ln -s /var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_'.$version.'.zip /var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_latest.zip'); 
+			if (file_exists('/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_latest.zip')) unlink('/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_latest.zip');
+			exec('ln -s /var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_'.$version.'.zip /var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_latest.zip'); 
 
 			echo "Modul ".$m['modulname']." Version ".$version." installiert ...\r\n";
@@ -183,8 +183,8 @@
 			
 			// Test
-			//file_put_contents(dirname(__FILE__).'/../../wpsg_module_version/'.$m['modulname'].'_dev', $version.'|'.$version.'|'.$m['url'].'|'.((isset($m['free']) && $m['free'] === true)?'1':'0').'|'.((isset($m['hide']) && $m['hide'] === true)?'1':'0'));
+			file_put_contents(dirname(__FILE__).'/../../wpsg_module_version/'.$m['modulname'].'_dev', $version.'|'.$version.'|'.$m['url'].'|'.((isset($m['free']) && $m['free'] === true)?'1':'0').'|'.((isset($m['hide']) && $m['hide'] === true)?'1':'0'));
 			
 			// Archiv kopieren			
-			//copy(dirname(__FILE__).'/../../wpsg_module/'.$m['modulname'].'_'.$version.'.zip', '/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_dev.zip');
+			copy(dirname(__FILE__).'/../../wpsg_module/'.$m['modulname'].'_'.$version.'.zip', '/var/home/htdocs/dl.maennchen1.de/www/wpsg/'.$m['modulname'].'/'.$m['modulname'].'_dev.zip');
 			
 			// Symlinks nutze ich hier nicht, da sonst unnÃ¶tige Versionen rumliegen
Index: /system/parseChangelog.php
===================================================================
--- /system/parseChangelog.php	(revision 8528)
+++ /system/parseChangelog.php	(revision 5261)
@@ -77,5 +77,4 @@
 
 		// Klasse fÃŒr XML-RPC Schnittstelle einbinden und aufrufen
-		require($wp_home.'/wp-load.php');
 		require($wp_home.'/wp-includes/class-IXR.php');
 		$rpc = new IXR_Client('http://wpshopgermany.maennchen1.de/xmlrpc.php');
Index: /system/readme.txt
===================================================================
--- /system/readme.txt	(revision 8528)
+++ /system/readme.txt	(revision 5261)
@@ -64,5 +64,5 @@
 (empfohlen: chmod 0777)
 `/uploads/wpsg/
-/uploads/wpsg/wpsg_produktbilder/
+/uploads/wpsg_produktbilder/
 /wp-content/plugins/wpshopgermany/lib/`
 
Index: /system/wpsg-en_US.po
===================================================================
--- /system/wpsg-en_US.po	(revision 8528)
+++ /system/wpsg-en_US.po	(revision 5261)
@@ -67,9 +67,4 @@
 msgid "Bibliotheken/Includes"
 msgstr "Libraries/Includes"
-
-#: controller/wpsg_AdminController.class.php:2
-#@ wpsg
-msgid "Datenschutz"
-msgstr "data protection"
 
 #: controller/wpsg_AdminController.class.php:2
@@ -438,5 +433,5 @@
 #: controller/wpsg_BasketController.class.php:2
 #@ wpsg
-msgid "Produkt erfolgreich in den Warenkorb gelegt."
+msgid "Produkt erfolgreich in den Warenkorb gefÃŒgt."
 msgstr "Product successfully added to your basket."
 
@@ -3065,4 +3060,14 @@
 msgid "JQuery einbinden"
 msgstr "Embed jQuery"
+
+#: views/admin/includes.phtml:27
+#@ wpsg
+msgid "Thickbox einbinden (JavaScript)"
+msgstr "Embed Thickbox (JavaScript)"
+
+#: views/admin/includes.phtml:28
+#@ wpsg
+msgid "Thickbox einbinden (Styles)"
+msgstr "Embed Thickbox (styles)"
 
 #: views/admin/includes.phtml:29
Index: /views/admin/access.phtml
===================================================================
--- /views/admin/access.phtml	(revision 8528)
+++ /views/admin/access.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Verwaltung der Berechtigungen
+	 * Template fÃŒr die Verwaltung der Berechtigunen
 	 */
 
@@ -8,97 +8,87 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
-	
+	</ul>
+			
 </div>
 		
-<div class="wpsg_admin_content form-horizontal">
+<div class="wpsg_admin_content">
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction='.$_REQUEST['subaction'].'&noheader=1'); ?>">
+
+		<?php global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles"); ?>
+
+		<table class="wpsg_access_table" cellpadding="0" cellspacing="0">
+			<tr>
+				<th class="wpsg_col_capname"></th>
+				<?php foreach ($arRoles as $role_key => $r) { ?>
+				<th class="wpsg_col_cap"><?php echo $r['name']; ?></th>
+				<?php } ?>
+				<th></th>
+			</tr>
+			<tr>
+				<td class="wpsg_col_capname"><?php echo __('MenÃŒpunkt sichtbar', 'wpsg'); ?></td>
+				<?php foreach ($arRoles as $role_key => $r) { ?>
+				<td class="wpsg_col_cap">
+					<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_menu]" value="0" />
+					<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_menu']) && $r['capabilities']['wpsg_menu'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_menu]" value="1" /> 
+				</td>
+				<?php } ?>
+				<td></td>
+			</tr>
+			<tr>
+				<td class="wpsg_col_capname"><?php echo __('Konfiguration', 'wpsg'); ?></td>
+				<?php foreach ($arRoles as $role_key => $r) { ?>
+				<td class="wpsg_col_cap">
+					<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_conf]" value="0" />
+					<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_conf']) && $r['capabilities']['wpsg_conf'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_conf]" value="1" /> 
+				</td>
+				<?php } ?>
+				<td></td>
+			</tr>
+			<?php if ($this->hasMod('wpsg_mod_core')) { ?>
+			<tr>
+				<td class="wpsg_col_capname"><?php echo __('Lizenzverwaltung', 'wpsg'); ?></td>
+				<?php foreach ($arRoles as $role_key => $r) { ?>
+				<td class="wpsg_col_cap">
+					<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_lizence]" value="0" />
+					<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_lizence']) && $r['capabilities']['wpsg_lizence'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_lizence]" value="1" /> 
+				</td>
+				<?php } ?>
+				<td></td>
+			</tr>	
+			<?php } ?>
+			<tr>
+				<td class="wpsg_col_capname"><?php echo __('Bestellverwaltung', 'wpsg'); ?></td>
+				<?php foreach ($arRoles as $role_key => $r) { ?>
+				<td class="wpsg_col_cap">
+					<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_order]" value="0" />
+					<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_order']) && $r['capabilities']['wpsg_order'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_order]" value="1" /> 
+				</td>
+				<?php } ?>
+				<td></td>
+			</tr>		
+			<tr>
+				<td class="wpsg_col_capname"><?php echo __('Produktverwaltung', 'wpsg'); ?></td>
+				<?php foreach ($arRoles as $role_key => $r) { ?>
+				<td class="wpsg_col_cap">
+					<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_produkt]" value="0" />
+					<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_produkt']) && $r['capabilities']['wpsg_produkt'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_produkt]" value="1" /> 
+				</td>
+				<?php } ?>
+				<td></td>
+			</tr>			
+			<?php $this->callMods('admin_setcapabilities'); ?>
+		</table>
 		
-		<?php \wp_nonce_field('wpsg-admin-access'); ?>
-		
-		<?php global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles"); ?>
-		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Berechtigungen', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-
-				<table class="wpsg_access_table table" cellpadding="0" cellspacing="0">
-					<thead>
-						<tr>
-							<th class="wpsg_col_capname"></th>
-							<?php foreach ($arRoles as $role_key => $r) { ?>
-							<th class="wpsg_col_cap"><?php echo $r['name']; ?></th>
-							<?php } ?>
-							<th></th>
-						</tr>
-					</thead>
-					<tbody>
-						<tr>
-							<td class="wpsg_col_capname"><?php echo __('MenÃŒpunkt sichtbar', 'wpsg'); ?></td>
-							<?php foreach ($arRoles as $role_key => $r) { ?>
-							<td class="wpsg_col_cap">
-								<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_menu]" value="0" />
-								<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_menu']) && $r['capabilities']['wpsg_menu'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_menu]" value="1" /> 
-							</td>
-							<?php } ?>
-							<td></td>
-						</tr>
-						<tr>
-							<td class="wpsg_col_capname"><?php echo __('Konfiguration', 'wpsg'); ?></td>
-							<?php foreach ($arRoles as $role_key => $r) { ?>
-							<td class="wpsg_col_cap">
-								<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_conf]" value="0" />
-								<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_conf']) && $r['capabilities']['wpsg_conf'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_conf]" value="1" /> 
-							</td>
-							<?php } ?>
-							<td></td>
-						</tr>
-						<?php $wpsg_update_data = wpsg_get_update_data(); if (wpsg_isSizedInt($wpsg_update_data['returnCode'])) { ?>
-						<tr>
-							<td class="wpsg_col_capname"><?php echo __('Lizenzverwaltung', 'wpsg'); ?></td>
-							<?php foreach ($arRoles as $role_key => $r) { ?>
-							<td class="wpsg_col_cap">
-								<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_lizence]" value="0" />
-								<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_lizence']) && $r['capabilities']['wpsg_lizence'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_lizence]" value="1" /> 
-							</td>
-							<?php } ?>
-							<td></td>
-						</tr>	
-						<?php } ?>
-						<tr>
-							<td class="wpsg_col_capname"><?php echo __('Bestellverwaltung', 'wpsg'); ?></td>
-							<?php foreach ($arRoles as $role_key => $r) { ?>
-							<td class="wpsg_col_cap">
-								<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_order]" value="0" />
-								<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_order']) && $r['capabilities']['wpsg_order'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_order]" value="1" /> 
-							</td>
-							<?php } ?>
-							<td></td>
-						</tr>		
-						<tr>
-							<td class="wpsg_col_capname"><?php echo __('Produktverwaltung', 'wpsg'); ?></td>
-							<?php foreach ($arRoles as $role_key => $r) { ?>
-							<td class="wpsg_col_cap">
-								<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_produkt]" value="0" />
-								<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_produkt']) && $r['capabilities']['wpsg_produkt'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_produkt]" value="1" /> 
-							</td>
-							<?php } ?>
-							<td></td>
-						</tr>			
-						<?php $this->callMods('admin_setcapabilities'); ?>
-					</tbody>
-				</table>
-			
-			</div>
-		</div>
-		
-		<p class="submit"><input type="submit" value="<?php echo __('Berechtigungen Speichern', 'wpsg'); ?>" name="submit" id="submit" class="button-primary" /></p>		
+		<br />
+		<input type="submit" value="<?php echo __('Berechtigungen Speichern', 'wpsg'); ?>" name="submit" id="submit" class="button-primary" />		
   
   	</form>
Index: /views/admin/blognetzwerk.phtml
===================================================================
--- /views/admin/blognetzwerk.phtml	(revision 8528)
+++ /views/admin/blognetzwerk.phtml	(revision 5261)
@@ -9,48 +9,39 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div>
+	</ul>
 			
 </div>
 
-<div class="wpsg_admin_content form-horizontal">
+<div class="wpsg_admin_content">
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>&amp;noheader=1">
-		
-		
-		<div class="panel panel-default">		
+		<div class="wpsg_admin_box">		
+				  		
+			<div class="wpsg_hinweis">
+				<?php echo __('Sie befinden sich in einer Multiblog Umgebung.', 'wpsg'); ?>
+			</div>
+			<br />
 			
-			<div class="panel-heading clearfix">
-      	<h3 class="panel-title"><?php echo __('Blognetzwerk-Einstellungen', 'wpsg'); ?></h3>
-      </div>
-				 
-			<div class="panel-body">	  		
-				<div class="info">
-					<br />
-						<?php echo __('Sie befinden sich in einer Multiblog Umgebung.', 'wpsg'); ?>
-					<br />
-				</div>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_multiblog_standalone', __('Jeden Blog getrennt behandeln', 'wpsg'), $this->get_option('wpsg_multiblog_standalone', true)); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_multiblog_sessionPath', __('Session auf Verzeichnis einschrÃ€nken', 'wpsg'), $this->get_option('wpsg_multiblog_sessionPath', true), array('help' => 'wpsg_multiblog_sessionPath')); ?>
+					
+			<input type="hidden" name="subaction" value="blognetzwerk" />
 				
-				<div class="wpsg_form_field">
-
-						<?php echo wpsg_drawForm_Checkbox('wpsg_multiblog_standalone', __('Jeden Blog getrennt behandeln', 'wpsg'), $this->get_option('wpsg_multiblog_standalone', true), array('help' => 'wpsg_multiblog_standalone')); ?>
-						<?php echo wpsg_drawForm_Checkbox('wpsg_multiblog_sessionPath', __('Session auf Verzeichnis einschrÃ€nken', 'wpsg'), $this->get_option('wpsg_multiblog_sessionPath', true), array('help' => 'wpsg_multiblog_sessionPath')); ?>
-						
-						<input type="hidden" name="subaction" value="blognetzwerk" />
-
-				</div>			
-				<div class="info">
-					<br />
-						<?php echo __('Nach der Umstellung dieser Option sollte in den Blogs in denen der Shop noch verwendet wird die Shop Datenbank aktualisiert werden. (Einstellungen -> Allgemein)', 'wpsg'); ?>
-					<br />
-				</div>
+			<br />
+			
+			<div class="wpsg_hinweis">
+				<?php echo __('Nach der Umstellung dieser Option sollte in den Blogs in denen der Shop noch verwendet wird die Shop Datenbank aktualisiert werden. (Einstellungen -> Allgemein)', 'wpsg'); ?>
+			</div>
+				
+			<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 					
-				<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-			
-			</div>	
-		
 		</div>
 	</form>
Index: /views/admin/customerpreset.phtml
===================================================================
--- /views/admin/customerpreset.phtml	(revision 5261)
+++ /views/admin/customerpreset.phtml	(revision 5261)
@@ -0,0 +1,43 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Kundenvoreinstellungen im Backend
+	 */
+
+?>
+<div class="wpsg_admin_submenu">
+	
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
+		<?php } ?>
+	</ul>
+			
+</div>
+
+<div class="wpsg_admin_content">
+	
+	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;noheader=1&amp;subaction=<?php echo $_REQUEST['subaction']; ?>">
+
+		<?php echo wpsg_drawForm_Select('wpsg_customerpreset_shipping', __('Standard Versandart', 'wpsg'), $this->view['arShipping'], $this->get_option('wpsg_customerpreset_shipping')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_customerpreset_payment', __('Standard Zahlungsart', 'wpsg'), $this->view['arPayment'], $this->get_option('wpsg_customerpreset_payment')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_defaultland', __('Standardland', 'wpsg'), $this->view['arLander'], $this->get_option('wpsg_defaultland'), array('hint' => 
+			'nohspc_'.wpsg_translate(__('Die LÃ€nder kÃ¶nnen in der <a href="#1#">LÃ€nderverwaltung</a> definiert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender')		
+		)); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_customerpreset_title', __('Standardanrede', 'wpsg'), $this->view['arTitle'], $this->get_option('wpsg_customerpreset_title'), array(
+			'hint' => 'nohspc_'.wpsg_translate(__('Die Auswahl kann in den <a href="#1#">Kundendaten</a> definiert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten'),
+			'noIndex' => true 
+		)); ?>
+		
+		<br />
+				
+		<input class="button-primary" type="submit" name="wpsg-submit" value="<?php echo __('Speichern', 'wpsg'); ?>" />
+	
+	</form>
+	
+</div>
Index: ews/admin/dataprotection.phtml
===================================================================
--- /views/admin/dataprotection.phtml	(revision 8528)
+++ 	(revision )
@@ -1,84 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr den Admin Bereich der Datenschutzeinstellungen
-	 */
-
-?>
-<div class="wpsg_admin_submenu">
-	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
-		<?php } ?>
-	</div> 
-			
-</div>
-
-<div class="wpsg_admin_content form-horizontal">
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=<?php echo $_REQUEST['subaction']; ?>&noheader=1">
-	
-		<?php echo wp_nonce_field('wpsg-admin-dataprotection'); ?>
-		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Datenschutzbeauftragter', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-  			
-	  			<?php /* BehÃ¶rdliche Meldung eines Datenschutzbeauftragten */ ?>
-				<?php echo wpsg_drawForm_Checkbox('dataprotectioncommissioner', __('Datenschutzbeauftragter vorhanden', 'wpsg'), $this->get_option('dataprotectioncommissioner')); ?>
-				<div class="dataprotectioncommissioner_activ" style="display:none;">
-					<?php echo wpsg_drawForm_Input('dataprotectioncommissioner_name', __('Name:', 'wpsg'), $this->get_option('dataprotectioncommissioner_name')); ?>					
-					<?php echo wpsg_drawForm_Input('dataprotectioncommissioner_tel', __('Telefon:', 'wpsg'), $this->get_option('dataprotectioncommissioner_tel')); ?>	
-					<?php echo wpsg_drawForm_Input('dataprotectioncommissioner_email', __('E-Mail:', 'wpsg'), $this->get_option('dataprotectioncommissioner_email')); ?>	
-										
-					<?php echo wpsg_drawForm_TextStart(); ?>
-					<a href="https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html" target=_blank ><?php echo __('Liste der AufsichtsbehÃ¶rden (Inland, EU, Ausland)', 'wpsg'); ?></a>				
-					<?php echo wpsg_drawForm_TextEnd(__('Meldepflicht nach Â§4d Abs. 1 BDSG', 'wpsg')); ?>
-	  			</div>
-  			 			
-  			</div>
-  		</div>	
-  				
-  		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('LÃ¶schen der kundenspezifischen Daten', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">	
-						
-                <?php echo wpsg_drawForm_Input('wpsg_customerdatadelete', __('Letzte AktivitÃ€t Ã€lter als', 'wpsg'), $this->get_option('wpsg_customerdatadelete'));?>				
-                <?php echo wpsg_drawForm_Select('wpsg_customerdatadelete_unit', __('Einheit', 'wpsg'), array('0' => __('Tag(e)', 'wpsg'), '1' => __('Monat(e)', 'wpsg'), '2' => __('Jahr(e)', 'wpsg')), $this->get_option('wpsg_customerdatadelete_unit')); ?>
-				<?php echo wpsg_drawForm_Select('wpsg_customerdatedelete_who', __('Kundenart', 'wpsg'), ['0' => __('Alle', 'wpsg'), '1' => __('Nur Gastkunden', 'wpsg')], $this->get_option('wpsg_customerdatedelete_who')); ?>
-								
-			</div>
-			
-		</div>	
-			
-		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-		
-		<script type="text/javascript">/* <![CDATA[ */
- 
-			jQuery(document).ready(function() {
-				
-				jQuery('#dataprotectioncommissioner').bind('change', function() {
-
-					if (jQuery(this).is(':checked')) jQuery('.dataprotectioncommissioner_activ').show();
-					else jQuery('.dataprotectioncommissioner_activ').hide();
-					
-				} ).change();
-
-				jQuery('#dataprotectioncommissioner_texts').bind('change', function() {
-
-					if (jQuery(this).is(':checked')) jQuery('.dataprotectioncommissioner_textsactiv').show();
-					else jQuery('.dataprotectioncommissioner_textsactiv').hide();
-					
-				} ).change();
-				
-			} );
-		
-		/* ]]> */</script>
-			
-	</form>
-</div>
Index: /views/admin/deinstall.phtml
===================================================================
--- /views/admin/deinstall.phtml	(revision 8528)
+++ /views/admin/deinstall.phtml	(revision 5261)
@@ -8,50 +8,52 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
+	</ul>
 			
 </div>
 
 <div class="wpsg_admin_content">
-
-	<?php echo wpsg_drawForm_AdminboxStart(__('DatensÃ€tze lÃ¶schen / Plugin deinstallieren', 'wpsg')); ?>
-
-	<form name="form1" class="form-horizontal" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;noheader=1&amp;subaction=<?php echo $_REQUEST['subaction']; ?>">
-
-		<?php echo wp_nonce_field('wpsg-admin-deinstall'); ?>
+	
+	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;noheader=1&amp;subaction=<?php echo $_REQUEST['subaction']; ?>">
+	
+		<p><?php echo __('Bitte wÃ€hlen Sie aus, was Sie entfernen mÃ¶chten?', 'wpsg'); ?></p>
 		
-		<p><?php echo __('Bitte wÃ€hlen Sie aus, was Sie entfernen mÃ¶chten?', 'wpsg'); ?></p>
-
-		<?php echo wpsg_drawForm_Checkbox('wpsg_deinstall_products', wpsg_translate(__('Produkte (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_products'] > 0)?$this->view['count_products']:0)), false, array('fullWidth' => true)); ?>
-		<?php echo wpsg_drawForm_Checkbox('wpsg_deinstall_customer', wpsg_translate(__('Kunden (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_customer'] > 0)?$this->view['count_customer']:0)), false, array('fullWidth' => true)); ?>
-		<?php echo wpsg_drawForm_Checkbox('wpsg_deinstall_order', wpsg_translate(__('Bestellungen (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_order'] > 0)?$this->view['count_order']:0)), false, array('fullWidth' => true)); ?>
-		<?php echo wpsg_drawForm_Checkbox('wpsg_deinstall_incompleteorder', wpsg_translate(__('UnvollstÃ€ndige Bestellungen (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_order_incomplete'] > 0)?$this->view['count_order_incomplete']:0)), false, array('fullWidth' => true)); ?>
-
+		<label>
+			<input type="checkbox" value="1" name="wpsg_deinstall_products" />&nbsp;<?php echo wpsg_translate(__('Produkte (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_products'] > 0)?$this->view['count_products']:0)); ?>
+		</label><br />
+		<label>
+			<input type="checkbox" value="1" name="wpsg_deinstall_customer" />&nbsp;<?php echo wpsg_translate(__('Kunden (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_customer'] > 0)?$this->view['count_customer']:0)); ?>
+		</label><br />
+		<label>
+			<input type="checkbox" value="1" name="wpsg_deinstall_order" />&nbsp;<?php echo wpsg_translate(__('Bestellungen (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_order'] > 0)?$this->view['count_order']:0)); ?>			
+		</label><br />
+		<label>
+			<input type="checkbox" value="1" name="wpsg_deinstall_incompleteorder" />&nbsp;<?php echo wpsg_translate(__('UnvollstÃ€ndige Bestellungen (#1# DatensÃ€tze)', 'wpsg'), (($this->view['count_order_incomplete'] > 0)?$this->view['count_order_incomplete']:0)); ?>
+		</label><br />
+		 			
 		<br />
+		<label>
+			<input type="checkbox" value="1" name="wpsg_deinstall_core" />&nbsp;<?php echo __('Plugin, Programmdateien, Moduldateien und Datenbanktabellen', 'wpsg'); ?>
+		</label>
+		 			
+		<p class="submit"><input onclick="return wpsg_check_deinstall();" type="submit" value="<?php echo __('Deinstallation durchfÃŒhren', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 		
-		<?php echo wpsg_drawForm_Checkbox('wpsg_deinstall_core', __('Plugin, Programmdateien, Moduldateien und Datenbanktabellen', 'wpsg'), false, array('fullWidth' => true)); ?>
-
-		<br />
-		
-		<?php echo wpsg_drawForm_Checkbox('wpsg_deinstall_sites', __('Shopseiten (Warenkorbseite, Produktdetailseite, Versandkosten, AGB, Datenschutz, Widerrufsbelehrung, Impressum, ... )', 'wpsg'), false, array('fullWidth' => true)); ?>
-		
-		<p class="submit"><input onclick="return wpsg_check_deinstall();" type="submit" value="<?php echo __('Deinstallation durchfÃŒhren', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-
 		<div class="wpsg_hinweis">
-			<?php echo __('Hinweis: Es werden hier auch bereits gelÃ¶schte DatensÃ€tze angezeigt/gezÃ€hlt, da diese noch im System hinterlegt bleiben.', 'wpsg'); ?><br /><br />
-			<strong><?php echo __('Das Deinstallieren und LÃ¶schen der DatensÃ€tze ist nicht umkehrbar!', 'wpsg'); ?></strong>
+			<?php echo __('Hinweis: Es werden hier auch bereits gelÃ¶schte DatensÃ€tze angezeigt, da diese noch im System hinterlegt bleiben.', 'wpsg'); ?><br /><br />
+			<strong><?php echo __('Das Deinstallieren ist aber nicht umkehrbar!', 'wpsg'); ?></strong>
 		</div>
-
+	
 	</form>
-
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
 </div>
 
-<script type="text/javascript">/* <![CDATA[ */
+<script type="text/javascript">
 
 	function wpsg_check_deinstall()
@@ -76,3 +78,3 @@
 	} // function wpsg_check_deinstall()
 
-/* ]]> */</script>
+</script>
Index: /views/admin/emailconf.phtml
===================================================================
--- /views/admin/emailconf.phtml	(revision 8528)
+++ /views/admin/emailconf.phtml	(revision 5261)
@@ -8,147 +8,66 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>
-			<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>
-		<?php } ?>
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
 	</div>
 
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
+		<?php } ?>
+	</ul>
+			
 </div>
 
-<script>
+<div class="wpsg_admin_content">
+	
+	<h3>
+		<?php echo __('E-Mail Konfiguration', 'wpsg'); ?>
+		<a title="<?php echo __('Hilfeseite zur E-Mail Konfiguration', 'wpsg'); ?>" class="wpsg_form_help_notip" href="http://wpshopgermany.maennchen1.de/?p=3284" target="_blank"></a>
+	</h3>
+			
+	<p><?php echo __('Hier kÃ¶nnen die Betreffs, EmpfÃ€nger und BCC/CC der E-Mails konfiguriert werden.', 'wpsg')?></p>
+		
+	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>">
 
-    var uploadData = {};
-    
-</script>
-
-<div class="wpsg_admin_content form-horizontal">
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf&noheader=1'); ?>">
-
-		<?php wp_nonce_field('wpsg-admin-emailconf'); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_htmlmail', __('HTML Mails versenden', 'wpsg'), $this->get_option('wpsg_htmlmail')); ?>
 		
-		<?php echo wpsg_drawForm_AdminboxStart('Allgemeine Einstellungen', 'wpsg'); ?>
-		<?php $logoPath = wpsg_getUploadDir('wpsg_mailconf').'wpsg_email_logo.jpg'; ?>
-
-		<?php echo wpsg_drawForm_Checkbox(
-			'wpsg_htmlmail',
-			__('HTML Mails versenden', 'wpsg'),
-			$this->get_option('wpsg_htmlmail')
-		); ?>
-
-
-		<div class="col-emaillogo">
-
-			<?php if(file_exists($logoPath)) { ?>
-                
-				<?php echo wpsg_drawForm_Checkbox(
-					'wpsg_email_logo_activated',
-					__("E-Maillogo anzeigen"),
-					$this->get_option('wpsg_email_logo_activated')
-				); ?>
-
-				<?php echo wpsg_drawForm_Checkbox(
-					'wpsg_email_logo_watermark',
-					__("E-Maillogo als Wasserzeichen anzeigen"),
-					$this->get_option('wpsg_email_logo_watermark')
-				); ?>
-                
-			<?php } ?>
-
-			<br />
+		<br />
+	
+		<div class="wpsg_admin_box">		
+				  		 			
+			<?php echo wpsg_drawEMailConfig(
+					'global', 
+					__('Globale Vorgaben', 'wpsg'), 
+					__('Werden keine Angaben fÃŒr die folgenden E-Mails gemacht, so gelten die globalen Angaben.', 'wpsg')); ?>
+					
+			<?php echo wpsg_drawEMailConfig(
+					'adminmail', 
+					__('BestellbestÃ€tigung (Admin)', 'wpsg'), 
+					__('Diese Mail bekommt der Admin beim Eingang einer neuen Bestellung.', 'wpsg'), 
+					true); ?>
+				  		
+			<?php echo wpsg_drawEMailConfig(
+					'kundenmail', 
+					__('BestellbestÃ€tigung (Kunde)', 'wpsg'), 
+					__('Diese Mail bekommt der Kunde nach DurchfÃŒhrung der Bestellung.', 'wpsg'),
+					false,
+					true); ?>
 			
-			<div class="form-group">
-				<div class="col-sm-6 control-label control-label-email-conf">
-					<label><?php echo __("E-Maillogo (JPG)"); ?></label>
-				</div>
-				<div class="col-sm-6">
-					<?php if(file_exists($logoPath)) { ?>
-						<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf&getEmailLogo=1&noheader=1'; ?>" target="_blank"><?php echo __('Derzeitiges Logo', 'wpsg'); ?></a><br>
-					<?php } ?>
-					<input type="file" name="wpsg_email_logo">
-				</div>
-
-				<?php if(file_exists($logoPath)) { ?>
-					<?php echo wpsg_drawForm_Checkbox(
-						'wpsg_email_logo_del',
-						__("Logo LÃ¶schen"),
-						0
-					); ?>
-				<?php } ?>
-
-			</div> <!-- .form-group -->
-			
-			<br />
-			
-			<?php if(file_exists($logoPath)) { ?>
-
-				<div class="form-group col-logo-alignment">
-					<div class="col-sm-6 control-label control-label-email-conf">
-						<label><?php echo __("Ausrichtung des Maillogos"); ?></label>
-					</div>
-					<div class="col-sm-6 email-logo-alignment">
-						<?php $logoAlignment = $this->get_option('wpsg_email_logo_alignment'); ?>
-						<?php $standardAlignment = false; ?>
-						<?php if(!wpsg_isSizedString($logoAlignment)) $standardAlignment = true; ?>
-						<input type="radio" name="wpsg_email_logo_alignment" value="left" <?php if($logoAlignment === "left"):?>checked<?php endif;?>> <span>&#xf036 <?php echo __("LinksbÃŒndig"); ?></span> <br>
-						<input type="radio" name="wpsg_email_logo_alignment" value="center" <?php if($logoAlignment === "center"):?>checked<?php endif;?>> <span>&#xf037 <?php echo __("Zentriert"); ?></span> <br>
-						<input type="radio" name="wpsg_email_logo_alignment" value="right" <?php if($logoAlignment === "right" || $standardAlignment):?>checked<?php endif;?>> <span>&#xf038 <?php echo __("RechtsbÃŒndig"); ?></span>
-					</div>
-				</div>
+			<?php echo wpsg_drawEMailConfig(
+					'status', 
+					__('StatusÃ€nderung (Kunde)', 'wpsg'), 
+					__('Diese Mail bekommt der Kunde bei der Ãnderung des Bestellstatus.', 'wpsg')); ?>
+							
+			<?php $this->callMods('admin_emailconf'); ?>
+								
+		</div>
+		
+		<div class="wpsg_hinweis"><?php echo __('Klicken Sie auf die jeweilige Mail um die Einstellungen angezeigt zu bekommen bzw. zu Ã€ndern.', 'wpsg'); ?></div>
+		
+		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 				
-				<br />
-				
-				<?php $logoTransparency = $this->get_option('wpsg_email_logo_transparency'); ?>
-				<?php if(!wpsg_isSized($logoTransparency)) $logoTransparency = "100%"; ?>
-				<?php echo wpsg_drawForm_Input(
-					'wpsg_email_logo_transparency',
-					__("Deckkraft des Logos"),
-					strpos($logoTransparency, "%") !== false ? $logoTransparency : $logoTransparency."%"
-				); ?>
-
-			<?php } ?>
-
-		</div>
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-		<?php echo wpsg_drawEMailConfig(
-			'global',
-			__('Globale Vorgaben', 'wpsg'),
-			__('Werden keine Angaben fÃŒr die folgenden E-Mails gemacht, so gelten die globalen Angaben.', 'wpsg')); ?>
-
-		<?php echo wpsg_drawEMailConfig(
-			'adminmail',
-			__('BestellbestÃ€tigung (Admin)', 'wpsg'),
-			__('Diese Mail bekommt der Admin beim Eingang einer neuen Bestellung.', 'wpsg'),
-			true); ?>
-
-		<?php echo wpsg_drawEMailConfig(
-			'kundenmail',
-			__('BestellbestÃ€tigung (Kunde)', 'wpsg'),
-			__('Diese Mail bekommt der Kunde nach DurchfÃŒhrung der Bestellung.', 'wpsg'),
-			false,
-			true); ?>
-
-		<?php echo wpsg_drawEMailConfig(
-			'status',
-			__('StatusÃ€nderung (Kunde)', 'wpsg'),
-			__('Diese Mail bekommt der Kunde bei der Ãnderung des Bestellstatus.', 'wpsg')); ?>
-
-        <?php echo wpsg_drawEMailConfig(
-            'reminder',
-            __('Erinnerung bei Nichtabschluss', 'wpsg'),
-            __('Diese Mail bekommen Kunden die eine Bestellung nicht abgeschlossen haben.', 'wpsg'),
-			false,
-			false,
-			'mailtemplates/reminder.phtml'
-		); ?>
-
-		<?php $this->callMods('admin_emailconf'); ?>
-
-		<div class="wpsg_hinweis"><?php echo __('Klicken Sie auf die jeweilige Mail um die Einstellungen angezeigt zu bekommen bzw. zu Ã€ndern.', 'wpsg'); ?></div>
-
-		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-
-	</form>
+	</form>	
 </div>
 
@@ -162,100 +81,35 @@
 
 		var wpsg_mail_open = Array();
-
-		jQuery('.wpsg_email_box .panel-body:visible').each(function() {
+		
+		jQuery('.wpsg_admin_box .wpsg_mail_content:visible').each(function() {
 
 			wpsg_mail_open.push(jQuery(this).prev().attr("id"));
-
+			
 		} );
 
 		jQuery.cookie('wpsg_mail', wpsg_mail_open.join(','));
+		 
+	} // function wpsg_mail_save_cookie()
 
-	} // function wpsg_mail_save_cookie()
-    
-    function wpsg_removeAttachemnt(a) {
-	     
-	    var id = parseInt(a.getAttribute('data-id'));
-	    var key = a.getAttribute('data-key');
- 
-        uploadData[key].forEach(function(item, index, object) {
+	jQuery(document).ready(function() {
 
-            if (parseInt(item.id) === id) {
- 
-                object.splice(index, 1);
-                
-            }
-            
-        } ); 
-                
-        return false;
-	    
-    }
-    
-    var wpframe;
-	
-	jQuery(document).ready(function() {
-	    
-        jQuery(".btnAddAttachment").click(function(event) {
-
-            var source = event.target || event.srcElement;
-            var key = jQuery(source).attr("data-key");
-            
-            event.preventDefault();
-
-            if (wpframe) { wpframe.open(); return; }
- 
-            wpframe = wp.media.frames.file_frame = wp.media({
-                title: "<?php echo __('AuswÃ€hlen oder Hochladen von Medien', 'wpsg'); ?>",
-                button: { text: "<?php echo __('Medien benutzen', 'wpsg'); ?>" },
-                multiple: true  
-            });
- 
-            wpframe.on('select', function() {
-
-                var attachments = wpframe.state().get('selection').map( function(attachment) {
-
-                    attachment.toJSON();
- 
-                    var bDrin = false;
-                
-                    for (var i in uploadData[key]) {
-                        
-                        if (uploadData[key][i].id === attachment.id) {
-                            
-                            bDrin = true;
-                            
-                            break;
-                            
-                        }
-                        
-                    }
-                    
-                    if (!bDrin) {
-                    
-                        uploadData[key].push( {
-                            id: attachment.id, 
-                            filename: attachment.attributes.filename,
-                            url: attachment.attributes.url
-                        } );
-                        
-                    }
-                    
-                    return attachment;
-                    
-                } ); 
-                
-            } );
- 
-            wpframe.open();
-
-        } );
-	    
-		jQuery('.wpsg_email_box .panel-heading').bind('click', function() {
+		jQuery('.wpsg_admin_box .wpsg_mail_head').bind('click', function() {
 
 			jQuery(this).next().toggle();
 
+			if (!jQuery(this).next().is(":visible"))
+			{				
+				jQuery(this).css('border-bottom', '1px solid #AAAAAA');				
+			}
+			else
+			{				
+				jQuery(this).css('border-bottom', '0px');				
+			}
+
 			wpsg_mail_save_cookie();
+			
+		} );
 
-		} ).css( { 'cursor': 'pointer' } ).disableSelection().next().hide();
+		jQuery('.wpsg_admin_box .wpsg_mail_head').disableSelection();
 
 		if (jQuery.cookie('wpsg_mail') != null)
@@ -266,30 +120,13 @@
 			for (var i = 0; i < arOpen.length; i ++)
 			{
-
+ 
 				jQuery('#' + arOpen[i]).next().show();
-				jQuery('#' + arOpen[i]).css('border-bottom', '0px');
-
+				jQuery('#' + arOpen[i]).css('border-bottom', '0px');	
+				
 			}
-
-		}
-
-		jQuery("#wpsg_htmlmail").click(function() {
-
-			if(jQuery("#wpsg_htmlmail")[0].checked == false) jQuery(".col-emaillogo").css("display", "none");
-			else $(".col-emaillogo").css("display", "block");
-
-		});
-		if(jQuery("#wpsg_htmlmail")[0].checked == false) jQuery(".col-emaillogo").css("display", "none");
-
-		jQuery("#wpsg_email_logo_watermark").click(function() {
-
-			if(jQuery("#wpsg_email_logo_watermark")[0].checked == true) jQuery(".col-logo-alignment").hide();
-			else jQuery(".col-logo-alignment").show()
-
-		});
+			
+		}				
 		
-		if(jQuery("#wpsg_email_logo_watermark").first().checked == true) jQuery(".col-logo-alignment").hide();
-
 	} );
 
-	/* ]]> */</script>
+/* ]]> */</script>
Index: /views/admin/extended.phtml
===================================================================
--- /views/admin/extended.phtml	(revision 8528)
+++ /views/admin/extended.phtml	(revision 5261)
@@ -8,53 +8,51 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
-	
+	</ul>
+			
 </div>
 		
-<div class="wpsg_admin_content form-horizontal">
+<div style="padding:0px; margin:0px; float:left;">
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=extended&noheader=1'); ?>">
+	
+		<?php echo wpsg_drawForm_Input('wpsg_salt', __('SALT SchlÃŒssel', 'wpsg'), $this->get_option('wpsg_salt')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_options_nl2br', __('RTE Felder mit nl2br speichern', 'wpsg'), $this->get_option('wpsg_options_nl2br')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_debugModus', __('Debug Modus', 'wpsg'), $this->get_option('wpsg_debugModus')); ?>
 		
-		<?php \wp_nonce_field('wpsg-save-admin-extended'); ?>
+		<?php if ($this->hasMod('wpsg_mod_core')) { ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_debugURL', __('Beta Updates laden', 'wpsg'), $this->get_option('wpsg_debugURL')); ?>				
+		<?php } ?>
 		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Erweiterte Einstellungen', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-	
-				<?php echo wpsg_drawForm_Input('wpsg_salt', __('SALT SchlÃŒssel', 'wpsg'), $this->get_option('wpsg_salt')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_options_nl2br', __('RTE Felder mit nl2br speichern', 'wpsg'), $this->get_option('wpsg_options_nl2br'), array('help' => 'wpsg_options_nl2br')); ?>
-				<br /> 
-				<?php echo wpsg_drawForm_Checkbox('wpsg_debugModus', __('Debug Modus', 'wpsg'), $this->get_option('wpsg_debugModus'), array('help' => 'wpsg_debugModus')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_debugLog', __('Fehler Protokoll aktivieren', 'wpsg'), $this->get_option('wpsg_debugLog'), array('help' => 'wpsg_debugLog')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_displayTemplates', __('Verwendete Templates anzeigen (Nur im Frontend)', 'wpsg'), $this->get_option('wpsg_displayTemplates'), array('help' => 'wpsg_displayTemplates')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_displayTemplatesLog', __('Verwendete Templates in Entwicklerkonsole anzeigen', 'wpsg'), $this->get_option('wpsg_displayTemplatesLog'), array('help' => 'wpsg_displayTemplatesLog')); ?>
-				<br />
+		<?php echo wpsg_drawForm_Checkbox('wpsg_referer_requesturi', __('RequestURI als ProduktURL verwenden', 'wpsg'), $this->get_option('wpsg_referer_requesturi')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_ignoreuserview', __('User Views ignorieren', 'wpsg'), $this->get_option('wpsg_ignoreuserview')); ?>		
+		<?php echo wpsg_drawForm_Checkbox('wpsg_classicupload', __('Klassisches Upload Formular', 'wpsg'), $this->get_option('wpsg_classicupload')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_content_filter_direct', __('Ausgaben im Warenkorb direkt ausgeben', 'wpsg'), $this->get_option('wpsg_content_filter_direct')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_options_no_rte_apply_filter', __('ApplyFilter Funktion nicht anwenden', 'wpsg'), $this->get_option('wpsg_options_no_rte_apply_filter')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_options_nl2br_out', __('RTE Felder mit nl2br ausgeben', 'wpsg'), $this->get_option('wpsg_options_nl2br_out')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_impexp_clearlinebreak', __('ZeilenumbrÃŒche im Export entfernen', 'wpsg'), $this->get_option('wpsg_impexp_clearlinebreak')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_removeWpAutoOp', __('wpautop deaktivieren', 'wpsg'), $this->get_option('wpsg_removeWpAutoOp'), array('help' => 'wpsg_removeWpAutoOp')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_removeWpTrimExcerpt', __('wp_trim_excerpt nicht verwenden', 'wpsg'), $this->get_option('wpsg_removeWpTrimExcerpt'), array('help' => 'wpsg_removeWpTrimExcerpt')); ?>		
+		<?php echo wpsg_drawForm_Checkbox('wpsg_autoraw', __('[raw] und [/raw] um Templates ausgeben (Frontend)', 'wpsg'), $this->get_option('wpsg_autoraw')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_nocache', __('Cachen von dynamischen Shopseiten verhindern', 'wpsg'), $this->get_option('wpsg_nocache')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_autolineending', __('MAC KompatibilitÃ€t bei Dateiimporten', 'wpsg'), $this->get_option('wpsg_autolineending')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_geo_determination', __('Abfrage des Kundenstandortes (EU-Leistungsortregel)', 'wpsg'), $this->view['arGeoMode'], $this->get_option('wpsg_geo_determination'), array('help' => 'wpsg_geo_determination')); ?>
 								
-				<?php echo wpsg_drawForm_Checkbox('wpsg_referer_requesturi', __('RequestURI als ProduktURL verwenden', 'wpsg'), $this->get_option('wpsg_referer_requesturi'), array('help' => 'wpsg_referer_requesturi')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_ignoreuserview', __('User Views ignorieren', 'wpsg'), $this->get_option('wpsg_ignoreuserview'), array('help' => 'wpsg_ignoreuserview')); ?>		
-				<?php echo wpsg_drawForm_Checkbox('wpsg_classicupload', __('Klassisches Upload Formular', 'wpsg'), $this->get_option('wpsg_classicupload'), array('help' => 'wpsg_classicupload')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_content_filter_direct', __('Ausgaben im Warenkorb direkt ausgeben', 'wpsg'), $this->get_option('wpsg_content_filter_direct'), array('help' => 'wpsg_content_filter_direct')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_options_no_rte_apply_filter', __('ApplyFilter Funktion nicht anwenden', 'wpsg'), $this->get_option('wpsg_options_no_rte_apply_filter'), array('help' => 'wpsg_options_no_rte_apply_filter')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_options_nl2br_out', __('RTE Felder mit nl2br ausgeben', 'wpsg'), $this->get_option('wpsg_options_nl2br_out'), array('help' => 'wpsg_options_n12br_out')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_impexp_clearlinebreak', __('ZeilenumbrÃŒche im Export entfernen', 'wpsg'), $this->get_option('wpsg_impexp_clearlinebreak'), array('help' => 'wpsg_impexp_clearlinebreak')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_removeWpAutoOp', __('wpautop deaktivieren', 'wpsg'), $this->get_option('wpsg_removeWpAutoOp'), array('help' => 'wpsg_removeWpAutoOp')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_removeWpTrimExcerpt', __('wp_trim_excerpt nicht verwenden', 'wpsg'), $this->get_option('wpsg_removeWpTrimExcerpt'), array('help' => 'wpsg_removeWpTrimExcerpt')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_lockOrderTables', __('Bestellungen nicht mit LOCK TABLES verarbeiten', 'wpsg'), $this->get_option('wpsg_lockOrderTables'), array('help' => 'wpsg_lockOrderTables')); ?>		
-				<?php echo wpsg_drawForm_Checkbox('wpsg_autoraw', __('[raw] und [/raw] um Templates ausgeben (Frontend)', 'wpsg'), $this->get_option('wpsg_autoraw'), array('help' => 'wpsg_autoraw')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_nocache', __('Cachen von dynamischen Shopseiten verhindern', 'wpsg'), $this->get_option('wpsg_nocache'), array('help' => 'wpsg_nocache')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_autolineending', __('MAC KompatibilitÃ€t bei Dateiimporten', 'wpsg'), $this->get_option('wpsg_autolineending'), array('help' => 'wpsg_autolineending')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_dontcopymedia', __('Produktbilder nicht kopieren', 'wpsg'), $this->get_option('wpsg_dontcopymedia'), ['help' => 'wpsg_dontcopymedia']); ?>	  			
-				<?php echo wpsg_drawForm_Checkbox('wpsg_switchtolowestshippingafterproductremove', __('Nach dem entfernen eines Produktes auf die gÃŒnstigste Zahlungsart wechseln', 'wpsg'), $this->get_option('wpsg_switchtolowestshippingafterproductremove'), array('help' => 'wpsg_switchtolowestshippingafterproductremove')); ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_save_order_after_mail', __('Erinnerung an Kunden bei unvollstÃ€ndiger Bestellung', 'wpsg'), $this->get_option('wpsg_save_order_after_mail'), array('help' => 'wpsg_save_order_after_mail')); ?>
-				<?php echo wpsg_drawForm_Select('wpsg_geo_determination', __('Abfrage des Kundenstandortes (EU-Leistungsortregel)', 'wpsg'), $this->view['arGeoMode'], $this->get_option('wpsg_geo_determination'), array('help' => 'wpsg_geo_determination')); ?>
-							
-			</div>
-		</div>
+		<script type="text/javascript">
+
+			jQuery(document).ready(function() {
+ 
+				jQuery('.wpsg_form_help').tipTip();
+				
+			} );
+		
+		</script>
 		
 		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
@@ -62,2 +60,3 @@
 	</form>
 </div>
+  
Index: /views/admin/hilfe.phtml
===================================================================
--- /views/admin/hilfe.phtml	(revision 8528)
+++ /views/admin/hilfe.phtml	(revision 5261)
@@ -9,23 +9,78 @@
 <div class="wpsg_hilfe" style="padding:5px; width:790px;">
 
-	<?php echo wpsg_drawForm_AdminboxStart(__('Hilfe', 'wpsg')); ?>
+	<h1><?php echo __("Hilfe", "wpsg"); ?></h1>
+		
 	<p><?php echo __("Hier ein kleiner Ãberblick, wo welche Information zu finden ist:", "wpsg"); ?></p>
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-	<?php echo wpsg_drawForm_AdminboxStart(__('Tutorials', 'wpsg')); ?>
+		
+	<h2><?php echo __("Tutorials", "wpsg"); ?></h2>		
 	<p><?php echo __("In den Tutorial haben wir praxisnahe Beispiele verwendet, um die einzelnen Funktionen nÃ€her zu erklÃ€ren. Rechts im MenÃŒ kÃ¶nnen die Kategorien nÃ€her ausgewÃ€hlt werden, ganz oben gibt es ein Suchfenster, was ganz sehr gut funktioniert ;)", "wpsg"); ?></p>
 	<a href="http://wpshopgermany.maennchen1.de/category/tutorials/">http://wpshopgermany.maennchen1.de/category/tutorials/</a>
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
 
-	<?php echo wpsg_drawForm_AdminboxStart(__('Forum', 'wpsg')); ?>
+	<h2><?php echo __("Forum", "wpsg"); ?></h2>
 	<p><?php echo __("Alle Anfragen hinsichtlich Fehler, Inbetriebnahme und Administration beantworten wir zeitnah (wÃ€hrend unserer GeschÃ€ftszeiten). Vielleicht ist deine Frage bereits im Forum gestellt und beantwortet worden? Das Suchformular dort ist auch sehr mÃ€chtig, probiere es doch mal aus!", "wpsg"); ?></p>
 	<p><?php echo __("Bitte nutze generell das Forum fÃŒr eine Support-Anfrage, <u>nicht</u> unser Kontaktformular oder Telefon.", "wpsg"); ?></p>
 	<a href="http://forum.maennchen1.de/">http://forum.maennchen1.de/</a>
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
 
-	<?php echo wpsg_drawForm_AdminboxStart(__('Feature Wunschliste', 'wpsg')); ?>
+	<h2><?php echo __("Feature Wunschliste", "wpsg"); ?></h2>
 	<p><?php echo __("Wir orientieren uns direkt am Markt. Insofern geben wir dir als User die MÃ¶glichkeit mitzuentscheiden, welches Feature wpShopGermany zukÃŒnftig haben wird. Du kannst selber einen Feature-Wunsch anlegen, oder fÃŒr einen bestehenden Wunsch deine Stimme abgeben.", "wpsg"); ?></p>
 	<a href="https://wpshopgermany.uservoice.com/">https://wpshopgermany.uservoice.com/</a>
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
 
+	<h2><?php echo __('Import aus wpShopGermany 2.5.8', 'wpsg'); ?></h2>
+	<p><?php echo __('Mit dieser Funktion kÃ¶nnen sie den Export aus einem wpShopGermany 2.5.8 in diese Version importieren', 'wpsg'); ?></p>
+	<strong class="wpsg_error"><?php echo __('Sichern Sie in jedem Fall vorher ihre Daten!', 'wpsg'); ?></strong>
+		
+	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=importV2&amp;noheader=1" enctype="multipart/form-data">
+	
+		<p><?php echo wpsg_translate(__('FÃŒr den Import der Daten aus der Version 2 gibt es 3 Wege, beachten Sie dazu unsere <a href="#1#">Upgrade Anleitung</a>.', 'wpsg'), 'http://wpshopgermany.de/?p=2508'); ?>:</p>
+		
+		<ol>
+			<li>
+				<strong><?php echo __('Update innerhalb der Datenbank', 'wpsg'); ?>:</strong><br />
+				<?php if ($this->get_option('wpshopgermany_version_installed') == '2.5.8') { ?>
+												
+					<?php echo __('WÃ€hlen Sie diese Option wenn sie das Plugin direkt in diesem Wordpress mit der Version2 ausgetauscht haben.', 'wpsg'); ?><br />				
+					<?php echo __('Sie kÃ¶nnen diesen Import mehrfach durchfÃŒhren. Starten Sie einen Testlauf und prÃŒfen Sie anschlieÃend die Daten. Sollte alles OK sein, so kÃ¶nnen Sie den Durchlauf ein zweites mal durchfÃŒhren und die Tabellen und Daten lÃ¶schen.', 'wpsg'); ?><br /><br />
+				
+					<label>
+						<input type="checkbox" name="tabledel" value="1" />&nbsp;<?php echo __('Alte Tabellen und Daten nach Import lÃ¶schen.', 'wpsg'); ?>
+					</label>
+					<input name="submit_import_db" type="submit" onclick="return confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>');" value="<?php echo __('Import durchfÃŒhren', 'wpsg'); ?>" /><br />
+				
+				<?php } else if ($this->get_option('wpshopgermany_version_installed') !== false) { ?>
+
+					<p><?php echo __('Die vorher installierte wpShopGermany Version ist nicht kompatibel', 'wpsg'); ?></p>
+
+				<?php } else { ?>
+					
+					<p><?php echo __('Diese Option steht ihnen nur zur VerfÃŒgung wenn sie vorher eine Version 2.5.8 des wpShopGermany installiert hatten.', 'wpsg'); ?></p>
+						
+				<?php } ?>
+			</li>
+			<li>
+				<strong><?php echo __('Import aus der exportierten Datendatei ÃŒber Datei Upload (Aus Version 2.5.8)', 'wpsg'); ?></strong><br />
+				<input type="file" name="datei" /><br />
+				<input type="submit" onclick="return confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>');" value="<?php echo __('Hochladen', 'wpsg'); ?>" />
+			</li>
+			<li>
+				<strong><?php echo __('Import einer per FTP hochgeladenen Datendatei (Aus Version 2.5.8)', 'wpsg'); ?>:</strong><br />
+				<?php echo __('Dazu muss die Datei unter folgendem Pfad abgelegt werden:', 'wpsg'); ?><br />
+				<pre><?php echo WPSG_PATH_CONTENT; ?>uploads/wpsg_upgrade.zip</pre>
+				<?php if (file_exists(WPSG_PATH_CONTENT.'uploads/wpsg_upgrade.zip')) { ?>
+				<strong class="wpsg_erfolg"><?php echo __('Datei erkannt, klicken Sie auf "Importieren" um den Import zu starten.', 'wpsg'); ?></strong><br /><br />
+				<input name="submit_import" type="submit" onclick="return confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>');" value="<?php echo __('Importieren', 'wpsg'); ?>" />
+				<?php } else { ?>
+				<strong class=wpsg_error><?php echo __('Keine Datei an dieser Stelle gefunden.', 'wpsg'); ?></strong>
+				<?php } ?>
+			</li>			
+		</ol> 
+	
+	</form>
+	
+	<h2><?php echo __('Migration der alten MehrwertsteuersÃ€tze', 'wpsg'); ?></h2>
+	<p><?php echo wpsg_translate(
+		__('Ab Version 3.5 wurden die MehrwertsteuersÃ€tze den LÃ€ndern zugeordnet. Die alten MehrwertsteuersÃ€tze kÃ¶nnen <a href="#1#">hier</a> umgewandelt werden.', 'wpsg'),
+		WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=migratemwst'
+	); ?>
+			
 </div>
+	
Index: /views/admin/includes.phtml
===================================================================
--- /views/admin/includes.phtml	(revision 8528)
+++ /views/admin/includes.phtml	(revision 5261)
@@ -7,49 +7,44 @@
 ?>
 <div class="wpsg_admin_submenu">
-
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>
-		<?php } ?>
+	
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
 	</div>
 
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
+		<?php } ?>
+	</ul>
+			
 </div>
 
-<div class="wpsg_admin_content form-horizontal">
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=includes&noheader=1'; ?>">
-
-		<?php echo wp_nonce_field('wpsg-admin-includes'); ?>
+<div style="padding:0px; margin:0px; float:left;">		
+	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>&amp;noheader=1">
 		
-		<?php echo wpsg_drawForm_AdminboxStart(__('Bibliotheken/Includes', 'wpsg')); ?>
-
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_css', __('Shop CSS styles nicht einbinden', 'wpsg'), $this->get_option('wpsg_load_css'), array('help' => 'wpsg_load_css')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_load_css', __('Shop CSS styles nicht einbinden', 'wpsg'), $this->get_option('wpsg_load_css')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_load_jquery', __('JQuery einbinden', 'wpsg'), $this->get_option('wpsg_load_jquery'), array('help' => 'wpsg_load_jquery')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_load_thickbox_js', __('Thickbox einbinden (JavaScript)', 'wpsg'), $this->get_option('wpsg_load_thickbox_js'), array('help' => 'wpsg_load_thickbox')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_load_thickbox_css', __('Thickbox einbinden (Styles)', 'wpsg'), $this->get_option('wpsg_load_thickbox_css'), array('help' => 'wpsg_load_thickbox')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_load_validierung_js', __('Javascript Validierung laden', 'wpsg'), $this->get_option('wpsg_load_validierung_js')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_load_validierung_css', __('CSS der Javascript Validierung laden', 'wpsg'), $this->get_option('wpsg_load_validierung_css')); ?>
+		
+		<?php $this->callMods('admin_includes'); ?>
+		
+		<input type="hidden" name="subaction" value="includes" />
 			
-			<br />
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_jquery', __('JQuery einbinden', 'wpsg'), $this->get_option('wpsg_load_jquery'), array('help' => 'wpsg_load_jquery')); ?>
-			
-			<br />
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_fslightbox_js', __('fsLightbox (Fullscreen Lightbox) einbinden (JavaScript)', 'wpsg'), $this->get_option('wpsg_load_fslightbox_js'), array('help' => 'wpsg_load_fslightbox_js')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_thickbox', __('Thickbox einbinden (JavaScript + CSS)', 'wpsg'), $this->get_option('wpsg_load_thickbox'), array('help' => 'wpsg_load_thickbox')); ?>
+		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 		
-			<br />
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_validierung_js', __('Javascript Validierung laden', 'wpsg'), $this->get_option('wpsg_load_validierung_js'), array('help' => 'wpsg_load_validierung')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_validierung_css', __('CSS der Javascript Validierung laden', 'wpsg'), $this->get_option('wpsg_load_validierung_css'), array('help' => 'wpsg_load_validierung')); ?>
-						
-			<br />
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_load_bootstrap_glyphfont_css', __('Bootstrap Glyphfont CSS im Frontend laden', 'wpsg'), $this->get_option('wpsg_load_bootstrap_glyphfont_css'), array('help' => 'wpsg_load_bootstrap_glyphfont_css')); ?>
-			
-			<br />
-			
-			<?php $this->callMods('admin_includes'); ?>
-
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-
 	</form>
 </div>
+
+<script type="text/javascript">
+
+	jQuery(document).ready(function() {
+		
+		jQuery('.wpsg_form_help').tipTip();
+		
+	} );
+
+</script>
Index: /views/admin/index.phtml
===================================================================
--- /views/admin/index.phtml	(revision 8528)
+++ /views/admin/index.phtml	(revision 5261)
@@ -6,47 +6,37 @@
 	 */
 
-	$wpsg_update_data = wpsg_get_update_data();
- 
 ?>
 
-<div class="wpsg_admin" id="wpsg-bs">
+<div class="wpsg_admin">
 
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse">
-				<ul class="nav navbar-nav">
-			 		<li role="presentation" class="<?php echo (($this->view['actionName'] == "index")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin"><?php echo __("Einstellungen", "wpsg"); ?></a></li>
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "module")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module"><?php echo __("Module", "wpsg"); ?></a></li>
-					
-					<?php if (current_user_can('wpsg_lizence') && wpsg_isSizedInt($wpsg_update_data['returnCode'])) { ?>			
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "registrierung")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=registrierung"><?php echo __("Lizenzverwaltung", "wpsg"); ?></a></li>
-					<?php } ?>
-					
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == 'news')?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=news">
-						<?php echo __('Aktuelles', 'wpsg'); ?>
-						<?php $wpsg_news_unread = wpsg_news::countUnreadNews(); if (wpsg_isSizedInt($wpsg_news_unread)) { ?>
-						<span class="badge" style="background-color:#D9534F;"><?php echo $wpsg_news_unread; ?></span>
-						<?php } ?>			
-					</a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">				
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "hilfe")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=hilfe"><?php echo __("Hilfe", "wpsg"); ?></a></li>
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "ueber")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=ueber"><?php echo __("Ãber", "wpsg"); ?></a></li>
-			 	</ul>
-			</div>
-		</div>		
-	</nav>
-				  	
+	<div class="wrap">
+		<h2><?php echo __('wpShopGermany', 'wpsg'); ?></h2>
+ 	</div>
+	
+	<?php echo $this->writeBackendMessage(); ?>
+			
+	<div class="wpsg_admin_topmenu">
+		<ul>
+			<li class="<?php echo (($this->view['actionName'] == "index")?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin"><?php echo __("Einstellungen", "wpsg"); ?></a></li>
+			<li class="<?php echo (($this->view['actionName'] == "module")?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module"><?php echo __("Module", "wpsg"); ?></a></li>
+			<?php if (current_user_can('wpsg_lizence') && $this->hasMod('wpsg_mod_core')) { ?>			
+			<li class="<?php echo (($this->view['actionName'] == "registrierung")?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=registrierung"><?php echo __("Lizenzverwaltung", "wpsg"); ?></a></li>
+			<?php } ?>
+			<li class="<?php echo (($this->view['actionName'] == 'news')?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=news">
+				<?php echo __('Aktuelles', 'wpsg'); ?>
+				<?php if (wpsg_isSizedInt($wpsg_news_unread = wpsg_news::countUnreadNews())) { ?>
+				<span class="wpsg_news_unreadhint"><?php echo $wpsg_news_unread; ?></span>
+				<?php } ?>			
+			</a></li>
+			<li class="<?php echo (($this->view['actionName'] == "hilfe")?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=hilfe"><?php echo __("Hilfe", "wpsg"); ?></a></li>
+			<li class="<?php echo (($this->view['actionName'] == "ueber")?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=ueber"><?php echo __("Ãber", "wpsg"); ?></a></li>
+		</ul>
+	</div>
+	<div style="clear:both;"></div>
+	
 	<div class="wpsg_admin_wrap">
-		
-		<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-			
 		<?php if (wpsg_isSizedString($this->view['subTemplate'])) { ?>
 		<?php $this->render($this->view['subTemplate']); ?>
 		<?php } ?>
-		
 	</div>
 	
Index: /views/admin/kalkulation.phtml
===================================================================
--- /views/admin/kalkulation.phtml	(revision 8528)
+++ /views/admin/kalkulation.phtml	(revision 5261)
@@ -8,66 +8,83 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
+	</ul>
 			
 </div>
 
-<div class="wpsg_admin_content form-horizontal">
+<div style="padding:0px; margin:0px; float:left;">		
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>&amp;noheader=1">
+		<?php echo wpsg_drawForm_Checkbox('wpsg_kleinunternehmer', __('Kleinunternehmerregelung', 'wpsg'), $this->get_option('wpsg_kleinunternehmer'), array('help' => 'Preiskalkulation_wpsg_kleinunternehmer')); ?>
+		<?php echo wpsg_drawForm_Textarea('wpsg_kleinunternehmer_text', __('Kleinunternehmerregelung Text', 'wpsg'), $this->get_option('wpsg_kleinunternehmer_text'), array()) ?>
+		<div class="wpsg_preisangaben_layer">
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<?php echo __("Preisangaben im Shop (Backend)", "wpsg"); ?>:
+				</div>
+				<div class="wpsg_form_right">
+					<select name="wpsg_preisangaben">
+						<option value="<?php echo WPSG_BRUTTO; ?>" <?php echo (($this->get_option('wpsg_preisangaben') == WPSG_BRUTTO)?'selected="selected"':''); ?>><?php echo __('Brutto (inkl. Steuer)', 'wpsg'); ?></option>
+						<option value="<?php echo WPSG_NETTO; ?>" <?php echo (($this->get_option('wpsg_preisangaben') == WPSG_NETTO)?'selected="selected"':''); ?>><?php echo __('Netto (zzgl. Steuer)', 'wpsg'); ?></option>
+					</select>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php echo wpsg_drawForm_Select('wpsg_preisangaben_frontend', __('Preisangaben im Shop (Frontend)', 'wpsg'), array(WPSG_BRUTTO => __('Brutto (inkl. Steuer)', 'wpsg'), WPSG_NETTO => __('Netto (zzgl. Steuer)', 'wpsg')), $this->get_option('wpsg_preisangaben_frontend')); ?>
+		</div>			
+			
+		<?php echo wpsg_drawForm_Checkbox('wpsg_hideemptyshipping', __('Versandkosten bei 0 ausblenden', 'wpsg'), $this->get_option('wpsg_hideemptyshipping'), array('help' => 'Preiskalkulation_wpsg_hideemptyshipping')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_hideemptypayment', __('Zahlungskosten bei 0 ausblenden', 'wpsg'), $this->get_option('wpsg_hideemptypayment'), array('help' => 'Preiskalkulation_wpsg_hideemptypayment')); ?>
 		
-		<?php echo wp_nonce_field('wpsg-admin-kalkulation'); ?>
-		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Preiskalkulation', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-						
-				<div class="wpsg_kleinunternehmer_layer wpsg_kleinunternehmer_layer_1">
-					<?php echo wpsg_drawForm_Textarea('wpsg_kleinunternehmer_text', __('Kleinunternehmerregelung Text', 'wpsg'), $this->get_option('wpsg_kleinunternehmer_text'), array()) ?>
-				</div>
-				
-				<div class="wpsg_kleinunternehmer_layer wpsg_kleinunternehmer_layer_0">
-					<?php echo wpsg_drawForm_Select('wpsg_preisangaben', __('Preisangaben im Shop (Backend)', 'wpsg'), array(
-						WPSG_NETTO => __('Netto (zzgl. Steuer)', 'wpsg'),
-						WPSG_BRUTTO => __('Brutto (inkl. Steuer)', 'wpsg')
-					), $this->get_option('wpsg_preisangaben')); ?>				
-					<?php echo wpsg_drawForm_Select('wpsg_preisangaben_frontend', __('Preisangaben im Shop (Frontend)', 'wpsg'), array(WPSG_BRUTTO => __('Brutto (inkl. Steuer)', 'wpsg'), WPSG_NETTO => __('Netto (zzgl. Steuer)', 'wpsg')), $this->get_option('wpsg_preisangaben_frontend')); ?>					
-				</div>
-				
-				<?php echo wpsg_drawForm_Checkbox('wpsg_kleinunternehmer', __('Kleinunternehmerregelung', 'wpsg'), $this->get_option('wpsg_kleinunternehmer'), array('help' => 'Preiskalkulation_wpsg_kleinunternehmer')); ?>			
-								
-				<?php echo wpsg_drawForm_Checkbox('wpsg_hideemptyshipping', __('Versandkosten bei 0 ausblenden', 'wpsg'), $this->get_option('wpsg_hideemptyshipping'), array('help' => 'Preiskalkulation_wpsg_hideemptyshipping')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_hideemptypayment', __('Zahlungskosten bei 0 ausblenden', 'wpsg'), $this->get_option('wpsg_hideemptypayment'), array('help' => 'Preiskalkulation_wpsg_hideemptypayment')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_noroundamount', __('Vor Multiplikation mit Menge nicht runden', 'wpsg'), $this->get_option('wpsg_noroundamount'), ['help' => 'Preiskalkulation_wpsg_noroundamount']); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_deliverycountrytax', __('Mwst. gemÃ€Ã Lieferland berechnen', 'wpsg'), $this->get_option('wpsg_deliverycountrytax'), ['help' => 'Preiskalkulation_wpsg_deliverycountrytax']); ?>								
-                
-			</div>
-		</div>
-				
 		<input type="hidden" name="subaction" value="kalkulation" />
 			
 		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 		
-		<script type="text/javascript">/* <![CDATA[ */
- 
+		<script type="text/javascript">
+
+			/**
+			 * Wird beim Ã€ndern der Kleinunternehmerregelung aufgerufen
+			 */
+			function wpsg_setKleinunternehmer()
+			{
+
+				return;
+				
+				if (jQuery('#wpsg_kleinunternehmer').attr('checked'))
+				{
+
+					jQuery('.wpsg_preisangaben_layer').hide();
+					
+				}
+				else
+				{
+
+					jQuery('.wpsg_preisangaben_layer').show();
+					
+				}
+				
+			} // function wpsg_setKleinunternehmer()
+		
 			jQuery(document).ready(function() {
 
 				jQuery('#wpsg_kleinunternehmer').bind('change', function() {
 
-					jQuery('.wpsg_kleinunternehmer_layer').hide();
-					 
-					if (jQuery(this).prop('checked')) jQuery('.wpsg_kleinunternehmer_layer_1').show();
-					else jQuery('.wpsg_kleinunternehmer_layer_0').show();
+					wpsg_setKleinunternehmer();
 					
-				} ).change();
+				} );
+				
+				jQuery('.wpsg_form_help').tipTip();
+				wpsg_setKleinunternehmer();
 				
 			} );
 		
-		/* ]]> */</script>
+		</script>
 			
 	</form>
Index: /views/admin/konfiguration.phtml
===================================================================
--- /views/admin/konfiguration.phtml	(revision 8528)
+++ /views/admin/konfiguration.phtml	(revision 5261)
@@ -7,82 +7,156 @@
 ?>
 <div class="wpsg_admin_submenu">
-	 
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div>
+	</ul>
 			
 </div>
 		
-<div class="wpsg_admin_content form-horizontal">
+<div style="padding:0px; margin:0px; float:left;">
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=konfiguration&noheader=1'); ?>">
+  
+  		<?php if ($this->hasMod('wpsg_mod_core')) { ?>
+			<?php if ($this->arLizenz['l'] == 0) { ?>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<?php echo __("Lizenzende", "wpsg"); ?>:
+				</div>
+				<div class="wpsg_form_right">
+					<?php if ($this->getDemoDays() < 0) { ?>
+					<p><?php echo wpsg_translate(__('Vor #1# Tage(n) abgelaufen.', 'wpsg'), abs($this->getDemoDays())); ?></p>
+					<?php } else { ?>
+					<p><?php echo wpsg_translate(__('#1# Tage verbleibend.', 'wpsg'), $this->getDemoDays()); ?></p>
+					<?php } ?>
+					<a rel="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DemoMode" title="DemoMode" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DemoMode" class="wpsg_form_help"></a>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>		
+			<?php } else { ?>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<?php echo __('Lizenzstatus', 'wpsg'); ?>:
+				</div>
+				<div class="wpsg_form_right">
+					<p>
+					<?php 
+					
+						switch ($this->arLizenz['l']) 
+						{ 
+					
+							case '1': echo __('Light Version', 'wpsg'); break;
+							case '2': echo __('Pro Version', 'wpsg'); break;
+							case '3': echo __('Enterprise Version', 'wpsg'); break;
+							default: die();
+							
+						}					
+	 
+					?>				
+					</p>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php } ?>
+		<?php } else { ?> 
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">&nbsp;</div>
+			<div class="wpsg_form_right">
+				<?php echo wpsg_translate(
+					__('<span style="color:red; font-weight:bold;">Weitere Funktionen in der Vollversion.</span><br />[ <a target="_blank" href="#1#">Vollversion kaufen</a> ] [ <a target="_blank" href="#2#">Weitere Infos</a> ]', 'wpsg'),
+					'http://shop.maennchen1.de/produkte/wpshopgermany-lizenzkey/',
+					'http://wpshopgermany.de/'
+				); ?>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>		
+		<?php } ?>
+		
+		<?php if ($this->get_option("wpsg_version_installed", true) != WPSG_VERSION) { ?>
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<span style="color:red;"><?php echo __("Update", "wpsg"); ?>:</span>
+			</div>
+			<div class="wpsg_form_right">
+				<p><?php echo __("Die Version der Datenbank stimmt nicht mit der installierten Version ÃŒberein!<br />Bitte klicken Sie auf ", "wpsg").'<a href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&amp;subaction=allgemein&amp;do=update&amp;submit=1&amp;noheader=1">'.__("Aktualisieren", "wpsg").'</a>&nbsp;('.__("Produkte etc. werden dabei nicht gelÃ¶scht.", "wpsg"); ?>)</p>				
+				<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DBUpdate" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DBUpdate" class="wpsg_form_help"></a>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+		<?php } else { ?>
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<?php echo __("Installierte DB Version", "wpsg"); ?>:
+			</div>
+			<div class="wpsg_form_right">
+				<p><?php echo WPSG_VERSION; ?>&nbsp;<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=allgemein&amp;do=update&amp;submit=1&amp;noheader=1"><?php echo __("Aktualisieren", "wpsg"); ?></a></p>
+				<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DBUpdate" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DBUpdate" class="wpsg_form_help"></a>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>	
+		<?php } ?>
+		<br />
+		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<?php echo __("WÃ€hrung", "wpsg"); ?>:
+			</div>
+			<div class="wpsg_form_right">
+				<input type="text" value="<?php echo wpsg_hspc($this->get_option('wpsg_currency')); ?>" name="wpsg_currency" />
+				<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=Einstellungen_Allgemein_Waehrung" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=Einstellungen_Allgemein_Waehrung" class="wpsg_form_help"></a>				
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>	
 
-        <?php wp_nonce_field('wpsg-save-config'); ?>
-        
-    	<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Allgemeine Einstellungen', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">		  						
-				<?php if ($this->get_option("wpsg_version_installed", true) != WPSG_VERSION) { ?>
-				<div class="wpsg_form_field">
-					<div class="wpsg_form_left">
-						<span style="color:red;"><?php echo __("Update", "wpsg"); ?>:</span>
-					</div>
-					<div class="wpsg_form_right">
-						
-						<p>
-							<?php echo wpsg_translate(
-								__('Die Version der Datenbank stimmt nicht mit der installierten Version ÃŒberein!<br />Bitte klicken Sie auf <a href="#1#">Aktualisieren</a> Produkte etc. werden dabei nicht gelÃ¶scht.', 'wpsg'),
-								wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein&do=update&submit=1&noheader=1', 'wpsg-admin-db-update')							
-							); ?>
-						</p>
-						
-						<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DBUpdate" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=DBUpdate" class="wpsg_glyphicon_right glyphicon glyphicon-question-sign"></a>
-						
-					</div>
-					<div class="wpsg_clear"></div>
-				</div>
-				<?php } else { ?>
-				<?php wpsg_drawForm_TextStart(); ?>		
-				<?php echo WPSG_VERSION; ?>&nbsp;<a href="<?php 
+		<?php if (wpsg_isSizedArray($this->view['arLanguages'])) { ?>
+		<?php echo wpsg_drawForm_Select('wpsg_backend_language', __('Standardsprache (Backend)', 'wpsg'), $this->view['arLanguages'], $this->get_option('wpsg_backend_language'), array('help' => 'Einstellungen_Allgemein_Standardsprachebackend')); ?>
+		<?php } ?>
+					
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<?php echo __('Produkte pro Seite', 'wpsg'); ?>:				
+			</div>
+			<div class="wpsg_form_right">
+				<input type="text" value="<?php echo wpsg_hspc($this->get_option('wpsg_produkte_perpage')); ?>" name="wpsg_produkte_perpage" />
+				<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=ProduktePerPage" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=ProduktePerPage" class="wpsg_form_help"></a>				
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+		
+		<?php echo wpsg_drawForm_Input('wpsg_order_perpage', __('Bestellungen pro Seite', 'wpsg'), $this->get_option('wpsg_order_perpage')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_showincompleteorder', __('UnvollstÃ€ndige Best. in Bestellverwaltung anzeigen', 'wpsg'), $this->get_option('wpsg_showincompleteorder')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_emptyorder_clear', wpsg_translate(__('Bestellungen fÃŒr 0 #1# direkt abschlieÃen', 'wpsg'), $this->get_option('wpsg_currency')), $this->get_option('wpsg_emptyorder_clear')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_afterinsert', __('Nach neuem Produkt im Warenkorb', 'wpsg'), array(
+			'0' => __('Auf Seite bleiben', 'wpsg'),
+			'1' => __('Zum Warenkorb leiten', 'wpsg'),
+			'2' => __('Warenkorb im Fenster anzeigen', 'wpsg'),
+			'3' => __('Lightbox Meldung', 'wpsg')
+		), $this->get_option('wpsg_afterinsert')); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_skip_checkout2', __('Auswahl der Zahlung/Versandart ÃŒberspringen wenn mÃ¶glich', 'wpsg'), $this->get_option('wpsg_skip_checkout2')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_afterorder', __('Kundendaten nach Bestellung', 'wpsg'), array(
+			'0' => __('In Session belassen', 'wpsg'),
+			'1' => __('LÃ¶schen', 'wpsg')
+		), $this->get_option('wpsg_afterorder')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_format_knr', __('Formatierung Kundennummer', 'wpsg'), $this->get_option('wpsg_format_knr'), array('help' => 'Formatierung_Kundennummer')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_order_knr', __('Sortierung Kundennummer (Backend)', 'wpsg'), array('0' => __('Numerisch', 'wpsg'), '1' => __('Alphabetisch', 'wpsg')), $this->get_option('wpsg_order_knr')); ?>		
+		<?php echo wpsg_drawForm_Input('wpsg_customer_start', __('Start fÃŒr Kundennummer', 'wpsg'), $this->get_option('wpsg_customer_start')); ?>		
+		<?php echo wpsg_drawForm_Input('wpsg_format_onr', __('Formatierung Bestellnummer', 'wpsg'), $this->get_option('wpsg_format_onr'), array('help' => 'Formatierung_Bestellnummer')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_order_start', __('Start fÃŒr Bestellnummer', 'wpsg'), $this->get_option('wpsg_order_start')); ?>
+			
+		<script type="text/javascript">
+
+			jQuery(document).ready(function() {
+ 
+				jQuery('.wpsg_form_help').tipTip();
 				
-					echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein&do=update&submit=1&noheader=1', 'wpsg-admin-db-update');
-					
-				?>"><?php echo __("Aktualisieren", "wpsg"); ?></a>
-				<?php echo wpsg_drawForm_TextEnd(__('Installierte DB Version', 'wpsg'), array('help' => 'DBUpdate')); ?>	
-				<?php } ?>
-				
-				<?php echo wpsg_drawForm_Input('wpsg_currency', __('WÃ€hrung', 'wpsg'), $this->get_option('wpsg_currency'), array('help' => 'Einstellungen_Allgemein_Waehrung')); ?>
-				
-				<?php if (wpsg_isSizedArray($this->view['arLanguages'])) { ?>
-				<?php echo wpsg_drawForm_Select('wpsg_backend_language', __('Standardsprache (Backend)', 'wpsg'), $this->view['arLanguages'], $this->get_option('wpsg_backend_language'), array('help' => 'Einstellungen_Allgemein_Standardsprachebackend')); ?>
-				<?php } ?>
-							
-				<?php echo wpsg_drawForm_Input('wpsg_produkte_perpage', __('Produkte pro Seite', 'wpsg'), $this->get_option('wpsg_produkte_perpage'), array('help' => 'ProduktePerPage')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_order_perpage', __('Bestellungen pro Seite', 'wpsg'), $this->get_option('wpsg_order_perpage'), array('help' => 'Bestellung_pro_Seite')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_showincompleteorder', __('UnvollstÃ€ndige Best. in Bestellverwaltung anzeigen', 'wpsg'), $this->get_option('wpsg_showincompleteorder'), array('help' => 'unvollstaendige_Bestellung')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_showvalueofgoods', __('Warenwert in Bestellverwaltung anzeigen', 'wpsg'), $this->get_option('wpsg_showvalueofgoods'), array('help' => 'Warenwert_Bestellung')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_emptyorder_clear', wpsg_translate(__('Bestellungen fÃŒr 0 #1# direkt abschlieÃen', 'wpsg'), $this->get_option('wpsg_currency')), $this->get_option('wpsg_emptyorder_clear'), array('help' => 'Bestellung_0')); ?>
-				<?php echo wpsg_drawForm_Select('wpsg_afterinsert', __('Nach neuem Produkt im Warenkorb', 'wpsg'), array(
-					'0' => __('Auf Seite bleiben', 'wpsg'),
-					'1' => __('Zum Warenkorb leiten', 'wpsg'),
-					'2' => __('Warenkorb im Fenster anzeigen', 'wpsg'),
-					'3' => __('Lightbox Meldung', 'wpsg')
-				), $this->get_option('wpsg_afterinsert'), array('help' => 'nach_Produkt_in_Warenkorb')); ?>		
-				<?php echo wpsg_drawForm_Select('wpsg_afterorder', __('Kundendaten nach Bestellung', 'wpsg'), array(
-					'0' => __('In Session belassen', 'wpsg'),
-					'1' => __('LÃ¶schen', 'wpsg')
-				), $this->get_option('wpsg_afterorder'), array('help' => 'Kundendaten_nach_Bestellung')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_format_knr', __('Formatierung Kundennummer', 'wpsg'), $this->get_option('wpsg_format_knr'), array('help' => 'Formatierung_Kundennummer')); ?>
-				<?php echo wpsg_drawForm_Select('wpsg_order_knr', __('Sortierung Kundennummer (Backend)', 'wpsg'), array('0' => __('Numerisch', 'wpsg'), '1' => __('Alphabetisch', 'wpsg')), $this->get_option('wpsg_order_knr'), array('help' => 'Kundennummersortierung')); ?>		
-				<?php echo wpsg_drawForm_Input('wpsg_customer_start', __('Start fÃŒr Kundennummer', 'wpsg'), $this->get_option('wpsg_customer_start'), array('help' => 'Kundennummerstart')); ?>		
-				<?php echo wpsg_drawForm_Input('wpsg_format_onr', __('Formatierung Bestellnummer', 'wpsg'), $this->get_option('wpsg_format_onr'), array('help' => 'Formatierung_Bestellnummer')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_order_start', __('Start fÃŒr Bestellnummer', 'wpsg'), $this->get_option('wpsg_order_start'), array('help' => 'Bestellnummerstart')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_skip_checkout2', __('Auswahl der Zahlung/Versandart ÃŒberspringen wenn mÃ¶glich', 'wpsg'), $this->get_option('wpsg_skip_checkout2')); ?>
-			</div>
-		</div>	 
+			} );
+		
+		</script>
 		
 		<input type="hidden" name="subaction" value="konfiguration" />
Index: /views/admin/kundendaten.phtml
===================================================================
--- /views/admin/kundendaten.phtml	(revision 8528)
+++ /views/admin/kundendaten.phtml	(revision 5261)
@@ -6,155 +6,83 @@
 
 ?>
-
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
-	
+	</ul>
+			
 </div>
 
-<!-- Modal fÃŒr Codeanzeige -->
-<div class="modal fade" id="wpsg_code_dialog" tabindex="-1" role="dialog">
-  <div class="modal-dialog" role="document">
-    <div class="modal-content">
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-        <h4 class="modal-title" id="myModalLabel"><?php echo __('HTML Code Block', 'wpsg'); ?></h4>
-      </div>
-      <div class="modal-body">
-        
-      </div>
-      <div class="modal-footer">
-        <button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('SchlieÃen', 'wpsg'); ?></button> 
-      </div>
-    </div>
-  </div>
+<div class="wpsg_admin_content">
+	<div class="wpsg_admin_box" id="wpsg_tab">		
+			
+		<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>">
+		  		
+			<div class="head">
+				<div class="title">
+					<div class="tab" id="tab1"><?php echo __('Pfllichtfelder', 'wpsg'); ?></div>
+					<div class="tab" id="tab2"><?php echo __('Weitere Kundendaten', 'wpsg'); ?></div>
+					<div class="tabcontent tablink">
+						<a href="" title="<?php echo __('Neues Kundenfeld hinzufÃŒgen', 'wpsg'); ?>" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addCustomField();"></a>
+					</div>
+					<div class="wpsg_clear"></div>
+				</div>
+			</div>
+			<div class="content" id="wpsg_mwst_list">
+				
+				<div id="tabcontent1" class="tabcontent">
+					<?php echo $this->render(WPSG_PATH_VIEW.'/admin/kundendaten_tab1.phtml'); ?>
+				</div>
+				<div id="tabcontent2" class="tabcontent">
+					
+					<?php echo $this->render(WPSG_PATH_VIEW.'/admin/kundendaten_tab2.phtml'); ?>
+					
+				</div>
+				
+			</div>
+			
+			<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
+			
+		</form>
+				
+		<script type="text/javascript">
+
+			/**
+			 * Wird beim hinzufÃŒgen eines benutzerdefinierten Kundenfeldes aufgerufen
+			 */
+			function wpsg_addCustomField()
+			{
+
+				jQuery('#tabcontent2').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+				
+				jQuery.ajax( {
+					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=add&noheader=1',
+					success: function(data) {
+						jQuery('#tabcontent2').html(data);
+					}
+				} );
+
+				return false;
+				
+			} // function wpsg_addCustomField()
+		
+			jQuery(document).ready(function() {
+				jQuery('#wpsg_tab').wpsg_tab( { 
+					'cookiename': 'wpsg_kundendaten_tab',
+					'tab2': function() {
+						jQuery('.tablink').show();
+					}
+				} );
+			} );
+		
+		</script>
+				
+	</div>
 </div>
-
-<div class="wpsg_admin_content form-horizontal wpsg_customerfield">
-
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=<?php echo $_REQUEST['subaction']; ?>&noheader=1">
-	
-		<?php echo wp_nonce_field('wpsg-admin-kundendaten'); ?>
-		
-		<div class="panel panel-default">
-			<div class="panel-heading clearfix">
-	       		<h3 class="panel-title"><?php echo __('Kundendaten', 'wpsg'); ?></h3>
-	       	</div>
-			<div class="panel-body">
-	
-				<ul class="nav nav-tabs" role="tablist">
-					<li role="presentation" class="active"><a href="#tabcontent1" role="tab" aria-controls="tabcontent1" data-toggle="tab"><?php echo __('Pflichtfelder', 'wpsg'); ?></a></li>
-					<li role="presentation" class=""><a href="#tabcontent2" role="tab" aria-controls="tabcontent2" data-toggle="tab"><?php echo __('Weitere Kundendaten', 'wpsg'); ?></a></li>
-					<li role="presentation" class=""><a href="#tabcontent3" role="tab" aria-controls="tabcontent3" data-toggle="tab"><?php echo __('Kundenvoreinstellungen', 'wpsg'); ?></a></li>
-				</ul>
-						 
-				<div class="tab-content">
-					<div role="tabpanel" id="tabcontent1" class="tab-pane active">
-						<?php echo $this->render(WPSG_PATH_VIEW.'/admin/kundendaten_tab1.phtml'); ?>
-					</div>
-					<div role="tabpanel" id="tabcontent2" class="tab-pane">
-						
-						<div id="wpsg_kv_list">
-							<?php echo $this->render(WPSG_PATH_VIEW.'/admin/kundendaten_tab2.phtml'); ?>
-						</div>
-						
-						<div class="wpsg_clear"></div><br />
-						<a href="" onclick="return wpsg_addCustomField();"><span class="glyphicon glyphicon-plus"></span>&nbsp;<?php echo __('Neue Kundenvariable anlegen.', 'wpsg'); ?></a>
-						
-					</div>
-					<div role="tabpanel" id="tabcontent3" class="tab-pane">						
-						<?php echo $this->render(WPSG_PATH_VIEW.'/admin/kundendaten_tab3.phtml'); ?>
-					</div>
-				</div>
-	
-			</div>
-		</div>
-		
-		<p class="submit"><input name="submit" type="submit" value="<?php echo __('Einstellungen Speichern', 'wpsg'); ?>" class="button-primary" /></p>
-		
-	</form>
-	
-	<script>
-
-		/**
-		 * FÃŒgt ein neues Feld in die Liste der Kundenvariablen ein und lÃ€dt die Liste neu
-		 */	                                            	
-		function wpsg_addCustomField()
-		{
-	
-			jQuery('#wpsg_kv_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-			
-			jQuery.ajax( {
-				url: '<?php echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=add&noheader=1', 'wpsg-admin-kundendaten-add')); ?>',
-				success: function(data) {
-					jQuery('#wpsg_kv_list').html(data);
-				}
-			} );
-	
-			return false;
-			
-		} // function wpsg_addCustomField()
-
-		/**
-		 * LÃ¶scht eine Kundenvariable und entfernt die Zeile aus der Liste
-		 */
-		function wpsg_removeCustomField(kv_index)
-		{
-
-			if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
-			
-			jQuery('.wpsg_customervar_row_' + kv_index).hide(250, function() { jQuery(this).remove(); } );
-
-			jQuery.ajax( {
-				url: '<?php echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=remove&noheader=1', 'wpsg-admin-kundendaten-delete')); ?>',
-				data: {
-					'kv_index': kv_index
-				},
-				success: function(data) { 
-
-					if (data != "1") alert(data); 
-
-				}
-			} );
-
-			return false;
-			
-		} // function wpsg_removeCustomField(kv_index)
-		
-		/**
-		 * Zeigt den HTML Code, der die gewÃ€hlte Kundenvariablen in die Templates einbaut
-		 */
-		function wpsg_genKVCode(kv_index)
-		{
-
-			jQuery('#wpsg_code_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-			
-			jQuery('#wpsg_code_dialog').modal( { } );
-			
-			jQuery.ajax( {
-    			url: '<?php echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&noheader=1&show=code', 'wpsg-admin-kundendaten-code')); ?>',
-    			data: { 'kv_id': kv_index },
-    			success: function(data) { jQuery('#wpsg_code_dialog .modal-body').html(data); }
-        	} );
-			 
-			return false;
-			
-		} // function wpsg_genPACode(pa_id)
-
-		jQuery(document).ready(function() {
-
-			jQuery('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { localStorage.setItem('wpsg_admin_customer_lastTab', jQuery(this).attr('href')); } );
-
-			var lastTab = localStorage.getItem('wpsg_admin_customer_lastTab');
-			if (lastTab) jQuery('[href="' + lastTab + '"]').tab('show');
-			
-		} );
-	    
-	</script>
-
-</div>
Index: /views/admin/kundendaten_renderfield.phtml
===================================================================
--- /views/admin/kundendaten_renderfield.phtml	(revision 5261)
+++ /views/admin/kundendaten_renderfield.phtml	(revision 5261)
@@ -0,0 +1,25 @@
+<?php
+
+	/**
+	 * Zeichnet eine einzelne Kundenvariable innerhalb des checkout.phtml	  
+	 */
+
+?>
+<div class="wpsg_checkoutblock">
+	<label class="wpsg_cv" for="wpsg_cv_<?php echo $this->view['field']['id']; ?>">
+		<?php echo wpsg_hspc(__($this->view['field']['name'], 'wpsg')); ?><?php if ($this->view['field']['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
+		<?php if ($this->view['field']['typ'] == '0') { // Textfeld ?>
+		<input class="<?php echo (($this->view['field']['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$this->view['field']['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]" type="text" value="<?php echo $this->view['basket']['checkout']['custom'][$this->view['field']['id']]; ?>" />
+		<?php } else if ($this->view['field']['typ'] == '1') { $arAuswahl = explode("|", $this->view['field']['auswahl']); // Auswahlfeld ?>
+		<select class="<?php echo (($this->view['field']['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$this->view['field']['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]">
+			<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
+			<?php foreach ((array)$arAuswahl as $a) { ?>
+			<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['basket']['checkout']['custom'][$this->view['field']['id']])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
+			<?php } ?>
+		</select>
+		<?php } else if ($this->view['field']['typ'] == '2') { // Checkbox ?>
+		<input type="hidden" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]" value="0" />
+		<input class="<?php echo (($this->view['field']['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]" value="1" <?php echo (($this->view['basket']['checkout']['custom'][$this->view['field']['id']] == '1')?'checked="checked"':''); ?> />
+		<?php } ?>
+	</label>
+</div>
Index: /views/admin/kundendaten_tab1.phtml
===================================================================
--- /views/admin/kundendaten_tab1.phtml	(revision 8528)
+++ /views/admin/kundendaten_tab1.phtml	(revision 5261)
@@ -5,28 +5,142 @@
 	 */
 
-	$arSelect = array(
-		'0' => __('Ja', 'wpsg'),
-		'1' => __('Nein', 'wpsg'),
-		'2' => __('Nicht anzeigen', 'wpsg')
-	);
-
 ?>
-
-<?php echo wpsg_drawForm_Select('pflicht[anrede]', __('Anrede', 'wpsg'), $arSelect, $this->view['pflicht']['anrede']); ?>
-<?php echo wpsg_drawForm_Input('pflicht[anrede_auswahl]', __('MÃ¶gliche Werte fÃŒr Auswahl getrennt mit |', 'wpsg'), $this->view['pflicht']['anrede_auswahl']); ?>
-<?php echo wpsg_drawForm_Select('pflicht[firma]', __('Firma', 'wpsg'), $arSelect, $this->view['pflicht']['firma'])?>
-<?php echo wpsg_drawForm_Select('pflicht[vname]', __('Vorname', 'wpsg'), $arSelect, $this->view['pflicht']['vname'])?>
-<?php echo wpsg_drawForm_Select('pflicht[name]', __('Name', 'wpsg'), $arSelect, $this->view['pflicht']['name'])?>
-<?php echo wpsg_drawForm_Select('pflicht[geb]', __('Geburtsdatum', 'wpsg'), $arSelect, $this->view['pflicht']['geb'])?>
-<?php echo wpsg_drawForm_Select('pflicht[email]', __('E-Mail Adresse', 'wpsg'), $arSelect, $this->view['pflicht']['email'])?>
-<?php echo wpsg_drawForm_Checkbox('pflicht[emailconfirm]', __('E-Mail Adresse (Wiederholung)', 'wpsg'), $this->view['pflicht']['emailconfirm']); ?>
-<?php echo wpsg_drawForm_Checkbox('pflicht[eInvoice]', __('E-Mail Adresse fÃŒr eRechnung abfragen (optional)', 'wpsg'), $this->view['pflicht']['eInvoice']??0); ?>
-<?php echo wpsg_drawForm_Checkbox('pflicht[leitweg]', __('Leitweg-ID fÃŒr eRechnung abfragen (optional)', 'wpsg'), $this->view['pflicht']['leitweg']??0); ?>
-<?php echo wpsg_drawForm_Select('pflicht[tel]', __('Telefon', 'wpsg'), $arSelect, $this->view['pflicht']['tel'])?>
-<?php echo wpsg_drawForm_Select('pflicht[fax]', __('Fax', 'wpsg'), $arSelect, $this->view['pflicht']['fax'])?>
-<?php echo wpsg_drawForm_Select('pflicht[strasse]', __('StraÃe', 'wpsg'), $arSelect, $this->view['pflicht']['strasse'])?>
-<?php echo wpsg_drawForm_Checkbox('pflicht[wpsg_showNr]', __('Hausnummer separat erfassen', 'wpsg'), @$this->view['pflicht']['wpsg_showNr']); ?>
-<?php echo wpsg_drawForm_Select('pflicht[plz]', __('Postleitzahl', 'wpsg'), $arSelect, $this->view['pflicht']['plz'])?>
-<?php echo wpsg_drawForm_Select('pflicht[ort]', __('Ort', 'wpsg'), $arSelect, $this->view['pflicht']['ort'])?>
-<?php echo wpsg_drawForm_Select('pflicht[land]', __('Land', 'wpsg'), $arSelect, $this->view['pflicht']['land'])?>
-<?php echo wpsg_drawForm_Select('pflicht[ustidnr]', __('UStIdNr.', 'wpsg'), $arSelect, $this->view['pflicht']['ustidnr'])?>
+<table class="wpsg_pflichtfelder">
+	<tr>
+		<th class="col0"><?php echo __("Feldbezeichnung", "wpsg"); ?></th>
+		<th class="col1"><?php echo __("Pflichtfeld", "wpsg"); ?></th>	 
+	</tr>
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('Anrede', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[anrede]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['anrede'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>
+			</select>
+		</td>
+	</tr>
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('MÃ¶gliche Werte fÃŒr Auswahl getrennt mit |', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<input type="text" style="width:100%;" name="pflicht[anrede_auswahl]" value="<?php echo $this->view['pflicht']['anrede_auswahl']; ?>" />
+		</td>
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"><?php echo __('Firma', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[firma]">
+				<option value="0"><?php echo __("Ja", "wpsg"); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['firma'] == '1')?'selected="selected"':''); ?>><?php echo __("Nein", "wpsg"); ?></option>														
+			</select>
+		</td> 
+	</tr>
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('Vorname', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[vname]">
+				<option value="0"><?php echo __("Ja", "wpsg"); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['vname'] == '1')?'selected="selected"':''); ?>><?php echo __("Nein", "wpsg"); ?></option>							
+			</select>
+		</td> 
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"><?php echo __('Name', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[name]">
+				<option value="0"><?php echo __("Ja", "wpsg"); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['name'] == '1')?'selected="selected"':''); ?>><?php echo __("Nein", "wpsg"); ?></option>							
+			</select>
+		</td>
+	</tr>	
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('Geburtsdatum', 'wpsg'); ?></td>
+		<td class="col1">
+			<select name="pflicht[geb]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['geb'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td> 
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"><?php echo __('E-Mail Adresse', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[email]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['email'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td>
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"></td>
+		<td class="col1">
+			<label style="line-height:24px;">
+				<input type="hidden" name="pflicht[emailconfirm]" value="0" />
+				<input type="checkbox" value="1" <?php echo (($this->view['pflicht']['emailconfirm'] == '1')?'checked="checked"':''); ?> name="pflicht[emailconfirm]" style="width:auto; margin-left:5px;" />&nbsp;
+				<?php echo __('E-Mail Adresse (Wiederholung)', 'wpsg'); ?>
+			</label>
+		</td>
+	</tr>
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('Telefon', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[tel]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['tel'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td> 
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"><?php echo __('Fax', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[fax]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['fax'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td> 
+	</tr>
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[strasse]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['strasse'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td> 
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"><?php echo __('Postleitzahl', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[plz]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['plz'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td> 
+	</tr>			 	
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('Ort', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[ort]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['ort'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td>
+	</tr>
+	<tr class="wpsg_even">
+		<td class="col0"><?php echo __('Land', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[land]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['land'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td> 
+	</tr>			 	
+	<tr class="wpsg_odd">
+		<td class="col0"><?php echo __('UStIdNr.', 'wpsg'); ?>:</td>
+		<td class="col1">
+			<select name="pflicht[ustidnr]">
+				<option value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option value="1" <?php echo (($this->view['pflicht']['ustidnr'] == '1')?'selected="selected"':''); ?>><?php echo __('Nein', 'wpsg'); ?></option>							
+			</select>
+		</td>
+	</tr>
+</table>
Index: /views/admin/kundendaten_tab2.phtml
===================================================================
--- /views/admin/kundendaten_tab2.phtml	(revision 8528)
+++ /views/admin/kundendaten_tab2.phtml	(revision 5261)
@@ -6,133 +6,111 @@
 
 ?>
+<?php if (wpsg_isSizedArray($this->view['pflicht']['custom'])) { ?>
 
-<?php if (wpsg_isSizedArray($this->view['pflicht']['custom'])) { ?>
+<script type="text/javascript">
+
+	/**
+	 * Zeigt den HTML Code, der die gewÃ€hlte Kundenvariablen in die Templates einbaut
+	 */
+	function wpsg_genKVCode(kv_id)
+	{
+ 
+		jQuery("#wpsg_kv_code_dialog").dialog( {
+			'dialogClass': 'wp-dialog',           
+	        'modal': true,
+	        'width': 700,
+	        'height': 300,	       
+	        'title': '<?php echo __('HTML Code Block', 'wpsg'); ?>',
+	        open: function(event, ui) {
+	        	
+	        	jQuery('#wpsg_kv_code_dialog .wpsg_dialog').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+	        	
+	        	jQuery.ajax( {
+	    			url: 'admin.php?page=wpsg-Admin&subaction=kundendaten&noheader=1&show=code',
+	    			data: {
+	    				'kv_id': kv_id
+	    			},
+	    			success: function(data)
+	    			{
+		    					    			
+		    			jQuery('#wpsg_kv_code_dialog .wpsg_dialog').html(data);
+		    			
+	    			}
+	        	} );
+		        
+	        }
+		} );
+		
+		return false;
+		
+	} // function wpsg_genPACode(pa_id)
+
+</script>
+
 <div id="wpsg_kv_code_dialog" style="display:none;"><div class="wpsg_dialog"></div></div>
 
-<table class="wpsg_customfields table">
-	<thead>			
-		<tr>
-			<th class="col0"><?php echo __('Index', 'wpsg'); ?></th>		
-			<th class="col1"><?php echo __('Kundenvariablen', 'wpsg'); ?></th>
-			<th class="col2"><?php echo __('Pflichtfeld', 'wpsg'); ?></th>
-			<th class="col3"><?php echo __('Typ', 'wpsg'); ?></th>
-			<th class="col4"></th>
-			<th class="col5"></th>
-		</tr>
-	</thead>
-	<tbody>
-		<?php
-		$arShow = array('0' => __('Ja', 'wpsg'), '1' => __('Nein', 'wpsg'), '2' => __('Nicht zeigen', 'wpsg'));
-		$arTyp = array('0' => __('Textfeld', 'wpsg'), '1' => __('Auswahlfeld', 'wpsg'), '2' => __('Checkbox', 'wpsg'));
-		foreach ($this->view['pflicht']['custom'] as $c_id => $c) { ?>	
-		<tr class="wpsg_customervar_row_<?php echo $c_id; ?>">
-			<td class="col0"><?php echo $c_id; ?></td>
-			<td class="col1"><span class="wpsg_editable" id="kundenvariable_name_<?php echo $c_id; ?>"><?php echo wpsg_hspc($c['name']); ?></span></td>
-			<td class="col2">
-				<span id="kundenvariable_show_<?php echo $c_id; ?>"><?php echo $arShow[$c['show']]; ?></span>
+<table class="wpsg_customfields">			
+	<tr>
+		<th class="col0"><?php echo __('Index', 'wpsg'); ?></th>		
+		<th class="col1"><?php echo __('Kundenvariablen', 'wpsg'); ?></th>
+		<th class="col2"><?php echo __('Pflichtfeld', 'wpsg'); ?></th>
+		<th class="col3"><?php echo __('Typ', 'wpsg'); ?></th>
+		<th class="col4"></th>
+		<th class="col5">
+			<a class="wpsg_icon wpsg_icon_center wpsg_icon_remove" href="#" title="<?php echo __('Kundenvariable lÃ¶schen', 'wpsg'); ?>" onclick="return false;"></a>
+		</th>
+	</tr>
+	<?php foreach ($this->view['pflicht']['custom'] as $c_id => $c) { ?>
+	<tr>
+		<td class="col0"><?php echo $c_id; ?></td>
+		<td class="col2 wpsg_editable" id="kundenvariable_name_<?php echo $c_id; ?>"><?php echo wpsg_hspc($c['name']); ?></td>
+		<td class="col3">
+			<select name="pflicht[custom][<?php echo $c_id; ?>][show]">
+				<option <?php echo (($c['show'] == '0')?'selected="selected"':''); ?> value="0"><?php echo __('Ja', 'wpsg'); ?></option>
+				<option <?php echo (($c['show'] == '1')?'selected="selected"':''); ?> value="1"><?php echo __('Nein', 'wpsg'); ?></option>
+				<option <?php echo (($c['show'] == '2')?'selected="selected"':''); ?> value="2"><?php echo __('Nicht zeigen', 'wpsg'); ?></option>
+			</select>
+		</td>
+		<td class="col3">
+			<select onchange="if (jQuery(this).val() == '1') jQuery('#row_auswahl_<?php echo $c_id; ?>').show(); else jQuery('#row_auswahl_<?php echo $c_id; ?>').hide();" name="pflicht[custom][<?php echo $c_id; ?>][typ]">
+				<option <?php echo (($c['typ'] == '0')?'selected="selected"':''); ?> value="0"><?php echo __('Textfeld', 'wpsg'); ?></option>
+				<option <?php echo (($c['typ'] == '1')?'selected="selected"':''); ?> value="1"><?php echo __('Auswahlfeld', 'wpsg'); ?></option>
+				<option <?php echo (($c['typ'] == '2')?'selected="selected"':''); ?> value="2"><?php echo __('Checkbox', 'wpsg'); ?></option>
+			</select>
+		</td>
+		<td class="col4">
+			<a class="wpsg_icon wpsg_icon_html wpsg_icon_center" href="#" title="<?php echo __('HTML Code generieren', 'wpsg'); ?>" onclick="return wpsg_genKVCode(<?php echo $c_id; ?>);"></a>
+		</td>
+		<td class="col5">
+			<input type="checkbox" value="1" name="pflicht[custom][<?php echo $c_id; ?>][del]" />
 			
-			</td>
-			<td class="col3">
-				<span id="kundenvariable_typ_<?php echo $c_id; ?>"><?php echo $arTyp[$c['typ']]; ?></span>
-			</td>
-			<td class="col4">
+			<script type="text/javascript">
 			
-				<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('HTML Code generieren', 'wpsg'); ?>" onclick="return wpsg_genKVCode(<?php echo $c_id; ?>);"><span class="glyphicon glyphicon-modal-window"></span></a>
-			
-				<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Kundenvariable lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeCustomField(<?php echo $c_id; ?>);"><span class="glyphicon glyphicon-trash"></span></a>
+				jQuery('#kundenvariable_name_<?php echo $c_id; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=inlinedit&noheader=1', {
+					submitdata: { 
+			    		field: 'name',
+			    		field_id: '<?php echo $c_id; ?>'
+					}, 					
+					submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});	
+
+			</script>
 				
-				<script type="text/javascript">/* <![CDATA[ */
-
-					jQuery(document).ready(function() {
-						jQuery('#kundenvariable_name_<?php echo $c_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=inlinedit&noheader=1', {
-							submitdata: { 
-					    		field: 'name',
-					    		field_id: '<?php echo $c_id; ?>'
-							}, 					
-							submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
-							placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-							indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-					    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-						});
-	
-	                    jQuery('#kundenvariable_show_<?php echo $c_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=inlinedit&noheader=1', {
-	                        submitdata: {
-	                            field: 'show',
-	                            field_id: '<?php echo $c_id; ?>'
-	                        },
-	                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-	                        data: <?php echo wpsg_prepare_for_inlineEdit(array('0' => __('Ja', 'wpsg'), '1' => __('Nein', 'wpsg'), '2' => __('Nicht zeigen', 'wpsg'))); ?>,
-	                        type: 'select',
-	                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-	                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-	                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-	                        callback: function(el) {
-	                            if (el == '<?php echo __('Auswahl', 'wpsg'); ?>')
-	                            {
-	                                jQuery('#row_auswahl_<?php echo $c_id; ?>').show();
-	                            }
-	                            else
-	                            {
-	                                jQuery('#row_auswahl_<?php echo $c_id; ?>').hide();
-	                            }
-	                        }
-	                    });
-					
-	                    jQuery('#kundenvariable_typ_<?php echo $c_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=inlinedit&noheader=1', {
-	                        submitdata: {
-	                            field: 'typ',
-	                            field_id: '<?php echo $c_id; ?>'
-	                        },
-	                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-	                        data: <?php echo wpsg_prepare_for_inlineEdit(array('0' => __('Textfeld', 'wpsg'), '1' => __('Auswahlfeld', 'wpsg'), '2' => __('Checkbox', 'wpsg'))); ?>,
-	                        type: 'select',
-	                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-	                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-	                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-	                        callback: function(el) {
-
-	                            if (el == '1') {
-
-	                                jQuery('#row_auswahl_<?php echo $c_id; ?>').show();
-
-	                            } else {
-
-	                                jQuery('#row_auswahl_<?php echo $c_id; ?>').hide();
-
-	                            }
-
-	                        }
-	                    });
-	
-						jQuery('#kundenvariable_auswahl_<?php echo $c_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten&do=inlinedit&noheader=1', {
-							submitdata: { 
-					    		field: 'auswahl',
-					    		field_id: '<?php echo $c_id; ?>'
-							}, 					
-							submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
-							placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-							indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-					    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-						});
-				
-					} );
-        
-				/* ]]> */</script>
-					
-			</td>
-		</tr>
-		<tr class="wpsg_customervar_row2 wpsg_customervar_row_<?php echo $c_id; ?>" id="row_auswahl_<?php echo $c_id; ?>" style="<?php echo (($c['typ'] == '1')?'':'display:none;'); ?>">
-			<td class="col0"></td>
-			<td class="col1"><?php echo __('AuswahlmÃ¶glichkeiten ("|" als Trenner)', 'wpsg'); ?></td>
-			<td class="col234" colspan="3">
-				<span class="wpsg_editable editable editable-click" id="kundenvariable_auswahl_<?php echo $c_id; ?>"><?php echo wpsg_hspc($c['auswahl']); ?></span>
-			</td>
-		</tr>
-		<?php } ?>
-	</tbody>
+		</td>
+	</tr>
+	<tr id="row_auswahl_<?php echo $c_id; ?>" style="<?php echo (($c['typ'] == '1')?'':'display:none;'); ?>">
+		<td class="col0"></td>
+		<td class="col1"><?php echo __('AuswahlmÃ¶glichkeiten ("|" als Trenner)', 'wpsg'); ?></td>
+		<td class="col2345" colspan="4">
+			<input type="text" name="pflicht[custom][<?php echo $c_id; ?>][auswahl]" value="<?php echo wpsg_hspc($c['auswahl']); ?>" />
+		</td>
+	</tr>
+	<?php } ?>
 </table>
-
 <br />
-<?php echo wpsg_drawForm_Checkbox('wpsg_kundenvariablen_show', __('Kundenvariablen direkt abfragen', 'wpsg'), $this->get_option('wpsg_kundenvariablen_show'), array('fullWidth' => true)); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_kundenvariablen_show', __('Kundenvariablen direkt abfragen', 'wpsg'), $this->get_option('wpsg_kundenvariablen_show')); ?>
 <?php } else { ?>
 <p><?php echo __('Keine benutzerdefinierten Kundenfelder angelegt.', 'wpsg'); ?>
Index: ews/admin/kundendaten_tab3.phtml
===================================================================
--- /views/admin/kundendaten_tab3.phtml	(revision 8528)
+++ 	(revision )
@@ -1,32 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Kundenvoreinstellungen im Backend
-	 */
-
-?>
-
-<?php
-	
-	echo wpsg_drawForm_Select('wpsg_customerpreset_shipping', __('Standard Versandart', 'wpsg'), [
-		'-1' => __('gÃŒnstigste Versandart', 'wpsg')
-	] + $this->view['arShipping'], $this->get_option('wpsg_customerpreset_shipping'), array('help' => 'wpsg_customerpreset_shipping'));
-	
-?>
-	
-<?php 
-	
-	echo wpsg_drawForm_Select('wpsg_customerpreset_payment', __('Standard Zahlungsart', 'wpsg'), [
-		'0' => __('Bitte wÃ€hlen', 'wpsg'),
-		'-1' => __('gÃŒnstigste Zahlungsart', 'wpsg')
-	] + $this->view['arPayment'], $this->get_option('wpsg_customerpreset_payment'), array('help' => 'wpsg_customerpreset_payment')); 
-
-?>
-	
-<?php echo wpsg_drawForm_Select('wpsg_defaultland', __('Standardland', 'wpsg'), $this->view['arLander'], $this->get_option('wpsg_defaultland'), array('help' => 'wpsg_defaultland', 'hint' => 
-	'nohspc_'.wpsg_translate(__('Die LÃ€nder kÃ¶nnen in der <a href="#1#">LÃ€nderverwaltung</a> definiert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender')		
-)); ?>
-<?php echo wpsg_drawForm_Select('wpsg_customerpreset_title', __('Standardanrede', 'wpsg'), $this->view['arTitle'], $this->get_option('wpsg_customerpreset_title'), array( 'help' => 'wpsg_customerpreset_title',
-	'hint' => 'nohspc_'.wpsg_translate(__('Die Auswahl kann in den <a href="#1#">Kundendaten</a> definiert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=kundendaten'),
-	'noIndex' => true 
-)); ?>
Index: /views/admin/laender.phtml
===================================================================
--- /views/admin/laender.phtml	(revision 8528)
+++ /views/admin/laender.phtml	(revision 5261)
@@ -8,199 +8,237 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
+	</ul>
 			
 </div>
 
-<div class="modal fade" id="Modal_wpsg_country_edit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-				<h4 class="modal-title" id="myModalLabel"><?php echo __('Land anlegen/bearbeiten', 'wpsg'); ?></h4>
-			</div>
-			<div class="modal-body">
-
-			</div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-default" onclick="return wpsg_country_save();" data-dismiss="modal"><?php echo __('Speichern und schlieÃen', 'wpsg'); ?></button>
-			</div>
-		</div>
-	</div>
-</div>
-
 <div class="wpsg_admin_content">
 
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&noheader=1'); ?>">
-
-		<?php echo wp_nonce_field('wpsg-admin-laender'); ?>
-		
-		<?php echo wpsg_drawForm_AdminboxStart(__('LÃ€nderverwaltung', 'wpsg')); ?>
-
-		<div id="wpsg_country_list">
-
-            <?php echo $this->render(WPSG_PATH_VIEW.'/admin/laender_list.phtml'); ?>
-
-		</div>
-
-		<br />
-
-	</form>
-
-	<a href="#" onclick="return wpsg_country_add();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neues Land anlegen.', 'wpsg'); ?></a><br />
-    <a href="#" onclick="return wpsg_country_import();"><span class="wpsg-glyphicon glyphicon glyphicon-import"></span><?php echo __('StandardlÃ€nder importieren.', 'wpsg'); ?></a><br />
-     <a href="#" onclick="return wpsg_country_importEU();"><span class="wpsg-glyphicon glyphicon glyphicon-import"></span><?php echo __('EU-LÃ€nder importieren.', 'wpsg'); ?></a><br />
-
-    <br />
-
-    <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Versandzonenverwaltung', 'wpsg'); ?></a>
-	
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-	<script type="text/javascript">/* <![CDATA[ */
-
-	    function wpsg_country_check_all() { jQuery('td.col_check input').each(function() { jQuery(this).prop('checked', !jQuery(this).prop('checked')); } ); }
-
-		function wpsg_country_remove(land_id) {
-
-			if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
-
-			jQuery.ajax( {
-				url: '<?php 
+	<div class="wpsg_admin_box">	
+		
+		<h3>
+			<?php echo __('Neues Land hinzufÃŒgen', 'wpsg'); ?>
+			<a target="_blank" href="http://wpshopgermany.maennchen1.de/?p=839037" class="wpsg_form_help_notip"></a>	
+		</h3>
+		
+		<?php echo $this->render(WPSG_PATH_VIEW.'/admin/laender_edit.phtml'); ?>
+		
+		<h3><?php echo __('Bestehende LÃ€nder', 'wpsg'); ?></h3>
+	
+		<?php if (wpsg_isSizedArray($this->view['data'])) { ?>
+		<table class="wpsg_admin_laender_list wpsg_admin_table" cellpadding="0" cellspacing="0">
+			<tr>
+				<th class="col_name"><?php echo __('LÃ€ndername', 'wpsg'); ?></th>
+				<th class="col_vz"><?php echo __('Versandzone', 'wpsg'); ?></th>
+				<th class="col_mwstsetting"><?php echo __('MwSt.', 'wpsg'); ?></th>
+				<th class="col_mwst"><?php echo __('MwSt. A', 'wpsg'); ?></th>
+				<th class="col_mwst"><?php echo __('MwSt. B', 'wpsg'); ?></th>
+				<th class="col_mwst"><?php echo __('MwSt. C', 'wpsg'); ?></th>
+				<th class="col_mwst"><?php echo __('MwSt. D', 'wpsg'); ?></th>				
+				<th class="col_action"></th>
+			</tr>
+			<?php $i = 0; foreach ($this->view['data'] as $l) { $i ++; ?>
+			<tr id="wpsg_laenderrow_<?php echo $l['id']; ?>" class="<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+				<td class="col_name data_name"><?php echo wpsg_hspc($l['name'].((wpsg_isSizedString($l['kuerzel']))?' ('.$l['kuerzel'].')':'')); ?></td>
+				<td class="col_vz data_vz">
+					<?php if (wpsg_isSizedInt($l['vz']) && wpsg_isSizedString($this->view['vz'][$l['vz']])) { ?>
+					<?php echo wpsg_hspc($this->view['vz'][$l['vz']]); ?>
+					<?php } ?>
+				</td>
+				<td class="col_mwstsetting data_mwst">
+					<?php if ($l['mwst'] == '2') { ?>
+					<?php echo __('keine MwSt. bei USt.IdNr.', 'wpsg'); ?>
+					<?php } else if ($l['mwst'] == '1') { ?>
+					<?php echo __('keine MwSt.', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php echo __('mit MwSt.', 'wpsg'); ?>
+					<?php } ?>
+				</td>
+				<td class="col_mwst data_mwst_a">
+					<?php if (wpsg_tf($l['mwst_a']) != NULL) { ?>
+						<?php echo wpsg_ff(wpsg_tf($l['mwst_a']), '%'); ?>
+					<?php } ?>					
+				</td>
+				<td class="col_mwst data_mwst_b">
+					<?php if (wpsg_tf($l['mwst_b']) != NULL) { ?>
+						<?php echo wpsg_ff(wpsg_tf($l['mwst_b']), '%'); ?>
+					<?php } ?>					
+				</td>
+				<td class="col_mwst data_mwst_c">
+					<?php if (wpsg_tf($l['mwst_c']) != NULL) { ?>
+						<?php echo wpsg_ff(wpsg_tf($l['mwst_c']), '%'); ?>
+					<?php } ?>					
+				</td>
+				<td class="col_mwst data_mwst_d">
+					<?php if (wpsg_tf($l['mwst_d']) != NULL) { ?>
+						<?php echo wpsg_ff(wpsg_tf($l['mwst_d']), '%'); ?>
+					<?php } ?>					
+				</td>
+				<td class="col_action">
 					
-					echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=remove&noheader=1', 'wpsg-laender-delete'));
+					<a class="wpsg_icon wpsg_icon_edit" href="#" onclick="return wpsg_laender_edit(<?php echo $l['id']; ?>);"></a> 
+					<a class="wpsg_icon wpsg_icon_remove" href="#" onclick="return wpsg_laender_remove(<?php echo $l['id']; ?>);"></a>
 					
-				?>',
-				data: {
-					land_id: land_id
-				},
-				success: function(data) {
-											 
-					if (data === "1") jQuery('#wpsg_laenderrow_' + land_id).remove();
-					else alert(data);
+				</td>
+			</tr>
+			<?php } ?>
+		</table>
+		<?php } else { ?>
+		<p><?php echo __('Noch keine LÃ€nder angelegt.', 'wpsg'); ?>
+		<?php } ?>
+		
+		<br /><br />
+		
+		<input type="button" onclick="return wpsg_laender_import();" value="<?php echo __('StandardlÃ€nder importieren', 'wpsg'); ?>" class="button" />
+		<input type="button" onclick="return wpsg_eu_laender_import();" value="<?php echo __('Standard EU-LÃ€nder importieren', 'wpsg'); ?>" class="button" />
+	
+		<script type="text/javascript">/* <![CDATA[ */
+
+			var land_load = false;
+
+			function wpsg_laender_import()
+			{
+
+				if (!confirm('<?php echo __('Sind sie sich sicher ?', 'wpsg'); ?>')) return false;
+
+				location.href = "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=import&noheader=1";
+				
+				return false;
+				
+			}
+
+			function wpsg_eu_laender_import()
+			{
+
+				if (!confirm('<?php echo __('Sind sie sich sicher ?', 'wpsg'); ?>')) return false;
+
+				location.href = "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=eu_import&noheader=1";
+				
+				return false;
+				
+			}
+
+			function wpsg_laender_save()
+			{
+
+				jQuery.ajax( {
+					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=saveEdit&noheader=1',
+					data: {
+						form_data: jQuery('#wpsg_land_edit_form_edit').serialize()
+					},
+					success: function(data) {
+ 
+						if (typeof data === 'object')
+						{
+
+							land_load = true;
+ 
+							for (var i in data)
+							{
+ 
+								jQuery('#wpsg_laenderrow_' + data['id']).find('.data_' + i).html(data[i]);
+								
+							}
+							
+							jQuery('#wpsg_laenderrow_edit > td > div').slideUp(100, function() {
+
+								jQuery('#wpsg_laenderrow_edit').remove();
+								land_load = false;
+								
+							} );
+							 
+						}
+						else alert(data);
+						
+					}
+				} );
+
+				return false;
+				
+			}
+	        
+			function wpsg_laender_edit(land_id)
+			{
+
+				if (land_load == true) return; land_load = true;
+
+				var edit_timeout = 0;
+ 				
+				if (jQuery('#wpsg_laenderrow_edit > td > div').is(':visible'))
+				{
+
+					edit_timeout = 150;
+ 					
+					jQuery('#wpsg_laenderrow_edit > td > div').slideUp(100, function() {
+
+						jQuery('#wpsg_laenderrow_edit').remove();
+						
+					} );
 					
 				}
-			} );
-			
-			return false;
-
-		}
-
-		function wpsg_country_add()
-		{
-
-			jQuery('#Modal_wpsg_country_edit .modal-body').html('<img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" />');
-			jQuery('#Modal_wpsg_country_edit').modal('show');
-
-			jQuery.ajax( {
-				url: '<?php 
-					
-					echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=add&noheader=1', 'wpsg-laender-add'));
-					
-				?>',				
-				success: function(data) { jQuery('#Modal_wpsg_country_edit .modal-body').html(data); }
-			} );
-			
-			return false;
-
-		} // function wpsg_country_add()
-
-        function wpsg_country_import() {
-
-            if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
-
-            jQuery('#wpsg_country_list').html('<img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" />');
-
-            jQuery.ajax( {
-                url: '<?php 
-					
-					echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=import&noheader=1', 'wpsg-laender-import'));
-					
-				?>',
-                success: function(data) {
-
-                    jQuery('#wpsg_country_list').html(data);
-
-                }
-            } );
-
-            return false;
-
-        } // function wpsg_country_import()
-
-        function wpsg_country_importEU()
-        {
-
-            if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
-
-            jQuery('#wpsg_country_list').html('<img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" />');
-
-            jQuery.ajax( {
-                url: '<?php 
-					
-					echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=eu_import&noheader=1', 'wpsg-laender-eu_import'));
-					
-				?>',
-                success: function(data) {
-
-                    jQuery('#wpsg_country_list').html(data);
-
-                }
-            } );
-
-            return false;
-
-        } // function wpsg_country_importEU()
-
-		function wpsg_country_save()
-		{
-
-			jQuery('#wpsg_country_list').html('<img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" />');
-
-			jQuery.ajax( {
-				url: '<?php
-					 
-					echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=save&noheader=1', 'wpsg-laender-save'));
-					
-				?>',
-				data: {
-					form_data: jQuery('#wpsg_land_edit_form_edit').serialize()
-				},
-				success: function(data) {
-
-					jQuery('#wpsg_country_list').html(data);
-
-				}
-			} );
-
-		} // function wpsg_country_save()
-
-		function wpsg_country_edit(land_id)
-		{
-
-			jQuery('#Modal_wpsg_country_edit .modal-body').html('<img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" />');
-			jQuery('#Modal_wpsg_country_edit').modal('show');
-
-			jQuery.ajax( {
-				url: '<?php 
-					
-					echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=edit&noheader=1', 'wpsg-laender-edit'));
-					
-				?>',
-				data: {
-					land_id: land_id
-				},
-				success: function(data) { jQuery('#Modal_wpsg_country_edit .modal-body').html(data); }
-			} );
-
-			return false;
-
-		} // function wpsg_country_edit(edit_id)
-
-	/* ]]> */</script>
+
+				window.setTimeout(function() {
+ 
+					jQuery('#wpsg_laenderrow_' + land_id).after('<tr id="wpsg_laenderrow_edit"><td colspan="8"><img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" /><div style="display:none;"></div></td></tr>');
+				
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=edit&noheader=1',
+						data: {
+							land_id: land_id
+						},
+						success: function(data) {
+													
+							jQuery('#wpsg_laenderrow_edit > td > div').html(data);
+							jQuery('#wpsg_laenderrow_edit > td > img').hide();
+							jQuery('#wpsg_laenderrow_edit > td > div').slideDown(300, function() { land_load = false; } );
+							
+						}
+					} );
+
+				}, edit_timeout);
+
+				return false;
+				
+			}
+
+			function wpsg_laender_remove(land_id)
+			{
+
+				if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
+
+				jQuery.ajax( {
+					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=remove&noheader=1',
+					data: {
+						land_id: land_id
+					},
+					success: function(data) {
+												 
+						if (data === "1") jQuery('#wpsg_laenderrow_' + land_id).remove();
+						else alert(data);
+						
+					}
+				} );
+				
+				return false;
+
+			}
+
+			jQuery(document).ready(function() {
+
+				jQuery('.wpsg_form_help').tipTip();
+
+			} );	
+        
+		/* ]]> */</script>
+	
+	</div>
 
 </div>
Index: /views/admin/laender_edit.phtml
===================================================================
--- /views/admin/laender_edit.phtml	(revision 8528)
+++ /views/admin/laender_edit.phtml	(revision 5261)
@@ -1,23 +1,29 @@
-<form id="wpsg_land_edit_form_edit" class="form-horizontal">
- 
-	<?php if (wpsg_isSizedInt($this->view['land']['id'])) { ?>
-	<input type="hidden" name="id" value="<?php echo $this->view['land']['id']; ?>" />
-	<?php } ?>
-	
-	<?php echo wpsg_drawForm_Input('country[name]', __('LÃ€ndername', 'wpsg'), wpsg_getStr($this->view['land']['name']), array('help' => 'wpsg_land_name')); ?>
-	<?php echo wpsg_drawForm_Input('country[kuerzel]', __('KÃŒrzel', 'wpsg'), wpsg_getStr($this->view['land']['kuerzel']), array('help' => 'wpsg_land_kuerzel')); ?>
-	<?php echo wpsg_drawForm_Select('country[vz]', __('Versandzone', 'wpsg'), $this->view['vz'], wpsg_getStr($this->view['land']['vz']), array('help' => 'wpsg_land_vz')); ?>
-	<?php echo wpsg_drawForm_Select('country[mwst]', __('MwSt. Grundlage', 'wpsg'), array(
+<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender&do=saveNew&noheader=1" id="<?php echo ((wpsg_isSizedInt($this->view['land']['id']))?'wpsg_land_edit_form_edit':'wpsg_land_edit_form_new'); ?>">
+
+	<?php if (wpsg_isSizedInt($this->view['land']['id'])) $prefix = 'land'; else $prefix = 'newland'; ?>
+
+	<?php echo wpsg_drawForm_Input($prefix.'[name]', __('LÃ€ndername', 'wpsg'), wpsg_getStr($this->view['land']['name']), array('help' => 'wpsg_land_name')); ?>
+	<?php echo wpsg_drawForm_Input($prefix.'[kuerzel]', __('KÃŒrzel', 'wpsg'), wpsg_getStr($this->view['land']['kuerzel']), array('help' => 'wpsg_land_kuerzel')); ?>
+	<?php echo wpsg_drawForm_Select($prefix.'[vz]', __('Versandzone', 'wpsg'), $this->view['vz'], wpsg_getStr($this->view['land']['vz']), array('help' => 'wpsg_land_vz')); ?>
+	<?php echo wpsg_drawForm_Select($prefix.'[mwst]', __('MwSt. Grundlage', 'wpsg'), array(
 		'0' => __('mit MwSt.', 'wpsg'),
 		'1' => __('keine MwSt.', 'wpsg'),
 		'2' => __('keine MwSt. bei USt.IdNr.', 'wpsg')
 	), wpsg_getStr($this->view['land']['mwst']), array('help' => 'wpsg_land_mwst')); ?>
-	<?php echo wpsg_drawForm_Input('country[mwst_a]', __('MwSt. Satz A (stark ermÃ€Ãigter Satz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_a']), array('help' => 'wpsg_land_mwst_a')); ?>
-	<?php echo wpsg_drawForm_Input('country[mwst_b]', __('MwSt. Satz B (ermÃ€Ãigter Satz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_b']), array('help' => 'wpsg_land_mwst_b')); ?>
-	<?php echo wpsg_drawForm_Input('country[mwst_c]', __('MwSt. Satz C (Normalsatz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_c']), array('help' => 'wpsg_land_mwst_c')); ?>
-	<?php echo wpsg_drawForm_Input('country[mwst_d]', __('MwSt. Satz D (Zwischensatz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_d']), array('help' => 'wpsg_land_mwst_d')); ?>
-	<?php echo wpsg_drawForm_Checkbox('standard', __('Standardland', 'wpsg'), wpsg_getStr($this->view['land']['standard']), array('disabled' => ((isset($this->view['land']['standard']) && $this->view['land']['standard'] == '1')?true:false), 'help' => 'wpsg_land_standard')); ?>
-
-	<?php $this->callMods('laender_edit'); ?>
+	<?php echo wpsg_drawForm_Input($prefix.'[mwst_a]', __('MwSt. Satz A (stark ermÃ€Ãigter Satz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_a']), array('help' => 'wpsg_land_mwst_a')); ?>
+	<?php echo wpsg_drawForm_Input($prefix.'[mwst_b]', __('MwSt. Satz B (ermÃ€Ãigter Satz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_b']), array('help' => 'wpsg_land_mwst_b')); ?>
+	<?php echo wpsg_drawForm_Input($prefix.'[mwst_c]', __('MwSt. Satz C (Normalsatz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_c']), array('help' => 'wpsg_land_mwst_c')); ?>
+	<?php echo wpsg_drawForm_Input($prefix.'[mwst_d]', __('MwSt. Satz D (Zwischensatz)', 'wpsg'), wpsg_getStr($this->view['land']['mwst_d']), array('help' => 'wpsg_land_mwst_d')); ?>
+	<?php echo wpsg_drawForm_Checkbox($prefix.'[standard]', __('Standardland', 'wpsg'), wpsg_getStr($this->view['land']['standard']), array('disabled' => ((isset($this->view['land']['standard']) && $this->view['land']['standard'] == '1')?true:false), 'help' => 'wpsg_land_standard')); ?>
+	
+	<?php if (wpsg_isSizedInt($this->view['land']['id'])) { ?>
+	<input type="hidden" name="<?php echo $prefix; ?>[id]" value="<?php echo wpsg_hspc($this->view['land']['id']); ?>" />
+	<?php } ?>
+	
+	<br />
+	
+	<input class="button" type="submit" onclick="return <?php echo ((wpsg_isSizedInt($this->view['land']['id']))?'wpsg_laender_save();':''); ?>" value="<?php echo __('Speichern', 'wpsg'); ?>" />
+		
+	<br /><br ><hr />
 	
 </form>
Index: ews/admin/laender_list.phtml
===================================================================
--- /views/admin/laender_list.phtml	(revision 8528)
+++ 	(revision )
@@ -1,86 +1,0 @@
-<?php
-
-    /**  Liste der LÃ€nder im Backend */
-
-    echo $this->writeBackendMessage();
-    
-?>
-
-<?php if (wpsg_isSizedArray($this->view['data'])) { ?>
-    <table class="table wpsg_table_country">
-
-        <thead>
-            <tr>
-                <th class="col_check"><input type="checkbox" onclick="return wpsg_country_check_all();" style="margin-top:-2px;" /></th>
-                <th class="col_name"><?php echo __('LÃ€ndername', 'wpsg'); ?></th>
-                <th class="col_vz"><?php echo __('Versandzone', 'wpsg'); ?></th>
-                <th class="col_mwstsetting"><?php echo __('MwSt.', 'wpsg'); ?></th>
-                <th class="col_mwst"><?php echo __('MwSt. A', 'wpsg'); ?></th>
-                <th class="col_mwst"><?php echo __('MwSt. B', 'wpsg'); ?></th>
-                <th class="col_mwst"><?php echo __('MwSt. C', 'wpsg'); ?></th>
-                <th class="col_mwst"><?php echo __('MwSt. D', 'wpsg'); ?></th>
-                <th class="col_action"></th>
-            </tr>
-        </thead>
-
-        <tbody>
-            <?php foreach ($this->view['data'] as $l) { ?>
-                <tr id="wpsg_laenderrow_<?php echo $l['id']; ?>" class="<?php echo (($this->get_option('wpsg_defaultland') == $l['id'])?'bg-info':''); ?>">
-                    <td class="col_check"><input type="checkbox" value="1" name="arDelete[<?php echo $l['id']; ?>]" /></td>
-                    <td class="col_name"><?php echo wpsg_hspc($l['name'].((wpsg_isSizedString($l['kuerzel']))?' ('.$l['kuerzel'].')':'')); ?></td>
-                    <td class="col_vz">
-                        <?php if (wpsg_isSizedInt($l['vz']) && wpsg_isSizedString($this->view['vz'][$l['vz']])) { ?>
-                            <?php echo wpsg_hspc($this->view['vz'][$l['vz']]); ?>
-                        <?php } ?>
-                    </td>
-                    <td class="col_mwstsetting">
-                        <?php if ($l['mwst'] == '2') { ?>
-                            <?php echo __('keine MwSt. bei USt.IdNr.', 'wpsg'); ?>
-                        <?php } else if ($l['mwst'] == '1') { ?>
-                            <?php echo __('keine MwSt.', 'wpsg'); ?>
-                        <?php } else { ?>
-                            <?php echo __('mit MwSt.', 'wpsg'); ?>
-                        <?php } ?>
-                    </td>
-                    <td class="col_mwst"><?php if (wpsg_tf($l['mwst_a']) != NULL) { ?>
-                            <?php echo wpsg_ff(wpsg_tf($l['mwst_a']), '%'); ?>
-                        <?php } ?></td>
-                    <td class="col_mwst"><?php if (wpsg_tf($l['mwst_b']) != NULL) { ?>
-                            <?php echo wpsg_ff(wpsg_tf($l['mwst_b']), '%'); ?>
-                        <?php } ?></td>
-                    <td class="col_mwst"><?php if (wpsg_tf($l['mwst_c']) != NULL) { ?>
-                            <?php echo wpsg_ff(wpsg_tf($l['mwst_c']), '%'); ?>
-                        <?php } ?></td>
-                    <td class="col_mwst"><?php if (wpsg_tf($l['mwst_d']) != NULL) { ?>
-                            <?php echo wpsg_ff(wpsg_tf($l['mwst_d']), '%'); ?>
-                        <?php } ?></td>
-                    <td class="col_action">
-
-                        <a href="#" onclick="return wpsg_country_edit('<?php echo $l['id']; ?>');" class="glyphicon glyphicon-pencil"></a>
-                        <a href="#" onclick="return wpsg_country_remove('<?php echo $l['id']; ?>');" class="glyphicon glyphicon-trash"></a>
-
-                    </td>
-                </tr>
-            <?php } ?>
-        </tbody>
-        <tfoot>
-            <tr>
-
-                <td class="col_check"><!-- <span class="glyphicon glyphicon-trash"></span> --></td>
-                <td colspan="8">
-
-                    <input type="submit" name="submit" onclick="return confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>');" class="button btn-xs" value="<?php echo __('Markierte LÃ€nder lÃ¶schen', 'wpsg'); ?>" />
-
-                </td>
-
-            </tr>
-        </tfoot>
-    </table>
-
-    <br />
-
-    <div class="info"><?php echo __('Das Standardland ist <span class="bg-info">blau</span> markiert und wird fÃŒr die MwSt. Berechnung im Backend verwendet.', 'wpsg'); ?></div>
-
-<?php } else { ?>
-    <p><?php echo __('Noch keine LÃ€nder angelegt.', 'wpsg'); ?></p>
-<?php } ?>
Index: ews/admin/licence.phtml
===================================================================
--- /views/admin/licence.phtml	(revision 8528)
+++ 	(revision )
@@ -1,292 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Lizenzverwaltung
-     */
-
-    $wpsg_update_data = wpsg_get_update_data();
-
-    if (!is_array($wpsg_update_data) || !current_user_can('wpsg_lizence') || !wpsg_isSizedInt($wpsg_update_data['returnCode'])) die();
-
-?>
-
-<div class="wpsg_admin" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse">
-				<ul class="nav navbar-nav">
-			 		<li role="presentation" class="<?php echo (($this->view['actionName'] == "index")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin"><?php echo __("Einstellungen", "wpsg"); ?></a></li>
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "module")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module"><?php echo __("Module", "wpsg"); ?></a></li>
-						
-					<?php if (current_user_can('wpsg_lizence') && is_array($wpsg_update_data)) { ?>			
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "licence")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=registrierung"><?php echo __("Lizenzverwaltung", "wpsg"); ?></a></li>
-					<?php } ?>
-					
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == 'news')?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=news">
-						<?php echo __('Aktuelles', 'wpsg'); ?>
-						<?php $wpsg_news_unread = wpsg_news::countUnreadNews(); if (wpsg_isSizedInt($wpsg_news_unread)) { ?>
-						<span class="badge" style="background-color:#D9534F;"><?php echo $wpsg_news_unread; ?></span>
-						<?php } ?>			
-					</a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">				
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "hilfe")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=hilfe"><?php echo __("Hilfe", "wpsg"); ?></a></li>
-					<li role="presentation" class="<?php echo (($this->view['actionName'] == "ueber")?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=ueber"><?php echo __("Ãber", "wpsg"); ?></a></li>
-			 	</ul>
-			</div>
-		</div>		
-	</nav>
-				  	
-	<div class="wpsg_admin_wrap">
-        
-        <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-		
-        <div class="wpsg_admin_submenu">
-	
-            <div class="list-group">
-                <span class="list-group-head list-group-item"><?php echo __('Lizenzverwaltung'); ?></span>	 
-                <a class="list-group-item <?php echo (($this->view['subaction'] == 'registerdata')?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=registerdata"><?php echo __('Registrierungsdaten', 'wpsg'); ?></a>
-                <a class="list-group-item <?php echo (($this->view['subaction'] == 'domaindata')?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domaindata"><?php echo __('Domainverwaltung', 'wpsg'); ?></a>
-                <a class="list-group-item <?php echo (($this->view['subaction'] == 'modulactivation')?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=modulactivation"><?php echo __('Modulaktivierung', 'wpsg'); ?></a>
-            </div> 
-            
-        </div>
-                
-        <div class="wpsg_admin_content form-horizontal">
-             
-            <div class="panel panel-default">
-                <div class="panel-heading clearfix">
-                    <h3 class="panel-title">  
-                        
-                        <?php if ($this->view['subaction'] === 'registerdata') { ?><?php echo __('Registrierungsdaten', 'wpsg'); ?>
-                        <?php } else if ($this->view['subaction'] === 'domaindata') { ?><?php echo __('Domainverwaltung', 'wpsg'); ?>
-                        <?php } else if ($this->view['subaction'] === 'modulactivation') { ?><?php echo __('Modulaktivierung', 'wpsg'); ?><?php } ?>
-                        
-                    </h3>
-                </div>
-                <div class="panel-body">
-            
-                    <?php if ($this->view['subaction'] === 'registerdata') { ?>
-                    
-                        <form method="POST" action="<?php echo WPSG_URL_WP ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=saveRegister">
-                            
-							<?php wp_nonce_field('wpsg-admin-licence-register'); ?>
-							
-                            <?php $strLicenceLabel = ''; ?>
-                            <?php if ($wpsg_update_data['licence_model'] === 'enterprise') { $strLicenceLabel = __('Enterprise', 'wpsg'); ?>
-                            <?php } else if ($wpsg_update_data['licence_model'] === 'pro') { $strLicenceLabel = __('Pro', 'wpsg'); } ?>
-                             
-                            <?php echo wpsg_drawForm_Text(_('Lizenzmodel'), $strLicenceLabel); ?>
-                            
-                            <br />
-                            
-                            <?php echo wpsg_drawForm_Input('register[company]', __('Firma', 'wpsg'), $wpsg_update_data['registerData']['company']); ?>
-                            <?php echo wpsg_drawForm_Input('register[firstname]', __('Vorname', 'wpsg'), $wpsg_update_data['registerData']['firstname']); ?>
-                            <?php echo wpsg_drawForm_Input('register[lastname]', __('Name', 'wpsg'), $wpsg_update_data['registerData']['lastname']); ?>
-                            <?php echo wpsg_drawForm_Input('register[zip]', __('PLZ', 'wpsg'), $wpsg_update_data['registerData']['zip']); ?>
-                            <?php echo wpsg_drawForm_Input('register[city]', __('Ort', 'wpsg'), $wpsg_update_data['registerData']['city']); ?>
-                            <?php echo wpsg_drawForm_Input('register[street]', __('StraÃe', 'wpsg'), $wpsg_update_data['registerData']['street']); ?>
-                            <?php echo wpsg_drawForm_Select('register[country]', __('Land', 'wpsg'), array(
-                                '1' => __('Deutschland', 'wpsg'),
-                                '2' => __('Ãsterreich', 'wpsg'),
-                                '3' => __('Schweiz', 'wpsg'),
-                                '4' => __('Niederlande', 'wpsg'),
-                                '5' => __('Belgien', 'wpsg')
-                            ), $wpsg_update_data['registerData']['country']); ?>
-                            <?php echo wpsg_drawForm_Input('register[email]', __('E-Mail', 'wpsg'), $wpsg_update_data['registerData']['email']); ?>
-                                       
-                            <br />
-                            
-                            <?php echo wpsg_drawForm_SubmitButton(__('Speichern', 'wpsg')); ?>
-                            
-                        </form>
-                        
-                    <?php } else if ($this->view['subaction'] === 'domaindata') { ?>
-               
-                        <?php if (wpsg_isSizedArray($wpsg_update_data['domainData'])) { ?>
-                              
-                            <table class="table domaintable">
-                                <thead>
-                                    <tr>
-                                        <th class="col_domain"><?php echo __('Domain', 'wpsg'); ?></th>
-                                        <th class="col_action"></th>
-                                    </tr>
-                                </thead>
-                                <tbody>
-                                    <?php foreach ($wpsg_update_data['domainData'] as $domain) { ?>
-                                    <tr class="success">
-                                        <td class="col_domain"><?php echo $domain; ?></td>
-                                        <td class="col_action">
-                                            
-											<?php if ($domain === $_SERVER['HTTP_HOST']) { ?>
-												<a href="<?php 
-													
-													echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=domainDeRegister', 'wpsg-admin-licence-domainDeRegister');
-													
-												?>" class="btn btn-warning btn-sm"><?php echo __('Registrierung aufheben'); ?></a>
-											<?php } ?>
-                                            
-                                        </td>
-                                    </tr>
-                                    <?php } ?>
-                                </tbody>
-                            </table>
-                            
-                        <?php } else { ?>
-                        
-                            <p><?php echo __('Es sind noch keine Domains fÃŒr diese Lizenz registriert.', 'wpsg'); ?></p>
-                            
-                        <?php } ?>
-                        
-                        <hr />
-                        
-                        <?php if (($wpsg_update_data['licence_model'] === 'enterprise' || sizeof($wpsg_update_data['domainData']) < 1) && !in_array($_SERVER['HTTP_HOST'], $wpsg_update_data['domainData'])) { ?>
-                        
-                            <p class="wpsg_message_ok"><?php echo __('Diese Domain kann noch auf Ihre Lizenz aktiviert werden.', 'wpsg'); ?></p>
-                            
-                            <br />
-                            
-                            <a href="<?php
-								
-								echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=domainRegister', 'wpsg-admin-licence-domainRegister');
-								
-							?>" class="btn btn-primary"><?php echo __('Diese Domain registrieren', 'wpsg'); ?></a>
-                                                    
-                        <?php } else if (in_array($_SERVER['HTTP_HOST'], $wpsg_update_data['domainData'])) { ?>
-                            
-                            <p class="wpsg_message_ok"><?php echo __('Diese Domain ist bereits auf diesen SchlÃŒssel registriert.', 'wpsg'); ?></p>
-                            
-                        <?php } else { ?>
-                            
-                            <p class="error"><?php echo __('Diese Domain kann nicht mehr registriert werden.', 'wpsg'); ?></p>
-                            
-                        <?php } ?>
-                        
-                    <?php } else if ($this->view['subaction'] === 'modulactivation') { ?>
-                    
-                        <?php $this->shop->loadModule(true); ?>
-                        <?php $wpsg_update_data = wpsg_get_update_data(); ?>
-
-                        <form method="POST" action="<?php echo WPSG_URL_WP ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=activatemodul&source=licence">
-						
-							<?php echo wp_nonce_field('wpsg-admin-licence-activatemodul'); ?>
-							
-                            <fieldset>
-                                <legend style="padding-top:0px;"><?php echo __('Modulcode aktivieren', 'wpsg'); ?></legend>
-                                                
-                                <div class="row">
-                                    <div class="col-xs-10">
-                                        
-                                        <input required="required" type="text" class="form-control" name="modulcode" id="modulcode" />
-                                        
-                                    </div>
-                                    <div class="col-xs-2">
-                                        
-                                        <input class="btn btn-primary btn-block" type="submit" class="form-control" value="<?php echo __('PrÃŒfen', 'wpsg'); ?>" />
-                                        
-                                    </div>
-                                </div>
-                            </fieldset>
-                            
-                        </form>
-                        
-                        <br />
-                        
-                        <?php if (wpsg_isSizedArray($wpsg_update_data)) { ?>
-                            <?php // Ich zeige hier nur die Aktiven Module an ?>
-                            <?php foreach ($wpsg_update_data['modulinfo'] as $modul_key => $modul_info) { if ($modul_info['active'] !== true) unset($wpsg_update_data['modulinfo'][$modul_key]); } ?>
-                            
-                            <table class="table modultable">
-                                <thead>
-                                    <tr>
-                                        <th><?php echo __('Modulname', 'wpsg'); ?></th>
-                                        <th><?php echo __('Version', 'wpsg'); ?></th>
-                                        <th><?php echo __('Lizenz', 'wpsg');  ?></th>
-                                        <th><?php echo __('verfÃŒgbare Version', 'wpsg'); ?></th>
-                                    </tr>
-                                </thead>
-                                <tbody>
-                                    <?php foreach ($wpsg_update_data['modulinfo'] as $modul_key => $modul_info) { ?>
-                                    <tr style="font-style:normal;" class="success">
-                                        <td><?php echo $modul_info['label']; ?></td>
-                                        <td>
-                                            
-                                            <?php if ($this->shop->hasModInstalled($modul_key)) { ?>
-                                                <?php echo $this->shop->arAllModule[$modul_key]->version; ?>
-                                            <?php } ?>
-                                            
-                                        </td>								
-                                        <td>
-                                            
-                                            <?php if ($modul_info['free'] === true) { ?>
-                                                <?php echo __('kostenlos', 'wpsg'); ?>
-                                            <?php } else if ($modul_info['active'] === true) { ?>
-                                                <?php echo __('enthalten', 'wpsg'); ?>
-                                            <?php } else { ?>
-                                                
-                                                <?php if (wpsg_isSizedString($modul_info['shop_url'])) { ?>
-                                                <a href="<?php echo $modul_info['shop_url']; ?>" target="_blank"><?php echo __('Modulcode erwerben', 'wpsg'); ?></a>
-                                                <?php } else { ?>
-                                                <a href="https://shop.maennchen1.de" target="_blank"><?php echo __('Modulcode erwerben', 'wpsg'); ?></a>
-                                                <?php } ?>
-                                                
-                                            <?php } ?>
-                                            
-                                        </td>
-                                        <td><?php 
-                                            
-                                            echo $modul_info['version'];
-                                             
-                                            if ($this->shop->hasModInstalled($modul_key) && $modul_info['version'] === $this->shop->arAllModule[$modul_key]->version)
-                                            {
-                                                
-                                                echo ' - <strong class="wpsg_message_ok">'.__('aktuell', 'wpsg').'</strong>';
-                                                
-                                            }
-                                            else if (version_compare($modul_info['version'], WPSG_VERSION) > 0) 
-                                            {
-                                                
-                                                echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong><br />'.wpsg_translate(__('<a href="#1#">wpShopGermany Update</a> notwendig', 'wpsg'), WPSG_URL_WP.'wp-admin/plugins.php');
-                                                
-                                            }
-                                            else if (version_compare($modul_info['version'], $this->shop->arAllModule[$modul_key]->version) > 0) 
-                                            {
-	
-												if ($this->shop->arAllModule[$modul_key]->version !== null) {
-                                                
-													echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong>';
-													
-												}
-                                                
-                                                if ($modul_info['active'] === true) 
-                                                {
-                                                
-                                                    echo '<br />';
-                                                    echo wpsg_translate(__('<a href="#1#">Version installieren</a>.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key.'&source=licence');
-                                                                                                        
-                                                }
-                                                
-                                            }
-                                            
-                                        ?></td>
-                                    </tr>
-                                    <?php } ?>
-                                </tbody>
-                            </table>
-                                                
-                        <?php } ?>
-                                                                        
-                    <?php } ?>
-                    
-                </div>
-            </div>
-            
-        </div>
-        
-	</div>
-	
-</div>
Index: /views/admin/loadsavesettings.phtml
===================================================================
--- /views/admin/loadsavesettings.phtml	(revision 8528)
+++ /views/admin/loadsavesettings.phtml	(revision 5261)
@@ -8,49 +8,41 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php 
-			 
-			echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; 
-			
-		?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
+	</ul>
 			
 </div>
 		
-<div class="wpsg_admin_content form-horizontal">
+<div style="padding:0px; margin:0px; float:left;">
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=loadsavesettings&noheader=1'); ?>">
-		
-		<?php \wp_nonce_field('wpsg-save-admin-loadsavesettings'); ?>
-		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Einstellungen sichern', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-	
-				<?php echo wpsg_drawForm_TextStart(); ?>
-				<a href="<?php 
-					
-					echo \wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=loadsavesettings&noheader=1&wpsg_do=downloadsettings&submit=1', 'wpsg-save-admin-loadsavesettings-download'); 
-					
-				?>" title="<?php echo __('Einstellungen als XML Datei downloaden', 'wpsg'); ?>"><?php echo __('Download', 'wpsg'); ?></a>				
-				<?php echo wpsg_drawForm_TextEnd(__('Einstellungen speichern', 'wpsg')); ?>
-	
-				<?php echo wpsg_drawForm_TextStart(); ?>
-				<input type="file" name="wpsg_settings" />		
-				<?php echo wpsg_drawForm_TextEnd(__('Einstellungen laden', 'wpsg')); ?>
- 				
+  		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_debugModus"><?php echo __('Einstellungen speichern', 'wpsg'); ?>:</label>
 			</div>
+			<div class="wpsg_form_right">
+				<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=loadsavesettings&noheader=1&wpsg_do=downloadsettings&submit=1'; ?>" title="<?php echo __('Einstellungen als XML Datei downloaden', 'wpsg'); ?>"><?php echo __('Download', 'wpsg'); ?></a>
+			</div>
+			<div class="wpsg_clear"></div>
 		</div>
-				
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_debugModus"><?php echo __('Einstellungen laden', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<input type="file" name="wpsg_settings" />				
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
 		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen ÃŒbernehmen', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p> 
-		
 		<p class="wpsg_hinweis">
 			<?php echo __('Derzeit werden nur die Einstellungen gespeichert. Produkte/Kunden/Bestellungen etc. sind nicht enthalten!', 'wpsg'); ?>
 		</p>
-		
 	</form>
 </div>
Index: /views/admin/module.phtml
===================================================================
--- /views/admin/module.phtml	(revision 8528)
+++ /views/admin/module.phtml	(revision 5261)
@@ -6,154 +6,77 @@
 	 */
 
-	$wpsg_update_data = wpsg_get_update_data();
-	if (wpsg_isSizedArray($wpsg_update_data['modulinfo'])) $modul_info = $wpsg_update_data['modulinfo'];
-	else $modul_info = array();
-
 ?>
 <div class="wpsg_admin_submenu">
-
-	<div class="wpsg_modul_search_wrap">
-		<input id="wpsg_modul_search" type="text" class="wpsg_modul_search" value="<?php echo wpsg_getStr($_COOKIE['wpsg-modulfilter-search']); ?>" />	
-		<label title="<?php echo __('Wenn aktiviert, werden nur aktive Module angezeigt'); ?>">
-			<input type="checkbox" <?php echo ((wpsg_isSizedString($_COOKIE['wpsg-modulfilter-check'], 'true'))?'checked="checked"':''); ?> id="wpsg_modul_onlyactive" class="wpsg_modul_onlyactive" />
-			<span class="glyphicon glyphicon-ok wpsg_modul_onlyactive_glyphicon" aria-hidden="true"></span>
-		</label>
-	</div>
 	
 	<?php foreach ($this->view['groups'] as $group_name => $g) { ?>
-	<div class="list-group list-modul-group" style="display:none;" >
-		<span class="list-group-item list-group-head"><?php echo $group_name; ?></span>		
+	<div class="head">
+		<div class="title"><?php echo $group_name; ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
 		<?php foreach ($g as $mod_key => $m) { ?>
-		<a class="<?php echo (($this->get_option($mod_key, $this->view['global']) > 0)?'modul_akt':''); ?> list-group-modul list-group-item <?php echo (($mod_key == wpsg_getStr($_REQUEST['modul'])?'active':'')); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $mod_key; ?>">
-			<span class="wpsg_modul_name"><?php echo $m->name; ?></span>
-			<?php if (($this->get_option($mod_key, $this->view['global']) > 0)?'modul_akt':'') { ?>
-			<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
-			<?php } ?>
-		</a>
+		<li class="<?php echo (($this->get_option($mod_key, $this->view['global']) > 0)?'modul_akt':''); ?> <?php echo (($mod_key == $_REQUEST['modul'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $mod_key; ?>"><?php echo $m->name; ?></a></li>
 		<?php } ?>
-	</div>
+	</ul>
+	<div style="clear:both; height:10px; margin-left:0px; margin-right:8px;"></div>
 	<?php } ?>
-	 
+			
 </div>
 
 <?php if (isset($_REQUEST['modul'])) { ?>
-<div class="wpsg_admin_content form-horizontal">
-	<?php echo wpsg_drawForm_AdminboxStart($this->arAllModule[$_REQUEST['modul']]->name); ?>		
+<div class="wpsg_admin_content">		
 	<form name="form1" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $_REQUEST['modul']; ?>&amp;noheader=1" method="post" enctype="multipart/form-data">
-
-		<?php echo \wp_nonce_field('wpsg-admin-submit-module-'.$_REQUEST['modul']); ?>
 		
-		<p>
-
-			<?php echo $this->arAllModule[$_REQUEST['modul']]->desc; ?>
-
-			<a class="modul_help_link" target="_blank" href="https://doc.maennchen1.de/?modul_key=<?php echo $_REQUEST['modul']; ?>" title="<?php echo __('Hilfe zum Modul', 'wpsg'); ?>"><?php echo __('Hilfe zum Modul', 'wpsg'); ?></a>
-
-		</p>
-
-		<br />
+		<h3>
+			<?php echo $this->arAllModule[$_REQUEST['modul']]->name; ?>
+			<?php if (isset($this->arAllModule[$_REQUEST['modul']]->hilfeURL) && $this->arAllModule[$_REQUEST['modul']]->hilfeURL != '') { ?>
+			<a target="_blank" href="<?php echo $this->arAllModule[$_REQUEST['modul']]->hilfeURL; ?>" class="wpsg_form_help_notip"></a>	
+			<?php } ?>
+		</h3>
 		
-		<?php if (!isset($wpsg_update_data['modulinfo'][$_REQUEST['modul']]) || @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['demo_active'] === true || @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['active'] === true || $wpsg_update_data['modulinfo'][$_REQUEST['modul']]['free'] === true) { ?>
-
-			<?php if (($this->arAllModule[$_REQUEST['modul']]->plugin_module??false) !== true) { ?>
-				<?php $modul_install = $this->get_option($_REQUEST['modul'], $this->view['global']); ?>
-				<?php echo wpsg_drawForm_Select('aktiv', __('Modul aktiviert', 'wpsg'), array('0' => __('Nein', 'wpsg'), '1' => __('Ja', 'wpsg')), ((wpsg_isSizedInt($modul_install))?'1':'0')); ?>
-			<?php } else { ?>
-				<input type="hidden" name="aktiv" value="1" />
-			<?php } ?>
-
+		<p><?php echo $this->arAllModule[$_REQUEST['modul']]->desc; ?></p>
+		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<?php echo __("Modul aktiviert", "wpsg"); ?>:
+			</div>
+			<div class="wpsg_form_right">
+				<select name="aktiv">
+					<option value="0"><?php echo __('Nein', 'wpsg'); ?></option>
+					<option value="1" <?php echo (($this->get_option($_REQUEST['modul'], $this->view['global']) > 0)?'selected="selected"':''); ?>><?php echo __('Ja', 'wpsg'); ?></option>					
+				</select>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+		 
+		<?php if (isset($this->arAllModule[$_REQUEST['modul']]->version)) { ?>
+		<?php echo wpsg_drawForm_Input('', __('Version', 'wpsg'), $this->arAllModule[$_REQUEST['modul']]->version, array('text' => true)); ?>		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<?php echo __("Lizenz", "wpsg"); ?>:
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<?php if (isset($this->arAllModule[$_REQUEST['modul']]->free) && $this->arAllModule[$_REQUEST['modul']]->free === true) { ?>
+					<?php echo __('Kostenfrei', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php if (is_array($this->arLizenz) && in_array($_REQUEST['modul'], (array)$this->arLizenz['mods'])) { ?>
+					<?php echo __('Aktiviert', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php if ($this->arAllModule[$_REQUEST['modul']]->getDemoDays() > 0) { ?>
+					<?php echo wpsg_translate(__('Demo Modus noch #1# Tage verbleibend.', 'wpsg'), $this->arAllModule[$_REQUEST['modul']]->getDemoDays()); ?>
+					<?php } else { ?>
+					<?php echo __('Demo Modus abgelaufen.', 'wpsg'); ?>
+					<?php } ?>
+					<?php } ?>
+					<?php } ?>
+				</p>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>		
 		<?php } ?>
-		 		 
-		<?php if (isset($this->arAllModule[$_REQUEST['modul']]->version)) { ?>
-			
-		<?php echo wpsg_drawForm_TextStart(); ?>
 		
-			<?php 
-			 
-				echo $this->arAllModule[$_REQUEST['modul']]->version;
-			
-				if (wpsg_isSizedArray($modul_info[$_REQUEST['modul']]))
-				{
-			
-					$modul_info_modul = $modul_info[$_REQUEST['modul']];
-				 
-					if ($modul_info_modul['version'] === $this->arAllModule[$_REQUEST['modul']]->version)
-					{
-						
-						echo ' - <strong class="wpsg_message_ok">'.__('aktuell', 'wpsg').'</strong>';
-						
-					}
-					else if (version_compare($modul_info_modul['version'], WPSG_VERSION) > 0) 
-					{
-						
-						echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong><br />'.wpsg_translate(__('<a href="#1#">wpShopGermany Update</a> notwendig', 'wpsg'), WPSG_URL_WP.'wp-admin/plugins.php');
-						
-					}
-					else if (version_compare($modul_info_modul['version'], $this->arAllModule[$_REQUEST['modul']]->version) > 0) 
-					{
-						
-						echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong>';
-						
-						echo '<br />';
-						echo wpsg_translate(__('<a href="#1#">neue Version installieren</a>.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$_REQUEST['modul']);
-						
-					}
-					
-				}
-			
-			?>
-			
-		<?php echo wpsg_drawForm_TextEnd(__('Version', 'wpsg')); ?>
-		
-		<?php echo wpsg_drawForm_TextStart(); ?>
-			
-			<?php if (array_key_exists($_REQUEST['modul'], $modul_info)) { ?>
-				
-				<?php if (wpsg_isTrue($modul_info[$_REQUEST['modul']]['free'])) { ?>
-					<span class="wpsg_message_ok"><?php echo __('Kostenfrei', 'wpsg'); ?></span>
-				<?php } else if (wpsg_isTrue($modul_info[$_REQUEST['modul']]['active'])) { ?>
-					<span class="wpsg_message_ok"><?php echo __('Aktiv', 'wpsg'); ?></span>
-				<?php } else { ?>
-					
-					<?php if (wpsg_isTrue($modul_info[$_REQUEST['modul']]['demo_active'])) { ?>
-						<span class="wpsg_message_demo"><?php echo __('Demo Modus', 'wpsg'); ?></span>
-					<?php } else { ?> 
-						<span class="wpsg_error"><?php echo __('Nicht aktiv', 'wpsg'); ?></span>
-					<?php } ?>
-					
-					<?php if ($this->bLicence === true) { ?>
-					<?php if (wpsg_isSizedString($modul_info[$_REQUEST['modul']]['shop_url'])) {  ?>
-					[ <a href="<?php echo $modul_info[$_REQUEST['modul']]['shop_url']; ?>"><?php echo __('Modulcode erwerben', 'wpsg'); ?></a> ]					
-					<?php } else { ?>
-					[ <a href="https://shop.maennchen1.de/"><?php echo __('Modulcode erwerben', 'wpsg'); ?></a> ]
-					<?php } ?>
-					[ <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=modulactivation"><?php echo __('Modulcode eingeben', 'wpsg'); ?></a> ]
-					
-					<?php if (!wpsg_isTrue($modul_info[$_REQUEST['modul']]['demo_active'])) { ?>
-					<br />
-					
-					[ <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=startDemo&modul=<?php echo $_REQUEST['modul']; ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher? Das Modul kann 14 Tage ab heute komplett in vollem Umfang getestet werden.', 'wpsg'); ?>');"><?php echo __('Demo Modus starten'); ?></a> ]
-					<?php } ?>
-					<?php } else { ?>
-					<br /><span class="wpsg_error"><?php echo __('Ohne Lizenz kÃ¶nnen Sie dieses Modul nicht verwenden.', 'wpsg'); ?></span>
-					<?php } ?>
-						
-				<?php } ?>
-					
-			<?php } else { ?>
-				<span class="wpsg_error"><?php echo __('Unbekannt', 'wpsg'); ?></span>	
-			<?php } ?>
-						
-		<?php echo wpsg_drawForm_TextEnd(__('Lizenz')); ?>
-					
-		<?php } ?>
-
-		<?php if (  !isset($this->arAllModule[$_REQUEST['modul']]->version) || 
-                    @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['demo_active'] === true || 
-                    @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['active'] === true || 
-                    @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['free'] === true) { ?>
-
-			<hr />
-		
+		<?php if (!isset($this->arAllModule[$_REQUEST['modul']]->version) || (($this->arAllModule[$_REQUEST['modul']]->free === true || (is_array($this->arLizenz) && in_array($_REQUEST['modul'], (array)$this->arLizenz['mods'])) || $this->arAllModule[$_REQUEST['modul']]->getDemoDays() > 0))) { ?>
 			<?php if ($this->arAllModule[$_REQUEST['modul']]->inline === true) { ?>
 			<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit"></p>
@@ -173,14 +96,6 @@
 			<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit"></p>			
 			<?php } ?>
-	
 		<?php } else { ?>
-	
-			<?php if (
-                    @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['demo_active'] === true || 
-                    @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['active'] === true || 
-                    @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['free'] === true) { ?>
-			<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit"></p>
-			<?php } ?>
-			
+		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit"></p>
 		<?php } ?>
 						
@@ -188,56 +103,25 @@
 	</form>
 	<?php } ?>
-	
-	<?php if (array_key_exists($_REQUEST['modul'], @$this->arModule) && (!isset($this->arAllModule[$_REQUEST['modul']]->version) || ((@$this->arAllModule[$_REQUEST['modul']]->free === true || (is_array(@$this->arLizenz) && in_array($_REQUEST['modul'], (array)@$this->arLizenz['mods'])))))) { ?>
-	<?php echo $this->arModule[$_REQUEST['modul']]->settings_edit_afterform(); ?>
-	<?php } ?>	
-	
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
 </div>
 <?php } else { ?>
 
-	<div class="wpsg_admin_content form-horizontal">
-		<div class="panel panel-default">
-			<div class="panel-heading clearfix">
-				<h3 class="panel-title"><?php echo __('Modulverwaltung', 'wpsg'); ?></h3>
-		 	</div>
-		 	<div class="panel-body">
-	 	
-				<?php if ($this->bLicence === true) { ?>
-				<form method="POST" action="<?php echo WPSG_URL_WP ?>wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=activatemodul">
-					
-					<?php echo wp_nonce_field('wpsg-admin-licence-activatemodul'); ?>
-					
-					<fieldset>
-						<legend style="padding-top:0px;"><?php echo __('Modulcode aktivieren', 'wpsg'); ?></legend>
-										
-						<div class="row">
-							<div class="col-xs-10">
-								
-								<input required="required" type="text" class="form-control" name="modulcode" id="modulcode" />
-								
-							</div>
-							<div class="col-xs-2">
-								
-								<input class="btn btn-primary btn-block" type="submit" class="form-control" value="<?php echo __('PrÃŒfen', 'wpsg'); ?>" />
-								
-							</div>
-						</div>
-					</fieldset>
-					
-				</form>
-				<?php } else { ?>
-					
-				<p><?php echo __('Modulcodes kÃ¶nnen erst verwendet werden, wenn ihre wpShopGermany Lizenz aktiviert ist.', 'wpsg'); ?>
-				
-				<?php } ?>			
+	<?php if ($this->hasMod('wpsg_mod_core')) { ?>
+	<?php echo $this->callMod('wpsg_mod_core', 'module_index'); ?>
+	<?php } else { ?>
 	
-				<hr />
-				
-				<?php include dirname(__FILE__).'/modulelist.phtml'; ?>
-				 		
-			</div>
-	 	</div>
-	</div>	
+		<div class="wpsg_admin_content">
+	
+			<h3><?php echo __('Modulverwaltung', 'wpsg'); ?></h3>
+			<p><?php echo __('wpShopGermany ist Modular aufgebaut, wÃ€hlen Sie links das Modul aus, welches Sie konfigurieren mÃ¶chten. ', 'wpsg'); ?></p>
+			
+			<p><?php echo wpsg_translate(
+				__('<span style="color:red; font-weight:bold;">wpShopGermany Vollversion erwerben und weitere Funktionen freischalten.</span> [ <a target="_blank" href="#1#">Vollversion kaufen</a> ] [ <a target="_blank" href="#2#">Weitere Infos</a> ]', 'wpsg'),
+				'http://shop.maennchen1.de/produkte/wpshopgermany-lizenzkey/',
+				'http://wpshopgermany.de/'
+			); ?></p>
+	
+		</div>
+	
+	<?php } ?>	
 	
 <?php } ?>
@@ -245,59 +129,8 @@
 <script type="text/javascript">/* <![CDATA[ */
 
-	function wpsg_ssh_module()
-	{
-
-		jQuery('.list-modul-group').show();
-		jQuery('.wpsg_admin_submenu .list-group-item').show();
-
-		var check = jQuery('#wpsg_modul_onlyactive').prop('checked');
-		var search = jQuery('#wpsg_modul_search').val();
-
-		jQuery.cookie('wpsg-modulfilter-check', check);
-		jQuery.cookie('wpsg-modulfilter-search', search);
-		
-		jQuery('.wpsg_modul_name').each(function() {
-
-			if (!jQuery(this).parent().hasClass('active'))
-			{
-			
-				if (check && !jQuery(this).parent().hasClass('modul_akt')) jQuery(this).parent().hide();
-				else if (jQuery.trim(search) != '')
-				{
-	
-					var re = new RegExp(search, 'i');
-
-					if (!jQuery(this).html().match(re)) jQuery(this).parent().hide();
-					else jQuery(this).parent().show();
-						
-				}
-
-			}
-				
-		} ); 
-
-		jQuery('.list-modul-group').each(function() {
-
-			if (jQuery(this).find('.list-group-modul:visible').length <= 0) jQuery(this).hide();
-			else jQuery(this).show();				
-			
-		} );
-		
-	}
-
 	jQuery(document).ready(function() {
 
-		jQuery('#wpsg_modul_onlyactive').bind('change', function(event) {
+		jQuery('.wpsg_form_help').tipTip();
 
-			wpsg_ssh_module();			
-			jQuery(this).blur();
-			
-		} );
-
-		jQuery('#wpsg_modul_search').focus().bind('blur', wpsg_ssh_module);
-		jQuery('#wpsg_modul_search').focus().bind('keyup', wpsg_ssh_module);
-		
-		wpsg_ssh_module();
-		
 	} );
 
Index: ews/admin/modulelist.phtml
===================================================================
--- /views/admin/modulelist.phtml	(revision 8528)
+++ 	(revision )
@@ -1,153 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Liste der Module
-     * wird in der ModulverwaltungsÃŒbersicht und in der Lizenzverwaltung verwendet
-     */
-
-    $wpsg_update_data = wpsg_get_update_data();
-
-    if (get_class($this) === "wpsg_ShopController") 
-    {
-    
-        $source = 'module';
-        @$this->shop = &$this;
-
-    }
-    else
-    {
-
-        $source = 'licence';
-
-    }
-
-?>
-
-<?php if (wpsg_isSizedArray($wpsg_update_data['modulinfo'])) { ?>
-  
-    <?php /* foreach ($wpsg_update_data['modulinfo'] as $modul_key => $modul_info) { if ($modul_info['active'] !== true) unset($wpsg_update_data['modulinfo'][$modul_key]); }  */ ?>
-    
-    <table class="table modultable">
-        <thead>
-            <tr>
-                <th><?php echo __('Modulname', 'wpsg'); ?></th>
-                <th><?php echo __('Version', 'wpsg'); ?></th>
-                <th><?php echo __('Lizenz', 'wpsg');  ?></th>
-                <th><?php echo __('verfÃŒgbare Version', 'wpsg'); ?></th>
-            </tr>
-        </thead>
-        <tbody>
-            <?php foreach ($wpsg_update_data['modulinfo'] as $modul_key => $modul_info) { ?>
-            <tr style="font-style:normal;" class="<?php 
-            
-                if ($modul_info['free'] === true) echo 'active';
-				else if ($modul_info['active'] === true) echo 'success'; 
-                else echo 'info'; 
-                ?>">
-                <td>
-                
-                    <?php if ($this->shop->hasModInstalled($modul_key)) { ?>
-                    <a href="<?php echo  WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=<?php echo $modul_key; ?>">
-                    <?php } ?>
-                    
-                    <?php echo $modul_info['label']; ?> 
-                
-                    <?php if ($this->shop->hasModInstalled($modul_key)) { ?>
-                    </a>    
-                    <?php } ?>
-                        
-                </td>
-                <td>
-                    
-                    <?php if ($this->shop->hasModInstalled($modul_key)) { ?>
-                        <?php echo $this->shop->arAllModule[$modul_key]->version; ?>
-                    <?php } ?>
-                    
-                </td>								
-                <td>
-                    
-                    <?php if ($modul_info['free'] === true) { ?>
-                        <?php echo __('kostenlos', 'wpsg'); ?>
-                    <?php } else if ($modul_info['active'] === true) { ?>
-                        <?php echo __('enthalten', 'wpsg'); ?>
-                    <?php } else { ?>
-                        
-                        <?php if (wpsg_isSizedString($modul_info['shop_url'])) { ?>
-                        <a href="<?php echo $modul_info['shop_url']; ?>" target="_blank"><?php echo __('Modulcode erwerben', 'wpsg'); ?></a>
-                        <?php } else { ?>
-                        <a href="https://shop.maennchen1.de" target="_blank"><?php echo __('Modulcode erwerben', 'wpsg'); ?></a>
-                        <?php } ?>
-                        
-                    <?php } ?>
-                    
-                    <?php if (!$this->shop->hasModInstalled($modul_key)) { ?>
-                    
-                        <br />
-                        <?php if ($modul_info['active'] === true || $modul_info['free'] === true) { ?>
-                            <?php echo wpsg_translate(__('<a href="#1#">Version installieren</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key.'&source='.$source); ?>
-                        <?php } else { ?>
-                            <?php echo wpsg_translate(__('<a href="#1#">Demo installieren</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key.'&source='.$source); ?>
-                        <?php } ?>
-                        
-                    <?php } ?>
-                    
-                </td>
-                <td><?php 
-                                         
-                    if ($modul_info['active'] === true && $modul_info['version'] != $modul_info['version_latest'] && version_compare($modul_info['version_latest'], $this->shop->arAllModule[$modul_key]->version) < 0)
-                    {
-                        
-                        echo $modul_info['version_latest'];
-                         
-                        echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong>';
-                        echo '<br />';
-                        echo wpsg_translate(__('<a href="#1#">Version installieren</a>.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key.'&source='.$source);
-                        
-                        echo '<br /><br />';
-                        
-                    }
-                    
-                    echo $modul_info['version'];
-                    
-                    if ($this->shop->hasModInstalled($modul_key) && $modul_info['version'] === $this->shop->arAllModule[$modul_key]->version)
-                    {
-                        
-                        echo ' - <strong class="wpsg_message_ok">'.__('aktuell', 'wpsg').'</strong>';
-                        
-                    }
-                    else if ($this->shop->hasModInstalled($modul_key) && version_compare($modul_info['version'], WPSG_VERSION) > 0) 
-                    {
-                        
-                        echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong><br />'.wpsg_translate(__('<a href="#1#">wpShopGermany Update</a> notwendig', 'wpsg'), WPSG_URL_WP.'wp-admin/plugins.php');
-                        
-                    }
-                    else if ($this->shop->hasModInstalled($modul_key) && version_compare($modul_info['version'], $this->shop->arAllModule[$modul_key]->version) > 0) 
-                    {
-                        
-                        echo ' - <strong class="wpsg_error">'.__('neue Version verfÃŒgbar', 'wpsg').'</strong>';
-                        
-                        if ($modul_info['active'] === true) 
-                        {
-                        
-                            echo '<br />';
-                            echo wpsg_translate(__('<a href="#1#">Version installieren</a>.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key.'&source='.$source);
-                            
-                        }
-                        
-                    }
-                    
-                ?></td>
-            </tr>
-            <?php } ?>
-        </tbody>
-    </table>
-            
-<?php } else { ?>
-
-    <?php echo __('Mit einer Lizenz (Pro, Enterprise) machst du aus deinem wpShopGermany mehr.', 'wpsg'); ?><br /><br />
-    <?php echo __('Du erhÃ€ltst neben kostenlosem Support (per Mail oder Forum, 1 Jahr Updates frei) auch die MÃ¶glichkeit, die Vielzahl der zusÃ€tzlich erhÃ€ltlichen wpShopGermany Module zu nutzen.', 'wpsg'); ?>
-
-    <a href="https://shop.maennchen1.de/produkt/wpshopgermany4-lizenzkey/" target="_blank"><?php echo __('wpShopGermany im Shop ansehen', 'wpsg'); ?></a>
-
-
-<?php } ?>
Index: /views/admin/musterwiderruf.pdf.phtml
===================================================================
--- /views/admin/musterwiderruf.pdf.phtml	(revision 8528)
+++ /views/admin/musterwiderruf.pdf.phtml	(revision 5261)
@@ -4,7 +4,7 @@
 	 * Template fÃŒr die PDF Rechnung
 	 */
-	
-	require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-	require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php'; 
+
+	require_once WPSG_PATH_LIB.'fpdf/fpdf.php';
+	require_once WPSG_PATH_LIB.'fpdf/fpdi.php';
 	require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
     	
@@ -12,5 +12,4 @@
 	$adress_left 				= 25;	
 	$adress_top					= 55;
-	$adress_right				= 105;
 	
 	// Positionierund des Textes
@@ -29,8 +28,4 @@
 	$pdf->Text($adress_left, $adress_top + 10, $this->get_option('wpsg_shopdata_street'));
 	$pdf->Text($adress_left, $adress_top + 15, $this->get_option('wpsg_shopdata_zip').' '.$this->get_option('wpsg_shopdata_city'));
-	
-	$pdf->Text($adress_right, $adress_top + 5, __('Telefon: ', 'wpsg'). $this->get_option('wpsg_shopdata_tel'));
-	$pdf->Text($adress_right, $adress_top + 10, __('Fax: ', 'wpsg'). $this->get_option('wpsg_shopdata_fax'));
-	$pdf->Text($adress_right, $adress_top + 15, __('E-Mail: ', 'wpsg'). $this->get_option('wpsg_shopdata_email'));	
 	
 	// Rechnungsdaten
Index: /views/admin/news.phtml
===================================================================
--- /views/admin/news.phtml	(revision 8528)
+++ /views/admin/news.phtml	(revision 5261)
@@ -8,5 +8,7 @@
 
 <?php if (wpsg_isSizedArray($this->view['news'])) { ?>
- 
+
+	<br />
+
 	<div class="wpsg_news_wrap">
 	
@@ -14,12 +16,10 @@
 		<div class="wpsg_news <?php echo ((wpsg_news::isRead($news['id']))?'wpsg_news_read':''); ?>"> 
 			
-			<?php 
-			$temp = '<a target="_blank" onclick="setTimeout(function() { location.href = location.href; }, 1000); return true;" href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=news&read='.rawurlencode($news['id']).'&noheader=1">'.wpsg_hspc(wpsg_formatTimestamp($news['date'], true).' - '.$news['title']).'</a>';
-			echo wpsg_drawForm_AdminboxStart(__($temp, 'wpsg'), '', array('panel-body-class' => ((wpsg_news::isRead($news['id']))?'bg-success':'bg-info')));
-			
-			?>
-		 
+			<h2><a target="_blank" onclick="setTimeout(function() { location.href = location.href; }, 1000); return true;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=news&read=<?php echo rawurlencode($news['id']); ?>&noheader=1"><?php echo wpsg_hspc(wpsg_formatTimestamp($news['date'], true).' - '.$news['title']); ?></a></h2>
+		
+			<div class="markRead">
+				<?php echo __('gelesen', 'wpsg'); ?> <img src="<?php echo $this->getRessourceURL('gfx/tick.png'); ?>" title="<?php echo __('gelesen', 'wpsg'); ?>" alt="<?php echo __('gelesen', 'wpsg'); ?>" />
+			</div>
 			<div class="wpsg_news_content"><?php echo wpsg_news::prepareContent($news); ?></div>
-			<?php echo wpsg_drawForm_AdminboxEnd(); ?>
 			 
 		</div>
Index: ews/admin/pager.phtml
===================================================================
--- /views/admin/pager.phtml	(revision 8528)
+++ 	(revision )
@@ -1,43 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Pager im Backend
-     */
-
-?>
-
-<?php if ($this->view['pages'] > 1) { ?>
-    <nav class="pagination_wrap">
-        <ul class="pagination">
-                
-            <?php $offset = 5; ?>
-            
-            <?php if ($this->view['arFilter']['page'] > 2) { $offset --; ?>
-                <li><a onclick="return goPage(1);" href="#" aria-label="<?php echo __('Erste Seite'); ?>"><span aria-hidden="true"><i class="glyphicon glyphicon-step-backward"></i></span></a></li>
-            <?php } ?>
-            
-            <?php if ($this->view['arFilter']['page'] > 1) { $offset --; ?>
-                <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] - 1; ?>);" href="#" aria-label="<?php echo __('Vorherige Seite'); ?>"><span aria-hidden="true"><i class="glyphicon glyphicon-backward"></i></span></a></li>
-            <?php } ?>                
-            
-            <?php for ($i = 1; $i <= $this->view['pages']; $i ++) { ?>
-                
-                <?php if ($i > $this->view['arFilter']['page'] - $offset && $i < $this->view['arFilter']['page'] + $offset) { ?>
-                <li class="<?php echo (($i == $this->view['arFilter']['page'])?'active':''); ?>"><a onclick="return goPage(<?php echo $i; ?>);" href="#"><?php echo $i; ?></a></li>
-                <?php } else if ($i == $this->view['arFilter']['page'] - $offset || $i == $this->view['arFilter']['page'] + $offset) { ?>
-                <li class=""><span class="more">..</span></li>
-                <?php } ?>
-                    
-            <?php } ?>
-            
-            <?php if ($this->view['arFilter']['page'] + 1 <= $this->view['pages']) { ?>
-                <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] + 1; ?>);" href="#" aria-label="<?php echo __('NÃ€chste Seite'); ?>"><span aria-hidden="true"><i class="glyphicon glyphicon-play"></i></span></a></li>
-            <?php } ?>
-            
-            <?php if ($this->view['arFilter']['page'] + 2 <= $this->view['pages']) { ?>
-                <li><a onclick="return goPage(<?php echo $this->view['pages']; ?>);" href="#" aria-label="<?php echo __('Letzte Seite'); ?>"><span aria-hidden="true"><i class="glyphicon glyphicon-step-forward"></i></span></a></li>
-            <?php } ?>
-            
-        </ul>            
-    </nav>
-<?php } ?>
Index: /views/admin/path.phtml
===================================================================
--- /views/admin/path.phtml	(revision 8528)
+++ /views/admin/path.phtml	(revision 5261)
@@ -8,37 +8,30 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div>
+	</ul>
 			
 </div>
 		
-<div class="wpsg_admin_content form-horizontal">
+<div style="padding:0px; margin:0px; float:left;">
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=konfiguration&noheader=1'); ?>">
   
-  	<div class="panel panel-default">		
+  		<h3><?php echo __('Pfadeinstellungen', 'wpsg'); ?></h3>
+  		
+  		<p><?php echo __('Hier kÃ¶nnen die Pfade definiert werden, in denen der Shop seine Daten ablegt.', 'wpsg'); ?></p>
+  
+		<?php echo wpsg_drawForm_Input('wpsg_path_upload_multiblog', __('Multiblog Upload Path (relativ zu wp-content)', 'wpsg'), $this->get_option('wpsg_path_upload_multiblog', true), array('hint' => __('Sollte den Platzhalter %blog_id% enthalten, dieser zeigt auf die ID des jeweiligen Blockes sonst kann es bei dem Betrieb von mehreren Shops zu Ãberschreibungen kommen.', 'wpsg'))); ?>
+
+		<input type="hidden" name="subaction" value="path" />
 			
-			<div class="panel-heading clearfix">
-      	<h3 class="panel-title"><?php echo __('Pfadeinstellungen', 'wpsg'); ?></h3>
-      </div>
-      
-  		<div class="panel-body">	  		
-				<div class="info">  		
-  				<br />
-  					<?php echo __('Hier kÃ¶nnen die Pfade definiert werden, in denen der Shop seine Daten ablegt.', 'wpsg'); ?></p>
-  				<br />
-  			</div>
+		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 				
-				<?php echo wpsg_drawForm_Input('wpsg_path_upload_multiblog', __('Multiblog Upload Path (relativ zu wp-content)', 'wpsg'), $this->get_option('wpsg_path_upload_multiblog', true), array('hint' => __('Sollte den Platzhalter %blog_id% enthalten, dieser zeigt auf die ID des jeweiligen Blockes sonst kann es bei dem Betrieb von mehreren Shops zu Ãberschreibungen kommen.', 'wpsg'))); ?>
-
-				<input type="hidden" name="subaction" value="path" />
-			
-				<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-				
-			</div>	
-		</div>			
 	</form>
 </div>
Index: /views/admin/presentation.phtml
===================================================================
--- /views/admin/presentation.phtml	(revision 8528)
+++ /views/admin/presentation.phtml	(revision 5261)
@@ -8,53 +8,41 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>
-			<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>
-		<?php } ?>
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
 	</div>
 
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
+		<?php } ?>
+	</ul>
+			
 </div>
+		
+<div style="padding:0px; margin:0px; float:left;">
+	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=presentation&noheader=1'); ?>">
+	 
+	 	<?php echo wpsg_drawForm_Checkbox('wpsg_showMwstAlways', __('MwSt. Spalte auch bei einem Satz zeigen', 'wpsg'), $this->get_option('wpsg_showMwstAlways')); ?>
+	 	<?php echo wpsg_drawForm_Checkbox('wpsg_showArticelnumber', __('Artikelnummer im Produkttemplate anzeigen', 'wpsg'), $this->get_option('wpsg_showArticelnumber')); ?>
+	 	<?php echo wpsg_drawForm_Select('wpsg_form_validation', __('Formular Validierung', 'wpsg'), array(
+	 		'0' => __('Serverseitig', 'wpsg'),
+	 		'1' => __('Serverseitig + Javascript V1', 'wpsg'),
+	 		'2' => __('Serverseitig + Javascript V2', 'wpsg')
+	 	), $this->get_option('wpsg_form_validation')); ?>	
+	 	<?php echo wpsg_drawForm_Checkbox('wpsg_hideBasketCountrySelect', __('LÃ€nderauswahl im Warenkorb verbergen', 'wpsg'), $this->get_option('wpsg_hideBasketCountrySelect')); ?>
+	 		 		 
+	 	<?php $this->callMods('admin_presentation'); ?>
+	 
+		<script type="text/javascript">
 
-<div class="wpsg_admin_content form-horizontal">
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=presentation&noheader=1'); ?>">
+			jQuery(document).ready(function() {
+ 
+				jQuery('.wpsg_form_help').tipTip();
+				
+			} );
 		
-		<?php \wp_nonce_field('wpsg-save-admin-presentation'); ?>
+		</script>
 		
-		<div class="panel panel-default">
-			<div class="panel-heading clearfix">
-				<h3 class="panel-title"><?php echo __('Darstellung', 'wpsg'); ?></h3>
-			</div>
-			<div class="panel-body">
-
-				<?php echo wpsg_drawForm_Select('wpsg_form_validation', __('Formular Validierung', 'wpsg'), array(
-					'0' => __('Serverseitig', 'wpsg'),
-					'1' => __('Serverseitig + Javascript V1', 'wpsg'),
-					'2' => __('Serverseitig + Javascript V2', 'wpsg')
-				), $this->get_option('wpsg_form_validation')); ?>
-
-				<br />
-				
-				<?php echo wpsg_drawForm_Checkbox('wpsg_imagehandler_basketimage', __('Produktbild im Warenkorb anzeigen', 'wpsg'), $this->get_option('wpsg_imagehandler_basketimage'), array('help' => 'wpsg_imagehandler_basketimage')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_imagehandler_overviewimage', __('Produktbild in Bestellzusammenfassung anzeigen', 'wpsg'), $this->get_option('wpsg_imagehandler_overviewimage'), array('help' => 'wpsg_imagehandler_overviewimage')); ?>
-				
-				<br />
-				
-				<?php $this->callMods('admin_presentation'); ?>
-
-				<br />
-				
-				<?php echo wpsg_drawForm_Checkbox('wpsg_showMwstAlways', __('MwSt. Spalte auch bei einem Satz zeigen', 'wpsg'), $this->get_option('wpsg_showMwstAlways'), array('help' => 'wpsg_showMwstAlways')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_showArticelnumber', __('Artikelnummer im Produkttemplate anzeigen', 'wpsg'), $this->get_option('wpsg_showArticelnumber'), array('help' => 'wpsg_showArticelnumber')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_hideBasketCountrySelect', __('LÃ€nderauswahl im Warenkorb verbergen', 'wpsg'), $this->get_option('wpsg_hideBasketCountrySelect'), array('help' => 'wpsg_hideBasketCountrySelect')); ?>
-
-				<br />
-
-				<?php echo wpsg_drawForm_Checkbox('wpsg_alternativeProductDetailDesign', __('Alternatives Design fÃŒr die Produktverwaltung aktivieren', 'wpsg'), $this->get_option('wpsg_alternativeProductDetailDesign'), array('help' => 'wpsg_alternativeProductDetailDesign')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_alternativeOrderDesign', __('Alternatives Design fÃŒr die Bestellansichtsseite aktivieren', 'wpsg'), $this->get_option('wpsg_alternativeOrderDesign'), array('help' => 'wpsg_alternativeOrderDesign')); ?>
-
-			</div>
-		</div>
-
 		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 	
Index: /views/admin/seiten.phtml
===================================================================
--- /views/admin/seiten.phtml	(revision 8528)
+++ /views/admin/seiten.phtml	(revision 5261)
@@ -8,40 +8,34 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
+	</ul>
 			
 </div>
 
-<div class="wpsg_admin_content form-horizontal">
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=seiten&noheader=1'); ?>">	
+<div class="wpsg_admin_content">
+	<div class="wpsg_admin_box">		
+			
+		<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>&amp;noheader=1">
 
-		<?php wp_nonce_field('wpsg-admin-seiten'); ?>
-		
-		<?php echo wpsg_drawForm_AdminboxStart(__('Seitenkonfiguration', 'wpsg')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_page_basket', __('Warenkorbseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_basket')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_page_versand', __('Versandkosten', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_versand')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_page_agb', __('AGB', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_agb')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_page_datenschutz', __('Datenschutz', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_datenschutz')); ?>				
+			<?php echo wpsg_drawForm_Select('wpsg_page_widerrufsbelehrung', __('Widerrufsbelehrung', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_widerrufsbelehrung')); ?>			
+			<?php echo wpsg_drawForm_Input('wpsg_page_onlinedisputeresolution', __('Online Streitbeilegung', 'wpsg'), $this->get_option('wpsg_page_onlinedisputeresolution')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_page_impressum', __('Impressum', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_impressum')); ?>
+				
+			<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 			
-			<?php if ($this->hasMod('wpsg_mod_request') == '1') { ?>
-				<?php echo wpsg_drawForm_Select('wpsg_page_request', __('Anfrageliste', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_request'), array('help' => 'wpsg_page_request')); ?>
-			<?php } ?>
-			
-			<?php echo wpsg_drawForm_Select('wpsg_page_basket', __('Warenkorbseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_basket'), array('help' => 'wpsg_page_basket')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_page_basket_more', __('"Weiter shoppen" - Seite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_basket_more'), array('help' => 'wpsg_page_basket_more')); ?>
-            <?php echo wpsg_drawForm_Select('wpsg_page_product', __('Produktdetailseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_product'), array('help' => 'wpsg_page_product')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_page_versand', __('Versandkosten', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_versand'), array('help' => 'wpsg_page_versand')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_page_agb', __('AGB', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_agb'), array('help' => 'wpsg_page_agb')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_page_datenschutz', __('Datenschutz', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_datenschutz'), array('help' => 'wpsg_page_datenschutz')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_page_widerrufsbelehrung', __('Widerrufsbelehrung', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_widerrufsbelehrung'), array('help' => 'wpsg_page_widerrufsbelehrung')); ?>
-			<?php // echo wpsg_drawForm_Input('wpsg_page_onlinedisputeresolution', __('Online Streitbeilegung', 'wpsg'), $this->get_option('wpsg_page_onlinedisputeresolution'), array('help' => 'wpsg_page_onlinedisputeresolution')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_page_impressum', __('Impressum', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_impressum'), array('help' => 'wpsg_page_impressum')); ?>
-			
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-			
-		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-			
-		
-			
-	</form>	
+		</form>
+				
+	</div>
 </div>
Index: /views/admin/shopdata.phtml
===================================================================
--- /views/admin/shopdata.phtml	(revision 8528)
+++ /views/admin/shopdata.phtml	(revision 5261)
@@ -5,135 +5,56 @@
 	 */
 
-?> 
+?>
+<div class="wpsg_admin_submenu">
+	
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
 
-<div class="wpsg_admin_submenu">
-	 
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div>
+	</ul>
 			
 </div>
 
-<div class="wpsg_admin_content form-horizontal">	
+<div style="padding:0px; margin:0px; float:left;">		
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>&amp;noheader=1">
+  
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_name', __('Name des Shops / Firma', 'wpsg'), $this->get_option('wpsg_shopdata_name'), array('help' => 'wpsg_shopdata_name')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_owner', __('Inhaber des Shops', 'wpsg'), $this->get_option('wpsg_shopdata_owner'), array('help' => 'wpsg_shopdata_owner')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_tel', __('Telefonnummer', 'wpsg'), $this->get_option('wpsg_shopdata_tel'), array('help' => 'wpsg_shopdata_tel')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_fax', __('Faxnummer', 'wpsg'), $this->get_option('wpsg_shopdata_fax'), array('help' => 'wpsg_shopdata_fax')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_email', __('E-Mail', 'wpsg'), $this->get_option('wpsg_shopdata_email'), array('help' => 'wpsg_shopdata_email')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_taxnr', __('Steuernummer', 'wpsg'), $this->get_option('wpsg_shopdata_taxnr'), array('help' => 'wpsg_shopdata_taxnr')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_ustidnr', __('USt-IdNr.', 'wpsg'), $this->get_option('wpsg_shopdata_ustidnr'), array('help' => 'wpsg_shopdata_ustidnr')); ?>		
 		
-		<?php \wp_nonce_field('wpsg-save-admin-shopdata'); ?>
-
-		<?php 
-			$countrys = array();
-			$arCountry = wpsg_country::find();
-			foreach ($arCountry as $oCountry) $countrys[$oCountry->getId()] = $oCountry->getName();
-		?>
+		<h4><?php echo __('Anschrift', 'wpsg'); ?></h4>
 		
-  		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Allgemeine Angaben', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">				
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_name', __('Name des Shops / Firma', 'wpsg'), $this->get_option('wpsg_shopdata_name'), array('help' => 'wpsg_shopdata_name')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_owner', __('Inhaber des Shops', 'wpsg'), $this->get_option('wpsg_shopdata_owner'), array('help' => 'wpsg_shopdata_owner')); ?>
-				<br />
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_tel', __('Telefonnummer', 'wpsg'), $this->get_option('wpsg_shopdata_tel'), array('help' => 'wpsg_shopdata_tel')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_fax', __('Faxnummer', 'wpsg'), $this->get_option('wpsg_shopdata_fax'), array('help' => 'wpsg_shopdata_fax')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_email', __('E-Mail', 'wpsg'), $this->get_option('wpsg_shopdata_email'), array('help' => 'wpsg_shopdata_email')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_taxnr', __('Steuernummer', 'wpsg'), $this->get_option('wpsg_shopdata_taxnr'), array('help' => 'wpsg_shopdata_taxnr')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_ustidnr', __('USt-IdNr.', 'wpsg'), $this->get_option('wpsg_shopdata_ustidnr'), array('help' => 'wpsg_shopdata_ustidnr')); ?>		
-			</div>
-		</div>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_street', __('StraÃe', 'wpsg'), $this->get_option('wpsg_shopdata_street'), array('help' => 'wpsg_shopdata_street')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_zip', __('Postleitzahl', 'wpsg'), $this->get_option('wpsg_shopdata_zip'), array('help' => 'wpsg_shopdata_zip')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_city', __('Ort', 'wpsg'), $this->get_option('wpsg_shopdata_city'), array('help' => 'wpsg_shopdata_city')); ?>
+	
+		<h4><?php echo __('Bankdaten', 'wpsg'); ?></h4>
 		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Anschrift', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_street', __('StraÃe', 'wpsg'), $this->get_option('wpsg_shopdata_street'), array('help' => 'wpsg_shopdata_street')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_zip', __('Postleitzahl', 'wpsg'), $this->get_option('wpsg_shopdata_zip'), array('help' => 'wpsg_shopdata_zip')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_city', __('Ort', 'wpsg'), $this->get_option('wpsg_shopdata_city'), array('help' => 'wpsg_shopdata_city')); ?>		
-				<?php echo wpsg_drawForm_Select('wpsg_shopdata_country', __('Land', 'wpsg'), $countrys, $this->get_option('wpsg_shopdata_country'), array('help' => 'wpsg_shopdata_country')); ?>	
-			</div>
-		</div>
-		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Zweigstelle', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-				<?php echo wpsg_drawForm_Checkbox('wpsg_shopdata_2', __('Zweigstelle vorhanden', 'wpsg'), $this->get_option('wpsg_shopdata_2'), array('help' => 'wpsg_shopdata_2')); ?>
-				<div class="wpsg_shopdata_2_activ" style="display:none;">
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_2_street', __('StraÃe', 'wpsg'), $this->get_option('wpsg_shopdata_2_street')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_2_zip', __('Postleitzahl', 'wpsg'), $this->get_option('wpsg_shopdata_2_zip')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_2_city', __('Ort', 'wpsg'), $this->get_option('wpsg_shopdata_2_city')); ?>		
-					<?php echo wpsg_drawForm_Select('wpsg_shopdata_2_country', __('Land', 'wpsg'), $countrys, $this->get_option('wpsg_shopdata_2_country')); ?>		
-					<br />
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_2_tel', __('Telefon', 'wpsg'), $this->get_option('wpsg_shopdata_2_tel')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_2_fax', __('Fax', 'wpsg'), $this->get_option('wpsg_shopdata_2_fax')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_2_email', __('E-Mail', 'wpsg'), $this->get_option('wpsg_shopdata_2_email')); ?>		
-				</div>
-			</div>
-		</div>
-		
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('Bankdaten', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_name', __('Name der Bank', 'wpsg'), $this->get_option('wpsg_shopdata_bank_name'), array('help' => 'wpsg_shopdata_bank_name')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_owner', __('Kontoinhaber', 'wpsg'), $this->get_option('wpsg_shopdata_bank_owner'), array('help' => 'wpsg_shopdata_bank_owner')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_iban', __('IBAN Nummer', 'wpsg'), $this->get_option('wpsg_shopdata_bank_iban'), array('help' => 'wpsg_shopdata_bank_iban')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_bic', __('BIC Nummer', 'wpsg'), $this->get_option('wpsg_shopdata_bank_bic'), array('help' => 'wpsg_shopdata_bank_bic')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_qriban', __('QR-IBAN Nummer', 'wpsg'), $this->get_option('wpsg_shopdata_bank_qriban'), array('help' => 'wpsg_shopdata_bank_qriban')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_besr', __('BESR-ID', 'wpsg'), $this->get_option('wpsg_shopdata_bank_besr'), array('help' => 'wpsg_shopdata_bank_besr')); ?>
-			</div>
-		</div>
-		
-		<div class="panel panel-default">
-			<div class="panel-heading clearfix">
-				<h3 class="panel-title"><?php echo __('EU-Vertreter', 'wpsg'); ?></h3>
-			</div>
-			<div class="panel-body">	
-				<?php echo wpsg_drawForm_Checkbox('wpsg_shopdata_3', __('EU-Vertreter vorhanden', 'wpsg'), $this->get_option('wpsg_shopdata_3'), array('help' => 'wpsg_shopdata_3')); ?>
-				<div class="wpsg_shopdata_3_activ" style="display:none;">
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_name', __('Name des EU-Vertreters', 'wpsg'), $this->get_option('wpsg_shopdata_eu_name')); ?>
-					<br />
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_street', __('StraÃe', 'wpsg'), $this->get_option('wpsg_shopdata_eu_street')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_zip', __('Postleitzahl', 'wpsg'), $this->get_option('wpsg_shopdata_eu_zip')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_city', __('Stadt', 'wpsg'), $this->get_option('wpsg_shopdata_eu_city')); ?>
-					<?php echo wpsg_drawForm_Select('wpsg_shopdata_eu_country', __('Land', 'wpsg'), $countrys, $this->get_option('wpsg_shopdata_eu_country')); ?>
-					<br />				
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_tel', __('Telefonnummer', 'wpsg'), $this->get_option('wpsg_shopdata_eu_tel')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_fax', __('Faxnummer', 'wpsg'), $this->get_option('wpsg_shopdata_eu_fax')); ?>
-					<?php echo wpsg_drawForm_Input('wpsg_shopdata_eu_email', __('E-Mail', 'wpsg'), $this->get_option('wpsg_shopdata_eu_email')); ?>
-				</div>
-			</div>
-		</div>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_name', __('Name der Bank', 'wpsg'), $this->get_option('wpsg_shopdata_bank_name'), array('help' => 'wpsg_shopdata_bank_name')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_owner', __('Kontoinhaber', 'wpsg'), $this->get_option('wpsg_shopdata_bank_owner'), array('help' => 'wpsg_shopdata_bank_owner')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_iban', __('IBAN Nummer', 'wpsg'), $this->get_option('wpsg_shopdata_bank_iban'), array('help' => 'wpsg_shopdata_bank_iban')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_shopdata_bank_bic', __('BIC Nummer', 'wpsg'), $this->get_option('wpsg_shopdata_bank_bic'), array('help' => 'wpsg_shopdata_bank_bic')); ?>
 	
 		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
 		
-		<script type="text/javascript">/* <![CDATA[ */
- 
-			jQuery(document).ready(function() {
+  	</form>
+</div>
 
-				jQuery('#wpsg_shopdata_2').bind('change', function() {
+<script type="text/javascript">/* <![CDATA[ */
 
-					if (jQuery(this).is(':checked')) jQuery('.wpsg_shopdata_2_activ').show();
-					else jQuery('.wpsg_shopdata_2_activ').hide();
-					
-				} ).change();
-				
-				jQuery('#wpsg_shopdata_3').bind('change', function() {
+	jQuery(document).ready(function() {
+	
+		jQuery('.wpsg_form_help').tipTip();
+		
+	} );
 
-					if (jQuery(this).is(':checked')) jQuery('.wpsg_shopdata_3_activ').show();
-					else jQuery('.wpsg_shopdata_3_activ').hide();
-
-				} ).change();
-
-			} );
-		
-		/* ]]> */</script>
-		
-  	</form>
-  	
-</div>
+/* ]]> */</script>
Index: /views/admin/ueber.phtml
===================================================================
--- /views/admin/ueber.phtml	(revision 8528)
+++ /views/admin/ueber.phtml	(revision 5261)
@@ -6,229 +6,67 @@
 
 ?>
+<h2><?php echo __('Systemcheck', 'wpsg'); ?></h2>
 
-<div id="wpsg-bs" >
-	<div class="wpsg_admin_submenu" >
-
-		<div class="list-group" id="wpsg_statistics_tabs">
-			<span class="list-group-head list-group-item"><?php echo __('Auswahl', 'wpsg'); ?></span>
-
-				<a class="list-group-item <?php echo ((!isset($_REQUEST['subaction']))?'active':''); ?>"
-				href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber'); ?>"><?php echo __('Ãber diese Installation', 'wpsg'); ?></a>
-
-				<a class="list-group-item <?php echo ((isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'phpinfo')?'active':''); ?>"
-				href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=phpinfo'); ?>"><?php echo __('PHP-Info', 'wpsg'); ?></a>
-
-				<a class="list-group-item <?php echo ((isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'systemcheck')?'active':''); ?>"
-				href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=systemcheck'); ?>"><?php echo __('Systemcheck', 'wpsg'); ?></a>
-
-				<a class="list-group-item <?php echo ((isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'systemlog')?'active':''); ?>"
-				href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=systemlog'); ?>"><?php echo __('Fehlerprotokoll', 'wpsg'); ?></a>
-			
-				<a class="list-group-item <?php echo ((isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'updatelog')?'active':''); ?>"
-				href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=updatelog'); ?>"><?php echo __('Updateprotokoll', 'wpsg'); ?></a>
-
-		</div>
-
-		<div style="clear:both; margin-bottom:10px; margin-left:0px; margin-right:8px;"></div>
-
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<?php echo __('Template Pfad:', 'wpsg'); ?>
 	</div>
+	<div class="wpsg_form_right">
+		<?php echo WPSG_PATH_USERVIEW; ?>
+	</div>
+	<div class="wpsg_clear"></div>
 </div>
 
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<?php echo __('Sprachdatei:', 'wpsg'); ?>
+	</div>
+	<div class="wpsg_form_right">
+		 <?php echo WPSG_PATH_TRANSLATION; ?>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
+		
+<h2><?php echo __("ÃŒber diese Installation", "wpsg"); ?></h2>
+	
+<?php 
 
-<div class="wpsg_admin_content">
+$arModule = array();
+foreach ($this->arModule as $m_key => $m)
+{
 
+	$arModule[] = $m_key.((isset($m->version))?' '.$m->version:'');
 
-<?php if (!isset($_REQUEST['subaction'])) { ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Ãber diese Installation', 'wpsg')); ?>
+}
 
-	<div class="form-horizontal">
+?>
+	
+<?php echo wpsg_drawForm_Input('', __('wpShopGermany Version', 'wpsg'), WPSG_VERSION, array('text' => true)); ?>
+<?php echo wpsg_drawForm_Input('', __('aktivierte wpShopGermany-Module', 'wpsg'), implode(', ', $arModule), array('text' => true)); ?>
+<?php echo wpsg_drawForm_Input('', __('WordPress Version', 'wpsg'), get_bloginfo('version'), array('text' => true)); ?>
+<?php echo wpsg_drawForm_Input('', __('PHP Version', 'wpsg'), phpversion(), array('text' => true)); ?>
+<?php echo wpsg_drawForm_Input('', __('php.ini Einstellungen', 'wpsg'), "post_max_size: ". ini_get('post_max_size') . "<br />". "max_input_time: ". ini_get('max_input_time') . "<br />". "max_execution_time: ". ini_get('max_execution_time') . "<br />". "max_input_vars: ". ini_get('max_input_vars') . "<br />". "upload_max_filesize: ". ini_get('upload_max_filesize') . "<br />". "register_globals: ". ini_get('register_globals') . "<br />". "memory_limit: ". ini_get('memory_limit') . "<br />". "safe_mode: ". ini_get('safe_mode') . "<br />". "include_path: ". ini_get('include_path') . "<br />". "soap.wsdl_cache: ". ini_get('soap.wsdl_cache') . "<br />", array('text' => true, 'nohspc' => true)); ?>
+<?php echo wpsg_drawForm_Input('', __('geladene PHP Erweiterungen', 'wpsg'), implode(', ',  get_loaded_extensions()), array('text' => true)); ?>
 
-	<?php
-	$arModule = array();
-	foreach ($this->arModule as $m_key => $m)
-	{
-
-		$arModule[] = $m_key.((isset($m->version))?' '.$m->version:'');
-
-	}
-	?>
-	<?php 
-	$t1 = ini_get('register_globals');
-	$t2 = ini_get('safe_mode');
-	$t3 = ini_get('max_execution_time');
-	
-	?>
-
-	<?php echo wpsg_drawForm_Text(__('wpShopGermany Version', 'wpsg'), WPSG_VERSION, array('text' => true)); ?>
-	<?php echo wpsg_drawForm_Text(__('aktivierte wpShopGermany-Module', 'wpsg'), implode(', ', $arModule), array('text' => true)); ?>
-	<?php echo wpsg_drawForm_Text(__('WordPress Version', 'wpsg'), get_bloginfo('version'), array('text' => true)); ?>
-	<?php echo wpsg_drawForm_Text(__('PHP Version', 'wpsg'), phpversion(), array('text' => true)); ?>
-	<?php echo wpsg_drawForm_Text(__('php.ini Einstellungen', 'wpsg'), "post_max_size: ". ini_get('post_max_size') . "<br />". "max_input_time: ". ini_get('max_input_time') . "<br />". "max_execution_time: ". ini_get('max_execution_time') . "<br />". "max_input_vars: ". ini_get('max_input_vars') . "<br />". "upload_max_filesize: ". ini_get('upload_max_filesize') . "<br />". "register_globals: ". ini_get('register_globals') . "<br />". "memory_limit: ". ini_get('memory_limit') . "<br />". "safe_mode: ". ini_get('safe_mode') . "<br />". "include_path: ". ini_get('include_path') . "<br />". "soap.wsdl_cache: ". ini_get('soap.wsdl_cache') . "<br />", array('text' => true, 'nohspc' => true)); ?>
-	<?php echo wpsg_drawForm_Text(__('geladene PHP Erweiterungen', 'wpsg'), implode(', ',  get_loaded_extensions()), array('text' => true)); ?>
-
-	<?php wpsg_drawForm_TextStart(); ?>
-			<?php $arPlugins = $this->get_option('active_plugins'); ?>
-				<?php foreach ((array)$arPlugins as $plugin) { $plugin_data = get_plugin_data(WPSG_PATH_CONTENT.'plugins/'.$plugin); ?>
-				<?php echo $plugin_data['Name']; ?> / <?php echo $plugin_data['Version']; ?><br />
-				<?php } ?>
-
-	<?php echo wpsg_drawForm_TextEnd(__('aktive Wordpress Plugins', 'wpsg')); ?>
-
-	<?php wpsg_drawForm_TextStart(); ?>
-				<?php if (wpsg_isSizedArray($this->get_option('wpsg_plugintest_active_plugins'))) { ?>
-				<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=plugintest_restore&noheader=1'; ?>"><?php echo __('Vormals aktivierte Module wieder herstellen aus KompatibilitÃ€tstest', 'wpsg'); ?></a>
-				<?php } else { ?>
-				<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=plugintest_disable&noheader=1'; ?>"><?php echo __('Alle Plugins auÃer wpShopGermany deaktivieren (KompatibilitÃ€tstest)', 'wpsg'); ?></a>
-				<?php } ?>
-	<?php echo wpsg_drawForm_TextEnd(); ?>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for=""><?php echo __('aktive Wordpress Plugins', 'wpsg'); ?>:</label>
 	</div>
-
-	<div class="form-horizontal">
-
-		<?php wpsg_drawForm_TextStart(); ?>
-		<?php echo WPSG_PATH_USERVIEW; ?>
-		<?php echo wpsg_drawForm_TextEnd(__('Template Pfad fÃŒr Anpassungen', 'wpsg')); ?>
-
-		<?php wpsg_drawForm_TextStart(); ?>
-		<?php echo WPSG_PATH_TRANSLATION; ?>
-		<?php echo wpsg_drawForm_TextEnd(__('Sprachdatei', 'wpsg')); ?>
-
-		<?php if ($this->get_option('wpsg_ignoreuserview') != '1') { ?>
-
-			<?php $arProductTemplates = $this->loadProduktTemplates(false, true, true); ?>
-
-			<?php $arFiles = wpsg_rglob(WPSG_PATH_VIEW.'*.phtml'); $arFiles = array_merge($arFiles, $arProductTemplates); ?>
-			<?php foreach ($arFiles as $k => $f) { $render_file = realpath($this->getTemplatefile($f)); if (!is_file($render_file) || realpath($f) == $render_file) { unset($arFiles[$k]); } else { $arFiles[$k] = $render_file; } } $arFiles = array_unique($arFiles); asort($arFiles); ?>
-
-			<?php if (wpsg_isSizedArray($arFiles)) { ?>
-				<div class="form-group-sm form-group">
-					<div class="form-control-static">
-
-						<label style="font-weight:bold;"><?php echo __('Angepasste Templates', 'wpsg'); ?></label><br /><br />
-
-						<?php foreach($arFiles as $render_file) { ?>
-
-							<?php echo str_replace(realpath(WPSG_PATH_WP), '', $render_file); ?><br />
-
-						<?php } ?>
-
-					</div>
-				</div>
+	<div class="wpsg_form_right">
+		<?php $arPlugins = $this->get_option('active_plugins'); ?>
+		<p>
+			<?php foreach ((array)$arPlugins as $plugin) { $plugin_data = get_plugin_data(WPSG_PATH_CONTENT.'plugins/'.$plugin); ?>
+			<?php echo $plugin_data['Name']; ?> / <?php echo $plugin_data['Version']; ?><br />
 			<?php } ?>
-
-		<?php } ?>
-
+		</p>
+		<br />
+		<p>
+			<?php if (wpsg_isSizedArray($this->get_option('wpsg_plugintest_active_plugins'))) { ?>
+			<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=plugintest_restore&noheader=1'; ?>"><?php echo __('Vormals aktivierte Module wieder herstellen aus KompatibilitÃ€tstest', 'wpsg'); ?></a>
+			<?php } else { ?>
+			<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=plugintest_disable&noheader=1'; ?>"><?php echo __('Alle Plugins auÃer wpShopGermany deaktivieren (KompatibilitÃ€tstest)', 'wpsg'); ?></a>
+			<?php } ?>
+		</p>
 	</div>
-
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
-
-<?php if (isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'updatelog') {
-	
-	try { $wpsg_update_log = json_decode($this->get_option('wpsg_update_log'), true); } catch (\Throwable $e) { $wpsg_update_log = []; }
-		
-	?>
-
-	<?php foreach ($wpsg_update_log as $log_index => $log) { ?>
-	
-		<?php echo wpsg_drawForm_AdminboxStart(
-			wpsg_translate(__('Update vom #1# : #2# -> #3#', 'wpsg'), ($log['time']??''), ($log['pre']['version']??''), ($log['after']['version']??'')),
-			'wpsg_update_log_'.$log_index,
-			[
-				'collapsed' => true,
-				'collapsable' => true
-			]
-		); ?>
-	
-		<pre><?php print_r($log); ?></pre>
-
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-	
-	<?php } ?>
-	
-<?php } ?>
-
-<?php if (isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'systemlog') { ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Fehlerprotokoll', 'wpsg'), '', array('style' => 'width:905px;')); ?>
-
-	<?php if (!file_exists($GLOBALS['wpsg_sc']->getStorageRoot().'exception.log')) { ?>
-		<p><?php echo __('Es wurden noch keine Systemfehler aufgezeichnet.', 'wpsg'); ?></p>
-	<?php } else { ?>
-
-		<textarea style="width:875px; overflow-y:scroll; height:500px; font-size:12px; font-family:Courier;"><?php echo file_get_contents($GLOBALS['wpsg_sc']->getStorageRoot().'exception.log'); ?></textarea>
-
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=ueber&subaction=clearSysLog&noheader=1" class="button"><?php echo __('Protokolldatei lÃ¶schen', 'wpsg'); ?></a>
-
-	<?php } ?>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
-
-<?php if (isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'phpinfo') { ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('PHP-Info', 'wpsg')); ?>
-	<div id="phpinfo" class="form-horizontal">
-		
-		<style>
-
-			#phpinfo {background-color: #fff; color: #222; font-family: sans-serif;}
-			#phpinfo pre {margin: 0; font-family: monospace;}
-			#phpinfo a:link {color: #009; text-decoration: none; background-color: #fff;}
-			#phpinfo a:hover {text-decoration: underline;}
-			#phpinfo table {border-collapse: collapse; border: 0; width:750px; box-shadow: 1px 2px 3px #ccc;}
-			#phpinfo .center {text-align: center;}
-			#phpinfo .center table {margin: 1em auto; text-align: left;}
-			#phpinfo .center th {text-align: center !important;}
-			#phpinfo td, #phpinfo th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;}
-			#phpinfo h1 {font-size: 150%;}
-			#phpinfo h2 {font-size: 125%;}
-			#phpinfo .p {text-align: left;}
-			#phpinfo .e {background-color: #ccf; width: 300px; font-weight: bold;}
-			#phpinfo .h {background-color: #99c; font-weight: bold;}
-			#phpinfo .v {background-color: #ddd; max-width: 300px; overflow-x: auto; word-wrap: break-word;}
-			#phpinfo .v i {color: #999;}
-			#phpinfo img {float: right; border: 0;}
-			#phpinfo hr {width: 534px; background-color: #ccc; border: 0; height: 1px;}
-			
-		</style>
-		
-		<?php 
-		
-			ob_start(); 	
-			phpinfo(); $pi = ob_get_contents();
-			ob_end_clean();
-			
-			$pi = preg_replace('/<style(.*)<\/style>/is', '', $pi);
-						
-			echo $pi;
-			 			
-		?>
-		
-	</div>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
-
-
-<?php if (isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'systemcheck') { ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Systemcheck', 'wpsg')); ?>
-
-	<a class="button" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=resetMessages&noheader=1"><?php echo __('Ausgeblendete Meldungen zurÃŒcksetzen', 'wpsg'); ?></a>
-
-	<?php $arData = $this->systemcheck(); ?>
-	<?php if (wpsg_isSizedArray($arData)) { ?>
-		<div class="wpsg_admin_ueber_check_wrap">
-			<?php foreach ($arData as $d) { ?>
-				<p class="wpsg_admin_ueber_check wpsg_admin_ueber_check_<?php echo $d[1]; ?> <?php echo array('bg-info', 'bg-warning', 'bg-danger')[$d[1] - 1]; ?>">
-					<?php echo $d[2]; ?>
-				</p>
-			<?php } ?>
-		</div>
-	<?php } else { ?>
-
-	<?php } ?>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
-
-
+	<div class="wpsg_clear"></div>
 </div>
Index: /views/admin/versandzonen.phtml
===================================================================
--- /views/admin/versandzonen.phtml	(revision 8528)
+++ /views/admin/versandzonen.phtml	(revision 5261)
@@ -6,46 +6,16 @@
 
 ?>
-
-<div class="wpsg_admin_submenu">
-	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
-		<?php } ?>
-	</div> 
-			
-</div>
-
-<div class="wpsg_admin_content form-horizontal">
-	
-	<?php echo wpsg_drawForm_AdminboxStart(__('Versandzonen', 'wpsg')); ?>
-	
-		<span id="wpsg_vz_list"><?php $this->view['adminController']->vz_listAction(); ?></span>
-	
-		<a href="#" onclick="return wpsg_addVZ();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neue Versandzone anlegen.', 'wpsg'); ?></a><br />
-	    <br />
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur LÃ€nderverwaltung', 'wpsg'); ?></a>
-	
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-	
-</div>
-
-<script>
+<script type="text/javascript">
 
 	/**
-	 * Wird aufgerufen um einen neuen Satz hinzu zufÃŒgen und die Liste neu zu laden.
+	 * Wird aufgerufen um einen neuen Satz hinzuzufÃŒgen und die Liste neu zu lasen.
 	 */
 	function wpsg_addVZ()
 	{
 
-		jQuery('#wpsg_vz_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" /><br />');
+		jQuery('#wpsg_vz_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
 		
 		jQuery.ajax( {
-			url: '<?php 
-				
-				echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=add&noheader=1', 'wpsg-admin-versandzonen-add'));
-				
-			?>',
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=add&noheader=1',
 			success: function(data) {
 				jQuery('#wpsg_vz_list').html(data);
@@ -63,14 +33,10 @@
 	{
 
-		if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese Versandzone lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie diese Versandzone lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
 
-		jQuery('#wpsg_vz_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" /><br />');
+		jQuery('#wpsg_vz_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
 		
 		jQuery.ajax( {
-			url: '<?php 
-				
-				echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=remove&noheader=1', 'wpsg-admin-versandzonen-delete'));
-				
-			?>',
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=remove&noheader=1',
 			data: {
 				vz_id: vz_id
@@ -85,6 +51,6 @@
 	} // function wpsg_removeVZ(vz_id)
 
-	function wpsg_editPLZ(vz_id) {
-		
+	function wpsg_editPLZ(vz_id)
+	{
 		jQuery('#vz_' + vz_id + '_plz').attr('style', 'display:display');
 
@@ -92,12 +58,9 @@
 	}
 
-	function wpsg_savePLZ(vz_id) {
+	function wpsg_savePLZ(vz_id)
+	{
 	
 		jQuery.ajax( {
-			url: '<?php 
-				
-				echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=save_plz&noheader=1', 'wpsg-admin-versandzonen-save_plz'));
-				
-			?>',
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=save_plz&noheader=1',
 			data: {
 				vz_id: vz_id,
@@ -113,5 +76,6 @@
 	}
 
-	function wpsg_loadStandard() {
+	function wpsg_loadStandard()
+	{
 
 		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie die Standard Versandzonen und LÃ€nder laden mÃ¶chten? Die alten Versandzonen und LÃ€nder gehen verloren.', 'wpsg'); ?>')) return false;
@@ -120,9 +84,5 @@
 
 		jQuery.ajax( {
-			url: '<?php 
-				
-				echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=loadStandard&noheader=1', 'wpsg-admin-versandzonen-loadStandard'));
-			
-			?>',
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=loadStandard&noheader=1',
 			success: function(data) {
 				jQuery('#wpsg_vz_list').html(data);
@@ -135,2 +95,36 @@
 	
 </script>
+
+<div class="wpsg_admin_submenu">
+	
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
+		<?php } ?>
+	</ul>
+			
+</div>
+
+<div class="wpsg_admin_content">
+	
+	<div class="wpsg_admin_box">		
+			  		
+		<div class="head">
+			<div class="title">
+				<div class="fulltab">
+					<?php echo __('Versandzonen', 'wpsg'); ?>
+					<a title="<?php echo __('Neue Versandzone anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addVZ();"></a>
+				</div>
+			</div>
+		</div>
+		<div class="content">
+			<span id="wpsg_vz_list"><?php $this->view['adminController']->vz_listAction(); ?></span>
+		</div>
+				
+	</div>
+</div>
Index: /views/admin/versandzonen_list.phtml
===================================================================
--- /views/admin/versandzonen_list.phtml	(revision 8528)
+++ /views/admin/versandzonen_list.phtml	(revision 5261)
@@ -5,35 +5,14 @@
 	 */
 
-    $arShipping = $this->arShippingAll;
-        
-    $arShippingPreset = [
-        '0' => __('Kundenvoreinstellung', 'wpsg'),
-        '-1' => __('gÃŒnstigste Versandart', 'wpsg'),
-    ]; 
-    
-    foreach ($arShipping as $s_key => $s) {
-        
-        if (intval($s['deleted']??'') !== 1 && intval($s['active']??'') === 1) {
-        
-            $arShippingPreset[$s_key] = $s['name'];
-
-        }
-        
-    }
-    
 ?>
 <?php if (!is_array($this->view['data']) || sizeof($this->view['data']) <= 0) { ?>
 <?php echo __('Bisher keine Versandzonen hinterlegt.', 'wpsg'); ?>
 <?php } else { ?>
-<table class="table wpsg_table_vz">
-	<thead>
+<table class="wpsg_admin_vz_list wpsg_admin_table">
 	<tr>
 		<th class="col_name"><?php echo __('Bezeichnung', 'wpsg'); ?></th>
 		<th class="col_innereu"><?php echo __('Inner- gemeinschaftlich', 'wpsg'); ?></th>
-		<th class="col_shippingpreset"><?php echo __('Standardversandart', 'wpsg'); ?></th>
 		<th class="col_aktion"></th>
 	</tr>
-	</thead>
-	<tbody>
 	<?php foreach ($this->view['data'] as $vz) { ?>
 	<tr>
@@ -41,54 +20,26 @@
 			<span  id="vz_<?php echo $vz['id']; ?>_name" ><?php echo wpsg_hspc($vz['name']); ?></span> 
 			<br />
-			<div id="vz_<?php echo $vz['id']; ?>_plz" style="display:none" class="wpsg_plz_div">
-				<textarea><?php echo wpsg_hspc($vz['param']); ?></textarea>
-				<input type="submit" class="button" name="wpsg_mod_vz_submitsave" value="<?php echo __('Speichern', 'wpsg'); ?>" onclick="return wpsg_savePLZ(<?php echo $vz['id']; ?>);" />
+			<?php if (!empty($vz['param'])) { $arPLZ = unserialize($vz['param']); } ?>
+			<div id="vz_<?php echo $vz['id']; ?>_plz" style="display:none">
+				<textarea style="float:left; width:100%;"><?php echo wpsg_hspc($vz['param']); ?></textarea>
+				<input style="width:75px;" class="" type="submit" name="wpsg_mod_vz_submitsave" value="<?php echo __('Speichern', 'wpsg'); ?>" onclick="return wpsg_savePLZ(<?php echo $vz['id']; ?>);" />
 			</div>
 		</td>
 		<td class="col_innereu">		 
-			<input class="wpsg_innereu"
-                data-url="<?php echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1', 'wpsg-admin-versandzonen-inline_edit-'.$vz['id'])); ?>"
-                <?php echo (($vz['innereu'] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" name="innereu_<?php echo $vz['id']; ?>" id="innereu_<?php echo $vz['id']; ?>" />
+			<input class="wpsg_innereu" <?php echo (($vz['innereu'] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" name="innereu_<?php echo $vz['id']; ?>" id="innereu_<?php echo $vz['id']; ?>" />								
 		</td>
-        <td class="col_shippingpreset">
-            <span id="vz_<?php echo $vz['id']; ?>_shippingpreset"><?php echo ($arShippingPreset[($vz['shippingpreset']??'')]??''); ?></span>
-            <script>
-                
-                jQuery('#vz_<?php echo $vz['id']; ?>_shippingpreset').wpsg_editable('<?php
-					
-						echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1', 'wpsg-admin-versandzonen-inline_edit-'.$vz['id']));
-					
-					?>', {
-					submitdata: { 
-			    		field: 'shippingpreset',
-			    		vz_id: '<?php echo $vz['id']; ?>'
-					}, 				
-                    data: <?php echo wpsg_prepare_for_inlineEdit($arShippingPreset); ?>,               
-                    type: 'select',
-					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                });
-                
-            </script>
-        </td>
 		<td class="col_aktion">
-						
-			<a class="wpsg_icon_plzedit" href="#" title="<?php echo __('Versandzonen PLZ bearbeiten', 'wpsg'); ?>" onclick="return wpsg_editPLZ(<?php echo $vz['id']; ?>);">[ PLZ ]</a>
-			<a class="glyphicon glyphicon-trash" href="#" title="<?php echo __('Versandzone lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeVZ(<?php echo $vz['id']; ?>);"></a>
 			
-			<script>
+			<a class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Versandzone lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeVZ(<?php echo $vz['id']; ?>);"></a>			
+			<span><a class="wpsg_icon wpsg_icon_right wpsg_icon_plzedit" href="#" title="<?php echo __('Versandzonen PLZ bearbeiten', 'wpsg'); ?>" onclick="return wpsg_editPLZ(<?php echo $vz['id']; ?>);"></a></span>
+			
+			<script type="text/javascript">/* <![CDATA[ */
 
-				jQuery('#vz_<?php echo $vz['id']; ?>_name').wpsg_editable('<?php
-					
-						echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1', 'wpsg-admin-versandzonen-inline_edit-'.$vz['id']));
-					
-					?>', {
+				jQuery('#vz_<?php echo $vz['id']; ?>_name').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1', {
 					submitdata: { 
 			    		field: 'name',
 			    		vz_id: '<?php echo $vz['id']; ?>'
 					}, 					
-					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
 					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
 					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
@@ -96,14 +47,10 @@
 				});
 			
-				jQuery('#vz_<?php echo $vz['id']; ?>_value').wpsg_editable('<?php 
-					
-						echo html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1', 'wpsg-admin-versandzonen-inline_edit-'.$vz['id'])); 
-										
-					?>', {
+				jQuery('#vz_<?php echo $vz['id']; ?>_value').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1', {
 					submitdata: { 
 			    		field: 'value',
 			    		vz_id: '<?php echo $vz['id']; ?>'
 					}, 					
-					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
 					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
 					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
@@ -111,9 +58,8 @@
 				});
 
-			</script>
+				/* ]]> */</script>		
 		</td>
 	</tr>
 	<?php } ?>
-	</tbody>
 </table>
 
@@ -127,5 +73,5 @@
 
 			jQuery.ajax( {
-				url: jQuery(this).data('url'),
+				url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=vz&do=inlinedit&noheader=1',
 				data: {
 					field: 'innereu',
Index: /views/admin/widerrufsbelehrung.phtml
===================================================================
--- /views/admin/widerrufsbelehrung.phtml	(revision 8528)
+++ /views/admin/widerrufsbelehrung.phtml	(revision 5261)
@@ -8,55 +8,52 @@
 <div class="wpsg_admin_submenu">
 	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
+	<div class="head">
+		<div class="title"><?php echo __("Einstellungen", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		
+		<li class="<?php echo (($k == $this->view['subAction'])?'current':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a></li>
 		<?php } ?>
-	</div> 
+	</ul>
 			
 </div>
 
-<div class="wpsg_admin_content form-horizontal">
+<div style="padding:0px; margin:0px; float:left;">		
 	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $_REQUEST['subaction']; ?>&amp;noheader=1">
-
-        <?php \wp_nonce_field('wpsg-save-revocation'); ?>
-        
-		<?php echo wpsg_drawForm_AdminboxStart(__('Widerruf', 'wpsg')); ?>
-			 
+  
+  		<div class="wpsg_widerrufstext">
+			
 			<?php echo wpsg_drawForm_Textarea('wpsg_ps_mailwiderruf', __('Widerrufsbelehrung', 'wpsg'), $this->get_option('wpsg_ps_mailwiderruf'), array(
 				'hint' => 'nohspc_'.__('Dieser Text wird in die Mail eingebunden, die der Kunde als BestellbestÃ€tigung erhÃ€lt.', 'wpsg').'<br />'.__('Das Template fÃŒr die Mail finden Sie unter: <b>views/mailtemplates/kundenmail.phtml</b> bzw. <b>views/mailtemplates/html/kundenmail.phtml</b>.', 'wpsg')
-			)); ?>							
+			)); ?>
+							
 			<?php echo wpsg_drawForm_Upload('wpsg_widerrufsformular', __('Widerrufsformular', 'wpsg')); ?>
-
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			<?php if (wpsg_isSizedString($this->view['revocationform'])) { ?>
+						
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">&nbsp;</div>
+				<div class="wpsg_form_right">
+	
+					<?php if (wpsg_isSizedString($this->view['revocationform'])) { ?>
+					
+						<a target="_blank" href="<?php echo WPSG_URL_UPLOADS.'wpsg_revocation/'.$this->get_option('wpsg_revocationform'); ?>"><?php echo $this->view['revocationform']; ?></a>
+						<a onclick="if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie das Widerrufsformular lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;" style="float:right;" href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung&noheader=1&do=removeWiderrufsformular'; ?>"><?php echo __('Widerrufsformular lÃ¶schen', 'wpsg'); ?></a>
+					
+					<?php } else { ?>
+					
+						<p><?php echo __('Bisher wurde kein Widerrufsformular hinterlegt.', 'wpsg'); ?></p>
+					
+					<?php } ?>
+					
+					<div style="clear:both;"><br />
+					
+					<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung&noheader=1&do=generateWiderrufsformular'; ?>" class="button"><?php echo __('Standardformular aus Shopinfo erstellen', 'wpsg'); ?></a>
+					<br /><br />
+					
+				</div>
+				<div class="wpsg_clear"></div>
+			</div> 
 			
-				<a target="_blank" href="<?php 
-					
-					echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php/?page=wpsg-Admin&subaction=widerrufsbelehrung&download&noheader=1', 'wpsg-admin-widerrufsbelehrung-download');
-
-				?>"><?php echo $this->view['revocationform']; ?></a>
-				<a onclick="if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie das Widerrufsformular lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;" style="float:right;" href="<?php 
-					
-					echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung&noheader=1&do=removeWiderrufsformular', 'wpsg-admin-widerrufsbelehrung-delete'); 
-					
-				?>"><?php echo __('Widerrufsformular lÃ¶schen', 'wpsg'); ?></a>
-			
-			<?php } else { ?>
-			
-				<p><?php echo __('Bisher wurde kein Widerrufsformular hinterlegt.', 'wpsg'); ?></p>
-			
-			<?php } ?>
-			
-			<br /><br />
-			<a href="<?php 
-				
-				echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=widerrufsbelehrung&noheader=1&do=generateWiderrufsformular', 'wpsg-admin-widerrufsbelehrung-generate'); 
-				
-			?>" class="button"><?php echo __('Standardformular aus Shopinfo erstellen', 'wpsg'); ?></a>
-			<br /><br />
-			
-			<?php echo wpsg_drawForm_TextEnd(); ?>
-		
 			<?php echo wpsg_drawForm_Checkbox('wpsg_widerrufsformular_kundenmail', __('Anhang an BestellbestÃ€tigung', 'wpsg'), $this->get_option('wpsg_widerrufsformular_kundenmail')); ?>
 			
@@ -68,9 +65,9 @@
 			<?php echo wpsg_drawForm_Checkbox('wpsg_widerrufsformular_orderconfirm', __('Anhang an AuftragsbestÃ€tigung', 'wpsg'), $this->get_option('wpsg_widerrufsformular_orderconfirm')); ?>
 			<?php } ?>
-					 
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
+			 
+		</div>
+			
 		<p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
-
+			
 	</form>
 </div>
Index: ews/admin/wpml.phtml
===================================================================
--- /views/admin/wpml.phtml	(revision 8528)
+++ 	(revision )
@@ -1,48 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 01.06.2017
-     * Time: 13:53
-     */
-
-    namespace wpsg;
-
-?>
-
-<div class="wpsg_admin_submenu">
-	
-	<div class="list-group">
-		<span class="list-group-head list-group-item"><?php echo __('Konfiguration'); ?></span>		
-		<?php foreach ($this->view['arSubAction'] as $k => $v) { ?>		 
-		<a class="list-group-item <?php echo (($k == $this->view['subAction'])?'active':''); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=<?php echo $k; ?>"><?php echo $v['Menutext']; ?></a>		
-		<?php } ?>
-	</div> 
-	
-</div>
-		
-<div class="wpsg_admin_content form-horizontal">
-	<form name="form1" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=wpml&noheader=1'); ?>">
-	
-		<div class="panel panel-default">
-  			<div class="panel-heading clearfix">
-          		<h3 class="panel-title"><?php echo __('WPML Einstellungen', 'wpsg'); ?></h3>
-        	</div>
-  			<div class="panel-body">
-                
-                <?php /* ?>
-                <?php echo wpsg_drawForm_Checkbox('clear', __('Nicht verwendete String-Ãbersetzungen entfernen', 'wpsg'), false, array('fullWidth' => true)); ?>
-                
-                <br /> */ ?>
-				
-				<p class="info"><?php echo __('FÃŒgt dynamische Inhalte wie LÃ€ndernamen, Namen von Varianten etc. zu den String-Ãbersetzungen von WPML hinzu und ermÃ¶glicht unter WPML -> String-Ãbersetzung die Ãbersetzung von diesen Inhalten.', 'wpsg'); ?></p>
-                
-                <input type="submit" name="wpsg_set_string_translation" class="button" value="<?php echo __('String-Ãbersetzung fÃŒllen'); ?>" />
-                                
-            </div>
-        </div>
-        
-    </form>
-</div>
-            
-                
Index: /views/css/admin.css
===================================================================
--- /views/css/admin.css	(revision 8528)
+++ /views/css/admin.css	(revision 5261)
@@ -1,484 +1,499 @@
-/* Datepicker */
-.ui-datepicker .ui-datepicker-calendar td a,.ui-datepicker a,.ui-datepicker a:hover{text-decoration:none}.ui-datepicker{background-color:#fff;border:1px solid #66AFE9;border-radius:4px;box-shadow:0 0 8px rgba(102,175,233,.6);display:none;margin-top:4px;padding:10px;width:240px}.ui-datepicker a:hover,.ui-datepicker td:hover a{color:#2A6496;-webkit-transition:color .1s ease-in-out;-moz-transition:color .1s ease-in-out;-o-transition:color .1s ease-in-out;transition:color .1s ease-in-out}.ui-datepicker .ui-datepicker-header{margin-bottom:4px;text-align:center}.ui-datepicker .ui-datepicker-title{font-weight:700}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{cursor:default;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;height:20px;line-height:1;margin-top:2px;width:30px}.ui-datepicker .ui-datepicker-prev{float:left;text-align:left}.ui-datepicker .ui-datepicker-next{float:right;text-align:right}.ui-datepicker .ui-datepicker-prev:before{content:"\e079"}.ui-datepicker .ui-datepicker-next:before{content:"\e080"}.ui-datepicker .ui-icon{display:none}.ui-datepicker .ui-datepicker-calendar{table-layout:fixed;width:100%}.ui-datepicker .ui-datepicker-calendar td,.ui-datepicker .ui-datepicker-calendar th{text-align:center;padding:4px 0}.ui-datepicker .ui-datepicker-calendar td{border-radius:4px;-webkit-transition:background-color .1s ease-in-out,color .1s ease-in-out;-moz-transition:background-color .1s ease-in-out,color .1s ease-in-out;-o-transition:background-color .1s ease-in-out,color .1s ease-in-out;transition:background-color .1s ease-in-out,color .1s ease-in-out}.ui-datepicker .ui-datepicker-calendar td:hover{background-color:#eee;cursor:pointer}.ui-datepicker .ui-datepicker-current-day{background-color:#4289cc}.ui-datepicker .ui-datepicker-current-day a{color:#fff}.ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover{background-color:#fff;cursor:default}
-
-/* Allgemein */
+/*
+ * Diese Datei wird immer im Backend geladen. Hier sollten die Admin CSS Einstellungen rein, die nichts mit den Themes zu tun haben
+ */
+
+/*
+ * Allgemein
+ */
+.msg_wrap img { margin-bottom:1rem; margin-top:1rem; max-width:100%; height:auto; } 
+.wpsg_error { color:#FF0000; font-weight:bold; }
+.wpsg_developer { color:#FF0000; }
+.wpsg_change_error { background-color:#EE3B3B !important; }
+.wpsg_erfolg { color:green; }
+.wpsg_hinweis { font-style:italic; }
+.wpsg_table .odd td { background-color:#DEDEDE; }
+.wpsg_table .even td { }
+.wpsg_message img { float:right; }
+#wikipage h1 { line-height:100%; font-size:13px; }
+.wpsg_placeholder { border-style: dashed; border-width: 1px; height: 26px; margin: 0 auto 20px; }
+#icon-wpsg-Admin { background-image:url("../../../../../wp-admin/images/icons32.png"); background-position: -370px -5px; }
+/*.tablenav-pages-wrap { width:300px !important; }*/
+.tooltip { text-decoration:none; color:inherit; cursor:inherit; }
+.tooltip:hover { color:inherit; }
+.sortable_handler { cursor:move; }
+
+/*
+ * Datepicker
+ */
+.ui-datepicker { width: 17em; padding:0; display: none; border:1px solid #444444; background-color:#F1F1F1; }
+.ui-datepicker-header { color:#FFFFFF; background-color:#444444; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-icon { width: 16px; height: 16px; background-image: url('../../lib/ui/smoothness/images/ui-icons_888888_256x240.png'); }
+.ui-datepicker .ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-datepicker .ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/*
+ * Allgemein Icons ...
+ */
+ .branch-3-8 #adminmenu .toplevel_page_wpsg-Admin .wp-menu-image:before { content: "\f174"; }
+ .branch-3-8 #adminmenu .toplevel_page_wpsg-Admin .wp-menu-image img { position:absolute; left:-100px; top:-100px; height:1px; width:1px; }
+ 
+.wpsg_icon { display:block; width:16px; height:16px; float:left; margin-right:4px; background-repeat:no-repeat; background-position:50% 50%; }
+.wpsg_icon_center { margin:auto; }
+.wpsg_icon_right { float:right; }
+.wpsg_icon_add { background-image:url('../gfx/add.png'); }
+.wpsg_icon_edit { background-image:url('../gfx/edit.png'); }
+.wpsg_icon_html { background-image:url('../gfx/html.png'); }
+.wpsg_icon_remove { background-image:url('../gfx/delete.png'); }
+.wpsg_icon_plzedit { background-image:url('../gfx/edit.png'); width:32px; margin-right:5px; }
+.wpsg_form_language img { margin-left:2px; margin-top:5px; margin-right:5px; }
+.wpsg_form_language a { text-decoration:none; }
+.cluetip-inner img { max-width:100%; }
+
+/* Link Klassen */
+.wpsg_link_add { background-image:url('../gfx/add.png'); padding-left:20px; background-repeat:no-repeat; line-height:20px; background-position:left 50%; height:20px; display:block; }
+
+/*
+ * Admin 
+ */
+.wpsg_admin_theme { width:600px; border: 1px solid #AAAAAA; border-bottom-left-radius:6px; border-bottom-right-radius:6px; border-top-left-radius: 6px; border-top-right-radius: 6px; padding:10px; margin-bottom:10px; }
+.wpsg_admin_theme_akt { background-color:#FFFFFF !important; }
+.wpsg_admin_theme_image { width:75px; height:75px; border:1px solid #AAAAAA; float:left; }
+.wpsg_admin_theme_content { float:left; margin-left:10px; }
+.wpsg_admin_theme_name { font-weight:bold; font-size:14px; }
+.wpsg_admin_theme_info { color:#555555; }
+.wpsg_admin_theme_new { width:600px; border: 1px solid #AAAAAA; border-bottom-left-radius:6px; border-bottom-right-radius:6px; border-top-left-radius: 6px; border-top-right-radius: 6px; padding:10px; margin-bottom:10px; }
+.wpsg_admin_theme_new .button { float:right; }
+.wpsg_admin, .wpsg_admin_wrap { width:970px; }
+.wpsg_admin_topmenu { border-top: 1px solid #AAAAAA; }
+.wpsg_admin_topmenu ul { margin-top: -1px; list-style: none; width: 100%; margin-bottom: 10px; }
+.wpsg_admin_topmenu li { padding: 0px; margin: 0px; display: inline; }
+.wpsg_admin_topmenu li a { display: block; float: left; padding-left: 12px; padding-right: 12px; font: 11px/ 18px "Lucida Grande", Verdana, Arial, "Bitstream Vera Sans", sans-serif; color: #21759B; line-height: 30px; text-decoration: none !important; }
+.wpsg_admin_topmenu li.current a { background-image: url("../gfx/tab_top.gif"); background-repeat: no-repeat; background-position: top center; }
+.wpsg_admin_topmenu li a:hover { }
+.wpsg_admin_submenu { float:left; width:200px; }
+.wpsg_admin_submenu .head { cursor:pointer; margin-left:0px; width:180px; line-height:18px;   border-style: solid solid none; border-top-left-radius: 6px; border-top-right-radius: 6px; border-width: 1px 1px 0; border-color:#AAAAAA; color: #21759B; cursor:pointer !important; background-color:#F1F1F1; }
+.wpsg_admin_submenu .title { float:left; padding:5px; padding-left:12px; }
+.wpsg_admin_submenu .toggle { clear: right; cursor: default; float: right; height:26px; margin: 1px 0 0; padding: 1px 2px 0 0; width: 22px; cursor:pointer !important; }
+.wpsg_admin_submenu ul { border-bottom:1px solid #AAAAAA; border-right: 1px solid #AAAAAA; width: 181px; float: left; padding: 0px; margin: 0px; margin-left:0px; }
+.wpsg_admin_submenu ul li { border-left: 1px solid #AAAAAA; margin: 0px; }
+.wpsg_admin_submenu ul li.current { background-color: #F5F5F5; border-left: 0px; border-left:1px solid #AAAAAA; }
+.wpsg_admin_submenu ul li a { display: block; padding-left: 12px; font: 11px/ 18px "Lucida Grande", Verdana, Arial, "Bitstream Vera Sans", sans-serif; color: #21759B; line-height: 20px; text-decoration: none !important; }
+.wpsg_admin_submenu ul li a:hover { background-color: #EAF2FA; } 
+.wpsg_admin_submenu ul li.modul_akt a { background-image: url("../gfx/tick.png"); background-position: right center; background-repeat: no-repeat; font-weight: bold !important; width: 165px; }
+.wpsg_admin_content { float:left; }
+.wpsg_admin_box { width:770px; }
+.wpsg_admin_box .title { line-height:18px; padding:0px; border-style: solid solid none; border-top-left-radius: 6px; border-top-right-radius: 6px; border-width: 1px 1px 0; border-color:#AAAAAA; color: #21759B; cursor:pointer !important; background-color:#F1F1F1; }
+.wpsg_admin_box .content { border-bottom:1px solid #AAAAAA; border-right:1px solid #AAAAAA; border-left:1px solid #AAAAAA; min-height:18px; padding:5px; padding-left:12px; }
+.wpsg_admin_box .head .title { cursor:default !important; }
+.wpsg_admin_box .head .title .tab { cursor:pointer; float:left; padding-left:12px; padding-right:15px; border-right:1px solid #AAAAAA; padding-top:5px; padding-bottom:5px; }
+.wpsg_admin_box .head .title .tabright { float:right; border-left:1px solid #AAAAAA; border-right:0px; }
+.wpsg_admin_box .head .title .tab:first-child { border-top-left-radius:6px; }
+.wpsg_admin_box .head .title .tabright-last { border-top-right-radius:6px !important; }
+.wpsg_admin_box .head .title .tab:hover, .wpsg_admin_box .head .title .akttab { background-color:#FFFFFF; }
+.wpsg_admin_box .head .title .fulltab { cursor:pointer; padding:5px 5px 5px 12px; }
+.wpsg_admin_box .head .title .tablink { padding:5px; float:right; }
+.wpsg_admin_date_from { margin-right:4px;}
+.wpsg_admin_date_to { margin-right:4px; margin-left:25px; }
 .wpsg_clear { clear:both; }
-.wpsg_flex { display:flex; width:100%; }
-.wpsg_flex_justify_content_space_between { justify-content:space-between; }
-.wpsg_flex_align_items_center { align-items:center; }
-
-.ajax_loading { position:absolute; display:flex; align-items:center; justify-content:center; left:0px; top:0px; width:100%; height:100%; background-color:rgba(255, 255, 255, 0.5); z-index:1000000; }
-
-/* Bootstrap Teil */
-#wpsg-bs { margin-top:20px; min-width:1000px; }
-#wpsg-bs .updated,
-#wpsg-bs .error,
-#wpsg-bs .notice { margin-left:0px; margin-right:0px; width:auto; margin-bottom:1.5rem; }
-#wpsg-bs .flex { display:flex; }
-#wpsg-bs .flex-100 { width:100%; justify-content:space-between; }
-#wpsg-bs nav.navbar { margin-right:20px; }
-#wpsg-bs nav.navbar li { margin-bottom:0px; }
-#wpsg-bs nav.navbar .glyphicon { margin-right:10px; }
-#wpsg-bs .wpsg-export,
-#wpsg-bs .wpsg-filter-tab,
-#wpsg-bs .wpsg-filter { border-top:1px solid #E0E0E0; padding:15px; }
-#wpsg-bs .pagination_wrap { text-align:right; padding-right:20px; }
-#wpsg-bs .pagination_wrap_bottom { padding-right:0px; }
-#wpsg-bs .pagination { margin-top:0px; margin-bottom:10px; }
-#wpsg-bs .content { width:100%; box-sizing:border-box; padding-right:20px; }
-#wpsg-bs .form-group { margin-bottom:5px; margin-top:5px; }
-#wpsg-bs .form-checkbox { margin-top:-5px; margin-bottom:0px; }
-#wpsg-bs .popover { max-width:400px; margin-right:20px; }
-#wpsg-bs .arrow { margin-left:0px !important; }
-#wpsg-bs .popover.left > .arrow { left:auto; }
-#wpsg-bs .content .panel-title { font-size:14px; }
-#wpsg-bs .wpsg_admin_content .panel-title { line-height:10px; font-size:14px; }
-#wpsg-bs .wpsg_admin_content .panel-title h4 { line-height:20px; font-size:14px; }
-#wpsg-bs .table .wpsg-sm { height:20px; line-height:20px; font-size:12px; }
-#wpsg-bs .wpsg_code { background-color:#EFEFEF; border:1px solid #000000; padding:3px; margin-top:5px; margin-bottom:5px; font-family:monospace; font-size:12px; }
-#wpsg-bs .form-horizontal .editable { padding-top:0px; display:inline; }
-#wpsg-bs .editableform textarea { width:500px; height:250px; }
-#wpsg-bs .wpsg-glyphicon { margin-right:10px; }
-#wpsg-bs .wpsg_glyphicon_right { float:right; }
-#wpsg-bs .wpsg-glyphlink-td > span { margin-left:5px; margin-top:5px; }
-#wpsg-bs .wpsg-glyphlink-td:hover { text-decoration:none; }
-#wpsg-bs .wpsg_message_ok { color:green; }
-#wpsg-bs .wpsg_message_demo { color:blue; }
-#wpsg-bs .wpsg_error { color:red; }
-#wpsg-bs .form-group-sm .form-control { padding-left:8px; }
-#wpsg-bs .form-group-text { position:relative; }
-#wpsg-bs .form-group-text p { padding-top:5px;  line-height:150%; min-height:18px; }
-#wpsg-bs .form-select .form-control { padding-left:5px; }
-#wpsg-bs .form-group-sm .form-control-static { padding-left:10px; height:auto; }
-#wpsg-bs .list-group-head { background-color:#666666; color:#FFFFFF; border:1px solid #666666; }
-#wpsg-bs .wpsg_admin_submenu .list-group-item.active { color:#FFFFFF; }
-#wpsg-bs .list-group-head a { color:#FFFFFF; }
-#wpsg-bs .modal-dialog { width:70%; }
-#wpsg-bs .table-bordered thead { background-color:#FFFFFF; }
-#wpsg-bs .table-body-striped > tbody:nth-of-type(odd) { background-color:#f9f9f9; }
-#wpsg-bs .checkbox input { margin-top:1px; }
-#wpsg-bs .info { font-style:italic; font-size:12px; line-height:16px; margin-top:5px; margin-bottom:5px;  }
-#wpsg-bs .tab-pane { padding-top:15px; }
-#wpsg-bs fieldset > legend { padding-top:2rem; text-align:left; }
-#wpsg-bs fieldset > legend > div { padding-left:25px; }
-#wpsg-bs .wpsg_table_wrap { max-width:100%; overflow-x:auto; margin-bottom:1rem; }
-#wpsg-bs .wpsg-bs-toggle-nav { float:right; line-height:50px; font-size:25px; text-decoration:none; }
-#wpsg-bs .wpsg-wp-header-end { margin-top:-10px !important; }
-#wpsg-bs .wpsg_msg_wrap { margin-right:20px; }
-#wpsg-bs .d-flex { display:flex; }
-#wpsg-bs .justify-content-between { justify-content:space-between; }
-#wpsg-bs .w-100 { width:100%; }
-#wpsg-bs .justify-content_center { justify-content:center; }
-#wpsg-bs .align-items_center { align-items:center; }
-#wpsg-bs .justify-content_space-between {justify-content:space-between; }
-#wpsg-bs .grow-1 { flex-grow:1; }
-#wpsg-bs .combodate select.day { width:50px !important; }
-#wpsg-bs .combodate select.month { width:50px !important; }
-#wpsg-bs .combodate select.year { width:60px !important; }
-#wpsg-bs .combodate select.hour { width:50px !important; }
-#wpsg-bs .combodate select.minute { width:50px !important; }
-#wpsg-bs .combodate select.second { width:50px !important; }
-#wpsg-bs .editable-popup .control-group { width:500px !important; }
-#wpsg-bs .inline-block { display:inline-block; }
-#wpsg-bs .mr-2 { margin-right:0.5rem; }
-#wpsg-bs .mr-4 { margin-right:1rem; }
-#wpsg-bs .mt-0 { margin-top:0; }
-#wpsg-bs .font-normal { font-weight:normal; }
-#wpsg-bs .flex { display:flex; }
-#wpsg-bs .justify-between { justify-content:space-between; }
-#wpsg-bs .items-center { align-items:center; }
-#wpsg-bs .mt-2 { margin-top:0.5rem; }
-#wpsg-bs .w-full { width:100%; }
-#wpsg-bs .p-1 { padding:0.25rem; }
-#wpsg-bs .box-border { box-sizing:border-box; }
-#wpsg-bs .text-right { text-align:right; }
-#wpsg-bs .none { display:none; }
-
-.wp-admin #wpsg-bs select { max-width:100%; padding-right:0; line-height:initial; }
-.wp-admin #wpsg-bs .checkbox input { margin-top:3px; width:15px; height:15px; }
-
-.wp-admin #wpsg-bs .checkbox input:before { margin:1px 0 0 1px; width:10px; height:10px; }
-#wpsg-bs input[type=checkbox], input[type=radio] { width:16px; height:16px; }
-#wpsg-bs input[type=checkbox]:checked::before { width:14px; height:14px; margin:0; }
-#wpsg-bs input[type=radio]:checked::before { width:6px; height:6px; margin:4px; }
-
-/* Allgemeine Klassen */
-.wpsg_grey { color:#999999; }
-.wpsg_editable { line-height:125%; }
-
-/* Tabellensortierung */
-.wpsg-table-order .wpsg_order { position:relative; }
-.wpsg-table-order .wpsg_order:after { content:"\e150"; position:absolute; font-size:1em; font-weight:normal; bottom:8px; right:8px; display:block; font-family:'Glyphicons Halflings'; opacity:0.2; color:#337AB7; }
-.wpsg-table-order .wpsg_order:hover { cursor:pointer; }
-.wpsg-table-order .wpsg_order:hover:after { content:"\e155"; opacity:0.8; }
-.wpsg-table-order .wpsg_order.wpsg_order_asc:after { content:"\e155"; opacity:1; }
-.wpsg-table-order .wpsg_order.wpsg_order_desc:after { content:"\e156"; opacity:1; }
-.wpsg-table-order .wpsg_order.wpsg_order_asc:hover:after { content:"\e156"; }
-.wpsg-table-order .wpsg_order.wpsg_order_desc:hover:after { content:"\e155"; }
-
-/* Inline Edit */
-#wpsg-bs .editableform > .control-group > div { padding-left:15px; padding-right:15px; display:flex; }
-#wpsg-bs .editableform > .control-group > div .editable-input { flex-grow:1; }
-#wpsg-bs .editableform > .control-group > div .editable-input textarea,
-#wpsg-bs .editableform > .control-group > div .editable-input select { width:100%; }
-#wpsg-bs .editableform > .control-group > div input[type="text"] { min-width:300px; }
-
-/* Kundenverwaltung -> Kundendaten */
-#wpsg-bs .wpsg_customerfield .tab-content { position:relative; padding-top:1.5rem; }
-#wpsg-bs .wpsg_customervar_row2 td { border-top:0px; }
-.wpsg-table-customer .wpsg_pic_col { text-align:center; }
-.wpsg-table-customer .wpsg_pic_col img { margin-bottom:5px; }
-.tom_customerdata_deletebutton .button-primary { float:right; right:5px; background:#ba0000; font-size:10px; border-color:#aa0018 #990000 #7d0101; text-shadow:0 -1px 1px #aa0018, 1px 0 1px #aa0018, 0 1px 1px #aa0018, -1px 0 1px #aa0018; box-shadow:0 1px 0 #990000; }
-.tom_customerdata_deletebutton .button-primary:hover { background:#aa0018; border-color:#aa0018; }
-
-/* Rechtstexte */
-.wpsg_mod_legaltexts_protectedshops_table th { width:58%; text-align:right; font-size:12px; }
-.wpsg_mod_legaltexts_protectedshops_table th label { margin-right:30px; }
-.wpsg_mod_legaltexts_protectedshops_table #wpshopgermany_ts_shopid {  }
-.itrechtlogo { float:right; margin-left:15px; }
-.wpsg_mod_legaltext_select > label { width:100%; font-size:18px; font-weight:normal; padding:15px; display:flex; flex-direction:row; justify-content:flex-start; align-items:center; border:1px solid #31708f; }
-.wpsg_mod_legaltext_select > label.mark { border-width:3px; }
-.wpsg_mod_legaltext_select > label.open { border-bottom:0px; }
-.wpsg_mod_legaltext_select > label > * { flex-grow:0; flex-shrink:0; }
-.wpsg_mod_legaltext_select > label > .grow { flex-grow:1; flex-shrink:1; }
-.wpsg_mod_legaltext_select > label > .glyphicon { font-size:2em; }
-.wpsg_mod_legaltext_select > label input { margin:0px 15px 0px 0px; }
-.wpsg_provider_target { display:none; padding:15px; border:1px solid #31708f; border-top:0px; margin-top:-5px; margin-bottom:15px; }
-.wpsg_provider_target .wpsgitrecht_form_field { width:100%; display:flex; flex-direction:row; justify-content:flex-start; align-items:center; }
-.wpsg_provider_target .wpsgitrecht_form_field .wpsgitrecht_form_left { width:50%; flex-grow:0; flex-shrink:0; }
-.wpsg_provider_target .wpsgitrecht_form_field .wpsgitrecht_form_right { width:50%; flex-grow:0; flex-shrink:0; }
-.wpsg_provider_target .wpsgitrecht_form_field .wpsgitrecht_form_right input { width:100%; }
-.wpsg_provider_target .wpsgitrecht_table { width:100%; border-spacing:0px; border-collapse:collapse; }
-.wpsg_provider_target .wpsgitrecht_table .col0 { width:50%; }
-.wpsg_provider_target .wpsgitrecht_table .col1 { width:50%; }
-.wpsg_provider_target .wpsgitrecht_table select { margin-bottom:5px; width:100%; }
-.wpsg_provider_target .wpsgitrecht_table p { padding:0px 0px 0px 8px; }
-.wpsg_provider_target_3 { border-width:3px; margin-top:-8px; }
-.wpsg_provider_target_3 .button_agb { float:right; }
-.wpsg_provider_target_3 ul li { list-style:initial; margin-left:20px; } 
-
-.wphb_form_left { width:30% !important; }
-.wphb_form_right { width:68% !important; }
-.wphb_form_right select { margin-left:15px; width:40% !important; float:left !important; margin-bottom:20px;  }
-.wphb_form_right input.checkbox { margin-left:20px !important; }
-.wphb_clear { clear:none !important; }
-
-/* Datepicker */
-#ui-datepicker-div { z-index:1151221 !important; }
-
-/* Kundenkontakt */
-.wpsg_kundenkontakt_template,
-.wpsg_kundenkontakt_betreff { width:80%; float:right; margin-bottom:20px; }
-.wpsg_kundenkontakt_textarea { width:100%; float:right; height:150px; }
-
-/* SMS-Versand */
-.wpsg_sms_template,
-.wpsg_sms_newnumber { width:70%; float:right; margin-bottom:20px; }
-.wpsg_sms_textarea { width:100%; float:right; height:150px; }
-
-/* LÃ€nderverwaltung */
-.wpsg_table_country { margin-bottom:0px; }
-.wpsg_table_country .col_mwst { width:25px; }
-.wpsg_table_country .col_mwst { width:75px; }
-.wpsg_table_country .col_mwstsetting { width:100px; }
-.wpsg_table_country .col_vz { width:100px; }
-.wpsg_table_country .col_action { width:60px; text-align:right; }
-.wpsg_table_country .col_action a { margin-left:5px; }
-.wpsg_table_country tr:last-child .glyphicon-trash { margin-top:5px; }
-
-/* Tabelle der Berechtigungen */
-.wpsg_access_table .wpsg_col_cap { text-align:center; }
-.wpsg_access_table .wpsg_col_cap select { max-width:100%; padding-right:0; line-height:unset; }
-.wpsg_access_table .wpsg_col_cap input { margin-top:0px; width:15px; height:15px; font-size: 12px; }
-.wpsg_access_table .wpsg_col_cap input:before { margin:1px 0 0 1px; width:10px; height:10px; }
-
-/* Hilfe Dialog */
-#wpsg-bs .wpsg-help-content { max-height:500px; overflow:auto; }
-#wpsg-bs .wpsg-help-content h1 { font-size:16px; font-weight:bold; }
-#wpsg-bs .wpsg-help-content h2 { font-size:14px; font-weight:bold; }
-#wpsg-bs .wpsg-help-content img { max-width:100%; height:auto; }
-
-/* Formulare NEU */
-#wpsg-bs .has-feedback .wpsg_field_wrap { width:100%; position:relative; padding-right:25px; }
-#wpsg-bs .wpsg_field_wrap .form-control-feedback { right:0px; width:20px; cursor:pointer; pointer-events:all; }
-#wpsg-bs .form-checkbox .wpsg_field_wrap .form-control-feedback { line-height:25px; }
-#wpsg-bs .wpsg_field_wrap .form-control-feedback:focus,
-#wpsg-bs .wpsg_field_wrap .form-control-feedback:hover { text-decoration:none; }
-#wpsg-bs .form-control-static input[type="file"] { margin-top:-5px; }
-
-/* Bootstrap Formulare im alten Teil */
-.wpsg_old_forms .form-group { margin-left:-15px; margin-right:-15px; margin-bottom:5px; }
-.wpsg_old_forms .form-checkbox > div:first-child { width:100%; margin-left:0px; }
-
-/* Auswahl der Versand-/Zahlungsarten */
-#wpsg_shippingmethods_select,
-#wpsg_paymentmethods_select { margin-bottom:10px; }
-.wpsg_shippingmethods_select .checkbox,
-.wpsg_paymentmethods_select .checkbox { margin-top:0px; margin-bottom:0px; }
-
-/* Alte Formularelemente */
-.wpsg_form_field { width:100%; margin-bottom:5px; }
+.wpsg_form_field { width:770px; margin-bottom:5px; }
 .wpsg_form_field_fullrow { position:relative; }
 .wpsg_form_field_fullrow label { font-weight:bold; line-height:25px; }
-.wpsg_form_field .wpsg_form_left { line-height:24px; font-weight:bold; width:50%; float:left; }
-.wpsg_form_field .wpsg_form_right { width:50%; padding-left:15px; float:left; position:relative; }
+.wpsg_form_field .wpsg_form_left { line-height:24px; font-weight:bold; width:350px; float:left; }
+.wpsg_form_field .wpsg_form_right { width:420px; float:left; position:relative; }
 .wpsg_form_field .wpsg_form_right select, .wpsg_form_field .wpsg_form_right input, .wpsg_form_field .wpsg_form_right textarea { width:95%; }
 .wpsg_form_field .wpsg_form_right input.button { width:auto; }
-.wpsg_form_field .wpsg_form_right input[type="checkbox"] { margin-top:-4px; margin-right:5px; }
 .wpsg_form_field .wpsg_form_right label { line-height:25px; }
-.wpsg_form_field .wpsg_form_right p { padding-top:5px; }
 .wpsg_form_field_max select { width:100%; }
-
-/* Konfiguration */
-.wpsg_admin_wrap { position:relative; }
-.wpsg_admin_submenu { width:180px; float:left; }
-.wpsg_admin_content { padding-left:20px; width:800px; float:left; }
-.wpsg_admin_content h3 { margin:20px; }
-.wpsg_admin_content h3.panel-title { margin:0px; }
-.wpsg_admin_submenu .list-group-item { padding:5px 10px; }
-.list-group { margin-bottom:15px !important; }
-.wpsg_admin_ueber_check_wrap { padding-top:15px; }
-.wpsg_admin_ueber_check_wrap .wpsg_admin_ueber_check { padding:15px; }
-.wpsg_admin_ueber_check_wrap .wpsg_admin_ueber_check_1 { } /* Notice Meldungen */
-.wpsg_admin_ueber_check_wrap .wpsg_admin_ueber_check_2 { } /* Warnungen Meldungen */
-.wpsg_admin_ueber_check_wrap .wpsg_admin_ueber_check_3 { } /* Error Meldungen */
-.email-logo-alignment, .email-logo-alignment input[type="radio"] { font-family: FontAwesome; margin: 0; outline: 0; }
-.email-logo { padding-bottom: 10px; }
-.email-logo-watermark { position:absolute; top:10%; left:0; right:0; display:flex; justify-content:center; align-items:center; }
-.wpsg_mailattachment { padding:8px 0px; }
-.wpsg_mailattachment a { display:block; min-height:24px; line-height:24px; }
-.btnAddAttachment { width:11rem; }
-
-/* Produktverwaltung */
-.wpsg_pic_col { width:50px; }
-.wpsg_admin_submenu input[type="submit"], .wpsg_admin_submenu input[type="button"] { width:100%; margin-bottom:10px !important; }
-#wpsg-bs.wpsg_products .wpsg_productgroup_link_wrap { float:left; }
-.wpsg_mod_productvariants_productimage_row .mark { display:inline-block; background-color:#FFF; border:2px solid #444444;}
-.wpsg_be_imagelist_image { width:100px; }
-.wpsg_be_productindex_image { border:0px !important; width:75px; background-color:#FFFFFF; }
-.v3Design_leistungsortregelCheckbox { padding-left: 15px; padding-right: 15px; }
-.addedit_templateV3 .form-control-feedback:hover { cursor: pointer; }
-.addedit_templateV3 .form-control-feedback { z-index: 99999; }
-.addedit_templateV3 .form-control-feedback:hover {  }
-.addedit_templateV3 .postbox { border-radius: 3px; }
-.addedit_templateV3 .postbox .inside { padding-bottom: 0; }
-.addedit_templateV3 .col-sm-6 { width: 100% !important; margin-left: 0 !important; }
-.addedit_templateV3 #wpsg_generally .col-sm-6 { width: 80% !important; }
-.addedit_templateV3 #wpsg_generally label.col-sm-6 { width: 20% !important; }
-.addedit_templateV3 .general-panel-block { display: block; position: relative; width: 100%; height: auto; }
-.addedit_templateV3 .general-panel-subblock { display: flex; justify-content: center; align-items: center; width: 100%; height: 100%; }
-.addedit_templateV3 .general-panel-urlnotification,
-.addedit_templateV3 .general-panel-ordercondition { width: 50%; position: relative; display: block; }
-.addedit_templateV3 .general-panel-urlnotification .panel,
-.addedit_templateV3 .general-panel-ordercondition .panel { width: 99%; display: block; position: relative; margin: 0 auto 20px auto; height: 135px; }
-.addedit_templateV3 .general-panel-ordercondition .panel-body { display: flex; justify-content: flex-start; align-items: center; width: 100%; height: 85%; margin-top: -10px; }
-.addedit_templateV3 .general-panel-urlnotification .form-group:first-child { width: 100% !important; }
-.addedit_templateV3 .general-panel-urlnotification .form-group-sm{ width: 50%; padding: 0; margin: 0 auto; float: left; }
-.addedit_templateV3 .texte-title { color: #72777c; padding: 10px 15px; border-bottom: 1px solid transparent; font-size: 15px; }
-.addedit_templateV3 .panel-general .wpsg_field_wrap { padding-right: 15px; }
-.addedit_templateV3 .panel-texte .wpsg_handlediv { width: 100%; display: flex; justify-content: flex-start; align-items: center; padding: 10px; }
-.addedit_templateV3 .panel-texte .panel-heading { height: fit-content; width: 100%; }
-.addedit_templateV3 .mod-area .wpsg_field_wrap { padding-right: 0px !important; }
-.addedit_templateV3 #wpsg_paymentmethods .last-form-group,
-.addedit_templateV3 #wpsg_paymentmethods .last-form-group .form-control{ margin-bottom: 2.5px !important; }
-.addedit_templateV3 br { display: none; }
-.addedit_templateV3 #wpsg_images br,
-.addedit_templateV3 #wpsg_mods br:first-child{ display: block !important; }
-
-
-/* Bild allgemein */
-.box_img_wrap { position:relative; padding-top:100%; border:1px solid #000000; background:transparent; }
-.box_img_wrap img {border:0px !important; position:absolute; left:50%; top:50%; max-height:100% !important; max-width:100%!important; height:auto!important; width:auto!important; margin:0px !important;
-    transform:translateY(-50%) translateX(-50%);
-    -ms-transform:translateY(-50%) translateX(-50%);
-    -webkit-transform:translateY(-50%) translateX(-50%);
-}
-
-/*
- * Produktbackend
- */
-.wpsg_productview_backend-sold-out { color:#dc3232; font-weight:700; }
-.wpsg_productview_backend-available { color:#7ad03a; font-weight:700; float:left; margin-right:5px; }
-.wpsg_top_extend { line-height:50px; margin-left:15px; }
-.wpsg_top_extend .commenticon { cursor:default; display:inline-block; margin:0px !important; padding-right:0px; }
-
-/* Bewertung */
-.wpsg_rating { background-color:#29556E; }
-.sto_comment_form .comment_list,
-.sto_comment_form .comment_form { width:55rem; }
-.wpsg_comment_form .comment { background-color:#ececec; padding:20px; margin-bottom:30px; }
-.wpsg_comment_form .wpsg_star_wrap { float:right; }
-.wpsg_comment_form .wpsg_bewertung_comment_name { font-weight:bold; color:#29556e; text-transform:uppercase; float:left; }
-.wpsg_comment_form .wpsg_bewertung_comment_date { padding:20px 0px; color:#29556e; }
-.wpsg_comment_form .wpsg_bewertung_comment_text { color:#29556e; }
-.wpsg_comment_form .row { margin-left:0px !important; }
-.wpsg_star_wrap { font-size:15px; font-weight:normal; margin-bottom:5px; }
-.wpsg_star_wrap .fa { margin-right:5px; }
-.wpsg_star_wrap { color:#F8E71C; text-shadow:-1px 0 #F6B03A, 0 1px #F6B03A, 1px 0 #F6B03A, 0 -1px #F6B03A; }
-.wpsg_star_wrap .fa-star-active { color:#C8C8C8; text-shadow:-1px 0 #9B9B9B, 0 1px #9B9B9B, 1px 0 #9B9B9B, 0 -1px #9B9B9B; }
-.wpsg_comment_form .wpsg_star_wrap { float:right; }
-
-/* Bestellverwaltung */
-.wpsg_order .wpsg_status_link_wrap { min-height:50px; float:left; display:inline-block; }
-.wpsg_order .col_checkbox { width:20px; }
-.wpsg_order .col_checkbox input { margin-top:-2px; }
-.wpsg_order .col_nr { width:250px; }
-.wpsg_order .col_nr .actions a { font-size:0.9em; }
-.wpsg_order .col_nr .glyphicon { margin-top:5px; font-size:1.2em; margin-right:5px; text-decoration:none; }
-.wpsg_order .col_nr .glyphicon.shippingadress { color:red; }
-.wpsg_top_extend .commenticon.admincomment,
-.wpsg_order .col_nr .glyphicon.admincomment { color:red; }
-.wpsg_order .wpsg-order-tab { padding-top:15px; padding-bottom:15px; }
-.wpsg_order_view #restored_notice { margin-bottom:15px; color:red; }
-.procent_payship { font-size:0.75em; line-height:0.75em; color:#666666; displaY:block; }
-
-#wpsg-bs.wpsg_order_view .editableform textarea { height:150px;}
-.wpsg_order_view .wpsg_cell_gesamtpreis { text-align:right; }
-.wpsg_order_view .wpsg_admin_submenu .glyphicon { float:left; height:30px; width:20px;}
-
-/* Modulverwaltung */
-.wpsg_admin_submenu .list-group-item.modul_akt { color:#3c763d; font-weight:bold; }
-.wpsg_admin_submenu .list-group-item.modul_akt .glyphicon { position:absolute; right:5px; top:5px; color:#3c763d; }
-.wpsg_admin_submenu .list-group-item.active { color:#dff0d8; }
-.wpsg_admin_submenu .list-group-item.active .glyphicon { position:absolute; right:5px; top:5px; color:#dff0d8; }
-.wpsg_modul_search_wrap { width:100%; position:relative; }
-.wpsg_modul_search { margin-bottom:15px; width:70%; }
-.wpsg_modul_onlyactive { position:absolute; }
-.wpsg_modul_onlyactive_glyphicon { position:absolute !important; right:5px; top:7px !important; color:#3c763d; }
-.wpsg_modul_search_wrap input[type="checkbox"] { right:25px; top:3px; position:absolute; }
-#wpsg-bs .modultable td { padding:4px 8px !important; font-size:1.2rem; }
-#wpsg-bs .modultable tr > *:nth-child(2) { width:100px; }
-#wpsg-bs .modultable tr > *:nth-child(3) { width:175px; }
-#wpsg-bs .modultable tr > *:nth-child(4) { width:200px; }
-.modul_help_link { float:right; }
-
-/* Domainverwaltung */
-#wpsg-bs .domaintable td { padding:4px 8px !important; vertical-align:middle; }
-#wpsg-bs .domaintable td.col_action { text-align:right; }
-
-/* Verwaltung Versandzonen */
-.wpsg_table_vz .col_aktion { text-align:right; }
-.wpsg_table_vz .wpsg_icon_plzedit { margin-right:5px; }
-.wpsg_table_vz .wpsg_plz_div textarea { width:100%; padding:5px; margin-top:5px; margin-bottom:5px; }
-
-/* Formularanpassungen */
-.form-checkbox label { font-size:12px; line-height:200%; }
-
-/* Modul AboProdukte */
-.wpsg_mod_abo_expired { color:red; }
-.wpsg_mod_abo_future_expire { color:green; }
-.wpsg_abo_state_class_1 { color:green; }
-.wpsg_abo_state_class_2 { color:orange; }
-.wpsg_abo_state_class_3 { color:red; }
-
-/* Modul Produktbilder (wpsg_mod_produktbilder) */
-#produktbilder_target img { }
-.wpsg_mod_produktbilder_admin_bild a { position:relative; display:inline-block; float:left; margin-right:5px; margin-bottom:5px; }
-.wpsg_mod_produktbilder_admin_bild a > span { left:0px; top:0px; display:none; position:absolute; width:100%; height:100%; text-align:center; background-color:rgba(255, 0, 0, 0.3); }
-.wpsg_mod_produktbilder_admin_bild a > span > span { font-size:30px; top:50%; margin-top:-15px; }
-.wpsg_mod_produktbilder_admin_bild a:hover > span { display:block; }
-
-/* Modul Produktartikel (wpsg_mod_produktartikel) */
-.wpsg-mod_produktartikel_categorydiv .tabs-panel { padding-top:8px !important; }
-.wpsg-mod_produktartikel_categorydiv label { font-weight:normal; font-size:14px; }
-.wpsg-mod_produktartikel_categorydiv label input[type="checkbox"] { margin-top:-2px; }
-
-/* Modul Produktattribute (wpsg_mod_productattribute) */
-.wpsg_mod_produktattribute_table .col_show { text-align:center; width:60px; }
-.wpsg_mod_produktattribute_table .col_action { width:60px; text-align:right; }
-.wpsg_mod_produktattribute_table .col_typ { width:75px; }
-.wpsg_mod_produktattribute_table .col_id { width:15px; }
-.wpsg_mod_produktattribute_table .auswahlrow2 td { border-top:0px; }
-.wpsg_mod_produktattribute_table > tbody + tbody { border-top:0px; }
-.wpsg_produkt_pa_label { margin-left:10px; }
-#wpsg_produktattribute .wpsg_form_field { padding:10px 0; }
-
-/* Modul Produktvarianten */
-.wpsg_mod_productvariants_table_variants .col_action { text-align:right; width:60px; }
-.wpsg_mod_productvariants_table_variants .col_products { text-align:center; width:75px; }
-.wpsg_mod_productvariants_table_variants .col_vari { width:75px; text-align:center; }
-.wpsg_mod_productvariants_table_variants .col_type { width:100px; }
-.wpsg_mod_productvariants_table_variants .col_id { width:50px; }
-.wpsg_mod_productvariants_table_variation .col_action { text-align:right; width:75px; }
-.wpsg_mod_productvariants_table_variation .wpsg_mod_productvariants_remove_global_vari_image { position:relative; text-decoration:none; display:inline-block; }
-.wpsg_mod_productvariants_table_variation .wpsg_mod_productvariants_remove_global_vari_image > span { color:#FFFFFF; background-color:rgba(0, 0, 0, 0.5); position:absolute; left:0; top:0; width:100%; height:100%; display:none; justify-content:center; align-items:center; }
-.wpsg_mod_productvariants_table_variation .wpsg_mod_productvariants_remove_global_vari_image:hover > span { display:flex; }
-.wpsg_mod_productvariants_table_variation .wpsg_mod_productvariants_remove_global_vari_image img { max-width:25px; max-height:25px; }
-.wpsg_mod_productvariants_table_variation tbody:nth-child(even) td { background-color:#F9F9F9; }
-.wpsg_mod_productvariants_table_variation .col_id { width:50px; }
-.wpsg_mod_productvariants_table_variation .col_active { width:25px; }
-.wpsg_mod_productvariants_info { font-style:italic; font-size:0.9em; }
-.wpsg_mod_productvariants_dialog_noDialog { border:1px solid #DDDDDD; padding:10px; margin:-5px; margin-top:-16px; margin-left:0px; margin-right:0px; margin-bottom:15px; }
-.wpsg_mod_productvariants_dialog_noDialog .modal-body { padding:1rem 0px; }
-.wpsg_mod_productvariants_dialog_noDialog .modal-footer { padding:1rem 0px; }
-
-/* Modul Exportprofile */
-#wpsg_profil_list { padding:10px; border:1px solid #DDDDDD; }
-
-/* Modul Bestellbedingungen */
-#wpsg_oc_list .glyphicon-trash { position:absolute; right:5px; top:0px; font-size:1.4rem; }
-#wpsg_oc_list .wpsg_mod_ordercondition_text { width:100%; height:150px; }
-
-/* Modul Gutschein */
-#wpsg-bs.wpsg_voucher .col_checkbox { width:20px; }
-.wpsg_mod_voucher_fieldtable { font-size:12px; }
-.wpsg_mod_voucher_fieldtable .col_bezeichnung { width:25px; }
-.wpsg_mod_voucher_fieldtable .col_x,
-.wpsg_mod_voucher_fieldtable .col_y { width:60px; }
-.wpsg_mod_voucher_fieldtable .col_color { width:80px; }
-.wpsg_mod_voucher_fieldtable .col_groesse { width:60px; }
-.wpsg_voucher .wpsg_status_link_wrap { min-height:50px; float:left; display:inline-block; }
-.wpsg_voucher td .actions { opacity:1; font-size: 0.9em; }
-.wpsg_voucher td:hover .actions { opacity:1; }
-
-
-@media (min-width: 768px) {
-    #wpsg_voucher_dialog > .modal-dialog { width:1000px; }
-}
-
-/* Modul Lieferschein/Rechnung */
-.wpsg_mod_deliverynote_fieldtable { font-size:12px; }
-.wpsg_mod_deliverynote_fieldtable .col_bezeichnung { width:125px; }
-.wpsg_mod_deliverynote_fieldtable .col_x,
+.postbox .wpsg_form_field .wpsg_form_left  { width:330px; } /* z.B. Bestellverwaltung Bankalignment Modul */
+.wpsg_order_top { }
+.wpsg_order_top .wpsg_form_field { width:100%; }
+.wpsg_order_top .wpsg_form_field .wpsg_form_left { max-width:200px; width:50% !important; }
+.wpsg_order_top .wpsg_form_field .wpsg_form_right { width:50% !important; }
+.wpsg_order_top .wpsg_form_field .wpsg_form_right select { width:50%; float:left; }  
+.wpsg_admin_box .wpsg_form_field { margin-bottom:0px; }
+.wpsg_admin_box .wpsg_form_field .wpsg_form_right { width:401px ; }
+.wpsg_form_field .wpsg_form_right_unit select, .wpsg_form_field .wpsg_form_right_unit input, .wpsg_form_field .wpsg_form_right_unit textarea { width:80%; float:left; }
+.wpsg_form_field .wpsg_form_right_unit p.wpsg_unit { width:15%; float:left; }
+.wpsg_form_field .wpsg_form_right textarea { height:100px; }
+.wpsg_form_field .wpsg_form_right input.checkbox { width:auto !important; float:left; margin-left:2px; margin-top:5px; }
+.wpsg_form_field .wpsg_form_right p { padding:4px 0px 4px 6px; margin:0px; }
+.wpsg_formfield_small .wpsg_form_left { line-height:12px; }
+.wpsg_formfield_small .wpsg_form_right p { line-height:12px; padding-top:0px; padding-bottom:0px; }
+.widget-inside .wpsg_form_field { width:100%; }
+.widget-inside .wpsg_form_left { width:100%; }
+.widget-inside .wpsg_form_right { width:100%; }
+.widget-inside .wpsg_form_field .wpsg_form_right select, 
+.widget-inside .wpsg_form_field .wpsg_form_right input,
+.widget-inside .wpsg_form_field .wpsg_form_right textarea { width:100%; }  
+.timestamp-wrap input, .timestamp-wrap select { width:auto !important; }
+.produktwrap .wpsg_form_field { width:780px; }
+.produktwrap .wpsg_form_left { width:380px; }
+.produktwrap .wpsg_form_right { width:400px; }
+.wpsg_form_help { right:0px; top:4px; position:absolute; display:block; width:16px; height:16px; background-image:url('../gfx/help.png'); }
+.widget-content .wpsg_form_help { position:relative; float:right; margin-top:-2px; }
+.wpsg_form_help_notip { right:0px; top:4px; position:absolute; display:block; width:16px; height:16px; background-image:url('../gfx/help.png'); }
+.wpsg_admin_content { padding:0px; margin:0px; float:left; width:750px; }
+.wpsg_admin_content h3 { position:relative; }
+.wpsg_admin_table { width:100%; }
+.wpsg_admin_box .wpsg_admin_table { margin-left:-3px; } 
+.wpsg_admin_table th { font-weight:bold; text-align:left; padding:3px; }
+.wpsg_admin_table td { padding:3px; } 
+.wpsg_admin_wpsg_list .col_name { }
+.wpsg_admin_wpsg_list .col_value { width:100px; }
+.wpsg_admin_wpsg_list .col_aktion { width:50px; }
+.wpsg_editable { border-bottom:1px dotted #666666; cursor:pointer; }
+.wpsg_editable input, .wpsg_editable select { height:24px !important; font-size:12px; }
+.wpsg_editable input { width:100%; }
+.wpsg_pflichtfelder { border-spacing:0px; width:100%; }
+.wpsg_pflichtfelder td { padding:0px; }
+.wpsg_pflichtfelder tr th { text-align:left; }
+.wpsg_pflichtfelder td.col1 select, 
+.wpsg_pflichtfelder td.col1 input { width:100%; }
+.wpsg_customfields { border-spacing:0px; width:100%; }
+.wpsg_customfields td { padding:0px; }
+.wpsg_customfields tr th { text-align:left; }
+.wpsg_customfields td select { width:100%; }
+.wpsg_customfields .col0 { width:45px; }
+.wpsg_customfields .col1 { width:305px; }
+.wpsg_customfields .col4 { width:25px; }
+.wpsg_customfields .col5 { text-align:center; }
+.wpsg_customfields .col2345 input { width:100%; }
+table.wpsg_admin_laender_list { font-size:12px; }
+table.wpsg_admin_laender_list tr.odd td { background-color:#DEDEDE; }
+table.wpsg_admin_laender_list tr.even td {}
+.wpsg_admin_laender_list .col_vz { width:100px; } 
+.wpsg_admin_laender_list .col_default { width:75px; text-align:center; }
+.wpsg_admin_laender_list .col_mwst { width:55px; }
+.wpsg_admin_laender_list .col_mwstsetting { width:100px; } 
+.wpsg_admin_laender_list .col_action { width:40px; }
+.wpsg_mod_produktattribute_table { width:100%; table-layout:fixed; }
+.wpsg_mod_produktattribute_table .col_id { width:25px; text-align:left; }
+.wpsg_mod_produktattribute_table .col_name { text-align:left; }
+.wpsg_mod_produktattribute_table .col_typ { width:100px; text-align:left; }
+.wpsg_mod_produktattribute_table .col_typ select { width:100%; }
+.wpsg_mod_produktattribute_table .col_html { width:35px; }
+.wpsg_mod_produktattribute_table .col_aktion { width:50px; text-align:center; }
+.wpsg_dialog { padding:10px; }
+.wpsg_code { background-color:#EFEFEF; border:1px solid #000000; padding:3px; margin-top:5px; margin-bottom:5px; font-family:monospace; font-size:12px; }
+.wpsg_tablerow td { padding:2px 0px 2px 0px; }
+.wpsg_odd:hover, .wpsg_even:hover, .wpsg_tablerow:hover, .wpsg_tablerow:hover td, .wpsg_tablerow_hover, .wpsg_tablerow_hover td { background-color:#EFEFEF !important; }
+.wpsg_odd td {  }
+.wpsg_even td {  }
+.wpsg_widerrufstext .wpsg_form_field .wpsg_form_left { width:270px; }
+.wpsg_widerrufstext .wpsg_form_field .wpsg_form_right { width:500px; }
+.wpsg_widerrufstext .wpsg_form_field .wpsg_form_right textarea { height:200px; }
+.tabcontent .wpsg_form_right { width:400px; }
+.tabcontent .wpsg_form_right input, .tabcontent .wpsg_form_right select { width:94%; } 
+.wpsg_mail_head { border-bottom:1px solid #AAAAAA; }
+.wpsg_mail_content, wpsg_admin_box_content { display:none; }
+.wpsg_handlediv .handlediv { position:absolute; right:0px; top:0px; }
+.wpsg_handlediv span a.wpsg_form_help { float:left; display:block; position:relative; top:0px; margin-right:5px; }
+.wpsg_register_modullist { width:100%; }
+.wpsg_register_modullist th { text-align:left; }
+.wpsg_register_modullist .wpsg_col_aktion { text-align:right; }
+.wpsg_modultable { width:100%; }
+.wpsg_modultable tr th { text-align:left; }
+.wpsg_modultable tr .wpsg_col_name { padding-right:25px; }
+.wpsg_modultable tr .wpsg_col_instversion { padding-right:25px; }
+.wpsg_modultable tr .wpsg_col_licence { padding-right:25px; }
+.wpsg_modultable tr .wpsg_col_availableversion { padding-right:25px; }
+.wpsg_admin_vz_list .col_aktion .wpsg_icon_remove { float:right; }
+.wpsg_admin_vz_list .col_aktion { width:75px; }
+.wpsg_admin_vz_list .col_innereu { text-align:center; width:75px; }
+
+/*
+ * Dialog im Backend
+ * z.B. Ãnderung der Adresse in Bestellverwaltung
+ */
+.wpsg_dialog { }
+.wpsg_dialog_content { margin:10px; }
+.wpsg_dialog .wpsg_form_field { box-sizing:border-box; padding-left:5px; padding-right:5px; width:100%; }
+.wpsg_dialog .wpsg_form_field input, .wpsg_dialog .wpsg_form_field select { width:100%; box-sizing:border-box; }
+.wpsg_dialog .wpsg_form_field .wpsg_form_left { width:50%; }
+.wpsg_dialog .wpsg_form_field .wpsg_form_right { width:50%; }
+
+/*
+ * Seitenrefresh im Backend
+ * z.B. in der Bestellverwaltung 
+ */
+#wpsg_backend_loading { position:fixed; z-index:100000; width:100%; height:100%; left:0px; top:0px; background-color:rgba(0, 0, 0, 0.75); } 
+#wpsg_backend_loading .wpsg_inner { color:#FFFFFF; font-size:2rem; margin:auto; text-align:center; margin-top:20%; }
+
+/*
+ * Produktverwaltung
+ */
+.wpsg_produktindex .wpsg_pic_col { width:50px; }
+.wpsg_produktindex #wpsg_product_search_button { background-position:50% 50%; background-repeat:no-repeat; background-image:url('../gfx/lupe.png'); }
+.wpsg_produkt_addedit .wpsg_form_field { width:100%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_left { width:20%; font-weight:bold; line-height:24px; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right { width:80%; float:left; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right input { width:100%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right textarea { width:100%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right_unit input { width:95%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right .wp-editor-wrap input { width:auto !important; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right_unit p.wpsg_unit { width:4%; float:right; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right input.wpsg-datepicker { width:85%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right .ui-datepicker-trigger { margin-left:3px; margin-top:5px; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right select { width:100%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right_help select { width:95%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right input.wpsg_preis { width:60%; }
+.wpsg_produkt_addedit .wpsg_form_field .wpsg_form_right .waehrung { float:right; }
+.wpsg_produkt_addedit #side-info-column .wpsg_form_field .wpsg_form_left { width:50%; }
+.wpsg_produkt_addedit #side-info-column .wpsg_form_field .wpsg_form_right { width:50%; }
+.wpsg_posturl { margin-bottom:5px; }
+
+/*
+ * Bestellverwaltung
+ */
+.wpsg_order_datum { color:#999999; }
+.wpsg_order_adress { color:#999999; }
+.wpsg_order_view .inner-sidebar .wpsg_form_field { width:100%; }
+.wpsg_order_view .inner-sidebar .wpsg_form_field .wpsg_form_left { width:100%; }
+.wpsg_order_view .inner-sidebar .wpsg_form_field .wpsg_form_right { width:100%; margin-top:-5px; }
+.wpsg_order_view #post-body-content .wpsg_form_field { width:100%; }
+.wpsg_order_view #post-body-content .wpsg_form_field .wpsg_form_left { width:20%; min-width:200px; }
+.wpsg_order_view #post-body-content .wpsg_form_field .wpsg_form_right { width:auto; }
+.wpsg_order_view .wpsg_produkte { width:100%; }
+.wpsg_order_view tr.wpsg_kopf th { text-align:left; }
+.wpsg_order_view .wpsg_cell_preis { width:100px; text-align:right !important; padding-right:10px; }
+.wpsg_order_view .wpsg_cell_mwst { width:100px; text-align:right !important; padding-right:10px; }
+.wpsg_order_view .wpsg_cell_menge { width:100px; text-align:center !important; padding-right:10px; }
+.wpsg_order_view .wpsg_cell_gesamtpreis { width:100px; text-align:right !important; }
+.wpsg_order_view .wpsg_cell_summe_value { text-align:right !important; text-decoration:underline; }
+.wpsg_order_view .wpsg_cell_shipping_value { text-align:right !important; }
+.wpsg_order_view .wpsg_cell_payment_value { text-align:right !important; }
+.wpsg_order_view .wpsg_cell_payment_value { text-align:right !important; }
+.wpsg_order_view .wpsg_cell_rabatt_value { text-align:right !important; }
+.wpsg_order_view .wpsg_cell_mwst_value { text-align:right !important; }
+.wpsg_order_view .wpsg_cell_mwst_value, .wpsg_order_view  .wpsg_cell_mwst_label { font-size: 10px; line-height: 18px; }
+.wpsg_order_view .wpsg_cell_gesamt_value { text-align:right !important; font-weight:bold; text-decoration:underline; }
+.wpsg_order_view .wpsg_order_admincomment { width:100%; height:100px; }
+.wpsg_order_view .wpsg_order_admincomment_submit { margin-top:5px; margin-bottom:5px; }
+.wpsg_order_view #wpsg_generally .wpsg_form_left { width:200px; }
+.wpsg_orderlog { width:100%; }
+.wpsg_orderlog .col_date { width:135px; text-align:left; }
+.wpsg_orderlog .col_aktion { width:100px; text-align:right; }
+.wpsg_orderlog .col_title { text-align:left; }
+.wpsg_orderlog .col_mailtext { background-color:#FFFFFF; font-family:monospace; }
+.wpsg_orderlog .col_mailtext textarea { width:100%; height:250px; overflow:scroll; border:0px; background-color:#DSDSDS; border:1px solid #C4C4C4; overflow:auto; max-width:100%; }
+.wpsg_order_index_status { float:none !important; margin:0px 300px 0px 0px; }
+.wpsg_order_index_status .akt { font-weight:bold; color:#000000; }
+.wpsg_order_index_status li { float:left !important; }
+.wpsg_order_index_status li span { line-height:2; padding:0.2em; }
+.wpsg_tablenav { clear:right; float:right; }
+.wpsg-search-box { margin-top:-6px !important; }
+	
+/* 
+ * Produktbilder
+ */
+.wpsg_mod_produktbilder_admin_bild { float:left; margin-right:5px; }
+
+/*
+ * Downloadprodukte
+ */
+.wpsg_mod_downloadprodukte_admin_delete { height:16px; width:16px; float:right; background-image:url('../gfx/delete.png'); cursor:pointer; }
+
+/*
+ * Kundenverwaltung
+ */
+#wpsg_customercomment textarea, #postbox_kunde_kommentar textarea { width:100%; height:150px; }
+.wpsg_mod_kundenverwaltung_customeramount .wpsg_storno { color:#000000; }
+.wpsg_mod_kundenverwaltung_customeramount .wpsg_open { color:#FF0000; }
+.wpsg_mod_kundenverwaltung_customeramount .wpsg_payed { color:#008000; }
+.wpsg_customer_index .wpsg-row-actions > div { visibility:hidden; }
+.wpsg_customer_index .wpsg-row-actions:hover > div { visibility:visible; } /* Bug:? Chrome */
+
+/* Kundengruppenverwaltung */
+.wpsg_mod_kundenverwaltung_customergroup_index .col-id { width:55px; }
+.wpsg_mod_kundenverwaltung_customergroup_index .col-name { }
+.wpsg_mod_kundenverwaltung_customergroup_index .col-customercount { width:150px; }
+.wpsg_mod_kundenverwaltung_customergroup_index .col-calculation { width:150px; }
+.wpsg_mod_kundenverwaltung_customergroup_addedit .wpsg_form_field .wpsg_form_left  { width:100%; }
+.wpsg_mod_kundenverwaltung_customergroup_addedit .wpsg_form_field .wpsg_form_right  { width:100%; }
+
+/*
+ * Versandarten
+ */
+.va_table { width:100%; table-layout:fixed; border-collapse: collapse; }
+.va_table .wpsg_label { font-weight:bold; width:250px; padding:2px; }
+.va_table .wpsg_value { padding:2px; }
+.va_table .wpsg_delcol { position:relative; width:25px; text-align:right; padding:2px 0px 2px 2px; }
+.va_table .wpsg_delcol .wpsg_form_help { position:relative; }
+.va_table .wpsg_delcol a { float:right; }
+.va_table .wpsg_mwst_checkbox { width:20px; }
+
+/*
+ * Rechnungsmoudl
+ */
+.wpsg_mod_rechnungen_fieldtable { width:100%; } 
+.wpsg_mod_rechnungen_fieldtable th { text-align:left; }
+.wpsg_mod_rechnungen_fieldtable th.col_x, .wpsg_mod_rechnungen_fieldtable th.col_y { text-align:center; }
+.wpsg_mod_rechnungen_fieldtable .col_bezeichnung { width:100px; }
+.wpsg_mod_rechnungen_fieldtable .col_freitext { }
+.wpsg_mod_rechnungen_fieldtable .col_x { width:50px; }
+.wpsg_mod_rechnungen_fieldtable .col_y { width:50px; }
+.wpsg_mod_rechnungen_fieldtable .col_color { width:50px; }
+.wpsg_mod_rechnungen_fieldtable .col_groesse { width:50px; }
+.wpsg_mod_rechnungen_fieldtable .col_action { width:50px; }
+.wpsg_foottextlist { width:100%; }
+.wpsg_foottextlist th { text-align:left; }
+.col_standard { text-align:center; width:50px; } 
+
+/* Lieferscheinmodul (wpsg_mod_deliverynote) */
+.wpsg_mod_deliverynote_fieldtable { width:100%; } 
+.wpsg_mod_deliverynote_fieldtable th { text-align:left; }
+.wpsg_mod_deliverynote_fieldtable th.col_x, .wpsg_mod_rechnungen_fieldtable th.col_y { text-align:center; }
+.wpsg_mod_deliverynote_fieldtable .col_bezeichnung { width:100px; }
+.wpsg_mod_deliverynote_fieldtable .col_freitext { }
+.wpsg_mod_deliverynote_fieldtable .col_x { width:50px; }
 .wpsg_mod_deliverynote_fieldtable .col_y { width:50px; }
-.wpsg_mod_deliverynote_fieldtable .col_color { width:80px; }
-.wpsg_mod_deliverynote_fieldtable .col_groesse { width:60px; }
-.wpsg_foottextlist .col_standard { text-align:center; }
-.align-buttons input, .align-buttons input:hover { font-family: FontAwesome !important; cursor: pointer; outline: 0; border: 1px solid #ddd; background: #f9f9f9; color: #666; padding: 3px 7px; width: 30%; }
-.align-buttons-active { background: #f1f1f1 !important; border-color: #ccc !important; box-shadow: 0 1px 0 #ccc; color: #555 !important; }
-.logo-transparency * { text-align:center; }
-.logo-transparency { margin:20px 0; }
-.logo-transparency input { width: 30%; margin-left: -20px; margin-right: 5px; }
-.align-buttons { margin:20px 0; }
-
-#rechnungen_order_backend label,
-#wpsg_rechnungen_email,
-#wpsg_rechnungen_faelligkeitsdatum,
-#wpsg_rechnungen_status_neu,
-#wpsg_rechnungen_datum,
-#wpsg_rechnungen_select,
-#wpsg_rechnungen_fusstext { font-size:12px; font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; color:#333; }
-
-#deliverynote_order_backend label,
-#wpsg_mod_deliverynote_email,
-#wpsg_mod_deliverynote_status,
-#wpsg_mod_deliverynote_date,
-#wpsg_mod_deliverynote_fusstext { font-size:12px; font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; color:#333; }
-
-/* Modul Rabatt */
-.wpsg_mod_discount_hirarchieorder input { display:none;  }
-.wpsg_mod_discount_hirarchieorder li { border:1px solid #C4C4C4; border-radius:5px; width:100%; display:inline-block; margin-bottom:5px; padding:5px 5px 5px 5px; font-size:12px; cursor:move; }
-.wpsg_mod_discount_seriescol { width:33%; float:left; font-size:12px; line-height:30px; }
-.wpsg_mod_discount_seriescol input { width:70%; line-height:20px; float:right; }
-.wpsg_mod_discount_seriescol:nth-child(2) strong { width:70%; float:right; }
-
-#beschreibung_ifr { height:500px; }
-
-/* Modul Downloadplus */
-.wpsg_mod_downloadplus_fieldtable { font-size:12px; }
-.wpsg_mod_downloadplus_fieldtable .col_x,
-.wpsg_mod_downloadplus_fieldtable .col_y { width:50px; }
-
-/* Produktvariablen */
+.wpsg_mod_deliverynote_fieldtable .col_color { width:50px; }
+.wpsg_mod_deliverynote_fieldtable .col_groesse { width:50px; }
+.wpsg_mod_deliverynote_fieldtable .col_action { width:50px; }
+
+/*
+ * Videodownload Modul
+ */
+.wpsg_mod_videodownload_fieldtable { width:100%; } 
+.wpsg_mod_videodownload_fieldtable th { text-align:left; }
+.wpsg_mod_videodownload_fieldtable .col_bezeichnung { width:25px; }
+.wpsg_mod_videodownload_fieldtable .col_freitext_label { font-weight:bold; }
+.wpsg_mod_videodownload_fieldtable .col_freitext { }
+.wpsg_mod_videodownload_fieldtable .col_x { width:35px; }
+.wpsg_mod_videodownload_fieldtable .col_y { width:35px; }
+.wpsg_mod_videodownload_fieldtable .col_color { width:50px; }
+.wpsg_mod_videodownload_fieldtable .col_alpha { width:35px; }
+.wpsg_mod_videodownload_fieldtable .col_align { width:35px; text-align:center; }
+.wpsg_mod_videodownload_fieldtable .col_angle { width:50px; }
+.wpsg_mod_videodownload_fieldtable .col_groesse { width:50px; }
+.wpsg_mod_videodownload_fieldtable .col_font { width:150px; }
+.wpsg_mod_videodownload_fieldtable .col_font select { width:100%; }
+.wpsg_mod_videodownload_fieldtable .col_action { width:75px; }
+.wpsg_mod_videodownload_admin_delete { height:16px; width:16px; float:right; background-image:url('../gfx/delete.png'); cursor:pointer; }
+.wpsg_mod_videodownload_order_view_filelist { width:100%; }
+.wpsg_mod_videodownload_order_view_filelist .col_file { text-align:left; }
+.wpsg_mod_videodownload_order_view_filelist .col_status { text-align:left; }
+.wpsg_mod_videodownload_order_view_filelist .col_action { text-align:left; }
+.wpsg_mod_videodownload_order_view_filelist .row_raid td { color:red; }
+
+/*
+ * PDFdownload Modul
+ */
+.wpsg_mod_downloadplus_fieldtable { width:100%; } 
+.wpsg_mod_downloadplus_fieldtable th { text-align:left; }
+.wpsg_mod_downloadplus_fieldtable .col_bezeichnung { width:25px; }
+.wpsg_mod_downloadplus_fieldtable .col_freitext_label { font-weight:bold; }
+.wpsg_mod_downloadplus_fieldtable .col_freitext { }
+.wpsg_mod_downloadplus_fieldtable .col_x { width:35px; }
+.wpsg_mod_downloadplus_fieldtable .col_y { width:35px; }
+.wpsg_mod_downloadplus_fieldtable .col_color { width:50px; }
+.wpsg_mod_downloadplus_fieldtable .col_alpha { width:35px; }
+.wpsg_mod_downloadplus_fieldtable .col_align { width:35px; text-align:center; }
+.wpsg_mod_downloadplus_fieldtable .col_bg { width:35px; text-align:center; }
+.wpsg_mod_downloadplus_fieldtable .col_angle { width:50px; }
+.wpsg_mod_downloadplus_fieldtable .col_groesse { width:50px; }
+.wpsg_mod_downloadplus_fieldtable .col_font { width:150px; }
+.wpsg_mod_downloadplus_fieldtable .col_font select { width:100%; }
+.wpsg_mod_downloadplus_fieldtable .col_action { width:75px; }
+.wpsg_mod_downloadplus_admin_delete { height:16px; width:16px; float:right; background-image:url('../gfx/delete.png'); cursor:pointer; }
+.wpsg_mod_downloadplus_order_view_filelist { width:100%; }
+.wpsg_mod_downloadplus_order_view_filelist .col_file { text-align:left; }
+.wpsg_mod_downloadplus_order_view_filelist .col_status { text-align:left; }
+.wpsg_mod_downloadplus_order_view_filelist .col_action { text-align:left; }
+.wpsg_mod_downloadplus_order_view_filelist .row_raid td { color:red; } 
+.wpsg_mod_downloadplus_security input { float:left; width:auto !important; }
+.wpsg_mod_downloadplus .wpsg_border_bottom td { border-top:1px solid #DEDEDE; height:1	px; }
+
+/*
+ * Variantenverwaltung
+ */
+#wpsg_vp_drawVarianten div.wpsg_editable { width:auto; display:inline-block; }
+#wpsg_vp_drawVarianten .col_preis { width:150px; text-align:left; }
+#wpsg_vp_drawVarianten .col_fmenge { width:100px; text-align:left; }
+#wpsg_vp_drawVarianten .col_variname { width:350px; }
+#wpsg_vp_drawVarianten .col_variartnr { width:200px; text-align:left; }
+#wpsg_vp_drawVarianten .col_stock { width:100px; text-align:left; }
+#wpsg_vp_drawVarianten .wpsg_mod_varianten_productimage_row .pic { display:block; float:left; margin-right:5px; padding:5px; height:25px; width:25px; }
+#wpsg_vp_drawVarianten .wpsg_mod_varianten_productimage_row .mark { background-color:rgb(174, 174, 174); }
+#wpsg_vp_drawVarianten .wpsg_mod_varianten_orderwrap_image .wpsg_mod_varianten_productimage_row .mark:first-of-type { background-color:black; }
+#wpsg_vp_drawVarianten .wpsg_mod_varianten_ajaxloading { width:100%; height:100%; position:absolute; left:0px; top:0px; background-color:rgba(125, 125, 125, 0.5); margin-top:-10px; padding-bottom:21px; }
+#wpsg_vp_drawVarianten .wpsg_mod_varianten_ajaxloading img { position:absolute; left:50%; top:50%;  margin-left:-8px; margin-top:-5.5px; }
+
+/*
+ * Gutscheinmodul
+ */
+.wpsg_mod_gutschein .vouchertable { width:100%; }
+.wpsg_mod_gutschein .column-checkbox { width:25px; text-align:center; }
+.wpsg_mod_gutschein .column-nr { width:50px; text-align:left; }
+
+/*
+ * Related Products
+ */
+.wpsg_productselect { padding:15px; }
+.wpsg_productselect .wpsg_form_field { width:100%; }
+.wpsg_productselect .wpsg_form_left { width:50%; }
+.wpsg_productselect .wpsg_form_right { width:50%; }
+.wpsg_productselect .wpsg_form_right select { float:right; }
+#relatedproducts_list select { width:105px !important; }
+#relatedproducts_list .wpsg_icon { margin-top:5px; }
+
+/* Export Profile */
+#profil_content .wpsg_form_field { width:745px; }
+#profil_content .wpsg_form_field .wpsg_form_right { width:395px; min-height:24px; line-height:24px; }
+#profil_content #message { margin-left:0px; }
+#profil_content .wpsg_mod_export_fieldlist { width:100%; }
+#profil_content .wpsg_mod_export_fieldlist th { text-align:left; padding:2px 5px 2px 0px; }
+#profil_content .wpsg_mod_export_fieldlist td { text-align:left; padding:2px 5px 2px 0px; }
+#profil_content .wpsg_mod_export_fieldlist .odd td { background-color:#DEDEDE; }
+#profil_content .wpsg_mod_export_fieldlist .even { }
+#profil_content .wpsg_mod_export_col_field_user { font-weight:bold; }
+#wpsg_modexport .wpsg_mod_export_profillabel { margin-right:15px; display:block; float:left; }
+
+/* Produktvariablen */ 
 .wpsg_pv_table { width:100%; }
 .wpsg_pv_table tr td { vertical-align:top; }
@@ -489,13 +504,4 @@
 .wpsg_pv_table .wpsg_label { text-align:left; }
 
-/* Produktattribute */
-.wpsg_pa_table { width:100%; }
-.wpsg_pa_table tr td { vertical-align:top; }
-.wpsg_pa_table .wpsg_id { width:20px; text-align:left; cursor:move; }
-.wpsg_pa_table .wpsg_action { width:80px; text-align:center; }
-.wpsg_pa_table .wpsg_typ { width:150px; text-align:left; }
-.wpsg_pa_table .wpsg_show { width:100px; text-align:center; }
-.wpsg_pa_table .wpsg_label { text-align:left; }
-
 /* Bestellvariablen */
 .wpsg_ov_table { width:100%; }
@@ -505,7 +511,4 @@
 .wpsg_ov_table .wpsg_pflicht { width:100px; text-align:center; }
 .wpsg_ov_table .wpsg_label { text-align:left; }
-
-/* News Bereich Backend */
-.wpsg_news_wrap { margin-right:20px; }
 
 /* Statistikmodul */
@@ -518,32 +521,161 @@
 .subsubsub #table-data .td-right { text-align:right; }
 
-/* Download plus */
-.wpsg_mod_downloadplus_order_view_filelist { width:100%; }
-.wpsg_mod_downloadplus_order_view_filelist .col_file { text-align:left; }
-.wpsg_mod_downloadplus_order_view_filelist .col_status { text-align:left; width:200px; }
-.wpsg_mod_downloadplus_order_view_filelist .col_counter { text-align:center; width:100px;}
-.wpsg_mod_downloadplus_order_view_filelist .col_action { text-align:left; width:100px;}
-.wpsg_mod_downloadplus_order_view_filelist .row_raid td { color:red; }
-
-/* Passwort Visualisierung */
-#wpsg_pwd_info { width:250px; background:#fefefe; width:85%; padding:25px; border-radius:5px; box-shadow:0 1px 3px #ccc; border:1px solid #ddd; }
-#wpsg_pwd_info::before { position:absolute; font-size:14px; text-shadow:none; disblay:block; color:#ddd; line-height:14px; display:none; }
-#wpsg_pwd_info ul li { margin:10px 20px; display:block; }
-.invalid { padding-left:22px; line-height:24px; color:#ec3f41; }
-.valid { padding-left:22px; line-height:24px; color:#3a7d34; }
-
-@media (min-width:1024px) and (max-width:1640px) {
-
-
-}
-
-
-@media (min-width:768px) and (max-width:1023px) {
-
-
-}
-
-@media (min-width:375px) and (max-width:767px) {
-
-
-}
+/* Zahlvarianten */
+.zv_table { width:100%; table-layout:fixed; border-collapse: collapse; }
+.zv_table .wpsg_label { font-weight:bold; width:250px; padding:2px; }
+.zv_table .wpsg_value { padding:2px; }
+.zv_table .wpsg_delcol { width:25px; position:relative; text-align:right; padding:2px 0px 2px 2px; }
+.zv_table .wpsg_delcol .wpsg_form_help { position:relative; top:0px; }
+.zv_table .wpsg_delcol a { float:right; }
+.zv_table .wpsg_mwst_checkbox { width:20px; }
+
+/* Auftragsbestï¿œtigung */
+.wpsg_order_view_auftragsbestaetigung { width:100%; }
+.wpsg_order_view_auftragsbestaetigung_submit { margin-top:5px; margin-bottom:5px; }
+
+/* Rabattmodul */
+.wpsg_mod_discount_generalcol { float:left; width:33%; }
+.wpsg_mod_discount_seriescol { float:left; width:50%; line-height:25px; vertical-align:middle; }
+.wpsg_mod_discount_seriescol_sub { width:25%; }
+.wpsg_mod_discount_seriescol input[type=text] { width:70% !important; }
+.wpsg_mod_discount_seriescol input[type=checkbox] { width:auto !important; margin-right:5px; }
+.wpsg_mod_discount_settings #wpsg_mod_discount_hierarchie ul { margin-top:0px; }
+.wpsg_mod_discount_settings #wpsg_mod_discount_hierarchie input[type="checkbox"] { width:auto; }
+.wpsg_mod_discount_settings #wpsg_mod_discount_hierarchie ul li { padding-left:5px; width:96%; line-height:25px; height:25px; background-color:#DDDDDD; cursor:move; }
+.wpsg_mod_discount_settings #wpsg_mod_discount_hierarchie ul li input { display:none; }
+
+/* Registrierung */
+.wpsg_registerform { padding:10px; }
+.wpsg_registersuccess { color:green; }
+.wpsg_registerfailure { color:red; }
+
+/* Berechtigungsverwaltung */
+.wpsg_access_table { width:100%; table-layout:fixed; margin-top:50px; }
+.wpsg_access_table .wpsg_col_capname { width:150px; padding-right:25px; }
+.wpsg_access_table th.wpsg_col_cap { -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); height:40px; text-align:center; width:25px; }
+.wpsg_access_table td.wpsg_col_cap { text-align:center; }
+
+/* Gutscheinproduktmodul */
+.wpsg_mod_voucherproduct_list .wpsg_mod_voucherproduct_code { float:left; }
+.wpsg_mod_voucherproduct_list .wpsg_mod_voucherproduct_status { width:auto; float:right; text-align:right; }
+#wpsg_voucherproduct_target .wpsg_button { float:left; }
+
+/* Statistimodul */
+#wpsg_statistics_form .wpsg_form_field .wpsg_form_left { width:70px; }
+.wpsg-table-data-wrapper { float:left; margin-right:15px; }
+td.jqplot-table-legend { vertical-align:middle !important; white-space:no-wrap !important; }
+.orderdown .sorting-indicator { background-image: url("../../../../../wp-admin/images/sort.gif"); background-position:0% 50%; display:inline-block; height:10px; width:7px; }
+.orderup .sorting-indicator { background-image: url("../../../../../wp-admin/images/sort.gif"); background-position:100% 50%; display:inline-block; height:10px; width:7px; }
+.orderdown span, .orderup span { cursor: pointer; float:none !important; }
+
+/* Bankabgleichsmodul (mod_bankalignment) */
+.wpsg_mod_bankalignment_order_ajax .row-details { font-family:monospace; display:none; }
+
+/* E-Bay Schnittstelle (mod_ebay) */
+#wpsg_mod_ebay_categorieselect_dialog { padding:10px; }
+#wpsg_mod_ebay_categorieselect_dialog select { width:100%; }
+#wpsg_mod_ebay_categorietext { float:left; }
+.wpsg_mod_ebay_cattarget img { margin-top:5px; }
+
+/* Staffelpreismodul (mod_scaleprice) */
+.wpsg_mod_scaleprice_label_scale { float:left; width:25%; font-weight:normal; }
+.wpsg_mod_scaleprice_label_value { float:right; width:25%; text-align:center; font-weight:normal; }
+.wpsg_mod_scaleprice_value { width:48% !important; float:left !important; }
+.wpsg_mod_scaleprice_scale { width:48%; float:left; }
+.wpsg_mod_scaleprice_row .wpsg_form_left .wpsg_editable { width:48%; float:left; text-align:right; font-weight:normal; }
+.wpsg_mod_scaleprice_row .wpsg_form_right .wpsg_editable { line-height: 24px; text-align:right; width:48%; float:left; font-weight:normal; }
+#wpsg_mod_scaleprice_target p.waehrung { width:25%; float:left; padding-top:3px; }
+#wpsg_mod_scaleprice_target .wpsg_icon_add { margin-top:3px; }
+#wpsg_mod_scaleprice_target .wpsg_icon_remove { margin-top:3px; }
+
+/* Hï¿œndlerbund (mod_haendlerbund) */
+.wpsg_mod_haendlerbund_settings .wpsg_mod_haendlerbund_date { float:right; line-height:25px; margin-right:25px; }
+
+/* Rechtstexte */
+.wpsg_ps_update input[type="checkbox"] { width:auto !important; margin-top:5px; margin-right:5px; float:left; }
+
+/* Micropayment (mod_micropayment) */
+#wpsg_mod_micropayment_handypay_infolayer, #wpsg_mod_micropayment_call2pay_infolayer { line-height:0.65rem; padding-top:0.5rem; padding-bottom:0.5rem; }
+#wpsg_mod_micropayment_handypay_infolayer ul, #wpsg_mod_micropayment_call2pay_infolayer ul { list-style:circle; margin-left:15px; }
+
+.wpsg_mod_test_table table { width:100%; }
+.wpsg_mod_test_table table th { text-align:left; font-size:12px; line-height:16px; }
+.wpsg_mod_test_table table td { test-align:left; font-size:12px; line-height:16px; }
+
+/* Hilfetooltip */
+.cluetip-title { background-color:#767676 !important; color:#FFFFFF !important; }
+.cluetip-title a { color:#FFFFFF !important; }
+.cluetip-inner { background-color: #F7F7F7; }
+.clue-left-default .cluetip-arrows { background-image:url('../gfx/darrowright.gif') !important; margin-top:5px !important; }
+.clue-right-default .cluetip-arrows { background-image:url('../gfx/darrowleft.gif') !important; margin-top:5px !important; }
+
+/* Bankeinzug (wpsg_mod_autodebit) */
+input.wpsg_mod_autodebit_button { width:100% !important; }
+
+/* 3.8 Kompatibilitï¿œt */
+.version-3-8 .wpsg_order_view .inner-sidebar .wpsg_form_field .wpsg_form_left { width:40%; }
+.version-3-8 .wpsg_order_view .inner-sidebar .wpsg_form_field .wpsg_form_right { width:60%; }
+
+/* Modul "Wirecard" */
+.wpsg_mod_wirecard_paymenttypeselect input[type="checkbox"] { width:auto; margin-left:5px; margin-top:-3px; }
+.wpsg_mod_wirecard_paymenttypeselect li { padding-left:5px; width:100%; line-height:25px; height:25px; background-color:#DDDDDD; cursor:move; }
+
+/* Modul "Bestellbedingungen" */
+.wpsg_mod_ordercondition_text { width:100%; height:300px; }
+
+/* Modul "Kundenkontakt" */
+#kk_text { font-family:"Courier New"; }
+
+/* Rechtstexte */
+.wpsg_mod_legaltexts_protectedshops_table { width:100%; }
+.wpsg_mod_legaltexts_protectedshops_table th { text-align:left; width:343px; }
+.wpsg_ps_update { float:right; }
+.wpsg_ps_status { float:left; }
+select.wpsg_ps_page { width:73%; }
+select.wpsg_ps_format { float:right; width:23%; }
+#wpshopgermany_ts_shopid { width:100%; }
+#wpsgitrecht_message { margin-left:5px; }
+.wpsgitrecht_clear { clear:both; }
+.wpsgitrecht_form_field { width:770px; margin-bottom:5px; }
+.wpsgitrecht_form_field .wpsgitrecht_form_left { line-height:24px; font-weight:bold; width:350px; float:left; }
+.wpsgitrecht_form_field .wpsgitrecht_form_right { width:420px; float:left; position:relative; line-height:28px; }
+.wpsgitrecht_form_field .wpsgitrecht_form_right select, .wpsgitrecht_form_field .wpsgitrecht_form_right input { width:95%; }
+.wpsgitrecht_form_field .wpsgitrecht_form_right input.checkbox { width:auto !important; float:left; margin-left:2px; margin-top:5px; }
+.wpsgitrecht_form_field .wpsgitrecht_form_right p { padding:4px 0px 4px 6px; margin:0px; }
+.wpsgitrecht_form { padding:10px; }
+.wpsgitrecht_date { float:right; padding-right:5%; }
+.wpsgitrecht_hinweis { font-style:italic; }
+.wpsgitrecht_table { border-spacing:0px; border-collapse:collapse; }
+.wpsgitrecht_table .col0 { width:347px; }
+.wpsgitrecht_table .col1 { width:400px; }
+.wpsgitrecht_table .col1 p { padding:2px 0px 2px 10px; display:inline-block; margin:0px; }
+.wpsgitrecht_table .col1 select { width:100%; }
+.wpsg_itrecht_generatebutton { width:16px; height:16px; background-image:url('../gfx/arrow_refresh_small.png'); ?>); display:inline-block; float:right; margin-top:6px; }
+
+/* Modul "Paketverfolgung" */
+.wpsg_mod_packagetracking_settings_edit_list .trackingprovider_table { width:100%; table-layout:fixed; border-collapse: collapse; }
+.wpsg_mod_packagetracking_settings_edit_list .trackingprovider_table .wpsg_label { font-weight:bold; width:150px; padding:2px; }
+.wpsg_mod_packagetracking_settings_edit_list .trackingprovider_table .wpsg_value { padding:2px; }
+.wpsg_mod_packagetracking_settings_edit_list .trackingprovider_table .wpsg_delcol { position:relative; width:25px; text-align:right; padding:2px 0px 2px 2px; }
+.wpsg_mod_packagetracking_settings_edit_list .trackingprovider_table .wpsg_delcol .wpsg_form_help { position:relative; }
+.wpsg_mod_packagetracking_settings_edit_list .trackingprovider_table .wpsg_delcol a { float:right; }
+.wpsg_mod_versandarten_packagetracking .wpsg_mod_packagetracking_provider { width:100%; }
+
+/* Modul CrefoPay */
+.wpsg_mod_crefopay_order_sidebar .button { margin-right:5px; margin-top:5px; float:left; }
+.wpsg_mod_crefopay_mnsstatemapping { display:none; }
+.wpsg_mod_crefopay_mnsstatemapping .wpsg_form_field { margin-bottom:0px; }
+
+/* Modul TrustedShops */
+.wpsg_mod_protectedshops #wpsg_mod_trustedshops_reminderDays { width:50px; float:left; margin-right:5px; }
+.wpsg_mod_protectedshops .wpsg_form_field .wpsg_form_trustedshops_reminderDays p { float:left; padding-right:5px; padding-left:2px; } 
+ 
+/* News Bereich */
+.wpsg_news_wrap {}
+.wpsg_news_wrap .wpsg_news .markRead { text-align:right; width:100px; display:none; position:absolute; right:15px; top:15px; }
+.wpsg_news_wrap .wpsg_news_read .markRead img { float:right; margin-left:5px; }
+.wpsg_news_wrap .wpsg_news { width:100%; box-sizing:border-box; position:relative; padding:5px 10px 10px 10px; margin-bottom:15px; background-color:#FFFFFF; }
+.wpsg_news_wrap .wpsg_news h2 a { text-decoration:none; color:inherit !important; }
+.wpsg_news_wrap .wpsg_news_read {  }
+.wpsg_news_wrap .wpsg_news_read .markRead { display:block; }
+.wpsg_news_unreadhint { color:#FFFFFF; background-color:#FF0000; padding:0px 4px; line-height:16px; font-size:8px; display:inline-block; font-weight:bold; border-radius:15px; width:8px; text-align:center; vertical-align:top; margin-top:4px; margin-left:0px; }
Index: /views/css/frontend.css
===================================================================
--- /views/css/frontend.css	(revision 8528)
+++ /views/css/frontend.css	(revision 5261)
@@ -3,13 +3,9 @@
 /* Allgemein */
 .wpsg_clear { clear:both; }
-#wpsg_error, #wpsg_message { margin-bottom:1rem; margin-left:0; }
-#wpsg_message li, #wpsg_error li, #wpsg_notice li,
-#wpsg_message p, #wpsg_error p, #wpsg_notice p { list-style:none; margin-bottom:4px; padding:3px 0px 3px 8px; }
-#wpsg_message li,
-#wpsg_message p { border-left:4px solid #7AD03A; margin-left:0; }
-#wpsg_notice li,
-#wpsg_notice p { border-left:4px solid #FDF60A; margin-left:0; }
-#wpsg_error li,
-#wpsg_error p { border-left:4px solid #DD3D36; margin-left:0; }
+#wpsg_error, #wpsg_message { margin-bottom:1rem; }
+#wpsg_message p, #wpsg_error p, #wpsg_notice p { background-color:#FAFAFA; margin-bottom:4px; padding:3px 0px 3px 8px; } 
+#wpsg_message p { border-left:4px solid #7AD03A; }
+#wpsg_notice p { border-left:4px solid #FDF60A; }
+#wpsg_error p { border-left:4px solid #DD3D36; }
 .wpsg_error { border-color:#DD3D36; }
 .wpsg { }
@@ -20,4 +16,5 @@
 .wpsg_spacer { width:100%; height:1px; background-color:#EAEAEA; margin-bottom:1rem; }
 .wpsg_noscroll { overflow:hidden; }
+#TB_ajaxContent { width:100% !important; }
 .wpsg_upper { vertical-align:top; font-size:60%; }
 
@@ -26,66 +23,33 @@
 
 /* Basket */
-.basket_product_wrap {}
-.basket_product_wrap .basket_product_row { display:flex; align-items:baseline; border-bottom:1px solid #EAEAEA; padding-bottom:1em; margin-bottom:1em; }
-.basket_product_wrap .basket_product_row .product_shortdesc { margin-top:0.5em; }
-.basket_product_wrap .basket_product_row .productimage { max-width:150px; padding-right:0.75em; }
-.basket_product_wrap .basket_product_row .product_content { width:100%; display:flex; flex-direction:column; justify-content:space-between; }
-.basket_product_wrap .basket_product_row .product_action { display:flex; width:100%; justify-content:space-between; align-items:center; }
-.basket_product_wrap .basket_product_row .product_action .amount { width:100px; padding-right:40px; position:relative; margin-top:0.5em; margin-bottom:0.5em; text-align:center;}
-.basket_product_wrap .basket_product_row .product_action .amount .wpsg_basket_removelink { -webkit-box-shadow:none; box-shadow:none; text-decoration:none; border:0px !important; position:absolute; right:5px; top:50%; margin-top:-8px; }
-.basket_product_wrap .basket_product_row .product_action .title { width: 60%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.basket_product_wrap .basket_product_row .product_action .price { width: 39%; display:inline-block; text-align:right; }
-.basket_product_wrap .basket_product_row .product_action .price_total { width: 39%; display:inline-block; font-weight:bold; text-align:right; }
-.basket_product_wrap .basket_product_row .product_info { display:flex; width:100%; justify-content:space-between; align-items:center; margin-bottom:0.25rem; }
-.basket_product_wrap .basket_product_row .product_upload {  }
-.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target { margin-left:15px; flex-grow:1; }
-.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target ul { margin:0px; }
-.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target li { display:flex; justify-content:space-between; }
-.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target li a.removeLink { text-decoration:none; box-shadow:none; align-self:center; }
-.basket_product_wrap .basket_product_row .product_upload ul li { list-style:none; }
-.basket_product_wrap .basket_product_row .product_info .titlep { min-width:120px; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.basket_product_wrap .basket_product_row .product_info .title { display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.basket_product_wrap .basket_product_row .product_info .valuel { width: 50%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_product_wrap .basket_product_row .product_info .valuer { width: 50%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_product_wrap .basket_product_row .product_info .fulll { width: 80%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_product_wrap .basket_product_row .product_info .dummyr { width: 19%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_product_wrap .basket_product_row .product_info .dummy { flex-grow:1; width:90px; }
-.basket_product_wrap .basket_product_row .product_info .dummyp { flex-grow:1; width:110px; }
-.basket_sum_wrap .basket_sum_row { display:flex; width:100%; justify-content:space-between; align-items:center; }
-.basket_sum_wrap .basket_sum_row .title { width: 80%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.basket_sum_wrap .basket_sum_row .title2 { width: 80%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.basket_sum_wrap .basket_sum_voucher .title,
-.basket_sum_wrap .basket_sum_coupon .title { display:flex; justify-content:flex-start; align-items:center; }
-.basket_sum_wrap .basket_sum_voucher .title a,
-.basket_sum_wrap .basket_sum_coupon .title a { margin-right:0.5rem; }
-.basket_sum_wrap .basket_sum_row .value { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_sum_wrap .basket_sum_row .valuel { width: 20%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_sum_wrap .basket_sum_row .sum { width: 20%; display:inline-block; font-weight:bold; text-align:right; }
-.basket_sum_wrap .basket_sum_row .delgs { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_sum_wrap .basket_sum_row .codegs { width: 40%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_sum_wrap .basket_sum_row .codegsf { display:inline-block; font-weight:normal; text-align:left; }
-.basket_sum_wrap .basket_sum_row .codegsl { width: 30%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_sum_wrap .basket_sum_row .codegsr { width: 30%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_sum_wrap .basket_sum_row .colgsl { width: 20%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_sum_wrap .basket_sum_row .colgsr { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_sum_wrap .basket_sum_row .titlegs { width: 80%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.basket_sum_wrap .wpsg_mod_basketteaser_row { display:flex; width:100%; justify-content:space-between; align-items:center; }
-.basket_sum_wrap .wpsg_mod_basketteaser_row .valuer { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.basket_sum_wrap .wpsg_mod_basketteaser_row .valuel { width: 20%; display:inline-block; font-weight:normal; text-align:left; }
-.basket_sum_wrap .wpsg_gutschein_add {padding:0.75em 1em;}
-.procent_payship { font-size:0.75em; line-height:0.75em; color:#666666; displaY:block; margin-bottom:10px; }
-/* .glyphicon {width:20px !important; text-decoration:none; position:relative; display:inline-block; font-family:'Glyphicons Halflings'; line-height:1rem;} */
-
-.wpsg_basket .wpsg_checkoutbutton { float:right; padding:0.75em 1em; }
+.wpsg_basket { margin-bottom:1rem; }
+.wpsg_basket h2 { }
+.wpsg_basket table { margin-top:1rem; width:100%; }
+.wpsg_basket table th { } 
+.wpsg_basket .wpsg_basket_removelink { text-decoration:none; border:0px !important; }
+.wpsg_basket .wpsg_cell_number { padding-left:0.3rem; padding-right:0.3rem; text-align:center; min-width:20px; }
+.wpsg_basket .wpsg_cell_number img { max-width:auto !important; display:inline-block; }
+.wpsg_basket .wpsg_cell_menge { text-align:center; }
+.wpsg_basket .wpsg_cell_menge input {  text-align:center; }
+.wpsg_basket .wpsg_cell_preis { text-align:right; }
+.wpsg_basket .wpsg_cell_gesamtpreis { text-align:right; }
+.wpsg_basket .wpsg_cell_summe_value { text-align:right; }
+.wpsg_basket .wpsg_cell_shipping_value { text-align:right; }
+.wpsg_basket .wpsg_cell_shipping_label select,
+.wpsg_basket .wpsg_cell_shipping_label span { float:right; width:150px;clear:right; }
+.wpsg_basket .wpsg_cell_shipping_label select.set_shipping { margin-bottom:5px; }
+.wpsg_basket .wpsg_cell_payment_label select,
+.wpsg_basket .wpsg_cell_payment_label span  { float:right; width:150px; }
+.wpsg_basket .wpsg_cell_payment_value { text-align:right; }
+.wpsg_basket .wpsg_cell_gesamtsumme_value { text-align:right; }
+.wpsg_basket .wpsg_cell_deliverytime_value { text-align:right; }
+.wpsg_basket .wpsg_cell_name { vertical-align:middle; }
+.wpsg_basket .wpsg_cell_name .wpsg_basket_productimage { display:inline; padding-right:0.2rem; vertical-align:baseline; }
+.wpsg_basket .wpsg_cell_mwst { text-align:center; min-width:60px; }
+.wpsg_basket .wpsg_cell_mwst_value { text-align:right; }
+.wpsg_basket .wpsg_cell_weight_value { text-align:right; }
+.wpsg_basket .wpsg_checkoutbutton { float:right; }
 .wpsg_basket .wpsg_cell_gesamtsumme_value { font-weight:bold; }
-.wpsg_checkout2 .wpsg_overviewbutton,
-.wpsg_checkout2 .wpsg_checkoutbutton,
-.wpsg_overview .wpsg_orderbutton,
-.wpsg_overview .wpsg_checkoutbutton,
-.wpsg_basket .wpsg_refreshbutton, .wpsg_checkout2button, .wpsg_basketbutton { float:left; padding:0.75em 1em; }
-.wpsg_basket .wpsg_basket_weiter_shoppen {background:#1a1a1a none repeat scroll 0 0; border:0 none; border-radius:2px; color:#fff; font-weight:700; line-height:1; text-transform:uppercase; padding:0.85em 0.875em 0.78em;}
-.wpsg_basket .product_action_printshop .label { align-self:flex-start; }
-.wpsg_basket .product_action_printshop .files ul li { list-style:none; display:flex; align-items:center; justify-content:flex-end; }
-.wpsg_basket .product_action_printshop .files ul li img { margin-left:5px; cursor:pointer; }
+.wpsg_basket .wpsg_refreshbutton, .wpsg_basketbutton { float:left; }
 
 /* Checkout + Request*/
@@ -93,6 +57,4 @@
 .wpsg_checkout .wpsg_checkoutblock label { vertical-align:middle; }
 .wpsg_checkout .wpsg_checkoutblock input.wpsg_input_text,
-.wpsg_checkout .wpsg_checkoutblock input[type="tel"],
-.wpsg_checkout .wpsg_checkoutblock input[type="fax"],
 .wpsg_checkout .wpsg_checkoutblock input[type="text"], 
 .wpsg_checkout .wpsg_checkoutblock input[type="number"], 
@@ -100,18 +62,12 @@
 .wpsg_checkout .wpsg_checkoutblock input[type="checkbox"] { width:auto; margin-right:5px; }
 .wpsg_checkout .wpsg_checkoutblock select { box-sizing:border-box; width:100%; margin-bottom:5px; }
-.wpsg_checkout .wpsg_checkoutblock .g-recaptcha { float:right; margin-top:15px; }
 .wpsg_checkout .wpsg_mandatoryfield_hint { margin-top:1rem; }
 .wpsg_checkout .wpsg_required { font-weight:bold; color:#FF0000; }
 .wpsg_checkout .wpsg_checkout2button { float:right; }
 .wpsg_checkout .wpsg_mod_ordervars { margin-bottom:1rem; }
-.wpsg_checkout .wpsg_required { color:#ff0000; }
-.wpsg_checkout h2 { font-weight:bold; padding:10px 0; }
 .wpsg_checkout .wpsg_commentblock textarea { box-sizing:border-box; padding:2px; width:100%; height:150px; }
 .wpsg_checkout .wpsg_logout_box a { float:right; border-bottom:0px; padding:15px; font-weight:bold; color:#FF0000; font-weight:bold; color:#fff; background-color:#333; }
-.wpsg_checkout #wpsg_streetnr.wpsg_checkoutblock { display:flex; flex-direction:row; width:100%; }
-.wpsg_checkout #wpsg_streetnr.wpsg_checkoutblock .street { flex-grow:1; padding-right:15px; }
-.wpsg_checkout #wpsg_streetnr.wpsg_checkoutblock .nr input {width: 100%;}
-	
-	/* Checkout2 */ 
+
+/* Checkout2 */ 
 .shippay_wrap { margin-top:40px; width:100%; font-family:Arial; padding-right:10px; }
 .wpsg_payment .wpsg_payment_textwrap { margin-top:40px; }
@@ -123,5 +79,5 @@
 .shippay_wrap .shippay_active .wpsg_payship_name { font-weight:bold; }
 .shippay_wrap .shippay_item_wrap:last-child { border-bottom:1px solid #DFDFDF; }
-.shippay_wrap .shippay_item_wrap input[type="radio"] { display:none; }
+.shippay_wrap .shippay_item_wrap input { display:none; }
 .shippay_wrap .shippay_item_wrap .shippay_checkmark { display:none; width:23px; height:18px; background-image:url('../gfx/checkmark.png'); background-repeat:no-repeat; position:absolute; right:10px; top:16px; }
 .shippay_wrap .shippay_active .shippay_checkmark { display:block; }
@@ -134,9 +90,10 @@
 .wpsg_overview .wpsg_agb { width:100%; clear:both; margin-bottom:2px; }
 .wpsg_overview .wpsg_agb label { line-height:18px; }
+.wpsg_overview .wpsg_agb input[type="checkbox"] { width:auto; /*margin-top:10px; margin-right:10px;*/ }
 .wpsg_overview .shippayment { margin-top:1rem; float:right; width:45%; }
 .wpsg_overview .anschrift { margin-top:1rem; float:left; width:55%; }
 .wpsg_overview .subtitle { font-weight:bold; margin-bottom:0.5rem; }
 .wpsg_overview .wpsg_orderbutton { float:right; }
-.wpsg_overview .wpsg_table_wrap { background-color:#FFF; margin:10px -10px 10px -10px; padding:10px; }
+.wpsg_overview .wpsg_table_wrap { background-color:#EAEAEA; margin:10px -10px 10px -10px; padding:10px; }
 .wpsg_overview .wpsg_table_wrap table { width:100%; }
 .wpsg_overview .wpsg_table_wrap td, .wpsg_overview .wpsg_table_wrap th { }
@@ -153,48 +110,10 @@
 .wpsg_overview .wpsg_cell_weight_value { text-align:right; }
 .wpsg_overview .wpsg_cell_deliverytime_value { text-align:right; }
-.wpsg_overview {
-	.einvoice_input { margin-bottom:2rem; }
-}
-
-.wpsg_overview .wpsg_table_wrap {}
-.wpsg_overview .wpsg_table_wrap .overview_product_row { display:flex; align-items:baseline; border-bottom:1px solid #EAEAEA; padding-bottom:1em; margin-bottom:1em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_shortdesc { margin-top:0.5em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .productimage { max-width:150px; padding-right:0.75em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_content { width:100%; display:flex; flex-direction:column; justify-content:space-between; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action { display:flex; width:100%; justify-content:space-between; align-items:center; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action .amount { width:80px; margin-top:0.5em; margin-bottom:0.5em; text-align:center;}
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action .title { width: 60%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action .price { width: 39%; display:inline-block; text-align:right; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action .price_total { width: 39%; display:inline-block; font-weight:bold; text-align:right; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info { display:flex; width:100%; justify-content:space-between; align-items:center; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info .titlep { min-width:120px; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info .title { display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info .valuel { width: 50%; display:inline-block; font-weight:normal; text-align:left; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info .valuer { width: 50%; display:inline-block; font-weight:normal; text-align:right; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info .fulll { width: 80%; display:inline-block; font-weight:normal; text-align:left; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_info .dummyr { width: 19%; display:inline-block; font-weight:normal; text-align:right; }
-.overview_sum_wrap .overview_sum_row { display:flex; width:100%; justify-content:space-between; align-items:center; }
-.overview_sum_wrap .overview_sum_row .title { width: 60%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.overview_sum_wrap .overview_sum_row .title2 { width: 80%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-.overview_sum_wrap .overview_sum_row .value { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.overview_sum_wrap .overview_sum_row .valuel { width: 20%; display:inline-block; font-weight:normal; text-align:left; }
-.overview_sum_wrap .overview_sum_row .sum { width: 20%; display:inline-block; font-weight:bold; text-align:right; }
-.overview_sum_wrap .overview_sum_row .delgs { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.overview_sum_wrap .overview_sum_row .codegs { width: 34%; display:inline-block; font-weight:normal; text-align:left; }
-.overview_sum_wrap .overview_sum_row .codegsl { width: 33%; display:inline-block; font-weight:normal; text-align:left; }
-.overview_sum_wrap .overview_sum_row .codegsr { width: 33%; display:inline-block; font-weight:normal; text-align:right; }
-.overview_sum_wrap .overview_sum_row .colgsl { width: 20%; display:inline-block; font-weight:normal; text-align:left; }
-.overview_sum_wrap .overview_sum_row .colgsr { width: 20%; display:inline-block; font-weight:normal; text-align:right; }
-.overview_sum_wrap .overview_sum_row .titlegs { width: 80%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
-
-.wpsg_overview .wpsg_checkoutbutton { float:left; }
-.wpsg_overview .wpsg_orderbutton { float:right; }
-/*
-.wpsg_overview .wpsg_table_wrap .overview_product_row .wpsg_overview_removelink { float:right; text-decoration:none; border:0px !important; }
-.wpsg_overview .wpsg_cell_gesamtsumme_value { font-weight:bold; }
-.wpsg_overview .wpsg_refreshbutton, .wpsg_basketbutton { float:left; }
-*/
+
 /* Bestellvariablen */
 .wpsg_checkout .wpsg_mod_ordervars_field { display:inline; }
+
+/* Produktvariablen */
+.wpsg_basket .wpsg_basket_productvars input[type="text"], .wpsg_basket .wpsg_basket_productvars select { width:100%; }
 
 /* Profilseite */
@@ -203,39 +122,9 @@
 .wpsg_profil .wpsg_saveButton { float:right; }
 
-/* Passwort Visualisierung */
-#wpsg_pwd_info { width:250px; background:#fefefe; width:100%; padding:25px; border-radius:5px; box-shadow:0 1px 3px #ccc; border:1px solid #ddd; display:none; }
-#wpsg_pwd_info::before { position:absolute; font-size:14px; text-shadow:none; display:block; color:#ddd; line-height:14px; }
-#wpsg_pwd_info ul li { margin:10px 20px; display:block; }
-.invalid { padding-left:22px; line-height:24px; color:#ec3f41; }
-.valid { padding-left:22px; line-height:24px; color:#3a7d34; }
-
-/* Modul "Abo Produkte" */
-.wpsg_mod_abo_order_product_wrap { }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product { border-bottom:1px solid #EEEEEE; padding-bottom:15px; margin-bottom:15px; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .link_wrap { display:inline-block; margin-left:10px; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .link_wrap:before { content:'['; margin-right:5px; display:inline-block; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .link_wrap:after { content:']'; margin-left:5px; display:inline-block; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .status_activ { color:green; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .status_inactiv { color:red; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .value { margin-left:10px; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .duration_running { color:green; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .duration_inextension { color:orange; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .duration_expired { color:red; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .image { float:left; margin-right:15px; }
-.wpsg_mod_abo_order_product_wrap .wpsg_mod_abo_order_product .label { float:left; width:15rem; }
-
 /* Produktattribute */
 .wpsg_cell_produktattribute_value { text-align:right; }
-.wpsg_mod_produktattribute_label { display:inline-block; min-width:120px; }
-.wpsg_mod_produktattribute_value { display:inline-block; }
 
 /* Bestellansicht */
 .wpsg_mod_kundenverwaltung_order .wpsg_mod_kundenverwaltung_producttable { margin-top:1rem; margin-bottom:2rem; }
-.wpsg_mod_kundenverwaltung_order {
-	table { width:100%;
-		td, th { text-align:left; }
-	}
-	.wpsg_box { border-bottom:1px solid black; padding-bottom:1rem; margin-bottom:1rem; }
-}
 
 /* Trusted Shops Integration */
@@ -251,119 +140,31 @@
 
 /* Produkttemplate */
+.wpsg_produkt_wrapper { margin:5px -10px 5px -10px; padding:10px; width:100%; line-height:1.5em; box-sizing:content-box; }
+.wpsg_produkt_wrapper .wpsg_produkt_produktbilder { float:left; margin-right:1rem; margin-bottom:1rem; }
+.wpsg_produkt_wrapper .wpsg_product_afterimage { }
+.wpsg_produkt_wrapper .wpsg_product_afterimage .wpsg_producttitle { clear:none; }
+.wpsg_produkt_wrapper .wpsg_add_basket { margin:1rem 0; float:right; }
+.wpsg_produkt_wrapper .wpsg_produkt_add_basket_wrapper { clear:both; float:left; margin:1rem 0 0 0; }
+.wpsg_produkt_wrapper .wpsg_label { display:inline; }
+.wpsg_produkt_wrapper .wpsg_value { display:inline; }
+.wpsg_produkt_wrapper .wpsg_preis_prediscount { text-decoration: line-through; }
+.wpsg_produkt_wrapper .wpsg_menge { width:auto; }
 .wpsg_productform { position:relative; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_productimages { float:left; margin-right:0.75em; }
-.wpsg_productform img { max-width:100%; height:auto; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_produkt_preishinweis { font-size:0.75em; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productview_oldprice,
-.product_wrap .productdetails .oldprice { text-decoration:line-through; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productview_price { font-weight:bold; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_produkt_shortdescription { margin-top:0.75em; margin-bottom:0.75em; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_only_store {  margin-top:0.75em; margin-bottom:0.75em; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productvariants_product_wrap { margin-top:0.75em; margin-bottom:0.75em; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productvariants_product_wrap select { width:100%; box-sizing:border-box; padding:0.75em; line-height:1.5em; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_informationarea { margin-top:1.5em; margin-bottom:1.5em; }
-.wpsg_productform .wpsg_produkt_wrapper label { font-weight:bold; } 
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="text"] { width:48%; float:left; box-sizing:border-box; padding:0.7em; line-height:1.5em; font-size:1rem; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="submit"] { width:48%; cursor:pointer; float:right; box-sizing: border-box; padding:0.7em; line-height:1.5em; font-size:1rem; border:1px solid transparent; border-radius:3px; }
-.wpsg_productform .wpsg_product_layer { position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:rgba(0, 0, 0, 0.25); padding:0.75em; margin:-0.75em; box-sizing:content-box; }
-.wpsg_productform .wpsg_product_layer img { position:absolute; left:50%; margin-left:-8px; top:50%; margin-top:-5px; }
-.wpsg_productform .wpsg_produkt_produktbilder { max-width:200px; }
-.wpsg_productform label {
-    color: #333;
-    display: block;
-    font-weight: 800;
-    margin-bottom: 0.5em;
+.wpsg_productform .wpsg_product_layer { z-index:1000; background-color:rgba(125, 125, 125, 0.5); position:absolute; left:-10px; top:-10px; width:100%; height:100%; padding:20px; }
+.wpsg_productform .wpsg_product_layer img { position:absolute; left:50%; top:50%;  margin-left:-8px; margin-top:-5.5px; }
+
+/* Ajax Meldung ÃŒber das Produkttemplate */
+#wpsg_basket_ajax_message { z-index:2000; position:absolute; top:55px; width:100%; position:fixed; }
+#wpsg_basket_ajax_message .wpsg_basket_ajax_message_content { 
+	width:800px; margin:auto; background-color:white; padding:25px; text-align:center; 
+	-webkit-border-radius:15px; 
+	-moz-border-radius:15px;
+	border-radius:15px;  
 }
-.wpsg_product_deliverytime_holiday { height:50px; padding:10px; width:50%; float:right; border:1px solid #ff0000; }
-.wpsg_produkt_add_basket_wrapper { display:flex; align-items:center; justify-content:flex-start; gap:1rem;
-	& > *, & > label { margin:0; }
-}
-
-/* Minigallery */
-.wpsg_productform #responsive_slider .carousel-indicators { bottom:-45px; }
-.wpsg_productform #responsive_slider .carousel-indicators li { margin-left:2.5px; margin-right:2.5px; }
-.wpsg_productform #responsive_slider .carousel-indicators li.active { border-width:2px; }
-.wpsg_productform .sto_carousel { position:relative; margin-bottom:45px; margin-top:46px; }
-.wpsg_productform .sto_carousel ul { list-style:none; }
-.wpsg_productform .sto_carousel li { list-style:none; float:left; margin-right:10px; }
-.wpsg_productform .sto_carousel li .wpsg_image_producttemplate_small { width:93px; }
-.wpsg_productform .jcarousel { position:relative; width:100%; height:95px; overflow: hidden; width:515px; }
-.wpsg_productform .jcarousel ul { width: 20000em; position: relative; list-style: none; margin: 0; padding: 0; }
-.wpsg_productform .sto_carousel .left { position:absolute; left:0px; top:0px; height:95px; line-height:95px; width:20px; display:block; text-align:left; font-size:2rem; }
-.wpsg_productform .sto_carousel .right { position:absolute; right:0px; top:0px; height:95px; line-height:95px; width:20px; display:block; text-align:right; font-size:2rem; }
-
-@media (max-width:400px) {
-	
-	.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="text"] { width:28%; }
-	.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="submit"] { width:68%; }
-	
-	/* Produktdetailansicht */
-	.wpsg_productform .wpsg_produkt_shortdescription { display:none; }
-	.wpsg_productform .wpsg_mod_produktindex_stock { margin:10px 0; }
-	.wpsg_productform .wpsg_mod_produktindex_stock label { margin-bottom:0em; float:left; margin-right:10px; }
-	
-	/* ProduktÃŒbersicht */
-	.wpsg_mod_productindex_order span{ float:left; }
-	.wpsg_mod_productindex .wpsg_mod_productindex_viewselect { margin-top:6px !important; }
-	.wpsg_mod_productindex .wpsg_mod_productindex_order { width:90%; }
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product { width:45% !important; }
-	.wpsg_mod_productindex .wpsg_mod_productindex_order select { width:65%; margin: 2px 0 0 10px; height:20px;  }
-	.wpsg_mod_productindex .wpsg_mod_productindex_toolbar_bottom .wpsg_mod_productindex_order { display:none }
-	.wpsg_mod_productindex .wpsg_mod_productindex_toolbar_bottom .wpsg_mod_productindex_viewselect { display:none}
-	.wpsg_mod_productindex .wpsg_mod_productindex_toolbar_bottom { border-top:0px !important; }
-	
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_title { font-size:1.5em; }
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos,
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_produktindex_stock,
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_produkt_preishinweis { display:none; }
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button { border:1px solid #ccc; }
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button a { font-size:1.2em; }
-	.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productview_price { font-size:1.2em; }
-	
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product { width:100% !important; }
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos,
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_produktindex_stock,
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_description,
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_produkt_preishinweis { display:none; }
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content { margin:0 !important;}
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button { border:1px solid #ccc; }
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button a { font-size:1.2em; }
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productview_price { font-size:1.2em; }
-	.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button { width:100%; text-align:center; }
-
-	/* Warenkorb */
-	.wpsg_progress { display:none; }
-	.wpsg_basket .product_name .product_shortdesc { display:none; }
-	.wpsg_basket .basket_product_row .product_info{ display:none; }
-	.wpsg_basket .basket_sum_wrap .title2 { width:60%; }
-	.wpsg_basket .basket_sum_wrap .value,
-	.wpsg_basket .basket_sum_wrap .sum { width:40%; }
-	.wpsg_basket .wpsg_button { width:100%; margin:0 0 10px 0; }
-
-	/* Checkout */
-	.wpsg_checkout .wpsg_button { width:100%; margin:0 0 10px 0; }
-	.wpsg_checkout2 .wpsg_button { width:100%; margin:0 0 10px 0; }
-	
-	/* Overview */
-	.wpsg_overview .wpsg_checkoutbutton,
-	.wpsg_overview .wpsg_orderbutton { width:100%; margin: 0 0 10px 0; }
-	.wpsg_overview .product_name .product_shortdesc { display:none; }
-	.wpsg_overview .overview_product_row .product_info{ display:none; }
-	.wpsg_overview .overview_sum_wrap .title2 { width:60%; }
-	.wpsg_overview .overview_sum_wrap .value,
-	.wpsg_overview .overview_sum_wrap .sum { width:40%; }
-}
-
-@media (max-width:600px) {
-
-	.wpsg_productform .wpsg_productimages { width:100%; }
-	.wpsg_productform .wpsg_produkt_produktbilder { max-width:100%; }
-	
-}
-
-@media (max-width:900px) {
-	
-	
-}
+#wpsg_basket_ajax_layer { z-index:199; position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:rgba(0, 0, 0, 0.75); position:fixed; }
+#wpsg_basket_ajax_message .wpsg_basket_ajax_message_content_success { color:green; }
+#wpsg_basket_ajax_message .wpsg_button_continue_shopping { float:left; }
+#wpsg_basket_ajax_message .wpsg_button_basket { float:right; }
+#wpsg_basket_ajax_message .wpsg_button_wrap { margin-top:4rem; }
 
 /* Varianten */
@@ -372,8 +173,8 @@
 .wpsg_produkt_wrapper .wpsg_vp_field_typ_radio label { clear: both; float: left; }
 .wpsg_overview .wpsg_mod_varianten_value { text-align:right; }
-.wpsg_mod_productvariants_imageselect {}
-.wpsg_mod_productvariants_imageselect .image { padding:10px; display:inline-block; }
-.wpsg_mod_productvariants_imageselect .akt { padding:5px; border:5px solid #C5C5C5; }
-.wpsg_mod_productvariants_imageselect a { text-decoration:none; }
+.wpsg_mod_varianten_imageselect {}
+.wpsg_mod_varianten_imageselect .image { padding:10px; display:inline-block; }
+.wpsg_mod_varianten_imageselect .akt { padding:5px; border:5px solid #C5C5C5; }
+.wpsg_mod_varianten_imageselect a { text-decoration:none; }
 
 /* Warenkorbwidget */
@@ -384,5 +185,10 @@
 .wpsg_basket_widget table .wpsg_cell_amount { text-align:right; padding-right:0.2rem; }
 .wpsg_basket_widget table .wpsg_row_summary .wpsg_cell_amount { font-weight:bold; }
-.wpsg_basket_widget .wpsg_tax_note { font-size:0.75em; }
+
+/* Modul Gutscheine */
+.wpsg_basket .wpsg_cell_gutschein  { vertical-align:middle; }
+.wpsg_basket .wpsg_cell_gutschein input[type="submit"] { float:right; }
+.wpsg_basket .wpsg_cell_gutschein input[type="text"] { float:right; margin-top:2px; margin-right:10px; vertical-align:baseline; }
+.wpsg_basket .wpsg_cell_gutschein label { line-height:35px; }
 
 /* Modul Kundenverwaltung */
@@ -411,17 +217,16 @@
 
 /* Customerquestion (Dialog Firmenkunde/Endkunde und Land) */
-#wpsg_calc_layer { overflow:auto; text-align:center; position:fixed; vertical-align:middle; left:0px; top:0px; z-index:1000; width:100%; height:100%; background-color:rgba(125, 125, 125, 0.95); }
-#wpsg_calc_layer .content { padding:50px; position:absolute; left:50%; top:50%; width:700px; min-height:210px; margin-left:-320px; margin-top:-125px; border:2px solid #ddd; background-color:#fff; border-radius:5px; }
+#wpsg_calc_layer { overflow:auto; text-align:center; position:fixed; left:0px; top:0px; z-index:1000; width:100%; height:100%; background-color:rgba(125, 125, 125, 0.95); }
+#wpsg_calc_layer .content { padding:50px; position:absolute; left:50%; top:50%; width:640px; min-height:210px; margin-left:-320px; margin-top:-125px; }
 #wpsg_calc_layer .content img.loading { position:absolute; left:50%; top:50%; margin-left:-8px; margin-top:-5px; }
 #wpsg_calc_layer h2 { color:#000000; font-size:22px; font-weight:bold; line-height:28px; text-align:left; margin-bottom:25px; }
 #wpsg_calc_layer .customertype h2 { font-size:22px; font-weight:normal; width:150px; float:left; line-height:28px; }
-#wpsg_calc_layer #customerquestion_fk { margin-top:10px; width:200px; float:left; line-height:28px; }
+#wpsg_calc_layer #customerquestion_fk { width:175px; float:left; line-height:28px; }
 #wpsg_calc_layer #customerquestion_fk label { font-size:22px; font-weight:normal; line-height:28px; color:#000000; }
-#wpsg_calc_layer #customerquestion_ek { margin-top:10px; width:200px; float:left; line-height:28px; }
+#wpsg_calc_layer #customerquestion_ek { width:175px; float:left; line-height:28px; }
 #wpsg_calc_layer #customerquestion_ek label { font-size:22px; font-weight:normal; line-height:28px; color:#000000; }
-#wpsg_calc_layer #customerquestion_ok_button { width:100%; }
 #wpsg_calc_layer .country { clear:both; margin-top:20px; }
 #wpsg_calc_layer .country h2 { font-size:22px; font-weight:normal; width:150px; float:left; line-height:28px; }
-#wpsg_calc_layer .country select { width:350px; font-size:22px; height:auto; float:left; margin-top:10px;  }
+#wpsg_calc_layer .country select { width:350px; font-size:22px; height:auto; float:left; }
 #wpsg_calc_layer input[type="radio"] { height:auto; margin-right:10px; }
 #wpsg_calc_layer .button_wrap { width:100%; clear:both; padding-top:20px; }
@@ -454,4 +259,5 @@
 .wpsg_mod_request_requestpage .wpsg_cell_amount { width:125px; }
 .wpsg_mod_request_requestpage .wpsg_cell_sumprice { text-align:right; width:200px; }
+.wpsg_mod_request_requestpage .wpsg_basket_productimage { float:left; margin-right:5px; }
 .wpsg_mod_request_requestpage .wpsg_cell_total_brutto,
 .wpsg_mod_request_requestpage .wpsg_cell_total_netto { text-align:right; }
@@ -460,14 +266,35 @@
 .wpsg_mod_request_requestpage select { width:100%; height:30px; margin-top:5px; margin-bottom:5px;}
 .wpsg_mod_request_requestpage h2 { margin-top:2rem; margin-bottom:1rem; }
-.wpsg_mod_request_requestpage #wpsg_streetnr.wpsg_checkoutblock { display:flex; flex-direction:row; width:100%; }
-.wpsg_mod_request_requestpage #wpsg_streetnr.wpsg_checkoutblock .street { flex-grow:1; padding-right:15px; }
-.wpsg_mod_request_requestpage #wpsg_streetnr.wpsg_checkoutblock .nr input { width:75px; }
 .requestlist_ajax_wrap { padding-bottom:2rem; }
 
+/* Modul ZubehÃ¶rprodukte */
+.wpsg_mod_relatedproducts_basket { margin-top:2rem; }
+
+/* Progress bar 
+.steps { list-style:none; margin:0; padding:10px 0; overflow:hidden; font-family:'inherit',sans-serif; font-size:1.5rem; width:100%; height:auto; line-height:20px; font-weight:bold; counter-reset:li; }
+.steps > a, .steps > p { float:left; margin:5px 0;}
+.steps a, .steps p { list-style-image:none; list-style-type:none; margin-left:0; text-align:center; color:#bbb; background:#f2f2f2; position:relative; margin-left:43px; border-bottom:medium none !important; }
+
+.steps a:after, .steps p:after { position:absolute; top:50%; left:100%; content:" "; height:0; width:0; border:solid transparent; border-left-color:#f2f2f2; border-width:19px; margin-top:-19px; }
+.steps a span:after, .steps p span:after { position:absolute; top:50%; right:100%; content:" "; height:0; width:0; border:solid #f2f2f2; border-left-color:transparent; border-width:19px; margin-top:-19px; }
+
+.steps a span, .steps p span { display:block; padding:9px 28px 9px 9px; }
+.steps a span:before, .steps p span:before { counter-increment:li; }
+
+.steps a.current, .steps p.current { color:#3a3a3a; background:#c9c9c9; }
+.steps a.current:after, .steps p.current:after { border-left-color:#c9c9c9; }
+.steps a.current span:after, .steps p.current span:after { border-color:#c9c9c9; border-left-color:transparent; }
+
+.steps a.step1, .steps p.step1 { z-index:9; }
+.steps a.step2, .steps p.step2 { z-index:8; }
+.steps a.step3, .steps p.step3 { z-index:7; }
+.steps a.step4, .steps p.step4 { z-index:6; }
+*/
+ 
 .wpsg_progress { padding:0px; margin:0px; width:100%; margin-bottom:100px; margin-top:30px; }
 .wpsg_progress:after { border:1px solid #C5C5C5; height:10px; background-color:#F2F2F2; box-sizing:border-box; display:block; width:100%; content:" "; }
 .wpsg_progress span.step { width:25%; display:block; float:left; list-style:none; position:relative; }
 .wpsg_progress span.step > .text { margin-top:30px; text-align:center; width:100%; display:block; }
-.wpsg_progress span.step > .dot { position:absolute; z-index:2; background-color:#C5C5C5; width:20px; height:20px; left:50%; top:0%; margin-left:-14px; margin-top:-4px; border-radius:10px; }
+.wpsg_progress span.step > .dot { position:absolute; z-index:2; background-color:#C5C5C5; width:20px; height:20px; left:50%; top:0%; margin-left:-15px; margin-top:-5px; border-radius:10px; } 
 .wpsg_progress span.step:before { border:1px solid #C5C5C5; position:absolute; z-index:2; left:50%; margin-left:-20px; text-align:center; line-height:40px; background-color:#F2F2F2; content:" "; display:block; width:30px; height:30px; border-radius:25px; margin-top:-10px; } 
 .wpsg_progress span.step1:before { content:""; }
@@ -483,9 +310,4 @@
 .wpsg_progress span.current:after { width:50%; }  
   
-/* Modul "EinSeitenCheckout */  
-.onepagecheckout_customer_guest_activ .wpsg_mod_shippingadress h2, 
-.onepagecheckout_customer_guest_activ .wpsg_mod_shippingadress .wpsg_spacer { display:none; }  
-.onepagecheckout_customer_guest_activ .wpsg_mod_shippingadress .wpsg_inner { margin-bottom:20px; }
- 
 /* Modul "CrowdFunding" */
 .wpsg_mod_funding_progress .wpsg_mod_funding_state { border:1px solid #C5C5C5; margin-bottom:1rem; box-sizing:border-box; width:100%; height:25px; line-height:25px; }
@@ -493,109 +315,21 @@
 .wpsg_mod_funding_progress .wpsg_mod_funding_state > .bar > .value { background-color:#484C51; height:100%; width:0%; } 
 .wpsg_mod_funding_progress .wpsg_mod_funding_state > .value { width:10%; height:100%; border-left:1px solid #C5C5C5; float:right; text-align:center; }
-
-/* Modul "Produktansichten" */
-.wpsg_productview { position:relative; }
-.wpsg_productview_head { margin-bottom:25px; line-height:25px; margin-top:25px; position:relative; }
-.wpsg_productview_head h2.wpsg_productview_title { margin-top:0px; font-size:20px; font-weight:bold; color:#0E2F42; }
-.wpsg_productview_head .wpsg_mod_productview_modeswitch { position:absolute; right:15px; top:0px; font-size:20px; }
-.wpsg_productview_head .wpsg_mod_productview_modeswitch > a { margin-left:5px; text-decoration:none; color:#9E9E9E; }
-.wpsg_productview_head .wpsg_mod_productview_modeswitch > a.active,
-.wpsg_productview_head .wpsg_mod_productview_modeswitch > a:hover { color:#29556E; text-decoration:none; }
-.wpsg_mod_productview-info { font-size:14px; color:#9B9B9B; }
-.wpsg_mod_productview-info strong { color:#29556E; font-weight:bold; }
-.wpsg_mod_productview-order { font-size:14px; color:#9B9B9B; }
-.wpsg_mod_productview-order .glyphicon { margin-left:10px; margin-right:5px; }
-.wpsg_mod_productview-order strong { color:#29556E; font-weight:bold; float:right; }
-.wpsg_mod_productview_image  { position:relative; }
-.wpsg_mod_productview_image img { max-width:100%; height:auto; border:1px solid #E4F3F8; }
-.wpsg_productview_pager { width:100%; border-top:1px solid #E4F3F8; border-bottom:1px solid #E4F3F8; margin-bottom:25px; margin-top:10px; padding-top:25px; padding-bottom:25px; text-align:center; }
-.wpsg_productview_pager .wpsg_productview_pager_wrap { display:inline-block; margin:auto; }
-.wpsg_productview_pager .wpsg_productview_pager_wrap > span,
-.wpsg_productview_pager .wpsg_productview_pager_wrap > a { display:inline-block; width:30px; height:30px; line-height:30px; color:#0F303F; border:1px solid #0F303F; margin-left:15px; margin-right:15px; }
-.wpsg_productview_product { padding-top:15px; padding-bottom:40px; position:relative; margin-bottom:25px; }
-.wpsg_productview_product .wpsg_mod_productview_bottom { display:block; width:100%; text-align:center; }
-.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_name h2 { font-size:14px; font-weight:bold; margin-bottom:5px; }
-.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_description { color:#436980; line-height:20px; font-size:14px; margin-bottom:5px; }
-.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button { left:50%; margin-left:-90px; width:180px; position:absolute; bottom:0px; white-space:nowrap; padding:5px 25px 5px 25px; border:1px solid #A6DAE8; font-weight:bold; text-transform:uppercase; color:#29556E; }
-.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button:hover { text-decoration:none; background-color:#29556E; color:#FFFFFF; }
-.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button .fa { margin-left:10px; } 
-.wpsg_productview_product .wpsg_mod_productview_go { display:none; position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:rgba(228, 243, 248, 0.75); text-align:center; }
-.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap { color:#0F303F; width:100%; position:absolute; left:50%; margin-left:-50%; top:30%; font-size:20px; line-height:125%; font-weight:bold; }
-.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_oldprice, 
-.product_wrap .productdetails .oldprice { text-decoration:line-through; }
-.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_current { color:red; }
-.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_tax_wrap { color:#565656; width:100%; position:absolute; left:50%; margin-left:-50%; top:60%; font-size:14px; line-height:125%; }
-.wpsg_productview_product:hover { text-decoration:none; }
-.wpsg_productview_product:hover .wpsg_mod_productview_go { display:block; }
-.wpsg_productview_product_grid .wpsg_star_wrap { position:absolute; width:80%; left:50%; top:10%; margin-left:-40%; }
-.wpsg_productview_product_grid .wpsg_mod_productview_name h2 { margin-top:0px; }
-.wpsg_mod_productview_loading { width:100%; height:100%; background-color:rgba(249, 252, 253, 0.75); position:absolute; left:0px; top:0px; }
-.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range { position:relative; margin-right:16px; }
-.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range .ui-slider-handle { cursor:pointer; width:16px; height:16px; background-color:#787878; position:absolute; } 
-.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range .ui-slider-bg { margin-left:16px; background-color:#E1E1E1; width:100%; height:2px; position:absolute; top:8px; }
-.wpsg_mod_productview-order { position:relative; cursor:pointer; }
-.wpsg_mod_productview-order-layer { position:absolute; width:100%; display:none; margin-top:5px; left:0px; z-index:1; }
-.wpsg_mod_productview-order-layer > .inner { margin-left:15px; margin-right:15px; border:1px solid #29556E; background-color:#FFFFFF; }
-.wpsg_mod_productview-order-layer a:focus,
-.wpsg_mod_productview-order-layer a { display:block; line-height:25px; color:#29556E; padding:5px 5px 5px 10px; text-decoration:none; }
-.wpsg_mod_productview-order-layer a.selected,
-.wpsg_mod_productview-order-layer a:hover { text-decoration:none; color:#FFFFFF; background-color:#29556E; }
-
-/* ProduktÃŒbersicht */
-.wpsg_mod_productview_oldprice { font-size:0.9em; color:#ff0000; text-decoration:line-through; }
-.wpsg_mod_productview_newprice { font-size:1em; font-weight:bold; }
- 
-/* Dialog fÃŒr Meldungen wenn nicht auf einer Shop Seite / Warenkorbmeldung BEGIN */
-#wpsg_ajax_layer { position:fixed; z-index:1000; left:0px; top:0px; width:100%; height:100%; background-color:rgba(0, 0, 0, 0.75); display:flex; justify-content:center; align-items:center; }
-#wpsg_ajax_layer .wpsg_ajax_message_content { background-color:#FFFFFF; padding:1.5rem; text-align:center; }
-#wpsg_ajax_layer .wpsg_ajax_message_content li { list-style:none; }
-
-@media screen and (max-width: 320px) {
+  
+@media screen and (max-width: 600px) {
 	
-	#wpsg_ajax_layer .wpsg_ajax_message_content { width:300px; }
+	#wpsg_basket_ajax_message .wpsg_basket_ajax_message_content { width:80%; }
+	#wpsg_basket_ajax_message .wpsg_button_basket,
+	#wpsg_basket_ajax_message .wpsg_button_continue_shopping { width:100%; margin-top:2rem; }
+	.wpsg_progress span.step > .text { visibility:hidden; } 
 	
 }
-/* Dialog fÃŒr Meldungen wenn nicht auf einer Shop Seite / Warenkorbmeldung  ENDE */
-
-#TB_caption { height: 50px !important; }
-#TB_secondLine { font-size: 14px !important; }
-
-.wpsg_produkt_wrapper2 .wpsg_gallery_wrap ul { width:490px; padding:0; margin:0; display:flex; flex-direction:row; flex-wrap:wrap; justify-content:space-between; }
-.wpsg_produkt_wrapper2 .wpsg_gallery_wrap ul li { list-style:none; padding:0; margin:0; width:100px; height:100px; margin-bottom:30px; }
-.wpsg_produkt_wrapper2 .wpsg_gallery_wrap ul li > div { width:100%; height:100%; cursor:pointer; }
-.wpsg_produkt_wrapper2 .wpsg_gallery_wrap ul li > div > img { width:100%; height:100%; object-fit:cover; object-position:center center; }
-.wpsg_produkt_wrapper2 .wpsg_produkt_produktbilder img { width:230px !important; height:230px; object-fit:cover; object-position:50% 50%; max-width:none; float:left; }
-.wpsg_produkt_wrapper2 .wpsg_produkt_produktbilder { width:260px; max-width:260px; }
-.wpsg_produkt_wrapper2 .wpsg_productimages { margin-right:0px !important; }
-.wpsg_produkt_wrapper2 .bigimg img { margin:0 15px 15px 15px; width:100px; height:auto; float:left;  }
-
-/* wpsg_mod_amazon_v2 */
-#AmazonPayButton_wrap { text-align:right; margin-bottom:2rem; width:100%; justify-content:flex-end; display:flex; }
-#AmazonPayButton_wrap #AmazonPayButton { width:210px; }
-#AmazonLoginButton_wrap { text-align:right; margin-bottom:2rem; width:100%; justify-content:flex-end; display:flex; }
-
-/* wpsg_mod_prepayment - QR-Code auf Bestellabschlussseite */
-.wpsg_mod_prepayment_info_wrap { display:flex; justify-content:center; flex-direction:column; gap:20px; }
-.wpsg_mod_prepayment_info { display: flex; gap: 20px; border: 1px solid #000000; padding: 20px; }
-.wpsg_mod_prepayment_info h4{ margin: 0; }
-.wpsg_mod_prepayment_info_left { display: flex; flex-direction: column; }
-.wpsg_mod_prepayment_info_left_qrcodeimg { width:240px; height:240px; }
-.wpsg_mod_prepayment_info_left_wrap { display:flex; gap:25%; }
-.wpsg_mod_prepayment_info_left_currency { display:flex; flex-direction:column; }
-.wpsg_mod_prepayment_info_left_amount { display:flex; flex-direction:column; }
-
-.wpsg_mod_prepayment_girocode { display: flex; gap: 20px; border: 1px solid #000000; padding: 20px; font-size:16px; }
-.wpsg_mod_prepayment_girocode h4{ margin: 0; }
-.wpsg_mod_prepayment_girocode_left { display: flex; flex-direction: column; }
-.wpsg_mod_prepayment_girocode_left_qrcodeimg { width:240px; height:240px; }
-.wpsg_mod_prepayment_girocode_left_wrap { display:flex; gap:25%; }
-.wpsg_mod_prepayment_girocode_left_currency { display:flex; flex-direction:column; }
-.wpsg_mod_prepayment_girocode_left_amount { display:flex; flex-direction:column; }
-
-.wpsg_mod_prepayment_qrrechnung { display: flex; gap: 20px; border: 1px solid #000000; padding: 20px; }
-.wpsg_mod_prepayment_qrrechnung h4{ margin: 0; }
-.wpsg_mod_prepayment_qrrechnung_left { display: flex; flex-direction: column; }
-.wpsg_mod_prepayment_qrrechnung_left_qrcodeimg { width:240px; height:240px; }
-.wpsg_mod_prepayment_qrrechnung_left_wrap { display:flex; gap:25%; }
-.wpsg_mod_prepayment_qrrechnung_left_currency { display:flex; flex-direction:column; }
-.wpsg_mod_prepayment_qrrechnung_left_amount { display:flex; flex-direction:column; }
+
+@media screen and (max-width: 400px) {
+
+	.wpsg .wpsg_button { padding-left:10px; padding-right:10px; }
+	
+	.wpsg_basket .wpsg_cell_gutschein label { width:100%; display:block; }
+	.wpsg_basket #wpsg_gutschein_input { float:left; }
+	
+}
+
Index: ews/css/gutenberg.css
===================================================================
--- /views/css/gutenberg.css	(revision 8528)
+++ 	(revision )
@@ -1,4 +1,0 @@
-.wp-block-wpsg-product { background-color:#C4D100; color:#003C6A; margin:-5px; padding:10px; }
-.wp-block-wpsg-product .components-base-control__field { width:100%; display:flex; justify-content:flex-start; align-items:center; margin-bottom:0; }
-.wp-block-wpsg-product .components-base-control__field label { width:150px; }
-.wp-block-wpsg-product .components-base-control+.components-base-control { margin-bottom:0; }
Index: ews/css/tiny-slider.-2.9.4.min.css
===================================================================
--- /views/css/tiny-slider.-2.9.4.min.css	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-.tns-outer{padding:0 !important}.tns-outer [hidden]{display:none !important}.tns-outer [aria-controls],.tns-outer [data-action]{cursor:pointer}.tns-slider{-webkit-transition:all 0s;-moz-transition:all 0s;transition:all 0s}.tns-slider>.tns-item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.tns-horizontal.tns-subpixel{white-space:nowrap}.tns-horizontal.tns-subpixel>.tns-item{display:inline-block;vertical-align:top;white-space:normal}.tns-horizontal.tns-no-subpixel:after{content:'';display:table;clear:both}.tns-horizontal.tns-no-subpixel>.tns-item{float:left}.tns-horizontal.tns-carousel.tns-no-subpixel>.tns-item{margin-right:-100%}.tns-no-calc{position:relative;left:0}.tns-gallery{position:relative;left:0;min-height:1px}.tns-gallery>.tns-item{position:absolute;left:-100%;-webkit-transition:transform 0s, opacity 0s;-moz-transition:transform 0s, opacity 0s;transition:transform 0s, opacity 0s}.tns-gallery>.tns-slide-active{position:relative;left:auto !important}.tns-gallery>.tns-moving{-webkit-transition:all 0.25s;-moz-transition:all 0.25s;transition:all 0.25s}.tns-autowidth{display:inline-block}.tns-lazy-img{-webkit-transition:opacity 0.6s;-moz-transition:opacity 0.6s;transition:opacity 0.6s;opacity:0.6}.tns-lazy-img.tns-complete{opacity:1}.tns-ah{-webkit-transition:height 0s;-moz-transition:height 0s;transition:height 0s}.tns-ovh{overflow:hidden}.tns-visually-hidden{position:absolute;left:-10000em}.tns-transparent{opacity:0;visibility:hidden}.tns-fadeIn{opacity:1;filter:alpha(opacity=100);z-index:0}.tns-normal,.tns-fadeOut{opacity:0;filter:alpha(opacity=0);z-index:-1}.tns-vpfix{white-space:nowrap}.tns-vpfix>div,.tns-vpfix>li{display:inline-block}.tns-t-subp2{margin:0 auto;width:310px;position:relative;height:10px;overflow:hidden}.tns-t-ct{width:2333.3333333%;width:-webkit-calc(100% * 70 / 3);width:-moz-calc(100% * 70 / 3);width:calc(100% * 70 / 3);position:absolute;right:0}.tns-t-ct:after{content:'';display:table;clear:both}.tns-t-ct>div{width:1.4285714%;width:-webkit-calc(100% / 70);width:-moz-calc(100% / 70);width:calc(100% / 70);height:10px;float:left}
Index: /views/css/tooltip.css
===================================================================
--- /views/css/tooltip.css	(revision 5261)
+++ /views/css/tooltip.css	(revision 5261)
@@ -0,0 +1,121 @@
+/* TipTip CSS - Version 1.2 */
+
+
+
+#tiptip_holder {
+	display: none;
+	position: absolute;
+	top: 0;
+	left: 0;
+	z-index: 9999999999;
+	max-height:400px;
+	width:400px;
+	overflow-y:auto;
+	overflow-x:hidden;
+}
+
+#tiptip_holder.tip_top {
+	padding-bottom: 5px;
+}
+
+#tiptip_holder.tip_bottom {
+	padding-top: 5px;
+}
+
+#tiptip_holder.tip_right {
+	padding-left: 5px;
+}
+
+#tiptip_holder.tip_left {
+	padding-right: 5px;
+}
+
+#tiptip_content {	
+	font-size: 11px;
+	color: #fff;
+	text-shadow: 0 0 2px #000;
+	padding: 4px 8px;
+	border: 1px solid rgba(255,255,255,0.25);
+	background-color: rgb(25,25,25);
+	background-color: rgba(25,25,25,0.92);
+	background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));
+	border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	box-shadow: 0 0 3px #555;
+	-webkit-box-shadow: 0 0 3px #555;
+	-moz-box-shadow: 0 0 3px #555;	 
+}
+
+#tiptip_arrow, #tiptip_arrow_inner {
+	position: absolute;
+	border-color: transparent;
+	border-style: solid;
+	border-width: 6px;
+	height: 0;
+	width: 0;
+}
+
+#tiptip_holder.tip_top #tiptip_arrow {
+	border-top-color: #fff;
+	border-top-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_bottom #tiptip_arrow {
+	border-bottom-color: #fff;
+	border-bottom-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_right #tiptip_arrow {
+	border-right-color: #fff;
+	border-right-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_left #tiptip_arrow {
+	border-left-color: #fff;
+	border-left-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_top #tiptip_arrow_inner {
+	margin-top: -7px;
+	margin-left: -6px;
+	border-top-color: rgb(25,25,25);
+	border-top-color: rgba(25,25,25,0.92);
+}
+
+#tiptip_holder.tip_bottom #tiptip_arrow_inner {
+	margin-top: -5px;
+	margin-left: -6px;
+	border-bottom-color: rgb(25,25,25);
+	border-bottom-color: rgba(25,25,25,0.92);
+}
+
+#tiptip_holder.tip_right #tiptip_arrow_inner {
+	margin-top: -6px;
+	margin-left: -5px;
+	border-right-color: rgb(25,25,25);
+	border-right-color: rgba(25,25,25,0.92);
+}
+
+#tiptip_holder.tip_left #tiptip_arrow_inner {
+	margin-top: -6px;
+	margin-left: -7px;
+	border-left-color: rgb(25,25,25);
+	border-left-color: rgba(25,25,25,0.92);
+}
+
+/* Webkit Hacks  */
+@media screen and (-webkit-min-device-pixel-ratio:0) {	
+	#tiptip_content {
+		padding: 4px 8px 5px 8px;
+		background-color: rgba(45,45,45,0.88);
+	}
+	#tiptip_holder.tip_bottom #tiptip_arrow_inner { 
+		border-bottom-color: rgba(45,45,45,0.88);
+	}
+	#tiptip_holder.tip_top #tiptip_arrow_inner { 
+		border-top-color: rgba(20,20,20,0.92);
+	}
+}
+
+.info_icon { cursor:pointer; }
Index: ews/js/_editable.js
===================================================================
--- /views/js/_editable.js	(revision 8528)
+++ 	(revision )
@@ -1,576 +1,0 @@
-/*
- * Jeditable - jQuery in place edit plugin
- *
- * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul
- *
- * Licensed under the MIT license:
- *   http://www.opensource.org/licenses/mit-license.php
- *
- * Project home:
- *   http://www.appelsiini.net/projects/jeditable
- *
- * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
- *    http://www.dyve.net/jquery/?editable
- *
- */
-
-/**
-  * Version 1.7.1
-  *
-  * ** means there is basic unit tests for this parameter. 
-  *
-  * @name  Jeditable
-  * @type  jQuery
-  * @param String  target             (POST) URL or function to send edited content to **
-  * @param Hash    options            additional options 
-  * @param String  options[method]    method to use to send edited content (POST or PUT) **
-  * @param Function options[callback] Function to run after submitting edited content **
-  * @param String  options[name]      POST parameter name of edited content
-  * @param String  options[id]        POST parameter name of edited div id
-  * @param Hash    options[submitdata] Extra parameters to send when submitting edited content.
-  * @param String  options[type]      text, textarea or select (or any 3rd party input type) **
-  * @param Integer options[rows]      number of rows if using textarea ** 
-  * @param Integer options[cols]      number of columns if using textarea **
-  * @param Mixed   options[height]    'auto', 'none' or height in pixels **
-  * @param Mixed   options[width]     'auto', 'none' or width in pixels **
-  * @param String  options[loadurl]   URL to fetch input content before editing **
-  * @param String  options[loadtype]  Request type for load url. Should be GET or POST.
-  * @param String  options[loadtext]  Text to display while loading external content.
-  * @param Mixed   options[loaddata]  Extra parameters to pass when fetching content before editing.
-  * @param Mixed   options[data]      Or content given as paramameter. String or function.**
-  * @param String  options[indicator] indicator html to show when saving
-  * @param String  options[tooltip]   optional tooltip text via title attribute **
-  * @param String  options[event]     jQuery event such as 'click' of 'dblclick' **
-  * @param String  options[submit]    submit button value, empty means no button **
-  * @param String  options[cancel]    cancel button value, empty means no button **
-  * @param String  options[cssclass]  CSS class to apply to input form. 'inherit' to copy from parent. **
-  * @param String  options[style]     Style to apply to input form 'inherit' to copy from parent. **
-  * @param String  options[select]    true or false, when true text is highlighted ??
-  * @param String  options[placeholder] Placeholder text or html to insert when element is empty. **
-  * @param String  options[onblur]    'cancel', 'submit', 'ignore' or function ??
-  *             
-  * @param Function options[onsubmit] function(settings, original) { ... } called before submit
-  * @param Function options[onreset]  function(settings, original) { ... } called before reset
-  * @param Function options[onerror]  function(settings, original, xhr) { ... } called on error
-  *             
-  * @param Hash    options[ajaxoptions]  jQuery Ajax options. See docs.jquery.com.
-  *             
-  */
-
-(function($) {
-
-    $.fn.editable = function(target, options) {
-            
-        if ('disable' == target) {
-            $(this).data('disabled.editable', true);
-            return;
-        }
-        if ('enable' == target) {
-            $(this).data('disabled.editable', false);
-            return;
-        }
-        if ('destroy' == target) {
-            $(this)
-                .unbind($(this).data('event.editable'))
-                .removeData('disabled.editable')
-                .removeData('event.editable');
-            return;
-        }
-        
-        var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);
-        
-        /* setup some functions */
-        var plugin   = $.editable.types[settings.type].plugin || function() { };
-        var submit   = $.editable.types[settings.type].submit || function() { };
-        var buttons  = $.editable.types[settings.type].buttons 
-                    || $.editable.types['defaults'].buttons;
-        var content  = $.editable.types[settings.type].content 
-                    || $.editable.types['defaults'].content;
-        var element  = $.editable.types[settings.type].element 
-                    || $.editable.types['defaults'].element;
-        var reset    = $.editable.types[settings.type].reset 
-                    || $.editable.types['defaults'].reset;
-        var callback = settings.callback || function() { };
-        var onedit   = settings.onedit   || function() { }; 
-        var onsubmit = settings.onsubmit || function() { };
-        var onreset  = settings.onreset  || function() { };
-        var onerror  = settings.onerror  || reset;
-        var json = false;  
-        
-        /* show tooltip */
-        if (settings.tooltip) {
-            $(this).attr('title', settings.tooltip);
-        }
-        
-        settings.autowidth  = 'auto' == settings.width;
-        settings.autoheight = 'auto' == settings.height;
-        
-        return this.each(function() {
-                        
-            /* save this to self because this changes when scope changes */
-            var self = this;  
-                   
-            /* inlined block elements lose their width and height after first edit */
-            /* save them for later use as workaround */
-            var savedwidth  = $(self).width();
-            var savedheight = $(self).height();
-            
-            /* save so it can be later used by $.editable('destroy') */
-            $(this).data('event.editable', settings.event);
-            
-            /* if element is empty add something clickable (if requested) */
-            if (!$.trim($(this).html())) {
-                $(this).html(settings.placeholder);
-            }
-            
-            $(this).bind(settings.event, function(e) {
-                
-                /* abort if disabled for this element */
-                if (true === $(this).data('disabled.editable')) {
-                    return;
-                }
-                
-                /* prevent throwing an exeption if edit field is clicked again */
-                if (self.editing) {
-                    return;
-                }
-                
-                /* abort if onedit hook returns false */
-                if (false === onedit.apply(this, [settings, self])) {
-                   return;
-                }
-                
-                /* prevent default action and bubbling */
-                e.preventDefault();
-                e.stopPropagation();
-                
-                /* remove tooltip */
-                if (settings.tooltip) {
-                    $(self).removeAttr('title');
-                }
-                
-                /* figure out how wide and tall we are, saved width and height */
-                /* are workaround for http://dev.jquery.com/ticket/2190 */
-                if (0 == $(self).width()) {
-                    //$(self).css('visibility', 'hidden');
-                    settings.width  = savedwidth;
-                    settings.height = savedheight;
-                } else {
-                    if (settings.width != 'none') {
-                        settings.width = 
-                            settings.autowidth ? $(self).width()  : settings.width;
-                    }
-                    if (settings.height != 'none') {
-                        settings.height = 
-                            settings.autoheight ? $(self).height() : settings.height;
-                    }
-                }
-                //$(this).css('visibility', '');
-                
-                /* remove placeholder text, replace is here because of IE */
-                if ($(this).html().toLowerCase().replace(/(;|")/g, '') == 
-                    settings.placeholder.toLowerCase().replace(/(;|")/g, '')) {
-                        $(this).html('');
-                }
-                                
-                self.editing    = true;
-                self.revert     = $(self).html();
-                $(self).html('');
-
-                /* create the form object */
-                var form = $('<form />');
-                
-                /* apply css or style or both */
-                if (settings.cssclass) {
-                    if ('inherit' == settings.cssclass) {
-                        form.attr('class', $(self).attr('class'));
-                    } else {
-                        form.attr('class', settings.cssclass);
-                    }
-                }
-
-                if (settings.style) {
-                    if ('inherit' == settings.style) {
-                        form.attr('style', $(self).attr('style'));
-                        /* IE needs the second line or display wont be inherited */
-                        form.css('display', $(self).css('display'));                
-                    } else {
-                        form.attr('style', settings.style);
-                    }
-                }
-
-                /* add main input element to form and store it in input */
-                var input = element.apply(form, [settings, self]);
-
-                /* set input content via POST, GET, given data or existing value */
-                var input_content;
-                
-                if (settings.loadurl) {
-                    var t = setTimeout(function() {
-                        input.disabled = true;
-                        content.apply(form, [settings.loadtext, settings, self]);
-                    }, 100);
-
-                    var loaddata = {};
-                    loaddata[settings.id] = self.id;
-                    if ($.isFunction(settings.loaddata)) {
-                        $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
-                    } else {
-                        $.extend(loaddata, settings.loaddata);
-                    }
-                    $.ajax({
-                       type : settings.loadtype,
-                       url  : settings.loadurl,
-                       data : loaddata,
-                       async : false,
-                       success: function(result) {
-                          window.clearTimeout(t);
-                          input_content = result;
-                          input.disabled = false;
-                       }
-                    });
-                } else if (settings.data) {
-                    input_content = settings.data;
-                    if ($.isFunction(settings.data)) {
-                        input_content = settings.data.apply(self, [self.revert, settings]);
-                    }
-                } else {
-                    input_content = self.revert; 
-                }
-                content.apply(form, [input_content, settings, self]);
-
-                input.attr('name', settings.name);
-        
-                /* add buttons to the form */
-                buttons.apply(form, [settings, self]);
-         
-                /* add created form to self */
-                $(self).append(form);
-         
-                /* attach 3rd party plugin if requested */
-                plugin.apply(form, [settings, self]);
-
-                /* focus to first visible form element */
-                $(':input:visible:enabled:first', form).focus();
-
-                /* highlight input contents when requested */
-                if (settings.select) {
-                    input.select();
-                }
-        
-                /* discard changes if pressing esc */
-                input.keydown(function(e) {
-                    if (e.keyCode == 27) {
-                        e.preventDefault();
-                        //self.reset();
-                        reset.apply(form, [settings, self]);
-                    }
-                });
-
-                /* discard, submit or nothing with changes when clicking outside */
-                /* do nothing is usable when navigating with tab */
-                var t;
-                if ('cancel' == settings.onblur) {
-                    input.blur(function(e) {
-                        /* prevent canceling if submit was clicked */
-                        t = setTimeout(function() {
-                            reset.apply(form, [settings, self]);
-                        }, 500);
-                    });
-                } else if ('submit' == settings.onblur) {
-                    input.blur(function(e) {
-                        /* prevent double submit if submit was clicked */
-                        t = setTimeout(function() {
-                            form.submit();
-                        }, 200);
-                    });
-                } else if ($.isFunction(settings.onblur)) {
-                    input.blur(function(e) {
-                        settings.onblur.apply(self, [input.val(), settings]);
-                    });
-                } else {
-                    input.blur(function(e) {
-                      /* TODO: maybe something here */
-                    });
-                }
-
-                form.submit(function(e) {
- 
-                    if (t) { 
-                        clearTimeout(t);
-                    }
-
-                    /* do no submit */
-                    e.preventDefault(); 
-            
-                    /* call before submit hook. */
-                    /* if it returns false abort submitting */                    
-                    if (false !== onsubmit.apply(form, [settings, self])) { 
-                        /* custom inputs call before submit hook. */
-                        /* if it returns false abort submitting */
-                        if (false !== submit.apply(form, [settings, self])) { 
-
-                          /* check if given target is function */
-                          if ($.isFunction(settings.target)) {
-                              var str = settings.target.apply(self, [input.val(), settings]);
-                              $(self).html(str);
-                              self.editing = false;
-                              callback.apply(self, [self.innerHTML, settings]);
-                              /* TODO: this is not dry */                              
-                              if (!$.trim($(self).html())) {
-                                  $(self).html(settings.placeholder);
-                              }
-                          } else {
-                              /* add edited content and id of edited element to POST */
-                              var submitdata = {};
-                              submitdata[settings.name] = input.val();
-                              submitdata[settings.id] = self.id;
-                              /* add extra data to be POST:ed */
-                              if ($.isFunction(settings.submitdata)) {
-                                  $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
-                              } else {
-                                  $.extend(submitdata, settings.submitdata);
-                              }
-
-                              /* quick and dirty PUT support */
-                              if ('PUT' == settings.method) {
-                                  submitdata['_method'] = 'put';
-                              }
-
-                              /* show the saving indicator */
-                              $(self).html(settings.indicator);
-                              
-                              /* defaults for ajaxoptions */
-                              var ajaxoptions = {
-                                  type    : 'POST',
-                                  data    : submitdata,
-                                  dataType: 'html',
-                                  url     : settings.target,
-                                  success : function(result, status) {
-                                      if (ajaxoptions.dataType == 'html') {
-                                        $(self).html(result);
-                                        settings.data = result;
-                                      }
-                                      self.editing = false;
-                                      callback.apply(self, [result, settings]);
-                                      if (!$.trim($(self).html())) {
-                                          $(self).html(settings.placeholder);
-                                      }
-                                  },
-                                  error   : function(xhr, status, error) {
-                                      onerror.apply(form, [settings, self, xhr]);
-                                  }
-                              };
-                              
-                              /* override with what is given in settings.ajaxoptions */
-                              $.extend(ajaxoptions, settings.ajaxoptions);   
-                              $.ajax(ajaxoptions);          
-                              
-                            }
-                        }
-                    }
-                    
-                    /* show tooltip again */
-                    $(self).attr('title', settings.tooltip);
-                    
-                    return false;
-                });
-            });
-            
-            /* privileged methods */
-            this.reset = function(form) {
-                /* prevent calling reset twice when blurring */
-                if (this.editing) {
-                    /* before reset hook, if it returns false abort reseting */
-                    if (false !== onreset.apply(form, [settings, self])) { 
-                        $(self).html(self.revert);
-                        self.editing   = false;
-                        if (!$.trim($(self).html())) {
-                            $(self).html(settings.placeholder);
-                        }
-                        /* show tooltip again */
-                        if (settings.tooltip) {
-                            $(self).attr('title', settings.tooltip);                
-                        }
-                    }                    
-                }
-            };            
-        });
-
-    };
-
-
-    $.editable = {
-        types: {
-            defaults: {
-                element : function(settings, original) {
-                    var input = $('<input type="hidden"></input>');                
-                    $(this).append(input);
-                    return(input);
-                },
-                content : function(string, settings, original) {
-                    $(':input:first', this).val(string);
-                },
-                reset : function(settings, original) {
-                  original.reset(this);
-                },
-                buttons : function(settings, original) {
-                    var form = this;
-                    if (settings.submit) {
-                        /* if given html string use that */
-                        if (settings.submit.match(/>$/)) {
-                            var submit = $(settings.submit).click(function() {
-                                if (submit.attr("type") != "submit") {
-                                    form.submit();
-                                }
-                            });
-                        /* otherwise use button with given string as text */
-                        } else {
-                            var submit = $('<button class="button" type="submit" />');
-                            submit.html(settings.submit);                            
-                        }
-                        $(this).append(submit);
-                    }
-                    if (settings.cancel) {
-                        /* if given html string use that */
-                        if (settings.cancel.match(/>$/)) {
-                            var cancel = $(settings.cancel);
-                        /* otherwise use button with given string as text */
-                        } else {
-                            var cancel = $('<button type="cancel" />');
-                            cancel.html(settings.cancel);
-                        }
-                        $(this).append(cancel);
-
-                        $(cancel).click(function(event) {
-                            //original.reset();
-                            if ($.isFunction($.editable.types[settings.type].reset)) {
-                                var reset = $.editable.types[settings.type].reset;                                                                
-                            } else {
-                                var reset = $.editable.types['defaults'].reset;                                
-                            }
-                            reset.apply(form, [settings, original]);
-                            return false;
-                        });
-                    }
-                }
-            },
-            text: {
-                element : function(settings, original) {
-                    var input = $('<input />');
-                    if (settings.width  != 'none') { input.width(settings.width);  }
-                    if (settings.height != 'none') { input.height(settings.height); }
-                    /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
-                    //input[0].setAttribute('autocomplete','off');
-                    input.attr('autocomplete','off');
-                    $(this).append(input);
-                    return(input);
-                }
-            },
-            textarea: {
-                element : function(settings, original) {
-                    var textarea = $('<textarea />');
-                    if (settings.rows) {
-                        textarea.attr('rows', settings.rows);
-                    } else if (settings.height != "none") {
-                        textarea.height(settings.height);
-                    }
-                    if (settings.cols) {
-                        textarea.attr('cols', settings.cols);
-                    } else if (settings.width != "none") {
-                        textarea.width(settings.width);
-                    }
-                    $(this).append(textarea);
-                    return(textarea);
-                }
-            },
-            select: {
-               element : function(settings, original) {
-                    var select = $('<select />');
-                    $(this).append(select);
-                    return(select);
-                },
-                content : function(data, settings, original) {
-                	
-                	if (typeof settings.json == "undefined")
-                	{
-                    
-                		/* If it is string assume it is json. */
-	                    if (String == data.constructor) {      
-	                        eval ('var json = ' + data);
-	                    } else {
-	                    /* Otherwise assume it is a hash already. */
-	                        var json = data;
-	                    }
-	                 
-	                    settings.json = json;
-	                    
-                	}
-                	else
-                	{
-                		
-                		json = settings.json;
-                		
-                	}
-                    
-                    for (var key in json) {
-                        if (!json.hasOwnProperty(key)) {
-                            continue;
-                        }
-                        if ('selected' == key) {
-                            continue;
-                        } 
-                        
-                        if (typeof json[key]['name'] == 'string')
-                        {
-                        	
-                        	var option = $('<optgroup />').attr('label', json[key]['name']);
-                        	
-                        	for (var key2 in json[key]['fields'])
-                        	{
-                        		option.append($('<option />').val(key2).append(json[key]['fields'][key2]));                        		
-                        	}
-                        	
-                        }
-                        else
-                        {
-                        	var option = $('<option />').val(key).append(json[key]);
-                        }                        
-                        
-                        $('select', this).append(option);    
-                    }                    
-                    /* Loop option again to set selected. IE needed this... */ 
-                    $('select', this).find('option').each(function() {
-                        if ($(this).val() == json['selected'] || 
-                            $(this).text() == $.trim(original.revert)) {
-                                $(this).attr('selected', 'selected');
-                        }
-                    });
-                }
-            }
-        },
-
-        /* Add new input type */
-        addInputType: function(name, input) {
-            $.editable.types[name] = input;
-        }
-    };
-
-    // publicly accessible defaults
-    $.fn.editable.defaults = {
-        name       : 'value',
-        id         : 'id',
-        type       : 'text',
-        width      : 'auto',
-        height     : '25px',
-        event      : 'click.editable',
-        onblur     : 'cancel',
-        loadtype   : 'GET',
-        loadtext   : 'Loading...',
-        placeholder: 'Click to edit',
-        loaddata   : {},
-        submitdata : {},
-        ajaxoptions: {}
-    };
-
-})(jQuery);
Index: /views/js/admin.js
===================================================================
--- /views/js/admin.js	(revision 8528)
+++ /views/js/admin.js	(revision 5261)
@@ -1,26 +1,2 @@
-function wpsg_loading(selector) {
-
-	var jqSel = jQuery(selector);
-	
-	jqSel.css( {
-		'position': 'relative',
-		'display': 'block',
-		'width': jqSel.width(),
-		'height': jqSel.height(true)
-	} );
-
-	jqSel.append('<div class="ajax_loading"><img class="loading" src="' + wpsg_ajax.img_ajaxloading + '" alt="Bitte warten" /></div>');
-	
-}
-
-function wpsg_loading_done(selector) {
-
-	var jqSel = jQuery(selector);
-	
-	jqSel.find('.ajax_loading').remove();
-	
-}
-
-
 wpsg_number_format = function (number, decimals, dec_point, thousands_sep) {
 
@@ -44,10 +20,4 @@
 		ui.children().each(function() {
 			
-			jQuery(this).find('td').each(function() {
-				
-				jQuery(this).width(jQuery(this).width());
-				
-			} );
-			
 			jQuery(this).width(jQuery(this).width());
 			
@@ -57,5 +27,56 @@
 		
 	};
-    
+  
+jQuery.fn.tipTip = function() {
+  
+	if (jQuery(this).hasClass('tipTip')) return;
+	jQuery(this).addClass('tipTip');
+		
+	jQuery(this).cluetip( { 
+		width: '400px',
+		height: '400px', 
+		activation: 'click',
+		sticky: true,
+		/*mouseOutClose: 'both',*/
+		closePosition: 'title', 
+		arrows: true,
+		closeText: 'SchlieÃen',
+		onActivate: function() {
+
+			jQuery('#cluetip').hide();
+		
+		},
+		onShow: function() {
+		
+			jQuery('.cluetip-title').prepend(jQuery('.cluetip-inner h1').first().text());
+			jQuery('.cluetip-inner h1').first().remove();
+			
+			jQuery('.cluetip-inner').css('overflow-y', 'show');
+			jQuery('.cluetip-inner').css('height', 'auto');
+			
+			var height_content = jQuery('.cluetip-inner').outerHeight();
+			var height_title = jQuery('.cluetip-title').outerHeight();
+						
+			if (height_content < 400)
+			{
+				
+				jQuery('.cluetip-outer').height((height_content + height_title) + "px");
+				
+			}
+			else
+			{
+				
+				jQuery('.cluetip-outer').height("400px");
+				
+				jQuery('.cluetip-inner').css('overflow-y', 'scroll');
+				jQuery('.cluetip-inner').css('height', '332px');
+				
+			} 
+						
+		}
+	} );
+	 
+};
+  
 jQuery.fn.wpsg_adminbox = function(options) {
 		
@@ -109,6 +130,4 @@
 		
 		var aktTab = 1;
-		
-		if (options.aktTab) aktTab = options.aktTab; 
 		
 		if (jQuery.cookie(options['cookiename']) != null && jQuery.cookie(options['cookiename']) > 0)
@@ -173,113 +192,2 @@
     
 }
-
-	var po; 
-
-	function wpsg_ajaxBind() {
-
-		jQuery('.wpsg-is-dismissible').on('click', '.notice-dismiss', function(event, el) {
-
-			var dismiss_url = jQuery(this).parent('.notice.is-dismissible').attr('data-dismiss-url');
-			if (dismiss_url) { jQuery.get(dismiss_url); }
-
-		});
-
-		// Hilfe Tooltips
-		jQuery('*[data-wpsg-tip]').on('click', function() { 
-
-			//jQuery(this).off('click').on('click', function() { return false; } );
- 
-			if (typeof po === "object")
-			{
-				
-				if (po != this) jQuery(po).popover('hide');
-				
-			}
-			
-			po = this;
-			
-			if (jQuery(this).hasClass('activated'))
-			{
-								
-				jQuery(this).popover('show');
-				
-				return false;
-				
-			}
-			
-			jQuery(this).popover( {
-				'html': true,
-				'content': '<div id="wpsg-popover-content"><img src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" /></div>',
-				'trigger': 'focus',
-				'container': '#wpsg-bs',
-				'placement': 'right'
-			} ).popover('show');
-
-			jQuery.ajax( {
-				url: '?page=wpsg-Admin&subaction=loadHelp&noheader=1',
-				data: {
-					field: jQuery(this).attr('data-wpsg-tip')
-				},
-				success: function(data) {
-					
-					var popover = jQuery(po).attr('data-content', data).data('popover');
-					jQuery(po).data('bs.popover').options.content = data;
-					
-					jQuery(po).popover('show');
-										
-				}
-			} );
-			 
-			jQuery(this).addClass('activated');
-			
-			return false;
-			
-		} ).css('pointer-events', 'auto');
-				
-	}
-
-	jQuery(document).ready(function() {
-
-        // Sortierung
-        jQuery('th.wpsg_order').bind('click', function() {
-
-            var direction = "ASC";
-            if (jQuery(this).hasClass('wpsg_order_asc') && jQuery('#wpsg_order').val() == jQuery(this).attr("data-order")) direction = "DESC";
-
-            jQuery('#wpsg_ascdesc').val(direction);
-            jQuery('#wpsg_order').val(jQuery(this).attr("data-order"));
-
-            jQuery('#filter_form').submit();
-
-		    return false;
-
-        } );
-		
-		jQuery("html,body").on("click touchstart", function() {
-	
-			if (typeof po === "object") jQuery(po).popover('hide');
-						
-		});		
-
-		jQuery('.wpsg_showhide_filter').bind('click', function() { 
-			
-			if (jQuery(this).hasClass('active'))
-			{
-				
-				jQuery('.wpsg-filter').slideUp(150);
-				jQuery(this).removeClass('active');
-				
-			}
-			else
-			{
-			
-				jQuery('.wpsg-filter').slideDown(150, function() { jQuery('.wpsg-filter input[type="text"]').first().focus(); } );
-				jQuery(this).addClass('active');
-				
-			}
-			
-		} );
-				
-		wpsg_ajaxBind();
-		
-	} );
Index: /views/js/ajaxupload.js
===================================================================
--- /views/js/ajaxupload.js	(revision 8528)
+++ /views/js/ajaxupload.js	(revision 5261)
@@ -351,6 +351,5 @@
             var input = document.createElement("input");
             input.setAttribute('type', 'file');
-            input.setAttribute('multiple', 'multiple');
-            input.setAttribute('name', this._settings.name + '[]');
+            input.setAttribute('name', this._settings.name);
             
             addStyles(input, {
Index: ews/js/dsimagezoom.min.js
===================================================================
--- /views/js/dsimagezoom.min.js	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-class DsImageZoom{static destroy(t){void 0===t&&(t=document.getElementsByClassName("ds_image_zoom"));for(const e of t){const t=e.getElementsByTagName("img")[0];e.classList.remove("attached"),e.setAttribute("style",""),t.setAttribute("style","")}}static init(t){void 0===t&&(t=document.getElementsByClassName("ds_image_zoom"));for(const e of t){const t=e.getElementsByTagName("img")[0];t.onload=()=>{const s=t.getBoundingClientRect().width,i=t.getBoundingClientRect().height,a=.5*s;e.setAttribute("data-image-width",s),e.setAttribute("data-image-height",i),e.setAttribute("data-factor",a),e.style.width=s+"px",e.style.height=i+"px",t.style.width=s+"px",t.style.height=i+"px",e.classList.add("attached"),e.addEventListener("mousemove",(o=>{t.style.width=s+a+"px",t.style.height=i+a+"px";const n=(o.x-e.getBoundingClientRect().x)/s,d=(o.y-e.getBoundingClientRect().y)/s;t.style.left=-1*a*n+"px",t.style.top=-1*a*d+"px"})),e.addEventListener("mousein",(t=>{})),e.addEventListener("mouseout",(e=>{t.style.width=s+"px",t.style.height=i+"px",t.style.left="0px",t.style.top="0px"}))},t.setAttribute("src",t.getAttribute("data-src"))}}}
Index: /views/js/editable.js
===================================================================
--- /views/js/editable.js	(revision 8528)
+++ /views/js/editable.js	(revision 5261)
@@ -1,111 +1,576 @@
-
-	/**
-	 * Wrapper, um die Editierfunktion austauschbarer zu machen
-	 */
-	jQuery.fn.wpsg_editable = function(url, options) {
-	
-		return this.each(function() {
-			
-			var opt = { 
-				'type': 'text',
-				'url': url,
-				'pk': 1,
-				'ajaxOptions': {
-					'type': 'post'
-				},
-				'params': options['submitdata'],
-				'placeholder': wpsg_ajax.ie_placeholder,
-				'emptytext': wpsg_ajax.ie_emptytext,
-				'validate': function(value) {
-					
-				    //if(jQuery.trim(value) == '') { return wpsg_ajax.ie_validate_empty; }
-				    
-				}				
-			};
-
-            if (typeof options.type == "string") opt['type'] = options.type;
-			if (typeof options.type == "format") opt['format'] = options.format;
-			if (typeof options.type == "viewformat") opt['viewformat'] = options.viewformat;
-			if (typeof options.type == "template") opt['template'] = options.template;
-
-			if (options.type == "select" && Array.isArray(options.data))
-			{
-			 	 
-				var value = "0";
-				var strValue = jQuery(this).html();
-				
-				for (var i in options.data)
-				{
-				
-					if (options.data[i].text == strValue) value = options.data[i].value;
-					
-				}
-				
-				opt.source = options.data;
-                opt.type = 'select';
-                opt.value = value;
-				
-			}			 
-            else if (options.type == 'multiarray')
-            {
-
-                var ar = [];
-                var arData = jQuery.parseJSON(options.data);
-				var strValue = jQuery(this).html();
+/*
+ * Jeditable - jQuery in place edit plugin
+ *
+ * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul
+ *
+ * Licensed under the MIT license:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *
+ * Project home:
+ *   http://www.appelsiini.net/projects/jeditable
+ *
+ * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
+ *    http://www.dyve.net/jquery/?editable
+ *
+ */
+
+/**
+  * Version 1.7.1
+  *
+  * ** means there is basic unit tests for this parameter. 
+  *
+  * @name  Jeditable
+  * @type  jQuery
+  * @param String  target             (POST) URL or function to send edited content to **
+  * @param Hash    options            additional options 
+  * @param String  options[method]    method to use to send edited content (POST or PUT) **
+  * @param Function options[callback] Function to run after submitting edited content **
+  * @param String  options[name]      POST parameter name of edited content
+  * @param String  options[id]        POST parameter name of edited div id
+  * @param Hash    options[submitdata] Extra parameters to send when submitting edited content.
+  * @param String  options[type]      text, textarea or select (or any 3rd party input type) **
+  * @param Integer options[rows]      number of rows if using textarea ** 
+  * @param Integer options[cols]      number of columns if using textarea **
+  * @param Mixed   options[height]    'auto', 'none' or height in pixels **
+  * @param Mixed   options[width]     'auto', 'none' or width in pixels **
+  * @param String  options[loadurl]   URL to fetch input content before editing **
+  * @param String  options[loadtype]  Request type for load url. Should be GET or POST.
+  * @param String  options[loadtext]  Text to display while loading external content.
+  * @param Mixed   options[loaddata]  Extra parameters to pass when fetching content before editing.
+  * @param Mixed   options[data]      Or content given as paramameter. String or function.**
+  * @param String  options[indicator] indicator html to show when saving
+  * @param String  options[tooltip]   optional tooltip text via title attribute **
+  * @param String  options[event]     jQuery event such as 'click' of 'dblclick' **
+  * @param String  options[submit]    submit button value, empty means no button **
+  * @param String  options[cancel]    cancel button value, empty means no button **
+  * @param String  options[cssclass]  CSS class to apply to input form. 'inherit' to copy from parent. **
+  * @param String  options[style]     Style to apply to input form 'inherit' to copy from parent. **
+  * @param String  options[select]    true or false, when true text is highlighted ??
+  * @param String  options[placeholder] Placeholder text or html to insert when element is empty. **
+  * @param String  options[onblur]    'cancel', 'submit', 'ignore' or function ??
+  *             
+  * @param Function options[onsubmit] function(settings, original) { ... } called before submit
+  * @param Function options[onreset]  function(settings, original) { ... } called before reset
+  * @param Function options[onerror]  function(settings, original, xhr) { ... } called on error
+  *             
+  * @param Hash    options[ajaxoptions]  jQuery Ajax options. See docs.jquery.com.
+  *             
+  */
+
+(function($) {
+
+    $.fn.editable = function(target, options) {
+            
+        if ('disable' == target) {
+            $(this).data('disabled.editable', true);
+            return;
+        }
+        if ('enable' == target) {
+            $(this).data('disabled.editable', false);
+            return;
+        }
+        if ('destroy' == target) {
+            $(this)
+                .unbind($(this).data('event.editable'))
+                .removeData('disabled.editable')
+                .removeData('event.editable');
+            return;
+        }
+        
+        var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);
+        
+        /* setup some functions */
+        var plugin   = $.editable.types[settings.type].plugin || function() { };
+        var submit   = $.editable.types[settings.type].submit || function() { };
+        var buttons  = $.editable.types[settings.type].buttons 
+                    || $.editable.types['defaults'].buttons;
+        var content  = $.editable.types[settings.type].content 
+                    || $.editable.types['defaults'].content;
+        var element  = $.editable.types[settings.type].element 
+                    || $.editable.types['defaults'].element;
+        var reset    = $.editable.types[settings.type].reset 
+                    || $.editable.types['defaults'].reset;
+        var callback = settings.callback || function() { };
+        var onedit   = settings.onedit   || function() { }; 
+        var onsubmit = settings.onsubmit || function() { };
+        var onreset  = settings.onreset  || function() { };
+        var onerror  = settings.onerror  || reset;
+        var json = false;  
+        
+        /* show tooltip */
+        if (settings.tooltip) {
+            $(this).attr('title', settings.tooltip);
+        }
+        
+        settings.autowidth  = 'auto' == settings.width;
+        settings.autoheight = 'auto' == settings.height;
+        
+        return this.each(function() {
+                        
+            /* save this to self because this changes when scope changes */
+            var self = this;  
+                   
+            /* inlined block elements lose their width and height after first edit */
+            /* save them for later use as workaround */
+            var savedwidth  = $(self).width();
+            var savedheight = $(self).height();
+            
+            /* save so it can be later used by $.editable('destroy') */
+            $(this).data('event.editable', settings.event);
+            
+            /* if element is empty add something clickable (if requested) */
+            if (!$.trim($(this).html())) {
+                $(this).html(settings.placeholder);
+            }
+            
+            $(this).bind(settings.event, function(e) {
+                
+                /* abort if disabled for this element */
+                if (true === $(this).data('disabled.editable')) {
+                    return;
+                }
+                
+                /* prevent throwing an exeption if edit field is clicked again */
+                if (self.editing) {
+                    return;
+                }
+                
+                /* abort if onedit hook returns false */
+                if (false === onedit.apply(this, [settings, self])) {
+                   return;
+                }
+                
+                /* prevent default action and bubbling */
+                e.preventDefault();
+                e.stopPropagation();
+                
+                /* remove tooltip */
+                if (settings.tooltip) {
+                    $(self).removeAttr('title');
+                }
+                
+                /* figure out how wide and tall we are, saved width and height */
+                /* are workaround for http://dev.jquery.com/ticket/2190 */
+                if (0 == $(self).width()) {
+                    //$(self).css('visibility', 'hidden');
+                    settings.width  = savedwidth;
+                    settings.height = savedheight;
+                } else {
+                    if (settings.width != 'none') {
+                        settings.width = 
+                            settings.autowidth ? $(self).width()  : settings.width;
+                    }
+                    if (settings.height != 'none') {
+                        settings.height = 
+                            settings.autoheight ? $(self).height() : settings.height;
+                    }
+                }
+                //$(this).css('visibility', '');
+                
+                /* remove placeholder text, replace is here because of IE */
+                if ($(this).html().toLowerCase().replace(/(;|")/g, '') == 
+                    settings.placeholder.toLowerCase().replace(/(;|")/g, '')) {
+                        $(this).html('');
+                }
+                                
+                self.editing    = true;
+                self.revert     = $(self).html();
+                $(self).html('');
+
+                /* create the form object */
+                var form = $('<form />');
+                
+                /* apply css or style or both */
+                if (settings.cssclass) {
+                    if ('inherit' == settings.cssclass) {
+                        form.attr('class', $(self).attr('class'));
+                    } else {
+                        form.attr('class', settings.cssclass);
+                    }
+                }
+
+                if (settings.style) {
+                    if ('inherit' == settings.style) {
+                        form.attr('style', $(self).attr('style'));
+                        /* IE needs the second line or display wont be inherited */
+                        form.css('display', $(self).css('display'));                
+                    } else {
+                        form.attr('style', settings.style);
+                    }
+                }
+
+                /* add main input element to form and store it in input */
+                var input = element.apply(form, [settings, self]);
+
+                /* set input content via POST, GET, given data or existing value */
+                var input_content;
+                
+                if (settings.loadurl) {
+                    var t = setTimeout(function() {
+                        input.disabled = true;
+                        content.apply(form, [settings.loadtext, settings, self]);
+                    }, 100);
+
+                    var loaddata = {};
+                    loaddata[settings.id] = self.id;
+                    if ($.isFunction(settings.loaddata)) {
+                        $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
+                    } else {
+                        $.extend(loaddata, settings.loaddata);
+                    }
+                    $.ajax({
+                       type : settings.loadtype,
+                       url  : settings.loadurl,
+                       data : loaddata,
+                       async : false,
+                       success: function(result) {
+                          window.clearTimeout(t);
+                          input_content = result;
+                          input.disabled = false;
+                       }
+                    });
+                } else if (settings.data) {
+                    input_content = settings.data;
+                    if ($.isFunction(settings.data)) {
+                        input_content = settings.data.apply(self, [self.revert, settings]);
+                    }
+                } else {
+                    input_content = self.revert; 
+                }
+                content.apply(form, [input_content, settings, self]);
+
+                input.attr('name', settings.name);
+        
+                /* add buttons to the form */
+                buttons.apply(form, [settings, self]);
+         
+                /* add created form to self */
+                $(self).append(form);
+         
+                /* attach 3rd party plugin if requested */
+                plugin.apply(form, [settings, self]);
+
+                /* focus to first visible form element */
+                $(':input:visible:enabled:first', form).focus();
+
+                /* highlight input contents when requested */
+                if (settings.select) {
+                    input.select();
+                }
+        
+                /* discard changes if pressing esc */
+                input.keydown(function(e) {
+                    if (e.keyCode == 27) {
+                        e.preventDefault();
+                        //self.reset();
+                        reset.apply(form, [settings, self]);
+                    }
+                });
+
+                /* discard, submit or nothing with changes when clicking outside */
+                /* do nothing is usable when navigating with tab */
+                var t;
+                if ('cancel' == settings.onblur) {
+                    input.blur(function(e) {
+                        /* prevent canceling if submit was clicked */
+                        t = setTimeout(function() {
+                            reset.apply(form, [settings, self]);
+                        }, 500);
+                    });
+                } else if ('submit' == settings.onblur) {
+                    input.blur(function(e) {
+                        /* prevent double submit if submit was clicked */
+                        t = setTimeout(function() {
+                            form.submit();
+                        }, 200);
+                    });
+                } else if ($.isFunction(settings.onblur)) {
+                    input.blur(function(e) {
+                        settings.onblur.apply(self, [input.val(), settings]);
+                    });
+                } else {
+                    input.blur(function(e) {
+                      /* TODO: maybe something here */
+                    });
+                }
+
+                form.submit(function(e) {
  
-                for (var i in arData)
-                {
-
-                    objData = { 'text': arData[i].name, 'children': [] };
-
-                    for (var j in arData[i]['fields'])
-                    {
-
-                        objData['children'].push( { 'value': j, 'text': arData[i]['fields'][j] } );
-
-						if (arData[i]['fields'][j] == strValue) value = j;
-						
-                    }
-
-                    ar.push(objData);
-
-                }
-
-                opt.source = ar;
-                opt.type = 'select';
-				opt.value = value; //j;
-
-			}
-			else if (options.type == 'checklist')
-			{
-				
-				opt.type = 'checklist';
-				opt.source = [];
-				opt.value = options.value;
-				
-				for (var i in options.data)
-				{
-				
-					opt.source.push( { value: i, text: options.data[i] } );
-					
-				}
-				
-			}
-			else
-			{
-
-				opt.display = function(value, sourceData) {
-		        
-					jQuery(this).html(sourceData);
-				
-				};
-				
-			}			
-
-            if (typeof options.callback == "function") opt.success = options.callback;
-			
-			jQuery(this).editable(opt);
-			
-		} );
-	
-	}
+                    if (t) { 
+                        clearTimeout(t);
+                    }
+
+                    /* do no submit */
+                    e.preventDefault(); 
+            
+                    /* call before submit hook. */
+                    /* if it returns false abort submitting */                    
+                    if (false !== onsubmit.apply(form, [settings, self])) { 
+                        /* custom inputs call before submit hook. */
+                        /* if it returns false abort submitting */
+                        if (false !== submit.apply(form, [settings, self])) { 
+
+                          /* check if given target is function */
+                          if ($.isFunction(settings.target)) {
+                              var str = settings.target.apply(self, [input.val(), settings]);
+                              $(self).html(str);
+                              self.editing = false;
+                              callback.apply(self, [self.innerHTML, settings]);
+                              /* TODO: this is not dry */                              
+                              if (!$.trim($(self).html())) {
+                                  $(self).html(settings.placeholder);
+                              }
+                          } else {
+                              /* add edited content and id of edited element to POST */
+                              var submitdata = {};
+                              submitdata[settings.name] = input.val();
+                              submitdata[settings.id] = self.id;
+                              /* add extra data to be POST:ed */
+                              if ($.isFunction(settings.submitdata)) {
+                                  $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
+                              } else {
+                                  $.extend(submitdata, settings.submitdata);
+                              }
+
+                              /* quick and dirty PUT support */
+                              if ('PUT' == settings.method) {
+                                  submitdata['_method'] = 'put';
+                              }
+
+                              /* show the saving indicator */
+                              $(self).html(settings.indicator);
+                              
+                              /* defaults for ajaxoptions */
+                              var ajaxoptions = {
+                                  type    : 'POST',
+                                  data    : submitdata,
+                                  dataType: 'html',
+                                  url     : settings.target,
+                                  success : function(result, status) {
+                                      if (ajaxoptions.dataType == 'html') {
+                                        $(self).html(result);
+                                        settings.data = result;
+                                      }
+                                      self.editing = false;
+                                      callback.apply(self, [result, settings]);
+                                      if (!$.trim($(self).html())) {
+                                          $(self).html(settings.placeholder);
+                                      }
+                                  },
+                                  error   : function(xhr, status, error) {
+                                      onerror.apply(form, [settings, self, xhr]);
+                                  }
+                              };
+                              
+                              /* override with what is given in settings.ajaxoptions */
+                              $.extend(ajaxoptions, settings.ajaxoptions);   
+                              $.ajax(ajaxoptions);          
+                              
+                            }
+                        }
+                    }
+                    
+                    /* show tooltip again */
+                    $(self).attr('title', settings.tooltip);
+                    
+                    return false;
+                });
+            });
+            
+            /* privileged methods */
+            this.reset = function(form) {
+                /* prevent calling reset twice when blurring */
+                if (this.editing) {
+                    /* before reset hook, if it returns false abort reseting */
+                    if (false !== onreset.apply(form, [settings, self])) { 
+                        $(self).html(self.revert);
+                        self.editing   = false;
+                        if (!$.trim($(self).html())) {
+                            $(self).html(settings.placeholder);
+                        }
+                        /* show tooltip again */
+                        if (settings.tooltip) {
+                            $(self).attr('title', settings.tooltip);                
+                        }
+                    }                    
+                }
+            };            
+        });
+
+    };
+
+
+    $.editable = {
+        types: {
+            defaults: {
+                element : function(settings, original) {
+                    var input = $('<input type="hidden"></input>');                
+                    $(this).append(input);
+                    return(input);
+                },
+                content : function(string, settings, original) {
+                    $(':input:first', this).val(string);
+                },
+                reset : function(settings, original) {
+                  original.reset(this);
+                },
+                buttons : function(settings, original) {
+                    var form = this;
+                    if (settings.submit) {
+                        /* if given html string use that */
+                        if (settings.submit.match(/>$/)) {
+                            var submit = $(settings.submit).click(function() {
+                                if (submit.attr("type") != "submit") {
+                                    form.submit();
+                                }
+                            });
+                        /* otherwise use button with given string as text */
+                        } else {
+                            var submit = $('<button class="button" type="submit" />');
+                            submit.html(settings.submit);                            
+                        }
+                        $(this).append(submit);
+                    }
+                    if (settings.cancel) {
+                        /* if given html string use that */
+                        if (settings.cancel.match(/>$/)) {
+                            var cancel = $(settings.cancel);
+                        /* otherwise use button with given string as text */
+                        } else {
+                            var cancel = $('<button type="cancel" />');
+                            cancel.html(settings.cancel);
+                        }
+                        $(this).append(cancel);
+
+                        $(cancel).click(function(event) {
+                            //original.reset();
+                            if ($.isFunction($.editable.types[settings.type].reset)) {
+                                var reset = $.editable.types[settings.type].reset;                                                                
+                            } else {
+                                var reset = $.editable.types['defaults'].reset;                                
+                            }
+                            reset.apply(form, [settings, original]);
+                            return false;
+                        });
+                    }
+                }
+            },
+            text: {
+                element : function(settings, original) {
+                    var input = $('<input />');
+                    if (settings.width  != 'none') { input.width(settings.width);  }
+                    if (settings.height != 'none') { input.height(settings.height); }
+                    /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
+                    //input[0].setAttribute('autocomplete','off');
+                    input.attr('autocomplete','off');
+                    $(this).append(input);
+                    return(input);
+                }
+            },
+            textarea: {
+                element : function(settings, original) {
+                    var textarea = $('<textarea />');
+                    if (settings.rows) {
+                        textarea.attr('rows', settings.rows);
+                    } else if (settings.height != "none") {
+                        textarea.height(settings.height);
+                    }
+                    if (settings.cols) {
+                        textarea.attr('cols', settings.cols);
+                    } else if (settings.width != "none") {
+                        textarea.width(settings.width);
+                    }
+                    $(this).append(textarea);
+                    return(textarea);
+                }
+            },
+            select: {
+               element : function(settings, original) {
+                    var select = $('<select />');
+                    $(this).append(select);
+                    return(select);
+                },
+                content : function(data, settings, original) {
+                	
+                	if (typeof settings.json == "undefined")
+                	{
+                    
+                		/* If it is string assume it is json. */
+	                    if (String == data.constructor) {      
+	                        eval ('var json = ' + data);
+	                    } else {
+	                    /* Otherwise assume it is a hash already. */
+	                        var json = data;
+	                    }
+	                 
+	                    settings.json = json;
+	                    
+                	}
+                	else
+                	{
+                		
+                		json = settings.json;
+                		
+                	}
+                    
+                    for (var key in json) {
+                        if (!json.hasOwnProperty(key)) {
+                            continue;
+                        }
+                        if ('selected' == key) {
+                            continue;
+                        } 
+                        
+                        if (typeof json[key]['name'] == 'string')
+                        {
+                        	
+                        	var option = $('<optgroup />').attr('label', json[key]['name']);
+                        	
+                        	for (var key2 in json[key]['fields'])
+                        	{
+                        		option.append($('<option />').val(key2).append(json[key]['fields'][key2]));                        		
+                        	}
+                        	
+                        }
+                        else
+                        {
+                        	var option = $('<option />').val(key).append(json[key]);
+                        }                        
+                        
+                        $('select', this).append(option);    
+                    }                    
+                    /* Loop option again to set selected. IE needed this... */ 
+                    $('select', this).find('option').each(function() {
+                        if ($(this).val() == json['selected'] || 
+                            $(this).text() == $.trim(original.revert)) {
+                                $(this).attr('selected', 'selected');
+                        }
+                    });
+                }
+            }
+        },
+
+        /* Add new input type */
+        addInputType: function(name, input) {
+            $.editable.types[name] = input;
+        }
+    };
+
+    // publicly accessible defaults
+    $.fn.editable.defaults = {
+        name       : 'value',
+        id         : 'id',
+        type       : 'text',
+        width      : 'auto',
+        height     : '25px',
+        event      : 'click.editable',
+        onblur     : 'cancel',
+        loadtype   : 'GET',
+        loadtext   : 'Loading...',
+        placeholder: 'Click to edit',
+        loaddata   : {},
+        submitdata : {},
+        ajaxoptions: {}
+    };
+
+})(jQuery);
Index: /views/js/frontend.js
===================================================================
--- /views/js/frontend.js	(revision 8528)
+++ /views/js/frontend.js	(revision 5261)
@@ -17,29 +17,4 @@
 	} // wpsg_mod_basketteaser_add(produkt_id)
 
-    /**
-     * Aktualisiert ein eventuell eingebundenes Warenkorbwidget
-     */
-    function wpsg_refreshBasketWidget()
-    {
-
-        if (jQuery('.wpsg_basket_widget').length <= 0) return;
-
-        jQuery('.wpsg_basket_widget').html('<img class="loading" src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" />');
-
-        jQuery.ajax( {
-            url: wpsg_ajax.url_basket,
-            data: {
-                'wpsg[ajax]': 1,
-                'wpsg[action]': 'widget'
-            },
-            success: function(data) {
-
-                jQuery('.wpsg_basket_widget').html(data);
-
-            }
-        } );
-
-    } // function wpsg_refreshBasketWidget()
-	
 	function wpsg_customerquestion(url_redirect)
 	{
@@ -47,5 +22,4 @@
 		jQuery('body,html').addClass('wpsg_noscroll');
 		jQuery('body').append('<div id="wpsg_calc_layer"><div class="content"><img class="loading" src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" /></div></div>');
-
 		jQuery.ajax( {
 			url: wpsg_ajax.url_basket,
@@ -65,68 +39,4 @@
 	
 	}
-	
-	
-	/* Minigallery  */
-	function wpsg_product_bind()
-	{
-        
-		// Prev im Produktcarousel
-		jQuery('.wpsg_productteaser .wpsg_productteaser_left').unbind('click').bind('click', function() { 
-        
-            if (typeof jQuery(this).attr("data-target") != "undefined") jQuery('#wpsg_slider_pt_' + jQuery(this).attr("data-target")).carousel("prev"); 
-            else jQuery(this).parents('.wpsg_productteaser').find('.carousel:visible').carousel("prev");
-            
-            return false;
-        
-        } );
-
-        // Next im Productcarousel
-		jQuery('.wpsg_productteaser .wpsg_productteaser_right').unbind('click').bind('click', function() { 
-            
-            if (typeof jQuery(this).attr("data-target") != "undefined") jQuery('#wpsg_slider_pt_' + jQuery(this).attr("data-target")).carousel("next");
-            else jQuery(this).parents('.wpsg_productteaser').find('.carousel:visible').carousel("next");
-            
-            return false; 
-        
-        } );
-
-		// + / - im Produkttemplate
-		jQuery('.wpsg_product_sub, .wpsg_product_add').unbind('click').bind('click', function() {
-
-			var amount = parseInt(jQuery(this).parents('.product_add').find('.wpsg_amount').val());
-			if (amount == NaN || amount < 0) amount = 0;
-
-			if (jQuery(this).hasClass('wpsg_product_add')) amount ++;
-			else if (amount > 1) amount --;
-
-			jQuery(this).parents('.product_add').find('.wpsg_amount').val(amount);
-
-			return false;
-
-		} );
-        
-    }
-
-	/**
-	 * Sperrt die Funktionen im Produkttemplate, wÃ€hrend einer Ajax Aktion
-	 * @param template_index
-     */
-	function wpsg_blockProductTemplate(template_index)
-	{
-		
-		jQuery('#wpsg_produktform_' + template_index).append('<div class="wpsg_product_layer"><img src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" /></div>');
-		
-	} // function wpsg_blockProductTemplate(template_index)
-
-	/**
-	 * Entsperrt die Funktionen im Produkttemplate nach einer Ajax Aktion
-	 * @param template_index
-     */
-	function wpsg_unblockProductTemplate(template_index)
-	{
-		
-		jQuery('#wpsg_produktform_' + template_index + ' .wpsg_product_layer').remove();
-		
-	} // function wpsg_unblockProductTemplate(template_index)
 	
 	wpsg_numberformat = function (number, decimals, dec_point, thousands_sep) 
@@ -209,19 +119,3 @@
 	  
 	};
-
-	wpsg_round = function(value, exp) {
-
-		if (typeof exp === 'undefined' || +exp === 0) return Math.round(value);
-
-		value = +value;
-		exp = +exp;
-
-		if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) return NaN;
-
-		value = value.toString().split('e');
-		value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
-
-		value = value.toString().split('e');
-		return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
-
-	}
+	
Index: ews/js/fslightbox.js
===================================================================
--- /views/js/fslightbox.js	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var o in n)("object"==typeof exports?exports:e)[o]=n[o]}}(window,(function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);var o,i="fslightbox-",r="".concat(i,"styles"),s="".concat(i,"cursor-grabbing"),a="".concat(i,"full-dimension"),c="".concat(i,"flex-centered"),l="".concat(i,"open"),u="".concat(i,"transform-transition"),d="".concat(i,"absoluted"),f="".concat(i,"slide-btn"),p="".concat(f,"-container"),h="".concat(i,"fade-in"),m="".concat(i,"fade-out"),g=h+"-strong",v=m+"-strong",b="".concat(i,"opacity-"),x="".concat(b,"1"),y="".concat(i,"source");function w(e){return(w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function S(e){var t=e.stageIndexes,n=e.core.stageManager,o=e.props.sources.length-1;n.getPreviousSlideIndex=function(){return 0===t.current?o:t.current-1},n.getNextSlideIndex=function(){return t.current===o?0:t.current+1},n.updateStageIndexes=0===o?function(){}:1===o?function(){0===t.current?(t.next=1,delete t.previous):(t.previous=0,delete t.next)}:function(){t.previous=n.getPreviousSlideIndex(),t.next=n.getNextSlideIndex()},n.i=o<=2?function(){return!0}:function(e){var n=t.current;if(0===n&&e===o||n===o&&0===e)return!0;var i=n-e;return-1===i||0===i||1===i}}"object"===("undefined"==typeof document?"undefined":w(document))&&((o=document.createElement("style")).className=r,o.appendChild(document.createTextNode(".fslightbox-absoluted{position:absolute;top:0;left:0}.fslightbox-fade-in{animation:fslightbox-fade-in .3s cubic-bezier(0,0,.7,1)}.fslightbox-fade-out{animation:fslightbox-fade-out .3s ease}.fslightbox-fade-in-strong{animation:fslightbox-fade-in-strong .3s cubic-bezier(0,0,.7,1)}.fslightbox-fade-out-strong{animation:fslightbox-fade-out-strong .3s ease}@keyframes fslightbox-fade-in{from{opacity:.65}to{opacity:1}}@keyframes fslightbox-fade-out{from{opacity:.35}to{opacity:0}}@keyframes fslightbox-fade-in-strong{from{opacity:.3}to{opacity:1}}@keyframes fslightbox-fade-out-strong{from{opacity:1}to{opacity:0}}.fslightbox-cursor-grabbing{cursor:grabbing}.fslightbox-full-dimension{width:100%;height:100%}.fslightbox-open{overflow:hidden;height:100%}.fslightbox-flex-centered{display:flex;justify-content:center;align-items:center}.fslightbox-opacity-0{opacity:0!important}.fslightbox-opacity-1{opacity:1!important}.fslightbox-scrollbarfix{padding-right:17px}.fslightbox-transform-transition{transition:transform .3s}.fslightbox-container{font-family:Arial,sans-serif;position:fixed;top:0;left:0;background:linear-gradient(rgba(30,30,30,.9),#000 1810%);touch-action:pinch-zoom;z-index:1000000000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fslightbox-container *{box-sizing:border-box}.fslightbox-svg-path{transition:fill .15s ease;fill:#ddd}.fslightbox-nav{height:45px;width:100%;position:absolute;top:0;left:0}.fslightbox-slide-number-container{display:flex;justify-content:center;align-items:center;position:relative;height:100%;font-size:15px;color:#d7d7d7;z-index:0;max-width:55px;text-align:left}.fslightbox-slide-number-container .fslightbox-flex-centered{height:100%}.fslightbox-slash{display:block;margin:0 5px;width:1px;height:12px;transform:rotate(15deg);background:#fff}.fslightbox-toolbar{position:absolute;z-index:3;right:0;top:0;height:100%;display:flex;background:rgba(35,35,35,.65)}.fslightbox-toolbar-button{height:100%;width:45px;cursor:pointer}.fslightbox-toolbar-button:hover .fslightbox-svg-path{fill:#fff}.fslightbox-slide-btn-container{display:flex;align-items:center;padding:12px 12px 12px 6px;position:absolute;top:50%;cursor:pointer;z-index:3;transform:translateY(-50%)}@media (min-width:476px){.fslightbox-slide-btn-container{padding:22px 22px 22px 6px}}@media (min-width:768px){.fslightbox-slide-btn-container{padding:30px 30px 30px 6px}}.fslightbox-slide-btn-container:hover .fslightbox-svg-path{fill:#f1f1f1}.fslightbox-slide-btn{padding:9px;font-size:26px;background:rgba(35,35,35,.65)}@media (min-width:768px){.fslightbox-slide-btn{padding:10px}}@media (min-width:1600px){.fslightbox-slide-btn{padding:11px}}.fslightbox-slide-btn-container-previous{left:0}@media (max-width:475.99px){.fslightbox-slide-btn-container-previous{padding-left:3px}}.fslightbox-slide-btn-container-next{right:0;padding-left:12px;padding-right:3px}@media (min-width:476px){.fslightbox-slide-btn-container-next{padding-left:22px}}@media (min-width:768px){.fslightbox-slide-btn-container-next{padding-left:30px}}@media (min-width:476px){.fslightbox-slide-btn-container-next{padding-right:6px}}.fslightbox-down-event-detector{position:absolute;z-index:1}.fslightbox-slide-swiping-hoverer{z-index:4}.fslightbox-invalid-file-wrapper{font-size:22px;color:#eaebeb;margin:auto}.fslightbox-video{object-fit:cover}.fslightbox-youtube-iframe{border:0}.fslightboxl{display:block;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:67px;height:67px}.fslightboxl div{box-sizing:border-box;display:block;position:absolute;width:54px;height:54px;margin:6px;border:5px solid;border-color:#999 transparent transparent transparent;border-radius:50%;animation:fslightboxl 1.2s cubic-bezier(.5,0,.5,1) infinite}.fslightboxl div:nth-child(1){animation-delay:-.45s}.fslightboxl div:nth-child(2){animation-delay:-.3s}.fslightboxl div:nth-child(3){animation-delay:-.15s}@keyframes fslightboxl{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fslightbox-source{position:relative;z-index:2;opacity:0}")),document.head.appendChild(o));function L(e){var t,n=e.props,o=0,i={};this.getSourceTypeFromLocalStorageByUrl=function(e){return t[e]?t[e]:r(e)},this.handleReceivedSourceTypeForUrl=function(e,n){if(!1===i[n]&&(o--,"invalid"!==e?i[n]=e:delete i[n],0===o)){!function(e,t){for(var n in t)e[n]=t[n]}(t,i);try{localStorage.setItem("fslightbox-types",JSON.stringify(t))}catch(e){}}};var r=function(e){o++,i[e]=!1};if(n.disableLocalStorage)this.getSourceTypeFromLocalStorageByUrl=function(){},this.handleReceivedSourceTypeForUrl=function(){};else{try{t=JSON.parse(localStorage.getItem("fslightbox-types"))}catch(e){}t||(t={},this.getSourceTypeFromLocalStorageByUrl=r)}}function A(e,t,n,o){var i=e.data,r=e.elements.sources,s=n/o,a=0;this.adjustSize=function(){if((a=i.maxSourceWidth/s)<i.maxSourceHeight)return n<i.maxSourceWidth&&(a=o),c();a=o>i.maxSourceHeight?i.maxSourceHeight:o,c()};var c=function(){r[t].style.width=a*s+"px",r[t].style.height=a+"px"}}function C(e,t){var n=this,o=e.collections.sourceSizers,i=e.elements,r=i.sourceAnimationWrappers,s=i.sources,a=e.isl,c=e.resolve;function l(e,n){o[t]=c(A,[t,e,n]),o[t].adjustSize()}this.runActions=function(e,o){a[t]=!0,s[t].classList.add(x),r[t].classList.add(g),r[t].removeChild(r[t].firstChild),l(e,o),n.runActions=l}}function E(e,t){var n,o=this,i=e.elements.sources,r=e.props,s=(0,e.resolve)(C,[t]);this.handleImageLoad=function(e){var t=e.target,n=t.naturalWidth,o=t.naturalHeight;s.runActions(n,o)},this.handleVideoLoad=function(e){var t=e.target,o=t.videoWidth,i=t.videoHeight;n=!0,s.runActions(o,i)},this.handleNotMetaDatedVideoLoad=function(){n||o.handleYoutubeLoad()},this.handleYoutubeLoad=function(){var e=1920,t=1080;r.maxYoutubeDimensions&&(e=r.maxYoutubeDimensions.width,t=r.maxYoutubeDimensions.height),s.runActions(e,t)},this.handleCustomLoad=function(){var e=i[t],n=e.offsetWidth,r=e.offsetHeight;n&&r?s.runActions(n,r):setTimeout(o.handleCustomLoad)}}function F(e,t,n){var o=e.elements.sources,i=e.props.customClasses,r=i[t]?i[t]:"";o[t].className=n+" "+r}function I(e,t){var n=e.elements.sources,o=e.props.customAttributes;for(var i in o[t])n[t].setAttribute(i,o[t][i])}function T(e,t){var n=e.collections.sourceLoadHandlers,o=e.elements,i=o.sources,r=o.sourceAnimationWrappers,s=e.props.sources;i[t]=document.createElement("img"),F(e,t,y),i[t].src=s[t],i[t].onload=n[t].handleImageLoad,I(e,t),r[t].appendChild(i[t])}function N(e,t){var n=e.collections.sourceLoadHandlers,o=e.elements,i=o.sources,r=o.sourceAnimationWrappers,s=e.props,a=s.sources,c=s.videosPosters;i[t]=document.createElement("video"),F(e,t,y),i[t].src=a[t],i[t].onloadedmetadata=function(e){n[t].handleVideoLoad(e)},i[t].controls=!0,I(e,t),c[t]&&(i[t].poster=c[t]);var l=document.createElement("source");l.src=a[t],i[t].appendChild(l),setTimeout(n[t].handleNotMetaDatedVideoLoad,3e3),r[t].appendChild(i[t])}function z(e,t){var n=e.collections.sourceLoadHandlers,o=e.elements,r=o.sources,s=o.sourceAnimationWrappers,a=e.props.sources;r[t]=document.createElement("iframe"),F(e,t,"".concat(y," ").concat(i,"youtube-iframe"));var c=a[t],l=c.split("?")[1];r[t].src="https://www.youtube.com/embed/".concat(c.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/)[2],"?").concat(l||""),r[t].allowFullscreen=!0,I(e,t),s[t].appendChild(r[t]),n[t].handleYoutubeLoad()}function P(e,t){var n=e.collections.sourceLoadHandlers,o=e.elements,i=o.sources,r=o.sourceAnimationWrappers,s=e.props.sources;i[t]=s[t],F(e,t,"".concat(i[t].className," ").concat(y)),r[t].appendChild(i[t]),n[t].handleCustomLoad()}function k(e,t){var n=e.elements,o=n.sources,r=n.sourceAnimationWrappers;e.props.sources;o[t]=document.createElement("div"),o[t].className="".concat(i,"invalid-file-wrapper ").concat(c),o[t].innerHTML="Invalid source",r[t].classList.add(g),r[t].removeChild(r[t].firstChild),r[t].appendChild(o[t])}function H(e){var t=e.collections,n=t.sourceLoadHandlers,o=t.sourcesRenderFunctions,i=e.core.sourceDisplayFacade,r=e.resolve;this.runActionsForSourceTypeAndIndex=function(t,s){var a;switch("invalid"!==t&&(n[s]=r(E,[s])),t){case"image":a=T;break;case"video":a=N;break;case"youtube":a=z;break;case"custom":a=P;break;default:a=k}o[s]=function(){return a(e,s)},i.displaySourcesWhichShouldBeDisplayed()}}function W(){var e,t,n,o={isUrlYoutubeOne:function(e){var t=document.createElement("a");return t.href=e,"www.youtube.com"===t.hostname||"youtu.be"===t.hostname},getTypeFromResponseContentType:function(e){return e.slice(0,e.indexOf("/"))}};function i(){if(4!==n.readyState){if(2===n.readyState){var e;switch(o.getTypeFromResponseContentType(n.getResponseHeader("content-type"))){case"image":e="image";break;case"video":e="video";break;default:e="invalid"}n.onreadystatechange=null,n.abort(),t(e)}}else t("invalid")}this.setUrlToCheck=function(t){e=t},this.getSourceType=function(r){if(o.isUrlYoutubeOne(e))return r("youtube");t=r,(n=new XMLHttpRequest).onreadystatechange=i,n.open("GET",e,!0),n.send()}}function R(e,t,n){var o=e.props,i=o.types,r=o.type,s=o.sources,a=e.resolve;this.getTypeSetByClientForIndex=function(e){var t;return i&&i[e]?t=i[e]:r&&(t=r),t},this.retrieveTypeWithXhrForIndex=function(e){var o=a(W);o.setUrlToCheck(s[e]),o.getSourceType((function(o){t.handleReceivedSourceTypeForUrl(o,s[e]),n.runActionsForSourceTypeAndIndex(o,e)}))}}function D(e,t){var n=e.core.stageManager,o=e.elements,i=o.smw,r=o.sourceWrappersContainer,s=e.props,l=0,f=document.createElement("div");function p(e){f.style.transform="translateX(".concat(e+l,"px)"),l=0}function h(){return(1+s.slideDistance)*innerWidth}f.className="".concat(d," ").concat(a," ").concat(c),f.s=function(){f.style.display="flex"},f.h=function(){f.style.display="none"},f.a=function(){f.classList.add(u)},f.d=function(){f.classList.remove(u)},f.n=function(){f.style.removeProperty("transform")},f.v=function(e){return l=e,f},f.ne=function(){p(-h())},f.z=function(){p(0)},f.p=function(){p(h())},n.i(t)||f.h(),i[t]=f,r.appendChild(f),function(e,t){var n=e.elements,o=n.smw,i=n.sourceAnimationWrappers,r=document.createElement("div"),s=document.createElement("div");s.className="fslightboxl";for(var a=0;a<3;a++){var c=document.createElement("div");s.appendChild(c)}r.appendChild(s),o[t].appendChild(r),i[t]=r}(e,t)}function O(e,t,n,o){var r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.setAttributeNS(null,"width",t),r.setAttributeNS(null,"height",t),r.setAttributeNS(null,"viewBox",n);var s=document.createElementNS("http://www.w3.org/2000/svg","path");return s.setAttributeNS(null,"class","".concat(i,"svg-path")),s.setAttributeNS(null,"d",o),r.appendChild(s),e.appendChild(r),r}function M(e,t){var n=document.createElement("div");return n.className="".concat(i,"toolbar-button ").concat(c),n.title=t,e.appendChild(n),n}function j(e,t){var n=document.createElement("div");n.className="".concat(i,"toolbar"),t.appendChild(n),function(e,t){var n=e.componentsServices,o=e.data,i=e.fs,r="M4.5 11H3v4h4v-1.5H4.5V11zM3 7h1.5V4.5H7V3H3v4zm10.5 6.5H11V15h4v-4h-1.5v2.5zM11 3v1.5h2.5V7H15V3h-4z",s=M(t);s.title="Enter fullscreen";var a=O(s,"20px","0 0 18 18",r);n.ofs=function(){o.ifs=!0,s.title="Exit fullscreen",a.setAttributeNS(null,"width","24px"),a.setAttributeNS(null,"height","24px"),a.setAttributeNS(null,"viewBox","0 0 950 1024"),a.firstChild.setAttributeNS(null,"d","M682 342h128v84h-212v-212h84v128zM598 810v-212h212v84h-128v128h-84zM342 342v-128h84v212h-212v-84h128zM214 682v-84h212v212h-84v-128h-128z")},n.xfs=function(){o.ifs=!1,s.title="Enter fullscreen",a.setAttributeNS(null,"width","20px"),a.setAttributeNS(null,"height","20px"),a.setAttributeNS(null,"viewBox","0 0 18 18"),a.firstChild.setAttributeNS(null,"d",r)},s.onclick=i.t}(e,n),function(e,t){var n=M(t,"Close");n.onclick=e.core.lightboxCloser.closeLightbox,O(n,"20px","0 0 24 24","M 4.7070312 3.2929688 L 3.2929688 4.7070312 L 10.585938 12 L 3.2929688 19.292969 L 4.7070312 20.707031 L 12 13.414062 L 19.292969 20.707031 L 20.707031 19.292969 L 13.414062 12 L 20.707031 4.7070312 L 19.292969 3.2929688 L 12 10.585938 L 4.7070312 3.2929688 z")}(e,n)}function X(e){var t=e.props.sources,n=e.elements.container,o=document.createElement("div");o.className="".concat(i,"nav"),n.appendChild(o),j(e,o),t.length>1&&function(e,t){var n=e.componentsServices,o=e.props.sources,r=(e.stageIndexes,document.createElement("div"));r.className="".concat(i,"slide-number-container");var s=document.createElement("div");s.className=c;var a=document.createElement("span");n.setSlideNumber=function(e){return a.innerHTML=e};var l=document.createElement("span");l.className="".concat(i,"slash");var u=document.createElement("div");u.innerHTML=o.length,r.appendChild(s),s.appendChild(a),s.appendChild(l),s.appendChild(u),t.appendChild(r),setTimeout((function(){s.offsetWidth>55&&(r.style.justifyContent="flex-start")}))}(e,o)}function B(e,t,n,o){var i=e.elements.container,r=n.charAt(0).toUpperCase()+n.slice(1),s=document.createElement("div");s.className="".concat(p," ").concat(p,"-").concat(n),s.title="".concat(r," slide"),s.onclick=t,function(e,t){var n=document.createElement("div");n.className="".concat(f," ").concat(c),O(n,"20px","0 0 20 20",t),e.appendChild(n)}(s,o),i.appendChild(s)}function U(e){var t=e.core,n=t.lightboxCloser,o=t.slideChangeFacade,i=e.fs;this.listener=function(e){switch(e.key){case"Escape":n.closeLightbox();break;case"ArrowLeft":o.changeToPrevious();break;case"ArrowRight":o.changeToNext();break;case"F11":e.preventDefault(),i.t()}}}function q(e){var t=e.elements,n=e.sourcePointerProps,o=e.stageIndexes;function i(e,o){t.smw[e].v(n.swipedX)[o]()}this.runActionsForEvent=function(e){var r,a,c;t.container.contains(t.slideSwipingHoverer)||t.container.appendChild(t.slideSwipingHoverer),r=t.container,a=s,(c=r.classList).contains(a)||c.add(a),n.swipedX=e.screenX-n.downScreenX;var l=o.previous,u=o.next;i(o.current,"z"),void 0!==l&&n.swipedX>0?i(l,"ne"):void 0!==u&&n.swipedX<0&&i(u,"p")}}function V(e){var t=e.props.sources,n=e.resolve,o=e.sourcePointerProps,i=n(q);1===t.length?this.listener=function(){o.swipedX=1}:this.listener=function(e){o.isPointering&&i.runActionsForEvent(e)}}function _(e){var t=e.core.slideIndexChanger,n=e.elements.smw,o=e.stageIndexes,i=e.sws;function r(e){var t=n[o.current];t.a(),t[e]()}function s(e,t){void 0!==e&&(n[e].s(),n[e][t]())}this.runPositiveSwipedXActions=function(){var e=o.previous;if(void 0===e)r("z");else{r("p");var n=o.next;t.changeTo(e);var a=o.previous;i.d(a),i.b(n),r("z"),s(a,"ne")}},this.runNegativeSwipedXActions=function(){var e=o.next;if(void 0===e)r("z");else{r("ne");var n=o.previous;t.changeTo(e);var a=o.next;i.d(a),i.b(n),r("z"),s(a,"p")}}}function Y(e,t){e.contains(t)&&e.removeChild(t)}function J(e){var t=e.core.lightboxCloser,n=e.elements,o=e.resolve,i=e.sourcePointerProps,r=o(_);this.runNoSwipeActions=function(){Y(n.container,n.slideSwipingHoverer),i.isSourceDownEventTarget||t.closeLightbox(),i.isPointering=!1},this.runActions=function(){i.swipedX>0?r.runPositiveSwipedXActions():r.runNegativeSwipedXActions(),Y(n.container,n.slideSwipingHoverer),n.container.classList.remove(s),i.isPointering=!1}}function G(e){var t=e.resolve,n=e.sourcePointerProps,o=t(J);this.listener=function(){n.isPointering&&(n.swipedX?o.runActions():o.runNoSwipeActions())}}function $(e){var t=this,n=e.core,o=n.eventsDispatcher,i=n.globalEventsController,r=n.scrollbarRecompensor,s=e.data,a=e.elements,c=e.fs,u=e.props,d=e.sourcePointerProps;this.isLightboxFadingOut=!1,this.runActions=function(){t.isLightboxFadingOut=!0,a.container.classList.add(v),i.removeListeners(),u.exitFullscreenOnClose&&s.ifs&&c.x(),setTimeout((function(){t.isLightboxFadingOut=!1,d.isPointering=!1,a.container.classList.remove(v),document.documentElement.classList.remove(l),r.removeRecompense(),document.body.removeChild(a.container),o.dispatch("onClose")}),270)}}function K(e,t){var n=e.classList;n.contains(t)&&n.remove(t)}function Q(e){var t,n,o;n=(t=e).core.eventsDispatcher,o=t.props,n.dispatch=function(e){o[e]&&o[e]()},function(e){var t=e.componentsServices,n=e.data,o=e.fs,i=["fullscreenchange","webkitfullscreenchange","mozfullscreenchange","MSFullscreenChange"];function r(e){for(var t=0;t<i.length;t++)document[e](i[t],s)}function s(){document.fullscreenElement||document.webkitIsFullScreen||document.mozFullScreen||document.msFullscreenElement?t.ofs():t.xfs()}o.o=function(){t.ofs();var e=document.documentElement;e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()},o.x=function(){t.xfs(),document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen()},o.t=function(){n.ifs?o.x():o.o()},o.l=function(){r("addEventListener")},o.q=function(){r("removeEventListener")}}(e),function(e){var t=e.core,n=t.globalEventsController,o=t.windowResizeActioner,i=e.fs,r=e.resolve,s=r(U),a=r(V),c=r(G);n.attachListeners=function(){document.addEventListener("pointermove",a.listener),document.addEventListener("pointerup",c.listener),addEventListener("resize",o.runActions),document.addEventListener("keydown",s.listener),i.l()},n.removeListeners=function(){document.removeEventListener("pointermove",a.listener),document.removeEventListener("pointerup",c.listener),removeEventListener("resize",o.runActions),document.removeEventListener("keydown",s.listener),i.q()}}(e),function(e){var t=e.core.lightboxCloser,n=(0,e.resolve)($);t.closeLightbox=function(){n.isLightboxFadingOut||n.runActions()}}(e),function(e){var t=e.data,n=e.core.scrollbarRecompensor;function o(){document.body.offsetHeight>innerHeight&&(document.body.style.marginRight=t.scrollbarWidth+"px")}n.addRecompense=function(){"complete"===document.readyState?o():addEventListener("load",(function(){o(),n.addRecompense=o}))},n.removeRecompense=function(){document.body.style.removeProperty("margin-right")}}(e),function(e){var t=e.core,n=t.slideChangeFacade,o=t.slideIndexChanger,i=t.stageManager;e.props.sources.length>1?(n.changeToPrevious=function(){o.jumpTo(i.getPreviousSlideIndex())},n.changeToNext=function(){o.jumpTo(i.getNextSlideIndex())}):(n.changeToPrevious=function(){},n.changeToNext=function(){})}(e),function(e){var t=e.componentsServices,n=e.core,o=n.slideIndexChanger,i=n.sourceDisplayFacade,r=n.stageManager,s=e.elements,a=s.smw,c=s.sourceAnimationWrappers,l=e.isl,u=e.stageIndexes,d=e.sws;o.changeTo=function(e){u.current=e,r.updateStageIndexes(),t.setSlideNumber(e+1),i.displaySourcesWhichShouldBeDisplayed()},o.jumpTo=function(e){var t=u.previous,n=u.current,i=u.next,s=l[n],f=l[e];o.changeTo(e);for(var p=0;p<a.length;p++)a[p].d();d.d(n),d.c(),requestAnimationFrame((function(){requestAnimationFrame((function(){var e=u.previous,o=u.next;function p(){r.i(n)?n===u.previous?a[n].ne():n===u.next&&a[n].p():(a[n].h(),a[n].n())}s&&c[n].classList.add(m),f&&c[u.current].classList.add(h),d.a(),void 0!==e&&e!==n&&a[e].ne(),a[u.current].n(),void 0!==o&&o!==n&&a[o].p(),d.b(t),d.b(i),l[n]?setTimeout(p,260):p()}))}))}}(e),function(e){var t=e.core.sourcesPointerDown,n=e.elements,o=n.smw,i=n.sources,r=e.sourcePointerProps,s=e.stageIndexes;t.listener=function(e){"VIDEO"!==e.target.tagName&&e.preventDefault(),r.isPointering=!0,r.downScreenX=e.screenX,r.swipedX=0;var t=i[s.current];t&&t.contains(e.target)?r.isSourceDownEventTarget=!0:r.isSourceDownEventTarget=!1;for(var n=0;n<o.length;n++)o[n].d()}}(e),function(e){var t=e.collections.sourcesRenderFunctions,n=e.core.sourceDisplayFacade,o=e.props,i=e.stageIndexes;function r(e){t[e]&&(t[e](),delete t[e])}n.displaySourcesWhichShouldBeDisplayed=function(){if(o.loadOnlyCurrentSource)r(i.current);else for(var e in i)r(i[e])}}(e),function(e){var t=e.core.stageManager,n=e.elements,o=n.smw,i=n.sourceAnimationWrappers,r=e.isl,s=e.stageIndexes,a=e.sws;a.a=function(){for(var e in s)o[s[e]].s()},a.b=function(e){void 0===e||t.i(e)||(o[e].h(),o[e].n())},a.c=function(){for(var e in s)a.d(s[e])},a.d=function(e){if(r[e]){var t=i[e];K(t,g),K(t,h),K(t,m)}}}(e),function(e){var t=e.collections.sourceSizers,n=e.core.windowResizeActioner,o=e.data,i=e.elements.smw,r=e.stageIndexes;n.runActions=function(){innerWidth<992?o.maxSourceWidth=innerWidth:o.maxSourceWidth=.9*innerWidth,o.maxSourceHeight=.9*innerHeight;for(var e=0;e<i.length;e++)i[e].d(),t[e]&&t[e].adjustSize();var n=r.previous,s=r.next;void 0!==n&&i[n].ne(),void 0!==s&&i[s].p()}}(e)}function Z(e){var t=e.componentsServices,n=e.core,o=n.eventsDispatcher,r=n.globalEventsController,s=n.scrollbarRecompensor,c=n.sourceDisplayFacade,u=n.stageManager,f=n.windowResizeActioner,p=e.data,h=e.elements,m=(e.props,e.stageIndexes),v=e.sws;function b(){var t,n;p.i=!0,p.scrollbarWidth=function(){var e=document.createElement("div"),t=e.style,n=document.createElement("div");t.visibility="hidden",t.width="100px",t.msOverflowStyle="scrollbar",t.overflow="scroll",n.style.width="100%",document.body.appendChild(e);var o=e.offsetWidth;e.appendChild(n);var i=n.offsetWidth;return document.body.removeChild(e),o-i}(),Q(e),h.container=document.createElement("div"),h.container.className="".concat(i,"container ").concat(a," ").concat(g),function(e){var t=e.elements;t.slideSwipingHoverer=document.createElement("div"),t.slideSwipingHoverer.className="".concat(i,"slide-swiping-hoverer ").concat(a," ").concat(d)}(e),X(e),function(e){var t=e.core.sourcesPointerDown,n=e.elements,o=e.props.sources,i=document.createElement("div");i.className="".concat(d," ").concat(a),n.container.appendChild(i),i.addEventListener("pointerdown",t.listener),n.sourceWrappersContainer=i;for(var r=0;r<o.length;r++)D(e,r)}(e),e.props.sources.length>1&&(n=(t=e).core.slideChangeFacade,B(t,n.changeToPrevious,"previous","M18.271,9.212H3.615l4.184-4.184c0.306-0.306,0.306-0.801,0-1.107c-0.306-0.306-0.801-0.306-1.107,0L1.21,9.403C1.194,9.417,1.174,9.421,1.158,9.437c-0.181,0.181-0.242,0.425-0.209,0.66c0.005,0.038,0.012,0.071,0.022,0.109c0.028,0.098,0.075,0.188,0.142,0.271c0.021,0.026,0.021,0.061,0.045,0.085c0.015,0.016,0.034,0.02,0.05,0.033l5.484,5.483c0.306,0.307,0.801,0.307,1.107,0c0.306-0.305,0.306-0.801,0-1.105l-4.184-4.185h14.656c0.436,0,0.788-0.353,0.788-0.788S18.707,9.212,18.271,9.212z"),B(t,n.changeToNext,"next","M1.729,9.212h14.656l-4.184-4.184c-0.307-0.306-0.307-0.801,0-1.107c0.305-0.306,0.801-0.306,1.106,0l5.481,5.482c0.018,0.014,0.037,0.019,0.053,0.034c0.181,0.181,0.242,0.425,0.209,0.66c-0.004,0.038-0.012,0.071-0.021,0.109c-0.028,0.098-0.075,0.188-0.143,0.271c-0.021,0.026-0.021,0.061-0.045,0.085c-0.015,0.016-0.034,0.02-0.051,0.033l-5.483,5.483c-0.306,0.307-0.802,0.307-1.106,0c-0.307-0.305-0.307-0.801,0-1.105l4.184-4.185H1.729c-0.436,0-0.788-0.353-0.788-0.788S1.293,9.212,1.729,9.212z")),function(e){for(var t=e.props.sources,n=e.resolve,o=n(L),i=n(H),r=n(R,[o,i]),s=0;s<t.length;s++)if("string"==typeof t[s]){var a=r.getTypeSetByClientForIndex(s);if(a)i.runActionsForSourceTypeAndIndex(a,s);else{var c=o.getSourceTypeFromLocalStorageByUrl(t[s]);c?i.runActionsForSourceTypeAndIndex(c,s):r.retrieveTypeWithXhrForIndex(s)}}else i.runActionsForSourceTypeAndIndex("custom",s)}(e),o.dispatch("onInit")}e.open=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=m.previous,a=m.current,d=m.next;m.current=n,p.i||S(e),u.updateStageIndexes(),p.i?(v.c(),v.a(),v.b(i),v.b(a),v.b(d),o.dispatch("onShow")):b(),c.displaySourcesWhichShouldBeDisplayed(),t.setSlideNumber(n+1),document.body.appendChild(h.container),document.documentElement.classList.add(l),s.addRecompense(),r.attachListeners(),f.runActions(),h.smw[m.current].n(),o.dispatch("onOpen")}}function ee(e,t,n){return(ee=te()?Reflect.construct.bind():function(e,t,n){var o=[null];o.push.apply(o,t);var i=new(Function.bind.apply(e,o));return n&&ne(i,n.prototype),i}).apply(null,arguments)}function te(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function ne(e,t){return(ne=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function oe(e){return function(e){if(Array.isArray(e))return ie(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ie(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ie(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ie(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function re(){for(var e=document.getElementsByTagName("a"),t=function(t){if(!e[t].hasAttribute("data-fslightbox"))return"continue";var n=e[t].hasAttribute("data-href")?e[t].getAttribute("data-href"):e[t].getAttribute("href");if(!n)return console.warn('The "data-fslightbox" attribute was set without the "href" attribute.'),"continue";var o=e[t].getAttribute("data-fslightbox");fsLightboxInstances[o]||(fsLightboxInstances[o]=new FsLightbox);var i=null;"#"===n.charAt(0)?(i=document.getElementById(n.substring(1)).cloneNode(!0)).removeAttribute("id"):i=n,fsLightboxInstances[o].props.sources.push(i),fsLightboxInstances[o].elements.a.push(e[t]);var r=fsLightboxInstances[o].props.sources.length-1;e[t].onclick=function(e){e.preventDefault(),fsLightboxInstances[o].open(r)},d("types","data-type"),d("videosPosters","data-video-poster"),d("customClasses","data-class"),d("customClasses","data-custom-class");for(var s=["href","data-fslightbox","data-href","data-type","data-video-poster","data-class","data-custom-class"],a=e[t].attributes,c=fsLightboxInstances[o].props.customAttributes,l=0;l<a.length;l++)if(-1===s.indexOf(a[l].name)&&"data-"===a[l].name.substr(0,5)){c[r]||(c[r]={});var u=a[l].name.substr(5);c[r][u]=a[l].value}function d(n,i){e[t].hasAttribute(i)&&(fsLightboxInstances[o].props[n][r]=e[t].getAttribute(i))}},n=0;n<e.length;n++)t(n);var o=Object.keys(fsLightboxInstances);window.fsLightbox=fsLightboxInstances[o[o.length-1]]}window.FsLightbox=function(){var e=this;this.props={sources:[],customAttributes:[],customClasses:[],types:[],videosPosters:[],slideDistance:.3},this.data={isFullscreenOpen:!1,maxSourceWidth:0,maxSourceHeight:0,scrollbarWidth:0},this.isl=[],this.sourcePointerProps={downScreenX:null,isPointering:!1,isSourceDownEventTarget:!1,swipedX:0},this.stageIndexes={},this.elements={a:[],container:null,slideSwipingHoverer:null,smw:[],sourceWrappersContainer:null,sources:[],sourceAnimationWrappers:[]},this.componentsServices={setSlideNumber:function(){}},this.resolve=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return n.unshift(e),ee(t,oe(n))},this.collections={sourceLoadHandlers:[],sourcesRenderFunctions:[],sourceSizers:[]},this.core={eventsDispatcher:{},globalEventsController:{},lightboxCloser:{},lightboxUpdater:{},scrollbarRecompensor:{},slideChangeFacade:{},slideIndexChanger:{},sourcesPointerDown:{},sourceDisplayFacade:{},stageManager:{},windowResizeActioner:{}},this.fs={},this.sws={},Z(this),this.close=function(){return e.core.lightboxCloser.closeLightbox()}},window.fsLightboxInstances={},re(),window.refreshFsLightbox=function(){for(var e in fsLightboxInstances){var t=fsLightboxInstances[e].props;fsLightboxInstances[e]=new FsLightbox,fsLightboxInstances[e].props=t,fsLightboxInstances[e].props.sources=[],fsLightboxInstances[e].elements.a=[]}re()}}])}));
Index: ews/js/index.js
===================================================================
--- /views/js/index.js	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-!function(e){var t={};function r(l){if(t[l])return t[l].exports;var n=t[l]={i:l,l:!1,exports:{}};return e[l].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,l){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:l})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(r.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(l,n,function(t){return e[t]}.bind(null,n));return l},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=2)}([function(e,t){!function(){e.exports=this.wp.element}()},function(e,t){!function(){e.exports=this.wp.components}()},function(e,t,r){"use strict";r.r(t);var l=r(0),n=r(1);(0,wp.blocks.registerBlockType)("wpsg/product",{title:"Produkt(e)",attributes:{product:{type:"string",default:"0"},template:{type:"string",default:"standard.phtml"},hide_title:{type:"string",default:"0"}},icon:Object(l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"200",height:"200",x:"0",y:"0",version:"1.1",viewBox:"0 0 200 200",xmlSpace:"preserve"},Object(l.createElement)("path",{fill:"#C4D00C",d:"M105.023 9.465c-50.1 0-90.71 40.613-90.71 90.706 0 50.096 40.61 90.708 90.71 90.708 50.101 0 90.703-40.612 90.703-90.708.001-50.093-40.602-90.706-90.703-90.706zm-.07 157.155c-36.734 0-66.518-29.778-66.518-66.512s29.783-66.521 66.518-66.521c36.733 0 66.516 29.786 66.516 66.521 0 36.734-29.782 66.512-66.516 66.512z"}),Object(l.createElement)("path",{fill:"#153C67",d:"M102.003 142.499c0 8.349-6.771 15.122-15.122 15.122-8.349 0-15.117-6.773-15.117-15.122 0-8.346 6.769-15.114 15.117-15.114 8.35 0 15.122 6.768 15.122 15.114zM138.28 142.499c0 8.349-6.767 15.122-15.115 15.122-8.352 0-15.12-6.773-15.12-15.122 0-8.346 6.769-15.114 15.12-15.114 8.349 0 15.115 6.768 15.115 15.114zM141.306 57.846H98.975c-8.349 0-15.115 6.767-15.115 15.114 0 8.354 6.767 15.122 15.115 15.122h21.352l-2.011 6.046h-32.52l-3.953-5.864-.005-.012c-.006-.001-.009-.008-.011-.014l-8.436-12.499c-.005-.004-.005-.013-.014-.017 0-.007-.004-.01-.01-.019l-8.431-12.5c-.006-.007-.01-.011-.013-.018-.004 0-.004-.006-.012-.01l-8.432-12.498c0-.008-.009-.01-.011-.018-.003-.006-.007-.012-.01-.012L48.02 38.144c-.005-.01-.005-.015-.011-.023a15.112 15.112 0 00-12.533-6.659H20.361c-8.35 0-15.118 6.768-15.118 15.116 0 8.351 6.769 15.118 15.118 15.118h7.085l3.961 5.874 8.455 12.532 8.456 12.528v.009l8.452 12.52v.006h.002l8.46 12.532.027-.021c2.718 4.03 7.324 6.683 12.551 6.683h51.399c6.807 0 12.558-4.495 14.451-10.686l11.821-35.466c.608-1.635.938-3.403.938-5.25.001-8.345-6.766-15.111-15.113-15.111z"})),category:"layout",edit:function(e){var t=e.attributes,r=e.setAttributes,o=e.className,c=t.product,u=t.template,i=t.hide_title;return Object(l.createElement)("div",{className:o},Object(l.createElement)(n.SelectControl,{value:c,label:wpsg_block_product.label.product,onChange:function(e){r({product:e})},options:wpsg_block_product.arProductSelect}),Object(l.createElement)(n.SelectControl,{value:u,label:wpsg_block_product.label.template,onChange:function(e){r({template:e})},options:wpsg_block_product.arTemplateSelect}),Object(l.createElement)(n.SelectControl,{value:i,label:wpsg_block_product.label.hide_title,onChange:function(e){r({hide_title:e})},options:wpsg_block_product.arHideTitleSelect}))},save:function(e){return null}})}]);
Index: /views/js/jquery-cluetip-master/.gitignore
===================================================================
--- /views/js/jquery-cluetip-master/.gitignore	(revision 5261)
+++ /views/js/jquery-cluetip-master/.gitignore	(revision 5261)
@@ -0,0 +1,2 @@
+.DS_Store
+demo-more*
Index: /views/js/mce_plugin.js
===================================================================
--- /views/js/mce_plugin.js	(revision 8528)
+++ /views/js/mce_plugin.js	(revision 5261)
@@ -9,5 +9,5 @@
 					file : 'admin.php?page=wpsg-Produkt&action=select&noheader=1',
 					width : 350,
-					height : 450,
+					height : 235,
 					inline : 1
 				}, {
@@ -28,7 +28,5 @@
  
 		createControl : function(n, cm) {
-			
 			return null;
-			
 		},
  
@@ -41,5 +39,4 @@
 			};
 		}
-		
 	});
 
Index: ews/js/moment_2.0.0.min.js
===================================================================
--- /views/js/moment_2.0.0.min.js	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):e.moment=a()}(this,function(){"use strict";var e,n;function M(){return e.apply(null,arguments)}function i(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function _(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function h(e,a){return Object.prototype.hasOwnProperty.call(e,a)}function o(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var a in e)if(h(e,a))return;return 1}function r(e){return void 0===e}function m(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function u(e,a){for(var t=[],s=0;s<e.length;++s)t.push(a(e[s],s));return t}function l(e,a){for(var t in a)h(a,t)&&(e[t]=a[t]);return h(a,"toString")&&(e.toString=a.toString),h(a,"valueOf")&&(e.valueOf=a.valueOf),e}function c(e,a,t,s){return Sa(e,a,t,s,!0).utc()}function L(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function Y(e){if(null==e._isValid){var a=L(e),t=n.call(a.parsedDateParts,function(e){return null!=e}),s=!isNaN(e._d.getTime())&&a.overflow<0&&!a.empty&&!a.invalidEra&&!a.invalidMonth&&!a.invalidWeekday&&!a.weekdayMismatch&&!a.nullInput&&!a.invalidFormat&&!a.userInvalidated&&(!a.meridiem||a.meridiem&&t);if(e._strict&&(s=s&&0===a.charsLeftOver&&0===a.unusedTokens.length&&void 0===a.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return s;e._isValid=s}return e._isValid}function y(e){var a=c(NaN);return null!=e?l(L(a),e):L(a).userInvalidated=!0,a}n=Array.prototype.some?Array.prototype.some:function(e){for(var a=Object(this),t=a.length>>>0,s=0;s<t;s++)if(s in a&&e.call(this,a[s],s,a))return!0;return!1};var f=M.momentProperties=[],a=!1;function p(e,a){var t,s,n;if(r(a._isAMomentObject)||(e._isAMomentObject=a._isAMomentObject),r(a._i)||(e._i=a._i),r(a._f)||(e._f=a._f),r(a._l)||(e._l=a._l),r(a._strict)||(e._strict=a._strict),r(a._tzm)||(e._tzm=a._tzm),r(a._isUTC)||(e._isUTC=a._isUTC),r(a._offset)||(e._offset=a._offset),r(a._pf)||(e._pf=L(a)),r(a._locale)||(e._locale=a._locale),0<f.length)for(t=0;t<f.length;t++)r(n=a[s=f[t]])||(e[s]=n);return e}function k(e){p(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===a&&(a=!0,M.updateOffset(this),a=!1)}function D(e){return e instanceof k||null!=e&&null!=e._isAMomentObject}function T(e){!1===M.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function t(n,r){var d=!0;return l(function(){if(null!=M.deprecationHandler&&M.deprecationHandler(null,n),d){for(var e,a,t=[],s=0;s<arguments.length;s++){if(e="","object"==typeof arguments[s]){for(a in e+="\n["+s+"] ",arguments[0])h(arguments[0],a)&&(e+=a+": "+arguments[0][a]+", ");e=e.slice(0,-2)}else e=arguments[s];t.push(e)}T(n+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),d=!1}return r.apply(this,arguments)},r)}var s,g={};function w(e,a){null!=M.deprecationHandler&&M.deprecationHandler(e,a),g[e]||(T(a),g[e]=!0)}function v(e){return"undefined"!=typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function b(e,a){var t,s=l({},e);for(t in a)h(a,t)&&(_(e[t])&&_(a[t])?(s[t]={},l(s[t],e[t]),l(s[t],a[t])):null!=a[t]?s[t]=a[t]:delete s[t]);for(t in e)h(e,t)&&!h(a,t)&&_(e[t])&&(s[t]=l({},s[t]));return s}function S(e){null!=e&&this.set(e)}M.suppressDeprecationWarnings=!1,M.deprecationHandler=null,s=Object.keys?Object.keys:function(e){var a,t=[];for(a in e)h(e,a)&&t.push(a);return t};function H(e,a,t){var s=""+Math.abs(e),n=a-s.length;return(0<=e?t?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+s}var j=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,x=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,P={},O={};function W(e,a,t,s){var n="string"==typeof s?function(){return this[s]()}:s;e&&(O[e]=n),a&&(O[a[0]]=function(){return H(n.apply(this,arguments),a[1],a[2])}),t&&(O[t]=function(){return this.localeData().ordinal(n.apply(this,arguments),e)})}function A(e,a){return e.isValid()?(a=E(a,e.localeData()),P[a]=P[a]||function(s){for(var e,n=s.match(j),a=0,r=n.length;a<r;a++)O[n[a]]?n[a]=O[n[a]]:n[a]=(e=n[a]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var a="",t=0;t<r;t++)a+=v(n[t])?n[t].call(e,s):n[t];return a}}(a),P[a](e)):e.localeData().invalidDate()}function E(e,a){var t=5;function s(e){return a.longDateFormat(e)||e}for(x.lastIndex=0;0<=t&&x.test(e);)e=e.replace(x,s),x.lastIndex=0,--t;return e}var F={};function z(e,a){var t=e.toLowerCase();F[t]=F[t+"s"]=F[a]=e}function N(e){return"string"==typeof e?F[e]||F[e.toLowerCase()]:void 0}function J(e){var a,t,s={};for(t in e)h(e,t)&&(a=N(t))&&(s[a]=e[t]);return s}var R={};function C(e,a){R[e]=a}function I(e){return e%4==0&&e%100!=0||e%400==0}function U(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function G(e){var a=+e,t=0;return 0!=a&&isFinite(a)&&(t=U(a)),t}function V(a,t){return function(e){return null!=e?(K(this,a,e),M.updateOffset(this,t),this):B(this,a)}}function B(e,a){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+a]():NaN}function K(e,a,t){e.isValid()&&!isNaN(t)&&("FullYear"===a&&I(e.year())&&1===e.month()&&29===e.date()?(t=G(t),e._d["set"+(e._isUTC?"UTC":"")+a](t,e.month(),Se(t,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+a](t))}var q,Z=/\d/,$=/\d\d/,Q=/\d{3}/,X=/\d{4}/,ee=/[+-]?\d{6}/,ae=/\d\d?/,te=/\d\d\d\d?/,se=/\d\d\d\d\d\d?/,ne=/\d{1,3}/,re=/\d{1,4}/,de=/[+-]?\d{1,6}/,ie=/\d+/,_e=/[+-]?\d+/,oe=/Z|[+-]\d\d:?\d\d/gi,me=/Z|[+-]\d\d(?::?\d\d)?/gi,ue=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function le(e,t,s){q[e]=v(t)?t:function(e,a){return e&&s?s:t}}function Me(e,a){return h(q,e)?q[e](a._strict,a._locale):new RegExp(he(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,a,t,s,n){return a||t||s||n})))}function he(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}q={};var ce={};function Le(e,t){var a,s=t;for("string"==typeof e&&(e=[e]),m(t)&&(s=function(e,a){a[t]=G(e)}),a=0;a<e.length;a++)ce[e[a]]=s}function Ye(e,n){Le(e,function(e,a,t,s){t._w=t._w||{},n(e,t._w,t,s)})}var ye,fe=0,pe=1,ke=2,De=3,Te=4,ge=5,we=6,ve=7,be=8;function Se(e,a){if(isNaN(e)||isNaN(a))return NaN;var t,s=(a%(t=12)+t)%t;return e+=(a-s)/12,1==s?I(e)?29:28:31-s%7%2}ye=Array.prototype.indexOf?Array.prototype.indexOf:function(e){for(var a=0;a<this.length;++a)if(this[a]===e)return a;return-1},W("M",["MM",2],"Mo",function(){return this.month()+1}),W("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),W("MMMM",0,0,function(e){return this.localeData().months(this,e)}),z("month","M"),C("month",8),le("M",ae),le("MM",ae,$),le("MMM",function(e,a){return a.monthsShortRegex(e)}),le("MMMM",function(e,a){return a.monthsRegex(e)}),Le(["M","MM"],function(e,a){a[pe]=G(e)-1}),Le(["MMM","MMMM"],function(e,a,t,s){var n=t._locale.monthsParse(e,s,t._strict);null!=n?a[pe]=n:L(t).invalidMonth=e});var He="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),je="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),xe=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Pe=ue,Oe=ue;function We(e,a){var t;if(!e.isValid())return e;if("string"==typeof a)if(/^\d+$/.test(a))a=G(a);else if(!m(a=e.localeData().monthsParse(a)))return e;return t=Math.min(e.date(),Se(e.year(),a)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](a,t),e}function Ae(e){return null!=e?(We(this,e),M.updateOffset(this,!0),this):B(this,"Month")}function Ee(){function e(e,a){return a.length-e.length}for(var a,t=[],s=[],n=[],r=0;r<12;r++)a=c([2e3,r]),t.push(this.monthsShort(a,"")),s.push(this.months(a,"")),n.push(this.months(a,"")),n.push(this.monthsShort(a,""));for(t.sort(e),s.sort(e),n.sort(e),r=0;r<12;r++)t[r]=he(t[r]),s[r]=he(s[r]);for(r=0;r<24;r++)n[r]=he(n[r]);this._monthsRegex=new RegExp("^("+n.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Fe(e){return I(e)?366:365}W("Y",0,0,function(){var e=this.year();return e<=9999?H(e,4):"+"+e}),W(0,["YY",2],0,function(){return this.year()%100}),W(0,["YYYY",4],0,"year"),W(0,["YYYYY",5],0,"year"),W(0,["YYYYYY",6,!0],0,"year"),z("year","y"),C("year",1),le("Y",_e),le("YY",ae,$),le("YYYY",re,X),le("YYYYY",de,ee),le("YYYYYY",de,ee),Le(["YYYYY","YYYYYY"],fe),Le("YYYY",function(e,a){a[fe]=2===e.length?M.parseTwoDigitYear(e):G(e)}),Le("YY",function(e,a){a[fe]=M.parseTwoDigitYear(e)}),Le("Y",function(e,a){a[fe]=parseInt(e,10)}),M.parseTwoDigitYear=function(e){return G(e)+(68<G(e)?1900:2e3)};var ze=V("FullYear",!0);function Ne(e){var a,t;return e<100&&0<=e?((t=Array.prototype.slice.call(arguments))[0]=e+400,a=new Date(Date.UTC.apply(null,t)),isFinite(a.getUTCFullYear())&&a.setUTCFullYear(e)):a=new Date(Date.UTC.apply(null,arguments)),a}function Je(e,a,t){var s=7+a-t;return s-(7+Ne(e,0,s).getUTCDay()-a)%7-1}function Re(e,a,t,s,n){var r,d=1+7*(a-1)+(7+t-s)%7+Je(e,s,n),i=d<=0?Fe(r=e-1)+d:d>Fe(e)?(r=e+1,d-Fe(e)):(r=e,d);return{year:r,dayOfYear:i}}function Ce(e,a,t){var s,n,r=Je(e.year(),a,t),d=Math.floor((e.dayOfYear()-r-1)/7)+1;return d<1?s=d+Ie(n=e.year()-1,a,t):d>Ie(e.year(),a,t)?(s=d-Ie(e.year(),a,t),n=e.year()+1):(n=e.year(),s=d),{week:s,year:n}}function Ie(e,a,t){var s=Je(e,a,t),n=Je(e+1,a,t);return(Fe(e)-s+n)/7}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),z("week","w"),z("isoWeek","W"),C("week",5),C("isoWeek",5),le("w",ae),le("ww",ae,$),le("W",ae),le("WW",ae,$),Ye(["w","ww","W","WW"],function(e,a,t,s){a[s.substr(0,1)]=G(e)});function Ue(e,a){return e.slice(a,7).concat(e.slice(0,a))}W("d",0,"do","day"),W("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),W("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),W("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),z("day","d"),z("weekday","e"),z("isoWeekday","E"),C("day",11),C("weekday",11),C("isoWeekday",11),le("d",ae),le("e",ae),le("E",ae),le("dd",function(e,a){return a.weekdaysMinRegex(e)}),le("ddd",function(e,a){return a.weekdaysShortRegex(e)}),le("dddd",function(e,a){return a.weekdaysRegex(e)}),Ye(["dd","ddd","dddd"],function(e,a,t,s){var n=t._locale.weekdaysParse(e,s,t._strict);null!=n?a.d=n:L(t).invalidWeekday=e}),Ye(["d","e","E"],function(e,a,t,s){a[s]=G(e)});var Ge="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ve="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Be="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ke=ue,qe=ue,Ze=ue;function $e(){function e(e,a){return a.length-e.length}for(var a,t,s,n,r=[],d=[],i=[],_=[],o=0;o<7;o++)a=c([2e3,1]).day(o),t=he(this.weekdaysMin(a,"")),s=he(this.weekdaysShort(a,"")),n=he(this.weekdays(a,"")),r.push(t),d.push(s),i.push(n),_.push(t),_.push(s),_.push(n);r.sort(e),d.sort(e),i.sort(e),_.sort(e),this._weekdaysRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,a){W(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),a)})}function ea(e,a){return a._meridiemParse}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,Qe),W("k",["kk",2],0,function(){return this.hours()||24}),W("hmm",0,0,function(){return""+Qe.apply(this)+H(this.minutes(),2)}),W("hmmss",0,0,function(){return""+Qe.apply(this)+H(this.minutes(),2)+H(this.seconds(),2)}),W("Hmm",0,0,function(){return""+this.hours()+H(this.minutes(),2)}),W("Hmmss",0,0,function(){return""+this.hours()+H(this.minutes(),2)+H(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),z("hour","h"),C("hour",13),le("a",ea),le("A",ea),le("H",ae),le("h",ae),le("k",ae),le("HH",ae,$),le("hh",ae,$),le("kk",ae,$),le("hmm",te),le("hmmss",se),le("Hmm",te),le("Hmmss",se),Le(["H","HH"],De),Le(["k","kk"],function(e,a,t){var s=G(e);a[De]=24===s?0:s}),Le(["a","A"],function(e,a,t){t._isPm=t._locale.isPM(e),t._meridiem=e}),Le(["h","hh"],function(e,a,t){a[De]=G(e),L(t).bigHour=!0}),Le("hmm",function(e,a,t){var s=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s)),L(t).bigHour=!0}),Le("hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s,2)),a[ge]=G(e.substr(n)),L(t).bigHour=!0}),Le("Hmm",function(e,a,t){var s=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s))}),Le("Hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s,2)),a[ge]=G(e.substr(n))});var aa=V("Hours",!0);var ta,sa={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:je,week:{dow:0,doy:6},weekdays:Ge,weekdaysMin:Be,weekdaysShort:Ve,meridiemParse:/[ap]\.?m?\.?/i},na={},ra={};function da(e){return e?e.toLowerCase().replace("_","-"):e}function ia(e){for(var a,t,s,n,r=0;r<e.length;){for(a=(n=da(e[r]).split("-")).length,t=(t=da(e[r+1]))?t.split("-"):null;0<a;){if(s=_a(n.slice(0,a).join("-")))return s;if(t&&t.length>=a&&function(e,a){for(var t=Math.min(e.length,a.length),s=0;s<t;s+=1)if(e[s]!==a[s])return s;return t}(n,t)>=a-1)break;a--}r++}return ta}function _a(a){var e;if(void 0===na[a]&&"undefined"!=typeof module&&module&&module.exports)try{e=ta._abbr,require("./locale/"+a),oa(e)}catch(e){na[a]=null}return na[a]}function oa(e,a){var t;return e&&((t=r(a)?ua(e):ma(e,a))?ta=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ta._abbr}function ma(e,a){if(null===a)return delete na[e],null;var t,s=sa;if(a.abbr=e,null!=na[e])w("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=na[e]._config;else if(null!=a.parentLocale)if(null!=na[a.parentLocale])s=na[a.parentLocale]._config;else{if(null==(t=_a(a.parentLocale)))return ra[a.parentLocale]||(ra[a.parentLocale]=[]),ra[a.parentLocale].push({name:e,config:a}),null;s=t._config}return na[e]=new S(b(s,a)),ra[e]&&ra[e].forEach(function(e){ma(e.name,e.config)}),oa(e),na[e]}function ua(e){var a;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ta;if(!i(e)){if(a=_a(e))return a;e=[e]}return ia(e)}function la(e){var a,t=e._a;return t&&-2===L(e).overflow&&(a=t[pe]<0||11<t[pe]?pe:t[ke]<1||t[ke]>Se(t[fe],t[pe])?ke:t[De]<0||24<t[De]||24===t[De]&&(0!==t[Te]||0!==t[ge]||0!==t[we])?De:t[Te]<0||59<t[Te]?Te:t[ge]<0||59<t[ge]?ge:t[we]<0||999<t[we]?we:-1,L(e)._overflowDayOfYear&&(a<fe||ke<a)&&(a=ke),L(e)._overflowWeeks&&-1===a&&(a=ve),L(e)._overflowWeekday&&-1===a&&(a=be),L(e).overflow=a),e}var Ma=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ha=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ca=/Z|[+-]\d\d(?::?\d\d)?/,La=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Ya=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],ya=/^\/?Date\((-?\d+)/i,fa=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,pa={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function ka(e){var a,t,s,n,r,d,i=e._i,_=Ma.exec(i)||ha.exec(i);if(_){for(L(e).iso=!0,a=0,t=La.length;a<t;a++)if(La[a][1].exec(_[1])){n=La[a][0],s=!1!==La[a][2];break}if(null==n)return void(e._isValid=!1);if(_[3]){for(a=0,t=Ya.length;a<t;a++)if(Ya[a][1].exec(_[3])){r=(_[2]||" ")+Ya[a][0];break}if(null==r)return void(e._isValid=!1)}if(!s&&null!=r)return void(e._isValid=!1);if(_[4]){if(!ca.exec(_[4]))return void(e._isValid=!1);d="Z"}e._f=n+(r||"")+(d||""),va(e)}else e._isValid=!1}function Da(e,a,t,s,n,r){var d=[function(e){var a=parseInt(e,10);{if(a<=49)return 2e3+a;if(a<=999)return 1900+a}return a}(e),je.indexOf(a),parseInt(t,10),parseInt(s,10),parseInt(n,10)];return r&&d.push(parseInt(r,10)),d}function Ta(e){var a,t,s,n,r=fa.exec(e._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(r){if(a=Da(r[4],r[3],r[2],r[5],r[6],r[7]),t=r[1],s=a,n=e,t&&Ve.indexOf(t)!==new Date(s[0],s[1],s[2]).getDay()&&(L(n).weekdayMismatch=!0,!void(n._isValid=!1)))return;e._a=a,e._tzm=function(e,a,t){if(e)return pa[e];if(a)return 0;var s=parseInt(t,10),n=s%100;return 60*((s-n)/100)+n}(r[8],r[9],r[10]),e._d=Ne.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),L(e).rfc2822=!0}else e._isValid=!1}function ga(e,a,t){return null!=e?e:null!=a?a:t}function wa(e){var a,t,s,n,r,d,i,_=[];if(!e._d){for(d=e,i=new Date(M.now()),s=d._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()],e._w&&null==e._a[ke]&&null==e._a[pe]&&function(e){var a,t,s,n,r,d,i,_,o;null!=(a=e._w).GG||null!=a.W||null!=a.E?(r=1,d=4,t=ga(a.GG,e._a[fe],Ce(Ha(),1,4).year),s=ga(a.W,1),((n=ga(a.E,1))<1||7<n)&&(_=!0)):(r=e._locale._week.dow,d=e._locale._week.doy,o=Ce(Ha(),r,d),t=ga(a.gg,e._a[fe],o.year),s=ga(a.w,o.week),null!=a.d?((n=a.d)<0||6<n)&&(_=!0):null!=a.e?(n=a.e+r,(a.e<0||6<a.e)&&(_=!0)):n=r);s<1||s>Ie(t,r,d)?L(e)._overflowWeeks=!0:null!=_?L(e)._overflowWeekday=!0:(i=Re(t,s,n,r,d),e._a[fe]=i.year,e._dayOfYear=i.dayOfYear)}(e),null!=e._dayOfYear&&(r=ga(e._a[fe],s[fe]),(e._dayOfYear>Fe(r)||0===e._dayOfYear)&&(L(e)._overflowDayOfYear=!0),t=Ne(r,0,e._dayOfYear),e._a[pe]=t.getUTCMonth(),e._a[ke]=t.getUTCDate()),a=0;a<3&&null==e._a[a];++a)e._a[a]=_[a]=s[a];for(;a<7;a++)e._a[a]=_[a]=null==e._a[a]?2===a?1:0:e._a[a];24===e._a[De]&&0===e._a[Te]&&0===e._a[ge]&&0===e._a[we]&&(e._nextDay=!0,e._a[De]=0),e._d=(e._useUTC?Ne:function(e,a,t,s,n,r,d){var i;return e<100&&0<=e?(i=new Date(e+400,a,t,s,n,r,d),isFinite(i.getFullYear())&&i.setFullYear(e)):i=new Date(e,a,t,s,n,r,d),i}).apply(null,_),n=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[De]=24),e._w&&void 0!==e._w.d&&e._w.d!==n&&(L(e).weekdayMismatch=!0)}}function va(e){if(e._f!==M.ISO_8601)if(e._f!==M.RFC_2822){e._a=[],L(e).empty=!0;for(var a,t,s,n,r,d,i,_=""+e._i,o=_.length,m=0,u=E(e._f,e._locale).match(j)||[],l=0;l<u.length;l++)t=u[l],(a=(_.match(Me(t,e))||[])[0])&&(0<(s=_.substr(0,_.indexOf(a))).length&&L(e).unusedInput.push(s),_=_.slice(_.indexOf(a)+a.length),m+=a.length),O[t]?(a?L(e).empty=!1:L(e).unusedTokens.push(t),r=t,i=e,null!=(d=a)&&h(ce,r)&&ce[r](d,i._a,i,r)):e._strict&&!a&&L(e).unusedTokens.push(t);L(e).charsLeftOver=o-m,0<_.length&&L(e).unusedInput.push(_),e._a[De]<=12&&!0===L(e).bigHour&&0<e._a[De]&&(L(e).bigHour=void 0),L(e).parsedDateParts=e._a.slice(0),L(e).meridiem=e._meridiem,e._a[De]=function(e,a,t){var s;if(null==t)return a;return null!=e.meridiemHour?e.meridiemHour(a,t):(null!=e.isPM&&((s=e.isPM(t))&&a<12&&(a+=12),s||12!==a||(a=0)),a)}(e._locale,e._a[De],e._meridiem),null!==(n=L(e).era)&&(e._a[fe]=e._locale.erasConvertYear(n,e._a[fe])),wa(e),la(e)}else Ta(e);else ka(e)}function ba(e){var a,t,s=e._i,n=e._f;return e._locale=e._locale||ua(e._l),null===s||void 0===n&&""===s?y({nullInput:!0}):("string"==typeof s&&(e._i=s=e._locale.preparse(s)),D(s)?new k(la(s)):(d(s)?e._d=s:i(n)?function(e){var a,t,s,n,r,d,i=!1;if(0===e._f.length)return L(e).invalidFormat=!0,e._d=new Date(NaN);for(n=0;n<e._f.length;n++)r=0,d=!1,a=p({},e),null!=e._useUTC&&(a._useUTC=e._useUTC),a._f=e._f[n],va(a),Y(a)&&(d=!0),r+=L(a).charsLeftOver,r+=10*L(a).unusedTokens.length,L(a).score=r,i?r<s&&(s=r,t=a):(null==s||r<s||d)&&(s=r,t=a,d&&(i=!0));l(e,t||a)}(e):n?va(e):r(t=(a=e)._i)?a._d=new Date(M.now()):d(t)?a._d=new Date(t.valueOf()):"string"==typeof t?function(e){var a=ya.exec(e._i);null===a?(ka(e),!1===e._isValid&&(delete e._isValid,Ta(e),!1===e._isValid&&(delete e._isValid,e._strict?e._isValid=!1:M.createFromInputFallback(e)))):e._d=new Date(+a[1])}(a):i(t)?(a._a=u(t.slice(0),function(e){return parseInt(e,10)}),wa(a)):_(t)?function(e){var a,t;e._d||(t=void 0===(a=J(e._i)).day?a.date:a.day,e._a=u([a.year,a.month,t,a.hour,a.minute,a.second,a.millisecond],function(e){return e&&parseInt(e,10)}),wa(e))}(a):m(t)?a._d=new Date(t):M.createFromInputFallback(a),Y(e)||(e._d=null),e))}function Sa(e,a,t,s,n){var r,d={};return!0!==a&&!1!==a||(s=a,a=void 0),!0!==t&&!1!==t||(s=t,t=void 0),(_(e)&&o(e)||i(e)&&0===e.length)&&(e=void 0),d._isAMomentObject=!0,d._useUTC=d._isUTC=n,d._l=t,d._i=e,d._f=a,d._strict=s,(r=new k(la(ba(d))))._nextDay&&(r.add(1,"d"),r._nextDay=void 0),r}function Ha(e,a,t,s){return Sa(e,a,t,s,!1)}M.createFromInputFallback=t("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),M.ISO_8601=function(){},M.RFC_2822=function(){};var ja=t("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Ha.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:y()}),xa=t("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Ha.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:y()});function Pa(e,a){var t,s;if(1===a.length&&i(a[0])&&(a=a[0]),!a.length)return Ha();for(t=a[0],s=1;s<a.length;++s)a[s].isValid()&&!a[s][e](t)||(t=a[s]);return t}var Oa=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Wa(e){var a=J(e),t=a.year||0,s=a.quarter||0,n=a.month||0,r=a.week||a.isoWeek||0,d=a.day||0,i=a.hour||0,_=a.minute||0,o=a.second||0,m=a.millisecond||0;this._isValid=function(e){var a,t,s=!1;for(a in e)if(h(e,a)&&(-1===ye.call(Oa,a)||null!=e[a]&&isNaN(e[a])))return!1;for(t=0;t<Oa.length;++t)if(e[Oa[t]]){if(s)return!1;parseFloat(e[Oa[t]])!==G(e[Oa[t]])&&(s=!0)}return!0}(a),this._milliseconds=+m+1e3*o+6e4*_+1e3*i*60*60,this._days=+d+7*r,this._months=+n+3*s+12*t,this._data={},this._locale=ua(),this._bubble()}function Aa(e){return e instanceof Wa}function Ea(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Fa(e,t){W(e,0,0,function(){var e=this.utcOffset(),a="+";return e<0&&(e=-e,a="-"),a+H(~~(e/60),2)+t+H(~~e%60,2)})}Fa("Z",":"),Fa("ZZ",""),le("Z",me),le("ZZ",me),Le(["Z","ZZ"],function(e,a,t){t._useUTC=!0,t._tzm=Na(me,e)});var za=/([\+\-]|\d\d)/gi;function Na(e,a){var t,s,n=(a||"").match(e);return null===n?null:0===(s=60*(t=((n[n.length-1]||[])+"").match(za)||["-",0,0])[1]+G(t[2]))?0:"+"===t[0]?s:-s}function Ja(e,a){var t,s;return a._isUTC?(t=a.clone(),s=(D(e)||d(e)?e.valueOf():Ha(e).valueOf())-t.valueOf(),t._d.setTime(t._d.valueOf()+s),M.updateOffset(t,!1),t):Ha(e).local()}function Ra(e){return-Math.round(e._d.getTimezoneOffset())}function Ca(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}M.updateOffset=function(){};var Ia=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Ua=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Ga(e,a){var t,s,n,r=e,d=null;return Aa(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:m(e)||!isNaN(+e)?(r={},a?r[a]=+e:r.milliseconds=+e):(d=Ia.exec(e))?(t="-"===d[1]?-1:1,r={y:0,d:G(d[ke])*t,h:G(d[De])*t,m:G(d[Te])*t,s:G(d[ge])*t,ms:G(Ea(1e3*d[we]))*t}):(d=Ua.exec(e))?(t="-"===d[1]?-1:1,r={y:Va(d[2],t),M:Va(d[3],t),w:Va(d[4],t),d:Va(d[5],t),h:Va(d[6],t),m:Va(d[7],t),s:Va(d[8],t)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(n=function(e,a){var t;if(!e.isValid()||!a.isValid())return{milliseconds:0,months:0};a=Ja(a,e),e.isBefore(a)?t=Ba(e,a):((t=Ba(a,e)).milliseconds=-t.milliseconds,t.months=-t.months);return t}(Ha(r.from),Ha(r.to)),(r={}).ms=n.milliseconds,r.M=n.months),s=new Wa(r),Aa(e)&&h(e,"_locale")&&(s._locale=e._locale),Aa(e)&&h(e,"_isValid")&&(s._isValid=e._isValid),s}function Va(e,a){var t=e&&parseFloat(e.replace(",","."));return(isNaN(t)?0:t)*a}function Ba(e,a){var t={};return t.months=a.month()-e.month()+12*(a.year()-e.year()),e.clone().add(t.months,"M").isAfter(a)&&--t.months,t.milliseconds=a-e.clone().add(t.months,"M"),t}function Ka(s,n){return function(e,a){var t;return null===a||isNaN(+a)||(w(n,"moment()."+n+"(period, number) is deprecated. Please use moment()."+n+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),t=e,e=a,a=t),qa(this,Ga(e,a),s),this}}function qa(e,a,t,s){var n=a._milliseconds,r=Ea(a._days),d=Ea(a._months);e.isValid()&&(s=null==s||s,d&&We(e,B(e,"Month")+d*t),r&&K(e,"Date",B(e,"Date")+r*t),n&&e._d.setTime(e._d.valueOf()+n*t),s&&M.updateOffset(e,r||d))}Ga.fn=Wa.prototype,Ga.invalid=function(){return Ga(NaN)};var Za=Ka(1,"add"),$a=Ka(-1,"subtract");function Qa(e){return"string"==typeof e||e instanceof String}function Xa(e){return D(e)||d(e)||Qa(e)||m(e)||function(a){var e=i(a),t=!1;e&&(t=0===a.filter(function(e){return!m(e)&&Qa(a)}).length);return e&&t}(e)||function(e){var a,t,s=_(e)&&!o(e),n=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"];for(a=0;a<r.length;a+=1)t=r[a],n=n||h(e,t);return s&&n}(e)||null==e}function et(e,a){if(e.date()<a.date())return-et(a,e);var t=12*(a.year()-e.year())+(a.month()-e.month()),s=e.clone().add(t,"months"),n=a-s<0?(a-s)/(s-e.clone().add(t-1,"months")):(a-s)/(e.clone().add(1+t,"months")-s);return-(t+n)||0}function at(e){var a;return void 0===e?this._locale._abbr:(null!=(a=ua(e))&&(this._locale=a),this)}M.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",M.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var tt=t("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function st(){return this._locale}var nt=126227808e5;function rt(e,a){return(e%a+a)%a}function dt(e,a,t){return e<100&&0<=e?new Date(e+400,a,t)-nt:new Date(e,a,t).valueOf()}function it(e,a,t){return e<100&&0<=e?Date.UTC(e+400,a,t)-nt:Date.UTC(e,a,t)}function _t(e,a){return a.erasAbbrRegex(e)}function ot(){for(var e=[],a=[],t=[],s=[],n=this.eras(),r=0,d=n.length;r<d;++r)a.push(he(n[r].name)),e.push(he(n[r].abbr)),t.push(he(n[r].narrow)),s.push(he(n[r].name)),s.push(he(n[r].abbr)),s.push(he(n[r].narrow));this._erasRegex=new RegExp("^("+s.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+a.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+e.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+t.join("|")+")","i")}function mt(e,a){W(0,[e,e.length],0,a)}function ut(e,a,t,s,n){var r;return null==e?Ce(this,s,n).year:((r=Ie(e,s,n))<a&&(a=r),function(e,a,t,s,n){var r=Re(e,a,t,s,n),d=Ne(r.year,0,r.dayOfYear);return this.year(d.getUTCFullYear()),this.month(d.getUTCMonth()),this.date(d.getUTCDate()),this}.call(this,e,a,t,s,n))}W("N",0,0,"eraAbbr"),W("NN",0,0,"eraAbbr"),W("NNN",0,0,"eraAbbr"),W("NNNN",0,0,"eraName"),W("NNNNN",0,0,"eraNarrow"),W("y",["y",1],"yo","eraYear"),W("y",["yy",2],0,"eraYear"),W("y",["yyy",3],0,"eraYear"),W("y",["yyyy",4],0,"eraYear"),le("N",_t),le("NN",_t),le("NNN",_t),le("NNNN",function(e,a){return a.erasNameRegex(e)}),le("NNNNN",function(e,a){return a.erasNarrowRegex(e)}),Le(["N","NN","NNN","NNNN","NNNNN"],function(e,a,t,s){var n=t._locale.erasParse(e,s,t._strict);n?L(t).era=n:L(t).invalidEra=e}),le("y",ie),le("yy",ie),le("yyy",ie),le("yyyy",ie),le("yo",function(e,a){return a._eraYearOrdinalRegex||ie}),Le(["y","yy","yyy","yyyy"],fe),Le(["yo"],function(e,a,t,s){var n;t._locale._eraYearOrdinalRegex&&(n=e.match(t._locale._eraYearOrdinalRegex)),t._locale.eraYearOrdinalParse?a[fe]=t._locale.eraYearOrdinalParse(e,n):a[fe]=parseInt(e,10)}),W(0,["gg",2],0,function(){return this.weekYear()%100}),W(0,["GG",2],0,function(){return this.isoWeekYear()%100}),mt("gggg","weekYear"),mt("ggggg","weekYear"),mt("GGGG","isoWeekYear"),mt("GGGGG","isoWeekYear"),z("weekYear","gg"),z("isoWeekYear","GG"),C("weekYear",1),C("isoWeekYear",1),le("G",_e),le("g",_e),le("GG",ae,$),le("gg",ae,$),le("GGGG",re,X),le("gggg",re,X),le("GGGGG",de,ee),le("ggggg",de,ee),Ye(["gggg","ggggg","GGGG","GGGGG"],function(e,a,t,s){a[s.substr(0,2)]=G(e)}),Ye(["gg","GG"],function(e,a,t,s){a[s]=M.parseTwoDigitYear(e)}),W("Q",0,"Qo","quarter"),z("quarter","Q"),C("quarter",7),le("Q",Z),Le("Q",function(e,a){a[pe]=3*(G(e)-1)}),W("D",["DD",2],"Do","date"),z("date","D"),C("date",9),le("D",ae),le("DD",ae,$),le("Do",function(e,a){return e?a._dayOfMonthOrdinalParse||a._ordinalParse:a._dayOfMonthOrdinalParseLenient}),Le(["D","DD"],ke),Le("Do",function(e,a){a[ke]=G(e.match(ae)[0])});var lt=V("Date",!0);W("DDD",["DDDD",3],"DDDo","dayOfYear"),z("dayOfYear","DDD"),C("dayOfYear",4),le("DDD",ne),le("DDDD",Q),Le(["DDD","DDDD"],function(e,a,t){t._dayOfYear=G(e)}),W("m",["mm",2],0,"minute"),z("minute","m"),C("minute",14),le("m",ae),le("mm",ae,$),Le(["m","mm"],Te);var Mt=V("Minutes",!1);W("s",["ss",2],0,"second"),z("second","s"),C("second",15),le("s",ae),le("ss",ae,$),Le(["s","ss"],ge);var ht,ct,Lt=V("Seconds",!1);for(W("S",0,0,function(){return~~(this.millisecond()/100)}),W(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),W(0,["SSS",3],0,"millisecond"),W(0,["SSSS",4],0,function(){return 10*this.millisecond()}),W(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),W(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),W(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),W(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),W(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),z("millisecond","ms"),C("millisecond",16),le("S",ne,Z),le("SS",ne,$),le("SSS",ne,Q),ht="SSSS";ht.length<=9;ht+="S")le(ht,ie);function Yt(e,a){a[we]=G(1e3*("0."+e))}for(ht="S";ht.length<=9;ht+="S")Le(ht,Yt);ct=V("Milliseconds",!1),W("z",0,0,"zoneAbbr"),W("zz",0,0,"zoneName");var yt=k.prototype;function ft(e){return e}yt.add=Za,yt.calendar=function(e,a){1===arguments.length&&(arguments[0]?Xa(arguments[0])?(e=arguments[0],a=void 0):function(e){for(var a=_(e)&&!o(e),t=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],n=0;n<s.length;n+=1)t=t||h(e,s[n]);return a&&t}(arguments[0])&&(a=arguments[0],e=void 0):a=e=void 0);var t=e||Ha(),s=Ja(t,this).startOf("day"),n=M.calendarFormat(this,s)||"sameElse",r=a&&(v(a[n])?a[n].call(this,t):a[n]);return this.format(r||this.localeData().calendar(n,this,Ha(t)))},yt.clone=function(){return new k(this)},yt.diff=function(e,a,t){var s,n,r;if(!this.isValid())return NaN;if(!(s=Ja(e,this)).isValid())return NaN;switch(n=6e4*(s.utcOffset()-this.utcOffset()),a=N(a)){case"year":r=et(this,s)/12;break;case"month":r=et(this,s);break;case"quarter":r=et(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-n)/864e5;break;case"week":r=(this-s-n)/6048e5;break;default:r=this-s}return t?r:U(r)},yt.endOf=function(e){var a,t;if(void 0===(e=N(e))||"millisecond"===e||!this.isValid())return this;switch(t=this._isUTC?it:dt,e){case"year":a=t(this.year()+1,0,1)-1;break;case"quarter":a=t(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":a=t(this.year(),this.month()+1,1)-1;break;case"week":a=t(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":a=t(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":a=t(this.year(),this.month(),this.date()+1)-1;break;case"hour":a=this._d.valueOf(),a+=36e5-rt(a+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":a=this._d.valueOf(),a+=6e4-rt(a,6e4)-1;break;case"second":a=this._d.valueOf(),a+=1e3-rt(a,1e3)-1;break}return this._d.setTime(a),M.updateOffset(this,!0),this},yt.format=function(e){e=e||(this.isUtc()?M.defaultFormatUtc:M.defaultFormat);var a=A(this,e);return this.localeData().postformat(a)},yt.from=function(e,a){return this.isValid()&&(D(e)&&e.isValid()||Ha(e).isValid())?Ga({to:this,from:e}).locale(this.locale()).humanize(!a):this.localeData().invalidDate()},yt.fromNow=function(e){return this.from(Ha(),e)},yt.to=function(e,a){return this.isValid()&&(D(e)&&e.isValid()||Ha(e).isValid())?Ga({from:this,to:e}).locale(this.locale()).humanize(!a):this.localeData().invalidDate()},yt.toNow=function(e){return this.to(Ha(),e)},yt.get=function(e){return v(this[e=N(e)])?this[e]():this},yt.invalidAt=function(){return L(this).overflow},yt.isAfter=function(e,a){var t=D(e)?e:Ha(e);return!(!this.isValid()||!t.isValid())&&("millisecond"===(a=N(a)||"millisecond")?this.valueOf()>t.valueOf():t.valueOf()<this.clone().startOf(a).valueOf())},yt.isBefore=function(e,a){var t=D(e)?e:Ha(e);return!(!this.isValid()||!t.isValid())&&("millisecond"===(a=N(a)||"millisecond")?this.valueOf()<t.valueOf():this.clone().endOf(a).valueOf()<t.valueOf())},yt.isBetween=function(e,a,t,s){var n=D(e)?e:Ha(e),r=D(a)?a:Ha(a);return!!(this.isValid()&&n.isValid()&&r.isValid())&&(("("===(s=s||"()")[0]?this.isAfter(n,t):!this.isBefore(n,t))&&(")"===s[1]?this.isBefore(r,t):!this.isAfter(r,t)))},yt.isSame=function(e,a){var t,s=D(e)?e:Ha(e);return!(!this.isValid()||!s.isValid())&&("millisecond"===(a=N(a)||"millisecond")?this.valueOf()===s.valueOf():(t=s.valueOf(),this.clone().startOf(a).valueOf()<=t&&t<=this.clone().endOf(a).valueOf()))},yt.isSameOrAfter=function(e,a){return this.isSame(e,a)||this.isAfter(e,a)},yt.isSameOrBefore=function(e,a){return this.isSame(e,a)||this.isBefore(e,a)},yt.isValid=function(){return Y(this)},yt.lang=tt,yt.locale=at,yt.localeData=st,yt.max=xa,yt.min=ja,yt.parsingFlags=function(){return l({},L(this))},yt.set=function(e,a){if("object"==typeof e)for(var t=function(e){var a,t=[];for(a in e)h(e,a)&&t.push({unit:a,priority:R[a]});return t.sort(function(e,a){return e.priority-a.priority}),t}(e=J(e)),s=0;s<t.length;s++)this[t[s].unit](e[t[s].unit]);else if(v(this[e=N(e)]))return this[e](a);return this},yt.startOf=function(e){var a,t;if(void 0===(e=N(e))||"millisecond"===e||!this.isValid())return this;switch(t=this._isUTC?it:dt,e){case"year":a=t(this.year(),0,1);break;case"quarter":a=t(this.year(),this.month()-this.month()%3,1);break;case"month":a=t(this.year(),this.month(),1);break;case"week":a=t(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":a=t(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":a=t(this.year(),this.month(),this.date());break;case"hour":a=this._d.valueOf(),a-=rt(a+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":a=this._d.valueOf(),a-=rt(a,6e4);break;case"second":a=this._d.valueOf(),a-=rt(a,1e3);break}return this._d.setTime(a),M.updateOffset(this,!0),this},yt.subtract=$a,yt.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},yt.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},yt.toDate=function(){return new Date(this.valueOf())},yt.toISOString=function(e){if(!this.isValid())return null;var a=!0!==e,t=a?this.clone().utc():this;return t.year()<0||9999<t.year()?A(t,a?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):v(Date.prototype.toISOString)?a?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",A(t,"Z")):A(t,a?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},yt.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,a,t,s="moment",n="";return this.isLocal()||(s=0===this.utcOffset()?"moment.utc":"moment.parseZone",n="Z"),e="["+s+'("]',a=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",t=n+'[")]',this.format(e+a+"-MM-DD[T]HH:mm:ss.SSS"+t)},"undefined"!=typeof Symbol&&null!=Symbol.for&&(yt[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),yt.toJSON=function(){return this.isValid()?this.toISOString():null},yt.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},yt.unix=function(){return Math.floor(this.valueOf()/1e3)},yt.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},yt.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},yt.eraName=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;t<s;++t){if(e=this.clone().startOf("day").valueOf(),a[t].since<=e&&e<=a[t].until)return a[t].name;if(a[t].until<=e&&e<=a[t].since)return a[t].name}return""},yt.eraNarrow=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;t<s;++t){if(e=this.clone().startOf("day").valueOf(),a[t].since<=e&&e<=a[t].until)return a[t].narrow;if(a[t].until<=e&&e<=a[t].since)return a[t].narrow}return""},yt.eraAbbr=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;t<s;++t){if(e=this.clone().startOf("day").valueOf(),a[t].since<=e&&e<=a[t].until)return a[t].abbr;if(a[t].until<=e&&e<=a[t].since)return a[t].abbr}return""},yt.eraYear=function(){for(var e,a,t=this.localeData().eras(),s=0,n=t.length;s<n;++s)if(e=t[s].since<=t[s].until?1:-1,a=this.clone().startOf("day").valueOf(),t[s].since<=a&&a<=t[s].until||t[s].until<=a&&a<=t[s].since)return(this.year()-M(t[s].since).year())*e+t[s].offset;return this.year()},yt.year=ze,yt.isLeapYear=function(){return I(this.year())},yt.weekYear=function(e){return ut.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},yt.isoWeekYear=function(e){return ut.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},yt.quarter=yt.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},yt.month=Ae,yt.daysInMonth=function(){return Se(this.year(),this.month())},yt.week=yt.weeks=function(e){var a=this.localeData().week(this);return null==e?a:this.add(7*(e-a),"d")},yt.isoWeek=yt.isoWeeks=function(e){var a=Ce(this,1,4).week;return null==e?a:this.add(7*(e-a),"d")},yt.weeksInYear=function(){var e=this.localeData()._week;return Ie(this.year(),e.dow,e.doy)},yt.weeksInWeekYear=function(){var e=this.localeData()._week;return Ie(this.weekYear(),e.dow,e.doy)},yt.isoWeeksInYear=function(){return Ie(this.year(),1,4)},yt.isoWeeksInISOWeekYear=function(){return Ie(this.isoWeekYear(),1,4)},yt.date=lt,yt.day=yt.days=function(e){if(!this.isValid())return null!=e?this:NaN;var a,t,s=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(a=e,t=this.localeData(),e="string"!=typeof a?a:isNaN(a)?"number"==typeof(a=t.weekdaysParse(a))?a:null:parseInt(a,10),this.add(e-s,"d")):s},yt.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var a=(this.day()+7-this.localeData()._week.dow)%7;return null==e?a:this.add(e-a,"d")},yt.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null==e)return this.day()||7;var a,t,s=(a=e,t=this.localeData(),"string"==typeof a?t.weekdaysParse(a)%7||7:isNaN(a)?null:a);return this.day(this.day()%7?s:s-7)},yt.dayOfYear=function(e){var a=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?a:this.add(e-a,"d")},yt.hour=yt.hours=aa,yt.minute=yt.minutes=Mt,yt.second=yt.seconds=Lt,yt.millisecond=yt.milliseconds=ct,yt.utcOffset=function(e,a,t){var s,n=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?n:Ra(this);if("string"==typeof e){if(null===(e=Na(me,e)))return this}else Math.abs(e)<16&&!t&&(e*=60);return!this._isUTC&&a&&(s=Ra(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),n!==e&&(!a||this._changeInProgress?qa(this,Ga(e-n,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,M.updateOffset(this,!0),this._changeInProgress=null)),this},yt.utc=function(e){return this.utcOffset(0,e)},yt.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Ra(this),"m")),this},yt.parseZone=function(){var e;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(e=Na(oe,this._i))?this.utcOffset(e):this.utcOffset(0,!0)),this},yt.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?Ha(e).utcOffset():0,(this.utcOffset()-e)%60==0)},yt.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},yt.isLocal=function(){return!!this.isValid()&&!this._isUTC},yt.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},yt.isUtc=Ca,yt.isUTC=Ca,yt.zoneAbbr=function(){return this._isUTC?"UTC":""},yt.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},yt.dates=t("dates accessor is deprecated. Use date instead.",lt),yt.months=t("months accessor is deprecated. Use month instead",Ae),yt.years=t("years accessor is deprecated. Use year instead",ze),yt.zone=t("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,a){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,a),this):-this.utcOffset()}),yt.isDSTShifted=t("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!r(this._isDSTShifted))return this._isDSTShifted;var e,a={};return p(a,this),(a=ba(a))._a?(e=(a._isUTC?c:Ha)(a._a),this._isDSTShifted=this.isValid()&&0<function(e,a,t){for(var s=Math.min(e.length,a.length),n=Math.abs(e.length-a.length),r=0,d=0;d<s;d++)(t&&e[d]!==a[d]||!t&&G(e[d])!==G(a[d]))&&r++;return r+n}(a._a,e.toArray())):this._isDSTShifted=!1,this._isDSTShifted});var pt=S.prototype;function kt(e,a,t,s){var n=ua(),r=c().set(s,a);return n[t](r,e)}function Dt(e,a,t){if(m(e)&&(a=e,e=void 0),e=e||"",null!=a)return kt(e,a,t,"month");for(var s=[],n=0;n<12;n++)s[n]=kt(e,n,t,"month");return s}function Tt(e,a,t,s){a=("boolean"==typeof e?m(a)&&(t=a,a=void 0):(a=e,e=!1,m(t=a)&&(t=a,a=void 0)),a||"");var n,r=ua(),d=e?r._week.dow:0,i=[];if(null!=t)return kt(a,(t+d)%7,s,"day");for(n=0;n<7;n++)i[n]=kt(a,(n+d)%7,s,"day");return i}pt.calendar=function(e,a,t){var s=this._calendar[e]||this._calendar.sameElse;return v(s)?s.call(a,t):s},pt.longDateFormat=function(e){var a=this._longDateFormat[e],t=this._longDateFormat[e.toUpperCase()];return a||!t?a:(this._longDateFormat[e]=t.match(j).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},pt.invalidDate=function(){return this._invalidDate},pt.ordinal=function(e){return this._ordinal.replace("%d",e)},pt.preparse=ft,pt.postformat=ft,pt.relativeTime=function(e,a,t,s){var n=this._relativeTime[t];return v(n)?n(e,a,t,s):n.replace(/%d/i,e)},pt.pastFuture=function(e,a){var t=this._relativeTime[0<e?"future":"past"];return v(t)?t(a):t.replace(/%s/i,a)},pt.set=function(e){var a,t;for(t in e)h(e,t)&&(v(a=e[t])?this[t]=a:this["_"+t]=a);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pt.eras=function(e,a){for(var t,s=this._eras||ua("en")._eras,n=0,r=s.length;n<r;++n){switch(typeof s[n].since){case"string":t=M(s[n].since).startOf("day"),s[n].since=t.valueOf();break}switch(typeof s[n].until){case"undefined":s[n].until=1/0;break;case"string":t=M(s[n].until).startOf("day").valueOf(),s[n].until=t.valueOf();break}}return s},pt.erasParse=function(e,a,t){var s,n,r,d,i,_=this.eras();for(e=e.toUpperCase(),s=0,n=_.length;s<n;++s)if(r=_[s].name.toUpperCase(),d=_[s].abbr.toUpperCase(),i=_[s].narrow.toUpperCase(),t)switch(a){case"N":case"NN":case"NNN":if(d===e)return _[s];break;case"NNNN":if(r===e)return _[s];break;case"NNNNN":if(i===e)return _[s];break}else if(0<=[r,d,i].indexOf(e))return _[s]},pt.erasConvertYear=function(e,a){var t=e.since<=e.until?1:-1;return void 0===a?M(e.since).year():M(e.since).year()+(a-e.offset)*t},pt.erasAbbrRegex=function(e){return h(this,"_erasAbbrRegex")||ot.call(this),e?this._erasAbbrRegex:this._erasRegex},pt.erasNameRegex=function(e){return h(this,"_erasNameRegex")||ot.call(this),e?this._erasNameRegex:this._erasRegex},pt.erasNarrowRegex=function(e){return h(this,"_erasNarrowRegex")||ot.call(this),e?this._erasNarrowRegex:this._erasRegex},pt.months=function(e,a){return e?i(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||xe).test(a)?"format":"standalone"][e.month()]:i(this._months)?this._months:this._months.standalone},pt.monthsShort=function(e,a){return e?i(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[xe.test(a)?"format":"standalone"][e.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pt.monthsParse=function(e,a,t){var s,n,r;if(this._monthsParseExact)return function(e,a,t){var s,n,r,d=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=c([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return t?"MMM"===a?-1!==(n=ye.call(this._shortMonthsParse,d))?n:null:-1!==(n=ye.call(this._longMonthsParse,d))?n:null:"MMM"===a?-1!==(n=ye.call(this._shortMonthsParse,d))||-1!==(n=ye.call(this._longMonthsParse,d))?n:null:-1!==(n=ye.call(this._longMonthsParse,d))||-1!==(n=ye.call(this._shortMonthsParse,d))?n:null}.call(this,e,a,t);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(n=c([2e3,s]),t&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),t||this._monthsParse[s]||(r="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),t&&"MMMM"===a&&this._longMonthsParse[s].test(e))return s;if(t&&"MMM"===a&&this._shortMonthsParse[s].test(e))return s;if(!t&&this._monthsParse[s].test(e))return s}},pt.monthsRegex=function(e){return this._monthsParseExact?(h(this,"_monthsRegex")||Ee.call(this),e?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=Oe),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},pt.monthsShortRegex=function(e){return this._monthsParseExact?(h(this,"_monthsRegex")||Ee.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=Pe),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},pt.week=function(e){return Ce(e,this._week.dow,this._week.doy).week},pt.firstDayOfYear=function(){return this._week.doy},pt.firstDayOfWeek=function(){return this._week.dow},pt.weekdays=function(e,a){var t=i(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(a)?"format":"standalone"];return!0===e?Ue(t,this._week.dow):e?t[e.day()]:t},pt.weekdaysMin=function(e){return!0===e?Ue(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},pt.weekdaysShort=function(e){return!0===e?Ue(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},pt.weekdaysParse=function(e,a,t){var s,n,r;if(this._weekdaysParseExact)return function(e,a,t){var s,n,r,d=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=c([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return t?"dddd"===a?-1!==(n=ye.call(this._weekdaysParse,d))?n:null:"ddd"===a?-1!==(n=ye.call(this._shortWeekdaysParse,d))?n:null:-1!==(n=ye.call(this._minWeekdaysParse,d))?n:null:"dddd"===a?-1!==(n=ye.call(this._weekdaysParse,d))||-1!==(n=ye.call(this._shortWeekdaysParse,d))||-1!==(n=ye.call(this._minWeekdaysParse,d))?n:null:"ddd"===a?-1!==(n=ye.call(this._shortWeekdaysParse,d))||-1!==(n=ye.call(this._weekdaysParse,d))||-1!==(n=ye.call(this._minWeekdaysParse,d))?n:null:-1!==(n=ye.call(this._minWeekdaysParse,d))||-1!==(n=ye.call(this._weekdaysParse,d))||-1!==(n=ye.call(this._shortWeekdaysParse,d))?n:null}.call(this,e,a,t);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(n=c([2e3,1]).day(s),t&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(n,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(n,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(n,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),t&&"dddd"===a&&this._fullWeekdaysParse[s].test(e))return s;if(t&&"ddd"===a&&this._shortWeekdaysParse[s].test(e))return s;if(t&&"dd"===a&&this._minWeekdaysParse[s].test(e))return s;if(!t&&this._weekdaysParse[s].test(e))return s}},pt.weekdaysRegex=function(e){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||$e.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=Ke),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},pt.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||$e.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pt.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||$e.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ze),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pt.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},pt.meridiem=function(e,a,t){return 11<e?t?"pm":"PM":t?"am":"AM"},oa("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var a=e%10;return e+(1===G(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),M.lang=t("moment.lang is deprecated. Use moment.locale instead.",oa),M.langData=t("moment.langData is deprecated. Use moment.localeData instead.",ua);var gt=Math.abs;function wt(e,a,t,s){var n=Ga(a,t);return e._milliseconds+=s*n._milliseconds,e._days+=s*n._days,e._months+=s*n._months,e._bubble()}function vt(e){return e<0?Math.floor(e):Math.ceil(e)}function bt(e){return 4800*e/146097}function St(e){return 146097*e/4800}function Ht(e){return function(){return this.as(e)}}var jt=Ht("ms"),xt=Ht("s"),Pt=Ht("m"),Ot=Ht("h"),Wt=Ht("d"),At=Ht("w"),Et=Ht("M"),Ft=Ht("Q"),zt=Ht("y");function Nt(e){return function(){return this.isValid()?this._data[e]:NaN}}var Jt=Nt("milliseconds"),Rt=Nt("seconds"),Ct=Nt("minutes"),It=Nt("hours"),Ut=Nt("days"),Gt=Nt("months"),Vt=Nt("years");var Bt=Math.round,Kt={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function qt(e,a,t,s){var n=Ga(e).abs(),r=Bt(n.as("s")),d=Bt(n.as("m")),i=Bt(n.as("h")),_=Bt(n.as("d")),o=Bt(n.as("M")),m=Bt(n.as("w")),u=Bt(n.as("y")),l=(r<=t.ss?["s",r]:r<t.s&&["ss",r])||d<=1&&["m"]||d<t.m&&["mm",d]||i<=1&&["h"]||i<t.h&&["hh",i]||_<=1&&["d"]||_<t.d&&["dd",_];return null!=t.w&&(l=l||m<=1&&["w"]||m<t.w&&["ww",m]),(l=l||o<=1&&["M"]||o<t.M&&["MM",o]||u<=1&&["y"]||["yy",u])[2]=a,l[3]=0<+e,l[4]=s,function(e,a,t,s,n){return n.relativeTime(a||1,!!t,e,s)}.apply(null,l)}var Zt=Math.abs;function $t(e){return(0<e)-(e<0)||+e}function Qt(){if(!this.isValid())return this.localeData().invalidDate();var e,a,t,s,n,r,d,i,_=Zt(this._milliseconds)/1e3,o=Zt(this._days),m=Zt(this._months),u=this.asSeconds();return u?(e=U(_/60),a=U(e/60),_%=60,e%=60,t=U(m/12),m%=12,s=_?_.toFixed(3).replace(/\.?0+$/,""):"",n=u<0?"-":"",r=$t(this._months)!==$t(u)?"-":"",d=$t(this._days)!==$t(u)?"-":"",i=$t(this._milliseconds)!==$t(u)?"-":"",n+"P"+(t?r+t+"Y":"")+(m?r+m+"M":"")+(o?d+o+"D":"")+(a||e||_?"T":"")+(a?i+a+"H":"")+(e?i+e+"M":"")+(_?i+s+"S":"")):"P0D"}var Xt=Wa.prototype;Xt.isValid=function(){return this._isValid},Xt.abs=function(){var e=this._data;return this._milliseconds=gt(this._milliseconds),this._days=gt(this._days),this._months=gt(this._months),e.milliseconds=gt(e.milliseconds),e.seconds=gt(e.seconds),e.minutes=gt(e.minutes),e.hours=gt(e.hours),e.months=gt(e.months),e.years=gt(e.years),this},Xt.add=function(e,a){return wt(this,e,a,1)},Xt.subtract=function(e,a){return wt(this,e,a,-1)},Xt.as=function(e){if(!this.isValid())return NaN;var a,t,s=this._milliseconds;if("month"===(e=N(e))||"quarter"===e||"year"===e)switch(a=this._days+s/864e5,t=this._months+bt(a),e){case"month":return t;case"quarter":return t/3;case"year":return t/12}else switch(a=this._days+Math.round(St(this._months)),e){case"week":return a/7+s/6048e5;case"day":return a+s/864e5;case"hour":return 24*a+s/36e5;case"minute":return 1440*a+s/6e4;case"second":return 86400*a+s/1e3;case"millisecond":return Math.floor(864e5*a)+s;default:throw new Error("Unknown unit "+e)}},Xt.asMilliseconds=jt,Xt.asSeconds=xt,Xt.asMinutes=Pt,Xt.asHours=Ot,Xt.asDays=Wt,Xt.asWeeks=At,Xt.asMonths=Et,Xt.asQuarters=Ft,Xt.asYears=zt,Xt.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*G(this._months/12):NaN},Xt._bubble=function(){var e,a,t,s,n,r=this._milliseconds,d=this._days,i=this._months,_=this._data;return 0<=r&&0<=d&&0<=i||r<=0&&d<=0&&i<=0||(r+=864e5*vt(St(i)+d),i=d=0),_.milliseconds=r%1e3,e=U(r/1e3),_.seconds=e%60,a=U(e/60),_.minutes=a%60,t=U(a/60),_.hours=t%24,d+=U(t/24),i+=n=U(bt(d)),d-=vt(St(n)),s=U(i/12),i%=12,_.days=d,_.months=i,_.years=s,this},Xt.clone=function(){return Ga(this)},Xt.get=function(e){return e=N(e),this.isValid()?this[e+"s"]():NaN},Xt.milliseconds=Jt,Xt.seconds=Rt,Xt.minutes=Ct,Xt.hours=It,Xt.days=Ut,Xt.weeks=function(){return U(this.days()/7)},Xt.months=Gt,Xt.years=Vt,Xt.humanize=function(e,a){if(!this.isValid())return this.localeData().invalidDate();var t,s,n=!1,r=Kt;return"object"==typeof e&&(a=e,e=!1),"boolean"==typeof e&&(n=e),"object"==typeof a&&(r=Object.assign({},Kt,a),null!=a.s&&null==a.ss&&(r.ss=a.s-1)),t=this.localeData(),s=qt(this,!n,r,t),n&&(s=t.pastFuture(+this,s)),t.postformat(s)},Xt.toISOString=Qt,Xt.toString=Qt,Xt.toJSON=Qt,Xt.locale=at,Xt.localeData=st,Xt.toIsoString=t("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Qt),Xt.lang=tt,W("X",0,0,"unix"),W("x",0,0,"valueOf"),le("x",_e),le("X",/[+-]?\d+(\.\d{1,3})?/),Le("X",function(e,a,t){t._d=new Date(1e3*parseFloat(e))}),Le("x",function(e,a,t){t._d=new Date(G(e))}),M.version="2.29.1",e=Ha,M.fn=yt,M.min=function(){return Pa("isBefore",[].slice.call(arguments,0))},M.max=function(){return Pa("isAfter",[].slice.call(arguments,0))},M.now=function(){return Date.now?Date.now():+new Date},M.utc=c,M.unix=function(e){return Ha(1e3*e)},M.months=function(e,a){return Dt(e,a,"months")},M.isDate=d,M.locale=oa,M.invalid=y,M.duration=Ga,M.isMoment=D,M.weekdays=function(e,a,t){return Tt(e,a,t,"weekdays")},M.parseZone=function(){return Ha.apply(null,arguments).parseZone()},M.localeData=ua,M.isDuration=Aa,M.monthsShort=function(e,a){return Dt(e,a,"monthsShort")},M.weekdaysMin=function(e,a,t){return Tt(e,a,t,"weekdaysMin")},M.defineLocale=ma,M.updateLocale=function(e,a){var t,s,n;return null!=a?(n=sa,null!=na[e]&&null!=na[e].parentLocale?na[e].set(b(na[e]._config,a)):(null!=(s=_a(e))&&(n=s._config),a=b(n,a),null==s&&(a.abbr=e),(t=new S(a)).parentLocale=na[e],na[e]=t),oa(e)):null!=na[e]&&(null!=na[e].parentLocale?(na[e]=na[e].parentLocale,e===oa()&&oa(e)):null!=na[e]&&delete na[e]),na[e]},M.locales=function(){return s(na)},M.weekdaysShort=function(e,a,t){return Tt(e,a,t,"weekdaysShort")},M.normalizeUnits=N,M.relativeTimeRounding=function(e){return void 0===e?Bt:"function"==typeof e&&(Bt=e,!0)},M.relativeTimeThreshold=function(e,a){return void 0!==Kt[e]&&(void 0===a?Kt[e]:(Kt[e]=a,"s"===e&&(Kt.ss=a-1),!0))},M.calendarFormat=function(e,a){var t=e.diff(a,"days",!0);return t<-6?"sameElse":t<-1?"lastWeek":t<0?"lastDay":t<1?"sameDay":t<2?"nextDay":t<7?"nextWeek":"sameElse"},M.prototype=yt,M.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},M.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"vm":"VM":t?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}});function es(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function as(d){return function(e,a,t,s){var n=es(e),r=ts[d][es(e)];return 2===n&&(r=r[a?0:1]),r.replace(/%d/i,e)}}var ts={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},ss=["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];M.defineLocale("ar-dz",{months:ss,monthsShort:ss,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:as("s"),ss:as("s"),m:as("m"),mm:as("m"),h:as("h"),hh:as("h"),d:as("d"),dd:as("d"),M:as("M"),MM:as("M"),y:as("y"),yy:as("y")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:0,doy:4}}),M.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}});function ns(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function rs(d){return function(e,a,t,s){var n=ns(e),r=is[d][ns(e)];return 2===n&&(r=r[a?0:1]),r.replace(/%d/i,e)}}var ds={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},is={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},_s=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];M.defineLocale("ar-ly",{months:_s,monthsShort:_s,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:rs("s"),ss:rs("s"),m:rs("m"),mm:rs("m"),h:rs("h"),hh:rs("h"),d:rs("d"),dd:rs("d"),M:rs("M"),MM:rs("M"),y:rs("y"),yy:rs("y")},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return ds[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),M.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}});var os={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},ms={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};M.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return ms[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return os[e]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}}),M.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}});function us(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function ls(d){return function(e,a,t,s){var n=us(e),r=cs[d][us(e)];return 2===n&&(r=r[a?0:1]),r.replace(/%d/i,e)}}var Ms={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},hs={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},cs={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},Ls=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];M.defineLocale("ar",{months:Ls,monthsShort:Ls,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:ls("s"),ss:ls("s"),m:ls("m"),mm:ls("m"),h:ls("h"),hh:ls("h"),d:ls("d"),dd:ls("d"),M:ls("M"),MM:ls("M"),y:ls("y"),yy:ls("y")},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return hs[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return Ms[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}});var Ys={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};function ys(e,a,t){var s,n;return"m"===t?a?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===t?a?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+(s=+e,n={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:a?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[t].split("_"),s%10==1&&s%100!=11?n[0]:2<=s%10&&s%10<=4&&(s%100<10||20<=s%100)?n[1]:n[2])}M.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"bir ne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(e){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(e)},meridiem:function(e,a,t){return e<4?"gec\u0259":e<12?"s\u0259h\u0259r":e<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(e){if(0===e)return e+"-\u0131nc\u0131";var a=e%10;return e+(Ys[a]||Ys[e%100-a]||Ys[100<=e?100:null])},week:{dow:1,doy:7}}),M.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:ys,mm:ys,h:ys,hh:ys,d:"\u0434\u0437\u0435\u043d\u044c",dd:ys,M:"\u043c\u0435\u0441\u044f\u0446",MM:ys,y:"\u0433\u043e\u0434",yy:ys},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,a,t){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}}),M.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0443_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u041c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u041c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",w:"\u0441\u0435\u0434\u043c\u0438\u0446\u0430",ww:"%d \u0441\u0435\u0434\u043c\u0438\u0446\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-\u0435\u0432":0==t?e+"-\u0435\u043d":10<t&&t<20?e+"-\u0442\u0438":1==a?e+"-\u0432\u0438":2==a?e+"-\u0440\u0438":7==a||8==a?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}}),M.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}});var fs={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},ps={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};M.defineLocale("bn-bd",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return ps[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return fs[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09ad\u09cb\u09b0|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be|\u09b0\u09be\u09a4/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===a?e<4?e:e+12:"\u09ad\u09cb\u09b0"===a||"\u09b8\u0995\u09be\u09b2"===a?e:"\u09a6\u09c1\u09aa\u09c1\u09b0"===a?3<=e?e:e+12:"\u09ac\u09bf\u0995\u09be\u09b2"===a||"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u09b0\u09be\u09a4":e<6?"\u09ad\u09cb\u09b0":e<12?"\u09b8\u0995\u09be\u09b2":e<15?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<18?"\u09ac\u09bf\u0995\u09be\u09b2":e<20?"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}});var ks={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},Ds={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};M.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return Ds[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return ks[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===a&&4<=e||"\u09a6\u09c1\u09aa\u09c1\u09b0"===a&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===a?e+12:e},meridiem:function(e,a,t){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}});var Ts={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},gs={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};function ws(e,a,t){var s;return e+" "+(s={mm:"munutenn",MM:"miz",dd:"devezh"}[t],2!==e?s:function(e){var a={m:"v",b:"v",d:"z"};return void 0!==a[e.charAt(0)]?a[e.charAt(0)]+e.substring(1):e}(s))}M.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b1_\u0f5f\u0fb3\u0f0b2_\u0f5f\u0fb3\u0f0b3_\u0f5f\u0fb3\u0f0b4_\u0f5f\u0fb3\u0f0b5_\u0f5f\u0fb3\u0f0b6_\u0f5f\u0fb3\u0f0b7_\u0f5f\u0fb3\u0f0b8_\u0f5f\u0fb3\u0f0b9_\u0f5f\u0fb3\u0f0b10_\u0f5f\u0fb3\u0f0b11_\u0f5f\u0fb3\u0f0b12".split("_"),monthsShortRegex:/^(\u0f5f\u0fb3\u0f0b\d{1,2})/,monthsParseExact:!0,weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72_\u0f5f\u0fb3_\u0f58\u0f72\u0f42_\u0f63\u0fb7\u0f42_\u0f55\u0f74\u0f62_\u0f66\u0f44\u0f66_\u0f66\u0fa4\u0f7a\u0f53".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(e){return gs[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Ts[e]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===a&&4<=e||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===a&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===a?e+12:e},meridiem:function(e,a,t){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}});var vs=[/^gen/i,/^c[\u02bc\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],bs=/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,Ss=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];function Hs(e,a,t){var s=e+" ";switch(t){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return s+=1!==e&&(2===e||3===e||4===e)?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1!==e&&(2===e||3===e||4===e)?"godine":"godina"}}M.defineLocale("br",{months:"Genver_C\u02bchwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C\u02bchwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc\u02bcher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:Ss,fullWeekdaysParse:[/^sul/i,/^lun/i,/^meurzh/i,/^merc[\u02bc\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],shortWeekdaysParse:[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],minWeekdaysParse:Ss,monthsRegex:bs,monthsShortRegex:bs,monthsStrictRegex:/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,monthsShortStrictRegex:/^(gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,monthsParse:vs,longMonthsParse:vs,shortMonthsParse:vs,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc\u02bchoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec\u02bch da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s \u02bczo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:ws,h:"un eur",hh:"%d eur",d:"un devezh",dd:ws,M:"ur miz",MM:ws,y:"ur bloaz",yy:function(e){switch(function e(a){if(9<a)return e(a%10);return a}(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(e){return e+(1===e?"a\xf1":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(e){return"g.m."===e},meridiem:function(e,a,t){return e<12?"a.m.":"g.m."}}),M.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:Hs,m:Hs,mm:Hs,h:Hs,hh:Hs,d:"dan",dd:Hs,M:"mjesec",MM:Hs,y:"godinu",yy:Hs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,a){return e+("w"!==a&&"W"!==a?1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8":"a")},week:{dow:1,doy:4}});var js="leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),xs="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),Ps=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],Os=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function Ws(e){return 1<e&&e<5&&1!=~~(e/10)}function As(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return a||s?n+(Ws(e)?"sekundy":"sekund"):n+"sekundami";case"m":return a?"minuta":s?"minutu":"minutou";case"mm":return a||s?n+(Ws(e)?"minuty":"minut"):n+"minutami";case"h":return a?"hodina":s?"hodinu":"hodinou";case"hh":return a||s?n+(Ws(e)?"hodiny":"hodin"):n+"hodinami";case"d":return a||s?"den":"dnem";case"dd":return a||s?n+(Ws(e)?"dny":"dn\xed"):n+"dny";case"M":return a||s?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return a||s?n+(Ws(e)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):n+"m\u011bs\xedci";case"y":return a||s?"rok":"rokem";case"yy":return a||s?n+(Ws(e)?"roky":"let"):n+"lety"}}function Es(e,a,t,s){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?n[t][0]:n[t][1]}function Fs(e,a,t,s){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?n[t][0]:n[t][1]}function zs(e,a,t,s){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?n[t][0]:n[t][1]}M.defineLocale("cs",{months:js,monthsShort:xs,monthsRegex:Os,monthsShortRegex:Os,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:Ps,longMonthsParse:Ps,shortMonthsParse:Ps,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:As,ss:As,m:As,mm:As,h:As,hh:As,d:As,dd:As,M:As,MM:As,y:As,yy:As},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(e){return e+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(e)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(e)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}}),M.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var a="";return 20<e?a=40===e||50===e||60===e||80===e||100===e?"fed":"ain":0<e&&(a=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][e]),e+a},week:{dow:1,doy:4}}),M.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:Es,mm:"%d Minuten",h:Es,hh:"%d Stunden",d:Es,dd:Es,w:Es,ww:"%d Wochen",M:Es,MM:Es,y:Es,yy:Es},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:Fs,mm:"%d Minuten",h:Fs,hh:"%d Stunden",d:Fs,dd:Fs,w:Fs,ww:"%d Wochen",M:Fs,MM:Fs,y:Fs,yy:Fs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:zs,mm:"%d Minuten",h:zs,hh:"%d Stunden",d:zs,dd:zs,w:zs,ww:"%d Wochen",M:zs,MM:zs,y:zs,yy:zs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var Ns=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],Js=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];M.defineLocale("dv",{months:Ns,monthsShort:Ns,weekdays:Js,weekdaysShort:Js,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,a,t){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}}),M.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(e,a){return e?"string"==typeof a&&/D/.test(a.substring(0,a.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(e,a,t){return 11<e?t?"\u03bc\u03bc":"\u039c\u039c":t?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(e){return"\u03bc"===(e+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,a){var t,s=this._calendarEl[e],n=a&&a.hours();return t=s,("undefined"!=typeof Function&&t instanceof Function||"[object Function]"===Object.prototype.toString.call(t))&&(s=s.apply(a)),s.replace("{}",n%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}}),M.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:0,doy:4}}),M.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),M.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),M.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:0,doy:6}}),M.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a\u016dg_sept_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,a,t){return 11<e?t?"p.t.m.":"P.T.M.":t?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}});var Rs="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),Cs="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),Is=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],Us=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?Cs[e.month()]:Rs[e.month()]:Rs},monthsRegex:Us,monthsShortRegex:Us,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:Is,longMonthsParse:Is,shortMonthsParse:Is,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}});var Gs="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),Vs="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),Bs=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],Ks=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?Vs[e.month()]:Gs[e.month()]:Gs},monthsRegex:Ks,monthsShortRegex:Ks,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:Bs,longMonthsParse:Bs,shortMonthsParse:Bs,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:4},invalidDate:"Fecha inv\xe1lida"});var qs="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),Zs="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),$s=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],Qs=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;M.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?Zs[e.month()]:qs[e.month()]:qs},monthsRegex:Qs,monthsShortRegex:Qs,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:$s,longMonthsParse:$s,shortMonthsParse:$s,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}});var Xs="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),en="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),an=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],tn=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;function sn(e,a,t,s){var n={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[e+" minuti",e+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[e+" tunni",e+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[e+" kuu",e+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[e+" aasta",e+" aastat"]};return a?n[t][2]?n[t][2]:n[t][1]:s?n[t][0]:n[t][1]}M.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?en[e.month()]:Xs[e.month()]:Xs},monthsRegex:tn,monthsShortRegex:tn,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:an,longMonthsParse:an,shortMonthsParse:an,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4},invalidDate:"Fecha inv\xe1lida"}),M.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:sn,ss:sn,m:sn,mm:sn,h:sn,hh:sn,d:sn,dd:"%d p\xe4eva",M:sn,MM:sn,y:sn,yy:sn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var nn={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},rn={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};M.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,a,t){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"%d \u062b\u0627\u0646\u06cc\u0647",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(e){return rn[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return nn[e]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}});var dn="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),_n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",dn[7],dn[8],dn[9]];function on(e,a,t,s){var n,r,d="";switch(t){case"s":return s?"muutaman sekunnin":"muutama sekunti";case"ss":d=s?"sekunnin":"sekuntia";break;case"m":return s?"minuutin":"minuutti";case"mm":d=s?"minuutin":"minuuttia";break;case"h":return s?"tunnin":"tunti";case"hh":d=s?"tunnin":"tuntia";break;case"d":return s?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":d=s?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return s?"kuukauden":"kuukausi";case"MM":d=s?"kuukauden":"kuukautta";break;case"y":return s?"vuoden":"vuosi";case"yy":d=s?"vuoden":"vuotta";break}return r=s,d=((n=e)<10?r?_n[n]:dn[n]:n)+" "+d}M.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:on,ss:on,m:on,mm:on,h:on,hh:on,d:on,dd:on,M:on,MM:on,y:on,yy:on},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),M.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}}),M.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}});var mn=/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?|janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,un=[/^janv/i,/^f\xe9vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao\xfbt/i,/^sept/i,/^oct/i,/^nov/i,/^d\xe9c/i];M.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsRegex:mn,monthsShortRegex:mn,monthsStrictRegex:/^(janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,monthsShortStrictRegex:/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?)/i,monthsParse:un,longMonthsParse:un,shortMonthsParse:un,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,a){switch(a){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}});var ln="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),Mn="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");M.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?Mn[e.month()]:ln[e.month()]:ln},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}});M.defineLocale("ga",{months:["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","Meitheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deireadh F\xf3mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M\xe1rt","Aib","Beal","Meith","I\xfail","L\xfan","M.F.","D.F.","Samh","Noll"],monthsParseExact:!0,weekdays:["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Sathairn"],weekdaysShort:["Domh","Luan","M\xe1irt","C\xe9ad","D\xe9ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M\xe1","C\xe9","D\xe9","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xedonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}});function hn(e,a,t,s){var n={s:["\u0925\u094b\u0921\u092f\u093e \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940","\u0925\u094b\u0921\u0947 \u0938\u0945\u0915\u0902\u0921"],ss:[e+" \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940",e+" \u0938\u0945\u0915\u0902\u0921"],m:["\u090f\u0915\u093e \u092e\u093f\u0923\u091f\u093e\u0928","\u090f\u0915 \u092e\u093f\u0928\u0942\u091f"],mm:[e+" \u092e\u093f\u0923\u091f\u093e\u0902\u0928\u0940",e+" \u092e\u093f\u0923\u091f\u093e\u0902"],h:["\u090f\u0915\u093e \u0935\u0930\u093e\u0928","\u090f\u0915 \u0935\u0930"],hh:[e+" \u0935\u0930\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u093e\u0902"],d:["\u090f\u0915\u093e \u0926\u093f\u0938\u093e\u0928","\u090f\u0915 \u0926\u0940\u0938"],dd:[e+" \u0926\u093f\u0938\u093e\u0902\u0928\u0940",e+" \u0926\u0940\u0938"],M:["\u090f\u0915\u093e \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928","\u090f\u0915 \u092e\u094d\u0939\u092f\u0928\u094b"],MM:[e+" \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928\u0940",e+" \u092e\u094d\u0939\u092f\u0928\u0947"],y:["\u090f\u0915\u093e \u0935\u0930\u094d\u0938\u093e\u0928","\u090f\u0915 \u0935\u0930\u094d\u0938"],yy:[e+" \u0935\u0930\u094d\u0938\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u094d\u0938\u093e\u0902"]};return s?n[t][0]:n[t][1]}function cn(e,a,t,s){var n={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return s?n[t][0]:n[t][1]}M.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}}),M.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("gom-deva",{months:{standalone:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u092f_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),format:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092e\u093e\u0930\u094d\u091a\u093e\u091a\u094d\u092f\u093e_\u090f\u092a\u094d\u0930\u0940\u0932\u093e\u091a\u094d\u092f\u093e_\u092e\u0947\u092f\u093e\u091a\u094d\u092f\u093e_\u091c\u0942\u0928\u093e\u091a\u094d\u092f\u093e_\u091c\u0941\u0932\u092f\u093e\u091a\u094d\u092f\u093e_\u0911\u0917\u0938\u094d\u091f\u093e\u091a\u094d\u092f\u093e_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0911\u0915\u094d\u091f\u094b\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0921\u093f\u0938\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940._\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u092f\u0924\u093e\u0930_\u0938\u094b\u092e\u093e\u0930_\u092e\u0902\u0917\u0933\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u092c\u093f\u0930\u0947\u0938\u094d\u0924\u093e\u0930_\u0938\u0941\u0915\u094d\u0930\u093e\u0930_\u0936\u0947\u0928\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0906\u092f\u0924._\u0938\u094b\u092e._\u092e\u0902\u0917\u0933._\u092c\u0941\u0927._\u092c\u094d\u0930\u0947\u0938\u094d\u0924._\u0938\u0941\u0915\u094d\u0930._\u0936\u0947\u0928.".split("_"),weekdaysMin:"\u0906_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u092c\u094d\u0930\u0947_\u0938\u0941_\u0936\u0947".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LTS:"A h:mm:ss [\u0935\u093e\u091c\u0924\u093e\u0902]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",llll:"ddd, D MMM YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]"},calendar:{sameDay:"[\u0906\u092f\u091c] LT",nextDay:"[\u092b\u093e\u0932\u094d\u092f\u093e\u0902] LT",nextWeek:"[\u092b\u0941\u0921\u0932\u094b] dddd[,] LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092b\u093e\u091f\u0932\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s \u0906\u0926\u0940\u0902",s:hn,ss:hn,m:hn,mm:hn,h:hn,hh:hn,d:hn,dd:hn,M:hn,MM:hn,y:hn,yy:hn},dayOfMonthOrdinalParse:/\d{1,2}(\u0935\u0947\u0930)/,ordinal:function(e,a){switch(a){case"D":return e+"\u0935\u0947\u0930";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/\u0930\u093e\u0924\u0940|\u0938\u0915\u093e\u0933\u0940\u0902|\u0926\u0928\u092a\u093e\u0930\u093e\u0902|\u0938\u093e\u0902\u091c\u0947/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924\u0940"===a?e<4?e:e+12:"\u0938\u0915\u093e\u0933\u0940\u0902"===a?e:"\u0926\u0928\u092a\u093e\u0930\u093e\u0902"===a?12<e?e:e+12:"\u0938\u093e\u0902\u091c\u0947"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0930\u093e\u0924\u0940":e<12?"\u0938\u0915\u093e\u0933\u0940\u0902":e<16?"\u0926\u0928\u092a\u093e\u0930\u093e\u0902":e<20?"\u0938\u093e\u0902\u091c\u0947":"\u0930\u093e\u0924\u0940"}}),M.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:cn,ss:cn,m:cn,mm:cn,h:cn,hh:cn,d:cn,dd:cn,M:cn,MM:cn,y:cn,yy:cn},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,a){switch(a){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(e,a){return 12===e&&(e=0),"rati"===a?e<4?e:e+12:"sokallim"===a?e:"donparam"===a?12<e?e:e+12:"sanje"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"rati":e<12?"sokallim":e<16?"donparam":e<20?"sanje":"rati"}});var Ln={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},Yn={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};M.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ab9\u0ac7\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(e){return Yn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Ln[e]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===a?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===a?e:"\u0aac\u0aaa\u0acb\u0ab0"===a?10<=e?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}}),M.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(e){return 2===e?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":e+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(e){return 2===e?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":e+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(e){return 2===e?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":e+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(e){return 2===e?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":e%10==0&&10!==e?e+" \u05e9\u05e0\u05d4":e+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(e){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(e)},meridiem:function(e,a,t){return e<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":e<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":e<12?t?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":e<18?t?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}});var yn={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},fn={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},pn=[/^\u091c\u0928/i,/^\u092b\u093c\u0930|\u092b\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924\u0902|\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935|\u0928\u0935\u0902/i,/^\u0926\u093f\u0938\u0902|\u0926\u093f\u0938/i];function kn(e,a,t){var s=e+" ";switch(t){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return s+=1!==e&&(2===e||3===e||4===e)?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1!==e&&(2===e||3===e||4===e)?"godine":"godina"}}M.defineLocale("hi",{months:{format:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),standalone:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u0902\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u0902\u092c\u0930_\u0926\u093f\u0938\u0902\u092c\u0930".split("_")},monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},monthsParse:pn,longMonthsParse:pn,shortMonthsParse:[/^\u091c\u0928/i,/^\u092b\u093c\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935/i,/^\u0926\u093f\u0938/i],monthsRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsShortRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsStrictRegex:/^(\u091c\u0928\u0935\u0930\u0940?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908?|\u0905\u0917\u0938\u094d\u0924?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924?\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930?)/i,monthsShortStrictRegex:/^(\u091c\u0928\.?|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\.?|\u0905\u0917\.?|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\.?|\u0926\u093f\u0938\.?)/i,calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return fn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return yn[e]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924"===a?e<4?e:e+12:"\u0938\u0941\u092c\u0939"===a?e:"\u0926\u094b\u092a\u0939\u0930"===a?10<=e?e:e+12:"\u0936\u093e\u092e"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0930\u093e\u0924":e<10?"\u0938\u0941\u092c\u0939":e<17?"\u0926\u094b\u092a\u0939\u0930":e<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}}),M.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro\u0161lu] [nedjelju] [u] LT";case 3:return"[pro\u0161lu] [srijedu] [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:kn,m:kn,mm:kn,h:kn,hh:kn,d:"dan",dd:kn,M:"mjesec",MM:kn,y:"godinu",yy:kn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var Dn="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function Tn(e,a,t,s){var n=e;switch(t){case"s":return s||a?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return n+(s||a)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(s||a?" perc":" perce");case"mm":return n+(s||a?" perc":" perce");case"h":return"egy"+(s||a?" \xf3ra":" \xf3r\xe1ja");case"hh":return n+(s||a?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(s||a?" nap":" napja");case"dd":return n+(s||a?" nap":" napja");case"M":return"egy"+(s||a?" h\xf3nap":" h\xf3napja");case"MM":return n+(s||a?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(s||a?" \xe9v":" \xe9ve");case"yy":return n+(s||a?" \xe9v":" \xe9ve")}return""}function gn(e){return(e?"":"[m\xfalt] ")+"["+Dn[this.day()]+"] LT[-kor]"}function wn(e){return e%100==11||e%10!=1}function vn(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return wn(e)?n+(a||s?"sek\xfandur":"sek\xfandum"):n+"sek\xfanda";case"m":return a?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return wn(e)?n+(a||s?"m\xedn\xfatur":"m\xedn\xfatum"):a?n+"m\xedn\xfata":n+"m\xedn\xfatu";case"hh":return wn(e)?n+(a||s?"klukkustundir":"klukkustundum"):n+"klukkustund";case"d":return a?"dagur":s?"dag":"degi";case"dd":return wn(e)?a?n+"dagar":n+(s?"daga":"d\xf6gum"):a?n+"dagur":n+(s?"dag":"degi");case"M":return a?"m\xe1nu\xf0ur":s?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return wn(e)?a?n+"m\xe1nu\xf0ir":n+(s?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):a?n+"m\xe1nu\xf0ur":n+(s?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return a||s?"\xe1r":"\xe1ri";case"yy":return wn(e)?n+(a||s?"\xe1r":"\xe1rum"):n+(a||s?"\xe1r":"\xe1ri")}}M.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan._feb._m\xe1rc._\xe1pr._m\xe1j._j\xfan._j\xfal._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?!0===t?"de":"DE":!0===t?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return gn.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return gn.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:Tn,ss:Tn,m:Tn,mm:Tn,h:Tn,hh:Tn,d:Tn,dd:Tn,M:Tn,MM:Tn,y:Tn,yy:Tn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(e){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(e)},meridiem:function(e){return e<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":e<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":e<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(e,a){switch(a){case"DDD":case"w":case"W":case"DDDo":return 1===e?e+"-\u056b\u0576":e+"-\u0580\u0564";default:return e}},week:{dow:1,doy:7}}),M.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?11<=e?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}}),M.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:vn,ss:vn,m:vn,mm:vn,h:"klukkustund",hh:vn,d:vn,dd:vn,M:vn,MM:vn,y:vn,yy:vn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"\u4ee4\u548c",narrow:"\u32ff",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"\u5e73\u6210",narrow:"\u337b",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"\u662d\u548c",narrow:"\u337c",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"\u5927\u6b63",narrow:"\u337d",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"\u660e\u6cbb",narrow:"\u337e",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"\u897f\u66a6",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"\u7d00\u5143\u524d",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(\u5143|\d+)\u5e74/,eraYearOrdinalParse:function(e,a){return"\u5143"===a[1]?1:parseInt(a[1]||e,10)},months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(e){return"\u5348\u5f8c"===e},meridiem:function(e,a,t){return e<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(e){return e.week()!==this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(e){return this.week()!==e.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(e,a){switch(a){case"y":return 1===e?"\u5143\u5e74":e+"\u5e74";case"d":case"D":case"DDD":return e+"\u65e5";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}}),M.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(e,a){return 12===e&&(e=0),"enjing"===a?e:"siyang"===a?11<=e?e:e+12:"sonten"===a||"ndalu"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"enjing":e<15?"siyang":e<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}}),M.defineLocale("ka",{months:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(e){return e.replace(/(\u10ec\u10d0\u10db|\u10ec\u10e3\u10d7|\u10e1\u10d0\u10d0\u10d7|\u10ec\u10d4\u10da|\u10d3\u10e6|\u10d7\u10d5)(\u10d8|\u10d4)/,function(e,a,t){return"\u10d8"===t?a+"\u10e8\u10d8":a+t+"\u10e8\u10d8"})},past:function(e){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(e)?e.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(e)?e.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):e},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(e){return 0===e?e:1===e?e+"-\u10da\u10d8":e<20||e<=100&&e%20==0||e%100==0?"\u10db\u10d4-"+e:e+"-\u10d4"},week:{dow:1,doy:7}});var bn={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};M.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(e){return e+(bn[e]||bn[e%10]||bn[100<=e?100:null])},week:{dow:1,doy:7}});var Sn={1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"},Hn={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"};M.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(e){return"\u179b\u17d2\u1784\u17b6\u1785"===e},meridiem:function(e,a,t){return e<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(e){return e.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(e){return Hn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Sn[e]})},week:{dow:1,doy:4}});var jn={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},xn={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};M.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(e){return xn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return jn[e]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===a?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===a?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===a?10<=e?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}}),M.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\uc77c";case"M":return e+"\uc6d4";case"w":case"W":return e+"\uc8fc";default:return e}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(e){return"\uc624\ud6c4"===e},meridiem:function(e,a,t){return e<12?"\uc624\uc804":"\uc624\ud6c4"}});var Pn={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},On={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},Wn=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"];M.defineLocale("ku",{months:Wn,monthsShort:Wn,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(e){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(e)},meridiem:function(e,a,t){return e<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return On[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return Pn[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}});var An={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};function En(e,a,t,s){var n={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?n[t][0]:n[t][1]}function Fn(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var a=e%10;return 0==a?Fn(e/10):Fn(a)}if(e<1e4){for(;10<=e;)e/=10;return Fn(e)}return Fn(e/=1e3)}M.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(e){return e+(An[e]||An[e%10]||An[100<=e?100:null])},week:{dow:1,doy:7}}),M.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(e){return Fn(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e},past:function(e){return Fn(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e},s:"e puer Sekonnen",ss:"%d Sekonnen",m:En,mm:"%d Minutten",h:En,hh:"%d Stonnen",d:En,dd:"%d Deeg",M:En,MM:"%d M\xe9int",y:En,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(e){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===e},meridiem:function(e,a,t){return e<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(e){return"\u0e97\u0eb5\u0ec8"+e}});var zn={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function Nn(e,a,t,s){return a?Rn(t)[0]:s?Rn(t)[1]:Rn(t)[2]}function Jn(e){return e%10==0||10<e&&e<20}function Rn(e){return zn[e].split("_")}function Cn(e,a,t,s){var n=e+" ";return 1===e?n+Nn(0,a,t[0],s):a?n+(Jn(e)?Rn(t)[1]:Rn(t)[0]):s?n+Rn(t)[1]:n+(Jn(e)?Rn(t)[1]:Rn(t)[2])}M.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(e,a,t,s){return a?"kelios sekund\u0117s":s?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:Cn,m:Nn,mm:Cn,h:Nn,hh:Cn,d:Nn,dd:Cn,M:Nn,MM:Cn,y:Nn,yy:Cn},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});var In={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function Un(e,a,t){return t?a%10==1&&a%100!=11?e[2]:e[3]:a%10==1&&a%100!=11?e[0]:e[1]}function Gn(e,a,t){return e+" "+Un(In[t],e,a)}function Vn(e,a,t){return Un(In[t],e,a)}M.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(e,a){return a?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:Gn,m:Vn,mm:Gn,h:Vn,hh:Gn,d:Vn,dd:Gn,M:Vn,MM:Gn,y:Vn,yy:Gn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var Bn={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:2<=e&&e<=4?a[1]:a[2]},translate:function(e,a,t){var s=Bn.words[t];return 1===t.length?a?s[0]:s[1]:e+" "+Bn.correctGrammaticalCase(e,s)}};function Kn(e,a,t,s){switch(t){case"s":return a?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return e+(a?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return e+(a?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return e+(a?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return e+(a?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return e+(a?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return e+(a?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return e}}M.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:Bn.translate,m:Bn.translate,mm:Bn.translate,h:Bn.translate,hh:Bn.translate,d:"dan",dd:Bn.translate,M:"mjesec",MM:Bn.translate,y:"godinu",yy:Bn.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u0435\u0434\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0435\u0434\u0435\u043d \u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0435\u0434\u0435\u043d \u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u0435\u0434\u0435\u043d \u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-\u0435\u0432":0==t?e+"-\u0435\u043d":10<t&&t<20?e+"-\u0442\u0438":1==a?e+"-\u0432\u0438":2==a?e+"-\u0440\u0438":7==a||8==a?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}}),M.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===a&&4<=e||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===a||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===a?e+12:e},meridiem:function(e,a,t){return e<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":e<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":e<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":e<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}}),M.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(e){return"\u04ae\u0425"===e},meridiem:function(e,a,t){return e<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:Kn,ss:Kn,m:Kn,mm:Kn,h:Kn,hh:Kn,d:Kn,dd:Kn,M:Kn,MM:Kn,y:Kn,yy:Kn},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+" \u04e9\u0434\u04e9\u0440";default:return e}}});var qn={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},Zn={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function $n(e,a,t,s){var n="";if(a)switch(t){case"s":n="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":n="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":n="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":n="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":n="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":n="%d \u0924\u093e\u0938";break;case"d":n="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":n="%d \u0926\u093f\u0935\u0938";break;case"M":n="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":n="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":n="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":n="%d \u0935\u0930\u094d\u0937\u0947";break}else switch(t){case"s":n="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":n="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":n="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":n="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":n="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":n="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":n="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":n="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":n="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":n="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":n="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":n="%d \u0935\u0930\u094d\u0937\u093e\u0902";break}return n.replace(/%d/i,e)}M.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:$n,ss:$n,m:$n,mm:$n,h:$n,hh:$n,d:$n,dd:$n,M:$n,MM:$n,y:$n,yy:$n},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return Zn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return qn[e]})},meridiemParse:/\u092a\u0939\u093e\u091f\u0947|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940|\u0930\u093e\u0924\u094d\u0930\u0940/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u092a\u0939\u093e\u091f\u0947"===a||"\u0938\u0915\u093e\u0933\u0940"===a?e:"\u0926\u0941\u092a\u093e\u0930\u0940"===a||"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===a||"\u0930\u093e\u0924\u094d\u0930\u0940"===a?12<=e?e:e+12:void 0},meridiem:function(e,a,t){return 0<=e&&e<6?"\u092a\u0939\u093e\u091f\u0947":e<12?"\u0938\u0915\u093e\u0933\u0940":e<17?"\u0926\u0941\u092a\u093e\u0930\u0940":e<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}}),M.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?11<=e?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),M.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?11<=e?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),M.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}});var Qn={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},Xn={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};M.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(e){return Xn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Qn[e]})},week:{dow:1,doy:4}}),M.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var er={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},ar={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};M.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return ar[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return er[e]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===a?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===a?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===a?10<=e?e:e+12:"\u0938\u093e\u0901\u091d"===a?e+12:void 0},meridiem:function(e,a,t){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}});var tr="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),sr="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),nr=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],rr=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?sr[e.month()]:tr[e.month()]:tr},monthsRegex:rr,monthsShortRegex:rr,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:nr,longMonthsParse:nr,shortMonthsParse:nr,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}});var dr="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),ir="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),_r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],or=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;M.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,a){return e?/-MMM-/.test(a)?ir[e.month()]:dr[e.month()]:dr},monthsRegex:or,monthsShortRegex:or,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:_r,longMonthsParse:_r,shortMonthsParse:_r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",w:"\xe9\xe9n week",ww:"%d weken",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),M.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m\xe5._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("oc-lnc",{months:{standalone:"geni\xe8r_febri\xe8r_mar\xe7_abril_mai_junh_julhet_agost_setembre_oct\xf2bre_novembre_decembre".split("_"),format:"de geni\xe8r_de febri\xe8r_de mar\xe7_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct\xf2bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dim\xe8cres_dij\xf2us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u\xe8i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i\xe8r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,a){return e+("w"!==a&&"W"!==a?1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8":"a")},week:{dow:1,doy:4}});var mr={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},ur={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};M.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(e){return ur[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return mr[e]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===a?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===a?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===a?10<=e?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}});var lr="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),Mr="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_"),hr=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa\u017a/i,/^lis/i,/^gru/i];function cr(e){return e%10<5&&1<e%10&&~~(e/10)%10!=1}function Lr(e,a,t){var s=e+" ";switch(t){case"ss":return s+(cr(e)?"sekundy":"sekund");case"m":return a?"minuta":"minut\u0119";case"mm":return s+(cr(e)?"minuty":"minut");case"h":return a?"godzina":"godzin\u0119";case"hh":return s+(cr(e)?"godziny":"godzin");case"ww":return s+(cr(e)?"tygodnie":"tygodni");case"MM":return s+(cr(e)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return s+(cr(e)?"lata":"lat")}}function Yr(e,a,t){return e+(20<=e%100||100<=e&&e%100==0?" de ":" ")+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s\u0103pt\u0103m\xe2ni",MM:"luni",yy:"ani"}[t]}function yr(e,a,t){var s,n;return"m"===t?a?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":e+" "+(s=+e,n={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",ww:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043d\u0435\u0434\u0435\u043b\u0438_\u043d\u0435\u0434\u0435\u043b\u044c",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[t].split("_"),s%10==1&&s%100!=11?n[0]:2<=s%10&&s%10<=4&&(s%100<10||20<=s%100)?n[1]:n[2])}M.defineLocale("pl",{months:function(e,a){return e?/D MMMM/.test(a)?Mr[e.month()]:lr[e.month()]:lr},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),monthsParse:hr,longMonthsParse:hr,shortMonthsParse:hr,weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:Lr,m:Lr,mm:Lr,h:Lr,hh:Lr,d:"1 dzie\u0144",dd:"%d dni",w:"tydzie\u0144",ww:Lr,M:"miesi\u0105c",MM:Lr,y:"rok",yy:Lr},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter\xe7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xe1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xe1b".split("_"),weekdaysMin:"do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",invalidDate:"Data inv\xe1lida"}),M.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:Yr,m:"un minut",mm:Yr,h:"o or\u0103",hh:Yr,d:"o zi",dd:Yr,w:"o s\u0103pt\u0103m\xe2n\u0103",ww:Yr,M:"o lun\u0103",MM:Yr,y:"un an",yy:Yr},week:{dow:1,doy:7}});var fr=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];M.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:fr,longMonthsParse:fr,shortMonthsParse:fr,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:yr,m:yr,mm:yr,h:"\u0447\u0430\u0441",hh:yr,d:"\u0434\u0435\u043d\u044c",dd:yr,w:"\u043d\u0435\u0434\u0435\u043b\u044f",ww:yr,M:"\u043c\u0435\u0441\u044f\u0446",MM:yr,y:"\u0433\u043e\u0434",yy:yr},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(e)},meridiem:function(e,a,t){return e<4?"\u043d\u043e\u0447\u0438":e<12?"\u0443\u0442\u0440\u0430":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-\u0439";case"D":return e+"-\u0433\u043e";case"w":case"W":return e+"-\u044f";default:return e}},week:{dow:1,doy:4}});var pr=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],kr=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];M.defineLocale("sd",{months:pr,monthsShort:pr,weekdays:kr,weekdaysShort:kr,weekdaysMin:kr,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}}),M.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(e){return e+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(e){return"\u0db4.\u0dc0."===e||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===e},meridiem:function(e,a,t){return 11<e?t?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":t?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}});var Dr="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),Tr="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function gr(e){return 1<e&&e<5}function wr(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return a||s?n+(gr(e)?"sekundy":"sek\xfand"):n+"sekundami";case"m":return a?"min\xfata":s?"min\xfatu":"min\xfatou";case"mm":return a||s?n+(gr(e)?"min\xfaty":"min\xfat"):n+"min\xfatami";case"h":return a?"hodina":s?"hodinu":"hodinou";case"hh":return a||s?n+(gr(e)?"hodiny":"hod\xedn"):n+"hodinami";case"d":return a||s?"de\u0148":"d\u0148om";case"dd":return a||s?n+(gr(e)?"dni":"dn\xed"):n+"d\u0148ami";case"M":return a||s?"mesiac":"mesiacom";case"MM":return a||s?n+(gr(e)?"mesiace":"mesiacov"):n+"mesiacmi";case"y":return a||s?"rok":"rokom";case"yy":return a||s?n+(gr(e)?"roky":"rokov"):n+"rokmi"}}function vr(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"nekaj sekund":"nekaj sekundami";case"ss":return n+=1===e?a?"sekundo":"sekundi":2===e?a||s?"sekundi":"sekundah":e<5?a||s?"sekunde":"sekundah":"sekund";case"m":return a?"ena minuta":"eno minuto";case"mm":return n+=1===e?a?"minuta":"minuto":2===e?a||s?"minuti":"minutama":e<5?a||s?"minute":"minutami":a||s?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return n+=1===e?a?"ura":"uro":2===e?a||s?"uri":"urama":e<5?a||s?"ure":"urami":a||s?"ur":"urami";case"d":return a||s?"en dan":"enim dnem";case"dd":return n+=1===e?a||s?"dan":"dnem":2===e?a||s?"dni":"dnevoma":a||s?"dni":"dnevi";case"M":return a||s?"en mesec":"enim mesecem";case"MM":return n+=1===e?a||s?"mesec":"mesecem":2===e?a||s?"meseca":"mesecema":e<5?a||s?"mesece":"meseci":a||s?"mesecev":"meseci";case"y":return a||s?"eno leto":"enim letom";case"yy":return n+=1===e?a||s?"leto":"letom":2===e?a||s?"leti":"letoma":e<5?a||s?"leta":"leti":a||s?"let":"leti"}}M.defineLocale("sk",{months:Dr,monthsShort:Tr,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:wr,ss:wr,m:wr,mm:wr,h:wr,hh:wr,d:wr,dd:wr,M:wr,MM:wr,y:wr,yy:wr},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:vr,ss:vr,m:vr,mm:vr,h:vr,hh:vr,d:vr,dd:vr,M:vr,MM:vr,y:vr,yy:vr},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,a,t){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var br={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:2<=e&&e<=4?a[1]:a[2]},translate:function(e,a,t){var s=br.words[t];return 1===t.length?a?s[0]:s[1]:e+" "+br.correctGrammaticalCase(e,s)}};M.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:br.translate,m:br.translate,mm:br.translate,h:br.translate,hh:br.translate,d:"\u0434\u0430\u043d",dd:br.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:br.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:br.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var Sr={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:2<=e&&e<=4?a[1]:a[2]},translate:function(e,a,t){var s=Sr.words[t];return 1===t.length?a?s[0]:s[1]:e+" "+Sr.correctGrammaticalCase(e,s)}};M.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:Sr.translate,m:Sr.translate,mm:Sr.translate,h:Sr.translate,hh:Sr.translate,d:"dan",dd:Sr.translate,M:"mesec",MM:Sr.translate,y:"godinu",yy:Sr.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,a,t){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,a){return 12===e&&(e=0),"ekuseni"===a?e:"emini"===a?11<=e?e:e+12:"entsambama"===a||"ebusuku"===a?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}}),M.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(e){var a=e%10;return e+(1!=~~(e%100/10)&&(1==a||2==a)?":a":":e")},week:{dow:1,doy:4}}),M.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}});var Hr={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},jr={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};M.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(e){return jr[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Hr[e]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,a,t){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,a){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===a?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===a||"\u0b95\u0bbe\u0bb2\u0bc8"===a||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===a&&10<=e?e:e+12},week:{dow:0,doy:6}}),M.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===a?e<4?e:e+12:"\u0c09\u0c26\u0c2f\u0c02"===a?e:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===a?10<=e?e:e+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":e<10?"\u0c09\u0c26\u0c2f\u0c02":e<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":e<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}}),M.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}});var xr={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};M.defineLocale("tg",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0430\u043b\u0438_\u043c\u0430\u0440\u0442\u0438_\u0430\u043f\u0440\u0435\u043b\u0438_\u043c\u0430\u0439\u0438_\u0438\u044e\u043d\u0438_\u0438\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442\u0438_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0438_\u043e\u043a\u0442\u044f\u0431\u0440\u0438_\u043d\u043e\u044f\u0431\u0440\u0438_\u0434\u0435\u043a\u0430\u0431\u0440\u0438".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_")},monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u0424\u0430\u0440\u0434\u043e \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0448\u0430\u0431"===a?e<4?e:e+12:"\u0441\u0443\u0431\u04b3"===a?e:"\u0440\u04ef\u0437"===a?11<=e?e:e+12:"\u0431\u0435\u0433\u043e\u04b3"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0448\u0430\u0431":e<11?"\u0441\u0443\u0431\u04b3":e<16?"\u0440\u04ef\u0437":e<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(e){return e+(xr[e]||xr[e%10]||xr[100<=e?100:null])},week:{dow:1,doy:7}}),M.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(e){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===e},meridiem:function(e,a,t){return e<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",w:"1 \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",ww:"%d \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}});var Pr={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'\xfcnji",4:"'\xfcnji",100:"'\xfcnji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};M.defineLocale("tk",{months:"\xddanwar_Fewral_Mart_Aprel_Ma\xfd_I\xfdun_I\xfdul_Awgust_Sent\xfdabr_Okt\xfdabr_No\xfdabr_Dekabr".split("_"),monthsShort:"\xddan_Few_Mar_Apr_Ma\xfd_I\xfdn_I\xfdl_Awg_Sen_Okt_No\xfd_Dek".split("_"),weekdays:"\xddek\u015fenbe_Du\u015fenbe_Si\u015fenbe_\xc7ar\u015fenbe_Pen\u015fenbe_Anna_\u015eenbe".split("_"),weekdaysShort:"\xddek_Du\u015f_Si\u015f_\xc7ar_Pen_Ann_\u015een".split("_"),weekdaysMin:"\xddk_D\u015f_S\u015f_\xc7r_Pn_An_\u015en".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d\xfc\xfdn] LT",lastWeek:"[ge\xe7en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so\u0148",past:"%s \xf6\u0148",s:"birn\xe4\xe7e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir a\xfd",MM:"%d a\xfd",y:"bir \xfdyl",yy:"%d \xfdyl"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'unjy";var t=e%10;return e+(Pr[t]||Pr[e%100-t]||Pr[100<=e?100:null])}},week:{dow:1,doy:7}}),M.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});var Or="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function Wr(e,a,t,s){var n=function(e){var a=Math.floor(e%1e3/100),t=Math.floor(e%100/10),s=e%10,n="";0<a&&(n+=Or[a]+"vatlh");0<t&&(n+=(""!==n?" ":"")+Or[t]+"maH");0<s&&(n+=(""!==n?" ":"")+Or[s]);return""===n?"pagh":n}(e);switch(t){case"ss":return n+" lup";case"mm":return n+" tup";case"hh":return n+" rep";case"dd":return n+" jaj";case"MM":return n+" jar";case"yy":return n+" DIS"}}M.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(e){var a=e;return a=-1!==e.indexOf("jaj")?a.slice(0,-3)+"leS":-1!==e.indexOf("jar")?a.slice(0,-3)+"waQ":-1!==e.indexOf("DIS")?a.slice(0,-3)+"nem":a+" pIq"},past:function(e){var a=e;return a=-1!==e.indexOf("jaj")?a.slice(0,-3)+"Hu\u2019":-1!==e.indexOf("jar")?a.slice(0,-3)+"wen":-1!==e.indexOf("DIS")?a.slice(0,-3)+"ben":a+" ret"},s:"puS lup",ss:Wr,m:"wa\u2019 tup",mm:Wr,h:"wa\u2019 rep",hh:Wr,d:"wa\u2019 jaj",dd:Wr,M:"wa\u2019 jar",MM:Wr,y:"wa\u2019 DIS",yy:Wr},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var Ar={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};function Er(e,a,t,s){var n={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",e+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[e+" m\xeduts",e+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[e+" \xfeoras",e+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",e+" ars"]};return s||a?n[t][0]:n[t][1]}function Fr(e,a,t){var s,n;return"m"===t?a?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===t?a?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":e+" "+(s=+e,n={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:a?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[t].split("_"),s%10==1&&s%100!=11?n[0]:2<=s%10&&s%10<=4&&(s%100<10||20<=s%100)?n[1]:n[2])}function zr(e){return function(){return e+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}M.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),meridiem:function(e,a,t){return e<12?t?"\xf6\xf6":"\xd6\xd6":t?"\xf6s":"\xd6S"},meridiemParse:/\xf6\xf6|\xd6\xd6|\xf6s|\xd6S/,isPM:function(e){return"\xf6s"===e||"\xd6S"===e},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'\u0131nc\u0131";var t=e%10;return e+(Ar[t]||Ar[e%100-t]||Ar[100<=e?100:null])}},week:{dow:1,doy:7}}),M.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,a,t){return 11<e?t?"d'o":"D'O":t?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:Er,ss:Er,m:Er,mm:Er,h:Er,hh:Er,d:Er,dd:Er,M:Er,MM:Er,y:Er,yy:Er},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}}),M.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}}),M.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===a||"\u0633\u06d5\u06be\u06d5\u0631"===a||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===a||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"!==a&&"\u0643\u06d5\u0686"!==a&&11<=e?e:e+12},meridiem:function(e,a,t){var s=100*e+a;return s<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":s<900?"\u0633\u06d5\u06be\u06d5\u0631":s<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":s<1230?"\u0686\u06c8\u0634":s<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return e+"-\u06be\u06d5\u067e\u062a\u06d5";default:return e}},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:7}}),M.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(e,a){var t={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===e?t.nominative.slice(1,7).concat(t.nominative.slice(0,1)):e?t[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(a)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(a)?"genitive":"nominative"][e.day()]:t.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:zr("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:zr("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:zr("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:zr("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return zr("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return zr("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:Fr,m:Fr,mm:Fr,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:Fr,d:"\u0434\u0435\u043d\u044c",dd:Fr,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:Fr,y:"\u0440\u0456\u043a",yy:Fr},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(e)},meridiem:function(e,a,t){return e<4?"\u043d\u043e\u0447\u0456":e<12?"\u0440\u0430\u043d\u043a\u0443":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-\u0439";case"D":return e+"-\u0433\u043e";default:return e}},week:{dow:1,doy:7}});var Nr=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],Jr=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];return M.defineLocale("ur",{months:Nr,monthsShort:Nr,weekdays:Jr,weekdaysShort:Jr,weekdaysMin:Jr,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}}),M.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}}),M.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}}),M.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n tr\u01b0\u1edbc l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",w:"m\u1ed9t tu\u1ea7n",ww:"%d tu\u1ea7n",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),M.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}}),M.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a||"\u4e0b\u5348"!==a&&"\u665a\u4e0a"!==a&&11<=e?e:e+12},meridiem:function(e,a,t){var s=100*e+a;return s<600?"\u51cc\u6668":s<900?"\u65e9\u4e0a":s<1130?"\u4e0a\u5348":s<1230?"\u4e2d\u5348":s<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:function(e){return e.week()!==this.week()?"[\u4e0b]dddLT":"[\u672c]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(e){return this.week()!==e.week()?"[\u4e0a]dddLT":"[\u672c]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u5468";default:return e}},relativeTime:{future:"%s\u540e",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}}),M.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,t){var s=100*e+a;return s<600?"\u51cc\u6668":s<900?"\u65e9\u4e0a":s<1200?"\u4e0a\u5348":1200===s?"\u4e2d\u5348":s<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),M.defineLocale("zh-mo",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"D/M/YYYY",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,t){var s=100*e+a;return s<600?"\u51cc\u6668":s<900?"\u65e9\u4e0a":s<1130?"\u4e0a\u5348":s<1230?"\u4e2d\u5348":s<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),M.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,t){var s=100*e+a;return s<600?"\u51cc\u6668":s<900?"\u65e9\u4e0a":s<1130?"\u4e0a\u5348":s<1230?"\u4e2d\u5348":s<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),M.locale("en"),M});
Index: ews/js/tiny-slider-2.9.2.min.js
===================================================================
--- /views/js/tiny-slider-2.9.2.min.js	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-var tns=function(){Object.keys||(Object.keys=function(t){var e=[];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.push(n);return e}),"remove"in Element.prototype||(Element.prototype.remove=function(){this.parentNode&&this.parentNode.removeChild(this)});var t=window,Oi=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.msRequestAnimationFrame||function(t){return setTimeout(t,16)},e=window,Di=e.cancelAnimationFrame||e.mozCancelAnimationFrame||function(t){clearTimeout(t)};function Hi(){for(var t,e,n,i=arguments[0]||{},a=1,r=arguments.length;a<r;a++)if(null!==(t=arguments[a]))for(e in t)i!==(n=t[e])&&void 0!==n&&(i[e]=n);return i}function ki(t){return 0<=["true","false"].indexOf(t)?JSON.parse(t):t}function Ri(t,e,n,i){if(i)try{t.setItem(e,n)}catch(t){}return n}function Ii(){var t=document,e=t.body;return e||((e=t.createElement("body")).fake=!0),e}var n=document.documentElement;function Pi(t){var e="";return t.fake&&(e=n.style.overflow,t.style.background="",t.style.overflow=n.style.overflow="hidden",n.appendChild(t)),e}function zi(t,e){t.fake&&(t.remove(),n.style.overflow=e,n.offsetHeight)}function Wi(t,e,n,i){"insertRule"in t?t.insertRule(e+"{"+n+"}",i):t.addRule(e,n,i)}function Fi(t){return("insertRule"in t?t.cssRules:t.rules).length}function qi(t,e,n){for(var i=0,a=t.length;i<a;i++)e.call(n,t[i],i)}var i="classList"in document.createElement("_"),ji=i?function(t,e){return t.classList.contains(e)}:function(t,e){return 0<=t.className.indexOf(e)},Vi=i?function(t,e){ji(t,e)||t.classList.add(e)}:function(t,e){ji(t,e)||(t.className+=" "+e)},Gi=i?function(t,e){ji(t,e)&&t.classList.remove(e)}:function(t,e){ji(t,e)&&(t.className=t.className.replace(e,""))};function Qi(t,e){return t.hasAttribute(e)}function Xi(t,e){return t.getAttribute(e)}function r(t){return void 0!==t.item}function Yi(t,e){if(t=r(t)||t instanceof Array?t:[t],"[object Object]"===Object.prototype.toString.call(e))for(var n=t.length;n--;)for(var i in e)t[n].setAttribute(i,e[i])}function Ki(t,e){t=r(t)||t instanceof Array?t:[t];for(var n=(e=e instanceof Array?e:[e]).length,i=t.length;i--;)for(var a=n;a--;)t[i].removeAttribute(e[a])}function Ji(t){for(var e=[],n=0,i=t.length;n<i;n++)e.push(t[n]);return e}function Ui(t,e){"none"!==t.style.display&&(t.style.display="none")}function _i(t,e){"none"===t.style.display&&(t.style.display="")}function Zi(t){return"none"!==window.getComputedStyle(t).display}function $i(e){if("string"==typeof e){var n=[e],i=e.charAt(0).toUpperCase()+e.substr(1);["Webkit","Moz","ms","O"].forEach(function(t){"ms"===t&&"transform"!==e||n.push(t+i)}),e=n}for(var t=document.createElement("fakeelement"),a=(e.length,0);a<e.length;a++){var r=e[a];if(void 0!==t.style[r])return r}return!1}function ta(t,e){var n=!1;return/^Webkit/.test(t)?n="webkit"+e+"End":/^O/.test(t)?n="o"+e+"End":t&&(n=e.toLowerCase()+"end"),n}var a=!1;try{var o=Object.defineProperty({},"passive",{get:function(){a=!0}});window.addEventListener("test",null,o)}catch(t){}var u=!!a&&{passive:!0};function ea(t,e,n){for(var i in e){var a=0<=["touchstart","touchmove"].indexOf(i)&&!n&&u;t.addEventListener(i,e[i],a)}}function na(t,e){for(var n in e){var i=0<=["touchstart","touchmove"].indexOf(n)&&u;t.removeEventListener(n,e[n],i)}}function ia(){return{topics:{},on:function(t,e){this.topics[t]=this.topics[t]||[],this.topics[t].push(e)},off:function(t,e){if(this.topics[t])for(var n=0;n<this.topics[t].length;n++)if(this.topics[t][n]===e){this.topics[t].splice(n,1);break}},emit:function(e,n){n.type=e,this.topics[e]&&this.topics[e].forEach(function(t){t(n,e)})}}}var aa=function(O){O=Hi({container:".slider",mode:"carousel",axis:"horizontal",items:1,gutter:0,edgePadding:0,fixedWidth:!1,autoWidth:!1,viewportMax:!1,slideBy:1,center:!1,controls:!0,controlsPosition:"top",controlsText:["prev","next"],controlsContainer:!1,prevButton:!1,nextButton:!1,nav:!0,navPosition:"top",navContainer:!1,navAsThumbnails:!1,arrowKeys:!1,speed:300,autoplay:!1,autoplayPosition:"top",autoplayTimeout:5e3,autoplayDirection:"forward",autoplayText:["start","stop"],autoplayHoverPause:!1,autoplayButton:!1,autoplayButtonOutput:!0,autoplayResetOnVisibility:!0,animateIn:"tns-fadeIn",animateOut:"tns-fadeOut",animateNormal:"tns-normal",animateDelay:!1,loop:!0,rewind:!1,autoHeight:!1,responsive:!1,lazyload:!1,lazyloadSelector:".tns-lazy-img",touch:!0,mouseDrag:!1,swipeAngle:15,nested:!1,preventActionWhenRunning:!1,preventScrollOnTouch:!1,freezable:!0,onInit:!1,useLocalStorage:!0},O||{});var D=document,h=window,a={ENTER:13,SPACE:32,LEFT:37,RIGHT:39},e={},n=O.useLocalStorage;if(n){var t=navigator.userAgent,i=new Date;try{(e=h.localStorage)?(e.setItem(i,i),n=e.getItem(i)==i,e.removeItem(i)):n=!1,n||(e={})}catch(t){n=!1}n&&(e.tnsApp&&e.tnsApp!==t&&["tC","tPL","tMQ","tTf","t3D","tTDu","tTDe","tADu","tADe","tTE","tAE"].forEach(function(t){e.removeItem(t)}),localStorage.tnsApp=t)}var r,o,u,l,s,c,f,y=e.tC?ki(e.tC):Ri(e,"tC",function(){var t=document,e=Ii(),n=Pi(e),i=t.createElement("div"),a=!1;e.appendChild(i);try{for(var r,o="(10px * 10)",u=["calc"+o,"-moz-calc"+o,"-webkit-calc"+o],l=0;l<3;l++)if(r=u[l],i.style.width=r,100===i.offsetWidth){a=r.replace(o,"");break}}catch(t){}return e.fake?zi(e,n):i.remove(),a}(),n),g=e.tPL?ki(e.tPL):Ri(e,"tPL",function(){var t,e=document,n=Ii(),i=Pi(n),a=e.createElement("div"),r=e.createElement("div"),o="";a.className="tns-t-subp2",r.className="tns-t-ct";for(var u=0;u<70;u++)o+="<div></div>";return r.innerHTML=o,a.appendChild(r),n.appendChild(a),t=Math.abs(a.getBoundingClientRect().left-r.children[67].getBoundingClientRect().left)<2,n.fake?zi(n,i):a.remove(),t}(),n),H=e.tMQ?ki(e.tMQ):Ri(e,"tMQ",(o=document,u=Ii(),l=Pi(u),s=o.createElement("div"),c=o.createElement("style"),f="@media all and (min-width:1px){.tns-mq-test{position:absolute}}",c.type="text/css",s.className="tns-mq-test",u.appendChild(c),u.appendChild(s),c.styleSheet?c.styleSheet.cssText=f:c.appendChild(o.createTextNode(f)),r=window.getComputedStyle?window.getComputedStyle(s).position:s.currentStyle.position,u.fake?zi(u,l):s.remove(),"absolute"===r),n),d=e.tTf?ki(e.tTf):Ri(e,"tTf",$i("transform"),n),v=e.t3D?ki(e.t3D):Ri(e,"t3D",function(t){if(!t)return!1;if(!window.getComputedStyle)return!1;var e,n=document,i=Ii(),a=Pi(i),r=n.createElement("p"),o=9<t.length?"-"+t.slice(0,-9).toLowerCase()+"-":"";return o+="transform",i.insertBefore(r,null),r.style[t]="translate3d(1px,1px,1px)",e=window.getComputedStyle(r).getPropertyValue(o),i.fake?zi(i,a):r.remove(),void 0!==e&&0<e.length&&"none"!==e}(d),n),x=e.tTDu?ki(e.tTDu):Ri(e,"tTDu",$i("transitionDuration"),n),p=e.tTDe?ki(e.tTDe):Ri(e,"tTDe",$i("transitionDelay"),n),b=e.tADu?ki(e.tADu):Ri(e,"tADu",$i("animationDuration"),n),m=e.tADe?ki(e.tADe):Ri(e,"tADe",$i("animationDelay"),n),C=e.tTE?ki(e.tTE):Ri(e,"tTE",ta(x,"Transition"),n),w=e.tAE?ki(e.tAE):Ri(e,"tAE",ta(b,"Animation"),n),M=h.console&&"function"==typeof h.console.warn,T=["container","controlsContainer","prevButton","nextButton","navContainer","autoplayButton"],E={};if(T.forEach(function(t){if("string"==typeof O[t]){var e=O[t],n=D.querySelector(e);if(E[t]=e,!n||!n.nodeName)return void(M&&console.warn("Can't find",O[t]));O[t]=n}}),!(O.container.children.length<1)){var k=O.responsive,R=O.nested,I="carousel"===O.mode;if(k){0 in k&&(O=Hi(O,k[0]),delete k[0]);var A={};for(var N in k){var L=k[N];L="number"==typeof L?{items:L}:L,A[N]=L}k=A,A=null}if(I||function t(e){for(var n in e)I||("slideBy"===n&&(e[n]="page"),"edgePadding"===n&&(e[n]=!1),"autoHeight"===n&&(e[n]=!1)),"responsive"===n&&t(e[n])}(O),!I){O.axis="horizontal",O.slideBy="page",O.edgePadding=!1;var P=O.animateIn,z=O.animateOut,B=O.animateDelay,W=O.animateNormal}var S,F,q="horizontal"===O.axis,j=D.createElement("div"),V=D.createElement("div"),G=O.container,Q=G.parentNode,X=G.outerHTML,Y=G.children,K=Y.length,J=sn(),U=!1;k&&Bn(),I&&(G.className+=" tns-vpfix");var _,Z,$,tt,et,nt,it,at,rt=O.autoWidth,ot=vn("fixedWidth"),ut=vn("edgePadding"),lt=vn("gutter"),st=fn(),ct=vn("center"),ft=rt?1:Math.floor(vn("items")),dt=vn("slideBy"),vt=O.viewportMax||O.fixedWidthViewportWidth,pt=vn("arrowKeys"),mt=vn("speed"),ht=O.rewind,yt=!ht&&O.loop,gt=vn("autoHeight"),xt=vn("controls"),bt=vn("controlsText"),Ct=vn("nav"),wt=vn("touch"),Mt=vn("mouseDrag"),Tt=vn("autoplay"),Et=vn("autoplayTimeout"),At=vn("autoplayText"),Nt=vn("autoplayHoverPause"),Lt=vn("autoplayResetOnVisibility"),Bt=(at=document.createElement("style"),it&&at.setAttribute("media",it),document.querySelector("head").appendChild(at),at.sheet?at.sheet:at.styleSheet),St=O.lazyload,Ot=(O.lazyloadSelector,[]),Dt=yt?(et=function(){{if(rt||ot&&!vt)return K-1;var t=ot?"fixedWidth":"items",e=[];if((ot||O[t]<K)&&e.push(O[t]),k)for(var n in k){var i=k[n][t];i&&(ot||i<K)&&e.push(i)}return e.length||e.push(0),Math.ceil(ot?vt/Math.min.apply(null,e):Math.max.apply(null,e))}}(),nt=I?Math.ceil((5*et-K)/2):4*et-K,nt=Math.max(et,nt),dn("edgePadding")?nt+1:nt):0,Ht=I?K+2*Dt:K+Dt,kt=!(!ot&&!rt||yt),Rt=ot?ni():null,It=!I||!yt,Pt=q?"left":"top",zt="",Wt="",Ft=ot?function(){return ct&&!yt?K-1:Math.ceil(-Rt/(ot+lt))}:rt?function(){for(var t=Ht;t--;)if(_[t]>=-Rt)return t}:function(){return ct&&I&&!yt?K-1:yt||I?Math.max(0,Ht-Math.ceil(ft)):Ht-1},qt=on(vn("startIndex")),jt=qt,Vt=(rn(),0),Gt=rt?null:Ft(),Qt=O.preventActionWhenRunning,Xt=O.swipeAngle,Yt=!Xt||"?",Kt=!1,Jt=O.onInit,Ut=new ia,_t=" tns-slider tns-"+O.mode,Zt=G.id||(tt=window.tnsId,window.tnsId=tt?tt+1:1,"tns"+window.tnsId),$t=vn("disable"),te=!1,ee=O.freezable,ne=!(!ee||rt)&&Ln(),ie=!1,ae={click:fi,keydown:function(t){t=xi(t);var e=[a.LEFT,a.RIGHT].indexOf(t.keyCode);0<=e&&(0===e?Ee.disabled||fi(t,-1):Ae.disabled||fi(t,1))}},re={click:function(t){if(Kt){if(Qt)return;si()}var e=bi(t=xi(t));for(;e!==Se&&!Qi(e,"data-nav");)e=e.parentNode;if(Qi(e,"data-nav")){var n=ke=Number(Xi(e,"data-nav")),i=ot||rt?n*K/De:n*ft,a=ve?n:Math.min(Math.ceil(i),K-1);ci(a,t),Re===n&&(qe&&hi(),ke=-1)}},keydown:function(t){t=xi(t);var e=D.activeElement;if(!Qi(e,"data-nav"))return;var n=[a.LEFT,a.RIGHT,a.ENTER,a.SPACE].indexOf(t.keyCode),i=Number(Xi(e,"data-nav"));0<=n&&(0===n?0<i&&gi(Be[i-1]):1===n?i<De-1&&gi(Be[i+1]):ci(ke=i,t))}},oe={mouseover:function(){qe&&(vi(),je=!0)},mouseout:function(){je&&(di(),je=!1)}},ue={visibilitychange:function(){D.hidden?qe&&(vi(),Ge=!0):Ge&&(di(),Ge=!1)}},le={keydown:function(t){t=xi(t);var e=[a.LEFT,a.RIGHT].indexOf(t.keyCode);0<=e&&fi(t,0===e?-1:1)}},se={touchstart:Ti,touchmove:Ei,touchend:Ai,touchcancel:Ai},ce={mousedown:Ti,mousemove:Ei,mouseup:Ai,mouseleave:Ai},fe=dn("controls"),de=dn("nav"),ve=!!rt||O.navAsThumbnails,pe=dn("autoplay"),me=dn("touch"),he=dn("mouseDrag"),ye="tns-slide-active",ge="tns-complete",xe={load:function(t){zn(bi(t))},error:function(t){e=bi(t),Vi(e,"failed"),Wn(e);var e}},be="force"===O.preventScrollOnTouch;if(fe)var Ce,we,Me=O.controlsContainer,Te=O.controlsContainer?O.controlsContainer.outerHTML:"",Ee=O.prevButton,Ae=O.nextButton,Ne=O.prevButton?O.prevButton.outerHTML:"",Le=O.nextButton?O.nextButton.outerHTML:"";if(de)var Be,Se=O.navContainer,Oe=O.navContainer?O.navContainer.outerHTML:"",De=rt?K:Li(),He=0,ke=-1,Re=ln(),Ie=Re,Pe="tns-nav-active",ze="Carousel Page ",We=" (Current Slide)";if(pe)var Fe,qe,je,Ve,Ge,Qe="forward"===O.autoplayDirection?1:-1,Xe=O.autoplayButton,Ye=O.autoplayButton?O.autoplayButton.outerHTML:"",Ke=["<span class='tns-visually-hidden'>"," animation</span>"];if(me||he)var Je,Ue,_e={},Ze={},$e=!1,tn=q?function(t,e){return t.x-e.x}:function(t,e){return t.y-e.y};rt||an($t||ne),d&&(Pt=d,zt="translate",v?(zt+=q?"3d(":"3d(0px, ",Wt=q?", 0px, 0px)":", 0px)"):(zt+=q?"X(":"Y(",Wt=")")),I&&(G.className=G.className.replace("tns-vpfix","")),function(){dn("gutter");j.className="tns-outer",V.className="tns-inner",j.id=Zt+"-ow",V.id=Zt+"-iw",""===G.id&&(G.id=Zt);_t+=g||rt?" tns-subpixel":" tns-no-subpixel",_t+=y?" tns-calc":" tns-no-calc",rt&&(_t+=" tns-autowidth");_t+=" tns-"+O.axis,G.className+=_t,I?((S=D.createElement("div")).id=Zt+"-mw",S.className="tns-ovh",j.appendChild(S),S.appendChild(V)):j.appendChild(V);if(gt){var t=S||V;t.className+=" tns-ah"}if(Q.insertBefore(j,G),V.appendChild(G),qi(Y,function(t,e){Vi(t,"tns-item"),t.id||(t.id=Zt+"-item"+e),!I&&W&&Vi(t,W),Yi(t,{"aria-hidden":"true",tabindex:"-1"})}),Dt){for(var e=D.createDocumentFragment(),n=D.createDocumentFragment(),i=Dt;i--;){var a=i%K,r=Y[a].cloneNode(!0);if(Ki(r,"id"),n.insertBefore(r,n.firstChild),I){var o=Y[K-1-a].cloneNode(!0);Ki(o,"id"),e.appendChild(o)}}G.insertBefore(e,G.firstChild),G.appendChild(n),Y=G.children}}(),function(){if(!I)for(var t=qt,e=qt+Math.min(K,ft);t<e;t++){var n=Y[t];n.style.left=100*(t-qt)/ft+"%",Vi(n,P),Gi(n,W)}q&&(g||rt?(Wi(Bt,"#"+Zt+" > .tns-item","font-size:"+h.getComputedStyle(Y[0]).fontSize+";",Fi(Bt)),Wi(Bt,"#"+Zt,"font-size:0;",Fi(Bt))):I&&qi(Y,function(t,e){var n;t.style.marginLeft=(n=e,y?y+"("+100*n+"% / "+Ht+")":100*n/Ht+"%")}));if(H){if(x){var i=S&&O.autoHeight?xn(O.speed):"";Wi(Bt,"#"+Zt+"-mw",i,Fi(Bt))}i=pn(O.edgePadding,O.gutter,O.fixedWidth,O.speed,O.autoHeight),Wi(Bt,"#"+Zt+"-iw",i,Fi(Bt)),I&&(i=q&&!rt?"width:"+mn(O.fixedWidth,O.gutter,O.items)+";":"",x&&(i+=xn(mt)),Wi(Bt,"#"+Zt,i,Fi(Bt))),i=q&&!rt?hn(O.fixedWidth,O.gutter,O.items):"",O.gutter&&(i+=yn(O.gutter)),I||(x&&(i+=xn(mt)),b&&(i+=bn(mt))),i&&Wi(Bt,"#"+Zt+" > .tns-item",i,Fi(Bt))}else{Gn(),V.style.cssText=pn(ut,lt,ot,gt),I&&q&&!rt&&(G.style.width=mn(ot,lt,ft));var i=q&&!rt?hn(ot,lt,ft):"";lt&&(i+=yn(lt)),i&&Wi(Bt,"#"+Zt+" > .tns-item",i,Fi(Bt))}if(k&&H)for(var a in k){a=parseInt(a);var r=k[a],i="",o="",u="",l="",s="",c=rt?null:vn("items",a),f=vn("fixedWidth",a),d=vn("speed",a),v=vn("edgePadding",a),p=vn("autoHeight",a),m=vn("gutter",a);x&&S&&vn("autoHeight",a)&&"speed"in r&&(o="#"+Zt+"-mw{"+xn(d)+"}"),("edgePadding"in r||"gutter"in r)&&(u="#"+Zt+"-iw{"+pn(v,m,f,d,p)+"}"),I&&q&&!rt&&("fixedWidth"in r||"items"in r||ot&&"gutter"in r)&&(l="width:"+mn(f,m,c)+";"),x&&"speed"in r&&(l+=xn(d)),l&&(l="#"+Zt+"{"+l+"}"),("fixedWidth"in r||ot&&"gutter"in r||!I&&"items"in r)&&(s+=hn(f,m,c)),"gutter"in r&&(s+=yn(m)),!I&&"speed"in r&&(x&&(s+=xn(d)),b&&(s+=bn(d))),s&&(s="#"+Zt+" > .tns-item{"+s+"}"),(i=o+u+l+s)&&Bt.insertRule("@media (min-width: "+a/16+"em) {"+i+"}",Bt.cssRules.length)}}(),Cn();var en=yt?I?function(){var t=Vt,e=Gt;t+=dt,e-=dt,ut?(t+=1,e-=1):ot&&(st+lt)%(ot+lt)&&(e-=1),Dt&&(e<qt?qt-=K:qt<t&&(qt+=K))}:function(){if(Gt<qt)for(;Vt+K<=qt;)qt-=K;else if(qt<Vt)for(;qt<=Gt-K;)qt+=K}:function(){qt=Math.max(Vt,Math.min(Gt,qt))},nn=I?function(){var e,n,i,a,t,r,o,u,l,s,c;ti(G,""),x||!mt?(ri(),mt&&Zi(G)||si()):(e=G,n=Pt,i=zt,a=Wt,t=ii(),r=mt,o=si,u=Math.min(r,10),l=0<=t.indexOf("%")?"%":"px",t=t.replace(l,""),s=Number(e.style[n].replace(i,"").replace(a,"").replace(l,"")),c=(t-s)/r*u,setTimeout(function t(){r-=u,s+=c,e.style[n]=i+s+l+a,0<r?setTimeout(t,u):o()},u)),q||Ni()}:function(){Ot=[];var t={};t[C]=t[w]=si,na(Y[jt],t),ea(Y[qt],t),oi(jt,P,z,!0),oi(qt,W,P),C&&w&&mt&&Zi(G)||si()};return{version:"2.9.2",getInfo:Si,events:Ut,goTo:ci,play:function(){Tt&&!qe&&(mi(),Ve=!1)},pause:function(){qe&&(hi(),Ve=!0)},isOn:U,updateSliderHeight:Xn,refresh:Cn,destroy:function(){if(Bt.disabled=!0,Bt.ownerNode&&Bt.ownerNode.remove(),na(h,{resize:An}),pt&&na(D,le),Me&&na(Me,ae),Se&&na(Se,re),na(G,oe),na(G,ue),Xe&&na(Xe,{click:yi}),Tt&&clearInterval(Fe),I&&C){var t={};t[C]=si,na(G,t)}wt&&na(G,se),Mt&&na(G,ce);var r=[X,Te,Ne,Le,Oe,Ye];for(var e in T.forEach(function(t,e){var n="container"===t?j:O[t];if("object"==typeof n){var i=!!n.previousElementSibling&&n.previousElementSibling,a=n.parentNode;n.outerHTML=r[e],O[t]=i?i.nextElementSibling:a.firstElementChild}}),T=P=z=B=W=q=j=V=G=Q=X=Y=K=F=J=rt=ot=ut=lt=st=ft=dt=vt=pt=mt=ht=yt=gt=Bt=St=_=Ot=Dt=Ht=kt=Rt=It=Pt=zt=Wt=Ft=qt=jt=Vt=Gt=Xt=Yt=Kt=Jt=Ut=_t=Zt=$t=te=ee=ne=ie=ae=re=oe=ue=le=se=ce=fe=de=ve=pe=me=he=ye=ge=xe=Z=xt=bt=Me=Te=Ee=Ae=Ce=we=Ct=Se=Oe=Be=De=He=ke=Re=Ie=Pe=ze=We=Tt=Et=Qe=At=Nt=Xe=Ye=Lt=Ke=Fe=qe=je=Ve=Ge=_e=Ze=Je=$e=Ue=tn=wt=Mt=null,this)"rebuild"!==e&&(this[e]=null);U=!1},rebuild:function(){return aa(Hi(O,E))}}}function an(t){t&&(xt=Ct=wt=Mt=pt=Tt=Nt=Lt=!1)}function rn(){for(var t=I?qt-Dt:qt;t<0;)t+=K;return t%K+1}function on(t){return t=t?Math.max(0,Math.min(yt?K-1:K-ft,t)):0,I?t+Dt:t}function un(t){for(null==t&&(t=qt),I&&(t-=Dt);t<0;)t+=K;return Math.floor(t%K)}function ln(){var t,e=un();return t=ve?e:ot||rt?Math.ceil((e+1)*De/K-1):Math.floor(e/ft),!yt&&I&&qt===Gt&&(t=De-1),t}function sn(){return h.innerWidth||D.documentElement.clientWidth||D.body.clientWidth}function cn(t){return"top"===t?"afterbegin":"beforeend"}function fn(){var t=ut?2*ut-lt:0;return function t(e){var n,i,a=D.createElement("div");return e.appendChild(a),i=(n=a.getBoundingClientRect()).right-n.left,a.remove(),i||t(e.parentNode)}(Q)-t}function dn(t){if(O[t])return!0;if(k)for(var e in k)if(k[e][t])return!0;return!1}function vn(t,e){if(null==e&&(e=J),"items"===t&&ot)return Math.floor((st+lt)/(ot+lt))||1;var n=O[t];if(k)for(var i in k)e>=parseInt(i)&&t in k[i]&&(n=k[i][t]);return"slideBy"===t&&"page"===n&&(n=vn("items")),I||"slideBy"!==t&&"items"!==t||(n=Math.floor(n)),n}function pn(t,e,n,i,a){var r="";if(void 0!==t){var o=t;e&&(o-=e),r=q?"margin: 0 "+o+"px 0 "+t+"px;":"margin: "+t+"px 0 "+o+"px 0;"}else if(e&&!n){var u="-"+e+"px";r="margin: 0 "+(q?u+" 0 0":"0 "+u+" 0")+";"}return!I&&a&&x&&i&&(r+=xn(i)),r}function mn(t,e,n){return t?(t+e)*Ht+"px":y?y+"("+100*Ht+"% / "+n+")":100*Ht/n+"%"}function hn(t,e,n){var i;if(t)i=t+e+"px";else{I||(n=Math.floor(n));var a=I?Ht:n;i=y?y+"(100% / "+a+")":100/a+"%"}return i="width:"+i,"inner"!==R?i+";":i+" !important;"}function yn(t){var e="";!1!==t&&(e=(q?"padding-":"margin-")+(q?"right":"bottom")+": "+t+"px;");return e}function gn(t,e){var n=t.substring(0,t.length-e).toLowerCase();return n&&(n="-"+n+"-"),n}function xn(t){return gn(x,18)+"transition-duration:"+t/1e3+"s;"}function bn(t){return gn(b,17)+"animation-duration:"+t/1e3+"s;"}function Cn(){if(dn("autoHeight")||rt||!q){var t=G.querySelectorAll("img");qi(t,function(t){var e=t.src;e&&e.indexOf("data:image")<0?(ea(t,xe),t.src="",t.src=e,Vi(t,"loading")):St||zn(t)}),Oi(function(){jn(Ji(t),function(){Z=!0})}),!rt&&q&&(t=Fn(qt,Math.min(qt+ft-1,Ht-1))),St?wn():Oi(function(){jn(Ji(t),wn)})}else I&&ai(),Tn(),En()}function wn(){if(rt){var e=yt?qt:K-1;!function t(){Y[e-1].getBoundingClientRect().right.toFixed(2)===Y[e].getBoundingClientRect().left.toFixed(2)?Mn():setTimeout(function(){t()},16)}()}else Mn()}function Mn(){q&&!rt||(Yn(),rt?(Rt=ni(),ee&&(ne=Ln()),Gt=Ft(),an($t||ne)):Ni()),I&&ai(),Tn(),En()}function Tn(){if(Kn(),j.insertAdjacentHTML("afterbegin",'<div class="tns-liveregion tns-visually-hidden" aria-live="polite" aria-atomic="true">slide <span class="current">'+Rn()+"</span>  of "+K+"</div>"),$=j.querySelector(".tns-liveregion .current"),pe){var t=Tt?"stop":"start";Xe?Yi(Xe,{"data-action":t}):O.autoplayButtonOutput&&(j.insertAdjacentHTML(cn(O.autoplayPosition),'<button data-action="'+t+'">'+Ke[0]+t+Ke[1]+At[0]+"</button>"),Xe=j.querySelector("[data-action]")),Xe&&ea(Xe,{click:yi}),Tt&&(mi(),Nt&&ea(G,oe),Lt&&ea(G,ue))}if(de){if(Se)Yi(Se,{"aria-label":"Carousel Pagination"}),qi(Be=Se.children,function(t,e){Yi(t,{"data-nav":e,tabindex:"-1","aria-label":ze+(e+1),"aria-controls":Zt})});else{for(var e="",n=ve?"":'style="display:none"',i=0;i<K;i++)e+='<button data-nav="'+i+'" tabindex="-1" aria-controls="'+Zt+'" '+n+' aria-label="'+ze+(i+1)+'"></button>';e='<div class="tns-nav" aria-label="Carousel Pagination">'+e+"</div>",j.insertAdjacentHTML(cn(O.navPosition),e),Se=j.querySelector(".tns-nav"),Be=Se.children}if(Bi(),x){var a=x.substring(0,x.length-18).toLowerCase(),r="transition: all "+mt/1e3+"s";a&&(r="-"+a+"-"+r),Wi(Bt,"[aria-controls^="+Zt+"-item]",r,Fi(Bt))}Yi(Be[Re],{"aria-label":ze+(Re+1)+We}),Ki(Be[Re],"tabindex"),Vi(Be[Re],Pe),ea(Se,re)}fe&&(Me||Ee&&Ae||(j.insertAdjacentHTML(cn(O.controlsPosition),'<div class="tns-controls" aria-label="Carousel Navigation" tabindex="0"><button data-controls="prev" tabindex="-1" aria-controls="'+Zt+'">'+bt[0]+'</button><button data-controls="next" tabindex="-1" aria-controls="'+Zt+'">'+bt[1]+"</button></div>"),Me=j.querySelector(".tns-controls")),Ee&&Ae||(Ee=Me.children[0],Ae=Me.children[1]),O.controlsContainer&&Yi(Me,{"aria-label":"Carousel Navigation",tabindex:"0"}),(O.controlsContainer||O.prevButton&&O.nextButton)&&Yi([Ee,Ae],{"aria-controls":Zt,tabindex:"-1"}),(O.controlsContainer||O.prevButton&&O.nextButton)&&(Yi(Ee,{"data-controls":"prev"}),Yi(Ae,{"data-controls":"next"})),Ce=Un(Ee),we=Un(Ae),$n(),Me?ea(Me,ae):(ea(Ee,ae),ea(Ae,ae))),Sn()}function En(){if(I&&C){var t={};t[C]=si,ea(G,t)}wt&&ea(G,se,O.preventScrollOnTouch),Mt&&ea(G,ce),pt&&ea(D,le),"inner"===R?Ut.on("outerResized",function(){Nn(),Ut.emit("innerLoaded",Si())}):(k||ot||rt||gt||!q)&&ea(h,{resize:An}),gt&&("outer"===R?Ut.on("innerLoaded",qn):$t||qn()),Pn(),$t?Hn():ne&&Dn(),Ut.on("indexChanged",Vn),"inner"===R&&Ut.emit("innerLoaded",Si()),"function"==typeof Jt&&Jt(Si()),U=!0}function An(t){Oi(function(){Nn(xi(t))})}function Nn(t){if(U){"outer"===R&&Ut.emit("outerResized",Si(t)),J=sn();var e,n=F,i=!1;k&&(Bn(),(e=n!==F)&&Ut.emit("newBreakpointStart",Si(t)));var a,r,o,u,l=ft,s=$t,c=ne,f=pt,d=xt,v=Ct,p=wt,m=Mt,h=Tt,y=Nt,g=Lt,x=qt;if(e){var b=ot,C=gt,w=bt,M=ct,T=At;if(!H)var E=lt,A=ut}if(pt=vn("arrowKeys"),xt=vn("controls"),Ct=vn("nav"),wt=vn("touch"),ct=vn("center"),Mt=vn("mouseDrag"),Tt=vn("autoplay"),Nt=vn("autoplayHoverPause"),Lt=vn("autoplayResetOnVisibility"),e&&($t=vn("disable"),ot=vn("fixedWidth"),mt=vn("speed"),gt=vn("autoHeight"),bt=vn("controlsText"),At=vn("autoplayText"),Et=vn("autoplayTimeout"),H||(ut=vn("edgePadding"),lt=vn("gutter"))),an($t),st=fn(),q&&!rt||$t||(Yn(),q||(Ni(),i=!0)),(ot||rt)&&(Rt=ni(),Gt=Ft()),(e||ot)&&(ft=vn("items"),dt=vn("slideBy"),(r=ft!==l)&&(ot||rt||(Gt=Ft()),en())),e&&$t!==s&&($t?Hn():function(){if(!te)return;if(Bt.disabled=!1,G.className+=_t,ai(),yt)for(var t=Dt;t--;)I&&_i(Y[t]),_i(Y[Ht-t-1]);if(!I)for(var e=qt,n=qt+K;e<n;e++){var i=Y[e],a=e<qt+ft?P:W;i.style.left=100*(e-qt)/ft+"%",Vi(i,a)}On(),te=!1}()),ee&&(e||ot||rt)&&(ne=Ln())!==c&&(ne?(ri(ii(on(0))),Dn()):(!function(){if(!ie)return;ut&&H&&(V.style.margin="");if(Dt)for(var t="tns-transparent",e=Dt;e--;)I&&Gi(Y[e],t),Gi(Y[Ht-e-1],t);On(),ie=!1}(),i=!0)),an($t||ne),Tt||(Nt=Lt=!1),pt!==f&&(pt?ea(D,le):na(D,le)),xt!==d&&(xt?Me?_i(Me):(Ee&&_i(Ee),Ae&&_i(Ae)):Me?Ui(Me):(Ee&&Ui(Ee),Ae&&Ui(Ae))),Ct!==v&&(Ct?_i(Se):Ui(Se)),wt!==p&&(wt?ea(G,se,O.preventScrollOnTouch):na(G,se)),Mt!==m&&(Mt?ea(G,ce):na(G,ce)),Tt!==h&&(Tt?(Xe&&_i(Xe),qe||Ve||mi()):(Xe&&Ui(Xe),qe&&hi())),Nt!==y&&(Nt?ea(G,oe):na(G,oe)),Lt!==g&&(Lt?ea(D,ue):na(D,ue)),e){if(ot===b&&ct===M||(i=!0),gt!==C&&(gt||(V.style.height="")),xt&&bt!==w&&(Ee.innerHTML=bt[0],Ae.innerHTML=bt[1]),Xe&&At!==T){var N=Tt?1:0,L=Xe.innerHTML,B=L.length-T[N].length;L.substring(B)===T[N]&&(Xe.innerHTML=L.substring(0,B)+At[N])}}else ct&&(ot||rt)&&(i=!0);if((r||ot&&!rt)&&(De=Li(),Bi()),(a=qt!==x)?(Ut.emit("indexChanged",Si()),i=!0):r?a||Vn():(ot||rt)&&(Pn(),Kn(),kn()),r&&!I&&function(){for(var t=qt+Math.min(K,ft),e=Ht;e--;){var n=Y[e];qt<=e&&e<t?(Vi(n,"tns-moving"),n.style.left=100*(e-qt)/ft+"%",Vi(n,P),Gi(n,W)):n.style.left&&(n.style.left="",Vi(n,W),Gi(n,P)),Gi(n,z)}setTimeout(function(){qi(Y,function(t){Gi(t,"tns-moving")})},300)}(),!$t&&!ne){if(e&&!H&&(gt===autoheightTem&&mt===speedTem||Gn(),ut===A&&lt===E||(V.style.cssText=pn(ut,lt,ot,mt,gt)),q)){I&&(G.style.width=mn(ot,lt,ft));var S=hn(ot,lt,ft)+yn(lt);u=Fi(o=Bt)-1,"deleteRule"in o?o.deleteRule(u):o.removeRule(u),Wi(Bt,"#"+Zt+" > .tns-item",S,Fi(Bt))}gt&&qn(),i&&(ai(),jt=qt)}e&&Ut.emit("newBreakpointEnd",Si(t))}}function Ln(){if(!ot&&!rt)return K<=(ct?ft-(ft-1)/2:ft);var t=ot?(ot+lt)*K:_[K],e=ut?st+2*ut:st+lt;return ct&&(e-=ot?(st-ot)/2:(st-(_[qt+1]-_[qt]-lt))/2),t<=e}function Bn(){for(var t in F=0,k)(t=parseInt(t))<=J&&(F=t)}function Sn(){!Tt&&Xe&&Ui(Xe),!Ct&&Se&&Ui(Se),xt||(Me?Ui(Me):(Ee&&Ui(Ee),Ae&&Ui(Ae)))}function On(){Tt&&Xe&&_i(Xe),Ct&&Se&&_i(Se),xt&&(Me?_i(Me):(Ee&&_i(Ee),Ae&&_i(Ae)))}function Dn(){if(!ie){if(ut&&(V.style.margin="0px"),Dt)for(var t="tns-transparent",e=Dt;e--;)I&&Vi(Y[e],t),Vi(Y[Ht-e-1],t);Sn(),ie=!0}}function Hn(){if(!te){if(Bt.disabled=!0,G.className=G.className.replace(_t.substring(1),""),Ki(G,["style"]),yt)for(var t=Dt;t--;)I&&Ui(Y[t]),Ui(Y[Ht-t-1]);if(q&&I||Ki(V,["style"]),!I)for(var e=qt,n=qt+K;e<n;e++){var i=Y[e];Ki(i,["style"]),Gi(i,P),Gi(i,W)}Sn(),te=!0}}function kn(){var t=Rn();$.innerHTML!==t&&($.innerHTML=t)}function Rn(){var t=In(),e=t[0]+1,n=t[1]+1;return e===n?e+"":e+" to "+n}function In(t){null==t&&(t=ii());var n,i,a,r=qt;if(ct||ut?(rt||ot)&&(i=-(parseFloat(t)+ut),a=i+st+2*ut):rt&&(i=_[qt],a=i+st),rt)_.forEach(function(t,e){e<Ht&&((ct||ut)&&t<=i+.5&&(r=e),.5<=a-t&&(n=e))});else{if(ot){var e=ot+lt;ct||ut?(r=Math.floor(i/e),n=Math.ceil(a/e-1)):n=r+Math.ceil(st/e)-1}else if(ct||ut){var o=ft-1;if(ct?(r-=o/2,n=qt+o/2):n=qt+o,ut){var u=ut*ft/st;r-=u,n+=u}r=Math.floor(r),n=Math.ceil(n)}else n=r+ft-1;r=Math.max(r,0),n=Math.min(n,Ht-1)}return[r,n]}function Pn(){St&&!$t&&Fn.apply(null,In()).forEach(function(t){if(!ji(t,ge)){var e={};e[C]=function(t){t.stopPropagation()},ea(t,e),ea(t,xe),t.src=Xi(t,"data-src");var n=Xi(t,"data-srcset");n&&(t.srcset=n),Vi(t,"loading")}})}function zn(t){Vi(t,"loaded"),Wn(t)}function Wn(t){Vi(t,"tns-complete"),Gi(t,"loading"),na(t,xe)}function Fn(t,e){for(var n=[];t<=e;)qi(Y[t].querySelectorAll("img"),function(t){n.push(t)}),t++;return n}function qn(){var t=Fn.apply(null,In());Oi(function(){jn(t,Xn)})}function jn(n,t){return Z?t():(n.forEach(function(t,e){ji(t,ge)&&n.splice(e,1)}),n.length?void Oi(function(){jn(n,t)}):t())}function Vn(){Pn(),Kn(),kn(),$n(),function(){if(Ct&&(Re=0<=ke?ke:ln(),ke=-1,Re!==Ie)){var t=Be[Ie],e=Be[Re];Yi(t,{tabindex:"-1","aria-label":ze+(Ie+1)}),Gi(t,Pe),Yi(e,{"aria-label":ze+(Re+1)+We}),Ki(e,"tabindex"),Vi(e,Pe),Ie=Re}}()}function Gn(){I&&gt&&(S.style[x]=mt/1e3+"s")}function Qn(t,e){for(var n=[],i=t,a=Math.min(t+e,Ht);i<a;i++)n.push(Y[i].offsetHeight);return Math.max.apply(null,n)}function Xn(){var t=gt?Qn(qt,ft):Qn(Dt,K),e=S||V;e.style.height!==t&&(e.style.height=t+"px")}function Yn(){_=[0];var n=q?"left":"top",i=q?"right":"bottom",a=Y[0].getBoundingClientRect()[n];qi(Y,function(t,e){e&&_.push(t.getBoundingClientRect()[n]-a),e===Ht-1&&_.push(t.getBoundingClientRect()[i]-a)})}function Kn(){var t=In(),n=t[0],i=t[1];qi(Y,function(t,e){n<=e&&e<=i?Qi(t,"aria-hidden")&&(Ki(t,["aria-hidden","tabindex"]),Vi(t,ye)):Qi(t,"aria-hidden")||(Yi(t,{"aria-hidden":"true",tabindex:"-1"}),Gi(t,ye))})}function Jn(t){return t.nodeName.toLowerCase()}function Un(t){return"button"===Jn(t)}function _n(t){return"true"===t.getAttribute("aria-disabled")}function Zn(t,e,n){t?e.disabled=n:e.setAttribute("aria-disabled",n.toString())}function $n(){if(xt&&!ht&&!yt){var t=Ce?Ee.disabled:_n(Ee),e=we?Ae.disabled:_n(Ae),n=qt<=Vt,i=!ht&&Gt<=qt;n&&!t&&Zn(Ce,Ee,!0),!n&&t&&Zn(Ce,Ee,!1),i&&!e&&Zn(we,Ae,!0),!i&&e&&Zn(we,Ae,!1)}}function ti(t,e){x&&(t.style[x]=e)}function ei(t){return null==t&&(t=qt),rt?(st-(ut?lt:0)-(_[t+1]-_[t]-lt))/2:ot?(st-ot)/2:(ft-1)/2}function ni(){var t=st+(ut?lt:0)-(ot?(ot+lt)*Ht:_[Ht]);return ct&&!yt&&(t=ot?-(ot+lt)*(Ht-1)-ei():ei(Ht-1)-_[Ht-1]),0<t&&(t=0),t}function ii(t){var e;if(null==t&&(t=qt),q&&!rt)if(ot)e=-(ot+lt)*t,ct&&(e+=ei());else{var n=d?Ht:ft;ct&&(t-=ei()),e=100*-t/n}else e=-_[t],ct&&rt&&(e+=ei());return kt&&(e=Math.max(e,Rt)),e+=!q||rt||ot?"px":"%"}function ai(t){ti(G,"0s"),ri(t)}function ri(t){null==t&&(t=ii()),G.style[Pt]=zt+t+Wt}function oi(t,e,n,i){var a=t+ft;yt||(a=Math.min(a,Ht));for(var r=t;r<a;r++){var o=Y[r];i||(o.style.left=100*(r-qt)/ft+"%"),B&&p&&(o.style[p]=o.style[m]=B*(r-t)/1e3+"s"),Gi(o,e),Vi(o,n),i&&Ot.push(o)}}function ui(t,e){It&&en(),(qt!==jt||e)&&(Ut.emit("indexChanged",Si()),Ut.emit("transitionStart",Si()),gt&&qn(),qe&&t&&0<=["click","keydown"].indexOf(t.type)&&hi(),Kt=!0,nn())}function li(t){return t.toLowerCase().replace(/-/g,"")}function si(t){if(I||Kt){if(Ut.emit("transitionEnd",Si(t)),!I&&0<Ot.length)for(var e=0;e<Ot.length;e++){var n=Ot[e];n.style.left="",m&&p&&(n.style[m]="",n.style[p]=""),Gi(n,z),Vi(n,W)}if(!t||!I&&t.target.parentNode===G||t.target===G&&li(t.propertyName)===li(Pt)){if(!It){var i=qt;en(),qt!==i&&(Ut.emit("indexChanged",Si()),ai())}"inner"===R&&Ut.emit("innerLoaded",Si()),Kt=!1,jt=qt}}}function ci(t,e){if(!ne)if("prev"===t)fi(e,-1);else if("next"===t)fi(e,1);else{if(Kt){if(Qt)return;si()}var n=un(),i=0;if("first"===t?i=-n:"last"===t?i=I?K-ft-n:K-1-n:("number"!=typeof t&&(t=parseInt(t)),isNaN(t)||(e||(t=Math.max(0,Math.min(K-1,t))),i=t-n)),!I&&i&&Math.abs(i)<ft){var a=0<i?1:-1;i+=Vt<=qt+i-K?K*a:2*K*a*-1}qt+=i,I&&yt&&(qt<Vt&&(qt+=K),Gt<qt&&(qt-=K)),un(qt)!==un(jt)&&ui(e)}}function fi(t,e){if(Kt){if(Qt)return;si()}var n;if(!e){for(var i=bi(t=xi(t));i!==Me&&[Ee,Ae].indexOf(i)<0;)i=i.parentNode;var a=[Ee,Ae].indexOf(i);0<=a&&(n=!0,e=0===a?-1:1)}if(ht){if(qt===Vt&&-1===e)return void ci("last",t);if(qt===Gt&&1===e)return void ci("first",t)}e&&(qt+=dt*e,rt&&(qt=Math.floor(qt)),ui(n||t&&"keydown"===t.type?t:null))}function di(){Fe=setInterval(function(){fi(null,Qe)},Et),qe=!0}function vi(){clearInterval(Fe),qe=!1}function pi(t,e){Yi(Xe,{"data-action":t}),Xe.innerHTML=Ke[0]+t+Ke[1]+e}function mi(){di(),Xe&&pi("stop",At[1])}function hi(){vi(),Xe&&pi("start",At[0])}function yi(){qe?(hi(),Ve=!0):(mi(),Ve=!1)}function gi(t){t.focus()}function xi(t){return Ci(t=t||h.event)?t.changedTouches[0]:t}function bi(t){return t.target||h.event.srcElement}function Ci(t){return 0<=t.type.indexOf("touch")}function wi(t){t.preventDefault?t.preventDefault():t.returnValue=!1}function Mi(){return a=Ze.y-_e.y,r=Ze.x-_e.x,t=Math.atan2(a,r)*(180/Math.PI),e=Xt,n=!1,i=Math.abs(90-Math.abs(t)),90-e<=i?n="horizontal":i<=e&&(n="vertical"),n===O.axis;var t,e,n,i,a,r}function Ti(t){if(Kt){if(Qt)return;si()}Tt&&qe&&vi(),$e=!0,Ue&&(Di(Ue),Ue=null);var e=xi(t);Ut.emit(Ci(t)?"touchStart":"dragStart",Si(t)),!Ci(t)&&0<=["img","a"].indexOf(Jn(bi(t)))&&wi(t),Ze.x=_e.x=e.clientX,Ze.y=_e.y=e.clientY,I&&(Je=parseFloat(G.style[Pt].replace(zt,"")),ti(G,"0s"))}function Ei(t){if($e){var e=xi(t);Ze.x=e.clientX,Ze.y=e.clientY,I?Ue||(Ue=Oi(function(){!function t(e){if(!Yt)return void($e=!1);Di(Ue);$e&&(Ue=Oi(function(){t(e)}));"?"===Yt&&(Yt=Mi());if(Yt){!be&&Ci(e)&&(be=!0);try{e.type&&Ut.emit(Ci(e)?"touchMove":"dragMove",Si(e))}catch(t){}var n=Je,i=tn(Ze,_e);if(!q||ot||rt)n+=i,n+="px";else{var a=d?i*ft*100/((st+lt)*Ht):100*i/(st+lt);n+=a,n+="%"}G.style[Pt]=zt+n+Wt}}(t)})):("?"===Yt&&(Yt=Mi()),Yt&&(be=!0)),be&&t.preventDefault()}}function Ai(i){if($e){Ue&&(Di(Ue),Ue=null),I&&ti(G,""),$e=!1;var t=xi(i);Ze.x=t.clientX,Ze.y=t.clientY;var a=tn(Ze,_e);if(Math.abs(a)){if(!Ci(i)){var n=bi(i);ea(n,{click:function t(e){wi(e),na(n,{click:t})}})}I?Ue=Oi(function(){if(q&&!rt){var t=-a*ft/(st+lt);t=0<a?Math.floor(t):Math.ceil(t),qt+=t}else{var e=-(Je+a);if(e<=0)qt=Vt;else if(e>=_[Ht-1])qt=Gt;else for(var n=0;n<Ht&&e>=_[n];)e>_[qt=n]&&a<0&&(qt+=1),n++}ui(i,a),Ut.emit(Ci(i)?"touchEnd":"dragEnd",Si(i))}):Yt&&fi(i,0<a?-1:1)}}"auto"===O.preventScrollOnTouch&&(be=!1),Xt&&(Yt="?"),Tt&&!qe&&di()}function Ni(){(S||V).style.height=_[qt+ft]-_[qt]+"px"}function Li(){var t=ot?(ot+lt)*K/st:K/ft;return Math.min(Math.ceil(t),K)}function Bi(){if(Ct&&!ve&&De!==He){var t=He,e=De,n=_i;for(De<He&&(t=De,e=He,n=Ui);t<e;)n(Be[t]),t++;He=De}}function Si(t){return{container:G,slideItems:Y,navContainer:Se,navItems:Be,controlsContainer:Me,hasControls:fe,prevButton:Ee,nextButton:Ae,items:ft,slideBy:dt,cloneCount:Dt,slideCount:K,slideCountNew:Ht,index:qt,indexCached:jt,displayIndex:rn(),navCurrentIndex:Re,navCurrentIndexCached:Ie,pages:De,pagesCached:He,sheet:Bt,isOn:U,event:t||{}}}M&&console.warn("No slides found in",O.container)};return aa}();
Index: ews/js/vue-3.2.47.global.min.js
===================================================================
--- /views/js/vue-3.2.47.global.min.js	(revision 8528)
+++ 	(revision )
@@ -1,15 +1,0 @@
-var Vue=function(r){"use strict";function e(e,t){const n=Object.create(null);var r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}const x={[1]:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT","-1":"HOISTED","-2":"BAIL"},S={[1]:"STABLE",2:"DYNAMIC",3:"FORWARDED"};const i=e("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"),d=2;function a(t){if(ae(t)){const o={};for(let e=0;e<t.length;e++){var n=t[e],r=(ce(n)?k:a)(n);if(r)for(const i in r)o[i]=r[i]}return o}return ce(t)||re(t)?t:void 0}const u=/;(?![^(]*\))/g,p=/:([^]+)/,C=/\/\*.*?\*\//gs;function k(e){const n={};return e.replace(C,"").split(u).forEach(e=>{if(e){const t=e.split(p);1<t.length&&(n[t[0].trim()]=t[1].trim())}}),n}function T(t){let n="";if(ce(t))n=t;else if(ae(t))for(let e=0;e<t.length;e++){var r=T(t[e]);r&&(n+=r+" ")}else if(re(t))for(const e in t)t[e]&&(n+=e+" ");return n.trim()}const n=e("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),N=e("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view");var O=e("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr");const F=e("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function M(e){return!!e||""===e}function j(e,t){if(e===t)return!0;let n=Q(e),r=Q(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=pe(e),r=pe(t),n||r)return e===t;if(n=ae(e),r=ae(t),n||r)return!(!n||!r)&&function(t,n){if(t.length!==n.length)return!1;let r=!0;for(let e=0;r&&e<t.length;e++)r=j(t[e],n[e]);return r}(e,t);if(n=re(e),r=re(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e){var o=e.hasOwnProperty(s),i=t.hasOwnProperty(s);if(o&&!i||!o&&i||!j(e[s],t[s]))return!1}}return String(e)===String(t)}function V(e,t){return e.findIndex(e=>j(e,t))}const L=(e,t)=>t&&t.__v_isRef?L(e,t.value):Z(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n])=>(e[t+" =>"]=n,e),{})}:X(t)?{[`Set(${t.size})`]:[...t.values()]}:!re(t)||ae(t)||ve(t)?t:String(t),E=Object.freeze({}),le=Object.freeze([]),te=()=>{},z=()=>!1,W=/^on[^a-z]/,K=e=>W.test(e),G=e=>e.startsWith("onUpdate:"),$=Object.assign,J=(e,t)=>{t=e.indexOf(t);-1<t&&e.splice(t,1)},Y=Object.prototype.hasOwnProperty,A=(e,t)=>Y.call(e,t),ae=Array.isArray,Z=e=>"[object Map]"===fe(e),X=e=>"[object Set]"===fe(e),Q=e=>"[object Date]"===fe(e),ne=e=>"function"==typeof e,ce=e=>"string"==typeof e,pe=e=>"symbol"==typeof e,re=e=>null!==e&&"object"==typeof e,de=e=>re(e)&&ne(e.then)&&ne(e.catch),ee=Object.prototype.toString,fe=e=>ee.call(e),he=e=>fe(e).slice(8,-1),ve=e=>"[object Object]"===fe(e),me=e=>ce(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,ge=e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ye=e("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo");var be=t=>{const n=Object.create(null);return e=>{return n[e]||(n[e]=t(e))}};const _e=/-(\w)/g,R=be(e=>e.replace(_e,(e,t)=>t?t.toUpperCase():"")),we=/\B([A-Z])/g,v=be(e=>e.replace(we,"-$1").toLowerCase()),xe=be(e=>e.charAt(0).toUpperCase()+e.slice(1)),Se=be(e=>e?"on"+xe(e):""),Ce=(e,t)=>!Object.is(e,t),ke=(t,n)=>{for(let e=0;e<t.length;e++)t[e](n)},Te=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Ee=e=>{var t=parseFloat(e);return isNaN(t)?e:t},Ne=e=>{var t=ce(e)?Number(e):NaN;return isNaN(t)?e:t};let Oe;const $e=()=>Oe=Oe||("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{});function Ae(e,...t){console.warn("[Vue warn] "+e,...t)}let b;class Re{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=b,!e&&b&&(this.index=(b.scopes||(b.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){var t=b;try{return b=this,e()}finally{b=t}}else Ae("cannot run an inactive effect scope.")}on(){b=this}off(){b=this.parent}stop(n){if(this._active){let e,t;for(e=0,t=this.effects.length;e<t;e++)this.effects[e].stop();for(e=0,t=this.cleanups.length;e<t;e++)this.cleanups[e]();if(this.scopes)for(e=0,t=this.scopes.length;e<t;e++)this.scopes[e].stop(!0);if(!this.detached&&this.parent&&!n){const r=this.parent.scopes.pop();r&&r!==this&&((this.parent.scopes[this.index]=r).index=this.index)}this.parent=void 0,this._active=!1}}}function Ie(e,t=b){t&&t.active&&t.effects.push(e)}function Pe(){return b}const Fe=e=>{const t=new Set(e);return t.w=0,t.n=0,t},Me=e=>0<(e.w&Be),je=e=>0<(e.n&Be),Ve=new WeakMap;let Le=0,Be=1;const Ue=30;let s;const De=Symbol("iterate"),He=Symbol("Map key iterate");class ze{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,Ie(this,n)}run(){if(!this.active)return this.fn();let e=s;for(var t=Ke;e;){if(e===this)return;e=e.parent}try{if(this.parent=s,s=this,Ke=!0,Be=1<<++Le,Le<=Ue){var n=[this["deps"]][0];if(n.length)for(let e=0;e<n.length;e++)n[e].w|=Be}else We(this);return this.fn()}finally{if(Le<=Ue){var r=this;const o=r["deps"];if(o.length){let t=0;for(let e=0;e<o.length;e++){const i=o[e];Me(i)&&!je(i)?i.delete(r):o[t++]=i,i.w&=~Be,i.n&=~Be}o.length=t}}Be=1<<--Le,s=this.parent,Ke=t,this.parent=void 0,this.deferStop&&this.stop()}}stop(){s===this?this.deferStop=!0:this.active&&(We(this),this.onStop&&this.onStop(),this.active=!1)}}function We(t){const n=t["deps"];if(n.length){for(let e=0;e<n.length;e++)n[e].delete(t);n.length=0}}let Ke=!0;const Ge=[];function Je(){Ge.push(Ke),Ke=!1}function qe(){var e=Ge.pop();Ke=void 0===e||e}function f(n,r,o){if(Ke&&s){let e=Ve.get(n),t=(e||Ve.set(n,e=new Map),e.get(o));t||e.set(o,t=Fe());n={effect:s,target:n,type:r,key:o};Ye(t,n)}}function Ye(e,t){let n=!1;Le<=Ue?je(e)||(e.n|=Be,n=!Me(e)):n=!e.has(s),n&&(e.add(s),s.deps.push(e),s.onTrack&&s.onTrack(Object.assign({effect:s},t)))}function Ze(e,t,r,o,i,s){const l=Ve.get(e);if(l){let n=[];if("clear"===t)n=[...l.values()];else if("length"===r&&ae(e)){const a=Number(o);l.forEach((e,t)=>{("length"===t||t>=a)&&n.push(e)})}else switch(void 0!==r&&n.push(l.get(r)),t){case"add":ae(e)?me(r)&&n.push(l.get("length")):(n.push(l.get(De)),Z(e)&&n.push(l.get(He)));break;case"delete":ae(e)||(n.push(l.get(De)),Z(e)&&n.push(l.get(He)));break;case"set":Z(e)&&n.push(l.get(De))}t={target:e,type:t,key:r,newValue:o,oldValue:i,oldTarget:s};if(1===n.length)n[0]&&Xe(n[0],t);else{const c=[];for(const u of n)u&&c.push(...u);Xe(Fe(c),t)}}}function Xe(e,t){e=ae(e)?e:[...e];for(const n of e)n.computed&&Qe(n,t);for(const r of e)r.computed||Qe(r,t)}function Qe(e,t){e===s&&!e.allowRecurse||(e.onTrigger&&e.onTrigger($({effect:e},t)),e.scheduler?e.scheduler():e.run())}const et=e("__proto__,__v_isRef,__isVue"),tt=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(pe));var nt,be=at(),rt=at(!1,!0),t=at(!0),ot=at(!0,!0);const it=st();function st(){const e={};return["includes","indexOf","lastIndexOf"].forEach(r=>{e[r]=function(...e){const n=m(this);for(let e=0,t=this.length;e<t;e++)f(n,"get",e+"");var t=n[r](...e);return-1===t||!1===t?n[r](...e.map(m)):t}}),["push","pop","shift","unshift","splice"].forEach(t=>{e[t]=function(...e){Je();e=m(this)[t].apply(this,e);return qe(),e}}),e}function lt(e){const t=m(this);return f(t,"has",e),t.hasOwnProperty(e)}function at(o=!1,i=!1){return function(e,t,n){if("__v_isReactive"===t)return!o;if("__v_isReadonly"===t)return o;if("__v_isShallow"===t)return i;if("__v_raw"===t&&n===(o?i?Bt:Lt:i?Vt:jt).get(e))return e;var r=ae(e);if(!o){if(r&&A(it,t))return Reflect.get(it,t,n);if("hasOwnProperty"===t)return lt}n=Reflect.get(e,t,n);return(pe(t)?tt.has(t):et(t))?n:(o||f(e,"get",t),i?n:q(n)?r&&me(t)?n:n.value:re(n)?(o?Ht:Ut)(n):n)}}function ct(l=!1){return function(e,t,n,r){let o=e[t];if(Gt(o)&&q(o)&&!q(n))return!1;if(!l&&(Jt(n)||Gt(n)||(o=m(o),n=m(n)),!ae(e)&&q(o)&&!q(n)))return o.value=n,!0;var i=ae(e)&&me(t)?Number(t)<e.length:A(e,t),s=Reflect.set(e,t,n,r);return e===m(r)&&(i?Ce(n,o)&&Ze(e,"set",t,n,o):Ze(e,"add",t,n)),s}}const ut={get:be,set:ct(),deleteProperty:function(e,t){var n=A(e,t),r=e[t],o=Reflect.deleteProperty(e,t);return o&&n&&Ze(e,"delete",t,void 0,r),o},has:function(e,t){var n=Reflect.has(e,t);return pe(t)&&tt.has(t)||f(e,"has",t),n},ownKeys:function(e){return f(e,"iterate",ae(e)?"length":De),Reflect.ownKeys(e)}},pt={get:t,set(e,t){return Ae(`Set operation on key "${String(t)}" failed: target is readonly.`,e),!0},deleteProperty(e,t){return Ae(`Delete operation on key "${String(t)}" failed: target is readonly.`,e),!0}},dt=$({},ut,{get:rt,set:ct(!0)}),ft=$({},pt,{get:ot}),ht=e=>e,vt=e=>Reflect.getPrototypeOf(e);function mt(e,t,n=!1,r=!1){var o=m(e=e.__v_raw),i=m(t);n||(t!==i&&f(o,"get",t),f(o,"get",i));const s=vt(o)["has"],l=r?ht:n?Xt:Zt;return s.call(o,t)?l(e.get(t)):s.call(o,i)?l(e.get(i)):void(e!==o&&e.get(t))}function gt(e,t=!1){const n=this.__v_raw;var r=m(n),o=m(e);return t||(e!==o&&f(r,"has",e),f(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function yt(e,t=!1){return e=e.__v_raw,t||f(m(e),"iterate",De),Reflect.get(e,"size",e)}function bt(e){e=m(e);const t=m(this),n=vt(t);return n.has.call(t,e)||(t.add(e),Ze(t,"add",e,e)),this}function _t(e,t){t=m(t);const n=m(this),{has:r,get:o}=vt(n);let i=r.call(n,e);i?Mt(n,r,e):(e=m(e),i=r.call(n,e));var s=o.call(n,e);return n.set(e,t),i?Ce(t,s)&&Ze(n,"set",e,t,s):Ze(n,"add",e,t),this}function wt(e){const t=m(this),{has:n,get:r}=vt(t);let o=n.call(t,e);o?Mt(t,n,e):(e=m(e),o=n.call(t,e));var i=r?r.call(t,e):void 0,s=t.delete(e);return o&&Ze(t,"delete",e,void 0,i),s}function xt(){const e=m(this);var t=0!==e.size,n=new(Z(e)?Map:Set)(e),r=e.clear();return t&&Ze(e,"clear",void 0,void 0,n),r}function St(s,l){return function(n,r){const o=this,e=o.__v_raw;var t=m(e);const i=l?ht:s?Xt:Zt;return s||f(t,"iterate",De),e.forEach((e,t)=>n.call(r,i(e),i(t),o))}}function Ct(l,a,c){return function(...e){const t=this.__v_raw;var n=m(t),r=Z(n);const o="entries"===l||l===Symbol.iterator&&r;r="keys"===l&&r;const i=t[l](...e),s=c?ht:a?Xt:Zt;return a||f(n,"iterate",r?He:De),{next(){var{value:e,done:t}=i.next();return t?{value:e,done:t}:{value:o?[s(e[0]),s(e[1])]:s(e),done:t}},[Symbol.iterator](){return this}}}}function kt(t){return function(...e){e=e[0]?`on key "${e[0]}" `:"";return console.warn(xe(t)+` operation ${e}failed: target is readonly.`,m(this)),"delete"!==t&&this}}function Tt(){const t={get(e){return mt(this,e)},get size(){return yt(this)},has:gt,add:bt,set:_t,delete:wt,clear:xt,forEach:St(!1,!1)},n={get(e){return mt(this,e,!1,!0)},get size(){return yt(this)},has:gt,add:bt,set:_t,delete:wt,clear:xt,forEach:St(!1,!0)},r={get(e){return mt(this,e,!0)},get size(){return yt(this,!0)},has(e){return gt.call(this,e,!0)},add:kt("add"),set:kt("set"),delete:kt("delete"),clear:kt("clear"),forEach:St(!0,!1)},o={get(e){return mt(this,e,!0,!0)},get size(){return yt(this,!0)},has(e){return gt.call(this,e,!0)},add:kt("add"),set:kt("set"),delete:kt("delete"),clear:kt("clear"),forEach:St(!0,!0)},e=["keys","values","entries",Symbol.iterator];return e.forEach(e=>{t[e]=Ct(e,!1,!1),r[e]=Ct(e,!0,!1),n[e]=Ct(e,!1,!0),o[e]=Ct(e,!0,!0)}),[t,r,n,o]}const[Et,Nt,Ot,$t]=Tt();function At(r,e){const o=e?r?$t:Ot:r?Nt:Et;return(e,t,n)=>"__v_isReactive"===t?!r:"__v_isReadonly"===t?r:"__v_raw"===t?e:Reflect.get(A(o,t)&&t in e?o:e,t,n)}const Rt={get:At(!1,!1)},It={get:At(!1,!0)},Pt={get:At(!0,!1)},Ft={get:At(!0,!0)};function Mt(e,t,n){var r=m(n);r!==n&&t.call(e,r)&&(n=he(e),console.warn(`Reactive ${n} contains both the raw and reactive `+`versions of the same object${"Map"===n?" as keys":""}, `+"which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible."))}const jt=new WeakMap,Vt=new WeakMap,Lt=new WeakMap,Bt=new WeakMap;function Ut(e){return Gt(e)?e:Wt(e,!1,ut,Rt,jt)}function Dt(e){return Wt(e,!1,dt,It,Vt)}function Ht(e){return Wt(e,!0,pt,Pt,Lt)}function zt(e){return Wt(e,!0,ft,Ft,Bt)}function Wt(e,t,n,r,o){if(!re(e))return console.warn("value cannot be made reactive: "+String(e)),e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;t=o.get(e);if(t)return t;t=function(e){if(e.__v_skip||!Object.isExtensible(e))return 0;switch(he(e)){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(e);if(0===t)return e;t=new Proxy(e,2===t?r:n);return o.set(e,t),t}function Kt(e){return Gt(e)?Kt(e.__v_raw):!(!e||!e.__v_isReactive)}function Gt(e){return!(!e||!e.__v_isReadonly)}function Jt(e){return!(!e||!e.__v_isShallow)}function qt(e){return Kt(e)||Gt(e)}function m(e){var t=e&&e.__v_raw;return t?m(t):e}function Yt(e){return Te(e,"__v_skip",!0),e}const Zt=e=>re(e)?Ut(e):e,Xt=e=>re(e)?Ht(e):e;function Qt(e){Ke&&s&&Ye((e=m(e)).dep||(e.dep=Fe()),{target:e,type:"get",key:"value"})}function en(e,t){var n=(e=m(e)).dep;n&&Xe(n,{target:e,type:"set",key:"value",newValue:t})}function q(e){return!(!e||!0!==e.__v_isRef)}function tn(e){return nn(e,!1)}function nn(e,t){return q(e)?e:new rn(e,t)}class rn{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:m(e),this._value=t?e:Zt(e)}get value(){return Qt(this),this._value}set value(e){var t=this.__v_isShallow||Jt(e)||Gt(e);e=t?e:m(e),Ce(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:Zt(e),en(this,e))}}function on(e){return q(e)?e.value:e}const sn={get:(e,t,n)=>on(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return q(o)&&!q(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function ln(e){return Kt(e)?e:new Proxy(e,sn)}class an{constructor(e){this.dep=void 0,this.__v_isRef=!0;var{get:e,set:t}=e(()=>Qt(this),()=>en(this));this._get=e,this._set=t}get value(){return this._get()}set value(e){this._set(e)}}class cn{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){var e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return e=m(this._object),t=this._key,null==(e=Ve.get(e))?void 0:e.get(t);var e,t}}function un(e,t,n){var r=e[t];return q(r)?r:new cn(e,t,n)}class pn{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this[nt]=!1,this._dirty=!0,this.effect=new ze(e,()=>{this._dirty||(this._dirty=!0,en(this))}),(this.effect.computed=this).effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=m(this);return Qt(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}const dn=[];function fn(e){dn.push(e)}function hn(){dn.pop()}function oe(e,...t){Je();const n=dn.length?dn[dn.length-1].component:null;var r=n&&n.appContext.config.warnHandler;const o=function(){let e=dn[dn.length-1];if(!e)return[];const t=[];for(;e;){const r=t[0];r&&r.vnode===e?r.recurseCount++:t.push({vnode:e,recurseCount:0});var n=e.component&&e.component.parent;e=n&&n.vnode}return t}();if(r)gn(r,n,11,[e+t.join(""),n&&n.proxy,o.map(({vnode:e})=>`at <${cs(n,e.type)}>`).join("\n"),o]);else{const i=["[Vue warn]: "+e,...t];o.length&&i.push(`
-`,...function(e){const r=[];return e.forEach((e,t)=>{var n;r.push(...0===t?[]:[`
-`],...({vnode:t,recurseCount:e}=[e][0],e=0<e?`... (${e} recursive calls)`:"",n=!!t.component&&null==t.component.parent,n=" at <"+cs(t.component,t.type,n),e=">"+e,t.props?[n,...function(t){const n=[],e=Object.keys(t);e.slice(0,3).forEach(e=>{n.push(...function e(t,n,r){return ce(n)?(n=JSON.stringify(n),r?n:[t+"="+n]):"number"==typeof n||"boolean"==typeof n||null==n?r?n:[t+"="+n]:q(n)?(n=e(t,m(n.value),!0),r?n:[t+"=Ref<",n,">"]):ne(n)?[t+"=fn"+(n.name?`<${n.name}>`:"")]:(n=m(n),r?n:[t+"=",n])}(e,t[e]))}),3<e.length&&n.push(" ...");return n}(t.props),e]:[n+e]))}),r}(o)),console.warn(...i)}qe()}function vn(e,t){void 0!==e&&("number"!=typeof e?oe(t+" is not a valid number - "+`got ${JSON.stringify(e)}.`):isNaN(e)&&oe(t+" is NaN - the duration expression might be incorrect."))}const mn={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",[0]:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"};function gn(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){bn(e,t,n)}return o}function yn(t,n,r,o){if(ne(t)){const e=gn(t,n,r,o);return e&&de(e)&&e.catch(e=>{bn(e,n,r)}),e}const i=[];for(let e=0;e<t.length;e++)i.push(yn(t[e],n,r,o));return i}function bn(t,n,r,e=!0){var o=n?n.vnode:null;if(n){let e=n.parent;for(var i=n.proxy,s=mn[r];e;){const l=e.ec;if(l)for(let e=0;e<l.length;e++)if(!1===l[e](t,i,s))return;e=e.parent}n=n.appContext.config.errorHandler;if(n)return void gn(n,null,10,[t,i,s])}var[n,r,o,e=!0]=[t,r,o,e];if(r=mn[r],o&&fn(o),oe("Unhandled error"+(r?" during execution of "+r:"")),o&&hn(),e)throw n;console.error(n)}let _n=!(nt="__v_isReadonly"),wn=!1;const l=[];let xn=0;const Sn=[];let Cn=null,kn=0;const Tn=Promise.resolve();let En=null;const Nn=100;function On(e){const t=En||Tn;return e?t.then(this?e.bind(this):e):t}function $n(e){l.length&&l.includes(e,_n&&e.allowRecurse?xn+1:xn)||(null==e.id?l.push(e):l.splice(function(e){let t=xn+1,n=l.length;for(;t<n;){var r=t+n>>>1;Fn(l[r])<e?t=1+r:n=r}return t}(e.id),0,e),An())}function An(){_n||wn||(wn=!0,En=Tn.then(jn))}function Rn(e){ae(e)?Sn.push(...e):Cn&&Cn.includes(e,e.allowRecurse?kn+1:kn)||Sn.push(e),An()}function In(e,t=_n?xn+1:0){for(e=e||new Map;t<l.length;t++){const n=l[t];n&&n.pre&&(Vn(e,n)||(l.splice(t,1),t--,n()))}}function Pn(e){if(Sn.length){var t=[...new Set(Sn)];if(Sn.length=0,Cn)Cn.push(...t);else{for(Cn=t,e=e||new Map,Cn.sort((e,t)=>Fn(e)-Fn(t)),kn=0;kn<Cn.length;kn++)Vn(e,Cn[kn])||Cn[kn]();Cn=null,kn=0}}}const Fn=e=>null==e.id?1/0:e.id,Mn=(e,t)=>{var n=Fn(e)-Fn(t);if(0==n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function jn(e){wn=!1,_n=!0,e=e||new Map,l.sort(Mn);try{for(xn=0;xn<l.length;xn++){var t=l[xn];!t||!1===t.active||Vn(e,t)||gn(t,null,14)}}finally{xn=0,l.length=0,Pn(e),_n=!1,En=null,(l.length||Sn.length)&&jn(e)}}function Vn(e,t){if(e.has(t)){var n,r=e.get(t);if(r>Nn)return oe(`Maximum recursive updates exceeded${(n=(n=t.ownerInstance)&&as(n.type))?` in component <${n}>`:""}. `+"This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function."),!0;e.set(t,r+1)}else e.set(t,1)}let Ln=!1;const Bn=new Set,Un=($e().__VUE_HMR_RUNTIME__={createRecord:Wn(Dn),rerender:Wn(function(e,t){const n=Un.get(e);n&&(n.initialDef.render=t,[...n.instances].forEach(e=>{t&&(e.render=t,Hn(e.type).render=t),e.renderCache=[],Ln=!0,e.update(),Ln=!1}))}),reload:Wn(function(e,t){var n=Un.get(e);if(n){t=Hn(t),zn(n.initialDef,t);const o=[...n.instances];for(const i of o){var r=Hn(i.type);Bn.has(r)||(r!==n.initialDef&&zn(r,t),Bn.add(r)),i.appContext.optionsCache.delete(i.type),i.ceReload?(Bn.add(r),i.ceReload(t.styles),Bn.delete(r)):i.parent?$n(i.parent.update):i.appContext.reload?i.appContext.reload():"undefined"!=typeof window?window.location.reload():console.warn("[HMR] Root or manually mounted instance modified. Full reload required.")}Rn(()=>{for(const e of o)Bn.delete(Hn(e.type))})}})},new Map);function Dn(e,t){return!Un.has(e)&&(Un.set(e,{initialDef:Hn(t),instances:new Set}),!0)}function Hn(e){return us(e)?e.__vccOpts:e}function zn(e,t){$(e,t);for(const n in e)"__file"===n||n in t||delete e[n]}function Wn(n){return(e,t)=>{try{return n(e,t)}catch(e){console.error(e),console.warn("[HMR] Something went wrong during Vue component hot-reload. Full reload required.")}}}r.devtools=void 0;let Kn=[],Gn=!1;function Jn(e,...t){r.devtools?r.devtools.emit(e,...t):Gn||Kn.push({event:e,args:t})}function qn(e,t){if(r.devtools=e,r.devtools)r.devtools.enabled=!0,Kn.forEach(({event:e,args:t})=>r.devtools.emit(e,...t)),Kn=[];else if("undefined"==typeof window||!window.HTMLElement||null!=(e=null==(e=window.navigator)?void 0:e.userAgent)&&e.includes("jsdom"))Gn=!0,Kn=[];else{const n=t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[];n.push(e=>{qn(e,t)}),setTimeout(()=>{r.devtools||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Gn=!0,Kn=[])},3e3)}}const Yn=er("component:added"),Zn=er("component:updated"),Xn=er("component:removed"),Qn=e=>{r.devtools&&"function"==typeof r.devtools.cleanupBuffer&&!r.devtools.cleanupBuffer(e)&&Xn(e)};function er(t){return e=>{Jn(t,e.appContext.app,e.uid,e.parent?e.parent.uid:void 0,e)}}const tr=rr("perf:start"),nr=rr("perf:end");function rr(r){return(e,t,n)=>{Jn(r,e.appContext.app,e.uid,e,t,n)}}function or(r,o,...i){if(!r.isUnmounted){var s=r.vnode.props||E,{emitsOptions:l,propsOptions:[a]}=r;if(l)if(o in l){const u=l[o];ne(u)&&!u(...i)&&oe(`Invalid event arguments: event validation failed for event "${o}".`)}else a&&Se(o)in a||oe(`Component emitted event "${o}" but it is neither declared in `+`the emits option nor as an "${Se(o)}" prop.`);let e=i;var c,l=o.startsWith("update:"),a=l&&o.slice(7),a=(a&&a in s&&({number:a,trim:c}=s[`${"modelValue"===a?"model":a}Modifiers`]||E,c&&(e=i.map(e=>ce(e)?e.trim():e)),a&&(e=i.map(Ee))),c=e,Jn("component:emit",r.appContext.app,r,o,c),o.toLowerCase());a!==o&&s[Se(a)]&&oe(`Event "${a}" is emitted in component `+cs(r,r.type)+` but the handler is registered for "${o}". `+"Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. "+`You should probably use "${v(o)}" instead of "${o}".`);let t,n=s[t=Se(o)]||s[t=Se(R(o))];(n=!n&&l?s[t=Se(v(o))]:n)&&yn(n,r,6,e);i=s[t+"Once"];if(i){if(r.emitted){if(r.emitted[t])return}else r.emitted={};r.emitted[t]=!0,yn(i,r,6,e)}}}function ir(e,t){return e&&K(t)&&(t=t.slice(2).replace(/Once$/,""),A(e,t[0].toLowerCase()+t.slice(1))||A(e,v(t))||A(e,t))}let h=null,sr=null;function lr(e){var t=h;return h=e,sr=e&&e.type.__scopeId||null,t}function ar(r,o=h,e){if(!o)return r;if(r._n)return r;const i=(...e)=>{i._d&&Ci(-1);var t=lr(o);let n;try{n=r(...e)}finally{lr(t),i._d&&Ci(1)}return Zn(o),n};return i._n=!0,i._c=!0,i._d=!0,i}let cr=!1;function ur(){cr=!0}function pr(t){const{type:e,vnode:n,proxy:r,withProxy:o,props:i,propsOptions:[s],slots:l,attrs:a,emit:c,render:u,renderCache:p,data:d,setupState:f,ctx:h,inheritAttrs:v}=t;let m,g;var y=lr(t);cr=!1;try{if(4&n.shapeFlag){var b=o||r;m=Vi(u.call(b,b,p,i,f,d,h)),g=a}else{const u=e;a===i&&ur(),m=Vi(1<u.length?u(i,{get attrs(){return ur(),a},slots:l,emit:c}):u(i,null)),g=e.props?a:hr(a)}}catch(e){_i.length=0,bn(e,t,1),m=P(se)}let _=m,w=void 0;if(0<m.patchFlag&&2048&m.patchFlag&&([_,w]=dr(m)),g&&!1!==v){const S=Object.keys(g);b=_["shapeFlag"];if(S.length)if(7&b)s&&S.some(G)&&(g=vr(g,s)),_=Fi(_,g);else if(!cr&&_.type!==se){var x=Object.keys(a);const C=[],k=[];for(let e=0,t=x.length;e<t;e++){const T=x[e];K(T)?G(T)||C.push(T[2].toLowerCase()+T.slice(3)):k.push(T)}k.length&&oe("Extraneous non-props attributes ("+k.join(", ")+") were passed to component but could not be automatically inherited because component renders fragment or text root nodes."),C.length&&oe("Extraneous non-emits event listeners ("+C.join(", ")+') were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.')}}return n.dirs&&(mr(_)||oe("Runtime directive used on component with non-element root node. The directives will not function as intended."),(_=Fi(_)).dirs=_.dirs?_.dirs.concat(n.dirs):n.dirs),n.transition&&(mr(_)||oe("Component inside <Transition> renders non-element root node that cannot be animated."),_.transition=n.transition),w?w(_):m=_,lr(y),m}const dr=t=>{const n=t.children,r=t.dynamicChildren;var e=fr(n);if(!e)return[t,void 0];const o=n.indexOf(e),i=r?r.indexOf(e):-1;return[Vi(e),e=>{n[o]=e,r&&(-1<i?r[i]=e:0<e.patchFlag&&(t.dynamicChildren=[...r,e]))}]};function fr(t){let n;for(let e=0;e<t.length;e++){var r=t[e];if(!Ei(r))return;if(r.type!==se||"v-if"===r.children){if(n)return;n=r}}return n}const hr=e=>{let t;for(const n in e)"class"!==n&&"style"!==n&&!K(n)||((t=t||{})[n]=e[n]);return t},vr=(e,t)=>{const n={};for(const r in e)G(r)&&r.slice(9)in t||(n[r]=e[r]);return n},mr=e=>7&e.shapeFlag||e.type===se;function gr(t,n,r){var o=Object.keys(n);if(o.length!==Object.keys(t).length)return!0;for(let e=0;e<o.length;e++){var i=o[e];if(n[i]!==t[i]&&!ir(r,i))return!0}return!1}function yr({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const br=e=>e.__isSuspense;be={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,l,a,c){if(null!=e){var[e,u,p,d,f,h,v,m,{p:g,um:y,o:{createElement:b}}]=[e,t,n,r,o,s,l,a,c];const _=u.suspense=e.suspense,w=((_.vnode=u).el=e.el,u.ssContent),x=u.ssFallback,{activeBranch:S,pendingBranch:C,isInFallback:k,isHydrating:T}=_;if(C)Ni(_.pendingBranch=w,C)?(g(C,w,_.hiddenContainer,null,f,_,h,v,m),_.deps<=0?_.resolve():k&&(g(S,x,p,d,f,null,h,v,m),kr(_,x))):(_.pendingId++,T?(_.isHydrating=!1,_.activeBranch=C):y(C,f,_),_.deps=0,_.effects.length=0,_.hiddenContainer=b("div"),k?(g(null,w,_.hiddenContainer,null,f,_,h,v,m),_.deps<=0?_.resolve():(g(S,x,p,d,f,null,h,v,m),kr(_,x))):S&&Ni(w,S)?(g(S,w,p,d,f,_,h,v,m),_.resolve(!0)):(g(null,w,_.hiddenContainer,null,f,_,h,v,m),_.deps<=0&&_.resolve()));else if(S&&Ni(w,S))g(S,w,p,d,f,_,h,v,m),kr(_,w);else if(_r(u,"onPending"),_.pendingBranch=w,_.pendingId++,g(null,w,_.hiddenContainer,null,f,_,h,v,m),_.deps<=0)_.resolve();else{const{timeout:E,pendingId:N}=_;0<E?setTimeout(()=>{_.pendingId===N&&_.fallback(x)},E):0===E&&_.fallback(x)}}else{e=t;y=n;b=r;p=o;d=i;u=s;g=l;f=a;h=c;const{p:O,o:{createElement:$}}=h,A=$("div"),R=e.suspense=xr(e,d,p,y,A,b,u,g,f,h);O(null,R.pendingBranch=e.ssContent,A,null,p,R,u,g),0<R.deps?(_r(e,"onPending"),_r(e,"onFallback"),O(null,e.ssFallback,y,b,p,null,u,g),kr(R,e.ssFallback)):R.resolve()}},hydrate:function(e,t,n,r,o,i,s,l,a){const c=t.suspense=xr(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,l,!0),u=a(e,c.pendingBranch=t.ssContent,n,c,i,s);0===c.deps&&c.resolve();return u},create:xr,normalize:function(e){var{shapeFlag:t,children:n}=e,t=32&t;e.ssContent=Sr(t?n.default:n),e.ssFallback=t?Sr(n.fallback):P(se)}};function _r(e,t){const n=e.props&&e.props[t];ne(n)&&n()}let wr=!1;function xr(e,t,n,r,o,i,s,c,u,l,a=!1){wr||(wr=!0,console[console.info?"info":"log"]("<Suspense> is an experimental feature and its API will likely change."));const{p,m:d,um:f,n:h,o:{parentNode:v,remove:m}}=l;l=e.props?Ne(e.props.timeout):void 0;vn(l,"Suspense timeout");const g={vnode:e,parent:t,parentComponent:n,isSVG:s,container:r,hiddenContainer:o,anchor:i,deps:0,pendingId:0,timeout:"number"==typeof l?l:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:a,isUnmounted:!1,effects:[],resolve(t=!1){if(!t&&!g.pendingBranch)throw new Error("suspense.resolve() is called without a pending branch.");if(g.isUnmounted)throw new Error("suspense.resolve() is called on an already unmounted suspense boundary.");const{vnode:e,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:s,container:l}=g;if(g.isHydrating)g.isHydrating=!1;else if(!t){t=n&&r.transition&&"out-in"===r.transition.mode;t&&(n.transition.afterLeave=()=>{o===g.pendingId&&d(r,l,e,0)});let e=g["anchor"];n&&(e=h(n),f(n,s,g,!0)),t||d(r,l,e,0)}kr(g,r),g.pendingBranch=null,g.isInFallback=!1;let a=g.parent,c=!1;for(;a;){if(a.pendingBranch){a.effects.push(...i),c=!0;break}a=a.parent}c||Rn(i),g.effects=[],_r(e,"onResolve")},fallback(e){if(g.pendingBranch){const{vnode:r,activeBranch:o,parentComponent:i,container:s,isSVG:l}=g,a=(_r(r,"onFallback"),h(o));var t=()=>{g.isInFallback&&(p(null,e,s,a,i,null,l,c,u),kr(g,e))},n=e.transition&&"out-in"===e.transition.mode;n&&(o.transition.afterLeave=t),g.isInFallback=!0,f(o,i,null,!0),n||t()}},move(e,t,n){g.activeBranch&&d(g.activeBranch,e,t,n),g.container=e},next(){return g.activeBranch&&h(g.activeBranch)},registerDep(n,r){const o=!!g.pendingBranch,i=(o&&g.deps++,n.vnode.el);n.asyncDep.catch(e=>{bn(e,n,0)}).then(e=>{if(!n.isUnmounted&&!g.isUnmounted&&g.pendingId===n.suspenseId){n.asyncResolved=!0;const t=n["vnode"];fn(t),Xi(n,e,!1),i&&(t.el=i);e=!i&&n.subTree.el;r(n,t,v(i||n.subTree.el),i?null:h(n.subTree),g,s,u),e&&m(e),yr(n,t.el),hn(),o&&0==--g.deps&&g.resolve()}})},unmount(e,t){g.isUnmounted=!0,g.activeBranch&&f(g.activeBranch,n,e,t),g.pendingBranch&&f(g.pendingBranch,n,e,t)}};return g}function Sr(t){let e;var n;return ne(t)&&((n=Si&&t._c)&&(t._d=!1,wi()),t=t(),n&&(t._d=!0,e=c,xi())),ae(t)&&((n=fr(t))||oe("<Suspense> slots expect a single root node."),t=n),t=Vi(t),e&&!t.dynamicChildren&&(t.dynamicChildren=e.filter(e=>e!==t)),t}function Cr(e,t){t&&t.pendingBranch?ae(e)?t.effects.push(...e):t.effects.push(e):Rn(e)}function kr(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;e=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=e,yr(r,e))}function Tr(t,n){if(_){let e=_.provides;var r=_.parent&&_.parent.provides;(e=r===e?_.provides=Object.create(r):e)[t]=n}else oe("provide() can only be used inside setup().")}function Er(e,t,n=!1){var r,o=_||h;if(o)return(r=null==o.parent?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides)&&e in r?r[e]:1<arguments.length?n&&ne(t)?t.call(o.proxy):t:void oe(`injection "${String(e)}" not found.`);oe("inject() can only be used inside setup() or functional components.")}function Nr(e,t){return Ar(e,null,Object.assign(Object.assign({},t),{flush:"post"}))}const Or={};function $r(e,t,n){return ne(t)||oe("`watch(fn, options?)` signature has been moved to a separate API. Use `watchEffect(fn, options?)` instead. `watch` now only supports `watch(source, cb, options?) signature."),Ar(e,t,n)}function Ar(e,t,{immediate:n,deep:r,flush:o,onTrack:i,onTrigger:s}=E){t||(void 0!==n&&oe('watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.'),void 0!==r&&oe('watch() "deep" option is only respected when using the watch(source, callback, options?) signature.'));const l=e=>{oe("Invalid watch source: ",e,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},a=b===(null===_||void 0===_?void 0:_.scope)?_:null;let c,u=!1,p=!1;if(q(e)?(c=()=>e.value,u=Jt(e)):Kt(e)?(c=()=>e,r=!0):ae(e)?(p=!0,u=e.some(e=>Kt(e)||Jt(e)),c=()=>e.map(e=>q(e)?e.value:Kt(e)?Ir(e):ne(e)?gn(e,a,2):void l(e))):ne(e)?c=t?()=>gn(e,a,2):()=>{if(!a||!a.isUnmounted)return d&&d(),yn(e,a,3,[f])}:(c=te,l(e)),t&&r){const y=c;c=()=>Ir(y())}let d,f=e=>{d=g.onStop=()=>{gn(e,a,4)}},h=p?new Array(e.length).fill(Or):Or;const v=()=>{if(g.active)if(t){const e=g.run();(r||u||(p?e.some((e,t)=>Ce(e,h[t])):Ce(e,h)))&&(d&&d(),yn(t,a,3,[e,h===Or?void 0:p&&h[0]===Or?[]:h,f]),h=e)}else g.run()};v.allowRecurse=!!t;let m;m="sync"===o?v:"post"===o?()=>I(v,a&&a.suspense):(v.pre=!0,a&&(v.id=a.uid),()=>$n(v));const g=new ze(c,m);g.onTrack=i,g.onTrigger=s,t?n?v():h=g.run():"post"===o?I(g.run.bind(g),a&&a.suspense):g.run();return()=>{g.stop(),a&&a.scope&&J(a.scope.effects,g)}}function Rr(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function Ir(t,n){if(!re(t)||t.__v_skip)return t;if((n=n||new Set).has(t))return t;if(n.add(t),q(t))Ir(t.value,n);else if(ae(t))for(let e=0;e<t.length;e++)Ir(t[e],n);else if(X(t)||Z(t))t.forEach(e=>{Ir(e,n)});else if(ve(t))for(const e in t)Ir(t[e],n);return t}function Pr(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return eo(()=>{e.isMounted=!0}),ro(()=>{e.isUnmounting=!0}),e}t=[Function,Array];const Fr={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:t,onEnter:t,onAfterEnter:t,onEnterCancelled:t,onBeforeLeave:t,onLeave:t,onAfterLeave:t,onLeaveCancelled:t,onBeforeAppear:t,onAppear:t,onAfterAppear:t,onAppearCancelled:t},setup(p,{slots:e}){const d=Wi(),f=Pr();let h;return()=>{var n=e.default&&Ur(e.default(),!0);if(n&&n.length){let t=n[0];if(1<n.length){let e=!1;for(const c of n)if(c.type!==se){if(e){oe("<transition> can only be used on a single element or component. Use <transition-group> for lists.");break}t=c,e=!0}}var n=m(p),r=n["mode"];if(r&&"in-out"!==r&&"out-in"!==r&&"default"!==r&&oe("invalid <transition> mode: "+r),f.isLeaving)return Vr(t);var o=Lr(t);if(!o)return Vr(t);const s=jr(o,n,f,d);Br(o,s);var i=d.subTree;const l=i&&Lr(i);let e=!1;const a=o.type["getTransitionKey"];if(a&&(i=a(),void 0===h?h=i:i!==h&&(h=i,e=!0)),l&&l.type!==se&&(!Ni(o,l)||e)){const u=jr(l,n,f,d);if(Br(l,u),"out-in"===r)return f.isLeaving=!0,u.afterLeave=()=>{(f.isLeaving=!1)!==d.update.active&&d.update()},Vr(t);"in-out"===r&&o.type!==se&&(u.delayLeave=(e,t,n)=>{const r=Mr(f,l);r[String(l.key)]=l,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete s.delayedLeave},s.delayedLeave=n})}return t}}}};function Mr(e,t){const n=e["leavingVNodes"];let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function jr(i,t,s,n){const{appear:l,mode:e,persisted:r=!1,onBeforeEnter:o,onEnter:a,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:p,onLeave:d,onAfterLeave:f,onLeaveCancelled:h,onBeforeAppear:v,onAppear:m,onAfterAppear:g,onAppearCancelled:y}=t,b=String(i.key),_=Mr(s,i),w=(e,t)=>{e&&yn(e,n,9,t)},x=(e,t)=>{const n=t[1];w(e,t),ae(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},S={mode:e,persisted:r,beforeEnter(e){let t=o;if(!s.isMounted){if(!l)return;t=v||o}e._leaveCb&&e._leaveCb(!0);const n=_[b];n&&Ni(i,n)&&n.el._leaveCb&&n.el._leaveCb(),w(t,[e])},enter(t){let e=a,n=c,r=u;if(!s.isMounted){if(!l)return;e=m||a,n=g||c,r=y||u}let o=!1;var i=t._enterCb=e=>{o||(o=!0,e?w(r,[t]):w(n,[t]),S.delayedLeave&&S.delayedLeave(),t._enterCb=void 0)};e?x(e,[t,i]):i()},leave(t,n){const r=String(i.key);if(t._enterCb&&t._enterCb(!0),s.isUnmounting)return n();w(p,[t]);let o=!1;var e=t._leaveCb=e=>{o||(o=!0,n(),e?w(h,[t]):w(f,[t]),t._leaveCb=void 0,_[r]===i&&delete _[r])};_[r]=i,d?x(d,[t,e]):e()},clone(e){return jr(e,t,s,n)}};return S}function Vr(e){if(Wr(e))return(e=Fi(e)).children=null,e}function Lr(e){return Wr(e)?e.children?e.children[0]:void 0:e}function Br(e,t){6&e.shapeFlag&&e.component?Br(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ur(t,n=!1,r){let o=[],i=0;for(let e=0;e<t.length;e++){var s=t[e],l=null==r?s.key:String(r)+String(null!=s.key?s.key:e);s.type===ie?(128&s.patchFlag&&i++,o=o.concat(Ur(s.children,n,l))):!n&&s.type===se||o.push(null!=l?Fi(s,{key:l}):s)}if(1<i)for(let e=0;e<o.length;e++)o[e].patchFlag=-2;return o}function Dr(e){return ne(e)?{setup:e,name:e.name}:e}const Hr=e=>!!e.type.__asyncLoader;function zr(e,t){var{ref:n,props:r,children:o,ce:i}=t.vnode;const s=P(e,r,o);return s.ref=n,s.ce=i,delete t.vnode.ce,s}const Wr=e=>e.type.__isKeepAlive;rt={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(l,{slots:a}){const r=Wi(),e=r.ctx,c=new Map,u=new Set;let p=null;r.__v_cache=c;const s=r.suspense,{p:d,m:f,um:t,o:{createElement:n}}=e["renderer"],o=n("div");function i(e){Yr(e),t(e,r,s,!0)}function h(n){c.forEach((e,t)=>{e=as(e.type);!e||n&&n(e)||v(t)})}function v(e){var t=c.get(e);p&&Ni(t,p)?p&&Yr(p):i(t),c.delete(e),u.delete(e)}e.activate=(t,e,n,r,o)=>{const i=t.component;f(t,e,n,0,s),d(i.vnode,t,e,n,i,s,r,t.slotScopeIds,o),I(()=>{i.isDeactivated=!1,i.a&&ke(i.a);var e=t.props&&t.props.onVnodeMounted;e&&Di(e,i.parent,t)},s),Yn(i)},e.deactivate=t=>{const n=t.component;f(t,o,null,1,s),I(()=>{n.da&&ke(n.da);var e=t.props&&t.props.onVnodeUnmounted;e&&Di(e,n.parent,t),n.isDeactivated=!0},s),Yn(n)},$r(()=>[l.include,l.exclude],([t,n])=>{t&&h(e=>Kr(t,e)),n&&h(e=>!Kr(n,e))},{flush:"post",deep:!0});let m=null;var g=()=>{null!=m&&c.set(m,Zr(r.subTree))};return eo(g),no(g),ro(()=>{c.forEach(e=>{var{subTree:t,suspense:n}=r,t=Zr(t);if(e.type===t.type&&e.key===t.key)return Yr(t),void((t=t.component.da)&&I(t,n));i(e)})}),()=>{if(m=null,!a.default)return null;var e=a.default();const t=e[0];if(1<e.length)return oe("KeepAlive should contain exactly one component child."),p=null,e;if(!(Ei(t)&&(4&t.shapeFlag||128&t.shapeFlag)))return p=null,t;let n=Zr(t);var e=n.type,r=as(Hr(n)?n.type.__asyncResolved||{}:e),{include:o,exclude:i,max:s}=l;if(o&&(!r||!Kr(o,r))||i&&r&&Kr(i,r))return p=n,t;o=null==n.key?e:n.key,i=c.get(o);return n.el&&(n=Fi(n),128&t.shapeFlag&&(t.ssContent=n)),m=o,i?(n.el=i.el,n.component=i.component,n.transition&&Br(n,n.transition),n.shapeFlag|=512,u.delete(o),u.add(o)):(u.add(o),s&&u.size>parseInt(s,10)&&v(u.values().next().value)),n.shapeFlag|=256,p=n,br(t.type)?t:n}}};function Kr(e,t){return ae(e)?e.some(e=>Kr(e,t)):ce(e)?e.split(",").includes(t):(n=e,"[object RegExp]"===fe(n)&&e.test(t));var n}function Gr(e,t){qr(e,"a",t)}function Jr(e,t){qr(e,"da",t)}function qr(t,n,r=_){var o=t.__wdc||(t.__wdc=()=>{let e=r;for(;e;){if(e.isDeactivated)return;e=e.parent}return t()});if(Xr(n,o,r),r){let e=r.parent;for(;e&&e.parent;)Wr(e.parent.vnode)&&!function(e,t,n,r){const o=Xr(t,e,r,!0);oo(()=>{J(r[t],o)},n)}(o,n,r,e),e=e.parent}}function Yr(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Zr(e){return 128&e.shapeFlag?e.ssContent:e}function Xr(t,n,r=_,e=!1){if(r){const i=r[t]||(r[t]=[]);var o=n.__weh||(n.__weh=(...e)=>{if(!r.isUnmounted)return Je(),Ki(r),e=yn(n,r,t,e),Gi(),qe(),e});return e?i.unshift(o):i.push(o),o}oe(Se(mn[t].replace(/ hook$/,""))+" is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.")}ot=n=>(t,e=_)=>(!Zi||"sp"===n)&&Xr(n,(...e)=>t(...e),e);const Qr=ot("bm"),eo=ot("m"),to=ot("bu"),no=ot("u"),ro=ot("bum"),oo=ot("um"),io=ot("sp"),so=ot("rtg"),lo=ot("rtc");function ao(e,t=_){Xr("ec",e,t)}function co(e){ye(e)&&oe("Do not use built-in directive ids as custom directive id: "+e)}function uo(t,n,r,o){var i=t.dirs,s=n&&n.dirs;for(let e=0;e<i.length;e++){const a=i[e];s&&(a.oldValue=s[e].value);var l=a.dir[o];l&&(Je(),yn(l,r,8,[t.el,a,t,n]),qe())}}const po="components";const fo=Symbol();function ho(e,t,n=!0,r=!1){var o=h||_;if(o){var i=o.type;if(e===po){var s=as(i,!1);if(s&&(s===t||s===R(t)||s===xe(R(t))))return i}s=vo(o[e]||i[e],t)||vo(o.appContext[e],t);return!s&&r?i:(n&&!s&&(o=e===po?"\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.":"",oe(`Failed to resolve ${e.slice(0,-1)}: `+t+o)),s)}oe(`resolve${xe(e.slice(0,-1))} `+"can only be used in render() or setup().")}function vo(e,t){return e&&(e[t]||e[R(t)]||e[xe(R(t))])}const mo=e=>e?Yi(e)?is(e)||e.proxy:mo(e.parent):null,go=$(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>zt(e.props),$attrs:e=>zt(e.attrs),$slots:e=>zt(e.slots),$refs:e=>zt(e.refs),$parent:e=>mo(e.parent),$root:e=>mo(e.root),$emit:e=>e.emit,$options:e=>ko(e),$forceUpdate:e=>e.f||(e.f=()=>$n(e.update)),$nextTick:e=>e.n||(e.n=On.bind(e.proxy)),$watch:e=>function(e,t,n){const r=this.proxy;var o=ce(e)?e.includes(".")?Rr(r,e):()=>r[e]:e.bind(r,r);let i;return ne(t)?i=t:(i=t.handler,n=t),t=_,Ki(this),o=Ar(o,i.bind(r),n),t?Ki(t):Gi(),o}.bind(e)}),yo=e=>"_"===e||"$"===e,bo=(e,t)=>e!==E&&!e.__isScriptSetup&&A(e,t),_o={get({_:e},t){const{ctx:n,setupState:r,data:o,props:i,accessCache:s,type:l,appContext:a}=e;if("__isVue"===t)return!0;if("$"!==t[0]){var c=s[t];if(void 0!==c)switch(c){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(bo(r,t))return s[t]=1,r[t];if(o!==E&&A(o,t))return s[t]=2,o[t];if((c=e.propsOptions[0])&&A(c,t))return s[t]=3,i[t];if(n!==E&&A(n,t))return s[t]=4,n[t];xo&&(s[t]=0)}}const u=go[t];let p,d;return u?("$attrs"===t&&(f(e,"get",t),ur()),u(e)):(p=l.__cssModules)&&(p=p[t])?p:n!==E&&A(n,t)?(s[t]=4,n[t]):(d=a.config.globalProperties,A(d,t)?d[t]:void(!h||ce(t)&&0===t.indexOf("__v")||(o!==E&&yo(t[0])&&A(o,t)?oe(`Property ${JSON.stringify(t)} must be accessed via $data because it starts with a reserved `+'character ("$" or "_") and is not proxied on the render context.'):e===h&&oe(`Property ${JSON.stringify(t)} was accessed during render `+"but is not defined on instance."))))},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return bo(o,t)?(o[t]=n,!0):o.__isScriptSetup&&A(o,t)?(oe(`Cannot mutate <script setup> binding "${t}" from Options API.`),!1):r!==E&&A(r,t)?(r[t]=n,!0):A(e.props,t)?(oe(`Attempting to mutate prop "${t}". Props are readonly.`),!1):"$"===t[0]&&t.slice(1)in e?(oe(`Attempting to mutate public property "${t}". `+"Properties starting with $ are reserved and readonly."),!1):(t in e.appContext.config.globalProperties?Object.defineProperty(i,t,{enumerable:!0,configurable:!0,value:n}):i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},s){return!!n[s]||e!==E&&A(e,s)||bo(t,s)||(n=i[0])&&A(n,s)||A(r,s)||A(go,s)||A(o.config.globalProperties,s)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:A(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)},ownKeys:e=>(oe("Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead."),Reflect.ownKeys(e))},wo=$({},_o,{get(e,t){if(t!==Symbol.unscopables)return _o.get(e,t,e)},has(e,t){var n="_"!==t[0]&&!i(t);return!n&&_o.has(e,t)&&oe(`Property ${JSON.stringify(t)} should not start with _ which is a reserved prefix for Vue internals.`),n}});let xo=!0;function So(e){var t=ko(e);const n=e.proxy;var r=e.ctx;xo=!1,t.beforeCreate&&Co(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:s,watch:l,provide:a,inject:c,created:u,beforeMount:p,mounted:d,beforeUpdate:M,updated:j,activated:V,deactivated:L,beforeUnmount:B,unmounted:U,render:f,renderTracked:D,renderTriggered:H,errorCaptured:z,serverPrefetch:W,expose:h,inheritAttrs:v,components:m,directives:g}=t,y=function(){const n=Object.create(null);return(e,t)=>{n[t]?oe(`${e} property "${t}" is already defined in ${n[t]}.`):n[t]=e}}();var[t]=e.propsOptions;if(t)for(const C in t)y("Props",C);if(c){var[b,_,K=te,G=!1]=[c,r,y,e.appContext.config.unwrapInjectedRef];for(const k in b=ae(b)?Oo(b):b){var w=b[k];let t;q(t=re(w)?"default"in w?Er(w.from||k,w.default,!0):Er(w.from||k):Er(w))?G?Object.defineProperty(_,k,{enumerable:!0,configurable:!0,get:()=>t.value,set:e=>t.value=e}):(oe(`injected property "${k}" is a ref and will be auto-unwrapped `+"and no longer needs `.value` in the next minor release. To opt-in to the new behavior now, set `app.config.unwrapInjectedRef = true` (this config is temporary and will not be needed in the future.)"),_[k]=t):_[k]=t,K("Inject",k)}}if(s)for(const T in s){const E=s[T];ne(E)?(Object.defineProperty(r,T,{value:E.bind(n),configurable:!0,enumerable:!0,writable:!0}),y("Methods",T)):oe(`Method "${T}" has type "${typeof E}" in the component definition. `+"Did you reference the function correctly?")}if(o){ne(o)||oe("The data option must be a function. Plain object usage is no longer supported.");const N=o.call(n,n);if(de(N)&&oe("data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>."),re(N)){e.data=Ut(N);for(const O in N)y("Data",O),yo(O[0])||Object.defineProperty(r,O,{configurable:!0,enumerable:!0,get:()=>N[O],set:te})}else oe("data() should return an object.")}if(xo=!0,i)for(const $ in i){const A=i[$];var x=ne(A)?A.bind(n,n):ne(A.get)?A.get.bind(n,n):te,J=(x===te&&oe(`Computed property "${$}" has no getter.`),!ne(A)&&ne(A.set)?A.set.bind(n):()=>{oe(`Write operation failed: computed property "${$}" is readonly.`)});const R=ps({get:x,set:J});Object.defineProperty(r,$,{enumerable:!0,configurable:!0,get:()=>R.value,set:e=>R.value=e}),y("Computed",$)}if(l)for(const I in l)!function t(e,n,r,o){const i=o.includes(".")?Rr(r,o):()=>r[o];if(ce(e)){const s=n[e];ne(s)?$r(i,s):oe(`Invalid watch handler specified by key "${e}"`,s)}else if(ne(e))$r(i,e.bind(r));else if(re(e))if(ae(e))e.forEach(e=>t(e,n,r,o));else{const l=ne(e.handler)?e.handler.bind(r):n[e.handler];ne(l)?$r(i,l,e):oe(`Invalid watch handler specified by key "${e.handler}"`,l)}else oe(`Invalid watch option: "${o}"`,e)}(l[I],r,n,I);if(a){const P=ne(a)?a.call(n):a;Reflect.ownKeys(P).forEach(e=>{Tr(e,P[e])})}function S(t,e){ae(e)?e.forEach(e=>t(e.bind(n))):e&&t(e.bind(n))}if(u&&Co(u,e,"c"),S(Qr,p),S(eo,d),S(to,M),S(no,j),S(Gr,V),S(Jr,L),S(ao,z),S(lo,D),S(so,H),S(ro,B),S(oo,U),S(io,W),ae(h))if(h.length){const F=e.exposed||(e.exposed={});h.forEach(t=>{Object.defineProperty(F,t,{get:()=>n[t],set:e=>n[t]=e})})}else e.exposed||(e.exposed={});f&&e.render===te&&(e.render=f),null!=v&&(e.inheritAttrs=v),m&&(e.components=m),g&&(e.directives=g)}function Co(e,t,n){yn(ae(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function ko(e){var t=e.type,{mixins:n,extends:r}=t;const{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext;e=i.get(t);let l;return e?l=e:o.length||n||r?(l={},o.length&&o.forEach(e=>To(l,e,s,!0)),To(l,t,s)):l=t,re(t)&&i.set(t,l),l}function To(t,e,n,r=!1){const{mixins:o,extends:i}=e;i&&To(t,i,n,!0),o&&o.forEach(e=>To(t,e,n,!0));for(const s in e)if(r&&"expose"===s)oe('"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.');else{const l=Eo[s]||n&&n[s];t[s]=l?l(t[s],e[s]):e[s]}return t}const Eo={data:No,props:$o,emits:$o,methods:$o,computed:$o,beforeCreate:o,created:o,beforeMount:o,mounted:o,beforeUpdate:o,updated:o,beforeDestroy:o,beforeUnmount:o,destroyed:o,unmounted:o,activated:o,deactivated:o,errorCaptured:o,serverPrefetch:o,components:$o,directives:$o,watch:function(e,t){if(!e)return t;if(!t)return e;const n=$(Object.create(null),e);for(const r in t)n[r]=o(e[r],t[r]);return n},provide:No,inject:function(e,t){return $o(Oo(e),Oo(t))}};function No(e,t){return t?e?function(){return $(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function Oo(t){if(ae(t)){const n={};for(let e=0;e<t.length;e++)n[t[e]]=t[e];return n}return t}function o(e,t){return e?[...new Set([].concat(e,t))]:t}function $o(e,t){return e?$($(Object.create(null),e),t):t}function Ao(t,n,r,e){const{props:o,attrs:i,vnode:{patchFlag:s}}=t;var l=m(o),[a]=t.propsOptions;let c=!1;if(function(e){for(;e;){if(e.type.__hmrId)return 1;e=e.parent}}(t)||!(e||0<s)||16&s){Ro(t,n,o,i)&&(c=!0);let e;for(const f in l)n&&(A(n,f)||(e=v(f))!==f&&A(n,e))||(a?!r||void 0===r[f]&&void 0===r[e]||(o[f]=Io(a,l,f,void 0,t,!0)):delete o[f]);if(i!==l)for(const h in i)n&&A(n,h)||(delete i[h],c=!0)}else if(8&s){var u=t.vnode.dynamicProps;for(let e=0;e<u.length;e++){var p,d=u[e];ir(t.emitsOptions,d)||(p=n[d],!a||A(i,d)?p!==i[d]&&(i[d]=p,c=!0):(d=R(d),o[d]=Io(a,l,d,p,t,!1)))}}c&&Ze(t,"set","$attrs"),Vo(n||{},o,t)}function Ro(t,n,r,o){const[i,s]=t.propsOptions;let l=!1,a;if(n)for(var c in n)if(!ge(c)){var u=n[c];let e;i&&A(i,e=R(c))?s&&s.includes(e)?(a=a||{})[e]=u:r[e]=u:ir(t.emitsOptions,c)||c in o&&u===o[c]||(o[c]=u,l=!0)}if(s){var p=m(r),d=a||E;for(let e=0;e<s.length;e++){var f=s[e];r[f]=Io(i,p,f,d[f],t,!A(d,f))}}return l}function Io(e,t,n,r,o,i){e=e[n];if(null!=e){var s=A(e,"default");if(s&&void 0===r){const l=e.default;if(e.type!==Function&&ne(l)){const a=o["propsDefaults"];n in a?r=a[n]:(Ki(o),r=a[n]=l.call(null,t),Gi())}else r=l}e[0]&&(i&&!s?r=!1:!e[1]||""!==r&&r!==v(n)||(r=!0))}return r}function Po(e){if("$"!==e[0])return 1;oe(`Invalid prop name: "${e}" is a reserved property.`)}function Fo(e){var t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:null===e?"null":""}function Mo(e,t){return Fo(e)===Fo(t)}function jo(t,e){return ae(e)?e.findIndex(e=>Mo(e,t)):ne(e)&&Mo(e,t)?0:-1}function Vo(e,t,n){var r=m(t),o=n.propsOptions[0];for(const s in o){var i=o[s];null!=i&&!function(e,n,t,r){const{type:o,required:i,validator:s}=t;if(i&&r)oe('Missing required prop: "'+e+'"');else if(null!=n||t.required){if(null!=o&&!0!==o){let t=!1;var l=ae(o)?o:[o];const u=[];for(let e=0;e<l.length&&!t;e++){var{valid:a,expectedType:c}=function(e,t){let n;const r=Fo(t);{var o;Lo(r)?(o=typeof e,(n=o===r.toLowerCase())||"object"!=o||(n=e instanceof t)):n="Object"===r?re(e):"Array"===r?ae(e):"null"===r?null===e:e instanceof t}return{valid:n,expectedType:r}}(n,l[e]);u.push(c||""),t=a}if(!t)return oe(function(e,t,n){let r=`Invalid prop: type check failed for prop "${e}".`+" Expected "+n.map(xe).join(" | ");var e=n[0],o=he(t),i=Bo(t,e),t=Bo(t,o);1===n.length&&Uo(e)&&!function(e){return e.some(e=>"boolean"===e.toLowerCase())}([e,o])&&(r+=" with value "+i);r+=`, got ${o} `,Uo(o)&&(r+=`with value ${t}.`);return r}(e,n,u))}s&&!s(n)&&oe('Invalid prop: custom validator check failed for prop "'+e+'".')}}(s,r[s],i,!A(e,s)&&!A(e,v(s)))}}const Lo=e("String,Number,Boolean,Function,Symbol,BigInt");function Bo(e,t){return"String"===t?`"${e}"`:"Number"===t?""+Number(e):""+e}function Uo(t){return["string","number","boolean"].some(e=>t.toLowerCase()===e)}const Do=e=>"_"===e[0]||"$stable"===e,Ho=e=>ae(e)?e.map(Vi):[Vi(e)],zo=(e,t,n)=>{var r=e._ctx;for(const i in e)if(!Do(i)){var o=e[i];if(ne(o))t[i]=((t,n,e)=>{if(n._n)return n;const r=ar((...e)=>(_&&oe(`Slot "${t}" invoked outside of the render function: `+"this will not track dependencies used in the slot. Invoke the slot function inside the render function instead."),Ho(n(...e))),e);return r._c=!1,r})(i,o,r);else if(null!=o){oe(`Non-function value encountered for slot "${i}". `+"Prefer function slots for better performance.");const s=Ho(o);t[i]=()=>s}}},Wo=(e,t)=>{Wr(e.vnode)||oe("Non-function value encountered for default slot. Prefer function slots for better performance.");const n=Ho(t);e.slots.default=()=>n},Ko=(e,t)=>{var n;32&e.vnode.shapeFlag?(n=t._)?(e.slots=m(t),Te(t,"_",n)):zo(t,e.slots={}):(e.slots={},t&&Wo(e,t)),Te(e.slots,$i,1)},Go=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,s=E;var l;if(32&r.shapeFlag?((l=t._)?Ln?$(o,t):n&&1===l?i=!1:($(o,t),n||1!==l||delete o._):(i=!t.$stable,zo(t,o)),s=t):t&&(Wo(e,t),s={default:1}),i)for(const a in o)Do(a)||a in s||delete o[a]};function Jo(){return{app:null,config:{isNativeTag:z,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let qo=0;function Yo(u,p){return function(i,s=null){ne(i)||(i=Object.assign({},i)),null==s||re(s)||(oe("root props passed to app.mount() must be an object."),s=null);const l=Jo(),n=new Set;let a=!1;const c=l.app={_uid:qo++,_component:i,_props:s,_container:null,_context:l,_instance:null,version:gs,get config(){return l.config},set config(e){oe("app.config cannot be replaced. Modify individual options instead.")},use(e,...t){return n.has(e)?oe("Plugin has already been applied to target app."):e&&ne(e.install)?(n.add(e),e.install(c,...t)):ne(e)?(n.add(e),e(c,...t)):oe('A plugin must either be a function or an object with an "install" function.'),c},mixin(e){return l.mixins.includes(e)?oe("Mixin has already been applied to target app"+(e.name?": "+e.name:"")):l.mixins.push(e),c},component(e,t){return qi(e,l.config),t?(l.components[e]&&oe(`Component "${e}" has already been registered in target app.`),l.components[e]=t,c):l.components[e]},directive(e,t){return co(e),t?(l.directives[e]&&oe(`Directive "${e}" has already been registered in target app.`),l.directives[e]=t,c):l.directives[e]},mount(e,t,n){if(!a){e.__vue_app__&&oe("There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling `app.unmount()` first.");const o=P(i,s);return(o.appContext=l).reload=()=>{u(Fi(o),e,n)},t&&p?p(o,e):u(o,e,n),a=!0,((c._container=e).__vue_app__=c)._instance=o.component,t=c,r=gs,Jn("app:init",t,r,{Fragment:ie,Text:yi,Comment:se,Static:bi}),is(o.component)||o.component.proxy}var r;oe("App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. `const createMyApp = () => createApp(App)`")},unmount(){a?(u(null,c._container),c._instance=null,Jn("app:unmount",c),delete c._container.__vue_app__):oe("Cannot unmount an app that is not mounted.")},provide(e,t){return e in l.provides&&oe(`App already provides property with key "${String(e)}". `+"It will be overwritten with the new value."),l.provides[e]=t,c}};return c}}function Zo(t,n,r,o,i=!1){if(ae(t))t.forEach((e,t)=>Zo(e,n&&(ae(n)?n[t]:n),r,o,i));else if(!Hr(o)||i){const s=4&o.shapeFlag?is(o.component)||o.component.proxy:o.el,l=i?null:s,{i:a,r:c}=t;if(a){const u=n&&n.r,p=a.refs===E?a.refs={}:a.refs,d=a.setupState;if(null!=u&&u!==c&&(ce(u)?(p[u]=null,A(d,u)&&(d[u]=null)):q(u)&&(u.value=null)),ne(c))gn(c,a,12,[l,p]);else{const f=ce(c),h=q(c);var e;f||h?(e=()=>{if(t.f){const e=f?(A(d,c)?d:p)[c]:c.value;i?ae(e)&&J(e,s):ae(e)?e.includes(s)||e.push(s):f?(p[c]=[s],A(d,c)&&(d[c]=p[c])):(c.value=[s],t.k&&(p[t.k]=c.value))}else f?(p[c]=l,A(d,c)&&(d[c]=l)):h?(c.value=l,t.k&&(p[t.k]=l)):oe("Invalid template ref type:",c,`(${typeof c})`)},l?(e.id=-1,I(e,r)):e()):oe("Invalid template ref type:",c,`(${typeof c})`)}}else oe("Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.")}}let Xo=!1;const Qo=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,ei=e=>8===e.nodeType;function ti(m){const{mt:g,p,o:{patchProp:h,createText:y,nextSibling:b,parentNode:_,remove:v,insert:w,createComment:l}}=m;const x=(t,n,e,r,o,i=!1)=>{const s=ei(t)&&"["===t.data;var l=()=>T(t,n,e,r,o,s),{type:a,ref:c,shapeFlag:u,patchFlag:p}=n;let d=t.nodeType,f=(n.el=t,-2===p&&(i=!1,n.dynamicChildren=null),null);switch(a){case yi:f=3!==d?""===n.children?(w(n.el=y(""),_(t),t),t):l():(t.data!==n.children&&(Xo=!0,oe("Hydration text mismatch:\n- Client: "+JSON.stringify(t.data)+`
-- Server: `+JSON.stringify(n.children)),t.data=n.children),b(t));break;case se:f=8!==d||s?l():b(t);break;case bi:if(s&&(t=b(t),d=t.nodeType),1===d||3===d){f=t;var h=!n.children.length;for(let e=0;e<n.staticCount;e++)h&&(n.children+=1===f.nodeType?f.outerHTML:f.data),e===n.staticCount-1&&(n.anchor=f),f=b(f);return s?b(f):f}l();break;case ie:f=s?k(t,n,e,r,o,i):l();break;default:if(1&u)f=1!==d||n.type.toLowerCase()!==t.tagName.toLowerCase()?l():S(t,n,e,r,o,i);else if(6&u){n.slotScopeIds=o;var v=_(t);if(g(n,v,null,e,r,Qo(v),i),(f=(s?E:b)(t))&&ei(f)&&"teleport end"===f.data&&(f=b(f)),Hr(n)){let e;s?(e=P(ie)).anchor=f?f.previousSibling:v.lastChild:e=3===t.nodeType?ji(""):P("div"),e.el=t,n.component.subTree=e}}else 64&u?f=8!==d?l():n.type.hydrate(t,n,e,r,o,i,m,C):128&u?f=n.type.hydrate(t,n,e,r,Qo(_(t)),o,i,m,x):oe("Invalid HostVNode type:",a,`(${typeof a})`)}return null!=c&&Zo(c,null,r,n),f},S=(n,r,o,i,s,l)=>{l=l||!!r.dynamicChildren;const{type:e,props:t,patchFlag:a,shapeFlag:c,dirs:u}=r;var p="input"===e&&u||"option"===e;{if(u&&uo(r,null,o,"created"),t)if(p||!l||48&a)for(const f in t)(p&&f.endsWith("value")||K(f)&&!ge(f))&&h(n,f,null,t[f],!1,void 0,o);else t.onClick&&h(n,"onClick",null,t.onClick,!1,void 0,o);let e;if((e=t&&t.onVnodeBeforeMount)&&Di(e,o,r),u&&uo(r,null,o,"beforeMount"),((e=t&&t.onVnodeMounted)||u)&&Cr(()=>{e&&Di(e,o,r),u&&uo(r,null,o,"mounted")},i),16&c&&(!t||!t.innerHTML&&!t.textContent)){let e=C(n.firstChild,r,n,o,i,s,l),t=!1;for(;e;){Xo=!0,t||(oe(`Hydration children mismatch in <${r.type}>: `+"server rendered element contains more child nodes than client vdom."),t=!0);var d=e;e=e.nextSibling,v(d)}}else 8&c&&n.textContent!==r.children&&(Xo=!0,oe(`Hydration text content mismatch in <${r.type}>:
-`+`- Client: ${n.textContent}
-`+"- Server: "+r.children),n.textContent=r.children)}return n.nextSibling},C=(t,e,n,r,o,i,s)=>{s=s||!!e.dynamicChildren;const l=e.children;var a=l.length;let c=!1;for(let e=0;e<a;e++){var u=s?l[e]:l[e]=Vi(l[e]);t?t=x(t,u,r,o,i,s):u.type===yi&&!u.children||(Xo=!0,c||(oe(`Hydration children mismatch in <${n.tagName.toLowerCase()}>: `+"server rendered element contains fewer child nodes than client vdom."),c=!0),p(null,u,n,null,r,o,Qo(n),i))}return t},k=(e,t,n,r,o,i)=>{var s=t["slotScopeIds"],s=(s&&(o=o?o.concat(s):s),_(e)),e=C(b(e),t,s,n,r,o,i);return e&&ei(e)&&"]"===e.data?b(t.anchor=e):(Xo=!0,w(t.anchor=l("]"),s,e),e)},T=(e,t,n,r,o,i)=>{if(Xo=!0,oe(`Hydration node mismatch:
-- Client vnode:`,t.type,`
-- Server rendered DOM:`,e,3===e.nodeType?"(text)":ei(e)&&"["===e.data?"(start of fragment)":""),t.el=null,i)for(var s=E(e);;){const l=b(e);if(!l||l===s)break;v(l)}const l=b(e);i=_(e);return v(e),p(null,t,i,l,n,r,Qo(i),o),l},E=e=>{let t=0;for(;e;)if((e=b(e))&&ei(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return b(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return oe("Attempting to hydrate existing markup but container is empty. Performing full mount instead."),p(null,e,t),Pn(),void(t._vnode=e);Xo=!1,x(t.firstChild,e,null,null,null),Pn(),t._vnode=e,Xo&&console.error("Hydration completed but contains mismatches.")},x]}let ni,ri;function oi(e,t){e.appContext.config.performance&&si()&&ri.mark(`vue-${t}-`+e.uid),tr(e,t,(si()?ri:Date).now())}function ii(e,t){var n,r;e.appContext.config.performance&&si()&&(r=(n=`vue-${t}-`+e.uid)+":end",ri.mark(r),ri.measure(`<${cs(e,e.type)}> `+t,n,r),ri.clearMarks(n),ri.clearMarks(r)),nr(e,t,(si()?ri:Date).now())}function si(){return void 0!==ni||("undefined"!=typeof window&&window.performance?(ni=!0,ri=window.performance):ni=!1),ni}const I=Cr;function li(e){return ci(e)}function ai(e){return ci(e,ti)}function ci(e,t){const n=$e(),{insert:V,remove:d,patchProp:b,createElement:g,createText:L,createComment:o,setText:B,setElementText:C,parentNode:y,nextSibling:U,setScopeId:s=te,insertStaticContent:D}=(n.__VUE__=!0,qn(n.__VUE_DEVTOOLS_GLOBAL_HOOK__,n),e),N=(r,o,i,s=null,l=null,a=null,c=!1,u=null,p=!Ln&&!!o.dynamicChildren)=>{if(r!==o){r&&!Ni(r,o)&&(s=Y(r),q(r,l,a,!0),r=null),-2===o.patchFlag&&(p=!1,o.dynamicChildren=null);const{type:O,ref:$,shapeFlag:A}=o;switch(O){case yi:var e=r,t=o,n=i,d=s;if(e==null)V(t.el=L(t.children),n,d);else{const R=t.el=e.el;if(t.children!==e.children)B(R,t.children)}break;case se:H(r,o,i,s);break;case bi:if(null==r)n=o,d=i,e=s,t=c,[n.el,n.anchor]=D(n.children,d,e,t,n.el,n.anchor);else{var f=r,h=o,v=i,m=c;if(h.children!==f.children){const I=U(f.anchor);z(f);[h.el,h.anchor]=D(h.children,v,I,m)}else{h.el=f.el;h.anchor=f.anchor}}break;case ie:{v=r;m=o;h=i;f=s;var g=l;var y=a;var b=c;var _=u;var w=p;const P=m.el=v?v.el:L(""),F=m.anchor=v?v.anchor:L("");let{patchFlag:e,dynamicChildren:t,slotScopeIds:n}=m;if(Ln||e&2048){e=0;w=false;t=null}if(n)_=_?_.concat(n):n;if(v==null){V(P,h,f);V(F,h,f);W(m.children,h,F,g,y,b,_,w)}else if(e>0&&e&64&&t&&v.dynamicChildren){K(v.dynamicChildren,t,h,g,y,b,_);if(g&&g.type.__hmrId)pi(v,m);else if(m.key!=null||g&&m===g.subTree)pi(v,m,true)}else J(v,m,h,F,g,y,b,_,w)}break;default:if(1&A){var g=r,y=o,b=i,_=s,w=l,x=a,S=c,C=u,k=p;if(S=S||y.type==="svg",g==null)X(y,b,_,w,x,S,C,k);else Q(g,y,w,x,S,C,k)}else if(6&A){var x=r,S=o,C=i,k=s,T=l,M=a,E=c,j=u,N=p;if(S.slotScopeIds=j,x==null)if(S.shapeFlag&512)T.ctx.activate(S,C,k,E,N);else G(S,C,k,T,M,E,N);else ee(x,S,N)}else 64&A||128&A?O.process(r,o,i,s,l,a,c,u,p,Z):oe("Invalid VNode type:",O,`(${typeof O})`)}null!=$&&l&&Zo($,r&&r.ref,a,o||r,!o)}},H=(e,t,n,r)=>{null==e?V(t.el=o(t.children||""),n,r):t.el=e.el},z=({el:e,anchor:t})=>{for(var n;e&&e!==t;)n=U(e),d(e),e=n;d(t)},X=(e,t,n,r,o,i,s,l)=>{let a,c;const{type:u,props:p,shapeFlag:d,transition:f,dirs:h}=e;if(a=e.el=g(e.type,i,p&&p.is,p),8&d?C(a,e.children):16&d&&W(e.children,a,null,r,o,i&&"foreignObject"!==u,s,l),h&&uo(e,null,r,"created"),_(a,e,e.scopeId,s,r),p){for(const m in p)"value"===m||ge(m)||b(a,m,null,p[m],i,e.children,r,o,T);"value"in p&&b(a,"value",null,p.value),(c=p.onVnodeBeforeMount)&&Di(c,r,e)}Object.defineProperty(a,"__vnode",{value:e,enumerable:!1}),Object.defineProperty(a,"__vueParentComponent",{value:r,enumerable:!1}),h&&uo(e,null,r,"beforeMount");const v=(!o||!o.pendingBranch)&&f&&!f.persisted;v&&f.beforeEnter(a),V(a,t,n),((c=p&&p.onVnodeMounted)||v||h)&&I(()=>{c&&Di(c,r,e),v&&f.enter(a),h&&uo(e,null,r,"mounted")},o)},_=(t,n,r,o,i)=>{if(r&&s(t,r),o)for(let e=0;e<o.length;e++)s(t,o[e]);if(i){let e=i.subTree;n===(e=0<e.patchFlag&&2048&e.patchFlag?fr(e.children)||e:e)&&(r=i.vnode,_(t,r,r.scopeId,r.slotScopeIds,i.parent))}},W=(t,n,r,o,i,s,l,a,c=0)=>{for(let e=c;e<t.length;e++){var u=t[e]=(a?Li:Vi)(t[e]);N(null,u,n,r,o,i,s,l,a)}},Q=(t,e,n,r,o,i,s)=>{var l=e.el=t.el;let{patchFlag:a,dynamicChildren:c,dirs:u}=e;a|=16&t.patchFlag;var p=t.props||E,d=e.props||E;let f;n&&ui(n,!1),(f=d.onVnodeBeforeUpdate)&&Di(f,n,e,t),u&&uo(e,t,n,"beforeUpdate"),n&&ui(n,!0),Ln&&(a=0,s=!1,c=null);var h=o&&"foreignObject"!==e.type;if(c?(K(t.dynamicChildren,c,l,n,r,h,i),n&&n.type.__hmrId&&pi(t,e)):s||J(t,e,l,null,n,r,h,i,!1),0<a){if(16&a)w(l,e,p,d,n,r,o);else if(2&a&&p.class!==d.class&&b(l,"class",null,d.class,o),4&a&&b(l,"style",p.style,d.style,o),8&a){var v=e.dynamicProps;for(let e=0;e<v.length;e++){var m=v[e],g=p[m],y=d[m];y===g&&"value"!==m||b(l,m,g,y,o,t.children,n,r,T)}}1&a&&t.children!==e.children&&C(l,e.children)}else s||null!=c||w(l,e,p,d,n,r,o);((f=d.onVnodeUpdated)||u)&&I(()=>{f&&Di(f,n,e,t),u&&uo(e,t,n,"updated")},r)},K=(t,n,r,o,i,s,l)=>{for(let e=0;e<n.length;e++){var a=t[e],c=n[e],u=a.el&&(a.type===ie||!Ni(a,c)||70&a.shapeFlag)?y(a.el):r;N(a,c,u,null,o,i,s,l,!0)}},w=(e,t,n,r,o,i,s)=>{if(n!==r){if(n!==E)for(const c in n)ge(c)||c in r||b(e,c,n[c],null,s,t.children,o,i,T);for(const u in r){var l,a;ge(u)||(l=r[u])!==(a=n[u])&&"value"!==u&&b(e,u,a,l,s,t.children,o,i,T)}"value"in r&&b(e,"value",n.value,r.value)}},G=(e,t,n,r,o,i,s)=>{const l=e.component=function(e,t,n){const r=e.type,o=(t||e).appContext||Hi,i={uid:zi++,vnode:e,type:r,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new Re(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:function n(e,r,t=!1){const o=r.propsCache;var i=o.get(e);if(i)return i;var s=e.props;const l={},a=[];let c=!1;if(ne(e)||(i=e=>{c=!0;var[e,t]=n(e,r,!0);$(l,e),t&&a.push(...t)},!t&&r.mixins.length&&r.mixins.forEach(i),e.extends&&i(e.extends),e.mixins&&e.mixins.forEach(i)),!s&&!c)return re(e)&&o.set(e,le),le;if(ae(s))for(let e=0;e<s.length;e++){ce(s[e])||oe("props must be strings when using array syntax.",s[e]);var u=R(s[e]);Po(u)&&(l[u]=E)}else if(s){re(s)||oe("invalid props options",s);for(const h in s){var p=R(h);if(Po(p)){var d,f=s[h];const v=l[p]=ae(f)||ne(f)?{type:f}:Object.assign({},f);v&&(f=jo(Boolean,v.type),d=jo(String,v.type),v[0]=-1<f,v[1]=d<0||f<d,(-1<f||A(v,"default"))&&a.push(p))}}}t=[l,a];return re(e)&&o.set(e,t),t}(r,o),emitsOptions:function t(e,n,r=!1){const o=n.emitsCache;var i=o.get(e);if(void 0!==i)return i;const s=e.emits;let l={},a=!1;return ne(e)||(i=e=>{(e=t(e,n,!0))&&(a=!0,$(l,e))},!r&&n.mixins.length&&n.mixins.forEach(i),e.extends&&i(e.extends),e.mixins&&e.mixins.forEach(i)),s||a?(ae(s)?s.forEach(e=>l[e]=null):$(l,s),re(e)&&o.set(e,l),l):(re(e)&&o.set(e,null),null)}(r,o),emit:null,emitted:null,propsDefaults:E,inheritAttrs:r.inheritAttrs,ctx:E,data:E,props:E,attrs:E,slots:E,refs:E,setupState:E,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};i.ctx=function(t){const n={};return Object.defineProperty(n,"_",{configurable:!0,enumerable:!1,get:()=>t}),Object.keys(go).forEach(e=>{Object.defineProperty(n,e,{configurable:!0,enumerable:!1,get:()=>go[e](t),set:te})}),n}(i),i.root=t?t.root:i,i.emit=or.bind(null,i),e.ce&&e.ce(i);return i}(e,r,o);if(l.type.__hmrId){r=l;var a=r.type.__hmrId;let e=Un.get(a);e||(Dn(a,r.type),e=Un.get(a)),e.instances.add(r)}fn(e),oi(l,"mount"),Wr(e)&&(l.ctx.renderer=Z),oi(l,"init");var[a,r=!1]=[l],{props:c,children:u}=(Zi=r,a.vnode),p=Yi(a),c=(function(e,t,n,r=!1){const o={};var i={};Te(i,$i,1),e.propsDefaults=Object.create(null),Ro(e,t,o,i);for(const s in e.propsOptions[0])s in o||(o[s]=void 0);Vo(t||{},o,e),n?e.props=r?o:Dt(o):e.type.props?e.props=o:e.props=i,e.attrs=i}(a,c,p,r),Ko(a,u),p?function(t,n){var e=t.type;e.name&&qi(e.name,t.appContext.config);if(e.components){var r=Object.keys(e.components);for(let e=0;e<r.length;e++)qi(r[e],t.appContext.config)}if(e.directives){var o=Object.keys(e.directives);for(let e=0;e<o.length;e++)co(o[e])}e.compilerOptions&&ns()&&oe('"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.');t.accessCache=Object.create(null),t.proxy=Yt(new Proxy(t.ctx,_o)),function(t){const{ctx:n,propsOptions:[e]}=t;e&&Object.keys(e).forEach(e=>{Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:()=>t.props[e],set:te})})}(t);var i=e["setup"];if(i){var s=t.setupContext=1<i.length?os(t):null;Ki(t),Je();const l=gn(i,t,0,[zt(t.props),s]);if(qe(),Gi(),de(l)){if(l.then(Gi,Gi),n)return l.then(e=>{Xi(t,e,n)}).catch(e=>{bn(e,t,0)});t.asyncDep=l,t.suspense||oe(`Component <${null!=(i=e.name)?i:"Anonymous"}>: setup function returned a promise, but no `+"<Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.")}else Xi(t,l,n)}else rs(t,n)}(a,r):void 0);if(Zi=!1,ii(l,"init"),l.asyncDep)return o&&o.registerDep(l,f),void(e.el||(u=l.subTree=P(se),H(null,u,t,n)));f(l,e,t,n,o,i,s),hn(),ii(l,"mount")},ee=(e,t,n)=>{const r=t.component=e.component;!function(e,t,n){var{props:r,children:e,component:o}=e,{props:i,children:s,patchFlag:l}=t,a=o.emitsOptions;if((e||s)&&Ln)return 1;if(t.dirs||t.transition)return 1;if(!(n&&0<=l))return!(!e&&!s||s&&s.$stable)||r!==i&&(r?!i||gr(r,i,a):i);if(1024&l)return 1;if(16&l)return r?gr(r,i,a):i;if(8&l){var c=t.dynamicProps;for(let e=0;e<c.length;e++){var u=c[e];if(i[u]!==r[u]&&!ir(a,u))return 1}}}(e,t,n)?(t.el=e.el,r.vnode=t):r.asyncDep&&!r.asyncResolved?(fn(t),x(r,t,n),hn()):(r.next=t,e=r.update,(e=l.indexOf(e))>xn&&l.splice(e,1),r.update())},f=(p,d,f,h,v,m,g)=>{const e=p.effect=new ze(()=>{if(p.isMounted){let{next:e,bu:t,u:n,parent:r,vnode:o}=p;var s=e;let i;fn(e||p.vnode),ui(p,!1),e?(e.el=o.el,x(p,e,g)):e=o,t&&ke(t),(i=e.props&&e.props.onVnodeBeforeUpdate)&&Di(i,r,e,o),ui(p,!0),oi(p,"render");var l=pr(p),a=(ii(p,"render"),p.subTree);p.subTree=l,oi(p,"patch"),N(a,l,y(a.el),Y(a),p,v,m),ii(p,"patch"),e.el=l.el,null===s&&yr(p,l.el),n&&I(n,v),(i=e.props&&e.props.onVnodeUpdated)&&I(()=>Di(i,r,e,o),v),Zn(p),hn()}else{let e;const{el:t,props:n}=d,{bm:r,m:o,parent:i}=p;a=Hr(d);if(ui(p,!1),r&&ke(r),!a&&(e=n&&n.onVnodeBeforeMount)&&Di(e,i,d),ui(p,!0),t&&S){const c=()=>{oi(p,"render"),p.subTree=pr(p),ii(p,"render"),oi(p,"hydrate"),S(t,p.subTree,p,v,null),ii(p,"hydrate")};a?d.type.__asyncLoader().then(()=>!p.isUnmounted&&c()):c()}else{oi(p,"render");s=p.subTree=pr(p);ii(p,"render"),oi(p,"patch"),N(null,s,f,h,p,v,m),ii(p,"patch"),d.el=s.el}if(o&&I(o,v),!a&&(e=n&&n.onVnodeMounted)){const u=d;I(()=>Di(e,i,u),v)}(256&d.shapeFlag||i&&Hr(i.vnode)&&256&i.vnode.shapeFlag)&&p.a&&I(p.a,v),p.isMounted=!0,Yn(p),d=f=h=null}},()=>$n(t),p.scope),t=p.update=()=>e.run();t.id=p.uid,ui(p,!0),e.onTrack=p.rtc?e=>ke(p.rtc,e):void 0,e.onTrigger=p.rtg?e=>ke(p.rtg,e):void 0,t.ownerInstance=p,t()},x=(e,t,n)=>{var r=(t.component=e).vnode.props;e.vnode=t,e.next=null,Ao(e,t.props,r,n),Go(e,t.children,n),Je(),In(),qe()},J=(e,t,n,r,o,i,s,l,a=!1)=>{var c=e&&e.children,e=e?e.shapeFlag:0,u=t.children,{patchFlag:t,shapeFlag:p}=t;if(0<t){if(128&t)return void k(c,u,n,r,o,i,s,l,a);if(256&t){{var d=c;var f=u;var h=n;t=r;var v=o;var m=i;var g=s;var y=l;var b=a;d=d||le,f=f||le;const _=d.length,w=f.length,x=Math.min(_,w);let e;for(e=0;e<x;e++){const S=f[e]=b?Li(f[e]):Vi(f[e]);N(d[e],S,h,null,v,m,g,y,b)}if(_>w)T(d,v,m,true,false,x);else W(f,h,t,v,m,g,y,b,x)}return}}8&p?(16&e&&T(c,o,i),u!==c&&C(n,u)):16&e?16&p?k(c,u,n,r,o,i,s,l,a):T(c,o,i,!0):(8&e&&C(n,""),16&p&&W(u,n,r,o,i,s,l,a))},k=(e,i,s,l,a,c,u,p,d)=>{let f=0;var h=i.length;let v=e.length-1,m=h-1;for(;f<=v&&f<=m;){var t=e[f],n=i[f]=(d?Li:Vi)(i[f]);if(!Ni(t,n))break;N(t,n,s,null,a,c,u,p,d),f++}for(;f<=v&&f<=m;){var r=e[v],o=i[m]=(d?Li:Vi)(i[m]);if(!Ni(r,o))break;N(r,o,s,null,a,c,u,p,d),v--,m--}if(f>v){if(f<=m)for(var g=m+1,y=g<h?i[g].el:l;f<=m;)N(null,i[f]=(d?Li:Vi)(i[f]),s,y,a,c,u,p,d),f++}else if(f>m)for(;f<=v;)q(e[f],a,c,!0),f++;else{var g=f,b=f;const T=new Map;for(f=b;f<=m;f++){var _=i[f]=(d?Li:Vi)(i[f]);null!=_.key&&(T.has(_.key)&&oe("Duplicate keys found during update:",JSON.stringify(_.key),"Make sure keys are unique."),T.set(_.key,f))}let t,n=0;var w=m-b+1;let r=!1,o=0;const E=new Array(w);for(f=0;f<w;f++)E[f]=0;for(f=g;f<=v;f++){var x=e[f];if(n>=w)q(x,a,c,!0);else{let e;if(null!=x.key)e=T.get(x.key);else for(t=b;t<=m;t++)if(0===E[t-b]&&Ni(x,i[t])){e=t;break}void 0===e?q(x,a,c,!0):(E[e-b]=f+1,e>=o?o=e:r=!0,N(x,i[e],s,null,a,c,u,p,d),n++)}}var S=r?function(e){const t=e.slice(),n=[0];let r,o,i,s,l;var a=e.length;for(r=0;r<a;r++){var c=e[r];if(0!==c)if(o=n[n.length-1],e[o]<c)t[r]=o,n.push(r);else{for(i=0,s=n.length-1;i<s;)l=i+s>>1,e[n[l]]<c?i=1+l:s=l;c<e[n[i]]&&(0<i&&(t[r]=n[i-1]),n[i]=r)}}i=n.length,s=n[i-1];for(;0<i--;)n[i]=s,s=t[s];return n}(E):le;for(t=S.length-1,f=w-1;0<=f;f--){var C=b+f,k=i[C],C=C+1<h?i[C+1].el:l;0===E[f]?N(null,k,s,C,a,c,u,p,d):r&&(t<0||f!==S[t]?O(k,s,C,2):t--)}}},O=(e,t,n,r,o=null)=>{const{el:i,type:s,transition:l,children:a,shapeFlag:c}=e;if(6&c)O(e.component.subTree,t,n,r);else if(128&c)e.suspense.move(t,n,r);else if(64&c)s.move(e,t,n,Z);else if(s===ie){V(i,t,n);for(let e=0;e<a.length;e++)O(a[e],t,n,r);V(e.anchor,t,n)}else if(s===bi){for(var u,[{el:p,anchor:d},f,h]=[e,t,n];p&&p!==d;)u=U(p),V(p,f,h),p=u;V(d,f,h)}else if(2!==r&&1&c&&l)if(0===r)l.beforeEnter(i),V(i,t,n),I(()=>l.enter(i),o);else{const{leave:v,delayLeave:m,afterLeave:g}=l,y=()=>V(i,t,n);e=()=>{v(i,()=>{y(),g&&g()})};m?m(i,y,e):e()}else V(i,t,n)},q=(t,n,r,o=!1,i=!1)=>{var{type:s,props:l,ref:a,children:c,dynamicChildren:u,shapeFlag:p,patchFlag:d,dirs:f}=t;if(null!=a&&Zo(a,null,r,t,!0),256&p)n.ctx.deactivate(t);else{const h=1&p&&f;a=!Hr(t);let e;if(a&&(e=l&&l.onVnodeBeforeUnmount)&&Di(e,n,t),6&p)m(t.component,r,o);else{if(128&p)return void t.suspense.unmount(r,o);h&&uo(t,null,n,"beforeUnmount"),64&p?t.type.remove(t,n,r,i,Z,o):u&&(s!==ie||0<d&&64&d)?T(u,n,r,!1,!0):(s===ie&&384&d||!i&&16&p)&&T(c,n,r),o&&v(t)}(a&&(e=l&&l.onVnodeUnmounted)||h)&&I(()=>{e&&Di(e,n,t),h&&uo(t,null,n,"unmounted")},r)}},v=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===ie)if(0<e.patchFlag&&2048&e.patchFlag&&o&&!o.persisted)e.children.forEach(e=>{e.type===se?d(e.el):v(e)});else{var i=n;var s=r;var l;for(;i!==s;)l=U(i),d(i),i=l;d(s)}else if(t===bi)z(e);else{const c=()=>{d(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:u,delayLeave:p}=o;var a=()=>u(n,c);p?p(e.el,c,a):a()}else c()}},m=(e,t,n)=>{var r;e.type.__hmrId&&(r=e,Un.get(r.type.__hmrId).instances.delete(r));const{bum:o,scope:i,update:s,subTree:l,um:a}=e;o&&ke(o),i.stop(),s&&(s.active=!1,q(l,e,t,n)),a&&I(a,t),I(()=>{e.isUnmounted=!0},t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve()),Qn(e)},T=(t,n,r,o=!1,i=!1,s=0)=>{for(let e=s;e<t.length;e++)q(t[e],n,r,o,i)},Y=e=>6&e.shapeFlag?Y(e.component.subTree):128&e.shapeFlag?e.suspense.next():U(e.anchor||e.el);var r=(e,t,n)=>{null==e?t._vnode&&q(t._vnode,null,null,!0):N(t._vnode||null,e,t,null,null,null,n),In(),Pn(),t._vnode=e};const Z={p:N,um:q,m:O,r:v,mt:G,mc:W,pc:J,pbc:K,n:Y,o:e};let i,S;return t&&([i,S]=t(Z)),{render:r,hydrate:i,createApp:Yo(r,i)}}function ui({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function pi(e,t,n=!1){var r=e.children;const o=t.children;if(ae(r)&&ae(o))for(let t=0;t<r.length;t++){var i=r[t];let e=o[t];1&e.shapeFlag&&!e.dynamicChildren&&((e.patchFlag<=0||32===e.patchFlag)&&((e=o[t]=Li(o[t])).el=i.el),n||pi(i,e)),e.type===yi&&(e.el=i.el),e.type!==se||e.el||(e.el=i.el)}}const di=e=>e.__isTeleport,fi=e=>e&&(e.disabled||""===e.disabled),hi=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,vi=(e,t)=>{var n=e&&e.to;return ce(n)?t?((t=t(n))||oe(`Failed to locate Teleport target with selector "${n}". `+"Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree."),t):(oe("Current renderer does not support string target for Teleports. (missing querySelector renderer option)"),null):(n||fi(e)||oe("Invalid Teleport target: "+n),n)};function mi(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);var{el:e,anchor:s,shapeFlag:l,children:a,props:c}=e,i=2===i;if(i&&r(e,t,n),(!i||fi(c))&&16&l)for(let e=0;e<a.length;e++)o(a[e],t,n,2);i&&r(s,t,n)}t={__isTeleport:!0,process(e,t,n,r,o,i,s,l,a,c){const{mc:u,pc:p,pbc:d,o:{insert:f,querySelector:h,createText:v,createComment:m}}=c;var g,y,b,_,w,x=fi(t.props);let{shapeFlag:S,children:C,dynamicChildren:k}=t;Ln&&(a=!1,k=null),null==e?(b=t.el=m("teleport start"),g=t.anchor=m("teleport end"),f(b,n,r),f(g,n,r),b=t.target=vi(t.props,h),r=t.targetAnchor=v(""),b?(f(r,b),s=s||hi(b)):x||oe("Invalid Teleport target on mount:",b,`(${typeof b})`),y=(e,t)=>{16&S&&u(C,e,t,o,i,s,l,a)},x?y(n,g):b&&y(b,r)):(t.el=e.el,g=t.anchor=e.anchor,y=t.target=e.target,b=t.targetAnchor=e.targetAnchor,w=(r=fi(e.props))?n:y,_=r?g:b,s=s||hi(y),k?(d(e.dynamicChildren,k,w,o,i,s,l),pi(e,t,!0)):a||p(e,t,w,_,o,i,s,l,!1),x?r||mi(t,n,g,c,1):(t.props&&t.props.to)!==(e.props&&e.props.to)?(w=t.target=vi(t.props,h))?mi(t,w,null,c,0):oe("Invalid Teleport target on update:",y,`(${typeof y})`):r&&mi(t,y,b,c,1)),gi(t)},remove(e,t,n,r,{um:o,o:{remove:i}},s){var{shapeFlag:e,children:l,anchor:a,targetAnchor:c,target:u,props:p}=e;if(u&&i(c),(s||!fi(p))&&(i(a),16&e))for(let e=0;e<l.length;e++){var d=l[e];o(d,t,n,!0,!!d.dynamicChildren)}},move:mi,hydrate:function(t,n,r,o,i,s,{o:{nextSibling:l,parentNode:e,querySelector:a}},c){const u=n.target=vi(n.props,a);if(u){a=u._lpa||u.firstChild;if(16&n.shapeFlag)if(fi(n.props))n.anchor=c(l(t),n,e(t),r,o,i,s),n.targetAnchor=a;else{n.anchor=l(t);let e=a;for(;e;)if((e=l(e))&&8===e.nodeType&&"teleport anchor"===e.data){n.targetAnchor=e,u._lpa=n.targetAnchor&&l(n.targetAnchor);break}c(a,n,u,r,o,i,s)}gi(n)}return n.anchor&&l(n.anchor)}};function gi(t){const n=t.ctx;if(n&&n.ut){let e=t.children[0].el;for(;e!==t.targetAnchor;)1===e.nodeType&&e.setAttribute("data-v-owner",n.uid),e=e.nextSibling;n.ut()}}const ie=Symbol("Fragment"),yi=Symbol("Text"),se=Symbol("Comment"),bi=Symbol("Static"),_i=[];let c=null;function wi(e=!1){_i.push(c=e?null:[])}function xi(){_i.pop(),c=_i[_i.length-1]||null}let Si=1;function Ci(e){Si+=e}function ki(e){return e.dynamicChildren=0<Si?c||le:null,xi(),0<Si&&c&&c.push(e),e}function Ti(e,t,n,r,o){return ki(P(e,t,n,r,o,!0))}function Ei(e){return!!e&&!0===e.__v_isVNode}function Ni(e,t){return 6&t.shapeFlag&&Bn.has(t.type)?(e.shapeFlag&=-257,void(t.shapeFlag&=-513)):e.type===t.type&&e.key===t.key}let Oi;const $i="__vInternal",Ai=({key:e})=>null!=e?e:null,Ri=({ref:e,ref_key:t,ref_for:n})=>null!=e?ce(e)||q(e)||ne(e)?{i:h,r:e,k:t,f:!!n}:e:null;function Ii(e,t=null,n=null,r=0,o=null,i=e===ie?0:1,s=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ai(t),ref:t&&Ri(t),scopeId:sr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:h};return l?(Bi(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=ce(n)?8:16),a.key!=a.key&&oe("VNode created with invalid key (NaN). VNode type:",a.type),0<Si&&!s&&c&&(0<a.patchFlag||6&i)&&32!==a.patchFlag&&c.push(a),a}const P=(...e)=>{var[e,n=null,t=null,r=0,o=null,i=!1]=[...Oi?Oi(e,h):e];if(e&&e!==fo||(e||oe(`Invalid vnode type when creating vnode: ${e}.`),e=se),Ei(e)){const l=Fi(e,n,!0);return t&&Bi(l,t),0<Si&&!i&&c&&(6&l.shapeFlag?c[c.indexOf(e)]=l:c.push(l)),l.patchFlag|=-2,l}if(us(e)&&(e=e.__vccOpts),n){let{class:e,style:t}=n=Pi(n);e&&!ce(e)&&(n.class=T(e)),re(t)&&(qt(t)&&!ae(t)&&(t=$({},t)),n.style=a(t))}var s=ce(e)?1:br(e)?128:di(e)?64:re(e)?4:ne(e)?2:0;return 4&s&&qt(e)&&oe("Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`.",`
-Component that was made reactive: `,e=m(e)),Ii(e,n,t,r,o,s,i,!0)};function Pi(e){return e?qt(e)||$i in e?$({},e):e:null}function Fi(e,t,n=!1){const{props:r,ref:o,patchFlag:i,children:s}=e;var l=t?Ui(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Ai(l),ref:t&&t.ref?n&&o?ae(o)?o.concat(Ri(t)):[o,Ri(t)]:Ri(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:-1===i&&ae(s)?s.map(Mi):s,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ie?-1===i?16:16|i:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Fi(e.ssContent),ssFallback:e.ssFallback&&Fi(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Mi(e){const t=Fi(e);return ae(e.children)&&(t.children=e.children.map(Mi)),t}function ji(e=" ",t=0){return P(yi,null,e,t)}function Vi(e){return null==e||"boolean"==typeof e?P(se):ae(e)?P(ie,null,e.slice()):"object"==typeof e?Li(e):P(yi,null,String(e))}function Li(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:Fi(e)}function Bi(e,t){let n=0;var r=e["shapeFlag"];if(null==t)t=null;else if(ae(t))n=16;else if("object"==typeof t){if(65&r){const i=t.default;return void(i&&(i._c&&(i._d=!1),Bi(e,i()),i._c&&(i._d=!0)))}n=32;var o=t._;o||$i in t?3===o&&h&&(1===h.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=h}else ne(t)?(t={default:t,_ctx:h},n=32):(t=String(t),64&r?(n=16,t=[ji(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ui(...t){const n={};for(let e=0;e<t.length;e++){var r=t[e];for(const i in r)if("class"===i)n.class!==r.class&&(n.class=T([n.class,r.class]));else if("style"===i)n.style=a([n.style,r.style]);else if(K(i)){const s=n[i];var o=r[i];!o||s===o||ae(s)&&s.includes(o)||(n[i]=s?[].concat(s,o):o)}else""!==i&&(n[i]=r[i])}return n}function Di(e,t,n,r=null){yn(e,t,7,[n,r])}const Hi=Jo();let zi=0;let _=null;const Wi=()=>_||h,Ki=e=>{(_=e).scope.on()},Gi=()=>{_&&_.scope.off(),_=null},Ji=e("slot,component");function qi(e,t){const n=t.isNativeTag||z;(Ji(e)||n(e))&&oe("Do not use built-in or reserved HTML elements as component id: "+e)}function Yi(e){return 4&e.vnode.shapeFlag}let Zi=!1;function Xi(e,t,n){if(ne(t))e.render=t;else if(re(t)){Ei(t)&&oe("setup() should not return VNodes directly - return a render function instead."),e.devtoolsRawSetupState=t,e.setupState=ln(t);{var r=e;const{ctx:o,setupState:i}=r;Object.keys(m(i)).forEach(e=>{i.__isScriptSetup||(yo(e[0])?oe(`setup() return property ${JSON.stringify(e)} should not start with "$" or "_" `+"which are reserved prefixes for Vue internals."):Object.defineProperty(o,e,{enumerable:!0,configurable:!0,get:()=>i[e],set:te}))})}}else void 0!==t&&oe("setup() should return an object. Received: "+(null===t?"null":typeof t));rs(e,n)}let Qi,es;function ts(e){Qi=e,es=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,wo))}}const ns=()=>!Qi;function rs(e,t){const n=e.type;var r,o,i,s,l;e.render||(t||!Qi||n.render||(r=n.template||ko(e).template)&&(oi(e,"compile"),{isCustomElement:l,compilerOptions:o}=e.appContext.config,{delimiters:i,compilerOptions:s}=n,l=$($({isCustomElement:l,delimiters:i},o),s),n.render=Qi(r,l),ii(e,"compile")),e.render=n.render||te,es&&es(e)),Ki(e),Je(),So(e),qe(),Gi(),n.render||e.render!==te||t||(!Qi&&n.template?oe('Component provided template option but runtime compilation is not supported in this build of Vue. Use "vue.global.js" instead.'):oe("Component is missing template or render function."))}function os(r){let e;return Object.freeze({get attrs(){return e=e||(n=r,new Proxy(n.attrs,{get(e,t){return ur(),f(n,"get","$attrs"),e[t]},set(){return oe("setupContext.attrs is readonly."),!1},deleteProperty(){return oe("setupContext.attrs is readonly."),!1}}));var n},get slots(){return zt(r.slots)},get emit(){return(e,...t)=>r.emit(e,...t)},expose:t=>{if(r.exposed&&oe("expose() should be called only once per setup()."),null!=t){let e=typeof t;"object"===e&&(ae(t)?e="array":q(t)&&(e="ref")),"object"!==e&&oe(`expose() should be passed a plain object, received ${e}.`)}r.exposed=t||{}}})}function is(n){if(n.exposed)return n.exposeProxy||(n.exposeProxy=new Proxy(ln(Yt(n.exposed)),{get(e,t){return t in e?e[t]:t in go?go[t](n):void 0},has(e,t){return t in e||t in go}}))}const ss=/(?:^|[-_])(\w)/g,ls=e=>e.replace(ss,e=>e.toUpperCase()).replace(/[-_]/g,"");function as(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function cs(e,n,t=!1){let r=as(n);var o;return!(r=!r&&n.__file&&(o=n.__file.match(/([^/\\]+)\.\w+$/))?o[1]:r)&&e&&e.parent&&(o=e=>{for(const t in e)if(e[t]===n)return t},r=o(e.components||e.parent.type.components)||o(e.appContext.components)),r?ls(r):t?"App":"Anonymous"}function us(e){return ne(e)&&"__vccOpts"in e}const ps=(n,r)=>{{var[n,r,o=!1]=[n,r,Zi];let e,t;var i=ne(n);t=i?(e=n,()=>{console.warn("Write operation failed: computed value is readonly")}):(e=n.get,n.set);const s=new pn(e,t,i||!t,o);return r&&!o&&(s.effect.onTrack=r.onTrack,s.effect.onTrigger=r.onTrigger),s}},ds=e=>oe(e+"() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.");function fs(){const e=Wi();return e||oe("useContext() called without active instance."),e.setupContext||(e.setupContext=os(e))}function hs(e,t,n){var r=arguments.length;return 2===r?re(t)&&!ae(t)?Ei(t)?P(e,null,[t]):P(e,t):P(e,null,t):(3<r?n=Array.prototype.slice.call(arguments,2):3===r&&Ei(n)&&(n=[n]),P(e,t,n))}ot=Symbol("ssrContext");function vs(){if("undefined"!=typeof window){const t={style:"color:#3ba776"},i={style:"color:#0b1bc9"},s={style:"color:#b62e24"},l={style:"color:#9d288c"};var e={header(e){return re(e)?e.__isVue?["div",t,"VueInstance"]:q(e)?["div",{},["span",t,function(e){if(Jt(e))return"ShallowRef";if(e.effect)return"ComputedRef";return"Ref"}(e)],"<",n(e.value),">"]:Kt(e)?["div",{},["span",t,Jt(e)?"ShallowReactive":"Reactive"],"<",n(e),">"+(Gt(e)?" (readonly)":"")]:Gt(e)?["div",{},["span",t,Jt(e)?"ShallowReadonly":"Readonly"],"<",n(e),">"]:null:null},hasBody(e){return e&&e.__isVue},body(e){if(e&&e.__isVue)return["div",{},...function(e){const t=[];e.type.props&&e.props&&t.push(r("props",m(e.props)));e.setupState!==E&&t.push(r("setup",e.setupState));e.data!==E&&t.push(r("data",m(e.data)));var n=o(e,"computed");n&&t.push(r("computed",n));n=o(e,"inject");n&&t.push(r("injected",n));return t.push(["div",{},["span",{style:l.style+";opacity:0.66"},"$ (internal): "],["object",{object:e}]]),t}(e.$)]}};function r(e,t){return t=$({},t),Object.keys(t).length?["div",{style:"line-height:1.25em;margin-bottom:0.6em"},["div",{style:"color:#476582"},e],["div",{style:"padding-left:1.25em"},...Object.keys(t).map(e=>["div",{},["span",l,e+": "],n(t[e],!1)])]]:["span",{}]}function n(e,t=!0){return"number"==typeof e?["span",i,e]:"string"==typeof e?["span",s,JSON.stringify(e)]:"boolean"==typeof e?["span",l,e]:re(e)?["object",{object:t?m(e):e}]:["span",s,String(e)]}function o(e,t){var n=e.type;if(!ne(n)){const r={};for(const o in e.ctx)!function t(e,n,r){const o=e[r];if(ae(o)&&o.includes(n)||re(o)&&n in o)return!0;if(e.extends&&t(e.extends,n,r))return!0;if(e.mixins&&e.mixins.some(e=>t(e,n,r)))return!0}(n,o,t)||(r[o]=e.ctx[o]);return r}}window.devtoolsFormatters?window.devtoolsFormatters.push(e):window.devtoolsFormatters=[e]}}function ms(e,t){var n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(Ce(n[e],t[e]))return!1;return 0<Si&&c&&c.push(e),!0}const gs="3.2.47";const ys="undefined"!=typeof document?document:null,bs=ys&&ys.createElement("template");var _s={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?ys.createElementNS("http://www.w3.org/2000/svg",e):ys.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>ys.createTextNode(e),createComment:e=>ys.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ys.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){var s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling)){for(;;)if(t.insertBefore(o.cloneNode(!0),n),o===i||!(o=o.nextSibling))break}else{bs.innerHTML=r?`<svg>${e}</svg>`:e;const a=bs.content;if(r){for(var l=a.firstChild;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};const ws=/[^\\];\s*$/,xs=/\s*!important$/;function Ss(t,n,e){var r;ae(e)?e.forEach(e=>Ss(t,n,e)):(null==e&&(e=""),ws.test(e)&&oe(`Unexpected semicolon at the end of '${n}' style value: '${e}'`),n.startsWith("--")?t.setProperty(n,e):(r=function(t,n){var e=ks[n];if(e)return e;let r=R(n);if("filter"!==r&&r in t)return ks[n]=r;r=xe(r);for(let e=0;e<Cs.length;e++){var o=Cs[e]+r;if(o in t)return ks[n]=o}return n}(t,n),xs.test(e)?t.setProperty(v(r),e.replace(xs,""),"important"):t[r]=e))}const Cs=["Webkit","Moz","ms"],ks={};const Ts="http://www.w3.org/1999/xlink";function Es(e,t,n,r){e.addEventListener(t,n,r)}function Ns(e,t,n,r,o=null){const i=e._vei||(e._vei={}),s=i[t];var l,a;r&&s?s.value=r:([l,a]=function(t){let n;if(Os.test(t)){n={};let e;for(;e=t.match(Os);)t=t.slice(0,t.length-e[0].length),n[e[0].toLowerCase()]=!0}var e=":"===t[2]?t.slice(3):v(t.slice(2));return[e,n]}(t),r?Es(e,l,i[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();yn(function(e,t){{if(ae(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(t=>e=>!e._stopped&&t&&t(e))}return t}}(e,n.value),t,5,[e])};return n.value=e,n.attached=Rs(),n}(r,o),a):s&&(r=s,e.removeEventListener(l,r,a),i[t]=void 0))}const Os=/(?:Once|Passive|Capture)$/;let $s=0;const As=Promise.resolve(),Rs=()=>$s||(As.then(()=>$s=0),$s=Date.now());const Is=/^on[a-z]/;function Ps(e,t){const n=Dr(e);class r extends Fs{constructor(e){super(n,e,t)}}return r.def=n,r}class Fs extends("undefined"!=typeof HTMLElement?HTMLElement:class{}){constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):(this.shadowRoot&&oe("Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use `defineSSRCustomElement`."),this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,On(()=>{this._connected||(Ol(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver(e=>{for(const t of e)this._setAttr(t.attributeName)}).observe(this,{attributes:!0});const t=(e,t=!1)=>{var{props:n,styles:r}=e;let o;if(n&&!ae(n))for(const s in n){var i=n[s];(i===Number||i&&i.type===Number)&&(s in this._props&&(this._props[s]=Ne(this._props[s])),(o=o||Object.create(null))[R(s)]=!0)}this._numberProps=o,t&&this._resolveProps(e),this._applyStyles(r),this._update()},e=this._def.__asyncLoader;e?e().then(e=>t(e,!0)):t(this._def)}_resolveProps(e){e=e.props;const t=ae(e)?e:Object.keys(e||{});for(const n of Object.keys(this))"_"!==n[0]&&t.includes(n)&&this._setProp(n,this[n],!0,!1);for(const r of t.map(R))Object.defineProperty(this,r,{get(){return this._getProp(r)},set(e){this._setProp(r,e)}})}_setAttr(e){let t=this.getAttribute(e);e=R(e);this._numberProps&&this._numberProps[e]&&(t=Ne(t)),this._setProp(e,t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute(v(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(v(e),t+""):t||this.removeAttribute(v(e))))}_update(){Ol(this._createVNode(),this.shadowRoot)}_createVNode(){const e=P(this._def,$({},this._props));return this._instance||(e.ce=e=>{(this._instance=e).isCE=!0,e.ceReload=e=>{this._styles&&(this._styles.forEach(e=>this.shadowRoot.removeChild(e)),this._styles.length=0),this._applyStyles(e),this._instance=null,this._update()};const n=(e,t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};e.emit=(e,...t)=>{n(e,t),v(e)!==e&&n(v(e),t)};let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof Fs){e.parent=t._instance,e.provides=t._instance.provides;break}}),e}_applyStyles(e){e&&e.forEach(e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t),(this._styles||(this._styles=[])).push(t)})}}function Ms(e,t){if(1===e.nodeType){const n=e.style;for(const r in t)n.setProperty("--"+r,t[r])}}const js="transition",Vs="animation";var Ls=(e,{slots:t})=>hs(Fr,zs(e),t);Ls.displayName="Transition";const Bs={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};var Us=Ls.props=$({},Fr.props,Bs);const Ds=(e,t=[])=>{ae(e)?e.forEach(e=>e(...t)):e&&e(...t)},Hs=e=>!!e&&(ae(e)?e.some(e=>1<e.length):1<e.length);function zs(e){const t={};for(const E in e)E in Bs||(t[E]=e[E]);if(!1===e.css)return t;const{name:n="v",type:i,duration:r,enterFromClass:s=n+"-enter-from",enterActiveClass:o=n+"-enter-active",enterToClass:l=n+"-enter-to",appearFromClass:a=s,appearActiveClass:c=o,appearToClass:u=l,leaveFromClass:p=n+"-leave-from",leaveActiveClass:d=n+"-leave-active",leaveToClass:f=n+"-leave-to"}=e;var h=null==(h=r)?null:re(h)?[Ws(h.enter),Ws(h.leave)]:[h=Ws(h),h];const v=h&&h[0],m=h&&h[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:b,onLeave:_,onLeaveCancelled:w,onBeforeAppear:x=g,onAppear:S=y,onAppearCancelled:C=b}=t,k=(e,t,n)=>{Gs(e,t?u:l),Gs(e,t?c:o),n&&n()},T=(e,t)=>{e._isLeaving=!1,Gs(e,p),Gs(e,f),Gs(e,d),t&&t()};h=o=>(e,t)=>{const n=o?S:y,r=()=>k(e,o,t);Ds(n,[e,r]),Js(()=>{Gs(e,o?a:s),Ks(e,o?u:l),Hs(n)||Ys(e,i,v,r)})};return $(t,{onBeforeEnter(e){Ds(g,[e]),Ks(e,s),Ks(e,o)},onBeforeAppear(e){Ds(x,[e]),Ks(e,a),Ks(e,c)},onEnter:h(!1),onAppear:h(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>T(e,t);Ks(e,p),el(),Ks(e,d),Js(()=>{e._isLeaving&&(Gs(e,p),Ks(e,f),Hs(_)||Ys(e,i,m,n))}),Ds(_,[e,n])},onEnterCancelled(e){k(e,!1),Ds(b,[e])},onAppearCancelled(e){k(e,!0),Ds(C,[e])},onLeaveCancelled(e){T(e),Ds(w,[e])}})}function Ws(e){e=Ne(e);return vn(e,"<transition> explicit duration"),e}function Ks(t,e){e.split(/\s+/).forEach(e=>e&&t.classList.add(e)),(t._vtc||(t._vtc=new Set)).add(e)}function Gs(t,e){e.split(/\s+/).forEach(e=>e&&t.classList.remove(e));const n=t["_vtc"];n&&(n.delete(e),n.size||(t._vtc=void 0))}function Js(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let qs=0;function Ys(t,e,n,r){const o=t._endId=++qs,i=()=>{o===t._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:l,propCount:a}=Zs(t,e);if(!s)return r();const c=s+"end";let u=0;const p=()=>{t.removeEventListener(c,d),i()},d=e=>{e.target===t&&++u>=a&&p()};setTimeout(()=>{u<a&&p()},l+1),t.addEventListener(c,d)}function Zs(e,t){const n=window.getComputedStyle(e);var e=e=>(n[e]||"").split(", "),r=e(js+"Delay"),o=e(js+"Duration"),r=Xs(r,o),i=e(Vs+"Delay"),s=e(Vs+"Duration"),i=Xs(i,s);let l=null,a=0,c=0;t===js?0<r&&(l=js,a=r,c=o.length):t===Vs?0<i&&(l=Vs,a=i,c=s.length):(a=Math.max(r,i),l=0<a?i<r?js:Vs:null,c=l?(l===js?o:s).length:0);t=l===js&&/\b(transform|all)(,|$)/.test(e(js+"Property").toString());return{type:l,timeout:a,propCount:c,hasTransform:t}}function Xs(n,e){for(;n.length<e.length;)n=n.concat(n);return Math.max(...e.map((e,t)=>Qs(e)+Qs(n[t])))}function Qs(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function el(){document.body.offsetHeight}const tl=new WeakMap,nl=new WeakMap;Us={name:"TransitionGroup",props:$({},Us,{tag:String,moveClass:String}),setup(i,{slots:o}){const s=Wi(),l=Pr();let a,c;return no(()=>{if(a.length){const o=i.moveClass||`${i.name||"v"}-move`;if(function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach(e=>{e.split(/\s+/).forEach(e=>e&&r.classList.remove(e))});n.split(/\s+/).forEach(e=>e&&r.classList.add(e)),r.style.display="none";const o=1===t.nodeType?t:t.parentNode,i=(o.appendChild(r),Zs(r))["hasTransform"];return o.removeChild(r),i}(a[0].el,s.vnode.el,o)){a.forEach(rl),a.forEach(ol);const e=a.filter(il);el(),e.forEach(e=>{const t=e.el,n=t.style,r=(Ks(t,o),n.transform=n.webkitTransform=n.transitionDuration="",t._moveCb=e=>{e&&e.target!==t||e&&!/transform$/.test(e.propertyName)||(t.removeEventListener("transitionend",r),t._moveCb=null,Gs(t,o))});t.addEventListener("transitionend",r)})}}}),()=>{var e=m(i),t=zs(e),e=e.tag||ie;a=c,c=o.default?Ur(o.default()):[];for(let e=0;e<c.length;e++){var n=c[e];null!=n.key?Br(n,jr(n,t,l,s)):oe("<TransitionGroup> children must be keyed.")}if(a)for(let e=0;e<a.length;e++){const r=a[e];Br(r,jr(r,t,l,s)),tl.set(r,r.el.getBoundingClientRect())}return P(e,null,c)}}};function rl(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function ol(e){nl.set(e,e.el.getBoundingClientRect())}function il(e){var t=tl.get(e),n=nl.get(e),r=t.left-n.left,t=t.top-n.top;if(r||t){const o=e.el.style;return o.transform=o.webkitTransform=`translate(${r}px,${t}px)`,o.transitionDuration="0s",e}}const sl=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ae(t)?e=>ke(t,e):t};function ll(e){e.target.composing=!0}function al(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const cl={created(t,{modifiers:{lazy:e,trim:n,number:r}},o){t._assign=sl(o);const i=r||o.props&&"number"===o.props.type;Es(t,e?"change":"input",e=>{if(!e.target.composing){let e=t.value;n&&(e=e.trim()),i&&(e=Ee(e)),t._assign(e)}}),n&&Es(t,"change",()=>{t.value=t.value.trim()}),e||(Es(t,"compositionstart",ll),Es(t,"compositionend",al),Es(t,"change",al))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},i){if(e._assign=sl(i),!e.composing){if(document.activeElement===e&&"range"!==e.type){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&Ee(e.value)===t)return}i=null==t?"":t;e.value!==i&&(e.value=i)}}},ul={deep:!0,created(a,e,t){a._assign=sl(t),Es(a,"change",()=>{const e=a._modelValue;var t=vl(a),n=a.checked;const r=a._assign;if(ae(e)){var o=V(e,t),i=-1!==o;if(n&&!i)r(e.concat(t));else if(!n&&i){const s=[...e];s.splice(o,1),r(s)}}else if(X(e)){const l=new Set(e);n?l.add(t):l.delete(t),r(l)}else r(ml(a,n))})},mounted:pl,beforeUpdate(e,t,n){e._assign=sl(n),pl(e,t,n)}};function pl(e,{value:t,oldValue:n},r){e._modelValue=t,ae(t)?e.checked=-1<V(t,r.props.value):X(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=j(t,ml(e,!0)))}const dl={created(e,{value:t},n){e.checked=j(t,n.props.value),e._assign=sl(n),Es(e,"change",()=>{e._assign(vl(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=sl(r),t!==n&&(e.checked=j(t,r.props.value))}},fl={deep:!0,created(t,{value:e,modifiers:{number:n}},r){const o=X(e);Es(t,"change",()=>{var e=Array.prototype.filter.call(t.options,e=>e.selected).map(e=>n?Ee(vl(e)):vl(e));t._assign(t.multiple?o?new Set(e):e:e[0])}),t._assign=sl(r)},mounted(e,{value:t}){hl(e,t)},beforeUpdate(e,t,n){e._assign=sl(n)},updated(e,{value:t}){hl(e,t)}};function hl(n,r){var o=n.multiple;if(!o||ae(r)||X(r)){for(let e=0,t=n.options.length;e<t;e++){const s=n.options[e];var i=vl(s);if(o)ae(r)?s.selected=-1<V(r,i):s.selected=r.has(i);else if(j(vl(s),r))return void(n.selectedIndex!==e&&(n.selectedIndex=e))}o||-1===n.selectedIndex||(n.selectedIndex=-1)}else oe("<select multiple v-model> expects an Array or Set value for its binding, "+`but got ${Object.prototype.toString.call(r).slice(8,-1)}.`)}function vl(e){return"_value"in e?e._value:e.value}function ml(e,t){var n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}var gl={created(e,t,n){yl(e,t,n,null,"created")},mounted(e,t,n){yl(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){yl(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){yl(e,t,n,r,"updated")}};function yl(e,t,n,r,o){const i=function(e,t){switch(e){case"SELECT":return fl;case"TEXTAREA":return cl;default:switch(t){case"checkbox":return ul;case"radio":return dl;default:return cl}}}(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}const bl=["ctrl","shift","alt","meta"],_l={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(t,n)=>bl.some(e=>t[e+"Key"]&&!n.includes(e))};const wl={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"};var xl={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Sl(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Sl(e,!0),r.enter(e)):r.leave(e,()=>{Sl(e,!1)}):Sl(e,t))},beforeUnmount(e,{value:t}){Sl(e,t)}};function Sl(e,t){e.style.display=t?e._vod:"none"}const Cl=$({patchProp:(e,n,r,o,t=!1,i,s,l,a)=>{if("class"===n)f=o,h=t,v=(d=e)._vtc,null==(f=v?(f?[f,...v]:[...v]).join(" "):f)?d.removeAttribute("class"):h?d.setAttribute("class",f):d.className=f;else if("style"===n){v=e;h=r;var c=o;const m=v.style;d=ce(c);if(c&&!d){if(h&&!ce(h))for(const g in h)null==c[g]&&Ss(m,g,"");for(const y in c)Ss(m,y,c[y])}else{f=m.display;d?h!==c&&(m.cssText=c):h&&v.removeAttribute("style"),"_vod"in v&&(m.display=f)}}else if(K(n))G(n)||Ns(e,n,0,o,s);else if("."===n[0]?(n=n.slice(1),1):"^"===n[0]?(n=n.slice(1),0):function(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&Is.test(t)&&ne(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return;if("form"===t)return;if("list"===t&&"INPUT"===e.tagName)return;if("type"===t&&"TEXTAREA"===e.tagName)return;if(Is.test(t)&&ce(n))return;return t in e}(e,n,o,t)){r=e;var u=n;var p=o;if("innerHTML"===u||"textContent"===u)return void(i&&a(i,s,l),r[u]=null==p?"":p);if("value"===u&&"PROGRESS"!==r.tagName&&!r.tagName.includes("-"))return void(a=null==(r._value=p)?"":p,r.value===a&&"OPTION"!==r.tagName||(r.value=a),null==p&&r.removeAttribute(u));let t=!1;""!==p&&null!=p||("boolean"==(i=typeof r[u])?p=M(p):null==p&&"string"==i?(p="",t=!0):"number"==i&&(p=0,t=!0));try{r[u]=p}catch(e){t||oe(`Failed setting prop "${u}" on <${r.tagName.toLowerCase()}>: `+`value ${p} is invalid.`,e)}t&&r.removeAttribute(u)}else"true-value"===n?e._trueValue=o:"false-value"===n&&(e._falseValue=o),s=e,l=n,a=o,(i=t)&&l.startsWith("xlink:")?null==a?s.removeAttributeNS(Ts,l.slice(6,l.length)):s.setAttributeNS(Ts,l,a):(i=F(l),null==a||i&&!M(a)?s.removeAttribute(l):s.setAttribute(l,i?"":a));var d,f,h,v}},_s);let kl,Tl=!1;function El(){return kl=kl||li(Cl)}function Nl(){return kl=Tl?kl:ai(Cl),Tl=!0,kl}const Ol=(...e)=>{El().render(...e)},$l=(...e)=>{Nl().hydrate(...e)};function Al(e){Object.defineProperty(e.config,"isNativeTag",{value:e=>n(e)||N(e),writable:!1})}function Rl(e){if(ns()){const t=e.config.isCustomElement,n=(Object.defineProperty(e.config,"isCustomElement",{get(){return t},set(){oe("The `isCustomElement` config option is deprecated. Use `compilerOptions.isCustomElement` instead.")}}),e.config.compilerOptions),r='The `compilerOptions` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, `compilerOptions` must be passed to `@vue/compiler-dom` in the build setup instead.\n- For vue-loader: pass it via vue-loader\'s `compilerOptions` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-dom';Object.defineProperty(e.config,"compilerOptions",{get(){return oe(r),n},set(){oe(r)}})}}function Il(e){var t;return ce(e)?((t=document.querySelector(e))||oe(`Failed to mount app: mount target selector "${e}" returned null.`),t):(window.ShadowRoot&&e instanceof window.ShadowRoot&&"closed"===e.mode&&oe('mounting on a ShadowRoot with `{mode: "closed"}` may lead to unpredictable bugs'),e)}_s=te;function Pl(e){throw e}function Fl(e){console.warn("[Vue warn] "+e.message)}function B(e,t,n,r){n=(n||Ml)[e]+(r||"");const o=new SyntaxError(String(n));return o.code=e,o.loc=t,o}const Ml={[0]:"Illegal comment.",1:"CDATA section is allowed only in XML context.",2:"Duplicate attribute.",3:"End tag cannot have attributes.",4:"Illegal '/' in tags.",5:"Unexpected EOF in tag.",6:"Unexpected EOF in CDATA section.",7:"Unexpected EOF in comment.",8:"Unexpected EOF in script.",9:"Unexpected EOF in tag.",10:"Incorrectly closed comment.",11:"Incorrectly opened comment.",12:"Illegal tag name. Use '&lt;' to print '<'.",13:"Attribute value was expected.",14:"End tag name was expected.",15:"Whitespace was expected.",16:"Unexpected '\x3c!--' in comment.",17:"Attribute name cannot contain U+0022 (\"), U+0027 ('), and U+003C (<).",18:"Unquoted attribute value cannot contain U+0022 (\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).",19:"Attribute name cannot start with '='.",21:"'<?' is allowed only in XML context.",20:"Unexpected null character.",22:"Illegal '/' in tags.",23:"Invalid end tag.",24:"Element is missing end tag.",25:"Interpolation end sign was not found.",27:"End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.",26:"Legal directive name was expected.",28:"v-if/v-else-if is missing expression.",29:"v-if/else branches must use unique keys.",30:"v-else/v-else-if has no adjacent v-if or v-else-if.",31:"v-for is missing expression.",32:"v-for has invalid expression.",33:"<template v-for> key should be placed on the <template> tag.",34:"v-bind is missing expression.",35:"v-on is missing expression.",36:"Unexpected custom directive on <slot> outlet.",37:"Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.",38:"Duplicate slot names found. ",39:"Extraneous children found when component already has explicitly named default slot. These children will be ignored.",40:"v-slot can only be used on components or <template> tags.",41:"v-model is missing expression.",42:"v-model value must be a valid JavaScript member expression.",43:"v-model cannot be used on v-for or v-slot scope variables because they are not writable.",44:`v-model cannot be used on a prop, because local prop bindings are not writable.
-Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,45:"Error parsing JavaScript expression: ",46:"<KeepAlive> expects exactly one child component.",47:'"prefixIdentifiers" option is not supported in this build of compiler.',48:"ES module mode is not supported in this build of compiler.",49:'"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.',50:'"scopeId" option is only supported in module mode.',51:""},jl=Symbol("Fragment"),Vl=Symbol("Teleport"),Ll=Symbol("Suspense"),Bl=Symbol("KeepAlive"),Ul=Symbol("BaseTransition"),Dl=Symbol("openBlock"),Hl=Symbol("createBlock"),zl=Symbol("createElementBlock"),Wl=Symbol("createVNode"),Kl=Symbol("createElementVNode"),Gl=Symbol("createCommentVNode"),Jl=Symbol("createTextVNode"),ql=Symbol("createStaticVNode"),Yl=Symbol("resolveComponent"),Zl=Symbol("resolveDynamicComponent"),Xl=Symbol("resolveDirective");var Ql=Symbol("resolveFilter");const ea=Symbol("withDirectives"),ta=Symbol("renderList"),na=Symbol("renderSlot"),ra=Symbol("createSlots"),oa=Symbol("toDisplayString"),ia=Symbol("mergeProps"),sa=Symbol("normalizeClass"),la=Symbol("normalizeStyle"),aa=Symbol("normalizeProps"),ca=Symbol("guardReactiveProps"),ua=Symbol("toHandlers"),pa=Symbol("camelize");var da=Symbol("capitalize");const fa=Symbol("toHandlerKey"),ha=Symbol("setBlockTracking");var va=Symbol("pushScopeId"),ma=Symbol("popScopeId");const ga=Symbol("withCtx");var ya=Symbol("unref"),ba=Symbol("isRef");const _a=Symbol("withMemo"),wa=Symbol("isMemoSame"),xa={[jl]:"Fragment",[Vl]:"Teleport",[Ll]:"Suspense",[Bl]:"KeepAlive",[Ul]:"BaseTransition",[Dl]:"openBlock",[Hl]:"createBlock",[zl]:"createElementBlock",[Wl]:"createVNode",[Kl]:"createElementVNode",[Gl]:"createCommentVNode",[Jl]:"createTextVNode",[ql]:"createStaticVNode",[Yl]:"resolveComponent",[Zl]:"resolveDynamicComponent",[Xl]:"resolveDirective",[Ql]:"resolveFilter",[ea]:"withDirectives",[ta]:"renderList",[na]:"renderSlot",[ra]:"createSlots",[oa]:"toDisplayString",[ia]:"mergeProps",[sa]:"normalizeClass",[la]:"normalizeStyle",[aa]:"normalizeProps",[ca]:"guardReactiveProps",[ua]:"toHandlers",[pa]:"camelize",[da]:"capitalize",[fa]:"toHandlerKey",[ha]:"setBlockTracking",[va]:"pushScopeId",[ma]:"popScopeId",[ga]:"withCtx",[ya]:"unref",[ba]:"isRef",[_a]:"withMemo",[wa]:"isMemoSame"};const Sa={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function Ca(e,t,n,r,o,i,s,l=!1,a=!1,c=!1,u=Sa){return e&&(l?(e.helper(Dl),e.helper(Za(e.inSSR,c))):e.helper(Ya(e.inSSR,c)),s&&e.helper(ea)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:l,disableTracking:a,isComponent:c,loc:u}}function ka(e,t=Sa){return{type:17,loc:t,elements:e}}function Ta(e,t=Sa){return{type:15,loc:t,properties:e}}function U(e,t){return{type:16,loc:Sa,key:ce(e)?D(e,!0):e,value:t}}function D(e,t=!1,n=Sa,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Ea(e,t=Sa){return{type:8,loc:t,children:e}}function H(e,t=[],n=Sa){return{type:14,loc:n,callee:e,arguments:t}}function Na(e,t=void 0,n=!1,r=!1,o=Sa){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Oa(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:Sa}}const $a=e=>4===e.type&&e.isStatic,Aa=(e,t)=>e===t||e===v(t);function Ra(e){return Aa(e,"Teleport")?Vl:Aa(e,"Suspense")?Ll:Aa(e,"KeepAlive")?Bl:Aa(e,"BaseTransition")?Ul:void 0}const Ia=/^\d|[^\$\w]/,Pa=e=>!Ia.test(e),Fa=/[A-Za-z_$\xA0-\uFFFF]/,Ma=/[\.\?\w$\xA0-\uFFFF]/,ja=/\s+[.[]\s*|\s*[.[]\s+/g;const Va=t=>{t=t.trim().replace(ja,e=>e.trim());let n=0,r=[],o=0,i=0,s=null;for(let e=0;e<t.length;e++){var l=t.charAt(e);switch(n){case 0:if("["===l)r.push(n),n=1,o++;else if("("===l)r.push(n),n=2,i++;else if(!(0===e?Fa:Ma).test(l))return!1;break;case 1:"'"===l||'"'===l||"`"===l?(r.push(n),n=3,s=l):"["===l?o++:"]"!==l||--o||(n=r.pop());break;case 2:if("'"===l||'"'===l||"`"===l)r.push(n),n=3,s=l;else if("("===l)i++;else if(")"===l){if(e===t.length-1)return!1;--i||(n=r.pop())}break;case 3:l===s&&(n=r.pop(),s=null)}}return!o&&!i};function La(e,t,n){const r={source:e.source.slice(t,t+n),start:Ba(e.start,e.source,t),end:e.end};return null!=n&&(r.end=Ba(e.start,e.source,t+n)),r}function Ba(e,t,n=t.length){return Ua($({},e),t,n)}function Ua(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function Da(e,t){if(!e)throw new Error(t||"unexpected compiler condition")}function Ha(t,n,r=!1){for(let e=0;e<t.props.length;e++){var o=t.props[e];if(7===o.type&&(r||o.exp)&&(ce(n)?o.name===n:n.test(o.name)))return o}}function za(t,n,r=!1,o=!1){for(let e=0;e<t.props.length;e++){var i=t.props[e];if(6===i.type){if(!r&&i.name===n&&(i.value||o))return i}else if("bind"===i.name&&(i.exp||o)&&Wa(i.arg,n))return i}}function Wa(e,t){return e&&$a(e)&&e.content===t}function Ka(e){return 5===e.type||2===e.type}function Ga(e){return 7===e.type&&"slot"===e.name}function Ja(e){return 1===e.type&&3===e.tagType}function qa(e){return 1===e.type&&2===e.tagType}function Ya(e,t){return e||t?Wl:Kl}function Za(e,t){return e||t?Hl:zl}const Xa=new Set([aa,ca]);function Qa(e,t,n){let r,o=13===e.type?e.props:e.arguments[2],i=[],s;var l;if(o&&!ce(o)&&14===o.type&&(l=function e(t,n=[]){if(t&&!ce(t)&&14===t.type){var r=t.callee;if(!ce(r)&&Xa.has(r))return e(t.arguments[0],n.concat(t))}return[t,n]}(o),o=l[0],i=l[1],s=i[i.length-1]),null==o||ce(o))r=Ta([t]);else if(14===o.type){const a=o.arguments[0];ce(a)||15!==a.type?o.callee===ua?r=H(n.helper(ia),[Ta([t]),o]):o.arguments.unshift(Ta([t])):ec(t,a)||a.properties.unshift(t),r=r||o}else 15===o.type?(ec(t,o)||o.properties.unshift(t),r=o):(r=H(n.helper(ia),[Ta([t]),o]),s&&s.callee===ca&&(s=i[i.length-2]));13===e.type?s?s.arguments[0]=r:e.props=r:s?s.arguments[0]=r:e.arguments[2]=r}function ec(e,t){let n=!1;if(4===e.key.type){const r=e.key.content;n=t.properties.some(e=>4===e.key.type&&e.key.content===r)}return n}function tc(n,e){return`_${e}_`+n.replace(/[^\w]/g,(e,t)=>"-"===e?"_":n.charCodeAt(t).toString())}function nc(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Ya(r,e.isComponent)),t(Dl),t(Za(r,e.isComponent)))}const rc=/&(gt|lt|amp|apos|quot);/g,oc={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},ic={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:z,isPreTag:z,isCustomElement:z,decodeEntities:e=>e.replace(rc,(e,t)=>oc[t]),onError:Pl,onWarn:Fl,comments:!0};function sc(e,t={}){var e=function(e,t){const n=$({},ic);let r;for(r in t)n[r]=(void 0===t[r]?ic:t)[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),t=hc(e);return[e,t=Sa]=[lc(e,0,[]),vc(e,t)],{type:0,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}function lc(n,e,r){var o=mc(r),i=o?o.ns:0;const s=[];for(;!function(e,t,n){var r=e.source;switch(t){case 0:if(g(r,"</"))for(let e=n.length-1;0<=e;--e)if(bc(r,n[e].tag))return 1;break;case 1:case 2:var o=mc(n);if(o&&bc(r,o.tag))return 1;break;case 3:if(g(r,"]]>"))return 1}return!r}(n,e,r);){var l=n.source;let t=void 0;if(0===e||1===e)if(!n.inVPre&&g(l,n.options.delimiters[0]))t=function(e,t){var[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void w(e,25);const i=hc(e),s=(y(e,n.length),hc(e)),l=hc(e),a=o-n.length,c=e.source.slice(0,a),u=fc(e,a,t),p=u.trim(),d=u.indexOf(p);0<d&&Ua(s,c,d);o=a-(u.length-p.length-d);return Ua(l,c,o),y(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:p,loc:vc(e,s,l)},loc:vc(e,i)}}(n,e);else if(0===e&&"<"===l[0])if(1===l.length)w(n,5,1);else if("!"===l[1])t=g(l,"\x3c!--")?function(n){var e=hc(n);let r;var o=/--(\!)?>/.exec(n.source);if(o){o.index<=3&&w(n,0),o[1]&&w(n,10),r=n.source.slice(4,o.index);const i=n.source.slice(0,o.index);let e=1,t=0;for(;-1!==(t=i.indexOf("\x3c!--",e));)y(n,t-e+1),t+4<i.length&&w(n,16),e=t+1;y(n,o.index+o[0].length-e+1)}else r=n.source.slice(4),y(n,n.source.length),w(n,7);return{type:3,content:r,loc:vc(n,e)}}(n):g(l,"<!DOCTYPE")?cc(n):g(l,"<![CDATA[")?0!==i?function(e,t){y(e,9);t=lc(e,3,t);0===e.source.length?w(e,6):y(e,3);return t}(n,r):(w(n,1),cc(n)):(w(n,11),cc(n));else if("/"===l[1])if(2===l.length)w(n,5,2);else{if(">"===l[2]){w(n,14,2),y(n,3);continue}if(/[a-z]/i.test(l[2])){w(n,23),pc(n,1,o);continue}w(n,12,2),t=cc(n)}else/[a-z]/i.test(l[1])?t=function(e,t){const n=e.inPre,r=e.inVPre,o=mc(t),i=pc(e,0,o),s=e.inPre&&!n,l=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),l&&(e.inVPre=!1),i;t.push(i);var a=e.options.getTextMode(i,o),a=lc(e,a,t);t.pop(),i.children=a,bc(e.source,i.tag)?pc(e,1,o):(w(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()&&(t=a[0])&&g(t.loc.source,"\x3c!--")&&w(e,8));i.loc=vc(e,i.loc.start),s&&(e.inPre=!1);l&&(e.inVPre=!1);return i}(n,r):"?"===l[1]?(w(n,21,1),t=cc(n)):w(n,12,1);if(t=t||function(t,e){var n=3===e?["]]>"]:["<",t.options.delimiters[0]];let r=t.source.length;for(let e=0;e<n.length;e++){var o=t.source.indexOf(n[e],1);-1!==o&&r>o&&(r=o)}var i=hc(t),e=fc(t,r,e);return{type:2,content:e,loc:vc(t,i)}}(n,e),ae(t))for(let e=0;e<t.length;e++)ac(s,t[e]);else ac(s,t)}let t=!1;if(2!==e&&1!==e){var a,c,u="preserve"!==n.options.whitespace;for(let e=0;e<s.length;e++){const p=s[e];2===p.type?n.inPre?p.content=p.content.replace(/\r\n/g,"\n"):/[^\t\r\n\f ]/.test(p.content)?u&&(p.content=p.content.replace(/[\t\r\n\f ]+/g," ")):(a=s[e-1],c=s[e+1],!a||!c||u&&(3===a.type&&3===c.type||3===a.type&&1===c.type||1===a.type&&3===c.type||1===a.type&&1===c.type&&/[\r\n]/.test(p.content))?(t=!0,s[e]=null):p.content=" "):3!==p.type||n.options.comments||(t=!0,s[e]=null)}if(n.inPre&&o&&n.options.isPreTag(o.tag)){const d=s[0];d&&2===d.type&&(d.content=d.content.replace(/^\r?\n/,""))}}return t?s.filter(Boolean):s}function ac(e,t){if(2===t.type){const n=mc(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function cc(e){var t=hc(e),n="?"===e.source[1]?1:2;let r;var o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),y(e,e.source.length)):(r=e.source.slice(n,o),y(e,o+1)),{type:3,content:r,loc:vc(e,t)}}const uc=e("if,else,else-if,for,slot");function pc(t,e,n){var r=hc(t),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(t.source),i=o[1],n=t.options.getNamespace(i,n),o=(y(t,o[0].length),gc(t),hc(t)),s=t.source;t.options.isPreTag(i)&&(t.inPre=!0);let l=dc(t,e),a=(0===e&&!t.inVPre&&l.some(e=>7===e.type&&"pre"===e.name)&&(t.inVPre=!0,$(t,o),t.source=s,l=dc(t,e).filter(e=>"v-pre"!==e.name)),!1);if(0===t.source.length?w(t,9):(a=g(t.source,"/>"),1===e&&a&&w(t,4),y(t,a?2:1)),1!==e){let e=0;return t.inVPre||("slot"===i?e=2:"template"===i?l.some(e=>7===e.type&&uc(e.name))&&(e=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return;if("component"===e||/^[A-Z]/.test(e)||Ra(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return 1;for(let e=0;e<t.length;e++){const o=t[e];if(6===o.type){if("is"===o.name&&o.value&&o.value.content.startsWith("vue:"))return 1}else{if("is"===o.name)return 1;"bind"===o.name&&Wa(o.arg,"is")}}}(i,l,t)&&(e=1)),{type:1,ns:n,tag:i,tagType:e,props:l,isSelfClosing:a,children:[],loc:vc(t,r),codegenNode:void 0}}}function dc(e,t){const n=[];for(var r=new Set;0<e.source.length&&!g(e.source,">")&&!g(e.source,"/>");)if(g(e.source,"/"))w(e,22),y(e,1),gc(e);else{1===t&&w(e,3);const o=function(r,e){const o=hc(r),i=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(r.source),s=i[0];e.has(s)&&w(r,2);e.add(s),"="===s[0]&&w(r,19);{const n=/["'<]/g;for(var t;t=n.exec(s);)w(r,17,t.index)}y(r,s.length);let l=void 0;/^[\t\r\n\f ]*=/.test(r.source)&&(gc(r),y(r,1),gc(r),(l=function(e){var t=hc(e);let n;var r=e.source[0],o='"'===r||"'"===r;if(o){y(e,1);r=e.source.indexOf(r);-1===r?n=fc(e,e.source.length,4):(n=fc(e,r,4),y(e,1))}else{var i,s=/^[^\t\r\n\f >]+/.exec(e.source);if(!s)return;const l=/["'<=`]/g;for(;i=l.exec(s[0]);)w(e,18,i.index);n=fc(e,s[0].length,4)}return{content:n,isQuoted:o,loc:vc(e,t)}}(r))||w(r,13));const a=vc(r,o);if(!r.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(s)){const i=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(s);var e=g(s,"."),c=i[1]||(e||g(s,":")?"bind":g(s,"@")?"on":"slot");let n;if(i[2]){var u="slot"===c,p=s.lastIndexOf(i[2]);const a=vc(r,yc(r,o,p),yc(r,o,p+i[2].length+(u&&i[3]||"").length));let e=i[2],t=!0;e.startsWith("[")?(t=!1,e=e.endsWith("]")?e.slice(1,e.length-1):(w(r,27),e.slice(1))):u&&(e+=i[3]||""),n={type:4,content:e,isStatic:t,constType:t?3:0,loc:a}}if(l&&l.isQuoted){const f=l.loc;f.start.offset++,f.start.column++,f.end=Ba(f.start,l.content),f.source=f.source.slice(1,-1)}const d=i[3]?i[3].slice(1).split("."):[];return e&&d.push("prop"),{type:7,name:c,exp:l&&{type:4,content:l.content,isStatic:!1,constType:0,loc:l.loc},arg:n,modifiers:d,loc:a}}!r.inVPre&&g(s,"v-")&&w(r,26);return{type:6,name:s,value:l&&{type:2,content:l.content,loc:l.loc},loc:a}}(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&w(e,15),gc(e)}return n}function fc(e,t,n){const r=e.source.slice(0,t);return y(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function hc(e){var{column:e,line:t,offset:n}=e;return{column:e,line:t,offset:n}}function vc(e,t,n){return{start:t,end:n=n||hc(e),source:e.originalSource.slice(t.offset,n.offset)}}function mc(e){return e[e.length-1]}function g(e,t){return e.startsWith(t)}function y(e,t){const n=e["source"];Ua(e,n,t),e.source=n.slice(t)}function gc(e){var t=/^[\t\r\n\f ]+/.exec(e.source);t&&y(e,t[0].length)}function yc(e,t,n){return Ba(t,e.originalSource.slice(t.offset,n),n)}function w(e,t,n,r=hc(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(B(t,{start:r,end:r,source:""}))}function bc(e,t){return g(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function _c(e,t){!function t(e,n,r=!1){const o=e["children"];const i=o.length;let s=0;for(let e=0;e<o.length;e++){const l=o[e];if(1===l.type&&0===l.tagType){const a=r?0:xc(l,n);if(0<a){if(2<=a){l.codegenNode.patchFlag="-1 /* HOISTED */",l.codegenNode=n.hoist(l.codegenNode),s++;continue}}else{const c=l.codegenNode;if(13===c.type){const u=Tc(c);if((!u||512===u||1===u)&&2<=Cc(l,n)){const p=kc(l);p&&(c.props=n.hoist(p))}c.dynamicProps&&(c.dynamicProps=n.hoist(c.dynamicProps))}}}if(1===l.type){const d=1===l.tagType;d&&n.scopes.vSlot++,t(l,n),d&&n.scopes.vSlot--}else if(11===l.type)t(l,n,1===l.children.length);else if(9===l.type)for(let e=0;e<l.branches.length;e++)t(l.branches[e],n,1===l.branches[e].children.length)}s&&n.transformHoist&&n.transformHoist(o,n,e);s&&s===i&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&ae(e.codegenNode.children)&&(e.codegenNode.children=n.hoist(ka(e.codegenNode.children)))}(e,t,wc(e,e.children[0]))}function wc(e,t){e=e.children;return 1===e.length&&1===t.type&&!qa(t)}function xc(n,r){const o=r["constantCache"];switch(n.type){case 1:if(0!==n.tagType)return 0;var e=o.get(n);if(void 0!==e)return e;const a=n.codegenNode;if(13!==a.type)return 0;if(a.isBlock&&"svg"!==n.tag&&"foreignObject"!==n.tag)return 0;if(Tc(a))return o.set(n,0),0;{let t=3;e=Cc(n,r);if(0===e)return o.set(n,0),0;e<t&&(t=e);for(let e=0;e<n.children.length;e++){var i=xc(n.children[e],r);if(0===i)return o.set(n,0),0;i<t&&(t=i)}if(1<t)for(let e=0;e<n.props.length;e++){var s=n.props[e];if(7===s.type&&"bind"===s.name&&s.exp){s=xc(s.exp,r);if(0===s)return o.set(n,0),0;s<t&&(t=s)}}if(a.isBlock){for(let e=0;e<n.props.length;e++)if(7===n.props[e].type)return o.set(n,0),0;r.removeHelper(Dl),r.removeHelper(Za(r.inSSR,a.isComponent)),a.isBlock=!1,r.helper(Ya(r.inSSR,a.isComponent))}return o.set(n,t),t}case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return xc(n.content,r);case 4:return n.constType;case 8:let t=3;for(let e=0;e<n.children.length;e++){var l=n.children[e];if(!ce(l)&&!pe(l)){l=xc(l,r);if(0===l)return 0;l<t&&(t=l)}}return t;default:return 0}}const Sc=new Set([sa,la,aa,ca]);function Cc(e,n){let r=3;e=kc(e);if(e&&15===e.type){var o=e["properties"];for(let t=0;t<o.length;t++){var{key:i,value:s}=o[t],i=xc(i,n);if(0===i)return i;i<r&&(r=i);let e;if(0===(e=4===s.type?xc(s,n):14===s.type?function e(t,n){if(14===t.type&&!ce(t.callee)&&Sc.has(t.callee)){if(4===(t=t.arguments[0]).type)return xc(t,n);if(14===t.type)return e(t,n)}return 0}(s,n):0))return e;e<r&&(r=e)}}return r}function kc(e){e=e.codegenNode;if(13===e.type)return e.props}function Tc(e){e=e.patchFlag;return e?parseInt(e,10):void 0}function Ec(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:i=[],directiveTransforms:s={},transformHoist:l=null,isBuiltInComponent:a=te,isCustomElement:c=te,expressionPlugins:u=[],scopeId:p=null,slotted:d=!0,ssr:f=!1,inSSR:h=!1,ssrCssVars:v="",bindingMetadata:m=E,inline:g=!1,isTS:y=!1,onError:b=Pl,onWarn:_=Fl,compatConfig:w}){t=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/);const x={selfName:t&&xe(R(t[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:i,directiveTransforms:s,transformHoist:l,isBuiltInComponent:a,isCustomElement:c,expressionPlugins:u,scopeId:p,slotted:d,ssr:f,inSSR:h,ssrCssVars:v,bindingMetadata:m,inline:g,isTS:y,onError:b,onWarn:_,compatConfig:w,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){var t=x.helpers.get(e)||0;return x.helpers.set(e,t+1),e},removeHelper(e){var t=x.helpers.get(e);t&&((t=t-1)?x.helpers.set(e,t):x.helpers.delete(e))},helperString(e){return"_"+xa[x.helper(e)]},replaceNode(e){if(!x.currentNode)throw new Error("Node being replaced is already removed.");if(!x.parent)throw new Error("Cannot replace root node.");x.parent.children[x.childIndex]=x.currentNode=e},removeNode(e){if(!x.parent)throw new Error("Cannot remove root node.");const t=x.parent.children;var n=e?t.indexOf(e):x.currentNode?x.childIndex:-1;if(n<0)throw new Error("node being removed is not a child of current parent");e&&e!==x.currentNode?x.childIndex>n&&(x.childIndex--,x.onNodeRemoved()):(x.currentNode=null,x.onNodeRemoved()),x.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){ce(e)&&(e=D(e)),x.hoists.push(e);const t=D("_hoisted_"+x.hoists.length,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1){return[e,t,n=!1]=[x.cached++,e,t],{type:20,index:e,value:t,isVNode:n,loc:Sa};var n}};return x}function Nc(e,n){const t=Ec(e,n);if(Oc(e,t),n.hoistStatic&&_c(e,t),!n.ssr){n=e;var r=t;const s=r["helper"],l=n["children"];if(1===l.length){var o,i=l[0];wc(n,i)&&i.codegenNode?(13===(o=i.codegenNode).type&&nc(o,r),n.codegenNode=o):n.codegenNode=i}else if(1<l.length){let e=64,t=x[64];1===l.filter(e=>3!==e.type).length&&(e|=2048,t+=", "+x[2048]),n.codegenNode=Ca(r,s(jl),void 0,n.children,e+` /* ${t} */`,void 0,void 0,!0,void 0,!1)}}e.helpers=new Set([...t.helpers.keys()]),e.components=[...t.components],e.directives=[...t.directives],e.imports=t.imports,e.hoists=t.hoists,e.temps=t.temps,e.cached=t.cached}function Oc(t,n){n.currentNode=t;const r=n["nodeTransforms"],o=[];for(let e=0;e<r.length;e++){var i=r[e](t,n);if(i&&(ae(i)?o.push(...i):o.push(i)),!n.currentNode)return;t=n.currentNode}switch(t.type){case 3:n.ssr||n.helper(Gl);break;case 5:n.ssr||n.helper(oa);break;case 9:for(let e=0;e<t.branches.length;e++)Oc(t.branches[e],n);break;case 10:case 11:case 1:case 0:{var s=t;var l=n;let e=0;for(var a=()=>{e--};e<s.children.length;e++){var c=s.children[e];ce(c)||(l.parent=s,l.childIndex=e,l.onNodeRemoved=a,Oc(c,l))}}}n.currentNode=t;let e=o.length;for(;e--;)o[e]()}function $c(t,s){const l=ce(t)?e=>e===t:e=>t.test(e);return(t,n)=>{if(1===t.type){const o=t["props"];if(3!==t.tagType||!o.some(Ga)){const i=[];for(let e=0;e<o.length;e++){var r=o[e];7===r.type&&l(r.name)&&(o.splice(e,1),e--,(r=s(t,r,n))&&i.push(r))}return i}}}}const Ac="/*#__PURE__*/",Rc=e=>xa[e]+": _"+xa[e];function Ic(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:l="Vue",runtimeModuleName:a="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:p=!1,inSSR:d=!1}){const f={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:l,runtimeModuleName:a,ssrRuntimeModuleName:c,ssr:u,isTS:p,inSSR:d,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(e){return"_"+xa[e]},push(e,t){f.code+=e},indent(){h(++f.indentLevel)},deindent(e=!1){e?--f.indentLevel:h(--f.indentLevel)},newline(){h(f.indentLevel)}};function h(e){f.push("\n"+"  ".repeat(e))}return f}function Pc(t,e={}){const n=Ic(t,e),{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:l,newline:a,ssr:c}=(e.onContextCreated&&e.onContextCreated(n),n),u=Array.from(t.helpers);var e=0<u.length,p=!i&&"module"!==r,d=n;{var f=t;const{push:m,newline:g,runtimeGlobalName:y}=d,b=y,_=Array.from(f.helpers);0<_.length&&(m(`const _Vue = ${b}
-`),f.hoists.length&&(h=[Wl,Kl,Gl,Jl,ql].filter(e=>_.includes(e)).map(Rc).join(", "),m(`const { ${h} } = _Vue
-`)));(function(t,n){if(t.length){n.pure=!0;const{push:o,newline:i}=n;i();for(let e=0;e<t.length;e++){var r=t[e];r&&(o(`const _hoisted_${e+1} = `),ue(r,n),i())}n.pure=!1}})(f.hoists,d),g(),m("return ")}var h=c?"ssrRender":"render";const v=c?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"];f=v.join(", ");if(o(`function ${h}(${f}) {`),s(),p&&(o("with (_ctx) {"),s(),e&&(o(`const { ${u.map(Rc).join(", ")} } = _Vue`),o(`
-`),a())),t.components.length&&(Fc(t.components,"component",n),(t.directives.length||0<t.temps)&&a()),t.directives.length&&(Fc(t.directives,"directive",n),0<t.temps&&a()),0<t.temps){o("let ");for(let e=0;e<t.temps;e++)o(`${0<e?", ":""}_temp`+e)}return(t.components.length||t.directives.length||t.temps)&&(o(`
-`),a()),c||o("return "),t.codegenNode?ue(t.codegenNode,n):o("null"),p&&(l(),o("}")),l(),o("}"),{ast:t,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function Fc(n,r,{helper:e,push:o,newline:i,isTS:s}){var l=e("component"===r?Yl:Xl);for(let t=0;t<n.length;t++){let e=n[t];var a=e.endsWith("__self");o(`const ${tc(e=a?e.slice(0,-6):e,r)} = ${l}(${JSON.stringify(e)}${a?", true":""})`+(s?"!":"")),t<n.length-1&&i()}}function Mc(e,t){var n=3<e.length||e.some(e=>ae(e)||!function(e){return ce(e)||4===e.type||2===e.type||5===e.type||8===e.type}(e));t.push("["),n&&t.indent(),jc(e,t,n),n&&t.deindent(),t.push("]")}function jc(t,n,r=!1,o=!0){const{push:i,newline:s}=n;for(let e=0;e<t.length;e++){var l=t[e];ce(l)?i(l):(ae(l)?Mc:ue)(l,n),e<t.length-1&&(r?(o&&i(","),s()):o&&i(", "))}}function ue(e,t){if(ce(e))t.push(e);else if(pe(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:Da(null!=e.codegenNode,"Codegen node is missing for element/if/for node. Apply appropriate transforms first."),ue(e.codegenNode,t);break;case 2:n=e,t.push(JSON.stringify(n.content),n);break;case 4:Vc(e,t);break;case 5:{var n=e;var r=t;const{push:d,helper:f,pure:h}=r;h&&d(Ac);d(f(oa)+"("),ue(n.content,r),d(")")}break;case 12:ue(e.codegenNode,t);break;case 8:Lc(e,t);break;case 3:{r=e;var o=t;const{push:v,helper:V,pure:L}=o;L&&v(Ac);v(`${V(Gl)}(${JSON.stringify(r.content)})`,r)}break;case 13:{o=e;var i=t;const{push:m,helper:g,pure:B}=i,{tag:U,props:D,children:H,patchFlag:z,dynamicProps:W,directives:y,isBlock:b,disableTracking:K,isComponent:G}=o;y&&m(g(ea)+"(");b&&m(`(${g(Dl)}(${K?"true":""}), `);B&&m(Ac);var s=(b?Za:Ya)(i.inSSR,G);m(g(s)+"(",o),jc(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map(e=>e||"null")}([U,D,H,z,W]),i),m(")"),b&&m(")");y&&(m(", "),ue(y,i),m(")"))}break;case 14:{s=e;i=t;const{push:_,helper:J,pure:q}=i,Y=ce(s.callee)?s.callee:J(s.callee);q&&_(Ac);_(Y+"(",s),jc(s.arguments,i),_(")")}break;case 15:{var l=e;var a=t;const{push:w,indent:Z,deindent:X,newline:Q}=a,x=l["properties"];if(x.length){var c=1<x.length||x.some(e=>4!==e.value.type);w(c?"{":"{ "),c&&Z();for(let e=0;e<x.length;e++){var{key:M,value:j}=x[e];!function(e,t){const n=t["push"];8===e.type?(n("["),Lc(e,t),n("]")):e.isStatic?(t=Pa(e.content)?e.content:JSON.stringify(e.content),n(t,e)):n(`[${e.content}]`,e)}(M,a),w(": "),ue(j,a),e<x.length-1&&(w(","),Q())}c&&X(),w(c?"}":" }")}else w("{}",l)}break;case 17:Mc(e.elements,t);break;case 18:{c=e;l=t;const{push:S,indent:ee,deindent:te}=l,{params:C,returns:k,body:T,newline:E,isSlot:N}=c;N&&S(`_${xa[ga]}(`);S("(",c),ae(C)?jc(C,l):C&&ue(C,l);S(") => "),(E||T)&&(S("{"),ee());k?(E&&S("return "),(ae(k)?Mc:ue)(k,l)):T&&ue(T,l);(E||T)&&(te(),S("}"));N&&S(")")}break;case 19:{var u=e;var p=t;const{test:O,consequent:ne,alternate:$,newline:A}=u,{push:R,indent:re,deindent:oe,newline:ie}=p;4===O.type?((u=!Pa(O.content))&&R("("),Vc(O,p),u&&R(")")):(R("("),ue(O,p),R(")"));A&&re(),p.indentLevel++,A||R(" "),R("? "),ue(ne,p),p.indentLevel--,A&&ie(),A||R(" "),R(": ");u=19===$.type;u||p.indentLevel++;ue($,p),u||p.indentLevel--;A&&oe(!0)}break;case 20:{u=e;p=t;const{push:I,helper:P,indent:se,deindent:le,newline:F}=p;I(`_cache[${u.index}] || (`),u.isVNode&&(se(),I(P(ha)+"(-1),"),F());I(`_cache[${u.index}] = `),ue(u.value,p),u.isVNode&&(I(","),F(),I(P(ha)+"(1),"),F(),I(`_cache[${u.index}]`),le());I(")")}break;case 21:jc(e.body,t,!0,!1);break;case 22:case 23:case 24:case 25:case 26:case 10:break;default:Da(!1,"unhandled codegen node type: "+e.type)}}function Vc(e,t){var{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Lc(t,n){for(let e=0;e<t.children.length;e++){var r=t.children[e];ce(r)?n.push(r):ue(r,n)}}const Bc=new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b"),Uc=/'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;function Dc(n,r,e=!1,o=!1){const i=n.content;if(i.trim())try{new Function(o?` ${i} `:"return "+(e?`(${i}) => {}`:`(${i})`))}catch(e){let t=e.message;o=i.replace(Uc,"").match(Bc);o&&(t=`avoid using JavaScript keyword as property name: "${o[0]}"`),r.onError(B(45,n.loc,void 0,t))}}const Hc=(t,n)=>{if(5===t.type)t.content=zc(t.content,n);else if(1===t.type)for(let e=0;e<t.props.length;e++){const i=t.props[e];var r,o;7===i.type&&"for"!==i.name&&(r=i.exp,o=i.arg,!r||4!==r.type||"on"===i.name&&o||(i.exp=zc(r,n,"slot"===i.name)),o&&4===o.type&&!o.isStatic&&(i.arg=zc(o,n)))}};function zc(e,t,n=!1,r=!1,o=Object.create(t.identifiers)){return Dc(e,t,n,r),e}const Wc=$c(/^(if|else|else-if)$/,(e,t,l)=>{var n=e,r=t,o=l,i=(t,n,r)=>{const e=l.parent.children;let o=e.indexOf(t),i=0;for(;0<=o--;){var s=e[o];s&&9===s.type&&(i+=s.branches.length)}return()=>{if(r)t.codegenNode=Gc(n,i,l);else{const e=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(t.codegenNode);e.alternate=Gc(n,i+t.branches.length-1,l)}}};if("else"===r.name||r.exp&&r.exp.content.trim()||(s=(r.exp||n).loc,o.onError(B(28,r.loc)),r.exp=D("true",!1,s)),r.exp&&Dc(r.exp,o),"if"===r.name){var s=Kc(n,r),e={type:9,loc:n.loc,branches:[s]};if(o.replaceNode(e),i)return i(e,s,!0)}else{const a=o.parent.children,c=[];let e=a.indexOf(n);for(;-1<=e--;){const u=a[e];if(u&&3===u.type)o.removeNode(u),c.unshift(u);else{if(!u||2!==u.type||u.content.trim().length){if(u&&9===u.type){"else-if"===r.name&&void 0===u.branches[u.branches.length-1].condition&&o.onError(B(30,n.loc)),o.removeNode();const p=Kc(n,r);!c.length||o.parent&&1===o.parent.type&&Aa(o.parent.tag,"transition")||(p.children=[...c,...p.children]);{const f=p.userKey;f&&u.branches.forEach(({userKey:e})=>{!function(e,t){if(!e||e.type!==t.type)return;if(6===e.type){if(e.value.content!==t.value.content)return}else{e=e.exp,t=t.exp;if(e.type!==t.type)return;if(4!==e.type||e.isStatic!==t.isStatic||e.content!==t.content)return}return 1}(e,f)||o.onError(B(29,p.userKey.loc))})}u.branches.push(p);const d=i&&i(u,p,!1);Oc(p,o),d&&d(),o.currentNode=null}else o.onError(B(30,n.loc));break}o.removeNode(u)}}}});function Kc(e,t){var n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!Ha(e,"for")?e.children:[e],userKey:za(e,"key"),isTemplateIf:n}}function Gc(e,t,n){return e.condition?Oa(e.condition,Jc(e,t,n),H(n.helper(Gl),['"v-if"',"true"])):Jc(e,t,n)}function Jc(n,r,o){const i=o["helper"];r=U("key",D(""+r,!1,Sa,2));const s=n["children"];var e,t,l=s[0];if(1===s.length&&1===l.type)return e=l.codegenNode,13===(t=14===(t=e).type&&t.callee===_a?t.arguments[1].returns:t).type&&nc(t,o),Qa(t,r,o),e;if(1===s.length&&11===l.type)return Qa(t=l.codegenNode,r,o),t;{let e=64,t=x[64];return n.isTemplateIf||1!==s.filter(e=>3!==e.type).length||(e|=2048,t+=", "+x[2048]),Ca(o,i(jl),Ta([r]),s,e+` /* ${t} */`,void 0,void 0,!0,!1,!1,n.loc)}}const qc=$c("for",(d,e,f)=>{const{helper:h,removeHelper:v}=f;var t=d,n=f,r=i=>{const s=H(h(ta),[i.source]),l=Ja(d),a=Ha(d,"memo");var e=za(d,"key");const c=e&&(6===e.type?D(e.value.content,!0):e.exp),u=e?U("key",c):null,p=4===i.source.type&&0<i.source.constType;e=p?64:e?128:256;return i.codegenNode=Ca(f,h(jl),void 0,s,e+` /* ${x[e]} */`,void 0,void 0,!0,!p,!1,d.loc),()=>{let e;var t=i["children"],n=(l&&d.children.some(e=>{if(1===e.type){e=za(e,"key");if(e)return f.onError(B(33,e.loc)),!0}}),1!==t.length||1!==t[0].type),r=qa(d)?d:l&&1===d.children.length&&qa(d.children[0])?d.children[0]:null;if(r?(e=r.codegenNode,l&&u&&Qa(e,u,f)):n?e=Ca(f,h(jl),u?Ta([u]):void 0,d.children,64+` /* ${x[64]} */`,void 0,void 0,!0,void 0,!1):(e=t[0].codegenNode,l&&u&&Qa(e,u,f),e.isBlock!==!p&&(e.isBlock?(v(Dl),v(Za(f.inSSR,e.isComponent))):v(Ya(f.inSSR,e.isComponent))),e.isBlock=!p,e.isBlock?(h(Dl),h(Za(f.inSSR,e.isComponent))):h(Ya(f.inSSR,e.isComponent))),a){const o=Na(tu(i.parseResult,[D("_cached")]));o.body={type:21,body:[Ea(["const _memo = (",a.exp,")"]),Ea(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${f.helperString(wa)}(_cached, _memo)) return _cached`]),Ea(["const _item = ",e]),D("_item.memo = _memo"),D("return _item")],loc:Sa},s.arguments.push(o,D("_cache"),D(String(f.cached++)))}else s.arguments.push(Na(tu(i.parseResult),e,!0))}};if(e.exp){var o=Qc(e.exp,n);if(o){const c=n["scopes"];var{source:i,value:s,key:l,index:a}=o,i={type:11,loc:e.loc,source:i,valueAlias:s,keyAlias:l,objectIndexAlias:a,parseResult:o,children:Ja(t)?t.children:[t]};n.replaceNode(i),c.vFor++;const u=r&&r(i);return()=>{c.vFor--,u&&u()}}n.onError(B(32,e.loc))}else n.onError(B(31,e.loc))});const Yc=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Zc=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Xc=/^\(|\)$/g;function Qc(n,r){var o=n.loc;const i=n.content;n=i.match(Yc);if(n){const[,e,a]=n,c={source:eu(o,a.trim(),i.indexOf(a,e.length)),value:void 0,key:void 0,index:void 0};Dc(c.source,r);let t=e.trim().replace(Xc,"").trim();n=e.indexOf(t);const u=t.match(Zc);if(u){t=t.replace(Zc,"").trim();var s,l=u[1].trim();let e;l&&(e=i.indexOf(l,n+t.length),c.key=eu(o,l,e),Dc(c.key,r,!0)),!u[2]||(s=u[2].trim())&&(c.index=eu(o,s,i.indexOf(s,c.key?e+l.length:n+t.length)),Dc(c.index,r,!0))}return t&&(c.value=eu(o,t,n),Dc(c.value,r,!0)),c}}function eu(e,t,n){return D(t,!1,La(e,n,t.length))}function tu({value:t,key:n,index:r},o=[]){{var i=[t,n,r,...o];let e=i.length;for(;e--&&!i[e];);return i.slice(0,e+1).map((e,t)=>e||D("_".repeat(t+1),!1))}}const nu=D("undefined",!1),ru=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){e=Ha(e,"slot");if(e)return e.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},ou=(e,t,n)=>Na(e,t,!1,!0,t.length?t[0].loc:n);function iu(e,r,o=ou){r.helper(ga);const{children:i,loc:n}=e,s=[],l=[];let a=0<r.scopes.vSlot||0<r.scopes.vFor;var t,c=Ha(e,"slot",!0);c&&({arg:t,exp:w}=c,t&&!$a(t)&&(a=!0),s.push(U(t||D("default",!0),o(w,i,n))));let u=!1,p=!1;const d=[],f=new Set;let h=0;for(let n=0;n<i.length;n++){var v=i[n];let t;if(Ja(v)&&(t=Ha(v,"slot",!0))){if(c){r.onError(B(37,t.loc));break}u=!0;var{children:m,loc:g}=v,{arg:y=D("default",!0),exp:b,loc:_}=t;let e;$a(y)?e=y?y.content:"default":a=!0;b=o(b,m,g);if(m=Ha(v,"if"))a=!0,l.push(Oa(m.exp,su(y,b,h++),nu));else if(g=Ha(v,/^else(-if)?$/,!0)){let e=n,t;for(;e--&&3===(t=i[e]).type;);if(t&&Ja(t)&&Ha(t,"if")){i.splice(n,1),n--;let e=l[l.length-1];for(;19===e.alternate.type;)e=e.alternate;e.alternate=g.exp?Oa(g.exp,su(y,b,h++),nu):su(y,b,h++)}else r.onError(B(30,g.loc))}else if(m=Ha(v,"for")){a=!0;g=m.parseResult||Qc(m.exp,r);g?l.push(H(r.helper(ta),[g.source,Na(tu(g),su(y,b),!0)])):r.onError(B(32,m.loc))}else{if(e){if(f.has(e)){r.onError(B(38,_));continue}f.add(e),"default"===e&&(p=!0)}s.push(U(y,b))}}else 3!==v.type&&d.push(v)}c||(t=(e,t)=>{return U("default",o(e,t,n))},u?d.length&&d.some(e=>function e(t){if(2!==t.type&&12!==t.type)return!0;return 2===t.type?!!t.content.trim():e(t.content)}(e))&&(p?r.onError(B(39,d[0].loc)):s.push(t(void 0,d))):s.push(t(void 0,i)));var w=a?2:function t(n){for(let e=0;e<n.length;e++){const r=n[e];switch(r.type){case 1:if(2===r.tagType||t(r.children))return!0;break;case 9:if(t(r.branches))return!0;break;case 10:case 11:if(t(r.children))return!0}}return!1}(e.children)?3:1;let x=Ta(s.concat(U("_",D(w+` /* ${S[w]} */`,!1))),n);return{slots:x=l.length?H(r.helper(ra),[x,ka(l)]):x,hasDynamicSlots:a}}function su(e,t,n){const r=[U("name",e),U("fn",t)];return null!=n&&r.push(U("key",D(String(n),!0))),Ta(r)}const lu=new WeakMap,au=(h,v)=>function(){if(1===(h=v.currentNode).type&&(0===h.tagType||1===h.tagType)){var{tag:a,props:c}=h,u=1===h.tagType,p=u?function(e,t,n=!1){let r=e["tag"];const o=pu(r),i=za(e,"is");if(i)if(o){var s=6===i.type?i.value&&D(i.value.content,!0):i.exp;if(s)return H(t.helper(Zl),[s])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));s=!o&&Ha(e,"is");if(s&&s.exp)return H(t.helper(Zl),[s.exp]);e=Ra(r)||t.isBuiltInComponent(r);if(e)return n||t.helper(e),e;return t.helper(Yl),t.components.add(r),tc(r,"component")}(h,v):`"${a}"`,d=re(p)&&p.callee===Zl;let e,t,n,r=0,o,i,s,l=d||p===Vl||p===Ll||!u&&("svg"===a||"foreignObject"===a);if(0<c.length){var a=cu(h,v,void 0,u,d);e=a.props,r=a.patchFlag,i=a.dynamicPropNames;const f=a.directives;s=f&&f.length?ka(f.map(e=>{{var t=v;const n=[],r=lu.get(e);if(r?n.push(t.helperString(r)):(t.helper(Xl),t.directives.add(e.name),n.push(tc(e.name,"directive"))),t=e.loc,e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const o=D("true",!1,t);n.push(Ta(e.modifiers.map(e=>U(e,o)),t))}return ka(n,e.loc)}})):void 0,a.shouldUseBlock&&(l=!0)}0<h.children.length&&(p===Bl&&(l=!0,r|=1024,1<h.children.length&&v.onError(B(46,{start:h.children[0].loc.start,end:h.children[h.children.length-1].loc.end,source:""}))),u&&p!==Vl&&p!==Bl?({slots:c,hasDynamicSlots:d}=iu(h,v),t=c,d&&(r|=1024)):t=1===h.children.length&&p!==Vl?((d=5===(c=(a=h.children[0]).type)||8===c)&&0===xc(a,v)&&(r|=1),d||2===c?a:h.children):h.children),0!==r&&(n=r<0?r+` /* ${x[r]} */`:(d=Object.keys(x).map(Number).filter(e=>0<e&&r&e).map(e=>x[e]).join(", "),r+` /* ${d} */`),i&&i.length&&(o=function(n){let r="[";for(let e=0,t=n.length;e<t;e++)r+=JSON.stringify(n[e]),e<t-1&&(r+=", ");return r+"]"}(i))),h.codegenNode=Ca(v,p,e,t,n,o,s,!!l,!1,u,h.loc)}};function cu(t,o,n=t.props,r,M,i=!1){const{tag:s,loc:l,children:j}=t;let a=[];const c=[],u=[];var p=0<j.length;let d=!1,e=0,f=!1,h=!1,v=!1,m=!1,g=!1,V=!1;const y=[];var b=e=>{a.length&&(c.push(Ta(uu(a),l)),a=[]),e&&c.push(e)},L=({key:e,value:t})=>{if($a(e)){const n=e.content;e=K(n);!e||r&&!M||"onclick"===n.toLowerCase()||"onUpdate:modelValue"===n||ge(n)||(m=!0),e&&ge(n)&&(V=!0),20===t.type||(4===t.type||8===t.type)&&0<xc(t,o)||("ref"===n?f=!0:"class"===n?h=!0:"style"===n?v=!0:"key"===n||y.includes(n)||y.push(n),!r||"class"!==n&&"style"!==n||y.includes(n)||y.push(n))}else g=!0};for(let e=0;e<n.length;e++){var _=n[e];if(6===_.type){const{loc:O,name:$,value:A}=_;"ref"===$&&(f=!0,0<o.scopes.vFor&&a.push(U(D("ref_for",!0),D("true")))),"is"===$&&(pu(s)||A&&A.content.startsWith("vue:"))||a.push(U(D($,!0,La(O,0,$.length)),D(A?A.content:"",!0,A?A.loc:O)))}else{var{name:w,arg:x,exp:S,loc:C}=_,k="bind"===w,T="on"===w;if("slot"===w)r||o.onError(B(40,C));else if("once"!==w&&"memo"!==w&&!("is"===w||k&&Wa(x,"is")&&pu(s)||T&&i))if((k&&Wa(x,"key")||T&&p&&Wa(x,"vue:before-update"))&&(d=!0),k&&Wa(x,"ref")&&0<o.scopes.vFor&&a.push(U(D("ref_for",!0),D("true"))),x||!k&&!T){const R=o.directiveTransforms[w];if(R){const{props:n,needRuntime:I}=R(_,t,o);i||n.forEach(L),T&&x&&!$a(x)?b(Ta(n,l)):a.push(...n),I&&(u.push(_),pe(I)&&lu.set(_,I))}else ye(w)||(u.push(_),p&&(d=!0))}else g=!0,S?k?(b(),c.push(S)):b({type:14,loc:C,callee:o.helper(ua),arguments:r?[S]:[S,"true"]}):o.onError(B(k?34:35,C))}}let E=void 0;if(c.length?(b(),E=1<c.length?H(o.helper(ia),c,l):c[0]):a.length&&(E=Ta(uu(a),l)),g?e|=16:(h&&!r&&(e|=2),v&&!r&&(e|=4),y.length&&(e|=8),m&&(e|=32)),d||0!==e&&32!==e||!(f||V||0<u.length)||(e|=512),!o.inSSR&&E)switch(E.type){case 15:let t=-1,n=-1,r=!1;for(let e=0;e<E.properties.length;e++){var N=E.properties[e].key;$a(N)?"class"===N.content?t=e:"style"===N.content&&(n=e):N.isHandlerKey||(r=!0)}const P=E.properties[t],F=E.properties[n];r?E=H(o.helper(aa),[E]):(P&&!$a(P.value)&&(P.value=H(o.helper(sa),[P.value])),F&&(v||4===F.value.type&&"["===F.value.content.trim()[0]||17===F.value.type)&&(F.value=H(o.helper(la),[F.value])));break;case 14:break;default:E=H(o.helper(aa),[H(o.helper(ca),[E])])}return{props:E,directives:u,patchFlag:e,dynamicPropNames:y,shouldUseBlock:d}}function uu(t){const n=new Map,r=[];for(let e=0;e<t.length;e++){var o,i=t[e];8!==i.key.type&&i.key.isStatic?(o=i.key.content,(s=n.get(o))?"style"!==o&&"class"!==o&&!K(o)||(l=i,17===(s=s).value.type?s.value.elements.push(l.value):s.value=ka([s.value,l.value],s.loc)):(n.set(o,i),r.push(i))):r.push(i)}var s,l;return r}function pu(e){return"component"===e||"Component"===e}const du=(t,n)=>{if(qa(t)){var{children:r,loc:o}=t,{slotName:i,slotProps:s}=function(t,e){let n='"default"',r=void 0;const o=[];for(let e=0;e<t.props.length;e++){const l=t.props[e];6===l.type?l.value&&("name"===l.name?n=JSON.stringify(l.value.content):(l.name=R(l.name),o.push(l))):"bind"===l.name&&Wa(l.arg,"name")?l.exp&&(n=l.exp):("bind"===l.name&&l.arg&&$a(l.arg)&&(l.arg.content=R(l.arg.content)),o.push(l))}{var i,s;0<o.length&&({props:i,directives:s}=cu(t,e,o,!1,!1),r=i,s.length&&e.onError(B(36,s[0].loc)))}return{slotName:n,slotProps:r}}(t,n);const l=[n.prefixIdentifiers?"_ctx.$slots":"$slots",i,"{}","undefined","true"];let e=2;s&&(l[2]=s,e=3),r.length&&(l[3]=Na([],r,!1,!1,o),e=4),n.scopeId&&!n.slotted&&(e=5),l.splice(e),t.codegenNode=H(n.helper(na),l,o)}};const fu=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,hu=(e,t,n,r)=>{var{loc:o,modifiers:i,arg:s}=e;e.exp||i.length||n.onError(B(35,o));let l;if(4===s.type)if(s.isStatic){let e=s.content;e.startsWith("vue:")&&(e="vnode-"+e.slice(4));i=0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?Se(R(e)):"on:"+e;l=D(i,!0,s.loc)}else l=Ea([n.helperString(fa)+"(",s,")"]);else(l=s).children.unshift(n.helperString(fa)+"("),l.children.push(")");let a=e.exp;a&&!a.content.trim()&&(a=void 0);t=n.cacheHandlers&&!a&&!n.inVOnce;a&&(s=!((i=Va(a.content))||fu.test(a.content)),e=a.content.includes(";"),Dc(a,n,!1,e),(s||t&&i)&&(a=Ea([`${s?"$event":"(...args)"} => `+(e?"{":"("),a,e?"}":")"])));let c={props:[U(l,a||D("() => {}",!1,o))]};return r&&(c=r(c)),t&&(c.props[0].value=n.cache(c.props[0].value)),c.props.forEach(e=>e.key.isHandlerKey=!0),c},vu=(e,t,n)=>{const{exp:r,modifiers:o,loc:i}=e,s=e.arg;return 4!==s.type?(s.children.unshift("("),s.children.push(') || ""')):s.isStatic||(s.content=s.content+' || ""'),o.includes("camel")&&(4===s.type?s.isStatic?s.content=R(s.content):s.content=`${n.helperString(pa)}(${s.content})`:(s.children.unshift(n.helperString(pa)+"("),s.children.push(")"))),n.inSSR||(o.includes("prop")&&mu(s,"."),o.includes("attr")&&mu(s,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(B(34,i)),{props:[U(s,D("",!0,i))]}):{props:[U(s,r)]}},mu=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},gu=(l,a)=>{if(0===l.type||1===l.type||11===l.type||10===l.type)return()=>{const n=l.children;let r=void 0,e=!1;for(let t=0;t<n.length;t++){var o=n[t];if(Ka(o)){e=!0;for(let e=t+1;e<n.length;e++){var i=n[e];if(!Ka(i)){r=void 0;break}(r=r||(n[t]=Ea([o],o.loc))).children.push(" + ",i),n.splice(e,1),e--}}}if(e&&(1!==n.length||0!==l.type&&(1!==l.type||0!==l.tagType||l.props.find(e=>7===e.type&&!a.directiveTransforms[e.name]))))for(let e=0;e<n.length;e++){var t=n[e];if(Ka(t)||8===t.type){const s=[];2===t.type&&" "===t.content||s.push(t),a.ssr||0!==xc(t,a)||s.push(1+` /* ${x[1]} */`),n[e]={type:12,content:t,loc:t.loc,codegenNode:H(a.helper(Jl),s)}}}}},yu=new WeakSet,bu=(e,t)=>{if(1===e.type&&Ha(e,"once",!0)&&!yu.has(e)&&!t.inVOnce)return yu.add(e),t.inVOnce=!0,t.helper(ha),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}},_u=(e,t,n)=>{var{exp:r,arg:o}=e;if(!r)return n.onError(B(41,e.loc)),wu();var i=r.loc.source;const s=4===r.type?r.content:i;i=n.bindingMetadata[i];if("props"===i||"props-aliased"===i)return n.onError(B(44,r.loc)),wu();if(!s.trim()||!Va(s))return n.onError(B(42,r.loc)),wu();var i=o||D("modelValue",!0),l=o?$a(o)?"onUpdate:"+R(o.content):Ea(['"onUpdate:" + ',o]):"onUpdate:modelValue",n=Ea([(n.isTS?"($event: any)":"$event")+" => ((",r,") = $event)"]);const a=[U(i,e.exp),U(l,n)];return e.modifiers.length&&1===t.tagType&&(r=e.modifiers.map(e=>(Pa(e)?e:JSON.stringify(e))+": true").join(", "),i=o?$a(o)?o.content+"Modifiers":Ea([o,' + "Modifiers"']):"modelModifiers",a.push(U(i,D(`{ ${r} }`,!1,e.loc,2)))),wu(a)};function wu(e=[]){return{props:e}}const xu=new WeakSet,Su=(t,n)=>{if(1===t.type){const r=Ha(t,"memo");if(r&&!xu.has(t))return xu.add(t),()=>{var e=t.codegenNode||n.currentNode.codegenNode;e&&13===e.type&&(1!==t.tagType&&nc(e,n),t.codegenNode=H(n.helper(_a),[r.exp,Na(void 0,e),"_cache",String(n.cached++)]))}}};function Cu(e,t={}){const n=t.onError||Pl;var r="module"===t.mode,r=(!0===t.prefixIdentifiers?n(B(47)):r&&n(B(48)),t.cacheHandlers&&n(B(49)),t.scopeId&&!r&&n(B(50)),ce(e)?sc(e,t):e),[e,o]=[[bu,Wc,Su,qc,Hc,du,au,ru,gu],{on:hu,bind:vu,model:_u}];return Nc(r,$({},t,{prefixIdentifiers:!1,nodeTransforms:[...e,...t.nodeTransforms||[]],directiveTransforms:$({},o,t.directiveTransforms||{})})),Pc(r,$({},t,{prefixIdentifiers:!1}))}var ku;const Tu=Symbol("vModelRadio"),Eu=Symbol("vModelCheckbox"),Nu=Symbol("vModelText"),Ou=Symbol("vModelSelect"),$u=Symbol("vModelDynamic"),Au=Symbol("vOnModifiersGuard"),Ru=Symbol("vOnKeysGuard"),Iu=Symbol("vShow"),Pu=Symbol("Transition"),Fu=Symbol("TransitionGroup");ku={[Tu]:"vModelRadio",[Eu]:"vModelCheckbox",[Nu]:"vModelText",[Ou]:"vModelSelect",[$u]:"vModelDynamic",[Au]:"withModifiers",[Ru]:"withKeys",[Iu]:"vShow",[Pu]:"Transition",[Fu]:"TransitionGroup"},Object.getOwnPropertySymbols(ku).forEach(e=>{xa[e]=ku[e]});let Mu;const ju=e("style,iframe,script,noscript",!0),Vu={isVoidTag:O,isNativeTag:e=>n(e)||N(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return Mu=Mu||document.createElement("div"),t?(Mu.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,Mu.children[0].getAttribute("foo")):(Mu.innerHTML=e,Mu.textContent)},isBuiltInComponent:e=>Aa(e,"Transition")?Pu:Aa(e,"TransitionGroup")?Fu:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some(e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else!t||1!==n||"foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0);if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(ju(e))return 2}return 0}};function Lu(e,t){return B(e,t,Bu)}const Bu={[51]:"v-html is missing expression.",52:"v-html will override element children.",53:"v-text is missing expression.",54:"v-text will override element children.",55:"v-model can only be used on <input>, <textarea> and <select> elements.",56:"v-model argument is not supported on plain elements.",57:"v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.",58:"Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.",59:"v-show is missing expression.",60:"<Transition> expects exactly one child element or component.",61:"Tags with side effect (<script> and <style>) are ignored in client component templates."};const Uu=e("passive,once,capture"),Du=e("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Hu=e("left,right"),zu=e("onkeyup,onkeydown,onkeypress",!0),Wu=(e,t)=>{return $a(e)&&"onclick"===e.content.toLowerCase()?D(t,!0):4!==e.type?Ea(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e};function Ku(e){e=e.children=e.children.filter(e=>3!==e.type&&!(2===e.type&&!e.content.trim()));const t=e[0];return 1!==e.length||11===t.type||9===t.type&&t.branches.some(Ku)}const Gu=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(Lu(61,e.loc)),t.removeNode())},Ju=[n=>{1===n.type&&n.props.forEach((e,t)=>{6===e.type&&"style"===e.name&&e.value&&(n.props[t]={type:7,name:"bind",arg:D("style",!0,e.loc),exp:((e,t)=>{const n=k(e);return D(JSON.stringify(n),false,t,3)})(e.value.content,e.loc),modifiers:[],loc:e.loc})})},(n,r)=>{if(1===n.type&&1===n.tagType&&r.isBuiltInComponent(n.tag)===Pu)return()=>{if(n.children.length){Ku(n)&&r.onError(Lu(60,{start:n.children[0].loc.start,end:n.children[n.children.length-1].loc.end,source:""}));var e=n.children[0];if(1===e.type)for(const t of e.props)7===t.type&&"show"===t.name&&n.props.push({type:6,name:"persisted",value:void 0,loc:n.loc})}}}],qu={cloak:()=>({props:[]}),html:(e,t,n)=>{var{exp:e,loc:r}=e;return e||n.onError(Lu(51,r)),t.children.length&&(n.onError(Lu(52,r)),t.children.length=0),{props:[U(D("innerHTML",!0,r),e||D("",!0))]}},text:(e,t,n)=>{var{exp:e,loc:r}=e;return e||n.onError(Lu(53,r)),t.children.length&&(n.onError(Lu(54,r)),t.children.length=0),{props:[U(D("textContent",!0),e?0<xc(e,n)?e:H(n.helperString(oa),[e],r):D("",!0))]}},model:(n,r,o)=>{const i=_u(n,r,o);if(!i.props.length||1===r.tagType)return i;function s(){var e=za(r,"value");e&&o.onError(Lu(58,e.loc))}n.arg&&o.onError(Lu(56,n.arg.loc));var l=r["tag"],a=o.isCustomElement(l);if("input"===l||"textarea"===l||"select"===l||a){let e=Nu,t=!1;if("input"===l||a){a=za(r,"type");if(a){if(7===a.type)e=$u;else if(a.value)switch(a.value.content){case"radio":e=Tu;break;case"checkbox":e=Eu;break;case"file":t=!0,o.onError(Lu(57,n.loc));break;default:s()}}else r.props.some(e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic))?e=$u:s()}else"select"===l?e=Ou:s();t||(i.needRuntime=o.helper(e))}else o.onError(Lu(55,n.loc));return i.props=i.props.filter(e=>!(4===e.key.type&&"modelValue"===e.key.content)),i},on:(l,e,a)=>hu(l,e,a,e=>{var t=l["modifiers"];if(!t.length)return e;let{key:n,value:r}=e.props[0];const{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}=((t,n)=>{const r=[],o=[],i=[];for(let e=0;e<n.length;e++){var s=n[e];Uu(s)?i.push(s):Hu(s)?$a(t)?(zu(t.content)?r:o).push(s):(r.push(s),o.push(s)):(Du(s)?o:r).push(s)}return{keyModifiers:r,nonKeyModifiers:o,eventOptionModifiers:i}})(n,t,l.loc);return i.includes("right")&&(n=Wu(n,"onContextmenu")),i.includes("middle")&&(n=Wu(n,"onMouseup")),i.length&&(r=H(a.helper(Au),[r,JSON.stringify(i)])),!o.length||$a(n)&&!zu(n.content)||(r=H(a.helper(Ru),[r,JSON.stringify(o)])),s.length&&(e=s.map(xe).join(""),n=$a(n)?D(""+n.content+e,!0):Ea(["(",n,`) + "${e}"`])),{props:[U(n,r)]}}),show:(e,t,n)=>{var{exp:e,loc:r}=e;return e||n.onError(Lu(59,r)),{props:[],needRuntime:n.helper(Iu)}}};console.info("You are running a development build of Vue.\nMake sure to use the production build (*.prod.js) when deploying for production."),vs();const Yu=Object.create(null);function Zu(n,e){if(!ce(n)){if(!n.nodeType)return oe("invalid template option: ",n),te;n=n.innerHTML}var t=n,r=Yu[t];if(r)return r;"#"===n[0]&&((r=document.querySelector(n))||oe("Template element not found or is empty: "+n),n=r?r.innerHTML:"");const o=$({hoistStatic:!0,onError:i,onWarn:e=>i(e,!0)},e);o.isCustomElement||"undefined"==typeof customElements||(o.isCustomElement=e=>!!customElements.get(e));[r,e={}]=[n,o],r=Cu(r,$({},Vu,e,{nodeTransforms:[Gu,...Ju,...e.nodeTransforms||[]],directiveTransforms:$({},qu,e.directiveTransforms||{}),transformHoist:null})).code;function i(e,t=!1){t=t?e.message:"Template compilation error: "+e.message,e=e.loc&&function(e,n=0,r=e.length){let o=e.split(/(\r?\n)/);var i,s,l,a,c=o.filter((e,t)=>t%2==1);o=o.filter((e,t)=>t%2==0);let u=0;const p=[];for(let t=0;t<o.length;t++)if((u+=o[t].length+(c[t]&&c[t].length||0))>=n){for(let e=t-d;e<=t+d||r>u;e++)e<0||e>=o.length||(i=e+1,p.push(""+i+" ".repeat(Math.max(3-String(i).length,0))+"|  "+o[e]),i=o[e].length,s=c[e]&&c[e].length||0,e===t?(a=n-(u-(i+s)),l=Math.max(1,r>u?i-a:r-n),p.push("   |  "+" ".repeat(a)+"^".repeat(l))):e>t&&(r>u&&(a=Math.max(Math.min(r-u,i),1),p.push("   |  "+"^".repeat(a))),u+=i+s));break}return p.join("\n")}(n,e.loc.start.offset,e.loc.end.offset);oe(e?t+`
-`+e:t)}const s=new Function(r)();return s._rc=!0,Yu[t]=s}return ts(Zu),r.BaseTransition=Fr,r.Comment=se,r.EffectScope=Re,r.Fragment=ie,r.KeepAlive=rt,r.ReactiveEffect=ze,r.Static=bi,r.Suspense=be,r.Teleport=t,r.Text=yi,r.Transition=Ls,r.TransitionGroup=Us,r.VueElement=Fs,r.assertNumber=vn,r.callWithAsyncErrorHandling=yn,r.callWithErrorHandling=gn,r.camelize=R,r.capitalize=xe,r.cloneVNode=Fi,r.compatUtils=null,r.compile=Zu,r.computed=ps,r.createApp=(...e)=>{const r=El().createApp(...e),o=(Al(r),Rl(r),r)["mount"];return r.mount=e=>{const t=Il(e);if(t){const n=r._component;ne(n)||n.render||n.template||(n.template=t.innerHTML),t.innerHTML="";e=o(t,!1,t instanceof SVGElement);return t instanceof Element&&(t.removeAttribute("v-cloak"),t.setAttribute("data-v-app","")),e}},r},r.createBlock=Ti,r.createCommentVNode=function(e="",t=!1){return t?(wi(),Ti(se,null,e)):P(se,null,e)},r.createElementBlock=function(e,t,n,r,o,i){return ki(Ii(e,t,n,r,o,i,!0))},r.createElementVNode=Ii,r.createHydrationRenderer=ai,r.createPropsRestProxy=function(e,t){var n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n},r.createRenderer=li,r.createSSRApp=(...e)=>{const t=Nl().createApp(...e),n=(Al(t),Rl(t),t)["mount"];return t.mount=e=>{e=Il(e);if(e)return n(e,!0,e instanceof SVGElement)},t},r.createSlots=function(t,n){for(let e=0;e<n.length;e++){const r=n[e];if(ae(r))for(let e=0;e<r.length;e++)t[r[e].name]=r[e].fn;else r&&(t[r.name]=r.key?(...e)=>{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return t},r.createStaticVNode=function(e,t){const n=P(bi,null,e);return n.staticCount=t,n},r.createTextVNode=ji,r.createVNode=P,r.customRef=function(e){return new an(e)},r.defineAsyncComponent=function(e){const{loader:n,loadingComponent:i,errorComponent:s,delay:l=200,timeout:a,suspensible:c=!0,onError:r}=e=ne(e)?{loader:e}:e;let u=null,p,o=0;const d=()=>{let t;return u||(t=u=n().catch(n=>{if(n=n instanceof Error?n:new Error(String(n)),r)return new Promise((e,t)=>{r(n,()=>e((o++,u=null,d())),()=>t(n),o+1)});throw n}).then(e=>{if(t!==u&&u)return u;if(e||oe("Async component loader resolved to undefined. If you are using retry(), make sure to return its return value."),!(e=e&&(e.__esModule||"Module"===e[Symbol.toStringTag])?e.default:e)||re(e)||ne(e))return p=e;throw new Error("Invalid async component load result: "+e)}))};return Dr({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return p},setup(){const t=_;if(p)return()=>zr(p,t);const n=e=>{u=null,bn(e,t,13,!s)};if(c&&t.suspense)return d().then(e=>()=>zr(e,t)).catch(e=>(n(e),()=>s?P(s,{error:e}):null));const r=tn(!1),o=tn(),e=tn(!!l);return l&&setTimeout(()=>{e.value=!1},l),null!=a&&setTimeout(()=>{var e;r.value||o.value||(e=new Error(`Async component timed out after ${a}ms.`),n(e),o.value=e)},a),d().then(()=>{r.value=!0,t.parent&&Wr(t.parent.vnode)&&$n(t.parent.update)}).catch(e=>{n(e),o.value=e}),()=>r.value&&p?zr(p,t):o.value&&s?P(s,{error:o.value}):i&&!e.value?P(i):void 0}})},r.defineComponent=Dr,r.defineCustomElement=Ps,r.defineEmits=function(){return ds("defineEmits"),null},r.defineExpose=function(e){ds("defineExpose")},r.defineProps=function(){return ds("defineProps"),null},r.defineSSRCustomElement=e=>Ps(e,$l),r.effect=function(e,t){e.effect&&(e=e.effect.fn);const n=new ze(e),r=(t&&($(n,t),t.scope&&Ie(n,t.scope)),t&&t.lazy||n.run(),n.run.bind(n));return r.effect=n,r},r.effectScope=function(e){return new Re(e)},r.getCurrentInstance=Wi,r.getCurrentScope=Pe,r.getTransitionRawChildren=Ur,r.guardReactiveProps=Pi,r.h=hs,r.handleError=bn,r.hydrate=$l,r.initCustomFormatter=vs,r.initDirectivesForSSR=_s,r.inject=Er,r.isMemoSame=ms,r.isProxy=qt,r.isReactive=Kt,r.isReadonly=Gt,r.isRef=q,r.isRuntimeOnly=ns,r.isShallow=Jt,r.isVNode=Ei,r.markRaw=Yt,r.mergeDefaults=function(e,t){const n=ae(e)?e.reduce((e,t)=>(e[t]={},e),{}):e;for(const r in t){const o=n[r];o?ae(o)||ne(o)?n[r]={type:o,default:t[r]}:o.default=t[r]:null===o?n[r]={default:t[r]}:oe(`props default key "${r}" has no corresponding declaration.`)}return n},r.mergeProps=Ui,r.nextTick=On,r.normalizeClass=T,r.normalizeProps=function(e){if(!e)return null;var{class:t,style:n}=e;return t&&!ce(t)&&(e.class=T(t)),n&&(e.style=a(n)),e},r.normalizeStyle=a,r.onActivated=Gr,r.onBeforeMount=Qr,r.onBeforeUnmount=ro,r.onBeforeUpdate=to,r.onDeactivated=Jr,r.onErrorCaptured=ao,r.onMounted=eo,r.onRenderTracked=lo,r.onRenderTriggered=so,r.onScopeDispose=function(e){b?b.cleanups.push(e):Ae("onScopeDispose() is called when there is no active effect scope to be associated with.")},r.onServerPrefetch=io,r.onUnmounted=oo,r.onUpdated=no,r.openBlock=wi,r.popScopeId=function(){sr=null},r.provide=Tr,r.proxyRefs=ln,r.pushScopeId=function(e){sr=e},r.queuePostFlushCb=Rn,r.reactive=Ut,r.readonly=Ht,r.ref=tn,r.registerRuntimeCompiler=ts,r.render=Ol,r.renderList=function(n,r,e,t){let o;const i=e&&e[t];if(ae(n)||ce(n)){o=new Array(n.length);for(let e=0,t=n.length;e<t;e++)o[e]=r(n[e],e,void 0,i&&i[e])}else if("number"==typeof n){Number.isInteger(n)||oe(`The v-for range expect an integer value but got ${n}.`),o=new Array(n);for(let e=0;e<n;e++)o[e]=r(e+1,e,void 0,i&&i[e])}else if(re(n))if(n[Symbol.iterator])o=Array.from(n,(e,t)=>r(e,t,void 0,i&&i[t]));else{var s=Object.keys(n);o=new Array(s.length);for(let e=0,t=s.length;e<t;e++){var l=s[e];o[e]=r(n[l],l,e,i&&i[e])}}else o=[];return e&&(e[t]=o),o},r.renderSlot=function(e,t,n={},r,o){if(h.isCE||h.parent&&Hr(h.parent)&&h.parent.isCE)return"default"!==t&&(n.name=t),P("slot",n,r&&r());let i=e[t];i&&1<i.length&&(oe("SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template."),i=()=>[]),i&&i._c&&(i._d=!1),wi();var s=i&&function t(e){return e.some(e=>!Ei(e)||e.type!==se&&!(e.type===ie&&!t(e.children)))?e:null}(i(n));const l=Ti(ie,{key:n.key||s&&s.key||"_"+t},s||(r?r():[]),s&&1===e._?64:-2);return!o&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l},r.resolveComponent=function(e,t){return ho(po,e,!0,t)||e},r.resolveDirective=function(e){return ho("directives",e)},r.resolveDynamicComponent=function(e){return ce(e)?ho(po,e,!1)||e:e||fo},r.resolveFilter=null,r.resolveTransitionHooks=jr,r.setBlockTracking=Ci,r.setDevtoolsHook=qn,r.setTransitionHooks=Br,r.shallowReactive=Dt,r.shallowReadonly=zt,r.shallowRef=function(e){return nn(e,!0)},r.ssrContextKey=ot,r.ssrUtils=null,r.stop=function(e){e.effect.stop()},r.toDisplayString=e=>ce(e)?e:null==e?"":ae(e)||re(e)&&(e.toString===ee||!ne(e.toString))?JSON.stringify(e,L,2):String(e),r.toHandlerKey=Se,r.toHandlers=function(e,t){const n={};if(!re(e))return oe("v-on with no argument expects an object value."),n;for(const r in e)n[t&&/[A-Z]/.test(r)?"on:"+r:Se(r)]=e[r];return n},r.toRaw=m,r.toRef=un,r.toRefs=function(e){qt(e)||console.warn("toRefs() expects a reactive object but received a plain one.");const t=ae(e)?new Array(e.length):{};for(const n in e)t[n]=un(e,n);return t},r.transformVNodeArgs=function(e){Oi=e},r.triggerRef=function(e){en(e,e.value)},r.unref=on,r.useAttrs=function(){return fs().attrs},r.useCssModule=function(e=0){return oe("useCssModule() is not supported in the global build."),E},r.useCssVars=function(n){const r=Wi();if(r){const t=r.ut=(t=n(r.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${r.uid}"]`)).forEach(e=>Ms(e,t))},o=()=>{var e=n(r.proxy);!function t(n,r){if(128&n.shapeFlag){const e=n.suspense;n=e.activeBranch,e.pendingBranch&&!e.isHydrating&&e.effects.push(()=>{t(e.activeBranch,r)})}for(;n.component;)n=n.component.subTree;if(1&n.shapeFlag&&n.el)Ms(n.el,r);else if(n.type===ie)n.children.forEach(e=>t(e,r));else if(n.type===bi){let{el:e,anchor:t}=n;for(;e&&(Ms(e,r),e!==t);)e=e.nextSibling}}(r.subTree,e),t(e)};Nr(o),eo(()=>{const e=new MutationObserver(o);e.observe(r.subTree.el.parentNode,{childList:!0}),oo(()=>e.disconnect())})}else oe("useCssVars is called without current active component instance.")},r.useSSRContext=()=>{oe("useSSRContext() is not supported in the global build.")},r.useSlots=function(){return fs().slots},r.useTransitionState=Pr,r.vModelCheckbox=ul,r.vModelDynamic=gl,r.vModelRadio=dl,r.vModelSelect=fl,r.vModelText=cl,r.vShow=xl,r.version=gs,r.warn=oe,r.watch=$r,r.watchEffect=function(e,t){return Ar(e,null,t)},r.watchPostEffect=Nr,r.watchSyncEffect=function(e,t){return Ar(e,null,Object.assign(Object.assign({},t),{flush:"sync"}))},r.withAsyncContext=function(e){const t=Wi();t||oe("withAsyncContext called without active current instance. This is likely a bug.");let n=e();return Gi(),[n=de(n)?n.catch(e=>{throw Ki(t),e}):n,()=>Ki(t)]},r.withCtx=ar,r.withDefaults=function(e,t){return ds("withDefaults"),null},r.withDirectives=function(e,i){var t=h;if(null===t)return oe("withDirectives can only be used inside render functions."),e;var s=is(t)||t.proxy;const l=e.dirs||(e.dirs=[]);for(let o=0;o<i.length;o++){let[e,t,n,r=E]=i[o];e&&((e=ne(e)?{mounted:e,updated:e}:e).deep&&Ir(t),l.push({dir:e,instance:s,value:t,oldValue:void 0,arg:n,modifiers:r}))}return e},r.withKeys=(n,r)=>e=>{if("key"in e){const t=v(e.key);return r.some(e=>e===t||wl[e]===t)?n(e):void 0}},r.withMemo=function(e,t,n,r){var o=n[r];if(o&&ms(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i},r.withModifiers=(r,o)=>(t,...e)=>{for(let e=0;e<o.length;e++){const n=_l[o[e]];if(n&&n(t,o))return}return r(t,...e)},r.withScopeId=e=>ar,Object.defineProperty(r,"__esModule",{value:!0}),r}({});
Index: ews/js/vue.esm-browser.js
===================================================================
--- /views/js/vue.esm-browser.js	(revision 8528)
+++ 	(revision )
@@ -1,15386 +1,0 @@
-function makeMap(str, expectsLowerCase) {
-  const map = /* @__PURE__ */ Object.create(null);
-  const list = str.split(",");
-  for (let i = 0; i < list.length; i++) {
-    map[list[i]] = true;
-  }
-  return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];
-}
-
-const EMPTY_OBJ = Object.freeze({}) ;
-const EMPTY_ARR = Object.freeze([]) ;
-const NOOP = () => {
-};
-const NO = () => false;
-const onRE = /^on[^a-z]/;
-const isOn = (key) => onRE.test(key);
-const isModelListener = (key) => key.startsWith("onUpdate:");
-const extend = Object.assign;
-const remove = (arr, el) => {
-  const i = arr.indexOf(el);
-  if (i > -1) {
-    arr.splice(i, 1);
-  }
-};
-const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
-const hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
-const isArray = Array.isArray;
-const isMap = (val) => toTypeString(val) === "[object Map]";
-const isSet = (val) => toTypeString(val) === "[object Set]";
-const isDate = (val) => toTypeString(val) === "[object Date]";
-const isRegExp = (val) => toTypeString(val) === "[object RegExp]";
-const isFunction = (val) => typeof val === "function";
-const isString = (val) => typeof val === "string";
-const isSymbol = (val) => typeof val === "symbol";
-const isObject = (val) => val !== null && typeof val === "object";
-const isPromise = (val) => {
-  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
-};
-const objectToString = Object.prototype.toString;
-const toTypeString = (value) => objectToString.call(value);
-const toRawType = (value) => {
-  return toTypeString(value).slice(8, -1);
-};
-const isPlainObject = (val) => toTypeString(val) === "[object Object]";
-const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
-const isReservedProp = /* @__PURE__ */ makeMap(
-  // the leading comma is intentional so empty string "" is also included
-  ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
-);
-const isBuiltInDirective = /* @__PURE__ */ makeMap(
-  "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
-);
-const cacheStringFunction = (fn) => {
-  const cache = /* @__PURE__ */ Object.create(null);
-  return (str) => {
-    const hit = cache[str];
-    return hit || (cache[str] = fn(str));
-  };
-};
-const camelizeRE = /-(\w)/g;
-const camelize = cacheStringFunction((str) => {
-  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
-});
-const hyphenateRE = /\B([A-Z])/g;
-const hyphenate = cacheStringFunction(
-  (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
-);
-const capitalize = cacheStringFunction((str) => {
-  return str.charAt(0).toUpperCase() + str.slice(1);
-});
-const toHandlerKey = cacheStringFunction((str) => {
-  const s = str ? `on${capitalize(str)}` : ``;
-  return s;
-});
-const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
-const invokeArrayFns = (fns, arg) => {
-  for (let i = 0; i < fns.length; i++) {
-    fns[i](arg);
-  }
-};
-const def = (obj, key, value) => {
-  Object.defineProperty(obj, key, {
-    configurable: true,
-    enumerable: false,
-    value
-  });
-};
-const looseToNumber = (val) => {
-  const n = parseFloat(val);
-  return isNaN(n) ? val : n;
-};
-const toNumber = (val) => {
-  const n = isString(val) ? Number(val) : NaN;
-  return isNaN(n) ? val : n;
-};
-let _globalThis;
-const getGlobalThis = () => {
-  return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
-};
-
-const PatchFlagNames = {
-  [1]: `TEXT`,
-  [2]: `CLASS`,
-  [4]: `STYLE`,
-  [8]: `PROPS`,
-  [16]: `FULL_PROPS`,
-  [32]: `HYDRATE_EVENTS`,
-  [64]: `STABLE_FRAGMENT`,
-  [128]: `KEYED_FRAGMENT`,
-  [256]: `UNKEYED_FRAGMENT`,
-  [512]: `NEED_PATCH`,
-  [1024]: `DYNAMIC_SLOTS`,
-  [2048]: `DEV_ROOT_FRAGMENT`,
-  [-1]: `HOISTED`,
-  [-2]: `BAIL`
-};
-
-const slotFlagsText = {
-  [1]: "STABLE",
-  [2]: "DYNAMIC",
-  [3]: "FORWARDED"
-};
-
-const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console";
-const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);
-
-const range = 2;
-function generateCodeFrame(source, start = 0, end = source.length) {
-  let lines = source.split(/(\r?\n)/);
-  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);
-  lines = lines.filter((_, idx) => idx % 2 === 0);
-  let count = 0;
-  const res = [];
-  for (let i = 0; i < lines.length; i++) {
-    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);
-    if (count >= start) {
-      for (let j = i - range; j <= i + range || end > count; j++) {
-        if (j < 0 || j >= lines.length)
-          continue;
-        const line = j + 1;
-        res.push(
-          `${line}${" ".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`
-        );
-        const lineLength = lines[j].length;
-        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;
-        if (j === i) {
-          const pad = start - (count - (lineLength + newLineSeqLength));
-          const length = Math.max(
-            1,
-            end > count ? lineLength - pad : end - start
-          );
-          res.push(`   |  ` + " ".repeat(pad) + "^".repeat(length));
-        } else if (j > i) {
-          if (end > count) {
-            const length = Math.max(Math.min(end - count, lineLength), 1);
-            res.push(`   |  ` + "^".repeat(length));
-          }
-          count += lineLength + newLineSeqLength;
-        }
-      }
-      break;
-    }
-  }
-  return res.join("\n");
-}
-
-function normalizeStyle(value) {
-  if (isArray(value)) {
-    const res = {};
-    for (let i = 0; i < value.length; i++) {
-      const item = value[i];
-      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
-      if (normalized) {
-        for (const key in normalized) {
-          res[key] = normalized[key];
-        }
-      }
-    }
-    return res;
-  } else if (isString(value) || isObject(value)) {
-    return value;
-  }
-}
-const listDelimiterRE = /;(?![^(]*\))/g;
-const propertyDelimiterRE = /:([^]+)/;
-const styleCommentRE = /\/\*[^]*?\*\//g;
-function parseStringStyle(cssText) {
-  const ret = {};
-  cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
-    if (item) {
-      const tmp = item.split(propertyDelimiterRE);
-      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
-    }
-  });
-  return ret;
-}
-function normalizeClass(value) {
-  let res = "";
-  if (isString(value)) {
-    res = value;
-  } else if (isArray(value)) {
-    for (let i = 0; i < value.length; i++) {
-      const normalized = normalizeClass(value[i]);
-      if (normalized) {
-        res += normalized + " ";
-      }
-    }
-  } else if (isObject(value)) {
-    for (const name in value) {
-      if (value[name]) {
-        res += name + " ";
-      }
-    }
-  }
-  return res.trim();
-}
-function normalizeProps(props) {
-  if (!props)
-    return null;
-  let { class: klass, style } = props;
-  if (klass && !isString(klass)) {
-    props.class = normalizeClass(klass);
-  }
-  if (style) {
-    props.style = normalizeStyle(style);
-  }
-  return props;
-}
-
-const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
-const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view";
-const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr";
-const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);
-const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);
-const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);
-
-const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
-const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);
-function includeBooleanAttr(value) {
-  return !!value || value === "";
-}
-
-function looseCompareArrays(a, b) {
-  if (a.length !== b.length)
-    return false;
-  let equal = true;
-  for (let i = 0; equal && i < a.length; i++) {
-    equal = looseEqual(a[i], b[i]);
-  }
-  return equal;
-}
-function looseEqual(a, b) {
-  if (a === b)
-    return true;
-  let aValidType = isDate(a);
-  let bValidType = isDate(b);
-  if (aValidType || bValidType) {
-    return aValidType && bValidType ? a.getTime() === b.getTime() : false;
-  }
-  aValidType = isSymbol(a);
-  bValidType = isSymbol(b);
-  if (aValidType || bValidType) {
-    return a === b;
-  }
-  aValidType = isArray(a);
-  bValidType = isArray(b);
-  if (aValidType || bValidType) {
-    return aValidType && bValidType ? looseCompareArrays(a, b) : false;
-  }
-  aValidType = isObject(a);
-  bValidType = isObject(b);
-  if (aValidType || bValidType) {
-    if (!aValidType || !bValidType) {
-      return false;
-    }
-    const aKeysCount = Object.keys(a).length;
-    const bKeysCount = Object.keys(b).length;
-    if (aKeysCount !== bKeysCount) {
-      return false;
-    }
-    for (const key in a) {
-      const aHasKey = a.hasOwnProperty(key);
-      const bHasKey = b.hasOwnProperty(key);
-      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
-        return false;
-      }
-    }
-  }
-  return String(a) === String(b);
-}
-function looseIndexOf(arr, val) {
-  return arr.findIndex((item) => looseEqual(item, val));
-}
-
-const toDisplayString = (val) => {
-  return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);
-};
-const replacer = (_key, val) => {
-  if (val && val.__v_isRef) {
-    return replacer(_key, val.value);
-  } else if (isMap(val)) {
-    return {
-      [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {
-        entries[`${key} =>`] = val2;
-        return entries;
-      }, {})
-    };
-  } else if (isSet(val)) {
-    return {
-      [`Set(${val.size})`]: [...val.values()]
-    };
-  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
-    return String(val);
-  }
-  return val;
-};
-
-function warn$1(msg, ...args) {
-  console.warn(`[Vue warn] ${msg}`, ...args);
-}
-
-let activeEffectScope;
-class EffectScope {
-  constructor(detached = false) {
-    this.detached = detached;
-    /**
-     * @internal
-     */
-    this._active = true;
-    /**
-     * @internal
-     */
-    this.effects = [];
-    /**
-     * @internal
-     */
-    this.cleanups = [];
-    this.parent = activeEffectScope;
-    if (!detached && activeEffectScope) {
-      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
-        this
-      ) - 1;
-    }
-  }
-  get active() {
-    return this._active;
-  }
-  run(fn) {
-    if (this._active) {
-      const currentEffectScope = activeEffectScope;
-      try {
-        activeEffectScope = this;
-        return fn();
-      } finally {
-        activeEffectScope = currentEffectScope;
-      }
-    } else {
-      warn$1(`cannot run an inactive effect scope.`);
-    }
-  }
-  /**
-   * This should only be called on non-detached scopes
-   * @internal
-   */
-  on() {
-    activeEffectScope = this;
-  }
-  /**
-   * This should only be called on non-detached scopes
-   * @internal
-   */
-  off() {
-    activeEffectScope = this.parent;
-  }
-  stop(fromParent) {
-    if (this._active) {
-      let i, l;
-      for (i = 0, l = this.effects.length; i < l; i++) {
-        this.effects[i].stop();
-      }
-      for (i = 0, l = this.cleanups.length; i < l; i++) {
-        this.cleanups[i]();
-      }
-      if (this.scopes) {
-        for (i = 0, l = this.scopes.length; i < l; i++) {
-          this.scopes[i].stop(true);
-        }
-      }
-      if (!this.detached && this.parent && !fromParent) {
-        const last = this.parent.scopes.pop();
-        if (last && last !== this) {
-          this.parent.scopes[this.index] = last;
-          last.index = this.index;
-        }
-      }
-      this.parent = void 0;
-      this._active = false;
-    }
-  }
-}
-function effectScope(detached) {
-  return new EffectScope(detached);
-}
-function recordEffectScope(effect, scope = activeEffectScope) {
-  if (scope && scope.active) {
-    scope.effects.push(effect);
-  }
-}
-function getCurrentScope() {
-  return activeEffectScope;
-}
-function onScopeDispose(fn) {
-  if (activeEffectScope) {
-    activeEffectScope.cleanups.push(fn);
-  } else {
-    warn$1(
-      `onScopeDispose() is called when there is no active effect scope to be associated with.`
-    );
-  }
-}
-
-const createDep = (effects) => {
-  const dep = new Set(effects);
-  dep.w = 0;
-  dep.n = 0;
-  return dep;
-};
-const wasTracked = (dep) => (dep.w & trackOpBit) > 0;
-const newTracked = (dep) => (dep.n & trackOpBit) > 0;
-const initDepMarkers = ({ deps }) => {
-  if (deps.length) {
-    for (let i = 0; i < deps.length; i++) {
-      deps[i].w |= trackOpBit;
-    }
-  }
-};
-const finalizeDepMarkers = (effect) => {
-  const { deps } = effect;
-  if (deps.length) {
-    let ptr = 0;
-    for (let i = 0; i < deps.length; i++) {
-      const dep = deps[i];
-      if (wasTracked(dep) && !newTracked(dep)) {
-        dep.delete(effect);
-      } else {
-        deps[ptr++] = dep;
-      }
-      dep.w &= ~trackOpBit;
-      dep.n &= ~trackOpBit;
-    }
-    deps.length = ptr;
-  }
-};
-
-const targetMap = /* @__PURE__ */ new WeakMap();
-let effectTrackDepth = 0;
-let trackOpBit = 1;
-const maxMarkerBits = 30;
-let activeEffect;
-const ITERATE_KEY = Symbol("iterate" );
-const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate" );
-class ReactiveEffect {
-  constructor(fn, scheduler = null, scope) {
-    this.fn = fn;
-    this.scheduler = scheduler;
-    this.active = true;
-    this.deps = [];
-    this.parent = void 0;
-    recordEffectScope(this, scope);
-  }
-  run() {
-    if (!this.active) {
-      return this.fn();
-    }
-    let parent = activeEffect;
-    let lastShouldTrack = shouldTrack;
-    while (parent) {
-      if (parent === this) {
-        return;
-      }
-      parent = parent.parent;
-    }
-    try {
-      this.parent = activeEffect;
-      activeEffect = this;
-      shouldTrack = true;
-      trackOpBit = 1 << ++effectTrackDepth;
-      if (effectTrackDepth <= maxMarkerBits) {
-        initDepMarkers(this);
-      } else {
-        cleanupEffect(this);
-      }
-      return this.fn();
-    } finally {
-      if (effectTrackDepth <= maxMarkerBits) {
-        finalizeDepMarkers(this);
-      }
-      trackOpBit = 1 << --effectTrackDepth;
-      activeEffect = this.parent;
-      shouldTrack = lastShouldTrack;
-      this.parent = void 0;
-      if (this.deferStop) {
-        this.stop();
-      }
-    }
-  }
-  stop() {
-    if (activeEffect === this) {
-      this.deferStop = true;
-    } else if (this.active) {
-      cleanupEffect(this);
-      if (this.onStop) {
-        this.onStop();
-      }
-      this.active = false;
-    }
-  }
-}
-function cleanupEffect(effect2) {
-  const { deps } = effect2;
-  if (deps.length) {
-    for (let i = 0; i < deps.length; i++) {
-      deps[i].delete(effect2);
-    }
-    deps.length = 0;
-  }
-}
-function effect(fn, options) {
-  if (fn.effect instanceof ReactiveEffect) {
-    fn = fn.effect.fn;
-  }
-  const _effect = new ReactiveEffect(fn);
-  if (options) {
-    extend(_effect, options);
-    if (options.scope)
-      recordEffectScope(_effect, options.scope);
-  }
-  if (!options || !options.lazy) {
-    _effect.run();
-  }
-  const runner = _effect.run.bind(_effect);
-  runner.effect = _effect;
-  return runner;
-}
-function stop(runner) {
-  runner.effect.stop();
-}
-let shouldTrack = true;
-const trackStack = [];
-function pauseTracking() {
-  trackStack.push(shouldTrack);
-  shouldTrack = false;
-}
-function resetTracking() {
-  const last = trackStack.pop();
-  shouldTrack = last === void 0 ? true : last;
-}
-function track(target, type, key) {
-  if (shouldTrack && activeEffect) {
-    let depsMap = targetMap.get(target);
-    if (!depsMap) {
-      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
-    }
-    let dep = depsMap.get(key);
-    if (!dep) {
-      depsMap.set(key, dep = createDep());
-    }
-    const eventInfo = { effect: activeEffect, target, type, key } ;
-    trackEffects(dep, eventInfo);
-  }
-}
-function trackEffects(dep, debuggerEventExtraInfo) {
-  let shouldTrack2 = false;
-  if (effectTrackDepth <= maxMarkerBits) {
-    if (!newTracked(dep)) {
-      dep.n |= trackOpBit;
-      shouldTrack2 = !wasTracked(dep);
-    }
-  } else {
-    shouldTrack2 = !dep.has(activeEffect);
-  }
-  if (shouldTrack2) {
-    dep.add(activeEffect);
-    activeEffect.deps.push(dep);
-    if (activeEffect.onTrack) {
-      activeEffect.onTrack(
-        extend(
-          {
-            effect: activeEffect
-          },
-          debuggerEventExtraInfo
-        )
-      );
-    }
-  }
-}
-function trigger(target, type, key, newValue, oldValue, oldTarget) {
-  const depsMap = targetMap.get(target);
-  if (!depsMap) {
-    return;
-  }
-  let deps = [];
-  if (type === "clear") {
-    deps = [...depsMap.values()];
-  } else if (key === "length" && isArray(target)) {
-    const newLength = Number(newValue);
-    depsMap.forEach((dep, key2) => {
-      if (key2 === "length" || key2 >= newLength) {
-        deps.push(dep);
-      }
-    });
-  } else {
-    if (key !== void 0) {
-      deps.push(depsMap.get(key));
-    }
-    switch (type) {
-      case "add":
-        if (!isArray(target)) {
-          deps.push(depsMap.get(ITERATE_KEY));
-          if (isMap(target)) {
-            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
-          }
-        } else if (isIntegerKey(key)) {
-          deps.push(depsMap.get("length"));
-        }
-        break;
-      case "delete":
-        if (!isArray(target)) {
-          deps.push(depsMap.get(ITERATE_KEY));
-          if (isMap(target)) {
-            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
-          }
-        }
-        break;
-      case "set":
-        if (isMap(target)) {
-          deps.push(depsMap.get(ITERATE_KEY));
-        }
-        break;
-    }
-  }
-  const eventInfo = { target, type, key, newValue, oldValue, oldTarget } ;
-  if (deps.length === 1) {
-    if (deps[0]) {
-      {
-        triggerEffects(deps[0], eventInfo);
-      }
-    }
-  } else {
-    const effects = [];
-    for (const dep of deps) {
-      if (dep) {
-        effects.push(...dep);
-      }
-    }
-    {
-      triggerEffects(createDep(effects), eventInfo);
-    }
-  }
-}
-function triggerEffects(dep, debuggerEventExtraInfo) {
-  const effects = isArray(dep) ? dep : [...dep];
-  for (const effect2 of effects) {
-    if (effect2.computed) {
-      triggerEffect(effect2, debuggerEventExtraInfo);
-    }
-  }
-  for (const effect2 of effects) {
-    if (!effect2.computed) {
-      triggerEffect(effect2, debuggerEventExtraInfo);
-    }
-  }
-}
-function triggerEffect(effect2, debuggerEventExtraInfo) {
-  if (effect2 !== activeEffect || effect2.allowRecurse) {
-    if (effect2.onTrigger) {
-      effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));
-    }
-    if (effect2.scheduler) {
-      effect2.scheduler();
-    } else {
-      effect2.run();
-    }
-  }
-}
-function getDepFromReactive(object, key) {
-  var _a;
-  return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);
-}
-
-const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
-const builtInSymbols = new Set(
-  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol)
-);
-const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
-function createArrayInstrumentations() {
-  const instrumentations = {};
-  ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
-    instrumentations[key] = function(...args) {
-      const arr = toRaw(this);
-      for (let i = 0, l = this.length; i < l; i++) {
-        track(arr, "get", i + "");
-      }
-      const res = arr[key](...args);
-      if (res === -1 || res === false) {
-        return arr[key](...args.map(toRaw));
-      } else {
-        return res;
-      }
-    };
-  });
-  ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
-    instrumentations[key] = function(...args) {
-      pauseTracking();
-      const res = toRaw(this)[key].apply(this, args);
-      resetTracking();
-      return res;
-    };
-  });
-  return instrumentations;
-}
-function hasOwnProperty(key) {
-  const obj = toRaw(this);
-  track(obj, "has", key);
-  return obj.hasOwnProperty(key);
-}
-class BaseReactiveHandler {
-  constructor(_isReadonly = false, _shallow = false) {
-    this._isReadonly = _isReadonly;
-    this._shallow = _shallow;
-  }
-  get(target, key, receiver) {
-    const isReadonly2 = this._isReadonly, shallow = this._shallow;
-    if (key === "__v_isReactive") {
-      return !isReadonly2;
-    } else if (key === "__v_isReadonly") {
-      return isReadonly2;
-    } else if (key === "__v_isShallow") {
-      return shallow;
-    } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
-      return target;
-    }
-    const targetIsArray = isArray(target);
-    if (!isReadonly2) {
-      if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
-        return Reflect.get(arrayInstrumentations, key, receiver);
-      }
-      if (key === "hasOwnProperty") {
-        return hasOwnProperty;
-      }
-    }
-    const res = Reflect.get(target, key, receiver);
-    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
-      return res;
-    }
-    if (!isReadonly2) {
-      track(target, "get", key);
-    }
-    if (shallow) {
-      return res;
-    }
-    if (isRef(res)) {
-      return targetIsArray && isIntegerKey(key) ? res : res.value;
-    }
-    if (isObject(res)) {
-      return isReadonly2 ? readonly(res) : reactive(res);
-    }
-    return res;
-  }
-}
-class MutableReactiveHandler extends BaseReactiveHandler {
-  constructor(shallow = false) {
-    super(false, shallow);
-  }
-  set(target, key, value, receiver) {
-    let oldValue = target[key];
-    if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
-      return false;
-    }
-    if (!this._shallow) {
-      if (!isShallow(value) && !isReadonly(value)) {
-        oldValue = toRaw(oldValue);
-        value = toRaw(value);
-      }
-      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
-        oldValue.value = value;
-        return true;
-      }
-    }
-    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
-    const result = Reflect.set(target, key, value, receiver);
-    if (target === toRaw(receiver)) {
-      if (!hadKey) {
-        trigger(target, "add", key, value);
-      } else if (hasChanged(value, oldValue)) {
-        trigger(target, "set", key, value, oldValue);
-      }
-    }
-    return result;
-  }
-  deleteProperty(target, key) {
-    const hadKey = hasOwn(target, key);
-    const oldValue = target[key];
-    const result = Reflect.deleteProperty(target, key);
-    if (result && hadKey) {
-      trigger(target, "delete", key, void 0, oldValue);
-    }
-    return result;
-  }
-  has(target, key) {
-    const result = Reflect.has(target, key);
-    if (!isSymbol(key) || !builtInSymbols.has(key)) {
-      track(target, "has", key);
-    }
-    return result;
-  }
-  ownKeys(target) {
-    track(
-      target,
-      "iterate",
-      isArray(target) ? "length" : ITERATE_KEY
-    );
-    return Reflect.ownKeys(target);
-  }
-}
-class ReadonlyReactiveHandler extends BaseReactiveHandler {
-  constructor(shallow = false) {
-    super(true, shallow);
-  }
-  set(target, key) {
-    {
-      warn$1(
-        `Set operation on key "${String(key)}" failed: target is readonly.`,
-        target
-      );
-    }
-    return true;
-  }
-  deleteProperty(target, key) {
-    {
-      warn$1(
-        `Delete operation on key "${String(key)}" failed: target is readonly.`,
-        target
-      );
-    }
-    return true;
-  }
-}
-const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();
-const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();
-const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(
-  true
-);
-const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);
-
-const toShallow = (value) => value;
-const getProto = (v) => Reflect.getPrototypeOf(v);
-function get(target, key, isReadonly = false, isShallow = false) {
-  target = target["__v_raw"];
-  const rawTarget = toRaw(target);
-  const rawKey = toRaw(key);
-  if (!isReadonly) {
-    if (hasChanged(key, rawKey)) {
-      track(rawTarget, "get", key);
-    }
-    track(rawTarget, "get", rawKey);
-  }
-  const { has: has2 } = getProto(rawTarget);
-  const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
-  if (has2.call(rawTarget, key)) {
-    return wrap(target.get(key));
-  } else if (has2.call(rawTarget, rawKey)) {
-    return wrap(target.get(rawKey));
-  } else if (target !== rawTarget) {
-    target.get(key);
-  }
-}
-function has(key, isReadonly = false) {
-  const target = this["__v_raw"];
-  const rawTarget = toRaw(target);
-  const rawKey = toRaw(key);
-  if (!isReadonly) {
-    if (hasChanged(key, rawKey)) {
-      track(rawTarget, "has", key);
-    }
-    track(rawTarget, "has", rawKey);
-  }
-  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
-}
-function size(target, isReadonly = false) {
-  target = target["__v_raw"];
-  !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY);
-  return Reflect.get(target, "size", target);
-}
-function add(value) {
-  value = toRaw(value);
-  const target = toRaw(this);
-  const proto = getProto(target);
-  const hadKey = proto.has.call(target, value);
-  if (!hadKey) {
-    target.add(value);
-    trigger(target, "add", value, value);
-  }
-  return this;
-}
-function set(key, value) {
-  value = toRaw(value);
-  const target = toRaw(this);
-  const { has: has2, get: get2 } = getProto(target);
-  let hadKey = has2.call(target, key);
-  if (!hadKey) {
-    key = toRaw(key);
-    hadKey = has2.call(target, key);
-  } else {
-    checkIdentityKeys(target, has2, key);
-  }
-  const oldValue = get2.call(target, key);
-  target.set(key, value);
-  if (!hadKey) {
-    trigger(target, "add", key, value);
-  } else if (hasChanged(value, oldValue)) {
-    trigger(target, "set", key, value, oldValue);
-  }
-  return this;
-}
-function deleteEntry(key) {
-  const target = toRaw(this);
-  const { has: has2, get: get2 } = getProto(target);
-  let hadKey = has2.call(target, key);
-  if (!hadKey) {
-    key = toRaw(key);
-    hadKey = has2.call(target, key);
-  } else {
-    checkIdentityKeys(target, has2, key);
-  }
-  const oldValue = get2 ? get2.call(target, key) : void 0;
-  const result = target.delete(key);
-  if (hadKey) {
-    trigger(target, "delete", key, void 0, oldValue);
-  }
-  return result;
-}
-function clear() {
-  const target = toRaw(this);
-  const hadItems = target.size !== 0;
-  const oldTarget = isMap(target) ? new Map(target) : new Set(target) ;
-  const result = target.clear();
-  if (hadItems) {
-    trigger(target, "clear", void 0, void 0, oldTarget);
-  }
-  return result;
-}
-function createForEach(isReadonly, isShallow) {
-  return function forEach(callback, thisArg) {
-    const observed = this;
-    const target = observed["__v_raw"];
-    const rawTarget = toRaw(target);
-    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
-    !isReadonly && track(rawTarget, "iterate", ITERATE_KEY);
-    return target.forEach((value, key) => {
-      return callback.call(thisArg, wrap(value), wrap(key), observed);
-    });
-  };
-}
-function createIterableMethod(method, isReadonly, isShallow) {
-  return function(...args) {
-    const target = this["__v_raw"];
-    const rawTarget = toRaw(target);
-    const targetIsMap = isMap(rawTarget);
-    const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
-    const isKeyOnly = method === "keys" && targetIsMap;
-    const innerIterator = target[method](...args);
-    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
-    !isReadonly && track(
-      rawTarget,
-      "iterate",
-      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
-    );
-    return {
-      // iterator protocol
-      next() {
-        const { value, done } = innerIterator.next();
-        return done ? { value, done } : {
-          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
-          done
-        };
-      },
-      // iterable protocol
-      [Symbol.iterator]() {
-        return this;
-      }
-    };
-  };
-}
-function createReadonlyMethod(type) {
-  return function(...args) {
-    {
-      const key = args[0] ? `on key "${args[0]}" ` : ``;
-      console.warn(
-        `${capitalize(type)} operation ${key}failed: target is readonly.`,
-        toRaw(this)
-      );
-    }
-    return type === "delete" ? false : this;
-  };
-}
-function createInstrumentations() {
-  const mutableInstrumentations2 = {
-    get(key) {
-      return get(this, key);
-    },
-    get size() {
-      return size(this);
-    },
-    has,
-    add,
-    set,
-    delete: deleteEntry,
-    clear,
-    forEach: createForEach(false, false)
-  };
-  const shallowInstrumentations2 = {
-    get(key) {
-      return get(this, key, false, true);
-    },
-    get size() {
-      return size(this);
-    },
-    has,
-    add,
-    set,
-    delete: deleteEntry,
-    clear,
-    forEach: createForEach(false, true)
-  };
-  const readonlyInstrumentations2 = {
-    get(key) {
-      return get(this, key, true);
-    },
-    get size() {
-      return size(this, true);
-    },
-    has(key) {
-      return has.call(this, key, true);
-    },
-    add: createReadonlyMethod("add"),
-    set: createReadonlyMethod("set"),
-    delete: createReadonlyMethod("delete"),
-    clear: createReadonlyMethod("clear"),
-    forEach: createForEach(true, false)
-  };
-  const shallowReadonlyInstrumentations2 = {
-    get(key) {
-      return get(this, key, true, true);
-    },
-    get size() {
-      return size(this, true);
-    },
-    has(key) {
-      return has.call(this, key, true);
-    },
-    add: createReadonlyMethod("add"),
-    set: createReadonlyMethod("set"),
-    delete: createReadonlyMethod("delete"),
-    clear: createReadonlyMethod("clear"),
-    forEach: createForEach(true, true)
-  };
-  const iteratorMethods = ["keys", "values", "entries", Symbol.iterator];
-  iteratorMethods.forEach((method) => {
-    mutableInstrumentations2[method] = createIterableMethod(
-      method,
-      false,
-      false
-    );
-    readonlyInstrumentations2[method] = createIterableMethod(
-      method,
-      true,
-      false
-    );
-    shallowInstrumentations2[method] = createIterableMethod(
-      method,
-      false,
-      true
-    );
-    shallowReadonlyInstrumentations2[method] = createIterableMethod(
-      method,
-      true,
-      true
-    );
-  });
-  return [
-    mutableInstrumentations2,
-    readonlyInstrumentations2,
-    shallowInstrumentations2,
-    shallowReadonlyInstrumentations2
-  ];
-}
-const [
-  mutableInstrumentations,
-  readonlyInstrumentations,
-  shallowInstrumentations,
-  shallowReadonlyInstrumentations
-] = /* @__PURE__ */ createInstrumentations();
-function createInstrumentationGetter(isReadonly, shallow) {
-  const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
-  return (target, key, receiver) => {
-    if (key === "__v_isReactive") {
-      return !isReadonly;
-    } else if (key === "__v_isReadonly") {
-      return isReadonly;
-    } else if (key === "__v_raw") {
-      return target;
-    }
-    return Reflect.get(
-      hasOwn(instrumentations, key) && key in target ? instrumentations : target,
-      key,
-      receiver
-    );
-  };
-}
-const mutableCollectionHandlers = {
-  get: /* @__PURE__ */ createInstrumentationGetter(false, false)
-};
-const shallowCollectionHandlers = {
-  get: /* @__PURE__ */ createInstrumentationGetter(false, true)
-};
-const readonlyCollectionHandlers = {
-  get: /* @__PURE__ */ createInstrumentationGetter(true, false)
-};
-const shallowReadonlyCollectionHandlers = {
-  get: /* @__PURE__ */ createInstrumentationGetter(true, true)
-};
-function checkIdentityKeys(target, has2, key) {
-  const rawKey = toRaw(key);
-  if (rawKey !== key && has2.call(target, rawKey)) {
-    const type = toRawType(target);
-    console.warn(
-      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
-    );
-  }
-}
-
-const reactiveMap = /* @__PURE__ */ new WeakMap();
-const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
-const readonlyMap = /* @__PURE__ */ new WeakMap();
-const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
-function targetTypeMap(rawType) {
-  switch (rawType) {
-    case "Object":
-    case "Array":
-      return 1 /* COMMON */;
-    case "Map":
-    case "Set":
-    case "WeakMap":
-    case "WeakSet":
-      return 2 /* COLLECTION */;
-    default:
-      return 0 /* INVALID */;
-  }
-}
-function getTargetType(value) {
-  return value["__v_skip"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));
-}
-function reactive(target) {
-  if (isReadonly(target)) {
-    return target;
-  }
-  return createReactiveObject(
-    target,
-    false,
-    mutableHandlers,
-    mutableCollectionHandlers,
-    reactiveMap
-  );
-}
-function shallowReactive(target) {
-  return createReactiveObject(
-    target,
-    false,
-    shallowReactiveHandlers,
-    shallowCollectionHandlers,
-    shallowReactiveMap
-  );
-}
-function readonly(target) {
-  return createReactiveObject(
-    target,
-    true,
-    readonlyHandlers,
-    readonlyCollectionHandlers,
-    readonlyMap
-  );
-}
-function shallowReadonly(target) {
-  return createReactiveObject(
-    target,
-    true,
-    shallowReadonlyHandlers,
-    shallowReadonlyCollectionHandlers,
-    shallowReadonlyMap
-  );
-}
-function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
-  if (!isObject(target)) {
-    {
-      console.warn(`value cannot be made reactive: ${String(target)}`);
-    }
-    return target;
-  }
-  if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
-    return target;
-  }
-  const existingProxy = proxyMap.get(target);
-  if (existingProxy) {
-    return existingProxy;
-  }
-  const targetType = getTargetType(target);
-  if (targetType === 0 /* INVALID */) {
-    return target;
-  }
-  const proxy = new Proxy(
-    target,
-    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers
-  );
-  proxyMap.set(target, proxy);
-  return proxy;
-}
-function isReactive(value) {
-  if (isReadonly(value)) {
-    return isReactive(value["__v_raw"]);
-  }
-  return !!(value && value["__v_isReactive"]);
-}
-function isReadonly(value) {
-  return !!(value && value["__v_isReadonly"]);
-}
-function isShallow(value) {
-  return !!(value && value["__v_isShallow"]);
-}
-function isProxy(value) {
-  return isReactive(value) || isReadonly(value);
-}
-function toRaw(observed) {
-  const raw = observed && observed["__v_raw"];
-  return raw ? toRaw(raw) : observed;
-}
-function markRaw(value) {
-  def(value, "__v_skip", true);
-  return value;
-}
-const toReactive = (value) => isObject(value) ? reactive(value) : value;
-const toReadonly = (value) => isObject(value) ? readonly(value) : value;
-
-function trackRefValue(ref2) {
-  if (shouldTrack && activeEffect) {
-    ref2 = toRaw(ref2);
-    {
-      trackEffects(ref2.dep || (ref2.dep = createDep()), {
-        target: ref2,
-        type: "get",
-        key: "value"
-      });
-    }
-  }
-}
-function triggerRefValue(ref2, newVal) {
-  ref2 = toRaw(ref2);
-  const dep = ref2.dep;
-  if (dep) {
-    {
-      triggerEffects(dep, {
-        target: ref2,
-        type: "set",
-        key: "value",
-        newValue: newVal
-      });
-    }
-  }
-}
-function isRef(r) {
-  return !!(r && r.__v_isRef === true);
-}
-function ref(value) {
-  return createRef(value, false);
-}
-function shallowRef(value) {
-  return createRef(value, true);
-}
-function createRef(rawValue, shallow) {
-  if (isRef(rawValue)) {
-    return rawValue;
-  }
-  return new RefImpl(rawValue, shallow);
-}
-class RefImpl {
-  constructor(value, __v_isShallow) {
-    this.__v_isShallow = __v_isShallow;
-    this.dep = void 0;
-    this.__v_isRef = true;
-    this._rawValue = __v_isShallow ? value : toRaw(value);
-    this._value = __v_isShallow ? value : toReactive(value);
-  }
-  get value() {
-    trackRefValue(this);
-    return this._value;
-  }
-  set value(newVal) {
-    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
-    newVal = useDirectValue ? newVal : toRaw(newVal);
-    if (hasChanged(newVal, this._rawValue)) {
-      this._rawValue = newVal;
-      this._value = useDirectValue ? newVal : toReactive(newVal);
-      triggerRefValue(this, newVal);
-    }
-  }
-}
-function triggerRef(ref2) {
-  triggerRefValue(ref2, ref2.value );
-}
-function unref(ref2) {
-  return isRef(ref2) ? ref2.value : ref2;
-}
-function toValue(source) {
-  return isFunction(source) ? source() : unref(source);
-}
-const shallowUnwrapHandlers = {
-  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
-  set: (target, key, value, receiver) => {
-    const oldValue = target[key];
-    if (isRef(oldValue) && !isRef(value)) {
-      oldValue.value = value;
-      return true;
-    } else {
-      return Reflect.set(target, key, value, receiver);
-    }
-  }
-};
-function proxyRefs(objectWithRefs) {
-  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
-}
-class CustomRefImpl {
-  constructor(factory) {
-    this.dep = void 0;
-    this.__v_isRef = true;
-    const { get, set } = factory(
-      () => trackRefValue(this),
-      () => triggerRefValue(this)
-    );
-    this._get = get;
-    this._set = set;
-  }
-  get value() {
-    return this._get();
-  }
-  set value(newVal) {
-    this._set(newVal);
-  }
-}
-function customRef(factory) {
-  return new CustomRefImpl(factory);
-}
-function toRefs(object) {
-  if (!isProxy(object)) {
-    console.warn(`toRefs() expects a reactive object but received a plain one.`);
-  }
-  const ret = isArray(object) ? new Array(object.length) : {};
-  for (const key in object) {
-    ret[key] = propertyToRef(object, key);
-  }
-  return ret;
-}
-class ObjectRefImpl {
-  constructor(_object, _key, _defaultValue) {
-    this._object = _object;
-    this._key = _key;
-    this._defaultValue = _defaultValue;
-    this.__v_isRef = true;
-  }
-  get value() {
-    const val = this._object[this._key];
-    return val === void 0 ? this._defaultValue : val;
-  }
-  set value(newVal) {
-    this._object[this._key] = newVal;
-  }
-  get dep() {
-    return getDepFromReactive(toRaw(this._object), this._key);
-  }
-}
-class GetterRefImpl {
-  constructor(_getter) {
-    this._getter = _getter;
-    this.__v_isRef = true;
-    this.__v_isReadonly = true;
-  }
-  get value() {
-    return this._getter();
-  }
-}
-function toRef(source, key, defaultValue) {
-  if (isRef(source)) {
-    return source;
-  } else if (isFunction(source)) {
-    return new GetterRefImpl(source);
-  } else if (isObject(source) && arguments.length > 1) {
-    return propertyToRef(source, key, defaultValue);
-  } else {
-    return ref(source);
-  }
-}
-function propertyToRef(source, key, defaultValue) {
-  const val = source[key];
-  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
-}
-
-class ComputedRefImpl {
-  constructor(getter, _setter, isReadonly, isSSR) {
-    this._setter = _setter;
-    this.dep = void 0;
-    this.__v_isRef = true;
-    this["__v_isReadonly"] = false;
-    this._dirty = true;
-    this.effect = new ReactiveEffect(getter, () => {
-      if (!this._dirty) {
-        this._dirty = true;
-        triggerRefValue(this);
-      }
-    });
-    this.effect.computed = this;
-    this.effect.active = this._cacheable = !isSSR;
-    this["__v_isReadonly"] = isReadonly;
-  }
-  get value() {
-    const self = toRaw(this);
-    trackRefValue(self);
-    if (self._dirty || !self._cacheable) {
-      self._dirty = false;
-      self._value = self.effect.run();
-    }
-    return self._value;
-  }
-  set value(newValue) {
-    this._setter(newValue);
-  }
-}
-function computed$1(getterOrOptions, debugOptions, isSSR = false) {
-  let getter;
-  let setter;
-  const onlyGetter = isFunction(getterOrOptions);
-  if (onlyGetter) {
-    getter = getterOrOptions;
-    setter = () => {
-      console.warn("Write operation failed: computed value is readonly");
-    } ;
-  } else {
-    getter = getterOrOptions.get;
-    setter = getterOrOptions.set;
-  }
-  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
-  if (debugOptions && !isSSR) {
-    cRef.effect.onTrack = debugOptions.onTrack;
-    cRef.effect.onTrigger = debugOptions.onTrigger;
-  }
-  return cRef;
-}
-
-const stack = [];
-function pushWarningContext(vnode) {
-  stack.push(vnode);
-}
-function popWarningContext() {
-  stack.pop();
-}
-function warn(msg, ...args) {
-  pauseTracking();
-  const instance = stack.length ? stack[stack.length - 1].component : null;
-  const appWarnHandler = instance && instance.appContext.config.warnHandler;
-  const trace = getComponentTrace();
-  if (appWarnHandler) {
-    callWithErrorHandling(
-      appWarnHandler,
-      instance,
-      11,
-      [
-        msg + args.join(""),
-        instance && instance.proxy,
-        trace.map(
-          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
-        ).join("\n"),
-        trace
-      ]
-    );
-  } else {
-    const warnArgs = [`[Vue warn]: ${msg}`, ...args];
-    if (trace.length && // avoid spamming console during tests
-    true) {
-      warnArgs.push(`
-`, ...formatTrace(trace));
-    }
-    console.warn(...warnArgs);
-  }
-  resetTracking();
-}
-function getComponentTrace() {
-  let currentVNode = stack[stack.length - 1];
-  if (!currentVNode) {
-    return [];
-  }
-  const normalizedStack = [];
-  while (currentVNode) {
-    const last = normalizedStack[0];
-    if (last && last.vnode === currentVNode) {
-      last.recurseCount++;
-    } else {
-      normalizedStack.push({
-        vnode: currentVNode,
-        recurseCount: 0
-      });
-    }
-    const parentInstance = currentVNode.component && currentVNode.component.parent;
-    currentVNode = parentInstance && parentInstance.vnode;
-  }
-  return normalizedStack;
-}
-function formatTrace(trace) {
-  const logs = [];
-  trace.forEach((entry, i) => {
-    logs.push(...i === 0 ? [] : [`
-`], ...formatTraceEntry(entry));
-  });
-  return logs;
-}
-function formatTraceEntry({ vnode, recurseCount }) {
-  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
-  const isRoot = vnode.component ? vnode.component.parent == null : false;
-  const open = ` at <${formatComponentName(
-    vnode.component,
-    vnode.type,
-    isRoot
-  )}`;
-  const close = `>` + postfix;
-  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
-}
-function formatProps(props) {
-  const res = [];
-  const keys = Object.keys(props);
-  keys.slice(0, 3).forEach((key) => {
-    res.push(...formatProp(key, props[key]));
-  });
-  if (keys.length > 3) {
-    res.push(` ...`);
-  }
-  return res;
-}
-function formatProp(key, value, raw) {
-  if (isString(value)) {
-    value = JSON.stringify(value);
-    return raw ? value : [`${key}=${value}`];
-  } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
-    return raw ? value : [`${key}=${value}`];
-  } else if (isRef(value)) {
-    value = formatProp(key, toRaw(value.value), true);
-    return raw ? value : [`${key}=Ref<`, value, `>`];
-  } else if (isFunction(value)) {
-    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
-  } else {
-    value = toRaw(value);
-    return raw ? value : [`${key}=`, value];
-  }
-}
-function assertNumber(val, type) {
-  if (val === void 0) {
-    return;
-  } else if (typeof val !== "number") {
-    warn(`${type} is not a valid number - got ${JSON.stringify(val)}.`);
-  } else if (isNaN(val)) {
-    warn(`${type} is NaN - the duration expression might be incorrect.`);
-  }
-}
-
-const ErrorTypeStrings = {
-  ["sp"]: "serverPrefetch hook",
-  ["bc"]: "beforeCreate hook",
-  ["c"]: "created hook",
-  ["bm"]: "beforeMount hook",
-  ["m"]: "mounted hook",
-  ["bu"]: "beforeUpdate hook",
-  ["u"]: "updated",
-  ["bum"]: "beforeUnmount hook",
-  ["um"]: "unmounted hook",
-  ["a"]: "activated hook",
-  ["da"]: "deactivated hook",
-  ["ec"]: "errorCaptured hook",
-  ["rtc"]: "renderTracked hook",
-  ["rtg"]: "renderTriggered hook",
-  [0]: "setup function",
-  [1]: "render function",
-  [2]: "watcher getter",
-  [3]: "watcher callback",
-  [4]: "watcher cleanup function",
-  [5]: "native event handler",
-  [6]: "component event handler",
-  [7]: "vnode hook",
-  [8]: "directive hook",
-  [9]: "transition hook",
-  [10]: "app errorHandler",
-  [11]: "app warnHandler",
-  [12]: "ref function",
-  [13]: "async component loader",
-  [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"
-};
-function callWithErrorHandling(fn, instance, type, args) {
-  let res;
-  try {
-    res = args ? fn(...args) : fn();
-  } catch (err) {
-    handleError(err, instance, type);
-  }
-  return res;
-}
-function callWithAsyncErrorHandling(fn, instance, type, args) {
-  if (isFunction(fn)) {
-    const res = callWithErrorHandling(fn, instance, type, args);
-    if (res && isPromise(res)) {
-      res.catch((err) => {
-        handleError(err, instance, type);
-      });
-    }
-    return res;
-  }
-  const values = [];
-  for (let i = 0; i < fn.length; i++) {
-    values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
-  }
-  return values;
-}
-function handleError(err, instance, type, throwInDev = true) {
-  const contextVNode = instance ? instance.vnode : null;
-  if (instance) {
-    let cur = instance.parent;
-    const exposedInstance = instance.proxy;
-    const errorInfo = ErrorTypeStrings[type] ;
-    while (cur) {
-      const errorCapturedHooks = cur.ec;
-      if (errorCapturedHooks) {
-        for (let i = 0; i < errorCapturedHooks.length; i++) {
-          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
-            return;
-          }
-        }
-      }
-      cur = cur.parent;
-    }
-    const appErrorHandler = instance.appContext.config.errorHandler;
-    if (appErrorHandler) {
-      callWithErrorHandling(
-        appErrorHandler,
-        null,
-        10,
-        [err, exposedInstance, errorInfo]
-      );
-      return;
-    }
-  }
-  logError(err, type, contextVNode, throwInDev);
-}
-function logError(err, type, contextVNode, throwInDev = true) {
-  {
-    const info = ErrorTypeStrings[type];
-    if (contextVNode) {
-      pushWarningContext(contextVNode);
-    }
-    warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
-    if (contextVNode) {
-      popWarningContext();
-    }
-    if (throwInDev) {
-      throw err;
-    } else {
-      console.error(err);
-    }
-  }
-}
-
-let isFlushing = false;
-let isFlushPending = false;
-const queue = [];
-let flushIndex = 0;
-const pendingPostFlushCbs = [];
-let activePostFlushCbs = null;
-let postFlushIndex = 0;
-const resolvedPromise = /* @__PURE__ */ Promise.resolve();
-let currentFlushPromise = null;
-const RECURSION_LIMIT = 100;
-function nextTick(fn) {
-  const p = currentFlushPromise || resolvedPromise;
-  return fn ? p.then(this ? fn.bind(this) : fn) : p;
-}
-function findInsertionIndex(id) {
-  let start = flushIndex + 1;
-  let end = queue.length;
-  while (start < end) {
-    const middle = start + end >>> 1;
-    const middleJobId = getId(queue[middle]);
-    middleJobId < id ? start = middle + 1 : end = middle;
-  }
-  return start;
-}
-function queueJob(job) {
-  if (!queue.length || !queue.includes(
-    job,
-    isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex
-  )) {
-    if (job.id == null) {
-      queue.push(job);
-    } else {
-      queue.splice(findInsertionIndex(job.id), 0, job);
-    }
-    queueFlush();
-  }
-}
-function queueFlush() {
-  if (!isFlushing && !isFlushPending) {
-    isFlushPending = true;
-    currentFlushPromise = resolvedPromise.then(flushJobs);
-  }
-}
-function invalidateJob(job) {
-  const i = queue.indexOf(job);
-  if (i > flushIndex) {
-    queue.splice(i, 1);
-  }
-}
-function queuePostFlushCb(cb) {
-  if (!isArray(cb)) {
-    if (!activePostFlushCbs || !activePostFlushCbs.includes(
-      cb,
-      cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex
-    )) {
-      pendingPostFlushCbs.push(cb);
-    }
-  } else {
-    pendingPostFlushCbs.push(...cb);
-  }
-  queueFlush();
-}
-function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) {
-  {
-    seen = seen || /* @__PURE__ */ new Map();
-  }
-  for (; i < queue.length; i++) {
-    const cb = queue[i];
-    if (cb && cb.pre) {
-      if (checkRecursiveUpdates(seen, cb)) {
-        continue;
-      }
-      queue.splice(i, 1);
-      i--;
-      cb();
-    }
-  }
-}
-function flushPostFlushCbs(seen) {
-  if (pendingPostFlushCbs.length) {
-    const deduped = [...new Set(pendingPostFlushCbs)];
-    pendingPostFlushCbs.length = 0;
-    if (activePostFlushCbs) {
-      activePostFlushCbs.push(...deduped);
-      return;
-    }
-    activePostFlushCbs = deduped;
-    {
-      seen = seen || /* @__PURE__ */ new Map();
-    }
-    activePostFlushCbs.sort((a, b) => getId(a) - getId(b));
-    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
-      if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {
-        continue;
-      }
-      activePostFlushCbs[postFlushIndex]();
-    }
-    activePostFlushCbs = null;
-    postFlushIndex = 0;
-  }
-}
-const getId = (job) => job.id == null ? Infinity : job.id;
-const comparator = (a, b) => {
-  const diff = getId(a) - getId(b);
-  if (diff === 0) {
-    if (a.pre && !b.pre)
-      return -1;
-    if (b.pre && !a.pre)
-      return 1;
-  }
-  return diff;
-};
-function flushJobs(seen) {
-  isFlushPending = false;
-  isFlushing = true;
-  {
-    seen = seen || /* @__PURE__ */ new Map();
-  }
-  queue.sort(comparator);
-  const check = (job) => checkRecursiveUpdates(seen, job) ;
-  try {
-    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
-      const job = queue[flushIndex];
-      if (job && job.active !== false) {
-        if (check(job)) {
-          continue;
-        }
-        callWithErrorHandling(job, null, 14);
-      }
-    }
-  } finally {
-    flushIndex = 0;
-    queue.length = 0;
-    flushPostFlushCbs(seen);
-    isFlushing = false;
-    currentFlushPromise = null;
-    if (queue.length || pendingPostFlushCbs.length) {
-      flushJobs(seen);
-    }
-  }
-}
-function checkRecursiveUpdates(seen, fn) {
-  if (!seen.has(fn)) {
-    seen.set(fn, 1);
-  } else {
-    const count = seen.get(fn);
-    if (count > RECURSION_LIMIT) {
-      const instance = fn.ownerInstance;
-      const componentName = instance && getComponentName(instance.type);
-      warn(
-        `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`
-      );
-      return true;
-    } else {
-      seen.set(fn, count + 1);
-    }
-  }
-}
-
-let isHmrUpdating = false;
-const hmrDirtyComponents = /* @__PURE__ */ new Set();
-{
-  getGlobalThis().__VUE_HMR_RUNTIME__ = {
-    createRecord: tryWrap(createRecord),
-    rerender: tryWrap(rerender),
-    reload: tryWrap(reload)
-  };
-}
-const map = /* @__PURE__ */ new Map();
-function registerHMR(instance) {
-  const id = instance.type.__hmrId;
-  let record = map.get(id);
-  if (!record) {
-    createRecord(id, instance.type);
-    record = map.get(id);
-  }
-  record.instances.add(instance);
-}
-function unregisterHMR(instance) {
-  map.get(instance.type.__hmrId).instances.delete(instance);
-}
-function createRecord(id, initialDef) {
-  if (map.has(id)) {
-    return false;
-  }
-  map.set(id, {
-    initialDef: normalizeClassComponent(initialDef),
-    instances: /* @__PURE__ */ new Set()
-  });
-  return true;
-}
-function normalizeClassComponent(component) {
-  return isClassComponent(component) ? component.__vccOpts : component;
-}
-function rerender(id, newRender) {
-  const record = map.get(id);
-  if (!record) {
-    return;
-  }
-  record.initialDef.render = newRender;
-  [...record.instances].forEach((instance) => {
-    if (newRender) {
-      instance.render = newRender;
-      normalizeClassComponent(instance.type).render = newRender;
-    }
-    instance.renderCache = [];
-    isHmrUpdating = true;
-    instance.update();
-    isHmrUpdating = false;
-  });
-}
-function reload(id, newComp) {
-  const record = map.get(id);
-  if (!record)
-    return;
-  newComp = normalizeClassComponent(newComp);
-  updateComponentDef(record.initialDef, newComp);
-  const instances = [...record.instances];
-  for (const instance of instances) {
-    const oldComp = normalizeClassComponent(instance.type);
-    if (!hmrDirtyComponents.has(oldComp)) {
-      if (oldComp !== record.initialDef) {
-        updateComponentDef(oldComp, newComp);
-      }
-      hmrDirtyComponents.add(oldComp);
-    }
-    instance.appContext.propsCache.delete(instance.type);
-    instance.appContext.emitsCache.delete(instance.type);
-    instance.appContext.optionsCache.delete(instance.type);
-    if (instance.ceReload) {
-      hmrDirtyComponents.add(oldComp);
-      instance.ceReload(newComp.styles);
-      hmrDirtyComponents.delete(oldComp);
-    } else if (instance.parent) {
-      queueJob(instance.parent.update);
-    } else if (instance.appContext.reload) {
-      instance.appContext.reload();
-    } else if (typeof window !== "undefined") {
-      window.location.reload();
-    } else {
-      console.warn(
-        "[HMR] Root or manually mounted instance modified. Full reload required."
-      );
-    }
-  }
-  queuePostFlushCb(() => {
-    for (const instance of instances) {
-      hmrDirtyComponents.delete(
-        normalizeClassComponent(instance.type)
-      );
-    }
-  });
-}
-function updateComponentDef(oldComp, newComp) {
-  extend(oldComp, newComp);
-  for (const key in oldComp) {
-    if (key !== "__file" && !(key in newComp)) {
-      delete oldComp[key];
-    }
-  }
-}
-function tryWrap(fn) {
-  return (id, arg) => {
-    try {
-      return fn(id, arg);
-    } catch (e) {
-      console.error(e);
-      console.warn(
-        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`
-      );
-    }
-  };
-}
-
-let devtools;
-let buffer = [];
-let devtoolsNotInstalled = false;
-function emit$1(event, ...args) {
-  if (devtools) {
-    devtools.emit(event, ...args);
-  } else if (!devtoolsNotInstalled) {
-    buffer.push({ event, args });
-  }
-}
-function setDevtoolsHook(hook, target) {
-  var _a, _b;
-  devtools = hook;
-  if (devtools) {
-    devtools.enabled = true;
-    buffer.forEach(({ event, args }) => devtools.emit(event, ...args));
-    buffer = [];
-  } else if (
-    // handle late devtools injection - only do this if we are in an actual
-    // browser environment to avoid the timer handle stalling test runner exit
-    // (#4815)
-    typeof window !== "undefined" && // some envs mock window but not fully
-    window.HTMLElement && // also exclude jsdom
-    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
-  ) {
-    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
-    replay.push((newHook) => {
-      setDevtoolsHook(newHook, target);
-    });
-    setTimeout(() => {
-      if (!devtools) {
-        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
-        devtoolsNotInstalled = true;
-        buffer = [];
-      }
-    }, 3e3);
-  } else {
-    devtoolsNotInstalled = true;
-    buffer = [];
-  }
-}
-function devtoolsInitApp(app, version) {
-  emit$1("app:init" /* APP_INIT */, app, version, {
-    Fragment,
-    Text,
-    Comment,
-    Static
-  });
-}
-function devtoolsUnmountApp(app) {
-  emit$1("app:unmount" /* APP_UNMOUNT */, app);
-}
-const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
-  "component:added" /* COMPONENT_ADDED */
-);
-const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */);
-const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
-  "component:removed" /* COMPONENT_REMOVED */
-);
-const devtoolsComponentRemoved = (component) => {
-  if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered
-  !devtools.cleanupBuffer(component)) {
-    _devtoolsComponentRemoved(component);
-  }
-};
-function createDevtoolsComponentHook(hook) {
-  return (component) => {
-    emit$1(
-      hook,
-      component.appContext.app,
-      component.uid,
-      component.parent ? component.parent.uid : void 0,
-      component
-    );
-  };
-}
-const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
-  "perf:start" /* PERFORMANCE_START */
-);
-const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
-  "perf:end" /* PERFORMANCE_END */
-);
-function createDevtoolsPerformanceHook(hook) {
-  return (component, type, time) => {
-    emit$1(hook, component.appContext.app, component.uid, component, type, time);
-  };
-}
-function devtoolsComponentEmit(component, event, params) {
-  emit$1(
-    "component:emit" /* COMPONENT_EMIT */,
-    component.appContext.app,
-    component,
-    event,
-    params
-  );
-}
-
-function emit(instance, event, ...rawArgs) {
-  if (instance.isUnmounted)
-    return;
-  const props = instance.vnode.props || EMPTY_OBJ;
-  {
-    const {
-      emitsOptions,
-      propsOptions: [propsOptions]
-    } = instance;
-    if (emitsOptions) {
-      if (!(event in emitsOptions) && true) {
-        if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
-          warn(
-            `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`
-          );
-        }
-      } else {
-        const validator = emitsOptions[event];
-        if (isFunction(validator)) {
-          const isValid = validator(...rawArgs);
-          if (!isValid) {
-            warn(
-              `Invalid event arguments: event validation failed for event "${event}".`
-            );
-          }
-        }
-      }
-    }
-  }
-  let args = rawArgs;
-  const isModelListener = event.startsWith("update:");
-  const modelArg = isModelListener && event.slice(7);
-  if (modelArg && modelArg in props) {
-    const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`;
-    const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
-    if (trim) {
-      args = rawArgs.map((a) => isString(a) ? a.trim() : a);
-    }
-    if (number) {
-      args = rawArgs.map(looseToNumber);
-    }
-  }
-  {
-    devtoolsComponentEmit(instance, event, args);
-  }
-  {
-    const lowerCaseEvent = event.toLowerCase();
-    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
-      warn(
-        `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
-          instance,
-          instance.type
-        )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".`
-      );
-    }
-  }
-  let handlerName;
-  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
-  props[handlerName = toHandlerKey(camelize(event))];
-  if (!handler && isModelListener) {
-    handler = props[handlerName = toHandlerKey(hyphenate(event))];
-  }
-  if (handler) {
-    callWithAsyncErrorHandling(
-      handler,
-      instance,
-      6,
-      args
-    );
-  }
-  const onceHandler = props[handlerName + `Once`];
-  if (onceHandler) {
-    if (!instance.emitted) {
-      instance.emitted = {};
-    } else if (instance.emitted[handlerName]) {
-      return;
-    }
-    instance.emitted[handlerName] = true;
-    callWithAsyncErrorHandling(
-      onceHandler,
-      instance,
-      6,
-      args
-    );
-  }
-}
-function normalizeEmitsOptions(comp, appContext, asMixin = false) {
-  const cache = appContext.emitsCache;
-  const cached = cache.get(comp);
-  if (cached !== void 0) {
-    return cached;
-  }
-  const raw = comp.emits;
-  let normalized = {};
-  let hasExtends = false;
-  if (!isFunction(comp)) {
-    const extendEmits = (raw2) => {
-      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
-      if (normalizedFromExtend) {
-        hasExtends = true;
-        extend(normalized, normalizedFromExtend);
-      }
-    };
-    if (!asMixin && appContext.mixins.length) {
-      appContext.mixins.forEach(extendEmits);
-    }
-    if (comp.extends) {
-      extendEmits(comp.extends);
-    }
-    if (comp.mixins) {
-      comp.mixins.forEach(extendEmits);
-    }
-  }
-  if (!raw && !hasExtends) {
-    if (isObject(comp)) {
-      cache.set(comp, null);
-    }
-    return null;
-  }
-  if (isArray(raw)) {
-    raw.forEach((key) => normalized[key] = null);
-  } else {
-    extend(normalized, raw);
-  }
-  if (isObject(comp)) {
-    cache.set(comp, normalized);
-  }
-  return normalized;
-}
-function isEmitListener(options, key) {
-  if (!options || !isOn(key)) {
-    return false;
-  }
-  key = key.slice(2).replace(/Once$/, "");
-  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
-}
-
-let currentRenderingInstance = null;
-let currentScopeId = null;
-function setCurrentRenderingInstance(instance) {
-  const prev = currentRenderingInstance;
-  currentRenderingInstance = instance;
-  currentScopeId = instance && instance.type.__scopeId || null;
-  return prev;
-}
-function pushScopeId(id) {
-  currentScopeId = id;
-}
-function popScopeId() {
-  currentScopeId = null;
-}
-const withScopeId = (_id) => withCtx;
-function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
-  if (!ctx)
-    return fn;
-  if (fn._n) {
-    return fn;
-  }
-  const renderFnWithContext = (...args) => {
-    if (renderFnWithContext._d) {
-      setBlockTracking(-1);
-    }
-    const prevInstance = setCurrentRenderingInstance(ctx);
-    let res;
-    try {
-      res = fn(...args);
-    } finally {
-      setCurrentRenderingInstance(prevInstance);
-      if (renderFnWithContext._d) {
-        setBlockTracking(1);
-      }
-    }
-    {
-      devtoolsComponentUpdated(ctx);
-    }
-    return res;
-  };
-  renderFnWithContext._n = true;
-  renderFnWithContext._c = true;
-  renderFnWithContext._d = true;
-  return renderFnWithContext;
-}
-
-let accessedAttrs = false;
-function markAttrsAccessed() {
-  accessedAttrs = true;
-}
-function renderComponentRoot(instance) {
-  const {
-    type: Component,
-    vnode,
-    proxy,
-    withProxy,
-    props,
-    propsOptions: [propsOptions],
-    slots,
-    attrs,
-    emit,
-    render,
-    renderCache,
-    data,
-    setupState,
-    ctx,
-    inheritAttrs
-  } = instance;
-  let result;
-  let fallthroughAttrs;
-  const prev = setCurrentRenderingInstance(instance);
-  {
-    accessedAttrs = false;
-  }
-  try {
-    if (vnode.shapeFlag & 4) {
-      const proxyToUse = withProxy || proxy;
-      result = normalizeVNode(
-        render.call(
-          proxyToUse,
-          proxyToUse,
-          renderCache,
-          props,
-          setupState,
-          data,
-          ctx
-        )
-      );
-      fallthroughAttrs = attrs;
-    } else {
-      const render2 = Component;
-      if (attrs === props) {
-        markAttrsAccessed();
-      }
-      result = normalizeVNode(
-        render2.length > 1 ? render2(
-          props,
-          true ? {
-            get attrs() {
-              markAttrsAccessed();
-              return attrs;
-            },
-            slots,
-            emit
-          } : { attrs, slots, emit }
-        ) : render2(
-          props,
-          null
-          /* we know it doesn't need it */
-        )
-      );
-      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
-    }
-  } catch (err) {
-    blockStack.length = 0;
-    handleError(err, instance, 1);
-    result = createVNode(Comment);
-  }
-  let root = result;
-  let setRoot = void 0;
-  if (result.patchFlag > 0 && result.patchFlag & 2048) {
-    [root, setRoot] = getChildRoot(result);
-  }
-  if (fallthroughAttrs && inheritAttrs !== false) {
-    const keys = Object.keys(fallthroughAttrs);
-    const { shapeFlag } = root;
-    if (keys.length) {
-      if (shapeFlag & (1 | 6)) {
-        if (propsOptions && keys.some(isModelListener)) {
-          fallthroughAttrs = filterModelListeners(
-            fallthroughAttrs,
-            propsOptions
-          );
-        }
-        root = cloneVNode(root, fallthroughAttrs);
-      } else if (!accessedAttrs && root.type !== Comment) {
-        const allAttrs = Object.keys(attrs);
-        const eventAttrs = [];
-        const extraAttrs = [];
-        for (let i = 0, l = allAttrs.length; i < l; i++) {
-          const key = allAttrs[i];
-          if (isOn(key)) {
-            if (!isModelListener(key)) {
-              eventAttrs.push(key[2].toLowerCase() + key.slice(3));
-            }
-          } else {
-            extraAttrs.push(key);
-          }
-        }
-        if (extraAttrs.length) {
-          warn(
-            `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`
-          );
-        }
-        if (eventAttrs.length) {
-          warn(
-            `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`
-          );
-        }
-      }
-    }
-  }
-  if (vnode.dirs) {
-    if (!isElementRoot(root)) {
-      warn(
-        `Runtime directive used on component with non-element root node. The directives will not function as intended.`
-      );
-    }
-    root = cloneVNode(root);
-    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
-  }
-  if (vnode.transition) {
-    if (!isElementRoot(root)) {
-      warn(
-        `Component inside <Transition> renders non-element root node that cannot be animated.`
-      );
-    }
-    root.transition = vnode.transition;
-  }
-  if (setRoot) {
-    setRoot(root);
-  } else {
-    result = root;
-  }
-  setCurrentRenderingInstance(prev);
-  return result;
-}
-const getChildRoot = (vnode) => {
-  const rawChildren = vnode.children;
-  const dynamicChildren = vnode.dynamicChildren;
-  const childRoot = filterSingleRoot(rawChildren);
-  if (!childRoot) {
-    return [vnode, void 0];
-  }
-  const index = rawChildren.indexOf(childRoot);
-  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
-  const setRoot = (updatedRoot) => {
-    rawChildren[index] = updatedRoot;
-    if (dynamicChildren) {
-      if (dynamicIndex > -1) {
-        dynamicChildren[dynamicIndex] = updatedRoot;
-      } else if (updatedRoot.patchFlag > 0) {
-        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
-      }
-    }
-  };
-  return [normalizeVNode(childRoot), setRoot];
-};
-function filterSingleRoot(children) {
-  let singleRoot;
-  for (let i = 0; i < children.length; i++) {
-    const child = children[i];
-    if (isVNode(child)) {
-      if (child.type !== Comment || child.children === "v-if") {
-        if (singleRoot) {
-          return;
-        } else {
-          singleRoot = child;
-        }
-      }
-    } else {
-      return;
-    }
-  }
-  return singleRoot;
-}
-const getFunctionalFallthrough = (attrs) => {
-  let res;
-  for (const key in attrs) {
-    if (key === "class" || key === "style" || isOn(key)) {
-      (res || (res = {}))[key] = attrs[key];
-    }
-  }
-  return res;
-};
-const filterModelListeners = (attrs, props) => {
-  const res = {};
-  for (const key in attrs) {
-    if (!isModelListener(key) || !(key.slice(9) in props)) {
-      res[key] = attrs[key];
-    }
-  }
-  return res;
-};
-const isElementRoot = (vnode) => {
-  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;
-};
-function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
-  const { props: prevProps, children: prevChildren, component } = prevVNode;
-  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
-  const emits = component.emitsOptions;
-  if ((prevChildren || nextChildren) && isHmrUpdating) {
-    return true;
-  }
-  if (nextVNode.dirs || nextVNode.transition) {
-    return true;
-  }
-  if (optimized && patchFlag >= 0) {
-    if (patchFlag & 1024) {
-      return true;
-    }
-    if (patchFlag & 16) {
-      if (!prevProps) {
-        return !!nextProps;
-      }
-      return hasPropsChanged(prevProps, nextProps, emits);
-    } else if (patchFlag & 8) {
-      const dynamicProps = nextVNode.dynamicProps;
-      for (let i = 0; i < dynamicProps.length; i++) {
-        const key = dynamicProps[i];
-        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
-          return true;
-        }
-      }
-    }
-  } else {
-    if (prevChildren || nextChildren) {
-      if (!nextChildren || !nextChildren.$stable) {
-        return true;
-      }
-    }
-    if (prevProps === nextProps) {
-      return false;
-    }
-    if (!prevProps) {
-      return !!nextProps;
-    }
-    if (!nextProps) {
-      return true;
-    }
-    return hasPropsChanged(prevProps, nextProps, emits);
-  }
-  return false;
-}
-function hasPropsChanged(prevProps, nextProps, emitsOptions) {
-  const nextKeys = Object.keys(nextProps);
-  if (nextKeys.length !== Object.keys(prevProps).length) {
-    return true;
-  }
-  for (let i = 0; i < nextKeys.length; i++) {
-    const key = nextKeys[i];
-    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
-      return true;
-    }
-  }
-  return false;
-}
-function updateHOCHostEl({ vnode, parent }, el) {
-  while (parent && parent.subTree === vnode) {
-    (vnode = parent.vnode).el = el;
-    parent = parent.parent;
-  }
-}
-
-const isSuspense = (type) => type.__isSuspense;
-const SuspenseImpl = {
-  name: "Suspense",
-  // In order to make Suspense tree-shakable, we need to avoid importing it
-  // directly in the renderer. The renderer checks for the __isSuspense flag
-  // on a vnode's type and calls the `process` method, passing in renderer
-  // internals.
-  __isSuspense: true,
-  process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {
-    if (n1 == null) {
-      mountSuspense(
-        n2,
-        container,
-        anchor,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized,
-        rendererInternals
-      );
-    } else {
-      patchSuspense(
-        n1,
-        n2,
-        container,
-        anchor,
-        parentComponent,
-        isSVG,
-        slotScopeIds,
-        optimized,
-        rendererInternals
-      );
-    }
-  },
-  hydrate: hydrateSuspense,
-  create: createSuspenseBoundary,
-  normalize: normalizeSuspenseChildren
-};
-const Suspense = SuspenseImpl ;
-function triggerEvent(vnode, name) {
-  const eventListener = vnode.props && vnode.props[name];
-  if (isFunction(eventListener)) {
-    eventListener();
-  }
-}
-function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {
-  const {
-    p: patch,
-    o: { createElement }
-  } = rendererInternals;
-  const hiddenContainer = createElement("div");
-  const suspense = vnode.suspense = createSuspenseBoundary(
-    vnode,
-    parentSuspense,
-    parentComponent,
-    container,
-    hiddenContainer,
-    anchor,
-    isSVG,
-    slotScopeIds,
-    optimized,
-    rendererInternals
-  );
-  patch(
-    null,
-    suspense.pendingBranch = vnode.ssContent,
-    hiddenContainer,
-    null,
-    parentComponent,
-    suspense,
-    isSVG,
-    slotScopeIds
-  );
-  if (suspense.deps > 0) {
-    triggerEvent(vnode, "onPending");
-    triggerEvent(vnode, "onFallback");
-    patch(
-      null,
-      vnode.ssFallback,
-      container,
-      anchor,
-      parentComponent,
-      null,
-      // fallback tree will not have suspense context
-      isSVG,
-      slotScopeIds
-    );
-    setActiveBranch(suspense, vnode.ssFallback);
-  } else {
-    suspense.resolve(false, true);
-  }
-}
-function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {
-  const suspense = n2.suspense = n1.suspense;
-  suspense.vnode = n2;
-  n2.el = n1.el;
-  const newBranch = n2.ssContent;
-  const newFallback = n2.ssFallback;
-  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
-  if (pendingBranch) {
-    suspense.pendingBranch = newBranch;
-    if (isSameVNodeType(newBranch, pendingBranch)) {
-      patch(
-        pendingBranch,
-        newBranch,
-        suspense.hiddenContainer,
-        null,
-        parentComponent,
-        suspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-      if (suspense.deps <= 0) {
-        suspense.resolve();
-      } else if (isInFallback) {
-        patch(
-          activeBranch,
-          newFallback,
-          container,
-          anchor,
-          parentComponent,
-          null,
-          // fallback tree will not have suspense context
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        setActiveBranch(suspense, newFallback);
-      }
-    } else {
-      suspense.pendingId++;
-      if (isHydrating) {
-        suspense.isHydrating = false;
-        suspense.activeBranch = pendingBranch;
-      } else {
-        unmount(pendingBranch, parentComponent, suspense);
-      }
-      suspense.deps = 0;
-      suspense.effects.length = 0;
-      suspense.hiddenContainer = createElement("div");
-      if (isInFallback) {
-        patch(
-          null,
-          newBranch,
-          suspense.hiddenContainer,
-          null,
-          parentComponent,
-          suspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        if (suspense.deps <= 0) {
-          suspense.resolve();
-        } else {
-          patch(
-            activeBranch,
-            newFallback,
-            container,
-            anchor,
-            parentComponent,
-            null,
-            // fallback tree will not have suspense context
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-          setActiveBranch(suspense, newFallback);
-        }
-      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
-        patch(
-          activeBranch,
-          newBranch,
-          container,
-          anchor,
-          parentComponent,
-          suspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        suspense.resolve(true);
-      } else {
-        patch(
-          null,
-          newBranch,
-          suspense.hiddenContainer,
-          null,
-          parentComponent,
-          suspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        if (suspense.deps <= 0) {
-          suspense.resolve();
-        }
-      }
-    }
-  } else {
-    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
-      patch(
-        activeBranch,
-        newBranch,
-        container,
-        anchor,
-        parentComponent,
-        suspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-      setActiveBranch(suspense, newBranch);
-    } else {
-      triggerEvent(n2, "onPending");
-      suspense.pendingBranch = newBranch;
-      suspense.pendingId++;
-      patch(
-        null,
-        newBranch,
-        suspense.hiddenContainer,
-        null,
-        parentComponent,
-        suspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-      if (suspense.deps <= 0) {
-        suspense.resolve();
-      } else {
-        const { timeout, pendingId } = suspense;
-        if (timeout > 0) {
-          setTimeout(() => {
-            if (suspense.pendingId === pendingId) {
-              suspense.fallback(newFallback);
-            }
-          }, timeout);
-        } else if (timeout === 0) {
-          suspense.fallback(newFallback);
-        }
-      }
-    }
-  }
-}
-let hasWarned = false;
-function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) {
-  if (!hasWarned) {
-    hasWarned = true;
-    console[console.info ? "info" : "log"](
-      `<Suspense> is an experimental feature and its API will likely change.`
-    );
-  }
-  const {
-    p: patch,
-    m: move,
-    um: unmount,
-    n: next,
-    o: { parentNode, remove }
-  } = rendererInternals;
-  let parentSuspenseId;
-  const isSuspensible = isVNodeSuspensible(vnode);
-  if (isSuspensible) {
-    if (parentSuspense == null ? void 0 : parentSuspense.pendingBranch) {
-      parentSuspenseId = parentSuspense.pendingId;
-      parentSuspense.deps++;
-    }
-  }
-  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;
-  {
-    assertNumber(timeout, `Suspense timeout`);
-  }
-  const suspense = {
-    vnode,
-    parent: parentSuspense,
-    parentComponent,
-    isSVG,
-    container,
-    hiddenContainer,
-    anchor,
-    deps: 0,
-    pendingId: 0,
-    timeout: typeof timeout === "number" ? timeout : -1,
-    activeBranch: null,
-    pendingBranch: null,
-    isInFallback: true,
-    isHydrating,
-    isUnmounted: false,
-    effects: [],
-    resolve(resume = false, sync = false) {
-      {
-        if (!resume && !suspense.pendingBranch) {
-          throw new Error(
-            `suspense.resolve() is called without a pending branch.`
-          );
-        }
-        if (suspense.isUnmounted) {
-          throw new Error(
-            `suspense.resolve() is called on an already unmounted suspense boundary.`
-          );
-        }
-      }
-      const {
-        vnode: vnode2,
-        activeBranch,
-        pendingBranch,
-        pendingId,
-        effects,
-        parentComponent: parentComponent2,
-        container: container2
-      } = suspense;
-      if (suspense.isHydrating) {
-        suspense.isHydrating = false;
-      } else if (!resume) {
-        const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
-        if (delayEnter) {
-          activeBranch.transition.afterLeave = () => {
-            if (pendingId === suspense.pendingId) {
-              move(pendingBranch, container2, anchor2, 0);
-            }
-          };
-        }
-        let { anchor: anchor2 } = suspense;
-        if (activeBranch) {
-          anchor2 = next(activeBranch);
-          unmount(activeBranch, parentComponent2, suspense, true);
-        }
-        if (!delayEnter) {
-          move(pendingBranch, container2, anchor2, 0);
-        }
-      }
-      setActiveBranch(suspense, pendingBranch);
-      suspense.pendingBranch = null;
-      suspense.isInFallback = false;
-      let parent = suspense.parent;
-      let hasUnresolvedAncestor = false;
-      while (parent) {
-        if (parent.pendingBranch) {
-          parent.effects.push(...effects);
-          hasUnresolvedAncestor = true;
-          break;
-        }
-        parent = parent.parent;
-      }
-      if (!hasUnresolvedAncestor) {
-        queuePostFlushCb(effects);
-      }
-      suspense.effects = [];
-      if (isSuspensible) {
-        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {
-          parentSuspense.deps--;
-          if (parentSuspense.deps === 0 && !sync) {
-            parentSuspense.resolve();
-          }
-        }
-      }
-      triggerEvent(vnode2, "onResolve");
-    },
-    fallback(fallbackVNode) {
-      if (!suspense.pendingBranch) {
-        return;
-      }
-      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense;
-      triggerEvent(vnode2, "onFallback");
-      const anchor2 = next(activeBranch);
-      const mountFallback = () => {
-        if (!suspense.isInFallback) {
-          return;
-        }
-        patch(
-          null,
-          fallbackVNode,
-          container2,
-          anchor2,
-          parentComponent2,
-          null,
-          // fallback tree will not have suspense context
-          isSVG2,
-          slotScopeIds,
-          optimized
-        );
-        setActiveBranch(suspense, fallbackVNode);
-      };
-      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in";
-      if (delayEnter) {
-        activeBranch.transition.afterLeave = mountFallback;
-      }
-      suspense.isInFallback = true;
-      unmount(
-        activeBranch,
-        parentComponent2,
-        null,
-        // no suspense so unmount hooks fire now
-        true
-        // shouldRemove
-      );
-      if (!delayEnter) {
-        mountFallback();
-      }
-    },
-    move(container2, anchor2, type) {
-      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);
-      suspense.container = container2;
-    },
-    next() {
-      return suspense.activeBranch && next(suspense.activeBranch);
-    },
-    registerDep(instance, setupRenderEffect) {
-      const isInPendingSuspense = !!suspense.pendingBranch;
-      if (isInPendingSuspense) {
-        suspense.deps++;
-      }
-      const hydratedEl = instance.vnode.el;
-      instance.asyncDep.catch((err) => {
-        handleError(err, instance, 0);
-      }).then((asyncSetupResult) => {
-        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {
-          return;
-        }
-        instance.asyncResolved = true;
-        const { vnode: vnode2 } = instance;
-        {
-          pushWarningContext(vnode2);
-        }
-        handleSetupResult(instance, asyncSetupResult, false);
-        if (hydratedEl) {
-          vnode2.el = hydratedEl;
-        }
-        const placeholder = !hydratedEl && instance.subTree.el;
-        setupRenderEffect(
-          instance,
-          vnode2,
-          // component may have been moved before resolve.
-          // if this is not a hydration, instance.subTree will be the comment
-          // placeholder.
-          parentNode(hydratedEl || instance.subTree.el),
-          // anchor will not be used if this is hydration, so only need to
-          // consider the comment placeholder case.
-          hydratedEl ? null : next(instance.subTree),
-          suspense,
-          isSVG,
-          optimized
-        );
-        if (placeholder) {
-          remove(placeholder);
-        }
-        updateHOCHostEl(instance, vnode2.el);
-        {
-          popWarningContext();
-        }
-        if (isInPendingSuspense && --suspense.deps === 0) {
-          suspense.resolve();
-        }
-      });
-    },
-    unmount(parentSuspense2, doRemove) {
-      suspense.isUnmounted = true;
-      if (suspense.activeBranch) {
-        unmount(
-          suspense.activeBranch,
-          parentComponent,
-          parentSuspense2,
-          doRemove
-        );
-      }
-      if (suspense.pendingBranch) {
-        unmount(
-          suspense.pendingBranch,
-          parentComponent,
-          parentSuspense2,
-          doRemove
-        );
-      }
-    }
-  };
-  return suspense;
-}
-function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) {
-  const suspense = vnode.suspense = createSuspenseBoundary(
-    vnode,
-    parentSuspense,
-    parentComponent,
-    node.parentNode,
-    document.createElement("div"),
-    null,
-    isSVG,
-    slotScopeIds,
-    optimized,
-    rendererInternals,
-    true
-    /* hydrating */
-  );
-  const result = hydrateNode(
-    node,
-    suspense.pendingBranch = vnode.ssContent,
-    parentComponent,
-    suspense,
-    slotScopeIds,
-    optimized
-  );
-  if (suspense.deps === 0) {
-    suspense.resolve(false, true);
-  }
-  return result;
-}
-function normalizeSuspenseChildren(vnode) {
-  const { shapeFlag, children } = vnode;
-  const isSlotChildren = shapeFlag & 32;
-  vnode.ssContent = normalizeSuspenseSlot(
-    isSlotChildren ? children.default : children
-  );
-  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);
-}
-function normalizeSuspenseSlot(s) {
-  let block;
-  if (isFunction(s)) {
-    const trackBlock = isBlockTreeEnabled && s._c;
-    if (trackBlock) {
-      s._d = false;
-      openBlock();
-    }
-    s = s();
-    if (trackBlock) {
-      s._d = true;
-      block = currentBlock;
-      closeBlock();
-    }
-  }
-  if (isArray(s)) {
-    const singleChild = filterSingleRoot(s);
-    if (!singleChild) {
-      warn(`<Suspense> slots expect a single root node.`);
-    }
-    s = singleChild;
-  }
-  s = normalizeVNode(s);
-  if (block && !s.dynamicChildren) {
-    s.dynamicChildren = block.filter((c) => c !== s);
-  }
-  return s;
-}
-function queueEffectWithSuspense(fn, suspense) {
-  if (suspense && suspense.pendingBranch) {
-    if (isArray(fn)) {
-      suspense.effects.push(...fn);
-    } else {
-      suspense.effects.push(fn);
-    }
-  } else {
-    queuePostFlushCb(fn);
-  }
-}
-function setActiveBranch(suspense, branch) {
-  suspense.activeBranch = branch;
-  const { vnode, parentComponent } = suspense;
-  const el = vnode.el = branch.el;
-  if (parentComponent && parentComponent.subTree === vnode) {
-    parentComponent.vnode.el = el;
-    updateHOCHostEl(parentComponent, el);
-  }
-}
-function isVNodeSuspensible(vnode) {
-  var _a;
-  return ((_a = vnode.props) == null ? void 0 : _a.suspensible) != null && vnode.props.suspensible !== false;
-}
-
-function watchEffect(effect, options) {
-  return doWatch(effect, null, options);
-}
-function watchPostEffect(effect, options) {
-  return doWatch(
-    effect,
-    null,
-    extend({}, options, { flush: "post" }) 
-  );
-}
-function watchSyncEffect(effect, options) {
-  return doWatch(
-    effect,
-    null,
-    extend({}, options, { flush: "sync" }) 
-  );
-}
-const INITIAL_WATCHER_VALUE = {};
-function watch(source, cb, options) {
-  if (!isFunction(cb)) {
-    warn(
-      `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
-    );
-  }
-  return doWatch(source, cb, options);
-}
-function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
-  var _a;
-  if (!cb) {
-    if (immediate !== void 0) {
-      warn(
-        `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`
-      );
-    }
-    if (deep !== void 0) {
-      warn(
-        `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
-      );
-    }
-  }
-  const warnInvalidSource = (s) => {
-    warn(
-      `Invalid watch source: `,
-      s,
-      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`
-    );
-  };
-  const instance = getCurrentScope() === ((_a = currentInstance) == null ? void 0 : _a.scope) ? currentInstance : null;
-  let getter;
-  let forceTrigger = false;
-  let isMultiSource = false;
-  if (isRef(source)) {
-    getter = () => source.value;
-    forceTrigger = isShallow(source);
-  } else if (isReactive(source)) {
-    getter = () => source;
-    deep = true;
-  } else if (isArray(source)) {
-    isMultiSource = true;
-    forceTrigger = source.some((s) => isReactive(s) || isShallow(s));
-    getter = () => source.map((s) => {
-      if (isRef(s)) {
-        return s.value;
-      } else if (isReactive(s)) {
-        return traverse(s);
-      } else if (isFunction(s)) {
-        return callWithErrorHandling(s, instance, 2);
-      } else {
-        warnInvalidSource(s);
-      }
-    });
-  } else if (isFunction(source)) {
-    if (cb) {
-      getter = () => callWithErrorHandling(source, instance, 2);
-    } else {
-      getter = () => {
-        if (instance && instance.isUnmounted) {
-          return;
-        }
-        if (cleanup) {
-          cleanup();
-        }
-        return callWithAsyncErrorHandling(
-          source,
-          instance,
-          3,
-          [onCleanup]
-        );
-      };
-    }
-  } else {
-    getter = NOOP;
-    warnInvalidSource(source);
-  }
-  if (cb && deep) {
-    const baseGetter = getter;
-    getter = () => traverse(baseGetter());
-  }
-  let cleanup;
-  let onCleanup = (fn) => {
-    cleanup = effect.onStop = () => {
-      callWithErrorHandling(fn, instance, 4);
-    };
-  };
-  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
-  const job = () => {
-    if (!effect.active) {
-      return;
-    }
-    if (cb) {
-      const newValue = effect.run();
-      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {
-        if (cleanup) {
-          cleanup();
-        }
-        callWithAsyncErrorHandling(cb, instance, 3, [
-          newValue,
-          // pass undefined as the old value when it's changed for the first time
-          oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
-          onCleanup
-        ]);
-        oldValue = newValue;
-      }
-    } else {
-      effect.run();
-    }
-  };
-  job.allowRecurse = !!cb;
-  let scheduler;
-  if (flush === "sync") {
-    scheduler = job;
-  } else if (flush === "post") {
-    scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);
-  } else {
-    job.pre = true;
-    if (instance)
-      job.id = instance.uid;
-    scheduler = () => queueJob(job);
-  }
-  const effect = new ReactiveEffect(getter, scheduler);
-  {
-    effect.onTrack = onTrack;
-    effect.onTrigger = onTrigger;
-  }
-  if (cb) {
-    if (immediate) {
-      job();
-    } else {
-      oldValue = effect.run();
-    }
-  } else if (flush === "post") {
-    queuePostRenderEffect(
-      effect.run.bind(effect),
-      instance && instance.suspense
-    );
-  } else {
-    effect.run();
-  }
-  const unwatch = () => {
-    effect.stop();
-    if (instance && instance.scope) {
-      remove(instance.scope.effects, effect);
-    }
-  };
-  return unwatch;
-}
-function instanceWatch(source, value, options) {
-  const publicThis = this.proxy;
-  const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
-  let cb;
-  if (isFunction(value)) {
-    cb = value;
-  } else {
-    cb = value.handler;
-    options = value;
-  }
-  const cur = currentInstance;
-  setCurrentInstance(this);
-  const res = doWatch(getter, cb.bind(publicThis), options);
-  if (cur) {
-    setCurrentInstance(cur);
-  } else {
-    unsetCurrentInstance();
-  }
-  return res;
-}
-function createPathGetter(ctx, path) {
-  const segments = path.split(".");
-  return () => {
-    let cur = ctx;
-    for (let i = 0; i < segments.length && cur; i++) {
-      cur = cur[segments[i]];
-    }
-    return cur;
-  };
-}
-function traverse(value, seen) {
-  if (!isObject(value) || value["__v_skip"]) {
-    return value;
-  }
-  seen = seen || /* @__PURE__ */ new Set();
-  if (seen.has(value)) {
-    return value;
-  }
-  seen.add(value);
-  if (isRef(value)) {
-    traverse(value.value, seen);
-  } else if (isArray(value)) {
-    for (let i = 0; i < value.length; i++) {
-      traverse(value[i], seen);
-    }
-  } else if (isSet(value) || isMap(value)) {
-    value.forEach((v) => {
-      traverse(v, seen);
-    });
-  } else if (isPlainObject(value)) {
-    for (const key in value) {
-      traverse(value[key], seen);
-    }
-  }
-  return value;
-}
-
-function validateDirectiveName(name) {
-  if (isBuiltInDirective(name)) {
-    warn("Do not use built-in directive ids as custom directive id: " + name);
-  }
-}
-function withDirectives(vnode, directives) {
-  const internalInstance = currentRenderingInstance;
-  if (internalInstance === null) {
-    warn(`withDirectives can only be used inside render functions.`);
-    return vnode;
-  }
-  const instance = getExposeProxy(internalInstance) || internalInstance.proxy;
-  const bindings = vnode.dirs || (vnode.dirs = []);
-  for (let i = 0; i < directives.length; i++) {
-    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
-    if (dir) {
-      if (isFunction(dir)) {
-        dir = {
-          mounted: dir,
-          updated: dir
-        };
-      }
-      if (dir.deep) {
-        traverse(value);
-      }
-      bindings.push({
-        dir,
-        instance,
-        value,
-        oldValue: void 0,
-        arg,
-        modifiers
-      });
-    }
-  }
-  return vnode;
-}
-function invokeDirectiveHook(vnode, prevVNode, instance, name) {
-  const bindings = vnode.dirs;
-  const oldBindings = prevVNode && prevVNode.dirs;
-  for (let i = 0; i < bindings.length; i++) {
-    const binding = bindings[i];
-    if (oldBindings) {
-      binding.oldValue = oldBindings[i].value;
-    }
-    let hook = binding.dir[name];
-    if (hook) {
-      pauseTracking();
-      callWithAsyncErrorHandling(hook, instance, 8, [
-        vnode.el,
-        binding,
-        vnode,
-        prevVNode
-      ]);
-      resetTracking();
-    }
-  }
-}
-
-const leaveCbKey = Symbol("_leaveCb");
-const enterCbKey$1 = Symbol("_enterCb");
-function useTransitionState() {
-  const state = {
-    isMounted: false,
-    isLeaving: false,
-    isUnmounting: false,
-    leavingVNodes: /* @__PURE__ */ new Map()
-  };
-  onMounted(() => {
-    state.isMounted = true;
-  });
-  onBeforeUnmount(() => {
-    state.isUnmounting = true;
-  });
-  return state;
-}
-const TransitionHookValidator = [Function, Array];
-const BaseTransitionPropsValidators = {
-  mode: String,
-  appear: Boolean,
-  persisted: Boolean,
-  // enter
-  onBeforeEnter: TransitionHookValidator,
-  onEnter: TransitionHookValidator,
-  onAfterEnter: TransitionHookValidator,
-  onEnterCancelled: TransitionHookValidator,
-  // leave
-  onBeforeLeave: TransitionHookValidator,
-  onLeave: TransitionHookValidator,
-  onAfterLeave: TransitionHookValidator,
-  onLeaveCancelled: TransitionHookValidator,
-  // appear
-  onBeforeAppear: TransitionHookValidator,
-  onAppear: TransitionHookValidator,
-  onAfterAppear: TransitionHookValidator,
-  onAppearCancelled: TransitionHookValidator
-};
-const BaseTransitionImpl = {
-  name: `BaseTransition`,
-  props: BaseTransitionPropsValidators,
-  setup(props, { slots }) {
-    const instance = getCurrentInstance();
-    const state = useTransitionState();
-    let prevTransitionKey;
-    return () => {
-      const children = slots.default && getTransitionRawChildren(slots.default(), true);
-      if (!children || !children.length) {
-        return;
-      }
-      let child = children[0];
-      if (children.length > 1) {
-        let hasFound = false;
-        for (const c of children) {
-          if (c.type !== Comment) {
-            if (hasFound) {
-              warn(
-                "<transition> can only be used on a single element or component. Use <transition-group> for lists."
-              );
-              break;
-            }
-            child = c;
-            hasFound = true;
-          }
-        }
-      }
-      const rawProps = toRaw(props);
-      const { mode } = rawProps;
-      if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") {
-        warn(`invalid <transition> mode: ${mode}`);
-      }
-      if (state.isLeaving) {
-        return emptyPlaceholder(child);
-      }
-      const innerChild = getKeepAliveChild(child);
-      if (!innerChild) {
-        return emptyPlaceholder(child);
-      }
-      const enterHooks = resolveTransitionHooks(
-        innerChild,
-        rawProps,
-        state,
-        instance
-      );
-      setTransitionHooks(innerChild, enterHooks);
-      const oldChild = instance.subTree;
-      const oldInnerChild = oldChild && getKeepAliveChild(oldChild);
-      let transitionKeyChanged = false;
-      const { getTransitionKey } = innerChild.type;
-      if (getTransitionKey) {
-        const key = getTransitionKey();
-        if (prevTransitionKey === void 0) {
-          prevTransitionKey = key;
-        } else if (key !== prevTransitionKey) {
-          prevTransitionKey = key;
-          transitionKeyChanged = true;
-        }
-      }
-      if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {
-        const leavingHooks = resolveTransitionHooks(
-          oldInnerChild,
-          rawProps,
-          state,
-          instance
-        );
-        setTransitionHooks(oldInnerChild, leavingHooks);
-        if (mode === "out-in") {
-          state.isLeaving = true;
-          leavingHooks.afterLeave = () => {
-            state.isLeaving = false;
-            if (instance.update.active !== false) {
-              instance.update();
-            }
-          };
-          return emptyPlaceholder(child);
-        } else if (mode === "in-out" && innerChild.type !== Comment) {
-          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
-            const leavingVNodesCache = getLeavingNodesForType(
-              state,
-              oldInnerChild
-            );
-            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
-            el[leaveCbKey] = () => {
-              earlyRemove();
-              el[leaveCbKey] = void 0;
-              delete enterHooks.delayedLeave;
-            };
-            enterHooks.delayedLeave = delayedLeave;
-          };
-        }
-      }
-      return child;
-    };
-  }
-};
-const BaseTransition = BaseTransitionImpl;
-function getLeavingNodesForType(state, vnode) {
-  const { leavingVNodes } = state;
-  let leavingVNodesCache = leavingVNodes.get(vnode.type);
-  if (!leavingVNodesCache) {
-    leavingVNodesCache = /* @__PURE__ */ Object.create(null);
-    leavingVNodes.set(vnode.type, leavingVNodesCache);
-  }
-  return leavingVNodesCache;
-}
-function resolveTransitionHooks(vnode, props, state, instance) {
-  const {
-    appear,
-    mode,
-    persisted = false,
-    onBeforeEnter,
-    onEnter,
-    onAfterEnter,
-    onEnterCancelled,
-    onBeforeLeave,
-    onLeave,
-    onAfterLeave,
-    onLeaveCancelled,
-    onBeforeAppear,
-    onAppear,
-    onAfterAppear,
-    onAppearCancelled
-  } = props;
-  const key = String(vnode.key);
-  const leavingVNodesCache = getLeavingNodesForType(state, vnode);
-  const callHook = (hook, args) => {
-    hook && callWithAsyncErrorHandling(
-      hook,
-      instance,
-      9,
-      args
-    );
-  };
-  const callAsyncHook = (hook, args) => {
-    const done = args[1];
-    callHook(hook, args);
-    if (isArray(hook)) {
-      if (hook.every((hook2) => hook2.length <= 1))
-        done();
-    } else if (hook.length <= 1) {
-      done();
-    }
-  };
-  const hooks = {
-    mode,
-    persisted,
-    beforeEnter(el) {
-      let hook = onBeforeEnter;
-      if (!state.isMounted) {
-        if (appear) {
-          hook = onBeforeAppear || onBeforeEnter;
-        } else {
-          return;
-        }
-      }
-      if (el[leaveCbKey]) {
-        el[leaveCbKey](
-          true
-          /* cancelled */
-        );
-      }
-      const leavingVNode = leavingVNodesCache[key];
-      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {
-        leavingVNode.el[leaveCbKey]();
-      }
-      callHook(hook, [el]);
-    },
-    enter(el) {
-      let hook = onEnter;
-      let afterHook = onAfterEnter;
-      let cancelHook = onEnterCancelled;
-      if (!state.isMounted) {
-        if (appear) {
-          hook = onAppear || onEnter;
-          afterHook = onAfterAppear || onAfterEnter;
-          cancelHook = onAppearCancelled || onEnterCancelled;
-        } else {
-          return;
-        }
-      }
-      let called = false;
-      const done = el[enterCbKey$1] = (cancelled) => {
-        if (called)
-          return;
-        called = true;
-        if (cancelled) {
-          callHook(cancelHook, [el]);
-        } else {
-          callHook(afterHook, [el]);
-        }
-        if (hooks.delayedLeave) {
-          hooks.delayedLeave();
-        }
-        el[enterCbKey$1] = void 0;
-      };
-      if (hook) {
-        callAsyncHook(hook, [el, done]);
-      } else {
-        done();
-      }
-    },
-    leave(el, remove) {
-      const key2 = String(vnode.key);
-      if (el[enterCbKey$1]) {
-        el[enterCbKey$1](
-          true
-          /* cancelled */
-        );
-      }
-      if (state.isUnmounting) {
-        return remove();
-      }
-      callHook(onBeforeLeave, [el]);
-      let called = false;
-      const done = el[leaveCbKey] = (cancelled) => {
-        if (called)
-          return;
-        called = true;
-        remove();
-        if (cancelled) {
-          callHook(onLeaveCancelled, [el]);
-        } else {
-          callHook(onAfterLeave, [el]);
-        }
-        el[leaveCbKey] = void 0;
-        if (leavingVNodesCache[key2] === vnode) {
-          delete leavingVNodesCache[key2];
-        }
-      };
-      leavingVNodesCache[key2] = vnode;
-      if (onLeave) {
-        callAsyncHook(onLeave, [el, done]);
-      } else {
-        done();
-      }
-    },
-    clone(vnode2) {
-      return resolveTransitionHooks(vnode2, props, state, instance);
-    }
-  };
-  return hooks;
-}
-function emptyPlaceholder(vnode) {
-  if (isKeepAlive(vnode)) {
-    vnode = cloneVNode(vnode);
-    vnode.children = null;
-    return vnode;
-  }
-}
-function getKeepAliveChild(vnode) {
-  return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode;
-}
-function setTransitionHooks(vnode, hooks) {
-  if (vnode.shapeFlag & 6 && vnode.component) {
-    setTransitionHooks(vnode.component.subTree, hooks);
-  } else if (vnode.shapeFlag & 128) {
-    vnode.ssContent.transition = hooks.clone(vnode.ssContent);
-    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
-  } else {
-    vnode.transition = hooks;
-  }
-}
-function getTransitionRawChildren(children, keepComment = false, parentKey) {
-  let ret = [];
-  let keyedFragmentCount = 0;
-  for (let i = 0; i < children.length; i++) {
-    let child = children[i];
-    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);
-    if (child.type === Fragment) {
-      if (child.patchFlag & 128)
-        keyedFragmentCount++;
-      ret = ret.concat(
-        getTransitionRawChildren(child.children, keepComment, key)
-      );
-    } else if (keepComment || child.type !== Comment) {
-      ret.push(key != null ? cloneVNode(child, { key }) : child);
-    }
-  }
-  if (keyedFragmentCount > 1) {
-    for (let i = 0; i < ret.length; i++) {
-      ret[i].patchFlag = -2;
-    }
-  }
-  return ret;
-}
-
-/*! #__NO_SIDE_EFFECTS__ */
-// @__NO_SIDE_EFFECTS__
-function defineComponent(options, extraOptions) {
-  return isFunction(options) ? (
-    // #8326: extend call and options.name access are considered side-effects
-    // by Rollup, so we have to wrap it in a pure-annotated IIFE.
-    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()
-  ) : options;
-}
-
-const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
-/*! #__NO_SIDE_EFFECTS__ */
-// @__NO_SIDE_EFFECTS__
-function defineAsyncComponent(source) {
-  if (isFunction(source)) {
-    source = { loader: source };
-  }
-  const {
-    loader,
-    loadingComponent,
-    errorComponent,
-    delay = 200,
-    timeout,
-    // undefined = never times out
-    suspensible = true,
-    onError: userOnError
-  } = source;
-  let pendingRequest = null;
-  let resolvedComp;
-  let retries = 0;
-  const retry = () => {
-    retries++;
-    pendingRequest = null;
-    return load();
-  };
-  const load = () => {
-    let thisRequest;
-    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {
-      err = err instanceof Error ? err : new Error(String(err));
-      if (userOnError) {
-        return new Promise((resolve, reject) => {
-          const userRetry = () => resolve(retry());
-          const userFail = () => reject(err);
-          userOnError(err, userRetry, userFail, retries + 1);
-        });
-      } else {
-        throw err;
-      }
-    }).then((comp) => {
-      if (thisRequest !== pendingRequest && pendingRequest) {
-        return pendingRequest;
-      }
-      if (!comp) {
-        warn(
-          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`
-        );
-      }
-      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) {
-        comp = comp.default;
-      }
-      if (comp && !isObject(comp) && !isFunction(comp)) {
-        throw new Error(`Invalid async component load result: ${comp}`);
-      }
-      resolvedComp = comp;
-      return comp;
-    }));
-  };
-  return defineComponent({
-    name: "AsyncComponentWrapper",
-    __asyncLoader: load,
-    get __asyncResolved() {
-      return resolvedComp;
-    },
-    setup() {
-      const instance = currentInstance;
-      if (resolvedComp) {
-        return () => createInnerComp(resolvedComp, instance);
-      }
-      const onError = (err) => {
-        pendingRequest = null;
-        handleError(
-          err,
-          instance,
-          13,
-          !errorComponent
-          /* do not throw in dev if user provided error component */
-        );
-      };
-      if (suspensible && instance.suspense || false) {
-        return load().then((comp) => {
-          return () => createInnerComp(comp, instance);
-        }).catch((err) => {
-          onError(err);
-          return () => errorComponent ? createVNode(errorComponent, {
-            error: err
-          }) : null;
-        });
-      }
-      const loaded = ref(false);
-      const error = ref();
-      const delayed = ref(!!delay);
-      if (delay) {
-        setTimeout(() => {
-          delayed.value = false;
-        }, delay);
-      }
-      if (timeout != null) {
-        setTimeout(() => {
-          if (!loaded.value && !error.value) {
-            const err = new Error(
-              `Async component timed out after ${timeout}ms.`
-            );
-            onError(err);
-            error.value = err;
-          }
-        }, timeout);
-      }
-      load().then(() => {
-        loaded.value = true;
-        if (instance.parent && isKeepAlive(instance.parent.vnode)) {
-          queueJob(instance.parent.update);
-        }
-      }).catch((err) => {
-        onError(err);
-        error.value = err;
-      });
-      return () => {
-        if (loaded.value && resolvedComp) {
-          return createInnerComp(resolvedComp, instance);
-        } else if (error.value && errorComponent) {
-          return createVNode(errorComponent, {
-            error: error.value
-          });
-        } else if (loadingComponent && !delayed.value) {
-          return createVNode(loadingComponent);
-        }
-      };
-    }
-  });
-}
-function createInnerComp(comp, parent) {
-  const { ref: ref2, props, children, ce } = parent.vnode;
-  const vnode = createVNode(comp, props, children);
-  vnode.ref = ref2;
-  vnode.ce = ce;
-  delete parent.vnode.ce;
-  return vnode;
-}
-
-const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
-const KeepAliveImpl = {
-  name: `KeepAlive`,
-  // Marker for special handling inside the renderer. We are not using a ===
-  // check directly on KeepAlive in the renderer, because importing it directly
-  // would prevent it from being tree-shaken.
-  __isKeepAlive: true,
-  props: {
-    include: [String, RegExp, Array],
-    exclude: [String, RegExp, Array],
-    max: [String, Number]
-  },
-  setup(props, { slots }) {
-    const instance = getCurrentInstance();
-    const sharedContext = instance.ctx;
-    const cache = /* @__PURE__ */ new Map();
-    const keys = /* @__PURE__ */ new Set();
-    let current = null;
-    {
-      instance.__v_cache = cache;
-    }
-    const parentSuspense = instance.suspense;
-    const {
-      renderer: {
-        p: patch,
-        m: move,
-        um: _unmount,
-        o: { createElement }
-      }
-    } = sharedContext;
-    const storageContainer = createElement("div");
-    sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {
-      const instance2 = vnode.component;
-      move(vnode, container, anchor, 0, parentSuspense);
-      patch(
-        instance2.vnode,
-        vnode,
-        container,
-        anchor,
-        instance2,
-        parentSuspense,
-        isSVG,
-        vnode.slotScopeIds,
-        optimized
-      );
-      queuePostRenderEffect(() => {
-        instance2.isDeactivated = false;
-        if (instance2.a) {
-          invokeArrayFns(instance2.a);
-        }
-        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
-        if (vnodeHook) {
-          invokeVNodeHook(vnodeHook, instance2.parent, vnode);
-        }
-      }, parentSuspense);
-      {
-        devtoolsComponentAdded(instance2);
-      }
-    };
-    sharedContext.deactivate = (vnode) => {
-      const instance2 = vnode.component;
-      move(vnode, storageContainer, null, 1, parentSuspense);
-      queuePostRenderEffect(() => {
-        if (instance2.da) {
-          invokeArrayFns(instance2.da);
-        }
-        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
-        if (vnodeHook) {
-          invokeVNodeHook(vnodeHook, instance2.parent, vnode);
-        }
-        instance2.isDeactivated = true;
-      }, parentSuspense);
-      {
-        devtoolsComponentAdded(instance2);
-      }
-    };
-    function unmount(vnode) {
-      resetShapeFlag(vnode);
-      _unmount(vnode, instance, parentSuspense, true);
-    }
-    function pruneCache(filter) {
-      cache.forEach((vnode, key) => {
-        const name = getComponentName(vnode.type);
-        if (name && (!filter || !filter(name))) {
-          pruneCacheEntry(key);
-        }
-      });
-    }
-    function pruneCacheEntry(key) {
-      const cached = cache.get(key);
-      if (!current || !isSameVNodeType(cached, current)) {
-        unmount(cached);
-      } else if (current) {
-        resetShapeFlag(current);
-      }
-      cache.delete(key);
-      keys.delete(key);
-    }
-    watch(
-      () => [props.include, props.exclude],
-      ([include, exclude]) => {
-        include && pruneCache((name) => matches(include, name));
-        exclude && pruneCache((name) => !matches(exclude, name));
-      },
-      // prune post-render after `current` has been updated
-      { flush: "post", deep: true }
-    );
-    let pendingCacheKey = null;
-    const cacheSubtree = () => {
-      if (pendingCacheKey != null) {
-        cache.set(pendingCacheKey, getInnerChild(instance.subTree));
-      }
-    };
-    onMounted(cacheSubtree);
-    onUpdated(cacheSubtree);
-    onBeforeUnmount(() => {
-      cache.forEach((cached) => {
-        const { subTree, suspense } = instance;
-        const vnode = getInnerChild(subTree);
-        if (cached.type === vnode.type && cached.key === vnode.key) {
-          resetShapeFlag(vnode);
-          const da = vnode.component.da;
-          da && queuePostRenderEffect(da, suspense);
-          return;
-        }
-        unmount(cached);
-      });
-    });
-    return () => {
-      pendingCacheKey = null;
-      if (!slots.default) {
-        return null;
-      }
-      const children = slots.default();
-      const rawVNode = children[0];
-      if (children.length > 1) {
-        {
-          warn(`KeepAlive should contain exactly one component child.`);
-        }
-        current = null;
-        return children;
-      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {
-        current = null;
-        return rawVNode;
-      }
-      let vnode = getInnerChild(rawVNode);
-      const comp = vnode.type;
-      const name = getComponentName(
-        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp
-      );
-      const { include, exclude, max } = props;
-      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {
-        current = vnode;
-        return rawVNode;
-      }
-      const key = vnode.key == null ? comp : vnode.key;
-      const cachedVNode = cache.get(key);
-      if (vnode.el) {
-        vnode = cloneVNode(vnode);
-        if (rawVNode.shapeFlag & 128) {
-          rawVNode.ssContent = vnode;
-        }
-      }
-      pendingCacheKey = key;
-      if (cachedVNode) {
-        vnode.el = cachedVNode.el;
-        vnode.component = cachedVNode.component;
-        if (vnode.transition) {
-          setTransitionHooks(vnode, vnode.transition);
-        }
-        vnode.shapeFlag |= 512;
-        keys.delete(key);
-        keys.add(key);
-      } else {
-        keys.add(key);
-        if (max && keys.size > parseInt(max, 10)) {
-          pruneCacheEntry(keys.values().next().value);
-        }
-      }
-      vnode.shapeFlag |= 256;
-      current = vnode;
-      return isSuspense(rawVNode.type) ? rawVNode : vnode;
-    };
-  }
-};
-const KeepAlive = KeepAliveImpl;
-function matches(pattern, name) {
-  if (isArray(pattern)) {
-    return pattern.some((p) => matches(p, name));
-  } else if (isString(pattern)) {
-    return pattern.split(",").includes(name);
-  } else if (isRegExp(pattern)) {
-    return pattern.test(name);
-  }
-  return false;
-}
-function onActivated(hook, target) {
-  registerKeepAliveHook(hook, "a", target);
-}
-function onDeactivated(hook, target) {
-  registerKeepAliveHook(hook, "da", target);
-}
-function registerKeepAliveHook(hook, type, target = currentInstance) {
-  const wrappedHook = hook.__wdc || (hook.__wdc = () => {
-    let current = target;
-    while (current) {
-      if (current.isDeactivated) {
-        return;
-      }
-      current = current.parent;
-    }
-    return hook();
-  });
-  injectHook(type, wrappedHook, target);
-  if (target) {
-    let current = target.parent;
-    while (current && current.parent) {
-      if (isKeepAlive(current.parent.vnode)) {
-        injectToKeepAliveRoot(wrappedHook, type, target, current);
-      }
-      current = current.parent;
-    }
-  }
-}
-function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
-  const injected = injectHook(
-    type,
-    hook,
-    keepAliveRoot,
-    true
-    /* prepend */
-  );
-  onUnmounted(() => {
-    remove(keepAliveRoot[type], injected);
-  }, target);
-}
-function resetShapeFlag(vnode) {
-  vnode.shapeFlag &= ~256;
-  vnode.shapeFlag &= ~512;
-}
-function getInnerChild(vnode) {
-  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;
-}
-
-function injectHook(type, hook, target = currentInstance, prepend = false) {
-  if (target) {
-    const hooks = target[type] || (target[type] = []);
-    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
-      if (target.isUnmounted) {
-        return;
-      }
-      pauseTracking();
-      setCurrentInstance(target);
-      const res = callWithAsyncErrorHandling(hook, target, type, args);
-      unsetCurrentInstance();
-      resetTracking();
-      return res;
-    });
-    if (prepend) {
-      hooks.unshift(wrappedHook);
-    } else {
-      hooks.push(wrappedHook);
-    }
-    return wrappedHook;
-  } else {
-    const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ""));
-    warn(
-      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )
-    );
-  }
-}
-const createHook = (lifecycle) => (hook, target = currentInstance) => (
-  // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
-  (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target)
-);
-const onBeforeMount = createHook("bm");
-const onMounted = createHook("m");
-const onBeforeUpdate = createHook("bu");
-const onUpdated = createHook("u");
-const onBeforeUnmount = createHook("bum");
-const onUnmounted = createHook("um");
-const onServerPrefetch = createHook("sp");
-const onRenderTriggered = createHook(
-  "rtg"
-);
-const onRenderTracked = createHook(
-  "rtc"
-);
-function onErrorCaptured(hook, target = currentInstance) {
-  injectHook("ec", hook, target);
-}
-
-const COMPONENTS = "components";
-const DIRECTIVES = "directives";
-function resolveComponent(name, maybeSelfReference) {
-  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
-}
-const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
-function resolveDynamicComponent(component) {
-  if (isString(component)) {
-    return resolveAsset(COMPONENTS, component, false) || component;
-  } else {
-    return component || NULL_DYNAMIC_COMPONENT;
-  }
-}
-function resolveDirective(name) {
-  return resolveAsset(DIRECTIVES, name);
-}
-function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
-  const instance = currentRenderingInstance || currentInstance;
-  if (instance) {
-    const Component = instance.type;
-    if (type === COMPONENTS) {
-      const selfName = getComponentName(
-        Component,
-        false
-        /* do not include inferred name to avoid breaking existing code */
-      );
-      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
-        return Component;
-      }
-    }
-    const res = (
-      // local registration
-      // check instance[type] first which is resolved for options API
-      resolve(instance[type] || Component[type], name) || // global registration
-      resolve(instance.appContext[type], name)
-    );
-    if (!res && maybeSelfReference) {
-      return Component;
-    }
-    if (warnMissing && !res) {
-      const extra = type === COMPONENTS ? `
-If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
-      warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
-    }
-    return res;
-  } else {
-    warn(
-      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`
-    );
-  }
-}
-function resolve(registry, name) {
-  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
-}
-
-function renderList(source, renderItem, cache, index) {
-  let ret;
-  const cached = cache && cache[index];
-  if (isArray(source) || isString(source)) {
-    ret = new Array(source.length);
-    for (let i = 0, l = source.length; i < l; i++) {
-      ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);
-    }
-  } else if (typeof source === "number") {
-    if (!Number.isInteger(source)) {
-      warn(`The v-for range expect an integer value but got ${source}.`);
-    }
-    ret = new Array(source);
-    for (let i = 0; i < source; i++) {
-      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
-    }
-  } else if (isObject(source)) {
-    if (source[Symbol.iterator]) {
-      ret = Array.from(
-        source,
-        (item, i) => renderItem(item, i, void 0, cached && cached[i])
-      );
-    } else {
-      const keys = Object.keys(source);
-      ret = new Array(keys.length);
-      for (let i = 0, l = keys.length; i < l; i++) {
-        const key = keys[i];
-        ret[i] = renderItem(source[key], key, i, cached && cached[i]);
-      }
-    }
-  } else {
-    ret = [];
-  }
-  if (cache) {
-    cache[index] = ret;
-  }
-  return ret;
-}
-
-function createSlots(slots, dynamicSlots) {
-  for (let i = 0; i < dynamicSlots.length; i++) {
-    const slot = dynamicSlots[i];
-    if (isArray(slot)) {
-      for (let j = 0; j < slot.length; j++) {
-        slots[slot[j].name] = slot[j].fn;
-      }
-    } else if (slot) {
-      slots[slot.name] = slot.key ? (...args) => {
-        const res = slot.fn(...args);
-        if (res)
-          res.key = slot.key;
-        return res;
-      } : slot.fn;
-    }
-  }
-  return slots;
-}
-
-function renderSlot(slots, name, props = {}, fallback, noSlotted) {
-  if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {
-    if (name !== "default")
-      props.name = name;
-    return createVNode("slot", props, fallback && fallback());
-  }
-  let slot = slots[name];
-  if (slot && slot.length > 1) {
-    warn(
-      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`
-    );
-    slot = () => [];
-  }
-  if (slot && slot._c) {
-    slot._d = false;
-  }
-  openBlock();
-  const validSlotContent = slot && ensureValidVNode(slot(props));
-  const rendered = createBlock(
-    Fragment,
-    {
-      key: props.key || // slot content array of a dynamic conditional slot may have a branch
-      // key attached in the `createSlots` helper, respect that
-      validSlotContent && validSlotContent.key || `_${name}`
-    },
-    validSlotContent || (fallback ? fallback() : []),
-    validSlotContent && slots._ === 1 ? 64 : -2
-  );
-  if (!noSlotted && rendered.scopeId) {
-    rendered.slotScopeIds = [rendered.scopeId + "-s"];
-  }
-  if (slot && slot._c) {
-    slot._d = true;
-  }
-  return rendered;
-}
-function ensureValidVNode(vnodes) {
-  return vnodes.some((child) => {
-    if (!isVNode(child))
-      return true;
-    if (child.type === Comment)
-      return false;
-    if (child.type === Fragment && !ensureValidVNode(child.children))
-      return false;
-    return true;
-  }) ? vnodes : null;
-}
-
-function toHandlers(obj, preserveCaseIfNecessary) {
-  const ret = {};
-  if (!isObject(obj)) {
-    warn(`v-on with no argument expects an object value.`);
-    return ret;
-  }
-  for (const key in obj) {
-    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];
-  }
-  return ret;
-}
-
-const getPublicInstance = (i) => {
-  if (!i)
-    return null;
-  if (isStatefulComponent(i))
-    return getExposeProxy(i) || i.proxy;
-  return getPublicInstance(i.parent);
-};
-const publicPropertiesMap = (
-  // Move PURE marker to new line to workaround compiler discarding it
-  // due to type annotation
-  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {
-    $: (i) => i,
-    $el: (i) => i.vnode.el,
-    $data: (i) => i.data,
-    $props: (i) => shallowReadonly(i.props) ,
-    $attrs: (i) => shallowReadonly(i.attrs) ,
-    $slots: (i) => shallowReadonly(i.slots) ,
-    $refs: (i) => shallowReadonly(i.refs) ,
-    $parent: (i) => getPublicInstance(i.parent),
-    $root: (i) => getPublicInstance(i.root),
-    $emit: (i) => i.emit,
-    $options: (i) => resolveMergedOptions(i) ,
-    $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),
-    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
-    $watch: (i) => instanceWatch.bind(i) 
-  })
-);
-const isReservedPrefix = (key) => key === "_" || key === "$";
-const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
-const PublicInstanceProxyHandlers = {
-  get({ _: instance }, key) {
-    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
-    if (key === "__isVue") {
-      return true;
-    }
-    let normalizedProps;
-    if (key[0] !== "$") {
-      const n = accessCache[key];
-      if (n !== void 0) {
-        switch (n) {
-          case 1 /* SETUP */:
-            return setupState[key];
-          case 2 /* DATA */:
-            return data[key];
-          case 4 /* CONTEXT */:
-            return ctx[key];
-          case 3 /* PROPS */:
-            return props[key];
-        }
-      } else if (hasSetupBinding(setupState, key)) {
-        accessCache[key] = 1 /* SETUP */;
-        return setupState[key];
-      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
-        accessCache[key] = 2 /* DATA */;
-        return data[key];
-      } else if (
-        // only cache other properties when instance has declared (thus stable)
-        // props
-        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
-      ) {
-        accessCache[key] = 3 /* PROPS */;
-        return props[key];
-      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
-        accessCache[key] = 4 /* CONTEXT */;
-        return ctx[key];
-      } else if (shouldCacheAccess) {
-        accessCache[key] = 0 /* OTHER */;
-      }
-    }
-    const publicGetter = publicPropertiesMap[key];
-    let cssModule, globalProperties;
-    if (publicGetter) {
-      if (key === "$attrs") {
-        track(instance, "get", key);
-        markAttrsAccessed();
-      } else if (key === "$slots") {
-        track(instance, "get", key);
-      }
-      return publicGetter(instance);
-    } else if (
-      // css module (injected by vue-loader)
-      (cssModule = type.__cssModules) && (cssModule = cssModule[key])
-    ) {
-      return cssModule;
-    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
-      accessCache[key] = 4 /* CONTEXT */;
-      return ctx[key];
-    } else if (
-      // global properties
-      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
-    ) {
-      {
-        return globalProperties[key];
-      }
-    } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
-    // to infinite warning loop
-    key.indexOf("__v") !== 0)) {
-      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
-        warn(
-          `Property ${JSON.stringify(
-            key
-          )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
-        );
-      } else if (instance === currentRenderingInstance) {
-        warn(
-          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
-        );
-      }
-    }
-  },
-  set({ _: instance }, key, value) {
-    const { data, setupState, ctx } = instance;
-    if (hasSetupBinding(setupState, key)) {
-      setupState[key] = value;
-      return true;
-    } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
-      warn(`Cannot mutate <script setup> binding "${key}" from Options API.`);
-      return false;
-    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
-      data[key] = value;
-      return true;
-    } else if (hasOwn(instance.props, key)) {
-      warn(`Attempting to mutate prop "${key}". Props are readonly.`);
-      return false;
-    }
-    if (key[0] === "$" && key.slice(1) in instance) {
-      warn(
-        `Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.`
-      );
-      return false;
-    } else {
-      if (key in instance.appContext.config.globalProperties) {
-        Object.defineProperty(ctx, key, {
-          enumerable: true,
-          configurable: true,
-          value
-        });
-      } else {
-        ctx[key] = value;
-      }
-    }
-    return true;
-  },
-  has({
-    _: { data, setupState, accessCache, ctx, appContext, propsOptions }
-  }, key) {
-    let normalizedProps;
-    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);
-  },
-  defineProperty(target, key, descriptor) {
-    if (descriptor.get != null) {
-      target._.accessCache[key] = 0;
-    } else if (hasOwn(descriptor, "value")) {
-      this.set(target, key, descriptor.value, null);
-    }
-    return Reflect.defineProperty(target, key, descriptor);
-  }
-};
-{
-  PublicInstanceProxyHandlers.ownKeys = (target) => {
-    warn(
-      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`
-    );
-    return Reflect.ownKeys(target);
-  };
-}
-const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend(
-  {},
-  PublicInstanceProxyHandlers,
-  {
-    get(target, key) {
-      if (key === Symbol.unscopables) {
-        return;
-      }
-      return PublicInstanceProxyHandlers.get(target, key, target);
-    },
-    has(_, key) {
-      const has = key[0] !== "_" && !isGloballyAllowed(key);
-      if (!has && PublicInstanceProxyHandlers.has(_, key)) {
-        warn(
-          `Property ${JSON.stringify(
-            key
-          )} should not start with _ which is a reserved prefix for Vue internals.`
-        );
-      }
-      return has;
-    }
-  }
-);
-function createDevRenderContext(instance) {
-  const target = {};
-  Object.defineProperty(target, `_`, {
-    configurable: true,
-    enumerable: false,
-    get: () => instance
-  });
-  Object.keys(publicPropertiesMap).forEach((key) => {
-    Object.defineProperty(target, key, {
-      configurable: true,
-      enumerable: false,
-      get: () => publicPropertiesMap[key](instance),
-      // intercepted by the proxy so no need for implementation,
-      // but needed to prevent set errors
-      set: NOOP
-    });
-  });
-  return target;
-}
-function exposePropsOnRenderContext(instance) {
-  const {
-    ctx,
-    propsOptions: [propsOptions]
-  } = instance;
-  if (propsOptions) {
-    Object.keys(propsOptions).forEach((key) => {
-      Object.defineProperty(ctx, key, {
-        enumerable: true,
-        configurable: true,
-        get: () => instance.props[key],
-        set: NOOP
-      });
-    });
-  }
-}
-function exposeSetupStateOnRenderContext(instance) {
-  const { ctx, setupState } = instance;
-  Object.keys(toRaw(setupState)).forEach((key) => {
-    if (!setupState.__isScriptSetup) {
-      if (isReservedPrefix(key[0])) {
-        warn(
-          `setup() return property ${JSON.stringify(
-            key
-          )} should not start with "$" or "_" which are reserved prefixes for Vue internals.`
-        );
-        return;
-      }
-      Object.defineProperty(ctx, key, {
-        enumerable: true,
-        configurable: true,
-        get: () => setupState[key],
-        set: NOOP
-      });
-    }
-  });
-}
-
-const warnRuntimeUsage = (method) => warn(
-  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`
-);
-function defineProps() {
-  {
-    warnRuntimeUsage(`defineProps`);
-  }
-  return null;
-}
-function defineEmits() {
-  {
-    warnRuntimeUsage(`defineEmits`);
-  }
-  return null;
-}
-function defineExpose(exposed) {
-  {
-    warnRuntimeUsage(`defineExpose`);
-  }
-}
-function defineOptions(options) {
-  {
-    warnRuntimeUsage(`defineOptions`);
-  }
-}
-function defineSlots() {
-  {
-    warnRuntimeUsage(`defineSlots`);
-  }
-  return null;
-}
-function defineModel() {
-  {
-    warnRuntimeUsage("defineModel");
-  }
-}
-function withDefaults(props, defaults) {
-  {
-    warnRuntimeUsage(`withDefaults`);
-  }
-  return null;
-}
-function useSlots() {
-  return getContext().slots;
-}
-function useAttrs() {
-  return getContext().attrs;
-}
-function useModel(props, name, options) {
-  const i = getCurrentInstance();
-  if (!i) {
-    warn(`useModel() called without active instance.`);
-    return ref();
-  }
-  if (!i.propsOptions[0][name]) {
-    warn(`useModel() called with prop "${name}" which is not declared.`);
-    return ref();
-  }
-  if (options && options.local) {
-    const proxy = ref(props[name]);
-    watch(
-      () => props[name],
-      (v) => proxy.value = v
-    );
-    watch(proxy, (value) => {
-      if (value !== props[name]) {
-        i.emit(`update:${name}`, value);
-      }
-    });
-    return proxy;
-  } else {
-    return {
-      __v_isRef: true,
-      get value() {
-        return props[name];
-      },
-      set value(value) {
-        i.emit(`update:${name}`, value);
-      }
-    };
-  }
-}
-function getContext() {
-  const i = getCurrentInstance();
-  if (!i) {
-    warn(`useContext() called without active instance.`);
-  }
-  return i.setupContext || (i.setupContext = createSetupContext(i));
-}
-function normalizePropsOrEmits(props) {
-  return isArray(props) ? props.reduce(
-    (normalized, p) => (normalized[p] = null, normalized),
-    {}
-  ) : props;
-}
-function mergeDefaults(raw, defaults) {
-  const props = normalizePropsOrEmits(raw);
-  for (const key in defaults) {
-    if (key.startsWith("__skip"))
-      continue;
-    let opt = props[key];
-    if (opt) {
-      if (isArray(opt) || isFunction(opt)) {
-        opt = props[key] = { type: opt, default: defaults[key] };
-      } else {
-        opt.default = defaults[key];
-      }
-    } else if (opt === null) {
-      opt = props[key] = { default: defaults[key] };
-    } else {
-      warn(`props default key "${key}" has no corresponding declaration.`);
-    }
-    if (opt && defaults[`__skip_${key}`]) {
-      opt.skipFactory = true;
-    }
-  }
-  return props;
-}
-function mergeModels(a, b) {
-  if (!a || !b)
-    return a || b;
-  if (isArray(a) && isArray(b))
-    return a.concat(b);
-  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));
-}
-function createPropsRestProxy(props, excludedKeys) {
-  const ret = {};
-  for (const key in props) {
-    if (!excludedKeys.includes(key)) {
-      Object.defineProperty(ret, key, {
-        enumerable: true,
-        get: () => props[key]
-      });
-    }
-  }
-  return ret;
-}
-function withAsyncContext(getAwaitable) {
-  const ctx = getCurrentInstance();
-  if (!ctx) {
-    warn(
-      `withAsyncContext called without active current instance. This is likely a bug.`
-    );
-  }
-  let awaitable = getAwaitable();
-  unsetCurrentInstance();
-  if (isPromise(awaitable)) {
-    awaitable = awaitable.catch((e) => {
-      setCurrentInstance(ctx);
-      throw e;
-    });
-  }
-  return [awaitable, () => setCurrentInstance(ctx)];
-}
-
-function createDuplicateChecker() {
-  const cache = /* @__PURE__ */ Object.create(null);
-  return (type, key) => {
-    if (cache[key]) {
-      warn(`${type} property "${key}" is already defined in ${cache[key]}.`);
-    } else {
-      cache[key] = type;
-    }
-  };
-}
-let shouldCacheAccess = true;
-function applyOptions(instance) {
-  const options = resolveMergedOptions(instance);
-  const publicThis = instance.proxy;
-  const ctx = instance.ctx;
-  shouldCacheAccess = false;
-  if (options.beforeCreate) {
-    callHook$1(options.beforeCreate, instance, "bc");
-  }
-  const {
-    // state
-    data: dataOptions,
-    computed: computedOptions,
-    methods,
-    watch: watchOptions,
-    provide: provideOptions,
-    inject: injectOptions,
-    // lifecycle
-    created,
-    beforeMount,
-    mounted,
-    beforeUpdate,
-    updated,
-    activated,
-    deactivated,
-    beforeDestroy,
-    beforeUnmount,
-    destroyed,
-    unmounted,
-    render,
-    renderTracked,
-    renderTriggered,
-    errorCaptured,
-    serverPrefetch,
-    // public API
-    expose,
-    inheritAttrs,
-    // assets
-    components,
-    directives,
-    filters
-  } = options;
-  const checkDuplicateProperties = createDuplicateChecker() ;
-  {
-    const [propsOptions] = instance.propsOptions;
-    if (propsOptions) {
-      for (const key in propsOptions) {
-        checkDuplicateProperties("Props" /* PROPS */, key);
-      }
-    }
-  }
-  if (injectOptions) {
-    resolveInjections(injectOptions, ctx, checkDuplicateProperties);
-  }
-  if (methods) {
-    for (const key in methods) {
-      const methodHandler = methods[key];
-      if (isFunction(methodHandler)) {
-        {
-          Object.defineProperty(ctx, key, {
-            value: methodHandler.bind(publicThis),
-            configurable: true,
-            enumerable: true,
-            writable: true
-          });
-        }
-        {
-          checkDuplicateProperties("Methods" /* METHODS */, key);
-        }
-      } else {
-        warn(
-          `Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?`
-        );
-      }
-    }
-  }
-  if (dataOptions) {
-    if (!isFunction(dataOptions)) {
-      warn(
-        `The data option must be a function. Plain object usage is no longer supported.`
-      );
-    }
-    const data = dataOptions.call(publicThis, publicThis);
-    if (isPromise(data)) {
-      warn(
-        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`
-      );
-    }
-    if (!isObject(data)) {
-      warn(`data() should return an object.`);
-    } else {
-      instance.data = reactive(data);
-      {
-        for (const key in data) {
-          checkDuplicateProperties("Data" /* DATA */, key);
-          if (!isReservedPrefix(key[0])) {
-            Object.defineProperty(ctx, key, {
-              configurable: true,
-              enumerable: true,
-              get: () => data[key],
-              set: NOOP
-            });
-          }
-        }
-      }
-    }
-  }
-  shouldCacheAccess = true;
-  if (computedOptions) {
-    for (const key in computedOptions) {
-      const opt = computedOptions[key];
-      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;
-      if (get === NOOP) {
-        warn(`Computed property "${key}" has no getter.`);
-      }
-      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : () => {
-        warn(
-          `Write operation failed: computed property "${key}" is readonly.`
-        );
-      } ;
-      const c = computed({
-        get,
-        set
-      });
-      Object.defineProperty(ctx, key, {
-        enumerable: true,
-        configurable: true,
-        get: () => c.value,
-        set: (v) => c.value = v
-      });
-      {
-        checkDuplicateProperties("Computed" /* COMPUTED */, key);
-      }
-    }
-  }
-  if (watchOptions) {
-    for (const key in watchOptions) {
-      createWatcher(watchOptions[key], ctx, publicThis, key);
-    }
-  }
-  if (provideOptions) {
-    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
-    Reflect.ownKeys(provides).forEach((key) => {
-      provide(key, provides[key]);
-    });
-  }
-  if (created) {
-    callHook$1(created, instance, "c");
-  }
-  function registerLifecycleHook(register, hook) {
-    if (isArray(hook)) {
-      hook.forEach((_hook) => register(_hook.bind(publicThis)));
-    } else if (hook) {
-      register(hook.bind(publicThis));
-    }
-  }
-  registerLifecycleHook(onBeforeMount, beforeMount);
-  registerLifecycleHook(onMounted, mounted);
-  registerLifecycleHook(onBeforeUpdate, beforeUpdate);
-  registerLifecycleHook(onUpdated, updated);
-  registerLifecycleHook(onActivated, activated);
-  registerLifecycleHook(onDeactivated, deactivated);
-  registerLifecycleHook(onErrorCaptured, errorCaptured);
-  registerLifecycleHook(onRenderTracked, renderTracked);
-  registerLifecycleHook(onRenderTriggered, renderTriggered);
-  registerLifecycleHook(onBeforeUnmount, beforeUnmount);
-  registerLifecycleHook(onUnmounted, unmounted);
-  registerLifecycleHook(onServerPrefetch, serverPrefetch);
-  if (isArray(expose)) {
-    if (expose.length) {
-      const exposed = instance.exposed || (instance.exposed = {});
-      expose.forEach((key) => {
-        Object.defineProperty(exposed, key, {
-          get: () => publicThis[key],
-          set: (val) => publicThis[key] = val
-        });
-      });
-    } else if (!instance.exposed) {
-      instance.exposed = {};
-    }
-  }
-  if (render && instance.render === NOOP) {
-    instance.render = render;
-  }
-  if (inheritAttrs != null) {
-    instance.inheritAttrs = inheritAttrs;
-  }
-  if (components)
-    instance.components = components;
-  if (directives)
-    instance.directives = directives;
-}
-function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {
-  if (isArray(injectOptions)) {
-    injectOptions = normalizeInject(injectOptions);
-  }
-  for (const key in injectOptions) {
-    const opt = injectOptions[key];
-    let injected;
-    if (isObject(opt)) {
-      if ("default" in opt) {
-        injected = inject(
-          opt.from || key,
-          opt.default,
-          true
-          /* treat default function as factory */
-        );
-      } else {
-        injected = inject(opt.from || key);
-      }
-    } else {
-      injected = inject(opt);
-    }
-    if (isRef(injected)) {
-      Object.defineProperty(ctx, key, {
-        enumerable: true,
-        configurable: true,
-        get: () => injected.value,
-        set: (v) => injected.value = v
-      });
-    } else {
-      ctx[key] = injected;
-    }
-    {
-      checkDuplicateProperties("Inject" /* INJECT */, key);
-    }
-  }
-}
-function callHook$1(hook, instance, type) {
-  callWithAsyncErrorHandling(
-    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),
-    instance,
-    type
-  );
-}
-function createWatcher(raw, ctx, publicThis, key) {
-  const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
-  if (isString(raw)) {
-    const handler = ctx[raw];
-    if (isFunction(handler)) {
-      watch(getter, handler);
-    } else {
-      warn(`Invalid watch handler specified by key "${raw}"`, handler);
-    }
-  } else if (isFunction(raw)) {
-    watch(getter, raw.bind(publicThis));
-  } else if (isObject(raw)) {
-    if (isArray(raw)) {
-      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
-    } else {
-      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
-      if (isFunction(handler)) {
-        watch(getter, handler, raw);
-      } else {
-        warn(`Invalid watch handler specified by key "${raw.handler}"`, handler);
-      }
-    }
-  } else {
-    warn(`Invalid watch option: "${key}"`, raw);
-  }
-}
-function resolveMergedOptions(instance) {
-  const base = instance.type;
-  const { mixins, extends: extendsOptions } = base;
-  const {
-    mixins: globalMixins,
-    optionsCache: cache,
-    config: { optionMergeStrategies }
-  } = instance.appContext;
-  const cached = cache.get(base);
-  let resolved;
-  if (cached) {
-    resolved = cached;
-  } else if (!globalMixins.length && !mixins && !extendsOptions) {
-    {
-      resolved = base;
-    }
-  } else {
-    resolved = {};
-    if (globalMixins.length) {
-      globalMixins.forEach(
-        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)
-      );
-    }
-    mergeOptions(resolved, base, optionMergeStrategies);
-  }
-  if (isObject(base)) {
-    cache.set(base, resolved);
-  }
-  return resolved;
-}
-function mergeOptions(to, from, strats, asMixin = false) {
-  const { mixins, extends: extendsOptions } = from;
-  if (extendsOptions) {
-    mergeOptions(to, extendsOptions, strats, true);
-  }
-  if (mixins) {
-    mixins.forEach(
-      (m) => mergeOptions(to, m, strats, true)
-    );
-  }
-  for (const key in from) {
-    if (asMixin && key === "expose") {
-      warn(
-        `"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`
-      );
-    } else {
-      const strat = internalOptionMergeStrats[key] || strats && strats[key];
-      to[key] = strat ? strat(to[key], from[key]) : from[key];
-    }
-  }
-  return to;
-}
-const internalOptionMergeStrats = {
-  data: mergeDataFn,
-  props: mergeEmitsOrPropsOptions,
-  emits: mergeEmitsOrPropsOptions,
-  // objects
-  methods: mergeObjectOptions,
-  computed: mergeObjectOptions,
-  // lifecycle
-  beforeCreate: mergeAsArray$1,
-  created: mergeAsArray$1,
-  beforeMount: mergeAsArray$1,
-  mounted: mergeAsArray$1,
-  beforeUpdate: mergeAsArray$1,
-  updated: mergeAsArray$1,
-  beforeDestroy: mergeAsArray$1,
-  beforeUnmount: mergeAsArray$1,
-  destroyed: mergeAsArray$1,
-  unmounted: mergeAsArray$1,
-  activated: mergeAsArray$1,
-  deactivated: mergeAsArray$1,
-  errorCaptured: mergeAsArray$1,
-  serverPrefetch: mergeAsArray$1,
-  // assets
-  components: mergeObjectOptions,
-  directives: mergeObjectOptions,
-  // watch
-  watch: mergeWatchOptions,
-  // provide / inject
-  provide: mergeDataFn,
-  inject: mergeInject
-};
-function mergeDataFn(to, from) {
-  if (!from) {
-    return to;
-  }
-  if (!to) {
-    return from;
-  }
-  return function mergedDataFn() {
-    return (extend)(
-      isFunction(to) ? to.call(this, this) : to,
-      isFunction(from) ? from.call(this, this) : from
-    );
-  };
-}
-function mergeInject(to, from) {
-  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
-}
-function normalizeInject(raw) {
-  if (isArray(raw)) {
-    const res = {};
-    for (let i = 0; i < raw.length; i++) {
-      res[raw[i]] = raw[i];
-    }
-    return res;
-  }
-  return raw;
-}
-function mergeAsArray$1(to, from) {
-  return to ? [...new Set([].concat(to, from))] : from;
-}
-function mergeObjectOptions(to, from) {
-  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;
-}
-function mergeEmitsOrPropsOptions(to, from) {
-  if (to) {
-    if (isArray(to) && isArray(from)) {
-      return [.../* @__PURE__ */ new Set([...to, ...from])];
-    }
-    return extend(
-      /* @__PURE__ */ Object.create(null),
-      normalizePropsOrEmits(to),
-      normalizePropsOrEmits(from != null ? from : {})
-    );
-  } else {
-    return from;
-  }
-}
-function mergeWatchOptions(to, from) {
-  if (!to)
-    return from;
-  if (!from)
-    return to;
-  const merged = extend(/* @__PURE__ */ Object.create(null), to);
-  for (const key in from) {
-    merged[key] = mergeAsArray$1(to[key], from[key]);
-  }
-  return merged;
-}
-
-function createAppContext() {
-  return {
-    app: null,
-    config: {
-      isNativeTag: NO,
-      performance: false,
-      globalProperties: {},
-      optionMergeStrategies: {},
-      errorHandler: void 0,
-      warnHandler: void 0,
-      compilerOptions: {}
-    },
-    mixins: [],
-    components: {},
-    directives: {},
-    provides: /* @__PURE__ */ Object.create(null),
-    optionsCache: /* @__PURE__ */ new WeakMap(),
-    propsCache: /* @__PURE__ */ new WeakMap(),
-    emitsCache: /* @__PURE__ */ new WeakMap()
-  };
-}
-let uid$1 = 0;
-function createAppAPI(render, hydrate) {
-  return function createApp(rootComponent, rootProps = null) {
-    if (!isFunction(rootComponent)) {
-      rootComponent = extend({}, rootComponent);
-    }
-    if (rootProps != null && !isObject(rootProps)) {
-      warn(`root props passed to app.mount() must be an object.`);
-      rootProps = null;
-    }
-    const context = createAppContext();
-    {
-      Object.defineProperty(context.config, "unwrapInjectedRef", {
-        get() {
-          return true;
-        },
-        set() {
-          warn(
-            `app.config.unwrapInjectedRef has been deprecated. 3.3 now always unwraps injected refs in Options API.`
-          );
-        }
-      });
-    }
-    const installedPlugins = /* @__PURE__ */ new WeakSet();
-    let isMounted = false;
-    const app = context.app = {
-      _uid: uid$1++,
-      _component: rootComponent,
-      _props: rootProps,
-      _container: null,
-      _context: context,
-      _instance: null,
-      version,
-      get config() {
-        return context.config;
-      },
-      set config(v) {
-        {
-          warn(
-            `app.config cannot be replaced. Modify individual options instead.`
-          );
-        }
-      },
-      use(plugin, ...options) {
-        if (installedPlugins.has(plugin)) {
-          warn(`Plugin has already been applied to target app.`);
-        } else if (plugin && isFunction(plugin.install)) {
-          installedPlugins.add(plugin);
-          plugin.install(app, ...options);
-        } else if (isFunction(plugin)) {
-          installedPlugins.add(plugin);
-          plugin(app, ...options);
-        } else {
-          warn(
-            `A plugin must either be a function or an object with an "install" function.`
-          );
-        }
-        return app;
-      },
-      mixin(mixin) {
-        {
-          if (!context.mixins.includes(mixin)) {
-            context.mixins.push(mixin);
-          } else {
-            warn(
-              "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "")
-            );
-          }
-        }
-        return app;
-      },
-      component(name, component) {
-        {
-          validateComponentName(name, context.config);
-        }
-        if (!component) {
-          return context.components[name];
-        }
-        if (context.components[name]) {
-          warn(`Component "${name}" has already been registered in target app.`);
-        }
-        context.components[name] = component;
-        return app;
-      },
-      directive(name, directive) {
-        {
-          validateDirectiveName(name);
-        }
-        if (!directive) {
-          return context.directives[name];
-        }
-        if (context.directives[name]) {
-          warn(`Directive "${name}" has already been registered in target app.`);
-        }
-        context.directives[name] = directive;
-        return app;
-      },
-      mount(rootContainer, isHydrate, isSVG) {
-        if (!isMounted) {
-          if (rootContainer.__vue_app__) {
-            warn(
-              `There is already an app instance mounted on the host container.
- If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.`
-            );
-          }
-          const vnode = createVNode(rootComponent, rootProps);
-          vnode.appContext = context;
-          {
-            context.reload = () => {
-              render(cloneVNode(vnode), rootContainer, isSVG);
-            };
-          }
-          if (isHydrate && hydrate) {
-            hydrate(vnode, rootContainer);
-          } else {
-            render(vnode, rootContainer, isSVG);
-          }
-          isMounted = true;
-          app._container = rootContainer;
-          rootContainer.__vue_app__ = app;
-          {
-            app._instance = vnode.component;
-            devtoolsInitApp(app, version);
-          }
-          return getExposeProxy(vnode.component) || vnode.component.proxy;
-        } else {
-          warn(
-            `App has already been mounted.
-If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\``
-          );
-        }
-      },
-      unmount() {
-        if (isMounted) {
-          render(null, app._container);
-          {
-            app._instance = null;
-            devtoolsUnmountApp(app);
-          }
-          delete app._container.__vue_app__;
-        } else {
-          warn(`Cannot unmount an app that is not mounted.`);
-        }
-      },
-      provide(key, value) {
-        if (key in context.provides) {
-          warn(
-            `App already provides property with key "${String(key)}". It will be overwritten with the new value.`
-          );
-        }
-        context.provides[key] = value;
-        return app;
-      },
-      runWithContext(fn) {
-        currentApp = app;
-        try {
-          return fn();
-        } finally {
-          currentApp = null;
-        }
-      }
-    };
-    return app;
-  };
-}
-let currentApp = null;
-
-function provide(key, value) {
-  if (!currentInstance) {
-    {
-      warn(`provide() can only be used inside setup().`);
-    }
-  } else {
-    let provides = currentInstance.provides;
-    const parentProvides = currentInstance.parent && currentInstance.parent.provides;
-    if (parentProvides === provides) {
-      provides = currentInstance.provides = Object.create(parentProvides);
-    }
-    provides[key] = value;
-  }
-}
-function inject(key, defaultValue, treatDefaultAsFactory = false) {
-  const instance = currentInstance || currentRenderingInstance;
-  if (instance || currentApp) {
-    const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;
-    if (provides && key in provides) {
-      return provides[key];
-    } else if (arguments.length > 1) {
-      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
-    } else {
-      warn(`injection "${String(key)}" not found.`);
-    }
-  } else {
-    warn(`inject() can only be used inside setup() or functional components.`);
-  }
-}
-function hasInjectionContext() {
-  return !!(currentInstance || currentRenderingInstance || currentApp);
-}
-
-function initProps(instance, rawProps, isStateful, isSSR = false) {
-  const props = {};
-  const attrs = {};
-  def(attrs, InternalObjectKey, 1);
-  instance.propsDefaults = /* @__PURE__ */ Object.create(null);
-  setFullProps(instance, rawProps, props, attrs);
-  for (const key in instance.propsOptions[0]) {
-    if (!(key in props)) {
-      props[key] = void 0;
-    }
-  }
-  {
-    validateProps(rawProps || {}, props, instance);
-  }
-  if (isStateful) {
-    instance.props = isSSR ? props : shallowReactive(props);
-  } else {
-    if (!instance.type.props) {
-      instance.props = attrs;
-    } else {
-      instance.props = props;
-    }
-  }
-  instance.attrs = attrs;
-}
-function isInHmrContext(instance) {
-  while (instance) {
-    if (instance.type.__hmrId)
-      return true;
-    instance = instance.parent;
-  }
-}
-function updateProps(instance, rawProps, rawPrevProps, optimized) {
-  const {
-    props,
-    attrs,
-    vnode: { patchFlag }
-  } = instance;
-  const rawCurrentProps = toRaw(props);
-  const [options] = instance.propsOptions;
-  let hasAttrsChanged = false;
-  if (
-    // always force full diff in dev
-    // - #1942 if hmr is enabled with sfc component
-    // - vite#872 non-sfc component used by sfc component
-    !isInHmrContext(instance) && (optimized || patchFlag > 0) && !(patchFlag & 16)
-  ) {
-    if (patchFlag & 8) {
-      const propsToUpdate = instance.vnode.dynamicProps;
-      for (let i = 0; i < propsToUpdate.length; i++) {
-        let key = propsToUpdate[i];
-        if (isEmitListener(instance.emitsOptions, key)) {
-          continue;
-        }
-        const value = rawProps[key];
-        if (options) {
-          if (hasOwn(attrs, key)) {
-            if (value !== attrs[key]) {
-              attrs[key] = value;
-              hasAttrsChanged = true;
-            }
-          } else {
-            const camelizedKey = camelize(key);
-            props[camelizedKey] = resolvePropValue(
-              options,
-              rawCurrentProps,
-              camelizedKey,
-              value,
-              instance,
-              false
-              /* isAbsent */
-            );
-          }
-        } else {
-          if (value !== attrs[key]) {
-            attrs[key] = value;
-            hasAttrsChanged = true;
-          }
-        }
-      }
-    }
-  } else {
-    if (setFullProps(instance, rawProps, props, attrs)) {
-      hasAttrsChanged = true;
-    }
-    let kebabKey;
-    for (const key in rawCurrentProps) {
-      if (!rawProps || // for camelCase
-      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case
-      // and converted to camelCase (#955)
-      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {
-        if (options) {
-          if (rawPrevProps && // for camelCase
-          (rawPrevProps[key] !== void 0 || // for kebab-case
-          rawPrevProps[kebabKey] !== void 0)) {
-            props[key] = resolvePropValue(
-              options,
-              rawCurrentProps,
-              key,
-              void 0,
-              instance,
-              true
-              /* isAbsent */
-            );
-          }
-        } else {
-          delete props[key];
-        }
-      }
-    }
-    if (attrs !== rawCurrentProps) {
-      for (const key in attrs) {
-        if (!rawProps || !hasOwn(rawProps, key) && true) {
-          delete attrs[key];
-          hasAttrsChanged = true;
-        }
-      }
-    }
-  }
-  if (hasAttrsChanged) {
-    trigger(instance, "set", "$attrs");
-  }
-  {
-    validateProps(rawProps || {}, props, instance);
-  }
-}
-function setFullProps(instance, rawProps, props, attrs) {
-  const [options, needCastKeys] = instance.propsOptions;
-  let hasAttrsChanged = false;
-  let rawCastValues;
-  if (rawProps) {
-    for (let key in rawProps) {
-      if (isReservedProp(key)) {
-        continue;
-      }
-      const value = rawProps[key];
-      let camelKey;
-      if (options && hasOwn(options, camelKey = camelize(key))) {
-        if (!needCastKeys || !needCastKeys.includes(camelKey)) {
-          props[camelKey] = value;
-        } else {
-          (rawCastValues || (rawCastValues = {}))[camelKey] = value;
-        }
-      } else if (!isEmitListener(instance.emitsOptions, key)) {
-        if (!(key in attrs) || value !== attrs[key]) {
-          attrs[key] = value;
-          hasAttrsChanged = true;
-        }
-      }
-    }
-  }
-  if (needCastKeys) {
-    const rawCurrentProps = toRaw(props);
-    const castValues = rawCastValues || EMPTY_OBJ;
-    for (let i = 0; i < needCastKeys.length; i++) {
-      const key = needCastKeys[i];
-      props[key] = resolvePropValue(
-        options,
-        rawCurrentProps,
-        key,
-        castValues[key],
-        instance,
-        !hasOwn(castValues, key)
-      );
-    }
-  }
-  return hasAttrsChanged;
-}
-function resolvePropValue(options, props, key, value, instance, isAbsent) {
-  const opt = options[key];
-  if (opt != null) {
-    const hasDefault = hasOwn(opt, "default");
-    if (hasDefault && value === void 0) {
-      const defaultValue = opt.default;
-      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {
-        const { propsDefaults } = instance;
-        if (key in propsDefaults) {
-          value = propsDefaults[key];
-        } else {
-          setCurrentInstance(instance);
-          value = propsDefaults[key] = defaultValue.call(
-            null,
-            props
-          );
-          unsetCurrentInstance();
-        }
-      } else {
-        value = defaultValue;
-      }
-    }
-    if (opt[0 /* shouldCast */]) {
-      if (isAbsent && !hasDefault) {
-        value = false;
-      } else if (opt[1 /* shouldCastTrue */] && (value === "" || value === hyphenate(key))) {
-        value = true;
-      }
-    }
-  }
-  return value;
-}
-function normalizePropsOptions(comp, appContext, asMixin = false) {
-  const cache = appContext.propsCache;
-  const cached = cache.get(comp);
-  if (cached) {
-    return cached;
-  }
-  const raw = comp.props;
-  const normalized = {};
-  const needCastKeys = [];
-  let hasExtends = false;
-  if (!isFunction(comp)) {
-    const extendProps = (raw2) => {
-      hasExtends = true;
-      const [props, keys] = normalizePropsOptions(raw2, appContext, true);
-      extend(normalized, props);
-      if (keys)
-        needCastKeys.push(...keys);
-    };
-    if (!asMixin && appContext.mixins.length) {
-      appContext.mixins.forEach(extendProps);
-    }
-    if (comp.extends) {
-      extendProps(comp.extends);
-    }
-    if (comp.mixins) {
-      comp.mixins.forEach(extendProps);
-    }
-  }
-  if (!raw && !hasExtends) {
-    if (isObject(comp)) {
-      cache.set(comp, EMPTY_ARR);
-    }
-    return EMPTY_ARR;
-  }
-  if (isArray(raw)) {
-    for (let i = 0; i < raw.length; i++) {
-      if (!isString(raw[i])) {
-        warn(`props must be strings when using array syntax.`, raw[i]);
-      }
-      const normalizedKey = camelize(raw[i]);
-      if (validatePropName(normalizedKey)) {
-        normalized[normalizedKey] = EMPTY_OBJ;
-      }
-    }
-  } else if (raw) {
-    if (!isObject(raw)) {
-      warn(`invalid props options`, raw);
-    }
-    for (const key in raw) {
-      const normalizedKey = camelize(key);
-      if (validatePropName(normalizedKey)) {
-        const opt = raw[key];
-        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);
-        if (prop) {
-          const booleanIndex = getTypeIndex(Boolean, prop.type);
-          const stringIndex = getTypeIndex(String, prop.type);
-          prop[0 /* shouldCast */] = booleanIndex > -1;
-          prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex;
-          if (booleanIndex > -1 || hasOwn(prop, "default")) {
-            needCastKeys.push(normalizedKey);
-          }
-        }
-      }
-    }
-  }
-  const res = [normalized, needCastKeys];
-  if (isObject(comp)) {
-    cache.set(comp, res);
-  }
-  return res;
-}
-function validatePropName(key) {
-  if (key[0] !== "$") {
-    return true;
-  } else {
-    warn(`Invalid prop name: "${key}" is a reserved property.`);
-  }
-  return false;
-}
-function getType(ctor) {
-  const match = ctor && ctor.toString().match(/^\s*(function|class) (\w+)/);
-  return match ? match[2] : ctor === null ? "null" : "";
-}
-function isSameType(a, b) {
-  return getType(a) === getType(b);
-}
-function getTypeIndex(type, expectedTypes) {
-  if (isArray(expectedTypes)) {
-    return expectedTypes.findIndex((t) => isSameType(t, type));
-  } else if (isFunction(expectedTypes)) {
-    return isSameType(expectedTypes, type) ? 0 : -1;
-  }
-  return -1;
-}
-function validateProps(rawProps, props, instance) {
-  const resolvedValues = toRaw(props);
-  const options = instance.propsOptions[0];
-  for (const key in options) {
-    let opt = options[key];
-    if (opt == null)
-      continue;
-    validateProp(
-      key,
-      resolvedValues[key],
-      opt,
-      !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key))
-    );
-  }
-}
-function validateProp(name, value, prop, isAbsent) {
-  const { type, required, validator, skipCheck } = prop;
-  if (required && isAbsent) {
-    warn('Missing required prop: "' + name + '"');
-    return;
-  }
-  if (value == null && !required) {
-    return;
-  }
-  if (type != null && type !== true && !skipCheck) {
-    let isValid = false;
-    const types = isArray(type) ? type : [type];
-    const expectedTypes = [];
-    for (let i = 0; i < types.length && !isValid; i++) {
-      const { valid, expectedType } = assertType(value, types[i]);
-      expectedTypes.push(expectedType || "");
-      isValid = valid;
-    }
-    if (!isValid) {
-      warn(getInvalidTypeMessage(name, value, expectedTypes));
-      return;
-    }
-  }
-  if (validator && !validator(value)) {
-    warn('Invalid prop: custom validator check failed for prop "' + name + '".');
-  }
-}
-const isSimpleType = /* @__PURE__ */ makeMap(
-  "String,Number,Boolean,Function,Symbol,BigInt"
-);
-function assertType(value, type) {
-  let valid;
-  const expectedType = getType(type);
-  if (isSimpleType(expectedType)) {
-    const t = typeof value;
-    valid = t === expectedType.toLowerCase();
-    if (!valid && t === "object") {
-      valid = value instanceof type;
-    }
-  } else if (expectedType === "Object") {
-    valid = isObject(value);
-  } else if (expectedType === "Array") {
-    valid = isArray(value);
-  } else if (expectedType === "null") {
-    valid = value === null;
-  } else {
-    valid = value instanceof type;
-  }
-  return {
-    valid,
-    expectedType
-  };
-}
-function getInvalidTypeMessage(name, value, expectedTypes) {
-  let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(capitalize).join(" | ")}`;
-  const expectedType = expectedTypes[0];
-  const receivedType = toRawType(value);
-  const expectedValue = styleValue(value, expectedType);
-  const receivedValue = styleValue(value, receivedType);
-  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {
-    message += ` with value ${expectedValue}`;
-  }
-  message += `, got ${receivedType} `;
-  if (isExplicable(receivedType)) {
-    message += `with value ${receivedValue}.`;
-  }
-  return message;
-}
-function styleValue(value, type) {
-  if (type === "String") {
-    return `"${value}"`;
-  } else if (type === "Number") {
-    return `${Number(value)}`;
-  } else {
-    return `${value}`;
-  }
-}
-function isExplicable(type) {
-  const explicitTypes = ["string", "number", "boolean"];
-  return explicitTypes.some((elem) => type.toLowerCase() === elem);
-}
-function isBoolean(...args) {
-  return args.some((elem) => elem.toLowerCase() === "boolean");
-}
-
-const isInternalKey = (key) => key[0] === "_" || key === "$stable";
-const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
-const normalizeSlot = (key, rawSlot, ctx) => {
-  if (rawSlot._n) {
-    return rawSlot;
-  }
-  const normalized = withCtx((...args) => {
-    if (currentInstance) {
-      warn(
-        `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
-      );
-    }
-    return normalizeSlotValue(rawSlot(...args));
-  }, ctx);
-  normalized._c = false;
-  return normalized;
-};
-const normalizeObjectSlots = (rawSlots, slots, instance) => {
-  const ctx = rawSlots._ctx;
-  for (const key in rawSlots) {
-    if (isInternalKey(key))
-      continue;
-    const value = rawSlots[key];
-    if (isFunction(value)) {
-      slots[key] = normalizeSlot(key, value, ctx);
-    } else if (value != null) {
-      {
-        warn(
-          `Non-function value encountered for slot "${key}". Prefer function slots for better performance.`
-        );
-      }
-      const normalized = normalizeSlotValue(value);
-      slots[key] = () => normalized;
-    }
-  }
-};
-const normalizeVNodeSlots = (instance, children) => {
-  if (!isKeepAlive(instance.vnode) && true) {
-    warn(
-      `Non-function value encountered for default slot. Prefer function slots for better performance.`
-    );
-  }
-  const normalized = normalizeSlotValue(children);
-  instance.slots.default = () => normalized;
-};
-const initSlots = (instance, children) => {
-  if (instance.vnode.shapeFlag & 32) {
-    const type = children._;
-    if (type) {
-      instance.slots = toRaw(children);
-      def(children, "_", type);
-    } else {
-      normalizeObjectSlots(
-        children,
-        instance.slots = {});
-    }
-  } else {
-    instance.slots = {};
-    if (children) {
-      normalizeVNodeSlots(instance, children);
-    }
-  }
-  def(instance.slots, InternalObjectKey, 1);
-};
-const updateSlots = (instance, children, optimized) => {
-  const { vnode, slots } = instance;
-  let needDeletionCheck = true;
-  let deletionComparisonTarget = EMPTY_OBJ;
-  if (vnode.shapeFlag & 32) {
-    const type = children._;
-    if (type) {
-      if (isHmrUpdating) {
-        extend(slots, children);
-        trigger(instance, "set", "$slots");
-      } else if (optimized && type === 1) {
-        needDeletionCheck = false;
-      } else {
-        extend(slots, children);
-        if (!optimized && type === 1) {
-          delete slots._;
-        }
-      }
-    } else {
-      needDeletionCheck = !children.$stable;
-      normalizeObjectSlots(children, slots);
-    }
-    deletionComparisonTarget = children;
-  } else if (children) {
-    normalizeVNodeSlots(instance, children);
-    deletionComparisonTarget = { default: 1 };
-  }
-  if (needDeletionCheck) {
-    for (const key in slots) {
-      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {
-        delete slots[key];
-      }
-    }
-  }
-};
-
-function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
-  if (isArray(rawRef)) {
-    rawRef.forEach(
-      (r, i) => setRef(
-        r,
-        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),
-        parentSuspense,
-        vnode,
-        isUnmount
-      )
-    );
-    return;
-  }
-  if (isAsyncWrapper(vnode) && !isUnmount) {
-    return;
-  }
-  const refValue = vnode.shapeFlag & 4 ? getExposeProxy(vnode.component) || vnode.component.proxy : vnode.el;
-  const value = isUnmount ? null : refValue;
-  const { i: owner, r: ref } = rawRef;
-  if (!owner) {
-    warn(
-      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`
-    );
-    return;
-  }
-  const oldRef = oldRawRef && oldRawRef.r;
-  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;
-  const setupState = owner.setupState;
-  if (oldRef != null && oldRef !== ref) {
-    if (isString(oldRef)) {
-      refs[oldRef] = null;
-      if (hasOwn(setupState, oldRef)) {
-        setupState[oldRef] = null;
-      }
-    } else if (isRef(oldRef)) {
-      oldRef.value = null;
-    }
-  }
-  if (isFunction(ref)) {
-    callWithErrorHandling(ref, owner, 12, [value, refs]);
-  } else {
-    const _isString = isString(ref);
-    const _isRef = isRef(ref);
-    if (_isString || _isRef) {
-      const doSet = () => {
-        if (rawRef.f) {
-          const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;
-          if (isUnmount) {
-            isArray(existing) && remove(existing, refValue);
-          } else {
-            if (!isArray(existing)) {
-              if (_isString) {
-                refs[ref] = [refValue];
-                if (hasOwn(setupState, ref)) {
-                  setupState[ref] = refs[ref];
-                }
-              } else {
-                ref.value = [refValue];
-                if (rawRef.k)
-                  refs[rawRef.k] = ref.value;
-              }
-            } else if (!existing.includes(refValue)) {
-              existing.push(refValue);
-            }
-          }
-        } else if (_isString) {
-          refs[ref] = value;
-          if (hasOwn(setupState, ref)) {
-            setupState[ref] = value;
-          }
-        } else if (_isRef) {
-          ref.value = value;
-          if (rawRef.k)
-            refs[rawRef.k] = value;
-        } else {
-          warn("Invalid template ref type:", ref, `(${typeof ref})`);
-        }
-      };
-      if (value) {
-        doSet.id = -1;
-        queuePostRenderEffect(doSet, parentSuspense);
-      } else {
-        doSet();
-      }
-    } else {
-      warn("Invalid template ref type:", ref, `(${typeof ref})`);
-    }
-  }
-}
-
-let hasMismatch = false;
-const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";
-const isComment = (node) => node.nodeType === 8 /* COMMENT */;
-function createHydrationFunctions(rendererInternals) {
-  const {
-    mt: mountComponent,
-    p: patch,
-    o: {
-      patchProp,
-      createText,
-      nextSibling,
-      parentNode,
-      remove,
-      insert,
-      createComment
-    }
-  } = rendererInternals;
-  const hydrate = (vnode, container) => {
-    if (!container.hasChildNodes()) {
-      warn(
-        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`
-      );
-      patch(null, vnode, container);
-      flushPostFlushCbs();
-      container._vnode = vnode;
-      return;
-    }
-    hasMismatch = false;
-    hydrateNode(container.firstChild, vnode, null, null, null);
-    flushPostFlushCbs();
-    container._vnode = vnode;
-    if (hasMismatch && true) {
-      console.error(`Hydration completed but contains mismatches.`);
-    }
-  };
-  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {
-    const isFragmentStart = isComment(node) && node.data === "[";
-    const onMismatch = () => handleMismatch(
-      node,
-      vnode,
-      parentComponent,
-      parentSuspense,
-      slotScopeIds,
-      isFragmentStart
-    );
-    const { type, ref, shapeFlag, patchFlag } = vnode;
-    let domType = node.nodeType;
-    vnode.el = node;
-    if (patchFlag === -2) {
-      optimized = false;
-      vnode.dynamicChildren = null;
-    }
-    let nextNode = null;
-    switch (type) {
-      case Text:
-        if (domType !== 3 /* TEXT */) {
-          if (vnode.children === "") {
-            insert(vnode.el = createText(""), parentNode(node), node);
-            nextNode = node;
-          } else {
-            nextNode = onMismatch();
-          }
-        } else {
-          if (node.data !== vnode.children) {
-            hasMismatch = true;
-            warn(
-              `Hydration text mismatch:
-- Server rendered: ${JSON.stringify(
-                node.data
-              )}
-- Client rendered: ${JSON.stringify(vnode.children)}`
-            );
-            node.data = vnode.children;
-          }
-          nextNode = nextSibling(node);
-        }
-        break;
-      case Comment:
-        if (domType !== 8 /* COMMENT */ || isFragmentStart) {
-          nextNode = onMismatch();
-        } else {
-          nextNode = nextSibling(node);
-        }
-        break;
-      case Static:
-        if (isFragmentStart) {
-          node = nextSibling(node);
-          domType = node.nodeType;
-        }
-        if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {
-          nextNode = node;
-          const needToAdoptContent = !vnode.children.length;
-          for (let i = 0; i < vnode.staticCount; i++) {
-            if (needToAdoptContent)
-              vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;
-            if (i === vnode.staticCount - 1) {
-              vnode.anchor = nextNode;
-            }
-            nextNode = nextSibling(nextNode);
-          }
-          return isFragmentStart ? nextSibling(nextNode) : nextNode;
-        } else {
-          onMismatch();
-        }
-        break;
-      case Fragment:
-        if (!isFragmentStart) {
-          nextNode = onMismatch();
-        } else {
-          nextNode = hydrateFragment(
-            node,
-            vnode,
-            parentComponent,
-            parentSuspense,
-            slotScopeIds,
-            optimized
-          );
-        }
-        break;
-      default:
-        if (shapeFlag & 1) {
-          if (domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) {
-            nextNode = onMismatch();
-          } else {
-            nextNode = hydrateElement(
-              node,
-              vnode,
-              parentComponent,
-              parentSuspense,
-              slotScopeIds,
-              optimized
-            );
-          }
-        } else if (shapeFlag & 6) {
-          vnode.slotScopeIds = slotScopeIds;
-          const container = parentNode(node);
-          mountComponent(
-            vnode,
-            container,
-            null,
-            parentComponent,
-            parentSuspense,
-            isSVGContainer(container),
-            optimized
-          );
-          nextNode = isFragmentStart ? locateClosingAsyncAnchor(node) : nextSibling(node);
-          if (nextNode && isComment(nextNode) && nextNode.data === "teleport end") {
-            nextNode = nextSibling(nextNode);
-          }
-          if (isAsyncWrapper(vnode)) {
-            let subTree;
-            if (isFragmentStart) {
-              subTree = createVNode(Fragment);
-              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;
-            } else {
-              subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div");
-            }
-            subTree.el = node;
-            vnode.component.subTree = subTree;
-          }
-        } else if (shapeFlag & 64) {
-          if (domType !== 8 /* COMMENT */) {
-            nextNode = onMismatch();
-          } else {
-            nextNode = vnode.type.hydrate(
-              node,
-              vnode,
-              parentComponent,
-              parentSuspense,
-              slotScopeIds,
-              optimized,
-              rendererInternals,
-              hydrateChildren
-            );
-          }
-        } else if (shapeFlag & 128) {
-          nextNode = vnode.type.hydrate(
-            node,
-            vnode,
-            parentComponent,
-            parentSuspense,
-            isSVGContainer(parentNode(node)),
-            slotScopeIds,
-            optimized,
-            rendererInternals,
-            hydrateNode
-          );
-        } else {
-          warn("Invalid HostVNode type:", type, `(${typeof type})`);
-        }
-    }
-    if (ref != null) {
-      setRef(ref, null, parentSuspense, vnode);
-    }
-    return nextNode;
-  };
-  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
-    optimized = optimized || !!vnode.dynamicChildren;
-    const { type, props, patchFlag, shapeFlag, dirs } = vnode;
-    const forcePatchValue = type === "input" && dirs || type === "option";
-    {
-      if (dirs) {
-        invokeDirectiveHook(vnode, null, parentComponent, "created");
-      }
-      if (props) {
-        if (forcePatchValue || !optimized || patchFlag & (16 | 32)) {
-          for (const key in props) {
-            if (forcePatchValue && key.endsWith("value") || isOn(key) && !isReservedProp(key)) {
-              patchProp(
-                el,
-                key,
-                null,
-                props[key],
-                false,
-                void 0,
-                parentComponent
-              );
-            }
-          }
-        } else if (props.onClick) {
-          patchProp(
-            el,
-            "onClick",
-            null,
-            props.onClick,
-            false,
-            void 0,
-            parentComponent
-          );
-        }
-      }
-      let vnodeHooks;
-      if (vnodeHooks = props && props.onVnodeBeforeMount) {
-        invokeVNodeHook(vnodeHooks, parentComponent, vnode);
-      }
-      if (dirs) {
-        invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
-      }
-      if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
-        queueEffectWithSuspense(() => {
-          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
-          dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
-        }, parentSuspense);
-      }
-      if (shapeFlag & 16 && // skip if element has innerHTML / textContent
-      !(props && (props.innerHTML || props.textContent))) {
-        let next = hydrateChildren(
-          el.firstChild,
-          vnode,
-          el,
-          parentComponent,
-          parentSuspense,
-          slotScopeIds,
-          optimized
-        );
-        let hasWarned = false;
-        while (next) {
-          hasMismatch = true;
-          if (!hasWarned) {
-            warn(
-              `Hydration children mismatch in <${vnode.type}>: server rendered element contains more child nodes than client vdom.`
-            );
-            hasWarned = true;
-          }
-          const cur = next;
-          next = next.nextSibling;
-          remove(cur);
-        }
-      } else if (shapeFlag & 8) {
-        if (el.textContent !== vnode.children) {
-          hasMismatch = true;
-          warn(
-            `Hydration text content mismatch in <${vnode.type}>:
-- Server rendered: ${el.textContent}
-- Client rendered: ${vnode.children}`
-          );
-          el.textContent = vnode.children;
-        }
-      }
-    }
-    return el.nextSibling;
-  };
-  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {
-    optimized = optimized || !!parentVNode.dynamicChildren;
-    const children = parentVNode.children;
-    const l = children.length;
-    let hasWarned = false;
-    for (let i = 0; i < l; i++) {
-      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);
-      if (node) {
-        node = hydrateNode(
-          node,
-          vnode,
-          parentComponent,
-          parentSuspense,
-          slotScopeIds,
-          optimized
-        );
-      } else if (vnode.type === Text && !vnode.children) {
-        continue;
-      } else {
-        hasMismatch = true;
-        if (!hasWarned) {
-          warn(
-            `Hydration children mismatch in <${container.tagName.toLowerCase()}>: server rendered element contains fewer child nodes than client vdom.`
-          );
-          hasWarned = true;
-        }
-        patch(
-          null,
-          vnode,
-          container,
-          null,
-          parentComponent,
-          parentSuspense,
-          isSVGContainer(container),
-          slotScopeIds
-        );
-      }
-    }
-    return node;
-  };
-  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
-    const { slotScopeIds: fragmentSlotScopeIds } = vnode;
-    if (fragmentSlotScopeIds) {
-      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
-    }
-    const container = parentNode(node);
-    const next = hydrateChildren(
-      nextSibling(node),
-      vnode,
-      container,
-      parentComponent,
-      parentSuspense,
-      slotScopeIds,
-      optimized
-    );
-    if (next && isComment(next) && next.data === "]") {
-      return nextSibling(vnode.anchor = next);
-    } else {
-      hasMismatch = true;
-      insert(vnode.anchor = createComment(`]`), container, next);
-      return next;
-    }
-  };
-  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {
-    hasMismatch = true;
-    warn(
-      `Hydration node mismatch:
-- Client vnode:`,
-      vnode.type,
-      `
-- Server rendered DOM:`,
-      node,
-      node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``
-    );
-    vnode.el = null;
-    if (isFragment) {
-      const end = locateClosingAsyncAnchor(node);
-      while (true) {
-        const next2 = nextSibling(node);
-        if (next2 && next2 !== end) {
-          remove(next2);
-        } else {
-          break;
-        }
-      }
-    }
-    const next = nextSibling(node);
-    const container = parentNode(node);
-    remove(node);
-    patch(
-      null,
-      vnode,
-      container,
-      next,
-      parentComponent,
-      parentSuspense,
-      isSVGContainer(container),
-      slotScopeIds
-    );
-    return next;
-  };
-  const locateClosingAsyncAnchor = (node) => {
-    let match = 0;
-    while (node) {
-      node = nextSibling(node);
-      if (node && isComment(node)) {
-        if (node.data === "[")
-          match++;
-        if (node.data === "]") {
-          if (match === 0) {
-            return nextSibling(node);
-          } else {
-            match--;
-          }
-        }
-      }
-    }
-    return node;
-  };
-  return [hydrate, hydrateNode];
-}
-
-let supported;
-let perf;
-function startMeasure(instance, type) {
-  if (instance.appContext.config.performance && isSupported()) {
-    perf.mark(`vue-${type}-${instance.uid}`);
-  }
-  {
-    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
-  }
-}
-function endMeasure(instance, type) {
-  if (instance.appContext.config.performance && isSupported()) {
-    const startTag = `vue-${type}-${instance.uid}`;
-    const endTag = startTag + `:end`;
-    perf.mark(endTag);
-    perf.measure(
-      `<${formatComponentName(instance, instance.type)}> ${type}`,
-      startTag,
-      endTag
-    );
-    perf.clearMarks(startTag);
-    perf.clearMarks(endTag);
-  }
-  {
-    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
-  }
-}
-function isSupported() {
-  if (supported !== void 0) {
-    return supported;
-  }
-  if (typeof window !== "undefined" && window.performance) {
-    supported = true;
-    perf = window.performance;
-  } else {
-    supported = false;
-  }
-  return supported;
-}
-
-const queuePostRenderEffect = queueEffectWithSuspense ;
-function createRenderer(options) {
-  return baseCreateRenderer(options);
-}
-function createHydrationRenderer(options) {
-  return baseCreateRenderer(options, createHydrationFunctions);
-}
-function baseCreateRenderer(options, createHydrationFns) {
-  const target = getGlobalThis();
-  target.__VUE__ = true;
-  {
-    setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
-  }
-  const {
-    insert: hostInsert,
-    remove: hostRemove,
-    patchProp: hostPatchProp,
-    createElement: hostCreateElement,
-    createText: hostCreateText,
-    createComment: hostCreateComment,
-    setText: hostSetText,
-    setElementText: hostSetElementText,
-    parentNode: hostParentNode,
-    nextSibling: hostNextSibling,
-    setScopeId: hostSetScopeId = NOOP,
-    insertStaticContent: hostInsertStaticContent
-  } = options;
-  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, slotScopeIds = null, optimized = isHmrUpdating ? false : !!n2.dynamicChildren) => {
-    if (n1 === n2) {
-      return;
-    }
-    if (n1 && !isSameVNodeType(n1, n2)) {
-      anchor = getNextHostNode(n1);
-      unmount(n1, parentComponent, parentSuspense, true);
-      n1 = null;
-    }
-    if (n2.patchFlag === -2) {
-      optimized = false;
-      n2.dynamicChildren = null;
-    }
-    const { type, ref, shapeFlag } = n2;
-    switch (type) {
-      case Text:
-        processText(n1, n2, container, anchor);
-        break;
-      case Comment:
-        processCommentNode(n1, n2, container, anchor);
-        break;
-      case Static:
-        if (n1 == null) {
-          mountStaticNode(n2, container, anchor, isSVG);
-        } else {
-          patchStaticNode(n1, n2, container, isSVG);
-        }
-        break;
-      case Fragment:
-        processFragment(
-          n1,
-          n2,
-          container,
-          anchor,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        break;
-      default:
-        if (shapeFlag & 1) {
-          processElement(
-            n1,
-            n2,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-        } else if (shapeFlag & 6) {
-          processComponent(
-            n1,
-            n2,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-        } else if (shapeFlag & 64) {
-          type.process(
-            n1,
-            n2,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized,
-            internals
-          );
-        } else if (shapeFlag & 128) {
-          type.process(
-            n1,
-            n2,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized,
-            internals
-          );
-        } else {
-          warn("Invalid VNode type:", type, `(${typeof type})`);
-        }
-    }
-    if (ref != null && parentComponent) {
-      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
-    }
-  };
-  const processText = (n1, n2, container, anchor) => {
-    if (n1 == null) {
-      hostInsert(
-        n2.el = hostCreateText(n2.children),
-        container,
-        anchor
-      );
-    } else {
-      const el = n2.el = n1.el;
-      if (n2.children !== n1.children) {
-        hostSetText(el, n2.children);
-      }
-    }
-  };
-  const processCommentNode = (n1, n2, container, anchor) => {
-    if (n1 == null) {
-      hostInsert(
-        n2.el = hostCreateComment(n2.children || ""),
-        container,
-        anchor
-      );
-    } else {
-      n2.el = n1.el;
-    }
-  };
-  const mountStaticNode = (n2, container, anchor, isSVG) => {
-    [n2.el, n2.anchor] = hostInsertStaticContent(
-      n2.children,
-      container,
-      anchor,
-      isSVG,
-      n2.el,
-      n2.anchor
-    );
-  };
-  const patchStaticNode = (n1, n2, container, isSVG) => {
-    if (n2.children !== n1.children) {
-      const anchor = hostNextSibling(n1.anchor);
-      removeStaticNode(n1);
-      [n2.el, n2.anchor] = hostInsertStaticContent(
-        n2.children,
-        container,
-        anchor,
-        isSVG
-      );
-    } else {
-      n2.el = n1.el;
-      n2.anchor = n1.anchor;
-    }
-  };
-  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
-    let next;
-    while (el && el !== anchor) {
-      next = hostNextSibling(el);
-      hostInsert(el, container, nextSibling);
-      el = next;
-    }
-    hostInsert(anchor, container, nextSibling);
-  };
-  const removeStaticNode = ({ el, anchor }) => {
-    let next;
-    while (el && el !== anchor) {
-      next = hostNextSibling(el);
-      hostRemove(el);
-      el = next;
-    }
-    hostRemove(anchor);
-  };
-  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    isSVG = isSVG || n2.type === "svg";
-    if (n1 == null) {
-      mountElement(
-        n2,
-        container,
-        anchor,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-    } else {
-      patchElement(
-        n1,
-        n2,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-    }
-  };
-  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    let el;
-    let vnodeHook;
-    const { type, props, shapeFlag, transition, dirs } = vnode;
-    el = vnode.el = hostCreateElement(
-      vnode.type,
-      isSVG,
-      props && props.is,
-      props
-    );
-    if (shapeFlag & 8) {
-      hostSetElementText(el, vnode.children);
-    } else if (shapeFlag & 16) {
-      mountChildren(
-        vnode.children,
-        el,
-        null,
-        parentComponent,
-        parentSuspense,
-        isSVG && type !== "foreignObject",
-        slotScopeIds,
-        optimized
-      );
-    }
-    if (dirs) {
-      invokeDirectiveHook(vnode, null, parentComponent, "created");
-    }
-    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
-    if (props) {
-      for (const key in props) {
-        if (key !== "value" && !isReservedProp(key)) {
-          hostPatchProp(
-            el,
-            key,
-            null,
-            props[key],
-            isSVG,
-            vnode.children,
-            parentComponent,
-            parentSuspense,
-            unmountChildren
-          );
-        }
-      }
-      if ("value" in props) {
-        hostPatchProp(el, "value", null, props.value);
-      }
-      if (vnodeHook = props.onVnodeBeforeMount) {
-        invokeVNodeHook(vnodeHook, parentComponent, vnode);
-      }
-    }
-    {
-      Object.defineProperty(el, "__vnode", {
-        value: vnode,
-        enumerable: false
-      });
-      Object.defineProperty(el, "__vueParentComponent", {
-        value: parentComponent,
-        enumerable: false
-      });
-    }
-    if (dirs) {
-      invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
-    }
-    const needCallTransitionHooks = (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
-    if (needCallTransitionHooks) {
-      transition.beforeEnter(el);
-    }
-    hostInsert(el, container, anchor);
-    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {
-      queuePostRenderEffect(() => {
-        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
-        needCallTransitionHooks && transition.enter(el);
-        dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
-      }, parentSuspense);
-    }
-  };
-  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
-    if (scopeId) {
-      hostSetScopeId(el, scopeId);
-    }
-    if (slotScopeIds) {
-      for (let i = 0; i < slotScopeIds.length; i++) {
-        hostSetScopeId(el, slotScopeIds[i]);
-      }
-    }
-    if (parentComponent) {
-      let subTree = parentComponent.subTree;
-      if (subTree.patchFlag > 0 && subTree.patchFlag & 2048) {
-        subTree = filterSingleRoot(subTree.children) || subTree;
-      }
-      if (vnode === subTree) {
-        const parentVNode = parentComponent.vnode;
-        setScopeId(
-          el,
-          parentVNode,
-          parentVNode.scopeId,
-          parentVNode.slotScopeIds,
-          parentComponent.parent
-        );
-      }
-    }
-  };
-  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, start = 0) => {
-    for (let i = start; i < children.length; i++) {
-      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);
-      patch(
-        null,
-        child,
-        container,
-        anchor,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-    }
-  };
-  const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    const el = n2.el = n1.el;
-    let { patchFlag, dynamicChildren, dirs } = n2;
-    patchFlag |= n1.patchFlag & 16;
-    const oldProps = n1.props || EMPTY_OBJ;
-    const newProps = n2.props || EMPTY_OBJ;
-    let vnodeHook;
-    parentComponent && toggleRecurse(parentComponent, false);
-    if (vnodeHook = newProps.onVnodeBeforeUpdate) {
-      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
-    }
-    if (dirs) {
-      invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
-    }
-    parentComponent && toggleRecurse(parentComponent, true);
-    if (isHmrUpdating) {
-      patchFlag = 0;
-      optimized = false;
-      dynamicChildren = null;
-    }
-    const areChildrenSVG = isSVG && n2.type !== "foreignObject";
-    if (dynamicChildren) {
-      patchBlockChildren(
-        n1.dynamicChildren,
-        dynamicChildren,
-        el,
-        parentComponent,
-        parentSuspense,
-        areChildrenSVG,
-        slotScopeIds
-      );
-      {
-        traverseStaticChildren(n1, n2);
-      }
-    } else if (!optimized) {
-      patchChildren(
-        n1,
-        n2,
-        el,
-        null,
-        parentComponent,
-        parentSuspense,
-        areChildrenSVG,
-        slotScopeIds,
-        false
-      );
-    }
-    if (patchFlag > 0) {
-      if (patchFlag & 16) {
-        patchProps(
-          el,
-          n2,
-          oldProps,
-          newProps,
-          parentComponent,
-          parentSuspense,
-          isSVG
-        );
-      } else {
-        if (patchFlag & 2) {
-          if (oldProps.class !== newProps.class) {
-            hostPatchProp(el, "class", null, newProps.class, isSVG);
-          }
-        }
-        if (patchFlag & 4) {
-          hostPatchProp(el, "style", oldProps.style, newProps.style, isSVG);
-        }
-        if (patchFlag & 8) {
-          const propsToUpdate = n2.dynamicProps;
-          for (let i = 0; i < propsToUpdate.length; i++) {
-            const key = propsToUpdate[i];
-            const prev = oldProps[key];
-            const next = newProps[key];
-            if (next !== prev || key === "value") {
-              hostPatchProp(
-                el,
-                key,
-                prev,
-                next,
-                isSVG,
-                n1.children,
-                parentComponent,
-                parentSuspense,
-                unmountChildren
-              );
-            }
-          }
-        }
-      }
-      if (patchFlag & 1) {
-        if (n1.children !== n2.children) {
-          hostSetElementText(el, n2.children);
-        }
-      }
-    } else if (!optimized && dynamicChildren == null) {
-      patchProps(
-        el,
-        n2,
-        oldProps,
-        newProps,
-        parentComponent,
-        parentSuspense,
-        isSVG
-      );
-    }
-    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
-      queuePostRenderEffect(() => {
-        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
-        dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
-      }, parentSuspense);
-    }
-  };
-  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG, slotScopeIds) => {
-    for (let i = 0; i < newChildren.length; i++) {
-      const oldVNode = oldChildren[i];
-      const newVNode = newChildren[i];
-      const container = (
-        // oldVNode may be an errored async setup() component inside Suspense
-        // which will not have a mounted element
-        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent
-        // of the Fragment itself so it can move its children.
-        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement
-        // which also requires the correct parent container
-        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.
-        oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (
-          // In other cases, the parent container is not actually used so we
-          // just pass the block element here to avoid a DOM parentNode call.
-          fallbackContainer
-        )
-      );
-      patch(
-        oldVNode,
-        newVNode,
-        container,
-        null,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        true
-      );
-    }
-  };
-  const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {
-    if (oldProps !== newProps) {
-      if (oldProps !== EMPTY_OBJ) {
-        for (const key in oldProps) {
-          if (!isReservedProp(key) && !(key in newProps)) {
-            hostPatchProp(
-              el,
-              key,
-              oldProps[key],
-              null,
-              isSVG,
-              vnode.children,
-              parentComponent,
-              parentSuspense,
-              unmountChildren
-            );
-          }
-        }
-      }
-      for (const key in newProps) {
-        if (isReservedProp(key))
-          continue;
-        const next = newProps[key];
-        const prev = oldProps[key];
-        if (next !== prev && key !== "value") {
-          hostPatchProp(
-            el,
-            key,
-            prev,
-            next,
-            isSVG,
-            vnode.children,
-            parentComponent,
-            parentSuspense,
-            unmountChildren
-          );
-        }
-      }
-      if ("value" in newProps) {
-        hostPatchProp(el, "value", oldProps.value, newProps.value);
-      }
-    }
-  };
-  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
-    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
-    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
-    if (
-      // #5523 dev root fragment may inherit directives
-      isHmrUpdating || patchFlag & 2048
-    ) {
-      patchFlag = 0;
-      optimized = false;
-      dynamicChildren = null;
-    }
-    if (fragmentSlotScopeIds) {
-      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
-    }
-    if (n1 == null) {
-      hostInsert(fragmentStartAnchor, container, anchor);
-      hostInsert(fragmentEndAnchor, container, anchor);
-      mountChildren(
-        n2.children,
-        container,
-        fragmentEndAnchor,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-    } else {
-      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result
-      // of renderSlot() with no valid children
-      n1.dynamicChildren) {
-        patchBlockChildren(
-          n1.dynamicChildren,
-          dynamicChildren,
-          container,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds
-        );
-        {
-          traverseStaticChildren(n1, n2);
-        }
-      } else {
-        patchChildren(
-          n1,
-          n2,
-          container,
-          fragmentEndAnchor,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-      }
-    }
-  };
-  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    n2.slotScopeIds = slotScopeIds;
-    if (n1 == null) {
-      if (n2.shapeFlag & 512) {
-        parentComponent.ctx.activate(
-          n2,
-          container,
-          anchor,
-          isSVG,
-          optimized
-        );
-      } else {
-        mountComponent(
-          n2,
-          container,
-          anchor,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          optimized
-        );
-      }
-    } else {
-      updateComponent(n1, n2, optimized);
-    }
-  };
-  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-    const instance = (initialVNode.component = createComponentInstance(
-      initialVNode,
-      parentComponent,
-      parentSuspense
-    ));
-    if (instance.type.__hmrId) {
-      registerHMR(instance);
-    }
-    {
-      pushWarningContext(initialVNode);
-      startMeasure(instance, `mount`);
-    }
-    if (isKeepAlive(initialVNode)) {
-      instance.ctx.renderer = internals;
-    }
-    {
-      {
-        startMeasure(instance, `init`);
-      }
-      setupComponent(instance);
-      {
-        endMeasure(instance, `init`);
-      }
-    }
-    if (instance.asyncDep) {
-      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);
-      if (!initialVNode.el) {
-        const placeholder = instance.subTree = createVNode(Comment);
-        processCommentNode(null, placeholder, container, anchor);
-      }
-      return;
-    }
-    setupRenderEffect(
-      instance,
-      initialVNode,
-      container,
-      anchor,
-      parentSuspense,
-      isSVG,
-      optimized
-    );
-    {
-      popWarningContext();
-      endMeasure(instance, `mount`);
-    }
-  };
-  const updateComponent = (n1, n2, optimized) => {
-    const instance = n2.component = n1.component;
-    if (shouldUpdateComponent(n1, n2, optimized)) {
-      if (instance.asyncDep && !instance.asyncResolved) {
-        {
-          pushWarningContext(n2);
-        }
-        updateComponentPreRender(instance, n2, optimized);
-        {
-          popWarningContext();
-        }
-        return;
-      } else {
-        instance.next = n2;
-        invalidateJob(instance.update);
-        instance.update();
-      }
-    } else {
-      n2.el = n1.el;
-      instance.vnode = n2;
-    }
-  };
-  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {
-    const componentUpdateFn = () => {
-      if (!instance.isMounted) {
-        let vnodeHook;
-        const { el, props } = initialVNode;
-        const { bm, m, parent } = instance;
-        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
-        toggleRecurse(instance, false);
-        if (bm) {
-          invokeArrayFns(bm);
-        }
-        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {
-          invokeVNodeHook(vnodeHook, parent, initialVNode);
-        }
-        toggleRecurse(instance, true);
-        if (el && hydrateNode) {
-          const hydrateSubTree = () => {
-            {
-              startMeasure(instance, `render`);
-            }
-            instance.subTree = renderComponentRoot(instance);
-            {
-              endMeasure(instance, `render`);
-            }
-            {
-              startMeasure(instance, `hydrate`);
-            }
-            hydrateNode(
-              el,
-              instance.subTree,
-              instance,
-              parentSuspense,
-              null
-            );
-            {
-              endMeasure(instance, `hydrate`);
-            }
-          };
-          if (isAsyncWrapperVNode) {
-            initialVNode.type.__asyncLoader().then(
-              // note: we are moving the render call into an async callback,
-              // which means it won't track dependencies - but it's ok because
-              // a server-rendered async wrapper is already in resolved state
-              // and it will never need to change.
-              () => !instance.isUnmounted && hydrateSubTree()
-            );
-          } else {
-            hydrateSubTree();
-          }
-        } else {
-          {
-            startMeasure(instance, `render`);
-          }
-          const subTree = instance.subTree = renderComponentRoot(instance);
-          {
-            endMeasure(instance, `render`);
-          }
-          {
-            startMeasure(instance, `patch`);
-          }
-          patch(
-            null,
-            subTree,
-            container,
-            anchor,
-            instance,
-            parentSuspense,
-            isSVG
-          );
-          {
-            endMeasure(instance, `patch`);
-          }
-          initialVNode.el = subTree.el;
-        }
-        if (m) {
-          queuePostRenderEffect(m, parentSuspense);
-        }
-        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
-          const scopedInitialVNode = initialVNode;
-          queuePostRenderEffect(
-            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),
-            parentSuspense
-          );
-        }
-        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {
-          instance.a && queuePostRenderEffect(instance.a, parentSuspense);
-        }
-        instance.isMounted = true;
-        {
-          devtoolsComponentAdded(instance);
-        }
-        initialVNode = container = anchor = null;
-      } else {
-        let { next, bu, u, parent, vnode } = instance;
-        let originNext = next;
-        let vnodeHook;
-        {
-          pushWarningContext(next || instance.vnode);
-        }
-        toggleRecurse(instance, false);
-        if (next) {
-          next.el = vnode.el;
-          updateComponentPreRender(instance, next, optimized);
-        } else {
-          next = vnode;
-        }
-        if (bu) {
-          invokeArrayFns(bu);
-        }
-        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {
-          invokeVNodeHook(vnodeHook, parent, next, vnode);
-        }
-        toggleRecurse(instance, true);
-        {
-          startMeasure(instance, `render`);
-        }
-        const nextTree = renderComponentRoot(instance);
-        {
-          endMeasure(instance, `render`);
-        }
-        const prevTree = instance.subTree;
-        instance.subTree = nextTree;
-        {
-          startMeasure(instance, `patch`);
-        }
-        patch(
-          prevTree,
-          nextTree,
-          // parent may have changed if it's in a teleport
-          hostParentNode(prevTree.el),
-          // anchor may have changed if it's in a fragment
-          getNextHostNode(prevTree),
-          instance,
-          parentSuspense,
-          isSVG
-        );
-        {
-          endMeasure(instance, `patch`);
-        }
-        next.el = nextTree.el;
-        if (originNext === null) {
-          updateHOCHostEl(instance, nextTree.el);
-        }
-        if (u) {
-          queuePostRenderEffect(u, parentSuspense);
-        }
-        if (vnodeHook = next.props && next.props.onVnodeUpdated) {
-          queuePostRenderEffect(
-            () => invokeVNodeHook(vnodeHook, parent, next, vnode),
-            parentSuspense
-          );
-        }
-        {
-          devtoolsComponentUpdated(instance);
-        }
-        {
-          popWarningContext();
-        }
-      }
-    };
-    const effect = instance.effect = new ReactiveEffect(
-      componentUpdateFn,
-      () => queueJob(update),
-      instance.scope
-      // track it in component's effect scope
-    );
-    const update = instance.update = () => effect.run();
-    update.id = instance.uid;
-    toggleRecurse(instance, true);
-    {
-      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;
-      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;
-      update.ownerInstance = instance;
-    }
-    update();
-  };
-  const updateComponentPreRender = (instance, nextVNode, optimized) => {
-    nextVNode.component = instance;
-    const prevProps = instance.vnode.props;
-    instance.vnode = nextVNode;
-    instance.next = null;
-    updateProps(instance, nextVNode.props, prevProps, optimized);
-    updateSlots(instance, nextVNode.children, optimized);
-    pauseTracking();
-    flushPreFlushCbs();
-    resetTracking();
-  };
-  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized = false) => {
-    const c1 = n1 && n1.children;
-    const prevShapeFlag = n1 ? n1.shapeFlag : 0;
-    const c2 = n2.children;
-    const { patchFlag, shapeFlag } = n2;
-    if (patchFlag > 0) {
-      if (patchFlag & 128) {
-        patchKeyedChildren(
-          c1,
-          c2,
-          container,
-          anchor,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        return;
-      } else if (patchFlag & 256) {
-        patchUnkeyedChildren(
-          c1,
-          c2,
-          container,
-          anchor,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-        return;
-      }
-    }
-    if (shapeFlag & 8) {
-      if (prevShapeFlag & 16) {
-        unmountChildren(c1, parentComponent, parentSuspense);
-      }
-      if (c2 !== c1) {
-        hostSetElementText(container, c2);
-      }
-    } else {
-      if (prevShapeFlag & 16) {
-        if (shapeFlag & 16) {
-          patchKeyedChildren(
-            c1,
-            c2,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-        } else {
-          unmountChildren(c1, parentComponent, parentSuspense, true);
-        }
-      } else {
-        if (prevShapeFlag & 8) {
-          hostSetElementText(container, "");
-        }
-        if (shapeFlag & 16) {
-          mountChildren(
-            c2,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-        }
-      }
-    }
-  };
-  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    c1 = c1 || EMPTY_ARR;
-    c2 = c2 || EMPTY_ARR;
-    const oldLength = c1.length;
-    const newLength = c2.length;
-    const commonLength = Math.min(oldLength, newLength);
-    let i;
-    for (i = 0; i < commonLength; i++) {
-      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
-      patch(
-        c1[i],
-        nextChild,
-        container,
-        null,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized
-      );
-    }
-    if (oldLength > newLength) {
-      unmountChildren(
-        c1,
-        parentComponent,
-        parentSuspense,
-        true,
-        false,
-        commonLength
-      );
-    } else {
-      mountChildren(
-        c2,
-        container,
-        anchor,
-        parentComponent,
-        parentSuspense,
-        isSVG,
-        slotScopeIds,
-        optimized,
-        commonLength
-      );
-    }
-  };
-  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
-    let i = 0;
-    const l2 = c2.length;
-    let e1 = c1.length - 1;
-    let e2 = l2 - 1;
-    while (i <= e1 && i <= e2) {
-      const n1 = c1[i];
-      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
-      if (isSameVNodeType(n1, n2)) {
-        patch(
-          n1,
-          n2,
-          container,
-          null,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-      } else {
-        break;
-      }
-      i++;
-    }
-    while (i <= e1 && i <= e2) {
-      const n1 = c1[e1];
-      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
-      if (isSameVNodeType(n1, n2)) {
-        patch(
-          n1,
-          n2,
-          container,
-          null,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          optimized
-        );
-      } else {
-        break;
-      }
-      e1--;
-      e2--;
-    }
-    if (i > e1) {
-      if (i <= e2) {
-        const nextPos = e2 + 1;
-        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
-        while (i <= e2) {
-          patch(
-            null,
-            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-          i++;
-        }
-      }
-    } else if (i > e2) {
-      while (i <= e1) {
-        unmount(c1[i], parentComponent, parentSuspense, true);
-        i++;
-      }
-    } else {
-      const s1 = i;
-      const s2 = i;
-      const keyToNewIndexMap = /* @__PURE__ */ new Map();
-      for (i = s2; i <= e2; i++) {
-        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
-        if (nextChild.key != null) {
-          if (keyToNewIndexMap.has(nextChild.key)) {
-            warn(
-              `Duplicate keys found during update:`,
-              JSON.stringify(nextChild.key),
-              `Make sure keys are unique.`
-            );
-          }
-          keyToNewIndexMap.set(nextChild.key, i);
-        }
-      }
-      let j;
-      let patched = 0;
-      const toBePatched = e2 - s2 + 1;
-      let moved = false;
-      let maxNewIndexSoFar = 0;
-      const newIndexToOldIndexMap = new Array(toBePatched);
-      for (i = 0; i < toBePatched; i++)
-        newIndexToOldIndexMap[i] = 0;
-      for (i = s1; i <= e1; i++) {
-        const prevChild = c1[i];
-        if (patched >= toBePatched) {
-          unmount(prevChild, parentComponent, parentSuspense, true);
-          continue;
-        }
-        let newIndex;
-        if (prevChild.key != null) {
-          newIndex = keyToNewIndexMap.get(prevChild.key);
-        } else {
-          for (j = s2; j <= e2; j++) {
-            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
-              newIndex = j;
-              break;
-            }
-          }
-        }
-        if (newIndex === void 0) {
-          unmount(prevChild, parentComponent, parentSuspense, true);
-        } else {
-          newIndexToOldIndexMap[newIndex - s2] = i + 1;
-          if (newIndex >= maxNewIndexSoFar) {
-            maxNewIndexSoFar = newIndex;
-          } else {
-            moved = true;
-          }
-          patch(
-            prevChild,
-            c2[newIndex],
-            container,
-            null,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-          patched++;
-        }
-      }
-      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
-      j = increasingNewIndexSequence.length - 1;
-      for (i = toBePatched - 1; i >= 0; i--) {
-        const nextIndex = s2 + i;
-        const nextChild = c2[nextIndex];
-        const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;
-        if (newIndexToOldIndexMap[i] === 0) {
-          patch(
-            null,
-            nextChild,
-            container,
-            anchor,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-        } else if (moved) {
-          if (j < 0 || i !== increasingNewIndexSequence[j]) {
-            move(nextChild, container, anchor, 2);
-          } else {
-            j--;
-          }
-        }
-      }
-    }
-  };
-  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
-    const { el, type, transition, children, shapeFlag } = vnode;
-    if (shapeFlag & 6) {
-      move(vnode.component.subTree, container, anchor, moveType);
-      return;
-    }
-    if (shapeFlag & 128) {
-      vnode.suspense.move(container, anchor, moveType);
-      return;
-    }
-    if (shapeFlag & 64) {
-      type.move(vnode, container, anchor, internals);
-      return;
-    }
-    if (type === Fragment) {
-      hostInsert(el, container, anchor);
-      for (let i = 0; i < children.length; i++) {
-        move(children[i], container, anchor, moveType);
-      }
-      hostInsert(vnode.anchor, container, anchor);
-      return;
-    }
-    if (type === Static) {
-      moveStaticNode(vnode, container, anchor);
-      return;
-    }
-    const needTransition = moveType !== 2 && shapeFlag & 1 && transition;
-    if (needTransition) {
-      if (moveType === 0) {
-        transition.beforeEnter(el);
-        hostInsert(el, container, anchor);
-        queuePostRenderEffect(() => transition.enter(el), parentSuspense);
-      } else {
-        const { leave, delayLeave, afterLeave } = transition;
-        const remove2 = () => hostInsert(el, container, anchor);
-        const performLeave = () => {
-          leave(el, () => {
-            remove2();
-            afterLeave && afterLeave();
-          });
-        };
-        if (delayLeave) {
-          delayLeave(el, remove2, performLeave);
-        } else {
-          performLeave();
-        }
-      }
-    } else {
-      hostInsert(el, container, anchor);
-    }
-  };
-  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
-    const {
-      type,
-      props,
-      ref,
-      children,
-      dynamicChildren,
-      shapeFlag,
-      patchFlag,
-      dirs
-    } = vnode;
-    if (ref != null) {
-      setRef(ref, null, parentSuspense, vnode, true);
-    }
-    if (shapeFlag & 256) {
-      parentComponent.ctx.deactivate(vnode);
-      return;
-    }
-    const shouldInvokeDirs = shapeFlag & 1 && dirs;
-    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
-    let vnodeHook;
-    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {
-      invokeVNodeHook(vnodeHook, parentComponent, vnode);
-    }
-    if (shapeFlag & 6) {
-      unmountComponent(vnode.component, parentSuspense, doRemove);
-    } else {
-      if (shapeFlag & 128) {
-        vnode.suspense.unmount(parentSuspense, doRemove);
-        return;
-      }
-      if (shouldInvokeDirs) {
-        invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
-      }
-      if (shapeFlag & 64) {
-        vnode.type.remove(
-          vnode,
-          parentComponent,
-          parentSuspense,
-          optimized,
-          internals,
-          doRemove
-        );
-      } else if (dynamicChildren && // #1153: fast path should not be taken for non-stable (v-for) fragments
-      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {
-        unmountChildren(
-          dynamicChildren,
-          parentComponent,
-          parentSuspense,
-          false,
-          true
-        );
-      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {
-        unmountChildren(children, parentComponent, parentSuspense);
-      }
-      if (doRemove) {
-        remove(vnode);
-      }
-    }
-    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
-      queuePostRenderEffect(() => {
-        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
-        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
-      }, parentSuspense);
-    }
-  };
-  const remove = (vnode) => {
-    const { type, el, anchor, transition } = vnode;
-    if (type === Fragment) {
-      if (vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {
-        vnode.children.forEach((child) => {
-          if (child.type === Comment) {
-            hostRemove(child.el);
-          } else {
-            remove(child);
-          }
-        });
-      } else {
-        removeFragment(el, anchor);
-      }
-      return;
-    }
-    if (type === Static) {
-      removeStaticNode(vnode);
-      return;
-    }
-    const performRemove = () => {
-      hostRemove(el);
-      if (transition && !transition.persisted && transition.afterLeave) {
-        transition.afterLeave();
-      }
-    };
-    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
-      const { leave, delayLeave } = transition;
-      const performLeave = () => leave(el, performRemove);
-      if (delayLeave) {
-        delayLeave(vnode.el, performRemove, performLeave);
-      } else {
-        performLeave();
-      }
-    } else {
-      performRemove();
-    }
-  };
-  const removeFragment = (cur, end) => {
-    let next;
-    while (cur !== end) {
-      next = hostNextSibling(cur);
-      hostRemove(cur);
-      cur = next;
-    }
-    hostRemove(end);
-  };
-  const unmountComponent = (instance, parentSuspense, doRemove) => {
-    if (instance.type.__hmrId) {
-      unregisterHMR(instance);
-    }
-    const { bum, scope, update, subTree, um } = instance;
-    if (bum) {
-      invokeArrayFns(bum);
-    }
-    scope.stop();
-    if (update) {
-      update.active = false;
-      unmount(subTree, instance, parentSuspense, doRemove);
-    }
-    if (um) {
-      queuePostRenderEffect(um, parentSuspense);
-    }
-    queuePostRenderEffect(() => {
-      instance.isUnmounted = true;
-    }, parentSuspense);
-    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {
-      parentSuspense.deps--;
-      if (parentSuspense.deps === 0) {
-        parentSuspense.resolve();
-      }
-    }
-    {
-      devtoolsComponentRemoved(instance);
-    }
-  };
-  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
-    for (let i = start; i < children.length; i++) {
-      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
-    }
-  };
-  const getNextHostNode = (vnode) => {
-    if (vnode.shapeFlag & 6) {
-      return getNextHostNode(vnode.component.subTree);
-    }
-    if (vnode.shapeFlag & 128) {
-      return vnode.suspense.next();
-    }
-    return hostNextSibling(vnode.anchor || vnode.el);
-  };
-  const render = (vnode, container, isSVG) => {
-    if (vnode == null) {
-      if (container._vnode) {
-        unmount(container._vnode, null, null, true);
-      }
-    } else {
-      patch(container._vnode || null, vnode, container, null, null, null, isSVG);
-    }
-    flushPreFlushCbs();
-    flushPostFlushCbs();
-    container._vnode = vnode;
-  };
-  const internals = {
-    p: patch,
-    um: unmount,
-    m: move,
-    r: remove,
-    mt: mountComponent,
-    mc: mountChildren,
-    pc: patchChildren,
-    pbc: patchBlockChildren,
-    n: getNextHostNode,
-    o: options
-  };
-  let hydrate;
-  let hydrateNode;
-  if (createHydrationFns) {
-    [hydrate, hydrateNode] = createHydrationFns(
-      internals
-    );
-  }
-  return {
-    render,
-    hydrate,
-    createApp: createAppAPI(render, hydrate)
-  };
-}
-function toggleRecurse({ effect, update }, allowed) {
-  effect.allowRecurse = update.allowRecurse = allowed;
-}
-function traverseStaticChildren(n1, n2, shallow = false) {
-  const ch1 = n1.children;
-  const ch2 = n2.children;
-  if (isArray(ch1) && isArray(ch2)) {
-    for (let i = 0; i < ch1.length; i++) {
-      const c1 = ch1[i];
-      let c2 = ch2[i];
-      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
-        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
-          c2 = ch2[i] = cloneIfMounted(ch2[i]);
-          c2.el = c1.el;
-        }
-        if (!shallow)
-          traverseStaticChildren(c1, c2);
-      }
-      if (c2.type === Text) {
-        c2.el = c1.el;
-      }
-      if (c2.type === Comment && !c2.el) {
-        c2.el = c1.el;
-      }
-    }
-  }
-}
-function getSequence(arr) {
-  const p = arr.slice();
-  const result = [0];
-  let i, j, u, v, c;
-  const len = arr.length;
-  for (i = 0; i < len; i++) {
-    const arrI = arr[i];
-    if (arrI !== 0) {
-      j = result[result.length - 1];
-      if (arr[j] < arrI) {
-        p[i] = j;
-        result.push(i);
-        continue;
-      }
-      u = 0;
-      v = result.length - 1;
-      while (u < v) {
-        c = u + v >> 1;
-        if (arr[result[c]] < arrI) {
-          u = c + 1;
-        } else {
-          v = c;
-        }
-      }
-      if (arrI < arr[result[u]]) {
-        if (u > 0) {
-          p[i] = result[u - 1];
-        }
-        result[u] = i;
-      }
-    }
-  }
-  u = result.length;
-  v = result[u - 1];
-  while (u-- > 0) {
-    result[u] = v;
-    v = p[v];
-  }
-  return result;
-}
-
-const isTeleport = (type) => type.__isTeleport;
-const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === "");
-const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement;
-const resolveTarget = (props, select) => {
-  const targetSelector = props && props.to;
-  if (isString(targetSelector)) {
-    if (!select) {
-      warn(
-        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`
-      );
-      return null;
-    } else {
-      const target = select(targetSelector);
-      if (!target) {
-        warn(
-          `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`
-        );
-      }
-      return target;
-    }
-  } else {
-    if (!targetSelector && !isTeleportDisabled(props)) {
-      warn(`Invalid Teleport target: ${targetSelector}`);
-    }
-    return targetSelector;
-  }
-};
-const TeleportImpl = {
-  __isTeleport: true,
-  process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals) {
-    const {
-      mc: mountChildren,
-      pc: patchChildren,
-      pbc: patchBlockChildren,
-      o: { insert, querySelector, createText, createComment }
-    } = internals;
-    const disabled = isTeleportDisabled(n2.props);
-    let { shapeFlag, children, dynamicChildren } = n2;
-    if (isHmrUpdating) {
-      optimized = false;
-      dynamicChildren = null;
-    }
-    if (n1 == null) {
-      const placeholder = n2.el = createComment("teleport start") ;
-      const mainAnchor = n2.anchor = createComment("teleport end") ;
-      insert(placeholder, container, anchor);
-      insert(mainAnchor, container, anchor);
-      const target = n2.target = resolveTarget(n2.props, querySelector);
-      const targetAnchor = n2.targetAnchor = createText("");
-      if (target) {
-        insert(targetAnchor, target);
-        isSVG = isSVG || isTargetSVG(target);
-      } else if (!disabled) {
-        warn("Invalid Teleport target on mount:", target, `(${typeof target})`);
-      }
-      const mount = (container2, anchor2) => {
-        if (shapeFlag & 16) {
-          mountChildren(
-            children,
-            container2,
-            anchor2,
-            parentComponent,
-            parentSuspense,
-            isSVG,
-            slotScopeIds,
-            optimized
-          );
-        }
-      };
-      if (disabled) {
-        mount(container, mainAnchor);
-      } else if (target) {
-        mount(target, targetAnchor);
-      }
-    } else {
-      n2.el = n1.el;
-      const mainAnchor = n2.anchor = n1.anchor;
-      const target = n2.target = n1.target;
-      const targetAnchor = n2.targetAnchor = n1.targetAnchor;
-      const wasDisabled = isTeleportDisabled(n1.props);
-      const currentContainer = wasDisabled ? container : target;
-      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
-      isSVG = isSVG || isTargetSVG(target);
-      if (dynamicChildren) {
-        patchBlockChildren(
-          n1.dynamicChildren,
-          dynamicChildren,
-          currentContainer,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds
-        );
-        traverseStaticChildren(n1, n2, true);
-      } else if (!optimized) {
-        patchChildren(
-          n1,
-          n2,
-          currentContainer,
-          currentAnchor,
-          parentComponent,
-          parentSuspense,
-          isSVG,
-          slotScopeIds,
-          false
-        );
-      }
-      if (disabled) {
-        if (!wasDisabled) {
-          moveTeleport(
-            n2,
-            container,
-            mainAnchor,
-            internals,
-            1
-          );
-        } else {
-          if (n2.props && n1.props && n2.props.to !== n1.props.to) {
-            n2.props.to = n1.props.to;
-          }
-        }
-      } else {
-        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
-          const nextTarget = n2.target = resolveTarget(
-            n2.props,
-            querySelector
-          );
-          if (nextTarget) {
-            moveTeleport(
-              n2,
-              nextTarget,
-              null,
-              internals,
-              0
-            );
-          } else {
-            warn(
-              "Invalid Teleport target on update:",
-              target,
-              `(${typeof target})`
-            );
-          }
-        } else if (wasDisabled) {
-          moveTeleport(
-            n2,
-            target,
-            targetAnchor,
-            internals,
-            1
-          );
-        }
-      }
-    }
-    updateCssVars(n2);
-  },
-  remove(vnode, parentComponent, parentSuspense, optimized, { um: unmount, o: { remove: hostRemove } }, doRemove) {
-    const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode;
-    if (target) {
-      hostRemove(targetAnchor);
-    }
-    doRemove && hostRemove(anchor);
-    if (shapeFlag & 16) {
-      const shouldRemove = doRemove || !isTeleportDisabled(props);
-      for (let i = 0; i < children.length; i++) {
-        const child = children[i];
-        unmount(
-          child,
-          parentComponent,
-          parentSuspense,
-          shouldRemove,
-          !!child.dynamicChildren
-        );
-      }
-    }
-  },
-  move: moveTeleport,
-  hydrate: hydrateTeleport
-};
-function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {
-  if (moveType === 0) {
-    insert(vnode.targetAnchor, container, parentAnchor);
-  }
-  const { el, anchor, shapeFlag, children, props } = vnode;
-  const isReorder = moveType === 2;
-  if (isReorder) {
-    insert(el, container, parentAnchor);
-  }
-  if (!isReorder || isTeleportDisabled(props)) {
-    if (shapeFlag & 16) {
-      for (let i = 0; i < children.length; i++) {
-        move(
-          children[i],
-          container,
-          parentAnchor,
-          2
-        );
-      }
-    }
-  }
-  if (isReorder) {
-    insert(anchor, container, parentAnchor);
-  }
-}
-function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {
-  o: { nextSibling, parentNode, querySelector }
-}, hydrateChildren) {
-  const target = vnode.target = resolveTarget(
-    vnode.props,
-    querySelector
-  );
-  if (target) {
-    const targetNode = target._lpa || target.firstChild;
-    if (vnode.shapeFlag & 16) {
-      if (isTeleportDisabled(vnode.props)) {
-        vnode.anchor = hydrateChildren(
-          nextSibling(node),
-          vnode,
-          parentNode(node),
-          parentComponent,
-          parentSuspense,
-          slotScopeIds,
-          optimized
-        );
-        vnode.targetAnchor = targetNode;
-      } else {
-        vnode.anchor = nextSibling(node);
-        let targetAnchor = targetNode;
-        while (targetAnchor) {
-          targetAnchor = nextSibling(targetAnchor);
-          if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === "teleport anchor") {
-            vnode.targetAnchor = targetAnchor;
-            target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
-            break;
-          }
-        }
-        hydrateChildren(
-          targetNode,
-          vnode,
-          target,
-          parentComponent,
-          parentSuspense,
-          slotScopeIds,
-          optimized
-        );
-      }
-    }
-    updateCssVars(vnode);
-  }
-  return vnode.anchor && nextSibling(vnode.anchor);
-}
-const Teleport = TeleportImpl;
-function updateCssVars(vnode) {
-  const ctx = vnode.ctx;
-  if (ctx && ctx.ut) {
-    let node = vnode.children[0].el;
-    while (node && node !== vnode.targetAnchor) {
-      if (node.nodeType === 1)
-        node.setAttribute("data-v-owner", ctx.uid);
-      node = node.nextSibling;
-    }
-    ctx.ut();
-  }
-}
-
-const Fragment = Symbol.for("v-fgt");
-const Text = Symbol.for("v-txt");
-const Comment = Symbol.for("v-cmt");
-const Static = Symbol.for("v-stc");
-const blockStack = [];
-let currentBlock = null;
-function openBlock(disableTracking = false) {
-  blockStack.push(currentBlock = disableTracking ? null : []);
-}
-function closeBlock() {
-  blockStack.pop();
-  currentBlock = blockStack[blockStack.length - 1] || null;
-}
-let isBlockTreeEnabled = 1;
-function setBlockTracking(value) {
-  isBlockTreeEnabled += value;
-}
-function setupBlock(vnode) {
-  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;
-  closeBlock();
-  if (isBlockTreeEnabled > 0 && currentBlock) {
-    currentBlock.push(vnode);
-  }
-  return vnode;
-}
-function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
-  return setupBlock(
-    createBaseVNode(
-      type,
-      props,
-      children,
-      patchFlag,
-      dynamicProps,
-      shapeFlag,
-      true
-      /* isBlock */
-    )
-  );
-}
-function createBlock(type, props, children, patchFlag, dynamicProps) {
-  return setupBlock(
-    createVNode(
-      type,
-      props,
-      children,
-      patchFlag,
-      dynamicProps,
-      true
-      /* isBlock: prevent a block from tracking itself */
-    )
-  );
-}
-function isVNode(value) {
-  return value ? value.__v_isVNode === true : false;
-}
-function isSameVNodeType(n1, n2) {
-  if (n2.shapeFlag & 6 && hmrDirtyComponents.has(n2.type)) {
-    n1.shapeFlag &= ~256;
-    n2.shapeFlag &= ~512;
-    return false;
-  }
-  return n1.type === n2.type && n1.key === n2.key;
-}
-let vnodeArgsTransformer;
-function transformVNodeArgs(transformer) {
-  vnodeArgsTransformer = transformer;
-}
-const createVNodeWithArgsTransform = (...args) => {
-  return _createVNode(
-    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args
-  );
-};
-const InternalObjectKey = `__vInternal`;
-const normalizeKey = ({ key }) => key != null ? key : null;
-const normalizeRef = ({
-  ref,
-  ref_key,
-  ref_for
-}) => {
-  if (typeof ref === "number") {
-    ref = "" + ref;
-  }
-  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;
-};
-function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
-  const vnode = {
-    __v_isVNode: true,
-    __v_skip: true,
-    type,
-    props,
-    key: props && normalizeKey(props),
-    ref: props && normalizeRef(props),
-    scopeId: currentScopeId,
-    slotScopeIds: null,
-    children,
-    component: null,
-    suspense: null,
-    ssContent: null,
-    ssFallback: null,
-    dirs: null,
-    transition: null,
-    el: null,
-    anchor: null,
-    target: null,
-    targetAnchor: null,
-    staticCount: 0,
-    shapeFlag,
-    patchFlag,
-    dynamicProps,
-    dynamicChildren: null,
-    appContext: null,
-    ctx: currentRenderingInstance
-  };
-  if (needFullChildrenNormalization) {
-    normalizeChildren(vnode, children);
-    if (shapeFlag & 128) {
-      type.normalize(vnode);
-    }
-  } else if (children) {
-    vnode.shapeFlag |= isString(children) ? 8 : 16;
-  }
-  if (vnode.key !== vnode.key) {
-    warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
-  }
-  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself
-  !isBlockNode && // has current parent block
-  currentBlock && // presence of a patch flag indicates this node needs patching on updates.
-  // component nodes also should always be patched, because even if the
-  // component doesn't need to update, it needs to persist the instance on to
-  // the next vnode so that it can be properly unmounted later.
-  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the
-  // vnode should not be considered dynamic due to handler caching.
-  vnode.patchFlag !== 32) {
-    currentBlock.push(vnode);
-  }
-  return vnode;
-}
-const createVNode = createVNodeWithArgsTransform ;
-function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
-  if (!type || type === NULL_DYNAMIC_COMPONENT) {
-    if (!type) {
-      warn(`Invalid vnode type when creating vnode: ${type}.`);
-    }
-    type = Comment;
-  }
-  if (isVNode(type)) {
-    const cloned = cloneVNode(
-      type,
-      props,
-      true
-      /* mergeRef: true */
-    );
-    if (children) {
-      normalizeChildren(cloned, children);
-    }
-    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {
-      if (cloned.shapeFlag & 6) {
-        currentBlock[currentBlock.indexOf(type)] = cloned;
-      } else {
-        currentBlock.push(cloned);
-      }
-    }
-    cloned.patchFlag |= -2;
-    return cloned;
-  }
-  if (isClassComponent(type)) {
-    type = type.__vccOpts;
-  }
-  if (props) {
-    props = guardReactiveProps(props);
-    let { class: klass, style } = props;
-    if (klass && !isString(klass)) {
-      props.class = normalizeClass(klass);
-    }
-    if (isObject(style)) {
-      if (isProxy(style) && !isArray(style)) {
-        style = extend({}, style);
-      }
-      props.style = normalizeStyle(style);
-    }
-  }
-  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;
-  if (shapeFlag & 4 && isProxy(type)) {
-    type = toRaw(type);
-    warn(
-      `Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`,
-      `
-Component that was made reactive: `,
-      type
-    );
-  }
-  return createBaseVNode(
-    type,
-    props,
-    children,
-    patchFlag,
-    dynamicProps,
-    shapeFlag,
-    isBlockNode,
-    true
-  );
-}
-function guardReactiveProps(props) {
-  if (!props)
-    return null;
-  return isProxy(props) || InternalObjectKey in props ? extend({}, props) : props;
-}
-function cloneVNode(vnode, extraProps, mergeRef = false) {
-  const { props, ref, patchFlag, children } = vnode;
-  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
-  const cloned = {
-    __v_isVNode: true,
-    __v_skip: true,
-    type: vnode.type,
-    props: mergedProps,
-    key: mergedProps && normalizeKey(mergedProps),
-    ref: extraProps && extraProps.ref ? (
-      // #2078 in the case of <component :is="vnode" ref="extra"/>
-      // if the vnode itself already has a ref, cloneVNode will need to merge
-      // the refs so the single vnode can be set on multiple refs
-      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)
-    ) : ref,
-    scopeId: vnode.scopeId,
-    slotScopeIds: vnode.slotScopeIds,
-    children: patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,
-    target: vnode.target,
-    targetAnchor: vnode.targetAnchor,
-    staticCount: vnode.staticCount,
-    shapeFlag: vnode.shapeFlag,
-    // if the vnode is cloned with extra props, we can no longer assume its
-    // existing patch flag to be reliable and need to add the FULL_PROPS flag.
-    // note: preserve flag for fragments since they use the flag for children
-    // fast paths only.
-    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
-    dynamicProps: vnode.dynamicProps,
-    dynamicChildren: vnode.dynamicChildren,
-    appContext: vnode.appContext,
-    dirs: vnode.dirs,
-    transition: vnode.transition,
-    // These should technically only be non-null on mounted VNodes. However,
-    // they *should* be copied for kept-alive vnodes. So we just always copy
-    // them since them being non-null during a mount doesn't affect the logic as
-    // they will simply be overwritten.
-    component: vnode.component,
-    suspense: vnode.suspense,
-    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
-    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
-    el: vnode.el,
-    anchor: vnode.anchor,
-    ctx: vnode.ctx,
-    ce: vnode.ce
-  };
-  return cloned;
-}
-function deepCloneVNode(vnode) {
-  const cloned = cloneVNode(vnode);
-  if (isArray(vnode.children)) {
-    cloned.children = vnode.children.map(deepCloneVNode);
-  }
-  return cloned;
-}
-function createTextVNode(text = " ", flag = 0) {
-  return createVNode(Text, null, text, flag);
-}
-function createStaticVNode(content, numberOfNodes) {
-  const vnode = createVNode(Static, null, content);
-  vnode.staticCount = numberOfNodes;
-  return vnode;
-}
-function createCommentVNode(text = "", asBlock = false) {
-  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);
-}
-function normalizeVNode(child) {
-  if (child == null || typeof child === "boolean") {
-    return createVNode(Comment);
-  } else if (isArray(child)) {
-    return createVNode(
-      Fragment,
-      null,
-      // #3666, avoid reference pollution when reusing vnode
-      child.slice()
-    );
-  } else if (typeof child === "object") {
-    return cloneIfMounted(child);
-  } else {
-    return createVNode(Text, null, String(child));
-  }
-}
-function cloneIfMounted(child) {
-  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
-}
-function normalizeChildren(vnode, children) {
-  let type = 0;
-  const { shapeFlag } = vnode;
-  if (children == null) {
-    children = null;
-  } else if (isArray(children)) {
-    type = 16;
-  } else if (typeof children === "object") {
-    if (shapeFlag & (1 | 64)) {
-      const slot = children.default;
-      if (slot) {
-        slot._c && (slot._d = false);
-        normalizeChildren(vnode, slot());
-        slot._c && (slot._d = true);
-      }
-      return;
-    } else {
-      type = 32;
-      const slotFlag = children._;
-      if (!slotFlag && !(InternalObjectKey in children)) {
-        children._ctx = currentRenderingInstance;
-      } else if (slotFlag === 3 && currentRenderingInstance) {
-        if (currentRenderingInstance.slots._ === 1) {
-          children._ = 1;
-        } else {
-          children._ = 2;
-          vnode.patchFlag |= 1024;
-        }
-      }
-    }
-  } else if (isFunction(children)) {
-    children = { default: children, _ctx: currentRenderingInstance };
-    type = 32;
-  } else {
-    children = String(children);
-    if (shapeFlag & 64) {
-      type = 16;
-      children = [createTextVNode(children)];
-    } else {
-      type = 8;
-    }
-  }
-  vnode.children = children;
-  vnode.shapeFlag |= type;
-}
-function mergeProps(...args) {
-  const ret = {};
-  for (let i = 0; i < args.length; i++) {
-    const toMerge = args[i];
-    for (const key in toMerge) {
-      if (key === "class") {
-        if (ret.class !== toMerge.class) {
-          ret.class = normalizeClass([ret.class, toMerge.class]);
-        }
-      } else if (key === "style") {
-        ret.style = normalizeStyle([ret.style, toMerge.style]);
-      } else if (isOn(key)) {
-        const existing = ret[key];
-        const incoming = toMerge[key];
-        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {
-          ret[key] = existing ? [].concat(existing, incoming) : incoming;
-        }
-      } else if (key !== "") {
-        ret[key] = toMerge[key];
-      }
-    }
-  }
-  return ret;
-}
-function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
-  callWithAsyncErrorHandling(hook, instance, 7, [
-    vnode,
-    prevVNode
-  ]);
-}
-
-const emptyAppContext = createAppContext();
-let uid = 0;
-function createComponentInstance(vnode, parent, suspense) {
-  const type = vnode.type;
-  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
-  const instance = {
-    uid: uid++,
-    vnode,
-    type,
-    parent,
-    appContext,
-    root: null,
-    // to be immediately set
-    next: null,
-    subTree: null,
-    // will be set synchronously right after creation
-    effect: null,
-    update: null,
-    // will be set synchronously right after creation
-    scope: new EffectScope(
-      true
-      /* detached */
-    ),
-    render: null,
-    proxy: null,
-    exposed: null,
-    exposeProxy: null,
-    withProxy: null,
-    provides: parent ? parent.provides : Object.create(appContext.provides),
-    accessCache: null,
-    renderCache: [],
-    // local resolved assets
-    components: null,
-    directives: null,
-    // resolved props and emits options
-    propsOptions: normalizePropsOptions(type, appContext),
-    emitsOptions: normalizeEmitsOptions(type, appContext),
-    // emit
-    emit: null,
-    // to be set immediately
-    emitted: null,
-    // props default value
-    propsDefaults: EMPTY_OBJ,
-    // inheritAttrs
-    inheritAttrs: type.inheritAttrs,
-    // state
-    ctx: EMPTY_OBJ,
-    data: EMPTY_OBJ,
-    props: EMPTY_OBJ,
-    attrs: EMPTY_OBJ,
-    slots: EMPTY_OBJ,
-    refs: EMPTY_OBJ,
-    setupState: EMPTY_OBJ,
-    setupContext: null,
-    attrsProxy: null,
-    slotsProxy: null,
-    // suspense related
-    suspense,
-    suspenseId: suspense ? suspense.pendingId : 0,
-    asyncDep: null,
-    asyncResolved: false,
-    // lifecycle hooks
-    // not using enums here because it results in computed properties
-    isMounted: false,
-    isUnmounted: false,
-    isDeactivated: false,
-    bc: null,
-    c: null,
-    bm: null,
-    m: null,
-    bu: null,
-    u: null,
-    um: null,
-    bum: null,
-    da: null,
-    a: null,
-    rtg: null,
-    rtc: null,
-    ec: null,
-    sp: null
-  };
-  {
-    instance.ctx = createDevRenderContext(instance);
-  }
-  instance.root = parent ? parent.root : instance;
-  instance.emit = emit.bind(null, instance);
-  if (vnode.ce) {
-    vnode.ce(instance);
-  }
-  return instance;
-}
-let currentInstance = null;
-const getCurrentInstance = () => currentInstance || currentRenderingInstance;
-let internalSetCurrentInstance;
-{
-  internalSetCurrentInstance = (i) => {
-    currentInstance = i;
-  };
-}
-const setCurrentInstance = (instance) => {
-  internalSetCurrentInstance(instance);
-  instance.scope.on();
-};
-const unsetCurrentInstance = () => {
-  currentInstance && currentInstance.scope.off();
-  internalSetCurrentInstance(null);
-};
-const isBuiltInTag = /* @__PURE__ */ makeMap("slot,component");
-function validateComponentName(name, config) {
-  const appIsNativeTag = config.isNativeTag || NO;
-  if (isBuiltInTag(name) || appIsNativeTag(name)) {
-    warn(
-      "Do not use built-in or reserved HTML elements as component id: " + name
-    );
-  }
-}
-function isStatefulComponent(instance) {
-  return instance.vnode.shapeFlag & 4;
-}
-let isInSSRComponentSetup = false;
-function setupComponent(instance, isSSR = false) {
-  isInSSRComponentSetup = isSSR;
-  const { props, children } = instance.vnode;
-  const isStateful = isStatefulComponent(instance);
-  initProps(instance, props, isStateful, isSSR);
-  initSlots(instance, children);
-  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
-  isInSSRComponentSetup = false;
-  return setupResult;
-}
-function setupStatefulComponent(instance, isSSR) {
-  var _a;
-  const Component = instance.type;
-  {
-    if (Component.name) {
-      validateComponentName(Component.name, instance.appContext.config);
-    }
-    if (Component.components) {
-      const names = Object.keys(Component.components);
-      for (let i = 0; i < names.length; i++) {
-        validateComponentName(names[i], instance.appContext.config);
-      }
-    }
-    if (Component.directives) {
-      const names = Object.keys(Component.directives);
-      for (let i = 0; i < names.length; i++) {
-        validateDirectiveName(names[i]);
-      }
-    }
-    if (Component.compilerOptions && isRuntimeOnly()) {
-      warn(
-        `"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`
-      );
-    }
-  }
-  instance.accessCache = /* @__PURE__ */ Object.create(null);
-  instance.proxy = markRaw(new Proxy(instance.ctx, PublicInstanceProxyHandlers));
-  {
-    exposePropsOnRenderContext(instance);
-  }
-  const { setup } = Component;
-  if (setup) {
-    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
-    setCurrentInstance(instance);
-    pauseTracking();
-    const setupResult = callWithErrorHandling(
-      setup,
-      instance,
-      0,
-      [shallowReadonly(instance.props) , setupContext]
-    );
-    resetTracking();
-    unsetCurrentInstance();
-    if (isPromise(setupResult)) {
-      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
-      if (isSSR) {
-        return setupResult.then((resolvedResult) => {
-          handleSetupResult(instance, resolvedResult, isSSR);
-        }).catch((e) => {
-          handleError(e, instance, 0);
-        });
-      } else {
-        instance.asyncDep = setupResult;
-        if (!instance.suspense) {
-          const name = (_a = Component.name) != null ? _a : "Anonymous";
-          warn(
-            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`
-          );
-        }
-      }
-    } else {
-      handleSetupResult(instance, setupResult, isSSR);
-    }
-  } else {
-    finishComponentSetup(instance, isSSR);
-  }
-}
-function handleSetupResult(instance, setupResult, isSSR) {
-  if (isFunction(setupResult)) {
-    {
-      instance.render = setupResult;
-    }
-  } else if (isObject(setupResult)) {
-    if (isVNode(setupResult)) {
-      warn(
-        `setup() should not return VNodes directly - return a render function instead.`
-      );
-    }
-    {
-      instance.devtoolsRawSetupState = setupResult;
-    }
-    instance.setupState = proxyRefs(setupResult);
-    {
-      exposeSetupStateOnRenderContext(instance);
-    }
-  } else if (setupResult !== void 0) {
-    warn(
-      `setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}`
-    );
-  }
-  finishComponentSetup(instance, isSSR);
-}
-let compile$1;
-let installWithProxy;
-function registerRuntimeCompiler(_compile) {
-  compile$1 = _compile;
-  installWithProxy = (i) => {
-    if (i.render._rc) {
-      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
-    }
-  };
-}
-const isRuntimeOnly = () => !compile$1;
-function finishComponentSetup(instance, isSSR, skipOptions) {
-  const Component = instance.type;
-  if (!instance.render) {
-    if (!isSSR && compile$1 && !Component.render) {
-      const template = Component.template || resolveMergedOptions(instance).template;
-      if (template) {
-        {
-          startMeasure(instance, `compile`);
-        }
-        const { isCustomElement, compilerOptions } = instance.appContext.config;
-        const { delimiters, compilerOptions: componentCompilerOptions } = Component;
-        const finalCompilerOptions = extend(
-          extend(
-            {
-              isCustomElement,
-              delimiters
-            },
-            compilerOptions
-          ),
-          componentCompilerOptions
-        );
-        Component.render = compile$1(template, finalCompilerOptions);
-        {
-          endMeasure(instance, `compile`);
-        }
-      }
-    }
-    instance.render = Component.render || NOOP;
-    if (installWithProxy) {
-      installWithProxy(instance);
-    }
-  }
-  {
-    setCurrentInstance(instance);
-    pauseTracking();
-    try {
-      applyOptions(instance);
-    } finally {
-      resetTracking();
-      unsetCurrentInstance();
-    }
-  }
-  if (!Component.render && instance.render === NOOP && !isSSR) {
-    if (!compile$1 && Component.template) {
-      warn(
-        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Use "vue.esm-browser.js" instead.` )
-        /* should not happen */
-      );
-    } else {
-      warn(`Component is missing template or render function.`);
-    }
-  }
-}
-function getAttrsProxy(instance) {
-  return instance.attrsProxy || (instance.attrsProxy = new Proxy(
-    instance.attrs,
-    {
-      get(target, key) {
-        markAttrsAccessed();
-        track(instance, "get", "$attrs");
-        return target[key];
-      },
-      set() {
-        warn(`setupContext.attrs is readonly.`);
-        return false;
-      },
-      deleteProperty() {
-        warn(`setupContext.attrs is readonly.`);
-        return false;
-      }
-    } 
-  ));
-}
-function getSlotsProxy(instance) {
-  return instance.slotsProxy || (instance.slotsProxy = new Proxy(instance.slots, {
-    get(target, key) {
-      track(instance, "get", "$slots");
-      return target[key];
-    }
-  }));
-}
-function createSetupContext(instance) {
-  const expose = (exposed) => {
-    {
-      if (instance.exposed) {
-        warn(`expose() should be called only once per setup().`);
-      }
-      if (exposed != null) {
-        let exposedType = typeof exposed;
-        if (exposedType === "object") {
-          if (isArray(exposed)) {
-            exposedType = "array";
-          } else if (isRef(exposed)) {
-            exposedType = "ref";
-          }
-        }
-        if (exposedType !== "object") {
-          warn(
-            `expose() should be passed a plain object, received ${exposedType}.`
-          );
-        }
-      }
-    }
-    instance.exposed = exposed || {};
-  };
-  {
-    return Object.freeze({
-      get attrs() {
-        return getAttrsProxy(instance);
-      },
-      get slots() {
-        return getSlotsProxy(instance);
-      },
-      get emit() {
-        return (event, ...args) => instance.emit(event, ...args);
-      },
-      expose
-    });
-  }
-}
-function getExposeProxy(instance) {
-  if (instance.exposed) {
-    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
-      get(target, key) {
-        if (key in target) {
-          return target[key];
-        } else if (key in publicPropertiesMap) {
-          return publicPropertiesMap[key](instance);
-        }
-      },
-      has(target, key) {
-        return key in target || key in publicPropertiesMap;
-      }
-    }));
-  }
-}
-const classifyRE = /(?:^|[-_])(\w)/g;
-const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
-function getComponentName(Component, includeInferred = true) {
-  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
-}
-function formatComponentName(instance, Component, isRoot = false) {
-  let name = getComponentName(Component);
-  if (!name && Component.__file) {
-    const match = Component.__file.match(/([^/\\]+)\.\w+$/);
-    if (match) {
-      name = match[1];
-    }
-  }
-  if (!name && instance && instance.parent) {
-    const inferFromRegistry = (registry) => {
-      for (const key in registry) {
-        if (registry[key] === Component) {
-          return key;
-        }
-      }
-    };
-    name = inferFromRegistry(
-      instance.components || instance.parent.type.components
-    ) || inferFromRegistry(instance.appContext.components);
-  }
-  return name ? classify(name) : isRoot ? `App` : `Anonymous`;
-}
-function isClassComponent(value) {
-  return isFunction(value) && "__vccOpts" in value;
-}
-
-const computed = (getterOrOptions, debugOptions) => {
-  return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
-};
-
-function h(type, propsOrChildren, children) {
-  const l = arguments.length;
-  if (l === 2) {
-    if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
-      if (isVNode(propsOrChildren)) {
-        return createVNode(type, null, [propsOrChildren]);
-      }
-      return createVNode(type, propsOrChildren);
-    } else {
-      return createVNode(type, null, propsOrChildren);
-    }
-  } else {
-    if (l > 3) {
-      children = Array.prototype.slice.call(arguments, 2);
-    } else if (l === 3 && isVNode(children)) {
-      children = [children];
-    }
-    return createVNode(type, propsOrChildren, children);
-  }
-}
-
-const ssrContextKey = Symbol.for("v-scx");
-const useSSRContext = () => {
-  {
-    const ctx = inject(ssrContextKey);
-    if (!ctx) {
-      warn(
-        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`
-      );
-    }
-    return ctx;
-  }
-};
-
-function initCustomFormatter() {
-  if (typeof window === "undefined") {
-    return;
-  }
-  const vueStyle = { style: "color:#3ba776" };
-  const numberStyle = { style: "color:#0b1bc9" };
-  const stringStyle = { style: "color:#b62e24" };
-  const keywordStyle = { style: "color:#9d288c" };
-  const formatter = {
-    header(obj) {
-      if (!isObject(obj)) {
-        return null;
-      }
-      if (obj.__isVue) {
-        return ["div", vueStyle, `VueInstance`];
-      } else if (isRef(obj)) {
-        return [
-          "div",
-          {},
-          ["span", vueStyle, genRefFlag(obj)],
-          "<",
-          formatValue(obj.value),
-          `>`
-        ];
-      } else if (isReactive(obj)) {
-        return [
-          "div",
-          {},
-          ["span", vueStyle, isShallow(obj) ? "ShallowReactive" : "Reactive"],
-          "<",
-          formatValue(obj),
-          `>${isReadonly(obj) ? ` (readonly)` : ``}`
-        ];
-      } else if (isReadonly(obj)) {
-        return [
-          "div",
-          {},
-          ["span", vueStyle, isShallow(obj) ? "ShallowReadonly" : "Readonly"],
-          "<",
-          formatValue(obj),
-          ">"
-        ];
-      }
-      return null;
-    },
-    hasBody(obj) {
-      return obj && obj.__isVue;
-    },
-    body(obj) {
-      if (obj && obj.__isVue) {
-        return [
-          "div",
-          {},
-          ...formatInstance(obj.$)
-        ];
-      }
-    }
-  };
-  function formatInstance(instance) {
-    const blocks = [];
-    if (instance.type.props && instance.props) {
-      blocks.push(createInstanceBlock("props", toRaw(instance.props)));
-    }
-    if (instance.setupState !== EMPTY_OBJ) {
-      blocks.push(createInstanceBlock("setup", instance.setupState));
-    }
-    if (instance.data !== EMPTY_OBJ) {
-      blocks.push(createInstanceBlock("data", toRaw(instance.data)));
-    }
-    const computed = extractKeys(instance, "computed");
-    if (computed) {
-      blocks.push(createInstanceBlock("computed", computed));
-    }
-    const injected = extractKeys(instance, "inject");
-    if (injected) {
-      blocks.push(createInstanceBlock("injected", injected));
-    }
-    blocks.push([
-      "div",
-      {},
-      [
-        "span",
-        {
-          style: keywordStyle.style + ";opacity:0.66"
-        },
-        "$ (internal): "
-      ],
-      ["object", { object: instance }]
-    ]);
-    return blocks;
-  }
-  function createInstanceBlock(type, target) {
-    target = extend({}, target);
-    if (!Object.keys(target).length) {
-      return ["span", {}];
-    }
-    return [
-      "div",
-      { style: "line-height:1.25em;margin-bottom:0.6em" },
-      [
-        "div",
-        {
-          style: "color:#476582"
-        },
-        type
-      ],
-      [
-        "div",
-        {
-          style: "padding-left:1.25em"
-        },
-        ...Object.keys(target).map((key) => {
-          return [
-            "div",
-            {},
-            ["span", keywordStyle, key + ": "],
-            formatValue(target[key], false)
-          ];
-        })
-      ]
-    ];
-  }
-  function formatValue(v, asRaw = true) {
-    if (typeof v === "number") {
-      return ["span", numberStyle, v];
-    } else if (typeof v === "string") {
-      return ["span", stringStyle, JSON.stringify(v)];
-    } else if (typeof v === "boolean") {
-      return ["span", keywordStyle, v];
-    } else if (isObject(v)) {
-      return ["object", { object: asRaw ? toRaw(v) : v }];
-    } else {
-      return ["span", stringStyle, String(v)];
-    }
-  }
-  function extractKeys(instance, type) {
-    const Comp = instance.type;
-    if (isFunction(Comp)) {
-      return;
-    }
-    const extracted = {};
-    for (const key in instance.ctx) {
-      if (isKeyOfType(Comp, key, type)) {
-        extracted[key] = instance.ctx[key];
-      }
-    }
-    return extracted;
-  }
-  function isKeyOfType(Comp, key, type) {
-    const opts = Comp[type];
-    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {
-      return true;
-    }
-    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
-      return true;
-    }
-    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {
-      return true;
-    }
-  }
-  function genRefFlag(v) {
-    if (isShallow(v)) {
-      return `ShallowRef`;
-    }
-    if (v.effect) {
-      return `ComputedRef`;
-    }
-    return `Ref`;
-  }
-  if (window.devtoolsFormatters) {
-    window.devtoolsFormatters.push(formatter);
-  } else {
-    window.devtoolsFormatters = [formatter];
-  }
-}
-
-function withMemo(memo, render, cache, index) {
-  const cached = cache[index];
-  if (cached && isMemoSame(cached, memo)) {
-    return cached;
-  }
-  const ret = render();
-  ret.memo = memo.slice();
-  return cache[index] = ret;
-}
-function isMemoSame(cached, memo) {
-  const prev = cached.memo;
-  if (prev.length != memo.length) {
-    return false;
-  }
-  for (let i = 0; i < prev.length; i++) {
-    if (hasChanged(prev[i], memo[i])) {
-      return false;
-    }
-  }
-  if (isBlockTreeEnabled > 0 && currentBlock) {
-    currentBlock.push(cached);
-  }
-  return true;
-}
-
-const version = "3.3.6";
-const ssrUtils = null;
-const resolveFilter = null;
-const compatUtils = null;
-
-const svgNS = "http://www.w3.org/2000/svg";
-const doc = typeof document !== "undefined" ? document : null;
-const templateContainer = doc && /* @__PURE__ */ doc.createElement("template");
-const nodeOps = {
-  insert: (child, parent, anchor) => {
-    parent.insertBefore(child, anchor || null);
-  },
-  remove: (child) => {
-    const parent = child.parentNode;
-    if (parent) {
-      parent.removeChild(child);
-    }
-  },
-  createElement: (tag, isSVG, is, props) => {
-    const el = isSVG ? doc.createElementNS(svgNS, tag) : doc.createElement(tag, is ? { is } : void 0);
-    if (tag === "select" && props && props.multiple != null) {
-      el.setAttribute("multiple", props.multiple);
-    }
-    return el;
-  },
-  createText: (text) => doc.createTextNode(text),
-  createComment: (text) => doc.createComment(text),
-  setText: (node, text) => {
-    node.nodeValue = text;
-  },
-  setElementText: (el, text) => {
-    el.textContent = text;
-  },
-  parentNode: (node) => node.parentNode,
-  nextSibling: (node) => node.nextSibling,
-  querySelector: (selector) => doc.querySelector(selector),
-  setScopeId(el, id) {
-    el.setAttribute(id, "");
-  },
-  // __UNSAFE__
-  // Reason: innerHTML.
-  // Static content here can only come from compiled templates.
-  // As long as the user only uses trusted templates, this is safe.
-  insertStaticContent(content, parent, anchor, isSVG, start, end) {
-    const before = anchor ? anchor.previousSibling : parent.lastChild;
-    if (start && (start === end || start.nextSibling)) {
-      while (true) {
-        parent.insertBefore(start.cloneNode(true), anchor);
-        if (start === end || !(start = start.nextSibling))
-          break;
-      }
-    } else {
-      templateContainer.innerHTML = isSVG ? `<svg>${content}</svg>` : content;
-      const template = templateContainer.content;
-      if (isSVG) {
-        const wrapper = template.firstChild;
-        while (wrapper.firstChild) {
-          template.appendChild(wrapper.firstChild);
-        }
-        template.removeChild(wrapper);
-      }
-      parent.insertBefore(template, anchor);
-    }
-    return [
-      // first
-      before ? before.nextSibling : parent.firstChild,
-      // last
-      anchor ? anchor.previousSibling : parent.lastChild
-    ];
-  }
-};
-
-const TRANSITION$1 = "transition";
-const ANIMATION = "animation";
-const vtcKey = Symbol("_vtc");
-const Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);
-Transition.displayName = "Transition";
-const DOMTransitionPropsValidators = {
-  name: String,
-  type: String,
-  css: {
-    type: Boolean,
-    default: true
-  },
-  duration: [String, Number, Object],
-  enterFromClass: String,
-  enterActiveClass: String,
-  enterToClass: String,
-  appearFromClass: String,
-  appearActiveClass: String,
-  appearToClass: String,
-  leaveFromClass: String,
-  leaveActiveClass: String,
-  leaveToClass: String
-};
-const TransitionPropsValidators = Transition.props = /* @__PURE__ */ extend(
-  {},
-  BaseTransitionPropsValidators,
-  DOMTransitionPropsValidators
-);
-const callHook = (hook, args = []) => {
-  if (isArray(hook)) {
-    hook.forEach((h2) => h2(...args));
-  } else if (hook) {
-    hook(...args);
-  }
-};
-const hasExplicitCallback = (hook) => {
-  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;
-};
-function resolveTransitionProps(rawProps) {
-  const baseProps = {};
-  for (const key in rawProps) {
-    if (!(key in DOMTransitionPropsValidators)) {
-      baseProps[key] = rawProps[key];
-    }
-  }
-  if (rawProps.css === false) {
-    return baseProps;
-  }
-  const {
-    name = "v",
-    type,
-    duration,
-    enterFromClass = `${name}-enter-from`,
-    enterActiveClass = `${name}-enter-active`,
-    enterToClass = `${name}-enter-to`,
-    appearFromClass = enterFromClass,
-    appearActiveClass = enterActiveClass,
-    appearToClass = enterToClass,
-    leaveFromClass = `${name}-leave-from`,
-    leaveActiveClass = `${name}-leave-active`,
-    leaveToClass = `${name}-leave-to`
-  } = rawProps;
-  const durations = normalizeDuration(duration);
-  const enterDuration = durations && durations[0];
-  const leaveDuration = durations && durations[1];
-  const {
-    onBeforeEnter,
-    onEnter,
-    onEnterCancelled,
-    onLeave,
-    onLeaveCancelled,
-    onBeforeAppear = onBeforeEnter,
-    onAppear = onEnter,
-    onAppearCancelled = onEnterCancelled
-  } = baseProps;
-  const finishEnter = (el, isAppear, done) => {
-    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
-    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
-    done && done();
-  };
-  const finishLeave = (el, done) => {
-    el._isLeaving = false;
-    removeTransitionClass(el, leaveFromClass);
-    removeTransitionClass(el, leaveToClass);
-    removeTransitionClass(el, leaveActiveClass);
-    done && done();
-  };
-  const makeEnterHook = (isAppear) => {
-    return (el, done) => {
-      const hook = isAppear ? onAppear : onEnter;
-      const resolve = () => finishEnter(el, isAppear, done);
-      callHook(hook, [el, resolve]);
-      nextFrame(() => {
-        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
-        addTransitionClass(el, isAppear ? appearToClass : enterToClass);
-        if (!hasExplicitCallback(hook)) {
-          whenTransitionEnds(el, type, enterDuration, resolve);
-        }
-      });
-    };
-  };
-  return extend(baseProps, {
-    onBeforeEnter(el) {
-      callHook(onBeforeEnter, [el]);
-      addTransitionClass(el, enterFromClass);
-      addTransitionClass(el, enterActiveClass);
-    },
-    onBeforeAppear(el) {
-      callHook(onBeforeAppear, [el]);
-      addTransitionClass(el, appearFromClass);
-      addTransitionClass(el, appearActiveClass);
-    },
-    onEnter: makeEnterHook(false),
-    onAppear: makeEnterHook(true),
-    onLeave(el, done) {
-      el._isLeaving = true;
-      const resolve = () => finishLeave(el, done);
-      addTransitionClass(el, leaveFromClass);
-      forceReflow();
-      addTransitionClass(el, leaveActiveClass);
-      nextFrame(() => {
-        if (!el._isLeaving) {
-          return;
-        }
-        removeTransitionClass(el, leaveFromClass);
-        addTransitionClass(el, leaveToClass);
-        if (!hasExplicitCallback(onLeave)) {
-          whenTransitionEnds(el, type, leaveDuration, resolve);
-        }
-      });
-      callHook(onLeave, [el, resolve]);
-    },
-    onEnterCancelled(el) {
-      finishEnter(el, false);
-      callHook(onEnterCancelled, [el]);
-    },
-    onAppearCancelled(el) {
-      finishEnter(el, true);
-      callHook(onAppearCancelled, [el]);
-    },
-    onLeaveCancelled(el) {
-      finishLeave(el);
-      callHook(onLeaveCancelled, [el]);
-    }
-  });
-}
-function normalizeDuration(duration) {
-  if (duration == null) {
-    return null;
-  } else if (isObject(duration)) {
-    return [NumberOf(duration.enter), NumberOf(duration.leave)];
-  } else {
-    const n = NumberOf(duration);
-    return [n, n];
-  }
-}
-function NumberOf(val) {
-  const res = toNumber(val);
-  {
-    assertNumber(res, "<transition> explicit duration");
-  }
-  return res;
-}
-function addTransitionClass(el, cls) {
-  cls.split(/\s+/).forEach((c) => c && el.classList.add(c));
-  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);
-}
-function removeTransitionClass(el, cls) {
-  cls.split(/\s+/).forEach((c) => c && el.classList.remove(c));
-  const _vtc = el[vtcKey];
-  if (_vtc) {
-    _vtc.delete(cls);
-    if (!_vtc.size) {
-      el[vtcKey] = void 0;
-    }
-  }
-}
-function nextFrame(cb) {
-  requestAnimationFrame(() => {
-    requestAnimationFrame(cb);
-  });
-}
-let endId = 0;
-function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
-  const id = el._endId = ++endId;
-  const resolveIfNotStale = () => {
-    if (id === el._endId) {
-      resolve();
-    }
-  };
-  if (explicitTimeout) {
-    return setTimeout(resolveIfNotStale, explicitTimeout);
-  }
-  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
-  if (!type) {
-    return resolve();
-  }
-  const endEvent = type + "end";
-  let ended = 0;
-  const end = () => {
-    el.removeEventListener(endEvent, onEnd);
-    resolveIfNotStale();
-  };
-  const onEnd = (e) => {
-    if (e.target === el && ++ended >= propCount) {
-      end();
-    }
-  };
-  setTimeout(() => {
-    if (ended < propCount) {
-      end();
-    }
-  }, timeout + 1);
-  el.addEventListener(endEvent, onEnd);
-}
-function getTransitionInfo(el, expectedType) {
-  const styles = window.getComputedStyle(el);
-  const getStyleProperties = (key) => (styles[key] || "").split(", ");
-  const transitionDelays = getStyleProperties(`${TRANSITION$1}Delay`);
-  const transitionDurations = getStyleProperties(`${TRANSITION$1}Duration`);
-  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
-  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);
-  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);
-  const animationTimeout = getTimeout(animationDelays, animationDurations);
-  let type = null;
-  let timeout = 0;
-  let propCount = 0;
-  if (expectedType === TRANSITION$1) {
-    if (transitionTimeout > 0) {
-      type = TRANSITION$1;
-      timeout = transitionTimeout;
-      propCount = transitionDurations.length;
-    }
-  } else if (expectedType === ANIMATION) {
-    if (animationTimeout > 0) {
-      type = ANIMATION;
-      timeout = animationTimeout;
-      propCount = animationDurations.length;
-    }
-  } else {
-    timeout = Math.max(transitionTimeout, animationTimeout);
-    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION$1 : ANIMATION : null;
-    propCount = type ? type === TRANSITION$1 ? transitionDurations.length : animationDurations.length : 0;
-  }
-  const hasTransform = type === TRANSITION$1 && /\b(transform|all)(,|$)/.test(
-    getStyleProperties(`${TRANSITION$1}Property`).toString()
-  );
-  return {
-    type,
-    timeout,
-    propCount,
-    hasTransform
-  };
-}
-function getTimeout(delays, durations) {
-  while (delays.length < durations.length) {
-    delays = delays.concat(delays);
-  }
-  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
-}
-function toMs(s) {
-  if (s === "auto")
-    return 0;
-  return Number(s.slice(0, -1).replace(",", ".")) * 1e3;
-}
-function forceReflow() {
-  return document.body.offsetHeight;
-}
-
-function patchClass(el, value, isSVG) {
-  const transitionClasses = el[vtcKey];
-  if (transitionClasses) {
-    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
-  }
-  if (value == null) {
-    el.removeAttribute("class");
-  } else if (isSVG) {
-    el.setAttribute("class", value);
-  } else {
-    el.className = value;
-  }
-}
-
-const vShowOldKey = Symbol("_vod");
-const vShow = {
-  beforeMount(el, { value }, { transition }) {
-    el[vShowOldKey] = el.style.display === "none" ? "" : el.style.display;
-    if (transition && value) {
-      transition.beforeEnter(el);
-    } else {
-      setDisplay(el, value);
-    }
-  },
-  mounted(el, { value }, { transition }) {
-    if (transition && value) {
-      transition.enter(el);
-    }
-  },
-  updated(el, { value, oldValue }, { transition }) {
-    if (!value === !oldValue)
-      return;
-    if (transition) {
-      if (value) {
-        transition.beforeEnter(el);
-        setDisplay(el, true);
-        transition.enter(el);
-      } else {
-        transition.leave(el, () => {
-          setDisplay(el, false);
-        });
-      }
-    } else {
-      setDisplay(el, value);
-    }
-  },
-  beforeUnmount(el, { value }) {
-    setDisplay(el, value);
-  }
-};
-function setDisplay(el, value) {
-  el.style.display = value ? el[vShowOldKey] : "none";
-}
-
-function patchStyle(el, prev, next) {
-  const style = el.style;
-  const isCssString = isString(next);
-  if (next && !isCssString) {
-    if (prev && !isString(prev)) {
-      for (const key in prev) {
-        if (next[key] == null) {
-          setStyle(style, key, "");
-        }
-      }
-    }
-    for (const key in next) {
-      setStyle(style, key, next[key]);
-    }
-  } else {
-    const currentDisplay = style.display;
-    if (isCssString) {
-      if (prev !== next) {
-        style.cssText = next;
-      }
-    } else if (prev) {
-      el.removeAttribute("style");
-    }
-    if (vShowOldKey in el) {
-      style.display = currentDisplay;
-    }
-  }
-}
-const semicolonRE = /[^\\];\s*$/;
-const importantRE = /\s*!important$/;
-function setStyle(style, name, val) {
-  if (isArray(val)) {
-    val.forEach((v) => setStyle(style, name, v));
-  } else {
-    if (val == null)
-      val = "";
-    {
-      if (semicolonRE.test(val)) {
-        warn(
-          `Unexpected semicolon at the end of '${name}' style value: '${val}'`
-        );
-      }
-    }
-    if (name.startsWith("--")) {
-      style.setProperty(name, val);
-    } else {
-      const prefixed = autoPrefix(style, name);
-      if (importantRE.test(val)) {
-        style.setProperty(
-          hyphenate(prefixed),
-          val.replace(importantRE, ""),
-          "important"
-        );
-      } else {
-        style[prefixed] = val;
-      }
-    }
-  }
-}
-const prefixes = ["Webkit", "Moz", "ms"];
-const prefixCache = {};
-function autoPrefix(style, rawName) {
-  const cached = prefixCache[rawName];
-  if (cached) {
-    return cached;
-  }
-  let name = camelize(rawName);
-  if (name !== "filter" && name in style) {
-    return prefixCache[rawName] = name;
-  }
-  name = capitalize(name);
-  for (let i = 0; i < prefixes.length; i++) {
-    const prefixed = prefixes[i] + name;
-    if (prefixed in style) {
-      return prefixCache[rawName] = prefixed;
-    }
-  }
-  return rawName;
-}
-
-const xlinkNS = "http://www.w3.org/1999/xlink";
-function patchAttr(el, key, value, isSVG, instance) {
-  if (isSVG && key.startsWith("xlink:")) {
-    if (value == null) {
-      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
-    } else {
-      el.setAttributeNS(xlinkNS, key, value);
-    }
-  } else {
-    const isBoolean = isSpecialBooleanAttr(key);
-    if (value == null || isBoolean && !includeBooleanAttr(value)) {
-      el.removeAttribute(key);
-    } else {
-      el.setAttribute(key, isBoolean ? "" : value);
-    }
-  }
-}
-
-function patchDOMProp(el, key, value, prevChildren, parentComponent, parentSuspense, unmountChildren) {
-  if (key === "innerHTML" || key === "textContent") {
-    if (prevChildren) {
-      unmountChildren(prevChildren, parentComponent, parentSuspense);
-    }
-    el[key] = value == null ? "" : value;
-    return;
-  }
-  const tag = el.tagName;
-  if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
-  !tag.includes("-")) {
-    el._value = value;
-    const oldValue = tag === "OPTION" ? el.getAttribute("value") : el.value;
-    const newValue = value == null ? "" : value;
-    if (oldValue !== newValue) {
-      el.value = newValue;
-    }
-    if (value == null) {
-      el.removeAttribute(key);
-    }
-    return;
-  }
-  let needRemove = false;
-  if (value === "" || value == null) {
-    const type = typeof el[key];
-    if (type === "boolean") {
-      value = includeBooleanAttr(value);
-    } else if (value == null && type === "string") {
-      value = "";
-      needRemove = true;
-    } else if (type === "number") {
-      value = 0;
-      needRemove = true;
-    }
-  }
-  try {
-    el[key] = value;
-  } catch (e) {
-    if (!needRemove) {
-      warn(
-        `Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`,
-        e
-      );
-    }
-  }
-  needRemove && el.removeAttribute(key);
-}
-
-function addEventListener(el, event, handler, options) {
-  el.addEventListener(event, handler, options);
-}
-function removeEventListener(el, event, handler, options) {
-  el.removeEventListener(event, handler, options);
-}
-const veiKey = Symbol("_vei");
-function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
-  const invokers = el[veiKey] || (el[veiKey] = {});
-  const existingInvoker = invokers[rawName];
-  if (nextValue && existingInvoker) {
-    existingInvoker.value = nextValue;
-  } else {
-    const [name, options] = parseName(rawName);
-    if (nextValue) {
-      const invoker = invokers[rawName] = createInvoker(nextValue, instance);
-      addEventListener(el, name, invoker, options);
-    } else if (existingInvoker) {
-      removeEventListener(el, name, existingInvoker, options);
-      invokers[rawName] = void 0;
-    }
-  }
-}
-const optionsModifierRE = /(?:Once|Passive|Capture)$/;
-function parseName(name) {
-  let options;
-  if (optionsModifierRE.test(name)) {
-    options = {};
-    let m;
-    while (m = name.match(optionsModifierRE)) {
-      name = name.slice(0, name.length - m[0].length);
-      options[m[0].toLowerCase()] = true;
-    }
-  }
-  const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2));
-  return [event, options];
-}
-let cachedNow = 0;
-const p = /* @__PURE__ */ Promise.resolve();
-const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
-function createInvoker(initialValue, instance) {
-  const invoker = (e) => {
-    if (!e._vts) {
-      e._vts = Date.now();
-    } else if (e._vts <= invoker.attached) {
-      return;
-    }
-    callWithAsyncErrorHandling(
-      patchStopImmediatePropagation(e, invoker.value),
-      instance,
-      5,
-      [e]
-    );
-  };
-  invoker.value = initialValue;
-  invoker.attached = getNow();
-  return invoker;
-}
-function patchStopImmediatePropagation(e, value) {
-  if (isArray(value)) {
-    const originalStop = e.stopImmediatePropagation;
-    e.stopImmediatePropagation = () => {
-      originalStop.call(e);
-      e._stopped = true;
-    };
-    return value.map((fn) => (e2) => !e2._stopped && fn && fn(e2));
-  } else {
-    return value;
-  }
-}
-
-const nativeOnRE = /^on[a-z]/;
-const patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {
-  if (key === "class") {
-    patchClass(el, nextValue, isSVG);
-  } else if (key === "style") {
-    patchStyle(el, prevValue, nextValue);
-  } else if (isOn(key)) {
-    if (!isModelListener(key)) {
-      patchEvent(el, key, prevValue, nextValue, parentComponent);
-    }
-  } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
-    patchDOMProp(
-      el,
-      key,
-      nextValue,
-      prevChildren,
-      parentComponent,
-      parentSuspense,
-      unmountChildren
-    );
-  } else {
-    if (key === "true-value") {
-      el._trueValue = nextValue;
-    } else if (key === "false-value") {
-      el._falseValue = nextValue;
-    }
-    patchAttr(el, key, nextValue, isSVG);
-  }
-};
-function shouldSetAsProp(el, key, value, isSVG) {
-  if (isSVG) {
-    if (key === "innerHTML" || key === "textContent") {
-      return true;
-    }
-    if (key in el && nativeOnRE.test(key) && isFunction(value)) {
-      return true;
-    }
-    return false;
-  }
-  if (key === "spellcheck" || key === "draggable" || key === "translate") {
-    return false;
-  }
-  if (key === "form") {
-    return false;
-  }
-  if (key === "list" && el.tagName === "INPUT") {
-    return false;
-  }
-  if (key === "type" && el.tagName === "TEXTAREA") {
-    return false;
-  }
-  if (nativeOnRE.test(key) && isString(value)) {
-    return false;
-  }
-  return key in el;
-}
-
-/*! #__NO_SIDE_EFFECTS__ */
-// @__NO_SIDE_EFFECTS__
-function defineCustomElement(options, hydrate2) {
-  const Comp = defineComponent(options);
-  class VueCustomElement extends VueElement {
-    constructor(initialProps) {
-      super(Comp, initialProps, hydrate2);
-    }
-  }
-  VueCustomElement.def = Comp;
-  return VueCustomElement;
-}
-/*! #__NO_SIDE_EFFECTS__ */
-const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options) => {
-  return /* @__PURE__ */ defineCustomElement(options, hydrate);
-};
-const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {
-};
-class VueElement extends BaseClass {
-  constructor(_def, _props = {}, hydrate2) {
-    super();
-    this._def = _def;
-    this._props = _props;
-    /**
-     * @internal
-     */
-    this._instance = null;
-    this._connected = false;
-    this._resolved = false;
-    this._numberProps = null;
-    this._ob = null;
-    if (this.shadowRoot && hydrate2) {
-      hydrate2(this._createVNode(), this.shadowRoot);
-    } else {
-      if (this.shadowRoot) {
-        warn(
-          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.`
-        );
-      }
-      this.attachShadow({ mode: "open" });
-      if (!this._def.__asyncLoader) {
-        this._resolveProps(this._def);
-      }
-    }
-  }
-  connectedCallback() {
-    this._connected = true;
-    if (!this._instance) {
-      if (this._resolved) {
-        this._update();
-      } else {
-        this._resolveDef();
-      }
-    }
-  }
-  disconnectedCallback() {
-    this._connected = false;
-    if (this._ob) {
-      this._ob.disconnect();
-      this._ob = null;
-    }
-    nextTick(() => {
-      if (!this._connected) {
-        render(null, this.shadowRoot);
-        this._instance = null;
-      }
-    });
-  }
-  /**
-   * resolve inner component definition (handle possible async component)
-   */
-  _resolveDef() {
-    this._resolved = true;
-    for (let i = 0; i < this.attributes.length; i++) {
-      this._setAttr(this.attributes[i].name);
-    }
-    this._ob = new MutationObserver((mutations) => {
-      for (const m of mutations) {
-        this._setAttr(m.attributeName);
-      }
-    });
-    this._ob.observe(this, { attributes: true });
-    const resolve = (def, isAsync = false) => {
-      const { props, styles } = def;
-      let numberProps;
-      if (props && !isArray(props)) {
-        for (const key in props) {
-          const opt = props[key];
-          if (opt === Number || opt && opt.type === Number) {
-            if (key in this._props) {
-              this._props[key] = toNumber(this._props[key]);
-            }
-            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize(key)] = true;
-          }
-        }
-      }
-      this._numberProps = numberProps;
-      if (isAsync) {
-        this._resolveProps(def);
-      }
-      this._applyStyles(styles);
-      this._update();
-    };
-    const asyncDef = this._def.__asyncLoader;
-    if (asyncDef) {
-      asyncDef().then((def) => resolve(def, true));
-    } else {
-      resolve(this._def);
-    }
-  }
-  _resolveProps(def) {
-    const { props } = def;
-    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});
-    for (const key of Object.keys(this)) {
-      if (key[0] !== "_" && declaredPropKeys.includes(key)) {
-        this._setProp(key, this[key], true, false);
-      }
-    }
-    for (const key of declaredPropKeys.map(camelize)) {
-      Object.defineProperty(this, key, {
-        get() {
-          return this._getProp(key);
-        },
-        set(val) {
-          this._setProp(key, val);
-        }
-      });
-    }
-  }
-  _setAttr(key) {
-    let value = this.getAttribute(key);
-    const camelKey = camelize(key);
-    if (this._numberProps && this._numberProps[camelKey]) {
-      value = toNumber(value);
-    }
-    this._setProp(camelKey, value, false);
-  }
-  /**
-   * @internal
-   */
-  _getProp(key) {
-    return this._props[key];
-  }
-  /**
-   * @internal
-   */
-  _setProp(key, val, shouldReflect = true, shouldUpdate = true) {
-    if (val !== this._props[key]) {
-      this._props[key] = val;
-      if (shouldUpdate && this._instance) {
-        this._update();
-      }
-      if (shouldReflect) {
-        if (val === true) {
-          this.setAttribute(hyphenate(key), "");
-        } else if (typeof val === "string" || typeof val === "number") {
-          this.setAttribute(hyphenate(key), val + "");
-        } else if (!val) {
-          this.removeAttribute(hyphenate(key));
-        }
-      }
-    }
-  }
-  _update() {
-    render(this._createVNode(), this.shadowRoot);
-  }
-  _createVNode() {
-    const vnode = createVNode(this._def, extend({}, this._props));
-    if (!this._instance) {
-      vnode.ce = (instance) => {
-        this._instance = instance;
-        instance.isCE = true;
-        {
-          instance.ceReload = (newStyles) => {
-            if (this._styles) {
-              this._styles.forEach((s) => this.shadowRoot.removeChild(s));
-              this._styles.length = 0;
-            }
-            this._applyStyles(newStyles);
-            this._instance = null;
-            this._update();
-          };
-        }
-        const dispatch = (event, args) => {
-          this.dispatchEvent(
-            new CustomEvent(event, {
-              detail: args
-            })
-          );
-        };
-        instance.emit = (event, ...args) => {
-          dispatch(event, args);
-          if (hyphenate(event) !== event) {
-            dispatch(hyphenate(event), args);
-          }
-        };
-        let parent = this;
-        while (parent = parent && (parent.parentNode || parent.host)) {
-          if (parent instanceof VueElement) {
-            instance.parent = parent._instance;
-            instance.provides = parent._instance.provides;
-            break;
-          }
-        }
-      };
-    }
-    return vnode;
-  }
-  _applyStyles(styles) {
-    if (styles) {
-      styles.forEach((css) => {
-        const s = document.createElement("style");
-        s.textContent = css;
-        this.shadowRoot.appendChild(s);
-        {
-          (this._styles || (this._styles = [])).push(s);
-        }
-      });
-    }
-  }
-}
-
-function useCssModule(name = "$style") {
-  {
-    const instance = getCurrentInstance();
-    if (!instance) {
-      warn(`useCssModule must be called inside setup()`);
-      return EMPTY_OBJ;
-    }
-    const modules = instance.type.__cssModules;
-    if (!modules) {
-      warn(`Current instance does not have CSS modules injected.`);
-      return EMPTY_OBJ;
-    }
-    const mod = modules[name];
-    if (!mod) {
-      warn(`Current instance does not have CSS module named "${name}".`);
-      return EMPTY_OBJ;
-    }
-    return mod;
-  }
-}
-
-function useCssVars(getter) {
-  const instance = getCurrentInstance();
-  if (!instance) {
-    warn(`useCssVars is called without current active component instance.`);
-    return;
-  }
-  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {
-    Array.from(
-      document.querySelectorAll(`[data-v-owner="${instance.uid}"]`)
-    ).forEach((node) => setVarsOnNode(node, vars));
-  };
-  const setVars = () => {
-    const vars = getter(instance.proxy);
-    setVarsOnVNode(instance.subTree, vars);
-    updateTeleports(vars);
-  };
-  watchPostEffect(setVars);
-  onMounted(() => {
-    const ob = new MutationObserver(setVars);
-    ob.observe(instance.subTree.el.parentNode, { childList: true });
-    onUnmounted(() => ob.disconnect());
-  });
-}
-function setVarsOnVNode(vnode, vars) {
-  if (vnode.shapeFlag & 128) {
-    const suspense = vnode.suspense;
-    vnode = suspense.activeBranch;
-    if (suspense.pendingBranch && !suspense.isHydrating) {
-      suspense.effects.push(() => {
-        setVarsOnVNode(suspense.activeBranch, vars);
-      });
-    }
-  }
-  while (vnode.component) {
-    vnode = vnode.component.subTree;
-  }
-  if (vnode.shapeFlag & 1 && vnode.el) {
-    setVarsOnNode(vnode.el, vars);
-  } else if (vnode.type === Fragment) {
-    vnode.children.forEach((c) => setVarsOnVNode(c, vars));
-  } else if (vnode.type === Static) {
-    let { el, anchor } = vnode;
-    while (el) {
-      setVarsOnNode(el, vars);
-      if (el === anchor)
-        break;
-      el = el.nextSibling;
-    }
-  }
-}
-function setVarsOnNode(el, vars) {
-  if (el.nodeType === 1) {
-    const style = el.style;
-    for (const key in vars) {
-      style.setProperty(`--${key}`, vars[key]);
-    }
-  }
-}
-
-const positionMap = /* @__PURE__ */ new WeakMap();
-const newPositionMap = /* @__PURE__ */ new WeakMap();
-const moveCbKey = Symbol("_moveCb");
-const enterCbKey = Symbol("_enterCb");
-const TransitionGroupImpl = {
-  name: "TransitionGroup",
-  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {
-    tag: String,
-    moveClass: String
-  }),
-  setup(props, { slots }) {
-    const instance = getCurrentInstance();
-    const state = useTransitionState();
-    let prevChildren;
-    let children;
-    onUpdated(() => {
-      if (!prevChildren.length) {
-        return;
-      }
-      const moveClass = props.moveClass || `${props.name || "v"}-move`;
-      if (!hasCSSTransform(
-        prevChildren[0].el,
-        instance.vnode.el,
-        moveClass
-      )) {
-        return;
-      }
-      prevChildren.forEach(callPendingCbs);
-      prevChildren.forEach(recordPosition);
-      const movedChildren = prevChildren.filter(applyTranslation);
-      forceReflow();
-      movedChildren.forEach((c) => {
-        const el = c.el;
-        const style = el.style;
-        addTransitionClass(el, moveClass);
-        style.transform = style.webkitTransform = style.transitionDuration = "";
-        const cb = el[moveCbKey] = (e) => {
-          if (e && e.target !== el) {
-            return;
-          }
-          if (!e || /transform$/.test(e.propertyName)) {
-            el.removeEventListener("transitionend", cb);
-            el[moveCbKey] = null;
-            removeTransitionClass(el, moveClass);
-          }
-        };
-        el.addEventListener("transitionend", cb);
-      });
-    });
-    return () => {
-      const rawProps = toRaw(props);
-      const cssTransitionProps = resolveTransitionProps(rawProps);
-      let tag = rawProps.tag || Fragment;
-      prevChildren = children;
-      children = slots.default ? getTransitionRawChildren(slots.default()) : [];
-      for (let i = 0; i < children.length; i++) {
-        const child = children[i];
-        if (child.key != null) {
-          setTransitionHooks(
-            child,
-            resolveTransitionHooks(child, cssTransitionProps, state, instance)
-          );
-        } else {
-          warn(`<TransitionGroup> children must be keyed.`);
-        }
-      }
-      if (prevChildren) {
-        for (let i = 0; i < prevChildren.length; i++) {
-          const child = prevChildren[i];
-          setTransitionHooks(
-            child,
-            resolveTransitionHooks(child, cssTransitionProps, state, instance)
-          );
-          positionMap.set(child, child.el.getBoundingClientRect());
-        }
-      }
-      return createVNode(tag, null, children);
-    };
-  }
-};
-const removeMode = (props) => delete props.mode;
-/* @__PURE__ */ removeMode(TransitionGroupImpl.props);
-const TransitionGroup = TransitionGroupImpl;
-function callPendingCbs(c) {
-  const el = c.el;
-  if (el[moveCbKey]) {
-    el[moveCbKey]();
-  }
-  if (el[enterCbKey]) {
-    el[enterCbKey]();
-  }
-}
-function recordPosition(c) {
-  newPositionMap.set(c, c.el.getBoundingClientRect());
-}
-function applyTranslation(c) {
-  const oldPos = positionMap.get(c);
-  const newPos = newPositionMap.get(c);
-  const dx = oldPos.left - newPos.left;
-  const dy = oldPos.top - newPos.top;
-  if (dx || dy) {
-    const s = c.el.style;
-    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
-    s.transitionDuration = "0s";
-    return c;
-  }
-}
-function hasCSSTransform(el, root, moveClass) {
-  const clone = el.cloneNode();
-  const _vtc = el[vtcKey];
-  if (_vtc) {
-    _vtc.forEach((cls) => {
-      cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c));
-    });
-  }
-  moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c));
-  clone.style.display = "none";
-  const container = root.nodeType === 1 ? root : root.parentNode;
-  container.appendChild(clone);
-  const { hasTransform } = getTransitionInfo(clone);
-  container.removeChild(clone);
-  return hasTransform;
-}
-
-const getModelAssigner = (vnode) => {
-  const fn = vnode.props["onUpdate:modelValue"] || false;
-  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;
-};
-function onCompositionStart(e) {
-  e.target.composing = true;
-}
-function onCompositionEnd(e) {
-  const target = e.target;
-  if (target.composing) {
-    target.composing = false;
-    target.dispatchEvent(new Event("input"));
-  }
-}
-const assignKey = Symbol("_assign");
-const vModelText = {
-  created(el, { modifiers: { lazy, trim, number } }, vnode) {
-    el[assignKey] = getModelAssigner(vnode);
-    const castToNumber = number || vnode.props && vnode.props.type === "number";
-    addEventListener(el, lazy ? "change" : "input", (e) => {
-      if (e.target.composing)
-        return;
-      let domValue = el.value;
-      if (trim) {
-        domValue = domValue.trim();
-      }
-      if (castToNumber) {
-        domValue = looseToNumber(domValue);
-      }
-      el[assignKey](domValue);
-    });
-    if (trim) {
-      addEventListener(el, "change", () => {
-        el.value = el.value.trim();
-      });
-    }
-    if (!lazy) {
-      addEventListener(el, "compositionstart", onCompositionStart);
-      addEventListener(el, "compositionend", onCompositionEnd);
-      addEventListener(el, "change", onCompositionEnd);
-    }
-  },
-  // set value on mounted so it's after min/max for type="range"
-  mounted(el, { value }) {
-    el.value = value == null ? "" : value;
-  },
-  beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {
-    el[assignKey] = getModelAssigner(vnode);
-    if (el.composing)
-      return;
-    if (document.activeElement === el && el.type !== "range") {
-      if (lazy) {
-        return;
-      }
-      if (trim && el.value.trim() === value) {
-        return;
-      }
-      if ((number || el.type === "number") && looseToNumber(el.value) === value) {
-        return;
-      }
-    }
-    const newValue = value == null ? "" : value;
-    if (el.value !== newValue) {
-      el.value = newValue;
-    }
-  }
-};
-const vModelCheckbox = {
-  // #4096 array checkboxes need to be deep traversed
-  deep: true,
-  created(el, _, vnode) {
-    el[assignKey] = getModelAssigner(vnode);
-    addEventListener(el, "change", () => {
-      const modelValue = el._modelValue;
-      const elementValue = getValue(el);
-      const checked = el.checked;
-      const assign = el[assignKey];
-      if (isArray(modelValue)) {
-        const index = looseIndexOf(modelValue, elementValue);
-        const found = index !== -1;
-        if (checked && !found) {
-          assign(modelValue.concat(elementValue));
-        } else if (!checked && found) {
-          const filtered = [...modelValue];
-          filtered.splice(index, 1);
-          assign(filtered);
-        }
-      } else if (isSet(modelValue)) {
-        const cloned = new Set(modelValue);
-        if (checked) {
-          cloned.add(elementValue);
-        } else {
-          cloned.delete(elementValue);
-        }
-        assign(cloned);
-      } else {
-        assign(getCheckboxValue(el, checked));
-      }
-    });
-  },
-  // set initial checked on mount to wait for true-value/false-value
-  mounted: setChecked,
-  beforeUpdate(el, binding, vnode) {
-    el[assignKey] = getModelAssigner(vnode);
-    setChecked(el, binding, vnode);
-  }
-};
-function setChecked(el, { value, oldValue }, vnode) {
-  el._modelValue = value;
-  if (isArray(value)) {
-    el.checked = looseIndexOf(value, vnode.props.value) > -1;
-  } else if (isSet(value)) {
-    el.checked = value.has(vnode.props.value);
-  } else if (value !== oldValue) {
-    el.checked = looseEqual(value, getCheckboxValue(el, true));
-  }
-}
-const vModelRadio = {
-  created(el, { value }, vnode) {
-    el.checked = looseEqual(value, vnode.props.value);
-    el[assignKey] = getModelAssigner(vnode);
-    addEventListener(el, "change", () => {
-      el[assignKey](getValue(el));
-    });
-  },
-  beforeUpdate(el, { value, oldValue }, vnode) {
-    el[assignKey] = getModelAssigner(vnode);
-    if (value !== oldValue) {
-      el.checked = looseEqual(value, vnode.props.value);
-    }
-  }
-};
-const vModelSelect = {
-  // <select multiple> value need to be deep traversed
-  deep: true,
-  created(el, { value, modifiers: { number } }, vnode) {
-    const isSetModel = isSet(value);
-    addEventListener(el, "change", () => {
-      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
-        (o) => number ? looseToNumber(getValue(o)) : getValue(o)
-      );
-      el[assignKey](
-        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
-      );
-    });
-    el[assignKey] = getModelAssigner(vnode);
-  },
-  // set value in mounted & updated because <select> relies on its children
-  // <option>s.
-  mounted(el, { value }) {
-    setSelected(el, value);
-  },
-  beforeUpdate(el, _binding, vnode) {
-    el[assignKey] = getModelAssigner(vnode);
-  },
-  updated(el, { value }) {
-    setSelected(el, value);
-  }
-};
-function setSelected(el, value) {
-  const isMultiple = el.multiple;
-  if (isMultiple && !isArray(value) && !isSet(value)) {
-    warn(
-      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
-    );
-    return;
-  }
-  for (let i = 0, l = el.options.length; i < l; i++) {
-    const option = el.options[i];
-    const optionValue = getValue(option);
-    if (isMultiple) {
-      if (isArray(value)) {
-        option.selected = looseIndexOf(value, optionValue) > -1;
-      } else {
-        option.selected = value.has(optionValue);
-      }
-    } else {
-      if (looseEqual(getValue(option), value)) {
-        if (el.selectedIndex !== i)
-          el.selectedIndex = i;
-        return;
-      }
-    }
-  }
-  if (!isMultiple && el.selectedIndex !== -1) {
-    el.selectedIndex = -1;
-  }
-}
-function getValue(el) {
-  return "_value" in el ? el._value : el.value;
-}
-function getCheckboxValue(el, checked) {
-  const key = checked ? "_trueValue" : "_falseValue";
-  return key in el ? el[key] : checked;
-}
-const vModelDynamic = {
-  created(el, binding, vnode) {
-    callModelHook(el, binding, vnode, null, "created");
-  },
-  mounted(el, binding, vnode) {
-    callModelHook(el, binding, vnode, null, "mounted");
-  },
-  beforeUpdate(el, binding, vnode, prevVNode) {
-    callModelHook(el, binding, vnode, prevVNode, "beforeUpdate");
-  },
-  updated(el, binding, vnode, prevVNode) {
-    callModelHook(el, binding, vnode, prevVNode, "updated");
-  }
-};
-function resolveDynamicModel(tagName, type) {
-  switch (tagName) {
-    case "SELECT":
-      return vModelSelect;
-    case "TEXTAREA":
-      return vModelText;
-    default:
-      switch (type) {
-        case "checkbox":
-          return vModelCheckbox;
-        case "radio":
-          return vModelRadio;
-        default:
-          return vModelText;
-      }
-  }
-}
-function callModelHook(el, binding, vnode, prevVNode, hook) {
-  const modelToUse = resolveDynamicModel(
-    el.tagName,
-    vnode.props && vnode.props.type
-  );
-  const fn = modelToUse[hook];
-  fn && fn(el, binding, vnode, prevVNode);
-}
-
-const systemModifiers = ["ctrl", "shift", "alt", "meta"];
-const modifierGuards = {
-  stop: (e) => e.stopPropagation(),
-  prevent: (e) => e.preventDefault(),
-  self: (e) => e.target !== e.currentTarget,
-  ctrl: (e) => !e.ctrlKey,
-  shift: (e) => !e.shiftKey,
-  alt: (e) => !e.altKey,
-  meta: (e) => !e.metaKey,
-  left: (e) => "button" in e && e.button !== 0,
-  middle: (e) => "button" in e && e.button !== 1,
-  right: (e) => "button" in e && e.button !== 2,
-  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
-};
-const withModifiers = (fn, modifiers) => {
-  return (event, ...args) => {
-    for (let i = 0; i < modifiers.length; i++) {
-      const guard = modifierGuards[modifiers[i]];
-      if (guard && guard(event, modifiers))
-        return;
-    }
-    return fn(event, ...args);
-  };
-};
-const keyNames = {
-  esc: "escape",
-  space: " ",
-  up: "arrow-up",
-  left: "arrow-left",
-  right: "arrow-right",
-  down: "arrow-down",
-  delete: "backspace"
-};
-const withKeys = (fn, modifiers) => {
-  return (event) => {
-    if (!("key" in event)) {
-      return;
-    }
-    const eventKey = hyphenate(event.key);
-    if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {
-      return fn(event);
-    }
-  };
-};
-
-const rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);
-let renderer;
-let enabledHydration = false;
-function ensureRenderer() {
-  return renderer || (renderer = createRenderer(rendererOptions));
-}
-function ensureHydrationRenderer() {
-  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);
-  enabledHydration = true;
-  return renderer;
-}
-const render = (...args) => {
-  ensureRenderer().render(...args);
-};
-const hydrate = (...args) => {
-  ensureHydrationRenderer().hydrate(...args);
-};
-const createApp = (...args) => {
-  const app = ensureRenderer().createApp(...args);
-  {
-    injectNativeTagCheck(app);
-    injectCompilerOptionsCheck(app);
-  }
-  const { mount } = app;
-  app.mount = (containerOrSelector) => {
-    const container = normalizeContainer(containerOrSelector);
-    if (!container)
-      return;
-    const component = app._component;
-    if (!isFunction(component) && !component.render && !component.template) {
-      component.template = container.innerHTML;
-    }
-    container.innerHTML = "";
-    const proxy = mount(container, false, container instanceof SVGElement);
-    if (container instanceof Element) {
-      container.removeAttribute("v-cloak");
-      container.setAttribute("data-v-app", "");
-    }
-    return proxy;
-  };
-  return app;
-};
-const createSSRApp = (...args) => {
-  const app = ensureHydrationRenderer().createApp(...args);
-  {
-    injectNativeTagCheck(app);
-    injectCompilerOptionsCheck(app);
-  }
-  const { mount } = app;
-  app.mount = (containerOrSelector) => {
-    const container = normalizeContainer(containerOrSelector);
-    if (container) {
-      return mount(container, true, container instanceof SVGElement);
-    }
-  };
-  return app;
-};
-function injectNativeTagCheck(app) {
-  Object.defineProperty(app.config, "isNativeTag", {
-    value: (tag) => isHTMLTag(tag) || isSVGTag(tag),
-    writable: false
-  });
-}
-function injectCompilerOptionsCheck(app) {
-  if (isRuntimeOnly()) {
-    const isCustomElement = app.config.isCustomElement;
-    Object.defineProperty(app.config, "isCustomElement", {
-      get() {
-        return isCustomElement;
-      },
-      set() {
-        warn(
-          `The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.`
-        );
-      }
-    });
-    const compilerOptions = app.config.compilerOptions;
-    const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead.
-- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option.
-- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader
-- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;
-    Object.defineProperty(app.config, "compilerOptions", {
-      get() {
-        warn(msg);
-        return compilerOptions;
-      },
-      set() {
-        warn(msg);
-      }
-    });
-  }
-}
-function normalizeContainer(container) {
-  if (isString(container)) {
-    const res = document.querySelector(container);
-    if (!res) {
-      warn(
-        `Failed to mount app: mount target selector "${container}" returned null.`
-      );
-    }
-    return res;
-  }
-  if (window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") {
-    warn(
-      `mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`
-    );
-  }
-  return container;
-}
-const initDirectivesForSSR = NOOP;
-
-var runtimeDom = /*#__PURE__*/Object.freeze({
-  __proto__: null,
-  BaseTransition: BaseTransition,
-  BaseTransitionPropsValidators: BaseTransitionPropsValidators,
-  Comment: Comment,
-  EffectScope: EffectScope,
-  Fragment: Fragment,
-  KeepAlive: KeepAlive,
-  ReactiveEffect: ReactiveEffect,
-  Static: Static,
-  Suspense: Suspense,
-  Teleport: Teleport,
-  Text: Text,
-  Transition: Transition,
-  TransitionGroup: TransitionGroup,
-  VueElement: VueElement,
-  assertNumber: assertNumber,
-  callWithAsyncErrorHandling: callWithAsyncErrorHandling,
-  callWithErrorHandling: callWithErrorHandling,
-  camelize: camelize,
-  capitalize: capitalize,
-  cloneVNode: cloneVNode,
-  compatUtils: compatUtils,
-  computed: computed,
-  createApp: createApp,
-  createBlock: createBlock,
-  createCommentVNode: createCommentVNode,
-  createElementBlock: createElementBlock,
-  createElementVNode: createBaseVNode,
-  createHydrationRenderer: createHydrationRenderer,
-  createPropsRestProxy: createPropsRestProxy,
-  createRenderer: createRenderer,
-  createSSRApp: createSSRApp,
-  createSlots: createSlots,
-  createStaticVNode: createStaticVNode,
-  createTextVNode: createTextVNode,
-  createVNode: createVNode,
-  customRef: customRef,
-  defineAsyncComponent: defineAsyncComponent,
-  defineComponent: defineComponent,
-  defineCustomElement: defineCustomElement,
-  defineEmits: defineEmits,
-  defineExpose: defineExpose,
-  defineModel: defineModel,
-  defineOptions: defineOptions,
-  defineProps: defineProps,
-  defineSSRCustomElement: defineSSRCustomElement,
-  defineSlots: defineSlots,
-  get devtools () { return devtools; },
-  effect: effect,
-  effectScope: effectScope,
-  getCurrentInstance: getCurrentInstance,
-  getCurrentScope: getCurrentScope,
-  getTransitionRawChildren: getTransitionRawChildren,
-  guardReactiveProps: guardReactiveProps,
-  h: h,
-  handleError: handleError,
-  hasInjectionContext: hasInjectionContext,
-  hydrate: hydrate,
-  initCustomFormatter: initCustomFormatter,
-  initDirectivesForSSR: initDirectivesForSSR,
-  inject: inject,
-  isMemoSame: isMemoSame,
-  isProxy: isProxy,
-  isReactive: isReactive,
-  isReadonly: isReadonly,
-  isRef: isRef,
-  isRuntimeOnly: isRuntimeOnly,
-  isShallow: isShallow,
-  isVNode: isVNode,
-  markRaw: markRaw,
-  mergeDefaults: mergeDefaults,
-  mergeModels: mergeModels,
-  mergeProps: mergeProps,
-  nextTick: nextTick,
-  normalizeClass: normalizeClass,
-  normalizeProps: normalizeProps,
-  normalizeStyle: normalizeStyle,
-  onActivated: onActivated,
-  onBeforeMount: onBeforeMount,
-  onBeforeUnmount: onBeforeUnmount,
-  onBeforeUpdate: onBeforeUpdate,
-  onDeactivated: onDeactivated,
-  onErrorCaptured: onErrorCaptured,
-  onMounted: onMounted,
-  onRenderTracked: onRenderTracked,
-  onRenderTriggered: onRenderTriggered,
-  onScopeDispose: onScopeDispose,
-  onServerPrefetch: onServerPrefetch,
-  onUnmounted: onUnmounted,
-  onUpdated: onUpdated,
-  openBlock: openBlock,
-  popScopeId: popScopeId,
-  provide: provide,
-  proxyRefs: proxyRefs,
-  pushScopeId: pushScopeId,
-  queuePostFlushCb: queuePostFlushCb,
-  reactive: reactive,
-  readonly: readonly,
-  ref: ref,
-  registerRuntimeCompiler: registerRuntimeCompiler,
-  render: render,
-  renderList: renderList,
-  renderSlot: renderSlot,
-  resolveComponent: resolveComponent,
-  resolveDirective: resolveDirective,
-  resolveDynamicComponent: resolveDynamicComponent,
-  resolveFilter: resolveFilter,
-  resolveTransitionHooks: resolveTransitionHooks,
-  setBlockTracking: setBlockTracking,
-  setDevtoolsHook: setDevtoolsHook,
-  setTransitionHooks: setTransitionHooks,
-  shallowReactive: shallowReactive,
-  shallowReadonly: shallowReadonly,
-  shallowRef: shallowRef,
-  ssrContextKey: ssrContextKey,
-  ssrUtils: ssrUtils,
-  stop: stop,
-  toDisplayString: toDisplayString,
-  toHandlerKey: toHandlerKey,
-  toHandlers: toHandlers,
-  toRaw: toRaw,
-  toRef: toRef,
-  toRefs: toRefs,
-  toValue: toValue,
-  transformVNodeArgs: transformVNodeArgs,
-  triggerRef: triggerRef,
-  unref: unref,
-  useAttrs: useAttrs,
-  useCssModule: useCssModule,
-  useCssVars: useCssVars,
-  useModel: useModel,
-  useSSRContext: useSSRContext,
-  useSlots: useSlots,
-  useTransitionState: useTransitionState,
-  vModelCheckbox: vModelCheckbox,
-  vModelDynamic: vModelDynamic,
-  vModelRadio: vModelRadio,
-  vModelSelect: vModelSelect,
-  vModelText: vModelText,
-  vShow: vShow,
-  version: version,
-  warn: warn,
-  watch: watch,
-  watchEffect: watchEffect,
-  watchPostEffect: watchPostEffect,
-  watchSyncEffect: watchSyncEffect,
-  withAsyncContext: withAsyncContext,
-  withCtx: withCtx,
-  withDefaults: withDefaults,
-  withDirectives: withDirectives,
-  withKeys: withKeys,
-  withMemo: withMemo,
-  withModifiers: withModifiers,
-  withScopeId: withScopeId
-});
-
-function initDev() {
-  {
-    {
-      console.info(
-        `You are running a development build of Vue.
-Make sure to use the production build (*.prod.js) when deploying for production.`
-      );
-    }
-    initCustomFormatter();
-  }
-}
-
-function defaultOnError(error) {
-  throw error;
-}
-function defaultOnWarn(msg) {
-  console.warn(`[Vue warn] ${msg.message}`);
-}
-function createCompilerError(code, loc, messages, additionalMessage) {
-  const msg = (messages || errorMessages)[code] + (additionalMessage || ``) ;
-  const error = new SyntaxError(String(msg));
-  error.code = code;
-  error.loc = loc;
-  return error;
-}
-const errorMessages = {
-  // parse errors
-  [0]: "Illegal comment.",
-  [1]: "CDATA section is allowed only in XML context.",
-  [2]: "Duplicate attribute.",
-  [3]: "End tag cannot have attributes.",
-  [4]: "Illegal '/' in tags.",
-  [5]: "Unexpected EOF in tag.",
-  [6]: "Unexpected EOF in CDATA section.",
-  [7]: "Unexpected EOF in comment.",
-  [8]: "Unexpected EOF in script.",
-  [9]: "Unexpected EOF in tag.",
-  [10]: "Incorrectly closed comment.",
-  [11]: "Incorrectly opened comment.",
-  [12]: "Illegal tag name. Use '&lt;' to print '<'.",
-  [13]: "Attribute value was expected.",
-  [14]: "End tag name was expected.",
-  [15]: "Whitespace was expected.",
-  [16]: "Unexpected '<!--' in comment.",
-  [17]: `Attribute name cannot contain U+0022 ("), U+0027 ('), and U+003C (<).`,
-  [18]: "Unquoted attribute value cannot contain U+0022 (\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).",
-  [19]: "Attribute name cannot start with '='.",
-  [21]: "'<?' is allowed only in XML context.",
-  [20]: `Unexpected null character.`,
-  [22]: "Illegal '/' in tags.",
-  // Vue-specific parse errors
-  [23]: "Invalid end tag.",
-  [24]: "Element is missing end tag.",
-  [25]: "Interpolation end sign was not found.",
-  [27]: "End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.",
-  [26]: "Legal directive name was expected.",
-  // transform errors
-  [28]: `v-if/v-else-if is missing expression.`,
-  [29]: `v-if/else branches must use unique keys.`,
-  [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,
-  [31]: `v-for is missing expression.`,
-  [32]: `v-for has invalid expression.`,
-  [33]: `<template v-for> key should be placed on the <template> tag.`,
-  [34]: `v-bind is missing expression.`,
-  [35]: `v-on is missing expression.`,
-  [36]: `Unexpected custom directive on <slot> outlet.`,
-  [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`,
-  [38]: `Duplicate slot names found. `,
-  [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`,
-  [40]: `v-slot can only be used on components or <template> tags.`,
-  [41]: `v-model is missing expression.`,
-  [42]: `v-model value must be a valid JavaScript member expression.`,
-  [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,
-  [44]: `v-model cannot be used on a prop, because local prop bindings are not writable.
-Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,
-  [45]: `Error parsing JavaScript expression: `,
-  [46]: `<KeepAlive> expects exactly one child component.`,
-  // generic errors
-  [47]: `"prefixIdentifiers" option is not supported in this build of compiler.`,
-  [48]: `ES module mode is not supported in this build of compiler.`,
-  [49]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,
-  [50]: `"scopeId" option is only supported in module mode.`,
-  // deprecations
-  [51]: `@vnode-* hooks in templates are deprecated. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support will be removed in 3.4.`,
-  [52]: `v-is="component-name" has been deprecated. Use is="vue:component-name" instead. v-is support will be removed in 3.4.`,
-  // just to fulfill types
-  [53]: ``
-};
-
-const FRAGMENT = Symbol(`Fragment` );
-const TELEPORT = Symbol(`Teleport` );
-const SUSPENSE = Symbol(`Suspense` );
-const KEEP_ALIVE = Symbol(`KeepAlive` );
-const BASE_TRANSITION = Symbol(`BaseTransition` );
-const OPEN_BLOCK = Symbol(`openBlock` );
-const CREATE_BLOCK = Symbol(`createBlock` );
-const CREATE_ELEMENT_BLOCK = Symbol(`createElementBlock` );
-const CREATE_VNODE = Symbol(`createVNode` );
-const CREATE_ELEMENT_VNODE = Symbol(`createElementVNode` );
-const CREATE_COMMENT = Symbol(`createCommentVNode` );
-const CREATE_TEXT = Symbol(`createTextVNode` );
-const CREATE_STATIC = Symbol(`createStaticVNode` );
-const RESOLVE_COMPONENT = Symbol(`resolveComponent` );
-const RESOLVE_DYNAMIC_COMPONENT = Symbol(
-  `resolveDynamicComponent` 
-);
-const RESOLVE_DIRECTIVE = Symbol(`resolveDirective` );
-const RESOLVE_FILTER = Symbol(`resolveFilter` );
-const WITH_DIRECTIVES = Symbol(`withDirectives` );
-const RENDER_LIST = Symbol(`renderList` );
-const RENDER_SLOT = Symbol(`renderSlot` );
-const CREATE_SLOTS = Symbol(`createSlots` );
-const TO_DISPLAY_STRING = Symbol(`toDisplayString` );
-const MERGE_PROPS = Symbol(`mergeProps` );
-const NORMALIZE_CLASS = Symbol(`normalizeClass` );
-const NORMALIZE_STYLE = Symbol(`normalizeStyle` );
-const NORMALIZE_PROPS = Symbol(`normalizeProps` );
-const GUARD_REACTIVE_PROPS = Symbol(`guardReactiveProps` );
-const TO_HANDLERS = Symbol(`toHandlers` );
-const CAMELIZE = Symbol(`camelize` );
-const CAPITALIZE = Symbol(`capitalize` );
-const TO_HANDLER_KEY = Symbol(`toHandlerKey` );
-const SET_BLOCK_TRACKING = Symbol(`setBlockTracking` );
-const PUSH_SCOPE_ID = Symbol(`pushScopeId` );
-const POP_SCOPE_ID = Symbol(`popScopeId` );
-const WITH_CTX = Symbol(`withCtx` );
-const UNREF = Symbol(`unref` );
-const IS_REF = Symbol(`isRef` );
-const WITH_MEMO = Symbol(`withMemo` );
-const IS_MEMO_SAME = Symbol(`isMemoSame` );
-const helperNameMap = {
-  [FRAGMENT]: `Fragment`,
-  [TELEPORT]: `Teleport`,
-  [SUSPENSE]: `Suspense`,
-  [KEEP_ALIVE]: `KeepAlive`,
-  [BASE_TRANSITION]: `BaseTransition`,
-  [OPEN_BLOCK]: `openBlock`,
-  [CREATE_BLOCK]: `createBlock`,
-  [CREATE_ELEMENT_BLOCK]: `createElementBlock`,
-  [CREATE_VNODE]: `createVNode`,
-  [CREATE_ELEMENT_VNODE]: `createElementVNode`,
-  [CREATE_COMMENT]: `createCommentVNode`,
-  [CREATE_TEXT]: `createTextVNode`,
-  [CREATE_STATIC]: `createStaticVNode`,
-  [RESOLVE_COMPONENT]: `resolveComponent`,
-  [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,
-  [RESOLVE_DIRECTIVE]: `resolveDirective`,
-  [RESOLVE_FILTER]: `resolveFilter`,
-  [WITH_DIRECTIVES]: `withDirectives`,
-  [RENDER_LIST]: `renderList`,
-  [RENDER_SLOT]: `renderSlot`,
-  [CREATE_SLOTS]: `createSlots`,
-  [TO_DISPLAY_STRING]: `toDisplayString`,
-  [MERGE_PROPS]: `mergeProps`,
-  [NORMALIZE_CLASS]: `normalizeClass`,
-  [NORMALIZE_STYLE]: `normalizeStyle`,
-  [NORMALIZE_PROPS]: `normalizeProps`,
-  [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,
-  [TO_HANDLERS]: `toHandlers`,
-  [CAMELIZE]: `camelize`,
-  [CAPITALIZE]: `capitalize`,
-  [TO_HANDLER_KEY]: `toHandlerKey`,
-  [SET_BLOCK_TRACKING]: `setBlockTracking`,
-  [PUSH_SCOPE_ID]: `pushScopeId`,
-  [POP_SCOPE_ID]: `popScopeId`,
-  [WITH_CTX]: `withCtx`,
-  [UNREF]: `unref`,
-  [IS_REF]: `isRef`,
-  [WITH_MEMO]: `withMemo`,
-  [IS_MEMO_SAME]: `isMemoSame`
-};
-function registerRuntimeHelpers(helpers) {
-  Object.getOwnPropertySymbols(helpers).forEach((s) => {
-    helperNameMap[s] = helpers[s];
-  });
-}
-
-const locStub = {
-  source: "",
-  start: { line: 1, column: 1, offset: 0 },
-  end: { line: 1, column: 1, offset: 0 }
-};
-function createRoot(children, loc = locStub) {
-  return {
-    type: 0,
-    children,
-    helpers: /* @__PURE__ */ new Set(),
-    components: [],
-    directives: [],
-    hoists: [],
-    imports: [],
-    cached: 0,
-    temps: 0,
-    codegenNode: void 0,
-    loc
-  };
-}
-function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {
-  if (context) {
-    if (isBlock) {
-      context.helper(OPEN_BLOCK);
-      context.helper(getVNodeBlockHelper(context.inSSR, isComponent));
-    } else {
-      context.helper(getVNodeHelper(context.inSSR, isComponent));
-    }
-    if (directives) {
-      context.helper(WITH_DIRECTIVES);
-    }
-  }
-  return {
-    type: 13,
-    tag,
-    props,
-    children,
-    patchFlag,
-    dynamicProps,
-    directives,
-    isBlock,
-    disableTracking,
-    isComponent,
-    loc
-  };
-}
-function createArrayExpression(elements, loc = locStub) {
-  return {
-    type: 17,
-    loc,
-    elements
-  };
-}
-function createObjectExpression(properties, loc = locStub) {
-  return {
-    type: 15,
-    loc,
-    properties
-  };
-}
-function createObjectProperty(key, value) {
-  return {
-    type: 16,
-    loc: locStub,
-    key: isString(key) ? createSimpleExpression(key, true) : key,
-    value
-  };
-}
-function createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) {
-  return {
-    type: 4,
-    loc,
-    content,
-    isStatic,
-    constType: isStatic ? 3 : constType
-  };
-}
-function createCompoundExpression(children, loc = locStub) {
-  return {
-    type: 8,
-    loc,
-    children
-  };
-}
-function createCallExpression(callee, args = [], loc = locStub) {
-  return {
-    type: 14,
-    loc,
-    callee,
-    arguments: args
-  };
-}
-function createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) {
-  return {
-    type: 18,
-    params,
-    returns,
-    newline,
-    isSlot,
-    loc
-  };
-}
-function createConditionalExpression(test, consequent, alternate, newline = true) {
-  return {
-    type: 19,
-    test,
-    consequent,
-    alternate,
-    newline,
-    loc: locStub
-  };
-}
-function createCacheExpression(index, value, isVNode = false) {
-  return {
-    type: 20,
-    index,
-    value,
-    isVNode,
-    loc: locStub
-  };
-}
-function createBlockStatement(body) {
-  return {
-    type: 21,
-    body,
-    loc: locStub
-  };
-}
-function getVNodeHelper(ssr, isComponent) {
-  return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;
-}
-function getVNodeBlockHelper(ssr, isComponent) {
-  return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;
-}
-function convertToBlock(node, { helper, removeHelper, inSSR }) {
-  if (!node.isBlock) {
-    node.isBlock = true;
-    removeHelper(getVNodeHelper(inSSR, node.isComponent));
-    helper(OPEN_BLOCK);
-    helper(getVNodeBlockHelper(inSSR, node.isComponent));
-  }
-}
-
-const isStaticExp = (p) => p.type === 4 && p.isStatic;
-const isBuiltInType = (tag, expected) => tag === expected || tag === hyphenate(expected);
-function isCoreComponent(tag) {
-  if (isBuiltInType(tag, "Teleport")) {
-    return TELEPORT;
-  } else if (isBuiltInType(tag, "Suspense")) {
-    return SUSPENSE;
-  } else if (isBuiltInType(tag, "KeepAlive")) {
-    return KEEP_ALIVE;
-  } else if (isBuiltInType(tag, "BaseTransition")) {
-    return BASE_TRANSITION;
-  }
-}
-const nonIdentifierRE = /^\d|[^\$\w]/;
-const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
-const validFirstIdentCharRE = /[A-Za-z_$\xA0-\uFFFF]/;
-const validIdentCharRE = /[\.\?\w$\xA0-\uFFFF]/;
-const whitespaceRE = /\s+[.[]\s*|\s*[.[]\s+/g;
-const isMemberExpressionBrowser = (path) => {
-  path = path.trim().replace(whitespaceRE, (s) => s.trim());
-  let state = 0 /* inMemberExp */;
-  let stateStack = [];
-  let currentOpenBracketCount = 0;
-  let currentOpenParensCount = 0;
-  let currentStringType = null;
-  for (let i = 0; i < path.length; i++) {
-    const char = path.charAt(i);
-    switch (state) {
-      case 0 /* inMemberExp */:
-        if (char === "[") {
-          stateStack.push(state);
-          state = 1 /* inBrackets */;
-          currentOpenBracketCount++;
-        } else if (char === "(") {
-          stateStack.push(state);
-          state = 2 /* inParens */;
-          currentOpenParensCount++;
-        } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {
-          return false;
-        }
-        break;
-      case 1 /* inBrackets */:
-        if (char === `'` || char === `"` || char === "`") {
-          stateStack.push(state);
-          state = 3 /* inString */;
-          currentStringType = char;
-        } else if (char === `[`) {
-          currentOpenBracketCount++;
-        } else if (char === `]`) {
-          if (!--currentOpenBracketCount) {
-            state = stateStack.pop();
-          }
-        }
-        break;
-      case 2 /* inParens */:
-        if (char === `'` || char === `"` || char === "`") {
-          stateStack.push(state);
-          state = 3 /* inString */;
-          currentStringType = char;
-        } else if (char === `(`) {
-          currentOpenParensCount++;
-        } else if (char === `)`) {
-          if (i === path.length - 1) {
-            return false;
-          }
-          if (!--currentOpenParensCount) {
-            state = stateStack.pop();
-          }
-        }
-        break;
-      case 3 /* inString */:
-        if (char === currentStringType) {
-          state = stateStack.pop();
-          currentStringType = null;
-        }
-        break;
-    }
-  }
-  return !currentOpenBracketCount && !currentOpenParensCount;
-};
-const isMemberExpression = isMemberExpressionBrowser ;
-function getInnerRange(loc, offset, length) {
-  const source = loc.source.slice(offset, offset + length);
-  const newLoc = {
-    source,
-    start: advancePositionWithClone(loc.start, loc.source, offset),
-    end: loc.end
-  };
-  if (length != null) {
-    newLoc.end = advancePositionWithClone(
-      loc.start,
-      loc.source,
-      offset + length
-    );
-  }
-  return newLoc;
-}
-function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
-  return advancePositionWithMutation(
-    extend({}, pos),
-    source,
-    numberOfCharacters
-  );
-}
-function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
-  let linesCount = 0;
-  let lastNewLinePos = -1;
-  for (let i = 0; i < numberOfCharacters; i++) {
-    if (source.charCodeAt(i) === 10) {
-      linesCount++;
-      lastNewLinePos = i;
-    }
-  }
-  pos.offset += numberOfCharacters;
-  pos.line += linesCount;
-  pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;
-  return pos;
-}
-function assert(condition, msg) {
-  if (!condition) {
-    throw new Error(msg || `unexpected compiler condition`);
-  }
-}
-function findDir(node, name, allowEmpty = false) {
-  for (let i = 0; i < node.props.length; i++) {
-    const p = node.props[i];
-    if (p.type === 7 && (allowEmpty || p.exp) && (isString(name) ? p.name === name : name.test(p.name))) {
-      return p;
-    }
-  }
-}
-function findProp(node, name, dynamicOnly = false, allowEmpty = false) {
-  for (let i = 0; i < node.props.length; i++) {
-    const p = node.props[i];
-    if (p.type === 6) {
-      if (dynamicOnly)
-        continue;
-      if (p.name === name && (p.value || allowEmpty)) {
-        return p;
-      }
-    } else if (p.name === "bind" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) {
-      return p;
-    }
-  }
-}
-function isStaticArgOf(arg, name) {
-  return !!(arg && isStaticExp(arg) && arg.content === name);
-}
-function hasDynamicKeyVBind(node) {
-  return node.props.some(
-    (p) => p.type === 7 && p.name === "bind" && (!p.arg || // v-bind="obj"
-    p.arg.type !== 4 || // v-bind:[_ctx.foo]
-    !p.arg.isStatic)
-    // v-bind:[foo]
-  );
-}
-function isText$1(node) {
-  return node.type === 5 || node.type === 2;
-}
-function isVSlot(p) {
-  return p.type === 7 && p.name === "slot";
-}
-function isTemplateNode(node) {
-  return node.type === 1 && node.tagType === 3;
-}
-function isSlotOutlet(node) {
-  return node.type === 1 && node.tagType === 2;
-}
-const propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);
-function getUnnormalizedProps(props, callPath = []) {
-  if (props && !isString(props) && props.type === 14) {
-    const callee = props.callee;
-    if (!isString(callee) && propsHelperSet.has(callee)) {
-      return getUnnormalizedProps(
-        props.arguments[0],
-        callPath.concat(props)
-      );
-    }
-  }
-  return [props, callPath];
-}
-function injectProp(node, prop, context) {
-  let propsWithInjection;
-  let props = node.type === 13 ? node.props : node.arguments[2];
-  let callPath = [];
-  let parentCall;
-  if (props && !isString(props) && props.type === 14) {
-    const ret = getUnnormalizedProps(props);
-    props = ret[0];
-    callPath = ret[1];
-    parentCall = callPath[callPath.length - 1];
-  }
-  if (props == null || isString(props)) {
-    propsWithInjection = createObjectExpression([prop]);
-  } else if (props.type === 14) {
-    const first = props.arguments[0];
-    if (!isString(first) && first.type === 15) {
-      if (!hasProp(prop, first)) {
-        first.properties.unshift(prop);
-      }
-    } else {
-      if (props.callee === TO_HANDLERS) {
-        propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
-          createObjectExpression([prop]),
-          props
-        ]);
-      } else {
-        props.arguments.unshift(createObjectExpression([prop]));
-      }
-    }
-    !propsWithInjection && (propsWithInjection = props);
-  } else if (props.type === 15) {
-    if (!hasProp(prop, props)) {
-      props.properties.unshift(prop);
-    }
-    propsWithInjection = props;
-  } else {
-    propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
-      createObjectExpression([prop]),
-      props
-    ]);
-    if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {
-      parentCall = callPath[callPath.length - 2];
-    }
-  }
-  if (node.type === 13) {
-    if (parentCall) {
-      parentCall.arguments[0] = propsWithInjection;
-    } else {
-      node.props = propsWithInjection;
-    }
-  } else {
-    if (parentCall) {
-      parentCall.arguments[0] = propsWithInjection;
-    } else {
-      node.arguments[2] = propsWithInjection;
-    }
-  }
-}
-function hasProp(prop, props) {
-  let result = false;
-  if (prop.key.type === 4) {
-    const propKeyName = prop.key.content;
-    result = props.properties.some(
-      (p) => p.key.type === 4 && p.key.content === propKeyName
-    );
-  }
-  return result;
-}
-function toValidAssetId(name, type) {
-  return `_${type}_${name.replace(/[^\w]/g, (searchValue, replaceValue) => {
-    return searchValue === "-" ? "_" : name.charCodeAt(replaceValue).toString();
-  })}`;
-}
-function getMemoedVNodeCall(node) {
-  if (node.type === 14 && node.callee === WITH_MEMO) {
-    return node.arguments[1].returns;
-  } else {
-    return node;
-  }
-}
-
-const decodeRE = /&(gt|lt|amp|apos|quot);/g;
-const decodeMap = {
-  gt: ">",
-  lt: "<",
-  amp: "&",
-  apos: "'",
-  quot: '"'
-};
-const defaultParserOptions = {
-  delimiters: [`{{`, `}}`],
-  getNamespace: () => 0,
-  getTextMode: () => 0,
-  isVoidTag: NO,
-  isPreTag: NO,
-  isCustomElement: NO,
-  decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
-  onError: defaultOnError,
-  onWarn: defaultOnWarn,
-  comments: true
-};
-function baseParse(content, options = {}) {
-  const context = createParserContext(content, options);
-  const start = getCursor(context);
-  return createRoot(
-    parseChildren(context, 0, []),
-    getSelection(context, start)
-  );
-}
-function createParserContext(content, rawOptions) {
-  const options = extend({}, defaultParserOptions);
-  let key;
-  for (key in rawOptions) {
-    options[key] = rawOptions[key] === void 0 ? defaultParserOptions[key] : rawOptions[key];
-  }
-  return {
-    options,
-    column: 1,
-    line: 1,
-    offset: 0,
-    originalSource: content,
-    source: content,
-    inPre: false,
-    inVPre: false,
-    onWarn: options.onWarn
-  };
-}
-function parseChildren(context, mode, ancestors) {
-  const parent = last(ancestors);
-  const ns = parent ? parent.ns : 0;
-  const nodes = [];
-  while (!isEnd(context, mode, ancestors)) {
-    const s = context.source;
-    let node = void 0;
-    if (mode === 0 || mode === 1) {
-      if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {
-        node = parseInterpolation(context, mode);
-      } else if (mode === 0 && s[0] === "<") {
-        if (s.length === 1) {
-          emitError(context, 5, 1);
-        } else if (s[1] === "!") {
-          if (startsWith(s, "<!--")) {
-            node = parseComment(context);
-          } else if (startsWith(s, "<!DOCTYPE")) {
-            node = parseBogusComment(context);
-          } else if (startsWith(s, "<![CDATA[")) {
-            if (ns !== 0) {
-              node = parseCDATA(context, ancestors);
-            } else {
-              emitError(context, 1);
-              node = parseBogusComment(context);
-            }
-          } else {
-            emitError(context, 11);
-            node = parseBogusComment(context);
-          }
-        } else if (s[1] === "/") {
-          if (s.length === 2) {
-            emitError(context, 5, 2);
-          } else if (s[2] === ">") {
-            emitError(context, 14, 2);
-            advanceBy(context, 3);
-            continue;
-          } else if (/[a-z]/i.test(s[2])) {
-            emitError(context, 23);
-            parseTag(context, 1 /* End */, parent);
-            continue;
-          } else {
-            emitError(
-              context,
-              12,
-              2
-            );
-            node = parseBogusComment(context);
-          }
-        } else if (/[a-z]/i.test(s[1])) {
-          node = parseElement(context, ancestors);
-        } else if (s[1] === "?") {
-          emitError(
-            context,
-            21,
-            1
-          );
-          node = parseBogusComment(context);
-        } else {
-          emitError(context, 12, 1);
-        }
-      }
-    }
-    if (!node) {
-      node = parseText(context, mode);
-    }
-    if (isArray(node)) {
-      for (let i = 0; i < node.length; i++) {
-        pushNode(nodes, node[i]);
-      }
-    } else {
-      pushNode(nodes, node);
-    }
-  }
-  let removedWhitespace = false;
-  if (mode !== 2 && mode !== 1) {
-    const shouldCondense = context.options.whitespace !== "preserve";
-    for (let i = 0; i < nodes.length; i++) {
-      const node = nodes[i];
-      if (node.type === 2) {
-        if (!context.inPre) {
-          if (!/[^\t\r\n\f ]/.test(node.content)) {
-            const prev = nodes[i - 1];
-            const next = nodes[i + 1];
-            if (!prev || !next || shouldCondense && (prev.type === 3 && next.type === 3 || prev.type === 3 && next.type === 1 || prev.type === 1 && next.type === 3 || prev.type === 1 && next.type === 1 && /[\r\n]/.test(node.content))) {
-              removedWhitespace = true;
-              nodes[i] = null;
-            } else {
-              node.content = " ";
-            }
-          } else if (shouldCondense) {
-            node.content = node.content.replace(/[\t\r\n\f ]+/g, " ");
-          }
-        } else {
-          node.content = node.content.replace(/\r\n/g, "\n");
-        }
-      } else if (node.type === 3 && !context.options.comments) {
-        removedWhitespace = true;
-        nodes[i] = null;
-      }
-    }
-    if (context.inPre && parent && context.options.isPreTag(parent.tag)) {
-      const first = nodes[0];
-      if (first && first.type === 2) {
-        first.content = first.content.replace(/^\r?\n/, "");
-      }
-    }
-  }
-  return removedWhitespace ? nodes.filter(Boolean) : nodes;
-}
-function pushNode(nodes, node) {
-  if (node.type === 2) {
-    const prev = last(nodes);
-    if (prev && prev.type === 2 && prev.loc.end.offset === node.loc.start.offset) {
-      prev.content += node.content;
-      prev.loc.end = node.loc.end;
-      prev.loc.source += node.loc.source;
-      return;
-    }
-  }
-  nodes.push(node);
-}
-function parseCDATA(context, ancestors) {
-  advanceBy(context, 9);
-  const nodes = parseChildren(context, 3, ancestors);
-  if (context.source.length === 0) {
-    emitError(context, 6);
-  } else {
-    advanceBy(context, 3);
-  }
-  return nodes;
-}
-function parseComment(context) {
-  const start = getCursor(context);
-  let content;
-  const match = /--(\!)?>/.exec(context.source);
-  if (!match) {
-    content = context.source.slice(4);
-    advanceBy(context, context.source.length);
-    emitError(context, 7);
-  } else {
-    if (match.index <= 3) {
-      emitError(context, 0);
-    }
-    if (match[1]) {
-      emitError(context, 10);
-    }
-    content = context.source.slice(4, match.index);
-    const s = context.source.slice(0, match.index);
-    let prevIndex = 1, nestedIndex = 0;
-    while ((nestedIndex = s.indexOf("<!--", prevIndex)) !== -1) {
-      advanceBy(context, nestedIndex - prevIndex + 1);
-      if (nestedIndex + 4 < s.length) {
-        emitError(context, 16);
-      }
-      prevIndex = nestedIndex + 1;
-    }
-    advanceBy(context, match.index + match[0].length - prevIndex + 1);
-  }
-  return {
-    type: 3,
-    content,
-    loc: getSelection(context, start)
-  };
-}
-function parseBogusComment(context) {
-  const start = getCursor(context);
-  const contentStart = context.source[1] === "?" ? 1 : 2;
-  let content;
-  const closeIndex = context.source.indexOf(">");
-  if (closeIndex === -1) {
-    content = context.source.slice(contentStart);
-    advanceBy(context, context.source.length);
-  } else {
-    content = context.source.slice(contentStart, closeIndex);
-    advanceBy(context, closeIndex + 1);
-  }
-  return {
-    type: 3,
-    content,
-    loc: getSelection(context, start)
-  };
-}
-function parseElement(context, ancestors) {
-  const wasInPre = context.inPre;
-  const wasInVPre = context.inVPre;
-  const parent = last(ancestors);
-  const element = parseTag(context, 0 /* Start */, parent);
-  const isPreBoundary = context.inPre && !wasInPre;
-  const isVPreBoundary = context.inVPre && !wasInVPre;
-  if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {
-    if (isPreBoundary) {
-      context.inPre = false;
-    }
-    if (isVPreBoundary) {
-      context.inVPre = false;
-    }
-    return element;
-  }
-  ancestors.push(element);
-  const mode = context.options.getTextMode(element, parent);
-  const children = parseChildren(context, mode, ancestors);
-  ancestors.pop();
-  element.children = children;
-  if (startsWithEndTagOpen(context.source, element.tag)) {
-    parseTag(context, 1 /* End */, parent);
-  } else {
-    emitError(context, 24, 0, element.loc.start);
-    if (context.source.length === 0 && element.tag.toLowerCase() === "script") {
-      const first = children[0];
-      if (first && startsWith(first.loc.source, "<!--")) {
-        emitError(context, 8);
-      }
-    }
-  }
-  element.loc = getSelection(context, element.loc.start);
-  if (isPreBoundary) {
-    context.inPre = false;
-  }
-  if (isVPreBoundary) {
-    context.inVPre = false;
-  }
-  return element;
-}
-const isSpecialTemplateDirective = /* @__PURE__ */ makeMap(
-  `if,else,else-if,for,slot`
-);
-function parseTag(context, type, parent) {
-  const start = getCursor(context);
-  const match = /^<\/?([a-z][^\t\r\n\f />]*)/i.exec(context.source);
-  const tag = match[1];
-  const ns = context.options.getNamespace(tag, parent);
-  advanceBy(context, match[0].length);
-  advanceSpaces(context);
-  const cursor = getCursor(context);
-  const currentSource = context.source;
-  if (context.options.isPreTag(tag)) {
-    context.inPre = true;
-  }
-  let props = parseAttributes(context, type);
-  if (type === 0 /* Start */ && !context.inVPre && props.some((p) => p.type === 7 && p.name === "pre")) {
-    context.inVPre = true;
-    extend(context, cursor);
-    context.source = currentSource;
-    props = parseAttributes(context, type).filter((p) => p.name !== "v-pre");
-  }
-  let isSelfClosing = false;
-  if (context.source.length === 0) {
-    emitError(context, 9);
-  } else {
-    isSelfClosing = startsWith(context.source, "/>");
-    if (type === 1 /* End */ && isSelfClosing) {
-      emitError(context, 4);
-    }
-    advanceBy(context, isSelfClosing ? 2 : 1);
-  }
-  if (type === 1 /* End */) {
-    return;
-  }
-  let tagType = 0;
-  if (!context.inVPre) {
-    if (tag === "slot") {
-      tagType = 2;
-    } else if (tag === "template") {
-      if (props.some(
-        (p) => p.type === 7 && isSpecialTemplateDirective(p.name)
-      )) {
-        tagType = 3;
-      }
-    } else if (isComponent(tag, props, context)) {
-      tagType = 1;
-    }
-  }
-  return {
-    type: 1,
-    ns,
-    tag,
-    tagType,
-    props,
-    isSelfClosing,
-    children: [],
-    loc: getSelection(context, start),
-    codegenNode: void 0
-    // to be created during transform phase
-  };
-}
-function isComponent(tag, props, context) {
-  const options = context.options;
-  if (options.isCustomElement(tag)) {
-    return false;
-  }
-  if (tag === "component" || /^[A-Z]/.test(tag) || isCoreComponent(tag) || options.isBuiltInComponent && options.isBuiltInComponent(tag) || options.isNativeTag && !options.isNativeTag(tag)) {
-    return true;
-  }
-  for (let i = 0; i < props.length; i++) {
-    const p = props[i];
-    if (p.type === 6) {
-      if (p.name === "is" && p.value) {
-        if (p.value.content.startsWith("vue:")) {
-          return true;
-        }
-      }
-    } else {
-      if (p.name === "is") {
-        return true;
-      } else if (
-        // :is on plain element - only treat as component in compat mode
-        p.name === "bind" && isStaticArgOf(p.arg, "is") && false
-      ) {
-        return true;
-      }
-    }
-  }
-}
-function parseAttributes(context, type) {
-  const props = [];
-  const attributeNames = /* @__PURE__ */ new Set();
-  while (context.source.length > 0 && !startsWith(context.source, ">") && !startsWith(context.source, "/>")) {
-    if (startsWith(context.source, "/")) {
-      emitError(context, 22);
-      advanceBy(context, 1);
-      advanceSpaces(context);
-      continue;
-    }
-    if (type === 1 /* End */) {
-      emitError(context, 3);
-    }
-    const attr = parseAttribute(context, attributeNames);
-    if (attr.type === 6 && attr.value && attr.name === "class") {
-      attr.value.content = attr.value.content.replace(/\s+/g, " ").trim();
-    }
-    if (type === 0 /* Start */) {
-      props.push(attr);
-    }
-    if (/^[^\t\r\n\f />]/.test(context.source)) {
-      emitError(context, 15);
-    }
-    advanceSpaces(context);
-  }
-  return props;
-}
-function parseAttribute(context, nameSet) {
-  var _a;
-  const start = getCursor(context);
-  const match = /^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(context.source);
-  const name = match[0];
-  if (nameSet.has(name)) {
-    emitError(context, 2);
-  }
-  nameSet.add(name);
-  if (name[0] === "=") {
-    emitError(context, 19);
-  }
-  {
-    const pattern = /["'<]/g;
-    let m;
-    while (m = pattern.exec(name)) {
-      emitError(
-        context,
-        17,
-        m.index
-      );
-    }
-  }
-  advanceBy(context, name.length);
-  let value = void 0;
-  if (/^[\t\r\n\f ]*=/.test(context.source)) {
-    advanceSpaces(context);
-    advanceBy(context, 1);
-    advanceSpaces(context);
-    value = parseAttributeValue(context);
-    if (!value) {
-      emitError(context, 13);
-    }
-  }
-  const loc = getSelection(context, start);
-  if (!context.inVPre && /^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(name)) {
-    const match2 = /(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(
-      name
-    );
-    let isPropShorthand = startsWith(name, ".");
-    let dirName = match2[1] || (isPropShorthand || startsWith(name, ":") ? "bind" : startsWith(name, "@") ? "on" : "slot");
-    let arg;
-    if (match2[2]) {
-      const isSlot = dirName === "slot";
-      const startOffset = name.lastIndexOf(
-        match2[2],
-        name.length - (((_a = match2[3]) == null ? void 0 : _a.length) || 0)
-      );
-      const loc2 = getSelection(
-        context,
-        getNewPosition(context, start, startOffset),
-        getNewPosition(
-          context,
-          start,
-          startOffset + match2[2].length + (isSlot && match2[3] || "").length
-        )
-      );
-      let content = match2[2];
-      let isStatic = true;
-      if (content.startsWith("[")) {
-        isStatic = false;
-        if (!content.endsWith("]")) {
-          emitError(
-            context,
-            27
-          );
-          content = content.slice(1);
-        } else {
-          content = content.slice(1, content.length - 1);
-        }
-      } else if (isSlot) {
-        content += match2[3] || "";
-      }
-      arg = {
-        type: 4,
-        content,
-        isStatic,
-        constType: isStatic ? 3 : 0,
-        loc: loc2
-      };
-    }
-    if (value && value.isQuoted) {
-      const valueLoc = value.loc;
-      valueLoc.start.offset++;
-      valueLoc.start.column++;
-      valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);
-      valueLoc.source = valueLoc.source.slice(1, -1);
-    }
-    const modifiers = match2[3] ? match2[3].slice(1).split(".") : [];
-    if (isPropShorthand)
-      modifiers.push("prop");
-    return {
-      type: 7,
-      name: dirName,
-      exp: value && {
-        type: 4,
-        content: value.content,
-        isStatic: false,
-        // Treat as non-constant by default. This can be potentially set to
-        // other values by `transformExpression` to make it eligible for hoisting.
-        constType: 0,
-        loc: value.loc
-      },
-      arg,
-      modifiers,
-      loc
-    };
-  }
-  if (!context.inVPre && startsWith(name, "v-")) {
-    emitError(context, 26);
-  }
-  return {
-    type: 6,
-    name,
-    value: value && {
-      type: 2,
-      content: value.content,
-      loc: value.loc
-    },
-    loc
-  };
-}
-function parseAttributeValue(context) {
-  const start = getCursor(context);
-  let content;
-  const quote = context.source[0];
-  const isQuoted = quote === `"` || quote === `'`;
-  if (isQuoted) {
-    advanceBy(context, 1);
-    const endIndex = context.source.indexOf(quote);
-    if (endIndex === -1) {
-      content = parseTextData(
-        context,
-        context.source.length,
-        4
-      );
-    } else {
-      content = parseTextData(context, endIndex, 4);
-      advanceBy(context, 1);
-    }
-  } else {
-    const match = /^[^\t\r\n\f >]+/.exec(context.source);
-    if (!match) {
-      return void 0;
-    }
-    const unexpectedChars = /["'<=`]/g;
-    let m;
-    while (m = unexpectedChars.exec(match[0])) {
-      emitError(
-        context,
-        18,
-        m.index
-      );
-    }
-    content = parseTextData(context, match[0].length, 4);
-  }
-  return { content, isQuoted, loc: getSelection(context, start) };
-}
-function parseInterpolation(context, mode) {
-  const [open, close] = context.options.delimiters;
-  const closeIndex = context.source.indexOf(close, open.length);
-  if (closeIndex === -1) {
-    emitError(context, 25);
-    return void 0;
-  }
-  const start = getCursor(context);
-  advanceBy(context, open.length);
-  const innerStart = getCursor(context);
-  const innerEnd = getCursor(context);
-  const rawContentLength = closeIndex - open.length;
-  const rawContent = context.source.slice(0, rawContentLength);
-  const preTrimContent = parseTextData(context, rawContentLength, mode);
-  const content = preTrimContent.trim();
-  const startOffset = preTrimContent.indexOf(content);
-  if (startOffset > 0) {
-    advancePositionWithMutation(innerStart, rawContent, startOffset);
-  }
-  const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);
-  advancePositionWithMutation(innerEnd, rawContent, endOffset);
-  advanceBy(context, close.length);
-  return {
-    type: 5,
-    content: {
-      type: 4,
-      isStatic: false,
-      // Set `isConstant` to false by default and will decide in transformExpression
-      constType: 0,
-      content,
-      loc: getSelection(context, innerStart, innerEnd)
-    },
-    loc: getSelection(context, start)
-  };
-}
-function parseText(context, mode) {
-  const endTokens = mode === 3 ? ["]]>"] : ["<", context.options.delimiters[0]];
-  let endIndex = context.source.length;
-  for (let i = 0; i < endTokens.length; i++) {
-    const index = context.source.indexOf(endTokens[i], 1);
-    if (index !== -1 && endIndex > index) {
-      endIndex = index;
-    }
-  }
-  const start = getCursor(context);
-  const content = parseTextData(context, endIndex, mode);
-  return {
-    type: 2,
-    content,
-    loc: getSelection(context, start)
-  };
-}
-function parseTextData(context, length, mode) {
-  const rawText = context.source.slice(0, length);
-  advanceBy(context, length);
-  if (mode === 2 || mode === 3 || !rawText.includes("&")) {
-    return rawText;
-  } else {
-    return context.options.decodeEntities(
-      rawText,
-      mode === 4
-    );
-  }
-}
-function getCursor(context) {
-  const { column, line, offset } = context;
-  return { column, line, offset };
-}
-function getSelection(context, start, end) {
-  end = end || getCursor(context);
-  return {
-    start,
-    end,
-    source: context.originalSource.slice(start.offset, end.offset)
-  };
-}
-function last(xs) {
-  return xs[xs.length - 1];
-}
-function startsWith(source, searchString) {
-  return source.startsWith(searchString);
-}
-function advanceBy(context, numberOfCharacters) {
-  const { source } = context;
-  advancePositionWithMutation(context, source, numberOfCharacters);
-  context.source = source.slice(numberOfCharacters);
-}
-function advanceSpaces(context) {
-  const match = /^[\t\r\n\f ]+/.exec(context.source);
-  if (match) {
-    advanceBy(context, match[0].length);
-  }
-}
-function getNewPosition(context, start, numberOfCharacters) {
-  return advancePositionWithClone(
-    start,
-    context.originalSource.slice(start.offset, numberOfCharacters),
-    numberOfCharacters
-  );
-}
-function emitError(context, code, offset, loc = getCursor(context)) {
-  if (offset) {
-    loc.offset += offset;
-    loc.column += offset;
-  }
-  context.options.onError(
-    createCompilerError(code, {
-      start: loc,
-      end: loc,
-      source: ""
-    })
-  );
-}
-function isEnd(context, mode, ancestors) {
-  const s = context.source;
-  switch (mode) {
-    case 0:
-      if (startsWith(s, "</")) {
-        for (let i = ancestors.length - 1; i >= 0; --i) {
-          if (startsWithEndTagOpen(s, ancestors[i].tag)) {
-            return true;
-          }
-        }
-      }
-      break;
-    case 1:
-    case 2: {
-      const parent = last(ancestors);
-      if (parent && startsWithEndTagOpen(s, parent.tag)) {
-        return true;
-      }
-      break;
-    }
-    case 3:
-      if (startsWith(s, "]]>")) {
-        return true;
-      }
-      break;
-  }
-  return !s;
-}
-function startsWithEndTagOpen(source, tag) {
-  return startsWith(source, "</") && source.slice(2, 2 + tag.length).toLowerCase() === tag.toLowerCase() && /[\t\r\n\f />]/.test(source[2 + tag.length] || ">");
-}
-
-function hoistStatic(root, context) {
-  walk(
-    root,
-    context,
-    // Root node is unfortunately non-hoistable due to potential parent
-    // fallthrough attributes.
-    isSingleElementRoot(root, root.children[0])
-  );
-}
-function isSingleElementRoot(root, child) {
-  const { children } = root;
-  return children.length === 1 && child.type === 1 && !isSlotOutlet(child);
-}
-function walk(node, context, doNotHoistNode = false) {
-  const { children } = node;
-  const originalCount = children.length;
-  let hoistedCount = 0;
-  for (let i = 0; i < children.length; i++) {
-    const child = children[i];
-    if (child.type === 1 && child.tagType === 0) {
-      const constantType = doNotHoistNode ? 0 : getConstantType(child, context);
-      if (constantType > 0) {
-        if (constantType >= 2) {
-          child.codegenNode.patchFlag = -1 + (` /* HOISTED */` );
-          child.codegenNode = context.hoist(child.codegenNode);
-          hoistedCount++;
-          continue;
-        }
-      } else {
-        const codegenNode = child.codegenNode;
-        if (codegenNode.type === 13) {
-          const flag = getPatchFlag(codegenNode);
-          if ((!flag || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) {
-            const props = getNodeProps(child);
-            if (props) {
-              codegenNode.props = context.hoist(props);
-            }
-          }
-          if (codegenNode.dynamicProps) {
-            codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);
-          }
-        }
-      }
-    }
-    if (child.type === 1) {
-      const isComponent = child.tagType === 1;
-      if (isComponent) {
-        context.scopes.vSlot++;
-      }
-      walk(child, context);
-      if (isComponent) {
-        context.scopes.vSlot--;
-      }
-    } else if (child.type === 11) {
-      walk(child, context, child.children.length === 1);
-    } else if (child.type === 9) {
-      for (let i2 = 0; i2 < child.branches.length; i2++) {
-        walk(
-          child.branches[i2],
-          context,
-          child.branches[i2].children.length === 1
-        );
-      }
-    }
-  }
-  if (hoistedCount && context.transformHoist) {
-    context.transformHoist(children, context, node);
-  }
-  if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && isArray(node.codegenNode.children)) {
-    node.codegenNode.children = context.hoist(
-      createArrayExpression(node.codegenNode.children)
-    );
-  }
-}
-function getConstantType(node, context) {
-  const { constantCache } = context;
-  switch (node.type) {
-    case 1:
-      if (node.tagType !== 0) {
-        return 0;
-      }
-      const cached = constantCache.get(node);
-      if (cached !== void 0) {
-        return cached;
-      }
-      const codegenNode = node.codegenNode;
-      if (codegenNode.type !== 13) {
-        return 0;
-      }
-      if (codegenNode.isBlock && node.tag !== "svg" && node.tag !== "foreignObject") {
-        return 0;
-      }
-      const flag = getPatchFlag(codegenNode);
-      if (!flag) {
-        let returnType2 = 3;
-        const generatedPropsType = getGeneratedPropsConstantType(node, context);
-        if (generatedPropsType === 0) {
-          constantCache.set(node, 0);
-          return 0;
-        }
-        if (generatedPropsType < returnType2) {
-          returnType2 = generatedPropsType;
-        }
-        for (let i = 0; i < node.children.length; i++) {
-          const childType = getConstantType(node.children[i], context);
-          if (childType === 0) {
-            constantCache.set(node, 0);
-            return 0;
-          }
-          if (childType < returnType2) {
-            returnType2 = childType;
-          }
-        }
-        if (returnType2 > 1) {
-          for (let i = 0; i < node.props.length; i++) {
-            const p = node.props[i];
-            if (p.type === 7 && p.name === "bind" && p.exp) {
-              const expType = getConstantType(p.exp, context);
-              if (expType === 0) {
-                constantCache.set(node, 0);
-                return 0;
-              }
-              if (expType < returnType2) {
-                returnType2 = expType;
-              }
-            }
-          }
-        }
-        if (codegenNode.isBlock) {
-          for (let i = 0; i < node.props.length; i++) {
-            const p = node.props[i];
-            if (p.type === 7) {
-              constantCache.set(node, 0);
-              return 0;
-            }
-          }
-          context.removeHelper(OPEN_BLOCK);
-          context.removeHelper(
-            getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)
-          );
-          codegenNode.isBlock = false;
-          context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));
-        }
-        constantCache.set(node, returnType2);
-        return returnType2;
-      } else {
-        constantCache.set(node, 0);
-        return 0;
-      }
-    case 2:
-    case 3:
-      return 3;
-    case 9:
-    case 11:
-    case 10:
-      return 0;
-    case 5:
-    case 12:
-      return getConstantType(node.content, context);
-    case 4:
-      return node.constType;
-    case 8:
-      let returnType = 3;
-      for (let i = 0; i < node.children.length; i++) {
-        const child = node.children[i];
-        if (isString(child) || isSymbol(child)) {
-          continue;
-        }
-        const childType = getConstantType(child, context);
-        if (childType === 0) {
-          return 0;
-        } else if (childType < returnType) {
-          returnType = childType;
-        }
-      }
-      return returnType;
-    default:
-      return 0;
-  }
-}
-const allowHoistedHelperSet = /* @__PURE__ */ new Set([
-  NORMALIZE_CLASS,
-  NORMALIZE_STYLE,
-  NORMALIZE_PROPS,
-  GUARD_REACTIVE_PROPS
-]);
-function getConstantTypeOfHelperCall(value, context) {
-  if (value.type === 14 && !isString(value.callee) && allowHoistedHelperSet.has(value.callee)) {
-    const arg = value.arguments[0];
-    if (arg.type === 4) {
-      return getConstantType(arg, context);
-    } else if (arg.type === 14) {
-      return getConstantTypeOfHelperCall(arg, context);
-    }
-  }
-  return 0;
-}
-function getGeneratedPropsConstantType(node, context) {
-  let returnType = 3;
-  const props = getNodeProps(node);
-  if (props && props.type === 15) {
-    const { properties } = props;
-    for (let i = 0; i < properties.length; i++) {
-      const { key, value } = properties[i];
-      const keyType = getConstantType(key, context);
-      if (keyType === 0) {
-        return keyType;
-      }
-      if (keyType < returnType) {
-        returnType = keyType;
-      }
-      let valueType;
-      if (value.type === 4) {
-        valueType = getConstantType(value, context);
-      } else if (value.type === 14) {
-        valueType = getConstantTypeOfHelperCall(value, context);
-      } else {
-        valueType = 0;
-      }
-      if (valueType === 0) {
-        return valueType;
-      }
-      if (valueType < returnType) {
-        returnType = valueType;
-      }
-    }
-  }
-  return returnType;
-}
-function getNodeProps(node) {
-  const codegenNode = node.codegenNode;
-  if (codegenNode.type === 13) {
-    return codegenNode.props;
-  }
-}
-function getPatchFlag(node) {
-  const flag = node.patchFlag;
-  return flag ? parseInt(flag, 10) : void 0;
-}
-
-function createTransformContext(root, {
-  filename = "",
-  prefixIdentifiers = false,
-  hoistStatic: hoistStatic2 = false,
-  cacheHandlers = false,
-  nodeTransforms = [],
-  directiveTransforms = {},
-  transformHoist = null,
-  isBuiltInComponent = NOOP,
-  isCustomElement = NOOP,
-  expressionPlugins = [],
-  scopeId = null,
-  slotted = true,
-  ssr = false,
-  inSSR = false,
-  ssrCssVars = ``,
-  bindingMetadata = EMPTY_OBJ,
-  inline = false,
-  isTS = false,
-  onError = defaultOnError,
-  onWarn = defaultOnWarn,
-  compatConfig
-}) {
-  const nameMatch = filename.replace(/\?.*$/, "").match(/([^/\\]+)\.\w+$/);
-  const context = {
-    // options
-    selfName: nameMatch && capitalize(camelize(nameMatch[1])),
-    prefixIdentifiers,
-    hoistStatic: hoistStatic2,
-    cacheHandlers,
-    nodeTransforms,
-    directiveTransforms,
-    transformHoist,
-    isBuiltInComponent,
-    isCustomElement,
-    expressionPlugins,
-    scopeId,
-    slotted,
-    ssr,
-    inSSR,
-    ssrCssVars,
-    bindingMetadata,
-    inline,
-    isTS,
-    onError,
-    onWarn,
-    compatConfig,
-    // state
-    root,
-    helpers: /* @__PURE__ */ new Map(),
-    components: /* @__PURE__ */ new Set(),
-    directives: /* @__PURE__ */ new Set(),
-    hoists: [],
-    imports: [],
-    constantCache: /* @__PURE__ */ new WeakMap(),
-    temps: 0,
-    cached: 0,
-    identifiers: /* @__PURE__ */ Object.create(null),
-    scopes: {
-      vFor: 0,
-      vSlot: 0,
-      vPre: 0,
-      vOnce: 0
-    },
-    parent: null,
-    currentNode: root,
-    childIndex: 0,
-    inVOnce: false,
-    // methods
-    helper(name) {
-      const count = context.helpers.get(name) || 0;
-      context.helpers.set(name, count + 1);
-      return name;
-    },
-    removeHelper(name) {
-      const count = context.helpers.get(name);
-      if (count) {
-        const currentCount = count - 1;
-        if (!currentCount) {
-          context.helpers.delete(name);
-        } else {
-          context.helpers.set(name, currentCount);
-        }
-      }
-    },
-    helperString(name) {
-      return `_${helperNameMap[context.helper(name)]}`;
-    },
-    replaceNode(node) {
-      {
-        if (!context.currentNode) {
-          throw new Error(`Node being replaced is already removed.`);
-        }
-        if (!context.parent) {
-          throw new Error(`Cannot replace root node.`);
-        }
-      }
-      context.parent.children[context.childIndex] = context.currentNode = node;
-    },
-    removeNode(node) {
-      if (!context.parent) {
-        throw new Error(`Cannot remove root node.`);
-      }
-      const list = context.parent.children;
-      const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1;
-      if (removalIndex < 0) {
-        throw new Error(`node being removed is not a child of current parent`);
-      }
-      if (!node || node === context.currentNode) {
-        context.currentNode = null;
-        context.onNodeRemoved();
-      } else {
-        if (context.childIndex > removalIndex) {
-          context.childIndex--;
-          context.onNodeRemoved();
-        }
-      }
-      context.parent.children.splice(removalIndex, 1);
-    },
-    onNodeRemoved: () => {
-    },
-    addIdentifiers(exp) {
-    },
-    removeIdentifiers(exp) {
-    },
-    hoist(exp) {
-      if (isString(exp))
-        exp = createSimpleExpression(exp);
-      context.hoists.push(exp);
-      const identifier = createSimpleExpression(
-        `_hoisted_${context.hoists.length}`,
-        false,
-        exp.loc,
-        2
-      );
-      identifier.hoisted = exp;
-      return identifier;
-    },
-    cache(exp, isVNode = false) {
-      return createCacheExpression(context.cached++, exp, isVNode);
-    }
-  };
-  return context;
-}
-function transform(root, options) {
-  const context = createTransformContext(root, options);
-  traverseNode(root, context);
-  if (options.hoistStatic) {
-    hoistStatic(root, context);
-  }
-  if (!options.ssr) {
-    createRootCodegen(root, context);
-  }
-  root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]);
-  root.components = [...context.components];
-  root.directives = [...context.directives];
-  root.imports = context.imports;
-  root.hoists = context.hoists;
-  root.temps = context.temps;
-  root.cached = context.cached;
-}
-function createRootCodegen(root, context) {
-  const { helper } = context;
-  const { children } = root;
-  if (children.length === 1) {
-    const child = children[0];
-    if (isSingleElementRoot(root, child) && child.codegenNode) {
-      const codegenNode = child.codegenNode;
-      if (codegenNode.type === 13) {
-        convertToBlock(codegenNode, context);
-      }
-      root.codegenNode = codegenNode;
-    } else {
-      root.codegenNode = child;
-    }
-  } else if (children.length > 1) {
-    let patchFlag = 64;
-    let patchFlagText = PatchFlagNames[64];
-    if (children.filter((c) => c.type !== 3).length === 1) {
-      patchFlag |= 2048;
-      patchFlagText += `, ${PatchFlagNames[2048]}`;
-    }
-    root.codegenNode = createVNodeCall(
-      context,
-      helper(FRAGMENT),
-      void 0,
-      root.children,
-      patchFlag + (` /* ${patchFlagText} */` ),
-      void 0,
-      void 0,
-      true,
-      void 0,
-      false
-      /* isComponent */
-    );
-  } else ;
-}
-function traverseChildren(parent, context) {
-  let i = 0;
-  const nodeRemoved = () => {
-    i--;
-  };
-  for (; i < parent.children.length; i++) {
-    const child = parent.children[i];
-    if (isString(child))
-      continue;
-    context.parent = parent;
-    context.childIndex = i;
-    context.onNodeRemoved = nodeRemoved;
-    traverseNode(child, context);
-  }
-}
-function traverseNode(node, context) {
-  context.currentNode = node;
-  const { nodeTransforms } = context;
-  const exitFns = [];
-  for (let i2 = 0; i2 < nodeTransforms.length; i2++) {
-    const onExit = nodeTransforms[i2](node, context);
-    if (onExit) {
-      if (isArray(onExit)) {
-        exitFns.push(...onExit);
-      } else {
-        exitFns.push(onExit);
-      }
-    }
-    if (!context.currentNode) {
-      return;
-    } else {
-      node = context.currentNode;
-    }
-  }
-  switch (node.type) {
-    case 3:
-      if (!context.ssr) {
-        context.helper(CREATE_COMMENT);
-      }
-      break;
-    case 5:
-      if (!context.ssr) {
-        context.helper(TO_DISPLAY_STRING);
-      }
-      break;
-    case 9:
-      for (let i2 = 0; i2 < node.branches.length; i2++) {
-        traverseNode(node.branches[i2], context);
-      }
-      break;
-    case 10:
-    case 11:
-    case 1:
-    case 0:
-      traverseChildren(node, context);
-      break;
-  }
-  context.currentNode = node;
-  let i = exitFns.length;
-  while (i--) {
-    exitFns[i]();
-  }
-}
-function createStructuralDirectiveTransform(name, fn) {
-  const matches = isString(name) ? (n) => n === name : (n) => name.test(n);
-  return (node, context) => {
-    if (node.type === 1) {
-      const { props } = node;
-      if (node.tagType === 3 && props.some(isVSlot)) {
-        return;
-      }
-      const exitFns = [];
-      for (let i = 0; i < props.length; i++) {
-        const prop = props[i];
-        if (prop.type === 7 && matches(prop.name)) {
-          props.splice(i, 1);
-          i--;
-          const onExit = fn(node, prop, context);
-          if (onExit)
-            exitFns.push(onExit);
-        }
-      }
-      return exitFns;
-    }
-  };
-}
-
-const PURE_ANNOTATION = `/*#__PURE__*/`;
-const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;
-function createCodegenContext(ast, {
-  mode = "function",
-  prefixIdentifiers = mode === "module",
-  sourceMap = false,
-  filename = `template.vue.html`,
-  scopeId = null,
-  optimizeImports = false,
-  runtimeGlobalName = `Vue`,
-  runtimeModuleName = `vue`,
-  ssrRuntimeModuleName = "vue/server-renderer",
-  ssr = false,
-  isTS = false,
-  inSSR = false
-}) {
-  const context = {
-    mode,
-    prefixIdentifiers,
-    sourceMap,
-    filename,
-    scopeId,
-    optimizeImports,
-    runtimeGlobalName,
-    runtimeModuleName,
-    ssrRuntimeModuleName,
-    ssr,
-    isTS,
-    inSSR,
-    source: ast.loc.source,
-    code: ``,
-    column: 1,
-    line: 1,
-    offset: 0,
-    indentLevel: 0,
-    pure: false,
-    map: void 0,
-    helper(key) {
-      return `_${helperNameMap[key]}`;
-    },
-    push(code, node) {
-      context.code += code;
-    },
-    indent() {
-      newline(++context.indentLevel);
-    },
-    deindent(withoutNewLine = false) {
-      if (withoutNewLine) {
-        --context.indentLevel;
-      } else {
-        newline(--context.indentLevel);
-      }
-    },
-    newline() {
-      newline(context.indentLevel);
-    }
-  };
-  function newline(n) {
-    context.push("\n" + `  `.repeat(n));
-  }
-  return context;
-}
-function generate(ast, options = {}) {
-  const context = createCodegenContext(ast, options);
-  if (options.onContextCreated)
-    options.onContextCreated(context);
-  const {
-    mode,
-    push,
-    prefixIdentifiers,
-    indent,
-    deindent,
-    newline,
-    scopeId,
-    ssr
-  } = context;
-  const helpers = Array.from(ast.helpers);
-  const hasHelpers = helpers.length > 0;
-  const useWithBlock = !prefixIdentifiers && mode !== "module";
-  const isSetupInlined = false;
-  const preambleContext = isSetupInlined ? createCodegenContext(ast, options) : context;
-  {
-    genFunctionPreamble(ast, preambleContext);
-  }
-  const functionName = ssr ? `ssrRender` : `render`;
-  const args = ssr ? ["_ctx", "_push", "_parent", "_attrs"] : ["_ctx", "_cache"];
-  const signature = args.join(", ");
-  {
-    push(`function ${functionName}(${signature}) {`);
-  }
-  indent();
-  if (useWithBlock) {
-    push(`with (_ctx) {`);
-    indent();
-    if (hasHelpers) {
-      push(`const { ${helpers.map(aliasHelper).join(", ")} } = _Vue`);
-      push(`
-`);
-      newline();
-    }
-  }
-  if (ast.components.length) {
-    genAssets(ast.components, "component", context);
-    if (ast.directives.length || ast.temps > 0) {
-      newline();
-    }
-  }
-  if (ast.directives.length) {
-    genAssets(ast.directives, "directive", context);
-    if (ast.temps > 0) {
-      newline();
-    }
-  }
-  if (ast.temps > 0) {
-    push(`let `);
-    for (let i = 0; i < ast.temps; i++) {
-      push(`${i > 0 ? `, ` : ``}_temp${i}`);
-    }
-  }
-  if (ast.components.length || ast.directives.length || ast.temps) {
-    push(`
-`);
-    newline();
-  }
-  if (!ssr) {
-    push(`return `);
-  }
-  if (ast.codegenNode) {
-    genNode(ast.codegenNode, context);
-  } else {
-    push(`null`);
-  }
-  if (useWithBlock) {
-    deindent();
-    push(`}`);
-  }
-  deindent();
-  push(`}`);
-  return {
-    ast,
-    code: context.code,
-    preamble: isSetupInlined ? preambleContext.code : ``,
-    // SourceMapGenerator does have toJSON() method but it's not in the types
-    map: context.map ? context.map.toJSON() : void 0
-  };
-}
-function genFunctionPreamble(ast, context) {
-  const {
-    ssr,
-    prefixIdentifiers,
-    push,
-    newline,
-    runtimeModuleName,
-    runtimeGlobalName,
-    ssrRuntimeModuleName
-  } = context;
-  const VueBinding = runtimeGlobalName;
-  const helpers = Array.from(ast.helpers);
-  if (helpers.length > 0) {
-    {
-      push(`const _Vue = ${VueBinding}
-`);
-      if (ast.hoists.length) {
-        const staticHelpers = [
-          CREATE_VNODE,
-          CREATE_ELEMENT_VNODE,
-          CREATE_COMMENT,
-          CREATE_TEXT,
-          CREATE_STATIC
-        ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(", ");
-        push(`const { ${staticHelpers} } = _Vue
-`);
-      }
-    }
-  }
-  genHoists(ast.hoists, context);
-  newline();
-  push(`return `);
-}
-function genAssets(assets, type, { helper, push, newline, isTS }) {
-  const resolver = helper(
-    type === "component" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE
-  );
-  for (let i = 0; i < assets.length; i++) {
-    let id = assets[i];
-    const maybeSelfReference = id.endsWith("__self");
-    if (maybeSelfReference) {
-      id = id.slice(0, -6);
-    }
-    push(
-      `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`
-    );
-    if (i < assets.length - 1) {
-      newline();
-    }
-  }
-}
-function genHoists(hoists, context) {
-  if (!hoists.length) {
-    return;
-  }
-  context.pure = true;
-  const { push, newline, helper, scopeId, mode } = context;
-  newline();
-  for (let i = 0; i < hoists.length; i++) {
-    const exp = hoists[i];
-    if (exp) {
-      push(
-        `const _hoisted_${i + 1} = ${``}`
-      );
-      genNode(exp, context);
-      newline();
-    }
-  }
-  context.pure = false;
-}
-function isText(n) {
-  return isString(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8;
-}
-function genNodeListAsArray(nodes, context) {
-  const multilines = nodes.length > 3 || nodes.some((n) => isArray(n) || !isText(n));
-  context.push(`[`);
-  multilines && context.indent();
-  genNodeList(nodes, context, multilines);
-  multilines && context.deindent();
-  context.push(`]`);
-}
-function genNodeList(nodes, context, multilines = false, comma = true) {
-  const { push, newline } = context;
-  for (let i = 0; i < nodes.length; i++) {
-    const node = nodes[i];
-    if (isString(node)) {
-      push(node);
-    } else if (isArray(node)) {
-      genNodeListAsArray(node, context);
-    } else {
-      genNode(node, context);
-    }
-    if (i < nodes.length - 1) {
-      if (multilines) {
-        comma && push(",");
-        newline();
-      } else {
-        comma && push(", ");
-      }
-    }
-  }
-}
-function genNode(node, context) {
-  if (isString(node)) {
-    context.push(node);
-    return;
-  }
-  if (isSymbol(node)) {
-    context.push(context.helper(node));
-    return;
-  }
-  switch (node.type) {
-    case 1:
-    case 9:
-    case 11:
-      assert(
-        node.codegenNode != null,
-        `Codegen node is missing for element/if/for node. Apply appropriate transforms first.`
-      );
-      genNode(node.codegenNode, context);
-      break;
-    case 2:
-      genText(node, context);
-      break;
-    case 4:
-      genExpression(node, context);
-      break;
-    case 5:
-      genInterpolation(node, context);
-      break;
-    case 12:
-      genNode(node.codegenNode, context);
-      break;
-    case 8:
-      genCompoundExpression(node, context);
-      break;
-    case 3:
-      genComment(node, context);
-      break;
-    case 13:
-      genVNodeCall(node, context);
-      break;
-    case 14:
-      genCallExpression(node, context);
-      break;
-    case 15:
-      genObjectExpression(node, context);
-      break;
-    case 17:
-      genArrayExpression(node, context);
-      break;
-    case 18:
-      genFunctionExpression(node, context);
-      break;
-    case 19:
-      genConditionalExpression(node, context);
-      break;
-    case 20:
-      genCacheExpression(node, context);
-      break;
-    case 21:
-      genNodeList(node.body, context, true, false);
-      break;
-    case 22:
-      break;
-    case 23:
-      break;
-    case 24:
-      break;
-    case 25:
-      break;
-    case 26:
-      break;
-    case 10:
-      break;
-    default:
-      {
-        assert(false, `unhandled codegen node type: ${node.type}`);
-        const exhaustiveCheck = node;
-        return exhaustiveCheck;
-      }
-  }
-}
-function genText(node, context) {
-  context.push(JSON.stringify(node.content), node);
-}
-function genExpression(node, context) {
-  const { content, isStatic } = node;
-  context.push(isStatic ? JSON.stringify(content) : content, node);
-}
-function genInterpolation(node, context) {
-  const { push, helper, pure } = context;
-  if (pure)
-    push(PURE_ANNOTATION);
-  push(`${helper(TO_DISPLAY_STRING)}(`);
-  genNode(node.content, context);
-  push(`)`);
-}
-function genCompoundExpression(node, context) {
-  for (let i = 0; i < node.children.length; i++) {
-    const child = node.children[i];
-    if (isString(child)) {
-      context.push(child);
-    } else {
-      genNode(child, context);
-    }
-  }
-}
-function genExpressionAsPropertyKey(node, context) {
-  const { push } = context;
-  if (node.type === 8) {
-    push(`[`);
-    genCompoundExpression(node, context);
-    push(`]`);
-  } else if (node.isStatic) {
-    const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content);
-    push(text, node);
-  } else {
-    push(`[${node.content}]`, node);
-  }
-}
-function genComment(node, context) {
-  const { push, helper, pure } = context;
-  if (pure) {
-    push(PURE_ANNOTATION);
-  }
-  push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);
-}
-function genVNodeCall(node, context) {
-  const { push, helper, pure } = context;
-  const {
-    tag,
-    props,
-    children,
-    patchFlag,
-    dynamicProps,
-    directives,
-    isBlock,
-    disableTracking,
-    isComponent
-  } = node;
-  if (directives) {
-    push(helper(WITH_DIRECTIVES) + `(`);
-  }
-  if (isBlock) {
-    push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);
-  }
-  if (pure) {
-    push(PURE_ANNOTATION);
-  }
-  const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent);
-  push(helper(callHelper) + `(`, node);
-  genNodeList(
-    genNullableArgs([tag, props, children, patchFlag, dynamicProps]),
-    context
-  );
-  push(`)`);
-  if (isBlock) {
-    push(`)`);
-  }
-  if (directives) {
-    push(`, `);
-    genNode(directives, context);
-    push(`)`);
-  }
-}
-function genNullableArgs(args) {
-  let i = args.length;
-  while (i--) {
-    if (args[i] != null)
-      break;
-  }
-  return args.slice(0, i + 1).map((arg) => arg || `null`);
-}
-function genCallExpression(node, context) {
-  const { push, helper, pure } = context;
-  const callee = isString(node.callee) ? node.callee : helper(node.callee);
-  if (pure) {
-    push(PURE_ANNOTATION);
-  }
-  push(callee + `(`, node);
-  genNodeList(node.arguments, context);
-  push(`)`);
-}
-function genObjectExpression(node, context) {
-  const { push, indent, deindent, newline } = context;
-  const { properties } = node;
-  if (!properties.length) {
-    push(`{}`, node);
-    return;
-  }
-  const multilines = properties.length > 1 || properties.some((p) => p.value.type !== 4);
-  push(multilines ? `{` : `{ `);
-  multilines && indent();
-  for (let i = 0; i < properties.length; i++) {
-    const { key, value } = properties[i];
-    genExpressionAsPropertyKey(key, context);
-    push(`: `);
-    genNode(value, context);
-    if (i < properties.length - 1) {
-      push(`,`);
-      newline();
-    }
-  }
-  multilines && deindent();
-  push(multilines ? `}` : ` }`);
-}
-function genArrayExpression(node, context) {
-  genNodeListAsArray(node.elements, context);
-}
-function genFunctionExpression(node, context) {
-  const { push, indent, deindent } = context;
-  const { params, returns, body, newline, isSlot } = node;
-  if (isSlot) {
-    push(`_${helperNameMap[WITH_CTX]}(`);
-  }
-  push(`(`, node);
-  if (isArray(params)) {
-    genNodeList(params, context);
-  } else if (params) {
-    genNode(params, context);
-  }
-  push(`) => `);
-  if (newline || body) {
-    push(`{`);
-    indent();
-  }
-  if (returns) {
-    if (newline) {
-      push(`return `);
-    }
-    if (isArray(returns)) {
-      genNodeListAsArray(returns, context);
-    } else {
-      genNode(returns, context);
-    }
-  } else if (body) {
-    genNode(body, context);
-  }
-  if (newline || body) {
-    deindent();
-    push(`}`);
-  }
-  if (isSlot) {
-    push(`)`);
-  }
-}
-function genConditionalExpression(node, context) {
-  const { test, consequent, alternate, newline: needNewline } = node;
-  const { push, indent, deindent, newline } = context;
-  if (test.type === 4) {
-    const needsParens = !isSimpleIdentifier(test.content);
-    needsParens && push(`(`);
-    genExpression(test, context);
-    needsParens && push(`)`);
-  } else {
-    push(`(`);
-    genNode(test, context);
-    push(`)`);
-  }
-  needNewline && indent();
-  context.indentLevel++;
-  needNewline || push(` `);
-  push(`? `);
-  genNode(consequent, context);
-  context.indentLevel--;
-  needNewline && newline();
-  needNewline || push(` `);
-  push(`: `);
-  const isNested = alternate.type === 19;
-  if (!isNested) {
-    context.indentLevel++;
-  }
-  genNode(alternate, context);
-  if (!isNested) {
-    context.indentLevel--;
-  }
-  needNewline && deindent(
-    true
-    /* without newline */
-  );
-}
-function genCacheExpression(node, context) {
-  const { push, helper, indent, deindent, newline } = context;
-  push(`_cache[${node.index}] || (`);
-  if (node.isVNode) {
-    indent();
-    push(`${helper(SET_BLOCK_TRACKING)}(-1),`);
-    newline();
-  }
-  push(`_cache[${node.index}] = `);
-  genNode(node.value, context);
-  if (node.isVNode) {
-    push(`,`);
-    newline();
-    push(`${helper(SET_BLOCK_TRACKING)}(1),`);
-    newline();
-    push(`_cache[${node.index}]`);
-    deindent();
-  }
-  push(`)`);
-}
-
-const prohibitedKeywordRE = new RegExp(
-  "\\b" + "arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b") + "\\b"
-);
-const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
-function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {
-  const exp = node.content;
-  if (!exp.trim()) {
-    return;
-  }
-  try {
-    new Function(
-      asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`
-    );
-  } catch (e) {
-    let message = e.message;
-    const keywordMatch = exp.replace(stripStringRE, "").match(prohibitedKeywordRE);
-    if (keywordMatch) {
-      message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`;
-    }
-    context.onError(
-      createCompilerError(
-        45,
-        node.loc,
-        void 0,
-        message
-      )
-    );
-  }
-}
-
-const transformExpression = (node, context) => {
-  if (node.type === 5) {
-    node.content = processExpression(
-      node.content,
-      context
-    );
-  } else if (node.type === 1) {
-    for (let i = 0; i < node.props.length; i++) {
-      const dir = node.props[i];
-      if (dir.type === 7 && dir.name !== "for") {
-        const exp = dir.exp;
-        const arg = dir.arg;
-        if (exp && exp.type === 4 && !(dir.name === "on" && arg)) {
-          dir.exp = processExpression(
-            exp,
-            context,
-            // slot args must be processed as function params
-            dir.name === "slot"
-          );
-        }
-        if (arg && arg.type === 4 && !arg.isStatic) {
-          dir.arg = processExpression(arg, context);
-        }
-      }
-    }
-  }
-};
-function processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) {
-  {
-    {
-      validateBrowserExpression(node, context, asParams, asRawStatements);
-    }
-    return node;
-  }
-}
-
-const transformIf = createStructuralDirectiveTransform(
-  /^(if|else|else-if)$/,
-  (node, dir, context) => {
-    return processIf(node, dir, context, (ifNode, branch, isRoot) => {
-      const siblings = context.parent.children;
-      let i = siblings.indexOf(ifNode);
-      let key = 0;
-      while (i-- >= 0) {
-        const sibling = siblings[i];
-        if (sibling && sibling.type === 9) {
-          key += sibling.branches.length;
-        }
-      }
-      return () => {
-        if (isRoot) {
-          ifNode.codegenNode = createCodegenNodeForBranch(
-            branch,
-            key,
-            context
-          );
-        } else {
-          const parentCondition = getParentCondition(ifNode.codegenNode);
-          parentCondition.alternate = createCodegenNodeForBranch(
-            branch,
-            key + ifNode.branches.length - 1,
-            context
-          );
-        }
-      };
-    });
-  }
-);
-function processIf(node, dir, context, processCodegen) {
-  if (dir.name !== "else" && (!dir.exp || !dir.exp.content.trim())) {
-    const loc = dir.exp ? dir.exp.loc : node.loc;
-    context.onError(
-      createCompilerError(28, dir.loc)
-    );
-    dir.exp = createSimpleExpression(`true`, false, loc);
-  }
-  if (dir.exp) {
-    validateBrowserExpression(dir.exp, context);
-  }
-  if (dir.name === "if") {
-    const branch = createIfBranch(node, dir);
-    const ifNode = {
-      type: 9,
-      loc: node.loc,
-      branches: [branch]
-    };
-    context.replaceNode(ifNode);
-    if (processCodegen) {
-      return processCodegen(ifNode, branch, true);
-    }
-  } else {
-    const siblings = context.parent.children;
-    const comments = [];
-    let i = siblings.indexOf(node);
-    while (i-- >= -1) {
-      const sibling = siblings[i];
-      if (sibling && sibling.type === 3) {
-        context.removeNode(sibling);
-        comments.unshift(sibling);
-        continue;
-      }
-      if (sibling && sibling.type === 2 && !sibling.content.trim().length) {
-        context.removeNode(sibling);
-        continue;
-      }
-      if (sibling && sibling.type === 9) {
-        if (dir.name === "else-if" && sibling.branches[sibling.branches.length - 1].condition === void 0) {
-          context.onError(
-            createCompilerError(30, node.loc)
-          );
-        }
-        context.removeNode();
-        const branch = createIfBranch(node, dir);
-        if (comments.length && // #3619 ignore comments if the v-if is direct child of <transition>
-        !(context.parent && context.parent.type === 1 && isBuiltInType(context.parent.tag, "transition"))) {
-          branch.children = [...comments, ...branch.children];
-        }
-        {
-          const key = branch.userKey;
-          if (key) {
-            sibling.branches.forEach(({ userKey }) => {
-              if (isSameKey(userKey, key)) {
-                context.onError(
-                  createCompilerError(
-                    29,
-                    branch.userKey.loc
-                  )
-                );
-              }
-            });
-          }
-        }
-        sibling.branches.push(branch);
-        const onExit = processCodegen && processCodegen(sibling, branch, false);
-        traverseNode(branch, context);
-        if (onExit)
-          onExit();
-        context.currentNode = null;
-      } else {
-        context.onError(
-          createCompilerError(30, node.loc)
-        );
-      }
-      break;
-    }
-  }
-}
-function createIfBranch(node, dir) {
-  const isTemplateIf = node.tagType === 3;
-  return {
-    type: 10,
-    loc: node.loc,
-    condition: dir.name === "else" ? void 0 : dir.exp,
-    children: isTemplateIf && !findDir(node, "for") ? node.children : [node],
-    userKey: findProp(node, `key`),
-    isTemplateIf
-  };
-}
-function createCodegenNodeForBranch(branch, keyIndex, context) {
-  if (branch.condition) {
-    return createConditionalExpression(
-      branch.condition,
-      createChildrenCodegenNode(branch, keyIndex, context),
-      // make sure to pass in asBlock: true so that the comment node call
-      // closes the current block.
-      createCallExpression(context.helper(CREATE_COMMENT), [
-        '"v-if"' ,
-        "true"
-      ])
-    );
-  } else {
-    return createChildrenCodegenNode(branch, keyIndex, context);
-  }
-}
-function createChildrenCodegenNode(branch, keyIndex, context) {
-  const { helper } = context;
-  const keyProperty = createObjectProperty(
-    `key`,
-    createSimpleExpression(
-      `${keyIndex}`,
-      false,
-      locStub,
-      2
-    )
-  );
-  const { children } = branch;
-  const firstChild = children[0];
-  const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1;
-  if (needFragmentWrapper) {
-    if (children.length === 1 && firstChild.type === 11) {
-      const vnodeCall = firstChild.codegenNode;
-      injectProp(vnodeCall, keyProperty, context);
-      return vnodeCall;
-    } else {
-      let patchFlag = 64;
-      let patchFlagText = PatchFlagNames[64];
-      if (!branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) {
-        patchFlag |= 2048;
-        patchFlagText += `, ${PatchFlagNames[2048]}`;
-      }
-      return createVNodeCall(
-        context,
-        helper(FRAGMENT),
-        createObjectExpression([keyProperty]),
-        children,
-        patchFlag + (` /* ${patchFlagText} */` ),
-        void 0,
-        void 0,
-        true,
-        false,
-        false,
-        branch.loc
-      );
-    }
-  } else {
-    const ret = firstChild.codegenNode;
-    const vnodeCall = getMemoedVNodeCall(ret);
-    if (vnodeCall.type === 13) {
-      convertToBlock(vnodeCall, context);
-    }
-    injectProp(vnodeCall, keyProperty, context);
-    return ret;
-  }
-}
-function isSameKey(a, b) {
-  if (!a || a.type !== b.type) {
-    return false;
-  }
-  if (a.type === 6) {
-    if (a.value.content !== b.value.content) {
-      return false;
-    }
-  } else {
-    const exp = a.exp;
-    const branchExp = b.exp;
-    if (exp.type !== branchExp.type) {
-      return false;
-    }
-    if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) {
-      return false;
-    }
-  }
-  return true;
-}
-function getParentCondition(node) {
-  while (true) {
-    if (node.type === 19) {
-      if (node.alternate.type === 19) {
-        node = node.alternate;
-      } else {
-        return node;
-      }
-    } else if (node.type === 20) {
-      node = node.value;
-    }
-  }
-}
-
-const transformFor = createStructuralDirectiveTransform(
-  "for",
-  (node, dir, context) => {
-    const { helper, removeHelper } = context;
-    return processFor(node, dir, context, (forNode) => {
-      const renderExp = createCallExpression(helper(RENDER_LIST), [
-        forNode.source
-      ]);
-      const isTemplate = isTemplateNode(node);
-      const memo = findDir(node, "memo");
-      const keyProp = findProp(node, `key`);
-      const keyExp = keyProp && (keyProp.type === 6 ? createSimpleExpression(keyProp.value.content, true) : keyProp.exp);
-      const keyProperty = keyProp ? createObjectProperty(`key`, keyExp) : null;
-      const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0;
-      const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256;
-      forNode.codegenNode = createVNodeCall(
-        context,
-        helper(FRAGMENT),
-        void 0,
-        renderExp,
-        fragmentFlag + (` /* ${PatchFlagNames[fragmentFlag]} */` ),
-        void 0,
-        void 0,
-        true,
-        !isStableFragment,
-        false,
-        node.loc
-      );
-      return () => {
-        let childBlock;
-        const { children } = forNode;
-        if (isTemplate) {
-          node.children.some((c) => {
-            if (c.type === 1) {
-              const key = findProp(c, "key");
-              if (key) {
-                context.onError(
-                  createCompilerError(
-                    33,
-                    key.loc
-                  )
-                );
-                return true;
-              }
-            }
-          });
-        }
-        const needFragmentWrapper = children.length !== 1 || children[0].type !== 1;
-        const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null;
-        if (slotOutlet) {
-          childBlock = slotOutlet.codegenNode;
-          if (isTemplate && keyProperty) {
-            injectProp(childBlock, keyProperty, context);
-          }
-        } else if (needFragmentWrapper) {
-          childBlock = createVNodeCall(
-            context,
-            helper(FRAGMENT),
-            keyProperty ? createObjectExpression([keyProperty]) : void 0,
-            node.children,
-            64 + (` /* ${PatchFlagNames[64]} */` ),
-            void 0,
-            void 0,
-            true,
-            void 0,
-            false
-            /* isComponent */
-          );
-        } else {
-          childBlock = children[0].codegenNode;
-          if (isTemplate && keyProperty) {
-            injectProp(childBlock, keyProperty, context);
-          }
-          if (childBlock.isBlock !== !isStableFragment) {
-            if (childBlock.isBlock) {
-              removeHelper(OPEN_BLOCK);
-              removeHelper(
-                getVNodeBlockHelper(context.inSSR, childBlock.isComponent)
-              );
-            } else {
-              removeHelper(
-                getVNodeHelper(context.inSSR, childBlock.isComponent)
-              );
-            }
-          }
-          childBlock.isBlock = !isStableFragment;
-          if (childBlock.isBlock) {
-            helper(OPEN_BLOCK);
-            helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));
-          } else {
-            helper(getVNodeHelper(context.inSSR, childBlock.isComponent));
-          }
-        }
-        if (memo) {
-          const loop = createFunctionExpression(
-            createForLoopParams(forNode.parseResult, [
-              createSimpleExpression(`_cached`)
-            ])
-          );
-          loop.body = createBlockStatement([
-            createCompoundExpression([`const _memo = (`, memo.exp, `)`]),
-            createCompoundExpression([
-              `if (_cached`,
-              ...keyExp ? [` && _cached.key === `, keyExp] : [],
-              ` && ${context.helperString(
-                IS_MEMO_SAME
-              )}(_cached, _memo)) return _cached`
-            ]),
-            createCompoundExpression([`const _item = `, childBlock]),
-            createSimpleExpression(`_item.memo = _memo`),
-            createSimpleExpression(`return _item`)
-          ]);
-          renderExp.arguments.push(
-            loop,
-            createSimpleExpression(`_cache`),
-            createSimpleExpression(String(context.cached++))
-          );
-        } else {
-          renderExp.arguments.push(
-            createFunctionExpression(
-              createForLoopParams(forNode.parseResult),
-              childBlock,
-              true
-              /* force newline */
-            )
-          );
-        }
-      };
-    });
-  }
-);
-function processFor(node, dir, context, processCodegen) {
-  if (!dir.exp) {
-    context.onError(
-      createCompilerError(31, dir.loc)
-    );
-    return;
-  }
-  const parseResult = parseForExpression(
-    // can only be simple expression because vFor transform is applied
-    // before expression transform.
-    dir.exp,
-    context
-  );
-  if (!parseResult) {
-    context.onError(
-      createCompilerError(32, dir.loc)
-    );
-    return;
-  }
-  const { addIdentifiers, removeIdentifiers, scopes } = context;
-  const { source, value, key, index } = parseResult;
-  const forNode = {
-    type: 11,
-    loc: dir.loc,
-    source,
-    valueAlias: value,
-    keyAlias: key,
-    objectIndexAlias: index,
-    parseResult,
-    children: isTemplateNode(node) ? node.children : [node]
-  };
-  context.replaceNode(forNode);
-  scopes.vFor++;
-  const onExit = processCodegen && processCodegen(forNode);
-  return () => {
-    scopes.vFor--;
-    if (onExit)
-      onExit();
-  };
-}
-const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
-const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
-const stripParensRE = /^\(|\)$/g;
-function parseForExpression(input, context) {
-  const loc = input.loc;
-  const exp = input.content;
-  const inMatch = exp.match(forAliasRE);
-  if (!inMatch)
-    return;
-  const [, LHS, RHS] = inMatch;
-  const result = {
-    source: createAliasExpression(
-      loc,
-      RHS.trim(),
-      exp.indexOf(RHS, LHS.length)
-    ),
-    value: void 0,
-    key: void 0,
-    index: void 0
-  };
-  {
-    validateBrowserExpression(result.source, context);
-  }
-  let valueContent = LHS.trim().replace(stripParensRE, "").trim();
-  const trimmedOffset = LHS.indexOf(valueContent);
-  const iteratorMatch = valueContent.match(forIteratorRE);
-  if (iteratorMatch) {
-    valueContent = valueContent.replace(forIteratorRE, "").trim();
-    const keyContent = iteratorMatch[1].trim();
-    let keyOffset;
-    if (keyContent) {
-      keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
-      result.key = createAliasExpression(loc, keyContent, keyOffset);
-      {
-        validateBrowserExpression(
-          result.key,
-          context,
-          true
-        );
-      }
-    }
-    if (iteratorMatch[2]) {
-      const indexContent = iteratorMatch[2].trim();
-      if (indexContent) {
-        result.index = createAliasExpression(
-          loc,
-          indexContent,
-          exp.indexOf(
-            indexContent,
-            result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length
-          )
-        );
-        {
-          validateBrowserExpression(
-            result.index,
-            context,
-            true
-          );
-        }
-      }
-    }
-  }
-  if (valueContent) {
-    result.value = createAliasExpression(loc, valueContent, trimmedOffset);
-    {
-      validateBrowserExpression(
-        result.value,
-        context,
-        true
-      );
-    }
-  }
-  return result;
-}
-function createAliasExpression(range, content, offset) {
-  return createSimpleExpression(
-    content,
-    false,
-    getInnerRange(range, offset, content.length)
-  );
-}
-function createForLoopParams({ value, key, index }, memoArgs = []) {
-  return createParamsList([value, key, index, ...memoArgs]);
-}
-function createParamsList(args) {
-  let i = args.length;
-  while (i--) {
-    if (args[i])
-      break;
-  }
-  return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false));
-}
-
-const defaultFallback = createSimpleExpression(`undefined`, false);
-const trackSlotScopes = (node, context) => {
-  if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) {
-    const vSlot = findDir(node, "slot");
-    if (vSlot) {
-      vSlot.exp;
-      context.scopes.vSlot++;
-      return () => {
-        context.scopes.vSlot--;
-      };
-    }
-  }
-};
-const buildClientSlotFn = (props, children, loc) => createFunctionExpression(
-  props,
-  children,
-  false,
-  true,
-  children.length ? children[0].loc : loc
-);
-function buildSlots(node, context, buildSlotFn = buildClientSlotFn) {
-  context.helper(WITH_CTX);
-  const { children, loc } = node;
-  const slotsProperties = [];
-  const dynamicSlots = [];
-  let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;
-  const onComponentSlot = findDir(node, "slot", true);
-  if (onComponentSlot) {
-    const { arg, exp } = onComponentSlot;
-    if (arg && !isStaticExp(arg)) {
-      hasDynamicSlots = true;
-    }
-    slotsProperties.push(
-      createObjectProperty(
-        arg || createSimpleExpression("default", true),
-        buildSlotFn(exp, children, loc)
-      )
-    );
-  }
-  let hasTemplateSlots = false;
-  let hasNamedDefaultSlot = false;
-  const implicitDefaultChildren = [];
-  const seenSlotNames = /* @__PURE__ */ new Set();
-  let conditionalBranchIndex = 0;
-  for (let i = 0; i < children.length; i++) {
-    const slotElement = children[i];
-    let slotDir;
-    if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, "slot", true))) {
-      if (slotElement.type !== 3) {
-        implicitDefaultChildren.push(slotElement);
-      }
-      continue;
-    }
-    if (onComponentSlot) {
-      context.onError(
-        createCompilerError(37, slotDir.loc)
-      );
-      break;
-    }
-    hasTemplateSlots = true;
-    const { children: slotChildren, loc: slotLoc } = slotElement;
-    const {
-      arg: slotName = createSimpleExpression(`default`, true),
-      exp: slotProps,
-      loc: dirLoc
-    } = slotDir;
-    let staticSlotName;
-    if (isStaticExp(slotName)) {
-      staticSlotName = slotName ? slotName.content : `default`;
-    } else {
-      hasDynamicSlots = true;
-    }
-    const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);
-    let vIf;
-    let vElse;
-    let vFor;
-    if (vIf = findDir(slotElement, "if")) {
-      hasDynamicSlots = true;
-      dynamicSlots.push(
-        createConditionalExpression(
-          vIf.exp,
-          buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++),
-          defaultFallback
-        )
-      );
-    } else if (vElse = findDir(
-      slotElement,
-      /^else(-if)?$/,
-      true
-      /* allowEmpty */
-    )) {
-      let j = i;
-      let prev;
-      while (j--) {
-        prev = children[j];
-        if (prev.type !== 3) {
-          break;
-        }
-      }
-      if (prev && isTemplateNode(prev) && findDir(prev, "if")) {
-        children.splice(i, 1);
-        i--;
-        let conditional = dynamicSlots[dynamicSlots.length - 1];
-        while (conditional.alternate.type === 19) {
-          conditional = conditional.alternate;
-        }
-        conditional.alternate = vElse.exp ? createConditionalExpression(
-          vElse.exp,
-          buildDynamicSlot(
-            slotName,
-            slotFunction,
-            conditionalBranchIndex++
-          ),
-          defaultFallback
-        ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);
-      } else {
-        context.onError(
-          createCompilerError(30, vElse.loc)
-        );
-      }
-    } else if (vFor = findDir(slotElement, "for")) {
-      hasDynamicSlots = true;
-      const parseResult = vFor.parseResult || parseForExpression(vFor.exp, context);
-      if (parseResult) {
-        dynamicSlots.push(
-          createCallExpression(context.helper(RENDER_LIST), [
-            parseResult.source,
-            createFunctionExpression(
-              createForLoopParams(parseResult),
-              buildDynamicSlot(slotName, slotFunction),
-              true
-              /* force newline */
-            )
-          ])
-        );
-      } else {
-        context.onError(
-          createCompilerError(32, vFor.loc)
-        );
-      }
-    } else {
-      if (staticSlotName) {
-        if (seenSlotNames.has(staticSlotName)) {
-          context.onError(
-            createCompilerError(
-              38,
-              dirLoc
-            )
-          );
-          continue;
-        }
-        seenSlotNames.add(staticSlotName);
-        if (staticSlotName === "default") {
-          hasNamedDefaultSlot = true;
-        }
-      }
-      slotsProperties.push(createObjectProperty(slotName, slotFunction));
-    }
-  }
-  if (!onComponentSlot) {
-    const buildDefaultSlotProperty = (props, children2) => {
-      const fn = buildSlotFn(props, children2, loc);
-      return createObjectProperty(`default`, fn);
-    };
-    if (!hasTemplateSlots) {
-      slotsProperties.push(buildDefaultSlotProperty(void 0, children));
-    } else if (implicitDefaultChildren.length && // #3766
-    // with whitespace: 'preserve', whitespaces between slots will end up in
-    // implicitDefaultChildren. Ignore if all implicit children are whitespaces.
-    implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) {
-      if (hasNamedDefaultSlot) {
-        context.onError(
-          createCompilerError(
-            39,
-            implicitDefaultChildren[0].loc
-          )
-        );
-      } else {
-        slotsProperties.push(
-          buildDefaultSlotProperty(void 0, implicitDefaultChildren)
-        );
-      }
-    }
-  }
-  const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1;
-  let slots = createObjectExpression(
-    slotsProperties.concat(
-      createObjectProperty(
-        `_`,
-        // 2 = compiled but dynamic = can skip normalization, but must run diff
-        // 1 = compiled and static = can skip normalization AND diff as optimized
-        createSimpleExpression(
-          slotFlag + (` /* ${slotFlagsText[slotFlag]} */` ),
-          false
-        )
-      )
-    ),
-    loc
-  );
-  if (dynamicSlots.length) {
-    slots = createCallExpression(context.helper(CREATE_SLOTS), [
-      slots,
-      createArrayExpression(dynamicSlots)
-    ]);
-  }
-  return {
-    slots,
-    hasDynamicSlots
-  };
-}
-function buildDynamicSlot(name, fn, index) {
-  const props = [
-    createObjectProperty(`name`, name),
-    createObjectProperty(`fn`, fn)
-  ];
-  if (index != null) {
-    props.push(
-      createObjectProperty(`key`, createSimpleExpression(String(index), true))
-    );
-  }
-  return createObjectExpression(props);
-}
-function hasForwardedSlots(children) {
-  for (let i = 0; i < children.length; i++) {
-    const child = children[i];
-    switch (child.type) {
-      case 1:
-        if (child.tagType === 2 || hasForwardedSlots(child.children)) {
-          return true;
-        }
-        break;
-      case 9:
-        if (hasForwardedSlots(child.branches))
-          return true;
-        break;
-      case 10:
-      case 11:
-        if (hasForwardedSlots(child.children))
-          return true;
-        break;
-    }
-  }
-  return false;
-}
-function isNonWhitespaceContent(node) {
-  if (node.type !== 2 && node.type !== 12)
-    return true;
-  return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content);
-}
-
-const directiveImportMap = /* @__PURE__ */ new WeakMap();
-const transformElement = (node, context) => {
-  return function postTransformElement() {
-    node = context.currentNode;
-    if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) {
-      return;
-    }
-    const { tag, props } = node;
-    const isComponent = node.tagType === 1;
-    let vnodeTag = isComponent ? resolveComponentType(node, context) : `"${tag}"`;
-    const isDynamicComponent = isObject(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;
-    let vnodeProps;
-    let vnodeChildren;
-    let vnodePatchFlag;
-    let patchFlag = 0;
-    let vnodeDynamicProps;
-    let dynamicPropNames;
-    let vnodeDirectives;
-    let shouldUseBlock = (
-      // dynamic component may resolve to plain elements
-      isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block
-      // updates inside get proper isSVG flag at runtime. (#639, #643)
-      // This is technically web-specific, but splitting the logic out of core
-      // leads to too much unnecessary complexity.
-      (tag === "svg" || tag === "foreignObject")
-    );
-    if (props.length > 0) {
-      const propsBuildResult = buildProps(
-        node,
-        context,
-        void 0,
-        isComponent,
-        isDynamicComponent
-      );
-      vnodeProps = propsBuildResult.props;
-      patchFlag = propsBuildResult.patchFlag;
-      dynamicPropNames = propsBuildResult.dynamicPropNames;
-      const directives = propsBuildResult.directives;
-      vnodeDirectives = directives && directives.length ? createArrayExpression(
-        directives.map((dir) => buildDirectiveArgs(dir, context))
-      ) : void 0;
-      if (propsBuildResult.shouldUseBlock) {
-        shouldUseBlock = true;
-      }
-    }
-    if (node.children.length > 0) {
-      if (vnodeTag === KEEP_ALIVE) {
-        shouldUseBlock = true;
-        patchFlag |= 1024;
-        if (node.children.length > 1) {
-          context.onError(
-            createCompilerError(46, {
-              start: node.children[0].loc.start,
-              end: node.children[node.children.length - 1].loc.end,
-              source: ""
-            })
-          );
-        }
-      }
-      const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling
-      vnodeTag !== TELEPORT && // explained above.
-      vnodeTag !== KEEP_ALIVE;
-      if (shouldBuildAsSlots) {
-        const { slots, hasDynamicSlots } = buildSlots(node, context);
-        vnodeChildren = slots;
-        if (hasDynamicSlots) {
-          patchFlag |= 1024;
-        }
-      } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {
-        const child = node.children[0];
-        const type = child.type;
-        const hasDynamicTextChild = type === 5 || type === 8;
-        if (hasDynamicTextChild && getConstantType(child, context) === 0) {
-          patchFlag |= 1;
-        }
-        if (hasDynamicTextChild || type === 2) {
-          vnodeChildren = child;
-        } else {
-          vnodeChildren = node.children;
-        }
-      } else {
-        vnodeChildren = node.children;
-      }
-    }
-    if (patchFlag !== 0) {
-      {
-        if (patchFlag < 0) {
-          vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`;
-        } else {
-          const flagNames = Object.keys(PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => PatchFlagNames[n]).join(`, `);
-          vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;
-        }
-      }
-      if (dynamicPropNames && dynamicPropNames.length) {
-        vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);
-      }
-    }
-    node.codegenNode = createVNodeCall(
-      context,
-      vnodeTag,
-      vnodeProps,
-      vnodeChildren,
-      vnodePatchFlag,
-      vnodeDynamicProps,
-      vnodeDirectives,
-      !!shouldUseBlock,
-      false,
-      isComponent,
-      node.loc
-    );
-  };
-};
-function resolveComponentType(node, context, ssr = false) {
-  let { tag } = node;
-  const isExplicitDynamic = isComponentTag(tag);
-  const isProp = findProp(node, "is");
-  if (isProp) {
-    if (isExplicitDynamic || false) {
-      const exp = isProp.type === 6 ? isProp.value && createSimpleExpression(isProp.value.content, true) : isProp.exp;
-      if (exp) {
-        return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
-          exp
-        ]);
-      }
-    } else if (isProp.type === 6 && isProp.value.content.startsWith("vue:")) {
-      tag = isProp.value.content.slice(4);
-    }
-  }
-  const isDir = !isExplicitDynamic && findDir(node, "is");
-  if (isDir && isDir.exp) {
-    {
-      context.onWarn(
-        createCompilerError(52, isDir.loc)
-      );
-    }
-    return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
-      isDir.exp
-    ]);
-  }
-  const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);
-  if (builtIn) {
-    if (!ssr)
-      context.helper(builtIn);
-    return builtIn;
-  }
-  context.helper(RESOLVE_COMPONENT);
-  context.components.add(tag);
-  return toValidAssetId(tag, `component`);
-}
-function buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {
-  const { tag, loc: elementLoc, children } = node;
-  let properties = [];
-  const mergeArgs = [];
-  const runtimeDirectives = [];
-  const hasChildren = children.length > 0;
-  let shouldUseBlock = false;
-  let patchFlag = 0;
-  let hasRef = false;
-  let hasClassBinding = false;
-  let hasStyleBinding = false;
-  let hasHydrationEventBinding = false;
-  let hasDynamicKeys = false;
-  let hasVnodeHook = false;
-  const dynamicPropNames = [];
-  const pushMergeArg = (arg) => {
-    if (properties.length) {
-      mergeArgs.push(
-        createObjectExpression(dedupeProperties(properties), elementLoc)
-      );
-      properties = [];
-    }
-    if (arg)
-      mergeArgs.push(arg);
-  };
-  const analyzePatchFlag = ({ key, value }) => {
-    if (isStaticExp(key)) {
-      const name = key.content;
-      const isEventHandler = isOn(name);
-      if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click
-      // dedicated fast path.
-      name.toLowerCase() !== "onclick" && // omit v-model handlers
-      name !== "onUpdate:modelValue" && // omit onVnodeXXX hooks
-      !isReservedProp(name)) {
-        hasHydrationEventBinding = true;
-      }
-      if (isEventHandler && isReservedProp(name)) {
-        hasVnodeHook = true;
-      }
-      if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) {
-        return;
-      }
-      if (name === "ref") {
-        hasRef = true;
-      } else if (name === "class") {
-        hasClassBinding = true;
-      } else if (name === "style") {
-        hasStyleBinding = true;
-      } else if (name !== "key" && !dynamicPropNames.includes(name)) {
-        dynamicPropNames.push(name);
-      }
-      if (isComponent && (name === "class" || name === "style") && !dynamicPropNames.includes(name)) {
-        dynamicPropNames.push(name);
-      }
-    } else {
-      hasDynamicKeys = true;
-    }
-  };
-  for (let i = 0; i < props.length; i++) {
-    const prop = props[i];
-    if (prop.type === 6) {
-      const { loc, name, value } = prop;
-      let isStatic = true;
-      if (name === "ref") {
-        hasRef = true;
-        if (context.scopes.vFor > 0) {
-          properties.push(
-            createObjectProperty(
-              createSimpleExpression("ref_for", true),
-              createSimpleExpression("true")
-            )
-          );
-        }
-      }
-      if (name === "is" && (isComponentTag(tag) || value && value.content.startsWith("vue:") || false)) {
-        continue;
-      }
-      properties.push(
-        createObjectProperty(
-          createSimpleExpression(
-            name,
-            true,
-            getInnerRange(loc, 0, name.length)
-          ),
-          createSimpleExpression(
-            value ? value.content : "",
-            isStatic,
-            value ? value.loc : loc
-          )
-        )
-      );
-    } else {
-      const { name, arg, exp, loc } = prop;
-      const isVBind = name === "bind";
-      const isVOn = name === "on";
-      if (name === "slot") {
-        if (!isComponent) {
-          context.onError(
-            createCompilerError(40, loc)
-          );
-        }
-        continue;
-      }
-      if (name === "once" || name === "memo") {
-        continue;
-      }
-      if (name === "is" || isVBind && isStaticArgOf(arg, "is") && (isComponentTag(tag) || false)) {
-        continue;
-      }
-      if (isVOn && ssr) {
-        continue;
-      }
-      if (
-        // #938: elements with dynamic keys should be forced into blocks
-        isVBind && isStaticArgOf(arg, "key") || // inline before-update hooks need to force block so that it is invoked
-        // before children
-        isVOn && hasChildren && isStaticArgOf(arg, "vue:before-update")
-      ) {
-        shouldUseBlock = true;
-      }
-      if (isVBind && isStaticArgOf(arg, "ref") && context.scopes.vFor > 0) {
-        properties.push(
-          createObjectProperty(
-            createSimpleExpression("ref_for", true),
-            createSimpleExpression("true")
-          )
-        );
-      }
-      if (!arg && (isVBind || isVOn)) {
-        hasDynamicKeys = true;
-        if (exp) {
-          if (isVBind) {
-            pushMergeArg();
-            mergeArgs.push(exp);
-          } else {
-            pushMergeArg({
-              type: 14,
-              loc,
-              callee: context.helper(TO_HANDLERS),
-              arguments: isComponent ? [exp] : [exp, `true`]
-            });
-          }
-        } else {
-          context.onError(
-            createCompilerError(
-              isVBind ? 34 : 35,
-              loc
-            )
-          );
-        }
-        continue;
-      }
-      const directiveTransform = context.directiveTransforms[name];
-      if (directiveTransform) {
-        const { props: props2, needRuntime } = directiveTransform(prop, node, context);
-        !ssr && props2.forEach(analyzePatchFlag);
-        if (isVOn && arg && !isStaticExp(arg)) {
-          pushMergeArg(createObjectExpression(props2, elementLoc));
-        } else {
-          properties.push(...props2);
-        }
-        if (needRuntime) {
-          runtimeDirectives.push(prop);
-          if (isSymbol(needRuntime)) {
-            directiveImportMap.set(prop, needRuntime);
-          }
-        }
-      } else if (!isBuiltInDirective(name)) {
-        runtimeDirectives.push(prop);
-        if (hasChildren) {
-          shouldUseBlock = true;
-        }
-      }
-    }
-  }
-  let propsExpression = void 0;
-  if (mergeArgs.length) {
-    pushMergeArg();
-    if (mergeArgs.length > 1) {
-      propsExpression = createCallExpression(
-        context.helper(MERGE_PROPS),
-        mergeArgs,
-        elementLoc
-      );
-    } else {
-      propsExpression = mergeArgs[0];
-    }
-  } else if (properties.length) {
-    propsExpression = createObjectExpression(
-      dedupeProperties(properties),
-      elementLoc
-    );
-  }
-  if (hasDynamicKeys) {
-    patchFlag |= 16;
-  } else {
-    if (hasClassBinding && !isComponent) {
-      patchFlag |= 2;
-    }
-    if (hasStyleBinding && !isComponent) {
-      patchFlag |= 4;
-    }
-    if (dynamicPropNames.length) {
-      patchFlag |= 8;
-    }
-    if (hasHydrationEventBinding) {
-      patchFlag |= 32;
-    }
-  }
-  if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {
-    patchFlag |= 512;
-  }
-  if (!context.inSSR && propsExpression) {
-    switch (propsExpression.type) {
-      case 15:
-        let classKeyIndex = -1;
-        let styleKeyIndex = -1;
-        let hasDynamicKey = false;
-        for (let i = 0; i < propsExpression.properties.length; i++) {
-          const key = propsExpression.properties[i].key;
-          if (isStaticExp(key)) {
-            if (key.content === "class") {
-              classKeyIndex = i;
-            } else if (key.content === "style") {
-              styleKeyIndex = i;
-            }
-          } else if (!key.isHandlerKey) {
-            hasDynamicKey = true;
-          }
-        }
-        const classProp = propsExpression.properties[classKeyIndex];
-        const styleProp = propsExpression.properties[styleKeyIndex];
-        if (!hasDynamicKey) {
-          if (classProp && !isStaticExp(classProp.value)) {
-            classProp.value = createCallExpression(
-              context.helper(NORMALIZE_CLASS),
-              [classProp.value]
-            );
-          }
-          if (styleProp && // the static style is compiled into an object,
-          // so use `hasStyleBinding` to ensure that it is a dynamic style binding
-          (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist,
-          // v-bind:style with static literal object
-          styleProp.value.type === 17)) {
-            styleProp.value = createCallExpression(
-              context.helper(NORMALIZE_STYLE),
-              [styleProp.value]
-            );
-          }
-        } else {
-          propsExpression = createCallExpression(
-            context.helper(NORMALIZE_PROPS),
-            [propsExpression]
-          );
-        }
-        break;
-      case 14:
-        break;
-      default:
-        propsExpression = createCallExpression(
-          context.helper(NORMALIZE_PROPS),
-          [
-            createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [
-              propsExpression
-            ])
-          ]
-        );
-        break;
-    }
-  }
-  return {
-    props: propsExpression,
-    directives: runtimeDirectives,
-    patchFlag,
-    dynamicPropNames,
-    shouldUseBlock
-  };
-}
-function dedupeProperties(properties) {
-  const knownProps = /* @__PURE__ */ new Map();
-  const deduped = [];
-  for (let i = 0; i < properties.length; i++) {
-    const prop = properties[i];
-    if (prop.key.type === 8 || !prop.key.isStatic) {
-      deduped.push(prop);
-      continue;
-    }
-    const name = prop.key.content;
-    const existing = knownProps.get(name);
-    if (existing) {
-      if (name === "style" || name === "class" || isOn(name)) {
-        mergeAsArray(existing, prop);
-      }
-    } else {
-      knownProps.set(name, prop);
-      deduped.push(prop);
-    }
-  }
-  return deduped;
-}
-function mergeAsArray(existing, incoming) {
-  if (existing.value.type === 17) {
-    existing.value.elements.push(incoming.value);
-  } else {
-    existing.value = createArrayExpression(
-      [existing.value, incoming.value],
-      existing.loc
-    );
-  }
-}
-function buildDirectiveArgs(dir, context) {
-  const dirArgs = [];
-  const runtime = directiveImportMap.get(dir);
-  if (runtime) {
-    dirArgs.push(context.helperString(runtime));
-  } else {
-    {
-      context.helper(RESOLVE_DIRECTIVE);
-      context.directives.add(dir.name);
-      dirArgs.push(toValidAssetId(dir.name, `directive`));
-    }
-  }
-  const { loc } = dir;
-  if (dir.exp)
-    dirArgs.push(dir.exp);
-  if (dir.arg) {
-    if (!dir.exp) {
-      dirArgs.push(`void 0`);
-    }
-    dirArgs.push(dir.arg);
-  }
-  if (Object.keys(dir.modifiers).length) {
-    if (!dir.arg) {
-      if (!dir.exp) {
-        dirArgs.push(`void 0`);
-      }
-      dirArgs.push(`void 0`);
-    }
-    const trueExpression = createSimpleExpression(`true`, false, loc);
-    dirArgs.push(
-      createObjectExpression(
-        dir.modifiers.map(
-          (modifier) => createObjectProperty(modifier, trueExpression)
-        ),
-        loc
-      )
-    );
-  }
-  return createArrayExpression(dirArgs, dir.loc);
-}
-function stringifyDynamicPropNames(props) {
-  let propsNamesString = `[`;
-  for (let i = 0, l = props.length; i < l; i++) {
-    propsNamesString += JSON.stringify(props[i]);
-    if (i < l - 1)
-      propsNamesString += ", ";
-  }
-  return propsNamesString + `]`;
-}
-function isComponentTag(tag) {
-  return tag === "component" || tag === "Component";
-}
-
-const transformSlotOutlet = (node, context) => {
-  if (isSlotOutlet(node)) {
-    const { children, loc } = node;
-    const { slotName, slotProps } = processSlotOutlet(node, context);
-    const slotArgs = [
-      context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
-      slotName,
-      "{}",
-      "undefined",
-      "true"
-    ];
-    let expectedLen = 2;
-    if (slotProps) {
-      slotArgs[2] = slotProps;
-      expectedLen = 3;
-    }
-    if (children.length) {
-      slotArgs[3] = createFunctionExpression([], children, false, false, loc);
-      expectedLen = 4;
-    }
-    if (context.scopeId && !context.slotted) {
-      expectedLen = 5;
-    }
-    slotArgs.splice(expectedLen);
-    node.codegenNode = createCallExpression(
-      context.helper(RENDER_SLOT),
-      slotArgs,
-      loc
-    );
-  }
-};
-function processSlotOutlet(node, context) {
-  let slotName = `"default"`;
-  let slotProps = void 0;
-  const nonNameProps = [];
-  for (let i = 0; i < node.props.length; i++) {
-    const p = node.props[i];
-    if (p.type === 6) {
-      if (p.value) {
-        if (p.name === "name") {
-          slotName = JSON.stringify(p.value.content);
-        } else {
-          p.name = camelize(p.name);
-          nonNameProps.push(p);
-        }
-      }
-    } else {
-      if (p.name === "bind" && isStaticArgOf(p.arg, "name")) {
-        if (p.exp)
-          slotName = p.exp;
-      } else {
-        if (p.name === "bind" && p.arg && isStaticExp(p.arg)) {
-          p.arg.content = camelize(p.arg.content);
-        }
-        nonNameProps.push(p);
-      }
-    }
-  }
-  if (nonNameProps.length > 0) {
-    const { props, directives } = buildProps(
-      node,
-      context,
-      nonNameProps,
-      false,
-      false
-    );
-    slotProps = props;
-    if (directives.length) {
-      context.onError(
-        createCompilerError(
-          36,
-          directives[0].loc
-        )
-      );
-    }
-  }
-  return {
-    slotName,
-    slotProps
-  };
-}
-
-const fnExpRE = /^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/;
-const transformOn$1 = (dir, node, context, augmentor) => {
-  const { loc, modifiers, arg } = dir;
-  if (!dir.exp && !modifiers.length) {
-    context.onError(createCompilerError(35, loc));
-  }
-  let eventName;
-  if (arg.type === 4) {
-    if (arg.isStatic) {
-      let rawName = arg.content;
-      if (rawName.startsWith("vnode")) {
-        context.onWarn(
-          createCompilerError(51, arg.loc)
-        );
-      }
-      if (rawName.startsWith("vue:")) {
-        rawName = `vnode-${rawName.slice(4)}`;
-      }
-      const eventString = node.tagType !== 0 || rawName.startsWith("vnode") || !/[A-Z]/.test(rawName) ? (
-        // for non-element and vnode lifecycle event listeners, auto convert
-        // it to camelCase. See issue #2249
-        toHandlerKey(camelize(rawName))
-      ) : (
-        // preserve case for plain element listeners that have uppercase
-        // letters, as these may be custom elements' custom events
-        `on:${rawName}`
-      );
-      eventName = createSimpleExpression(eventString, true, arg.loc);
-    } else {
-      eventName = createCompoundExpression([
-        `${context.helperString(TO_HANDLER_KEY)}(`,
-        arg,
-        `)`
-      ]);
-    }
-  } else {
-    eventName = arg;
-    eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);
-    eventName.children.push(`)`);
-  }
-  let exp = dir.exp;
-  if (exp && !exp.content.trim()) {
-    exp = void 0;
-  }
-  let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;
-  if (exp) {
-    const isMemberExp = isMemberExpression(exp.content);
-    const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));
-    const hasMultipleStatements = exp.content.includes(`;`);
-    {
-      validateBrowserExpression(
-        exp,
-        context,
-        false,
-        hasMultipleStatements
-      );
-    }
-    if (isInlineStatement || shouldCache && isMemberExp) {
-      exp = createCompoundExpression([
-        `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,
-        exp,
-        hasMultipleStatements ? `}` : `)`
-      ]);
-    }
-  }
-  let ret = {
-    props: [
-      createObjectProperty(
-        eventName,
-        exp || createSimpleExpression(`() => {}`, false, loc)
-      )
-    ]
-  };
-  if (augmentor) {
-    ret = augmentor(ret);
-  }
-  if (shouldCache) {
-    ret.props[0].value = context.cache(ret.props[0].value);
-  }
-  ret.props.forEach((p) => p.key.isHandlerKey = true);
-  return ret;
-};
-
-const transformBind = (dir, _node, context) => {
-  const { exp, modifiers, loc } = dir;
-  const arg = dir.arg;
-  if (arg.type !== 4) {
-    arg.children.unshift(`(`);
-    arg.children.push(`) || ""`);
-  } else if (!arg.isStatic) {
-    arg.content = `${arg.content} || ""`;
-  }
-  if (modifiers.includes("camel")) {
-    if (arg.type === 4) {
-      if (arg.isStatic) {
-        arg.content = camelize(arg.content);
-      } else {
-        arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;
-      }
-    } else {
-      arg.children.unshift(`${context.helperString(CAMELIZE)}(`);
-      arg.children.push(`)`);
-    }
-  }
-  if (!context.inSSR) {
-    if (modifiers.includes("prop")) {
-      injectPrefix(arg, ".");
-    }
-    if (modifiers.includes("attr")) {
-      injectPrefix(arg, "^");
-    }
-  }
-  if (!exp || exp.type === 4 && !exp.content.trim()) {
-    context.onError(createCompilerError(34, loc));
-    return {
-      props: [createObjectProperty(arg, createSimpleExpression("", true, loc))]
-    };
-  }
-  return {
-    props: [createObjectProperty(arg, exp)]
-  };
-};
-const injectPrefix = (arg, prefix) => {
-  if (arg.type === 4) {
-    if (arg.isStatic) {
-      arg.content = prefix + arg.content;
-    } else {
-      arg.content = `\`${prefix}\${${arg.content}}\``;
-    }
-  } else {
-    arg.children.unshift(`'${prefix}' + (`);
-    arg.children.push(`)`);
-  }
-};
-
-const transformText = (node, context) => {
-  if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) {
-    return () => {
-      const children = node.children;
-      let currentContainer = void 0;
-      let hasText = false;
-      for (let i = 0; i < children.length; i++) {
-        const child = children[i];
-        if (isText$1(child)) {
-          hasText = true;
-          for (let j = i + 1; j < children.length; j++) {
-            const next = children[j];
-            if (isText$1(next)) {
-              if (!currentContainer) {
-                currentContainer = children[i] = createCompoundExpression(
-                  [child],
-                  child.loc
-                );
-              }
-              currentContainer.children.push(` + `, next);
-              children.splice(j, 1);
-              j--;
-            } else {
-              currentContainer = void 0;
-              break;
-            }
-          }
-        }
-      }
-      if (!hasText || // if this is a plain element with a single text child, leave it
-      // as-is since the runtime has dedicated fast path for this by directly
-      // setting textContent of the element.
-      // for component root it's always normalized anyway.
-      children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756
-      // custom directives can potentially add DOM elements arbitrarily,
-      // we need to avoid setting textContent of the element at runtime
-      // to avoid accidentally overwriting the DOM elements added
-      // by the user through custom directives.
-      !node.props.find(
-        (p) => p.type === 7 && !context.directiveTransforms[p.name]
-      ) && // in compat mode, <template> tags with no special directives
-      // will be rendered as a fragment so its children must be
-      // converted into vnodes.
-      true)) {
-        return;
-      }
-      for (let i = 0; i < children.length; i++) {
-        const child = children[i];
-        if (isText$1(child) || child.type === 8) {
-          const callArgs = [];
-          if (child.type !== 2 || child.content !== " ") {
-            callArgs.push(child);
-          }
-          if (!context.ssr && getConstantType(child, context) === 0) {
-            callArgs.push(
-              1 + (` /* ${PatchFlagNames[1]} */` )
-            );
-          }
-          children[i] = {
-            type: 12,
-            content: child,
-            loc: child.loc,
-            codegenNode: createCallExpression(
-              context.helper(CREATE_TEXT),
-              callArgs
-            )
-          };
-        }
-      }
-    };
-  }
-};
-
-const seen$1 = /* @__PURE__ */ new WeakSet();
-const transformOnce = (node, context) => {
-  if (node.type === 1 && findDir(node, "once", true)) {
-    if (seen$1.has(node) || context.inVOnce || context.inSSR) {
-      return;
-    }
-    seen$1.add(node);
-    context.inVOnce = true;
-    context.helper(SET_BLOCK_TRACKING);
-    return () => {
-      context.inVOnce = false;
-      const cur = context.currentNode;
-      if (cur.codegenNode) {
-        cur.codegenNode = context.cache(
-          cur.codegenNode,
-          true
-          /* isVNode */
-        );
-      }
-    };
-  }
-};
-
-const transformModel$1 = (dir, node, context) => {
-  const { exp, arg } = dir;
-  if (!exp) {
-    context.onError(
-      createCompilerError(41, dir.loc)
-    );
-    return createTransformProps();
-  }
-  const rawExp = exp.loc.source;
-  const expString = exp.type === 4 ? exp.content : rawExp;
-  const bindingType = context.bindingMetadata[rawExp];
-  if (bindingType === "props" || bindingType === "props-aliased") {
-    context.onError(createCompilerError(44, exp.loc));
-    return createTransformProps();
-  }
-  const maybeRef = false;
-  if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) {
-    context.onError(
-      createCompilerError(42, exp.loc)
-    );
-    return createTransformProps();
-  }
-  const propName = arg ? arg : createSimpleExpression("modelValue", true);
-  const eventName = arg ? isStaticExp(arg) ? `onUpdate:${camelize(arg.content)}` : createCompoundExpression(['"onUpdate:" + ', arg]) : `onUpdate:modelValue`;
-  let assignmentExp;
-  const eventArg = context.isTS ? `($event: any)` : `$event`;
-  {
-    assignmentExp = createCompoundExpression([
-      `${eventArg} => ((`,
-      exp,
-      `) = $event)`
-    ]);
-  }
-  const props = [
-    // modelValue: foo
-    createObjectProperty(propName, dir.exp),
-    // "onUpdate:modelValue": $event => (foo = $event)
-    createObjectProperty(eventName, assignmentExp)
-  ];
-  if (dir.modifiers.length && node.tagType === 1) {
-    const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `);
-    const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + "Modifiers"']) : `modelModifiers`;
-    props.push(
-      createObjectProperty(
-        modifiersKey,
-        createSimpleExpression(
-          `{ ${modifiers} }`,
-          false,
-          dir.loc,
-          2
-        )
-      )
-    );
-  }
-  return createTransformProps(props);
-};
-function createTransformProps(props = []) {
-  return { props };
-}
-
-const seen = /* @__PURE__ */ new WeakSet();
-const transformMemo = (node, context) => {
-  if (node.type === 1) {
-    const dir = findDir(node, "memo");
-    if (!dir || seen.has(node)) {
-      return;
-    }
-    seen.add(node);
-    return () => {
-      const codegenNode = node.codegenNode || context.currentNode.codegenNode;
-      if (codegenNode && codegenNode.type === 13) {
-        if (node.tagType !== 1) {
-          convertToBlock(codegenNode, context);
-        }
-        node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [
-          dir.exp,
-          createFunctionExpression(void 0, codegenNode),
-          `_cache`,
-          String(context.cached++)
-        ]);
-      }
-    };
-  }
-};
-
-function getBaseTransformPreset(prefixIdentifiers) {
-  return [
-    [
-      transformOnce,
-      transformIf,
-      transformMemo,
-      transformFor,
-      ...[],
-      ...[transformExpression] ,
-      transformSlotOutlet,
-      transformElement,
-      trackSlotScopes,
-      transformText
-    ],
-    {
-      on: transformOn$1,
-      bind: transformBind,
-      model: transformModel$1
-    }
-  ];
-}
-function baseCompile(template, options = {}) {
-  const onError = options.onError || defaultOnError;
-  const isModuleMode = options.mode === "module";
-  {
-    if (options.prefixIdentifiers === true) {
-      onError(createCompilerError(47));
-    } else if (isModuleMode) {
-      onError(createCompilerError(48));
-    }
-  }
-  const prefixIdentifiers = false;
-  if (options.cacheHandlers) {
-    onError(createCompilerError(49));
-  }
-  if (options.scopeId && !isModuleMode) {
-    onError(createCompilerError(50));
-  }
-  const ast = isString(template) ? baseParse(template, options) : template;
-  const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();
-  transform(
-    ast,
-    extend({}, options, {
-      prefixIdentifiers,
-      nodeTransforms: [
-        ...nodeTransforms,
-        ...options.nodeTransforms || []
-        // user transforms
-      ],
-      directiveTransforms: extend(
-        {},
-        directiveTransforms,
-        options.directiveTransforms || {}
-        // user transforms
-      )
-    })
-  );
-  return generate(
-    ast,
-    extend({}, options, {
-      prefixIdentifiers
-    })
-  );
-}
-
-const noopDirectiveTransform = () => ({ props: [] });
-
-const V_MODEL_RADIO = Symbol(`vModelRadio` );
-const V_MODEL_CHECKBOX = Symbol(`vModelCheckbox` );
-const V_MODEL_TEXT = Symbol(`vModelText` );
-const V_MODEL_SELECT = Symbol(`vModelSelect` );
-const V_MODEL_DYNAMIC = Symbol(`vModelDynamic` );
-const V_ON_WITH_MODIFIERS = Symbol(`vOnModifiersGuard` );
-const V_ON_WITH_KEYS = Symbol(`vOnKeysGuard` );
-const V_SHOW = Symbol(`vShow` );
-const TRANSITION = Symbol(`Transition` );
-const TRANSITION_GROUP = Symbol(`TransitionGroup` );
-registerRuntimeHelpers({
-  [V_MODEL_RADIO]: `vModelRadio`,
-  [V_MODEL_CHECKBOX]: `vModelCheckbox`,
-  [V_MODEL_TEXT]: `vModelText`,
-  [V_MODEL_SELECT]: `vModelSelect`,
-  [V_MODEL_DYNAMIC]: `vModelDynamic`,
-  [V_ON_WITH_MODIFIERS]: `withModifiers`,
-  [V_ON_WITH_KEYS]: `withKeys`,
-  [V_SHOW]: `vShow`,
-  [TRANSITION]: `Transition`,
-  [TRANSITION_GROUP]: `TransitionGroup`
-});
-
-let decoder;
-function decodeHtmlBrowser(raw, asAttr = false) {
-  if (!decoder) {
-    decoder = document.createElement("div");
-  }
-  if (asAttr) {
-    decoder.innerHTML = `<div foo="${raw.replace(/"/g, "&quot;")}">`;
-    return decoder.children[0].getAttribute("foo");
-  } else {
-    decoder.innerHTML = raw;
-    return decoder.textContent;
-  }
-}
-
-const isRawTextContainer = /* @__PURE__ */ makeMap(
-  "style,iframe,script,noscript",
-  true
-);
-const parserOptions = {
-  isVoidTag,
-  isNativeTag: (tag) => isHTMLTag(tag) || isSVGTag(tag),
-  isPreTag: (tag) => tag === "pre",
-  decodeEntities: decodeHtmlBrowser ,
-  isBuiltInComponent: (tag) => {
-    if (isBuiltInType(tag, `Transition`)) {
-      return TRANSITION;
-    } else if (isBuiltInType(tag, `TransitionGroup`)) {
-      return TRANSITION_GROUP;
-    }
-  },
-  // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
-  getNamespace(tag, parent) {
-    let ns = parent ? parent.ns : 0;
-    if (parent && ns === 2) {
-      if (parent.tag === "annotation-xml") {
-        if (tag === "svg") {
-          return 1;
-        }
-        if (parent.props.some(
-          (a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml")
-        )) {
-          ns = 0;
-        }
-      } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") {
-        ns = 0;
-      }
-    } else if (parent && ns === 1) {
-      if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") {
-        ns = 0;
-      }
-    }
-    if (ns === 0) {
-      if (tag === "svg") {
-        return 1;
-      }
-      if (tag === "math") {
-        return 2;
-      }
-    }
-    return ns;
-  },
-  // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
-  getTextMode({ tag, ns }) {
-    if (ns === 0) {
-      if (tag === "textarea" || tag === "title") {
-        return 1;
-      }
-      if (isRawTextContainer(tag)) {
-        return 2;
-      }
-    }
-    return 0;
-  }
-};
-
-const transformStyle = (node) => {
-  if (node.type === 1) {
-    node.props.forEach((p, i) => {
-      if (p.type === 6 && p.name === "style" && p.value) {
-        node.props[i] = {
-          type: 7,
-          name: `bind`,
-          arg: createSimpleExpression(`style`, true, p.loc),
-          exp: parseInlineCSS(p.value.content, p.loc),
-          modifiers: [],
-          loc: p.loc
-        };
-      }
-    });
-  }
-};
-const parseInlineCSS = (cssText, loc) => {
-  const normalized = parseStringStyle(cssText);
-  return createSimpleExpression(
-    JSON.stringify(normalized),
-    false,
-    loc,
-    3
-  );
-};
-
-function createDOMCompilerError(code, loc) {
-  return createCompilerError(
-    code,
-    loc,
-    DOMErrorMessages 
-  );
-}
-const DOMErrorMessages = {
-  [53]: `v-html is missing expression.`,
-  [54]: `v-html will override element children.`,
-  [55]: `v-text is missing expression.`,
-  [56]: `v-text will override element children.`,
-  [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
-  [58]: `v-model argument is not supported on plain elements.`,
-  [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
-  [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
-  [61]: `v-show is missing expression.`,
-  [62]: `<Transition> expects exactly one child element or component.`,
-  [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
-};
-
-const transformVHtml = (dir, node, context) => {
-  const { exp, loc } = dir;
-  if (!exp) {
-    context.onError(
-      createDOMCompilerError(53, loc)
-    );
-  }
-  if (node.children.length) {
-    context.onError(
-      createDOMCompilerError(54, loc)
-    );
-    node.children.length = 0;
-  }
-  return {
-    props: [
-      createObjectProperty(
-        createSimpleExpression(`innerHTML`, true, loc),
-        exp || createSimpleExpression("", true)
-      )
-    ]
-  };
-};
-
-const transformVText = (dir, node, context) => {
-  const { exp, loc } = dir;
-  if (!exp) {
-    context.onError(
-      createDOMCompilerError(55, loc)
-    );
-  }
-  if (node.children.length) {
-    context.onError(
-      createDOMCompilerError(56, loc)
-    );
-    node.children.length = 0;
-  }
-  return {
-    props: [
-      createObjectProperty(
-        createSimpleExpression(`textContent`, true),
-        exp ? getConstantType(exp, context) > 0 ? exp : createCallExpression(
-          context.helperString(TO_DISPLAY_STRING),
-          [exp],
-          loc
-        ) : createSimpleExpression("", true)
-      )
-    ]
-  };
-};
-
-const transformModel = (dir, node, context) => {
-  const baseResult = transformModel$1(dir, node, context);
-  if (!baseResult.props.length || node.tagType === 1) {
-    return baseResult;
-  }
-  if (dir.arg) {
-    context.onError(
-      createDOMCompilerError(
-        58,
-        dir.arg.loc
-      )
-    );
-  }
-  function checkDuplicatedValue() {
-    const value = findProp(node, "value");
-    if (value) {
-      context.onError(
-        createDOMCompilerError(
-          60,
-          value.loc
-        )
-      );
-    }
-  }
-  const { tag } = node;
-  const isCustomElement = context.isCustomElement(tag);
-  if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) {
-    let directiveToUse = V_MODEL_TEXT;
-    let isInvalidType = false;
-    if (tag === "input" || isCustomElement) {
-      const type = findProp(node, `type`);
-      if (type) {
-        if (type.type === 7) {
-          directiveToUse = V_MODEL_DYNAMIC;
-        } else if (type.value) {
-          switch (type.value.content) {
-            case "radio":
-              directiveToUse = V_MODEL_RADIO;
-              break;
-            case "checkbox":
-              directiveToUse = V_MODEL_CHECKBOX;
-              break;
-            case "file":
-              isInvalidType = true;
-              context.onError(
-                createDOMCompilerError(
-                  59,
-                  dir.loc
-                )
-              );
-              break;
-            default:
-              checkDuplicatedValue();
-              break;
-          }
-        }
-      } else if (hasDynamicKeyVBind(node)) {
-        directiveToUse = V_MODEL_DYNAMIC;
-      } else {
-        checkDuplicatedValue();
-      }
-    } else if (tag === "select") {
-      directiveToUse = V_MODEL_SELECT;
-    } else {
-      checkDuplicatedValue();
-    }
-    if (!isInvalidType) {
-      baseResult.needRuntime = context.helper(directiveToUse);
-    }
-  } else {
-    context.onError(
-      createDOMCompilerError(
-        57,
-        dir.loc
-      )
-    );
-  }
-  baseResult.props = baseResult.props.filter(
-    (p) => !(p.key.type === 4 && p.key.content === "modelValue")
-  );
-  return baseResult;
-};
-
-const isEventOptionModifier = /* @__PURE__ */ makeMap(`passive,once,capture`);
-const isNonKeyModifier = /* @__PURE__ */ makeMap(
-  // event propagation management
-  `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`
-);
-const maybeKeyModifier = /* @__PURE__ */ makeMap("left,right");
-const isKeyboardEvent = /* @__PURE__ */ makeMap(
-  `onkeyup,onkeydown,onkeypress`,
-  true
-);
-const resolveModifiers = (key, modifiers, context, loc) => {
-  const keyModifiers = [];
-  const nonKeyModifiers = [];
-  const eventOptionModifiers = [];
-  for (let i = 0; i < modifiers.length; i++) {
-    const modifier = modifiers[i];
-    if (isEventOptionModifier(modifier)) {
-      eventOptionModifiers.push(modifier);
-    } else {
-      if (maybeKeyModifier(modifier)) {
-        if (isStaticExp(key)) {
-          if (isKeyboardEvent(key.content)) {
-            keyModifiers.push(modifier);
-          } else {
-            nonKeyModifiers.push(modifier);
-          }
-        } else {
-          keyModifiers.push(modifier);
-          nonKeyModifiers.push(modifier);
-        }
-      } else {
-        if (isNonKeyModifier(modifier)) {
-          nonKeyModifiers.push(modifier);
-        } else {
-          keyModifiers.push(modifier);
-        }
-      }
-    }
-  }
-  return {
-    keyModifiers,
-    nonKeyModifiers,
-    eventOptionModifiers
-  };
-};
-const transformClick = (key, event) => {
-  const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === "onclick";
-  return isStaticClick ? createSimpleExpression(event, true) : key.type !== 4 ? createCompoundExpression([
-    `(`,
-    key,
-    `) === "onClick" ? "${event}" : (`,
-    key,
-    `)`
-  ]) : key;
-};
-const transformOn = (dir, node, context) => {
-  return transformOn$1(dir, node, context, (baseResult) => {
-    const { modifiers } = dir;
-    if (!modifiers.length)
-      return baseResult;
-    let { key, value: handlerExp } = baseResult.props[0];
-    const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);
-    if (nonKeyModifiers.includes("right")) {
-      key = transformClick(key, `onContextmenu`);
-    }
-    if (nonKeyModifiers.includes("middle")) {
-      key = transformClick(key, `onMouseup`);
-    }
-    if (nonKeyModifiers.length) {
-      handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
-        handlerExp,
-        JSON.stringify(nonKeyModifiers)
-      ]);
-    }
-    if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard
-    (!isStaticExp(key) || isKeyboardEvent(key.content))) {
-      handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [
-        handlerExp,
-        JSON.stringify(keyModifiers)
-      ]);
-    }
-    if (eventOptionModifiers.length) {
-      const modifierPostfix = eventOptionModifiers.map(capitalize).join("");
-      key = isStaticExp(key) ? createSimpleExpression(`${key.content}${modifierPostfix}`, true) : createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
-    }
-    return {
-      props: [createObjectProperty(key, handlerExp)]
-    };
-  });
-};
-
-const transformShow = (dir, node, context) => {
-  const { exp, loc } = dir;
-  if (!exp) {
-    context.onError(
-      createDOMCompilerError(61, loc)
-    );
-  }
-  return {
-    props: [],
-    needRuntime: context.helper(V_SHOW)
-  };
-};
-
-const transformTransition = (node, context) => {
-  if (node.type === 1 && node.tagType === 1) {
-    const component = context.isBuiltInComponent(node.tag);
-    if (component === TRANSITION) {
-      return () => {
-        if (!node.children.length) {
-          return;
-        }
-        if (hasMultipleChildren(node)) {
-          context.onError(
-            createDOMCompilerError(
-              62,
-              {
-                start: node.children[0].loc.start,
-                end: node.children[node.children.length - 1].loc.end,
-                source: ""
-              }
-            )
-          );
-        }
-        const child = node.children[0];
-        if (child.type === 1) {
-          for (const p of child.props) {
-            if (p.type === 7 && p.name === "show") {
-              node.props.push({
-                type: 6,
-                name: "persisted",
-                value: void 0,
-                loc: node.loc
-              });
-            }
-          }
-        }
-      };
-    }
-  }
-};
-function hasMultipleChildren(node) {
-  const children = node.children = node.children.filter(
-    (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())
-  );
-  const child = children[0];
-  return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);
-}
-
-const ignoreSideEffectTags = (node, context) => {
-  if (node.type === 1 && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) {
-    context.onError(
-      createDOMCompilerError(
-        63,
-        node.loc
-      )
-    );
-    context.removeNode();
-  }
-};
-
-const DOMNodeTransforms = [
-  transformStyle,
-  ...[transformTransition] 
-];
-const DOMDirectiveTransforms = {
-  cloak: noopDirectiveTransform,
-  html: transformVHtml,
-  text: transformVText,
-  model: transformModel,
-  // override compiler-core
-  on: transformOn,
-  // override compiler-core
-  show: transformShow
-};
-function compile(template, options = {}) {
-  return baseCompile(
-    template,
-    extend({}, parserOptions, options, {
-      nodeTransforms: [
-        // ignore <script> and <tag>
-        // this is not put inside DOMNodeTransforms because that list is used
-        // by compiler-ssr to generate vnode fallback branches
-        ignoreSideEffectTags,
-        ...DOMNodeTransforms,
-        ...options.nodeTransforms || []
-      ],
-      directiveTransforms: extend(
-        {},
-        DOMDirectiveTransforms,
-        options.directiveTransforms || {}
-      ),
-      transformHoist: null 
-    })
-  );
-}
-
-{
-  initDev();
-}
-const compileCache = /* @__PURE__ */ Object.create(null);
-function compileToFunction(template, options) {
-  if (!isString(template)) {
-    if (template.nodeType) {
-      template = template.innerHTML;
-    } else {
-      warn(`invalid template option: `, template);
-      return NOOP;
-    }
-  }
-  const key = template;
-  const cached = compileCache[key];
-  if (cached) {
-    return cached;
-  }
-  if (template[0] === "#") {
-    const el = document.querySelector(template);
-    if (!el) {
-      warn(`Template element not found or is empty: ${template}`);
-    }
-    template = el ? el.innerHTML : ``;
-  }
-  const opts = extend(
-    {
-      hoistStatic: true,
-      onError: onError ,
-      onWarn: (e) => onError(e, true) 
-    },
-    options
-  );
-  if (!opts.isCustomElement && typeof customElements !== "undefined") {
-    opts.isCustomElement = (tag) => !!customElements.get(tag);
-  }
-  const { code } = compile(template, opts);
-  function onError(err, asWarning = false) {
-    const message = asWarning ? err.message : `Template compilation error: ${err.message}`;
-    const codeFrame = err.loc && generateCodeFrame(
-      template,
-      err.loc.start.offset,
-      err.loc.end.offset
-    );
-    warn(codeFrame ? `${message}
-${codeFrame}` : message);
-  }
-  const render = new Function("Vue", code)(runtimeDom);
-  render._rc = true;
-  return compileCache[key] = render;
-}
-registerRuntimeCompiler(compileToFunction);
-
-export { BaseTransition, BaseTransitionPropsValidators, Comment, EffectScope, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, Transition, TransitionGroup, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, compileToFunction as compile, computed, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, defineAsyncComponent, defineComponent, defineCustomElement, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSSRCustomElement, defineSlots, devtools, effect, effectScope, getCurrentInstance, getCurrentScope, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrate, initCustomFormatter, initDirectivesForSSR, inject, isMemoSame, isProxy, isReactive, isReadonly, isRef, isRuntimeOnly, isShallow, isVNode, markRaw, mergeDefaults, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onScopeDispose, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, proxyRefs, pushScopeId, queuePostFlushCb, reactive, readonly, ref, registerRuntimeCompiler, render, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, shallowReactive, shallowReadonly, shallowRef, ssrContextKey, ssrUtils, stop, toDisplayString, toHandlerKey, toHandlers, toRaw, toRef, toRefs, toValue, transformVNodeArgs, triggerRef, unref, useAttrs, useCssModule, useCssVars, useModel, useSSRContext, useSlots, useTransitionState, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withKeys, withMemo, withModifiers, withScopeId };
Index: ews/js/vue.esm-browser.prod.3.5.32.js
===================================================================
--- /views/js/vue.esm-browser.prod.3.5.32.js	(revision 8528)
+++ 	(revision )
@@ -1,13 +1,0 @@
-/**
-* vue v3.5.32
-* (c) 2018-present Yuxi (Evan) You and Vue contributors
-* @license MIT
-**/let e,t,n,r,i,l,s,o,a,c,u,d,p;function h(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let f={},g=[],m=()=>{},y=()=>!1,b=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),_=e=>e.startsWith("onUpdate:"),S=Object.assign,x=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},C=Object.prototype.hasOwnProperty,k=(e,t)=>C.call(e,t),T=Array.isArray,w=e=>"function"==typeof e,N=e=>"string"==typeof e,A=e=>"symbol"==typeof e,E=e=>null!==e&&"object"==typeof e,R=e=>(E(e)||w(e))&&w(e.then)&&w(e.catch),I=Object.prototype.toString,O=e=>N(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,P=h(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),M=h("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),D=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},F=/-\w/g,L=D(e=>e.replace(F,e=>e.slice(1).toUpperCase())),$=/\B([A-Z])/g,V=D(e=>e.replace($,"-$1").toLowerCase()),B=D(e=>e.charAt(0).toUpperCase()+e.slice(1)),j=D(e=>e?`on${B(e)}`:""),U=(e,t)=>!Object.is(e,t),H=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},q=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},W=e=>{let t=parseFloat(e);return isNaN(t)?e:t},K=e=>{let t=N(e)?Number(e):NaN;return isNaN(t)?e:t},z=()=>e||(e="u">typeof globalThis?globalThis:"u">typeof self?self:"u">typeof window?window:"u">typeof global?global:{}),J=h("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol");function G(e){if(T(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=N(r)?Y(r):G(r);if(i)for(let e in i)t[e]=i[e]}return t}if(N(e)||E(e))return e}let Q=/;(?![^(]*\))/g,X=/:([^]+)/,Z=/\/\*[^]*?\*\//g;function Y(e){let t={};return e.replace(Z,"").split(Q).forEach(e=>{if(e){let n=e.split(X);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function ee(e){let t="";if(N(e))t=e;else if(T(e))for(let n=0;n<e.length;n++){let r=ee(e[n]);r&&(t+=r+" ")}else if(E(e))for(let n in e)e[n]&&(t+=n+" ");return t.trim()}function et(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=ee(t)),n&&(e.style=G(n)),e}let en=h("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),er=h("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),ei=h("annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics"),el=h("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"),es=h("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function eo(e,t){let n,r;if(e===t)return!0;let i="[object Date]"===(n=e,I.call(n)),l="[object Date]"===(r=t,I.call(r));if(i||l)return!!i&&!!l&&e.getTime()===t.getTime();if(i=A(e),l=A(t),i||l)return e===t;if(i=T(e),l=T(t),i||l)return!!i&&!!l&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=eo(e[r],t[r]);return n}(e,t);if(i=E(e),l=E(t),i||l){if(!i||!l||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e){let r=e.hasOwnProperty(n),i=t.hasOwnProperty(n);if(r&&!i||!r&&i||!eo(e[n],t[n]))return!1}}return String(e)===String(t)}function ea(e,t){return e.findIndex(e=>eo(e,t))}let ec=e=>!!(e&&!0===e.__v_isRef),eu=e=>N(e)?e:null==e?"":T(e)||E(e)&&(e.toString===I||!w(e.toString))?ec(e)?eu(e.value):JSON.stringify(e,ed,2):String(e),ed=(e,t)=>{let n;if(ec(t))return ed(e,t.value);if("[object Map]"===(n=t,I.call(n)))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[ep(t,r)+" =>"]=n,e),{})};{let e;if("[object Set]"===(e=t,I.call(e)))return{[`Set(${t.size})`]:[...t.values()].map(e=>ep(e))};else{if(A(t))return ep(t);let e;if(E(t)&&!T(t)&&"[object Object]"!==(e=t,I.call(e)))return String(t)}}return t},ep=(e,t="")=>{var n;return A(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class eh{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=t,!e&&t&&(this.index=(t.scopes||(t.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e<t;e++)this.scopes[e].pause();for(e=0,t=this.effects.length;e<t;e++)this.effects[e].pause()}}resume(){if(this._active&&this._isPaused){let e,t;if(this._isPaused=!1,this.scopes)for(e=0,t=this.scopes.length;e<t;e++)this.scopes[e].resume();for(e=0,t=this.effects.length;e<t;e++)this.effects[e].resume()}}run(e){if(this._active){let n=t;try{return t=this,e()}finally{t=n}}}on(){1==++this._on&&(this.prevScope=t,t=this)}off(){this._on>0&&0==--this._on&&(t=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){let t,n;for(t=0,this._active=!1,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,this.effects.length=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.cleanups.length=0,this.scopes){for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!e){let e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0}}}function ef(e){return new eh(e)}function eg(){return t}function em(e,n=!1){t&&t.cleanups.push(e)}let ey=new WeakSet;class ev{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,t&&t.active&&t.effects.push(this)}pause(){this.flags|=64}resume(){64&this.flags&&(this.flags&=-65,ey.has(this)&&(ey.delete(this),this.trigger()))}notify(){(!(2&this.flags)||32&this.flags)&&(8&this.flags||e_(this))}run(){if(!(1&this.flags))return this.fn();this.flags|=2,eP(this),ex(this);let e=n,t=eE;n=this,eE=!0;try{return this.fn()}finally{eC(this),n=e,eE=t,this.flags&=-3}}stop(){if(1&this.flags){for(let e=this.deps;e;e=e.nextDep)ew(e);this.deps=this.depsTail=void 0,eP(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){64&this.flags?ey.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){ek(this)&&this.run()}get dirty(){return ek(this)}}let eb=0;function e_(e,t=!1){if(e.flags|=8,t){e.next=i,i=e;return}e.next=r,r=e}function eS(){let e;if(!(--eb>0)){if(i){let e=i;for(i=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;r;){let t=r;for(r=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function ex(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function eC(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;-1===r.version?(r===n&&(n=e),ew(r),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function ek(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(eT(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function eT(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===eM)||(e.globalVersion=eM,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!ek(e))))return;e.flags|=2;let t=e.dep,r=n,i=eE;n=e,eE=!0;try{ex(e);let n=e.fn(e._value);(0===t.version||U(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{n=r,eE=i,eC(e),e.flags&=-3}}function ew(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)ew(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}function eN(e,t){e.effect instanceof ev&&(e=e.effect.fn);let n=new ev(e);t&&S(n,t);try{n.run()}catch(e){throw n.stop(),e}let r=n.run.bind(n);return r.effect=n,r}function eA(e){e.effect.stop()}let eE=!0,eR=[];function eI(){eR.push(eE),eE=!1}function eO(){let e=eR.pop();eE=void 0===e||e}function eP(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=n;n=void 0;try{t()}finally{n=e}}}let eM=0;class eD{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class eF{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!n||!eE||n===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==n)t=this.activeLink=new eD(n,this),n.deps?(t.prevDep=n.depsTail,n.depsTail.nextDep=t,n.depsTail=t):n.deps=n.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let r=t.dep.subs;r!==t&&(t.prevSub=r,r&&(r.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=n.depsTail,t.nextDep=void 0,n.depsTail.nextDep=t,n.depsTail=t,n.deps===t&&(n.deps=e)}return t}trigger(e){this.version++,eM++,this.notify(e)}notify(e){eb++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{eS()}}}let eL=new WeakMap,e$=Symbol(""),eV=Symbol(""),eB=Symbol("");function ej(e,t,r){if(eE&&n){let t=eL.get(e);t||eL.set(e,t=new Map);let n=t.get(r);n||(t.set(r,n=new eF),n.map=t,n.key=r),n.track()}}function eU(e,t,n,r,i,l){let s=eL.get(e);if(!s)return void eM++;let o=e=>{e&&e.trigger()};if(eb++,"clear"===t)s.forEach(o);else{let i=T(e),l=i&&O(n);if(i&&"length"===n){let e=Number(r);s.forEach((t,n)=>{("length"===n||n===eB||!A(n)&&n>=e)&&o(t)})}else switch((void 0!==n||s.has(void 0))&&o(s.get(n)),l&&o(s.get(eB)),t){case"add":if(i)l&&o(s.get("length"));else{let t;o(s.get(e$));"[object Map]"===(t=e,I.call(t))&&o(s.get(eV))}break;case"delete":if(!i){let t;o(s.get(e$));"[object Map]"===(t=e,I.call(t))&&o(s.get(eV))}break;case"set":let a;"[object Map]"===(a=e,I.call(a))&&o(s.get(e$))}}eS()}function eH(e){let t=tb(e);return t===e?t:(ej(t,"iterate",eB),ty(e)?t:t.map(tS))}function eq(e){return ej(e=tb(e),"iterate",eB),e}function eW(e,t){return tm(e)?tg(e)?tx(tS(t)):tx(t):tS(t)}let eK={__proto__:null,[Symbol.iterator](){return ez(this,Symbol.iterator,e=>eW(this,e))},concat(...e){return eH(this).concat(...e.map(e=>T(e)?eH(e):e))},entries(){return ez(this,"entries",e=>(e[1]=eW(this,e[1]),e))},every(e,t){return eG(this,"every",e,t,void 0,arguments)},filter(e,t){return eG(this,"filter",e,t,e=>e.map(e=>eW(this,e)),arguments)},find(e,t){return eG(this,"find",e,t,e=>eW(this,e),arguments)},findIndex(e,t){return eG(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return eG(this,"findLast",e,t,e=>eW(this,e),arguments)},findLastIndex(e,t){return eG(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return eG(this,"forEach",e,t,void 0,arguments)},includes(...e){return eX(this,"includes",e)},indexOf(...e){return eX(this,"indexOf",e)},join(e){return eH(this).join(e)},lastIndexOf(...e){return eX(this,"lastIndexOf",e)},map(e,t){return eG(this,"map",e,t,void 0,arguments)},pop(){return eZ(this,"pop")},push(...e){return eZ(this,"push",e)},reduce(e,...t){return eQ(this,"reduce",e,t)},reduceRight(e,...t){return eQ(this,"reduceRight",e,t)},shift(){return eZ(this,"shift")},some(e,t){return eG(this,"some",e,t,void 0,arguments)},splice(...e){return eZ(this,"splice",e)},toReversed(){return eH(this).toReversed()},toSorted(e){return eH(this).toSorted(e)},toSpliced(...e){return eH(this).toSpliced(...e)},unshift(...e){return eZ(this,"unshift",e)},values(){return ez(this,"values",e=>eW(this,e))}};function ez(e,t,n){let r=eq(e),i=r[t]();return r===e||ty(e)||(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}let eJ=Array.prototype;function eG(e,t,n,r,i,l){let s=eq(e),o=s!==e&&!ty(e),a=s[t];if(a!==eJ[t]){let t=a.apply(e,l);return o?tS(t):t}let c=n;s!==e&&(o?c=function(t,r){return n.call(this,eW(e,t),r,e)}:n.length>2&&(c=function(t,r){return n.call(this,t,r,e)}));let u=a.call(s,c,r);return o&&i?i(u):u}function eQ(e,t,n,r){let i=eq(e),l=i!==e&&!ty(e),s=n,o=!1;i!==e&&(l?(o=0===r.length,s=function(t,r,i){return o&&(o=!1,t=eW(e,t)),n.call(this,t,eW(e,r),i,e)}):n.length>3&&(s=function(t,r,i){return n.call(this,t,r,i,e)}));let a=i[t](s,...r);return o?eW(e,a):a}function eX(e,t,n){let r=tb(e);ej(r,"iterate",eB);let i=r[t](...n);return(-1===i||!1===i)&&tv(n[0])?(n[0]=tb(n[0]),r[t](...n)):i}function eZ(e,t,n=[]){eI(),eb++;let r=tb(e)[t].apply(e,n);return eS(),eO(),r}let eY=h("__proto__,__v_isRef,__isVue"),e0=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(A));function e1(e){A(e)||(e=String(e));let t=tb(this);return ej(t,"has",e),t.hasOwnProperty(e)}class e2{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if("__v_isReactive"===t)return!r;if("__v_isReadonly"===t)return r;if("__v_isShallow"===t)return i;if("__v_raw"===t)return n===(r?i?tc:ta:i?to:ts).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let l=T(e);if(!r){let e;if(l&&(e=eK[t]))return e;if("hasOwnProperty"===t)return e1}let s=Reflect.get(e,t,tC(e)?e:n);if((A(t)?e0.has(t):eY(t))||(r||ej(e,"get",t),i))return s;if(tC(s)){let e=l&&O(t)?s:s.value;return r&&E(e)?tp(e):e}return E(s)?r?tp(s):tu(s):s}}class e6 extends e2{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],l=T(e)&&O(t);if(!this._isShallow){let e=tm(i);if(ty(n)||tm(n)||(i=tb(i),n=tb(n)),!l&&tC(i)&&!tC(n))if(e)return!0;else return i.value=n,!0}let s=l?Number(t)<e.length:k(e,t),o=Reflect.set(e,t,n,tC(e)?e:r);return e===tb(r)&&(s?U(n,i)&&eU(e,"set",t,n):eU(e,"add",t,n)),o}deleteProperty(e,t){let n=k(e,t);e[t];let r=Reflect.deleteProperty(e,t);return r&&n&&eU(e,"delete",t,void 0),r}has(e,t){let n=Reflect.has(e,t);return A(t)&&e0.has(t)||ej(e,"has",t),n}ownKeys(e){return ej(e,"iterate",T(e)?"length":e$),Reflect.ownKeys(e)}}class e3 extends e2{constructor(e=!1){super(!0,e)}set(e,t){return!0}deleteProperty(e,t){return!0}}let e4=new e6,e8=new e3,e5=new e6(!0),e9=new e3(!0),e7=e=>e;function te(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function tt(e,t){let n,r=(S(n={get(n){let r=this.__v_raw,i=tb(r),l=tb(n);e||(U(n,l)&&ej(i,"get",n),ej(i,"get",l));let{has:s}=Reflect.getPrototypeOf(i),o=t?e7:e?tx:tS;return s.call(i,n)?o(r.get(n)):s.call(i,l)?o(r.get(l)):void(r!==i&&r.get(n))},get size(){let t=this.__v_raw;return e||ej(tb(t),"iterate",e$),t.size},has(t){let n=this.__v_raw,r=tb(n),i=tb(t);return e||(U(t,i)&&ej(r,"has",t),ej(r,"has",i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,l=i.__v_raw,s=tb(l),o=t?e7:e?tx:tS;return e||ej(s,"iterate",e$),l.forEach((e,t)=>n.call(r,o(e),o(t),i))}},e?{add:te("add"),set:te("set"),delete:te("delete"),clear:te("clear")}:{add(e){let n=tb(this),r=Reflect.getPrototypeOf(n),i=tb(e),l=t||ty(e)||tm(e)?e:i;return r.has.call(n,l)||U(e,l)&&r.has.call(n,e)||U(i,l)&&r.has.call(n,i)||(n.add(l),eU(n,"add",l,l)),this},set(e,n){t||ty(n)||tm(n)||(n=tb(n));let r=tb(this),{has:i,get:l}=Reflect.getPrototypeOf(r),s=i.call(r,e);s||(e=tb(e),s=i.call(r,e));let o=l.call(r,e);return r.set(e,n),s?U(n,o)&&eU(r,"set",e,n):eU(r,"add",e,n),this},delete(e){let t=tb(this),{has:n,get:r}=Reflect.getPrototypeOf(t),i=n.call(t,e);i||(e=tb(e),i=n.call(t,e)),r&&r.call(t,e);let l=t.delete(e);return i&&eU(t,"delete",e,void 0),l},clear(){let e=tb(this),t=0!==e.size,n=e.clear();return t&&eU(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=function(...n){let i,l=this.__v_raw,s=tb(l),o="[object Map]"===(i=s,I.call(i)),a="entries"===r||r===Symbol.iterator&&o,c=l[r](...n),u=t?e7:e?tx:tS;return e||ej(s,"iterate","keys"===r&&o?eV:e$),S(Object.create(c),{next(){let{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:a?[u(e[0]),u(e[1])]:u(e),done:t}}})}}),n);return(t,n,i)=>"__v_isReactive"===n?!e:"__v_isReadonly"===n?e:"__v_raw"===n?t:Reflect.get(k(r,n)&&n in t?r:t,n,i)}let tn={get:tt(!1,!1)},tr={get:tt(!1,!0)},ti={get:tt(!0,!1)},tl={get:tt(!0,!0)},ts=new WeakMap,to=new WeakMap,ta=new WeakMap,tc=new WeakMap;function tu(e){return tm(e)?e:tf(e,!1,e4,tn,ts)}function td(e){return tf(e,!1,e5,tr,to)}function tp(e){return tf(e,!0,e8,ti,ta)}function th(e){return tf(e,!0,e9,tl,tc)}function tf(e,t,n,r,i){var l;let s;if(!E(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;let o=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((s=l,I.call(s)).slice(8,-1));if(0===o)return e;let a=i.get(e);if(a)return a;let c=new Proxy(e,2===o?r:n);return i.set(e,c),c}function tg(e){return tm(e)?tg(e.__v_raw):!!(e&&e.__v_isReactive)}function tm(e){return!!(e&&e.__v_isReadonly)}function ty(e){return!!(e&&e.__v_isShallow)}function tv(e){return!!e&&!!e.__v_raw}function tb(e){let t=e&&e.__v_raw;return t?tb(t):e}function t_(e){return!k(e,"__v_skip")&&Object.isExtensible(e)&&q(e,"__v_skip",!0),e}let tS=e=>E(e)?tu(e):e,tx=e=>E(e)?tp(e):e;function tC(e){return!!e&&!0===e.__v_isRef}function tk(e){return tw(e,!1)}function tT(e){return tw(e,!0)}function tw(e,t){return tC(e)?e:new tN(e,t)}class tN{constructor(e,t){this.dep=new eF,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:tb(e),this._value=t?e:tS(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||ty(e)||tm(e);U(e=n?e:tb(e),t)&&(this._rawValue=e,this._value=n?e:tS(e),this.dep.trigger())}}function tA(e){e.dep&&e.dep.trigger()}function tE(e){return tC(e)?e.value:e}function tR(e){return w(e)?e():tE(e)}let tI={get:(e,t,n)=>"__v_raw"===t?e:tE(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return tC(i)&&!tC(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function tO(e){return tg(e)?e:new Proxy(e,tI)}class tP{constructor(e){this.__v_isRef=!0,this._value=void 0;let t=this.dep=new eF,{get:n,set:r}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=r}get value(){return this._value=this._get()}set value(e){this._set(e)}}function tM(e){return new tP(e)}function tD(e){let t=T(e)?Array(e.length):{};for(let n in e)t[n]=new tF(e,n,void 0);return t}class tF{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=A(t)?t:String(t),this._raw=tb(e);let r=!0,i=e;if(!T(e)||A(this._key)||!O(this._key))do r=!tv(i)||ty(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let e=this._object[this._key];return this._shallow&&(e=tE(e)),this._value=void 0===e?this._defaultValue:e}set value(e){if(this._shallow&&tC(this._raw[this._key])){let t=this._object[this._key];if(tC(t)){t.value=e;return}}this._object[this._key]=e}get dep(){var e,t;let n;return e=this._raw,t=this._key,(n=eL.get(e))&&n.get(t)}}class tL{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function t$(e,t,n){if(tC(e))return e;if(w(e))return new tL(e);if(!E(e)||!(arguments.length>1))return tk(e);return new tF(e,t,n)}class tV{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new eF(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=eM-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&n!==this)return e_(this,!0),!0}get value(){let e=this.dep.track();return eT(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let tB={GET:"get",HAS:"has",ITERATE:"iterate"},tj={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},tU={},tH=new WeakMap;function tq(){return d}function tW(e,t=!1,n=d){if(n){let t=tH.get(n);t||tH.set(n,t=[]),t.push(e)}}function tK(e,t=1/0,n){if(t<=0||!E(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,tC(e))tK(e.value,t,n);else if(T(e))for(let r=0;r<e.length;r++)tK(e[r],t,n);else{let r,i;if("[object Set]"===(r=e,I.call(r))||"[object Map]"===(i=e,I.call(i)))e.forEach(e=>{tK(e,t,n)});else{let r;if("[object Object]"===(r=e,I.call(r))){for(let r in e)tK(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&tK(e[r],t,n)}}}return e}function tz(e,t){}let tJ={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"};function tG(e,t,n,r){try{return r?e(...r):e()}catch(e){tX(e,t,n)}}function tQ(e,t,n,r){if(w(e)){let i=tG(e,t,n,r);return i&&R(i)&&i.catch(e=>{tX(e,t,n)}),i}if(T(e)){let i=[];for(let l=0;l<e.length;l++)i.push(tQ(e[l],t,n,r));return i}}function tX(e,t,n,r=!0){let i=t?t.vnode:null,{errorHandler:l,throwUnhandledErrorInProduction:s}=t&&t.appContext.config||f;if(t){let r=t.parent,i=t.proxy,s=`https://vuejs.org/error-reference/#runtime-${n}`;for(;r;){let t=r.ec;if(t){for(let n=0;n<t.length;n++)if(!1===t[n](e,i,s))return}r=r.parent}if(l){eI(),tG(l,null,10,[e,i,s]),eO();return}}!function(e,t=!0,n=!1){if(n)throw e;console.error(e)}(e,r,s)}let tZ=[],tY=-1,t0=[],t1=null,t2=0,t6=Promise.resolve(),t3=null;function t4(e){let t=t3||t6;return e?t.then(this?e.bind(this):e):t}function t8(e){if(!(1&e.flags)){let t=nt(e),n=tZ[tZ.length-1];!n||!(2&e.flags)&&t>=nt(n)?tZ.push(e):tZ.splice(function(e){let t=tY+1,n=tZ.length;for(;t<n;){let r=t+n>>>1,i=tZ[r],l=nt(i);l<e||l===e&&2&i.flags?t=r+1:n=r}return t}(t),0,e),e.flags|=1,t5()}}function t5(){t3||(t3=t6.then(function e(t){try{for(tY=0;tY<tZ.length;tY++){let e=tZ[tY];e&&!(8&e.flags)&&(4&e.flags&&(e.flags&=-2),tG(e,e.i,e.i?15:14),4&e.flags||(e.flags&=-2))}}finally{for(;tY<tZ.length;tY++){let e=tZ[tY];e&&(e.flags&=-2)}tY=-1,tZ.length=0,ne(),t3=null,(tZ.length||t0.length)&&e()}}))}function t9(e){T(e)?t0.push(...e):t1&&-1===e.id?t1.splice(t2+1,0,e):1&e.flags||(t0.push(e),e.flags|=1),t5()}function t7(e,t,n=tY+1){for(;n<tZ.length;n++){let t=tZ[n];if(t&&2&t.flags){if(e&&t.id!==e.uid)continue;tZ.splice(n,1),n--,4&t.flags&&(t.flags&=-2),t(),4&t.flags||(t.flags&=-2)}}}function ne(e){if(t0.length){let e=[...new Set(t0)].sort((e,t)=>nt(e)-nt(t));if(t0.length=0,t1)return void t1.push(...e);for(t2=0,t1=e;t2<t1.length;t2++){let e=t1[t2];4&e.flags&&(e.flags&=-2),8&e.flags||e(),e.flags&=-2}t1=null,t2=0}}let nt=e=>null==e.id?2&e.flags?-1:1/0:e.id,nn=null,nr=null;function ni(e){let t=nn;return nn=e,nr=e&&e.type.__scopeId||null,t}function nl(e){nr=e}function ns(){nr=null}let no=e=>na;function na(e,t=nn,n){if(!t||e._n)return e;let r=(...n)=>{let i;r._d&&i8(-1);let l=ni(t);try{i=e(...n)}finally{ni(l),r._d&&i8(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function nc(e,t){if(null===nn)return e;let n=lP(nn),r=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[i,l,s,o=f]=t[e];i&&(w(i)&&(i={mounted:i,updated:i}),i.deep&&tK(l),r.push({dir:i,instance:n,value:l,oldValue:void 0,arg:s,modifiers:o}))}return e}function nu(e,t,n,r){let i=e.dirs,l=t&&t.dirs;for(let s=0;s<i.length;s++){let o=i[s];l&&(o.oldValue=l[s].value);let a=o.dir[r];a&&(eI(),tQ(a,n,8,[e.el,o,e,t]),eO())}}function nd(e,t){if(l_){let n=l_.provides,r=l_.parent&&l_.parent.provides;r===n&&(n=l_.provides=Object.create(r)),n[e]=t}}function np(e,t,n=!1){let r=lS();if(r||ic){let i=ic?ic._context.provides:r?null==r.parent||r.ce?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return n&&w(t)?t.call(r&&r.proxy):t}}function nh(){return!!(lS()||ic)}let nf=Symbol.for("v-scx"),ng=()=>np(nf);function nm(e,t){return n_(e,null,t)}function ny(e,t){return n_(e,null,{flush:"post"})}function nv(e,t){return n_(e,null,{flush:"sync"})}function nb(e,t,n){return n_(e,t,n)}function n_(e,t,n=f){let r,{immediate:i,flush:l}=n,s=S({},n),o=t&&i||!t&&"post"!==l;if(lT){if("sync"===l){let e=ng();r=e.__watcherHandles||(e.__watcherHandles=[])}else if(!o){let e=()=>{};return e.stop=m,e.resume=m,e.pause=m,e}}let a=l_;s.call=(e,t,n)=>tQ(e,a,t,n);let c=!1;"post"===l?s.scheduler=e=>{iM(e,a&&a.suspense)}:"sync"!==l&&(c=!0,s.scheduler=(e,t)=>{t?e():t8(e)}),s.augmentJob=e=>{t&&(e.flags|=4),c&&(e.flags|=2,a&&(e.id=a.uid,e.i=a))};let u=function(e,t,n=f){let r,i,l,s,{immediate:o,deep:a,once:c,scheduler:u,augmentJob:p,call:h}=n,g=e=>a?e:ty(e)||!1===a||0===a?tK(e,1):tK(e),y=!1,b=!1;if(tC(e)?(i=()=>e.value,y=ty(e)):tg(e)?(i=()=>g(e),y=!0):T(e)?(b=!0,y=e.some(e=>tg(e)||ty(e)),i=()=>e.map(e=>tC(e)?e.value:tg(e)?g(e):w(e)?h?h(e,2):e():void 0)):i=w(e)?t?h?()=>h(e,2):e:()=>{if(l){eI();try{l()}finally{eO()}}let t=d;d=r;try{return h?h(e,3,[s]):e(s)}finally{d=t}}:m,t&&a){let e=i,t=!0===a?1/0:a;i=()=>tK(e(),t)}let _=eg(),S=()=>{r.stop(),_&&_.active&&x(_.effects,r)};if(c&&t){let e=t;t=(...t)=>{e(...t),S()}}let C=b?Array(e.length).fill(tU):tU,k=e=>{if(1&r.flags&&(r.dirty||e))if(t){let e=r.run();if(a||y||(b?e.some((e,t)=>U(e,C[t])):U(e,C))){l&&l();let n=d;d=r;try{let n=[e,C===tU?void 0:b&&C[0]===tU?[]:C,s];C=e,h?h(t,3,n):t(...n)}finally{d=n}}}else r.run()};return p&&p(k),(r=new ev(i)).scheduler=u?()=>u(k,!1):k,s=e=>tW(e,!1,r),l=r.onStop=()=>{let e=tH.get(r);if(e){if(h)h(e,4);else for(let t of e)t();tH.delete(r)}},t?o?k(!0):C=r.run():u?u(k.bind(null,!0),!0):r.run(),S.pause=r.pause.bind(r),S.resume=r.resume.bind(r),S.stop=S,S}(e,t,s);return lT&&(r?r.push(u):o&&u()),u}function nS(e,t,n){let r,i=this.proxy,l=N(e)?e.includes(".")?nx(i,e):()=>i[e]:e.bind(i,i);w(t)?r=t:(r=t.handler,n=t);let s=lx(this),o=n_(l,r.bind(i),n);return s(),o}function nx(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}let nC=new WeakMap,nk=Symbol("_vte"),nT=e=>e&&(e.disabled||""===e.disabled),nw=e=>"u">typeof SVGElement&&e instanceof SVGElement,nN=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,nA=(e,t)=>{let n=e&&e.to;return N(n)?t?t(n):null:n};function nE(e,t,n,{o:{insert:r},m:i},l=2){0===l&&r(e.targetAnchor,t,n);let{el:s,anchor:o,shapeFlag:a,children:c,props:u}=e,d=2===l;if(d&&r(s,t,n),(!d||nT(u))&&16&a)for(let e=0;e<c.length;e++)i(c[e],t,n,2);d&&r(o,t,n)}let nR={name:"Teleport",__isTeleport:!0,process(e,t,n,r,i,l,s,o,a,c){let{mc:u,pc:d,pbc:p,o:{insert:h,querySelector:f,createText:g}}=c,m=nT(t.props),{dynamicChildren:y}=t,b=(e,t,n)=>{16&e.shapeFlag&&u(e.children,t,n,i,l,s,o,a)},_=(e=t)=>{let n=nT(e.props),r=e.target=nA(e.props,f),l=nO(r,e,g,h);r&&("svg"!==s&&nw(r)?s="svg":"mathml"!==s&&nN(r)&&(s="mathml"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(r),n||(b(e,r,l),nI(e,!1)))},S=e=>{let t=()=>{nC.get(e)===t&&(nC.delete(e),nT(e.props)&&(b(e,n,e.anchor),nI(e,!0)),_(e))};nC.set(e,t),iM(t,l)};if(null==e){let e,i=t.el=g(""),s=t.anchor=g("");if(h(i,n,r),h(s,n,r),(e=t.props)&&(e.defer||""===e.defer)||l&&l.pendingBranch)return void S(t);m&&(b(t,n,s),nI(t,!0)),_()}else{t.el=e.el;let r=t.anchor=e.anchor,u=nC.get(e);if(u){u.flags|=8,nC.delete(e),S(t);return}t.targetStart=e.targetStart;let h=t.target=e.target,g=t.targetAnchor=e.targetAnchor,b=nT(e.props),_=b?n:h,x=b?r:g;if("svg"===s||nw(h)?s="svg":("mathml"===s||nN(h))&&(s="mathml"),y?(p(e.dynamicChildren,y,_,i,l,s,o),ij(e,t,!0)):a||d(e,t,_,x,i,l,s,o,!1),m)b?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):nE(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=t.target=nA(t.props,f);e&&nE(t,e,null,c,0)}else b&&nE(t,h,g,c,1);nI(t,m)}},remove(e,t,n,{um:r,o:{remove:i}},l){let{shapeFlag:s,children:o,anchor:a,targetStart:c,targetAnchor:u,target:d,props:p}=e,h=l||!nT(p),f=nC.get(e);if(f&&(f.flags|=8,nC.delete(e),h=!1),d&&(i(c),i(u)),l&&i(a),16&s)for(let e=0;e<o.length;e++){let i=o[e];r(i,t,n,h,!!i.dynamicChildren)}},move:nE,hydrate:function(e,t,n,r,i,l,{o:{nextSibling:s,parentNode:o,querySelector:a,insert:c,createText:u}},d){function p(e,n){let r=n;for(;r;){if(r&&8===r.nodeType){if("teleport start anchor"===r.data)t.targetStart=r;else if("teleport anchor"===r.data){t.targetAnchor=r,e._lpa=t.targetAnchor&&s(t.targetAnchor);break}}r=s(r)}}function h(e,t){t.anchor=d(s(e),t,o(e),n,r,i,l)}let f=t.target=nA(t.props,a),g=nT(t.props);if(f){let a=f._lpa||f.firstChild;16&t.shapeFlag&&(g?(h(e,t),p(f,a),t.targetAnchor||nO(f,t,u,c,o(e)===f?e:null)):(t.anchor=s(e),p(f,a),t.targetAnchor||nO(f,t,u,c),d(a&&s(a),t,f,n,r,i,l))),nI(t,g)}else g&&16&t.shapeFlag&&(h(e,t),t.targetStart=e,t.targetAnchor=s(e));return t.anchor&&s(t.anchor)}};function nI(e,t){let n=e.ctx;if(n&&n.ut){let r,i;for(t?(r=e.el,i=e.anchor):(r=e.targetStart,i=e.targetAnchor);r&&r!==i;)1===r.nodeType&&r.setAttribute("data-v-owner",n.uid),r=r.nextSibling;n.ut()}}function nO(e,t,n,r,i=null){let l=t.targetStart=n(""),s=t.targetAnchor=n("");return l[nk]=s,e&&(r(l,e,i),r(s,e,i)),s}let nP=Symbol("_leaveCb"),nM=Symbol("_enterCb");function nD(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return rb(()=>{e.isMounted=!0}),rx(()=>{e.isUnmounting=!0}),e}let nF=[Function,Array],nL={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:nF,onEnter:nF,onAfterEnter:nF,onEnterCancelled:nF,onBeforeLeave:nF,onLeave:nF,onAfterLeave:nF,onLeaveCancelled:nF,onBeforeAppear:nF,onAppear:nF,onAfterAppear:nF,onAppearCancelled:nF},n$=e=>{let t=e.subTree;return t.component?n$(t.component):t};function nV(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==iY){t=n;break}}return t}let nB={name:"BaseTransition",props:nL,setup(e,{slots:t}){let n=lS(),r=nD();return()=>{let i=t.default&&nK(t.default(),!0);if(!i||!i.length)return;let l=nV(i),s=tb(e),{mode:o}=s;if(r.isLeaving)return nH(l);let a=nq(l);if(!a)return nH(l);let c=nU(a,s,r,n,e=>c=e);a.type!==iY&&nW(a,c);let u=n.subTree&&nq(n.subTree);if(u&&u.type!==iY&&!lt(u,a)&&n$(n).type!==iY){let e=nU(u,s,r,n);if(nW(u,e),"out-in"===o&&a.type!==iY)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,u=void 0},nH(l);"in-out"===o&&a.type!==iY?e.delayLeave=(e,t,n)=>{nj(r,u)[String(u.key)]=u,e[nP]=()=>{t(),e[nP]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{n(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return l}}};function nj(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function nU(e,t,n,r,i){let{appear:l,mode:s,persisted:o=!1,onBeforeEnter:a,onEnter:c,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:p,onLeave:h,onAfterLeave:f,onLeaveCancelled:g,onBeforeAppear:m,onAppear:y,onAfterAppear:b,onAppearCancelled:_}=t,S=String(e.key),x=nj(n,e),C=(e,t)=>{e&&tQ(e,r,9,t)},k=(e,t)=>{let n=t[1];C(e,t),T(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},w={mode:s,persisted:o,beforeEnter(t){let r=a;if(!n.isMounted)if(!l)return;else r=m||a;t[nP]&&t[nP](!0);let i=x[S];i&&lt(e,i)&&i.el[nP]&&i.el[nP](),C(r,[t])},enter(t){if(x[S]===e)return;let r=c,i=u,s=d;if(!n.isMounted)if(!l)return;else r=y||c,i=b||u,s=_||d;let o=!1;t[nM]=e=>{o||(o=!0,e?C(s,[t]):C(i,[t]),w.delayedLeave&&w.delayedLeave(),t[nM]=void 0)};let a=t[nM].bind(null,!1);r?k(r,[t,a]):a()},leave(t,r){let i=String(e.key);if(t[nM]&&t[nM](!0),n.isUnmounting)return r();C(p,[t]);let l=!1;t[nP]=n=>{l||(l=!0,r(),n?C(g,[t]):C(f,[t]),t[nP]=void 0,x[i]===e&&delete x[i])};let s=t[nP].bind(null,!1);x[i]=e,h?k(h,[t,s]):s()},clone(e){let l=nU(e,t,n,r,i);return i&&i(l),l}};return w}function nH(e){if(ra(e))return(e=la(e)).children=null,e}function nq(e){if(!ra(e))return e.type.__isTeleport&&e.children?nV(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&w(n.default))return n.default()}}function nW(e,t){6&e.shapeFlag&&e.component?(e.transition=t,nW(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function nK(e,t=!1,n){let r=[],i=0;for(let l=0;l<e.length;l++){let s=e[l],o=null==n?s.key:String(n)+String(null!=s.key?s.key:l);s.type===iX?(128&s.patchFlag&&i++,r=r.concat(nK(s.children,t,o))):(t||s.type!==iY)&&r.push(null!=o?la(s,{key:o}):s)}if(i>1)for(let e=0;e<r.length;e++)r[e].patchFlag=-2;return r}function nz(e,t){return w(e)?S({name:e.name},t,{setup:e}):e}function nJ(){let e=lS();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""}function nG(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function nQ(e){let t=lS(),n=tT(null);return t&&Object.defineProperty(t.refs===f?t.refs={}:t.refs,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e}),n}function nX(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}let nZ=new WeakMap;function nY(e,t,n,r,i=!1){if(T(e))return void e.forEach((e,l)=>nY(e,t&&(T(t)?t[l]:t),n,r,i));if(rl(r)&&!i){512&r.shapeFlag&&r.type.__asyncResolved&&r.component.subTree.component&&nY(e,t,n,r.component.subTree);return}let l=4&r.shapeFlag?lP(r.component):r.el,s=i?null:l,{i:o,r:a}=e,c=t&&t.r,u=o.refs===f?o.refs={}:o.refs,d=o.setupState,p=tb(d),h=d===f?y:e=>!nX(u,e)&&k(p,e),g=(e,t)=>!(t&&nX(u,t));if(null!=c&&c!==a&&(n0(t),N(c)?(u[c]=null,h(c)&&(d[c]=null)):tC(c)&&(g(c,t.k)&&(c.value=null),t.k&&(u[t.k]=null))),w(a))tG(a,o,12,[s,u]);else{let t=N(a),r=tC(a);if(t||r){let o=()=>{if(e.f){let n=t?h(a)?d[a]:u[a]:g()||!e.k?a.value:u[e.k];if(i)T(n)&&x(n,l);else if(T(n))n.includes(l)||n.push(l);else if(t)u[a]=[l],h(a)&&(d[a]=u[a]);else{let t=[l];g(a,e.k)&&(a.value=t),e.k&&(u[e.k]=t)}}else t?(u[a]=s,h(a)&&(d[a]=s)):r&&(g(a,e.k)&&(a.value=s),e.k&&(u[e.k]=s))};if(s){let t=()=>{o(),nZ.delete(e)};t.id=-1,nZ.set(e,t),iM(t,n)}else n0(e),o()}}}function n0(e){let t=nZ.get(e);t&&(t.flags|=8,nZ.delete(e))}let n1=!1,n2=()=>{n1||(console.error("Hydration completed but contains mismatches."),n1=!0)},n6=e=>{if(1===e.nodeType){if(e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)return"svg";if(e.namespaceURI.includes("MathML"))return"mathml"}},n3=e=>8===e.nodeType;function n4(e){let{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:l,parentNode:s,remove:o,insert:a,createComment:c}}=e,u=(n,r,o,c,b,_=!1)=>{_=_||!!r.dynamicChildren;let S=n3(n)&&"["===n.data,x=()=>f(n,r,o,c,b,S),{type:C,ref:k,shapeFlag:T,patchFlag:w}=r,N=n.nodeType;r.el=n,-2===w&&(_=!1,r.dynamicChildren=null);let A=null;switch(C){case iZ:3!==N?""===r.children?(a(r.el=i(""),s(n),n),A=n):A=x():(n.data!==r.children&&(n2(),n.data=r.children),A=l(n));break;case iY:y(n)?(A=l(n),m(r.el=n.content.firstChild,n,o)):A=8!==N||S?x():l(n);break;case i0:if(S&&(N=(n=l(n)).nodeType),1===N||3===N){A=n;let e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=1===A.nodeType?A.outerHTML:A.data),t===r.staticCount-1&&(r.anchor=A),A=l(A);return S?l(A):A}x();break;case iX:A=S?h(n,r,o,c,b,_):x();break;default:if(1&T)A=1===N&&r.type.toLowerCase()===n.tagName.toLowerCase()||y(n)?d(n,r,o,c,b,_):x();else if(6&T){r.slotScopeIds=b;let e=s(n);if(A=S?g(n):n3(n)&&"teleport start"===n.data?g(n,n.data,"teleport end"):l(n),t(r,e,null,o,c,n6(e),_),rl(r)&&!r.type.__asyncResolved){let t;S?(t=ls(iX)).anchor=A?A.previousSibling:e.lastChild:t=3===n.nodeType?lc(""):ls("div"),t.el=n,r.component.subTree=t}}else 64&T?A=8!==N?x():r.type.hydrate(n,r,o,c,b,_,e,p):128&T&&(A=r.type.hydrate(n,r,o,c,n6(s(n)),b,_,e,u))}return null!=k&&nY(k,null,c,r),A},d=(e,t,n,i,l,s)=>{s=s||!!t.dynamicChildren;let{type:a,props:c,patchFlag:u,shapeFlag:d,dirs:h,transition:f}=t,g="input"===a||"option"===a;if(g||-1!==u){let a;h&&nu(t,null,n,"created");let _=!1;if(y(e)){_=iB(null,f)&&n&&n.vnode.props&&n.vnode.props.appear;let r=e.content.firstChild;if(_){let e=r.getAttribute("class");e&&(r.$cls=e),f.beforeEnter(r)}m(r,e,n),t.el=e=r}if(16&d&&!(c&&(c.innerHTML||c.textContent))){let r=p(e.firstChild,t,e,n,i,l,s);for(;r;){n9(e,1)||n2();let t=r;r=r.nextSibling,o(t)}}else if(8&d){let n=t.children;`
-`===n[0]&&("PRE"===e.tagName||"TEXTAREA"===e.tagName)&&(n=n.slice(1));let{textContent:r}=e;r!==n&&r!==n.replace(/\r\n|\r/g,`
-`)&&(n9(e,0)||n2(),e.textContent=t.children)}if(c){if(g||!s||48&u){let t=e.tagName.includes("-");for(let i in c)(g&&(i.endsWith("value")||"indeterminate"===i)||b(i)&&!P(i)||"."===i[0]||t&&!P(i))&&r(e,i,null,c[i],void 0,n)}else if(c.onClick)r(e,"onClick",null,c.onClick,void 0,n);else if(4&u&&tg(c.style))for(let e in c.style)c.style[e]}(a=c&&c.onVnodeBeforeMount)&&lm(a,n,t),h&&nu(t,null,n,"beforeMount"),((a=c&&c.onVnodeMounted)||h||_)&&iG(()=>{a&&lm(a,n,t),_&&f.enter(e),h&&nu(t,null,n,"mounted")},i)}return e.nextSibling},p=(e,t,r,s,o,c,d)=>{d=d||!!t.dynamicChildren;let p=t.children,h=p.length;for(let t=0;t<h;t++){let f=d?p[t]:p[t]=lp(p[t]),g=f.type===iZ;e?(g&&!d&&t+1<h&&lp(p[t+1]).type===iZ&&(a(i(e.data.slice(f.children.length)),r,l(e)),e.data=f.children),e=u(e,f,s,o,c,d)):g&&!f.children?a(f.el=i(""),r):(n9(r,1)||n2(),n(null,f,r,null,s,o,n6(r),c))}return e},h=(e,t,n,r,i,o)=>{let{slotScopeIds:u}=t;u&&(i=i?i.concat(u):u);let d=s(e),h=p(l(e),t,d,n,r,i,o);return h&&n3(h)&&"]"===h.data?l(t.anchor=h):(n2(),a(t.anchor=c("]"),d,h),h)},f=(e,t,r,i,a,c)=>{if(n9(e.parentElement,1)||n2(),t.el=null,c){let t=g(e);for(;;){let n=l(e);if(n&&n!==t)o(n);else break}}let u=l(e),d=s(e);return o(e),n(null,t,d,u,r,i,n6(d),a),r&&(r.vnode.el=t.el,iS(r,t.el)),u},g=(e,t="[",n="]")=>{let r=0;for(;e;)if((e=l(e))&&n3(e)&&(e.data===t&&r++,e.data===n))if(0===r)return l(e);else r--;return e},m=(e,t,n)=>{let r=t.parentNode;r&&r.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},y=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes()){n(null,e,t),ne(),t._vnode=e;return}u(t.firstChild,e,null,null,null),ne(),t._vnode=e},u]}let n8="data-allow-mismatch",n5={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function n9(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(n8);)e=e.parentElement;let n=e&&e.getAttribute(n8);if(null==n)return!1;{if(""===n)return!0;let e=n.split(",");return!!(0===t&&e.includes("children"))||e.includes(n5[t])}}let n7=z().requestIdleCallback||(e=>setTimeout(e,1)),re=z().cancelIdleCallback||(e=>clearTimeout(e)),rt=(e=1e4)=>t=>{let n=n7(t,{timeout:e});return()=>re(n)},rn=e=>(t,n)=>{let r=new IntersectionObserver(e=>{for(let n of e)if(n.isIntersecting){r.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element){if(function(e){let{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:l,innerWidth:s}=window;return(t>0&&t<l||r>0&&r<l)&&(n>0&&n<s||i>0&&i<s)}(e))return t(),r.disconnect(),!1;r.observe(e)}}),()=>r.disconnect()},rr=e=>t=>{if(e){let n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},ri=(e=[])=>(t,n)=>{N(e)&&(e=[e]);let r=!1,i=e=>{r||(r=!0,l(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},l=()=>{n(t=>{for(let n of e)t.removeEventListener(n,i)})};return n(t=>{for(let n of e)t.addEventListener(n,i,{once:!0})}),l},rl=e=>!!e.type.__asyncLoader;function rs(e){let t;w(e)&&(e={loader:e});let{loader:n,loadingComponent:r,errorComponent:i,delay:l=200,hydrate:s,timeout:o,suspensible:a=!0,onError:c}=e,u=null,d=0,p=()=>{let e;return u||(e=u=n().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),c)return new Promise((t,n)=>{c(e,()=>t((d++,u=null,p())),()=>n(e),d+1)});throw e}).then(n=>e!==u&&u?u:(n&&(n.__esModule||"Module"===n[Symbol.toStringTag])&&(n=n.default),t=n,n)))};return nz({name:"AsyncComponentWrapper",__asyncLoader:p,__asyncHydrate(e,n,r){let i=!1;(n.bu||(n.bu=[])).push(()=>i=!0);let l=()=>{i||r()},o=s?()=>{let t=s(l,t=>(function(e,t){if(n3(e)&&"["===e.data){let n=1,r=e.nextSibling;for(;r;){if(1===r.nodeType){if(!1===t(r))break}else if(n3(r))if("]"===r.data){if(0==--n)break}else"["===r.data&&n++;r=r.nextSibling}}else t(e)})(e,t));t&&(n.bum||(n.bum=[])).push(t)}:l;t?o():p().then(()=>!n.isUnmounted&&o())},get __asyncResolved(){return t},setup(){let e=l_;if(nG(e),t)return()=>ro(t,e);let n=t=>{u=null,tX(t,e,13,!i)};if(a&&e.suspense||lT)return p().then(t=>()=>ro(t,e)).catch(e=>(n(e),()=>i?ls(i,{error:e}):null));let s=tk(!1),c=tk(),d=tk(!!l);return l&&setTimeout(()=>{d.value=!1},l),null!=o&&setTimeout(()=>{if(!s.value&&!c.value){let e=Error(`Async component timed out after ${o}ms.`);n(e),c.value=e}},o),p().then(()=>{s.value=!0,e.parent&&ra(e.parent.vnode)&&e.parent.update()}).catch(e=>{n(e),c.value=e}),()=>s.value&&t?ro(t,e):c.value&&i?ls(i,{error:c.value}):r&&!d.value?ro(r,e):void 0}})}function ro(e,t){let{ref:n,props:r,children:i,ce:l}=t.vnode,s=ls(e,r,i);return s.ref=n,s.ce=l,delete t.vnode.ce,s}let ra=e=>e.type.__isKeepAlive,rc={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=lS(),r=n.ctx;if(!r.renderer)return()=>{let e=t.default&&t.default();return e&&1===e.length?e[0]:e};let i=new Map,l=new Set,s=null,o=n.suspense,{renderer:{p:a,m:c,um:u,o:{createElement:d}}}=r,p=d("div");function h(e){rf(e),u(e,n,o,!0)}function f(e){i.forEach((t,n)=>{let r=lM(rl(t)?t.type.__asyncResolved||{}:t.type);r&&!e(r)&&g(n)})}function g(e){let t=i.get(e);!t||s&&lt(t,s)?s&&rf(s):h(t),i.delete(e),l.delete(e)}r.activate=(e,t,n,r,i)=>{let l=e.component;c(e,t,n,0,o),a(l.vnode,e,t,n,l,o,r,e.slotScopeIds,i),iM(()=>{l.isDeactivated=!1,l.a&&H(l.a);let t=e.props&&e.props.onVnodeMounted;t&&lm(t,l.parent,e)},o)},r.deactivate=e=>{let t=e.component;iU(t.m),iU(t.a),c(e,p,null,1,o),iM(()=>{t.da&&H(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&lm(n,t.parent,e),t.isDeactivated=!0},o)},nb(()=>[e.include,e.exclude],([e,t])=>{e&&f(t=>ru(e,t)),t&&f(e=>!ru(t,e))},{flush:"post",deep:!0});let m=null,y=()=>{null!=m&&(iH(n.subTree.type)?iM(()=>{i.set(m,rg(n.subTree))},n.subTree.suspense):i.set(m,rg(n.subTree)))};return rb(y),rS(y),rx(()=>{i.forEach(e=>{let{subTree:t,suspense:r}=n,i=rg(t);if(e.type===i.type&&e.key===i.key){rf(i);let e=i.component.da;e&&iM(e,r);return}h(e)})}),()=>{if(m=null,!t.default)return s=null;let n=t.default(),r=n[0];if(n.length>1)return s=null,n;if(!le(r)||!(4&r.shapeFlag)&&!(128&r.shapeFlag))return s=null,r;let o=rg(r);if(o.type===iY)return s=null,o;let a=o.type,c=lM(rl(o)?o.type.__asyncResolved||{}:a),{include:u,exclude:d,max:p}=e;if(u&&(!c||!ru(u,c))||d&&c&&ru(d,c))return o.shapeFlag&=-257,s=o,r;let h=null==o.key?a:o.key,f=i.get(h);return o.el&&(o=la(o),128&r.shapeFlag&&(r.ssContent=o)),m=h,f?(o.el=f.el,o.component=f.component,o.transition&&nW(o,o.transition),o.shapeFlag|=512,l.delete(h),l.add(h)):(l.add(h),p&&l.size>parseInt(p,10)&&g(l.values().next().value)),o.shapeFlag|=256,s=o,iH(r.type)?r:o}}};function ru(e,t){let n;if(T(e))return e.some(e=>ru(e,t));if(N(e))return e.split(",").includes(t);return"[object RegExp]"===(n=e,I.call(n))&&(e.lastIndex=0,e.test(t))}function rd(e,t){rh(e,"a",t)}function rp(e,t){rh(e,"da",t)}function rh(e,t,n=l_){let r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(rm(t,r,n),n){let e=n.parent;for(;e&&e.parent;)ra(e.parent.vnode)&&function(e,t,n,r){let i=rm(t,e,r,!0);rC(()=>{x(r[t],i)},n)}(r,t,n,e),e=e.parent}}function rf(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function rg(e){return 128&e.shapeFlag?e.ssContent:e}function rm(e,t,n=l_,r=!1){if(n){let i=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...r)=>{eI();let i=lx(n),l=tQ(t,n,e,r);return i(),eO(),l});return r?i.unshift(l):i.push(l),l}}let ry=e=>(t,n=l_)=>{lT&&"sp"!==e||rm(e,(...e)=>t(...e),n)},rv=ry("bm"),rb=ry("m"),r_=ry("bu"),rS=ry("u"),rx=ry("bum"),rC=ry("um"),rk=ry("sp"),rT=ry("rtg"),rw=ry("rtc");function rN(e,t=l_){rm("ec",e,t)}let rA="components";function rE(e,t){return rP(rA,e,!0,t)||e}let rR=Symbol.for("v-ndc");function rI(e){return N(e)?rP(rA,e,!1)||e:e||rR}function rO(e){return rP("directives",e)}function rP(e,t,n=!0,r=!1){let i=nn||l_;if(i){let n=i.type;if(e===rA){let e=lM(n,!1);if(e&&(e===t||e===L(t)||e===B(L(t))))return n}let l=rM(i[e]||n[e],t)||rM(i.appContext[e],t);return!l&&r?n:l}}function rM(e,t){return e&&(e[t]||e[L(t)]||e[B(L(t))])}function rD(e,t,n,r){let i,l=n&&n[r],s=T(e);if(s||N(e)){let n=s&&tg(e),r=!1,o=!1;n&&(r=!ty(e),o=tm(e),e=eq(e)),i=Array(e.length);for(let n=0,s=e.length;n<s;n++)i[n]=t(r?o?tx(tS(e[n])):tS(e[n]):e[n],n,void 0,l&&l[n])}else if("number"==typeof e){i=Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,l&&l[n])}else if(E(e))if(e[Symbol.iterator])i=Array.from(e,(e,n)=>t(e,n,void 0,l&&l[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,s=n.length;r<s;r++){let s=n[r];i[r]=t(e[s],s,r,l&&l[r])}}else i=[];return n&&(n[r]=i),i}function rF(e,t){for(let n=0;n<t.length;n++){let r=t[n];if(T(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.key?(...e)=>{let t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function rL(e,t,n={},r,i){if(nn.ce||nn.parent&&rl(nn.parent)&&nn.parent.ce){let e=Object.keys(n).length>0;return"default"!==t&&(n.name=t),i6(),i7(iX,null,[ls("slot",n,r&&r())],e?-2:64)}let l=e[t];l&&l._c&&(l._d=!1),i6();let s=l&&r$(l(n)),o=n.key||s&&s.key,a=i7(iX,{key:(o&&!A(o)?o:`_${t}`)+(!s&&r?"_fb":"")},s||(r?r():[]),s&&1===e._?64:-2);return!i&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),l&&l._c&&(l._d=!0),a}function r$(e){return e.some(e=>!le(e)||e.type!==iY&&(e.type!==iX||!!r$(e.children)))?e:null}function rV(e,t){let n={};for(let r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:j(r)]=e[r];return n}let rB=e=>e?lk(e)?lP(e):rB(e.parent):null,rj=S(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>rB(e.parent),$root:e=>rB(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>r9(e),$forceUpdate:e=>e.f||(e.f=()=>{t8(e.update)}),$nextTick:e=>e.n||(e.n=t4.bind(e.proxy)),$watch:e=>nS.bind(e)}),rU=(e,t)=>e!==f&&!e.__isScriptSetup&&k(e,t),rH={get({_:e},t){let n,r;if("__v_skip"===t)return!0;let{ctx:i,setupState:l,data:s,props:o,accessCache:a,type:c,appContext:u}=e;if("$"!==t[0]){let e=a[t];if(void 0!==e)switch(e){case 1:return l[t];case 2:return s[t];case 4:return i[t];case 3:return o[t]}else{if(rU(l,t))return a[t]=1,l[t];if(s!==f&&k(s,t))return a[t]=2,s[t];if(k(o,t))return a[t]=3,o[t];if(i!==f&&k(i,t))return a[t]=4,i[t];r8&&(a[t]=0)}}let d=rj[t];return d?("$attrs"===t&&ej(e.attrs,"get",""),d(e)):(n=c.__cssModules)&&(n=n[t])?n:i!==f&&k(i,t)?(a[t]=4,i[t]):k(r=u.config.globalProperties,t)?r[t]:void 0},set({_:e},t,n){let{data:r,setupState:i,ctx:l}=e;return rU(i,t)?(i[t]=n,!0):r!==f&&k(r,t)?(r[t]=n,!0):!k(e.props,t)&&!("$"===t[0]&&t.slice(1)in e)&&(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,props:l,type:s}},o){let a;return!!(n[o]||e!==f&&"$"!==o[0]&&k(e,o)||rU(t,o)||k(l,o)||k(r,o)||k(rj,o)||k(i.config.globalProperties,o)||(a=s.__cssModules)&&a[o])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:k(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},rq=S({},rH,{get(e,t){if(t!==Symbol.unscopables)return rH.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!J(t)});function rW(){return null}function rK(){return null}function rz(e){}function rJ(e){}function rG(){return null}function rQ(){}function rX(e,t){return null}function rZ(){return r0().slots}function rY(){return r0().attrs}function r0(e){let t=lS();return t.setupContext||(t.setupContext=lO(t))}function r1(e){return T(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}function r2(e,t){let n=r1(e);for(let e in t){if(e.startsWith("__skip"))continue;let r=n[e];r?T(r)||w(r)?r=n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(r=n[e]={default:t[e]}),r&&t[`__skip_${e}`]&&(r.skipFactory=!0)}return n}function r6(e,t){return e&&t?T(e)&&T(t)?e.concat(t):S({},r1(e),r1(t)):e||t}function r3(e,t){let n={};for(let r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function r4(e){let t=lS(),n=lT,r=e();lC(),n&&s(!1);let i=()=>{lx(t),n&&s(!0)},l=()=>{lS()!==t&&t.scope.off(),lC(),n&&s(!1)};return R(r)&&(r=r.catch(e=>{throw i(),Promise.resolve().then(()=>Promise.resolve().then(l)),e})),[r,()=>{i(),Promise.resolve().then(l)}]}let r8=!0;function r5(e,t,n){tQ(T(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function r9(e){let t,n=e.type,{mixins:r,extends:i}=n,{mixins:l,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);return a?t=a:l.length||r||i?(t={},l.length&&l.forEach(e=>r7(t,e,o,!0)),r7(t,n,o)):t=n,E(n)&&s.set(n,t),t}function r7(e,t,n,r=!1){let{mixins:i,extends:l}=t;for(let s in l&&r7(e,l,n,!0),i&&i.forEach(t=>r7(e,t,n,!0)),t)if(r&&"expose"===s);else{let r=ie[s]||n&&n[s];e[s]=r?r(e[s],t[s]):t[s]}return e}let ie={data:it,props:is,emits:is,methods:il,computed:il,beforeCreate:ii,created:ii,beforeMount:ii,mounted:ii,beforeUpdate:ii,updated:ii,beforeDestroy:ii,beforeUnmount:ii,destroyed:ii,unmounted:ii,activated:ii,deactivated:ii,errorCaptured:ii,serverPrefetch:ii,components:il,directives:il,watch:function(e,t){if(!e)return t;if(!t)return e;let n=S(Object.create(null),e);for(let r in t)n[r]=ii(e[r],t[r]);return n},provide:it,inject:function(e,t){return il(ir(e),ir(t))}};function it(e,t){return t?e?function(){return S(w(e)?e.call(this,this):e,w(t)?t.call(this,this):t)}:t:e}function ir(e){if(T(e)){let t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ii(e,t){return e?[...new Set([].concat(e,t))]:t}function il(e,t){return e?S(Object.create(null),e,t):t}function is(e,t){return e?T(e)&&T(t)?[...new Set([...e,...t])]:S(Object.create(null),r1(e),r1(null!=t?t:{})):t}function io(){return{app:null,config:{isNativeTag:y,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let ia=0,ic=null;function iu(e,t,n=f){let r=lS(),i=L(t),l=V(t),s=id(e,i),o=tM((s,o)=>{let a,c,u=f;return nv(()=>{let t=e[i];U(a,t)&&(a=t,o())}),{get:()=>(s(),n.get?n.get(a):a),set(e){let s=n.set?n.set(e):e;if(!U(s,a)&&!(u!==f&&U(e,u)))return;let d=r.vnode.props;d&&(t in d||i in d||l in d)&&(`onUpdate:${t}`in d||`onUpdate:${i}`in d||`onUpdate:${l}`in d)||(a=e,o()),r.emit(`update:${t}`,s),U(e,s)&&U(e,u)&&!U(s,c)&&o(),u=e,c=s}}});return o[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?s||f:o,done:!1}:{done:!0}}},o}let id=(e,t)=>"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${L(t)}Modifiers`]||e[`${V(t)}Modifiers`];function ip(e,t,...n){let r;if(e.isUnmounted)return;let i=e.vnode.props||f,l=n,s=t.startsWith("update:"),o=s&&id(i,t.slice(7));o&&(o.trim&&(l=n.map(e=>N(e)?e.trim():e)),o.number&&(l=n.map(W)));let a=i[r=j(t)]||i[r=j(L(t))];!a&&s&&(a=i[r=j(V(t))]),a&&tQ(a,e,6,l);let c=i[r+"Once"];if(c){if(e.emitted){if(e.emitted[r])return}else e.emitted={};e.emitted[r]=!0,tQ(c,e,6,l)}}let ih=new WeakMap;function ig(e,t){return!!e&&!!b(t)&&(k(e,(t=t.slice(2).replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||k(e,V(t))||k(e,t))}function im(e){let t,n,{type:r,vnode:i,proxy:l,withProxy:s,propsOptions:[o],slots:a,attrs:c,emit:u,render:d,renderCache:p,props:h,data:f,setupState:g,ctx:m,inheritAttrs:y}=e,b=ni(e);try{if(4&i.shapeFlag){let e=s||l;t=lp(d.call(e,e,p,h,g,f,m)),n=c}else t=lp(r.length>1?r(h,{attrs:c,slots:a,emit:u}):r(h,null)),n=r.props?c:iy(c)}catch(n){i1.length=0,tX(n,e,1),t=ls(iY)}let S=t;if(n&&!1!==y){let e=Object.keys(n),{shapeFlag:t}=S;e.length&&7&t&&(o&&e.some(_)&&(n=iv(n,o)),S=la(S,n,!1,!0))}return i.dirs&&((S=la(S,null,!1,!0)).dirs=S.dirs?S.dirs.concat(i.dirs):i.dirs),i.transition&&nW(S,i.transition),t=S,ni(b),t}let iy=e=>{let t;for(let n in e)("class"===n||"style"===n||b(n))&&((t||(t={}))[n]=e[n]);return t},iv=(e,t)=>{let n={};for(let r in e)_(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function ib(e,t,n){let r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let i=0;i<r.length;i++){let l=r[i];if(i_(t,e,l)&&!ig(n,l))return!0}return!1}function i_(e,t,n){let r=e[n],i=t[n];return"style"===n&&E(r)&&E(i)?!eo(r,i):r!==i}function iS({vnode:e,parent:t,suspense:n},r){for(;t;){let n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.suspense.vnode.el=n.el=r,e=n),n===e)(e=t.vnode).el=r,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=r)}let ix={},iC=e=>Object.getPrototypeOf(e)===ix;function ik(e,t,n,r){let i,[l,s]=e.propsOptions,o=!1;if(t)for(let a in t){let c;if(P(a))continue;let u=t[a];l&&k(l,c=L(a))?s&&s.includes(c)?(i||(i={}))[c]=u:n[c]=u:ig(e.emitsOptions,a)||a in r&&u===r[a]||(r[a]=u,o=!0)}if(s){let t=tb(n),r=i||f;for(let i=0;i<s.length;i++){let o=s[i];n[o]=iT(l,t,o,r[o],e,!k(r,o))}}return o}function iT(e,t,n,r,i,l){let s=e[n];if(null!=s){let e=k(s,"default");if(e&&void 0===r){let e=s.default;if(s.type!==Function&&!s.skipFactory&&w(e)){let{propsDefaults:l}=i;if(n in l)r=l[n];else{let s=lx(i);r=l[n]=e.call(null,t),s()}}else r=e;i.ce&&i.ce._setProp(n,r)}s[0]&&(l&&!e?r=!1:s[1]&&(""===r||r===V(n))&&(r=!0))}return r}let iw=new WeakMap;function iN(e){return!("$"===e[0]||P(e))}let iA=e=>"_"===e||"_ctx"===e||"$stable"===e,iE=e=>T(e)?e.map(lp):[lp(e)],iR=(e,t,n)=>{if(t._n)return t;let r=na((...e)=>iE(t(...e)),n);return r._c=!1,r},iI=(e,t,n)=>{let r=e._ctx;for(let n in e){if(iA(n))continue;let i=e[n];if(w(i))t[n]=iR(n,i,r);else if(null!=i){let e=iE(i);t[n]=()=>e}}},iO=(e,t)=>{let n=iE(t);e.slots.default=()=>n},iP=(e,t,n)=>{for(let r in t)(n||!iA(r))&&(e[r]=t[r])},iM=iG;function iD(e){return iL(e)}function iF(e){return iL(e,n4)}function iL(e,t){var n;let r,i;z().__VUE__=!0;let{insert:l,remove:s,patchProp:o,createElement:a,createText:c,createComment:u,setText:d,setElementText:p,parentNode:h,nextSibling:y,setScopeId:b=m,insertStaticContent:_}=e,x=(e,t,n,r=null,i=null,l=null,s,o=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!lt(e,t)&&(r=en(e),X(e,i,l,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);let{type:c,ref:u,shapeFlag:d}=t;switch(c){case iZ:C(e,t,n,r);break;case iY:T(e,t,n,r);break;case i0:null==e&&N(t,n,r,s);break;case iX:$(e,t,n,r,i,l,s,o,a);break;default:1&d?A(e,t,n,r,i,l,s,o,a):6&d?B(e,t,n,r,i,l,s,o,a):64&d?c.process(e,t,n,r,i,l,s,o,a,el):128&d&&c.process(e,t,n,r,i,l,s,o,a,el)}null!=u&&i?nY(u,e&&e.ref,l,t||e,!t):null==u&&e&&null!=e.ref&&nY(e.ref,null,l,e,!0)},C=(e,t,n,r)=>{if(null==e)l(t.el=c(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&d(n,t.children)}},T=(e,t,n,r)=>{null==e?l(t.el=u(t.children||""),n,r):t.el=e.el},N=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},A=(e,t,n,r,i,l,s,o,a)=>{if("svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e)R(t,n,r,i,l,s,o,a);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),M(e,t,i,l,s,o,a)}finally{n&&n._endPatch()}}},R=(e,t,n,r,i,s,c,u)=>{let d,h,{props:f,shapeFlag:g,transition:m,dirs:y}=e;if(d=e.el=a(e.type,s,f&&f.is,f),8&g?p(d,e.children):16&g&&O(e.children,d,null,r,i,i$(e,s),c,u),y&&nu(e,null,r,"created"),I(d,e,e.scopeId,c,r),f){for(let e in f)"value"===e||P(e)||o(d,e,null,f[e],s,r);"value"in f&&o(d,"value",null,f.value,s),(h=f.onVnodeBeforeMount)&&lm(h,r,e)}y&&nu(e,null,r,"beforeMount");let b=iB(i,m);b&&m.beforeEnter(d),l(d,t,n),((h=f&&f.onVnodeMounted)||b||y)&&iM(()=>{h&&lm(h,r,e),b&&m.enter(d),y&&nu(e,null,r,"mounted")},i)},I=(e,t,n,r,i)=>{if(n&&b(e,n),r)for(let t=0;t<r.length;t++)b(e,r[t]);if(i){let n=i.subTree;if(t===n||iH(n.type)&&(n.ssContent===t||n.ssFallback===t)){let t=i.vnode;I(e,t,t.scopeId,t.slotScopeIds,i.parent)}}},O=(e,t,n,r,i,l,s,o,a=0)=>{for(let c=a;c<e.length;c++)x(null,e[c]=o?lh(e[c]):lp(e[c]),t,n,r,i,l,s,o)},M=(e,t,n,r,i,l,s)=>{let a,c=t.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:h}=t;u|=16&e.patchFlag;let g=e.props||f,m=t.props||f;if(n&&iV(n,!1),(a=m.onVnodeBeforeUpdate)&&lm(a,n,t,e),h&&nu(t,e,n,"beforeUpdate"),n&&iV(n,!0),(g.innerHTML&&null==m.innerHTML||g.textContent&&null==m.textContent)&&p(c,""),d?D(e.dynamicChildren,d,c,n,r,i$(t,i),l):s||K(e,t,c,null,n,r,i$(t,i),l,!1),u>0){if(16&u)F(c,g,m,n,i);else if(2&u&&g.class!==m.class&&o(c,"class",null,m.class,i),4&u&&o(c,"style",g.style,m.style,i),8&u){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let r=e[t],l=g[r],s=m[r];(s!==l||"value"===r)&&o(c,r,l,s,i,n)}}1&u&&e.children!==t.children&&p(c,t.children)}else s||null!=d||F(c,g,m,n,i);((a=m.onVnodeUpdated)||h)&&iM(()=>{a&&lm(a,n,t,e),h&&nu(t,e,n,"updated")},r)},D=(e,t,n,r,i,l,s)=>{for(let o=0;o<t.length;o++){let a=e[o],c=t[o],u=a.el&&(a.type===iX||!lt(a,c)||198&a.shapeFlag)?h(a.el):n;x(a,c,u,null,r,i,l,s,!0)}},F=(e,t,n,r,i)=>{if(t!==n){if(t!==f)for(let l in t)P(l)||l in n||o(e,l,t[l],null,i,r);for(let l in n){if(P(l))continue;let s=n[l],a=t[l];s!==a&&"value"!==l&&o(e,l,a,s,i,r)}"value"in n&&o(e,"value",t.value,n.value,i)}},$=(e,t,n,r,i,s,o,a,u)=>{let d=t.el=e?e.el:c(""),p=t.anchor=e?e.anchor:c(""),{patchFlag:h,dynamicChildren:f,slotScopeIds:g}=t;g&&(a=a?a.concat(g):g),null==e?(l(d,n,r),l(p,n,r),O(t.children||[],n,p,i,s,o,a,u)):h>0&&64&h&&f&&e.dynamicChildren&&e.dynamicChildren.length===f.length?(D(e.dynamicChildren,f,n,i,s,o,a),(null!=t.key||i&&t===i.subTree)&&ij(e,t,!0)):K(e,t,n,p,i,s,o,a,u)},B=(e,t,n,r,i,l,s,o,a)=>{t.slotScopeIds=o,null==e?512&t.shapeFlag?i.ctx.activate(t,n,r,s,a):j(t,n,r,i,l,s,a):U(e,t,a)},j=(e,t,n,r,i,l,s)=>{let o=e.component=lb(e,r,i);if(ra(e)&&(o.ctx.renderer=el),lw(o,!1,s),o.asyncDep){if(i&&i.registerDep(o,q,s),!e.el){let r=o.subTree=ls(iY);T(null,r,t,n),e.placeholder=r.el}}else q(o,e,t,n,i,l,s)},U=(e,t,n)=>{let r=t.component=e.component;if(function(e,t,n){let{props:r,children:i,component:l}=e,{props:s,children:o,patchFlag:a}=t,c=l.emitsOptions;if(t.dirs||t.transition)return!0;if(!n||!(a>=0))return(!!i||!!o)&&(!o||!o.$stable)||r!==s&&(r?!s||ib(r,s,c):!!s);if(1024&a)return!0;if(16&a)return r?ib(r,s,c):!!s;if(8&a){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t];if(i_(s,r,n)&&!ig(c,n))return!0}}return!1}(e,t,n))if(r.asyncDep&&!r.asyncResolved)return void W(r,t,n);else r.next=t,r.update();else t.el=e.el,r.vnode=t},q=(e,t,n,r,l,s,o)=>{e.scope.on();let a=e.effect=new ev(()=>{if(e.isMounted){let t,{next:n,bu:r,u:i,parent:a,vnode:u}=e;{let t=function e(t){let n=t.subTree.component;if(n)if(n.asyncDep&&!n.asyncResolved)return n;else return e(n)}(e);if(t){n&&(n.el=u.el,W(e,n,o)),t.asyncDep.then(()=>{iM(()=>{e.isUnmounted||c()},l)});return}}let d=n;iV(e,!1),n?(n.el=u.el,W(e,n,o)):n=u,r&&H(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&lm(t,a,n,u),iV(e,!0);let p=im(e),f=e.subTree;e.subTree=p,x(f,p,h(f.el),en(f),e,l,s),n.el=p.el,null===d&&iS(e,p.el),i&&iM(i,l),(t=n.props&&n.props.onVnodeUpdated)&&iM(()=>lm(t,a,n,u),l)}else{let o,{el:a,props:c}=t,{bm:u,m:d,parent:p,root:h,type:f}=e,g=rl(t);if(iV(e,!1),u&&H(u),!g&&(o=c&&c.onVnodeBeforeMount)&&lm(o,p,t),iV(e,!0),a&&i){let t=()=>{e.subTree=im(e),i(a,e.subTree,e,l,null)};g&&f.__asyncHydrate?f.__asyncHydrate(a,e,t):t()}else{h.ce&&h.ce._hasShadowRoot()&&h.ce._injectChildStyle(f,e.parent?e.parent.type:void 0);let i=e.subTree=im(e);x(null,i,n,r,e,l,s),t.el=i.el}if(d&&iM(d,l),!g&&(o=c&&c.onVnodeMounted)){let e=t;iM(()=>lm(o,p,e),l)}(256&t.shapeFlag||p&&rl(p.vnode)&&256&p.vnode.shapeFlag)&&e.a&&iM(e.a,l),e.isMounted=!0,t=n=r=null}});e.scope.off();let c=e.update=a.run.bind(a),u=e.job=a.runIfDirty.bind(a);u.i=e,u.id=e.uid,a.scheduler=()=>t8(u),iV(e,!0),c()},W=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){let{props:i,attrs:l,vnode:{patchFlag:s}}=e,o=tb(i),[a]=e.propsOptions,c=!1;if((r||s>0)&&!(16&s)){if(8&s){let n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let s=n[r];if(ig(e.emitsOptions,s))continue;let u=t[s];if(a)if(k(l,s))u!==l[s]&&(l[s]=u,c=!0);else{let t=L(s);i[t]=iT(a,o,t,u,e,!1)}else u!==l[s]&&(l[s]=u,c=!0)}}}else{let r;for(let s in ik(e,t,i,l)&&(c=!0),o)t&&(k(t,s)||(r=V(s))!==s&&k(t,r))||(a?n&&(void 0!==n[s]||void 0!==n[r])&&(i[s]=iT(a,o,s,void 0,e,!0)):delete i[s]);if(l!==o)for(let e in l)t&&k(t,e)||(delete l[e],c=!0)}c&&eU(e.attrs,"set","")}(e,t.props,r,n),((e,t,n)=>{let{vnode:r,slots:i}=e,l=!0,s=f;if(32&r.shapeFlag){let e=t._;e?n&&1===e?l=!1:iP(i,t,n):(l=!t.$stable,iI(t,i)),s=t}else t&&(iO(e,t),s={default:1});if(l)for(let e in i)iA(e)||null!=s[e]||delete i[e]})(e,t.children,n),eI(),t7(e),eO()},K=(e,t,n,r,i,l,s,o,a=!1)=>{let c=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:h,shapeFlag:f}=t;if(h>0){if(128&h)return void G(c,d,n,r,i,l,s,o,a);else if(256&h)return void J(c,d,n,r,i,l,s,o,a)}8&f?(16&u&&et(c,i,l),d!==c&&p(n,d)):16&u?16&f?G(c,d,n,r,i,l,s,o,a):et(c,i,l,!0):(8&u&&p(n,""),16&f&&O(d,n,r,i,l,s,o,a))},J=(e,t,n,r,i,l,s,o,a)=>{let c;e=e||g,t=t||g;let u=e.length,d=t.length,p=Math.min(u,d);for(c=0;c<p;c++){let r=t[c]=a?lh(t[c]):lp(t[c]);x(e[c],r,n,null,i,l,s,o,a)}u>d?et(e,i,l,!0,!1,p):O(t,n,r,i,l,s,o,a,p)},G=(e,t,n,r,i,l,s,o,a)=>{let c=0,u=t.length,d=e.length-1,p=u-1;for(;c<=d&&c<=p;){let r=e[c],u=t[c]=a?lh(t[c]):lp(t[c]);if(lt(r,u))x(r,u,n,null,i,l,s,o,a);else break;c++}for(;c<=d&&c<=p;){let r=e[d],c=t[p]=a?lh(t[p]):lp(t[p]);if(lt(r,c))x(r,c,n,null,i,l,s,o,a);else break;d--,p--}if(c>d){if(c<=p){let e=p+1,d=e<u?t[e].el:r;for(;c<=p;)x(null,t[c]=a?lh(t[c]):lp(t[c]),n,d,i,l,s,o,a),c++}}else if(c>p)for(;c<=d;)X(e[c],i,l,!0),c++;else{let h,f=c,m=c,y=new Map;for(c=m;c<=p;c++){let e=t[c]=a?lh(t[c]):lp(t[c]);null!=e.key&&y.set(e.key,c)}let b=0,_=p-m+1,S=!1,C=0,k=Array(_);for(c=0;c<_;c++)k[c]=0;for(c=f;c<=d;c++){let r,u=e[c];if(b>=_){X(u,i,l,!0);continue}if(null!=u.key)r=y.get(u.key);else for(h=m;h<=p;h++)if(0===k[h-m]&&lt(u,t[h])){r=h;break}void 0===r?X(u,i,l,!0):(k[r-m]=c+1,r>=C?C=r:S=!0,x(u,t[r],n,null,i,l,s,o,a),b++)}let T=S?function(e){let t,n,r,i,l,s=e.slice(),o=[0],a=e.length;for(t=0;t<a;t++){let a=e[t];if(0!==a){if(e[n=o[o.length-1]]<a){s[t]=n,o.push(t);continue}for(r=0,i=o.length-1;r<i;)e[o[l=r+i>>1]]<a?r=l+1:i=l;a<e[o[r]]&&(r>0&&(s[t]=o[r-1]),o[r]=t)}}for(r=o.length,i=o[r-1];r-- >0;)o[r]=i,i=s[i];return o}(k):g;for(h=T.length-1,c=_-1;c>=0;c--){let e=m+c,d=t[e],p=t[e+1],f=e+1<u?p.el||function e(t){if(t.placeholder)return t.placeholder;let n=t.component;return n?e(n.subTree):null}(p):r;0===k[c]?x(null,d,n,f,i,l,s,o,a):S&&(h<0||c!==T[h]?Q(d,n,f,2):h--)}}},Q=(e,t,n,r,i=null)=>{let{el:o,type:a,transition:c,children:u,shapeFlag:d}=e;if(6&d)return void Q(e.component.subTree,t,n,r);if(128&d)return void e.suspense.move(t,n,r);if(64&d)return void a.move(e,t,n,el);if(a===iX){l(o,t,n);for(let e=0;e<u.length;e++)Q(u[e],t,n,r);l(e.anchor,t,n);return}if(a===i0)return void(({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=y(e),l(e,n,r),e=i;l(t,n,r)})(e,t,n);if(2!==r&&1&d&&c)if(0===r)c.beforeEnter(o),l(o,t,n),iM(()=>c.enter(o),i);else{let{leave:r,delayLeave:i,afterLeave:a}=c,u=()=>{e.ctx.isUnmounted?s(o):l(o,t,n)},d=()=>{o._isLeaving&&o[nP](!0),r(o,()=>{u(),a&&a()})};i?i(o,u,d):d()}else l(o,t,n)},X=(e,t,n,r=!1,i=!1)=>{let l,{type:s,props:o,ref:a,children:c,dynamicChildren:u,shapeFlag:d,patchFlag:p,dirs:h,cacheIndex:f,memo:g}=e;if(-2===p&&(i=!1),null!=a&&(eI(),nY(a,null,n,e,!0),eO()),null!=f&&(t.renderCache[f]=void 0),256&d)return void t.ctx.deactivate(e);let m=1&d&&h,y=!rl(e);if(y&&(l=o&&o.onVnodeBeforeUnmount)&&lm(l,t,e),6&d)ee(e.component,n,r);else{if(128&d)return void e.suspense.unmount(n,r);m&&nu(e,null,t,"beforeUnmount"),64&d?e.type.remove(e,t,n,el,r):u&&!u.hasOnce&&(s!==iX||p>0&&64&p)?et(u,t,n,!1,!0):(s===iX&&384&p||!i&&16&d)&&et(c,t,n),r&&Z(e)}let b=null!=g&&null==f;(y&&(l=o&&o.onVnodeUnmounted)||m||b)&&iM(()=>{l&&lm(l,t,e),m&&nu(e,null,t,"unmounted"),b&&(e.el=null)},n)},Z=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===iX)return void Y(n,r);if(t===i0)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=y(e),s(e),e=n;s(t)})(e);let l=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,s=()=>t(n,l);r?r(e.el,l,s):s()}else l()},Y=(e,t)=>{let n;for(;e!==t;)n=y(e),s(e),e=n;s(t)},ee=(e,t,n)=>{let{bum:r,scope:i,job:l,subTree:s,um:o,m:a,a:c}=e;iU(a),iU(c),r&&H(r),i.stop(),l&&(l.flags|=8,X(s,e,t,n)),o&&iM(o,t),iM(()=>{e.isUnmounted=!0},t)},et=(e,t,n,r=!1,i=!1,l=0)=>{for(let s=l;s<e.length;s++)X(e[s],t,n,r,i)},en=e=>{if(6&e.shapeFlag)return en(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=y(e.anchor||e.el),n=t&&t[nk];return n?y(n):t},er=!1,ei=(e,t,n)=>{let r;null==e?t._vnode&&(X(t._vnode,null,null,!0),r=t._vnode.component):x(t._vnode||null,e,t,null,null,null,n),t._vnode=e,er||(er=!0,t7(r),ne(),er=!1)},el={p:x,um:X,m:Q,r:Z,mt:j,mc:O,pc:K,pbc:D,n:en,o:e};return t&&([r,i]=t(el)),{render:ei,hydrate:r,createApp:(n=r,function(e,t=null){w(e)||(e=S({},e)),null==t||E(t)||(t=null);let r=io(),i=new WeakSet,l=[],s=!1,o=r.app={_uid:ia++,_component:e,_props:t,_container:null,_context:r,_instance:null,version:lB,get config(){return r.config},set config(v){},use:(e,...t)=>(i.has(e)||(e&&w(e.install)?(i.add(e),e.install(o,...t)):w(e)&&(i.add(e),e(o,...t))),o),mixin:e=>(r.mixins.includes(e)||r.mixins.push(e),o),component:(e,t)=>t?(r.components[e]=t,o):r.components[e],directive:(e,t)=>t?(r.directives[e]=t,o):r.directives[e],mount(i,l,a){if(!s){let c=o._ceVNode||ls(e,t);return c.appContext=r,!0===a?a="svg":!1===a&&(a=void 0),l&&n?n(c,i):ei(c,i,a),s=!0,o._container=i,i.__vue_app__=o,lP(c.component)}},onUnmount(e){l.push(e)},unmount(){s&&(tQ(l,o._instance,16),ei(null,o._container),delete o._container.__vue_app__)},provide:(e,t)=>(r.provides[e]=t,o),runWithContext(e){let t=ic;ic=o;try{return e()}finally{ic=t}}};return o})}}function i$({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function iV({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function iB(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ij(e,t,n=!1){let r=e.children,i=t.children;if(T(r)&&T(i))for(let e=0;e<r.length;e++){let t=r[e],l=i[e];1&l.shapeFlag&&!l.dynamicChildren&&((l.patchFlag<=0||32===l.patchFlag)&&((l=i[e]=lh(i[e])).el=t.el),n||-2===l.patchFlag||ij(t,l)),l.type===iZ&&(-1===l.patchFlag&&(l=i[e]=lh(l)),l.el=t.el),l.type!==iY||l.el||(l.el=t.el)}}function iU(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}let iH=e=>e.__isSuspense,iq=0,iW={name:"Suspense",__isSuspense:!0,process(e,t,n,r,i,l,s,o,a,c){if(null==e)!function(e,t,n,r,i,l,s,o,a){let{p:c,o:{createElement:u}}=a,d=u("div"),p=e.suspense=iz(e,i,r,t,d,n,l,s,o,a);c(null,p.pendingBranch=e.ssContent,d,null,r,p,l,s),p.deps>0?(iK(e,"onPending"),iK(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,l,s),iQ(p,e.ssFallback)):p.resolve(!1,!0)}(t,n,r,i,l,s,o,a,c);else{if(l&&l.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}!function(e,t,n,r,i,l,s,o,{p:a,um:c,o:{createElement:u}}){let d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;let p=t.ssContent,h=t.ssFallback,{activeBranch:f,pendingBranch:g,isInFallback:m,isHydrating:y}=d;if(g)d.pendingBranch=p,lt(g,p)?(a(g,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0?d.resolve():m&&!y&&(a(f,h,n,r,i,null,l,s,o),iQ(d,h))):(d.pendingId=iq++,y?(d.isHydrating=!1,d.activeBranch=g):c(g,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u("div"),m?(a(null,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0?d.resolve():(a(f,h,n,r,i,null,l,s,o),iQ(d,h))):f&&lt(f,p)?(a(f,p,n,r,i,d,l,s,o),d.resolve(!0)):(a(null,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0&&d.resolve()));else if(f&&lt(f,p))a(f,p,n,r,i,d,l,s,o),iQ(d,p);else if(iK(t,"onPending"),d.pendingBranch=p,512&p.shapeFlag?d.pendingId=p.component.suspenseId:d.pendingId=iq++,a(null,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0)d.resolve();else{let{timeout:e,pendingId:t}=d;e>0?setTimeout(()=>{d.pendingId===t&&d.fallback(h)},e):0===e&&d.fallback(h)}}(e,t,n,r,i,s,o,a,c)}},hydrate:function(e,t,n,r,i,l,s,o,a){let c=t.suspense=iz(t,r,n,e.parentNode,document.createElement("div"),null,i,l,s,o,!0),u=a(e,c.pendingBranch=t.ssContent,n,c,l,s);return 0===c.deps&&c.resolve(!1,!0),u},normalize:function(e){let{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=iJ(r?n.default:n),e.ssFallback=r?iJ(n.fallback):ls(iY)}};function iK(e,t){let n=e.props&&e.props[t];w(n)&&n()}function iz(e,t,n,r,i,l,s,o,a,c,u=!1){var d;let p,h,{p:f,m:g,um:m,n:y,o:{parentNode:b,remove:_}}=c,S=null!=(p=(d=e).props&&d.props.suspensible)&&!1!==p;S&&t&&t.pendingBranch&&(h=t.pendingId,t.deps++);let x=e.props?K(e.props.timeout):void 0,C=l,k={vnode:e,parent:t,parentComponent:n,namespace:s,container:r,hiddenContainer:i,deps:0,pendingId:iq++,timeout:"number"==typeof x?x:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:r,activeBranch:i,pendingBranch:s,pendingId:o,effects:a,parentComponent:c,container:u,isInFallback:d}=k,p=!1;k.isHydrating?k.isHydrating=!1:!e&&((p=i&&s.transition&&"out-in"===s.transition.mode)&&(i.transition.afterLeave=()=>{o===k.pendingId&&(g(s,u,l===C?y(i):l,0),t9(a),d&&r.ssFallback&&(r.ssFallback.el=null))}),i&&!k.isFallbackMountPending&&(b(i.el)===u&&(l=y(i)),m(i,c,k,!0),!p&&d&&r.ssFallback&&iM(()=>r.ssFallback.el=null,k)),p||g(s,u,l,0)),k.isFallbackMountPending=!1,iQ(k,s),k.pendingBranch=null,k.isInFallback=!1;let f=k.parent,_=!1;for(;f;){if(f.pendingBranch){f.effects.push(...a),_=!0;break}f=f.parent}_||p||t9(a),k.effects=[],S&&t&&t.pendingBranch&&h===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),iK(r,"onResolve")},fallback(e){if(!k.pendingBranch)return;let{vnode:t,activeBranch:n,parentComponent:r,container:i,namespace:l}=k;iK(t,"onFallback");let s=y(n),c=()=>{k.isFallbackMountPending=!1,k.isInFallback&&(f(null,e,i,s,r,null,l,o,a),iQ(k,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(k.isFallbackMountPending=!0,n.transition.afterLeave=c),k.isInFallback=!0,m(n,r,null,!0),u||c()},move(e,t,n){k.activeBranch&&g(k.activeBranch,e,t,n),k.container=e},next:()=>k.activeBranch&&y(k.activeBranch),registerDep(e,t,n){let r=!!k.pendingBranch;r&&k.deps++;let i=e.vnode.el;e.asyncDep.catch(t=>{tX(t,e,0)}).then(l=>{if(e.isUnmounted||k.isUnmounted||k.pendingId!==e.suspenseId)return;lC(),e.asyncResolved=!0;let{vnode:o}=e;lN(e,l,!1),i&&(o.el=i);let a=!i&&e.subTree.el;t(e,o,b(i||e.subTree.el),i?null:y(e.subTree),k,s,n),a&&(o.placeholder=null,_(a)),iS(e,o.el),r&&0==--k.deps&&k.resolve()})},unmount(e,t){k.isUnmounted=!0,k.activeBranch&&m(k.activeBranch,n,e,t),k.pendingBranch&&m(k.pendingBranch,n,e,t)}};return k}function iJ(e){let t;if(w(e)){let n=i4&&e._c;n&&(e._d=!1,i6()),e=e(),n&&(e._d=!0,t=i2,i3())}return T(e)&&(e=function(e){let t;for(let n=0;n<e.length;n++){let r=e[n];if(!le(r))return;if(r.type!==iY||"v-if"===r.children)if(t)return;else t=r}return t}(e)),e=lp(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(t=>t!==e)),e}function iG(e,t){t&&t.pendingBranch?T(e)?t.effects.push(...e):t.effects.push(e):t9(e)}function iQ(e,t){e.activeBranch=t;let{vnode:n,parentComponent:r}=e,i=t.el;for(;!i&&t.component;)i=(t=t.component.subTree).el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,iS(r,i))}let iX=Symbol.for("v-fgt"),iZ=Symbol.for("v-txt"),iY=Symbol.for("v-cmt"),i0=Symbol.for("v-stc"),i1=[],i2=null;function i6(e=!1){i1.push(i2=e?null:[])}function i3(){i1.pop(),i2=i1[i1.length-1]||null}let i4=1;function i8(e,t=!1){i4+=e,e<0&&i2&&t&&(i2.hasOnce=!0)}function i5(e){return e.dynamicChildren=i4>0?i2||g:null,i3(),i4>0&&i2&&i2.push(e),e}function i9(e,t,n,r,i,l){return i5(ll(e,t,n,r,i,l,!0))}function i7(e,t,n,r,i){return i5(ls(e,t,n,r,i,!0))}function le(e){return!!e&&!0===e.__v_isVNode}function lt(e,t){return e.type===t.type&&e.key===t.key}function ln(e){}let lr=({key:e})=>null!=e?e:null,li=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?N(e)||tC(e)||w(e)?{i:nn,r:e,k:t,f:!!n}:e:null);function ll(e,t=null,n=null,r=0,i=null,l=+(e!==iX),s=!1,o=!1){let a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&lr(t),ref:t&&li(t),scopeId:nr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:nn};return o?(lf(a,n),128&l&&e.normalize(a)):n&&(a.shapeFlag|=N(n)?8:16),i4>0&&!s&&i2&&(a.patchFlag>0||6&l)&&32!==a.patchFlag&&i2.push(a),a}let ls=function(e,t=null,n=null,r=0,i=null,l=!1){var s;if(e&&e!==rR||(e=iY),le(e)){let r=la(e,t,!0);return n&&lf(r,n),i4>0&&!l&&i2&&(6&r.shapeFlag?i2[i2.indexOf(e)]=r:i2.push(r)),r.patchFlag=-2,r}if(w(s=e)&&"__vccOpts"in s&&(e=e.__vccOpts),t){let{class:e,style:n}=t=lo(t);e&&!N(e)&&(t.class=ee(e)),E(n)&&(tv(n)&&!T(n)&&(n=S({},n)),t.style=G(n))}let o=N(e)?1:iH(e)?128:e.__isTeleport?64:E(e)?4:2*!!w(e);return ll(e,t,n,r,i,o,l,!0)};function lo(e){return e?tv(e)||iC(e)?S({},e):e:null}function la(e,t,n=!1,r=!1){let{props:i,ref:l,patchFlag:s,children:o,transition:a}=e,c=t?lg(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&lr(c),ref:t&&t.ref?n&&l?T(l)?l.concat(li(t)):[l,li(t)]:li(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==iX?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&la(e.ssContent),ssFallback:e.ssFallback&&la(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&r&&nW(u,a.clone(u)),u}function lc(e=" ",t=0){return ls(iZ,null,e,t)}function lu(e,t){let n=ls(i0,null,e);return n.staticCount=t,n}function ld(e="",t=!1){return t?(i6(),i7(iY,null,e)):ls(iY,null,e)}function lp(e){return null==e||"boolean"==typeof e?ls(iY):T(e)?ls(iX,null,e.slice()):le(e)?lh(e):ls(iZ,null,String(e))}function lh(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:la(e)}function lf(e,t){let n=0,{shapeFlag:r}=e;if(null==t)t=null;else if(T(t))n=16;else if("object"==typeof t)if(65&r){let n=t.default;n&&(n._c&&(n._d=!1),lf(e,n()),n._c&&(n._d=!0));return}else{n=32;let r=t._;r||iC(t)?3===r&&nn&&(1===nn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=nn}else w(t)?(t={default:t,_ctx:nn},n=32):(t=String(t),64&r?(n=16,t=[lc(t)]):n=8);e.children=t,e.shapeFlag|=n}function lg(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];for(let e in r)if("class"===e)t.class!==r.class&&(t.class=ee([t.class,r.class]));else if("style"===e)t.style=G([t.style,r.style]);else if(b(e)){let n=t[e],i=r[e];i&&n!==i&&!(T(n)&&n.includes(i))?t[e]=n?[].concat(n,i):i:null!=i||null!=n||_(e)||(t[e]=i)}else""!==e&&(t[e]=r[e])}return t}function lm(e,t,n,r=null){tQ(e,t,7,[n,r])}let ly=io(),lv=0;function lb(e,t,n){let r=e.type,i=(t?t.appContext:e.appContext)||ly,l={uid:lv++,vnode:e,type:r,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new eh(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:function e(t,n,r=!1){let i=r?iw:n.propsCache,l=i.get(t);if(l)return l;let s=t.props,o={},a=[],c=!1;if(!w(t)){let i=t=>{c=!0;let[r,i]=e(t,n,!0);S(o,r),i&&a.push(...i)};!r&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}if(!s&&!c)return E(t)&&i.set(t,g),g;if(T(s))for(let e=0;e<s.length;e++){let t=L(s[e]);iN(t)&&(o[t]=f)}else if(s)for(let e in s){let t=L(e);if(iN(t)){let n=s[e],r=o[t]=T(n)||w(n)?{type:n}:S({},n),i=r.type,l=!1,c=!0;if(T(i))for(let e=0;e<i.length;++e){let t=i[e],n=w(t)&&t.name;if("Boolean"===n){l=!0;break}"String"===n&&(c=!1)}else l=w(i)&&"Boolean"===i.name;r[0]=l,r[1]=c,(l||k(r,"default"))&&a.push(t)}}let u=[o,a];return E(t)&&i.set(t,u),u}(r,i),emitsOptions:function e(t,n,r=!1){let i=r?ih:n.emitsCache,l=i.get(t);if(void 0!==l)return l;let s=t.emits,o={},a=!1;if(!w(t)){let i=t=>{let r=e(t,n,!0);r&&(a=!0,S(o,r))};!r&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}return s||a?(T(s)?s.forEach(e=>o[e]=null):S(o,s),E(t)&&i.set(t,o),o):(E(t)&&i.set(t,null),null)}(r,i),emit:null,emitted:null,propsDefaults:f,inheritAttrs:r.inheritAttrs,ctx:f,data:f,props:f,attrs:f,slots:f,refs:f,setupState:f,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return l.ctx={_:l},l.root=t?t.root:l,l.emit=ip.bind(null,l),e.ce&&e.ce(l),l}let l_=null,lS=()=>l_||nn;{let e=z(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};l=t("__VUE_INSTANCE_SETTERS__",e=>l_=e),s=t("__VUE_SSR_SETTERS__",e=>lT=e)}let lx=e=>{let t=l_;return l(e),e.scope.on(),()=>{e.scope.off(),l(t)}},lC=()=>{l_&&l_.scope.off(),l(null)};function lk(e){return 4&e.vnode.shapeFlag}let lT=!1;function lw(e,t=!1,n=!1){t&&s(t);let{props:r,children:i}=e.vnode,l=lk(e);!function(e,t,n,r=!1){let i={},l=Object.create(ix);for(let n in e.propsDefaults=Object.create(null),ik(e,t,i,l),e.propsOptions[0])n in i||(i[n]=void 0);n?e.props=r?i:td(i):e.type.props?e.props=i:e.props=l,e.attrs=l}(e,r,l,t);var o=n||t;let a=e.slots=Object.create(ix);if(32&e.vnode.shapeFlag){let e=i._;e?(iP(a,i,o),o&&q(a,"_",e,!0)):iI(i,a)}else i&&iO(e,i);let c=l?function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,rH);let{setup:r}=n;if(r){eI();let n=e.setupContext=r.length>1?lO(e):null,i=lx(e),l=tG(r,e,0,[e.props,n]),s=R(l);if(eO(),i(),(s||e.sp)&&!rl(e)&&nG(e),s){if(l.then(lC,lC),t)return l.then(n=>{lN(e,n,t)}).catch(t=>{tX(t,e,0)});e.asyncDep=l}else lN(e,l,t)}else lR(e,t)}(e,t):void 0;return t&&s(!1),c}function lN(e,t,n){w(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:E(t)&&(e.setupState=tO(t)),lR(e,n)}function lA(e){o=e,a=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,rq))}}let lE=()=>!o;function lR(e,t,n){let r=e.type;if(!e.render){if(!t&&o&&!r.render){let t=r.template||r9(e).template;if(t){let{isCustomElement:n,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:s}=r,a=S(S({isCustomElement:n,delimiters:l},i),s);r.render=o(t,a)}}e.render=r.render||m,a&&a(e)}{let t=lx(e);eI();try{!function(e){let t=r9(e),n=e.proxy,r=e.ctx;r8=!1,t.beforeCreate&&r5(t.beforeCreate,e,"bc");let{data:i,computed:l,methods:s,watch:o,provide:a,inject:c,created:u,beforeMount:d,mounted:p,beforeUpdate:h,updated:f,activated:g,deactivated:y,beforeUnmount:b,unmounted:_,render:S,renderTracked:x,renderTriggered:C,errorCaptured:k,serverPrefetch:A,expose:R,inheritAttrs:I,components:O,directives:P}=t;if(c&&function(e,t){for(let n in T(e)&&(e=ir(e)),e){let r,i=e[n];tC(r=E(i)?"default"in i?np(i.from||n,i.default,!0):np(i.from||n):np(i))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:e=>r.value=e}):t[n]=r}}(c,r),s)for(let e in s){let t=s[e];w(t)&&(r[e]=t.bind(n))}if(i){let t=i.call(n,n);E(t)&&(e.data=tu(t))}if(r8=!0,l)for(let e in l){let t=l[e],i=w(t)?t.bind(n,n):w(t.get)?t.get.bind(n,n):m,s=lD({get:i,set:!w(t)&&w(t.set)?t.set.bind(n):m});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e})}if(o)for(let e in o)!function e(t,n,r,i){let l=i.includes(".")?nx(r,i):()=>r[i];if(N(t)){let e=n[t];w(e)&&nb(l,e)}else if(w(t))nb(l,t.bind(r));else if(E(t))if(T(t))t.forEach(t=>e(t,n,r,i));else{let e=w(t.handler)?t.handler.bind(r):n[t.handler];w(e)&&nb(l,e,t)}}(o[e],r,n,e);if(a){let e=w(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{nd(t,e[t])})}function M(e,t){T(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(u&&r5(u,e,"c"),M(rv,d),M(rb,p),M(r_,h),M(rS,f),M(rd,g),M(rp,y),M(rN,k),M(rw,x),M(rT,C),M(rx,b),M(rC,_),M(rk,A),T(R))if(R.length){let t=e.exposed||(e.exposed={});R.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});S&&e.render===m&&(e.render=S),null!=I&&(e.inheritAttrs=I),O&&(e.components=O),P&&(e.directives=P),A&&nG(e)}(e)}finally{eO(),t()}}}let lI={get:(e,t)=>(ej(e,"get",""),e[t])};function lO(e){return{attrs:new Proxy(e.attrs,lI),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function lP(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(tO(t_(e.exposed)),{get:(t,n)=>n in t?t[n]:n in rj?rj[n](e):void 0,has:(e,t)=>t in e||t in rj})):e.proxy}function lM(e,t=!0){return w(e)?e.displayName||e.name:e.name||t&&e.__name}let lD=(e,t)=>(function(e,t=!1){let n,r;return w(e)?n=e:(n=e.get,r=e.set),new tV(n,r,t)})(e,lT);function lF(e,t,n){try{i8(-1);let r=arguments.length;if(2!==r)return r>3?n=Array.prototype.slice.call(arguments,2):3===r&&le(n)&&(n=[n]),ls(e,t,n);if(!E(t)||T(t))return ls(e,null,t);if(le(t))return ls(e,null,[t]);return ls(e,t)}finally{i8(1)}}function lL(){}function l$(e,t,n,r){let i=n[r];if(i&&lV(i,e))return i;let l=t();return l.memo=e.slice(),l.cacheIndex=r,n[r]=l}function lV(e,t){let n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(U(n[e],t[e]))return!1;return i4>0&&i2&&i2.push(e),!0}let lB="3.5.32",lj=m,lU=null,lH,lq=m,lW={createComponentInstance:lb,setupComponent:lw,renderComponentRoot:im,setCurrentRenderingInstance:ni,isVNode:le,normalizeVNode:lp,getComponentPublicInstance:lP,ensureValidVNode:r$,pushWarningContext:function(e){},popWarningContext:function(){}},lK=null,lz=null,lJ=null,lG="u">typeof window&&window.trustedTypes;if(lG)try{p=lG.createPolicy("vue",{createHTML:e=>e})}catch(e){}let lQ=p?e=>p.createHTML(e):e=>e,lX="u">typeof document?document:null,lZ=lX&&lX.createElement("template"),lY={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i="svg"===t?lX.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?lX.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?lX.createElement(e,{is:n}):lX.createElement(e);return"select"===e&&r&&null!=r.multiple&&i.setAttribute("multiple",r.multiple),i},createText:e=>lX.createTextNode(e),createComment:e=>lX.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>lX.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,i,l){let s=n?n.previousSibling:t.lastChild;if(i&&(i===l||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==l&&(i=i.nextSibling););else{lZ.innerHTML=lQ("svg"===r?`<svg>${e}</svg>`:"mathml"===r?`<math>${e}</math>`:e);let i=lZ.content;if("svg"===r||"mathml"===r){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},l0="transition",l1="animation",l2=Symbol("_vtc"),l6={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},l3=S({},nL,l6),l4=((og=(e,{slots:t})=>lF(nB,l9(e),t)).displayName="Transition",og.props=l3,og),l8=(e,t=[])=>{T(e)?e.forEach(e=>e(...t)):e&&e(...t)},l5=e=>!!e&&(T(e)?e.some(e=>e.length>1):e.length>1);function l9(e){let t={};for(let n in e)n in l6||(t[n]=e[n]);if(!1===e.css)return t;let{name:n="v",type:r,duration:i,enterFromClass:l=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:a=l,appearActiveClass:c=s,appearToClass:u=o,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,f=function(e){if(null==e)return null;{if(E(e))return[function(e){return K(e)}(e.enter),function(e){return K(e)}(e.leave)];let t=function(e){return K(e)}(e);return[t,t]}}(i),g=f&&f[0],m=f&&f[1],{onBeforeEnter:y,onEnter:b,onEnterCancelled:_,onLeave:x,onLeaveCancelled:C,onBeforeAppear:k=y,onAppear:T=b,onAppearCancelled:w=_}=t,N=(e,t,n,r)=>{e._enterCancelled=r,se(e,t?u:o),se(e,t?c:s),n&&n()},A=(e,t)=>{e._isLeaving=!1,se(e,d),se(e,h),se(e,p),t&&t()},R=e=>(t,n)=>{let i=e?T:b,s=()=>N(t,e,n);l8(i,[t,s]),st(()=>{se(t,e?a:l),l7(t,e?u:o),l5(i)||sr(t,r,g,s)})};return S(t,{onBeforeEnter(e){l8(y,[e]),l7(e,l),l7(e,s)},onBeforeAppear(e){l8(k,[e]),l7(e,a),l7(e,c)},onEnter:R(!1),onAppear:R(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>A(e,t);l7(e,d),e._enterCancelled?(l7(e,p),so(e)):(so(e),l7(e,p)),st(()=>{e._isLeaving&&(se(e,d),l7(e,h),l5(x)||sr(e,r,m,n))}),l8(x,[e,n])},onEnterCancelled(e){N(e,!1,void 0,!0),l8(_,[e])},onAppearCancelled(e){N(e,!0,void 0,!0),l8(w,[e])},onLeaveCancelled(e){A(e),l8(C,[e])}})}function l7(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[l2]||(e[l2]=new Set)).add(t)}function se(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[l2];n&&(n.delete(t),n.size||(e[l2]=void 0))}function st(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let sn=0;function sr(e,t,n,r){let i=e._endId=++sn,l=()=>{i===e._endId&&r()};if(null!=n)return setTimeout(l,n);let{type:s,timeout:o,propCount:a}=si(e,t);if(!s)return r();let c=s+"end",u=0,d=()=>{e.removeEventListener(c,p),l()},p=t=>{t.target===e&&++u>=a&&d()};setTimeout(()=>{u<a&&d()},o+1),e.addEventListener(c,p)}function si(e,t){let n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),i=r(`${l0}Delay`),l=r(`${l0}Duration`),s=sl(i,l),o=r(`${l1}Delay`),a=r(`${l1}Duration`),c=sl(o,a),u=null,d=0,p=0;t===l0?s>0&&(u=l0,d=s,p=l.length):t===l1?c>0&&(u=l1,d=c,p=a.length):p=(u=(d=Math.max(s,c))>0?s>c?l0:l1:null)?u===l0?l.length:a.length:0;let h=u===l0&&/\b(?:transform|all)(?:,|$)/.test(r(`${l0}Property`).toString());return{type:u,timeout:d,propCount:p,hasTransform:h}}function sl(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((t,n)=>ss(t)+ss(e[n])))}function ss(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function so(e){return(e?e.ownerDocument:document).body.offsetHeight}let sa=Symbol("_vod"),sc=Symbol("_vsh"),su={name:"show",beforeMount(e,{value:t},{transition:n}){e[sa]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):sd(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),sd(e,!0),r.enter(e)):r.leave(e,()=>{sd(e,!1)}):sd(e,t))},beforeUnmount(e,{value:t}){sd(e,t)}};function sd(e,t){e.style.display=t?e[sa]:"none",e[sc]=!t}let sp=Symbol("");function sh(e){let t=lS();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>sf(e,n))},r=()=>{let r=e(t.proxy);t.ce?sf(t.ce,r):function e(t,n){if(128&t.shapeFlag){let r=t.suspense;t=r.activeBranch,r.pendingBranch&&!r.isHydrating&&r.effects.push(()=>{e(r.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)sf(t.el,n);else if(t.type===iX)t.children.forEach(t=>e(t,n));else if(t.type===i0){let{el:e,anchor:r}=t;for(;e&&(sf(e,n),e!==r);)e=e.nextSibling}}(t.subTree,r),n(r)};r_(()=>{t9(r)}),rb(()=>{nb(r,m,{flush:"post"});let e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),rC(()=>e.disconnect())})}function sf(e,t){if(1===e.nodeType){let r=e.style,i="";for(let e in t){var n;let l=null==(n=t[e])?"initial":"string"==typeof n?""===n?" ":n:String(n);r.setProperty(`--${e}`,l),i+=`--${e}: ${l};`}r[sp]=i}}let sg=/(?:^|;)\s*display\s*:/,sm=/\s*!important$/;function sy(e,t,n){if(T(n))n.forEach(n=>sy(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let r=function(e,t){let n=sb[t];if(n)return n;let r=L(t);if("filter"!==r&&r in e)return sb[t]=r;r=B(r);for(let n=0;n<sv.length;n++){let i=sv[n]+r;if(i in e)return sb[t]=i}return t}(e,t);sm.test(n)?e.setProperty(V(r),n.replace(sm,""),"important"):e[r]=n}}let sv=["Webkit","Moz","ms"],sb={},s_="http://www.w3.org/1999/xlink";function sS(e,t,n,r,i,l=es(t)){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(s_,t.slice(6,t.length)):e.setAttributeNS(s_,t,n);else null==n||l&&!(n||""===n)?e.removeAttribute(t):e.setAttribute(t,l?"":A(n)?String(n):n)}function sx(e,t,n,r,i){if("innerHTML"===t||"textContent"===t){null!=n&&(e[t]="innerHTML"===t?lQ(n):n);return}let l=e.tagName;if("value"===t&&"PROGRESS"!==l&&!l.includes("-")){let r="OPTION"===l?e.getAttribute("value")||"":e.value,i=null==n?"checkbox"===e.type?"on":"":String(n);r===i&&"_value"in e||(e.value=i),null==n&&e.removeAttribute(t),e._value=n;return}let s=!1;if(""===n||null==n){let r=typeof e[t];if("boolean"===r){var o;n=!!(o=n)||""===o}else null==n&&"string"===r?(n="",s=!0):"number"===r&&(n=0,s=!0)}try{e[t]=n}catch(e){}s&&e.removeAttribute(i||t)}function sC(e,t,n,r){e.addEventListener(t,n,r)}let sk=Symbol("_vei"),sT=/(?:Once|Passive|Capture)$/,sw=0,sN=Promise.resolve(),sA=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),sE=(e,t,n,r,i,l)=>{let s="svg"===i;if("class"===t){var o;let t;o=r,(t=e[l2])&&(o=(o?[o,...t]:[...t]).join(" ")),null==o?e.removeAttribute("class"):s?e.setAttribute("class",o):e.className=o}else"style"===t?function(e,t,n){let r=e.style,i=N(n),l=!1;if(n&&!i){if(t)if(N(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&sy(r,t,"")}else for(let e in t)null==n[e]&&sy(r,e,"");for(let e in n)"display"===e&&(l=!0),sy(r,e,n[e])}else if(i){if(t!==n){let e=r[sp];e&&(n+=";"+e),r.cssText=n,l=sg.test(n)}}else t&&e.removeAttribute("style");sa in e&&(e[sa]=l?r.display:"",e[sc]&&(r.display="none"))}(e,n,r):b(t)?_(t)||function(e,t,n,r=null){let i=e[sk]||(e[sk]={}),l=i[t];if(n&&l)l.value=n;else{let[a,c]=function(e){let t;if(sT.test(e)){let n;for(t={};n=e.match(sT);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):V(e.slice(2)),t]}(t);if(n){var s,o;let l;sC(e,a,i[t]=(s=n,o=r,(l=e=>{if(e._vts){if(e._vts<=l.attached)return}else e._vts=Date.now();tQ(function(e,t){if(!T(t))return t;{let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}}(e,l.value),o,5,[e])}).value=s,l.attached=sw||(sN.then(()=>sw=0),sw=Date.now()),l),c)}else l&&(e.removeEventListener(a,l,c),i[t]=void 0)}}(e,t,r,l):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,r){if(r)return!!("innerHTML"===t||"textContent"===t||t in e&&sA(t)&&w(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"sandbox"===t&&"IFRAME"===e.tagName||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(sA(t)&&N(n))&&t in e}(e,t,r,s))?e._isVueCE&&(function(e,t){let n=e._def.props;if(!n)return!1;let r=L(t);return Array.isArray(n)?n.some(e=>L(e)===r):Object.keys(n).some(e=>L(e)===r)}(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!N(r)))?sx(e,L(t),r,l,t):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),sS(e,t,r,s)):(sx(e,t,r),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||sS(e,t,r,s,l,"value"!==t))},sR={};function sI(e,t,n){let r,i=nz(e,t);"[object Object]"===(r=i,I.call(r))&&(i=S({},i,t));class l extends sM{constructor(e){super(i,e,n)}}return l.def=i,l}let sO=(e,t)=>sI(e,t,ou),sP="u">typeof HTMLElement?HTMLElement:class{};class sM extends sP{constructor(e,t={},n=oc){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._styleAnchors=new WeakMap,this._ob=null,this.shadowRoot&&n!==oc?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow(S({},e.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.assignedSlot||e.parentNode||e.host);)if(e instanceof sM){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,t4(()=>{!this._connected&&(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(e){for(let t of e)this._setAttr(t.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);this._ob=new MutationObserver(this._processMutations.bind(this)),this._ob.observe(this,{attributes:!0});let e=(e,t=!1)=>{let n;this._resolved=!0,this._pendingResolve=void 0;let{props:r,styles:i}=e;if(r&&!T(r))for(let e in r){let t=r[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=K(this._props[e])),(n||(n=Object.create(null)))[L(e)]=!0)}this._numberProps=n,this._resolveProps(e),this.shadowRoot&&this._applyStyles(i),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);let t=this._instance&&this._instance.exposed;if(t)for(let e in t)k(this,e)||Object.defineProperty(this,e,{get:()=>tE(t[e])})}_resolveProps(e){let{props:t}=e,n=T(t)?t:Object.keys(t||{});for(let e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(let e of n.map(L))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!this._patching)}})}_setAttr(e){if(e.startsWith("data-v-"))return;let t=this.hasAttribute(e),n=t?this.getAttribute(e):sR,r=L(e);t&&this._numberProps&&this._numberProps[r]&&(n=K(n)),this._setProp(r,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!1){if(t!==this._props[e]&&(this._dirty=!0,t===sR?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),r&&this._instance&&this._update(),n)){let n=this._ob;n&&(this._processMutations(n.takeRecords()),n.disconnect()),!0===t?this.setAttribute(V(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(V(e),t+""):t||this.removeAttribute(V(e)),n&&n.observe(this,{attributes:!0})}}_update(){let e=this._createVNode();this._app&&(e.appContext=this._app._context),oo(e,this._root)}_createVNode(){let e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));let t=ls(this._def,S(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;let t=(e,t)=>{let n;this.dispatchEvent(new CustomEvent(e,"[object Object]"===(n=t[0],I.call(n))?S({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),V(e)!==e&&t(V(e),n)},this._setParent()}),t}_applyStyles(e,t,n){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}let r=this._nonce,i=this.shadowRoot,l=n?this._getStyleAnchor(n)||this._getStyleAnchor(this._def):this._getRootStyleInsertionAnchor(i),s=null;for(let o=e.length-1;o>=0;o--){let a=document.createElement("style");r&&a.setAttribute("nonce",r),a.textContent=e[o],i.insertBefore(a,s||l),s=a,0===o&&(n||this._styleAnchors.set(this._def,a),t&&this._styleAnchors.set(t,a))}}_getStyleAnchor(e){if(!e)return null;let t=this._styleAnchors.get(e);return t&&t.parentNode===this.shadowRoot?t:(t&&this._styleAnchors.delete(e),null)}_getRootStyleInsertionAnchor(e){for(let t=0;t<e.childNodes.length;t++){let n=e.childNodes[t];if(!(n instanceof HTMLStyleElement))return n}return null}_parseSlots(){let e,t=this._slots={};for(;e=this.firstChild;){let n=1===e.nodeType&&e.getAttribute("slot")||"default";(t[n]||(t[n]=[])).push(e),this.removeChild(e)}}_renderSlots(){let e=this._getSlots(),t=this._instance.type.__scopeId;for(let n=0;n<e.length;n++){let r=e[n],i=r.getAttribute("name")||"default",l=this._slots[i],s=r.parentNode;if(l)for(let e of l){if(t&&1===e.nodeType){let n,r=t+"-s",i=document.createTreeWalker(e,1);for(e.setAttribute(r,"");n=i.nextNode();)n.setAttribute(r,"")}s.insertBefore(e,r)}else for(;r.firstChild;)s.insertBefore(r.firstChild,r);s.removeChild(r)}}_getSlots(){let e=[this];this._teleportTargets&&e.push(...this._teleportTargets);let t=new Set;for(let n of e){let e=n.querySelectorAll("slot");for(let n=0;n<e.length;n++)t.add(e[n])}return Array.from(t)}_injectChildStyle(e,t){this._applyStyles(e.styles,e,t)}_beginPatch(){this._patching=!0,this._dirty=!1}_endPatch(){this._patching=!1,this._dirty&&this._instance&&this._update()}_hasShadowRoot(){return!1!==this._def.shadowRoot}_removeChildStyle(e){}}function sD(e){let t=lS(),n=t&&t.ce;return n||null}function sF(){let e=sD();return e&&e.shadowRoot}function sL(e="$style"){{let t=lS();if(!t)return f;let n=t.type.__cssModules;if(!n)return f;let r=n[e];return r||f}}let s$=new WeakMap,sV=new WeakMap,sB=Symbol("_moveCb"),sj=Symbol("_enterCb"),sU=(om={name:"TransitionGroup",props:S({},l3,{tag:String,moveClass:String}),setup(e,{slots:t}){let n,r,i=lS(),l=nD();return rS(()=>{if(!n.length)return;let t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){let r=e.cloneNode(),i=e[l2];i&&i.forEach(e=>{e.split(/\s+/).forEach(e=>e&&r.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&r.classList.add(e)),r.style.display="none";let l=1===t.nodeType?t:t.parentNode;l.appendChild(r);let{hasTransform:s}=si(r);return l.removeChild(r),s}(n[0].el,i.vnode.el,t)){n=[];return}n.forEach(sH),n.forEach(sq);let r=n.filter(sW);so(i.vnode.el),r.forEach(e=>{let n=e.el,r=n.style;l7(n,t),r.transform=r.webkitTransform=r.transitionDuration="";let i=n[sB]=e=>{(!e||e.target===n)&&(!e||e.propertyName.endsWith("transform"))&&(n.removeEventListener("transitionend",i),n[sB]=null,se(n,t))};n.addEventListener("transitionend",i)}),n=[]}),()=>{let s=tb(e),o=l9(s),a=s.tag||iX;if(n=[],r)for(let e=0;e<r.length;e++){let t=r[e];t.el&&t.el instanceof Element&&(n.push(t),nW(t,nU(t,o,l,i)),s$.set(t,sK(t.el)))}r=t.default?nK(t.default()):[];for(let e=0;e<r.length;e++){let t=r[e];null!=t.key&&nW(t,nU(t,o,l,i))}return ls(a,null,r)}}},delete om.props.mode,om);function sH(e){let t=e.el;t[sB]&&t[sB](),t[sj]&&t[sj]()}function sq(e){sV.set(e,sK(e.el))}function sW(e){let t=s$.get(e),n=sV.get(e),r=t.left-n.left,i=t.top-n.top;if(r||i){let t=e.el,n=t.style,l=t.getBoundingClientRect(),s=1,o=1;return t.offsetWidth&&(s=l.width/t.offsetWidth),t.offsetHeight&&(o=l.height/t.offsetHeight),Number.isFinite(s)&&0!==s||(s=1),Number.isFinite(o)&&0!==o||(o=1),.01>Math.abs(s-1)&&(s=1),.01>Math.abs(o-1)&&(o=1),n.transform=n.webkitTransform=`translate(${r/s}px,${i/o}px)`,n.transitionDuration="0s",e}}function sK(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}let sz=e=>{let t=e.props["onUpdate:modelValue"]||!1;return T(t)?e=>H(t,e):t};function sJ(e){e.target.composing=!0}function sG(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}let sQ=Symbol("_assign");function sX(e,t,n){return t&&(e=e.trim()),n&&(e=W(e)),e}let sZ={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[sQ]=sz(i);let l=r||i.props&&"number"===i.props.type;sC(e,t?"change":"input",t=>{t.target.composing||e[sQ](sX(e.value,n,l))}),(n||l)&&sC(e,"change",()=>{e.value=sX(e.value,n,l)}),t||(sC(e,"compositionstart",sJ),sC(e,"compositionend",sG),sC(e,"change",sG))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:l}},s){if(e[sQ]=sz(s),e.composing)return;let o=(l||"number"===e.type)&&!/^0\d/.test(e.value)?W(e.value):e.value,a=null==t?"":t;if(o===a)return;let c=e.getRootNode();(c instanceof Document||c instanceof ShadowRoot)&&c.activeElement===e&&"range"!==e.type&&(r&&t===n||i&&e.value.trim()===a)||(e.value=a)}},sY={deep:!0,created(e,t,n){e[sQ]=sz(n),sC(e,"change",()=>{let t=e._modelValue,n=s3(e),r=e.checked,i=e[sQ];if(T(t)){let e=ea(t,n),l=-1!==e;if(r&&!l)i(t.concat(n));else if(!r&&l){let n=[...t];n.splice(e,1),i(n)}}else{let l;if("[object Set]"===(l=t,I.call(l))){let e=new Set(t);r?e.add(n):e.delete(n),i(e)}else i(s4(e,r))}})},mounted:s0,beforeUpdate(e,t,n){e[sQ]=sz(n),s0(e,t,n)}};function s0(e,{value:t,oldValue:n},r){let i;if(e._modelValue=t,T(t))i=ea(t,r.props.value)>-1;else{let l;if("[object Set]"===(l=t,I.call(l)))i=t.has(r.props.value);else{if(t===n)return;i=eo(t,s4(e,!0))}}e.checked!==i&&(e.checked=i)}let s1={created(e,{value:t},n){e.checked=eo(t,n.props.value),e[sQ]=sz(n),sC(e,"change",()=>{e[sQ](s3(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[sQ]=sz(r),t!==n&&(e.checked=eo(t,r.props.value))}},s2={deep:!0,created(e,{value:t,modifiers:{number:n}},r){let i,l="[object Set]"===(i=t,I.call(i));sC(e,"change",()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?W(s3(e)):s3(e));e[sQ](e.multiple?l?new Set(t):t:t[0]),e._assigning=!0,t4(()=>{e._assigning=!1})}),e[sQ]=sz(r)},mounted(e,{value:t}){s6(e,t)},beforeUpdate(e,t,n){e[sQ]=sz(n)},updated(e,{value:t}){e._assigning||s6(e,t)}};function s6(e,t){let n,r=e.multiple,i=T(t);if(!r||i||"[object Set]"===(n=t,I.call(n))){for(let n=0,l=e.options.length;n<l;n++){let l=e.options[n],s=s3(l);if(r)if(i){let e=typeof s;"string"===e||"number"===e?l.selected=t.some(e=>String(e)===String(s)):l.selected=ea(t,s)>-1}else l.selected=t.has(s);else if(eo(s3(l),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}r||-1===e.selectedIndex||(e.selectedIndex=-1)}}function s3(e){return"_value"in e?e._value:e.value}function s4(e,t){let n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}let s8={created(e,t,n){s9(e,t,n,null,"created")},mounted(e,t,n){s9(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){s9(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){s9(e,t,n,r,"updated")}};function s5(e,t){switch(e){case"SELECT":return s2;case"TEXTAREA":return sZ;default:switch(t){case"checkbox":return sY;case"radio":return s1;default:return sZ}}}function s9(e,t,n,r,i){let l=s5(e.tagName,n.props&&n.props.type)[i];l&&l(e,t,n,r)}let s7=["ctrl","shift","alt","meta"],oe={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>s7.some(n=>e[`${n}Key`]&&!t.includes(n))},ot=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(n,...r)=>{for(let e=0;e<t.length;e++){let r=oe[t[e]];if(r&&r(n,t))return}return e(n,...r)})},on={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},or=(e,t)=>{let n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=n=>{if(!("key"in n))return;let r=V(n.key);if(t.some(e=>e===r||on[e]===r))return e(n)})},oi=S({patchProp:sE},lY),ol=!1;function os(){return c=ol?c:iF(oi),ol=!0,c}let oo=(...e)=>{(c||(c=iD(oi))).render(...e)},oa=(...e)=>{os().hydrate(...e)},oc=(...e)=>{let t=(c||(c=iD(oi))).createApp(...e),{mount:n}=t;return t.mount=e=>{let r=op(e);if(!r)return;let i=t._component;w(i)||i.render||i.template||(i.template=r.innerHTML),1===r.nodeType&&(r.textContent="");let l=n(r,!1,od(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),l},t},ou=(...e)=>{let t=os().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=op(e);if(t)return n(t,!0,od(t))},t};function od(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function op(e){return N(e)?document.querySelector(e):e}let oh=!1,of=()=>{oh||(oh=!0,sZ.getSSRProps=({value:e})=>({value:e}),s1.getSSRProps=({value:e},t)=>{if(t.props&&eo(t.props.value,e))return{checked:!0}},sY.getSSRProps=({value:e},t)=>{if(T(e)){if(t.props&&ea(e,t.props.value)>-1)return{checked:!0}}else{let n;if("[object Set]"===(n=e,I.call(n))){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}}},s8.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;let n=s5(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)},su.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};var og,om,oy,ov=Object.freeze({__proto__:null,BaseTransition:nB,BaseTransitionPropsValidators:nL,Comment:iY,DeprecationTypes:lJ,EffectScope:eh,ErrorCodes:tJ,ErrorTypeStrings:lU,Fragment:iX,KeepAlive:rc,ReactiveEffect:ev,Static:i0,Suspense:iW,Teleport:nR,Text:iZ,TrackOpTypes:tB,Transition:l4,TransitionGroup:sU,TriggerOpTypes:tj,VueElement:sM,assertNumber:tz,callWithAsyncErrorHandling:tQ,callWithErrorHandling:tG,camelize:L,capitalize:B,cloneVNode:la,compatUtils:lz,computed:lD,createApp:oc,createBlock:i7,createCommentVNode:ld,createElementBlock:i9,createElementVNode:ll,createHydrationRenderer:iF,createPropsRestProxy:r3,createRenderer:iD,createSSRApp:ou,createSlots:rF,createStaticVNode:lu,createTextVNode:lc,createVNode:ls,customRef:tM,defineAsyncComponent:rs,defineComponent:nz,defineCustomElement:sI,defineEmits:rK,defineExpose:rz,defineModel:rQ,defineOptions:rJ,defineProps:rW,defineSSRCustomElement:sO,defineSlots:rG,devtools:lH,effect:eN,effectScope:ef,getCurrentInstance:lS,getCurrentScope:eg,getCurrentWatcher:tq,getTransitionRawChildren:nK,guardReactiveProps:lo,h:lF,handleError:tX,hasInjectionContext:nh,hydrate:oa,hydrateOnIdle:rt,hydrateOnInteraction:ri,hydrateOnMediaQuery:rr,hydrateOnVisible:rn,initCustomFormatter:lL,initDirectivesForSSR:of,inject:np,isMemoSame:lV,isProxy:tv,isReactive:tg,isReadonly:tm,isRef:tC,isRuntimeOnly:lE,isShallow:ty,isVNode:le,markRaw:t_,mergeDefaults:r2,mergeModels:r6,mergeProps:lg,nextTick:t4,nodeOps:lY,normalizeClass:ee,normalizeProps:et,normalizeStyle:G,onActivated:rd,onBeforeMount:rv,onBeforeUnmount:rx,onBeforeUpdate:r_,onDeactivated:rp,onErrorCaptured:rN,onMounted:rb,onRenderTracked:rw,onRenderTriggered:rT,onScopeDispose:em,onServerPrefetch:rk,onUnmounted:rC,onUpdated:rS,onWatcherCleanup:tW,openBlock:i6,patchProp:sE,popScopeId:ns,provide:nd,proxyRefs:tO,pushScopeId:nl,queuePostFlushCb:t9,reactive:tu,readonly:tp,ref:tk,registerRuntimeCompiler:lA,render:oo,renderList:rD,renderSlot:rL,resolveComponent:rE,resolveDirective:rO,resolveDynamicComponent:rI,resolveFilter:lK,resolveTransitionHooks:nU,setBlockTracking:i8,setDevtoolsHook:lq,setTransitionHooks:nW,shallowReactive:td,shallowReadonly:th,shallowRef:tT,ssrContextKey:nf,ssrUtils:lW,stop:eA,toDisplayString:eu,toHandlerKey:j,toHandlers:rV,toRaw:tb,toRef:t$,toRefs:tD,toValue:tR,transformVNodeArgs:ln,triggerRef:tA,unref:tE,useAttrs:rY,useCssModule:sL,useCssVars:sh,useHost:sD,useId:nJ,useModel:iu,useSSRContext:ng,useShadowRoot:sF,useSlots:rZ,useTemplateRef:nQ,useTransitionState:nD,vModelCheckbox:sY,vModelDynamic:s8,vModelRadio:s1,vModelSelect:s2,vModelText:sZ,vShow:su,version:lB,warn:lj,watch:nb,watchEffect:nm,watchPostEffect:ny,watchSyncEffect:nv,withAsyncContext:r4,withCtx:na,withDefaults:rX,withDirectives:nc,withKeys:or,withMemo:l$,withModifiers:ot,withScopeId:no});let ob=Symbol(""),o_=Symbol(""),oS=Symbol(""),ox=Symbol(""),oC=Symbol(""),ok=Symbol(""),oT=Symbol(""),ow=Symbol(""),oN=Symbol(""),oA=Symbol(""),oE=Symbol(""),oR=Symbol(""),oI=Symbol(""),oO=Symbol(""),oP=Symbol(""),oM=Symbol(""),oD=Symbol(""),oF=Symbol(""),oL=Symbol(""),o$=Symbol(""),oV=Symbol(""),oB=Symbol(""),oj=Symbol(""),oU=Symbol(""),oH=Symbol(""),oq=Symbol(""),oW=Symbol(""),oK=Symbol(""),oz=Symbol(""),oJ=Symbol(""),oG=Symbol(""),oQ=Symbol(""),oX=Symbol(""),oZ=Symbol(""),oY=Symbol(""),o0=Symbol(""),o1=Symbol(""),o2=Symbol(""),o6=Symbol(""),o3={[ob]:"Fragment",[o_]:"Teleport",[oS]:"Suspense",[ox]:"KeepAlive",[oC]:"BaseTransition",[ok]:"openBlock",[oT]:"createBlock",[ow]:"createElementBlock",[oN]:"createVNode",[oA]:"createElementVNode",[oE]:"createCommentVNode",[oR]:"createTextVNode",[oI]:"createStaticVNode",[oO]:"resolveComponent",[oP]:"resolveDynamicComponent",[oM]:"resolveDirective",[oD]:"resolveFilter",[oF]:"withDirectives",[oL]:"renderList",[o$]:"renderSlot",[oV]:"createSlots",[oB]:"toDisplayString",[oj]:"mergeProps",[oU]:"normalizeClass",[oH]:"normalizeStyle",[oq]:"normalizeProps",[oW]:"guardReactiveProps",[oK]:"toHandlers",[oz]:"camelize",[oJ]:"capitalize",[oG]:"toHandlerKey",[oQ]:"setBlockTracking",[oX]:"pushScopeId",[oZ]:"popScopeId",[oY]:"withCtx",[o0]:"unref",[o1]:"isRef",[o2]:"withMemo",[o6]:"isMemoSame"},o4={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function o8(e,t,n,r,i,l,s,o=!1,a=!1,c=!1,u=o4){var d,p,h,f;return e&&(o?(e.helper(ok),e.helper((d=e.inSSR,p=c,d||p?oT:ow))):e.helper((h=e.inSSR,f=c,h||f?oN:oA)),s&&e.helper(oF)),{type:13,tag:t,props:n,children:r,patchFlag:i,dynamicProps:l,directives:s,isBlock:o,disableTracking:a,isComponent:c,loc:u}}function o5(e,t=o4){return{type:17,loc:t,elements:e}}function o9(e,t=o4){return{type:15,loc:t,properties:e}}function o7(e,t){return{type:16,loc:o4,key:N(e)?ae(e,!0):e,value:t}}function ae(e,t=!1,n=o4,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function at(e,t=o4){return{type:8,loc:t,children:e}}function an(e,t=[],n=o4){return{type:14,loc:n,callee:e,arguments:t}}function ar(e,t,n=!1,r=!1,i=o4){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:i}}function ai(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:o4}}function al(e,{helper:t,removeHelper:n,inSSR:r}){if(!e.isBlock){var i,l;e.isBlock=!0,n((i=e.isComponent,r||i?oN:oA)),t(ok),t((l=e.isComponent,r||l?oT:ow))}}let as=new Uint8Array([123,123]),ao=new Uint8Array([125,125]);function aa(e){return e>=97&&e<=122||e>=65&&e<=90}function ac(e){return 32===e||10===e||9===e||12===e||13===e}function au(e){return 47===e||62===e||ac(e)}function ad(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}let ap={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97])};function ah(e){throw e}function af(e){}function ag(e,t,n,r){let i=SyntaxError(String(`https://vuejs.org/error-reference/#compiler-${e}`));return i.code=e,i.loc=t,i}let am=e=>4===e.type&&e.isStatic;function ay(e){switch(e){case"Teleport":case"teleport":return o_;case"Suspense":case"suspense":return oS;case"KeepAlive":case"keep-alive":return ox;case"BaseTransition":case"base-transition":return oC}}let av=/^$|^\d|[^\$\w\xA0-\uFFFF]/,ab=/[A-Za-z_$\xA0-\uFFFF]/,a_=/[\.\?\w$\xA0-\uFFFF]/,aS=/\s+[.[]\s*|\s*[.[]\s+/g,ax=e=>4===e.type?e.content:e.loc.source,aC=e=>{let t=ax(e).trim().replace(aS,e=>e.trim()),n=0,r=[],i=0,l=0,s=null;for(let e=0;e<t.length;e++){let o=t.charAt(e);switch(n){case 0:if("["===o)r.push(n),n=1,i++;else if("("===o)r.push(n),n=2,l++;else if(!(0===e?ab:a_).test(o))return!1;break;case 1:"'"===o||'"'===o||"`"===o?(r.push(n),n=3,s=o):"["===o?i++:"]"!==o||--i||(n=r.pop());break;case 2:if("'"===o||'"'===o||"`"===o)r.push(n),n=3,s=o;else if("("===o)l++;else if(")"===o){if(e===t.length-1)return!1;--l||(n=r.pop())}break;case 3:o===s&&(n=r.pop(),s=null)}}return!i&&!l},ak=/^\s*(?:async\s*)?(?:\([^)]*?\)|[\w$_]+)\s*(?::[^=]+)?=>|^\s*(?:async\s+)?function(?:\s+[\w$]+)?\s*\(/;function aT(e,t,n=!1){for(let r=0;r<e.props.length;r++){let i=e.props[r];if(7===i.type&&(n||i.exp)&&(N(t)?i.name===t:t.test(i.name)))return i}}function aw(e,t,n=!1,r=!1){for(let i=0;i<e.props.length;i++){let l=e.props[i];if(6===l.type){if(n)continue;if(l.name===t&&(l.value||r))return l}else if("bind"===l.name&&(l.exp||r)&&aN(l.arg,t))return l}}function aN(e,t){return!!(e&&am(e)&&e.content===t)}function aA(e){return 5===e.type||2===e.type}function aE(e){return 7===e.type&&"pre"===e.name}function aR(e){return 7===e.type&&"slot"===e.name}function aI(e){return 1===e.type&&3===e.tagType}function aO(e){return 1===e.type&&2===e.tagType}let aP=new Set([oq,oW]);function aM(e,t,n){let r,i,l=13===e.type?e.props:e.arguments[2],s=[];if(l&&!N(l)&&14===l.type){let e=function e(t,n=[]){if(t&&!N(t)&&14===t.type){let r=t.callee;if(!N(r)&&aP.has(r))return e(t.arguments[0],n.concat(t))}return[t,n]}(l);l=e[0],i=(s=e[1])[s.length-1]}if(null==l||N(l))r=o9([t]);else if(14===l.type){let e=l.arguments[0];N(e)||15!==e.type?l.callee===oK?r=an(n.helper(oj),[o9([t]),l]):l.arguments.unshift(o9([t])):aD(t,e)||e.properties.unshift(t),r||(r=l)}else 15===l.type?(aD(t,l)||l.properties.unshift(t),r=l):(r=an(n.helper(oj),[o9([t]),l]),i&&i.callee===oW&&(i=s[s.length-2]));13===e.type?i?i.arguments[0]=r:e.props=r:i?i.arguments[0]=r:e.arguments[2]=r}function aD(e,t){let n=!1;if(4===e.key.type){let r=e.key.content;n=t.properties.some(e=>4===e.key.type&&e.key.content===r)}return n}function aF(e,t){return`_${t}_${e.replace(/[^\w]/g,(t,n)=>"-"===t?"_":e.charCodeAt(n).toString())}`}let aL=/([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/;function a$(e){for(let t=0;t<e.length;t++)if(!ac(e.charCodeAt(t)))return!1;return!0}function aV(e){return 2===e.type&&a$(e.content)||12===e.type&&aV(e.content)}function aB(e){return 3===e.type||aV(e)}let aj={parseMode:"base",ns:0,delimiters:["{{","}}"],getNamespace:()=>0,isVoidTag:y,isPreTag:y,isIgnoreNewlineTag:y,isCustomElement:y,onError:ah,onWarn:af,comments:!1,prefixIdentifiers:!1},aU=aj,aH=null,aq="",aW=null,aK=null,az="",aJ=-1,aG=-1,aQ=0,aX=!1,aZ=null,aY=[],a0=new class{constructor(e,t){this.stack=e,this.cbs=t,this.state=1,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=as,this.delimiterClose=ao,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return 2===this.mode&&0===this.stack.length}reset(){this.state=1,this.mode=0,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=as,this.delimiterClose=ao}getPos(e){let t=1,n=e+1,r=this.newlines.length,i=-1;if(r>100){let t=-1,n=r;for(;t+1<n;){let r=t+n>>>1;this.newlines[r]<e?t=r:n=r}i=t}else for(let t=r-1;t>=0;t--)if(e>this.newlines[t]){i=t;break}return i>=0&&(t=i+2,n=e-this.newlines[i]),{column:n,line:t,offset:e}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(e){60===e?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e))}stateInterpolationOpen(e){if(e===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){let e=this.index+1-this.delimiterOpen.length;e>this.sectionStart&&this.cbs.ontext(this.sectionStart,e),this.state=3,this.sectionStart=e}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(e)):(this.state=1,this.stateText(e))}stateInterpolation(e){e===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(e))}stateInterpolationClose(e){e===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(e))}stateSpecialStartSequence(e){let t=this.sequenceIndex===this.currentSequence.length;if(t?au(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.inRCDATA=!1;this.sequenceIndex=0,this.state=6,this.stateInTagName(e)}stateInRCDATA(e){if(this.sequenceIndex===this.currentSequence.length){if(62===e||ac(e)){let t=this.index-this.currentSequence.length;if(this.sectionStart<t){let e=this.index;this.index=t,this.cbs.ontext(this.sectionStart,t),this.index=e}this.sectionStart=t+2,this.stateInClosingTagName(e),this.inRCDATA=!1;return}this.sequenceIndex=0}(32|e)===this.currentSequence[this.sequenceIndex]?this.sequenceIndex+=1:0===this.sequenceIndex?this.currentSequence!==ap.TitleEnd&&(this.currentSequence!==ap.TextareaEnd||this.inSFCRoot)?this.fastForwardTo(60)&&(this.sequenceIndex=1):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e)):this.sequenceIndex=Number(60===e)}stateCDATASequence(e){e===ap.Cdata[this.sequenceIndex]?++this.sequenceIndex===ap.Cdata.length&&(this.state=28,this.currentSequence=ap.CdataEnd,this.sequenceIndex=0,this.sectionStart=this.index+1):(this.sequenceIndex=0,this.state=23,this.stateInDeclaration(e))}fastForwardTo(e){for(;++this.index<this.buffer.length;){let t=this.buffer.charCodeAt(this.index);if(10===t&&this.newlines.push(this.index),t===e)return!0}return this.index=this.buffer.length-1,!1}stateInCommentLike(e){e===this.currentSequence[this.sequenceIndex]?++this.sequenceIndex===this.currentSequence.length&&(this.currentSequence===ap.CdataEnd?this.cbs.oncdata(this.sectionStart,this.index-2):this.cbs.oncomment(this.sectionStart,this.index-2),this.sequenceIndex=0,this.sectionStart=this.index+1,this.state=1):0===this.sequenceIndex?this.fastForwardTo(this.currentSequence[0])&&(this.sequenceIndex=1):e!==this.currentSequence[this.sequenceIndex-1]&&(this.sequenceIndex=0)}startSpecial(e,t){this.enterRCDATA(e,t),this.state=31}enterRCDATA(e,t){this.inRCDATA=!0,this.currentSequence=e,this.sequenceIndex=t}stateBeforeTagName(e){33===e?(this.state=22,this.sectionStart=this.index+1):63===e?(this.state=24,this.sectionStart=this.index+1):aa(e)?(this.sectionStart=this.index,0===this.mode?this.state=6:this.inSFCRoot?this.state=34:this.inXML?this.state=6:116===e?this.state=30:this.state=115===e?29:6):47===e?this.state=8:(this.state=1,this.stateText(e))}stateInTagName(e){au(e)&&this.handleTagName(e)}stateInSFCRootTagName(e){if(au(e)){let t=this.buffer.slice(this.sectionStart,this.index);"template"!==t&&this.enterRCDATA(ad("</"+t),0),this.handleTagName(e)}}handleTagName(e){this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(e)}stateBeforeClosingTagName(e){ac(e)||(62===e?(this.state=1,this.sectionStart=this.index+1):(this.state=aa(e)?9:27,this.sectionStart=this.index))}stateInClosingTagName(e){(62===e||ac(e))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=10,this.stateAfterClosingTagName(e))}stateAfterClosingTagName(e){62===e&&(this.state=1,this.sectionStart=this.index+1)}stateBeforeAttrName(e){62===e?(this.cbs.onopentagend(this.index),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):47===e?this.state=7:60===e&&47===this.peek()?(this.cbs.onopentagend(this.index),this.state=5,this.sectionStart=this.index):ac(e)||this.handleAttrStart(e)}handleAttrStart(e){118===e&&45===this.peek()?(this.state=13,this.sectionStart=this.index):46===e||58===e||64===e||35===e?(this.cbs.ondirname(this.index,this.index+1),this.state=14,this.sectionStart=this.index+1):(this.state=12,this.sectionStart=this.index)}stateInSelfClosingTag(e){62===e?(this.cbs.onselfclosingtag(this.index),this.state=1,this.sectionStart=this.index+1,this.inRCDATA=!1):ac(e)||(this.state=11,this.stateBeforeAttrName(e))}stateInAttrName(e){(61===e||au(e))&&(this.cbs.onattribname(this.sectionStart,this.index),this.handleAttrNameEnd(e))}stateInDirName(e){61===e||au(e)?(this.cbs.ondirname(this.sectionStart,this.index),this.handleAttrNameEnd(e)):58===e?(this.cbs.ondirname(this.sectionStart,this.index),this.state=14,this.sectionStart=this.index+1):46===e&&(this.cbs.ondirname(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDirArg(e){61===e||au(e)?(this.cbs.ondirarg(this.sectionStart,this.index),this.handleAttrNameEnd(e)):91===e?this.state=15:46===e&&(this.cbs.ondirarg(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDynamicDirArg(e){93===e?this.state=14:(61===e||au(e))&&(this.cbs.ondirarg(this.sectionStart,this.index+1),this.handleAttrNameEnd(e))}stateInDirModifier(e){61===e||au(e)?(this.cbs.ondirmodifier(this.sectionStart,this.index),this.handleAttrNameEnd(e)):46===e&&(this.cbs.ondirmodifier(this.sectionStart,this.index),this.sectionStart=this.index+1)}handleAttrNameEnd(e){this.sectionStart=this.index,this.state=17,this.cbs.onattribnameend(this.index),this.stateAfterAttrName(e)}stateAfterAttrName(e){61===e?this.state=18:47===e||62===e?(this.cbs.onattribend(0,this.sectionStart),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(e)):ac(e)||(this.cbs.onattribend(0,this.sectionStart),this.handleAttrStart(e))}stateBeforeAttrValue(e){34===e?(this.state=19,this.sectionStart=this.index+1):39===e?(this.state=20,this.sectionStart=this.index+1):ac(e)||(this.sectionStart=this.index,this.state=21,this.stateInAttrValueNoQuotes(e))}handleInAttrValue(e,t){(e===t||this.fastForwardTo(t))&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(34===t?3:2,this.index+1),this.state=11)}stateInAttrValueDoubleQuotes(e){this.handleInAttrValue(e,34)}stateInAttrValueSingleQuotes(e){this.handleInAttrValue(e,39)}stateInAttrValueNoQuotes(e){ac(e)||62===e?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(1,this.index),this.state=11,this.stateBeforeAttrName(e)):(39===e||60===e||61===e||96===e)&&this.cbs.onerr(18,this.index)}stateBeforeDeclaration(e){91===e?(this.state=26,this.sequenceIndex=0):this.state=45===e?25:23}stateInDeclaration(e){(62===e||this.fastForwardTo(62))&&(this.state=1,this.sectionStart=this.index+1)}stateInProcessingInstruction(e){(62===e||this.fastForwardTo(62))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeComment(e){45===e?(this.state=28,this.currentSequence=ap.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=23}stateInSpecialComment(e){(62===e||this.fastForwardTo(62))&&(this.cbs.oncomment(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeSpecialS(e){e===ap.ScriptEnd[3]?this.startSpecial(ap.ScriptEnd,4):e===ap.StyleEnd[3]?this.startSpecial(ap.StyleEnd,4):(this.state=6,this.stateInTagName(e))}stateBeforeSpecialT(e){e===ap.TitleEnd[3]?this.startSpecial(ap.TitleEnd,4):e===ap.TextareaEnd[3]?this.startSpecial(ap.TextareaEnd,4):(this.state=6,this.stateInTagName(e))}startEntity(){}stateInEntity(){}parse(e){for(this.buffer=e;this.index<this.buffer.length;){let e=this.buffer.charCodeAt(this.index);switch(10===e&&33!==this.state&&this.newlines.push(this.index),this.state){case 1:this.stateText(e);break;case 2:this.stateInterpolationOpen(e);break;case 3:this.stateInterpolation(e);break;case 4:this.stateInterpolationClose(e);break;case 31:this.stateSpecialStartSequence(e);break;case 32:this.stateInRCDATA(e);break;case 26:this.stateCDATASequence(e);break;case 19:this.stateInAttrValueDoubleQuotes(e);break;case 12:this.stateInAttrName(e);break;case 13:this.stateInDirName(e);break;case 14:this.stateInDirArg(e);break;case 15:this.stateInDynamicDirArg(e);break;case 16:this.stateInDirModifier(e);break;case 28:this.stateInCommentLike(e);break;case 27:this.stateInSpecialComment(e);break;case 11:this.stateBeforeAttrName(e);break;case 6:this.stateInTagName(e);break;case 34:this.stateInSFCRootTagName(e);break;case 9:this.stateInClosingTagName(e);break;case 5:this.stateBeforeTagName(e);break;case 17:this.stateAfterAttrName(e);break;case 20:this.stateInAttrValueSingleQuotes(e);break;case 18:this.stateBeforeAttrValue(e);break;case 8:this.stateBeforeClosingTagName(e);break;case 10:this.stateAfterClosingTagName(e);break;case 29:this.stateBeforeSpecialS(e);break;case 30:this.stateBeforeSpecialT(e);break;case 21:this.stateInAttrValueNoQuotes(e);break;case 7:this.stateInSelfClosingTag(e);break;case 23:this.stateInDeclaration(e);break;case 22:this.stateBeforeDeclaration(e);break;case 25:this.stateBeforeComment(e);break;case 24:this.stateInProcessingInstruction(e);break;case 33:this.stateInEntity()}this.index++}this.cleanup(),this.finish()}cleanup(){this.sectionStart!==this.index&&(1===this.state||32===this.state&&0===this.sequenceIndex?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(19===this.state||20===this.state||21===this.state)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}finish(){this.handleTrailingData(),this.cbs.onend()}handleTrailingData(){let e=this.buffer.length;this.sectionStart>=e||(28===this.state?this.currentSequence===ap.CdataEnd?this.cbs.oncdata(this.sectionStart,e):this.cbs.oncomment(this.sectionStart,e):6===this.state||11===this.state||18===this.state||17===this.state||12===this.state||13===this.state||14===this.state||15===this.state||16===this.state||20===this.state||19===this.state||21===this.state||9===this.state||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){}}(aY,{onerr:cs,ontext(e,t){a4(a6(e,t),e,t)},ontextentity(e,t,n){a4(e,t,n)},oninterpolation(e,t){if(aX)return a4(a6(e,t),e,t);let n=e+a0.delimiterOpen.length,r=t-a0.delimiterClose.length;for(;ac(aq.charCodeAt(n));)n++;for(;ac(aq.charCodeAt(r-1));)r--;let i=a6(n,r);i.includes("&")&&(i=aU.decodeEntities(i,!1)),cn({type:5,content:cl(i,!1,cr(n,r)),loc:cr(e,t)})},onopentagname(e,t){let n=a6(e,t);aW={type:1,tag:n,ns:aU.getNamespace(n,aY[0],aU.ns),tagType:0,props:[],children:[],loc:cr(e-1,t),codegenNode:void 0}},onopentagend(e){a3(e)},onclosetag(e,t){let n=a6(e,t);if(!aU.isVoidTag(n)){let r=!1;for(let e=0;e<aY.length;e++)if(aY[e].tag.toLowerCase()===n.toLowerCase()){r=!0,e>0&&aY[0].loc.start.offset;for(let n=0;n<=e;n++)a8(aY.shift(),t,n<e);break}r||a5(e,60)}},onselfclosingtag(e){let t=aW.tag;aW.isSelfClosing=!0,a3(e),aY[0]&&aY[0].tag===t&&a8(aY.shift(),e)},onattribname(e,t){aK={type:6,name:a6(e,t),nameLoc:cr(e,t),value:void 0,loc:cr(e)}},ondirname(e,t){let n=a6(e,t),r="."===n||":"===n?"bind":"@"===n?"on":"#"===n?"slot":n.slice(2);if(aX||""===r)aK={type:6,name:n,nameLoc:cr(e,t),value:void 0,loc:cr(e)};else if(aK={type:7,name:r,rawName:n,exp:void 0,arg:void 0,modifiers:"."===n?[ae("prop")]:[],loc:cr(e)},"pre"===r){aX=a0.inVPre=!0,aZ=aW;let e=aW.props;for(let t=0;t<e.length;t++)7===e[t].type&&(e[t]=function(e){let t={type:6,name:e.rawName,nameLoc:cr(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){let n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}(e[t]))}},ondirarg(e,t){if(e===t)return;let n=a6(e,t);if(aX&&!aE(aK))aK.name+=n,ci(aK.nameLoc,t);else{let r="["!==n[0];aK.arg=cl(r?n:n.slice(1,-1),r,cr(e,t),3*!!r)}},ondirmodifier(e,t){let n=a6(e,t);if(aX&&!aE(aK))aK.name+="."+n,ci(aK.nameLoc,t);else if("slot"===aK.name){let e=aK.arg;e&&(e.content+="."+n,ci(e.loc,t))}else{let r=ae(n,!0,cr(e,t));aK.modifiers.push(r)}},onattribdata(e,t){az+=a6(e,t),aJ<0&&(aJ=e),aG=t},onattribentity(e,t,n){az+=e,aJ<0&&(aJ=t),aG=n},onattribnameend(e){let t=a6(aK.loc.start.offset,e);7===aK.type&&(aK.rawName=t),aW.props.some(e=>(7===e.type?e.rawName:e.name)===t)},onattribend(e,t){aW&&aK&&(ci(aK.loc,t),0!==e&&(az.includes("&")&&(az=aU.decodeEntities(az,!0)),6===aK.type?("class"===aK.name&&(az=ct(az).trim()),aK.value={type:2,content:az,loc:1===e?cr(aJ,aG):cr(aJ-1,aG+1)},a0.inSFCRoot&&"template"===aW.tag&&"lang"===aK.name&&az&&"html"!==az&&a0.enterRCDATA(ad("</template"),0)):(aK.exp=cl(az,!1,cr(aJ,aG),0,0),"for"===aK.name&&(aK.forParseResult=function(e){let t=e.loc,n=e.content,r=n.match(aL);if(!r)return;let[,i,l]=r,s=(e,n,r=!1)=>{let i=t.start.offset+n,l=i+e.length;return cl(e,!1,cr(i,l),0,+!!r)},o={source:s(l.trim(),n.indexOf(l,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1},a=i.trim().replace(a2,"").trim(),c=i.indexOf(a),u=a.match(a1);if(u){let e;a=a.replace(a1,"").trim();let t=u[1].trim();if(t&&(e=n.indexOf(t,c+a.length),o.key=s(t,e,!0)),u[2]){let r=u[2].trim();r&&(o.index=s(r,n.indexOf(r,o.key?e+t.length:c+a.length),!0))}}return a&&(o.value=s(a,c,!0)),o}(aK.exp)))),(7!==aK.type||"pre"!==aK.name)&&aW.props.push(aK)),az="",aJ=aG=-1},oncomment(e,t){aU.comments&&cn({type:3,content:a6(e,t),loc:cr(e-4,t+3)})},onend(){let e=aq.length;for(let t=0;t<aY.length;t++)a8(aY[t],e-1),aY[t].loc.start.offset},oncdata(e,t){0!==aY[0].ns&&a4(a6(e,t),e,t)},onprocessinginstruction(e){(aY[0]?aY[0].ns:aU.ns)===0&&cs(21,e-1)}}),a1=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,a2=/^\(|\)$/g;function a6(e,t){return aq.slice(e,t)}function a3(e){a0.inSFCRoot&&(aW.innerLoc=cr(e+1,e+1)),cn(aW);let{tag:t,ns:n}=aW;0===n&&aU.isPreTag(t)&&aQ++,aU.isVoidTag(t)?a8(aW,e):(aY.unshift(aW),(1===n||2===n)&&(a0.inXML=!0)),aW=null}function a4(e,t,n){{let t=aY[0]&&aY[0].tag;"script"!==t&&"style"!==t&&e.includes("&")&&(e=aU.decodeEntities(e,!1))}let r=aY[0]||aH,i=r.children[r.children.length-1];i&&2===i.type?(i.content+=e,ci(i.loc,n)):r.children.push({type:2,content:e,loc:cr(t,n)})}function a8(e,t,n=!1){n?ci(e.loc,a5(t,60)):ci(e.loc,function(e){let t=e;for(;62!==aq.charCodeAt(t)&&t<aq.length-1;)t++;return t}(t)+1),a0.inSFCRoot&&(e.children.length?e.innerLoc.end=S({},e.children[e.children.length-1].loc.end):e.innerLoc.end=S({},e.innerLoc.start),e.innerLoc.source=a6(e.innerLoc.start.offset,e.innerLoc.end.offset));let{tag:r,ns:i,children:l}=e;if(!aX&&("slot"===r?e.tagType=2:!function({tag:e,props:t}){if("template"===e){for(let e=0;e<t.length;e++)if(7===t[e].type&&a9.has(t[e].name))return!0}return!1}(e)?function({tag:e,props:t}){var n;if(aU.isCustomElement(e))return!1;if("component"===e||(n=e.charCodeAt(0))>64&&n<91||ay(e)||aU.isBuiltInComponent&&aU.isBuiltInComponent(e)||aU.isNativeTag&&!aU.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){let n=t[e];if(6===n.type&&"is"===n.name&&n.value&&n.value.content.startsWith("vue:"))return!0}return!1}(e)&&(e.tagType=1):e.tagType=3),a0.inRCDATA||(e.children=ce(l)),0===i&&aU.isIgnoreNewlineTag(r)){let e=l[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}0===i&&aU.isPreTag(r)&&aQ--,aZ===e&&(aX=a0.inVPre=!1,aZ=null),a0.inXML&&(aY[0]?aY[0].ns:aU.ns)===0&&(a0.inXML=!1)}function a5(e,t){let n=e;for(;aq.charCodeAt(n)!==t&&n>=0;)n--;return n}let a9=new Set(["if","else","else-if","for","slot"]),a7=/\r\n/g;function ce(e){let t="preserve"!==aU.whitespace,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(2===i.type)if(aQ)i.content=i.content.replace(a7,`
-`);else if(a$(i.content)){let l=e[r-1]&&e[r-1].type,s=e[r+1]&&e[r+1].type;!l||!s||t&&(3===l&&(3===s||1===s)||1===l&&(3===s||1===s&&function(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(10===n||13===n)return!0}return!1}(i.content)))?(n=!0,e[r]=null):i.content=" "}else t&&(i.content=ct(i.content))}return n?e.filter(Boolean):e}function ct(e){let t="",n=!1;for(let r=0;r<e.length;r++)ac(e.charCodeAt(r))?n||(t+=" ",n=!0):(t+=e[r],n=!1);return t}function cn(e){(aY[0]||aH).children.push(e)}function cr(e,t){return{start:a0.getPos(e),end:null==t?t:a0.getPos(t),source:null==t?t:a6(e,t)}}function ci(e,t){e.end=a0.getPos(t),e.source=a6(e.start.offset,t)}function cl(e,t=!1,n,r=0,i=0){return ae(e,t,n,r)}function cs(e,t,n){aU.onError(ag(e,cr(t,t)))}function co(e){let t=e.children.filter(e=>3!==e.type);return 1!==t.length||1!==t[0].type||aO(t[0])?null:t[0]}function ca(e,t){let{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;let r=n.get(e);if(void 0!==r)return r;let i=e.codegenNode;if(13!==i.type||i.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag&&"math"!==e.tag)return 0;if(void 0!==i.patchFlag)return n.set(e,0),0;{let r=3,c=cu(e,t);if(0===c)return n.set(e,0),0;c<r&&(r=c);for(let i=0;i<e.children.length;i++){let l=ca(e.children[i],t);if(0===l)return n.set(e,0),0;l<r&&(r=l)}if(r>1)for(let i=0;i<e.props.length;i++){let l=e.props[i];if(7===l.type&&"bind"===l.name&&l.exp){let i=ca(l.exp,t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}}if(i.isBlock){var l,s,o,a;for(let t=0;t<e.props.length;t++)if(7===e.props[t].type)return n.set(e,0),0;t.removeHelper(ok),t.removeHelper((l=t.inSSR,s=i.isComponent,l||s?oT:ow)),i.isBlock=!1,t.helper((o=t.inSSR,a=i.isComponent,o||a?oN:oA))}return n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return ca(e.content,t);case 4:return e.constType;case 8:let c=3;for(let n=0;n<e.children.length;n++){let r=e.children[n];if(N(r)||A(r))continue;let i=ca(r,t);if(0===i)return 0;i<c&&(c=i)}return c;case 20:return 2}}let cc=new Set([oU,oH,oq,oW]);function cu(e,t){let n=3,r=cd(e);if(r&&15===r.type){let{properties:e}=r;for(let r=0;r<e.length;r++){let i,{key:l,value:s}=e[r],o=ca(l,t);if(0===o)return o;if(o<n&&(n=o),0===(i=4===s.type?ca(s,t):14===s.type?function e(t,n){if(14===t.type&&!N(t.callee)&&cc.has(t.callee)){let r=t.arguments[0];if(4===r.type)return ca(r,n);if(14===r.type)return e(r,n)}return 0}(s,t):0))return i;i<n&&(n=i)}}return n}function cd(e){let t=e.codegenNode;if(13===t.type)return t.props}function cp(e,t){t.currentNode=e;let{nodeTransforms:n}=t,r=[];for(let i=0;i<n.length;i++){let l=n[i](e,t);if(l&&(T(l)?r.push(...l):r.push(l)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(oE);break;case 5:t.ssr||t.helper(oB);break;case 9:for(let n=0;n<e.branches.length;n++)cp(e.branches[n],t);break;case 10:case 11:case 1:case 0:var i=e;let l=0,s=()=>{l--};for(;l<i.children.length;l++){let e=i.children[l];N(e)||(t.grandParent=t.parent,t.parent=i,t.childIndex=l,t.onNodeRemoved=s,cp(e,t))}}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function ch(e,t){let n=N(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){let{props:i}=e;if(3===e.tagType&&i.some(aR))return;let l=[];for(let s=0;s<i.length;s++){let o=i[s];if(7===o.type&&n(o.name)){i.splice(s,1),s--;let n=t(e,o,r);n&&l.push(n)}}return l}}}let cf="/*@__PURE__*/",cg=e=>`${o3[e]}: _${o3[e]}`;function cm(e,t,{helper:n,push:r,newline:i,isTS:l}){let s=n("component"===t?oO:oM);for(let n=0;n<e.length;n++){let o=e[n],a=o.endsWith("__self");a&&(o=o.slice(0,-6)),r(`const ${aF(o,t)} = ${s}(${JSON.stringify(o)}${a?", true":""})${l?"!":""}`),n<e.length-1&&i()}}function cy(e,t){let n=e.length>3;t.push("["),n&&t.indent(),cv(e,t,n),n&&t.deindent(),t.push("]")}function cv(e,t,n=!1,r=!0){let{push:i,newline:l}=t;for(let s=0;s<e.length;s++){let o=e[s];N(o)?i(o,-3):T(o)?cy(o,t):cb(o,t),s<e.length-1&&(n?(r&&i(","),l()):r&&i(", "))}}function cb(e,t){var n,r,i;if(N(e))return void t.push(e,-3);if(A(e))return void t.push(t.helper(e));switch(e.type){case 1:case 9:case 11:case 12:cb(e.codegenNode,t);break;case 2:n=e,t.push(JSON.stringify(n.content),-3,n);break;case 4:c_(e,t);break;case 5:!function(e,t){let{push:n,helper:r,pure:i}=t;i&&n(cf),n(`${r(oB)}(`),cb(e.content,t),n(")")}(e,t);break;case 8:cS(e,t);break;case 3:!function(e,t){let{push:n,helper:r,pure:i}=t;i&&n(cf),n(`${r(oE)}(${JSON.stringify(e.content)})`,-3,e)}(e,t);break;case 13:!function(e,t){var n,r;let i,{push:l,helper:s,pure:o}=t,{tag:a,props:c,children:u,patchFlag:d,dynamicProps:p,directives:h,isBlock:f,disableTracking:g,isComponent:m}=e;d&&(i=String(d)),h&&l(s(oF)+"("),f&&l(`(${s(ok)}(${g?"true":""}), `),o&&l(cf),l(s(f?(n=t.inSSR,n||m?oT:ow):(r=t.inSSR,r||m?oN:oA))+"(",-2,e),cv(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map(e=>e||"null")}([a,c,u,i,p]),t),l(")"),f&&l(")"),h&&(l(", "),cb(h,t),l(")"))}(e,t);break;case 14:!function(e,t){let{push:n,helper:r,pure:i}=t,l=N(e.callee)?e.callee:r(e.callee);i&&n(cf),n(l+"(",-2,e),cv(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){let{push:n,indent:r,deindent:i,newline:l}=t,{properties:s}=e;if(!s.length)return n("{}",-2,e);let o=s.length>1;n(o?"{":"{ "),o&&r();for(let e=0;e<s.length;e++){let{key:r,value:i}=s[e];!function(e,t){let{push:n}=t;if(8===e.type)n("["),cS(e,t),n("]");else if(e.isStatic){let t;n((t=e.content,av.test(t))?JSON.stringify(e.content):e.content,-2,e)}else n(`[${e.content}]`,-3,e)}(r,t),n(": "),cb(i,t),e<s.length-1&&(n(","),l())}o&&i(),n(o?"}":" }")}(e,t);break;case 17:r=e,i=t,cy(r.elements,i);break;case 18:!function(e,t){let{push:n,indent:r,deindent:i}=t,{params:l,returns:s,body:o,newline:a,isSlot:c}=e;c&&n(`_${o3[oY]}(`),n("(",-2,e),T(l)?cv(l,t):l&&cb(l,t),n(") => "),(a||o)&&(n("{"),r()),s?(a&&n("return "),T(s)?cy(s,t):cb(s,t)):o&&cb(o,t),(a||o)&&(i(),n("}")),c&&n(")")}(e,t);break;case 19:!function(e,t){let{test:n,consequent:r,alternate:i,newline:l}=e,{push:s,indent:o,deindent:a,newline:c}=t;if(4===n.type){let e,r=(e=n.content,!!av.test(e));r&&s("("),c_(n,t),r&&s(")")}else s("("),cb(n,t),s(")");l&&o(),t.indentLevel++,l||s(" "),s("? "),cb(r,t),t.indentLevel--,l&&c(),l||s(" "),s(": ");let u=19===i.type;!u&&t.indentLevel++,cb(i,t),!u&&t.indentLevel--,l&&a(!0)}(e,t);break;case 20:!function(e,t){let{push:n,helper:r,indent:i,deindent:l,newline:s}=t,{needPauseTracking:o,needArraySpread:a}=e;a&&n("[...("),n(`_cache[${e.index}] || (`),o&&(i(),n(`${r(oQ)}(-1`),e.inVOnce&&n(", true"),n("),"),s(),n("(")),n(`_cache[${e.index}] = `),cb(e.value,t),o&&(n(`).cacheIndex = ${e.index},`),s(),n(`${r(oQ)}(1),`),s(),n(`_cache[${e.index}]`),l()),n(")"),a&&n(")]")}(e,t);break;case 21:cv(e.body,t,!0,!1)}}function c_(e,t){let{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function cS(e,t){for(let n=0;n<e.children.length;n++){let r=e.children[n];N(r)?t.push(r,-3):cb(r,t)}}let cx=ch(/^(?:if|else|else-if)$/,(e,t,n)=>(function(e,t,n,r){if("else"!==t.name&&(!t.exp||!t.exp.content.trim())){let r=t.exp?t.exp.loc:e.loc;n.onError(ag(28,t.loc)),t.exp=ae("true",!1,r)}if("if"===t.name){var i;let l=cC(e,t),s={type:9,loc:cr((i=e.loc).start.offset,i.end.offset),branches:[l]};if(n.replaceNode(s),r)return r(s,l,!0)}else{let i=n.parent.children,l=i.indexOf(e);for(;l-- >=-1;){let s=i[l];if(s&&aB(s)){n.removeNode(s);continue}if(s&&9===s.type){("else-if"===t.name||"else"===t.name)&&void 0===s.branches[s.branches.length-1].condition&&n.onError(ag(30,e.loc)),n.removeNode();let i=cC(e,t);s.branches.push(i);let l=r&&r(s,i,!1);cp(i,n),l&&l(),n.currentNode=null}else n.onError(ag(30,e.loc));break}}})(e,t,n,(e,t,r)=>{let i=n.parent.children,l=i.indexOf(e),s=0;for(;l-- >=0;){let e=i[l];e&&9===e.type&&(s+=e.branches.length)}return()=>{r?e.codegenNode=ck(t,s,n):function(e){for(;;)if(19===e.type)if(19!==e.alternate.type)return e;else e=e.alternate;else 20===e.type&&(e=e.value)}(e.codegenNode).alternate=ck(t,s+e.branches.length-1,n)}}));function cC(e,t){let n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!aT(e,"for")?e.children:[e],userKey:aw(e,"key"),isTemplateIf:n}}function ck(e,t,n){return e.condition?ai(e.condition,cT(e,t,n),an(n.helper(oE),['""',"true"])):cT(e,t,n)}function cT(e,t,n){let{helper:r}=n,i=o7("key",ae(`${t}`,!1,o4,2)),{children:l}=e,s=l[0];if(1!==l.length||1!==s.type)if(1!==l.length||11!==s.type)return o8(n,r(ob),o9([i]),l,64,void 0,void 0,!0,!1,!1,e.loc);else{let e=s.codegenNode;return aM(e,i,n),e}{let e=s.codegenNode,t=14===e.type&&e.callee===o2?e.arguments[1].returns:e;return 13===t.type&&al(t,n),aM(t,i,n),e}}let cw=ch("for",(e,t,n)=>{let{helper:r,removeHelper:i}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(ag(31,t.loc));let i=t.forParseResult;if(!i)return void n.onError(ag(32,t.loc));cN(i);let{scopes:l}=n,{source:s,value:o,key:a,index:c}=i,u={type:11,loc:t.loc,source:s,valueAlias:o,keyAlias:a,objectIndexAlias:c,parseResult:i,children:aI(e)?e.children:[e]};n.replaceNode(u),l.vFor++;let d=r&&r(u);return()=>{l.vFor--,d&&d()}}(e,t,n,t=>{let l=an(r(oL),[t.source]),s=aI(e),o=aT(e,"memo"),a=aw(e,"key",!1,!0);a&&a.type;let c=a&&(6===a.type?a.value?ae(a.value.content,!0):void 0:a.exp),u=a&&c?o7("key",c):null,d=4===t.source.type&&t.source.constType>0,p=d?64:a?128:256;return t.codegenNode=o8(n,r(ob),void 0,l,p,void 0,void 0,!0,!d,!1,e.loc),()=>{let a,{children:p}=t,h=1!==p.length||1!==p[0].type,f=aO(e)?e:s&&1===e.children.length&&aO(e.children[0])?e.children[0]:null;if(f)a=f.codegenNode,s&&u&&aM(a,u,n);else if(h)a=o8(n,r(ob),u?o9([u]):void 0,e.children,64,void 0,void 0,!0,void 0,!1);else{var g,m,y,b,_,S,x,C;a=p[0].codegenNode,s&&u&&aM(a,u,n),!d!==a.isBlock&&(a.isBlock?(i(ok),i((g=n.inSSR,m=a.isComponent,g||m?oT:ow))):i((y=n.inSSR,b=a.isComponent,y||b?oN:oA))),(a.isBlock=!d,a.isBlock)?(r(ok),r((_=n.inSSR,S=a.isComponent,_||S?oT:ow))):r((x=n.inSSR,C=a.isComponent,x||C?oN:oA))}if(o){let e=ar(cA(t.parseResult,[ae("_cached")]));e.body={type:21,body:[at(["const _memo = (",o.exp,")"]),at(["if (_cached && _cached.el",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(o6)}(_cached, _memo)) return _cached`]),at(["const _item = ",a]),ae("_item.memo = _memo"),ae("return _item")],loc:o4},l.arguments.push(e,ae("_cache"),ae(String(n.cached.length))),n.cached.push(null)}else l.arguments.push(ar(cA(t.parseResult),a,!0))}})});function cN(e,t){e.finalized||(e.finalized=!0)}function cA({value:e,key:t,index:n},r=[]){var i=[e,t,n,...r];let l=i.length;for(;l--&&!i[l];);return i.slice(0,l+1).map((e,t)=>e||ae("_".repeat(t+1),!1))}let cE=ae("undefined",!1),cR=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){let n=aT(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}};function cI(e,t,n){let r=[o7("name",e),o7("fn",t)];return null!=n&&r.push(o7("key",ae(String(n),!0))),o9(r)}let cO=new WeakMap,cP=(e,t)=>function(){let n,r,i,l,s;if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;let{tag:o,props:a}=e,c=1===e.tagType,u=c?function(e,t,n=!1){let{tag:r}=e,i=cF(r),l=aw(e,"is",!1,!0);if(l)if(i){let e;if(6===l.type?e=l.value&&ae(l.value.content,!0):(e=l.exp)||(e=ae("is",!1,l.arg.loc)),e)return an(t.helper(oP),[e])}else 6===l.type&&l.value.content.startsWith("vue:")&&(r=l.value.content.slice(4));let s=ay(r)||t.isBuiltInComponent(r);return s?(n||t.helper(s),s):(t.helper(oO),t.components.add(r),aF(r,"component"))}(e,t):`"${o}"`,d=E(u)&&u.callee===oP,p=0,h=d||u===o_||u===oS||!c&&("svg"===o||"foreignObject"===o||"math"===o);if(a.length>0){let r=cM(e,t,void 0,c,d);n=r.props,p=r.patchFlag,l=r.dynamicPropNames;let i=r.directives;s=i&&i.length?o5(i.map(e=>(function(e,t){let n=[],r=cO.get(e);r?n.push(t.helperString(r)):(t.helper(oM),t.directives.add(e.name),n.push(aF(e.name,"directive")));let{loc:i}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));let t=ae("true",!1,i);n.push(o9(e.modifiers.map(e=>o7(e,t)),i))}return o5(n,e.loc)})(e,t))):void 0,r.shouldUseBlock&&(h=!0)}if(e.children.length>0)if(u===ox&&(h=!0,p|=1024),c&&u!==o_&&u!==ox){let{slots:n,hasDynamicSlots:i}=function(e,t,n=(e,t,n,r)=>ar(e,n,!1,!0,n.length?n[0].loc:r)){t.helper(oY);let{children:r,loc:i}=e,l=[],s=[],o=t.scopes.vSlot>0||t.scopes.vFor>0,a=aT(e,"slot",!0);if(a){let{arg:e,exp:t}=a;e&&!am(e)&&(o=!0),l.push(o7(e||ae("default",!0),n(t,void 0,r,i)))}let c=!1,u=!1,d=[],p=new Set,h=0;for(let e=0;e<r.length;e++){let i,f,g,m,y=r[e];if(!aI(y)||!(i=aT(y,"slot",!0))){3!==y.type&&d.push(y);continue}if(a){t.onError(ag(37,i.loc));break}c=!0;let{children:b,loc:_}=y,{arg:S=ae("default",!0),exp:x,loc:C}=i;am(S)?f=S?S.content:"default":o=!0;let k=aT(y,"for"),T=n(x,k,b,_);if(g=aT(y,"if"))o=!0,s.push(ai(g.exp,cI(S,T,h++),cE));else if(m=aT(y,/^else(?:-if)?$/,!0)){let n,i=e;for(;i--&&aB(n=r[i]););if(n&&aI(n)&&aT(n,/^(?:else-)?if$/)){let e=s[s.length-1];for(;19===e.alternate.type;)e=e.alternate;e.alternate=m.exp?ai(m.exp,cI(S,T,h++),cE):cI(S,T,h++)}else t.onError(ag(30,m.loc))}else if(k){o=!0;let e=k.forParseResult;e?(cN(e),s.push(an(t.helper(oL),[e.source,ar(cA(e),cI(S,T),!0)]))):t.onError(ag(32,k.loc))}else{if(f){if(p.has(f)){t.onError(ag(38,C));continue}p.add(f),"default"===f&&(u=!0)}l.push(o7(S,T))}}if(!a){let e=(e,t)=>o7("default",n(e,void 0,t,i));c?d.length&&!d.every(aV)&&(u?t.onError(ag(39,d[0].loc)):l.push(e(void 0,d))):l.push(e(void 0,r))}let f=o?2:!function e(t){for(let n=0;n<t.length;n++){let r=t[n];switch(r.type){case 1:if(2===r.tagType||e(r.children))return!0;break;case 9:if(e(r.branches))return!0;break;case 10:case 11:if(e(r.children))return!0}}return!1}(e.children)?1:3,g=o9(l.concat(o7("_",ae(f+"",!1))),i);return s.length&&(g=an(t.helper(oV),[g,o5(s)])),{slots:g,hasDynamicSlots:o}}(e,t);r=n,i&&(p|=1024)}else if(1===e.children.length&&u!==o_){let n=e.children[0],i=n.type,l=5===i||8===i;l&&0===ca(n,t)&&(p|=1),r=l||2===i?n:e.children}else r=e.children;l&&l.length&&(i=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(l)),e.codegenNode=o8(t,u,n,r,0===p?void 0:p,i,s,!!h,!1,c,e.loc)};function cM(e,t,n=e.props,r,i,l=!1){let s,{tag:o,loc:a,children:c}=e,u=[],d=[],p=[],h=c.length>0,f=!1,g=0,m=!1,y=!1,_=!1,S=!1,x=!1,C=!1,k=[],T=e=>{u.length&&(d.push(o9(cD(u),a)),u=[]),e&&d.push(e)},w=()=>{t.scopes.vFor>0&&u.push(o7(ae("ref_for",!0),ae("true")))},N=({key:e,value:n})=>{if(am(e)){let l=e.content,s=b(l);s&&(!r||i)&&"onclick"!==l.toLowerCase()&&"onUpdate:modelValue"!==l&&!P(l)&&(S=!0),s&&P(l)&&(C=!0),s&&14===n.type&&(n=n.arguments[0]),20===n.type||(4===n.type||8===n.type)&&ca(n,t)>0||("ref"===l?m=!0:"class"===l?y=!0:"style"===l?_=!0:"key"===l||k.includes(l)||k.push(l),r&&("class"===l||"style"===l)&&!k.includes(l)&&k.push(l))}else x=!0};for(let i=0;i<n.length;i++){let s=n[i];if(6===s.type){let{loc:e,name:t,nameLoc:n,value:r}=s;if("ref"===t&&(m=!0,w()),"is"===t&&(cF(o)||r&&r.content.startsWith("vue:")))continue;u.push(o7(ae(t,!0,n),ae(r?r.content:"",!0,r?r.loc:e)))}else{let{name:n,arg:i,exp:c,loc:m,modifiers:y}=s,b="bind"===n,_="on"===n;if("slot"===n){r||t.onError(ag(40,m));continue}if("once"===n||"memo"===n||"is"===n||b&&aN(i,"is")&&cF(o)||_&&l)continue;if((b&&aN(i,"key")||_&&h&&aN(i,"vue:before-update"))&&(f=!0),b&&aN(i,"ref")&&w(),!i&&(b||_)){x=!0,c?b?(w(),T(),d.push(c)):T({type:14,loc:m,callee:t.helper(oK),arguments:r?[c]:[c,"true"]}):t.onError(ag(b?34:35,m));continue}b&&y.some(e=>"prop"===e.content)&&(g|=32);let S=t.directiveTransforms[n];if(S){let{props:n,needRuntime:r}=S(s,e,t);l||n.forEach(N),_&&i&&!am(i)?T(o9(n,a)):u.push(...n),r&&(p.push(s),A(r)&&cO.set(s,r))}else!M(n)&&(p.push(s),h&&(f=!0))}}if(d.length?(T(),s=d.length>1?an(t.helper(oj),d,a):d[0]):u.length&&(s=o9(cD(u),a)),x?g|=16:(y&&!r&&(g|=2),_&&!r&&(g|=4),k.length&&(g|=8),S&&(g|=32)),!f&&(0===g||32===g)&&(m||C||p.length>0)&&(g|=512),!t.inSSR&&s)switch(s.type){case 15:let E=-1,R=-1,I=!1;for(let e=0;e<s.properties.length;e++){let t=s.properties[e].key;am(t)?"class"===t.content?E=e:"style"===t.content&&(R=e):t.isHandlerKey||(I=!0)}let O=s.properties[E],D=s.properties[R];I?s=an(t.helper(oq),[s]):(O&&!am(O.value)&&(O.value=an(t.helper(oU),[O.value])),D&&(_||4===D.value.type&&"["===D.value.content.trim()[0]||17===D.value.type)&&(D.value=an(t.helper(oH),[D.value])));break;case 14:break;default:s=an(t.helper(oq),[an(t.helper(oW),[s])])}return{props:s,directives:p,patchFlag:g,dynamicPropNames:k,shouldUseBlock:f}}function cD(e){let t=new Map,n=[];for(let l=0;l<e.length;l++){var r,i;let s=e[l];if(8===s.key.type||!s.key.isStatic){n.push(s);continue}let o=s.key.content,a=t.get(o);a?("style"===o||"class"===o||b(o))&&(r=a,i=s,17===r.value.type?r.value.elements.push(i.value):r.value=o5([r.value,i.value],r.loc)):(t.set(o,s),n.push(s))}return n}function cF(e){return"component"===e||"Component"===e}let cL=(e,t)=>{if(aO(e)){let{children:n,loc:r}=e,{slotName:i,slotProps:l}=function(e,t){let n,r='"default"',i=[];for(let t=0;t<e.props.length;t++){let n=e.props[t];if(6===n.type)n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=L(n.name),i.push(n)));else if("bind"===n.name&&aN(n.arg,"name")){if(n.exp)r=n.exp;else if(n.arg&&4===n.arg.type){let e=L(n.arg.content);r=n.exp=ae(e,!1,n.arg.loc)}}else"bind"===n.name&&n.arg&&am(n.arg)&&(n.arg.content=L(n.arg.content)),i.push(n)}if(i.length>0){let{props:r,directives:l}=cM(e,t,i,!1,!1);n=r,l.length&&t.onError(ag(36,l[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",i,"{}","undefined","true"],o=2;l&&(s[2]=l,o=3),n.length&&(s[3]=ar([],n,!1,!1,r),o=4),t.scopeId&&!t.slotted&&(o=5),s.splice(o),e.codegenNode=an(t.helper(o$),s,r)}},c$=(e,t,n,r)=>{let i,{loc:l,modifiers:s,arg:o}=e;if(!e.exp&&!s.length,4===o.type)if(o.isStatic){let e=o.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),i=ae(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?j(L(e)):`on:${e}`,!0,o.loc)}else i=at([`${n.helperString(oG)}(`,o,")"]);else(i=o).children.unshift(`${n.helperString(oG)}(`),i.children.push(")");let a=e.exp;a&&!a.content.trim()&&(a=void 0);let c=n.cacheHandlers&&!a&&!n.inVOnce;if(a){let e,t=aC(a),n=!(t||(e=a,ak.test(ax(e)))),r=a.content.includes(";");(n||c&&t)&&(a=at([`${n?"$event":"(...args)"} => ${r?"{":"("}`,a,r?"}":")"]))}let u={props:[o7(i,a||ae("() => {}",!1,l))]};return r&&(u=r(u)),c&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach(e=>e.key.isHandlerKey=!0),u},cV=(e,t,n)=>{let{modifiers:r}=e,i=e.arg,{exp:l}=e;return l&&4===l.type&&!l.content.trim()&&(l=void 0),4!==i.type?(i.children.unshift("("),i.children.push(') || ""')):i.isStatic||(i.content=i.content?`${i.content} || ""`:'""'),r.some(e=>"camel"===e.content)&&(4===i.type?i.isStatic?i.content=L(i.content):i.content=`${n.helperString(oz)}(${i.content})`:(i.children.unshift(`${n.helperString(oz)}(`),i.children.push(")"))),!n.inSSR&&(r.some(e=>"prop"===e.content)&&cB(i,"."),r.some(e=>"attr"===e.content)&&cB(i,"^")),{props:[o7(i,l)]}},cB=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},cj=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{let n,r=e.children,i=!1;for(let e=0;e<r.length;e++){let t=r[e];if(aA(t)){i=!0;for(let i=e+1;i<r.length;i++){let l=r[i];if(aA(l))n||(n=r[e]=at([t],t.loc)),n.children.push(" + ",l),r.splice(i,1),i--;else{n=void 0;break}}}}if(i&&(1!==r.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find(e=>7===e.type&&!t.directiveTransforms[e.name]))))for(let e=0;e<r.length;e++){let n=r[e];if(aA(n)||8===n.type){let i=[];(2!==n.type||" "!==n.content)&&i.push(n),t.ssr||0!==ca(n,t)||i.push("1"),r[e]={type:12,content:n,loc:n.loc,codegenNode:an(t.helper(oR),i)}}}}},cU=new WeakSet,cH=(e,t)=>{if(1===e.type&&aT(e,"once",!0)&&!cU.has(e)&&!t.inVOnce&&!t.inSSR)return cU.add(e),t.inVOnce=!0,t.helper(oQ),()=>{t.inVOnce=!1;let e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0,!0))}},cq=(e,t,n)=>{let r,{exp:i,arg:l}=e;if(!i)return n.onError(ag(41,e.loc)),cW();let s=i.loc.source.trim(),o=4===i.type?i.content:s,a=n.bindingMetadata[s];if("props"===a||"props-aliased"===a||"literal-const"===a||"setup-const"===a)return i.loc,cW();if(!o.trim()||!aC(i))return n.onError(ag(42,i.loc)),cW();let c=l||ae("modelValue",!0),u=l?am(l)?`onUpdate:${L(l.content)}`:at(['"onUpdate:" + ',l]):"onUpdate:modelValue",d=n.isTS?"($event: any)":"$event";r=at([`${d} => ((`,i,") = $event)"]);let p=[o7(c,e.exp),o7(u,r)];if(e.modifiers.length&&1===t.tagType){let t=e.modifiers.map(e=>e.content).map(e=>(av.test(e)?JSON.stringify(e):e)+": true").join(", "),n=l?am(l)?`${l.content}Modifiers`:at([l,' + "Modifiers"']):"modelModifiers";p.push(o7(n,ae(`{ ${t} }`,!1,e.loc,2)))}return cW(p)};function cW(e=[]){return{props:e}}let cK=new WeakSet,cz=(e,t)=>{if(1===e.type){let n=aT(e,"memo");if(!(!n||cK.has(e))&&!t.inSSR)return cK.add(e),()=>{let r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&al(r,t),e.codegenNode=an(t.helper(o2),[n.exp,ar(void 0,r),"_cache",String(t.cached.length)]),t.cached.push(null))}}},cJ=(e,t)=>{if(1===e.type){for(let n of e.props)if(7===n.type&&"bind"===n.name&&(!n.exp||4===n.exp.type&&!n.exp.content.trim())&&n.arg){let e=n.arg;if(4===e.type&&e.isStatic){let t=L(e.content);(ab.test(t[0])||"-"===t[0])&&(n.exp=ae(t,!1,e.loc))}else t.onError(ag(53,e.loc)),n.exp=ae("",!0,e.loc)}}},cG=Symbol(""),cQ=Symbol(""),cX=Symbol(""),cZ=Symbol(""),cY=Symbol(""),c0=Symbol(""),c1=Symbol(""),c2=Symbol(""),c6=Symbol(""),c3=Symbol("");Object.getOwnPropertySymbols(oy={[cG]:"vModelRadio",[cQ]:"vModelCheckbox",[cX]:"vModelText",[cZ]:"vModelSelect",[cY]:"vModelDynamic",[c0]:"withModifiers",[c1]:"withKeys",[c2]:"vShow",[c6]:"Transition",[c3]:"TransitionGroup"}).forEach(e=>{o3[e]=oy[e]});let c4={parseMode:"html",isVoidTag:el,isNativeTag:e=>en(e)||er(e)||ei(e),isPreTag:e=>"pre"===e,isIgnoreNewlineTag:e=>"pre"===e||"textarea"===e,decodeEntities:function(e,t=!1){return(u||(u=document.createElement("div")),t)?(u.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,u.children[0].getAttribute("foo")):(u.innerHTML=e,u.textContent)},isBuiltInComponent:e=>"Transition"===e||"transition"===e?c6:"TransitionGroup"===e||"transition-group"===e?c3:void 0,getNamespace(e,t,n){let r=t?t.ns:n;if(t&&2===r)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some(e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(r=0);else t&&1===r&&("foreignObject"===t.tag||"desc"===t.tag||"title"===t.tag)&&(r=0);if(0===r){if("svg"===e)return 1;if("math"===e)return 2}return r}},c8=h("passive,once,capture"),c5=h("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),c9=h("left,right"),c7=h("onkeyup,onkeydown,onkeypress"),ue=(e,t)=>am(e)&&"onclick"===e.content.toLowerCase()?ae(t,!0):4!==e.type?at(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,ut=(e,t)=>{1===e.type&&0===e.tagType&&("script"===e.tag||"style"===e.tag)&&t.removeNode()},un=[e=>{1===e.type&&e.props.forEach((t,n)=>{let r,i;6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:ae("style",!0,t.loc),exp:(r=t.value.content,i=t.loc,ae(JSON.stringify(Y(r)),!1,i,3)),modifiers:[],loc:t.loc})})}],ur={cloak:()=>({props:[]}),html:(e,t,n)=>{let{exp:r,loc:i}=e;return r||n.onError(ag(54,i)),t.children.length&&(n.onError(ag(55,i)),t.children.length=0),{props:[o7(ae("innerHTML",!0,i),r||ae("",!0))]}},text:(e,t,n)=>{let{exp:r,loc:i}=e;return r||n.onError(ag(56,i)),t.children.length&&(n.onError(ag(57,i)),t.children.length=0),{props:[o7(ae("textContent",!0),r?ca(r,n)>0?r:an(n.helperString(oB),[r],i):ae("",!0))]}},model:(e,t,n)=>{let r=cq(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(ag(59,e.arg.loc));let{tag:i}=t,l=n.isCustomElement(i);if("input"===i||"textarea"===i||"select"===i||l){let s=cX,o=!1;if("input"===i||l){let r=aw(t,"type");if(r){if(7===r.type)s=cY;else if(r.value)switch(r.value.content){case"radio":s=cG;break;case"checkbox":s=cQ;break;case"file":o=!0,n.onError(ag(60,e.loc))}}else t.props.some(e=>7===e.type&&"bind"===e.name&&(!e.arg||4!==e.arg.type||!e.arg.isStatic))&&(s=cY)}else"select"===i&&(s=cZ);o||(r.needRuntime=n.helper(s))}else n.onError(ag(58,e.loc));return r.props=r.props.filter(e=>4!==e.key.type||"modelValue"!==e.key.content),r},on:(e,t,n)=>c$(e,t,n,t=>{let{modifiers:r}=e;if(!r.length)return t;let{key:i,value:l}=t.props[0],{keyModifiers:s,nonKeyModifiers:o,eventOptionModifiers:a}=((e,t,n,r)=>{let i=[],l=[],s=[];for(let n=0;n<t.length;n++){let r=t[n].content;c8(r)?s.push(r):c9(r)?am(e)?c7(e.content.toLowerCase())?i.push(r):l.push(r):(i.push(r),l.push(r)):c5(r)?l.push(r):i.push(r)}return{keyModifiers:i,nonKeyModifiers:l,eventOptionModifiers:s}})(i,r,0,e.loc);if(o.includes("right")&&(i=ue(i,"onContextmenu")),o.includes("middle")&&(i=ue(i,"onMouseup")),o.length&&(l=an(n.helper(c0),[l,JSON.stringify(o)])),s.length&&(!am(i)||c7(i.content.toLowerCase()))&&(l=an(n.helper(c1),[l,JSON.stringify(s)])),a.length){let e=a.map(B).join("");i=am(i)?ae(`${i.content}${e}`,!0):at(["(",i,`) + "${e}"`])}return{props:[o7(i,l)]}}),show:(e,t,n)=>{let{exp:r,loc:i}=e;return r||n.onError(ag(62,i)),{props:[],needRuntime:n.helper(c2)}}},ui=Object.create(null);function ul(e,t){if(!N(e))if(!e.nodeType)return m;else e=e.innerHTML;let n=e+JSON.stringify(t,(e,t)=>"function"==typeof t?t.toString():t),r=ui[n];if(r)return r;if("#"===e[0]){let t=document.querySelector(e);e=t?t.innerHTML:""}let i=S({hoistStatic:!0,onError:void 0,onWarn:m},t);!i.isCustomElement&&"u">typeof customElements&&(i.isCustomElement=e=>!!customElements.get(e));let{code:l}=function(e,t={}){return function(e,t={}){var n;let r,i=t.onError||ah,l="module"===t.mode;!0===t.prefixIdentifiers?i(ag(48)):l&&i(ag(49)),t.cacheHandlers&&i(ag(50)),t.scopeId&&!l&&i(ag(51));let s=S({},t,{prefixIdentifiers:!1}),o=N(e)?function(e,t){if(a0.reset(),aW=null,aK=null,az="",aJ=-1,aG=-1,aY.length=0,aq=e,aU=S({},aj),t){let e;for(e in t)null!=t[e]&&(aU[e]=t[e])}a0.mode="html"===aU.parseMode?1:2*("sfc"===aU.parseMode),a0.inXML=1===aU.ns||2===aU.ns;let n=t&&t.delimiters;n&&(a0.delimiterOpen=ad(n[0]),a0.delimiterClose=ad(n[1]));let r=aH=function(e,t=""){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:o4}}([],e);return a0.parse(aq),r.loc=cr(0,e.length),r.children=ce(r.children),aH=null,r}(e,s):e,[a,c]=[[cJ,cH,cx,cz,cw,cL,cP,cR,cj],{on:c$,bind:cV,model:cq}];return r=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,hmr:i=!1,cacheHandlers:l=!1,nodeTransforms:s=[],directiveTransforms:o={},transformHoist:a=null,isBuiltInComponent:c=m,isCustomElement:u=m,expressionPlugins:d=[],scopeId:p=null,slotted:h=!0,ssr:g=!1,inSSR:y=!1,ssrCssVars:b="",bindingMetadata:_=f,inline:S=!1,isTS:x=!1,onError:C=ah,onWarn:k=af,compatConfig:T}){let w=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),A={filename:t,selfName:w&&B(L(w[1])),prefixIdentifiers:n,hoistStatic:r,hmr:i,cacheHandlers:l,nodeTransforms:s,directiveTransforms:o,transformHoist:a,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:d,scopeId:p,slotted:h,ssr:g,inSSR:y,ssrCssVars:b,bindingMetadata:_,inline:S,isTS:x,onError:C,onWarn:k,compatConfig:T,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){let t=A.helpers.get(e)||0;return A.helpers.set(e,t+1),e},removeHelper(e){let t=A.helpers.get(e);if(t){let n=t-1;n?A.helpers.set(e,n):A.helpers.delete(e)}},helperString:e=>`_${o3[A.helper(e)]}`,replaceNode(e){A.parent.children[A.childIndex]=A.currentNode=e},removeNode(e){let t=A.parent.children,n=e?t.indexOf(e):A.currentNode?A.childIndex:-1;e&&e!==A.currentNode?A.childIndex>n&&(A.childIndex--,A.onNodeRemoved()):(A.currentNode=null,A.onNodeRemoved()),A.parent.children.splice(n,1)},onNodeRemoved:m,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){N(e)&&(e=ae(e)),A.hoists.push(e);let t=ae(`_hoisted_${A.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1,n=!1){let r=function(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:o4}}(A.cached.length,e,t,n);return A.cached.push(r),r}};return A}(o,n=S({},s,{nodeTransforms:[...a,...t.nodeTransforms||[]],directiveTransforms:S({},c,t.directiveTransforms||{})})),cp(o,r),n.hoistStatic&&function e(t,n,r,i=!1,l=!1){let{children:s}=t,o=[];for(let n=0;n<s.length;n++){let a=s[n];if(1===a.type&&0===a.tagType){let e=i?0:ca(a,r);if(e>0){if(e>=2){a.codegenNode.patchFlag=-1,o.push(a);continue}}else{let e=a.codegenNode;if(13===e.type){let t=e.patchFlag;if((void 0===t||512===t||1===t)&&cu(a,r)>=2){let t=cd(a);t&&(e.props=r.hoist(t))}e.dynamicProps&&(e.dynamicProps=r.hoist(e.dynamicProps))}}}else if(12===a.type&&(i?0:ca(a,r))>=2){14===a.codegenNode.type&&a.codegenNode.arguments.length>0&&a.codegenNode.arguments.push("-1"),o.push(a);continue}if(1===a.type){let n=1===a.tagType;n&&r.scopes.vSlot++,e(a,t,r,!1,l),n&&r.scopes.vSlot--}else if(11===a.type)e(a,t,r,1===a.children.length,!0);else if(9===a.type)for(let n=0;n<a.branches.length;n++)e(a.branches[n],t,r,1===a.branches[n].children.length,l)}let a=!1;if(o.length===s.length&&1===t.type){if(0===t.tagType&&t.codegenNode&&13===t.codegenNode.type&&T(t.codegenNode.children))t.codegenNode.children=c(o5(t.codegenNode.children)),a=!0;else if(1===t.tagType&&t.codegenNode&&13===t.codegenNode.type&&t.codegenNode.children&&!T(t.codegenNode.children)&&15===t.codegenNode.children.type){let e=u(t.codegenNode,"default");e&&(e.returns=c(o5(e.returns)),a=!0)}else if(3===t.tagType&&n&&1===n.type&&1===n.tagType&&n.codegenNode&&13===n.codegenNode.type&&n.codegenNode.children&&!T(n.codegenNode.children)&&15===n.codegenNode.children.type){let e=aT(t,"slot",!0),r=e&&e.arg&&u(n.codegenNode,e.arg);r&&(r.returns=c(o5(r.returns)),a=!0)}}if(!a)for(let e of o)e.codegenNode=r.cache(e.codegenNode);function c(e){let t=r.cache(e);return t.needArraySpread=!0,t}function u(e,t){if(e.children&&!T(e.children)&&15===e.children.type){let n=e.children.properties.find(e=>e.key===t||e.key.content===t);return n&&n.value}}o.length&&r.transformHoist&&r.transformHoist(s,r,t)}(o,void 0,r,!!co(o)),n.ssr||function(e,t){let{helper:n}=t,{children:r}=e;if(1===r.length){let n=co(e);if(n&&n.codegenNode){let r=n.codegenNode;13===r.type&&al(r,t),e.codegenNode=r}else e.codegenNode=r[0]}else r.length>1&&(e.codegenNode=o8(t,n(ob),void 0,e.children,64,void 0,void 0,!0,void 0,!1))}(o,r),o.helpers=new Set([...r.helpers.keys()]),o.components=[...r.components],o.directives=[...r.directives],o.imports=r.imports,o.hoists=r.hoists,o.temps=r.temps,o.cached=r.cached,o.transformed=!0,function(e,t={}){let n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:i="template.vue.html",scopeId:l=null,optimizeImports:s=!1,runtimeGlobalName:o="Vue",runtimeModuleName:a="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:d=!1,inSSR:p=!1}){let h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:i,scopeId:l,optimizeImports:s,runtimeGlobalName:o,runtimeModuleName:a,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:p,source:e.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${o3[e]}`,push(e,t=-2,n){h.code+=e},indent(){f(++h.indentLevel)},deindent(e=!1){e?--h.indentLevel:f(--h.indentLevel)},newline(){f(h.indentLevel)}};function f(e){h.push(`
-`+"  ".repeat(e),0)}return h}(e,t);t.onContextCreated&&t.onContextCreated(n);let{mode:r,push:i,prefixIdentifiers:l,indent:s,deindent:o,newline:a,ssr:c}=n,u=Array.from(e.helpers),d=u.length>0,p=!l&&"module"!==r;!function(e,t){let{push:n,newline:r,runtimeGlobalName:i}=t,l=Array.from(e.helpers);if(l.length>0&&(n(`const _Vue = ${i}
-`,-1),e.hoists.length)){let e=[oN,oA,oE,oR,oI].filter(e=>l.includes(e)).map(cg).join(", ");n(`const { ${e} } = _Vue
-`,-1)}(function(e,t){if(!e.length)return;t.pure=!0;let{push:n,newline:r}=t;r();for(let i=0;i<e.length;i++){let l=e[i];l&&(n(`const _hoisted_${i+1} = `),cb(l,t),r())}t.pure=!1})(e.hoists,t),r(),n("return ")}(e,n);let h=(c?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ");if(i(`function ${c?"ssrRender":"render"}(${h}) {`),s(),p&&(i("with (_ctx) {"),s(),d&&(i(`const { ${u.map(cg).join(", ")} } = _Vue
-`,-1),a())),e.components.length&&(cm(e.components,"component",n),(e.directives.length||e.temps>0)&&a()),e.directives.length&&(cm(e.directives,"directive",n),e.temps>0&&a()),e.temps>0){i("let ");for(let t=0;t<e.temps;t++)i(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(i(`
-`,0),a()),c||i("return "),e.codegenNode?cb(e.codegenNode,n):i("null"),p&&(o(),i("}")),o(),i("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(o,s)}(e,S({},c4,t,{nodeTransforms:[ut,...un,...t.nodeTransforms||[]],directiveTransforms:S({},ur,t.directiveTransforms||{}),transformHoist:null}))}(e,i),s=Function("Vue",l)(ov);return s._rc=!0,ui[n]=s}lA(ul);export{nB as BaseTransition,nL as BaseTransitionPropsValidators,iY as Comment,lJ as DeprecationTypes,eh as EffectScope,tJ as ErrorCodes,lU as ErrorTypeStrings,iX as Fragment,rc as KeepAlive,ev as ReactiveEffect,i0 as Static,iW as Suspense,nR as Teleport,iZ as Text,tB as TrackOpTypes,l4 as Transition,sU as TransitionGroup,tj as TriggerOpTypes,sM as VueElement,tz as assertNumber,tQ as callWithAsyncErrorHandling,tG as callWithErrorHandling,L as camelize,B as capitalize,la as cloneVNode,lz as compatUtils,ul as compile,lD as computed,oc as createApp,i7 as createBlock,ld as createCommentVNode,i9 as createElementBlock,ll as createElementVNode,iF as createHydrationRenderer,r3 as createPropsRestProxy,iD as createRenderer,ou as createSSRApp,rF as createSlots,lu as createStaticVNode,lc as createTextVNode,ls as createVNode,tM as customRef,rs as defineAsyncComponent,nz as defineComponent,sI as defineCustomElement,rK as defineEmits,rz as defineExpose,rQ as defineModel,rJ as defineOptions,rW as defineProps,sO as defineSSRCustomElement,rG as defineSlots,lH as devtools,eN as effect,ef as effectScope,lS as getCurrentInstance,eg as getCurrentScope,tq as getCurrentWatcher,nK as getTransitionRawChildren,lo as guardReactiveProps,lF as h,tX as handleError,nh as hasInjectionContext,oa as hydrate,rt as hydrateOnIdle,ri as hydrateOnInteraction,rr as hydrateOnMediaQuery,rn as hydrateOnVisible,lL as initCustomFormatter,of as initDirectivesForSSR,np as inject,lV as isMemoSame,tv as isProxy,tg as isReactive,tm as isReadonly,tC as isRef,lE as isRuntimeOnly,ty as isShallow,le as isVNode,t_ as markRaw,r2 as mergeDefaults,r6 as mergeModels,lg as mergeProps,t4 as nextTick,lY as nodeOps,ee as normalizeClass,et as normalizeProps,G as normalizeStyle,rd as onActivated,rv as onBeforeMount,rx as onBeforeUnmount,r_ as onBeforeUpdate,rp as onDeactivated,rN as onErrorCaptured,rb as onMounted,rw as onRenderTracked,rT as onRenderTriggered,em as onScopeDispose,rk as onServerPrefetch,rC as onUnmounted,rS as onUpdated,tW as onWatcherCleanup,i6 as openBlock,sE as patchProp,ns as popScopeId,nd as provide,tO as proxyRefs,nl as pushScopeId,t9 as queuePostFlushCb,tu as reactive,tp as readonly,tk as ref,lA as registerRuntimeCompiler,oo as render,rD as renderList,rL as renderSlot,rE as resolveComponent,rO as resolveDirective,rI as resolveDynamicComponent,lK as resolveFilter,nU as resolveTransitionHooks,i8 as setBlockTracking,lq as setDevtoolsHook,nW as setTransitionHooks,td as shallowReactive,th as shallowReadonly,tT as shallowRef,nf as ssrContextKey,lW as ssrUtils,eA as stop,eu as toDisplayString,j as toHandlerKey,rV as toHandlers,tb as toRaw,t$ as toRef,tD as toRefs,tR as toValue,ln as transformVNodeArgs,tA as triggerRef,tE as unref,rY as useAttrs,sL as useCssModule,sh as useCssVars,sD as useHost,nJ as useId,iu as useModel,ng as useSSRContext,sF as useShadowRoot,rZ as useSlots,nQ as useTemplateRef,nD as useTransitionState,sY as vModelCheckbox,s8 as vModelDynamic,s1 as vModelRadio,s2 as vModelSelect,sZ as vModelText,su as vShow,lB as version,lj as warn,nb as watch,nm as watchEffect,ny as watchPostEffect,nv as watchSyncEffect,r4 as withAsyncContext,na as withCtx,rX as withDefaults,nc as withDirectives,or as withKeys,l$ as withMemo,ot as withModifiers,no as withScopeId};
Index: ews/js/vue.min.js
===================================================================
--- /views/js/vue.min.js	(revision 8528)
+++ 	(revision )
@@ -1,6 +1,0 @@
-/*!
- * Vue.js v2.5.17
- * (c) 2014-2018 Evan You
- * Released under the MIT License.
- */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Vue=t()}(this,function(){"use strict";var y=Object.freeze({});function M(e){return null==e}function D(e){return null!=e}function S(e){return!0===e}function T(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function P(e){return null!==e&&"object"==typeof e}var r=Object.prototype.toString;function l(e){return"[object Object]"===r.call(e)}function i(e){var t=parseFloat(String(e));return 0<=t&&Math.floor(t)===t&&isFinite(e)}function t(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function F(e){var t=parseFloat(e);return isNaN(t)?e:t}function s(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i<r.length;i++)n[r[i]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}var c=s("slot,component",!0),u=s("key,ref,slot,slot-scope,is");function f(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var n=Object.prototype.hasOwnProperty;function p(e,t){return n.call(e,t)}function e(t){var n=Object.create(null);return function(e){return n[e]||(n[e]=t(e))}}var o=/-(\w)/g,g=e(function(e){return e.replace(o,function(e,t){return t?t.toUpperCase():""})}),d=e(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),a=/\B([A-Z])/g,_=e(function(e){return e.replace(a,"-$1").toLowerCase()});var v=Function.prototype.bind?function(e,t){return e.bind(t)}:function(n,r){function e(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}return e._length=n.length,e};function h(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function m(e,t){for(var n in t)e[n]=t[n];return e}function b(e){for(var t={},n=0;n<e.length;n++)e[n]&&m(t,e[n]);return t}function $(e,t,n){}var O=function(e,t,n){return!1},w=function(e){return e};function C(t,n){if(t===n)return!0;var e=P(t),r=P(n);if(!e||!r)return!e&&!r&&String(t)===String(n);try{var i=Array.isArray(t),o=Array.isArray(n);if(i&&o)return t.length===n.length&&t.every(function(e,t){return C(e,n[t])});if(i||o)return!1;var a=Object.keys(t),s=Object.keys(n);return a.length===s.length&&a.every(function(e){return C(t[e],n[e])})}catch(e){return!1}}function x(e,t){for(var n=0;n<e.length;n++)if(C(e[n],t))return n;return-1}function R(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var E="data-server-rendered",k=["component","directive","filter"],A=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],j={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:O,isReservedAttr:O,isUnknownElement:O,getTagNamespace:$,parsePlatformTagName:w,mustUseProp:O,_lifecycleHooks:A};function N(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var L=/[^\w.$]/;var I,H="__proto__"in{},B="undefined"!=typeof window,U="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,V=U&&WXEnvironment.platform.toLowerCase(),z=B&&window.navigator.userAgent.toLowerCase(),K=z&&/msie|trident/.test(z),J=z&&0<z.indexOf("msie 9.0"),q=z&&0<z.indexOf("edge/"),W=(z&&z.indexOf("android"),z&&/iphone|ipad|ipod|ios/.test(z)||"ios"===V),G=(z&&/chrome\/\d+/.test(z),{}.watch),Z=!1;if(B)try{var X={};Object.defineProperty(X,"passive",{get:function(){Z=!0}}),window.addEventListener("test-passive",null,X)}catch(e){}var Y=function(){return void 0===I&&(I=!B&&!U&&"undefined"!=typeof global&&"server"===global.process.env.VUE_ENV),I},Q=B&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ee(e){return"function"==typeof e&&/native code/.test(e.toString())}var te,ne="undefined"!=typeof Symbol&&ee(Symbol)&&"undefined"!=typeof Reflect&&ee(Reflect.ownKeys);te="undefined"!=typeof Set&&ee(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var re=$,ie=0,oe=function(){this.id=ie++,this.subs=[]};oe.prototype.addSub=function(e){this.subs.push(e)},oe.prototype.removeSub=function(e){f(this.subs,e)},oe.prototype.depend=function(){oe.target&&oe.target.addDep(this)},oe.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},oe.target=null;var ae=[];function se(e){oe.target&&ae.push(oe.target),oe.target=e}function ce(){oe.target=ae.pop()}var le=function(e,t,n,r,i,o,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=i,this.ns=void 0,this.context=o,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},ue={child:{configurable:!0}};ue.child.get=function(){return this.componentInstance},Object.defineProperties(le.prototype,ue);var fe=function(e){void 0===e&&(e="");var t=new le;return t.text=e,t.isComment=!0,t};function pe(e){return new le(void 0,void 0,void 0,String(e))}function de(e){var t=new le(e.tag,e.data,e.children,e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.isCloned=!0,t}var ve=Array.prototype,he=Object.create(ve);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(o){var a=ve[o];N(he,o,function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n,r=a.apply(this,e),i=this.__ob__;switch(o){case"push":case"unshift":n=e;break;case"splice":n=e.slice(2)}return n&&i.observeArray(n),i.dep.notify(),r})});var me=Object.getOwnPropertyNames(he),ye=!0;function ge(e){ye=e}var _e=function(e){(this.value=e,this.dep=new oe,this.vmCount=0,N(e,"__ob__",this),Array.isArray(e))?((H?be:$e)(e,he,me),this.observeArray(e)):this.walk(e)};function be(e,t,n){e.__proto__=t}function $e(e,t,n){for(var r=0,i=n.length;r<i;r++){var o=n[r];N(e,o,t[o])}}function we(e,t){var n;if(P(e)&&!(e instanceof le))return p(e,"__ob__")&&e.__ob__ instanceof _e?n=e.__ob__:ye&&!Y()&&(Array.isArray(e)||l(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new _e(e)),t&&n&&n.vmCount++,n}function Ce(n,e,r,t,i){var o=new oe,a=Object.getOwnPropertyDescriptor(n,e);if(!a||!1!==a.configurable){var s=a&&a.get;s||2!==arguments.length||(r=n[e]);var c=a&&a.set,l=!i&&we(r);Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(n):r;return oe.target&&(o.depend(),l&&(l.dep.depend(),Array.isArray(e)&&function e(t){for(var n=void 0,r=0,i=t.length;r<i;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(e))),e},set:function(e){var t=s?s.call(n):r;e===t||e!=e&&t!=t||(c?c.call(n,e):r=e,l=!i&&we(e),o.notify())}})}}function xe(e,t,n){if(Array.isArray(e)&&i(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(Ce(r.value,t,n),r.dep.notify(),n):e[t]=n}function ke(e,t){if(Array.isArray(e)&&i(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||p(e,t)&&(delete e[t],n&&n.dep.notify())}}_e.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)Ce(e,t[n])},_e.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)we(e[t])};var Ae=j.optionMergeStrategies;function Oe(e,t){if(!t)return e;for(var n,r,i,o=Object.keys(t),a=0;a<o.length;a++)r=e[n=o[a]],i=t[n],p(e,n)?l(r)&&l(i)&&Oe(r,i):xe(e,n,i);return e}function Se(n,r,i){return i?function(){var e="function"==typeof r?r.call(i,i):r,t="function"==typeof n?n.call(i,i):n;return e?Oe(e,t):t}:r?n?function(){return Oe("function"==typeof r?r.call(this,this):r,"function"==typeof n?n.call(this,this):n)}:r:n}function Te(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function Ee(e,t,n,r){var i=Object.create(e||null);return t?m(i,t):i}Ae.data=function(e,t,n){return n?Se(e,t,n):t&&"function"!=typeof t?e:Se(e,t)},A.forEach(function(e){Ae[e]=Te}),k.forEach(function(e){Ae[e+"s"]=Ee}),Ae.watch=function(e,t,n,r){if(e===G&&(e=void 0),t===G&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var i={};for(var o in m(i,e),t){var a=i[o],s=t[o];a&&!Array.isArray(a)&&(a=[a]),i[o]=a?a.concat(s):Array.isArray(s)?s:[s]}return i},Ae.props=Ae.methods=Ae.inject=Ae.computed=function(e,t,n,r){if(!e)return t;var i=Object.create(null);return m(i,e),t&&m(i,t),i},Ae.provide=Se;var je=function(e,t){return void 0===t?e:t};function Ne(n,r,i){"function"==typeof r&&(r=r.options),function(e,t){var n=e.props;if(n){var r,i,o={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(i=n[r])&&(o[g(i)]={type:null});else if(l(n))for(var a in n)i=n[a],o[g(a)]=l(i)?i:{type:i};e.props=o}}(r),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var i=0;i<n.length;i++)r[n[i]]={from:n[i]};else if(l(n))for(var o in n){var a=n[o];r[o]=l(a)?m({from:o},a):{from:a}}}}(r),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(r);var e=r.extends;if(e&&(n=Ne(n,e,i)),r.mixins)for(var t=0,o=r.mixins.length;t<o;t++)n=Ne(n,r.mixins[t],i);var a,s={};for(a in n)c(a);for(a in r)p(n,a)||c(a);function c(e){var t=Ae[e]||je;s[e]=t(n[e],r[e],i,e)}return s}function Le(e,t,n,r){if("string"==typeof n){var i=e[t];if(p(i,n))return i[n];var o=g(n);if(p(i,o))return i[o];var a=d(o);return p(i,a)?i[a]:i[n]||i[o]||i[a]}}function Ie(e,t,n,r){var i=t[e],o=!p(n,e),a=n[e],s=Pe(Boolean,i.type);if(-1<s)if(o&&!p(i,"default"))a=!1;else if(""===a||a===_(e)){var c=Pe(String,i.type);(c<0||s<c)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(!p(t,"default"))return;var r=t.default;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Me(t.type)?r.call(e):r}(r,i,e);var l=ye;ge(!0),we(a),ge(l)}return a}function Me(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function De(e,t){return Me(e)===Me(t)}function Pe(e,t){if(!Array.isArray(t))return De(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(De(t[n],e))return n;return-1}function Fe(e,t,n){if(t)for(var r=t;r=r.$parent;){var i=r.$options.errorCaptured;if(i)for(var o=0;o<i.length;o++)try{if(!1===i[o].call(r,e,t,n))return}catch(e){Re(e,r,"errorCaptured hook")}}Re(e,t,n)}function Re(e,t,n){if(j.errorHandler)try{return j.errorHandler.call(null,e,t,n)}catch(e){He(e,null,"config.errorHandler")}He(e,t,n)}function He(e,t,n){if(!B&&!U||"undefined"==typeof console)throw e;console.error(e)}var Be,Ue,Ve=[],ze=!1;function Ke(){ze=!1;for(var e=Ve.slice(0),t=Ve.length=0;t<e.length;t++)e[t]()}var Je=!1;if("undefined"!=typeof setImmediate&&ee(setImmediate))Ue=function(){setImmediate(Ke)};else if("undefined"==typeof MessageChannel||!ee(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())Ue=function(){setTimeout(Ke,0)};else{var qe=new MessageChannel,We=qe.port2;qe.port1.onmessage=Ke,Ue=function(){We.postMessage(1)}}if("undefined"!=typeof Promise&&ee(Promise)){var Ge=Promise.resolve();Be=function(){Ge.then(Ke),W&&setTimeout($)}}else Be=Ue;function Ze(e,t){var n;if(Ve.push(function(){if(e)try{e.call(t)}catch(e){Fe(e,t,"nextTick")}else n&&n(t)}),ze||(ze=!0,Je?Ue():Be()),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}var Xe=new te;function Ye(e){!function e(t,n){var r,i;var o=Array.isArray(t);if(!o&&!P(t)||Object.isFrozen(t)||t instanceof le)return;if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(o)for(r=t.length;r--;)e(t[r],n);else for(i=Object.keys(t),r=i.length;r--;)e(t[i[r]],n)}(e,Xe),Xe.clear()}var Qe,et=e(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function tt(e){function i(){var e=arguments,t=i.fns;if(!Array.isArray(t))return t.apply(null,arguments);for(var n=t.slice(),r=0;r<n.length;r++)n[r].apply(null,e)}return i.fns=e,i}function nt(e,t,n,r,i){var o,a,s,c;for(o in e)a=e[o],s=t[o],c=et(o),M(a)||(M(s)?(M(a.fns)&&(a=e[o]=tt(a)),n(c.name,a,c.once,c.capture,c.passive,c.params)):a!==s&&(s.fns=a,e[o]=s));for(o in t)M(e[o])&&r((c=et(o)).name,t[o],c.capture)}function rt(e,t,n){var r;e instanceof le&&(e=e.data.hook||(e.data.hook={}));var i=e[t];function o(){n.apply(this,arguments),f(r.fns,o)}M(i)?r=tt([o]):D(i.fns)&&S(i.merged)?(r=i).fns.push(o):r=tt([i,o]),r.merged=!0,e[t]=r}function it(e,t,n,r,i){if(D(t)){if(p(t,n))return e[n]=t[n],i||delete t[n],!0;if(p(t,r))return e[n]=t[r],i||delete t[r],!0}return!1}function ot(e){return T(e)?[pe(e)]:Array.isArray(e)?function e(t,n){var r=[];var i,o,a,s;for(i=0;i<t.length;i++)M(o=t[i])||"boolean"==typeof o||(a=r.length-1,s=r[a],Array.isArray(o)?0<o.length&&(at((o=e(o,(n||"")+"_"+i))[0])&&at(s)&&(r[a]=pe(s.text+o[0].text),o.shift()),r.push.apply(r,o)):T(o)?at(s)?r[a]=pe(s.text+o):""!==o&&r.push(pe(o)):at(o)&&at(s)?r[a]=pe(s.text+o.text):(S(t._isVList)&&D(o.tag)&&M(o.key)&&D(n)&&(o.key="__vlist"+n+"_"+i+"__"),r.push(o)));return r}(e):void 0}function at(e){return D(e)&&D(e.text)&&!1===e.isComment}function st(e,t){return(e.__esModule||ne&&"Module"===e[Symbol.toStringTag])&&(e=e.default),P(e)?t.extend(e):e}function ct(e){return e.isComment&&e.asyncFactory}function lt(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(D(n)&&(D(n.componentOptions)||ct(n)))return n}}function ut(e,t,n){n?Qe.$once(e,t):Qe.$on(e,t)}function ft(e,t){Qe.$off(e,t)}function pt(e,t,n){Qe=e,nt(t,n||{},ut,ft),Qe=void 0}function dt(e,t){var n={};if(!e)return n;for(var r=0,i=e.length;r<i;r++){var o=e[r],a=o.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,o.context!==t&&o.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(o);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===o.tag?c.push.apply(c,o.children||[]):c.push(o)}}for(var l in n)n[l].every(vt)&&delete n[l];return n}function vt(e){return e.isComment&&!e.asyncFactory||" "===e.text}function ht(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?ht(e[n],t):t[e[n].key]=e[n].fn;return t}var mt=null;function yt(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function gt(e,t){if(t){if(e._directInactive=!1,yt(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)gt(e.$children[n]);_t(e,"activated")}}function _t(t,n){se();var e=t.$options[n];if(e)for(var r=0,i=e.length;r<i;r++)try{e[r].call(t)}catch(e){Fe(e,t,n+" hook")}t._hasHookEvent&&t.$emit("hook:"+n),ce()}var bt=[],$t=[],wt={},Ct=!1,xt=!1,kt=0;function At(){var e,t;for(xt=!0,bt.sort(function(e,t){return e.id-t.id}),kt=0;kt<bt.length;kt++)t=(e=bt[kt]).id,wt[t]=null,e.run();var n=$t.slice(),r=bt.slice();kt=bt.length=$t.length=0,wt={},Ct=xt=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,gt(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&_t(r,"updated")}}(r),Q&&j.devtools&&Q.emit("flush")}var Ot=0,St=function(e,t,n,r,i){this.vm=e,i&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Ot,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new te,this.newDepIds=new te,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!L.test(e)){var n=e.split(".");return function(e){for(var t=0;t<n.length;t++){if(!e)return;e=e[n[t]]}return e}}}(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};St.prototype.get=function(){var e;se(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;Fe(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&Ye(e),ce(),this.cleanupDeps()}return e},St.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},St.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},St.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==wt[t]){if(wt[t]=!0,xt){for(var n=bt.length-1;kt<n&&bt[n].id>e.id;)n--;bt.splice(n+1,0,e)}else bt.push(e);Ct||(Ct=!0,Ze(At))}}(this)},St.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||P(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Fe(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},St.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},St.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},St.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||f(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var Tt={enumerable:!0,configurable:!0,get:$,set:$};function Et(e,t,n){Tt.get=function(){return this[t][n]},Tt.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Tt)}function jt(e){e._watchers=[];var t=e.$options;t.props&&function(n,r){var i=n.$options.propsData||{},o=n._props={},a=n.$options._propKeys=[];n.$parent&&ge(!1);var e=function(e){a.push(e);var t=Ie(e,r,i,n);Ce(o,e,t),e in n||Et(n,"_props",e)};for(var t in r)e(t);ge(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?$:v(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;l(t=e._data="function"==typeof t?function(e,t){se();try{return e.call(t,t)}catch(e){return Fe(e,t,"data()"),{}}finally{ce()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&p(r,o)||(void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&Et(e,"_data",o))}var a;we(t,!0)}(e):we(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=Y();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new St(e,a||$,$,Nt)),i in e||Lt(e,i,o)}}(e,t.computed),t.watch&&t.watch!==G&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i<r.length;i++)Mt(e,n,r[i]);else Mt(e,n,r)}}(e,t.watch)}var Nt={lazy:!0};function Lt(e,t,n){var r=!Y();"function"==typeof n?(Tt.get=r?It(t):n,Tt.set=$):(Tt.get=n.get?r&&!1!==n.cache?It(t):n.get:$,Tt.set=n.set?n.set:$),Object.defineProperty(e,t,Tt)}function It(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),oe.target&&e.depend(),e.value}}function Mt(e,t,n,r){return l(n)&&(n=(r=n).handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Dt(t,e){if(t){for(var n=Object.create(null),r=ne?Reflect.ownKeys(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}):Object.keys(t),i=0;i<r.length;i++){for(var o=r[i],a=t[o].from,s=e;s;){if(s._provided&&p(s._provided,a)){n[o]=s._provided[a];break}s=s.$parent}if(!s&&"default"in t[o]){var c=t[o].default;n[o]="function"==typeof c?c.call(e):c}}return n}}function Pt(e,t){var n,r,i,o,a;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,i=e.length;r<i;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(P(e))for(o=Object.keys(e),n=new Array(o.length),r=0,i=o.length;r<i;r++)a=o[r],n[r]=t(e[a],a,r);return D(n)&&(n._isVList=!0),n}function Ft(e,t,n,r){var i,o=this.$scopedSlots[e];if(o)n=n||{},r&&(n=m(m({},r),n)),i=o(n)||t;else{var a=this.$slots[e];a&&(a._rendered=!0),i=a||t}var s=n&&n.slot;return s?this.$createElement("template",{slot:s},i):i}function Rt(e){return Le(this.$options,"filters",e)||w}function Ht(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function Bt(e,t,n,r,i){var o=j.keyCodes[t]||n;return i&&r&&!j.keyCodes[t]?Ht(i,r):o?Ht(o,e):r?_(r)!==t:void 0}function Ut(n,r,i,o,a){if(i)if(P(i)){var s;Array.isArray(i)&&(i=b(i));var e=function(t){if("class"===t||"style"===t||u(t))s=n;else{var e=n.attrs&&n.attrs.type;s=o||j.mustUseProp(r,e,t)?n.domProps||(n.domProps={}):n.attrs||(n.attrs={})}t in s||(s[t]=i[t],a&&((n.on||(n.on={}))["update:"+t]=function(e){i[t]=e}))};for(var t in i)e(t)}else;return n}function Vt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t||Kt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r}function zt(e,t,n){return Kt(e,"__once__"+t+(n?"_"+n:""),!0),e}function Kt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&Jt(e[r],t+"_"+r,n);else Jt(e,t,n)}function Jt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function qt(e,t){if(t)if(l(t)){var n=e.on=e.on?m({},e.on):{};for(var r in t){var i=n[r],o=t[r];n[r]=i?[].concat(i,o):o}}else;return e}function Wt(e){e._o=zt,e._n=F,e._s=t,e._l=Pt,e._t=Ft,e._q=C,e._i=x,e._m=Vt,e._f=Rt,e._k=Bt,e._b=Ut,e._v=pe,e._e=fe,e._u=ht,e._g=qt}function Gt(e,t,n,o,r){var a,s=r.options;p(o,"_uid")?(a=Object.create(o))._original=o:o=(a=o)._original;var i=S(s._compiled),c=!i;this.data=e,this.props=t,this.children=n,this.parent=o,this.listeners=e.on||y,this.injections=Dt(s.inject,o),this.slots=function(){return dt(n,o)},i&&(this.$options=s,this.$slots=this.slots(),this.$scopedSlots=e.scopedSlots||y),s._scopeId?this._c=function(e,t,n,r){var i=rn(a,e,t,n,r,c);return i&&!Array.isArray(i)&&(i.fnScopeId=s._scopeId,i.fnContext=o),i}:this._c=function(e,t,n,r){return rn(a,e,t,n,r,c)}}function Zt(e,t,n,r){var i=de(e);return i.fnContext=n,i.fnOptions=r,t.slot&&((i.data||(i.data={})).slot=t.slot),i}function Xt(e,t){for(var n in t)e[g(n)]=t[n]}Wt(Gt.prototype);var Yt={init:function(e,t,n,r){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var i=e;Yt.prepatch(i,i)}else{(e.componentInstance=function(e,t,n,r){var i={_isComponent:!0,parent:t,_parentVnode:e,_parentElm:n||null,_refElm:r||null},o=e.data.inlineTemplate;D(o)&&(i.render=o.render,i.staticRenderFns=o.staticRenderFns);return new e.componentOptions.Ctor(i)}(e,mt,n,r)).$mount(t?e.elm:void 0,t)}},prepatch:function(e,t){var n=t.componentOptions;!function(e,t,n,r,i){var o=!!(i||e.$options._renderChildren||r.data.scopedSlots||e.$scopedSlots!==y);if(e.$options._parentVnode=r,e.$vnode=r,e._vnode&&(e._vnode.parent=r),e.$options._renderChildren=i,e.$attrs=r.data.attrs||y,e.$listeners=n||y,t&&e.$options.props){ge(!1);for(var a=e._props,s=e.$options._propKeys||[],c=0;c<s.length;c++){var l=s[c],u=e.$options.props;a[l]=Ie(l,u,t,e)}ge(!0),e.$options.propsData=t}n=n||y;var f=e.$options._parentListeners;e.$options._parentListeners=n,pt(e,n,f),o&&(e.$slots=dt(i,r.context),e.$forceUpdate())}(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,_t(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,$t.push(t)):gt(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,yt(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);_t(t,"deactivated")}}(t,!0):t.$destroy())}},Qt=Object.keys(Yt);function en(e,t,n,r,i){if(!M(e)){var o=n.$options._base;if(P(e)&&(e=o.extend(e)),"function"==typeof e){var a,s,c,l,u,f,p;if(M(e.cid)&&void 0===(e=function(t,n,e){if(S(t.error)&&D(t.errorComp))return t.errorComp;if(D(t.resolved))return t.resolved;if(S(t.loading)&&D(t.loadingComp))return t.loadingComp;if(!D(t.contexts)){var r=t.contexts=[e],i=!0,o=function(){for(var e=0,t=r.length;e<t;e++)r[e].$forceUpdate()},a=R(function(e){t.resolved=st(e,n),i||o()}),s=R(function(e){D(t.errorComp)&&(t.error=!0,o())}),c=t(a,s);return P(c)&&("function"==typeof c.then?M(t.resolved)&&c.then(a,s):D(c.component)&&"function"==typeof c.component.then&&(c.component.then(a,s),D(c.error)&&(t.errorComp=st(c.error,n)),D(c.loading)&&(t.loadingComp=st(c.loading,n),0===c.delay?t.loading=!0:setTimeout(function(){M(t.resolved)&&M(t.error)&&(t.loading=!0,o())},c.delay||200)),D(c.timeout)&&setTimeout(function(){M(t.resolved)&&s(null)},c.timeout))),i=!1,t.loading?t.loadingComp:t.resolved}t.contexts.push(e)}(a=e,o,n)))return s=a,c=t,l=n,u=r,f=i,(p=fe()).asyncFactory=s,p.asyncMeta={data:c,context:l,children:u,tag:f},p;t=t||{},dn(e),D(t.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var i=t.on||(t.on={});D(i[r])?i[r]=[t.model.callback].concat(i[r]):i[r]=t.model.callback}(e.options,t);var d=function(e,t,n){var r=t.options.props;if(!M(r)){var i={},o=e.attrs,a=e.props;if(D(o)||D(a))for(var s in r){var c=_(s);it(i,a,s,c,!0)||it(i,o,s,c,!1)}return i}}(t,e);if(S(e.options.functional))return function(e,t,n,r,i){var o=e.options,a={},s=o.props;if(D(s))for(var c in s)a[c]=Ie(c,s,t||y);else D(n.attrs)&&Xt(a,n.attrs),D(n.props)&&Xt(a,n.props);var l=new Gt(n,a,i,r,e),u=o.render.call(null,l._c,l);if(u instanceof le)return Zt(u,n,l.parent,o);if(Array.isArray(u)){for(var f=ot(u)||[],p=new Array(f.length),d=0;d<f.length;d++)p[d]=Zt(f[d],n,l.parent,o);return p}}(e,d,t,n,r);var v=t.on;if(t.on=t.nativeOn,S(e.options.abstract)){var h=t.slot;t={},h&&(t.slot=h)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<Qt.length;n++){var r=Qt[n];t[r]=Yt[r]}}(t);var m=e.options.name||i;return new le("vue-component-"+e.cid+(m?"-"+m:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:d,listeners:v,tag:i,children:r},a)}}}var tn=1,nn=2;function rn(e,t,n,r,i,o){return(Array.isArray(n)||T(n))&&(i=r,r=n,n=void 0),S(o)&&(i=nn),function(e,t,n,r,i){if(D(n)&&D(n.__ob__))return fe();D(n)&&D(n.is)&&(t=n.is);if(!t)return fe();Array.isArray(r)&&"function"==typeof r[0]&&((n=n||{}).scopedSlots={default:r[0]},r.length=0);i===nn?r=ot(r):i===tn&&(r=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(r));var o,a;if("string"==typeof t){var s;a=e.$vnode&&e.$vnode.ns||j.getTagNamespace(t),o=j.isReservedTag(t)?new le(j.parsePlatformTagName(t),n,r,void 0,void 0,e):D(s=Le(e.$options,"components",t))?en(s,n,e,r,t):new le(t,n,r,void 0,void 0,e)}else o=en(t,n,e,r);return Array.isArray(o)?o:D(o)?(D(a)&&function e(t,n,r){t.ns=n;"foreignObject"===t.tag&&(n=void 0,r=!0);if(D(t.children))for(var i=0,o=t.children.length;i<o;i++){var a=t.children[i];D(a.tag)&&(M(a.ns)||S(r)&&"svg"!==a.tag)&&e(a,n,r)}}(o,a),D(n)&&function(e){P(e.style)&&Ye(e.style);P(e.class)&&Ye(e.class)}(n),o):fe()}(e,t,n,r,i)}var on,an,sn,cn,ln,un,fn,pn=0;function dn(e){var t=e.options;if(e.super){var n=dn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.extendOptions,i=e.sealedOptions;for(var o in n)n[o]!==i[o]&&(t||(t={}),t[o]=vn(n[o],r[o],i[o]));return t}(e);r&&m(e.extendOptions,r),(t=e.options=Ne(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function vn(e,t,n){if(Array.isArray(e)){var r=[];n=Array.isArray(n)?n:[n],t=Array.isArray(t)?t:[t];for(var i=0;i<e.length;i++)(0<=t.indexOf(e[i])||n.indexOf(e[i])<0)&&r.push(e[i]);return r}return e}function hn(e){this._init(e)}function mn(e){e.cid=0;var a=1;e.extend=function(e){e=e||{};var t=this,n=t.cid,r=e._Ctor||(e._Ctor={});if(r[n])return r[n];var i=e.name||t.options.name,o=function(e){this._init(e)};return((o.prototype=Object.create(t.prototype)).constructor=o).cid=a++,o.options=Ne(t.options,e),o.super=t,o.options.props&&function(e){var t=e.options.props;for(var n in t)Et(e.prototype,"_props",n)}(o),o.options.computed&&function(e){var t=e.options.computed;for(var n in t)Lt(e.prototype,n,t[n])}(o),o.extend=t.extend,o.mixin=t.mixin,o.use=t.use,k.forEach(function(e){o[e]=t[e]}),i&&(o.options.components[i]=o),o.superOptions=t.options,o.extendOptions=e,o.sealedOptions=m({},o.options),r[n]=o}}function yn(e){return e&&(e.Ctor.options.name||e.tag)}function gn(e,t){return Array.isArray(e)?-1<e.indexOf(t):"string"==typeof e?-1<e.split(",").indexOf(t):(n=e,"[object RegExp]"===r.call(n)&&e.test(t));var n}function _n(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=yn(a.componentOptions);s&&!t(s)&&bn(n,o,r,i)}}}function bn(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,f(n,t)}hn.prototype._init=function(e){var t,n,r,i,o=this;o._uid=pn++,o._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r,n._parentElm=t._parentElm,n._refElm=t._refElm;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(o,e):o.$options=Ne(dn(o.constructor),e||{},o),function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}((o._renderProxy=o)._self=o),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&pt(e,t)}(o),function(i){i._vnode=null,i._staticTrees=null;var e=i.$options,t=i.$vnode=e._parentVnode,n=t&&t.context;i.$slots=dt(e._renderChildren,n),i.$scopedSlots=y,i._c=function(e,t,n,r){return rn(i,e,t,n,r,!1)},i.$createElement=function(e,t,n,r){return rn(i,e,t,n,r,!0)};var r=t&&t.data;Ce(i,"$attrs",r&&r.attrs||y,null,!0),Ce(i,"$listeners",e._parentListeners||y,null,!0)}(o),_t(o,"beforeCreate"),(n=Dt((t=o).$options.inject,t))&&(ge(!1),Object.keys(n).forEach(function(e){Ce(t,e,n[e])}),ge(!0)),jt(o),(i=(r=o).$options.provide)&&(r._provided="function"==typeof i?i.call(r):i),_t(o,"created"),o.$options.el&&o.$mount(o.$options.el)},on=hn,an={get:function(){return this._data}},sn={get:function(){return this._props}},Object.defineProperty(on.prototype,"$data",an),Object.defineProperty(on.prototype,"$props",sn),on.prototype.$set=xe,on.prototype.$delete=ke,on.prototype.$watch=function(e,t,n){if(l(t))return Mt(this,e,t,n);(n=n||{}).user=!0;var r=new St(this,e,t,n);return n.immediate&&t.call(this,r.value),function(){r.teardown()}},ln=/^hook:/,(cn=hn).prototype.$on=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n<r;n++)this.$on(e[n],t);else(this._events[e]||(this._events[e]=[])).push(t),ln.test(e)&&(this._hasHookEvent=!0);return this},cn.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},cn.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,i=e.length;r<i;r++)this.$off(e[r],t);return n}var o=n._events[e];if(!o)return n;if(!t)return n._events[e]=null,n;if(t)for(var a,s=o.length;s--;)if((a=o[s])===t||a.fn===t){o.splice(s,1);break}return n},cn.prototype.$emit=function(t){var n=this,e=n._events[t];if(e){e=1<e.length?h(e):e;for(var r=h(arguments,1),i=0,o=e.length;i<o;i++)try{e[i].apply(n,r)}catch(e){Fe(e,n,'event handler for "'+t+'"')}}return n},(un=hn).prototype._update=function(e,t){var n=this;n._isMounted&&_t(n,"beforeUpdate");var r=n.$el,i=n._vnode,o=mt;(mt=n)._vnode=e,i?n.$el=n.__patch__(i,e):(n.$el=n.__patch__(n.$el,e,t,!1,n.$options._parentElm,n.$options._refElm),n.$options._parentElm=n.$options._refElm=null),mt=o,r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},un.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},un.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){_t(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||f(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),_t(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}},Wt((fn=hn).prototype),fn.prototype.$nextTick=function(e){return Ze(e,this)},fn.prototype._render=function(){var t,n=this,e=n.$options,r=e.render,i=e._parentVnode;i&&(n.$scopedSlots=i.data.scopedSlots||y),n.$vnode=i;try{t=r.call(n._renderProxy,n.$createElement)}catch(e){Fe(e,n,"render"),t=n._vnode}return t instanceof le||(t=fe()),t.parent=i,t};var $n,wn,Cn,xn=[String,RegExp,Array],kn={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:xn,exclude:xn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)bn(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",function(t){_n(e,function(e){return gn(t,e)})}),this.$watch("exclude",function(t){_n(e,function(e){return!gn(t,e)})})},render:function(){var e=this.$slots.default,t=lt(e),n=t&&t.componentOptions;if(n){var r=yn(n),i=this.include,o=this.exclude;if(i&&(!r||!gn(i,r))||o&&r&&gn(o,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,f(s,c),s.push(c)):(a[c]=t,s.push(c),this.max&&s.length>parseInt(this.max)&&bn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};$n=hn,Cn={get:function(){return j}},Object.defineProperty($n,"config",Cn),$n.util={warn:re,extend:m,mergeOptions:Ne,defineReactive:Ce},$n.set=xe,$n.delete=ke,$n.nextTick=Ze,$n.options=Object.create(null),k.forEach(function(e){$n.options[e+"s"]=Object.create(null)}),m(($n.options._base=$n).options.components,kn),$n.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(-1<t.indexOf(e))return this;var n=h(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this},$n.mixin=function(e){return this.options=Ne(this.options,e),this},mn($n),wn=$n,k.forEach(function(n){wn[n]=function(e,t){return t?("component"===n&&l(t)&&(t.name=t.name||e,t=this.options._base.extend(t)),"directive"===n&&"function"==typeof t&&(t={bind:t,update:t}),this.options[n+"s"][e]=t):this.options[n+"s"][e]}}),Object.defineProperty(hn.prototype,"$isServer",{get:Y}),Object.defineProperty(hn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(hn,"FunctionalRenderContext",{value:Gt}),hn.version="2.5.17";var An=s("style,class"),On=s("input,textarea,option,select,progress"),Sn=function(e,t,n){return"value"===n&&On(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Tn=s("contenteditable,draggable,spellcheck"),En=s("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),jn="http://www.w3.org/1999/xlink",Nn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Ln=function(e){return Nn(e)?e.slice(6,e.length):""},In=function(e){return null==e||!1===e};function Mn(e){for(var t=e.data,n=e,r=e;D(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=Dn(r.data,t));for(;D(n=n.parent);)n&&n.data&&(t=Dn(t,n.data));return function(e,t){if(D(e)||D(t))return Pn(e,Fn(t));return""}(t.staticClass,t.class)}function Dn(e,t){return{staticClass:Pn(e.staticClass,t.staticClass),class:D(e.class)?[e.class,t.class]:t.class}}function Pn(e,t){return e?t?e+" "+t:e:t||""}function Fn(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,i=e.length;r<i;r++)D(t=Fn(e[r]))&&""!==t&&(n&&(n+=" "),n+=t);return n}(e):P(e)?function(e){var t="";for(var n in e)e[n]&&(t&&(t+=" "),t+=n);return t}(e):"string"==typeof e?e:""}var Rn={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},Hn=s("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),Bn=s("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),Un=function(e){return Hn(e)||Bn(e)};function Vn(e){return Bn(e)?"svg":"math"===e?"math":void 0}var zn=Object.create(null);var Kn=s("text,number,password,search,email,tel,url");function Jn(e){if("string"==typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}var qn=Object.freeze({createElement:function(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n},createElementNS:function(e,t){return document.createElementNS(Rn[e],t)},createTextNode:function(e){return document.createTextNode(e)},createComment:function(e){return document.createComment(e)},insertBefore:function(e,t,n){e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},appendChild:function(e,t){e.appendChild(t)},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.tagName},setTextContent:function(e,t){e.textContent=t},setStyleScope:function(e,t){e.setAttribute(t,"")}}),Wn={create:function(e,t){Gn(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Gn(e,!0),Gn(t))},destroy:function(e){Gn(e,!0)}};function Gn(e,t){var n=e.data.ref;if(D(n)){var r=e.context,i=e.componentInstance||e.elm,o=r.$refs;t?Array.isArray(o[n])?f(o[n],i):o[n]===i&&(o[n]=void 0):e.data.refInFor?Array.isArray(o[n])?o[n].indexOf(i)<0&&o[n].push(i):o[n]=[i]:o[n]=i}}var Zn=new le("",{},[]),Xn=["create","activate","update","remove","destroy"];function Yn(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&D(e.data)===D(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=D(n=e.data)&&D(n=n.attrs)&&n.type,i=D(n=t.data)&&D(n=n.attrs)&&n.type;return r===i||Kn(r)&&Kn(i)}(e,t)||S(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&M(t.asyncFactory.error))}function Qn(e,t,n){var r,i,o={};for(r=t;r<=n;++r)D(i=e[r].key)&&(o[i]=r);return o}var er={create:tr,update:tr,destroy:function(e){tr(e,Zn)}};function tr(e,t){(e.data.directives||t.data.directives)&&function(t,n){var e,r,i,o=t===Zn,a=n===Zn,s=rr(t.data.directives,t.context),c=rr(n.data.directives,n.context),l=[],u=[];for(e in c)r=s[e],i=c[e],r?(i.oldValue=r.value,ir(i,"update",n,t),i.def&&i.def.componentUpdated&&u.push(i)):(ir(i,"bind",n,t),i.def&&i.def.inserted&&l.push(i));if(l.length){var f=function(){for(var e=0;e<l.length;e++)ir(l[e],"inserted",n,t)};o?rt(n,"insert",f):f()}u.length&&rt(n,"postpatch",function(){for(var e=0;e<u.length;e++)ir(u[e],"componentUpdated",n,t)});if(!o)for(e in s)c[e]||ir(s[e],"unbind",t,t,a)}(e,t)}var nr=Object.create(null);function rr(e,t){var n,r,i,o=Object.create(null);if(!e)return o;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=nr),(o[(i=r,i.rawName||i.name+"."+Object.keys(i.modifiers||{}).join("."))]=r).def=Le(t.$options,"directives",r.name);return o}function ir(t,n,r,e,i){var o=t.def&&t.def[n];if(o)try{o(r.elm,t,r,e,i)}catch(e){Fe(e,r.context,"directive "+t.name+" "+n+" hook")}}var or=[Wn,er];function ar(e,t){var n=t.componentOptions;if(!(D(n)&&!1===n.Ctor.options.inheritAttrs||M(e.data.attrs)&&M(t.data.attrs))){var r,i,o=t.elm,a=e.data.attrs||{},s=t.data.attrs||{};for(r in D(s.__ob__)&&(s=t.data.attrs=m({},s)),s)i=s[r],a[r]!==i&&sr(o,r,i);for(r in(K||q)&&s.value!==a.value&&sr(o,"value",s.value),a)M(s[r])&&(Nn(r)?o.removeAttributeNS(jn,Ln(r)):Tn(r)||o.removeAttribute(r))}}function sr(e,t,n){-1<e.tagName.indexOf("-")?cr(e,t,n):En(t)?In(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Tn(t)?e.setAttribute(t,In(n)||"false"===n?"false":"true"):Nn(t)?In(n)?e.removeAttributeNS(jn,Ln(t)):e.setAttributeNS(jn,t,n):cr(e,t,n)}function cr(t,e,n){if(In(n))t.removeAttribute(e);else{if(K&&!J&&"TEXTAREA"===t.tagName&&"placeholder"===e&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var lr={create:ar,update:ar};function ur(e,t){var n=t.elm,r=t.data,i=e.data;if(!(M(r.staticClass)&&M(r.class)&&(M(i)||M(i.staticClass)&&M(i.class)))){var o=Mn(t),a=n._transitionClasses;D(a)&&(o=Pn(o,Fn(a))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var fr,pr,dr,vr,hr,mr,yr={create:ur,update:ur},gr=/[\w).+\-_$\]]/;function _r(e){var t,n,r,i,o,a=!1,s=!1,c=!1,l=!1,u=0,f=0,p=0,d=0;for(r=0;r<e.length;r++)if(n=t,t=e.charCodeAt(r),a)39===t&&92!==n&&(a=!1);else if(s)34===t&&92!==n&&(s=!1);else if(c)96===t&&92!==n&&(c=!1);else if(l)47===t&&92!==n&&(l=!1);else if(124!==t||124===e.charCodeAt(r+1)||124===e.charCodeAt(r-1)||u||f||p){switch(t){case 34:s=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:p++;break;case 41:p--;break;case 91:f++;break;case 93:f--;break;case 123:u++;break;case 125:u--}if(47===t){for(var v=r-1,h=void 0;0<=v&&" "===(h=e.charAt(v));v--);h&&gr.test(h)||(l=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r<o.length;r++)i=br(i,o[r]);return i}function br(e,t){var n=t.indexOf("(");if(n<0)return'_f("'+t+'")('+e+")";var r=t.slice(0,n),i=t.slice(n+1);return'_f("'+r+'")('+e+(")"!==i?","+i:i)}function $r(e){console.error("[Vue compiler]: "+e)}function wr(e,t){return e?e.map(function(e){return e[t]}).filter(function(e){return e}):[]}function Cr(e,t,n){(e.props||(e.props=[])).push({name:t,value:n}),e.plain=!1}function xr(e,t,n){(e.attrs||(e.attrs=[])).push({name:t,value:n}),e.plain=!1}function kr(e,t,n){e.attrsMap[t]=n,e.attrsList.push({name:t,value:n})}function Ar(e,t,n,r,i,o){var a;(r=r||y).capture&&(delete r.capture,t="!"+t),r.once&&(delete r.once,t="~"+t),r.passive&&(delete r.passive,t="&"+t),"click"===t&&(r.right?(t="contextmenu",delete r.right):r.middle&&(t="mouseup")),r.native?(delete r.native,a=e.nativeEvents||(e.nativeEvents={})):a=e.events||(e.events={});var s={value:n.trim()};r!==y&&(s.modifiers=r);var c=a[t];Array.isArray(c)?i?c.unshift(s):c.push(s):a[t]=c?i?[s,c]:[c,s]:s,e.plain=!1}function Or(e,t,n){var r=Sr(e,":"+t)||Sr(e,"v-bind:"+t);if(null!=r)return _r(r);if(!1!==n){var i=Sr(e,t);if(null!=i)return JSON.stringify(i)}}function Sr(e,t,n){var r;if(null!=(r=e.attrsMap[t]))for(var i=e.attrsList,o=0,a=i.length;o<a;o++)if(i[o].name===t){i.splice(o,1);break}return n&&delete e.attrsMap[t],r}function Tr(e,t,n){var r=n||{},i=r.number,o="$$v",a=o;r.trim&&(a="(typeof $$v === 'string'? $$v.trim(): $$v)"),i&&(a="_n("+a+")");var s=Er(t,a);e.model={value:"("+t+")",expression:'"'+t+'"',callback:"function ($$v) {"+s+"}"}}function Er(e,t){var n=function(e){if(e=e.trim(),fr=e.length,e.indexOf("[")<0||e.lastIndexOf("]")<fr-1)return-1<(vr=e.lastIndexOf("."))?{exp:e.slice(0,vr),key:'"'+e.slice(vr+1)+'"'}:{exp:e,key:null};pr=e,vr=hr=mr=0;for(;!Nr();)Lr(dr=jr())?Mr(dr):91===dr&&Ir(dr);return{exp:e.slice(0,hr),key:e.slice(hr+1,mr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function jr(){return pr.charCodeAt(++vr)}function Nr(){return fr<=vr}function Lr(e){return 34===e||39===e}function Ir(e){var t=1;for(hr=vr;!Nr();)if(Lr(e=jr()))Mr(e);else if(91===e&&t++,93===e&&t--,0===t){mr=vr;break}}function Mr(e){for(var t=e;!Nr()&&(e=jr())!==t;);}var Dr,Pr="__r",Fr="__c";function Rr(e,t,n,r,i){var o,a,s,c,l;t=(o=t)._withTask||(o._withTask=function(){Je=!0;var e=o.apply(null,arguments);return Je=!1,e}),n&&(a=t,s=e,c=r,l=Dr,t=function e(){null!==a.apply(null,arguments)&&Hr(s,e,c,l)}),Dr.addEventListener(e,t,Z?{capture:r,passive:i}:r)}function Hr(e,t,n,r){(r||Dr).removeEventListener(e,t._withTask||t,n)}function Br(e,t){if(!M(e.data.on)||!M(t.data.on)){var n=t.data.on||{},r=e.data.on||{};Dr=t.elm,function(e){if(D(e[Pr])){var t=K?"change":"input";e[t]=[].concat(e[Pr],e[t]||[]),delete e[Pr]}D(e[Fr])&&(e.change=[].concat(e[Fr],e.change||[]),delete e[Fr])}(n),nt(n,r,Rr,Hr,t.context),Dr=void 0}}var Ur={create:Br,update:Br};function Vr(e,t){if(!M(e.data.domProps)||!M(t.data.domProps)){var n,r,i,o,a=t.elm,s=e.data.domProps||{},c=t.data.domProps||{};for(n in D(c.__ob__)&&(c=t.data.domProps=m({},c)),s)M(c[n])&&(a[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n){var l=M(a._value=r)?"":String(r);o=l,(i=a).composing||"OPTION"!==i.tagName&&!function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(i,o)&&!function(e,t){var n=e.value,r=e._vModifiers;if(D(r)){if(r.lazy)return!1;if(r.number)return F(n)!==F(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(i,o)||(a.value=l)}else a[n]=r}}}var zr={create:Vr,update:Vr},Kr=e(function(e){var n={},r=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var t=e.split(r);1<t.length&&(n[t[0].trim()]=t[1].trim())}}),n});function Jr(e){var t=qr(e.style);return e.staticStyle?m(e.staticStyle,t):t}function qr(e){return Array.isArray(e)?b(e):"string"==typeof e?Kr(e):e}var Wr,Gr=/^--/,Zr=/\s*!important$/,Xr=function(e,t,n){if(Gr.test(t))e.style.setProperty(t,n);else if(Zr.test(n))e.style.setProperty(t,n.replace(Zr,""),"important");else{var r=Qr(t);if(Array.isArray(n))for(var i=0,o=n.length;i<o;i++)e.style[r]=n[i];else e.style[r]=n}},Yr=["Webkit","Moz","ms"],Qr=e(function(e){if(Wr=Wr||document.createElement("div").style,"filter"!==(e=g(e))&&e in Wr)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<Yr.length;n++){var r=Yr[n]+t;if(r in Wr)return r}});function ei(e,t){var n=t.data,r=e.data;if(!(M(n.staticStyle)&&M(n.style)&&M(r.staticStyle)&&M(r.style))){var i,o,a=t.elm,s=r.staticStyle,c=r.normalizedStyle||r.style||{},l=s||c,u=qr(t.data.style)||{};t.data.normalizedStyle=D(u.__ob__)?m({},u):u;var f=function(e,t){var n,r={};if(t)for(var i=e;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=Jr(i.data))&&m(r,n);(n=Jr(e.data))&&m(r,n);for(var o=e;o=o.parent;)o.data&&(n=Jr(o.data))&&m(r,n);return r}(t,!0);for(o in l)M(f[o])&&Xr(a,o,"");for(o in f)(i=f[o])!==l[o]&&Xr(a,o,null==i?"":i)}}var ti={create:ei,update:ei};function ni(t,e){if(e&&(e=e.trim()))if(t.classList)-1<e.indexOf(" ")?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function ri(t,e){if(e&&(e=e.trim()))if(t.classList)-1<e.indexOf(" ")?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";0<=n.indexOf(r);)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function ii(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&m(t,oi(e.name||"v")),m(t,e),t}return"string"==typeof e?oi(e):void 0}}var oi=e(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),ai=B&&!J,si="transition",ci="animation",li="transition",ui="transitionend",fi="animation",pi="animationend";ai&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(li="WebkitTransition",ui="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(fi="WebkitAnimation",pi="webkitAnimationEnd"));var di=B?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function vi(e){di(function(){di(e)})}function hi(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),ni(e,t))}function mi(e,t){e._transitionClasses&&f(e._transitionClasses,t),ri(e,t)}function yi(t,e,n){var r=_i(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===si?ui:pi,c=0,l=function(){t.removeEventListener(s,u),n()},u=function(e){e.target===t&&++c>=a&&l()};setTimeout(function(){c<a&&l()},o+1),t.addEventListener(s,u)}var gi=/\b(transform|all)(,|$)/;function _i(e,t){var n,r=window.getComputedStyle(e),i=r[li+"Delay"].split(", "),o=r[li+"Duration"].split(", "),a=bi(i,o),s=r[fi+"Delay"].split(", "),c=r[fi+"Duration"].split(", "),l=bi(s,c),u=0,f=0;return t===si?0<a&&(n=si,u=a,f=o.length):t===ci?0<l&&(n=ci,u=l,f=c.length):f=(n=0<(u=Math.max(a,l))?l<a?si:ci:null)?n===si?o.length:c.length:0,{type:n,timeout:u,propCount:f,hasTransform:n===si&&gi.test(r[li+"Property"])}}function bi(n,e){for(;n.length<e.length;)n=n.concat(n);return Math.max.apply(null,e.map(function(e,t){return $i(e)+$i(n[t])}))}function $i(e){return 1e3*Number(e.slice(0,-1))}function wi(n,e){var r=n.elm;D(r._leaveCb)&&(r._leaveCb.cancelled=!0,r._leaveCb());var t=ii(n.data.transition);if(!M(t)&&!D(r._enterCb)&&1===r.nodeType){for(var i=t.css,o=t.type,a=t.enterClass,s=t.enterToClass,c=t.enterActiveClass,l=t.appearClass,u=t.appearToClass,f=t.appearActiveClass,p=t.beforeEnter,d=t.enter,v=t.afterEnter,h=t.enterCancelled,m=t.beforeAppear,y=t.appear,g=t.afterAppear,_=t.appearCancelled,b=t.duration,$=mt,w=mt.$vnode;w&&w.parent;)$=(w=w.parent).context;var C=!$._isMounted||!n.isRootInsert;if(!C||y||""===y){var x=C&&l?l:a,k=C&&f?f:c,A=C&&u?u:s,O=C&&m||p,S=C&&"function"==typeof y?y:d,T=C&&g||v,E=C&&_||h,j=F(P(b)?b.enter:b),N=!1!==i&&!J,L=ki(S),I=r._enterCb=R(function(){N&&(mi(r,A),mi(r,k)),I.cancelled?(N&&mi(r,x),E&&E(r)):T&&T(r),r._enterCb=null});n.data.show||rt(n,"insert",function(){var e=r.parentNode,t=e&&e._pending&&e._pending[n.key];t&&t.tag===n.tag&&t.elm._leaveCb&&t.elm._leaveCb(),S&&S(r,I)}),O&&O(r),N&&(hi(r,x),hi(r,k),vi(function(){mi(r,x),I.cancelled||(hi(r,A),L||(xi(j)?setTimeout(I,j):yi(r,o,I)))})),n.data.show&&(e&&e(),S&&S(r,I)),N||L||I()}}}function Ci(e,t){var n=e.elm;D(n._enterCb)&&(n._enterCb.cancelled=!0,n._enterCb());var r=ii(e.data.transition);if(M(r)||1!==n.nodeType)return t();if(!D(n._leaveCb)){var i=r.css,o=r.type,a=r.leaveClass,s=r.leaveToClass,c=r.leaveActiveClass,l=r.beforeLeave,u=r.leave,f=r.afterLeave,p=r.leaveCancelled,d=r.delayLeave,v=r.duration,h=!1!==i&&!J,m=ki(u),y=F(P(v)?v.leave:v),g=n._leaveCb=R(function(){n.parentNode&&n.parentNode._pending&&(n.parentNode._pending[e.key]=null),h&&(mi(n,s),mi(n,c)),g.cancelled?(h&&mi(n,a),p&&p(n)):(t(),f&&f(n)),n._leaveCb=null});d?d(_):_()}function _(){g.cancelled||(e.data.show||((n.parentNode._pending||(n.parentNode._pending={}))[e.key]=e),l&&l(n),h&&(hi(n,a),hi(n,c),vi(function(){mi(n,a),g.cancelled||(hi(n,s),m||(xi(y)?setTimeout(g,y):yi(n,o,g)))})),u&&u(n,g),h||m||g())}}function xi(e){return"number"==typeof e&&!isNaN(e)}function ki(e){if(M(e))return!1;var t=e.fns;return D(t)?ki(Array.isArray(t)?t[0]:t):1<(e._length||e.length)}function Ai(e,t){!0!==t.data.show&&wi(t)}var Oi=function(e){var r,t,g={},n=e.modules,_=e.nodeOps;for(r=0;r<Xn.length;++r)for(g[Xn[r]]=[],t=0;t<n.length;++t)D(n[t][Xn[r]])&&g[Xn[r]].push(n[t][Xn[r]]);function o(e){var t=_.parentNode(e);D(t)&&_.removeChild(t,e)}function b(e,t,n,r,i,o,a){if(D(e.elm)&&D(o)&&(e=o[a]=de(e)),e.isRootInsert=!i,!function(e,t,n,r){var i=e.data;if(D(i)){var o=D(e.componentInstance)&&i.keepAlive;if(D(i=i.hook)&&D(i=i.init)&&i(e,!1,n,r),D(e.componentInstance))return d(e,t),S(o)&&function(e,t,n,r){for(var i,o=e;o.componentInstance;)if(o=o.componentInstance._vnode,D(i=o.data)&&D(i=i.transition)){for(i=0;i<g.activate.length;++i)g.activate[i](Zn,o);t.push(o);break}u(n,e.elm,r)}(e,t,n,r),!0}}(e,t,n,r)){var s=e.data,c=e.children,l=e.tag;D(l)?(e.elm=e.ns?_.createElementNS(e.ns,l):_.createElement(l,e),f(e),v(e,c,t),D(s)&&h(e,t)):S(e.isComment)?e.elm=_.createComment(e.text):e.elm=_.createTextNode(e.text),u(n,e.elm,r)}}function d(e,t){D(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,$(e)?(h(e,t),f(e)):(Gn(e),t.push(e))}function u(e,t,n){D(e)&&(D(n)?n.parentNode===e&&_.insertBefore(e,t,n):_.appendChild(e,t))}function v(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)b(t[r],n,e.elm,null,!0,t,r);else T(e.text)&&_.appendChild(e.elm,_.createTextNode(String(e.text)))}function $(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return D(e.tag)}function h(e,t){for(var n=0;n<g.create.length;++n)g.create[n](Zn,e);D(r=e.data.hook)&&(D(r.create)&&r.create(Zn,e),D(r.insert)&&t.push(e))}function f(e){var t;if(D(t=e.fnScopeId))_.setStyleScope(e.elm,t);else for(var n=e;n;)D(t=n.context)&&D(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t),n=n.parent;D(t=mt)&&t!==e.context&&t!==e.fnContext&&D(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t)}function y(e,t,n,r,i,o){for(;r<=i;++r)b(n[r],o,e,t,!1,n,r)}function w(e){var t,n,r=e.data;if(D(r))for(D(t=r.hook)&&D(t=t.destroy)&&t(e),t=0;t<g.destroy.length;++t)g.destroy[t](e);if(D(t=e.children))for(n=0;n<e.children.length;++n)w(e.children[n])}function C(e,t,n,r){for(;n<=r;++n){var i=t[n];D(i)&&(D(i.tag)?(a(i),w(i)):o(i.elm))}}function a(e,t){if(D(t)||D(e.data)){var n,r=g.remove.length+1;for(D(t)?t.listeners+=r:t=function(e,t){function n(){0==--n.listeners&&o(e)}return n.listeners=t,n}(e.elm,r),D(n=e.componentInstance)&&D(n=n._vnode)&&D(n.data)&&a(n,t),n=0;n<g.remove.length;++n)g.remove[n](e,t);D(n=e.data.hook)&&D(n=n.remove)?n(e,t):t()}else o(e.elm)}function x(e,t,n,r){for(var i=n;i<r;i++){var o=t[i];if(D(o)&&Yn(e,o))return i}}function k(e,t,n,r){if(e!==t){var i=t.elm=e.elm;if(S(e.isAsyncPlaceholder))D(t.asyncFactory.resolved)?O(e.elm,t,n):t.isAsyncPlaceholder=!0;else if(S(t.isStatic)&&S(e.isStatic)&&t.key===e.key&&(S(t.isCloned)||S(t.isOnce)))t.componentInstance=e.componentInstance;else{var o,a=t.data;D(a)&&D(o=a.hook)&&D(o=o.prepatch)&&o(e,t);var s=e.children,c=t.children;if(D(a)&&$(t)){for(o=0;o<g.update.length;++o)g.update[o](e,t);D(o=a.hook)&&D(o=o.update)&&o(e,t)}M(t.text)?D(s)&&D(c)?s!==c&&function(e,t,n,r,i){for(var o,a,s,c=0,l=0,u=t.length-1,f=t[0],p=t[u],d=n.length-1,v=n[0],h=n[d],m=!i;c<=u&&l<=d;)M(f)?f=t[++c]:M(p)?p=t[--u]:Yn(f,v)?(k(f,v,r),f=t[++c],v=n[++l]):Yn(p,h)?(k(p,h,r),p=t[--u],h=n[--d]):Yn(f,h)?(k(f,h,r),m&&_.insertBefore(e,f.elm,_.nextSibling(p.elm)),f=t[++c],h=n[--d]):(Yn(p,v)?(k(p,v,r),m&&_.insertBefore(e,p.elm,f.elm),p=t[--u]):(M(o)&&(o=Qn(t,c,u)),M(a=D(v.key)?o[v.key]:x(v,t,c,u))?b(v,r,e,f.elm,!1,n,l):Yn(s=t[a],v)?(k(s,v,r),t[a]=void 0,m&&_.insertBefore(e,s.elm,f.elm)):b(v,r,e,f.elm,!1,n,l)),v=n[++l]);u<c?y(e,M(n[d+1])?null:n[d+1].elm,n,l,d,r):d<l&&C(0,t,c,u)}(i,s,c,n,r):D(c)?(D(e.text)&&_.setTextContent(i,""),y(i,null,c,0,c.length-1,n)):D(s)?C(0,s,0,s.length-1):D(e.text)&&_.setTextContent(i,""):e.text!==t.text&&_.setTextContent(i,t.text),D(a)&&D(o=a.hook)&&D(o=o.postpatch)&&o(e,t)}}}function A(e,t,n){if(S(n)&&D(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var m=s("attrs,class,staticClass,staticStyle,key");function O(e,t,n,r){var i,o=t.tag,a=t.data,s=t.children;if(r=r||a&&a.pre,t.elm=e,S(t.isComment)&&D(t.asyncFactory))return t.isAsyncPlaceholder=!0;if(D(a)&&(D(i=a.hook)&&D(i=i.init)&&i(t,!0),D(i=t.componentInstance)))return d(t,n),!0;if(D(o)){if(D(s))if(e.hasChildNodes())if(D(i=a)&&D(i=i.domProps)&&D(i=i.innerHTML)){if(i!==e.innerHTML)return!1}else{for(var c=!0,l=e.firstChild,u=0;u<s.length;u++){if(!l||!O(l,s[u],n,r)){c=!1;break}l=l.nextSibling}if(!c||l)return!1}else v(t,s,n);if(D(a)){var f=!1;for(var p in a)if(!m(p)){f=!0,h(t,n);break}!f&&a.class&&Ye(a.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,r,i,o){if(!M(t)){var a,s=!1,c=[];if(M(e))s=!0,b(t,c,i,o);else{var l=D(e.nodeType);if(!l&&Yn(e,t))k(e,t,c,r);else{if(l){if(1===e.nodeType&&e.hasAttribute(E)&&(e.removeAttribute(E),n=!0),S(n)&&O(e,t,c))return A(t,c,!0),e;a=e,e=new le(_.tagName(a).toLowerCase(),{},[],void 0,a)}var u=e.elm,f=_.parentNode(u);if(b(t,c,u._leaveCb?null:f,_.nextSibling(u)),D(t.parent))for(var p=t.parent,d=$(t);p;){for(var v=0;v<g.destroy.length;++v)g.destroy[v](p);if(p.elm=t.elm,d){for(var h=0;h<g.create.length;++h)g.create[h](Zn,p);var m=p.data.hook.insert;if(m.merged)for(var y=1;y<m.fns.length;y++)m.fns[y]()}else Gn(p);p=p.parent}D(f)?C(0,[e],0,0):D(e.tag)&&w(e)}}return A(t,c,s),t.elm}D(e)&&w(e)}}({nodeOps:qn,modules:[lr,yr,Ur,zr,ti,B?{create:Ai,activate:Ai,remove:function(e,t){!0!==e.data.show?Ci(e,t):t()}}:{}].concat(or)});J&&document.addEventListener("selectionchange",function(){var e=document.activeElement;e&&e.vmodel&&Mi(e,"input")});var Si={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?rt(n,"postpatch",function(){Si.componentUpdated(e,t,n)}):Ti(e,t,n.context),e._vOptions=[].map.call(e.options,Ni)):("textarea"===n.tag||Kn(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",Li),e.addEventListener("compositionend",Ii),e.addEventListener("change",Ii),J&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Ti(e,t,n.context);var r=e._vOptions,i=e._vOptions=[].map.call(e.options,Ni);if(i.some(function(e,t){return!C(e,r[t])}))(e.multiple?t.value.some(function(e){return ji(e,i)}):t.value!==t.oldValue&&ji(t.value,i))&&Mi(e,"change")}}};function Ti(e,t,n){Ei(e,t,n),(K||q)&&setTimeout(function(){Ei(e,t,n)},0)}function Ei(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=e.options.length;s<c;s++)if(a=e.options[s],i)o=-1<x(r,Ni(a)),a.selected!==o&&(a.selected=o);else if(C(Ni(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function ji(t,e){return e.every(function(e){return!C(e,t)})}function Ni(e){return"_value"in e?e._value:e.value}function Li(e){e.target.composing=!0}function Ii(e){e.target.composing&&(e.target.composing=!1,Mi(e.target,"input"))}function Mi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Di(e){return!e.componentInstance||e.data&&e.data.transition?e:Di(e.componentInstance._vnode)}var Pi={model:Si,show:{bind:function(e,t,n){var r=t.value,i=(n=Di(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,wi(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Di(n)).data&&n.data.transition?(n.data.show=!0,r?wi(n,function(){e.style.display=e.__vOriginalDisplay}):Ci(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},Fi={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ri(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Ri(lt(t.children)):e}function Hi(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[g(o)]=i[o];return t}function Bi(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Ui={name:"transition",props:Fi,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(function(e){return e.tag||ct(e)})).length){var r=this.mode,i=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return i;var o=Ri(i);if(!o)return i;if(this._leaving)return Bi(e,i);var a="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?a+"comment":a+o.tag:T(o.key)?0===String(o.key).indexOf(a)?o.key:a+o.key:o.key;var s,c,l=(o.data||(o.data={})).transition=Hi(this),u=this._vnode,f=Ri(u);if(o.data.directives&&o.data.directives.some(function(e){return"show"===e.name})&&(o.data.show=!0),f&&f.data&&(s=o,(c=f).key!==s.key||c.tag!==s.tag)&&!ct(f)&&(!f.componentInstance||!f.componentInstance._vnode.isComment)){var p=f.data.transition=m({},l);if("out-in"===r)return this._leaving=!0,rt(p,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),Bi(e,i);if("in-out"===r){if(ct(o))return u;var d,v=function(){d()};rt(l,"afterEnter",v),rt(l,"enterCancelled",v),rt(p,"delayLeave",function(e){d=e})}}return i}}},Vi=m({tag:String,moveClass:String},Fi);function zi(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function Ki(e){e.data.newPos=e.elm.getBoundingClientRect()}function Ji(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete Vi.mode;var qi={Transition:Ui,TransitionGroup:{props:Vi,render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=Hi(this),s=0;s<i.length;s++){var c=i[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(o.push(c),((n[c.key]=c).data||(c.data={})).transition=a)}if(r){for(var l=[],u=[],f=0;f<r.length;f++){var p=r[f];p.data.transition=a,p.data.pos=p.elm.getBoundingClientRect(),n[p.key]?l.push(p):u.push(p)}this.kept=e(t,null,l),this.removed=u}return e(t,null,o)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var e=this.prevChildren,r=this.moveClass||(this.name||"v")+"-move";e.length&&this.hasMove(e[0].elm,r)&&(e.forEach(zi),e.forEach(Ki),e.forEach(Ji),this._reflow=document.body.offsetHeight,e.forEach(function(e){if(e.data.moved){var n=e.elm,t=n.style;hi(n,r),t.transform=t.WebkitTransform=t.transitionDuration="",n.addEventListener(ui,n._moveCb=function e(t){t&&!/transform$/.test(t.propertyName)||(n.removeEventListener(ui,e),n._moveCb=null,mi(n,r))})}}))},methods:{hasMove:function(e,t){if(!ai)return!1;if(this._hasMove)return this._hasMove;var n=e.cloneNode();e._transitionClasses&&e._transitionClasses.forEach(function(e){ri(n,e)}),ni(n,t),n.style.display="none",this.$el.appendChild(n);var r=_i(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}}};hn.config.mustUseProp=Sn,hn.config.isReservedTag=Un,hn.config.isReservedAttr=An,hn.config.getTagNamespace=Vn,hn.config.isUnknownElement=function(e){if(!B)return!0;if(Un(e))return!1;if(e=e.toLowerCase(),null!=zn[e])return zn[e];var t=document.createElement(e);return-1<e.indexOf("-")?zn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:zn[e]=/HTMLUnknownElement/.test(t.toString())},m(hn.options.directives,Pi),m(hn.options.components,qi),hn.prototype.__patch__=B?Oi:$,hn.prototype.$mount=function(e,t){return e=e&&B?Jn(e):void 0,r=e,i=t,(n=this).$el=r,n.$options.render||(n.$options.render=fe),_t(n,"beforeMount"),new St(n,function(){n._update(n._render(),i)},$,null,!0),i=!1,null==n.$vnode&&(n._isMounted=!0,_t(n,"mounted")),n;var n,r,i},B&&setTimeout(function(){j.devtools&&Q&&Q.emit("init",hn)},0);var Wi=/\{\{((?:.|\n)+?)\}\}/g,Gi=/[-.*+?^${}()|[\]\/\\]/g,Zi=e(function(e){var t=e[0].replace(Gi,"\\$&"),n=e[1].replace(Gi,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var Xi={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Sr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Or(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var Yi,Qi={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Sr(e,"style");n&&(e.staticStyle=JSON.stringify(Kr(n)));var r=Or(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},eo=function(e){return(Yi=Yi||document.createElement("div")).innerHTML=e,Yi.textContent},to=s("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),no=s("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),ro=s("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),io=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,oo="[a-zA-Z_][\\w\\-\\.]*",ao="((?:"+oo+"\\:)?"+oo+")",so=new RegExp("^<"+ao),co=/^\s*(\/?)>/,lo=new RegExp("^<\\/"+ao+"[^>]*>"),uo=/^<!DOCTYPE [^>]+>/i,fo=/^<!\--/,po=/^<!\[/,vo=!1;"x".replace(/x(.)?/g,function(e,t){vo=""===t});var ho=s("script,style,textarea",!0),mo={},yo={"&lt;":"<","&gt;":">","&quot;":'"',"&amp;":"&","&#10;":"\n","&#9;":"\t"},go=/&(?:lt|gt|quot|amp);/g,_o=/&(?:lt|gt|quot|amp|#10|#9);/g,bo=s("pre,textarea",!0),$o=function(e,t){return e&&bo(e)&&"\n"===t[0]};var wo,Co,xo,ko,Ao,Oo,So,To,Eo=/^@|^v-on:/,jo=/^v-|^@|^:/,No=/([^]*?)\s+(?:in|of)\s+([^]*)/,Lo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Io=/^\(|\)$/g,Mo=/:(.*)$/,Do=/^:|^v-bind:/,Po=/\.[^.]+/g,Fo=e(eo);function Ro(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:function(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n].name]=e[n].value;return t}(t),parent:n,children:[]}}function Ho(e,p){wo=p.warn||$r,Oo=p.isPreTag||O,So=p.mustUseProp||O,To=p.getTagNamespace||O,xo=wr(p.modules,"transformNode"),ko=wr(p.modules,"preTransformNode"),Ao=wr(p.modules,"postTransformNode"),Co=p.delimiters;var d,v,h=[],i=!1!==p.preserveWhitespace,m=!1,y=!1;function g(e){e.pre&&(m=!1),Oo(e.tag)&&(y=!1);for(var t=0;t<Ao.length;t++)Ao[t](e,p)}return function(i,d){for(var e,v,h=[],m=d.expectHTML,y=d.isUnaryTag||O,g=d.canBeLeftOpenTag||O,a=0;i;){if(e=i,v&&ho(v)){var r=0,o=v.toLowerCase(),t=mo[o]||(mo[o]=new RegExp("([\\s\\S]*?)(</"+o+"[^>]*>)","i")),n=i.replace(t,function(e,t,n){return r=n.length,ho(o)||"noscript"===o||(t=t.replace(/<!\--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),$o(o,t)&&(t=t.slice(1)),d.chars&&d.chars(t),""});a+=i.length-n.length,i=n,A(o,a-r,a)}else{var s=i.indexOf("<");if(0===s){if(fo.test(i)){var c=i.indexOf("--\x3e");if(0<=c){d.shouldKeepComment&&d.comment(i.substring(4,c)),C(c+3);continue}}if(po.test(i)){var l=i.indexOf("]>");if(0<=l){C(l+2);continue}}var u=i.match(uo);if(u){C(u[0].length);continue}var f=i.match(lo);if(f){var p=a;C(f[0].length),A(f[1],p,a);continue}var _=x();if(_){k(_),$o(v,i)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(0<=s){for($=i.slice(s);!(lo.test($)||so.test($)||fo.test($)||po.test($)||(w=$.indexOf("<",1))<0);)s+=w,$=i.slice(s);b=i.substring(0,s),C(s)}s<0&&(b=i,i=""),d.chars&&b&&d.chars(b)}if(i===e){d.chars&&d.chars(i);break}}function C(e){a+=e,i=i.substring(e)}function x(){var e=i.match(so);if(e){var t,n,r={tagName:e[1],attrs:[],start:a};for(C(e[0].length);!(t=i.match(co))&&(n=i.match(io));)C(n[0].length),r.attrs.push(n);if(t)return r.unarySlash=t[1],C(t[0].length),r.end=a,r}}function k(e){var t=e.tagName,n=e.unarySlash;m&&("p"===v&&ro(t)&&A(v),g(t)&&v===t&&A(t));for(var r,i,o,a=y(t)||!!n,s=e.attrs.length,c=new Array(s),l=0;l<s;l++){var u=e.attrs[l];vo&&-1===u[0].indexOf('""')&&(""===u[3]&&delete u[3],""===u[4]&&delete u[4],""===u[5]&&delete u[5]);var f=u[3]||u[4]||u[5]||"",p="a"===t&&"href"===u[1]?d.shouldDecodeNewlinesForHref:d.shouldDecodeNewlines;c[l]={name:u[1],value:(r=f,i=p,o=i?_o:go,r.replace(o,function(e){return yo[e]}))}}a||(h.push({tag:t,lowerCasedTag:t.toLowerCase(),attrs:c}),v=t),d.start&&d.start(t,c,a,e.start,e.end)}function A(e,t,n){var r,i;if(null==t&&(t=a),null==n&&(n=a),e&&(i=e.toLowerCase()),e)for(r=h.length-1;0<=r&&h[r].lowerCasedTag!==i;r--);else r=0;if(0<=r){for(var o=h.length-1;r<=o;o--)d.end&&d.end(h[o].tag,t,n);h.length=r,v=r&&h[r-1].tag}else"br"===i?d.start&&d.start(e,[],!0,t,n):"p"===i&&(d.start&&d.start(e,[],!1,t,n),d.end&&d.end(e,t,n))}A()}(e,{warn:wo,expectHTML:p.expectHTML,isUnaryTag:p.isUnaryTag,canBeLeftOpenTag:p.canBeLeftOpenTag,shouldDecodeNewlines:p.shouldDecodeNewlines,shouldDecodeNewlinesForHref:p.shouldDecodeNewlinesForHref,shouldKeepComment:p.comments,start:function(e,t,n){var r=v&&v.ns||To(e);K&&"svg"===r&&(t=function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];Ko.test(r.name)||(r.name=r.name.replace(Jo,""),t.push(r))}return t}(t));var i,o,a,s,c,l=Ro(e,t,v);r&&(l.ns=r),"style"!==(i=l).tag&&("script"!==i.tag||i.attrsMap.type&&"text/javascript"!==i.attrsMap.type)||Y()||(l.forbidden=!0);for(var u=0;u<ko.length;u++)l=ko[u](l,p)||l;if(m||(null!=Sr(o=l,"v-pre")&&(o.pre=!0),l.pre&&(m=!0)),Oo(l.tag)&&(y=!0),m?function(e){var t=e.attrsList.length;if(t)for(var n=e.attrs=new Array(t),r=0;r<t;r++)n[r]={name:e.attrsList[r].name,value:JSON.stringify(e.attrsList[r].value)};else e.pre||(e.plain=!0)}(l):l.processed||(Uo(l),function(e){var t=Sr(e,"v-if");if(t)e.if=t,Vo(e,{exp:t,block:e});else{null!=Sr(e,"v-else")&&(e.else=!0);var n=Sr(e,"v-else-if");n&&(e.elseif=n)}}(l),null!=Sr(a=l,"v-once")&&(a.once=!0),Bo(l,p)),d?h.length||d.if&&(l.elseif||l.else)&&Vo(d,{exp:l.elseif,block:l}):d=l,v&&!l.forbidden)if(l.elseif||l.else)s=l,(c=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(v.children))&&c.if&&Vo(c,{exp:s.elseif,block:s});else if(l.slotScope){v.plain=!1;var f=l.slotTarget||'"default"';(v.scopedSlots||(v.scopedSlots={}))[f]=l}else v.children.push(l),l.parent=v;n?g(l):(v=l,h.push(l))},end:function(){var e=h[h.length-1],t=e.children[e.children.length-1];t&&3===t.type&&" "===t.text&&!y&&e.children.pop(),h.length-=1,v=h[h.length-1],g(e)},chars:function(e){if(v&&(!K||"textarea"!==v.tag||v.attrsMap.placeholder!==e)){var t,n,r=v.children;if(e=y||e.trim()?"script"===(t=v).tag||"style"===t.tag?e:Fo(e):i&&r.length?" ":"")!m&&" "!==e&&(n=function(e,t){var n=t?Zi(t):Wi;if(n.test(e)){for(var r,i,o,a=[],s=[],c=n.lastIndex=0;r=n.exec(e);){c<(i=r.index)&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var l=_r(r[1].trim());a.push("_s("+l+")"),s.push({"@binding":l}),c=i+r[0].length}return c<e.length&&(s.push(o=e.slice(c)),a.push(JSON.stringify(o))),{expression:a.join("+"),tokens:s}}}(e,Co))?r.push({type:2,expression:n.expression,tokens:n.tokens,text:e}):" "===e&&r.length&&" "===r[r.length-1].text||r.push({type:3,text:e})}},comment:function(e){v.children.push({type:3,text:e,isComment:!0})}}),d}function Bo(e,t){var n,r,i,o;(r=Or(n=e,"key"))&&(n.key=r),e.plain=!e.key&&!e.attrsList.length,(o=Or(i=e,"ref"))&&(i.ref=o,i.refInFor=function(e){for(var t=e;t;){if(void 0!==t.for)return!0;t=t.parent}return!1}(i)),function(e){if("slot"===e.tag)e.slotName=Or(e,"name");else{var t;"template"===e.tag?(t=Sr(e,"scope"),e.slotScope=t||Sr(e,"slot-scope")):(t=Sr(e,"slot-scope"))&&(e.slotScope=t);var n=Or(e,"slot");n&&(e.slotTarget='""'===n?'"default"':n,"template"===e.tag||e.slotScope||xr(e,"slot",n))}}(e),function(e){var t;(t=Or(e,"is"))&&(e.component=t);null!=Sr(e,"inline-template")&&(e.inlineTemplate=!0)}(e);for(var a=0;a<xo.length;a++)e=xo[a](e,t)||e;!function(e){var t,n,r,i,o,a,s,c=e.attrsList;for(t=0,n=c.length;t<n;t++)if(r=i=c[t].name,o=c[t].value,jo.test(r))if(e.hasBindings=!0,(a=zo(r))&&(r=r.replace(Po,"")),Do.test(r))r=r.replace(Do,""),o=_r(o),s=!1,a&&(a.prop&&(s=!0,"innerHtml"===(r=g(r))&&(r="innerHTML")),a.camel&&(r=g(r)),a.sync&&Ar(e,"update:"+g(r),Er(o,"$event"))),s||!e.component&&So(e.tag,e.attrsMap.type,r)?Cr(e,r,o):xr(e,r,o);else if(Eo.test(r))r=r.replace(Eo,""),Ar(e,r,o,a,!1);else{var l=(r=r.replace(jo,"")).match(Mo),u=l&&l[1];u&&(r=r.slice(0,-(u.length+1))),p=r,d=i,v=o,h=u,m=a,((f=e).directives||(f.directives=[])).push({name:p,rawName:d,value:v,arg:h,modifiers:m}),f.plain=!1}else xr(e,r,JSON.stringify(o)),!e.component&&"muted"===r&&So(e.tag,e.attrsMap.type,r)&&Cr(e,r,"true");var f,p,d,v,h,m}(e)}function Uo(e){var t;if(t=Sr(e,"v-for")){var n=function(e){var t=e.match(No);if(!t)return;var n={};n.for=t[2].trim();var r=t[1].trim().replace(Io,""),i=r.match(Lo);i?(n.alias=r.replace(Lo,""),n.iterator1=i[1].trim(),i[2]&&(n.iterator2=i[2].trim())):n.alias=r;return n}(t);n&&m(e,n)}}function Vo(e,t){e.ifConditions||(e.ifConditions=[]),e.ifConditions.push(t)}function zo(e){var t=e.match(Po);if(t){var n={};return t.forEach(function(e){n[e.slice(1)]=!0}),n}}var Ko=/^xmlns:NS\d+/,Jo=/^NS\d+:/;function qo(e){return Ro(e.tag,e.attrsList.slice(),e.parent)}var Wo=[Xi,Qi,{preTransformNode:function(e,t){if("input"===e.tag){var n,r=e.attrsMap;if(!r["v-model"])return;if((r[":type"]||r["v-bind:type"])&&(n=Or(e,"type")),r.type||n||!r["v-bind"]||(n="("+r["v-bind"]+").type"),n){var i=Sr(e,"v-if",!0),o=i?"&&("+i+")":"",a=null!=Sr(e,"v-else",!0),s=Sr(e,"v-else-if",!0),c=qo(e);Uo(c),kr(c,"type","checkbox"),Bo(c,t),c.processed=!0,c.if="("+n+")==='checkbox'"+o,Vo(c,{exp:c.if,block:c});var l=qo(e);Sr(l,"v-for",!0),kr(l,"type","radio"),Bo(l,t),Vo(c,{exp:"("+n+")==='radio'"+o,block:l});var u=qo(e);return Sr(u,"v-for",!0),kr(u,":type",n),Bo(u,t),Vo(c,{exp:i,block:u}),a?c.else=!0:s&&(c.elseif=s),c}}}}];var Go,Zo,Xo,Yo={expectHTML:!0,modules:Wo,directives:{model:function(e,t,n){var r,i,o,a,s,c,l,u,f,p,d,v,h,m,y,g,_=t.value,b=t.modifiers,$=e.tag,w=e.attrsMap.type;if(e.component)return Tr(e,_,b),!1;if("select"===$)h=e,m=_,g=(g='var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+((y=b)&&y.number?"_n(val)":"val")+"});")+" "+Er(m,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),Ar(h,"change",g,null,!0);else if("input"===$&&"checkbox"===w)c=e,l=_,f=(u=b)&&u.number,p=Or(c,"value")||"null",d=Or(c,"true-value")||"true",v=Or(c,"false-value")||"false",Cr(c,"checked","Array.isArray("+l+")?_i("+l+","+p+")>-1"+("true"===d?":("+l+")":":_q("+l+","+d+")")),Ar(c,"change","var $$a="+l+",$$el=$event.target,$$c=$$el.checked?("+d+"):("+v+");if(Array.isArray($$a)){var $$v="+(f?"_n("+p+")":p)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Er(l,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Er(l,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Er(l,"$$c")+"}",null,!0);else if("input"===$&&"radio"===w)r=e,i=_,a=(o=b)&&o.number,s=Or(r,"value")||"null",Cr(r,"checked","_q("+i+","+(s=a?"_n("+s+")":s)+")"),Ar(r,"change",Er(i,s),null,!0);else if("input"===$||"textarea"===$)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,l=o?"change":"range"===r?Pr:"input",u="$event.target.value";s&&(u="$event.target.value.trim()"),a&&(u="_n("+u+")");var f=Er(t,u);c&&(f="if($event.target.composing)return;"+f),Cr(e,"value","("+t+")"),Ar(e,l,f,null,!0),(s||a)&&Ar(e,"blur","$forceUpdate()")}(e,_,b);else if(!j.isReservedTag($))return Tr(e,_,b),!1;return!0},text:function(e,t){t.value&&Cr(e,"textContent","_s("+t.value+")")},html:function(e,t){t.value&&Cr(e,"innerHTML","_s("+t.value+")")}},isPreTag:function(e){return"pre"===e},isUnaryTag:to,mustUseProp:Sn,canBeLeftOpenTag:no,isReservedTag:Un,getTagNamespace:Vn,staticKeys:(Go=Wo,Go.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(","))},Qo=e(function(e){return s("type,tag,attrsList,attrsMap,plain,parent,children,attrs"+(e?","+e:""))});function ea(e,t){e&&(Zo=Qo(t.staticKeys||""),Xo=t.isReservedTag||O,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||c(e.tag)||!Xo(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(Zo)))}(t);if(1===t.type){if(!Xo(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n<r;n++){var i=t.children[n];e(i),i.static||(t.static=!1)}if(t.ifConditions)for(var o=1,a=t.ifConditions.length;o<a;o++){var s=t.ifConditions[o].block;e(s),s.static||(t.static=!1)}}}(e),function e(t,n){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=n),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var r=0,i=t.children.length;r<i;r++)e(t.children[r],n||!!t.for);if(t.ifConditions)for(var o=1,a=t.ifConditions.length;o<a;o++)e(t.ifConditions[o].block,n)}}(e,!1))}var ta=/^([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/,na=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,ra={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},ia={esc:"Escape",tab:"Tab",enter:"Enter",space:" ",up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete"]},oa=function(e){return"if("+e+")return null;"},aa={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:oa("$event.target !== $event.currentTarget"),ctrl:oa("!$event.ctrlKey"),shift:oa("!$event.shiftKey"),alt:oa("!$event.altKey"),meta:oa("!$event.metaKey"),left:oa("'button' in $event && $event.button !== 0"),middle:oa("'button' in $event && $event.button !== 1"),right:oa("'button' in $event && $event.button !== 2")};function sa(e,t,n){var r=t?"nativeOn:{":"on:{";for(var i in e)r+='"'+i+'":'+ca(i,e[i])+",";return r.slice(0,-1)+"}"}function ca(t,e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return ca(t,e)}).join(",")+"]";var n=na.test(e.value),r=ta.test(e.value);if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(aa[s])o+=aa[s],ra[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=oa(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+="if(!('button' in $event)&&"+a.map(la).join("&&")+")return null;"),o&&(i+=o),"function($event){"+i+(n?"return "+e.value+"($event)":r?"return ("+e.value+")($event)":e.value)+"}"}return n||r?e.value:"function($event){"+e.value+"}"}function la(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=ra[e],r=ia[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var ua={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(t,n){t.wrapData=function(e){return"_b("+e+",'"+t.tag+"',"+n.value+","+(n.modifiers&&n.modifiers.prop?"true":"false")+(n.modifiers&&n.modifiers.sync?",true":"")+")"}},cloak:$},fa=function(e){this.options=e,this.warn=e.warn||$r,this.transforms=wr(e.modules,"transformCode"),this.dataGenFns=wr(e.modules,"genData"),this.directives=m(m({},ua),e.directives);var t=e.isReservedTag||O;this.maybeComponent=function(e){return!t(e.tag)},this.onceId=0,this.staticRenderFns=[]};function pa(e,t){var n=new fa(t);return{render:"with(this){return "+(e?da(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function da(e,t){if(e.staticRoot&&!e.staticProcessed)return va(e,t);if(e.once&&!e.onceProcessed)return ha(e,t);if(e.for&&!e.forProcessed)return f=t,v=(u=e).for,h=u.alias,m=u.iterator1?","+u.iterator1:"",y=u.iterator2?","+u.iterator2:"",u.forProcessed=!0,(d||"_l")+"(("+v+"),function("+h+m+y+"){return "+(p||da)(u,f)+"})";if(e.if&&!e.ifProcessed)return ma(e,t);if("template"!==e.tag||e.slotTarget){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=_a(e,t),i="_t("+n+(r?","+r:""),o=e.attrs&&"{"+e.attrs.map(function(e){return g(e.name)+":"+e.value}).join(",")+"}",a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)a=e.component,c=t,l=(s=e).inlineTemplate?null:_a(s,c,!0),n="_c("+a+","+ya(s,c)+(l?","+l:"")+")";else{var r=e.plain?void 0:ya(e,t),i=e.inlineTemplate?null:_a(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o<t.transforms.length;o++)n=t.transforms[o](e,n);return n}return _a(e,t)||"void 0";var a,s,c,l,u,f,p,d,v,h,m,y}function va(e,t){return e.staticProcessed=!0,t.staticRenderFns.push("with(this){return "+da(e,t)+"}"),"_m("+(t.staticRenderFns.length-1)+(e.staticInFor?",true":"")+")"}function ha(e,t){if(e.onceProcessed=!0,e.if&&!e.ifProcessed)return ma(e,t);if(e.staticInFor){for(var n="",r=e.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?"_o("+da(e,t)+","+t.onceId+++","+n+")":da(e,t)}return va(e,t)}function ma(e,t,n,r){return e.ifProcessed=!0,function e(t,n,r,i){if(!t.length)return i||"_e()";var o=t.shift();return o.exp?"("+o.exp+")?"+a(o.block)+":"+e(t,n,r,i):""+a(o.block);function a(e){return r?r(e,n):e.once?ha(e,n):da(e,n)}}(e.ifConditions.slice(),t,n,r)}function ya(e,t){var n,r,i="{",o=function(e,t){var n=e.directives;if(!n)return;var r,i,o,a,s="directives:[",c=!1;for(r=0,i=n.length;r<i;r++){o=n[r],a=!0;var l=t.directives[o.name];l&&(a=!!l(e,o,t.warn)),a&&(c=!0,s+='{name:"'+o.name+'",rawName:"'+o.rawName+'"'+(o.value?",value:("+o.value+"),expression:"+JSON.stringify(o.value):"")+(o.arg?',arg:"'+o.arg+'"':"")+(o.modifiers?",modifiers:"+JSON.stringify(o.modifiers):"")+"},")}if(c)return s.slice(0,-1)+"]"}(e,t);o&&(i+=o+","),e.key&&(i+="key:"+e.key+","),e.ref&&(i+="ref:"+e.ref+","),e.refInFor&&(i+="refInFor:true,"),e.pre&&(i+="pre:true,"),e.component&&(i+='tag:"'+e.tag+'",');for(var a=0;a<t.dataGenFns.length;a++)i+=t.dataGenFns[a](e);if(e.attrs&&(i+="attrs:{"+wa(e.attrs)+"},"),e.props&&(i+="domProps:{"+wa(e.props)+"},"),e.events&&(i+=sa(e.events,!1,t.warn)+","),e.nativeEvents&&(i+=sa(e.nativeEvents,!0,t.warn)+","),e.slotTarget&&!e.slotScope&&(i+="slot:"+e.slotTarget+","),e.scopedSlots&&(i+=(n=e.scopedSlots,r=t,"scopedSlots:_u(["+Object.keys(n).map(function(e){return ga(e,n[e],r)}).join(",")+"]),")),e.model&&(i+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var s=function(e,t){var n=e.children[0];if(1===n.type){var r=pa(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);s&&(i+=s+",")}return i=i.replace(/,$/,"")+"}",e.wrapData&&(i=e.wrapData(i)),e.wrapListeners&&(i=e.wrapListeners(i)),i}function ga(e,t,n){return t.for&&!t.forProcessed?(r=e,o=n,a=(i=t).for,s=i.alias,c=i.iterator1?","+i.iterator1:"",l=i.iterator2?","+i.iterator2:"",i.forProcessed=!0,"_l(("+a+"),function("+s+c+l+"){return "+ga(r,i,o)+"})"):"{key:"+e+",fn:"+("function("+String(t.slotScope)+"){return "+("template"===t.tag?t.if?t.if+"?"+(_a(t,n)||"undefined")+":undefined":_a(t,n)||"undefined":da(t,n))+"}")+"}";var r,i,o,a,s,c,l}function _a(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag)return(r||da)(a,t);var s=n?function(e,t){for(var n=0,r=0;r<e.length;r++){var i=e[r];if(1===i.type){if(ba(i)||i.ifConditions&&i.ifConditions.some(function(e){return ba(e.block)})){n=2;break}(t(i)||i.ifConditions&&i.ifConditions.some(function(e){return t(e.block)}))&&(n=1)}}return n}(o,t.maybeComponent):0,c=i||$a;return"["+o.map(function(e){return c(e,t)}).join(",")+"]"+(s?","+s:"")}}function ba(e){return void 0!==e.for||"template"===e.tag||"slot"===e.tag}function $a(e,t){return 1===e.type?da(e,t):3===e.type&&e.isComment?(r=e,"_e("+JSON.stringify(r.text)+")"):"_v("+(2===(n=e).type?n.expression:Ca(JSON.stringify(n.text)))+")";var n,r}function wa(e){for(var t="",n=0;n<e.length;n++){var r=e[n];t+='"'+r.name+'":'+Ca(r.value)+","}return t.slice(0,-1)}function Ca(e){return e.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),new RegExp("\\b"+"delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b")+"\\s*\\([^\\)]*\\)");function xa(t,n){try{return new Function(t)}catch(e){return n.push({err:e,code:t}),$}}var ka,Aa,Oa=(ka=function(e,t){var n=Ho(e.trim(),t);!1!==t.optimize&&ea(n,t);var r=pa(n,t);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}},function(s){function e(e,t){var n=Object.create(s),r=[],i=[];if(n.warn=function(e,t){(t?i:r).push(e)},t)for(var o in t.modules&&(n.modules=(s.modules||[]).concat(t.modules)),t.directives&&(n.directives=m(Object.create(s.directives||null),t.directives)),t)"modules"!==o&&"directives"!==o&&(n[o]=t[o]);var a=ka(e,n);return a.errors=r,a.tips=i,a}return{compile:e,compileToFunctions:(c=e,l=Object.create(null),function(e,t,n){(t=m({},t)).warn,delete t.warn;var r=t.delimiters?String(t.delimiters)+e:e;if(l[r])return l[r];var i=c(e,t),o={},a=[];return o.render=xa(i.render,a),o.staticRenderFns=i.staticRenderFns.map(function(e){return xa(e,a)}),l[r]=o})};var c,l})(Yo).compileToFunctions;function Sa(e){return(Aa=Aa||document.createElement("div")).innerHTML=e?'<a href="\n"/>':'<div a="\n"/>',0<Aa.innerHTML.indexOf("&#10;")}var Ta=!!B&&Sa(!1),Ea=!!B&&Sa(!0),ja=e(function(e){var t=Jn(e);return t&&t.innerHTML}),Na=hn.prototype.$mount;return hn.prototype.$mount=function(e,t){if((e=e&&Jn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ja(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){{if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}}(e));if(r){var i=Oa(r,{shouldDecodeNewlines:Ta,shouldDecodeNewlinesForHref:Ea,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return Na.call(this,e,t)},hn.compile=Oa,hn});
Index: ews/js/vue3.js
===================================================================
--- /views/js/vue3.js	(revision 8528)
+++ 	(revision )
@@ -1,13655 +1,0 @@
-var Vue = (function (exports) {
-  'use strict';
-
-  /**
-   * Make a map and return a function for checking if a key
-   * is in that map.
-   * IMPORTANT: all calls of this function must be prefixed with
-   * \/\*#\_\_PURE\_\_\*\/
-   * So that rollup can tree-shake them if necessary.
-   */
-  function makeMap(str, expectsLowerCase) {
-      const map = Object.create(null);
-      const list = str.split(',');
-      for (let i = 0; i < list.length; i++) {
-          map[list[i]] = true;
-      }
-      return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];
-  }
-
-  /**
-   * dev only flag -> name mapping
-   */
-  const PatchFlagNames = {
-      [1 /* TEXT */]: `TEXT`,
-      [2 /* CLASS */]: `CLASS`,
-      [4 /* STYLE */]: `STYLE`,
-      [8 /* PROPS */]: `PROPS`,
-      [16 /* FULL_PROPS */]: `FULL_PROPS`,
-      [32 /* HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,
-      [64 /* STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,
-      [128 /* KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,
-      [256 /* UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,
-      [512 /* NEED_PATCH */]: `NEED_PATCH`,
-      [1024 /* DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,
-      [2048 /* DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,
-      [-1 /* HOISTED */]: `HOISTED`,
-      [-2 /* BAIL */]: `BAIL`
-  };
-
-  /**
-   * Dev only
-   */
-  const slotFlagsText = {
-      [1 /* STABLE */]: 'STABLE',
-      [2 /* DYNAMIC */]: 'DYNAMIC',
-      [3 /* FORWARDED */]: 'FORWARDED'
-  };
-
-  const GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +
-      'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +
-      'Object,Boolean,String,RegExp,Map,Set,JSON,Intl';
-  const isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);
-
-  const range = 2;
-  function generateCodeFrame(source, start = 0, end = source.length) {
-      const lines = source.split(/\r?\n/);
-      let count = 0;
-      const res = [];
-      for (let i = 0; i < lines.length; i++) {
-          count += lines[i].length + 1;
-          if (count >= start) {
-              for (let j = i - range; j <= i + range || end > count; j++) {
-                  if (j < 0 || j >= lines.length)
-                      continue;
-                  const line = j + 1;
-                  res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`);
-                  const lineLength = lines[j].length;
-                  if (j === i) {
-                      // push underline
-                      const pad = start - (count - lineLength) + 1;
-                      const length = Math.max(1, end > count ? lineLength - pad : end - start);
-                      res.push(`   |  ` + ' '.repeat(pad) + '^'.repeat(length));
-                  }
-                  else if (j > i) {
-                      if (end > count) {
-                          const length = Math.max(Math.min(end - count, lineLength), 1);
-                          res.push(`   |  ` + '^'.repeat(length));
-                      }
-                      count += lineLength + 1;
-                  }
-              }
-              break;
-          }
-      }
-      return res.join('\n');
-  }
-
-  /**
-   * On the client we only need to offer special cases for boolean attributes that
-   * have different names from their corresponding dom properties:
-   * - itemscope -> N/A
-   * - allowfullscreen -> allowFullscreen
-   * - formnovalidate -> formNoValidate
-   * - ismap -> isMap
-   * - nomodule -> noModule
-   * - novalidate -> noValidate
-   * - readonly -> readOnly
-   */
-  const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
-  const isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);
-
-  function normalizeStyle(value) {
-      if (isArray(value)) {
-          const res = {};
-          for (let i = 0; i < value.length; i++) {
-              const item = value[i];
-              const normalized = normalizeStyle(isString(item) ? parseStringStyle(item) : item);
-              if (normalized) {
-                  for (const key in normalized) {
-                      res[key] = normalized[key];
-                  }
-              }
-          }
-          return res;
-      }
-      else if (isObject(value)) {
-          return value;
-      }
-  }
-  const listDelimiterRE = /;(?![^(]*\))/g;
-  const propertyDelimiterRE = /:(.+)/;
-  function parseStringStyle(cssText) {
-      const ret = {};
-      cssText.split(listDelimiterRE).forEach(item => {
-          if (item) {
-              const tmp = item.split(propertyDelimiterRE);
-              tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
-          }
-      });
-      return ret;
-  }
-  function normalizeClass(value) {
-      let res = '';
-      if (isString(value)) {
-          res = value;
-      }
-      else if (isArray(value)) {
-          for (let i = 0; i < value.length; i++) {
-              res += normalizeClass(value[i]) + ' ';
-          }
-      }
-      else if (isObject(value)) {
-          for (const name in value) {
-              if (value[name]) {
-                  res += name + ' ';
-              }
-          }
-      }
-      return res.trim();
-  }
-
-  // These tag configs are shared between compiler-dom and runtime-dom, so they
-  // https://developer.mozilla.org/en-US/docs/Web/HTML/Element
-  const HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +
-      'header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,' +
-      'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +
-      'data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,' +
-      'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +
-      'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +
-      'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +
-      'option,output,progress,select,textarea,details,dialog,menu,' +
-      'summary,template,blockquote,iframe,tfoot';
-  // https://developer.mozilla.org/en-US/docs/Web/SVG/Element
-  const SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +
-      'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +
-      'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +
-      'feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +
-      'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +
-      'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +
-      'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +
-      'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +
-      'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +
-      'text,textPath,title,tspan,unknown,use,view';
-  const VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';
-  const isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);
-  const isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);
-  const isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);
-
-  function looseCompareArrays(a, b) {
-      if (a.length !== b.length)
-          return false;
-      let equal = true;
-      for (let i = 0; equal && i < a.length; i++) {
-          equal = looseEqual(a[i], b[i]);
-      }
-      return equal;
-  }
-  function looseEqual(a, b) {
-      if (a === b)
-          return true;
-      let aValidType = isDate(a);
-      let bValidType = isDate(b);
-      if (aValidType || bValidType) {
-          return aValidType && bValidType ? a.getTime() === b.getTime() : false;
-      }
-      aValidType = isArray(a);
-      bValidType = isArray(b);
-      if (aValidType || bValidType) {
-          return aValidType && bValidType ? looseCompareArrays(a, b) : false;
-      }
-      aValidType = isObject(a);
-      bValidType = isObject(b);
-      if (aValidType || bValidType) {
-          /* istanbul ignore if: this if will probably never be called */
-          if (!aValidType || !bValidType) {
-              return false;
-          }
-          const aKeysCount = Object.keys(a).length;
-          const bKeysCount = Object.keys(b).length;
-          if (aKeysCount !== bKeysCount) {
-              return false;
-          }
-          for (const key in a) {
-              const aHasKey = a.hasOwnProperty(key);
-              const bHasKey = b.hasOwnProperty(key);
-              if ((aHasKey && !bHasKey) ||
-                  (!aHasKey && bHasKey) ||
-                  !looseEqual(a[key], b[key])) {
-                  return false;
-              }
-          }
-      }
-      return String(a) === String(b);
-  }
-  function looseIndexOf(arr, val) {
-      return arr.findIndex(item => looseEqual(item, val));
-  }
-
-  /**
-   * For converting {{ interpolation }} values to displayed strings.
-   * @private
-   */
-  const toDisplayString = (val) => {
-      return val == null
-          ? ''
-          : isObject(val)
-              ? JSON.stringify(val, replacer, 2)
-              : String(val);
-  };
-  const replacer = (_key, val) => {
-      if (isMap(val)) {
-          return {
-              [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => {
-                  entries[`${key} =>`] = val;
-                  return entries;
-              }, {})
-          };
-      }
-      else if (isSet(val)) {
-          return {
-              [`Set(${val.size})`]: [...val.values()]
-          };
-      }
-      else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
-          return String(val);
-      }
-      return val;
-  };
-
-  const EMPTY_OBJ =  Object.freeze({})
-      ;
-  const EMPTY_ARR =  Object.freeze([]) ;
-  const NOOP = () => { };
-  /**
-   * Always return false.
-   */
-  const NO = () => false;
-  const onRE = /^on[^a-z]/;
-  const isOn = (key) => onRE.test(key);
-  const isModelListener = (key) => key.startsWith('onUpdate:');
-  const extend = Object.assign;
-  const remove = (arr, el) => {
-      const i = arr.indexOf(el);
-      if (i > -1) {
-          arr.splice(i, 1);
-      }
-  };
-  const hasOwnProperty = Object.prototype.hasOwnProperty;
-  const hasOwn = (val, key) => hasOwnProperty.call(val, key);
-  const isArray = Array.isArray;
-  const isMap = (val) => toTypeString(val) === '[object Map]';
-  const isSet = (val) => toTypeString(val) === '[object Set]';
-  const isDate = (val) => val instanceof Date;
-  const isFunction = (val) => typeof val === 'function';
-  const isString = (val) => typeof val === 'string';
-  const isSymbol = (val) => typeof val === 'symbol';
-  const isObject = (val) => val !== null && typeof val === 'object';
-  const isPromise = (val) => {
-      return isObject(val) && isFunction(val.then) && isFunction(val.catch);
-  };
-  const objectToString = Object.prototype.toString;
-  const toTypeString = (value) => objectToString.call(value);
-  const toRawType = (value) => {
-      // extract "RawType" from strings like "[object RawType]"
-      return toTypeString(value).slice(8, -1);
-  };
-  const isPlainObject = (val) => toTypeString(val) === '[object Object]';
-  const isIntegerKey = (key) => isString(key) &&
-      key !== 'NaN' &&
-      key[0] !== '-' &&
-      '' + parseInt(key, 10) === key;
-  const isReservedProp = /*#__PURE__*/ makeMap(
-  // the leading comma is intentional so empty string "" is also included
-  ',key,ref,' +
-      'onVnodeBeforeMount,onVnodeMounted,' +
-      'onVnodeBeforeUpdate,onVnodeUpdated,' +
-      'onVnodeBeforeUnmount,onVnodeUnmounted');
-  const cacheStringFunction = (fn) => {
-      const cache = Object.create(null);
-      return ((str) => {
-          const hit = cache[str];
-          return hit || (cache[str] = fn(str));
-      });
-  };
-  const camelizeRE = /-(\w)/g;
-  /**
-   * @private
-   */
-  const camelize = cacheStringFunction((str) => {
-      return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
-  });
-  const hyphenateRE = /\B([A-Z])/g;
-  /**
-   * @private
-   */
-  const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());
-  /**
-   * @private
-   */
-  const capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));
-  /**
-   * @private
-   */
-  const toHandlerKey = cacheStringFunction((str) => (str ? `on${capitalize(str)}` : ``));
-  // compare whether a value has changed, accounting for NaN.
-  const hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);
-  const invokeArrayFns = (fns, arg) => {
-      for (let i = 0; i < fns.length; i++) {
-          fns[i](arg);
-      }
-  };
-  const def = (obj, key, value) => {
-      Object.defineProperty(obj, key, {
-          configurable: true,
-          enumerable: false,
-          value
-      });
-  };
-  const toNumber = (val) => {
-      const n = parseFloat(val);
-      return isNaN(n) ? val : n;
-  };
-  let _globalThis;
-  const getGlobalThis = () => {
-      return (_globalThis ||
-          (_globalThis =
-              typeof globalThis !== 'undefined'
-                  ? globalThis
-                  : typeof self !== 'undefined'
-                      ? self
-                      : typeof window !== 'undefined'
-                          ? window
-                          : typeof global !== 'undefined'
-                              ? global
-                              : {}));
-  };
-
-  const targetMap = new WeakMap();
-  const effectStack = [];
-  let activeEffect;
-  const ITERATE_KEY = Symbol( 'iterate' );
-  const MAP_KEY_ITERATE_KEY = Symbol( 'Map key iterate' );
-  function isEffect(fn) {
-      return fn && fn._isEffect === true;
-  }
-  function effect(fn, options = EMPTY_OBJ) {
-      if (isEffect(fn)) {
-          fn = fn.raw;
-      }
-      const effect = createReactiveEffect(fn, options);
-      if (!options.lazy) {
-          effect();
-      }
-      return effect;
-  }
-  function stop(effect) {
-      if (effect.active) {
-          cleanup(effect);
-          if (effect.options.onStop) {
-              effect.options.onStop();
-          }
-          effect.active = false;
-      }
-  }
-  let uid = 0;
-  function createReactiveEffect(fn, options) {
-      const effect = function reactiveEffect() {
-          if (!effect.active) {
-              return options.scheduler ? undefined : fn();
-          }
-          if (!effectStack.includes(effect)) {
-              cleanup(effect);
-              try {
-                  enableTracking();
-                  effectStack.push(effect);
-                  activeEffect = effect;
-                  return fn();
-              }
-              finally {
-                  effectStack.pop();
-                  resetTracking();
-                  activeEffect = effectStack[effectStack.length - 1];
-              }
-          }
-      };
-      effect.id = uid++;
-      effect.allowRecurse = !!options.allowRecurse;
-      effect._isEffect = true;
-      effect.active = true;
-      effect.raw = fn;
-      effect.deps = [];
-      effect.options = options;
-      return effect;
-  }
-  function cleanup(effect) {
-      const { deps } = effect;
-      if (deps.length) {
-          for (let i = 0; i < deps.length; i++) {
-              deps[i].delete(effect);
-          }
-          deps.length = 0;
-      }
-  }
-  let shouldTrack = true;
-  const trackStack = [];
-  function pauseTracking() {
-      trackStack.push(shouldTrack);
-      shouldTrack = false;
-  }
-  function enableTracking() {
-      trackStack.push(shouldTrack);
-      shouldTrack = true;
-  }
-  function resetTracking() {
-      const last = trackStack.pop();
-      shouldTrack = last === undefined ? true : last;
-  }
-  function track(target, type, key) {
-      if (!shouldTrack || activeEffect === undefined) {
-          return;
-      }
-      let depsMap = targetMap.get(target);
-      if (!depsMap) {
-          targetMap.set(target, (depsMap = new Map()));
-      }
-      let dep = depsMap.get(key);
-      if (!dep) {
-          depsMap.set(key, (dep = new Set()));
-      }
-      if (!dep.has(activeEffect)) {
-          dep.add(activeEffect);
-          activeEffect.deps.push(dep);
-          if ( activeEffect.options.onTrack) {
-              activeEffect.options.onTrack({
-                  effect: activeEffect,
-                  target,
-                  type,
-                  key
-              });
-          }
-      }
-  }
-  function trigger(target, type, key, newValue, oldValue, oldTarget) {
-      const depsMap = targetMap.get(target);
-      if (!depsMap) {
-          // never been tracked
-          return;
-      }
-      const effects = new Set();
-      const add = (effectsToAdd) => {
-          if (effectsToAdd) {
-              effectsToAdd.forEach(effect => {
-                  if (effect !== activeEffect || effect.allowRecurse) {
-                      effects.add(effect);
-                  }
-              });
-          }
-      };
-      if (type === "clear" /* CLEAR */) {
-          // collection being cleared
-          // trigger all effects for target
-          depsMap.forEach(add);
-      }
-      else if (key === 'length' && isArray(target)) {
-          depsMap.forEach((dep, key) => {
-              if (key === 'length' || key >= newValue) {
-                  add(dep);
-              }
-          });
-      }
-      else {
-          // schedule runs for SET | ADD | DELETE
-          if (key !== void 0) {
-              add(depsMap.get(key));
-          }
-          // also run for iteration key on ADD | DELETE | Map.SET
-          switch (type) {
-              case "add" /* ADD */:
-                  if (!isArray(target)) {
-                      add(depsMap.get(ITERATE_KEY));
-                      if (isMap(target)) {
-                          add(depsMap.get(MAP_KEY_ITERATE_KEY));
-                      }
-                  }
-                  else if (isIntegerKey(key)) {
-                      // new index added to array -> length changes
-                      add(depsMap.get('length'));
-                  }
-                  break;
-              case "delete" /* DELETE */:
-                  if (!isArray(target)) {
-                      add(depsMap.get(ITERATE_KEY));
-                      if (isMap(target)) {
-                          add(depsMap.get(MAP_KEY_ITERATE_KEY));
-                      }
-                  }
-                  break;
-              case "set" /* SET */:
-                  if (isMap(target)) {
-                      add(depsMap.get(ITERATE_KEY));
-                  }
-                  break;
-          }
-      }
-      const run = (effect) => {
-          if ( effect.options.onTrigger) {
-              effect.options.onTrigger({
-                  effect,
-                  target,
-                  key,
-                  type,
-                  newValue,
-                  oldValue,
-                  oldTarget
-              });
-          }
-          if (effect.options.scheduler) {
-              effect.options.scheduler(effect);
-          }
-          else {
-              effect();
-          }
-      };
-      effects.forEach(run);
-  }
-
-  const builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol)
-      .map(key => Symbol[key])
-      .filter(isSymbol));
-  const get = /*#__PURE__*/ createGetter();
-  const shallowGet = /*#__PURE__*/ createGetter(false, true);
-  const readonlyGet = /*#__PURE__*/ createGetter(true);
-  const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true);
-  const arrayInstrumentations = {};
-  ['includes', 'indexOf', 'lastIndexOf'].forEach(key => {
-      const method = Array.prototype[key];
-      arrayInstrumentations[key] = function (...args) {
-          const arr = toRaw(this);
-          for (let i = 0, l = this.length; i < l; i++) {
-              track(arr, "get" /* GET */, i + '');
-          }
-          // we run the method using the original args first (which may be reactive)
-          const res = method.apply(arr, args);
-          if (res === -1 || res === false) {
-              // if that didn't work, run it again using raw values.
-              return method.apply(arr, args.map(toRaw));
-          }
-          else {
-              return res;
-          }
-      };
-  });
-  ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(key => {
-      const method = Array.prototype[key];
-      arrayInstrumentations[key] = function (...args) {
-          pauseTracking();
-          const res = method.apply(this, args);
-          resetTracking();
-          return res;
-      };
-  });
-  function createGetter(isReadonly = false, shallow = false) {
-      return function get(target, key, receiver) {
-          if (key === "__v_isReactive" /* IS_REACTIVE */) {
-              return !isReadonly;
-          }
-          else if (key === "__v_isReadonly" /* IS_READONLY */) {
-              return isReadonly;
-          }
-          else if (key === "__v_raw" /* RAW */ &&
-              receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) {
-              return target;
-          }
-          const targetIsArray = isArray(target);
-          if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
-              return Reflect.get(arrayInstrumentations, key, receiver);
-          }
-          const res = Reflect.get(target, key, receiver);
-          if (isSymbol(key)
-              ? builtInSymbols.has(key)
-              : key === `__proto__` || key === `__v_isRef`) {
-              return res;
-          }
-          if (!isReadonly) {
-              track(target, "get" /* GET */, key);
-          }
-          if (shallow) {
-              return res;
-          }
-          if (isRef(res)) {
-              // ref unwrapping - does not apply for Array + integer key.
-              const shouldUnwrap = !targetIsArray || !isIntegerKey(key);
-              return shouldUnwrap ? res.value : res;
-          }
-          if (isObject(res)) {
-              // Convert returned value into a proxy as well. we do the isObject check
-              // here to avoid invalid value warning. Also need to lazy access readonly
-              // and reactive here to avoid circular dependency.
-              return isReadonly ? readonly(res) : reactive(res);
-          }
-          return res;
-      };
-  }
-  const set = /*#__PURE__*/ createSetter();
-  const shallowSet = /*#__PURE__*/ createSetter(true);
-  function createSetter(shallow = false) {
-      return function set(target, key, value, receiver) {
-          const oldValue = target[key];
-          if (!shallow) {
-              value = toRaw(value);
-              if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
-                  oldValue.value = value;
-                  return true;
-              }
-          }
-          const hadKey = isArray(target) && isIntegerKey(key)
-              ? Number(key) < target.length
-              : hasOwn(target, key);
-          const result = Reflect.set(target, key, value, receiver);
-          // don't trigger if target is something up in the prototype chain of original
-          if (target === toRaw(receiver)) {
-              if (!hadKey) {
-                  trigger(target, "add" /* ADD */, key, value);
-              }
-              else if (hasChanged(value, oldValue)) {
-                  trigger(target, "set" /* SET */, key, value, oldValue);
-              }
-          }
-          return result;
-      };
-  }
-  function deleteProperty(target, key) {
-      const hadKey = hasOwn(target, key);
-      const oldValue = target[key];
-      const result = Reflect.deleteProperty(target, key);
-      if (result && hadKey) {
-          trigger(target, "delete" /* DELETE */, key, undefined, oldValue);
-      }
-      return result;
-  }
-  function has(target, key) {
-      const result = Reflect.has(target, key);
-      if (!isSymbol(key) || !builtInSymbols.has(key)) {
-          track(target, "has" /* HAS */, key);
-      }
-      return result;
-  }
-  function ownKeys(target) {
-      track(target, "iterate" /* ITERATE */, isArray(target) ? 'length' : ITERATE_KEY);
-      return Reflect.ownKeys(target);
-  }
-  const mutableHandlers = {
-      get,
-      set,
-      deleteProperty,
-      has,
-      ownKeys
-  };
-  const readonlyHandlers = {
-      get: readonlyGet,
-      set(target, key) {
-          {
-              console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
-          }
-          return true;
-      },
-      deleteProperty(target, key) {
-          {
-              console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
-          }
-          return true;
-      }
-  };
-  const shallowReactiveHandlers = extend({}, mutableHandlers, {
-      get: shallowGet,
-      set: shallowSet
-  });
-  // Props handlers are special in the sense that it should not unwrap top-level
-  // refs (in order to allow refs to be explicitly passed down), but should
-  // retain the reactivity of the normal readonly object.
-  const shallowReadonlyHandlers = extend({}, readonlyHandlers, {
-      get: shallowReadonlyGet
-  });
-
-  const toReactive = (value) => isObject(value) ? reactive(value) : value;
-  const toReadonly = (value) => isObject(value) ? readonly(value) : value;
-  const toShallow = (value) => value;
-  const getProto = (v) => Reflect.getPrototypeOf(v);
-  function get$1(target, key, isReadonly = false, isShallow = false) {
-      // #1772: readonly(reactive(Map)) should return readonly + reactive version
-      // of the value
-      target = target["__v_raw" /* RAW */];
-      const rawTarget = toRaw(target);
-      const rawKey = toRaw(key);
-      if (key !== rawKey) {
-          !isReadonly && track(rawTarget, "get" /* GET */, key);
-      }
-      !isReadonly && track(rawTarget, "get" /* GET */, rawKey);
-      const { has } = getProto(rawTarget);
-      const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
-      if (has.call(rawTarget, key)) {
-          return wrap(target.get(key));
-      }
-      else if (has.call(rawTarget, rawKey)) {
-          return wrap(target.get(rawKey));
-      }
-  }
-  function has$1(key, isReadonly = false) {
-      const target = this["__v_raw" /* RAW */];
-      const rawTarget = toRaw(target);
-      const rawKey = toRaw(key);
-      if (key !== rawKey) {
-          !isReadonly && track(rawTarget, "has" /* HAS */, key);
-      }
-      !isReadonly && track(rawTarget, "has" /* HAS */, rawKey);
-      return key === rawKey
-          ? target.has(key)
-          : target.has(key) || target.has(rawKey);
-  }
-  function size(target, isReadonly = false) {
-      target = target["__v_raw" /* RAW */];
-      !isReadonly && track(toRaw(target), "iterate" /* ITERATE */, ITERATE_KEY);
-      return Reflect.get(target, 'size', target);
-  }
-  function add(value) {
-      value = toRaw(value);
-      const target = toRaw(this);
-      const proto = getProto(target);
-      const hadKey = proto.has.call(target, value);
-      target.add(value);
-      if (!hadKey) {
-          trigger(target, "add" /* ADD */, value, value);
-      }
-      return this;
-  }
-  function set$1(key, value) {
-      value = toRaw(value);
-      const target = toRaw(this);
-      const { has, get } = getProto(target);
-      let hadKey = has.call(target, key);
-      if (!hadKey) {
-          key = toRaw(key);
-          hadKey = has.call(target, key);
-      }
-      else {
-          checkIdentityKeys(target, has, key);
-      }
-      const oldValue = get.call(target, key);
-      target.set(key, value);
-      if (!hadKey) {
-          trigger(target, "add" /* ADD */, key, value);
-      }
-      else if (hasChanged(value, oldValue)) {
-          trigger(target, "set" /* SET */, key, value, oldValue);
-      }
-      return this;
-  }
-  function deleteEntry(key) {
-      const target = toRaw(this);
-      const { has, get } = getProto(target);
-      let hadKey = has.call(target, key);
-      if (!hadKey) {
-          key = toRaw(key);
-          hadKey = has.call(target, key);
-      }
-      else {
-          checkIdentityKeys(target, has, key);
-      }
-      const oldValue = get ? get.call(target, key) : undefined;
-      // forward the operation before queueing reactions
-      const result = target.delete(key);
-      if (hadKey) {
-          trigger(target, "delete" /* DELETE */, key, undefined, oldValue);
-      }
-      return result;
-  }
-  function clear() {
-      const target = toRaw(this);
-      const hadItems = target.size !== 0;
-      const oldTarget =  isMap(target)
-              ? new Map(target)
-              : new Set(target)
-          ;
-      // forward the operation before queueing reactions
-      const result = target.clear();
-      if (hadItems) {
-          trigger(target, "clear" /* CLEAR */, undefined, undefined, oldTarget);
-      }
-      return result;
-  }
-  function createForEach(isReadonly, isShallow) {
-      return function forEach(callback, thisArg) {
-          const observed = this;
-          const target = observed["__v_raw" /* RAW */];
-          const rawTarget = toRaw(target);
-          const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
-          !isReadonly && track(rawTarget, "iterate" /* ITERATE */, ITERATE_KEY);
-          return target.forEach((value, key) => {
-              // important: make sure the callback is
-              // 1. invoked with the reactive map as `this` and 3rd arg
-              // 2. the value received should be a corresponding reactive/readonly.
-              return callback.call(thisArg, wrap(value), wrap(key), observed);
-          });
-      };
-  }
-  function createIterableMethod(method, isReadonly, isShallow) {
-      return function (...args) {
-          const target = this["__v_raw" /* RAW */];
-          const rawTarget = toRaw(target);
-          const targetIsMap = isMap(rawTarget);
-          const isPair = method === 'entries' || (method === Symbol.iterator && targetIsMap);
-          const isKeyOnly = method === 'keys' && targetIsMap;
-          const innerIterator = target[method](...args);
-          const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
-          !isReadonly &&
-              track(rawTarget, "iterate" /* ITERATE */, isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
-          // return a wrapped iterator which returns observed versions of the
-          // values emitted from the real iterator
-          return {
-              // iterator protocol
-              next() {
-                  const { value, done } = innerIterator.next();
-                  return done
-                      ? { value, done }
-                      : {
-                          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
-                          done
-                      };
-              },
-              // iterable protocol
-              [Symbol.iterator]() {
-                  return this;
-              }
-          };
-      };
-  }
-  function createReadonlyMethod(type) {
-      return function (...args) {
-          {
-              const key = args[0] ? `on key "${args[0]}" ` : ``;
-              console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this));
-          }
-          return type === "delete" /* DELETE */ ? false : this;
-      };
-  }
-  const mutableInstrumentations = {
-      get(key) {
-          return get$1(this, key);
-      },
-      get size() {
-          return size(this);
-      },
-      has: has$1,
-      add,
-      set: set$1,
-      delete: deleteEntry,
-      clear,
-      forEach: createForEach(false, false)
-  };
-  const shallowInstrumentations = {
-      get(key) {
-          return get$1(this, key, false, true);
-      },
-      get size() {
-          return size(this);
-      },
-      has: has$1,
-      add,
-      set: set$1,
-      delete: deleteEntry,
-      clear,
-      forEach: createForEach(false, true)
-  };
-  const readonlyInstrumentations = {
-      get(key) {
-          return get$1(this, key, true);
-      },
-      get size() {
-          return size(this, true);
-      },
-      has(key) {
-          return has$1.call(this, key, true);
-      },
-      add: createReadonlyMethod("add" /* ADD */),
-      set: createReadonlyMethod("set" /* SET */),
-      delete: createReadonlyMethod("delete" /* DELETE */),
-      clear: createReadonlyMethod("clear" /* CLEAR */),
-      forEach: createForEach(true, false)
-  };
-  const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
-  iteratorMethods.forEach(method => {
-      mutableInstrumentations[method] = createIterableMethod(method, false, false);
-      readonlyInstrumentations[method] = createIterableMethod(method, true, false);
-      shallowInstrumentations[method] = createIterableMethod(method, false, true);
-  });
-  function createInstrumentationGetter(isReadonly, shallow) {
-      const instrumentations = shallow
-          ? shallowInstrumentations
-          : isReadonly
-              ? readonlyInstrumentations
-              : mutableInstrumentations;
-      return (target, key, receiver) => {
-          if (key === "__v_isReactive" /* IS_REACTIVE */) {
-              return !isReadonly;
-          }
-          else if (key === "__v_isReadonly" /* IS_READONLY */) {
-              return isReadonly;
-          }
-          else if (key === "__v_raw" /* RAW */) {
-              return target;
-          }
-          return Reflect.get(hasOwn(instrumentations, key) && key in target
-              ? instrumentations
-              : target, key, receiver);
-      };
-  }
-  const mutableCollectionHandlers = {
-      get: createInstrumentationGetter(false, false)
-  };
-  const shallowCollectionHandlers = {
-      get: createInstrumentationGetter(false, true)
-  };
-  const readonlyCollectionHandlers = {
-      get: createInstrumentationGetter(true, false)
-  };
-  function checkIdentityKeys(target, has, key) {
-      const rawKey = toRaw(key);
-      if (rawKey !== key && has.call(target, rawKey)) {
-          const type = toRawType(target);
-          console.warn(`Reactive ${type} contains both the raw and reactive ` +
-              `versions of the same object${type === `Map` ? ` as keys` : ``}, ` +
-              `which can lead to inconsistencies. ` +
-              `Avoid differentiating between the raw and reactive versions ` +
-              `of an object and only use the reactive version if possible.`);
-      }
-  }
-
-  const reactiveMap = new WeakMap();
-  const readonlyMap = new WeakMap();
-  function targetTypeMap(rawType) {
-      switch (rawType) {
-          case 'Object':
-          case 'Array':
-              return 1 /* COMMON */;
-          case 'Map':
-          case 'Set':
-          case 'WeakMap':
-          case 'WeakSet':
-              return 2 /* COLLECTION */;
-          default:
-              return 0 /* INVALID */;
-      }
-  }
-  function getTargetType(value) {
-      return value["__v_skip" /* SKIP */] || !Object.isExtensible(value)
-          ? 0 /* INVALID */
-          : targetTypeMap(toRawType(value));
-  }
-  function reactive(target) {
-      // if trying to observe a readonly proxy, return the readonly version.
-      if (target && target["__v_isReadonly" /* IS_READONLY */]) {
-          return target;
-      }
-      return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers);
-  }
-  /**
-   * Return a shallowly-reactive copy of the original object, where only the root
-   * level properties are reactive. It also does not auto-unwrap refs (even at the
-   * root level).
-   */
-  function shallowReactive(target) {
-      return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers);
-  }
-  /**
-   * Creates a readonly copy of the original object. Note the returned copy is not
-   * made reactive, but `readonly` can be called on an already reactive object.
-   */
-  function readonly(target) {
-      return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers);
-  }
-  /**
-   * Returns a reactive-copy of the original object, where only the root level
-   * properties are readonly, and does NOT unwrap refs nor recursively convert
-   * returned properties.
-   * This is used for creating the props proxy object for stateful components.
-   */
-  function shallowReadonly(target) {
-      return createReactiveObject(target, true, shallowReadonlyHandlers, readonlyCollectionHandlers);
-  }
-  function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers) {
-      if (!isObject(target)) {
-          {
-              console.warn(`value cannot be made reactive: ${String(target)}`);
-          }
-          return target;
-      }
-      // target is already a Proxy, return it.
-      // exception: calling readonly() on a reactive object
-      if (target["__v_raw" /* RAW */] &&
-          !(isReadonly && target["__v_isReactive" /* IS_REACTIVE */])) {
-          return target;
-      }
-      // target already has corresponding Proxy
-      const proxyMap = isReadonly ? readonlyMap : reactiveMap;
-      const existingProxy = proxyMap.get(target);
-      if (existingProxy) {
-          return existingProxy;
-      }
-      // only a whitelist of value types can be observed.
-      const targetType = getTargetType(target);
-      if (targetType === 0 /* INVALID */) {
-          return target;
-      }
-      const proxy = new Proxy(target, targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers);
-      proxyMap.set(target, proxy);
-      return proxy;
-  }
-  function isReactive(value) {
-      if (isReadonly(value)) {
-          return isReactive(value["__v_raw" /* RAW */]);
-      }
-      return !!(value && value["__v_isReactive" /* IS_REACTIVE */]);
-  }
-  function isReadonly(value) {
-      return !!(value && value["__v_isReadonly" /* IS_READONLY */]);
-  }
-  function isProxy(value) {
-      return isReactive(value) || isReadonly(value);
-  }
-  function toRaw(observed) {
-      return ((observed && toRaw(observed["__v_raw" /* RAW */])) || observed);
-  }
-  function markRaw(value) {
-      def(value, "__v_skip" /* SKIP */, true);
-      return value;
-  }
-
-  const convert = (val) => isObject(val) ? reactive(val) : val;
-  function isRef(r) {
-      return Boolean(r && r.__v_isRef === true);
-  }
-  function ref(value) {
-      return createRef(value);
-  }
-  function shallowRef(value) {
-      return createRef(value, true);
-  }
-  class RefImpl {
-      constructor(_rawValue, _shallow = false) {
-          this._rawValue = _rawValue;
-          this._shallow = _shallow;
-          this.__v_isRef = true;
-          this._value = _shallow ? _rawValue : convert(_rawValue);
-      }
-      get value() {
-          track(toRaw(this), "get" /* GET */, 'value');
-          return this._value;
-      }
-      set value(newVal) {
-          if (hasChanged(toRaw(newVal), this._rawValue)) {
-              this._rawValue = newVal;
-              this._value = this._shallow ? newVal : convert(newVal);
-              trigger(toRaw(this), "set" /* SET */, 'value', newVal);
-          }
-      }
-  }
-  function createRef(rawValue, shallow = false) {
-      if (isRef(rawValue)) {
-          return rawValue;
-      }
-      return new RefImpl(rawValue, shallow);
-  }
-  function triggerRef(ref) {
-      trigger(toRaw(ref), "set" /* SET */, 'value',  ref.value );
-  }
-  function unref(ref) {
-      return isRef(ref) ? ref.value : ref;
-  }
-  const shallowUnwrapHandlers = {
-      get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
-      set: (target, key, value, receiver) => {
-          const oldValue = target[key];
-          if (isRef(oldValue) && !isRef(value)) {
-              oldValue.value = value;
-              return true;
-          }
-          else {
-              return Reflect.set(target, key, value, receiver);
-          }
-      }
-  };
-  function proxyRefs(objectWithRefs) {
-      return isReactive(objectWithRefs)
-          ? objectWithRefs
-          : new Proxy(objectWithRefs, shallowUnwrapHandlers);
-  }
-  class CustomRefImpl {
-      constructor(factory) {
-          this.__v_isRef = true;
-          const { get, set } = factory(() => track(this, "get" /* GET */, 'value'), () => trigger(this, "set" /* SET */, 'value'));
-          this._get = get;
-          this._set = set;
-      }
-      get value() {
-          return this._get();
-      }
-      set value(newVal) {
-          this._set(newVal);
-      }
-  }
-  function customRef(factory) {
-      return new CustomRefImpl(factory);
-  }
-  function toRefs(object) {
-      if ( !isProxy(object)) {
-          console.warn(`toRefs() expects a reactive object but received a plain one.`);
-      }
-      const ret = isArray(object) ? new Array(object.length) : {};
-      for (const key in object) {
-          ret[key] = toRef(object, key);
-      }
-      return ret;
-  }
-  class ObjectRefImpl {
-      constructor(_object, _key) {
-          this._object = _object;
-          this._key = _key;
-          this.__v_isRef = true;
-      }
-      get value() {
-          return this._object[this._key];
-      }
-      set value(newVal) {
-          this._object[this._key] = newVal;
-      }
-  }
-  function toRef(object, key) {
-      return isRef(object[key])
-          ? object[key]
-          : new ObjectRefImpl(object, key);
-  }
-
-  class ComputedRefImpl {
-      constructor(getter, _setter, isReadonly) {
-          this._setter = _setter;
-          this._dirty = true;
-          this.__v_isRef = true;
-          this.effect = effect(getter, {
-              lazy: true,
-              scheduler: () => {
-                  if (!this._dirty) {
-                      this._dirty = true;
-                      trigger(toRaw(this), "set" /* SET */, 'value');
-                  }
-              }
-          });
-          this["__v_isReadonly" /* IS_READONLY */] = isReadonly;
-      }
-      get value() {
-          if (this._dirty) {
-              this._value = this.effect();
-              this._dirty = false;
-          }
-          track(toRaw(this), "get" /* GET */, 'value');
-          return this._value;
-      }
-      set value(newValue) {
-          this._setter(newValue);
-      }
-  }
-  function computed(getterOrOptions) {
-      let getter;
-      let setter;
-      if (isFunction(getterOrOptions)) {
-          getter = getterOrOptions;
-          setter =  () => {
-                  console.warn('Write operation failed: computed value is readonly');
-              }
-              ;
-      }
-      else {
-          getter = getterOrOptions.get;
-          setter = getterOrOptions.set;
-      }
-      return new ComputedRefImpl(getter, setter, isFunction(getterOrOptions) || !getterOrOptions.set);
-  }
-
-  const stack = [];
-  function pushWarningContext(vnode) {
-      stack.push(vnode);
-  }
-  function popWarningContext() {
-      stack.pop();
-  }
-  function warn(msg, ...args) {
-      // avoid props formatting or warn handler tracking deps that might be mutated
-      // during patch, leading to infinite recursion.
-      pauseTracking();
-      const instance = stack.length ? stack[stack.length - 1].component : null;
-      const appWarnHandler = instance && instance.appContext.config.warnHandler;
-      const trace = getComponentTrace();
-      if (appWarnHandler) {
-          callWithErrorHandling(appWarnHandler, instance, 11 /* APP_WARN_HANDLER */, [
-              msg + args.join(''),
-              instance && instance.proxy,
-              trace
-                  .map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`)
-                  .join('\n'),
-              trace
-          ]);
-      }
-      else {
-          const warnArgs = [`[Vue warn]: ${msg}`, ...args];
-          /* istanbul ignore if */
-          if (trace.length &&
-              // avoid spamming console during tests
-              !false) {
-              warnArgs.push(`\n`, ...formatTrace(trace));
-          }
-          console.warn(...warnArgs);
-      }
-      resetTracking();
-  }
-  function getComponentTrace() {
-      let currentVNode = stack[stack.length - 1];
-      if (!currentVNode) {
-          return [];
-      }
-      // we can't just use the stack because it will be incomplete during updates
-      // that did not start from the root. Re-construct the parent chain using
-      // instance parent pointers.
-      const normalizedStack = [];
-      while (currentVNode) {
-          const last = normalizedStack[0];
-          if (last && last.vnode === currentVNode) {
-              last.recurseCount++;
-          }
-          else {
-              normalizedStack.push({
-                  vnode: currentVNode,
-                  recurseCount: 0
-              });
-          }
-          const parentInstance = currentVNode.component && currentVNode.component.parent;
-          currentVNode = parentInstance && parentInstance.vnode;
-      }
-      return normalizedStack;
-  }
-  /* istanbul ignore next */
-  function formatTrace(trace) {
-      const logs = [];
-      trace.forEach((entry, i) => {
-          logs.push(...(i === 0 ? [] : [`\n`]), ...formatTraceEntry(entry));
-      });
-      return logs;
-  }
-  function formatTraceEntry({ vnode, recurseCount }) {
-      const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
-      const isRoot = vnode.component ? vnode.component.parent == null : false;
-      const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`;
-      const close = `>` + postfix;
-      return vnode.props
-          ? [open, ...formatProps(vnode.props), close]
-          : [open + close];
-  }
-  /* istanbul ignore next */
-  function formatProps(props) {
-      const res = [];
-      const keys = Object.keys(props);
-      keys.slice(0, 3).forEach(key => {
-          res.push(...formatProp(key, props[key]));
-      });
-      if (keys.length > 3) {
-          res.push(` ...`);
-      }
-      return res;
-  }
-  /* istanbul ignore next */
-  function formatProp(key, value, raw) {
-      if (isString(value)) {
-          value = JSON.stringify(value);
-          return raw ? value : [`${key}=${value}`];
-      }
-      else if (typeof value === 'number' ||
-          typeof value === 'boolean' ||
-          value == null) {
-          return raw ? value : [`${key}=${value}`];
-      }
-      else if (isRef(value)) {
-          value = formatProp(key, toRaw(value.value), true);
-          return raw ? value : [`${key}=Ref<`, value, `>`];
-      }
-      else if (isFunction(value)) {
-          return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
-      }
-      else {
-          value = toRaw(value);
-          return raw ? value : [`${key}=`, value];
-      }
-  }
-
-  const ErrorTypeStrings = {
-      ["bc" /* BEFORE_CREATE */]: 'beforeCreate hook',
-      ["c" /* CREATED */]: 'created hook',
-      ["bm" /* BEFORE_MOUNT */]: 'beforeMount hook',
-      ["m" /* MOUNTED */]: 'mounted hook',
-      ["bu" /* BEFORE_UPDATE */]: 'beforeUpdate hook',
-      ["u" /* UPDATED */]: 'updated',
-      ["bum" /* BEFORE_UNMOUNT */]: 'beforeUnmount hook',
-      ["um" /* UNMOUNTED */]: 'unmounted hook',
-      ["a" /* ACTIVATED */]: 'activated hook',
-      ["da" /* DEACTIVATED */]: 'deactivated hook',
-      ["ec" /* ERROR_CAPTURED */]: 'errorCaptured hook',
-      ["rtc" /* RENDER_TRACKED */]: 'renderTracked hook',
-      ["rtg" /* RENDER_TRIGGERED */]: 'renderTriggered hook',
-      [0 /* SETUP_FUNCTION */]: 'setup function',
-      [1 /* RENDER_FUNCTION */]: 'render function',
-      [2 /* WATCH_GETTER */]: 'watcher getter',
-      [3 /* WATCH_CALLBACK */]: 'watcher callback',
-      [4 /* WATCH_CLEANUP */]: 'watcher cleanup function',
-      [5 /* NATIVE_EVENT_HANDLER */]: 'native event handler',
-      [6 /* COMPONENT_EVENT_HANDLER */]: 'component event handler',
-      [7 /* VNODE_HOOK */]: 'vnode hook',
-      [8 /* DIRECTIVE_HOOK */]: 'directive hook',
-      [9 /* TRANSITION_HOOK */]: 'transition hook',
-      [10 /* APP_ERROR_HANDLER */]: 'app errorHandler',
-      [11 /* APP_WARN_HANDLER */]: 'app warnHandler',
-      [12 /* FUNCTION_REF */]: 'ref function',
-      [13 /* ASYNC_COMPONENT_LOADER */]: 'async component loader',
-      [14 /* SCHEDULER */]: 'scheduler flush. This is likely a Vue internals bug. ' +
-          'Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/vue-next'
-  };
-  function callWithErrorHandling(fn, instance, type, args) {
-      let res;
-      try {
-          res = args ? fn(...args) : fn();
-      }
-      catch (err) {
-          handleError(err, instance, type);
-      }
-      return res;
-  }
-  function callWithAsyncErrorHandling(fn, instance, type, args) {
-      if (isFunction(fn)) {
-          const res = callWithErrorHandling(fn, instance, type, args);
-          if (res && isPromise(res)) {
-              res.catch(err => {
-                  handleError(err, instance, type);
-              });
-          }
-          return res;
-      }
-      const values = [];
-      for (let i = 0; i < fn.length; i++) {
-          values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
-      }
-      return values;
-  }
-  function handleError(err, instance, type, throwInDev = true) {
-      const contextVNode = instance ? instance.vnode : null;
-      if (instance) {
-          let cur = instance.parent;
-          // the exposed instance is the render proxy to keep it consistent with 2.x
-          const exposedInstance = instance.proxy;
-          // in production the hook receives only the error code
-          const errorInfo =  ErrorTypeStrings[type] ;
-          while (cur) {
-              const errorCapturedHooks = cur.ec;
-              if (errorCapturedHooks) {
-                  for (let i = 0; i < errorCapturedHooks.length; i++) {
-                      if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
-                          return;
-                      }
-                  }
-              }
-              cur = cur.parent;
-          }
-          // app-level handling
-          const appErrorHandler = instance.appContext.config.errorHandler;
-          if (appErrorHandler) {
-              callWithErrorHandling(appErrorHandler, null, 10 /* APP_ERROR_HANDLER */, [err, exposedInstance, errorInfo]);
-              return;
-          }
-      }
-      logError(err, type, contextVNode, throwInDev);
-  }
-  function logError(err, type, contextVNode, throwInDev = true) {
-      {
-          const info = ErrorTypeStrings[type];
-          if (contextVNode) {
-              pushWarningContext(contextVNode);
-          }
-          warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
-          if (contextVNode) {
-              popWarningContext();
-          }
-          // crash in dev by default so it's more noticeable
-          if (throwInDev) {
-              throw err;
-          }
-          else {
-              console.error(err);
-          }
-      }
-  }
-
-  let isFlushing = false;
-  let isFlushPending = false;
-  const queue = [];
-  let flushIndex = 0;
-  const pendingPreFlushCbs = [];
-  let activePreFlushCbs = null;
-  let preFlushIndex = 0;
-  const pendingPostFlushCbs = [];
-  let activePostFlushCbs = null;
-  let postFlushIndex = 0;
-  const resolvedPromise = Promise.resolve();
-  let currentFlushPromise = null;
-  let currentPreFlushParentJob = null;
-  const RECURSION_LIMIT = 100;
-  function nextTick(fn) {
-      const p = currentFlushPromise || resolvedPromise;
-      return fn ? p.then(this ? fn.bind(this) : fn) : p;
-  }
-  function queueJob(job) {
-      // the dedupe search uses the startIndex argument of Array.includes()
-      // by default the search index includes the current job that is being run
-      // so it cannot recursively trigger itself again.
-      // if the job is a watch() callback, the search will start with a +1 index to
-      // allow it recursively trigger itself - it is the user's responsibility to
-      // ensure it doesn't end up in an infinite loop.
-      if ((!queue.length ||
-          !queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) &&
-          job !== currentPreFlushParentJob) {
-          queue.push(job);
-          queueFlush();
-      }
-  }
-  function queueFlush() {
-      if (!isFlushing && !isFlushPending) {
-          isFlushPending = true;
-          currentFlushPromise = resolvedPromise.then(flushJobs);
-      }
-  }
-  function invalidateJob(job) {
-      const i = queue.indexOf(job);
-      if (i > -1) {
-          queue.splice(i, 1);
-      }
-  }
-  function queueCb(cb, activeQueue, pendingQueue, index) {
-      if (!isArray(cb)) {
-          if (!activeQueue ||
-              !activeQueue.includes(cb, cb.allowRecurse ? index + 1 : index)) {
-              pendingQueue.push(cb);
-          }
-      }
-      else {
-          // if cb is an array, it is a component lifecycle hook which can only be
-          // triggered by a job, which is already deduped in the main queue, so
-          // we can skip duplicate check here to improve perf
-          pendingQueue.push(...cb);
-      }
-      queueFlush();
-  }
-  function queuePreFlushCb(cb) {
-      queueCb(cb, activePreFlushCbs, pendingPreFlushCbs, preFlushIndex);
-  }
-  function queuePostFlushCb(cb) {
-      queueCb(cb, activePostFlushCbs, pendingPostFlushCbs, postFlushIndex);
-  }
-  function flushPreFlushCbs(seen, parentJob = null) {
-      if (pendingPreFlushCbs.length) {
-          currentPreFlushParentJob = parentJob;
-          activePreFlushCbs = [...new Set(pendingPreFlushCbs)];
-          pendingPreFlushCbs.length = 0;
-          {
-              seen = seen || new Map();
-          }
-          for (preFlushIndex = 0; preFlushIndex < activePreFlushCbs.length; preFlushIndex++) {
-              {
-                  checkRecursiveUpdates(seen, activePreFlushCbs[preFlushIndex]);
-              }
-              activePreFlushCbs[preFlushIndex]();
-          }
-          activePreFlushCbs = null;
-          preFlushIndex = 0;
-          currentPreFlushParentJob = null;
-          // recursively flush until it drains
-          flushPreFlushCbs(seen, parentJob);
-      }
-  }
-  function flushPostFlushCbs(seen) {
-      if (pendingPostFlushCbs.length) {
-          const deduped = [...new Set(pendingPostFlushCbs)];
-          pendingPostFlushCbs.length = 0;
-          // #1947 already has active queue, nested flushPostFlushCbs call
-          if (activePostFlushCbs) {
-              activePostFlushCbs.push(...deduped);
-              return;
-          }
-          activePostFlushCbs = deduped;
-          {
-              seen = seen || new Map();
-          }
-          activePostFlushCbs.sort((a, b) => getId(a) - getId(b));
-          for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
-              {
-                  checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex]);
-              }
-              activePostFlushCbs[postFlushIndex]();
-          }
-          activePostFlushCbs = null;
-          postFlushIndex = 0;
-      }
-  }
-  const getId = (job) => job.id == null ? Infinity : job.id;
-  function flushJobs(seen) {
-      isFlushPending = false;
-      isFlushing = true;
-      {
-          seen = seen || new Map();
-      }
-      flushPreFlushCbs(seen);
-      // Sort queue before flush.
-      // This ensures that:
-      // 1. Components are updated from parent to child. (because parent is always
-      //    created before the child so its render effect will have smaller
-      //    priority number)
-      // 2. If a component is unmounted during a parent component's update,
-      //    its update can be skipped.
-      queue.sort((a, b) => getId(a) - getId(b));
-      try {
-          for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
-              const job = queue[flushIndex];
-              if (job) {
-                  if (true) {
-                      checkRecursiveUpdates(seen, job);
-                  }
-                  callWithErrorHandling(job, null, 14 /* SCHEDULER */);
-              }
-          }
-      }
-      finally {
-          flushIndex = 0;
-          queue.length = 0;
-          flushPostFlushCbs(seen);
-          isFlushing = false;
-          currentFlushPromise = null;
-          // some postFlushCb queued jobs!
-          // keep flushing until it drains.
-          if (queue.length || pendingPostFlushCbs.length) {
-              flushJobs(seen);
-          }
-      }
-  }
-  function checkRecursiveUpdates(seen, fn) {
-      if (!seen.has(fn)) {
-          seen.set(fn, 1);
-      }
-      else {
-          const count = seen.get(fn);
-          if (count > RECURSION_LIMIT) {
-              throw new Error(`Maximum recursive updates exceeded. ` +
-                  `This means you have a reactive effect that is mutating its own ` +
-                  `dependencies and thus recursively triggering itself. Possible sources ` +
-                  `include component template, render function, updated hook or ` +
-                  `watcher source function.`);
-          }
-          else {
-              seen.set(fn, count + 1);
-          }
-      }
-  }
-
-  /* eslint-disable no-restricted-globals */
-  let isHmrUpdating = false;
-  const hmrDirtyComponents = new Set();
-  // Expose the HMR runtime on the global object
-  // This makes it entirely tree-shakable without polluting the exports and makes
-  // it easier to be used in toolings like vue-loader
-  // Note: for a component to be eligible for HMR it also needs the __hmrId option
-  // to be set so that its instances can be registered / removed.
-  {
-      const globalObject = typeof global !== 'undefined'
-          ? global
-          : typeof self !== 'undefined'
-              ? self
-              : typeof window !== 'undefined'
-                  ? window
-                  : {};
-      globalObject.__VUE_HMR_RUNTIME__ = {
-          createRecord: tryWrap(createRecord),
-          rerender: tryWrap(rerender),
-          reload: tryWrap(reload)
-      };
-  }
-  const map = new Map();
-  function registerHMR(instance) {
-      const id = instance.type.__hmrId;
-      let record = map.get(id);
-      if (!record) {
-          createRecord(id, instance.type);
-          record = map.get(id);
-      }
-      record.instances.add(instance);
-  }
-  function unregisterHMR(instance) {
-      map.get(instance.type.__hmrId).instances.delete(instance);
-  }
-  function createRecord(id, component) {
-      if (!component) {
-          warn(`HMR API usage is out of date.\n` +
-              `Please upgrade vue-loader/vite/rollup-plugin-vue or other relevant ` +
-              `depdendency that handles Vue SFC compilation.`);
-          component = {};
-      }
-      if (map.has(id)) {
-          return false;
-      }
-      map.set(id, {
-          component: isClassComponent(component) ? component.__vccOpts : component,
-          instances: new Set()
-      });
-      return true;
-  }
-  function rerender(id, newRender) {
-      const record = map.get(id);
-      if (!record)
-          return;
-      if (newRender)
-          record.component.render = newRender;
-      // Array.from creates a snapshot which avoids the set being mutated during
-      // updates
-      Array.from(record.instances).forEach(instance => {
-          if (newRender) {
-              instance.render = newRender;
-          }
-          instance.renderCache = [];
-          // this flag forces child components with slot content to update
-          isHmrUpdating = true;
-          instance.update();
-          isHmrUpdating = false;
-      });
-  }
-  function reload(id, newComp) {
-      const record = map.get(id);
-      if (!record)
-          return;
-      // Array.from creates a snapshot which avoids the set being mutated during
-      // updates
-      const { component, instances } = record;
-      if (!hmrDirtyComponents.has(component)) {
-          // 1. Update existing comp definition to match new one
-          newComp = isClassComponent(newComp) ? newComp.__vccOpts : newComp;
-          extend(component, newComp);
-          for (const key in component) {
-              if (!(key in newComp)) {
-                  delete component[key];
-              }
-          }
-          // 2. Mark component dirty. This forces the renderer to replace the component
-          // on patch.
-          hmrDirtyComponents.add(component);
-          // 3. Make sure to unmark the component after the reload.
-          queuePostFlushCb(() => {
-              hmrDirtyComponents.delete(component);
-          });
-      }
-      Array.from(instances).forEach(instance => {
-          if (instance.parent) {
-              // 4. Force the parent instance to re-render. This will cause all updated
-              // components to be unmounted and re-mounted. Queue the update so that we
-              // don't end up forcing the same parent to re-render multiple times.
-              queueJob(instance.parent.update);
-          }
-          else if (instance.appContext.reload) {
-              // root instance mounted via createApp() has a reload method
-              instance.appContext.reload();
-          }
-          else if (typeof window !== 'undefined') {
-              // root instance inside tree created via raw render(). Force reload.
-              window.location.reload();
-          }
-          else {
-              console.warn('[HMR] Root or manually mounted instance modified. Full reload required.');
-          }
-      });
-  }
-  function tryWrap(fn) {
-      return (id, arg) => {
-          try {
-              return fn(id, arg);
-          }
-          catch (e) {
-              console.error(e);
-              console.warn(`[HMR] Something went wrong during Vue component hot-reload. ` +
-                  `Full reload required.`);
-          }
-      };
-  }
-
-  function setDevtoolsHook(hook) {
-      exports.devtools = hook;
-  }
-  function devtoolsInitApp(app, version) {
-      // TODO queue if devtools is undefined
-      if (!exports.devtools)
-          return;
-      exports.devtools.emit("app:init" /* APP_INIT */, app, version, {
-          Fragment,
-          Text,
-          Comment,
-          Static
-      });
-  }
-  function devtoolsUnmountApp(app) {
-      if (!exports.devtools)
-          return;
-      exports.devtools.emit("app:unmount" /* APP_UNMOUNT */, app);
-  }
-  const devtoolsComponentAdded = /*#__PURE__*/ createDevtoolsComponentHook("component:added" /* COMPONENT_ADDED */);
-  const devtoolsComponentUpdated = /*#__PURE__*/ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */);
-  const devtoolsComponentRemoved = /*#__PURE__*/ createDevtoolsComponentHook("component:removed" /* COMPONENT_REMOVED */);
-  function createDevtoolsComponentHook(hook) {
-      return (component) => {
-          if (!exports.devtools)
-              return;
-          exports.devtools.emit(hook, component.appContext.app, component.uid, component.parent ? component.parent.uid : undefined, component);
-      };
-  }
-  function devtoolsComponentEmit(component, event, params) {
-      if (!exports.devtools)
-          return;
-      exports.devtools.emit("component:emit" /* COMPONENT_EMIT */, component.appContext.app, component, event, params);
-  }
-
-  function emit(instance, event, ...rawArgs) {
-      const props = instance.vnode.props || EMPTY_OBJ;
-      {
-          const { emitsOptions, propsOptions: [propsOptions] } = instance;
-          if (emitsOptions) {
-              if (!(event in emitsOptions)) {
-                  if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
-                      warn(`Component emitted event "${event}" but it is neither declared in ` +
-                          `the emits option nor as an "${toHandlerKey(event)}" prop.`);
-                  }
-              }
-              else {
-                  const validator = emitsOptions[event];
-                  if (isFunction(validator)) {
-                      const isValid = validator(...rawArgs);
-                      if (!isValid) {
-                          warn(`Invalid event arguments: event validation failed for event "${event}".`);
-                      }
-                  }
-              }
-          }
-      }
-      let args = rawArgs;
-      const isModelListener = event.startsWith('update:');
-      // for v-model update:xxx events, apply modifiers on args
-      const modelArg = isModelListener && event.slice(7);
-      if (modelArg && modelArg in props) {
-          const modifiersKey = `${modelArg === 'modelValue' ? 'model' : modelArg}Modifiers`;
-          const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
-          if (trim) {
-              args = rawArgs.map(a => a.trim());
-          }
-          else if (number) {
-              args = rawArgs.map(toNumber);
-          }
-      }
-      {
-          devtoolsComponentEmit(instance, event, args);
-      }
-      {
-          const lowerCaseEvent = event.toLowerCase();
-          if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
-              warn(`Event "${lowerCaseEvent}" is emitted in component ` +
-                  `${formatComponentName(instance, instance.type)} but the handler is registered for "${event}". ` +
-                  `Note that HTML attributes are case-insensitive and you cannot use ` +
-                  `v-on to listen to camelCase events when using in-DOM templates. ` +
-                  `You should probably use "${hyphenate(event)}" instead of "${event}".`);
-          }
-      }
-      // convert handler name to camelCase. See issue #2249
-      let handlerName = toHandlerKey(camelize(event));
-      let handler = props[handlerName];
-      // for v-model update:xxx events, also trigger kebab-case equivalent
-      // for props passed via kebab-case
-      if (!handler && isModelListener) {
-          handlerName = toHandlerKey(hyphenate(event));
-          handler = props[handlerName];
-      }
-      if (handler) {
-          callWithAsyncErrorHandling(handler, instance, 6 /* COMPONENT_EVENT_HANDLER */, args);
-      }
-      const onceHandler = props[handlerName + `Once`];
-      if (onceHandler) {
-          if (!instance.emitted) {
-              (instance.emitted = {})[handlerName] = true;
-          }
-          else if (instance.emitted[handlerName]) {
-              return;
-          }
-          callWithAsyncErrorHandling(onceHandler, instance, 6 /* COMPONENT_EVENT_HANDLER */, args);
-      }
-  }
-  function normalizeEmitsOptions(comp, appContext, asMixin = false) {
-      if (!appContext.deopt && comp.__emits !== undefined) {
-          return comp.__emits;
-      }
-      const raw = comp.emits;
-      let normalized = {};
-      // apply mixin/extends props
-      let hasExtends = false;
-      if ( !isFunction(comp)) {
-          const extendEmits = (raw) => {
-              hasExtends = true;
-              extend(normalized, normalizeEmitsOptions(raw, appContext, true));
-          };
-          if (!asMixin && appContext.mixins.length) {
-              appContext.mixins.forEach(extendEmits);
-          }
-          if (comp.extends) {
-              extendEmits(comp.extends);
-          }
-          if (comp.mixins) {
-              comp.mixins.forEach(extendEmits);
-          }
-      }
-      if (!raw && !hasExtends) {
-          return (comp.__emits = null);
-      }
-      if (isArray(raw)) {
-          raw.forEach(key => (normalized[key] = null));
-      }
-      else {
-          extend(normalized, raw);
-      }
-      return (comp.__emits = normalized);
-  }
-  // Check if an incoming prop key is a declared emit event listener.
-  // e.g. With `emits: { click: null }`, props named `onClick` and `onclick` are
-  // both considered matched listeners.
-  function isEmitListener(options, key) {
-      if (!options || !isOn(key)) {
-          return false;
-      }
-      key = key.slice(2).replace(/Once$/, '');
-      return (hasOwn(options, key[0].toLowerCase() + key.slice(1)) ||
-          hasOwn(options, hyphenate(key)) ||
-          hasOwn(options, key));
-  }
-
-  /**
-   * mark the current rendering instance for asset resolution (e.g.
-   * resolveComponent, resolveDirective) during render
-   */
-  let currentRenderingInstance = null;
-  function setCurrentRenderingInstance(instance) {
-      currentRenderingInstance = instance;
-  }
-  /**
-   * dev only flag to track whether $attrs was used during render.
-   * If $attrs was used during render then the warning for failed attrs
-   * fallthrough can be suppressed.
-   */
-  let accessedAttrs = false;
-  function markAttrsAccessed() {
-      accessedAttrs = true;
-  }
-  function renderComponentRoot(instance) {
-      const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, data, setupState, ctx } = instance;
-      let result;
-      currentRenderingInstance = instance;
-      {
-          accessedAttrs = false;
-      }
-      try {
-          let fallthroughAttrs;
-          if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) {
-              // withProxy is a proxy with a different `has` trap only for
-              // runtime-compiled render functions using `with` block.
-              const proxyToUse = withProxy || proxy;
-              result = normalizeVNode(render.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx));
-              fallthroughAttrs = attrs;
-          }
-          else {
-              // functional
-              const render = Component;
-              // in dev, mark attrs accessed if optional props (attrs === props)
-              if (true && attrs === props) {
-                  markAttrsAccessed();
-              }
-              result = normalizeVNode(render.length > 1
-                  ? render(props, true
-                      ? {
-                          get attrs() {
-                              markAttrsAccessed();
-                              return attrs;
-                          },
-                          slots,
-                          emit
-                      }
-                      : { attrs, slots, emit })
-                  : render(props, null /* we know it doesn't need it */));
-              fallthroughAttrs = Component.props
-                  ? attrs
-                  : getFunctionalFallthrough(attrs);
-          }
-          // attr merging
-          // in dev mode, comments are preserved, and it's possible for a template
-          // to have comments along side the root element which makes it a fragment
-          let root = result;
-          let setRoot = undefined;
-          if (true && result.patchFlag & 2048 /* DEV_ROOT_FRAGMENT */) {
-              ;
-              [root, setRoot] = getChildRoot(result);
-          }
-          if (Component.inheritAttrs !== false && fallthroughAttrs) {
-              const keys = Object.keys(fallthroughAttrs);
-              const { shapeFlag } = root;
-              if (keys.length) {
-                  if (shapeFlag & 1 /* ELEMENT */ ||
-                      shapeFlag & 6 /* COMPONENT */) {
-                      if (propsOptions && keys.some(isModelListener)) {
-                          // If a v-model listener (onUpdate:xxx) has a corresponding declared
-                          // prop, it indicates this component expects to handle v-model and
-                          // it should not fallthrough.
-                          // related: #1543, #1643, #1989
-                          fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions);
-                      }
-                      root = cloneVNode(root, fallthroughAttrs);
-                  }
-                  else if (true && !accessedAttrs && root.type !== Comment) {
-                      const allAttrs = Object.keys(attrs);
-                      const eventAttrs = [];
-                      const extraAttrs = [];
-                      for (let i = 0, l = allAttrs.length; i < l; i++) {
-                          const key = allAttrs[i];
-                          if (isOn(key)) {
-                              // ignore v-model handlers when they fail to fallthrough
-                              if (!isModelListener(key)) {
-                                  // remove `on`, lowercase first letter to reflect event casing
-                                  // accurately
-                                  eventAttrs.push(key[2].toLowerCase() + key.slice(3));
-                              }
-                          }
-                          else {
-                              extraAttrs.push(key);
-                          }
-                      }
-                      if (extraAttrs.length) {
-                          warn(`Extraneous non-props attributes (` +
-                              `${extraAttrs.join(', ')}) ` +
-                              `were passed to component but could not be automatically inherited ` +
-                              `because component renders fragment or text root nodes.`);
-                      }
-                      if (eventAttrs.length) {
-                          warn(`Extraneous non-emits event listeners (` +
-                              `${eventAttrs.join(', ')}) ` +
-                              `were passed to component but could not be automatically inherited ` +
-                              `because component renders fragment or text root nodes. ` +
-                              `If the listener is intended to be a component custom event listener only, ` +
-                              `declare it using the "emits" option.`);
-                      }
-                  }
-              }
-          }
-          // inherit directives
-          if (vnode.dirs) {
-              if (true && !isElementRoot(root)) {
-                  warn(`Runtime directive used on component with non-element root node. ` +
-                      `The directives will not function as intended.`);
-              }
-              root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
-          }
-          // inherit transition data
-          if (vnode.transition) {
-              if (true && !isElementRoot(root)) {
-                  warn(`Component inside <Transition> renders non-element root node ` +
-                      `that cannot be animated.`);
-              }
-              root.transition = vnode.transition;
-          }
-          if (true && setRoot) {
-              setRoot(root);
-          }
-          else {
-              result = root;
-          }
-      }
-      catch (err) {
-          handleError(err, instance, 1 /* RENDER_FUNCTION */);
-          result = createVNode(Comment);
-      }
-      currentRenderingInstance = null;
-      return result;
-  }
-  /**
-   * dev only
-   * In dev mode, template root level comments are rendered, which turns the
-   * template into a fragment root, but we need to locate the single element
-   * root for attrs and scope id processing.
-   */
-  const getChildRoot = (vnode) => {
-      const rawChildren = vnode.children;
-      const dynamicChildren = vnode.dynamicChildren;
-      const childRoot = filterSingleRoot(rawChildren);
-      if (!childRoot) {
-          return [vnode, undefined];
-      }
-      const index = rawChildren.indexOf(childRoot);
-      const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
-      const setRoot = (updatedRoot) => {
-          rawChildren[index] = updatedRoot;
-          if (dynamicChildren) {
-              if (dynamicIndex > -1) {
-                  dynamicChildren[dynamicIndex] = updatedRoot;
-              }
-              else if (updatedRoot.patchFlag > 0) {
-                  vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
-              }
-          }
-      };
-      return [normalizeVNode(childRoot), setRoot];
-  };
-  function filterSingleRoot(children) {
-      let singleRoot;
-      for (let i = 0; i < children.length; i++) {
-          const child = children[i];
-          if (isVNode(child)) {
-              // ignore user comment
-              if (child.type !== Comment || child.children === 'v-if') {
-                  if (singleRoot) {
-                      // has more than 1 non-comment child, return now
-                      return;
-                  }
-                  else {
-                      singleRoot = child;
-                  }
-              }
-          }
-          else {
-              return;
-          }
-      }
-      return singleRoot;
-  }
-  const getFunctionalFallthrough = (attrs) => {
-      let res;
-      for (const key in attrs) {
-          if (key === 'class' || key === 'style' || isOn(key)) {
-              (res || (res = {}))[key] = attrs[key];
-          }
-      }
-      return res;
-  };
-  const filterModelListeners = (attrs, props) => {
-      const res = {};
-      for (const key in attrs) {
-          if (!isModelListener(key) || !(key.slice(9) in props)) {
-              res[key] = attrs[key];
-          }
-      }
-      return res;
-  };
-  const isElementRoot = (vnode) => {
-      return (vnode.shapeFlag & 6 /* COMPONENT */ ||
-          vnode.shapeFlag & 1 /* ELEMENT */ ||
-          vnode.type === Comment // potential v-if branch switch
-      );
-  };
-  function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
-      const { props: prevProps, children: prevChildren, component } = prevVNode;
-      const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
-      const emits = component.emitsOptions;
-      // Parent component's render function was hot-updated. Since this may have
-      // caused the child component's slots content to have changed, we need to
-      // force the child to update as well.
-      if ( (prevChildren || nextChildren) && isHmrUpdating) {
-          return true;
-      }
-      // force child update for runtime directive or transition on component vnode.
-      if (nextVNode.dirs || nextVNode.transition) {
-          return true;
-      }
-      if (optimized && patchFlag >= 0) {
-          if (patchFlag & 1024 /* DYNAMIC_SLOTS */) {
-              // slot content that references values that might have changed,
-              // e.g. in a v-for
-              return true;
-          }
-          if (patchFlag & 16 /* FULL_PROPS */) {
-              if (!prevProps) {
-                  return !!nextProps;
-              }
-              // presence of this flag indicates props are always non-null
-              return hasPropsChanged(prevProps, nextProps, emits);
-          }
-          else if (patchFlag & 8 /* PROPS */) {
-              const dynamicProps = nextVNode.dynamicProps;
-              for (let i = 0; i < dynamicProps.length; i++) {
-                  const key = dynamicProps[i];
-                  if (nextProps[key] !== prevProps[key] &&
-                      !isEmitListener(emits, key)) {
-                      return true;
-                  }
-              }
-          }
-      }
-      else {
-          // this path is only taken by manually written render functions
-          // so presence of any children leads to a forced update
-          if (prevChildren || nextChildren) {
-              if (!nextChildren || !nextChildren.$stable) {
-                  return true;
-              }
-          }
-          if (prevProps === nextProps) {
-              return false;
-          }
-          if (!prevProps) {
-              return !!nextProps;
-          }
-          if (!nextProps) {
-              return true;
-          }
-          return hasPropsChanged(prevProps, nextProps, emits);
-      }
-      return false;
-  }
-  function hasPropsChanged(prevProps, nextProps, emitsOptions) {
-      const nextKeys = Object.keys(nextProps);
-      if (nextKeys.length !== Object.keys(prevProps).length) {
-          return true;
-      }
-      for (let i = 0; i < nextKeys.length; i++) {
-          const key = nextKeys[i];
-          if (nextProps[key] !== prevProps[key] &&
-              !isEmitListener(emitsOptions, key)) {
-              return true;
-          }
-      }
-      return false;
-  }
-  function updateHOCHostEl({ vnode, parent }, el // HostNode
-  ) {
-      while (parent && parent.subTree === vnode) {
-          (vnode = parent.vnode).el = el;
-          parent = parent.parent;
-      }
-  }
-
-  const isSuspense = (type) => type.__isSuspense;
-  // Suspense exposes a component-like API, and is treated like a component
-  // in the compiler, but internally it's a special built-in type that hooks
-  // directly into the renderer.
-  const SuspenseImpl = {
-      // In order to make Suspense tree-shakable, we need to avoid importing it
-      // directly in the renderer. The renderer checks for the __isSuspense flag
-      // on a vnode's type and calls the `process` method, passing in renderer
-      // internals.
-      __isSuspense: true,
-      process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized,
-      // platform-specific impl passed from renderer
-      rendererInternals) {
-          if (n1 == null) {
-              mountSuspense(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, rendererInternals);
-          }
-          else {
-              patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, rendererInternals);
-          }
-      },
-      hydrate: hydrateSuspense,
-      create: createSuspenseBoundary
-  };
-  // Force-casted public typing for h and TSX props inference
-  const Suspense = ( SuspenseImpl
-      );
-  function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, optimized, rendererInternals) {
-      const { p: patch, o: { createElement } } = rendererInternals;
-      const hiddenContainer = createElement('div');
-      const suspense = (vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, optimized, rendererInternals));
-      // start mounting the content subtree in an off-dom container
-      patch(null, (suspense.pendingBranch = vnode.ssContent), hiddenContainer, null, parentComponent, suspense, isSVG);
-      // now check if we have encountered any async deps
-      if (suspense.deps > 0) {
-          // has async
-          // mount the fallback tree
-          patch(null, vnode.ssFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context
-          isSVG);
-          setActiveBranch(suspense, vnode.ssFallback);
-      }
-      else {
-          // Suspense has no async deps. Just resolve.
-          suspense.resolve();
-      }
-  }
-  function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, { p: patch, um: unmount, o: { createElement } }) {
-      const suspense = (n2.suspense = n1.suspense);
-      suspense.vnode = n2;
-      n2.el = n1.el;
-      const newBranch = n2.ssContent;
-      const newFallback = n2.ssFallback;
-      const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
-      if (pendingBranch) {
-          suspense.pendingBranch = newBranch;
-          if (isSameVNodeType(newBranch, pendingBranch)) {
-              // same root type but content may have changed.
-              patch(pendingBranch, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
-              if (suspense.deps <= 0) {
-                  suspense.resolve();
-              }
-              else if (isInFallback) {
-                  patch(activeBranch, newFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context
-                  isSVG);
-                  setActiveBranch(suspense, newFallback);
-              }
-          }
-          else {
-              // toggled before pending tree is resolved
-              suspense.pendingId++;
-              if (isHydrating) {
-                  // if toggled before hydration is finished, the current DOM tree is
-                  // no longer valid. set it as the active branch so it will be unmounted
-                  // when resolved
-                  suspense.isHydrating = false;
-                  suspense.activeBranch = pendingBranch;
-              }
-              else {
-                  unmount(pendingBranch, parentComponent, suspense);
-              }
-              // increment pending ID. this is used to invalidate async callbacks
-              // reset suspense state
-              suspense.deps = 0;
-              // discard effects from pending branch
-              suspense.effects.length = 0;
-              // discard previous container
-              suspense.hiddenContainer = createElement('div');
-              if (isInFallback) {
-                  // already in fallback state
-                  patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
-                  if (suspense.deps <= 0) {
-                      suspense.resolve();
-                  }
-                  else {
-                      patch(activeBranch, newFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context
-                      isSVG);
-                      setActiveBranch(suspense, newFallback);
-                  }
-              }
-              else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
-                  // toggled "back" to current active branch
-                  patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG);
-                  // force resolve
-                  suspense.resolve(true);
-              }
-              else {
-                  // switched to a 3rd branch
-                  patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
-                  if (suspense.deps <= 0) {
-                      suspense.resolve();
-                  }
-              }
-          }
-      }
-      else {
-          if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
-              // root did not change, just normal patch
-              patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG);
-              setActiveBranch(suspense, newBranch);
-          }
-          else {
-              // root node toggled
-              // invoke @pending event
-              const onPending = n2.props && n2.props.onPending;
-              if (isFunction(onPending)) {
-                  onPending();
-              }
-              // mount pending branch in off-dom container
-              suspense.pendingBranch = newBranch;
-              suspense.pendingId++;
-              patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
-              if (suspense.deps <= 0) {
-                  // incoming branch has no async deps, resolve now.
-                  suspense.resolve();
-              }
-              else {
-                  const { timeout, pendingId } = suspense;
-                  if (timeout > 0) {
-                      setTimeout(() => {
-                          if (suspense.pendingId === pendingId) {
-                              suspense.fallback(newFallback);
-                          }
-                      }, timeout);
-                  }
-                  else if (timeout === 0) {
-                      suspense.fallback(newFallback);
-                  }
-              }
-          }
-      }
-  }
-  let hasWarned = false;
-  function createSuspenseBoundary(vnode, parent, parentComponent, container, hiddenContainer, anchor, isSVG, optimized, rendererInternals, isHydrating = false) {
-      /* istanbul ignore if */
-      if ( !hasWarned) {
-          hasWarned = true;
-          // @ts-ignore `console.info` cannot be null error
-          console[console.info ? 'info' : 'log'](`<Suspense> is an experimental feature and its API will likely change.`);
-      }
-      const { p: patch, m: move, um: unmount, n: next, o: { parentNode, remove } } = rendererInternals;
-      const timeout = toNumber(vnode.props && vnode.props.timeout);
-      const suspense = {
-          vnode,
-          parent,
-          parentComponent,
-          isSVG,
-          container,
-          hiddenContainer,
-          anchor,
-          deps: 0,
-          pendingId: 0,
-          timeout: typeof timeout === 'number' ? timeout : -1,
-          activeBranch: null,
-          pendingBranch: null,
-          isInFallback: true,
-          isHydrating,
-          isUnmounted: false,
-          effects: [],
-          resolve(resume = false) {
-              {
-                  if (!resume && !suspense.pendingBranch) {
-                      throw new Error(`suspense.resolve() is called without a pending branch.`);
-                  }
-                  if (suspense.isUnmounted) {
-                      throw new Error(`suspense.resolve() is called on an already unmounted suspense boundary.`);
-                  }
-              }
-              const { vnode, activeBranch, pendingBranch, pendingId, effects, parentComponent, container } = suspense;
-              if (suspense.isHydrating) {
-                  suspense.isHydrating = false;
-              }
-              else if (!resume) {
-                  const delayEnter = activeBranch &&
-                      pendingBranch.transition &&
-                      pendingBranch.transition.mode === 'out-in';
-                  if (delayEnter) {
-                      activeBranch.transition.afterLeave = () => {
-                          if (pendingId === suspense.pendingId) {
-                              move(pendingBranch, container, anchor, 0 /* ENTER */);
-                          }
-                      };
-                  }
-                  // this is initial anchor on mount
-                  let { anchor } = suspense;
-                  // unmount current active tree
-                  if (activeBranch) {
-                      // if the fallback tree was mounted, it may have been moved
-                      // as part of a parent suspense. get the latest anchor for insertion
-                      anchor = next(activeBranch);
-                      unmount(activeBranch, parentComponent, suspense, true);
-                  }
-                  if (!delayEnter) {
-                      // move content from off-dom container to actual container
-                      move(pendingBranch, container, anchor, 0 /* ENTER */);
-                  }
-              }
-              setActiveBranch(suspense, pendingBranch);
-              suspense.pendingBranch = null;
-              suspense.isInFallback = false;
-              // flush buffered effects
-              // check if there is a pending parent suspense
-              let parent = suspense.parent;
-              let hasUnresolvedAncestor = false;
-              while (parent) {
-                  if (parent.pendingBranch) {
-                      // found a pending parent suspense, merge buffered post jobs
-                      // into that parent
-                      parent.effects.push(...effects);
-                      hasUnresolvedAncestor = true;
-                      break;
-                  }
-                  parent = parent.parent;
-              }
-              // no pending parent suspense, flush all jobs
-              if (!hasUnresolvedAncestor) {
-                  queuePostFlushCb(effects);
-              }
-              suspense.effects = [];
-              // invoke @resolve event
-              const onResolve = vnode.props && vnode.props.onResolve;
-              if (isFunction(onResolve)) {
-                  onResolve();
-              }
-          },
-          fallback(fallbackVNode) {
-              if (!suspense.pendingBranch) {
-                  return;
-              }
-              const { vnode, activeBranch, parentComponent, container, isSVG } = suspense;
-              // invoke @fallback event
-              const onFallback = vnode.props && vnode.props.onFallback;
-              if (isFunction(onFallback)) {
-                  onFallback();
-              }
-              const anchor = next(activeBranch);
-              const mountFallback = () => {
-                  if (!suspense.isInFallback) {
-                      return;
-                  }
-                  // mount the fallback tree
-                  patch(null, fallbackVNode, container, anchor, parentComponent, null, // fallback tree will not have suspense context
-                  isSVG);
-                  setActiveBranch(suspense, fallbackVNode);
-              };
-              const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === 'out-in';
-              if (delayEnter) {
-                  activeBranch.transition.afterLeave = mountFallback;
-              }
-              // unmount current active branch
-              unmount(activeBranch, parentComponent, null, // no suspense so unmount hooks fire now
-              true // shouldRemove
-              );
-              suspense.isInFallback = true;
-              if (!delayEnter) {
-                  mountFallback();
-              }
-          },
-          move(container, anchor, type) {
-              suspense.activeBranch &&
-                  move(suspense.activeBranch, container, anchor, type);
-              suspense.container = container;
-          },
-          next() {
-              return suspense.activeBranch && next(suspense.activeBranch);
-          },
-          registerDep(instance, setupRenderEffect) {
-              const isInPendingSuspense = !!suspense.pendingBranch;
-              if (isInPendingSuspense) {
-                  suspense.deps++;
-              }
-              const hydratedEl = instance.vnode.el;
-              instance
-                  .asyncDep.catch(err => {
-                  handleError(err, instance, 0 /* SETUP_FUNCTION */);
-              })
-                  .then(asyncSetupResult => {
-                  // retry when the setup() promise resolves.
-                  // component may have been unmounted before resolve.
-                  if (instance.isUnmounted ||
-                      suspense.isUnmounted ||
-                      suspense.pendingId !== instance.suspenseId) {
-                      return;
-                  }
-                  // retry from this component
-                  instance.asyncResolved = true;
-                  const { vnode } = instance;
-                  {
-                      pushWarningContext(vnode);
-                  }
-                  handleSetupResult(instance, asyncSetupResult);
-                  if (hydratedEl) {
-                      // vnode may have been replaced if an update happened before the
-                      // async dep is resolved.
-                      vnode.el = hydratedEl;
-                  }
-                  const placeholder = !hydratedEl && instance.subTree.el;
-                  setupRenderEffect(instance, vnode,
-                  // component may have been moved before resolve.
-                  // if this is not a hydration, instance.subTree will be the comment
-                  // placeholder.
-                  parentNode(hydratedEl || instance.subTree.el),
-                  // anchor will not be used if this is hydration, so only need to
-                  // consider the comment placeholder case.
-                  hydratedEl ? null : next(instance.subTree), suspense, isSVG, optimized);
-                  if (placeholder) {
-                      remove(placeholder);
-                  }
-                  updateHOCHostEl(instance, vnode.el);
-                  {
-                      popWarningContext();
-                  }
-                  // only decrease deps count if suspense is not already resolved
-                  if (isInPendingSuspense && --suspense.deps === 0) {
-                      suspense.resolve();
-                  }
-              });
-          },
-          unmount(parentSuspense, doRemove) {
-              suspense.isUnmounted = true;
-              if (suspense.activeBranch) {
-                  unmount(suspense.activeBranch, parentComponent, parentSuspense, doRemove);
-              }
-              if (suspense.pendingBranch) {
-                  unmount(suspense.pendingBranch, parentComponent, parentSuspense, doRemove);
-              }
-          }
-      };
-      return suspense;
-  }
-  function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, optimized, rendererInternals, hydrateNode) {
-      /* eslint-disable no-restricted-globals */
-      const suspense = (vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, node.parentNode, document.createElement('div'), null, isSVG, optimized, rendererInternals, true /* hydrating */));
-      // there are two possible scenarios for server-rendered suspense:
-      // - success: ssr content should be fully resolved
-      // - failure: ssr content should be the fallback branch.
-      // however, on the client we don't really know if it has failed or not
-      // attempt to hydrate the DOM assuming it has succeeded, but we still
-      // need to construct a suspense boundary first
-      const result = hydrateNode(node, (suspense.pendingBranch = vnode.ssContent), parentComponent, suspense, optimized);
-      if (suspense.deps === 0) {
-          suspense.resolve();
-      }
-      return result;
-      /* eslint-enable no-restricted-globals */
-  }
-  function normalizeSuspenseChildren(vnode) {
-      const { shapeFlag, children } = vnode;
-      let content;
-      let fallback;
-      if (shapeFlag & 32 /* SLOTS_CHILDREN */) {
-          content = normalizeSuspenseSlot(children.default);
-          fallback = normalizeSuspenseSlot(children.fallback);
-      }
-      else {
-          content = normalizeSuspenseSlot(children);
-          fallback = normalizeVNode(null);
-      }
-      return {
-          content,
-          fallback
-      };
-  }
-  function normalizeSuspenseSlot(s) {
-      if (isFunction(s)) {
-          s = s();
-      }
-      if (isArray(s)) {
-          const singleChild = filterSingleRoot(s);
-          if ( !singleChild) {
-              warn(`<Suspense> slots expect a single root node.`);
-          }
-          s = singleChild;
-      }
-      return normalizeVNode(s);
-  }
-  function queueEffectWithSuspense(fn, suspense) {
-      if (suspense && suspense.pendingBranch) {
-          if (isArray(fn)) {
-              suspense.effects.push(...fn);
-          }
-          else {
-              suspense.effects.push(fn);
-          }
-      }
-      else {
-          queuePostFlushCb(fn);
-      }
-  }
-  function setActiveBranch(suspense, branch) {
-      suspense.activeBranch = branch;
-      const { vnode, parentComponent } = suspense;
-      const el = (vnode.el = branch.el);
-      // in case suspense is the root node of a component,
-      // recursively update the HOC el
-      if (parentComponent && parentComponent.subTree === vnode) {
-          parentComponent.vnode.el = el;
-          updateHOCHostEl(parentComponent, el);
-      }
-  }
-
-  let isRenderingCompiledSlot = 0;
-  const setCompiledSlotRendering = (n) => (isRenderingCompiledSlot += n);
-  /**
-   * Compiler runtime helper for rendering `<slot/>`
-   * @private
-   */
-  function renderSlot(slots, name, props = {},
-  // this is not a user-facing function, so the fallback is always generated by
-  // the compiler and guaranteed to be a function returning an array
-  fallback) {
-      let slot = slots[name];
-      if ( slot && slot.length > 1) {
-          warn(`SSR-optimized slot function detected in a non-SSR-optimized render ` +
-              `function. You need to mark this component with $dynamic-slots in the ` +
-              `parent template.`);
-          slot = () => [];
-      }
-      // a compiled slot disables block tracking by default to avoid manual
-      // invocation interfering with template-based block tracking, but in
-      // `renderSlot` we can be sure that it's template-based so we can force
-      // enable it.
-      isRenderingCompiledSlot++;
-      openBlock();
-      const validSlotContent = slot && ensureValidVNode(slot(props));
-      const rendered = createBlock(Fragment, { key: props.key || `_${name}` }, validSlotContent || (fallback ? fallback() : []), validSlotContent && slots._ === 1 /* STABLE */
-          ? 64 /* STABLE_FRAGMENT */
-          : -2 /* BAIL */);
-      isRenderingCompiledSlot--;
-      return rendered;
-  }
-  function ensureValidVNode(vnodes) {
-      return vnodes.some(child => {
-          if (!isVNode(child))
-              return true;
-          if (child.type === Comment)
-              return false;
-          if (child.type === Fragment &&
-              !ensureValidVNode(child.children))
-              return false;
-          return true;
-      })
-          ? vnodes
-          : null;
-  }
-
-  /**
-   * Wrap a slot function to memoize current rendering instance
-   * @private
-   */
-  function withCtx(fn, ctx = currentRenderingInstance) {
-      if (!ctx)
-          return fn;
-      const renderFnWithContext = (...args) => {
-          // If a user calls a compiled slot inside a template expression (#1745), it
-          // can mess up block tracking, so by default we need to push a null block to
-          // avoid that. This isn't necessary if rendering a compiled `<slot>`.
-          if (!isRenderingCompiledSlot) {
-              openBlock(true /* null block that disables tracking */);
-          }
-          const owner = currentRenderingInstance;
-          setCurrentRenderingInstance(ctx);
-          const res = fn(...args);
-          setCurrentRenderingInstance(owner);
-          if (!isRenderingCompiledSlot) {
-              closeBlock();
-          }
-          return res;
-      };
-      renderFnWithContext._c = true;
-      return renderFnWithContext;
-  }
-
-  // SFC scoped style ID management.
-  let currentScopeId = null;
-  const scopeIdStack = [];
-  /**
-   * @private
-   */
-  function pushScopeId(id) {
-      scopeIdStack.push((currentScopeId = id));
-  }
-  /**
-   * @private
-   */
-  function popScopeId() {
-      scopeIdStack.pop();
-      currentScopeId = scopeIdStack[scopeIdStack.length - 1] || null;
-  }
-  /**
-   * @private
-   */
-  function withScopeId(id) {
-      return ((fn) => withCtx(function () {
-          pushScopeId(id);
-          const res = fn.apply(this, arguments);
-          popScopeId();
-          return res;
-      }));
-  }
-
-  function initProps(instance, rawProps, isStateful, // result of bitwise flag comparison
-  isSSR = false) {
-      const props = {};
-      const attrs = {};
-      def(attrs, InternalObjectKey, 1);
-      setFullProps(instance, rawProps, props, attrs);
-      // validation
-      {
-          validateProps(props, instance);
-      }
-      if (isStateful) {
-          // stateful
-          instance.props = isSSR ? props : shallowReactive(props);
-      }
-      else {
-          if (!instance.type.props) {
-              // functional w/ optional props, props === attrs
-              instance.props = attrs;
-          }
-          else {
-              // functional w/ declared props
-              instance.props = props;
-          }
-      }
-      instance.attrs = attrs;
-  }
-  function updateProps(instance, rawProps, rawPrevProps, optimized) {
-      const { props, attrs, vnode: { patchFlag } } = instance;
-      const rawCurrentProps = toRaw(props);
-      const [options] = instance.propsOptions;
-      if (
-      // always force full diff in dev
-      // - #1942 if hmr is enabled with sfc component
-      // - vite#872 non-sfc component used by sfc component
-      !(
-          (instance.type.__hmrId ||
-              (instance.parent && instance.parent.type.__hmrId))) &&
-          (optimized || patchFlag > 0) &&
-          !(patchFlag & 16 /* FULL_PROPS */)) {
-          if (patchFlag & 8 /* PROPS */) {
-              // Compiler-generated props & no keys change, just set the updated
-              // the props.
-              const propsToUpdate = instance.vnode.dynamicProps;
-              for (let i = 0; i < propsToUpdate.length; i++) {
-                  const key = propsToUpdate[i];
-                  // PROPS flag guarantees rawProps to be non-null
-                  const value = rawProps[key];
-                  if (options) {
-                      // attr / props separation was done on init and will be consistent
-                      // in this code path, so just check if attrs have it.
-                      if (hasOwn(attrs, key)) {
-                          attrs[key] = value;
-                      }
-                      else {
-                          const camelizedKey = camelize(key);
-                          props[camelizedKey] = resolvePropValue(options, rawCurrentProps, camelizedKey, value, instance);
-                      }
-                  }
-                  else {
-                      attrs[key] = value;
-                  }
-              }
-          }
-      }
-      else {
-          // full props update.
-          setFullProps(instance, rawProps, props, attrs);
-          // in case of dynamic props, check if we need to delete keys from
-          // the props object
-          let kebabKey;
-          for (const key in rawCurrentProps) {
-              if (!rawProps ||
-                  // for camelCase
-                  (!hasOwn(rawProps, key) &&
-                      // it's possible the original props was passed in as kebab-case
-                      // and converted to camelCase (#955)
-                      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey)))) {
-                  if (options) {
-                      if (rawPrevProps &&
-                          // for camelCase
-                          (rawPrevProps[key] !== undefined ||
-                              // for kebab-case
-                              rawPrevProps[kebabKey] !== undefined)) {
-                          props[key] = resolvePropValue(options, rawProps || EMPTY_OBJ, key, undefined, instance);
-                      }
-                  }
-                  else {
-                      delete props[key];
-                  }
-              }
-          }
-          // in the case of functional component w/o props declaration, props and
-          // attrs point to the same object so it should already have been updated.
-          if (attrs !== rawCurrentProps) {
-              for (const key in attrs) {
-                  if (!rawProps || !hasOwn(rawProps, key)) {
-                      delete attrs[key];
-                  }
-              }
-          }
-      }
-      // trigger updates for $attrs in case it's used in component slots
-      trigger(instance, "set" /* SET */, '$attrs');
-      if ( rawProps) {
-          validateProps(props, instance);
-      }
-  }
-  function setFullProps(instance, rawProps, props, attrs) {
-      const [options, needCastKeys] = instance.propsOptions;
-      if (rawProps) {
-          for (const key in rawProps) {
-              const value = rawProps[key];
-              // key, ref are reserved and never passed down
-              if (isReservedProp(key)) {
-                  continue;
-              }
-              // prop option names are camelized during normalization, so to support
-              // kebab -> camel conversion here we need to camelize the key.
-              let camelKey;
-              if (options && hasOwn(options, (camelKey = camelize(key)))) {
-                  props[camelKey] = value;
-              }
-              else if (!isEmitListener(instance.emitsOptions, key)) {
-                  // Any non-declared (either as a prop or an emitted event) props are put
-                  // into a separate `attrs` object for spreading. Make sure to preserve
-                  // original key casing
-                  attrs[key] = value;
-              }
-          }
-      }
-      if (needCastKeys) {
-          const rawCurrentProps = toRaw(props);
-          for (let i = 0; i < needCastKeys.length; i++) {
-              const key = needCastKeys[i];
-              props[key] = resolvePropValue(options, rawCurrentProps, key, rawCurrentProps[key], instance);
-          }
-      }
-  }
-  function resolvePropValue(options, props, key, value, instance) {
-      const opt = options[key];
-      if (opt != null) {
-          const hasDefault = hasOwn(opt, 'default');
-          // default values
-          if (hasDefault && value === undefined) {
-              const defaultValue = opt.default;
-              if (opt.type !== Function && isFunction(defaultValue)) {
-                  setCurrentInstance(instance);
-                  value = defaultValue(props);
-                  setCurrentInstance(null);
-              }
-              else {
-                  value = defaultValue;
-              }
-          }
-          // boolean casting
-          if (opt[0 /* shouldCast */]) {
-              if (!hasOwn(props, key) && !hasDefault) {
-                  value = false;
-              }
-              else if (opt[1 /* shouldCastTrue */] &&
-                  (value === '' || value === hyphenate(key))) {
-                  value = true;
-              }
-          }
-      }
-      return value;
-  }
-  function normalizePropsOptions(comp, appContext, asMixin = false) {
-      if (!appContext.deopt && comp.__props) {
-          return comp.__props;
-      }
-      const raw = comp.props;
-      const normalized = {};
-      const needCastKeys = [];
-      // apply mixin/extends props
-      let hasExtends = false;
-      if ( !isFunction(comp)) {
-          const extendProps = (raw) => {
-              hasExtends = true;
-              const [props, keys] = normalizePropsOptions(raw, appContext, true);
-              extend(normalized, props);
-              if (keys)
-                  needCastKeys.push(...keys);
-          };
-          if (!asMixin && appContext.mixins.length) {
-              appContext.mixins.forEach(extendProps);
-          }
-          if (comp.extends) {
-              extendProps(comp.extends);
-          }
-          if (comp.mixins) {
-              comp.mixins.forEach(extendProps);
-          }
-      }
-      if (!raw && !hasExtends) {
-          return (comp.__props = EMPTY_ARR);
-      }
-      if (isArray(raw)) {
-          for (let i = 0; i < raw.length; i++) {
-              if ( !isString(raw[i])) {
-                  warn(`props must be strings when using array syntax.`, raw[i]);
-              }
-              const normalizedKey = camelize(raw[i]);
-              if (validatePropName(normalizedKey)) {
-                  normalized[normalizedKey] = EMPTY_OBJ;
-              }
-          }
-      }
-      else if (raw) {
-          if ( !isObject(raw)) {
-              warn(`invalid props options`, raw);
-          }
-          for (const key in raw) {
-              const normalizedKey = camelize(key);
-              if (validatePropName(normalizedKey)) {
-                  const opt = raw[key];
-                  const prop = (normalized[normalizedKey] =
-                      isArray(opt) || isFunction(opt) ? { type: opt } : opt);
-                  if (prop) {
-                      const booleanIndex = getTypeIndex(Boolean, prop.type);
-                      const stringIndex = getTypeIndex(String, prop.type);
-                      prop[0 /* shouldCast */] = booleanIndex > -1;
-                      prop[1 /* shouldCastTrue */] =
-                          stringIndex < 0 || booleanIndex < stringIndex;
-                      // if the prop needs boolean casting or default value
-                      if (booleanIndex > -1 || hasOwn(prop, 'default')) {
-                          needCastKeys.push(normalizedKey);
-                      }
-                  }
-              }
-          }
-      }
-      return (comp.__props = [normalized, needCastKeys]);
-  }
-  function validatePropName(key) {
-      if (key[0] !== '$') {
-          return true;
-      }
-      else {
-          warn(`Invalid prop name: "${key}" is a reserved property.`);
-      }
-      return false;
-  }
-  // use function string name to check type constructors
-  // so that it works across vms / iframes.
-  function getType(ctor) {
-      const match = ctor && ctor.toString().match(/^\s*function (\w+)/);
-      return match ? match[1] : '';
-  }
-  function isSameType(a, b) {
-      return getType(a) === getType(b);
-  }
-  function getTypeIndex(type, expectedTypes) {
-      if (isArray(expectedTypes)) {
-          for (let i = 0, len = expectedTypes.length; i < len; i++) {
-              if (isSameType(expectedTypes[i], type)) {
-                  return i;
-              }
-          }
-      }
-      else if (isFunction(expectedTypes)) {
-          return isSameType(expectedTypes, type) ? 0 : -1;
-      }
-      return -1;
-  }
-  /**
-   * dev only
-   */
-  function validateProps(props, instance) {
-      const rawValues = toRaw(props);
-      const options = instance.propsOptions[0];
-      for (const key in options) {
-          let opt = options[key];
-          if (opt == null)
-              continue;
-          validateProp(key, rawValues[key], opt, !hasOwn(rawValues, key));
-      }
-  }
-  /**
-   * dev only
-   */
-  function validateProp(name, value, prop, isAbsent) {
-      const { type, required, validator } = prop;
-      // required!
-      if (required && isAbsent) {
-          warn('Missing required prop: "' + name + '"');
-          return;
-      }
-      // missing but optional
-      if (value == null && !prop.required) {
-          return;
-      }
-      // type check
-      if (type != null && type !== true) {
-          let isValid = false;
-          const types = isArray(type) ? type : [type];
-          const expectedTypes = [];
-          // value is valid as long as one of the specified types match
-          for (let i = 0; i < types.length && !isValid; i++) {
-              const { valid, expectedType } = assertType(value, types[i]);
-              expectedTypes.push(expectedType || '');
-              isValid = valid;
-          }
-          if (!isValid) {
-              warn(getInvalidTypeMessage(name, value, expectedTypes));
-              return;
-          }
-      }
-      // custom validator
-      if (validator && !validator(value)) {
-          warn('Invalid prop: custom validator check failed for prop "' + name + '".');
-      }
-  }
-  const isSimpleType = /*#__PURE__*/ makeMap('String,Number,Boolean,Function,Symbol');
-  /**
-   * dev only
-   */
-  function assertType(value, type) {
-      let valid;
-      const expectedType = getType(type);
-      if (isSimpleType(expectedType)) {
-          const t = typeof value;
-          valid = t === expectedType.toLowerCase();
-          // for primitive wrapper objects
-          if (!valid && t === 'object') {
-              valid = value instanceof type;
-          }
-      }
-      else if (expectedType === 'Object') {
-          valid = isObject(value);
-      }
-      else if (expectedType === 'Array') {
-          valid = isArray(value);
-      }
-      else {
-          valid = value instanceof type;
-      }
-      return {
-          valid,
-          expectedType
-      };
-  }
-  /**
-   * dev only
-   */
-  function getInvalidTypeMessage(name, value, expectedTypes) {
-      let message = `Invalid prop: type check failed for prop "${name}".` +
-          ` Expected ${expectedTypes.map(capitalize).join(', ')}`;
-      const expectedType = expectedTypes[0];
-      const receivedType = toRawType(value);
-      const expectedValue = styleValue(value, expectedType);
-      const receivedValue = styleValue(value, receivedType);
-      // check if we need to specify expected value
-      if (expectedTypes.length === 1 &&
-          isExplicable(expectedType) &&
-          !isBoolean(expectedType, receivedType)) {
-          message += ` with value ${expectedValue}`;
-      }
-      message += `, got ${receivedType} `;
-      // check if we need to specify received value
-      if (isExplicable(receivedType)) {
-          message += `with value ${receivedValue}.`;
-      }
-      return message;
-  }
-  /**
-   * dev only
-   */
-  function styleValue(value, type) {
-      if (type === 'String') {
-          return `"${value}"`;
-      }
-      else if (type === 'Number') {
-          return `${Number(value)}`;
-      }
-      else {
-          return `${value}`;
-      }
-  }
-  /**
-   * dev only
-   */
-  function isExplicable(type) {
-      const explicitTypes = ['string', 'number', 'boolean'];
-      return explicitTypes.some(elem => type.toLowerCase() === elem);
-  }
-  /**
-   * dev only
-   */
-  function isBoolean(...args) {
-      return args.some(elem => elem.toLowerCase() === 'boolean');
-  }
-
-  function injectHook(type, hook, target = currentInstance, prepend = false) {
-      if (target) {
-          const hooks = target[type] || (target[type] = []);
-          // cache the error handling wrapper for injected hooks so the same hook
-          // can be properly deduped by the scheduler. "__weh" stands for "with error
-          // handling".
-          const wrappedHook = hook.__weh ||
-              (hook.__weh = (...args) => {
-                  if (target.isUnmounted) {
-                      return;
-                  }
-                  // disable tracking inside all lifecycle hooks
-                  // since they can potentially be called inside effects.
-                  pauseTracking();
-                  // Set currentInstance during hook invocation.
-                  // This assumes the hook does not synchronously trigger other hooks, which
-                  // can only be false when the user does something really funky.
-                  setCurrentInstance(target);
-                  const res = callWithAsyncErrorHandling(hook, target, type, args);
-                  setCurrentInstance(null);
-                  resetTracking();
-                  return res;
-              });
-          if (prepend) {
-              hooks.unshift(wrappedHook);
-          }
-          else {
-              hooks.push(wrappedHook);
-          }
-          return wrappedHook;
-      }
-      else {
-          const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ''));
-          warn(`${apiName} is called when there is no active component instance to be ` +
-              `associated with. ` +
-              `Lifecycle injection APIs can only be used during execution of setup().` +
-              ( ` If you are using async setup(), make sure to register lifecycle ` +
-                      `hooks before the first await statement.`
-                  ));
-      }
-  }
-  const createHook = (lifecycle) => (hook, target = currentInstance) =>
-  // post-create lifecycle registrations are noops during SSR
-  !isInSSRComponentSetup && injectHook(lifecycle, hook, target);
-  const onBeforeMount = createHook("bm" /* BEFORE_MOUNT */);
-  const onMounted = createHook("m" /* MOUNTED */);
-  const onBeforeUpdate = createHook("bu" /* BEFORE_UPDATE */);
-  const onUpdated = createHook("u" /* UPDATED */);
-  const onBeforeUnmount = createHook("bum" /* BEFORE_UNMOUNT */);
-  const onUnmounted = createHook("um" /* UNMOUNTED */);
-  const onRenderTriggered = createHook("rtg" /* RENDER_TRIGGERED */);
-  const onRenderTracked = createHook("rtc" /* RENDER_TRACKED */);
-  const onErrorCaptured = (hook, target = currentInstance) => {
-      injectHook("ec" /* ERROR_CAPTURED */, hook, target);
-  };
-
-  // Simple effect.
-  function watchEffect(effect, options) {
-      return doWatch(effect, null, options);
-  }
-  // initial value for watchers to trigger on undefined initial values
-  const INITIAL_WATCHER_VALUE = {};
-  // implementation
-  function watch(source, cb, options) {
-      if ( !isFunction(cb)) {
-          warn(`\`watch(fn, options?)\` signature has been moved to a separate API. ` +
-              `Use \`watchEffect(fn, options?)\` instead. \`watch\` now only ` +
-              `supports \`watch(source, cb, options?) signature.`);
-      }
-      return doWatch(source, cb, options);
-  }
-  function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ, instance = currentInstance) {
-      if ( !cb) {
-          if (immediate !== undefined) {
-              warn(`watch() "immediate" option is only respected when using the ` +
-                  `watch(source, callback, options?) signature.`);
-          }
-          if (deep !== undefined) {
-              warn(`watch() "deep" option is only respected when using the ` +
-                  `watch(source, callback, options?) signature.`);
-          }
-      }
-      const warnInvalidSource = (s) => {
-          warn(`Invalid watch source: `, s, `A watch source can only be a getter/effect function, a ref, ` +
-              `a reactive object, or an array of these types.`);
-      };
-      let getter;
-      let forceTrigger = false;
-      if (isRef(source)) {
-          getter = () => source.value;
-          forceTrigger = !!source._shallow;
-      }
-      else if (isReactive(source)) {
-          getter = () => source;
-          deep = true;
-      }
-      else if (isArray(source)) {
-          getter = () => source.map(s => {
-              if (isRef(s)) {
-                  return s.value;
-              }
-              else if (isReactive(s)) {
-                  return traverse(s);
-              }
-              else if (isFunction(s)) {
-                  return callWithErrorHandling(s, instance, 2 /* WATCH_GETTER */);
-              }
-              else {
-                   warnInvalidSource(s);
-              }
-          });
-      }
-      else if (isFunction(source)) {
-          if (cb) {
-              // getter with cb
-              getter = () => callWithErrorHandling(source, instance, 2 /* WATCH_GETTER */);
-          }
-          else {
-              // no cb -> simple effect
-              getter = () => {
-                  if (instance && instance.isUnmounted) {
-                      return;
-                  }
-                  if (cleanup) {
-                      cleanup();
-                  }
-                  return callWithErrorHandling(source, instance, 3 /* WATCH_CALLBACK */, [onInvalidate]);
-              };
-          }
-      }
-      else {
-          getter = NOOP;
-           warnInvalidSource(source);
-      }
-      if (cb && deep) {
-          const baseGetter = getter;
-          getter = () => traverse(baseGetter());
-      }
-      let cleanup;
-      const onInvalidate = (fn) => {
-          cleanup = runner.options.onStop = () => {
-              callWithErrorHandling(fn, instance, 4 /* WATCH_CLEANUP */);
-          };
-      };
-      let oldValue = isArray(source) ? [] : INITIAL_WATCHER_VALUE;
-      const job = () => {
-          if (!runner.active) {
-              return;
-          }
-          if (cb) {
-              // watch(source, cb)
-              const newValue = runner();
-              if (deep || forceTrigger || hasChanged(newValue, oldValue)) {
-                  // cleanup before running cb again
-                  if (cleanup) {
-                      cleanup();
-                  }
-                  callWithAsyncErrorHandling(cb, instance, 3 /* WATCH_CALLBACK */, [
-                      newValue,
-                      // pass undefined as the old value when it's changed for the first time
-                      oldValue === INITIAL_WATCHER_VALUE ? undefined : oldValue,
-                      onInvalidate
-                  ]);
-                  oldValue = newValue;
-              }
-          }
-          else {
-              // watchEffect
-              runner();
-          }
-      };
-      // important: mark the job as a watcher callback so that scheduler knows
-      // it is allowed to self-trigger (#1727)
-      job.allowRecurse = !!cb;
-      let scheduler;
-      if (flush === 'sync') {
-          scheduler = job;
-      }
-      else if (flush === 'post') {
-          scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);
-      }
-      else {
-          // default: 'pre'
-          scheduler = () => {
-              if (!instance || instance.isMounted) {
-                  queuePreFlushCb(job);
-              }
-              else {
-                  // with 'pre' option, the first call must happen before
-                  // the component is mounted so it is called synchronously.
-                  job();
-              }
-          };
-      }
-      const runner = effect(getter, {
-          lazy: true,
-          onTrack,
-          onTrigger,
-          scheduler
-      });
-      recordInstanceBoundEffect(runner, instance);
-      // initial run
-      if (cb) {
-          if (immediate) {
-              job();
-          }
-          else {
-              oldValue = runner();
-          }
-      }
-      else if (flush === 'post') {
-          queuePostRenderEffect(runner, instance && instance.suspense);
-      }
-      else {
-          runner();
-      }
-      return () => {
-          stop(runner);
-          if (instance) {
-              remove(instance.effects, runner);
-          }
-      };
-  }
-  // this.$watch
-  function instanceWatch(source, cb, options) {
-      const publicThis = this.proxy;
-      const getter = isString(source)
-          ? () => publicThis[source]
-          : source.bind(publicThis);
-      return doWatch(getter, cb.bind(publicThis), options, this);
-  }
-  function traverse(value, seen = new Set()) {
-      if (!isObject(value) || seen.has(value)) {
-          return value;
-      }
-      seen.add(value);
-      if (isRef(value)) {
-          traverse(value.value, seen);
-      }
-      else if (isArray(value)) {
-          for (let i = 0; i < value.length; i++) {
-              traverse(value[i], seen);
-          }
-      }
-      else if (isSet(value) || isMap(value)) {
-          value.forEach((v) => {
-              traverse(v, seen);
-          });
-      }
-      else {
-          for (const key in value) {
-              traverse(value[key], seen);
-          }
-      }
-      return value;
-  }
-
-  function useTransitionState() {
-      const state = {
-          isMounted: false,
-          isLeaving: false,
-          isUnmounting: false,
-          leavingVNodes: new Map()
-      };
-      onMounted(() => {
-          state.isMounted = true;
-      });
-      onBeforeUnmount(() => {
-          state.isUnmounting = true;
-      });
-      return state;
-  }
-  const TransitionHookValidator = [Function, Array];
-  const BaseTransitionImpl = {
-      name: `BaseTransition`,
-      props: {
-          mode: String,
-          appear: Boolean,
-          persisted: Boolean,
-          // enter
-          onBeforeEnter: TransitionHookValidator,
-          onEnter: TransitionHookValidator,
-          onAfterEnter: TransitionHookValidator,
-          onEnterCancelled: TransitionHookValidator,
-          // leave
-          onBeforeLeave: TransitionHookValidator,
-          onLeave: TransitionHookValidator,
-          onAfterLeave: TransitionHookValidator,
-          onLeaveCancelled: TransitionHookValidator,
-          // appear
-          onBeforeAppear: TransitionHookValidator,
-          onAppear: TransitionHookValidator,
-          onAfterAppear: TransitionHookValidator,
-          onAppearCancelled: TransitionHookValidator
-      },
-      setup(props, { slots }) {
-          const instance = getCurrentInstance();
-          const state = useTransitionState();
-          let prevTransitionKey;
-          return () => {
-              const children = slots.default && getTransitionRawChildren(slots.default(), true);
-              if (!children || !children.length) {
-                  return;
-              }
-              // warn multiple elements
-              if ( children.length > 1) {
-                  warn('<transition> can only be used on a single element or component. Use ' +
-                      '<transition-group> for lists.');
-              }
-              // there's no need to track reactivity for these props so use the raw
-              // props for a bit better perf
-              const rawProps = toRaw(props);
-              const { mode } = rawProps;
-              // check mode
-              if ( mode && !['in-out', 'out-in', 'default'].includes(mode)) {
-                  warn(`invalid <transition> mode: ${mode}`);
-              }
-              // at this point children has a guaranteed length of 1.
-              const child = children[0];
-              if (state.isLeaving) {
-                  return emptyPlaceholder(child);
-              }
-              // in the case of <transition><keep-alive/></transition>, we need to
-              // compare the type of the kept-alive children.
-              const innerChild = getKeepAliveChild(child);
-              if (!innerChild) {
-                  return emptyPlaceholder(child);
-              }
-              const enterHooks = resolveTransitionHooks(innerChild, rawProps, state, instance);
-              setTransitionHooks(innerChild, enterHooks);
-              const oldChild = instance.subTree;
-              const oldInnerChild = oldChild && getKeepAliveChild(oldChild);
-              let transitionKeyChanged = false;
-              const { getTransitionKey } = innerChild.type;
-              if (getTransitionKey) {
-                  const key = getTransitionKey();
-                  if (prevTransitionKey === undefined) {
-                      prevTransitionKey = key;
-                  }
-                  else if (key !== prevTransitionKey) {
-                      prevTransitionKey = key;
-                      transitionKeyChanged = true;
-                  }
-              }
-              // handle mode
-              if (oldInnerChild &&
-                  oldInnerChild.type !== Comment &&
-                  (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {
-                  const leavingHooks = resolveTransitionHooks(oldInnerChild, rawProps, state, instance);
-                  // update old tree's hooks in case of dynamic transition
-                  setTransitionHooks(oldInnerChild, leavingHooks);
-                  // switching between different views
-                  if (mode === 'out-in') {
-                      state.isLeaving = true;
-                      // return placeholder node and queue update when leave finishes
-                      leavingHooks.afterLeave = () => {
-                          state.isLeaving = false;
-                          instance.update();
-                      };
-                      return emptyPlaceholder(child);
-                  }
-                  else if (mode === 'in-out') {
-                      leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
-                          const leavingVNodesCache = getLeavingNodesForType(state, oldInnerChild);
-                          leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
-                          // early removal callback
-                          el._leaveCb = () => {
-                              earlyRemove();
-                              el._leaveCb = undefined;
-                              delete enterHooks.delayedLeave;
-                          };
-                          enterHooks.delayedLeave = delayedLeave;
-                      };
-                  }
-              }
-              return child;
-          };
-      }
-  };
-  // export the public type for h/tsx inference
-  // also to avoid inline import() in generated d.ts files
-  const BaseTransition = BaseTransitionImpl;
-  function getLeavingNodesForType(state, vnode) {
-      const { leavingVNodes } = state;
-      let leavingVNodesCache = leavingVNodes.get(vnode.type);
-      if (!leavingVNodesCache) {
-          leavingVNodesCache = Object.create(null);
-          leavingVNodes.set(vnode.type, leavingVNodesCache);
-      }
-      return leavingVNodesCache;
-  }
-  // The transition hooks are attached to the vnode as vnode.transition
-  // and will be called at appropriate timing in the renderer.
-  function resolveTransitionHooks(vnode, props, state, instance) {
-      const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props;
-      const key = String(vnode.key);
-      const leavingVNodesCache = getLeavingNodesForType(state, vnode);
-      const callHook = (hook, args) => {
-          hook &&
-              callWithAsyncErrorHandling(hook, instance, 9 /* TRANSITION_HOOK */, args);
-      };
-      const hooks = {
-          mode,
-          persisted,
-          beforeEnter(el) {
-              let hook = onBeforeEnter;
-              if (!state.isMounted) {
-                  if (appear) {
-                      hook = onBeforeAppear || onBeforeEnter;
-                  }
-                  else {
-                      return;
-                  }
-              }
-              // for same element (v-show)
-              if (el._leaveCb) {
-                  el._leaveCb(true /* cancelled */);
-              }
-              // for toggled element with same key (v-if)
-              const leavingVNode = leavingVNodesCache[key];
-              if (leavingVNode &&
-                  isSameVNodeType(vnode, leavingVNode) &&
-                  leavingVNode.el._leaveCb) {
-                  // force early removal (not cancelled)
-                  leavingVNode.el._leaveCb();
-              }
-              callHook(hook, [el]);
-          },
-          enter(el) {
-              let hook = onEnter;
-              let afterHook = onAfterEnter;
-              let cancelHook = onEnterCancelled;
-              if (!state.isMounted) {
-                  if (appear) {
-                      hook = onAppear || onEnter;
-                      afterHook = onAfterAppear || onAfterEnter;
-                      cancelHook = onAppearCancelled || onEnterCancelled;
-                  }
-                  else {
-                      return;
-                  }
-              }
-              let called = false;
-              const done = (el._enterCb = (cancelled) => {
-                  if (called)
-                      return;
-                  called = true;
-                  if (cancelled) {
-                      callHook(cancelHook, [el]);
-                  }
-                  else {
-                      callHook(afterHook, [el]);
-                  }
-                  if (hooks.delayedLeave) {
-                      hooks.delayedLeave();
-                  }
-                  el._enterCb = undefined;
-              });
-              if (hook) {
-                  hook(el, done);
-                  if (hook.length <= 1) {
-                      done();
-                  }
-              }
-              else {
-                  done();
-              }
-          },
-          leave(el, remove) {
-              const key = String(vnode.key);
-              if (el._enterCb) {
-                  el._enterCb(true /* cancelled */);
-              }
-              if (state.isUnmounting) {
-                  return remove();
-              }
-              callHook(onBeforeLeave, [el]);
-              let called = false;
-              const done = (el._leaveCb = (cancelled) => {
-                  if (called)
-                      return;
-                  called = true;
-                  remove();
-                  if (cancelled) {
-                      callHook(onLeaveCancelled, [el]);
-                  }
-                  else {
-                      callHook(onAfterLeave, [el]);
-                  }
-                  el._leaveCb = undefined;
-                  if (leavingVNodesCache[key] === vnode) {
-                      delete leavingVNodesCache[key];
-                  }
-              });
-              leavingVNodesCache[key] = vnode;
-              if (onLeave) {
-                  onLeave(el, done);
-                  if (onLeave.length <= 1) {
-                      done();
-                  }
-              }
-              else {
-                  done();
-              }
-          },
-          clone(vnode) {
-              return resolveTransitionHooks(vnode, props, state, instance);
-          }
-      };
-      return hooks;
-  }
-  // the placeholder really only handles one special case: KeepAlive
-  // in the case of a KeepAlive in a leave phase we need to return a KeepAlive
-  // placeholder with empty content to avoid the KeepAlive instance from being
-  // unmounted.
-  function emptyPlaceholder(vnode) {
-      if (isKeepAlive(vnode)) {
-          vnode = cloneVNode(vnode);
-          vnode.children = null;
-          return vnode;
-      }
-  }
-  function getKeepAliveChild(vnode) {
-      return isKeepAlive(vnode)
-          ? vnode.children
-              ? vnode.children[0]
-              : undefined
-          : vnode;
-  }
-  function setTransitionHooks(vnode, hooks) {
-      if (vnode.shapeFlag & 6 /* COMPONENT */ && vnode.component) {
-          setTransitionHooks(vnode.component.subTree, hooks);
-      }
-      else if ( vnode.shapeFlag & 128 /* SUSPENSE */) {
-          vnode.ssContent.transition = hooks.clone(vnode.ssContent);
-          vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
-      }
-      else {
-          vnode.transition = hooks;
-      }
-  }
-  function getTransitionRawChildren(children, keepComment = false) {
-      let ret = [];
-      let keyedFragmentCount = 0;
-      for (let i = 0; i < children.length; i++) {
-          const child = children[i];
-          // handle fragment children case, e.g. v-for
-          if (child.type === Fragment) {
-              if (child.patchFlag & 128 /* KEYED_FRAGMENT */)
-                  keyedFragmentCount++;
-              ret = ret.concat(getTransitionRawChildren(child.children, keepComment));
-          }
-          // comment placeholders should be skipped, e.g. v-if
-          else if (keepComment || child.type !== Comment) {
-              ret.push(child);
-          }
-      }
-      // #1126 if a transition children list contains multiple sub fragments, these
-      // fragments will be merged into a flat children array. Since each v-for
-      // fragment may contain different static bindings inside, we need to de-op
-      // these children to force full diffs to ensure correct behavior.
-      if (keyedFragmentCount > 1) {
-          for (let i = 0; i < ret.length; i++) {
-              ret[i].patchFlag = -2 /* BAIL */;
-          }
-      }
-      return ret;
-  }
-
-  const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
-  const KeepAliveImpl = {
-      name: `KeepAlive`,
-      // Marker for special handling inside the renderer. We are not using a ===
-      // check directly on KeepAlive in the renderer, because importing it directly
-      // would prevent it from being tree-shaken.
-      __isKeepAlive: true,
-      inheritRef: true,
-      props: {
-          include: [String, RegExp, Array],
-          exclude: [String, RegExp, Array],
-          max: [String, Number]
-      },
-      setup(props, { slots }) {
-          const cache = new Map();
-          const keys = new Set();
-          let current = null;
-          const instance = getCurrentInstance();
-          const parentSuspense = instance.suspense;
-          // KeepAlive communicates with the instantiated renderer via the
-          // ctx where the renderer passes in its internals,
-          // and the KeepAlive instance exposes activate/deactivate implementations.
-          // The whole point of this is to avoid importing KeepAlive directly in the
-          // renderer to facilitate tree-shaking.
-          const sharedContext = instance.ctx;
-          const { renderer: { p: patch, m: move, um: _unmount, o: { createElement } } } = sharedContext;
-          const storageContainer = createElement('div');
-          sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {
-              const instance = vnode.component;
-              move(vnode, container, anchor, 0 /* ENTER */, parentSuspense);
-              // in case props have changed
-              patch(instance.vnode, vnode, container, anchor, instance, parentSuspense, isSVG, optimized);
-              queuePostRenderEffect(() => {
-                  instance.isDeactivated = false;
-                  if (instance.a) {
-                      invokeArrayFns(instance.a);
-                  }
-                  const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
-                  if (vnodeHook) {
-                      invokeVNodeHook(vnodeHook, instance.parent, vnode);
-                  }
-              }, parentSuspense);
-          };
-          sharedContext.deactivate = (vnode) => {
-              const instance = vnode.component;
-              move(vnode, storageContainer, null, 1 /* LEAVE */, parentSuspense);
-              queuePostRenderEffect(() => {
-                  if (instance.da) {
-                      invokeArrayFns(instance.da);
-                  }
-                  const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
-                  if (vnodeHook) {
-                      invokeVNodeHook(vnodeHook, instance.parent, vnode);
-                  }
-                  instance.isDeactivated = true;
-              }, parentSuspense);
-          };
-          function unmount(vnode) {
-              // reset the shapeFlag so it can be properly unmounted
-              resetShapeFlag(vnode);
-              _unmount(vnode, instance, parentSuspense);
-          }
-          function pruneCache(filter) {
-              cache.forEach((vnode, key) => {
-                  const name = getComponentName(vnode.type);
-                  if (name && (!filter || !filter(name))) {
-                      pruneCacheEntry(key);
-                  }
-              });
-          }
-          function pruneCacheEntry(key) {
-              const cached = cache.get(key);
-              if (!current || cached.type !== current.type) {
-                  unmount(cached);
-              }
-              else if (current) {
-                  // current active instance should no longer be kept-alive.
-                  // we can't unmount it now but it might be later, so reset its flag now.
-                  resetShapeFlag(current);
-              }
-              cache.delete(key);
-              keys.delete(key);
-          }
-          // prune cache on include/exclude prop change
-          watch(() => [props.include, props.exclude], ([include, exclude]) => {
-              include && pruneCache(name => matches(include, name));
-              exclude && pruneCache(name => !matches(exclude, name));
-          },
-          // prune post-render after `current` has been updated
-          { flush: 'post', deep: true });
-          // cache sub tree after render
-          let pendingCacheKey = null;
-          const cacheSubtree = () => {
-              // fix #1621, the pendingCacheKey could be 0
-              if (pendingCacheKey != null) {
-                  cache.set(pendingCacheKey, getInnerChild(instance.subTree));
-              }
-          };
-          onMounted(cacheSubtree);
-          onUpdated(cacheSubtree);
-          onBeforeUnmount(() => {
-              cache.forEach(cached => {
-                  const { subTree, suspense } = instance;
-                  const vnode = getInnerChild(subTree);
-                  if (cached.type === vnode.type) {
-                      // current instance will be unmounted as part of keep-alive's unmount
-                      resetShapeFlag(vnode);
-                      // but invoke its deactivated hook here
-                      const da = vnode.component.da;
-                      da && queuePostRenderEffect(da, suspense);
-                      return;
-                  }
-                  unmount(cached);
-              });
-          });
-          return () => {
-              pendingCacheKey = null;
-              if (!slots.default) {
-                  return null;
-              }
-              const children = slots.default();
-              const rawVNode = children[0];
-              if (children.length > 1) {
-                  {
-                      warn(`KeepAlive should contain exactly one component child.`);
-                  }
-                  current = null;
-                  return children;
-              }
-              else if (!isVNode(rawVNode) ||
-                  (!(rawVNode.shapeFlag & 4 /* STATEFUL_COMPONENT */) &&
-                      !(rawVNode.shapeFlag & 128 /* SUSPENSE */))) {
-                  current = null;
-                  return rawVNode;
-              }
-              let vnode = getInnerChild(rawVNode);
-              const comp = vnode.type;
-              const name = getComponentName(comp);
-              const { include, exclude, max } = props;
-              if ((include && (!name || !matches(include, name))) ||
-                  (exclude && name && matches(exclude, name))) {
-                  current = vnode;
-                  return rawVNode;
-              }
-              const key = vnode.key == null ? comp : vnode.key;
-              const cachedVNode = cache.get(key);
-              // clone vnode if it's reused because we are going to mutate it
-              if (vnode.el) {
-                  vnode = cloneVNode(vnode);
-                  if (rawVNode.shapeFlag & 128 /* SUSPENSE */) {
-                      rawVNode.ssContent = vnode;
-                  }
-              }
-              // #1513 it's possible for the returned vnode to be cloned due to attr
-              // fallthrough or scopeId, so the vnode here may not be the final vnode
-              // that is mounted. Instead of caching it directly, we store the pending
-              // key and cache `instance.subTree` (the normalized vnode) in
-              // beforeMount/beforeUpdate hooks.
-              pendingCacheKey = key;
-              if (cachedVNode) {
-                  // copy over mounted state
-                  vnode.el = cachedVNode.el;
-                  vnode.component = cachedVNode.component;
-                  if (vnode.transition) {
-                      // recursively update transition hooks on subTree
-                      setTransitionHooks(vnode, vnode.transition);
-                  }
-                  // avoid vnode being mounted as fresh
-                  vnode.shapeFlag |= 512 /* COMPONENT_KEPT_ALIVE */;
-                  // make this key the freshest
-                  keys.delete(key);
-                  keys.add(key);
-              }
-              else {
-                  keys.add(key);
-                  // prune oldest entry
-                  if (max && keys.size > parseInt(max, 10)) {
-                      pruneCacheEntry(keys.values().next().value);
-                  }
-              }
-              // avoid vnode being unmounted
-              vnode.shapeFlag |= 256 /* COMPONENT_SHOULD_KEEP_ALIVE */;
-              current = vnode;
-              return rawVNode;
-          };
-      }
-  };
-  // export the public type for h/tsx inference
-  // also to avoid inline import() in generated d.ts files
-  const KeepAlive = KeepAliveImpl;
-  function matches(pattern, name) {
-      if (isArray(pattern)) {
-          return pattern.some((p) => matches(p, name));
-      }
-      else if (isString(pattern)) {
-          return pattern.split(',').indexOf(name) > -1;
-      }
-      else if (pattern.test) {
-          return pattern.test(name);
-      }
-      /* istanbul ignore next */
-      return false;
-  }
-  function onActivated(hook, target) {
-      registerKeepAliveHook(hook, "a" /* ACTIVATED */, target);
-  }
-  function onDeactivated(hook, target) {
-      registerKeepAliveHook(hook, "da" /* DEACTIVATED */, target);
-  }
-  function registerKeepAliveHook(hook, type, target = currentInstance) {
-      // cache the deactivate branch check wrapper for injected hooks so the same
-      // hook can be properly deduped by the scheduler. "__wdc" stands for "with
-      // deactivation check".
-      const wrappedHook = hook.__wdc ||
-          (hook.__wdc = () => {
-              // only fire the hook if the target instance is NOT in a deactivated branch.
-              let current = target;
-              while (current) {
-                  if (current.isDeactivated) {
-                      return;
-                  }
-                  current = current.parent;
-              }
-              hook();
-          });
-      injectHook(type, wrappedHook, target);
-      // In addition to registering it on the target instance, we walk up the parent
-      // chain and register it on all ancestor instances that are keep-alive roots.
-      // This avoids the need to walk the entire component tree when invoking these
-      // hooks, and more importantly, avoids the need to track child components in
-      // arrays.
-      if (target) {
-          let current = target.parent;
-          while (current && current.parent) {
-              if (isKeepAlive(current.parent.vnode)) {
-                  injectToKeepAliveRoot(wrappedHook, type, target, current);
-              }
-              current = current.parent;
-          }
-      }
-  }
-  function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
-      // injectHook wraps the original for error handling, so make sure to remove
-      // the wrapped version.
-      const injected = injectHook(type, hook, keepAliveRoot, true /* prepend */);
-      onUnmounted(() => {
-          remove(keepAliveRoot[type], injected);
-      }, target);
-  }
-  function resetShapeFlag(vnode) {
-      let shapeFlag = vnode.shapeFlag;
-      if (shapeFlag & 256 /* COMPONENT_SHOULD_KEEP_ALIVE */) {
-          shapeFlag -= 256 /* COMPONENT_SHOULD_KEEP_ALIVE */;
-      }
-      if (shapeFlag & 512 /* COMPONENT_KEPT_ALIVE */) {
-          shapeFlag -= 512 /* COMPONENT_KEPT_ALIVE */;
-      }
-      vnode.shapeFlag = shapeFlag;
-  }
-  function getInnerChild(vnode) {
-      return vnode.shapeFlag & 128 /* SUSPENSE */ ? vnode.ssContent : vnode;
-  }
-
-  const isInternalKey = (key) => key[0] === '_' || key === '$stable';
-  const normalizeSlotValue = (value) => isArray(value)
-      ? value.map(normalizeVNode)
-      : [normalizeVNode(value)];
-  const normalizeSlot = (key, rawSlot, ctx) => withCtx((props) => {
-      if ( currentInstance) {
-          warn(`Slot "${key}" invoked outside of the render function: ` +
-              `this will not track dependencies used in the slot. ` +
-              `Invoke the slot function inside the render function instead.`);
-      }
-      return normalizeSlotValue(rawSlot(props));
-  }, ctx);
-  const normalizeObjectSlots = (rawSlots, slots) => {
-      const ctx = rawSlots._ctx;
-      for (const key in rawSlots) {
-          if (isInternalKey(key))
-              continue;
-          const value = rawSlots[key];
-          if (isFunction(value)) {
-              slots[key] = normalizeSlot(key, value, ctx);
-          }
-          else if (value != null) {
-              {
-                  warn(`Non-function value encountered for slot "${key}". ` +
-                      `Prefer function slots for better performance.`);
-              }
-              const normalized = normalizeSlotValue(value);
-              slots[key] = () => normalized;
-          }
-      }
-  };
-  const normalizeVNodeSlots = (instance, children) => {
-      if ( !isKeepAlive(instance.vnode)) {
-          warn(`Non-function value encountered for default slot. ` +
-              `Prefer function slots for better performance.`);
-      }
-      const normalized = normalizeSlotValue(children);
-      instance.slots.default = () => normalized;
-  };
-  const initSlots = (instance, children) => {
-      if (instance.vnode.shapeFlag & 32 /* SLOTS_CHILDREN */) {
-          const type = children._;
-          if (type) {
-              instance.slots = children;
-              // make compiler marker non-enumerable
-              def(children, '_', type);
-          }
-          else {
-              normalizeObjectSlots(children, (instance.slots = {}));
-          }
-      }
-      else {
-          instance.slots = {};
-          if (children) {
-              normalizeVNodeSlots(instance, children);
-          }
-      }
-      def(instance.slots, InternalObjectKey, 1);
-  };
-  const updateSlots = (instance, children) => {
-      const { vnode, slots } = instance;
-      let needDeletionCheck = true;
-      let deletionComparisonTarget = EMPTY_OBJ;
-      if (vnode.shapeFlag & 32 /* SLOTS_CHILDREN */) {
-          const type = children._;
-          if (type) {
-              // compiled slots.
-              if ( isHmrUpdating) {
-                  // Parent was HMR updated so slot content may have changed.
-                  // force update slots and mark instance for hmr as well
-                  extend(slots, children);
-              }
-              else if (type === 1 /* STABLE */) {
-                  // compiled AND stable.
-                  // no need to update, and skip stale slots removal.
-                  needDeletionCheck = false;
-              }
-              else {
-                  // compiled but dynamic (v-if/v-for on slots) - update slots, but skip
-                  // normalization.
-                  extend(slots, children);
-              }
-          }
-          else {
-              needDeletionCheck = !children.$stable;
-              normalizeObjectSlots(children, slots);
-          }
-          deletionComparisonTarget = children;
-      }
-      else if (children) {
-          // non slot object children (direct value) passed to a component
-          normalizeVNodeSlots(instance, children);
-          deletionComparisonTarget = { default: 1 };
-      }
-      // delete stale slots
-      if (needDeletionCheck) {
-          for (const key in slots) {
-              if (!isInternalKey(key) && !(key in deletionComparisonTarget)) {
-                  delete slots[key];
-              }
-          }
-      }
-  };
-
-  /**
-  Runtime helper for applying directives to a vnode. Example usage:
-
-  const comp = resolveComponent('comp')
-  const foo = resolveDirective('foo')
-  const bar = resolveDirective('bar')
-
-  return withDirectives(h(comp), [
-    [foo, this.x],
-    [bar, this.y]
-  ])
-  */
-  const isBuiltInDirective = /*#__PURE__*/ makeMap('bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text');
-  function validateDirectiveName(name) {
-      if (isBuiltInDirective(name)) {
-          warn('Do not use built-in directive ids as custom directive id: ' + name);
-      }
-  }
-  /**
-   * Adds directives to a VNode.
-   */
-  function withDirectives(vnode, directives) {
-      const internalInstance = currentRenderingInstance;
-      if (internalInstance === null) {
-           warn(`withDirectives can only be used inside render functions.`);
-          return vnode;
-      }
-      const instance = internalInstance.proxy;
-      const bindings = vnode.dirs || (vnode.dirs = []);
-      for (let i = 0; i < directives.length; i++) {
-          let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
-          if (isFunction(dir)) {
-              dir = {
-                  mounted: dir,
-                  updated: dir
-              };
-          }
-          bindings.push({
-              dir,
-              instance,
-              value,
-              oldValue: void 0,
-              arg,
-              modifiers
-          });
-      }
-      return vnode;
-  }
-  function invokeDirectiveHook(vnode, prevVNode, instance, name) {
-      const bindings = vnode.dirs;
-      const oldBindings = prevVNode && prevVNode.dirs;
-      for (let i = 0; i < bindings.length; i++) {
-          const binding = bindings[i];
-          if (oldBindings) {
-              binding.oldValue = oldBindings[i].value;
-          }
-          const hook = binding.dir[name];
-          if (hook) {
-              callWithAsyncErrorHandling(hook, instance, 8 /* DIRECTIVE_HOOK */, [
-                  vnode.el,
-                  binding,
-                  vnode,
-                  prevVNode
-              ]);
-          }
-      }
-  }
-
-  function createAppContext() {
-      return {
-          app: null,
-          config: {
-              isNativeTag: NO,
-              performance: false,
-              globalProperties: {},
-              optionMergeStrategies: {},
-              isCustomElement: NO,
-              errorHandler: undefined,
-              warnHandler: undefined
-          },
-          mixins: [],
-          components: {},
-          directives: {},
-          provides: Object.create(null)
-      };
-  }
-  let uid$1 = 0;
-  function createAppAPI(render, hydrate) {
-      return function createApp(rootComponent, rootProps = null) {
-          if (rootProps != null && !isObject(rootProps)) {
-               warn(`root props passed to app.mount() must be an object.`);
-              rootProps = null;
-          }
-          const context = createAppContext();
-          const installedPlugins = new Set();
-          let isMounted = false;
-          const app = (context.app = {
-              _uid: uid$1++,
-              _component: rootComponent,
-              _props: rootProps,
-              _container: null,
-              _context: context,
-              version,
-              get config() {
-                  return context.config;
-              },
-              set config(v) {
-                  {
-                      warn(`app.config cannot be replaced. Modify individual options instead.`);
-                  }
-              },
-              use(plugin, ...options) {
-                  if (installedPlugins.has(plugin)) {
-                       warn(`Plugin has already been applied to target app.`);
-                  }
-                  else if (plugin && isFunction(plugin.install)) {
-                      installedPlugins.add(plugin);
-                      plugin.install(app, ...options);
-                  }
-                  else if (isFunction(plugin)) {
-                      installedPlugins.add(plugin);
-                      plugin(app, ...options);
-                  }
-                  else {
-                      warn(`A plugin must either be a function or an object with an "install" ` +
-                          `function.`);
-                  }
-                  return app;
-              },
-              mixin(mixin) {
-                  {
-                      if (!context.mixins.includes(mixin)) {
-                          context.mixins.push(mixin);
-                          // global mixin with props/emits de-optimizes props/emits
-                          // normalization caching.
-                          if (mixin.props || mixin.emits) {
-                              context.deopt = true;
-                          }
-                      }
-                      else {
-                          warn('Mixin has already been applied to target app' +
-                              (mixin.name ? `: ${mixin.name}` : ''));
-                      }
-                  }
-                  return app;
-              },
-              component(name, component) {
-                  {
-                      validateComponentName(name, context.config);
-                  }
-                  if (!component) {
-                      return context.components[name];
-                  }
-                  if ( context.components[name]) {
-                      warn(`Component "${name}" has already been registered in target app.`);
-                  }
-                  context.components[name] = component;
-                  return app;
-              },
-              directive(name, directive) {
-                  {
-                      validateDirectiveName(name);
-                  }
-                  if (!directive) {
-                      return context.directives[name];
-                  }
-                  if ( context.directives[name]) {
-                      warn(`Directive "${name}" has already been registered in target app.`);
-                  }
-                  context.directives[name] = directive;
-                  return app;
-              },
-              mount(rootContainer, isHydrate) {
-                  if (!isMounted) {
-                      const vnode = createVNode(rootComponent, rootProps);
-                      // store app context on the root VNode.
-                      // this will be set on the root instance on initial mount.
-                      vnode.appContext = context;
-                      // HMR root reload
-                      {
-                          context.reload = () => {
-                              render(cloneVNode(vnode), rootContainer);
-                          };
-                      }
-                      if (isHydrate && hydrate) {
-                          hydrate(vnode, rootContainer);
-                      }
-                      else {
-                          render(vnode, rootContainer);
-                      }
-                      isMounted = true;
-                      app._container = rootContainer;
-                      rootContainer.__vue_app__ = app;
-                      {
-                          devtoolsInitApp(app, version);
-                      }
-                      return vnode.component.proxy;
-                  }
-                  else {
-                      warn(`App has already been mounted.\n` +
-                          `If you want to remount the same app, move your app creation logic ` +
-                          `into a factory function and create fresh app instances for each ` +
-                          `mount - e.g. \`const createMyApp = () => createApp(App)\``);
-                  }
-              },
-              unmount() {
-                  if (isMounted) {
-                      render(null, app._container);
-                      {
-                          devtoolsUnmountApp(app);
-                      }
-                  }
-                  else {
-                      warn(`Cannot unmount an app that is not mounted.`);
-                  }
-              },
-              provide(key, value) {
-                  if ( key in context.provides) {
-                      warn(`App already provides property with key "${String(key)}". ` +
-                          `It will be overwritten with the new value.`);
-                  }
-                  // TypeScript doesn't allow symbols as index type
-                  // https://github.com/Microsoft/TypeScript/issues/24587
-                  context.provides[key] = value;
-                  return app;
-              }
-          });
-          return app;
-      };
-  }
-
-  let hasMismatch = false;
-  const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== 'foreignObject';
-  const isComment = (node) => node.nodeType === 8 /* COMMENT */;
-  // Note: hydration is DOM-specific
-  // But we have to place it in core due to tight coupling with core - splitting
-  // it out creates a ton of unnecessary complexity.
-  // Hydration also depends on some renderer internal logic which needs to be
-  // passed in via arguments.
-  function createHydrationFunctions(rendererInternals) {
-      const { mt: mountComponent, p: patch, o: { patchProp, nextSibling, parentNode, remove, insert, createComment } } = rendererInternals;
-      const hydrate = (vnode, container) => {
-          if ( !container.hasChildNodes()) {
-              warn(`Attempting to hydrate existing markup but container is empty. ` +
-                  `Performing full mount instead.`);
-              patch(null, vnode, container);
-              return;
-          }
-          hasMismatch = false;
-          hydrateNode(container.firstChild, vnode, null, null);
-          flushPostFlushCbs();
-          if (hasMismatch && !false) {
-              // this error should show up in production
-              console.error(`Hydration completed but contains mismatches.`);
-          }
-      };
-      const hydrateNode = (node, vnode, parentComponent, parentSuspense, optimized = false) => {
-          const isFragmentStart = isComment(node) && node.data === '[';
-          const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, isFragmentStart);
-          const { type, ref, shapeFlag } = vnode;
-          const domType = node.nodeType;
-          vnode.el = node;
-          let nextNode = null;
-          switch (type) {
-              case Text:
-                  if (domType !== 3 /* TEXT */) {
-                      nextNode = onMismatch();
-                  }
-                  else {
-                      if (node.data !== vnode.children) {
-                          hasMismatch = true;
-
-                              warn(`Hydration text mismatch:` +
-                                  `\n- Client: ${JSON.stringify(node.data)}` +
-                                  `\n- Server: ${JSON.stringify(vnode.children)}`);
-                          node.data = vnode.children;
-                      }
-                      nextNode = nextSibling(node);
-                  }
-                  break;
-              case Comment:
-                  if (domType !== 8 /* COMMENT */ || isFragmentStart) {
-                      nextNode = onMismatch();
-                  }
-                  else {
-                      nextNode = nextSibling(node);
-                  }
-                  break;
-              case Static:
-                  if (domType !== 1 /* ELEMENT */) {
-                      nextNode = onMismatch();
-                  }
-                  else {
-                      // determine anchor, adopt content
-                      nextNode = node;
-                      // if the static vnode has its content stripped during build,
-                      // adopt it from the server-rendered HTML.
-                      const needToAdoptContent = !vnode.children.length;
-                      for (let i = 0; i < vnode.staticCount; i++) {
-                          if (needToAdoptContent)
-                              vnode.children += nextNode.outerHTML;
-                          if (i === vnode.staticCount - 1) {
-                              vnode.anchor = nextNode;
-                          }
-                          nextNode = nextSibling(nextNode);
-                      }
-                      return nextNode;
-                  }
-                  break;
-              case Fragment:
-                  if (!isFragmentStart) {
-                      nextNode = onMismatch();
-                  }
-                  else {
-                      nextNode = hydrateFragment(node, vnode, parentComponent, parentSuspense, optimized);
-                  }
-                  break;
-              default:
-                  if (shapeFlag & 1 /* ELEMENT */) {
-                      if (domType !== 1 /* ELEMENT */ ||
-                          vnode.type !== node.tagName.toLowerCase()) {
-                          nextNode = onMismatch();
-                      }
-                      else {
-                          nextNode = hydrateElement(node, vnode, parentComponent, parentSuspense, optimized);
-                      }
-                  }
-                  else if (shapeFlag & 6 /* COMPONENT */) {
-                      // when setting up the render effect, if the initial vnode already
-                      // has .el set, the component will perform hydration instead of mount
-                      // on its sub-tree.
-                      const container = parentNode(node);
-                      const hydrateComponent = () => {
-                          mountComponent(vnode, container, null, parentComponent, parentSuspense, isSVGContainer(container), optimized);
-                      };
-                      // async component
-                      const loadAsync = vnode.type.__asyncLoader;
-                      if (loadAsync) {
-                          loadAsync().then(hydrateComponent);
-                      }
-                      else {
-                          hydrateComponent();
-                      }
-                      // component may be async, so in the case of fragments we cannot rely
-                      // on component's rendered output to determine the end of the fragment
-                      // instead, we do a lookahead to find the end anchor node.
-                      nextNode = isFragmentStart
-                          ? locateClosingAsyncAnchor(node)
-                          : nextSibling(node);
-                  }
-                  else if (shapeFlag & 64 /* TELEPORT */) {
-                      if (domType !== 8 /* COMMENT */) {
-                          nextNode = onMismatch();
-                      }
-                      else {
-                          nextNode = vnode.type.hydrate(node, vnode, parentComponent, parentSuspense, optimized, rendererInternals, hydrateChildren);
-                      }
-                  }
-                  else if ( shapeFlag & 128 /* SUSPENSE */) {
-                      nextNode = vnode.type.hydrate(node, vnode, parentComponent, parentSuspense, isSVGContainer(parentNode(node)), optimized, rendererInternals, hydrateNode);
-                  }
-                  else {
-                      warn('Invalid HostVNode type:', type, `(${typeof type})`);
-                  }
-          }
-          if (ref != null) {
-              setRef(ref, null, parentSuspense, vnode);
-          }
-          return nextNode;
-      };
-      const hydrateElement = (el, vnode, parentComponent, parentSuspense, optimized) => {
-          optimized = optimized || !!vnode.dynamicChildren;
-          const { props, patchFlag, shapeFlag, dirs } = vnode;
-          // skip props & children if this is hoisted static nodes
-          if (patchFlag !== -1 /* HOISTED */) {
-              if (dirs) {
-                  invokeDirectiveHook(vnode, null, parentComponent, 'created');
-              }
-              // props
-              if (props) {
-                  if (!optimized ||
-                      (patchFlag & 16 /* FULL_PROPS */ ||
-                          patchFlag & 32 /* HYDRATE_EVENTS */)) {
-                      for (const key in props) {
-                          if (!isReservedProp(key) && isOn(key)) {
-                              patchProp(el, key, null, props[key]);
-                          }
-                      }
-                  }
-                  else if (props.onClick) {
-                      // Fast path for click listeners (which is most often) to avoid
-                      // iterating through props.
-                      patchProp(el, 'onClick', null, props.onClick);
-                  }
-              }
-              // vnode / directive hooks
-              let vnodeHooks;
-              if ((vnodeHooks = props && props.onVnodeBeforeMount)) {
-                  invokeVNodeHook(vnodeHooks, parentComponent, vnode);
-              }
-              if (dirs) {
-                  invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount');
-              }
-              if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
-                  queueEffectWithSuspense(() => {
-                      vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
-                      dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted');
-                  }, parentSuspense);
-              }
-              // children
-              if (shapeFlag & 16 /* ARRAY_CHILDREN */ &&
-                  // skip if element has innerHTML / textContent
-                  !(props && (props.innerHTML || props.textContent))) {
-                  let next = hydrateChildren(el.firstChild, vnode, el, parentComponent, parentSuspense, optimized);
-                  let hasWarned = false;
-                  while (next) {
-                      hasMismatch = true;
-                      if ( !hasWarned) {
-                          warn(`Hydration children mismatch in <${vnode.type}>: ` +
-                              `server rendered element contains more child nodes than client vdom.`);
-                          hasWarned = true;
-                      }
-                      // The SSRed DOM contains more nodes than it should. Remove them.
-                      const cur = next;
-                      next = next.nextSibling;
-                      remove(cur);
-                  }
-              }
-              else if (shapeFlag & 8 /* TEXT_CHILDREN */) {
-                  if (el.textContent !== vnode.children) {
-                      hasMismatch = true;
-
-                          warn(`Hydration text content mismatch in <${vnode.type}>:\n` +
-                              `- Client: ${el.textContent}\n` +
-                              `- Server: ${vnode.children}`);
-                      el.textContent = vnode.children;
-                  }
-              }
-          }
-          return el.nextSibling;
-      };
-      const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, optimized) => {
-          optimized = optimized || !!parentVNode.dynamicChildren;
-          const children = parentVNode.children;
-          const l = children.length;
-          let hasWarned = false;
-          for (let i = 0; i < l; i++) {
-              const vnode = optimized
-                  ? children[i]
-                  : (children[i] = normalizeVNode(children[i]));
-              if (node) {
-                  node = hydrateNode(node, vnode, parentComponent, parentSuspense, optimized);
-              }
-              else {
-                  hasMismatch = true;
-                  if ( !hasWarned) {
-                      warn(`Hydration children mismatch in <${container.tagName.toLowerCase()}>: ` +
-                          `server rendered element contains fewer child nodes than client vdom.`);
-                      hasWarned = true;
-                  }
-                  // the SSRed DOM didn't contain enough nodes. Mount the missing ones.
-                  patch(null, vnode, container, null, parentComponent, parentSuspense, isSVGContainer(container));
-              }
-          }
-          return node;
-      };
-      const hydrateFragment = (node, vnode, parentComponent, parentSuspense, optimized) => {
-          const container = parentNode(node);
-          const next = hydrateChildren(nextSibling(node), vnode, container, parentComponent, parentSuspense, optimized);
-          if (next && isComment(next) && next.data === ']') {
-              return nextSibling((vnode.anchor = next));
-          }
-          else {
-              // fragment didn't hydrate successfully, since we didn't get a end anchor
-              // back. This should have led to node/children mismatch warnings.
-              hasMismatch = true;
-              // since the anchor is missing, we need to create one and insert it
-              insert((vnode.anchor = createComment(`]`)), container, next);
-              return next;
-          }
-      };
-      const handleMismatch = (node, vnode, parentComponent, parentSuspense, isFragment) => {
-          hasMismatch = true;
-
-              warn(`Hydration node mismatch:\n- Client vnode:`, vnode.type, `\n- Server rendered DOM:`, node, node.nodeType === 3 /* TEXT */
-                  ? `(text)`
-                  : isComment(node) && node.data === '['
-                      ? `(start of fragment)`
-                      : ``);
-          vnode.el = null;
-          if (isFragment) {
-              // remove excessive fragment nodes
-              const end = locateClosingAsyncAnchor(node);
-              while (true) {
-                  const next = nextSibling(node);
-                  if (next && next !== end) {
-                      remove(next);
-                  }
-                  else {
-                      break;
-                  }
-              }
-          }
-          const next = nextSibling(node);
-          const container = parentNode(node);
-          remove(node);
-          patch(null, vnode, container, next, parentComponent, parentSuspense, isSVGContainer(container));
-          return next;
-      };
-      const locateClosingAsyncAnchor = (node) => {
-          let match = 0;
-          while (node) {
-              node = nextSibling(node);
-              if (node && isComment(node)) {
-                  if (node.data === '[')
-                      match++;
-                  if (node.data === ']') {
-                      if (match === 0) {
-                          return nextSibling(node);
-                      }
-                      else {
-                          match--;
-                      }
-                  }
-              }
-          }
-          return node;
-      };
-      return [hydrate, hydrateNode];
-  }
-
-  let supported;
-  let perf;
-  function startMeasure(instance, type) {
-      if (instance.appContext.config.performance && isSupported()) {
-          perf.mark(`vue-${type}-${instance.uid}`);
-      }
-  }
-  function endMeasure(instance, type) {
-      if (instance.appContext.config.performance && isSupported()) {
-          const startTag = `vue-${type}-${instance.uid}`;
-          const endTag = startTag + `:end`;
-          perf.mark(endTag);
-          perf.measure(`<${formatComponentName(instance, instance.type)}> ${type}`, startTag, endTag);
-          perf.clearMarks(startTag);
-          perf.clearMarks(endTag);
-      }
-  }
-  function isSupported() {
-      if (supported !== undefined) {
-          return supported;
-      }
-      /* eslint-disable no-restricted-globals */
-      if (typeof window !== 'undefined' && window.performance) {
-          supported = true;
-          perf = window.performance;
-      }
-      else {
-          supported = false;
-      }
-      /* eslint-enable no-restricted-globals */
-      return supported;
-  }
-
-  // implementation, close to no-op
-  function defineComponent(options) {
-      return isFunction(options) ? { setup: options, name: options.name } : options;
-  }
-
-  const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
-  function defineAsyncComponent(source) {
-      if (isFunction(source)) {
-          source = { loader: source };
-      }
-      const { loader, loadingComponent: loadingComponent, errorComponent: errorComponent, delay = 200, timeout, // undefined = never times out
-      suspensible = true, onError: userOnError } = source;
-      let pendingRequest = null;
-      let resolvedComp;
-      let retries = 0;
-      const retry = () => {
-          retries++;
-          pendingRequest = null;
-          return load();
-      };
-      const load = () => {
-          let thisRequest;
-          return (pendingRequest ||
-              (thisRequest = pendingRequest = loader()
-                  .catch(err => {
-                  err = err instanceof Error ? err : new Error(String(err));
-                  if (userOnError) {
-                      return new Promise((resolve, reject) => {
-                          const userRetry = () => resolve(retry());
-                          const userFail = () => reject(err);
-                          userOnError(err, userRetry, userFail, retries + 1);
-                      });
-                  }
-                  else {
-                      throw err;
-                  }
-              })
-                  .then((comp) => {
-                  if (thisRequest !== pendingRequest && pendingRequest) {
-                      return pendingRequest;
-                  }
-                  if ( !comp) {
-                      warn(`Async component loader resolved to undefined. ` +
-                          `If you are using retry(), make sure to return its return value.`);
-                  }
-                  // interop module default
-                  if (comp &&
-                      (comp.__esModule || comp[Symbol.toStringTag] === 'Module')) {
-                      comp = comp.default;
-                  }
-                  if ( comp && !isObject(comp) && !isFunction(comp)) {
-                      throw new Error(`Invalid async component load result: ${comp}`);
-                  }
-                  resolvedComp = comp;
-                  return comp;
-              })));
-      };
-      return defineComponent({
-          __asyncLoader: load,
-          name: 'AsyncComponentWrapper',
-          setup() {
-              const instance = currentInstance;
-              // already resolved
-              if (resolvedComp) {
-                  return () => createInnerComp(resolvedComp, instance);
-              }
-              const onError = (err) => {
-                  pendingRequest = null;
-                  handleError(err, instance, 13 /* ASYNC_COMPONENT_LOADER */, !errorComponent /* do not throw in dev if user provided error component */);
-              };
-              // suspense-controlled or SSR.
-              if (( suspensible && instance.suspense) ||
-                  (false )) {
-                  return load()
-                      .then(comp => {
-                      return () => createInnerComp(comp, instance);
-                  })
-                      .catch(err => {
-                      onError(err);
-                      return () => errorComponent
-                          ? createVNode(errorComponent, {
-                              error: err
-                          })
-                          : null;
-                  });
-              }
-              const loaded = ref(false);
-              const error = ref();
-              const delayed = ref(!!delay);
-              if (delay) {
-                  setTimeout(() => {
-                      delayed.value = false;
-                  }, delay);
-              }
-              if (timeout != null) {
-                  setTimeout(() => {
-                      if (!loaded.value && !error.value) {
-                          const err = new Error(`Async component timed out after ${timeout}ms.`);
-                          onError(err);
-                          error.value = err;
-                      }
-                  }, timeout);
-              }
-              load()
-                  .then(() => {
-                  loaded.value = true;
-              })
-                  .catch(err => {
-                  onError(err);
-                  error.value = err;
-              });
-              return () => {
-                  if (loaded.value && resolvedComp) {
-                      return createInnerComp(resolvedComp, instance);
-                  }
-                  else if (error.value && errorComponent) {
-                      return createVNode(errorComponent, {
-                          error: error.value
-                      });
-                  }
-                  else if (loadingComponent && !delayed.value) {
-                      return createVNode(loadingComponent);
-                  }
-              };
-          }
-      });
-  }
-  function createInnerComp(comp, { vnode: { ref, props, children } }) {
-      const vnode = createVNode(comp, props, children);
-      // ensure inner component inherits the async wrapper's ref owner
-      vnode.ref = ref;
-      return vnode;
-  }
-
-  function createDevEffectOptions(instance) {
-      return {
-          scheduler: queueJob,
-          allowRecurse: true,
-          onTrack: instance.rtc ? e => invokeArrayFns(instance.rtc, e) : void 0,
-          onTrigger: instance.rtg ? e => invokeArrayFns(instance.rtg, e) : void 0
-      };
-  }
-  const queuePostRenderEffect =  queueEffectWithSuspense
-      ;
-  const setRef = (rawRef, oldRawRef, parentSuspense, vnode) => {
-      if (isArray(rawRef)) {
-          rawRef.forEach((r, i) => setRef(r, oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode));
-          return;
-      }
-      let value;
-      if (!vnode || isAsyncWrapper(vnode)) {
-          value = null;
-      }
-      else {
-          if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) {
-              value = vnode.component.exposed || vnode.component.proxy;
-          }
-          else {
-              value = vnode.el;
-          }
-      }
-      const { i: owner, r: ref } = rawRef;
-      if ( !owner) {
-          warn(`Missing ref owner context. ref cannot be used on hoisted vnodes. ` +
-              `A vnode with ref must be created inside the render function.`);
-          return;
-      }
-      const oldRef = oldRawRef && oldRawRef.r;
-      const refs = owner.refs === EMPTY_OBJ ? (owner.refs = {}) : owner.refs;
-      const setupState = owner.setupState;
-      // unset old ref
-      if (oldRef != null && oldRef !== ref) {
-          if (isString(oldRef)) {
-              refs[oldRef] = null;
-              if (hasOwn(setupState, oldRef)) {
-                  setupState[oldRef] = null;
-              }
-          }
-          else if (isRef(oldRef)) {
-              oldRef.value = null;
-          }
-      }
-      if (isString(ref)) {
-          const doSet = () => {
-              refs[ref] = value;
-              if (hasOwn(setupState, ref)) {
-                  setupState[ref] = value;
-              }
-          };
-          // #1789: for non-null values, set them after render
-          // null values means this is unmount and it should not overwrite another
-          // ref with the same key
-          if (value) {
-              doSet.id = -1;
-              queuePostRenderEffect(doSet, parentSuspense);
-          }
-          else {
-              doSet();
-          }
-      }
-      else if (isRef(ref)) {
-          const doSet = () => {
-              ref.value = value;
-          };
-          if (value) {
-              doSet.id = -1;
-              queuePostRenderEffect(doSet, parentSuspense);
-          }
-          else {
-              doSet();
-          }
-      }
-      else if (isFunction(ref)) {
-          callWithErrorHandling(ref, owner, 12 /* FUNCTION_REF */, [value, refs]);
-      }
-      else {
-          warn('Invalid template ref type:', value, `(${typeof value})`);
-      }
-  };
-  /**
-   * The createRenderer function accepts two generic arguments:
-   * HostNode and HostElement, corresponding to Node and Element types in the
-   * host environment. For example, for runtime-dom, HostNode would be the DOM
-   * `Node` interface and HostElement would be the DOM `Element` interface.
-   *
-   * Custom renderers can pass in the platform specific types like this:
-   *
-   * ``` js
-   * const { render, createApp } = createRenderer<Node, Element>({
-   *   patchProp,
-   *   ...nodeOps
-   * })
-   * ```
-   */
-  function createRenderer(options) {
-      return baseCreateRenderer(options);
-  }
-  // Separate API for creating hydration-enabled renderer.
-  // Hydration logic is only used when calling this function, making it
-  // tree-shakable.
-  function createHydrationRenderer(options) {
-      return baseCreateRenderer(options, createHydrationFunctions);
-  }
-  // implementation
-  function baseCreateRenderer(options, createHydrationFns) {
-      const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, forcePatchProp: hostForcePatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, cloneNode: hostCloneNode, insertStaticContent: hostInsertStaticContent } = options;
-      // Note: functions inside this closure should use `const xxx = () => {}`
-      // style in order to prevent being inlined by minifiers.
-      const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, optimized = false) => {
-          // patching & not same type, unmount old tree
-          if (n1 && !isSameVNodeType(n1, n2)) {
-              anchor = getNextHostNode(n1);
-              unmount(n1, parentComponent, parentSuspense, true);
-              n1 = null;
-          }
-          if (n2.patchFlag === -2 /* BAIL */) {
-              optimized = false;
-              n2.dynamicChildren = null;
-          }
-          const { type, ref, shapeFlag } = n2;
-          switch (type) {
-              case Text:
-                  processText(n1, n2, container, anchor);
-                  break;
-              case Comment:
-                  processCommentNode(n1, n2, container, anchor);
-                  break;
-              case Static:
-                  if (n1 == null) {
-                      mountStaticNode(n2, container, anchor, isSVG);
-                  }
-                  else {
-                      patchStaticNode(n1, n2, container, isSVG);
-                  }
-                  break;
-              case Fragment:
-                  processFragment(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  break;
-              default:
-                  if (shapeFlag & 1 /* ELEMENT */) {
-                      processElement(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  }
-                  else if (shapeFlag & 6 /* COMPONENT */) {
-                      processComponent(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  }
-                  else if (shapeFlag & 64 /* TELEPORT */) {
-                      type.process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, internals);
-                  }
-                  else if ( shapeFlag & 128 /* SUSPENSE */) {
-                      type.process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, internals);
-                  }
-                  else {
-                      warn('Invalid VNode type:', type, `(${typeof type})`);
-                  }
-          }
-          // set ref
-          if (ref != null && parentComponent) {
-              setRef(ref, n1 && n1.ref, parentSuspense, n2);
-          }
-      };
-      const processText = (n1, n2, container, anchor) => {
-          if (n1 == null) {
-              hostInsert((n2.el = hostCreateText(n2.children)), container, anchor);
-          }
-          else {
-              const el = (n2.el = n1.el);
-              if (n2.children !== n1.children) {
-                  hostSetText(el, n2.children);
-              }
-          }
-      };
-      const processCommentNode = (n1, n2, container, anchor) => {
-          if (n1 == null) {
-              hostInsert((n2.el = hostCreateComment(n2.children || '')), container, anchor);
-          }
-          else {
-              // there's no support for dynamic comments
-              n2.el = n1.el;
-          }
-      };
-      const mountStaticNode = (n2, container, anchor, isSVG) => {
-          [n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, isSVG);
-      };
-      /**
-       * Dev / HMR only
-       */
-      const patchStaticNode = (n1, n2, container, isSVG) => {
-          // static nodes are only patched during dev for HMR
-          if (n2.children !== n1.children) {
-              const anchor = hostNextSibling(n1.anchor);
-              // remove existing
-              removeStaticNode(n1);
-              [n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, isSVG);
-          }
-          else {
-              n2.el = n1.el;
-              n2.anchor = n1.anchor;
-          }
-      };
-      const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
-          let next;
-          while (el && el !== anchor) {
-              next = hostNextSibling(el);
-              hostInsert(el, container, nextSibling);
-              el = next;
-          }
-          hostInsert(anchor, container, nextSibling);
-      };
-      const removeStaticNode = ({ el, anchor }) => {
-          let next;
-          while (el && el !== anchor) {
-              next = hostNextSibling(el);
-              hostRemove(el);
-              el = next;
-          }
-          hostRemove(anchor);
-      };
-      const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          isSVG = isSVG || n2.type === 'svg';
-          if (n1 == null) {
-              mountElement(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-          }
-          else {
-              patchElement(n1, n2, parentComponent, parentSuspense, isSVG, optimized);
-          }
-      };
-      const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          let el;
-          let vnodeHook;
-          const { type, props, shapeFlag, transition, scopeId, patchFlag, dirs } = vnode;
-          {
-              el = vnode.el = hostCreateElement(vnode.type, isSVG, props && props.is);
-              // mount children first, since some props may rely on child content
-              // being already rendered, e.g. `<select value>`
-              if (shapeFlag & 8 /* TEXT_CHILDREN */) {
-                  hostSetElementText(el, vnode.children);
-              }
-              else if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
-                  mountChildren(vnode.children, el, null, parentComponent, parentSuspense, isSVG && type !== 'foreignObject', optimized || !!vnode.dynamicChildren);
-              }
-              if (dirs) {
-                  invokeDirectiveHook(vnode, null, parentComponent, 'created');
-              }
-              // props
-              if (props) {
-                  for (const key in props) {
-                      if (!isReservedProp(key)) {
-                          hostPatchProp(el, key, null, props[key], isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
-                      }
-                  }
-                  if ((vnodeHook = props.onVnodeBeforeMount)) {
-                      invokeVNodeHook(vnodeHook, parentComponent, vnode);
-                  }
-              }
-              // scopeId
-              setScopeId(el, scopeId, vnode, parentComponent);
-          }
-          {
-              Object.defineProperty(el, '__vnode', {
-                  value: vnode,
-                  enumerable: false
-              });
-              Object.defineProperty(el, '__vueParentComponent', {
-                  value: parentComponent,
-                  enumerable: false
-              });
-          }
-          if (dirs) {
-              invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount');
-          }
-          // #1583 For inside suspense + suspense not resolved case, enter hook should call when suspense resolved
-          // #1689 For inside suspense + suspense resolved case, just call it
-          const needCallTransitionHooks = (!parentSuspense || (parentSuspense && !parentSuspense.pendingBranch)) &&
-              transition &&
-              !transition.persisted;
-          if (needCallTransitionHooks) {
-              transition.beforeEnter(el);
-          }
-          hostInsert(el, container, anchor);
-          if ((vnodeHook = props && props.onVnodeMounted) ||
-              needCallTransitionHooks ||
-              dirs) {
-              queuePostRenderEffect(() => {
-                  vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
-                  needCallTransitionHooks && transition.enter(el);
-                  dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted');
-              }, parentSuspense);
-          }
-      };
-      const setScopeId = (el, scopeId, vnode, parentComponent) => {
-          if (scopeId) {
-              hostSetScopeId(el, scopeId);
-          }
-          if (parentComponent) {
-              const treeOwnerId = parentComponent.type.__scopeId;
-              // vnode's own scopeId and the current patched component's scopeId is
-              // different - this is a slot content node.
-              if (treeOwnerId && treeOwnerId !== scopeId) {
-                  hostSetScopeId(el, treeOwnerId + '-s');
-              }
-              let subTree = parentComponent.subTree;
-              if ( subTree.type === Fragment) {
-                  subTree =
-                      filterSingleRoot(subTree.children) || subTree;
-              }
-              if (vnode === subTree) {
-                  setScopeId(el, parentComponent.vnode.scopeId, parentComponent.vnode, parentComponent.parent);
-              }
-          }
-      };
-      const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, optimized, start = 0) => {
-          for (let i = start; i < children.length; i++) {
-              const child = (children[i] = optimized
-                  ? cloneIfMounted(children[i])
-                  : normalizeVNode(children[i]));
-              patch(null, child, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-          }
-      };
-      const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, optimized) => {
-          const el = (n2.el = n1.el);
-          let { patchFlag, dynamicChildren, dirs } = n2;
-          // #1426 take the old vnode's patch flag into account since user may clone a
-          // compiler-generated vnode, which de-opts to FULL_PROPS
-          patchFlag |= n1.patchFlag & 16 /* FULL_PROPS */;
-          const oldProps = n1.props || EMPTY_OBJ;
-          const newProps = n2.props || EMPTY_OBJ;
-          let vnodeHook;
-          if ((vnodeHook = newProps.onVnodeBeforeUpdate)) {
-              invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
-          }
-          if (dirs) {
-              invokeDirectiveHook(n2, n1, parentComponent, 'beforeUpdate');
-          }
-          if ( isHmrUpdating) {
-              // HMR updated, force full diff
-              patchFlag = 0;
-              optimized = false;
-              dynamicChildren = null;
-          }
-          if (patchFlag > 0) {
-              // the presence of a patchFlag means this element's render code was
-              // generated by the compiler and can take the fast path.
-              // in this path old node and new node are guaranteed to have the same shape
-              // (i.e. at the exact same position in the source template)
-              if (patchFlag & 16 /* FULL_PROPS */) {
-                  // element props contain dynamic keys, full diff needed
-                  patchProps(el, n2, oldProps, newProps, parentComponent, parentSuspense, isSVG);
-              }
-              else {
-                  // class
-                  // this flag is matched when the element has dynamic class bindings.
-                  if (patchFlag & 2 /* CLASS */) {
-                      if (oldProps.class !== newProps.class) {
-                          hostPatchProp(el, 'class', null, newProps.class, isSVG);
-                      }
-                  }
-                  // style
-                  // this flag is matched when the element has dynamic style bindings
-                  if (patchFlag & 4 /* STYLE */) {
-                      hostPatchProp(el, 'style', oldProps.style, newProps.style, isSVG);
-                  }
-                  // props
-                  // This flag is matched when the element has dynamic prop/attr bindings
-                  // other than class and style. The keys of dynamic prop/attrs are saved for
-                  // faster iteration.
-                  // Note dynamic keys like :[foo]="bar" will cause this optimization to
-                  // bail out and go through a full diff because we need to unset the old key
-                  if (patchFlag & 8 /* PROPS */) {
-                      // if the flag is present then dynamicProps must be non-null
-                      const propsToUpdate = n2.dynamicProps;
-                      for (let i = 0; i < propsToUpdate.length; i++) {
-                          const key = propsToUpdate[i];
-                          const prev = oldProps[key];
-                          const next = newProps[key];
-                          if (next !== prev ||
-                              (hostForcePatchProp && hostForcePatchProp(el, key))) {
-                              hostPatchProp(el, key, prev, next, isSVG, n1.children, parentComponent, parentSuspense, unmountChildren);
-                          }
-                      }
-                  }
-              }
-              // text
-              // This flag is matched when the element has only dynamic text children.
-              if (patchFlag & 1 /* TEXT */) {
-                  if (n1.children !== n2.children) {
-                      hostSetElementText(el, n2.children);
-                  }
-              }
-          }
-          else if (!optimized && dynamicChildren == null) {
-              // unoptimized, full diff
-              patchProps(el, n2, oldProps, newProps, parentComponent, parentSuspense, isSVG);
-          }
-          const areChildrenSVG = isSVG && n2.type !== 'foreignObject';
-          if (dynamicChildren) {
-              patchBlockChildren(n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, areChildrenSVG);
-              if ( parentComponent && parentComponent.type.__hmrId) {
-                  traverseStaticChildren(n1, n2);
-              }
-          }
-          else if (!optimized) {
-              // full diff
-              patchChildren(n1, n2, el, null, parentComponent, parentSuspense, areChildrenSVG);
-          }
-          if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
-              queuePostRenderEffect(() => {
-                  vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
-                  dirs && invokeDirectiveHook(n2, n1, parentComponent, 'updated');
-              }, parentSuspense);
-          }
-      };
-      // The fast path for blocks.
-      const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG) => {
-          for (let i = 0; i < newChildren.length; i++) {
-              const oldVNode = oldChildren[i];
-              const newVNode = newChildren[i];
-              // Determine the container (parent element) for the patch.
-              const container =
-              // - In the case of a Fragment, we need to provide the actual parent
-              // of the Fragment itself so it can move its children.
-              oldVNode.type === Fragment ||
-                  // - In the case of different nodes, there is going to be a replacement
-                  // which also requires the correct parent container
-                  !isSameVNodeType(oldVNode, newVNode) ||
-                  // - In the case of a component, it could contain anything.
-                  oldVNode.shapeFlag & 6 /* COMPONENT */ ||
-                  oldVNode.shapeFlag & 64 /* TELEPORT */
-                  ? hostParentNode(oldVNode.el)
-                  : // In other cases, the parent container is not actually used so we
-                      // just pass the block element here to avoid a DOM parentNode call.
-                      fallbackContainer;
-              patch(oldVNode, newVNode, container, null, parentComponent, parentSuspense, isSVG, true);
-          }
-      };
-      const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {
-          if (oldProps !== newProps) {
-              for (const key in newProps) {
-                  // empty string is not valid prop
-                  if (isReservedProp(key))
-                      continue;
-                  const next = newProps[key];
-                  const prev = oldProps[key];
-                  if (next !== prev ||
-                      (hostForcePatchProp && hostForcePatchProp(el, key))) {
-                      hostPatchProp(el, key, prev, next, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
-                  }
-              }
-              if (oldProps !== EMPTY_OBJ) {
-                  for (const key in oldProps) {
-                      if (!isReservedProp(key) && !(key in newProps)) {
-                          hostPatchProp(el, key, oldProps[key], null, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
-                      }
-                  }
-              }
-          }
-      };
-      const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          const fragmentStartAnchor = (n2.el = n1 ? n1.el : hostCreateText(''));
-          const fragmentEndAnchor = (n2.anchor = n1 ? n1.anchor : hostCreateText(''));
-          let { patchFlag, dynamicChildren } = n2;
-          if (patchFlag > 0) {
-              optimized = true;
-          }
-          if ( isHmrUpdating) {
-              // HMR updated, force full diff
-              patchFlag = 0;
-              optimized = false;
-              dynamicChildren = null;
-          }
-          if (n1 == null) {
-              hostInsert(fragmentStartAnchor, container, anchor);
-              hostInsert(fragmentEndAnchor, container, anchor);
-              // a fragment can only have array children
-              // since they are either generated by the compiler, or implicitly created
-              // from arrays.
-              mountChildren(n2.children, container, fragmentEndAnchor, parentComponent, parentSuspense, isSVG, optimized);
-          }
-          else {
-              if (patchFlag > 0 &&
-                  patchFlag & 64 /* STABLE_FRAGMENT */ &&
-                  dynamicChildren &&
-                  // #2715 the previous fragment could've been a BAILed one as a result
-                  // of renderSlot() with no valid children
-                  n1.dynamicChildren) {
-                  // a stable fragment (template root or <template v-for>) doesn't need to
-                  // patch children order, but it may contain dynamicChildren.
-                  patchBlockChildren(n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, isSVG);
-                  if ( parentComponent && parentComponent.type.__hmrId) {
-                      traverseStaticChildren(n1, n2);
-                  }
-                  else if (
-                  // #2080 if the stable fragment has a key, it's a <template v-for> that may
-                  //  get moved around. Make sure all root level vnodes inherit el.
-                  // #2134 or if it's a component root, it may also get moved around
-                  // as the component is being moved.
-                  n2.key != null ||
-                      (parentComponent && n2 === parentComponent.subTree)) {
-                      traverseStaticChildren(n1, n2, true /* shallow */);
-                  }
-              }
-              else {
-                  // keyed / unkeyed, or manual fragments.
-                  // for keyed & unkeyed, since they are compiler generated from v-for,
-                  // each child is guaranteed to be a block so the fragment will never
-                  // have dynamicChildren.
-                  patchChildren(n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, isSVG, optimized);
-              }
-          }
-      };
-      const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          if (n1 == null) {
-              if (n2.shapeFlag & 512 /* COMPONENT_KEPT_ALIVE */) {
-                  parentComponent.ctx.activate(n2, container, anchor, isSVG, optimized);
-              }
-              else {
-                  mountComponent(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-              }
-          }
-          else {
-              updateComponent(n1, n2, optimized);
-          }
-      };
-      const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          const instance = (initialVNode.component = createComponentInstance(initialVNode, parentComponent, parentSuspense));
-          if ( instance.type.__hmrId) {
-              registerHMR(instance);
-          }
-          {
-              pushWarningContext(initialVNode);
-              startMeasure(instance, `mount`);
-          }
-          // inject renderer internals for keepAlive
-          if (isKeepAlive(initialVNode)) {
-              instance.ctx.renderer = internals;
-          }
-          // resolve props and slots for setup context
-          {
-              startMeasure(instance, `init`);
-          }
-          setupComponent(instance);
-          {
-              endMeasure(instance, `init`);
-          }
-          // setup() is async. This component relies on async logic to be resolved
-          // before proceeding
-          if ( instance.asyncDep) {
-              parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);
-              // Give it a placeholder if this is not hydration
-              // TODO handle self-defined fallback
-              if (!initialVNode.el) {
-                  const placeholder = (instance.subTree = createVNode(Comment));
-                  processCommentNode(null, placeholder, container, anchor);
-              }
-              return;
-          }
-          setupRenderEffect(instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized);
-          {
-              popWarningContext();
-              endMeasure(instance, `mount`);
-          }
-      };
-      const updateComponent = (n1, n2, optimized) => {
-          const instance = (n2.component = n1.component);
-          if (shouldUpdateComponent(n1, n2, optimized)) {
-              if (
-                  instance.asyncDep &&
-                  !instance.asyncResolved) {
-                  // async & still pending - just update props and slots
-                  // since the component's reactive effect for render isn't set-up yet
-                  {
-                      pushWarningContext(n2);
-                  }
-                  updateComponentPreRender(instance, n2, optimized);
-                  {
-                      popWarningContext();
-                  }
-                  return;
-              }
-              else {
-                  // normal update
-                  instance.next = n2;
-                  // in case the child component is also queued, remove it to avoid
-                  // double updating the same child component in the same flush.
-                  invalidateJob(instance.update);
-                  // instance.update is the reactive effect runner.
-                  instance.update();
-              }
-          }
-          else {
-              // no update needed. just copy over properties
-              n2.component = n1.component;
-              n2.el = n1.el;
-              instance.vnode = n2;
-          }
-      };
-      const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {
-          // create reactive effect for rendering
-          instance.update = effect(function componentEffect() {
-              if (!instance.isMounted) {
-                  let vnodeHook;
-                  const { el, props } = initialVNode;
-                  const { bm, m, parent } = instance;
-                  // beforeMount hook
-                  if (bm) {
-                      invokeArrayFns(bm);
-                  }
-                  // onVnodeBeforeMount
-                  if ((vnodeHook = props && props.onVnodeBeforeMount)) {
-                      invokeVNodeHook(vnodeHook, parent, initialVNode);
-                  }
-                  // render
-                  {
-                      startMeasure(instance, `render`);
-                  }
-                  const subTree = (instance.subTree = renderComponentRoot(instance));
-                  {
-                      endMeasure(instance, `render`);
-                  }
-                  if (el && hydrateNode) {
-                      {
-                          startMeasure(instance, `hydrate`);
-                      }
-                      // vnode has adopted host node - perform hydration instead of mount.
-                      hydrateNode(initialVNode.el, subTree, instance, parentSuspense);
-                      {
-                          endMeasure(instance, `hydrate`);
-                      }
-                  }
-                  else {
-                      {
-                          startMeasure(instance, `patch`);
-                      }
-                      patch(null, subTree, container, anchor, instance, parentSuspense, isSVG);
-                      {
-                          endMeasure(instance, `patch`);
-                      }
-                      initialVNode.el = subTree.el;
-                  }
-                  // mounted hook
-                  if (m) {
-                      queuePostRenderEffect(m, parentSuspense);
-                  }
-                  // onVnodeMounted
-                  if ((vnodeHook = props && props.onVnodeMounted)) {
-                      const scopedInitialVNode = initialVNode;
-                      queuePostRenderEffect(() => {
-                          invokeVNodeHook(vnodeHook, parent, scopedInitialVNode);
-                      }, parentSuspense);
-                  }
-                  // activated hook for keep-alive roots.
-                  // #1742 activated hook must be accessed after first render
-                  // since the hook may be injected by a child keep-alive
-                  const { a } = instance;
-                  if (a &&
-                      initialVNode.shapeFlag & 256 /* COMPONENT_SHOULD_KEEP_ALIVE */) {
-                      queuePostRenderEffect(a, parentSuspense);
-                  }
-                  instance.isMounted = true;
-                  // #2458: deference mount-only object parameters to prevent memleaks
-                  initialVNode = container = anchor = null;
-              }
-              else {
-                  // updateComponent
-                  // This is triggered by mutation of component's own state (next: null)
-                  // OR parent calling processComponent (next: VNode)
-                  let { next, bu, u, parent, vnode } = instance;
-                  let originNext = next;
-                  let vnodeHook;
-                  {
-                      pushWarningContext(next || instance.vnode);
-                  }
-                  if (next) {
-                      next.el = vnode.el;
-                      updateComponentPreRender(instance, next, optimized);
-                  }
-                  else {
-                      next = vnode;
-                  }
-                  // beforeUpdate hook
-                  if (bu) {
-                      invokeArrayFns(bu);
-                  }
-                  // onVnodeBeforeUpdate
-                  if ((vnodeHook = next.props && next.props.onVnodeBeforeUpdate)) {
-                      invokeVNodeHook(vnodeHook, parent, next, vnode);
-                  }
-                  // render
-                  {
-                      startMeasure(instance, `render`);
-                  }
-                  const nextTree = renderComponentRoot(instance);
-                  {
-                      endMeasure(instance, `render`);
-                  }
-                  const prevTree = instance.subTree;
-                  instance.subTree = nextTree;
-                  {
-                      startMeasure(instance, `patch`);
-                  }
-                  patch(prevTree, nextTree,
-                  // parent may have changed if it's in a teleport
-                  hostParentNode(prevTree.el),
-                  // anchor may have changed if it's in a fragment
-                  getNextHostNode(prevTree), instance, parentSuspense, isSVG);
-                  {
-                      endMeasure(instance, `patch`);
-                  }
-                  next.el = nextTree.el;
-                  if (originNext === null) {
-                      // self-triggered update. In case of HOC, update parent component
-                      // vnode el. HOC is indicated by parent instance's subTree pointing
-                      // to child component's vnode
-                      updateHOCHostEl(instance, nextTree.el);
-                  }
-                  // updated hook
-                  if (u) {
-                      queuePostRenderEffect(u, parentSuspense);
-                  }
-                  // onVnodeUpdated
-                  if ((vnodeHook = next.props && next.props.onVnodeUpdated)) {
-                      queuePostRenderEffect(() => {
-                          invokeVNodeHook(vnodeHook, parent, next, vnode);
-                      }, parentSuspense);
-                  }
-                  {
-                      devtoolsComponentUpdated(instance);
-                  }
-                  {
-                      popWarningContext();
-                  }
-              }
-          },  createDevEffectOptions(instance) );
-      };
-      const updateComponentPreRender = (instance, nextVNode, optimized) => {
-          nextVNode.component = instance;
-          const prevProps = instance.vnode.props;
-          instance.vnode = nextVNode;
-          instance.next = null;
-          updateProps(instance, nextVNode.props, prevProps, optimized);
-          updateSlots(instance, nextVNode.children);
-          // props update may have triggered pre-flush watchers.
-          // flush them before the render update.
-          flushPreFlushCbs(undefined, instance.update);
-      };
-      const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized = false) => {
-          const c1 = n1 && n1.children;
-          const prevShapeFlag = n1 ? n1.shapeFlag : 0;
-          const c2 = n2.children;
-          const { patchFlag, shapeFlag } = n2;
-          // fast path
-          if (patchFlag > 0) {
-              if (patchFlag & 128 /* KEYED_FRAGMENT */) {
-                  // this could be either fully-keyed or mixed (some keyed some not)
-                  // presence of patchFlag means children are guaranteed to be arrays
-                  patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  return;
-              }
-              else if (patchFlag & 256 /* UNKEYED_FRAGMENT */) {
-                  // unkeyed
-                  patchUnkeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  return;
-              }
-          }
-          // children has 3 possibilities: text, array or no children.
-          if (shapeFlag & 8 /* TEXT_CHILDREN */) {
-              // text children fast path
-              if (prevShapeFlag & 16 /* ARRAY_CHILDREN */) {
-                  unmountChildren(c1, parentComponent, parentSuspense);
-              }
-              if (c2 !== c1) {
-                  hostSetElementText(container, c2);
-              }
-          }
-          else {
-              if (prevShapeFlag & 16 /* ARRAY_CHILDREN */) {
-                  // prev children was array
-                  if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
-                      // two arrays, cannot assume anything, do full diff
-                      patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  }
-                  else {
-                      // no new children, just unmount old
-                      unmountChildren(c1, parentComponent, parentSuspense, true);
-                  }
-              }
-              else {
-                  // prev children was text OR null
-                  // new children is array OR null
-                  if (prevShapeFlag & 8 /* TEXT_CHILDREN */) {
-                      hostSetElementText(container, '');
-                  }
-                  // mount new if array
-                  if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
-                      mountChildren(c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  }
-              }
-          }
-      };
-      const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          c1 = c1 || EMPTY_ARR;
-          c2 = c2 || EMPTY_ARR;
-          const oldLength = c1.length;
-          const newLength = c2.length;
-          const commonLength = Math.min(oldLength, newLength);
-          let i;
-          for (i = 0; i < commonLength; i++) {
-              const nextChild = (c2[i] = optimized
-                  ? cloneIfMounted(c2[i])
-                  : normalizeVNode(c2[i]));
-              patch(c1[i], nextChild, container, null, parentComponent, parentSuspense, isSVG, optimized);
-          }
-          if (oldLength > newLength) {
-              // remove old
-              unmountChildren(c1, parentComponent, parentSuspense, true, false, commonLength);
-          }
-          else {
-              // mount new
-              mountChildren(c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, commonLength);
-          }
-      };
-      // can be all-keyed or mixed
-      const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, optimized) => {
-          let i = 0;
-          const l2 = c2.length;
-          let e1 = c1.length - 1; // prev ending index
-          let e2 = l2 - 1; // next ending index
-          // 1. sync from start
-          // (a b) c
-          // (a b) d e
-          while (i <= e1 && i <= e2) {
-              const n1 = c1[i];
-              const n2 = (c2[i] = optimized
-                  ? cloneIfMounted(c2[i])
-                  : normalizeVNode(c2[i]));
-              if (isSameVNodeType(n1, n2)) {
-                  patch(n1, n2, container, null, parentComponent, parentSuspense, isSVG, optimized);
-              }
-              else {
-                  break;
-              }
-              i++;
-          }
-          // 2. sync from end
-          // a (b c)
-          // d e (b c)
-          while (i <= e1 && i <= e2) {
-              const n1 = c1[e1];
-              const n2 = (c2[e2] = optimized
-                  ? cloneIfMounted(c2[e2])
-                  : normalizeVNode(c2[e2]));
-              if (isSameVNodeType(n1, n2)) {
-                  patch(n1, n2, container, null, parentComponent, parentSuspense, isSVG, optimized);
-              }
-              else {
-                  break;
-              }
-              e1--;
-              e2--;
-          }
-          // 3. common sequence + mount
-          // (a b)
-          // (a b) c
-          // i = 2, e1 = 1, e2 = 2
-          // (a b)
-          // c (a b)
-          // i = 0, e1 = -1, e2 = 0
-          if (i > e1) {
-              if (i <= e2) {
-                  const nextPos = e2 + 1;
-                  const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
-                  while (i <= e2) {
-                      patch(null, (c2[i] = optimized
-                          ? cloneIfMounted(c2[i])
-                          : normalizeVNode(c2[i])), container, anchor, parentComponent, parentSuspense, isSVG);
-                      i++;
-                  }
-              }
-          }
-          // 4. common sequence + unmount
-          // (a b) c
-          // (a b)
-          // i = 2, e1 = 2, e2 = 1
-          // a (b c)
-          // (b c)
-          // i = 0, e1 = 0, e2 = -1
-          else if (i > e2) {
-              while (i <= e1) {
-                  unmount(c1[i], parentComponent, parentSuspense, true);
-                  i++;
-              }
-          }
-          // 5. unknown sequence
-          // [i ... e1 + 1]: a b [c d e] f g
-          // [i ... e2 + 1]: a b [e d c h] f g
-          // i = 2, e1 = 4, e2 = 5
-          else {
-              const s1 = i; // prev starting index
-              const s2 = i; // next starting index
-              // 5.1 build key:index map for newChildren
-              const keyToNewIndexMap = new Map();
-              for (i = s2; i <= e2; i++) {
-                  const nextChild = (c2[i] = optimized
-                      ? cloneIfMounted(c2[i])
-                      : normalizeVNode(c2[i]));
-                  if (nextChild.key != null) {
-                      if ( keyToNewIndexMap.has(nextChild.key)) {
-                          warn(`Duplicate keys found during update:`, JSON.stringify(nextChild.key), `Make sure keys are unique.`);
-                      }
-                      keyToNewIndexMap.set(nextChild.key, i);
-                  }
-              }
-              // 5.2 loop through old children left to be patched and try to patch
-              // matching nodes & remove nodes that are no longer present
-              let j;
-              let patched = 0;
-              const toBePatched = e2 - s2 + 1;
-              let moved = false;
-              // used to track whether any node has moved
-              let maxNewIndexSoFar = 0;
-              // works as Map<newIndex, oldIndex>
-              // Note that oldIndex is offset by +1
-              // and oldIndex = 0 is a special value indicating the new node has
-              // no corresponding old node.
-              // used for determining longest stable subsequence
-              const newIndexToOldIndexMap = new Array(toBePatched);
-              for (i = 0; i < toBePatched; i++)
-                  newIndexToOldIndexMap[i] = 0;
-              for (i = s1; i <= e1; i++) {
-                  const prevChild = c1[i];
-                  if (patched >= toBePatched) {
-                      // all new children have been patched so this can only be a removal
-                      unmount(prevChild, parentComponent, parentSuspense, true);
-                      continue;
-                  }
-                  let newIndex;
-                  if (prevChild.key != null) {
-                      newIndex = keyToNewIndexMap.get(prevChild.key);
-                  }
-                  else {
-                      // key-less node, try to locate a key-less node of the same type
-                      for (j = s2; j <= e2; j++) {
-                          if (newIndexToOldIndexMap[j - s2] === 0 &&
-                              isSameVNodeType(prevChild, c2[j])) {
-                              newIndex = j;
-                              break;
-                          }
-                      }
-                  }
-                  if (newIndex === undefined) {
-                      unmount(prevChild, parentComponent, parentSuspense, true);
-                  }
-                  else {
-                      newIndexToOldIndexMap[newIndex - s2] = i + 1;
-                      if (newIndex >= maxNewIndexSoFar) {
-                          maxNewIndexSoFar = newIndex;
-                      }
-                      else {
-                          moved = true;
-                      }
-                      patch(prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, isSVG, optimized);
-                      patched++;
-                  }
-              }
-              // 5.3 move and mount
-              // generate longest stable subsequence only when nodes have moved
-              const increasingNewIndexSequence = moved
-                  ? getSequence(newIndexToOldIndexMap)
-                  : EMPTY_ARR;
-              j = increasingNewIndexSequence.length - 1;
-              // looping backwards so that we can use last patched node as anchor
-              for (i = toBePatched - 1; i >= 0; i--) {
-                  const nextIndex = s2 + i;
-                  const nextChild = c2[nextIndex];
-                  const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;
-                  if (newIndexToOldIndexMap[i] === 0) {
-                      // mount new
-                      patch(null, nextChild, container, anchor, parentComponent, parentSuspense, isSVG);
-                  }
-                  else if (moved) {
-                      // move if:
-                      // There is no stable subsequence (e.g. a reverse)
-                      // OR current node is not among the stable sequence
-                      if (j < 0 || i !== increasingNewIndexSequence[j]) {
-                          move(nextChild, container, anchor, 2 /* REORDER */);
-                      }
-                      else {
-                          j--;
-                      }
-                  }
-              }
-          }
-      };
-      const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
-          const { el, type, transition, children, shapeFlag } = vnode;
-          if (shapeFlag & 6 /* COMPONENT */) {
-              move(vnode.component.subTree, container, anchor, moveType);
-              return;
-          }
-          if ( shapeFlag & 128 /* SUSPENSE */) {
-              vnode.suspense.move(container, anchor, moveType);
-              return;
-          }
-          if (shapeFlag & 64 /* TELEPORT */) {
-              type.move(vnode, container, anchor, internals);
-              return;
-          }
-          if (type === Fragment) {
-              hostInsert(el, container, anchor);
-              for (let i = 0; i < children.length; i++) {
-                  move(children[i], container, anchor, moveType);
-              }
-              hostInsert(vnode.anchor, container, anchor);
-              return;
-          }
-          if (type === Static) {
-              moveStaticNode(vnode, container, anchor);
-              return;
-          }
-          // single nodes
-          const needTransition = moveType !== 2 /* REORDER */ &&
-              shapeFlag & 1 /* ELEMENT */ &&
-              transition;
-          if (needTransition) {
-              if (moveType === 0 /* ENTER */) {
-                  transition.beforeEnter(el);
-                  hostInsert(el, container, anchor);
-                  queuePostRenderEffect(() => transition.enter(el), parentSuspense);
-              }
-              else {
-                  const { leave, delayLeave, afterLeave } = transition;
-                  const remove = () => hostInsert(el, container, anchor);
-                  const performLeave = () => {
-                      leave(el, () => {
-                          remove();
-                          afterLeave && afterLeave();
-                      });
-                  };
-                  if (delayLeave) {
-                      delayLeave(el, remove, performLeave);
-                  }
-                  else {
-                      performLeave();
-                  }
-              }
-          }
-          else {
-              hostInsert(el, container, anchor);
-          }
-      };
-      const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
-          const { type, props, ref, children, dynamicChildren, shapeFlag, patchFlag, dirs } = vnode;
-          // unset ref
-          if (ref != null) {
-              setRef(ref, null, parentSuspense, null);
-          }
-          if (shapeFlag & 256 /* COMPONENT_SHOULD_KEEP_ALIVE */) {
-              parentComponent.ctx.deactivate(vnode);
-              return;
-          }
-          const shouldInvokeDirs = shapeFlag & 1 /* ELEMENT */ && dirs;
-          let vnodeHook;
-          if ((vnodeHook = props && props.onVnodeBeforeUnmount)) {
-              invokeVNodeHook(vnodeHook, parentComponent, vnode);
-          }
-          if (shapeFlag & 6 /* COMPONENT */) {
-              unmountComponent(vnode.component, parentSuspense, doRemove);
-          }
-          else {
-              if ( shapeFlag & 128 /* SUSPENSE */) {
-                  vnode.suspense.unmount(parentSuspense, doRemove);
-                  return;
-              }
-              if (shouldInvokeDirs) {
-                  invokeDirectiveHook(vnode, null, parentComponent, 'beforeUnmount');
-              }
-              if (dynamicChildren &&
-                  // #1153: fast path should not be taken for non-stable (v-for) fragments
-                  (type !== Fragment ||
-                      (patchFlag > 0 && patchFlag & 64 /* STABLE_FRAGMENT */))) {
-                  // fast path for block nodes: only need to unmount dynamic children.
-                  unmountChildren(dynamicChildren, parentComponent, parentSuspense, false, true);
-              }
-              else if ((type === Fragment &&
-                  (patchFlag & 128 /* KEYED_FRAGMENT */ ||
-                      patchFlag & 256 /* UNKEYED_FRAGMENT */)) ||
-                  (!optimized && shapeFlag & 16 /* ARRAY_CHILDREN */)) {
-                  unmountChildren(children, parentComponent, parentSuspense);
-              }
-              // an unmounted teleport should always remove its children if not disabled
-              if (shapeFlag & 64 /* TELEPORT */ &&
-                  (doRemove || !isTeleportDisabled(vnode.props))) {
-                  vnode.type.remove(vnode, internals);
-              }
-              if (doRemove) {
-                  remove(vnode);
-              }
-          }
-          if ((vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
-              queuePostRenderEffect(() => {
-                  vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
-                  shouldInvokeDirs &&
-                      invokeDirectiveHook(vnode, null, parentComponent, 'unmounted');
-              }, parentSuspense);
-          }
-      };
-      const remove = vnode => {
-          const { type, el, anchor, transition } = vnode;
-          if (type === Fragment) {
-              removeFragment(el, anchor);
-              return;
-          }
-          if (type === Static) {
-              removeStaticNode(vnode);
-              return;
-          }
-          const performRemove = () => {
-              hostRemove(el);
-              if (transition && !transition.persisted && transition.afterLeave) {
-                  transition.afterLeave();
-              }
-          };
-          if (vnode.shapeFlag & 1 /* ELEMENT */ &&
-              transition &&
-              !transition.persisted) {
-              const { leave, delayLeave } = transition;
-              const performLeave = () => leave(el, performRemove);
-              if (delayLeave) {
-                  delayLeave(vnode.el, performRemove, performLeave);
-              }
-              else {
-                  performLeave();
-              }
-          }
-          else {
-              performRemove();
-          }
-      };
-      const removeFragment = (cur, end) => {
-          // For fragments, directly remove all contained DOM nodes.
-          // (fragment child nodes cannot have transition)
-          let next;
-          while (cur !== end) {
-              next = hostNextSibling(cur);
-              hostRemove(cur);
-              cur = next;
-          }
-          hostRemove(end);
-      };
-      const unmountComponent = (instance, parentSuspense, doRemove) => {
-          if ( instance.type.__hmrId) {
-              unregisterHMR(instance);
-          }
-          const { bum, effects, update, subTree, um } = instance;
-          // beforeUnmount hook
-          if (bum) {
-              invokeArrayFns(bum);
-          }
-          if (effects) {
-              for (let i = 0; i < effects.length; i++) {
-                  stop(effects[i]);
-              }
-          }
-          // update may be null if a component is unmounted before its async
-          // setup has resolved.
-          if (update) {
-              stop(update);
-              unmount(subTree, instance, parentSuspense, doRemove);
-          }
-          // unmounted hook
-          if (um) {
-              queuePostRenderEffect(um, parentSuspense);
-          }
-          queuePostRenderEffect(() => {
-              instance.isUnmounted = true;
-          }, parentSuspense);
-          // A component with async dep inside a pending suspense is unmounted before
-          // its async dep resolves. This should remove the dep from the suspense, and
-          // cause the suspense to resolve immediately if that was the last dep.
-          if (
-              parentSuspense &&
-              parentSuspense.pendingBranch &&
-              !parentSuspense.isUnmounted &&
-              instance.asyncDep &&
-              !instance.asyncResolved &&
-              instance.suspenseId === parentSuspense.pendingId) {
-              parentSuspense.deps--;
-              if (parentSuspense.deps === 0) {
-                  parentSuspense.resolve();
-              }
-          }
-          {
-              devtoolsComponentRemoved(instance);
-          }
-      };
-      const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
-          for (let i = start; i < children.length; i++) {
-              unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
-          }
-      };
-      const getNextHostNode = vnode => {
-          if (vnode.shapeFlag & 6 /* COMPONENT */) {
-              return getNextHostNode(vnode.component.subTree);
-          }
-          if ( vnode.shapeFlag & 128 /* SUSPENSE */) {
-              return vnode.suspense.next();
-          }
-          return hostNextSibling((vnode.anchor || vnode.el));
-      };
-      const render = (vnode, container) => {
-          if (vnode == null) {
-              if (container._vnode) {
-                  unmount(container._vnode, null, null, true);
-              }
-          }
-          else {
-              patch(container._vnode || null, vnode, container);
-          }
-          flushPostFlushCbs();
-          container._vnode = vnode;
-      };
-      const internals = {
-          p: patch,
-          um: unmount,
-          m: move,
-          r: remove,
-          mt: mountComponent,
-          mc: mountChildren,
-          pc: patchChildren,
-          pbc: patchBlockChildren,
-          n: getNextHostNode,
-          o: options
-      };
-      let hydrate;
-      let hydrateNode;
-      if (createHydrationFns) {
-          [hydrate, hydrateNode] = createHydrationFns(internals);
-      }
-      return {
-          render,
-          hydrate,
-          createApp: createAppAPI(render, hydrate)
-      };
-  }
-  function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
-      callWithAsyncErrorHandling(hook, instance, 7 /* VNODE_HOOK */, [
-          vnode,
-          prevVNode
-      ]);
-  }
-  /**
-   * #1156
-   * When a component is HMR-enabled, we need to make sure that all static nodes
-   * inside a block also inherit the DOM element from the previous tree so that
-   * HMR updates (which are full updates) can retrieve the element for patching.
-   *
-   * #2080
-   * Inside keyed `template` fragment static children, if a fragment is moved,
-   * the children will always moved so that need inherit el form previous nodes
-   * to ensure correct moved position.
-   */
-  function traverseStaticChildren(n1, n2, shallow = false) {
-      const ch1 = n1.children;
-      const ch2 = n2.children;
-      if (isArray(ch1) && isArray(ch2)) {
-          for (let i = 0; i < ch1.length; i++) {
-              // this is only called in the optimized path so array children are
-              // guaranteed to be vnodes
-              const c1 = ch1[i];
-              let c2 = ch2[i];
-              if (c2.shapeFlag & 1 /* ELEMENT */ && !c2.dynamicChildren) {
-                  if (c2.patchFlag <= 0 || c2.patchFlag === 32 /* HYDRATE_EVENTS */) {
-                      c2 = ch2[i] = cloneIfMounted(ch2[i]);
-                      c2.el = c1.el;
-                  }
-                  if (!shallow)
-                      traverseStaticChildren(c1, c2);
-              }
-              // also inherit for comment nodes, but not placeholders (e.g. v-if which
-              // would have received .el during block patch)
-              if ( c2.type === Comment && !c2.el) {
-                  c2.el = c1.el;
-              }
-          }
-      }
-  }
-  // https://en.wikipedia.org/wiki/Longest_increasing_subsequence
-  function getSequence(arr) {
-      const p = arr.slice();
-      const result = [0];
-      let i, j, u, v, c;
-      const len = arr.length;
-      for (i = 0; i < len; i++) {
-          const arrI = arr[i];
-          if (arrI !== 0) {
-              j = result[result.length - 1];
-              if (arr[j] < arrI) {
-                  p[i] = j;
-                  result.push(i);
-                  continue;
-              }
-              u = 0;
-              v = result.length - 1;
-              while (u < v) {
-                  c = ((u + v) / 2) | 0;
-                  if (arr[result[c]] < arrI) {
-                      u = c + 1;
-                  }
-                  else {
-                      v = c;
-                  }
-              }
-              if (arrI < arr[result[u]]) {
-                  if (u > 0) {
-                      p[i] = result[u - 1];
-                  }
-                  result[u] = i;
-              }
-          }
-      }
-      u = result.length;
-      v = result[u - 1];
-      while (u-- > 0) {
-          result[u] = v;
-          v = p[v];
-      }
-      return result;
-  }
-
-  const isTeleport = (type) => type.__isTeleport;
-  const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === '');
-  const isTargetSVG = (target) => typeof SVGElement !== 'undefined' && target instanceof SVGElement;
-  const resolveTarget = (props, select) => {
-      const targetSelector = props && props.to;
-      if (isString(targetSelector)) {
-          if (!select) {
-
-                  warn(`Current renderer does not support string target for Teleports. ` +
-                      `(missing querySelector renderer option)`);
-              return null;
-          }
-          else {
-              const target = select(targetSelector);
-              if (!target) {
-
-                      warn(`Failed to locate Teleport target with selector "${targetSelector}". ` +
-                          `Note the target element must exist before the component is mounted - ` +
-                          `i.e. the target cannot be rendered by the component itself, and ` +
-                          `ideally should be outside of the entire Vue component tree.`);
-              }
-              return target;
-          }
-      }
-      else {
-          if ( !targetSelector && !isTeleportDisabled(props)) {
-              warn(`Invalid Teleport target: ${targetSelector}`);
-          }
-          return targetSelector;
-      }
-  };
-  const TeleportImpl = {
-      __isTeleport: true,
-      process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, internals) {
-          const { mc: mountChildren, pc: patchChildren, pbc: patchBlockChildren, o: { insert, querySelector, createText, createComment } } = internals;
-          const disabled = isTeleportDisabled(n2.props);
-          const { shapeFlag, children } = n2;
-          if (n1 == null) {
-              // insert anchors in the main view
-              const placeholder = (n2.el =  createComment('teleport start')
-                  );
-              const mainAnchor = (n2.anchor =  createComment('teleport end')
-                  );
-              insert(placeholder, container, anchor);
-              insert(mainAnchor, container, anchor);
-              const target = (n2.target = resolveTarget(n2.props, querySelector));
-              const targetAnchor = (n2.targetAnchor = createText(''));
-              if (target) {
-                  insert(targetAnchor, target);
-                  // #2652 we could be teleporting from a non-SVG tree into an SVG tree
-                  isSVG = isSVG || isTargetSVG(target);
-              }
-              else if ( !disabled) {
-                  warn('Invalid Teleport target on mount:', target, `(${typeof target})`);
-              }
-              const mount = (container, anchor) => {
-                  // Teleport *always* has Array children. This is enforced in both the
-                  // compiler and vnode children normalization.
-                  if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
-                      mountChildren(children, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
-                  }
-              };
-              if (disabled) {
-                  mount(container, mainAnchor);
-              }
-              else if (target) {
-                  mount(target, targetAnchor);
-              }
-          }
-          else {
-              // update content
-              n2.el = n1.el;
-              const mainAnchor = (n2.anchor = n1.anchor);
-              const target = (n2.target = n1.target);
-              const targetAnchor = (n2.targetAnchor = n1.targetAnchor);
-              const wasDisabled = isTeleportDisabled(n1.props);
-              const currentContainer = wasDisabled ? container : target;
-              const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
-              isSVG = isSVG || isTargetSVG(target);
-              if (n2.dynamicChildren) {
-                  // fast path when the teleport happens to be a block root
-                  patchBlockChildren(n1.dynamicChildren, n2.dynamicChildren, currentContainer, parentComponent, parentSuspense, isSVG);
-                  // even in block tree mode we need to make sure all root-level nodes
-                  // in the teleport inherit previous DOM references so that they can
-                  // be moved in future patches.
-                  traverseStaticChildren(n1, n2, true);
-              }
-              else if (!optimized) {
-                  patchChildren(n1, n2, currentContainer, currentAnchor, parentComponent, parentSuspense, isSVG);
-              }
-              if (disabled) {
-                  if (!wasDisabled) {
-                      // enabled -> disabled
-                      // move into main container
-                      moveTeleport(n2, container, mainAnchor, internals, 1 /* TOGGLE */);
-                  }
-              }
-              else {
-                  // target changed
-                  if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
-                      const nextTarget = (n2.target = resolveTarget(n2.props, querySelector));
-                      if (nextTarget) {
-                          moveTeleport(n2, nextTarget, null, internals, 0 /* TARGET_CHANGE */);
-                      }
-                      else {
-                          warn('Invalid Teleport target on update:', target, `(${typeof target})`);
-                      }
-                  }
-                  else if (wasDisabled) {
-                      // disabled -> enabled
-                      // move into teleport target
-                      moveTeleport(n2, target, targetAnchor, internals, 1 /* TOGGLE */);
-                  }
-              }
-          }
-      },
-      remove(vnode, { r: remove, o: { remove: hostRemove } }) {
-          const { shapeFlag, children, anchor } = vnode;
-          hostRemove(anchor);
-          if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
-              for (let i = 0; i < children.length; i++) {
-                  remove(children[i]);
-              }
-          }
-      },
-      move: moveTeleport,
-      hydrate: hydrateTeleport
-  };
-  function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2 /* REORDER */) {
-      // move target anchor if this is a target change.
-      if (moveType === 0 /* TARGET_CHANGE */) {
-          insert(vnode.targetAnchor, container, parentAnchor);
-      }
-      const { el, anchor, shapeFlag, children, props } = vnode;
-      const isReorder = moveType === 2 /* REORDER */;
-      // move main view anchor if this is a re-order.
-      if (isReorder) {
-          insert(el, container, parentAnchor);
-      }
-      // if this is a re-order and teleport is enabled (content is in target)
-      // do not move children. So the opposite is: only move children if this
-      // is not a reorder, or the teleport is disabled
-      if (!isReorder || isTeleportDisabled(props)) {
-          // Teleport has either Array children or no children.
-          if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
-              for (let i = 0; i < children.length; i++) {
-                  move(children[i], container, parentAnchor, 2 /* REORDER */);
-              }
-          }
-      }
-      // move main view anchor if this is a re-order.
-      if (isReorder) {
-          insert(anchor, container, parentAnchor);
-      }
-  }
-  function hydrateTeleport(node, vnode, parentComponent, parentSuspense, optimized, { o: { nextSibling, parentNode, querySelector } }, hydrateChildren) {
-      const target = (vnode.target = resolveTarget(vnode.props, querySelector));
-      if (target) {
-          // if multiple teleports rendered to the same target element, we need to
-          // pick up from where the last teleport finished instead of the first node
-          const targetNode = target._lpa || target.firstChild;
-          if (vnode.shapeFlag & 16 /* ARRAY_CHILDREN */) {
-              if (isTeleportDisabled(vnode.props)) {
-                  vnode.anchor = hydrateChildren(nextSibling(node), vnode, parentNode(node), parentComponent, parentSuspense, optimized);
-                  vnode.targetAnchor = targetNode;
-              }
-              else {
-                  vnode.anchor = nextSibling(node);
-                  vnode.targetAnchor = hydrateChildren(targetNode, vnode, target, parentComponent, parentSuspense, optimized);
-              }
-              target._lpa =
-                  vnode.targetAnchor && nextSibling(vnode.targetAnchor);
-          }
-      }
-      return vnode.anchor && nextSibling(vnode.anchor);
-  }
-  // Force-casted public typing for h and TSX props inference
-  const Teleport = TeleportImpl;
-
-  const COMPONENTS = 'components';
-  const DIRECTIVES = 'directives';
-  /**
-   * @private
-   */
-  function resolveComponent(name) {
-      return resolveAsset(COMPONENTS, name) || name;
-  }
-  const NULL_DYNAMIC_COMPONENT = Symbol();
-  /**
-   * @private
-   */
-  function resolveDynamicComponent(component) {
-      if (isString(component)) {
-          return resolveAsset(COMPONENTS, component, false) || component;
-      }
-      else {
-          // invalid types will fallthrough to createVNode and raise warning
-          return (component || NULL_DYNAMIC_COMPONENT);
-      }
-  }
-  /**
-   * @private
-   */
-  function resolveDirective(name) {
-      return resolveAsset(DIRECTIVES, name);
-  }
-  // implementation
-  function resolveAsset(type, name, warnMissing = true) {
-      const instance = currentRenderingInstance || currentInstance;
-      if (instance) {
-          const Component = instance.type;
-          // self name has highest priority
-          if (type === COMPONENTS) {
-              // special self referencing call generated by compiler
-              // inferred from SFC filename
-              if (name === `_self`) {
-                  return Component;
-              }
-              const selfName = getComponentName(Component);
-              if (selfName &&
-                  (selfName === name ||
-                      selfName === camelize(name) ||
-                      selfName === capitalize(camelize(name)))) {
-                  return Component;
-              }
-          }
-          const res =
-          // local registration
-          // check instance[type] first for components with mixin or extends.
-          resolve(instance[type] || Component[type], name) ||
-              // global registration
-              resolve(instance.appContext[type], name);
-          if ( warnMissing && !res) {
-              warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`);
-          }
-          return res;
-      }
-      else {
-          warn(`resolve${capitalize(type.slice(0, -1))} ` +
-              `can only be used in render() or setup().`);
-      }
-  }
-  function resolve(registry, name) {
-      return (registry &&
-          (registry[name] ||
-              registry[camelize(name)] ||
-              registry[capitalize(camelize(name))]));
-  }
-
-  const Fragment = Symbol( 'Fragment' );
-  const Text = Symbol( 'Text' );
-  const Comment = Symbol( 'Comment' );
-  const Static = Symbol( 'Static' );
-  // Since v-if and v-for are the two possible ways node structure can dynamically
-  // change, once we consider v-if branches and each v-for fragment a block, we
-  // can divide a template into nested blocks, and within each block the node
-  // structure would be stable. This allows us to skip most children diffing
-  // and only worry about the dynamic nodes (indicated by patch flags).
-  const blockStack = [];
-  let currentBlock = null;
-  /**
-   * Open a block.
-   * This must be called before `createBlock`. It cannot be part of `createBlock`
-   * because the children of the block are evaluated before `createBlock` itself
-   * is called. The generated code typically looks like this:
-   *
-   * ```js
-   * function render() {
-   *   return (openBlock(),createBlock('div', null, [...]))
-   * }
-   * ```
-   * disableTracking is true when creating a v-for fragment block, since a v-for
-   * fragment always diffs its children.
-   *
-   * @private
-   */
-  function openBlock(disableTracking = false) {
-      blockStack.push((currentBlock = disableTracking ? null : []));
-  }
-  function closeBlock() {
-      blockStack.pop();
-      currentBlock = blockStack[blockStack.length - 1] || null;
-  }
-  // Whether we should be tracking dynamic child nodes inside a block.
-  // Only tracks when this value is > 0
-  // We are not using a simple boolean because this value may need to be
-  // incremented/decremented by nested usage of v-once (see below)
-  let shouldTrack$1 = 1;
-  /**
-   * Block tracking sometimes needs to be disabled, for example during the
-   * creation of a tree that needs to be cached by v-once. The compiler generates
-   * code like this:
-   *
-   * ``` js
-   * _cache[1] || (
-   *   setBlockTracking(-1),
-   *   _cache[1] = createVNode(...),
-   *   setBlockTracking(1),
-   *   _cache[1]
-   * )
-   * ```
-   *
-   * @private
-   */
-  function setBlockTracking(value) {
-      shouldTrack$1 += value;
-  }
-  /**
-   * Create a block root vnode. Takes the same exact arguments as `createVNode`.
-   * A block root keeps track of dynamic nodes within the block in the
-   * `dynamicChildren` array.
-   *
-   * @private
-   */
-  function createBlock(type, props, children, patchFlag, dynamicProps) {
-      const vnode = createVNode(type, props, children, patchFlag, dynamicProps, true /* isBlock: prevent a block from tracking itself */);
-      // save current block children on the block vnode
-      vnode.dynamicChildren = currentBlock || EMPTY_ARR;
-      // close block
-      closeBlock();
-      // a block is always going to be patched, so track it as a child of its
-      // parent block
-      if (shouldTrack$1 > 0 && currentBlock) {
-          currentBlock.push(vnode);
-      }
-      return vnode;
-  }
-  function isVNode(value) {
-      return value ? value.__v_isVNode === true : false;
-  }
-  function isSameVNodeType(n1, n2) {
-      if (
-          n2.shapeFlag & 6 /* COMPONENT */ &&
-          hmrDirtyComponents.has(n2.type)) {
-          // HMR only: if the component has been hot-updated, force a reload.
-          return false;
-      }
-      return n1.type === n2.type && n1.key === n2.key;
-  }
-  let vnodeArgsTransformer;
-  /**
-   * Internal API for registering an arguments transform for createVNode
-   * used for creating stubs in the test-utils
-   * It is *internal* but needs to be exposed for test-utils to pick up proper
-   * typings
-   */
-  function transformVNodeArgs(transformer) {
-      vnodeArgsTransformer = transformer;
-  }
-  const createVNodeWithArgsTransform = (...args) => {
-      return _createVNode(...(vnodeArgsTransformer
-          ? vnodeArgsTransformer(args, currentRenderingInstance)
-          : args));
-  };
-  const InternalObjectKey = `__vInternal`;
-  const normalizeKey = ({ key }) => key != null ? key : null;
-  const normalizeRef = ({ ref }) => {
-      return (ref != null
-          ? isString(ref) || isRef(ref) || isFunction(ref)
-              ? { i: currentRenderingInstance, r: ref }
-              : ref
-          : null);
-  };
-  const createVNode = ( createVNodeWithArgsTransform
-      );
-  function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
-      if (!type || type === NULL_DYNAMIC_COMPONENT) {
-          if ( !type) {
-              warn(`Invalid vnode type when creating vnode: ${type}.`);
-          }
-          type = Comment;
-      }
-      if (isVNode(type)) {
-          // createVNode receiving an existing vnode. This happens in cases like
-          // <component :is="vnode"/>
-          // #2078 make sure to merge refs during the clone instead of overwriting it
-          const cloned = cloneVNode(type, props, true /* mergeRef: true */);
-          if (children) {
-              normalizeChildren(cloned, children);
-          }
-          return cloned;
-      }
-      // class component normalization.
-      if (isClassComponent(type)) {
-          type = type.__vccOpts;
-      }
-      // class & style normalization.
-      if (props) {
-          // for reactive or proxy objects, we need to clone it to enable mutation.
-          if (isProxy(props) || InternalObjectKey in props) {
-              props = extend({}, props);
-          }
-          let { class: klass, style } = props;
-          if (klass && !isString(klass)) {
-              props.class = normalizeClass(klass);
-          }
-          if (isObject(style)) {
-              // reactive state objects need to be cloned since they are likely to be
-              // mutated
-              if (isProxy(style) && !isArray(style)) {
-                  style = extend({}, style);
-              }
-              props.style = normalizeStyle(style);
-          }
-      }
-      // encode the vnode type information into a bitmap
-      const shapeFlag = isString(type)
-          ? 1 /* ELEMENT */
-          :  isSuspense(type)
-              ? 128 /* SUSPENSE */
-              : isTeleport(type)
-                  ? 64 /* TELEPORT */
-                  : isObject(type)
-                      ? 4 /* STATEFUL_COMPONENT */
-                      : isFunction(type)
-                          ? 2 /* FUNCTIONAL_COMPONENT */
-                          : 0;
-      if ( shapeFlag & 4 /* STATEFUL_COMPONENT */ && isProxy(type)) {
-          type = toRaw(type);
-          warn(`Vue received a Component which was made a reactive object. This can ` +
-              `lead to unnecessary performance overhead, and should be avoided by ` +
-              `marking the component with \`markRaw\` or using \`shallowRef\` ` +
-              `instead of \`ref\`.`, `\nComponent that was made reactive: `, type);
-      }
-      const vnode = {
-          __v_isVNode: true,
-          ["__v_skip" /* SKIP */]: true,
-          type,
-          props,
-          key: props && normalizeKey(props),
-          ref: props && normalizeRef(props),
-          scopeId: currentScopeId,
-          children: null,
-          component: null,
-          suspense: null,
-          ssContent: null,
-          ssFallback: null,
-          dirs: null,
-          transition: null,
-          el: null,
-          anchor: null,
-          target: null,
-          targetAnchor: null,
-          staticCount: 0,
-          shapeFlag,
-          patchFlag,
-          dynamicProps,
-          dynamicChildren: null,
-          appContext: null
-      };
-      // validate key
-      if ( vnode.key !== vnode.key) {
-          warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
-      }
-      normalizeChildren(vnode, children);
-      // normalize suspense children
-      if ( shapeFlag & 128 /* SUSPENSE */) {
-          const { content, fallback } = normalizeSuspenseChildren(vnode);
-          vnode.ssContent = content;
-          vnode.ssFallback = fallback;
-      }
-      if (shouldTrack$1 > 0 &&
-          // avoid a block node from tracking itself
-          !isBlockNode &&
-          // has current parent block
-          currentBlock &&
-          // presence of a patch flag indicates this node needs patching on updates.
-          // component nodes also should always be patched, because even if the
-          // component doesn't need to update, it needs to persist the instance on to
-          // the next vnode so that it can be properly unmounted later.
-          (patchFlag > 0 || shapeFlag & 6 /* COMPONENT */) &&
-          // the EVENTS flag is only for hydration and if it is the only flag, the
-          // vnode should not be considered dynamic due to handler caching.
-          patchFlag !== 32 /* HYDRATE_EVENTS */) {
-          currentBlock.push(vnode);
-      }
-      return vnode;
-  }
-  function cloneVNode(vnode, extraProps, mergeRef = false) {
-      // This is intentionally NOT using spread or extend to avoid the runtime
-      // key enumeration cost.
-      const { props, ref, patchFlag } = vnode;
-      const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
-      return {
-          __v_isVNode: true,
-          ["__v_skip" /* SKIP */]: true,
-          type: vnode.type,
-          props: mergedProps,
-          key: mergedProps && normalizeKey(mergedProps),
-          ref: extraProps && extraProps.ref
-              ? // #2078 in the case of <component :is="vnode" ref="extra"/>
-                  // if the vnode itself already has a ref, cloneVNode will need to merge
-                  // the refs so the single vnode can be set on multiple refs
-                  mergeRef && ref
-                      ? isArray(ref)
-                          ? ref.concat(normalizeRef(extraProps))
-                          : [ref, normalizeRef(extraProps)]
-                      : normalizeRef(extraProps)
-              : ref,
-          scopeId: vnode.scopeId,
-          children: vnode.children,
-          target: vnode.target,
-          targetAnchor: vnode.targetAnchor,
-          staticCount: vnode.staticCount,
-          shapeFlag: vnode.shapeFlag,
-          // if the vnode is cloned with extra props, we can no longer assume its
-          // existing patch flag to be reliable and need to add the FULL_PROPS flag.
-          // note: perserve flag for fragments since they use the flag for children
-          // fast paths only.
-          patchFlag: extraProps && vnode.type !== Fragment
-              ? patchFlag === -1 // hoisted node
-                  ? 16 /* FULL_PROPS */
-                  : patchFlag | 16 /* FULL_PROPS */
-              : patchFlag,
-          dynamicProps: vnode.dynamicProps,
-          dynamicChildren: vnode.dynamicChildren,
-          appContext: vnode.appContext,
-          dirs: vnode.dirs,
-          transition: vnode.transition,
-          // These should technically only be non-null on mounted VNodes. However,
-          // they *should* be copied for kept-alive vnodes. So we just always copy
-          // them since them being non-null during a mount doesn't affect the logic as
-          // they will simply be overwritten.
-          component: vnode.component,
-          suspense: vnode.suspense,
-          ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
-          ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
-          el: vnode.el,
-          anchor: vnode.anchor
-      };
-  }
-  /**
-   * @private
-   */
-  function createTextVNode(text = ' ', flag = 0) {
-      return createVNode(Text, null, text, flag);
-  }
-  /**
-   * @private
-   */
-  function createStaticVNode(content, numberOfNodes) {
-      // A static vnode can contain multiple stringified elements, and the number
-      // of elements is necessary for hydration.
-      const vnode = createVNode(Static, null, content);
-      vnode.staticCount = numberOfNodes;
-      return vnode;
-  }
-  /**
-   * @private
-   */
-  function createCommentVNode(text = '',
-  // when used as the v-else branch, the comment node must be created as a
-  // block to ensure correct updates.
-  asBlock = false) {
-      return asBlock
-          ? (openBlock(), createBlock(Comment, null, text))
-          : createVNode(Comment, null, text);
-  }
-  function normalizeVNode(child) {
-      if (child == null || typeof child === 'boolean') {
-          // empty placeholder
-          return createVNode(Comment);
-      }
-      else if (isArray(child)) {
-          // fragment
-          return createVNode(Fragment, null, child);
-      }
-      else if (typeof child === 'object') {
-          // already vnode, this should be the most common since compiled templates
-          // always produce all-vnode children arrays
-          return child.el === null ? child : cloneVNode(child);
-      }
-      else {
-          // strings and numbers
-          return createVNode(Text, null, String(child));
-      }
-  }
-  // optimized normalization for template-compiled render fns
-  function cloneIfMounted(child) {
-      return child.el === null ? child : cloneVNode(child);
-  }
-  function normalizeChildren(vnode, children) {
-      let type = 0;
-      const { shapeFlag } = vnode;
-      if (children == null) {
-          children = null;
-      }
-      else if (isArray(children)) {
-          type = 16 /* ARRAY_CHILDREN */;
-      }
-      else if (typeof children === 'object') {
-          if (shapeFlag & 1 /* ELEMENT */ || shapeFlag & 64 /* TELEPORT */) {
-              // Normalize slot to plain children for plain element and Teleport
-              const slot = children.default;
-              if (slot) {
-                  // _c marker is added by withCtx() indicating this is a compiled slot
-                  slot._c && setCompiledSlotRendering(1);
-                  normalizeChildren(vnode, slot());
-                  slot._c && setCompiledSlotRendering(-1);
-              }
-              return;
-          }
-          else {
-              type = 32 /* SLOTS_CHILDREN */;
-              const slotFlag = children._;
-              if (!slotFlag && !(InternalObjectKey in children)) {
-                  children._ctx = currentRenderingInstance;
-              }
-              else if (slotFlag === 3 /* FORWARDED */ && currentRenderingInstance) {
-                  // a child component receives forwarded slots from the parent.
-                  // its slot type is determined by its parent's slot type.
-                  if (currentRenderingInstance.vnode.patchFlag & 1024 /* DYNAMIC_SLOTS */) {
-                      children._ = 2 /* DYNAMIC */;
-                      vnode.patchFlag |= 1024 /* DYNAMIC_SLOTS */;
-                  }
-                  else {
-                      children._ = 1 /* STABLE */;
-                  }
-              }
-          }
-      }
-      else if (isFunction(children)) {
-          children = { default: children, _ctx: currentRenderingInstance };
-          type = 32 /* SLOTS_CHILDREN */;
-      }
-      else {
-          children = String(children);
-          // force teleport children to array so it can be moved around
-          if (shapeFlag & 64 /* TELEPORT */) {
-              type = 16 /* ARRAY_CHILDREN */;
-              children = [createTextVNode(children)];
-          }
-          else {
-              type = 8 /* TEXT_CHILDREN */;
-          }
-      }
-      vnode.children = children;
-      vnode.shapeFlag |= type;
-  }
-  function mergeProps(...args) {
-      const ret = extend({}, args[0]);
-      for (let i = 1; i < args.length; i++) {
-          const toMerge = args[i];
-          for (const key in toMerge) {
-              if (key === 'class') {
-                  if (ret.class !== toMerge.class) {
-                      ret.class = normalizeClass([ret.class, toMerge.class]);
-                  }
-              }
-              else if (key === 'style') {
-                  ret.style = normalizeStyle([ret.style, toMerge.style]);
-              }
-              else if (isOn(key)) {
-                  const existing = ret[key];
-                  const incoming = toMerge[key];
-                  if (existing !== incoming) {
-                      ret[key] = existing
-                          ? [].concat(existing, toMerge[key])
-                          : incoming;
-                  }
-              }
-              else if (key !== '') {
-                  ret[key] = toMerge[key];
-              }
-          }
-      }
-      return ret;
-  }
-
-  function provide(key, value) {
-      if (!currentInstance) {
-          {
-              warn(`provide() can only be used inside setup().`);
-          }
-      }
-      else {
-          let provides = currentInstance.provides;
-          // by default an instance inherits its parent's provides object
-          // but when it needs to provide values of its own, it creates its
-          // own provides object using parent provides object as prototype.
-          // this way in `inject` we can simply look up injections from direct
-          // parent and let the prototype chain do the work.
-          const parentProvides = currentInstance.parent && currentInstance.parent.provides;
-          if (parentProvides === provides) {
-              provides = currentInstance.provides = Object.create(parentProvides);
-          }
-          // TS doesn't allow symbol as index type
-          provides[key] = value;
-      }
-  }
-  function inject(key, defaultValue, treatDefaultAsFactory = false) {
-      // fallback to `currentRenderingInstance` so that this can be called in
-      // a functional component
-      const instance = currentInstance || currentRenderingInstance;
-      if (instance) {
-          // #2400
-          // to support `app.use` plugins,
-          // fallback to appContext's `provides` if the intance is at root
-          const provides = instance.parent == null
-              ? instance.vnode.appContext && instance.vnode.appContext.provides
-              : instance.parent.provides;
-          if (provides && key in provides) {
-              // TS doesn't allow symbol as index type
-              return provides[key];
-          }
-          else if (arguments.length > 1) {
-              return treatDefaultAsFactory && isFunction(defaultValue)
-                  ? defaultValue()
-                  : defaultValue;
-          }
-          else {
-              warn(`injection "${String(key)}" not found.`);
-          }
-      }
-      else {
-          warn(`inject() can only be used inside setup() or functional components.`);
-      }
-  }
-
-  function createDuplicateChecker() {
-      const cache = Object.create(null);
-      return (type, key) => {
-          if (cache[key]) {
-              warn(`${type} property "${key}" is already defined in ${cache[key]}.`);
-          }
-          else {
-              cache[key] = type;
-          }
-      };
-  }
-  let isInBeforeCreate = false;
-  function applyOptions(instance, options, deferredData = [], deferredWatch = [], deferredProvide = [], asMixin = false) {
-      const {
-      // composition
-      mixins, extends: extendsOptions,
-      // state
-      data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions,
-      // assets
-      components, directives,
-      // lifecycle
-      beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured,
-      // public API
-      expose } = options;
-      const publicThis = instance.proxy;
-      const ctx = instance.ctx;
-      const globalMixins = instance.appContext.mixins;
-      if (asMixin && render && instance.render === NOOP) {
-          instance.render = render;
-      }
-      // applyOptions is called non-as-mixin once per instance
-      if (!asMixin) {
-          isInBeforeCreate = true;
-          callSyncHook('beforeCreate', "bc" /* BEFORE_CREATE */, options, instance, globalMixins);
-          isInBeforeCreate = false;
-          // global mixins are applied first
-          applyMixins(instance, globalMixins, deferredData, deferredWatch, deferredProvide);
-      }
-      // extending a base component...
-      if (extendsOptions) {
-          applyOptions(instance, extendsOptions, deferredData, deferredWatch, deferredProvide, true);
-      }
-      // local mixins
-      if (mixins) {
-          applyMixins(instance, mixins, deferredData, deferredWatch, deferredProvide);
-      }
-      const checkDuplicateProperties =  createDuplicateChecker() ;
-      {
-          const [propsOptions] = instance.propsOptions;
-          if (propsOptions) {
-              for (const key in propsOptions) {
-                  checkDuplicateProperties("Props" /* PROPS */, key);
-              }
-          }
-      }
-      // options initialization order (to be consistent with Vue 2):
-      // - props (already done outside of this function)
-      // - inject
-      // - methods
-      // - data (deferred since it relies on `this` access)
-      // - computed
-      // - watch (deferred since it relies on `this` access)
-      if (injectOptions) {
-          if (isArray(injectOptions)) {
-              for (let i = 0; i < injectOptions.length; i++) {
-                  const key = injectOptions[i];
-                  ctx[key] = inject(key);
-                  {
-                      checkDuplicateProperties("Inject" /* INJECT */, key);
-                  }
-              }
-          }
-          else {
-              for (const key in injectOptions) {
-                  const opt = injectOptions[key];
-                  if (isObject(opt)) {
-                      ctx[key] = inject(opt.from || key, opt.default, true /* treat default function as factory */);
-                  }
-                  else {
-                      ctx[key] = inject(opt);
-                  }
-                  {
-                      checkDuplicateProperties("Inject" /* INJECT */, key);
-                  }
-              }
-          }
-      }
-      if (methods) {
-          for (const key in methods) {
-              const methodHandler = methods[key];
-              if (isFunction(methodHandler)) {
-                  ctx[key] = methodHandler.bind(publicThis);
-                  {
-                      checkDuplicateProperties("Methods" /* METHODS */, key);
-                  }
-              }
-              else {
-                  warn(`Method "${key}" has type "${typeof methodHandler}" in the component definition. ` +
-                      `Did you reference the function correctly?`);
-              }
-          }
-      }
-      if (!asMixin) {
-          if (deferredData.length) {
-              deferredData.forEach(dataFn => resolveData(instance, dataFn, publicThis));
-          }
-          if (dataOptions) {
-              // @ts-ignore dataOptions is not fully type safe
-              resolveData(instance, dataOptions, publicThis);
-          }
-          {
-              const rawData = toRaw(instance.data);
-              for (const key in rawData) {
-                  checkDuplicateProperties("Data" /* DATA */, key);
-                  // expose data on ctx during dev
-                  if (key[0] !== '$' && key[0] !== '_') {
-                      Object.defineProperty(ctx, key, {
-                          configurable: true,
-                          enumerable: true,
-                          get: () => rawData[key],
-                          set: NOOP
-                      });
-                  }
-              }
-          }
-      }
-      else if (dataOptions) {
-          deferredData.push(dataOptions);
-      }
-      if (computedOptions) {
-          for (const key in computedOptions) {
-              const opt = computedOptions[key];
-              const get = isFunction(opt)
-                  ? opt.bind(publicThis, publicThis)
-                  : isFunction(opt.get)
-                      ? opt.get.bind(publicThis, publicThis)
-                      : NOOP;
-              if ( get === NOOP) {
-                  warn(`Computed property "${key}" has no getter.`);
-              }
-              const set = !isFunction(opt) && isFunction(opt.set)
-                  ? opt.set.bind(publicThis)
-                  :  () => {
-                          warn(`Write operation failed: computed property "${key}" is readonly.`);
-                      }
-                      ;
-              const c = computed$1({
-                  get,
-                  set
-              });
-              Object.defineProperty(ctx, key, {
-                  enumerable: true,
-                  configurable: true,
-                  get: () => c.value,
-                  set: v => (c.value = v)
-              });
-              {
-                  checkDuplicateProperties("Computed" /* COMPUTED */, key);
-              }
-          }
-      }
-      if (watchOptions) {
-          deferredWatch.push(watchOptions);
-      }
-      if (!asMixin && deferredWatch.length) {
-          deferredWatch.forEach(watchOptions => {
-              for (const key in watchOptions) {
-                  createWatcher(watchOptions[key], ctx, publicThis, key);
-              }
-          });
-      }
-      if (provideOptions) {
-          deferredProvide.push(provideOptions);
-      }
-      if (!asMixin && deferredProvide.length) {
-          deferredProvide.forEach(provideOptions => {
-              const provides = isFunction(provideOptions)
-                  ? provideOptions.call(publicThis)
-                  : provideOptions;
-              Reflect.ownKeys(provides).forEach(key => {
-                  provide(key, provides[key]);
-              });
-          });
-      }
-      // asset options.
-      // To reduce memory usage, only components with mixins or extends will have
-      // resolved asset registry attached to instance.
-      if (asMixin) {
-          if (components) {
-              extend(instance.components ||
-                  (instance.components = extend({}, instance.type.components)), components);
-          }
-          if (directives) {
-              extend(instance.directives ||
-                  (instance.directives = extend({}, instance.type.directives)), directives);
-          }
-      }
-      // lifecycle options
-      if (!asMixin) {
-          callSyncHook('created', "c" /* CREATED */, options, instance, globalMixins);
-      }
-      if (beforeMount) {
-          onBeforeMount(beforeMount.bind(publicThis));
-      }
-      if (mounted) {
-          onMounted(mounted.bind(publicThis));
-      }
-      if (beforeUpdate) {
-          onBeforeUpdate(beforeUpdate.bind(publicThis));
-      }
-      if (updated) {
-          onUpdated(updated.bind(publicThis));
-      }
-      if (activated) {
-          onActivated(activated.bind(publicThis));
-      }
-      if (deactivated) {
-          onDeactivated(deactivated.bind(publicThis));
-      }
-      if (errorCaptured) {
-          onErrorCaptured(errorCaptured.bind(publicThis));
-      }
-      if (renderTracked) {
-          onRenderTracked(renderTracked.bind(publicThis));
-      }
-      if (renderTriggered) {
-          onRenderTriggered(renderTriggered.bind(publicThis));
-      }
-      if ( beforeDestroy) {
-          warn(`\`beforeDestroy\` has been renamed to \`beforeUnmount\`.`);
-      }
-      if (beforeUnmount) {
-          onBeforeUnmount(beforeUnmount.bind(publicThis));
-      }
-      if ( destroyed) {
-          warn(`\`destroyed\` has been renamed to \`unmounted\`.`);
-      }
-      if (unmounted) {
-          onUnmounted(unmounted.bind(publicThis));
-      }
-      if (isArray(expose)) {
-          if (!asMixin) {
-              if (expose.length) {
-                  const exposed = instance.exposed || (instance.exposed = proxyRefs({}));
-                  expose.forEach(key => {
-                      exposed[key] = toRef(publicThis, key);
-                  });
-              }
-              else if (!instance.exposed) {
-                  instance.exposed = EMPTY_OBJ;
-              }
-          }
-          else {
-              warn(`The \`expose\` option is ignored when used in mixins.`);
-          }
-      }
-  }
-  function callSyncHook(name, type, options, instance, globalMixins) {
-      callHookFromMixins(name, type, globalMixins, instance);
-      const { extends: base, mixins } = options;
-      if (base) {
-          callHookFromExtends(name, type, base, instance);
-      }
-      if (mixins) {
-          callHookFromMixins(name, type, mixins, instance);
-      }
-      const selfHook = options[name];
-      if (selfHook) {
-          callWithAsyncErrorHandling(selfHook.bind(instance.proxy), instance, type);
-      }
-  }
-  function callHookFromExtends(name, type, base, instance) {
-      if (base.extends) {
-          callHookFromExtends(name, type, base.extends, instance);
-      }
-      const baseHook = base[name];
-      if (baseHook) {
-          callWithAsyncErrorHandling(baseHook.bind(instance.proxy), instance, type);
-      }
-  }
-  function callHookFromMixins(name, type, mixins, instance) {
-      for (let i = 0; i < mixins.length; i++) {
-          const chainedMixins = mixins[i].mixins;
-          if (chainedMixins) {
-              callHookFromMixins(name, type, chainedMixins, instance);
-          }
-          const fn = mixins[i][name];
-          if (fn) {
-              callWithAsyncErrorHandling(fn.bind(instance.proxy), instance, type);
-          }
-      }
-  }
-  function applyMixins(instance, mixins, deferredData, deferredWatch, deferredProvide) {
-      for (let i = 0; i < mixins.length; i++) {
-          applyOptions(instance, mixins[i], deferredData, deferredWatch, deferredProvide, true);
-      }
-  }
-  function resolveData(instance, dataFn, publicThis) {
-      if ( !isFunction(dataFn)) {
-          warn(`The data option must be a function. ` +
-              `Plain object usage is no longer supported.`);
-      }
-      const data = dataFn.call(publicThis, publicThis);
-      if ( isPromise(data)) {
-          warn(`data() returned a Promise - note data() cannot be async; If you ` +
-              `intend to perform data fetching before component renders, use ` +
-              `async setup() + <Suspense>.`);
-      }
-      if (!isObject(data)) {
-           warn(`data() should return an object.`);
-      }
-      else if (instance.data === EMPTY_OBJ) {
-          instance.data = reactive(data);
-      }
-      else {
-          // existing data: this is a mixin or extends.
-          extend(instance.data, data);
-      }
-  }
-  function createWatcher(raw, ctx, publicThis, key) {
-      const getter = key.includes('.')
-          ? createPathGetter(publicThis, key)
-          : () => publicThis[key];
-      if (isString(raw)) {
-          const handler = ctx[raw];
-          if (isFunction(handler)) {
-              watch(getter, handler);
-          }
-          else {
-              warn(`Invalid watch handler specified by key "${raw}"`, handler);
-          }
-      }
-      else if (isFunction(raw)) {
-          watch(getter, raw.bind(publicThis));
-      }
-      else if (isObject(raw)) {
-          if (isArray(raw)) {
-              raw.forEach(r => createWatcher(r, ctx, publicThis, key));
-          }
-          else {
-              const handler = isFunction(raw.handler)
-                  ? raw.handler.bind(publicThis)
-                  : ctx[raw.handler];
-              if (isFunction(handler)) {
-                  watch(getter, handler, raw);
-              }
-              else {
-                  warn(`Invalid watch handler specified by key "${raw.handler}"`, handler);
-              }
-          }
-      }
-      else {
-          warn(`Invalid watch option: "${key}"`, raw);
-      }
-  }
-  function createPathGetter(ctx, path) {
-      const segments = path.split('.');
-      return () => {
-          let cur = ctx;
-          for (let i = 0; i < segments.length && cur; i++) {
-              cur = cur[segments[i]];
-          }
-          return cur;
-      };
-  }
-  function resolveMergedOptions(instance) {
-      const raw = instance.type;
-      const { __merged, mixins, extends: extendsOptions } = raw;
-      if (__merged)
-          return __merged;
-      const globalMixins = instance.appContext.mixins;
-      if (!globalMixins.length && !mixins && !extendsOptions)
-          return raw;
-      const options = {};
-      globalMixins.forEach(m => mergeOptions(options, m, instance));
-      mergeOptions(options, raw, instance);
-      return (raw.__merged = options);
-  }
-  function mergeOptions(to, from, instance) {
-      const strats = instance.appContext.config.optionMergeStrategies;
-      const { mixins, extends: extendsOptions } = from;
-      extendsOptions && mergeOptions(to, extendsOptions, instance);
-      mixins &&
-          mixins.forEach((m) => mergeOptions(to, m, instance));
-      for (const key in from) {
-          if (strats && hasOwn(strats, key)) {
-              to[key] = strats[key](to[key], from[key], instance.proxy, key);
-          }
-          else {
-              to[key] = from[key];
-          }
-      }
-  }
-
-  /**
-   * #2437 In Vue 3, functional components do not have a public instance proxy but
-   * they exist in the internal parent chain. For code that relies on traversing
-   * public $parent chains, skip functional ones and go to the parent instead.
-   */
-  const getPublicInstance = (i) => i && (i.proxy ? i.proxy : getPublicInstance(i.parent));
-  const publicPropertiesMap = extend(Object.create(null), {
-      $: i => i,
-      $el: i => i.vnode.el,
-      $data: i => i.data,
-      $props: i => ( shallowReadonly(i.props) ),
-      $attrs: i => ( shallowReadonly(i.attrs) ),
-      $slots: i => ( shallowReadonly(i.slots) ),
-      $refs: i => ( shallowReadonly(i.refs) ),
-      $parent: i => getPublicInstance(i.parent),
-      $root: i => i.root && i.root.proxy,
-      $emit: i => i.emit,
-      $options: i => ( resolveMergedOptions(i) ),
-      $forceUpdate: i => () => queueJob(i.update),
-      $nextTick: i => nextTick.bind(i.proxy),
-      $watch: i => ( instanceWatch.bind(i) )
-  });
-  const PublicInstanceProxyHandlers = {
-      get({ _: instance }, key) {
-          const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
-          // let @vue/reactivity know it should never observe Vue public instances.
-          if (key === "__v_skip" /* SKIP */) {
-              return true;
-          }
-          // for internal formatters to know that this is a Vue instance
-          if ( key === '__isVue') {
-              return true;
-          }
-          // data / props / ctx
-          // This getter gets called for every property access on the render context
-          // during render and is a major hotspot. The most expensive part of this
-          // is the multiple hasOwn() calls. It's much faster to do a simple property
-          // access on a plain object, so we use an accessCache object (with null
-          // prototype) to memoize what access type a key corresponds to.
-          let normalizedProps;
-          if (key[0] !== '$') {
-              const n = accessCache[key];
-              if (n !== undefined) {
-                  switch (n) {
-                      case 0 /* SETUP */:
-                          return setupState[key];
-                      case 1 /* DATA */:
-                          return data[key];
-                      case 3 /* CONTEXT */:
-                          return ctx[key];
-                      case 2 /* PROPS */:
-                          return props[key];
-                      // default: just fallthrough
-                  }
-              }
-              else if (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) {
-                  accessCache[key] = 0 /* SETUP */;
-                  return setupState[key];
-              }
-              else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
-                  accessCache[key] = 1 /* DATA */;
-                  return data[key];
-              }
-              else if (
-              // only cache other properties when instance has declared (thus stable)
-              // props
-              (normalizedProps = instance.propsOptions[0]) &&
-                  hasOwn(normalizedProps, key)) {
-                  accessCache[key] = 2 /* PROPS */;
-                  return props[key];
-              }
-              else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
-                  accessCache[key] = 3 /* CONTEXT */;
-                  return ctx[key];
-              }
-              else if ( !isInBeforeCreate) {
-                  accessCache[key] = 4 /* OTHER */;
-              }
-          }
-          const publicGetter = publicPropertiesMap[key];
-          let cssModule, globalProperties;
-          // public $xxx properties
-          if (publicGetter) {
-              if (key === '$attrs') {
-                  track(instance, "get" /* GET */, key);
-                   markAttrsAccessed();
-              }
-              return publicGetter(instance);
-          }
-          else if (
-          // css module (injected by vue-loader)
-          (cssModule = type.__cssModules) &&
-              (cssModule = cssModule[key])) {
-              return cssModule;
-          }
-          else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
-              // user may set custom properties to `this` that start with `$`
-              accessCache[key] = 3 /* CONTEXT */;
-              return ctx[key];
-          }
-          else if (
-          // global properties
-          ((globalProperties = appContext.config.globalProperties),
-              hasOwn(globalProperties, key))) {
-              return globalProperties[key];
-          }
-          else if (
-              currentRenderingInstance &&
-              (!isString(key) ||
-                  // #1091 avoid internal isRef/isVNode checks on component instance leading
-                  // to infinite warning loop
-                  key.indexOf('__v') !== 0)) {
-              if (data !== EMPTY_OBJ &&
-                  (key[0] === '$' || key[0] === '_') &&
-                  hasOwn(data, key)) {
-                  warn(`Property ${JSON.stringify(key)} must be accessed via $data because it starts with a reserved ` +
-                      `character ("$" or "_") and is not proxied on the render context.`);
-              }
-              else {
-                  warn(`Property ${JSON.stringify(key)} was accessed during render ` +
-                      `but is not defined on instance.`);
-              }
-          }
-      },
-      set({ _: instance }, key, value) {
-          const { data, setupState, ctx } = instance;
-          if (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) {
-              setupState[key] = value;
-          }
-          else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
-              data[key] = value;
-          }
-          else if (key in instance.props) {
-
-                  warn(`Attempting to mutate prop "${key}". Props are readonly.`, instance);
-              return false;
-          }
-          if (key[0] === '$' && key.slice(1) in instance) {
-
-                  warn(`Attempting to mutate public property "${key}". ` +
-                      `Properties starting with $ are reserved and readonly.`, instance);
-              return false;
-          }
-          else {
-              if ( key in instance.appContext.config.globalProperties) {
-                  Object.defineProperty(ctx, key, {
-                      enumerable: true,
-                      configurable: true,
-                      value
-                  });
-              }
-              else {
-                  ctx[key] = value;
-              }
-          }
-          return true;
-      },
-      has({ _: { data, setupState, accessCache, ctx, appContext, propsOptions } }, key) {
-          let normalizedProps;
-          return (accessCache[key] !== undefined ||
-              (data !== EMPTY_OBJ && hasOwn(data, key)) ||
-              (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) ||
-              ((normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key)) ||
-              hasOwn(ctx, key) ||
-              hasOwn(publicPropertiesMap, key) ||
-              hasOwn(appContext.config.globalProperties, key));
-      }
-  };
-  {
-      PublicInstanceProxyHandlers.ownKeys = (target) => {
-          warn(`Avoid app logic that relies on enumerating keys on a component instance. ` +
-              `The keys will be empty in production mode to avoid performance overhead.`);
-          return Reflect.ownKeys(target);
-      };
-  }
-  const RuntimeCompiledPublicInstanceProxyHandlers = extend({}, PublicInstanceProxyHandlers, {
-      get(target, key) {
-          // fast path for unscopables when using `with` block
-          if (key === Symbol.unscopables) {
-              return;
-          }
-          return PublicInstanceProxyHandlers.get(target, key, target);
-      },
-      has(_, key) {
-          const has = key[0] !== '_' && !isGloballyWhitelisted(key);
-          if ( !has && PublicInstanceProxyHandlers.has(_, key)) {
-              warn(`Property ${JSON.stringify(key)} should not start with _ which is a reserved prefix for Vue internals.`);
-          }
-          return has;
-      }
-  });
-  // In dev mode, the proxy target exposes the same properties as seen on `this`
-  // for easier console inspection. In prod mode it will be an empty object so
-  // these properties definitions can be skipped.
-  function createRenderContext(instance) {
-      const target = {};
-      // expose internal instance for proxy handlers
-      Object.defineProperty(target, `_`, {
-          configurable: true,
-          enumerable: false,
-          get: () => instance
-      });
-      // expose public properties
-      Object.keys(publicPropertiesMap).forEach(key => {
-          Object.defineProperty(target, key, {
-              configurable: true,
-              enumerable: false,
-              get: () => publicPropertiesMap[key](instance),
-              // intercepted by the proxy so no need for implementation,
-              // but needed to prevent set errors
-              set: NOOP
-          });
-      });
-      // expose global properties
-      const { globalProperties } = instance.appContext.config;
-      Object.keys(globalProperties).forEach(key => {
-          Object.defineProperty(target, key, {
-              configurable: true,
-              enumerable: false,
-              get: () => globalProperties[key],
-              set: NOOP
-          });
-      });
-      return target;
-  }
-  // dev only
-  function exposePropsOnRenderContext(instance) {
-      const { ctx, propsOptions: [propsOptions] } = instance;
-      if (propsOptions) {
-          Object.keys(propsOptions).forEach(key => {
-              Object.defineProperty(ctx, key, {
-                  enumerable: true,
-                  configurable: true,
-                  get: () => instance.props[key],
-                  set: NOOP
-              });
-          });
-      }
-  }
-  // dev only
-  function exposeSetupStateOnRenderContext(instance) {
-      const { ctx, setupState } = instance;
-      Object.keys(toRaw(setupState)).forEach(key => {
-          if (key[0] === '$' || key[0] === '_') {
-              warn(`setup() return property ${JSON.stringify(key)} should not start with "$" or "_" ` +
-                  `which are reserved prefixes for Vue internals.`);
-              return;
-          }
-          Object.defineProperty(ctx, key, {
-              enumerable: true,
-              configurable: true,
-              get: () => setupState[key],
-              set: NOOP
-          });
-      });
-  }
-
-  const emptyAppContext = createAppContext();
-  let uid$2 = 0;
-  function createComponentInstance(vnode, parent, suspense) {
-      const type = vnode.type;
-      // inherit parent app context - or - if root, adopt from root vnode
-      const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
-      const instance = {
-          uid: uid$2++,
-          vnode,
-          type,
-          parent,
-          appContext,
-          root: null,
-          next: null,
-          subTree: null,
-          update: null,
-          render: null,
-          proxy: null,
-          exposed: null,
-          withProxy: null,
-          effects: null,
-          provides: parent ? parent.provides : Object.create(appContext.provides),
-          accessCache: null,
-          renderCache: [],
-          // local resovled assets
-          components: null,
-          directives: null,
-          // resolved props and emits options
-          propsOptions: normalizePropsOptions(type, appContext),
-          emitsOptions: normalizeEmitsOptions(type, appContext),
-          // emit
-          emit: null,
-          emitted: null,
-          // state
-          ctx: EMPTY_OBJ,
-          data: EMPTY_OBJ,
-          props: EMPTY_OBJ,
-          attrs: EMPTY_OBJ,
-          slots: EMPTY_OBJ,
-          refs: EMPTY_OBJ,
-          setupState: EMPTY_OBJ,
-          setupContext: null,
-          // suspense related
-          suspense,
-          suspenseId: suspense ? suspense.pendingId : 0,
-          asyncDep: null,
-          asyncResolved: false,
-          // lifecycle hooks
-          // not using enums here because it results in computed properties
-          isMounted: false,
-          isUnmounted: false,
-          isDeactivated: false,
-          bc: null,
-          c: null,
-          bm: null,
-          m: null,
-          bu: null,
-          u: null,
-          um: null,
-          bum: null,
-          da: null,
-          a: null,
-          rtg: null,
-          rtc: null,
-          ec: null
-      };
-      {
-          instance.ctx = createRenderContext(instance);
-      }
-      instance.root = parent ? parent.root : instance;
-      instance.emit = emit.bind(null, instance);
-      {
-          devtoolsComponentAdded(instance);
-      }
-      return instance;
-  }
-  let currentInstance = null;
-  const getCurrentInstance = () => currentInstance || currentRenderingInstance;
-  const setCurrentInstance = (instance) => {
-      currentInstance = instance;
-  };
-  const isBuiltInTag = /*#__PURE__*/ makeMap('slot,component');
-  function validateComponentName(name, config) {
-      const appIsNativeTag = config.isNativeTag || NO;
-      if (isBuiltInTag(name) || appIsNativeTag(name)) {
-          warn('Do not use built-in or reserved HTML elements as component id: ' + name);
-      }
-  }
-  let isInSSRComponentSetup = false;
-  function setupComponent(instance, isSSR = false) {
-      isInSSRComponentSetup = isSSR;
-      const { props, children, shapeFlag } = instance.vnode;
-      const isStateful = shapeFlag & 4 /* STATEFUL_COMPONENT */;
-      initProps(instance, props, isStateful, isSSR);
-      initSlots(instance, children);
-      const setupResult = isStateful
-          ? setupStatefulComponent(instance, isSSR)
-          : undefined;
-      isInSSRComponentSetup = false;
-      return setupResult;
-  }
-  function setupStatefulComponent(instance, isSSR) {
-      const Component = instance.type;
-      {
-          if (Component.name) {
-              validateComponentName(Component.name, instance.appContext.config);
-          }
-          if (Component.components) {
-              const names = Object.keys(Component.components);
-              for (let i = 0; i < names.length; i++) {
-                  validateComponentName(names[i], instance.appContext.config);
-              }
-          }
-          if (Component.directives) {
-              const names = Object.keys(Component.directives);
-              for (let i = 0; i < names.length; i++) {
-                  validateDirectiveName(names[i]);
-              }
-          }
-      }
-      // 0. create render proxy property access cache
-      instance.accessCache = Object.create(null);
-      // 1. create public instance / render proxy
-      // also mark it raw so it's never observed
-      instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);
-      {
-          exposePropsOnRenderContext(instance);
-      }
-      // 2. call setup()
-      const { setup } = Component;
-      if (setup) {
-          const setupContext = (instance.setupContext =
-              setup.length > 1 ? createSetupContext(instance) : null);
-          currentInstance = instance;
-          pauseTracking();
-          const setupResult = callWithErrorHandling(setup, instance, 0 /* SETUP_FUNCTION */, [ shallowReadonly(instance.props) , setupContext]);
-          resetTracking();
-          currentInstance = null;
-          if (isPromise(setupResult)) {
-              if (isSSR) {
-                  // return the promise so server-renderer can wait on it
-                  return setupResult.then((resolvedResult) => {
-                      handleSetupResult(instance, resolvedResult);
-                  });
-              }
-              else {
-                  // async setup returned Promise.
-                  // bail here and wait for re-entry.
-                  instance.asyncDep = setupResult;
-              }
-          }
-          else {
-              handleSetupResult(instance, setupResult);
-          }
-      }
-      else {
-          finishComponentSetup(instance);
-      }
-  }
-  function handleSetupResult(instance, setupResult, isSSR) {
-      if (isFunction(setupResult)) {
-          // setup returned an inline render function
-          {
-              instance.render = setupResult;
-          }
-      }
-      else if (isObject(setupResult)) {
-          if ( isVNode(setupResult)) {
-              warn(`setup() should not return VNodes directly - ` +
-                  `return a render function instead.`);
-          }
-          // setup returned bindings.
-          // assuming a render function compiled from template is present.
-          {
-              instance.devtoolsRawSetupState = setupResult;
-          }
-          instance.setupState = proxyRefs(setupResult);
-          {
-              exposeSetupStateOnRenderContext(instance);
-          }
-      }
-      else if ( setupResult !== undefined) {
-          warn(`setup() should return an object. Received: ${setupResult === null ? 'null' : typeof setupResult}`);
-      }
-      finishComponentSetup(instance);
-  }
-  let compile;
-  /**
-   * For runtime-dom to register the compiler.
-   * Note the exported method uses any to avoid d.ts relying on the compiler types.
-   */
-  function registerRuntimeCompiler(_compile) {
-      compile = _compile;
-  }
-  function finishComponentSetup(instance, isSSR) {
-      const Component = instance.type;
-      // template / render function normalization
-      if (!instance.render) {
-          // could be set from setup()
-          if (compile && Component.template && !Component.render) {
-              {
-                  startMeasure(instance, `compile`);
-              }
-              Component.render = compile(Component.template, {
-                  isCustomElement: instance.appContext.config.isCustomElement,
-                  delimiters: Component.delimiters
-              });
-              {
-                  endMeasure(instance, `compile`);
-              }
-          }
-          instance.render = (Component.render || NOOP);
-          // for runtime-compiled render functions using `with` blocks, the render
-          // proxy used needs a different `has` handler which is more performant and
-          // also only allows a whitelist of globals to fallthrough.
-          if (instance.render._rc) {
-              instance.withProxy = new Proxy(instance.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
-          }
-      }
-      // support for 2.x options
-      {
-          currentInstance = instance;
-          pauseTracking();
-          applyOptions(instance, Component);
-          resetTracking();
-          currentInstance = null;
-      }
-      // warn missing template/render
-      if ( !Component.render && instance.render === NOOP) {
-          /* istanbul ignore if */
-          if (!compile && Component.template) {
-              warn(`Component provided template option but ` +
-                  `runtime compilation is not supported in this build of Vue.` +
-                  (   ` Use "vue.global.js" instead.`
-                              ) /* should not happen */);
-          }
-          else {
-              warn(`Component is missing template or render function.`);
-          }
-      }
-  }
-  const attrHandlers = {
-      get: (target, key) => {
-          {
-              markAttrsAccessed();
-          }
-          return target[key];
-      },
-      set: () => {
-          warn(`setupContext.attrs is readonly.`);
-          return false;
-      },
-      deleteProperty: () => {
-          warn(`setupContext.attrs is readonly.`);
-          return false;
-      }
-  };
-  function createSetupContext(instance) {
-      const expose = exposed => {
-          if ( instance.exposed) {
-              warn(`expose() should be called only once per setup().`);
-          }
-          instance.exposed = proxyRefs(exposed);
-      };
-      {
-          // We use getters in dev in case libs like test-utils overwrite instance
-          // properties (overwrites should not be done in prod)
-          return Object.freeze({
-              get props() {
-                  return instance.props;
-              },
-              get attrs() {
-                  return new Proxy(instance.attrs, attrHandlers);
-              },
-              get slots() {
-                  return shallowReadonly(instance.slots);
-              },
-              get emit() {
-                  return (event, ...args) => instance.emit(event, ...args);
-              },
-              expose
-          });
-      }
-  }
-  // record effects created during a component's setup() so that they can be
-  // stopped when the component unmounts
-  function recordInstanceBoundEffect(effect, instance = currentInstance) {
-      if (instance) {
-          (instance.effects || (instance.effects = [])).push(effect);
-      }
-  }
-  const classifyRE = /(?:^|[-_])(\w)/g;
-  const classify = (str) => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '');
-  function getComponentName(Component) {
-      return isFunction(Component)
-          ? Component.displayName || Component.name
-          : Component.name;
-  }
-  /* istanbul ignore next */
-  function formatComponentName(instance, Component, isRoot = false) {
-      let name = getComponentName(Component);
-      if (!name && Component.__file) {
-          const match = Component.__file.match(/([^/\\]+)\.\w+$/);
-          if (match) {
-              name = match[1];
-          }
-      }
-      if (!name && instance && instance.parent) {
-          // try to infer the name based on reverse resolution
-          const inferFromRegistry = (registry) => {
-              for (const key in registry) {
-                  if (registry[key] === Component) {
-                      return key;
-                  }
-              }
-          };
-          name =
-              inferFromRegistry(instance.components ||
-                  instance.parent.type.components) || inferFromRegistry(instance.appContext.components);
-      }
-      return name ? classify(name) : isRoot ? `App` : `Anonymous`;
-  }
-  function isClassComponent(value) {
-      return isFunction(value) && '__vccOpts' in value;
-  }
-
-  function computed$1(getterOrOptions) {
-      const c = computed(getterOrOptions);
-      recordInstanceBoundEffect(c.effect);
-      return c;
-  }
-
-  // implementation
-  function defineProps() {
-      {
-          warn(`defineProps() is a compiler-hint helper that is only usable inside ` +
-              `<script setup> of a single file component. Its arguments should be ` +
-              `compiled away and passing it at runtime has no effect.`);
-      }
-      return null;
-  }
-  // implementation
-  function defineEmit() {
-      {
-          warn(`defineEmit() is a compiler-hint helper that is only usable inside ` +
-              `<script setup> of a single file component. Its arguments should be ` +
-              `compiled away and passing it at runtime has no effect.`);
-      }
-      return null;
-  }
-  function useContext() {
-      const i = getCurrentInstance();
-      if ( !i) {
-          warn(`useContext() called without active instance.`);
-      }
-      return i.setupContext || (i.setupContext = createSetupContext(i));
-  }
-
-  // Actual implementation
-  function h(type, propsOrChildren, children) {
-      const l = arguments.length;
-      if (l === 2) {
-          if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
-              // single vnode without props
-              if (isVNode(propsOrChildren)) {
-                  return createVNode(type, null, [propsOrChildren]);
-              }
-              // props without children
-              return createVNode(type, propsOrChildren);
-          }
-          else {
-              // omit props
-              return createVNode(type, null, propsOrChildren);
-          }
-      }
-      else {
-          if (l > 3) {
-              children = Array.prototype.slice.call(arguments, 2);
-          }
-          else if (l === 3 && isVNode(children)) {
-              children = [children];
-          }
-          return createVNode(type, propsOrChildren, children);
-      }
-  }
-
-  const ssrContextKey = Symbol( `ssrContext` );
-  const useSSRContext = () => {
-      {
-          warn(`useSsrContext() is not supported in the global build.`);
-      }
-  };
-
-  function initCustomFormatter() {
-      /* eslint-disable no-restricted-globals */
-      if ( typeof window === 'undefined') {
-          return;
-      }
-      const vueStyle = { style: 'color:#3ba776' };
-      const numberStyle = { style: 'color:#0b1bc9' };
-      const stringStyle = { style: 'color:#b62e24' };
-      const keywordStyle = { style: 'color:#9d288c' };
-      // custom formatter for Chrome
-      // https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html
-      const formatter = {
-          header(obj) {
-              // TODO also format ComponentPublicInstance & ctx.slots/attrs in setup
-              if (!isObject(obj)) {
-                  return null;
-              }
-              if (obj.__isVue) {
-                  return ['div', vueStyle, `VueInstance`];
-              }
-              else if (isRef(obj)) {
-                  return [
-                      'div',
-                      {},
-                      ['span', vueStyle, genRefFlag(obj)],
-                      '<',
-                      formatValue(obj.value),
-                      `>`
-                  ];
-              }
-              else if (isReactive(obj)) {
-                  return [
-                      'div',
-                      {},
-                      ['span', vueStyle, 'Reactive'],
-                      '<',
-                      formatValue(obj),
-                      `>${isReadonly(obj) ? ` (readonly)` : ``}`
-                  ];
-              }
-              else if (isReadonly(obj)) {
-                  return [
-                      'div',
-                      {},
-                      ['span', vueStyle, 'Readonly'],
-                      '<',
-                      formatValue(obj),
-                      '>'
-                  ];
-              }
-              return null;
-          },
-          hasBody(obj) {
-              return obj && obj.__isVue;
-          },
-          body(obj) {
-              if (obj && obj.__isVue) {
-                  return [
-                      'div',
-                      {},
-                      ...formatInstance(obj.$)
-                  ];
-              }
-          }
-      };
-      function formatInstance(instance) {
-          const blocks = [];
-          if (instance.type.props && instance.props) {
-              blocks.push(createInstanceBlock('props', toRaw(instance.props)));
-          }
-          if (instance.setupState !== EMPTY_OBJ) {
-              blocks.push(createInstanceBlock('setup', instance.setupState));
-          }
-          if (instance.data !== EMPTY_OBJ) {
-              blocks.push(createInstanceBlock('data', toRaw(instance.data)));
-          }
-          const computed = extractKeys(instance, 'computed');
-          if (computed) {
-              blocks.push(createInstanceBlock('computed', computed));
-          }
-          const injected = extractKeys(instance, 'inject');
-          if (injected) {
-              blocks.push(createInstanceBlock('injected', injected));
-          }
-          blocks.push([
-              'div',
-              {},
-              [
-                  'span',
-                  {
-                      style: keywordStyle.style + ';opacity:0.66'
-                  },
-                  '$ (internal): '
-              ],
-              ['object', { object: instance }]
-          ]);
-          return blocks;
-      }
-      function createInstanceBlock(type, target) {
-          target = extend({}, target);
-          if (!Object.keys(target).length) {
-              return ['span', {}];
-          }
-          return [
-              'div',
-              { style: 'line-height:1.25em;margin-bottom:0.6em' },
-              [
-                  'div',
-                  {
-                      style: 'color:#476582'
-                  },
-                  type
-              ],
-              [
-                  'div',
-                  {
-                      style: 'padding-left:1.25em'
-                  },
-                  ...Object.keys(target).map(key => {
-                      return [
-                          'div',
-                          {},
-                          ['span', keywordStyle, key + ': '],
-                          formatValue(target[key], false)
-                      ];
-                  })
-              ]
-          ];
-      }
-      function formatValue(v, asRaw = true) {
-          if (typeof v === 'number') {
-              return ['span', numberStyle, v];
-          }
-          else if (typeof v === 'string') {
-              return ['span', stringStyle, JSON.stringify(v)];
-          }
-          else if (typeof v === 'boolean') {
-              return ['span', keywordStyle, v];
-          }
-          else if (isObject(v)) {
-              return ['object', { object: asRaw ? toRaw(v) : v }];
-          }
-          else {
-              return ['span', stringStyle, String(v)];
-          }
-      }
-      function extractKeys(instance, type) {
-          const Comp = instance.type;
-          if (isFunction(Comp)) {
-              return;
-          }
-          const extracted = {};
-          for (const key in instance.ctx) {
-              if (isKeyOfType(Comp, key, type)) {
-                  extracted[key] = instance.ctx[key];
-              }
-          }
-          return extracted;
-      }
-      function isKeyOfType(Comp, key, type) {
-          const opts = Comp[type];
-          if ((isArray(opts) && opts.includes(key)) ||
-              (isObject(opts) && key in opts)) {
-              return true;
-          }
-          if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
-              return true;
-          }
-          if (Comp.mixins && Comp.mixins.some(m => isKeyOfType(m, key, type))) {
-              return true;
-          }
-      }
-      function genRefFlag(v) {
-          if (v._shallow) {
-              return `ShallowRef`;
-          }
-          if (v.effect) {
-              return `ComputedRef`;
-          }
-          return `Ref`;
-      }
-      if (window.devtoolsFormatters) {
-          window.devtoolsFormatters.push(formatter);
-      }
-      else {
-          window.devtoolsFormatters = [formatter];
-      }
-  }
-
-  /**
-   * Actual implementation
-   */
-  function renderList(source, renderItem) {
-      let ret;
-      if (isArray(source) || isString(source)) {
-          ret = new Array(source.length);
-          for (let i = 0, l = source.length; i < l; i++) {
-              ret[i] = renderItem(source[i], i);
-          }
-      }
-      else if (typeof source === 'number') {
-          if ( !Number.isInteger(source)) {
-              warn(`The v-for range expect an integer value but got ${source}.`);
-              return [];
-          }
-          ret = new Array(source);
-          for (let i = 0; i < source; i++) {
-              ret[i] = renderItem(i + 1, i);
-          }
-      }
-      else if (isObject(source)) {
-          if (source[Symbol.iterator]) {
-              ret = Array.from(source, renderItem);
-          }
-          else {
-              const keys = Object.keys(source);
-              ret = new Array(keys.length);
-              for (let i = 0, l = keys.length; i < l; i++) {
-                  const key = keys[i];
-                  ret[i] = renderItem(source[key], key, i);
-              }
-          }
-      }
-      else {
-          ret = [];
-      }
-      return ret;
-  }
-
-  /**
-   * For prefixing keys in v-on="obj" with "on"
-   * @private
-   */
-  function toHandlers(obj) {
-      const ret = {};
-      if ( !isObject(obj)) {
-          warn(`v-on with no argument expects an object value.`);
-          return ret;
-      }
-      for (const key in obj) {
-          ret[toHandlerKey(key)] = obj[key];
-      }
-      return ret;
-  }
-
-  /**
-   * Compiler runtime helper for creating dynamic slots object
-   * @private
-   */
-  function createSlots(slots, dynamicSlots) {
-      for (let i = 0; i < dynamicSlots.length; i++) {
-          const slot = dynamicSlots[i];
-          // array of dynamic slot generated by <template v-for="..." #[...]>
-          if (isArray(slot)) {
-              for (let j = 0; j < slot.length; j++) {
-                  slots[slot[j].name] = slot[j].fn;
-              }
-          }
-          else if (slot) {
-              // conditional single slot generated by <template v-if="..." #foo>
-              slots[slot.name] = slot.fn;
-          }
-      }
-      return slots;
-  }
-
-  // Core API ------------------------------------------------------------------
-  const version = "3.0.5";
-  /**
-   * SSR utils for \@vue/server-renderer. Only exposed in cjs builds.
-   * @internal
-   */
-  const ssrUtils = ( null);
-
-  const svgNS = 'http://www.w3.org/2000/svg';
-  const doc = (typeof document !== 'undefined' ? document : null);
-  let tempContainer;
-  let tempSVGContainer;
-  const nodeOps = {
-      insert: (child, parent, anchor) => {
-          parent.insertBefore(child, anchor || null);
-      },
-      remove: child => {
-          const parent = child.parentNode;
-          if (parent) {
-              parent.removeChild(child);
-          }
-      },
-      createElement: (tag, isSVG, is) => isSVG
-          ? doc.createElementNS(svgNS, tag)
-          : doc.createElement(tag, is ? { is } : undefined),
-      createText: text => doc.createTextNode(text),
-      createComment: text => doc.createComment(text),
-      setText: (node, text) => {
-          node.nodeValue = text;
-      },
-      setElementText: (el, text) => {
-          el.textContent = text;
-      },
-      parentNode: node => node.parentNode,
-      nextSibling: node => node.nextSibling,
-      querySelector: selector => doc.querySelector(selector),
-      setScopeId(el, id) {
-          el.setAttribute(id, '');
-      },
-      cloneNode(el) {
-          return el.cloneNode(true);
-      },
-      // __UNSAFE__
-      // Reason: innerHTML.
-      // Static content here can only come from compiled templates.
-      // As long as the user only uses trusted templates, this is safe.
-      insertStaticContent(content, parent, anchor, isSVG) {
-          const temp = isSVG
-              ? tempSVGContainer ||
-                  (tempSVGContainer = doc.createElementNS(svgNS, 'svg'))
-              : tempContainer || (tempContainer = doc.createElement('div'));
-          temp.innerHTML = content;
-          const first = temp.firstChild;
-          let node = first;
-          let last = node;
-          while (node) {
-              last = node;
-              nodeOps.insert(node, parent, anchor);
-              node = temp.firstChild;
-          }
-          return [first, last];
-      }
-  };
-
-  // compiler should normalize class + :class bindings on the same element
-  // into a single binding ['staticClass', dynamic]
-  function patchClass(el, value, isSVG) {
-      if (value == null) {
-          value = '';
-      }
-      if (isSVG) {
-          el.setAttribute('class', value);
-      }
-      else {
-          // directly setting className should be faster than setAttribute in theory
-          // if this is an element during a transition, take the temporary transition
-          // classes into account.
-          const transitionClasses = el._vtc;
-          if (transitionClasses) {
-              value = (value
-                  ? [value, ...transitionClasses]
-                  : [...transitionClasses]).join(' ');
-          }
-          el.className = value;
-      }
-  }
-
-  function patchStyle(el, prev, next) {
-      const style = el.style;
-      if (!next) {
-          el.removeAttribute('style');
-      }
-      else if (isString(next)) {
-          if (prev !== next) {
-              style.cssText = next;
-          }
-      }
-      else {
-          for (const key in next) {
-              setStyle(style, key, next[key]);
-          }
-          if (prev && !isString(prev)) {
-              for (const key in prev) {
-                  if (next[key] == null) {
-                      setStyle(style, key, '');
-                  }
-              }
-          }
-      }
-  }
-  const importantRE = /\s*!important$/;
-  function setStyle(style, name, val) {
-      if (isArray(val)) {
-          val.forEach(v => setStyle(style, name, v));
-      }
-      else {
-          if (name.startsWith('--')) {
-              // custom property definition
-              style.setProperty(name, val);
-          }
-          else {
-              const prefixed = autoPrefix(style, name);
-              if (importantRE.test(val)) {
-                  // !important
-                  style.setProperty(hyphenate(prefixed), val.replace(importantRE, ''), 'important');
-              }
-              else {
-                  style[prefixed] = val;
-              }
-          }
-      }
-  }
-  const prefixes = ['Webkit', 'Moz', 'ms'];
-  const prefixCache = {};
-  function autoPrefix(style, rawName) {
-      const cached = prefixCache[rawName];
-      if (cached) {
-          return cached;
-      }
-      let name = camelize(rawName);
-      if (name !== 'filter' && name in style) {
-          return (prefixCache[rawName] = name);
-      }
-      name = capitalize(name);
-      for (let i = 0; i < prefixes.length; i++) {
-          const prefixed = prefixes[i] + name;
-          if (prefixed in style) {
-              return (prefixCache[rawName] = prefixed);
-          }
-      }
-      return rawName;
-  }
-
-  const xlinkNS = 'http://www.w3.org/1999/xlink';
-  function patchAttr(el, key, value, isSVG) {
-      if (isSVG && key.startsWith('xlink:')) {
-          if (value == null) {
-              el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
-          }
-          else {
-              el.setAttributeNS(xlinkNS, key, value);
-          }
-      }
-      else {
-          // note we are only checking boolean attributes that don't have a
-          // corresponding dom prop of the same name here.
-          const isBoolean = isSpecialBooleanAttr(key);
-          if (value == null || (isBoolean && value === false)) {
-              el.removeAttribute(key);
-          }
-          else {
-              el.setAttribute(key, isBoolean ? '' : value);
-          }
-      }
-  }
-
-  // __UNSAFE__
-  // functions. The user is responsible for using them with only trusted content.
-  function patchDOMProp(el, key, value,
-  // the following args are passed only due to potential innerHTML/textContent
-  // overriding existing VNodes, in which case the old tree must be properly
-  // unmounted.
-  prevChildren, parentComponent, parentSuspense, unmountChildren) {
-      if (key === 'innerHTML' || key === 'textContent') {
-          if (prevChildren) {
-              unmountChildren(prevChildren, parentComponent, parentSuspense);
-          }
-          el[key] = value == null ? '' : value;
-          return;
-      }
-      if (key === 'value' && el.tagName !== 'PROGRESS') {
-          // store value as _value as well since
-          // non-string values will be stringified.
-          el._value = value;
-          const newValue = value == null ? '' : value;
-          if (el.value !== newValue) {
-              el.value = newValue;
-          }
-          return;
-      }
-      if (value === '' || value == null) {
-          const type = typeof el[key];
-          if (value === '' && type === 'boolean') {
-              // e.g. <select multiple> compiles to { multiple: '' }
-              el[key] = true;
-              return;
-          }
-          else if (value == null && type === 'string') {
-              // e.g. <div :id="null">
-              el[key] = '';
-              el.removeAttribute(key);
-              return;
-          }
-          else if (type === 'number') {
-              // e.g. <img :width="null">
-              el[key] = 0;
-              el.removeAttribute(key);
-              return;
-          }
-      }
-      // some properties perform value validation and throw
-      try {
-          el[key] = value;
-      }
-      catch (e) {
-          {
-              warn(`Failed setting prop "${key}" on <${el.tagName.toLowerCase()}>: ` +
-                  `value ${value} is invalid.`, e);
-          }
-      }
-  }
-
-  // Async edge case fix requires storing an event listener's attach timestamp.
-  let _getNow = Date.now;
-  // Determine what event timestamp the browser is using. Annoyingly, the
-  // timestamp can either be hi-res (relative to page load) or low-res
-  // (relative to UNIX epoch), so in order to compare time we have to use the
-  // same timestamp type when saving the flush timestamp.
-  if (typeof document !== 'undefined' &&
-      _getNow() > document.createEvent('Event').timeStamp) {
-      // if the low-res timestamp which is bigger than the event timestamp
-      // (which is evaluated AFTER) it means the event is using a hi-res timestamp,
-      // and we need to use the hi-res version for event listeners as well.
-      _getNow = () => performance.now();
-  }
-  // To avoid the overhead of repeatedly calling performance.now(), we cache
-  // and use the same timestamp for all event listeners attached in the same tick.
-  let cachedNow = 0;
-  const p = Promise.resolve();
-  const reset = () => {
-      cachedNow = 0;
-  };
-  const getNow = () => cachedNow || (p.then(reset), (cachedNow = _getNow()));
-  function addEventListener(el, event, handler, options) {
-      el.addEventListener(event, handler, options);
-  }
-  function removeEventListener(el, event, handler, options) {
-      el.removeEventListener(event, handler, options);
-  }
-  function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
-      // vei = vue event invokers
-      const invokers = el._vei || (el._vei = {});
-      const existingInvoker = invokers[rawName];
-      if (nextValue && existingInvoker) {
-          // patch
-          existingInvoker.value = nextValue;
-      }
-      else {
-          const [name, options] = parseName(rawName);
-          if (nextValue) {
-              // add
-              const invoker = (invokers[rawName] = createInvoker(nextValue, instance));
-              addEventListener(el, name, invoker, options);
-          }
-          else if (existingInvoker) {
-              // remove
-              removeEventListener(el, name, existingInvoker, options);
-              invokers[rawName] = undefined;
-          }
-      }
-  }
-  const optionsModifierRE = /(?:Once|Passive|Capture)$/;
-  function parseName(name) {
-      let options;
-      if (optionsModifierRE.test(name)) {
-          options = {};
-          let m;
-          while ((m = name.match(optionsModifierRE))) {
-              name = name.slice(0, name.length - m[0].length);
-              options[m[0].toLowerCase()] = true;
-          }
-      }
-      return [name.slice(2).toLowerCase(), options];
-  }
-  function createInvoker(initialValue, instance) {
-      const invoker = (e) => {
-          // async edge case #6566: inner click event triggers patch, event handler
-          // attached to outer element during patch, and triggered again. This
-          // happens because browsers fire microtask ticks between event propagation.
-          // the solution is simple: we save the timestamp when a handler is attached,
-          // and the handler would only fire if the event passed to it was fired
-          // AFTER it was attached.
-          const timeStamp = e.timeStamp || _getNow();
-          if (timeStamp >= invoker.attached - 1) {
-              callWithAsyncErrorHandling(patchStopImmediatePropagation(e, invoker.value), instance, 5 /* NATIVE_EVENT_HANDLER */, [e]);
-          }
-      };
-      invoker.value = initialValue;
-      invoker.attached = getNow();
-      return invoker;
-  }
-  function patchStopImmediatePropagation(e, value) {
-      if (isArray(value)) {
-          const originalStop = e.stopImmediatePropagation;
-          e.stopImmediatePropagation = () => {
-              originalStop.call(e);
-              e._stopped = true;
-          };
-          return value.map(fn => (e) => !e._stopped && fn(e));
-      }
-      else {
-          return value;
-      }
-  }
-
-  const nativeOnRE = /^on[a-z]/;
-  const forcePatchProp = (_, key) => key === 'value';
-  const patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {
-      switch (key) {
-          // special
-          case 'class':
-              patchClass(el, nextValue, isSVG);
-              break;
-          case 'style':
-              patchStyle(el, prevValue, nextValue);
-              break;
-          default:
-              if (isOn(key)) {
-                  // ignore v-model listeners
-                  if (!isModelListener(key)) {
-                      patchEvent(el, key, prevValue, nextValue, parentComponent);
-                  }
-              }
-              else if (shouldSetAsProp(el, key, nextValue, isSVG)) {
-                  patchDOMProp(el, key, nextValue, prevChildren, parentComponent, parentSuspense, unmountChildren);
-              }
-              else {
-                  // special case for <input v-model type="checkbox"> with
-                  // :true-value & :false-value
-                  // store value as dom properties since non-string values will be
-                  // stringified.
-                  if (key === 'true-value') {
-                      el._trueValue = nextValue;
-                  }
-                  else if (key === 'false-value') {
-                      el._falseValue = nextValue;
-                  }
-                  patchAttr(el, key, nextValue, isSVG);
-              }
-              break;
-      }
-  };
-  function shouldSetAsProp(el, key, value, isSVG) {
-      if (isSVG) {
-          // most keys must be set as attribute on svg elements to work
-          // ...except innerHTML
-          if (key === 'innerHTML') {
-              return true;
-          }
-          // or native onclick with function values
-          if (key in el && nativeOnRE.test(key) && isFunction(value)) {
-              return true;
-          }
-          return false;
-      }
-      // spellcheck and draggable are numerated attrs, however their
-      // corresponding DOM properties are actually booleans - this leads to
-      // setting it with a string "false" value leading it to be coerced to
-      // `true`, so we need to always treat them as attributes.
-      // Note that `contentEditable` doesn't have this problem: its DOM
-      // property is also enumerated string values.
-      if (key === 'spellcheck' || key === 'draggable') {
-          return false;
-      }
-      // #1787 form as an attribute must be a string, while it accepts an Element as
-      // a prop
-      if (key === 'form' && typeof value === 'string') {
-          return false;
-      }
-      // #1526 <input list> must be set as attribute
-      if (key === 'list' && el.tagName === 'INPUT') {
-          return false;
-      }
-      // native onclick with string value, must be set as attribute
-      if (nativeOnRE.test(key) && isString(value)) {
-          return false;
-      }
-      return key in el;
-  }
-
-  function useCssModule(name = '$style') {
-      /* istanbul ignore else */
-      {
-          {
-              warn(`useCssModule() is not supported in the global build.`);
-          }
-          return EMPTY_OBJ;
-      }
-  }
-
-  /**
-   * Runtime helper for SFC's CSS variable injection feature.
-   * @private
-   */
-  function useCssVars(getter) {
-      const instance = getCurrentInstance();
-      /* istanbul ignore next */
-      if (!instance) {
-
-              warn(`useCssVars is called without current active component instance.`);
-          return;
-      }
-      const setVars = () => setVarsOnVNode(instance.subTree, getter(instance.proxy));
-      onMounted(() => watchEffect(setVars, { flush: 'post' }));
-      onUpdated(setVars);
-  }
-  function setVarsOnVNode(vnode, vars) {
-      if ( vnode.shapeFlag & 128 /* SUSPENSE */) {
-          const suspense = vnode.suspense;
-          vnode = suspense.activeBranch;
-          if (suspense.pendingBranch && !suspense.isHydrating) {
-              suspense.effects.push(() => {
-                  setVarsOnVNode(suspense.activeBranch, vars);
-              });
-          }
-      }
-      // drill down HOCs until it's a non-component vnode
-      while (vnode.component) {
-          vnode = vnode.component.subTree;
-      }
-      if (vnode.shapeFlag & 1 /* ELEMENT */ && vnode.el) {
-          const style = vnode.el.style;
-          for (const key in vars) {
-              style.setProperty(`--${key}`, vars[key]);
-          }
-      }
-      else if (vnode.type === Fragment) {
-          vnode.children.forEach(c => setVarsOnVNode(c, vars));
-      }
-  }
-
-  const TRANSITION = 'transition';
-  const ANIMATION = 'animation';
-  // DOM Transition is a higher-order-component based on the platform-agnostic
-  // base Transition component, with DOM-specific logic.
-  const Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);
-  Transition.displayName = 'Transition';
-  const DOMTransitionPropsValidators = {
-      name: String,
-      type: String,
-      css: {
-          type: Boolean,
-          default: true
-      },
-      duration: [String, Number, Object],
-      enterFromClass: String,
-      enterActiveClass: String,
-      enterToClass: String,
-      appearFromClass: String,
-      appearActiveClass: String,
-      appearToClass: String,
-      leaveFromClass: String,
-      leaveActiveClass: String,
-      leaveToClass: String
-  };
-  const TransitionPropsValidators = (Transition.props = /*#__PURE__*/ extend({}, BaseTransition.props, DOMTransitionPropsValidators));
-  function resolveTransitionProps(rawProps) {
-      let { name = 'v', type, css = true, duration, enterFromClass = `${name}-enter-from`, enterActiveClass = `${name}-enter-active`, enterToClass = `${name}-enter-to`, appearFromClass = enterFromClass, appearActiveClass = enterActiveClass, appearToClass = enterToClass, leaveFromClass = `${name}-leave-from`, leaveActiveClass = `${name}-leave-active`, leaveToClass = `${name}-leave-to` } = rawProps;
-      const baseProps = {};
-      for (const key in rawProps) {
-          if (!(key in DOMTransitionPropsValidators)) {
-              baseProps[key] = rawProps[key];
-          }
-      }
-      if (!css) {
-          return baseProps;
-      }
-      const durations = normalizeDuration(duration);
-      const enterDuration = durations && durations[0];
-      const leaveDuration = durations && durations[1];
-      const { onBeforeEnter, onEnter, onEnterCancelled, onLeave, onLeaveCancelled, onBeforeAppear = onBeforeEnter, onAppear = onEnter, onAppearCancelled = onEnterCancelled } = baseProps;
-      const finishEnter = (el, isAppear, done) => {
-          removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
-          removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
-          done && done();
-      };
-      const finishLeave = (el, done) => {
-          removeTransitionClass(el, leaveToClass);
-          removeTransitionClass(el, leaveActiveClass);
-          done && done();
-      };
-      const makeEnterHook = (isAppear) => {
-          return (el, done) => {
-              const hook = isAppear ? onAppear : onEnter;
-              const resolve = () => finishEnter(el, isAppear, done);
-              hook && hook(el, resolve);
-              nextFrame(() => {
-                  removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
-                  addTransitionClass(el, isAppear ? appearToClass : enterToClass);
-                  if (!(hook && hook.length > 1)) {
-                      whenTransitionEnds(el, type, enterDuration, resolve);
-                  }
-              });
-          };
-      };
-      return extend(baseProps, {
-          onBeforeEnter(el) {
-              onBeforeEnter && onBeforeEnter(el);
-              addTransitionClass(el, enterFromClass);
-              addTransitionClass(el, enterActiveClass);
-          },
-          onBeforeAppear(el) {
-              onBeforeAppear && onBeforeAppear(el);
-              addTransitionClass(el, appearFromClass);
-              addTransitionClass(el, appearActiveClass);
-          },
-          onEnter: makeEnterHook(false),
-          onAppear: makeEnterHook(true),
-          onLeave(el, done) {
-              const resolve = () => finishLeave(el, done);
-              addTransitionClass(el, leaveFromClass);
-              // force reflow so *-leave-from classes immediately take effect (#2593)
-              forceReflow();
-              addTransitionClass(el, leaveActiveClass);
-              nextFrame(() => {
-                  removeTransitionClass(el, leaveFromClass);
-                  addTransitionClass(el, leaveToClass);
-                  if (!(onLeave && onLeave.length > 1)) {
-                      whenTransitionEnds(el, type, leaveDuration, resolve);
-                  }
-              });
-              onLeave && onLeave(el, resolve);
-          },
-          onEnterCancelled(el) {
-              finishEnter(el, false);
-              onEnterCancelled && onEnterCancelled(el);
-          },
-          onAppearCancelled(el) {
-              finishEnter(el, true);
-              onAppearCancelled && onAppearCancelled(el);
-          },
-          onLeaveCancelled(el) {
-              finishLeave(el);
-              onLeaveCancelled && onLeaveCancelled(el);
-          }
-      });
-  }
-  function normalizeDuration(duration) {
-      if (duration == null) {
-          return null;
-      }
-      else if (isObject(duration)) {
-          return [NumberOf(duration.enter), NumberOf(duration.leave)];
-      }
-      else {
-          const n = NumberOf(duration);
-          return [n, n];
-      }
-  }
-  function NumberOf(val) {
-      const res = toNumber(val);
-      validateDuration(res);
-      return res;
-  }
-  function validateDuration(val) {
-      if (typeof val !== 'number') {
-          warn(`<transition> explicit duration is not a valid number - ` +
-              `got ${JSON.stringify(val)}.`);
-      }
-      else if (isNaN(val)) {
-          warn(`<transition> explicit duration is NaN - ` +
-              'the duration expression might be incorrect.');
-      }
-  }
-  function addTransitionClass(el, cls) {
-      cls.split(/\s+/).forEach(c => c && el.classList.add(c));
-      (el._vtc ||
-          (el._vtc = new Set())).add(cls);
-  }
-  function removeTransitionClass(el, cls) {
-      cls.split(/\s+/).forEach(c => c && el.classList.remove(c));
-      const { _vtc } = el;
-      if (_vtc) {
-          _vtc.delete(cls);
-          if (!_vtc.size) {
-              el._vtc = undefined;
-          }
-      }
-  }
-  function nextFrame(cb) {
-      requestAnimationFrame(() => {
-          requestAnimationFrame(cb);
-      });
-  }
-  let endId = 0;
-  function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
-      const id = (el._endId = ++endId);
-      const resolveIfNotStale = () => {
-          if (id === el._endId) {
-              resolve();
-          }
-      };
-      if (explicitTimeout) {
-          return setTimeout(resolveIfNotStale, explicitTimeout);
-      }
-      const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
-      if (!type) {
-          return resolve();
-      }
-      const endEvent = type + 'end';
-      let ended = 0;
-      const end = () => {
-          el.removeEventListener(endEvent, onEnd);
-          resolveIfNotStale();
-      };
-      const onEnd = (e) => {
-          if (e.target === el && ++ended >= propCount) {
-              end();
-          }
-      };
-      setTimeout(() => {
-          if (ended < propCount) {
-              end();
-          }
-      }, timeout + 1);
-      el.addEventListener(endEvent, onEnd);
-  }
-  function getTransitionInfo(el, expectedType) {
-      const styles = window.getComputedStyle(el);
-      // JSDOM may return undefined for transition properties
-      const getStyleProperties = (key) => (styles[key] || '').split(', ');
-      const transitionDelays = getStyleProperties(TRANSITION + 'Delay');
-      const transitionDurations = getStyleProperties(TRANSITION + 'Duration');
-      const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
-      const animationDelays = getStyleProperties(ANIMATION + 'Delay');
-      const animationDurations = getStyleProperties(ANIMATION + 'Duration');
-      const animationTimeout = getTimeout(animationDelays, animationDurations);
-      let type = null;
-      let timeout = 0;
-      let propCount = 0;
-      /* istanbul ignore if */
-      if (expectedType === TRANSITION) {
-          if (transitionTimeout > 0) {
-              type = TRANSITION;
-              timeout = transitionTimeout;
-              propCount = transitionDurations.length;
-          }
-      }
-      else if (expectedType === ANIMATION) {
-          if (animationTimeout > 0) {
-              type = ANIMATION;
-              timeout = animationTimeout;
-              propCount = animationDurations.length;
-          }
-      }
-      else {
-          timeout = Math.max(transitionTimeout, animationTimeout);
-          type =
-              timeout > 0
-                  ? transitionTimeout > animationTimeout
-                      ? TRANSITION
-                      : ANIMATION
-                  : null;
-          propCount = type
-              ? type === TRANSITION
-                  ? transitionDurations.length
-                  : animationDurations.length
-              : 0;
-      }
-      const hasTransform = type === TRANSITION &&
-          /\b(transform|all)(,|$)/.test(styles[TRANSITION + 'Property']);
-      return {
-          type,
-          timeout,
-          propCount,
-          hasTransform
-      };
-  }
-  function getTimeout(delays, durations) {
-      while (delays.length < durations.length) {
-          delays = delays.concat(delays);
-      }
-      return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
-  }
-  // Old versions of Chromium (below 61.0.3163.100) formats floating pointer
-  // numbers in a locale-dependent way, using a comma instead of a dot.
-  // If comma is not replaced with a dot, the input will be rounded down
-  // (i.e. acting as a floor function) causing unexpected behaviors
-  function toMs(s) {
-      return Number(s.slice(0, -1).replace(',', '.')) * 1000;
-  }
-  // synchronously force layout to put elements into a certain state
-  function forceReflow() {
-      return document.body.offsetHeight;
-  }
-
-  const positionMap = new WeakMap();
-  const newPositionMap = new WeakMap();
-  const TransitionGroupImpl = {
-      name: 'TransitionGroup',
-      props: /*#__PURE__*/ extend({}, TransitionPropsValidators, {
-          tag: String,
-          moveClass: String
-      }),
-      setup(props, { slots }) {
-          const instance = getCurrentInstance();
-          const state = useTransitionState();
-          let prevChildren;
-          let children;
-          onUpdated(() => {
-              // children is guaranteed to exist after initial render
-              if (!prevChildren.length) {
-                  return;
-              }
-              const moveClass = props.moveClass || `${props.name || 'v'}-move`;
-              if (!hasCSSTransform(prevChildren[0].el, instance.vnode.el, moveClass)) {
-                  return;
-              }
-              // we divide the work into three loops to avoid mixing DOM reads and writes
-              // in each iteration - which helps prevent layout thrashing.
-              prevChildren.forEach(callPendingCbs);
-              prevChildren.forEach(recordPosition);
-              const movedChildren = prevChildren.filter(applyTranslation);
-              // force reflow to put everything in position
-              forceReflow();
-              movedChildren.forEach(c => {
-                  const el = c.el;
-                  const style = el.style;
-                  addTransitionClass(el, moveClass);
-                  style.transform = style.webkitTransform = style.transitionDuration = '';
-                  const cb = (el._moveCb = (e) => {
-                      if (e && e.target !== el) {
-                          return;
-                      }
-                      if (!e || /transform$/.test(e.propertyName)) {
-                          el.removeEventListener('transitionend', cb);
-                          el._moveCb = null;
-                          removeTransitionClass(el, moveClass);
-                      }
-                  });
-                  el.addEventListener('transitionend', cb);
-              });
-          });
-          return () => {
-              const rawProps = toRaw(props);
-              const cssTransitionProps = resolveTransitionProps(rawProps);
-              const tag = rawProps.tag || Fragment;
-              prevChildren = children;
-              children = slots.default ? getTransitionRawChildren(slots.default()) : [];
-              for (let i = 0; i < children.length; i++) {
-                  const child = children[i];
-                  if (child.key != null) {
-                      setTransitionHooks(child, resolveTransitionHooks(child, cssTransitionProps, state, instance));
-                  }
-                  else {
-                      warn(`<TransitionGroup> children must be keyed.`);
-                  }
-              }
-              if (prevChildren) {
-                  for (let i = 0; i < prevChildren.length; i++) {
-                      const child = prevChildren[i];
-                      setTransitionHooks(child, resolveTransitionHooks(child, cssTransitionProps, state, instance));
-                      positionMap.set(child, child.el.getBoundingClientRect());
-                  }
-              }
-              return createVNode(tag, null, children);
-          };
-      }
-  };
-  const TransitionGroup = TransitionGroupImpl;
-  function callPendingCbs(c) {
-      const el = c.el;
-      if (el._moveCb) {
-          el._moveCb();
-      }
-      if (el._enterCb) {
-          el._enterCb();
-      }
-  }
-  function recordPosition(c) {
-      newPositionMap.set(c, c.el.getBoundingClientRect());
-  }
-  function applyTranslation(c) {
-      const oldPos = positionMap.get(c);
-      const newPos = newPositionMap.get(c);
-      const dx = oldPos.left - newPos.left;
-      const dy = oldPos.top - newPos.top;
-      if (dx || dy) {
-          const s = c.el.style;
-          s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
-          s.transitionDuration = '0s';
-          return c;
-      }
-  }
-  function hasCSSTransform(el, root, moveClass) {
-      // Detect whether an element with the move class applied has
-      // CSS transitions. Since the element may be inside an entering
-      // transition at this very moment, we make a clone of it and remove
-      // all other transition classes applied to ensure only the move class
-      // is applied.
-      const clone = el.cloneNode();
-      if (el._vtc) {
-          el._vtc.forEach(cls => {
-              cls.split(/\s+/).forEach(c => c && clone.classList.remove(c));
-          });
-      }
-      moveClass.split(/\s+/).forEach(c => c && clone.classList.add(c));
-      clone.style.display = 'none';
-      const container = (root.nodeType === 1
-          ? root
-          : root.parentNode);
-      container.appendChild(clone);
-      const { hasTransform } = getTransitionInfo(clone);
-      container.removeChild(clone);
-      return hasTransform;
-  }
-
-  const getModelAssigner = (vnode) => {
-      const fn = vnode.props['onUpdate:modelValue'];
-      return isArray(fn) ? value => invokeArrayFns(fn, value) : fn;
-  };
-  function onCompositionStart(e) {
-      e.target.composing = true;
-  }
-  function onCompositionEnd(e) {
-      const target = e.target;
-      if (target.composing) {
-          target.composing = false;
-          trigger$1(target, 'input');
-      }
-  }
-  function trigger$1(el, type) {
-      const e = document.createEvent('HTMLEvents');
-      e.initEvent(type, true, true);
-      el.dispatchEvent(e);
-  }
-  // We are exporting the v-model runtime directly as vnode hooks so that it can
-  // be tree-shaken in case v-model is never used.
-  const vModelText = {
-      created(el, { modifiers: { lazy, trim, number } }, vnode) {
-          el._assign = getModelAssigner(vnode);
-          const castToNumber = number || el.type === 'number';
-          addEventListener(el, lazy ? 'change' : 'input', e => {
-              if (e.target.composing)
-                  return;
-              let domValue = el.value;
-              if (trim) {
-                  domValue = domValue.trim();
-              }
-              else if (castToNumber) {
-                  domValue = toNumber(domValue);
-              }
-              el._assign(domValue);
-          });
-          if (trim) {
-              addEventListener(el, 'change', () => {
-                  el.value = el.value.trim();
-              });
-          }
-          if (!lazy) {
-              addEventListener(el, 'compositionstart', onCompositionStart);
-              addEventListener(el, 'compositionend', onCompositionEnd);
-              // Safari < 10.2 & UIWebView doesn't fire compositionend when
-              // switching focus before confirming composition choice
-              // this also fixes the issue where some browsers e.g. iOS Chrome
-              // fires "change" instead of "input" on autocomplete.
-              addEventListener(el, 'change', onCompositionEnd);
-          }
-      },
-      // set value on mounted so it's after min/max for type="range"
-      mounted(el, { value }) {
-          el.value = value == null ? '' : value;
-      },
-      beforeUpdate(el, { value, modifiers: { trim, number } }, vnode) {
-          el._assign = getModelAssigner(vnode);
-          // avoid clearing unresolved text. #2302
-          if (el.composing)
-              return;
-          if (document.activeElement === el) {
-              if (trim && el.value.trim() === value) {
-                  return;
-              }
-              if ((number || el.type === 'number') && toNumber(el.value) === value) {
-                  return;
-              }
-          }
-          const newValue = value == null ? '' : value;
-          if (el.value !== newValue) {
-              el.value = newValue;
-          }
-      }
-  };
-  const vModelCheckbox = {
-      created(el, _, vnode) {
-          el._assign = getModelAssigner(vnode);
-          addEventListener(el, 'change', () => {
-              const modelValue = el._modelValue;
-              const elementValue = getValue(el);
-              const checked = el.checked;
-              const assign = el._assign;
-              if (isArray(modelValue)) {
-                  const index = looseIndexOf(modelValue, elementValue);
-                  const found = index !== -1;
-                  if (checked && !found) {
-                      assign(modelValue.concat(elementValue));
-                  }
-                  else if (!checked && found) {
-                      const filtered = [...modelValue];
-                      filtered.splice(index, 1);
-                      assign(filtered);
-                  }
-              }
-              else if (isSet(modelValue)) {
-                  const cloned = new Set(modelValue);
-                  if (checked) {
-                      cloned.add(elementValue);
-                  }
-                  else {
-                      cloned.delete(elementValue);
-                  }
-                  assign(cloned);
-              }
-              else {
-                  assign(getCheckboxValue(el, checked));
-              }
-          });
-      },
-      // set initial checked on mount to wait for true-value/false-value
-      mounted: setChecked,
-      beforeUpdate(el, binding, vnode) {
-          el._assign = getModelAssigner(vnode);
-          setChecked(el, binding, vnode);
-      }
-  };
-  function setChecked(el, { value, oldValue }, vnode) {
-      el._modelValue = value;
-      if (isArray(value)) {
-          el.checked = looseIndexOf(value, vnode.props.value) > -1;
-      }
-      else if (isSet(value)) {
-          el.checked = value.has(vnode.props.value);
-      }
-      else if (value !== oldValue) {
-          el.checked = looseEqual(value, getCheckboxValue(el, true));
-      }
-  }
-  const vModelRadio = {
-      created(el, { value }, vnode) {
-          el.checked = looseEqual(value, vnode.props.value);
-          el._assign = getModelAssigner(vnode);
-          addEventListener(el, 'change', () => {
-              el._assign(getValue(el));
-          });
-      },
-      beforeUpdate(el, { value, oldValue }, vnode) {
-          el._assign = getModelAssigner(vnode);
-          if (value !== oldValue) {
-              el.checked = looseEqual(value, vnode.props.value);
-          }
-      }
-  };
-  const vModelSelect = {
-      created(el, { value, modifiers: { number } }, vnode) {
-          const isSetModel = isSet(value);
-          addEventListener(el, 'change', () => {
-              const selectedVal = Array.prototype.filter
-                  .call(el.options, (o) => o.selected)
-                  .map((o) => number ? toNumber(getValue(o)) : getValue(o));
-              el._assign(el.multiple
-                  ? isSetModel
-                      ? new Set(selectedVal)
-                      : selectedVal
-                  : selectedVal[0]);
-          });
-          el._assign = getModelAssigner(vnode);
-      },
-      // set value in mounted & updated because <select> relies on its children
-      // <option>s.
-      mounted(el, { value }) {
-          setSelected(el, value);
-      },
-      beforeUpdate(el, _binding, vnode) {
-          el._assign = getModelAssigner(vnode);
-      },
-      updated(el, { value }) {
-          setSelected(el, value);
-      }
-  };
-  function setSelected(el, value) {
-      const isMultiple = el.multiple;
-      if (isMultiple && !isArray(value) && !isSet(value)) {
-
-              warn(`<select multiple v-model> expects an Array or Set value for its binding, ` +
-                  `but got ${Object.prototype.toString.call(value).slice(8, -1)}.`);
-          return;
-      }
-      for (let i = 0, l = el.options.length; i < l; i++) {
-          const option = el.options[i];
-          const optionValue = getValue(option);
-          if (isMultiple) {
-              if (isArray(value)) {
-                  option.selected = looseIndexOf(value, optionValue) > -1;
-              }
-              else {
-                  option.selected = value.has(optionValue);
-              }
-          }
-          else {
-              if (looseEqual(getValue(option), value)) {
-                  el.selectedIndex = i;
-                  return;
-              }
-          }
-      }
-      if (!isMultiple) {
-          el.selectedIndex = -1;
-      }
-  }
-  // retrieve raw value set via :value bindings
-  function getValue(el) {
-      return '_value' in el ? el._value : el.value;
-  }
-  // retrieve raw value for true-value and false-value set via :true-value or :false-value bindings
-  function getCheckboxValue(el, checked) {
-      const key = checked ? '_trueValue' : '_falseValue';
-      return key in el ? el[key] : checked;
-  }
-  const vModelDynamic = {
-      created(el, binding, vnode) {
-          callModelHook(el, binding, vnode, null, 'created');
-      },
-      mounted(el, binding, vnode) {
-          callModelHook(el, binding, vnode, null, 'mounted');
-      },
-      beforeUpdate(el, binding, vnode, prevVNode) {
-          callModelHook(el, binding, vnode, prevVNode, 'beforeUpdate');
-      },
-      updated(el, binding, vnode, prevVNode) {
-          callModelHook(el, binding, vnode, prevVNode, 'updated');
-      }
-  };
-  function callModelHook(el, binding, vnode, prevVNode, hook) {
-      let modelToUse;
-      switch (el.tagName) {
-          case 'SELECT':
-              modelToUse = vModelSelect;
-              break;
-          case 'TEXTAREA':
-              modelToUse = vModelText;
-              break;
-          default:
-              switch (vnode.props && vnode.props.type) {
-                  case 'checkbox':
-                      modelToUse = vModelCheckbox;
-                      break;
-                  case 'radio':
-                      modelToUse = vModelRadio;
-                      break;
-                  default:
-                      modelToUse = vModelText;
-              }
-      }
-      const fn = modelToUse[hook];
-      fn && fn(el, binding, vnode, prevVNode);
-  }
-
-  const systemModifiers = ['ctrl', 'shift', 'alt', 'meta'];
-  const modifierGuards = {
-      stop: e => e.stopPropagation(),
-      prevent: e => e.preventDefault(),
-      self: e => e.target !== e.currentTarget,
-      ctrl: e => !e.ctrlKey,
-      shift: e => !e.shiftKey,
-      alt: e => !e.altKey,
-      meta: e => !e.metaKey,
-      left: e => 'button' in e && e.button !== 0,
-      middle: e => 'button' in e && e.button !== 1,
-      right: e => 'button' in e && e.button !== 2,
-      exact: (e, modifiers) => systemModifiers.some(m => e[`${m}Key`] && !modifiers.includes(m))
-  };
-  /**
-   * @private
-   */
-  const withModifiers = (fn, modifiers) => {
-      return (event, ...args) => {
-          for (let i = 0; i < modifiers.length; i++) {
-              const guard = modifierGuards[modifiers[i]];
-              if (guard && guard(event, modifiers))
-                  return;
-          }
-          return fn(event, ...args);
-      };
-  };
-  // Kept for 2.x compat.
-  // Note: IE11 compat for `spacebar` and `del` is removed for now.
-  const keyNames = {
-      esc: 'escape',
-      space: ' ',
-      up: 'arrow-up',
-      left: 'arrow-left',
-      right: 'arrow-right',
-      down: 'arrow-down',
-      delete: 'backspace'
-  };
-  /**
-   * @private
-   */
-  const withKeys = (fn, modifiers) => {
-      return (event) => {
-          if (!('key' in event))
-              return;
-          const eventKey = hyphenate(event.key);
-          if (
-          // None of the provided key modifiers match the current event key
-          !modifiers.some(k => k === eventKey || keyNames[k] === eventKey)) {
-              return;
-          }
-          return fn(event);
-      };
-  };
-
-  const vShow = {
-      beforeMount(el, { value }, { transition }) {
-          el._vod = el.style.display === 'none' ? '' : el.style.display;
-          if (transition && value) {
-              transition.beforeEnter(el);
-          }
-          else {
-              setDisplay(el, value);
-          }
-      },
-      mounted(el, { value }, { transition }) {
-          if (transition && value) {
-              transition.enter(el);
-          }
-      },
-      updated(el, { value, oldValue }, { transition }) {
-          if (transition && value !== oldValue) {
-              if (value) {
-                  transition.beforeEnter(el);
-                  setDisplay(el, true);
-                  transition.enter(el);
-              }
-              else {
-                  transition.leave(el, () => {
-                      setDisplay(el, false);
-                  });
-              }
-          }
-          else {
-              setDisplay(el, value);
-          }
-      },
-      beforeUnmount(el, { value }) {
-          setDisplay(el, value);
-      }
-  };
-  function setDisplay(el, value) {
-      el.style.display = value ? el._vod : 'none';
-  }
-
-  const rendererOptions = extend({ patchProp, forcePatchProp }, nodeOps);
-  // lazy create the renderer - this makes core renderer logic tree-shakable
-  // in case the user only imports reactivity utilities from Vue.
-  let renderer;
-  let enabledHydration = false;
-  function ensureRenderer() {
-      return renderer || (renderer = createRenderer(rendererOptions));
-  }
-  function ensureHydrationRenderer() {
-      renderer = enabledHydration
-          ? renderer
-          : createHydrationRenderer(rendererOptions);
-      enabledHydration = true;
-      return renderer;
-  }
-  // use explicit type casts here to avoid import() calls in rolled-up d.ts
-  const render = ((...args) => {
-      ensureRenderer().render(...args);
-  });
-  const hydrate = ((...args) => {
-      ensureHydrationRenderer().hydrate(...args);
-  });
-  const createApp = ((...args) => {
-      const app = ensureRenderer().createApp(...args);
-      {
-          injectNativeTagCheck(app);
-      }
-      const { mount } = app;
-      app.mount = (containerOrSelector) => {
-          const container = normalizeContainer(containerOrSelector);
-          if (!container)
-              return;
-          const component = app._component;
-          if (!isFunction(component) && !component.render && !component.template) {
-              component.template = container.innerHTML;
-          }
-          // clear content before mounting
-          container.innerHTML = '';
-          const proxy = mount(container);
-          if (container instanceof Element) {
-              container.removeAttribute('v-cloak');
-              container.setAttribute('data-v-app', '');
-          }
-          return proxy;
-      };
-      return app;
-  });
-  const createSSRApp = ((...args) => {
-      const app = ensureHydrationRenderer().createApp(...args);
-      {
-          injectNativeTagCheck(app);
-      }
-      const { mount } = app;
-      app.mount = (containerOrSelector) => {
-          const container = normalizeContainer(containerOrSelector);
-          if (container) {
-              return mount(container, true);
-          }
-      };
-      return app;
-  });
-  function injectNativeTagCheck(app) {
-      // Inject `isNativeTag`
-      // this is used for component name validation (dev only)
-      Object.defineProperty(app.config, 'isNativeTag', {
-          value: (tag) => isHTMLTag(tag) || isSVGTag(tag),
-          writable: false
-      });
-  }
-  function normalizeContainer(container) {
-      if (isString(container)) {
-          const res = document.querySelector(container);
-          if ( !res) {
-              warn(`Failed to mount app: mount target selector "${container}" returned null.`);
-          }
-          return res;
-      }
-      if (
-          container instanceof ShadowRoot &&
-          container.mode === 'closed') {
-          warn(`mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`);
-      }
-      return container;
-  }
-
-  function initDev() {
-      const target = getGlobalThis();
-      target.__VUE__ = true;
-      setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__);
-      {
-          {
-              console.info(`You are running a development build of Vue.\n` +
-                  `Make sure to use the production build (*.prod.js) when deploying for production.`);
-          }
-          initCustomFormatter();
-      }
-  }
-
-  function defaultOnError(error) {
-      throw error;
-  }
-  function createCompilerError(code, loc, messages, additionalMessage) {
-      const msg =  (messages || errorMessages)[code] + (additionalMessage || ``)
-          ;
-      const error = new SyntaxError(String(msg));
-      error.code = code;
-      error.loc = loc;
-      return error;
-  }
-  const errorMessages = {
-      // parse errors
-      [0 /* ABRUPT_CLOSING_OF_EMPTY_COMMENT */]: 'Illegal comment.',
-      [1 /* CDATA_IN_HTML_CONTENT */]: 'CDATA section is allowed only in XML context.',
-      [2 /* DUPLICATE_ATTRIBUTE */]: 'Duplicate attribute.',
-      [3 /* END_TAG_WITH_ATTRIBUTES */]: 'End tag cannot have attributes.',
-      [4 /* END_TAG_WITH_TRAILING_SOLIDUS */]: "Illegal '/' in tags.",
-      [5 /* EOF_BEFORE_TAG_NAME */]: 'Unexpected EOF in tag.',
-      [6 /* EOF_IN_CDATA */]: 'Unexpected EOF in CDATA section.',
-      [7 /* EOF_IN_COMMENT */]: 'Unexpected EOF in comment.',
-      [8 /* EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT */]: 'Unexpected EOF in script.',
-      [9 /* EOF_IN_TAG */]: 'Unexpected EOF in tag.',
-      [10 /* INCORRECTLY_CLOSED_COMMENT */]: 'Incorrectly closed comment.',
-      [11 /* INCORRECTLY_OPENED_COMMENT */]: 'Incorrectly opened comment.',
-      [12 /* INVALID_FIRST_CHARACTER_OF_TAG_NAME */]: "Illegal tag name. Use '&lt;' to print '<'.",
-      [13 /* MISSING_ATTRIBUTE_VALUE */]: 'Attribute value was expected.',
-      [14 /* MISSING_END_TAG_NAME */]: 'End tag name was expected.',
-      [15 /* MISSING_WHITESPACE_BETWEEN_ATTRIBUTES */]: 'Whitespace was expected.',
-      [16 /* NESTED_COMMENT */]: "Unexpected '<!--' in comment.",
-      [17 /* UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME */]: 'Attribute name cannot contain U+0022 ("), U+0027 (\'), and U+003C (<).',
-      [18 /* UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE */]: 'Unquoted attribute value cannot contain U+0022 ("), U+0027 (\'), U+003C (<), U+003D (=), and U+0060 (`).',
-      [19 /* UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME */]: "Attribute name cannot start with '='.",
-      [21 /* UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME */]: "'<?' is allowed only in XML context.",
-      [22 /* UNEXPECTED_SOLIDUS_IN_TAG */]: "Illegal '/' in tags.",
-      // Vue-specific parse errors
-      [23 /* X_INVALID_END_TAG */]: 'Invalid end tag.',
-      [24 /* X_MISSING_END_TAG */]: 'Element is missing end tag.',
-      [25 /* X_MISSING_INTERPOLATION_END */]: 'Interpolation end sign was not found.',
-      [26 /* X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END */]: 'End bracket for dynamic directive argument was not found. ' +
-          'Note that dynamic directive argument cannot contain spaces.',
-      // transform errors
-      [27 /* X_V_IF_NO_EXPRESSION */]: `v-if/v-else-if is missing expression.`,
-      [28 /* X_V_IF_SAME_KEY */]: `v-if/else branches must use unique keys.`,
-      [29 /* X_V_ELSE_NO_ADJACENT_IF */]: `v-else/v-else-if has no adjacent v-if.`,
-      [30 /* X_V_FOR_NO_EXPRESSION */]: `v-for is missing expression.`,
-      [31 /* X_V_FOR_MALFORMED_EXPRESSION */]: `v-for has invalid expression.`,
-      [32 /* X_V_FOR_TEMPLATE_KEY_PLACEMENT */]: `<template v-for> key should be placed on the <template> tag.`,
-      [33 /* X_V_BIND_NO_EXPRESSION */]: `v-bind is missing expression.`,
-      [34 /* X_V_ON_NO_EXPRESSION */]: `v-on is missing expression.`,
-      [35 /* X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET */]: `Unexpected custom directive on <slot> outlet.`,
-      [36 /* X_V_SLOT_MIXED_SLOT_USAGE */]: `Mixed v-slot usage on both the component and nested <template>.` +
-          `When there are multiple named slots, all slots should use <template> ` +
-          `syntax to avoid scope ambiguity.`,
-      [37 /* X_V_SLOT_DUPLICATE_SLOT_NAMES */]: `Duplicate slot names found. `,
-      [38 /* X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN */]: `Extraneous children found when component already has explicitly named ` +
-          `default slot. These children will be ignored.`,
-      [39 /* X_V_SLOT_MISPLACED */]: `v-slot can only be used on components or <template> tags.`,
-      [40 /* X_V_MODEL_NO_EXPRESSION */]: `v-model is missing expression.`,
-      [41 /* X_V_MODEL_MALFORMED_EXPRESSION */]: `v-model value must be a valid JavaScript member expression.`,
-      [42 /* X_V_MODEL_ON_SCOPE_VARIABLE */]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,
-      [43 /* X_INVALID_EXPRESSION */]: `Error parsing JavaScript expression: `,
-      [44 /* X_KEEP_ALIVE_INVALID_CHILDREN */]: `<KeepAlive> expects exactly one child component.`,
-      // generic errors
-      [45 /* X_PREFIX_ID_NOT_SUPPORTED */]: `"prefixIdentifiers" option is not supported in this build of compiler.`,
-      [46 /* X_MODULE_MODE_NOT_SUPPORTED */]: `ES module mode is not supported in this build of compiler.`,
-      [47 /* X_CACHE_HANDLER_NOT_SUPPORTED */]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,
-      [48 /* X_SCOPE_ID_NOT_SUPPORTED */]: `"scopeId" option is only supported in module mode.`
-  };
-
-  const FRAGMENT = Symbol( `Fragment` );
-  const TELEPORT = Symbol( `Teleport` );
-  const SUSPENSE = Symbol( `Suspense` );
-  const KEEP_ALIVE = Symbol( `KeepAlive` );
-  const BASE_TRANSITION = Symbol( `BaseTransition` );
-  const OPEN_BLOCK = Symbol( `openBlock` );
-  const CREATE_BLOCK = Symbol( `createBlock` );
-  const CREATE_VNODE = Symbol( `createVNode` );
-  const CREATE_COMMENT = Symbol( `createCommentVNode` );
-  const CREATE_TEXT = Symbol( `createTextVNode` );
-  const CREATE_STATIC = Symbol( `createStaticVNode` );
-  const RESOLVE_COMPONENT = Symbol( `resolveComponent` );
-  const RESOLVE_DYNAMIC_COMPONENT = Symbol( `resolveDynamicComponent` );
-  const RESOLVE_DIRECTIVE = Symbol( `resolveDirective` );
-  const WITH_DIRECTIVES = Symbol( `withDirectives` );
-  const RENDER_LIST = Symbol( `renderList` );
-  const RENDER_SLOT = Symbol( `renderSlot` );
-  const CREATE_SLOTS = Symbol( `createSlots` );
-  const TO_DISPLAY_STRING = Symbol( `toDisplayString` );
-  const MERGE_PROPS = Symbol( `mergeProps` );
-  const TO_HANDLERS = Symbol( `toHandlers` );
-  const CAMELIZE = Symbol( `camelize` );
-  const CAPITALIZE = Symbol( `capitalize` );
-  const TO_HANDLER_KEY = Symbol( `toHandlerKey` );
-  const SET_BLOCK_TRACKING = Symbol( `setBlockTracking` );
-  const PUSH_SCOPE_ID = Symbol( `pushScopeId` );
-  const POP_SCOPE_ID = Symbol( `popScopeId` );
-  const WITH_SCOPE_ID = Symbol( `withScopeId` );
-  const WITH_CTX = Symbol( `withCtx` );
-  const UNREF = Symbol( `unref` );
-  const IS_REF = Symbol( `isRef` );
-  // Name mapping for runtime helpers that need to be imported from 'vue' in
-  // generated code. Make sure these are correctly exported in the runtime!
-  // Using `any` here because TS doesn't allow symbols as index type.
-  const helperNameMap = {
-      [FRAGMENT]: `Fragment`,
-      [TELEPORT]: `Teleport`,
-      [SUSPENSE]: `Suspense`,
-      [KEEP_ALIVE]: `KeepAlive`,
-      [BASE_TRANSITION]: `BaseTransition`,
-      [OPEN_BLOCK]: `openBlock`,
-      [CREATE_BLOCK]: `createBlock`,
-      [CREATE_VNODE]: `createVNode`,
-      [CREATE_COMMENT]: `createCommentVNode`,
-      [CREATE_TEXT]: `createTextVNode`,
-      [CREATE_STATIC]: `createStaticVNode`,
-      [RESOLVE_COMPONENT]: `resolveComponent`,
-      [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,
-      [RESOLVE_DIRECTIVE]: `resolveDirective`,
-      [WITH_DIRECTIVES]: `withDirectives`,
-      [RENDER_LIST]: `renderList`,
-      [RENDER_SLOT]: `renderSlot`,
-      [CREATE_SLOTS]: `createSlots`,
-      [TO_DISPLAY_STRING]: `toDisplayString`,
-      [MERGE_PROPS]: `mergeProps`,
-      [TO_HANDLERS]: `toHandlers`,
-      [CAMELIZE]: `camelize`,
-      [CAPITALIZE]: `capitalize`,
-      [TO_HANDLER_KEY]: `toHandlerKey`,
-      [SET_BLOCK_TRACKING]: `setBlockTracking`,
-      [PUSH_SCOPE_ID]: `pushScopeId`,
-      [POP_SCOPE_ID]: `popScopeId`,
-      [WITH_SCOPE_ID]: `withScopeId`,
-      [WITH_CTX]: `withCtx`,
-      [UNREF]: `unref`,
-      [IS_REF]: `isRef`
-  };
-  function registerRuntimeHelpers(helpers) {
-      Object.getOwnPropertySymbols(helpers).forEach(s => {
-          helperNameMap[s] = helpers[s];
-      });
-  }
-
-  // AST Utilities ---------------------------------------------------------------
-  // Some expressions, e.g. sequence and conditional expressions, are never
-  // associated with template nodes, so their source locations are just a stub.
-  // Container types like CompoundExpression also don't need a real location.
-  const locStub = {
-      source: '',
-      start: { line: 1, column: 1, offset: 0 },
-      end: { line: 1, column: 1, offset: 0 }
-  };
-  function createRoot(children, loc = locStub) {
-      return {
-          type: 0 /* ROOT */,
-          children,
-          helpers: [],
-          components: [],
-          directives: [],
-          hoists: [],
-          imports: [],
-          cached: 0,
-          temps: 0,
-          codegenNode: undefined,
-          loc
-      };
-  }
-  function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, loc = locStub) {
-      if (context) {
-          if (isBlock) {
-              context.helper(OPEN_BLOCK);
-              context.helper(CREATE_BLOCK);
-          }
-          else {
-              context.helper(CREATE_VNODE);
-          }
-          if (directives) {
-              context.helper(WITH_DIRECTIVES);
-          }
-      }
-      return {
-          type: 13 /* VNODE_CALL */,
-          tag,
-          props,
-          children,
-          patchFlag,
-          dynamicProps,
-          directives,
-          isBlock,
-          disableTracking,
-          loc
-      };
-  }
-  function createArrayExpression(elements, loc = locStub) {
-      return {
-          type: 17 /* JS_ARRAY_EXPRESSION */,
-          loc,
-          elements
-      };
-  }
-  function createObjectExpression(properties, loc = locStub) {
-      return {
-          type: 15 /* JS_OBJECT_EXPRESSION */,
-          loc,
-          properties
-      };
-  }
-  function createObjectProperty(key, value) {
-      return {
-          type: 16 /* JS_PROPERTY */,
-          loc: locStub,
-          key: isString(key) ? createSimpleExpression(key, true) : key,
-          value
-      };
-  }
-  function createSimpleExpression(content, isStatic, loc = locStub, constType = 0 /* NOT_CONSTANT */) {
-      return {
-          type: 4 /* SIMPLE_EXPRESSION */,
-          loc,
-          content,
-          isStatic,
-          constType: isStatic ? 3 /* CAN_STRINGIFY */ : constType
-      };
-  }
-  function createCompoundExpression(children, loc = locStub) {
-      return {
-          type: 8 /* COMPOUND_EXPRESSION */,
-          loc,
-          children
-      };
-  }
-  function createCallExpression(callee, args = [], loc = locStub) {
-      return {
-          type: 14 /* JS_CALL_EXPRESSION */,
-          loc,
-          callee,
-          arguments: args
-      };
-  }
-  function createFunctionExpression(params, returns = undefined, newline = false, isSlot = false, loc = locStub) {
-      return {
-          type: 18 /* JS_FUNCTION_EXPRESSION */,
-          params,
-          returns,
-          newline,
-          isSlot,
-          loc
-      };
-  }
-  function createConditionalExpression(test, consequent, alternate, newline = true) {
-      return {
-          type: 19 /* JS_CONDITIONAL_EXPRESSION */,
-          test,
-          consequent,
-          alternate,
-          newline,
-          loc: locStub
-      };
-  }
-  function createCacheExpression(index, value, isVNode = false) {
-      return {
-          type: 20 /* JS_CACHE_EXPRESSION */,
-          index,
-          value,
-          isVNode,
-          loc: locStub
-      };
-  }
-
-  const isStaticExp = (p) => p.type === 4 /* SIMPLE_EXPRESSION */ && p.isStatic;
-  const isBuiltInType = (tag, expected) => tag === expected || tag === hyphenate(expected);
-  function isCoreComponent(tag) {
-      if (isBuiltInType(tag, 'Teleport')) {
-          return TELEPORT;
-      }
-      else if (isBuiltInType(tag, 'Suspense')) {
-          return SUSPENSE;
-      }
-      else if (isBuiltInType(tag, 'KeepAlive')) {
-          return KEEP_ALIVE;
-      }
-      else if (isBuiltInType(tag, 'BaseTransition')) {
-          return BASE_TRANSITION;
-      }
-  }
-  const nonIdentifierRE = /^\d|[^\$\w]/;
-  const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
-  const memberExpRE = /^[A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*|\[[^\]]+\])*$/;
-  const isMemberExpression = (path) => {
-      if (!path)
-          return false;
-      return memberExpRE.test(path.trim());
-  };
-  function getInnerRange(loc, offset, length) {
-      const source = loc.source.substr(offset, length);
-      const newLoc = {
-          source,
-          start: advancePositionWithClone(loc.start, loc.source, offset),
-          end: loc.end
-      };
-      if (length != null) {
-          newLoc.end = advancePositionWithClone(loc.start, loc.source, offset + length);
-      }
-      return newLoc;
-  }
-  function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
-      return advancePositionWithMutation(extend({}, pos), source, numberOfCharacters);
-  }
-  // advance by mutation without cloning (for performance reasons), since this
-  // gets called a lot in the parser
-  function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
-      let linesCount = 0;
-      let lastNewLinePos = -1;
-      for (let i = 0; i < numberOfCharacters; i++) {
-          if (source.charCodeAt(i) === 10 /* newline char code */) {
-              linesCount++;
-              lastNewLinePos = i;
-          }
-      }
-      pos.offset += numberOfCharacters;
-      pos.line += linesCount;
-      pos.column =
-          lastNewLinePos === -1
-              ? pos.column + numberOfCharacters
-              : numberOfCharacters - lastNewLinePos;
-      return pos;
-  }
-  function assert(condition, msg) {
-      /* istanbul ignore if */
-      if (!condition) {
-          throw new Error(msg || `unexpected compiler condition`);
-      }
-  }
-  function findDir(node, name, allowEmpty = false) {
-      for (let i = 0; i < node.props.length; i++) {
-          const p = node.props[i];
-          if (p.type === 7 /* DIRECTIVE */ &&
-              (allowEmpty || p.exp) &&
-              (isString(name) ? p.name === name : name.test(p.name))) {
-              return p;
-          }
-      }
-  }
-  function findProp(node, name, dynamicOnly = false, allowEmpty = false) {
-      for (let i = 0; i < node.props.length; i++) {
-          const p = node.props[i];
-          if (p.type === 6 /* ATTRIBUTE */) {
-              if (dynamicOnly)
-                  continue;
-              if (p.name === name && (p.value || allowEmpty)) {
-                  return p;
-              }
-          }
-          else if (p.name === 'bind' &&
-              (p.exp || allowEmpty) &&
-              isBindKey(p.arg, name)) {
-              return p;
-          }
-      }
-  }
-  function isBindKey(arg, name) {
-      return !!(arg && isStaticExp(arg) && arg.content === name);
-  }
-  function hasDynamicKeyVBind(node) {
-      return node.props.some(p => p.type === 7 /* DIRECTIVE */ &&
-          p.name === 'bind' &&
-          (!p.arg || // v-bind="obj"
-              p.arg.type !== 4 /* SIMPLE_EXPRESSION */ || // v-bind:[_ctx.foo]
-              !p.arg.isStatic) // v-bind:[foo]
-      );
-  }
-  function isText(node) {
-      return node.type === 5 /* INTERPOLATION */ || node.type === 2 /* TEXT */;
-  }
-  function isVSlot(p) {
-      return p.type === 7 /* DIRECTIVE */ && p.name === 'slot';
-  }
-  function isTemplateNode(node) {
-      return (node.type === 1 /* ELEMENT */ && node.tagType === 3 /* TEMPLATE */);
-  }
-  function isSlotOutlet(node) {
-      return node.type === 1 /* ELEMENT */ && node.tagType === 2 /* SLOT */;
-  }
-  function injectProp(node, prop, context) {
-      let propsWithInjection;
-      const props = node.type === 13 /* VNODE_CALL */ ? node.props : node.arguments[2];
-      if (props == null || isString(props)) {
-          propsWithInjection = createObjectExpression([prop]);
-      }
-      else if (props.type === 14 /* JS_CALL_EXPRESSION */) {
-          // merged props... add ours
-          // only inject key to object literal if it's the first argument so that
-          // if doesn't override user provided keys
-          const first = props.arguments[0];
-          if (!isString(first) && first.type === 15 /* JS_OBJECT_EXPRESSION */) {
-              first.properties.unshift(prop);
-          }
-          else {
-              if (props.callee === TO_HANDLERS) {
-                  // #2366
-                  propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
-                      createObjectExpression([prop]),
-                      props
-                  ]);
-              }
-              else {
-                  props.arguments.unshift(createObjectExpression([prop]));
-              }
-          }
-          !propsWithInjection && (propsWithInjection = props);
-      }
-      else if (props.type === 15 /* JS_OBJECT_EXPRESSION */) {
-          let alreadyExists = false;
-          // check existing key to avoid overriding user provided keys
-          if (prop.key.type === 4 /* SIMPLE_EXPRESSION */) {
-              const propKeyName = prop.key.content;
-              alreadyExists = props.properties.some(p => p.key.type === 4 /* SIMPLE_EXPRESSION */ &&
-                  p.key.content === propKeyName);
-          }
-          if (!alreadyExists) {
-              props.properties.unshift(prop);
-          }
-          propsWithInjection = props;
-      }
-      else {
-          // single v-bind with expression, return a merged replacement
-          propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
-              createObjectExpression([prop]),
-              props
-          ]);
-      }
-      if (node.type === 13 /* VNODE_CALL */) {
-          node.props = propsWithInjection;
-      }
-      else {
-          node.arguments[2] = propsWithInjection;
-      }
-  }
-  function toValidAssetId(name, type) {
-      return `_${type}_${name.replace(/[^\w]/g, '_')}`;
-  }
-
-  // The default decoder only provides escapes for characters reserved as part of
-  // the template syntax, and is only used if the custom renderer did not provide
-  // a platform-specific decoder.
-  const decodeRE = /&(gt|lt|amp|apos|quot);/g;
-  const decodeMap = {
-      gt: '>',
-      lt: '<',
-      amp: '&',
-      apos: "'",
-      quot: '"'
-  };
-  const defaultParserOptions = {
-      delimiters: [`{{`, `}}`],
-      getNamespace: () => 0 /* HTML */,
-      getTextMode: () => 0 /* DATA */,
-      isVoidTag: NO,
-      isPreTag: NO,
-      isCustomElement: NO,
-      decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
-      onError: defaultOnError,
-      comments: false
-  };
-  function baseParse(content, options = {}) {
-      const context = createParserContext(content, options);
-      const start = getCursor(context);
-      return createRoot(parseChildren(context, 0 /* DATA */, []), getSelection(context, start));
-  }
-  function createParserContext(content, rawOptions) {
-      const options = extend({}, defaultParserOptions);
-      for (const key in rawOptions) {
-          // @ts-ignore
-          options[key] = rawOptions[key] || defaultParserOptions[key];
-      }
-      return {
-          options,
-          column: 1,
-          line: 1,
-          offset: 0,
-          originalSource: content,
-          source: content,
-          inPre: false,
-          inVPre: false
-      };
-  }
-  function parseChildren(context, mode, ancestors) {
-      const parent = last(ancestors);
-      const ns = parent ? parent.ns : 0 /* HTML */;
-      const nodes = [];
-      while (!isEnd(context, mode, ancestors)) {
-          const s = context.source;
-          let node = undefined;
-          if (mode === 0 /* DATA */ || mode === 1 /* RCDATA */) {
-              if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {
-                  // '{{'
-                  node = parseInterpolation(context, mode);
-              }
-              else if (mode === 0 /* DATA */ && s[0] === '<') {
-                  // https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
-                  if (s.length === 1) {
-                      emitError(context, 5 /* EOF_BEFORE_TAG_NAME */, 1);
-                  }
-                  else if (s[1] === '!') {
-                      // https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
-                      if (startsWith(s, '<!--')) {
-                          node = parseComment(context);
-                      }
-                      else if (startsWith(s, '<!DOCTYPE')) {
-                          // Ignore DOCTYPE by a limitation.
-                          node = parseBogusComment(context);
-                      }
-                      else if (startsWith(s, '<![CDATA[')) {
-                          if (ns !== 0 /* HTML */) {
-                              node = parseCDATA(context, ancestors);
-                          }
-                          else {
-                              emitError(context, 1 /* CDATA_IN_HTML_CONTENT */);
-                              node = parseBogusComment(context);
-                          }
-                      }
-                      else {
-                          emitError(context, 11 /* INCORRECTLY_OPENED_COMMENT */);
-                          node = parseBogusComment(context);
-                      }
-                  }
-                  else if (s[1] === '/') {
-                      // https://html.spec.whatwg.org/multipage/parsing.html#end-tag-open-state
-                      if (s.length === 2) {
-                          emitError(context, 5 /* EOF_BEFORE_TAG_NAME */, 2);
-                      }
-                      else if (s[2] === '>') {
-                          emitError(context, 14 /* MISSING_END_TAG_NAME */, 2);
-                          advanceBy(context, 3);
-                          continue;
-                      }
-                      else if (/[a-z]/i.test(s[2])) {
-                          emitError(context, 23 /* X_INVALID_END_TAG */);
-                          parseTag(context, 1 /* End */, parent);
-                          continue;
-                      }
-                      else {
-                          emitError(context, 12 /* INVALID_FIRST_CHARACTER_OF_TAG_NAME */, 2);
-                          node = parseBogusComment(context);
-                      }
-                  }
-                  else if (/[a-z]/i.test(s[1])) {
-                      node = parseElement(context, ancestors);
-                  }
-                  else if (s[1] === '?') {
-                      emitError(context, 21 /* UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME */, 1);
-                      node = parseBogusComment(context);
-                  }
-                  else {
-                      emitError(context, 12 /* INVALID_FIRST_CHARACTER_OF_TAG_NAME */, 1);
-                  }
-              }
-          }
-          if (!node) {
-              node = parseText(context, mode);
-          }
-          if (isArray(node)) {
-              for (let i = 0; i < node.length; i++) {
-                  pushNode(nodes, node[i]);
-              }
-          }
-          else {
-              pushNode(nodes, node);
-          }
-      }
-      // Whitespace management for more efficient output
-      // (same as v2 whitespace: 'condense')
-      let removedWhitespace = false;
-      if (mode !== 2 /* RAWTEXT */) {
-          for (let i = 0; i < nodes.length; i++) {
-              const node = nodes[i];
-              if (!context.inPre && node.type === 2 /* TEXT */) {
-                  if (!/[^\t\r\n\f ]/.test(node.content)) {
-                      const prev = nodes[i - 1];
-                      const next = nodes[i + 1];
-                      // If:
-                      // - the whitespace is the first or last node, or:
-                      // - the whitespace is adjacent to a comment, or:
-                      // - the whitespace is between two elements AND contains newline
-                      // Then the whitespace is ignored.
-                      if (!prev ||
-                          !next ||
-                          prev.type === 3 /* COMMENT */ ||
-                          next.type === 3 /* COMMENT */ ||
-                          (prev.type === 1 /* ELEMENT */ &&
-                              next.type === 1 /* ELEMENT */ &&
-                              /[\r\n]/.test(node.content))) {
-                          removedWhitespace = true;
-                          nodes[i] = null;
-                      }
-                      else {
-                          // Otherwise, condensed consecutive whitespace inside the text
-                          // down to a single space
-                          node.content = ' ';
-                      }
-                  }
-                  else {
-                      node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ');
-                  }
-              }
-          }
-          if (context.inPre && parent && context.options.isPreTag(parent.tag)) {
-              // remove leading newline per html spec
-              // https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element
-              const first = nodes[0];
-              if (first && first.type === 2 /* TEXT */) {
-                  first.content = first.content.replace(/^\r?\n/, '');
-              }
-          }
-      }
-      return removedWhitespace ? nodes.filter(Boolean) : nodes;
-  }
-  function pushNode(nodes, node) {
-      if (node.type === 2 /* TEXT */) {
-          const prev = last(nodes);
-          // Merge if both this and the previous node are text and those are
-          // consecutive. This happens for cases like "a < b".
-          if (prev &&
-              prev.type === 2 /* TEXT */ &&
-              prev.loc.end.offset === node.loc.start.offset) {
-              prev.content += node.content;
-              prev.loc.end = node.loc.end;
-              prev.loc.source += node.loc.source;
-              return;
-          }
-      }
-      nodes.push(node);
-  }
-  function parseCDATA(context, ancestors) {
-      advanceBy(context, 9);
-      const nodes = parseChildren(context, 3 /* CDATA */, ancestors);
-      if (context.source.length === 0) {
-          emitError(context, 6 /* EOF_IN_CDATA */);
-      }
-      else {
-          advanceBy(context, 3);
-      }
-      return nodes;
-  }
-  function parseComment(context) {
-      const start = getCursor(context);
-      let content;
-      // Regular comment.
-      const match = /--(\!)?>/.exec(context.source);
-      if (!match) {
-          content = context.source.slice(4);
-          advanceBy(context, context.source.length);
-          emitError(context, 7 /* EOF_IN_COMMENT */);
-      }
-      else {
-          if (match.index <= 3) {
-              emitError(context, 0 /* ABRUPT_CLOSING_OF_EMPTY_COMMENT */);
-          }
-          if (match[1]) {
-              emitError(context, 10 /* INCORRECTLY_CLOSED_COMMENT */);
-          }
-          content = context.source.slice(4, match.index);
-          // Advancing with reporting nested comments.
-          const s = context.source.slice(0, match.index);
-          let prevIndex = 1, nestedIndex = 0;
-          while ((nestedIndex = s.indexOf('<!--', prevIndex)) !== -1) {
-              advanceBy(context, nestedIndex - prevIndex + 1);
-              if (nestedIndex + 4 < s.length) {
-                  emitError(context, 16 /* NESTED_COMMENT */);
-              }
-              prevIndex = nestedIndex + 1;
-          }
-          advanceBy(context, match.index + match[0].length - prevIndex + 1);
-      }
-      return {
-          type: 3 /* COMMENT */,
-          content,
-          loc: getSelection(context, start)
-      };
-  }
-  function parseBogusComment(context) {
-      const start = getCursor(context);
-      const contentStart = context.source[1] === '?' ? 1 : 2;
-      let content;
-      const closeIndex = context.source.indexOf('>');
-      if (closeIndex === -1) {
-          content = context.source.slice(contentStart);
-          advanceBy(context, context.source.length);
-      }
-      else {
-          content = context.source.slice(contentStart, closeIndex);
-          advanceBy(context, closeIndex + 1);
-      }
-      return {
-          type: 3 /* COMMENT */,
-          content,
-          loc: getSelection(context, start)
-      };
-  }
-  function parseElement(context, ancestors) {
-      // Start tag.
-      const wasInPre = context.inPre;
-      const wasInVPre = context.inVPre;
-      const parent = last(ancestors);
-      const element = parseTag(context, 0 /* Start */, parent);
-      const isPreBoundary = context.inPre && !wasInPre;
-      const isVPreBoundary = context.inVPre && !wasInVPre;
-      if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {
-          return element;
-      }
-      // Children.
-      ancestors.push(element);
-      const mode = context.options.getTextMode(element, parent);
-      const children = parseChildren(context, mode, ancestors);
-      ancestors.pop();
-      element.children = children;
-      // End tag.
-      if (startsWithEndTagOpen(context.source, element.tag)) {
-          parseTag(context, 1 /* End */, parent);
-      }
-      else {
-          emitError(context, 24 /* X_MISSING_END_TAG */, 0, element.loc.start);
-          if (context.source.length === 0 && element.tag.toLowerCase() === 'script') {
-              const first = children[0];
-              if (first && startsWith(first.loc.source, '<!--')) {
-                  emitError(context, 8 /* EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT */);
-              }
-          }
-      }
-      element.loc = getSelection(context, element.loc.start);
-      if (isPreBoundary) {
-          context.inPre = false;
-      }
-      if (isVPreBoundary) {
-          context.inVPre = false;
-      }
-      return element;
-  }
-  const isSpecialTemplateDirective = /*#__PURE__*/ makeMap(`if,else,else-if,for,slot`);
-  /**
-   * Parse a tag (E.g. `<div id=a>`) with that type (start tag or end tag).
-   */
-  function parseTag(context, type, parent) {
-      // Tag open.
-      const start = getCursor(context);
-      const match = /^<\/?([a-z][^\t\r\n\f />]*)/i.exec(context.source);
-      const tag = match[1];
-      const ns = context.options.getNamespace(tag, parent);
-      advanceBy(context, match[0].length);
-      advanceSpaces(context);
-      // save current state in case we need to re-parse attributes with v-pre
-      const cursor = getCursor(context);
-      const currentSource = context.source;
-      // Attributes.
-      let props = parseAttributes(context, type);
-      // check <pre> tag
-      if (context.options.isPreTag(tag)) {
-          context.inPre = true;
-      }
-      // check v-pre
-      if (!context.inVPre &&
-          props.some(p => p.type === 7 /* DIRECTIVE */ && p.name === 'pre')) {
-          context.inVPre = true;
-          // reset context
-          extend(context, cursor);
-          context.source = currentSource;
-          // re-parse attrs and filter out v-pre itself
-          props = parseAttributes(context, type).filter(p => p.name !== 'v-pre');
-      }
-      // Tag close.
-      let isSelfClosing = false;
-      if (context.source.length === 0) {
-          emitError(context, 9 /* EOF_IN_TAG */);
-      }
-      else {
-          isSelfClosing = startsWith(context.source, '/>');
-          if (type === 1 /* End */ && isSelfClosing) {
-              emitError(context, 4 /* END_TAG_WITH_TRAILING_SOLIDUS */);
-          }
-          advanceBy(context, isSelfClosing ? 2 : 1);
-      }
-      let tagType = 0 /* ELEMENT */;
-      const options = context.options;
-      if (!context.inVPre && !options.isCustomElement(tag)) {
-          const hasVIs = props.some(p => p.type === 7 /* DIRECTIVE */ && p.name === 'is');
-          if (options.isNativeTag && !hasVIs) {
-              if (!options.isNativeTag(tag))
-                  tagType = 1 /* COMPONENT */;
-          }
-          else if (hasVIs ||
-              isCoreComponent(tag) ||
-              (options.isBuiltInComponent && options.isBuiltInComponent(tag)) ||
-              /^[A-Z]/.test(tag) ||
-              tag === 'component') {
-              tagType = 1 /* COMPONENT */;
-          }
-          if (tag === 'slot') {
-              tagType = 2 /* SLOT */;
-          }
-          else if (tag === 'template' &&
-              props.some(p => {
-                  return (p.type === 7 /* DIRECTIVE */ && isSpecialTemplateDirective(p.name));
-              })) {
-              tagType = 3 /* TEMPLATE */;
-          }
-      }
-      return {
-          type: 1 /* ELEMENT */,
-          ns,
-          tag,
-          tagType,
-          props,
-          isSelfClosing,
-          children: [],
-          loc: getSelection(context, start),
-          codegenNode: undefined // to be created during transform phase
-      };
-  }
-  function parseAttributes(context, type) {
-      const props = [];
-      const attributeNames = new Set();
-      while (context.source.length > 0 &&
-          !startsWith(context.source, '>') &&
-          !startsWith(context.source, '/>')) {
-          if (startsWith(context.source, '/')) {
-              emitError(context, 22 /* UNEXPECTED_SOLIDUS_IN_TAG */);
-              advanceBy(context, 1);
-              advanceSpaces(context);
-              continue;
-          }
-          if (type === 1 /* End */) {
-              emitError(context, 3 /* END_TAG_WITH_ATTRIBUTES */);
-          }
-          const attr = parseAttribute(context, attributeNames);
-          if (type === 0 /* Start */) {
-              props.push(attr);
-          }
-          if (/^[^\t\r\n\f />]/.test(context.source)) {
-              emitError(context, 15 /* MISSING_WHITESPACE_BETWEEN_ATTRIBUTES */);
-          }
-          advanceSpaces(context);
-      }
-      return props;
-  }
-  function parseAttribute(context, nameSet) {
-      // Name.
-      const start = getCursor(context);
-      const match = /^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(context.source);
-      const name = match[0];
-      if (nameSet.has(name)) {
-          emitError(context, 2 /* DUPLICATE_ATTRIBUTE */);
-      }
-      nameSet.add(name);
-      if (name[0] === '=') {
-          emitError(context, 19 /* UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME */);
-      }
-      {
-          const pattern = /["'<]/g;
-          let m;
-          while ((m = pattern.exec(name))) {
-              emitError(context, 17 /* UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME */, m.index);
-          }
-      }
-      advanceBy(context, name.length);
-      // Value
-      let value = undefined;
-      if (/^[\t\r\n\f ]*=/.test(context.source)) {
-          advanceSpaces(context);
-          advanceBy(context, 1);
-          advanceSpaces(context);
-          value = parseAttributeValue(context);
-          if (!value) {
-              emitError(context, 13 /* MISSING_ATTRIBUTE_VALUE */);
-          }
-      }
-      const loc = getSelection(context, start);
-      if (!context.inVPre && /^(v-|:|@|#)/.test(name)) {
-          const match = /(?:^v-([a-z0-9-]+))?(?:(?::|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(name);
-          const dirName = match[1] ||
-              (startsWith(name, ':') ? 'bind' : startsWith(name, '@') ? 'on' : 'slot');
-          let arg;
-          if (match[2]) {
-              const isSlot = dirName === 'slot';
-              const startOffset = name.indexOf(match[2]);
-              const loc = getSelection(context, getNewPosition(context, start, startOffset), getNewPosition(context, start, startOffset + match[2].length + ((isSlot && match[3]) || '').length));
-              let content = match[2];
-              let isStatic = true;
-              if (content.startsWith('[')) {
-                  isStatic = false;
-                  if (!content.endsWith(']')) {
-                      emitError(context, 26 /* X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END */);
-                  }
-                  content = content.substr(1, content.length - 2);
-              }
-              else if (isSlot) {
-                  // #1241 special case for v-slot: vuetify relies extensively on slot
-                  // names containing dots. v-slot doesn't have any modifiers and Vue 2.x
-                  // supports such usage so we are keeping it consistent with 2.x.
-                  content += match[3] || '';
-              }
-              arg = {
-                  type: 4 /* SIMPLE_EXPRESSION */,
-                  content,
-                  isStatic,
-                  constType: isStatic
-                      ? 3 /* CAN_STRINGIFY */
-                      : 0 /* NOT_CONSTANT */,
-                  loc
-              };
-          }
-          if (value && value.isQuoted) {
-              const valueLoc = value.loc;
-              valueLoc.start.offset++;
-              valueLoc.start.column++;
-              valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);
-              valueLoc.source = valueLoc.source.slice(1, -1);
-          }
-          return {
-              type: 7 /* DIRECTIVE */,
-              name: dirName,
-              exp: value && {
-                  type: 4 /* SIMPLE_EXPRESSION */,
-                  content: value.content,
-                  isStatic: false,
-                  // Treat as non-constant by default. This can be potentially set to
-                  // other values by `transformExpression` to make it eligible for hoisting.
-                  constType: 0 /* NOT_CONSTANT */,
-                  loc: value.loc
-              },
-              arg,
-              modifiers: match[3] ? match[3].substr(1).split('.') : [],
-              loc
-          };
-      }
-      return {
-          type: 6 /* ATTRIBUTE */,
-          name,
-          value: value && {
-              type: 2 /* TEXT */,
-              content: value.content,
-              loc: value.loc
-          },
-          loc
-      };
-  }
-  function parseAttributeValue(context) {
-      const start = getCursor(context);
-      let content;
-      const quote = context.source[0];
-      const isQuoted = quote === `"` || quote === `'`;
-      if (isQuoted) {
-          // Quoted value.
-          advanceBy(context, 1);
-          const endIndex = context.source.indexOf(quote);
-          if (endIndex === -1) {
-              content = parseTextData(context, context.source.length, 4 /* ATTRIBUTE_VALUE */);
-          }
-          else {
-              content = parseTextData(context, endIndex, 4 /* ATTRIBUTE_VALUE */);
-              advanceBy(context, 1);
-          }
-      }
-      else {
-          // Unquoted
-          const match = /^[^\t\r\n\f >]+/.exec(context.source);
-          if (!match) {
-              return undefined;
-          }
-          const unexpectedChars = /["'<=`]/g;
-          let m;
-          while ((m = unexpectedChars.exec(match[0]))) {
-              emitError(context, 18 /* UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE */, m.index);
-          }
-          content = parseTextData(context, match[0].length, 4 /* ATTRIBUTE_VALUE */);
-      }
-      return { content, isQuoted, loc: getSelection(context, start) };
-  }
-  function parseInterpolation(context, mode) {
-      const [open, close] = context.options.delimiters;
-      const closeIndex = context.source.indexOf(close, open.length);
-      if (closeIndex === -1) {
-          emitError(context, 25 /* X_MISSING_INTERPOLATION_END */);
-          return undefined;
-      }
-      const start = getCursor(context);
-      advanceBy(context, open.length);
-      const innerStart = getCursor(context);
-      const innerEnd = getCursor(context);
-      const rawContentLength = closeIndex - open.length;
-      const rawContent = context.source.slice(0, rawContentLength);
-      const preTrimContent = parseTextData(context, rawContentLength, mode);
-      const content = preTrimContent.trim();
-      const startOffset = preTrimContent.indexOf(content);
-      if (startOffset > 0) {
-          advancePositionWithMutation(innerStart, rawContent, startOffset);
-      }
-      const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);
-      advancePositionWithMutation(innerEnd, rawContent, endOffset);
-      advanceBy(context, close.length);
-      return {
-          type: 5 /* INTERPOLATION */,
-          content: {
-              type: 4 /* SIMPLE_EXPRESSION */,
-              isStatic: false,
-              // Set `isConstant` to false by default and will decide in transformExpression
-              constType: 0 /* NOT_CONSTANT */,
-              content,
-              loc: getSelection(context, innerStart, innerEnd)
-          },
-          loc: getSelection(context, start)
-      };
-  }
-  function parseText(context, mode) {
-      const endTokens = ['<', context.options.delimiters[0]];
-      if (mode === 3 /* CDATA */) {
-          endTokens.push(']]>');
-      }
-      let endIndex = context.source.length;
-      for (let i = 0; i < endTokens.length; i++) {
-          const index = context.source.indexOf(endTokens[i], 1);
-          if (index !== -1 && endIndex > index) {
-              endIndex = index;
-          }
-      }
-      const start = getCursor(context);
-      const content = parseTextData(context, endIndex, mode);
-      return {
-          type: 2 /* TEXT */,
-          content,
-          loc: getSelection(context, start)
-      };
-  }
-  /**
-   * Get text data with a given length from the current location.
-   * This translates HTML entities in the text data.
-   */
-  function parseTextData(context, length, mode) {
-      const rawText = context.source.slice(0, length);
-      advanceBy(context, length);
-      if (mode === 2 /* RAWTEXT */ ||
-          mode === 3 /* CDATA */ ||
-          rawText.indexOf('&') === -1) {
-          return rawText;
-      }
-      else {
-          // DATA or RCDATA containing "&"". Entity decoding required.
-          return context.options.decodeEntities(rawText, mode === 4 /* ATTRIBUTE_VALUE */);
-      }
-  }
-  function getCursor(context) {
-      const { column, line, offset } = context;
-      return { column, line, offset };
-  }
-  function getSelection(context, start, end) {
-      end = end || getCursor(context);
-      return {
-          start,
-          end,
-          source: context.originalSource.slice(start.offset, end.offset)
-      };
-  }
-  function last(xs) {
-      return xs[xs.length - 1];
-  }
-  function startsWith(source, searchString) {
-      return source.startsWith(searchString);
-  }
-  function advanceBy(context, numberOfCharacters) {
-      const { source } = context;
-      advancePositionWithMutation(context, source, numberOfCharacters);
-      context.source = source.slice(numberOfCharacters);
-  }
-  function advanceSpaces(context) {
-      const match = /^[\t\r\n\f ]+/.exec(context.source);
-      if (match) {
-          advanceBy(context, match[0].length);
-      }
-  }
-  function getNewPosition(context, start, numberOfCharacters) {
-      return advancePositionWithClone(start, context.originalSource.slice(start.offset, numberOfCharacters), numberOfCharacters);
-  }
-  function emitError(context, code, offset, loc = getCursor(context)) {
-      if (offset) {
-          loc.offset += offset;
-          loc.column += offset;
-      }
-      context.options.onError(createCompilerError(code, {
-          start: loc,
-          end: loc,
-          source: ''
-      }));
-  }
-  function isEnd(context, mode, ancestors) {
-      const s = context.source;
-      switch (mode) {
-          case 0 /* DATA */:
-              if (startsWith(s, '</')) {
-                  //TODO: probably bad performance
-                  for (let i = ancestors.length - 1; i >= 0; --i) {
-                      if (startsWithEndTagOpen(s, ancestors[i].tag)) {
-                          return true;
-                      }
-                  }
-              }
-              break;
-          case 1 /* RCDATA */:
-          case 2 /* RAWTEXT */: {
-              const parent = last(ancestors);
-              if (parent && startsWithEndTagOpen(s, parent.tag)) {
-                  return true;
-              }
-              break;
-          }
-          case 3 /* CDATA */:
-              if (startsWith(s, ']]>')) {
-                  return true;
-              }
-              break;
-      }
-      return !s;
-  }
-  function startsWithEndTagOpen(source, tag) {
-      return (startsWith(source, '</') &&
-          source.substr(2, tag.length).toLowerCase() === tag.toLowerCase() &&
-          /[\t\r\n\f />]/.test(source[2 + tag.length] || '>'));
-  }
-
-  function hoistStatic(root, context) {
-      walk(root, context,
-      // Root node is unfortunately non-hoistable due to potential parent
-      // fallthrough attributes.
-      isSingleElementRoot(root, root.children[0]));
-  }
-  function isSingleElementRoot(root, child) {
-      const { children } = root;
-      return (children.length === 1 &&
-          child.type === 1 /* ELEMENT */ &&
-          !isSlotOutlet(child));
-  }
-  function walk(node, context, doNotHoistNode = false) {
-      let hasHoistedNode = false;
-      // Some transforms, e.g. transformAssetUrls from @vue/compiler-sfc, replaces
-      // static bindings with expressions. These expressions are guaranteed to be
-      // constant so they are still eligible for hoisting, but they are only
-      // available at runtime and therefore cannot be evaluated ahead of time.
-      // This is only a concern for pre-stringification (via transformHoist by
-      // @vue/compiler-dom), but doing it here allows us to perform only one full
-      // walk of the AST and allow `stringifyStatic` to stop walking as soon as its
-      // stringficiation threshold is met.
-      let canStringify = true;
-      const { children } = node;
-      for (let i = 0; i < children.length; i++) {
-          const child = children[i];
-          // only plain elements & text calls are eligible for hoisting.
-          if (child.type === 1 /* ELEMENT */ &&
-              child.tagType === 0 /* ELEMENT */) {
-              const constantType = doNotHoistNode
-                  ? 0 /* NOT_CONSTANT */
-                  : getConstantType(child, context);
-              if (constantType > 0 /* NOT_CONSTANT */) {
-                  if (constantType < 3 /* CAN_STRINGIFY */) {
-                      canStringify = false;
-                  }
-                  if (constantType >= 2 /* CAN_HOIST */) {
-                      child.codegenNode.patchFlag =
-                          -1 /* HOISTED */ + ( ` /* HOISTED */` );
-                      child.codegenNode = context.hoist(child.codegenNode);
-                      hasHoistedNode = true;
-                      continue;
-                  }
-              }
-              else {
-                  // node may contain dynamic children, but its props may be eligible for
-                  // hoisting.
-                  const codegenNode = child.codegenNode;
-                  if (codegenNode.type === 13 /* VNODE_CALL */) {
-                      const flag = getPatchFlag(codegenNode);
-                      if ((!flag ||
-                          flag === 512 /* NEED_PATCH */ ||
-                          flag === 1 /* TEXT */) &&
-                          getGeneratedPropsConstantType(child, context) >=
-                              2 /* CAN_HOIST */) {
-                          const props = getNodeProps(child);
-                          if (props) {
-                              codegenNode.props = context.hoist(props);
-                          }
-                      }
-                  }
-              }
-          }
-          else if (child.type === 12 /* TEXT_CALL */) {
-              const contentType = getConstantType(child.content, context);
-              if (contentType > 0) {
-                  if (contentType < 3 /* CAN_STRINGIFY */) {
-                      canStringify = false;
-                  }
-                  if (contentType >= 2 /* CAN_HOIST */) {
-                      child.codegenNode = context.hoist(child.codegenNode);
-                      hasHoistedNode = true;
-                  }
-              }
-          }
-          // walk further
-          if (child.type === 1 /* ELEMENT */) {
-              walk(child, context);
-          }
-          else if (child.type === 11 /* FOR */) {
-              // Do not hoist v-for single child because it has to be a block
-              walk(child, context, child.children.length === 1);
-          }
-          else if (child.type === 9 /* IF */) {
-              for (let i = 0; i < child.branches.length; i++) {
-                  // Do not hoist v-if single child because it has to be a block
-                  walk(child.branches[i], context, child.branches[i].children.length === 1);
-              }
-          }
-      }
-      if (canStringify && hasHoistedNode && context.transformHoist) {
-          context.transformHoist(children, context, node);
-      }
-  }
-  function getConstantType(node, context) {
-      const { constantCache } = context;
-      switch (node.type) {
-          case 1 /* ELEMENT */:
-              if (node.tagType !== 0 /* ELEMENT */) {
-                  return 0 /* NOT_CONSTANT */;
-              }
-              const cached = constantCache.get(node);
-              if (cached !== undefined) {
-                  return cached;
-              }
-              const codegenNode = node.codegenNode;
-              if (codegenNode.type !== 13 /* VNODE_CALL */) {
-                  return 0 /* NOT_CONSTANT */;
-              }
-              const flag = getPatchFlag(codegenNode);
-              if (!flag) {
-                  let returnType = 3 /* CAN_STRINGIFY */;
-                  // Element itself has no patch flag. However we still need to check:
-                  // 1. Even for a node with no patch flag, it is possible for it to contain
-                  // non-hoistable expressions that refers to scope variables, e.g. compiler
-                  // injected keys or cached event handlers. Therefore we need to always
-                  // check the codegenNode's props to be sure.
-                  const generatedPropsType = getGeneratedPropsConstantType(node, context);
-                  if (generatedPropsType === 0 /* NOT_CONSTANT */) {
-                      constantCache.set(node, 0 /* NOT_CONSTANT */);
-                      return 0 /* NOT_CONSTANT */;
-                  }
-                  if (generatedPropsType < returnType) {
-                      returnType = generatedPropsType;
-                  }
-                  // 2. its children.
-                  for (let i = 0; i < node.children.length; i++) {
-                      const childType = getConstantType(node.children[i], context);
-                      if (childType === 0 /* NOT_CONSTANT */) {
-                          constantCache.set(node, 0 /* NOT_CONSTANT */);
-                          return 0 /* NOT_CONSTANT */;
-                      }
-                      if (childType < returnType) {
-                          returnType = childType;
-                      }
-                  }
-                  // 3. if the type is not already CAN_SKIP_PATCH which is the lowest non-0
-                  // type, check if any of the props can cause the type to be lowered
-                  // we can skip can_patch because it's guaranteed by the absence of a
-                  // patchFlag.
-                  if (returnType > 1 /* CAN_SKIP_PATCH */) {
-                      for (let i = 0; i < node.props.length; i++) {
-                          const p = node.props[i];
-                          if (p.type === 7 /* DIRECTIVE */ && p.name === 'bind' && p.exp) {
-                              const expType = getConstantType(p.exp, context);
-                              if (expType === 0 /* NOT_CONSTANT */) {
-                                  constantCache.set(node, 0 /* NOT_CONSTANT */);
-                                  return 0 /* NOT_CONSTANT */;
-                              }
-                              if (expType < returnType) {
-                                  returnType = expType;
-                              }
-                          }
-                      }
-                  }
-                  // only svg/foreignObject could be block here, however if they are
-                  // static then they don't need to be blocks since there will be no
-                  // nested updates.
-                  if (codegenNode.isBlock) {
-                      codegenNode.isBlock = false;
-                      context.helper(CREATE_VNODE);
-                  }
-                  constantCache.set(node, returnType);
-                  return returnType;
-              }
-              else {
-                  constantCache.set(node, 0 /* NOT_CONSTANT */);
-                  return 0 /* NOT_CONSTANT */;
-              }
-          case 2 /* TEXT */:
-          case 3 /* COMMENT */:
-              return 3 /* CAN_STRINGIFY */;
-          case 9 /* IF */:
-          case 11 /* FOR */:
-          case 10 /* IF_BRANCH */:
-              return 0 /* NOT_CONSTANT */;
-          case 5 /* INTERPOLATION */:
-          case 12 /* TEXT_CALL */:
-              return getConstantType(node.content, context);
-          case 4 /* SIMPLE_EXPRESSION */:
-              return node.constType;
-          case 8 /* COMPOUND_EXPRESSION */:
-              let returnType = 3 /* CAN_STRINGIFY */;
-              for (let i = 0; i < node.children.length; i++) {
-                  const child = node.children[i];
-                  if (isString(child) || isSymbol(child)) {
-                      continue;
-                  }
-                  const childType = getConstantType(child, context);
-                  if (childType === 0 /* NOT_CONSTANT */) {
-                      return 0 /* NOT_CONSTANT */;
-                  }
-                  else if (childType < returnType) {
-                      returnType = childType;
-                  }
-              }
-              return returnType;
-          default:
-              return 0 /* NOT_CONSTANT */;
-      }
-  }
-  function getGeneratedPropsConstantType(node, context) {
-      let returnType = 3 /* CAN_STRINGIFY */;
-      const props = getNodeProps(node);
-      if (props && props.type === 15 /* JS_OBJECT_EXPRESSION */) {
-          const { properties } = props;
-          for (let i = 0; i < properties.length; i++) {
-              const { key, value } = properties[i];
-              const keyType = getConstantType(key, context);
-              if (keyType === 0 /* NOT_CONSTANT */) {
-                  return keyType;
-              }
-              if (keyType < returnType) {
-                  returnType = keyType;
-              }
-              if (value.type !== 4 /* SIMPLE_EXPRESSION */) {
-                  return 0 /* NOT_CONSTANT */;
-              }
-              const valueType = getConstantType(value, context);
-              if (valueType === 0 /* NOT_CONSTANT */) {
-                  return valueType;
-              }
-              if (valueType < returnType) {
-                  returnType = valueType;
-              }
-          }
-      }
-      return returnType;
-  }
-  function getNodeProps(node) {
-      const codegenNode = node.codegenNode;
-      if (codegenNode.type === 13 /* VNODE_CALL */) {
-          return codegenNode.props;
-      }
-  }
-  function getPatchFlag(node) {
-      const flag = node.patchFlag;
-      return flag ? parseInt(flag, 10) : undefined;
-  }
-
-  function createTransformContext(root, { filename = '', prefixIdentifiers = false, hoistStatic = false, cacheHandlers = false, nodeTransforms = [], directiveTransforms = {}, transformHoist = null, isBuiltInComponent = NOOP, isCustomElement = NOOP, expressionPlugins = [], scopeId = null, ssr = false, ssrCssVars = ``, bindingMetadata = EMPTY_OBJ, inline = false, isTS = false, onError = defaultOnError }) {
-      const nameMatch = filename.replace(/\?.*$/, '').match(/([^/\\]+)\.\w+$/);
-      const context = {
-          // options
-          selfName: nameMatch && capitalize(camelize(nameMatch[1])),
-          prefixIdentifiers,
-          hoistStatic,
-          cacheHandlers,
-          nodeTransforms,
-          directiveTransforms,
-          transformHoist,
-          isBuiltInComponent,
-          isCustomElement,
-          expressionPlugins,
-          scopeId,
-          ssr,
-          ssrCssVars,
-          bindingMetadata,
-          inline,
-          isTS,
-          onError,
-          // state
-          root,
-          helpers: new Set(),
-          components: new Set(),
-          directives: new Set(),
-          hoists: [],
-          imports: new Set(),
-          constantCache: new Map(),
-          temps: 0,
-          cached: 0,
-          identifiers: Object.create(null),
-          scopes: {
-              vFor: 0,
-              vSlot: 0,
-              vPre: 0,
-              vOnce: 0
-          },
-          parent: null,
-          currentNode: root,
-          childIndex: 0,
-          // methods
-          helper(name) {
-              context.helpers.add(name);
-              return name;
-          },
-          helperString(name) {
-              return `_${helperNameMap[context.helper(name)]}`;
-          },
-          replaceNode(node) {
-              /* istanbul ignore if */
-              {
-                  if (!context.currentNode) {
-                      throw new Error(`Node being replaced is already removed.`);
-                  }
-                  if (!context.parent) {
-                      throw new Error(`Cannot replace root node.`);
-                  }
-              }
-              context.parent.children[context.childIndex] = context.currentNode = node;
-          },
-          removeNode(node) {
-              if ( !context.parent) {
-                  throw new Error(`Cannot remove root node.`);
-              }
-              const list = context.parent.children;
-              const removalIndex = node
-                  ? list.indexOf(node)
-                  : context.currentNode
-                      ? context.childIndex
-                      : -1;
-              /* istanbul ignore if */
-              if ( removalIndex < 0) {
-                  throw new Error(`node being removed is not a child of current parent`);
-              }
-              if (!node || node === context.currentNode) {
-                  // current node removed
-                  context.currentNode = null;
-                  context.onNodeRemoved();
-              }
-              else {
-                  // sibling node removed
-                  if (context.childIndex > removalIndex) {
-                      context.childIndex--;
-                      context.onNodeRemoved();
-                  }
-              }
-              context.parent.children.splice(removalIndex, 1);
-          },
-          onNodeRemoved: () => { },
-          addIdentifiers(exp) {
-          },
-          removeIdentifiers(exp) {
-          },
-          hoist(exp) {
-              context.hoists.push(exp);
-              const identifier = createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc, 2 /* CAN_HOIST */);
-              identifier.hoisted = exp;
-              return identifier;
-          },
-          cache(exp, isVNode = false) {
-              return createCacheExpression(++context.cached, exp, isVNode);
-          }
-      };
-      return context;
-  }
-  function transform(root, options) {
-      const context = createTransformContext(root, options);
-      traverseNode(root, context);
-      if (options.hoistStatic) {
-          hoistStatic(root, context);
-      }
-      if (!options.ssr) {
-          createRootCodegen(root, context);
-      }
-      // finalize meta information
-      root.helpers = [...context.helpers];
-      root.components = [...context.components];
-      root.directives = [...context.directives];
-      root.imports = [...context.imports];
-      root.hoists = context.hoists;
-      root.temps = context.temps;
-      root.cached = context.cached;
-  }
-  function createRootCodegen(root, context) {
-      const { helper } = context;
-      const { children } = root;
-      if (children.length === 1) {
-          const child = children[0];
-          // if the single child is an element, turn it into a block.
-          if (isSingleElementRoot(root, child) && child.codegenNode) {
-              // single element root is never hoisted so codegenNode will never be
-              // SimpleExpressionNode
-              const codegenNode = child.codegenNode;
-              if (codegenNode.type === 13 /* VNODE_CALL */) {
-                  codegenNode.isBlock = true;
-                  helper(OPEN_BLOCK);
-                  helper(CREATE_BLOCK);
-              }
-              root.codegenNode = codegenNode;
-          }
-          else {
-              // - single <slot/>, IfNode, ForNode: already blocks.
-              // - single text node: always patched.
-              // root codegen falls through via genNode()
-              root.codegenNode = child;
-          }
-      }
-      else if (children.length > 1) {
-          // root has multiple nodes - return a fragment block.
-          let patchFlag = 64 /* STABLE_FRAGMENT */;
-          let patchFlagText = PatchFlagNames[64 /* STABLE_FRAGMENT */];
-          // check if the fragment actually contains a single valid child with
-          // the rest being comments
-          if (
-              children.filter(c => c.type !== 3 /* COMMENT */).length === 1) {
-              patchFlag |= 2048 /* DEV_ROOT_FRAGMENT */;
-              patchFlagText += `, ${PatchFlagNames[2048 /* DEV_ROOT_FRAGMENT */]}`;
-          }
-          root.codegenNode = createVNodeCall(context, helper(FRAGMENT), undefined, root.children, patchFlag + ( ` /* ${patchFlagText} */` ), undefined, undefined, true);
-      }
-      else ;
-  }
-  function traverseChildren(parent, context) {
-      let i = 0;
-      const nodeRemoved = () => {
-          i--;
-      };
-      for (; i < parent.children.length; i++) {
-          const child = parent.children[i];
-          if (isString(child))
-              continue;
-          context.parent = parent;
-          context.childIndex = i;
-          context.onNodeRemoved = nodeRemoved;
-          traverseNode(child, context);
-      }
-  }
-  function traverseNode(node, context) {
-      context.currentNode = node;
-      // apply transform plugins
-      const { nodeTransforms } = context;
-      const exitFns = [];
-      for (let i = 0; i < nodeTransforms.length; i++) {
-          const onExit = nodeTransforms[i](node, context);
-          if (onExit) {
-              if (isArray(onExit)) {
-                  exitFns.push(...onExit);
-              }
-              else {
-                  exitFns.push(onExit);
-              }
-          }
-          if (!context.currentNode) {
-              // node was removed
-              return;
-          }
-          else {
-              // node may have been replaced
-              node = context.currentNode;
-          }
-      }
-      switch (node.type) {
-          case 3 /* COMMENT */:
-              if (!context.ssr) {
-                  // inject import for the Comment symbol, which is needed for creating
-                  // comment nodes with `createVNode`
-                  context.helper(CREATE_COMMENT);
-              }
-              break;
-          case 5 /* INTERPOLATION */:
-              // no need to traverse, but we need to inject toString helper
-              if (!context.ssr) {
-                  context.helper(TO_DISPLAY_STRING);
-              }
-              break;
-          // for container types, further traverse downwards
-          case 9 /* IF */:
-              for (let i = 0; i < node.branches.length; i++) {
-                  traverseNode(node.branches[i], context);
-              }
-              break;
-          case 10 /* IF_BRANCH */:
-          case 11 /* FOR */:
-          case 1 /* ELEMENT */:
-          case 0 /* ROOT */:
-              traverseChildren(node, context);
-              break;
-      }
-      // exit transforms
-      context.currentNode = node;
-      let i = exitFns.length;
-      while (i--) {
-          exitFns[i]();
-      }
-  }
-  function createStructuralDirectiveTransform(name, fn) {
-      const matches = isString(name)
-          ? (n) => n === name
-          : (n) => name.test(n);
-      return (node, context) => {
-          if (node.type === 1 /* ELEMENT */) {
-              const { props } = node;
-              // structural directive transforms are not concerned with slots
-              // as they are handled separately in vSlot.ts
-              if (node.tagType === 3 /* TEMPLATE */ && props.some(isVSlot)) {
-                  return;
-              }
-              const exitFns = [];
-              for (let i = 0; i < props.length; i++) {
-                  const prop = props[i];
-                  if (prop.type === 7 /* DIRECTIVE */ && matches(prop.name)) {
-                      // structural directives are removed to avoid infinite recursion
-                      // also we remove them *before* applying so that it can further
-                      // traverse itself in case it moves the node around
-                      props.splice(i, 1);
-                      i--;
-                      const onExit = fn(node, prop, context);
-                      if (onExit)
-                          exitFns.push(onExit);
-                  }
-              }
-              return exitFns;
-          }
-      };
-  }
-
-  const PURE_ANNOTATION = `/*#__PURE__*/`;
-  function createCodegenContext(ast, { mode = 'function', prefixIdentifiers = mode === 'module', sourceMap = false, filename = `template.vue.html`, scopeId = null, optimizeImports = false, runtimeGlobalName = `Vue`, runtimeModuleName = `vue`, ssr = false }) {
-      const context = {
-          mode,
-          prefixIdentifiers,
-          sourceMap,
-          filename,
-          scopeId,
-          optimizeImports,
-          runtimeGlobalName,
-          runtimeModuleName,
-          ssr,
-          source: ast.loc.source,
-          code: ``,
-          column: 1,
-          line: 1,
-          offset: 0,
-          indentLevel: 0,
-          pure: false,
-          map: undefined,
-          helper(key) {
-              return `_${helperNameMap[key]}`;
-          },
-          push(code, node) {
-              context.code += code;
-          },
-          indent() {
-              newline(++context.indentLevel);
-          },
-          deindent(withoutNewLine = false) {
-              if (withoutNewLine) {
-                  --context.indentLevel;
-              }
-              else {
-                  newline(--context.indentLevel);
-              }
-          },
-          newline() {
-              newline(context.indentLevel);
-          }
-      };
-      function newline(n) {
-          context.push('\n' + `  `.repeat(n));
-      }
-      return context;
-  }
-  function generate(ast, options = {}) {
-      const context = createCodegenContext(ast, options);
-      if (options.onContextCreated)
-          options.onContextCreated(context);
-      const { mode, push, prefixIdentifiers, indent, deindent, newline, scopeId, ssr } = context;
-      const hasHelpers = ast.helpers.length > 0;
-      const useWithBlock = !prefixIdentifiers && mode !== 'module';
-      // preambles
-      // in setup() inline mode, the preamble is generated in a sub context
-      // and returned separately.
-      const preambleContext =  context;
-      {
-          genFunctionPreamble(ast, preambleContext);
-      }
-      // enter render function
-      const functionName = ssr ? `ssrRender` : `render`;
-      const args = ssr ? ['_ctx', '_push', '_parent', '_attrs'] : ['_ctx', '_cache'];
-      const signature =  args.join(', ');
-      {
-          push(`function ${functionName}(${signature}) {`);
-      }
-      indent();
-      if (useWithBlock) {
-          push(`with (_ctx) {`);
-          indent();
-          // function mode const declarations should be inside with block
-          // also they should be renamed to avoid collision with user properties
-          if (hasHelpers) {
-              push(`const { ${ast.helpers
-                .map(s => `${helperNameMap[s]}: _${helperNameMap[s]}`)
-                .join(', ')} } = _Vue`);
-              push(`\n`);
-              newline();
-          }
-      }
-      // generate asset resolution statements
-      if (ast.components.length) {
-          genAssets(ast.components, 'component', context);
-          if (ast.directives.length || ast.temps > 0) {
-              newline();
-          }
-      }
-      if (ast.directives.length) {
-          genAssets(ast.directives, 'directive', context);
-          if (ast.temps > 0) {
-              newline();
-          }
-      }
-      if (ast.temps > 0) {
-          push(`let `);
-          for (let i = 0; i < ast.temps; i++) {
-              push(`${i > 0 ? `, ` : ``}_temp${i}`);
-          }
-      }
-      if (ast.components.length || ast.directives.length || ast.temps) {
-          push(`\n`);
-          newline();
-      }
-      // generate the VNode tree expression
-      if (!ssr) {
-          push(`return `);
-      }
-      if (ast.codegenNode) {
-          genNode(ast.codegenNode, context);
-      }
-      else {
-          push(`null`);
-      }
-      if (useWithBlock) {
-          deindent();
-          push(`}`);
-      }
-      deindent();
-      push(`}`);
-      return {
-          ast,
-          code: context.code,
-          preamble:  ``,
-          // SourceMapGenerator does have toJSON() method but it's not in the types
-          map: context.map ? context.map.toJSON() : undefined
-      };
-  }
-  function genFunctionPreamble(ast, context) {
-      const { ssr, prefixIdentifiers, push, newline, runtimeModuleName, runtimeGlobalName } = context;
-      const VueBinding =  runtimeGlobalName;
-      const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;
-      // Generate const declaration for helpers
-      // In prefix mode, we place the const declaration at top so it's done
-      // only once; But if we not prefixing, we place the declaration inside the
-      // with block so it doesn't incur the `in` check cost for every helper access.
-      if (ast.helpers.length > 0) {
-          {
-              // "with" mode.
-              // save Vue in a separate variable to avoid collision
-              push(`const _Vue = ${VueBinding}\n`);
-              // in "with" mode, helpers are declared inside the with block to avoid
-              // has check cost, but hoists are lifted out of the function - we need
-              // to provide the helper here.
-              if (ast.hoists.length) {
-                  const staticHelpers = [
-                      CREATE_VNODE,
-                      CREATE_COMMENT,
-                      CREATE_TEXT,
-                      CREATE_STATIC
-                  ]
-                      .filter(helper => ast.helpers.includes(helper))
-                      .map(aliasHelper)
-                      .join(', ');
-                  push(`const { ${staticHelpers} } = _Vue\n`);
-              }
-          }
-      }
-      genHoists(ast.hoists, context);
-      newline();
-      push(`return `);
-  }
-  function genAssets(assets, type, { helper, push, newline }) {
-      const resolver = helper(type === 'component' ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE);
-      for (let i = 0; i < assets.length; i++) {
-          const id = assets[i];
-          push(`const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)})`);
-          if (i < assets.length - 1) {
-              newline();
-          }
-      }
-  }
-  function genHoists(hoists, context) {
-      if (!hoists.length) {
-          return;
-      }
-      context.pure = true;
-      const { push, newline, helper, scopeId, mode } = context;
-      newline();
-      hoists.forEach((exp, i) => {
-          if (exp) {
-              push(`const _hoisted_${i + 1} = `);
-              genNode(exp, context);
-              newline();
-          }
-      });
-      context.pure = false;
-  }
-  function isText$1(n) {
-      return (isString(n) ||
-          n.type === 4 /* SIMPLE_EXPRESSION */ ||
-          n.type === 2 /* TEXT */ ||
-          n.type === 5 /* INTERPOLATION */ ||
-          n.type === 8 /* COMPOUND_EXPRESSION */);
-  }
-  function genNodeListAsArray(nodes, context) {
-      const multilines = nodes.length > 3 ||
-          ( nodes.some(n => isArray(n) || !isText$1(n)));
-      context.push(`[`);
-      multilines && context.indent();
-      genNodeList(nodes, context, multilines);
-      multilines && context.deindent();
-      context.push(`]`);
-  }
-  function genNodeList(nodes, context, multilines = false, comma = true) {
-      const { push, newline } = context;
-      for (let i = 0; i < nodes.length; i++) {
-          const node = nodes[i];
-          if (isString(node)) {
-              push(node);
-          }
-          else if (isArray(node)) {
-              genNodeListAsArray(node, context);
-          }
-          else {
-              genNode(node, context);
-          }
-          if (i < nodes.length - 1) {
-              if (multilines) {
-                  comma && push(',');
-                  newline();
-              }
-              else {
-                  comma && push(', ');
-              }
-          }
-      }
-  }
-  function genNode(node, context) {
-      if (isString(node)) {
-          context.push(node);
-          return;
-      }
-      if (isSymbol(node)) {
-          context.push(context.helper(node));
-          return;
-      }
-      switch (node.type) {
-          case 1 /* ELEMENT */:
-          case 9 /* IF */:
-          case 11 /* FOR */:
-
-                  assert(node.codegenNode != null, `Codegen node is missing for element/if/for node. ` +
-                      `Apply appropriate transforms first.`);
-              genNode(node.codegenNode, context);
-              break;
-          case 2 /* TEXT */:
-              genText(node, context);
-              break;
-          case 4 /* SIMPLE_EXPRESSION */:
-              genExpression(node, context);
-              break;
-          case 5 /* INTERPOLATION */:
-              genInterpolation(node, context);
-              break;
-          case 12 /* TEXT_CALL */:
-              genNode(node.codegenNode, context);
-              break;
-          case 8 /* COMPOUND_EXPRESSION */:
-              genCompoundExpression(node, context);
-              break;
-          case 3 /* COMMENT */:
-              genComment(node, context);
-              break;
-          case 13 /* VNODE_CALL */:
-              genVNodeCall(node, context);
-              break;
-          case 14 /* JS_CALL_EXPRESSION */:
-              genCallExpression(node, context);
-              break;
-          case 15 /* JS_OBJECT_EXPRESSION */:
-              genObjectExpression(node, context);
-              break;
-          case 17 /* JS_ARRAY_EXPRESSION */:
-              genArrayExpression(node, context);
-              break;
-          case 18 /* JS_FUNCTION_EXPRESSION */:
-              genFunctionExpression(node, context);
-              break;
-          case 19 /* JS_CONDITIONAL_EXPRESSION */:
-              genConditionalExpression(node, context);
-              break;
-          case 20 /* JS_CACHE_EXPRESSION */:
-              genCacheExpression(node, context);
-              break;
-          // SSR only types
-          case 21 /* JS_BLOCK_STATEMENT */:
-              break;
-          case 22 /* JS_TEMPLATE_LITERAL */:
-              break;
-          case 23 /* JS_IF_STATEMENT */:
-              break;
-          case 24 /* JS_ASSIGNMENT_EXPRESSION */:
-              break;
-          case 25 /* JS_SEQUENCE_EXPRESSION */:
-              break;
-          case 26 /* JS_RETURN_STATEMENT */:
-              break;
-          /* istanbul ignore next */
-          case 10 /* IF_BRANCH */:
-              // noop
-              break;
-          default:
-              {
-                  assert(false, `unhandled codegen node type: ${node.type}`);
-                  // make sure we exhaust all possible types
-                  const exhaustiveCheck = node;
-                  return exhaustiveCheck;
-              }
-      }
-  }
-  function genText(node, context) {
-      context.push(JSON.stringify(node.content), node);
-  }
-  function genExpression(node, context) {
-      const { content, isStatic } = node;
-      context.push(isStatic ? JSON.stringify(content) : content, node);
-  }
-  function genInterpolation(node, context) {
-      const { push, helper, pure } = context;
-      if (pure)
-          push(PURE_ANNOTATION);
-      push(`${helper(TO_DISPLAY_STRING)}(`);
-      genNode(node.content, context);
-      push(`)`);
-  }
-  function genCompoundExpression(node, context) {
-      for (let i = 0; i < node.children.length; i++) {
-          const child = node.children[i];
-          if (isString(child)) {
-              context.push(child);
-          }
-          else {
-              genNode(child, context);
-          }
-      }
-  }
-  function genExpressionAsPropertyKey(node, context) {
-      const { push } = context;
-      if (node.type === 8 /* COMPOUND_EXPRESSION */) {
-          push(`[`);
-          genCompoundExpression(node, context);
-          push(`]`);
-      }
-      else if (node.isStatic) {
-          // only quote keys if necessary
-          const text = isSimpleIdentifier(node.content)
-              ? node.content
-              : JSON.stringify(node.content);
-          push(text, node);
-      }
-      else {
-          push(`[${node.content}]`, node);
-      }
-  }
-  function genComment(node, context) {
-      {
-          const { push, helper, pure } = context;
-          if (pure) {
-              push(PURE_ANNOTATION);
-          }
-          push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);
-      }
-  }
-  function genVNodeCall(node, context) {
-      const { push, helper, pure } = context;
-      const { tag, props, children, patchFlag, dynamicProps, directives, isBlock, disableTracking } = node;
-      if (directives) {
-          push(helper(WITH_DIRECTIVES) + `(`);
-      }
-      if (isBlock) {
-          push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);
-      }
-      if (pure) {
-          push(PURE_ANNOTATION);
-      }
-      push(helper(isBlock ? CREATE_BLOCK : CREATE_VNODE) + `(`, node);
-      genNodeList(genNullableArgs([tag, props, children, patchFlag, dynamicProps]), context);
-      push(`)`);
-      if (isBlock) {
-          push(`)`);
-      }
-      if (directives) {
-          push(`, `);
-          genNode(directives, context);
-          push(`)`);
-      }
-  }
-  function genNullableArgs(args) {
-      let i = args.length;
-      while (i--) {
-          if (args[i] != null)
-              break;
-      }
-      return args.slice(0, i + 1).map(arg => arg || `null`);
-  }
-  // JavaScript
-  function genCallExpression(node, context) {
-      const { push, helper, pure } = context;
-      const callee = isString(node.callee) ? node.callee : helper(node.callee);
-      if (pure) {
-          push(PURE_ANNOTATION);
-      }
-      push(callee + `(`, node);
-      genNodeList(node.arguments, context);
-      push(`)`);
-  }
-  function genObjectExpression(node, context) {
-      const { push, indent, deindent, newline } = context;
-      const { properties } = node;
-      if (!properties.length) {
-          push(`{}`, node);
-          return;
-      }
-      const multilines = properties.length > 1 ||
-          (
-              properties.some(p => p.value.type !== 4 /* SIMPLE_EXPRESSION */));
-      push(multilines ? `{` : `{ `);
-      multilines && indent();
-      for (let i = 0; i < properties.length; i++) {
-          const { key, value } = properties[i];
-          // key
-          genExpressionAsPropertyKey(key, context);
-          push(`: `);
-          // value
-          genNode(value, context);
-          if (i < properties.length - 1) {
-              // will only reach this if it's multilines
-              push(`,`);
-              newline();
-          }
-      }
-      multilines && deindent();
-      push(multilines ? `}` : ` }`);
-  }
-  function genArrayExpression(node, context) {
-      genNodeListAsArray(node.elements, context);
-  }
-  function genFunctionExpression(node, context) {
-      const { push, indent, deindent, scopeId, mode } = context;
-      const { params, returns, body, newline, isSlot } = node;
-      if (isSlot) {
-          push(`_${helperNameMap[WITH_CTX]}(`);
-      }
-      push(`(`, node);
-      if (isArray(params)) {
-          genNodeList(params, context);
-      }
-      else if (params) {
-          genNode(params, context);
-      }
-      push(`) => `);
-      if (newline || body) {
-          push(`{`);
-          indent();
-      }
-      if (returns) {
-          if (newline) {
-              push(`return `);
-          }
-          if (isArray(returns)) {
-              genNodeListAsArray(returns, context);
-          }
-          else {
-              genNode(returns, context);
-          }
-      }
-      else if (body) {
-          genNode(body, context);
-      }
-      if (newline || body) {
-          deindent();
-          push(`}`);
-      }
-      if ( isSlot) {
-          push(`)`);
-      }
-  }
-  function genConditionalExpression(node, context) {
-      const { test, consequent, alternate, newline: needNewline } = node;
-      const { push, indent, deindent, newline } = context;
-      if (test.type === 4 /* SIMPLE_EXPRESSION */) {
-          const needsParens = !isSimpleIdentifier(test.content);
-          needsParens && push(`(`);
-          genExpression(test, context);
-          needsParens && push(`)`);
-      }
-      else {
-          push(`(`);
-          genNode(test, context);
-          push(`)`);
-      }
-      needNewline && indent();
-      context.indentLevel++;
-      needNewline || push(` `);
-      push(`? `);
-      genNode(consequent, context);
-      context.indentLevel--;
-      needNewline && newline();
-      needNewline || push(` `);
-      push(`: `);
-      const isNested = alternate.type === 19 /* JS_CONDITIONAL_EXPRESSION */;
-      if (!isNested) {
-          context.indentLevel++;
-      }
-      genNode(alternate, context);
-      if (!isNested) {
-          context.indentLevel--;
-      }
-      needNewline && deindent(true /* without newline */);
-  }
-  function genCacheExpression(node, context) {
-      const { push, helper, indent, deindent, newline } = context;
-      push(`_cache[${node.index}] || (`);
-      if (node.isVNode) {
-          indent();
-          push(`${helper(SET_BLOCK_TRACKING)}(-1),`);
-          newline();
-      }
-      push(`_cache[${node.index}] = `);
-      genNode(node.value, context);
-      if (node.isVNode) {
-          push(`,`);
-          newline();
-          push(`${helper(SET_BLOCK_TRACKING)}(1),`);
-          newline();
-          push(`_cache[${node.index}]`);
-          deindent();
-      }
-      push(`)`);
-  }
-
-  // these keywords should not appear inside expressions, but operators like
-  // typeof, instanceof and in are allowed
-  const prohibitedKeywordRE = new RegExp('\\b' +
-      ('do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
-          'super,throw,while,yield,delete,export,import,return,switch,default,' +
-          'extends,finally,continue,debugger,function,arguments,typeof,void')
-          .split(',')
-          .join('\\b|\\b') +
-      '\\b');
-  // strip strings in expressions
-  const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
-  /**
-   * Validate a non-prefixed expression.
-   * This is only called when using the in-browser runtime compiler since it
-   * doesn't prefix expressions.
-   */
-  function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {
-      const exp = node.content;
-      // empty expressions are validated per-directive since some directives
-      // do allow empty expressions.
-      if (!exp.trim()) {
-          return;
-      }
-      try {
-          new Function(asRawStatements
-              ? ` ${exp} `
-              : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`);
-      }
-      catch (e) {
-          let message = e.message;
-          const keywordMatch = exp
-              .replace(stripStringRE, '')
-              .match(prohibitedKeywordRE);
-          if (keywordMatch) {
-              message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`;
-          }
-          context.onError(createCompilerError(43 /* X_INVALID_EXPRESSION */, node.loc, undefined, message));
-      }
-  }
-
-  const transformExpression = (node, context) => {
-      if (node.type === 5 /* INTERPOLATION */) {
-          node.content = processExpression(node.content, context);
-      }
-      else if (node.type === 1 /* ELEMENT */) {
-          // handle directives on element
-          for (let i = 0; i < node.props.length; i++) {
-              const dir = node.props[i];
-              // do not process for v-on & v-for since they are special handled
-              if (dir.type === 7 /* DIRECTIVE */ && dir.name !== 'for') {
-                  const exp = dir.exp;
-                  const arg = dir.arg;
-                  // do not process exp if this is v-on:arg - we need special handling
-                  // for wrapping inline statements.
-                  if (exp &&
-                      exp.type === 4 /* SIMPLE_EXPRESSION */ &&
-                      !(dir.name === 'on' && arg)) {
-                      dir.exp = processExpression(exp, context,
-                      // slot args must be processed as function params
-                      dir.name === 'slot');
-                  }
-                  if (arg && arg.type === 4 /* SIMPLE_EXPRESSION */ && !arg.isStatic) {
-                      dir.arg = processExpression(arg, context);
-                  }
-              }
-          }
-      }
-  };
-  // Important: since this function uses Node.js only dependencies, it should
-  // always be used with a leading !true check so that it can be
-  // tree-shaken from the browser build.
-  function processExpression(node, context,
-  // some expressions like v-slot props & v-for aliases should be parsed as
-  // function params
-  asParams = false,
-  // v-on handler values may contain multiple statements
-  asRawStatements = false) {
-      {
-          {
-              // simple in-browser validation (same logic in 2.x)
-              validateBrowserExpression(node, context, asParams, asRawStatements);
-          }
-          return node;
-      }
-  }
-
-  const transformIf = createStructuralDirectiveTransform(/^(if|else|else-if)$/, (node, dir, context) => {
-      return processIf(node, dir, context, (ifNode, branch, isRoot) => {
-          // #1587: We need to dynamically increment the key based on the current
-          // node's sibling nodes, since chained v-if/else branches are
-          // rendered at the same depth
-          const siblings = context.parent.children;
-          let i = siblings.indexOf(ifNode);
-          let key = 0;
-          while (i-- >= 0) {
-              const sibling = siblings[i];
-              if (sibling && sibling.type === 9 /* IF */) {
-                  key += sibling.branches.length;
-              }
-          }
-          // Exit callback. Complete the codegenNode when all children have been
-          // transformed.
-          return () => {
-              if (isRoot) {
-                  ifNode.codegenNode = createCodegenNodeForBranch(branch, key, context);
-              }
-              else {
-                  // attach this branch's codegen node to the v-if root.
-                  const parentCondition = getParentCondition(ifNode.codegenNode);
-                  parentCondition.alternate = createCodegenNodeForBranch(branch, key + ifNode.branches.length - 1, context);
-              }
-          };
-      });
-  });
-  // target-agnostic transform used for both Client and SSR
-  function processIf(node, dir, context, processCodegen) {
-      if (dir.name !== 'else' &&
-          (!dir.exp || !dir.exp.content.trim())) {
-          const loc = dir.exp ? dir.exp.loc : node.loc;
-          context.onError(createCompilerError(27 /* X_V_IF_NO_EXPRESSION */, dir.loc));
-          dir.exp = createSimpleExpression(`true`, false, loc);
-      }
-      if ( dir.exp) {
-          validateBrowserExpression(dir.exp, context);
-      }
-      if (dir.name === 'if') {
-          const branch = createIfBranch(node, dir);
-          const ifNode = {
-              type: 9 /* IF */,
-              loc: node.loc,
-              branches: [branch]
-          };
-          context.replaceNode(ifNode);
-          if (processCodegen) {
-              return processCodegen(ifNode, branch, true);
-          }
-      }
-      else {
-          // locate the adjacent v-if
-          const siblings = context.parent.children;
-          const comments = [];
-          let i = siblings.indexOf(node);
-          while (i-- >= -1) {
-              const sibling = siblings[i];
-              if ( sibling && sibling.type === 3 /* COMMENT */) {
-                  context.removeNode(sibling);
-                  comments.unshift(sibling);
-                  continue;
-              }
-              if (sibling &&
-                  sibling.type === 2 /* TEXT */ &&
-                  !sibling.content.trim().length) {
-                  context.removeNode(sibling);
-                  continue;
-              }
-              if (sibling && sibling.type === 9 /* IF */) {
-                  // move the node to the if node's branches
-                  context.removeNode();
-                  const branch = createIfBranch(node, dir);
-                  if ( comments.length) {
-                      branch.children = [...comments, ...branch.children];
-                  }
-                  // check if user is forcing same key on different branches
-                  {
-                      const key = branch.userKey;
-                      if (key) {
-                          sibling.branches.forEach(({ userKey }) => {
-                              if (isSameKey(userKey, key)) {
-                                  context.onError(createCompilerError(28 /* X_V_IF_SAME_KEY */, branch.userKey.loc));
-                              }
-                          });
-                      }
-                  }
-                  sibling.branches.push(branch);
-                  const onExit = processCodegen && processCodegen(sibling, branch, false);
-                  // since the branch was removed, it will not be traversed.
-                  // make sure to traverse here.
-                  traverseNode(branch, context);
-                  // call on exit
-                  if (onExit)
-                      onExit();
-                  // make sure to reset currentNode after traversal to indicate this
-                  // node has been removed.
-                  context.currentNode = null;
-              }
-              else {
-                  context.onError(createCompilerError(29 /* X_V_ELSE_NO_ADJACENT_IF */, node.loc));
-              }
-              break;
-          }
-      }
-  }
-  function createIfBranch(node, dir) {
-      return {
-          type: 10 /* IF_BRANCH */,
-          loc: node.loc,
-          condition: dir.name === 'else' ? undefined : dir.exp,
-          children: node.tagType === 3 /* TEMPLATE */ && !findDir(node, 'for')
-              ? node.children
-              : [node],
-          userKey: findProp(node, `key`)
-      };
-  }
-  function createCodegenNodeForBranch(branch, keyIndex, context) {
-      if (branch.condition) {
-          return createConditionalExpression(branch.condition, createChildrenCodegenNode(branch, keyIndex, context),
-          // make sure to pass in asBlock: true so that the comment node call
-          // closes the current block.
-          createCallExpression(context.helper(CREATE_COMMENT), [
-               '"v-if"' ,
-              'true'
-          ]));
-      }
-      else {
-          return createChildrenCodegenNode(branch, keyIndex, context);
-      }
-  }
-  function createChildrenCodegenNode(branch, keyIndex, context) {
-      const { helper } = context;
-      const keyProperty = createObjectProperty(`key`, createSimpleExpression(`${keyIndex}`, false, locStub, 2 /* CAN_HOIST */));
-      const { children } = branch;
-      const firstChild = children[0];
-      const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1 /* ELEMENT */;
-      if (needFragmentWrapper) {
-          if (children.length === 1 && firstChild.type === 11 /* FOR */) {
-              // optimize away nested fragments when child is a ForNode
-              const vnodeCall = firstChild.codegenNode;
-              injectProp(vnodeCall, keyProperty, context);
-              return vnodeCall;
-          }
-          else {
-              return createVNodeCall(context, helper(FRAGMENT), createObjectExpression([keyProperty]), children, 64 /* STABLE_FRAGMENT */ +
-                  ( ` /* ${PatchFlagNames[64 /* STABLE_FRAGMENT */]} */`
-                      ), undefined, undefined, true, false, branch.loc);
-          }
-      }
-      else {
-          const vnodeCall = firstChild
-              .codegenNode;
-          // Change createVNode to createBlock.
-          if (vnodeCall.type === 13 /* VNODE_CALL */) {
-              vnodeCall.isBlock = true;
-              helper(OPEN_BLOCK);
-              helper(CREATE_BLOCK);
-          }
-          // inject branch key
-          injectProp(vnodeCall, keyProperty, context);
-          return vnodeCall;
-      }
-  }
-  function isSameKey(a, b) {
-      if (!a || a.type !== b.type) {
-          return false;
-      }
-      if (a.type === 6 /* ATTRIBUTE */) {
-          if (a.value.content !== b.value.content) {
-              return false;
-          }
-      }
-      else {
-          // directive
-          const exp = a.exp;
-          const branchExp = b.exp;
-          if (exp.type !== branchExp.type) {
-              return false;
-          }
-          if (exp.type !== 4 /* SIMPLE_EXPRESSION */ ||
-              (exp.isStatic !== branchExp.isStatic ||
-                  exp.content !== branchExp.content)) {
-              return false;
-          }
-      }
-      return true;
-  }
-  function getParentCondition(node) {
-      while (true) {
-          if (node.type === 19 /* JS_CONDITIONAL_EXPRESSION */) {
-              if (node.alternate.type === 19 /* JS_CONDITIONAL_EXPRESSION */) {
-                  node = node.alternate;
-              }
-              else {
-                  return node;
-              }
-          }
-          else if (node.type === 20 /* JS_CACHE_EXPRESSION */) {
-              node = node.value;
-          }
-      }
-  }
-
-  const transformFor = createStructuralDirectiveTransform('for', (node, dir, context) => {
-      const { helper } = context;
-      return processFor(node, dir, context, forNode => {
-          // create the loop render function expression now, and add the
-          // iterator on exit after all children have been traversed
-          const renderExp = createCallExpression(helper(RENDER_LIST), [
-              forNode.source
-          ]);
-          const keyProp = findProp(node, `key`);
-          const keyProperty = keyProp
-              ? createObjectProperty(`key`, keyProp.type === 6 /* ATTRIBUTE */
-                  ? createSimpleExpression(keyProp.value.content, true)
-                  : keyProp.exp)
-              : null;
-          const isStableFragment = forNode.source.type === 4 /* SIMPLE_EXPRESSION */ &&
-              forNode.source.constType > 0;
-          const fragmentFlag = isStableFragment
-              ? 64 /* STABLE_FRAGMENT */
-              : keyProp
-                  ? 128 /* KEYED_FRAGMENT */
-                  : 256 /* UNKEYED_FRAGMENT */;
-          forNode.codegenNode = createVNodeCall(context, helper(FRAGMENT), undefined, renderExp, fragmentFlag +
-              ( ` /* ${PatchFlagNames[fragmentFlag]} */` ), undefined, undefined, true /* isBlock */, !isStableFragment /* disableTracking */, node.loc);
-          return () => {
-              // finish the codegen now that all children have been traversed
-              let childBlock;
-              const isTemplate = isTemplateNode(node);
-              const { children } = forNode;
-              // check <template v-for> key placement
-              if ( isTemplate) {
-                  node.children.some(c => {
-                      if (c.type === 1 /* ELEMENT */) {
-                          const key = findProp(c, 'key');
-                          if (key) {
-                              context.onError(createCompilerError(32 /* X_V_FOR_TEMPLATE_KEY_PLACEMENT */, key.loc));
-                              return true;
-                          }
-                      }
-                  });
-              }
-              const needFragmentWrapper = children.length !== 1 || children[0].type !== 1 /* ELEMENT */;
-              const slotOutlet = isSlotOutlet(node)
-                  ? node
-                  : isTemplate &&
-                      node.children.length === 1 &&
-                      isSlotOutlet(node.children[0])
-                      ? node.children[0] // api-extractor somehow fails to infer this
-                      : null;
-              if (slotOutlet) {
-                  // <slot v-for="..."> or <template v-for="..."><slot/></template>
-                  childBlock = slotOutlet.codegenNode;
-                  if (isTemplate && keyProperty) {
-                      // <template v-for="..." :key="..."><slot/></template>
-                      // we need to inject the key to the renderSlot() call.
-                      // the props for renderSlot is passed as the 3rd argument.
-                      injectProp(childBlock, keyProperty, context);
-                  }
-              }
-              else if (needFragmentWrapper) {
-                  // <template v-for="..."> with text or multi-elements
-                  // should generate a fragment block for each loop
-                  childBlock = createVNodeCall(context, helper(FRAGMENT), keyProperty ? createObjectExpression([keyProperty]) : undefined, node.children, 64 /* STABLE_FRAGMENT */ +
-                      ( ` /* ${PatchFlagNames[64 /* STABLE_FRAGMENT */]} */`
-                          ), undefined, undefined, true);
-              }
-              else {
-                  // Normal element v-for. Directly use the child's codegenNode
-                  // but mark it as a block.
-                  childBlock = children[0]
-                      .codegenNode;
-                  if (isTemplate && keyProperty) {
-                      injectProp(childBlock, keyProperty, context);
-                  }
-                  childBlock.isBlock = !isStableFragment;
-                  if (childBlock.isBlock) {
-                      helper(OPEN_BLOCK);
-                      helper(CREATE_BLOCK);
-                  }
-                  else {
-                      helper(CREATE_VNODE);
-                  }
-              }
-              renderExp.arguments.push(createFunctionExpression(createForLoopParams(forNode.parseResult), childBlock, true /* force newline */));
-          };
-      });
-  });
-  // target-agnostic transform used for both Client and SSR
-  function processFor(node, dir, context, processCodegen) {
-      if (!dir.exp) {
-          context.onError(createCompilerError(30 /* X_V_FOR_NO_EXPRESSION */, dir.loc));
-          return;
-      }
-      const parseResult = parseForExpression(
-      // can only be simple expression because vFor transform is applied
-      // before expression transform.
-      dir.exp, context);
-      if (!parseResult) {
-          context.onError(createCompilerError(31 /* X_V_FOR_MALFORMED_EXPRESSION */, dir.loc));
-          return;
-      }
-      const { addIdentifiers, removeIdentifiers, scopes } = context;
-      const { source, value, key, index } = parseResult;
-      const forNode = {
-          type: 11 /* FOR */,
-          loc: dir.loc,
-          source,
-          valueAlias: value,
-          keyAlias: key,
-          objectIndexAlias: index,
-          parseResult,
-          children: isTemplateNode(node) ? node.children : [node]
-      };
-      context.replaceNode(forNode);
-      // bookkeeping
-      scopes.vFor++;
-      const onExit = processCodegen && processCodegen(forNode);
-      return () => {
-          scopes.vFor--;
-          if (onExit)
-              onExit();
-      };
-  }
-  const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
-  // This regex doesn't cover the case if key or index aliases have destructuring,
-  // but those do not make sense in the first place, so this works in practice.
-  const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
-  const stripParensRE = /^\(|\)$/g;
-  function parseForExpression(input, context) {
-      const loc = input.loc;
-      const exp = input.content;
-      const inMatch = exp.match(forAliasRE);
-      if (!inMatch)
-          return;
-      const [, LHS, RHS] = inMatch;
-      const result = {
-          source: createAliasExpression(loc, RHS.trim(), exp.indexOf(RHS, LHS.length)),
-          value: undefined,
-          key: undefined,
-          index: undefined
-      };
-      {
-          validateBrowserExpression(result.source, context);
-      }
-      let valueContent = LHS.trim()
-          .replace(stripParensRE, '')
-          .trim();
-      const trimmedOffset = LHS.indexOf(valueContent);
-      const iteratorMatch = valueContent.match(forIteratorRE);
-      if (iteratorMatch) {
-          valueContent = valueContent.replace(forIteratorRE, '').trim();
-          const keyContent = iteratorMatch[1].trim();
-          let keyOffset;
-          if (keyContent) {
-              keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
-              result.key = createAliasExpression(loc, keyContent, keyOffset);
-              {
-                  validateBrowserExpression(result.key, context, true);
-              }
-          }
-          if (iteratorMatch[2]) {
-              const indexContent = iteratorMatch[2].trim();
-              if (indexContent) {
-                  result.index = createAliasExpression(loc, indexContent, exp.indexOf(indexContent, result.key
-                      ? keyOffset + keyContent.length
-                      : trimmedOffset + valueContent.length));
-                  {
-                      validateBrowserExpression(result.index, context, true);
-                  }
-              }
-          }
-      }
-      if (valueContent) {
-          result.value = createAliasExpression(loc, valueContent, trimmedOffset);
-          {
-              validateBrowserExpression(result.value, context, true);
-          }
-      }
-      return result;
-  }
-  function createAliasExpression(range, content, offset) {
-      return createSimpleExpression(content, false, getInnerRange(range, offset, content.length));
-  }
-  function createForLoopParams({ value, key, index }) {
-      const params = [];
-      if (value) {
-          params.push(value);
-      }
-      if (key) {
-          if (!value) {
-              params.push(createSimpleExpression(`_`, false));
-          }
-          params.push(key);
-      }
-      if (index) {
-          if (!key) {
-              if (!value) {
-                  params.push(createSimpleExpression(`_`, false));
-              }
-              params.push(createSimpleExpression(`__`, false));
-          }
-          params.push(index);
-      }
-      return params;
-  }
-
-  const defaultFallback = createSimpleExpression(`undefined`, false);
-  // A NodeTransform that:
-  // 1. Tracks scope identifiers for scoped slots so that they don't get prefixed
-  //    by transformExpression. This is only applied in non-browser builds with
-  //    { prefixIdentifiers: true }.
-  // 2. Track v-slot depths so that we know a slot is inside another slot.
-  //    Note the exit callback is executed before buildSlots() on the same node,
-  //    so only nested slots see positive numbers.
-  const trackSlotScopes = (node, context) => {
-      if (node.type === 1 /* ELEMENT */ &&
-          (node.tagType === 1 /* COMPONENT */ ||
-              node.tagType === 3 /* TEMPLATE */)) {
-          // We are only checking non-empty v-slot here
-          // since we only care about slots that introduce scope variables.
-          const vSlot = findDir(node, 'slot');
-          if (vSlot) {
-              const slotProps = vSlot.exp;
-              context.scopes.vSlot++;
-              return () => {
-                  context.scopes.vSlot--;
-              };
-          }
-      }
-  };
-  const buildClientSlotFn = (props, children, loc) => createFunctionExpression(props, children, false /* newline */, true /* isSlot */, children.length ? children[0].loc : loc);
-  // Instead of being a DirectiveTransform, v-slot processing is called during
-  // transformElement to build the slots object for a component.
-  function buildSlots(node, context, buildSlotFn = buildClientSlotFn) {
-      context.helper(WITH_CTX);
-      const { children, loc } = node;
-      const slotsProperties = [];
-      const dynamicSlots = [];
-      const buildDefaultSlotProperty = (props, children) => createObjectProperty(`default`, buildSlotFn(props, children, loc));
-      // If the slot is inside a v-for or another v-slot, force it to be dynamic
-      // since it likely uses a scope variable.
-      let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;
-      // 1. Check for slot with slotProps on component itself.
-      //    <Comp v-slot="{ prop }"/>
-      const onComponentSlot = findDir(node, 'slot', true);
-      if (onComponentSlot) {
-          const { arg, exp } = onComponentSlot;
-          if (arg && !isStaticExp(arg)) {
-              hasDynamicSlots = true;
-          }
-          slotsProperties.push(createObjectProperty(arg || createSimpleExpression('default', true), buildSlotFn(exp, children, loc)));
-      }
-      // 2. Iterate through children and check for template slots
-      //    <template v-slot:foo="{ prop }">
-      let hasTemplateSlots = false;
-      let hasNamedDefaultSlot = false;
-      const implicitDefaultChildren = [];
-      const seenSlotNames = new Set();
-      for (let i = 0; i < children.length; i++) {
-          const slotElement = children[i];
-          let slotDir;
-          if (!isTemplateNode(slotElement) ||
-              !(slotDir = findDir(slotElement, 'slot', true))) {
-              // not a <template v-slot>, skip.
-              if (slotElement.type !== 3 /* COMMENT */) {
-                  implicitDefaultChildren.push(slotElement);
-              }
-              continue;
-          }
-          if (onComponentSlot) {
-              // already has on-component slot - this is incorrect usage.
-              context.onError(createCompilerError(36 /* X_V_SLOT_MIXED_SLOT_USAGE */, slotDir.loc));
-              break;
-          }
-          hasTemplateSlots = true;
-          const { children: slotChildren, loc: slotLoc } = slotElement;
-          const { arg: slotName = createSimpleExpression(`default`, true), exp: slotProps, loc: dirLoc } = slotDir;
-          // check if name is dynamic.
-          let staticSlotName;
-          if (isStaticExp(slotName)) {
-              staticSlotName = slotName ? slotName.content : `default`;
-          }
-          else {
-              hasDynamicSlots = true;
-          }
-          const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);
-          // check if this slot is conditional (v-if/v-for)
-          let vIf;
-          let vElse;
-          let vFor;
-          if ((vIf = findDir(slotElement, 'if'))) {
-              hasDynamicSlots = true;
-              dynamicSlots.push(createConditionalExpression(vIf.exp, buildDynamicSlot(slotName, slotFunction), defaultFallback));
-          }
-          else if ((vElse = findDir(slotElement, /^else(-if)?$/, true /* allowEmpty */))) {
-              // find adjacent v-if
-              let j = i;
-              let prev;
-              while (j--) {
-                  prev = children[j];
-                  if (prev.type !== 3 /* COMMENT */) {
-                      break;
-                  }
-              }
-              if (prev && isTemplateNode(prev) && findDir(prev, 'if')) {
-                  // remove node
-                  children.splice(i, 1);
-                  i--;
-                  // attach this slot to previous conditional
-                  let conditional = dynamicSlots[dynamicSlots.length - 1];
-                  while (conditional.alternate.type === 19 /* JS_CONDITIONAL_EXPRESSION */) {
-                      conditional = conditional.alternate;
-                  }
-                  conditional.alternate = vElse.exp
-                      ? createConditionalExpression(vElse.exp, buildDynamicSlot(slotName, slotFunction), defaultFallback)
-                      : buildDynamicSlot(slotName, slotFunction);
-              }
-              else {
-                  context.onError(createCompilerError(29 /* X_V_ELSE_NO_ADJACENT_IF */, vElse.loc));
-              }
-          }
-          else if ((vFor = findDir(slotElement, 'for'))) {
-              hasDynamicSlots = true;
-              const parseResult = vFor.parseResult ||
-                  parseForExpression(vFor.exp, context);
-              if (parseResult) {
-                  // Render the dynamic slots as an array and add it to the createSlot()
-                  // args. The runtime knows how to handle it appropriately.
-                  dynamicSlots.push(createCallExpression(context.helper(RENDER_LIST), [
-                      parseResult.source,
-                      createFunctionExpression(createForLoopParams(parseResult), buildDynamicSlot(slotName, slotFunction), true /* force newline */)
-                  ]));
-              }
-              else {
-                  context.onError(createCompilerError(31 /* X_V_FOR_MALFORMED_EXPRESSION */, vFor.loc));
-              }
-          }
-          else {
-              // check duplicate static names
-              if (staticSlotName) {
-                  if (seenSlotNames.has(staticSlotName)) {
-                      context.onError(createCompilerError(37 /* X_V_SLOT_DUPLICATE_SLOT_NAMES */, dirLoc));
-                      continue;
-                  }
-                  seenSlotNames.add(staticSlotName);
-                  if (staticSlotName === 'default') {
-                      hasNamedDefaultSlot = true;
-                  }
-              }
-              slotsProperties.push(createObjectProperty(slotName, slotFunction));
-          }
-      }
-      if (!onComponentSlot) {
-          if (!hasTemplateSlots) {
-              // implicit default slot (on component)
-              slotsProperties.push(buildDefaultSlotProperty(undefined, children));
-          }
-          else if (implicitDefaultChildren.length) {
-              // implicit default slot (mixed with named slots)
-              if (hasNamedDefaultSlot) {
-                  context.onError(createCompilerError(38 /* X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN */, implicitDefaultChildren[0].loc));
-              }
-              else {
-                  slotsProperties.push(buildDefaultSlotProperty(undefined, implicitDefaultChildren));
-              }
-          }
-      }
-      const slotFlag = hasDynamicSlots
-          ? 2 /* DYNAMIC */
-          : hasForwardedSlots(node.children)
-              ? 3 /* FORWARDED */
-              : 1 /* STABLE */;
-      let slots = createObjectExpression(slotsProperties.concat(createObjectProperty(`_`,
-      // 2 = compiled but dynamic = can skip normalization, but must run diff
-      // 1 = compiled and static = can skip normalization AND diff as optimized
-      createSimpleExpression(slotFlag + ( ` /* ${slotFlagsText[slotFlag]} */` ), false))), loc);
-      if (dynamicSlots.length) {
-          slots = createCallExpression(context.helper(CREATE_SLOTS), [
-              slots,
-              createArrayExpression(dynamicSlots)
-          ]);
-      }
-      return {
-          slots,
-          hasDynamicSlots
-      };
-  }
-  function buildDynamicSlot(name, fn) {
-      return createObjectExpression([
-          createObjectProperty(`name`, name),
-          createObjectProperty(`fn`, fn)
-      ]);
-  }
-  function hasForwardedSlots(children) {
-      for (let i = 0; i < children.length; i++) {
-          const child = children[i];
-          if (child.type === 1 /* ELEMENT */) {
-              if (child.tagType === 2 /* SLOT */ ||
-                  (child.tagType === 0 /* ELEMENT */ &&
-                      hasForwardedSlots(child.children))) {
-                  return true;
-              }
-          }
-      }
-      return false;
-  }
-
-  // some directive transforms (e.g. v-model) may return a symbol for runtime
-  // import, which should be used instead of a resolveDirective call.
-  const directiveImportMap = new WeakMap();
-  // generate a JavaScript AST for this element's codegen
-  const transformElement = (node, context) => {
-      if (!(node.type === 1 /* ELEMENT */ &&
-          (node.tagType === 0 /* ELEMENT */ ||
-              node.tagType === 1 /* COMPONENT */))) {
-          return;
-      }
-      // perform the work on exit, after all child expressions have been
-      // processed and merged.
-      return function postTransformElement() {
-          const { tag, props } = node;
-          const isComponent = node.tagType === 1 /* COMPONENT */;
-          // The goal of the transform is to create a codegenNode implementing the
-          // VNodeCall interface.
-          const vnodeTag = isComponent
-              ? resolveComponentType(node, context)
-              : `"${tag}"`;
-          const isDynamicComponent = isObject(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;
-          let vnodeProps;
-          let vnodeChildren;
-          let vnodePatchFlag;
-          let patchFlag = 0;
-          let vnodeDynamicProps;
-          let dynamicPropNames;
-          let vnodeDirectives;
-          let shouldUseBlock =
-          // dynamic component may resolve to plain elements
-          isDynamicComponent ||
-              vnodeTag === TELEPORT ||
-              vnodeTag === SUSPENSE ||
-              (!isComponent &&
-                  // <svg> and <foreignObject> must be forced into blocks so that block
-                  // updates inside get proper isSVG flag at runtime. (#639, #643)
-                  // This is technically web-specific, but splitting the logic out of core
-                  // leads to too much unnecessary complexity.
-                  (tag === 'svg' ||
-                      tag === 'foreignObject' ||
-                      // #938: elements with dynamic keys should be forced into blocks
-                      findProp(node, 'key', true)));
-          // props
-          if (props.length > 0) {
-              const propsBuildResult = buildProps(node, context);
-              vnodeProps = propsBuildResult.props;
-              patchFlag = propsBuildResult.patchFlag;
-              dynamicPropNames = propsBuildResult.dynamicPropNames;
-              const directives = propsBuildResult.directives;
-              vnodeDirectives =
-                  directives && directives.length
-                      ? createArrayExpression(directives.map(dir => buildDirectiveArgs(dir, context)))
-                      : undefined;
-          }
-          // children
-          if (node.children.length > 0) {
-              if (vnodeTag === KEEP_ALIVE) {
-                  // Although a built-in component, we compile KeepAlive with raw children
-                  // instead of slot functions so that it can be used inside Transition
-                  // or other Transition-wrapping HOCs.
-                  // To ensure correct updates with block optimizations, we need to:
-                  // 1. Force keep-alive into a block. This avoids its children being
-                  //    collected by a parent block.
-                  shouldUseBlock = true;
-                  // 2. Force keep-alive to always be updated, since it uses raw children.
-                  patchFlag |= 1024 /* DYNAMIC_SLOTS */;
-                  if ( node.children.length > 1) {
-                      context.onError(createCompilerError(44 /* X_KEEP_ALIVE_INVALID_CHILDREN */, {
-                          start: node.children[0].loc.start,
-                          end: node.children[node.children.length - 1].loc.end,
-                          source: ''
-                      }));
-                  }
-              }
-              const shouldBuildAsSlots = isComponent &&
-                  // Teleport is not a real component and has dedicated runtime handling
-                  vnodeTag !== TELEPORT &&
-                  // explained above.
-                  vnodeTag !== KEEP_ALIVE;
-              if (shouldBuildAsSlots) {
-                  const { slots, hasDynamicSlots } = buildSlots(node, context);
-                  vnodeChildren = slots;
-                  if (hasDynamicSlots) {
-                      patchFlag |= 1024 /* DYNAMIC_SLOTS */;
-                  }
-              }
-              else if (node.children.length === 1 && vnodeTag !== TELEPORT) {
-                  const child = node.children[0];
-                  const type = child.type;
-                  // check for dynamic text children
-                  const hasDynamicTextChild = type === 5 /* INTERPOLATION */ ||
-                      type === 8 /* COMPOUND_EXPRESSION */;
-                  if (hasDynamicTextChild &&
-                      getConstantType(child, context) === 0 /* NOT_CONSTANT */) {
-                      patchFlag |= 1 /* TEXT */;
-                  }
-                  // pass directly if the only child is a text node
-                  // (plain / interpolation / expression)
-                  if (hasDynamicTextChild || type === 2 /* TEXT */) {
-                      vnodeChildren = child;
-                  }
-                  else {
-                      vnodeChildren = node.children;
-                  }
-              }
-              else {
-                  vnodeChildren = node.children;
-              }
-          }
-          // patchFlag & dynamicPropNames
-          if (patchFlag !== 0) {
-              {
-                  if (patchFlag < 0) {
-                      // special flags (negative and mutually exclusive)
-                      vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`;
-                  }
-                  else {
-                      // bitwise flags
-                      const flagNames = Object.keys(PatchFlagNames)
-                          .map(Number)
-                          .filter(n => n > 0 && patchFlag & n)
-                          .map(n => PatchFlagNames[n])
-                          .join(`, `);
-                      vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;
-                  }
-              }
-              if (dynamicPropNames && dynamicPropNames.length) {
-                  vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);
-              }
-          }
-          node.codegenNode = createVNodeCall(context, vnodeTag, vnodeProps, vnodeChildren, vnodePatchFlag, vnodeDynamicProps, vnodeDirectives, !!shouldUseBlock, false /* disableTracking */, node.loc);
-      };
-  };
-  function resolveComponentType(node, context, ssr = false) {
-      const { tag } = node;
-      // 1. dynamic component
-      const isProp = node.tag === 'component' ? findProp(node, 'is') : findDir(node, 'is');
-      if (isProp) {
-          const exp = isProp.type === 6 /* ATTRIBUTE */
-              ? isProp.value && createSimpleExpression(isProp.value.content, true)
-              : isProp.exp;
-          if (exp) {
-              return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
-                  exp
-              ]);
-          }
-      }
-      // 2. built-in components (Teleport, Transition, KeepAlive, Suspense...)
-      const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);
-      if (builtIn) {
-          // built-ins are simply fallthroughs / have special handling during ssr
-          // so we don't need to import their runtime equivalents
-          if (!ssr)
-              context.helper(builtIn);
-          return builtIn;
-      }
-      // 5. user component (resolve)
-      context.helper(RESOLVE_COMPONENT);
-      context.components.add(tag);
-      return toValidAssetId(tag, `component`);
-  }
-  function buildProps(node, context, props = node.props, ssr = false) {
-      const { tag, loc: elementLoc } = node;
-      const isComponent = node.tagType === 1 /* COMPONENT */;
-      let properties = [];
-      const mergeArgs = [];
-      const runtimeDirectives = [];
-      // patchFlag analysis
-      let patchFlag = 0;
-      let hasRef = false;
-      let hasClassBinding = false;
-      let hasStyleBinding = false;
-      let hasHydrationEventBinding = false;
-      let hasDynamicKeys = false;
-      let hasVnodeHook = false;
-      const dynamicPropNames = [];
-      const analyzePatchFlag = ({ key, value }) => {
-          if (isStaticExp(key)) {
-              const name = key.content;
-              const isEventHandler = isOn(name);
-              if (!isComponent &&
-                  isEventHandler &&
-                  // omit the flag for click handlers because hydration gives click
-                  // dedicated fast path.
-                  name.toLowerCase() !== 'onclick' &&
-                  // omit v-model handlers
-                  name !== 'onUpdate:modelValue' &&
-                  // omit onVnodeXXX hooks
-                  !isReservedProp(name)) {
-                  hasHydrationEventBinding = true;
-              }
-              if (isEventHandler && isReservedProp(name)) {
-                  hasVnodeHook = true;
-              }
-              if (value.type === 20 /* JS_CACHE_EXPRESSION */ ||
-                  ((value.type === 4 /* SIMPLE_EXPRESSION */ ||
-                      value.type === 8 /* COMPOUND_EXPRESSION */) &&
-                      getConstantType(value, context) > 0)) {
-                  // skip if the prop is a cached handler or has constant value
-                  return;
-              }
-              if (name === 'ref') {
-                  hasRef = true;
-              }
-              else if (name === 'class' && !isComponent) {
-                  hasClassBinding = true;
-              }
-              else if (name === 'style' && !isComponent) {
-                  hasStyleBinding = true;
-              }
-              else if (name !== 'key' && !dynamicPropNames.includes(name)) {
-                  dynamicPropNames.push(name);
-              }
-          }
-          else {
-              hasDynamicKeys = true;
-          }
-      };
-      for (let i = 0; i < props.length; i++) {
-          // static attribute
-          const prop = props[i];
-          if (prop.type === 6 /* ATTRIBUTE */) {
-              const { loc, name, value } = prop;
-              let isStatic = true;
-              if (name === 'ref') {
-                  hasRef = true;
-              }
-              // skip :is on <component>
-              if (name === 'is' && tag === 'component') {
-                  continue;
-              }
-              properties.push(createObjectProperty(createSimpleExpression(name, true, getInnerRange(loc, 0, name.length)), createSimpleExpression(value ? value.content : '', isStatic, value ? value.loc : loc)));
-          }
-          else {
-              // directives
-              const { name, arg, exp, loc } = prop;
-              const isBind = name === 'bind';
-              const isOn = name === 'on';
-              // skip v-slot - it is handled by its dedicated transform.
-              if (name === 'slot') {
-                  if (!isComponent) {
-                      context.onError(createCompilerError(39 /* X_V_SLOT_MISPLACED */, loc));
-                  }
-                  continue;
-              }
-              // skip v-once - it is handled by its dedicated transform.
-              if (name === 'once') {
-                  continue;
-              }
-              // skip v-is and :is on <component>
-              if (name === 'is' ||
-                  (isBind && tag === 'component' && isBindKey(arg, 'is'))) {
-                  continue;
-              }
-              // skip v-on in SSR compilation
-              if (isOn && ssr) {
-                  continue;
-              }
-              // special case for v-bind and v-on with no argument
-              if (!arg && (isBind || isOn)) {
-                  hasDynamicKeys = true;
-                  if (exp) {
-                      if (properties.length) {
-                          mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
-                          properties = [];
-                      }
-                      if (isBind) {
-                          mergeArgs.push(exp);
-                      }
-                      else {
-                          // v-on="obj" -> toHandlers(obj)
-                          mergeArgs.push({
-                              type: 14 /* JS_CALL_EXPRESSION */,
-                              loc,
-                              callee: context.helper(TO_HANDLERS),
-                              arguments: [exp]
-                          });
-                      }
-                  }
-                  else {
-                      context.onError(createCompilerError(isBind
-                          ? 33 /* X_V_BIND_NO_EXPRESSION */
-                          : 34 /* X_V_ON_NO_EXPRESSION */, loc));
-                  }
-                  continue;
-              }
-              const directiveTransform = context.directiveTransforms[name];
-              if (directiveTransform) {
-                  // has built-in directive transform.
-                  const { props, needRuntime } = directiveTransform(prop, node, context);
-                  !ssr && props.forEach(analyzePatchFlag);
-                  properties.push(...props);
-                  if (needRuntime) {
-                      runtimeDirectives.push(prop);
-                      if (isSymbol(needRuntime)) {
-                          directiveImportMap.set(prop, needRuntime);
-                      }
-                  }
-              }
-              else {
-                  // no built-in transform, this is a user custom directive.
-                  runtimeDirectives.push(prop);
-              }
-          }
-      }
-      let propsExpression = undefined;
-      // has v-bind="object" or v-on="object", wrap with mergeProps
-      if (mergeArgs.length) {
-          if (properties.length) {
-              mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
-          }
-          if (mergeArgs.length > 1) {
-              propsExpression = createCallExpression(context.helper(MERGE_PROPS), mergeArgs, elementLoc);
-          }
-          else {
-              // single v-bind with nothing else - no need for a mergeProps call
-              propsExpression = mergeArgs[0];
-          }
-      }
-      else if (properties.length) {
-          propsExpression = createObjectExpression(dedupeProperties(properties), elementLoc);
-      }
-      // patchFlag analysis
-      if (hasDynamicKeys) {
-          patchFlag |= 16 /* FULL_PROPS */;
-      }
-      else {
-          if (hasClassBinding) {
-              patchFlag |= 2 /* CLASS */;
-          }
-          if (hasStyleBinding) {
-              patchFlag |= 4 /* STYLE */;
-          }
-          if (dynamicPropNames.length) {
-              patchFlag |= 8 /* PROPS */;
-          }
-          if (hasHydrationEventBinding) {
-              patchFlag |= 32 /* HYDRATE_EVENTS */;
-          }
-      }
-      if ((patchFlag === 0 || patchFlag === 32 /* HYDRATE_EVENTS */) &&
-          (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {
-          patchFlag |= 512 /* NEED_PATCH */;
-      }
-      return {
-          props: propsExpression,
-          directives: runtimeDirectives,
-          patchFlag,
-          dynamicPropNames
-      };
-  }
-  // Dedupe props in an object literal.
-  // Literal duplicated attributes would have been warned during the parse phase,
-  // however, it's possible to encounter duplicated `onXXX` handlers with different
-  // modifiers. We also need to merge static and dynamic class / style attributes.
-  // - onXXX handlers / style: merge into array
-  // - class: merge into single expression with concatenation
-  function dedupeProperties(properties) {
-      const knownProps = new Map();
-      const deduped = [];
-      for (let i = 0; i < properties.length; i++) {
-          const prop = properties[i];
-          // dynamic keys are always allowed
-          if (prop.key.type === 8 /* COMPOUND_EXPRESSION */ || !prop.key.isStatic) {
-              deduped.push(prop);
-              continue;
-          }
-          const name = prop.key.content;
-          const existing = knownProps.get(name);
-          if (existing) {
-              if (name === 'style' || name === 'class' || name.startsWith('on')) {
-                  mergeAsArray(existing, prop);
-              }
-              // unexpected duplicate, should have emitted error during parse
-          }
-          else {
-              knownProps.set(name, prop);
-              deduped.push(prop);
-          }
-      }
-      return deduped;
-  }
-  function mergeAsArray(existing, incoming) {
-      if (existing.value.type === 17 /* JS_ARRAY_EXPRESSION */) {
-          existing.value.elements.push(incoming.value);
-      }
-      else {
-          existing.value = createArrayExpression([existing.value, incoming.value], existing.loc);
-      }
-  }
-  function buildDirectiveArgs(dir, context) {
-      const dirArgs = [];
-      const runtime = directiveImportMap.get(dir);
-      if (runtime) {
-          // built-in directive with runtime
-          dirArgs.push(context.helperString(runtime));
-      }
-      else {
-          {
-              // inject statement for resolving directive
-              context.helper(RESOLVE_DIRECTIVE);
-              context.directives.add(dir.name);
-              dirArgs.push(toValidAssetId(dir.name, `directive`));
-          }
-      }
-      const { loc } = dir;
-      if (dir.exp)
-          dirArgs.push(dir.exp);
-      if (dir.arg) {
-          if (!dir.exp) {
-              dirArgs.push(`void 0`);
-          }
-          dirArgs.push(dir.arg);
-      }
-      if (Object.keys(dir.modifiers).length) {
-          if (!dir.arg) {
-              if (!dir.exp) {
-                  dirArgs.push(`void 0`);
-              }
-              dirArgs.push(`void 0`);
-          }
-          const trueExpression = createSimpleExpression(`true`, false, loc);
-          dirArgs.push(createObjectExpression(dir.modifiers.map(modifier => createObjectProperty(modifier, trueExpression)), loc));
-      }
-      return createArrayExpression(dirArgs, dir.loc);
-  }
-  function stringifyDynamicPropNames(props) {
-      let propsNamesString = `[`;
-      for (let i = 0, l = props.length; i < l; i++) {
-          propsNamesString += JSON.stringify(props[i]);
-          if (i < l - 1)
-              propsNamesString += ', ';
-      }
-      return propsNamesString + `]`;
-  }
-
-  const transformSlotOutlet = (node, context) => {
-      if (isSlotOutlet(node)) {
-          const { children, loc } = node;
-          const { slotName, slotProps } = processSlotOutlet(node, context);
-          const slotArgs = [
-              context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
-              slotName
-          ];
-          if (slotProps) {
-              slotArgs.push(slotProps);
-          }
-          if (children.length) {
-              if (!slotProps) {
-                  slotArgs.push(`{}`);
-              }
-              slotArgs.push(createFunctionExpression([], children, false, false, loc));
-          }
-          node.codegenNode = createCallExpression(context.helper(RENDER_SLOT), slotArgs, loc);
-      }
-  };
-  function processSlotOutlet(node, context) {
-      let slotName = `"default"`;
-      let slotProps = undefined;
-      const nonNameProps = [];
-      for (let i = 0; i < node.props.length; i++) {
-          const p = node.props[i];
-          if (p.type === 6 /* ATTRIBUTE */) {
-              if (p.value) {
-                  if (p.name === 'name') {
-                      slotName = JSON.stringify(p.value.content);
-                  }
-                  else {
-                      p.name = camelize(p.name);
-                      nonNameProps.push(p);
-                  }
-              }
-          }
-          else {
-              if (p.name === 'bind' && isBindKey(p.arg, 'name')) {
-                  if (p.exp)
-                      slotName = p.exp;
-              }
-              else {
-                  if (p.name === 'bind' && p.arg && isStaticExp(p.arg)) {
-                      p.arg.content = camelize(p.arg.content);
-                  }
-                  nonNameProps.push(p);
-              }
-          }
-      }
-      if (nonNameProps.length > 0) {
-          const { props, directives } = buildProps(node, context, nonNameProps);
-          slotProps = props;
-          if (directives.length) {
-              context.onError(createCompilerError(35 /* X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET */, directives[0].loc));
-          }
-      }
-      return {
-          slotName,
-          slotProps
-      };
-  }
-
-  const fnExpRE = /^\s*([\w$_]+|\([^)]*?\))\s*=>|^\s*function(?:\s+[\w$]+)?\s*\(/;
-  const transformOn = (dir, node, context, augmentor) => {
-      const { loc, modifiers, arg } = dir;
-      if (!dir.exp && !modifiers.length) {
-          context.onError(createCompilerError(34 /* X_V_ON_NO_EXPRESSION */, loc));
-      }
-      let eventName;
-      if (arg.type === 4 /* SIMPLE_EXPRESSION */) {
-          if (arg.isStatic) {
-              const rawName = arg.content;
-              // for all event listeners, auto convert it to camelCase. See issue #2249
-              eventName = createSimpleExpression(toHandlerKey(camelize(rawName)), true, arg.loc);
-          }
-          else {
-              // #2388
-              eventName = createCompoundExpression([
-                  `${context.helperString(TO_HANDLER_KEY)}(`,
-                  arg,
-                  `)`
-              ]);
-          }
-      }
-      else {
-          // already a compound expression.
-          eventName = arg;
-          eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);
-          eventName.children.push(`)`);
-      }
-      // handler processing
-      let exp = dir.exp;
-      if (exp && !exp.content.trim()) {
-          exp = undefined;
-      }
-      let shouldCache = context.cacheHandlers && !exp;
-      if (exp) {
-          const isMemberExp = isMemberExpression(exp.content);
-          const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));
-          const hasMultipleStatements = exp.content.includes(`;`);
-          {
-              validateBrowserExpression(exp, context, false, hasMultipleStatements);
-          }
-          if (isInlineStatement || (shouldCache && isMemberExp)) {
-              // wrap inline statement in a function expression
-              exp = createCompoundExpression([
-                  `${isInlineStatement
-                    ?  `$event`
-                    : `${ ``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,
-                  exp,
-                  hasMultipleStatements ? `}` : `)`
-              ]);
-          }
-      }
-      let ret = {
-          props: [
-              createObjectProperty(eventName, exp || createSimpleExpression(`() => {}`, false, loc))
-          ]
-      };
-      // apply extended compiler augmentor
-      if (augmentor) {
-          ret = augmentor(ret);
-      }
-      if (shouldCache) {
-          // cache handlers so that it's always the same handler being passed down.
-          // this avoids unnecessary re-renders when users use inline handlers on
-          // components.
-          ret.props[0].value = context.cache(ret.props[0].value);
-      }
-      return ret;
-  };
-
-  // v-bind without arg is handled directly in ./transformElements.ts due to it affecting
-  // codegen for the entire props object. This transform here is only for v-bind
-  // *with* args.
-  const transformBind = (dir, node, context) => {
-      const { exp, modifiers, loc } = dir;
-      const arg = dir.arg;
-      if (arg.type !== 4 /* SIMPLE_EXPRESSION */) {
-          arg.children.unshift(`(`);
-          arg.children.push(`) || ""`);
-      }
-      else if (!arg.isStatic) {
-          arg.content = `${arg.content} || ""`;
-      }
-      // .prop is no longer necessary due to new patch behavior
-      // .sync is replaced by v-model:arg
-      if (modifiers.includes('camel')) {
-          if (arg.type === 4 /* SIMPLE_EXPRESSION */) {
-              if (arg.isStatic) {
-                  arg.content = camelize(arg.content);
-              }
-              else {
-                  arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;
-              }
-          }
-          else {
-              arg.children.unshift(`${context.helperString(CAMELIZE)}(`);
-              arg.children.push(`)`);
-          }
-      }
-      if (!exp ||
-          (exp.type === 4 /* SIMPLE_EXPRESSION */ && !exp.content.trim())) {
-          context.onError(createCompilerError(33 /* X_V_BIND_NO_EXPRESSION */, loc));
-          return {
-              props: [createObjectProperty(arg, createSimpleExpression('', true, loc))]
-          };
-      }
-      return {
-          props: [createObjectProperty(arg, exp)]
-      };
-  };
-
-  // Merge adjacent text nodes and expressions into a single expression
-  // e.g. <div>abc {{ d }} {{ e }}</div> should have a single expression node as child.
-  const transformText = (node, context) => {
-      if (node.type === 0 /* ROOT */ ||
-          node.type === 1 /* ELEMENT */ ||
-          node.type === 11 /* FOR */ ||
-          node.type === 10 /* IF_BRANCH */) {
-          // perform the transform on node exit so that all expressions have already
-          // been processed.
-          return () => {
-              const children = node.children;
-              let currentContainer = undefined;
-              let hasText = false;
-              for (let i = 0; i < children.length; i++) {
-                  const child = children[i];
-                  if (isText(child)) {
-                      hasText = true;
-                      for (let j = i + 1; j < children.length; j++) {
-                          const next = children[j];
-                          if (isText(next)) {
-                              if (!currentContainer) {
-                                  currentContainer = children[i] = {
-                                      type: 8 /* COMPOUND_EXPRESSION */,
-                                      loc: child.loc,
-                                      children: [child]
-                                  };
-                              }
-                              // merge adjacent text node into current
-                              currentContainer.children.push(` + `, next);
-                              children.splice(j, 1);
-                              j--;
-                          }
-                          else {
-                              currentContainer = undefined;
-                              break;
-                          }
-                      }
-                  }
-              }
-              if (!hasText ||
-                  // if this is a plain element with a single text child, leave it
-                  // as-is since the runtime has dedicated fast path for this by directly
-                  // setting textContent of the element.
-                  // for component root it's always normalized anyway.
-                  (children.length === 1 &&
-                      (node.type === 0 /* ROOT */ ||
-                          (node.type === 1 /* ELEMENT */ &&
-                              node.tagType === 0 /* ELEMENT */)))) {
-                  return;
-              }
-              // pre-convert text nodes into createTextVNode(text) calls to avoid
-              // runtime normalization.
-              for (let i = 0; i < children.length; i++) {
-                  const child = children[i];
-                  if (isText(child) || child.type === 8 /* COMPOUND_EXPRESSION */) {
-                      const callArgs = [];
-                      // createTextVNode defaults to single whitespace, so if it is a
-                      // single space the code could be an empty call to save bytes.
-                      if (child.type !== 2 /* TEXT */ || child.content !== ' ') {
-                          callArgs.push(child);
-                      }
-                      // mark dynamic text with flag so it gets patched inside a block
-                      if (!context.ssr &&
-                          getConstantType(child, context) === 0 /* NOT_CONSTANT */) {
-                          callArgs.push(1 /* TEXT */ +
-                              ( ` /* ${PatchFlagNames[1 /* TEXT */]} */` ));
-                      }
-                      children[i] = {
-                          type: 12 /* TEXT_CALL */,
-                          content: child,
-                          loc: child.loc,
-                          codegenNode: createCallExpression(context.helper(CREATE_TEXT), callArgs)
-                      };
-                  }
-              }
-          };
-      }
-  };
-
-  const seen = new WeakSet();
-  const transformOnce = (node, context) => {
-      if (node.type === 1 /* ELEMENT */ && findDir(node, 'once', true)) {
-          if (seen.has(node)) {
-              return;
-          }
-          seen.add(node);
-          context.helper(SET_BLOCK_TRACKING);
-          return () => {
-              const cur = context.currentNode;
-              if (cur.codegenNode) {
-                  cur.codegenNode = context.cache(cur.codegenNode, true /* isVNode */);
-              }
-          };
-      }
-  };
-
-  const transformModel = (dir, node, context) => {
-      const { exp, arg } = dir;
-      if (!exp) {
-          context.onError(createCompilerError(40 /* X_V_MODEL_NO_EXPRESSION */, dir.loc));
-          return createTransformProps();
-      }
-      const rawExp = exp.loc.source;
-      const expString = exp.type === 4 /* SIMPLE_EXPRESSION */ ? exp.content : rawExp;
-      // im SFC <script setup> inline mode, the exp may have been transformed into
-      // _unref(exp)
-      const bindingType = context.bindingMetadata[rawExp];
-      const maybeRef = !true    /* SETUP_CONST */;
-      if (!isMemberExpression(expString) && !maybeRef) {
-          context.onError(createCompilerError(41 /* X_V_MODEL_MALFORMED_EXPRESSION */, exp.loc));
-          return createTransformProps();
-      }
-      const propName = arg ? arg : createSimpleExpression('modelValue', true);
-      const eventName = arg
-          ? isStaticExp(arg)
-              ? `onUpdate:${arg.content}`
-              : createCompoundExpression(['"onUpdate:" + ', arg])
-          : `onUpdate:modelValue`;
-      let assignmentExp;
-      const eventArg = context.isTS ? `($event: any)` : `$event`;
-      {
-          assignmentExp = createCompoundExpression([
-              `${eventArg} => (`,
-              exp,
-              ` = $event)`
-          ]);
-      }
-      const props = [
-          // modelValue: foo
-          createObjectProperty(propName, dir.exp),
-          // "onUpdate:modelValue": $event => (foo = $event)
-          createObjectProperty(eventName, assignmentExp)
-      ];
-      // modelModifiers: { foo: true, "bar-baz": true }
-      if (dir.modifiers.length && node.tagType === 1 /* COMPONENT */) {
-          const modifiers = dir.modifiers
-              .map(m => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`)
-              .join(`, `);
-          const modifiersKey = arg
-              ? isStaticExp(arg)
-                  ? `${arg.content}Modifiers`
-                  : createCompoundExpression([arg, ' + "Modifiers"'])
-              : `modelModifiers`;
-          props.push(createObjectProperty(modifiersKey, createSimpleExpression(`{ ${modifiers} }`, false, dir.loc, 2 /* CAN_HOIST */)));
-      }
-      return createTransformProps(props);
-  };
-  function createTransformProps(props = []) {
-      return { props };
-  }
-
-  function getBaseTransformPreset(prefixIdentifiers) {
-      return [
-          [
-              transformOnce,
-              transformIf,
-              transformFor,
-              ...(  [transformExpression]
-                      ),
-              transformSlotOutlet,
-              transformElement,
-              trackSlotScopes,
-              transformText
-          ],
-          {
-              on: transformOn,
-              bind: transformBind,
-              model: transformModel
-          }
-      ];
-  }
-  // we name it `baseCompile` so that higher order compilers like
-  // @vue/compiler-dom can export `compile` while re-exporting everything else.
-  function baseCompile(template, options = {}) {
-      const onError = options.onError || defaultOnError;
-      const isModuleMode = options.mode === 'module';
-      /* istanbul ignore if */
-      {
-          if (options.prefixIdentifiers === true) {
-              onError(createCompilerError(45 /* X_PREFIX_ID_NOT_SUPPORTED */));
-          }
-          else if (isModuleMode) {
-              onError(createCompilerError(46 /* X_MODULE_MODE_NOT_SUPPORTED */));
-          }
-      }
-      const prefixIdentifiers = !true ;
-      if ( options.cacheHandlers) {
-          onError(createCompilerError(47 /* X_CACHE_HANDLER_NOT_SUPPORTED */));
-      }
-      if (options.scopeId && !isModuleMode) {
-          onError(createCompilerError(48 /* X_SCOPE_ID_NOT_SUPPORTED */));
-      }
-      const ast = isString(template) ? baseParse(template, options) : template;
-      const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();
-      transform(ast, extend({}, options, {
-          prefixIdentifiers,
-          nodeTransforms: [
-              ...nodeTransforms,
-              ...(options.nodeTransforms || []) // user transforms
-          ],
-          directiveTransforms: extend({}, directiveTransforms, options.directiveTransforms || {} // user transforms
-          )
-      }));
-      return generate(ast, extend({}, options, {
-          prefixIdentifiers
-      }));
-  }
-
-  const noopDirectiveTransform = () => ({ props: [] });
-
-  const V_MODEL_RADIO = Symbol( `vModelRadio` );
-  const V_MODEL_CHECKBOX = Symbol( `vModelCheckbox` );
-  const V_MODEL_TEXT = Symbol( `vModelText` );
-  const V_MODEL_SELECT = Symbol( `vModelSelect` );
-  const V_MODEL_DYNAMIC = Symbol( `vModelDynamic` );
-  const V_ON_WITH_MODIFIERS = Symbol( `vOnModifiersGuard` );
-  const V_ON_WITH_KEYS = Symbol( `vOnKeysGuard` );
-  const V_SHOW = Symbol( `vShow` );
-  const TRANSITION$1 = Symbol( `Transition` );
-  const TRANSITION_GROUP = Symbol( `TransitionGroup` );
-  registerRuntimeHelpers({
-      [V_MODEL_RADIO]: `vModelRadio`,
-      [V_MODEL_CHECKBOX]: `vModelCheckbox`,
-      [V_MODEL_TEXT]: `vModelText`,
-      [V_MODEL_SELECT]: `vModelSelect`,
-      [V_MODEL_DYNAMIC]: `vModelDynamic`,
-      [V_ON_WITH_MODIFIERS]: `withModifiers`,
-      [V_ON_WITH_KEYS]: `withKeys`,
-      [V_SHOW]: `vShow`,
-      [TRANSITION$1]: `Transition`,
-      [TRANSITION_GROUP]: `TransitionGroup`
-  });
-
-  /* eslint-disable no-restricted-globals */
-  let decoder;
-  function decodeHtmlBrowser(raw) {
-      (decoder || (decoder = document.createElement('div'))).innerHTML = raw;
-      return decoder.textContent;
-  }
-
-  const isRawTextContainer = /*#__PURE__*/ makeMap('style,iframe,script,noscript', true);
-  const parserOptions = {
-      isVoidTag,
-      isNativeTag: tag => isHTMLTag(tag) || isSVGTag(tag),
-      isPreTag: tag => tag === 'pre',
-      decodeEntities:  decodeHtmlBrowser ,
-      isBuiltInComponent: (tag) => {
-          if (isBuiltInType(tag, `Transition`)) {
-              return TRANSITION$1;
-          }
-          else if (isBuiltInType(tag, `TransitionGroup`)) {
-              return TRANSITION_GROUP;
-          }
-      },
-      // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
-      getNamespace(tag, parent) {
-          let ns = parent ? parent.ns : 0 /* HTML */;
-          if (parent && ns === 2 /* MATH_ML */) {
-              if (parent.tag === 'annotation-xml') {
-                  if (tag === 'svg') {
-                      return 1 /* SVG */;
-                  }
-                  if (parent.props.some(a => a.type === 6 /* ATTRIBUTE */ &&
-                      a.name === 'encoding' &&
-                      a.value != null &&
-                      (a.value.content === 'text/html' ||
-                          a.value.content === 'application/xhtml+xml'))) {
-                      ns = 0 /* HTML */;
-                  }
-              }
-              else if (/^m(?:[ions]|text)$/.test(parent.tag) &&
-                  tag !== 'mglyph' &&
-                  tag !== 'malignmark') {
-                  ns = 0 /* HTML */;
-              }
-          }
-          else if (parent && ns === 1 /* SVG */) {
-              if (parent.tag === 'foreignObject' ||
-                  parent.tag === 'desc' ||
-                  parent.tag === 'title') {
-                  ns = 0 /* HTML */;
-              }
-          }
-          if (ns === 0 /* HTML */) {
-              if (tag === 'svg') {
-                  return 1 /* SVG */;
-              }
-              if (tag === 'math') {
-                  return 2 /* MATH_ML */;
-              }
-          }
-          return ns;
-      },
-      // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
-      getTextMode({ tag, ns }) {
-          if (ns === 0 /* HTML */) {
-              if (tag === 'textarea' || tag === 'title') {
-                  return 1 /* RCDATA */;
-              }
-              if (isRawTextContainer(tag)) {
-                  return 2 /* RAWTEXT */;
-              }
-          }
-          return 0 /* DATA */;
-      }
-  };
-
-  // Parse inline CSS strings for static style attributes into an object.
-  // This is a NodeTransform since it works on the static `style` attribute and
-  // converts it into a dynamic equivalent:
-  // style="color: red" -> :style='{ "color": "red" }'
-  // It is then processed by `transformElement` and included in the generated
-  // props.
-  const transformStyle = node => {
-      if (node.type === 1 /* ELEMENT */) {
-          node.props.forEach((p, i) => {
-              if (p.type === 6 /* ATTRIBUTE */ && p.name === 'style' && p.value) {
-                  // replace p with an expression node
-                  node.props[i] = {
-                      type: 7 /* DIRECTIVE */,
-                      name: `bind`,
-                      arg: createSimpleExpression(`style`, true, p.loc),
-                      exp: parseInlineCSS(p.value.content, p.loc),
-                      modifiers: [],
-                      loc: p.loc
-                  };
-              }
-          });
-      }
-  };
-  const parseInlineCSS = (cssText, loc) => {
-      const normalized = parseStringStyle(cssText);
-      return createSimpleExpression(JSON.stringify(normalized), false, loc, 3 /* CAN_STRINGIFY */);
-  };
-
-  function createDOMCompilerError(code, loc) {
-      return createCompilerError(code, loc,  DOMErrorMessages );
-  }
-  const DOMErrorMessages = {
-      [49 /* X_V_HTML_NO_EXPRESSION */]: `v-html is missing expression.`,
-      [50 /* X_V_HTML_WITH_CHILDREN */]: `v-html will override element children.`,
-      [51 /* X_V_TEXT_NO_EXPRESSION */]: `v-text is missing expression.`,
-      [52 /* X_V_TEXT_WITH_CHILDREN */]: `v-text will override element children.`,
-      [53 /* X_V_MODEL_ON_INVALID_ELEMENT */]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
-      [54 /* X_V_MODEL_ARG_ON_ELEMENT */]: `v-model argument is not supported on plain elements.`,
-      [55 /* X_V_MODEL_ON_FILE_INPUT_ELEMENT */]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
-      [56 /* X_V_MODEL_UNNECESSARY_VALUE */]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
-      [57 /* X_V_SHOW_NO_EXPRESSION */]: `v-show is missing expression.`,
-      [58 /* X_TRANSITION_INVALID_CHILDREN */]: `<Transition> expects exactly one child element or component.`,
-      [59 /* X_IGNORED_SIDE_EFFECT_TAG */]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
-  };
-
-  const transformVHtml = (dir, node, context) => {
-      const { exp, loc } = dir;
-      if (!exp) {
-          context.onError(createDOMCompilerError(49 /* X_V_HTML_NO_EXPRESSION */, loc));
-      }
-      if (node.children.length) {
-          context.onError(createDOMCompilerError(50 /* X_V_HTML_WITH_CHILDREN */, loc));
-          node.children.length = 0;
-      }
-      return {
-          props: [
-              createObjectProperty(createSimpleExpression(`innerHTML`, true, loc), exp || createSimpleExpression('', true))
-          ]
-      };
-  };
-
-  const transformVText = (dir, node, context) => {
-      const { exp, loc } = dir;
-      if (!exp) {
-          context.onError(createDOMCompilerError(51 /* X_V_TEXT_NO_EXPRESSION */, loc));
-      }
-      if (node.children.length) {
-          context.onError(createDOMCompilerError(52 /* X_V_TEXT_WITH_CHILDREN */, loc));
-          node.children.length = 0;
-      }
-      return {
-          props: [
-              createObjectProperty(createSimpleExpression(`textContent`, true), exp
-                  ? createCallExpression(context.helperString(TO_DISPLAY_STRING), [exp], loc)
-                  : createSimpleExpression('', true))
-          ]
-      };
-  };
-
-  const transformModel$1 = (dir, node, context) => {
-      const baseResult = transformModel(dir, node, context);
-      // base transform has errors OR component v-model (only need props)
-      if (!baseResult.props.length || node.tagType === 1 /* COMPONENT */) {
-          return baseResult;
-      }
-      if (dir.arg) {
-          context.onError(createDOMCompilerError(54 /* X_V_MODEL_ARG_ON_ELEMENT */, dir.arg.loc));
-      }
-      function checkDuplicatedValue() {
-          const value = findProp(node, 'value');
-          if (value) {
-              context.onError(createDOMCompilerError(56 /* X_V_MODEL_UNNECESSARY_VALUE */, value.loc));
-          }
-      }
-      const { tag } = node;
-      const isCustomElement = context.isCustomElement(tag);
-      if (tag === 'input' ||
-          tag === 'textarea' ||
-          tag === 'select' ||
-          isCustomElement) {
-          let directiveToUse = V_MODEL_TEXT;
-          let isInvalidType = false;
-          if (tag === 'input' || isCustomElement) {
-              const type = findProp(node, `type`);
-              if (type) {
-                  if (type.type === 7 /* DIRECTIVE */) {
-                      // :type="foo"
-                      directiveToUse = V_MODEL_DYNAMIC;
-                  }
-                  else if (type.value) {
-                      switch (type.value.content) {
-                          case 'radio':
-                              directiveToUse = V_MODEL_RADIO;
-                              break;
-                          case 'checkbox':
-                              directiveToUse = V_MODEL_CHECKBOX;
-                              break;
-                          case 'file':
-                              isInvalidType = true;
-                              context.onError(createDOMCompilerError(55 /* X_V_MODEL_ON_FILE_INPUT_ELEMENT */, dir.loc));
-                              break;
-                          default:
-                              // text type
-                               checkDuplicatedValue();
-                              break;
-                      }
-                  }
-              }
-              else if (hasDynamicKeyVBind(node)) {
-                  // element has bindings with dynamic keys, which can possibly contain
-                  // "type".
-                  directiveToUse = V_MODEL_DYNAMIC;
-              }
-              else {
-                  // text type
-                   checkDuplicatedValue();
-              }
-          }
-          else if (tag === 'select') {
-              directiveToUse = V_MODEL_SELECT;
-          }
-          else {
-              // textarea
-               checkDuplicatedValue();
-          }
-          // inject runtime directive
-          // by returning the helper symbol via needRuntime
-          // the import will replaced a resolveDirective call.
-          if (!isInvalidType) {
-              baseResult.needRuntime = context.helper(directiveToUse);
-          }
-      }
-      else {
-          context.onError(createDOMCompilerError(53 /* X_V_MODEL_ON_INVALID_ELEMENT */, dir.loc));
-      }
-      // native vmodel doesn't need the `modelValue` props since they are also
-      // passed to the runtime as `binding.value`. removing it reduces code size.
-      baseResult.props = baseResult.props.filter(p => !(p.key.type === 4 /* SIMPLE_EXPRESSION */ &&
-          p.key.content === 'modelValue'));
-      return baseResult;
-  };
-
-  const isEventOptionModifier = /*#__PURE__*/ makeMap(`passive,once,capture`);
-  const isNonKeyModifier = /*#__PURE__*/ makeMap(
-  // event propagation management
-`stop,prevent,self,`   +
-      // system modifiers + exact
-      `ctrl,shift,alt,meta,exact,` +
-      // mouse
-      `middle`);
-  // left & right could be mouse or key modifiers based on event type
-  const maybeKeyModifier = /*#__PURE__*/ makeMap('left,right');
-  const isKeyboardEvent = /*#__PURE__*/ makeMap(`onkeyup,onkeydown,onkeypress`, true);
-  const resolveModifiers = (key, modifiers) => {
-      const keyModifiers = [];
-      const nonKeyModifiers = [];
-      const eventOptionModifiers = [];
-      for (let i = 0; i < modifiers.length; i++) {
-          const modifier = modifiers[i];
-          if (isEventOptionModifier(modifier)) {
-              // eventOptionModifiers: modifiers for addEventListener() options,
-              // e.g. .passive & .capture
-              eventOptionModifiers.push(modifier);
-          }
-          else {
-              // runtimeModifiers: modifiers that needs runtime guards
-              if (maybeKeyModifier(modifier)) {
-                  if (isStaticExp(key)) {
-                      if (isKeyboardEvent(key.content)) {
-                          keyModifiers.push(modifier);
-                      }
-                      else {
-                          nonKeyModifiers.push(modifier);
-                      }
-                  }
-                  else {
-                      keyModifiers.push(modifier);
-                      nonKeyModifiers.push(modifier);
-                  }
-              }
-              else {
-                  if (isNonKeyModifier(modifier)) {
-                      nonKeyModifiers.push(modifier);
-                  }
-                  else {
-                      keyModifiers.push(modifier);
-                  }
-              }
-          }
-      }
-      return {
-          keyModifiers,
-          nonKeyModifiers,
-          eventOptionModifiers
-      };
-  };
-  const transformClick = (key, event) => {
-      const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === 'onclick';
-      return isStaticClick
-          ? createSimpleExpression(event, true)
-          : key.type !== 4 /* SIMPLE_EXPRESSION */
-              ? createCompoundExpression([
-                  `(`,
-                  key,
-                  `) === "onClick" ? "${event}" : (`,
-                  key,
-                  `)`
-              ])
-              : key;
-  };
-  const transformOn$1 = (dir, node, context) => {
-      return transformOn(dir, node, context, baseResult => {
-          const { modifiers } = dir;
-          if (!modifiers.length)
-              return baseResult;
-          let { key, value: handlerExp } = baseResult.props[0];
-          const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers);
-          // normalize click.right and click.middle since they don't actually fire
-          if (nonKeyModifiers.includes('right')) {
-              key = transformClick(key, `onContextmenu`);
-          }
-          if (nonKeyModifiers.includes('middle')) {
-              key = transformClick(key, `onMouseup`);
-          }
-          if (nonKeyModifiers.length) {
-              handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
-                  handlerExp,
-                  JSON.stringify(nonKeyModifiers)
-              ]);
-          }
-          if (keyModifiers.length &&
-              // if event name is dynamic, always wrap with keys guard
-              (!isStaticExp(key) || isKeyboardEvent(key.content))) {
-              handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [
-                  handlerExp,
-                  JSON.stringify(keyModifiers)
-              ]);
-          }
-          if (eventOptionModifiers.length) {
-              const modifierPostfix = eventOptionModifiers.map(capitalize).join('');
-              key = isStaticExp(key)
-                  ? createSimpleExpression(`${key.content}${modifierPostfix}`, true)
-                  : createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
-          }
-          return {
-              props: [createObjectProperty(key, handlerExp)]
-          };
-      });
-  };
-
-  const transformShow = (dir, node, context) => {
-      const { exp, loc } = dir;
-      if (!exp) {
-          context.onError(createDOMCompilerError(57 /* X_V_SHOW_NO_EXPRESSION */, loc));
-      }
-      return {
-          props: [],
-          needRuntime: context.helper(V_SHOW)
-      };
-  };
-
-  const warnTransitionChildren = (node, context) => {
-      if (node.type === 1 /* ELEMENT */ &&
-          node.tagType === 1 /* COMPONENT */) {
-          const component = context.isBuiltInComponent(node.tag);
-          if (component === TRANSITION$1) {
-              return () => {
-                  if (node.children.length && hasMultipleChildren(node)) {
-                      context.onError(createDOMCompilerError(58 /* X_TRANSITION_INVALID_CHILDREN */, {
-                          start: node.children[0].loc.start,
-                          end: node.children[node.children.length - 1].loc.end,
-                          source: ''
-                      }));
-                  }
-              };
-          }
-      }
-  };
-  function hasMultipleChildren(node) {
-      // #1352 filter out potential comment nodes.
-      const children = (node.children = node.children.filter(c => c.type !== 3 /* COMMENT */));
-      const child = children[0];
-      return (children.length !== 1 ||
-          child.type === 11 /* FOR */ ||
-          (child.type === 9 /* IF */ && child.branches.some(hasMultipleChildren)));
-  }
-
-  const ignoreSideEffectTags = (node, context) => {
-      if (node.type === 1 /* ELEMENT */ &&
-          node.tagType === 0 /* ELEMENT */ &&
-          (node.tag === 'script' || node.tag === 'style')) {
-          context.onError(createDOMCompilerError(59 /* X_IGNORED_SIDE_EFFECT_TAG */, node.loc));
-          context.removeNode();
-      }
-  };
-
-  const DOMNodeTransforms = [
-      transformStyle,
-      ...( [warnTransitionChildren] )
-  ];
-  const DOMDirectiveTransforms = {
-      cloak: noopDirectiveTransform,
-      html: transformVHtml,
-      text: transformVText,
-      model: transformModel$1,
-      on: transformOn$1,
-      show: transformShow
-  };
-  function compile$1(template, options = {}) {
-      return baseCompile(template, extend({}, parserOptions, options, {
-          nodeTransforms: [
-              // ignore <script> and <tag>
-              // this is not put inside DOMNodeTransforms because that list is used
-              // by compiler-ssr to generate vnode fallback branches
-              ignoreSideEffectTags,
-              ...DOMNodeTransforms,
-              ...(options.nodeTransforms || [])
-          ],
-          directiveTransforms: extend({}, DOMDirectiveTransforms, options.directiveTransforms || {}),
-          transformHoist:  null
-      }));
-  }
-
-  // This entry is the "full-build" that includes both the runtime
-   initDev();
-  const compileCache = Object.create(null);
-  function compileToFunction(template, options) {
-      if (!isString(template)) {
-          if (template.nodeType) {
-              template = template.innerHTML;
-          }
-          else {
-               warn(`invalid template option: `, template);
-              return NOOP;
-          }
-      }
-      const key = template;
-      const cached = compileCache[key];
-      if (cached) {
-          return cached;
-      }
-      if (template[0] === '#') {
-          const el = document.querySelector(template);
-          if ( !el) {
-              warn(`Template element not found or is empty: ${template}`);
-          }
-          // __UNSAFE__
-          // Reason: potential execution of JS expressions in in-DOM template.
-          // The user must make sure the in-DOM template is trusted. If it's rendered
-          // by the server, the template should not contain any user data.
-          template = el ? el.innerHTML : ``;
-      }
-      const { code } = compile$1(template, extend({
-          hoistStatic: true,
-          onError(err) {
-              {
-                  const message = `Template compilation error: ${err.message}`;
-                  const codeFrame = err.loc &&
-                      generateCodeFrame(template, err.loc.start.offset, err.loc.end.offset);
-                  warn(codeFrame ? `${message}\n${codeFrame}` : message);
-              }
-          }
-      }, options));
-      // The wildcard import results in a huge object with every export
-      // with keys that cannot be mangled, and can be quite heavy size-wise.
-      // In the global build we know `Vue` is available globally so we can avoid
-      // the wildcard object.
-      const render = ( new Function(code)()
-          );
-      render._rc = true;
-      return (compileCache[key] = render);
-  }
-  registerRuntimeCompiler(compileToFunction);
-
-  exports.BaseTransition = BaseTransition;
-  exports.Comment = Comment;
-  exports.Fragment = Fragment;
-  exports.KeepAlive = KeepAlive;
-  exports.Static = Static;
-  exports.Suspense = Suspense;
-  exports.Teleport = Teleport;
-  exports.Text = Text;
-  exports.Transition = Transition;
-  exports.TransitionGroup = TransitionGroup;
-  exports.callWithAsyncErrorHandling = callWithAsyncErrorHandling;
-  exports.callWithErrorHandling = callWithErrorHandling;
-  exports.camelize = camelize;
-  exports.capitalize = capitalize;
-  exports.cloneVNode = cloneVNode;
-  exports.compile = compileToFunction;
-  exports.computed = computed$1;
-  exports.createApp = createApp;
-  exports.createBlock = createBlock;
-  exports.createCommentVNode = createCommentVNode;
-  exports.createHydrationRenderer = createHydrationRenderer;
-  exports.createRenderer = createRenderer;
-  exports.createSSRApp = createSSRApp;
-  exports.createSlots = createSlots;
-  exports.createStaticVNode = createStaticVNode;
-  exports.createTextVNode = createTextVNode;
-  exports.createVNode = createVNode;
-  exports.customRef = customRef;
-  exports.defineAsyncComponent = defineAsyncComponent;
-  exports.defineComponent = defineComponent;
-  exports.defineEmit = defineEmit;
-  exports.defineProps = defineProps;
-  exports.getCurrentInstance = getCurrentInstance;
-  exports.getTransitionRawChildren = getTransitionRawChildren;
-  exports.h = h;
-  exports.handleError = handleError;
-  exports.hydrate = hydrate;
-  exports.initCustomFormatter = initCustomFormatter;
-  exports.inject = inject;
-  exports.isProxy = isProxy;
-  exports.isReactive = isReactive;
-  exports.isReadonly = isReadonly;
-  exports.isRef = isRef;
-  exports.isVNode = isVNode;
-  exports.markRaw = markRaw;
-  exports.mergeProps = mergeProps;
-  exports.nextTick = nextTick;
-  exports.onActivated = onActivated;
-  exports.onBeforeMount = onBeforeMount;
-  exports.onBeforeUnmount = onBeforeUnmount;
-  exports.onBeforeUpdate = onBeforeUpdate;
-  exports.onDeactivated = onDeactivated;
-  exports.onErrorCaptured = onErrorCaptured;
-  exports.onMounted = onMounted;
-  exports.onRenderTracked = onRenderTracked;
-  exports.onRenderTriggered = onRenderTriggered;
-  exports.onUnmounted = onUnmounted;
-  exports.onUpdated = onUpdated;
-  exports.openBlock = openBlock;
-  exports.popScopeId = popScopeId;
-  exports.provide = provide;
-  exports.proxyRefs = proxyRefs;
-  exports.pushScopeId = pushScopeId;
-  exports.queuePostFlushCb = queuePostFlushCb;
-  exports.reactive = reactive;
-  exports.readonly = readonly;
-  exports.ref = ref;
-  exports.registerRuntimeCompiler = registerRuntimeCompiler;
-  exports.render = render;
-  exports.renderList = renderList;
-  exports.renderSlot = renderSlot;
-  exports.resolveComponent = resolveComponent;
-  exports.resolveDirective = resolveDirective;
-  exports.resolveDynamicComponent = resolveDynamicComponent;
-  exports.resolveTransitionHooks = resolveTransitionHooks;
-  exports.setBlockTracking = setBlockTracking;
-  exports.setDevtoolsHook = setDevtoolsHook;
-  exports.setTransitionHooks = setTransitionHooks;
-  exports.shallowReactive = shallowReactive;
-  exports.shallowReadonly = shallowReadonly;
-  exports.shallowRef = shallowRef;
-  exports.ssrContextKey = ssrContextKey;
-  exports.ssrUtils = ssrUtils;
-  exports.toDisplayString = toDisplayString;
-  exports.toHandlerKey = toHandlerKey;
-  exports.toHandlers = toHandlers;
-  exports.toRaw = toRaw;
-  exports.toRef = toRef;
-  exports.toRefs = toRefs;
-  exports.transformVNodeArgs = transformVNodeArgs;
-  exports.triggerRef = triggerRef;
-  exports.unref = unref;
-  exports.useContext = useContext;
-  exports.useCssModule = useCssModule;
-  exports.useCssVars = useCssVars;
-  exports.useSSRContext = useSSRContext;
-  exports.useTransitionState = useTransitionState;
-  exports.vModelCheckbox = vModelCheckbox;
-  exports.vModelDynamic = vModelDynamic;
-  exports.vModelRadio = vModelRadio;
-  exports.vModelSelect = vModelSelect;
-  exports.vModelText = vModelText;
-  exports.vShow = vShow;
-  exports.version = version;
-  exports.warn = warn;
-  exports.watch = watch;
-  exports.watchEffect = watchEffect;
-  exports.withCtx = withCtx;
-  exports.withDirectives = withDirectives;
-  exports.withKeys = withKeys;
-  exports.withModifiers = withModifiers;
-  exports.withScopeId = withScopeId;
-
-  Object.defineProperty(exports, '__esModule', { value: true });
-
-  return exports;
-
-}({}));
Index: ews/js/wpsg-block-product.js
===================================================================
--- /views/js/wpsg-block-product.js	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-!function(e){var t={};function r(l){if(t[l])return t[l].exports;var n=t[l]={i:l,l:!1,exports:{}};return e[l].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,l){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:l})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(r.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(l,n,function(t){return e[t]}.bind(null,n));return l},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=2)}([function(e,t){!function(){e.exports=this.wp.element}()},function(e,t){!function(){e.exports=this.wp.components}()},function(e,t,r){"use strict";r.r(t);var l=r(0),n=r(1);(0,wp.blocks.registerBlockType)("wpsg/product",{title:"Produkt(e)",attributes:{product:{type:"string",default:"0"},template:{type:"string",default:"standard.phtml"},hide_title:{type:"string",default:"0"}},icon:Object(l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"200",height:"200",x:"0",y:"0",version:"1.1",viewBox:"0 0 200 200",xmlSpace:"preserve"},Object(l.createElement)("path",{fill:"#C4D00C",d:"M105.023 9.465c-50.1 0-90.71 40.613-90.71 90.706 0 50.096 40.61 90.708 90.71 90.708 50.101 0 90.703-40.612 90.703-90.708.001-50.093-40.602-90.706-90.703-90.706zm-.07 157.155c-36.734 0-66.518-29.778-66.518-66.512s29.783-66.521 66.518-66.521c36.733 0 66.516 29.786 66.516 66.521 0 36.734-29.782 66.512-66.516 66.512z"}),Object(l.createElement)("path",{fill:"#153C67",d:"M102.003 142.499c0 8.349-6.771 15.122-15.122 15.122-8.349 0-15.117-6.773-15.117-15.122 0-8.346 6.769-15.114 15.117-15.114 8.35 0 15.122 6.768 15.122 15.114zM138.28 142.499c0 8.349-6.767 15.122-15.115 15.122-8.352 0-15.12-6.773-15.12-15.122 0-8.346 6.769-15.114 15.12-15.114 8.349 0 15.115 6.768 15.115 15.114zM141.306 57.846H98.975c-8.349 0-15.115 6.767-15.115 15.114 0 8.354 6.767 15.122 15.115 15.122h21.352l-2.011 6.046h-32.52l-3.953-5.864-.005-.012c-.006-.001-.009-.008-.011-.014l-8.436-12.499c-.005-.004-.005-.013-.014-.017 0-.007-.004-.01-.01-.019l-8.431-12.5c-.006-.007-.01-.011-.013-.018-.004 0-.004-.006-.012-.01l-8.432-12.498c0-.008-.009-.01-.011-.018-.003-.006-.007-.012-.01-.012L48.02 38.144c-.005-.01-.005-.015-.011-.023a15.112 15.112 0 00-12.533-6.659H20.361c-8.35 0-15.118 6.768-15.118 15.116 0 8.351 6.769 15.118 15.118 15.118h7.085l3.961 5.874 8.455 12.532 8.456 12.528v.009l8.452 12.52v.006h.002l8.46 12.532.027-.021c2.718 4.03 7.324 6.683 12.551 6.683h51.399c6.807 0 12.558-4.495 14.451-10.686l11.821-35.466c.608-1.635.938-3.403.938-5.25.001-8.345-6.766-15.111-15.113-15.111z"})),category:"layout",edit:function(e){var t=e.attributes,r=e.setAttributes,o=e.className,c=t.product,u=t.template,i=t.hide_title;return Object(l.createElement)("div",{className:o},Object(l.createElement)(n.SelectControl,{value:c,label:wpsg_block_product.label.product,onChange:function(e){r({product:e})},options:wpsg_block_product.arProductSelect}),Object(l.createElement)(n.SelectControl,{value:u,label:wpsg_block_product.label.template,onChange:function(e){r({template:e})},options:wpsg_block_product.arTemplateSelect}),Object(l.createElement)(n.SelectControl,{value:i,label:wpsg_block_product.label.hide_title,onChange:function(e){r({hide_title:e})},options:wpsg_block_product.arHideTitleSelect}))},save:function(e){return null}})}]);
Index: /views/mailtemplates/adminmail.phtml
===================================================================
--- /views/mailtemplates/adminmail.phtml	(revision 8528)
+++ /views/mailtemplates/adminmail.phtml	(revision 5261)
@@ -6,7 +6,7 @@
 
 	$this->htmlMail = false;
- 
-	$oCustomer = wpsg_customer::getInstance(intval($this->view['basket']['checkout']['k_id']));
-    
+
+	//wpsg_debug($this->view);
+
 ?><?php echo __('Hallo Administrator,', 'wpsg'); ?> 
  
@@ -19,17 +19,14 @@
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.$this->view['basket']['checkout']['nr']); ?>    
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse']; ?>    
+<?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?> 
 <?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
 <?php echo wpsg_pad_right(__('USt.IdNr.', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['ustidnr']; ?> 
 <?php } ?>
 
-<?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['plz']; ?> <?php echo $this->view['basket']['checkout']['ort']; ?> 
-<?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?> 
+<?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['plz']; ?> <?php echo $this->view['basket']['checkout']['ort']; ?>  
 <?php echo wpsg_pad_right(__('Telefon', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['tel']; ?> 
 <?php echo wpsg_pad_right(__('Fax', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['fax']; ?> 
-<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>
-<?php $email_einvoice = $oCustomer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-<?php echo wpsg_pad_right(__('E-Mail (eRechnung)', 'wpsg').':', 35); ?><?php echo $email_einvoice; ?>
-<?php } ?>
+<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>  
 
 <?php echo __('Lieferadresse:', 'wpsg'); ?> 
@@ -37,5 +34,5 @@
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_vname']; ?> <?php echo $this->view['basket']['checkout']['shipping_name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_strasse'].' '.wpsg_getStr($this->view['basket']['checkout']['shipping_nr']); ?>
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_strasse']; ?>    
 <?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_plz']; ?> <?php echo $this->view['basket']['checkout']['shipping_ort']; ?>
 
@@ -48,5 +45,5 @@
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.$this->view['basket']['checkout']['nr']); ?>    
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse']; ?>    
 <?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
 <?php echo wpsg_pad_right(__('USt.IdNr.', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['ustidnr']; ?> 
@@ -58,7 +55,4 @@
 <?php echo wpsg_pad_right(__('Fax', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['fax']; ?> 
 <?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>  
-<?php $email_einvoice = $oCustomer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-<?php echo wpsg_pad_right(__('E-Mail (eRechnung)', 'wpsg').':', 35); ?><?php echo $email_einvoice; ?>
-<?php } ?>
 
 <?php } ?>
@@ -67,5 +61,5 @@
 <?php echo wpsg_pad_right(__('Bestellnummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['onr']; ?> 
 <?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo date("d.m.Y H:i:s", $this->view['basket']['checkout']['datum']); ?> 
-<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?> 
+<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> 
 <?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
 
@@ -79,5 +73,6 @@
 <?php echo wpsg_pad_right(__('Zahlungsart', 'wpsg').':', 35); ?><?php echo $this->arPayment[$this->view['basket']['checkout']['payment']]['name']; ?>  
 <?php $this->callMods('mail_payment'); ?>
-        
+    
+<?php echo wpsg_pad_right(__('Bestellung', 'wpsg').':', 35); ?><?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$this->view['o_id']; ?>    
 <?php echo $this->render(WPSG_PATH_VIEW.'/mailtemplates/order.phtml'); ?>
 
Index: /views/mailtemplates/html/adminmail.phtml
===================================================================
--- /views/mailtemplates/html/adminmail.phtml	(revision 8528)
+++ /views/mailtemplates/html/adminmail.phtml	(revision 5261)
@@ -3,6 +3,4 @@
 	/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
 	$this->htmlMail = true;
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?>
@@ -16,9 +14,9 @@
 <br />
 
-<h2><?php echo __('Warenkorb', 'wpsg'); ?>:</h2>
+<h2><?php echo __('Warenkorb', 'wpsg'); ?> <a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$this->view['o_id']; ?>"><?php echo __('Bestellverwaltung', 'wpsg'); ?></a>:</h2>
 
 <?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml'); ?> 
 
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
+<?php $this->callMods('mail_aftercalculation', array(&$this->view['basket']['checkout']['o_id'])); ?> 
 
 <?php if (wpsg_isSizedString($this->view['basket']['checkout']['comment'])) { ?>
Index: /views/mailtemplates/html/customer.phtml
===================================================================
--- /views/mailtemplates/html/customer.phtml	(revision 8528)
+++ /views/mailtemplates/html/customer.phtml	(revision 5261)
@@ -1,8 +1,2 @@
-<?php
-
-	$oCustomer = wpsg_customer::getInstance(intval($this->view['basket']['checkout']['k_id']));
-	
-?>
-
 <?php if ($this->hasMod('wpsg_mod_shippingadress') && $this->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array('k_id' => $this->view['basket']['checkout']['k_id'], 'o_id' => $this->view['o_id']))) { ?>
 <h2><?php echo __('Rechnungsadresse:', 'wpsg'); ?></h2> 
@@ -19,5 +13,74 @@
 	<tr>
 		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['strasse'].rtrim(' '._($this->view['basket']['checkout']['nr']??''))); ?></td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['strasse']); ?></td>	
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Land', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['land']['name']); ?></td>
+	</tr>
+	<?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('USt.IdNr.', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['ustidnr']); ?></td>
+	</tr>
+	<?php } ?>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Ort', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['plz'].' '.$this->view['basket']['checkout']['ort']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Telefon', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['tel']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Fax', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['fax']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('E-Mail Adresse', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><a href="mailto:<?php echo wpsg_hspc($this->view['basket']['checkout']['email']); ?>"><?php echo wpsg_hspc($this->view['basket']['checkout']['email']); ?></a></td>
+	</tr>	
+</table>
+
+<h2><?php echo __('Lieferadresse', 'wpsg'); ?>:</h2>
+
+<table class="contenttable">
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Firma', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_firma']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Name', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_vname'].' '.$this->view['basket']['checkout']['shipping_name']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_strasse']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Ort', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_plz'].' '.$this->view['basket']['checkout']['shipping_ort']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Land', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['shipping_land']['name']); ?></td>
+	</tr>
+</table>
+<?php } else { ?>
+
+<h2><?php echo __('Rechnungs- /Lieferadresse', 'wpsg'); ?>:</h2>
+
+<table class="contenttable">
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Firma', 'wpsg'); ?></td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['firma']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Name', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['vname'].' '.$this->view['basket']['checkout']['name']); ?></td>
+	</tr>
+	<tr>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['strasse']); ?></td>
 	</tr>
 	<?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
@@ -47,85 +110,4 @@
 		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><a href="mailto:<?php echo wpsg_hspc($this->view['basket']['checkout']['email']); ?>"><?php echo wpsg_hspc($this->view['basket']['checkout']['email']); ?></a></td>
 	</tr>
-	<?php $email_einvoice = $oCustomer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('E-Mail (eRechnung)', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><a href="mailto:<?php echo htmlspecialchars($email_einvoice); ?>"><?php echo htmlspecialchars($email_einvoice); ?></a></td>
-	</tr>
-	<?php } ?>
-</table>
-
-<h2><?php echo __('Lieferadresse', 'wpsg'); ?>:</h2>
-
-<table class="contenttable">
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Firma', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_firma']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Name', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_vname'].' '.$this->view['basket']['checkout']['shipping_name']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_strasse'].' '.$this->view['basket']['checkout']['shipping_nr']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Ort', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_plz'].' '.$this->view['basket']['checkout']['shipping_ort']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Land', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['shipping_land']['name']); ?></td>
-	</tr>
-</table>
-<?php } else { ?>
-
-<h2><?php echo __('Rechnungs-/Lieferadresse', 'wpsg'); ?>:</h2>
-
-<table class="contenttable">
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Firma', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['firma']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Name', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['vname'].' '.$this->view['basket']['checkout']['name']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['strasse'].rtrim(($this->view['basket']['checkout']['nr']))); ?></td>
-	</tr>
-	<?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('USt.IdNr.', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['ustidnr']); ?></td>
-	</tr>
-	<?php } ?>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Ort', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['plz'].' '.$this->view['basket']['checkout']['ort']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Land', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['land']['name']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Telefon', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['tel']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Fax', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wpsg_hspc($this->view['basket']['checkout']['fax']); ?></td>
-	</tr>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('E-Mail Adresse', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><a href="mailto:<?php echo wpsg_hspc($this->view['basket']['checkout']['email']); ?>"><?php echo wpsg_hspc($this->view['basket']['checkout']['email']); ?></a></td>
-	</tr>
-	<?php $email_einvoice = $oCustomer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('E-Mail (eRechnung)', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><a href="mailto:<?php echo htmlspecialchars($email_einvoice); ?>"><?php echo htmlspecialchars($email_einvoice); ?></a></td>
-	</tr>
-	<?php } ?>
 </table>
 
@@ -149,5 +131,5 @@
 	<tr>
 		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Rechnungsbetrag', 'wpsg'); ?>:</td>
-		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><strong><?php echo wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?></strong></td>
+		<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><strong><?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?></strong></td>
 	</tr>
 	<?php if ($this->get_option('wpsg_kleinunternehmer') != '1') { ?>
@@ -175,20 +157,14 @@
 		<td style="padding:2px; line-height:100%; vertical-align:top;" class="col0"><?php echo __('Versandart', 'wpsg'); ?>:</td>
 		<td style="padding:2px; line-height:100%; vertical-align:top;" class="col1">
-			<?php echo wpsg_hspc($this->arShipping[$this->view['basket']['checkout']['shipping']]['name']); ?>
+			<?php echo $this->arShipping[$this->view['basket']['checkout']['shipping']]['name']; ?>
 			<?php $this->callMods('mail_shipping'); ?> 
 		</td>		
 	</tr>
 	<tr>
-		<td style="padding:2px; line-height:100%; vertical-align:top;" class="col0"><?php echo __('Zahlungsart', 'wpsg'); ?>:
-<br />		
- 
-		
-		
-		</td>
+		<td style="padding:2px; line-height:100%; vertical-align:top;" class="col0"><?php echo __('Zahlungsart', 'wpsg'); ?>:</td>
 		<td style="padding:2px; line-height:100%; vertical-align:top;" class="col1">
-			<?php echo wpsg_hspc($this->arPayment[$this->view['basket']['checkout']['payment']]['name']); ?><br />
+			<?php echo $this->arPayment[$this->view['basket']['checkout']['payment']]['name']; ?><br />
 			<?php $this->callMods('mail_payment'); ?>
 		</td>				
 	</tr>
-	<?php $this->callMods('mail_payment_after'); ?>
 </table>
Index: /views/mailtemplates/html/html_head.phtml
===================================================================
--- /views/mailtemplates/html/html_head.phtml	(revision 8528)
+++ /views/mailtemplates/html/html_head.phtml	(revision 5261)
@@ -3,5 +3,5 @@
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />        
-        <title><?php //echo $this->view['subject']; ?></title>
+        <title><?php echo $this->view['subject']; ?></title>
 		<style type="text/css">
  
Index: /views/mailtemplates/html/kundenmail.phtml
===================================================================
--- /views/mailtemplates/html/kundenmail.phtml	(revision 8528)
+++ /views/mailtemplates/html/kundenmail.phtml	(revision 5261)
@@ -4,11 +4,6 @@
 	$this->htmlMail = true;
 
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
 ?>
-<p><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['basket']['checkout']['title']], $this->view['basket']['checkout']['vname'], $this->view['basket']['checkout']['name']); ?></p>
+<p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['basket']['checkout']['vname'], $this->view['basket']['checkout']['name']); ?></p>
 
 <p><?php echo __('Vielen Dank fÃŒr Ihre Bestellung!', 'wpsg'); ?></p>
@@ -22,5 +17,5 @@
 <?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml'); ?>
 
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
+<?php $this->callMods('mail_aftercalculation', array(&$this->view['basket']['checkout']['o_id'])); ?>
 
 <?php if (wpsg_isSizedString($this->view['basket']['checkout']['comment'])) { ?>
Index: ews/mailtemplates/html/logo.phtml
===================================================================
--- /views/mailtemplates/html/logo.phtml	(revision 8528)
+++ 	(revision )
@@ -1,38 +1,0 @@
-<style>
-	.email-logo { padding-bottom: 10px; }
-	.email-logo-watermark { position:absolute; top:10%; left:0; right:0; display:flex; justify-content:center; align-items:center; }
-</style>
-
-<?php
-	
-	$logoPath = '';
-	
-	if($this->get_option('wpsg_email_logo_activated'))
-	{
-
-		$logoWatermark = $this->get_option('wpsg_email_logo_watermark') ? "email-logo-watermark" : "";
-
-		$logoTransparency = str_replace("#", "", get_option('wpsg_email_logo_transparency'));
-		if($logoTransparency !== "100") $logoTransparency = str_replace(array("0", "00"), "", $logoTransparency);
-		if($logoTransparency !== "100") $logoTransparency = "0." . $logoTransparency;
-
-		$logoAlignment = $this->get_option('wpsg_email_logo_alignment');
-		$logoPath = WPSG_PATH_CONTENT . 'uploads/wpsg/wpsg_mailconf/wpsg_email_logo.jpg';
-
-		if(file_exists($logoPath))
-		{
-			$logoType = mime_content_type($logoPath);
-			$logoData = file_get_contents($logoPath);
-			$logoBase64 = 'data:'.$logoType.';base64,'.base64_encode($logoData);
-		}
-
-	}
-?>
-
-<?php if (file_exists($logoPath) && $this->get_option('wpsg_email_logo_activated')) { ?>
-	
-	<?php echo "<div class='email-logo $logoWatermark' style='text-align:$logoAlignment; opacity:$logoTransparency;'>" ?>
-	<?php echo "<img alt='Emaillogo' class='email-logo-$logoAlignment' src='$logoBase64'>"; ?>
-	<?php echo "</div>"; ?>
-	
-<?php } ?>
Index: /views/mailtemplates/html/order.phtml
===================================================================
--- /views/mailtemplates/html/order.phtml	(revision 8528)
+++ /views/mailtemplates/html/order.phtml	(revision 5261)
@@ -1,11 +1,3 @@
-<?php
-
-    /** @var wpsg_order $oOrder */
-    $oOrder = $this->view['oOrder'];
-
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-	
-?><div class="baskettable_wrap">
+<div class="baskettable_wrap">
 	<table class="baskettable" cellpadding="2" cellspacing="0" style="cell-padding:4px;">
 		<tr class="head">
@@ -27,17 +19,8 @@
 					<tr>
 						<td style="padding:0px; ">
-							<?php if (wpsg_isSizedInt($this->get_option('wpsg_imagehandler_overviewimage'))) {
-
-								if (isset($p['product_key'])) {
-									$bild = $this->imagehandler->getAttachmentID($p['product_key']);
-								} else {
-									$arBilder = $this->imagehandler->getAttachmentIDs($this->getProduktId($p['id']));
-									$bild = $arBilder[0];
-								}
-							?>
-							<?php if (wpsg_isSizedString($bild)) { ?>  				
+							<?php if ($this->hasMod('wpsg_mod_produktbilder') && wpsg_isSizedInt($this->get_option('wpsg_mod_produktbilder_overviewimage'))) { $arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->getProduktId($p['id']))); ?>
+							<?php if (wpsg_isSizedArray($arBilder)) { ?>  				
 							<a style="width:50px; width:50px; margin-right:10px; float:left;" href="<?php echo $this->getProduktLink($this->getProduktId($p['id'])); ?>" title="<?php echo wpsg_hspc(((wpsg_isSizedString($p['detailname'])?$p['detailname']:$p['name']))); ?>">
-								
-								<?php echo wp_get_attachment_image($bild, Array(50, 50)); ?>
+								<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->getProduktId($p['id']), array_shift($arBilder), 50, 50, 'sz')); ?>" alt="<?php echo wpsg_hspc(((wpsg_isSizedString($p['detailname'])?$p['detailname']:$p['name']))); ?>" />
 							</a>
 							<?php } ?>
@@ -78,18 +61,16 @@
 		<?php } ?>
 		<?php } ?>
-		<?php if (wpsg_isSizedArray($this->view['basket']['arCalculation']['voucher'])) { $bLine = true; ?>		
-			<?php foreach ($this->view['basket']['arCalculation']['voucher'] as $gs) { ?>
-				<tr class="voucherrow">
-					<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_pos"> </td>
-					<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name"><?php echo wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $gs['code']); ?></td>
-					<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_price"><?php echo wpsg_ff($gs['set'], ((strpos($gs['set'], '%') !== false)?'%':$this->get_option('wpsg_currency'))); ?></td>
-					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-						<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_mwst"><?php echo __('Anteilig', 'wpsg'); ?></td>
-					<?php } ?>
-					<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_amount">1</td>
-					<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><?php echo wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency')); ?></td>
-				</tr>
+		<?php if (isset($this->view['basket']['gs'])) { ?>
+		<tr class="voucherrow">
+			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_pos"><?php echo $i + 1; ?>.</td>
+			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name"><?php echo wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $this->view['basket']['gs']['code']); ?></td>
+			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_price"><?php echo wpsg_ff($this->view['basket']['gs']['value'], (($this->view['basket']['gs']['calc'] == 'w')?$this->get_option('wpsg_currency'):'%')); ?></td>
+			<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_mwst"><?php echo __('anteilig', 'wpsg'); ?></td>		
 			<?php } ?>
-		<?php } ?>		
+			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_amount">1</td>
+			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?></td> 
+		</tr>
+		<?php } ?>
 		<tr class="spacer">
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="td_bt" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'6':'5'); ?>">&nbsp;</td>
@@ -114,6 +95,5 @@
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_amount">&nbsp;</td>
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?></td>
-		</tr>
-		<?php if ($this->view['basket']['sum']['preis_shipping'] != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?>
+		</tr> 
 		<tr class="shippingtotalrow">
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name" colspan="2"><?php echo __('Versandkosten', 'wpsg'); ?>:</td>
@@ -131,5 +111,4 @@
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><?php echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')); ?></td>
 		</tr>
-		<?php } ?>
 		<?php if (wpsg_isSizedArray($this->view['basket']['shipping']['methods'])) { ?>
 		<?php foreach ($this->view['basket']['shipping']['methods'] as $shipping) { ?>
@@ -157,5 +136,4 @@
 		<?php } ?>
 		<?php } ?>
-		<?php if ($this->view['basket']['sum']['preis_payment'] != 0 || $this->get_option('wpsg_hideemptypayment') != '1') { ?>
 		<tr class="paymenttotalrow">
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name" colspan="2"><?php echo __('Zahlungskosten', 'wpsg'); ?>:</td>
@@ -173,5 +151,4 @@
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><?php echo wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')); ?></td>
 		</tr>
-		<?php } ?>
 		<?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
 		<tr class="smallbuisnessrulerow">
@@ -203,30 +180,5 @@
 			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><strong><?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?></strong></td>
 		</tr>
-		<?php $this->callMods('mail_order_end', [&$this->view['basket']['arCalculation'], true]); ?>	
 	</table>
-
-    <?php
-
-        $arCV = $oOrder->getCustomer()->getCustomerVariables();
-
-        if (wpsg_isSizedArray($arCV)) { ?>
-
-            <strong><?php echo __('Weitere Kundendaten', 'wpsg'); ?>:</strong><br />
-
-            <table>
-
-                <?php foreach ($arCV as $cv) { ?>
-                    <tr>
-                        <th><?php echo $cv['label']; ?></th>
-                        <td><?php echo $cv['value']; ?></td>
-                    </tr>
-                <?php } ?>
-
-            </table>
-
-        <?php }
-
-    ?>
-
 </div>
 	
Index: ews/mailtemplates/html/reminder.phtml
===================================================================
--- /views/mailtemplates/html/reminder.phtml	(revision 8528)
+++ 	(revision )
@@ -1,38 +1,0 @@
-<?php
-
-    declare(strict_types=1);
-
-    /**
-     * Template fÃŒr die Erinnerung bei KaufabbrÃŒchen (HTML)
-     * User: Daschmi
-     * Date: 19.10.2020
-     * Time: 14:20
-     */
-
-    namespace Wpsg;
-
-    /** @var \wpsg_order $oOrder */
-    $oOrder = $this->view['oOrder'];
-
-    /** @var \wpsg_customer $oCustomer */
-    $oCustomer = $oOrder->getCustomer();
-
-    /** @var \wpsg_ShopController $oShop */
-    $oShop = $this;
-
-?>
-
-<p>Hallo <?php echo ltrim($oCustomer->getTitle().' '.$oCustomer->getFirstname().' '.$oCustomer->getName()); ?>,</p>
-
-<p><?php echo __('Sie hatten folgende Artikel in Ihrem Warenkorb:', 'wpsg'); ?></p>
-
-<ul>
-<?php foreach ($oOrder->getOrderProducts() as $oOrderProduct) { ?>
-	<li><a href="<?php echo $oShop->getProduktLink($oOrderProduct->getProductKey()); ?>"><?php echo $oOrderProduct->getProductName(); ?></a></li>
-<?php } ?>
-</ul>
-
-<p><?php echo __('Gab es technische Schwierigkeiten oder sind Sie sich vielleicht noch nicht ganz sicher?', 'wpsg'); ?></p>
-
-<p><?php echo __('Lassen Sie es uns wissen - wir beraten und helfen gern.', 'wpsg'); ?></p>  
- 
Index: /views/mailtemplates/html/status.phtml
===================================================================
--- /views/mailtemplates/html/status.phtml	(revision 8528)
+++ /views/mailtemplates/html/status.phtml	(revision 5261)
@@ -1,19 +1,13 @@
 <?php
 
-/**
- * Dieses Template wird fÃŒr die HTML Mail bei einer StatusÃ€nderung verwendet
- */
+	/**
+	 * Dieses Template wird fÃŒr die HTML Mail bei einer StatusÃ€nderung verwendet
+	 */
 
-/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
-$this->htmlMail = true;
-
-$oCustomer = wpsg_customer::getInstance($this->view['kunde']['id']);
-
-include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
+	/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
+	$this->htmlMail = true;
 
 ?>
-<p><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), $oCustomer->getTitle(), $oCustomer->getFirstname(), $oCustomer->getName()); ?></p>
-
-<br />
+<p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?></p> 
   
 <p><?php echo wpsg_translate(
@@ -24,52 +18,5 @@
    
 <?php $this->callMods('mail_status', array(&$this->view['order'], &$this->view['kunde'])); ?>
-
-<?php if ($this->view['state_new_id'] == '1') { ?>
-	<p><?php echo __('Ihr Auftrag wurde akzeptiert', 'wpsg'); ?></p>
-<?php } ?>    
-    
-<?php if ($this->view['state_new_id'] == '2') { ?>
-	<p><?php echo __('Ihre Bestellung ist unvollstÃ€ndig. Bitte prÃŒfen Sie die Daten!', 'wpsg'); ?></p>			   
-<?php } ?>
-
-<?php if ($this->view['state_new_id'] == '100') { ?>
-	<p><?php echo __('Ihre Zahlung wurde akzeptiert. Vielen Dank!', 'wpsg'); ?></p>
-<?php } ?>
-				
-<?php if ($this->view['state_new_id'] == '200') { ?>
-	<p><?php echo __('Ihre Zahlung wurde nicht akzeptiert. Bitte prÃŒfen Sie den Zahlungsvorgang.', 'wpsg'); ?></p>	   
-<?php } ?>
-				
-<?php if ($this->view['state_new_id'] == '250') { ?>
-    <p><?php echo __('Ihre Ware wurde versendet!', 'wpsg'); ?></p>
-<?php } ?>
-			    
-<?php if ($this->view['state_new_id'] == '300')	{ ?>
-	<p><?php echo __('Ihre Ware wurde zugestellt!', 'wpsg'); ?></p>
-<?php } ?>
-				
-<?php if ($this->view['state_new_id'] == '400') { ?>
-	<p><?php echo __('Ihre Zahlung wurde zurÃŒckgezahlt!', 'wpsg'); ?></p>
-<?php } ?>
-				
-<?php if ($this->view['state_new_id'] == '500') { ?>
-	<p><?php echo __('Ihre Bestellung wurde storniert!', 'wpsg'); ?></p>
-<?php } ?>
-
-
-<?php if ($this->view['state_new_id'] == '600') { ?>
-	<p><?php echo __('Ihr Abo ist aktiv!', 'wpsg'); ?></p>
-<?php } ?>
-
-
-<?php if ($this->view['state_new_id'] == '610')	{ ?>
-	<p><?php echo __('Ihre AbokÃŒndigung steht noch offen.', 'wpsg'); ?></p>
-<?php } ?>
-
-
-<?php if ($this->view['state_new_id'] == '620') { ?>
-	<p><?php echo __('Ihr Abo wurde erfolgreich gekÃŒndigt!', 'wpsg'); ?></p>
-<?php } ?>
-
+  
 <p><?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg'); ?></p>
 
Index: /views/mailtemplates/kundenmail.phtml
===================================================================
--- /views/mailtemplates/kundenmail.phtml	(revision 8528)
+++ /views/mailtemplates/kundenmail.phtml	(revision 5261)
@@ -6,11 +6,8 @@
 
 	$this->htmlMail = false;
-	
-	$arPflicht = $this->loadPflichtFeldDaten();
-	$arTitle = explode('|', $arPflicht['anrede_auswahl']);
-	
-	$oCustomer = wpsg_customer::getInstance(intval($this->view['basket']['checkout']['k_id']));
-	
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['basket']['checkout']['title']], $this->view['basket']['checkout']['vname'], $this->view['basket']['checkout']['name']); ?> 
+
+	//wpsg_debug($this->view);
+
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['basket']['checkout']['vname'], $this->view['basket']['checkout']['name']); ?> 
  
 <?php echo __('vielen Dank fÃŒr Ihre Bestellung.', 'wpsg'); ?>
@@ -22,5 +19,5 @@
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.$this->view['basket']['checkout']['nr']); ?>    
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse']; ?>    
 <?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?> 
 <?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
@@ -31,13 +28,11 @@
 <?php echo wpsg_pad_right(__('Telefon', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['tel']; ?> 
 <?php echo wpsg_pad_right(__('Fax', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['fax']; ?> 
-<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>
-<?php $email_einvoice = $oCustomer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-<?php echo wpsg_pad_right(__('E-Mail (eRechnung)', 'wpsg').':', 35); ?><?php echo $email_einvoice; ?>
-<?php } ?>
+<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>  
+
 <?php echo __('Lieferadresse:', 'wpsg'); ?> 
 
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_vname']; ?> <?php echo $this->view['basket']['checkout']['shipping_name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_strasse'].' '.wpsg_getStr($this->view['basket']['checkout']['shipping_nr']); ?>
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_strasse']; ?>    
 <?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_plz']; ?> <?php echo $this->view['basket']['checkout']['shipping_ort']; ?>
 
@@ -46,9 +41,9 @@
 <?php } else { ?> 
  
-<?php echo __('Rechnungs-/Lieferadresse:', 'wpsg'); ?> 
+<?php echo __('Rechnungs- /Lieferadresse:', 'wpsg'); ?> 
  
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.$this->view['basket']['checkout']['nr']); ?>    
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse']; ?>    
 <?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
 <?php echo wpsg_pad_right(__('USt.IdNr.', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['ustidnr']; ?> 
@@ -59,15 +54,12 @@
 <?php echo wpsg_pad_right(__('Telefon', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['tel']; ?> 
 <?php echo wpsg_pad_right(__('Fax', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['fax']; ?> 
-<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>
-<?php $email_einvoice = $oCustomer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-<?php echo wpsg_pad_right(__('E-Mail (eRechnung)', 'wpsg').':', 35); ?><?php echo $email_einvoice; ?>
-<?php } ?>
+<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>  
  
 <?php } ?> 
- 	
+ 
 <?php echo wpsg_pad_right(__('Kundennummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['knr']; ?> 
 <?php echo wpsg_pad_right(__('Bestellnummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['onr']; ?> 
 <?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo date("d.m.Y H:i:s", $this->view['basket']['checkout']['datum']); ?> 
-<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?> 
+<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> 
 <?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
 
Index: /views/mailtemplates/order.phtml
===================================================================
--- /views/mailtemplates/order.phtml	(revision 8528)
+++ /views/mailtemplates/order.phtml	(revision 5261)
@@ -1,11 +1,3 @@
-<?php
-
-    /** @var wpsg_order $oOrder */
-    $oOrder = $this->view['oOrder'];
-
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-
-?><?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { $prod_col = 25; } else { $prod_col = 35; } ?>
+<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { $prod_col = 25; } else { $prod_col = 35; } ?>
 
 <?php echo wpsg_pad_right(__('Pos', 'wpsg'), 5); ?>
@@ -38,25 +30,14 @@
 <?php } ?>
  
-<?php if (wpsg_isSizedArray($this->view['basket']['arCalculation']['voucher'])) {
-	
-	foreach ($this->view['basket']['arCalculation']['voucher'] as $gs) {
-		
-		echo wpsg_pad_right(' ', 5);
-		echo wpsg_pad_right(wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $gs['code']), $prod_col);
-		echo wpsg_pad_left(wpsg_ff($gs['set'], ((strpos($gs['set'], '%') !== false)?'%':$this->get_option('wpsg_currency'))).' ', 15);
-		
-		if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') {
-			
-			echo wpsg_pad_left(__('anteilig', 'wpsg').' ', 10);
-			
-		}
-		
-		echo wpsg_pad_left('1', 6);
-		echo wpsg_pad_left(wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency')), 15);
-		echo "\r\n";
-		
-	}
-
-} ?>
+<?php if (isset($this->view['basket']['gs'])) { ?>
+<?php echo wpsg_pad_right(($i + 1).'.', 5); ?>
+<?php echo wpsg_pad_right(wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $this->view['basket']['gs']['code']), $prod_col); ?>
+<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['gs']['value'], (($this->view['basket']['gs']['calc'] == 'w')?$this->get_option('wpsg_currency'):'%')).' ', 15); ?>
+<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+<?php echo wpsg_pad_left(__('anteilig', 'wpsg').' ', 10); ?>
+<?php } ?>
+<?php echo wpsg_pad_left('1', 6); ?>
+<?php echo wpsg_pad_left('-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')), 15); ?> 
+<?php } ?>
 <?php if (isset($this->view['basket']['sum']['preis_rabatt']) && $this->view['basket']['sum']['preis_rabatt'] > 0) { ?>
      <?php echo wpsg_pad_right(__('AbzÃŒglich Rabatt', 'wpsg'), 40); ?>
@@ -122,17 +103,5 @@
 <?php echo wpsg_pad_left(' ', 61); ?>---------------
      <?php echo wpsg_pad_right(__('Gesamtpreis:', 'wpsg'), 37); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), 34); ?>
-<?php $this->callMods('mail_order_end', [&$this->view['basket']['arCalculation'], false]); ?>
-
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
-<?php
-
-    $arCV = $oOrder->getCustomer()->getCustomerVariables();
-
-    if (wpsg_isSizedArray($arCV)) { ?>
-<?php echo __('Weitere Kundendaten', 'wpsg'); ?>:
-
-<?php foreach ($arCV as $cv) { ?>
-<?php echo $cv['label']; ?>: <?php echo $cv['value']."\r\n"; ?>
-<?php } ?>
-<?php } ?>
+<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), 34); ?> 
+ 
+<?php $this->callMods('mail_aftercalculation', array(&$this->view['basket']['checkout']['o_id'])); ?>
Index: ews/mailtemplates/reminder.phtml
===================================================================
--- /views/mailtemplates/reminder.phtml	(revision 8528)
+++ 	(revision )
@@ -1,35 +1,0 @@
-<?php
-
-    declare(strict_types=1);
-
-    /**
-     * Template fÃŒr die Erinnerung bei KaufabbrÃŒchen (TXT)
-     * User: Daschmi
-     * Date: 19.10.2020
-     * Time: 14:19
-     */
-
-    namespace Wpsg;
-
-    /** @var \wpsg_order $oOrder */
-    $oOrder = $this->view['oOrder'];
-
-    /** @var \wpsg_customer $oCustomer */
-    $oCustomer = $oOrder->getCustomer();
-    
-    /** @var \wpsg_ShopController $oShop */
-    $oShop = $this;
-
-?>Hallo <?php echo ltrim($oCustomer->getTitle().' '.$oCustomer->getFirstname().' '.$oCustomer->getName()); ?>, 
-
-<?php echo __('Sie hatten folgende Artikel in Ihrem Warenkorb:', 'wpsg'); ?> 
-
-<?php foreach ($oOrder->getOrderProducts() as $oOrderProduct) { ?>
-<?php echo $oOrderProduct->getProductName(); ?> [<?php echo $oShop->getProduktLink($oOrderProduct->getProductKey()); ?>] 
-<?php } ?>
- 
- 
-<?php echo __('Gab es technische Schwierigkeiten oder sind Sie sich vielleicht noch nicht ganz sicher?', 'wpsg'); ?> 
- 
-<?php echo __('Lassen Sie es uns wissen - wir beraten und helfen gern.', 'wpsg'); ?>  
- 
Index: /views/mailtemplates/status.phtml
===================================================================
--- /views/mailtemplates/status.phtml	(revision 8528)
+++ /views/mailtemplates/status.phtml	(revision 5261)
@@ -3,65 +3,17 @@
 	/**
 	 * Dieses Template wird fÃŒr die Mail bei einer StatusÃ€nderung verwendet
-	 * 
-	 * Eingeganten = 0, 
-	 * Auftragakzeptiert = 1
-	 * unvollstÃ€ndig = 2
-	 * Zahlung akzeptiert = 100
-	 * Rechung geschrieben = 110
-	 * Zahlung fehlgeschlagen = 200
-	 * Ware versendet = 250
-	 * zugestellt = 300
-	 * zurÃŒckgezahlt = 400
-	 * storniert = 500
-	 * Abo aktiv = 600
-	 * offene AbokÃŒndigung = 610
-	 * Abo gekÃŒndigt = 620
 	 */
 
 	$this->htmlMail = false;
-	
-	$oCustomer = wpsg_customer::getInstance($this->view['kunde']['id']);
-	
-	
-?><?php 
-	
-	echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), $oCustomer->getTitle(), $oCustomer->getFirstname(), $oCustomer->getName()); 
-	
-?>
-	
-<?php echo wpsg_translate(	
+
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?> 
+  
+<?php echo wpsg_translate(
 	__('Der Status Ihrer Bestellung mit der Bestellnummer #1# hat sich von "#2#" auf "#3#" geÃ€ndert.', 'wpsg'), 
 	$this->view['order']['onr'], 
 	__($this->view['status_alt'], 'wpsg'), 
-	__($this->view['status_neu'], 'wpsg'),
-    __($this->view['state_new_id'], 'wpsg')); ?> 
+	__($this->view['status_neu'], 'wpsg')); ?> 
+<?php $this->callMods('mail_status', array(&$this->view['order'], &$this->view['kunde'])); ?>  
+<?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg'); ?>
 
-<?php $this->callMods('mail_status', array(&$this->view['order'], &$this->view['kunde'])); ?>    
- 
-<?php if ($this->view['state_new_id'] == '1') { ?>
-<?php echo __('Ihr Auftrag wurde akzeptiert', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '2') { ?>
-<?php echo __('Ihre Bestellung ist unvollstÃ€ndig. Bitte prÃŒfen Sie die Daten!', 'wpsg'); ?> 			   
-<?php } else if ($this->view['state_new_id'] == '100') { ?>
-<?php echo __('Ihre Zahlung wurde akzeptiert. Vielen Dank!', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '200') { ?>
-<?php echo __('Ihre Zahlung wurde nicht akzeptiert. Bitte prÃŒfen Sie den Zahlungsvorgang.', 'wpsg'); ?> 	   
-<?php } else if ($this->view['state_new_id'] == '250') { ?>
-<?php echo __('Ihre Ware wurde versendet!', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '300')	{ ?>
-<?php echo __('Ihre Ware wurde zugestellt!', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '400') { ?>
-<?php echo __('Ihre Zahlung wurde zurÃŒckgezahlt!', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '500') { ?>
-<?php echo __('Ihre Bestellung wurde storniert!', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '600') { ?>
-<?php echo __('Ihr Abo ist aktiv!', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '610') { ?>
-<?php echo __('Ihre AbokÃŒndigung steht noch offen.', 'wpsg'); ?> 
-<?php } else if ($this->view['state_new_id'] == '620') { ?>
-<?php echo __('Ihr Abo wurde erfolgreich gekÃŒndigt!', 'wpsg'); ?> 
-<?php } ?>
-				
-<?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg'); ?> 
- 
 <?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: ews/mods/mod_abo/admin_setcapabilities.phtml
===================================================================
--- /views/mods/mod_abo/admin_setcapabilities.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-	
-	/**
-	 * Template fÃŒr die Integration in die Verwaltung der Berechtigungen
-	 */
-
-	global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
-
-?>
-<tr>
-	<td class="wpsg_col_capname"><?php echo __('Aboverwaltung', 'wpsg'); ?></td>
-	<?php foreach ($arRoles as $role_key => $r) { ?>
-	<td class="wpsg_col_cap">
-		<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_abo]" value="0" />
-		<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_abo']) && $r['capabilities']['wpsg_abo'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_abo]" value="1" /> 
-	</td>
-	<?php } ?>
-	<td></td>
-</tr>	
Index: /views/mods/mod_abo/basket_row.phtml
===================================================================
--- /views/mods/mod_abo/basket_row.phtml	(revision 8528)
+++ /views/mods/mod_abo/basket_row.phtml	(revision 5261)
@@ -6,15 +6,11 @@
 
 ?>
-<div class="product_info">
-	<div 
-	<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-		<?php echo __("Abo VerlÃ€ngerung", "wpsg"); ?>
-	</div>
-	<div class="valuel">
+<tr class="wpsg_<?php echo (($this->view['i'] == 0)?'odd':'even'); ?>">
+	<td class="wpsg_cell_number">
+					
+	</td>
+	<td><?php echo __('Abo VerlÃ€ngerung', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
 		<?php echo wpsg_translate(__('VerlÃ€ngerung zu Bestellung #1# (#2# Tage)', 'wpsg'), $this->view['wpsg_mod_abo']['order']['onr'], $this->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge']); ?>	
-	</div>
-	<div class="dummyr">
-		<?php echo __('&nbsp;'); ?>
-	</div>
-	
-</div>
+	</td>
+</tr>
Index: ews/mods/mod_abo/index.phtml
===================================================================
--- /views/mods/mod_abo/index.phtml	(revision 8528)
+++ 	(revision )
@@ -1,382 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Ãbersicht der Abonnements
-	*/
-	
-?>
-
-<div class="wpsg_order" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-                
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-                <a class="glyphicon glyphicon-menu-hamburger wpsg-bs-toggle-nav visible-xs-block" data-toggle="collapse" data-target="#wpsg-bs-headermenu" href="#"></a>
-                
-			</div>
-			<div class="collapse navbar-collapse" id="wpsg-bs-headermenu">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order" onclick="return false;"><?php echo __("AboÃŒbersicht", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_showhide_filter wpsg-order-tab-a <?php echo (($this->view['hasFilter'] === true)?'active':''); ?>" id="wpsg-order-tab-0"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>                  
-				</ul>
-			</div>
-		</div>
-
-		<div class="wpsg-filter wpsg-order-tab wpsg-order-tab-0 container-fluid form-horizontal" style="display:<?php echo (($this->view['hasFilter'] === true)?'block':'none'); ?>;">
-			<div class="row">
-				<div class="col-lg-4">
-					<form method="post" id="filter_form" >
-						
-						<?php echo wpsg_formNounce('Abo', 'index', ['search' => '1']); ?>
-						
-						<input id="wpsg_seite" type="hidden" name="seite" value="<?php echo @$this->view['arFilter']['page']; ?>" class="current-page" />
-						<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-						<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" />
-
-						<?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
-                        <?php echo wpsg_drawForm_Input('filter[k_id]', __('Kunde (ID)', 'wpsg'), wpsg_getStr($this->view['arFilter']['k_id'])); ?>
-						
-						<?php
-							
-							$arStateSelect = [];
-							foreach ($this->view['arState'] as $state_key => $state_data) $arStateSelect[$state_key] = $state_data['label'];
-							
-							echo wpsg_drawForm_Select('filter[status]', __('Abostatus', 'wpsg'), wpsg_array_merge(array('-1' => __('Alle', 'wpsg')), $arStateSelect), @$this->view['arFilter']['state']); ?>
-
-                        <?php echo wpsg_drawForm_TextStart(); ?>
-                        <div class="row">
-                            <div class="col-lg-6">
-                                <select name="filter[cdate_m]" class="form-control input-sm">
-                                    <option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-                                    <?php for ($i = 1; $i <= 12; $i ++) { ?>
-                                    <option <?php echo ((wpsg_getStr($this->view['arFilter']['cdate_m']) == $i)?'selected="selected"':''); ?> value="<?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>"><?php echo strftime("%B", mktime(0, 0, 0, $i, 1, 2000)); ?></option>
-                                    <?php } ?>
-                                </select>
-                            </div>
-                            <div class="col-lg-6">
-                                <select name="filter[cdate_y]" class="form-control input-sm">
-                                    <option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-                                    <?php foreach ($this->view['cdate_years'] as $y) { ?>
-                                    <option <?php echo ((wpsg_getStr($this->view['arFilter']['cdate_y']) == $y)?'selected="selected"':''); ?> value="<?php echo $y; ?>"><?php echo $y; ?></option>
-                                    <?php } ?>
-                                </select>
-                            </div>
-                        </div>
-                        <?php echo wpsg_drawForm_TextEnd(__('Abo abgeschlossen am (Monat/Jahr)', 'wpsg'), array('noP' => true)); ?>       
-                        
-                        <?php echo wpsg_drawForm_TextStart(); ?>
-                        <div class="row">
-                            <div class="col-lg-6">
-                                <select name="filter[enddate_m]" class="form-control input-sm">
-                                    <option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-                                    <?php for ($i = 1; $i <= 12; $i ++) { ?>
-                                    <option <?php echo ((wpsg_getStr($this->view['arFilter']['enddate_m']) == $i)?'selected="selected"':''); ?> value="<?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>"><?php echo strftime("%B", mktime(0, 0, 0, $i, 1, 2000)); ?></option>
-                                    <?php } ?>
-                                </select>
-                            </div>
-                            <div class="col-lg-6">
-                                <select name="filter[enddate_y]" class="form-control input-sm">
-                                    <option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-                                    <?php if(isset($this->view['enddate_years']) && !empty($this->view['enddate_years'])) {
-                                        foreach ($this->view['enddate_years'] as $y) { ?>
-                                        <option <?php echo ((wpsg_getStr($this->view['arFilter']['enddate_y']) == $y)?'selected="selected"':''); ?> value="<?php echo $y; ?>"><?php echo $y; ?></option>
-                                        <?php } 
-                                    } ?>
-                                </select>
-                            </div>
-                        </div>
-                        <?php echo wpsg_drawForm_TextEnd(__('Abo gekÃŒndigt am (Monat/Jahr)', 'wpsg'), array('noP' => true)); ?>                      
-
-    					<br />
-                        
-                        <?php echo wpsg_drawForm_SubmitButton(__('Abonnement suchen')); ?>
-
-					</form>
-				</div>
-			</div>
-		</div>
-    
-    </nav>
-    
-    <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-
-	<div class="pagination_wrap wpsg_status_link_wrap">
-
-		<ul class="pagination">
-			<?php foreach ($this->view['arState'] as $status_key => $status_info) { ?>
-			<li class="<?php echo ((wpsg_getStr($this->view['arFilter']['state']) == $status_key)?'active':''); ?>"><a href="#" onclick="return wpsg_setFilterStatus('<?php echo $status_key; ?>');"><?php echo wpsg_translate(__('#1# <span>(#2#)<span>', 'wpsg'), $status_info['label'], $status_info['count']); ?></a></li>
-			<?php } ?>
-		</ul>
-
-	</div>
-
-	<?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-
-	<div class="wpsg_clear"></div>
-
-	<div class="content">
-		<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1" enctype="multipart/form-data">
-
-		<?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-
-            <table class="table table-bordered table-hover table-striped wpsg-table-order">
-                <thead>
-                    <tr>
-                        <th class="col_checkbox"><input type="checkbox" onclick="return wpsg_order_checkAll();" /></th>
-                        <th class="col_nr wpsg_order" data-order="cdate"><?php echo __('Nr', 'wpsg'); ?></th>
-                        <th class="col_customer wpsg_order" data-order="customer"><?php echo __('Kunde', 'wpsg'); ?></th>
-                        <th class="col_payment wpsg_order" data-order="payment"><?php echo __('Bezahlmethode', 'wpsg'); ?></th>
-                        <th class="col_shipping wpsg_order" data-order="shipping"><?php echo __('Versandart', 'wpsg'); ?></th>
-                        <th class="col_products wpsg_order" data-order="products"><?php echo __('Abonnement', 'wpsg'); ?></th>  
-                        <th class="col_sum wpsg_order" data-order="amount"><?php echo __('Bestellwert', 'wpsg'); ?></th>
-                        <th class="col_time wpsg_order" data-order="expiration"><?php echo __('Laufzeit', 'wpsg'); ?></th>
-						<th class="col_state"><?php echo __('Status', 'wpsg'); ?></th>
-                    </tr>
-                </thead>
-                <tbody>
-                    <?php foreach ($this->view['arData'] as $oAbo) { 
-                    	
-                    	$oOrder = $oAbo->getOrder(); 
-                    	$oOrderProduct = $oAbo->getOrderProduct();	
-                    	
-					?>
-                    <tr>
-                        <td class="col_checkbox">
-
-                            <input class="col_set_checkbox" name="wpsg_multido[<?php echo $oAbo->id; ?>]" type="checkbox" />
-
-                        </td>
-                        <td class="col_nr">
-
-                            <?php echo $oAbo->getNr(); ?> <span class="wpsg_grey"><?php echo wpsg_formatTimestamp(strtotime($oAbo->__get('cdate')), false); ?></span><br />
-
-                            <div class="actions">
-								
-                                <span class="view"><a title="<?php echo __("Dieses Abonnement ansehen", "wpsg"); ?>" href="<?php 
-									
-									echo wpsg_admin_url('Order', 'view', ['edit_id' => $oOrder->id]);
-									
-								?>"><?php echo __("Ansehen", "wpsg"); ?></a></span>
-                                |
-                                <span class="delete"><a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie dieses Abonnement lÃ¶schen mÃ¶chten?', 'wpsg'); ?>');" title="<?php echo __('Dieses Abonnement lÃ¶schen', 'wpsg'); ?>" href="<?php 
-									
-									echo wpsg_admin_url('Abo', 'delete', ['abo_id' => $oAbo->id], ['noheader' => '1']);	
-																			
-								?>"><?php echo __('LÃ¶schen', 'wpsg'); ?></a></span>
-							
-                            </div>
-							
-                            <?php if (trim($oAbo->getOrder()->admincomment) != "") { ?>
-                            <a title="<?php echo __("Kommentar (Admin): ", "wpsg").htmlspecialchars($oAbo->getOrder()->admincomment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign admincomment" href="#"></a>
-                            <?php } ?>
-
-                            <?php if (trim($oAbo->getOrder()->comment) != "") { ?>
-                            <a title="<?php echo __("Kommentar (Kunde): ", "wpsg").htmlspecialchars($oAbo->getOrder()->comment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign customercomment" href="#"></a>
-                            <?php } ?> 
-
-                        </td>
-                        <td class="col_customer">
-                            <?php $firma = $oAbo->getOrder()->getInvoiceCompany(); if (wpsg_isSizedString($firma)) { ?>
-                            <?php echo $firma; ?><br />
-                            <?php } ?>
-                            <?php echo $oAbo->getOrder()->getInvoiceTitle(); ?> <?php echo $oOrder->getInvoiceFirstname(); ?> <?php echo $oAbo->getOrder()->getInvoiceName(); ?>
-                            <br />
-                            <span class="wpsg_grey"><?php echo $oAbo->getOrder()->getInvoiceStreet(); ?><br />
-                            <?php echo ltrim($oAbo->getOrder()->getInvoiceZip().' '.$oAbo->getOrder()->getInvoiceCity()); ?> <?php echo $oAbo->getOrder()->getInvoiceCountryKuerzel(); ?>
-                            </span>
-                        </td>
-                        <td class="col_payment">
-
-                            <?php /* Bei Crefopay wird die Darstellung der Zahlungsart ÃŒber das Modul geregelt */ ?>
-                            <?php if ($oOrder->getPaymentID() == 4000 && $this->hasMod('wpsg_mod_crefopay')) { ?>
-                                <?php echo wpsg_hspc($this->callMod('wpsg_mod_crefopay', 'getOrderPaymentName', array($oOrder->id))); ?>
-                            <?php } else { ?>
-                                <?php echo $oOrder->getPaymentLabel(); ?>
-                            <?php } ?>
-
-                            <?php if ($oOrder->getPaymentAmount() > 0) { ?>
-                            &nbsp;-&nbsp;<?php echo wpsg_ff($oOrder->getPaymentAmount(), $this->get_option('wpsg_currency')); ?>
-                            <?php } ?>
-
-                        </td>
-                        <td class="col_shipping">
-
-                            <?php echo $oOrder->getShippingLabel(); ?>
-
-                            <?php if ($oOrder->getShippingAmount() > 0) { ?>
-                            &nbsp;-&nbsp;<?php echo wpsg_ff($oOrder->getShippingAmount(), $this->get_option('wpsg_currency')); ?>
-                            <?php } ?>
-
-                            <?php if ($oOrder->hasShippingAdress()) { ?>
-                                <br />
-                                <?php echo $oOrder->getShippingTitle(); ?> <?php echo $oOrder->getShippingFirstName(); ?> <?php echo $oOrder->getShippingName(); ?><br />
-                                <span class="wpsg_grey">
-                                    <?php echo $oOrder->getShippingStreet(); ?>
-                                    <?php echo $oOrder->getShippingZip(); ?> <?php echo $oOrder->getShippingCity(); ?> <?php echo $oOrder->getShippingCountryKuerzel(); ?><br />
-                            </span>
-                            <?php } ?>
-
-                        </td>
-                        <td class="col_products">
-
-							<?php if ($oOrderProduct === false) { ?>
-
-                                <?php echo __('Produkt nicht gefunden.', 'wpsg'); ?>
-								
-							<?php } else { ?>
-								
-								<?php echo wpsg_translate(__('#1# x <a href="#2#">#3#</a> fÃŒr je #4#', 'wpsg'),
-									$oOrderProduct->getCount(),
-									wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$oOrderProduct->getProductId(), 'wpsg-product-edit-'.$oOrderProduct->getProductId()),
-									$oOrderProduct->getProductName(),
-									wpsg_ff($oOrderProduct->getOneAmount(), $this->get_option('wpsg_currency'))
-								); ?>
-							
-							<?php } ?>
-                            
-                        </td>
-                        <td class="col_sum">
-                            <?php echo wpsg_ff($oOrder->getAmount(), $this->get_option('wpsg_currency')); ?>
-                        </td>
-                        
-                        <?php /* Laufzeitspalte */ ?>
-                        <td class="col_time">
-
-                            <?php if ($oOrderProduct === false) { ?>
-
-                                <?php echo __('Produkt nicht gefunden.', 'wpsg'); ?>
-								
-							<?php } else { ?>
-							
-								<?php if (in_array(strval($this->callMod('wpsg_mod_abo', 'isAboOrder', array($oOrder->id))), array(1))) { ?>
-	
-									<?php $abo_expiration = strtotime($this->callMod('wpsg_mod_abo', 'getOrderAboExpiration', array($oOrder->id, $oOrderProduct->getId()))); ?>
-	
-									<?php if ($abo_expiration > time()) { ?>
-									
-										<span class="wpsg_mod_abo_future_expire"><?php echo wpsg_formatTimestamp($abo_expiration); ?></span>
-								  
-									<?php } else { ?>
-								  
-										<span class="wpsg_mod_abo_expired"><?php echo wpsg_formatTimestamp($abo_expiration); ?></span>
-									
-									<?php } ?>
-	
-									<br />
-											
-								<?php } ?>
-							
-							<?php } ?>
-                            
-                       </td>
-						
-						<td class="col_state">
-							
-							<?php $state = $oAbo->getState(); ?>
-							
-							<?php if ($state === wpsg_abo::STATE_INEXTENSION) { ?><span style="color:orange;"><?php echo $oAbo->getStateLabel(); ?></span> 
-							<?php } else if ($state === wpsg_abo::STATE_RUNNING) { ?><span style="color:green;"><?php echo $oAbo->getStateLabel(); ?></span>
-							<?php } else if ($state === wpsg_abo::STATE_EXTEND) { ?><span style="color:red;"><?php echo $oAbo->getStateLabel(); ?></span><?php } ?>
-															
-						</td>
-                       
-                    </tr>
-                    
-                    <?php } ?>
-                    
-                </tbody>
-                
-            </table>
-
-            <div class="alignleft actions">
-                <select name="wpsg_action" id="wpsg_action">
-                    <option value="-1"><?php echo __('Aktion wÃ€hlen', 'wpsg'); ?></option>
-                    <option value="multiDelete"><?php echo __('Abonnement(s) lÃ¶schen', 'wpsg'); ?></option>             
-                </select>
-
-                <input onclick="if (jQuery('#wpsg_action').val() == 'multiDelete') { if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false; }" type="submit" value="<?php echo __('AusfÃŒhren', 'wpsg'); ?>" class="button-secondary action" id="doaction" name="wpsg_order_doaction" />
-
-            </div>
-
-            <div style="margin-right:-15px;">
-                <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-            </div>
-
-            <div class="wpsg_clear"></div>
-
-		<?php } else { ?>
-
-            <?php echo wpsg_drawForm_AdminboxStart(); ?>
-    		<?php echo __('Keine Abonnements in der Datenbank.', 'wpsg'); ?>
-            <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-		<?php } ?>
-		<input id="noheader1" type="hidden" name="noheader1" value="1" />
-		</form>
-	</div>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-    <?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo @$this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower(@$this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-
-    function wpsg_order_checkAll()
-    {
-
-        jQuery('.col_set_checkbox').each(function() { jQuery(this).prop('checked', !jQuery(this).prop('checked')); } );
-
-    }
-
-	function wpsg_setFilterStatus(state)
-	{
-
-		jQuery('#filterstatus').val(state);
-
-		jQuery('#seite').val(1);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	}
-
-	function goPage(page)
-	{
-
-		//if (page <= 0 || page == <?php echo $this->view['arFilter']['page']; ?> || page > <?php echo wpsg_getStr($this->view['pages'], '0'); ?>) return;
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-    jQuery(document).ready(function() {
-
-        jQuery('.wpsg-order-tab-mods').bind('click', function() {
-
-            if (jQuery(this).hasClass('active'))
-            {
-
-                jQuery(this).removeClass('active');
-                jQuery('.' + jQuery(this).attr("id")).slideUp(250);
-
-            }
-            else
-            {
-
-                jQuery(this).addClass('active');
-                jQuery('.' + jQuery(this).attr("id")).slideDown(250);
-
-            }
-
-            return false;
-
-        } );
-
-    } );
-
-/* <![CDATA[ */</script>
Index: ews/mods/mod_abo/mail_admin_stoprenewal.phtml
===================================================================
--- /views/mods/mod_abo/mail_admin_stoprenewal.phtml	(revision 8528)
+++ 	(revision )
@@ -1,14 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Mail, die der Admin bekommt wenn ein Kunde ein Abo im Frontend anhalten mÃ¶chte (Text)
-     */
-    
-?><?php echo __('Hallo Administrator,', 'wpsg'); ?> 
-
-<?php echo wpsg_translate(__('Der Kunde "#1#" mÃ¶chte sein Abo fÃŒr Produkte "#2#" anhalten.'), trim($this->view['oCustomer']->getFirstname().$this->view['oCustomer']->getName()), $this->view['oProduct']->getProductName()); ?> 
-
-<?php echo wpsg_translate(__('Link zur Ausgangsbestellung: <a href="#1#">#1#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$this->view['oOrder']->id); ?> 
-<?php echo wpsg_translate(__('Direkt stoppen und zur Bestellung: <a href="#1#">#1#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_abo&edit_id='.$this->view['oOrder']->id.'&product_key='.$this->view['product_key'].'&do=stop&noheader=1'); ?> 
-
-<?php echo __('Dies ist eine automatisch generierte Mail.', 'wpsg'); ?> 
Index: ews/mods/mod_abo/mail_admin_stoprenewal_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_admin_stoprenewal_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Mail, die der Admin bekommt wenn ein Kunde ein Abo im Frontend anhalten mÃ¶chte (HTML)
-     */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');7
-
-?>
-
-<?php echo __('Hallo Administrator,', 'wpsg'); ?><br />
-<br />
-<?php echo wpsg_translate(__('Der Kunde "#1#" mÃ¶chte sein Abo fÃŒr Produkte "#2#" anhalten.'), trim($this->view['oCustomer']->getFirstname().$this->view['oCustomer']->getName()), $this->view['oProduct']->getProductName()); ?><br />
-<br />
-<?php echo wpsg_translate(__('Link zur Ausgangsbestellung: <a href="#1#">#1#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$this->view['oOrder']->id); ?><br />
-<?php echo wpsg_translate(__('Direkt stoppen und zur Bestellung: <a href="#1#">#1#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_abo&edit_id='.$this->view['oOrder']->id.'&product_key='.$this->view['product_key'].'&do=stop&noheader=1'); ?><br />
-<br />
-<?php echo __('Dies ist eine automatisch generierte Mail.', 'wpsg'); ?>
Index: ews/mods/mod_abo/mail_autoinformation.phtml
===================================================================
--- /views/mods/mod_abo/mail_autoinformation.phtml	(revision 8528)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Informationsmail an den Kunden wenn ein Abo automatisch verlÃ€ngert werden soll
-	 */
-
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-
-?><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,
-
-<?php echo wpsg_translate(__('Ihr Abonnement von Produkt "#1#" lÃ€uft in #2# Tagen aus.', 'wpsg'), $this->view['oProduct']->getProductName(), $this->view['wpsg_mod_abo_autoexpire_informationtime']); ?> 
- 
-<?php echo wpsg_translate(__('Klicken Sie <a href="#1#">hier</a> um das Abonnement zu verlÃ€ngern.', 'wpsg'), $this->view['rebuyLink']); ?>  
- 
-<?php echo __('Viele GrÃŒÃe', 'wpsg'); ?> 
- 
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?> 
Index: ews/mods/mod_abo/mail_autoinformation_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_autoinformation_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,15 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Informationsmail an den Kunden wenn ein Abo automatisch verlÃ€ngert werden soll
-	 */
-
-?><p><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,</p>
-  
-<p><?php echo wpsg_translate(__('Ihr Abonnement von Produkt "#1#" lÃ€uft in #2# Tagen aus.', 'wpsg'), $this->view['oProduct']->getProductName(), $this->view['wpsg_mod_abo_autoexpire_informationtime']); ?></p> 
- 
-<p><?php echo wpsg_translate(__('Klicken Sie <a href="#1#">hier</a> um das Abonnement zu verlÃ€ngern.', 'wpsg'), $this->view['rebuyLink']); ?></p>
-
-<p><?php echo __('Viele GrÃŒÃe', 'wpsg'); ?></p> 
- 
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p> 
Index: /views/mods/mod_abo/mail_expiration_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_expiration_html.phtml	(revision 8528)
+++ /views/mods/mod_abo/mail_expiration_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Mail die beim Auslauf eines Abos versendet wird (HTML)
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?><p><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,</p>
Index: /views/mods/mod_abo/mail_firstbuy_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_firstbuy_html.phtml	(revision 8528)
+++ /views/mods/mod_abo/mail_firstbuy_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Mailtemplate, welches beim erstmaligen Kauf eines Abos versendet wird (HTML)
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?><p><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,</p>
Index: /views/mods/mod_abo/mail_rebuy_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_rebuy_html.phtml	(revision 8528)
+++ /views/mods/mod_abo/mail_rebuy_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Template fÃŒr die Mail an den Kunden wenn ein Abo verlÃ€ngert wurde (HTML)
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?><p><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,</p>
Index: /views/mods/mod_abo/mail_row_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_row_html.phtml	(revision 8528)
+++ /views/mods/mod_abo/mail_row_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Template fÃŒr die Zeile eines Abo Produktes im HTML Template
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?>
Index: ews/mods/mod_abo/mail_storno.phtml
===================================================================
--- /views/mods/mod_abo/mail_storno.phtml	(revision 8528)
+++ 	(revision )
@@ -1,17 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Mail an den Kunden wenn ein Abo storniert wurde
-	 */
-
-?><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,
- 
-<?php if ($this->view['cancel_storno']) { ?>
-<?php echo wpsg_translate(__('die Stornierung fÃŒr Ihr Abo von Produkt "#1#" wurde aufgehoben.', 'wpsg'), $this->view['oProduct']->getProductName()); ?> 
-<?php } else { ?>
-<?php echo wpsg_translate(__('Ihr Abo von Produkt "#1#" wurde zum "#2#" storniert.', 'wpsg'), $this->view['oProduct']->getProductName(), date('d.m.Y', $this->view['stornoDate'])); ?> 
-<?php } ?>
- 
-<?php echo __('Viele GrÃŒÃe', 'wpsg'); ?> 
- 
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?> 
Index: ews/mods/mod_abo/mail_storno_html.phtml
===================================================================
--- /views/mods/mod_abo/mail_storno_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Mail an den Kunden wenn ein Abo storniert wurde (HTML)
-	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
-?><p><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,</p>
- 
-<?php if ($this->view['cancel_storno']) { ?>
-<p><?php echo wpsg_translate(__('die Stornierung fÃŒr Ihr Abo von Produkt "#1#" wurde aufgehoben.', 'wpsg'), $this->view['oProduct']->getProductName()); ?></p>
-<?php } else { ?>
-<p><?php echo wpsg_translate(__('Ihr Abo von Produkt "#1#" wurde zum #2# storniert.', 'wpsg'), $this->view['oProduct']->getProductName(), date('d.m.Y', $this->view['stornoDate'])); ?></p>
-<?php } ?>
- 
-<p><?php echo __('Viele GrÃŒÃe', 'wpsg'); ?></p> 
- 
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p> 
Index: ews/mods/mod_abo/order_view.phtml
===================================================================
--- /views/mods/mod_abo/order_view.phtml	(revision 8528)
+++ 	(revision )
@@ -1,111 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Anzeige des Abo Statuses in der Hauptbestellung
-     */
-    
-    $view = $this->view['wpsg_mod_abo'];
-    
-?>
-       
-<?php foreach ($this->view['arOrderedAboProducts'] as $oOrderProduct) {
-
-	try {
-    
-		$oAbo = wpsg_abo::getFromOrderAndOrderProduct($view['oOrder']->getId(), $oOrderProduct->getId());
-		
-		?>
-	
-		<?php echo wpsg_drawForm_AdminboxStart(
-			'<a href="'.wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$oOrderProduct->getProductId(), 'wpsg-product-edit-'.$oOrderProduct->getProductId()).'">'.
-			$oOrderProduct->getProduct()->getProductName().
-			'</a>'
-		); ?>
-	
-			<?php $tExpire = strtotime($this->callMod('wpsg_mod_abo', 'getOrderAboExpiration', Array($_REQUEST['edit_id'], $oOrderProduct->getId()))); ?>
-			<?php echo wpsg_drawForm_Text(__('Laufzeit', 'wpsg'), wpsg_formatTimestamp($tExpire), 'wpsg_mod_abo_duration_'.$oOrderProduct->getProductIndex(), Array('class_content_wrap' => 'wpsg_abo_state wpsg_abo_state_class_'.$oAbo->getState())); ?>
-		
-			<script>
-	
-				moment.locale('de');
-				
-				jQuery('#wpsg_mod_abo_duration_<?php echo $oOrderProduct->getProductIndex(); ?>').editable({
-					type: 'combodate',
-					display: function(value) {
-						
-						jQuery(this).html(value.format('DD.MM.YYYY HH:mm:ss'));
-						
-					},
-					success: function(response, newValue) {
-						
-						jQuery.ajax({
-							url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_abo&subaction=admin_inlineEdit&noheader=1',
-							data: {
-								field: 'duration',
-								order_product_id: '<?php echo $oOrderProduct->getId(); ?>',
-								order_id: '<?php echo $view['oOrder']->getId() ?>',
-								date: newValue.format()
-							},
-							success: function(response) {
-
-                                jQuery('#wpsg_mod_abo_duration_<?php echo $oOrderProduct->getProductIndex(); ?>').parent().parent().attr("class", "col-sm-6 wpsg_abo_state_class_" + response.state)
-															
-							}
-						})
-						
-					},
-					format: 'DD.MM.YYYY HH:mm:ss',
-					viewformat: 'DD.MM.YYYY HH:mm:ss',
-					template: 'D MMM YYYY  HH:mm:ss',
-					combodate: {
-						minYear: 2000,
-						maxYear: <?php echo (intval(date('Y')) + 10); ?>,
-						minuteStep: 1
-					}
-				}); 
-				
-			</script>
-	
-			<?php echo wpsg_drawForm_Text(wpsg_translate(__('Preis (#1# Tage):', 'wpsg'), $oOrderProduct->getProduct()->wpsg_mod_abo_durration), wpsg_ff($oOrderProduct->getProduct()->wpsg_mod_abo_price, $this->get_option('wpsg_currency'))); ?>
-			<?php
-		
-				$strURL = $this->callMod('wpsg_mod_abo', 'getRebuyLink', [$view['oOrder']->getId(), $oOrderProduct->getId()]);
-				$strURL = '<a href="'.$strURL.'">'.$strURL.'</a>';
-		
-				echo wpsg_drawForm_Text(__('URL fÃŒr den Kauf einer VerlÃ€ngerung', 'wpsg'), $strURL); 
-				
-			?>
-		
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			
-				<?php $abo_product_status = $this->callMod('wpsg_mod_abo', 'getAboProductStatus', Array($_REQUEST['edit_id'], $oOrderProduct->getId())); ?>
-		
-				<?php if ($abo_product_status['status'] === wpsg_mod_abo::STATUS_ACTIVE) { ?>
-			
-					<?php echo __('Aktiv', 'wpsg'); ?>
-			
-					&nbsp;[&nbsp;<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_abo&edit_id=<?php echo $_REQUEST['edit_id'] ?>&order_product_id=<?php echo $oOrderProduct->getID(); ?>&do=stop&noheader=1"><?php echo __('Deaktivieren'); ?></a>&nbsp;]
-			
-				<?php } else if ($abo_product_status['status'] === wpsg_mod_abo::STATUS_STOPPED) { ?>
-			
-					<?php echo __('Inaktiv', 'wpsg'); ?>
-	
-					&nbsp;[&nbsp;<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_abo&edit_id=<?php echo $_REQUEST['edit_id'] ?>&order_product_id=<?php echo $oOrderProduct->getID(); ?>&do=run&noheader=1"><?php echo __('Aktivieren'); ?></a>&nbsp;]
-			
-				<?php } ?>
-		
-			<?php echo wpsg_drawForm_TextEnd(__('VerlÃ€ngerung')); ?>
-			  
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-		
-	<?php } catch (\Exception $e) { ?>
-
-        <?php echo wpsg_drawForm_AdminboxStart($oOrderProduct->getProduct()->getProductName()); ?>
-		
-			<p><?php echo __('Abo wurde gelÃ¶scht.', 'wpsg'); ?></p>
-		
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-		
-	<?php } ?>
-    
-<?php } ?>
Index: /views/mods/mod_abo/order_view_base.phtml
===================================================================
--- /views/mods/mod_abo/order_view_base.phtml	(revision 8528)
+++ /views/mods/mod_abo/order_view_base.phtml	(revision 5261)
@@ -4,9 +4,8 @@
 	 * Integration einer Abo-VerlÃ€ngerung in die Bestellansicht im Backend (Abo Produkt)
 	 */
-
 ?>
 <tr class="wpsg_<?php echo (($this->view['i'] == 0)?'odd':'even'); ?>">
 	<td ><?php echo __('Abo VerlÃ€ngerungen', 'wpsg'); ?>:</td>
-	<td align="right" colspan="<?php echo ((sizeof($this->view['basket']['mwst'])??0 > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
+	<td align="right" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
 		<?php if (wpsg_isSizedArray($this->view['wpsg_mod_abo']['rebuy'])) { ?>
 		<?php foreach ($this->view['wpsg_mod_abo']['rebuy'] as $k => $v) { ?>
Index: /views/mods/mod_abo/order_view_row.phtml
===================================================================
--- /views/mods/mod_abo/order_view_row.phtml	(revision 8528)
+++ /views/mods/mod_abo/order_view_row.phtml	(revision 5261)
@@ -9,10 +9,5 @@
 	<td ><?php echo __('Abo VerlÃ€ngerung', 'wpsg'); ?>:</td>
 	<td align="right" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
-		<?php echo wpsg_translate(
-		    __('VerlÃ€ngerung zu Bestellung <a href="#1#">#2#</a> (#3# Tage)', 'wpsg'),
-            wpsg_admin_url('Order', 'view', ['edit_id' => $this->view['wpsg_mod_abo']['order']['id']]),
-            $this->view['wpsg_mod_abo']['order']['onr'],
-            $this->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge']
-        ); ?>
+		<?php echo wpsg_translate(__('VerlÃ€ngerung zu Bestellung <a href="#1#">#2#</a> (#3# Tage)', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$this->view['wpsg_mod_abo']['order']['id'], $this->view['wpsg_mod_abo']['order']['onr'], $this->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge']); ?>
 	</td>
 </tr>
Index: /views/mods/mod_abo/overview_row.phtml
===================================================================
--- /views/mods/mod_abo/overview_row.phtml	(revision 8528)
+++ /views/mods/mod_abo/overview_row.phtml	(revision 5261)
@@ -2,19 +2,12 @@
 
 	/**
-	 * Template fÃŒr die Anzeige der Abo-VerlÃ€ngerung im Overview
+	 * Template fÃŒr die Anzeige der Abo-VerlÃ€ngerung im Warenkorb
 	 */
 
 ?>
-<div class="product_info">
-	<div 
-	<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-		<?php echo __("Abo VerlÃ€ngerung", "wpsg"); ?>
-	</div>
-	<div class="valuel">
-		<?php echo wpsg_translate(__('VerlÃ€ngerung zu Bestellung #1# (#2# Tage)', 'wpsg'), $this->view['wpsg_mod_abo']['order']['onr'], $this->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge']); ?>	
-	</div>
-	<div class="dummyr">
-		<?php echo __('&nbsp;'); ?>
-	</div>
-	
-</div>
+<tr class="wpsg_<?php echo (($this->view['i'] == 0)?'odd':'even'); ?>">
+	<td><?php echo __('Abo VerlÃ€ngerung', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
+		<?php echo wpsg_translate(__('VerlÃ€ngerung zu Bestellung #1# (#2# Tage)', 'wpsg'), $this->view['wpsg_mod_abo']['order']['onr'], $this->view['wpsg_mod_abo']['wpsg_mod_abo_durration_menge']); ?>
+	</td>
+</tr>
Index: ews/mods/mod_abo/page_abo.phtml
===================================================================
--- /views/mods/mod_abo/page_abo.phtml	(revision 8528)
+++ 	(revision )
@@ -1,216 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Ãbersichtsseite der Abonnements im Frontend
-	 */
- 
-?>
-
-<div class="wpsg_mod_kundenverwaltung_abo wpsg">
-
-	<?php echo $this->writeFrontendMessage(); ?>
-	
-	<?php if (wpsg_isSizedArray($this->view['arOrder'])) { ?>
-		
-		<div class="wpsg_mod_abo_order_product_wrap">
-		<?php foreach ($this->view['arOrder'] as $oOrder) { ?>
-
-            <?php if ($this->callMod('wpsg_mod_abo', 'isAboOrder', [$oOrder->id]) === 1) {
-
-                $arAbo = $this->callMod('wpsg_mod_abo', 'getAboProductsFromOrder', [$oOrder->id]);
-
-                foreach ($arAbo as $oOrderProduct) {
-
-                    $aboStatus = $this->callMod('wpsg_mod_abo', 'getAboProductStatus', [$oOrder->id, $oOrderProduct->id]); $oAbo = wpsg_abo::getInstance(intval($aboStatus['id']));
-                    $state = $oAbo->getState();
-
-                    ?>
-
-                    <div class="wpsg_mod_abo_order_product">
-
-                        <h1 class="entry-title title">
-                            <?php echo wpsg_translate(__('Abo "#1#" aus Bestellung #2#', 'wpsg'), $oOrderProduct->getProduct()->getProductName(), $oOrder->getNr()); ?>
-                        </h1>
-
-                        <?php $nAttachmentID = $this->imagehandler->getAttachmentID($oOrderProduct->getProductKey()); ?>
-
-                        <?php if (wpsg_isSizedInt($nAttachmentID)) { ?>
-                            <div class="image">
-                                <?php echo wp_get_attachment_image($nAttachmentID, array(100, 100), false, array()); ?>
-                            </div>
-                        <?php } ?>
-
-                        <div class="content">
-
-                            <div class="start">
-                                <span class="label"><?php echo __('Erstkauf (Startzeitpunkt):', 'wpsg'); ?></span>
-                                <span class="value">
-
-                                    <?php echo wpsg_formatTimestamp(strtotime($oOrder->cdate)); ?>
-
-                                </span>
-                            </div>
-                            <div class="price">
-                                <span class="label"><?php echo wpsg_translate(__('Preis (#1# Tage):', 'wpsg'), $oOrderProduct->getProduct()->wpsg_mod_abo_durration); ?></span>
-                                <span class="value"><?php echo wpsg_ff($oOrderProduct->getProduct()->wpsg_mod_abo_price, $this->get_option('wpsg_currency')); ?></span>
-                            </div>
-                            <div class="duration">
-                                <span class="label"><?php echo __('Laufzeit (Endzeitpunkt):', 'wpsg'); ?></span>
-                                <span class="value">
-
-                                    <?php $exp = $this->callMod('wpsg_mod_abo', 'getOrderAboExpiration', array($oOrder->id, $oOrderProduct->getId())); ?>
-
-                                    <?php if ($oAbo->getState() === wpsg_abo::STATE_RUNNING) { ?>
-                                        <span class="duration_running"><?php echo $exp; ?></span>
-                                    <?php } else if ($oAbo->getState() === wpsg_abo::STATE_INEXTENSION) { ?>
-                                        <span class="duration_inextension"><?php echo $exp; ?></span>
-                                    <?php } else if ($oAbo->getState() === wpsg_abo::STATE_EXTEND) { ?>
-                                        <span class="duration_expired"><?php echo $exp; ?></span>
-                                    <?php }  ?>
-
-                                </span>
-                            </div>
-                            <div class="status">
-                                <span class="label"><?php echo __('automatische VerlÃ€ngerung:', 'wpsg'); ?></span>
-                                <span class="value">
-
-                                    <?php if ($aboStatus['status'] === wpsg_mod_abo::STATUS_ACTIVE) { ?>
-
-                                        <span class="status_activ"><?php echo __('Aktiv'); ?></span>
-
-                                        <?php if (strtotime($aboStatus['mail_admin_stop']) > 0) { ?>
-
-                                            <?php echo __('KÃŒndigung ausstehend', 'wpsg'); ?>
-
-                                        <?php } else { ?>
-
-                                            <?php if (in_array($this->callMod('wpsg_mod_abo', 'getSetting', ['wpsg_mod_abo_autoexpire_customer', $oOrderProduct->getProductId()]), Array(wpsg_mod_abo::CUSTOMER_AUTO_MAIL, wpsg_mod_abo::CUSTOMER_AUTO_DIRECT))) { ?>
-                                            <span class="link_wrap"><a href="<?php echo $this->getUrl(wpsg_ShopController::URL_ABO, 'wpsg_mod_abo', 'stoprenewal', Array('order_id' => $oOrder->id, 'product_key' => $oOrderProduct->getProductKey())); ?>"><?php echo __('Deaktivieren'); ?></a></span>
-                                            <?php } ?>
-
-                                        <?php } ?>
-
-                                    <?php } else if ($aboStatus['status'] === wpsg_mod_abo::STATUS_STOPPED) { ?>
-                                        <span class="status_inactiv"><?php echo __('Inaktiv') ?></span>
-                                    <?php } ?>
-
-                                </span>
-                            </div>
-                        </div>
-
-                        <div class="wpsg_clear"></div>
-
-                    </div>
-
-                    <?php
-
-                }
-
-                ?>
-
-            <?php } ?>
-		
-			<?php /* foreach ($this->callMod('wpsg_mod_abo', 'getAboProductsFromOrder', Array($oOrder->id)) as $oOrderProduct) {
-				
-				$product_id = $oOrderProduct->getProductId();
-				$aboStatus = $this->callMod('wpsg_mod_abo', 'getAboProductStatus', Array($oOrder->id, $oOrderProduct->getProductKey())); 
-				 
-				try {
-				
-					$oAbo = wpsg_abo::getFromOrderAndProduct($oOrder->getId(), $oOrderProduct->getId());
-					
-				} catch (\Exception $e) {
-					
-					continue;
-					
-                }
-				
-				?>
-			
-				<div class="wpsg_mod_abo_order_product">
-
-					<h1 class="entry-title title">
-						<?php echo wpsg_translate(__('Abo "#1#" aus Bestellung #2#', 'wpsg'), $oOrderProduct->getProduct()->getProductName(), $oOrder->getNr()); ?>
-					</h1>
-					
-					<?php $nAttachmentID = $this->imagehandler->getAttachmentID($oOrderProduct->getProductKey()); ?>
-					
-					<?php if (wpsg_isSizedInt($nAttachmentID)) { ?>
-						<div class="image">
-							<?php echo wp_get_attachment_image($nAttachmentID, array(100, 100), false, array()); ?>
-						</div>
-					<?php } ?>
-			
-					<div class="content">
-					
-						<div class="start">
-							<span class="label"><?php echo __('Erstkauf (Startzeitpunkt):', 'wpsg'); ?></span>
-							<span class="value">
-								
-								<?php echo wpsg_formatTimestamp(strtotime($oOrder->cdate)); ?>
-								
-							</span>
-						</div>
-						<div class="price">
-							<span class="label"><?php echo wpsg_translate(__('Preis (#1# Tage):', 'wpsg'), $oOrderProduct->getProduct()->wpsg_mod_abo_durration); ?></span>
-							<span class="value"><?php echo wpsg_ff($oOrderProduct->getProduct()->wpsg_mod_abo_price, $this->get_option('wpsg_currency')); ?></span>
-						</div>
-						<div class="duration">
-							<span class="label"><?php echo __('Laufzeit (Endzeitpunkt):', 'wpsg'); ?></span>
-							<span class="value">
-								
-								<?php $exp = $this->callMod('wpsg_mod_abo', 'getOrderAboExpiration', array($oOrder->id, $oOrderProduct->getId())); ?>
-								
-								<?php if ($oAbo->getState() === wpsg_abo::STATE_RUNNING) { ?>
-									<span class="duration_running"><?php echo $exp; ?></span>
-                                <?php } else if ($oAbo->getState() === wpsg_abo::STATE_INEXTENSION) { ?>
-									<span class="duration_inextension"><?php echo $exp; ?></span>
-								<?php } else if ($oAbo->getState() === wpsg_abo::STATE_EXTEND) { ?>
-									<span class="duration_expired"><?php echo $exp; ?></span>
-								<?php }  ?>
-								
-							</span>
-						</div>					
-						<div class="status">
-							<span class="label"><?php echo __('automatische VerlÃ€ngerung:', 'wpsg'); ?></span>
-							<span class="value">
-													
-								<?php if ($aboStatus['status'] === wpsg_mod_abo::STATUS_ACTIVE) { ?>
-									
-									<span class="status_activ"><?php echo __('Aktiv'); ?></span>
-									
-									<?php if (strtotime($aboStatus['mail_admin_stop']) > 0) { ?>
-	
-										<?php echo __('KÃŒndigung ausstehend', 'wpsg'); ?>
-										
-									<?php } else { ?>
-									
-										<?php if (in_array($this->callMod('wpsg_mod_abo', 'getSetting', ['wpsg_mod_abo_autoexpire_customer', $product_id]), Array(wpsg_mod_abo::CUSTOMER_AUTO_MAIL, wpsg_mod_abo::CUSTOMER_AUTO_DIRECT))) { ?>
-										<span class="link_wrap"><a href="<?php echo $this->getUrl(wpsg_ShopController::URL_ABO, 'wpsg_mod_abo', 'stoprenewal', Array('order_id' => $oOrder->id, 'product_key' => $oOrderProduct->getProductKey())); ?>"><?php echo __('Deaktivieren'); ?></a></span>
-										<?php } ?>
-							
-									<?php } ?>
-									
-								<?php } else if ($aboStatus['status'] === wpsg_mod_abo::STATUS_STOPPED) { ?>
-									<span class="status_inactiv"><?php echo __('Inaktiv') ?></span>
-								<?php } ?> 
-								
-							</span>
-						</div>
-					</div>
-					
-					<div class="wpsg_clear"></div>
-					
-				</div>
-				
-			<?php } */ ?>
-							
-		<?php } // foreach Order ?>
-		</div>
-		
-	<?php } else {Â ?>
-	
-		<p><?php echo __('Bisher kein(e) Abonnement(s) vorhanden.', 'wpsg'); ?></p>
-		
-	<?php } ?>
-</div>
Index: ews/mods/mod_abo/produkt_addedit_content.phtml
===================================================================
--- /views/mods/mod_abo/produkt_addedit_content.phtml	(revision 8528)
+++ 	(revision )
@@ -1,184 +1,0 @@
-<?php
-
-	/**
-	 * Integriert die Abo-Einstellungen in das Produkt
-	 */
-
-    $arPaymentSelect = [
-        '-1' => __('Standard', 'wpsg'),
-        'origin' => __('Wie ursprÃŒngliche Zahlungsart', 'wpsg')
-	];
-    
-    foreach ($this->arPayment as $p) { $arPaymentSelect[$p['id']] = $p['name']; }
-    
-?>
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
-
-		jQuery('#wpsg_mod_abo_activ').bind('change', function() {
-
-			if (jQuery(this).attr('checked')) jQuery('#wpsg_mod_abo_layer').show();
-			else jQuery('#wpsg_mod_abo_layer').hide();
-			
-		} ).change();
-
-		jQuery('#wpsg_mod_abo_resell').bind('change', function() {
-
-			if (jQuery(this).attr('checked')) jQuery('#wpsg_mod_abo_resell_layer').show();
-			else jQuery('#wpsg_mod_abo_resell_layer').hide();
-			
-		} ).change();
-		
-	} );
-
-/* ]]> */</script>
-
-<div class="panel panel-default" id="wpsg_abo">		
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Abo Produkt', 'wpsg'); ?>
-		</h3>
-	</div>	
-	<div class="panel-body">
-	
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_activ', __('Abo Produkt', 'wpsg'), $this->view['product']['wpsg_mod_abo_activ'], array ('help' => 'wpsg_mod_abo_activ')); ?>
-		
-		<div id="wpsg_mod_abo_layer">
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_resell', __('Anzahl der Abo-VerlÃ€ngerungen beschrÃ€nken', 'wpsg'), $this->view['product']['wpsg_mod_abo_resell'], array ('help' => 'wpsg_mod_abo_resell')); ?>
-			
-			<div id="wpsg_mod_abo_resell_layer">
-				
-				<?php echo wpsg_drawForm_Input('wpsg_mod_abo_resell_count', __('max. Abo-VerlÃ€ngerungen', 'wpsg'), $this->view['product']['wpsg_mod_abo_resell_count'], array ('help' => 'wpsg_mod_abo_count')); ?>
-				
-			</div>
-			
-			<?php echo wpsg_drawForm_Input('wpsg_mod_abo_price', wpsg_translate(__('Abo Preis (#1#)', 'wpsg'), (($this->get_option('wpsg_preisangaben') == WPSG_NETTO)?__('Netto', 'wpsg'):__('Brutto', 'wpsg'))), wpsg_ff($this->view['product']['wpsg_mod_abo_price']), array('unit' => $this->get_option('wpsg_currency'), 'help' => 'wpsg_mod_abo_price')); ?>		
-			<?php echo wpsg_drawForm_Input('wpsg_mod_abo_durration', __('Abo Dauer (Tage)', 'wpsg'), $this->view['product']['wpsg_mod_abo_durration'], array('help' => 'wpsg_mod_abo_durration')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_abo_url', __('URL Benachrichtigung', 'wpsg'), $this->view['product']['wpsg_mod_abo_url'], array('hint' => wpsg_translate(__('Wird hier nichts angegeben, so wird die URL aus der <a href="#1#">Modulkonfiguration</a> bei Ablauf/VerlÃ€ngerung benachrichtigt.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_abo'), 'help' => 'wpsg_mod_abo_url')); ?>
-			
-			<div class="wpsg_clear"></div>
-					
-			<br />
-
-            <?php echo wpsg_drawForm_Select('wpsg_mod_abo_expiremode', __('Bei Ablauf des Abos', 'wpsg'), Array(
-            	wpsg_mod_abo::CONFIG => __('Standard', 'wpsg'),
-                wpsg_mod_abo::EXPIRE_MAIL => __('Mail versenden', 'wpsg'),
-                wpsg_mod_abo::EXPIRE_AUTO => __('Automatisch verlÃ€ngern', 'wpsg')
-            ), $this->view['product']['wpsg_mod_abo_expiremode'], array('help' => 'wpsg_mod_abo_expiremode')); ?>
-
-            <?php
-
-                $strLabelPreModeDefault = '';
-
-                if ($this->get_option('wpsg_mod_abo_premode') == wpsg_mod_abo::EXPIRE_MAIL) $strLabelPreModeDefault = ' / '.__('Mail versenden', 'wpsg');
-                else if ($this->get_option('wpsg_mod_abo_premode') === wpsg_mod_abo::EXPIRE_AUTO) $strLabelPreModeDefault = ' / '.__('Automatisch verlÃ€ngern', 'wpsg');
-
-            ?>
-
-            <?php echo wpsg_drawForm_Select('wpsg_mod_abo_premode', __('X - Tage vor Ablauf des Abos', 'wpsg'), [
-                wpsg_mod_abo::CONFIG => __('Standard', 'wpsg').$strLabelPreModeDefault,
-                wpsg_mod_abo::EXPIRE_MAIL => __('Mail versenden', 'wpsg'),
-                wpsg_mod_abo::EXPIRE_AUTO => __('Automatisch verlÃ€ngern', 'wpsg')
-            ], $this->view['product']['wpsg_mod_abo_premode'], ['help' => 'wpsg_mod_abo_premode']); ?>
-
-            <div id="wpsg_mod_abo_premode_greater0" style="display:none;">
-
-                <?php echo wpsg_drawForm_Input('wpsg_mod_abo_autoexpire_informationtime', __('Zeitspanne zum Versenden der Informationsmail in Tagen', 'wpsg'), $this->view['product']['wpsg_mod_abo_autoexpire_informationtime'], [
-                    'help' => 'wpsg_mod_abo_autoexpire_informationtime'
-                ]); ?>
-
-            </div>
-
-            <script>
-
-                let wpsg_mod_abo_premodeSELECT = document.getElementById('wpsg_mod_abo_premode');
-                let wpsg_mod_abo_premode_greater0DIV = document.getElementById('wpsg_mod_abo_premode_greater0');
-
-                wpsg_mod_abo_premodeSELECT.addEventListener('change', () => {
-
-                	console.log(parseInt(wpsg_mod_abo_premodeSELECT.value));
-
-                	if (parseInt(wpsg_mod_abo_premodeSELECT.value) > 0 || (parseInt(wpsg_mod_abo_premodeSELECT.value) === -1 && <?php echo ((intval($this->get_option('wpsg_mod_abo_premode')) > 0)?'true':'false'); ?>)) {
-
-                		wpsg_mod_abo_premode_greater0DIV.style.display = 'block';
-
-                    } else {
-
-                        wpsg_mod_abo_premode_greater0DIV.style.display = 'none';
-
-                    }
-
-                });
-
-                wpsg_mod_abo_premodeSELECT.dispatchEvent(new Event('change'));
-
-            </script>
-
-			<br />
-
-			<div id="wpsg_mod_abo_expiremode_auto_layer" style="display:none;">
-				
-                <?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_payment', __('Zahlungsart fÃŒr automatische VerlÃ€ngerung', 'wpsg'), $arPaymentSelect, $this->view['product']['wpsg_mod_abo_autoexpire_payment'], array('help' => 'wpsg_mod_abo_autoexpire_payment')); ?>
-                
-				<?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_customermail', __('Mail an Kunden', 'wpsg'), [
-                    wpsg_mod_abo::CONFIG => __('Standard', 'wpsg'),
-                    '0' => __('Nein', 'wpsg'),
-                    '1' => __('Ja', 'wpsg')
-                ], $this->view['product']['wpsg_mod_abo_autoexpire_customermail'], ['help' => 'wpsg_mod_abo_autoexpire_customermail']); ?>
-
-                <?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_adminmail', __('Mail an Administrator', 'wpsg'), [
-                    wpsg_mod_abo::CONFIG => __('Standard', 'wpsg'),
-                    '0' => __('Nein', 'wpsg'),
-                    '1' => __('Ja', 'wpsg')
-                ], $this->view['product']['wpsg_mod_abo_autoexpire_adminmail'], ['help' => 'wpsg_mod_abo_autoexpire_adminmail']); ?>
-
-			</div>
-
-            <script>
-
-                let wpsg_mod_abo_expiremode_auto_layer = document.getElementById('wpsg_mod_abo_expiremode_auto_layer');
-                let wpsg_mod_abo_expiremode = document.getElementById('wpsg_mod_abo_expiremode');
-                let wpsg_mod_abo_premode = document.getElementById('wpsg_mod_abo_premode');
-
-                function displayAutoRenewOptions() {
-
-                    if (wpsg_mod_abo_expiremode.value === '<?php echo wpsg_mod_abo::EXPIRE_AUTO; ?>' || wpsg_mod_abo_premode.value === '<?php echo wpsg_mod_abo::EXPIRE_AUTO; ?>') {
-
-                        wpsg_mod_abo_expiremode_auto_layer.style.display = 'block';
-
-                    } else {
-
-                        wpsg_mod_abo_expiremode_auto_layer.style.display = 'none';
-
-                    }
-
-                }
-
-                wpsg_mod_abo_expiremode.addEventListener('change', displayAutoRenewOptions);
-                wpsg_mod_abo_premode.addEventListener('change', displayAutoRenewOptions);
-
-                displayAutoRenewOptions();
-
-            </script>
-			
-			<script>
-				
-				jQuery('#wpsg_mod_abo_expiremode').on('change', function() {
-				    
-				    jQuery('.wpsg_mod_abo_expiremode').hide();
-				    jQuery('.wpsg_mod_abo_expiremode_' + jQuery(this).val()).show();
-				    
-				}).trigger('change');
-
-			</script>
-
-		</div>
-		
-		<br />
-		
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_abo"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Abo-Moduls', 'wpsg'); ?></a>
-		
-	</div>
-</div>
Index: /views/mods/mod_abo/produkt_edit_content.phtml
===================================================================
--- /views/mods/mod_abo/produkt_edit_content.phtml	(revision 5261)
+++ /views/mods/mod_abo/produkt_edit_content.phtml	(revision 5261)
@@ -0,0 +1,58 @@
+<?php
+
+	/**
+	 * Integriert die Abo-Einstellungen in das Produkt
+	 */
+	
+?>
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+
+		jQuery('#wpsg_mod_abo_activ').bind('change', function() {
+
+			if (jQuery(this).attr('checked')) jQuery('#wpsg_mod_abo_layer').show();
+			else jQuery('#wpsg_mod_abo_layer').hide();
+			
+		} ).change();
+
+		jQuery('#wpsg_mod_abo_resell').bind('change', function() {
+
+			if (jQuery(this).attr('checked')) jQuery('#wpsg_mod_abo_resell_layer').show();
+			else jQuery('#wpsg_mod_abo_resell_layer').hide();
+			
+		} ).change();
+		
+	} );
+
+/* ]]> */</script>
+
+<div class="postbox" id="wpsg_abo">		
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Abo Produkt', 'wpsg'); ?></span>
+	</h3>	
+	<div class="inside">
+	
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_activ', __('Abo Produkt', 'wpsg'), $this->view['product']['wpsg_mod_abo_activ']); ?>
+		
+		<div id="wpsg_mod_abo_layer">
+			
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_resell', __('Anzahl beschrÃ€nken', 'wpsg'), $this->view['product']['wpsg_mod_abo_resell']); ?>
+			
+			<div id="wpsg_mod_abo_resell_layer">
+				
+				<?php echo wpsg_drawForm_Input('wpsg_mod_abo_resell_count', __('Anzahl', 'wpsg'), $this->view['product']['wpsg_mod_abo_resell_count']); ?>
+				
+			</div>
+			
+			<?php echo wpsg_drawForm_Input('wpsg_mod_abo_price', wpsg_translate(__('Abo Preis (#1#)', 'wpsg'), (($this->get_option('wpsg_preisangaben') == WPSG_NETTO)?__('Netto', 'wpsg'):__('Brutto', 'wpsg'))), wpsg_ff($this->view['product']['wpsg_mod_abo_price']), array('unit' => $this->get_option('wpsg_currency'))); ?>		
+			<?php echo wpsg_drawForm_Input('wpsg_mod_abo_durration', __('Abo Dauer (Tage)', 'wpsg'), $this->view['product']['wpsg_mod_abo_durration']); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_abo_url', __('URL Benachrichtigung', 'wpsg'), $this->view['product']['wpsg_mod_abo_url'], array('hint' => wpsg_translate(__('nohspc_Wird hier nichts angegeben, so wird die URL aus der <a href="#1#">Modulkonfiguration</a> bei Ablauf/VerlÃ€ngerung benachrichtigt.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_abo'))); ?>			 
+			
+			<div class="wpsg_clear"></div>
+			
+		</div>
+		
+	</div>
+</div>
Index: /views/mods/mod_abo/settings_edit.phtml
===================================================================
--- /views/mods/mod_abo/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_abo/settings_edit.phtml	(revision 5261)
@@ -4,158 +4,9 @@
 	 * Template fÃŒr die Einstellungen des Abo Moduls
 	 */
-	
-	$arPaymentSelect = [
-		'origin' => __('Wie ursprÃŒngliche Zahlungsart', 'wpsg')
-	];
-	
-	foreach ($this->arPayment as $p) { $arPaymentSelect[$p['id']] = $p['name']; }
-	
+
 ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_abo_url', __('Standard URL fÃŒr Ablauf/VerlÃ€ngerung', 'wpsg'), $this->get_option('wpsg_mod_abo_url'), array ('help' => 'wpsg_mod_abo_url')); ?>
 <br />
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_wpsgmodabofirstbuy', __('Mail bei erstem Kauf eines Abos', 'wpsg'), $this->get_option('wpsg_mod_abo_wpsgmodabofirstbuy'), array('hint' => wpsg_translate(__('Mail wird bei Bezahlung der Abo Bestellung zusÃ€tzlich versendet. (mail_firstbuy.phtml) -> <a href="#1#">Konfiguration</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#wpsgmodabofirstbuy'), 'help' => 'wpsg_mod_abo_wpsgmodabofirstbuy')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_wpsgmodabrebuy', __('Mail bei Kauf einer VerlÃ€ngerung', 'wpsg'), $this->get_option('wpsg_mod_abo_wpsgmodabrebuy'), array('hint' => wpsg_translate(__('Mail wird bei Bezahlung einer Abo VerlÃ€ngerung versendet. (mail_rebuy.phtml) -> <a href="#1#">Konfiguration</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#wpsgmodabrebuy'), 'help' => 'wpsg_mod_abo_wpsgmodabrebuy')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_abo_perpage', __('Abos pro Seite (Backend)', 'wpsg'), $this->get_option('wpsg_mod_abo_perpage'), array('help' => 'wpsg_mod_abo_perpage')); ?>
-
-<br />
- 
-<?php echo wpsg_drawForm_Select('wpsg_mod_abo_expiremode', __('Bei Ablauf des Abos', 'wpsg'), Array(
-    wpsg_mod_abo::EXPIRE_NONE => __('Nichts', 'wpsg'),
-	wpsg_mod_abo::EXPIRE_MAIL => __('Mail versenden', 'wpsg'),
-	wpsg_mod_abo::EXPIRE_AUTO => __('Automatisch verlÃ€ngern', 'wpsg')
-), $this->get_option('wpsg_mod_abo_expiremode'), array('help' => 'wpsg_mod_abo_expiremode')); ?>
-
-<?php echo wpsg_drawForm_Select('wpsg_mod_abo_premode', __('X - Tage vor Ablauf des Abos', 'wpsg'), [
-    wpsg_mod_abo::EXPIRE_NONE => __('Nichts', 'wpsg'),
-    wpsg_mod_abo::EXPIRE_MAIL => __('Mail versenden', 'wpsg'),
-    wpsg_mod_abo::EXPIRE_AUTO => __('Automatisch verlÃ€ngern', 'wpsg')
-], $this->get_option('wpsg_mod_abo_premode'), ['help' => 'wpsg_mod_abo_premode']); ?>
-
-<div id="wpsg_mod_abo_premode_greater0" style="display:none;">
-
-    <?php echo wpsg_drawForm_Input('wpsg_mod_abo_autoexpire_informationtime', __('Zeitspanne zum Versenden der Informationsmail in Tagen', 'wpsg'), $this->get_option('wpsg_mod_abo_autoexpire_informationtime'), [
-        'help' => 'wpsg_mod_abo_autoexpire_informationtime'
-    ]); ?>
-
-</div>
-
-<script>
-
-    let wpsg_mod_abo_premodeSELECT = document.getElementById('wpsg_mod_abo_premode');
-    let wpsg_mod_abo_premode_greater0DIV = document.getElementById('wpsg_mod_abo_premode_greater0');
-
-    wpsg_mod_abo_premodeSELECT.addEventListener('change', () => {
-
-        console.log(parseInt(wpsg_mod_abo_premodeSELECT.value));
-
-        if (parseInt(wpsg_mod_abo_premodeSELECT.value) > 0 || (parseInt(wpsg_mod_abo_premodeSELECT.value) === -1 && <?php echo ((intval($this->get_option('wpsg_mod_abo_premode')) > 0)?'true':'false'); ?>)) {
-
-            wpsg_mod_abo_premode_greater0DIV.style.display = 'block';
-
-        } else {
-
-            wpsg_mod_abo_premode_greater0DIV.style.display = 'none';
-
-        }
-
-    });
-
-    wpsg_mod_abo_premodeSELECT.dispatchEvent(new Event('change'));
-
-</script>
-
-<br />
-
-<div id="wpsg_mod_abo_expiremode_auto_layer" style="display:none;">
-	
-	<?php /* TODO: Mehrfachauswahl von Zahlungsarten */ ?>
-	<?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_payment', __('Zahlungsart fÃŒr automatische VerlÃ€ngerung', 'wpsg'), $arPaymentSelect, $this->get_option('wpsg_mod_abo_autoexpire_payment'), array('help' => 'wpsg_mod_abo_autoexpire_payment')); ?>
-
-	<?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_customermail', __('Mail an Kunden', 'wpsg'), [
-        '0' => __('Nein', 'wpsg'),
-        '1' => __('Ja', 'wpsg')
-    ], $this->get_option('wpsg_mod_abo_autoexpire_customermail'), ['help' => 'wpsg_mod_abo_autoexpire_customermail']); ?>
-
-    <?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_adminmail', __('Mail an Administrator', 'wpsg'), [
-        '0' => __('Nein', 'wpsg'),
-        '1' => __('Ja', 'wpsg')
-    ], $this->get_option('wpsg_mod_abo_autoexpire_adminmail'), ['help' => 'wpsg_mod_abo_autoexpire_adminmail']); ?>
-
-	<br />
-
-</div>
-
-<script>
-
-    let wpsg_mod_abo_expiremode_auto_layer = document.getElementById('wpsg_mod_abo_expiremode_auto_layer');
-    let wpsg_mod_abo_expiremode = document.getElementById('wpsg_mod_abo_expiremode');
-    let wpsg_mod_abo_premode = document.getElementById('wpsg_mod_abo_premode');
-
-    function displayAutoRenewOptions() {
-
-    	if (wpsg_mod_abo_expiremode.value === '<?php echo wpsg_mod_abo::EXPIRE_AUTO; ?>' || wpsg_mod_abo_premode.value === '<?php echo wpsg_mod_abo::EXPIRE_AUTO; ?>') {
-
-    		wpsg_mod_abo_expiremode_auto_layer.style.display = 'block';
-
-        } else {
-
-    		wpsg_mod_abo_expiremode_auto_layer.style.display = 'none';
-
-        }
-
-    }
-
-    wpsg_mod_abo_expiremode.addEventListener('change', displayAutoRenewOptions);
-    wpsg_mod_abo_premode.addEventListener('change', displayAutoRenewOptions);
-
-    displayAutoRenewOptions();
-
-</script>
-
-<?php echo wpsg_drawForm_Select('wpsg_mod_abo_autoexpire_customer', __('Kunde kann im Frontend', 'wpsg'), Array(
-    wpsg_mod_abo::CUSTOMER_AUTO_NOTHING => __('Nichts', 'wpsg'),
-    wpsg_mod_abo::CUSTOMER_AUTO_DIRECT => __('VerlÃ€ngerung direkt stoppen', 'wpsg'),
-    wpsg_mod_abo::CUSTOMER_AUTO_MAIL => __('VerlÃ€ngerung ÃŒber Mail an Administrator stoppen', 'wpsg')
-), $this->get_option('wpsg_mod_abo_autoexpire_customer'), array('help' => 'wpsg_mod_abo_autoexpire_customer')); ?>
-
-<?php echo wpsg_drawForm_Input(false, __('CRON URL', 'wpsg'), site_url().'/?wpsg_cron=1', ['readonly' => true]); ?>
-
-<?php echo wpsg_drawForm_TextStart(); ?>
-
-    <span><?php echo __('Letzter Lauf: ', 'wpsg'); ?><?php echo wpsg_formatTimestamp($this->get_option('wpsg_mod_abo_cron_lastrun'), false, true); ?></span><br />
-    <span>
-        <?php
-            
-            $upload_dir = \wp_upload_dir();
-            $pid_file = $upload_dir['basedir'].'/wpsg_cron_abo';
-            
-            echo __('Status: ', 'wpsg'); 
-            
-        ?><?php echo (($this->get_option('wpsg_mod_abo_cron_run') === '1')?_('LÃ€uft gerade'):_('Wartend')); ?> 
-        <?php if ($this->get_option('wpsg_mod_abo_cron_run') === '1' || file_exists($pid_file)) { ?>
-            (<?php echo __('Start: ', 'wpsg'); ?><?php echo wpsg_formatTimestamp($this->get_option('wpsg_mod_abo_cron_start'), false, true); ?>)
-            <a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_abo&subaction=resetCron&noheader=1'; ?>"><?php echo __('ZurÃŒcksetzen', 'wpsg'); ?></a>
-        <?php } ?>
-    </span>
-
-<?php echo wpsg_drawForm_TextEnd(__('Cron Status')); ?>
-
-<br /> 
-
-<script>
-
-    jQuery(document).ready(function() {
-    	
-    	jQuery('#wpsg_mod_abo_expiremode').on('change', function() {
-    		
-    		jQuery('.wpsg_mod_expiremode').hide();
-			jQuery('.wpsg_mod_expiremode_' + jQuery(this).val()).show();
-    		
-		} ); 
-
-	} );
-
-</script>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_wpsgmodabofirstbuy', __('Mail bei erstem Kauf eines Abos', 'wpsg'), $this->get_option('wpsg_mod_abo_wpsgmodabofirstbuy'), array('hint' => wpsg_translate(__('nohspc_Mail wird bei Bezahlung der Abo Bestellung zusÃ€tzlich versendet. (mail_firstbuy.phtml) -> <a href="#1#">Konfiguration</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#wpsgmodabofirstbuy'), 'help' => 'wpsg_mod_abo_wpsgmodabofirstbuy',)); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_wpsgmodaboexpiration', __('Mail bei Auslauf eines Abos', 'wpsg'), $this->get_option('wpsg_mod_abo_wpsgmodaboexpiration'), array('hint' => wpsg_translate(__('nohspc_Mail wird bei Auslauf eines Abos versendet. (mail_expiration.phtml) -> <a href="#1#">Konfiguration</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#wpsgmodaboexpiration'), 'help' => 'wpsg_mod_abo_wpsgmodaboexpiration',)); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_abo_wpsgmodabrebuy', __('Mail bei Kauf einer VerlÃ€ngerung', 'wpsg'), $this->get_option('wpsg_mod_abo_wpsgmodabrebuy'), array('hint' => wpsg_translate(__('nohspc_Mail wird bei Bezahlung einer Abo VerlÃ€ngerung versendet. (mail_rebuy.phtml) -> <a href="#1#">Konfiguration</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#wpsgmodabrebuy'), 'help' => 'wpsg_mod_abo_wpsgmodabrebuy',)); ?>
Index: /views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml
===================================================================
--- /views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml	(revision 8528)
+++ /views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml	(revision 5261)
@@ -10,5 +10,5 @@
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse']; ?>    
 <?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?> 
 <?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
@@ -35,5 +35,5 @@
 <?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?> 
 <?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>    
+<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse']; ?>    
 <?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?> 
 <?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
@@ -104,10 +104,10 @@
 <?php if ($this->view['basket']['sum']['preis_shipping'] != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?> 
      <?php echo wpsg_pad_right(__('Versandkosten', 'wpsg'), 40); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value']??0,'% '), 10); ?>
+<?php echo wpsg_pad_left(wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value'],'% '), 10); ?>
 <?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')), 21); ?> 
 <?php } ?>
 <?php if ($this->view['basket']['sum']['preis_payment'] != 0 || $this->get_option('wpsg_hideemptypayment') != '1') { ?>
      <?php echo wpsg_pad_right(__('Zahlungsart', 'wpsg'), 40); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->arPayment[$this->view['basket']['checkout']['payment']]['mwst_value']??0,'% '), 10); ?>
+<?php echo wpsg_pad_left(wpsg_ff($this->arPayment[$this->view['basket']['checkout']['payment']]['mwst_value'],'% '), 10); ?>
 <?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')), 21); ?> 
 <?php } ?>
@@ -128,6 +128,4 @@
      <?php echo wpsg_pad_right(__('Gesamtpreis', 'wpsg'), 37); ?>
 <?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), 34); ?> 
-
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
 
 <?php echo __('Wir bedanken uns fuer Ihre Bestellung.', 'wpsg'); ?> 
Index: /views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml
===================================================================
--- /views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml	(revision 8528)
+++ /views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml	(revision 5261)
@@ -3,5 +3,4 @@
 	/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
 	$this->htmlMail = true;
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?><?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/html_head.phtml'); ?>
@@ -22,5 +21,5 @@
 <?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml'); ?> 
 
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
+<?php $this->callMods('mail_aftercalculation', array(&$this->view['basket']['checkout']['o_id'])); ?>
 
 <?php if (wpsg_isSizedString($this->view['basket']['checkout']['comment'])) { ?>
Index: /views/mods/mod_auftragsbestaetigung/order_view.phtml
===================================================================
--- /views/mods/mod_auftragsbestaetigung/order_view.phtml	(revision 8528)
+++ /views/mods/mod_auftragsbestaetigung/order_view.phtml	(revision 5261)
@@ -28,21 +28,20 @@
 </script>
 
-<?php echo wpsg_drawForm_AdminboxStart(__('AuftragsbestÃ€tigung', 'wpsg')); ?>
-	
+<div class="postbox" id="wpsg_auftragsbestaetigung">			
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('AuftragsbestÃ€tigung', 'wpsg'); ?></span>
+	</h3>
 	<div class="inside">						
 		<div class="inside" style="padding:5px;">
 			
-			<p>
-				<?php echo __('Die AuftragsbestÃ€tigung bestÃ€tigt dem Kunden die erfolgreiche Erfassung des Auftrages. Abweichungen vom Auftrag kÃ¶nnen mittels des Textfeldes mitgesendet werden.', 'wpsg'); ?>
-				<?php echo __('Der Status Ã€ndert sich automatisch auf "BestÃ€tigt".', 'wpsg'); ?>
-			</p>
-			
-			<br />
-			
 			<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_auftragsbestaetigung&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1">			
-				<div style="padding-left:5px;">
-					<textarea style="width:100%;" class="wpsg_order_view_auftragsbestaetigung" name="auftrag_note"></textarea>
-				</div>
-				<input class="button" style="float:right; margin-right:10px;" type="submit" value="<?php echo __('Senden', 'wpsg'); ?>" /><br />
+				<textarea class="wpsg_order_view_auftragsbestaetigung" name="auftrag_note"></textarea>
+				<input class="wpsg_order_view_auftragsbestaetigung_submit" type="submit" value="<?php echo __('Senden', 'wpsg'); ?>" /><br />
+				<i>
+					<?php echo __('Die AuftragsbestÃ€tigung bestÃ€tigt dem Kunden die erfolgreiche Erfassung des Auftrages. Abweichungen vom Auftrag kÃ¶nnen mittels des Textfeldes mitgesendet werden.', 'wpsg'); ?>
+					<?php echo __('Der Status Ã€ndert sich automatisch auf "BestÃ€tigt".', 'wpsg'); ?>
+				</i>
+				<br />
 				<input type="hidden" name="mod_auftragbestaetigung" value="1"/>
 			</form>
@@ -50,4 +49,3 @@
 		</div>
 	</div>
-	
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+</div>
Index: /views/mods/mod_autodebit/order_view_afterpayment.phtml
===================================================================
--- /views/mods/mod_autodebit/order_view_afterpayment.phtml	(revision 8528)
+++ /views/mods/mod_autodebit/order_view_afterpayment.phtml	(revision 5261)
@@ -6,104 +6,18 @@
 
 ?>
-    
 <br />
-    
-<?php echo wpsg_drawForm_Text(__('Name der Bank', 'wpsg'), $this->view['wpsg_mod_autodebit']['name'], 'wpsg_mod_autodebit_name'); ?>
+<?php echo wpsg_drawForm_Input('', __('Name der Bank', 'wpsg'), $this->view['wpsg_mod_autodebit']['name'], array('text' => true, 'clear_after' => true)); ?>
 
 <?php if ($this->get_option('wpsg_mod_autodebit_iban') == '1') { ?>
-
-    <?php echo wpsg_drawForm_Text(__('BIC der Bank', 'wpsg'), $this->view['wpsg_mod_autodebit']['bic'], 'wpsg_mod_autodebit_bic'); ?>
-    
+<?php echo wpsg_drawForm_Input('', __('BIC der Bank', 'wpsg'), $this->view['wpsg_mod_autodebit']['bic'], array('text' => true, 'clear_after' => true)); ?>
 <?php } else { ?>
-    
-    <?php echo wpsg_drawForm_Text(__('BLZ der Bank', 'wpsg'), $this->view['wpsg_mod_autodebit']['blz'], 'wpsg_mod_autodebit_blz'); ?>
-    
+<?php echo wpsg_drawForm_Input('', __('BLZ der Bank', 'wpsg'), $this->view['wpsg_mod_autodebit']['blz'], array('text' => true, 'clear_after' => true)); ?>
 <?php } ?>
 
-<?php echo wpsg_drawForm_Text(__('Inhaber', 'wpsg'), $this->view['wpsg_mod_autodebit']['inhaber'], 'wpsg_mod_autodebit_owner'); ?>
+<?php echo wpsg_drawForm_Input('', __('Inhaber', 'wpsg'), $this->view['wpsg_mod_autodebit']['inhaber'], array('text' => true, 'clear_after' => true)); ?>
 
 <?php if ($this->get_option('wpsg_mod_autodebit_iban') == '1') { ?>
-
-    <?php echo wpsg_drawForm_Text(__('IBAN Nr.', 'wpsg'), $this->view['wpsg_mod_autodebit']['iban'], 'wpsg_mod_autodebit_iban'); ?>
-    
+<?php echo wpsg_drawForm_Input('', __('IBAN Nr.', 'wpsg'), $this->view['wpsg_mod_autodebit']['iban'], array('text' => true, 'clear_after' => true)); ?>
 <?php } else { ?>
-    
-    <?php echo wpsg_drawForm_Text(__('Kontonummer', 'wpsg'), $this->view['wpsg_mod_autodebit']['knr'], 'wpsg_mod_autodebit_knr'); ?>
-    
+<?php echo wpsg_drawForm_Input('', __('Kontonummer', 'wpsg'), $this->view['wpsg_mod_autodebit']['knr'], array('text' => true, 'clear_after' => true)); ?>
 <?php } ?>
-
-<script>
-    
-    jQuery('#wpsg_mod_autodebit_name').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&do=inlinedit&noheader=1', {
-        submitdata: {
-        	order_id: <?php echo intval($_REQUEST['edit_id']); ?>,
-            field: 'name'
-        },
-        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-    });
-    
-    jQuery('#wpsg_mod_autodebit_owner').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&do=inlinedit&noheader=1', {
-        submitdata: {
-        	order_id: <?php echo intval($_REQUEST['edit_id']); ?>,
-            field: 'owner'
-        },
-        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-    });
-    
-    <?php if ($this->get_option('wpsg_mod_autodebit_iban') == '1') { ?>
-    
-        jQuery('#wpsg_mod_autodebit_bic').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&do=inlinedit&noheader=1', {
-            submitdata: {
-            	order_id: <?php echo intval($_REQUEST['edit_id']); ?>,
-                field: 'bic'
-            },
-            submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-            placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-            indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-            tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-        });
-        
-        jQuery('#wpsg_mod_autodebit_iban').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&do=inlinedit&noheader=1', {
-            submitdata: {
-            	order_id: <?php echo intval($_REQUEST['edit_id']); ?>,
-                field: 'iban'
-            },
-            submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-            placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-            indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-            tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-        });
-    
-    <?php } else { ?>
-    
-        jQuery('#wpsg_mod_autodebit_blz').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&do=inlinedit&noheader=1', {
-            submitdata: {
-            	order_id: <?php echo intval($_REQUEST['edit_id']); ?>,
-                field: 'blz'
-            },
-            submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-            placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-            indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-            tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-        });
-        
-        jQuery('#wpsg_mod_autodebit_knr').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&do=inlinedit&noheader=1', {
-            submitdata: {
-            	order_id: <?php echo intval($_REQUEST['edit_id']); ?>,
-                field: 'knr'
-            },
-            submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-            placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-            indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-            tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-        });
-    
-    <?php } ?>
-    
-</script>
Index: /views/mods/mod_autodebit/paymenthint.phtml
===================================================================
--- /views/mods/mod_autodebit/paymenthint.phtml	(revision 8528)
+++ /views/mods/mod_autodebit/paymenthint.phtml	(revision 5261)
@@ -39,5 +39,5 @@
 		<label>
 			<?php echo __('IBAN', 'wpsg'); ?><span class="wpsg_required">*</span>:
-			<input class="<?php echo ((in_array("mod_autodebit_iban", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" name="wpsg_mod_autodebit[iban]" id="wpsg_mod_autodebit_iban" value="<?php echo wpsg_hspc($this->view['wpsg_mod_autodebit']['iban']); ?>" />
+			<input class="<?php echo ((in_array("mod_autodebit_iban", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" name="wpsg_mod_autodebit[iban]" value="<?php echo wpsg_hspc($this->view['wpsg_mod_autodebit']['iban']); ?>" />
 		</label>
 	</div>
@@ -66,63 +66,2 @@
 	
 </div>
-
-<script>
-
-//id="wpsg_mod_autodebit_iban"
-jQuery("#wpsg_mod_autodebit_iban").on("input", function () {
-	var
-		iban,
-		a1,
-		bb = true,
-		sum = 0,
-		csum,
-		i;
-
-	//alert("oninput");
-	iban = jQuery('#wpsg_mod_autodebit_iban').val();
-	iban = iban.replace(/ /g, "");
-	// 2 + 2 + 8 + 10
-	// DE 22 Zeichen
-	// AT 20 Zeichen
-	// CH 21 Zeichen
-	// Ersetze alle Buchstaben durch Zahlen, wobei A = 10, B = 11, âŠ, Z = 35.
-    // Berechne den ganzzahligen Rest, der bei Division durch 97 bleibt.
-    // Subtrahiere den Rest von 98, das Ergebnis sind die beiden PrÃŒfziffern. 
-    // Falls das Ergebnis einstellig ist, wird es mit einer fÃŒhrenden Null ergÃ€nzt.
-	// DE80500105175408332501 --> 500105175408332501DE80 --> 500105175408332501131480
-	// Zahl modulo 97 muss 1 ergeben
-
-	if (iban.length < 16) { return; }
-
-	sum = iban.substr(4);
-
-	a1 = parseInt(iban.charCodeAt(0, 1) - 64, 10) + 9;
-	sum = sum + a1.toString();
-	a1 = parseInt(iban.charCodeAt(1, 1) - 64, 10) + 9;
-	sum = sum + a1.toString();
-	sum = sum + iban.substr(2, 2);
-	
-	//sum = sum % 97;
-    // Calculate checksum
-    csum = parseInt(sum.substr(0, 1), 10);
-    for (i = 1; i < sum.length; i++) {
-        csum = csum * 10;
-        csum = csum + parseInt(sum.substr(i, 1), 10);
-        csum = csum % 97;
-    }
-	
-	if (csum !== 1) { bb = false; }
-
-	jQuery('#wpsg_mod_autodebit_iban').removeClass('wpsg_error');
-	if (bb === false) {
-		//alert('IBAN fehlerhaft');
-		jQuery('#wpsg_mod_autodebit_iban').addClass('wpsg_error');
-	}
-
-});
-
-
-
-
-
-</script>
Index: /views/mods/mod_autodebit/settings_edit.phtml
===================================================================
--- /views/mods/mod_autodebit/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_autodebit/settings_edit.phtml	(revision 5261)
@@ -15,5 +15,4 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_autodebit_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_autodebit_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_autodebit_iban', __('IBAN/BIC statt Kontonummer/BLZ verwenden', 'wpsg'), $this->get_option('wpsg_mod_autodebit_iban'), array('help' => 'wpsg_mod_autodebit_iban')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_autodebit_bic', __('BIC validieren', 'wpsg'), $this->get_option('wpsg_mod_autodebit_bic'), array('help' => 'wpsg_mod_autodebit_bic')); ?>
 <?php // echo wpsg_drawForm_Button('wpsg_mod_autodebit_ibanbicconvert2',  __('BIC/IBAN Konvertierung', 'wpsg'), array('button_text' => __('BIC/IBAN Konvertieren', 'wpsg'), 'button_class' => 'wpsg_mod_autodebit_button', 'button_onclick' => 'if (!confirm(\''.wpsg_hspc(__('Es werden die Bankdaten von allen Bestellungen mit Bankeinzug in BIC/IBAN konvertiert, sofern noch nicht angegeben. Die LÃ€nderkÃŒrzel mÃŒssen den IBAN LÃ€nderkÃŒrzeln entsprechen.', 'wpsg')).'\')) return false; location.href=\''.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&wpsg_mod_autodebit_bicibanconverter=1&mail=0&noheader=1\'')); ?>
 <?php // echo wpsg_drawForm_Button('wpsg_mod_autodebit_ibanbicconvert', '', array('button_text' => __('BIC/IBAN Konvertierung starten / Kunden informieren', 'wpsg'), 'button_class' => 'wpsg_mod_autodebit_button', 'button_onclick' => 'if (!confirm(\''.wpsg_hspc(__('Es werden die Bankdaten von allen Bestellungen mit Bankeinzug in BIC/IBAN konvertiert, sofern noch nicht angegeben. Die LÃ€nderkÃŒrzel mÃŒssen den IBAN LÃ€nderkÃŒrzeln entsprechen. Der Kunde wird darÃŒber per E-Mail informiert.', 'wpsg')).'\')) return false;', 'onclick' => WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_autodebit&wpsg_mod_autodebit_bicibanconverter=1&mail=1&noheader=1')); ?>
Index: /views/mods/mod_bankalignment/order_ajax.phtml
===================================================================
--- /views/mods/mod_bankalignment/order_ajax.phtml	(revision 5261)
+++ /views/mods/mod_bankalignment/order_ajax.phtml	(revision 5261)
@@ -0,0 +1,97 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Zuweisung der Bestellungen zu DatensÃ€tzen aus der CSV Datei
+	 */
+
+	//wpsg_debug($this->view);
+
+?>
+<div class="wrap wpsg_mod_bankalignment_order_ajax">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Bestellverwaltung', 'wpsg'); ?> - <?php echo __('Bankabgleich', 'wpsg'); ?>
+	</h2>
+	
+	<br />
+	
+	<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_bankalignment">
+	
+		<table class="widefat post fixed">
+			<thead>
+				<tr>
+					<th class="manage-column wpsg-nr"><?php echo __('Zeile', 'wpsg'); ?></th>
+					<th class="manage-column wpsg-order"><?php echo __('Bestellung', 'wpsg'); ?></th>
+				</tr>
+			</thead>
+			<tbody>
+				<?php $i = 0; foreach ($this->view['set'] as $row) { $i ++; ?>
+				<tr>
+					<td class="wpsg-nr">
+						<?php echo $i; ?>
+						<?php if ($row['order_id'] === false) { ?>
+						<span class="wpsg_error"><?php echo __('Bestellung konnte nicht automatisch ermittelt werden.', 'wpsg'); ?></span>
+						<?php } else { ?>
+						<span class="wpsg_erfolg"><?php echo wpsg_translate(__('Bestellung #1# wurde automatisch erkannt.', 'wpsg'), $row['onr']); ?></span>
+						<?php } ?>
+						<div class="row-actions">
+							<span class="view"><a onclick="return wpsg_mod_bankalignment_show(this);" title="<?php echo __("Details anzeigen", "wpsg"); ?>" href="#"><?php echo __("Details anzeigen", "wpsg"); ?></a></span>
+						</div>
+						<div class="row-details">
+							<br />
+							<?php foreach ($this->view['colInfo'] as $k => $v) { ?>
+							<?php echo $v; ?>: <?php echo $row['data'][$k]; ?> <br />
+							<?php } ?>						
+						</div>
+					</td>
+					<td class="wpsg-order">
+						<select name="set[]" style="width:100%;">
+							<option value="-1"><?php echo __('Bitte Bestellung auswÃ€hlen / Zeile ignorieren', 'wpsg'); ?></option>
+							<?php foreach ($this->view['arOrder'] as $o) { ?>
+							<option <?php echo (($row['order_id'] == $o['o_id'])?'selected="selected"':''); ?> value="<?php echo $o['o_id']; ?>"><?php echo wpsg_translate(__('Bestellung #1# (#2#) auf "#3#" setzen', 'wpsg'), $o['onr'], $o['okey'], $this->arStatus[100]); ?></option>
+							<?php } ?>
+						</select>					
+					</td>
+				</tr>
+				<?php } ?>
+			</tbody>
+		</table>
+		
+		<br />
+		
+		<input type="submit" name="wpsg_mod_bankalignment_submit" value="<?php echo __('Ãnderungen ÃŒbernehmen', 'wpsg'); ?>" class="button-primary" />
+	
+	</form>
+	
+	<script type="text/javascript">/* <![CDATA[ */
+
+		/**
+		 * Zeigt die Details einer Datenzeile an oder blendet sie aus
+		 */
+		function wpsg_mod_bankalignment_show(oElement)
+		{
+
+			if (jQuery(oElement).parent().parent().parent().find('.row-details').is(':visible'))
+			{
+
+				jQuery(oElement).parent().parent().parent().find('.row-details').hide();
+				jQuery(oElement).attr('title', '<?php echo __("Details anzeigen", "wpsg"); ?>');
+				jQuery(oElement).text('<?php echo __("Details anzeigen", "wpsg"); ?>');
+				
+			}
+			else
+			{
+
+				jQuery(oElement).parent().parent().parent().find('.row-details').show();
+				jQuery(oElement).attr('title', '<?php echo __("Details ausblenden", "wpsg"); ?>');
+				jQuery(oElement).text('<?php echo __("Details ausblenden", "wpsg"); ?>');
+				
+			}	
+			
+			return false;
+			
+		} // function wpsg_mod_bankalignment_show(oElement)
+    
+	/* ]]> */</script>
+	
+</div>
Index: /views/mods/mod_bankalignment/produkt_index_aftersearch.phtml
===================================================================
--- /views/mods/mod_bankalignment/produkt_index_aftersearch.phtml	(revision 5261)
+++ /views/mods/mod_bankalignment/produkt_index_aftersearch.phtml	(revision 5261)
@@ -0,0 +1,29 @@
+<?php
+
+	/**
+	 * Integriert das Uploadformular in die Bestellverwaltung
+	 */
+
+?>
+<div class="wpsg_clear"></div>
+<div class="metabox-holder" id="wpsg_mod_bankalignment_layer" style="<?php echo (($_COOKIE['wpsg_mod_bankalignment_layer'] == '1')?'display:block;':'display:none;'); ?>">
+	<div id="mod_bankalignment" class="postbox">		
+		<h3 class="wpsg_handlediv">
+			<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br></span>
+			<span><?php echo __('Bankabgleich', 'wpsg'); ?></span>
+		</h3>
+		<div class="inside">
+			
+			<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_bankalignment" enctype="multipart/form-data">
+			
+				<?php echo wpsg_drawForm_Upload('wpsg_mod_bankalignment_file', __('CSV Datei', 'wpsg')); ?>
+				
+				<br />
+				
+				<input type="submit" value="<?php echo __('Abgleich starten', 'wpsg'); ?>" name="submit" class="button" /> 
+				
+			</form>			
+			
+		</div>
+	</div>
+</div>
Index: /views/mods/mod_bankalignment/produkt_index_head.phtml
===================================================================
--- /views/mods/mod_bankalignment/produkt_index_head.phtml	(revision 5261)
+++ /views/mods/mod_bankalignment/produkt_index_head.phtml	(revision 5261)
@@ -0,0 +1,11 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration in den Kopf der Bestellverwaltung
+	 * Integriert lediglich den Link zum Upload der CSV Datei
+	 */
+
+?> 
+<label>
+	<input type="checkbox" <?php echo (($_COOKIE['wpsg_mod_bankalignment_layer'] == '1')?'checked="checked"':''); ?> onclick="if (jQuery(this).attr('checked') == 'checked') { jQuery('#wpsg_mod_bankalignment_layer').show(); jQuery.cookie('wpsg_mod_bankalignment_layer', '1'); } else { jQuery('#wpsg_mod_bankalignment_layer').hide(); jQuery.cookie('wpsg_mod_bankalignment_layer', null); }" />&nbsp;<?php echo __('Bankabgleich', 'wpsg'); ?>
+</label>
Index: /views/mods/mod_bankalignment/settings_edit.phtml
===================================================================
--- /views/mods/mod_bankalignment/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_bankalignment/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,9 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungen des Bankabgleichsmoduls
+	 */
+
+?>
+
+<?php echo wpsg_drawForm_Input('wpsg_mod_bankalignment_separator', __('Treenzeichen', 'wpsg'), $this->get_option('wpsg_mod_bankalignment_separator')); ?>
Index: /views/mods/mod_basketteaser/basket_row.phtml
===================================================================
--- /views/mods/mod_basketteaser/basket_row.phtml	(revision 8528)
+++ /views/mods/mod_basketteaser/basket_row.phtml	(revision 5261)
@@ -6,6 +6,7 @@
 
 ?>
-<div class="wpsg_mod_basketteaser_row wpsg_mod_basketteaser_row_<?php echo $this->view['data']['id']; ?>">
-    <div class="valuel">
+<tr class="wpsg_mod_basketteaser_row_<?php echo $this->view['data']['id']; ?> wpsg_<?php echo (($this->view['wpsg_mod_productvars']['i'] == 0)?'odd':'even'); ?>">
+	<td class="wpsg_cell_number">&nbsp;</td>
+	<td class="wpsg_cell_name">
 		<?php if ($this->getProduktLink($this->view['data'])) { ?>
 		<a href="<?php echo $this->getProduktLink($this->view['data']); ?>"><?php echo wpsg_hspc((($this->view['data']['detailname'] != '')?$this->view['data']['detailname']:$this->view['data']['name'])); ?></a>
@@ -13,21 +14,12 @@
 		<?php echo wpsg_hspc((($this->view['data']['detailname'] != '')?$this->view['data']['detailname']:$this->view['data']['name'])); ?>
 		<?php } ?>
-    </div>
-    <div class="valuel">
-		<?php echo wpsg_ff($this->view['data']['preis'], $this->get_option('wpsg_currency')); ?>
-    </div>
-    <div class="valuel">
-		<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-			<?php echo wpsg_ff($this->view['data']['mwst_value'], '%'); ?>
-		<?php } ?>
-    </div>
-    <div class="valuer">
-		<input name="wpsg_mod_basketteaser_row[<?php echo $this->view['data']['id']; ?>]" type="text" size="3" value="0" />
-    </div>
-    <div class="valuer">
+	</td>
+	<td class="wpsg_cell_preis"><?php echo wpsg_ff($this->view['data']['preis'], $this->get_option('wpsg_currency')); ?></td>
+	<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+	<td class="wpsg_cell_mwst"><?php echo wpsg_ff($this->view['data']['mwst_value'], '%'); ?></td>
+	<?php } ?>
+	<td class="wpsg_cell_menge"><input name="wpsg_mod_basketteaser_row[<?php echo $this->view['data']['id']; ?>]" type="text" size="3" value="0" /></td>
+	<td class="wpsg_cell_gesamtpreis">
 		<a href="#" onclick="return wpsg_mod_basketteaser_add(<?php echo $this->view['data']['id']; ?>);"><?php echo __('HinzufÃŒgen', 'wpsg'); ?></a>
-    </div>
-
-</div>
-<br />
-<div class="wpsg_spacer"></div>
+	</td>
+</tr>
Index: ews/mods/mod_basketteaser/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,23 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration des Warenkorbteaser Moduls in die Produktverwaltung
-	 * Sollte nicht verÃ€ndert werden
-	 */
-
-?>
-<div id="wpsg_basketteaser" class="panel panel-default">	
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Warenkorbteaserprodukt', 'wpsg'); ?>
-		</h3>
-	</div>
-	<div class="panel-body">
-		<?php echo wpsg_drawForm_Input('mod_basketteaser_from', __('Von', 'wpsg'), wpsg_fromDate($this->view['data']['mod_basketteaser_from']), array('datepicker' => true)); ?>
-		<?php echo wpsg_drawForm_Input('mod_basketteaser_to', __('Bis', 'wpsg'), wpsg_fromDate($this->view['data']['mod_basketteaser_to']), array('datepicker' => true)); ?>
-	
-	<br /><br />
-	
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_basketteaser"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Warenkorbteasers', 'wpsg'); ?></a>
-	</div>
-</div>
Index: /views/mods/mod_basketteaser/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_basketteaser/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_basketteaser/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,18 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des Warenkorbteaser Moduls in die Produktverwaltung
+	 * Sollte nicht verÃ€ndert werden
+	 */
+
+?>
+<div id="wpsg_basketteaser" class="postbox">	
+	<h3 class="wpsg_handlediv">
+		<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></span>
+		<span><?php echo __('Warenkorbteaserprodukt', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<?php echo wpsg_drawForm_Input('mod_basketteaser_from', __('Von', 'wpsg'), wpsg_fromDate($this->view['data']['mod_basketteaser_from']), array('datepicker' => true)); ?>
+		<?php echo wpsg_drawForm_Input('mod_basketteaser_to', __('Bis', 'wpsg'), wpsg_fromDate($this->view['data']['mod_basketteaser_to']), array('datepicker' => true)); ?>
+	</div>
+</div>
Index: /views/mods/mod_basketteaser/settings_edit.phtml
===================================================================
--- /views/mods/mod_basketteaser/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_basketteaser/settings_edit.phtml	(revision 5261)
@@ -8,2 +8,22 @@
 <?php echo wpsg_drawForm_Select('wpsg_mod_basketteaser_show', __('Anzeige', 'wpsg'), array(0 => __('Unter dem Warenkorb', 'wpsg'), 1 => __('Im Warenkorb', 'wpsg')), $this->get_option('wpsg_mod_basketteaser_show'), array('help' => 'wpsg_mod_basketteaser_show')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_basketteaser_template', __('Template fÃŒr die Produkte im Warenkorb', 'wpsg'), $this->view['templates'], $this->get_option('wpsg_mod_basketteaser_template'), array('help' => 'wpsg_mod_basketteaser_template'))?>
+
+<script type="text/javascript">
+
+	function wpsg_mod_basketteaser_switchshow()
+	{
+
+		if (jQuery('#wpsg_mod_basketteaser_show').val() == '0') jQuery('#wpsg_mod_basketteaser_template').parent().parent().show();
+		else jQuery('#wpsg_mod_basketteaser_template').parent().parent().hide();
+		
+	}
+
+	jQuery(document).ready(function() {
+
+		jQuery('#wpsg_mod_basketteaser_show').bind('change', function() { wpsg_mod_basketteaser_switchshow(); } );
+		
+		wpsg_mod_basketteaser_switchshow();
+		
+	} );
+
+</script>
Index: /views/mods/mod_cab/mail_mms.phtml
===================================================================
--- /views/mods/mod_cab/mail_mms.phtml	(revision 5261)
+++ /views/mods/mod_cab/mail_mms.phtml	(revision 5261)
@@ -0,0 +1,12 @@
+Hallo Administrator,
+
+Eine neue MMS ClickandBuy Benachrichtigung ist eingetroffen
+
+Datum: <?php echo date("d.m.Y H:i:s"); ?>
+
+Aktualisierte Bestellungen: <?php echo $this->view['wpsg_mod_cab']['nUpdated']; ?>
+
+Es folgt der Inhalt der XML Daten:
+
+-----------------------------------------------------------
+<?php echo $this->view['wpsg_mod_cab']['xml']; ?>
Index: /views/mods/mod_cab/mail_mms_error.phtml
===================================================================
--- /views/mods/mod_cab/mail_mms_error.phtml	(revision 5261)
+++ /views/mods/mod_cab/mail_mms_error.phtml	(revision 5261)
@@ -0,0 +1,12 @@
+Hallo Administrator,
+
+Eine neue MMS ClickandBuy Benachrichtigung ist eingetroffen, aber der Hash konnte nicht verifiziert werden!
+
+Datum: <?php echo date("d.m.Y H:i:s"); ?>
+
+Ermittelter Hash: <?php echo $this->view['wpsg_mod_cab']['hash']; ?>
+
+Es folgt der Inhalt der XML Daten:
+
+-----------------------------------------------------------
+<?php echo $this->view['wpsg_mod_cab']['xml']; ?>
Index: /views/mods/mod_cab/mail_resend.phtml
===================================================================
--- /views/mods/mod_cab/mail_resend.phtml	(revision 5261)
+++ /views/mods/mod_cab/mail_resend.phtml	(revision 5261)
@@ -0,0 +1,10 @@
+<?php wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['wpsg_mod_cab']['customer']['vname'], $this->view['wpsg_mod_cab']['customer']['name']); ?>,
+ 
+<?php echo __('Es wurde vom Administrator ein neuer ClickandBuy Bezahllink erstellt:', 'wpsg'); ?>
+ 
+<?php echo $this->view['wpsg_mod_cab']['payLink']; ?>
+ 
+ 
+<?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg'); ?>
+
+<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: /views/mods/mod_cab/order_done.phtml
===================================================================
--- /views/mods/mod_cab/order_done.phtml	(revision 5261)
+++ /views/mods/mod_cab/order_done.phtml	(revision 5261)
@@ -0,0 +1,24 @@
+<?php
+
+	/**
+	 * Dieses Template wird bei der Bezahlart "ClickandBuy" nach der Bestellung eingebunden 
+	 */
+
+?>
+<p><?php echo __('Um den Betrag mit ClickandBuy zu bezahlen klicken Sie bitte auf folgendes Logo.', 'wpsg'); ?></p>
+<p>
+	<a href="<?php echo $this->view['wpsg_mod_cab']['url']; ?>">
+		<img src="<?php echo $this->arPayment[810]['logo']; ?>" alt="<?php echo __('Mit ClickandBuy bezahlen', 'wpsg'); ?>" />
+	</a>
+</p>
+<?php if ($this->get_option('wpsg_mod_cab_autostart') == '1') { ?>
+<script type="text/javascript">
+ 
+	jQuery(document).ready(function() { 
+		window.setTimeout(function() {
+    	location.href = "<?php echo $this->view['wpsg_mod_cab']['url']; ?>";
+		}, 1000);
+	} );
+	
+</script>
+<?php } ?>
Index: /views/mods/mod_cab/order_view_content.phtml
===================================================================
--- /views/mods/mod_cab/order_view_content.phtml	(revision 5261)
+++ /views/mods/mod_cab/order_view_content.phtml	(revision 5261)
@@ -0,0 +1,83 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration der Zahlungsart Click&Buy in die Bestellverwaltung
+	 */
+
+?>
+<script type="text/javascript">/* <![CDATA[ */
+
+	function wpsg_mod_cab_reload()
+	{
+
+		jQuery('#wpsg_mod_cab_inner').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_cab&cmd=refresh&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_cab']['order']['id']; ?>',
+			data: {
+			},
+			success: function(data) {
+				
+				jQuery('#wpsg_mod_cab_inner').html(data);
+				
+			}
+		} );
+
+		return false;
+		
+	} // function wpsg_mod_cab_reload()
+
+	function wpsg_mod_cab_rebuild()
+	{
+
+		jQuery('#wpsg_mod_cab_inner').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_cab&cmd=rebuild&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_cab']['order']['id']; ?>',
+			data: {
+			},
+			success: function(data) {
+				
+				jQuery('#wpsg_mod_cab_inner').html(data);
+				
+			}
+		} );
+		 
+		return false;
+		
+	} // function wpsg_mod_cab_rebuild()
+
+	function wpsg_mod_cab_repay()
+	{
+
+		jQuery('#wpsg_mod_cab_inner').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_cab&cmd=repay&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_cab']['order']['id']; ?>',
+			data: {
+				value: jQuery('#wpsg_cab_repayvalue').val()				
+			},
+			success: function(data) {
+				
+				jQuery('#wpsg_mod_cab_inner').html(data);
+				
+			}
+		} );
+		 
+		return false;
+		
+	} // function wpsg_mod_cab_repay()
+	
+/* ]]> */</script> 
+		
+<div id="wpsg_cab" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br></span>
+		<span><?php echo __('Click & Buy', 'wpsg'); ?></span>
+	</h3>
+	<div class="inside" id="wpsg_mod_cab_inner">
+
+		<?php echo $this->view['wpsg_mod_cab']['content']; ?>
+ 		
+	</div>
+</div>
Index: /views/mods/mod_cab/order_view_content_inner.phtml
===================================================================
--- /views/mods/mod_cab/order_view_content_inner.phtml	(revision 5261)
+++ /views/mods/mod_cab/order_view_content_inner.phtml	(revision 5261)
@@ -0,0 +1,67 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration von Click&Buy in die Bestellverwaltung
+	 */
+
+?>
+<?php if (wpsg_isSizedString($this->view['wpsg_mod_cab']['strError'])) { ?>
+<div class="wpsg_error"><?php echo $this->view['wpsg_mod_cab']['strError']; ?></div><br />
+<?php } ?>
+
+<div style="width:30%; float:left;"><?php echo __("Derzeitiger Status", "wpsg"); ?></div>
+
+<div style="width:70%; float:right;">
+	<?php echo $this->view['wpsg_mod_cab']['order']['cab_transactionStatus'].' ('.wpsg_formatTimestamp(strtotime($this->view['wpsg_mod_cab']['order']['cab_lastupdate'])).')'; ?>
+	<a href="#" onclick="return wpsg_mod_cab_reload();"><?php echo __("Neu abfragen", "wpsg"); ?></a>
+</div><div style="clear:both; height:3px; width:100%;"></div>			
+
+<div style="width:100%;">
+	<div style="width:30%; float:left;"><?php echo __("transactionID", "wpsg"); ?>:</div>
+	<div style="width:70%; float:right;"><?php echo $this->view['wpsg_mod_cab']['order']['cab_transactionID']; ?></div>
+</div><div style="clear:both; height:3px; width:100%;"></div>
+		
+<div style="width:100%;">
+	<div style="width:30%; float:left;"><?php echo __("externalID", "wpsg"); ?>:</div>
+	<div style="width:70%; float:right;"><?php echo $this->view['wpsg_mod_cab']['order']['cab_externalid']; ?></div>
+</div><div style="clear:both; height:3px; width:100%;"></div>
+
+<?php if (wpsg_isSizedArray($this->view['wpsg_mod_cab']['log'])) { ?>
+<table style="width:100%;">
+	<tr>
+		<th><?php echo __("Datum", "wpsg"); ?></th>
+		<th><?php echo __("Event ID", "wpsg"); ?></th>
+		<th><?php echo __("Alter Status", "wpsg"); ?></th>
+		<th><?php echo __("Neuer Status", "wpsg"); ?></th>
+	</tr>
+	<?php foreach ($log as $l) { ?>
+	<tr>
+		<td><?php echo date("d.m.Y H:i:s", strtotime($l['cdate'])); ?></td>
+		<td><?php echo $l['eventID']; ?></td>
+		<td><?php echo $l['oldState']; ?></td>
+		<td><?php echo $l['newState']; ?></td>
+	</tr>
+	<?php } ?>
+</table><div style="clear:both; height:3px; width:100%;"></div>
+<?php } ?>
+
+<div style="width:100%;">
+<div style="width:30%; float:left;"><?php echo __("Link zum Bezahlen", "wpsg"); ?>:</div>
+<div style="width:70%; float:right;">
+	<a href="<?php echo $this->view['wpsg_mod_cab']['order']['cab_paylink']; ?>"><?php echo __("Link", "wpsg"); ?></a>&nbsp;|&nbsp;
+	<a href="#" onclick="return wpsg_mod_cab_rebuild();"><?php echo __("Neu generieren und versenden", "wpsg"); ?></a>
+</div>
+</div><div style="clear:both; height:3px; width:100%;"></div>
+		
+<br />
+
+<div style="width:30%; float:left; line-height:20px;"><?php echo __("RÃŒckzahlung", "wpsg"); ?>:</div>
+	
+<?php if (($this->view['wpsg_mod_cab']['order']['price_gesamt'] - $this->view['wpsg_mod_cab']['order']['cab_repayed']) > 0) { ?>
+<div style="width:70%; float:left;">
+	<input type="text" id="wpsg_cab_repayvalue" name="wpsg_cab_repayvalue" value="" />&nbsp;&nbsp;(<?php echo __('Max', 'wpsg'); ?>: <?php echo wpsg_ff($this->view['wpsg_mod_cab']['order']['price_gesamt'] - $this->view['wpsg_mod_cab']['order']['cab_repayed'], $this->get_option('wpsg_currency')).')'; ?>
+	<input onclick="return wpsg_mod_cab_repay();" type="submit" value="<?php echo __("ZurÃŒckzahlen", "wpsg"); ?>" style="float:right;" />
+</div>
+<?php } ?>
+	
+<div style="clear:both; height:3px; width:100%;"></div>
Index: /views/mods/mod_cab/settings_edit.phtml
===================================================================
--- /views/mods/mod_cab/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_cab/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,49 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungen des Click&Buy Moduls
+	 */
+
+?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_bezeichnung', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_cab_bezeichnung'), array('help' => 'wpsg_mod_cab_bezeichnung')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_auftragsbezeichnung', __('Auftragsbezeichnung', 'wpsg'), $this->get_option('wpsg_mod_cab_auftragsbezeichnung'), array('help' => 'wpsg_mod_cab_auftragsbezeichnung')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_cab_aktiv', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_cab_aktiv'), array('help' => 'wpsg_mod_cab_aktiv')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_cab_sandbox', __('Sandbox', 'wpsg'), $this->get_option('wpsg_mod_cab_sandbox'), array('help' => 'wpsg_mod_cab_sandbox')); ?>
+<?php echo wpsg_drawForm_Textarea('wpsg_mod_cab_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_cab_hint'), array('help' => 'wpsg_mod_cab_hint')); ?>
+<br />
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_merchantID', __('MerchantID', 'wpsg'), $this->get_option('wpsg_mod_cab_merchantID'), array('help' => 'wpsg_mod_cab_merchantID')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_projectID', __('ProjektID', 'wpsg'), $this->get_option('wpsg_mod_cab_projectID'), array('help' => 'wpsg_mod_cab_projectID')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_kryptkey', __('Kryptographischer SchlÃŒssel', 'wpsg'), $this->get_option('wpsg_mod_cab_kryptkey'), array('help' => 'wpsg_mod_cab_kryptkey')); ?>
+<br />
+<?php echo wpsg_drawForm_Input('', __('MMS Push URL', 'wpsg'), $this->view['wpsg_mod_cab_mmspushurl'], array('help' => 'wpsg_mod_cab_mmspushurl','readonly' => true, 'disabled' => false)); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_mmskryptkey', __('Kryptographischer SchlÃŒssel (MMS)', 'wpsg'), $this->get_option('wpsg_mod_cab_mmskryptkey'), array('help' => 'wpsg_mod_cab_mmskryptkey')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_mmsstatusmail', __('MMS Statusmail', 'wpsg'), $this->get_option('wpsg_mod_cab_mmsstatusmail'), array('help' => 'wpsg_mod_cab_mmsstatusmail')); ?>
+<br />
+<?php echo wpsg_drawForm_Select('wpsg_mod_cab_success', __('Erfolgslink', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_mod_cab_success'), array('help' => 'wpsg_mod_cab_success')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_cab_error', __('Abbruchlink', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_mod_cab_error'), array('help' => 'wpsg_mod_cab_error')); ?>
+<br />
+<?php echo wpsg_drawForm_Input('wpsg_mod_cab_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_cab_gebuehr'), true), array('help' => 'wpsg_mod_cab_gebuehr','unit' => $this->get_option('wpsg_currency').' / %')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_cab_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_cab_mwst'), array('help' => 'wpsg_mod_cab_mwst')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_cab_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_cab_mwstland'), array('help' => 'wpsg_mod_cab_mwstland')); ?>
+<br />
+<?php echo wpsg_drawForm_Select('wpsg_mod_cab_currency', __('WÃ€hrung', 'wpsg'), array('EUR' => __('EUR', 'wpsg'), 'GBP' => __('GBP', 'wpsg'), 'USD' => __('USD', 'wpsg'), 'CHR' => __('CHR', 'wpsg')), $this->get_option('wpsg_mod_cab_currency'), array('help' => 'wpsg_mod_cab_currency')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_cab_autorun', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_cab_autorun'), array('help' => 'wpsg_mod_cab_autorun')); ?>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	var wpsg_pageURLs = new Object();
+
+	<?php if (wpsg_isSizedArray($this->view['pageURLs'])) { ?>
+	<?php foreach ($this->view['pageURLs'] as $page_id => $page_url) { ?>
+	wpsg_pageURLs['<?php echo $page_id; ?>'] = '<?php echo $page_url; ?>';
+	<?php } ?>	
+	<?php } ?>
+ 
+	jQuery(document).ready(function() {
+
+		wpsg_switchPage(jQuery('#wpsg_mod_cab_success'));
+		wpsg_switchPage(jQuery('#wpsg_mod_cab_error'));
+		
+	} );
+	
+/* ]]> */</script>
Index: /views/mods/mod_core/admin_licence.phtml
===================================================================
--- /views/mods/mod_core/admin_licence.phtml	(revision 5261)
+++ /views/mods/mod_core/admin_licence.phtml	(revision 5261)
@@ -0,0 +1,7 @@
+<?php
+
+
+?>
+<h2><?php echo __('Es wurde noch keine gÃŒltige Lizenz gefunden.', 'wpsg'); ?></h2>
+
+<p><?php echo __('Damit sie den Shop registrieren kÃ¶nnen benÃ¶tigen sie eine gÃŒltige Lizenz.<br />Diese kÃ¶nnen sie unter <a href="http://shop.maennchen1.de/" target="_blank">shop.maennchen1.de</a> erwerben und anschlieÃend in der Plugin Verwaltung installieren.', 'wpsg'); ?></p>
Index: /views/mods/mod_core/admin_register.phtml
===================================================================
--- /views/mods/mod_core/admin_register.phtml	(revision 5261)
+++ /views/mods/mod_core/admin_register.phtml	(revision 5261)
@@ -0,0 +1,100 @@
+<?php
+
+	/**
+	 * Templatedatei fÃŒr das Registrierungsinterface
+	 * Sollte nicht verÃ€ndert werden
+	 */
+
+?>
+<div class="wpsg_admin_submenu">
+	
+	<div class="head">
+		<div class="title"><?php echo __("Lizenzverwaltung", "wpsg"); ?></div>			
+		<div style="clear:both;"></div>
+	</div>
+
+	<ul>		
+		<li class="<?php echo ((!isset($_REQUEST['subaction']))?'current':''); ?>"><a href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung'); ?>"><?php echo __('Registrierungsdaten', 'wpsg'); ?></a></li>
+		<li class="<?php echo ((isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'domains')?'current':''); ?>"><a href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domains'); ?>"><?php echo __('Domainverwaltung', 'wpsg'); ?></a></li>		
+		<li class="<?php echo ((isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'module')?'current':''); ?>"><a href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=module'); ?>"><?php echo __('Modulaktivierung', 'wpsg'); ?></a></li>
+	</ul>
+			
+</div>
+ 
+<div class="wpsg_admin_content">
+	
+	<?php if (!isset($_REQUEST['subaction'])) { ?>
+		<h2><?php echo __('Registrierungsdaten', 'wpsg'); ?></h2>
+		 
+		<?php echo wpsg_drawForm_Input('register_lizenz', __('Lizenzart', 'wpsg'), $this->view['typ'], array('readonly' => true, 'disabled' => true)); ?>
+		 				
+		<br />
+		<form enctype="multipart/form-data" method="post" action="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1'); ?>" name="form1">
+		
+			<?php echo wpsg_drawForm_Input('register_vname', __('Vorname', 'wpsg'), $this->view['data']['vname']); ?>
+			<?php echo wpsg_drawForm_Input('register_name', __('Name', 'wpsg'), $this->view['data']['name']); ?>
+			<?php echo wpsg_drawForm_Input('register_plz', __('PLZ', 'wpsg'), $this->view['data']['plz']); ?>
+			<?php echo wpsg_drawForm_Input('register_ort', __('Ort', 'wpsg'), $this->view['data']['ort']); ?>
+			<?php echo wpsg_drawForm_Input('register_strasse', __('StraÃe', 'wpsg'), $this->view['data']['strasse']); ?>
+			<?php echo wpsg_drawForm_Select('register_land', __('Land', 'wpsg'), $this->view['data']['lander'], $this->view['data']['land']); ?>
+			<?php echo wpsg_drawForm_Input('register_email', __('E-Mail', 'wpsg'), $this->view['data']['email']); ?>
+			
+			<br />
+			<input id="submit" name="registerdata-submit" type="submit" class="button-primary" value="<?php echo __('Ãnderungen ÃŒbermitteln', 'wpsg'); ?>" />
+			
+		</form>
+	<?php } ?>
+	
+	<?php if (isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'domains') { ?>	
+		<h2><?php echo __('Registrierte Domains', 'wpsg'); ?></h2>
+			
+		<?php if (sizeof($this->view['data']['domains']) <= 0) { ?>
+		<p><?php echo __('Noch keine Domains registriert.', 'wpsg'); ?>
+		<?php } else { ?>
+		<b><?php echo __('Bereits auf diesen Key registrierte Domains', 'wpsg')?>:</b><br /><br />
+		<?php foreach ($this->view['data']['domains'] as $d) { ?>
+		<div class="wpsg_domainrow">
+			<?php echo wpsg_hspc($d['url']); ?>&nbsp;[<a href="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=remove&url='.rawurlencode($d['url'])); ?>"><?php echo __('Registrierung aufheben', 'wpsg'); ?></a>]
+		</div>
+		<?php } ?>
+		<?php } ?>
+		
+		<br />
+		<?php if ($this->view['data']['registred'] === true) { ?>
+		<p class="wpsg_registersuccess"><?php echo __('Diese Domain ist bereits auf diesen SchlÃŒssel registriert.', 'wpsg'); ?></p>
+		<?php } else { ?>
+		
+			<p class="wpsg_registerfailure"><?php echo __('Diese Domain ist noch nicht auf diesen SchlÃŒssel registriert.', 'wpsg'); ?></p>
+			
+			<?php if (sizeof($this->view['data']['domains']) > 0 && $this->arLizenz['l'] != 3) { ?>
+			<p class="wpsg_registerfailure">
+				<?php echo __('Sie dÃŒrfen mit dieser Lizenz den Shop nur auf einer Domain laufen lassen. LÃ¶schen sie die bereits registrierte Domain und registrieren Sie diese Domain neu.', 'wpsg'); ?>
+			</p>
+			<?php } else { ?>
+			<br />
+			<form method="post" action="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=register'); ?>">
+				<input type="submit" value="<?php echo __('Diese Domain registrieren', 'wpsg'); ?>" class="button-primary" />
+			</form>
+			<?php } ?>		
+		
+		<?php } ?>
+	<?php } ?>
+	
+	<?php if (isset($_REQUEST['subaction']) && $_REQUEST['subaction'] == 'module') { ?>	
+		<h2><?php echo __('Weitere Module', 'wpsg'); ?></h2>
+		
+		<p><?php echo wpsg_translate(__('Erweitern Sie Ihre wpShopGermany-Lizenz um weitere Funktionen, indem Sie <a href="#1#">weitere Module installieren</a> und ihrer bestehenden wpShopGermany-Lizenz hinzufÃŒgen.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module'); ?></p>
+		
+		<br />
+		<form method="post" action="<?php echo wpsg_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=aktivateModul'); ?>">
+			
+			<?php echo wpsg_drawForm_Input('wpsg_modulkey', __('ModulschlÃŒssel', 'wpsg'), $this->get_option('wpsg_modulkey')); ?>
+			
+			<br />
+			<input type="submit" value="<?php echo __('wpShopGermany Lizenz erweitern', 'wpsg'); ?>" class="button-primary" />
+			
+		</form>		
+		 
+	<?php } ?>
+	
+</div>
Index: /views/mods/mod_core/module_index.phtml
===================================================================
--- /views/mods/mod_core/module_index.phtml	(revision 5261)
+++ /views/mods/mod_core/module_index.phtml	(revision 5261)
@@ -0,0 +1,78 @@
+<?php
+
+	/**
+	 * Startseite der Module
+	 */
+
+?>
+<div class="wpsg_admin_content">
+	
+	<h3><?php echo __('Modulverwaltung', 'wpsg'); ?></h3>
+	<p><?php echo __('Aktivieren/Installieren Sie weitere Module oder halten Sie externe Module aktuell.', 'wpsg'); ?></p>
+	
+	<div class="wpsg_admin_box">
+		<div class="head">
+			<div class="title">
+				<div class="fulltab">
+					<?php echo __('Hier sehen sie verfÃŒgbare externe Module', 'wpsg'); ?>					
+				</div>
+			</div>
+		</div>
+		<div class="content">
+			<?php if (wpsg_isSizedArray($this->view['arOnlineModule'])) { ?>
+			<table class="wpsg_modultable">
+				<tr>
+					<th class="wpsg_col_name"><?php echo __('Modulname', 'wpsg'); ?></th>
+					<th class="wpsg_col_instversion"><?php echo __('installierte Version', 'wpsg'); ?></th>
+					<th class="wpsg_col_licence"><?php echo __('Lizenz', 'wpsg'); ?></th>
+					<th class="wpsg_col_availableversion"><?php echo __('verfÃŒgbare Version', 'wpsg'); ?></th>			
+				</tr>	
+				<?php foreach ($this->view['arOnlineModule'] as $modul) { ?>
+				<tr>
+					<td class="wpsg_col_name"><?php echo $modul['name']; ?></td>
+					<td class="wpsg_col_instversion">
+						
+						<?php echo $modul['version_local']; ?>
+										
+					</td>
+					<td class="wpsg_col_licence">
+						
+						<?php if ($modul['free'] == '1') { ?>
+						<?php echo __('kostenlos', 'wpsg'); ?>
+						<?php } else { ?>
+						 
+						 <?php if (@in_array($modul['key'], $this->arLizenz['mods'])) { ?>
+						 <?php echo __('aktiv', 'wpsg'); ?>
+						 <?php } else { ?>
+						 
+						 <?php echo __('Demo', 'wpsg'); ?>
+						 
+						 <?php } ?>
+						
+						<?php } ?>
+						
+					</td>
+					<td class="wpsg_col_availableversion">
+					
+						<?php //wpsg_debug($modul); ?>
+						<?php if ($modul['version'] == $modul['version_local']) { ?>
+						<?php echo $modul['version']; ?> (aktuell)
+						<?php } else if (version_compare($modul['shop_version'], WPSG_VERSION) > 0) { ?>
+						<?php echo wpsg_translate(__('neue Version verfÃŒgbar (<a href="#1#">wpShopGermany Update</a> notwendig)', 'wpsg'), WPSG_URL_WP.'wp-admin/plugins.php'); ?>
+						<?php } else if (version_compare($modul['version'], $modul['version_local']) > 0) { ?>
+						<?php echo wpsg_translate(__('neue Version verfÃŒgbar: <a href="#1#">installiere #2#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul['key'], $modul['version']); ?>
+						<?php } else { ?>
+						<?php echo $modul['version']; ?>
+						<?php } ?>
+					
+					</td>
+				</tr>
+				<?php } ?>
+			</table>
+			<?php } else { ?>
+			<?php echo __('Module konnten aufgrund fehlender SOAP UnterstÃŒtzung nicht geladen werden.', 'wpsg'); ?>
+			<?php } ?>
+		</div>
+	</div>
+	
+</div>
Index: /views/mods/mod_crefopay/settings_edit.phtml
===================================================================
--- /views/mods/mod_crefopay/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_crefopay/settings_edit.phtml	(revision 5261)
@@ -24,7 +24,13 @@
 <?php echo wpsg_drawForm_Input('wpsg_mod_crefopay_frameheight', __('HÃ¶he des IFrames in px', 'wpsg'), $this->get_option('wpsg_mod_crefopay_frameheight'), array('help' => 'wpsg_mod_crefopay_frameheight')); ?>
 
-<?php echo wpsg_drawForm_Link('wpsg_mod_crefopay_link', __('MNS Statuswechsel', 'wpsg'), 
-		__('Bearbeiten', 'wpsg'), array('class' => 'wpsg_mod_crefopay_switchstatemapping')); ?>
-
+<div class="wpsg_form_field ">
+	<div class="wpsg_form_left">
+		<label for=""><?php echo __('MNS Statuswechsel', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<a href="#" class="wpsg_mod_crefopay_switchstatemapping" onclick="return wpsg_mod_crefopay_mnsstatemapping();"><?php echo __('Bearbeiten', 'wpsg'); ?></a>						
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
 <div class="wpsg_mod_crefopay_mnsstatemapping">
 	<?php foreach ($this->view['transactionMapping'] as $crefopay_status => $wpsg_status) { ?>
Index: /views/mods/mod_customergroup/addedit.phtml
===================================================================
--- /views/mods/mod_customergroup/addedit.phtml	(revision 8528)
+++ /views/mods/mod_customergroup/addedit.phtml	(revision 5261)
@@ -6,55 +6,160 @@
 
 ?>
-<div class="wpsg_customergroup wpsg_customergroup_add" id="wpsg-bs">
+<div class="wrap wpsg_mod_kundenverwaltung_customergroup_addedit wpsg_customergroup_view wpsg_produkt_addedit wrap columns-2">
+	<div class="icon32 icon32-posts-post" id="icon-add"><br /></div>
+	
+	<h2>
+		<?php if ($this->view['mode'] == 'edit') { ?>
+			<?php echo __('Kundengruppe bearbeiten', 'wpsg'); ?>
+		<?php } else { ?>
+			<?php echo __('Kundengruppe anlegen', 'wpsg'); ?>
+		<?php } ?>
+	</h2>
+	<br />
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	
+	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=save&noheader=1" enctype="multipart/form-data">
+		
+		<?php if ($this->view['mode'] == 'edit') { ?>
+		<input type="hidden" name="edit_id" value="<?php echo $this->view['data']->id; ?>" />
+		<?php } ?>
+		
+		<div id="postbox" class="metabox-holder has-right-sidebar">
+			
+			<div id="side-info-column" class="inner-sidebar" style="width:386px;">
+				
+				<div id="side-sortables" class="meta-box-sortables ui-sortable" style="width:380px;">
+				
+					<?php $this->callMods('customergroup_edit', array(&$this->view['data'])); ?>
+				
+				</div>
+				
+			</div>
+			
+			<div id="post-body">	
+			
+				<div id="normal-sortables" class="meta-box-sortables" style="margin-right:400px;">
+				
+					<div id="wpsg_customergroup_general" class="postbox">								
+						<h3 class="wpsg_handlediv">
+							<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+							<span><?php echo __('Allgemein', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+						
+							<?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung[name]', __('Name', 'wpsg'), $this->view['data']->name); ?> 
+							<?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung[calculation]', __('Preisangaben im Shop (Frontend)', 'wpsg'), array(
+								-1 => __('Standard', 'wpsg'),
+								WPSG_BRUTTO => __('Brutto (inkl. Steuer)', 'wpsg'), 
+								WPSG_NETTO => __('Netto (zzgl. Steuer)', 'wpsg')
+							), $this->view['data']->calculation); ?>
+						
+						</div>
+					</div>
+					
+				</div>
+				
+				<p class="submit">
+					<input type="submit" value="<?php echo __('Kundengruppe speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
+					<input type="submit" value="<?php echo __('Kundengruppe speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
+				</p>
+				
+			</div>
+			
+		</div>
+		
+	</form>
+	
+</div>
 
-    <nav class="navbar navbar-default">
+<script type="text/javascript">/* <![CDATA[ */
+                                            
+	jQuery(document).ready( function() {
 
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-customergroup-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="wpsg-customergroup-tab-a active"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=index"><?php echo __("Kundengruppenverwaltung", "wpsg"); ?></a></li>
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'add'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=add"><span class="glyphicon glyphicon-plus"></span><?php echo __("Kundengruppe anlegen/bearbeiten", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
+		jQuery('.wpsg_form_help').tipTip();
 
-				</ul>
-			</div>
-		</div>
+	    jQuery("#normal-sortables, #side-sortables").sortable({
+			connectWith: ".meta-box-sortables",
+			placeholder: 'wpsg_placeholder',
+			dropOnEmpty: true,
+			cursor: 'move',
+			handle: '.wpsg_handlediv',
+			grid: [50, 20],
+			forceHelperSize: true,
+			forcePlaceholderSize: true,
+			opacity: 0.8,
+			stop: function(e,ui) {
 
-    </nav>
+				var ser = jQuery("#normal-sortables").sortable("serialize");				
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
 
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
+				jQuery.cookie('wpsg_customergroup_view_normal', ser);
+
+				var ser = jQuery("#side-sortables").sortable("serialize");				
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+
+				jQuery.cookie('wpsg_customergroup_view_side', ser);
+				
+			},
+			receive: function(e, ui) {
+			}
+		}); 
+
+	    if (jQuery.cookie('wpsg_customergroup_view_normal') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_customergroup_view_normal').split(',').reverse();
+
+			for (index in divs)
+			{
+
+				jQuery('#normal-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+
+		if (jQuery.cookie('wpsg_customergroup_view_side') != null)
+		{
+ 
+			var divs = jQuery.cookie('wpsg_customergroup_view_side').split(',').reverse();
+
+			for (index in divs)
+			{
+				 
+				jQuery('#side-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+
+		jQuery('.wpsg_handlediv').bind('click', function() {
+			jQuery(this).next().toggle();
+
+			var arClose = new Array();
+			jQuery('.wpsg_customergroup_view .postbox .inside:hidden').each(function() {
+				arClose.push(jQuery(this).parent().attr("id"));
+			} );
+
+			jQuery.cookie('wpsg_customergroup_closed', arClose.join(','));
+			
+		} );
+
+		if (jQuery.cookie('wpsg_customergroup_closed') != null)
+		{
+
+			var arClose = jQuery.cookie('wpsg_customergroup_closed').split(',');
+
+			for (index in arClose)
+			{
+				
+				jQuery('#' + arClose[index] + ' .inside').hide();
+							
+			}
+			
+		}
+		
+	} );
 	
-	<div class="wpsg_clear"></div>
-
-	<div class="content form-horizontal">
-
-        <form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=save&noheader=1" enctype="multipart/form-data">
-            <?php echo wpsg_drawForm_AdminboxStart(__('Allgemein', 'wpsg')); ?>
-
-                <?php if ($this->view['mode'] == 'edit') { ?>
-                <input type="hidden" name="edit_id" value="<?php echo $this->view['data']->id; ?>" />
-                <?php } ?>
-
-                <?php $this->callMods('customergroup_edit', array(&$this->view['data'])); ?>
-
-                <?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung[name]', __('Name', 'wpsg'), @$this->view['data']->name); ?>
-                <?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung[calculation]', __('Preisangaben im Shop (Frontend)', 'wpsg'), array(
-                    -1 => __('Standard', 'wpsg'),
-                    WPSG_BRUTTO => __('Brutto (inkl. Steuer)', 'wpsg'),
-                    WPSG_NETTO => __('Netto (zzgl. Steuer)', 'wpsg')
-                ), @$this->view['data']->calculation); ?>
-
-            <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-            <input type="submit" value="<?php echo __('Kundengruppe speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
-			<input type="submit" value="<?php echo __('Kundengruppe speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
-
-        </form>
-
-    </div>
-
-</div>
+/* ]]> */</script>
Index: ews/mods/mod_customergroup/admin_setcapabilities.phtml
===================================================================
--- /views/mods/mod_customergroup/admin_setcapabilities.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-	
-	/**
-	 * Template fÃŒr die Integration in die Verwaltung der Berechtigungen
-	 */
-
-	global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
-
-?>
-<tr>
-	<td class="wpsg_col_capname"><?php echo __('Kundengruppen', 'wpsg'); ?></td>
-	<?php foreach ($arRoles as $role_key => $r) { ?>
-	<td class="wpsg_col_cap">
-		<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_customergroup]" value="0" />
-		<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_customergroup']) && $r['capabilities']['wpsg_customergroup'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_customergroup]" value="1" /> 
-	</td>
-	<?php } ?>
-	<td></td>
-</tr>	
Index: /views/mods/mod_customergroup/index.phtml
===================================================================
--- /views/mods/mod_customergroup/index.phtml	(revision 8528)
+++ /views/mods/mod_customergroup/index.phtml	(revision 5261)
@@ -6,153 +6,212 @@
 
 ?>
+<div class="wrap wpsg_mod_kundenverwaltung_customergroup_index">
+	
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	
+	<h2>
+		<?php echo __('Kundengruppenverwaltung', 'wpsg'); ?>		
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=add" class="add-new-h2"><?php echo __("HinzufÃŒgen", "wpsg"); ?></a>		
+	</h2>
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	
+	<form method="POST" id="filter_form">
+		
+		<?php if (sizeof($this->view['data']) > 0) { ?>
+		<p class="search-box">
+			<label for="post-search-input" class="screen-reader-text"><?php echo __('Kundengruppen suchen', 'wpsg'); ?>:</label>
+			<input type="text" value="<?php echo wpsg_hspc($_REQUEST['s']); ?>" name="filter[s]" id="post-search-input">
+			<input type="submit" value="<?php echo __('Kundengruppen suchen', 'wpsg'); ?>" class="button" id="search-submit" name="">
+		</p>
+		<?php } ?>
+		
+		<div class="tablenav top">
+		
+			<?php if (sizeof($this->view['data']) > 0) { ?>
+			<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=1&s=<?php echo $_REQUEST['s'].'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=<?php echo ($this->view['seite'] - 1).'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['seite']; ?>" id="seite" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=<?php echo ($this->view['seite'] + 1).'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=<?php echo $this->view['pages'].'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
+				</div>
+				
+				<script type="text/javascript">
 
-<div class="wpsg_customergroup" id="wpsg-bs">
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				</script>
+				
+				<br class="clear" />
+			</div>
+			<?php } ?>
+		
+		</div>
+		
+		<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo $this->view['filter']['order']; ?>" />
+		<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo $this->view['filter']['ascdesc']; ?>" />
+		
+		<input style="display:none;" type="submit" name="suchen" value="" />
+		
+	</form>
+	
+	<?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
+	<table class="widefat post fixed">
+		<thead>
+			<tr>
+				<th class="manage-column col-id <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'id'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('id');">
+						<span><?php echo __("Id", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column col-name <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'name'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('name');">
+						<span><?php echo __("Name", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column col-calculation <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'calculation'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('name');">
+						<span><?php echo __("Preisanzeige", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column col-customercount <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'customercount'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('customercount');">
+						<span><?php echo __("Kunden", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<?php $i = 0; foreach ($this->view['data'] as $oCustomerGroup) { ?>
+			<tr class="<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+				<td class="col-id">
+					<?php echo wpsg_hspc($oCustomerGroup->id); ?>
+				</td>
+				<td class="col-name">
+					<?php echo wpsg_hspc($oCustomerGroup->name); ?>
+					<div class="row-actions">
+						<span class="edit"><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=edit&edit_id=<?php echo $oCustomerGroup->id; ?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
+						|
+						<span class="edit"><a title="<?php echo __("Kunden dieser Kundengruppe anzeigen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&customergroup=<?php echo $oCustomerGroup->id; ?>"><?php echo __("Kunden anzeigen", "wpsg"); ?></a></span>
+						|
+						<span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie diese Kundengruppe lÃ¶schen wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Diesen Kunden lÃ¶schen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=del&edit_id=<?php echo $oCustomerGroup->id; ?>&noheader=1"><?php echo __("LÃ¶schen", "wpsg"); ?></a></span>											
+					</div>
+				</td>
+				<td class="col-calculation">
+					<?php if ($oCustomerGroup->calculation == WPSG_BRUTTO) { ?>
+					<?php echo __('Brutto Preise', 'wpsg'); ?>
+					<?php } else if ($oCustomerGroup->calculation == WPSG_NETTO) { ?>
+					<?php echo __('Netto Preise', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php echo __('Standard', 'wpsg'); ?>
+					<?php } ?>
+				</td>
+				<td class="col-customercount">
+					<?php echo wpsg_hspc($oCustomerGroup->customercount); ?>
+				</td>
+			</tr>
+			<?php $i ++; } ?>
+		</tbody>
+		<tfoot>
+			<tr>
+				<th class="manage-column col-id <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'id'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('id');">
+						<span><?php echo __("Id", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column col-name <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'name'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('name');">
+						<span><?php echo __("Name", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column col-calculation <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'calculation'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('name');">
+						<span><?php echo __("Preisanzeige", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column col-customercount <?php echo ((wpsg_isSizedString($this->view['filter']['order'], 'customercount'))?'sorted':'sortable'); ?> <?php echo ((wpsg_isSizedString($this->view['filter']['ascdesc'], 'asc'))?'asc':'desc'); ?>">
+					<a href="#" onclick="return wpsg_setOrder('customercount');">
+						<span><?php echo __("Kunden", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+			</tr>
+		</tfoot>
+	</table>
+	<?php } ?>
+		
+	<div class="tablenav">
+	
+		<?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
+	
+		<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+			<div class="tablenav-pages">	
+				<span class="pagination-links">
+					<form method="POST">
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=1&s=<?php echo $_REQUEST['s'].'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=<?php echo ($this->view['seite'] - 1).'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['seite']; ?>" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=<?php echo ($this->view['seite'] + 1).'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&seite=<?php echo $this->view['pages'].'&'.http_build_query((array)$_REQUEST['filter']); ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</form>
+				</span>
+			</div>
+			
+			<script type="text/javascript">
+	
+				jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+			
+			</script>
+			
+			<br class="clear">
+		</div>
+		
+		<?php } ?>
+		
+	</div>
+	
+	<script type="text/javascript">/* <![CDATA[ */
 
-    <nav class="navbar navbar-default">
-
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-customergroup-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="wpsg-customergroup-tab-a active"><a href="#" onclick="return false;"><?php echo wpsg_translate(__("Kundengruppenverwaltung (#1# Kundengruppen)", "wpsg"), $this->view['countAll']); ?></a></li>
-                    <li role="presentation" class="wpsg-customergroup-tab-a wpsg_showhide_filter <?php echo (($this->view['hasFilter'] === true)?'active':''); ?>" id="wpsg-customergroup-tab-0"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'add'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=add"><span class="glyphicon glyphicon-plus"></span><?php echo __("HinzufÃŒgen", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-
-				</ul>
-			</div>
-		</div>
-
-        <div class="wpsg-filter wpsg-customer-tab wpsg-customer-tab-0 container-fluid form-horizontal" style="display:<?php echo (($this->view['hasFilter'] === true)?'block':'none'); ?>;">
-            <div class="row">
-				<div class="col-lg-4">
-					<form method="post" id="filter_form">
-
-                        <input id="wpsg_seite" type="hidden" name="filter[page]" value="<?php echo @$this->view['page']; ?>" class="current-page" />
-
-                        <input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-                        <input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" />
-
-                        <?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
-
-                        <?php echo wpsg_drawForm_SubmitButton(__('Kundengruppen suchen')); ?><br />
-
-					</form>
-				</div>
-			</div>
-        </div>
-
-    </nav>
-
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-
-    <?php if ($this->view['pages'] > $this->get_option('wpsg_mod_kundenverwaltung_group_perpage')) { ?>
-        <nav class="pagination_wrap">
-            <ul class="pagination">
-                <?php if ($this->view['arFilter']['page'] > 1) { ?>
-                    <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] - 1; ?>);" href="#" aria-label="<?php echo __('Vorherige Seite'); ?>"><span aria-hidden="true">&laquo;</span></a></li>
-                <?php } ?>
-                <?php for ($i = 1; $i <= $this->view['pages']; $i ++) { ?>
-                    <li class="<?php echo (($i == $this->view['arFilter']['page'])?'active':''); ?>"><a onclick="return goPage(<?php echo $i; ?>);" href="#"><?php echo $i; ?></a></li>
-                <?php } ?>
-                <?php if ($this->view['arFilter']['page'] + 1 <= $this->view['pages']) { ?>
-                    <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] + 1; ?>);" href="#" aria-label="<?php echo __('NÃ€chste Seite'); ?>"><span aria-hidden="true">&raquo;</span></a></li>
-                <?php } ?>
-            </ul>
-        </nav>
-	<?php } ?>
-
-	<div class="wpsg_clear"></div>
-
-	<div class="content">
-
-        <?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-
-            <table class="table wpsg-table-order table-bordered table-hover table-striped wpsg-table-customer">
-                <thead>
-                    <tr>
-                        <th class="wpsg_order manage-column col-name" data-order="name"><?php echo __('Name', 'wpsg'); ?></th>
-                        <th class="wpsg_order col-price" data-order="customercount"><?php echo __("Preisanzeige", 'wpsg'); ?></th>
-                        <th class="wpsg_order col_customer" data-order="calculation"><?php echo __("Kunden", 'wpsg'); ?></th>
-                    </tr>
-                </thead>
-                <tbody>
-                    <?php foreach ($this->view['arData'] as $oCustomerGroup) { ?>
-                    <tr>
-                        <td class="col-name">
-                            <?php echo wpsg_hspc($oCustomerGroup->name); ?>
-                            <div class="row-actions">
-                                <span class="edit"><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=edit&edit_id=<?php echo $oCustomerGroup->id; ?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
-                                |
-                                <span class="edit"><a title="<?php echo __("Kunden dieser Kundengruppe anzeigen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&customergroup=<?php echo $oCustomerGroup->id; ?>"><?php echo __("Kunden anzeigen", "wpsg"); ?></a></span>
-                                |
-                                <span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie diese Kundengruppe lÃ¶schen wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Diesen Kunden lÃ¶schen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customergroup&action=del&edit_id=<?php echo $oCustomerGroup->id; ?>&noheader=1"><?php echo __("LÃ¶schen", "wpsg"); ?></a></span>
-                            </div>
-                        </td>
-                        <td class="col-price">
-                            <?php if ($oCustomerGroup->calculation == WPSG_BRUTTO) { ?>
-                            <?php echo __('Brutto Preise', 'wpsg'); ?>
-                            <?php } else if ($oCustomerGroup->calculation == WPSG_NETTO) { ?>
-                            <?php echo __('Netto Preise', 'wpsg'); ?>
-                            <?php } else { ?>
-                            <?php echo __('Standard', 'wpsg'); ?>
-                            <?php } ?>
-                        </td>
-                        <td class="col-customer">
-                            <?php echo wpsg_hspc($oCustomerGroup->customercount); ?>
-                        </td>
-                    </tr>
-                    <?php } ?>
-                </tbody>
-            </table>
-
-            <?php if ($this->view['pages'] > $this->get_option('wpsg_mod_kundenverwaltung_group_perpage')) { ?>
-                <nav class="pagination_wrap pagination_wrap_bottom">
-                    <ul class="pagination">
-                        <?php if ($this->view['arFilter']['page'] > 1) { ?>
-                            <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] - 1; ?>);" href="#" aria-label="<?php echo __('Vorherige Seite'); ?>"><span aria-hidden="true">&laquo;</span></a></li>
-                        <?php } ?>
-                        <?php for ($i = 1; $i <= $this->view['pages']; $i ++) { ?>
-                            <li class="<?php echo (($i == $this->view['arFilter']['page'])?'active':''); ?>"><a onclick="return goPage(<?php echo $i; ?>);" href="#"><?php echo $i; ?></a></li>
-                        <?php } ?>
-                        <?php if ($this->view['arFilter']['page'] + 1 <= $this->view['pages']) { ?>
-                            <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] + 1; ?>);" href="#" aria-label="<?php echo __('NÃ€chste Seite'); ?>"><span aria-hidden="true">&raquo;</span></a></li>
-                        <?php } ?>
-                    </ul>
-                </nav>
-            <?php } ?>
-
-        <?php } else { ?>
-
-            <?php echo wpsg_drawForm_AdminboxStart(); ?>
-    		<?php echo __('Keine Kundengruppen in der Datenbank.', 'wpsg'); ?>
-            <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-        <?php } ?>
-
-    </div>
-
+		var wpsg_order = '<?php echo $this->view['filter']['order']; ?>';
+		var wpsg_ascdesc = '<?php echo $this->view['filter']['ascdesc']; ?>';
+	
+		function wpsg_setOrder(order)
+		{
+		
+			if (order == wpsg_order)
+			{
+		
+				// Nur Richtung Ã€ndern
+				if (wpsg_ascdesc == 'asc') jQuery('#wpsg_ascdesc').val('desc');
+				else jQuery('#wpsg_ascdesc').val('asc');
+				
+			}
+			else
+			{
+		
+				jQuery('#wpsg_order').val(order);
+				jQuery('#wpsg_ascdesc').val('asc');
+				
+			}
+		
+			jQuery('#seite').val(1);
+			jQuery('#filter_form').submit();
+			
+			return false;
+			
+		} // function wpsg_setOrder(order)
+    
+	/* ]]> */</script>
+	
 </div>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-    <?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo $this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower($this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-
-	function goPage(page)
-	{
-
-		//if (page <= 0 || page == <?php echo $this->view['arFilter']['page']; ?> || page > <?php echo $this->view['pages']; ?>) return;
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-/* ]]> */</script>
Index: /views/mods/mod_customergroup/settings_edit.phtml
===================================================================
--- /views/mods/mod_customergroup/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_customergroup/settings_edit.phtml	(revision 5261)
@@ -6,6 +6,4 @@
 
 ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung_group_perpage', __('Kundengruppen pro Seite (Backend)', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_group_perpage'), array('help' => 'wpsg_mod_kundenverwaltung_group_perpage')); ?>
-
 <?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_group_checkout', __('Kundengruppe bei Registrierung (Checkout)', 'wpsg'), $this->view['arCustomergroup'], $this->get_option('wpsg_page_mod_kundenverwaltung_group_checkout'), array('help' => 'wpsg_page_mod_kundenverwaltung_group_checkout')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_group_register', __('Kundengruppe bei Registrierung (Registrierung)', 'wpsg'), $this->view['arCustomergroup'], $this->get_option('wpsg_page_mod_kundenverwaltung_group_register'), array('help' => 'wpsg_page_mod_kundenverwaltung_group_register')); ?>
Index: /views/mods/mod_deliverynote/deliverymail.phtml
===================================================================
--- /views/mods/mod_deliverynote/deliverymail.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/deliverymail.phtml	(revision 5261)
@@ -5,9 +5,6 @@
 	 */
 
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['customer']['title']], $this->view['customer']['vname'], $this->view['customer']['name']); ?>
- 	
+?><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['customer']['vname']; ?> <?php echo $this->view['customer']['name']; ?>,
+		
 <?php echo wpsg_translate(__("Sie erhalten hiermit den Lieferschein mit der Nummer #1# fÃŒr folgende Produkte.", "wpsg"), $this->view['dn']->lnr); ?> 
 		
Index: /views/mods/mod_deliverynote/deliverymail_html.phtml
===================================================================
--- /views/mods/mod_deliverynote/deliverymail_html.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/deliverymail_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Template fÃŒr die Mail an den Kunden (HTML)
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['customer']['vname']; ?> <?php echo $this->view['customer']['name']; ?>,</p>
Index: /views/mods/mod_deliverynote/deliverynote_pdf.phtml
===================================================================
--- /views/mods/mod_deliverynote/deliverynote_pdf.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/deliverynote_pdf.phtml	(revision 5261)
@@ -4,7 +4,7 @@
 	 * FPDF Template fÃŒr die Generierung des Lieferscheins
 	 */
-	
-	require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-	require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
+
+	require_once WPSG_PATH_LIB.'fpdf/fpdf.php';
+	require_once WPSG_PATH_LIB.'fpdf/fpdi.php';
 	require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
 	
@@ -19,56 +19,32 @@
 			global $absender_left, $absender_top, $adress_left, $adress_top, $dndata_left, $dndata_top;
 							
-			$rdata_left = 0;
 			$pdf->AddPage();
 			
-			if (file_exists($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_bp.pdf"))
-			{
-				
-				$pagecount = $pdf->setSourceFile($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_bp.pdf");
+			if (file_exists($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_bp.pdf"))
+			{
+				
+				$pagecount = $pdf->setSourceFile($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_bp.pdf");
 				$tplidx = $pdf->importPage(1, '/MediaBox');
 				$pdf->useTemplate($tplidx, 0, 0, 210);
 			
 			}
-			else if (file_exists($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_bp.jpg"))
-			{
-				
-				$pdf->image($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_bp.jpg", 0, 0, 210, 297, 'jpg');
-				
-			}
-
-
-			if (file_exists($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_logo.jpg"))
-			{
-
-				list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_logo.jpg");
-
-				// Umrechnung von Inch zu Pixel
+			else if (file_exists($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_bp.jpg"))
+			{
+				
+				$pdf->image($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_bp.jpg", 0, 0, 210, 297, 'jpg');
+				
+			}
+				
+				
+			if (file_exists($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_logo.jpg"))
+			{
+			
+				list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_logo.jpg");
+			 
 				$wPix = (25.4 * $width) / 96;
 				$hPix = (25.4 * $height) / 96;
-
-				$leftPos = 110 - $wPix;
-				$midPos = $wPix * 2.6 - $width / 2;
-				$rightPos = 210 - $wPix;
-
-				$abscissa = $rightPos;
-				$ordinate = 0;
-
-				$transparency = str_replace("%", "", $shop->get_option('wpsg_mod_deliverynote_logo_transparency'));
-				if($transparency !== "100") $transparency = str_replace(array("0", "00"), "", $transparency);
-
-				$alpha = 1;
-				if(!is_null($transparency) && $transparency !== "100") $alpha = "0.$transparency";
-				if(!is_null($transparency) && $transparency === "100") $alpha = $transparency;
-
-				$logo_pos = $shop->get_option('wpsg_mod_deliverynote_logo_position');
-
-				if(isset($logo_pos) && $logo_pos === "left") { $abscissa = $leftPos; $ordinate = 20; }
-				if(isset($logo_pos) && $logo_pos === "center") { $abscissa = $midPos; $ordinate = 20; }
-				if(isset($logo_pos) && $logo_pos === "right") { $abscissa = $rightPos; }
-
-				$pdf->SetAlpha($alpha);
-				$pdf->image($shop->callMod('wpsg_mod_deliverynote', 'getFilePath', array(''))."wpsg_deliverynote_logo.jpg", $abscissa, $ordinate, $wPix, $hPix);
-				$pdf->SetAlpha(1);
-
+			
+				$pdf->image($shop->callMod('wpsg_mod_deliverynote', getFilePath, array(''))."wpsg_deliverynote_logo.jpg", 210 - $wPix, 0, $wPix, $hPix);
+			
 			}
 				
@@ -77,5 +53,5 @@
 			$pdf->Text($absender_left, $absender_top, $shop->replaceUniversalPlatzhalter($shop->get_option("wpsg_mod_deliverynote_adressrow"), $shop->view['order']['id']));
 			
-			if (wpsg_getStr($shop->view['kunde']['kuerzel']) != "") $shop->view['kunde']['kuerzel'] = $shop->view['kunde']['kuerzel'].'-';
+			if ($shop->view['kunde']['kuerzel'] != "") $shop->view['kunde']['kuerzel'] = $shop->view['kunde']['kuerzel'].'-';
 				
 			// Adresse des Kunden
@@ -83,8 +59,7 @@
 			$pdf->Text($adress_left, $adress_top, $shop->view['data']['firma']);
 			$pdf->Text($adress_left, $adress_top + 5, $shop->view['data']['vname'].' '.$shop->view['data']['name']);
-			$pdf->Text($adress_left, $adress_top + 10, $shop->view['data']['strasse'].' '.$shop->view['data']['nr']);
+			$pdf->Text($adress_left, $adress_top + 10, $shop->view['data']['strasse'].' '.$shop->view['data']['hausnr']);
 			$pdf->Text($adress_left, $adress_top + 15, $shop->view['data']['plz'].' '.$shop->view['data']['ort']);
-			//if ($shop->get_option('wpsg_mod_deliverynote_hideCountry') != '1') $pdf->Text($adress_left, $adress_top + 20, strtoupper($shop->view['oOrder']->getShippingCountryName()));
-			if ($shop->get_option('wpsg_mod_deliverynote_hideCountry') != '1') $pdf->Text($adress_left, $adress_top + 20, $shop->view['data']['land']);
+			if ($shop->get_option('wpsg_mod_deliverynote_hideCountry') != '1') $pdf->Text($adress_left, $adress_top + 20, strtoupper($shop->view['oOrder']->getShippingCountryName()));
 			
 			// Lieferscheindaten
@@ -109,19 +84,12 @@
 			if ($shop->view['oOrder']->isInnerEu())
 			{
-
-            	$pdf->SetFont('Arial', '', 9);
-                $pdf->Text($adress_left, $rdata_top + 11.5, __("Innergemeinschaftliche Lieferung.", "wpsg"));
-
-            } else if (!$shop->view['oOrder']->isInnerEu() && $shop->view['oOrder']->getShippingCountryID() != $shop->getDefaultCountry(true)) {
-
-			// Nicht InnerEU und Nicht Inland
-
-             	$pdf->SetFont('Arial', '', 9);
-                $pdf->Text($adress_left, $rdata_top + 11.5, __("Steuerfreie Ausfuhrlieferung.", "wpsg"));
-
-			}
-
+					
+				$pdf->SetFont('Arial', '', 9);
+				$pdf->Text($adress_left, $dndata_top + 11.5, __("Innergemeinschaftliche Lieferung.", "wpsg"));
+			
+			}
+			
 			// Benutzerdefinierte Felder
-			$arTexte = $shop->callMod('wpsg_mod_deliverynote', 'getTexte', array($shop->view['order']['id']));
+			$arTexte = $shop->callMod('wpsg_mod_deliverynote', 'getTexte', array($shop->view['data']['id'])); 
 			
 			foreach ((array)$arTexte as $text)
@@ -132,7 +100,7 @@
 						
 					$pdf->SetFont('Arial', 'B', ((intval($text['fontsize']) > 0)?intval($text['fontsize']):10));
-					$pdf->wpsg_SetTextColor($text['color']);
-					$pdf->wpsg_MultiCell($text['x'], $text['y'], 5, $text['text']);
-					$pdf->wpsg_SetTextColor("#000000");
+					$pdf->SetTextColor($text['color']);
+					$pdf->MultiCell($text['x'], $text['y'], 5, utf8_encode($text['text']));
+					$pdf->SetTextColor("#000000");
 						
 				}
@@ -170,9 +138,6 @@
 	
 	$bKopf = false; $pnr = 1; $offset = 0; $count = 0;
-
 	foreach ($this->view['data']['products'] as $p)
 	{
-		
-		if (!is_array($p)) continue;
 		
 		$product_data = $this->loadProduktArray($this->getProduktID($p['p_id']));
@@ -197,8 +162,8 @@
 
 		/*
-		if ($this->hasMod('wpsg_mod_productvariants') && isset($p['mod_vp_varkey']))
-		{
-		
-			$variante = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p['mod_vp_varkey']));
+		if ($this->hasMod('wpsg_mod_varianten') && isset($p['mod_vp_varkey']))
+		{
+		
+			$variante = $this->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($p['mod_vp_varkey']));
 			$anr = $variante['akey'];
 			
@@ -228,16 +193,11 @@
 		}
 		
-		/* Wenn Detailname vorhanden, wird der Detailname auf dem Lieferschein verwendet*/
 		$produkt_text = $this->getProductName($this->getProduktID($p['p_id']), true);
-		
-		/* Wenn Detailname nicht vorhanden, wird der Name auf dem Lieferschein verwendet*/
-		$produkt_text = $this->getProductName($this->getProduktID($p['p_id']), false);
-
-		$produktBeschreibung = trim(strip_tags($product_data['beschreibung']));
+		$produktBeschreibung = trim(strip_tags($p['beschreibung']));
 		
 		if ($this->isOtherLang())
 		{
 				
-			$trans_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($this->getProduktID($p['productkey']))."' AND `lang_code` = '".wpsg_q($this->getCurrentLanguageCode())."'");
+			$trans_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($this->getProduktID($p['productkey']))."' AND `lang_locale` = '".wpsg_q(get_locale())."'");
 				
 			if (is_array($trans_db) && sizeof($trans_db) > 0)
@@ -290,5 +250,5 @@
 		
 		$height_y = $pdf->getY();
-		$height = 2 + $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $offset + 1.5, 5, $produkt_text, 0, 'L', 0, $produkt_text_cell_width);
+		$height = 2 + $pdf->MultiCell($prod_left + 10, $prod_top + $offset + 1.5, 5, utf8_encode($produkt_text), 0, 'L', 0, $produkt_text_cell_width);
 		
 		$pdf->setXY($prod_left + 147, $prod_top + $offset);
@@ -312,5 +272,5 @@
 				
 			$cellY = $pdf->getY();
-			$pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 1, 5, $produktBeschreibung, 0, 'L', 0, $produkt_text_cell_width);
+			$pdf->MultiCell($prod_left + 10, $prod_top + $height + $offset - 1, 5, utf8_encode($produktBeschreibung), 0, 'L', 0, $produkt_text_cell_width);
 			$pBeschreibungHeight = $pdf->getY() - $cellY - $height + 1;
 			$pdf->SetFont('Arial', '', 9);
@@ -319,32 +279,14 @@
 			
 		$height += $pBeschreibungHeight;
-		
-		/**
-		 * Produktattribute ?
-		 */
-		if ($this->get_option('wpsg_rechnungen_produktattribute') == '1')
-		{
-				
-			$attributeInfo = $this->callMod('wpsg_mod_produktattribute', 'getProductAttributeByProductId', array($this->getProduktId($p['id'])));
-		
-			foreach ($attributeInfo as $pa)
-			{
-					
-				$pa_text = $pa['name'].': '.$pa['value'];
-				$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, $pa_text, 0, 'L', 0, $produkt_text_cell_width);
-					
-			}
-		}
 		
 		/**
 		 * Variante ?
 		 */
-		//$p['productkey'] = 'pv_6|4:1|7:3';
-		if ($this->get_option("wpsg_mod_deliverynote_pdf_varianten") == "1" && preg_match('/pv_(.*)/', $p['productkey']))
-		{
-				
-			$variInfo = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p['productkey']));
-		
-			$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 1.5, 5, wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key']), 0, 'L', 0, $produkt_text_cell_width);
+		if ($this->get_option("wpsg_mod_deliverynote_pdf_varianten") == "1" && preg_match('/vp_(.*)/', $p['productkey']))
+		{
+				
+			$variInfo = $this->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($p['productkey']));
+		
+			$height += $pdf->MultiCell($prod_left + 10, $prod_top + $height + $offset - 1.5, 5, utf8_encode(wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key'])), 0, 'L', 0, $produkt_text_cell_width);
 				 
 		}
@@ -377,11 +319,9 @@
 	{
 	
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, $this->view['fussText']);
+		$pdf->MultiCell($prod_left - 1, $prod_top + $offset, 5, utf8_encode($this->view['fussText']));
 		$pdf->SetFont('Arial', 'B', 9);
 		$offset += 10;
 	
 	}
-
-    ob_end_clean();
 	
 	if ($this->view['preview'])
@@ -394,6 +334,7 @@
 		$pdf->Output($this->callMod('wpsg_mod_deliverynote', 'getFilePath', array($this->view['order']['id'])).$this->view['filename'], 'F');
 	
-		if (wpsg_isTrue($this->view['output'])) $pdf->Output($filename, 'I');
-			
-	}
-	
+		if ($this->view['output'] === true) $pdf->Output($filename, 'I');
+			
+	}
+	
+?>
Index: /views/mods/mod_deliverynote/foottext_list.phtml
===================================================================
--- /views/mods/mod_deliverynote/foottext_list.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/foottext_list.phtml	(revision 5261)
@@ -9,60 +9,53 @@
 <p><?php echo __('Bisher keine FuÃtexte angelegt!', 'wpsg'); ?></p>
 <?php } else { ?>
-<table class="table table-body-striped wpsg_foottextlist">
-    <thead>
-        <tr>
-            <th class="col_kuerzel"><?php echo __('KÃŒrzel', 'wpsg'); ?></th>
-            <th class="col_text"><?php echo __('Text', 'wpsg'); ?></th>
-            <th class="col_standard"><?php echo __('Standard', 'wpsg'); ?></th>
-            <th class="col_aktion"></th>
-        </tr>
-    </thead>
-    <tbody>
-        <?php foreach ((array)$this->view['wpsg_mod_deliverynote']['data'] as $key => $d) { ?>
-        <tr>
-            <td class="col_kuerzel"><span id="wpsg_foottext_0_<?php echo $key; ?>" class="wpsg_editable"><?php echo wpsg_hspc($d[0]); ?></span></td>
-            <td class="col_text"><span class="wpsg_editable" id="wpsg_foottext_1_<?php echo $key; ?>"><?php echo wpsg_hspc($d[1]); ?></span></td>
-            <td class="col_standard"><input type="radio" value="<?php echo $key; ?>" <?php echo (($this->get_option('wpsg_mod_deliverynote_foottext_standard') == $key)?'checked="checked"':''); ?> class="wpsg_mod_deliverynote_foottext_standard" name="wpsg_mod_deliverynote_foottext_standard" /></td>
-            <td class="col_aktion">
+<table class="wpsg_foottextlist">			
+	<tr>
+		<th class="col_kuerzel"><?php echo __('KÃŒrzel', 'wpsg'); ?></th>
+		<th class="col_text"><?php echo __('Text', 'wpsg'); ?></th>
+		<th class="col_standard"><?php echo __('Standard', 'wpsg'); ?></th>
+		<th class="col_aktion"></th>
+	</tr>
+	<?php foreach ((array)$this->view['wpsg_mod_deliverynote']['data'] as $key => $d) { ?>
+	<tr>
+		<td class="col_kuerzel wpsg_editable" id="wpsg_foottext_0_<?php echo $key; ?>"><?php echo wpsg_hspc($d[0]); ?></td>
+		<td class="col_text wpsg_editable" id="wpsg_foottext_1_<?php echo $key; ?>"><?php echo wpsg_hspc($d[1]); ?></td>
+		<td class="col_standard"><input type="radio" value="<?php echo $key; ?>" <?php echo (($this->get_option('wpsg_mod_deliverynote_foottext_standard') == $key)?'checked="checked"':''); ?> class="wpsg_mod_deliverynote_foottext_standard" name="wpsg_mod_deliverynote_foottext_standard" /></td>
+		<td class="col_aktion">
+		
+			<a onclick="return wpsg_removeFooter(<?php echo $key; ?>);" title="<?php echo __('FuÃtext lÃ¶schen', 'wpsg'); ?>'" href="#" class="wpsg_icon wpsg_icon_center wpsg_icon_remove"></a>
+			
+			<script type="text/javascript">
 
-                <a onclick="return wpsg_removeFooter(<?php echo $key; ?>);" title="<?php echo __('FuÃtext lÃ¶schen', 'wpsg'); ?>'" href="#" class="">
-                    <span class="glyphicon glyphicon-trash"></span>
-                </a>
+				jQuery(document).ready(function() {
+ 
+					jQuery('#wpsg_foottext_0_<?php echo $key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverynote&do=inlineEdit&noheader=1', {
+						submitdata: { 
+				    		field: '0',
+				    		field_id: '<?php echo $key; ?>'
+						}, 					
+						submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});	
+	
+					jQuery('#wpsg_foottext_1_<?php echo $key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverynote&do=inlineEdit&noheader=1', {
+						submitdata: { 
+				    		field: '1',
+				    		field_id: '<?php echo $key; ?>'
+						}, 					
+						submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});	
 
-                <script type="text/javascript">/* <![CDATA[ */
-
-                    jQuery(document).ready(function() {
-
-                        jQuery('#wpsg_foottext_0_<?php echo $key; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverynote&do=inlineEdit&noheader=1', {
-                            submitdata: {
-                                field: '0',
-                                field_id: '<?php echo $key; ?>'
-                            },
-                            submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                            placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                            indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                            tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                        });
-
-                        jQuery('#wpsg_foottext_1_<?php echo $key; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverynote&do=inlineEdit&noheader=1', {
-                        	type: 'textarea',
-                            submitdata: {
-                                field: '1',
-                                field_id: '<?php echo $key; ?>'
-                            },
-                            submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                            placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                            indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                            tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                        });
-
-                    } );
-
-                /* ]]> */</script>
-
-            </td>
-        </tr>
-        <?php } ?>
-    </tbody>
+				} );
+					
+			</script>
+			
+		</td>
+	</tr>
+	<?php } ?>
 </table>
 <?php } ?>
Index: /views/mods/mod_deliverynote/order_view_content.phtml
===================================================================
--- /views/mods/mod_deliverynote/order_view_content.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/order_view_content.phtml	(revision 5261)
@@ -6,6 +6,9 @@
 
 ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Lieferscheine', 'wpsg'));  ?>
-
+<div class="postbox" id="wpsg_deliverynote">		
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Lieferschein', 'wpsg'); ?></span>
+	</h3>
 	<div class="inside">
 	
@@ -19,10 +22,5 @@
 					wpsg_formatTimestamp(strtotime($v->cdate), true),
 					wpsg_formatTimestamp($v->getDeliveryTimestamp(), true)						
-				); ?> <a target="_blank" href="<?php 
-					
-					/* echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_deliverynote&do=get&edit_id=<?php echo $this->view['data']['id']; ?>&dn_id=<?php echo $v->id; */
-					echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_deliverynote&do=get&edit_id='.$this->view['data']['id'].'&dn_id='.$v->id, 'wpsg-deliverynote-order_ajax-deliverynote-'.$this->view['data']['id']);
-					
-				?>"><?php echo __('Ansehen', 'wpsg'); ?></a><br />
+				); ?> <a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_deliverynote&do=get&edit_id=<?php echo $this->view['data']['id']; ?>&dn_id=<?php echo $v->id; ?>"><?php echo __('Ansehen', 'wpsg'); ?></a><br />
 			<?php } ?><br />
 				
@@ -30,16 +28,14 @@
 		
 		<?php if (wpsg_isSizedArray($this->view['wpsg_mod_deliverynote']['arNoDeliveredProducts'])) { ?>
-			<fieldset>			
-				<legend ><?php echo __('Neuer Lieferschein', 'wpsg'); ?></legend>
+			<fieldset style="border:1px solid #999999; width:100%;">			
+				<legend style="margin-left:10px; margin-right:10px;"><?php echo __('Neuer Lieferschein', 'wpsg'); ?></legend>
 				
-				<form target="_blank" method="post" id="deliverynote_order_backend" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_deliverynote&cmd=deliverynote&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>">
-									
-					<?php \wp_nonce_field('wpsg-deliverynote-order_ajax-deliverynote-'.$this->view['data']['id']); ?>
-					
-					<div>
+				<form target="_blank" method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_deliverynote&cmd=deliverynote&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>">
+				
+					<div style="padding:5px;">
 						
 						<label style="height:25px; width:240px; float:left; margin-top:10px;">	
 							<input onchange="if (this.checked) jQuery('#wpsg_mod_deliverynote_email').show(); else jQuery('#wpsg_mod_deliverynote_email').hide();" type="checkbox" checked="checked" value="1" name="wpsg_mod_deliverynote_showmail" />
-							&nbsp;<?php echo __("E-Mail an Kunden senden", "wpsg"); ?>
+							&nbsp;<?php echo __("E-Mail an Kunden senden.", "wpsg"); ?>
 						</label>
 						<input type="text" style="display:block; width:300px; float:right;" id="wpsg_mod_deliverynote_email" name="wpsg_mod_deliverynote_email" value="<?php echo wpsg_hspc($this->view['data']['email']); ?>" />
@@ -48,5 +44,5 @@
 						<label style="height:25px; width:220px; float:left;">									
 							<input checked="checked" onchange="if (this.checked) jQuery('#wpsg_mod_deliverynote_status').show(); else jQuery('#wpsg_mod_deliverynote_status').hide();" type="checkbox" value="1" name="wpsg_mod_deliverynote_setstatus" />
-							&nbsp;<?php echo __("Neuer Status", "wpsg"); ?>										
+							&nbsp;<?php echo __("Neuer Status:", "wpsg"); ?>										
 						</label>
 						<select style="width:300px; float:right;" id="wpsg_mod_deliverynote_status" name="wpsg_mod_deliverynote_status">
@@ -58,5 +54,5 @@
 		
 						<label style="height:25px; width:240px; float:left;">
-							<input id="wpsg_mod_deliverynote_url"<?php echo (($this->get_option("wpsg_mod_deliverynote_url_standard") === "1")?'checked="checked"':''); ?> type="checkbox" value="1" name="wpsg_mod_deliverynote_noticeurl" />
+							<input <?php echo (($this->get_option("wpsg_mod_deliverynote_url_standard") === "1")?'checked="checked"':''); ?> type="checkbox" value="1" name="wpsg_mod_deliverynote_noticeurl" />
 							&nbsp;<?php echo __("URL Benachrichtigung", "wpsg"); ?>
 						</label>
@@ -64,7 +60,7 @@
 									
 						<label style="height:25px; width:240px; float:left; padding-left:22px;">
-							<?php echo __("Lieferdatum", "wpsg"); ?>										
+							<?php echo __("Lieferdatum", "wpsg"); ?>:											
 						</label>
-						<input id="wpsg_mod_deliverynote_date" style="display:block;float:right; width:300px;" type="text" name="wpsg_mod_deliverynote_date" value="<?php echo date("d.m.Y", time()); ?>" />
+						<input style="display:block;float:right; width:300px;" type="text" name="wpsg_mod_deliverynote_date" value="<?php echo date("d.m.Y", time()); ?>" />
 						<div style="clear:both; width:100%; height:5px;"></div>
 																		
@@ -76,10 +72,7 @@
 													
 							$wpsg_mod_deliverynote_footer = $this->get_option("wpsg_mod_deliverynote_footer");
-		 					
-							if (!is_array($wpsg_mod_deliverynote_footer)) $wpsg_mod_deliverynote_footer = unserialize($this->get_option("wpsg_mod_deliverynote_footer"));
+		 					if (!is_array($wpsg_mod_deliverynote_footer)) $wpsg_mod_deliverynote_footer = unserialize($this->get_option("wpsg_mod_deliverynote_footer"));
 							if (!is_array($wpsg_mod_deliverynote_footer)) $wpsg_mod_deliverynote_footer = Array();
-							
-							$default = $this->get_option('wpsg_mod_deliverynote_foottext_standard');							
-							
+		
 						?>
 												
@@ -87,5 +80,5 @@
 						<select style="width:300px; float:right;" name="wpsg_mod_deliverynote_select" id="wpsg_mod_deliverynote_select" onchange="jQuery('#wpsg_mod_deliverynote_fusstext').val(this.value);">
 							<?php foreach ($wpsg_mod_deliverynote_footer as $k => $v) { ?>
-							<option <?php echo ((intval($default) === intval($k))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($v[1]); ?>"><?php echo wpsg_hspc($v[0]); ?></option>
+							<option <?php echo (($this->get_option('wpsg_mod_deliverynote_foottext_standard') == $k)?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($v[1]); ?>"><?php echo wpsg_hspc($v[0]); ?></option>
 							<?php } ?>
 						</select>
@@ -93,5 +86,5 @@
 		
 						<div style="clear:both; width:100%; height:5px;"></div>															
-						<div style="padding-left:25px;"><textarea style="width:100%;" type="text" name="wpsg_mod_deliverynote_fusstext" id="wpsg_mod_deliverynote_fusstext" value="" /></textarea></div>								
+						<div style="padding-left:25px;"><input style="width:100%;" type="text" name="wpsg_mod_deliverynote_fusstext" id="wpsg_mod_deliverynote_fusstext" value="" /></div>								
 						<div style="clear:both; width:100%; height:15px;"></div>
 										
@@ -106,10 +99,5 @@
 						<input type="hidden" id="wpsg_mod_deliverynote_productindexes" name="wpsg_mod_deliverynote_productindexes" />
 										
-						<input class="button" style="float:right;" onclick="if (!wpsg_mod_deliverynote_checkProducts()) return false; window.setTimeout(function() { location.href = '<?php 
-							
-							/*echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id'];*/ 
-							echo wpsg_admin_url('Order', 'view', ['edit_id' => $this->view['data']['id']]);
-							
-						?>'; }, 1000);" name="wpsg_mod_deliverynote_write" type="submit" value="<?php echo __("Lieferschein erstellen", "wpsg"); ?>" />
+						<input class="button" style="float:right;" onclick="if (!wpsg_mod_deliverynote_checkProducts()) return false; window.setTimeout(function() { location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>'; }, 1000);" name="wpsg_mod_deliverynote_write" type="submit" value="<?php echo __("Lieferschein erstellen", "wpsg"); ?>" />
 						<input class="button" style="float:right; margin-right:10px;" onclick="if (!wpsg_mod_deliverynote_checkProducts()) return false;" name="wpsg_mod_deliverynote_preview" type="submit" value="<?php echo __("Vorschau", "wpsg"); ?>" />
 										
@@ -124,6 +112,5 @@
 	
 	</div>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+</div>
 
 <script type="text/javascript">/* <![CDATA[ */
@@ -135,5 +122,5 @@
 	{
 
-		if (jQuery('.wpsg_mod_deliverynote_product_i:checked').length <= 0)
+		if (jQuery('.wpsg_mod_deliverynote_product:checked').length <= 0)
 		{
 
@@ -147,5 +134,5 @@
 			var arProductKeys = Array();
 			
-			jQuery('.wpsg_mod_deliverynote_product_i:checked').each(function() {
+			jQuery('.wpsg_mod_deliverynote_product:checked').each(function() {
 				
 				arProductKeys.push(jQuery(this).val());
@@ -154,5 +141,4 @@
 
 			jQuery('#wpsg_mod_deliverynote_productindexes').val(arProductKeys.join(','));
-
 			
 		}
Index: /views/mods/mod_deliverynote/order_view_row.phtml
===================================================================
--- /views/mods/mod_deliverynote/order_view_row.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/order_view_row.phtml	(revision 5261)
@@ -7,8 +7,8 @@
 ?>
 <tr class="wpsg_<?php echo (($this->view['wpsg_mod_deliverynote']['i'] == 0)?'odd':'even'); ?>">	
-	<td align="left" colspan="<?php echo ((sizeof($this->view['arCalculation']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'5':'4'); ?>">
-		<label style="font-weight:normal; display:flex; flex-direction:row; margin-bottom:0px;">		
-			<input checked="checked" type="checkbox" class="wpsg_mod_deliverynote_product_i" name="wpsg_mod_deliverynote_products[]" value="<?php echo $this->view['wpsg_mod_deliverynote']['product']['product_index']; ?>" style="margin:0px; margin-right:5px;" />
-            <span>&nbsp;<?php echo __('Auf Lieferschein', 'wpsg'); ?></span>
+	<td align="left" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'5':'4'); ?>">
+		<label>		
+			<input checked="checked" type="checkbox" class="wpsg_mod_deliverynote_product" name="wpsg_mod_deliverynote_products[]" value="<?php echo $this->view['wpsg_mod_deliverynote']['product']['product_index']; ?>" />
+			&nbsp;<?php echo __('In Lieferschein einbeziehen', 'wpsg'); ?>
 		</label>
 	</td>
Index: /views/mods/mod_deliverynote/settings_edit.phtml
===================================================================
--- /views/mods/mod_deliverynote/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_deliverynote/settings_edit.phtml	(revision 5261)
@@ -6,91 +6,70 @@
 
 ?>
-
-<div>
-	<ul class="nav nav-tabs" role="tablist">
-		<li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Vordefinierte Textfelder', 'wpsg'); ?></a></li>
-		<li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('FuÃzeile', 'wpsg'); ?></a></li>
-		<li role="presentation"><a href="#tab3" aria-controls="messages" role="tab" data-toggle="tab"><?php echo __('Sonstiges', 'wpsg'); ?></a></li>
-	</ul>
-	<div class="tab-content">
-		<div role="tabpanel" class="tab-pane active" id="tab1">
-
-			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverynote_adressrow', __('Adresszeile', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_adressrow'), array('help' => 'wpsg_mod_deliverynote_adressrow')); ?>
-
-			<hr>
-			
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			<div style="position:relative;">
-				<?php if ($this->view['wpsg_mod_deliverynote']['bp'] === false) { ?>
+<br />
+<div class="wpsg_admin_box" id="wpsg_tab">	
+	<div class="head">
+		<div class="title">
+			<div class="tab" id="tab1"><?php echo __('Vordefinierte Textfelder', 'wpsg'); ?></div>
+			<div class="tab" id="tab2"><?php echo __('FuÃzeile', 'wpsg'); ?></div>			
+			<div class="tab" id="tab3"><?php echo __('Sonstiges', 'wpsg'); ?></div>
+			<div class="tabcontent tablink">
+				<a href="" title="<?php echo __('Neues Feld fÃŒr die FuÃzeile hinzufÃŒgen', 'wpsg'); ?>" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addFooter();"></a>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+	<div class="content">
+		<div id="tabcontent1" class="tabcontent">
+			
+			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverynote_adressrow', __('Adresszeile', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_adressrow')); ?>
+			<div class="wpsg_hinweis"><?php echo __('Diese Zeile wird klein oberhalb der Kundenadresse platziert', 'wpsg'); ?></div>
+			<br />
+			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Briefpapier (PDF/JPG)', 'wpsg'); ?>:</label><br />
+					<?php if ($this->view['wpsg_mod_deliverynote']['bp'] !== false) { ?>
+					<label>
+						<input type="checkbox" name="wpsg_mod_deliverynote_bp_del" value="1" />&nbsp;<?php echo __('LÃ¶schen', 'wpsg'); ?>
+					</label>
+					<?php } ?>
+				</div>
+				<div class="wpsg_form_right">
+					<?php if ($this->view['wpsg_mod_deliverynote']['bp'] === false) { ?>
 					<p><?php echo __('Es wurde bisher kein Briefpapier hochgeladen', 'wpsg'); ?></p>
-				<?php } else { ?>
+					<?php } else { ?>
 					<a href="<?php echo $this->view['wpsg_mod_deliverynote']['bp']; ?>" target="_blank"><?php echo __('Derzeitiges Briefpapier', 'wpsg'); ?></a>
-				<?php } ?>
-				<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_bp" data-wpsg-tip="mod_deliverynote_bp" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_bp"></a>
-				<input type="file" name="wpsg_mod_deliverynote_bp">
-				<?php $strSuffix = ''; if ($this->view['wpsg_mod_deliverynote']['bp'] !== false) { $strSuffix = '
-                    <label>
-						<input type="checkbox" name="wpsg_mod_deliverynote_bp_del" value="1" />&nbsp;'.__('LÃ¶schen', 'wpsg').'
-					</label>';
-					echo __($strSuffix);
-				} ?>
-			</div>
-			<?php echo wpsg_drawForm_TextEnd(__('Briefpapier (PDF/JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_mod_deliverynote_bp')); ?>
-
-			<hr>
-			
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			<div style="position:relative;">
-				<?php if ($this->view['wpsg_mod_deliverynote']['logo'] === false) { ?>
+					<?php } ?>					
+					<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_bp" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_bp"></a>
+					<input type="file" name="wpsg_mod_deliverynote_bp">
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Logo (JPG)', 'wpsg'); ?>:</label><br />
+					<?php if ($this->view['wpsg_mod_deliverynote']['logo'] !== false) { ?>
+					<label>
+						<input type="checkbox" name="wpsg_mod_deliverynote_logo_del" value="1" />&nbsp;<?php echo __('LÃ¶schen', 'wpsg'); ?>
+					</label>
+					<?php } ?>
+				</div>
+				<div class="wpsg_form_right">
+					<?php if ($this->view['wpsg_mod_deliverynote']['logo'] === false) { ?>
 					<p><?php echo __('Es wurde bisher kein Logo hochgeladen', 'wpsg'); ?></p>
-				<?php } else { ?>
-					<a href="<?php echo stripslashes($this->view['wpsg_mod_deliverynote']['logo']); ?>" target="_blank"><?php echo __('Derzeitiges Logo', 'wpsg'); ?></a>
-				<?php } ?>
-				<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_logo" data-wpsg-tip="mod_deliverynote_logo" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_logo"></a>
-				<input type="file" name="wpsg_mod_deliverynote_logo">
-				<?php $logo_pos = $this->get_option("wpsg_mod_deliverynote_logo_position"); ?>
-				<?php $defaultAlign = !isset($logo_pos) || empty($logo_pos) ? "align-buttons-active" : ""; ?>
-
-				<?php $alignLeft = $logo_pos === 'left' ? "align-buttons-active" : ""; ?>
-				<?php $alignCenter = $logo_pos === 'center' ? "align-buttons-active" : ""; ?>
-				<?php $alignRight = $logo_pos === 'right' ? "align-buttons-active" : ""; ?>
-
-				<?php $logo_transparency = $this->get_option("wpsg_mod_deliverynote_logo_transparency") ?: "0%"; ?>
-
-				<?php $strSuffix = ''; if (@$this->view['logo'] !== false) { $strSuffix = '
-					<div class="row">
-						<div class="col-md-4">
-							<div class="align-buttons">
-								<input type="input" data-toggle="tooltip" class="logo-align-button logo-align-button-left '.$alignLeft.'" name="wpsg_mod_deliverynote_logo_position_left" value="&#xf036" onclick="handleLogoAlignClick($(this))" onkeydown="return false;" onfocus="return false;" autocomplete="off" title="'.__("Logo linksbÃŒndig ausrichten").'">
-								<input type="input" data-toggle="tooltip" class="logo-align-button logo-align-button-center '.$alignCenter.'" name="wpsg_mod_deliverynote_logo_position_center" value="&#xf037" onclick="handleLogoAlignClick($(this))" onkeydown="return false;" onfocus="return false;" autocomplete="off" title="'.__("Logo zentrieren").'">
-								<input type="input" data-toggle="tooltip" class="logo-align-button logo-align-button-right '.$alignRight.' '.$defaultAlign.'" name="wpsg_mod_deliverynote_logo_position_right" value="&#xf038" onclick="handleLogoAlignClick($(this))" onkeydown="return false;" onfocus="return false;" autocomplete="off" title="'.__("Logo rechtsbÃŒndig ausrichten").'">
-							</div>
-						</div>
-						<div class="col-md-8 logo-transparency">
-							<label>
-								<input type="text" name="wpsg_mod_deliverynote_logo_transparency" value="'.$logo_transparency.'" />&nbsp;'.__('Logodeckkraft', 'wpsg').'
-							</label>		
-						</div>
-						<div class="col-md-12">
-							<label>
-								<input type="checkbox" name="wpsg_mod_deliverynote_logo_del" value="1" />&nbsp;'.__('LÃ¶schen', 'wpsg').'
-							</label>	
-						</div>
-					</div>';
-					echo __($strSuffix);
-				} ?>
-						
-					
-				<button class="button wpsg_deliverynote_preview" style="float:right; margin-right:10px;" name="wpsg_deliverynote_preview" type="button">
-					<?php echo __("Vorschau", "wpsg"); ?>
-				</button>
-
-			</div>
-			<?php echo wpsg_drawForm_TextEnd(__('Logo (JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_mod_deliverynote_logo')); ?>
-
-			<hr> <br />
-
-			<table class="table table-body-striped wpsg_mod_deliverynote_fieldtable">
-				<thead>
+					<?php } else { ?>
+					<a href="<?php echo $this->view['wpsg_mod_deliverynote']['logo']; ?>" target="_blank"><?php echo __('Derzeitiges Logo', 'wpsg'); ?></a>
+					<?php } ?>
+					<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_logo" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_logo"></a>
+					<input type="file" name="wpsg_mod_deliverynote_logo">
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			
+			<div class="wpsg_hinweis"><?php echo __('Das Briefpapier wird hinter die gesamte Seite gelegt, das Logo wird rechts oben auf jeder Seite platziert. (96 dpi)', 'wpsg'); ?></div>
+			<br />
+			
+			<table class="wpsg_mod_deliverynote_fieldtable">
 				<tr>
 					<th class="col_bezeichnung"><?php echo __('Bezeichnung', 'wpsg'); ?></th>
@@ -102,90 +81,73 @@
 					<th class="col_action"></th>
 				</tr>
-				</thead>
-				<tbody>
 				<?php foreach ($this->view['wpsg_mod_deliverynote']['fields'] as $f => $field_name) { ?>
-					<tr>
-						<td><?php echo wpsg_hspc($field_name); ?></td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][text]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['text']); ?>" />
-						</td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][x]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['x']); ?>" />
-						</td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][y]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['y']); ?>" />
-						</td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][color]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['color']); ?>" />
-						</td>
-						<td>
-							<select name="text[<?php echo $f; ?>][fontsize]" style="width:100%;">
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "8")?'selected="selected"':''); ?> value="8">8</option>
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "9")?'selected="selected"':''); ?> value="9">9</option>
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "10")?'selected="selected"':''); ?> value="10">10</option>
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "11")?'selected="selected"':''); ?> value="11">11</option>
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "12")?'selected="selected"':''); ?> value="12">12</option>
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "13")?'selected="selected"':''); ?> value="13">13</option>
-								<option <?php echo ((wpsg_getStr($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize']) == "14")?'selected="selected"':''); ?> value="14">14</option>
-							</select>
-						</td>
-						<td>
-							<input type="checkbox" title="<?php echo __('Diese Checkbox aktivieren, damit die Textzeile verwendet wird.', 'wpsg'); ?>" value="1" name="text[<?php echo $f; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['aktiv']))?'checked="checked"':''); ?> />
-						</td>
-					</tr>
+				<tr>
+					<td><?php echo wpsg_hspc($field_name); ?></td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][text]" value="<?php echo wpsg_hspc($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['text']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][x]" value="<?php echo wpsg_hspc($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['x']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][y]" value="<?php echo wpsg_hspc($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['y']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][color]" value="<?php echo wpsg_hspc($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['color']); ?>" />
+					</td>
+					<td>
+						<select name="text[<?php echo $f; ?>][fontsize]" style="width:100%;">
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "8")?'selected="selected"':''); ?> value="8">8</option>				
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "9")?'selected="selected"':''); ?> value="9">9</option>
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "10")?'selected="selected"':''); ?> value="10">10</option>
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "11")?'selected="selected"':''); ?> value="11">11</option>
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "12")?'selected="selected"':''); ?> value="12">12</option>
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "13")?'selected="selected"':''); ?> value="13">13</option>
+							<option <?php echo (($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['fontsize'] == "14")?'selected="selected"':''); ?> value="14">14</option>
+						</select>
+					</td>
+					<td>			
+						<label><input type="checkbox" value="1" name="text[<?php echo $f; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['wpsg_mod_deliverynote']['arTexte'][$f]['aktiv']))?'checked="checked"':''); ?> />&nbsp;<?php echo __("Aktiv", "wpsg"); ?></label>
+						<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_deliverynote_fieldconfig"></a>
+					</td>
+				</tr>
 				<?php } ?>
-				</tbody>
 			</table>
-
-			<input class="button" onclick="if (!confirm('<?php echo __('Sind Sie sich sicher? Ihre bisherigen Einstellungen gehen verloren!', 'wpsg'); ?>')) return false; else location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $_REQUEST['modul']; ?>&amp;do=reset&amp;noheader=1';" type="button" value="<?php echo __('Standardeinstellungen laden', 'wpsg'); ?>" />
-
-			<br /><br />
-
-			<div class="info">
-				<p>
-					<?php echo __('Die Angaben fÃŒr X (Abstand von Links) und Y (Abstand von Oben) werden in mm eingetragen.', 'wpsg'); ?><br />
-					<?php echo __('Die Farbe wird im Hexadezimalformat angegeben (#FFFFFF fÃŒr weiÃ, #000000 fÃŒr schwarz).', 'wpsg'); ?>
-				</p>
-			</div>
-
-			<br />
-
+						
+			<br />
+			
+			<input style="float:right;" class="button" onclick="if (!confirm('<?php echo __('Sind Sie sich sicher? Ihre bisherigen Einstellungen gehen verloren!', 'wpsg'); ?>')) return false; else location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $_REQUEST['modul']; ?>&amp;do=reset&amp;noheader=1';" type="button" value="<?php echo __('Standardeinstellungen laden', 'wpsg'); ?>" />
+			
+			<div class="wpsg_hinweis">
+				<?php echo __('Die Angaben fÃŒr X (Abstand von Links) und Y (Abstand von Oben) werden in mm eingetragen.', 'wpsg'); ?><br />
+				<?php echo __('Die Farbe wird im Hexadezimalformat angegeben (#FFFFF fÃŒr weiÃ, #000000 fÃŒr schwarz).', 'wpsg'); ?> 
+			</div>
+			<br />
+			
 		</div>
-		<div role="tabpanel" class="tab-pane" id="tab2">
-
+		<div id="tabcontent2" class="tabcontent">
+			
 			<div id="foottext_list"><?php echo $this->view['foottext_list']; ?></div>
-
-			<br />
-
-			<a title="<?php echo __('Neue FuÃzeile anlegen', 'wpsg'); ?>" href="" class="" onclick="return wpsg_addFooter();"><span class="glyphicon wpsg-glyphicon glyphicon-plus"></span><?php echo __('Neue FuÃzeile anlegen.', 'wpsg'); ?></a>
-
-			<br /><br />
-
-			<div class="info">
-				<p>
-					<?php echo __('Hier kÃ¶nnen Sie Texte vordefinieren, die sie unter den Lieferschein setzen kÃ¶nnen.', 'wpsg'); ?>
-				</p>
-			</div>
-
-		</div>
-		<div role="tabpanel" class="tab-pane" id="tab3">
-
-            <?php echo wpsg_drawForm_Input('wpsg_mod_deliverynote_nrformat', __('Format der Lieferscheinnummer', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_nrformat'), array('help' => 'wpsg_mod_deliverynote_nrformat')); ?>
+			<br />
+			
+			<div class="wpsg_hinweis">
+				<?php echo __('Hier kÃ¶nnen Sie Texte vordefinieren, die sie unter den Lieferschein setzen kÃ¶nnen.', 'wpsg'); ?>
+			</div>
+			
+		</div>		
+		<div id="tabcontent3" class="tabcontent">
+		
+			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverynote_nrformat', __('Format der Lieferscheinnummer', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_nrformat'), array('help' => 'wpsg_mod_deliverynote_nrformat')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverynote_nr', __('Start fÃŒr Lieferscheinnummer', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_nr'), array('help' => 'wpsg_mod_deliverynote_nr')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverynote_url', __('URL FÃŒr URL Benachrichtigung', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_url'), array('help' => 'wpsg_mod_deliverynote_url')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverynote_url_standard', __('URL Benachrichtigung standardmÃ€Ãig aktiv', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_url_standard'), array('help' => 'wpsg_mod_deliverynote_url_standard')); ?>
-
-			<?php if ($this->hasMod('wpsg_mod_produktattribute') == '1') {?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverynote_produktattribute', __('Produktattribute auf dem Lieferschein anzeigen', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_produktattribute'), array('help' => 'wpsg_mod_deliverynote_produktattribute')); ?>
-			<?php }?>
-
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverynote_hideCountry', __('Land auf Lieferschein verbergen', 'wpsg'), $this->get_option('wpsg_mod_deliverynote_hideCountry'), array('help' => 'wpsg_mod_deliverynote_hideCountry')); ?>
 			<?php echo wpsg_drawForm_Select('wpsg_mod_deliverynote_anr', __('Artikelnummer anzeigen', 'wpsg'), array(
 				'0' => __('Nicht anzeigen', 'wpsg'),
 				'1' => __('In Spalte "Nr." zeigen', 'wpsg'),
-				'2' => __('Als extra Zeile anzeigen', 'wpsg')
+				'2' => __('Als extra Zeile anzeigen', 'wpsg')					
 			), $this->get_option('wpsg_mod_deliverynote_anr'), array('help' => 'wpsg_mod_deliverynote_anr')); ?>
-
-        </div>
+					
+		</div>
 	</div>
 </div>
@@ -194,59 +156,9 @@
 
 	/**
-	 * Stellt sicher, dass immer nur ein Button der align-buttons die highlight Klasse hat
-	 */
-	function handleLogoAlignClick(pressedEl)
-	{
-
-		if(pressedEl.hasClass("align-buttons-active")) return;
-		else
-		{
-
-			pressedEl.addClass("align-buttons-active");
-			pressedEl[0].value = pressedEl[0].value + " selected";
-
-			jQuery.each($(".logo-align-button"), function(index, element) {
-				if(element.classList.contains("align-buttons-active") && element !== pressedEl[0]){
-
-					var values = element.value.split(" ");
-					element.value = values[0];
-
-					element.classList.remove("align-buttons-active");
-
-					return false;
-
-				}
-			});
-
-		}
-
-	} // function handleLogoAlignClick()
-
-	/**
-	 * Wird beim Klicken auf den Vorschau Button ausgelÃ¶st
-	 */
-	function wpsg_deliverynote_preview()
-	{
-
-		var url = "<?php
-
-            $url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverynote&do=orderAjax&noheader=1&wpsg_mod_deliverynote_preview=1&edit_id=0';
-
-            echo html_entity_decode(wp_nonce_url($url, 'wpsg-deliverynote-order_ajax-deliverynote-0'));
-
-        ?>";
-
-		window.open(url, '_blank');
-
-		return false;
-
-	} // function wpsg_rechnungen_preview()
-
-	/**
 	 * Wird beim anlegen einer neuen FuÃzeile aufgerufen
-	 */
+	 */ 
 	function wpsg_addFooter()
 	{
-
+	
 		jQuery('#foottext_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
 		
@@ -257,7 +169,7 @@
 			}
 		} );
-
+	
 		return false;
-
+	
 	} // function wpsg_addFooter()
 	
@@ -267,9 +179,9 @@
 	function wpsg_removeFooter(foot_id)
 	{
-
+	
 		if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese FuÃzeile lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
 		
 		jQuery('#foottext_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
+	
 		jQuery.ajax( {
 			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverynote&do=removeFoottext&noheader=1',
@@ -281,12 +193,11 @@
 			}
 		} );
-
+	
 		return false;
 		
 	} // function wpsg_removeFooter()
-
+			
 	jQuery(document).ready(function() {
-
-		jQuery('#wpsg_tab').wpsg_tab( {
+		jQuery('#wpsg_tab').wpsg_tab( { 
 			'cookiename': 'wpsg_mod_deliverynote_tab',
 			'tab2': function() {
@@ -294,8 +205,5 @@
 			}
 		} );
-
-		jQuery(".wpsg_deliverynote_preview").click(function(){ wpsg_deliverynote_preview(); });
-
 	} );
 
-	/* ]]> */</script>
+/* ]]> */</script>
Index: /views/mods/mod_deliverytime/basket_row.phtml
===================================================================
--- /views/mods/mod_deliverytime/basket_row.phtml	(revision 8528)
+++ /views/mods/mod_deliverytime/basket_row.phtml	(revision 5261)
@@ -6,17 +6,8 @@
 
 ?>
-<div class="product_info">
-	<div class="title">
-		<span class="fa fa-truck"></span>
-		<?php echo __("Lieferzeit", "wpsg"); ?>:
-		<strong><?php echo __($this->view['wpsg_mod_deliverytime']['deliverytime'], 'wpsg'); ?></strong>
-	</div>
-</div>
-<?php /* Hinweistext fÃŒr VerzÃ¶gerung in der Lieferzeit */ ?>
-<div class="product_info">
-	<div class="fulll">
-		<?php echo __($this->view['wpsg_mod_deliverytime']['delaytime'], 'wpsg'); ?>
-
-	</div>
-	<br />
-</div>
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">	
+	<td colspan="1"><?php echo __('Lieferzeit', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'3':'2'); ?>" class="wpsg_cell_deliverytime_value" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
+		<?php echo $this->view['wpsg_mod_deliverytime']['deliverytime']; ?>
+	</td>
+</tr>
Index: /views/mods/mod_deliverytime/mail_row.phtml
===================================================================
--- /views/mods/mod_deliverytime/mail_row.phtml	(revision 8528)
+++ /views/mods/mod_deliverytime/mail_row.phtml	(revision 5261)
@@ -6,7 +6,2 @@
 
 ?><?php echo wpsg_pad_right(' ', 5); ?><?php echo __('Lieferzeit', 'wpsg'); ?>: <?php echo $this->view['wpsg_mod_deliverytime']['deliverytime']; ?> 
-<?php		if ($this->view['wpsg_mod_deliverytime']['delaytime'] != '') {
-			echo __('<br />', 'wpsg');
-			echo __($this->view['wpsg_mod_deliverytime']['delaytime'], 'wpsg');
-		}
-?>
Index: /views/mods/mod_deliverytime/mail_row_html.phtml
===================================================================
--- /views/mods/mod_deliverytime/mail_row_html.phtml	(revision 8528)
+++ /views/mods/mod_deliverytime/mail_row_html.phtml	(revision 5261)
@@ -13,10 +13,4 @@
 	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
 		<?php echo $this->view['wpsg_mod_deliverytime']['deliverytime']; ?>
-		<?php
-		if ($this->view['wpsg_mod_deliverytime']['delaytime'] != '') {
-			echo __('<br />', 'wpsg');
-			echo __($this->view['wpsg_mod_deliverytime']['delaytime'], 'wpsg');
-		}
-		?>
 	</td>
 </tr>
Index: /views/mods/mod_deliverytime/overview_row.phtml
===================================================================
--- /views/mods/mod_deliverytime/overview_row.phtml	(revision 8528)
+++ /views/mods/mod_deliverytime/overview_row.phtml	(revision 5261)
@@ -6,18 +6,8 @@
 
 ?>
-<div class="product_info">
-	<div 
-	<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-		<span class="fa fa-truck"></span>
-		<?php echo __("Lieferzeit", "wpsg"); ?>:
-		<strong><?php echo __($this->view['wpsg_mod_deliverytime']['deliverytime'], 'wpsg'); ?></strong>
-	</div>
-	
-</div>
-<?php /* Hinweistext fÃŒr VerzÃ¶gerung in der Lieferzeit */ ?>
-<div class="product_info">
-	<div class="fulll">
-		<?php echo __($this->view['wpsg_mod_deliverytime']['delaytime'], 'wpsg'); ?>
-
-	</div>
-</div>
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">
+	<td><?php echo __('Lieferzeit', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'2':'1'); ?>" class="wpsg_cell_deliverytime_value">
+		<?php echo $this->view['wpsg_mod_deliverytime']['deliverytime']; ?>
+	</td>
+</tr>
Index: ews/mods/mod_deliverytime/product_bottom.phtml
===================================================================
--- /views/mods/mod_deliverytime/product_bottom.phtml	(revision 8528)
+++ 	(revision )
@@ -1,35 +1,0 @@
-<?php
-
-    declare(strict_types=1);
-    
-    /**
-     * @author: Daniel Schmitzer (daschmi@daschmi.de)
-     * @date: 08.06.22
-     * @time: 13:43
-     */
-  
-	$available_date = $this->view['wpsg_mod_deliverytime']['available_date'];
-	$t_date = strtotime($available_date);
-		
-	$nowplusoneday = strtotime('+1 days');	
-	$days_between = ceil(($t_date - mktime(0, 0, 0)) / (24 * 60 * 60));
-	
-?>
-
-<?php if ($days_between <= 1) { ?>
-
-	<div class="wpsg_mod_deliverytime wpsg_mod_deliverytime_product_bottom">
-		<span class="fa fa-calendar-minus-o"></span>
-		<span class="label label_deliverytime_product">VerfÃŒgbarkeit: </span>
-		<span class="label_deliverytime"><?php echo __('sofort VerfÃŒgbar', 'wpsg') ;?></span>
-	</div>
-	
-<?php } else { ?>
-
-	<div class="wpsg_mod_deliverytime wpsg_mod_deliverytime_product_bottom">
-		<span class="fa fa-calendar-minus-o"></span>
-		<span class="label label_deliverytime_product">VerfÃŒgbarkeit: </span>
-		<span class="label_deliverytime"><?php echo wpsg_translate(__('Lieferbar in #1# Tagen', 'wpsg'), $days_between); ?></span>
-	</div>
-
-<?php } ?>
Index: ews/mods/mod_deliverytime/produkt_addedit_allgemein.phtml
===================================================================
--- /views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,127 +1,0 @@
-<?php
-
-	/**
-	 * Integration des Moduls "Lieferzeit" in die Produktverwaltung
-	 */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Lieferzeit', 'wpsg')); ?>
-
-	<?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[wpsg_mod_deliverytime_source]', __('Lieferzeit anzeigen von', 'wpsg'), array(0 => 'Moduleinstellungen', 1 => 'Produkt'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_source'], array('noIndex' => true, 'help' => 'wpsg_mod_deliverytime_source')); ?>
-
-	<div class="wpsg_mod_deliverytime_show">
-	<?php if ($this->get_option('wpsg_mod_deliverytime_mode') == wpsg_mod_deliverytime::MODE_SELECT) { ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[wpsg_mod_deliverytime_deliverytime]', __('Lieferzeit', 'wpsg'), $this->view['wpsg_mod_deliverytime']['arSelection'], $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_deliverytime'], array('noIndex' => true, 'help' => 'wpsg_mod_deliverytime_select')); ?>
-	<?php } else if ($this->get_option('wpsg_mod_deliverytime_mode') == wpsg_mod_deliverytime::MODE_DAYS) { ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_deliverytime]', __('Lieferzeit', 'wpsg'), wpsg_getStr($this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_deliverytime']), array('unit' => __('Tage', 'wpsg'), 'help' => 'wpsg_mod_deliverytime_input')); ?>
-	<?php } ?>
-	</div>
-
-	<?php if (isset($this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storeproduct'])) {?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[wpsg_mod_deliverytime_storeproduct]', __('Als Offlineprodukt anzeigen', 'wpsg'), array(0 => 'Moduleinstellungen', 1 => 'Offlineprodukt', 2 => 'Onlineprodukt'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storeproduct'], array('noIndex' => true, 'help' => 'wpsg_mod_deliverytime_store')); ?>
-	
-		<div class="wpsg_mod_deliverytime_store wpsg_mod_deliverytime_store_1">
-		    <?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_storetext]', __('Hinweistext', 'wpsg'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storetext'], array('help' => 'wpsg_mod_deliverytime_storetext')); ?>
-		    <?php ?>
-		    <?php $arPageWithoutCreate = $this->view['pages']; unset($arPageWithoutCreate['-1']); ?>
-		    <?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[wpsg_mod_deliverytime_storelink]', __('Seite mit Adressdaten', 'wpsg'), wpsg_array_merge(array(
-		        '0' => __('Keine Verlinkung auf eine Seite anzeigen', 'wpsg')
-		    ), $arPageWithoutCreate), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_storelink'], array('help' => 'wpsg_page_mod_deliverytime_storelink')); ?>
-		</div>
-			
-		<br />
-	
-	<?php } ?>
-
-	<?php /* VerzÃ¶gerung */ ?>
-	<?php if ($this->hasMod('wpsg_mod_deliverytime') && ($this->get_option('wpsg_mod_deliverytime_delay') == '1')) { ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[wpsg_mod_deliverytime_delay]', __('Hinweistext bei VerzÃ¶gerungen anzeigen', 'wpsg'), array(0 => 'Moduleinstellungen', 1 => 'Anzeigen', 2 => 'Nicht anzeigen'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delay'], array('noIndex' => true, 'help' => 'wpsg_mod_deliverytime_delay')); ?>
-		<div class="wpsg_mod_deliverytime_delay_activ" style="display:none;">
-			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_delaytext]', __('Grund fÃŒr verzÃ¶gerte Lieferung', 'wpsg'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delaytext'], array('help' => 'wpsg_mod_deliverytime_delayText')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_delaytime]', __('Zeitangabe der VerzÃ¶gerung', 'wpsg'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_delaytime'], array('help' => 'wpsg_mod_deliverytime_delayTime')); ?>
-		</div>
-	<?php } ?>
-	
-	<br />
-	
-	<?php /* Urlaubsmodus aktiv */ ?>
-	<?php if ($this->hasMod('wpsg_mod_deliverytime') && ($this->get_option('wpsg_mod_deliverytime_holiday') == '1')) { ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[wpsg_mod_deliverytime_holiday]', __('Urlaubszeit', 'wpsg'), array(0 => 'Moduleinstellungen', 1 => 'Produktspezifische Einstellung'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holiday'], array('noIndex' => true, 'help' => 'wpsg_mod_deliverytime_holiday')); ?>
-		<div class="wpsg_mod_deliverytime_holiday_activ" style="display:none;">
-			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_holidayStart]', __('Urlaubsbeginn', 'wpsg'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidayStart'], array('datepicker' => true, 'help' => 'wpsg_mod_deliverytime_holidayStart')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_holidayEnd]', __('Urlaubsende', 'wpsg'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidayEnd'], array('datepicker' => true, 'help' => 'wpsg_mod_deliverytime_holidayEnd')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[wpsg_mod_deliverytime_holidaytext]', __('UrlaubsgruÃ', 'wpsg'), $this->view['wpsg_mod_deliverytime']['wpsg_mod_deliverytime_holidaytext'], array('help' => 'wpsg_mod_deliverytime_holidayText')); ?>
-		</div>
-	<?php } ?>
-
-    <!-- Versanddatum -->
-    <?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[set_available]', __('VerfÃŒgbarkeit definieren', 'wpsg'), [
-        '0' => __('Nein', 'wpsg'),
-        '1' => __('Ja', 'wpsg')
-    ], $this->view['wpsg_mod_deliverytime']['set_available']??'0'); ?>    
-
-    <div class="wpsg_mod_deliverytime_set_available wpsg_mod_deliverytime_set_available_1" style="display:none;">
-        
-        <?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[available_date]', __('VerfÃŒgbar ab', 'wpsg'), $this->view['wpsg_mod_deliverytime']['available_date']??date('Y-m-d'), ['type' => 'date']); ?>
-        
-    </div>
-
-    <script>
-        
-        let el_set_available = document.getElementById('wpsg_mod_deliverytimeset_available');
-        
-        el_set_available.addEventListener('change', (event) => {
-			
-			for (let el of document.querySelectorAll('.wpsg_mod_deliverytime_set_available')) el.style.display = 'none';
-			for (let el of document.querySelectorAll('.wpsg_mod_deliverytime_set_available_' + event.target.value)) el.style.display = 'block';			
-				
-        });
-        
-		el_set_available.dispatchEvent(new Event('change'));
-		
-    </script>
-
-	<br />
-
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_deliverytime"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Lieferzeit', 'wpsg'); ?></a>
-	
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
-
-        jQuery('#wpsg_mod_deliverytimewpsg_mod_deliverytime_storeproduct').bind('change', function() {
-			//alert('TEST:' + jQuery(this).val());
-            jQuery('.wpsg_mod_deliverytime_store').hide();
-            //if (jQuery(this).prop('checked')) jQuery('.wpsg_mod_deliverytime_store_1').show();
-            if (jQuery(this).val() == 1) jQuery('.wpsg_mod_deliverytime_store_1').show();
-
-        } ).change();
-
-		jQuery('#wpsg_mod_deliverytimewpsg_mod_deliverytime_delay').bind('change', function() {
-
-			//if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_deliverytime_delay_activ').show();
-			if (jQuery(this).val() == 1) jQuery('.wpsg_mod_deliverytime_delay_activ').show();
-			else jQuery('.wpsg_mod_deliverytime_delay_activ').hide();
-			
-		} ).change();
-
-		jQuery('#wpsg_mod_deliverytimewpsg_mod_deliverytime_holiday').bind('change', function() {
-
-			if (jQuery(this).val() == 1) jQuery('.wpsg_mod_deliverytime_holiday_activ').show();
-			else jQuery('.wpsg_mod_deliverytime_holiday_activ').hide();
-			
-		} ).change();
-
-		jQuery('#wpsg_mod_deliverytimewpsg_mod_deliverytime_source').bind('change', function() {
-
-			if (jQuery(this).val() == 1) jQuery('.wpsg_mod_deliverytime_show').show();
-			else jQuery('.wpsg_mod_deliverytime_show').hide();
-			
-		} ).change();
-		
-	} );
-
-/* ]]> */</script>
Index: /views/mods/mod_deliverytime/produkt_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_deliverytime/produkt_edit_allgemein.phtml	(revision 5261)
+++ /views/mods/mod_deliverytime/produkt_edit_allgemein.phtml	(revision 5261)
@@ -0,0 +1,12 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Eingabe der Lieferzeit im Produkt 
+	 */
+
+?> 
+<?php if ($this->get_option('wpsg_mod_deliverytime_mode') == wpsg_mod_deliverytime::MODE_SELECT) { ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_deliverytime[deliverytime]', __('Lieferzeit', 'wpsg'), $this->view['wpsg_mod_deliverytime']['arSelection'], $this->view['wpsg_mod_deliverytime']['deliverytime'], array('noIndex' => true)); ?>
+<?php } else if ($this->get_option('wpsg_mod_deliverytime_mode') == wpsg_mod_deliverytime::MODE_DAYS) { ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime[deliverytime]', __('Lieferzeit', 'wpsg'), $this->view['wpsg_mod_deliverytime']['deliverytime'], array('unit' => __('Tage', 'wpsg'))); ?>
+<?php } ?>
Index: /views/mods/mod_deliverytime/settings_edit.phtml
===================================================================
--- /views/mods/mod_deliverytime/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_deliverytime/settings_edit.phtml	(revision 5261)
@@ -18,35 +18,5 @@
 </div>
 
-<br /><br /> 
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverytime_store', __('Offline-Produkte anzeigen (nicht im Onlineshop bestellbar)', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_store'), array('help' => 'wpsg_mod_deliverytime_store')); ?>
-
-<div class="wpsg_mod_deliverytime_store wpsg_mod_deliverytime_store_1">
-    <?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime_storetext', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_storetext'), array('help' => 'wpsg_mod_deliverytime_storetext')); ?>
-    <?php ?>
-    <?php $arPageWithoutCreate = $this->view['pages']; unset($arPageWithoutCreate['-1']); ?>
-    <?php echo wpsg_drawForm_Select('wpsg_page_mod_deliverytime_storelink', __('Seite mit Adressdaten', 'wpsg'), wpsg_array_merge(array(
-        '0' => __('Keine Verlinkung auf eine Seite anzeigen', 'wpsg')
-    ), $arPageWithoutCreate), $this->get_option('wpsg_page_mod_deliverytime_storelink'), array('help' => 'wpsg_page_mod_deliverytime_storelink')); ?>
-</div>
-
-<br /><br /> 
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverytime_delay', __('Hinweistext bei VerzÃ¶gerungen anzeigen', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_delay'), array('help' => 'wpsg_mod_deliverytime_delay')); ?>
-<div class="wpsg_mod_deliverytime_delay_activ" style="display:none;">
-<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime_delayText', __('Grund fÃŒr verzÃ¶gerte Lieferung', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_delayText'), array('help' => 'wpsg_mod_deliverytime_delayText')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime_delayTime', __('Zeitangabe der VerzÃ¶gerung', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_delayTime'), array('help' => 'wpsg_mod_deliverytime_delayTime')); ?>
-</div>
-
-<br /><br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverytime_holiday', __('Urlaubzeit', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_holiday'), array('help' => 'wpsg_mod_deliverytime_holiday')); ?>
-<div class="wpsg_mod_deliverytime_holiday_activ" style="display:none;">
-<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime_holidayStart', __('Urlaubsbeginn', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_holidayStart'), array('datepicker' => true, 'help' => 'wpsg_mod_deliverytime_holidayStart')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime_holidayEnd', __('Urlaubsende', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_holidayEnd'), array('datepicker' => true, 'help' => 'wpsg_mod_deliverytime_holidayEnd')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_deliverytime_holidaytext', __('UrlaubsgruÃ', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_holidaytext'), array('help' => 'wpsg_mod_deliverytime_holidaytext')); ?>
-</div>
-
-<br /><br />
+<br />
 
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverytime_show_product', __('Im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_show_product'), array('help' => 'wpsg_mod_deliverytime_show_product')); ?>
@@ -55,23 +25,8 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverytime_show_mail', __('In den Mails anzeigen', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_show_mail'), array('help' => 'wpsg_mod_deliverytime_show_mail')); ?>
 
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_deliverytime_productindex', __('Darstellung in ProduktÃŒbersicht (Backend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_deliverytime_productindex'), array('help' => 'wpsg_mod_deliverytime_productindex')); ?>
-
 <script type="text/javascript">/* <![CDATA[ */
 
 	jQuery(document).ready(function() {
 
-		jQuery('#wpsg_mod_deliverytime_mode_select_values').bind('input', function() { 
-
-			val = jQuery('#wpsg_mod_deliverytime_mode_select_values').val();
-			arVal = val.split(',');
-			jQuery('#wpsg_mod_deliverytime_mode_select_default').empty();
-			for (i = 0; i < 3; i++) {
-				jQuery('#wpsg_mod_deliverytime_mode_select_default').append('<option value=' + i + '>' + arVal[i] + '</option>');
-			}
-						
-		} );
-		
 		jQuery('#wpsg_mod_deliverytime_mode').bind('change', function() { 
 
@@ -80,25 +35,4 @@
 			
 		} ).change();
-
-        jQuery('#wpsg_mod_deliverytime_store').bind('change', function() {
-
-            jQuery('.wpsg_mod_deliverytime_store').hide();
-            if (jQuery(this).prop('checked')) jQuery('.wpsg_mod_deliverytime_store_1').show();
-
-        } ).change();
-
-		jQuery('#wpsg_mod_deliverytime_delay').bind('change', function() {
-
-			if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_deliverytime_delay_activ').show();
-			else jQuery('.wpsg_mod_deliverytime_delay_activ').hide();
-			
-		} ).change();
-
-		jQuery('#wpsg_mod_deliverytime_holiday').bind('change', function() {
-
-			if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_deliverytime_holiday_activ').show();
-			else jQuery('.wpsg_mod_deliverytime_holiday_activ').hide();
-			
-		} ).change();
 		
 	} );
Index: /views/mods/mod_discount/customergroup_edit.phtml
===================================================================
--- /views/mods/mod_discount/customergroup_edit.phtml	(revision 8528)
+++ /views/mods/mod_discount/customergroup_edit.phtml	(revision 5261)
@@ -6,6 +6,11 @@
 
 ?>
-<div id="wpsg_customerpasswd" >
-	<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount]', __('Rabatt', 'wpsg'), wpsg_ff($this->view['wpsg_mod_discount']['discount'])); ?>
-
+<div id="wpsg_customerpasswd" class="postbox">
+	<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+	<h3 class="wpsg_handlediv">
+		<span><?php echo __('Kundengruppenrabatt', 'wpsg'); ?></span>
+	</h3>
+	<div class="inside">
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount]', __('Rabatt', 'wpsg'), wpsg_ff($this->view['wpsg_mod_discount']['discount'])); ?>
+	</div>
 </div>
Index: /views/mods/mod_discount/productgroups_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_discount/productgroups_addedit_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_discount/productgroups_addedit_sidebar.phtml	(revision 5261)
@@ -6,14 +6,14 @@
 
 ?>
-<?php /* Rabatt START */ ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktgruppen Rabatt'));  ?>
-
+<div id="postbox_productgrouprabatt" class="postbox">
+	<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+	<h3 class="handle">
+		<span><?php echo __('Produktgruppenrabatt', 'wpsg'); ?></span>
+	</h3>
 	<div class="inside">
 		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount[discount_aktiv]', __('Aktion aktiv', 'wpsg'), $this->view['wpsg_mod_discount']['data'][0]); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_from]', __('Start (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc(wpsg_getStr($this->view['wpsg_mod_discount']['data'][1]))); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_to]', __('Ende (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc(wpsg_getStr($this->view['wpsg_mod_discount']['data'][2]))); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_value]', __('Rabatt', 'wpsg'), wpsg_ff(wpsg_getStr($this->view['wpsg_mod_discount']['data'][3]))); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_from]', __('Start (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc($this->view['wpsg_mod_discount']['data'][1])); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_to]', __('Ende (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc($this->view['wpsg_mod_discount']['data'][2])); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_value]', __('Rabatt', 'wpsg'), wpsg_ff($this->view['wpsg_mod_discount']['data'][3])); ?>
 	</div>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php /* Rabatt ENDE */ ?>
+</div>						
Index: ews/mods/mod_discount/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_discount/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Rabattkonfiguration innerhalb der Produktverwaltung
-	 */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktrabatt', 'wpsg')); ?>
-
-	<div class="inside">	
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount[discount_aktiv]', __('Aktion aktiv', 'wpsg'), $this->view['wpsg_mod_discount']['data'][0]); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_from]', __('Start (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc(wpsg_getStr($this->view['wpsg_mod_discount']['data'][1]))); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_to]', __('Ende (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc(wpsg_getStr($this->view['wpsg_mod_discount']['data'][2]))); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_value]', __('Rabatt', 'wpsg'), wpsg_ff(wpsg_getStr($this->view['wpsg_mod_discount']['data'][3]))); ?>
-				
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_discount"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Rabatte', 'wpsg'); ?></a>
-	
-	</div>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: /views/mods/mod_discount/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_discount/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_discount/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Rabattkonfiguration innerhalb der Produktverwaltung
+	 */
+
+?>
+<div id="wpsg_discount" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></span>
+		<span><?php echo __('Produktrabatt', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">	
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount[discount_aktiv]', __('Aktion aktiv', 'wpsg'), $this->view['wpsg_mod_discount']['data'][0]); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_from]', __('Start (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc($this->view['wpsg_mod_discount']['data'][1])); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_to]', __('Ende (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc($this->view['wpsg_mod_discount']['data'][2])); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_value]', __('Rabatt', 'wpsg'), wpsg_ff($this->view['wpsg_mod_discount']['data'][3])); ?>
+	</div>
+</div>
Index: /views/mods/mod_discount/settings_edit.phtml
===================================================================
--- /views/mods/mod_discount/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_discount/settings_edit.phtml	(revision 5261)
@@ -7,92 +7,121 @@
 ?>
 
-<div>
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Produktrabatt', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Warenkorbrabatt', 'wpsg'); ?></a></li>
-		<li role="presentation"><a href="#tab3" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Optionen', 'wpsg'); ?></a></li>
-    </ul>
-    <div class="tab-content">
-        <div role="tabpanel" class="tab-pane active" id="tab1">
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_productdiscount', __('Rabatt auf Produkte', 'wpsg'), $this->get_option('wpsg_mod_discount_productdiscount'), array('label' => __('Aktivierte Rabatte', 'wpsg'), 'help' =>'wpsg_mod_discount_productdiscount')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_universal', __('Rabatt auf alle Produkte', 'wpsg'), $this->get_option('wpsg_mod_discount_universal'), array('help' => 'wpsg_mod_discount_universal')); ?>
-
-            <div class="wpsg_form_field" id="wpsg_mod_discount_universal_layer">
-                <?php echo wpsg_drawForm_TextStart(); ?>
-                
-                    <?php echo wpsg_drawForm_Input('wpsg_mod_discount_universal_from', __('Von (tt.mm.jjjj)', 'wpsg'), $this->get_option('wpsg_mod_discount_universal_from'), array('datepicker' => true)); ?>
-                    <?php echo wpsg_drawForm_Input('wpsg_mod_discount_universal_to', __('Bis (tt.mm.jjjj)', 'wpsg'), $this->get_option('wpsg_mod_discount_universal_to'), array('datepicker' => true)); ?>
-                    <?php echo wpsg_drawForm_Input('wpsg_mod_discount_universal_value', __('Rabatt', 'wpsg'), $this->get_option('wpsg_mod_discount_universal_value'), array()); ?>
-
-                <?php echo wpsg_drawForm_TextEnd('', array('noP' => true)); ?>
-            </div>
-
-            <?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_productgroupdiscount', __('Rabatt auf Produktgruppen', 'wpsg'), $this->get_option('wpsg_mod_discount_productgroupdiscount'), array('help' => 'wpsg_mod_discount_productgroupdiscount')); ?>
-            <?php } ?>
-
-            <?php if ($this->hasMod('wpsg_mod_customergroup')) { ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_customergroup', __('Rabatt auf Kundengruppen', 'wpsg'), $this->get_option('wpsg_mod_discount_customergroup'), array('help' => 'wpsg_mod_discount_customergroup')); ?>
-            <?php } ?>
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_show', __('Originalpreis im Produkttemplate anzeigen', 'wpsg'), $this->get_option('wpsg_mod_discount_show'), array ('help' => 'wpsg_mod_discount_show')); ?>
-
-            <br />
-            <?php echo wpsg_drawForm_TextStart(); ?>
-            <ul class="wpsg_mod_discount_hirarchieorder">
-                <?php foreach ($this->view['wpsg_mod_discount']['hierarchie'] as $discount_typ) { ?>
-                <li class="<?php echo $discount_typ; ?>">
-                    <input type="hidden" name="wpsg_mod_discount_hierarchie[]" value="<?php echo $discount_typ; ?>" />
-                    <input type="checkbox" value="<?php echo $discount_typ; ?>" <?php echo ((in_array($discount_typ, (array)explode(',', $this->get_option('wpsg_mod_discount_hierarchie'))))?'checked="checked"':''); ?> name="wpsg_mod_discount_hierarchie[]" />
-                    <?php echo $this->callMod('wpsg_mod_discount', 'getNameFromType', array($discount_typ)); ?>
-                </li>
-                <?php } ?>
-            </ul>
-            <p class="info"><?php echo __('Reihenfolge kann mittels Drag&Drop verÃ€ndert werden.', 'wpsg'); ?></p>
-            <a href="#" onclick="return wpsg_mod_discount_restoredefaulthierarchie();"><?php echo __('Standard wiederherstellen', 'wpsg'); ?></a>
-
-            <?php echo wpsg_drawForm_TextEnd(__('Rabattreihenfolge (fÃŒr Berechnung)', 'wpsg'), array('noP' => true)); ?>
-        
-        </div>
-        <div role="tabpanel" class="tab-pane" id="tab2">
-
-            <?php echo wpsg_drawForm_TextStart(); ?>
-                    <div class="wpsg_mod_discount_seriescol"><strong><?php echo __('Bestellwert', 'wpsg'); ?></strong></div>
-                    <div class="wpsg_mod_discount_seriescol"><strong><?php echo __('Rabatt', 'wpsg'); ?></strong></div>
-                    <div class="wpsg_mod_discount_seriescol"><strong><?php echo __('LÃ¶schen', 'wpsg'); ?></strong></div>
-                    <div class="wpsg_clear"></div>
-
-                    <div class="wpsg_mod_discount_seriescol"><?php echo __('ab', 'wpsg').' '.wpsg_ff(0, $this->get_option('wpsg_currency')); ?></div>
-                    <div class="wpsg_mod_discount_seriescol wpsg_mod_discount_seriescol_sub"><input type="text" name="value[0][rabatt]" value="<?php echo wpsg_ff(@$this->view['data'][0]['rabatt']); ?>" /></div>
-                    <div class="wpsg_clear"></div>
-
-                    <?php foreach ($this->view['data'] as $k => $v) { if ($k > 0) { ?>
-                    <div class="wpsg_mod_discount_seriescol"><?php echo __('ab', 'wpsg').' '.wpsg_ff($v['value'], $this->get_option('wpsg_currency')); ?></div>
-                    <div class="wpsg_mod_discount_seriescol wpsg_mod_discount_seriescol_sub"><input type="text" name="value[<?php echo $k; ?>][rabatt]" value="<?php echo wpsg_ff($v['rabatt']); ?>" /></div>
-                    <div class="wpsg_mod_discount_seriescol wpsg_mod_discount_seriescol_sub"><input type="checkbox" name="value[<?php echo $k; ?>][del]" value="1" style="width:20px; float:left; margin-left:20px;"/></div>
-                    <input type="hidden" name="value[<?php echo $k; ?>][value]" value="<?php echo $v['value']; ?>" /><div class="wpsg_clear"></div>
-                    <?php } } ?>
-
-                    <div class="wpsg_mod_discount_seriescol"><?php echo __('ab', 'wpsg'); ?> <input type="text" name="neu[value]" value="" /> <?php echo $this->get_option('wpsg_currency'); ?></div>
-                    <div class="wpsg_mod_discount_seriescol"><input type="text" name="neu[rabatt]" value="" /></div>
-					<a id="wkrimage" style="margin-left:5px;" class="wpsg-glyphicon glyphicon glyphicon-plus" alt="HinzufÃŒgen"></a>
-                    <div class="wpsg_clear"></div>
-            <?php echo wpsg_drawForm_TextEnd(__('Staffelung', 'wpsg'), array('noP' => true)); ?>
-
-
-        </div>
-		<div role="tabpanel" class="tab-pane" id="tab3">
-			 
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_stopRabatt', __('Nur ersten Rabatt berÃŒcksichtigen', 'wpsg'), $this->get_option('wpsg_mod_discount_stopRabatt')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_showBasket', __('NÃ€chste Staffelung im Warenkorb anpreisen', 'wpsg'), $this->get_option('wpsg_mod_discount_showBasket'), array('help' => 'wpsg_mod_discount_showBasket')); ?>			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_voucher', __('Gutscheine bei aktivem Rabatt nicht zulassen', 'wpsg'), $this->get_option('wpsg_mod_discount_voucher'), array('help' => 'wpsg_mod_discount_voucher')); ?>
+<br />
+<div class="wpsg_mod_discount_settings">
+	<div class="wpsg_admin_box" id="wpsg_tab">	
+		<div class="head">
+			<div class="title">			
+				<div class="tab" id="tab1"><?php echo __('Produktrabatt', 'wpsg'); ?></div>
+				<div class="tab" id="tab2"><?php echo __('Warenkorbrabatt', 'wpsg'); ?></div>  
+				<div class="wpsg_clear"></div>
+			</div>
+		</div>
+		<div class="content" id="wpsg_mwst_list">
+					
+			<div id="tabcontent1" class="tabcontent">
 			
-			<?php if ($this->hasMod('wpsg_mod_productindex') == '1') { ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_productindex', __('Rabattierte Preise in Produktindex anzeigen', 'wpsg'), $this->get_option('wpsg_mod_discount_productindex')); ?>
-			<?php } ?>
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_productdiscount', __('Rabatt auf Produkte', 'wpsg'), $this->get_option('wpsg_mod_discount_productdiscount'), array('help' =>'wpsg_mod_discount_productdiscount')); ?>
+									
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_universal', __('Rabatt auf alle Produkte', 'wpsg'), $this->get_option('wpsg_mod_discount_universal'), array('help' => 'wpsg_mod_discount_universal')); ?>
+			
+				<div class="wpsg_form_field" id="wpsg_mod_discount_universal_layer">
+					<div class="wpsg_form_left">&nbsp;</div>
+					<div class="wpsg_form_right">
+						<div class="wpsg_mod_discount_generalcol">
+							<strong><?php echo __('Von (tt.mm.jjjj)', 'wpsg'); ?></strong><br />
+							<input name="wpsg_mod_discount_universal_from" type="text" value="<?php echo $this->get_option('wpsg_mod_discount_universal_from'); ?>" id="wpsg_mod_discount_universal_from" /> 	
+						</div>
+						<div class="wpsg_mod_discount_generalcol">
+							<strong><?php echo __('Bis (tt.mm.jjjj)', 'wpsg'); ?></strong><br />
+							<input name="wpsg_mod_discount_universal_to" type="text" value="<?php echo $this->get_option('wpsg_mod_discount_universal_to'); ?>" id="wpsg_mod_discount_universal_to" /> 	
+						</div>
+						<div class="wpsg_mod_discount_generalcol">
+							<strong><?php echo __('Rabatt', 'wpsg'); ?></strong><br />
+							<input name="wpsg_mod_discount_universal_value" type="text" value="<?php echo $this->get_option('wpsg_mod_discount_universal_value'); ?>" id="wpsg_mod_discount_universal_value" />
+						</div>
+					</div>
+					<div class="wpsg_clear"></div><br />
+				</div>
+					 
+				<?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
+					<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_productgroupdiscount', __('Rabatt auf Produktgruppen', 'wpsg'), $this->get_option('wpsg_mod_discount_productgroupdiscount'), array('help' => 'wpsg_mod_discount_productgroupdiscount')); ?>
+				<?php } ?>
+				 
+				<?php if ($this->hasMod('wpsg_mod_customergroup')) { ?>
+					<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_customergroup', __('Rabatt auf Kundengruppen', 'wpsg'), $this->get_option('wpsg_mod_discount_customergroup'), array('help' => 'wpsg_mod_discount_customergroup')); ?>
+				<?php } ?>
+				
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_show', __('Originalpreis im Produkttemplate anzeigen', 'wpsg'), $this->get_option('wpsg_mod_discount_show'), array ('help' => 'wpsg_mod_discount_show')); ?>
+									
+				<div class="wpsg_form_field" id="wpsg_mod_discount_hierarchie">
+					<div class="wpsg_form_left">
+						<?php echo __('Rabattreihenfolge (fÃŒr Berechnung):', 'wpsg')?><br />
+						<a href="#" onclick="return wpsg_mod_discount_restoredefaulthierarchie();"><?php echo __('Standard wiederherstellen', 'wpsg'); ?></a>					
+					</div>
+					<div class="wpsg_form_right">
+					
+						<ul>
+							<?php foreach ($this->view['wpsg_mod_discount']['hierarchie'] as $discount_typ) { ?>
+							<li class="<?php echo $discount_typ; ?>">
+								<input type="hidden" name="wpsg_mod_discount_hierarchie[]" value="<?php echo $discount_typ; ?>" />
+		 						<input type="checkbox" value="<?php echo $discount_typ; ?>" <?php echo ((in_array($discount_typ, (array)explode(',', $this->get_option('wpsg_mod_discount_hierarchie'))))?'checked="checked"':''); ?> name="wpsg_mod_discount_hierarchie[]" />&nbsp;
+		 						<?php echo $this->callMod('wpsg_mod_discount', 'getNameFromType', array($discount_typ)); ?>
+							</li>
+							<?php } ?> 						
+						</ul>
+						
+						<p class="wpsg_hinweis"><?php echo __('Reihenfolge kann mittels Drag&Drop verÃ€ndert werden.', 'wpsg'); ?></p>
+					
+						<input type="hidden" name="wpsg_mod_discount_stopRabatt" value="0" />
+						<label>
+							<input type="checkbox" name="wpsg_mod_discount_stopRabatt" value="1" <?php echo (($this->get_option('wpsg_mod_discount_stopRabatt') == '1')?'checked="checked"':''); ?> />
+							<?php echo __('Nur ersten Rabatt berÃŒcksichtigen', 'wpsg'); ?>							
+						</label>
+					
+					</div>
+					<div class="wpsg_clear"></div>
+				</div>
+									
+			</div> 
+			
+			<div id="tabcontent2" class="tabcontent">
+			
+				<div class="wpsg_form_field">
+					<div class="wpsg_form_left"><?php echo __('Staffelung:', 'wpsg'); ?></div>
+					<div class="wpsg_form_right">
+						
+						<div class="wpsg_mod_discount_seriescol"><strong><?php echo __('Bestellwert', 'wpsg'); ?></strong></div>
+						<div class="wpsg_mod_discount_seriescol"><strong><?php echo __('Rabatt', 'wpsg'); ?></strong></div>
+						<div class="wpsg_clear"></div>
+						
+						<div class="wpsg_mod_discount_seriescol"><?php echo __('ab', 'wpsg').' '.wpsg_ff(0, $this->get_option('wpsg_currency')); ?></div>
+						<div class="wpsg_mod_discount_seriescol wpsg_mod_discount_seriescol_sub"><input type="text" name="value[0][rabatt]" value="<?php echo wpsg_ff($this->view['data'][0]['rabatt']); ?>" /></div>
+						<div class="wpsg_clear"></div>
+						
+						<?php foreach ($this->view['data'] as $k => $v) { if ($k > 0) { ?>
+						<div class="wpsg_mod_discount_seriescol"><?php echo __('ab', 'wpsg').' '.wpsg_ff($v['value'], $this->get_option('wpsg_currency')); ?></div>
+						<div class="wpsg_mod_discount_seriescol wpsg_mod_discount_seriescol_sub"><input type="text" name="value[<?php echo $k; ?>][rabatt]" value="<?php echo wpsg_ff($v['rabatt']); ?>" /></div>
+						<div class="wpsg_mod_discount_seriescol wpsg_mod_discount_seriescol_sub"><label><input type="checkbox" name="value[<?php echo $k; ?>][del]" value="1" /> <?php echo __('lÃ¶schen', 'wpsg'); ?></label></div>
+						<input type="hidden" name="value[<?php echo $k; ?>][value]" value="<?php echo $v['value']; ?>" /><div class="wpsg_clear"></div>
+						<?php } } ?>
+						
+						<div class="wpsg_mod_discount_seriescol"><?php echo __('ab', 'wpsg'); ?> <input type="text" name="neu[value]" value="" /> <?php echo $this->get_option('wpsg_currency'); ?></div>
+						<div class="wpsg_mod_discount_seriescol"><input type="text" name="neu[rabatt]" value="" /></div>
+						<div class="wpsg_clear"></div>
+						
+					</div>
+				</div>
+				<div class="wpsg_clear"></div>
+				
+				<br />
+				
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount_showBasket', __('NÃ€chste Staffelung im Warenkorb anpreisen', 'wpsg'), $this->get_option('wpsg_mod_discount_showBasket')); ?>
+				
+			</div>  
 			
 		</div>
-    </div>
+		 
+	</div>
+
 </div>
 
@@ -101,5 +130,12 @@
 	jQuery(document).ready(function() {
 
-		jQuery("ul.wpsg_mod_discount_hirarchieorder").sortable().disableSelection();
+		jQuery("#wpsg_mod_discount_hierarchie ul").sortable().disableSelection();
+		
+		jQuery('#wpsg_tab').wpsg_tab( { 
+			'cookiename': 'wpsg_mod_discount_tab',
+			'tab1': function() {
+				jQuery('.tablink').show();
+			}
+		} );
 
 		jQuery('#wpsg_mod_discount_universal').bind('change', function() {
@@ -107,8 +143,4 @@
 		} );
 
-		jQuery('#wkrimage').bind('click', function() {
-			jQuery('#submit').trigger('click');
-		} );
-		
 		wpsg_switchUniversalDiscount();
 		
Index: /views/mods/mod_downloadplus/cronmail_html.phtml
===================================================================
--- /views/mods/mod_downloadplus/cronmail_html.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/cronmail_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Template fÃŒr die Mail, die bei erfolgreicher Individualisierung an den Admin gesendet wird (HTML)
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?>
Index: /views/mods/mod_downloadplus/filelist.phtml
===================================================================
--- /views/mods/mod_downloadplus/filelist.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/filelist.phtml	(revision 5261)
@@ -6,24 +6,15 @@
 
 ?>
-
 <?php if (!wpsg_isSizedArray($this->view['files'])) { ?>
-
-    <p><?php echo __('Bisher keine PDFs hochgeladen.', 'wpsg'); ?></p>
-
+<p><?php echo __('Bisher keine PDFs hochgeladen.', 'wpsg'); ?></p>
 <?php } else { ?>
-
 	<ul>
-
-        <?php foreach ($this->view['files'] as $v) { ?>
-	    <li>
-
-            <a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&noheader=1&cmd=download_file&file=<?php echo rawurlencode($v); ?>&edit_id=<?php echo $_REQUEST['edit_id']; ?>" title="<?php echo wpsg_hspc($v); ?>"><?php echo wpsg_hspc(substr($v, 0, 50)); ?></a>
-		    (<?php echo wpsg_formatSize($this->callMod('wpsg_mod_downloadplus', 'getPDFPath', array($_REQUEST['edit_id'])).'/'.$v); ?>)
-		    <div class="wpsg_glyphicon_right glyphicon glyphicon-trash" title="<?php echo __('PDF lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_pdfdownload_removePDF('<?php echo rawurlencode($v); ?>');"></div>
-
-	    </li>
-	    <?php } ?>
-
+	<?php foreach ($this->view['files'] as $v) { ?>
+	<li>
+		<a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&noheader=1&cmd=download_file&file=<?php echo rawurlencode($v); ?>&edit_id=<?php echo $_REQUEST['edit_id']; ?>" title="<?php echo wpsg_hspc($v); ?>"><?php echo wpsg_hspc(substr($v, 0, 25)); ?></a>
+		(<?php echo wpsg_formatSize($this->callMod('wpsg_mod_downloadplus', 'getPDFPath', array($_REQUEST['edit_id'])).'/'.$v); ?>)
+		<div class="wpsg_mod_downloadplus_admin_delete" title="<?php echo __('PDF lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_pdfdownload_removePDF('<?php echo rawurlencode($v); ?>');"></div>
+	</li>  
+	<?php } ?>
 	</ul>
-
 <?php } ?>
Index: /views/mods/mod_downloadplus/order_view_sidebar.phtml
===================================================================
--- /views/mods/mod_downloadplus/order_view_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/order_view_sidebar.phtml	(revision 5261)
@@ -7,5 +7,6 @@
 
 ?>
-<script>
+<script type="text/javascript">
+/* <![CDATA[ */
  
 	function wpsg_mod_downloadplus_schedule(product_key, file, product_index)
@@ -25,5 +26,6 @@
 	} // function wpsg_mod_downloadplus_schedule(file)
 
-	function wpsg_mod_downloadplus_reindiv() {
+	function wpsg_mod_downloadplus_reindiv()
+	{
 
 		jQuery('#wpsg_mod_downloadplus_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
@@ -60,5 +62,6 @@
 	} // function wpsg_mod_downloadplus_reset()
 	
-	function wpsg_mod_downloadplus_send() {
+	function wpsg_mod_downloadplus_send()
+	{
 
 		jQuery('#wpsg_mod_downloadplus_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
@@ -93,23 +96,15 @@
 		
 	} // function wpsg_mod_downloadplus_cangelschedule(file)
-
+	
+/* ]]> */
 </script>
 
-<div class="panel panel-default" id="wpsg_pdfdownload">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Downloadplus', 'wpsg'); ?>
-		</h3>
+<div class="postbox" id="wpsg_pdfdownload">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Downloadplus', 'wpsg'); ?></span>
+	</h3> 
+	<div class="inside" id="wpsg_mod_downloadplus_target">
+		<?php echo $this->callMod('wpsg_mod_downloadplus', 'order_view_sidebar_renderList', array($this->view['order_id'])); ?>		 
 	</div>
-	<div class="panel-body">
-
-        <div id="wpsg_mod_downloadplus_target">
-            <?php echo $this->callMod('wpsg_mod_downloadplus', 'order_view_sidebar_renderList', array($this->view['order_id'])); ?>
-        </div>
-
-        <br /><br />
-
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_downloadplus"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Abo-Moduls', 'wpsg'); ?></a>
-
-    </div>
 </div>
Index: /views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml
===================================================================
--- /views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml	(revision 5261)
@@ -26,11 +26,9 @@
 	<tr class="<?php echo (($f[3] !== false && $f[3]['raid'] === true)?'row_raid':''); ?>">
 		<td class="col_file">
-
+		 
 			<?php if ($f[3] !== false && wpsg_isSizedArray($f[3]) && strtotime($f[3]['done']) > 0) { ?>
-
-                <a target="_blank" href="<?php echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_downloadplus&cmd=download_indivfile&edit_id='.$f[3]['o_id'].'&product_key='.$f[0].'&file='.rawurlencode($f[3]['out_file']).'&noheader=1', 'wpsg-dp-download-'.$f[3]['o_id'].'-'.$f[0]); ?>">
-
+			<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_downloadplus&cmd=download_indivfile&edit_id=<?php echo $f[3]['o_id']; ?>&product_id=<?php echo $f[0]; ?>&file=<?php echo rawurlencode($f[3]['out_file']); ?>&noheader=1">
 			<?php } ?>
-
+						
 			<?php if ($f[3] === false) { ?>
 			<?php echo $f[1]; ?>
@@ -42,15 +40,4 @@
 			</a>
 			<?php } ?>
-
-            <?php if (isset($f[3]['clear_file']) && $f[3]['clear_file']) { ?>
-
-                <br />
-
-                <a target="_blank" href="<?php echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_downloadplus&cmd=download_indivfile&edit_id='.$f[3]['o_id'].'&clear=1&product_key='.$f[0].'&file='.rawurlencode($f[3]['out_file']).'&noheader=1', 'wpsg-dp-download-'.$f[3]['o_id'].'-'.$f[0]); ?>">
-                    <?php echo $f[3]['out_file'].' ('.__('Ohne Hintergrund', 'wpsg').')'; ?>
-                </a>
-
-            <?php } ?>
-
 		</td>
 		<td class="col_status">
@@ -67,5 +54,5 @@
 			<?php if ($f[3] === false) { ?>
 			<a href="#" onclick="return wpsg_mod_downloadplus_schedule('<?php echo $f[0]; ?>', '<?php echo rawurldecode($f[1]); ?>', '<?php echo $f[2]; ?>');"><?php echo __('Planen', 'wpsg'); ?></a>
-			<?php } else if (strtotime($f[3]['scheduled']) > 0 && strtotime($f[3]['done']) <= 0) { ?>
+			<?php } else if (strtotime($f[2]['scheduled']) > 0 && strtotime($f[3]['done']) <= 0) { ?>
 			<a href="#" onclick="return wpsg_mod_downloadplus_cangelschedule('<?php echo $f[0]; ?>', '<?php echo rawurldecode($f[1]); ?>');"><?php echo __('Abbrechen', 'wpsg'); ?></a>
 			<?php } ?>
@@ -74,8 +61,6 @@
 	<?php } ?>
 </table>
-
 <br />
-
-<a href="#" class="button" onclick="return wpsg_mod_downloadplus_send();"><?php echo __('Fertige Downloads an Kunden senden', 'wpsg'); ?></a>
-<a href="#" class="button" onclick="return wpsg_mod_downloadplus_reindiv();"><?php echo __('Alle Dokumente neu planen', 'wpsg'); ?></a>
-<a href="#" class="button" onclick="return wpsg_mod_downloadplus_reset();"><?php echo __('ZÃ€hler zurÃŒcksetzen', 'wpsg'); ?></a>
+<input type="button" onclick="return wpsg_mod_downloadplus_send();" value="<?php echo __('Fertige Downloads an Kunden senden', 'wpsg'); ?>" /><br />
+<input type="button" onclick="return wpsg_mod_downloadplus_reindiv();" value="<?php echo __('Alle Dokumente neu planen', 'wpsg'); ?>" />
+<input type="button" onclick="return wpsg_mod_downloadplus_reset();" value="<?php echo __('ZÃ€hler zurÃŒcksetzen', 'wpsg'); ?>" />
Index: /views/mods/mod_downloadplus/pdfdownloadmail.phtml
===================================================================
--- /views/mods/mod_downloadplus/pdfdownloadmail.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/pdfdownloadmail.phtml	(revision 5261)
@@ -4,6 +4,7 @@
 	 * Mail, die die PDF Downloads an den Kunden sendet
 	 */
- 
-?><?php echo wpsg_translate(__('Hallo #2# #3#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>
+
+?>
+<?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?> 
  
 <?php echo __('hiermit erhalten Sie die Downloadlinks fÃŒr Ihre gekauften PDFs:', 'wpsg'); ?> 
Index: /views/mods/mod_downloadplus/pdfdownloadmail_html.phtml
===================================================================
--- /views/mods/mod_downloadplus/pdfdownloadmail_html.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/pdfdownloadmail_html.phtml	(revision 5261)
@@ -4,6 +4,4 @@
 	 * Mail, die die PDF Downloads an den Kunden sendet (HTML)
 	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
 
 ?>
Index: ews/mods/mod_downloadplus/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,200 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration des Uploadformulars im rechten Bereich
-	 * sollte nicht verÃ€ndert werden
-	 */
-
-	$view = $this->view['wpsg_mod_downloadplus']??[];
-
-?>
-<script>
-
-    function wpsg_pdfdownload_removePDF(file) {
-
-    	if (!confirm('<?php echo __('Sind sie sich sicher, dass sie die Datei lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
-
-    	jQuery('#wpsg_mod_downloadplus_files').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-    	
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1&cmd=delete_file&file=' + file,
-			success: function(response) {
-
-				if (response == '1')
-				{
-					jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
-				}
-				else
-				{
-					
-					alert(response);
-					jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
-					
-				}
-				
-			}			
-		} );
-    	
-		return false;
-    	
-	}
-             
-	jQuery(document).ready(function() {	
-
-		<?php if ($this->get_option('wpsg_classicupload') != '1') { ?>
-		new AjaxUpload(
-			"wpsg_mod_downloadplus_upload", {
-				name: "wpsg_mod_downloadplus_file",
-				action: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file",
-				onSubmit: function(file, extension) {
-	
-					jQuery('#wpsg_mod_downloadplus_files').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-					
-				},
-				onComplete: function(file, response) {
-
-					if (response == '1')
-					{
-						jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
-					}
-					else
-					{
-						
-						alert(response);
-						jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
-						
-					}
-				}										
-			}
-		);
-		<?php } ?>			
-				   
-	}); 
-
-</script>
-
-<div id="wpsg_pdfdownload" class="panel panel-default">	
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('DownloadPlus Produkt', 'wpsg'); ?> 
-		</h3>
-	</div>
-	<div class="panel-body">
-
-        <?php echo wpsg_drawForm_Checkbox('mod_downloadplus_set', __('Produkt ist ein Downloadprodukt', 'wpsg'), $view['set']); ?>
-
-        <div id="mod_downloadplus_set_1" style="display:none;">
-
-            <?php if (sizeof($view['arTemplates']) > 0) { ?>
-                <?php echo wpsg_drawForm_Select('mod_downloadplus_template', __('Template', 'wpsg'), ['0' => __('Standard Template', 'wpsg')] + $view['arTemplates'], $view['template']); ?>
-            <?php } else { ?>
-                <?php echo wpsg_drawForm_Text(__('Template', 'wpsg'), __('Keine Templates definiert', 'wpsg')); ?>
-            <?php } ?>
-
-            <?php echo wpsg_drawForm_Select('mod_downloadplus_mode', __('Modus', 'wpsg'), [
-                '0' => __('Individuelle Datei(en)', 'wpsg'),
-                '1' => __('Datei aus Template', 'wpsg')
-            ], $view['mode']); ?>
-
-            <div class="mod_downloadplus_mode mod_downloadplus_mode_0">
-
-                <div id="wpsg_mod_downloadplus_files"><?php echo $view['filesList']; ?></div>
-
-                <?php if ($this->get_option('wpsg_classicupload') == '1') { ?>
-                <input type="file" name="wpsg_mod_downloadplus_file" />
-                <?php } else { ?>
-                <input value="<?php echo __("Upload", "wpsg"); ?>" type="text" style="text-align:center;" size="10" id="wpsg_mod_downloadplus_upload" />
-                <?php } ?>
-
-                <div class="wpsg_clear"></div><br />
-
-                <div class="wpsg_form_field">
-                    <div class="wpsg_form_left" style="width:75px;">
-                        <label for="feinheit"><?php echo __('FTP Pfad', 'wpsg'); ?>:</label>
-                    </div>
-                    <div class="wpsg_form_right">
-                        <p>
-                            <a href="#" onclick="alert('<?php echo addslashes($this->callMod('wpsg_mod_downloadplus', 'getPDFPath', array($this->view['data']['id'], true))); ?>'); return false;"><?php echo __('Anzeigen', 'wpsg'); ?></a>
-                        </p>
-                    </div>
-                    <div class="wpsg_clear"></div>
-                </div>
-
-            </div>
-
-            <script>
-
-                let mod_downloadplus_mode = document.getElementById('mod_downloadplus_mode');
-
-                mod_downloadplus_mode.addEventListener('change', () => {
-
-                    console.log(mod_downloadplus_mode.value);
-
-                    Array.from(document.getElementsByClassName('mod_downloadplus_mode')).forEach((el) => { el.style.display = 'none'; } );
-                    Array.from(document.getElementsByClassName('mod_downloadplus_mode_' + mod_downloadplus_mode.value)).forEach((el) => { el.style.display = 'block'; } );
-
-                });
-
-                mod_downloadplus_mode.dispatchEvent(new Event('change'));
-
-            </script>
-
-            <?php if ($this->hasMod('wpsg_mod_productvariants')) { $arVarInfo = $this->callMod('wpsg_mod_productvariants', 'getVariants', [$this->view['data']['id'], true, true]); ?>
-
-                <?php if (sizeof($arVarInfo) > 0) { ?>
-
-                    <br />
-
-                    <p class="info" style="margin-bottom:1rem;"><?php echo __('Sie verwenden Varianten, sie kÃ¶nnen das Template in jeder Variation verÃ€ndern. Sie sollten es aber nur in einer Variante verÃ€ndern, sonst wird das letzte Template genommen.', 'wpsg'); ?></p>
-
-                    <?php foreach ($arVarInfo as $var) { $arVari = $this->callMod('wpsg_mod_productvariants', 'getVariationOfVariant', [$var['id'], $this->view['data']['id']]); ?>
-
-                        <strong><?php echo wpsg_translate(__('Variante "#1#"', 'wpsg'), $var['name']); ?></strong>
-
-                        <?php foreach ($arVari as $vari) { ?>
-
-                             <?php if (!$vari['deleted'] && $vari['active']) { ?>
-
-                                <?php echo wpsg_drawForm_Select('vari_template['.$var['id'].'_'.$vari['id'].']', wpsg_translate(__('Template fÃŒr Variation "#1#"', 'wpsg'), $vari['name']), [0 => __('UnverÃ€ndert', 'wpsg')] + $view['arTemplates'], $view['vari_template'][$var['id'].'_'.$vari['id']]??'0'); ?>
-
-                            <?php } ?>
-
-                        <?php } ?>
-
-                    <?php } ?>
-
-                <?php } ?>
-
-            <?php } ?>
-
-            <br /><br />
-
-            <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_downloadplus"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des DownloadPlus-Moduls', 'wpsg'); ?></a>
-
-        </div>
-
-        <script>
-
-            let mod_downloadplus_set = document.getElementById('mod_downloadplus_set');
-
-            mod_downloadplus_set.addEventListener('change', () => {
-
-            	if (mod_downloadplus_set.checked) {
-
-            		document.getElementById('mod_downloadplus_set_1').style.display = 'block';
-
-                } else {
-
-            		document.getElementById('mod_downloadplus_set_1').style.display = 'none';
-
-                }
-
-            });
-
-            mod_downloadplus_set.dispatchEvent(new Event('change'));
-
-        </script>
-
-	</div>
-	<div class="clear"></div>
-</div>
Index: /views/mods/mod_downloadplus/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_downloadplus/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_downloadplus/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,105 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des Uploadformulars im rechten Bereich
+	 * sollte nicht verÃ€ndert werden
+	 */
+
+?>
+<script type="text/javascript">
+/* <![CDATA[ */
+
+    function wpsg_pdfdownload_removePDF(file)
+	{
+
+    	if (!confirm('<?php echo __('Sind sie sich sicher, dass sie die Datei lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+
+    	jQuery('#wpsg_mod_downloadplus_files').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1&cmd=delete_file&file=' + file,
+			success: function(response) {
+
+				if (response == '1')
+				{
+					jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+				}
+				else
+				{
+					
+					alert(response);
+					jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+					
+				}
+				
+			}			
+		} );
+    	
+		return false;
+    	
+	} // function wpsg_pdfdownload_removePDF($pdf)
+             
+	jQuery(document).ready(function() {	
+
+		<?php if ($this->get_option('wpsg_classicupload') != '1') { ?>
+		new AjaxUpload(
+			"wpsg_mod_downloadplus_upload", {
+				name: "wpsg_mod_downloadplus_file",
+				action: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file",
+				onSubmit: function(file, extension) {
+	
+					jQuery('#wpsg_mod_downloadplus_files').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+					
+				},
+				onComplete: function(file, response) {
+
+					if (response == '1')
+					{
+						jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+					}
+					else
+					{
+						
+						alert(response);
+						jQuery("#wpsg_mod_downloadplus_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadplus&cmd=pdffiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+						
+					}
+				}										
+			}
+		);
+		<?php } ?>			
+				   
+	}); 
+	
+/* ]]> */
+</script>
+
+<div id="wpsg_pdfdownload" class="postbox">	
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('DownloadPlus Produkt', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<div id="wpsg_mod_downloadplus_files"><?php echo $this->view['filesList']; ?></div>
+		
+		<?php if ($this->get_option('wpsg_classicupload') == '1') { ?>
+		<input type="file" name="wpsg_mod_downloadplus_file" />
+		<?php } else { ?>	
+		<input value="<?php echo __("Upload", "wpsg"); ?>" type="text" style="text-align:center;" size="10" id="wpsg_mod_downloadplus_upload" />
+		<?php } ?>
+		
+		<div class="wpsg_clear"></div><br />
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left" style="width:75px;">
+				<label for="feinheit"><?php echo __('FTP Pfad', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<a href="#" onclick="alert('<?php echo addslashes($this->callMod('wpsg_mod_downloadplus', 'getPDFPath', array($this->view['data']['id'], true))); ?>'); return false;"><?php echo __('Anzeigen', 'wpsg'); ?></a>
+				</p>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>		
+	</div>
+	<div class="clear"></div>
+</div>
Index: /views/mods/mod_downloadplus/settings_edit.phtml
===================================================================
--- /views/mods/mod_downloadplus/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_downloadplus/settings_edit.phtml	(revision 5261)
@@ -6,131 +6,284 @@
 
 ?>
-
-<div>
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" role="tab" data-toggle="tab"><?php echo __('Einstellungen', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab5" role="tab" data-toggle="tab"><?php echo __('Templates', 'wpsg'); ?></a></li>
-        <li role="presentation"></li>
-        <li role="presentation"><a href="#tab3" role="tab" data-toggle="tab"><?php echo __('Erweitert', 'wpsg'); ?></a></li>
-        <li role="presentation" style="float:right;"><a href="#tab4" role="tab" data-toggle="tab"><?php echo __('Info / Hilfe', 'wpsg'); ?></a></li>
-    </ul>
-    <div class="tab-content">
-
-        <div role="tabpanel" class="tab-pane active" id="tab1">
-
-            <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_filename', __('Personalisierter Dateiname', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_filename'), array('help' => 'mod_pdfdownload_einstellungen_filename')); ?>
+<div class="wpsg_admin_box wpsg_mod_downloadplus" id="wpsg_tab">	
+	<div class="head">
+		<div class="title">
+			<div class="tab" id="tab1"><?php echo __('Einstellungen', 'wpsg'); ?></div>
+			<div class="tab" id="tab2"><?php echo __('Textfelder', 'wpsg'); ?></div>
+			<div class="tab" id="tab3"><?php echo __('Erweitert', 'wpsg'); ?></div>
+			<div class="tab tabright tabright-last" id="tab4"><?php echo __('Info / Hilfe', 'wpsg'); ?></div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+	<div class="content">
+		
+		<div id="tabcontent1" class="tabcontent">		
+		
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_filename', __('Personalisierter Dateiname', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_filename'), array('help' => 'mod_pdfdownload_einstellungen_filename')); ?>
 			<?php echo wpsg_drawForm_Select('wpsg_mod_downloadplus_indiv_mode', __('Individualisierung planen', 'wpsg'), array(0 => __('Manuell', 'wpsg'), 1 => __('Nach Zahlung', 'wpsg'), 2 => __('Nach Bestellung', 'wpsg')), $this->get_option('wpsg_mod_downloadplus_indiv_mode'), array('help' => 'mod_pdfdownload_einstellungen_individualisierungsmodus')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_autosend', __('PDFs nach Individualisierung sofort senden', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_autosend'), array('help' => 'mod_pdfdownload_einstellungen_autosend')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_shipping', __('Versandart "Versand per Mail" aktiv', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_shipping'), array('help' => 'wpsg_mod_downloadplus_shipping')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_einsplusx', __(' Mehr als ein Produkt im Warenkorb zulassen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_einsplusx'), array('help' => 'wpsg_mod_downloadplus_einsplusx')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_mod_downloadplus_accepted', __('GÃŒltigkeit von Links', 'wpsg'), array(0 => __('Unbegrenzt', 'wpsg'), 1 => __('Nach Downloads', 'wpsg'), 2 => __('Nach Tagen', 'wpsg')), $this->get_option('wpsg_mod_downloadplus_accepted'), array('field_class' => 'wpsg_change', 'help' => 'mod_pdfdownload_einstellungen_accepted')); ?>
-
-            <div class="wpsg_mod_downloadplus_accepted wpsg_mod_downloadplus_accepted_2">
-                <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_days', __('GÃŒltigkeit in Tagen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_days'), array('help' => 'wpsg_mod_downloadplus_days')); ?>
-            </div>
-
-            <div class="wpsg_mod_downloadplus_accepted wpsg_mod_downloadplus_accepted_1">
-			    <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_downloads', __('Anzahl an mÃ¶glichen Downloads', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_downloads'), array('help' => 'wpsg_mod_downloadplus_downloads')); ?>
-            </div>
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_cleanraiddownloads', __('Abgelaufene Downloads bereinigen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_cleanraiddownloads'), array('help' => 'wpsg_mod_downloadplus_cleanraiddownloads')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_cleanolddownloads', __('Downloads nach X Tagen lÃ¶schen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_cleanolddownloads'), array('help' => 'wpsg_mod_downloadplus_cleanolddownloads')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_pdfpath', __('Pfad fÃŒr die PDFs der Produkte', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_pdfpath'), array('hint' => __('Standard: uploads/wpsg/wpsg_pdfprodukte/', 'wpsg'), 'help' => 'wpsg_mod_downloadplus_pdfpath')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_pdfindivpath', __('Pfad fÃŒr die Individualisierten PDFs', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_pdfindivpath'), array('hint' => __('Standard: uploads/wpsg/wpsg_pdfprodukte_order/', 'wpsg'), 'help' => 'wpsg_mod_downloadplus_pdfindivpath')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_downloadplus_accepted', __('GÃŒltigkeit von Links', 'wpsg'), array(0 => __('Unbegrenzt', 'wpsg'), 1 => __('Nach Downloads', 'wpsg'), 2 => __('Nach Tagen', 'wpsg')), $this->get_option('wpsg_mod_downloadplus_accepted'), array('help' => 'mod_pdfdownload_einstellungen_accepted')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_days', __('GÃŒltigkeit in Tagen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_days'), array('help' => 'wpsg_mod_downloadplus_days')); ?> 
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_downloads', __('Anzahl an mÃ¶glichen Downloads', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_downloads'), array('help' => 'wpsg_mod_downloadplus_downloads')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_cleanraiddownloads', __('Abgelaufene Downloads bereinigen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_cleanraiddownloads'), array('help' => 'wpsg_mod_downloadplus_cleanraiddownloads')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_cleanolddownloads', __('Downloads nach X Tagen lÃ¶schen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_cleanolddownloads'), array('help' => 'wpsg_mod_downloadplus_cleanolddownloads')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_pdfpath', __('Pfad fÃŒr die PDFs der Produkte', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_pdfpath'), array('hint' => __('Standard: uploads/wpsg_pdfprodukte/', 'wpsg'), 'help' => 'wpsg_mod_downloadplus_pdfpath')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_pdfindivpath', __('Pfad fÃŒr die Individualisierten PDFs', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_pdfindivpath'), array('hint' => __('Standard: uploads/wpsg_pdfprodukte_order/', 'wpsg'), 'help' => 'wpsg_mod_downloadplus_pdfindivpath')); ?>
 			<?php echo wpsg_drawForm_Select('wpsg_mod_downloadplus_format', __('Auslieferungsformat', 'wpsg'), array(0 => __('Direkt', 'wpsg'), 1 => __('Gezippt (intern)', 'wpsg')), $this->get_option('wpsg_mod_downloadplus_format'), array('help' => 'wpsg_mod_downloadplus_format')); ?>
-			<?php echo wpsg_drawForm_Select('wpsg_mod_downloadplus_range', __('Anpassung', 'wpsg'), array(0 => __('Gesamtes Dokument', 'wpsg'), 1 => __('Bereich', 'wpsg')), $this->get_option('wpsg_mod_downloadplus_range'), array ('field_class' => 'wpsg_change', 'help' => 'wpsg_mod_downloadplus_range')); ?>
-
-            <div class="wpsg_mod_downloadplus_range wpsg_mod_downloadplus_range_1">
-                <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_range_von', __('Anpassung ab Seite', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_range_von'), array()); ?>
-                <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_range_bis', __('Anpassung bis Seite', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_range_bis'), array()); ?>
-            </div>
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_setpwd', __('Passwortschutz aktivieren', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_setpwd'), array('help' => 'wpsg_mod_downloadplus_setpwd')); ?>
-            <div class="wpsg_mod_downloadplus_setpwd_activ" style="display:none;">
-                <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_masterpass', __('Passwort (Um Schutz aufzuheben)', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_masterpass'), array('help' => 'wpsg_mod_downloadplus_masterpass')); ?>
-			    <?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_openpass', __('Passwort (Um Dokument Ã¶ffnen zu kÃ¶nnen)', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_openpass'), array('help' => 'wpsg_mod_downloadplus_openpass')); ?>
-
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_securitysave', __('Speichern erlauben', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_securitysave'), array('label' => __('Dokumentenberechtigung', 'wpsg'))); ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_securityprint', __('Drucken erlauben', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_securityprint')); ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_securitymod', __('Modifizieren erlauben', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_securitymod')); ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_securitynote', __('Bemerkungen erlauben', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_securitynote')); ?>
-            </div>
-
-            <?php echo wpsg_drawForm_TextStart(); ?>
-            <?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#pdfdownloadcronmail'); ?>
-			<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_individualisierungsbericht" class="glyphicon glyphicon-question-sign" data-wpsg-tip="mod_pdfdownload_individualisierungsbericht" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_individualisierungsbericht"></a>
-            <?php echo wpsg_drawForm_TextEnd(__('Mail fÃŒr Individualisierungsbericht', 'wpsg'), array('noP' => true)); ?>
-            <?php echo wpsg_drawForm_TextStart(); ?>
-            <?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#pdfdownloadfiles'); ?>
-			<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_kundenmail" class="glyphicon glyphicon-question-sign" data-wpsg-tip="mod_pdfdownload_kundenmail" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_kundenmail"></a>
-            <?php echo wpsg_drawForm_TextEnd(__('Mail fÃŒr Downloads an Kunden', 'wpsg'), array('noP' => true)); ?>
-            <?php echo wpsg_drawForm_TextStart(); ?>
-            <?php echo (($this->get_option('wpsg_lastCron') > 0)?wpsg_formatTimestamp($this->get_option('wpsg_lastCron')):__('Noch nicht ausgefÃŒhrt', 'wpsg')); ?>
-			<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_einstellungen_cron" class="glyphicon glyphicon-question-sign" data-wpsg-tip="mod_pdfdownload_einstellungen_cron" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_einstellungen_cron"></a>
-            <?php echo wpsg_drawForm_TextEnd(__('Letzte AusfÃŒhrung des Crons', 'wpsg'), array('noP' => true)); ?>
-
-        </div>
-
-        <div role="tabpanel" class="tab-pane" id="tab3">
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_memorylimit', __('Versuche Speicherlimit hochzusetzen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_memorylimit'), array('help' => 'wpsg_mod_downloadplus_memorylimit')); ?>
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_emptypdf', __('ZusÃ€tzlich leeres PDF individualisieren', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_emptypdf'), ['help' => 'wpsg_mod_downloadplus_emptypdf']); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_downloadplus_range', __('Anpassung', 'wpsg'), array(0 => __('Gesamtes Dokument', 'wpsg'), 1 => __('Bereich', 'wpsg')), $this->get_option('wpsg_mod_downloadplus_range'), array ('help' => 'wpsg_mod_downloadplus_range')); ?>
+			<div class="wpsg_form_field" style="display:none;" id="wpsg_mod_downloadplus_rangefield">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Seitenbereich (Von/Bis)', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<input type="text" style="width:100px;" size="5" name="wpsg_mod_downloadplus_range_von" value="<?php echo $this->get_option('wpsg_mod_downloadplus_range_von'); ?>" />&nbsp;-&nbsp;
+					<input type="text" style="width:100px;" size="5" name="wpsg_mod_downloadplus_range_bis" value="<?php echo $this->get_option('wpsg_mod_downloadplus_range_bis'); ?>" />					
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_masterpass', __('Passwort (Um Schutz aufzuheben)', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_masterpass'), array('help' => 'wpsg_mod_downloadplus_masterpass')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_openpass', __('Passwort (Um Dokument Ã¶ffnen zu kÃ¶nnen)', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_openpass'), array('help' => 'wpsg_mod_downloadplus_openpass')); ?>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Dokumentenberechtigungen', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right wpsg_mod_downloadplus_security">
+					<p>
+						<input type="hidden" value="0" name="wpsg_mod_downloadplus_securitysave" />
+						<label><input type="checkbox" value="1" name="wpsg_mod_downloadplus_securitysave" <?php echo (($this->get_option('wpsg_mod_downloadplus_securitysave') == '1')?'checked="checked"':''); ?> />&nbsp;<?php echo __('Speichern erlauben', 'wpsg'); ?></label><br />
+						
+						<input type="hidden" value="0" name="wpsg_mod_downloadplus_securityprint" />
+						<label><input type="checkbox" value="1" name="wpsg_mod_downloadplus_securityprint" <?php echo (($this->get_option('wpsg_mod_downloadplus_securityprint') == '1')?'checked="checked"':''); ?> />&nbsp;<?php echo __('Drucken erlauben', 'wpsg'); ?></label><br />
+						
+						<input type="hidden" value="0" name="wpsg_mod_downloadplus_securitymod" />
+						<label><input type="checkbox" value="1" name="wpsg_mod_downloadplus_securitymod" <?php echo (($this->get_option('wpsg_mod_downloadplus_securitymod') == '1')?'checked="checked"':''); ?> />&nbsp;<?php echo __('Modifizieren erlauben', 'wpsg'); ?></label><br />
+						
+						<input type="hidden" value="0" name="wpsg_mod_downloadplus_securitynote" />
+						<label><input type="checkbox" value="1" name="wpsg_mod_downloadplus_securitynote" <?php echo (($this->get_option('wpsg_mod_downloadplus_securitynote') == '1')?'checked="checked"':''); ?> />&nbsp;<?php echo __('Bemerkungen erlauben', 'wpsg'); ?></label><br />
+					</p>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Mail fÃŒr Individualisierungsbericht', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#pdfdownloadcronmail'); ?></p>
+					<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_individualisierungsbericht" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_individualisierungsbericht"></a>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Mail fÃŒr Downloads an Kunden', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#pdfdownloadfiles'); ?></p>
+					<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_kundenmail" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_kundenmail"></a>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Letzte AusfÃŒhrung des Crons', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo (($this->get_option('wpsg_lastCron') > 0)?wpsg_formatTimestamp($this->get_option('wpsg_lastCron')):__('Noch nicht ausgefÃŒhrt', 'wpsg')); ?></p>
+					<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_einstellungen_cron" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_einstellungen_cron"></a>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			
+		</div>
+		
+		<div id="tabcontent2" class="tabcontent">
+			<table class="wpsg_mod_downloadplus_fieldtable">
+				<tr>
+					<th class="col_bezeichnung"></th>					
+					<th class="col_x"><?php echo __('X', 'wpsg'); ?></th>
+					<th class="col_y"><?php echo __('Y', 'wpsg'); ?></th>
+					<th class="col_align"><?php echo __('Zentriert', 'wpsg'); ?></th>
+					<th class="col_bg"><?php echo __('Hintergrund', 'wpsg'); ?></th>
+					<th class="col_color"><?php echo __('Farbe', 'wpsg'); ?></th>
+					<th class="col_alpha"><?php echo __('Opaque', 'wpsg'); ?></th>
+					<th class="col_angle"><?php echo __('Winkel', 'wpsg'); ?></th>
+					<th class="col_groesse"><?php echo __('GrÃ¶Ãe', 'wpsg'); ?></th>
+					<th class="col_action"></th>
+				</tr>
+				<?php for ($i = 0; $i < 10; $i ++) { ?>
+				<tr>
+					<td><?php echo '#'.($i + 1); ?></td>					
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][x]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['x']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][y]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['y']); ?>" />
+					</td>
+					<td class="col_align">
+						<input type="hidden" name="text[<?php echo $i; ?>][align]" value="0" />
+						<input class="wpsg_hideBarcode" type="checkbox" name="text[<?php echo $i; ?>][align]" value="1" <?php echo (($this->view['arTexte'][$i]['align'] == '1')?'checked="checked"':''); ?> />
+					</td>
+					<td class="col_bg">
+						<input type="hidden" name="text[<?php echo $i; ?>][bg]" value="0" />
+						<input class="wpsg_hideBarcode" type="checkbox" name="text[<?php echo $i; ?>][bg]" value="1" <?php echo (($this->view['arTexte'][$i]['bg'] == '1')?'checked="checked"':''); ?> />
+					</td>
+					<td>
+						<input class="wpsg_hideBarcode" type="text" style="width:100%;" name="text[<?php echo $i; ?>][color]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['color']); ?>" />
+					</td>
+					<td>
+						<input class="wpsg_hideBarcode" type="text" style="width:100%;" name="text[<?php echo $i; ?>][alpha]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['alpha']); ?>" />
+					</td>					
+					<td>
+						<input class="wpsg_hideBarcode" type="text" style="width:100%;" name="text[<?php echo $i; ?>][angle]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['angle']); ?>" />
+					</td>
+					<td>
+						<select name="text[<?php echo $i; ?>][fontsize]" style="width:100%;">
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "4")?'selected="selected"':''); ?> value="4">4</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "5")?'selected="selected"':''); ?> value="5">5</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "6")?'selected="selected"':''); ?> value="6">6</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "7")?'selected="selected"':''); ?> value="7">7</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "8")?'selected="selected"':''); ?> value="8">8</option>				
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "9")?'selected="selected"':''); ?> value="9">9</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "10")?'selected="selected"':''); ?> value="10">10</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "11")?'selected="selected"':''); ?> value="11">11</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "12")?'selected="selected"':''); ?> value="12">12</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "13")?'selected="selected"':''); ?> value="13">13</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "14")?'selected="selected"':''); ?> value="14">14</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "16")?'selected="selected"':''); ?> value="16">16</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "18")?'selected="selected"':''); ?> value="18">18</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "20")?'selected="selected"':''); ?> value="20">20</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "22")?'selected="selected"':''); ?> value="22">22</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "24")?'selected="selected"':''); ?> value="24">24</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "26")?'selected="selected"':''); ?> value="26">26</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "28")?'selected="selected"':''); ?> value="28">28</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "30")?'selected="selected"':''); ?> value="30">30</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "32")?'selected="selected"':''); ?> value="32">32</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "34")?'selected="selected"':''); ?> value="34">34</option>
+						</select>
+					</td>
+					<td>			
+						<label><input type="checkbox" value="1" name="text[<?php echo $i; ?>][aktiv]" <?php echo (($this->view['arTexte'][$i]['aktiv'] == 1)?'checked="checked"':''); ?> />&nbsp;<?php echo __("Aktiv", "wpsg"); ?></label>
+						<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_fieldconfig"></a>
+					</td>
+				</tr>
+				<tr>
+					<td></td>
+					<td class="col_freitext_label"><?php echo __('Freitext', 'wpsg'); ?>:</td>
+					<td colspan="7" class="col_freitext">
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][text]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['text']); ?>" />
+					</td>
+					<td>
+						<select class="fontselect" name="text[<?php echo $i; ?>][font]" style="width:100%;"> 
+							<?php foreach ($this->view['wpsg_mod_downloadplus']['arFonts'] as $k => $v) { ?>
+							<option value="<?php echo wpsg_hspc($k); ?>" <?php echo (($k == $this->view['arTexte'][$i]['font'])?'selected="selected"':''); ?>><?php echo wpsg_hspc($v); ?></option>
+							<?php } ?>
+						</select>
+					</td>
+				</tr>
+				<?php if ($i < 9) { ?>
+				<tr class="wpsg_border_bottom"><td colspan="10"></td></tr>
+				<?php } ?>
+				<?php } ?>
+			</table>
+		</div>
+		
+		<div id="tabcontent3" class="tabcontent">
+		
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_memorylimit', __('Versuche Speicherlimit hochzusetzen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_memorylimit'), array('help' => 'wpsg_mod_downloadplus_memorylimit')); ?>			
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_timelimit', __('Versuche die AusfÃŒhrungszeit hochzusetzen', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_timelimit'), array('help' => 'wpsg_mod_downloadplus_timelimit')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_numberformat', __('Format der Downloadnummer', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_numberformat'), array('help' => 'wpsg_mod_downloadplus_numberformat')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_mod_downloadplus_startnumber', __('Downloadnummer Startnummer', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_startnumber'), array('help' => 'wpsg_mod_downloadplus_startnumber')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadplus_attachement', __('Angepasste Dokumente als Anhang versenden', 'wpsg'), $this->get_option('wpsg_mod_downloadplus_attachement'), array('help' => 'wpsg_mod_downloadplus_attachement')); ?>
-
-        </div>
-
-        <div role="tabpanel" class="tab-pane" id="tab5">
-
-            <?php echo $this->render(WPSG_PATH_VIEW.'/mods/mod_downloadplus/settings_edit_templates.phtml'); ?>
-
-        </div>
-
-        <div role="tabpanel" class="tab-pane" id="tab4">
-
-            <p>
-				<?php echo __('Das Downloadplus Modul ist eine erweiterung des Downloadprodukt Moduls und ermÃ¶glicht das Individualisieren von PDF Dokumenten.', 'wpsg'); ?>
+					
+		</div>
+		
+		<div id="tabcontent4" class="tabcontent">
+		
+			<p>
+				<?php echo __('Das Downloadplus Modul ist eine erweiterung des Downloadprodukt Moduls und ermÃ¶glicht das Individualisieren von PDF Dokumenten.', 'wpsg'); ?>				
 			</p>
 			<p>
 				<?php echo __('Weitere Informationen erhalten Sie auf der <a href="http://wpshopgermany.de/?p=1426">Hilfe Seite</a> oder in unserem <a href="http://forum.maennchen1.de">Support Forum</a>.', 'wpsg'); ?>
 			</p>
-
+			
 			<p>
 				<?php echo __('Eintrag in der Crontab:', 'wpsg'); ?>:<br /><br />
 				<span style="font-weight:bold; font-family:monospace;">
-					*/5   *   *   *  *    wget -q --spider <?php echo site_url().'/?wpsg_cron=1'; ?>
+					*/5   *   *   *  *    /usr/bin/php <?php echo WPSG_PATH.DIRECTORY_SEPARATOR; ?>cron.php 
 				</span>
 			</p>
 			<p>
 				<?php echo __('HTTP Aufruf des Cron Scriptes:', 'wpsg'); ?><br /><br />
-				<a href="<?php echo site_url(); ?>/?wpsg_cron=1" target="_blank"><?php echo site_url(); ?>/?wpsg_cron=1</a>
-			</p>
-
-        </div>
-
-    </div>
+				<a href="<?php echo WPSG_PLUGIN_URL; ?>/wpshopgermany/cron.php" target="_blank"><?php echo WPSG_PLUGIN_URL; ?>/wpshopgermany/cron.php</a>
+			</p>		
+			
+		</div>
+		
+	</div>
 </div>
 
-<script>
-
-    jQuery(document).ready(function() {
-
-        jQuery('.wpsg_change').on('change', function() {
-
-            jQuery('.' + jQuery(this).attr("id")).hide();
-            jQuery('.' + jQuery(this).attr("id") + '_' + jQuery(this).val()).show();
-
-        } ).change();
-
-        jQuery('#wpsg_mod_downloadplus_setpwd').bind('change', function() {
-
-            if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_downloadplus_setpwd_activ').show();
-            else jQuery('.wpsg_mod_downloadplus_setpwd_activ').hide();
-
-        } ).change();
-
-    } );
-
-</script>
+<script type="text/javascript">/* <![CDATA[ */
+ 
+	function wpsg_mod_downloadplus_switchAccepted()
+	{
+
+		if (jQuery('#wpsg_mod_downloadplus_accepted').val() == '1')
+			jQuery('#wpsg_mod_downloadplus_downloads').parent().parent().show();
+		else
+			jQuery('#wpsg_mod_downloadplus_downloads').parent().parent().hide();
+		
+		if (jQuery('#wpsg_mod_downloadplus_accepted').val() == '2')
+			jQuery('#wpsg_mod_downloadplus_days').parent().parent().show();
+		else
+			jQuery('#wpsg_mod_downloadplus_days').parent().parent().hide();
+		
+	} // function wpsg_mod_downloadplus_switchAccepted()
+
+	function wpsg_mod_downloadplus_switchRange()
+	{
+
+		if (jQuery('#wpsg_mod_downloadplus_range').val() == '1')
+			jQuery('#wpsg_mod_downloadplus_rangefield').show();
+		else
+			jQuery('#wpsg_mod_downloadplus_rangefield').hide();
+		
+	} // function wpsg_mod_downloadplus_switchRange()
+	
+	jQuery(document).ready(function() {
+
+		jQuery('.wpsg_mod_downloadplus_fieldtable select.fontselect').bind('change', function() {
+
+			if (jQuery(this).val() == 'EAN13' || jQuery(this).val() == 'Code128' || jQuery(this).val() == 'UPC_A')
+			{
+ 
+				jQuery(this).parents('tr').prev().find('input.wpsg_hideBarcode').hide();
+				
+			}
+			else
+			{
+			 
+				jQuery(this).parents('tr').prev().find('input.wpsg_hideBarcode').show();
+				
+			}
+			
+		} ).change();
+		 
+		jQuery('#wpsg_mod_downloadplus_range').bind('change', function() { wpsg_mod_downloadplus_switchRange(); } );
+		jQuery('#wpsg_mod_downloadplus_accepted').bind('change', function() { wpsg_mod_downloadplus_switchAccepted(); } );
+
+		wpsg_mod_downloadplus_switchAccepted();
+		wpsg_mod_downloadplus_switchRange();
+		
+		jQuery('#wpsg_tab').wpsg_tab( { 
+			'cookiename': 'wpsg_pdfdownload_tab',
+			'tab2': function() {
+				jQuery('.tablink').show();
+			}
+		} );
+	} );
+
+	/* ]]> */</script>
+		
Index: ews/mods/mod_downloadplus/settings_edit_templates.phtml
===================================================================
--- /views/mods/mod_downloadplus/settings_edit_templates.phtml	(revision 8528)
+++ 	(revision )
@@ -1,361 +1,0 @@
-<?php
-
-	namespace wpsg;
-
-	$arTemplates = array_values($this->callMod('wpsg_mod_downloadplus', 'getTemplate'));
-
-	$arFontVue = [];
-	foreach ($this->view['wpsg_mod_downloadplus']['arFonts'] as $font_code => $font_label) {
-
-	    $arFontVue[] = ['code' => $font_code, 'label' => $font_label];
-
-    }
-
-?>
-
-<div id="wpsg_dp_templates_app">
-
-	<div class="head">
-
-        <a href="#" @click.prevent="addTemplate" title="<?php echo __('Neues Template anlegen', 'wpsg'); ?>">
-            <span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>
-        </a>
-
-		<div v-if="arTemplates.length > 0">
-
-			<select v-model="template">
-				<option :value="null"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-				<option v-for="(template, index) in arTemplates" :value="template">
-                    {{template.name}} ({{template.arField.length}} <?php echo __('Felder', 'wpsg'); ?><template v-if="template.defaulttemplate">, <?php echo __('Standard', 'wpsg'); ?></template>)
-                </option>
-			</select>
-
-		</div>
-		<div v-else>
-
-			<?php echo __('Keine Templates vorhanden', 'wpsg'); ?>
-
-		</div>
-
-        <a v-if="template" href="#" @click.prevent="removeTemplate" title="<?php echo __('Template lÃ¶schen', 'wpsg'); ?>">
-            <span class="wpsg-glyphicon glyphicon glyphicon-trash"></span>
-        </a>
-
-	</div>
-
-	<div v-if="template" class="template">
-
-		<div class="form-group form-group-sm has-feedback">
-			<label class="col-sm-6 control-label label-copy" for="wpsg_mod_downloadplus_filename">
-                <a href="#" title="<?php echo __('Template kopieren', 'wpsg'); ?>" @click="copyTemplate()"><span class="wpsg-glyphicon glyphicon glyphicon-copy"></span></a>
-                <span><?php echo __('Name des Templates', 'wpsg'); ?></span>
-            </label>
-			<div class="col-sm-6">
-				<div class="wpsg_field_wrap wpsg_field_wrap_template_name">
-					<input type="text" v-model="template.name" />
-                    <div>
-                        <label class="control-label"><?php echo __('Standard: ', 'wpsg'); ?></label>
-                        <input type="checkbox" :checked="template.defaulttemplate" @click="setDefaultTemplate" />
-                    </div>
-				</div>
-			</div>
-			<div class="clearfix wpsg_clear"></div>
-		</div>
-
-		<table class="table table-body-striped wpsg_mod_downloadplus_fieldtable">
-            <thead>
-                <tr>
-                    <th class="col_bezeichnung">
-                        <a href="#" @click.prevent="addField" title="<?php echo __('Neues Feld', 'wpsg'); ?>">
-                            <span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>
-                        </a>
-                    </th>
-                    <th class="col_x"><?php echo __('X', 'wpsg'); ?></th>
-                    <th class="col_y"><?php echo __('Y', 'wpsg'); ?></th>
-                    <th class="col_align"><?php echo __('Zentriert', 'wpsg'); ?></th>
-                    <th class="col_bg"><?php echo __('Hintergrund', 'wpsg'); ?></th>
-                    <th class="col_color"><?php echo __('Farbe', 'wpsg'); ?></th>
-                    <th class="col_alpha"><?php echo __('Deckkraft', 'wpsg'); ?></th>
-                    <th class="col_angle"><?php echo __('Winkel', 'wpsg'); ?></th>
-                    <th class="col_groesse"><?php echo __('GrÃ¶Ãe', 'wpsg'); ?></th>
-                    <th class="col_action"></th>
-                </tr>
-            </thead>
-			<tbody v-for="(field, field_index) in template.arField">
-                <tr>
-                    <td>#{{field_index + 1}}</td>
-                    <td>
-                        <input type="text" style="width:50px;" v-model="field.x" />
-                    </td>
-                    <td>
-                        <input type="text" style="width:50px;" v-model="field.y" />
-                    </td>
-                    <td class="col_align">
-                        <input class="wpsg_hideBarcode" type="checkbox" v-model="field.align" />
-                    </td>
-                    <td class="col_bg">
-                        <input class="wpsg_hideBarcode" type="checkbox" v-model="field.bg" />
-                    </td>
-                    <td class="col_color">
-                        <input class="wpsg_hideBarcode" type="text" style="width:75px;" v-model="field.color" />
-                    </td>
-                    <td class="col_alpha">
-                        <input class="wpsg_hideBarcode" type="text" style="width:50px;" v-model="field.alpha" />
-                    </td>
-                    <td>
-                        <input class="wpsg_hideBarcode" type="text" style="width:50px;" v-model="field.angle" />
-                    </td>
-                    <td>
-                        <select v-model="field.fontsize" style="width:100%;">
-                            <option v-for="size in [4,5,6,7,8,9,10,11,12,13,14,16,18,20,22,24,26,28,30,32,34]" :value="size">{{size}}</option>
-                        </select>
-                    </td>
-                    <td>
-                        <input type="checkbox" title="<?php echo __('Hier kÃ¶nnen Sie die Zeile deaktivieren/aktivieren.', 'wpsg'); ?>" value="1" v-model="field.aktiv" />
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <a href="#" @click.prevent="addField(field_index)" title="<?php echo __('Neues Feld davor einfÃŒgen', 'wpsg'); ?>">
-                            <span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>
-                        </a>
-                    </td>
-                    <td class="col_freitext_label"><?php echo __('Freitext', 'wpsg'); ?>:</td>
-                    <td colspan="5" class="col_freitext">
-                        <input type="text" style="width:100%;" v-model="field.text" />
-                    </td>
-                    <td colspan="2">
-                        <select class="fontselect" v-model="field.font" style="width:100%;">
-                            <option v-for="(font, index_font) in arFont" :value="font.code">{{font.label}}</option>
-                        </select>
-                    </td>
-                    <td>
-                        <a href="#" @click.prevent="removeField(field_index)" title="<?php echo __('Feld lÃ¶schen', 'wpsg'); ?>">
-                            <span class="wpsg-glyphicon glyphicon glyphicon-trash"></span>
-                        </a>
-                    </td>
-                </tr>
-            </tbody>
-		</table>
-
-        <div class="file_wrap">
-
-            <div class="uploadstate">
-                <template v-if="uploadstate.run">
-                    <img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
-                    <span><?php echo __('Bitte warten', 'wpsg'); ?> ... <template v-if="uploadstate.proz">{{uploadstate.proz}} %</template></span>
-                </template>
-                <input v-else type="file" v-on:change="upload" />
-            </div>
-
-            <div v-if="template.file" class="file">
-                <span>{{template.file}}</span>
-                <a href="#" @click.prevent="removeFile" title="<?php echo __('Datei lÃ¶schen', 'wpsg'); ?>">
-                    <span class="wpsg-glyphicon glyphicon glyphicon-trash"></span>
-                </a>
-            </div>
-
-        </div>
-
-	</div>
-
-    <textarea style="display:none;" name="template">{{arTemplates}}</textarea>
-
-	<br />
-
-</div>
-
-<style>
-
-	#wpsg_dp_templates_app .head { width:100%; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid #DDDDDD; margin-bottom:1rem; padding-bottom:1rem; }
-	#wpsg_dp_templates_app .head select { width:300px; }
-    #wpsg_dp_templates_app .head div { flex-grow:1;  }
-    #wpsg_dp_templates_app .wpsg_field_wrap_template_name { display:flex; justify-content:space-between; align-items:center; padding-right:10px !important; }
-    #wpsg_dp_templates_app .wpsg_field_wrap_template_name > div { gap:1rem; display:flex; justify-content:flex-start; align-items:center; }
-    #wpsg_dp_templates_app .template td.col_bg,
-    #wpsg_dp_templates_app .template td.col_align { width:50px; text-align:center; }
-    #wpsg_dp_templates_app .template tr td { vertical-align:middle; }
-    #wpsg_dp_templates_app .template tr td:last-child { text-align:right; }
-    #wpsg_dp_templates_app .template tr td:last-child .wpsg-glyphicon { margin-right:0; }
-    #wpsg_dp_templates_app .uploadstate { display:flex; justify-content:flex-start; align-items:center; }
-    #wpsg_dp_templates_app .uploadstate > img { margin-right:1rem; }
-    #wpsg_dp_templates_app .file_wrap { display:flex; justify-content:space-between; align-items:center; }
-    #wpsg_dp_templates_app .file_wrap .file { display:flex; gap:1rem; justify-content:flex-end; align-items:center; }
-    #wpsg_dp_templates_app .file_wrap .file .wpsg-glyphicon { margin-right:8px; }
-    #wpsg_dp_templates_app .label-copy { display:flex; justify-content:space-between; }
-    #wpsg_dp_templates_app .label-copy .glyphicon  { font-size:14px; }
-
-</style>
-
-<script src="<?php echo WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/views/js/vue3.js'; ?>"></script>
-<script>
-
-	const Counter = {
-        data() {
-            return {
-            	arFont: <?php echo json_encode($arFontVue); ?>,
-                arTemplates: <?php echo json_encode($arTemplates); ?>,
-	            template: null,
-                uploadstate: {
-	                run: false,
-                    proz: null
-                }
-            }
-        },
-		methods: {
-
-        	addTemplate: function() {
-
-        		let new_template = {
-			        id: 0,
-					name: '<?php echo __('Template', 'wpsg'); ?>' + (this.arTemplates.length + 1),
-			        arField: [
-				        {
-				        	id: 0, x: 0, y:0, align:false, bg:false, color:'000000', alpha:1, angle:0, fontsize:22, aktiv:true,
-                            text: '', font: '', defaulttemplate: false, file: null, file_data: null
-				        }
-			        ],
-                    file: null,
-                    file_delete: false,
-                    file_data: false
-		        };
-
-        		this.arTemplates.push(new_template);
-        		this.template = new_template;
-
-	        },
-
-            copyTemplate: function() {
-
-        		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie das Template kopieren mÃ¶chten?', 'wpsg'); ?>')) return false;
-
-                let new_template = JSON.parse(JSON.stringify(this.template));
-
-                new_template.name += ' (Kopie)';
-
-                this.arTemplates.push(new_template);
-                this.template = new_template;
-
-            },
-
-            removeTemplate: function() {
-
-        		if (!confirm('<?php echo __('Sind Sie sich sicher? Das ganze Template und alle Felder werden gelÃ¶scht.', 'wpsg'); ?>')) return;
-
-        		for (let i = 0; i < this.arTemplates.length; i ++) {
-
-        			if (this.arTemplates[i] === this.template) {
-
-        				this.arTemplates.splice(i, 1);
-
-                    }
-
-                }
-
-        		if (this.arTemplates.length > 0) this.template = this.arTemplates[0];
-        		else this.template = null;
-
-            },
-
-	        addField: function(field_index) {
-
-        		if (field_index === undefined) field_index = this.template.arField.length;
-
-        		this.template.arField.splice(field_index, 0,  {
-                    id: 0, x: 0, y:0, align:false, bg:false, color:'000000', alpha:1, angle:0, fontsize:22, aktiv:true,
-                    text: '', font: ''
-                })
-
-            },
-
-            removeField: function(field_index) {
-
-        		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie das Feld lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return;
-
-        		this.template.arField.splice(field_index, 1);
-
-            },
-
-            setDefaultTemplate: function() {
-
-        		for (let i = 0; i < this.arTemplates.length; i ++) {
-
-        			this.arTemplates[i].defaulttemplate = false;
-
-                }
-
-        		this.template.defaulttemplate = true;
-
-            },
-
-            removeFile: function() {
-
-        		if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return;
-
-        		this.template.file_data = null;
-        		this.template.file = null;
-        		this.template.file_delete = true;
-
-            },
-
-            upload: function(e) {
-
-        		const files = e.target.files || e.dataTransfer.files;
-                if (!files.length) return;
-
-                if (files[0].type !== 'application/pdf') {
-
-                	alert('<?php echo __('UngÃŒltier Dateityp', 'wpsg'); ?>');
-                	return;
-
-                }
-
-                this.uploadstate.run = true;
-                this.uploadstate.proz = null;
-
-                const reader = new FileReader();
-
-				reader.addEventListener("load", () => {
-
-					this.template.file = files[0].name
-                    this.template.file_data = reader.result;
-					this.template.file_delete = false;
-
-					this.uploadstate.run = false;
-
-					e.target.value = '';
-
-				}, false);
-
-				reader.addEventListener('progress', (event) => {
-
-                    if (event.lengthComputable) this.uploadstate.proz = Math.round((event.loaded / event.total) * 100);
-
-                });
-
-				reader.readAsDataURL(files[0]);
-
-            }
-
-		},
-        mounted() {
-
-        	for (let i = 0; i < this.arTemplates.length; i ++) {
-
-        		if (this.arTemplates[i].defaulttemplate === true) this.template = this.arTemplates[i];
-
-            }
-
-        },
-        watch: {
-        	'template.file': function(newValue, oldValue) {
-
-        		console.log(newValue);
-
-	        }
-        }
-	}
-
-	Vue.createApp(Counter).mount('#wpsg_dp_templates_app');
-
-</script>
Index: /views/mods/mod_downloadprodukte/order_view_row.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/order_view_row.phtml	(revision 8528)
+++ /views/mods/mod_downloadprodukte/order_view_row.phtml	(revision 5261)
@@ -6,9 +6,9 @@
 
 ?>
-<tr class="wpsg_<?php echo ((wpsg_getInt($this->view['i']) == 0)?'odd':'even'); ?>">
+<tr class="wpsg_<?php echo (($this->view['i'] == 0)?'odd':'even'); ?>">
 	<td ><?php echo __('Downloads', 'wpsg'); ?>:</td>
-	<td align="right" colspan="<?php echo ((sizeof($this->view['arCalculation']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">	
+	<td align="right" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">	
 		 <?php foreach ($this->view['wpsg_mod_downloadprodukte']['arFiles'] as $file) { ?>
-		 <a target="_new" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&noheader=1&cmd=download_file&file=<?php echo rawurlencode(basename($file[1])); ?>&edit_id=<?php echo $this->getProduktId($this->view['wpsg_mod_downloadprodukte']['product']['product_key']); ?>"><?php echo basename($file[1]); ?></a>
+		 <a target="_new" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&noheader=1&cmd=download_file&file=<?php echo rawurlencode(basename($file[1])); ?>&edit_id=<?php echo $this->getProduktId($this->view['wpsg_mod_downloadprodukte']['product']['productkey']); ?>"><?php echo basename($file[1]); ?></a>
 		 <?php } ?>
 	</td>
Index: ews/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,74 +1,0 @@
-<?php
-
-/**
- * Dieses Template wird in der Produktverwaltung in der rechten Spalte verwendet
- */
-
-?>
-
-<script type="text/javascript">
-/* <![CDATA[ */
-
-	/**
-	 * Wird beim lÃ¶schen einer Datei aufgerufen
-	 */
-
-	function wpsg_remove_file(strFile)
-	{
-
-		if (!confirm('<?php echo __('Sind Sie sicher, das Sie diese Datei lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
-
-		jQuery('#produktfiles_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&cmd=remove&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
-			data: {
-				file: strFile
-			},
-			success: function(data) {
-				//alert(data);
-				jQuery('#produktfiles_target').html(data);
-			}
-		} );
-
-		return false;
-		
-	}
-	
-/* ]]> */
-</script>
-
-<div id="wpsg_downloadprodukte" class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Downloadprodukt', 'wpsg'); ?>
-		</h3>
-	</div>
-	<div class="panel-body">
-		<div id="produktfiles_target"><?php echo $this->view['prodFiles']; ?></div>
-		
-		<?php if ($this->get_option('wpsg_classicupload') == '1') { ?>
-		<input type="file" name="wpsg_mod_downloadprodukte_file" />
-		<?php } else { ?>	
-		<input value="<?php echo __("Upload", "wpsg"); ?>" type="text" style="text-align:center;" size="10" id="upload_produktfile_button" />
-		<?php } ?>		
-		
-		<div class="wpsg_clear"></div><br />
-		<div class="wpsg_form_field">
-			<div class="wpsg_form_left" style="width:75px;">
-				<label for="feinheit"><?php echo __('FTP Pfad', 'wpsg'); ?>:</label>
-			</div>
-			<div class="wpsg_form_right">
-				<p>
-					<a href="#" onclick="alert('<?php echo wpsg_hspc($this->view['wpsg_mod_downloadprodukte']['path']); ?>'); return false;"><?php echo __('Anzeigen', 'wpsg'); ?></a>
-				</p>
-			</div>
-			<div class="wpsg_clear"></div>
-		</div>		
-		
-		<br /><br />
-		
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_downloadprodukte"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Downloadproduktes', 'wpsg'); ?></a>
-		
-	</div>
-</div>
Index: /views/mods/mod_downloadprodukte/produkt_edit_list.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/produkt_edit_list.phtml	(revision 8528)
+++ /views/mods/mod_downloadprodukte/produkt_edit_list.phtml	(revision 5261)
@@ -8,13 +8,13 @@
 <?php if (wpsg_isSizedArray($this->view['prodFiles']) && wpsg_isSizedInt($_REQUEST['edit_id'])) { ?>
 	<ul>
-	<?php foreach ($this->view['prodFiles'] as $file) { ?>
+<?php foreach ($this->view['prodFiles'] as $file) { ?>
 
 		<li>
-			<a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&noheader=1&cmd=download_file&file=<?php echo rawurlencode(basename($file[1])); ?>&edit_id=<?php echo $_REQUEST['edit_id']; ?>" title="<?php echo wpsg_hspc(basename($file[1])); ?>"><?php echo wpsg_hspc(substr(basename($file[1]), 0, 50)); ?></a>
+			<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&noheader=1&cmd=download_file&file=<?php echo rawurlencode(basename($file[1])); ?>&edit_id=<?php echo $_REQUEST['edit_id']; ?>" title="<?php echo wpsg_hspc(basename($file[1])); ?>"><?php echo wpsg_hspc(substr(basename($file[1]), 0, 25)); ?></a>
 			(<?php echo wpsg_formatSize($file[1]); ?>)
-			<div class="wpsg_glyphicon_right glyphicon glyphicon-trash" onclick="return wpsg_remove_file('<?php echo basename($file[0]) ?>');" title="<?php echo __('Datei lÃ¶schen', 'wpsg') ?>"></div>
+			<div class="wpsg_mod_downloadprodukte_admin_delete" onclick="return wpsg_remove_file('<?php echo basename($file[0]) ?>');" title="<?php echo __('Datei lÃ¶schen', 'wpsg') ?>"></div>
 		</li>
 
-	<?php } ?>
+<?php } ?>
 	</ul>
 <?php } else { ?>
Index: /views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_downloadprodukte/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Dieses Template wird in der Produktverwaltung in der rechten Spalte verwendet
+ */
+
+?>
+
+<script type="text/javascript">
+/* <![CDATA[ */
+
+	jQuery(document).ready(function() {	
+
+		<?php if ($this->get_option('wpsg_classicupload') != '1') { ?>
+		new AjaxUpload(
+			"upload_produktfile_button", {
+				name: "wpsg_mod_downloadprodukte_file",
+				action: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file",
+				onSubmit: function(file, extension) {
+	
+					jQuery('#produktfiles_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+					
+				},
+				onComplete: function(file, response) {
+					//alert(response);
+					if (response == '1')
+					{
+						//jQuery("#produktfiles_target").html('lalal');
+						jQuery("#produktfiles_target").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&cmd=produktfiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+					}
+					else
+					{
+						alert(response);
+					}
+				}										
+			}
+		);
+		<?php } ?>
+							   
+	} );
+
+	/**
+	 * Wird beim lÃ¶schen einer Datei aufgerufen
+	 */
+	function wpsg_remove_file(strFile)
+	{
+
+		if (!confirm('<?php echo __('Sind Sie sicher, das Sie diese Datei lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+
+		jQuery('#produktfiles_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&cmd=remove&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
+			data: {
+				file: strFile
+			},
+			success: function(data) {
+				//alert(data);
+				jQuery('#produktfiles_target').html(data);
+			}
+		} );
+
+		return false;
+		
+	}
+	
+/* ]]> */
+</script>
+
+<div id="wpsg_downloadprodukte" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span>
+			<?php echo __('Downloadprodukt', 'wpsg'); ?>
+			<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_downloadprodukt_produktverwaltung" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_downloadprodukt_produktverwaltung" class="wpsg_form_help"></a> 
+		</span>
+	</h3>
+	<div class="inside">
+		<div id="produktfiles_target"><?php echo $this->view['prodFiles']; ?></div>
+		
+		<?php if ($this->get_option('wpsg_classicupload') == '1') { ?>
+		<input type="file" name="wpsg_mod_downloadprodukte_file" />
+		<?php } else { ?>	
+		<input value="<?php echo __("Upload", "wpsg"); ?>" type="text" style="text-align:center;" size="10" id="upload_produktfile_button" />
+		<?php } ?>		
+		
+		<div class="wpsg_clear"></div><br />
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left" style="width:75px;">
+				<label for="feinheit"><?php echo __('FTP Pfad', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<a href="#" onclick="alert('<?php echo wpsg_hspc($this->view['wpsg_mod_downloadprodukte']['path']); ?>'); return false;"><?php echo __('Anzeigen', 'wpsg'); ?></a>
+				</p>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>		
+		
+	</div>
+	<div class="clear"></div>
+</div>
Index: /views/mods/mod_downloadprodukte/settings_edit.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_downloadprodukte/settings_edit.phtml	(revision 5261)
@@ -9,20 +9,24 @@
 <?php echo wpsg_drawForm_Select('wpsg_mod_downloadprodukte_zt', __('ZÃ€hltyp', 'wpsg'), array(0 => __('Tage', 'wpsg'), 1 => __('Downloads', 'wpsg')), $this->get_option('wpsg_mod_downloadprodukte_zt'), array('help' => 'wpsg_mod_downloadprodukte_zt')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_downloadprodukte_days', __('Tage/Downloads gÃŒltig', 'wpsg'), $this->get_option('wpsg_mod_downloadprodukte_days'), array('help' => 'wpsg_mod_downloadprodukte_days')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Input('wpsg_mod_downloadprodukte_raid', __('Meldung wenn kein Download mehr mÃ¶glich ist', 'wpsg'), $this->get_option('wpsg_mod_downloadprodukte_raid'), array('help' => 'wpsg_mod_downloadprodukte_raid')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadprodukte_zip', __('Gezippte Auslieferung', 'wpsg'), $this->get_option('wpsg_mod_downloadprodukte_zip'), array('help' => 'wpsg_mod_downloadprodukte_zip')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Input('wpsg_mod_downloadprodukte_ziptemp', __('Verzeichnis fÃŒr temporÃ€res Archiv (Standard /tmp)', 'wpsg'), $this->get_option('wpsg_mod_downloadprodukte_ziptemp'), array('help' => 'wpsg_mod_downloadprodukte_ziptemp')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadprodukte_einsplusx', __('Mehr als ein Produkt im Warenkorb zulassen', 'wpsg'), $this->get_option('wpsg_mod_downloadprodukte_einsplusx'), array('help' => 'wpsg_mod_downloadprodukte_einsplusx')); ?>
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_downloadprodukte_shipping', __('Versandart "Versand per Mail" aktiv', 'wpsg'), $this->get_option('wpsg_mod_downloadprodukte_shipping'), array('help' => 'wpsg_mod_downloadprodukte_shipping')); ?>
+
+	
+	
+ 				
+
+	
+	
+			
+
+	
+	
+		
+	
+	
+
+	
+	
Index: /views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml	(revision 8528)
+++ /views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml	(revision 5261)
@@ -1,11 +1,3 @@
-<?php 
-    /*
-     *  Mailtemplate fÃŒr das DownloadProdukt 
-     */
-
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['customer']['title']], $this->view['customer']['vname'], $this->view['customer']['name']); ?>
+<?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['customer']['vname']; ?> <?php echo $this->view['customer']['name']; ?> 
 
 <?php echo __("Ihre Bezahlung zu der Bestellung", "wpsg"); ?> <?php echo $this->view['order']['onr'] ?> <?php echo __("ist bei uns eingegangen.", "wpsg"); ?>
Index: /views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml
===================================================================
--- /views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml	(revision 8528)
+++ /views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml	(revision 5261)
@@ -1,5 +1,3 @@
-<?php include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml'); ?>
-
-<p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['customer']['vname']; ?> <?php echo $this->view['customer']['name']; ?></p>
+<p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['customer']['vname']; ?> <?php echo $this->view['customer']['name']; ?></p> 
 
 <p><?php echo __("Ihre Bezahlung zu der Bestellung", "wpsg"); ?> <?php echo $this->view['order']['onr'] ?> <?php echo __("ist bei uns eingegangen.", "wpsg"); ?></p>
Index: ews/mods/mod_export/fields.phtml
===================================================================
--- /views/mods/mod_export/fields.phtml	(revision 8528)
+++ 	(revision )
@@ -1,172 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 03.11.2016
-     * Time: 14:12
-     */
-
-    $inlineEdit_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1&profil_id='.$this->view['profil']['id'];
-
-?>
-<table class="table table-body-striped" id="wpsg_mod_export_fieldtable">
-    <thead>
-        <tr>
-            <th class="wpsg_mod_export_col_name"><?php echo __('Spaltenname', 'wpsg'); ?></th>
-            <th class="wpsg_mod_export_col_value"><?php echo __('Wert', 'wpsg'); ?></th>
-            <th class="wpsg_mod_export_col_format"><?php echo __('Format', 'wpsg'); ?></th>
-            
-            <th style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_XML)?'table-cell':'none'); ?>;" title="<?php echo __('Feld im XML als Attribut exportieren', 'wpsg'); ?>" class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_XML; ?> wpsg_mod_export_col_att"><?php echo __('Att'); ?></th>            
-            <th style="display:<?php echo (($this->view['profil']['format'] != wpsg_mod_export::FORMAT_XML)?'table-cell; padding:0px':'none'); ?>;" class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>">&nbsp;</th>
-            
-            <th class="wpsg_mod_export_col_remove">
-                
-                <a style="float:right;" onclick="return wpsg_mod_export_addField(<?php echo $this->view['profil']['id']; ?>);" title="<?php echo __('Neues Feld einfÃŒgen', 'wpsg'); ?>" href="#" class="glyphicon glyphicon-plus"></a>
-                
-            </th>
-        </tr>
-    </thead>
-
-    <?php $i = 0; foreach ((array)$this->view['profil']['fields'] as $f_id => $f) { $i ++; ?>
-    <tbody id="field_<?php echo $f_id; ?>">
-        <tr class="wpsg_tablerow wpsg_mod_export_row1 wpsg_mod_export_fieldrow_<?php echo $f_id; ?> <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
-            
-            <td class="wpsg_mod_export_col">
-                <div class="name wpsg_editable" id="field_name_<?php echo $f_id; ?>"><?php echo $f['name']; ?></div>
-            </td>
-            <td class="wpsg_mod_export_col_field"><div class="wpsg_editable" id="field_typ_<?php echo $f_id; ?>"><?php
-    
-                foreach ($this->view['fields'] as $fieldgroup) {
-    
-                    foreach ($fieldgroup['fields'] as $field_key => $field) {
-    
-                        if ($field_key == $f['value_key']) {
-                            
-                            echo $field;
-                            
-                        }
-    
-                    }
-    
-                }
-    
-            ?></div></td>
-            <td class="wpsg_mod_export_col_format">
-                
-                <div class="wpsg_editable" id="field_format_<?php echo $f_id; ?>"><?php echo $this->view['arFieldFormats'][$f['format']]; ?></div>
-            
-            </td> 
-            
-            <td style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_XML)?'table-cell':'none'); ?>;" class="wpsg_mod_export_col_att wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_XML; ?>">
-                
-                <input type="checkbox" onchange="wpsg_mod_export_setAtt(this, <?php echo $f['id']; ?>);" value="1" <?php echo ((wpsg_isSizedInt($f['xml_att']))?'checked="checked"':''); ?> />
-                                
-            </td>
-            <td style="display:<?php echo (($this->view['profil']['format'] != wpsg_mod_export::FORMAT_XML)?'table-cell; padding:0px':'none'); ?>;" class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>">&nbsp;</td>
-                        
-            <td>
-                
-                <a style="float:right;" onclick="return wpsg_mod_export_removeField(<?php echo $f_id; ?>);" title="<?php echo __('Feld lÃ¶schen', 'wpsg'); ?>" href="#" class="glyphicon glyphicon-trash"></a>
-                               
-            </td>
-            
-        </tr>
-        <tr id="staticformat_<?php echo $f_id; ?>" style="<?php echo (($f['value_key'] != 'general_static')?'display:none;':''); ?>" class="wpsg_mod_export_row2 wpsg_tablerow wpsg_mod_export_fieldrow_<?php echo $f_id; ?> <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
-            <td class="wpsg_mod_export_col_format_user" colspan="4">
-                
-                <?php echo __('Statischer Wert', 'wpsg'); ?>:
-                
-                <div class="wpsg_editable" id="field_static_<?php echo $f_id; ?>"><?php echo wpsg_hspc(wpsg_getStr($f['static'])); ?></div>
-                
-            </td>
-            <td></td>
-        </tr>
-        <tr id="userformatrow_<?php echo $f_id; ?>" style="<?php echo (($f['format'] != 700)?'display:none;':''); ?>" class="wpsg_mod_export_row2 wpsg_tablerow wpsg_mod_export_fieldrow_<?php echo $f_id; ?> <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
-            <td class="wpsg_mod_export_col_format_user" colspan="4">                
-            
-                <?php echo __('Format', 'wpsg'); ?>:
-                
-                <div class="wpsg_editable" id="field_userformat_<?php echo $f_id; ?>"><?php echo wpsg_hspc(wpsg_getStr($f['userformat'])); ?></div>
-            
-            </td>
-            <td style="position:relative;">
-                
-                <a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_export_userformat" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_export_userformat" data-wpsg-tip="mod_export_userformat" class="glyphicon glyphicon-question-sign" style="float:right;"></a>
-               
-                <script type="text/javascript">/* <![CDATA[ */
-                
-                    jQuery(document).ready(function() {
-                        
-                        jQuery('#field_name_<?php echo $f_id; ?>').wpsg_editable('<?php echo $inlineEdit_url; ?>', { } );
-                        
-                        jQuery('#field_typ_<?php echo $f_id; ?>').wpsg_editable('<?php echo $inlineEdit_url; ?>', { 
-                            'type': 'multiarray',
-                            'data': '<?php echo addslashes(json_encode($this->view['fields'], JSON_UNESCAPED_SLASHES)); ?>',
-                            'callback': function(response, newValue) {
-								
-								if (newValue === 'general_static') jQuery('#staticformat_<?php echo $f_id; ?>').show();
-								else jQuery('#staticformat_<?php echo $f_id; ?>').hide();
-								
-                            }
-                        } );
-                        
-                        jQuery('#field_format_<?php echo $f_id; ?>').wpsg_editable('<?php echo $inlineEdit_url; ?>', {
-                            'type': 'select',
-                            'data': <?php echo wpsg_prepare_for_inlineEdit($this->view['arFieldFormats']); ?>,
-                            'callback': function(response, newValue) {
-                                
-                                if (newValue === "700") jQuery('#userformatrow_<?php echo $f_id; ?>').show();
-                                else jQuery('#userformatrow_<?php echo $f_id; ?>').hide();
-                                
-                            }
-                        } );
-                        
-                        jQuery('#field_userformat_<?php echo $f_id; ?>').wpsg_editable('<?php echo $inlineEdit_url; ?>', { } );
-                        
-						jQuery('#field_static_<?php echo $f_id; ?>').wpsg_editable('<?php echo $inlineEdit_url; ?>', { } );
-						
-                    } );
-                
-                /* ]]> */</script>
-                
-            </td>
-        </tr>
-    </tbody>
-    <?php } ?>
-
-</table>
-
-<script type="text/javascript">/* <![CDATA[ */
-    
-    wpsg_ajaxBind();
-
-    jQuery("#wpsg_mod_export_fieldtable").sortable( { 
-        helper: wpsg_Tablefix,
-        items: 'tbody',
-        handler: '.wpsg_id',
-        update: function(event, ui) {
-
-            var wpsg_reorder = jQuery(this).sortable('serialize');
-            
-            jQuery.ajax( {
-                url: '<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=wpsg_mod_export_reorder&noheader=1&profil_id='.$this->view['profil']['id']; ?>',
-                data: { 
-                    wpsg_reorder: wpsg_reorder
-                },
-                success: function(data) {
-
-                    if (data !== "1") alert(data);
-                    
-                }
-            } );
-            
-        }} 
-    ).disableSelection();
-    
-/* ]]> */</script>
-
-<style>
-
-    .wpsg_mod_export_col_format { min-width:100px; }
-    
-</style>
Index: ews/mods/mod_export/order_index_tab.phtml
===================================================================
--- /views/mods/mod_export/order_index_tab.phtml	(revision 8528)
+++ 	(revision )
@@ -1,35 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration des Produktexportes in die Bestellvarwaltung im unteren Bereich
-	 */
-
-?>
-<form class="container-fluid form-horizontal" method="post" action="<?php echo WPSG_URL_WP ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=handleExport&noheader=1" onsubmit="wpsg_mod_export_serializefilter();">
-
-    <div class="row">
-		<div class="col-lg-4">
-
-            <?php foreach ($this->view['wpsg_mod_export']['arProfile'] as $p) { ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_export_profile[]', $p['name'], false, array('value' => $p['id'], 'noHidden' => true)); ?>
-            <?php } ?>
-
-            <br /><?php echo wpsg_drawForm_SubmitButton(__('Export starten')); ?>
-
-        </div>
-    </div>
-
-    <input type="hidden" name="filter" id="wpsg_mod_export_filter" value="" />
-
-</form>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-    function wpsg_mod_export_serializefilter()
-    {
-
-        jQuery('#wpsg_mod_export_filter').val(jQuery('#filter_form').serialize());
-
-    }
-
-/* ]]> */</script>
Index: ews/mods/mod_export/product_index_tab.phtml
===================================================================
--- /views/mods/mod_export/product_index_tab.phtml	(revision 8528)
+++ 	(revision )
@@ -1,57 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Integration der Profilauswahl in die Produktverwaltung (Ãbersicht)
-     */
-
-    $arProfile = $this->callMod('wpsg_mod_export', 'getProfile', array(wpsg_mod_export::TYPE_PRODUCT));
-
-?>
-
-<?php if (wpsg_isSizedArray($arProfile)) { ?>
-<div class="wpsg-export container-fluid form-horizontal" style="display:none;">
-            
-    <form class="container-fluid form-horizontal" target="_blank" method="post" action="<?php echo WPSG_URL_WP ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=handleExport&noheader=1" onsubmit="wpsg_mod_export_serializefilter();">
-
-    <div class="row">
-		<div class="col-lg-4">
-
-            <?php foreach ($arProfile as $p) { ?>
-                <?php echo wpsg_drawForm_Checkbox('wpsg_mod_export_profile[]', $p['name'], false, array('value' => $p['id'], 'noHidden' => true)); ?>
-            <?php } ?>
-
-            <br /><?php echo wpsg_drawForm_SubmitButton(__('Export starten')); ?>
-
-        </div>
-    </div>
-
-    <input type="hidden" name="filter" id="wpsg_mod_export_filter" value="" />
-
-</form>
-        
-</div>
-
-<script type="text/javascript">/* <![CDATA[ */
-           
-    function wpsg_mod_export_serializefilter()
-    {
-
-        jQuery('#wpsg_mod_export_filter').val(jQuery('#filter_form').serialize());
-
-    }
-    
-    jQuery(document).ready(function() {
-        
-        jQuery('.wpsg_showhide_export').off('click').on('click', function() {
-            
-            jQuery(this).toggleClass('active');
-            jQuery('.wpsg-export').toggle(250);
-            
-            return false;
-            
-        } );
-        
-    } );
-
-/* ]]> */</script>
-<?php } ?>
Index: /views/mods/mod_export/produkt_index_aftersearch.phtml
===================================================================
--- /views/mods/mod_export/produkt_index_aftersearch.phtml	(revision 5261)
+++ /views/mods/mod_export/produkt_index_aftersearch.phtml	(revision 5261)
@@ -0,0 +1,65 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des Produktexportes in die Bestellvarwaltung im unteren Bereich
+	 */
+
+?>
+<script type="text/javascript">/* <![CDATA[ */
+
+    /**
+     * Startet den Export, dazu wird der obere Filter miÃbraucht
+     */
+	function wpsg_mod_export_do() 
+	{
+
+		var arProfileIDs = Array();
+
+		jQuery('.wpsg_mod_export_profilid:checked').each(function() {
+
+			arProfileIDs.push(jQuery(this).val());
+			 
+		} );
+
+		if (arProfileIDs.length <= 0)
+		{
+
+			alert('<?php echo __('Bitte mindestens ein Profil zum exportieren wÃ€hlen.', 'wpsg'); ?>');
+			return false;
+			
+		}
+
+		jQuery('#wpsg_mod_export_profile').val(arProfileIDs.join(',')); 
+		jQuery('#submit_export').val('1');
+		jQuery('#wpsg_order_index_noheader_filter').attr('name', 'noheader');
+		jQuery('#filter_form').attr('target', '_new');
+
+		jQuery('#filter_form').submit();
+
+		jQuery('#wpsg_order_index_noheader_filter').attr('name', '');
+		jQuery('#submit_export').val('0');
+		jQuery('#filter_form').attr('target', '');
+
+		return false;
+		
+	} // function wpsg_mod_export_do() 			
+             
+/* ]]> */</script>
+ 
+<div class="metabox-holder" id="wpsg_mod_export_layer" style="<?php echo (($_COOKIE['wpsg_mod_export_layer'] == '1')?'display:block;':'display:none;'); ?>padding-top:0px;">
+	<div id="wpsg_modexport" class="postbox">		
+		<h3 class="wpsg_handlediv">
+			<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br></span>
+			<span><?php echo __('Bestellexport', 'wpsg'); ?></span>
+		</h3>
+		<div class="inside">
+			<?php foreach ($this->view['wpsg_mod_export']['arProfile'] as $p) { ?>
+			<label class="wpsg_mod_export_profillabel">
+				<input type="checkbox" class="wpsg_mod_export_profilid" value="<?php echo $p['id']; ?>" type="checkbox" />&nbsp;<?php echo __($p['name'], 'wpsg'); ?>
+			</label>			
+			<?php } ?>
+			<div class="wpsg_clear"></div><br />
+			<input type="submit" onclick="return wpsg_mod_export_do();" value="<?php echo __('Export starten', 'wpsg'); ?>" class="button" name="submit_export" />
+		</div>
+	</div>
+</div>
Index: /views/mods/mod_export/produkt_index_head.phtml
===================================================================
--- /views/mods/mod_export/produkt_index_head.phtml	(revision 5261)
+++ /views/mods/mod_export/produkt_index_head.phtml	(revision 5261)
@@ -0,0 +1,13 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration der Exportprofile in die Ãbersicht der Bestellungen
+	 */
+
+?>  
+<input type="hidden" name="submit_export" id="submit_export" value="" />
+<input type="hidden" id="wpsg_mod_export_profile" name="wpsg_mod_export_profile" value="" />
+
+<label>
+	<input type="checkbox" <?php echo (($_COOKIE['wpsg_mod_export_layer'] == '1')?'checked="checked"':''); ?> onclick="if (jQuery(this).attr('checked') == 'checked') { jQuery('#wpsg_mod_export_layer').show(); jQuery.cookie('wpsg_mod_export_layer', '1'); } else { jQuery('#wpsg_mod_export_layer').hide(); jQuery.cookie('wpsg_mod_export_layer', null); }" />&nbsp;<?php echo __('Bestellexport', 'wpsg'); ?>
+</label>
Index: /views/mods/mod_export/profil.phtml
===================================================================
--- /views/mods/mod_export/profil.phtml	(revision 8528)
+++ /views/mods/mod_export/profil.phtml	(revision 5261)
@@ -5,313 +5,283 @@
 	 */
 
-	$inlineEdit_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1&profil_id='.$this->view['profil']['id'];    
-	$upload_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=musterupload&noheader=1&profil_id='.$this->view['profil']['id'];
-    $download_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=save&noheader=1&profil_id='.$this->view['profil']['id'];
-
 ?>
 
-<div id="wpsg_mod_export_profil_tab">	
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Profiloptionen', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Feldkonfiguration', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab3" aria-controls="cron" role="tab" data-toggle="tab"><?php echo __('Automatische AusfÃŒhrung', 'wpsg'); ?></a></li>
-    </ul>
-	<div class="tab-content">
-		<div id="tab1" role="tabpanel" class="tab-pane active">
-            
-            <?php echo wpsg_drawForm_Text(__('Profilname', 'wpsg'), $this->view['profil']['name'], 'name', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-            <?php echo wpsg_drawForm_Text(__('Dateiname', 'wpsg'), $this->view['profil']['filename'], 'filename', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-            <?php echo wpsg_drawForm_Text(__('Encoding', 'wpsg'), $this->view['arFileEncoding'][$this->view['profil']['file_encoding']], 'file_encoding', array('inlineEdit' => true, 'inlineEdit_type' => 'select', 'inlineEdit_source' => $this->view['arFileEncoding'], 'inlineEdit_url' => $inlineEdit_url)); ?>
-            <?php echo wpsg_drawForm_Text(__('Dateiformat', 'wpsg'), $this->view['arExportFormats'][$this->view['profil']['format']], 'format', array('inlineEdit' => true, 'inlineEdit_type' => 'select', 'inlineEdit_source' => $this->view['arExportFormats'], 'inlineEdit_url' => $inlineEdit_url)); ?>
-            
-            <?php /* CSV */ ?>
-            <div class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>" style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_CSV)?'block':'none'); ?>;">
-                
-                <?php echo wpsg_drawForm_Text('Feld-Trennzeichen', $this->view['profil']['field_delimiter'], 'field_delimiter', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                <?php echo wpsg_drawForm_Text('Feld-Begrenzung', $this->view['profil']['field_enclosure'], 'field_enclosure', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                <?php echo wpsg_drawForm_Text('Maskierungs-Zeichen', $this->view['profil']['field_escape'], 'field_escape', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                
-            </div>
-            
-            <?php /* XML */ ?>
-            <div class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_XML; ?>" style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_XML)?'block':'none'); ?>;">
-            
-                <?php echo wpsg_drawForm_Text('Root-Tagname', $this->view['profil']['xml_roottag'], 'xml_roottag', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                
-                <?php if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_ORDER) { ?>
-                    <?php echo wpsg_drawForm_Text('Bestellung-Tagname', $this->view['profil']['xml_ordertag'], 'xml_ordertag', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                    <?php echo wpsg_drawForm_Text('Produkt-Root-Tagname', $this->view['profil']['xml_productroottag'], 'xml_productroottag', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                <?php } ?>
-                
-                <?php if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_CUSTOMER) { ?>
-                    <?php echo wpsg_drawForm_Text('Kunden-Tagname', $this->view['profil']['xml_customertag'], 'xml_customertag', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                <?php } else { ?>
-                    <?php echo wpsg_drawForm_Text('Produkt-Tagname', $this->view['profil']['xml_producttag'], 'xml_producttag', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                <?php } ?>
-                
-            </div>
-            
-            <div class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>" style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_CSV)?'block':'none'); ?>">
-                <?php echo wpsg_drawForm_Upload('samplefile', __('Muster Vorlage', 'wpsg'), false, '50', '100000', array('ajax_upload' => true, 'ajax_upload_url' => $upload_url, 'ajax_success' => 'samplefile_success')); ?>                
-            </div>
-                        
-            <br />
-    
-            <?php if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_ORDER) { ?>              
-                
-                <?php echo wpsg_drawForm_Checkbox('order_onetime', __('Bestellungen nur einmalig exportieren', 'wpsg'), $this->view['profil']['order_onetime'], array('label' => __('Optionen', 'wpsg'), 'inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                
-                <div class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>" style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_CSV)?'block':'none'); ?>">
-                <?php echo wpsg_drawForm_Checkbox('order_online', __('Eine Zeile pro Bestellung', 'wpsg'), $this->view['profil']['order_online'], array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                </div>
-            
-            <?php } ?>
-
-            <?php if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_PRODUCT) { ?>    
-
-                <div class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>" style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_CSV)?'block':'none'); ?>">
-                    
-                    <?php echo wpsg_drawForm_Checkbox('csv_pvariants_separated', __('Produkte variantengetrennt exportieren', 'wpsg'), $this->view['profil']['csv_pvariants_separated'], array('label' => __('Optionen', 'wpsg'), 'help' =>'wpsg_csv_pvariants_separated', 'inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                    
-                </div>
-
-            <?php } ?>
-                
-            <div class="wpsg_mod_export_format wpsg_mod_export_format_<?php echo wpsg_mod_export::FORMAT_CSV; ?>" style="display:<?php echo (($this->view['profil']['format'] == wpsg_mod_export::FORMAT_CSV)?'block':'none'); ?>">
-                
-                <?php echo wpsg_drawForm_Checkbox('csv_fieldnames', __('Spaltennamen in erster Zeile', 'wpsg'), $this->view['profil']['csv_fieldnames'], array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                
-            </div>
-
-        </div>
-        
-        <div id="tab2" role="tabpanel" class="tab-pane">
-            
-            <div id="wpsg_mod_export_fields"><?php echo $this->view['strFields']; ?></div>
-            
-        </div>
-        
-        <div id="tab3" role="tabpanel" class="tab-pane">
-             
-            <?php echo wpsg_drawForm_Text(__('Automatische AusfÃŒhrung aktivieren', 'wpsg'), $this->view['arCronTypes'][$this->view['profil']['cron_interval']], 'cron_interval', array('inlineEdit' => true, 'inlineEdit_callback' => 'switchCronType', 'inlineEdit_url' => $inlineEdit_url, 'inlineEdit_type' => 'select', 'inlineEdit_source' => wpsg_prepare_for_inlineEdit($this->view['arCronTypes']))); ?>
-                                    
-            <div class="cron_interval cron_interval_1" style="<?php echo (($this->view['profil']['cron_interval'] == '0')?'display:none;':''); ?>">
-                 
-                <?php echo wpsg_drawForm_Text(__('Pfad', 'wpsg'), $this->view['profil']['cron_path'], 'cron_path', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>                
-                <?php echo wpsg_drawForm_Text(__('Letzte AusfÃŒhrung', 'wpsg'), (($this->view['profil']['cron_lastrun'] == '0000-00-00')?__('Noch nie', 'wpsg'):wpsg_formatTimestamp($this->view['profil']['cron_lastrun'], true)), false, array('noP' => false)); ?>
+<?php echo $this->writeBackendMessage(); ?>
+
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export[name]"><?php echo __('Profilname', 'wpsg'); ?>:</label>
+	</div>
+	<div style="width:350px;" class="wpsg_form_right wpsg_editable" id="wpsg_mod_export_profilname"><?php echo $this->view['profil']['name']; ?></div>
+	<a style="float:right;" onclick="return wpsg_mod_export_removeProfil(<?php echo $this->view['profil']['id']; ?>);" title="<?php echo __('Profil lÃ¶schen', 'wpsg'); ?>" href="#" class="wpsg_icon wpsg_icon_remove"></a>
+	<div class="wpsg_clear"></div>
+</div>
+<script type="text/javascript">
+
+	jQuery('#wpsg_mod_export_profilname').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', {
+		submitdata: { 
+			field: 'name',
+			profil_id: '<?php echo $this->view['profil']['id']; ?>'
+		}, 					
+		submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+		placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+		indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+		tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+	});	
+
+</script>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export[filename]"><?php echo __('Dateiname', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right wpsg_editable" id="wpsg_mod_export_filename"><?php echo @$this->view['profil']['data']['filename']; ?></div>
+	<div class="wpsg_clear"></div>
+</div>
+<script type="text/javascript">
+
+	jQuery('#wpsg_mod_export_filename').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', {
+		submitdata: { 
+			field: 'filename',
+			profil_id: '<?php echo $this->view['profil']['id']; ?>'
+		}, 					
+		submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+		placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+		indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+		tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+	});	
+
+</script>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export[separator]"><?php echo __('Trennzeichen', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right wpsg_editable" id="wpsg_mod_export_separator"><?php echo @$this->view['profil']['data']['separator']; ?></div>
+	<div class="wpsg_clear"></div>
+</div>
+<script type="text/javascript">
+
+	jQuery('#wpsg_mod_export_separator').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', {
+		submitdata: { 
+			field: 'separator',
+			profil_id: '<?php echo $this->view['profil']['id']; ?>'
+		}, 					
+		submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+		placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+		indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+		tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+	});	
+
+</script>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export_oneline"><?php echo __('Eine Zeile pro Bestellung', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<input style="width:auto;" type="checkbox" <?php echo ((@$this->view['profil']['data']['oneline'] == '1')?'checked="checked"':''); ?> value="1" onchange="" id="wpsg_mod_export_oneline" /></div>
+	<div class="wpsg_clear"></div>
+</div>
+<script type="text/javascript">
+
+	jQuery('#wpsg_mod_export_oneline').bind('change', function() {
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1',
+			data: {
+				field: 'oneline',
+				value: ((jQuery('#wpsg_mod_export_oneline').attr("checked") == 'checked')?'1':'0'),
+				profil_id: '<?php echo $this->view['profil']['id']; ?>'
+			}
+		} );
+	} );
+
+</script>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export_firstlinecolname"><?php echo __('Spaltennamen in erster Spalte', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<input style="width:auto;" type="checkbox" <?php echo ((@$this->view['profil']['data']['firstlinecolname'] == '1')?'checked="checked"':''); ?> value="1" onchange="" id="wpsg_mod_export_firstlinecolname" id="wpsg_mod_export_firstlinecolname" /></div>
+	<div class="wpsg_clear"></div>
+</div>
+<script type="text/javascript">
+
+	jQuery('#wpsg_mod_export_firstlinecolname').bind('change', function() {
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1',
+			data: {
+				field: 'firstlinecolname',
+				value: ((jQuery('#wpsg_mod_export_firstlinecolname').attr("checked") == 'checked')?'1':'0'),
+				profil_id: '<?php echo $this->view['profil']['id']; ?>'
+			}
+		} );
+	} );
+
+</script>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export_iso"><?php echo __('Dateiformat (Import wie Export)', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<select name="wpsg_mod_export_iso" id="wpsg_mod_export_iso">
+			<option value="0" <?php echo ((@$this->view['profil']['data']['iso'] != '1')?'selected="selected"':''); ?>><?php echo __('UTF-8', 'wpsg'); ?></option>
+			<option value="1" <?php echo ((@$this->view['profil']['data']['iso'] == '1')?'selected="selected"':''); ?>><?php echo __('ISO-8859-1', 'wpsg'); ?></option>
+		</select>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
+
+<br />
+
+<script type="text/javascript">
+
+	jQuery('#wpsg_mod_export_iso').bind('change', function() {
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1',
+			data: {
+				field: 'iso',
+				value: jQuery('#wpsg_mod_export_iso').val(),
+				profil_id: '<?php echo $this->view['profil']['id']; ?>'
+			}
+		} );
+	} );
+
+</script>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_export_iso"><?php echo __('Muster Vorlage (csv Datei)', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<iframe name="wpsg_mod_export_upload_frame" style="display:none;"></iframe>
+		<form action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=musterupload&noheader=1&profil_id=<?php echo $this->view['profil']['id']; ?>" target="wpsg_mod_export_upload_frame" method="post" enctype="multipart/form-data">
+			<input style="float:left; width:auto;" type="file" name="wpsg_mod_export_muster" />
+			<input style="float:right; width:auto;" type="submit" value="<?php echo __('Hochladen', 'wpsg'); ?>" />
+		</form> 
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
+<br />
+<table class="wpsg_mod_export_fieldlist" cellpadding="0" cellspacing="0">
+	<tr>
+		<th class="wpsg_mod_export_col_name"><?php echo __('Spaltenname', 'wpsg'); ?></th>
+		<th class="wpsg_mod_export_col_value"><?php echo __('Wert', 'wpsg'); ?></th>
+		<th class="wpsg_mod_export_col_format"><?php echo __('Format', 'wpsg'); ?></th>
+		<th class="wpsg_mod_export_col_remove"></th>
+	</tr>
+	<?php $i = 0; foreach ((array)$this->view['profil']['data']['fields'] as $f_key => $f) { $i ++; ?>
+	<tr class="wpsg_tablerow wpsg_mod_export_row1 wpsg_mod_export_fieldrow_<?php echo $f_key; ?> <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+		<td class="wpsg_mod_export_col_name wpsg_editable" id="field_name_<?php echo $f_key; ?>"><?php echo $f['name']; ?></td>
+		<td class="wpsg_mod_export_col_field wpsg_editable" id="field_typ_<?php echo $f_key; ?>"><?php
+		 
+			foreach ($this->view['fields'] as $fieldgroup)
+			{
 				
-                <fieldset id="wpsg_mod_export_cron_url" style="display:<?php echo (($this->view['profil']['cron_interval'] !== wpsg_mod_export::CRON_ORDER)?'block':'none'); ?>;">
-                    <?php echo wpsg_drawForm_Text(__('Cron URL', 'wpsg'), '<a href="'.site_url().'/?wpsg_cron=1">'.site_url().'/?wpsg_cron=1</a>', false, array('noP' => false)); ?>
-                </fieldset>
-
-                <?php echo wpsg_drawForm_Checkbox('wp_cron', __('StÃŒndlich mit Wordpress Cron ausfÃŒhren', 'wpsg'), ($this->view['profil']['wp_cron']??'0') === '1'); ?>
-
-                <script>
-
-                    document.getElementById('wp_cron').addEventListener('change', (event) => {
-
-                        jQuery.ajax({
-                            url: '<?php echo $inlineEdit_url; ?>',
-                            data: {
-                                name: 'wp_cron',
-                                value: ((event.target.checked === true)?'1':'0')
-                            }
-                        })
-
-                       // console.log('<?php echo $inlineEdit_url; ?>');
-
-                    });
-
-                </script>
-
-                <?php if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_ORDER) { ?>
-                <fieldset id="wpsg_mod_export_orderfilter" style="display:<?php echo (($this->view['profil']['cron_interval'] !== wpsg_mod_export::CRON_ORDER)?'block':'none'); ?>;">                                                
-                    
-                    <legend><div class="col-sm-offset-6"><?php echo __('Bestellfilter', 'wpsg'); ?></div></legend>
-                    
-                    <form id="wpsg_mod_export_searchfilter">
-                        
-                        <?php echo wpsg_drawForm_Text(__('Suchfeld', 'wpsg'), wpsg_getStr($this->view['profil']['orderfilter']['s']), 'orderfilter_s', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>                    
-                        <?php echo wpsg_drawForm_Text(__('Kunde (ID)', 'wpsg'), wpsg_getStr($this->view['profil']['orderfilter']['k_id']), 'orderfilter_k_id', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                        
-                        <?php $arOrderStatus = wpsg_array_merge(array('-1' => __('Alle', 'wpsg')), $this->arStatus); ?>
-                        <?php echo wpsg_drawForm_Text(__('Bestellstatus', 'wpsg'), $arOrderStatus[wpsg_getStr($this->view['profil']['orderfilter']['status'], '-1')], 'orderfilter_status', array('inlineEdit' => true, 'inlineEdit_type' => 'select', 'inlineEdit_url' => $inlineEdit_url, 'inlineEdit_source' => $arOrderStatus)); ?>
-                                            
-                        <?php $arMonth = array('-1' => __('Alle', 'wpsg')); ?>
-                        <?php for ($i = 1; $i <= 12; $i ++) { $arMonth[str_pad($i, 2, '0', STR_PAD_LEFT)] = wpsg_strftime("%B", mktime(0, 0, 0, $i, 1, 2000)); } ?>
-                        
-                        <?php $arYearCdate = array('-1' => __('Alle', 'wpsg')); ?>
-                        <?php foreach ($this->view['cdate_years'] as $y) { $arYearCdate[$y] = $y; } ?>
-                        
-                        <?php $arYearInvoice = array('-1' => __('Alle', 'wpsg')); ?>
-                        <?php foreach ($this->view['invoicedate_years'] as $y) { $arYearInvoice[$y] = $y; } ?>
-                        
-                        <?php echo wpsg_drawForm_TextStart(); ?>
-                        <div class="row">
-                            <div class="col-lg-6">
-                                <p id="orderfilter_cdate_m" class="form-control-static"><?php echo $arMonth[wpsg_getStr($this->view['profil']['orderfilter']['cdate_m'], '-1')]; ?></p>
-                                <script type="text/javascript">/* <![CDATA[ */
-                                
-                                    jQuery(document).ready(function() {
-                                        
-                                        jQuery('#orderfilter_cdate_m').wpsg_editable('<?php echo $inlineEdit_url; ?>', {
-                                            'test': '1', 'placement': 'bottom', 'type': 'select',  'data': <?php echo wpsg_prepare_for_inlineEdit($arMonth); ?>
-                                        } );
-                                        
-                                    } );
-                                
-                                /* ]]> */</script>
-                            </div>
-                            <div class="col-lg-6">
-                                <p id="orderfilter_cdate_y" class="form-control-static"><?php echo $arYearCdate[wpsg_getStr($this->view['profil']['orderfilter']['cdate_y'], '-1')]; ?></p>
-                                <script type="text/javascript">/* <![CDATA[ */
-                                
-                                    jQuery(document).ready(function() {
-                                        
-                                        jQuery('#orderfilter_cdate_y').wpsg_editable('<?php echo $inlineEdit_url; ?>', {
-                                            'placement': 'bottom', 'type': 'select',  'data': <?php echo wpsg_prepare_for_inlineEdit($arYearCdate); ?>
-                                        } );
-                                        
-                                    } );
-                                
-                                /* ]]> */</script>
-                            </div>
-                        </div>
-                        <?php echo wpsg_drawForm_TextEnd(__('Bestelldatum (Monat/Jahr)', 'wpsg'), array('noP' => true)); ?>
-                        
-                        <?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>
-                        <?php echo wpsg_drawForm_TextStart(); ?>
-                        <div class="row">
-                            <div class="col-lg-6">
-                                <p id="orderfilter_invoicedate_m" class="form-control-static"><?php echo $arMonth[wpsg_getStr($this->view['profil']['orderfilter']['invoicedate_m'], '-1')]; ?></p>                            
-                                <script type="text/javascript">/* <![CDATA[ */
-                                
-                                    jQuery(document).ready(function() {
-                                        
-                                        jQuery('#orderfilter_invoicedate_m').wpsg_editable('<?php echo $inlineEdit_url; ?>', {
-                                            'placement': 'bottom', 'type': 'select',  'data': <?php echo wpsg_prepare_for_inlineEdit($arMonth); ?>
-                                        } );
-                                        
-                                    } );
-                                
-                                /* ]]> */</script>
-                            </div>
-                            <div class="col-lg-6">
-                                <p id="orderfilter_invoicedate_y" class="form-control-static"><?php echo $arYearInvoice[wpsg_getStr($this->view['profil']['orderfilter']['invoicedate_y'], '-1')]; ?></p>                            
-                                <script type="text/javascript">/* <![CDATA[ */
-                                
-                                    jQuery(document).ready(function() {
-                                        
-                                        jQuery('#orderfilter_invoicedate_y').wpsg_editable('<?php echo $inlineEdit_url; ?>', {
-                                            'placement': 'bottom', 'type': 'select',  'data': <?php echo wpsg_prepare_for_inlineEdit($arYearInvoice); ?>
-                                        } );
-                                        
-                                    } );
-                                
-                                /* ]]> */</script>
-                            </div>
-                        </div>
-                        <?php echo wpsg_drawForm_TextEnd(__('Rechnungsdatum (Monat/Jahr)', 'wpsg'), array('noP' => true)); ?>
-                        <?php } ?>
-                        
-                    </form>
-                    
-                </fieldset>
-                <?php } else if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_PRODUCT) { ?>
-                <fieldset id="wpsg_mod_export_productfilter">                                                
-                    
-                    <legend><div class="col-sm-offset-6"><?php echo __('Produktfilter', 'wpsg'); ?></div></legend>
-                    
-                    <form id="wpsg_mod_export_searchfilter">
-                                         
-                        <?php echo wpsg_drawForm_Text(__('Suchfeld', 'wpsg'), wpsg_getStr($this->view['profil']['orderfilter']['s']), 'orderfilter_s', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                        
-                        <?php if ($this->hasMod('wpsg_mod_productgroups')) { $arProductGroupSelect = array('-1' => __('Alle Produktgruppen', 'wpsg')) + wpsg_productgroup::getProductgroupSelect(); ?>                        
-                        <?php echo wpsg_drawForm_Text(__('Produktgruppe', 'wpsg'), $arProductGroupSelect[wpsg_getStr($this->view['profil']['orderfilter']['productgroup_ids'], '-1')], 'orderfilter_productgroup_ids', array('inlineEdit' => true, 'inlineEdit_type' => 'select', 'inlineEdit_url' => $inlineEdit_url, 'inlineEdit_source' => $arProductGroupSelect)); ?>
-                        <?php } ?>
-                        
-                        <?php if ($this->hasMod('wpsg_mod_produktartikel')) { $temp = $this->callMod('wpsg_mod_produktartikel', 'getProductcategorySelect', array()); ?>
-                        <?php $arProductCategorySelect = array(); foreach ($temp as $k => $v) $arProductCategorySelect[$v['term_id']] = $v['label']; ?>
-                        <?php $productCategoryIds = wpsg_getStr($this->view['profil']['orderfilter']['productcategory_ids'], '-1'); ?>
-                        <?php $selectedCategory = $arProductCategorySelect['-1'] ?? ''; ?>
-                        <?php echo wpsg_drawForm_Text(__('Produktkategorie', 'wpsg'), $arProductCategorySelect[$productCategoryIds], 'orderfilter_productcategory_ids', array('inlineEdit' => true, 'inlineEdit_type' => 'select', 'inlineEdit_url' => $inlineEdit_url, 'inlineEdit_source' => $arProductCategorySelect)); ?>
-                        <?php } ?>
-                                                
-                    </form>
-                    
-                </fieldset>
-                <?php } else if ($this->view['profil']['export_type'] === wpsg_mod_export::TYPE_CUSTOMER) { ?>
-                <fieldset id="wpsg_mod_export_productfilter">
-                    
-                    <legend><div class="col-sm-offset-6"><?php echo __('Kundenfilter', 'wpsg'); ?></div></legend>
-                    
-                    <form id="wpsg_mod_export_searchfilter">
-                        
-                        <?php echo wpsg_drawForm_Text(__('Suchfeld', 'wpsg'), wpsg_getStr($this->view['profil']['orderfilter']['s']), 'orderfilter_s', array('inlineEdit' => true, 'inlineEdit_url' => $inlineEdit_url)); ?>
-                        
-                    </form>
-                    
-                </fieldset>
-                <?php } ?>
-                
-            </div>
-            
-        </div>
-        
-    </div>
-</div>
-
-<br />
-
-<a onclick="return wpsg_mod_export_removeProfil(<?php echo $this->view['profil']['id']; ?>);" href="#"><span class="glyphicon glyphicon-trash wpsg-glyphicon"></span><?php echo __('Profil lÃ¶schen', 'wpsg'); ?></a><br />
-<a href="<?php echo $download_url; ?>"><span class="glyphicon glyphicon-save wpsg-glyphicon"></span><?php echo __('Profil speichern', 'wpsg'); ?></a>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-    function switchCronType(response, newValue) {
+				foreach ($fieldgroup['fields'] as $field_key => $field)
+				{
+
+					if ($field_key == $f['value'])
+					{
+						echo $field;
+					}
+					
+				}
+				
+			}			
 		
-		if (parseInt(newValue) === parseInt("<?php echo wpsg_mod_export::CRON_ORDER; ?>")) {
+		?></td>
+		<td class="wpsg_mod_export_col_format wpsg_editable" id="field_format_<?php echo $f_key; ?>"><?php echo $this->view['arFormats'][$f['format']]; ?></td>
+		<td>
+			<a style="float:right;" onclick="return wpsg_mod_export_removeField(<?php echo $this->view['profil']['id']; ?>, <?php echo $f_key; ?>);" title="<?php echo __('Profil lÃ¶schen', 'wpsg'); ?>" href="#" class="wpsg_icon wpsg_icon_remove"></a>				
+		</td>
+	</tr>
+	<tr id="userformatrow_<?php echo $f_key; ?>" style="<?php echo (($f['format'] != 700)?'display:none;':''); ?>" class="wpsg_mod_export_row2 wpsg_tablerow wpsg_mod_export_fieldrow_<?php echo $f_key; ?> <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+		<td class="wpsg_mod_export_col_name"></td>
+		<td class="wpsg_mod_export_col_field_user"><?php echo __('Format:', 'wpsg'); ?></td>
+		<td class="wpsg_mod_export_col_format_user wpsg_editable" id="field_userformat_<?php echo $f_key; ?>"><?php echo wpsg_hspc($f['userformat']); ?></td>
+		<td style="position:relative;">
+			<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_export_userformat" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_export_userformat" class="wpsg_form_help" style="float:right; position:relative;"></a>
+			<script type="text/javascript">
+
+				jQuery('#field_userformat_<?php echo $f_key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', {
+					submitdata: {
+						field: 'fielduserformat_<?php echo $f_key; ?>',
+						profil_id: '<?php echo $this->view['profil']['id']; ?>'
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
 			
-			jQuery('#wpsg_mod_export_cron_url').hide();
-			jQuery('#wpsg_mod_export_orderfilter').hide();
+				jQuery('#field_format_<?php echo $f_key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', { 
+					submitdata: {
+						field: 'fieldformat_<?php echo $f_key; ?>',
+						profil_id: '<?php echo $this->view['profil']['id']; ?>'
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',					
+					data: '<?php echo json_encode($this->view['arFormats']); ?>',
+					type: 'select',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+			    	callback: function(el) {
+				    	if (el == '<?php echo $this->view['arFormats'][700]; ?>')
+				    	{
+					    	jQuery('#userformatrow_<?php echo $f_key; ?>').show();
+				    	}	
+				    	else
+				    	{
+				    		jQuery('#userformatrow_<?php echo $f_key; ?>').hide();
+				    	}			    	
+			    	}
+				});
 			
-        } else {
+				jQuery('#field_name_<?php echo $f_key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', { 
+					submitdata: {
+						field: 'fieldname_<?php echo $f_key; ?>',
+						profil_id: '<?php echo $this->view['profil']['id']; ?>'
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
 			
-			jQuery('#wpsg_mod_export_cron_url').show();
-			jQuery('#wpsg_mod_export_orderfilter').show();
-			
-        }
+				jQuery('#field_typ_<?php echo $f_key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1', { 
+					submitdata: {
+						field: 'fieldtyp_<?php echo $f_key; ?>',
+						profil_id: '<?php echo $this->view['profil']['id']; ?>'
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					data: '<?php echo json_encode($this->view['fields']); ?>',
+					type: 'select',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+					
+			</script>	
+		</td>
+	</tr>
+	<?php } ?>
+</table>
+
+<script type="text/javascript">
+
+	jQuery(document).ready(function() {
 		
-        if (newValue != "0") jQuery('.cron_interval_1').show();
-        else jQuery('.cron_interval_1').hide();
-        
-    }
-    
-    function samplefile_success(data)
-    {
-        
-        jQuery('#wpsg_mod_export_fields').html(data);
-        jQuery('#samplefile').val('');
-
-        jQuery('#wpsg_mod_export_profil_tab .nav-tabs a[href="#tab2"]').tab('show');
-        
-    }
-    
-    jQuery(document).ready(function() {
-		        
-		jQuery('#format').on('save', function(e, params) {
-
-			jQuery('.wpsg_mod_export_format').hide();
-			jQuery('.wpsg_mod_export_format_' + params.newValue).show();
-
-		} );
-        
-        jQuery('#name').on('save', function(e, params) {
-
-            jQuery('#wpsg_mod_export_profil option[value="<?php echo $this->view['profil']['id']; ?>"]').text(params.newValue);
-
+		jQuery('.wpsg_form_help').tipTip();
+
+		jQuery('.wpsg_mod_export_row1').bind('mouseover', function() {
+			jQuery(this).next().addClass('wpsg_tablerow_hover');
+		} ).bind('mouseout', function() {
+			jQuery(this).next().removeClass('wpsg_tablerow_hover');
+		} );
+
+		jQuery('.wpsg_mod_export_row2').bind('mouseover', function() {
+			jQuery(this).prev().addClass('wpsg_tablerow_hover');
+		} ).bind('mouseout', function() {
+			jQuery(this).prev().removeClass('wpsg_tablerow_hover');
 		} );
 		
 	} );
 
-/* ]]> */</script>
+</script>
Index: /views/mods/mod_export/profillist.phtml
===================================================================
--- /views/mods/mod_export/profillist.phtml	(revision 8528)
+++ /views/mods/mod_export/profillist.phtml	(revision 5261)
@@ -5,22 +5,12 @@
 	 */
 
-    $arProfilSelect = array();
-
-    foreach ($this->view['arProfile'] as $p)
-	{
-	
-		$arProfilSelect[$p['id']] = $p['name'];
-		
-		if ($p['export_type'] === wpsg_mod_export::TYPE_ORDER) $arProfilSelect[$p['id']] .= ' ('.__('Bestellexport', 'wpsg').')';
-		else if ($p['export_type'] === wpsg_mod_export::TYPE_PRODUCT) $arProfilSelect[$p['id']] .= ' ('.__('Produktexport', 'wpsg').')';
-		else if ($p['export_type'] === wpsg_mod_export::TYPE_CUSTOMER) $arProfilSelect[$p['id']] .= ' ('.__('Kundenexport', 'wpsg').')';
-		
-	}
-
 ?>
-
 <?php if (sizeof($this->view['arProfile']) > 0) { ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_export[profil]', __('Exportprofile', 'wpsg'), $arProfilSelect, @$this->view['profil_id'], array('id' => 'wpsg_mod_export_profil', 'onchange' => 'wpsg_mod_export_profilSwitch();')); ?>
-<div id="profil_content" style="padding:15px 0px 15px 0px;"></div>
+<select name="wpsg_mod_export[profil]" id="wpsg_mod_export_profil" onchange="wpsg_mod_export_profilSwitch();" style="width:99%;">
+	<?php foreach ($this->view['arProfile'] as $p) { ?>
+	<option value="<?php echo $p['id']; ?>" <?php echo ((isset($this->view['profil_id']) && $p['id'] == $this->view['profil_id'])?'selected="selected"':''); ?>><?php echo $p['name']; ?></option>
+	<?php } ?>
+</select>
+<div id="profil_content" style="padding:5px 0px 5px 0px;"></div>
 <?php } else { ?>
 <p><?php echo __('Bisher noch keine Profile angelegt.', 'wpsg'); ?></p>
Index: /views/mods/mod_export/settings_edit.phtml
===================================================================
--- /views/mods/mod_export/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_export/settings_edit.phtml	(revision 5261)
@@ -6,5 +6,4 @@
 
 ?>
-
 <script type="text/javascript">
 
@@ -28,46 +27,24 @@
 	} // function wpsg_mod_export_profilSwitch()
 
-	function wpsg_mod_export_addField(profil_id)
-	{
-		
-		jQuery('#wpsg_mod_export_fields').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( { 
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=wpsg_mod_export_addField&noheader=1',
-			data: {
-				profil_id: profil_id
-			},			
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_export_fields').html(data);
-				
-			}
-		} );
-		
-		return false;
-		
-	}
-	
-	function wpsg_mod_export_removeField(field_id)
+	function wpsg_mod_export_removeField(profil_id, field_key)
 	{
 
-		if (!confirm('<?php echo __('Sind Sie sich sicher, dass das Feld gelÃ¶scht werden soll?', 'wpsg'); ?>')) return false;
-		
-		jQuery('tr.wpsg_mod_export_fieldrow_' + field_id).parent().remove();
+		if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
 		
 		jQuery.ajax( { 
 			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=wpsg_mod_export_removeField&noheader=1',
 			data: {
-				field_id: field_id
+				profil: profil_id,
+				field_key: field_key
 			},			
 			success: function(data) {
-				
-				if (data != '1')
+				if (data == '1')
 				{
-					
+					jQuery('tr.wpsg_mod_export_fieldrow_' + field_key).remove();
+				}
+				else
+				{
 					alert(data);
-					
 				}
-				
 			}
 		} );
@@ -75,5 +52,5 @@
 		return false;	
 		
-	} // function wpsg_mod_export_removeField(field_id)
+	} // function wpsg_mod_export_removeField(profil_id, field_key)
 	
 	function wpsg_mod_export_removeProfil(profil_id)
@@ -98,5 +75,5 @@
 	} // function wpsg_mod_export_removeProfil(profil_id)
 	
-	function wpsg_mod_export_addProfil(type)
+	function wpsg_mod_export_addProfil()
 	{
 
@@ -104,12 +81,7 @@
 
 		jQuery.ajax( {			
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=wpsg_mod_export_addProfil&noheader=1',
-			data: {
-				type: type
-			},
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=wpsg_mod_export_addProfil&noheader=1',			
 			success: function(data) {
-				
 				jQuery("#wpsg_profil_list").html(data);
-				
 			}
 		} );
@@ -119,50 +91,17 @@
 	} // function wpsg_addExportProfil()
 
-	function wpsg_mod_export_setAtt(htmlCheckbox, field_id)
-	{
-		
-		var value = '0';
-		if (jQuery(htmlCheckbox).prop('checked') == true) value = '1';
-		
-		jQuery.ajax( { 
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1',
-			data: {
-				'name': 'field_xml_att_' + field_id,
-				'value': value
-			},			
-			success: function(data) {
-				
-				if (data != '1' && data != '0')
-				{
-					
-					alert(data);
-					
-				}
-				
-			}
-		} );
-		
-	}
-	
 </script>
 
-<a title="<?php echo __('Neuens Exportprofil anlegen', 'wpsg'); ?>" href="#" class="" onclick="return wpsg_mod_export_addProfil(<?php echo wpsg_mod_export::TYPE_ORDER; ?>);"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neues Exportprofil fÃŒr Bestellungen anlegen', 'wpsg'); ?></a><br />
-<a title="<?php echo __('Neuens Exportprofil anlegen', 'wpsg'); ?>" href="#" class="" onclick="return wpsg_mod_export_addProfil(<?php echo wpsg_mod_export::TYPE_PRODUCT; ?>);"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neues Exportprofil fÃŒr Produkte anlegen', 'wpsg'); ?></a><br />
-<a title="<?php echo __('Neuens Exportprofil anlegen', 'wpsg'); ?>" href="#" class="" onclick="return wpsg_mod_export_addProfil(<?php echo wpsg_mod_export::TYPE_CUSTOMER; ?>);"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neues Exportprofil fÃŒr Kunden anlegen', 'wpsg'); ?></a>
-
-<br /><br />
-
-<div id="wpsg_profil_list"><?php echo $this->callMod('wpsg_mod_export', 'profilList'); ?></div>
-
-<br />
-
-<fieldset>
-	<legend><?php echo __('Profil importieren', 'wpsg'); ?></legend>
-	<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=import&noheader=1" enctype="multipart/form-data">
-		
-		<?php echo wpsg_drawForm_Upload('profil_file', __('JSON Profildatei', 'wpsg')); ?>
-		
-		<input type="submit" value="<?php echo __('Profil importieren', 'wpsg'); ?>" class="button"  />
-		
-	</form>
-</fieldset>
+<div class="wpsg_admin_box">
+	<div class="head">
+		<div class="title">
+			<div class="fulltab">
+				<?php echo __('Exportprofile', 'wpsg'); ?>
+				<a title="<?php echo __('Neuens Exportprofil anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_mod_export_addProfil();"></a>
+			</div>
+		</div>
+		<div id="wpsg_profil_list" class="content">
+			<?php echo $this->callMod('wpsg_mod_export', 'profilList'); ?>
+		</div>
+	</div>
+</div>
Index: /views/mods/mod_flexipay/order_done.phtml
===================================================================
--- /views/mods/mod_flexipay/order_done.phtml	(revision 8528)
+++ /views/mods/mod_flexipay/order_done.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Bestellabschlussseite mit Flexipay
+	 * Template fÃŒr die BestellabschluÃseite mit Flexipay
 	 */
 
Index: /views/mods/mod_flexipay/settings_edit.phtml
===================================================================
--- /views/mods/mod_flexipay/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_flexipay/settings_edit.phtml	(revision 5261)
@@ -70,5 +70,5 @@
 ), $this->get_option('wpsg_mod_flexipay_language'), array('help' => 'wpsg_mod_flexipay_language')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_flexipay_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_flexipay_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_flexipay_gebuehr')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_flexipay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_flexipay_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_flexipay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_flexipay_mwst')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_flexipay_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_flexipay_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>			
 <br />
Index: ews/mods/mod_fuellmenge/basket_row.phtml
===================================================================
--- /views/mods/mod_fuellmenge/basket_row.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Anzeige der FÃŒllmenge im Warenkorb
-	 */
-	 
-?>
-<div class="product_info">
-	
-    <div>
-		
-        <span class="fa  fa-balance-scale"></span>
-            
-        <?php echo wpsg_translate(__('FÃŒllmenge:', 'wpsg')); ?>
-        <?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$this->view['p']['preis'], $this->view['p']['fmenge'], $this->view['p']['id'], 1]); ?>            
-        
-	</div>
-        
-</div>
Index: ews/mods/mod_fuellmenge/overview_row.phtml
===================================================================
--- /views/mods/mod_fuellmenge/overview_row.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration der FÃŒllmenge in die Bestellzusammenfassung
-	 */
-
-?>
-<div class="product_info">
-
-    <div>
-
-        <span class="fa  fa-balance-scale"></span>
-
-        <?php echo wpsg_translate(__('FÃŒllmenge:', 'wpsg')); ?>
-        <?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$this->view['p']['preis'], $this->view['p']['fmenge'], $this->view['p']['id'], 1]); ?>
-
-    </div>
-
-</div>
Index: /views/mods/mod_fuellmenge/priceinfo.phtml
===================================================================
--- /views/mods/mod_fuellmenge/priceinfo.phtml	(revision 8528)
+++ /views/mods/mod_fuellmenge/priceinfo.phtml	(revision 5261)
@@ -4,23 +4,8 @@
 	 * Anzeige der Grundpreisinformationen im Produkttemplate
 	 */
-	
-?>
 
-<?php if ($this->view['wpsg_mod_fuellmenge']['layout'] === 1) { ?>
-
-    <span class="wpsg_mod_fuellmenge_info"><?php echo wpsg_translate(
-        __('#1# (#2# / #3#)', 'wpsg'),
-        wpsg_ff($this->view['wpsg_mod_fuellmenge']['fmenge'], $this->view['wpsg_mod_fuellmenge']['feinheit'], true, 0),
-        wpsg_ff($this->view['wpsg_mod_fuellmenge']['fmenge_preis'], $this->get_option('wpsg_currency'), true, 0),
-        wpsg_ff($this->view['wpsg_mod_fuellmenge']['referencevalue'],$this->view['wpsg_mod_fuellmenge']['referenceunit'], true, 0)
-    ); ?></span>
-    
-<?php } else { ?>
-
-    <div class="wpsg_mod_fuellmenge_info"><?php echo wpsg_translate(
-        __('(#1# / #2#)', 'wpsg'),
-        wpsg_ff($this->view['wpsg_mod_fuellmenge']['fmenge_preis'], $this->get_option('wpsg_currency'), true, 0),
-        wpsg_ff($this->view['wpsg_mod_fuellmenge']['referencevalue'], $this->view['wpsg_mod_fuellmenge']['referenceunit'], true, 0)
-    ); ?></div>
-
-<?php } ?>
+?><div class="wpsg_mod_fuellmenge_info"><?php echo wpsg_translate(
+	__('(#1# / #2#)', 'wpsg'),
+	wpsg_ff($this->view['wpsg_mod_fuellmenge']['fmenge_preis'], $this->get_option('wpsg_currency')),
+	wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['wpsg_mod_fuellmenge']['feinheit'])
+); ?></div>
Index: /views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml	(revision 5261)
@@ -2,143 +2,16 @@
 
 	/**
-	 * Template fÃŒr die Konfiguration der FÃŒllmenge innerhalb der Produktverwaltung
+	 * Template fÃŒr den Adminbereich des FÃŒllmengenmoduls innerhalb des Produktes
 	 */
 
-	$fmenge = wpsg_tf(wpsg_getFloat($this->view['data']['fmenge']));
-	
-	$arUnit = $this->view['data']['arFeinheiten'];
-	
-	$feinheit = $arUnit[0];
-	
-	if (is_numeric($this->view['data']['feinheit'])) {
-		
-		// Bis 01/2020 war der Index gespeichert
-		$feinheit_index = intval($this->view['data']['feinheit']);
-		if (isset($arUnit[$feinheit_index])) $feinheit = $arUnit[$feinheit_index];
-		
-	} else if (in_array($this->view['data']['feinheit'], $arUnit)) $feinheit = $this->view['data']['feinheit'];
-			
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-	
-	$referenceunit = $oProduct->getMeta('wpsg_mod_fuellmenge_referenceunit');
-	if (!wpsg_isSizedString($referenceunit)) $referenceunit = $feinheit;
-	
-	$referencevalue = $oProduct->getMeta('wpsg_mod_fuellmenge_referencevalue');
-	$conversionvalue = $oProduct->getMeta('wpsg_mod_fuellmenge_conversionvalue');
-	
 ?>
-<div id="wpsg_fuellmenge_layer" class="panel panel-default panel-fuellmenge" style="display:none; position:relative;">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<span><?php echo __('FÃŒllmenge', 'wpsg'); ?> </span>
-
-			<a href="#" data-wpsg-tip="wpsg_mod_fuellmenge_product" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_fuellmenge_product"
-			   class="glyphicon glyphicon glyphicon-question-sign form-control-feedback wpsg_mod_fuellmenge_product-tip" aria-hidden="true"></a>
-			
-		</h3>
-	</div>
-	<div class="panel-body">
-		 
-		<div class="form-group form-group-sm form-select ">
-			<label class="col-sm-6 control-label"><?php echo __('Konfiguration', 'wpsg'); ?></label>
-			<div class="col-sm-6 d-flex align-items_center justify-content_space-between">
-				
-				<input class="form-control input-sm" type="text" name="fmenge" value="<?php echo $fmenge; ?>" class="fmenge" />
-				
-				<select name="feinheit" class="unit">
-					<?php foreach ($arUnit as $k => $v) { ?>
-					<option value="<?php echo $v; ?>" <?php echo (($v === $feinheit)?'selected="selected"':''); ?>><?php echo $v; ?></option>
-					<?php } ?>
-				</select>
-				
-			</div>
-			<div class="clearfix wpsg_clear"></div>
-		</div>
-
-		<div class="form-group form-group-sm form-select fmenge_details fmenge_details_1">
-			<label class="col-sm-6 control-label"><?php echo __('Bezugswert', 'wpsg'); ?></label>
-			<div class="col-sm-6 d-flex align-items_center justify-content_space-between">
-
-				<input class="form-control input-sm" type="text" name="wpsg_mod_fuellmenge_referencevalue" value="<?php echo $referencevalue; ?>" class="referencevalue fmenge_details fmenge_details_1" />
-
-				<select name="referenceunit" class="unit fmenge_details fmenge_details_1">
-					<?php foreach ($arUnit as $v) { ?>
-						<option value="<?php echo $v; ?>" <?php echo (($v === $referenceunit)?'selected="selected"':''); ?>><?php echo $v; ?></option>
-					<?php } ?>
-				</select>
-				
-				<span class="equal conversion" style="display:none;">â</span>
-
-				<input class="conversion conversionvalue" class="form-control input-sm" type="text" name="wpsg_mod_fuellmenge_conversionvalue" value="<?php echo $conversionvalue; ?>"/>
-				
-				<span class="unit conversion conversion_unit" style="display:none;"></span>
-				
-			</div>
-		</div>
-		
-		<?php echo wpsg_drawForm_Checkbox('fmenge_details', __('Erweitert', 'wpsg'), $oProduct->getMeta('fmenge_details')); ?>
-		
-		<br /><br />
-	
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_fuellmenge"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des FÃŒllmengenmoduls', 'wpsg'); ?></a>	
-	
+<div id="wpsg_fuellmenge" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>	
+		<span><?php echo __('FÃŒllmenge', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<?php echo wpsg_drawForm_Select('feinheit', __('Einheit', 'wpsg'), $this->view['data']['arFeinheiten'], $this->view['data']['feinheit']); ?>
+		<?php echo wpsg_drawForm_Input('fmenge', __('FÃŒllmenge', 'wpsg'), wpsg_tf($this->view['data']['fmenge'])); ?>
 	</div>
 </div>
-
-<style>
-	
-	select.unit { width:75px; margin-left:5px; flex-shrink:0; }
-	span.unit { width:66px; margin-left:5px; flex-shrink:0; }
-	input.fmenge { width:100%; }
-	span.equal { padding:0 5px; }
-	input.referencevalue { width:100%; }
-	input.conversionvalue { width:100%; margin-right:9px; }
-	.wpsg_mod_fuellmenge_product-tip { color:#337ab7 !important; }
-	.wpsg_mod_fuellmenge_product-tip:focus, .wpsg_mod_fuellmenge_product-tip:active, .wpsg_mod_fuellmenge_product-tip:hover { text-decoration:none; }
-	
-</style>
-
-<script>
-	
-	jQuery(document).ready(function() {
-		
-		jQuery('select.unit').on('change', function() {
-			
-			var referenceunit = jQuery('select[name="referenceunit"]').val();
-			var unit = jQuery('select[name="feinheit"]').val();
-					 			
-			if (unit !== referenceunit) {
-
-				jQuery('.conversion').show();	
-				jQuery('.conversion_unit').html(unit);
-				
-			} else {
-
-				jQuery('.conversion').hide();
-				
-			}
-			
-		}).change();
-		
-		jQuery('#fmenge_details').on('change', function() {
-
-			jQuery('.fmenge_details').hide();
-			
-			if (jQuery(this).prop('checked')) {
-				
-				jQuery('.fmenge_details_1').show();
-				
-			} else {
-
-				jQuery('.fmenge_details_1').hide();
-				
-			}
-			
-		}).change();
-		
-		jQuery('#wpsg_fuellmenge_layer').show();
-		
-	})
-	
-</script>
Index: /views/mods/mod_fuellmenge/settings_edit.phtml
===================================================================
--- /views/mods/mod_fuellmenge/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_fuellmenge/settings_edit.phtml	(revision 5261)
@@ -9,25 +9,6 @@
 <?php echo wpsg_drawForm_Input('wpsg_mod_fuellmenge_einheit', __('MÃ¶gliche Einheiten (Kommagetrennt)', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_einheit'), array('help' => 'wpsg_mod_fuellmenge_einheit')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_fuellmenge_bezug', __('BezugsgrÃ¶Ãe', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_bezug'), array('help' => 'wpsg_mod_fuellmenge_bezug')); ?>
-
-<br />
-
 <?php if ($this->hasMod('wpsg_mod_productindex')) { ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showProductindex_fmenge', __('FÃŒllmenge auf ProduktÃŒbersichtsseiten (Frontend)', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showProductindex_fmenge'), array('help' => 'wpsg_mod_fuellmenge_showProductindex_fmenge')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showProductindex_grundpreis', __('Grundpreis auf ProduktÃŒbersichtsseiten (Frontend)', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showProductindex_grundpreis'), array('help' => 'wpsg_mod_fuellmenge_showProductindex_grundpreis')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showProductindex_fmenge', __('FÃŒllmenge auf ProduktÃŒbersichtsseiten anzeigen', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showProductindex_fmenge'), array('help' => 'wpsg_mod_fuellmenge_showProductindex_fmenge')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showProductindex_grundpreis', __('Grundpreis auf ProduktÃŒbersichtsseiten anzeigen', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showProductindex_grundpreis'), array('help' => 'wpsg_mod_fuellmenge_showProductindex_grundpreis')); ?>
 <?php } ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showProductindexBackend_fmenge', __('FÃŒllmenge auf ProduktÃŒbersichtsseiten (Backend)', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showProductindexBackend_fmenge'), array('help' => 'wpsg_mod_fuellmenge_showProductindexBackend_fmenge')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showAjaxDialog', __('In der Warenkorb-Lightbox anzeigen', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showAjaxDialog'), array('help' => 'wpsg_mod_fuellmenge_showAjaxDialog')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showBasketProduct', __('Im Warenkorb im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showBasketProduct'), array('help' => 'wpsg_mod_fuellmenge_showBasketProduct')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showOverviewProduct', __('In Zusammenfassung im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showOverviewProduct'), array('help' => 'wpsg_mod_fuellmenge_showOverviewProduct')); ?>
-
-<br />
-
-<?php if ($this->hasMod('wpsg_mod_request')) { ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_fuellmenge_showRequestPageProduct', __('Auf Anfrageseite im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_fuellmenge_showRequestPageProduct'), array('help' => 'wpsg_mod_fuellmenge_showRequestPageProduct')); ?>
-<?php } ?>
Index: /views/mods/mod_funding/product_bottom.phtml
===================================================================
--- /views/mods/mod_funding/product_bottom.phtml	(revision 5261)
+++ /views/mods/mod_funding/product_bottom.phtml	(revision 5261)
@@ -0,0 +1,20 @@
+<?php
+
+	/**
+	 * Template welches unterhalb des Produkttemplates eingebunden wird
+	 */
+
+?>
+<?php if ($this->view['wpsg_mod_funding']['state'] === wpsg_mod_funding::STATE_COMPLETED) { ?>
+<div id="wpsg_message" class="published updated">
+	<p><?php echo __('Die Finanzierung dieses Produktes ist erfolgreich durchgefÃŒhrt worden.', 'wpsg'); ?><br /><?php echo __('Aktuell kann es nicht mehr erworben werden.', 'wpsg'); ?></p>
+</div>
+<?php } else if ($this->view['wpsg_mod_funding']['state'] === wpsg_mod_funding::STATE_NOTSTARTET) { ?>
+<div id="wpsg_error" class="published error">
+	<p><?php echo __('Die Finanzierung dieses Produktes ist noch nicht gestartet.', 'wpsg'); ?><br /><?php echo __('Aktuell kann es nicht erworben werden.', 'wpsg'); ?></p>
+</div>
+<?php } else if ($this->view['wpsg_mod_funding']['state'] === wpsg_mod_funding::STATE_CLOSED) { ?>
+<div id="wpsg_error" class="published error">
+	<p><?php echo __('Die Finanzierung dieses Produktes ist abgeschlossen.', 'wpsg'); ?><br /><?php echo __('Aktuell kann es nicht erworben werden.', 'wpsg'); ?></p>
+</div>
+<?php } ?>
Index: /views/mods/mod_funding/product_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_funding/product_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_funding/product_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,48 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration in die Produktverwaltung
+	 */
+
+?><div id="wpsg_funding" class="postbox">	
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Finanzierungsprodukt', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+	
+		<?php if (wpsg_isSizedInt($_REQUEST['edit_id'])) { ?>
+		
+		<input type="hidden" name="wpsg_mod_funding_save" value="1" />
+		
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_funding[activ]', __('Finanzierungsprodukt', 'wpsg'), wpsg_getStr($this->view['wpsg_mod_funding']['activ']), array('id' => 'wpsg_mod_funding_activ')); ?>
+		
+		<div id="wpsg_mod_funding_activ_layer">
+		
+			<?php echo wpsg_drawForm_Input('wpsg_mod_funding[start]', __('Start der Runde', 'wpsg'), wpsg_getStr($this->view['wpsg_mod_funding']['start']), array('datepicker' => true)); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_funding[end]', __('Ende der Runde', 'wpsg'), wpsg_getStr($this->view['wpsg_mod_funding']['end']), array('datepicker' => true)); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_funding[limit]', __('MÃ¶gliche Bestellungen', 'wpsg'), ((wpsg_isSizedInt($this->view['wpsg_mod_funding']['limit']))?$this->view['wpsg_mod_funding']['limit']:'10')); ?>
+		
+		</div>
+		
+		<script type="text/javascript">/* <![CDATA[ */
+
+			jQuery(document).ready(function() {
+
+				jQuery('#wpsg_mod_funding_activ').bind('change', function() {
+
+					if (jQuery(this).is(':checked')) jQuery('#wpsg_mod_funding_activ_layer').show();
+					else jQuery('#wpsg_mod_funding_activ_layer').hide();
+					
+				} ).change();
+				
+			} );
+        
+		/* ]]> */</script>
+		
+		<?php } else { ?>
+		<p><?php echo __('Das Produkt muss einmalig gespeichert werden bevor die Option "Finanzierungsprodukt" aktiviert werden kann.', 'wpsg'); ?></p>
+		<?php } ?>
+	
+	</div>	
+</div>
Index: /views/mods/mod_funding/product_top_afterheadline.phtml
===================================================================
--- /views/mods/mod_funding/product_top_afterheadline.phtml	(revision 5261)
+++ /views/mods/mod_funding/product_top_afterheadline.phtml	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des CrowdFunding Produktes
+	 */
+
+?>
+<div class="wpsg_mod_funding_progress">
+
+	<div class="wpsg_mod_funding_label">
+		<strong><?php echo __('Status der Finanzierung', 'wpsg'); ?>:</strong>&nbsp;<?php echo $this->view['wpsg_mod_funding']['stateLabel']; ?>
+	</div>
+
+	<div class="wpsg_mod_funding_state">
+		<div class="bar"><div class="value wpsg_mod_funding_state_value" data-wpsg-funding-width="<?php echo ceil($this->view['wpsg_mod_funding']['currentFundingCount'] / $this->view['wpsg_mod_funding']['maxFundingCount'] * 100); ?>"></div></div>
+		<div class="value"><?php echo $this->view['wpsg_mod_funding']['currentFundingCount'].'/'.$this->view['wpsg_mod_funding']['maxFundingCount']; ?></div>
+	</div>
+
+</div>
Index: /views/mods/mod_funding/settings_edit.phtml
===================================================================
--- /views/mods/mod_funding/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_funding/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,7 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungen des Moduls "Crowdfunding"
+	 */
+
+?>
Index: /views/mods/mod_giropay/settings_edit.phtml
===================================================================
--- /views/mods/mod_giropay/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_giropay/settings_edit.phtml	(revision 5261)
@@ -7,58 +7,75 @@
 ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_merchantId', __('VerkÃ€ufer-ID', 'wpsg'), $this->get_option('wpsg_mod_giropay_merchantId'), array('help' => 'wpsg_mod_giropay_merchantId')); ?>
+<?php /* echo wpsg_drawForm_Input('wpsg_mod_giropay_currency', __('WÃ€hrungscode (Standard: EUR)', 'wpsg'), $this->get_option('wpsg_mod_giropay_currency'), array('help' => 'wpsg_mod_giropay_currency')); */ ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_paystart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_giropay_paystart'), array('help' => 'wpsg_shippay_paystart')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_subject', __('Verwendungszweck fÃŒr Zahlungen', 'wpsg'), $this->get_option('wpsg_mod_giropay_subject'), array('help' => 'wpsg_mod_giropay_subject')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_giropay_successPage', __('Seite nach erfolgreicher Zahlung', 'wpsg'), $this->view['wpsg_mod_giropay']['arPages'], $this->get_option('wpsg_mod_giropay_successPage'), array('help' => 'wpsg_mod_giropay_successPage')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_giropay_errorPage', __('Seite nach fehlgeschlagener Zahlung', 'wpsg'), $this->view['wpsg_mod_giropay']['arPages'], $this->get_option('wpsg_mod_giropay_errorPage'), array('help' => 'wpsg_mod_giropay_errorPage')); ?>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_giropay_giropay">
+	<div class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('GiroCheckout - giropay', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_giropay_activ', __('Zahlungsart "giropay" aktiv', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_activ'), array('help' => 'wpsg_shippay_activ')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_projectid', __('Projekt-ID fÃŒr giropay', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_projectid'), array('help' => 'wpsg_mod_giropay_giropay_projectid')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_projectpw', __('Projekt-Passwort', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_projectpw'), array('help' => 'wpsg_mod_giropay_giropay_projectpw')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_name'), array('help' => 'wpsg_shippay_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_giropay_giropay_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_hint'), array('help' => 'wpsg_shippay_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_giropay_giropay_logo'), array('help' => 'wpsg_shippay_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_giropay_giropay_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_giropay_giropay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_giropay_giropay_mwst')); ?>
+			
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_giropay_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>			
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_giropay_creditcard">
+	<div class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('GiroCheckout - Kreditkarte', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_creditcard_activ', __('Zahlungsart "Kreditkarte" aktiv', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_activ'), array('help' => 'wpsg_shippay_activ')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_projectid', __('Projekt-ID fÃŒr Kreditkarte', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_projectid'), array('help' => 'wpsg_mod_giropay_creditcard_projectid')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_projectpw', __('Projekt-Passwort', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_projectpw'), array('help' => 'wpsg_mod_giropay_creditcard_projectpw')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_name'), array('help' => 'wpsg_shippay_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_giropay_creditcard_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_hint'), array('help' => 'wpsg_shippay_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_logo'), array('help' => 'wpsg_shippay_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_giropay_creditcard_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_giropay_creditcard_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_giropay_creditcard_mwst')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_creditcard_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>			
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_giropay_directdebit">
+	<div class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('GiroCheckout - Lastschrift', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_directdebit_activ', __('Zahlungsart "Lastschrift" aktiv', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_activ'), array('help' => 'wpsg_shippay_activ')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_projectid', __('Projekt-ID fÃŒr Lastschrift', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_projectid'), array('help' => 'wpsg_mod_giropay_directdebit_projectid')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_projectpw', __('Projekt-Passwort', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_projectpw'), array('help' => 'wpsg_mod_giropay_directdebit_projectpw')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_name'), array('help' => 'wpsg_shippay_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_giropay_directdebit_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_hint'), array('help' => 'wpsg_shippay_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_logo'), array('help' => 'wpsg_shippay_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_giropay_directdebit_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_giropay_directdebit_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_giropay_directdebit_mwst')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_directdebit_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>			
+		</div>
+	</div>
+</div>
 
-<br />
+<script type="text/javascript">/* <![CDATA[ */
 
-<div>
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" role="tab" data-toggle="tab"><?php echo __('GiroCheckout - giropay', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab2" role="tab" data-toggle="tab"><?php echo __('GiroCheckout - Kreditkarte', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab3" role="tab" data-toggle="tab"><?php echo __('GiroCheckout - Lastschrift', 'wpsg'); ?></a></li>
-    </ul>
-    <div class="tab-content">
-        <div id="tab1" role="tabpanel" class="tab-pane active" >
+	jQuery(document).ready(function() {
 
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_giropay_activ', __('Zahlungsart "giropay" aktiv', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_activ'), array('help' => 'wpsg_shippay_activ')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_projectid', __('Projekt-ID fÃŒr giropay', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_projectid'), array('help' => 'wpsg_mod_giropay_giropay_projectid')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_projectpw', __('Projekt-Passwort', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_projectpw'), array('help' => 'wpsg_mod_giropay_giropay_projectpw')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_name'), array('help' => 'wpsg_shippay_name')); ?>
-            <?php echo wpsg_drawForm_Textarea('wpsg_mod_giropay_giropay_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_hint'), array('help' => 'wpsg_shippay_hint')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_giropay_giropay_logo'), array('help' => 'wpsg_shippay_logo')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_giropay_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_giropay_giropay_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
-            <?php echo wpsg_drawForm_Select('wpsg_mod_giropay_giropay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_giropay_giropay_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
+		jQuery('.wpsg_admin_box').wpsg_adminbox();
+		
+	} );
 
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_giropay_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_giropay_giropay_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>
-            
-        </div>
-        <div id="tab2" role="tabpanel" class="tab-pane active" >
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_creditcard_activ', __('Zahlungsart "Kreditkarte" aktiv', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_activ'), array('help' => 'wpsg_shippay_activ')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_projectid', __('Projekt-ID fÃŒr Kreditkarte', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_projectid'), array('help' => 'wpsg_mod_giropay_creditcard_projectid')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_projectpw', __('Projekt-Passwort', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_projectpw'), array('help' => 'wpsg_mod_giropay_creditcard_projectpw')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_name'), array('help' => 'wpsg_shippay_name')); ?>
-            <?php echo wpsg_drawForm_Textarea('wpsg_mod_giropay_creditcard_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_hint'), array('help' => 'wpsg_shippay_hint')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_logo'), array('help' => 'wpsg_shippay_logo')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_creditcard_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_giropay_creditcard_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
-            <?php echo wpsg_drawForm_Select('wpsg_mod_giropay_creditcard_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_giropay_creditcard_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_creditcard_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_giropay_creditcard_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>
-            
-        </div>
-        <div id="tab3" role="tabpanel" class="tab-pane active" >
-
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_directdebit_activ', __('Zahlungsart "Lastschrift" aktiv', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_activ'), array('help' => 'wpsg_shippay_activ')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_projectid', __('Projekt-ID fÃŒr Lastschrift', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_projectid'), array('help' => 'wpsg_mod_giropay_directdebit_projectid')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_projectpw', __('Projekt-Passwort', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_projectpw'), array('help' => 'wpsg_mod_giropay_directdebit_projectpw')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_name'), array('help' => 'wpsg_shippay_name')); ?>
-            <?php echo wpsg_drawForm_Textarea('wpsg_mod_giropay_directdebit_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_hint'), array('help' => 'wpsg_shippay_hint')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_logo'), array('help' => 'wpsg_shippay_logo')); ?>
-            <?php echo wpsg_drawForm_Input('wpsg_mod_giropay_directdebit_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_giropay_directdebit_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
-            <?php echo wpsg_drawForm_Select('wpsg_mod_giropay_directdebit_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_giropay_directdebit_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
-            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_giropay_directdebit_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_giropay_directdebit_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>
-            
-        </div>
-    </div>
-</div>
+/* ]]> */</script>
Index: /views/mods/mod_gutschein/add.phtml
===================================================================
--- /views/mods/mod_gutschein/add.phtml	(revision 8528)
+++ /views/mods/mod_gutschein/add.phtml	(revision 5261)
@@ -4,120 +4,69 @@
 	 * Template fÃŒr die Maske eines neuen Gutscheins
 	 */
+
+?>
+<div class="wrap columns-2">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	<h2><?php echo __('Neuer Gutschein', 'wpsg'); ?></h2>
+	<br />
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	
+ 	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&amp;action=save&amp;noheader=1" enctype="multipart/form-data">
+
+		<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_value', __('Wert', 'wpsg'), $this->view['mod_gutschein']['value']); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_calc', __('Berechnung', 'wpsg'), array(
+			'w' => __('Absoluter Betrag', 'wpsg'),
+			'p' => __('Prozentual', 'wpsg')
+		), $this->view['mod_gutschein']['calc']); ?>		
+		<?php echo wpsg_drawForm_Date('wpsg_mod_gutschein_start', __('GÃŒltig ab', 'wpsg'), $this->view['mod_gutschein']['start']); ?>
+		<?php echo wpsg_drawForm_Date('wpsg_mod_gutschein_end', __('GÃŒltig bis', 'wpsg'), $this->view['mod_gutschein']['end']); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_gen', __('Code Generierung', 'wpsg'), array(
+			'0' => __('Automatisch', 'wpsg'),
+			'1' => __('Manuell', 'wpsg')
+		), wpsg_getStr($this->view['mod_gutschein']['gen']), array('help' => 'wpsg_mod_gutschein_gen')); ?>		
+		<div id="wpsg_mod_gutschein_layercode">
+			<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_code', __('Code', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['code']), array('help' => 'wpsg_mod_gutschein_code')); ?>
+		</div>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_minvalue', __('Minimaler Warenwert', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['minvalue']), array('help' => 'wpsg_mod_gutschein_minvalue')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_count', __('Menge', 'wpsg'), $this->view['mod_gutschein']['count']); ?>		
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_gutschein_multi', __('Mehrfach verwendbar', 'wpsg'), $this->view['mod_gutschein']['multi']); ?>
+		<?php echo wpsg_drawForm_Textarea('wpsg_mod_gutschein_comment', __('Kommentar', 'wpsg'), $this->view['mod_gutschein']['comment']); ?>
+		<?php if ($this->hasMod('wpsg_mod_productgroups') && wpsg_isSizedArray($this->view['wpsg_mod_gutschein']['arProductGroups'])) { ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_productgroups', __('BeschrÃ€nkung auf Produktgruppen', 'wpsg'), $this->view['wpsg_mod_gutschein']['arProductGroups'], $this->view['mod_gutschein']['productgroups'], array('multiple' => ((sizeof($this->view['wpsg_mod_gutschein']['arProductGroups']) > 5)?5:sizeof($this->view['wpsg_mod_gutschein']['arProductGroups'])), 'help' => 'wpsg_mod_gutschein_productgroups')); ?>
+		<?php } ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_products', __('BeschrÃ€nkung auf Produkte', 'wpsg'), $this->view['wpsg_mod_gutschein']['arProducts'], $this->view['mod_gutschein']['products'], array('multiple' => ((sizeof($this->view['wpsg_mod_gutschein']['arProducts']) > 5)?5:sizeof($this->view['wpsg_mod_gutschein']['arProducts'])), 'help' => 'wpsg_mod_gutschein_products')); ?>
+		
+		<p class="submit">
+			<input type="submit" value="<?php echo __('Gutschein anlegen', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
+		</p>
+		
+		<script type="text/javascript">/* <![CDATA[ */
+
+			jQuery(document).ready(function() {
  
-	$used = 0;
-	
-	if (wpsg_isSizedInt($_REQUEST['voucher_id'])) {
+				jQuery('.wpsg_form_help').tipTip();
+
+				jQuery('#wpsg_mod_gutschein_gen').bind('change', function() {
+
+					if (jQuery(this).val() == '1')
+					{
+
+						jQuery('#wpsg_mod_gutschein_layercode').show();
+						
+					}
+					else
+					{
+
+						jQuery('#wpsg_mod_gutschein_layercode').hide();
+						
+					}
+					
+				} ).change();
+				
+			} );
 		
-		$oVoucher = wpsg_voucher::getInstance($_REQUEST['voucher_id']);
-		
-		$used = $oVoucher->getUsedAmount();
-		
-	}
-	
-?>
-
-<div class="content form-horizontal">
-
-	<form method="POST" id="wpsg_voucher_form" autocomplete="off">
-
-		<?php wpsg_drawForm_AdminboxStart(); ?>
-			
-			<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_value', __('Betrag', 'wpsg'), wpsg_ff(@$this->view['mod_gutschein']['value'])); ?>
-			<?php echo wpsg_drawForm_Input(false, __('Bereits verwendet'), wpsg_ff($used), ['field_id' => 'wpsg_voucher_used', 'readonly' => true]); ?>
-		
-			<div style="margin-top:-15px;"> 
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_gutschein_coupon', __('Als Wertgutschein behandeln', 'wpsg'), @$this->view['mod_gutschein']['coupon']); ?>
-			</div>
-		
-			<div class="wpsg_mod_gutschein_coupon wpsg_mod_gutschein_coupon_0">
-				<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_calc', __('Berechnung', 'wpsg'), array(
-					'w' => __('Absoluter Betrag', 'wpsg'),
-					'p' => __('Prozentual', 'wpsg')
-				), wpsg_getStr($this->view['mod_gutschein']['calc'], 'w')); ?>
-			</div>
-
-			<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_start', __('GÃŒltig ab', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['start']), array('datepicker' => true)); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_end', __('GÃŒltig bis', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['end']), array('datepicker' => true)); ?>
-
-			<?php if (!wpsg_isSizedInt($this->view['edit_id'])) { ?>
-			
-				<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_gen', __('Code Generierung', 'wpsg'), array(
-					'0' => __('Automatisch', 'wpsg'),
-					'1' => __('Manuell', 'wpsg')
-				), wpsg_getStr($this->view['mod_gutschein']['gen']), array('help' => 'wpsg_mod_gutschein_gen')); ?>
-				<div id="wpsg_mod_gutschein_layercode">
-					<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_code', __('Code', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['code']), array('help' => 'wpsg_mod_gutschein_code')); ?>
-				</div>
-		
-			<?php } else { ?>
-
-				<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_code', __('Code', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['code']), array('help' => 'wpsg_mod_gutschein_code')); ?>
-				
-			<?php } ?>                
-		
-			<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_minvalue', __('Minimaler Warenwert', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['minvalue']), array('help' => 'wpsg_mod_gutschein_minvalue')); ?>
-
-			<?php if (!wpsg_isSizedInt($this->view['edit_id'])) { ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_count', __('Menge', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['count'], '1')); ?>
-			<?php } ?>
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_gutschein_multi', __('Mehrfach verwendbar', 'wpsg'), wpsg_getStr($this->view['mod_gutschein']['multi'], '0')); ?>
-			<?php echo wpsg_drawForm_Textarea('wpsg_mod_gutschein_comment', __('Kommentar', 'wpsg'), @$this->view['mod_gutschein']['comment']); ?>
-			<?php if ($this->hasMod('wpsg_mod_productgroups') && wpsg_isSizedArray($this->view['wpsg_mod_gutschein']['arProductGroups'])) { ?>
-			<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_productgroups', __('BeschrÃ€nkung auf Produktgruppen', 'wpsg'), $this->view['wpsg_mod_gutschein']['arProductGroups'], wpsg_getArray($this->view['mod_gutschein']['productgroups']), array('multiple' => ((sizeof($this->view['wpsg_mod_gutschein']['arProductGroups']) > 5)?5:sizeof($this->view['wpsg_mod_gutschein']['arProductGroups'])), 'help' => 'wpsg_mod_gutschein_productgroups')); ?>
-			<?php } ?>
-			<?php echo wpsg_drawForm_Select('wpsg_mod_gutschein_products', __('BeschrÃ€nkung auf Produkte', 'wpsg'), @$this->view['wpsg_mod_gutschein']['arProducts'], @$this->view['mod_gutschein']['products'], array('multiple' => ((sizeof($this->view['wpsg_mod_gutschein']['arProducts']) > 5)?5:sizeof($this->view['wpsg_mod_gutschein']['arProducts'])), 'help' => 'wpsg_mod_gutschein_products')); ?>
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-		<?php if (wpsg_isSizedInt($this->view['edit_id'])) { ?>
-		
-			<input type="hidden" name="voucher_id" value="<?php echo $this->view['edit_id']; ?>" />
-		
-		<?php } ?>
+		/* ]]> */</script>
 
 	</form>
-
 </div>
-
-<script>
-
-    jQuery(document).ready(function() {
-
-		wpsg_ajaxBind();
-				
-		jQuery('#wpsg_mod_gutschein_coupon').on('change', function() {
-			
-			jQuery('.wpsg_mod_gutschein_coupon').hide();
-			
-			if (jQuery(this).prop('checked')) {
-
-				jQuery('.wpsg_mod_gutschein_coupon_1').show();	
-				
-			} else {
-
-				jQuery('.wpsg_mod_gutschein_coupon_0').show();
-				
-			}
-			
-		}).change();
-    	
-        jQuery('#wpsg_mod_gutschein_gen').bind('change', function() {
-
-            if (jQuery(this).val() == '1')
-            {
-
-                jQuery('#wpsg_mod_gutschein_layercode').show();
-
-            }
-            else
-            {
-
-                jQuery('#wpsg_mod_gutschein_layercode').hide();
-
-            }
-
-        } ).change();
-
-    } );
-
-</script>
Index: /views/mods/mod_gutschein/basket_row_end.phtml
===================================================================
--- /views/mods/mod_gutschein/basket_row_end.phtml	(revision 8528)
+++ /views/mods/mod_gutschein/basket_row_end.phtml	(revision 5261)
@@ -6,16 +6,12 @@
 
 ?>
-<br />
-<div class="basket_sum_row">
+<tr class="wpsg_gutschein_weight">
+	<td colspan="<?php echo ($this->view['colspan'] + 1); ?>" class="wpsg_cell_gutschein">
 		
-	<div class="codegs">
-		<label class="codegsf" for="wpsg_gutschein_input"><?php echo __('Gutscheincode:', 'wpsg'); ?></label>
-	</div>
-	<div class="codegsl">
+		<label for="wpsg_gutschein_input"><?php echo __('Gutscheincode:', 'wpsg'); ?></label>
+		
+		<input class="wpsg_gutschein_add wpsg_button" type="submit" name="wpsg_gutschein_add" value="<?php echo __('HinzufÃŒgen', 'wpsg'); ?>" />
 		<input id="wpsg_gutschein_input" class="wpsg_gutschein_input <?php echo ((in_array("gutschein", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" name="wpsg[gutschein]" value="" />
-	</div>
-	<div class="codegsr">
-		<input class="wpsg_button wpsg_gutschein_add" type="submit" name="wpsg_gutschein_add" value="<?php echo '&nbsp;'.__('EinlÃ¶sen', 'wpsg').'&nbsp;'; ?>" />
-	</div>
-		
-</div>
+				 
+	</td>
+</tr>
Index: ews/mods/mod_gutschein/basket_row_end_coupon.phtml
===================================================================
--- /views/mods/mod_gutschein/basket_row_end_coupon.phtml	(revision 8528)
+++ 	(revision )
@@ -1,59 +1,0 @@
-<?php
-	
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 20.07.2019
-	 * Time: 15:47
-	 */ 
-  	
-	$arCalculation = &$this->view['basket']['arCalculation'];
-	
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-	
-?>
-
-<?php foreach ($arCalculation['coupon'] as $gs) { ?>
-	
-	<div class="basket_sum_row basket_sum_coupon">
-		<div class="title">
-			<a class="wpsg_basket_removelink" href="<?php echo str_replace('&', '&amp;', $this->getRemoveLinkURL('voucher_'.$gs['id'])); ?>" title="<?php echo __('Wertgutschein aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass sie den Wertgutschein aus dem Warenkorb entfernen mÃ¶chten?', 'wpsg'); ?>');"><img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" /></a>
-			<?php echo __('Wertgutschein', 'wpsg'); ?> <?php
-
-                $arInfo = [];
-
-                if (wpsg_isSizedString($gs['code'])) $arInfo[] = $gs['code'];
-                if (wpsg_isTrue($gs['partial'])) $arInfo[] = __('teilweise angerechnet', 'wpsg');
-
-                if (wpsg_isSizedArray($arInfo)) echo '('.implode(' / ', $arInfo).')';
-
-            ?>
-		</div>
-		<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-			<div class="colgsr"><?php echo __('anteilig', 'wpsg'); ?></div>
-		<?php } ?>
-		<div class="value"><?php
-				
-				echo wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency'));
-				
-				if (strpos($gs['set'], '%') !== false) {
-
-					echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($gs['set']), '%').')</span>';
-					
-				}
-			
-			?></div>
-	
-	</div>
-
-<?php } ?>
-
-<div class="basket_sum_row">
-	<div class="title2">
-		<?php echo __('Zu zahlen', 'wpsg'); ?>:
-	</div>
-	<div class="sum">
-		<?php echo wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?>
-	</div>
-</div>
-<div class="wpsg_spacer"></div>
Index: /views/mods/mod_gutschein/import.phtml
===================================================================
--- /views/mods/mod_gutschein/import.phtml	(revision 8528)
+++ /views/mods/mod_gutschein/import.phtml	(revision 5261)
@@ -6,4 +6,5 @@
 
 ?>
+<?php echo $this->writeBackendMessage(); ?>
 
 <div class="wrap wpsg_mod_gutschein">
@@ -14,6 +15,4 @@
 	<form name="wpsg_form" method="post" enctype="multipart/form-data" action="<?php echo wpsg_hspc(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Voucher&action=import&noheader=1'); ?>">
 	
-		<?php echo wpsg_formNounce('Voucher','import'); ?>
-		
 		<?php echo wpsg_drawForm_Select('gs_exists', __('Bestehende Codes', 'wpsg'), array('0' => __('Ãberschreiben', 'wpsg'), '1' => __('Ignorieren', 'wpsg')), '1'); ?>
 	
Index: /views/mods/mod_gutschein/index.phtml
===================================================================
--- /views/mods/mod_gutschein/index.phtml	(revision 8528)
+++ /views/mods/mod_gutschein/index.phtml	(revision 5261)
@@ -6,392 +6,327 @@
 
 ?>
-<div class="wpsg_voucher" id="wpsg-bs">
-
-    <nav class="navbar navbar-default">
-
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="wpsg-voucher-tab-a active"><a href="#" onclick="return false;"><?php echo __("Gutscheinverwaltung", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg-voucher-tab-a wpsg_showhide_filter <?php echo ((($this->view['hasFilter']) && (wpsg_getStr($this->view['arFilter']['s']) != ''))?'active':''); ?>" id="wpsg-voucher-tab-0"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-                    <li role="presentation" class="wpsg-voucher-add" onclick="return false;"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&action=add"><span class="glyphicon glyphicon-plus"></span><?php echo __("HinzufÃŒgen", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-                    <li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'import'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&action=import&noheader=1"><span class="glyphicon glyphicon-import"></span><?php echo __("Import", "wpsg"); ?></a></li>
-					<?php if (wpsg_isSizedArray($this->view['arData'])) { ?>
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'export'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&action=export&noheader=1"><span class="glyphicon glyphicon-export"></span><?php echo __("Export", "wpsg"); ?></a></li>
-					<?php } ?>
-				</ul>
+<div class="wrap wpsg_mod_gutschein">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Gutscheinverwaltung', 'wpsg'); ?>			
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&amp;action=add" class="add-new-h2"><?php echo __("HinzufÃŒgen", "wpsg"); ?></a>
+		<a href="#" onclick="return wpsg_doExport();" class="add-new-h2"><?php echo __('CSV Export', 'wpsg'); ?></a>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&amp;action=import" class="add-new-h2"><?php echo __('CSV Import', 'wpsg'); ?></a>
+	</h2>
+	
+	<script type="text/javascript">/* <![CDATA[ */
+
+		var wpsg_order = '<?php echo $this->view['filter']['order']; ?>';
+		var wpsg_ascdesc = '<?php echo $this->view['filter']['ascdesc']; ?>';
+    	
+		function wpsg_setOrder(order)
+		{
+	
+			if (order == wpsg_order)
+			{
+	
+				// Nur Richtung Ã€ndern
+				if (wpsg_ascdesc == 'asc') jQuery('#wpsg_ascdesc').val('desc');
+				else jQuery('#wpsg_ascdesc').val('asc');
+				
+			}
+			else
+			{
+	
+				jQuery('#wpsg_order').val(order);
+				jQuery('#wpsg_ascdesc').val('asc');
+				
+			}
+	 
+			jQuery('#seite').val(1);
+			jQuery('#filter_form').submit();
+			
+			return false;
+			
+		} // function wpsg_setOrder(order)
+    
+		function goPage(page)
+		{
+
+			if (page <= 0 || page == <?php echo $this->view['page']; ?> || page > <?php echo $this->view['pages']; ?>) return;			
+			
+			jQuery('#seite').val(page);
+			
+			jQuery('#filter_form').submit();
+
+			return false;
+			
+		} // function goPage(page)
+
+		function goStatus(status)
+		{
+
+			jQuery('#status').val(status);
+			jQuery('#seite').val('1');
+
+			jQuery('#filter_form').submit();
+
+			return false;
+			
+		} // public function goStatus(status)
+
+		function wpsg_doExport()
+		{
+
+			var action_alt = jQuery('#filter_form').attr('action'); 
+
+			jQuery('#wpsg_voucher_export').val('1');
+			jQuery('#filter_form').attr('target', '_blank');
+			jQuery('#filter_form').attr('action', jQuery('#filter_form').attr('action') + '&noheader=1');
+			
+			jQuery('#filter_form').submit();			
+
+			jQuery('#filter_form').attr('action', action_alt);
+			jQuery('#filter_form').attr('target', '');
+			jQuery('#wpsg_voucher_export').val('0');
+
+			return false;
+			
+		} // function wpsg_doExport()
+		
+	/* ]]> */</script>
+
+	<?php echo $this->writeBackendMessage(); ?>
+	
+	<form method="POST" id="filter_form" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher">
+		
+		<input type="hidden" name="wpsg_status" id="status" value="<?php echo @$this->view['filter']['status']; ?>" />
+		<input type="hidden" name="wpsg_voucher_export" value="0" id="wpsg_voucher_export" />
+
+		<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo $this->view['filter']['order']; ?>" />
+		<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo $this->view['filter']['ascdesc']; ?>" />
+		
+		<?php if (wpsg_isSizedArray($this->view['arStatus'])) { ?>		
+		<ul class="subsubsub wpsg_order_index_status">
+			<?php foreach ($this->view['arStatus'] as $status_id => $status) { ?>
+			<li>
+				<?php if (isset($this->view['filter']['status']) && $this->view['filter']['status'] == $status_id) { ?>
+				<span class="akt"><?php echo wpsg_hspc($status[0]); ?></span> <span class="count">(<?php echo $status[1]; ?>) | </span>
+				<?php } else { ?>
+				<a onclick="return goStatus(<?php echo $status_id; ?>);" href="#"><?php echo wpsg_hspc($status[0]); ?> <span class="count">(<?php echo $status[1]; ?>)</span></a> |
+				<?php } ?>
+			</li>			 
+			<?php } ?>
+			<li>
+				<?php if (!isset($this->view['filter']['status']) || $this->view['filter']['status'] <= 0) { ?>
+				<span class="akt"><?php echo __('Alle', 'wpsg'); ?></span> <span class="count">(<?php echo $this->view['countAll']; ?>)</span>
+				<?php } else { ?>
+				<a onclick="return goStatus(0);" href="#"><?php echo __('Alle', 'wpsg'); ?> <span class="count">(<?php echo $this->view['countAll']; ?>)</span></a>
+				<?php } ?>
+			</li>
+		</ul>
+		<?php } ?>
+		
+		<p class="search-box wpsg-search-box">
+			<label for="post-search-input" class="screen-reader-text"><?php echo __('Gutscheine suchen', 'wpsg'); ?>:</label>
+			<input type="text" value="<?php echo wpsg_hspc($this->view['filter']['search']); ?>" id="wpsg_search" name="wpsg_search" id="post-search-input" />
+			<input type="submit" value="<?php echo __('Gutscheine suchen', 'wpsg'); ?>" class="button" id="search-submit" name="search-submit" />
+		</p>
+		
+		<?php if (sizeof($this->view['data'] > 0)) { ?>
+		<div class="tablenav top">
+			<div class="tablenav-pages tablenav-pages-wrap"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a onclick="return goPage(1);" href="#" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['page'] == '1')?'disabled':''); ?>">Â«</a>
+						<a onclick="return goPage(<?php echo $this->view['page'] - 1; ?>);" href="#" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['page'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['page']; ?>" id="seite" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a onclick="return goPage(<?php echo $this->view['page'] + 1; ?>);" href="#" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['page'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a onclick="return goPage(<?php echo $this->view['pages']; ?>);" href="#" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['page'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
+				</div>
+				
+				<script type="text/javascript">/* <![CDATA[ */
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				/* ]]> */</script>
+				
+				<br class="wpsg_clear">
 			</div>
 		</div>
-
-        <div class="wpsg-filter wpsg-customer-tab wpsg-voucher-tab-0 container-fluid form-horizontal" style="display:<?php echo ((($this->view['hasFilter'] === true) && ($this->view['arFilter']['s'] != ''))?'block':'none'); ?>;">
-            <div class="row">
-				<div class="col-lg-4">
-					<form method="post" id="filter_form">
-
-						<input id="wpsg_seite" type="hidden" name="filter[page]" value="<?php echo @$this->view['page']; ?>" class="current-page" />
-                        <input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-						<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" />
-
-						<?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), stripslashes(wpsg_getStr($this->view['arFilter']['s']))); ?>
-
-						<?php echo wpsg_drawForm_SubmitButton(__('Gutscheine suchen')); ?><br />
-						<input type="hidden" id="filterstatus" name="filter[status]" value="<?php echo @$this->view['arFilter']['status']; ?>" />
-
-					</form>
+		<?php } ?>
+		
+	</form> 
+	
+	<form method="POST" id="#gs_form" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&noheader=1">
+			 
+		<?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
+		<table class="widefat post fixed vouchertable">
+			<thead>
+				<tr>
+					<th class="manage-column column-checkbox"><input title="<?php echo __("Alle markieren", "wpsg"); ?>" type="checkbox" onclick="markAll(this);"/></th>
+					<th class="manage-column column-nr <?php echo (($this->view['filter']['order'] == 'id')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('id');">
+							<span><?php echo __("ID", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-code <?php echo (($this->view['filter']['order'] == 'code')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('code');">
+							<span><?php echo __("Code", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-start <?php echo (($this->view['filter']['order'] == 'start_date')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('start_date');">
+							<span><?php echo __("Start", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>
+					<th class="manage-column column-end <?php echo (($this->view['filter']['order'] == 'end_date')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('end_date');">
+							<span><?php echo __("End", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>				
+					<th class="manage-column column-value <?php echo (($this->view['filter']['order'] == 'value')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('value');">
+							<span><?php echo __("Wert", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-status <?php echo (($this->view['filter']['order'] == 'status')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('status');">
+							<span><?php echo __("Status", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<?php foreach ($this->view['data'] as $g) { ?>
+				<tr>
+					<td class="column-checkbox"><input type="checkbox" value="<?php echo $g['id']; ?>"  class="wpsg_mod_gs_cb" name="wpsg_gs_cb[]" /></td>
+					<td class="column-nr"><?php echo wpsg_hspc($g['id']); ?>.</td>
+					<td class="column-code"><?php echo wpsg_hspc($g['code']); ?></td>
+					<td class="column-start"><?php echo date('d.m.Y H:i', strtotime($g['start_date'])); ?></td>
+					<td class="column-end"><?php echo date('d.m.Y H:i', strtotime($g['end_date'])); ?></td>
+					<td class="column-value">
+						<?php if ($g['calc_typ'] == 'w') { ?>
+							<?php echo wpsg_ff($g['value'], $this->get_option('wpsg_currency')); ?>
+						<?php } else { ?>
+							<?php echo wpsg_ff($g['value'], '%'); ?>
+						<?php } ?> 
+						<?php if (wpsg_tf($g['minvalue']) > 0) { ?>
+						<br /><div class="wpsg_hinweis"><?php echo wpsg_translate(__('Ab #1#', 'wpsg'), wpsg_ff(wpsg_tf($g['minvalue']), $this->get_option('wpsg_currency'))); ?></div>
+						<?php } ?>
+					</td>
+					<td class="column-status">
+						<?php if (trim($g['comment']) != '') { ?>
+						<a href="#" style="cursor:default;" title="<?php echo wpsg_hspc($g['comment']); ?>">
+							<img src="<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/views/gfx/comment.png" alt="<?php echo wpsg_hspc($g['comment']); ?>" />
+						</a>
+						<?php } ?>
+						<?php echo wpsg_hspc($g['status']); ?>
+						<?php if ($g['multi'] == '1') { ?> 
+						<?php if ($g['ordered'] > 0) { ?>
+						<?php echo wpsg_translate(__('#1# mal benutzt', 'wpsg'), $g['ordered']); ?>
+						<?php } ?>
+						<span class="wpsg_mod_gutschein_multi">&nbsp;<a class="tooltip" href="#" onclick="return false;" title="<?php echo __('Mehrfach benutzbar', 'wpsg'); ?>">[M]</a></span>
+						<?php } ?>						
+					</td>
+				</tr>
+				<?php } ?>
+			</tbody>
+			<tfoot>
+				<tr>
+					<th class="manage-column column-checkbox"><input title="<?php echo __("Alle markieren", "wpsg"); ?>" type="checkbox" onclick="markAll(this);"/></th>
+					<th class="manage-column column-nr <?php echo (($this->view['filter']['order'] == 'id')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('id');">
+							<span><?php echo __("ID", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-code <?php echo (($this->view['filter']['order'] == 'code')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('code');">
+							<span><?php echo __("Code", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-start <?php echo (($this->view['filter']['order'] == 'start_date')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('start_date');">
+							<span><?php echo __("Start", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>
+					<th class="manage-column column-end <?php echo (($this->view['filter']['order'] == 'end_date')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('end_date');">
+							<span><?php echo __("End", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>				
+					<th class="manage-column column-value <?php echo (($this->view['filter']['order'] == 'value')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('value');">
+							<span><?php echo __("Wert", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-status <?php echo (($this->view['filter']['order'] == 'status')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('status');">
+							<span><?php echo __("Status", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>
+				</tr>
+			</tfoot> 
+		</table>
+		
+		<div class="tablenav top">
+			<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a onclick="return goPage(1);" href="#" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['page'] == '1')?'disabled':''); ?>">Â«</a>
+						<a onclick="return goPage(<?php echo $this->view['page'] - 1; ?>);" href="#" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['page'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['page']; ?>" id="seite" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a onclick="return goPage(<?php echo $this->view['page'] + 1; ?>);" href="#" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['page'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a onclick="return goPage(<?php echo $this->view['pages']; ?>);" href="#" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['page'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
 				</div>
-			</div>
-        </div>
-
-    </nav>
-
-    <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-
-	<div class="pagination_wrap wpsg_status_link_wrap">
-
-		<ul class="pagination">
-			<?php foreach ($this->view['arStatus'] as $status_key => $status_info) { ?>
-			<li class="<?php echo ((wpsg_getStr($this->view['arFilter']['status']) == $status_key)?'active':''); ?>"><a href="#" onclick="return wpsg_setFilterStatus('<?php echo $status_key; ?>');"><?php echo wpsg_translate(__('#1# <span>(#2#)<span>', 'wpsg'), $status_info['label'], $status_info['count']); ?></a></li>
-			<?php } ?>
-		</ul>
-
-	</div>
-    
-    <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-
-	<div class="content">
-
-        <?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-
-            <form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&action=index&noheader=1">
-                <table class="table wpsg-table-order table-bordered table-hover table-striped wpsg-table-customer">
-                    <thead>
-                        <tr>
-                            <th class="col_checkbox"><input type="checkbox" onclick="jQuery('.col_set_checkbox').each(function() { jQuery(this).prop('checked', !jQuery(this).prop('checked')); } );" /></th>
-                            <th class="wpsg_order col_code" data-order="code"><?php echo __("Code", 'wpsg'); ?></th>
-                            <th class="wpsg_order col_start" data-order="start_date"><?php echo __("Start", 'wpsg'); ?></th>
-                            <th class="wpsg_order col_end" data-order="end_date"><?php echo __("Ende", 'wpsg'); ?></th>
-                            <th class="wpsg_order col_value" data-order="value"><?php echo __("Wert", 'wpsg'); ?></th>
-							<th class="wpsg_order col_product" data-order="products"><?php echo __("Produkte", 'wpsg'); ?></th>
-							<th class="wpsg_order col_status" data-order="status"><?php echo __("Status", 'wpsg'); ?></th>
-                        </tr>
-                    </thead>
-                    <tbody>
-                        <?php /** @var wpsg_voucher $oVoucher */
-							foreach ($this->view['arData'] as $oVoucher) { ?>
-                        <tr>
-                            <td class="col_checkbox">
-
-                                <input class="col_set_checkbox" value="<?php echo $oVoucher->id; ?>" name="wpsg_multido[]" type="checkbox" />
-
-                            </td>
-                            <?php /* <td class="col_code"><?php echo $oVoucher->code; ?></td> */ ?>                            
-                            <td class="col_code">
-
-								<span><?php echo $oVoucher->code; ?></span><br />
-                                
-                                <?php if ($this->hasMod('wpsg_mod_voucherproduct') && $oVoucher->isAutoCreated()) { ?>
-                                &nbsp;[&nbsp;<a href="<?php echo WPSG_URL_WP . 'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_voucherproduct&gs_id='.$oVoucher->id.'&order_id='.$oVoucher->autocreate_order.'&noheader=1&cmd=getVoucher'; ?>"><?php echo __('PDF', 'wpsg'); ?></a>&nbsp;]
-                                <?php } ?>
-
-								<div class="actions">
-									<span class="edit"><a title="<?php echo __("Diesen Gutschein bearbeiten", "wpsg"); ?>" href="#" class="wpsg_voucher_edit" onclick="return false;" data-voucher_id="<?php echo $oVoucher->getId(); ?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
-									|
-									<span class="delete"><a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie diesen Gutschein lÃ¶schen mÃ¶chten?', 'wpsg'); ?>');" title="<?php echo __('Diese Gutschein lÃ¶schen', 'wpsg'); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_gutschein&subaction=delete&noheader=1&voucher_id=<?php echo $oVoucher->getId(); ?>"><?php echo __('LÃ¶schen', 'wpsg'); ?></a></span>
-									|
-									<span><a title="<?php echo __('Bestellungen anzeigen', 'wpsg'); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter[status]=-1&filter[voucher_id]=<?php echo $oVoucher->getId(); ?>"><?php echo __('Bestellungen suchen', 'wpsg'); ?></a></span>
-									|
-									<span class="duplicate"><a title="<?php echo __("Diesen Gutschein mit anderem Code duplizieren", "wpsg"); ?>" href="#" class="wpsg_voucher_duplicate"
-										data-voucher_id="<?php echo $oVoucher->getId(); ?>"
-										data-voucher_start_date="<?php echo $oVoucher->getStartDate('d.m.Y'); ?>"
-										data-code="<?php echo $oVoucher->getCode(); ?>"
-										data-voucher_end_date="<?php echo $oVoucher->getEndDate('d.m.Y'); ?>"
-									><?php echo __("Duplizieren", "wpsg"); ?></a></span>
-								</div>
-                                                        
-                            </td>                            
-                            <td class="col_start"><?php echo wpsg_formatTimestamp($oVoucher->start_date, true); ?></td>
-                            <td class="col_end"><?php echo wpsg_formatTimestamp($oVoucher->end_date, true); ?></td>
-                            <td class="col_value"><span><?php
-
-                                if ($oVoucher->calc_typ == 'w') echo wpsg_ff($oVoucher->getFreeAmount(), $this->get_option('wpsg_currency'));
-                                else if ($oVoucher->calc_typ == 'p') echo wpsg_ff($oVoucher->value, '%');
-                                
-                                if ($oVoucher->calc_typ == 'w' && $oVoucher->getUsedAmount() > 0 && !$oVoucher->isMultiUsable()) echo ' <span title="'.__('Original Betrag', 'wpsg').'">('.wpsg_ff($oVoucher->value, $this->get_option('wpsg_currency')).')</span>';
-
-                            ?></span><?php 
-							
-								if ($oVoucher->isCoupon()) {
-									
-									echo '<br />'.__('Wertgutschein', 'wpsg');
-									
-								}
-								
-							?></td>
-							<td class="col_product"><?php
-
-								if ($oVoucher->getAllowedProduct()) {
-
-									$arAllowed = $oVoucher->getAllowedProduct();
-									$names = [];
-
-									foreach ($arAllowed as $productID) {
-										if (!wpsg_isSizedInt($productID)) continue;
-										try {
-											$p = wpsg_product::getInstance($productID);
-											$names[] = wpsg_hspc($p->getProductName());
-										} catch (\Exception $e) {}
-									}
-									echo implode(', ', $names);
-								} else if ($oVoucher->isLimitedProductgroup()) {
-									echo __('spezielle Produktgruppen', 'wpsg');
-								} else {
-									echo __('Alle', 'wpsg');
-								}
-
-								?></td>
-                            <td class="col_status">
-
-                                <?php $comment = $oVoucher->comment; if (wpsg_isSizedString($comment)) { ?>
-                                <a title="<?php echo __("Kommentar (Admin): ", "wpsg").htmlspecialchars($comment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign admincomment" href="#"></a>
-                                <?php } ?>
-
-                                <?php echo $oVoucher->getStatusLabel(); ?>
-
-                                <?php $used = $oVoucher->getUsed(); if (wpsg_isSizedInt($used)) { ?>
-                                <?php echo wpsg_translate(__('#1# mal benutzt.', 'wpsg'), $used); ?>
-                                <?php } ?>
-
-                                <?php if ($oVoucher->multi === '1') { ?>
-                                <span title="<?php echo __('Mehrfach benutzbar', 'wpsg'); ?>">&nbsp;[M]</span>
-                                <?php } ?>
-
-                            </td>
-                        </tr>
-                        <?php } ?>					
-                    </tbody>
-                </table>
-
-                 <div class="alignleft actions">
-
-                    <input onclick="if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;" type="submit" value="<?php echo __('Markierte Gutscheine lÃ¶schen', 'wpsg'); ?>" class="button-secondary action" id="doaction" name="submit-multidelete" />
-
-                </div>
-			</form>
-        
-        	<?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-
-        <?php } else { ?>
- 
-			<div class="table wpsg_clear">
-            
-				<?php echo wpsg_drawForm_AdminboxStart(); ?>
-    			<?php echo __('Keine Gutscheine in der Datenbank.', 'wpsg'); ?>
-            	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-			</div>
-
-        <?php } ?>
-
-    </div>
-
-</div>
-
-<!-- Modaldialog fÃŒr Gutscheine -->
-<div class="modal fade" id="wpsg_voucher_dialog" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-				<h4 class="modal-title" id="myModalLabel"><?php echo __('Gutschein hinzufÃŒgen/bearbeiten', 'wpsg'); ?></h4>
-			</div>
-			<div class="modal-body"></div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('Abbrechen', 'wpsg'); ?></button>
-				<button type="button" class="btn btn-primary wpsg-voucher-save" onclick="return false;"><?php echo __('OK', 'wpsg'); ?></button>
+				
+				<script type="text/javascript">/* <![CDATA[ */
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				/* ]]> */</script>
+				
+				<br class="wpsg_clear">
 			</div>
 		</div>
-	</div>
+	  	  
+		<input class="button-primary" type="submit" onclick="if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;" name="wpshopgermany-submit-gs_del" value="<?php echo __("Markierte lÃ¶schen", "wpsg"); ?>" />&nbsp;
+		<br /><br />		
+		<?php } else { ?>
+		<p><?php echo __('Keine Gutscheine in der Datenbank.', 'wpsg'); ?></p>					
+		<?php } ?>
+	
+	</form>
 </div>
 
-<!-- Modaldialog fÃŒr Gutscheine duplizieren -->
-<div class="modal fade" id="wpsg_voucher_clone_dialog" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<form class="modal-content" method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_gutschein&subaction=duplicate&noheader=1">
-
-			<?php wp_nonce_field('wpsg_voucher_clone_dialog', 'wpsg_voucher_clone_dialog'); ?>
-
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-				<h4 class="modal-title"><?php echo __('Gutschein duplizieren', 'wpsg'); ?></h4>
-			</div>
-			<div class="modal-body">
-				<input name="voucher_id" type="hidden" id="wpsg_mod_gutschein_clone_id" />
-				<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_clone_start', __('GÃŒltig ab', 'wpsg'), '', array('datepicker' => true)); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_clone_end', __('GÃŒltig bis', 'wpsg'), '', array('datepicker' => true)); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_clone_count', __('Anzahl', 'wpsg'), 1, array('size' => 3)); ?>
-				<?php echo wpsg_drawForm_Textarea('wpsg_mod_gutschein_clone_comment', __('Kommentar der neuen Gutscheine', 'wpsg'), ''); ?>
-			</div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('Abbrechen', 'wpsg'); ?></button>
-				<button type="submit" class="btn btn-primary" id="wpsg-voucher-clone"><?php echo __('OK', 'wpsg'); ?></button>
-			</div>
-		</form>
-	</div>
-</div>
-
-
-<script type="text/javascript">
-
-    <?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo $this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower($this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-	
-	jQuery('.wpsg-voucher-add').on('click', function() {
-
-		jQuery('#wpsg_voucher_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		jQuery('#wpsg_voucher_dialog').modal( { } ).modal('show');
-
-		jQuery.ajax({
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_gutschein&subaction=addedit&noheader=1',
-			success: function(data) {
-
-				jQuery('#wpsg_voucher_dialog .modal-body').html(data);
-				
+<script type="text/javascript">/* <![CDATA[ */
+
+	function markAll(el)
+	{
+
+		var arCB = jQuery(".wpsg_mod_gs_cb");
+
+		for (var i = 0; i < arCB.length; i ++)
+		{
+			if (el.checked)
+			{
+				jQuery(arCB[i]).attr('checked', true);
 			}
-		});
-		
-		return false;
-		
-	}).attr("onclick", null);
-
-	jQuery('.wpsg_voucher_edit').on('click', function() {
-
-		jQuery('#wpsg_voucher_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		jQuery('#wpsg_voucher_dialog').modal( { } ).modal('show');
-
-		jQuery.ajax({
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_gutschein&subaction=addedit&noheader=1&voucher_id=' + jQuery(this).data("voucher_id"),
-			success: function(data) {
-
-				jQuery('#wpsg_voucher_dialog .modal-body').html(data);
-
+			else
+			{
+				jQuery(arCB[i]).attr('checked', false);
 			}
-		});
-
-		return false;
-		
-	}).attr("onclick", null);
-	
-	jQuery('.wpsg-voucher-save').on('click', function() {
-
-		//jQuery('#wpsg_voucher_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		//jQuery('#wpsg_voucher_dialog').modal('hide');
-		
-		wpsg_loading('#wpsg_voucher_dialog .modal-body');
-		
-		jQuery.ajax({
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_gutschein&subaction=save&noheader=1',
-			data: {
-				form_data: jQuery('#wpsg_voucher_form').serialize()
-			},
-			success: function(data) {
-
-				wpsg_loading_done('#wpsg_voucher_dialog .modal-body');
-								
-				if (data !== "1") alert(data);
-				else {
-				
-					location.reload();
+		}
 					
-				}
-
-			}
-		});
-		
-		return false;
-		
-	}).attr("onclick", null);
-	
-	function wpsg_setFilterStatus(state)
-	{
-
-		jQuery('#filterstatus').val(state);
-
-		jQuery('#seite').val(1);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	}
-
-	function goPage(page)
-	{
-
-		//if (page <= 0 || page == <?php echo $this->view['arFilter']['page']; ?> || page > <?php echo $this->view['pages']; ?>) return;
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-    jQuery(document).ready(function() {
-
-        jQuery('.wpsg-order-tab-mods').bind('click', function() {
-
-            if (jQuery(this).hasClass('active'))
-            {
-
-                jQuery(this).removeClass('active');
-                jQuery('.' + jQuery(this).attr("id")).slideUp(250);
-
-            }
-            else
-            {
-
-                jQuery(this).addClass('active');
-                jQuery('.' + jQuery(this).attr("id")).slideDown(250);
-
-            }
-
-            return false;
-
-        } );
-
-    } );
-
-	document.querySelectorAll('.wpsg_voucher_duplicate').forEach(function(btn) {
-
-		btn.addEventListener('click', function(e) {
-
-			e.preventDefault();
-
-			const id = this.dataset.voucher_id;
-			const start_date = this.dataset.voucher_start_date;
-			const end_date = this.dataset.voucher_end_date;
-			const code = this.dataset.code;
-
-			document.getElementById('wpsg_mod_gutschein_clone_id').value = id;
-			document.getElementById('wpsg_mod_gutschein_clone_start').value = start_date;
-			document.getElementById('wpsg_mod_gutschein_clone_end').value = end_date;
-			document.getElementById('wpsg_mod_gutschein_clone_comment').value = 'Kopie aus Gutschein "' + code + '" / ' + new Date().toLocaleDateString('de-DE');
-
-			jQuery('#wpsg_voucher_clone_dialog').modal('show');
-
-		});
-
-	});
-
-	document.getElementById('wpsg-voucher-clone').addEventListener('click', function() {
-
-		wpsg_loading('body');
-
-	});
-
-</script>
+	} // function markAll(el)
+
+/* ]]> */</script>
Index: ews/mods/mod_gutschein/mail_order_end.phtml
===================================================================
--- /views/mods/mod_gutschein/mail_order_end.phtml	(revision 8528)
+++ 	(revision )
@@ -1,27 +1,0 @@
-<?php
-	 
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 31.07.2019
-	 * Time: 17:15
-	 */ 
-    
-	namespace wpsg;
-	
-	$arCalculation = $this->view['basket']['arCalculation'];
-	
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-	
-	echo "\r\n";
-	
-	foreach ($arCalculation['coupon'] as $gs) {
-	
-		echo '     '.wpsg_pad_right(__('Wertgutschein', 'wpsg').' '.((wpsg_isSizedString($gs['code']))?'('.$gs['code'].')':''), 37);
-		echo wpsg_pad_left(wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency')), 34)."\r\n";
-		
-	}
-	
-	echo '     '.wpsg_pad_right(__('Zu zahlen', 'wpsg'), 37);
-	echo wpsg_pad_left(wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 34)."\r\n";
-	 
Index: ews/mods/mod_gutschein/mail_order_end_html.phtml
===================================================================
--- /views/mods/mod_gutschein/mail_order_end_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,50 +1,0 @@
-<?php
-	 
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 31.07.2019
-	 * Time: 17:15
-	 */ 
-    
-	namespace wpsg;
-	
-	$arCalculation = $this->view['basket']['arCalculation'];
-	
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-	
-?>
-
-<?php foreach ($arCalculation['coupon'] as $gs) { ?>
-	
-	<tr class="totalrow">
-		<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name" colspan="3"><?php echo __('Wertgutschein', 'wpsg'); ?> <?php echo ((wpsg_isSizedString($gs['code']))?'('.$gs['code'].')':''); ?>:</td>
-		<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-			<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_mwst"></td>
-		<?php } ?>
-		<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_amount">&nbsp;</td>
-		<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><?php
-				
-			echo wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency'));
-			
-			if (strpos($gs['set'], '%') !== false) {
-				
-				echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($gs['set']), '%').')</span>';
-				
-			}
-		
-		?></td>
-	</tr>
-	
-<?php } ?>
-
-<tr class="totalrow">
-	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name" colspan="2"><?php echo __('Zu zahlen', 'wpsg'); ?>:</td>
-	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_price">&nbsp;</td>
-	<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-		<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_mwst"></td>
-	<?php } ?>
-	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_amount">&nbsp;</td>
-	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_sum"><strong><?php echo wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?></strong></td>
-</tr>
-    
Index: ews/mods/mod_gutschein/overview_row_end_coupon.phtml
===================================================================
--- /views/mods/mod_gutschein/overview_row_end_coupon.phtml	(revision 8528)
+++ 	(revision )
@@ -1,52 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 20.07.2019
-	 * Time: 16:11
-	 */ 
-    
-	$arCalculation = &$this->view['basket']['arCalculation'];
-	
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-	
-?>
-
-<?php if (wpsg_isSizedArray($arCalculation['coupon'])) { ?>
-	
-	<?php foreach ($arCalculation['coupon'] as $gs) { ?>
-		
-		<div class="overview_sum_row">
-			<div class="title">
-				<?php echo __('Wertgutschein', 'wpsg'); ?> <?php echo ($gs['code'] != '')? '('.$gs['code'].')':'' ?>
-			</div>
-			<div class="value"><?php
-					
-					echo wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency'));
-					
-					if (strpos($gs['set'], '%') !== false) {
-						
-						echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($gs['set']), '%').')</span>';
-						
-					}
-				
-				?></div>
-		</div>
-	
-	<?php } ?>
-
-<?php } ?>
-
-<div class="wpsg_spacer"></div>
-<div class="overview_sum_row">
-	<div class="title2">
-		<?php echo __('Zu zahlen', 'wpsg'); ?>:
-	</div>
-	<div class="sum">
-		<?php echo wpsg_ff($arCalculation['sum']['topay_'.$display_brutto_netto], $this->get_option('wpsg_currency')); ?>
-	</div>
-</div>
-<div class="wpsg_spacer"></div>
Index: /views/mods/mod_gutschein/settings_edit.phtml
===================================================================
--- /views/mods/mod_gutschein/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_gutschein/settings_edit.phtml	(revision 5261)
@@ -6,6 +6,4 @@
 
 ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_size', __('LÃ€nge der Gutscheincodes', 'wpsg'), $this->get_option('wpsg_mod_gutschein_size'), array ('help' => 'wpsg_mod_gutschein_size')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_size', __('LÃ€nge der Gutscheincodes', 'wpsg'), $this->get_option('wpsg_mod_gutschein_size'), array ('help' => wpsg_mod_gutschein_size)); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_gutschein_perPage', __('Gutscheine pro Seite (Backend)', 'wpsg'), $this->get_option('wpsg_mod_gutschein_perPage'), array ('help' => 'wpsg_mod_gutschein_perPage')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_gutschein_one', __('Nur ein Gutschein je Bestellung erlauben', 'wpsg'), $this->get_option('wpsg_mod_gutschein_one'), ['help' => 'wpsg_mod_gutschein_one']);
-
Index: /views/mods/mod_icp/order_done.phtml
===================================================================
--- /views/mods/mod_icp/order_done.phtml	(revision 8528)
+++ /views/mods/mod_icp/order_done.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Bestellabschlussseite mit SecurePay
+	 * Template fÃŒr die BestellabschluÃseite mit SecurePay
 	 */
 
Index: /views/mods/mod_invoice_type/settings_edit.phtml
===================================================================
--- /views/mods/mod_invoice_type/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_invoice_type/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,15 @@
+<?php
+
+	/**
+	 * Einstellungen fÃŒr das Zahlungsmodul "Rechnung"
+	 */
+			
+?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_invoice_type_bezeichnung', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_invoice_type_bezeichnung'), array('help' => 'wpsg_mod_invoice_type_bezeichnung')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_invoide_type_aktiv', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_invoide_type_aktiv'), array('help' => 'wpsg_mod_invoice_type_aktiv')); ?>
+<?php echo wpsg_drawForm_Textarea('wpsg_mod_invoice_type_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_invoice_type_hint'), array('help' => 'wpsg_mod_invoice_type_hint')); ?>
+
+<br />
+<?php echo wpsg_drawForm_Input('wpsg_mod_invoice_type_gebuehr', __('GebÃŒhr/ Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_invoice_type_gebuehr'), true), array('help' => 'wpsg_mod_invoice_type_gebuehr','unit' => $this->get_option('wpsg_currency').' / %')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_invoice_type_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_invoice_type_mwst'), array('help' => 'wpsg_mod_invoice_type_mwst')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_invoice_type_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_invoice_type_mwstland'), array('help' => 'wpsg_mod_invoice_type_mwstland')); ?>
Index: /views/mods/mod_keygen/settings_edit.phtml
===================================================================
--- /views/mods/mod_keygen/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_keygen/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,119 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungsseite des keygen Moduls
+	 */
+
+?>
+
+<form name="form1" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $_REQUEST['modul']; ?>&amp;noheader=1" method="post" enctype="multipart/form-data">
+	
+	<?php echo wpsg_drawForm_Select('wpsg_mod_keygen[wpsg_mod_keygen_anwendung]', __('Anwendung', 'wpsg'), array('wpShopGermany' => __('wpShopGermany', 'wpsg'), 'wpNewsletterGermany' => __('wpNewsletterGermany', 'wpsg')), ((isset($_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_anwendung']))?$_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_anwendung']:'')); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_keygen[wpsg_mod_keygen_nr]', __('SchlÃŒsselnummer', 'wpsg'), ((isset($_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_nr']))?$_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_nr']:'')); ?>
+	<?php echo wpsg_drawForm_Select('wpsg_mod_keygen[wpsg_mod_keygen_lizenz]', __('Lizenz', 'wpsg'), array('1' => 'Light', '2' => 'Pro', '3' => 'Enterprise'), ((isset($_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_lizenz']))?$_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_lizenz']:'1')); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_keygen[wpsg_mod_keygen_date]', __('Enddatum (tt.mm.jjjj)', 'wpsg'), ((isset($_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_date']))?$_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_date']:'99.99.9999')); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_keygen[wpsg_mod_keygen_maxver]', __('Maximale Versionsnummer', 'wpsg'), ((isset($_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_maxver']))?$_SESSION['wpsg_mod_keygen']['wpsg_mod_keygen_maxver']:'9.9.9')); ?>
+		
+	<div class="wpsg_form_field">
+		<div class="wpsg_form_left">
+			<label><?php echo __('Module', 'wpsg'); ?>:</label>
+		</div>
+		<div class="wpsg_form_right">
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_rechnungen'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_rechnungen" />&nbsp;<?php echo __('Rechnungsmodul', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_downloadplus'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_downloadplus" />&nbsp;<?php echo __('Downloadplus', 'wpsg'); ?>
+			</label><br /> 
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_statistics'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_statistics" />&nbsp;<?php echo __('Statistikmodul', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_produktartikel'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_produktartikel" />&nbsp;<?php echo __('Produktartikel', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_videodownload'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_videodownload" />&nbsp;<?php echo __('Videodownloadmodul', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">			
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_ordercondition'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_ordercondition" />&nbsp;<?php echo __('Bestellbedingung', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">			
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_voucherproduct'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_voucherproduct" />&nbsp;<?php echo __('Gutscheinprodukt', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_orderupload'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_orderupload" />&nbsp;<?php echo __('Bestellupload', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_deliverynote'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_deliverynote" />&nbsp;<?php echo __('Lieferschein', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_abo'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_abo" />&nbsp;<?php echo __('Abo Produkte', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_shs'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_shs" />&nbsp;<?php echo __('Internetkasse', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_customergroup'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_customergroup" />&nbsp;<?php echo __('Kundengruppen', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+				<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_packagetracking'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_packagetracking" />&nbsp;<?php echo __('Paketverfolgung', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_request'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_request" />&nbsp;<?php echo __('Anfrage Produkte', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_minquantity'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_minquantity" />&nbsp;<?php echo __('Mindestbestellmenge', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_minrequest'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_minrequest" />&nbsp;<?php echo __('Mindestbestellwert', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+			<label style="line-height:25px;">
+				<input class="checkbox" type="checkbox" name="wpsg_mod_keygen[mods][]" <?php echo ((@$_SESSION['wpsg_mod_keygen']['mods']['wpsg_mod_paypalapi'] == '1')?'checked="checked"':''); ?> value="wpsg_mod_paypalapi" />&nbsp;<?php echo __('PayPal PLUS', 'wpsg'); ?>
+			</label>
+			<div class="wpsg_clear"></div>
+		</div>	
+	</div>
+	
+	<input type="hidden" name="aktiv" value="1" />
+	<input type="hidden" name="wpsg_genkey" value="1" />
+	
+	<p class="submit"><input type="submit" value="<?php echo __('Key generieren', 'wpsg'); ?>" class="button-primary" id="submit" name="submit"></p>
+			
+</form>
+
+<br />
+
+<form name="form1" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $_REQUEST['modul']; ?>&amp;noheader=1" method="post" enctype="multipart/form-data">
+		
+	<div class="wpsg_form_field">
+		<div class="wpsg_form_left">
+			<label><?php echo __('Module', 'wpsg'); ?>:</label>
+		</div>
+		<div class="wpsg_form_right">
+			<input type="file" name="testkey" />
+		</div>
+	</div>
+	
+	<br />
+	
+	<input type="hidden" name="aktiv" value="1" />
+	
+	<p class="submit"><input type="submit" value="<?php echo __('Key testen', 'wpsg'); ?>" class="button-primary" id="submit" name="submit">
+	
+</form>
Index: ews/mods/mod_klarna/gfx/klarna.svg
===================================================================
--- /views/mods/mod_klarna/gfx/klarna.svg	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="100" height="40.4494" viewBox="0 0 100 40.4494"><defs><style>.cls-1{fill:#ffb3c7;}</style></defs><g id="Lager_2" data-name="Lager 2"><g id="Layer_1" data-name="Layer 1"><rect class="cls-1" width="100" height="40.4494" rx="11.7384"/><path d="M80.0772,17.7235a6.194,6.194,0,1,0,0,10.2373v.75h3.5145V16.9727H80.0772Zm-3.1964,8.1388a3.0243,3.0243,0,1,1,3.1849-3.02A3.1059,3.1059,0,0,1,76.8808,25.8623Z"/><rect x="28.2027" y="11.7416" width="3.678" height="16.9694"/><path d="M64.1542,16.6569a4.2694,4.2694,0,0,0-3.62,1.6383V16.9733h-3.5V28.711h3.5421V22.5424a2.4754,2.4754,0,0,1,2.6383-2.6591c1.5447,0,2.4325.9228,2.4325,2.6348V28.711h3.5107V21.2464C69.1577,18.5146,66.9857,16.6569,64.1542,16.6569Z"/><path d="M43,17.7235a6.194,6.194,0,1,0,0,10.2373v.75h3.5145V16.9727H43Zm-3.1965,8.1388a3.0243,3.0243,0,1,1,3.1845-3.02A3.1058,3.1058,0,0,1,39.8034,25.8623Z"/><path d="M51.9513,18.5017V16.9728H48.353V28.7111h3.606v-5.48c0-1.8491,2.0042-2.843,3.3949-2.843.014,0,.0276.0014.0417.0015V16.9735A4.3821,4.3821,0,0,0,51.9513,18.5017Z"/><path d="M87.323,24.5476a2.2059,2.2059,0,1,0,2.206,2.2059A2.2057,2.2057,0,0,0,87.323,24.5476Z"/><path d="M25.6675,11.7384H21.8558a9.7488,9.7488,0,0,1-3.9412,7.8678l-1.51,1.131,5.8513,7.9792h4.8106l-5.3837-7.342A13.5049,13.5049,0,0,0,25.6675,11.7384Z"/><rect x="12.1204" y="11.7384" width="3.8185" height="16.9773"/></g></g></svg>
Index: ews/mods/mod_klarna/order_done.phtml
===================================================================
--- /views/mods/mod_klarna/order_done.phtml	(revision 8528)
+++ 	(revision )
@@ -1,42 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 04.03.24
-	 * @time: 13:39
-	 */
-	
-	namespace wpsgKlarna;
-	
-	$view = $this->view['wpsg_mod_klarna'];
-	
-?>
-
-<div class="order_done_wpsg_mod_klarna <?php echo ($view['state']??''); ?>">
-
-	<?php if (($view['state']??'') === 'PAYED_DONE') { ?>
-	
-		<p><?php echo __('Betrag wurde mit Klarna bezahlt.', 'wpsgKlarna'); ?></p>
-	
-	<?php } else if (($view['state']??'') === 'PAYED') { ?>
-	
-		<p><?php echo __('Betrag wurde bereits mit Klarna bezahlt.', 'wpsgKlarna'); ?></p>
-
-	<?php } else if (($view['state']??'') === 'TOPAY') { ?>
-	
-		<div id="wpsg_mod_klarna_widget"></div>
-		<input type="button" class="button" id="klarna_payment_button" value="<?php echo __('Jetzt mit Klarna bezahlen.', 'wpsgKlarna'); ?>" />
-		
-		<?php
-		
-			$this->view['wpsg_mod_klarna']['button_id'] = 'klarna_payment_button';
-		
-			echo $this->render(dirname(__FILE__).'/pay.phtml');
-		
-		?>
-	
-	<?php } ?>
-
-</div>
Index: ews/mods/mod_klarna/order_view_afterpayment.phtml
===================================================================
--- /views/mods/mod_klarna/order_view_afterpayment.phtml	(revision 8528)
+++ 	(revision )
@@ -1,31 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 04.03.24
-	 * @time: 16:38
-	 */
-	
-	namespace wpsgKlarna;
-	
-	$oOrder = \wpsg_order::getInstance(intval($this->view['data']['id']));
-	
-	$client_token = $oOrder->getMeta('wpsg_mod_klarna_client_token', false, '');
-	$session_id = $oOrder->getMeta('wpsg_mod_klarna_session_id', false, '');
-	$authorization_token = $oOrder->getMeta('wpsg_mod_klarna_authorization_token', false, '');
-	$klarna_order_id = $oOrder->getMeta('wpsg_mod_klarna_order_id', false, '');
-	$capture_id = $oOrder->getMeta('wpsg_mod_klarna_capture_id', false, '');
-
-?>
-
-<br />
-	
-<?php if ($client_token !== '') { echo wpsg_drawForm_Input('', __('Klarna ClientToken', 'wpsg'), $client_token, ['readonly' => true]);  } ?>
-<?php if ($session_id !== '') {  echo wpsg_drawForm_Input('', __('Klarna SessionID', 'wpsg'), $session_id, ['readonly' => true]); } ?>
-<?php if ($authorization_token !== '') {  echo wpsg_drawForm_Input('', __('Klarna AuthorizationToken', 'wpsg'), $authorization_token, ['readonly' => true]); } ?>
-<?php if ($klarna_order_id !== '') {  echo wpsg_drawForm_Input('', __('Klarna OrderId', 'wpsg'), $klarna_order_id, ['readonly' => true]); } ?>
-<?php if ($capture_id !== '') {  echo wpsg_drawForm_Input('', __('Klarna CaptureId', 'wpsg'), $capture_id, ['readonly' => true]); } ?>
-
-
Index: ews/mods/mod_klarna/pay.phtml
===================================================================
--- /views/mods/mod_klarna/pay.phtml	(revision 8528)
+++ 	(revision )
@@ -1,114 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 05.03.24
-	 * @time: 07:20
-	 */
-	
-	namespace wpsgKlarna;
- 
-	$view = $this->view['wpsg_mod_klarna'];
-	
-	/** @var \wpsg_order $oOrder */
-	$oOrder = $view['oOrder'];
-	
-	$authorize_arg = [
-		'billing_address' => [
-			'given_name' => $oOrder->getInvoiceFirstName(),
-			'family_name' => $oOrder->getInvoiceName(),
-			'email' => $oOrder->getCustomer()->getEMail(),
-			'street_address' => $oOrder->getInvoiceStreet(),
-			'postal_code' => $oOrder->getInvoiceZip(),
-			'city' => $oOrder->getInvoiceCity(),
-		]
-	];
-	
-?>
-
-<script>
-	
-	window.klarnaAsyncCallback = () => {
-
-		const el_pppl_loading_blocker = document.getElementById('pppl_loading_blocker');
-		
-		Klarna.Payments.init({
-			client_token: '<?php echo $view['client_token']; ?>'
-		});
-		
-		Klarna.Payments.load({
-			container: '#wpsg_mod_klarna_widget'
-		}, {
-		
-		}, function (res) {
-
-			console.log(res);
-			
-		});
-		
-		document.getElementById('<?php echo $view['button_id']; ?>').addEventListener('click', (event) => {
-
-			event.preventDefault();
-			
-			if (el_pppl_loading_blocker) el_pppl_loading_blocker.style.display = 'block';
-			
-			Klarna.Payments.authorize(
-				{}, {},
-				function(res) {
- 
-					console.log(res);
-				
-					if (res.authorization_token) {
-
-						try {
- 
-							fetch('<?php echo $view['url_setAuthToken']; ?>', {
-								method: 'POST',
-								headers: {
-									"Content-Type": "application/json"
-								},
-								body: JSON.stringify({
-									'authorization_token': res.authorization_token
-								})
-							}).then(response => {
-
-								return response.json();
-
-							}).then(data => {
-
-								if (data.success) {
-
-									location.href = data.href;
-
-								} else throw Error();
-
-							}).catch(e => {
-
-								if (el_pppl_loading_blocker) el_pppl_loading_blocker.style.display = 'none';
-
-							});
-							
-						} catch (error) {
-
-							if (el_pppl_loading_blocker) el_pppl_loading_blocker.style.display = 'none';
-
-						}
-						
-					} else {
-						
-						if (el_pppl_loading_blocker) el_pppl_loading_blocker.style.display = 'none';
-						
-					}
-					
-				}
-			);
-
-		});
-
-	};
-	
-</script>
-
-<script src="https://x.klarnacdn.net/kp/lib/v1/api.js" async></script>
Index: /views/mods/mod_klarna/settings_edit.phtml
===================================================================
--- /views/mods/mod_klarna/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_klarna/settings_edit.phtml	(revision 5261)
@@ -1,58 +1,25 @@
 <?php
-	
-	declare(strict_types=1);
-	
+
 	/**
-	 * @author: daniel
-	 * @date: 04.03.24
-	 * @time: 11:56
+	 * Template fÃŒr die Einstellungen des Klarna Moduls
 	 */
-	
-	namespace wpsgKlarna;
-	
+
 ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_bezeichnung', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_klarna_bezeichnung'), array('help' => 'wpsg_mod_klarna_bezeichnung')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_aktiv', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_klarna_aktiv'), array('help' => 'wpsg_mod_klarna_aktiv')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_aktiv_from', __('Aktiv ab Betrag', 'wpsg'), $this->get_option('wpsg_mod_klarna_aktiv_from'), array('help' => 'wpsg_mod_klarna_aktiv_from')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_aktiv_to', __('Aktiv bis Betrag', 'wpsg'), $this->get_option('wpsg_mod_klarna_aktiv_to'), array('help' => 'wpsg_mod_klarna_aktiv_to')); ?>
+<?php echo wpsg_drawForm_Textarea('wpsg_mod_klarna_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_klarna_hint'), array('help' => 'wpsg_mod_klarna_hint')); ?>
+<br />
+<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_merchantID', __('HÃ€ndler ID (Merchant ID)', 'wpsg'), $this->get_option('wpsg_mod_klarna_merchantID'), array('help' => 'wpsg_mod_klarna_merchantID')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_sharedSecret', __('Geheimnis', 'wpsg'), $this->get_option('wpsg_mod_klarna_sharedSecret'), array('help' => 'wpsg_mod_klarna_sharedSecret')); ?> 
+<br />
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_sandbox', __('Sandboxmodus', 'wpsg'), $this->get_option('wpsg_mod_klarna_sandbox'), array('help' => 'wpsg_mod_klarna_sandbox')); ?>
+<br />
+<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_gebuehr', __('GebÃŒhr', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_klarna_gebuehr'), true), array('help' => 'wpsg_mod_klarna_gebuehr','unit' => $this->get_option('wpsg_currency').' / %')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_klarna_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_klarna_mwst'), array('help' => 'wpsg_mod_klarna_mwst')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_klarna_mwstland'), array('help' => 'wpsg_mod_klarna_mwstland')); ?>
+<br />
+<?php echo wpsg_drawForm_Select('wpsg_mod_klarna_success', __('Erfolgsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_mod_klarna_success'), array('help' => 'wpsg_mod_klarna_success')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_klarna_error', __('Fehlerseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_mod_klarna_error'), array('help' => 'wpsg_mod_klarna_error')); ?>
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_active', __('Zahlungsart fÃŒr neue Bestellungen aktiv', 'wpsg'), $this->get_option('wpsg_mod_klarna_active'), ['help' => 'wpsg_mod_klarna_active']); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_admin_active', __('Zahlungsart nur fÃŒr Admins aktiv', 'wpsgPayone'), $this->get_option('wpsg_mod_klarna_admin_active'), ['help' => 'wpsg_mod_klarna_admin_active']); ?>
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_api_user', __('API Benutzername', 'wpsg'), $this->get_option('wpsg_mod_klarna_api_user'), ['help' => 'wpsg_mod_klarna_api_user']); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_api_password', __('API Passwort', 'wpsg'), $this->get_option('wpsg_mod_klarna_api_password'), ['help' => 'wpsg_mod_klarna_api_password']); ?>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_sandbox', __('Sandbox Modus', 'wpsg'), $this->get_option('wpsg_mod_klarna_sandbox'), ['help' => 'wpsg_mod_klarna_sandbox']); ?>
-
-<div id="wpsg_mod_klarna_sandbox_layer">
-	<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_sandbox_user', __('(Sandbox) API Benutzername', 'wpsg'), $this->get_option('wpsg_mod_klarna_sandbox_user'), ['help' => 'wpsg_mod_klarna_sandbox_user']); ?>
-	<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_sandbox_password', __('(Sandbox) API Passwort', 'wpsg'), $this->get_option('wpsg_mod_klarna_sandbox_password'), ['help' => 'wpsg_mod_klarna_sandbox_password']); ?>
-</div>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_debug', __('API Anfragen im Bestellprotokoll protokollieren', 'wpsg'), $this->get_option('wpsg_mod_klarna_debug'), ['help' => 'wpsg_mod_klarna_debug']); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_checkout', __('Zahlungen im Checkout vorauthorisieren', 'wpsg'), $this->get_option('wpsg_mod_klarna_checkout'), array('help' => 'wpsg_mod_klarna_checkout')); ?>
-
-<br />
-
-<script>
-	
-	const el_wpsg_mod_klarna_sandbox = document.getElementById('wpsg_mod_klarna_sandbox');
-	const el_wpsg_mod_klarna_sandbox_layer = document.getElementById('wpsg_mod_klarna_sandbox_layer');
-	
-	el_wpsg_mod_klarna_sandbox.addEventListener('change', (event) => {
-		
-		if (event.target.checked) el_wpsg_mod_klarna_sandbox_layer.style.display = 'block';
-		else el_wpsg_mod_klarna_sandbox_layer.style.display = 'none';
-		
-	});
-	
-	el_wpsg_mod_klarna_sandbox.dispatchEvent(new Event('change'));
-	
-	
-</script>
-
-<br />
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_klarna_fee', __('GebÃŒhr', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_klarna_fee'), true), array('help' => 'wpsg_mod_klarna_fee','unit' => $this->get_option('wpsg_currency').' / %')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_klarna_tax_key', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_klarna_tax_key'), array('help' => 'wpsg_mod_klarna_tax_key')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_klarna_notaxcountry', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_klarna_notaxcountry'), array('help' => 'wpsg_mod_klarna_notaxcountry')); ?>
-<?php echo wpsg_drawForm_Textarea('wpsg_mod_klarna_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_klarna_hint'), array('help' => 'wpsg_mod_klarna_hint')); ?>
Index: ews/mods/mod_kundenkontakt/order_index_bottom.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/order_index_bottom.phtml	(revision 8528)
+++ 	(revision )
@@ -1,213 +1,0 @@
-<?php
-
-	declare(strict_types=1);
-
-	/**
-	 * User: Daschmi (daschmi@daschmi.de)
-	 * Date: 03.08.2021
-	 * Time: 07:17
-	 */
-
-	namespace wpsg;
-	
-	$arTemplateSelect = ['0' => __('Bitte auswÃ€hlen', 'wpsg')];
-	
-	foreach ($this->view['arTemplates'] as $t) $arTemplateSelect[$t['filename']] = $t['name'];
-	
-?>
-
-<fieldset id="wpsg_mod_kundenkontakt_layer" style="display:none;">
-    <legend><?php echo __('Kundenkontakt', 'wpsg'); ?></legend>
-    <div>
-        
-        <?php echo wpsg_drawForm_Select('wpsg_mod_kundenkontakt_template', __('Template', 'wpsg'), $arTemplateSelect, '0'); ?>
-        <?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt_subject', __('Betreff', 'wpsg'), '', ['wrap_id' => 'wpsg_mod_kundenkontakt_subject_wrap']); ?>
-        
-        <?php /* echo wpsg_drawForm_Textarea('wpsg_mod_kundenkontakt_text', __('Text', 'wpsg'), '', ['wrap_id' => 'wpsg_mod_kundenkontakt_text_wrap']); */ ?>
-        			
-        <div class="form-group form-group-sm form-textarea" id="wpsg_mod_kundenkontakt_text_wrap">	
-                <label class="col-sm-6 control-label" for="wpsg_mod_kundenkontakt_text">Text</label>                
-                <div class="col-sm-6">                    
-                    <div class="wpsg_field_wrap">
-            
-                        <?php if ($this->get_option('wpsg_htmlmail') === '1') { ?>
-                            
-                            <?php wp_editor('', 'wpsg_mod_kundenkontakt_text'); ?>
-                            
-                        <?php } else { ?>
-                        
-                            <textarea class="form-control" id="wpsg_mod_kundenkontakt_text" name="wpsg_mod_kundenkontakt_text"></textarea>
-                    
-                        <?php } ?>
-                        
-                    </div>
-                        
-            </div>
-            
-            <div class="clearfix wpsg_clear"></div>
-            
-        </div> 
-            
-        <?php echo wpsg_drawForm_Button(__('Kunden informieren', 'wpsg'), '', ['wrap_id' => 'wpsg_mod_kundenkontakt_submit_wrap', 'field_id' => 'wpsg_mod_kundenkontakt_submit']); ?>
-        
-        <?php echo wpsg_drawForm_Text('', __('Bitte warten ...', 'wpsg'), 'wpsg_mod_kundenverwaltung_loading', ['wrap_id' => 'wpsg_mod_kundenkontakt_loading_wrap']); ?>
-        
-    </div>
-</fieldset>
-
-<script>
-            
-    let el_wpsg_mod_kundenkontakt_layer = document.getElementById('wpsg_mod_kundenkontakt_layer');
-    
-    let el_wpsg_mod_kundenkontakt_subject = document.getElementById('wpsg_mod_kundenkontakt_subject');
-    let el_wpsg_mod_kundenkontakt_subject_wrap = document.getElementById('wpsg_mod_kundenkontakt_subject_wrap');
-    
-    let el_wpsg_mod_kundenkontakt_text = document.getElementById('wpsg_mod_kundenkontakt_text');
-    let el_wpsg_mod_kundenkontakt_text_wrap = document.getElementById('wpsg_mod_kundenkontakt_text_wrap');
-    
-    let el_wpsg_mod_kundenkontakt_submit = document.getElementById('wpsg_mod_kundenkontakt_submit');
-    let el_wpsg_mod_kundenkontakt_submit_wrap = document.getElementById('wpsg_mod_kundenkontakt_submit_wrap');
-    
-    let el_wpsg_mod_kundenkontakt_loading_wrap = document.getElementById('wpsg_mod_kundenkontakt_loading_wrap');
-    
-    let el_doaction = document.getElementById('doaction');
-    
-    document.getElementById('wpsg_mod_kundenkontakt_template').addEventListener('change', (event) => {
-            
-    	if (event.target.value !== '0') {
-            
-    		el_wpsg_mod_kundenkontakt_loading_wrap.style.display = 'block';
-    		
-            jQuery.ajax({ 
-                url: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_kundenkontakt&noheader=1&do=kk_switchTemplate",
-                dataType: 'json',
-                data: {					
-                    template_file: event.target.value
-                },
-                success: function(data) {
-            
-                	el_wpsg_mod_kundenkontakt_loading_wrap.style.display = 'none';
-                	
-                	el_wpsg_mod_kundenkontakt_subject_wrap.style.display = 'block';
-    		        el_wpsg_mod_kundenkontakt_text_wrap.style.display = 'block';  
-    		        el_wpsg_mod_kundenkontakt_submit_wrap.style.display = 'block';  
-                	
-                    el_wpsg_mod_kundenkontakt_subject.value = data.subject;
-                    
-                    <?php if ($this->get_option('wpsg_htmlmail') === '1') { ?>
-                    tinyMCE.get('wpsg_mod_kundenkontakt_text').setContent(data.content);
-                    <?php } else { ?>
-                    el_wpsg_mod_kundenkontakt_text.value = data.content;
-                    <?php } ?>
-                    
-                }
-            });
-
-	    } else {
-    		    		
-    		el_wpsg_mod_kundenkontakt_subject_wrap.style.display = 'none';
-    		el_wpsg_mod_kundenkontakt_text_wrap.style.display = 'none';
-    		el_wpsg_mod_kundenkontakt_submit_wrap.style.display = 'none';
-    		el_wpsg_mod_kundenkontakt_loading_wrap.style.display = 'none';
-    		    		
-        }
-        
-    });
-    
-    el_wpsg_mod_kundenkontakt_submit.addEventListener('click', (event) => {
-    	
-    	event.preventDefault();
-    	
-    	let arOrderID = [];
-    	
-    	for (let el of document.querySelectorAll('.col_set_checkbox')) {
-    		
-    		if (el.checked) arOrderID.push(el.getAttribute('data-order_id'));
-    		
-        }
-    	    	
-    	if (arOrderID.length <= 0) {
-    		
-    		alert('<?php echo __('Bitte mindestens eine Bestellung auswÃ€hlen.', 'wpsg'); ?>');
-    		return;
-        }    	
-    	
-    	el_wpsg_mod_kundenkontakt_submit.setAttribute("disabled", "disabled");
-    	el_wpsg_mod_kundenkontakt_subject.setAttribute("disabled", "disabled");
-        el_wpsg_mod_kundenkontakt_text.setAttribute("disabled", "disabled");
-    	  
-    	el_wpsg_mod_kundenkontakt_loading_wrap.style.display = 'block';
-    	
-    	jQuery.ajax({ 
-            url: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_kundenkontakt&noheader=1&do=kk_sendMail",
-            data: {					
-                arOrderID: arOrderID,
-                <?php if ($this->get_option('wpsg_htmlmail') === '1') { ?>
-                text: tinyMCE.activeEditor.getContent(),
-                <?php } else { ?>
-                text: el_wpsg_mod_kundenkontakt_text.value,
-                <?php } ?>
-                subject: el_wpsg_mod_kundenkontakt_subject.value
-            },
-            success: function(data) {
-                    	            	
-            	document.getElementById('wpsg_mod_kundenkontakt_template').selectedIndex = 0;
-            	
-            	for (let el of document.querySelectorAll('.col_set_checkbox')) {
-            		
-            		el.checked = false;
-            		
-	            }
-            	
-            	el_wpsg_mod_kundenkontakt_loading_wrap.style.display = 'none';
-            	
-            	el_wpsg_mod_kundenkontakt_subject_wrap.style.display = 'none';
-            	el_wpsg_mod_kundenkontakt_subject.value = '';
-            	
-            	el_wpsg_mod_kundenkontakt_text_wrap.style.display = 'none';
-            	el_wpsg_mod_kundenkontakt_text.value = '';
-            	        
-            	el_wpsg_mod_kundenkontakt_submit.removeAttribute("disabled");
-            	el_wpsg_mod_kundenkontakt_subject.removeAttribute("disabled");
-                el_wpsg_mod_kundenkontakt_text.removeAttribute("disabled");
-            	
-            	el_wpsg_mod_kundenkontakt_submit_wrap.style.display = 'none';
-            	
-            	alert(data);
-            	
-            }
-        });
-    	
-    });
-    
-    document.getElementById('wpsg_action').addEventListener('change', (event) => {
-        
-        if (event.target.value === 'customercontact') {
-            
-        	el_doaction.style.display = 'none';
-            el_wpsg_mod_kundenkontakt_layer.style.display = 'block';
-            
-        } else {
-        
-        	el_doaction.style.display = 'inline-block';
-        	el_wpsg_mod_kundenkontakt_layer.style.display = 'none';
-        	
-        }
-        
-    });
-    
-</script>
-
-<style>
-    
-    #wpsg_mod_kundenkontakt_text { height:300px; }
-    #wpsg_mod_kundenkontakt_subject_wrap { display:none; }
-    #wpsg_mod_kundenkontakt_text_wrap { display:none; }
-    #wpsg_mod_kundenkontakt_submit_wrap { display:none; }
-    #wpsg_mod_kundenkontakt_loading_wrap { display:none; }
-    #wpsg_mod_kundenkontakt_layer .form-group > label { width:15% !important; }
-    #wpsg_mod_kundenkontakt_layer .wpsg_form_field > .wpsg_form_left { width:15% !important; }
-    #wpsg_mod_kundenkontakt_layer .form-group > div:nth-child(2),
-    #wpsg_mod_kundenkontakt_layer .wpsg_form_field > .wpsg_form_right { width:85% !important; }
-    
-</style>
Index: /views/mods/mod_kundenkontakt/order_view.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/order_view.phtml	(revision 8528)
+++ /views/mods/mod_kundenkontakt/order_view.phtml	(revision 5261)
@@ -131,6 +131,9 @@
 </script>
 <?php //wpsg_debug($this->view) ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Kundenkontakt', 'wpsg'));?>
-	
+<div class="postbox" id="wpsg_kundenkontakt">			
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Kundenkontakt', 'wpsg'); ?></span>
+	</h3>
 	<div class="inside">						
 		<div style="padding:5px;">
@@ -138,15 +141,19 @@
 			<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_kundenkontakt&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1">	
 					
-				<label><?php echo __("Template", "wpsg"); ?>:</label>
-				<select name="kk_template" class="wpsg_kundenkontakt_template" id="kk_template" onchange="kk_switchTemplate();">
+				<label>
+					<?php echo __("Template", "wpsg"); ?>:
+					<select name="kk_template" style="width:50%; float:right;" id="kk_template" onchange="kk_switchTemplate();">
 					<option value="-1"><?php echo __("Bitte auswÃ€hlen", "wpsg"); ?></option>
 					<?php foreach ($this->view['arTemplates'] as $k => $v) { ?>
-						<option value="<?php echo rawurlencode($v['filename']); ?>"><?php echo htmlspecialchars($v['name']); ?></option>
+					<option value="<?php echo rawurlencode($v['filename']); ?>"><?php echo htmlspecialchars($v['name']); ?></option>
 					<?php } ?>
-				</select>			
+					</select>			
+				</label>
 				<div class="wpsg_clear"></div>
 									
-				<label><?php echo __("Betreff", "wpsg"); ?>:</label>
-				<input type="text" name="kk_subject" class="wpsg_kundenkontakt_betreff" id="kk_subject" />
+				<label>
+					<?php echo __("Betreff", "wpsg"); ?>:
+					<input type="text" name="kk_subject" style="width:50%; float:right;" id="kk_subject" />
+				</label>
 				<div class="wpsg_clear"></div>
 							
@@ -160,6 +167,8 @@
 				<div class="wpsg_clear"></div>
 				<?php } else { ?>			
-				<label><?php echo __("Text", "wpsg"); ?>:<br /></label>
-				<textarea id="kk_text" class="wpsg_kundenkontakt_textarea" style="font-family:monospace;"></textarea>
+				<label>
+					<?php echo __("Text", "wpsg"); ?>:<br />
+					<textarea id="kk_text" style="width:100%; float:right; height:150px;"></textarea>
+				</label>
 				<div class="wpsg_clear"></div>
 				<?php } ?>
@@ -170,87 +179,6 @@
 				
 			</form>
-						
+			
 		</div>
 	</div>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php if ($this->get_option('wpsg_mod_kundenkontakt_smsflatrate_active') === '1') { ?>
-	<?php echo wpsg_drawForm_AdminboxStart(__('SMS Versand', 'wpsg'));?>
-	
-		<div class="inside">
-			<div style="padding:5px;">
-		
-				<form id="sms_form" method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_kundenkontakt&edit_id=<?php echo $this->view['data']['id']; ?>&do=sms_submit&noheader=1">
-		
-					<input type="hidden" name="_wpnonce" value="<?php echo \wp_create_nonce('wpsg_mod_kundenkontakt_sms_form_'.$this->view['data']['id']); ?>" />
-					
-					<p>Mit diesem Formular kann eine SMS an den Kunden versendet werden.</p>
-										
-					<br />
-				
-					<div id="numbercheck">
-						<?php if ($this->view['valid'] === true) { ?>
-						
-							<div class="alert alert-success">
-								<?php echo wpsg_translate(__('Die Telefonnummer #1# ist gÃŒltig.', 'wpsg'), $this->view['phone']); ?>
-							</div>
-							
-						<?php } else { ?>
-		
-							<div class="alert alert-danger">
-								<?php echo wpsg_translate(__('Die Telefonnummer #1# ist nicht gÃŒltig.', 'wpsg'), $this->view['phone']); ?>
-							</div>
-						
-						<?php } ?>
-					</div>			
-	
-					<br />
-					
-					<?php echo wpsg_drawForm_Input('phone', __('EmpfÃ€nger', 'wpsg'), $this->view['phone']); ?>
-					
-					<br />
-		
-					<textarea id="text" name="text" <?php echo (($this->view['valid'] === true)?'':'disabled="disabled"'); ?> style="width:100%; height:100px;"></textarea>
-		
-					<input type="submit" id="sms_submit" <?php echo (($this->view['valid'] === true)?'':'disabled="disabled"'); ?> value="<?php echo __('SMS Senden', 'wpsg'); ?>" class="button" style="float:right; margin-top:15px;" />
-		
-					<script>
-						
-						jQuery('#phone').on('input', function() {
-	
-							jQuery('#numbercheck').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-							
-							jQuery('#text').prop('disabled', true);
-							jQuery('#sms_submit').prop('disabled', true);
-							
-							jQuery.ajax( {
-								url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_kundenkontakt&noheader=1&edit_id=<?php echo $_REQUEST['edit_id']; ?>&do=validateNumber',
-								data: {
-									'phone': jQuery('#phone').val()
-								},
-								success: function(data) {
-	
-									if (data.valid) {
-									
-										jQuery('#text').prop('disabled', false);
-										jQuery('#sms_submit').prop('disabled', false);
-										
-									}
-	
-									jQuery('#numbercheck').html(data.text);
-									
-								}
-							} );
-							
-						} );
-						
-					</script>
-					
-				</form>		
-			
-			</div>
-		</div>
-	
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
+</div>
Index: ews/mods/mod_kundenkontakt/settings_edit.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/settings_edit.phtml	(revision 8528)
+++ 	(revision )
@@ -1,60 +1,0 @@
-<?php
-	
-	/**
-	 * Einstellungen fÃŒr das Kundenkontaktmodul
-	 */
-	
-	namespace wpsg;
-	
-?>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenkontakt[smsflatrate][active]', __('SMS Flatrate Dienst nutzen', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_active'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_active']); ?>
-     
-<div id="smsflatrate_layer" style="display:<?php echo (($this->get_option('wpsg_mod_kundenkontakt_smsflatrate_active') === '1')?'block':'none'); ?>;">
-
-	<?php echo wpsg_drawForm_TextStart(); ?>
-    	<p style="font-weight:bold; "><?php echo __('Vorgehensweise:', 'wpsg'); ?></p>
-    	<ol>
-    		<li><?php echo __('Kundenaccount <a href="http://smsflatrate.de/">hier</a> anlegen', 'wpsg'); ?></li>
-    		<li><?php echo __('In Kundenaccount <a href="https://my.smsflatrate.net/">hier</a> einloggen', 'wpsg'); ?></li>
-    		<li><?php echo __('App-Key anlegen', 'wpsg'); ?></li>
-    		<li><?php echo __('AppKey und andere Daten in Modul hinterlegen', 'wpsg'); ?></li>
-    	</ol>
-    	
-    	<br/>
-	
-		<p style="font-weight:bold; "><?php echo __('Hinweis:', 'wpsg'); ?></p>
-		<p><?php echo __('Bitte beachten Sie wÃ€hrend der Nutzung der SMS-Funktion innerhalb des wpShopGermany Ihr Guthaben, welches bei dem SMS-Anbieter aufgeladen werden muss.', 'wpsg'); ?></p>
-		
-		<?php /* TODO: Guthaben anzeigen */ ?>
-		
-	<?php echo wpsg_drawForm_TextEnd(); ?>
-
-	<hr>
-	
-	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt[smsflatrate][key]',__('SchlÃŒssel', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_key'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_key']); ?>
-	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt[smsflatrate][from]',__('Absender', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_from'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_from']); ?>
-	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt[smsflatrate][type]',__('Feld d / "type"', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_type'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_type']); ?>
-	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt[smsflatrate][status]',__('Feld e / "status"', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_status'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_status']); ?>
-	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt[smsflatrate][reply]',__('Feld f / "reply"', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_reply'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_reply']); ?>
-	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenkontakt[smsflatrate][replytomail]',__('Feld g / "replytomail"', 'wpsg'), $this->get_option('wpsg_mod_kundenkontakt_smsflatrate_replytomail'), ['help' => 'wpsg_mod_kundenkontakt_smsflatrate_replytomail']); ?>
-	
-</div>
-
-<script>
-	
-	jQuery('#wpsg_mod_kundenkontaktsmsflatrateactive').on('click', function() {
-		
-		if (jQuery(this).prop('checked')) {
-			
-			jQuery('#smsflatrate_layer').show();
-			
-		} else {
-
-			jQuery('#smsflatrate_layer').hide();
-			
-		}
-		
-	} );
-	
-</script>
Index: /views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml	(revision 8528)
+++ /views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 	
 	global $template_name, $template_betreff, $absender_name, $absender_email;
-		
+
 	/**
 	 * Betreff des Templates
@@ -9,7 +9,14 @@
 	$template_betreff = __('wpShopGermany: Zahlungsaufforderung', 'wpsg');
 		
-?><?php echo __('Hallo %kunde_anrede% %kunde_vname% %kunde_name%,', 'wpsg'); ?> 
+	/*
+	 * $this->view['basket'] enthÃ€lt Angaben ÃŒber den Warenlorb
+	 * $this->view['kunde'] EnthÃ€lt den Kundendatensatz aus der Datenbank
+	 * $this->view['order'] EnthÃ€lt den Bestelldatensatz aus der Datenbank
+	 * $this->view['datum'] EnthÃ€lt das aktuelle Datum (Timestemp)
+	 */
+	 
+?><?php echo __('Hallo', 'wpsg') ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>, 
  
-<?php echo __('Sie sind Ihren Zahlungsverpflichtungen nicht nachgekommen. Bitte begleichen Sie umgehend den Rechnungsbetrag von %order_topay_brutto_formated%.', 'wpsg') ?> 
+<?php echo __('Sie sind Ihren Zahlungsverpflichtungen nicht nachgekommen. Bitte begleichen Sie umgehend den Rechnungsbetrag von', 'wpsg') ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
  
 <?php echo __('Bestelldaten', 'wpsg'); ?>: 
@@ -17,5 +24,5 @@
 
 <?php echo __('Nutzen Sie bitte folgenden Link um den Zahlvorgang abschlieÃen zu kÃ¶nnen', 'wpsg'); ?>:
-%order_done_url% 
+<?php echo $this->getDoneURL($this->view['order']['id']); ?> 
 
 <?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg') ?>
Index: /views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml	(revision 8528)
+++ /views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml	(revision 5261)
@@ -8,8 +8,15 @@
 
 	$template_betreff = __('wpShopGermany: Zahlungsaufforderung', 'wpsg');
+		
+	/*
+	 * $this->view['basket'] enthÃ€lt Angaben ÃŒber den Warenlorb
+	 * $this->view['kunde'] EnthÃ€lt den Kundendatensatz aus der Datenbank
+	 * $this->view['order'] EnthÃ€lt den Bestelldatensatz aus der Datenbank
+	 * $this->view['datum'] EnthÃ€lt das aktuelle Datum (Timestemp)
+	 */
+
+?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
  
-?><p><?php echo __('Hallo %kunde_anrede% %kunde_vname% %kunde_name%,', 'wpsg'); ?></p>
- 
-<p><?php echo __('Sie sind Ihren Zahlungsverpflichtungen nicht nachgekommen. Bitte begleichen Sie umgehend den Rechnungsbetrag von %order_topay_brutto_formated%.', 'wpsg') ?></p>
+<p><?php echo __('Sie sind Ihren Zahlungsverpflichtungen nicht nachgekommen. Bitte begleichen Sie umgehend den Rechnungsbetrag von', 'wpsg') ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>.</p>
 
 <h2><?php echo __('Bestelldaten', 'wpsg'); ?></h2>
@@ -21,5 +28,5 @@
 <p>
 	<?php echo __('Nutzen Sie bitte folgenden Link um den Zahlvorgang abschlieÃen zu kÃ¶nnen', 'wpsg'); ?>:
-	<a href="%order_done_url%"><?php echo __('Bestellabschlussseite', 'wpsg'); ?></a>
+	<a href="<?php echo $this->getDoneURL($this->view['order']['id']); ?>"><?php echo __('BestellabschluÃseite', 'wpsg'); ?></a>
 </p>
 
Index: /views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml	(revision 8528)
+++ /views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml	(revision 5261)
@@ -8,8 +8,15 @@
 
 	$template_betreff = __('wpShopGermany: Zahlungserinnerung', 'wpsg');
-	 	 
-?><?php echo __('Hallo %kunde_anrede% %kunde_vname% %kunde_name%,', 'wpsg'); ?> 
+	 	
+	/*
+	 * $this->view['basket'] enthÃ€lt Angaben ÃŒber den Warenlorb
+	 * $this->view['kunde'] EnthÃ€lt den Kundendatensatz aus der Datenbank
+	 * $this->view['order'] EnthÃ€lt den Bestelldatensatz aus der Datenbank
+	 * $this->view['datum'] EnthÃ€lt das aktuelle Datum (Timestemp)
+	 */
+	
+?><?php echo __('Hallo', 'wpsg') ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,  
  
-<?php echo __('Sie haben am', 'wpsg') ?> %order_cdate_format_de% <?php echo __('eine Bestellung ÃŒber %order_topay_brutto_formated% aufgegeben. Leider ist bis heute kein Zahlungsausgleich erfolgt. Gab es Probleme mit der Zahlung? Gerne helfen wir Ihnen weiter! Oder dÃŒrfen wir die Bestellung fÃŒr Sie stornieren?', 'wpsg') ?> 
+<?php echo __('Sie haben am', 'wpsg') ?> <?php echo date("d.m.Y | H:i", strtotime($this->view['order']['cdate'])); ?> <?php echo __('eine Bestellung ÃŒber', 'wpsg') ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __('aufgegeben. Leider ist bis heute kein Zahlungsausgleich erfolgt. Gab es Probleme mit der Zahlung? Gerne helfen wir Ihnen weiter! Oder dÃŒrfen wir die Bestellung fÃŒr Sie stornieren?', 'wpsg') ?>
  
 <?php echo __('Bestelldaten', 'wpsg'); ?>: 
@@ -17,5 +24,5 @@
 
 <?php echo __('Nutzen Sie bitte folgenden Link um den Zahlvorgang abschlieÃen zu kÃ¶nnen', 'wpsg'); ?>:
-%order_done_url%
+<?php echo $this->getDoneURL($this->view['order']['id']); ?> 
 
 <?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg') ?>
Index: /views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml
===================================================================
--- /views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml	(revision 8528)
+++ /views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml	(revision 5261)
@@ -2,13 +2,20 @@
 
 	global $template_name, $template_betreff, $absender_name, $absender_email;
- 
+
 	/**
 	 * Betreff des Templates
 	 */
 	$template_betreff = __('wpShopGermany: Zahlungserinnerung', 'wpsg');
-	  
-?><p><?php echo __('Hallo %kunde_anrede% %kunde_vname% %kunde_name%,', 'wpsg'); ?></p>
+	 	
+	/*
+	 * $this->view['basket'] enthÃ€lt Angaben ÃŒber den Warenlorb
+	 * $this->view['kunde'] EnthÃ€lt den Kundendatensatz aus der Datenbank
+	 * $this->view['order'] EnthÃ€lt den Bestelldatensatz aus der Datenbank
+	 * $this->view['datum'] EnthÃ€lt das aktuelle Datum (Timestemp)
+	 */
  
-<p><?php echo __('Sie haben am', 'wpsg') ?> %order_cdate_format_de% <?php echo __('eine Bestellung ÃŒber %order_topay_brutto_formated% aufgegeben. Leider ist bis heute kein Zahlungsausgleich erfolgt. Gab es Probleme mit der Zahlung? Gerne helfen wir Ihnen weiter! Oder dÃŒrfen wir die Bestellung fÃŒr Sie stornieren?', 'wpsg') ?></p>
+?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
+ 
+<p><?php echo __('Sie haben am', 'wpsg') ?> <?php echo date("d.m.Y | H:i", strtotime($this->view['data']['cdate'])); ?> <?php echo __('eine Bestellung ÃŒber', 'wpsg') ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __('aufgegeben. Leider ist bis heute kein Zahlungsausgleich erfolgt. Gab es Probleme mit der Zahlung? Gerne helfen wir Ihnen weiter! Oder dÃŒrfen wir die Bestellung fÃŒr Sie stornieren?', 'wpsg') ?></p>
 
 <h2><?php echo __('Bestelldaten', 'wpsg'); ?></h2>
@@ -20,5 +27,5 @@
 <p>
 	<?php echo __('Nutzen Sie bitte folgenden Link um den Zahlvorgang abschlieÃen zu kÃ¶nnen', 'wpsg'); ?>:
-	<a href=""%order_done_url%"><?php echo __('Bestellabschlussseite', 'wpsg'); ?></a>
+	<a href="<?php echo $this->getDoneURL($this->view['order']['id']); ?>"><?php echo __('BestellabschluÃseite', 'wpsg'); ?></a>
 </p>
 
Index: /views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml	(revision 5261)
@@ -12,6 +12,6 @@
 	<?php foreach ($arRoles as $role_key => $r) { ?>
 	<td class="wpsg_col_cap">
-		<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_kundenverwaltung]" value="0" />
-		<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_kundenverwaltung']) && $r['capabilities']['wpsg_kundenverwaltung'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_kundenverwaltung]" value="1" /> 
+		<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_customer]" value="0" />
+		<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_customer']) && $r['capabilities']['wpsg_customer'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_customer]" value="1" /> 
 	</td>
 	<?php } ?>
Index: /views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml	(revision 5261)
@@ -1,33 +1,23 @@
 <?php
 
- /**
-  * Template fÃŒr die Registrierung wÃ€hrend des Checkouts
-  * wird von checkout.phtml eingebunden
-  */
+	/**
+	 * Template fÃŒr die Registrierung wÃ€hrend des Checkouts
+	 * wird von checkout.phtml eingebunden
+	 */
 
 ?>
-<label for="checkout_login" style="line-height:35px; margin-top:25px; cursor:pointer;">    
-	<?php /* display:none, bis Option aktiv */ ?>   
-  	<input <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'checked="checked"':''); ?> type="checkbox" id="checkout_login" value="" onclick="jQuery('#checkout_login_fields').toggle();">&nbsp;
- <span class="wpsg-checkbox-label">Ich mÃ¶chte ein Kundenkonto anlegen.</span>
-</label>         
+<div class="wpsg_checkoutblock">
+	<label for="wpsg_mod_kundenverwaltung_pwd1"><?php echo __("Passwort", "wpsg"); ?>
+	<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+	</label>
+	<input class="wpsg_checkout <?php echo (($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1')?'validate[required]':''); ?> <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="mod_kundenverwaltung_pwd1" name="wpsg[mod_kundenverwaltung][pwd1]" value="" />			
+</div>
 
-<?php /* aktiv bei Registrierungszwang - aktiv bei Fehlermeldung */ ?>
-<div id="checkout_login_fields" style="display:<?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'block':'none'); ?>;">    
- <div class="wpsg_checkoutblock">
-  <label for="wpsg_mod_kundenverwaltung_pwd1"><?php echo __("Passwort", "wpsg"); ?>
-  <?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-  </label>
-  <input class="wpsg_checkout <?php echo (($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1')?'validate[required]':''); ?> <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="mod_kundenverwaltung_pwd1" name="wpsg[mod_kundenverwaltung][pwd1]" value="" />   
- </div>
+<div class="wpsg_checkoutblock">		
+	<label for="wpsg_mod_kundenverwaltung_pwd2"><?php echo __("Passwort wiederholen", "wpsg"); ?>
+	<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+	</label>
+	<input class="wpsg_checkout <?php echo (($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1')?'validate[required]':''); ?> <?php echo ((in_array("mod_kundenverwaltung_pwd2", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="wpsg_mod_kundenverwaltung_pwd2" name="wpsg[mod_kundenverwaltung][pwd2]" value="" />
+</div>
 
- <div class="wpsg_checkoutblock">  
-  <label for="wpsg_mod_kundenverwaltung_pwd2"><?php echo __("Passwort wiederholen", "wpsg"); ?>
-  <?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-  </label>
-  <input class="wpsg_checkout <?php echo (($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1')?'validate[required]':''); ?> <?php echo ((in_array("mod_kundenverwaltung_pwd2", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="wpsg_mod_kundenverwaltung_pwd2" name="wpsg[mod_kundenverwaltung][pwd2]" value="" />
- </div>
-
- <div class="wpsg_clear"></div>
- 
-</div>
+<div class="wpsg_clear"></div>
Index: /views/mods/mod_kundenverwaltung/checkout_login.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/checkout_login.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/checkout_login.phtml	(revision 5261)
@@ -12,12 +12,5 @@
 		<label for="wpsg_mod_kundenverwaltung_email"><?php echo __("E-Mail Adresse", "wpsg"); ?>:
 		</label>
-		<input 
-            class="wpsg_checkout <?php echo ((in_array("wpsg_mod_kundenverwaltung_email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-            type="text" 
-            id="wpsg_mod_kundenverwaltung_email" 
-            name="wpsg[mod_kundenverwaltung][email]" 
-            value=""
-            autocomplete="off"
-        />			
+		<input class="wpsg_checkout <?php echo ((in_array("wpsg_mod_kundenverwaltung_email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_mod_kundenverwaltung_email" name="wpsg[mod_kundenverwaltung][email]" value="" />			
 	</div>
 	
@@ -25,12 +18,5 @@
 		<label for="wpsg_mod_kundenverwaltung_password"><?php echo __("Passwort", "wpsg"); ?>:
 		</label>
-		<input 
-            class="wpsg_checkout <?php echo ((in_array("wpsg_mod_kundenverwaltung_password", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-            type="password" 
-            id="wpsg_mod_kundenverwaltung_password" 
-            name="wpsg[mod_kundenverwaltung][password]" 
-            value="" 
-            autocomplete="off"
-        />
+		<input class="wpsg_checkout <?php echo ((in_array("wpsg_mod_kundenverwaltung_password", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="wpsg_mod_kundenverwaltung_password" name="wpsg[mod_kundenverwaltung][password]" value="" />
 	</div>
 	
Index: /views/mods/mod_kundenverwaltung/checkout_logout.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/checkout_logout.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/checkout_logout.phtml	(revision 5261)
@@ -9,5 +9,5 @@
 <div class="wpsg_checkout wpsg_logout_box">
 		<?php echo __('Hallo','wpsg');?>
-		<?php echo wpsg_hspc(($this->view['basket']['checkout']['title'] != '' && $this->view['basket']['checkout']['title'] != '-1')?$this->view['arAnrede'][$this->view['basket']['checkout']['title']]:''); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['vname']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['name']); ?>	
+		<?php echo wpsg_hspc(($this->view['basket']['checkout']['title'] != '' && $this->view['basket']['checkout']['title'] != '-1')?$this->view['basket']['checkout']['title']:''); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['vname']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['name']); ?>	
 		<a href="<?php echo $this->getUrl(wpsg_ShopController::URL_LOGOUT); ?>"><?php echo __('Abmelden', 'wpsg'); ?></a>
 	
Index: /views/mods/mod_kundenverwaltung/edit.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/edit.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/edit.phtml	(revision 5261)
@@ -4,312 +4,257 @@
 	 * Template fÃŒr die Bearbeitung eines Kunden im Backend
 	 */
-	
-	$oCustomer = wpsg_customer::getInstance(intval($_REQUEST['edit_id']??0));
-	
+
 ?>
-<div class="wpsg_customer" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="wpsg-customer-tab-a active"><a href="#" onclick="return false;"><?php echo __("Kundenverwaltung", "wpsg"); ?></a></li>
-					<li role="presentation" class="active"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&action=add"><span class="glyphicon glyphicon-plus"></span><?php echo __("Kunde anlegen/bearbeiten", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'import'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&action=import&noheader=1"><span class="glyphicon glyphicon-import"></span><?php echo __("Import", "wpsg"); ?></a></li>
-					<?php if (wpsg_isSizedArray($this->view['data'])) { ?>
-						<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'export'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&action=export&noheader=1"><span class="glyphicon glyphicon-export"></span><?php echo __("Export", "wpsg"); ?></a></li>
+<script type="text/javascript">
+/* <![CDATA[ */
+	
+	jQuery(document).ready( function() {
+
+		jQuery('.wpsg_form_help').tipTip();
+
+	    jQuery("#normal-sortables, #side-sortables").sortable({
+			connectWith: ".meta-box-sortables",
+			placeholder: 'wpsg_placeholder',
+			dropOnEmpty: true,
+			cursor: 'move',
+			handle: '.wpsg_handlediv',
+			grid: [50, 20],
+			forceHelperSize: true,
+			forcePlaceholderSize: true,
+			opacity: 0.8,
+			stop: function(e,ui) {
+
+				var ser = jQuery("#normal-sortables").sortable("serialize");				
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+
+				jQuery.cookie('wpsg_customer_view_normal', ser);
+
+				var ser = jQuery("#side-sortables").sortable("serialize");				
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+
+				jQuery.cookie('wpsg_customer_view_side', ser);
+				
+			},
+			receive: function(e, ui) {
+			}
+		}); 
+
+	    if (jQuery.cookie('wpsg_customer_view_normal') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_customer_view_normal').split(',').reverse();
+
+			for (index in divs)
+			{
+
+				jQuery('#normal-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+
+		if (jQuery.cookie('wpsg_customer_view_side') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_customer_view_side').split(',').reverse();
+
+			for (index in divs)
+			{
+				 
+				jQuery('#side-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+
+		jQuery('.wpsg_handlediv').bind('click', function() {
+			jQuery(this).next().toggle();
+
+			var arClose = new Array();
+			jQuery('.wpsg_customer_view .postbox .inside:hidden').each(function() {
+				arClose.push(jQuery(this).parent().attr("id"));
+			} );
+
+			jQuery.cookie('wpsg_customer_closed', arClose.join(','));
+			
+		} );
+
+		if (jQuery.cookie('wpsg_customer_closed') != null)
+		{
+
+			var arClose = jQuery.cookie('wpsg_customer_closed').split(',');
+
+			for (index in arClose)
+			{
+				
+				jQuery('#' + arClose[index] + ' .inside').hide();
+							
+			}
+			
+		}
+		
+	} );
+
+/* ]]> */
+</script>
+             
+<div class="wrap columns-2 wpsg_produkt_addedit wpsg_customer_view">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	<h2>
+		<?php echo wpsg_hspc($this->view['data']['vname'].' '.$this->view['data']['name']); ?>		
+	</h2>
+	<br />
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	
+ 	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=save&amp;noheader=1" enctype="multipart/form-data">
+
+		<div id="postbox" class="metabox-holder has-right-sidebar">
+		
+			<div id="side-info-column" class="inner-sidebar" style="width:386px;">
+				<div id="side-sortables" class="meta-box-sortables ui-sortable" style="width:380px;">
+				
+					<div id="wpsg_customerpasswd" class="postbox">
+						<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+						<h3 class="wpsg_handlediv">
+							<span><?php echo __('PasswortÃ€nderung', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<?php echo wpsg_drawForm_Input('password1', __('Passwort', 'wpsg'), ''); ?>
+							<?php echo wpsg_drawForm_Input('password2', __('Wiederholung', 'wpsg'), ''); ?>
+						</div>
+					</div>
+					
+					<div id="wpsg_customerstats" class="postbox">
+						<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+						<h3 class="wpsg_handlediv">
+							<span><?php echo __('Information', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left"><?php echo __('Bestellungen', 'wpsg'); ?>:</div>
+								<div class="wpsg_form_right">
+									<p>
+										<?php echo $this->view['data']['countOrder']; ?>
+										<?php if ($this->view['data']['countOrder'] > 0) { ?>
+										[ <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter%5Bk_id%5D=<?php echo $this->view['data']['id']; ?>"><?php echo __('Bestellungen anzeigen', 'wpsg'); ?></a> ]										
+										<?php } ?>
+									</p>
+								</div>
+							</div>
+							<div class="wpsg_clear"></div>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left"><?php echo __('Letzte Bestellung', 'wpsg'); ?>:</div>
+								<div class="wpsg_form_right"><p><?php echo wpsg_formatTimestamp(strtotime($this->view['data']['lastorder'])); ?></p></div>
+							</div>
+							<div class="wpsg_clear"></div>
+							<?php if ($this->hasMod('wpsg_mod_statistics')) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left"><?php echo wpsg_translate(__('Umsatz in #1#', 'wpsg'), $this->get_option('wpsg_currency')); ?>:</div>
+								<div class="wpsg_form_right wpsg_mod_kundenverwaltung_customeramount">
+									<p>
+										<?php 
+											echo wpsg_translate(__('<a href="#1#" title="Storniert" class="wpsg_storno">#2#</a> / <a href="#3#" title="Offen" class="wpsg_open">#4#</a> / <a href="#5#" title="Bezahlt" class="wpsg_payed">#6#</a>', 'wpsg'),
+												WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&filter[status]=500&filter[k_id]='.$this->view['data']['id'],
+												wpsg_ff($this->view['amountStorno']),
+												WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&filter[status]=0&filter[k_id]='.$this->view['data']['id'],
+												wpsg_ff($this->view['amountAll'] - $this->view['amountStorno'] - $this->view['amountPayed']),
+												WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&filter[status]=100,110&filter[k_id]='.$this->view['data']['id'],
+												wpsg_ff($this->view['amountPayed'])
+											); 
+										?>
+									</p>
+								</div>
+							</div>
+							<?php } ?>
+							<div class="wpsg_clear"></div>														
+						</div>
+					</div>
+					
+					<?php if (wpsg_isSizedArray($this->view['pflicht']['custom'])) { ?>
+					<div id="wpsg_customercustomfields" class="postbox">
+						<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+						<h3 class="wpsg_handlediv">
+							<span><?php echo __('Benutzerdefinierte Felder', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<?php foreach ($this->view['pflicht']['custom'] as $c_id => $c) { ?>							
+								<?php if ($c['typ'] == '0') { // Textfeld ?>
+								<?php echo wpsg_drawForm_Input('custom['.$c_id.']', __($c['name'], 'wpsg'), @$this->view['data']['custom'][$c_id]); ?>
+								<?php } else if ($c['typ'] == '1') { // Auswahl ?>
+								<?php echo wpsg_drawForm_Select('custom['.$c_id.']', __($c['name'], 'wpsg'), wpsg_array_merge(array('' => __('Keine Auswahl', 'wpsg')), explode('|', $c['auswahl'])), @$this->view['data']['custom'][$c_id], array('noIndex' => true)); ?>
+								<?php } else if ($c['typ'] == '2') { // Checkbox?>
+								<?php echo wpsg_drawForm_Checkbox('custom['.$c_id.']', __($c['name'], 'wpsg'), @$this->view['data']['custom'][$c_id]); ?>	
+								<?php } ?>			
+							<?php } ?>	
+						</div>
+					</div>
 					<?php } ?>
-				</ul>
-			</div>
-		</div>
-
-	</nav>
-	
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-	<div class="wpsg_clear"></div>
-
-	<div class="content form-horizontal">
-
-		<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&action=save&noheader=1" enctype="multipart/form-data">
-
-			<?php echo wpsg_formNounce('Customer', 'save'); ?>
-			
-			<div class="row">
-				<div class="col-md-8 col-lg-8">
-
-					<?php echo wpsg_drawForm_AdminboxStart(__('Allgemein', 'wpsg')); ?>
-                        <?php echo wpsg_drawForm_Input('knr', __('Kundennummer', 'wpsg'), @$this->view['data']['knr']); ?>
-
-                        <?php if ($this->hasMod('wpsg_mod_customergroup')) { ?>
-                            <?php echo wpsg_drawForm_Select('group_id', __('Kundengruppe', 'wpsg'), @$this->view['arCustomergroup'], @$this->view['data']['group_id']); ?>
-                        <?php } ?>
-						<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-                        	<?php echo wpsg_drawForm_Select('title', __('Anrede', 'wpsg'), $this->view['arTitles'], @$this->view['data']['title'], array('noIndex' => true)); ?>
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['name'] != '2') { ?>
-                        	<?php echo wpsg_drawForm_Input('name', __('Name', 'wpsg'), @$this->view['data']['name']); ?>
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['vname'] != '2') { ?>
-	                        <?php echo wpsg_drawForm_Input('vname', __('Vorname', 'wpsg'), @$this->view['data']['vname']); ?>
-						<?php } ?>
-						<?php if ($this->view['pflicht']['geb'] != '2') { ?>
-	                    	<?php echo wpsg_drawForm_Input('geb', __('Geburtsdatum', 'wpsg'), wpsg_formatTimestamp(strtotime($this->view['data']['geb']??''), true), array('autocomplete' => false, 'datepicker' => true, 'hint' => __('Format: TT.MM.JJJJ', 'wpsg'))); ?>
-                       	<?php } ?>
-                        <?php if ($this->view['pflicht']['email'] != '2') { ?>
-                        	<?php echo wpsg_drawForm_Input('email', __('E-Mail', 'wpsg'), @$this->view['data']['email']); ?>
-                        <?php } ?>
-
-						<?php if ($this->view['pflicht']['eInvoice'] != '0') { ?>
-							<?php echo wpsg_drawForm_Input('email_einvoice', __('E-Mail fÃŒr eRechnung', 'wpsg'), $this->view['data']['email_einvoice']??''); ?>
-						<?php } ?>
-
-                        <?php if (($this->view['pflicht']['leitweg']??'') != '0') { ?>
-                            <?php echo wpsg_drawForm_Input('leitweg_id', __('Leitweg-ID', 'wpsg'), @$this->view['data']['leitweg_id']??''); ?>
-                        <?php } ?>
-
-                        <?php if ($this->view['pflicht']['firma'] != '2') { ?>
-                        	<?php echo wpsg_drawForm_Input('firma', __('Firma', 'wpsg'), @$this->view['data']['firma']); ?>
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['tel'] != '2') { ?>
-                        	<?php echo wpsg_drawForm_Input('tel', __('Telefon', 'wpsg'), @$this->view['data']['tel']); ?>
-    					<?php } ?>                    
-                        <?php if ($this->view['pflicht']['fax'] != '2') { ?>
-	                        <?php echo wpsg_drawForm_Input('fax', __('Fax', 'wpsg'), @$this->view['data']['fax']); ?>
-	                   	<?php }?>
-	                    <?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-                    
-                        	<?php echo wpsg_drawForm_Input('strasse', __('StraÃe', 'wpsg'), @$this->view['data']['strasse']); ?>
-										
-							<?php if (($this->view['pflicht']['wpsg_showNr']??'') === '1') { ?>	
-								<?php echo wpsg_drawForm_Input('nr', __('Hausnummer', 'wpsg'), @$this->view['data']['nr']); ?>
-							<?php } ?>
-						
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['plz'] != '2') { ?>	
-                        	<?php echo wpsg_drawForm_Input('plz', __('PLZ', 'wpsg'), @$this->view['data']['plz']); ?>
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['ort'] != '2') { ?>	
-                        	<?php echo wpsg_drawForm_Input('ort', __('Ort', 'wpsg'), @$this->view['data']['ort']); ?>
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['land'] != '2') { ?>	
-                        	<?php echo wpsg_drawForm_Select('land', __('Land', 'wpsg'), @$this->view['arLand'], @$this->view['data']['land']); ?>
-                        <?php } ?>
-                        <?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
-                        	<?php echo wpsg_drawForm_Input('ustidnr', __('UStIdNr.', 'wpsg'), @$this->view['data']['ustidnr']); ?>
-                        <?php } ?>
-                        <?php echo wpsg_drawForm_Select('status', __('Status', 'wpsg'), ['1' => __('Aktiv', 'wpsg'), '0' => __('Inaktiv', 'wpsg'), '-1' => __('Anonymisiert')], @$this->view['data']['status'], array()); ?>
-                        <?php echo wpsg_drawForm_Checkbox('info-mail', __('Mail bei StatusÃ€nderung', 'wpsg'), '', array()); ?>
-                        <?php echo wpsg_drawForm_Textarea('comment', __('Kundenkommentar', 'wpsg'), @$this->view['data']['comment']); ?>
-					<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-                    <?php if (wpsg_isSizedArray($this->view['pflicht']['custom'])) { ?>
-                    <?php echo wpsg_drawForm_AdminboxStart(__('Benutzerdefinierte Felder', 'wpsg')); ?>
-                    <?php foreach ($this->view['pflicht']['custom'] as $c_id => $c) { ?>
-                        <?php if ($c['typ'] == '0') { // Textfeld ?>
-                            <?php echo wpsg_drawForm_Input('custom['.$c_id.']', __($c['name'], 'wpsg'), @$this->view['data']['custom'][$c_id]); ?>
-                        <?php } else if ($c['typ'] == '1') { // Auswahl ?>
-                            <?php echo wpsg_drawForm_Select('custom['.$c_id.']', __($c['name'], 'wpsg'), wpsg_array_merge(array('' => __('Keine Auswahl', 'wpsg')), explode('|', $c['auswahl'])), @$this->view['data']['custom'][$c_id], array('noIndex' => true)); ?>
-                        <?php } else if ($c['typ'] == '2') { // Checkbox?>
-                            <?php echo wpsg_drawForm_Checkbox('custom['.$c_id.']', __($c['name'], 'wpsg'), @$this->view['data']['custom'][$c_id]); ?>
-                        <?php } ?>
-                    <?php } ?>
-                    <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-                    <?php } ?>
-
-				</div>
-				<div class="col-md-4 col-lg-4">
-
-					<?php echo wpsg_drawForm_AdminboxStart(__('PasswortÃ€nderung', 'wpsg')); ?>
-						<?php echo wpsg_drawForm_Input('password1', __('Passwort', 'wpsg'), '', array('type' => 'password')); ?>
-						<?php echo wpsg_drawForm_Input('password2', __('Wiederholung', 'wpsg'), '', array('type' => 'password')); ?>
-                        <div id="wpsg_pwd_info" style="display:none;">
-                            <h4><?php echo __('Passwort sollte folgende Regeln befolgen:','wpsg') ?></h4>
-                            <ul>
-                                <li id="wpsg_pwd_length" class="invalid"><?php echo __('Mindestens 8 Zeichen','wpsg')?></li>
-                                <li id="wpsg_pwd_letter" class="invalid"><?php echo __('Mindestens ein Kleinbuchstabe','wpsg') ?></li>
-                                <li id="wpsg_pwd_capital" class="invalid"><?php echo __('Mindestens ein GroÃbuchstabe','wpsg') ?></li>
-                                <li id="wpsg_pwd_number" class="invalid"><?php echo __('Mindestens eine Zahl','wpsg') ?></li>
-                                <li id="wpsg_pwd_speziell" class="invalid"><?php echo __('Mindestens ein Sonderzeichen','wpsg') ?></li>
-                            </ul>
-                        </div>
-					<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-                    
-					<?php if (wpsg_isSizedInt($this->view['data']['id'])) { ?>
-					<?php echo wpsg_drawForm_AdminboxStart(__('Information', 'wpsg')) ?>
-
-						<?php echo wpsg_drawForm_TextStart(); ?>
-						<p>
-							<?php echo $this->view['data']['countOrder']; ?>
-							<?php if ($this->view['data']['countOrder'] > 0) { ?>
-								[ <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter%5Bk_id%5D=<?php echo $this->view['data']['id']; ?>"><?php echo __('Bestellungen anzeigen', 'wpsg'); ?></a> ]
-							<?php } ?>
-						</p>
-						<?php echo wpsg_drawForm_TextEnd(__('Bestellungen', 'wpsg'), array('noP' => true)); ?>
-
-                        <?php if ($this->view['data']['status'] !== '-1') { ?>
-						
-                            <?php echo wpsg_drawForm_TextStart(); ?>
-                            <p>
-                                <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung&noheader=1&be_ajax=su&k_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Kundenlogin simulieren', 'wpsg'); ?></a>
-                            </p>
-                            <?php echo wpsg_drawForm_TextEnd(__('Kunden Login', 'wpsg'), array('noP' => true)); ?>
-                        
-                        <?php } ?>
-
-                        <?php if (wpsg_isSizedInt($this->view['data']['countOrder'])) { ?>
-						
-                            <?php echo wpsg_drawForm_TextStart(); ?>
-						    <p><?php echo wpsg_formatTimestamp(strtotime($this->view['data']['lastorder'])); ?></p>
-						    <?php echo wpsg_drawForm_TextEnd(__('Letzte Bestellung', 'wpsg'), array('noP' => true)); ?>
-                            
-                        <?php } ?>
-
-                        <?php if (strtotime($this->view['data']['anonymized']) > 0) { ?>
-
-                            <?php echo wpsg_drawForm_TextStart(); ?>
-                            <p><?php echo wpsg_formatTimestamp(strtotime($this->view['data']['anonymized'])); ?></p>
-                            <?php echo wpsg_drawForm_TextEnd(__('Anonymisiert am', 'wpsg'), array('noP' => true)); ?>
-                            
-                        <?php } ?>
-
-                        <?php if (strtotime($this->view['data']['last_login']) > 0) { ?>
-                        
-                            <?php echo wpsg_drawForm_TextStart(); ?>
-                            <p><?php echo wpsg_formatTimestamp(strtotime($this->view['data']['last_login'])); ?></p>
-                            <?php echo wpsg_drawForm_TextEnd(__('Letzte Anmeldung', 'wpsg'), array('noP' => true)); ?>
-                            
-                        <?php } ?>
-
-						<?php if ($this->hasMod('wpsg_mod_statistics')) { ?>
-						<?php echo wpsg_drawForm_TextStart(); ?>
-						<p>
-							<?php
-
-							echo wpsg_translate(__('<a href="#1#" title="Storniert" class="wpsg_storno">#2#</a> / <a href="#3#" title="Offen" class="wpsg_open">#4#</a> / <a href="#5#" title="Bezahlt" class="wpsg_payed">#6#</a>', 'wpsg'),
-								WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&filter[status]=500&filter[k_id]='.$this->view['data']['id'],
-								wpsg_ff($this->view['amountStorno']),
-								WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&filter[status]=0&filter[k_id]='.$this->view['data']['id'],
-								wpsg_ff($this->view['amountAll'] - $this->view['amountStorno'] - $this->view['amountPayed']),
-								WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&filter[status]=100,110&filter[k_id]='.$this->view['data']['id'],
-								wpsg_ff($this->view['amountPayed'])
-							);
-
-							?>
-						</p>
-						<?php echo wpsg_DrawForm_TextEnd(wpsg_translate(__('Umsatz in #1#', 'wpsg'), $this->get_option('wpsg_currency')), array('noP' => true)); ?>
-						<?php } ?>
-
-					<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-					<?php } ?>
-                    
-                    <?php $this->callMods('wpsg_mod_customer_sidebar', array(&$this->view['data'])); ?>
-
+					
+					<?php $this->callMods('wpsg_mod_customer_sidebar', array(&$this->view['data'])); ?>
+					
 				</div>
 			</div>
-
-            <?php if (@$_REQUEST['edit_id'] > 0) { ?>
-                <input type="hidden" name="edit_id" value="<?php echo $_REQUEST['edit_id']; ?>" />
-            <?php } ?>
-
-            <input type="submit" value="<?php echo __('Kunde speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
-            <input type="submit" value="<?php echo __('Kunde speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
-
-		</form>
-
-	</div>
-
+				
+			<div id="post-body">	
+			
+				<div id="normal-sortables" class="meta-box-sortables" style="margin-right:400px;">
+				
+					<div id="wpsg_customeraddress" class="postbox">								
+						<h3 class="wpsg_handlediv">
+							<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+							<span><?php echo __('Name/Anschrift', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<?php echo wpsg_drawForm_Input('knr', __('Kundennummer', 'wpsg'), $this->view['data']['knr']); ?>
+							
+							<?php if ($this->hasMod('wpsg_mod_customergroup')) { ?>
+							<?php echo wpsg_drawForm_Select('group_id', __('Kundengruppe', 'wpsg'), $this->view['arCustomergroup'], $this->view['data']['group_id']); ?>
+							<?php } ?>							
+							
+							<?php echo wpsg_drawForm_Select('title', __('Anrede', 'wpsg'), $this->view['arTitles'], $this->view['data']['title'], array('noIndex' => true)); ?>
+							<?php echo wpsg_drawForm_Input('name', __('Name', 'wpsg'), $this->view['data']['name']); ?>
+							<?php echo wpsg_drawForm_Input('vname', __('Vorname', 'wpsg'), $this->view['data']['vname']); ?>
+							<?php echo wpsg_drawForm_Input('geb', __('Geburtsdatum', 'wpsg'), wpsg_formatTimestamp(strtotime($this->view['data']['geb']), true), array('datepicker' => true, 'hint' => __('Format: TT.MM.JJJJ', 'wpsg'))); ?>
+							<?php echo wpsg_drawForm_Input('email', __('E-Mail', 'wpsg'), $this->view['data']['email']); ?>
+							<?php echo wpsg_drawForm_Input('firma', __('Firma', 'wpsg'), $this->view['data']['firma']); ?>
+							<?php echo wpsg_drawForm_Input('tel', __('Telefon', 'wpsg'), $this->view['data']['tel']); ?>
+							<?php echo wpsg_drawForm_Input('fax', __('Fax', 'wpsg'), $this->view['data']['fax']); ?>
+							<?php echo wpsg_drawForm_Input('strasse', __('StraÃe', 'wpsg'), $this->view['data']['strasse']); ?>
+							<?php echo wpsg_drawForm_Input('plz', __('PLZ', 'wpsg'), $this->view['data']['plz']); ?>
+							<?php echo wpsg_drawForm_Input('ort', __('Ort', 'wpsg'), $this->view['data']['ort']); ?>
+							<?php echo wpsg_drawForm_Select('land', __('Land', 'wpsg'), $this->view['arLand'], $this->view['data']['land']); ?>
+							<?php echo wpsg_drawForm_Input('ustidnr', __('UStIdNr.', 'wpsg'), $this->view['data']['ustidnr']); ?>	
+							<?php echo wpsg_drawForm_Select('status', __('Status', 'wpsg'), array('inaktiv', 'aktiv'), $this->view['data']['status'], array()); ?>						
+							<?php echo wpsg_drawForm_Checkbox('info-mail', __('Mail bei StatusÃ€nderung', 'wpsg'), '', array()); ?>
+						</div>
+					</div>
+					
+					<div id="wpsg_customercomment" class="postbox">
+						<h3 class="wpsg_handlediv">
+							<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+							<span><?php echo __('Kundenkommentar', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<textarea name="comment"><?php echo wpsg_hspc($this->view['data']['comment']); ?></textarea>
+						</div>
+					</div>
+					
+				</div>
+				
+				<?php if ($_REQUEST['edit_id'] > 0) { ?>
+				<input type="hidden" name="edit_id" value="<?php echo $_REQUEST['edit_id']; ?>" />
+				<?php } ?>
+					
+				<p class="submit">
+					<input type="submit" value="<?php echo __('Kunde speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
+					<input type="submit" value="<?php echo __('Kunde speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
+				</p>
+				
+			</div>
+			
+		</div>
+		
+						
+	</form>
 </div>
-
-<script>
-	
-	jQuery(document).ready(function() {
-		
-		// Visualisierung der PasswortstÃ€rke
-		jQuery('input[type=password]').keyup(function() {
-
-			var password = jQuery(this).val();
-
-			if (password.length < 8)
-			{
-
-				jQuery('#wpsg_pwd_length').removeClass('valid').addClass('invalid');
-
-			}
-			else
-			{
-
-				jQuery('#wpsg_pwd_length').removeClass('invalid').addClass('valid');
-
-			}
-
-			if (password.match(/([a-z])/))
-			{
-
-				jQuery('#wpsg_pwd_letter').removeClass('invalid').addClass('valid');
-
-			}
-			else
-			{
-
-				jQuery('#wpsg_pwd_letter').removeClass('valid').addClass('invalid');
-
-			}
-
-			if (password.match(/([A-Z])/))
-			{
-
-				jQuery('#wpsg_pwd_capital').removeClass('invalid').addClass('valid');
-
-			}
-			else
-			{
-
-				jQuery('#wpsg_pwd_capital').removeClass('valid').addClass('invalid');
-
-			}
-
-			if (password.match(/([0-9])/))
-			{
-
-				jQuery('#wpsg_pwd_number').removeClass('invalid').addClass('valid');
-
-			}
-			else
-			{
-
-				jQuery('#wpsg_pwd_number').removeClass('valid').addClass('invalid');
-
-			}
-
-			if (password.match(/([~,!,%,@,&,#,Â°,^,$,?,_,*,Â§])/))
-            {
-
-				jQuery('#wpsg_pwd_speziell').removeClass('invalid').addClass('valid');
-
-			}
-            else
-            {
-
-				jQuery('#wpsg_pwd_speziell').removeClass('valid').addClass('invalid');
-
-			}
-
-		} ).on('focus', function() {
-			
-			jQuery('#wpsg_pwd_info').show();
-			
-		}).on('blur', function() {
-
-			jQuery('#wpsg_pwd_info').hide();
-			
-		});
-		
-	} );
-
-</script>
Index: /views/mods/mod_kundenverwaltung/getpwd.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/getpwd.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/getpwd.phtml	(revision 5261)
@@ -19,6 +19,5 @@
 		
 			<label for="wpsg_firma"><?php echo __("E-Mail", "wpsg"); ?>:</label>
-			
-			<input class="wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_email" name="wpsg[sendpwd][email]" value="<?php echo htmlspecialchars(wpsg_getStr($_REQUEST['email'])); ?>" />
+			<input class="wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_email" name="wpsg[sendpwd][email]" value="<?php echo htmlspecialchars($this->view['data']['email']); ?>" />
 			
 		</div>
Index: /views/mods/mod_kundenverwaltung/import.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/import.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/import.phtml	(revision 5261)
@@ -2,75 +2,29 @@
 
 	/**
-	 * Template fÃŒr die Importmaske in der Kundenverwaltung 
+	 * Template fÃŒr den Import der Kundendaten 
 	 */
 
 ?>
-<div class="wpsg_productgroups" id="wpsg-bs">
+<div class="wrap">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Kundenimport', 'wpsg'); ?>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=index" class="add-new-h2"><?php echo __("ZurÃŒck zur Kundenverwaltung", "wpsg"); ?></a>
+	</h2>
 	
-		<nav class="navbar navbar-default">	
-			
-			<div class="container-fluid">
-				<div class="navbar-header">
-					<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-				</div>
-				<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-					<ul class="nav navbar-nav">
-						<li role="presentation" class="wpsg-customer-tab-a active"><a href="#" onclick="return false;"><?php echo __("Kundenverwaltung - Kundendatenimport", "wpsg"); ?></a></li>
-	          		</ul>
-					<ul class="nav navbar-nav navbar-right">
-						<li role="presentation" class="wpsg-customer-tab-a wpsg_showhide_filter" id="wpsg-customer-tab-0"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=index" class="add-new-h2" class="add-new-h2"><span class="glyphicon glyphicon-search"></span><?php echo __("ZurÃŒck zur Kundenverwaltung", "wpsg"); ?></a></li>
-					</ul>
-				</div>
-			</div>	
-	</nav>
-	<div class="wpsg-filter wpsg-customer-tab wpsg-customer-tab-0 container-fluid from horizontal" >
-		<div class="row">	
-			<div class="col-lg-4">
-			
-				<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=import&amp;noheader=1" id="import_form" enctype="multipart/form-data">
+	<?php echo $this->writeBackendMessage(); ?>
+	<br />
+	
+	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=import&amp;noheader=1" id="import_form" enctype="multipart/form-data">
+	
+		<div class="wpsg_hinweis"><?php echo __('Laden Sie ein vorher exportiertes CSV File hoch, die Kundendaten werden dann aus dieser Datei importiert.', 'wpsg'); ?></div>
+		<br />
+	
+		<input type="file" name="wpsg_importfile" />
 		
-					<?php wpsg_formNounce('Customer', 'import'); ?>
-					
-					<div class="wpsg_hinweis"><?php echo __('Laden Sie ein vorher exportiertes CSV File hoch, die Kundendaten werden dann aus dieser Datei importiert.', 'wpsg'); ?></div>
-					<br />
-				
-					<input type="file" id="wpsg_importfile" name="wpsg_importfile" />
-					
-					<br /><br />
-					<input type="submit" class="button-primary" value="<?php echo __('Import der Kundendaten starten', 'wpsg'); ?>" class="button-primary" name="wpsg_import" />
-					
-				</form>
-				
-				<script type="text/javascript">/* <![CDATA[ */
-							  
-					jQuery('#import_form').on('submit', function(evt) {
-									 
-						var file = jQuery('#wpsg_importfile')[0].files[0];
-									
-						if (file && file.size < <?php echo wpsg_get_file_upload_max_size(); ?>){
-										
-							return true;
-										
-						} else if (file) {
-										
-							alert("<?php echo wpsg_translate(__('DateigrÃ¶Ãe ÃŒbersteigt Upload Limit von #1#.', 'wpsg'), wpsg_formatSize(wpsg_get_file_upload_max_size())); ?>");
-										
-							evt.preventDefault();
-							return false;
-								
-						} else {
-						
-							alert("<?php echo wpsg_translate(__('Es wurde keine Datei ausgewÃ€hlt.', 'wpsg')); ?>");
-										
-							evt.preventDefault();
-							return false;
-											
-						}
-															
-					} );
-													
-				/* ]]> */</script>
-			</div>
-		</div>
-	</div>	
+		<br /><br />
+		<input type="submit" value="<?php echo __('Import starten', 'wpsg'); ?>" class="button-primary" name="wpsg_import" />
+		
+	</form>
+	
 </div>
Index: /views/mods/mod_kundenverwaltung/index.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/index.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/index.phtml	(revision 5261)
@@ -6,274 +6,259 @@
 
 ?>
-<div class="wpsg_customer" id="wpsg-bs">
-
-    <nav class="navbar navbar-default">
-
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
+<script type="text/javascript">/* <![CDATA[ */
+
+	var wpsg_order = '<?php echo $this->view['filter']['order']; ?>';
+	var wpsg_ascdesc = '<?php echo $this->view['filter']['ascdesc']; ?>';
+
+	function wpsg_setOrder(order)
+	{
+	
+		if (order == wpsg_order)
+		{
+	
+			// Nur Richtung Ã€ndern
+			if (wpsg_ascdesc == 'asc') jQuery('#wpsg_ascdesc').val('desc');
+			else jQuery('#wpsg_ascdesc').val('asc');
+			
+		}
+		else
+		{
+	
+			jQuery('#wpsg_order').val(order);
+			jQuery('#wpsg_ascdesc').val('asc');
+			
+		}
+	
+		jQuery('#seite').val(1);
+		jQuery('#filter_form').submit();
+		
+		return false;
+		
+	} // function wpsg_setOrder(order)
+
+	jQuery(document).ready(function() {
+		
+		jQuery('.wpsg_handlediv').bind('click', function() {
+			
+			jQuery(this).next().toggle();
+
+			var arClose = new Array();
+			jQuery('.wpsg_customer_index .postbox .inside:hidden').each(function() {
+				arClose.push(jQuery(this).parent().attr("id"));
+			} );
+
+			jQuery.cookie('wpsg_customer_index_closed', arClose.join(','));
+			
+		} );
+
+		if (jQuery.cookie('wpsg_customer_index_closed') != null)
+		{
+
+			var arClose = jQuery.cookie('wpsg_customer_index_closed').split(',');
+
+			for (index in arClose)
+			{
+
+				if (arClose[index] != '') jQuery('#' + arClose[index] + ' .inside').hide();
+							
+			}
+			
+		}
+
+	} );
+		
+/* ]]> */</script>
+
+<div class="wrap wpsg_customer_index">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	<h2>
+		<?php echo __('Kundenverwaltung', 'wpsg'); ?>		
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=add" class="add-new-h2"><?php echo __("HinzufÃŒgen", "wpsg"); ?></a>
+		<?php if (wpsg_isSizedArray($this->view['data'])) { ?>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=export&amp;noheader=1" class="add-new-h2"><?php echo __('Exportieren', 'wpsg'); ?></a>
+		<?php } ?>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=import" class="add-new-h2"><?php echo __('Importieren', 'wpsg'); ?></a>
+	</h2>
+
+	<?php echo $this->writeBackendMessage(); ?>
+		
+	<form method="POST" id="filter_form">
+		
+		<?php if ($this->hasMod('wpsg_mod_customergroup')) { ?>
+		<select style="float:left;" name="customergroup" onchange="jQuery('#filter_form').submit();">
+			<option value="-1"><?php echo __('Alle Kundengruppen', 'wpsg'); ?></option>
+			<option value="0" <?php echo (($_REQUEST['customergroup'] === '0')?'selected="selected"':''); ?>><?php echo __('Unzugeordnet', 'wpsg'); ?></option>
+			<?php foreach ((array)$this->view['arCustomergroup'] as $customer_group_id => $customer_group_name) { ?>
+			<option value="<?php echo $customer_group_id; ?>" <?php echo (($customer_group_id == $_REQUEST['customergroup'])?'selected="selected"':''); ?>><?php echo $customer_group_name; ?></option>
+			<?php } ?>
+		</select>
+		<?php } ?>
+	
+		<p class="search-box">
+			<label for="post-search-input" class="screen-reader-text"><?php echo __('Kunden suchen', 'wpsg'); ?>:</label>
+			<input type="text" value="<?php echo wpsg_hspc($_REQUEST['s']); ?>" name="s" id="post-search-input">
+			<input type="submit" value="<?php echo __('Kunden suchen', 'wpsg'); ?>" class="button" id="search-submit" name="">
+		</p>
+				
+		<div class="tablenav top">
+		
+			<?php if (sizeof($this->view['data'] > 0)) { ?>
+			<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=1&amp;s=<?php echo $_REQUEST['s']; ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=<?php echo $this->view['seite'] - 1; ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['seite']; ?>" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=<?php echo $this->view['seite'] + 1; ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=<?php echo $this->view['pages']; ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
+				</div>
+				
+				<script type="text/javascript">
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				</script>
+				
+				<br class="clear" />
 			</div>
-			<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer" onclick="return false;"><?php echo wpsg_translate(__("Kundenverwaltung (#1# Kunden)", "wpsg"), $this->view['countAll']); ?></a></li>
-					<li role="presentation" class="wpsg-customer-tab-a wpsg_showhide_filter <?php echo ((wpsg_isTrue($this->view['hasFilter']))?'active':''); ?>" id="wpsg-customer-tab-0"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-                    <li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'add'))?'active':''); ?>"><a href="<?php 
-						
-						echo wpsg_admin_url('Customer', 'add'); 
-						
-					?>"><span class="glyphicon glyphicon-plus"></span><?php echo __("HinzufÃŒgen", "wpsg"); 
-							
-					?></a></li>
-                    
-                    <?php /* Integration Exportprofile */ ?>
-                    <?php if ($this->hasMod('wpsg_mod_export')) { $arProfile = $this->callMod('wpsg_mod_export', 'getProfile', array(wpsg_mod_export::TYPE_CUSTOMER)); ?>
-                    <?php if (wpsg_isSizedArray($arProfile)) { ?>
-                    <li role="presentation" class="wpsg_showhide_export"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-export"></span><?php echo __('Kundenexport (Exportprofile)', 'wpsg'); ?></a></li>
-                    <?php } ?>
-                    <?php } ?>
-                        
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-                    <li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'import'))?'active':''); ?>"><a href="<?php
-		
-						echo wpsg_admin_url('Customer', 'import', [], ['noheader' => '1']);
-							
-					?>"><span class="glyphicon glyphicon-import"></span><?php echo __("Daten-Import", "wpsg"); ?></a></li>
-					<?php if (wpsg_isSizedArray($this->view['arData'])) { ?>
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'export'))?'active':''); ?>"><a href="<?php
-							
-						echo wpsg_admin_url('Customer', 'export', [], ['noheader' => '1']);
-
-					?>"><span class="glyphicon glyphicon-export"></span><?php echo __("Daten-Export", "wpsg"); ?></a></li>
-					<?php } ?>
-				</ul>
-			</div>
+			<?php } ?>
+		
 		</div>
-
-        <div class="wpsg-filter wpsg-customer-tab wpsg-customer-tab-0 container-fluid form-horizontal" style="display:<?php echo ((wpsg_isTrue($this->view['hasFilter']))?'block':'none'); ?>;">
-            <div class="row">
-				<div class="col-lg-4">
-					<form method="post" id="filter_form">
-
-						<?php echo wpsg_formNounce('Customer', 'search'); ?>
-						
-						<input id="wpsg_seite" type="hidden" name="filter[page]" value="<?php echo @$this->view['arFilter']['page']; ?>" class="current-page" />
-
-                        <input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-						<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" />
-
-						<?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
-                        
-                        <?php if ($this->hasMod('wpsg_mod_customergroup')) { ?>
-                        
-                            <?php echo wpsg_drawForm_Select('filter[group_id]', __('Kundengruppe', 'wpsg'), wpsg_array_merge([0 => __('Alle Kundengruppen', 'wpsg')], $this->callMod('wpsg_mod_customergroup', 'getCustomerGroupArray')), wpsg_getStr($this->view['arFilter']['group_id'])); ?>
-                            
-                        <?php } ?>
-
-						<?php echo wpsg_drawForm_SubmitButton(__('Kunden suchen')); ?><br />
-
-					</form>
+		
+		<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo $this->view['filter']['order']; ?>" />
+		<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo $this->view['filter']['ascdesc']; ?>" />
+		
+		<input style="display:none;" type="submit" name="suchen" value="" />
+		
+		<?php $this->callMods('wpsg_mod_customer_head'); ?>
+		
+		<?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
+		<table class="widefat post fixed">
+			<thead>
+				<tr>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'nr')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" style="width:60px;">
+						<a href="#" onclick="return wpsg_setOrder('nr');">
+							<span><?php echo __("Nr.", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'name')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('name');">
+							<span><?php echo __("Name", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-adress <?php echo (($this->view['filter']['order'] == 'adress')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('adress');">
+							<span><?php echo __("Anschrift", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-status <?php echo (($this->view['filter']['order'] == 'status')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('status');">
+							<span><?php echo __("Status", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>				
+				</tr>
+			</thead>
+			<tbody>
+				<?php foreach ($this->view['data'] as $k) { ?>
+				<tr>
+					<td class="manage-column column-title">
+						<?php echo ((strlen($k['knr']) > 0)?$k['knr']:$k['id']); ?>						
+					</td>
+					<td class="manage-column column-title">
+						<strong>&nbsp;<?php echo wpsg_hspc((trim($k['vname'].' '.$k['name']) == "")?__("---- ", "wpsg"):$k['vname'].' '.$k['name']); ?>&nbsp;<a href="mailto:<?php echo wpsg_hspc($k['email']); ?>" style="font-weight:normal;">(<?php echo wpsg_hspc($k['email']); ?>)</a></strong>
+					</td>
+					<td rowspan="2" class="manage-column column-adress">						
+						<?php echo (($k['firma'] != '')?$k['firma']:'').'<br />'; ?>
+						<?php echo isset($this->$k['strasse']) && $k['strasse'].' '.isset ($this->$k['hausnr']) && $k['hausnr']; ?><br />
+						<?php echo $k['plz'].' '.$k['ort'].' '.$k['land_kuerzel']; ?><br />
+					</td>
+					<td rowspan="2" class="manage-column column-status">
+						<?php echo wpsg_translate(__('#1# Bestellungen', 'wpsg'), $k['order_count']); ?><br />
+						<?php echo wpsg_translate(__('Umsatz: #1#', 'wpsg'), wpsg_ff($k['order_umsatz'], $this->get_option('wpsg_currency'))); ?>
+						<?php if ($k['order_count'] > 0) { ?>
+						<br />
+						<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter%5Bk_id%5D=<?php echo $k['id']; ?>"><?php echo __('Bestellungen einsehen', 'wpsg'); ?></a>
+						<?php } ?>
+					</td>
+				</tr>
+				<tr>
+					<td class="manage-column wpsg-row-actions" colspan="2">
+						<div>
+							<span class="edit"><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=edit&amp;edit_id=<?php echo $k['id']; ?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
+							|
+							<span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie diesen Kunden lÃ¶schen wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Diesen Kunden lÃ¶schen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;action=del&amp;edit_id=<?php echo $k['id']; ?>&amp;noheader=1"><?php echo __("LÃ¶schen", "wpsg"); ?></a></span>
+							<?php if ($k['order_count'] > 0) { ?>
+							|
+							<span class="order"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter%5Bk_id%5D=<?php echo $k['id']; ?>"><?php echo __('Bestellungen einsehen', 'wpsg'); ?></a></span>
+							<?php } ?>						
+						</div>
+					</td>
+				</tr>
+				<?php } ?>
+			</tbody>
+			<tfoot>
+				<tr>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'nr')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('nr');">
+							<span><?php echo __("Nr.", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'name')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('name');">
+							<span><?php echo __("Name", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-adress <?php echo (($this->view['filter']['order'] == 'adress')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('adress');">
+							<span><?php echo __("Anschrift", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-status <?php echo (($this->view['filter']['order'] == 'status')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>">
+						<a href="#" onclick="return wpsg_setOrder('status');">
+							<span><?php echo __("Status", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>				
+				</tr>
+			</tfoot>
+		</table>
+		
+			<?php /* if (sizeof($this->view['data'] > 0)) { ?>
+			<div class="tablenav">
+				<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+					<div class="tablenav-pages">	
+						<span class="pagination-links">
+							<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=1&amp;s=<?php echo $_REQUEST['s']; ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+							<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=<?php echo $this->view['seite'] - 1; ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+							<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['seite']; ?>" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+							<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=<?php echo $this->view['seite'] + 1; ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+							<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&amp;seite=<?php echo $this->view['pages']; ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+						</span>
+					</div>
+					
+					<script type="text/javascript">
+			
+						jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+					
+					</script>
+					
+					<br class="clear">
 				</div>
 			</div>
-        </div>
-
-        <?php /* Integration Exportprofile */ ?>
-        <?php if ($this->hasMod('wpsg_mod_export')) { $arProfile = $this->callMod('wpsg_mod_export', 'getProfile', array(wpsg_mod_export::TYPE_CUSTOMER)); ?>
-        <?php if (wpsg_isSizedArray($arProfile)) { ?>
-        <div class="wpsg-export container-fluid form-horizontal" style="display:none;">
-            
-            <form class="container-fluid form-horizontal" target="_blank" method="post" action="<?php echo WPSG_URL_WP ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=handleExport&noheader=1" onsubmit="wpsg_mod_export_serializefilter();">
-        
-                <div class="row">
-                    <div class="col-lg-4">
-            
-                        <?php foreach ($arProfile as $p) { ?>
-                            <?php echo wpsg_drawForm_Checkbox('wpsg_mod_export_profile[]', $p['name'], false, array('value' => $p['id'], 'noHidden' => true)); ?>
-                        <?php } ?>
-            
-                        <br /><?php echo wpsg_drawForm_SubmitButton(__('Export starten')); ?>
-            
-                    </div>
-                </div>
-            
-                <input type="hidden" name="filter" id="wpsg_mod_export_filter" value="" />
-            
-            </form>
-       
-            <script type="text/javascript">/* <![CDATA[ */
-                   
-                function wpsg_mod_export_serializefilter()
-                {
-            
-                    jQuery('#wpsg_mod_export_filter').val(jQuery('#filter_form').serialize());
-            
-                }
-                
-                jQuery(document).ready(function() {
-                    
-                    jQuery('.wpsg_showhide_export').off('click').on('click', function() {
-                        
-                        jQuery(this).toggleClass('active');
-                        jQuery('.wpsg-export').toggle(250);
-                        
-                        return false;
-                        
-                    } );
-                    
-                } );
-            
-            /* ]]> */</script>
-            
-        </div>       
-        <?php } ?>
-        <?php } ?>
-        
-    </nav>
-
-    <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"></div>
-
-	<div class="wpsg_clear"></div>
-	
-    <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-
-	<div class="wpsg_clear"></div>
-
-    <form method="POST">
-        <div class="content">
-    
-            <?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-    
-                <table class="table wpsg-table-order table-bordered table-hover table-striped wpsg-table-customer">
-                    <thead>
-                        <tr>
-                            <th class="manage-column column-title wpsg_pic_col wpsg_order col_id" data-order="id">
-																
-								<input style="margin-right:30px;" type="checkbox" value="1" id="wpsg_check_all" onclick="return wpsg_customer_checkAll(event);" name="" />
-								
-                            </th>
-                            <th class="wpsg_order col_name" data-order="nr"><?php echo __("Nr/Name", 'wpsg'); ?></th>
-                            <th class="wpsg_order col_adress" data-order="adress"><?php echo __("Anschrift", 'wpsg'); ?></th>
-                            <th class="wpsg_order col_status" data-order="status"><?php echo __("Status", 'wpsg'); ?></th>
-                        </tr>
-                    </thead>
-                    <tbody>
-                        <?php foreach ($this->view['arData'] as $c) { ?>
-	                        <?php if(wpsg_isSizedInt($_REQUEST['customergroup']) && $_REQUEST['customergroup'] !== $c->group_id) continue; ?>
-                        <tr>
-                            <td class="wpsg_pic_col">
-    
-                                <img src="https://www.gravatar.com/avatar/<?php echo md5(strtolower(trim($c->getEMail()))); ?>?s=40&d=mm" alt=""" />
-    
-                                <input class="col_set_checkbox" type="checkbox" value="<?php echo $c->id; ?>" name="customer[]" />
-                                
-                            </td>
-                            <td class="col_name column-title">
-                                <strong><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php
-		
-									echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $c->getId()]);
-									
-								?>" class="row-title"><?php echo trim($c->GetNr().' '.$c->getLabel()); ?></a></strong>
-                                <?php if (strlen($c->getEMail()) > 0) { ?>
-                                    <a href="mailto:<?php echo $c->getEMail(); ?>" title="<?php echo __('Dem Kunden eine E-Mail schreiben.', 'wpsg'); ?>"><?php echo $c->getEMail();  ?></a>
-                                <?php } ?>
-                                <div class="row-actions">
-                                    <span class="edit"><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php 
-											
-										echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $c->getId()]);
-											
-									?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
-                                    |
-                                    <span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie den Kunden lÃ¶schen wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Diesen Kunden lÃ¶schen", "wpsg"); ?>" href="<?php 
-									
-										echo wpsg_admin_url('Customer', 'del', ['edit_id' => $c->id]);		
-											
-									?>&noheader=1"><?php echo __("LÃ¶schen", "wpsg"); ?></a></span>
-                                    |
-                                    <?php if ($c->status !== '-1') { ?>
-                                        <span class="order"><a href="<?php 
-                                                
-                                            echo wpsg_admin_url('Admin', 'module', ['modul' => 'wpsg_mod_kundenverwaltung', 'be_ajax' => 'su_index', 'k_id' => $c->getId()], ['noheader' => '1']);											
-                                                
-                                        ?>"><?php echo __('Kundenlogin simulieren', 'wpsg'); ?></a></span>
-                                    <?php } ?>
-                                </div>
-                                <?php $passwort_saltmd5 = $c->passwort_saltmd5; if (!wpsg_isSizedString($passwort_saltmd5)) { ?>
-                                    <strong class="wpsg_error"><?php echo __('Gastzugang', 'wpsg'); ?></strong>
-                                <?php } ?>
-                            </td>
-                            <td class="col_adress">
-                                <?php echo ((strlen($c->getCompany()) > 0)?$c->getCompany().'<br />':''); ?>
-                                <?php echo $c->getStreet(); ?><br />
-                                <?php echo trim($c->getZip().' '.$c->getCity()); ?>
-                                <?php /*echo $c->plz.' '.$c->ort.' '.$c->land_kuerzel; */?><br />
-                            </td>
-                            <td class="col_status">
-                                <?php echo wpsg_translate(__('#1# Bestellungen', 'wpsg'), $c->getOrderCount()); ?><br />
-                                <?php echo wpsg_translate(__('Umsatz: #1#', 'wpsg'), wpsg_ff($c->getOrderAmount(), $this->get_option('wpsg_currency'))); ?>
-                                <?php if ($c->getOrderCount() > 0) { ?>
-                                <br />
-                                <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter[k_id]=<?php echo $c->id; ?>"><?php echo __('Bestellungen einsehen', 'wpsg'); ?></a>
-                                <?php } ?>
-                            </td>
-                        </tr>
-                        <?php } ?>
-                    </tbody>
-                </table>
-    
-                <div class="tablenav bottom">
-                    <div class="alignleft actions">
-                        <select name="wpsg_do" id="wpsg_do">
-                            <option value="-1"><?php echo __('Aktion wÃ€hlen', 'wpsg'); ?></option>
-                            <option value="setAccount"><?php echo __('Kundenkonto zuordnen', 'wpsg'); ?></option> 
-                        </select>
-                        <input type="submit" class="button-secondary" id="doaction" value="<?php echo __('AusfÃŒhren', 'wpsg'); ?>" name="wpsg_doaction" />
-                    </div>
-                </div>
-    
-                <div style="margin-right:-15px;">
-                    <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-                </div>
-    
-            <?php } else { ?>
-    
-                <?php echo wpsg_drawForm_AdminboxStart(); ?>
-                <?php echo __('Keine Kunden in der Datenbank.', 'wpsg'); ?>
-                <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-    
-            <?php } ?>
-    
-        </div>
-    </form>
-
+			<?php } */ ?>
+			
+		<?php } else { ?>
+		<p><?php echo __('Keine Kunden in der Datenbank.', 'wpsg'); ?></p>
+		<?php } ?>
+		
+	</form>
+	
 </div>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-    <?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo $this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower($this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-
-    function wpsg_customer_checkAll(event)
-    {
-
-		event.stopPropagation();
-
-		jQuery('.col_set_checkbox').each(function() { jQuery(this).prop('checked', !jQuery(this).prop('checked')); } );
-        
-        return false;
-
-    }
-
-    function goPage(page)
-	{
-
-		//if (page <= 0 || page == <?php echo $this->view['arFilter']['page']; ?> || page > <?php echo $this->view['pages']; ?>) return;
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-/* ]]> */</script>
Index: ews/mods/mod_kundenverwaltung/index_setAccount.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/index_setAccount.phtml	(revision 8528)
+++ 	(revision )
@@ -1,191 +1,0 @@
-<?php 
-
-    /*
-     * Template fÃŒr die Auswahl der Kunden fÃŒr die Kundenzusammenfassung
-     */
-    
-?>
-
-<div class="wpsg_customer" id="wpsg-bs">
-    <div class="content">
-
-        <form method="POST">
-
-			<?php echo wpsg_formNounce('Customer', 'search'); ?>
-			
-            <input type="hidden" name="wpsg_do" value="setAccount" />
-            
-            <div class="wpsg_customer" id="wpsg-bs">
-            
-                <nav class="navbar navbar-default">
-            
-                    <div class="container-fluid">
-                        <div class="navbar-header">
-                            <a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-                        </div>
-                        <div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-                            <ul class="nav navbar-nav">
-                                <li role="presentation" class=""><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer"><?php echo __("Kundenverwaltung (Ãbersicht)", "wpsg"); ?></a></li>
-                            </ul>
-                        </div>
-                    </div>
-    
-                    <div class="wpsg-filter wpsg-customer-tab wpsg-customer-tab-0 container-fluid form-horizontal">
-                        <div class="row">
-                            <div class="col-lg-4"> 
-    
-                                <?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld (Zielkunde)', 'wpsg'), wpsg_getStr($_REQUEST['filter']['s'])); ?>
-                                <?php echo wpsg_drawForm_SubmitButton(__('Kunden suchen')); ?><br />
-
-                            </div>
-                        </div>
-                    </div>
-                    
-                </nav>
-
-                <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"></div>
-                                
-            </div>
-                    
-            <div class="content">
-                <div class="row">
-
-                    <div class="col-lg-6">
-
-                        <fieldset>
-
-                            <legend><?php echo __('Kundenkonto, in das die Kunden ÃŒberfÃŒhrt werden sollen:', 'wpsg'); ?></legend>
-
-                            <?php if (!wpsg_isSizedArray($this->view['targetCustomer'])) { ?>
-                            
-                                <p>
-                                    <?php echo __('Es konnte kein passender Kunde gefunden werden.', 'wpsg'); ?>
-                                </p>
-                                
-                            <?php } else { ?>
-
-                                <table class="table wpsg-table-order table-bordered table-hover table-striped wpsg-table-customer">
-                                    <thead>
-                                    <tr>
-                                        <th class="manage-column column-title wpsg_pic_col"></th>
-                                        <th class="wpsg_order col_name" data-order="nr"><?php echo __("Nr/Name", 'wpsg'); ?></th>
-                                        <th class="wpsg_order col_adress" data-order="adress"><?php echo __("Anschrift", 'wpsg'); ?></th>
-                                        <th class="wpsg_order col_status" data-order="status"><?php echo __("Status", 'wpsg'); ?></th>
-                                    </tr>
-                                    </thead>
-                                    <tbody>
-                                    <?php foreach ($this->view['targetCustomer'] as $c) { ?>
-                                        <tr>
-                                            <td class="wpsg_pic_col">
-                                                
-                                                <img src="https://www.gravatar.com/avatar/<?php echo md5(strtolower(trim($c->getEMail()))); ?>?s=40&d=mm" alt=""" />                                                
-                                                <input type="radio" name="set_target" value="<?php echo $c->id; ?>" />
-                                                
-                                            </td>
-                                            <td class="col_name column-title">
-                                                <strong><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php 
-														
-													echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $c->id]);
-														
-												?>" class="row-title"><?php echo trim($c->GetNr().' '.$c->getLabel()); ?></a></strong>
-                                                <?php if (strlen($c->getEMail()) > 0) { ?>
-                                                    <a style="margin-bottom:3px; display:block;" href="mailto:<?php echo $c->getEMail(); ?>" title="<?php echo __('Dem Kunden eine E-Mail schreiben.', 'wpsg'); ?>"><?php echo $c->getEMail();  ?></a>
-                                                <?php } ?>
-                                                
-                                                <?php $passwort_saltmd5 = $c->passwort_saltmd5; if (!wpsg_isSizedString($passwort_saltmd5)) { ?>
-                                                <strong class="wpsg_error"><?php echo __('Gastzugang', 'wpsg'); ?></strong>
-                                                <?php } ?>
-                                                
-                                            </td>
-                                            <td class="col_adress">
-                                                <?php echo ((strlen($c->getCompany()) > 0)?$c->getCompany().'<br />':''); ?>
-                                                <?php echo $c->getStreet(); ?><br />
-                                                <?php echo trim($c->getZip().' '.$c->getCity()); ?><br />
-                                            </td>
-                                            <td class="col_status">
-                                                <?php echo wpsg_translate(__('#1# Bestellungen', 'wpsg'), $c->getOrderCount()); ?><br />
-                                                <?php echo wpsg_translate(__('Umsatz: #1#', 'wpsg'), wpsg_ff($c->getOrderAmount(), $this->get_option('wpsg_currency'))); ?>
-                                                <?php if ($c->getOrderCount() > 0) { ?>
-                                                    <br />
-                                                    <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter[k_id]=<?php echo $c->id; ?>"><?php echo __('Bestellungen einsehen', 'wpsg'); ?></a>
-                                                <?php } ?>
-                                            </td>
-                                        </tr>
-                                    <?php } ?>
-                                    </tbody>
-                                </table>
-                            
-                                <br />
-                                
-                                <input type="submit" name="submit_do" class="button" value="<?php echo __('Kundenkonten zusammenfÃŒgen', 'wpsg'); ?>" />                                       
-                                
-                            <?php } ?>
-
-                        </fieldset>
-
-                    </div>
-                    <div class="col-lg-6">
-
-                        <fieldset>
-
-                            <legend><?php echo __('GewÃ€hlte Kunden (Diese werden gelÃ¶scht)', 'wpsg'); ?></legend>
-
-                            <table class="table wpsg-table-order table-bordered table-hover table-striped wpsg-table-customer">
-                                <thead>
-                                <tr>
-                                    <th class="manage-column column-title wpsg_pic_col"></th>
-                                    <th class="wpsg_order col_name" data-order="nr"><?php echo __("Nr/Name", 'wpsg'); ?></th>
-                                    <th class="wpsg_order col_adress" data-order="adress"><?php echo __("Anschrift", 'wpsg'); ?></th>
-                                    <th class="wpsg_order col_status" data-order="status"><?php echo __("Status", 'wpsg'); ?></th>
-                                </tr>
-                                </thead>
-                                <tbody>
-                                <?php foreach (@$_REQUEST['customer'] as $customer_id) { $c = wpsg_customer::getInstance($customer_id); ?>
-                                    <tr>
-                                        <td class="wpsg_pic_col">
-                                            <img src="https://www.gravatar.com/avatar/<?php echo md5(strtolower(trim($c->getEMail()))); ?>?s=40&d=mm" alt=""" />
-                                            <input type="hidden" value="<?php echo $c->id; ?>" name="customer[]" />
-                                        </td>
-                                        <td class="col_name column-title">
-                                            <strong><a title="<?php echo __("Diesen Kunden bearbeiten", "wpsg"); ?>" href="<?php 
-													
-												echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $c->id]); 
-												
-											?>" class="row-title"><?php echo trim($c->GetNr().' '.$c->getLabel()); ?></a></strong>
-                                            <?php if (strlen($c->getEMail()) > 0) { ?>
-                                                <a href="mailto:<?php echo $c->getEMail(); ?>" title="<?php echo __('Dem Kunden eine E-Mail schreiben.', 'wpsg'); ?>"><?php echo $c->getEMail();  ?></a>
-                                            <?php } ?>
-                                        </td>
-                                        <td class="col_adress">
-                                            <?php echo ((strlen($c->getCompany()) > 0)?$c->getCompany().'<br />':''); ?>
-                                            <?php echo $c->getStreet(); ?><br />
-                                            <?php echo trim($c->getZip().' '.$c->getCity()); ?><br />
-                                        </td>
-                                        <td class="col_status">
-                                            <?php echo wpsg_translate(__('#1# Bestellungen', 'wpsg'), $c->getOrderCount()); ?><br />
-                                            <?php echo wpsg_translate(__('Umsatz: #1#', 'wpsg'), wpsg_ff($c->getOrderAmount(), $this->get_option('wpsg_currency'))); ?>
-                                            <?php if ($c->getOrderCount() > 0) { ?>
-                                                <br />
-                                                <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&filter[k_id]=<?php echo $c->id; ?>"><?php echo __('Bestellungen einsehen', 'wpsg'); ?></a>
-                                            <?php } ?>
-                                        </td>
-                                    </tr>
-                                <?php } ?>
-                                </tbody>
-                            </table>
-
-                        </fieldset>
-
-                    </div>
-
-                </div>
-            </div>                
-                    
-        </form>
-    
-        <?php // wpsg_debug($_REQUEST); ?>
-
-    </div>
-
-</div>
-    
Index: /views/mods/mod_kundenverwaltung/login.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/login.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/login.phtml	(revision 5261)
@@ -19,23 +19,10 @@
 				<div class="wpsg_block wpsg_checkoutblock">
 					<label for="wpsg_mod_kundenverwaltung_email"><?php echo __("E-Mail Adresse", "wpsg"); ?>:</label>
-					<input 
-                        class="wpsg_checkout" 
-                        type="text" 
-                        autocomplete="off"
-                        id="wpsg_mod_kundenverwaltung_email" 
-                        name="wpsg[mod_kundenverwaltung][email]" 
-                        value="<?php echo wpsg_getStr($this->view['wpsg_mod_kundenverwaltung']['email']); ?>" />
+					<input class="wpsg_checkout" type="text" id="wpsg_mod_kundenverwaltung_email" name="wpsg[mod_kundenverwaltung][email]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_kundenverwaltung']['email']); ?>" />
 				</div>
 			
 				<div class="wpsg_block wpsg_checkoutblock">
 					<label for="wpsg_mod_kundenverwaltung_password"><?php echo __("Passwort", "wpsg"); ?>:</label>
-					<input 
-                        class="wpsg_checkout" 
-                        type="password" 
-                        id="wpsg_mod_kundenverwaltung_password" 
-                        name="wpsg[mod_kundenverwaltung][password]" 
-                        value="" 
-                        autocomplete="off"
-                    />
+					<input class="wpsg_checkout" type="password" id="wpsg_mod_kundenverwaltung_password" name="wpsg[mod_kundenverwaltung][password]" value="" />
 				</div>
 			 
@@ -53,16 +40,3 @@
 	</form>
 
-	<?php
-	/*
-		$this->view['data'] = $_SESSION['wpsg']['checkout'];
-		$this->view['error'] = $_SESSION['wpsg']['errorFields'];
-		$this->view['pflicht'] = $this->loadPflichtFeldDaten();
-		$this->view['laender'] = $this->db->fetchAssoc("SELECT * FROM `".WPSG_TBL_LAND."` ORDER BY `name` ASC");
-
-		$this->clearMessages();
-
-		echo $this->render(WPSG_PATH_VIEW.'/mods/mod_kundenverwaltung/register.phtml', false);
-	*/
-	?>
-
 </div>
Index: /views/mods/mod_kundenverwaltung/mail_activate.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_activate.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_activate.phtml	(revision 5261)
@@ -6,9 +6,5 @@
 	 */
 
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['basket']['checkout']['title']], $this->view['basket']['checkout']['vname'], $this->view['basket']['checkout']['name']); ?>
- 
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>  
  
 <?php echo __('Der Status Ihres Accounts hat sich gÃ€ndert auf:', 'wpsg'); ?> <?php echo $this->view['kunde']['status'] ?> 
Index: /views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml	(revision 5261)
@@ -5,10 +5,6 @@
 	 */
 
-    /** @var $oCustomer wpsg_customer */
-	$oCustomer = $this->view['oCustomer'];
-
-?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $oCustomer->getTitle(), $oCustomer->getName()); ?>
-
-
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>  
+ 
 <?php echo __('Sie haben eine neues Passwort angefragt.', 'wpsg'); ?> 
  
Index: /views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml	(revision 5261)
@@ -5,9 +5,6 @@
 	 */
 
-	/** @var $oCustomer wpsg_customer */
-	$oCustomer = $this->view['oCustomer'];
-
 ?>
-<p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $oCustomer->getTitle(), $oCustomer->getName()); ?></p>
+<p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?></p>  
  
 <p><?php echo __('Sie haben eine neues Passwort angefragt.', 'wpsg'); ?></p> 
Index: /views/mods/mod_kundenverwaltung/mail_pwdsend.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_pwdsend.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_pwdsend.phtml	(revision 5261)
@@ -5,9 +5,5 @@
 	 */
 
-	/** @var $oCustomer wpsg_customer */
-	$oCustomer = $this->view['oCustomer'];
-
-?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $oCustomer->getTitle(), $oCustomer->getName()); ?>
- 
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>  
  
 <?php echo __('Sie haben eine neues Passwort angefragt.', 'wpsg'); ?> 
Index: /views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml	(revision 5261)
@@ -5,8 +5,5 @@
 	 */
 
-	/** @var $oCustomer wpsg_customer */
-	$oCustomer = $this->view['oCustomer'];
-
-?><p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $oCustomer->getTitle(), $oCustomer->getName()); ?></p>
+?><p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?></p>  
  
 <p><?php echo __('Sie haben eine neues Passwort angefragt.', 'wpsg'); ?></p> 
Index: /views/mods/mod_kundenverwaltung/mail_register.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_register.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_register.phtml	(revision 5261)
@@ -5,9 +5,5 @@
 	 */
 
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['basket']['checkout']['title']], $this->view['basket']['checkout']['vname'], $this->view['basket']['checkout']['name']); ?>
- 
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>  
  
 <?php echo __('Sie haben sich mit folgenden Daten bei uns registriert.', 'wpsg'); ?> 
@@ -19,5 +15,5 @@
 <?php echo wpsg_translate(__('Telefon: #1#', 'wpsg'), $this->view['kunde']['tel']); ?> 
 <?php echo wpsg_translate(__('Fax: #1#', 'wpsg'), $this->view['kunde']['fax']); ?>  
-<?php echo wpsg_translate(__('StraÃe: #1#', 'wpsg'), $this->view['kunde']['strasse'].rtrim(' '.$this->view['kunde']['nr'])); ?> 
+<?php echo wpsg_translate(__('StraÃe: #1#', 'wpsg'), $this->view['kunde']['strasse']); ?> 
 <?php echo wpsg_translate(__('PLZ: #1#', 'wpsg'), $this->view['kunde']['plz']); ?> 
 <?php echo wpsg_translate(__('Ort: #1#', 'wpsg'), $this->view['kunde']['ort']); ?>  
Index: /views/mods/mod_kundenverwaltung/mail_register_html.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/mail_register_html.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/mail_register_html.phtml	(revision 5261)
@@ -37,5 +37,5 @@
 	<tr>
 		<td style="padding-right:15px;"><?php echo __('StraÃe', 'wpsg'); ?>:</td>
-		<td><?php echo wpsg_hspc($this->view['kunde']['strasse'].rtrim(' '.$this->view['kunde']['nr'])); ?></td>	
+		<td><?php echo wpsg_hspc($this->view['kunde']['strasse']); ?></td>	
 	</tr>
 	<tr>
Index: /views/mods/mod_kundenverwaltung/order.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/order.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/order.phtml	(revision 5261)
@@ -23,24 +23,12 @@
 				<strong><?php echo __('Bestellstatus', 'wpsg'); ?>:</strong>&nbsp;
 					<?php echo $this->arStatus[$order['status']]; ?>
-					<?php if ($this->hasMod('wpsg_mod_rechnungen')) {
-
-                        $arInvoice = \wpsg\wpsg_invoice::findByOrderId(intval($order['id']));
-
-                        ?>
-
-                        <?php foreach ($arInvoice as $oInvoice) { ?>
-
-                            <?php if ($oInvoice->isInvoice()) { ?>
-
-                                <a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', [$oInvoice->getId()]); ?>"><?php echo wpsg_translate(__('Rechnung #1#', 'wpsg'), $oInvoice->getNr()); ?></a>
-
-                            <?php } else if ($oInvoice->isStorno()) { ?>
-
-                                <a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', [$oInvoice->getId()]); ?>"><?php echo wpsg_translate(__('Rechnungskorrektur #1#', 'wpsg'), $oInvoice->getNr()); ?></a>
-
-                            <?php } ?>
-
-                        <?php } ?>
-
+					<?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>
+					
+						<?php if ($r = $this->callMod('wpsg_mod_rechnungen', 'getOrderInvoice', array($order['id']))) { ?>
+						<a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', array($r['id'])); ?>"><?php echo wpsg_translate(__('Rechnung #1#', 'wpsg'), $r['rnr']); ?></a>
+						<?php } else if ($r = $this->callMod('wpsg_mod_rechnungen', 'getOrderCredit', array($order['id']))) { ?>
+						<a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', array($r['id'])); ?>"><?php echo wpsg_translate(__('Rechnungskorrektur #1#', 'wpsg'), $r['gnr']); ?></a>
+						<?php } ?>
+						
 					<?php } ?>
 				<br />
@@ -54,10 +42,9 @@
 					</tr>				
 					<?php foreach ((array)$order['arProdukte'] as $p) { ?>					
-						<tr>
+					<tr>
 						<td class="col_name">
-							<span><?php echo $p['menge']??0; ?> x </span>
 							<a href="<?php echo $p['url']; ?>"><?php echo $this->getProductName($this->getProduktID($p['id']), true); ?></a>
 							<br /><?php echo __('Artikelnummer', 'wpsg'); ?>: <?php echo $p['anr']; ?>
-							<?php if ($this->hasMod('wpsg_mod_productvariants') && wpsg_isSizedString($p['mod_vp_varkey'])) { $arVarInfo = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p['mod_vp_varkey'])); ?>
+							<?php if ($this->hasMod('wpsg_mod_varianten') && wpsg_isSizedString($p['mod_vp_varkey'])) { $arVarInfo = $this->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($p['mod_vp_varkey'])); ?>
 							<br /><?php echo __('Variante', 'wpsg'); ?>: <?php echo $arVarInfo['key']; ?>
 							<?php } ?>	
@@ -94,5 +81,4 @@
 						</td>
 					</tr>
-						<?php \do_action('wpsg_mod_kundenverwaltung_order_after_products', $order, $p); ?>
 					<?php } ?>
 				</table>
@@ -102,5 +88,5 @@
 				
 		<?php } ?>
-	<?php } else { ?>
+	<?php } else {Â ?>
 	<p><?php echo __('Bisher keine Bestellungen durchgefÃŒhrt.', 'wpsg'); ?></p>
 	<?php } ?>
Index: /views/mods/mod_kundenverwaltung/profil.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/profil.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/profil.phtml	(revision 5261)
@@ -1,5 +1,5 @@
 <?php
 
-	/** 
+	/**
 	 * Seite fÃŒr das Profil eines Kunden
 	 */
@@ -10,119 +10,8 @@
 
 	jQuery(document).ready(function() {
-
-		<?php if ($this->get_option('wpsg_form_validation') == '1') { ?>
-
-		if (typeof jQuery.validationEngine == "object")
-		{
-
-			jQuery("#form-profil").validationEngine('attach', {promptPosition : "centerRight", scroll: false});
-
-		}
-
-		<?php } else if ($this->get_option('wpsg_form_validation') == '2') { ?>
-
-		jQuery.validator.addMethod("cRequired", jQuery.validator.methods.required, "<?php echo __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'); ?>");
-		jQuery.validator.addClassRules('validate[required]', { cRequired: true } );
-		jQuery("#form-profil").validate( { 
-			ignore: '',
-			errorClass: 'wpsg_error',
-			onsubmit: false,
-			showErrors: function(errorMap, errorList) {
-
-				this.defaultShowErrors();	
-
-			}
-		} ); 
-
-		jQuery('#wpsg_mod_kundenverwaltung_save').bind('click', function() { 
-
-			var bReturn = jQuery('#form-profil').validate().form();
-			if (jQuery('#form-profil input.wpsg_error').length > 0) jQuery('#form-profil input.wpsg_error')[0].focus();
-			return bReturn;
-			  
-		} );
 		
-		<?php } ?>
+		jQuery("#form-profil").validationEngine('attach', {promptPosition : "centerRight", scroll: false});
 		
-// Visualisierung der PasswortstÃ€rke 
-
-		jQuery('input[type=password]').keyup(function(){
-
-			var password = jQuery(this).val();
-			
-			if (password.length < 8) {
-				
-				jQuery('#wpsg_pwd_length').removeClass('valid').addClass('invalid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_length').removeClass('invalid').addClass('valid');
-	
-			}
-
-			if (password.match(/([a-z])/)) {
-				
-				jQuery('#wpsg_pwd_letter').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_letter').removeClass('valid').addClass('invalid');
-	
-			}
-
-			if (password.match(/([A-Z])/)) {
-				
-				jQuery('#wpsg_pwd_capital').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_capital').removeClass('valid').addClass('invalid');
-	
-			}
-			
-			if (password.match(/([0-9])/)) {
-				
-				jQuery('#wpsg_pwd_number').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_number').removeClass('valid').addClass('invalid');
-	
-			}
-
-			if (password.match(/([~,!,%,@,&,#,Â°,^,$,?,_,*,Â§])/)) {
-				
-				jQuery('#wpsg_pwd_speziell').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_speziell').removeClass('valid').addClass('invalid');
-	
-			}
-			
-
-			jQuery('#wpsg_pwd_info').show(); 		
-			
-			jQuery(this).blur(function(){
-
-				jQuery('#wpsg_pwd_info').hide(); 
-				
-			});
-			
-		});	
-
-	});	
-
-	<?php /* Copy&Paste fÃŒr das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
-	window.onload = function() {
-		
-		var email2 = document.getElementById('email2');
-
-		email2.onpaste = function(e) {
-
-			e.preventDefault();
-
-		}
-	}
+	} );
 		
 </script>
@@ -136,5 +25,4 @@
 		<h2><?php echo __('Kundendaten', 'wpsg'); ?></h2>
 		
-		<?php if ($this->view['pflicht']['firma'] != '2') { ?>
 		<div class="wpsg_checkoutblock">
 			<label for="wpsg_firma"><?php echo __("Firma", "wpsg"); ?>
@@ -143,24 +31,16 @@
 			<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[profil][firma]" value="<?php echo htmlspecialchars($this->view['data']['firma']); ?>" />
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
-			<label for="wpsg_title" class="wpsg_checkout"><?php echo __('Anrede', 'wpsg'); ?>
+			<label for="wpsg_title"><?php echo __('Anrede', 'wpsg'); ?>
 			<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:</label>
 			<select class="wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[profil][title]">
 				<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-				<?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
-					<?php /* <option value="<?php echo $i; $i++; ?>" <?php echo (($this->view['data']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option> */ ?>
-					<option value="<?php echo $i; /*wpsg_hspc($t);*/ ?>"
-						<?php if ($this->view['data']['title'] == $i) : echo 'selected="selected"'; endif; ?>>
-						<?php echo $t; $i++; ?>
-					</option>
-				<?php } ?>
-			</select>
+				<?php foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+				<option value="<?php echo $t; ?>" <?php echo (($this->view['data']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
+				<?php } ?>						
+			</select>		
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['vname'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="vname" class="wpsg_checkout"><?php echo __("Vorname", "wpsg"); ?> 
@@ -169,7 +49,5 @@
 			<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="vname" name="wpsg[profil][vname]" value="<?php echo htmlspecialchars($this->view['data']['vname']); ?>" />
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['name'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="name" class="wpsg_checkout"><?php echo __("Name", "wpsg"); ?>
@@ -178,7 +56,5 @@
 			<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="name" name="wpsg[profil][name]" value="<?php echo htmlspecialchars($this->view['data']['name']); ?>" />
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['geb'] != '2') { ?>
 		<div class="wpsg_checkoutblock">
 			<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ)', 'wpsg'); ?>
@@ -187,41 +63,23 @@
 			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[profil][geb]" value="<?php echo htmlspecialchars($this->view['data']['geb']); ?>" />
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['email'] != '2') { ?>
 		<div class="wpsg_checkoutblock">
 			<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse", "wpsg"); ?> 
 			<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input 
-                class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?>
-                wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="email" 
-                id="email" 
-                name="wpsg[profil][email]" 
-                value="<?php echo htmlspecialchars($this->view['data']['email']); ?>" 
-                autocomplete="off"
-            />		
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email" name="wpsg[profil][email]" value="<?php echo htmlspecialchars($this->view['data']['email']); ?>" />		
 		</div>
-		<?php } ?>
 		
 		<?php if ($this->view['pflicht']['emailconfirm'] == '1') { ?>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse (Wiederholung)", "wpsg"); ?> 
 			<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input 
-                class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> 
-                wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="email" 
-                id="email2" 
-                name="wpsg[profil][email2]" 
-                value="<?php echo htmlspecialchars($this->view['data']['email2']); ?>" 
-                autocomplete="off"
-            />			
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email2" name="wpsg[profil][email2]" value="<?php echo htmlspecialchars($this->view['data']['email2']); ?>" />			
 		</div>
+		
 		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['fax'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="fax" class="wpsg_checkout"><?php echo __("Fax.", "wpsg"); ?>
@@ -230,7 +88,5 @@
 			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="fax" name="wpsg[profil][fax]" value="<?php echo htmlspecialchars($this->view['data']['fax']); ?>" />		
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['tel'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="tel" class="wpsg_checkout"><?php echo __("Tel.", "wpsg"); ?>
@@ -239,35 +95,12 @@
 			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="tel" name="wpsg[profil][tel]" value="<?php echo htmlspecialchars($this->view['data']['tel']); ?>" />	
 		</div>
-		<?php } ?>
 				
-		<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-			
-			<?php if ($this->view['pflicht']['wpsg_showNr'] === '1') { ?>
-
-				<div class="wpsg_checkoutblock" id="wpsg_streetnr">
-					<label for="strasse" class="street wpsg_checkout"><?php echo __('StraÃe:', 'wpsg'); ?>
-						<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-						<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[profil][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['strasse'])); ?>" />
-					</label>
-					<label for="nr" class="nr wpsg_checkout"><?php echo __('Nr:', 'wpsg'); ?>
-						<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-						<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[profil][nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['nr'])); ?>" />
-					</label>
-				</div>
-			
-			<?php } else { ?>
-
-				<div class="wpsg_checkoutblock">
-					<label for="strasse" class="wpsg_checkout"><?php echo __("StraÃe Nr.", "wpsg"); ?>
-						<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-					</label>
-					<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[profil][strasse]" value="<?php echo htmlspecialchars($this->view['data']['strasse']); ?>" />
-				</div>
-			
-			<?php } ?>
-						
-		<?php } ?>
+		<div class="wpsg_checkoutblock">			
+			<label for="strasse" class="wpsg_checkout"><?php echo __("Strasse Nr.", "wpsg"); ?> 
+			<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[profil][strasse]" value="<?php echo htmlspecialchars($this->view['data']['strasse']); ?>" />		
+		</div>
 		
-		<?php if ($this->view['pflicht']['plz'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl", "wpsg"); ?> 
@@ -276,7 +109,5 @@
 			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[profil][plz]" value="<?php echo htmlspecialchars($this->view['data']['plz']); ?>" />		
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['ort'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="ort" class="wpsg_checkout"><?php echo __("Ort", "wpsg"); ?> 
@@ -285,7 +116,5 @@
 			<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[profil][ort]" value="<?php echo htmlspecialchars($this->view['data']['ort']); ?>" />		
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['land'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land", "wpsg"); ?> 
@@ -299,7 +128,5 @@
 			</select>		
 		</div>
-		<?php } ?>
 		
-		<?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
 		<div class="wpsg_checkoutblock">		
 			<label for="wpsg_ustidnr" class="wpsg_checkout"><?php echo __("UStIdNr.", "wpsg"); ?> 
@@ -308,5 +135,4 @@
 			<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[profil][ustidnr]" value="<?php echo htmlspecialchars($this->view['data']['ustidnr']); ?>" />		
 		</div>
-		<?php } ?>
 		
 		<?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
@@ -316,19 +142,19 @@
 			<label class="wpsg_cv" for="wpsg_cv_<?php echo $c_id; ?>">
 				<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
+				<?php if ($c['typ'] == '0') { // Textfeld ?>
+				<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[profil][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc($this->view['data']['custom'][$c_id]); ?>" />
+				<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
+				<select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[profil][custom][<?php echo $c_id; ?>]">
+					<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
+					<?php foreach ((array)$arAuswahl as $a) { ?>
+					<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['data']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
+					<?php } ?>
+				</select>
+				<?php } else if ($c['typ'] == '2') { // Checkbox ?>
+				<input type="hidden" name="wpsg[profil][custom][<?php echo $c_id; ?>]" value="0" />
+				<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[profil][custom][<?php echo $c_id; ?>]" value="1" <?php echo wpsg_hspc(($this->view['data']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
+				<span class="wpsg_clear"></span> 
+				<?php } ?>
 			</label>
-			<?php if ($c['typ'] == '0') { // Textfeld ?>
-			<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[profil][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc($this->view['data']['custom'][$c_id]); ?>" />
-			<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
-			<select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[profil][custom][<?php echo $c_id; ?>]">
-				<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
-				<?php foreach ((array)$arAuswahl as $a) { ?>
-				<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['data']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
-				<?php } ?>
-			</select>
-			<?php } else if ($c['typ'] == '2') { // Checkbox ?>
-			<input type="hidden" name="wpsg[profil][custom][<?php echo $c_id; ?>]" value="0" />
-			<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[profil][custom][<?php echo $c_id; ?>]" value="1" <?php echo wpsg_hspc(($this->view['data']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
-			<span class="wpsg_clear"></span> 
-			<?php } ?>			
 		</div>
 		<?php } } ?>
@@ -339,39 +165,14 @@
 		<div class="wpsg_checkoutblock">		
 			<label for="wpsg_mod_kundenverwaltung_pwd1"><?php echo __("Passwort", "wpsg"); ?>
-			<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input 
-                class="wpsg_checkout <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="password" 
-                id="wpsg_mod_kundenverwaltung_pw1" 
-                name="wpsg[mod_kundenverwaltung][register_pwd1]" 
-                value="" 
-                autocomplete="off"
-            /><span id="wpsg_mod_kundenverwaltung_password_result"></span>	
+			<input class="wpsg_checkout <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="mod_kundenverwaltung_pwd1" name="wpsg[mod_kundenverwaltung][register_pwd1]" value="" />	
 		</div>
 		
 		<div class="wpsg_checkoutblock">		
 			<label for="wpsg_mod_kundenverwaltung_pwd2"><?php echo __("Passwort wiederholen", "wpsg"); ?>
-			<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input 
-                class="wpsg_checkout <?php echo ((in_array("mod_kundenverwaltung_pwd2", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="password" 
-                id="wpsg_mod_kundenverwaltung_pwd2" 
-                name="wpsg[mod_kundenverwaltung][register_pwd2]" 
-                value="" 
-                autocomplete="off"
-            />
-		</div>
-		
-		<div id="wpsg_pwd_info"> 
-		<h4><?php echo __('Passwort sollte folgende Regeln befolgen:','wpsg') ?></h4>
-			<ul>
-				<li id="wpsg_pwd_length" class="invalid"><?php echo __('Mit mindestens 8 Zeichen wird das Passwort noch sicherer','wpsg')?></li>
-				<li id="wpsg_pwd_letter" class="invalid"><?php echo __('Mit mindestens einem Kleinbuchstaben wird das Passwort noch sicherer','wpsg') ?></li>
-				<li id="wpsg_pwd_capital" class="invalid"><?php echo __('Mit mindestens einem GroÃbuchstaben wird das Passwort noch sicherer','wpsg') ?></li>
-				<li id="wpsg_pwd_number" class="invalid"><?php echo __('Mit mindestens einer Zahl wird das Passwort noch sicherer','wpsg') ?></li>
-				<li id="wpsg_pwd_speziell" class="invalid"><?php echo __('Mit mindestens einem Sonderzeichen wird das Passwort noch sicherer','wpsg') ?></li>
-			</ul>
+			<input class="wpsg_checkout <?php echo ((in_array("mod_kundenverwaltung_pwd2", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="wpsg_mod_kundenverwaltung_pwd2" name="wpsg[mod_kundenverwaltung][register_pwd2]" value="" />
 		</div>
 		
@@ -384,5 +185,5 @@
 		<div class="wpsg_clear"></div><br />
 		
-		<input type="submit" class="wpsg_button wpsg_saveButton" id="wpsg_mod_kundenverwaltung_save" value="<?php echo __('Speichern', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_save" />
+		<input type="submit" class="wpsg_button wpsg_saveButton" value="<?php echo __('Speichern', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_save" />
 	
 		<?php $this->ClearSessionErrors(); ?>
Index: /views/mods/mod_kundenverwaltung/register.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/register.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/register.phtml	(revision 5261)
@@ -13,155 +13,64 @@
 		<?php if ($this->get_option('wpsg_form_validation') == '1') { ?>
 
-			if (typeof jQuery.validationEngine == "object")
-			{
-			
-				jQuery("#form-step2").validationEngine('attach', {promptPosition : "centerRight", scroll: false});
-					
-				jQuery('.wpsg_mod_kundenverwaltung_login').bind('click', function(){
-					jQuery("#form-step2").validationEngine('detach');		
-				});
+		if (typeof jQuery.validationEngine == "object")
+		{
+		
+			jQuery("#form-step2").validationEngine('attach', {promptPosition : "centerRight", scroll: false});
+				
+			jQuery('.wpsg_mod_kundenverwaltung_login').bind('click', function(){
+				jQuery("#form-step2").validationEngine('detach');		
+			});
+
+		}
+		
+		<?php } else if ($this->get_option('wpsg_form_validation') == '2') { ?>
+
+		jQuery.validator.addMethod("cRequired", jQuery.validator.methods.required, "<?php echo __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'); ?>");
+		jQuery.validator.addClassRules('validate[required]', { cRequired: true } );
+		jQuery("#form-step2").validate( { 
+			ignore: '',
+			errorClass: 'wpsg_error',
+			onsubmit: false,
+			showErrors: function(errorMap, errorList) {
+
+				this.defaultShowErrors();	
 
 			}
-		
-		<?php } else if ($this->get_option('wpsg_form_validation') == '2') { ?>
-
-			jQuery.validator.addMethod("cRequired", jQuery.validator.methods.required, "<?php echo __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'); ?>");
-			jQuery.validator.addClassRules('validate[required]', { cRequired: true } );
-			jQuery("#form-step2").validate( { 
-				ignore: '',
-				errorClass: 'wpsg_error',
-				onsubmit: false,
-				showErrors: function(errorMap, errorList) {
-
-					this.defaultShowErrors();	
-
-				}
-			} ); 
-
-			jQuery('.wpsg_registerButton').bind('click', function() { 
-
-				var bReturn = jQuery('#form-step2').validate().form();
-				if (jQuery('#form-step2 input.wpsg_error').length > 0) jQuery('#form-step2 input.wpsg_error')[0].focus();
-				return bReturn;
-				
-			} );
+		} ); 
+
+		jQuery('.wpsg_registerButton').bind('click', function() { 
+
+			var bReturn = jQuery('#form-step2').validate().form();
+			if (jQuery('#form-step2 input.wpsg_error').length > 0) jQuery('#form-step2 input.wpsg_error')[0].focus();
+			return bReturn;
+			  
+		} );
 		
 		<?php } ?>
 		
-
-		// Visualisierung der PasswortstÃ€rke 
-		jQuery('input[type=password]').keyup(function(){
-
-			var password = jQuery(this).val();
-			
-			if (password.length < 8) {
-				
-				jQuery('#wpsg_pwd_length').removeClass('valid').addClass('invalid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_length').removeClass('invalid').addClass('valid');
-	
-			}
-
-			if (password.match(/([a-z])/)) {
-				
-				jQuery('#wpsg_pwd_letter').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_letter').removeClass('valid').addClass('invalid');
-	
-			}
-
-			if (password.match(/([A-Z])/)) {
-				
-				jQuery('#wpsg_pwd_capital').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_capital').removeClass('valid').addClass('invalid');
-	
-			}
-			
-			if (password.match(/([0-9])/)) {
-				
-				jQuery('#wpsg_pwd_number').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_number').removeClass('valid').addClass('invalid');
-	
-			}
-
-			if (password.match(/([~,!,%,@,&,#,Â°,^,$,?,_,*,Â§])/)) {
-				
-				jQuery('#wpsg_pwd_speziell').removeClass('invalid').addClass('valid');
-
-			}else{
-
-				jQuery('#wpsg_pwd_speziell').removeClass('valid').addClass('invalid');
-	
-			}
-
-			jQuery('#wpsg_pwd_info').show(); 
-
-			jQuery(this).blur(function(){
-
-				jQuery('#wpsg_pwd_info').hide(); 
-				
-			});
-			
-		});
-		
-		// Validierung Spam	
-		<?php
-			if (isset($_GET["wpsg_spam_email"]) && $_GET["wpsg_spam_email"] != "") {
-				echo "<p>Sie haben ein Feld ausgefÃŒllt, das frei bleiben muss.</p>";
-				exit;
-			}
-		?>
-
-	});	
-
-	<?php /* Copy&Paste fÃŒr das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
-	window.onload = function() {
-		
-		var email2 = document.getElementById('email2');
-
-		email2.onpaste = function(e) {
-
-			e.preventDefault();
-
-		}
-	}
-	
+	} );
+		
+	<?php
+   		if ($_GET["wpsg_spam_email"] != "") {
+     		echo "<p>Sie haben ein Feld ausgefÃŒllt, das frei bleiben muss.</p>";
+     		exit;
+  		}
+	?>
+		
 </script>
 
 <div class="wpsg wpsg_checkout wpsg_register">
 	
-	<style> 
-        .placeholder { display: none !important; } 
-        .m1_dsgvo_layer { position:relative; width:100%; height:100px; margin-bottom: 30px; }
-        .m1_dsgvo_layer > .placeholder_text { height:100px; font-size: small; position:relative; left:0; top:0; z-index:2; background-color:rgba(0, 0, 0, 0.75); display:flex; justify-content:center; align-items:center; color:#FFFFFF; flex-direction:column; padding:1rem; text-align:center; } 
-        .m1_dsgvo_layer > .placeholder_text > button { color: rgba(0, 0, 0, 0.75); margin-top: 1rem;}
-    </style>
+	<?php echo $this->writeFrontendMessage(); ?>
 	
 	<form id="form-step2" method="post" action="<?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'getRegisterURL'); ?>">
-
-		<?php echo $this->writeFrontendMessage(); ?>    
-		
-		<h2><?php echo __('Registrierung', 'sto'); ?></h2>
-	
-		<?php if ($this->view['pflicht']['firma'] != '2') { ?>
+	
 		<div class="wpsg_checkoutblock">
 			<label for="wpsg_firma"><?php echo __("Firma", "wpsg"); ?>
 			<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[register][firma]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['firma'])); ?>" />
-		</div>
-		<?php } ?>
-	
-		<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
+			<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[register][firma]" value="<?php echo htmlspecialchars($this->view['data']['firma']); ?>" />
+		</div>
+	
 		<div class="wpsg_checkoutblock">
 			<label for="wpsg_title"><?php echo __('Anrede', 'wpsg'); ?>
@@ -169,176 +78,97 @@
 			<select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[register][title]">
 				<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-				<?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
-				<option value="<?php echo $i; /*wpsg_hspc($t);*/ $i++; ?>" <?php echo (($this->view['data']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
+				<?php foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+				<option value="<?php echo $t; ?>" <?php echo (($this->view['data']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
 			<?php } ?>						
 			</select>
 		</div>
-		<?php } ?>
-	
-		<?php if ($this->view['pflicht']['vname'] != '2') { ?>
+	
 		<div class="wpsg_checkoutblock">
 			<label for="vname" class="wpsg_register"><?php echo __("Vorname", "wpsg"); ?>
 			<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="vname" name="wpsg[register][vname]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['vname'])); ?>" />		
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['name'] != '2') { ?>
+			<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="vname" name="wpsg[register][vname]" value="<?php echo htmlspecialchars($this->view['data']['vname']); ?>" />		
+		</div>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="name" class="wpsg_register"><?php echo __("Name", "wpsg"); ?>
-			<?php if ($this->view['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-			</label>
-			<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="name" name="wpsg[register][name]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['name'])); ?>" />
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['email'] != '2') { ?>
+			<?php if ($this->data['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="name" name="wpsg[register][name]" value="<?php echo htmlspecialchars($this->view['data']['name']); ?>" />
+		</div>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="email" class="wpsg_register"><?php echo __("E-Mail Adresse", "wpsg"); ?>
 			<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input 
-                class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="email" id="email" 
-                name="wpsg[register][email]" 
-                value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['email'])); ?>" 
-                autocomplete="off"
-            />
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['email'] != '2') { ?>
-		<div class="wpsg_checkoutblock">
-			<label for="email2" class="wpsg_register"><?php echo __("E-Mail Adresse (Wiederholung)", "wpsg"); ?>
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email" name="wpsg[register][email]" value="<?php echo htmlspecialchars($this->view['data']['email']); ?>" />
+		</div>
+		
+		<div class="wpsg_checkoutblock">
+			<label for="email" class="wpsg_register"><?php echo __("E-Mail Adresse (Wiederholung)", "wpsg"); ?>
 			<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input 
-                class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="email"
-                id="email2" 
-                name="wpsg[register][email2]" 
-                value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['register']['email2'])); ?>" 
-                autocomplete="off"
-            />
-		</div>
-		<?php } ?>
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email2" name="wpsg[register][email2]" value="<?php echo htmlspecialchars($this->view['data']['register']['email2']); ?>" />
+		</div>
 		
 		<div class="wpsg_checkoutblock">
 			<label for="pwd1" class="wpsg_register"><?php echo __("Passwort", "wpsg"); ?>
-			<?php if (wpsg_getStr($this->view['pflicht']['pwd1']) != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-			</label>
-			<input 
-                class="<?php echo ((wpsg_getStr($this->view['pflicht']['pwd1']) != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="password" 
-                id="pwd1" 
-                name="wpsg[register][register_pwd1]" 
-                autocomplete="off"
-                value="" 
-            /><span id="wpsg_checkoutblock_password_result"></span>
+			<?php if ($this->view['pflicht']['pwd1'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['pwd1'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="pwd1" name="wpsg[register][register_pwd1]" value="" />
 		</div>
 		
 		<div class="wpsg_checkoutblock">
 			<label for="pwd2" class="wpsg_register"><?php echo __("Passwort (Wiederholung)", "wpsg"); ?>
-			<?php if (wpsg_getStr($this->view['pflicht']['pwd2']) != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-			</label>
-			<input 
-                class="<?php echo ((wpsg_getStr($this->view['pflicht']['pwd2']) != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("mod_kundenverwaltung_pwd2", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                type="password" 
-                id="pwd2" 
-                name="wpsg[register][register_pwd2]" 
-                value="" 
-                autocomplete="off"
-            />
-		</div>
-		
-		<div id="wpsg_pwd_info"> 
-			<h4><?php echo __('Passwort sollte folgende Regeln befolgen:','wpsg') ?></h4>
-			<ul>
-				<li id="wpsg_pwd_length" class="invalid"><?php echo __('Mit mindestens 8 Zeichen wird das Passwort noch sicherer','wpsg')?></li>
-				<li id="wpsg_pwd_letter" class="invalid"><?php echo __('Mit mindestens einem Kleinbuchstaben wird das Passwort noch sicherer','wpsg') ?></li>
-				<li id="wpsg_pwd_capital" class="invalid"><?php echo __('Mit mindestens einem GroÃbuchstaben wird das Passwort noch sicherer','wpsg') ?></li>
-				<li id="wpsg_pwd_number" class="invalid"><?php echo __('Mit mindestens einer Zahl wird das Passwort noch sicherer','wpsg') ?></li>
-				<li id="wpsg_pwd_speziell" class="invalid"><?php echo __('Mit mindestens einem Sonderzeichen wird das Passwort noch sicherer','wpsg') ?></li>
-			</ul>
-		</div>
-		
-		<?php if ($this->view['pflicht']['geb'] != '2') { ?>
+			<?php if ($this->view['pflicht']['pwd2'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['pwd2'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("mod_kundenverwaltung_pwd2", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="pwd2" name="wpsg[register][register_pwd2]" value="" />
+		</div>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="geb" class="wpsg_register"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ)', 'wpsg'); ?>
 			<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[register][geb]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['geb'])); ?>" />
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['fax'] != '2') { ?>
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[register][geb]" value="<?php echo htmlspecialchars($this->view['data']['geb']); ?>" />
+		</div>
+				
 		<div class="wpsg_checkoutblock">
 			<label for="fax" class="wpsg_register"><?php echo __("Fax.", "wpsg"); ?>
 			<?php if ($this->view['pflicht']['fax'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="fax" name="wpsg[register][fax]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['fax'])); ?>" />
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['tel'] != '2') { ?>
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="fax" name="wpsg[register][fax]" value="<?php echo htmlspecialchars($this->view['data']['fax']); ?>" />
+		</div>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="tel" class="wpsg_register"><?php echo __("Tel.", "wpsg"); ?>
 			<?php if ($this->view['pflicht']['tel'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>
-			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="tel" name="wpsg[register][tel]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['tel'])); ?>" />
-		</div>
-		<?php } ?>
-	
-		<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-			
-			<?php if (($this->view['pflicht']['wpsg_showNr']??0) === '1') { ?>
-
-				<div class="wpsg_checkoutblock" id="wpsg_streetnr">
-					<label for="strasse" class="street wpsg_checkout"><?php echo __('StraÃe:', 'wpsg'); ?>
-						<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-						<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[register][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['strasse'])); ?>" />
-					</label>
-					<label for="nr" class="nr wpsg_checkout"><?php echo __('Nr:', 'wpsg'); ?>
-						<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-						<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[register][nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['nr'])); ?>" />
-					</label>
-				</div>
-			
-			<?php } else { ?>
-
-				<div class="wpsg_checkoutblock">
-					<label for="strasse" class="wpsg_register"><?php echo __("StraÃe Nr.", "wpsg"); ?>
-						<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-					</label>
-					<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[register][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['strasse'])); ?>" />
-				</div>
-			
-			<?php } ?>
-			
-		<?php } ?>
-
-		<?php if ($this->view['pflicht']['plz'] != '2') { ?>
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="tel" name="wpsg[register][tel]" value="<?php echo htmlspecialchars($this->view['data']['tel']); ?>" />
+		</div>
+	
+		<div class="wpsg_checkoutblock">
+			<label for="strasse" class="wpsg_register"><?php echo __("Strasse Nr.", "wpsg"); ?>
+			<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[register][strasse]" value="<?php echo htmlspecialchars($this->view['data']['strasse']); ?>" />		
+		</div>
+	
 		<div class="wpsg_checkoutblock">
 			<label for="plz" class="wpsg_register"><?php echo __("Postleitzahl", "wpsg"); ?>
-				<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-			</label>
-			<input class="<?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[register][plz]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['plz'])); ?>" />
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['ort'] != '2') { ?>
+			<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[register][plz]" value="<?php echo htmlspecialchars($this->view['data']['plz']); ?>" />
+		</div>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="ort" class="wpsg_register"><?php echo __("Ort", "wpsg"); ?>
-				<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-			</label>
-			<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[register][ort]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['ort'])); ?>" />
-		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['land'] != '2') { ?>
+			<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[register][ort]" value="<?php echo htmlspecialchars($this->view['data']['ort']); ?>" />
+		</div>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="wpsg_land" class="wpsg_register"><?php echo __("Land", "wpsg"); ?>
-				<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 			</label>					
 			<select name="wpsg[register][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
@@ -349,14 +179,11 @@
 			</select>
 		</div>
-		<?php } ?>
-		
-		<?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
+		
 		<div class="wpsg_checkoutblock">
 			<label for="wpsg_ustidnr" class="wpsg_register"><?php echo __("UStIdNr.", "wpsg"); ?>
-				<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-			</label>
-			<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[register][ustidnr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['data']['ustidnr'])); ?>" />
-		</div>
-		<?php } ?>
+			<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+			</label>
+			<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_register <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[register][ustidnr]" value="<?php echo htmlspecialchars($this->view['data']['ustidnr']); ?>" />
+		</div>
 		
 		<?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
@@ -367,15 +194,15 @@
 				<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
 				<?php if ($c['typ'] == '0') { // Textfeld ?>
-				<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[register][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc(@$this->view['data']['custom'][$c_id]); ?>" />
+				<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[register][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc($this->view['data']['custom'][$c_id]); ?>" />
 				<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
 				<select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[register][custom][<?php echo $c_id; ?>]">
 					<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
 					<?php foreach ((array)$arAuswahl as $a) { ?>
-					<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == wpsg_getStr($this->view['data']['custom'][$c_id]))?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
+					<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['data']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
 					<?php } ?>
 				</select>
 				<?php } else if ($c['typ'] == '2') { // Checkbox ?>
 				<input type="hidden" name="wpsg[register][custom][<?php echo $c_id; ?>]" value="0" />
-				<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[register][custom][<?php echo $c_id; ?>]" value="1" <?php echo wpsg_hspc((@$this->view['data']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
+				<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[register][custom][<?php echo $c_id; ?>]" value="1" <?php echo wpsg_hspc(($this->view['data']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
 				<span class="wpsg_clear"></span> 
 				<?php } ?>
@@ -386,66 +213,4 @@
 		<?php /* Automatische Einbindung der benutzerdefinierten Kundenfelder ENDE */ ?>
 		<div class="wpsg_clear"></div>
-
-		<?php if ($this->get_option('wpsg_mod_kundenverwaltung_recaptcha_register') === '1') { ?>
-			<div class="wpsg_checkoutblock">
-				<label class="recaptcha_v2_checkout ">
-
-					<?php echo __('SPAM Schutz Abfrage'); ?> <span class="wpsg_required">*</span>:
-
-					<?php if ($this->get_option('wpsg_mod_kundenverwaltung_recaptcha_dsgvo_layer') != '1') { ?>
-						<div class="g-recaptcha" data-sitekey="<?php echo $this->get_option('wpsg_mod_kundenveraltung_recaptcha_key'); ?>"></div> 
-					<?php } else { ?>
-						<div class="wpsg_recaptcha placeholder"> <!-- Platzhalter fÃŒr das Google ReCAPTCHA --> </div>
-						<div class="m1_dsgvo_layer ">
-							<div class="placeholder_text">
-								<strong>Datenschutz ist uns wichtig!</strong>
-								Daher wird das Google ReCAPTCHA erst geladen, wenn sie der Verwendung des Drittanbieters "Google LLC" zustimmen durch den mÃ¶glicherweise Cookies gesetzt werden.<br />
-								<button class="layer_link wpsg_required">Ich bin damit einverstanden.</button>
-							</div>
-						</div>
-					<?php } ?>
-
-				</label>
-			</div>
-			<div class="wpsg_clear"></div>
-		<?php } ?>
-		
-		<?php if ($this->get_option('wpsg_mod_kundenverwaltung_mathcaptcha') === '1') {  
-			
-			$number1 = rand(0, 9);
-			$number2 = rand(0, 10);
-			$arOperator = ['+', '-', '*']; $operator = $arOperator[array_rand($arOperator)];
-			
-			$time = time(); 
-							
-			switch ($operator) {
-				
-				case '+': $captcha_result = $number1 + $number2; break;
-				case '-': $captcha_result = $number1 - $number2; break;
-				case '*': $captcha_result = $number1 * $number2; break;
-				
-				default: throw new \Exception();
-				
-			}
-			
-			\set_transient('wpsg_mod_kundenverwaltung_mathcaptcha_result', $captcha_result);
-			
-			?>
-		
-			<div class="wpsg_checkoutblock">
-				<label for="wpsg_mod_kundenverwaltung_mathcaptcha" class="wpsg_register"><?php echo wpsg_translate(
-					__("Ergebnis aus #1# #2# #3#", "wpsg"),
-						$number1, $operator, $number2
-				); ?>:
-					<span class="wpsg_required">*</span>
-				</label>
-				<input 
-						class="validate[required] wpsg_register <?php echo ((in_array("wpsg_mod_kundenverwaltung_mathcaptcha", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-						type="text" id="wpsg_mod_kundenverwaltung_mathcaptcha" name="wpsg_mod_kundenverwaltung_mathcaptcha"
-						placeholder="SPAM Schutz"
-						value="" />
-			</div>
-			
-		<?php } ?>
 		
 		<div class="wpsg_mandatoryfield_hint">
@@ -455,9 +220,9 @@
 		<?php /* versteckte Sicherheitsabfrage als Bot-Schutz START*/ ?>
 			<span style="display:none">
-				<label for="wpsg_spam_email">Das Feld muss frei bleiben:</label>
-				<input type="text" name="wpsg_spam_email" id="wpsg_spam_email" title=" dieses Feld muss frei bleiben " />
+   				<label for="wpsg_spam_email">Das Feld muss frei bleiben:</label>
+   				<input type="text" name="wpsg_spam_email" id="wpsg_spam_email" title=" dieses Feld muss frei bleiben " />
 			</span> 
 		<?php /* versteckte Sicherheitsabfrage als Bot-Schutz ENDE*/ ?>
-				
+		
 		<br />		
 		
@@ -468,28 +233,3 @@
 		<div class="wpsg_clear"></div>
 	</form>
-
-    <script>
-		// DSGVO Layer Script
-        document.querySelector('.layer_link').addEventListener('click', function() {
-
-			const recaptcha = document.createElement("div");
-			const a = document.createAttribute("data-sitekey");
-			const b = document.createAttribute("style");
-			a.value = "<?php echo $this->get_option('wpsg_mod_kundenveraltung_recaptcha_key'); ?>";
-			b.value = "float: left !important;";
-			recaptcha.classList.add("g-recaptcha");
-			recaptcha.setAttributeNode(a);
-			recaptcha.setAttributeNode(b);
-
-			document.querySelector('.wpsg_recaptcha').appendChild(recaptcha);
-            (function(){var w=window,C='___grecaptcha_cfg',cfg=w[C]=w[C]||{},N='grecaptcha';var gr=w[N]=w[N]||{};gr.ready=gr.ready||function(f){(cfg['fns']=cfg['fns']||[]).push(f);};w['__recaptcha_api']='https://www.google.com/recaptcha/api2/';(cfg['render']=cfg['render']||[]).push('onload');w['__google_recaptcha_client']=true;var d=document,po=d.createElement('script');po.type='text/javascript';po.async=true;po.src='https://www.gstatic.com/recaptcha/releases/vP4jQKq0YJFzU6e21-BGy3GP/recaptcha__de.js';po.crossOrigin='anonymous';po.integrity='sha384-xxpEMChSTl1oMpSrXrILE1mQOlVQNv6OGibce0r0HX1HeHF72bSDheOIehafBC9Y';var e=d.querySelector('script[nonce]'),n=e&&(e['nonce']||e.getAttribute('nonce'));if(n){po.setAttribute('nonce',n);}var s=d.getElementsByTagName('script')[0];s.parentNode.insertBefore(po, s);})();	
-
-			document.querySelector('.m1_dsgvo_layer').classList.add('placeholder');
-            document.querySelector('.wpsg_recaptcha').classList.remove('placeholder');
-
-			event.preventDefault();
-
-        });
-    </script>
-
 </div>
Index: /views/mods/mod_kundenverwaltung/settings_edit.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/settings_edit.phtml	(revision 5261)
@@ -7,32 +7,16 @@
 ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung_perpage', __('Kunden pro Seite (Backend)', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_perpage'), array('help' => 'wpsg_mod_kundenverwaltung_perpage')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_showCheckoutLogin', __('Login in Checkout integrieren', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutLogin'), array('help' => 'wpsg_mod_kundenverwaltung_showCheckoutLogin')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_showCheckoutRegister', __('Registrierung im Checkout', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegister'), array('help' => 'wpsg_mod_kundenverwaltung_showCheckoutRegister')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang', __('Registrierungzwang im Checkout', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang'), array('help' => 'wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_loginZwang', __('E-Mail darf nur fÃŒr einmaligen Einkauf genutzt werden', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_loginZwang'), array('help' => 'wpsg_mod_kundenverwaltung_loginZwang')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_preisAnzeige', __('Bestellung und Preisanzeige nur fÃŒr eingeloggte Benutzer', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_preisAnzeige'), array('help' => 'wpsg_mod_kundenverwaltung_preisAnzeige')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung_redirectlogin', __('Weiterleitung nach Login', 'wpsg'), wpsg_array_merge(array(	
-	'0' => __('Auf aktueller Seite bleiben', 'wpsg')		
-), $this->view['arPageWithoutCreate']), $this->get_option('wpsg_mod_kundenverwaltung_redirectlogin'), array('help' => 'wpsg_mod_kundenverwaltung_redirectlogin')); ?>
-
-<?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung_redirectLogout', __('Weiterleitung nach Logout', 'wpsg'), wpsg_array_merge(array(	
-	'0' => __('Auf aktueller Seite bleiben', 'wpsg')		
-), $this->view['arPageWithoutCreate']), $this->get_option('wpsg_mod_kundenverwaltung_redirectLogout'), array('help' => 'wpsg_mod_kundenverwaltung_redirectLogout')); ?>
-
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand', __('Registrierungzwang im Checkout', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand'), array('help' => 'wpsg_mod_kundenverwaltung_showCheckoutRegisterzwand')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_loginZwang', __('Loginzwang im Checkout (fÃŒr Neukunden)', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_loginZwang'), array('help' => 'wpsg_mod_kundenverwaltung_loginZwang')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung_redirectlogin', __('Weiterleitung nach Login', 'wpsg'), array(
+	'0' => __('Auf Profilseite leiten', 'wpsg'),
+	'1' => __('Auf aktueller Seite bleiben', 'wpsg')		
+), $this->get_option('wpsg_mod_kundenverwaltung_redirectlogin'), array('help' => 'wpsg_mod_kundenverwaltung_redirectlogin')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung_redirectLogout', __('Weiterleitung nach Logout', 'wpsg'), array(
+	'0' => __('Auf Profilseite leiten', 'wpsg'),
+	'1' => __('Auf aktueller Seite bleiben', 'wpsg')		
+), $this->get_option('wpsg_mod_kundenverwaltung_redirectLogout'), array('help' => 'wpsg_mod_kundenverwaltung_redirectLogout')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_status', __('Status nach Registrierung', 'wpsg'), array('inaktiv', 'aktiv'), $this->get_option('wpsg_page_mod_kundenverwaltung_status'), array('help' => 'wpsg_mod_kundenverwaltung_status')); ?>
 <div class="wpsg_form_field">
@@ -41,6 +25,6 @@
 	</div>
 	<div class="wpsg_form_right">
-		<a onclick="if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie alle Kunden auf Aktiv setzen mÃ¶chten?', 'wpsg'); ?>')) return false;" style="float:left;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung&wpsg_mod_kundenverwaltung_setActiv=1&noheader=1"><?php echo __('Alle Kunden aktivieren', 'wpsg'); ?></a>
-		<a onclick="if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie alle Kunden auf Inaktiv setzen mÃ¶chten?', 'wpsg'); ?>')) return false;" style="float:right; margin-right:25px;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung&wpsg_mod_kundenverwaltung_setInactiv=1&noheader=1"><?php echo __('Alle Kunden deaktivieren', 'wpsg'); ?></a>
+		<a onclick="if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie alle Kunden auf Aktiv setzen mÃ¶chten?', 'wpsg'); ?>')) return false;" style="float:left;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung&wpsg_mod_kundenverwaltung_setActiv=1&noheader=1"><?php echo __('Alle Kunden auf Aktiv setzen.', 'wpsg'); ?></a>
+		<a onclick="if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie alle Kunden auf Inaktiv setzen mÃ¶chten?', 'wpsg'); ?>')) return false;" style="float:right; margin-right:25px;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_kundenverwaltung&wpsg_mod_kundenverwaltung_setInactiv=1&noheader=1"><?php echo __('Alle Kunden auf Inaktiv setzen.', 'wpsg'); ?></a>
 	</div>
 	<div class="wpsg_clear"></div>
@@ -48,17 +32,9 @@
 
 <br />
-
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_profil', __('Profilseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_profil'), array('help' => 'wpsg_page_mod_kundenverwaltung_profil')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_registrierung', __('Registrierungsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_registrierung'), array('help' => 'wpsg_page_mod_kundenverwaltung_registrierung')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung', __('Weiterleitung nach Registrierung', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung'), array('help' => 'wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_passwordsend', __('Passwort gesendet', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_passwordsend'), array('help' => 'wpsg_page_mod_kundenverwaltung_passwordsend')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_order', __('BestellÃŒbersichtsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_order'), array('help' => 'wpsg_mod_kundenverwaltung_order')); ?>
-
-<br />
-
-<?php if ($this->hasMod('wpsg_mod_abo') == '1') { ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_abo', __('AbonnementenÃŒbersichtsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_abo'), array('help' => 'wpsg_mod_kundenverwaltung_abo')); ?>
-<?php } ?>
-
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_profil', __('Profilseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_profil')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_registrierung', __('Registrierungsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_registrierung')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung', __('Weiterleitung nach Registrierung', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_weiterleitung_nach_registrierung')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_kundenverwaltung_order', __('BestellÃŒbersichtsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_kundenverwaltung_order')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_onlylogin', __('Bestellungen nur fÃŒr registrierte Kunden zulassen', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_onlylogin'), array('help' => 'wpsg_mod_kundenverwaltung_onlylogin')); ?>
 <br />
 
@@ -67,30 +43,19 @@
 	
 	<?php echo wpsg_drawForm_Select('wpsg_mod_kundenverwaltung_wpuser_role', __('Benutzerrolle', 'wpsg'), $this->view['arRoles'], $this->get_option('wpsg_mod_kundenverwaltung_wpuser_role')); ?>
-    <br />
-    
+	 
 </div>
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_recaptcha_register', __('reCaptcha V2 fÃŒr Registrierung', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_recaptcha_register'), array('help' => 'wpsg_mod_kundenverwaltung_recaptcha_register')); ?>
-<div id="wpsg_mod_kundenverwaltung_register_recaptcha_layer" style="display:none;">
-    
-    <?php echo wpsg_drawForm_Input('wpsg_mod_kundenveraltung_recaptcha_key', __('WebsiteschlÃŒssel', 'wpsg'), $this->get_option('wpsg_mod_kundenveraltung_recaptcha_key')); ?>
-    <?php echo wpsg_drawForm_Input('wpsg_mod_kundenveraltung_recaptcha_secretkey', __('Geheimer SchlÃŒssel', 'wpsg'), $this->get_option('wpsg_mod_kundenveraltung_recaptcha_secretkey')); ?>
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_recaptcha_dsgvo_layer', __('DSGVO Layer fÃŒr das Recaptcha', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_recaptcha_dsgvo_layer')); ?>
-    
+<br />
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_aweber', __('AWeber Integration', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_aweber'), array('help' => 'wpsg_mod_kundenverwaltung_aweber')); ?>
+<div id="wpsg_mod_kundenverwaltung_aweber_layer" style="display:none;">
+
+	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung_aweber_formid', __('AWeber meta_web_form_id', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_aweber_formid')); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung_aweber_listname', __('AWeber listname', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_aweber_listname')); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_kundenverwaltung_aweber_metaAdtracking', __('AWeber meta_adtracking', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_aweber_metaAdtracking')); ?>
+	
 </div>
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_kundenverwaltung_mathcaptcha', __('Captcha Mathe Aufgabe', 'wpsg'), $this->get_option('wpsg_mod_kundenverwaltung_mathcaptcha')); ?>
-
-<script> 
-    
-    jQuery('#wpsg_mod_kundenverwaltung_recaptcha_register').on('change', function() { 
-       
-        if (jQuery(this).prop('checked')) jQuery('#wpsg_mod_kundenverwaltung_register_recaptcha_layer').show();
-        else jQuery('#wpsg_mod_kundenverwaltung_register_recaptcha_layer').hide();
-    
-    } ).change(); </script>
-
 <br />
-<div class="info">
+<div class="wpsg_hinweis">
 	<?php echo wpsg_translate(__('Die Einstellungen fÃŒr die E-Mails (Betreff, Absender, CC) kÃ¶nnen in der <a href="#1#">E-Mail Konfiguration</a> durchgefÃŒhrt werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf'); ?>
 </div>
@@ -106,5 +71,14 @@
 			
 		} ).change();
-		 
+
+		jQuery('#wpsg_mod_kundenverwaltung_aweber').bind('change', function() {
+
+			if (jQuery(this).attr('checked') == 'checked') jQuery('#wpsg_mod_kundenverwaltung_aweber_layer').show();
+			else jQuery('#wpsg_mod_kundenverwaltung_aweber_layer').hide();
+			
+		} ).change();
+		
+		jQuery('.wpsg_form_help').tipTip();
+ 
 	} );
 
Index: /views/mods/mod_kundenverwaltung/widget.phtml
===================================================================
--- /views/mods/mod_kundenverwaltung/widget.phtml	(revision 8528)
+++ /views/mods/mod_kundenverwaltung/widget.phtml	(revision 5261)
@@ -17,7 +17,4 @@
 			<li class="menu-item menu-item-object-page"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_PROFIL); ?>"><?php echo __('Profil bearbeiten', 'wpsg'); ?></a></li>
 			<li class="menu-item menu-item-object-page"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_ORDER); ?>"><?php echo __('Bestellungen', 'wpsg'); ?></a></li>
-			<?php if ($this->hasMod('wpsg_mod_abo') == '1') { ?>
-			<li class="menu-item menu-item-object-page"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_ABO); ?>"><?php echo __('Abonnements', 'wpsg'); ?></a></li>
-			<?php } else {}?>
 			<li class="menu-item menu-item-object-page"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_LOGOUT); ?>"><?php echo __('Abmelden', 'wpsg'); ?></a></li>
 		</ul>
@@ -32,19 +29,6 @@
 		<h2 class="widget-title widgettitle"><?php echo __('Login', 'wpsg'); ?></h2>
 	 
-		<input 
-            type="text"
-            value="<?php echo __('E-Mail', 'wpsg'); ?>" 
-            id="wpsg_mod_kundenverwaltung_widget_email" 
-            name="wpsg[mod_kundenverwaltung][email]"
-            autocomplete="off"
-        />
-        
-		<input 
-            type="password" 
-            value="<?php echo __('Passwort', 'wpsg'); ?>" 
-            id="wpsg_mod_kundenverwaltung_widget_passwort"
-            name="wpsg[mod_kundenverwaltung][password]" 
-            autocomplete="off"
-        />
+		<input type="text" value="<?php echo __('E-Mail', 'wpsg'); ?>" id="wpsg_mod_kundenverwaltung_widget_email" name="wpsg[mod_kundenverwaltung][email]" />
+		<input type="password" value="<?php echo __('Passwort', 'wpsg'); ?>" id="wpsg_mod_kundenverwaltung_widget_passwort" name="wpsg[mod_kundenverwaltung][password]" />
 		
 		<br /><br />
Index: /views/mods/mod_legaltexts/form_haendlerbund.phtml
===================================================================
--- /views/mods/mod_legaltexts/form_haendlerbund.phtml	(revision 8528)
+++ /views/mods/mod_legaltexts/form_haendlerbund.phtml	(revision 5261)
@@ -9,46 +9,18 @@
 <style type="text/css">
 	
-	.wphb_form_field {
-		width: 100%;
-		display: flex;
-		flex-direction: row;
-		justify-content: flex-start;
-		align-items: center;
-	}
-	.wphb_form_field input {
-		width: 100%;
-	}
-	.wphb_form_left {
-		width: 50% !important;
-		flex-grow: 0;
-		flex-shrink: 0;
-	}
-	.wphb_form_right {
-		width: 50% !important;
-		flex-grow: 0;
-		flex-shrink: 0;
-	}
-
-	.wphb_table {
-		width: 100%;
-		border-spacing: 0px;
-		border-collapse: collapse;
-	}
-	.wphb_table input {
-		min-height: unset !important;
-	}
-	.wphb_table select {
-		width: 100%;
-	}
-	.col0 {
-		width: 50%;
-	}
-	.col1 {
-		width: 50%;
-	}
-
+	.wphb_clear { clear:both; }
+	.wphb_form_field { width:770px; margin-bottom:5px; }
+	.wphb_form_field .wphb_form_left { line-height:24px; font-weight:bold; width:350px; float:left; }
+	.wphb_form_field .wphb_form_right { width:420px; float:left; position:relative; line-height:28px; }
+	.wphb_form_field .wphb_form_right select, .wphb_form_field .wphb_form_right input { width:95%; }
+	.wphb_form_field .wphb_form_right input.checkbox { width:auto !important; float:left; margin-left:2px; margin-top:5px; }
+	.wphb_form_field .wphb_form_right p { padding:4px 0px 4px 6px; margin:0px; }
+	.wphb_form { padding:10px; }
+	.wphb_date { float:right; padding-right:5%; }
+	.wphb_hinweis { font-style:italic; }
+	
 </style>	
 
-<?php if ($this->view['wpsg_mod_legaltexts']['form'] == false) { ?>
+<?php if ($this->view['wpsg_mod_legaltexts']['form'] == false) {Â ?>
 
 	<p><?php echo __('wpShopGermany bietet eine Schnittstelle zum <a href="https://partner.haendlerbund.de/partnerdoor.php?partnerid=partner_wp&bannerid=18" target="_blank">HÃ€ndlerbund</a> an.', 'wpsg'); ?></p>
Index: /views/mods/mod_legaltexts/form_itrecht.phtml
===================================================================
--- /views/mods/mod_legaltexts/form_itrecht.phtml	(revision 8528)
+++ /views/mods/mod_legaltexts/form_itrecht.phtml	(revision 5261)
@@ -9,29 +9,24 @@
 <?php if ($this->view['wpsg_mod_legaltexts']['form'] == false) { ?>
 	
-	<a href="https://www.it-recht-kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150">
-		<img class="itrechtlogo" src="<?php echo $this->getRessourceURL('mods/mod_legaltexts/Logo_150.png'); ?>" alt="it-recht Kanzlei MÃŒnchen" />
-	</a>
+	<p><?php echo __('wpShopGermany bietet eine AGB-Schnittstelle zur <a href="http://www.it-recht-kanzlei.de/Service/rechtstexte_fuer_onlineshops.php?partner_id=150">IT-Recht Kanzlei</a> an.', 'wpsg'); ?></p>
 	
-	<p><?php echo __('wpShopGermany bietet eine AGB-Schnittstelle zur <a href="https://www.it-recht-kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150">IT-Recht Kanzlei</a> an.', 'wpsg'); ?></p>
-	
-	<ul>
-		<li><?php echo wpsg_translate(__('Kostenloses Plugin zur automatisierten Nutzung des AGB-Service der <a href="#1#">IT-Recht-Kanzlei</a>', 'wpsg'), 'https://www.it-recht-kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150'); ?></li>
-		<li><?php echo wpsg_translate(__('abmahnsichere Rechtstexte (AGB, DatenschutzerklÃ€rung, Widerrufsbelehrung & Co) von der <a href="#1#">IT-Recht Kanzlei</a> ab nur 8,90 â¬/mtl.', 'wpsg'), 'https://www.it-recht-kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150'); ?></li>
-		<li><?php echo __('Einfache Integration von aktuellen & abmahnsicheren Rechtstexten in den wpShopGermany-Shop', 'wpsg'); ?></li>
-		<li><?php echo __('Automatische Ãberwachung und Aktualisierung der Rechtstexte', 'wpsg'); ?></li>
-		<li><?php echo __('SelbstverstÃ€ndlich: Anwaltliche Haftung', 'wpsg'); ?></li>
-		<li><?php echo __('Flexibles Vertragsmodell fÃŒr den AGB-Service: Bei Bedarf Jederzeit monatlich kÃŒndbar', 'wpsg'); ?></li>
-	</ul>
-	
-	<br />
+	<p><?php echo __('Die IT-Recht Kanzlei bietet fÃŒr monatlich nur 9,99 Euro abmahnsichere Rechtstexte an - natÃŒrlich inkl. Haftung. Dazu gehÃ¶ren die AGB, die Widerrufsbelehrung, die DatenschutzerklÃ€rung sowie das Impressum. Mit dem wpShopGermany-IT-Recht Kanzlei Plugin (ab Version 1.0) werden die angebotenen Rechtstexte auf Ihre Blog-Seiten mittels Mausklick automatisch ÃŒbernommen und kÃŒnftig auch automatisch aktualisiert - inklusive permanenter AGB-Ãberwachung.', 'wpsg'); ?></p>
 	
 	<p>
-		<a class="button" href="https://www.it-recht-kanzlei.de/Service/wpShopGermany-agb.php?partner_id=150"><?php echo __('Jetzt absichern', 'wpsg'); ?></a>
+	
+		<?php echo __('Jetzt AGB Service buchen', 'wpsg'); ?>:<br />
+		<a href="http://www.it-recht-kanzlei.de/Service/rechtstexte_fuer_onlineshops.php?partner_id=150">http://www.it-recht-kanzlei.de/Service/rechtstexte_fuer_onlineshops.php</a>
+		
+		<br /><br /> 
+
+		<?php echo __('Rechtstexte im gÃŒnstigen Paketpreis finden Sie hier', 'wpsg'); ?>:<br />
+		<a href="http://www.agb-pakete.de/?partner_id=150">http://www.agb-pakete.de</a>
+		
 	</p>
-	 	
+	
 	<?php if (file_exists(WP_PLUGIN_DIR."/wpshopgermany-itrecht/wpshopgermany-itrecht.php")) { ?>
 		<p style="color:red;"><?php echo __('Das Plugin wurde bereits gefunden aber noch nicht aktiviert. Bitte aktivieren sie das Plugin in der <a href="plugins.php">Pluginverwaltung</a>.', 'wpsg'); ?></p>
 	<?php } ?>
- 
+	
 <?php } else { ?>
 	
Index: /views/mods/mod_legaltexts/settings_edit.phtml
===================================================================
--- /views/mods/mod_legaltexts/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_legaltexts/settings_edit.phtml	(revision 5261)
@@ -4,76 +4,40 @@
 	 * Template fÃŒr das Modul "Rechtstexte"
 	 */
-		
+
 ?>
 
-<div class="wpsg_mod_legaltext_select">
-	
-	<label class="bg-info mark <?php echo (($this->view['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_ITRECHT)?'open':''); ?>" title="<?php echo __('Premiumpartner', 'itrecht'); ?>">
-		
-		<input type="radio" <?php echo (($this->view['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_ITRECHT)?'checked="checked"':''); ?> name="wpsg_mod_legaltexts_provider" class="wpsg_mod_legaltexts_provider" value="<?php echo wpsg_mod_legaltexts::PROVIDER_ITRECHT; ?>" />
-		<span class="name"><?php echo __('IT-Recht Kanzlei MÃŒnchen') ?></span>
-		<span class="grow"></span>
-		<span class="text-info glyphicon glyphicon-star-empty" aria-hidden="true"></span>
-				
-	</label>
-	
-	<div class="wpsg_provider_target wpsg_provider_target_<?php echo wpsg_mod_legaltexts::PROVIDER_ITRECHT; ?>"></div>
+<?php echo wpsg_drawForm_Select('wpsg_mod_legaltexts_provider', __('Anbieter', 'wpsg'), array(
+	wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS => __('Protected Shops', 'wpsg'),
+	wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND => __('HÃ€ndlerbund', 'wpsg'),
+	wpsg_mod_legaltexts::PROVIDER_ITRECHT => __('IT-Recht Kanzlei MÃŒnchen', 'wpsg')
+), $this->get_option('wpsg_mod_legaltexts_provider')); ?>
 
-	<label class="<?php echo (($this->view['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS)?'open':''); ?>">
+<br />
 
-		<input type="radio" <?php echo (($this->view['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS)?'checked="checked"':''); ?> name="wpsg_mod_legaltexts_provider" class="wpsg_mod_legaltexts_provider" value="<?php echo wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS; ?>" />
-		<span class="name"><?php echo __('Protected Shops') ?></span>
+<div id="wpsg_provider_target"></div>
 
-	</label>
-
-	<div class="wpsg_provider_target wpsg_provider_target_<?php echo wpsg_mod_legaltexts::PROVIDER_PROTECTEDSHOPS; ?>"></div>
-
-	<label class="<?php echo (($this->view['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND)?'open':''); ?>">
-
-		<input type="radio" <?php echo (($this->view['wpsg_mod_legaltexts_provider'] == wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND)?'checked="checked"':''); ?> name="wpsg_mod_legaltexts_provider" class="wpsg_mod_legaltexts_provider" value="<?php echo wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND; ?>" />
-		<span class="name"><?php echo __('HÃ€ndlerbund') ?></span>
-
-	</label>
-
-	<div class="wpsg_provider_target wpsg_provider_target_<?php echo wpsg_mod_legaltexts::PROVIDER_HAENDLERBUND; ?>"></div>
-	
-</div> 
- 
-<script>
+<script type="text/javascript">/* <![CDATA[ */
 
 	jQuery(document).ready(function() {
 
-		jQuery('.wpsg_mod_legaltexts_provider').bind('change', function() {
+		jQuery('#wpsg_mod_legaltexts_provider').bind('change', function() {
 
-			if (parseInt(jQuery('input[name=wpsg_mod_legaltexts_provider]:checked').val()) > 0) {
+			jQuery('#wpsg_provider_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+			
+			jQuery.ajax( {
+				url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_legaltexts&noheader=1&do=add',
+				data: {
+					'provider': jQuery('#wpsg_mod_legaltexts_provider').val()
+				},
+				success: function(data) {
 
-				jQuery('.wpsg_mod_legaltext_select > label').removeClass('open');
-				jQuery('.wpsg_provider_target').slideUp(125);
-				
-				var target = '.wpsg_provider_target_' + jQuery('input[name=wpsg_mod_legaltexts_provider]:checked').val();
-				
-				jQuery(target).html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_legaltexts&noheader=1&do=add',
-					data: {
-						'provider': jQuery('input[name=wpsg_mod_legaltexts_provider]:checked').val()
-					},
-					success: function(data) {
-	
-						jQuery(target).prev().addClass('open');
-						jQuery(target).html(data);
-						jQuery(target).slideDown(125);
-						
-					}
-				} );
-				
-			}
+					jQuery('#wpsg_provider_target').html(data);
+					
+				}
+			} );
 			
-		} );
-		
-		document.querySelector('.wpsg_mod_legaltexts_provider:checked').dispatchEvent(new Event('change'));
+		} ).change();
 		
 	} );
 
-</script>
+/* ]]> */</script>
Index: /views/mods/mod_micropayment/debugInfo.phtml
===================================================================
--- /views/mods/mod_micropayment/debugInfo.phtml	(revision 5261)
+++ /views/mods/mod_micropayment/debugInfo.phtml	(revision 5261)
@@ -0,0 +1,33 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Ausgabe von Debug Informationen des Micropayment Moduls
+	 */
+
+?>
+<h1>Modul "Micropayment"</h1>
+<pre class="wpsg_debug">
+Billing URL (cc): <?php echo ((array_key_exists('wpsg_mod_micropayment', $this->arModule))?$this->arModule['wpsg_mod_micropayment']->event_creditcard_url:''); ?> 
+Billing URL (dbt): <?php echo ((array_key_exists('wpsg_mod_micropayment', $this->arModule))?$this->arModule['wpsg_mod_micropayment']->event_directdebit_url:''); ?> 
+Billing URL (eb2p): <?php echo ((array_key_exists('wpsg_mod_micropayment', $this->arModule))?$this->arModule['wpsg_mod_micropayment']->event_ebank2pay_url:''); ?> 
+Billing URL (pp): <?php echo ((array_key_exists('wpsg_mod_micropayment', $this->arModule))?$this->arModule['wpsg_mod_micropayment']->event_prepayment_url:''); ?> 
+Billing URL (c2p): <?php echo ((array_key_exists('wpsg_mod_micropayment', $this->arModule))?$this->arModule['wpsg_mod_micropayment']->event_call2pay_url:''); ?> 
+Billing URL (hp): <?php echo ((array_key_exists('wpsg_mod_micropayment', $this->arModule))?$this->arModule['wpsg_mod_micropayment']->event_handypay_url:''); ?> 
+(Infoservice) Account-ID: <?php echo substr($this->get_option('wpsg_mod_micropayment_projectid'), 0, 1).'('.strlen($this->get_option('wpsg_mod_micropayment_handypay_activ')).')'; ?> 
+Accesskey LÃ€nge: <?php echo strlen($this->get_option('wpsg_mod_micropayment_accesskey')); ?> 
+Version: <?php echo WPSG_VERSION; ?> 
+Aktivierte Bezahlmodule: <?php 
+	
+	$arPayment = array();
+	if ($this->get_option('wpsg_mod_micropayment_creditcard_activ') == '1') $arPayment[] = 'cc';
+	if ($this->get_option('wpsg_mod_micropayment_directdebit_activ') == '1') $arPayment[] = 'dbt';
+	if ($this->get_option('wpsg_mod_micropayment_ebank2pay_activ') == '1') $arPayment[] = 'eb2p';
+	if ($this->get_option('wpsg_mod_micropayment_prepayment_activ') == '1') $arPayment[] = 'pp';
+	if ($this->get_option('wpsg_mod_micropayment_call2pay_name') == '1') $arPayment[] = 'c2p';
+	if ($this->get_option('wpsg_mod_micropayment_handypay_activ') == '1') $arPayment[] = 'hp';
+
+	if (wpsg_isSizedArray($arPayment)) echo implode(',', $arPayment);
+	else echo 'Keine';
+	
+?> 
+</pre>
Index: /views/mods/mod_micropayment/order_done.phtml
===================================================================
--- /views/mods/mod_micropayment/order_done.phtml	(revision 5261)
+++ /views/mods/mod_micropayment/order_done.phtml	(revision 5261)
@@ -0,0 +1,122 @@
+<?php
+
+	/**
+	 * Template welches den Zahlungsdienstleister nach BestellabschluÃ einbindet
+	 */
+
+?>
+<?php if (wpsg_isSizedString($this->view['wpsg_mod_micropayment']['payLink'])) { ?>
+<?php echo __('Klicken Sie auf das folgende Logo um ihre Bestellung zu bezahlen.', 'wpsg'); ?>
+<br /><br />
+
+<a href="<?php echo $this->view['wpsg_mod_micropayment']['payLink']; ?>"><img src="<?php echo $this->view['wpsg_mod_micropayment']['logo']; ?>" alt="<?php echo $this->view['wpsg_mod_micropayment']['title']; ?>" /></a>
+
+	<?php if ($this->get_option('wpsg_mod_micropayment_paystart') == '1') { ?>
+	<script type="text/javascript">
+	 
+		jQuery(document).ready(function() { 
+			window.setTimeout(function() {
+	    	location.href = "<?php echo $this->view['wpsg_mod_micropayment']['payLink']; ?>";
+			}, 1000);
+		} );
+		
+	</script>
+	<?php } ?>
+
+<?php } else { ?>
+
+<p><?php echo __('Bitte geben Sie ihre Kreditkarteninformationen (Kartennummer, GÃŒltigkeitsdatum und PrÃŒfnummer) in folgende Felder ein. Die Daten werden an Micropayment ÃŒbermittelt und nicht durch uns gespeichert oder ausgewertet.', 'wpsg'); ?></p>
+
+<form method="post" id="wpsg_mod_micropayment_creditcard">
+
+	<div class="micropayment_card">
+		<div class="front card">
+			<div class="chip"></div>
+			<div class="number"><input placeholder="<?php echo __('Kreditkartennummer', 'wpsg'); ?>" type="text" name="number" /></div>
+			<div class="bankname"><?php echo __('Kreditkarte - Vorderseite', 'wpsg'); ?></div>
+			<div class="name"><?php echo __('Max Mustermann', 'wpsg'); ?></div>
+			<div class="validthrough"><?php echo __('GÃŒltig bis', 'wpsg'); ?>:</div>
+			<div class="valid">
+				<select name="expiryMonth">
+					<?php for ($i = 1; $i <= 12; $i ++) { ?>
+					<option value="<?php echo $i; ?>"><?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>
+					<?php } ?>		
+				</select>
+				<span>/</span>
+				<select name="expiryYear">
+					<?php for ($i = date('Y'); $i <= date('Y') + 10; $i ++) { ?>
+					<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
+					<?php } ?>
+				</select>						
+			</div>			
+		</div>	
+		
+		<div class="back card">
+			<div class="bankname"><?php echo __('Kreditkarte - RÃŒckseite', 'wpsg'); ?></div>
+			<div class="blackmagnetic"></div>
+			<div class="number"><?php echo __('HC600214C', 'wpsg'); ?></div>
+			<div class="signature"><?php echo __('Unterschrift Max Mustermann', 'wpsg'); ?></div>
+			<div class="sign"><input type="text" name="cvc2" value="" placeholder="<?php echo __('PrÃŒfnummer', 'wpsg'); ?>" /></div>
+		</div>
+		
+		<input type="button" id="wpsg_mod_micropayment_pay_button" class="wpsg_button" value="<?php echo __('Zahlung starten', 'wpsg'); ?>" />
+		
+	</div>
+
+</form>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+
+		jQuery('#wpsg_mod_micropayment_pay_button').bind('click', function() {
+			
+			var form_data = jQuery('#wpsg_mod_micropayment_creditcard').serialize();
+			
+			jQuery('.micropayment_card input, .micropayment_card select').prop('disabled', true);
+			
+			jQuery.ajax( {
+				url: wpsg_ajax.ajaxurl,
+				data: {
+					action: 'ajax',
+					wpsg_plugin: 'wpsg_mod_micropayment',
+					module_action: 'pay', 
+					form_data: form_data,
+					order_id: <?php echo $this->view['o_id']; ?>
+				},
+				success: function(data) {
+
+					if (data === "1")
+					{
+
+						alert('<?php echo __('Vielen Dank fÃŒr Ihre Zahlungsreservierung.', 'wpsg'); ?>');
+						location.href = '<?php echo get_permalink($this->get_option('wpsg_mod_micropayment_successPage')); ?>';
+						
+					}
+					else
+					{
+
+						alert(data);
+
+					}
+
+					jQuery('.micropayment_card input, .micropayment_card select').prop('disabled', false);
+						
+				},
+				error: function(rdata, data)
+				{
+					
+					alert("<?php echo __('Unerwarteter Serverfehler!', 'wpsg'); ?>");
+					
+				}
+			} );
+			
+			return false;
+			
+		} );
+		
+	} );
+
+/* ]]> */</script>
+
+<?php } ?>
Index: /views/mods/mod_micropayment/settings_edit.phtml
===================================================================
--- /views/mods/mod_micropayment/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_micropayment/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,213 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungen fÃŒr das Micropayment Modul
+	 */
+
+?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_accountid', __('Account ID', 'wpsg'), $this->get_option('wpsg_mod_micropayment_accountid')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_projectid', __('Projekt ID', 'wpsg'), $this->get_option('wpsg_mod_micropayment_projectid'), array('help' => 'wpsg_mod_micropayment_projectid')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_accesskey', __('AccessKey', 'wpsg'), $this->get_option('wpsg_mod_micropayment_accesskey'), array('help' => 'wpsg_mod_micropayment_accesskey')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_successPage', __('Seite nach erfolgreicher Zahlung', 'wpsg'), $this->view['wpsg_mod_micropayment']['arPages'], $this->get_option('wpsg_mod_micropayment_successPage')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_paystart', __('Zahlungs sofort starten', 'wpsg'), $this->get_option('wpsg_mod_micropayment_paystart')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_apiURL', __('API URL', 'wpsg'), $this->view['wpsg_mod_micropayment']['apiURL'], array('readonly' => true, 'hint' => __('Muss im micropaymentâ¢ Interface hinterlegt werden.', 'wpsg'), 'help' => 'wpsg_mod_micropayment_apiURL')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_sandbox', __('Sandbox', 'wpsg'), $this->get_option('wpsg_mod_micropayment_sandbox')); ?>
+<br />
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_account', __('Account (FÃŒr Webmasterbewerbung)', 'wpsg'), $this->get_option('wpsg_mod_micropayment_account'), array('help' => 'wpsg_mod_micropayment_account')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_layout', __('Layout', 'wpsg'), $this->get_option('wpsg_mod_micropayment_layout'), array('help' => 'wpsg_mod_micropayment_layout')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_bgcolor', __('Hintergrundfarbe', 'wpsg'), $this->get_option('wpsg_mod_micropayment_bgcolor'), array('help' => 'wpsg_mod_micropayment_bgcolor')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_campaign', __('Kampagne des Projektinhabers', 'wpsg'), $this->get_option('wpsg_mod_micropayment_campaign'), array('help' => 'wpsg_mod_micropayment_campaign')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_bggfx', __('Hintergrundgrafik fÃŒr Zahlfenster', 'wpsg'), $this->get_option('wpsg_mod_micropayment_bggfx')); ?>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_creditcard">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('CreditCard - Abrechnung per Creditkarte', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_creditcard_activ', __('Zahlungsart "Kreditkarte" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcard_activ'), array(
+				/* 'hint' => wpsg_translate(__('FÃŒr AbrechnungsbetrÃ€ge zwischen #1# und #2#', 'wpsg'), wpsg_ff(2.50, $this->get_option('wpsg_currency')), wpsg_ff(500, $this->get_option('wpsg_currency'))) */
+			)); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_creditcard_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcard_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_creditcard_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcard_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_creditcard_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcard_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_creditcard_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_creditcard_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_creditcard_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_creditcard_mwst')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_creditcard_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcard_mwstland')); ?>			
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_creditcardreservation">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('CreditCard - Abrechnung per Creditkarte (Reservierung)', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_creditcardreservation_activ', __('Zahlungsart "Kreditkarte mit Reservierung" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcardreservation_activ'), array(
+				/* 'hint' => wpsg_translate(__('FÃŒr AbrechnungsbetrÃ€ge zwischen #1# und #2#', 'wpsg'), wpsg_ff(2.50, $this->get_option('wpsg_currency')), wpsg_ff(500, $this->get_option('wpsg_currency'))) */
+			)); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_creditcardreservation_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcardreservation_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_creditcardreservation_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcardreservation_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_creditcardreservation_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcardreservation_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_creditcardreservation_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_creditcardreservation_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_creditcardreservation_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_creditcardreservation_mwst')); ?>			
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_creditcardreservation_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_creditcardreservation_mwstland')); ?>			
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_directdebit">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('Lastschrift - Abrechnung per Lastschrift', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_directdebit_activ', __('Zahlungsart "Lastschrift" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_directdebit_activ')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_directdebit_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_directdebit_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_directdebit_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_directdebit_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_directdebit_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_directdebit_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_directdebit_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_directdebit_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_directdebit_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_directdebit_mwst')); ?>			
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_directdebit_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_directdebit_mwstland')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_directdebit_subject', __('Betreff der Zahlung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_directdebit_subject')); ?>			
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_ebank2pay">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('eBank2Pay - Abrechnung per Online Banking', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_ebank2pay_activ', __('Zahlungsart "eBank2Pay" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_ebank2pay_activ'), array(
+				/* 'hint' => wpsg_translate(__('FÃŒr AbrechnungsbetrÃ€ge zwischen #1# und #2#', 'wpsg'), wpsg_ff(0.50, $this->get_option('wpsg_currency')), wpsg_ff(500, $this->get_option('wpsg_currency'))) */ 
+			)); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_ebank2pay_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_ebank2pay_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_ebank2pay_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_ebank2pay_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_ebank2pay_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_ebank2pay_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_ebank2pay_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_ebank2pay_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_ebank2pay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_ebank2pay_mwst')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_ebank2pay_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_ebank2pay_mwstland')); ?>						
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_prepayment">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('Vorkasse - Abrechnung per Vorkasse', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_prepayment_activ', __('Zahlungsart "Vorkasse" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_prepayment_activ')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_prepayment_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_prepayment_name')); ?>
+			<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_prepayment_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_prepayment_hint')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_prepayment_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_prepayment_logo')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_prepayment_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_prepayment_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_prepayment_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_prepayment_mwst')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_prepayment_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_prepayment_mwstland')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_prepayment_subject', __('Betreff der Zahlung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_prepayment_subject')); ?>			
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_call2pay">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('Call2Pay - Abrechnung per Anruf / Telefon', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+			
+			<div id="wpsg_mod_micropayment_call2pay_layer" style="<?php echo (($this->get_option('wpsg_mod_micropayment_call2pay_activ') == '1')?'display:block;':'display:none;'); ?>">
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_call2pay_activ', __('Zahlungsart "Call2Pay" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_call2pay_activ'), array(
+					/* 'hint' => wpsg_translate(__('FÃŒr AbrechnungsbetrÃ€ge zwischen #1# und #2#', 'wpsg'), wpsg_ff(0.05, $this->get_option('wpsg_currency')), wpsg_ff(50, $this->get_option('wpsg_currency'))) */
+				)); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_call2pay_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_call2pay_name')); ?>
+				<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_call2pay_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_call2pay_hint')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_call2pay_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_call2pay_logo')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_call2pay_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_call2pay_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+				<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_call2pay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_call2pay_mwst')); ?>
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_call2pay_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_call2pay_mwstland')); ?>
+			</div>
+			
+			<?php if ($this->get_option('wpsg_mod_micropayment_call2pay_activ') != '1') { ?>
+			<div id="wpsg_mod_micropayment_call2pay_infolayer">
+				<span style="color:red; font-weigh:bold;"><?php echo __('Bitte beachten Sie, dass es bei der Nutzung von Call2Pay folgende EinschrÃ€nkungen gibt', 'wpsg'); ?>:</span><br />
+				<ul>
+					<li><?php echo __('Nur Abrechnung von telekommunikationsbasierten Mehrwertdiensten mÃ¶glich', 'wpsg'); ?></li>
+					<li><?php echo __('Preisobergrenze von 30 Euro pro Transaktion', 'wpsg'); ?></li>
+					<li><?php echo __('National und international KEINE einheitliche GebÃŒhrenstruktur', 'wpsg'); ?></li>
+					<li><?php echo __('Teilweise abweichende Preise aus dem Mobilfunknetz', 'wpsg'); ?></li>					
+				</ul>
+				<br />
+				<span style="font-weight:bold;"><?php echo __('Sollten Sie sich unsicher sein, ob Sie diese Zahlarten nutzen kÃ¶nnen oder dÃŒrfen, melden Sie sich einfach bei uns!', 'wpsg'); ?></span>
+				<ul>
+					<li><?php echo __('Ansprechpartner', 'wpsg'); ?>: Martin Eliason</li>
+					<li><?php echo __('Telefon (Festnetz)', 'wpsg'); ?>: +49 â (0)30 â 64904255</li>
+					<li><?php echo __('eMail', 'wpsg'); ?>: <a href="mailto:meliason@micropayment.de">meliason@micropayment.de</a></li>
+					<li><?php echo __('Stichwort', 'wpsg'); ?>: WordPress-Shopmodul</li>
+				</ul>
+				<br />
+				<input type="button" class="button" onclick="jQuery('#wpsg_mod_micropayment_call2pay_infolayer').hide(); jQuery('#wpsg_mod_micropayment_call2pay_layer').show();" value="<?php echo __('Ich habe einen entsprechenden Account und kann die Zahlungsart nutzen.', 'wpsg'); ?>" />
+			</div>
+			<?php } ?>			
+												
+		</div>
+	</div>
+</div>
+<br />
+<div class="wpsg_admin_box" id="wpsg_mod_micropayment_handypay">
+	<div id="mail_global" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab"><?php echo __('HandyPay - Abrechnung per SMS / Tan', 'wpsg'); ?></div>
+		</div>
+		<div class="content wpsg_admin_box_content" style="display: block;">
+		
+			<div id="wpsg_mod_micropayment_handypay_layer" style="<?php echo (($this->get_option('wpsg_mod_micropayment_handypay_activ') == '1')?'display:block;':'display:none;'); ?>">
+		
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_handypay_activ', __('Zahlungsart "Call2Pay" aktiv', 'wpsg'), $this->get_option('wpsg_mod_micropayment_handypay_activ'), array(
+					/* 'hint' => wpsg_translate(__('FÃŒr AbrechnungsbetrÃ€ge zwischen #1# und #2#', 'wpsg'), wpsg_ff(0.50, $this->get_option('wpsg_currency')), wpsg_ff(5.00, $this->get_option('wpsg_currency'))) */
+				)); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_handypay_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_micropayment_handypay_name')); ?>
+				<?php echo wpsg_drawForm_Textarea('wpsg_mod_micropayment_handypay_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_micropayment_handypay_hint')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_handypay_logo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_micropayment_handypay_logo')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_micropayment_handypay_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_micropayment_handypay_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+				<?php echo wpsg_drawForm_Select('wpsg_mod_micropayment_handypay_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_micropayment_handypay_mwst')); ?>
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_micropayment_handypay_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_micropayment_handypay_mwstland')); ?>						
+			</div>
+		
+			<?php if ($this->get_option('wpsg_mod_micropayment_handypay_activ') != '1') { ?>
+			<div id="wpsg_mod_micropayment_handypay_infolayer">
+				<span style="color:red; font-weigh:bold;"><?php echo __('Bitte beachten Sie, dass es bei der Nutzung von HandyPay folgende EinschrÃ€nkungen gibt', 'wpsg'); ?>:</span><br />
+				<ul>
+					<li><?php echo __('Nur Abrechnung von telekommunikationsbasierten Mehrwertdiensten mÃ¶glich', 'wpsg'); ?></li>
+					<li><?php echo __('Preise nicht frei tarifierbar, nur vorgegebene Tarifstruktur nutzbar', 'wpsg'); ?></li>
+					<li><?php echo __('National und international KEINE einheitliche GebÃŒhrenstruktur', 'wpsg'); ?></li>					
+				</ul>
+				<br />
+				<span style="font-weight:bold;"><?php echo __('Sollten Sie sich unsicher sein, ob Sie diese Zahlarten nutzen kÃ¶nnen oder dÃŒrfen, melden Sie sich einfach bei uns!', 'wpsg'); ?></span>
+				<ul>
+					<li><?php echo __('Ansprechpartner', 'wpsg'); ?>: Martin Eliason</li>
+					<li><?php echo __('Telefon (Festnetz)', 'wpsg'); ?>: +49 â (0)30 â 64904255</li>
+					<li><?php echo __('eMail', 'wpsg'); ?>: <a href="mailto:meliason@micropayment.de">meliason@micropayment.de</a></li>
+					<li><?php echo __('Stichwort', 'wpsg'); ?>: WordPress-Shopmodul</li>
+				</ul>
+				<br />
+				<input type="button" class="button" onclick="jQuery('#wpsg_mod_micropayment_handypay_infolayer').hide(); jQuery('#wpsg_mod_micropayment_handypay_layer').show();" value="<?php echo __('Ich habe einen entsprechenden Account und kann die Zahlungsart nutzen.', 'wpsg'); ?>" />
+			</div>
+			<?php } ?>
+			
+		</div>		
+	</div>
+</div>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+
+		jQuery('.wpsg_admin_box').wpsg_adminbox();
+		
+	} );
+
+/* ]]> */</script>
Index: ews/mods/mod_minquantity/produkt_addedit_allgemein.phtml
===================================================================
--- /views/mods/mod_minquantity/produkt_addedit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,30 +1,0 @@
-<?php
-
-	/**
-	 * Integration des Moduls "Mindestbestellmenge" in die Produktverwaltung
-	 */
-
-?>
-
-<div id="wpsg_minquantity" class="panel panel-default"> 
-	
-	<div class="panel-heading clearfix">
-	
-		<h3 class="panel-title">
-			<span><?php echo __('Mindestbestellmenge', 'wpsg'); ?></span>
-		</h3>
-		
-	</div>
-	
-	<div class="panel-body">	
-		
-		<?php echo wpsg_drawForm_Input('wpsg_mod_minquantity[value]', __('Mindestbestellmenge', 'wpsg'), $this->view['wpsg_mod_minquantity']['value']); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_minquantity[valuemax]', __('Maximalbestellmenge', 'wpsg'), $this->view['wpsg_mod_minquantity']['valuemax']); ?>
-
-		<br /><br />
-		
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_minquantity"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Mindestbestellmenge', 'wpsg'); ?></a>
-	
-	</div>
-				 
-</div>
Index: /views/mods/mod_minquantity/produkt_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_minquantity/produkt_edit_allgemein.phtml	(revision 8528)
+++ /views/mods/mod_minquantity/produkt_edit_allgemein.phtml	(revision 5261)
@@ -6,5 +6,4 @@
 
 ?>
-	
 <?php echo wpsg_drawForm_Input('wpsg_mod_minquantity[value]', __('Mindestbestellmenge', 'wpsg'), $this->view['wpsg_mod_minquantity']['value']); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_minquantity[valuemax]', __('Maximalbestellmenge', 'wpsg'), $this->view['wpsg_mod_minquantity']['valuemax']); ?>
Index: ews/mods/mod_minrequest/produkt_addedit_allgemein.phtml
===================================================================
--- /views/mods/mod_minrequest/produkt_addedit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,41 +1,0 @@
-<?php
-
-	/**
- * Integration des Moduls "Mindestbestellwert" in die Produktverwaltung
- */
-
-?>
-
-<div id="wpsg_minrequest" class="panel panel-default"> 
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<span><?php echo __('Mindestbestellwert', 'wpsg'); ?></span>
-		</h3>
-	</div>
-	<div class="panel-body">	
-	
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_minrequest[product_activ]', __('Bestellwertgrenzen fÃŒr dieses Produkt aktivieren', 'wpsg'), $this->view['wpsg_mod_minrequest']['product_activ']); ?>
-	
-		<div class="wpsg_mod_minrequest_product_activ wpsg_mod_minrequest_product_activ_1">
-			
-			<?php echo wpsg_drawForm_Input('wpsg_mod_minrequest[value]', __('Mindestbestellwert', 'wpsg'), $this->view['wpsg_mod_minrequest']['value']); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_minrequest[valuemax]', __('Maximalbestellwert', 'wpsg'), $this->view['wpsg_mod_minrequest']['valuemax']); ?>
-			
-		</div>
-		
-		<script>
-			
-			jQuery('#wpsg_mod_minrequestproduct_activ').on('change', function() {
-				
-				if (jQuery(this).prop('checked')) jQuery('.wpsg_mod_minrequest_product_activ_1').show();
-				else jQuery('.wpsg_mod_minrequest_product_activ_1').hide();
-				
-			}).change();
-			
-		</script>
-	
-		<br /><br />
-		
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_minrequest"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Mindestbestellwerte', 'wpsg'); ?></a>			 
-	</div>
-</div>
Index: ews/mods/mod_minrequest/produkt_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_minrequest/produkt_edit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,9 +1,0 @@
-<?php
-
-/**
- * Integration des Moduls "Mindestbestellwert" in die Produktverwaltung
- */
-
-?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_minrequest[value]', __('Mindestbestellwert', 'wpsg'), $this->view['wpsg_mod_minrequest']['value']); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_minrequest[valuemax]', __('Maximalbestellwert', 'wpsg'), $this->view['wpsg_mod_minrequest']['valuemax']); ?>
Index: /views/mods/mod_minrequest/settings_edit.phtml
===================================================================
--- /views/mods/mod_minrequest/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_minrequest/settings_edit.phtml	(revision 5261)
@@ -8,9 +8,4 @@
 ?>
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_minrequest_productamount', __('Minimaler Produktwert aktivieren', 'wpsg'), $this->get_option('wpsg_mod_minrequest_productamount'), array('help' => 'wpsg_mod_minrequest_productamount')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_minrequest_productamount_max', __('Maximaler Produktwert aktivieren', 'wpsg'), $this->get_option('wpsg_mod_minrequest_productamount_max'), array('help' => 'wpsg_mod_minrequest_productamount_max')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Input('wpsg_mod_minrequest_basketamount', __('Minimaler Warenkorbwert', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_minrequest_basketamount')), array('hint' => __('Gilt fÃŒr den Brutto Produktpreis. (Ohne Versand- und Zahlungskosten)', 'wpsg'), 'help' => 'wpsg_mod_minrequest_basketamount', 'unit' => $this->get_option('wpsg_currency'))); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_minrequest_basketmaxamount', __('Maximaler Warenkorbwert', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_minrequest_basketmaxamount')), array('hint' => __('Gilt fÃŒr den Brutto Produktpreis. (Ohne Versand- und Zahlungskosten)', 'wpsg'), 'help' => 'wpsg_mod_minrequest_basketmaxamount', 'unit' => $this->get_option('wpsg_currency'))); ?>
Index: /views/mods/mod_newsletter/checkout_customer_inner.phtml
===================================================================
--- /views/mods/mod_newsletter/checkout_customer_inner.phtml	(revision 8528)
+++ /views/mods/mod_newsletter/checkout_customer_inner.phtml	(revision 5261)
@@ -9,5 +9,5 @@
 <div class="wpsg_checkoutblock">
 	<label for="wpsg_mod_newsletter">
-		<input class="wpsg_checkout" type="checkbox" id="wpsg_mod_newsletter" name="wpsg[checkout][wpsg_mod_newsletter]" value="1" <?php echo (($this->view['basket']['checkout']['wpsg_mod_newsletter'] == '1')?'checked="checked"':''); ?> /><?php echo __("Melden Sie sich hier fÃŒr unseren Newsletter an.", "wpsg"); ?>						
+		<input class="wpsg_checkout" type="checkbox" id="wpsg_mod_newsletter" name="wpsg[checkout][wpsg_mod_newsletter]" value="1" <?php echo (($this->view['basket']['checkout']['wpsg_mod_newsletter'] == '1')?'checked="checked"':''); ?> /><?php echo __("FÃŒr Newsletter anmelden.", "wpsg"); ?>						
 	</label>
 </div>
Index: /views/mods/mod_newsletter/settings_edit.phtml
===================================================================
--- /views/mods/mod_newsletter/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_newsletter/settings_edit.phtml	(revision 5261)
@@ -13,18 +13,15 @@
 	<?php echo wpsg_drawForm_Select('wpsg_mod_newsletter_action', __('Aktion', 'wpsg'), array('0' => __('Opt-In Mail versenden', 'wpsg'), '1' => __('Direkt anmelden', 'wpsg')), $this->get_option('wpsg_mod_newsletter_action'), array('help' => 'wpsg_mod_newsletter_action')); ?>
 	
-	<div class="form-group form-group-sm form-select has-feedback">
-
-		<label class="col-sm-6 control-label" for="wpsg_mod_newsletter_imoprtgroups"><?php echo __('Gruppenimport aus wpShopGermany Kunden', 'wpsg'); ?></label>
-
-		<div class="col-sm-6">
-			<div class="wpsg_field_wrap">
-				<select class="form-control input-sm" size="<?php echo ((sizeof($this->view['arGroup']) > 5)?5:sizeof($this->view['arGroup'])); ?>" multiple="multiple" name="wpsg_mod_newsletter_imoprtgroups[]" id="wpsg_mod_newsletter_imoprtgroups">
-					<?php foreach ($this->view['arGroup'] as $group_id => $group) {?>
-					<option value="<?php echo $group_id; ?>"><?php echo $group; ?></option>
-					<?php } ?>
-				</select>
-				<a class="glyphicon glyphicon glyphicon-question-sign form-control-feedback activated" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_newsletter_imoprtgroups" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_newsletter_imoprtgroups"></a>						
-			</div>
-			<input style="margin: 5px 0 0 0;" type="button" onclick="return wpsg_doImport();" value="<?php echo __('Kunden importieren', 'wpsg'); ?>" class="button" style="width:auto;" />
+	<div class="wpsg_form_field">
+		<div class="wpsg_form_left">
+			<label for="wpsg_mod_newsletter_imoprtgroups"><?php echo __('Gruppenimport aus wpShopGermany Kunden', 'wpsg'); ?>:</label>
+		</div>
+		<div class="wpsg_form_right">
+			<select class="select " size="<?php echo ((sizeof($this->view['arGroup']) > 5)?5:sizeof($this->view['arGroup'])); ?>" multiple="multiple" name="wpsg_mod_newsletter_imoprtgroups[]" id="wpsg_mod_newsletter_imoprtgroups">
+				<?php foreach ($this->view['arGroup'] as $group_id => $group) {Â ?>
+				<option value="<?php echo $group_id; ?>"><?php echo $group; ?></option>
+				<?php } ?>
+			</select>
+			<input type="button" onclick="return wpsg_doImport();" value="<?php echo __('Kunden importieren', 'wpsg'); ?>" class="button" style="width:auto;" />
 		</div>
 		<div class="wpsg_clear"></div>
Index: ews/mods/mod_nlsatolo/settings_edit.phtml
===================================================================
--- /views/mods/mod_nlsatolo/settings_edit.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-
-/**
- * Template fÃŒr die Einstellungen des Satollo Newsletter Moduls
- */
-
-?>
-<?php if ($this->view['plugin_active'] !== true) { ?>
-
-    <div class="wpsg_error"><br /><?php echo __('Das Modul ist nur mit aktiviertem Satollo Newsletter Plugin funktionsfaehig.', 'wpsg'); ?><br /></div>
-
-<?php } else { ?>
-
-    <?php echo wpsg_drawForm_Select('wpsg_mod_nlsatolo_doubleoptin', __('Double Opt-In', 'wpsg'), array('0' => __('Nein', 'wpsg'), '1' => __('Ja', 'wpsg')), $this->get_option('wpsg_mod_nlsatolo_doubleoptin'), array('help' => 'wpsg_mod_nlsatolo_doubleoptin')); ?>
-
-    <?php /* Listen werden im Satolo-Newsletter-Plugin unter Subscribers > Listen erstellen > Listen angelegt*/ ?>
-    <?php echo wpsg_drawForm_Select('wpsg_mod_nlsatolo_group', __('Gruppezuordnung nach Registrierung', 'wpsg'), $this->view['arLists'], $this->get_option('wpsg_mod_nlsatolo_group'), array('help' => 'wpsg_mod_nlsatolo_group')); ?>
-
-<?php } ?>
Index: /views/mods/mod_onepagecheckout/onepage.phtml
===================================================================
--- /views/mods/mod_onepagecheckout/onepage.phtml	(revision 8528)
+++ /views/mods/mod_onepagecheckout/onepage.phtml	(revision 5261)
@@ -4,67 +4,16 @@
 	 * Template fÃŒr den Bestellablauf auf einer Seite
 	 */
- 
+
 ?>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
-
-		<?php if ($this->get_option('wpsg_form_validation') == '1') { ?>
-		
-		if (typeof jQuery.validationEngine == "object")
-		{
-
-			jQuery("#form-step2").validationEngine('attach', {promptPosition : "bottomLeft", scroll: false});
-				
-			jQuery('.wpsg_mod_kundenverwaltung_login').bind('click', function(){
-				jQuery("#form-step2").validationEngine('detach');						
-			});
-
-		}
-		
-		<?php } else if ($this->get_option('wpsg_form_validation') == '2') { ?>
-
-		jQuery.validator.addMethod("cRequired", jQuery.validator.methods.required, "<?php echo __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'); ?>");
-		jQuery.validator.addClassRules('validate[required]', { cRequired: true } );
-		jQuery("#form-step2").validate( { 
-			ignore: '',
-			errorClass: 'wpsg_error',
-			onsubmit: false,
-			showErrors: function(errorMap, errorList) {
-
-				this.defaultShowErrors();	
-
-			}
-		} ); 
-
-		jQuery('#wpsg_checkout2button').bind('click', function() { 
-
-			var bReturn = jQuery('#form-step2').validate().form();
-			if (jQuery('#form-step2 input.wpsg_error').length > 0) jQuery('#form-step2 input.wpsg_error')[0].focus();
-			return bReturn;
-			  
-		} );
-		
-		<?php } ?>
-		
-	} );
-		
-/* ]]> */</script>
-
 <div class="wpsg wpsg_onepagecheckout wpsg_checkout wpsg_checkout2 <?php echo ((isset($_REQUEST['wpsg_basket_ajax']))?'wpsg_basket_ajax':''); ?>">
 
 	<?php echo $this->writeFrontendMessage(); ?>
 	 
-	<?php if ($this->get_option('wpsg_mod_onepagecheckout_basket') == 0) { ?>
-		<?php $GLOBALS['step'] = 2; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
-	<?php } ?> 
 	<form id="wpsg_basket_form" name="wpsg_basket_form"  method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>" enctype="multipart/form-data">
-		
-		<?php if ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1) { ?>
-			<?php $this->view['noFormTag'] = true; $this->render(WPSG_PATH_VIEW.'/warenkorb/basket.phtml'); ?>
-		<?php } ?> 
 				    
 		<div class="wpsg_clear"></div>
+		 
+		<?php /* Einbindung des Logins im Checokut */ ?>	
+		<?php $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?>
 		 
 		 <div class="wpsg_box" id="wpsg_box_payship">
@@ -72,5 +21,4 @@
 		 	<div class="wpsg_inner">
 		 	
-		 		<?php if ($this->get_option('wpsg_mod_onepagecheckout_basket') == 0) { ?>
 		 		<div class="wpsg_shipping">
 		 		
@@ -104,10 +52,8 @@
 		 			
 				</div>
-				<?php } ?>
 				
 				<?php if ($this->callMods('checkout_handlePayment') === true) { ?>
 				
 					<?php if (!$this->hasMod('wpsg_mod_crefopay')) { ?>
-					<?php if ($this->get_option('wpsg_mod_onepagecheckout_basket') == 0) { ?>
 					<div class="wpsg_payment">
 					
@@ -126,8 +72,8 @@
 							<?php } ?>
 							 
-		 					<?php if ((isset($p['hint']) && trim($p['hint']) != '') || $p['preis'] > 0) { ?>					
+		 					<?php if ((isset($p['hint']) && trim($p['hint']) != '') || $p['price'] > 0) { ?>					
 							<div id="payment_<?php echo $p['id']; ?>_hint" class="shippay_hint">
-								<?php if ($p['preis'] > 0) { ?>
-								<?php echo __('GebÃŒhr', 'wpsg'); ?>: <?php echo wpsg_ff($p['preis'], $this->get_option('wpsg_currency')); ?><br />
+								<?php if ($p['price'] > 0) { ?>
+								<?php echo __('GebÃŒhr', 'wpsg'); ?>: <?php echo wpsg_ff($p['price'], $this->get_option('wpsg_currency')); ?><br />
 								<?php } ?>
 								<?php echo $this->replaceUniversalPlatzhalter(__($p['hint'], 'wpsg')); ?>
@@ -139,8 +85,7 @@
 		 				</div>
 		 				<?php } ?>
-		 				</div>
+		 			</div>
 					
 					</div>
-					<?php } ?>
 					<?php } ?>
 					
@@ -153,258 +98,172 @@
 		 </div>
 		 
-		<h2><?php echo __('Kundendaten', 'wpsg'); ?></h2>
-		
-		<?php if ($this->hasMod('wpsg_mod_kundenverwaltung') && $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutLogin') == '1') { ?>
-			<div class="onepagecheckout_customer_login" style="border:1px solid #cecece; padding:20px; margin:20px 0;">
-				<?php echo wpsg_drawForm_Checkbox('onepagecheckout_customer_login', __('Login fÃŒr bestehenden Kundenaccount', 'wpsg'), $this->get_option('onepagecheckout_customer_login')); ?>
-				<div class="onepagecheckout_customer_login_activ" style="display:none; margin:20px 0;">
-					<?php $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?>
-			 	</div>
-			 </div>
-		 <?php } ?>
-		 
-		 <?php if (($this->hasMod('wpsg_mod_kundenverwaltung') && $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegister') == '1') || ($this->hasMod('wpsg_mod_kundenverwaltung') && $this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1'))  { ?>
-			 <div class="onepagecheckout_customer_registration" style="border:1px solid #cecece; padding:20px; margin:20px 0;">
-				<?php echo wpsg_drawForm_Checkbox('onepagecheckout_customer_registration', __('neuen Kundenaccount registrieren', 'wpsg'), $this->get_option('onepagecheckout_customer_registration')); ?>
-			 	<div class="onepagecheckout_customer_registration_activ" style="display:none; margin:20px 0;">
-				 	<?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); ?>
-			 	</div>
-			 </div>
-		 <?php } ?>
-		 
-		 <div class="onepagecheckout_customer_guest" style="border:1px solid #cecece; padding:20px; margin:20px 0;">
-		 	<div class="onepagecheckout_customer_guest_label"><?php echo wpsg_drawForm_Checkbox('onepagecheckout_customer_guest', __('Als Gast bestellen', 'wpsg'), $this->get_option('onepagecheckout_customer_guest')); ?></div>
-		 	<div class="onepagecheckout_customer_guest_activ" style="display:none; margin:20px 0;">
-		 				 		 
-				<div class="wpsg_box" id="wpsg_box_kundendaten">
-					
-					<div class="wpsg_inner">
-				
-						<?php if ($this->view['pflicht']['firma'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="wpsg_firma"><?php echo __("Firma", "wpsg"); ?>
-							<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[checkout][firma]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['firma']); ?>" />
-						</div>
+		<div class="wpsg_box" id="wpsg_box_kundendaten">
+		
+			<h2><?php echo __('Kundendaten', 'wpsg'); ?></h2>
+
+			<div class="wpsg_spacer"></div>
+			
+			<div class="wpsg_inner">
+		
+				<div class="wpsg_checkoutblock">
+					<label for="wpsg_firma"><?php echo __("Firma", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[checkout][firma]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['firma']); ?>" />
+				</div>
+			
+				<div class="wpsg_checkoutblock">
+					<label for="wpsg_title"><?php echo __('Anrede', 'wpsg'); ?>
+					<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:</label>
+					<select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[checkout][title]">
+						<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
+						<?php foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+						<option value="<?php echo wpsg_hspc($t); ?>" <?php echo (($this->view['basket']['checkout']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
+					<?php } ?>						
+					</select>
+				</div>
+			
+				<div class="wpsg_checkoutblock">
+					<label for="vname" class="wpsg_checkout"><?php echo __("Vorname", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="vname" name="wpsg[checkout][vname]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['vname']); ?>" />		
+				</div>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="name" class="wpsg_checkout"><?php echo __("Name", "wpsg"); ?>
+					<?php if ($this->data['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="name" name="wpsg[checkout][name]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['name']); ?>" />
+				</div>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email" name="wpsg[checkout][email]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email']); ?>" />
+				</div>
+				
+				<?php if (isset($this->view['pflicht']['emailconfirm']) && $this->view['pflicht']['emailconfirm'] == '1') { ?>
+				<div class="wpsg_checkoutblock">
+					<label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email2" name="wpsg[checkout][email2]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email2']); ?>" />
+				</div>
+				<?php } ?>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ)',"wpsg"); ?>
+					<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[checkout][geb]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['geb']); ?>" />
+				</div>
+						
+				<div class="wpsg_checkoutblock">
+					<label for="fax" class="wpsg_checkout"><?php echo __("Fax.", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['fax'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="fax" name="wpsg[checkout][fax]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['fax']); ?>" />
+				</div>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="tel" class="wpsg_checkout"><?php echo __("Tel.", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['tel'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="tel" name="wpsg[checkout][tel]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['tel']); ?>" />
+				</div>
+			
+				<div class="wpsg_checkoutblock">
+					<label for="strasse" class="wpsg_checkout"><?php echo __("Strasse Nr.", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['strasse']); ?>" />		
+				</div>
+			
+				<div class="wpsg_checkoutblock">
+					<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="number" id="plz" name="wpsg[checkout][plz]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['plz']); ?>" />
+				</div>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="ort" class="wpshopgermany_checkout"><?php echo __("Ort", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[checkout][ort]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['ort']); ?>" />
+				</div>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>					
+					<select name="wpsg[checkout][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
+						<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
+						<?php foreach ($this->view['laender'] as $l) { ?>
+						<option value="<?php echo wpsg_hspc($l['id']); ?>" <?php echo (($l['id'] == $this->view['basket']['checkout']['land'])?'selected="selected"':(($this->get_option('wpsg_defaultland') == $l['id'])?'selected="selected"':'')); ?>><?php echo wpsg_hspc(__($l['name'], 'wpsg')); ?></option>
 						<?php } ?>
-					
-						<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="wpsg_title"><?php echo __('Anrede', 'wpsg'); ?>
-							<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:</label>
-							<select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[checkout][title]">
-								<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-								<?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
-								<option value="<?php echo $i; /*wpsg_hspc($t);*/ $i++; ?>" <?php echo (($this->view['basket']['checkout']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
-							<?php } ?>						
-							</select>
-						</div>
+					</select>
+				</div>
+				
+				<div class="wpsg_checkoutblock">
+					<label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[checkout][ustidnr]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['ustidnr']); ?>" />
+				</div>
+				
+				<?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
+				<?php if ($this->get_option('wpsg_kundenvariablen_show') == '1') { ?>
+				<?php foreach ((array)$this->view['pflicht']['custom'] as $c_id => $c) { if ($c['show'] != '2') { ?>
+				<div class="wpsg_checkoutblock">
+					<label class="wpsg_cv" for="wpsg_cv_<?php echo $c_id; ?>">
+						<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
+						<?php if ($c['typ'] == '0') { // Textfeld ?>
+						<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['custom'][$c_id]); ?>" />
+						<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
+						<select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]">
+							<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
+							<?php foreach ((array)$arAuswahl as $a) { ?>
+							<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['basket']['checkout']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
+							<?php } ?>
+						</select>
+						<?php } else if ($c['typ'] == '2') { // Checkbox ?>
+						<input type="hidden" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="0" />
+						<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="1" <?php echo wpsg_hspc(($this->view['basket']['checkout']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
 						<?php } ?>
-					
-						<?php if ($this->view['pflicht']['vname'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="vname" class="wpsg_checkout"><?php echo __("Vorname", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="vname" name="wpsg[checkout][vname]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['vname']); ?>" />		
-						</div>
-						<?php } ?>
-						
-						<?php if ($this->view['pflicht']['name'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="name" class="wpsg_checkout"><?php echo __("Name", "wpsg"); ?>
-							<?php if ($this->view['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="name" name="wpsg[checkout][name]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['name']); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php if ($this->view['pflicht']['email'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email" name="wpsg[checkout][email]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email']); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php if (isset($this->view['pflicht']['emailconfirm']) && $this->view['pflicht']['emailconfirm'] == '1') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email2" name="wpsg[checkout][email2]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email2']); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php if ($this->view['pflicht']['geb'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ)',"wpsg"); ?>
-							<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[checkout][geb]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['geb']); ?>" />
-						</div>
-						<?php } ?>
-								
-						<?php if ($this->view['pflicht']['fax'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="fax" class="wpsg_checkout"><?php echo __("Fax.", "wpsg"); ?>
-							<?php if ($this->view['pflicht']['fax'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="fax" name="wpsg[checkout][fax]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['fax']); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php if ($this->view['pflicht']['tel'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="tel" class="wpsg_checkout"><?php echo __("Tel.", "wpsg"); ?>
-							<?php if ($this->view['pflicht']['tel'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="tel" name="wpsg[checkout][tel]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['tel']); ?>" />
-						</div>
-						<?php } ?>
-					
-						<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-							
-							<?php if ($this->view['pflicht']['wpsg_showNr'] === '1') { ?>
-
-								<div class="wpsg_checkoutblock" id="wpsg_streetnr">
-									<label for="strasse" class="street wpsg_checkout"><?php echo __('StraÃe:', 'wpsg'); ?>
-										<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-										<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['strasse'])); ?>" />
-									</label>
-									<label for="nr" class="nr wpsg_checkout"><?php echo __('Nr:', 'wpsg'); ?>
-										<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-										<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[checkout][nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>" />
-									</label>
-								</div>
-							
-							<?php } else { ?>
-
-								<div class="wpsg_checkoutblock">
-									<label for="strasse" class="wpsg_checkout"><?php echo __("StraÃe Nr.", "wpsg"); ?>
-										<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-									</label>
-									<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['strasse']); ?>" />
-								</div>
-							
-							<?php } ?>
-						
-						<?php } ?>
-					
-						<?php if ($this->view['pflicht']['plz'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[checkout][plz]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['plz']); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php if ($this->view['pflicht']['ort'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="ort" class="wpshopgermany_checkout"><?php echo __("Ort", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[checkout][ort]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['ort']); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php
-							$lhidden = '';
-							if ($this->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1 )) { 
-								$lhidden = 'hidden="hidden"';
-							}
-						?>
-						
-						<?php if ($this->view['pflicht']['land'] != '2') { ?>
-						<div class="wpsg_checkoutblock" <?php echo $lhidden;?>>
-							<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>					
-							<select name="wpsg[checkout][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
-								<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-								<?php foreach ($this->view['laender'] as $l) { ?>
-								<option value="<?php echo wpsg_hspc($l['id']); ?>" <?php echo (($l['id'] == $this->view['basket']['checkout']['land'])?'selected="selected"':(($this->get_option('wpsg_defaultland') == $l['id'])?'selected="selected"':'')); ?>><?php echo wpsg_hspc(__($l['name'], 'wpsg')); ?></option>
-								<?php } ?>
-							</select>
-						</div>
-						<?php } ?>
-						
-						<?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.", "wpsg"); ?> 
-							<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							</label>
-							<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[checkout][ustidnr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['ustidnr'])); ?>" />
-						</div>
-						<?php } ?>
-						
-						<?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
-						<?php if ($this->get_option('wpsg_kundenvariablen_show') == '1') { ?>
-						<?php foreach ((array)$this->view['pflicht']['custom'] as $c_id => $c) { if ($c['show'] != '2') { ?>
-						<div class="wpsg_checkoutblock">
-							<label class="wpsg_cv" for="wpsg_cv_<?php echo $c_id; ?>">
-								<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
-								<?php if ($c['typ'] == '0') { // Textfeld ?>
-								<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" type="text" value="<?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc($this->view['basket']['checkout']['custom'][$c_id]); ?>" />
-								<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
-								<select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]">
-									<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
-									<?php foreach ((array)$arAuswahl as $a) { ?>
-									<option value="<?php echo wpsg_hspc($a); ?>" <?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo (($a == $this->view['basket']['checkout']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
-									<?php } ?>
-								</select>
-								<?php } else if ($c['typ'] == '2') { // Checkbox ?>
-								<input type="hidden" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="0" />
-								<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="1" <?php if(isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc(($this->view['basket']['checkout']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
-								<?php } ?>
-							</label>
-						</div>
-						<?php } } ?>
-						<?php } ?>
-						<?php /* Automatische Einbindung der benutzerdefinierten Kundenfelder ENDE */ ?>
-						
-						<div class="wpsg_clear"></div>
-														
-						<?php /* $this->callMods('checkout_customer_inner'); */ ?>
-						
-						<br />
-								 	
-						<?php $this->callMods('checkout_inner_prebutton', array(&$this->view)); ?>
-		
-						<div class="wpsg_box">
-							
-							<h2><?php echo __('Bestellkommentar', 'wpsg'); ?></h2>
-							
-							<div class="wpsg_spacer"></div>
-							
-							<div class="wpsg_inner wpsg_commentblock">
-								<textarea name="wpsg[checkout][comment]" id="wpsg_checkout_comment"><?php echo wpsg_hspc($this->view['basket']['checkout']['comment']); ?></textarea>				 
-							</div>
-						</div>
-						
-						<div class="wpsg_mandatoryfield_hint">
-							<?php echo wpsg_translate(__('Mit #1# gekennzeichnete Felder sind Pflichtfelder.', 'wpsg'), '<span class="wpsg_required">*</span>'); ?>
-						</div>
-						
-					</div>
-				
-				</div>		 
-				
-		 	</div>
+					</label>
+				</div>
+				<?php } } ?>
+				<?php } ?>
+				<?php /* Automatische Einbindung der benutzerdefinierten Kundenfelder ENDE */ ?>
+				
+				<div class="wpsg_clear"></div>
+												
+				<?php $this->callMods('checkout_customer_inner'); ?>
+				
+			</div>
+		
+		</div>
 		 	
-		 </div>
-		 
-		 <br />
-		 	 
-		<?php /* Abfrage Satollo-Newsletter */ ?>
-		<?php echo $this->callMod('wpsg_mod_nlsatolo', 'checkout_customer_inner'); ?>
-						
-		<?php /* EinverstÃ€ndnisabfrage Trusted Shops */ ?>
-		<?php echo $this->callMod('wpsg_mod_trustedshops', 'checkout_customer_inner'); ?>
+		<?php $this->callMods('checkout_inner_prebutton', array(&$this->view)); ?>
 		 		
-		<div class="wpsg_clear"></div>		
+		<div class="wpsg_clear"></div>
+		
+		<div class="wpsg_box">
+			
+			<h2><?php echo __('Bestellkommentar', 'wpsg'); ?></h2>
+			
+			<div class="wpsg_spacer"></div>
+			
+			<div class="wpsg_inner wpsg_commentblock">
+				<textarea name="wpsg[checkout][comment]" id="wpsg_checkout_comment"><?php echo wpsg_hspc($this->view['basket']['checkout']['comment']); ?></textarea>				 
+			</div>
+		</div>
+		
+		<div class="wpsg_mandatoryfield_hint">
+			<?php echo wpsg_translate(__('Mit #1# gekennzeichnete Felder sind Pflichtfelder.', 'wpsg'), '<span class="wpsg_required">*</span>'); ?>
+		</div>
 		
 		<br />
@@ -414,7 +273,5 @@
 		<br /> 
 		
-		<?php if ($this->get_option('wpsg_mod_onepagecheckout_basket') == 0) { ?>
 		<input type="submit" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>'; return false;" class="wpsg_button wpsg_basketbutton" value="<?php echo __('ZurÃŒck zum Warenkorb', 'wpsg'); ?>" name="wpsg_redirect_basket" />
-		<?php } ?>
 		<input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_checkout2button" value="<?php echo __('Weiter', 'wpsg'); ?>" name="wpsg_checkout" />
 			
@@ -440,56 +297,4 @@
     
 		jQuery(document).ready(function() {
-
-			jQuery('#onepagecheckout_customer_login').bind('change', function() {
-
-				if (jQuery(this).is(':checked')) { 
-
-					jQuery('.onepagecheckout_customer_login_activ').show();
-					jQuery('.onepagecheckout_customer_guest_label').hide();
-					jQuery('.onepagecheckout_customer_registration').hide();
-
-				} else { 
-
-					jQuery('.onepagecheckout_customer_login_activ').hide();
-					jQuery('.onepagecheckout_customer_guest_label').show();
-					jQuery('.onepagecheckout_customer_registration').show();
-
-				}
-					
-			} ).change();
-
-			jQuery('#onepagecheckout_customer_registration').bind('change', function() {
-
-				if (jQuery(this).is(':checked')) {
-
-					jQuery('.onepagecheckout_customer_registration_activ, .onepagecheckout_customer_guest_activ').show();
-					jQuery('.onepagecheckout_customer_login').hide();
-					jQuery('.onepagecheckout_customer_guest_label').hide();
-					
-				} else { 
-
-					jQuery('.onepagecheckout_customer_registration_activ, .onepagecheckout_customer_guest_activ').hide();
-					jQuery('.onepagecheckout_customer_login').show();
-					jQuery('.onepagecheckout_customer_guest_label').show();
-					
-				}
-						
-			} ).change();
-
-			jQuery('#onepagecheckout_customer_guest').bind('change', function() {
-
-				if (jQuery(this).is(':checked')) {
-
-					jQuery('.onepagecheckout_customer_guest_activ').show();
-					jQuery('.onepagecheckout_customer_login').hide();
-					jQuery('.onepagecheckout_customer_registration').hide();
-					
-				} else { 
-					jQuery('.onepagecheckout_customer_guest_activ').hide();
-					jQuery('.onepagecheckout_customer_login').show();
-					jQuery('.onepagecheckout_customer_registration').show();
-				}
-				
-			} ).change();
 
 			jQuery('.shippay_wrap .shippay_item_wrap').bind('click', function() {
@@ -590,16 +395,8 @@
 			 			
 			<?php } ?>			
-
-			land = <?php if (wpsg_isSizedInt($this->view['basket']['checkout']['land'])) echo $this->view['basket']['checkout']['land'];
-					else echo $this->get_option('wpsg_defaultland'); ?>;
-				
-			// Land der Rechnungsadresse setzen
-			//land = jQuery('#set_land').val();
-			jQuery('#wpsg_land').val(land);
-			//alert('land: ' + land);
 		 	
 		} );
 			
 	/* ]]> */</script>
-	
+	 	
 </div>
Index: /views/mods/mod_onepagecheckout/settings_edit.phtml
===================================================================
--- /views/mods/mod_onepagecheckout/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_onepagecheckout/settings_edit.phtml	(revision 5261)
@@ -7,3 +7,2 @@
 ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_onepagecheckout_page', __('Seite fÃŒr den "EinSeitenCheckout"', 'wpsg'), $this->view['arPages'], $this->get_option('wpsg_mod_onepagecheckout_page'), array('help' => 'wpsg_mod_onepagecheckout_page')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_onepagecheckout_basket', __('Warenkorb in EinSeitenCheckout integrieren', 'wpsg'), $this->get_option('wpsg_mod_onepagecheckout_basket'), array('help' => 'wpsg_mod_onepagecheckout_basket')); ?>
Index: /views/mods/mod_ordercondition/list.phtml
===================================================================
--- /views/mods/mod_ordercondition/list.phtml	(revision 8528)
+++ /views/mods/mod_ordercondition/list.phtml	(revision 5261)
@@ -9,10 +9,10 @@
 
 	jQuery(document).ready(function() {
-	/*
+	
 		jQuery('.wpsg_mod_ordercondition_edit_name').each(function() {
 	
 			var oc_id = jQuery(this).attr("id").replace(/wpsg_mod_ordercondition_name_/, '');
 			
-			jQuery(this).wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
+			jQuery(this).editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
 				submitdata: { 
 		    		field: 'name',
@@ -42,7 +42,6 @@
 			
 		} );
-	*/
-
-		jQuery('.wpsg_oc_removeLink').bind('click', function() {
+	
+		jQuery('#wpsg_oc_list .wpsg_icon_remove').bind('click', function() {
 	
 			if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie diese Bestellbedingung entfernen mÃ¶chten?', 'wpsg'); ?>')) return false;
@@ -53,5 +52,5 @@
 				url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=remove&noheader=1',
 				data: {
-					oc_id: jQuery(this).attr("data-id")
+					oc_id: jQuery(this).parent().attr("id")
 				},
 				success: function(data)
@@ -72,115 +71,48 @@
 <?php } else { ?>
 <?php $i = 0; foreach ($this->view['wpsg_mod_ordercondition']['data'] as $oc) { $i ++; ?>
-
-    <hr />
-
+	
 	<div id="wpsg_mod_ordercondition_row_<?php echo $oc['id']; ?>">
 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <?php echo $oc['id']; ?><a data-id="<?php echo $oc['id']; ?>" class="wpsg_oc_removeLink" href="#"><span class="wpsg-glyphicon glyphicon glyphicon-trash"></span></a>
-        <?php echo wpsg_drawForm_TextEnd(__('ID', 'wpsg')); ?>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="oc_name_<?php echo $oc['id']; ?>"><?php echo $oc['name']; ?></span>
-        <?php echo wpsg_drawForm_TextEnd(__('Bezeichnung', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-
-            jQuery('#oc_name_<?php echo $oc['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'name',
-                    oc_id: '<?php echo $oc['id']; ?>'
-                }
-            });
-
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="oc_typ_<?php echo $oc['id']; ?>"><?php
-
-            if ($oc['typ'] == '1') echo __('Jede Bestellung', 'wpsg');
-            else if ($oc['typ'] == '2') echo __('Bestimmte Produkte', 'wpsg');
-            else if ($oc['typ'] == '3') echo __('Bestimmte Versandarten', 'wpsg');
-            else echo __('Inaktiv', 'wpsg');
-
-        ?></span>
-        <?php echo wpsg_drawForm_TextEnd(__('Wirkungsbereich', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-
-            jQuery('#oc_typ_<?php echo $oc['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
-                type: 'select',
-                data: <?php echo wpsg_prepare_for_inlineEdit(array('0' => __('Inaktiv', 'wpsg'), '1' => __('Jede Bestellung', 'wpsg'), '2' => __('Bestimmte Produkte', 'wpsg'), '3' => __('Bestimmte Versandarten'))); ?>,
-                submitdata: {
-                    field: 'typ',
-                    oc_id: '<?php echo $oc['id']; ?>'
-                },
-                callback: function(e, params) {
-                    
-                    if (params == 3) jQuery('.wpsg_mod_ordercondition_shipping_<?php echo $oc['id']; ?>').show();
-                    else jQuery('.wpsg_mod_ordercondition_shipping_<?php echo $oc['id']; ?>').hide();
-                    
-                }
-            });
-
-        /* ]]> */</script>
-    
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span class="wpsg_editable" id="oc_text_<?php echo $oc['id']; ?>"><?php echo wpsg_hspc($oc['text']); ?></span>
-        <?php echo wpsg_drawForm_TextEnd(__('Bedingungstext', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-
-            jQuery('#oc_text_<?php echo $oc['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'text',
-                    oc_id: '<?php echo $oc['id']; ?>'
-                },
-                type: 'textarea'
-            });
-
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span class="wpsg_editable" id="oc_errortext_<?php echo $oc['id']; ?>"><?php echo wpsg_hspc($oc['errortext']); ?></span>
-        <?php echo wpsg_drawForm_TextEnd(__('Fehlertext', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-
-            jQuery('#oc_errortext_<?php echo $oc['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'errortext',
-                    oc_id: '<?php echo $oc['id']; ?>'
-                },
-                type: 'textarea'
-            });
-
-        /* ]]> */</script>
-        
-        <div class="wpsg_mod_ordercondition_shipping_<?php echo $oc['id']; ?>" style="display:<?php echo (($oc['typ'] === '3')?'block':'none'); ?>;">
-            <?php echo wpsg_drawForm_TextStart(); ?>
-            <span class="wpsg_editable" id="oc_shipping_<?php echo $oc['id']; ?>"><?php 
-            
-                foreach (wpsg_trim(explode(',', $oc['shipping'])) as $shipping_id) 
-                {  
-                    
-                    if (array_key_exists($shipping_id, $this->view['arShipping'])) echo $this->view['arShipping'][$shipping_id].'<br />';
-                    
-                } 
-                
-            ?></span>
-            <?php echo wpsg_drawForm_TextEnd(__('Versandartenauswahl', 'wpsg')); ?>
-            <script type="text/javascript">/* <![CDATA[ */
-    
-                jQuery('#oc_shipping_<?php echo $oc['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordercondition&do=inlinedit&noheader=1', {
-                    submitdata: {
-                        field: 'shipping',
-                        oc_id: '<?php echo $oc['id']; ?>'
-                    },
-                    data: <?php echo json_encode($this->view['arShipping']); ?>,
-                    value: <?php echo json_encode(wpsg_trim(explode(',', $oc['shipping']))); ?>,
-                    type: 'checklist'
-                });
-    
-            /* ]]> */</script>
-        </div>
-            
-		<?php if ($i == sizeof($this->view['wpsg_mod_ordercondition']['data'])) { ?><hr /><?php } ?>
+		<?php echo wpsg_drawForm_Input($oc['id'], __('ID', 'wpsg'), $oc['id'], array('text' => true, 'remove' => '1')); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_ordercondition_name_'.$oc['id'], __('Bezeichnung', 'wpsg'), $oc['name'], array('text' => true, 'class_text' => 'wpsg_mod_ordercondition_edit_name wpsg_editable')); ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_ordercondition_typ_'.$oc['id'], __('Wirkungsbereich', 'wpsg'), array('0' => __('Inaktiv', 'wpsg'), '1' => __('Jede Bestellung', 'wpsg'), '2' => __('Bestimmte Produkte', 'wpsg')), $oc['typ'], array('class_select' => 'wpsg_editable wpsg_mod_ordercondition_edit_typ')); ?>
+		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_mod_ordercondition_text_<?php echo $oc['id']; ?>"><?php echo __('Bedingungstext', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<a href="#" onclick="return wpsg_showOCText(<?php echo $oc['id']; ?>);"><?php echo __('Editor anzeigen/verbergen', 'wpsg'); ?></a>
+				</p>
+			</div>
+		</div>
+		<div class="wpsg_clear"></div>
+				
+		<div class="wpsg_form_field wpsg_mod_ordercondition_editor wpsg_mod_ordercondition_editor_<?php echo $oc['id']; ?>" style="display:none; width:745px; min-height:225px;">	
+			<textarea class="wpsg_mod_ordercondition_text" id="oc_<?php echo $oc['id']; ?>" name="oc[<?php echo $oc['id']; ?>]"><?php echo wpsg_hspc($oc['text']); ?></textarea>
+			<div class="wpsg_clear"></div><br />
+			<input class="button" type="button" onclick="wpsg_saveOCText(<?php echo $oc['id']; ?>);" value="<?php echo __('Text speichern', 'wpsg'); ?>" /><br /><br />
+		</div>
+	
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_mod_ordercondition_errortext_<?php echo $oc['id']; ?>"><?php echo __('Fehlertext', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<a href="#" onclick="return wpsg_showOCErrorText(<?php echo $oc['id']; ?>);"><?php echo __('Editor anzeigen/verbergen', 'wpsg'); ?></a>
+				</p>
+			</div>
+		</div>
+		<div class="wpsg_clear"></div>
+				
+		<div class="wpsg_form_field wpsg_mod_ordercondition_editor wpsg_mod_ordercondition_editor_errortext_<?php echo $oc['id']; ?>" style="display:none; width:745px; min-height:225px;">	
+			<textarea class="wpsg_mod_ordercondition_text" id="oc_errortext_<?php echo $oc['id']; ?>" name="oc[<?php echo $oc['id']; ?>]"><?php echo wpsg_hspc($oc['errortext']); ?></textarea>
+			<div class="wpsg_clear"></div><br />
+			<input class="button" type="button" onclick="wpsg_saveOCErrorText(<?php echo $oc['id']; ?>);" value="<?php echo __('Text speichern', 'wpsg'); ?>" /><br />
+		</div>		
+	
+		<?php if ($i < sizeof($this->view['wpsg_mod_ordercondition']['data'])) { ?><br /><hr /><?php } ?>
 	
 	</div>
Index: /views/mods/mod_ordercondition/overview_top.phtml
===================================================================
--- /views/mods/mod_ordercondition/overview_top.phtml	(revision 8528)
+++ /views/mods/mod_ordercondition/overview_top.phtml	(revision 5261)
@@ -10,7 +10,7 @@
 ?>
 <?php foreach ($this->view['wpsg_mod_ordercondition']['data'] as $oc) { ?>
-<div class="wpsg_agb" id="wpsg_agb_<?php echo $oc['id']; ?>">
+<div class="wpsg_agb">
 	<label>
-		<input type="checkbox" value="1" name="wpsg_mod_ordercondition[<?php echo $oc['id']; ?>]" required />
+		<input type="checkbox" value="1" name="wpsg_mod_ordercondition[<?php echo $oc['id']; ?>]" />
 		<?php if (strlen($oc['text']) < $minLength) { ?>
 		<?php echo $oc['text']; ?>
Index: ews/mods/mod_ordercondition/produkt_addedit_allgemein.phtml
===================================================================
--- /views/mods/mod_ordercondition/produkt_addedit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,20 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Konfiguration der Bestellbedingungen innerhalb der Produktverwaltung
-	 */
-
-?>
-<div id="wpsg_ordercondition" class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<span><?php echo __('Bestellbedingungen', 'wpsg'); ?></span>
-		</h3>
-	</div>
-	<div class="panel-body">
-		<?php foreach ($this->view['wpsg_mod_ordercondition']['data'] as $oc) { ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_ordercondition['.$oc['id'].']', __($oc['name'], 'wpsg'), $oc['selected']); ?>		
-		<?php } ?>
-	</div>
-</div>
-
Index: /views/mods/mod_ordercondition/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_ordercondition/produkt_edit_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_ordercondition/produkt_edit_sidebar.phtml	(revision 5261)
@@ -6,10 +6,13 @@
 
 ?>
-<?php if ($this->hasMod('wpsg_mod_ordercondition')) { ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Bestellbedingungen', 'wpsg')); ?>
+<div class="postbox" id="wpsg_ordercondition">		
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Bestellbedingungen', 'wpsg'); ?></span>
+	</h3>	
+	<div class="inside">
 		<?php foreach ($this->view['wpsg_mod_ordercondition']['data'] as $oc) { ?>
 		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_ordercondition['.$oc['id'].']', __($oc['name'], 'wpsg'), $oc['selected']); ?>		
 		<?php } ?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
+	</div>
+</div>
Index: /views/mods/mod_ordercondition/settings_edit.phtml
===================================================================
--- /views/mods/mod_ordercondition/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_ordercondition/settings_edit.phtml	(revision 5261)
@@ -151,8 +151,18 @@
 <?php } ?>
 
-<div id="wpsg_oc_list">
-	<?php echo $this->callMod('wpsg_mod_ordercondition', 'oc_list'); ?>
+<div class="wpsg_admin_box">		
+		  		
+	<div class="head">
+		<div class="title">
+			<div class="fulltab">
+				<?php echo __('Bestellbedingungen', 'wpsg'); ?>
+				<a title="<?php echo __('Neue Bestellbedingung anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addOC();"></a>
+			</div>
+		</div>
+	</div>
+			
+	<div class="content" id="wpsg_oc_list">
+		<?php echo $this->callMod('wpsg_mod_ordercondition', 'oc_list'); ?>
+	</div>
+					
 </div>
-
-<br />
-<a href="#" onclick="return wpsg_addOC();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neue Bestellbedingung anlegen', 'wpsg'); ?></a>
Index: ews/mods/mod_orderupload/basket_after.phtml
===================================================================
--- /views/mods/mod_orderupload/basket_after.phtml	(revision 8528)
+++ 	(revision )
@@ -1,84 +1,0 @@
-<?php
-    
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 02.05.2018
-     * Time: 10:47
-     */
-
-	// Es muss die ID der Bestellung verfÃŒgbar sein.
-	if (intval($_SESSION['wpsg']['order_id']??0) <= 0) $_SESSION['wpsg']['order_id'] = \wpsg\wpsg_calculation::getSessionCalculation()->toDB();
-
-?>
-
-<script>
-
-    function wpsg_mod_orderupload_upload(product_index, product_id) {
-
-        var files = document.getElementById('wpsg_mod_orderupload_' + product_index + '_file').files;
-        var formData = new FormData();
-
-        for (var i = 0; i < files.length; i++) {
-
-            var file = files[i];
-
-            formData.append('file[]', file, file.name);
-
-        }
-
-        formData.append('product_index', product_index);
-        formData.append('product_id', product_id);
-        formData.append('order_id', '<?php echo $_SESSION['wpsg']['order_id']; ?>'); 
-        formData.append('action', 'wpsg_mod_orderupload_upload');
-
-        var xhr = new XMLHttpRequest();
-
-        xhr.open('POST', wpsg_ajax.ajaxurl, true);
-
-        jQuery('#wpsg_mod_orderupload_' + product_index + '_target').html('<?php echo __('Bitte warten ', 'wpsg'); ?><img src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" /></div>');
-
-        xhr.onload = function () {
-
-            if (xhr.status === 200) {
-
-                jQuery('#wpsg_mod_orderupload_' + product_index + '_target').html(xhr.responseText);
-
-            } else {
-
-                alert("<?php echo __('Fehler', 'wpsg'); ?>: " + xhr.responseText);
-
-            }
-
-        };
-
-        xhr.send(formData);
-
-        return false;
-        
-    }
-    
-    function wpsg_mod_orderupload_removefile(file, product_index, product_id) {
-                         
-        jQuery('#wpsg_mod_orderupload_' + product_index + '_target').html('<?php echo __('Bitte warten ', 'wpsg'); ?><img src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" /></div>');
-        
-        jQuery.ajax( {
-            url: wpsg_ajax.ajaxurl,
-            data: {
-                action: 'wpsg_mod_orderupload_delete',
-                order_id: '<?php echo $_SESSION['wpsg']['order_id'] ?>',
-                product_index: product_index,
-                product_id: product_id,
-                file: file
-            }, 
-            success: function(data) {
-
-                jQuery('#wpsg_mod_orderupload_' + product_index + '_target').html(data);
-                
-            }
-        } );
-        
-        return false;
-        
-    } // wpsg_mod_orderupload_removefile(aElement)
-    
-</script>
Index: ews/mods/mod_orderupload/basket_row.phtml
===================================================================
--- /views/mods/mod_orderupload/basket_row.phtml	(revision 8528)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Anzeige der Upload pro Produkt im Warenkorb
-	 */
-
-?>
-<div class="product_info product_upload">
-
-	<?php echo __('Upload zum Produkt', 'wpsg'); ?>:
-	
-	<div id="wpsg_mod_orderupload_<?php echo $this->view['wpsg_mod_orderupload']['product_index']; ?>_target" class="wpsg_mod_orderupload_target">
-
-		<?php echo $this->view['wpsg_mod_orderupload']['strHTMLTarget']; ?>
-				
-	</div>
-	 	
-</div>
Index: ews/mods/mod_orderupload/basket_row_upload_target.phtml
===================================================================
--- /views/mods/mod_orderupload/basket_row_upload_target.phtml	(revision 8528)
+++ 	(revision )
@@ -1,41 +1,0 @@
-<?php
-
-	if (!$this->bMessageOut) echo $this->writeFrontendMessage();
-
-?>
-
-<?php if (wpsg_isSizedArray($this->view['wpsg_mod_orderupload']['arFiles'])) { ?>
-
-    <ul>
-        
-        <?php foreach ($this->view['wpsg_mod_orderupload']['arFiles'] as $f) { ?>
-        
-            <li>
-
-                <a href="<?php
-
-							echo wpsg_ShopController::getShop()->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_orderupload', 'downloadProductFile', [
-								'file' => rawurlencode(basename($f)),
-								'product_index' => $this->view['wpsg_mod_orderupload']['product_index']
-							]);
-
-						?>"><?php echo basename($f); ?> <span class="size">(<?php echo wpsg_formatSize($f); ?>)</span></a>
-                
-                <a title="<?php echo __('Upload entfernen.', 'wpsg'); ?>" class="removeLink" onclick="return wpsg_mod_orderupload_removefile('<?php echo rawurlencode(basename($f)); ?>', <?php echo $this->view['wpsg_mod_orderupload']['product_index']; ?>, <?php echo $this->view['wpsg_mod_orderupload']['product_id']; ?>);" href="#">
-                    <img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" />
-                </a>
-                
-            </li>
-    
-        <?php } ?>
-
-    </ul>
-    
-<?php } ?>
-
-<?php if ($this->view['wpsg_mod_orderupload']['oProduct']->wpsg_mod_orderupload_set > sizeof($this->view['wpsg_mod_orderupload']['arFiles'])) { ?>
-
-    <input type="file" id="wpsg_mod_orderupload_<?php echo $this->view['wpsg_mod_orderupload']['product_index']; ?>_file" name="wpsg_mod_orderupload[<?php echo $this->view['wpsg_mod_orderupload']['product_index']; ?>]" multiple="multiple" />
-    <input type="button" onclick="return wpsg_mod_orderupload_upload(<?php echo $this->view['wpsg_mod_orderupload']['product_index']; ?>, <?php echo $this->view['wpsg_mod_orderupload']['product_id']; ?>);" id="wpsg_mod_orderupload_<?php echo $this->view['wpsg_mod_orderupload']['product_index']; ?>_button" value="<?php echo __('Hochladen', 'wpsg'); ?>" />
-
-<?php } ?>
Index: /views/mods/mod_orderupload/checkout_inner_prebutton.phtml
===================================================================
--- /views/mods/mod_orderupload/checkout_inner_prebutton.phtml	(revision 8528)
+++ /views/mods/mod_orderupload/checkout_inner_prebutton.phtml	(revision 5261)
@@ -7,47 +7,20 @@
 ?>
 <div class="wpsg_box wpsg_mod_orderupload">
-
-	<div class="wpsg_head"><?php echo __('Dateiupload:', 'wpsg'); ?> 
-		
-		<?php if ($this->get_option('wpsg_mod_orderupload_optional') != '1') { ?>
-		
-			<span class="wpsg_required">*</span>
+	<div class="wpsg_head"><?php echo __('Dateiupload', 'wpsg'); ?> <?php if ($this->get_option('wpsg_mod_orderupload_optional') != '1') { ?><span class="wpsg_required">*</span><?php } ?></div>
+	<div class="wpsg_inner">
 			
-		<?php } ?>
-		
-	</div>
+		<input type="file" name="wpsg_mod_orderupload_file" />
 	
-	<div class="wpsg_inner">
-
-		<?php if ($this->view['wpsg_mod_orderupload']['uploadsum'] > 0) { ?>
-			<input class="wpsg_orderupload_checkout_button" type="file" name="wpsg_mod_orderupload_file" />
- 		<?php } ?>
- 
- 		<?php /* Auflistung der bereits hochgeladenen Dokumente */ ?>
-		<?php if (wpsg_isSizedArray($_SESSION['wpsg']['wpsg_mod_orderupload'])) { ?>
-		
+		<?php if (wpsg_isSizedArray($_SESSION['wpsg']['checkout']['wpsg_mod_orderupload'])) { ?>
 			<br />
-			
 			<label class="wpsg_checkout"><?php echo __('Bisher hochgeladene Dokumente', 'wpsg'); ?>:</label><br />
-			
-			<?php foreach ($_SESSION['wpsg']['wpsg_mod_orderupload'] as $ou_index => $ou) { ?>
-			
-				<?php /* Dokument aus der Liste lÃ¶schen */ ?>
-				<a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie dieses Dokument aus der Bestellung entfernen mÃ¶chten?', 'wpsg'); ?>');" href="?wpsg_plugin=wpsg_mod_orderupload&wpsg_action=remove&file_index=<?php echo $ou_index; ?>" class="wpsg_mod_orderupload_removelink">
-					<img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" />
-				</a>
-				
-				<a href="<?php echo $ou[2]; ?>"><?php echo wpsg_hspc($ou[0]); ?></a>&nbsp;<?php echo '('.wpsg_formatSize($ou[3]).')'; ?><br />	
-					
+			<?php foreach ($_SESSION['wpsg']['checkout']['wpsg_mod_orderupload'] as $ou_index => $ou) { ?>
+			<a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie dieses Dokument aus der Bestellung entfernen mÃ¶chten?', 'wpsg'); ?>');" href="?wpsg_plugin=wpsg_mod_orderupload&wpsg_action=remove&file_index=<?php echo $ou_index; ?>" class="wpsg_mod_orderupload_removelink">
+				<?php echo __('Entfernen', 'wpsg'); ?>
+			</a>
+			<a href="<?php echo $ou[2]; ?>"><?php echo wpsg_hspc($ou[0]); ?></a>&nbsp;<?php echo '('.wpsg_formatSize($ou[3]).')'; ?><br />		
 			<?php } ?>
-			
 		<?php } ?>
 			
 	</div>
-	
-	<?php /* Counter, wie viel MB noch ÃŒbrig sind */?>
-	<label class="wpsg_fileweight">
-		<?php echo wpsg_translate( __('Es stehen Ihnen #1# Mb von #2# Mb fÃŒr den Upload zur VerfÃŒgung', 'wpsg'), $this->view['wpsg_mod_orderupload']['uploadsum'], $this->view['wpsg_mod_orderupload']['maxweight'] );?>
-	</label>
-	
 </div>
Index: ews/mods/mod_orderupload/order_view_row.phtml
===================================================================
--- /views/mods/mod_orderupload/order_view_row.phtml	(revision 8528)
+++ 	(revision )
@@ -1,17 +1,0 @@
-<?php
-	
-	/**
-	 * Template fÃŒr die Integration des Produktuploads in die Bestellverwaltung Reiter "Bestelldaten"
-	 */
-	
-	$view = $this->view['wpsg_mod_orderupload'];
-
-?>
-<tr class="wpsg_<?php echo (($view['i'] == 0)?'odd':'even'); ?>">
-	<td><?php echo __('Produktuploads', 'wpsg'); ?>:</td>
-	<td align="left" colspan="<?php echo ((sizeof($this->view['arCalculation']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
-		<label>
-			<?php echo implode(', ', $view['arFileDownloadLinks']); ?>
-		</label>
-	</td>
-</tr>
Index: /views/mods/mod_orderupload/order_view_sidebar.phtml
===================================================================
--- /views/mods/mod_orderupload/order_view_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_orderupload/order_view_sidebar.phtml	(revision 5261)
@@ -2,27 +2,21 @@
 
 	/**
-	 * Template fÃŒr die Anzeige der Bestelluploads innerhalb des Bestellbackend
+	 * Template fÃŒr die Anzeige der Bestelluploads innerhalb der Bestellung
 	 */
  
 ?>
-
-	<?php if ($this->hasMod('wpsg_mod_orderupload')) { ?>
-		<?php echo wpsg_drawForm_AdminboxStart(__('Bestelluploads', 'wpsg')); ?>
-		
-			<div class="inside">
-				 <?php if (!wpsg_isSizedArray($this->view['arFiles'])) { ?>
-				 <p class="wpsg_checkout_orderupload_backend">
-				 	<?php echo __('Keine Dateien hochgeladen.', 'wpsg'); ?>
-				 </p>
-				 <?php } else { ?>
-				 <?php foreach ($this->view['arFiles'] as $f) { ?>
-				 <p class="wpsg_checkout_orderupload_backend">
-				 	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1&action=ajax&mod=wpsg_mod_orderupload&wpsg_mod_orderupload_download=<?php echo rawurlencode($f); ?>"><?php echo $f; ?></a><br /> 
-				 	<span class="wpsg_checkout_orderupload_backend_weight">(<?php echo wpsg_formatSize($this->callMod('wpsg_mod_orderupload', 'getSavePath', array($this->view['data']['id'])).$f); ?>)</span>
-				 </p>
-				 <?php } ?>
-				 <?php } ?>
-			</div>
-		
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-	<?php } ?>
+<div class="postbox" id="wpsg_modorderupload">
+	<div title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br></div>
+	<h3 class="hndle">
+		<span><?php echo __('Bestelluploads', 'wpsg'); ?></span>
+	</h3> 
+	<div class="inside">
+		 <?php if (!wpsg_isSizedArray($this->view['arFiles'])) { ?>
+		 <p><?php echo __('Keine Dateien hochgeladen.', 'wpsg'); ?></p>
+		 <?php } else { ?>
+		 <?php foreach ($this->view['arFiles'] as $f) { ?>
+		 <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1&action=ajax&mod=wpsg_mod_orderupload&wpsg_mod_orderupload_download=<?php echo rawurlencode($f); ?>"><?php echo $f; ?></a> (<?php echo wpsg_formatSize($this->callMod('wpsg_mod_orderupload', 'getSavePath', array($this->view['data']['id'])).$f); ?>)<br />
+		 <?php } ?>
+		 <?php } ?>
+	</div>
+</div>
Index: ews/mods/mod_orderupload/product_addedit_content.phtml
===================================================================
--- /views/mods/mod_orderupload/product_addedit_content.phtml	(revision 8528)
+++ 	(revision )
@@ -1,45 +1,0 @@
-<?php
-    
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 02.05.2018
-     * Time: 07:25
-     */
-
-?>
-    
-<?php echo wpsg_drawForm_AdminboxStart(__('Bestellupload', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_Checkbox('wpsg_mod_orderupload_set', __('Bestellupload ermÃ¶glichen'), (($this->view['wpsg_mod_orderupload']['set'] > 0)?true:false)); ?>
-
-    <div class="wpsg_mod_orderupload_set_1" style="<?php echo (($this->view['wpsg_mod_orderupload']['set'] > 0)?'display:block;':'display:none;'); ?>">
-
-        <?php echo wpsg_drawForm_Input('wpsg_mod_orderupload[set]', __('Maximale Anzahl an Uploads'), $this->view['wpsg_mod_orderupload']['set']); ?>
-        <?php echo wpsg_drawForm_Checkbox('wpsg_mod_orderupload[mandatory]', __('Pflichtfeld'), $this->view['wpsg_mod_orderupload']['mandatory']); ?>
-        
-    </div>    
-
-    <script>
-        
-        jQuery(document).ready(function() {
-            
-            jQuery('#wpsg_mod_orderupload_set').on('change', function() {
-                
-                if (jQuery(this).prop('checked') === true) {
-                    
-                    jQuery('.wpsg_mod_orderupload_set_1').show();
-                    jQuery('#wpsg_mod_orderuploadset').focus();
-                    
-                } else {
-
-                    jQuery('.wpsg_mod_orderupload_set_1').hide();
-                    
-                }
-                
-            } ).change();
-            
-        } );
-        
-    </script>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>  
Index: /views/mods/mod_orderupload/settings_edit.phtml
===================================================================
--- /views/mods/mod_orderupload/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_orderupload/settings_edit.phtml	(revision 5261)
@@ -6,54 +6,6 @@
 
 ?>
-
-<br/>
-<?php /* Upload pro Produkt oder pro Bestellung */ ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_orderupload__mode', __('Upload-typ', 'wpsg'), array(
-	wpsg_mod_orderupload::MODE_ORDER => __('Upload pro Bestellung', 'wpsg'),
-	wpsg_mod_orderupload::MODE_PRODUCT => __('Upload pro Produkt', 'wpsg')		
-), $this->get_option('wpsg_mod_orderupload_mode'), array('help' => 'wpsg_mod_orderupload_mode')); ?>
-
-<?php /* Platzhalter fÃŒr Dateiname */ ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_orderupload_filename', __('Neuer Dateiname', 'wpsg'), $this->get_option('wpsg_mod_orderupload_filename'), array('help' => 'wpsg_mod_orderupload_filename')); ?>
-
-<?php /* erlaubte Dateitypen*/ ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_orderupload_allowedext', __('Erlaubte Endungen (kommagetrennt)', 'wpsg'), $this->get_option('wpsg_mod_orderupload_allowedext'), array('help' => 'wpsg_mod_orderupload_allowedext')); ?>
-
-<br />
-
-<?php /* maximale Upload-GrÃ¶Ãe */?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_orderupload_maxweight', __('maximale GrÃ¶Ãe des Uploads (Angaben in MB)', 'wpsg'), $this->get_option('wpsg_mod_orderupload_maxweight'), array('help' => 'wpsg_mod_orderupload_maxweight'));?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_orderupload_maxweight_text', __('Text bei Ãberschreiten der max. Uploadgrenze', 'wpsg'), $this->get_option('wpsg_mod_orderupload_maxweight_text'), array('help' => '"wpsg_mod_orderupload_text')); ?>
-<br />
-
-<?php /* mehrere Dateien */?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_orderupload_multifiles', __('Mehr als eine Datei erlauben', 'wpsg'), $this->get_option('wpsg_mod_orderupload_multifiles'), array('help' => 'wpsg_mod_orderupload_multifiles')); ?>
-
-<br />
-
-<?php /* Pflichtfeld*/ ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_orderupload_optional', __('Upload ist kein Pflichtfeld', 'wpsg'), $this->get_option('wpsg_mod_orderupload_optional'), array('help' => 'wpsg_mod_orderupload_optional')); ?>
-
-<?php /* Anhang an Adminmail */ ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_orderupload_mail', __('Upload als Anhang an Adminmail', 'wpsg'), $this->get_option('wpsg_mod_orderupload_mail'), array('help' => 'wpsg_mod_orderupload_mail')); ?>
-
-<?php /* mehrere AnhÃ€nge zippen (wenn "mehrere Dateien" und wenn "Adminmail"*/ ?>
-<div class="wpsg_mod_orderupload_mail_activ" style="display:none;">
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_orderupload_zip', __('Datei(en) als Zip anhÃ€ngen', 'wpsg'), $this->get_option('wpsg_mod_orderupload_zip'), array('help' => 'wpsg_mod_orderupload_zip'));?>
-</div>
-
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
-
-		jQuery('#wpsg_mod_orderupload_mail').bind('change', function() {
-
-			if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_orderupload_mail_activ').show();
-			else jQuery('.wpsg_mod_orderupload_mail_activ').hide();
-			
-		} ).change();
-		
-	} );
-
-/* ]]> */</script>
Index: /views/mods/mod_ordervars/checkout_inner_prebutton.phtml
===================================================================
--- /views/mods/mod_ordervars/checkout_inner_prebutton.phtml	(revision 8528)
+++ /views/mods/mod_ordervars/checkout_inner_prebutton.phtml	(revision 5261)
@@ -18,5 +18,5 @@
 				<label class="wpshopgermany_checkout" for="wpsg_mod_ordervars_<?php echo $ov['id']; ?>">
 					<input type="hidden" value="0" name="wpsg_mod_ordervars[<?php echo $ov['id']; ?>]" />
-					<input class="<?php echo ((in_array("wpsg_mod_ordervars_".$ov['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_mod_ordervars_<?php echo $ov['id']; ?>" <?php echo ((wpsg_getStr($_SESSION['wpsg']['wpsg_mod_ordervars'][$ov['id']]) == '1')?'checked="checked"':''); ?> type="checkbox" value="1" name="wpsg_mod_ordervars[<?php echo $ov['id']; ?>]" /><?php echo $this->callMod('wpsg_mod_ordervars', 'getNameById', array($ov['id'])); ?><?php if ($ov['pflicht'] == '1') { ?><span class="wpsg_required">*</span><?php } ?>
+					<input class="<?php echo ((in_array("wpsg_mod_ordervars_".$ov['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_mod_ordervars_<?php echo $ov['id']; ?>" <?php echo (($_SESSION['wpsg']['wpsg_mod_ordervars'][$ov['id']] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" name="wpsg_mod_ordervars[<?php echo $ov['id']; ?>]" /><?php echo $this->callMod('wpsg_mod_ordervars', 'getNameById', array($ov['id'])); ?><?php if ($ov['pflicht'] == '1') { ?><span class="wpsg_required">*</span><?php } ?>
 				</label>
 				<?php } else { ?>	
@@ -30,10 +30,10 @@
 						<option value=""><?php echo __('Bitte wÃ€hlen', 'wpsg'); ?></option>
 						<?php $ov['auswahl'] = explode('|', $ov['auswahl']); foreach ((array)$ov['auswahl'] as $option) { ?>
-						<option <?php echo ((wpsg_getStr($_SESSION['wpsg']['wpsg_mod_ordervars'][$ov['id']]) == $option)?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($option); ?>"><?php echo wpsg_hspc($option); ?></option>
+						<option <?php echo (($_SESSION['wpsg']['wpsg_mod_ordervars'][$ov['id']] == $option)?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($option); ?>"><?php echo wpsg_hspc($option); ?></option>
 						<?php } ?>
 					</select>
 					<?php } else if ($ov['typ'] == '2') { // Textfeld ?>
-					<input class="<?php echo ((in_array("wpsg_mod_ordervars_".$ov['id'], (array)$this->view['error']))?'wpsg_error':''); ?> <?php echo (($ov['pflicht'] == '1')?'validate[required]':''); ?>" type="text" name="wpsg_mod_ordervars[<?php echo $ov['id']; ?>]" value="<?php echo wpsg_hspc(wpsg_getStr($_SESSION['wpsg']['wpsg_mod_ordervars'][$ov['id']])); ?>" id="wpsg_mod_ordervars_<?php echo $ov['id']; ?>" />
-					<?php } ?>
+					<input class="<?php echo ((in_array("wpsg_mod_ordervars_".$ov['id'], (array)$this->view['error']))?'wpsg_error':''); ?> <?php echo (($ov['pflicht'] == '1')?'validate[required]':''); ?>" type="text" name="wpsg_mod_ordervars[<?php echo $ov['id']; ?>]" value="<?php echo wpsg_hspc($_SESSION['wpsg']['wpsg_mod_ordervars'][$ov['id']]); ?>" id="wpsg_mod_ordervars_<?php echo $ov['id']; ?>" />
+					<?php } ?> 
 				</div>
 				<?php } ?>
Index: /views/mods/mod_ordervars/order_view_sidebar.phtml
===================================================================
--- /views/mods/mod_ordervars/order_view_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_ordervars/order_view_sidebar.phtml	(revision 5261)
@@ -6,25 +6,18 @@
 
 ?>
-	
-	<?php echo wpsg_drawForm_AdminboxStart(__('Bestellvariablen', 'wpsg')); ?>
-	
-		<?php foreach ($this->view['wpsg_mod_ordervars']['data'] as $ov_id => $ov) { 
-		    
-		        $value = $this->callMod('wpsg_mod_ordervars', 'getValueByIdAndOrder', array($ov_id, $_REQUEST['edit_id']));
-		    
-		        if ($ov['typ'] == '1' && $value === 'not_set') $value = __('Keine Angabe', 'wpsg');
-		    
-		    ?>
-			            
-			<?php echo wpsg_drawForm_Text(
-				$this->callMod('wpsg_mod_ordervars', 'getNameById', array($ov['id'])),
-				$value,
-				'wpsg_ordervar_'.$ov_id
-			); ?>
+<div id="wpsg_ordervars" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br></span>
+		<span><?php echo __('Bestellvariablen', 'wpsg'); ?></span>
+	</h3>
+	<div class="inside">
+		<?php foreach ($this->view['wpsg_mod_ordervars']['data'] as $ov_id => $ov) { ?>
+		
+			<?php echo wpsg_drawForm_Input('wpsg_ordervar_'.$ov_id, $this->callMod('wpsg_mod_ordervars', 'getNameById', array($ov['id'])), $this->callMod('wpsg_mod_ordervars', 'getValueByIdAndOrder', array($ov_id, $_REQUEST['edit_id'])), array('text' => true, 'class_text' => 'wpsg_editable')); ?>
 			
 			<script type="text/javascript">/* <![CDATA[ */
 
 				<?php if ($ov['typ'] == '1') { /* Auswahl */ ?>
-				jQuery('#wpsg_ordervar_<?php echo $ov_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_ordervars&do=inlinedit&noheader=1', { 
+				jQuery('#wpsg_ordervar_<?php echo $ov_id; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_ordervars&do=inlinedit&noheader=1', { 
 					submitdata: {
 						order_id: <?php echo $_REQUEST['edit_id']; ?>,
@@ -32,5 +25,5 @@
 					},
 					submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
-					data   : <?php echo wpsg_prepare_for_inlineEdit(wpsg_array_merge((array)$ov['auswahl'], array('not_set' => __('Keine Angabe', 'wpsg')))); ?>,
+					data   : '<?php echo json_encode(wpsg_array_merge((array)$ov['auswahl'], array('not_set' => __('Keine Angabe', 'wpsg')))); ?>',
 					type   : 'select',
 					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
@@ -39,5 +32,5 @@
 				});		
 				<?php } else if ($ov['typ'] == '2') { /* Text */ ?>			                                            
-				jQuery('#wpsg_ordervar_<?php echo $ov_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
+				jQuery('#wpsg_ordervar_<?php echo $ov_id; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
 					submitdata: {
 						order_id: <?php echo $_REQUEST['edit_id']; ?>,
@@ -50,5 +43,5 @@
 				});
 				<?php } else if ($ov['typ'] == '3') { /* Checkbox */ ?>
-				jQuery('#wpsg_ordervar_<?php echo $ov_id; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_ordervars&do=inlinedit&noheader=1', { 
+				jQuery('#wpsg_ordervar_<?php echo $ov_id; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_ordervars&do=inlinedit&noheader=1', { 
 					submitdata: {
 						order_id: <?php echo $_REQUEST['edit_id']; ?>,
@@ -56,5 +49,5 @@
 					},
 					submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
-					data   : <?php echo wpsg_prepare_for_inlineEdit(array('1' => __('Ja', 'wpsg'), '0' => __('Nein', 'wpsg'))); ?>,
+					data   : '<?php echo json_encode(array('1' => __('Ja', 'wpsg'), '0' => __('Nein', 'wpsg'))); ?>',
 					type   : 'select',
 					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
@@ -67,4 +60,4 @@
 			
 		<?php } ?>
-	
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+	</div>
+</div>
Index: /views/mods/mod_ordervars/ov_list.phtml
===================================================================
--- /views/mods/mod_ordervars/ov_list.phtml	(revision 8528)
+++ /views/mods/mod_ordervars/ov_list.phtml	(revision 5261)
@@ -7,160 +7,114 @@
 ?>
 <?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
-<table class="wpsg_ov_table table table-body-striped">
-    <thead>
-        <tr>
-            <th><?php echo __('ID', 'wpsg'); ?></th>
-            <th class="wpsg_label"><?php echo __('Name', 'wpsg'); ?></th>
-            <th class="wpsg_typ"><?php echo __('Typ', 'wpsg'); ?></th>
-            <th class="wpsg_pflicht"><?php echo __('Pflicht', 'wpsg'); ?></th>
-            <th class="wpsg_delcol"></th>
-        </tr>
-    </thead>
+<table class="wpsg_ov_table">
+	 <tr>
+	 	<th class="wpsg_id"><?php echo __('ID', 'wpsg'); ?></th>
+    	<th class="wpsg_label"><?php echo __('Name', 'wpsg'); ?></th>
+    	<th class="wpsg_typ"><?php echo __('Typ', 'wpsg'); ?></th>
+    	<th class="wpsg_pflicht"><?php echo __('Pflicht', 'wpsg'); ?></th>
+    	<th class="wpsg_delcol"></th>
+  	</tr>
   	<?php $i = 0; foreach ($this->view['data'] as $ov) { $i ++; ?>
-    <tbody id="ov_<?php echo $ov['id']; ?>">
-        <tr class="wpsg_table wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
-            <td class="wpsg_id"><?php echo $ov['id']; ?></td>
-            <td><span id="wpsg_ov_name_<?php echo $ov['id']; ?>"><?php echo wpsg_hspc(__($ov['name'], 'wpsg')); ?></span></td>
-            <td><span id="wpsg_ov_typ_<?php echo $ov['id']; ?>"><?php echo $this->mod->arTypen[$ov['typ']]; ?></span></td>
-            <td class="wpsg_pflicht"><input type="checkbox" <?php echo (($ov['pflicht'] == '1')?'checked="checked"':''); ?> id="wpsg_ov_pflicht_<?php echo $ov['id']; ?>" /></td>
-            <td class="wpsg_delcol">
+	<tr class="wpsg_table wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+		<td class="wpsg_id"><?php echo $ov['id']; ?></td>
+		<td id="wpsg_ov_name_<?php echo $ov['id']; ?>" class="wpsg_label wpsg_editable"><?php echo wpsg_hspc(__($ov['name'], 'wpsg')); ?></td>
+		<td id="wpsg_ov_typ_<?php echo $ov['id']; ?>" class="wpsg_typ wpsg_editable"><?php echo $this->mod->arTypen[$ov['typ']]; ?></td>
+		<td class="wpsg_pflicht"><input type="checkbox" <?php echo (($ov['pflicht'] == '1')?'checked="checked"':''); ?> id="wpsg_ov_pflicht_<?php echo $ov['id']; ?>" /></td>
+		<td class="wpsg_delcol">
+		
+			<a class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Bestellvariable lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeOV(<?php echo $ov['id']; ?>);"></a>
+		
+			<script type="text/javascript">
 
-                <a class="" href="#" title="<?php echo __('Bestellvariable lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeOV(<?php echo $ov['id']; ?>);">
-                    <span class="glyphicon glyphicon-trash"></span>
-                </a>
+				jQuery('#wpsg_ov_name_<?php echo $ov['id']; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
+					submitdata: {
+						field: 'name',
+						ov_id: '<?php echo $ov['id']; ?>'
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
 
-                <script type="text/javascript">
+				jQuery('#wpsg_ov_pflicht_<?php echo $ov['id']; ?>').bind('change', function() {
 
-                    jQuery('#wpsg_ov_name_<?php echo $ov['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
-                        submitdata: {
-                            field: 'name',
-                            ov_id: '<?php echo $ov['id']; ?>'
-                        },
-                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                    });
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&noheader=1&do=inlinedit',
+						data: {
+							field: 'pflicht',
+							ov_id: '<?php echo $ov['id']; ?>',
+							value: ((jQuery(this).attr("checked") == "checked")?'1':'0')
+						}
+					} );
 
-                    jQuery('#wpsg_ov_pflicht_<?php echo $ov['id']; ?>').bind('change', function() {
+				} );
 
-                        jQuery.ajax( {
-                            url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&noheader=1&do=inlinedit',
-                            data: {
-                                field: 'pflicht',
-                                ov_id: '<?php echo $ov['id']; ?>',
-                                value: ((jQuery(this).prop("checked"))?'1':'0')
-                            }
-                        } );
+				jQuery('#wpsg_ov_typ_<?php echo $ov['id']; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&do=inlinedit&noheader=1', { 
+					submitdata: {
+						field: 'typ',
+						ov_id: '<?php echo $ov['id']; ?>'						
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',					
+					data: '<?php echo json_encode($this->mod->arTypen); ?>',
+					type: 'select',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+			    	callback: function(el) {  
+				    	if (el == '<?php echo __('Auswahl', 'wpsg'); ?>')
+				    	{
+					    	jQuery('#wpsg_ov_auswahlrow_<?php echo $ov['id']; ?>').show();
+				    	}
+				    	else
+				    	{
+				    		jQuery('#wpsg_ov_auswahlrow_<?php echo $ov['id']; ?>').hide();
+				    	}	    	
+			    	}
+				});
 
-                    } );
+				function wpsg_removeOV(id)
+				{
+					jQuery.ajax({
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&noheader=1&do=del',
+						data: {
+							ov_id: id
+						},
+						success: function(data){
+							if (data == 1)
+							{
+								location.reload();
+							}
+						}
+					});
+				}
+			
+			</script>
+			
+		</td>
+	</tr> 
+	<tr class="wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>" id="wpsg_ov_auswahlrow_<?php echo $ov['id']; ?>" style="<?php echo (($ov['typ'] != '1')?'display:none;':''); ?>">
+		<td	class="wpsg_id"></td>
+		<td class="wpsg_select" colspan="4">
+			<?php echo __('Auswahl', 'wpsg'); ?>:
+			<span class="wpsg_editable" id="wpsg_ov_auswahl_<?php echo $ov['id']; ?>"><?php echo wpsg_hspc($ov['auswahl']); ?></span>
+			<script type="text/javascript">
 
-                    jQuery('#wpsg_ov_typ_<?php echo $ov['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
-                        submitdata: {
-                            field: 'typ',
-                            ov_id: '<?php echo $ov['id']; ?>'
-                        },
-                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                        data: <?php echo wpsg_prepare_for_inlineEdit($this->mod->arTypen); ?>,
-                        type: 'select',
-                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        callback: function(el) {
-                            if (el == '<?php echo __('Auswahl', 'wpsg'); ?>')
-                            {
-                                jQuery('#wpsg_ov_auswahlrow_<?php echo $ov['id']; ?>').show();
-                            }
-                            else
-                            {
-                                jQuery('#wpsg_ov_auswahlrow_<?php echo $ov['id']; ?>').hide();
-                            }
-                        }
-                    });
-
-                    function wpsg_removeOV(id)
-                    {
-
-                        if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false;
-
-                        jQuery('#wpsg_ov_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-                        jQuery.ajax( {
-                            url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&noheader=1&do=del',
-                            data: {
-                                ov_id: id
-                            },
-                            success: function(data) {
-
-                                jQuery('#wpsg_ov_list').html(data);
-
-                            }
-                        } );
-
-                        return false;
-
-                    }
-
-                </script>
-
-            </td>
-        </tr>
-        <tr class="wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>" id="wpsg_ov_auswahlrow_<?php echo $ov['id']; ?>" style="<?php echo (($ov['typ'] != '1')?'display:none;':''); ?>">
-            <td	class="wpsg_id"></td>
-            <td class="wpsg_select" colspan="4">
-                <?php echo __('Auswahl', 'wpsg'); ?>:
-                <span class="wpsg_editable" id="wpsg_ov_auswahl_<?php echo $ov['id']; ?>"><?php echo wpsg_hspc($ov['auswahl']); ?></span>
-                <script type="text/javascript">
-
-                    jQuery('#wpsg_ov_auswahl_<?php echo $ov['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
-                        submitdata: {
-                            field: 'auswahl',
-                            ov_id: '<?php echo $ov['id']; ?>'
-                        },
-                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                    });
-
-                </script>
-            </td>
-        </tr>
-    </tbody>
+				jQuery('#wpsg_ov_auswahl_<?php echo $ov['id']; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&do=inlinedit&noheader=1', {
+					submitdata: {
+						field: 'auswahl',
+						ov_id: '<?php echo $ov['id']; ?>'
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+			
+			</script>			
+		</td>
+	</tr>
 	<?php } ?>
 </table>
-<p class="wpsg_hinweis"><?php echo __('Die Reihenfolge lÃ€sst sich mittels Drag&Drop verÃ€ndern.', 'wpsg'); ?>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
-
-		jQuery('.wpsg_ov_table').sortable( {
-			helper: wpsg_Tablefix,
-			items: 'tbody',
-			handler: '.wpsg_id',
-			update: function(event, ui) {
-
-				var wpsg_reorder = jQuery(this).sortable('serialize');
-
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ordervars&noheader=1&do=reorder',
-					data: { 
-						wpsg_reorder: wpsg_reorder
-					},
-					success: function(data) {
-
-						if (data !== "1") alert(data);
-						
-					}
-				} );
-				
-			}
-		} );
-		
-	} );
-			
-/* ]]> */</script>
-
 <?php } else { ?>
 <?php echo __('Bisher noch keine Bestellvariablen angelegt.', 'wpsg'); ?>
Index: /views/mods/mod_ordervars/settings_edit.phtml
===================================================================
--- /views/mods/mod_ordervars/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_ordervars/settings_edit.phtml	(revision 5261)
@@ -6,10 +6,12 @@
 
 ?>
-<script>
+<script type="text/javascript">
+/* <![CDATA[ */
 
     /**
      * Wird beim anlegen einer neuen Bestellvariable aufgerufen
      */
-	function wpsg_addOV() {
+	function wpsg_addOV()
+	{
 
 		jQuery('#wpsg_ov_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
@@ -25,10 +27,23 @@
 		
 	} // function wpsg_addOV()
-
+            
+/* ]]> */
 </script>
-
-<div class="content" id="wpsg_ov_list"><?php echo $this->mod->ov_list(); ?></div>
-
+<p><?php echo __('Wird eine Bestellvariable vom Type', 'wpsg') ?> <strong><?php echo __('"Auswahl"', 'wpsg') ?></strong> <?php echo __('angelegt, kÃ¶nnen die Optionen mit dem Pipe "|" Symbol getrennt angegeben werden.', 'wpsg') ?></p>
+<p><strong><?php echo __('Bsp.:', 'wpsg')?></strong> <?php echo __('Auswahl_1 | Auswahl_2 | Auswahl_3', 'wpsg') ?></p>
 <br />
-
-<a title="<?php echo __('Neue Bestellvariable anlegen', 'wpsg'); ?>" href="" class="" onclick="return wpsg_addOV();"><span class="glyphicon wpsg-glyphicon glyphicon-plus"></span><?php echo __('Neue Bestellvariable anlegen.', 'wpsg'); ?></a>
+<div class="wpsg_admin_box">		
+		  		
+	<div class="head">
+		<div class="title">
+			<div class="fulltab">
+				<?php echo __('Bestellvariablen', 'wpsg'); ?>
+				<a title="<?php echo __('Neue Bestellvariable anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addOV();"></a>
+			</div>
+		</div>
+	</div>
+	<div class="content" id="wpsg_ov_list">
+		<?php echo $this->mod->ov_list(); ?>
+	</div>
+			
+</div>
Index: /views/mods/mod_packagetracking/order_view_switchStatus.phtml
===================================================================
--- /views/mods/mod_packagetracking/order_view_switchStatus.phtml	(revision 8528)
+++ /views/mods/mod_packagetracking/order_view_switchStatus.phtml	(revision 5261)
@@ -1,33 +1,29 @@
-<?php 
-/**
- * Integration in das Formular fÃŒr die StatusÃ€nderung einer Bestellung
- */
+<?php
+
+	/**
+	 * Integration in das Formular fÃŒr die StatusÃ€nderung einer Bestellung
+	 */
+
 ?>
-
 <div class="wpsg_form_field wpsg_mod_packagetracking">
-
-	<?php 
-	$tcode = $this->view['wpsg_mod_packagetracking']['oOrder']->wpsg_mod_packagetracking_code;
-	$prov = array();
-	foreach ($this->view['wpsg_mod_packagetracking']['provider'] as $p) $prov[$p['id']] = $p['name'];
-
-	echo wpsg_drawForm_Input('wpsg_mod_packagetracking_code', __('Tracking-ID', 'wpsg'), $tcode);
-	echo wpsg_drawForm_Select('wpsg_mod_packagetracking_provider', __('Provider', 'wpsg'), $prov, $this->view['wpsg_mod_packagetracking']['preset'], array());
-	?>
-
-	<?php 
-
-        $temp = $this->view['wpsg_mod_packagetracking']['oOrder']->wpsg_mod_packagetracking_code;
-		if (wpsg_isSizedString($temp)) {
-			
-			$link =	'<a target="_blank" href="';
-			$link .= $this->callMod('wpsg_mod_packagetracking', 'getTrackingURL', array(&$_REQUEST['edit_id']));
-			$link .= '">';
-			$link .= __('Paketverfolgung', 'wpsg');
-			$link .= '</a>';
-		
-            echo wpsg_drawForm_Text('', $link, 'wpsg_trackingurl', array());
-		}
-	?>
+	<div class="wpsg_form_left">
+		<?php echo __('Paketverfolgung', 'wpsg'); ?>:
+	</div>
+	<div class="wpsg_form_right">
+		<input placeholder="<?php echo __('Tracking ID', 'wpsg'); ?>" type="text" id="wpsg_mod_packagetracking_code" value="<?php echo wpsg_hspc($this->view['wpsg_mod_packagetracking']['oOrder']->wpsg_mod_packagetracking_code); ?>" name="wpsg_mod_packagetracking_code" />
+		<select name="wpsg_mod_packagetracking_provider" id="wpsg_mod_packagetracking_provider">
+			<option value="0"><?php echo __('Keine Paketverfolgung', 'wpsg'); ?></option>
+			<?php if (wpsg_isSizedArray($this->view['wpsg_mod_packagetracking']['provider'])) { ?>
+			<?php foreach ($this->view['wpsg_mod_packagetracking']['provider'] as $p) { ?>
+			<option value="<?php echo wpsg_hspc($p['id']); ?>" <?php echo (($this->view['wpsg_mod_packagetracking']['preset'] == $p['id'])?'selected="selected"':''); ?>><?php echo wpsg_hspc($p['name']); ?></option>
+			<?php } ?>
+			<?php } ?>
+		</select>
+		<div class="wpsg_clear"></div>
+		<?php if (wpsg_isSizedString($this->view['wpsg_mod_packagetracking']['oOrder']->wpsg_mod_packagetracking_code)) { ?>
+		<a href="<?php echo $this->callMod('wpsg_mod_packagetracking', 'getTrackingURL', array(&$_REQUEST['edit_id'])); ?>"><?php echo __('Paketverfolgung', 'wpsg'); ?></a>
+		<?php } ?>
+	</div>
+	<div class="wpsg_clear"></div> 
 </div>		
 
@@ -55,2 +51,3 @@
 
 /* ]]> */</script>
+							
Index: /views/mods/mod_packagetracking/settings_edit.phtml
===================================================================
--- /views/mods/mod_packagetracking/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_packagetracking/settings_edit.phtml	(revision 5261)
@@ -60,5 +60,5 @@
 			<div class="fulltab">
 				<?php echo __('Anbieter fÃŒr Paketverfolgung', 'wpsg'); ?>
-				<br /><br />
+				<a title="<?php echo __('Neuem Anbieter anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_mod_packagetracking_add();"></a>
 			</div>
 		</div>
Index: /views/mods/mod_packagetracking/settings_edit_list.phtml
===================================================================
--- /views/mods/mod_packagetracking/settings_edit_list.phtml	(revision 8528)
+++ /views/mods/mod_packagetracking/settings_edit_list.phtml	(revision 5261)
@@ -7,5 +7,5 @@
 ?>
 <?php if (wpsg_isSizedArray($this->view['wpsg_mod_packagetracking']['provider'])) { ?>
-<table class="trackingprovider_table" style="table-layout:fixed; width:75rem;">
+<table class="trackingprovider_table">
 	 <colgroup>
     	<col class="wpsg_label" />
@@ -18,13 +18,13 @@
 		<td class="wpsg_value"><?php echo $p['id']; ?></td>	
 		<td class="wpsg_delcol">
-			<a class="wpsg_glyphicon_right glyphicon glyphicon-trash" href="#" title="<?php echo __('Anbieter lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_mod_packagetracking_delete(<?php echo $p['id']; ?>);"></a>					
+			<a class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Anbieter lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_mod_packagetracking_delete(<?php echo $p['id']; ?>);"></a>					
 		</td>
 	</tr>
 	<tr>
-		<td class="wpsg_label"><?php echo __('Name', 'wpsg'); ?>:&nbsp;&nbsp;&nbsp;</td>
+		<td class="wpsg_label"><?php echo __('Name', 'wpsg'); ?>:</td>
 		<td class="wpsg_value wpsg_editable" id="tp_<?php echo $p['id']; ?>_name"><?php echo wpsg_hspc(__($p['name'], 'wpsg')); ?></td>
 		<td class="wpsg_delcol">
 			
-			<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_mod_packagetracking_name" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_name" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_name"></a>
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_name" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_name"></a>
 		
 		</td>
@@ -35,5 +35,5 @@
 		<td class="wpsg_delcol">
 		
-			<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_mod_packagetracking_url" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_url" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_url"></a>
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_url" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_url"></a>
 							
 			<script type="text/javascript">/* <![CDATA[ */
@@ -41,5 +41,5 @@
 				jQuery(document).ready(function() {
 
-					jQuery('#tp_<?php echo $p['id']; ?>_name').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_packagetracking&do=inlinedit&noheader=1', {
+					jQuery('#tp_<?php echo $p['id']; ?>_name').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_packagetracking&do=inlinedit&noheader=1', {
 						submitdata: { 
 				    		field: 'name',
@@ -52,5 +52,5 @@
 					} );
 
-					jQuery('#tp_<?php echo $p['id']; ?>_url').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_packagetracking&do=inlinedit&noheader=1', {
+					jQuery('#tp_<?php echo $p['id']; ?>_url').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_packagetracking&do=inlinedit&noheader=1', {
 						submitdata: { 
 				    		field: 'url',
@@ -74,9 +74,14 @@
 	<?php } ?>
 </table>
+<script type="text/javascript">/* <![CDATA[ */
 
+	jQuery(document).ready(function() {
+	
+		jQuery('.wpsg_form_help').tipTip();
+	
+	} );
+
+/* ]]> */</script>
 <?php } else { ?>
 <p><?php echo __('Es wurden noch keine Anbieter fÃŒr die Paketverfolgung angelegt.', 'wpsg'); ?>
 <?php } ?>
-
-<br /><br />
-<a href="#" onclick="return wpsg_mod_packagetracking_add();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>Neuen Anbieter anlegen</a>
Index: /views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml
===================================================================
--- /views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml	(revision 8528)
+++ /views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml	(revision 5261)
@@ -8,4 +8,5 @@
 
 <tr class="wpsg_mod_versandarten_packagetracking">
+	<td class="wpsg_label"><?php echo __('Anbieter fÃŒr Paketverfolgung', 'wpsg'); ?>:</td>
 	<td class="wpsg_value">
 		<select name="wpsg_mod_packagetracking_provider" class="wpsg_mod_packagetracking_provider" id="wpsg_mod_packagetracking_providerselect_<?php echo $this->view['wpsg_mod_packagetracking']['va']['id']; ?>">
@@ -20,5 +21,5 @@
 	<td class="wpsg_delcol">
 	
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_versandarten" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_versandarten"></a>
+		<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_versandarten" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_packagetracking_versandarten"></a>
 			
 		<script type="text/javascript">/* <![CDATA[ */
Index: /views/mods/mod_pap/settings_edit.phtml
===================================================================
--- /views/mods/mod_pap/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_pap/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,14 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungen des PAP Moduls
+	 */
+
+?>
+<?php echo wpsg_drawForm_Input('wpsg_paplogin_pap_url', __('URL zur Initial Page (index.html) der PAP Installation', 'wpsg'), $this->get_option('wpsg_paplogin_pap_url'), array('help' => 'wpsg_paplogin_pap_url')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_paplogin_admin', __('PAP Admin Username', 'wpsg'), $this->get_option('wpsg_paplogin_admin'), array('help' => 'wpsg_paplogin_admin')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_paplogin_passwort', __('PAP Admin Passwd', 'wpsg'), $this->get_option('wpsg_paplogin_passwort'), array('help' => 'wpsg_paplogin_passwort')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_paplogin_register', __('PAP Account fÃŒr jeden Neukunden (Bestellung) anlegen', 'wpsg'), $this->get_option('wpsg_paplogin_register'), array('help' => 'wpsg_paplogin_register')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_pap_registrierung', __('PAP Account fÃŒr jeden Neukunden (Registrierung) anlegen', 'wpsg'), $this->get_option('wpsg_pap_registrierung'), array('help' => 'wpsg_pap_registrierung')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_pap_include_profil', __('PAP im Profil integrieren', 'wpsg'), array('-1' => __('Nicht integrieren', 'wpsg'), '1' => __('IFrame LÃ¶sung', 'wpsg'), '2' => __('Verlinkung', 'wpsg')), $this->get_option('wpsg_pap_include_profil'), array('help' => 'wpsg_pap_include_profil')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_pap_order_tracking', __('Tracking Code nach Bestellung einbinden', 'wpsg'), $this->get_option('wpsg_pap_order_tracking')); ?>
Index: /views/mods/mod_paypal/order_done.phtml
===================================================================
--- /views/mods/mod_paypal/order_done.phtml	(revision 8528)
+++ /views/mods/mod_paypal/order_done.phtml	(revision 5261)
@@ -7,33 +7,19 @@
 ?>
 
-<?php if (!wpsg_isSizedInt($this->view['wpsg_mod_paypal']['done'])) { ?>
+<p><?php echo __('Um den Betrag mit PayPal zu bezahlen klicken Sie bitte auf folgendes Logo.', 'wpsg'); ?></p> 
+<p>
+	<a title="<?php echo __('Mit PayPal bezahlen', 'wpsg'); ?>" href="<?php echo $this->view['paypalLink']; ?>">
+		<img src="<?php echo $this->getRessourceURL('gfx/pp-logo-big.png'); ?>" align="left" alt="<?php echo __('Mit PayPal bezahlen', 'wpsg'); ?>" style="margin-right:7px;">
+	</a>
+</p>
+<?php if ($this->get_option('wpsg_mod_paypal_autostart') == '1') { ?>
+<script type="text/javascript">/* <![CDATA[ */
+ 
+	jQuery(document).ready(function() { 
+		window.setTimeout(function() {
+    	location.href = "<?php echo $this->view['paypalLink']; ?>";
+		}, 1000);
+	} );
 	
-	<p><?php echo __('Um den Betrag mit PayPal zu bezahlen klicken Sie bitte auf folgendes Logo.', 'wpsg'); ?></p> 
-		
-	<p>
-		<a title="<?php echo __('Mit PayPal bezahlen', 'wpsg'); ?>" href="<?php echo $this->view['paypalLink']; ?>">
-			<img src="<?php echo $this->getRessourceURL('mods/mod_paypal/gfx/pp-logo-big.png'); ?>" align="left" alt="<?php echo __('Mit PayPal bezahlen', 'wpsg'); ?>" style="margin-right:7px;">
-		</a>
-	</p>
-		
-	<?php if ($this->get_option('wpsg_mod_paypal_autostart') == '1') { ?>
-	
-		<script>
-		 
-			jQuery(document).ready(function() { 
-				window.setTimeout(function() {
-				location.href = "<?php echo $this->view['paypalLink']; ?>";
-				}, 1000);
-			} );
-		
-		</script>
-	
-	<?php } ?>
-		
-<?php } else { ?>
-
-	<p>
-		<?php echo __('Die Zahlung wurde bereits mit PayPal abgeschlossen.', 'wpsg'); ?>
-	</p>
-
+/* ]]> */</script>
 <?php } ?>
Index: /views/mods/mod_paypal/order_view_afterpayment.phtml
===================================================================
--- /views/mods/mod_paypal/order_view_afterpayment.phtml	(revision 8528)
+++ /views/mods/mod_paypal/order_view_afterpayment.phtml	(revision 5261)
@@ -4,19 +4,12 @@
 	 * Template fÃŒr die Integration der PayPal Zahlungsart in die Bestellverwaltung
 	 */
-	
-	$wpsg_mod_paypal_paymentid = $this->view['oOrder']->getMeta('wpsg_mod_paypal_paymentid');
-	$wpsg_mod_paypal_saleid = $this->view['oOrder']->getMeta('wpsg_mod_paypal_saleid');
-	
+
 ?>
 
-<?php if (wpsg_isSizedString($wpsg_mod_paypal_paymentid)) { ?>
+<?php if (wpsg_isSizedString($this->view['oOrder']->getMeta('wpsg_mod_paypal_paymentid'))) { ?>
 	
 	<div class="wpsg_form_field ">
 		<div class="wpsg_form_left">
-			<label for=""><?php echo __('PaymentID', 'wpsg'); ?>: [<a href="<?php 
-				
-				echo wpsg_admin_url('Order', 'view', ['action' => 'ajax', 'mod' => 'wpsg_mod_paypal', 'do' => 'refresh', 'edit_id' => $this->view['oOrder']->getId()], ['noheader' => '1']);
-					
-			?>"><?php echo __('Status Aktualisieren', 'wpsg'); ?></a>]</label>
+			<label for=""><?php echo __('PaymentID', 'wpsg'); ?>: [<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_paypal&do=refresh&edit_id=<?php echo $this->view['oOrder']->id; ?>"><?php echo __('Status Aktualisieren', 'wpsg'); ?></a>]</label>
 		</div>
 		<div class="wpsg_form_right">
@@ -28,5 +21,5 @@
 <?php } ?>
 
-<?php if (wpsg_isSizedString($wpsg_mod_paypal_saleid)) { ?>
+<?php if (wpsg_isSizedString($this->view['oOrder']->getMeta('wpsg_mod_paypal_saleid'))) { ?>
 
 	<?php echo wpsg_drawForm_Input('', __('SaleID', 'wpsg'), $this->view['oOrder']->getMeta('wpsg_mod_paypal_saleid'), array('text' => true)); ?>
Index: /views/mods/mod_paypal/settings_edit.phtml
===================================================================
--- /views/mods/mod_paypal/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_paypal/settings_edit.phtml	(revision 5261)
@@ -10,36 +10,58 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_aktiv', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_paypal_aktiv'), array('help' => 'wpsg_shippay_activ')); ?>
 <?php echo wpsg_drawForm_Textarea('wpsg_mod_paypal_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_paypal_hint'), array('help' => 'wpsg_shippay_hint')); ?>
+<br />
+<?php echo wpsg_drawForm_Select('wpsg_mod_paypal_mode',	__('Integrationsmodus', 'wpsg'), array('0' => __('Classic API', 'wpsg'), '1' => __('REST API', 'wpsg')), $this->get_option('wpsg_mod_paypal_mode'), array('help' => 'wpsg_mod_paypal_mode')); ?>
 
-<br />
+<div class="wpsg_mod_paypal_mode_layer wpsg_mod_paypal_mode_0">
 	
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_clientid', __('Client ID', 'wpsg'), $this->get_option('wpsg_mod_paypal_clientid'), array('hint' => wpsg_translate(__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'), 'help' => 'wpsg_mod_paypal_clientid')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_secret', __('Secret', 'wpsg'), $this->get_option('wpsg_mod_paypal_secret'), array('hint' => wpsg_translate(__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'), 'help' => 'wpsg_mod_paypal_secret')); ?>
-		
-<div class="wpsg_form_field ">
-	<div class="wpsg_form_left">
-		<label for=""><?php echo __('Stornierung bei Statuswechsel', 'wpsg'); ?>:</label>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_email', __('E-Mail (PayPal Konto)', 'wpsg'), $this->get_option('wpsg_mod_paypal_email'), array('help' => 'wpsg_mod_paypal_email')); ?>
+	
+	<div class="wpsg_hinweis">
+		<?php echo __('Zur Anbindung an den PayPal Service wird <a href="https://www.paypalobjects.com/de_DE/html/IntegrationCenter/ic_pps_home.html">PayPal Starter</a> genutzt. FortfÃŒhrende Details finden Sie im <a href="https://www.paypalobjects.com/de_DE/pdf/PayPal-Starter-Integrationshandbuch.pdf">Paypal Starter Integrationshandbuch.</a>', 'wpsg'); ?>
+		<?php echo __('Im Integrationshandbuch erfahren Sie auch, wie Sie die Sandbox nutzen, um den Zahlungsverkehr zu testen.', 'wpsg'); ?>
 	</div>
-	<div class="wpsg_form_right">
-		<a href="#" class="wpsg_mod_paypal_stornostate"><?php echo __('Bearbeiten', 'wpsg'); ?></a>
-	</div>
-	<div class="wpsg_clear"></div>
-</div>
-<div class="wpsg_mod_paypal_stornostate_layer" style="display:none;">
-	
-	<?php foreach ($this->arStatus as $status_id => $status_label) { $arStornoStatus = (array)$this->get_option('wpsg_mod_paypal_stornostate'); ?>
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_stornostate['.$status_id.']', __($status_label, 'wpsg'), $arStornoStatus[$status_id], array('labelright' => true)); ?>	
-	<?php } ?> 
-	
-	<br />
 	
 </div>
 
-<?php echo wpsg_drawForm_Input('', __('WebHook URL', 'wpsg'), $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypal', 'webHook', array(), true), array('readonly' => true, 'help' => 'wpsg_mod_paypal_webhook_url')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_createwebhook',  __('Beim speichern versuchen den WebHook anzumelden.', 'wpsg'), 0, array('labelright' => true, 'noDoubleDot' => true, 'help' => 'wpsg_mod_paypal_createwebhook')); ?>
+<div class="wpsg_mod_paypal_mode_layer wpsg_mod_paypal_mode_1">
+	
+	<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_clientid', __('Client ID', 'wpsg'), $this->get_option('wpsg_mod_paypal_clientid'), array('hint' => wpsg_translate('nohspc_'.__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'), 'help' => 'wpsg_mod_paypal_clientid')); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_secret', __('Secret', 'wpsg'), $this->get_option('wpsg_mod_paypal_secret'), array('hint' => wpsg_translate('nohspc_'.__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'), 'help' => 'wpsg_mod_paypal_secret')); ?>
 			
+	<div class="wpsg_form_field ">
+		<div class="wpsg_form_left">
+			<label for=""><?php echo __('Stornierung bei Statuswechsel', 'wpsg'); ?>:</label>
+		</div>
+		<div class="wpsg_form_right">
+			<a href="#" class="wpsg_mod_paypal_stornostate"><?php echo __('Bearbeiten', 'wpsg'); ?></a>
+		</div>
+		<div class="wpsg_clear"></div>
+	</div>
+	<div class="wpsg_mod_paypal_stornostate_layer" style="display:none;">
+		
+		<?php foreach ($this->arStatus as $status_id => $status_label) { $arStornoStatus = (array)$this->get_option('wpsg_mod_paypal_stornostate'); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_stornostate['.$status_id.']', __($status_label, 'wpsg'), $arStornoStatus[$status_id], array('labelright' => true)); ?>	
+		<?php } ?> 
+		
+		<br />
+		
+	</div>
+	
+	<?php echo wpsg_drawForm_Input('', __('WebHook URL', 'wpsg'), $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypal', 'webHook', array(), true), array('readonly' => true, 'help' => 'wpsg_mod_paypal_webhook_url')); ?>
+	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_createwebhook',  __('Beim speichern versuchen den WebHook anzumelden.', 'wpsg'), 0, array('labelright' => true, 'noDoubleDot' => true, 'help' => 'wpsg_mod_paypal_createwebhook')); ?>
+			
+</div>
+
 <script type="text/javascript">/* <![CDATA[ */
 
 	jQuery(document).ready(function() {
  
+		jQuery('#wpsg_mod_paypal_mode').bind('change', function() {
+
+			jQuery('.wpsg_mod_paypal_mode_layer').hide();
+			jQuery('.wpsg_mod_paypal_mode_' + jQuery(this).val()).show();
+			
+		} ).change();
+
 		jQuery('.wpsg_mod_paypal_stornostate').bind('click', function() {
 
@@ -58,11 +80,8 @@
 
 <br />
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_sandbox', __('Sandbox Modus', 'wpsg'), $this->get_option('wpsg_mod_paypal_sandbox'), array('help' => 'wpsg_mod_paypal_sandbox')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_paypal_subject', __('Betreff der Ãberweisung', 'wpsg'), $this->get_option('wpsg_mod_paypal_subject'), array('help' => 'wpsg_mod_paypal_subject')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_invoicenumber', __('Formatierung InvoiceNumber', 'wpsg'), $this->get_option('wpsg_mod_paypal_invoicenumber'), array('help' => 'wpsg_mod_paypal_invoicenumber')); ?>
 
 <br />
-
 <?php echo wpsg_drawForm_Input('wpsg_mod_paypal_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_paypal_gebuehr'), true), array('help' => 'wpsg_shippay_gebuehr', 'unit' => $this->get_option('wpsg_currency').' / %')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_paypal_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_paypal_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
@@ -70,7 +89,6 @@
 
 <br />
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_currency', __('WÃ€hrungscode (Standard: EUR)', 'wpsg'), $this->get_option('wpsg_mod_paypal_currency'), array('help' => 'wpsg_mod_paypal_currency')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_paypal_language', __('Sprache im PayPal Interface', 'wpsg'), array('DE' => __('Deutsch', 'wpsg'), 'US' => __('Englisch', 'wpsg'), 'FR' => __('FranzÃ¶sisch', 'wpsg')), $this->get_option('wpsg_mod_paypal_language'), array('help' => 'wpsg_mod_paypal_language')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_paypal_currency', __('WÃ€hrungscode (Standard: EUR)', 'wpsg'), $this->get_option('wpsg_mod_paypal_currency')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_paypal_language', __('Sprache im PayPal Interface', 'wpsg'), array('DE' => __('Deutsch', 'wpsg'), 'US' => __('Englisch', 'wpsg'), 'FR' => __('FranzÃ¶sisch', 'wpsg')), $this->get_option('wpsg_mod_paypal_language')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypal_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_paypal_autostart'), array('help' => 'wpsg_shippay_paystart')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_page_mod_paypal_success', __('Erfolgsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_paypal_success'), array('help' => 'wpsg_page_mod_paypal_success')); ?>
Index: /views/mods/mod_paypalapi/basket_inner_prebutton.phtml
===================================================================
--- /views/mods/mod_paypalapi/basket_inner_prebutton.phtml	(revision 8528)
+++ /views/mods/mod_paypalapi/basket_inner_prebutton.phtml	(revision 5261)
@@ -8,44 +8,9 @@
 
 <?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypalapi_paypalexpress'))) { ?>
-	
-	<div class="wpsg_mod_paypalapi_button_wrap">
-		<button type="submit" name="wpsg_mod_submit" value="wpsg_mod_paypalapi" class="wpsg_mod_paypalapi_button">
-			<img src="<?php echo $this->getRessourceURL('mods/mod_paypalapi/gfx/checkout-logo-small-de.png'); ?>" alt="<?php echo __('Direkt zu PayPal', 'wpsg'); ?>" />
-		</button>
-		<div class="wpsg_clear"></div>
-	</div>
-	
+<div class="wpsg_mod_paypalapi_button_wrap">
+	<button type="submit" name="wpsg_mod_submit" value="wpsg_mod_paypalapi" class="wpsg_mod_paypalapi_button">
+		<img src="<?php echo $this->getRessourceURL('mods/mod_paypalapi/gfx/checkout-logo-small-de.png'); ?>" alt="<?php echo __('Direkt zu PayPal', 'wpsg'); ?>" />
+	</button>
+	<div class="wpsg_clear"></div>
+</div>
 <?php } ?>
-
-<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypalapi_plus_basket'))) { ?>
-
-	<h2><?php echo __('Zahlungsart wÃ€hlen', 'wpsg'); ?></h2>
-
-	<script src="https://www.paypalobjects.com/webstatic/ppplus/ppplus.min.js" type="text/javascript"></script>
-	<div id="wpsg_ppplus" style="padding-right:0px;"></div>
-
-	<script type="application/javascript">
-		
-		/**
-		 * Wird vom PayPal PLUS IFrame aufgerufen wenn fertig geladen
-		 */
-		function wpsg_mod_paypalapi_load()
-		{
- 
-			jQuery('#wpsg_basket_submit').on('click', function(event) {
-
-				PAYPAL.apps.PPP.doCheckout();
-				
-				event.stopPropagation();
-				
-				return false;
-
-			} );
-
-		}
-		
-		<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/paypalplus.phtml'); ?>
-
-	</script>
-
-<?php } ?>
Index: ews/mods/mod_paypalapi/checkout2_inner_prebutton.phtml
===================================================================
--- /views/mods/mod_paypalapi/checkout2_inner_prebutton.phtml	(revision 8528)
+++ 	(revision )
@@ -1,60 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 09.06.24
-	 * @time: 12:04
-	 */
-	
-	namespace wpsg;
-	
-?>
-
-<?php echo GiroPayPalAPI::getInstance()->integrateSDK(); ?>
-
-<script>
- 
-	paypal.PaymentFields({
-		fundingSource: paypal.FUNDING.GIROPAY,
-		style: {
-			variables: {},
-			rules: {},
-		},
-		onInit: (data, actions) => {
-		
-			const form = document.querySelector("form#wpsg_checkout_form");
-		 
-			form.addEventListener("submit", (e) => {
-				
-				const formData = new FormData(form);
-				const paymentSource = formData.get("wpsg[checkout][payment]");
-				
-				if (paymentSource === '10_1') {
-
-					e.preventDefault();
-
-					actions.validate().then((valid) => {
-
-						if (valid) {
-
-							window.location.href = '<?php echo $this->getUrl(\wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'giroPaySet', [], true); ?>';
-
-						}
-
-					});
-
-				}
-
-			});
-
-		},
-		fields: {
-			name: {
-				value: "<?php echo ($_SESSION['wpsg']['checkout']['vname']??'').' '.($_SESSION['wpsg']['checkout']['name']??''); ?>"
-			},
-		},
-	}).render("#giropay-container");
-	
-</script>
Index: /views/mods/mod_paypalapi/checkout_handlePayment.phtml
===================================================================
--- /views/mods/mod_paypalapi/checkout_handlePayment.phtml	(revision 8528)
+++ /views/mods/mod_paypalapi/checkout_handlePayment.phtml	(revision 5261)
@@ -12,5 +12,5 @@
 		<h2><?php echo __('Zahlungsarten', 'wpsg'); ?></h2>
 		<div class="wpsg_payment_textwrap">
-			<p><?php echo __('Ihr PayPal Konto wird nach Bestellabschluss belastet.', 'wpsg'); ?></p>
+			<p><?php echo __('Ihr PayPal Konto wird nach BestellabschluÃ belastet.', 'wpsg'); ?></p>
 		</div>
 	</div>
@@ -23,5 +23,5 @@
 		
 			<p><?php echo __('Der Betrag der Bestellung hat sich verÃ€ndert. Sie mÃŒssen die Zahlung mit PayPal erneut authorisieren.', 'wpsg'); ?></p>
-			<p><?php echo __('Dies kÃ¶nnen Sie ÃŒber folgenden Button erledigen oder nach Bestellabschluss. Alternativ kÃ¶nnen Sie unten auch eine andere Zahlungsart wÃ€hlen.', 'wpsg'); ?>
+			<p><?php echo __('Dies kÃ¶nnen Sie ÃŒber folgenden Button erledigen oder nach BestellabschluÃ. Alternativ kÃ¶nnen Sie unten auch eine andere Zahlungsart wÃ€hlen.', 'wpsg'); ?>
 	
 			<div class="wrap_paypalapi_expressbutton">
@@ -42,5 +42,5 @@
 		
 		<?php if (wpsg_isSizedString($this->view['wpsg_mod_paypalapi']['error'])) { ?>
-		<div id="wpsg_notice" class="published error">
+		<div id="wpsg_error" class="published error">
 			<p><?php echo $this->view['wpsg_mod_paypalapi']['error']; ?>
 		</div>		
@@ -48,21 +48,6 @@
 	    
 	</div>
-	         
-	<iframe name="wpsg_hiddenTarget" style="display:none; width:0px; height:0px;"></iframe>  
+	           
 	<script type="application/javascript">/* <![CDATA[ */
-
-		function wpsg_ppp_handleError()
-		{
-			
-			location.href = '<?php echo $this->getUrl(wpsg_ShopController::URL_CHECKOUT); ?>';
-			
-		}
-
-		function wpsg_ppp_run()
-		{
-
-			PAYPAL.apps.PPP.doCheckout();
-
-		}
 	
 		var wpsg_mod_paypalapi_shipping_id = '<?php echo wpsg_getStr($this->view['basket']['checkout']['shipping']); ?>';
@@ -72,5 +57,5 @@
 			jQuery('input[name="wpsg_checkout2"], input[name="wpsg_checkout"]').hide();
 	 
-			jQuery('.shippay_item_wrap input[type="radio"]').bind('change', function() {
+			jQuery('.wpsg_shipping input[type="radio"]').bind('change', function() {
 	
 				if (jQuery(this).val() != wpsg_mod_paypalapi_shipping_id)
@@ -78,5 +63,5 @@
 					
 					jQuery('input[name="wpsg_checkout2"]').hide()
-					jQuery('#wpsg_checkout_form').attr("action", "<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'ShippingSelect'); ?>").trigger('submit');
+					jQuery('#wpsg_checkout_form').attr("action", "<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'ShippingSelect'); ?>").submit();
 					 
 				}
@@ -94,5 +79,5 @@
 			jQuery('input[name="wpsg_checkout2"], input[name="wpsg_checkout"]').show().bind('click', function() {
 	
-				PAYPAL.apps.PPP.doCheckout();
+				var test = ppp.doContinue();			
 				return false;
 				
Index: ews/mods/mod_paypalapi/gfx/giropay.svg
===================================================================
--- /views/mods/mod_paypalapi/gfx/giropay.svg	(revision 8528)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<svg width="75px" height="32px" viewBox="0 0 75 32" version="1.1" xmlns="http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg"><title>logo giropay</title><desc>Created with Sketch.</desc><defs><polygon id="path-1" points="0 0.017902439 46.0918699 0.017902439 46.0918699 19.8373984 0 19.8373984"></polygon><polygon id="path-3" points="0 19.9821138 46.0918699 19.9821138 46.0918699 0.162601626 0 0.162601626"></polygon></defs><g id="SPB_&amp;_AltPay_NewAssets" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="matrix(1.614571, 0, 0, 1.614571, -161.457123, -256.816772)"><g id="logo-giropay" transform="translate(100.000000, 159.000000)"><g id="Group-3" transform="translate(0.000000, 0.144715)"><mask id="mask-2" fill="#FFFFFF"><polygon points="0 0.017902439 46.0918699 0.017902439 46.0918699 19.8373984 0 19.8373984" transform="matrix(1, 0, 0, 1, 0, 0)"></polygon></mask><g id="Clip-2"></g><path d="M0,3.5735122 C0,1.60977236 1.5998374,0.017902439 3.57349593,0.017902439 L42.5182114,0.017902439 C44.4918699,0.017902439 46.0918699,1.60977236 46.0918699,3.5735122 L46.0918699,16.2818049 C46.0918699,18.2455447 44.4918699,19.8374146 42.5182114,19.8374146 L3.57349593,19.8374146 C1.5998374,19.8374146 0,18.2455447 0,16.2818049 L0,3.5735122 Z" id="Fill-1" fill="#003a7d" mask="url(#mask-2)"></path></g><path d="M1.46738211,3.84021138 L1.46738211,16.3065528 C1.46738211,17.5338699 2.46738211,18.5288293 3.70087805,18.5288293 L24.1036423,18.5288293 L24.1036423,1.61793496 L3.70087805,1.61793496 C2.46738211,1.61793496 1.46738211,2.61289431 1.46738211,3.84021138" id="Fill-4" fill="#ffffff"></path><path d="M5.67102439,10.0205528 C5.67102439,9.34152846 6.00582114,8.77730081 6.64663415,8.77730081 C7.42126829,8.77730081 7.74630894,9.39892683 7.74630894,9.95356098 C7.74630894,10.7187642 7.25866667,11.235187 6.64663415,11.235187 C6.13004878,11.235187 5.67102439,10.795187 5.67102439,10.0205528 Z M9.41053659,7.57226016 L7.8515122,7.57226016 L7.8515122,8.47112195 L7.8324878,8.47112195 C7.46907317,7.85908943 6.87606504,7.45746341 6.13964228,7.45746341 C4.59021138,7.45746341 3.8921626,8.56689431 3.8921626,10.0491707 C3.8921626,11.5221789 4.74321951,12.5550244 6.11102439,12.5550244 C6.79964228,12.5550244 7.37346341,12.2872195 7.78468293,11.7038049 L7.80370732,11.7038049 L7.80370732,11.9716098 C7.80370732,12.9472195 7.26826016,13.4158374 6.27362602,13.4158374 C5.55622764,13.4158374 5.11622764,13.2628293 4.59021138,13.0046179 L4.50419512,14.3626667 C4.90582114,14.5060813 5.58500813,14.6782764 6.40744715,14.6782764 C8.41590244,14.6782764 9.41053659,14.0182764 9.41053659,11.9716098 L9.41053659,7.57226016 Z" id="Fill-6" fill="#ED1C24"></path><mask id="mask-4" fill="#FFFFFF"><polygon points="0 19.9821138 46.0918699 19.9821138 46.0918699 0.162601626 0 0.162601626" transform="matrix(1, 0, 0, 1, 0, 0)"></polygon></mask><g id="Clip-9"></g><path d="M10.5985366,6.75918699 L12.32,6.75918699 L12.32,5.49674797 L10.5985366,5.49674797 L10.5985366,6.75918699 Z M10.598374,12.5549593 L12.3198374,12.5549593 L12.3198374,7.57219512 L10.598374,7.57219512 L10.598374,12.5549593 Z" id="Fill-8" fill="#ED1C24" mask="url(#mask-4)"></path><path d="M17.1133333,7.51479675 C16.9411382,7.48617886 16.7307317,7.45739837 16.5299187,7.45739837 C15.7839024,7.45739837 15.3534959,7.85918699 15.0570732,8.4904065 L15.0380488,8.4904065 L15.0380488,7.57219512 L13.4694309,7.57219512 L13.4694309,12.5549593 L15.1910569,12.5549593 L15.1910569,10.4508943 C15.1910569,9.47544715 15.6404878,8.89203252 16.4439024,8.89203252 C16.6447154,8.89203252 16.835935,8.89203252 17.0273171,8.94943089 L17.1133333,7.51479675 Z" id="Fill-10" fill="#ED1C24" mask="url(#mask-4)"></path><path d="M20.0773496,11.4647154 C19.2835285,11.4647154 18.9583252,10.804878 18.9583252,10.0682927 C18.9583252,9.32243902 19.2835285,8.66243902 20.0773496,8.66243902 C20.8711707,8.66243902 21.196374,9.32243902 21.196374,10.0682927 C21.196374,10.804878 20.8711707,11.4647154 20.0773496,11.4647154 M20.0773496,12.6697561 C21.7223902,12.6697561 22.9752358,11.7133333 22.9752358,10.0682927 C22.9752358,8.41382114 21.7223902,7.45739837 20.0773496,7.45739837 C18.4323089,7.45739837 17.1794634,8.41382114 17.1794634,10.0682927 C17.1794634,11.7133333 18.4323089,12.6697561 20.0773496,12.6697561" id="Fill-11" fill="#ED1C24" mask="url(#mask-4)"></path><path d="M29.3757073,10.0110244 C29.3757073,10.8048455 28.9836748,11.3500488 28.3332683,11.3500488 C27.7594472,11.3500488 27.2812358,10.8048455 27.2812358,10.0780163 C27.2812358,9.332 27.7020488,8.77720325 28.3332683,8.77720325 C29.0026992,8.77720325 29.3757073,9.35102439 29.3757073,10.0110244 Z M25.5597724,14.5633821 L27.2812358,14.5633821 L27.2812358,11.856878 L27.3002602,11.856878 C27.6254634,12.4498862 28.2758699,12.6697236 28.8783089,12.6697236 C30.360748,12.6697236 31.1545691,11.4456585 31.1545691,9.97265041 C31.1545691,8.76777236 30.399122,7.45736585 29.0218862,7.45736585 C28.2376585,7.45736585 27.5106667,7.77297561 27.166439,8.47118699 L27.147252,8.47118699 L27.147252,7.5721626 L25.5597724,7.5721626 L25.5597724,14.5633821 Z" id="Fill-12" fill="#ffffff" mask="url(#mask-4)"></path><path d="M33.505252,10.9769919 C33.505252,10.4987805 33.9642764,10.3169919 34.5476911,10.3169919 C34.8059024,10.3169919 35.0546829,10.3361789 35.2745203,10.3457724 C35.2745203,10.929187 34.8633008,11.5221951 34.2128943,11.5221951 C33.8112683,11.5221951 33.505252,11.3212195 33.505252,10.9769919 Z M36.9769593,12.5550407 C36.900374,12.1628455 36.8813496,11.770813 36.8813496,11.3786179 L36.8813496,9.52317073 C36.8813496,8.00252033 35.7815122,7.45747967 34.5094797,7.45747967 C33.7730569,7.45747967 33.1322439,7.56268293 32.5202114,7.81130081 L32.5488293,8.97813008 C33.0270407,8.7103252 33.5816748,8.60512195 34.1364715,8.60512195 C34.7580976,8.60512195 35.2650894,8.78674797 35.2745203,9.46577236 C35.0546829,9.42756098 34.7485041,9.39894309 34.4711057,9.39894309 C33.5530569,9.39894309 31.8984228,9.58056911 31.8984228,11.1013821 C31.8984228,12.1820325 32.7784228,12.6698374 33.7634634,12.6698374 C34.4711057,12.6698374 34.9493171,12.392439 35.3415122,11.770813 L35.3606992,11.770813 C35.3606992,12.0290244 35.3893171,12.2872358 35.3989106,12.5550407 L36.9769593,12.5550407 Z" id="Fill-13" fill="#ffffff" mask="url(#mask-4)"></path><path d="M37.750748,14.5634634 C38.1045691,14.6398862 38.4583902,14.6782602 38.8218049,14.6782602 C40.3998537,14.6782602 40.7728618,13.463626 41.2606667,12.2107805 L43.0873333,7.5722439 L41.3658699,7.5722439 L40.3426179,10.8239512 L40.3234309,10.8239512 L39.2522114,7.5722439 L37.3967642,7.5722439 L39.414813,12.6698049 C39.2904228,13.1098049 38.9653821,13.3584228 38.5445691,13.3584228 C38.3053821,13.3584228 38.0949756,13.3296423 37.8655447,13.2532195 L37.750748,14.5634634 Z" id="Fill-14" fill="#ffffff" mask="url(#mask-4)"></path></g></g></svg>
Index: /views/mods/mod_paypalapi/order_done.phtml
===================================================================
--- /views/mods/mod_paypalapi/order_done.phtml	(revision 8528)
+++ /views/mods/mod_paypalapi/order_done.phtml	(revision 5261)
@@ -17,45 +17,15 @@
 <?php } else { ?>
 
-    <div class="wpsg_clear"></div><br />
-    
-    <?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_paypalapi_plus_aktiv'))) { ?>
-        
-        <?php echo __('Zahlung mittels der folgenden Zahlungsoption abschlieÃen','wpsg'); ?>
-            
-        <br />
-    
-        <script src="https://www.paypalobjects.com/webstatic/ppplus/ppplus.min.js" type="text/javascript"></script>
-        <div id="wpsg_ppplus"></div>
-            
-        <script type="application/javascript">/* <![CDATA[ */
-    
-            <?php $this->view['wpsg_order_done'] = true; ?>
-            <?php $this->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/paypalplus.phtml'); ?>
-                
-        /* ]]> */</script> 
+	<?php echo __('Zahlung mittels der folgenden Zahlungsoption abschlieÃen','wpsg'); ?>
+
+	<script src="https://www.paypalobjects.com/webstatic/ppplus/ppplus.min.js" type="text/javascript"></script>
+	<div id="wpsg_ppplus"></div>
+	    
+	<script type="application/javascript">/* <![CDATA[ */
+
+		<?php $this->view['wpsg_order_done'] = true; ?>
+		<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_paypalapi/paypalplus.phtml'); ?>
+			
+	/* ]]> */</script> 
 	
-    <?php } else { ?>
-    
-        <?php echo __('Um die Zahlung zu starten, klicken Sie bitte auf das PayPal Logo','wpsg'); ?>
-            
-        <div class="wpsg_clear"></div><br />
-            
-        <a href="<?php echo $this->view['wpsg_mod_paypalapi']['approval_url']; ?>">
-            <img src="<?php echo $this->getRessourceURL('mods/mod_paypalapi/gfx/logo_100x25.png'); ?>" align="left" alt="<?php echo __('Mit PayPal bezahlen', 'wpsg'); ?>">
-        </a>
-    
-        <?php if ($this->get_option('wpsg_mod_paypalapi_autostart') == '1') { ?>
-        <script type="text/javascript">/* <![CDATA[ */
-         
-            jQuery(document).ready(function() { 
-                window.setTimeout(function() {
-                    location.href = "<?php echo $this->view['wpsg_mod_paypalapi']['approval_url']; ?>";
-                }, 1000);
-            } );
-        
-        /* ]]> */</script>
-        <?php } ?>
-            
-    <?php } ?>
-        
 <?php } ?>
Index: ews/mods/mod_paypalapi/order_done_giropay.phtml
===================================================================
--- /views/mods/mod_paypalapi/order_done_giropay.phtml	(revision 8528)
+++ 	(revision )
@@ -1,80 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 13.06.24
-	 * @time: 14:59
-	 */
-	
-	namespace wpsg;
-	
-	$client_id = $this->view['clientId']??null;
-
-?>
-
-<?php if ($client_id !== null) { ?>
-	
-	<p><?php echo __('Die Bestellung ist bei uns eingegangen, bitte begleichen Sie den offenen Betrag mit giroPAy ÃŒber folgenden Button.', 'wpsg'); ?></p>
-	
-	<script src="https://sandbox.paypal.com/sdk/js?client-id=<?php echo $client_id; ?>&components=buttons,payment-fields,marks,funding-eligibility&enable-funding=giropay&currency=EUR"></script>
-	
-	<div id="giropay-btn"></div>
-	
-	<script>
-		
-		paypal.Buttons({
-			fundingSource: paypal.FUNDING.GIROPAY,
-			style: {
-				label: "pay",
-			},
-			createOrder() {
-				return fetch('<?php echo $this->getUrl(\wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'giroPayCreateOrder', [
-					'order_id' => intval($_REQUEST['order_id'])
-				], true); ?>', {
-					method: "POST",
-					headers: {
-						"Content-Type": "application/json",
-					},
-					body: null,
-				})
-				.then((response) => response.json())
-				.then((order) => order.id);
-			},
-			onApprove(data) {
-
-				console.log('onApprove');
-				
-				return fetch('<?php echo $this->getUrl(\wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'giroPayApproveOrder', [], true); ?>', {
-					method: "POST",
-					headers: {
-						"Content-Type": "application/json",
-					},
-					body: JSON.stringify({
-						orderID: data.orderID
-					})
-				})
-				.then((response) => response.json())
-				.then((orderData) => {
-					
-					//console.log('Capture result', orderData, JSON.stringify(orderData, null, 2));
-					//const transaction = orderData.purchase_units[0].payments.captures[0];
-					//console.log('Transaction Status:',	transaction.status);
-					//console.log('Transaction ID:', transaction.id);
-					
-					location.reload();
-					
-				});
-			},
-			onCancel(data, actions) { console.log(`Order Canceled - ID: ${data.orderID}`); },
-			onError(err) { console.error(err); }
-		}).render("#giropay-btn");
-		
-	</script>
-	
-<?php } else { ?>
-
-	<p><?php echo __('Den Betrag haben wir mittels GiroPay dankend erhalten.', 'wpsg'); ?></p>
-
-<?php }
Index: /views/mods/mod_paypalapi/order_view_afterpayment.phtml
===================================================================
--- /views/mods/mod_paypalapi/order_view_afterpayment.phtml	(revision 8528)
+++ /views/mods/mod_paypalapi/order_view_afterpayment.phtml	(revision 5261)
@@ -4,30 +4,36 @@
 	 * Template fÃŒr die Integration der PayPal Zahlungsart in die Bestellverwaltung
 	 */
-	
-	$wpsg_mod_paypalapi_paymentid = $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_paymentid');
-	$wpsg_mod_paypalapi_saleid = $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_saleid');
 
 ?>
 
-<?php if (wpsg_isSizedString($wpsg_mod_paypalapi_paymentid)) { ?>
-
-	<?php echo wpsg_drawForm_Text(
-		wpsg_translate(
-			__('PaymentID [<a href="#1#">Status Aktualisieren</a>]', 'wpsg'),
-			wpsg_admin_url('Order', 'ajax', ['noheader' => '1', 'mod' => 'wpsg_mod_paypalapi', 'do' => 'refresh', 'edit_id' => $this->view['oOrder']->id])
-			//WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_paypalapi&do=refresh&edit_id='.$this->view['oOrder']->id
-		),
-		wpsg_translate(__('#1# (#2#)', 'wpsg'), $wpsg_mod_paypalapi_paymentid, $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_paymentstate'))
-	); ?>
-
+<?php if (wpsg_isSizedString($this->view['oOrder']->getMeta('wpsg_mod_paypalapi_paymentid'))) { ?>
+	
+	<div class="wpsg_form_field ">
+		<div class="wpsg_form_left">
+			<label for=""><?php echo __('PaymentID', 'wpsg'); ?>: [<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_paypalapi&do=refresh&edit_id=<?php echo $this->view['oOrder']->id; ?>"><?php echo __('Status Aktualisieren', 'wpsg'); ?></a>]</label>
+		</div>
+		<div class="wpsg_form_right">
+			<p class="" id=""><?php echo wpsg_translate(__('#1# (#2#)', 'wpsg'), $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_paymentid'), $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_paymentstate')); ?></p>
+		</div>
+		<div class="wpsg_clear"></div>
+	</div>
+		
 <?php } ?>
 
-<?php if (wpsg_isSizedString($wpsg_mod_paypalapi_saleid)) { ?>
+<?php if (wpsg_isSizedString($this->view['oOrder']->getMeta('wpsg_mod_paypalapi_saleid'))) { ?>
 
-	<?php echo wpsg_drawForm_Text(__('SaleID', 'wpsg'), wpsg_translate(__('#1# (#2#)', 'wpsg'), $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_saleid'), $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_salestate'))); ?>
+	<div class="wpsg_form_field ">
+		<div class="wpsg_form_left">
+			<label for=""><?php echo __('SaleID', 'wpsg'); ?>:</label>
+		</div>
+		<div class="wpsg_form_right">
+			<p class="" id=""><?php echo wpsg_translate(__('#1# (#2#)', 'wpsg'), $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_saleid'), $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_salestate')); ?></p>
+		</div>
+		<div class="wpsg_clear"></div>
+	</div>
 	
 	<?php if ($this->view['oOrder']->getMeta('wpsg_mod_paypalapi_salestate') != 'refunded') { ?>
 	<br />
-	<a onclick="return confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>');" class="button" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_paypalapi&do=refund&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Zahlung rÃŒckerstatten', 'wpsg'); ?></a>
+	<a onclick="return confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>');" class="button" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_paypalapi&do=refund&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Zahlung rÃŒckerstatten (Refund Call)', 'wpsg'); ?></a>
 	<?php } ?> 	
 	 	
Index: ews/mods/mod_paypalapi/overview_button.phtml
===================================================================
--- /views/mods/mod_paypalapi/overview_button.phtml	(revision 8528)
+++ 	(revision )
@@ -1,89 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 13.06.24
-	 * @time: 14:48
-	 */
-	
-	namespace wpsg;
-	
-?>
-
-<?php GiroPayPalAPI::getInstance()->integrateSDK(); ?>
-
-
-<div style="width:300px; float:right;">
-	<div id="giropay-btn"></div>
-</div>
-
-<script>
-	
-	paypal.Buttons({
-		fundingSource: paypal.FUNDING.GIROPAY,
-		style: {
-			label: "pay",
-		},
-		createOrder() {
-			
-			const form = document.getElementById('wpsg_form');
-   
-			if (form.checkValidity()) {
-			
-				return fetch("<?php echo $this->getUrl(\wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'giroPayCreateOrderFromSession', [ ], true); ?>", {
-					method: "POST",
-					headers: {
-						"Content-Type": "application/json",
-					},
-					body: { }
-				})
-				.then((response) => response.json())
-				.then((order) => order.id);
-
-			} else form.reportValidity();
-			
-		},
-		onApprove(data) {
-			
-			return fetch("<?php echo $this->getUrl(\wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'giroPayApproveOrder', [], true); ?>", {
-				method: "POST",
-				headers: {
-					"Content-Type": "application/json",
-				},
-				body: JSON.stringify({
-					orderID: data.orderID
-				})
-			})
-				.then((response) => response.json())
-				.then((orderData) => {
-				
-					location.href = orderData.order_done_url;
-					
-					// Successful capture! For dev/demo purposes:
-					// console.log('Capture result', orderData, JSON.stringify(orderData, null, 2));
-					
-					// const transaction = orderData.order_paypal.purchase_units[0].payments.captures[0];
-					
-					//console.log('Transaction Status:',	transaction.status);
-					//console.log('Transaction ID:', transaction.id);
-					
-			});
-			
-		},
-		onCancel(data, actions) {
- 
-			console.log(`Order Canceled - ID: ${data.orderID}`);
-			
-			location.href = '<?php echo $this->getUrl(\wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'giroPayCancelOrder', [], true); ?>';
-			
-		},
-		onError(err) {
-			
-			<?php if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugModus') === "1") { ?>console.error(err);<?php } ?>
-			
-		}
-	}).render("#giropay-btn");
-	
-</script>
Index: /views/mods/mod_paypalapi/paypalplus.phtml
===================================================================
--- /views/mods/mod_paypalapi/paypalplus.phtml	(revision 8528)
+++ /views/mods/mod_paypalapi/paypalplus.phtml	(revision 5261)
@@ -8,30 +8,15 @@
 
 ?>
- 
+
 	var ppp = PAYPAL.apps.PPP({
 		"approvalUrl": "<?php echo $this->view['wpsg_mod_paypalapi']['approval_url']; ?>",
 		"language": "de_DE",
 		"preselection": "<?php echo (($_SESSION['wpsg']['checkout']['payment'] == '10')?'paypal':'none')?>",
-		"country": "DE",
-		<?php if ($this->hasMod('wpsg_mod_onepagecheckout') && wpsg_get_the_id() == $this->get_option('wpsg_mod_onepagecheckout_page')) { ?>
-		"onContinue": function(event) {
-			
-			jQuery('#wpsg_basket_form').attr('target', 'wpsg_hiddenTarget');
-			jQuery('#wpsg_basket_form').append('<input name="wpsg_checkout" value="ppp" id="wpsg_hidden_action" />');
-			jQuery('#wpsg_basket_form').append('<input name="wpsg[checkout][payment]" value="ppp" id="wpsg_hidden_payment" />');
-			jQuery('#wpsg_basket_form').trigger('submit');
-			jQuery('#wpsg_basket_form').removeAttr('target');
-			jQuery('#wpsg_hidden_action').remove();
-			jQuery('#wpsg_hidden_payment').remove();
-			
-			//PAYPAL.apps.PPP.doCheckout();
-			
-		},
-		<?php } ?>
-		<?php if (@$this->view['wpsg_order_done'] !== true) { ?>
+		"country": "DE",	
+		<?php if ($this->view['wpsg_order_done'] !== true) { ?>
 		"onLoad": function() { if (typeof wpsg_mod_paypalapi_load == 'function') wpsg_mod_paypalapi_load(); }, 
 		"buttonLocation": "outside",
-		"disableContinue": "<?php echo $this->view['wpsg_mod_paypalapi']['disableContinue']; ?>",
-		"enableContinue": "<?php echo $this->view['wpsg_mod_paypalapi']['enableContinue']; ?>",
+		"disableContinue": "wpsg_checkout2button",
+		"enableContinue": "wpsg_checkout2button",
 		<?php if (wpsg_isSizedArray($this->view['wpsg_mod_paypalapi']['ThirdPartyPayment'])) { ?>
 		"thirdPartyPaymentMethods": <?php echo json_encode($this->view['wpsg_mod_paypalapi']['ThirdPartyPayment']); ?>,
Index: /views/mods/mod_paypalapi/settings_edit.phtml
===================================================================
--- /views/mods/mod_paypalapi/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_paypalapi/settings_edit.phtml	(revision 5261)
@@ -7,7 +7,6 @@
 ?>
 
-<?php echo wpsg_drawForm_Select('wpsg_mod_paypalapi_version', __('API Version', 'wpsg'), ['v1' => 'V1', 'v2' => 'V2'], $this->get_option('wpsg_mod_paypalapi_version'), []); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_clientid', __('Client ID', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_clientid'), array('hint' => __('Erhalten Sie im PayPal Account.', 'wpsg'), 'help' => 'wpsg_mod_paypal_clientid', 'hint' => wpsg_translate(__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'))); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_secret', __('Secret', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_secret'), array('hint' => __('Erhalten Sie im PayPal Account.', 'wpsg'), 'help' => 'wpsg_mod_paypal_secret', 'hint' => wpsg_translate(__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'))); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_clientid', __('Client ID', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_clientid'), array('hint' => __('Erhalten Sie im PayPal Account.', 'wpsg'), 'help' => 'wpsg_mod_paypal_clientid', 'hint' => wpsg_translate('nohspc_'.__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'))); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_secret', __('Secret', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_secret'), array('hint' => __('Erhalten Sie im PayPal Account.', 'wpsg'), 'help' => 'wpsg_mod_paypal_secret', 'hint' => wpsg_translate('nohspc_'.__('Erhalten Sie im <a target="_blank" href="#1#">PayPal Developer Interface</a>.', 'wpsg'), 'https://developer.paypal.com/'))); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_sandbox', __('Sandbox', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_sandbox'), array('help' => 'wpsg_mod_paypal_sandbox')); ?>
 
@@ -23,8 +22,4 @@
 <br />
 
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_currency', __('WÃ€hrungscode (Standard: EUR)'), $this->get_option('wpsg_mod_paypalapi_currency'), array('help' => 'wpsg_mod_paypal_currency')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Input('', __('WebHook URL', 'wpsg'), $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_paypalapi', 'webHook', array(), true), array('readonly' => true, 'help' => 'wpsg_mod_paypal_webhook_url')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_create',  __('Beim speichern versuchen den WebHook anzumelden.', 'wpsg'), 0, array('labelright' => true, 'noDoubleDot' => true, 'help' => 'wpsg_mod_paypal_createwebhook')); ?>
@@ -36,5 +31,5 @@
 <br />
 
-<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_paypalapi_gebuehr')), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_paypalapi_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_paypalapi_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_paypalapi_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>
@@ -42,12 +37,17 @@
 <br />
 
-<?php echo wpsg_drawForm_Link('wpsg_mod_paypalapi_link', __('Stornierung bei Statuswechsel', 'wpsg'), 
-		__('Bearbeiten', 'wpsg'), array('help' => 'wpsg_mod_paypalapi_link', 'class' => 'wpsg_mod_paypalapi_stornostate')); ?>
-
-
+<div class="wpsg_form_field ">
+	<div class="wpsg_form_left">
+		<label for=""><?php echo __('Stornierung bei Statuswechsel', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<a href="#" class="wpsg_mod_paypalapi_stornostate"><?php echo __('Bearbeiten', 'wpsg'); ?></a>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
 <div class="wpsg_mod_paypalapi_stornostate_layer" style="display:none;">
 	
 	<?php foreach ($this->arStatus as $status_id => $status_label) { $arStornoStatus = (array)$this->get_option('wpsg_mod_paypalapi_stornostate'); ?>
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_stornostate['.$status_id.']', __($status_label, 'wpsg'), wpsg_getInt($arStornoStatus[$status_id]), array('labelright' => true)); ?>	
+	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_stornostate['.$status_id.']', __($status_label, 'wpsg'), $arStornoStatus[$status_id], array('labelright' => true)); ?>	
 	<?php } ?> 
 	
@@ -58,42 +58,16 @@
 <br />
 
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_paypalapi_success', __('Erfolgsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_paypalapi_success'), array('help' => 'wpsg_page_mod_paypal_success')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_paypalapi_error', __('Fehlerseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_paypalapi_error'), array('help' => 'wpsg_page_mod_paypal_error')); ?>
+
+<br />
+
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_aktiv', __('PayPal fÃŒr neue Bestellungen erlauben', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_aktiv'), array('help' => 'wpsg_shippay_activ')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_paypalexpress', __('PayPal Express aktivieren (Button im Warenkorb)', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_paypalexpress'), array('help' => 'wpsg_mod_paypalapi_paypalexpress')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_plus_aktiv', __('PayPal Plus aktivieren', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_plus_aktiv'), array('help' => 'wpsg_mod_paypalapi_plus_aktiv')); ?>
-<?php /*
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_giropay_aktiv', __('GiroPay aktivieren', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_giropay_aktiv'), array('help' => 'wpsg_mod_paypalapi_giropay_aktiv ')); ?>
-
-<div id="wpsg_mod_paypalapi_giropay_aktiv_layer">
-	<?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_giropay_name', __('Bezeichnung (GiroPay)', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_giropay_name'), array('help' => 'wpsg_shippay_name')); ?>
-	<?php echo wpsg_drawForm_Textarea('wpsg_mod_paypalapi_giropay_hint', __('Hinweistext (GiroPay)', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_giropay_hint'), array('help' => 'wpsg_shippay_hint')); ?>
-</div>
-*/ ?>
-
-<div class="wpsg_mod_paypalapi_plus_aktiv_layer wpsg_mod_paypalapi_plus_aktiv_layer_1">
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_plus_basket', __('Zahlungsauswahl im Warenkorb', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_plus_basket'), array('help' => 'wpsg_mod_paypalapi_plus_basket')); ?>
-</div>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_paypalexpress', __('PayPal Express aktivieren (Button im Warenkorb)', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_paypalexpress'), array('help' => 'wpsg_mod_paypalapi_paypalexpress')); ?>
-<div class="wpsg_mod_paypalapi_plus_aktiv">
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_paypalexpress_forceSSL', __('SSL fÃŒr ReturnURL erzwingen', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_paypalexpress_forceSSL'), array('help' => 'wpsg_mod_paypalapi_paypalexpress_forceSSL')); ?>
-	<?php echo wpsg_drawForm_Input('', __('Return URL', 'wpsg'), $this->getUrl(
-		wpsg_ShopController::URL_BASKET, 
-		'wpsg_mod_paypalapi', 
-		'startPayPalExpress', 
-		array(), 
-		((wpsg_isSizedInt($this->get_option('wpsg_mod_paypalapi_paypalexpress_forceSSL')))?true:false)
-	), array('readonly' => true, 'help' => 'wpsg_mod_paypalapi_paypalexpress_returnurl')); ?>
-	<br />
-</div>
-
-<div class="wpsg_mod_paypalapi_plus_inaktiv">
-    <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_autostart'), array('help' => 'wpsg_shippay_paystart')); ?>
-</div>
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_paypalapi_paypalexpress_details', __('Warenkorbdetails ÃŒbertragen', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_paypalexpress_details'), array('help' => 'wpsg_mod_paypalapi_paypalexpress_details')); ?>
 
 <br />
-
 <?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_experience_label', __('Bezeichnung im PayPal Zahlungsinterface', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_experience_label'), array('help' => 'wpsg_mod_paypalapi_experience_label', 'hint' => __('Max. 127 Zeichen', 'wpsg'))); ?>
-
 <?php echo wpsg_drawForm_Input('wpsg_mod_paypalapi_experience_logo', __('URL fÃŒr ein Logo im PayPal Zahlungsinterface', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_experience_logo'), array('help' => 'wpsg_mod_paypalapi_experience_logo', 'hint' => __('gif|png|jpg, Max. 190x60', 'wpsg'))); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_paypalapi_experience_locale_code', __('Sprache im PayPal Zahlungsinterface', 'wpsg'), array(
@@ -109,27 +83,8 @@
 <?php echo wpsg_drawForm_Textarea('wpsg_mod_paypalapi_plus_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_paypalapi_plus_hint'), array('help' => 'wpsg_shippay_hint')); ?>
   
-<script>
+<script type="text/javascript">/* <![CDATA[ */
 
 	jQuery(document).ready(function() {
 
-	    var wpsg_mod_paypalapi_version = jQuery('#wpsg_mod_paypalapi_version').val();
-
-	    jQuery('#wpsg_mod_paypalapi_version').on('change', function() {
-
-	        if (jQuery(this).val() === 'v2' && wpsg_mod_paypalapi_version === 'v1') {
-
-	            alert('<?php echo __('Beim Wechseln von V1 auf V2 sollte eine neue App im PayPal Developer Intervace angelegt werden.', 'wpsg'); ?>');
-
-            }
-
-        });
-
-		jQuery('#wpsg_mod_paypalapi_plus_aktiv').on('change', function() {
-			
-			jQuery('.wpsg_mod_paypalapi_plus_aktiv_layer').hide();
-			jQuery('.wpsg_mod_paypalapi_plus_aktiv_layer_' + jQuery(this).val()).show();
-			
-		} ).change();
-		
 		jQuery('#wpsg_mod_paypalapi_webhook_log').bind('change', function() {
 
@@ -154,18 +109,6 @@
 		jQuery('#wpsg_mod_paypalapi_plus_aktiv').bind('change', function() {
 
-			if (jQuery(this).is(':checked'))
-            {
-                
-                jQuery('.wpsg_mod_paypalapi_plus_aktiv').show();
-                jQuery('.wpsg_mod_paypalapi_plus_inaktiv').hide();
-                
-            }
-			else 
-            {
-             
-                jQuery('.wpsg_mod_paypalapi_plus_aktiv').hide();
-                jQuery('.wpsg_mod_paypalapi_plus_inaktiv').show();
-                
-            }
+			if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_paypalapi_plus_aktiv').show();
+			else jQuery('.wpsg_mod_paypalapi_plus_aktiv').hide();
 			
 		} ).change();
@@ -184,40 +127,3 @@
 	} );
 
-	const el_wpsg_mod_paypalapi_plus_aktiv = document.getElementById('wpsg_mod_paypalapi_plus_aktiv');
-	//const el_wpsg_mod_paypalapi_giropay_aktiv = document.getElementById('wpsg_mod_paypalapi_giropay_aktiv');
-	//const el_wpsg_mod_paypalapi_giropay_aktiv_layer = document.getElementById('wpsg_mod_paypalapi_giropay_aktiv_layer');
-	
-	el_wpsg_mod_paypalapi_plus_aktiv.addEventListener('change', event => {
-		
-		if (el_wpsg_mod_paypalapi_plus_aktiv.checked) {
-		
-			//el_wpsg_mod_paypalapi_giropay_aktiv.disabled = true;
-			//el_wpsg_mod_paypalapi_giropay_aktiv.checked = false;
-		
-		} else {
-		
-			//el_wpsg_mod_paypalapi_giropay_aktiv.disabled = false;
-		
-		}
-		
-	});
-
-	/*
-	el_wpsg_mod_paypalapi_giropay_aktiv.addEventListener('change', event => {
-	 
-		if (el_wpsg_mod_paypalapi_giropay_aktiv.checked) {
-		
-			el_wpsg_mod_paypalapi_giropay_aktiv_layer.style.display = 'block';
-			
-		} else {
-		
-			el_wpsg_mod_paypalapi_giropay_aktiv_layer.style.display = 'none';
-			
-		}
-		
-	});*/
-	
-	el_wpsg_mod_paypalapi_plus_aktiv.dispatchEvent(new Event('change'));
-	//el_wpsg_mod_paypalapi_giropay_aktiv.dispatchEvent(new Event('change'));
-	
-</script>
+/* ]]> */</script>
Index: /views/mods/mod_prepayment/mail.phtml
===================================================================
--- /views/mods/mod_prepayment/mail.phtml	(revision 8528)
+++ /views/mods/mod_prepayment/mail.phtml	(revision 5261)
@@ -7,5 +7,5 @@
 ?>
  
-<?php echo wpsg_translate(__('Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto und geben Sie als Betreff "#2#" an.', 'wpsg'), wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')), $this->view['mod_prepayment']['subject']); ?> 
+<?php echo wpsg_translate(__('Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto und geben Sie als Betreff "#2#" an.', 'wpsg'), wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), $this->view['mod_prepayment']['subject']); ?> 
  
 <?php echo wpsg_pad_right(__('Kontoinhaber', 'wpsg').':', 35); ?><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_kinhaber')); ?> 
@@ -13,3 +13,3 @@
 <?php echo wpsg_pad_right(__('Bank', 'wpsg').':', 35); ?><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_bank')); ?>  
 <?php echo wpsg_pad_right(__('BIC-/SWIFT-Code', 'wpsg').':', 35); ?><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_swift')); ?> 
-<?php echo wpsg_pad_right(__('Betreff: #1#', 'wpsg'), 35); ?><?php echo $this->view['mod_prepayment']['subject']; ?>   
+  
Index: /views/mods/mod_prepayment/mail_html.phtml
===================================================================
--- /views/mods/mod_prepayment/mail_html.phtml	(revision 8528)
+++ /views/mods/mod_prepayment/mail_html.phtml	(revision 5261)
@@ -7,5 +7,23 @@
 ?>
 <p>
-	<?php echo wpsg_translate(__('Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto und geben Sie als Betreff <strong>#2#</strong> an.', 'wpsg'), wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')), $this->view['mod_prepayment']['subject']); ?>
+	<?php echo wpsg_translate(__('Bitte ÃŒberweisen Sie den Rechnungsbetrag in HÃ¶he von #1# auf folgendes Konto und geben Sie als Betreff <strong>#2#</strong> an.', 'wpsg'), wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), $this->view['mod_prepayment']['subject']); ?>
 </p> 
 
+<table style="width:100%;">
+	<tr>
+		<td><?php echo __('Kontoinhaber', 'wpsg'); ?>:</td>
+		<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_kinhaber')); ?></td>
+	</tr>
+	<tr>
+		<td><?php echo __('IBAN', 'wpsg'); ?>:</td>
+		<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_iban')); ?></td>
+	</tr>
+	<tr>
+		<td><?php echo __('Bank', 'wpsg'); ?>:</td>
+		<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_bank')); ?></td>
+	</tr>	
+	<tr>
+		<td><?php echo __('BIC-/SWIFT-Code', 'wpsg'); ?></td>
+		<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_swift')); ?></td>
+	</tr> 
+ </table>
Index: ews/mods/mod_prepayment/mail_html_payment_after.phtml
===================================================================
--- /views/mods/mod_prepayment/mail_html_payment_after.phtml	(revision 8528)
+++ 	(revision )
@@ -1,67 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * @author: daniel
-	 * @date: 15.01.25
-	 * @time: 14:41
-	 */
-	
-?>
-
-<?php
-	
-	if (isset($this->view['mod_prepayment']['subject'])) {
- 
-?>
-
-			<tr>
-				<td>
-					<?php if ($this->get_option('wpsg_mod_prepayment_qrcode') == true) {
-						
-						require_once WPSG_PATH_LIB.'phpgirocode.class.php';
-		
-						$qrcode = $this->callMod('wpsg_mod_prepayment', 'genQRCode', [
-							$this->view['o_id'],
-							$this->view['mod_prepayment']['subject'],
-							$this->view['basket']['sum']['preis_gesamt_brutto'],
-							5,
-							PhpGirocode::OUTPUT_BASE64
-						]);
-						
-					?>
-						<?php echo __('Girocode fÃŒr einfache Ãberweisungen', 'wpsg'); ?><br /><br />
-						<img src="data:image/png;base64,<?php echo $qrcode; ?>" alt="Base64 Image">
-					<?php } ?>
-				</td>
-				<td>
-					<br /><br />
-					<table style="width:100%;">
-						<tr>
-							<td><?php echo __('Kontoinhaber', 'wpsg'); ?>:</td>
-							<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_kinhaber')); ?></td>
-						</tr>
-						<tr>
-							<td><?php echo __('IBAN', 'wpsg'); ?>:</td>
-							<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_iban')); ?></td>
-						</tr>
-						<tr>
-							<td><?php echo __('Bank', 'wpsg'); ?>:</td>
-							<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_bank')); ?></td>
-						</tr>
-						<tr>
-							<td><?php echo __('BIC-/SWIFT-Code', 'wpsg'); ?>:</td>
-							<td style="text-align:right;"><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_swift')); ?></td>
-						</tr>
-						<tr>
-							<td><?php echo __('Betreff', 'wpsg'); ?>:</td>
-							<td style="text-align:right;"><?php echo wpsg_translate(__('#1#', 'wpsg'), $this->view['mod_prepayment']['subject']); ?></td>
-						</tr>
-					</table>
-				</td>
-			</tr>
-
-<?php
-	
-	}
Index: /views/mods/mod_prepayment/order_done.phtml
===================================================================
--- /views/mods/mod_prepayment/order_done.phtml	(revision 8528)
+++ /views/mods/mod_prepayment/order_done.phtml	(revision 5261)
@@ -2,80 +2,16 @@
 
 	/**
-	 * Template welches bei der Zahlungsart "Vorkasse" nach Abschluss einer Bestellung angezeigt wird
+	 * Template welches bei der Zahlungsart "Vorkasse" nach AbschluÃ einer Bestellung angezeigt wird
 	 */
 	
-	$formatIBAN = function($iban) {
-	
-		$iban = preg_replace('/\040/', '', $iban);
-		$iban_formated = '';
-		
-		for ($i = 0; $i < ceil(strlen($iban) / 4); $i ++) $iban_formated .= substr($iban, $i * 4, 4).' ';
-		
-		return trim($iban_formated);
-	
-	}
-	
+	//wpsg_debug($this->view['wpsg_mod_prepayment']['subject']);
+
 ?>
-
-<?php echo wpsg_translate(__('Sie haben die Zahlungsart "Vorkasse" gewÃ€hlt. Ãberweisen Sie daher den Rechnungsbetrag von #1# auf folgendes Konto:', 'wpsg'), wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency'))); ?>
+<?php echo wpsg_translate(__('Sie haben die Zahlungsart "Vorkasse" gewÃ€hlt. Ãberweisen Sie daher den Rechnungsbetrag von #1# auf folgendes Konto:', 'wpsg'), wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency'))); ?>
 <br /><br />
 <?php echo wpsg_translate(__('Kontoinhaber: #1#', 'wpsg'), $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_kinhaber'))); ?><br /> 
-<?php echo wpsg_translate(__('IBAN: #1#', 'wpsg'), $formatIBAN($this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_iban')))); ?><br />
+<?php echo wpsg_translate(__('IBAN: #1#', 'wpsg'), $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_iban'))); ?><br /> 
 <?php echo wpsg_translate(__('Bank: #1#', 'wpsg'), $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_bank'))); ?><br />
 <?php echo wpsg_translate(__('BIC-/SWIFT-Code: #1#', 'wpsg'), $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_swift'))); ?> 
 <br /><br />
 <?php echo wpsg_translate(__('Bitte als Betreff angeben: "#1#"', 'wpsg'), $this->view['wpsg_mod_prepayment']['subject']); ?>
-<br /><br />
-
-<?php if (isset($this->view['wpsg_mod_prepayment']['subject']) && $this->get_option('wpsg_mod_prepayment_qrcode') == true) { ?>
-
-	<?php require_once WPSG_PATH_LIB.'phpgirocode.class.php'; ?>
- 
-	<!-- Girocode (EPC) -->
-
-	<p>
-		<?php echo __('Wenn Ihre Banking-App Girocode unterstÃŒtzt, kÃ¶nnen Sie diesen QRCode scannen.', 'wpsg'); ?>
-	</p>
-
-	<?php
-	
-		$img = [
-			'title' => __('Girocode', 'wpsg'),
-			'invoiceAmount' => $this->view['basket']['sum']['preis_gesamt_brutto'],
-			'referenceNumber' => $this->view['wpsg_mod_prepayment']['subject'],
-			'hash' => $this->callMod('wpsg_mod_prepayment', 'genQRCode', [
-				$this->view['o_id'],
-				$this->view['wpsg_mod_prepayment']['subject'],
-				$this->view['basket']['sum']['preis_gesamt_brutto'],
-				10,
-				PhpGirocode::OUTPUT_BASE64
-			])
-		];
-		
-	?>
-
-	<div class="wpsg_mod_prepayment_girocode">
-		<div class="wpsg_mod_prepayment_girocode_left" >
-			<h4><?php echo wpsg_translate(__($img['title'], 'wpsg')); ?></h4>
-			<?php echo '<img class="wpsg_mod_prepayment_girocode_left_qrcodeimg" src="data:image/png;base64,'.$img['hash'].'" />'; ?>
-			<br>
-			<div class="wpsg_mod_prepayment_girocode_left_wrap">
-				<div class="wpsg_mod_prepayment_girocode_left_currency">
-					<h4><?php echo wpsg_translate(__('WÃ€hrung', 'wpsg')); ?></h4>
-					<?php echo $this->get_option('wpsg_currency'); ?>
-				</div>
-				<div class="wpsg_mod_prepayment_girocode_left_amount">
-					<h4><?php echo wpsg_translate(__('Betrag', 'wpsg')); ?></h4>
-					<?php echo sprintf("%.2f", $img['invoiceAmount']); ?>
-				</div>
-			</div>
-		</div>
-		<div class="wpsg_mod_prepayment_girocode_right">
-			<h4 style="margin-bottom:30px;"><?php echo wpsg_translate(__('Konto / Zahlbar an', 'wpsg')); ?></h4>
-			IBAN: <strong><?php echo $formatIBAN($this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_iban'))); ?></strong><br />
-			Kontoinhaber: <strong><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_kinhaber')); ?></strong><br /><br />
-			Betreff: <strong><?php echo $img['referenceNumber']; ?></strong>
-		</div>
-	</div>
-	
-<?php } ?>
Index: /views/mods/mod_prepayment/settings_edit.phtml
===================================================================
--- /views/mods/mod_prepayment/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_prepayment/settings_edit.phtml	(revision 5261)
@@ -7,15 +7,14 @@
 ?>
 
-<?php echo wpsg_drawForm_Input('wpsg_mod_prepayment_bezeichnung', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_prepayment_bezeichnung'), array('help' => 'wpsg_mod_prepayment_bezeichnung')); ?>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<?php echo __("Bezeichnung", "wpsg"); ?>:
+	</div>
+	<div class="wpsg_form_right">
+		<input type="text" name="wpsg_mod_prepayment_bezeichnung" value="<?php echo $this->get_option('wpsg_mod_prepayment_bezeichnung'); ?>" />	
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_prepayment_aktiv', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_prepayment_aktiv'), array('help' => 'wpsg_mod_prepayment_aktiv')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_prepayment_qrcode', __('GiroCode fÃŒr Ãberweisung (Bestellabschluss) anbieten', 'wpsg'), $this->get_option('wpsg_mod_prepayment_qrcode'), array('help' => 'wpsg_mod_prepayment_qrcode')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_prepayment_qrcode_invoice', __('GiroCode fÃŒr Ãberweisung (Rechnung) anbieten', 'wpsg'), $this->get_option('wpsg_mod_prepayment_qrcode_invoice'), array('help' => 'wpsg_mod_prepayment_qrcode_invoice')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_prepayment_qrcode_mail', __('GiroCode fÃŒr Ãberweisung (HTML Kundenemail) anbieten', 'wpsg'), $this->get_option('wpsg_mod_prepayment_qrcode_mail'), array('help' => 'wpsg_mod_prepayment_qrcode_mail')); ?>
-
-<br />
-
 <?php echo wpsg_drawForm_Textarea('wpsg_mod_prepayment_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_prepayment_hint'), array('help' => 'wpsg_mod_prepayment_hint')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_prepayment_subject', __('Betreff fÃŒr Ãberweisungen', 'wpsg'), $this->get_option('wpsg_mod_prepayment_subject'), array('help' => 'mod_prepayment_subject')); ?>
@@ -31,2 +30,12 @@
 <?php echo wpsg_drawForm_Input('wpsg_mod_prepayment_iban', __('IBAN', 'wpsg'), $this->get_option('wpsg_mod_prepayment_iban'), array('help' => 'wpsg_mod_prepayment_iban')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_prepayment_swift', __('BIC-/SWIFT Code', 'wpsg'), $this->get_option('wpsg_mod_prepayment_swift'), array('help' => 'wpsg_mod_prepayment_swift')); ?>
+
+<script type="text/javascript">
+
+	jQuery(document).ready(function() {
+		
+		jQuery('.wpsg_form_help').tipTip();
+		
+	} );
+
+</script>
Index: /views/mods/mod_productfilter/settings_edit.phtml
===================================================================
--- /views/mods/mod_productfilter/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_productfilter/settings_edit.phtml	(revision 5261)
@@ -46,5 +46,5 @@
 <br />
 
-<?php if ($this->hasMod('wpsg_mod_productvariants')) { ?>
+<?php if ($this->hasMod('wpsg_mod_varianten')) { ?>
 <div class="wpsg_admin_box" id="wpsg_mod_productfilter_varianten_box">
 	<div id="wpsg_mod_productfilter_varianten" class="head" style="border-bottom:0px none;">
@@ -54,5 +54,5 @@
 		<div class="content wpsg_admin_box_content" style="display:block;">
 			<?php if (!wpsg_isSizedArray($this->view['wpsg_mod_productfilter']['arVarianten'])) { ?>
-			<?php echo wpsg_translate(__('Noch keine Varianten hinterlegt. Definieren Sie in der <a href="#1#">Variantenverwaltung</a> Ihre Varianten.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvariants'); ?>
+			<?php echo wpsg_translate(__('Noch keine Varianten hinterlegt. Definieren Sie in der <a href="#1#">Variantenverwaltung</a> Ihre Varianten.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_varianten'); ?>
 			<?php } else { ?>
 			<?php $index = 0; foreach ($this->view['wpsg_mod_productfilter']['arVarianten'] as $var_name => $set) { $index ++; ?>
Index: /views/mods/mod_productgroups/add.phtml
===================================================================
--- /views/mods/mod_productgroups/add.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/add.phtml	(revision 5261)
@@ -4,164 +4,69 @@
 	 * Template fÃŒr das Anlegen/Bearbeiten einer Produktgruppe
 	 */
+	//wpsg_debug($this->view['data']);
+?>
+<div class="wrap columns-2 wpsg_produkt_addedit">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	<h2>
+		<?php echo wpsg_translate(__('Produktgruppe #1#', 'wpsg'), $this->view['data']['name']); ?>
+	</h2>
+	<br />
 
-    /** @var wpsg_productgroup|null $oProductgroup */
-    $oProductgroup = null;
+	<?php echo $this->writeBackendMessage(); ?>
+	
+	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=save&noheader=1" enctype="multipart/form-data"> 
+		
+		<div id="postbox" class="metabox-holder has-right-sidebar">
 
-    if (intval($_REQUEST['edit_id']??0) > 0) {
+			<div id="side-info-column" class="inner-sidebar">
+				<div id="side-sortables" class="meta-box-sortables ui-sortable">
+					
+					<?php $this->callMods('wpsg_mod_productgroups_addedit_sidebar', array(&$this->view['data'])); ?>		
+					
+				</div>
+			</div>
 
-        $oProductgroup = wpsg_productgroup::getInstance(intval($_REQUEST['edit_id']));
-
-    }
-
-?>
-
-<div class="wpsg_productgroups" id="wpsg-bs">
-
-    <nav class="navbar navbar-default">
-
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
+			<div id="post-body">	
+				<div id="post-body-content">
+					<div class="postbox" id="postbox_kunde_anschrift">
+						<div title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></div>		
+						<h3 class="hndle"><span><?php echo __('Name', 'wpsg'); ?></span></h3>
+						<div class="inside">
+						
+							<?php echo wpsg_drawForm_Input('wpsg_mod_productgroups_name', __('Name', 'wpsg'), $this->view['data']['name']); ?>
+							
+							<?php if (wpsg_isSizedArray($this->view['languages'])) { ?>
+							<?php foreach ($this->view['languages'] as $l) { if ($l['locale'] != $this->getDefaultLanguage()) { ?>
+							
+							<?php echo wpsg_drawForm_Input(
+								'lang['.$l['locale'].'][name]', 
+								__('Name', 'wpsg').'&nbsp;('.$l['name'].'&nbsp;<img src="'.$this->getFlagURL().$l['flag'].'" alt="'.$l['Name'].'" />)',
+								$this->view['data']['lang'][$l['locale']]['name']
+							); ?>							
+														
+							<?php } } ?>
+							<?php } ?>
+							
+							<?php echo wpsg_drawForm_Select('wpsg_mod_productgroups_template', __('Template', 'wpsg'), $this->view['templates'], $this->view['data']['template_file']); ?>
+							<?php echo wpsg_drawForm_Select('wpsg_mod_productgroups_infopage', __('Info Seite', 'wpsg'), $this->view['pages'], $this->view['data']['infopage']); ?>
+				
+						</div>
+					</div>
+				
+					<p class="submit">
+						<input type="submit" value="<?php echo __('Produktgruppe speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
+						<input type="submit" value="<?php echo __('Produktgruppe speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
+					</p>
+			
+				</div>
 			</div>
-			<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="wpsg-customer-tab-a active"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=index"><?php echo __("Produktgruppenverwaltung", "wpsg"); ?></a></li>
-                    <li role="presentation" class="active"><a href="<?php
-
-                        echo wpsg_admin_url('Productgroups', '', ['wpsg_mod_action' => 'add']);
-
-                    ?>"><span class="glyphicon glyphicon-plus"></span><?php echo __("Produktgruppe anlegen/bearbeiten", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-				</ul>
-			</div>
+			
 		</div>
-
-    </nav>
-
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-	<div class="wpsg_clear"></div>
-
-    <form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=save&noheader=1" enctype="multipart/form-data">
 		
-		<?php echo \wp_nonce_field('wpsg-productgroup-save-'.wpsg_getInt($_REQUEST['edit_id'])); ?>
-		
-        <div class="content form-horizontal">
-
-            <div class="row">
-                <div class="col-md-8 col-lg-8">
-
-                    <?php echo wpsg_drawForm_AdminboxStart(__('Allgemein', 'wpsg')); ?>
-
-                        <?php echo wpsg_drawForm_Input('name', __('Produktgruppenname', 'wpsg'), $this->view['data']['name']); ?>
-
-                        <?php if (wpsg_isSizedArray($this->view['languages'])) { ?>
-                            <?php foreach ($this->view['languages'] as $l) { if ($l['locale'] != $this->getDefaultLanguageLocale()) { ?>
-
-                                <?php echo wpsg_drawForm_Input(
-                                    'lang['.$l['locale'].'][name]',
-                                    __('Produktgruppenname', 'wpsg').'&nbsp;('.$l['name'].'&nbsp;<img src="'.$this->getFlagURL().$l['flag'].'" alt="'.$l['Name'].'" />)',
-                                    $this->view['data']['lang'][$l['locale']]['name']
-                                ); ?>
-
-                            <?php } } ?>
-                        <?php } ?>
-
-                        <?php echo wpsg_drawForm_Select('template_file', __('Template', 'wpsg'), $this->view['templates'], $this->view['data']['template_file']); ?>
-                        <?php echo wpsg_drawForm_Select('infopage', __('Info Seite', 'wpsg'), $this->view['pages'], $this->view['data']['infopage']); ?>
-                        <?php echo wpsg_drawForm_Input('pos', __('Positionsnummer (Sortierung, aufsteigend)', 'wpsg'), $this->view['data']['pos']); ?>
-
-                        <div class="form-group form-group-sm ">
-                            <label class="col-sm-6 control-label"><?php echo __('Produktgruppenbild', 'wpsg'); ?></label>
-                            <div class="col-sm-6">
-                                <div class="wpsg_field_wrap">
-                                    <div id="imageBox"><?php
-
-                                        if ($oProductgroup !== null) {
-
-                                            if ($oProductgroup->getImage() > 0) {
-
-                                                echo wp_get_attachment_image($oProductgroup->getImage(), 'full', false, [
-                                                    'style' => 'max-width:100%; height:auto; margin-bottom:8px;'
-                                                ]);
-
-                                            }
-
-                                        }
-
-                                    ?></div>
-
-                                    <input value="Mediathek" class="button" type="button" style="text-align:center;" size="10" id="btnAddImgLink" />
-                                    <input type="hidden" name="image" value="<?php echo (($oProductgroup !== null)?$oProductgroup->getImage():0); ?>" id="image_input" />
-
-                                    <script>
-
-                                        let wpframe = undefined;
-                                        let imageBox = document.getElementById('imageBox');
-                                        let elImageInput = document.getElementById('image_input');
-
-                                        document.getElementById('btnAddImgLink').addEventListener('click', (event) => {
-
-                                            event.preventDefault();
-
-                                            if (wpframe !== undefined) { wpframe.open(); return; }
-
-                                            wpframe = wp.media.frames.file_frame = wp.media({
-                                                title: "<?php echo __('AuswÃ€hlen oder Hochladen von Medien', 'wpsg'); ?>",
-                                                button: { text: "<?php echo __('Medien benutzen', 'wpsg'); ?>" },
-                                                multiple: false
-                                            });
-
-                                            wpframe.on('select', () => {
-
-                                                let attachments = wpframe.state().get('selection').map((attachment) => {
-
-                                                    attachment.toJSON();
-
-                                                    return attachment;
-
-                                                });
-
-                                                for (let i = 0; i < attachments.length; ++i) {
-
-                                                    let attachment = attachments[i];
-
-                                                    imageBox.innerHTML = '<img src="' + attachment.attributes.url + '" alt="" style="max-width:100%; margin-bottom:8px;"/>';
-                                                    elImageInput.value = attachment.attributes.id;
-
-                                                }
-
-                                            });
-
-                                            wpframe.open();
-
-                                        });
-
-                                    </script>
-                                </div>
-                            </div>
-                            <div class="clearfix wpsg_clear"></div>
-                        </div>
-
-                    <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-                </div>
-                <div class="col-md-4 col-lg-4">
-
-                    <?php $this->callMods('wpsg_mod_productgroups_addedit_sidebar', array(&$this->view['data'])); ?>
-
-                </div>
-            </div>
-
-            <input type="submit" value="<?php echo __('Produktgruppe speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
-	        <input type="submit" value="<?php echo __('Produktgruppe speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
-
-        </div>
-
-        <?php if (isset($this->view['data']['id']) && $this->view['data']['id'] > 0) { ?>
+		<?php if (isset($this->view['data']['id']) && $this->view['data']['id'] > 0) { ?>
 		<input type="hidden" name="edit_id" value="<?php echo $this->view['data']['id']; ?>" />
 		<?php } ?>
-
-    </form>
-
+	
+	</form>
+	
 </div>
Index: /views/mods/mod_productgroups/admin_setcapabilities.phtml
===================================================================
--- /views/mods/mod_productgroups/admin_setcapabilities.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/admin_setcapabilities.phtml	(revision 5261)
@@ -9,5 +9,5 @@
 ?>
 <tr>
-	<td class="wpsg_col_capname"><?php echo __('Produktgruppen', 'wpsg'); ?></td>
+	<td class="wpsg_col_capname"><?php echo __('Statistik', 'wpsg'); ?></td>
 	<?php foreach ($arRoles as $role_key => $r) { ?>
 	<td class="wpsg_col_cap">
Index: /views/mods/mod_productgroups/index.phtml
===================================================================
--- /views/mods/mod_productgroups/index.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/index.phtml	(revision 5261)
@@ -6,177 +6,56 @@
 
 ?>
+<div class="wrap">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Produktgruppenverwaltung', 'wpsg'); ?>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=add" class="add-new-h2"><?php echo __("HinzufÃŒgen", "wpsg"); ?></a>				
+	</h2>
+	
+	<br />
 
-<div class="wpsg_productgroups" id="wpsg-bs">
-
-    <nav class="navbar navbar-default">
-
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="wpsg-customer-tab-a active"><a href="#" onclick="return false;"><?php echo wpsg_translate(__("Produktgruppenverwaltung (#1# Produktgruppen)", "wpsg"), $this->view['countAll']); ?></a></li>
-                    <li role="presentation" class="wpsg-customer-tab-a wpsg_showhide_filter" id="wpsg-customer-tab-0"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-                    <li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'add'))?'active':''); ?>"><a href="<?php 
-							
-						echo wpsg_admin_url('Productgroups', '', ['wpsg_mod_action' => 'add']);
-						
-					?>"><span class="glyphicon glyphicon-plus"></span><?php echo __("HinzufÃŒgen", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-				</ul>
-			</div>
-		</div>
-
-        <div class="wpsg-filter wpsg-customer-tab wpsg-customer-tab-0 container-fluid form-horizontal" style="display:<?php echo (($this->view['hasFilter'] === true)?'block':'none'); ?>;">
-            <div class="row">
-                <div class="col-lg-4">
-                    <form method="post" id="filter_form">
-
-						<?php echo wp_nonce_field('wpsg-mod-productgroups-search'); ?>
-						
-                        <input id="wpsg_seite" type="hidden" name="filter[page]" value="<?php echo @$this->view['page']; ?>" class="current-page" />
-
-                        <input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-                        <input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" />
-
-                        <?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
-
-                        <?php echo wpsg_drawForm_SubmitButton(__('Produktgruppen suchen')); ?><br />
-
-                    </form>
-                </div>
-            </div>
-        </div>
-
-    </nav>
+	<?php echo $this->writeBackendMessage(); ?>
 	
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-	<div class="wpsg_clear"></div>
+	<?php if (!is_array($this->view['data']) || sizeof($this->view['data']) == 0) { ?>
+	<p><?php echo __("Keine Produktgruppen hinterlegt.", "wpsg"); ?></p>
+	<?php } else { ?>
+	<div class="clear"></div>
+	<table cellspacing="0" class="widefat post fixed">
+		<thead>
+			<tr>
+				<th style="" class="manage-column column-title" id="title" scope="col"><?php echo __("Name", "wpsg"); ?></th>
+				<th style="" class="manage-column column-title" id="title" scope="col"><?php echo __("Template", "wpsg"); ?></th>
+				<th style="" class="manage-column column-title" id="title" scope="col"><?php echo __("Produkte", "wpsg"); ?></th>
+			</tr>
+		</thead>
+		<tbody>
+			<?php foreach ($this->view['data'] as $g) { ?>
+			<tr valign="top" class="alternate author-self status-draft iedit" id="post-<?php echo $g['id']; ?>">
+				<td class="post-title column-title">
+					<strong><a title="<?php echo __("Diese Produktgruppe bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=edit&edit_id=<?php echo $g['id']; ?>" class="row-title"><?php echo $g['name']; ?></a></strong>
+					<div class="row-actions">
+						<span class="edit"><a title="<?php echo __("Diese Produktgruppe bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=edit&edit_id=<?php echo $g['id']; ?>"><?php echo __("Bearbeiten", "wpsg"); ?></a>
+						|
+						<span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sich sicher?", "wpsg"); ?>')) return false;" title="<?php echo __("Diese Produktgruppe lÃ¶schen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Productgroups&wpsg_mod_action=del&noheader=1&edit_id=<?php echo $g['id']; ?>"><?php echo __("LÃ¶schen", "wpsg"); ?></a>
+						<?php if ($g['countProdukte'] > 0) { ?>
+						|
+						<span class="edit"><a title="<?php echo __("Zur Produktliste", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&search[pgruppe]=<?php echo $g['id']; ?>"><?php echo __("Zur Produktliste", "wpsg"); ?></a>
+						<?php } ?>						
+					</span>
+				</td> 
+				<td><?php echo (($g['template_file'] == "0")?'Individuelle Produkttemplates':$g['template_file']); ?></td>
+				<td><?php echo $g['countProdukte']; ?></td>
+			</tr>
+			<?php } ?>
+		</tbody>
+		<tfoot>
+			<tr>
+				<th style="" class="manage-column column-title" id="title" scope="col"><?php echo __("Name", "wpsg"); ?></th>
+				<th style="" class="manage-column column-title" id="title" scope="col"><?php echo __("Template", "wpsg"); ?></th>
+				<th style="" class="manage-column column-title" id="title" scope="col"><?php echo __("Produkte", "wpsg"); ?></th>
+			</tr>
+		</tfoot>
+	</table>
+	<?php } ?>
 	
-    <?php if ($this->view['pages'] > 1) { ?>
-        <nav class="pagination_wrap">
-            <ul class="pagination">
-                <?php if ($this->view['arFilter']['page'] > 1) { ?>
-                    <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] - 1; ?>);" href="#" aria-label="<?php echo __('Vorherige Seite'); ?>"><span aria-hidden="true">&laquo;</span></a></li>
-                <?php } ?>
-                <?php for ($i = 1; $i <= $this->view['pages']; $i ++) { ?>
-                    <li class="<?php echo (($i == $this->view['arFilter']['page'])?'active':''); ?>"><a onclick="return goPage(<?php echo $i; ?>);" href="#"><?php echo $i; ?></a></li>
-                <?php } ?>
-                <?php if ($this->view['arFilter']['page'] + 1 <= $this->view['pages']) { ?>
-                    <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] + 1; ?>);" href="#" aria-label="<?php echo __('NÃ€chste Seite'); ?>"><span aria-hidden="true">&raquo;</span></a></li>
-                <?php } ?>
-            </ul>
-        </nav>
-	<?php } ?>
-
-    <div class="wpsg_clear"></div>
-
-	<div class="content">
-
-        <?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-
-            <table class="table wpsg-table-order table-bordered table-hover table-striped wpsg-table-customer">
-                <thead>
-                    <tr>
-                        <th class="wpsg_pic_col"></th>
-                        <th class="wpsg_order col_name" data-order="nr"><?php echo __("Name", 'wpsg'); ?></th>
-                        <th class="wpsg_order col_template" data-order="template"><?php echo __("Template", 'wpsg'); ?></th>
-                        <th class="wpsg_order col_pos" data-order="template"><?php echo __("Position", 'wpsg'); ?></th>
-                        <th class="wpsg_order col_products" data-order="products"><?php echo __("Produkte", 'wpsg'); ?></th>
-                    </tr>
-                </thead>
-                <tbody>
-                    <?php foreach ($this->view['arData'] as /** @var wpsg_productgroup */ $pg) { ?>
-                    <tr>
-                        <td class="wpsg_pic_col">
-                            <?php if ($pg->getImage() > 0) { ?>
-
-                                <?php echo \wp_get_attachment_image($pg->getImage(), [75, 75]); ?>
-
-                            <?php } ?>
-                        </td>
-                        <td class="col_name">
-                            <strong><a title="<?php echo __("Diese Produktgruppe bearbeiten", "wpsg"); ?>" href="<?php
-
-                                echo wpsg_admin_url('Productgroups', '', ['wpsg_mod_action' => 'edit', 'edit_id' => $pg->id]);
-
-                            ?>" class="row-title"><?php echo $pg->name; ?></a></strong>
-					        <div class="row-actions">
-                                <span class="edit"><a title="<?php echo __("Diese Produktgruppe bearbeiten", "wpsg"); ?>" href="<?php
-										
-									echo wpsg_admin_url('Productgroups', '', ['wpsg_mod_action' => 'edit', 'edit_id' => $pg->id]);
-										
-								?>"><?php echo __("Bearbeiten", "wpsg"); ?></a>
-                                |
-                                <span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sich sicher?", "wpsg"); ?>')) return false;" title="<?php echo __("Diese Produktgruppe lÃ¶schen", "wpsg"); ?>" href="<?php 
-										
-									echo wpsg_admin_url('Productgroups', '', ['wpsg_mod_action' => 'del', 'edit_id' => $pg->id], ['noheader' => '1']); 
-										
-								?>"><?php echo __("LÃ¶schen", "wpsg"); ?></a>
-                                <?php if ($pg->countProducts() > 0) { ?>
-                                |
-                                <span class="edit"><a title="<?php echo __("Zur Produktliste", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&search[pgruppe]=<?php echo $pg->id; ?>"><?php echo __("Zur Produktliste", "wpsg"); ?></a>
-                                <?php } ?>
-                            </div>
-                        </td>
-                        <td class="col_template">
-                            <?php echo (($pg->template_file == "0")?'Individuelle Produkttemplates':$pg->template_file); ?>
-                        </td>
-						<td class="col_pos">
-                            <?php echo $pg->pos; ?>
-                        </td>
-                        <td class="col_products">
-                            <?php echo $pg->countProducts(); ?>
-                        </td>
-                    </tr>
-                    <?php } ?>
-                </tbody>
-            </table>
-
-            <?php if ($this->view['pages'] > 1) { ?>
-                <nav class="pagination_wrap pagination_wrap_bottom">
-                    <ul class="pagination">
-                        <?php if ($this->view['arFilter']['page'] > 1) { ?>
-                            <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] - 1; ?>);" href="#" aria-label="<?php echo __('Vorherige Seite'); ?>"><span aria-hidden="true">&laquo;</span></a></li>
-                        <?php } ?>
-                        <?php for ($i = 1; $i <= $this->view['pages']; $i ++) { ?>
-                            <li class="<?php echo (($i == $this->view['arFilter']['page'])?'active':''); ?>"><a onclick="return goPage(<?php echo $i; ?>);" href="#"><?php echo $i; ?></a></li>
-                        <?php } ?>
-                        <?php if ($this->view['arFilter']['page'] + 1 <= $this->view['pages']) { ?>
-                            <li><a onclick="return goPage(<?php echo $this->view['arFilter']['page'] + 1; ?>);" href="#" aria-label="<?php echo __('NÃ€chste Seite'); ?>"><span aria-hidden="true">&raquo;</span></a></li>
-                        <?php } ?>
-                    </ul>
-                </nav>
-            <?php } ?>
-
-        <?php } else { ?>
-
-            <?php echo wpsg_drawForm_AdminboxStart(); ?>
-    		<?php echo __('Keine Produktgruppen in der Datenbank.', 'wpsg'); ?>
-            <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-        <?php } ?>
-
 </div>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-    <?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo $this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower($this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-
-	function goPage(page)
-	{
-
-		//if (page <= 0 || page == <?php echo $this->view['arFilter']['page']; ?> || page > <?php echo $this->view['pages']; ?>) return;
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-/* ]]> */</script>
Index: /views/mods/mod_productgroups/list.phtml
===================================================================
--- /views/mods/mod_productgroups/list.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/list.phtml	(revision 5261)
@@ -10,53 +10,32 @@
 	$showP = 4;
 	
+	if (!$this->hasMod("wpsg_mod_produktbilder")) die(__("Dieses Template erfordert das Modul mod_produktbilder.", "wpsg"));
+	
+	// Dimension der Bilder
+	$picW = 150;
+	$picH = 100;	
+	$picMode = 's';
+
 ?>
-
-<?php $c = 0; foreach ((array)$this->view['data'] as $k => $g) {
-
-	$oProductgroup = wpsg_productgroup::getInstance(intval($k));
-	
-	?>
+<?php //wpsg_debug($this->view['data']) ?>
+<?php $c = 0; foreach ((array)$this->view['data'] as $k => $g) { ?>
 <?php //wpsg_debug($g) ?>
-<div class="wpsg_pgruppen_list_row <?php
-			
-		echo (($oProductgroup->hasActiveDiscount())?'active_discount':'');
-
-	?>">
+<div class="wpsg_pgruppen_list_row">
 	<div class="wpsg_pgruppen_list_titel">
 		<a href="<?php echo WPSG_URL_WP ?>?page_id=<?php echo get_the_ID(); ?>&show=<?php echo $k ?>">
-			<h2><?php echo $g['pgruppe_name'] ?></h2>
+			<?php echo $g['pgruppe_name'] ?>
 		</a>
 	</div>
 	<div class="wpsg_pgruppen_list_produkte">	
 		<?php for ($i = 0; $i < $showP && $i < sizeof($g['produkte']); $i ++) { ?>
-
-            <?php
-
-                if ($this->hasMod('wpsg_mod_stock')) $lagerbestand = $this->callMod('wpsg_mod_stock', 'getBestand', [$g['produkte'][$i]['id']]);
-                else $lagerbestand = 1;
-
-            ?>
-
-            <?php if ($lagerbestand <= 0) { ?>
-
-                Ausverkauft ...
-
-            <?php } else { ?>
-
-				<?php if (sizeof($g['produkte'][$i]['bilder']??[]) > 0) { ?>
-					<?php $image = array_rand($g['produkte'][$i]['bilder']); ?>
-					<?php if ($image >= 0 && is_int($image)) { ?>
-					<div class="wpsg_pgruppen_list_image">
-	
-						<a href="<?php echo $g['produkte'][$i]['url'] ?>">
-							<?php echo wp_get_attachment_image($g['produkte'][$i]['bilder'][0], 'thumbnail', false, array()); ?>
-						</a>
-	
-					</div>
-					<?php } ?>
-				<?php } ?>
-				
-            <?php } ?>
-
+			<?php $image = array_rand($g['produkte'][$i]['bilder']); ?>
+			<?php if ($image >= 0 && is_int($image)) { ?>
+			<div class="wpsg_pgruppen_list_image">
+				<?php $image_path = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($g['produkte'][$i]['id'], $g['produkte'][$i]['bilder'][$image], $picW, $picH, $picMode)) ?>
+				<a href="<?php echo $g['produkte'][$i]['url'] ?>">
+					<img src="<?php echo $image_path; ?>" alt="<?php echo $g['produkte'][$i]['name']; ?>"/>
+				</a>
+			</div>
+			<?php } ?>
 		<?php } ?>
 		<div style="clear:both;"></div>			
Index: /views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml	(revision 5261)
@@ -4,28 +4,14 @@
 	 * Template fÃŒr die Lagerverwaltung innerhalb der Einstellungen der Produktgruppe
 	 */
-
+	//wpsg_debug($this->view['wpsg_mod_productgroups']['data']);
 ?>
-
-<?php /* Lagerbestand START */ ?>
-<?php if ($this->hasMod('wpsg_mod_stock')) { ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktgruppen Lagerbestand'));  ?>
-
-	<?php echo wpsg_drawForm_Input('wpsg_mod_productgroups[stock_value]', __('Bestand', 'wpsg'), wpsg_hspc(@$this->view['wpsg_mod_productgroups']['data']['stock_value']), array()); ?>
-   <?php echo wpsg_drawForm_Checkbox('wpsg_mod_productgroups[stock_aktiv]', __('Lagerbestand zÃ€hlen', 'wpsg'), @$this->view['wpsg_mod_productgroups']['data']['stock_aktiv'], array()); ?>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
-<?php /* Lagerbestand ENDE */ ?>
-
-<?php /* Rabatt START  ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktgruppen Rabatt'));  ?>
-
+<div id="postbox_productgroupstock" class="postbox">
+	<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+	<h3 class="handle">
+		<span><?php echo __('Produktgruppen Lagerbestand', 'wpsg'); ?></span>
+	</h3>
 	<div class="inside">
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_discount[discount_aktiv]', __('Aktion aktiv', 'wpsg'), $this->view['wpsg_mod_discount']['data'][0]); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_from]', __('Start (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc(wpsg_getStr($this->view['wpsg_mod_discount']['data'][1]))); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_to]', __('Ende (TT.MM.JJJJ)', 'wpsg'), wpsg_hspc(wpsg_getStr($this->view['wpsg_mod_discount']['data'][2]))); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_discount[discount_value]', __('Rabatt', 'wpsg'), wpsg_ff(wpsg_getStr($this->view['wpsg_mod_discount']['data'][3]))); ?>
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productgroups[stock_aktiv]', __('Lagerbestand zÃ€hlen', 'wpsg'), $this->view['wpsg_mod_productgroups']['data']['stock_aktiv'], array()); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_productgroups[stock_value]', __('Bestand', 'wpsg'), wpsg_hspc($this->view['wpsg_mod_productgroups']['data']['stock_value']), array()); ?>
 	</div>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php  Rabatt ENDE */ ?>
+</div>
Index: ews/mods/mod_productgroups/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_productgroups/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,28 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Konfiguration der Produktvariablen innerhalb der Produktverwaltung
-	 */
- 
-?>
-<div class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Produktgruppen', 'wpsg'); ?> 
-		</h3>
-	</div>
-	<div class="panel-body">
-		
-		<?php if (!wpsg_isSizedArray($this->view['wpsg_mod_productgroups']['data'])) { ?>
-		<p><?php echo __('Bisher wurden keine Produktgruppen angelegt.', 'wpsg'); ?></p>
-		<?php } else { ?>
-		<?php echo wpsg_drawForm_Select('wpsg_productgroup', __('Produktgruppe', 'wpsg'), @$this->view['wpsg_mod_productgroups']['data'], @$this->view['wpsg_mod_productgroups']['produkt_data']['pgruppe']); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_productgroup_sticky_von', __('Sticky von', 'wpsg'), @$this->view['wpsg_mod_productgroups']['sticky_von']); ?>
-		<?php echo wpsg_drawForm_Input('wpsg_productgroup_sticky_bis', __('Sticky bis', 'wpsg'), @$this->view['wpsg_mod_productgroups']['sticky_bis']); ?>
-		<?php } ?>
-		 
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;page=wpsg-Productgroups"><span class="wpsg-glyphicon glyphicon glyphicon-book"></span><?php echo __('Produktgruppenverwaltung', 'wpsg'); ?></a><br />
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productgroups"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Produktgruppe', 'wpsg'); ?></a>
-		
-	</div>
-</div>
Index: /views/mods/mod_productgroups/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_productgroups/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_productgroups/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,25 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Konfiguration der Produktvariablen innerhalb der Produktverwaltung
+	 */
+ 
+?>
+<div id="wpsg_productgroups" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Produktgruppen', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		
+		<?php if (sizeof($this->view['wpsg_mod_productgroups']['data']) <= 0) { ?>
+		<p><?php echo __('Bisher wurden keine Produktgruppen angelegt.', 'wpsg'); ?></p>
+		<?php } else { ?>
+		<?php echo wpsg_drawForm_Select('wpsg_productgroup', __('Produktgruppe', 'wpsg'), $this->view['wpsg_mod_productgroups']['data'], $this->view['wpsg_mod_productgroups']['produkt_data']['pgruppe']); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_productgroup_sticky_von', __('Sticky von', 'wpsg'), $this->view['wpsg_mod_productgroups']['sticky_von']); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_productgroup_sticky_bis', __('Sticky bis', 'wpsg'), $this->view['wpsg_mod_productgroups']['sticky_bis']); ?>
+		<?php } ?>
+		
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;page=wpsg-Productgroups"><?php echo __('Produktgruppenverwaltung', 'wpsg'); ?></a>
+	</div>
+</div>
Index: /views/mods/mod_productgroups/produkt_index_filter.phtml
===================================================================
--- /views/mods/mod_productgroups/produkt_index_filter.phtml	(revision 5261)
+++ /views/mods/mod_productgroups/produkt_index_filter.phtml	(revision 5261)
@@ -0,0 +1,45 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Produktgruppenauswahl in der ProduktÃŒbersicht
+	 */
+
+?> 
+
+<script type="text/javascript">
+
+	function wpsg_goGroup(group_id)
+	{
+		
+		jQuery('#wpsg_seite').val('1');
+		jQuery('#wpsg_search_pgruppe').val(group_id);
+		jQuery('#filter_form').submit();
+
+		return false;
+		
+	}
+	
+</script>
+
+<input type="hidden" id="wpsg_search_pgruppe" name="search[pgruppe]" value="<?php echo $_REQUEST['search']['pgruppe']; ?>" />
+
+<?php if (is_array($this->view['productgroups']) && sizeof($this->view['productgroups']) > 0) { ?>
+<ul class="subsubsub wpsg_order_index_status">
+	<?php foreach ($this->view['productgroups'] as $pg) { ?>
+	<li>
+		<?php if (isset($_REQUEST['search']['pgruppe']) && $_REQUEST['search']['pgruppe'] == $pg['id']) { ?>
+		<span class="akt"><?php echo wpsg_hspc($pg['name']); ?></span> <span class="count">(<?php echo $pg['countProdukte']; ?>) | </span>
+		<?php } else { ?>
+		<a onclick="return wpsg_goGroup(<?php echo $pg['id']; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&search[pgruppe]=<?php echo $pg['id']; ?>"><?php echo wpsg_hspc($pg['name']); ?> <span class="count">(<?php echo $pg['countProdukte']; ?>)</span></a> |
+		<?php } ?>	
+	</li>
+	<?php } ?>
+	<li>
+		<?php if (isset($_REQUEST['search']['pgruppe']) && $_REQUEST['search']['pgruppe'] > 0) { ?>
+		<a onclick="return wpsg_goGroup(0);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt"><?php echo __('Alle', 'wpsg'); ?> <span class="count">(<?php echo $this->view['countProducts']; ?>)</span></a>
+		<?php } else { ?>
+		<span class="akt"><?php echo __('Alle', 'wpsg'); ?></span> <span class="count">(<?php echo $this->view['countProducts']; ?>)</span>
+		<?php } ?>
+	</li>
+</ul>
+<?php } ?>
Index: /views/mods/mod_productgroups/settings_edit.phtml
===================================================================
--- /views/mods/mod_productgroups/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/settings_edit.phtml	(revision 5261)
@@ -7,8 +7,4 @@
 ?>
 <?php echo wpsg_drawForm_Select('wpsg_productgroups_page', __('ProduktgruppenÃŒbersichtsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_productgroups_page'), array('help' => 'wpsg_mod_productgroups_page')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_productgroups_page_layout', __('Layout der Ãbersichtsseite', 'wpsg'), [
-    '0' => 'Layout 1 (show.phtml)',
-    '1' => 'Layout 2 (show_2.phml)'
-], $this->get_option('wpsg_productgroups_page_layout'), ['help' => 'wpsg_productgroups_page_layout']); ?>
 <?php echo wpsg_drawForm_Select('wpsg_productgroups_order', __('Sortierung innerhalb der Gruppe', 'wpsg'), array(
 	'id' => __('Nach ID', 'wpsg'),
@@ -18,8 +14,2 @@
 	'preis' => __('Preis', 'wpsg')
 ), $this->get_option('wpsg_productgroups_order'), array('help' => 'wpsg_mod_productgroups_order')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productgroups_order_filter', __('Filter in Bestellverwaltung aktivieren', 'wpsg'), $this->get_option('wpsg_mod_productgroups_order_filter')); ?>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productgroups_productindex', __('In ProduktÃŒbersicht (Backend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_productgroups_productindex')); ?>
Index: /views/mods/mod_productgroups/show.phtml
===================================================================
--- /views/mods/mod_productgroups/show.phtml	(revision 8528)
+++ /views/mods/mod_productgroups/show.phtml	(revision 5261)
@@ -7,14 +7,30 @@
 	 */
 
+	if (!$this->hasMod("wpsg_mod_produktbilder")) die(__("Dieses Template erfordert das Modul mod_produktbilder.", "wpsg"));
+		
+	// Dimension der Bilder
+	$picW = 200;
+	$picH = 200;	
+	$picMode = 'c';
+
+	//$p['produktattribute'][$index]['name'];		Der Name des Attributs
+	//$p['produktattribute'][$index]['value'];		Der Wert des Attributs
+	//$index ist die Nummer des Produktattributs
+	
+	//AusgabemÃ¶glichkeit bei aktiviertem Debug Modus
+	//wpsg_debug($this->view['data']);	
+	
 ?>
 <div class="wpsg_pgruppen_single">
 	<div class="wpsg_pgruppen_single_produkte_wrap">
 		<div class="wpsg_pgruppen_single_produkte">
-		<?php foreach ((array)$this->view['data']['produkte'] as $p) { ?> 
+		<?php foreach ((array)$this->view['data']['produkte'] as $p) { ?>
+		<?php //wpsg_debug($p) ?>
 			<?php if (sizeof($p['bilder']) > 0) { ?>
 			<?php $image = array_rand($p['bilder']); ?>			
-			<div class="wpsg_pgruppen_single_list_image">								
+			<div class="wpsg_pgruppen_single_list_image">
+				<?php $image_path = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($p['id'], $p['bilder'][$image], $picW, $picH, $picMode)) ?>				
 				<a href="<?php echo $p['url'] ?>">
-					<?php echo wp_get_attachment_image($p['bilder'][0], 'medium', false, array()); ?>
+					<img src="<?php echo $image_path; ?>" alt="<?php echo $p['name']; ?>"/>
 				</a>
 			</div>
Index: ews/mods/mod_productgroups/show_2.phtml
===================================================================
--- /views/mods/mod_productgroups/show_2.phtml	(revision 8528)
+++ 	(revision )
@@ -1,107 +1,0 @@
-<?php
-
-    /** Template fÃŒr die Anzeige von Produktgruppen Layout 2 */
-
-    namespace wpsg;
-
-    $page_url = \get_permalink(\get_the_ID());
-    $page_url .= ((strpos($page_url, '?') === false)?'?':'&');
-
-    if (isset($_REQUEST['show'])) {
-
-        $oProductgroup = \wpsg_productgroup::getInstance(intval($_REQUEST['show']));
-        $arProducts = $oProductgroup->findProducts();
-        $view = 'products';
-
-    } else {
-
-        $arProductgroups = \wpsg_productgroup::find();
-        $view = 'productgroups';
-
-    }
-
-?>
-
-<div class="wpsg_mod_productgroup_layout2_wrap">
-    <?php if ($view === 'products') { ?>
-
-        <div class="wpsg_mod_productgroup_layout2 products">
-
-            <?php foreach ($arProducts as $oProduct) { ?>
-
-                <?php echo $this->renderProdukt($oProduct->getId(), $oProductgroup->getTemplate()); ?>
-
-            <?php } ?>
-
-            <br />
-
-            <a href="<?php echo $page_url; ?>"><?php echo __('ZurÃŒck zur Ãbersicht', 'wpsg'); ?></a>
-            
-        </div>
-
-    <?php } else if ($view === 'productgroups') { ?>
-
-        <div class="wpsg_mod_productgroup_layout2 productgroups">
-
-            <?php foreach ($arProductgroups as $k => $oProductgroup) { ?>
-
-                <a href="<?php
-
-                    if (intval($oProductgroup->__get('infopage')) > 0) echo \get_permalink(intval($oProductgroup->__get('infopage')));
-                    else echo $page_url.'show='.$oProductgroup->getId();
-
-                    ?>" class="productgroup <?php
-			
-						echo (($oProductgroup->hasActiveDiscount())?'active_discount':'');
-			
-					?>">
-					
-                    <div class="title"><?php echo $oProductgroup->getLabel(); ?></div>
-
-                    <?php echo \wp_get_attachment_image($oProductgroup->getImage(), [462, 462], false, [
-                        'class' => 'bg'
-                    ]); ?>
-					
-					<?php if ($oProductgroup->hasActiveDiscount()) { ?>
-						<div class="badge_overlay"><div class="badge">SALE</div></div>
-					<?php } ?>
-
-                </a>
-
-            <?php } ?>
-
-        </div>
-
-        <style>
-
-            .wpsg_mod_productgroup_layout2.productgroups { all:revert; width:100%; display:grid; grid-template-columns:repeat(2, 1fr); grid-template-rows:repeat(10, 1fr); grid-column-gap:1rem; grid-row-gap:1rem; }
-            .wpsg_mod_productgroup_layout2.productgroups > .productgroup { grid-column:span 2; padding-top:100%; text-decoration:none; position:relative; overflow:hidden; transition:all 0.3s ease; overflow:hidden width:100%; }
-            .wpsg_mod_productgroup_layout2.productgroups > .productgroup  .bg { position:absolute; left:0; top:0; object-position:50% 50%; background-color:#DEDEDE; width:100%; height:100%; object-fit:cover; z-index:1; }
-            .wpsg_mod_productgroup_layout2.productgroups > .productgroup .title { z-index:2; border-radius:2px; transition:all 0.3s ease; position:absolute; left:1rem; top:1rem; background-color:#000000; color:#FFFFFF; padding:0 0.5rem; }
-            .wpsg_mod_productgroup_layout2.productgroups > .productgroup:hover .title { background-color:#FFFFFF; color:#000000; }
-
-			.wpsg_mod_productgroup_layout2 .productgroup.active_discount { position:relative; }
-			.wpsg_mod_productgroup_layout2 .productgroup.active_discount .badge_overlay { position:absolute; left:0; top:0; width:100%; height:100%; overflow:hidden; pointer-events:none; z-index:100; }
-			.wpsg_mod_productgroup_layout2 .productgroup.active_discount .badge_overlay .badge {
-				margin:0; color:white; padding:3px 10px; font-size:1rem; text-align:center;
-				background:#ed1b24; position:absolute; top:0; right:0; transform:translateX(30%) translateY(0%) rotate(45deg); transform-origin:top left;
-			}
-			.wpsg_mod_productgroup_layout2 .productgroup.active_discount .badge_overlay .badge:before {
-				content:''; position:absolute; top:0; right:100%; margin:0 -1px; width:100%; height:100%; background:inherit; min-width:55px;
-			}
-			.wpsg_mod_productgroup_layout2 .productgroup.active_discount .badge_overlay .badge:after {
-				content:''; position:absolute; top:0; left:100%; margin:0 -1px; width:100%; height:100%; background:inherit; min-width:55px;
-            }
-			
-            @media screen and (min-width:768px) {
-
-                .wpsg_mod_productgroup_layout2.productgroups > .productgroup { padding-top:initial; grid-column:initial; }
-                .wpsg_mod_productgroup_layout2.productgroups > .productgroup:nth-child(6n + 1),
-                .wpsg_mod_productgroup_layout2.productgroups > .productgroup:nth-child(6n + 5) { grid-row:span 2; padding-top:100%; }
-
-            }
-
-        </style>
-
-    <?php } ?>
-</div>
Index: /views/mods/mod_productindex/css/productindex.css
===================================================================
--- /views/mods/mod_productindex/css/productindex.css	(revision 8528)
+++ /views/mods/mod_productindex/css/productindex.css	(revision 5261)
@@ -6,5 +6,5 @@
 .wpsg_mod_productindex .wpsg_mod_productindex_order { float:left;}
 .wpsg_mod_productindex .wpsg_mod_productindex_order select { margin-bottom:3px; }
-.wpsg_mod_productindex .wpsg_mod_productindex_viewselect { float:right; margin-top:5px; }
+.wpsg_mod_productindex .wpsg_mod_productindex_viewselect { float:right; margin-top:3px; }
 .wpsg_mod_productindex .wpsg_mod_productindex_pager { float:right; margin-left:5px; }
 
@@ -36,4 +36,2 @@
 .wpsg_mod_productindex_grid .wpsg_produkt_soldout { color:#FF0000; }
 .wpsg_mod_productindex_kuhint { font-size:1em; line-height:125%; margin-top:20px; font-style:italic; }
-
-.wpsg_mod_productindex .wpsg_mod_fuellmenge_info { font-size:0.75em; }
Index: /views/mods/mod_productindex/layouts/grid.phtml
===================================================================
--- /views/mods/mod_productindex/layouts/grid.phtml	(revision 8528)
+++ /views/mods/mod_productindex/layouts/grid.phtml	(revision 5261)
@@ -3,8 +3,18 @@
 	/**
 	 * Template fÃŒr die ProduktÃŒbersichtsseite (Gitteransicht)
-	 */
- 
+	 */ 
+
+	/* Modus fÃŒr das Vorschaubild */
+	$bPicMode = 'c';
+
+	/* HÃ¶he und Breite fÃŒr das Vorschaubild (CSS Layout muss entsprechend angepasst werden) */
+	$nPicWidth = 140;
+	$nPicHeight = 140;
+	
+	/* Wenn es auf false gesetzt wird, wird das erste Bild als Vorschaubild verwendet */
+	$nPicRand = true;
+	
 	$col = 4;
-
+	
 ?>
 
@@ -13,24 +23,172 @@
 	remove_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
 	the_content();
-	add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
-
+	add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));	
+	
 ?>
 
 <div class="wpsg_mod_productindex wpsg_mod_productindex_grid">
-
+ 
 	<form method="get" id="wpsg_mod_productindex_form" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
-
+ 		
  		<?php parse_str($_SERVER['QUERY_STRING'], $arGET); if (wpsg_isSizedArray($arGET)) { foreach ($arGET as $key => $value) { if (!wpsg_isSizedArray($value)) { ?>
- 		<input type="hidden" name="<?php echo $key; ?>" value="<?php echo htmlspecialchars($value); ?>" />
+ 		<input type="hidden" name="<?php echo $key; ?>" value="<?php echo $value; ?>" />
  		<?php } } } ?>
-
+ 		
 		<input type="hidden" id="wpsg_mod_productindex_filter_page" name="wpsg_mod_productindex[filter][page]" value="<?php echo $this->view['wpsg_mod_productindex']['filter']['page']; ?>" />
-		<input type="hidden" id="wpsg_mod_productindex_filter_order" name="wpsg_mod_productindex[filter][order]" value="<?php echo $this->view['wpsg_mod_productindex']['filter']['order']; ?>" />
+		<input type="hidden" id="wpsg_mod_productindex_filter_order" name="wpsg_mod_productindex[filter][order]" value="<?php echo $this->view['wpsg_mod_productindex']['filter']['order']; ?>" /> 
 		<input type="hidden" id="wpsg_mod_productindex_template" name="wpsg_mod_productindex[template]" value="<?php echo $this->view['wpsg_mod_productindex']['template']; ?>" />
-
+	
 	</form>
-
+	
 	<div class="wpsg_mod_productindex_toolbar wpsg_mod_productindex_toolbar_top">
-
+		
+		<?php if ($this->view['hideOrder'] != '1') { ?>
+		<div class="wpsg_mod_productindex_order">		
+			<span><?php echo __('Sortierung:', 'wpsg'); ?></span>
+			<select name="wpsg_mod_productindex[filter][order]" class="wpsg_mod_productindex_filter_order">
+				<option value="price_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'price_asc')?'selected="selected"':''); ?>><?php echo __('Preis (Kleinster zuerst)', 'wpsg'); ?></option>
+				<option value="price_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'price_desc')?'selected="selected"':''); ?>><?php echo __('Preis (GrÃ¶Ãter zuerst)', 'wpsg'); ?></option>
+				<option value="name_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_asc')?'selected="selected"':''); ?>><?php echo __('Name Aufsteigend', 'wpsg'); ?></option>
+				<option value="name_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_desc')?'selected="selected"':''); ?>><?php echo __('Name Absteigend', 'wpsg'); ?></option>
+				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
+				<option value="cdate_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_desc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Neueste zuerst)', 'wpsg'); ?></option>
+				<option value="anr_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'anr_asc')?'selected="selected"':''); ?>><?php echo __('Artikelnummer Aufsteigend', 'wpsg'); ?></option>
+				<option value="anr_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'anr_desc')?'selected="selected"':''); ?>><?php echo __('Artikelnummer Absteigend', 'wpsg'); ?></option>
+			</select>
+		</div>
+		<?php } ?>
+		
+		<?php if ($this->view['wpsg_mod_productindex']['filter']['pages'] > 1) { ?>
+		<div class="wpsg_mod_productindex_pager">
+			<span><?php echo __('Seite:', 'wpsg'); ?></span>
+			<ul>
+				<?php for ($i = 1; $i <= $this->view['wpsg_mod_productindex']['filter']['pages']; $i ++) { ?>
+				<li>
+					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) {Â ?>
+					<span><?php echo $i; ?></span>
+					<?php } else {Â ?>
+					<a title="<?php echo wpsg_translate(__('Zu Seite #1# wechseln', 'wpsg'), $i); ?>" href="#" onclick="return wpsg_mod_productindex_goPage(<?php echo $i; ?>);"><?php echo $i; ?></a>
+					<?php } ?>
+				</li>
+				<?php } ?>
+			</ul>
+		</div>
+		<?php } ?>
+		
+		<?php if ($this->view['hideViewSelect'] != '1') { ?>
+		<div class="wpsg_mod_productindex_viewselect">
+			<a href="#" onclick="return wpsg_mod_productindex_viewselect('list.phtml');" title="<?php echo __('Zur Listansicht wechseln.', 'wpsg'); ?>">
+				<img src="<?php echo $this->getRessourceURL('mods/mod_productindex/gfx/icon_list.png'); ?>" alt="<?php echo __('Zur Listansicht wechseln.', 'wpsg'); ?>" />
+			</a>
+		</div>
+		<?php } ?>
+		
+		<div class="wpsg_clear"></div>
+		
+	</div>
+
+	<?php if (wpsg_isSizedArray($this->view['arProducts'])) { ?>
+	
+		<?php $i = 0; foreach ($this->view['arProducts'] as $p) { $i ++; ?>
+		
+			<?php if (($i - 1) % $col == 0) { ?><div class="wpsg_mod_productindex_productrow"><?php } ?>
+		 
+			<div class="wpsg_mod_productindex_product <?php echo (($i == sizeof($this->view['arProducts']))?'wpsg_mod_productindex_product_last':''); ?> <?php echo (($i == 1)?'wpsg_mod_productindex_product_first':''); ?>" style="width:<?php echo round((100 / $col), 2) ?>%;"> 
+				<div class="wpsg_mod_productindex_product_inner">
+					<?php if ($this->hasMod('wpsg_mod_produktbilder')) { $arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($p['id'])); ?>
+					<div class="wpsg_mod_productindex_pic">
+						<?php if (wpsg_isSizedArray($arBilder)) {Â ?>
+						<a title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>">
+							<?php if ($nPicRand === true) $nPicIndex = array_rand($arBilder); else $nPicIndex = 0; ?> 
+							<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($p['id'], $arBilder[$nPicIndex], $nPicWidth, $nPicHeight, $bPicMode)); ?>" alt="<?php wpsg_hspc($p['name']); ?>" />
+						</a>
+						<?php } ?>
+					</div>
+					<?php } ?>
+					<div class="wpsg_mod_productindex_content">
+						<div class="wpsg_mod_productindex_title">
+							<a title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo $this->getProductName($this->getProduktID($p['id']), true); ?></a>
+						</div> 
+						<div class="wpsg_mod_productindex_infos"> 
+							<div class="wpsg_mod_productindex_weight">
+								<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProductindex') == '1') { ?>
+								<?php if ($p['min_weight'] == $p['max_weight']) { ?>
+								<?php echo wpsg_translate(__('Gewicht: #1#', 'wpsg'), wpsg_ff($p['weight'], $this->get_option('wpsg_mod_weight_unit'))); ?> 
+								<?php } else { ?>
+								<?php echo wpsg_translate(__('Gewicht: ab #1#', 'wpsg'), wpsg_ff($p['min_weight'], $this->get_option('wpsg_mod_weight_unit'))); ?>
+								<?php } ?>
+								<?php } ?>
+							</div>
+							
+							<div class="wpsg_mod_productindex_fmenge">
+								<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindex_fmenge') == '1') {Â ?>
+								<?php echo wpsg_translate(__('FÃŒllmenge: #1#', 'wpsg'), wpsg_ff($p['fmenge'], $p['feinheit'])); ?>
+								<?php } ?>
+							</div>					
+							
+							<div class="wpsg_mod_productindex_gpreis">
+								<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindex_grundpreis') == '1') { ?>
+								<?php echo wpsg_translate(__('Grundpreis: #1# / #2#', 'wpsg'), 
+										wpsg_ff($p['fmenge_preis'], $this->get_option('wpsg_currency')),
+										wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $p['feinheit'])
+								); ?>
+								<?php }Â ?>
+							</div>	
+						</div>			
+																		
+						<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProductindex') == '1') { ?>
+							<div class="wpsg_mod_produktindex_stock">
+								<?php echo wpsg_translate(__('Lagerbestand: #1#','wpsg'), $p['stock']);  ?>	
+							</div>
+						<?php } ?>
+								
+						<div class="wpsg_mod_productindex_price">
+							<?php if ($p['min_preis'] == $p['max_preis']) { ?>
+								<?php echo wpsg_ff($p['preis'], $this->get_option('wpsg_currency')); ?>
+							<?php } else { ?>
+								<?php echo wpsg_translate(__('ab #1#', 'wpsg'), wpsg_ff($p['min_preis'], $this->get_option('wpsg_currency'))); ?>
+							<?php } ?>
+						</div>
+						<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+						<div class="wpsg_produkt_preishinweis">
+							<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+						</div>
+						<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+						<div class="wpsg_produkt_preishinweis">		
+							<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+							<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+							<?php } else { /* Frontend = BRUTTO Preise */ ?>
+							<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+							<?php } ?>
+						</div>	
+						<?php } ?>
+																		
+						<div class="wpsg_mod_productindex_button">
+						
+							<?php if ($this->hasMod('wpsg_mod_stock') && $this->callMod('wpsg_mod_stock', 'checkBestand', array($p['id'], 1)) === false) { ?>
+							<span class="wpsg_produkt_soldout"><?php echo __('Produkt ausverkauft', 'wpsg'); ?></span>
+							<?php } else { ?>						
+							<a class="wpsg_button" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo __('Zum Produkt', 'wpsg'); ?></a>
+							<?php } ?>
+							
+						</div>
+						
+					</div>
+					<div class="wpsg_clear"></div>
+				</div>				
+			</div> 
+		
+			<?php if (($i - 1) % $col == ($col - 1)) { ?><div class="wpsg_clear"></div></div><?php } ?>
+		
+		<?php } ?>
+		
+		<?php if (($i - 1) % $col != ($col - 1)) { ?><div class="wpsg_clear"></div></div><?php } ?>
+	
+	<?php } else { ?>
+	<div class="wpsg_mod_productindex_empty"><?php echo __('Keine passenden Produkte gefunden.', 'wpsg'); ?></div>
+	<?php } ?>
+	
+	<div class="wpsg_mod_productindex_toolbar wpsg_mod_productindex_toolbar_bottom">
+		
 		<?php if ($this->view['hideOrder'] != '1') { ?>
 		<div class="wpsg_mod_productindex_order">
@@ -41,6 +199,4 @@
 				<option value="name_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_asc')?'selected="selected"':''); ?>><?php echo __('Name Aufsteigend', 'wpsg'); ?></option>
 				<option value="name_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_desc')?'selected="selected"':''); ?>><?php echo __('Name Absteigend', 'wpsg'); ?></option>
-				<option value="pos_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_asc')?'selected="selected"':''); ?>><?php echo __('Position Aufsteigend', 'wpsg'); ?></option>
-				<option value="pos_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_desc')?'selected="selected"':''); ?>><?php echo __('Position Absteigend', 'wpsg'); ?></option>				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
 				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
 				<option value="cdate_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_desc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Neueste zuerst)', 'wpsg'); ?></option>
@@ -50,5 +206,5 @@
 		</div>
 		<?php } ?>
-
+		
 		<?php if ($this->view['wpsg_mod_productindex']['filter']['pages'] > 1) { ?>
 		<div class="wpsg_mod_productindex_pager">
@@ -57,7 +213,7 @@
 				<?php for ($i = 1; $i <= $this->view['wpsg_mod_productindex']['filter']['pages']; $i ++) { ?>
 				<li>
-					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) { ?>
+					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) {Â ?>
 					<span><?php echo $i; ?></span>
-					<?php } else { ?>
+					<?php } else {Â ?>
 					<a title="<?php echo wpsg_translate(__('Zu Seite #1# wechseln', 'wpsg'), $i); ?>" href="#" onclick="return wpsg_mod_productindex_goPage(<?php echo $i; ?>);"><?php echo $i; ?></a>
 					<?php } ?>
@@ -67,5 +223,5 @@
 		</div>
 		<?php } ?>
-
+		
 		<?php if ($this->view['hideViewSelect'] != '1') { ?>
 		<div class="wpsg_mod_productindex_viewselect">
@@ -75,166 +231,7 @@
 		</div>
 		<?php } ?>
-
+		
 		<div class="wpsg_clear"></div>
-
-	</div>
-
-	<?php if (wpsg_isSizedArray($this->view['arProducts'])) { ?>
-
-		<?php $i = 0; foreach ($this->view['arProducts'] as $p) { $oProduct = wpsg_product::getInstance($p['product_key']); $i ++; ?>
-
-			<?php if (($i - 1) % $col == 0) { ?><div class="wpsg_mod_productindex_productrow"><?php } ?>
-
-			<div class="wpsg_mod_productindex_product <?php echo (($i == sizeof($this->view['arProducts']))?'wpsg_mod_productindex_product_last':''); ?> <?php echo (($i == 1)?'wpsg_mod_productindex_product_first':''); ?>" style="width:<?php echo round((100 / $col), 2) ?>%;">
-				<div class="wpsg_mod_productindex_product_inner">
-					
-					<a title="<?php echo __('Zur Detailseite des Produktes', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>">
-						<?php $attachment_id = $this->imagehandler->getAttachmentID($p['product_key']); ?>
-						<?php echo wp_get_attachment_image($attachment_id, array(800, 600)); ?>
-					</a>
-				
-					
-					<div class="wpsg_mod_productindex_content">
-						<div class="wpsg_mod_productindex_title">
-							<a title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo $this->getProductName($this->getProduktID($p['id']), true); ?></a>
-						</div>
-						<div class="wpsg_mod_productindex_infos">
-							<div class="wpsg_mod_productindex_weight">
-								<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProductindex') == '1') { ?>
-									<?php if (($p['weight']) > '0') { ?>
-										<?php if ($p['min_weight'] == $p['max_weight']) { ?>
-											<?php echo wpsg_translate(__('Gewicht: #1#', 'wpsg'), wpsg_ff($p['weight'], $this->get_option('wpsg_mod_weight_unit'))); ?>
-										<?php } else { ?>
-											<?php echo wpsg_translate(__('Gewicht: ab #1#', 'wpsg'), wpsg_ff($p['min_weight'], $this->get_option('wpsg_mod_weight_unit'))); ?>
-										<?php } ?>
-									<?php } ?>
-								<?php } ?>
-							</div>
-							
-						</div>
-
-						<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProductindex') == '1') { ?>
-							<div class="wpsg_mod_produktindex_stock">
-								<?php echo wpsg_translate(__('Lagerbestand: #1#','wpsg'), $p['stock']);  ?>
-							</div>
-						<?php } ?>
-
-						<?php /*Abfrage Preisanzeige nur fÃŒr eingeloggte Benutzer START*/?>
-						<?php if ($this->canDisplayPrice()) { ?>
-							<?php if ($this->hasMod('wpsg_mod_discount') && $this->get_option('wpsg_mod_discount_productindex') == '1') { ?>
-    							
-    							<?php $oldPrice = $oProduct->getOldPrice();  ?>
-                    			
-                    			<?php if ($oldPrice !== false && $oldPrice != $oProduct->getPrice($this->view['data']['product_key'])) { ?>
-                    				<span class="wpsg_mod_productview_newprice wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($oProduct->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span><br />
-                    				<span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
-                    			<?php } else { ?>
-                    				<span class="wpsg_mod_productview_price"><?php echo wpsg_ff($oProduct->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-                    			<?php } ?>   
-                    			            			
-							<?php }else{?>
-							<div class="wpsg_mod_productindex_price">
-								<?php if ($p['min_preis'] == $p['max_preis']) { ?>
-									<?php echo wpsg_ff($p['preis'], $this->get_option('wpsg_currency')); ?>
-								<?php } else { ?>
-									<?php echo wpsg_translate(__('ab #1#', 'wpsg'), wpsg_ff($p['min_preis'], $this->get_option('wpsg_currency'))); ?>
-								<?php } ?>
-							</div>
-							<?php } ?>
-							<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
-							<div class="wpsg_produkt_preishinweis">
-								<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
-							</div>
-							<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
-							<div class="wpsg_produkt_preishinweis">
-								<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
-								<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-								<?php } else { /* Frontend = BRUTTO Preise */ ?>
-								<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-								<?php } ?>
-							</div>
-							<?php } ?>
-						<?php }else{?>
-								<?php echo wpsg_translate(__('Preise nur fÃŒr eingeloggte Benutzer', 'wpsg')); ?>
-						<?php } /* Abfrage Preisanzeige nur fÃŒr eingeloggte Benutzer ENDE */?>
-
-						<div class="wpsg_mod_productindex_fmenge">
-							<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindex_fmenge') == '1') { ?>
-								<?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$oProduct->getPrice($p['product_key']), $p['fmenge'], $oProduct->getId()]); ?>
-							<?php } ?>
-						</div>
-						
-						<div class="wpsg_mod_productindex_button">
-
-							<?php //if ($this->hasMod('wpsg_mod_stock') && $this->callMod('wpsg_mod_stock', 'checkBestand', array($this->getProduktID($p['id']), 1)) === false) { ?>
-							<?php if (false) { ?>
-							<span class="wpsg_produkt_soldout"><?php echo __('wpGermany Vollversion erwerben, Updates erhalten und weiterProdukt ausverkauft', 'wpsg'); ?></span>
-							<?php } else { ?>
-							<a class="wpsg_button" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo __('Zum Produkt', 'wpsg'); ?></a>
-							<?php } ?>
-
-						</div>		
-					</div>
-					<div class="wpsg_clear"></div>
-				</div>
-			</div>
-
-			<?php if (($i - 1) % $col == ($col - 1)) { ?><div class="wpsg_clear"></div></div><?php } ?>
-
-		<?php } ?>
-
-		<?php if (($i - 1) % $col != ($col - 1)) { ?><div class="wpsg_clear"></div></div><?php } ?>
-
-	<?php } else { ?>
-	<div class="wpsg_mod_productindex_empty"><?php echo __('Keine passenden Produkte gefunden.', 'wpsg'); ?></div>
-	<?php } ?>
-
-	<div class="wpsg_mod_productindex_toolbar wpsg_mod_productindex_toolbar_bottom">
-
-		<?php if ($this->view['hideOrder'] != '1') { ?>
-		<div class="wpsg_mod_productindex_order">
-			<span><?php echo __('Sortierung:', 'wpsg'); ?></span>
-			<select name="wpsg_mod_productindex[filter][order]" class="wpsg_mod_productindex_filter_order">
-				<option value="price_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'price_asc')?'selected="selected"':''); ?>><?php echo __('Preis (Kleinster zuerst)', 'wpsg'); ?></option>
-				<option value="price_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'price_desc')?'selected="selected"':''); ?>><?php echo __('Preis (GrÃ¶Ãter zuerst)', 'wpsg'); ?></option>
-				<option value="name_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_asc')?'selected="selected"':''); ?>><?php echo __('Name Aufsteigend', 'wpsg'); ?></option>
-				<option value="name_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_desc')?'selected="selected"':''); ?>><?php echo __('Name Absteigend', 'wpsg'); ?></option>
-				<option value="pos_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_asc')?'selected="selected"':''); ?>><?php echo __('Position Aufsteigend', 'wpsg'); ?></option>
-				<option value="pos_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_desc')?'selected="selected"':''); ?>><?php echo __('Position Absteigend', 'wpsg'); ?></option>				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
-				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
-				<option value="cdate_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_desc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Neueste zuerst)', 'wpsg'); ?></option>
-				<option value="anr_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'anr_asc')?'selected="selected"':''); ?>><?php echo __('Artikelnummer Aufsteigend', 'wpsg'); ?></option>
-				<option value="anr_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'anr_desc')?'selected="selected"':''); ?>><?php echo __('Artikelnummer Absteigend', 'wpsg'); ?></option>
-			</select>
-		</div>
-		<?php } ?>
-
-		<?php if ($this->view['wpsg_mod_productindex']['filter']['pages'] > 1) { ?>
-		<div class="wpsg_mod_productindex_pager">
-			<span><?php echo __('Seite:', 'wpsg'); ?></span>
-			<ul>
-				<?php for ($i = 1; $i <= $this->view['wpsg_mod_productindex']['filter']['pages']; $i ++) { ?>
-				<li>
-					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) { ?>
-					<span><?php echo $i; ?></span>
-					<?php } else { ?>
-					<a title="<?php echo wpsg_translate(__('Zu Seite #1# wechseln', 'wpsg'), $i); ?>" href="#" onclick="return wpsg_mod_productindex_goPage(<?php echo $i; ?>);"><?php echo $i; ?></a>
-					<?php } ?>
-				</li>
-				<?php } ?>
-			</ul>
-		</div>
-		<?php } ?>
-
-		<?php if ($this->view['hideViewSelect'] != '1') { ?>
-		<div class="wpsg_mod_productindex_viewselect">
-			<a href="#" onclick="return wpsg_mod_productindex_viewselect('list.phtml');" title="<?php echo __('Zur Listansicht wechseln.', 'wpsg'); ?>">
-				<img src="<?php echo $this->getRessourceURL('mods/mod_productindex/gfx/icon_list.png'); ?>" alt="<?php echo __('Zur Listansicht wechseln.', 'wpsg'); ?>" />
-			</a>
-		</div>
-		<?php } ?>
-
-		<div class="wpsg_clear"></div>
-
+		
 	</div>
 
@@ -252,8 +249,8 @@
 
 		jQuery('#wpsg_mod_productindex_filter_page').val(page);
-		jQuery('#wpsg_mod_productindex_form').trigger('submit');
+		jQuery('#wpsg_mod_productindex_form').submit();
 
 		return false;
-
+		
 	} // function wpsg_mod_productindex_goPage(page)
 
@@ -262,20 +259,20 @@
 
 		jQuery('#wpsg_mod_productindex_template').val(template);
-		jQuery('#wpsg_mod_productindex_form').trigger('submit');
+		jQuery('#wpsg_mod_productindex_form').submit();
 
 		return false;
-
+		
 	} // function wpsg_mod_productindex_viewselect(template)
-
+	
 	jQuery(document).ready(function() {
 
 		jQuery('.wpsg_mod_productindex_filter_order').bind('change', function() {
-
+			
 			jQuery('#wpsg_mod_productindex_filter_order').val(jQuery(this).find('option:selected').attr('value'));
 			jQuery('#wpsg_mod_productindex_filter_page').val('1');
-			jQuery('#wpsg_mod_productindex_form').trigger('submit');
-
+			jQuery('#wpsg_mod_productindex_form').submit(); 
+					
 		} );
-
+		
 	} );
 
Index: /views/mods/mod_productindex/layouts/list.phtml
===================================================================
--- /views/mods/mod_productindex/layouts/list.phtml	(revision 8528)
+++ /views/mods/mod_productindex/layouts/list.phtml	(revision 5261)
@@ -3,6 +3,16 @@
 	/**
 	 * Template fÃŒr die ProduktÃŒbersichtsseite
-	 */
-
+	 */ 
+
+	/* Modus fÃŒr das Vorschaubild */
+	$bPicMode = 'c';
+
+	/* HÃ¶he und Breite fÃŒr das Vorschaubild (CSS Layout muss entsprechend angepasst werden) */
+	$nPicWidth = 100;
+	$nPicHeight = 100;
+	
+	/* Wenn es auf false gesetzt wird, wird das erste Bild als Vorschaubild verwendet */
+	$nPicRand = true;
+	
 ?>
 
@@ -11,24 +21,24 @@
 	remove_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
 	the_content();
-	add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));
-
+	add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));	
+	
 ?>
 
 <div class="wpsg_mod_productindex wpsg_mod_productindex_list">
-
+	
 	<form method="get" id="wpsg_mod_productindex_form" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
-
+ 		
  		<?php parse_str($_SERVER['QUERY_STRING'], $arGET); if (wpsg_isSizedArray($arGET)) { foreach ($arGET as $key => $value) { if (!wpsg_isSizedArray($value)) { ?>
- 		<input type="hidden" name="<?php echo $key; ?>" value="<?php echo htmlspecialchars($value); ?>" />
+ 		<input type="hidden" name="<?php echo $key; ?>" value="<?php echo $value; ?>" />
  		<?php } } } ?>
-
+ 		
 		<input type="hidden" id="wpsg_mod_productindex_filter_page" name="wpsg_mod_productindex[filter][page]" value="<?php echo $this->view['wpsg_mod_productindex']['filter']['page']; ?>" />
 		<input type="hidden" id="wpsg_mod_productindex_filter_order" name="wpsg_mod_productindex[filter][order]" value="<?php echo $this->view['wpsg_mod_productindex']['filter']['order']; ?>" />
 		<input type="hidden" id="wpsg_mod_productindex_template" name="wpsg_mod_productindex[template]" value="<?php echo $this->view['wpsg_mod_productindex']['template']; ?>" />
-
+	
 	</form>
-
+	
 	<div class="wpsg_mod_productindex_toolbar wpsg_mod_productindex_toolbar_top">
-
+		
 		<?php if ($this->view['hideOrder'] != '1') { ?>
 		<div class="wpsg_mod_productindex_order">
@@ -39,6 +49,5 @@
 				<option value="name_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_asc')?'selected="selected"':''); ?>><?php echo __('Name Aufsteigend', 'wpsg'); ?></option>
 				<option value="name_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_desc')?'selected="selected"':''); ?>><?php echo __('Name Absteigend', 'wpsg'); ?></option>
-				<option value="pos_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_asc')?'selected="selected"':''); ?>><?php echo __('Position Aufsteigend', 'wpsg'); ?></option>
-				<option value="pos_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_desc')?'selected="selected"':''); ?>><?php echo __('Position Absteigend', 'wpsg'); ?></option>				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
+				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
 				<option value="cdate_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_desc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Neueste zuerst)', 'wpsg'); ?></option>
 				<option value="anr_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'anr_asc')?'selected="selected"':''); ?>><?php echo __('Artikelnummer Aufsteigend', 'wpsg'); ?></option>
@@ -47,5 +56,5 @@
 		</div>
 		<?php } ?>
-
+		
 		<?php if ($this->view['wpsg_mod_productindex']['filter']['pages'] > 1) { ?>
 		<div class="wpsg_mod_productindex_pager">
@@ -54,7 +63,7 @@
 				<?php for ($i = 1; $i <= $this->view['wpsg_mod_productindex']['filter']['pages']; $i ++) { ?>
 				<li>
-					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) { ?>
+					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) {Â ?>
 					<span><?php echo $i; ?></span>
-					<?php } else { ?>
+					<?php } else {Â ?>
 					<a title="<?php echo wpsg_translate(__('Zu Seite #1# wechseln', 'wpsg'), $i); ?>" href="#" onclick="return wpsg_mod_productindex_goPage(<?php echo $i; ?>);"><?php echo $i; ?></a>
 					<?php } ?>
@@ -64,5 +73,5 @@
 		</div>
 		<?php } ?>
-
+		
 		<?php if ($this->view['hideViewSelect'] != '1') { ?>
 		<div class="wpsg_mod_productindex_viewselect">
@@ -72,54 +81,55 @@
 		</div>
 		<?php } ?>
-
+		
 		<div class="wpsg_clear"></div>
-
+		
 	</div>
 
 	<?php if (wpsg_isSizedArray($this->view['arProducts'])) { ?>
-
-		<?php $i = 0; foreach ($this->view['arProducts'] as $p) { $oProduct = wpsg_product::getInstance($p['product_key']); $i ++; ?>
-		<div class="wpsg_mod_productindex_product <?php echo (($i % 2 == 0)?'odd':'even'); ?> <?php echo (($i == sizeof($this->view['arProducts']))?'wpsg_mod_productindex_product_last':''); ?> <?php echo (($i == 1)?'wpsg_mod_productindex_product_first':''); ?>">
-			
-			<a title="<?php echo __('Zur Detailseite des Produktes', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>">
-				<?php $attachment_id = $this->imagehandler->getAttachmentID($p['product_key']); ?>
-				<?php echo wp_get_attachment_image($attachment_id, array(800, 600)); ?>
-			</a>
-			
+	
+		<?php $i = 0; foreach ($this->view['arProducts'] as $p) { $i ++; ?>
+		<div class="wpsg_mod_productindex_product <?php echo (($i % 2 == 0)?'odd':'even'); ?> <?php echo (($i == sizeof($this->view['arProducts']))?'wpsg_mod_productindex_product_last':''); ?> <?php echo (($i == 1)?'wpsg_mod_productindex_product_first':''); ?>"> 
+			<?php if ($this->hasMod('wpsg_mod_produktbilder')) { $arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($p['id'])); ?>
+			<div class="wpsg_mod_productindex_pic">
+				<?php if (wpsg_isSizedArray($arBilder)) {Â ?>
+				<a title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>">
+					<?php if ($nPicRand === true) $nPicIndex = array_rand($arBilder); else $nPicIndex = 0; ?> 
+					<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($p['id'], $arBilder[$nPicIndex], $nPicWidth, $nPicHeight, $bPicMode)); ?>" alt="<?php wpsg_hspc($p['name']); ?>" />
+				</a>
+				<?php } ?>
+			</div>
+			<?php } ?>
 			<div class="wpsg_mod_productindex_content">
-				<div class="wpsg_mod_productindex_infos">
+				<div class="wpsg_mod_productindex_infos"> 
 					<div class="wpsg_mod_productindex_weight">
 						<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProductindex') == '1') { ?>
-							<?php if (($p['weight']) > '0') { ?>
-								<?php if ($p['min_weight'] == $p['max_weight']) { ?>
-									<?php echo wpsg_translate(__('Gewicht: #1#', 'wpsg'), wpsg_ff($p['weight'], $this->get_option('wpsg_mod_weight_unit'))); ?>
-								<?php } else { ?>
-									<?php echo wpsg_translate(__('Gewicht: ab #1#', 'wpsg'), wpsg_ff($p['min_weight'], $this->get_option('wpsg_mod_weight_unit'))); ?>
-								<?php } ?>
-							<?php } ?>
+						<?php if ($p['min_weight'] == $p['max_weight']) { ?>
+						<?php echo wpsg_translate(__('Gewicht: #1#', 'wpsg'), wpsg_ff($p['weight'], $this->get_option('wpsg_mod_weight_unit'))); ?> 
+						<?php } else { ?>
+						<?php echo wpsg_translate(__('Gewicht: ab #1#', 'wpsg'), wpsg_ff($p['min_weight'], $this->get_option('wpsg_mod_weight_unit'))); ?>
+						<?php } ?>
 						<?php } ?>
 					</div>
-
+					
 					<div class="wpsg_mod_productindex_fmenge">
-						<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindex_fmenge') == '1') { ?>
-							<?php if (($p['fmenge']) > '0') { ?>
-								<?php echo wpsg_translate(__('FÃŒllmenge: #1#', 'wpsg'), wpsg_ff($p['fmenge'], $p['feinheit'])); ?>
-								<br />
-								<?php if ($this->get_option('wpsg_mod_fuellmenge_showProductindex_grundpreis') == '1') { ?>
-									<?php echo wpsg_translate(__('Grundpreis: #1# / #2#', 'wpsg'),
-										wpsg_ff($p['fmenge_preis'], $this->get_option('wpsg_currency')),
-										wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $p['feinheit'])
-									); ?>
-								<?php } ?>
-							<?php } ?>
+						<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindex_fmenge') == '1') {Â ?>
+						<?php echo wpsg_translate(__('FÃŒllmenge: #1#', 'wpsg'), wpsg_ff($p['fmenge'], $p['feinheit'])); ?>
 						<?php } ?>
-					</div>
-
+					</div>				
+					
 					<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProductindex') == '1') { ?>
 						<div class="wpsg_mod_produktindex_stock">
-							<?php echo wpsg_translate(__('Lagerbestand: #1#','wpsg'), $p['stock']);  ?>
+							<?php echo wpsg_translate(__('Lagerbestand: #1#','wpsg'), $p['stock']);  ?>	
 						</div>
 					<?php } ?>
-
+					
+					<div class="wpsg_mod_productindex_gpreis">
+						<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindex_grundpreis') == '1') { ?>
+						<?php echo wpsg_translate(__('Grundpreis: #1# / #2#', 'wpsg'), 
+								wpsg_ff($p['fmenge_preis'], $this->get_option('wpsg_currency')),
+								wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $p['feinheit'])
+						); ?>
+						<?php }Â ?>
+					</div>	
 				</div>
 				<div class="wpsg_mod_productindex_title">
@@ -127,67 +137,43 @@
 				</div>
 				<div class="wpsg_mod_productindex_description"><?php echo $p['beschreibung']; ?></div>
-
-				<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte Benutzer START */?>
-				<?php if ($this->canDisplayPrice()) { ?>
-					<div class="wpsg_mod_productindex_price">
-					
-						<?php /* Rabattierter Preis anzeigen */ ?>
-						<?php if ($this->hasMod('wpsg_mod_discount') && $this->get_option('wpsg_mod_discount_productindex') == '1') { ?>
-							
-							<?php $oldPrice = $oProduct->getOldPrice();  ?>
-                			
-                			<?php if ($oldPrice !== false && $oldPrice != $oProduct->getPrice($this->view['data']['product_key'])) { ?>
-                				<span class="wpsg_mod_productview_newprice wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($oProduct->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span><br />
-                				<span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
-                			<?php } else { ?>
-                				<span class="wpsg_mod_productview_price"><?php echo wpsg_ff($oProduct->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-                			<?php } ?>
-                			
-						<?php }else{?>
-						
-    						<?php if ($p['min_preis'] == $p['max_preis']) { ?>
-    							<?php echo wpsg_ff($p['preis'], $this->get_option('wpsg_currency')); ?>
-    						<?php } else { ?>
-    							<?php echo wpsg_translate(__('ab #1#', 'wpsg'), wpsg_ff($p['min_preis'], $this->get_option('wpsg_currency'))); ?>
-    						<?php } ?>
-						<?php } ?>
-					</div>
-					<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
-					<div class="wpsg_produkt_preishinweis">
-						<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
-					</div>
-					<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
-					<div class="wpsg_produkt_preishinweis">
-						<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
-						<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-						<?php } else { /* Frontend = BRUTTO Preise */ ?>
-						<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-						<?php } ?>
-					</div>
-					<?php } ?>
-				<?php }else{?>
-						<?php echo wpsg_translate(__('Preise nur fÃŒr eingeloggte Benutzer', 'wpsg')); ?>
-				<?php } /* Abfrage Preisanzeige nur fÃŒr eingeloggte Benutzer ENDE */?>
-
-				<div class="wpsg_mod_productindex_button">
-					<?php //if ($this->hasMod('wpsg_mod_stock') && $this->callMod('wpsg_mod_stock', 'checkBestand', array($this->getProduktID($p['id']), 1)) === false) { ?>
-					<?php if (false) { ?>
+				<div class="wpsg_mod_productindex_price">
+					<?php if ($p['min_preis'] == $p['max_preis']) { ?>
+						<?php echo wpsg_ff($p['preis'], $this->get_option('wpsg_currency')); ?>
+					<?php } else { ?>
+						<?php echo wpsg_translate(__('ab #1#', 'wpsg'), wpsg_ff($p['min_preis'], $this->get_option('wpsg_currency'))); ?>
+					<?php } ?>
+				</div>
+				<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+				<div class="wpsg_produkt_preishinweis">
+					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+				</div>
+				<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+				<div class="wpsg_produkt_preishinweis">		
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($p['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>	
+				<?php } ?>
+				<div class="wpsg_mod_productindex_button">					
+					<?php if ($this->hasMod('wpsg_mod_stock') && $this->callMod('wpsg_mod_stock', 'checkBestand', array($p['id'], 1)) === false) { ?>
 					<span class="wpsg_produkt_soldout"><?php echo __('Produkt ausverkauft', 'wpsg'); ?></span>
-					<?php } else { ?>
+					<?php } else { ?>		
 					<a class="wpsg_button" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo __('Zum Produkt', 'wpsg'); ?></a>
 					<?php } ?>
 				</div>
-
+				
 			</div>
-			<div class="wpsg_clear"></div>
-		</div>
-		<?php } ?>
-
+			<div class="wpsg_clear"></div>				
+		</div>
+		<?php } ?>
+	
 	<?php } else { ?>
 	<div class="wpsg_mod_productindex_empty"><?php echo __('Keine passenden Produkte gefunden.', 'wpsg'); ?></div>
 	<?php } ?>
-
+	
 	<div class="wpsg_mod_productindex_toolbar wpsg_mod_productindex_toolbar_bottom">
-
+		
 		<?php if ($this->view['hideOrder'] != '1') { ?>
 		<div class="wpsg_mod_productindex_order">
@@ -198,6 +184,4 @@
 				<option value="name_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_asc')?'selected="selected"':''); ?>><?php echo __('Name Aufsteigend', 'wpsg'); ?></option>
 				<option value="name_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'name_desc')?'selected="selected"':''); ?>><?php echo __('Name Absteigend', 'wpsg'); ?></option>
-				<option value="pos_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_asc')?'selected="selected"':''); ?>><?php echo __('Position Aufsteigend', 'wpsg'); ?></option>
-				<option value="pos_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'pos_desc')?'selected="selected"':''); ?>><?php echo __('Position Absteigend', 'wpsg'); ?></option>				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
 				<option value="cdate_asc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_asc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Ãlteste zuerst)', 'wpsg'); ?></option>
 				<option value="cdate_desc" <?php echo (($this->view['wpsg_mod_productindex']['filter']['order'] == 'cdate_desc')?'selected="selected"':''); ?>><?php echo __('Erstellungsdatum (Neueste zuerst)', 'wpsg'); ?></option>
@@ -207,14 +191,14 @@
 		</div>
 		<?php } ?>
-
+		
 		<?php if ($this->view['wpsg_mod_productindex']['filter']['pages'] > 1) { ?>
 		<div class="wpsg_mod_productindex_pager">
 			<span><?php echo __('Seite:', 'wpsg'); ?></span>
 			<ul>
-				<?php for ($i = 1; $i <= $this->view['wpsg_mod_productindex']['filter']['pages']; $i++) { ?>
+				<?php for ($i = 1; $i <= $this->view['wpsg_mod_productindex']['filter']['pages']; $i ++) { ?>
 				<li>
-					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) { ?>
+					<?php if ($i == $this->view['wpsg_mod_productindex']['filter']['page']) {Â ?>
 					<span><?php echo $i; ?></span>
-					<?php } else { ?>
+					<?php } else {Â ?>
 					<a title="<?php echo wpsg_translate(__('Zu Seite #1# wechseln', 'wpsg'), $i); ?>" href="#" onclick="return wpsg_mod_productindex_goPage(<?php echo $i; ?>);"><?php echo $i; ?></a>
 					<?php } ?>
@@ -224,5 +208,5 @@
 		</div>
 		<?php } ?>
-
+		
 		<?php if ($this->view['hideViewSelect'] != '1') { ?>
 		<div class="wpsg_mod_productindex_viewselect">
@@ -232,7 +216,7 @@
 		</div>
 		<?php } ?>
-
+		
 		<div class="wpsg_clear"></div>
-
+		
 	</div>
 
@@ -250,8 +234,8 @@
 
 		jQuery('#wpsg_mod_productindex_filter_page').val(page);
-		jQuery('#wpsg_mod_productindex_form').trigger('submit');
+		jQuery('#wpsg_mod_productindex_form').submit();
 
 		return false;
-
+		
 	} // function wpsg_mod_productindex_goPage(page)
 
@@ -260,20 +244,20 @@
 
 		jQuery('#wpsg_mod_productindex_template').val(template);
-		jQuery('#wpsg_mod_productindex_form').trigger('submit');
+		jQuery('#wpsg_mod_productindex_form').submit();
 
 		return false;
-
+		
 	} // function wpsg_mod_productindex_viewselect(template)
-
+	
 	jQuery(document).ready(function() {
 
 		jQuery('.wpsg_mod_productindex_filter_order').bind('change', function() {
-
+			
 			jQuery('#wpsg_mod_productindex_filter_order').val(jQuery(this).find('option:selected').attr('value'));
 			jQuery('#wpsg_mod_productindex_filter_page').val('1');
-			jQuery('#wpsg_mod_productindex_form').trigger('submit');
-
+			jQuery('#wpsg_mod_productindex_form').submit(); 
+					
 		} );
-
+		
 	} );
 
Index: /views/mods/mod_productindex/page_metabox.phtml
===================================================================
--- /views/mods/mod_productindex/page_metabox.phtml	(revision 8528)
+++ /views/mods/mod_productindex/page_metabox.phtml	(revision 5261)
@@ -7,108 +7,60 @@
 ?>
 
-<style>
-
-    #wpsg_mod_productindex_layer { height:20rem; }
-    #wpsg_mod_productindex_layer select,
-    #wpsg_mod_productindex_layer input { width:25rem; }
-    #wpsg_mod_productindex_layer #wpsg_mod_productindex_hideOrder,
-    #wpsg_mod_productindex_layer #wpsg_mod_productindex_hideViewSelect { width:15px; height:15px; }
-
-</style>
-
-<br /> 
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_productindex_active', __('Seite als Produktseite verwenden', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_active', true)); ?>
 
-<br />
-
-<div id="wpsg_mod_productindex_layer" style="display:none; height:20rem;">
+<div id="wpsg_mod_productindex_layer" style="display:none;">
 	
-	<div style="width:50%; float:left;">
-		
-		<?php /* alle Produkte */ ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_show', __('Produkte', 'wpsg'), $this->view['wpsg_mod_productindex']['arShow'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_show', true)); ?>		
-		<br />
-		
-		<?php /* Produktanzahl */ ?>
-		<?php echo wpsg_drawForm_Input('wpsg_mod_productindex_perPage', __('Pro Seite', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_perPage', true)); ?>
-		<br /> 
-		
-		<?php /* kommagetrennte Produktauswahl */ ?>
-		<div class="wpsg_mod_productindex_layershow wpsg_mod_productindex_layer_1" style="display:none;">
-			<?php echo wpsg_drawForm_Input('wpsg_mod_productindex_productids', __('Produktauswahl (Kommagetrennte IDs)', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_productids', true)); ?>	
-			<br />
-		</div>	
-		
-		<?php /* Produktgruppenauswahl*/ ?> 
-		<?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
-		<div class="wpsg_mod_productindex_layershow wpsg_mod_productindex_layer_2" style="display:none;">
-			<?php if (sizeof($this->view['wpsg_mod_productindex']['arProductGroups']) <= 0) { ?>
-				<?php echo wpsg_drawForm_Input('', __('Produktgruppen', 'wpsg'), __('Keine Produktgruppen angelegt.', 'wpsg'), array('text' => true)); ?>
-			<?php } else { ?>
-				<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_groups', __('Produktgruppen', 'wpsg'), $this->view['wpsg_mod_productindex']['arProductGroups'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_groups', true), array('multiple' => ((sizeof($this->view['wpsg_mod_productindex']['arProductGroups']) < 5)?sizeof($this->view['wpsg_mod_productindex']['arProductGroups']):5))); ?>
-			<?php } ?>		
-			<br />		
-		</div>	
-		<?php } ?>
-		
-		<?php /* Produktkategorieauswahl */ ?> 
-		<?php if ($this->hasMod('wpsg_mod_produktartikel')) { ?>
-		<div class="wpsg_mod_productindex_layershow wpsg_mod_productindex_layer_3" style="display:none;">
-			<?php if (sizeof($this->view['wpsg_mod_productindex']['arCategories']) <= 0) { ?>
-				<?php echo wpsg_drawForm_Input('', __('Kategorien', 'wpsg'), __('Keine Kategorien angelegt.', 'wpsg'), array('text' => true)); ?>
-			<?php } else { ?>
-				<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_categories', __('Kategorien', 'wpsg'), $this->view['wpsg_mod_productindex']['arCategories'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_categories', true), array('multiple' => ((sizeof($this->view['wpsg_mod_productindex']['arCategories']) < 5)?sizeof($this->view['wpsg_mod_productindex']['arCategories']):5))); ?>
-			<?php } ?>			
-			<br />			
-		</div>
-		<?php } ?>
-		
+	<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_show', __('Produkte', 'wpsg'), $this->view['wpsg_mod_productindex']['arShow'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_show', true)); ?>
+	<div class="wpsg_mod_productindex_layershow wpsg_mod_productindex_layer_1" style="display:none;">
+	<?php echo wpsg_drawForm_Input('wpsg_mod_productindex_productids', __('Produktauswahl (Kommagetrennte IDs)', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_productids', true)); ?>
 	</div>
+	<div class="wpsg_mod_productindex_layershow wpsg_mod_productindex_layer_2" style="display:none;">
+	<?php if (sizeof($this->view['wpsg_mod_productindex']['arProductGroups']) <= 0) { ?>
+		<?php echo wpsg_drawForm_Input('', __('Produktgruppen', 'wpsg'), __('Keine Produktgruppen angelegt.', 'wpsg'), array('text' => true)); ?>
+	<?php } else { ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_groups', __('Produktgruppen', 'wpsg'), $this->view['wpsg_mod_productindex']['arProductGroups'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_groups', true), array('multiple' => ((sizeof($this->view['wpsg_mod_productindex']['arProductGroups']) < 5)?sizeof($this->view['wpsg_mod_productindex']['arProductGroups']):5))); ?>
+	<?php } ?>
+	</div>	 
+	<div class="wpsg_mod_productindex_layershow wpsg_mod_productindex_layer_3" style="display:none;">
+	<?php if (sizeof($this->view['wpsg_mod_productindex']['arCategories']) <= 0) { ?>
+		<?php echo wpsg_drawForm_Input('', __('Kategorien', 'wpsg'), __('Keine Kategorien angelegt.', 'wpsg'), array('text' => true)); ?>
+	<?php } else { ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_categories', __('Kategorien', 'wpsg'), $this->view['wpsg_mod_productindex']['arCategories'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_categories', true), array('multiple' => ((sizeof($this->view['wpsg_mod_productindex']['arCategories']) < 5)?sizeof($this->view['wpsg_mod_productindex']['arCategories']):5))); ?>
+	<?php } ?>
+	</div>
+	<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_template', __('Template', 'wpsg'), $this->view['wpsg_mod_productindex']['arTemplates'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_template', true), array('noIndex' => true)); ?>
+	<?php echo wpsg_drawForm_Input('wpsg_mod_productindex_perPage', __('Pro Seite', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_perPage', true)); ?>
+	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productindex_hideOrder', __('Sortierungsauswahl ausblenden', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_hideOrder', true)); ?>
+	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productindex_hideViewSelect', __('Ansichtenwechsel ausblenden', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_hideViewSelect', true)); ?>
 	
-	<div style="width:50%; float:right;">
+	<?php if ($this->hasMod('wpsg_mod_stock')) { ?>
+	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productindex_showAusverkauft', __('Ausverkaufte anzeigen', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_showAusverkauft', true)); ?>
+	<?php } ?>
 	
-		<?php /* Produkttemplateauswahl list/grid */ ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_template', __('Template', 'wpsg'), $this->view['wpsg_mod_productindex']['arTemplates'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_template', true), array('noIndex' => true)); ?>
-		
-		<br /> 
-		
-		<?php /* Standardsortierauswahl */ ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_order', __('Standardsortierung', 'wpsg'), $this->view['wpsg_mod_productindex']['arOrder'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_order', true)); ?>
+	<?php echo wpsg_drawForm_Select('wpsg_mod_productindex_order', __('Standardsortierung', 'wpsg'), $this->view['wpsg_mod_productindex']['arOrder'], get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_order', true)); ?>
 	
-		<br />
-		
-		<?php /* Sortierauswahl ausblenden */ ?>
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productindex_hideOrder', __('Sortierungsauswahl ausblenden', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_hideOrder', true)); ?>
-		
-		<br /> 
-		
-		<?php /* Ansichtswechsel ausblenden */ ?>
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productindex_hideViewSelect', __('Ansichtenwechsel ausblenden', 'wpsg'), get_post_meta($this->view['wpsg_mod_productindex']['post_id'], 'wpsg_mod_productindex_hideViewSelect', true)); ?>
-	 	 	
-	</div>
-		
 </div> 
 
-<script>
+<script type="text/javascript">/* <![CDATA[ */
 
 	/**
 	 * Zeigt / Versteckt die Optionen fÃŒr die ProduktÃŒbersichtsseite
 	 */
-	function wpsg_mod_productindex_activate() {
-
-		if (jQuery('#wpsg_mod_productindex_active').prop('checked')) {
-
+	function wpsg_mod_productindex_activate()
+	{
+		
+		if (jQuery('#wpsg_mod_productindex_active').attr('checked'))
+		{
 			jQuery('#wpsg_mod_productindex_layer').show();
-
-		} else {
-
+		}
+		else
+		{
 			jQuery('#wpsg_mod_productindex_layer').hide();
-
 		}
 		
-	}
+	} // wpsg_mod_productindex_activate()
 	
-	function wpsg_mod_productindex_switchShow() {
+	function wpsg_mod_productindex_switchShow()
+	{
 
 		var show = jQuery('#wpsg_mod_productindex_show').val();
@@ -117,5 +69,5 @@
 		jQuery('.wpsg_mod_productindex_layer_' + show).show();
 		
-	}
+	} // function wpsg_mod_productindex_switchShow()
 	
 	jQuery(document).ready(function() {
@@ -129,3 +81,3 @@
 	} );
 	
-</script>
+/* ]]> */</script>
Index: /views/mods/mod_productpackage/productlist.phtml
===================================================================
--- /views/mods/mod_productpackage/productlist.phtml	(revision 5261)
+++ /views/mods/mod_productpackage/productlist.phtml	(revision 5261)
@@ -0,0 +1,15 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Liste der zugeordneten Produkte
+	 */
+
+?>
+<?php if (!wpsg_isSizedArray($this->view['arProducts'])) { ?>
+<?php echo __('Bisher wurden keine Produkte ausgewÃ€hlt', 'wpsg'); ?>
+<?php } else { ?>
+
+
+<?php } ?>
+<br /><br />
+<a href="" class="wpsg_link_add" onclick="return wpsg_mod_productpackage_add();"><?php echo __('Produkt auswÃ€hlen', 'wpsg'); ?></a>
Index: /views/mods/mod_productpackage/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_productpackage/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_productpackage/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,77 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des Produktpaketes in die Produktverwaltung
+	 */
+
+?>
+<div id="wpsg_mod_productpackage_dialog"></div>
+
+<div id="wpsg_productpackage" class="postbox">	
+	<h3 class="wpsg_handlediv">
+		<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></span>
+		<span><?php echo __('Produktpaket', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+	
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productpackage_set', __('Produktpaket', 'wpsg'), $this->get_option('wpsg_mod_productpackage_set')); ?>
+		
+		<div id="wpsg_mod_productpackage_layer">
+			
+			<?php echo $this->callMod('wpsg_mod_productpackage', 'productlist', array($this->view['data']['id'])); ?>
+			
+		</div>
+		
+	</div>
+</div>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	function wpsg_mod_productpackage_select(product_id)
+	{
+
+		alert(product_id);
+		
+	} // function wpsg_mod_productpackage_select(product_id)
+
+	function wpsg_mod_productpackage_add()
+	{
+
+		jQuery('#wpsg_mod_productpackage_dialog').html('<img style="margin:15px;" src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery('#wpsg_mod_productpackage_dialog').dialog( {
+			'dialogClass': 'wp-dialog',           
+	        'modal': true,
+	        'width': 390,
+	        'height': 350,	       
+	        'title': '<?php echo __('Produktauswahl', 'wpsg'); ?>',
+	        'open': function() {
+
+	        	jQuery.ajax( {
+	    			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=select&wpsg_mode=filterDialog&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>&callback=wpsg_mod_productpackage_select',
+	    			success: function(data) {
+		    			
+	    				jQuery('#wpsg_mod_productpackage_dialog').html(data);
+	    					
+	    			}
+	    		} );
+			        
+	        }
+		} );
+
+		return false;
+		
+	} // function wpsg_mod_productpackage_select()
+
+	jQuery(document).ready(function() {
+
+		jQuery('#wpsg_mod_productpackage_set').bind('change', function() {
+ 
+			if (jQuery(this).attr("checked") == "checked") jQuery('#wpsg_mod_productpackage_layer').show();
+			else jQuery('#wpsg_mod_productpackage_layer').hide();
+			
+		} ).click();
+		
+	} );
+
+/* ]]> */</script>
Index: /views/mods/mod_productvars/basket_row.phtml
===================================================================
--- /views/mods/mod_productvars/basket_row.phtml	(revision 8528)
+++ /views/mods/mod_productvars/basket_row.phtml	(revision 5261)
@@ -6,16 +6,13 @@
 
 ?>
-
 <?php foreach ($this->view['wpsg_mod_productvars']['data'] as $pv) { ?>
-<div class="product_info">
-	<div class="title">
-		<?php echo __($pv['name'], 'wpsg'); ?><?php if ($pv['pflicht'] == '1') { ?><span class="wpsg_required">*</span><?php } ?>
-	</div>
-	<div class="value">
+<tr class="wpsg_<?php echo (($this->view['wpsg_mod_productvars']['i'] == 0)?'odd':'even'); ?> wpsg_basket_productvars">	 
+	<td><?php echo __($pv['name'], 'wpsg'); ?> <?php if ($pv['pflicht'] == '1') { ?><span class="wpsg_required">*</span><?php } ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'3':'2'); ?>">
 		<?php if ($pv['typ'] == '1') { // Auswahlfeld ?>		
 		<select class="<?php echo ((in_array("wpsg_mod_productvars_".$pv['id']."_".$this->view['wpsg_mod_productvars']['p']['product_index'], (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>][<?php echo $this->view['wpsg_mod_productvars']['p']['product_index']; ?>]">
 			<option value="not_set"><?php echo __('Bitte wÃ€hlen', 'wpsg'); ?></option>
 			<?php foreach ((array)$pv['auswahl'] as $option) { ?>
-			<option <?php echo ((@wpsg_hspc($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']]) == wpsg_hspc($option))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($option); ?>"><?php echo wpsg_hspc($option); ?></option>
+			<option <?php echo (($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']] == wpsg_hspc($option))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($option); ?>"><?php echo wpsg_hspc($option); ?></option>
 			<?php } ?>
 		</select>
@@ -24,12 +21,7 @@
 		<?php } else if ($pv['typ'] == '3') { // Checkbox ?>
 		<input type="hidden" value="0" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>][<?php echo $this->view['wpsg_mod_productvars']['p']['product_index']; ?>]" />
-		<input <?php echo ((@wpsg_hspc($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']]) == '1')?'checked="checked"':''); ?> class="<?php echo ((in_array("wpsg_mod_productvars_".$pv['id']."_".$this->view['wpsg_mod_productvars']['p']['product_index'], (array)$this->view['error']))?'wpsg_error':''); ?>" type="checkbox" value="1" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>][<?php echo $this->view['wpsg_mod_productvars']['p']['product_index']; ?>]" />
-		<?php } else if ($pv['typ'] == '4') { // Textfeld mehrzeilig ?>
-            <textarea
-                rows="5"
-                name="wpsg_mod_productvars[<?php echo $pv['id']; ?>][<?php echo $this->view['wpsg_mod_productvars']['p']['product_index']; ?>]"
-                class="<?php echo ((in_array("wpsg_mod_productvars_".$pv['id']."_".$this->view['wpsg_mod_productvars']['p']['product_index'], (array)$this->view['error']))?'wpsg_error':''); ?>"><?php echo @wpsg_hspc($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']]); ?></textarea>
-        <?php } ?>
-	</div>
-</div>
+		<input <?php echo (($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']] == '1')?'checked="checked"':''); ?> class="<?php echo ((in_array("wpsg_mod_productvars_".$pv['id']."_".$this->view['wpsg_mod_productvars']['p']['product_index'], (array)$this->view['error']))?'wpsg_error':''); ?>" type="checkbox" value="1" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>][<?php echo $this->view['wpsg_mod_productvars']['p']['product_index']; ?>]" />
+		<?php } ?>
+	</td>
+</tr>
 <?php } ?>
Index: /views/mods/mod_productvars/order_view_row.phtml
===================================================================
--- /views/mods/mod_productvars/order_view_row.phtml	(revision 8528)
+++ /views/mods/mod_productvars/order_view_row.phtml	(revision 5261)
@@ -11,12 +11,12 @@
 <tr class="wpsg_<?php echo (($this->view['wpsg_mod_productvars']['i'] == 0)?'odd':'even'); ?> wpsg_productvars">
 	<td class="wpsg_cell_name"><?php echo __($pv['name'], 'wpsg'); ?></td>	
-	<td align="right" colspan="<?php echo $this->view['colspan']; ?>">
+	<td align="right" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
 		
 		<div class="wpsg_editable" id="wpsg_productvar_<?php echo $k.'_'.$product_index; ?>"><?php echo wpsg_hspc($pv['value']); ?></div>
 		
-		<script type="text/javascript">
+		<script type="text/javascript">/* <![CDATA[ */
 
 			<?php if ($pv['typ'] == 2) { /* Textfeld */ ?> 		                                            
-			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', {
+			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', {
 				submitdata: {
 					order_id: <?php echo $_REQUEST['edit_id']; ?>,
@@ -30,5 +30,5 @@
 			});
 			<?php } else if ($pv['typ'] == 1) { /* Auswahl */ ?>			
-			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', { 
+			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', { 
 				submitdata: {
 					order_id: <?php echo $_REQUEST['edit_id']; ?>,
@@ -37,5 +37,5 @@
 				},
 				submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
-				data   : <?php echo wpsg_prepare_for_inlineEdit(wpsg_array_merge((array)$pv['auswahl'], array('not_set' => __('Keine Angabe', 'wpsg')))); ?>,
+				data   : '<?php echo json_encode(wpsg_array_merge((array)$pv['auswahl'], array('not_set' => __('Keine Angabe', 'wpsg')))); ?>',
 				type   : 'select',
 				placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
@@ -44,5 +44,5 @@
 			});					
 			<?php } else if ($pv['typ'] == 3) { /* Checkbox */ ?>
-			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', { 
+			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', { 
 				submitdata: {
 					order_id: <?php echo $_REQUEST['edit_id']; ?>,
@@ -51,5 +51,5 @@
 				},
 				submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
-				data   : <?php echo wpsg_prepare_for_inlineEdit(array('1' => __('Ja', 'wpsg'), '0' => __('Nein', 'wpsg'))); ?>,
+				data   : '<?php echo json_encode(array('1' => __('Ja', 'wpsg'), '0' => __('Nein', 'wpsg'))); ?>',
 				type   : 'select',
 				placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
@@ -57,20 +57,7 @@
 		    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
 			});
-			<?php } else if ($pv['typ'] == 4) { /* mehrzeiliges Textfeld */ ?>
-			jQuery('#wpsg_productvar_<?php echo $k.'_'.$product_index; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_productvars&do=inlinedit&noheader=1', {
-				submitdata: {
-					order_id: <?php echo $_REQUEST['edit_id']; ?>,
-					pv_id: '<?php echo $k; ?>',
-					p_id: '<?php echo $this->view['wpsg_mod_productvars']['p']['product_index']; ?>'
-				},
-				submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                type: 'textarea',
-				placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-				indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-		    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-			});
-			<?php }?>
+			<?php } ?>
         
-		</script>
+		/* ]]> */</script>
 		
 	</td>
Index: /views/mods/mod_productvars/overview_row.phtml
===================================================================
--- /views/mods/mod_productvars/overview_row.phtml	(revision 8528)
+++ /views/mods/mod_productvars/overview_row.phtml	(revision 5261)
@@ -7,13 +7,9 @@
 ?>
 <?php if (is_array($this->view['wpsg_mod_productvars']['data']) && sizeof($this->view['wpsg_mod_productvars']['data']) > 0) { ?>
-
 <?php foreach ($this->view['wpsg_mod_productvars']['data'] as $pv) { ?>
-<div class="product_info">
-	<div 
-	<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-		<?php echo __($pv['name'], 'wpsg'); ?><?php if ($pv['pflicht'] == '1') { ?><span class="wpsg_required">*</span><?php } ?>
-	</div>
-	<div class="value">
-		<?php if ($pv['typ'] == '1') { // Auswahlfeld ?>		
+<tr class="wpsg_<?php echo (($this->view['wpsg_mod_productvars']['i'] == 0)?'odd':'even'); ?>">
+	<td><?php echo __($pv['name'], 'wpsg'); ?>:</td>
+	<td class="wpsg_cell_gesamtpreis" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'2':'1'); ?>">
+		<?php if ($pv['typ'] == '1') { // Auswahl ?>
 			<?php if ($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']] == 'not_set') { ?>
 			<?php echo __('Nicht angegeben', 'wpsg'); ?>
@@ -29,9 +25,7 @@
 			<?php echo __('Nein', 'wpsg'); ?>
 			<?php } ?>
-		<?php } else if ($pv['typ'] == '4') { // mehrzeiliges Textfeld ?>
-			<?php echo nl2br(wpsg_hspc($this->view['wpsg_mod_productvars']['p']['wpsg_mod_productvars'][$pv['id']])); ?>
 		<?php } ?>
-	</div>
-</div>
+	</td>
+</tr>
 <?php } ?>
 <?php } ?>
Index: ews/mods/mod_productvars/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_productvars/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,33 +1,0 @@
-<?php
-
-	/*
-	 * Aktivierung der Produktvariablen in der Produktvarwaltung
-	 */
-
-?>
-<div id="wpsg_productvars" class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Produktvariablen', 'wpsg'); ?>
-		</h3>
-	</div>
-	<div class="panel-body">
-		<?php if (is_array($this->view['wpsg_mod_productvars']['data']) && sizeof($this->view['wpsg_mod_productvars']['data']) > 0) { ?>		
-			<?php foreach ($this->view['wpsg_mod_productvars']['data'] as $pv) { ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_pv['.$pv['id'].']', __($pv['name'], 'wpsg'), ((in_array($pv['id'], (array)$this->view['wpsg_mod_productvars']['productvars_set']))?true:false)); ?>
-			<?php } ?>
-		<?php } else { ?>
-		 	<?php echo __('Bisher keine Produktvariablen angelegt.', 'wpsg'); ?>
-		<?php } ?>
-		<br />
-		
-		<br /><br />
-		<!-- 		
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=wpsg_mod_productvars"><?php echo __('Zur Produktvariablenverwaltung', 'wpsg'); ?></a>
-		-->
-		<br /><br />
-		
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Produktvariablen', 'wpsg'); ?></a>		
-	
-	</div>
-</div>
Index: /views/mods/mod_productvars/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_productvars/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_productvars/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,24 @@
+<?php
+
+	/*
+	 * Aktivierung der Produktvariablen in der Produktvarwaltung
+	 */
+
+?>
+<div id="wpsg_productvars" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Produktvariablen', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<?php if (is_array($this->view['wpsg_mod_productvars']['data']) && sizeof($this->view['wpsg_mod_productvars']['data']) > 0) { ?>		
+			<?php foreach ($this->view['wpsg_mod_productvars']['data'] as $pv) { ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_pv['.$pv['id'].']', __($pv['name'], 'wpsg'), ((in_array($pv['id'], (array)$this->view['wpsg_mod_productvars']['productvars_set']))?true:false)); ?>
+			<?php } ?>
+		<?php } else { ?>
+		 	<?php echo __('Bisher keine Produktvariablen angelegt.', 'wpsg'); ?>
+		<?php } ?>
+		<br />
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=wpsg_mod_productvars"><?php echo __('Zur Produktvariablenverwaltung', 'wpsg'); ?></a>
+	</div>
+</div>
Index: /views/mods/mod_productvars/pv_list.phtml
===================================================================
--- /views/mods/mod_productvars/pv_list.phtml	(revision 8528)
+++ /views/mods/mod_productvars/pv_list.phtml	(revision 5261)
@@ -7,8 +7,7 @@
 ?>
 <?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
-<table class="wpsg_pv_table table table-body-striped">
-     <thead>
+<table class="wpsg_pv_table">
 	 <tr>
-	 	<th><?php echo __('ID', 'wpsg'); ?></th>
+	 	<th class="wpsg_id"><?php echo __('ID', 'wpsg'); ?></th>
     	<th class="wpsg_label"><?php echo __('Name', 'wpsg'); ?></th>
     	<th class="wpsg_typ"><?php echo __('Typ', 'wpsg'); ?></th>
@@ -16,7 +15,5 @@
     	<th class="wpsg_delcol"></th>
   	</tr>
-    </thead>
   	<?php $i = 0; foreach ($this->view['data'] as $pv) { $i ++; ?>
-	<tbody id="ov_<?php echo $pv['id']; ?>">
 	<tr class="wpsg_table wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>" id="pv_<?php echo $pv['id']; ?>">
 		<td class="wpsg_id"><?php echo $pv['id']; ?></td>
@@ -28,5 +25,5 @@
 				<script type="text/javascript">/* <![CDATA[ */
 	
-					jQuery('#wpsg_pv_auswahl_<?php echo $pv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars&do=inlinedit&noheader=1', {
+					jQuery('#wpsg_pv_auswahl_<?php echo $pv['id']; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars&do=inlinedit&noheader=1', {
 						submitdata: {
 							field: 'auswahl',
@@ -42,14 +39,13 @@
 			</div>
 		</td>
-		<td class="col_typ">
-		    <span id="wpsg_pv_typ_<?php echo $pv['id']; ?>" class="wpsg_editable"><?php echo $this->mod->arTypen[$pv['typ']]; ?></span></td>
+		<td id="wpsg_pv_typ_<?php echo $pv['id']; ?>" class="wpsg_typ wpsg_editable"><?php echo $this->mod->arTypen[$pv['typ']]; ?></td>
 		<td class="wpsg_pflicht"><input type="checkbox" <?php echo (($pv['pflicht'] == '1')?'checked="checked"':''); ?> id="wpsg_pv_pflicht_<?php echo $pv['id']; ?>" /></td>
 		<td class="wpsg_delcol">
 		
-			<a class="wpsg_glyphicon_right glyphicon glyphicon-trash" href="#" title="<?php echo __('Produktvariable lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removePV(<?php echo $pv['id']; ?>);"></a>
+			<a class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Produktvariable lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removePV(<?php echo $pv['id']; ?>);"></a>
 		
 			<script type="text/javascript">/* <![CDATA[ */
 
-				jQuery('#wpsg_pv_name_<?php echo $pv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars&do=inlinedit&noheader=1', {
+				jQuery('#wpsg_pv_name_<?php echo $pv['id']; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars&do=inlinedit&noheader=1', {
 					submitdata: {
 						field: 'name',
@@ -69,5 +65,5 @@
 							field: 'pflicht',
 							pv_id: '<?php echo $pv['id']; ?>',
-							value: ((jQuery(this).prop("checked") === true)?'1':'0')
+							value: ((jQuery(this).attr("checked") == "checked")?'1':'0')
 						}
 					} );
@@ -75,5 +71,5 @@
 				} );
 
-				jQuery('#wpsg_pv_typ_<?php echo $pv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars&do=inlinedit&noheader=1', { 
+				jQuery('#wpsg_pv_typ_<?php echo $pv['id']; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvars&do=inlinedit&noheader=1', { 
 					submitdata: {
 						field: 'typ',
@@ -81,5 +77,5 @@
 					},
 					submit: '<?php echo __('Speichern', 'wpsg'); ?>',					
-					data: <?php echo wpsg_prepare_for_inlineEdit($this->mod->arTypen); ?>,
+					data: '<?php echo json_encode($this->mod->arTypen); ?>',
 					type: 'select',
 					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
@@ -102,8 +98,6 @@
 		</td>
 	</tr> 
-    </tbody>
 	<?php } ?>
 </table>
-
 <p class="wpsg_hinweis"><?php echo __('Die Reihenfolge lÃ€sst sich mittels Drag&Drop verÃ€ndern.', 'wpsg'); ?>
 
Index: /views/mods/mod_productvars/renderTemplate.phtml
===================================================================
--- /views/mods/mod_productvars/renderTemplate.phtml	(revision 8528)
+++ /views/mods/mod_productvars/renderTemplate.phtml	(revision 5261)
@@ -26,7 +26,5 @@
 			<input type="hidden" value="0" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>]" />
 			<input <?php echo ((wpsg_isSizedString($pv['value'], '1'))?'checked="checked"':''); ?> type="checkbox" value="1" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>]" />
-			<?php } else if ($pv['typ'] == '4') { // Mehrzeiliges Textfeld ?>
-                <textarea rows="5" name="wpsg_mod_productvars[<?php echo $pv['id']; ?>]"><?php echo wpsg_hspc(wpsg_getStr($pv['value'])); ?></textarea>
-            <?php } ?>
+			<?php } ?>
 		</div>
 	</div>
Index: /views/mods/mod_productvars/settings_edit.phtml
===================================================================
--- /views/mods/mod_productvars/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_productvars/settings_edit.phtml	(revision 5261)
@@ -45,32 +45,17 @@
 </script>
 
-<br />
-
-<div>
-	<ul class="nav nav-tabs">
-  		<li role="presentation" class="active"><a href="#tab1" role="tab" data-toggle="tab"><?php echo __('Produktvariablen', 'wpsg'); ?></a></li>
-  		<li role="presentation"><a href="#tab2" role="tab" data-toggle="tab"><?php echo __('Einstellungen', 'wpsg'); ?></a></li>  
-	</ul>
-	<div class="tab-content">
-		<div id="tab1" role="tabpanel" class="tab-pane active">
-			<div class="content" id="wpsg_pv_list">
-				<?php echo $this->mod->pv_list(); ?>
-			</div>
-
-			<br />
-	
-			<a title="<?php echo __('Neue Produktvariable anlegen', 'wpsg'); ?>" href="" class="" onclick="return wpsg_addPV();"><span class="glyphicon wpsg-glyphicon glyphicon-plus"></span><?php echo __('Neue Produktvariable anlegen.', 'wpsg'); ?></a>
-		
-		</div>
-		<div id="tab2" role="tabpanel" class="tab-pane">
-			
-			<div class="wpsg_productvars_form">
-
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productvars_showProduct', __('Produktvariable(n) im Produkttemplate abfragen', 'wpsg'), $this->get_option('wpsg_mod_productvars_showProduct'), array('help' => 'wpsg_mod_productvars_showProduct')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productvars_showBasket', __('Produktvariable(n) im Warenkorbtemplate darstellen', 'wpsg'), $this->get_option('wpsg_mod_productvars_showBasket'), array('help' => 'wpsg_mod_productvars_showBasket')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productvars_showOverview', __('Produktvariable(n) im BestellÃŒbersichtstemplate darstellen', 'wpsg'), $this->get_option('wpsg_mod_productvars_showOverview'), array('help' => 'wpsg_mod_productvars_showOverview')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_productvars_showMail', __('Produktvariable(n) im Mailtemplate darstellen', 'wpsg'), $this->get_option('wpsg_mod_productvars_showMail'), array('help' => 'wpsg_mod_productvars_showMail')); ?>
-
+<div class="wpsg_admin_box">		
+		  		
+	<div class="head">
+		<div class="title">
+			<div class="fulltab">
+				<?php echo __('Produktvariablen', 'wpsg'); ?>
+				<a title="<?php echo __('Neue Produktvariable anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addPV();"></a>
 			</div>
 		</div>
+	</div>
+	<div class="content" id="wpsg_pv_list">
+		<?php echo $this->mod->pv_list(); ?>
+	</div>
+			
 </div>
Index: /views/mods/mod_produktartikel/header_facebook.phtml
===================================================================
--- /views/mods/mod_produktartikel/header_facebook.phtml	(revision 5261)
+++ /views/mods/mod_produktartikel/header_facebook.phtml	(revision 5261)
@@ -0,0 +1,22 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Facebook META Integration auf einer Produktseite
+	 */
+
+?>
+ 
+<meta property="og:title" content="<?php echo $this->view['data']['name']; ?>" />
+<meta property="og:type" content="product" />
+<?php if ($this->hasMod('wpsg_mod_produktbilder') && isset($this->view['data']['bilder'][0])) { ?>
+<meta property="og:image" content="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array(
+	$this->view['data']['id'],
+	$this->view['data']['bilder'][0],
+	100,
+	100,
+	's'
+)); ?>" />
+<?php } ?>
+<meta property="og:url" content="<?php echo $this->view['data']['url']; ?>" />
+<meta property="og:description" content="<?php echo $this->view['data']['beschreibung']; ?>" />
+ 
Index: /views/mods/mod_produktartikel/header_google.phtml
===================================================================
--- /views/mods/mod_produktartikel/header_google.phtml	(revision 5261)
+++ /views/mods/mod_produktartikel/header_google.phtml	(revision 5261)
@@ -0,0 +1,19 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Header Daten bei Google+ Einbindung
+	 */
+
+?>
+ 
+<meta itemprop="name" content="<?php echo $this->view['data']['name']; ?>" />
+<meta itemprop="description" content="<?php echo $this->view['data']['beschreibung']; ?>" />
+<meta itemprop="url" content="<?php echo $this->view['data']['url']; ?>" />
+<meta itemprop="image" content="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array(
+	$this->view['data']['id'],
+	$this->view['data']['bilder'][0],
+	100,
+	100,
+	's'
+)); ?>" />
+ 
Index: /views/mods/mod_produktartikel/produkt.phtml
===================================================================
--- /views/mods/mod_produktartikel/produkt.phtml	(revision 5261)
+++ /views/mods/mod_produktartikel/produkt.phtml	(revision 5261)
@@ -0,0 +1,41 @@
+<?php
+
+	/**
+	 * Dieses Template wird in das Produkttemplate eingebunden und hat die Funktion die Social Media Links zu integrieren
+	 */
+
+?>
+<?php if ($this->get_option('wpsg_mod_produktartikel_twitter') == '1' || $this->get_option('wpsg_mod_produktartikel_google') == '1' || $this->get_option('wpsg_mod_produktartikel_facebook') == '1') { ?>
+<div class="socialshareprivacy" id="socialshareprivacy_<?php echo $this->getTemplateIndex(); ?>"></div>
+<script type="text/javascript">
+
+	jQuery(document).ready(function() {
+	   
+      	if (jQuery('#socialshareprivacy_<?php echo $this->getTemplateIndex(); ?>').length > 0) 
+    	{
+          
+    		jQuery('#socialshareprivacy_<?php echo $this->getTemplateIndex(); ?>').socialSharePrivacy( {
+        		'services': {
+        			'facebook': {
+            			'status': '<?php echo (($this->get_option('wpsg_mod_produktartikel_facebook') == '1')?'on':'off'); ?>',
+            			'dummy_img': '<?php echo WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/socialshareprivacy/socialshareprivacy/images/dummy_facebook.png'; ?>'
+        			}, 	
+    				'twitter': {
+    					'status': '<?php echo (($this->get_option('wpsg_mod_produktartikel_twitter') == '1')?'on':'off'); ?>',
+    					'dummy_img': '<?php echo WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/socialshareprivacy/socialshareprivacy/images/dummy_twitter.png'; ?>'
+					},
+					'gplus': {
+						'status': '<?php echo (($this->get_option('wpsg_mod_produktartikel_google') == '1')?'on':'off'); ?>',
+            			'dummy_img': '<?php echo WPSG_URL_CONTENT.'plugins/wpshopgermany/lib/socialshareprivacy/socialshareprivacy/images/dummy_gplus.png'; ?>'
+        			}
+        		},
+        		'uri': '<?php echo $this->view['data']['url']; ?>',
+    			css_path: '<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/lib/socialshareprivacy/socialshareprivacy/socialshareprivacy.css'    			
+			} ); 
+
+    	}
+      
+    } );
+       
+ </script>
+<?php } ?>
Index: ews/mods/mod_produktartikel/produkt_addedit_content.phtml
===================================================================
--- /views/mods/mod_produktartikel/produkt_addedit_content.phtml	(revision 8528)
+++ 	(revision )
@@ -1,36 +1,0 @@
-<?php
-
-	/**
-	 * Admin Template fÃŒr die Integration des Moduls "Produktartikel" in die Produktverwaltung
-	 */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Kategorieauswahl', 'wpsg')); ?>
-	
-	<div id="taxonomy-category" class="wpsg-mod_produktartikel_categorydiv categorydiv">
-
-		<div id="category-all" class="tabs-panel">
-			<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
-				<?php wp_terms_checklist(wpsg_getStr($this->view['data']['post_id']), array('taxonomy' => $this->get_option('wpsg_mod_produktartikel_pathkey_cat'))); ?>
-			</ul>
-		</div>
-	</div>
-	
-	<br />
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/edit-tags.php?taxonomy=<?php echo $this->get_option('wpsg_mod_produktartikel_pathkey_cat'); ?>"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Kategorieverwaltung', 'wpsg'); ?></a>
-	
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Einstellungen zum Produktartikel', 'wpsg')); ?>
-	
-	<?php echo wpsg_drawForm_Input('wpsg_produktartikel_menuorder', __('Position', 'wpsg'), wpsg_getStr($this->view['data']['menu_order'])); ?>
-
-	<?php if ($this->get_option('wpsg_mod_produktartikel_comment') <= 0) { ?>
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel[kommentare]', __('Kommentare', 'wpsg'), wpsg_isSizedString($this->view['data']['comment_status'], 'open')); ?>
-	<?php } ?>
-
-	<br />
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktartikel"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Produktartikel', 'wpsg'); ?></a>
-		
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: /views/mods/mod_produktartikel/produkt_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_produktartikel/produkt_edit_allgemein.phtml	(revision 8528)
+++ /views/mods/mod_produktartikel/produkt_edit_allgemein.phtml	(revision 5261)
@@ -7,4 +7,13 @@
 
 ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel[path]', __('URL Path Segment', 'wpsg'), wpsg_getStr($this->view['data']['post_name']), array('help' => 'wpsg_mod_produktartikel_url_path_seg')); ?>
-
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_produktartikel_path"><?php echo __('URL Path Segment', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<input id="wpsg_produktartikel_path" type="text"
+			name="wpsg_mod_produktartikel[path]"
+			value="<?php echo $this->view['data']['post_name']; ?>" />
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
Index: /views/mods/mod_produktartikel/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_produktartikel/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_produktartikel/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Dieses Template wird in der Produktverwaltung in der rechten Spalte verwendet
+ */
+
+?>
+<div id="wpsg_produktartikel" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Produktartikel', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_produktartikel_kommentare"><?php echo __('Kommentare', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<input id="wpsg_produktartikel_kommentare" type="checkbox"
+					class="checkbox" name="wpsg_mod_produktartikel[kommentare]"
+					value="1"
+					<?php echo (($this->view['data']['comment_status'] == 'open')?'checked="checked"':''); ?> />
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+		<?php echo wpsg_drawForm_Input('wpsg_produktartikel_menuorder', __('Position', 'wpsg'), $this->view['data']['menu_order']); ?>
+	</div>
+</div>
+ 
+<div id="categorydiv" class="postbox">
+	<div class="handlediv" title="<?php echo __('Zum Umschalten klicken', 'wpsg'); ?>"><br /></div>
+	<h3 class="hndle"><?php echo __('Kategorieauswahl', 'wpsg'); ?></h3>
+	<div class="inside">
+		<div id="taxonomy-category" class="categorydiv">
+
+			<div id="category-all" class="tabs-panel">
+				<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
+					<?php wp_terms_checklist($this->view['data']['post_id'], array('taxonomy' => 'category')); ?>
+				</ul>
+			</div>
+
+		</div>
+	</div>
+</div>
Index: /views/mods/mod_produktartikel/schemaorg.phtml
===================================================================
--- /views/mods/mod_produktartikel/schemaorg.phtml	(revision 8528)
+++ /views/mods/mod_produktartikel/schemaorg.phtml	(revision 5261)
@@ -9,5 +9,11 @@
 <div itemscope itemtype="http://schema.org/Product" style="display:none;">
 	<span itemprop="name"><?php echo wpsg_hspc($this->view['data']['name']); ?></span>
-	<img itemprop="image" src="<?php echo wp_get_attachment_image($this->view['data']['bilder'][0], 'medium'); ?>" />
+	<img itemprop="image" src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array(
+		$this->view['data']['id'],
+		$this->view['data']['bilder'][0],
+		100,
+		100,
+		's'
+	)); ?>" /> 
 	<a itemprop="url" href="<?php echo $this->view['data']['url']; ?>"><?php echo $this->view['data']['name']; ?></a>
 	<div itemprop="description"><?php echo $this->view['data']['beschreibung']; ?></div>
Index: /views/mods/mod_produktartikel/settings_edit.phtml
===================================================================
--- /views/mods/mod_produktartikel/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_produktartikel/settings_edit.phtml	(revision 5261)
@@ -6,11 +6,18 @@
 
 ?>
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel_pathkey', __('Path Key (Produkte)', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_pathkey'), array('maxlength' => 20, 'help' => 'wpsg_mod_produktartikel_pathkey')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel_pathkey_cat', __('Path Key (Kategorien)', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_pathkey_cat'), array('maxlength' => 20, 'help' => 'wpsg_mod_produktartikel_pathkey_cat')); ?>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left"><?php echo __('Path Key', 'wpsg'); ?>:</div>
+	<div class="wpsg_form_right">
+		<input type="text" name="wpsg_mod_produktartikel_pathkey" value="<?php echo $this->get_option('wpsg_mod_produktartikel_pathkey'); ?>" />
+		<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_pathkey" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_pathkey" class="wpsg_form_help"></a>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>		
 
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_showui', __('Custom Post Type in Wordpress MenÃŒ sichtbar', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_showui'), array('help' => 'wpsg_mod_produktartikel_showui'))?>
 
+<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_postthumbnail', __('Produktbild als Beitragsbild ÃŒbergeben', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_postthumbnail'), array('help' => 'wpsg_mod_produktartikel_postthumbnail')); ?>
+<?php } ?>
 
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_showHome', __('Direkt auf Startseitenansicht anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_showHome'), array('help' => 'wpsg_mod_produktartikel_showHome')); ?>
@@ -20,139 +27,73 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_onlyMainQuery', __('Nur Main Query berÃŒcksichtigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_onlyMainQuery'), array('help' => 'wpsg_mod_produktartikel_onlyMainQuery')); ?>
 
-<br />
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_produktartikel_hometemplate"><?php echo __('Produkttemplate fÃŒr Ansicht auf Startseite', 'wpsg'); ?>:</label>									
+	</div>
+	<div class="wpsg_form_right">
+		<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
+		<p class="wpsg_error"><?php echo __('Keine Templatedatein gefunden!', 'wpsg'); ?></p>
+		<?php } else { ?>
+		<select name="wpsg_mod_produktartikel_hometemplate" id="wpsg_mod_produktartikel_hometemplate">
+			<option value="-1"><?php echo __('Wie Produkttemplate', 'wpsg'); ?></option>
+			<?php foreach ($this->view['arTemplates'] as $t) { ?>
+			<option <?php echo (($t == $this->get_option('wpsg_mod_produktartikel_hometemplate'))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($t); ?>"><?php echo wpsg_hspc($t); ?></option>
+			<?php } ?>
+		</select>
+		<?php } ?>
+		<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_hometemplate" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_hometemplate"></a>	
+	</div>
+	<div class="wpsg_clear"></div>
+</div>	
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_produktartikel_listtemplate"><?php echo __('Produkttemplate fÃŒr List Ansicht', 'wpsg'); ?>:</label>									
+	</div>
+	<div class="wpsg_form_right">
+		<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
+		<p class="wpsg_error"><?php echo __('Keine Templatedatein gefunden!', 'wpsg'); ?></p>
+		<?php } else { ?>
+		<select name="wpsg_mod_produktartikel_listtemplate" id="wpsg_mod_produktartikel_listtemplate">
+			<option value="-1"><?php echo __('Wie Produkttemplate', 'wpsg'); ?></option>
+			<?php foreach ($this->view['arTemplates'] as $t) { ?>
+			<option <?php echo (($t == $this->get_option('wpsg_mod_produktartikel_listtemplate'))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($t); ?>"><?php echo wpsg_hspc($t); ?></option>
+			<?php } ?>
+		</select>
+		<?php } ?>
+		<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_listtemplate" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_listtemplate"></a>			
+	</div>
+	<div class="wpsg_clear"></div>
+</div>	
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_produktartikel_searchtemplate"><?php echo __('Produkttemplate fÃŒr Such Ansicht', 'wpsg'); ?>:</label>									
+	</div>
+	<div class="wpsg_form_right">
+		<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
+		<p class="wpsg_error"><?php echo __('Keine Templatedatein gefunden!', 'wpsg'); ?></p>
+		<?php } else { ?>
+		<select name="wpsg_mod_produktartikel_searchtemplate" id="wpsg_mod_produktartikel_searchtemplate">
+			<option value="-1"><?php echo __('Wie Produkttemplate', 'wpsg'); ?></option>
+			<?php foreach ($this->view['arTemplates'] as $t) { ?>
+			<option <?php echo (($t == $this->get_option('wpsg_mod_produktartikel_searchtemplate'))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($t); ?>"><?php echo wpsg_hspc($t); ?></option>
+			<?php } ?>
+		</select>
+		<?php } ?>
+		<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_searchtemplate" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_produktartikel_searchtemplate"></a>	
+	</div>
+	<div class="wpsg_clear"></div>
+</div>	
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_cat', __('Kategorie in ProduktÃŒbersicht (Backend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_cat'), array('help' => 'wpsg_mod_produktartikel_cat')); ?>
-<div id="wpsg_mod_produktartikel_cat_1">
-    <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_cat_first_level', __('Nur erste Ebene', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_cat_first_level'), array('help' => 'wpsg_mod_produktartikel_cat_first_level')); ?>
-    <?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel_cat_ignore', __('Titelformen (Kommagetrennt) von Kategorien die ignoriert werden sollen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_cat_ignore'), ['help' => 'wpsg_mod_produktartikel_cat_ignore']); ?>
-</div>
-    
-<script>
-    
-    let el_wpsg_mod_produktartikel_cat = document.getElementById('wpsg_mod_produktartikel_cat');
-	let el_wpsg_mod_produktartikel_cat_1 = document.getElementById('wpsg_mod_produktartikel_cat_1'); 
-	
-	el_wpsg_mod_produktartikel_cat.addEventListener('change', () => {
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_facebook', __('Facebook Integration', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_facebook'), array('help' => 'wpsg_mod_produktartikel_facebook')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_google', __('Google+ Integration', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_google'), array('help' => 'wpsg_mod_produktartikel_google')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_twitter', __('Twitter Integration', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_twitter'), array('help' => 'wpsg_mod_produktartikel_twitter')); ?>
+
+<script type="text/javascript">
+
+	jQuery(document).ready(function() {
 		
-		if (el_wpsg_mod_produktartikel_cat.checked) {
-			
-			el_wpsg_mod_produktartikel_cat_1.style.display = 'block'; 
-            
-        } else {
-			
-			el_wpsg_mod_produktartikel_cat_1.style.display = 'none'; 
-			
-        }
+		jQuery('.wpsg_form_help').tipTip();
 		
-    });
-	
-	el_wpsg_mod_produktartikel_cat.dispatchEvent(new Event('change'));
-    
+	} );
+
 </script>
-
-<br />
-
-<?php /* echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_positionnumber', __('Positionsnummer in Produktverwaltung anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_positionnumber'), array('help' => 'wpsg_mod_produktartikel_positionnumber'));  */ ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Select('wpsg_mod_produktartikel_comment', __('Kommentarfunktion', 'wpsg'), array(
-	'0' => __('Produktspezifisch', 'wpsg'),
-	'1' => __('Global aktiviert', 'wpsg'),
-	'2' => __('Global deaktiviert', 'wpsg')
-), $this->get_option('wpsg_mod_produktartikel_comment')); ?>
-
-<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
-<?php echo wpsg_drawForm_Text(__('Produkttemplate fÃŒr Ansicht auf Startseite', 'wpsg'), __('Keine Templatedateien gefunden!', 'wpsg'), array('class_content_wrap' => 'wpsg_error')); ?>
-<?php } else { ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_produktartikel_hometemplate', __('Produkttemplate fÃŒr Ansicht auf Startseite', 'wpsg'), wpsg_array_merge(array('-1' => __('Wie Produkttemplate', 'wpsg')), $this->view['arTemplates']), wpsg_getStr($this->get_option('wpsg_mod_produktartikel_hometemplate')), array('help' => 'mod_produktartikel_hometemplate', 'noKeys1' => true)); ?>
-<?php } ?>
-
-<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
-<?php echo wpsg_drawForm_Text(__('Produkttemplate fÃŒr List Ansicht', 'wpsg'), __('Keine Templatedateien gefunden!', 'wpsg'), array('class_content_wrap' => 'wpsg_error')); ?>
-<?php } else { ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_produktartikel_listtemplate', __('Produkttemplate fÃŒr List Ansicht', 'wpsg'), wpsg_array_merge(array('-1' => __('Wie Produkttemplate', 'wpsg')), $this->view['arTemplates']), wpsg_getStr($this->get_option('wpsg_mod_produktartikel_listtemplate')), array('help' => 'mod_produktartikel_listtemplate', 'noKeys1' => true)); ?>
-<?php } ?>
-
-<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
-<?php echo wpsg_drawForm_Text(__('Produkttemplate fÃŒr Such Ansicht', 'wpsg'), __('Keine Templatedateien gefunden!', 'wpsg'), array('class_content_wrap' => 'wpsg_error')); ?>
-<?php } else { ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_produktartikel_searchtemplate', __('Produkttemplate fÃŒr Such Ansicht', 'wpsg'), wpsg_array_merge(array('-1' => __('Wie Produkttemplate', 'wpsg')), $this->view['arTemplates']), wpsg_getStr($this->get_option('wpsg_mod_produktartikel_searchtemplate')), array('help' => 'mod_produktartikel_searchtemplate', 'noKeys1' => true)); ?>
-<?php } ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel_rating', __('Anzahl Bewertungen im Frontend', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_rating'), array('help' => 'wpsg_mod_produktartikel_rating')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_TextStart(); ?>	
-		
-		<?php $temp = @$this->view['ToRebuild']['product_ids']; ?>
-		<?php $proz_done = 1; if (wpsg_isSizedArray($temp)) { 
-			
-			$proz_done = 1 - (sizeof($this->view['ToRebuild']['product_ids']) / $this->view['ToRebuild']['max']);
-						 
-		?> 
-		
-		<span id="wpsg_mod_produktartikel_rebuild">
-			<p><?php echo __('Wird derzeit aufgebaut, bitte warten ...', 'wpsg'); ?></p>
-				
-			<div class="progress">
-				<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="<?php echo $proz_done * 100; ?>" aria-valuemax="100" style="width:<?php echo $proz_done * 100; ?>%">
-					<span><span class="value"><?php echo round($proz_done * 100); ?></span>% <?php echo __('Komplett', 'wpsg'); ?></span>
-				</div>
-			</div>
-		</span>
-		
-		<?php } ?>
-	<p>
-		<a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktartikel&noheader=1&do=index_rebuild'; ?>"><?php echo __('Neu aufbauen', 'wpsg'); ?></a>
-	</p>
-
-	<?php echo wpsg_drawForm_TextEnd(__('Zuordnung Produkt zu Artikel', 'wpsg'), array('noP' => true)); ?>
-
-	<?php if ($proz_done < 1) { ?>
-	<script type="text/javascript">/* <![CDATA[ */
-	
-		var proz_done = <?php echo $proz_done; ?>;
-		
-		function wpsg_mod_produktartikel_rebuild()
-		{
-		 	
-			if (proz_done >= 1) return;
-			
-			jQuery.ajax( {
-				url: '<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktartikel&noheader=1&do=rebuild'; ?>',
-				error: function(data) {
-					
-					jQuery('#wpsg_mod_produktartikel_rebuild').html('<p><?php echo __('Neuaufbau abgeschlossen.', 'wpsg'); ?></p>');
-					
-				},
-				success: function(data) {
-					
-					if (typeof data.done == "undefined") return;
-										
-					proz_done = parseFloat(data.done);
-					console.log(proz_done);
-					if (proz_done >= 1)
-					{
-						
-						jQuery('#wpsg_mod_produktartikel_rebuild').html('<p><?php echo __('Neuaufbau abgeschlossen.', 'wpsg'); ?></p>');
-						
-					}
-					else 
-					{
-						
-						jQuery('#wpsg_mod_produktartikel_rebuild').find('.progress-bar').attr("aria-valuemin", proz_done * 100).css('width', (proz_done * 100) + '%').find('span.value').html(Math.round(proz_done * 100));
-						
-						wpsg_mod_produktartikel_rebuild();
-						
-					}
-					
-				}
-			} );
-			
-		}
-		
-		wpsg_mod_produktartikel_rebuild();
-	
-	/* ]]> */</script>
-	<?php } ?>
Index: /views/mods/mod_produktattribute/basket_row.phtml
===================================================================
--- /views/mods/mod_produktattribute/basket_row.phtml	(revision 8528)
+++ /views/mods/mod_produktattribute/basket_row.phtml	(revision 5261)
@@ -8,10 +8,10 @@
 
 <?php foreach ((array)$this->view['wpsg_mod_produktattribute']['data'] as $pa_id) { ?>
-<div class="product_info">
-	<div class="title">
-		<span class="fa fa-ellipsis-v"></span>
-		<?php echo $this->callMod('wpsg_mod_produktattribute', 'getAttributeLabel', array($pa_id)); ?>:
-		<strong><?php echo $this->callMod('wpsg_mod_produktattribute', 'getAttributeValue', array($this->view['wpsg_mod_produktattribute']['id'], $pa_id)); ?></strong>
-	</div> 
-</div>
+					
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">	
+	<td colspan="1"><?php echo __('Attribut', 'wpsg'); ?>:</td>
+	<td class="wpsg_cell_produktattribute_value" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'3':'2'); ?>">
+		<?php echo $this->callMod('wpsg_mod_produktattribute', 'getAttributeValue', array($this->view['wpsg_mod_produktattribute']['id'], $pa_id)); ?>
+	</td>
+</tr>
 <?php }?>
Index: /views/mods/mod_produktattribute/list.phtml
===================================================================
--- /views/mods/mod_produktattribute/list.phtml	(revision 8528)
+++ /views/mods/mod_produktattribute/list.phtml	(revision 5261)
@@ -9,173 +9,120 @@
 <p><?php echo __('Keine Produktattribute hinterlegt.', 'wpsg'); ?></p>
 <?php } else { ?>
-<table class="wpsg_pa_table table table-body-striped" id="wpsg_pa_table">
-	<thead>
-		<tr>
-			<th class="wpsg_id"><?php echo __('ID', 'wpsg'); ?></th>
-			<th class="wpsg_label" colspan="2"><?php echo __('Bezeichnung', 'wpsg'); ?></th>			
-			<th class="wpsg_show"><?php echo __('Anzeigen', 'wpsg'); ?></th>
-			<th class="wpsg_typ"><?php echo __('Typ', 'wpsg'); ?></th>		 
-			<th class="wpsg_action"></th>
-		</tr>
-	</thead>	
-	<?php $i = 0; foreach ($this->view['data'] as $pa) { $i ++; ?>
-	<tbody id="pabody_<?php echo $pa['id']; ?>">	
-		<tr class="wpsg_table wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>" id="pab_<?php echo $pa['id']; ?>">
-			<td class="wpsg_id"><?php echo $pa['id']; ?></td>
-			<td class="wpsg_label" colspan="2"><span id="pa_<?php echo $pa['id']; ?>_name"><?php echo wpsg_hspc($pa['name']); ?></span></td>			
-			<td class="wpsg_show">
-				<input title="<?php echo __('Werte direkt in jedem Template anzeigen wenn gesetzt.', 'wpsg'); ?>" id="show_<?php echo $pa['id']; ?>" <?php echo (($pa['autoshow'] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" />
-			</td>
-			<td class="wpsg_typ">
-		   		<span id="wpsg_pa_typ_<?php echo $pa['id']; ?>"><?php echo $this->mod->arTypen[$pa['typ']]; ?></span>
-			</td>
-			<td class="wpsg_action">
-				
-				<a class="wpsg-glyphlink-td" href="#" title="<?php echo __('HTML Code generieren', 'wpsg'); ?>" onclick="return wpsg_genPACode(<?php echo $pa['id']; ?>);">
-					<span class="glyphicon glyphicon-modal-window"></span>
-				</a>
-				
-				<a id="del_<?php echo $pa['id']; ?>" class="wpsg-glyphlink-td" href="#" title="<?php echo __('Produktattribut lÃ¶schen', 'wpsg'); ?>" >
-					<span class="glyphicon glyphicon-trash"></span>
-				</a>
-				
-				<script type="text/javascript">/* <![CDATA[ */
+<table class="wpsg_mod_produktattribute_table">
+	<tr>
+		<th class="col_id"><?php echo __('ID', 'wpsg'); ?></th>
+		<th class="col_name" colspan="2"><?php echo __('Bezeichnung', 'wpsg'); ?></th>
+		<th class="col_html"></th>
+		<th class="col_show"><a href="#" onclick="return false;" class="wpsg_icon wpsg_icon_lupe" title="<?php echo __('Werte direkt in jedem Template anzeigen wenn gesetzt.', 'wpsg'); ?>"></a></th>
+		<th class="col_typ"><?php echo __('Typ', 'wpsg'); ?></th>		
+		<th class="col_action"></th>
+	</tr>
+	<?php foreach ($this->view['data'] as $pa) { ?>
+	<tr>
+		<td class="col_id"><?php echo $pa['id']; ?></td>
+		<td colspan="2" id="pa_<?php echo $pa['id']; ?>_name" class="col_name wpsg_editable"><?php echo wpsg_hspc($pa['name']); ?></td>
+		<td class="col_html">
+			<a class="wpsg_icon wpsg_icon_html wpsg_icon_center" href="#" title="<?php echo __('HTML Code generieren', 'wpsg'); ?>" onclick="return wpsg_genPACode(<?php echo $pa['id']; ?>);"></a>
+		</td>
+		<td class="col_show">
+			<input title="<?php echo __('Werte direkt in jedem Template anzeigen wenn gesetzt.', 'wpsg'); ?>" id="show_<?php echo $pa['id']; ?>" <?php echo (($pa['autoshow'] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" />
+		</td>
+		<td class="col_typ">
+			<select id="typ_<?php echo $pa['id']; ?>" name="pa[<?php echo $pa['id']; ?>][typ]" onchange="wpsg_mod_produktattribute_changeTyp(<?php echo $pa['id']; ?>);">
+				<option <?php echo (($pa['typ'] == '0')?'selected="selected"':''); ?> value="0"><?php echo __('Textfeld', 'wpsg'); ?></option>
+				<option <?php echo (($pa['typ'] == '1')?'selected="selected"':''); ?> value="1"><?php echo __('Textfeld (RTE)', 'wpsg'); ?></option>
+				<option <?php echo (($pa['typ'] == '2')?'selected="selected"':''); ?> value="2"><?php echo __('Auswahlfeld', 'wpsg'); ?></option>
+				<option <?php echo (($pa['typ'] == '3')?'selected="selected"':''); ?> value="3"><?php echo __('Checkbox', 'wpsg'); ?></option>
+			</select>			
+		</td>		
+		<td class="col_action">
+			
+			<a id="del_<?php echo $pa['id']; ?>" class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Produktvariable lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removePV(<?php echo $pv['id']; ?>);"></a>
+			
+			<script type="text/javascript">
 
-								
-					jQuery('#wpsg_pa_typ_<?php echo $pa['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1', {
-						submitdata: {
-							field: 'typ',
-							pa_id: '<?php echo $pa['id']; ?>'						
+				jQuery('#del_<?php echo $pa['id']; ?>').bind('click', function() {
+
+					if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie dieses Produktattribute lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+
+					jQuery('#wpsg_pa_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+					
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1',
+						data: {
+							field: 'delete',
+							pa_id: '<?php echo $pa['id']; ?>'
 						},
-						submit: '<?php echo __('Speichern', 'wpsg'); ?>',					
-						data: <?php echo wpsg_prepare_for_inlineEdit($this->mod->arTypen); ?>,
-						type: 'select',
-						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        callback: function(el) {
-                            if (el == '<?php echo __('Auswahl', 'wpsg'); ?>')
-                            {
-                                jQuery('#wpsg_pa_auswahlrow_<?php echo $pa['id']; ?>').show();
-                            }
-                            else
-                            {
-                                jQuery('#wpsg_pa_auswahlrow_<?php echo $pa['id']; ?>').hide();
-                            }
-                        }
-		                
-		            });
+						success: function(data) {
+							jQuery('#wpsg_pa_list').html(data);		
+						}
+					} );
 					
-					jQuery('#del_<?php echo $pa['id']; ?>').bind('click', function() {
-	
-						if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie dieses Produktattribute lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
-	
-						jQuery('#wpsg_pa_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-						
-						jQuery.ajax( {
-							url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1',
-							data: {
-								field: 'delete',
-								pa_id: '<?php echo $pa['id']; ?>'
-							},
-							success: function(data) {
-								jQuery('#wpsg_pa_list').html(data);		
-							}
-						} );
-						
+				} );
+			
+				jQuery('#show_<?php echo $pa['id']; ?>').bind('change', function() {
+
+					if (jQuery(this).attr("checked")) value = 1; else value = 0;
+					
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1',
+						data: {
+							field: 'show',
+							value: value,
+							pa_id: '<?php echo $pa['id']; ?>'
+						},
+						success: function(data) {
+							if (data != "1") alert(data);
+						}
 					} );
-				
-					jQuery('#show_<?php echo $pa['id']; ?>').bind('change', function() {
-	
-						//if (jQuery(this).attr("checked")) value = 1; else value = 0;
-                        if (jQuery(this).prop("checked")) value = 1; else value = 0;
-						
-						jQuery.ajax( {
-							url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1',
-							data: {
-								field: 'show',
-								value: value,
-								pa_id: '<?php echo $pa['id']; ?>'
-							},
-							success: function(data) {
-								if (data != "1") alert(data);
-							}
-						} );
-						
-					} );
-				
-					jQuery('#pa_<?php echo $pa['id']; ?>_name').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1', {
+					
+				} );
+			
+				jQuery('#pa_<?php echo $pa['id']; ?>_name').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1', {
+					submitdata: { 
+			    		field: 'name',
+			    		pa_id: '<?php echo $pa['id']; ?>'
+					},
+					submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+			
+			</script>
+			
+		</td>
+	</tr>
+	<tr class="auswahlrow auswahlrow_<?php echo $pa['id']; ?>">
+		<td></td>
+		<td>
+			<label>
+				<?php echo __('Auswahl (| als Trenner)', 'wpsg'); ?>:
+			</label>
+			<script type="text/javascript">
+
+				jQuery(document).ready(function() {
+					
+					jQuery('#pa_<?php echo $pa['id']; ?>_auswahl').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1', {
 						submitdata: { 
-				    		field: 'name',
+				    		field: 'auswahl',
 				    		pa_id: '<?php echo $pa['id']; ?>'
 						},
-						submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+						data: '<?php echo $pa['auswahl']; ?>',
+						submit: '<?php echo __('Speichern', 'wpsg'); ?>',
 						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
 						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
 				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
 					});
-				
-				/* ]]> */</script>
-				
-			</td>
-		</tr> 
-        <tr class="wpsg_tablerow <?php echo (($i % 2 == 0)?'odd':'even'); ?>" id="wpsg_pa_auswahlrow_<?php echo $pa['id']; ?>" style="<?php echo (($pa['typ'] != '2')?'display:none;':''); ?>">
-            <td	class="wpsg_id"></td>
-            <td class="wpsg_select" colspan="4">
-                <?php echo __('Auswahl', 'wpsg'); ?>:
-                <span class="wpsg_editable" id="wpsg_pa_auswahl_<?php echo $pa['id']; ?>"><?php echo wpsg_hspc($pa['auswahl']); ?></span>
-                <script type="text/javascript">
 
-                    jQuery('#wpsg_pa_auswahl_<?php echo $pa['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktattribute&do=inlinedit&noheader=1', {
-                        submitdata: {
-                            field: 'auswahl',
-                            pa_id: '<?php echo $pa['id']; ?>'
-                        },
-                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                    });
-
-                </script>
-            </td>
-        </tr>
-	</tbody> 
-	<?php } ?>	
+					wpsg_mod_produktattribute_changeTyp(<?php echo $pa['id']; ?>);
+					
+				} );
+			
+			</script>
+		</td>
+		<td colspan="4" class="wpsg_editable" id="pa_<?php echo $pa['id']; ?>_auswahl"><?php echo wpsg_hspc(((trim($pa['auswahl']) == '')?__('Bitte anklicken um Auswahl kommagetrennt zu definieren', 'wpsg'):$pa['auswahl'])); ?></td>
+	</tr>
+	<?php } ?>
 </table>
-
-<p class="wpsg_hinweis"><?php echo __('Die Reihenfolge lÃ€sst sich mittels Drag&Drop verÃ€ndern.', 'wpsg'); ?>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
-
-		jQuery('#wpsg_pa_table').sortable( {
-			helper: wpsg_Tablefix,
-			items: 'tr.wpsg_tablerow',
-			handler: '.wpsg_id',
-			update: function(event, ui) {
-
-				var wpsg_reorder = jQuery(this).sortable('serialize');
-
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktattribute&noheader=1&do=reorder',
-					data: { 
-						wpsg_reorder: wpsg_reorder
-					},
-					success: function(data) {
-
-						if (data !== "1") alert(data);
-						
-					}
-				} );
-				
-			}
-		} );
-		
-	} );
-			
-/* ]]> */</script>
-
-
 <?php } ?>
Index: /views/mods/mod_produktattribute/overview_row.phtml
===================================================================
--- /views/mods/mod_produktattribute/overview_row.phtml	(revision 8528)
+++ /views/mods/mod_produktattribute/overview_row.phtml	(revision 5261)
@@ -8,11 +8,10 @@
 
 <?php foreach ((array)$this->view['wpsg_mod_produktattribute']['data'] as $pa_id) { ?>
-<div class="product_info">
-	<div 
-	<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-		<span class="fa fa-ellipsis-v"></span>
-		<?php echo $this->callMod('wpsg_mod_produktattribute', 'getAttributeLabel', array($pa_id)); ?>:
-		<strong><?php echo $this->callMod('wpsg_mod_produktattribute', 'getAttributeValue', array($this->view['wpsg_mod_produktattribute']['id'], $pa_id)); ?></strong>
-	</div>
-</div>
+					
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">	
+	<td colspan="1"><?php echo __('Attribut', 'wpsg'); ?>:</td>
+	<td class="wpsg_cell_produktattribute_value" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'2':'1'); ?>">
+		<?php echo $this->callMod('wpsg_mod_produktattribute', 'getAttributeValue', array($this->view['wpsg_mod_produktattribute']['id'], $pa_id)); ?>
+	</td>
+</tr>
 <?php }?>
Index: ews/mods/mod_produktattribute/produkt_addedit_content.phtml
===================================================================
--- /views/mods/mod_produktattribute/produkt_addedit_content.phtml	(revision 8528)
+++ 	(revision )
@@ -1,38 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Eingabe der Produktattribute innerhalb der Produktverwaltung
-	 */
-
-?> 
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktattribute', 'wpsg')); ?>
-
-	<?php if (wpsg_isSizedArray($this->view['data']['pa'])) { ?>
-
-		<?php foreach ($this->view['data']['pa'] as $pa) { ?>
-		
-			<?php if ($pa['typ'] == '1') { /* RTE */ ?>
-			<div class="form-horizontal"><div class="form-group-sm"> 
-				<label class="control-label" for="pa_5" style="padding-bottom:5px;"><?php echo wpsg_hspc($pa['name']); ?></label><br />
-				<?php wp_editor($pa['value'], 'pa_'.$pa['id'].''); ?><br />
-			</div></div>
-			<?php } else if ($pa['typ'] == '2') { /* Auswahl */ ?>
-			<?php echo wpsg_drawForm_Select('pa_'.$pa['id'], $pa['name'], (array)explode('|', $pa['auswahl']), $pa['value']);?>
-			<?php } else if ($pa['typ'] == '3') { /* Checkbox */ ?>
-			<?php echo wpsg_drawForm_Checkbox('pa_'.$pa['id'], $pa['name'], $pa['value']); ?>
-			<?php } else { /* Normales Eingabefeld */ ?>
-			<?php echo wpsg_drawForm_Input('pa_'.$pa['id'], $pa['name'], $pa['value']); ?>
-			<?php } ?>		
-				
-		<?php } ?>
-		
-	<?php } else { ?>
-	<p><?php echo __('Bisher wurden keine Attribute im System angelegt.', 'wpsg'); ?></p>
-	<?php } ?>
-	
-	<br />
-	
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktattribute"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Produktattribute', 'wpsg'); ?></a>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: /views/mods/mod_produktattribute/produkt_bottom.phtml
===================================================================
--- /views/mods/mod_produktattribute/produkt_bottom.phtml	(revision 8528)
+++ /views/mods/mod_produktattribute/produkt_bottom.phtml	(revision 5261)
@@ -5,5 +5,5 @@
 	 */
 
-?> 
+?>
 <?php foreach ((array)$this->view['wpsg_mod_produktattribute']['data'] as $a) { ?>
 <?php if (wpsg_isSizedString($a['value']) && $a['autoshow'] == '1') { ?>
@@ -12,15 +12,9 @@
 	<div class="wpsg_mod_produktattribute_value">
 		<?php if ($a['typ'] == 3) { // Checkbox ?>
-			<?php echo (($a['value'] == '1')?__('Ja', 'wpsg'):__('Nein', 'wpsg')); ?>
-		<?php } else if ($a['typ'] == 2) { // Auswahl { ?>
-			<?php
-				$arAuswahl = explode('|', $a['auswahl']);
-				$value = $arAuswahl[$a['value']];
-				echo $value;
-			?>
-		<?php } else { // Textfeld { ?>
-			<?php echo $a['value']; ?>
+		<?php echo (($a['value'] == '1')?__('Ja', 'wpsg'):__('Nein', 'wpsg')); ?>		
+		<?php } else { ?>
+		<?php echo $a['value']; ?>	
 		<?php } ?>
-	</div>
+	</div>	
 	<div class="wpsg_clear"></div>
 </div>
Index: /views/mods/mod_produktattribute/produkt_edit_content.phtml
===================================================================
--- /views/mods/mod_produktattribute/produkt_edit_content.phtml	(revision 5261)
+++ /views/mods/mod_produktattribute/produkt_edit_content.phtml	(revision 5261)
@@ -0,0 +1,45 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Eingabe der Produktattribute innerhalb der Produktverwaltung
+	 */
+
+?>
+<?php if (sizeof($this->view['data']['pa']) > 0) { ?>
+<div class="postbox" id="wpsg_produktattribute">		
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Produktattribute', 'wpsg'); ?></span>
+	</h3>	
+	<div class="inside">
+	
+		<?php foreach ($this->view['data']['pa'] as $pa) { ?>			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label for="produkt_pa_<?php echo $pa['id']; ?>"><?php echo __($pa['name'], 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<?php if ($pa['typ'] == '1') { /* RTE */ ?>
+					
+						<?php wp_editor($pa['value'], 'pa_'.$pa['id'].''); ?>
+						
+					<?php } else if ($pa['typ'] == '2') { /* Auswahl */ ?>
+						<select id="produkt_pa_<?php echo $pa['id']; ?>" name="pa_<?php echo $pa['id']; ?>">
+							<?php foreach ((array)explode("|", $pa['auswahl']) as $option) { ?>
+							<option <?php echo (($pa['value'] == $option)?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($option); ?>"><?php echo wpsg_hspc($option); ?></option>
+							<?php } ?>
+						</select>
+					<?php } else if ($pa['typ'] == '3') { /* Checkbox */ ?>
+						<input type="hidden" value="0" name="pa_<?php echo $pa['id']; ?>" />
+						<input id="produkt_pa_<?php echo $pa['id']; ?>" class="checkbox" type="checkbox" value="1" name="pa_<?php echo $pa['id']; ?>" <?php echo (($pa['value'] == '1')?'checked="checked"':''); ?> />
+					<?php } else { /* Normales Eingabefeld */ ?>
+						<input id="produkt_pa_<?php echo $pa['id']; ?>" type="text" name="pa_<?php echo $pa['id']; ?>" value="<?php echo wpsg_hspc($pa['value']); ?>" />
+					<?php } ?>
+				</div>
+			</div>
+			<div class="wpsg_clear"></div>
+		<?php } ?>
+	
+	</div>
+</div>
+<?php } ?>
Index: /views/mods/mod_produktattribute/settings_edit.phtml
===================================================================
--- /views/mods/mod_produktattribute/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_produktattribute/settings_edit.phtml	(revision 5261)
@@ -8,5 +8,5 @@
 
 ?>
-<script type="text/javascript">/* <![CDATA[ */
+<script type="text/javascript">
  
 	/**
@@ -15,11 +15,6 @@
 	function wpsg_mod_produktattribute_changeTyp(pa_id)
 	{
-        //alert('changetyp1: ' + jQuery('#typ_' + pa_id).val());
-        //alert('changetyp1: ' + jQuery('#typ_' + pa_id).attr('data-value'));
-
-		//typ = jQuery('#typ_' + pa_id).val();
-		typ = jQuery('#typ_' + pa_id).attr('data-value');
-		
-		if (typ == '2')
+	
+		if (jQuery('#typ_' + pa_id).val() == '2')
 		{
 			jQuery('.auswahlrow_' + pa_id).show();
@@ -34,5 +29,5 @@
 			data: {
 				field: 'typ',
-				xvalue: jQuery('#typ_' + pa_id).attr('data-value'),
+				value: jQuery('#typ_' + pa_id).val(),
 				pa_id: pa_id
 			},
@@ -69,59 +64,53 @@
 	{
 
-		jQuery('#wpsg_code_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		jQuery("#wpsg_pa_code_dialog").dialog( {
+			'dialogClass': 'wp-dialog',           
+	        'modal': true,
+	        'width': 600,
+	        'height': 300,	       
+	        'title': '<?php echo __('HTML Code Block', 'wpsg'); ?>',
+	        open: function(event, ui) {
+
+	        	jQuery('#wpsg_pa_code_dialog .wpsg_dialog').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+	        	
+	        	jQuery.ajax( {
+	    			url: 'admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktattribute&do=genPACode&noheader=1',
+	    			data: {
+	    				'pa_id': pa_id
+	    			},
+	    			success: function(data)
+	    			{
+		    			jQuery('#wpsg_pa_code_dialog .wpsg_dialog').html(data);
+	    			}
+	        	} );
+		        
+	        }
+		} );
 		
-		jQuery('#wpsg_code_dialog').modal( { } )
-		
-		jQuery.ajax( {
-			url: 'admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktattribute&do=genPACode&noheader=1',
-			data: { 'pa_id': pa_id },
-			success: function(data) { jQuery('#wpsg_code_dialog .modal-body').html(data); }
-    	} );
- 		
 		return false;
 		
 	} // function wpsg_genPACode(pa_id)
 	
-/* ]]> */</script>
+</script>
 
-<br />
+<div id="wpsg_pa_code_dialog" style="display:none;"><div class="wpsg_dialog"></div></div>
 
-<div>
-	<ul class="nav nav-tabs">
-  		<li role="presentation" class="active"><a href="#tab1" role="tab" data-toggle="tab"><?php echo __('Globale Produktattribute', 'wpsg'); ?></a></li>
-  		<li role="presentation"><a href="#tab2" role="tab" data-toggle="tab"><?php echo __('Einstellungen', 'wpsg'); ?></a></li>  
-	</ul>
-	<div class="tab-content">
-		<div id="tab1" role="tabpanel" class="tab-pane active">
-			<!-- Modal fÃŒr Codeanzeige -->
-			<div class="modal fade" id="wpsg_code_dialog" tabindex="-1" role="dialog">
-			  <div class="modal-dialog" role="document">
-			    <div class="modal-content">
-			      <div class="modal-header">
-			        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-			        <h4 class="modal-title" id="myModalLabel"><?php echo __('HTML Code Block', 'wpsg'); ?></h4>
-			      </div>
-			      <div class="modal-body"></div>
-			      <div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('SchlieÃen', 'wpsg'); ?></button></div>
-			    </div>
-			  </div>
+<div class="wpsg_admin_content">
+	<div class="wpsg_admin_box">		
+			  		
+		<div class="head">
+			<div class="title">
+				<div class="fulltab">
+					<?php echo __('Produktattribute', 'wpsg'); ?>
+					<a title="<?php echo __('Neues Produktattribut anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addPA();"></a>
+				</div>
 			</div>
-			
-			<div class="content" id="wpsg_pa_list"><?php $this->mod->pa_listAction(); ?></div>
-			
-			<div class="clear"></div>
-			
-			<br />
-			
-			<a href="#" onclick="return wpsg_addPA();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neues Produktattribut anlegen', 'wpsg'); ?></a>
 		</div>
-		<div id="tab2" role="tabpanel" class="tab-pane">
-			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktattribute_showProduct', __('Produktattribut(e) im Produkttemplate anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktattribute_showProduct'), array('help' => 'wpsg_mod_produktattribute_showProduct')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktattribute_showBasket', __('Produktattribut(e) im Warenkorbtemplate anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktattribute_showBasket'), array('help' => 'wpsg_mod_produktattribute_showBasket')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktattribute_showOverview', __('Produktattribut(e) im BestellÃŒbersichtstemplate anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktattribute_showOverview'), array('help' => 'wpsg_mod_produktattribute_showOverview')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktattribute_showMail', __('Produktattribut(e) in Mailemplates anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktattribute_showMail'), array('help' => 'wpsg_mod_produktattribute_showMail')); ?>	
-		
+		<div class="content" id="wpsg_pa_list">
+			<?php $this->mod->pa_listAction(); ?>
 		</div>
+				
 	</div>
 </div>
+
+<div class="clear"></div>
Index: /views/mods/mod_produktbilder/produkt_edit_content.phtml
===================================================================
--- /views/mods/mod_produktbilder/produkt_edit_content.phtml	(revision 5261)
+++ /views/mods/mod_produktbilder/produkt_edit_content.phtml	(revision 5261)
@@ -0,0 +1,123 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration der Produktbilder in das Backend der Produktverwaltung
+	 * wird von Template /views/Produkt/addedit.phtml eingebunden
+	 */
+
+?>
+<div class="postbox" id="wpsg_produktbilder">		
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Produktbilder', 'wpsg'); ?></span>
+	</h3>	
+	<div class="inside">
+	
+		<?php if ($this->view['data']['id'] > 0) { ?>
+		
+			<div id="produktbilder_target"><?php echo $this->view['ProduktList']; ?></div>
+		
+			<?php if (get_option("wpsg_classicupload") == "1") { ?>
+				
+			<div class="wpsg_clear"></div><br />
+			<div><?php echo __("Um ein Bild zu lÃ¶schen klicken Sie einfach auf das Bild.", "wpsg"); ?></div>
+			<div class="wpsg_clear"></div><br />
+				
+			<input type="file" name="wpsg_mod_produktbilder_file" />
+				
+			<?php } else { ?>
+		
+			<div class="wpsg_clear"></div><br />
+			<div><?php echo __("Bitte klicken Sie auf Upload um ein Bild hochzuladen. Um ein Bild zu lÃ¶schen klicken Sie einfach auf das Bild.", "wpsg"); ?></div>
+			<div class="wpsg_clear"></div><br />
+			
+			<input value="Upload" type="text" style="text-align:center;" size="10" id="upload_button" />
+			
+			<script type="text/javascript">/* <![CDATA[ */
+						   
+				jQuery(document).ready(function() {									
+					new AjaxUpload(
+						"upload_button", {
+							action: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_produktbilder&cmd=upload&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1",
+							onSubmit: function(file, extension) {
+
+								jQuery('#produktbilder_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+								
+							},
+							onComplete: function(file, response) {
+
+								if (response == '1')
+								{
+									
+									jQuery("#produktbilder_target").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_produktbilder&cmd=produktbilder_liste&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1");
+
+									if (typeof wpsg_vp_refresh == "function") wpsg_vp_refresh();
+									
+								}
+								else
+								{
+									alert(response);
+								}
+								
+							}										
+						}
+					);					   
+			   	});
+			
+			/* ]]> */</script>
+			
+			<?php } ?> 
+			
+			<script type="text/javascript">/* <![CDATA[ */
+
+				/**
+				 * Wird beim lÃ¶schen eines Bilds (anklicken) aufgerufen
+				 */
+				function wpsg_remove_bild(strBild)
+				{
+
+					if (!confirm('<?php echo __('Sind Sie sicher, das Sie dieses Bild lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+
+					jQuery('#produktbilder_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+					
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_produktbilder&cmd=remove&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
+						async: false,
+						data: {
+							file: strBild
+						},
+						success: function(data) {
+							
+							jQuery('#produktbilder_target').html(data);
+
+							if (typeof wpsg_vp_refresh == "function") wpsg_vp_refresh();
+							
+						}
+					} );
+
+					return false;
+					
+				}
+			
+			/* ]]> */</script>
+			
+		<?php } else { ?>
+		<?php echo __('Das Hochladen von Produktbildern ist erst nach erstmaligem speichern mÃ¶glich.', 'wpsg'); ?>
+		<?php } ?>
+		
+		<br /><br />
+		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="feinheit"><?php echo __('FTP Pfad', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<a href="#" onclick="alert('<?php echo addslashes($this->callMod('wpsg_mod_produktbilder', 'getPicPath', array($this->view['data']['id']))); ?>'); return false;"><?php echo __('Anzeigen', 'wpsg'); ?></a>
+				</p>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>	
+	
+	</div>
+</div>
Index: /views/mods/mod_produktbilder/produkt_edit_list.phtml
===================================================================
--- /views/mods/mod_produktbilder/produkt_edit_list.phtml	(revision 5261)
+++ /views/mods/mod_produktbilder/produkt_edit_list.phtml	(revision 5261)
@@ -0,0 +1,23 @@
+<?php
+	
+	/**
+	 * Template fÃŒr die Liste der Bilder eines Produkts
+	 */
+
+?>
+<?php if (sizeof($this->view['ProduktBilder']) > 0) { ?>
+
+	<?php foreach ($this->view['ProduktBilder'] as $b) { ?>
+	
+		<div class="wpsg_mod_produktbilder_admin_bild">
+			<a onclick="return wpsg_remove_bild('<?php echo $b; ?>');" href="#" title="<?php echo __('Dieses Bild lÃ¶schen.', 'wpsg'); ?>">
+				<img src="<?php echo $this->view['modul']->makeTn($this->view['data']['id'], $b, 75, 75, 's'); ?>" alt="<?php echo wpsg_hspc($b); ?>" />
+			</a>
+		</div>
+	
+	<?php } ?>
+	<div class="wpsg_clear"></div>
+
+<?php } else { ?>
+<p><?php echo __('Bisher keine Produktbilder hochgeladen.', 'wpsg'); ?></p>
+<?php } ?>
Index: /views/mods/mod_produktbilder/produktbild.phtml
===================================================================
--- /views/mods/mod_produktbilder/produktbild.phtml	(revision 5261)
+++ /views/mods/mod_produktbilder/produktbild.phtml	(revision 5261)
@@ -0,0 +1,8 @@
+<?php 
+
+	/**
+	 * Template fÃŒr ein Produktbild
+	 */
+ 
+?>
+<a href="<?php echo $this->view['url_orginal']; ?>" class="wpsg_imagelink thickbox" rel="<?php echo $this->view['rel']; ?>-<?php echo $this->view['produkt']['id']; ?>" title="<?php echo wpsg_hspc($this->view['produkt']['name']); ?>"><img src="<?php echo $this->view['url_tn']; ?>" alt="<?php echo htmlspecialchars($this->view['produkt']['name']); ?>" /></a>
Index: /views/mods/mod_produktbilder/settings_edit.phtml
===================================================================
--- /views/mods/mod_produktbilder/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_produktbilder/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,13 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungsseite des Produktbilder Moduls
+	 */
+
+?> 
+<?php echo wpsg_drawForm_Input('wpsg_mod_produktbilder_width', __('Bildbreite (Vorschau)', 'wpsg'), $this->get_option('wpsg_mod_produktbilder_width'), array('help' => 'wpsg_mod_produktbilder_width')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_produktbilder_height', __('BildhÃ¶he (Vorschau)', 'wpsg'), $this->get_option('wpsg_mod_produktbilder_height'), array('help' => 'wpsg_mod_produktbilder_height')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_produktbilder_mode', __('Bildmodus (Vorschau)', 'wpsg'), $this->callMod('wpsg_mod_produktbilder', 'getImageModes'), $this->get_option('wpsg_mod_produktbilder_mode'), array('help' => 'wpsg_mod_produktbilder')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_produktbilder_quality', __('BildqualitÃ€t (PNG/JPG)', 'wpsg'), $this->get_option('wpsg_mod_produktbilder_quality'), array('help' => 'wpsg_mod_produktbilder_quality','hint' => __('0 = Schlechte QualitÃ€t, 100 = Gute QualitÃ€t', 'wpsg'))); ?>
+
+<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktbilder&wpsg_mod_produktbilder_clearcache=1&noheader=1"><?php echo __('Bildercache lÃ¶schen', 'wpsg'); ?></a>
Index: ews/mods/mod_rechnungen/accounting_pdf.phtml
===================================================================
--- /views/mods/mod_rechnungen/accounting_pdf.phtml	(revision 8528)
+++ 	(revision )
@@ -1,927 +1,0 @@
-<?php
- 
-	/**
-	 * Template fÃŒr die PDF Rechnungskorrektur
-	 */
-	
-	require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-	require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
-	require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
-  
-	global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top;
-
-    /** @var wpsg\wpsg_invoice|null $oInvoice */
-    $oInvoice = $this->view['oInvoice'];
-
-	// Positionierung der Absenderadresszeile
-	$absender_left				= 25;
-	$absender_top				= 50;
-	
-	// Positionierung der Zieladress
-	$adress_left 				= 25;	
-	$adress_top					= 55;
-	
-	// Positionierung des Rechnungskopfes
-	$rdata_left					= 25;
-	$rdata_top					= 90;
-	
-	// Positionierung der Produktdaten
-	$prod_left					= 25;
-	$prod_top					= 105;
-
-	// Anzahl an Produkten pro Seite
-	$prod_break					= $this->get_option('wpsg_rechnungen_pdfperpage');
-	
-	$arCalculation = $this->view['basket']['arCalculation'];
-
-	// Damit die Steuer bei der Kleinunternehmerregelung nicht angezeigt wird leer ich den Array sicherheitshalber
-	if ( ($this->get_option('wpsg_kleinunternehmer') == '1') || ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) ) unset($this->view['basket']['mwst']);
-	
-	if (!function_exists('AddRechnungPage'))
-	{
-		
-		function AddRechnungPage($shop, $pdf)
-		{
-			
-			global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top;
-			
-			$pdf->AddPage();
-			
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.pdf"))
-			{
-				
-				$pagecount = $pdf->setSourceFile($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.pdf");
-				$tplidx = $pdf->importPage(1, '/MediaBox'); 
-				$pdf->useTemplate($tplidx, 0, 0, 210); 
-				
-			}
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.jpg"))
-			{
-				$pdf->image($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.jpg", 0, 0, 210, 297, 'jpg');
-			}
-			
-			
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg"))
-			{
-	
-				list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg");
-				
-				//wpsg_debug($width.":".$height);
-				
-				$wPix = (25.4 * $width) / 96;
-				$hPix = (25.4 * $height) / 96;  
-				
-				$pdf->image($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg", 210 - $wPix, 0, $wPix, $hPix);
-				
-			}
-			
-			// Absenderadresszeile (Wird in der Konfiguration hinterlegt)
-			$pdf->SetFont('Arial', '', 6);
-			$pdf->Text($absender_left, $absender_top, $shop->replaceUniversalPlatzhalter(__($shop->get_option("wpsg_rechnungen_adresszeile"), 'wpsg'), $shop->view['data']['id']));	
-			
-			if (wpsg_getStr($shop->view['kunde']['kuerzel']) != "") $shop->view['kunde']['kuerzel'] = $shop->view['kunde']['kuerzel'].'-';
-			
-			// Adresse des Kunden
-			$pdf->SetFont('Arial', '', 12);			
-			$pdf->Text($adress_left, $adress_top, $shop->view['kunde']['firma']);
-			$pdf->Text($adress_left, $adress_top + 5, $shop->view['kunde']['vname'].' '.$shop->view['kunde']['name']);
-			$pdf->Text($adress_left, $adress_top + 10, $shop->view['kunde']['strasse'].' '.wpsg_getStr($shop->view['kunde']['nr']));
-			$pdf->Text($adress_left, $adress_top + 15, $shop->view['kunde']['plz'].' '.$shop->view['kunde']['ort']);
-			
-			if ($shop->get_option("wpsg_mod_rechnungen_hideCountry") == '0') $pdf->Text($adress_left, $adress_top + 20, strtoupper($shop->view['oOrder']->getInvoiceCountryName()));			
-			
-			// Rechnungsdaten 
-			$pdf->SetFont('Arial', 'B', 16);
-			$pdf->Text($rdata_left, $rdata_top, __('Rechnungskorrektur', 'wpsg'));
-			$pdf->SetFont('Arial', 'B', 9);
-			$pdf->Text($rdata_left, $rdata_top + 6, $shop->view['rnr']);
-			$pdf->SetFont('Arial', '', 9);
-			
-			if (isset($shop->view['faelligkeitdatum']))
-			{
-	
-				$pdf->Text($rdata_left + 35, $rdata_top, __("FÃ€llig am", "wpsg"));
-				$pdf->Text($rdata_left + 35, $rdata_top + 6, date("d.m.Y", strtotime($shop->view['faelligkeitdatum'])));
-				
-			}
-					
-			if (isset($shop->view['payment']))
-			{
-							
-				$pdf->Text($rdata_left + 58, $rdata_top, __("Zahlungsbedingungen", "wpsg"));
-				$pdf->Text($rdata_left + 58, $rdata_top + 6, $shop->view['payment']);
-				
-			}
-			
-			$pdf->Text($rdata_left + 105, $rdata_top, __("Kunden-Nr", "wpsg"));
-			$pdf->Text($rdata_left + 105, $rdata_top + 6, (($shop->view['kunde']['knr'] != '')?$shop->view['kunde']['knr']:$shop->view['kunde']['id']));
-			
-			$pdf->Text($rdata_left + 135, $rdata_top, __("Best. Nr.", "wpsg"));
-			$pdf->Text($rdata_left + 135, $rdata_top + 6, ((trim($shop->view['data']['onr']) != '')?$shop->view['data']['onr']:$shop->view['data']['id']));
-			
-			$pdf->Text($rdata_left + 155, $rdata_top, __("Datum", "wpsg")); 
-			$pdf->Text($rdata_left + 155, $rdata_top + 6, date("d.m.Y", strtotime($shop->view['rDatum'])));
-					
-			if ($shop->view['oOrder']->isInnerEu())
-			{
-
-            	$pdf->SetFont('Arial', '', 9);
-                $pdf->Text($adress_left, $rdata_top + 11.5, __("Innergemeinschaftliche Lieferung.", "wpsg"));
-
-            } else if (!$shop->view['oOrder']->isInnerEu() && $shop->view['oOrder']->getShippingCountryID() != $shop->getDefaultCountry(true)) {
-
-			// Nicht InnerEU und Nicht Inland
-
-             	$pdf->SetFont('Arial', '', 9);
-                $pdf->Text($adress_left, $rdata_top + 11.5, __("Steuerfreie Ausfuhrlieferung.", "wpsg"));
-
-			}
-					
-			// Benutzerdefinierte Felder
-			$arTexte = $shop->callMod('wpsg_mod_rechnungen', 'getRechnungstexte', array($shop->view['data']['id']));
-			
-			foreach ((array)$arTexte as $text)
-			{
-				
-				if (isset($text['aktiv']) && $text['aktiv'] == 1)
-				{
-					
-					$pdf->SetFont('Arial', 'B', ((intval($text['fontsize']) > 0)?intval($text['fontsize']):10));
-					$pdf->wpsg_SetTextColor($text['color']);
-					$pdf->wpsg_MultiCell($text['x'], $text['y'], 5, $text['text']); 
-					$pdf->wpsg_SetTextColor("#000000");
-					
-				}
-				
-			}
-			
-		}
-		
-	}
-
-	$pdf = new wpsg_fpdf();	
-	$pdf->SetAutoPageBreak(true, 5);
-	AddRechnungPage($this, $pdf);
-
-	if ( ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B && $this->view['oOrder']->isInnerEu()) 
-	|| ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) 
-	) $bNoTax = true;
-	else $bNoTax = false;
-
-	$bTaxCol = false;
-	if ($this->get_option('wpsg_showMwstAlways') === '1') $bTaxCol = true;
-	else if (!$bNoTax) $bTaxCol = true;
-
-	if ($bNoTax) {
-
-		$discount_value = $this->view['basket']['arCalculation']['sum']['discount_netto'];
-		$shipping_cost = $this->view['basket']['arCalculation']['sum']['shipping_netto'];
-		$payment_cost = $this->view['basket']['arCalculation']['sum']['payment_netto'];
-
-		$taxdisplay = 'netto';
-
-	} else {
-
-		$discount_value = $this->view['basket']['arCalculation']['sum']['discount_brutto'];
-		$shipping_cost = $this->view['basket']['arCalculation']['sum']['shipping_brutto'];
-		$payment_cost = $this->view['basket']['arCalculation']['sum']['payment_brutto'];
-
-		$taxdisplay = 'brutto';
-
-	}
-				
-	$summe = 0;
-	
-	$bKopf = false; $pnr = 1; $offset = 0; $count = 0;
-	foreach ($this->view['basket']['arCalculation']['product'] as $p)
-	{
-		$product = wpsg_product::getInstance($p['product_id']);
-			 
-		if (!$bKopf)
-		{
-
-			$pdf->SetFont('Arial', 'B', 9);
-			$pdf->setXY($prod_left, $prod_top);
-			$pdf->Cell(10, 8, __("Nr.", "wpsg"), 1, 0, 'C');
-
-			$pdf->setXY($prod_left + 10, $prod_top);
-			$pdf->Cell( (($bTaxCol)?87:102), 8, "Name", 1, 0, 'L');
-			
-			if ($bTaxCol)
-			{
-			
-				$pdf->setXY($prod_left + 97, $prod_top);
-				$pdf->Cell(15, 8, __("MwSt.", "wpsg"), 1, 0, 'C');
-				
-			}
-			
-			$pdf->setXY($prod_left + 112, $prod_top);
-			$pdf->Cell(15, 8, __("Menge", "wpsg"), 1, 0, 'C');
-						
-			$pdf->setXY($prod_left + 127, $prod_top);
-			$pdf->Cell(25, 8, __("Einzelpreis", "wpsg"), 1, 0, 'R');
-			
-			$pdf->setXY($prod_left + 152, $prod_top);
-			$pdf->Cell(25, 8, __("Gesamtpreis", "wpsg"), 1, 0, 'R');
-			 												
-			$offset = 8;	
-			$bKopf = true;
-			
-		}
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		
-		if ($this->get_option('wpsg_mod_rechnungen_anr') == '1') $pdf->Cell(10, 8, $product->getNr(), 0, 0, 'C');
-		else $pdf->Cell(10, 8, $pnr.".", 0, 0, 'C');
-
-		if ($this->get_option('wpsg_rechnungen_pdetailname') == '1') $produkt_text = $this->getProductName($this->getProduktID($p['product_id']), true);
-		else $produkt_text = $this->getProductName($this->getProduktID($p['product_id']), false);
-		
-		$produktBeschreibung = trim(strip_tags($product->getShortDescription()));
-		
-		if ($this->isOtherLang())
-		{ 
-			
-			$trans_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($this->getProduktID($p['product_id']))."' AND `lang_code` = '".wpsg_q($this->getCurrentLanguageCode())."'");
-			
-			if (is_array($trans_db) && sizeof($trans_db) > 0)
-			{
-				
-				$produkt_text = $trans_db['name'];
-				$produktBeschreibung = trim(strip_tags($trans_db['beschreibung']));
-				 
-			}
-			
-		}
-		 
-		$height = 0; // HÃ¶he der Zeile fÃŒr den Rahmen
-		
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		
-		// Produktvariablen 
-		if ($this->hasMod('wpsg_mod_productvars') && $this->get_option("wpsg_mod_rechnungen_showpv") == "1")
-		{
-		 
-			$arPV = $this->callMod('wpsg_mod_productvars', 'getAllProductVarValues', array($this->view['data']['id'], $p['product_index']));
-					
-			if (wpsg_isSizedArray($arPV))
-			{
-				
-				foreach ($arPV as $pv) 
-				{
-				
-					$produkt_text .= "\r\n".$pv['name'].': '.$pv['value'];
-					$height += 5;
-					
-				}
-				
-			}
-			
-		}
-
-        if ($this->get_option('wpsg_mod_rechnungen_anr') === '2')
-        {
-
-            $anr = $this->getProductAnr($product->getProductKey());
-            $produkt_text .= "\r\n".wpsg_translate(__('Artikelnummer: #1#', 'wpsg'), $anr);
-
-        }
-
-		$produkt_text_cell_width = 102;
-		if ($bTaxCol) $produkt_text_cell_width = 87;
-		
-		$produkt_text_width = $pdf->GetStringWidth($produkt_text);
-		//$produkt_text_cell_width = (($this->arMwSt == "-1")?87:102);
-		
-		$height += 5 * ceil($produkt_text_width / $produkt_text_cell_width) + 3;
-		
-		$height_y = $pdf->getY();
-		$height = 2 + $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $offset + 1.5, 5, $produkt_text, 0, 'L', 0, $produkt_text_cell_width);
-		
-		//$height += 3 + 5 + $pdf->getY() - $height_y;
-		//$pdf->Cell((($this->arMwSt == "-1")?102:87), 8, $produkt_text, 0, 0, 'L');
-
-		if ($bTaxCol) {
-		
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);		
-			$pdf->Cell(15, 8, (($bNoTax)?'0.00 %':wpsg_ff($this->view['basket']['arCalculation']['tax'][$p['tax_key']]['tax_value'], '%')), 0, 0, 'C');
-			
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, $p['amount'], 0, 0, 'C');
-						
-		if ( ( wpsg_ShopController::get_option('wpsg_preisangaben') == WPSG_NETTO ) || $bNoTax ) $preis_single = $p['netto_calculated_single'];
-		else $preis_single =  $p['brutto_calculated_single'];
-		
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($preis_single, $this->get_option('wpsg_currency')), 0, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($preis_single * $p['amount'], $this->get_option('wpsg_currency')), 0, 0, 'R');		
-
-		/**
-		 * Produktbeschreibung anzeigen Ja/Nein
-		 */
-		$pBeschreibungHeight = 0;
-		if ($this->get_option("wpsg_rechnungen_pbeschreibung") == "1" && trim(strip_tags($product->getShortDescription())) != '')
-		{
-			
-			$produktBeschreibung = nl2br($produktBeschreibung);			
-			preg_match_all('/\<br \/\>/', $produktBeschreibung, $treffer);
-			$produktBeschreibung = strip_tags($produktBeschreibung);
-			
-			$pBeschreibungWidth = $pdf->getStringWidth($produktBeschreibung); 
-			$pBeschreibungHeight = 5 * (ceil($pBeschreibungWidth / $produkt_text_cell_width) + @sizeof($treffer[0]));
-			
-			$pdf->SetFont('Arial', 'I', 9);
-			
-			$cellY = $pdf->getY();
-			$pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 1, 5, $produktBeschreibung, 0, 'L', 0, $produkt_text_cell_width);			
-			$pBeschreibungHeight = $pdf->getY() - $cellY - $height + 1;
-			$pdf->SetFont('Arial', '', 9);
-			
-		} 
-					
-		$height += $pBeschreibungHeight;
-
-		/**
-		 * Produktattribute ?
-		 */
-		if ($this->get_option('wpsg_rechnungen_produktattribute') == '1')
-		{
-
-			$attributeInfo = $this->callMod('wpsg_mod_produktattribute', 'getProductAttributeByProductId', array($this->getProduktId($p['product_id'])));
-		
-			foreach ($attributeInfo as $pa)
-			{
-
-				if ($pa['value'] == "") $pa['value'] = "Keine Angabe";
-				$pa_text = $pa['name'].': '.$pa['value'];
-				$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, $pa_text, 0, 'L', 0, $produkt_text_cell_width);
-					
-			}
-		}		
-		
-		/**
-		 * Variante ? 
-		 */
-		if (preg_match('/pv_(.*)/', $p['product_key']))
-		{
-			
-			$variInfo = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p['product_key']));
-
-			$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key']), 0, 'L', 0, $produkt_text_cell_width);			
-			
-			//$height += 5;
-			
-		}
-		
-		if ($this->hasMod('wpsg_mod_deliverynote') && ($this->get_option('wpsg_rechnungen_deliverynote') == '1'))
-		{
-			
-			$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($this->view['data']['id']));
-			
-			if (sizeof($arDN_order) > 1)
-			{
-				
-				$deliveryTimeProduct = $this->callMod('wpsg_mod_deliverynote', 'getProductDeliveryTime', array($this->view['data']['id'], $p['product_index'])); 
-				
-				if ($deliveryTimeProduct !== false)
-				{
-				
-					$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, wpsg_translate(__('Lieferdatum: #1#', 'wpsg'), date('d.m.Y', $deliveryTimeProduct)), 0, 'L', 0, $produkt_text_cell_width);
-					
-				}
-									
-			}
-			
-		}
-		
-		// Jetzt die Rahmen zeichnen
-		$pdf->Rect($prod_left, $prod_top + $offset, 10, $height);
-		
-		$pdf->Rect($prod_left + 10, $prod_top + $offset, (($bTaxCol)?87:102), $height);
-		
-		if ($bTaxCol) $pdf->Rect($prod_left + 97, $prod_top + $offset, 15, $height);
-		
-		$pdf->Rect($prod_left + 112, $prod_top + $offset, 15, $height);
-		$pdf->Rect($prod_left + 127, $prod_top + $offset, 25, $height);
-		$pdf->Rect($prod_left + 152, $prod_top + $offset, 25, $height);
-		
-		$offset += $height;
-		 		
-		$pnr ++;
-		$count ++;
-				
-		if ($bNoTax) $price = $p['netto'];
-		else $price = $p['brutto'];
-
-		$summe += $price * $p['amount'];
-		
-		if ($pdf->getY() > 220 || ($count >= $prod_break && sizeof($this->view['basket']['arCalculation']['product']) > ($pnr - 1)))		
-		{
-			
-			AddRechnungPage($this, $pdf);
-			$bKopf = false; $offset = 0; $count = 0;
-			
-		}
-		
-	} // produkte
- 
-	if (wpsg_isSizedArray($this->view['basket']['arCalculation']['voucher'])) {
-		
-		foreach ($this->view['basket']['arCalculation']['voucher'] as $v) {
-			
-			$pdf->SetFont('Arial', '', 9);
-			$pdf->setXY($prod_left, $prod_top + $offset);
-			$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-			
-			$pdf->setXY($prod_left + 10, $prod_top + $offset);
-			$pdf->Cell( (($bTaxCol)?87:102), 8, wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $v['code']), 1, 0, 'L');
-			
-			if ($bTaxCol)
-			{
-				
-				$mwst = __('anteilig', 'wpsg');
-				
-				$pdf->setXY($prod_left + 97, $prod_top + $offset);
-				$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-				
-			}
-			
-			$pdf->setXY($prod_left + 112, $prod_top + $offset);
-			$pdf->Cell(15, 8, '1', 1, 0, 'C');
-			
-			$gs_value_einzel = wpsg_ff($v[$taxdisplay.'_single'], $this->get_option('wpsg_currency'));
-			$gs_value_gesamt = wpsg_ff($v[$taxdisplay], $this->get_option('wpsg_currency'));
-			
-			$pdf->setXY($prod_left + 127, $prod_top + $offset);
-			$pdf->Cell(25, 8, $gs_value_einzel, 1, 0, 'R');
-			
-			$pdf->setXY($prod_left + 152, $prod_top + $offset);
-			$pdf->Cell(25, 8, $gs_value_gesamt, 1, 0, 'R');
-			
-			$offset += 8;
-			
-		}
-		
-	}
-	
-	// Versandkosten
-	if ( ($shipping_cost != '') && ($shipping_cost != 0) )
-	{
-			 
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		$pdf->Cell( (($bTaxCol)?87:102), 8, wpsg_translate(__('Versandkosten "#1#"', 'wpsg'), $this->view['oOrder']->getShippingLabel()), 1, 0, 'L');
-		
-		if ($bTaxCol)
-		{
-		
-			// if ($this->arShipping[$this->view['data']['type_shipping']]['mwst_null'] == '1' && $bNoTax) $mwst = wpsg_ff(0.00, '%');
-			// {
-			if ($bNoTax) 
-			{
-
-				$mwst = wpsg_ff(0.00, '%');
-
-			} else {
-				
-				if ($this->view['basket']['arCalculation']['shipping'][0]['tax_key'] === '0') {
-				
-					$mwst = _('anteilig');
-
-				} else {
-					
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['shipping'][0]['tax'], '%');
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['tax'][$this->view['basket']['arCalculation']['shipping'][0]['tax_key']]['tax_value'], '%');
-					
-				}
-				 				
-			}
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
- 	
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
-					
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($shipping_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($shipping_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		 												
-		$offset += 8;
-
-	}
-	
-	// Zahlungskosten
-	if ( ($payment_cost != '') && ($payment_cost != 0) )
-	{
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		$pdf->Cell( (($bTaxCol)?87:102), 8, $this->arPayment[$this->view['data']['type_payment']]['name'], 1, 0, 'L');
-		
-		if ($bTaxCol)
-		{
-		
-			// if ($this->arPayment[$this->view['data']['type_payment']]['mwst_null'] == '1' && $bNoTax)
-			// {
-			if ($bNoTax) 
-			{
-
-				$mwst = wpsg_ff(0.00, '%');
-
-			} else {
-				
-				if ($this->view['basket']['arCalculation']['payment'][0]['tax_key'] === '0') {
-					
-					$mwst = _('anteilig');
-					
-				} else {
-					
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['payment'][0]['tax'], '%');
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['tax'][$this->view['basket']['arCalculation']['payment'][0]['tax_key']]['tax_value'], '%');
-					
-				}
-				
-			}
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-			
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
-					
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($payment_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($payment_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		 												
-		$offset += 8;
-		
-	}
-		 	 
-	// GebÃŒhr
-	if (wpsg_tf(wpsg_getStr($this->view['storno_fee'])) > 0)
-	{
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-
-		$label = __('BearbeitungsgebÃŒhr', 'wpsg');
-
-		if (strpos($this->view['storno_fee'], '%') !== false) $label .= ' ('.wpsg_ff($this->view['storno_fee'], '%').')';
-		
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		$pdf->Cell( (($bTaxCol)?87:102), 8, $label, 1, 0, 'L');
-		
-		if ($bTaxCol)
-		{
-		
-			if ($bNoTax) $mwst = wpsg_ff(0.00, '%');
-			else $mwst = wpsg_ff($this->view['storno_fee_tax_value'], '%');
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-			
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
-					
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-		 												
-		$offset += 8;
-		
-	}
-	
-	$pdf->SetFont('Arial', '', 9);
-	
-	if ($this->view['kunde']['ustidnr'] != "")
-	{
-		$offset += 10;
-		$pdf->Text($prod_left, $prod_top + $offset, __("Ihre Umsatzsteuer-Identifikationsnummer:", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, $this->view['kunde']['ustidnr'], 0, 0, 'R');
-	}
-	
-	$offset += 5; // Abstand zwischen Tabelle und Rabatt
-
-	// Rabatt
-	if ($discount_value > 0)
-	{
-		
-		$offset += 5;
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("Rabatt", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, '-'.wpsg_ff($discount_value, $this->get_option('wpsg_currency')), 0, 0, 'R');
-		
-	}
-
-	$offset += 5; // Abstand zwischen Rabatt und Auswertung
-
-	if ( ($this->get_option('wpsg_kleinunternehmer') == '1') || ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) )
-	{
-		
-		$pdf->Text($prod_left, $prod_top + $offset, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("Summe", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-
-		$offset += 5;
-
-	} else {
-		
-		if ($bNoTax)
-		{
-			
-			$pdf->Text($prod_left, $prod_top + $offset, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __("Summe", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'] + $this->view['basket']['arCalculation']['sum']['discount_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			//if ( !$bNoTax || ($arCalculation['sum']['topay_brutto'] != $arCalculation['sum']['brutto']) ) 
-			$offset += 5;
-
-			if ( !(($this->view['oOrder']->isInnerEu()) && ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B)) ) {
-
-				if (sizeof($this->view['basket']['arCalculation']['tax']) >= 1)
-				{
-
-					$mw_count = 0;
-					foreach ($this->view['basket']['arCalculation']['tax'] as $mw)
-					{
-
-						if ( $mw['tax_value'] > 0 && $mw['sum'] > 0 ) {
-
-							$offset += 5;
-							$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. ", "wpsg").wpsg_ff($mw['tax_value'], '%'));
-							$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-							$pdf->Cell(37, 8, wpsg_ff($mw['sum'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-						
-							$mw_count++;
-
-						}
-
-					}
-					
-				}
-				
-				if ($mw_count >= 2)
-				{
-					
-					$offset += 5;
-					$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. GESAMT", "wpsg"));
-					$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-					$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'] - $this->view['basket']['arCalculation']['sum']['netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-					
-				}
-			
-			} else if ( !($arCalculation['sum']['topay_brutto'] != $arCalculation['sum']['brutto']) ) $offset -= 5; 
-
-		} else {
-			
-			$pdf->Text($prod_left, $prod_top + $offset, __("Der Gesamtbetrag setzt sich wie folgt zusammen", "wpsg").':');
-			
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __("NETTOBETRAG", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			
-			if (sizeof($this->view['basket']['arCalculation']['tax']) >= 1)
-			{
-
-				$mw_count = 0;
-				foreach ($this->view['basket']['arCalculation']['tax'] as $mw)
-				{
-
-					if ( $mw['tax_value'] > 0 && $mw['sum'] > 0) {
-
-						$offset += 5;
-						$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. ", "wpsg").wpsg_ff($mw['tax_value'], '%'));
-						$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-						$pdf->Cell(37, 8, wpsg_ff($mw['sum'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-					
-						$mw_count++;
-
-					}
-
-				}
-				
-			}
-			
-			if ($mw_count >= 2)
-			{
-				
-				$offset += 5;
-				$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. GESAMT", "wpsg"));
-				$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-				$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'] - $this->view['basket']['arCalculation']['sum']['netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-				
-			}
-			
-		}
-		
-	}
-
-	// Wertgutschein
-	if ( $arCalculation['sum']['topay_brutto'] != $arCalculation['sum']['brutto'] ) {
-
-		if (!$bNoTax) {
-		
-			$offset += 5;
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __("SUMME", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			
-			$pdf->setFont('Arial', '', '9');
-			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			$pdf->setFont('Arial', '', '9');
-		
-		} else if (!($mw_count >= 2)) $offset -= 5;
-
-		foreach ($arCalculation['coupon'] as $c) {
-			
-			$offset += 5;
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __('Wertgutschein', 'wpsg').' '.((wpsg_isSizedString($c['code']))?'('.$c['code'].')':''));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			
-			$pdf->setFont('Arial', '', '9');
-			$pdf->Cell(37, 8, wpsg_ff($c[$taxdisplay], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			$pdf->setFont('Arial', '', '9');
-			
-		}
-		
-		$offset += 5;
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("ZU ZAHLEN", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		
-		/* Endbetrag wird fett ausgegeben */
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-		
-	} else {
-
-		$offset += 5;
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("GESAMTSUMME", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-
-		/* Endbetrag wird fett ausgegeben */
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-				
-	}
-	
-	if ( ($this->get_option('wpsg_kleinunternehmer') == '1') || ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) )
-	{
-
-		$offset += 3;
-		$pdf->setFont('Arial', '', '8');
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, '('.$this->get_option('wpsg_kleinunternehmer_text').')');
-		$offset += 8;
-		
-	}
-
-	$offset += 5;
-	
-	if ($this->hasMod('wpsg_mod_deliverynote') && ($this->get_option('wpsg_rechnungen_deliverynote') == '1'))
-	{
-		
-		$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($this->view['data']['id']));
-		$delivery_date = $this->callMod('wpsg_mod_deliverynote', 'getDeliveryTime', array($this->view['data']['id']));
-
-		// Wenn es ein Gesamtlieferdatum gibt und nur einen Lieferschein, dann unter der Bestellung anzeigen
-		if ($delivery_date !== false && sizeof($arDN_order) == 1)
-		{
-			
-			$pdf->setFont('Arial', 'B', '9');
-			$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, __('Lieferung:', 'wpsg'));
-			$pdf->setFont('Arial', '', '9');
-			$pdf->wpsg_MultiCell($prod_left + 16, $prod_top + $offset, 5, wpsg_translate(__('#1#', 'wpsg'), date('d.m.Y', $delivery_date)));
-			$offset += 8;
-			
-		}
-		
-	}
-
-	if ($this->view['fussText'] != "")
-	{
-		
-		$pdf->setFont('Arial', '', '9');	
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, $this->view['fussText']);
-		$offset += 8;
-		
-	}
-	
-	$offset += 10;
-
-	$shipping_adress = false;
-	if ($this->hasMod('wpsg_mod_shippingadress') && $this->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array('k_id' => $this->view['data']['k_id'], 'o_id' => $this->view['data']['id']))) {
-		
-		$pdf->setFont('Arial', 'B', 9);
-		$pdf->Text($prod_left, $prod_top + $offset, __("Lieferanschrift", "wpsg").":");
-		$offset += 2;
-		
-		$pdf->setFont('Arial', '', 9);
-		
-			$shipping_adress = "";
-			if ($this->view['data']['shipping_firma'] != "")
-			{
-				$shipping_adress .= $this->view['data']['shipping_firma']."\r\n";
-			}
-			$shipping_adress .= $this->view['data']['shipping_vname'].' '.$this->view['data']['shipping_name']."\r\n";
-			$shipping_adress .= $this->view['data']['shipping_strasse'].' '.$this->view['data']['shipping_nr']."\r\n";
-			// $shipping_adress .= $this->view['data']['shipping_land']['kuerzel'].'-';
-			
-			$shipping_adress .= $this->view['data']['shipping_plz'].' '.$this->view['data']['shipping_ort']."\r\n";
-			$shipping_adress .= $this->view['data']['shipping_land']['name'];	
-		
-		$start = $pdf->getY();
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, $shipping_adress, 0, 'L', 0, 100);
-		$offset += $pdf->getY() - $start;
-		
-		$shipping_adress = true;
-		
-	}
-		 
-	// Bestellvariablen
-	if ($this->hasMod('wpsg_mod_ordervars') && $this->get_option('wpsg_mod_rechnungen_showov') == '1')
-	{
-
-		$pdf->SetFont('Arial', 'B', 9);
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset - 7, 5, __("Angaben wÃ€hrend der Bestellung", "wpsg").":");
-		
-		$pdf->SetFont('Arial', '', 9);
-
-			$bvars = @unserialize($this->view['data']['bvars']);
-			if (!is_array($bvars)) $bvars = array();
-			
-			$strBVars = "";
-			foreach ($bvars as $bvars_id => $bvars_value)
-			{
-				
-				$bvars = $this->db->fetchRow("SELECT * FROM `".wpsg_q(WPSG_TBL_ORDERVARS)."` WHERE `id` = '".wpsg_q($bvars_id)."' ORDER BY `pos` ASC, `id` ASC ");
-				
-				if ($bvars['typ'] == "1") // Auswahl
-				{
-					if ($bvars_value <= 0) $bvars_value = __("Keine Angabe", "wpsg");
-				}
-				else if ($bvars['typ'] == "2") // Texteingabe
-				{
-					if (trim($bvars_value) == "") $bvars_value = __("Keine Angabe", "wpsg");
-				}
-				else if ($bvars['typ'] == "3") // Checkbox
-				{
-					if ($bvars_value <= 0) $bvars_value = __("Keine Angabe", "wpsg");
-				}
-				
-				$bvars_name = $this->callMod('wpsg_mod_ordervars', 'getNameById', array($bvars_id));
-				$strBVars .= "\r\n".$bvars_name.": ".$bvars_value;
-				
-			}
-		
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset - 6, 5, $strBVars);
-
-	}
-
-	$this->callMods('wpsg_mod_rechnungen_pdf', array(&$pdf, &$this->view['data']['id'], &$this->view['preview'], &$this->view['invoice']));
-	
-	$filename = $this->view['filename'].".pdf";
-
-    ob_end_clean();
-
-	if ($this->view['preview']) {
-	    
-		$pdf->Output($filename, 'I');
-        
-	} else {
-		
-		$pdf->Output($oInvoice->getFilePath(), 'F');
-		
-		// Hier wird der Dateiname an FPD ÃŒbergeben. Er soll sich aus der Rechnungsnummer ergeben, auch wenn das Dokument ÃŒber die ID gespeichert ist.
-		$pdf->Output($this->view['filename_out'], 'I');
-			
-	} 
-
-?>
Index: ews/mods/mod_rechnungen/accountingmail.phtml
===================================================================
--- /views/mods/mod_rechnungen/accountingmail.phtml	(revision 8528)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php 
-
-	/**
-	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnungskorrektur optional an den Kunden versendet werden kann
-	 */
-
-	//wpsg_debug($this->view);
-
-?><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,
-		
-<?php echo __("Sie erhalten hiermit die Rechnungskorrektur in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.
-		
-<?php if (wpsg_tf($this->view['storno_fee']) > 0) { ?>
-<?php echo wpsg_translate(__('Darin ist eine GebÃŒhr von #1# #2# enthalten.', 'wpsg'), $this->view['storno_fee'], $this->get_option('wpsg_currency')); ?> 
-  
-<?php } ?>
-<?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?>
- 
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: ews/mods/mod_rechnungen/accountingmail_html.phtml
===================================================================
--- /views/mods/mod_rechnungen/accountingmail_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php 
-
-	/**
-	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnungskorrektur optional an den Kunden versendet werden kann (HTML)
-	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
-	//wpsg_debug($this->view);
-
-?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
-		
-<p><?php echo __("Sie erhalten hiermit die Rechnungskorrektur in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.</p>
-		
-<?php if (wpsg_tf($this->view['storno_fee']) > 0) { ?>
-<p><?php echo wpsg_translate(__('Darin ist eine GebÃŒhr von #1# #2# enthalten.', 'wpsg'), $this->view['storno_fee'], $this->get_option('wpsg_currency')); ?></p> 
-<?php } ?>
-
-<p><?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?></p>
-
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: /views/mods/mod_rechnungen/copymail.phtml
===================================================================
--- /views/mods/mod_rechnungen/copymail.phtml	(revision 8528)
+++ /views/mods/mod_rechnungen/copymail.phtml	(revision 5261)
@@ -1,13 +1,4 @@
-<?php 
+<?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,
 
-	/*
-	 * Template fÃŒr die Rechnungskopie
-	 */
- 
-	/** @var wpsg_order $oOrder */
-	$oOrder = wpsg_order::getInstance($this->view['order']['id']);
-
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), $oOrder->getInvoiceTitle(), $oOrder->getInvoiceFirstName(), $oOrder->getInvoiceName()); ?>
- 
 <?php if (isset($this->view['rnr'])) { ?>
 <?php echo __("hiermit erhalten Sie die Kopie der Rechnung", "wpsg"); ?> <?php echo $this->view['rnr']; ?>.
Index: /views/mods/mod_rechnungen/foottext_list.phtml
===================================================================
--- /views/mods/mod_rechnungen/foottext_list.phtml	(revision 8528)
+++ /views/mods/mod_rechnungen/foottext_list.phtml	(revision 5261)
@@ -9,6 +9,5 @@
 <p><?php echo __('Bisher keine FuÃtexte angelegt!', 'wpsg'); ?></p>
 <?php } else { ?>
-<table class="table table-body-striped wpsg_foottextlist">			
-    <thead>
+<table class="wpsg_foottextlist">			
 	<tr>
 		<th class="col_kuerzel"><?php echo __('KÃŒrzel', 'wpsg'); ?></th>
@@ -17,16 +16,12 @@
 		<th class="col_aktion"></th>
 	</tr>
-    </thead>
-    <tbody>
 	<?php foreach ((array)$this->view['data'] as $key => $d) { ?>
 	<tr>
-		<td class="col_kuerzel"><span class="wpsg_editable" id="wpsg_foottext_0_<?php echo $key; ?>"><?php echo wpsg_hspc($d[0]); ?></span></td>
-		<td class="col_text"><span class="wpsg_editable" id="wpsg_foottext_1_<?php echo $key; ?>"><?php echo wpsg_hspc($d[1]); ?></span></td>
+		<td class="col_kuerzel wpsg_editable" id="wpsg_foottext_0_<?php echo $key; ?>"><?php echo wpsg_hspc($d[0]); ?></td>
+		<td class="col_text wpsg_editable" id="wpsg_foottext_1_<?php echo $key; ?>"><?php echo wpsg_hspc($d[1]); ?></td>
 		<td class="col_standard"><input type="radio" value="<?php echo $key; ?>" <?php echo (($this->get_option('wpsg_rechnungen_foottext_standard') == $key)?'checked="checked"':''); ?> class="wpsg_rechnungen_foottext_standard" name="wpsg_rechnungen_foottext_standard" /></td>
 		<td class="col_aktion">
 		
-            <a onclick="return wpsg_removeFooter(<?php echo $key; ?>);" title="<?php echo __('FuÃtext lÃ¶schen', 'wpsg'); ?>'" href="#" class="">
-               <span class="glyphicon glyphicon-trash"></span>
-            </a>
+			<a onclick="return wpsg_removeFooter(<?php echo $key; ?>);" title="<?php echo __('FuÃtext lÃ¶schen', 'wpsg'); ?>'" href="#" class="wpsg_icon wpsg_icon_center wpsg_icon_remove"></a>
 			
 			<script type="text/javascript">
@@ -34,5 +29,5 @@
 				jQuery(document).ready(function() {
  
-					jQuery('#wpsg_foottext_0_<?php echo $key; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=inlinedit&noheader=1', {						
+					jQuery('#wpsg_foottext_0_<?php echo $key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=inlinedit&noheader=1', {
 						submitdata: { 
 				    		field: '0',
@@ -45,6 +40,5 @@
 					});	
 	
-					jQuery('#wpsg_foottext_1_<?php echo $key; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=inlinedit&noheader=1', {
-						type: 'textarea',
+					jQuery('#wpsg_foottext_1_<?php echo $key; ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=inlinedit&noheader=1', {
 						submitdata: { 
 				    		field: '1',
@@ -64,5 +58,4 @@
 	</tr>
 	<?php } ?>
-    </tbody>
 </table>
 <?php } ?>
Index: /views/mods/mod_rechnungen/gutschriftmail.phtml
===================================================================
--- /views/mods/mod_rechnungen/gutschriftmail.phtml	(revision 5261)
+++ /views/mods/mod_rechnungen/gutschriftmail.phtml	(revision 5261)
@@ -0,0 +1,19 @@
+<?php 
+
+	/**
+	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnungskorrektur optional an den Kunden versendet werden kann
+	 */
+
+	//wpsg_debug($this->view);
+
+?><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,
+		
+<?php echo __("Sie erhalten hiermit die Rechnungskorrektur in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.
+		
+<?php if (wpsg_tf($this->view['storno_fee']) > 0) { ?>
+<?php echo wpsg_translate(__('Darin ist eine GebÃŒhr von #1# #2# enthalten.', 'wpsg'), $this->view['storno_fee'], $this->get_option('wpsg_currency')); ?> 
+  
+<?php } ?>
+<?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?>
+ 
+<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: /views/mods/mod_rechnungen/gutschriftmail_html.phtml
===================================================================
--- /views/mods/mod_rechnungen/gutschriftmail_html.phtml	(revision 5261)
+++ /views/mods/mod_rechnungen/gutschriftmail_html.phtml	(revision 5261)
@@ -0,0 +1,19 @@
+<?php 
+
+	/**
+	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnungskorrektur optional an den Kunden versendet werden kann (HTML)
+	 */
+
+	//wpsg_debug($this->view);
+
+?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
+		
+<p><?php echo __("Sie erhalten hiermit die Rechnungskorrektur in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.</p>
+		
+<?php if (wpsg_tf($this->view['storno_fee']) > 0) { ?>
+<p><?php echo wpsg_translate(__('Darin ist eine GebÃŒhr von #1# #2# enthalten.', 'wpsg'), $this->view['storno_fee'], $this->get_option('wpsg_currency')); ?></p> 
+<?php } ?>
+
+<p><?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?></p>
+
+<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: ews/mods/mod_rechnungen/invoice_pdf.phtml
===================================================================
--- /views/mods/mod_rechnungen/invoice_pdf.phtml	(revision 8528)
+++ 	(revision )
@@ -1,960 +1,0 @@
-<?php
-	
-	/**
-	 * Template fÃŒr die PDF Rechnung
-	 */
-	
-	require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-	require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
-	require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
-	
-	global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top;
-
-    /** @var \wpsg\wpsg_invoice|null $oInvoice */
-    $oInvoice = $this->view['oInvoice']??null;
-
-	// Positionierung der Absenderadresszeile
-	$absender_left				= 25;
-	$absender_top				= 50;
-	
-	// Positionierung der Zieladress
-	$adress_left 				= 25;
-	$adress_top					= 55;
-	
-	// Positionierung des Rechnungskopfes
-	$rdata_left					= 25;
-	$rdata_top					= 90;
-	
-	// Positionierung der Produktdaten
-	$prod_left					= 25;
-	$prod_top					= 105;
-	
-	// Anzahl an Produkten pro Seite
-	$prod_break					= $this->get_option('wpsg_rechnungen_pdfperpage');
-	
-	$arCalculation = $this->view['basket']['arCalculation'];
-	
-	// Damit die Steuer bei der Kleinunternehmerregelung nicht angezeigt wird leer ich den Array sicherheitshalber
-	if ( ($this->get_option('wpsg_kleinunternehmer') == '1') || ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) ) unset($this->view['basket']['mwst']);
-	
-	if (!function_exists('AddRechnungPage'))
-	{
-		
-		function AddRechnungPage($shop, $pdf)
-		{
-			
-			global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top;
-			
-			$pdf->AddPage();
-
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.pdf")) {
-				
-				$pdf->setSourceFile($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.pdf");
-				$tplidx = $pdf->importPage(1, '/MediaBox');
-				$pdf->useTemplate($tplidx, 0, 0, 210);
-				
-			} else if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.jpg")) {
-				
-				$pdf->image($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.jpg", 0, 0, 210, 297, 'jpg');
-				
-			}
-
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg"))
-			{
-				
-				list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg");
-				
-				// Umrechnung von Inch zu Pixel
-				$wPix = (25.4 * (int)$width) / 96;
-				$hPix = (25.4 * (int)$height) / 96;
-				
-				$leftPos = 110 - $wPix;
-				$midPos = $wPix * 2.6 - $width / 2;
-				$rightPos = 210 - $wPix;
-				
-				$abscissa = $rightPos;
-				$ordinate = 0;
-				
-				$transparency = str_replace("%", "", $shop->get_option('wpsg_rechnungen_logo_transparency'));
-				if($transparency !== "100") $transparency = str_replace(array("0", "00"), "", $transparency);
-				
-				$alpha = 1;
-				if(!is_null($transparency) && $transparency !== "100") $alpha = "0.$transparency";
-				if(!is_null($transparency) && $transparency === "100") $alpha = $transparency;
-				
-				$logo_pos = $shop->get_option('wpsg_rechnungen_logo_position');
-				
-				if(isset($logo_pos) && $logo_pos === "left") { $abscissa = $leftPos; $ordinate = 20; }
-				if(isset($logo_pos) && $logo_pos === "center") { $abscissa = $midPos; $ordinate = 20; }
-				if(isset($logo_pos) && $logo_pos === "right") { $abscissa = $rightPos; }
-				
-				$pdf->SetAlpha($alpha);
-				$pdf->image($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg", $abscissa, $ordinate, $wPix, $hPix);
-				$pdf->SetAlpha(1);
-				
-			}
-			
-			// Absenderadresszeile (Wird in der Konfiguration hinterlegt)
-			$pdf->SetFont('Arial', '', 6);
-			$pdf->Text($absender_left, $absender_top, $shop->replaceUniversalPlatzhalter(__($shop->get_option("wpsg_rechnungen_adresszeile"), 'wpsg'), $shop->view['data']['id']??0));
-			
-			if (wpsg_getStr($shop->view['kunde']['kuerzel']) != "") $shop->view['kunde']['kuerzel'] = $shop->view['kunde']['kuerzel'].'-';
-			
-			// Adresse des Kunden
-			$pdf->SetFont('Arial', '', 12);
-			$pdf->Text($adress_left, $adress_top, $shop->view['kunde']['firma']??'');
-			$pdf->Text($adress_left, $adress_top + 5, ($shop->view['kunde']['vname']??'').' '.($shop->view['kunde']['name']??''));
-			$pdf->Text($adress_left, $adress_top + 10, ($shop->view['kunde']['strasse']??'').' '.($shop->view['kunde']['nr']??''));
-			$pdf->Text($adress_left, $adress_top + 15, ($shop->view['kunde']['plz']??'').' '.($shop->view['kunde']['ort']??''));
-
-			if ($shop->get_option("wpsg_mod_rechnungen_hideCountry") == '0') $pdf->Text($adress_left, $adress_top + 20, strtoupper($shop->view['oOrder']->getInvoiceCountryName()));
-			
-			// Rechnungsdaten
-			$pdf->SetFont('Arial', 'B', 16);
-			$pdf->Text($rdata_left, $rdata_top, __('Rechnung', 'wpsg'));
-			$pdf->SetFont('Arial', 'B', 9);
-			$pdf->Text($rdata_left, $rdata_top + 6, $shop->view['rnr']);
-			$pdf->SetFont('Arial', '', 9);
-			
-			if (isset($shop->view['faelligkeitdatum']))
-			{
-				
-				$pdf->Text($rdata_left + 35, $rdata_top, __("FÃ€llig am", "wpsg"));
-				$pdf->Text($rdata_left + 35, $rdata_top + 6, date("d.m.Y", strtotime($shop->view['faelligkeitdatum'])));
-				
-			}
-			
-			if (isset($shop->view['payment']))
-			{
-				
-				$pdf->Text($rdata_left + 58, $rdata_top, __("Zahlungsbedingungen", "wpsg"));
-				$pdf->Text($rdata_left + 58, $rdata_top + 6, $shop->view['payment']);
-				
-			}
-			
-			$pdf->Text($rdata_left + 105, $rdata_top, __("Kunden-Nr", "wpsg"));
-			$pdf->Text($rdata_left + 105, $rdata_top + 6, (($shop->view['kunde']['knr'] != '')?$shop->view['kunde']['knr']:$shop->view['kunde']['id']));
-			
-			$pdf->Text($rdata_left + 135, $rdata_top, __("Best. Nr.", "wpsg"));
-			$pdf->Text($rdata_left + 135, $rdata_top + 6, ((trim($shop->view['data']['onr']) != '')?$shop->view['data']['onr']:$shop->view['data']['id']));
-			
-			$pdf->Text($rdata_left + 155, $rdata_top, __("Datum", "wpsg"));
-			$pdf->Text($rdata_left + 155, $rdata_top + 6, date("d.m.Y", strtotime($shop->view['rDatum'])));
-			
-			if ($shop->view['oOrder']->isInnerEu())
-			{
-				
-				$pdf->SetFont('Arial', '', 9);
-				$pdf->Text($adress_left, $rdata_top + 11.5, __("Innergemeinschaftliche Lieferung.", "wpsg"));
-				
-			}
-			
-			// Benutzerdefinierte Felder
-			$arTexte = $shop->callMod('wpsg_mod_rechnungen', 'getRechnungstexte', array($shop->view['data']['id']));
-			
-			foreach ((array)$arTexte as $text)
-			{
-				
-				if (isset($text['aktiv']) && $text['aktiv'] == 1)
-				{
-					
-					$pdf->SetFont('Arial', 'B', ((intval($text['fontsize']) > 0)?intval($text['fontsize']):10));
-					$pdf->wpsg_SetTextColor($text['color']);
-					$pdf->wpsg_MultiCell($text['x'], $text['y'], 5, $text['text']);
-					$pdf->wpsg_SetTextColor("#000000");
-					
-				}
-				
-			}
-			
-		}
-		
-	}
-	
-	$pdf = new wpsg_fpdf();
-	$pdf->SetAutoPageBreak(true, 5);
-	AddRechnungPage($this, $pdf);
-
-	if ($this->get_option('wpsg_deliverycountrytax') === '1') {
-		$value = false;
-		$kl = $this->view['kunde']['land'];
-		if ( ($kl['mwst_a']) && ($kl['mwst_b']) && ($kl['mwst_c']) && ($kl['mwst_d']) == 0.0000 ) $value = true;
-		$deliverycountrytax = $value;
-	}
-
-    if ( 
-	( ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B) && ( $this->view['oOrder']->isInnerEu() || $deliverycountrytax ) ) 
-	|| 
-	( $this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS ) 
-	) $bNoTax = true;
-	else $bNoTax = false;
-
-	$bTaxCol = false;
-	if ($this->get_option('wpsg_showMwstAlways') === '1') $bTaxCol = true;
-	else if (!$bNoTax) $bTaxCol = true;
-
-	
-	if ($bNoTax) {
-
-		$discount_value = abs($this->view['basket']['arCalculation']['sum']['discount_netto']);
-		$shipping_cost = $this->view['basket']['arCalculation']['sum']['shipping_netto'];
-		$payment_cost = $this->view['basket']['arCalculation']['sum']['payment_netto'];
-
-		$taxdisplay = 'netto';
-
-	} else {
-
-		$discount_value = abs($this->view['basket']['arCalculation']['sum']['discount_brutto']);
-		$shipping_cost = $this->view['basket']['arCalculation']['sum']['shipping_brutto'];
-		$payment_cost = $this->view['basket']['arCalculation']['sum']['payment_brutto'];
-
-		$taxdisplay = 'brutto';
-
-	}
-
-	$summe = 0;
-
-	$bKopf = false; $pnr = 1; $offset = 0; $count = 0;
-	foreach ($this->view['basket']['arCalculation']['product'] as $p)
-	{
-		
-		$product = wpsg_product::getInstance($p['product_id']);
-		if (($p['product_key']??'') !== '') $product->setProductKey($p['product_key']);
-
-		if (!$bKopf)
-		{
-
-			$pdf->SetFont('Arial', 'B', 9);
-			$pdf->setXY($prod_left, $prod_top);
-			$pdf->Cell(10, 8, __("Nr.", "wpsg"), 1, 0, 'C');
-			
-			$pdf->setXY($prod_left + 10, $prod_top);
-			$pdf->Cell( (($bTaxCol)?87:102), 8, "Name", 1, 0, 'L');
-
-			if ($bTaxCol)
-			{
-				
-				$pdf->setXY($prod_left + 97, $prod_top);
-				$pdf->Cell(15, 8, __("MwSt.", "wpsg"), 1, 0, 'C');
-				
-			}
-			
-			$pdf->setXY($prod_left + 112, $prod_top);
-			$pdf->Cell(15, 8, __("Menge", "wpsg"), 1, 0, 'C');
-			
-			$pdf->setXY($prod_left + 127, $prod_top);
-			$pdf->Cell(25, 8, __("Einzelpreis", "wpsg"), 1, 0, 'R');
-			
-			$pdf->setXY($prod_left + 152, $prod_top);
-			$pdf->Cell(25, 8, __("Gesamtpreis", "wpsg"), 1, 0, 'R');
-			
-			$offset = 8;
-			$bKopf = true;
-			
-		}
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		
-		if ($this->get_option('wpsg_mod_rechnungen_anr') == '1') $pdf->Cell(10, 8, $product->getNr(), 0, 0, 'C');
-		else $pdf->Cell(10, 8, $pnr.".", 0, 0, 'C');
-		
-		if ($this->get_option('wpsg_rechnungen_pdetailname') == '1') $produkt_text = $product->getProductName(true);
-		else $produkt_text = $product->getProductName(false);
-
-		$produktBeschreibung = trim(strip_tags($product->getShortDescription()));
-		
-		if ($this->isOtherLang())
-		{
-			
-			$trans_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($this->getProduktID($p['product_id']))."' AND `lang_code` = '".wpsg_q($this->getCurrentLanguageCode())."'");
-			
-			if (is_array($trans_db) && sizeof($trans_db) > 0)
-			{
-				
-				$produkt_text = $trans_db['name'];
-				$produktBeschreibung = trim(strip_tags($trans_db['beschreibung']));
-				
-			}
-			
-		}
-		
-		$height = 0; // HÃ¶he der Zeile fÃŒr den Rahmen
-		
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		
-		// Produktvariablen
-		if ($this->hasMod('wpsg_mod_productvars') && $this->get_option("wpsg_mod_rechnungen_showpv") == "1")
-		{
-
-			$arPV = $this->callMod('wpsg_mod_productvars', 'getAllProductVarValues', array($this->view['data']['id'], $p['product_index']));
-
-			if (wpsg_isSizedArray($arPV))
-			{
-				
-				foreach ($arPV as $pv)
-				{
-					
-					$produkt_text .= "\r\n".$pv['name'].': '.$pv['value'];
-					$height += 5;
-					
-				}
-				
-			}
-			
-		}
-		
-		if ($this->get_option('wpsg_mod_rechnungen_anr') === '2')
-		{
-			
-			$anr = $this->getProductAnr($product->getProductKey());
-			$produkt_text .= "\r\n".wpsg_translate(__('Artikelnummer: #1#', 'wpsg'), $anr);
-			
-		}
-		
-		$produkt_text_cell_width = 102;
-		if ($bTaxCol) $produkt_text_cell_width = 87;
-		
-		$produkt_text_width = $pdf->GetStringWidth($produkt_text);
-		//$produkt_text_cell_width = (($this->arMwSt == "-1")?87:102);
-		
-		$height += 5 * ceil($produkt_text_width / $produkt_text_cell_width) + 3;
-		
-		$height_y = $pdf->getY();
-		$height = 2 + $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $offset + 1.5, 5, $produkt_text, 0, 'L', 0, $produkt_text_cell_width);
-		
-		//$height += 3 + 5 + $pdf->getY() - $height_y;
-		//$pdf->Cell((($this->arMwSt == "-1")?102:87), 8, $produkt_text, 0, 0, 'L');
-		 
-		if ($bTaxCol) {
-
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, (($bNoTax)?'0.00 %':wpsg_ff($this->view['basket']['arCalculation']['tax'][$p['tax_key']]['tax_value'], '%')), 0, 0, 'C');
-
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, $p['amount'], 0, 0, 'C');
-		
-		if ( ( wpsg_ShopController::get_option('wpsg_preisangaben') == WPSG_NETTO ) || $bNoTax ) $preis_single = $p['netto_calculated_single'];
-		else $preis_single =  $p['brutto_calculated_single'];
-		
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($preis_single, $this->get_option('wpsg_currency')), 0, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($preis_single * $p['amount'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		
-		/**
-		 * Produktbeschreibung anzeigen Ja/Nein
-		 */
-		$pBeschreibungHeight = 0;
-		if ($this->get_option("wpsg_rechnungen_pbeschreibung") == "1" && trim(strip_tags($product->getShortDescription())) != '')
-		{
-
-			$produktBeschreibung = nl2br($produktBeschreibung);
-			preg_match_all('/\<br \/\>/', $produktBeschreibung, $treffer);
-			$produktBeschreibung = strip_tags($produktBeschreibung);
-			
-			$pBeschreibungWidth = $pdf->getStringWidth($produktBeschreibung);
-			$pBeschreibungHeight = 5 * (ceil($pBeschreibungWidth / $produkt_text_cell_width) + @sizeof($treffer[0]));
-			
-			$pdf->SetFont('Arial', 'I', 9);
-			
-			$cellY = $pdf->getY();
-			$pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 1, 5, $produktBeschreibung, 0, 'L', 0, $produkt_text_cell_width);
-			$pBeschreibungHeight = $pdf->getY() - $cellY - $height + 1;
-			$pdf->SetFont('Arial', '', 9);
-			
-		}
-		
-		$height += $pBeschreibungHeight;
-		
-		/**
-		 * Produktattribute ?
-		 */
-		if ($this->get_option('wpsg_rechnungen_produktattribute') == '1')
-		{
-			
-			$attributeInfo = $this->callMod('wpsg_mod_produktattribute', 'getProductAttributeByProductId', array($this->getProduktId($p['product_id'])));
-			
-			foreach ($attributeInfo as $pa)
-			{
-				
-				if ($pa['value'] == "") $pa['value'] = "Keine Angabe";
-				$pa_text = $pa['name'].': '.$pa['value'];
-				$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, $pa_text, 0, 'L', 0, $produkt_text_cell_width);
-				
-			}
-		}
-		
-		/**
-		 * Variante ?
-		 */
-		if (preg_match('/pv_(.*)/', $p['product_key']))
-		{
-			
-			$variInfo = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p['product_key']));
-			
-			$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key']), 0, 'L', 0, $produkt_text_cell_width);
-			
-			//$height += 5;
-			
-		}
-		
-		if ($this->hasMod('wpsg_mod_deliverynote') && ($this->get_option('wpsg_rechnungen_deliverynote') == '1'))
-		{
-			
-			$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($this->view['data']['id']));
-			
-			if (sizeof($arDN_order) > 1)
-			{
-				
-				$deliveryTimeProduct = $this->callMod('wpsg_mod_deliverynote', 'getProductDeliveryTime', array($this->view['data']['id'], $p['product_index']));
-				
-				if ($deliveryTimeProduct !== false)
-				{
-					
-					$height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, wpsg_translate(__('Lieferdatum: #1#', 'wpsg'), date('d.m.Y', $deliveryTimeProduct)), 0, 'L', 0, $produkt_text_cell_width);
-					
-				}
-				
-			}
-			
-		}
-		
-		// Jetzt die Rahmen zeichnen
-		$pdf->Rect($prod_left, $prod_top + $offset, 10, $height);
-		
-		$pdf->Rect($prod_left + 10, $prod_top + $offset, (($bTaxCol)?87:102), $height);
-		
-		if ($bTaxCol) $pdf->Rect($prod_left + 97, $prod_top + $offset, 15, $height);
-		
-		$pdf->Rect($prod_left + 112, $prod_top + $offset, 15, $height);
-		$pdf->Rect($prod_left + 127, $prod_top + $offset, 25, $height);
-		$pdf->Rect($prod_left + 152, $prod_top + $offset, 25, $height);
-		
-		$offset += $height;
-		
-		$pnr ++;
-		$count ++;
-		
-		if ($bNoTax) $price = $p['netto'];
-		else $price = $p['brutto'];
-
-		$summe += $price * $p['amount'];
-		
-		if ($pdf->getY() > 220 || ($count >= $prod_break && sizeof($this->view['basket']['arCalculation']['product']) > ($pnr - 1)))
-		{
-			
-			AddRechnungPage($this, $pdf);
-			$bKopf = false; $offset = 0; $count = 0;
-			
-		}
-		
-	} // produkte
-	
-	if (wpsg_isSizedArray($this->view['basket']['arCalculation']['voucher'])) 
-	{
-		
-		foreach ($this->view['basket']['arCalculation']['voucher'] as $v) {
-
-			$pdf->SetFont('Arial', '', 9);
-			$pdf->setXY($prod_left, $prod_top + $offset);
-			$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-			
-			$pdf->setXY($prod_left + 10, $prod_top + $offset);
-			$pdf->Cell( (($bTaxCol)?87:102), 8, wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $v['code']), 1, 0, 'L');
-			
-			if ($bTaxCol)
-			{
-				
-				$mwst = __('anteilig', 'wpsg');
-				
-				$pdf->setXY($prod_left + 97, $prod_top + $offset);
-				$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-				
-			}
-			
-			$pdf->setXY($prod_left + 112, $prod_top + $offset);
-			$pdf->Cell(15, 8, '1', 1, 0, 'C');
-			
-			$gs_value_einzel = wpsg_ff($v[$taxdisplay.'_single'], $this->get_option('wpsg_currency'));
-			$gs_value_gesamt = wpsg_ff($v[$taxdisplay], $this->get_option('wpsg_currency'));
-
-			$pdf->setXY($prod_left + 127, $prod_top + $offset);
-			$pdf->Cell(25, 8, $gs_value_einzel, 1, 0, 'R');
-			
-			$pdf->setXY($prod_left + 152, $prod_top + $offset);
-			$pdf->Cell(25, 8, $gs_value_gesamt, 1, 0, 'R');
-			
-			$offset += 8;
-			
-		}
-		
-	}
-
-	// Versandkosten
-	if ( ($shipping_cost != '') && ($shipping_cost != 0) ) 
-	{
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-		
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		$pdf->Cell( (($bTaxCol)?87:102), 8, wpsg_translate(__('Versandkosten "#1#"', 'wpsg'), $this->view['oOrder']->getShippingLabel()), 1, 0, 'L');
-		
-		if ($bTaxCol)
-		{
-
-			// if ($this->arShipping[$this->view['data']['type_shipping']]['mwst_null'] == '1' && $bNoTax) 
-			// {
-			if ($bNoTax) 
-			{
-			
-				$mwst = wpsg_ff(0.00, '%');
-
-			} else {
-				
-				if ($this->view['basket']['arCalculation']['shipping'][0]['tax_key'] === '0') {
-				
-					$mwst = _('anteilig');
-
-				} else {
-
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['shipping'][0]['tax'], '%');
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['tax'][$this->view['basket']['arCalculation']['shipping'][0]['tax_key']]['tax_value'], '%');
-					
-				}
-				
-			}
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-			
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, '1', 1, 0, 'C');
-		
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($shipping_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($shipping_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$offset += 8;	
-		
-	}
-	
-	// Zahlungskosten
-	if ( ($payment_cost != '') && ($payment_cost != 0) )
-	{
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-		
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		$pdf->Cell( (($bTaxCol)?87:102), 8, $this->arPayment[$this->view['data']['type_payment']]['name'], 1, 0, 'L');
-		
-		if ($bTaxCol)
-		{
-			
-			// if ($this->arPayment[$this->view['data']['type_payment']]['mwst_null'] == '1' && $bNoTax)
-			// {
-			if ($bNoTax)
-			{
-
-				$mwst = wpsg_ff(0.00, '%');
-
-			} else {
-				
-				if ($this->view['basket']['arCalculation']['payment'][0]['tax_key'] === '0') {
-
-					$mwst = _('anteilig');
-
-				} else {
-
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['payment'][0]['tax'], '%');
-					$mwst = wpsg_ff($this->view['basket']['arCalculation']['tax'][$this->view['basket']['arCalculation']['payment'][0]['tax_key']]['tax_value'], '%');
-				
-				}
-				
-			}
-
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-			
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, '1', 1, 0, 'C');
-		
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($payment_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, wpsg_ff($payment_cost, $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$offset += 8;
-		
-	}
-	
-	// GebÃŒhr
-	if (wpsg_tf(wpsg_getStr($this->view['storno_fee'])) > 0)
-	{
-		
-		$pdf->SetFont('Arial', '', 9);
-		$pdf->setXY($prod_left, $prod_top + $offset);
-		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-		
-		$label = __('BearbeitungsgebÃŒhr', 'wpsg');
-		
-		if (strpos($this->view['storno_fee'], '%') !== false) $label .= ' ('.wpsg_ff($this->view['storno_fee'], '%').')';
-		
-		$pdf->setXY($prod_left + 10, $prod_top + $offset);
-		$pdf->Cell( (($bTaxCol)?87:102), 8, $label, 1, 0, 'L');
-		
-		if ($bTaxCol)
-		{
-			
-			if ($bNoTax) $mwst = wpsg_ff(0.00, '%');
-			else $mwst = wpsg_ff($this->view['storno_fee_tax_value'], '%');
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset);
-			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-			
-		}
-		
-		$pdf->setXY($prod_left + 112, $prod_top + $offset);
-		$pdf->Cell(15, 8, '1', 1, 0, 'C');
-		
-		$pdf->setXY($prod_left + 127, $prod_top + $offset);
-		$pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$pdf->setXY($prod_left + 152, $prod_top + $offset);
-		$pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-		
-		$offset += 8;
-		
-	}
-	
-	$pdf->SetFont('Arial', '', 9);
-	
-	if ($this->view['kunde']['ustidnr'] != "")
-	{
-		$offset += 10;
-		$pdf->Text($prod_left, $prod_top + $offset, __("Ihre Umsatzsteuer-Identifikationsnummer:", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, $this->view['kunde']['ustidnr'], 0, 0, 'R');
-	}
-	
-	$offset += 5; // Abstand zwischen Tabelle und Rabatt
-
-	// Rabatt
-	if ($discount_value > 0)
-	{
-
-		$offset += 5;
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("Rabatt", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, '-'.wpsg_ff($discount_value, $this->get_option('wpsg_currency')), 0, 0, 'R');
-		
-	}
-
-	$offset += 5; // Abstand zwischen Rabatt und Auswertung
-
-	if ( ($this->get_option('wpsg_kleinunternehmer') == '1') || ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) )
-	{
-		
-		$pdf->Text($prod_left, $prod_top + $offset, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("Summe", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		if ( !$bNoTax || ($arCalculation['sum']['topay_brutto'] != $arCalculation['sum']['brutto']) ) $offset += 5;
-
-	} else {
-		
-		if ($bNoTax)
-		{
-
-			$pdf->Text($prod_left, $prod_top + $offset, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __("Summe", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			$offset += 5;
-
-			if ( !(($this->view['oOrder']->isInnerEu() || $deliverycountrytax) && ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B)) ) {
-
-				if (sizeof($this->view['basket']['arCalculation']['tax']) >= 1)
-				{
-
-					$mw_count = 0;
-					foreach ($this->view['basket']['arCalculation']['tax'] as $mw)
-					{
-
-						if ( $mw['tax_value'] > 0 && $mw['sum'] > 0 ) {
-
-							$offset += 5;
-							$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. ", "wpsg").wpsg_ff($mw['tax_value'], '%'));
-							$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-							$pdf->Cell(37, 8, wpsg_ff($mw['sum'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-						
-							$mw_count++;
-
-						}
-
-					}
-					
-				}
-				
-				if ($mw_count >= 2)
-				{
-					
-					$offset += 5;
-					$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. GESAMT", "wpsg"));
-					$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-					$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'] - $this->view['basket']['arCalculation']['sum']['netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-					
-				}
-			
-			} else if ( !($arCalculation['sum']['topay_brutto'] != $arCalculation['sum']['brutto']) ) $offset -= 5; 
-
-		} else {
-
-			$pdf->Text($prod_left, $prod_top + $offset, __("Der Gesamtbetrag setzt sich wie folgt zusammen", "wpsg").':');
-			
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __("NETTOBETRAG", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			
-			if (sizeof($this->view['basket']['arCalculation']['tax']) >= 1)
-			{
-
-				$mw_count = 0;
-				foreach ($this->view['basket']['arCalculation']['tax'] as $mw)
-				{
-
-					if ( $mw['tax_value'] > 0 && $mw['sum'] > 0) {
-
-						$offset += 5;
-						$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. ", "wpsg").wpsg_ff($mw['tax_value'], '%'));
-						$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-						$pdf->Cell(37, 8, wpsg_ff($mw['sum'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-					
-						$mw_count++;
-
-					}
-
-				}
-				
-			}
-			
-			if ($mw_count >= 2)
-			{
-				
-				$offset += 5;
-				$pdf->Text($prod_left + 80, $prod_top + $offset, __("MwSt. GESAMT", "wpsg"));
-				$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-				$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'] - $this->view['basket']['arCalculation']['sum']['netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-				
-			}
-			
-		}
-		
-	}
-
-	// Wertgutschein
-	if ( $arCalculation['sum']['topay_brutto'] != $arCalculation['sum']['brutto'] ) {
-
-		if (!$bNoTax) {
-		
-			$offset += 5;
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __("SUMME", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			
-			$pdf->setFont('Arial', '', '9');
-			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['arCalculation']['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			$pdf->setFont('Arial', '', '9');
-		
-		} else if (!($mw_count >= 2)) $offset -= 5;
-
-		foreach ($arCalculation['coupon'] as $c) {
-			
-			$offset += 5;
-			$pdf->Text($prod_left + 80, $prod_top + $offset, __('Wertgutschein', 'wpsg').' '.((wpsg_isSizedString($c['code']))?'('.$c['code'].')':''));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-			
-			$pdf->setFont('Arial', '', '9');
-			$pdf->Cell(37, 8, wpsg_ff($c[$taxdisplay], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			$pdf->setFont('Arial', '', '9');
-			
-		}
-		
-		$offset += 5;
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("ZU ZAHLEN", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		
-		/* Endbetrag wird fett ausgegeben */
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-		
-	} else {
-	
-		$offset += 5;
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("GESAMTSUMME", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-
-		/* Endbetrag wird fett ausgegeben */
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-				
-	}
-	
-	if (($this->get_option('wpsg_kleinunternehmer') == '1') || ($this->view['oCalculationOrder']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS) )
-	{
-
-		$offset += 3;
-		$pdf->setFont('Arial', '', '8');
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, '('.$this->get_option('wpsg_kleinunternehmer_text').')');
-		$offset += 8;
-		
-	}
-
-	$offset += 5;
-	
-	if ($this->hasMod('wpsg_mod_deliverynote') && ($this->get_option('wpsg_rechnungen_deliverynote') == '1'))
-	{
-		
-		$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($this->view['data']['id']));
-		$delivery_date = $this->callMod('wpsg_mod_deliverynote', 'getDeliveryTime', array($this->view['data']['id']));
-
-		// Wenn es ein Gesamtlieferdatum gibt und nur einen Lieferschein, dann unter der Bestellung anzeigen
-		if ($delivery_date !== false && sizeof($arDN_order) == 1)
-		{
-			
-			$pdf->setFont('Arial', 'B', '9');
-			$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, __('Lieferung:', 'wpsg'));
-			$pdf->setFont('Arial', '', '9');
-			$pdf->wpsg_MultiCell($prod_left + 16, $prod_top + $offset, 5, wpsg_translate(__('#1#', 'wpsg'), date('d.m.Y', $delivery_date)));
-			$offset += 8;
-			
-		}
-		
-	}
-	
-	if ($this->view['fussText'] != "")
-	{
-		
-		$pdf->setFont('Arial', '', '9');	
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, $this->view['fussText']);
-		$offset += 8;
-		
-	}
-	
-	$offset += 10;
-
-	$shipping_adress = false;
-	if ($this->hasMod('wpsg_mod_shippingadress') && $this->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array('k_id' => $this->view['data']['k_id'], 'o_id' => $this->view['data']['id']))) {
-		
-		$pdf->setFont('Arial', 'B', 9);
-		$pdf->Text($prod_left, $prod_top + $offset, __("Lieferanschrift", "wpsg").":");
-		$offset += 2;
-		
-		$pdf->setFont('Arial', '', 9);
-		
-			$shipping_adress = "";
-			if ($this->view['data']['shipping_firma'] != "")
-			{
-				$shipping_adress .= $this->view['data']['shipping_firma']."\r\n";
-			}
-			$shipping_adress .= $this->view['data']['shipping_vname'].' '.$this->view['data']['shipping_name']."\r\n";
-			$shipping_adress .= $this->view['data']['shipping_strasse'].' '.$this->view['data']['shipping_nr']."\r\n";
-			// $shipping_adress .= $this->view['data']['shipping_land']['kuerzel'].'-';
-			
-			$shipping_adress .= $this->view['data']['shipping_plz'].' '.$this->view['data']['shipping_ort']."\r\n";
-			$shipping_adress .= $this->view['data']['shipping_land']['name'];	
-		
-		$start = $pdf->getY();
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, $shipping_adress, 0, 'L', 0, 100);
-		$offset += $pdf->getY() - $start;
-		
-		$shipping_adress = true;
-		
-	}
-	
-	// Bestellvariablen
-	if ($this->hasMod('wpsg_mod_ordervars') && $this->get_option('wpsg_mod_rechnungen_showov') == '1')
-	{
-
-		$pdf->SetFont('Arial', 'B', 9);
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset - 7, 5, __("Angaben wÃ€hrend der Bestellung", "wpsg").":");
-		
-		$pdf->SetFont('Arial', '', 9);
-
-			$bvars = @unserialize($this->view['data']['bvars']);
-			if (!is_array($bvars)) $bvars = array();
-			
-			$strBVars = "";
-			foreach ($bvars as $bvars_id => $bvars_value)
-			{
-				
-				$bvars = $this->db->fetchRow("SELECT * FROM `".wpsg_q(WPSG_TBL_ORDERVARS)."` WHERE `id` = '".wpsg_q($bvars_id)."' ORDER BY `pos` ASC, `id` ASC ");
-				
-				if ($bvars['typ'] == "1") // Auswahl
-				{
-					if ($bvars_value <= 0) $bvars_value = __("Keine Angabe", "wpsg");
-				}
-				else if ($bvars['typ'] == "2") // Texteingabe
-				{
-					if (trim($bvars_value) == "") $bvars_value = __("Keine Angabe", "wpsg");
-				}
-				else if ($bvars['typ'] == "3") // Checkbox
-				{
-					if ($bvars_value <= 0) $bvars_value = __("Keine Angabe", "wpsg");
-				}
-				
-				$bvars_name = $this->callMod('wpsg_mod_ordervars', 'getNameById', array($bvars_id));
-				$strBVars .= "\r\n".$bvars_name.": ".$bvars_value;
-				
-			}
-		
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset - 6, 5, $strBVars);
-
-	}
-	
-	$this->callMods('wpsg_mod_rechnungen_pdf', array(&$pdf, &$this->view['data']['id'], &$this->view['preview'], &$this->view['invoice']));
-	
-	$filename = $this->view['filename'].".pdf";
-	
-	if (ob_get_contents()) ob_end_clean();
-	
-	if ($this->view['preview']) {
-		
-		$pdf->Output($filename, 'I');
-		
-	} else {
-		
-		if (($this->view['rebuild']??false) === false) $pdf->Output($oInvoice->getFilePath(true), 'F');
-		
-		// Hier wird der Dateiname an FPD ÃŒbergeben. Er soll sich aus der Rechnungsnummer ergeben, auch wenn das Dokument ÃŒber die ID gespeichert ist.
-		// if ($this->view['output'] === true) $pdf->Output($this->view['filename_out'], 'I');
-		
-		if ($this->view['output'] === true) {
-			
-			header('Content-Disposition: inline; filename="'.basename($this->view['filename_out']).'"');
-			header("Cache-Control: no-cache, must-revalidate");
-			header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
-			header('Content-type: application/pdf');
-			
-			readfile($oInvoice->getFilePath());
-			
-		}
-		
-	}
-
Index: ews/mods/mod_rechnungen/invoicemail.phtml
===================================================================
--- /views/mods/mod_rechnungen/invoicemail.phtml	(revision 8528)
+++ 	(revision )
@@ -1,23 +1,0 @@
-<?php 
-
-	/**
-	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann
-	 */
-
-	//wpsg_debug($this->view);
-
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-    /** @var wpsg_order $oOrder */
-    $oOrder = $this->view['oOrder'];
-    
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), $oOrder->getInvoiceTitle(), $oOrder->getInvoiceFirstName(), $oOrder->getInvoiceName()); ?>
- 
-		
-<?php echo __("Sie erhalten hiermit die Rechnung in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($oOrder->getToPay(wpsg_ShopController::getShop()->getFrontendTaxview()), $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo $oOrder->getNr(); ?>.
-<?php $this->callMods('wpsg_mod_rechnungen_mail'); ?>
- 
-<?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?>
- 
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: ews/mods/mod_rechnungen/invoicemail_html.phtml
===================================================================
--- /views/mods/mod_rechnungen/invoicemail_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,22 +1,0 @@
-<?php 
-
-	/**
-	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann (HTML)
-	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
-	/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
-	$this->htmlMail = true;
-
-	//wpsg_debug($this->view);
-
-?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
-		
-<p><?php echo __("Sie erhalten hiermit die Rechnung in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.</p>
-
-<?php $this->callMods('wpsg_mod_rechnungen_mail'); ?>
- 
-<p><?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?></p>
- 
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: ews/mods/mod_rechnungen/multi_invoice_pdf.phtml
===================================================================
--- /views/mods/mod_rechnungen/multi_invoice_pdf.phtml	(revision 8528)
+++ 	(revision )
@@ -1,1060 +1,0 @@
-<?php
-	
-	/**
-	 * Template fÃŒr die PDF Rechnung
-	 */
-	
-	require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-	require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
-	 
-	require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
-	
-	global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top, $rhead_left, $rhead_top, $sum_multi_offset, $pdf, $data;
-	 
-	// Positionierung der Absenderadresszeile
-	$absender_left				= 25;
-	$absender_top				= 50;
-	
-	// Positionierung der Zieladress
-	$adress_left 				= 25;
-	$adress_top					= 55;
-	
-	// Positionierung des Rechnungskopfes
-	$rdata_left					= 25;
-	$rdata_top					= 90;
-
-    // Positionierung des Teilrechnungskopfes
-    $rhead_left					= 25;
-	$rhead_top					= 110;
-	
-	// Positionierung der Produktdaten
-	$prod_left					= 25;
-	$prod_top					= 120;
-	
-	// Anzahl an Produkten pro Seite
-	$prod_break					= $this->get_option('wpsg_rechnungen_pdfperpage');
-
-    // Unterkante nutzbarer Bereich (297 - Margin)
-    $PAGE_LIMIT_MM = 290;
-    // bestehender Abstand nach einer Bestellung
-    $ORDER_SPACING  = 30;
-
-
-/*
-$arCalculation = $this->view['basket']['arCalculation'];
-$data = $this->view['multi_data']['orders'][0]['data'];
-$sum = $this->view['multi_data']['orders'][0]['sum'];
-*/
-
-    $arCalculation = array_values($this->view['multi_data']['order_data'])[0]['arCalculation'];
-    $data = $this->view['data'];
-    $sum = $arCalculation['sum'];
-
-	if ($this->getFrontendTaxView() === WPSG_NETTO) $taxdisplay = 'netto';
-	else $taxdisplay = 'brutto';
-	
-	if (!function_exists('AddRechnungPage')) {
-		
-		function AddRechnungPage($shop, $pdf) {
-
-			global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top, $offset, $sum_multi_offset, $data;
-			
-			$pdf->AddPage();
-            $sum_multi_offset = 0;
-			
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.pdf")) {
-				
-				$pdf->setSourceFile($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.pdf");
-				$tplidx = $pdf->importPage(1, '/MediaBox');
-				$pdf->useTemplate($tplidx, 0, 0, 210);
-				
-			} else if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.jpg")) {
-				
-				$pdf->image($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_bp.jpg", 0, 0, 210, 297, 'jpg');
-				
-			}
-			
-			
-			if (file_exists($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg"))
-			{
-				
-				list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg");
-				
-				// Umrechnung von Inch zu Pixel
-				$wPix = (25.4 * (int)$width) / 96;
-				$hPix = (25.4 * (int)$height) / 96;
-				
-				$leftPos = 110 - $wPix;
-				$midPos = $wPix * 2.6 - $width / 2;
-				$rightPos = 210 - $wPix;
-				
-				$abscissa = $rightPos;
-				$ordinate = 0;
-				
-				$transparency = str_replace("%", "", $shop->get_option('wpsg_rechnungen_logo_transparency'));
-				if($transparency !== "100") $transparency = str_replace(array("0", "00"), "", $transparency);
-				
-				$alpha = 1;
-				if(!is_null($transparency) && $transparency !== "100") $alpha = "0.$transparency";
-				if(!is_null($transparency) && $transparency === "100") $alpha = $transparency;
-				
-				$logo_pos = $shop->get_option('wpsg_rechnungen_logo_position');
-				
-				if(isset($logo_pos) && $logo_pos === "left") { $abscissa = $leftPos; $ordinate = 20; }
-				if(isset($logo_pos) && $logo_pos === "center") { $abscissa = $midPos; $ordinate = 20; }
-				if(isset($logo_pos) && $logo_pos === "right") { $abscissa = $rightPos; }
-				
-				$pdf->SetAlpha($alpha);
-				$pdf->image($shop->callMod('wpsg_mod_rechnungen', 'getPaperPath', array())."wpsg_rechnungen_logo.jpg", $abscissa, $ordinate, $wPix, $hPix);
-				$pdf->SetAlpha(1);
-				
-			}
-
-            // Absenderadresszeile (Wird in der Konfiguration hinterlegt)
-			$pdf->SetFont('Arial', '', 6);
-			$pdf->Text($absender_left, $absender_top, $shop->replaceUniversalPlatzhalter(__($shop->get_option("wpsg_rechnungen_adresszeile"), 'wpsg'), $data['id']));
-			
-			if (wpsg_getStr($shop->view['kunde']['kuerzel']) != "") $shop->view['kunde']['kuerzel'] = $shop->view['kunde']['kuerzel'].'-';
-			
-			// Adresse des Kunden
-			$pdf->SetFont('Arial', '', 12);
-			$pdf->Text($adress_left, $adress_top, $shop->view['kunde']['firma']);
-			$pdf->Text($adress_left, $adress_top + 5, $shop->view['kunde']['vname'].' '.$shop->view['kunde']['name']);
-			$pdf->Text($adress_left, $adress_top + 10, $shop->view['kunde']['strasse'].' '.wpsg_getStr($shop->view['kunde']['nr']));
-			$pdf->Text($adress_left, $adress_top + 15, $shop->view['kunde']['plz'].' '.$shop->view['kunde']['ort']);
-			if ($shop->get_option("wpsg_mod_rechnungen_hideCountry") == '0') {
-				$pdf->Text($adress_left, $adress_top + 20, strtoupper($shop->view['oOrder']->getInvoiceCountryName()));
-            }
-            
-			// Rechnungsdaten
-			$pdf->SetFont('Arial', 'B', 16);
-			$pdf->Text($rdata_left, $rdata_top, __('Rechnung', 'wpsg'));
-			$pdf->SetFont('Arial', 'B', 9);
-			$pdf->Text($rdata_left, $rdata_top + 6, $shop->view['rnr']);
-			$pdf->SetFont('Arial', '', 9);
-			
-            // FÃ€lligkeitsdatum
-			if (isset($shop->view['faelligkeitdatum']))
-			{
-				
-				$pdf->Text($rdata_left + 35, $rdata_top, __("FÃ€llig am", "wpsg"));
-				$pdf->Text($rdata_left + 35, $rdata_top + 6, $shop->view['faelligkeitdatum']);
-				
-			}
-
-            // Kunden-Nr
-			$pdf->Text($rdata_left + 55, $rdata_top, __("Kunden-Nr", "wpsg"));
-			$pdf->Text($rdata_left + 55, $rdata_top + 6, (($shop->view['kunde']['knr'] != '')?$shop->view['kunde']['knr']:$shop->view['kunde']['id']));
-
-            // Datum
-            $pdf->Text($rdata_left + 75, $rdata_top, __("Rechnungsdatum", "wpsg"));
-			$pdf->Text($rdata_left + 75, $rdata_top + 6, $shop->view['rDatum']);
-
-            // InnerEu Hinweistext
-            if ($shop->view['oOrder']->isInnerEu()) {
-				
-				$pdf->SetFont('Arial', '', 9);
-				$pdf->Text($adress_left, $rdata_top + 11.5, __("Innergemeinschaftliche Lieferung.", "wpsg"));
-				
-                $offset += 11.5;
-
-			}
-
-            // Benutzerdefinierte Felder
-			$arTexte = $shop->callMod('wpsg_mod_rechnungen', 'getRechnungstexte', array($data['id']));
-			
-			foreach ((array)$arTexte as $text)
-			{
-				
-				if (isset($text['aktiv']) && $text['aktiv'] == 1)
-				{
-					
-					$pdf->SetFont('Arial', 'B', ((intval($text['fontsize']) > 0)?intval($text['fontsize']):10));
-					$pdf->wpsg_SetTextColor($text['color']);
-					$pdf->wpsg_MultiCell($text['x'], $text['y'], 5, $text['text']);
-					$pdf->wpsg_SetTextColor("#000000");
-					
-				}
-				
-			}	
-			
-		}
-		
-	}
-
-    $pdf = new wpsg_fpdf();
-    $pdf->SetAutoPageBreak(false, 5);
-    AddRechnungPage($this, $pdf);
-
-	$checkPageBreak = function($shop, $offset, $lines) use ($pdf, $prod_top) {
-		
-		if ($prod_top + $offset + ($lines * 5) > 290) {
-		
-			AddRechnungPage($this, $pdf);
-		
-			return 0;
-
-		} else return $offset;
-		
-	};
-	
-    $rhead_count = 1;
-    $sum_multi_offset = 0;
-    // $orders = $this->view['multi_data']['orders'];
-
-	// noMwSt
-    $head_data = array_values($this->view['multi_data']['order_data'])[0];
-    if ( ($head_data['oCalculation']->getTaxMode() === \wpsg\wpsg_calculation::TAXMODE_B2B) && ($head_data['oOrder']->isInnerEu()) ) {
-        $bNoTax = true;
-    } else {
-	    $bNoTax = false;
-    }
-	
-	$bTaxCol = false;
-	if ($this->get_option('wpsg_showMwstAlways') === '1') $bTaxCol = true;
-	else {
-		
-		foreach ($this->view['multi_data']['order_data'] as $order_data) {
-		
-			if (sizeof($order_data['arCalculation']['tax']) > 1) { $bTaxCol = true; break; }
-			
-		}	
-		
-	}
-
-    // Hoehe einer kompletten Bestellung abschaetzen
-    $estimateOrderBlockHeight = function($shop, $pdf, $oOrder, $arCalculation, $bTaxCol) use ($ORDER_SPACING) {
-
-        // Spaltenbreite fÃŒr den Produkttext wie im Rendering
-        $produkt_text_cell_width = $bTaxCol ? 87 : 102;
-
-        // HÃ¶he: Kopf der Bestellung (ZÃ€hler + 3 Meta-Zeilen rechts)
-        // â1 Bestellungâ, Bestelldatum, Zahlungsbedingungen, Best. Nr.
-        $h = 12;        // Kopf
-        $h += 8;        // Tabellenkopf (Nr/Name/MwSt/Menge/Einzelpreis/Gesamtpreis)
-
-        foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-            $product_id = $oOrderProduct->getProductId();
-
-            // Produktname/Detailname wie im Code
-            $produkt_text = ($shop->get_option('wpsg_rechnungen_pdetailname') == '1')
-                ? $shop->getProductName($product_id, true)
-                : $shop->getProductName($product_id, false);
-
-            // Ãbersetzung
-            if ($shop->isOtherLang()) {
-                $trans_db = $shop->db->fetchRow(
-                    "SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_id)."' AND `lang_code` = '".wpsg_q($shop->getCurrentLanguageCode())."'"
-                );
-                if (is_array($trans_db) && sizeof($trans_db) > 0) {
-                    $produkt_text = $trans_db['name'];
-                }
-            }
-
-            // Artikelnummer zusÃ€tzlich?
-            if ($shop->get_option('wpsg_mod_rechnungen_anr') === '2') {
-                $anr = $shop->getProductAnr($oOrderProduct->getProductKey());
-                $produkt_text .= "\n".wpsg_translate(__('Artikelnummer: #1#', 'wpsg'), $anr);
-            }
-
-            // Produktvariablen optional anhÃ€ngen (wir rechnen ZeilenhÃ¶he mit)
-            if ($shop->hasMod('wpsg_mod_productvars') && $shop->get_option("wpsg_mod_rechnungen_showpv") == "1") {
-                $arPV = $shop->callMod('wpsg_mod_productvars', 'getAllProductVarValues', array($oOrder->getId(), $oOrderProduct->getProductIndex()));
-                if (wpsg_isSizedArray($arPV)) {
-                    foreach ($arPV as $pv) {
-                        if ($pv['value'] != '') {
-                            $produkt_text .= "\n".$pv['name'].': '.$pv['value'];
-                        }
-                    }
-                }
-            }
-
-            // Name/Text-Zeilen (MultiCell-SchÃ€tzung)
-            $txt    = str_replace(["\r\n", "\r"], "\n", (string)$produkt_text);
-            $manual = substr_count($txt, "\n") + 1;
-            $wrap   = max(1, (int)ceil($pdf->GetStringWidth(str_replace("\n", ' ', $txt)) / $produkt_text_cell_width));
-            $name_lines = max($manual, $wrap);
-
-            $rowH = 5 * $name_lines + 3;
-
-            // Kurzbeschreibung?
-            if ($shop->get_option("wpsg_rechnungen_pbeschreibung") == "1") {
-                $desc = trim(strip_tags($oOrderProduct->getProduct()->getShortDescription()));
-                if ($shop->isOtherLang() && isset($trans_db['beschreibung'])) {
-                    $desc = trim(strip_tags($trans_db['beschreibung']));
-                }
-                if ($desc !== '') {
-                    $descW = $pdf->GetStringWidth($desc);
-                    $rowH += 5 * max(1, (int)ceil($descW / $produkt_text_cell_width));
-                }
-            }
-
-            // Attribute?
-            if ($shop->get_option('wpsg_rechnungen_produktattribute') == '1') {
-                $attributeInfo = $shop->callMod('wpsg_mod_produktattribute', 'getProductAttributeByProductId', array($shop->getProduktId($oOrderProduct->getId())));
-                if (is_array($attributeInfo)) {
-                    foreach ($attributeInfo as $pa) {
-                        $pa_txt = $pa['name'].': '.$pa['value'];
-                        $paW = $pdf->GetStringWidth($pa_txt);
-                        $rowH += 5 * max(1, (int)ceil($paW / $produkt_text_cell_width));
-                    }
-                }
-            }
-
-            // Variante?
-            if (preg_match('/pv_(.*)/', $oOrderProduct->getProductKey())) {
-                $variInfo = $shop->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($oOrderProduct->getProductKey()));
-                $vtxt = wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key']);
-                $vW = $pdf->GetStringWidth($vtxt);
-                $rowH += 5 * max(1, (int)ceil($vW / $produkt_text_cell_width));
-            }
-
-            // Lieferdatum (bei mehreren Lieferscheinen)
-            if ($shop->hasMod('wpsg_mod_deliverynote')) {
-                $arDN_order = $shop->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($oOrder->getId()));
-                if (sizeof($arDN_order) > 1) {
-                    // eine Zeile
-                    $rowH += 5;
-                }
-            }
-
-            $h += $rowH;
-        }
-
-        // Gutschein(e)
-        if (!empty($arCalculation['voucher']) && is_array($arCalculation['voucher'])) {
-            $h += 8 * count($arCalculation['voucher']);
-        }
-
-        // Versandkosten
-        if (!empty($arCalculation['sum']['shipping_brutto']) && $arCalculation['sum']['shipping_brutto'] > 0) {
-            $h += 8;
-        }
-
-        // Zahlungskosten
-        $cost_payment = ((wpsg_ShopController::getShop()->getFrontendTaxview() === WPSG_BRUTTO)
-                        ? ($arCalculation['sum']['payment_brutto'] ?? 0)
-                        : ($arCalculation['sum']['payment_netto'] ?? 0));
-        if ($cost_payment > 0) { $h += 8; }
-
-        // Rabatt
-        if (!empty($arCalculation['sum']['discount_brutto']) && $arCalculation['sum']['discount_brutto'] < 0) {
-            $h += 8;
-        }
-
-        // Wertgutscheine (coupon)
-        if (!empty($arCalculation['coupon']) && is_array($arCalculation['coupon'])) {
-            $h += 8 * count($arCalculation['coupon']);
-        }
-
-        // âBestellbetrag âŠâ Block (Text + Zahl)
-        $h += 10;
-
-        // Abstand zur nÃ€chsten Bestellung
-        $h +=  $ORDER_SPACING?(int)$ORDER_SPACING:30;
-
-        return $h;
-    };
-
-    // FOREACH ORDER START
-    foreach ($this->view['multi_data']['order_data'] as $order_data) {
-
-		/** @var wpsg_order $oOrder */
-		$oOrder = $order_data['oOrder'];
-		
-		/** @var \wpsg\wpsg_calculation $arCalculation */
-		$arCalculation = $order_data['arCalculation'];
-
-        $currentTop = $prod_top + $sum_multi_offset;
-        $need = $estimateOrderBlockHeight($this, $pdf, $oOrder, $arCalculation, $bTaxCol);
-
-        if (($currentTop + $need) > $PAGE_LIMIT_MM) {
-            AddRechnungPage($this, $pdf);
-            $sum_multi_offset = 0;           // Bestellung startet oben auf der neuen Seite
-            $currentTop = $prod_top;         // (nur zur VollstÃ€ndigkeit)
-        }
-
-        // Sammelrechnung ZÃ€hler
-        $pdf->SetFont('Arial', 'B', 12);
-        $pdf->Text($rhead_left, $rhead_top + $sum_multi_offset, $rhead_count);
-        $pdf->Text($rhead_left + 6, $rhead_top + $sum_multi_offset, __("Bestellung", "wpsg"));
-        $rhead_count++;
-        $pdf->SetFont('Arial', '', 9);
-
-        // Bestelltag anzeigen
-        $pdf->Text($rhead_left + 85, $rhead_top + $sum_multi_offset, __("Bestelldatum", "wpsg"));
-        $pdf->Text($rhead_left + 85, $rhead_top + $sum_multi_offset + 6, date("d.m.Y", strtotime($oOrder->cdate)));
-
-        // Zahlungsbedingung anzeigen
-        $pdf->Text($rhead_left + 115, $rhead_top + $sum_multi_offset, __("Zahlungsbedingungen", "wpsg"));
-        $pdf->Text($rhead_left + 115, $rhead_top + $sum_multi_offset + 6, $oOrder->getPaymentLabel());
-         
-        // Bestellnummer anzeigen
-        $pdf->Text($rhead_left + 155, $rhead_top + $sum_multi_offset, __("Best. Nr.", "wpsg"));
-        $pdf->Text($rhead_left + 155, $rhead_top + $sum_multi_offset + 6, $oOrder->getNr());
-
-        $bKopf = false; $pnr = 1; $offset = 0; $count = 0; 
-        
-        foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-
-			$product_id = $oOrderProduct->getProductId();
-						
-            if (!$bKopf) {
-                
-                $pdf->SetFont('Arial', 'B', 9);
-                $pdf->setXY($prod_left, $prod_top + $sum_multi_offset);
-                $pdf->Cell(10, 8, __("Nr.", "wpsg"), 1, 0, 'C');
-                
-                $pdf->setXY($prod_left + 10, $prod_top + $sum_multi_offset);
-				
-				$pdf->Cell((($bTaxCol)?87:102), 8, "Name", 1, 0, 'L');
-                
-                if ($bTaxCol) {
-                    
-                    $pdf->setXY($prod_left + 97, $prod_top + $sum_multi_offset);
-                    $pdf->Cell(15, 8, __("MwSt.", "wpsg"), 1, 0, 'C');
-                    
-                }
-                
-                $pdf->setXY($prod_left + 112, $prod_top + $sum_multi_offset);
-                $pdf->Cell(15, 8, __("Menge", "wpsg"), 1, 0, 'C');
-                
-                $pdf->setXY($prod_left + 127, $prod_top + $sum_multi_offset);
-                $pdf->Cell(25, 8, __("Einzelpreis", "wpsg"), 1, 0, 'R');
-                
-                $pdf->setXY($prod_left + 152, $prod_top + $sum_multi_offset);
-                $pdf->Cell(25, 8, __("Gesamtpreis", "wpsg"), 1, 0, 'R');
-                
-                $offset = 8;
-                $bKopf = true;
-                
-            }
-            
-            $pdf->SetFont('Arial', '', 9);
-            $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-            
-            if ($this->get_option('wpsg_mod_rechnungen_anr') == '1') {
-                
-                $pdf->Cell(10, 8,  $oOrderProduct->getProduct()->getNr(), 0, 0, 'C');
-                
-            } else {
-                
-                $pdf->Cell(10, 8, $pnr.".", 0, 0, 'C');
-                
-            }
-            
-            if ($this->get_option('wpsg_rechnungen_pdetailname') == '1') {
-
-                $produkt_text = $this->getProductName($product_id, true);
-
-            } else {
-                
-                $produkt_text = $this->getProductName($product_id, false);
-
-            }
-            
-            $produktBeschreibung = trim(strip_tags($oOrderProduct->getProduct()->getShortDescription()));
-            
-            if ($this->isOtherLang()) {
-                
-                $trans_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($product_id)."' AND `lang_code` = '".wpsg_q($this->getCurrentLanguageCode())."'");
-                
-                if (is_array($trans_db) && sizeof($trans_db) > 0) {
-                    
-                    $produkt_text = $trans_db['name'];
-                    $produktBeschreibung = trim(strip_tags($trans_db['beschreibung']));
-                    
-                }
-                
-            }
-            
-            $height = 0; // HÃ¶he der Zeile fÃŒr den Rahmen
-            
-            $pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-            
-            // Produktvariablen 
-            if ($this->hasMod('wpsg_mod_productvars') && $this->get_option("wpsg_mod_rechnungen_showpv") == "1") {
-                
-                $arPV = $this->callMod('wpsg_mod_productvars', 'getAllProductVarValues', array($oOrder->getId(), $oOrderProduct->getProductIndex()));
-                
-                if (wpsg_isSizedArray($arPV)) {
-                    
-                    foreach ($arPV as $pv) {
-                        
-                        if ($pv['value'] != '') {
-
-                            $produkt_text .= "\r\n".$pv['name'].': '.$pv['value'];
-                            $height += 5;
-                        
-                        }
-
-                    }
-                    
-                }
-                
-            }
-            
-            if ($this->get_option('wpsg_mod_rechnungen_anr') === '2') {
-                
-                $anr = $this->getProductAnr($oOrderProduct->getProductKey());
-                $produkt_text .= "\r\n".wpsg_translate(__('Artikelnummer: #1#', 'wpsg'), $anr);
-                
-            }
-            			
-            if ($bTaxCol) $produkt_text_cell_width = 87;
-			else $produkt_text_cell_width = 102;
-            
-            $produkt_text_width = $pdf->GetStringWidth($produkt_text);
-            
-            $height += 5 * ceil($produkt_text_width / $produkt_text_cell_width) + 3;
-            
-            $height_y = $pdf->getY();
-            $height = 2 + $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $offset + 1.5 + $sum_multi_offset, 5, $produkt_text, 0, 'L', 0, $produkt_text_cell_width);
-             
-            if ($bTaxCol) {
-	            
-				$pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(15, 8, (($bNoTax)?'0.00 %':wpsg_ff($arCalculation['tax'][$oOrderProduct->getTaxKey().'_'.$oOrder->getInvoiceCountry()->getId()]['tax_value'], '%')), 0, 0, 'C');
-                
-            }
-            
-            $pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, $oOrderProduct->getAmount(), 0, 0, 'C');
-            
-            $preis = $oOrderProduct->getPrice(wpsg_ShopController::getShop()->getFrontendTaxview());
-            
-            $pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($preis, $this->get_option('wpsg_currency')), 0, 0, 'R');
-            
-            $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($oOrderProduct->getPriceSum(wpsg_ShopController::getShop()->getFrontendTaxview()), $this->get_option('wpsg_currency')), 0, 0, 'R');
-            
-            /**
-             * Produktbeschreibung anzeigen Ja/Nein
-             */
-            $pBeschreibungHeight = 0;
-            if ($this->get_option("wpsg_rechnungen_pbeschreibung") == "1" && trim(strip_tags($oOrderProduct->getProduct()->getShortDescription())) != '') {
-                
-                $produktBeschreibung = nl2br($produktBeschreibung);
-                preg_match_all('/\<br \/\>/', $produktBeschreibung, $treffer);
-                $produktBeschreibung = strip_tags($produktBeschreibung);
-                
-                $pBeschreibungWidth = $pdf->getStringWidth($produktBeschreibung);
-                $pBeschreibungHeight = 5 * (ceil($pBeschreibungWidth / $produkt_text_cell_width) + @sizeof($treffer[0]));
-                
-                $pdf->SetFont('Arial', 'I', 9);
-                
-                $cellY = $pdf->getY();
-                $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 1 + $sum_multi_offset, 5, $produktBeschreibung, 0, 'L', 0, $produkt_text_cell_width);
-                $pBeschreibungHeight = $pdf->getY() - $cellY - $height + 1;
-                $pdf->SetFont('Arial', '', 9);
-                
-            }
-            
-            $height += $pBeschreibungHeight;
-            
-            /**
-             * Produktattribute ?
-             */
-            if ($this->get_option('wpsg_rechnungen_produktattribute') == '1') {
-                
-                $attributeInfo = $this->callMod('wpsg_mod_produktattribute', 'getProductAttributeByProductId', array($this->getProduktId($oOrderProduct->getId())));
-                
-                foreach ($attributeInfo as $pa) {
-                    
-                    $pa_text = $pa['name'].': '.$pa['value'];
-                    $height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5 + $sum_multi_offset, 5, $pa_text, 0, 'L', 0, $produkt_text_cell_width);
-                    
-                }
-            }
-            
-            /**
-             * Variante ?
-             */
-            if (preg_match('/pv_(.*)/', $oOrderProduct->getProductKey())) {
-                
-                $variInfo = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($oOrderProduct->getProductKey()));
-                
-                $height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5 + $sum_multi_offset, 5, wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key']), 0, 'L', 0, $produkt_text_cell_width);
-                
-                //$height += 5;
-                
-            }
-            
-            /**
-             * Lieferschein ?
-             */ 
-            if ($this->hasMod('wpsg_mod_deliverynote')) {
-                
-                $arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($oOrder->getId()));
-                
-                if (sizeof($arDN_order) > 1) {
-                    
-                    $deliveryTimeProduct = $this->callMod('wpsg_mod_deliverynote', 'getProductDeliveryTime', array($oOrder->getId(), $oOrderProduct->getProductIndex()));
-                    
-                    if ($deliveryTimeProduct !== false) {
-                        
-                        $height += $pdf->wpsg_MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5 + $sum_multi_offset, 5, wpsg_translate(__('Lieferdatum: #1#', 'wpsg'), date('d.m.Y', $deliveryTimeProduct)), 0, 'L', 0, $produkt_text_cell_width);
-                        
-                    }
-                    
-                }
-                
-            }
-            
-            // Jetzt die Rahmen zeichnen
-            $pdf->Rect($prod_left, $prod_top + $offset + $sum_multi_offset, 10, $height);
-            
-            $pdf->Rect($prod_left + 10, $prod_top + $offset + $sum_multi_offset, (($bTaxCol == '1')?87:102), $height);
-            
-            if ($bTaxCol) {
-                
-                $pdf->Rect($prod_left + 97, $prod_top + $offset + $sum_multi_offset, 15, $height);
-                
-            }
-            
-            $pdf->Rect($prod_left + 112, $prod_top + $offset + $sum_multi_offset, 15, $height);
-            $pdf->Rect($prod_left + 127, $prod_top + $offset + $sum_multi_offset, 25, $height);
-            $pdf->Rect($prod_left + 152, $prod_top + $offset + $sum_multi_offset, 25, $height);
-            
-            $offset += $height;
-            
-            $pnr ++;
-            $count ++;
-
-            if ($pdf->getY() > 220 || ($count >= $prod_break && sizeof($oOrder->getOrderProducts()) > ($pnr - 1))) {
-                
-                AddRechnungPage($this, $pdf);
-                $bKopf = false; $count = 0; $offset = 0;
-                
-            }
-
-        } // produkte
-	
-        // Gutschein
-        if (wpsg_isSizedArray($arCalculation['voucher'])) {
-            
-            foreach ($arCalculation['voucher'] as $v) {
-                
-                $pdf->SetFont('Arial', '', 9);
-                $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-                
-                $pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell( (($bTaxCol)?87:102), 8, wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $v['code']), 1, 0, 'L');
-                
-                if ($bTaxCol) {
-                    
-                    $pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-                    $pdf->Cell(15, 8,  __('anteilig', 'wpsg'), 1, 0, 'C');
-                    
-                }
-                
-                $pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(15, 8, '1', 1, 0, 'C');
-                
-                $gs_value_einzel = wpsg_ff($v[$taxdisplay.'_single'], $this->get_option('wpsg_currency'));
-                $gs_value_gesamt = wpsg_ff($v[$taxdisplay], $this->get_option('wpsg_currency'));
-                
-                $pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(25, 8, $gs_value_einzel, 1, 0, 'R');
-                
-                $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(25, 8, $gs_value_gesamt, 1, 0, 'R');
-                
-                $offset += 8;
-                
-            }
-            
-        }
-
-        // Versandkosten
-	    $cost_shipping = ((wpsg_ShopController::getShop()->getFrontendTaxview() === WPSG_BRUTTO)?$arCalculation['sum']['shipping_brutto']:$arCalculation['sum']['shipping_netto']);
-	    
-        if ($arCalculation['sum']['shipping_brutto'] > 0) {
-            
-            $pdf->SetFont('Arial', '', 9);
-            $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-            
-            $pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell( (($bTaxCol)?87:102), 8, wpsg_translate(__('Versandkosten "#1#"', 'wpsg'), $oOrder->getShippingLabel()), 1, 0, 'L');
-            
-            if ($bTaxCol) {
-                 
-                if ($bNoTax) {
-                    
-                    $mwst = wpsg_ff(0.00, '%');
-                    
-                } else { 
-                    
-                    if ($arCalculation['shipping'][0]['tax_key'] === '0') {
-                    
-                        $mwst = _('anteilig');
-                        
-                    } else {
-                                            
-                        $mwst = wpsg_ff($arCalculation['shipping'][0]['tax'], '%');
-                        $mwst = wpsg_ff($arCalculation['tax'][$arCalculation['shipping'][0]['tax_key']]['tax_value'], '%');
-                        
-                    }
-                    
-                }
-                 
-                $pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-                
-            }
-            
-            $pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, '1', 1, 0, 'C');
-            
-            $pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($arCalculation['sum']['shipping_brutto'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($arCalculation['sum']['shipping_brutto'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $offset += 8;
-            
-        }
-        
-        // Zahlungskosten
-	    $cost_payment = ((wpsg_ShopController::getShop()->getFrontendTaxview() === WPSG_BRUTTO)?$arCalculation['sum']['payment_brutto']:$arCalculation['sum']['payment_netto']);
-	    
-        if ($cost_payment > 0) {
-            
-            $pdf->SetFont('Arial', '', 9);
-            $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-            
-            $pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell( (($bTaxCol)?87:102), 8, $oOrder->getPaymentLabel(), 1, 0, 'L');
-            
-            if ($bTaxCol) {
-                
-                if ($bNoTax) {
-					
-                    $mwst = wpsg_ff(0.00, '%');
-					
-                } else {
-                    
-                    if ($arCalculation['payment'][0]['tax_key'] === '0') {
-                        
-                        $mwst = _('anteilig');
-                        
-                    } else {
-                        
-                        $mwst = wpsg_ff($arCalculation['payment'][0]['tax'], '%');
-                        $mwst = wpsg_ff($arCalculation['tax'][$arCalculation['payment'][0]['tax_key']]['tax_value'], '%');
-                        
-                    }
-                    
-                }
-                
-                $pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-                
-            }
-            
-            $pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, '1', 1, 0, 'C');
-            
-            $pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($cost_payment, $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($cost_payment, $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $offset += 8;
-            
-        }
-        
-		// Rabatt
-	    if ($arCalculation['sum']['discount_brutto'] < 0) {
-			
-			$pdf->SetFont('Arial', '', 9);
-            $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-			
-			$pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell( (($bTaxCol)?87:102), 8, _('Rabatt'), 1, 0, 'L');
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, _('anteilig'), 1, 0, 'C');
-			
-			$pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, '1', 1, 0, 'C');
-			
-			$pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($arCalculation['sum']['discount_brutto'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($arCalculation['sum']['discount_brutto'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-			
-			$offset += 8;
-			
-	    }
-		
-		// Wertgutschein
-		foreach ($arCalculation['coupon'] as $c) {
-			  
-			$pdf->SetFont('Arial', '', 9);
-            $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-			
-			$pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell( (($bTaxCol)?87:102), 8, _('Wertgutschein').' ('.$c['code'].')', 1, 0, 'L');
-			
-			$pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, _('anteilig'), 1, 0, 'C');
-			
-			$pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, $c['amount'], 1, 0, 'C');
-			
-			$pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($c[$taxdisplay.'_single'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, wpsg_ff($c[$taxdisplay], $this->get_option('wpsg_currency')), 1, 0, 'R');
-			
-			$offset += 8; 
-			
-		}
-		
-        // GebÃŒhr
-        if (wpsg_tf(wpsg_getStr($this->view['storno_fee'])) > 0) {
-            
-            $pdf->SetFont('Arial', '', 9);
-            $pdf->setXY($prod_left, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
-            
-            $label = __('BearbeitungsgebÃŒhr', 'wpsg');
-            
-            if (strpos($this->view['storno_fee'], '%') !== false) $label .= ' ('.wpsg_ff($this->view['storno_fee'], '%').')';
-            
-            $pdf->setXY($prod_left + 10, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell( (($bTaxCol)?87:102), 8, $label, 1, 0, 'L');
-            
-            if ($bTaxCol) {
-                
-                if ($bNoTax) {
-					
-                    $mwst = wpsg_ff(0.00, '%');
-					
-                } else {                    
-                    
-                    $mwst = wpsg_ff($this->view['storno_fee_tax_value'], '%');
-                    
-                }
-                
-                $pdf->setXY($prod_left + 97, $prod_top + $offset + $sum_multi_offset);
-                $pdf->Cell(15, 8, $mwst, 1, 0, 'C');
-                
-            }
-            
-            $pdf->setXY($prod_left + 112, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(15, 8, '1', 1, 0, 'C');
-            
-            $pdf->setXY($prod_left + 127, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $pdf->setXY($prod_left + 152, $prod_top + $offset + $sum_multi_offset);
-            $pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
-            
-            $offset += 8;
-
-        }
-		
-        // Bestellbetrag einer einzelnen Bestellung
-        if ($bNoTax) {
-			
-            $pdf->Text($prod_left + 115, $prod_top + $offset + $sum_multi_offset + 6, __("Bestellbetrag (NETTO):", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset + $sum_multi_offset + 1);
-			$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			
-        } else  {
-			
-            $pdf->Text($prod_left + 115, $prod_top + $offset + $sum_multi_offset + 6, __("Bestellbetrag (BRUTTO):", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset + $sum_multi_offset + 1);
-			$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			
-        }
-
-        $sum_multi_offset += ($offset + 30);
-		
-    } // FOREACH ORDER END
-			
-	$arCalculation = $this->view['arCalculationSum'];
-	
-	$offset = $sum_multi_offset - 30;
-	
-	$pdf->SetFont('Arial', '', 9);
-	
-	if ($this->view['kunde']['ustidnr'] != "") {
-		
-		$offset += 13;
-		
-		$pdf->Text($prod_left, $prod_top + $offset, __("Ihre Umsatzsteuer-Identifikationsnummer:", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, $this->view['kunde']['ustidnr'], 0, 0, 'R');
-		
-	}
-
-	$offset += 10;
-		
-	$offset = $checkPageBreak($this, $offset, 6);
-	
-	if ($this->get_option('wpsg_kleinunternehmer')) {
-		
-		$pdf->Text($prod_left, $prod_top + $offset + 10, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
-		$pdf->Text($prod_left + 80, $prod_top + $offset, __("Summe", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		
-		$offset += 5;
-		
-	} else {
-		
-		if ($bNoTax) {
-			
-			$pdf->Text($prod_left, $prod_top + $offset + 10, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
-			$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("BRUTTOBETRAG GESAMT", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-			$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			$offset += 5;
-			
-			$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("MwSt. GESAMT", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-			$pdf->Cell(37, 8, wpsg_ff(0, $this->get_option('wpsg_currency')), 0, 0, 'R');
-			
-		} else {
-			
-			$pdf->Text($prod_left, $prod_top + $offset + 10, __("Der Gesamtbetrag setzt sich wie folgt zusammen", "wpsg"));
-			
-			$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("NETTOBETRAG GESAMT", "wpsg"));
-			$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-			$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-			
-			if (sizeof($arCalculation['tax']) > 1) {
-				
-				$offset += 5;
-				$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("MwSt. GESAMT", "wpsg"));
-				$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-				$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['tax'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-				
-			}
-			
-		}
-		
-	}
-		
-	// Wertgutschein
-	if ($arCalculation['sum']['topay_brutto'] !== $arCalculation['sum']['brutto']) {
-		
-		$offset += 5;
-		$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("Bruttobetrag GESAMT", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-		
-		$pdf->setFont('Arial', '', '9');
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-
-		foreach ($this->view['multi_data']['order_data'] as $order_data) {
-        
-			$arCalculationOrder = $order_data['arCalculation'];
-
-            foreach ($arCalculationOrder['coupon'] as $c) {
-                
-                $offset += 5;
-                $pdf->Text($prod_left + 80, $prod_top + $offset + 10, __('Wertgutschein', 'wpsg').' '.((wpsg_isSizedString($c['code']))?'('.$c['code'].')':''));
-                $pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-                
-                $pdf->setFont('Arial', '', '9');
-                $pdf->Cell(37, 8, wpsg_ff($c[$taxdisplay], $this->get_option('wpsg_currency')), 0, 0, 'R');
-                $pdf->setFont('Arial', '', '9');
-                
-            }
-
-        }
-		
-		$offset += 5;
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("ZU ZAHLEN", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-		
-		/* Endbetrag wird fett ausgegeben */
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-		
-	} else {
-	
-		$offset += 5;
-		$pdf->Text($prod_left + 80, $prod_top + $offset + 10, __("GESAMTSUMME", "wpsg"));
-		$pdf->setXY($prod_left + 140, $prod_top + $offset + 10 - 5);
-		/* Endbetrag wird fett ausgegeben */
-		$pdf->setFont('Arial', 'B', '9');
-		$pdf->Cell(37, 8, wpsg_ff($arCalculation['sum']['topay_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
-		$pdf->setFont('Arial', '', '9');
-				
-	}
-	
-	if ($this->get_option('wpsg_kleinunternehmer') == '1')
-	{
-		
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset + 15, 5, $this->get_option('wpsg_kleinunternehmer_text'));
-		$offset += 15;
-		
-	}
-	
-	if ($this->hasMod('wpsg_mod_deliverynote'))
-	{
-		
-		$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($data['id']));
-		$delivery_date = $this->callMod('wpsg_mod_deliverynote', 'getDeliveryTime', array($data['id']));
-		
-		// Wenn es ein Gesamtlieferdatum gibt und nur einen Lieferschein, dann unter der Bestellung anzeigen
-		if ($delivery_date !== false && sizeof($arDN_order) == 1)
-		{
-			
-			$offset += 10;
-			
-			$pdf->wpsg_MultiCell($prod_left, $prod_top + $offset + 10, 5, wpsg_translate(__('Lieferung: #1#', 'wpsg'), date('d.m.Y', $delivery_date)));
-			
-			$offset += 5;
-			
-		}
-		
-	}
-	
-	$offset += 5;
-	
-	if ($this->view['fussText'] != "")
-	{
-		
-		//$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset, 5, utf8_encode($this->view['fussText']));		
-		$pdf->wpsg_MultiCell($prod_left - 1, $prod_top + $offset + 10, 5, $this->view['fussText']);
-		$pdf->SetFont('Arial', 'B', 9);
-		$offset += 10;
-		
-	}
-	
-	$shipping_adress = false;
-		
-	$offset += 5;
-		
-	$filename = $this->view['filename'].".pdf";
-	 
-	if ($this->view['preview']) {
-
-		$pdf->Output();
-		
-	    exit;
-		
-	} else {
-		
-		$pdf->Output($this->view['file_path'], 'F');
-		
-	}
- 
Index: ews/mods/mod_rechnungen/multi_invoicemail.phtml
===================================================================
--- /views/mods/mod_rechnungen/multi_invoicemail.phtml	(revision 8528)
+++ 	(revision )
@@ -1,27 +1,0 @@
-<?php 
-
-	/**
-	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann
-	 */
-
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-    
-    foreach ($this->view['multi_data']['order_data'] as $order_data) { 
-		
-		$oOrder = $order_data['oOrder'];
-		$str['onr'][] = intval($oOrder->getNr()); 
-	
-	}
-
-    //wpsg_debug($this->view);
-
-?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['kunde']['title']], $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>
- 
-		
-<?php echo __("Sie erhalten hiermit Ihre Sammelrechnung in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['arCalculationSum']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellungen mit den Bestellnummern:", "wpsg"); ?> <?php  echo implode(',', $str['onr']); ?>.
-<?php $this->callMods('wpsg_mod_rechnungen_mail'); ?>
- 
-<?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?>
- 
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: ews/mods/mod_rechnungen/multi_invoicemail_html.phtml
===================================================================
--- /views/mods/mod_rechnungen/multi_invoicemail_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,29 +1,0 @@
-<?php 
-
-	/**
-	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann (HTML)
-	 */
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
-	/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
-	$this->htmlMail = true;
-
-	foreach ($this->view['multi_data']['order_data'] as $order_data) { 
-		
-		$oOrder = $order_data['oOrder'];
-		$str['onr'][] = intval($oOrder->getNr()); 
-	
-	}
-
-	//wpsg_debug($this->view);
-
-?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
-		
-<p><?php echo __("Sie erhalten hiermit die Sammelrechnung in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['arCalculationSum']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellungen mit den Bestellnummern:", "wpsg"); ?> <?php echo implode(',', $str['onr']); ?>.</p>
-
-<?php $this->callMods('wpsg_mod_rechnungen_mail'); ?>
- 
-<p><?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?></p>
- 
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: /views/mods/mod_rechnungen/order_view.phtml
===================================================================
--- /views/mods/mod_rechnungen/order_view.phtml	(revision 8528)
+++ /views/mods/mod_rechnungen/order_view.phtml	(revision 5261)
@@ -4,116 +4,275 @@
 	 * Template fÃŒr die Rechnungsmodulansicht innerhalb der Bestellansicht
 	 */
-	use horstoeko\zugferd\ZugferdProfiles;
-	use wpsg\mod_invoice\eInvoice;
 
 ?>
+
+<script type="text/javascript">
+
+	function wpsg_mod_rechnungen_storno()
+	{
+
+		if (jQuery('#wpsg_rechnungen_gutschrift1').attr('checked') || jQuery('#wpsg_rechnungen_gutschrift2').attr('checked'))
+		{
+
+			window.setTimeout(function() { 
+				location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>'; 
+			}, 1000);
+
+		}
+
+		return true;
+
+	}
+
+	jQuery(document).ready(function() { 
+		
+		jQuery("#wpsg_rechnungen_postbox_title").bind("click", function() { 
+			if (jQuery(this.parentNode).hasClass("closed"))
+			{
+			
+				jQuery.cookie("wpsg_rechnungen_field", "0", { expires: 999999 } );
+			
+			}
+			else
+			{
+			
+				jQuery.cookie("wpsg_rechnungen_field", "1", { expires: 999999 } );
+			
+			}
+		} );
+	
+		if (jQuery.cookie("wpsg_rechnungen_field") == "1")
+		{
+		
+			jQuery("#wpsg_rechnungen_postbox").removeClass("closed");
+		}
+
+		jQuery('.wpsg_rechnungen_gutschrift').bind('change', function() {
+
+			if (jQuery('#wpsg_rechnungen_gutschrift1').attr('checked') || jQuery('#wpsg_rechnungen_gutschrift2').attr('checked'))
+			{
+
+				jQuery('#wpsg_mod_rechnungen_fee_layer').show();
+				jQuery('#wpsg_mod_rechnungen_stornopreview').show();
+				jQuery('#wpsg_rechnungen_stornobutton').attr('value', '<?php echo __('Rechnungskorrektur erstellen', 'wpsg'); ?>');
+				
+			}
+			else
+			{
+
+				jQuery('#wpsg_mod_rechnungen_fee_layer').hide();
+				jQuery('#wpsg_mod_rechnungen_stornopreview').hide();
+				jQuery('#wpsg_rechnungen_stornobutton').attr('value', '<?php echo __('Bestellung Stornieren', 'wpsg'); ?>');
+				
+			}
+			
+		} );
+
+		jQuery('#wpsg_rechnungen_gutschrift0').change();
+		
+	} );
+
+</script>
+
+<div class="postbox" id="wpsg_rechnungen">		
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Rechnungen', 'wpsg'); ?></span>
+	</h3>
+	<div class="inside">
+		
+		<?php if (sizeof($this->view['mod_rechnungen']['arRechnungen']) == 0 && sizeof($this->view['mod_rechnungen']['arRechnungen_storno']) == 0) { ?>
+			<p><?php echo __('Bisher keine Rechnungen geschrieben.', 'wpsg'); ?></p>
+		<?php } else { ?>
+			<table>
+				<?php foreach ($this->view['mod_rechnungen']['arRechnungen_gesamt'] as $r) { ?>	
+				<tr>
+					<td>#<?php echo (($r['rnr'] != '')?$r['rnr']:$r['gnr']); ?>
+					
+						<?php if ($r['storno'] == "0000-00-00 00:00:00") { ?>
+							<?php if ($r['gnr'] != "") { ?>
+								<?php echo wpsg_translate(__('Rechnungskorrektur vom #1#', 'wpsg'), date("d.m.Y", $r['ts_datum'])); ?>	
+							<?php } else { ?>
+								<?php echo wpsg_translate(__('Rechnung geschrieben am #1#', 'wpsg'), date("d.m.Y", $r['ts_datum'])); ?>	
+							<?php } ?>
+						<?php } else { ?>
+							<?php echo wpsg_translate(__("Rechnung storniert am #1#", "wpsg"), date("d.m.Y", $r['ts_storno'])); ?>
+						<?php } ?> 
+					
+					</td>
+					<td style="text-align:right;">
+					
+						<?php
+						 
+							if ($r['rnr'] != "") 
+							{ 
+								$rfile = $this->callMod('wpsg_mod_rechnungen', 'getFilePath', array($this->view['data']['id'], true)).'R'.$r['rnr'].'.pdf';								
+							}
+							else if ($r['gnr'] != "")
+							{
+								$rfile = $this->callMod('wpsg_mod_rechnungen', 'getFilePath', array($this->view['data']['id'], true)).'G'.$r['gnr'].'.pdf';
+							}
+							
+						?>
+					
+						<a target="_blank" onclick="if (!confirm('<?php echo __('Sind Sie sicher, dass Sie eine Kopie dieser Rechnung/Rechnungskorrektur erneut an den Kunden senden mÃ¶chten?', 'wpsg'); ?>')) return false;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_rechnungen&noheader=1&action=ajax&edit_id=<?php echo $this->view['data']['id']; ?>&r_id=<?php echo $r['id']; ?>&do=copy"><?php echo __("Kopie senden", "wpsg"); ?></a>&nbsp;
+						<a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&noheader=1&mod=wpsg_mod_rechnungen&do=getRechnung&edit_id=<?php echo $this->view['data']['id']; ?>&r_id=<?php echo $r['id']; ?>"><?php echo __("Ansehen", "wpsg"); ?></a>
+					
+					</td>
+				</tr>
+				<?php } ?>
+			</table>
+			<br />
+		<?php } ?>
+		
+		<?php if (sizeof($this->view['mod_rechnungen']['arRechnungen']) > 0 && sizeof($this->view['mod_rechnungen']['arRechnungen_gesamt']) != sizeof($this->view['mod_rechnungen']['arRechnungen_storno'])) { ?>
+			<fieldset style="border:1px solid #999999; width:100%;">
+				<legend style="margin-left:7px; margin-right:10px;"><?php echo __("Bestellstorno: Rechnungskorrektur erstellen", "wpsg"); ?></legend>
+				<div style="padding:10px;">
+					<form id="storno_form" target="_blank" method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1&action=ajax&mod=wpsg_mod_rechnungen&edit_id=<?php echo $this->view['data']['id']; ?>&do=storno">
+
+						<input type="hidden" name="send" value="1" />
+						
+						<label><input onclick="jQuery.cookie('wpsg_rechnungen_stornoradio', '0');" type="radio" value="0" class="wpsg_rechnungen_gutschrift" id="wpsg_rechnungen_gutschrift0" name="wpsg_rechnungen_gutschrift" />&nbsp;<?php echo __("Rechnung komplett stornieren und keine Rechnungskorrektur erstellen.", "wpsg"); ?></label><br />
+						<label><input onclick="jQuery.cookie('wpsg_rechnungen_stornoradio', '1');" type="radio" value="1" class="wpsg_rechnungen_gutschrift" id="wpsg_rechnungen_gutschrift1" name="wpsg_rechnungen_gutschrift" />&nbsp;<?php echo __("Rechnungskorrektur erstellen.", "wpsg"); ?></label><br />
+						<label><input onclick="jQuery.cookie('wpsg_rechnungen_stornoradio', '2');" type="radio" value="2" class="wpsg_rechnungen_gutschrift" id="wpsg_rechnungen_gutschrift2" name="wpsg_rechnungen_gutschrift" />&nbsp;<?php echo __("Rechnungskorrektur erstellen und an Kunden senden.", "wpsg"); ?></label><br />
+
+						<div id="wpsg_mod_rechnungen_fee_layer" style="display:none;">							
+							<?php echo wpsg_drawForm_Input('wpsg_mod_rechnungen_fee', __('GebÃŒhr fÃŒr Rechnungskorrektur', 'wpsg'), ''); ?>
+						</div>
+												 
+						<div class="wpsg_clear"></div><br />						
+
+						<input onclick="return wpsg_mod_rechnungen_storno();" id="wpsg_rechnungen_stornobutton" class="button" type="submit" name="form_submit" value="<?php echo __("Stornieren", "wpsg"); ?>" style="float:right;" />							
+						<input id="wpsg_mod_rechnungen_stornopreview" class="button" type="submit" name="form_submit_preview" value="<?php echo __('Vorschau', 'wpsg'); ?>" style="float:right; margin-right:10px;" />
+							
+						<script type="text/javascript">
  
-<div id="wpsg_mod_rechnungen_order_view">
-    
-    <?php echo wpsg_drawForm_AdminboxStart(__('Rechnungen', 'wpsg'));  ?>
-    
-        <?php if (sizeof($this->view['mod_rechnungen']['arRechnungen']) == 0 && sizeof($this->view['mod_rechnungen']['arRechnungen_storno']) == 0) { ?>
-            
-        <p><?php echo __('Bisher keine Rechnungen geschrieben.', 'wpsg'); ?></p>
-        
-        <?php } else { ?>
-            
-            <div class="grid">
-            
-                <?php foreach ($this->view['mod_rechnungen']['arRechnungen_gesamt'] as $r) { 
-                    
-                    $oInvoice = \wpsg\wpsg_invoice::getInstance($r['id']);
-                    
-                    ?>
-											
-                    <div>
-                        <?php echo $oInvoice->getDate(true); ?>
-                    </div>
-                    <div>
-                        <?php echo $oInvoice->getNr(true); ?>
-                    </div>
-					<div>
-						<div id="e_invoice_app_<?php echo $oInvoice->getId(); ?>"></div>
-						<script type="module">
-					
-							import { initEInvoiceApp } from '<?php echo wpsg_ShopController::getShop()->getRessourceURL('mods/mod_rechnungen/js/e_invoice_app.module.js'); ?>';
-
-							initEInvoiceApp(document.getElementById('e_invoice_app_<?php echo $oInvoice->getId(); ?>'), {
-								'invoice_id': <?php echo $oInvoice->getId(); ?>,
-								'template_url': '<?php echo wpsg_ShopController::getShop()->getRessourceURL('mods/mod_rechnungen/html/e_invoice_app.html'); ?>',
-								'default_profile': <?php echo intval(wpsg_ShopController::getShop()->get_option('wpsg_mod_rechnungen_einvoice')); ?>,
-								'arProfile': <?php echo json_encode([
-									100 + ZugferdProfiles::PROFILE_MINIMUM => ['label' => __('EN16931 Minimum', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_MINIMUM)],
-									100 + ZugferdProfiles::PROFILE_BASIC => ['label' => __('EN16931 Basic', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_BASIC)],
-									100 + ZugferdProfiles::PROFILE_BASICWL => ['label' => __('EN16931 Basic WL', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_BASICWL)],
-									100 + ZugferdProfiles::PROFILE_EN16931 => ['label' => __('EN16931 Comfort', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_EN16931)],
-									100 + ZugferdProfiles::PROFILE_EXTENDED => ['label' => __('EN16931 Extended', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_EXTENDED)],
-									100 + ZugferdProfiles::PROFILE_XRECHNUNG => ['label' => __('EN16931 XRechnung 1', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_XRECHNUNG)],
-									100 + ZugferdProfiles::PROFILE_XRECHNUNG_2 => ['label' => __('EN16931 XRechnung 2', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_XRECHNUNG_2)],
-									100 + ZugferdProfiles::PROFILE_XRECHNUNG_2_1 => ['label' => __('EN16931 XRechnung 2.1', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_XRECHNUNG_2_1)],
-									100 + ZugferdProfiles::PROFILE_XRECHNUNG_2_2 => ['label' => __('EN16931 XRechnung 2.2', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_XRECHNUNG_2_2)],
-									100 + ZugferdProfiles::PROFILE_XRECHNUNG_2_3 => ['label' => __('EN16931 XRechnung 2.3', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_XRECHNUNG_2_3)],
-									100 + ZugferdProfiles::PROFILE_XRECHNUNG_3 => ['label' => __('EN16931 XRechnung 3', 'wpsg'), 'url' => eInvoice::buildUrl($oInvoice->getId(), ZugferdProfiles::PROFILE_XRECHNUNG_3)]
-								]); ?>
+							jQuery(document).ready(function() {									
+																
+								jQuery("[name=wpsg_rechnungen_gutschrift]").filter("[value=" + jQuery.cookie("wpsg_rechnungen_stornoradio") + "]").attr("checked","checked");
+										
+								jQuery("#wpsg_rechnungen_stornobutton").bind("click", function() {
+										  
+									if (jQuery("#wpsg_rechnungen_gutschrift1").attr("checked") || jQuery("#wpsg_rechnungen_gutschrift2").attr("checked"))
+									{
+											
+										//jQuery("#storno_form").attr("action", "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1&action=ajax&mod=wpsg_mod_rechnungen&edit_id=<?php echo $this->view['data']['id']; ?>&do=storno");
+										jQuery("#storno_form").attr("target", "_blank");
+
+										window.setTimeout(function() {
+											location.href = "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>";
+										}, 1500);
+											
+									}
+									else
+									{
+										
+										//jQuery("#storno_form").attr("action", "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_rechnungen&edit_id=<?php echo $this->view['data']['id']; ?>&do=storno");
+										jQuery("#storno_form").attr("target", "");
+											
+									}
+																			
+								});	 
+								
 							});
+									
+						</script>
+							
+					</form>
+					<div class="wpsg_hinweis"><?php echo __("Eine neue Rechnung kann erst geschrieben werden wenn alle bestehenden Rechnungen zu dieser Bestellung storniert wurden.", "wpsg"); ?></div>
+					<div class="wpsg_clear"></div>
+				</div>
+			</fieldset>
+		<?php } else { ?>
+		
+			<fieldset style="border:1px solid #999999; width:100%;">
+				<legend style="margin-left:10px; margin-right:10px;"><?php echo __("Neue Rechnung", "wpsg"); ?></legend>
+				<div style="padding:5px;">
+	
+					<form target="_blank" method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_rechnungen&cmd=rechnung&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>">
 						
+						<input type="hidden" name="send" value="1" />
+									
+						<label style="height:25px; width:240px; float:left; margin-top:10px;">	
+							<input onchange="if (this.checked) jQuery('#wpsg_rechnungen_email').show(); else jQuery('#wpsg_rechnungen_email').hide();" type="checkbox" checked="checked" value="1" name="wpsg_rechnungen_sendmail" />
+							&nbsp;<?php echo __("E-Mail an Kunden senden.", "wpsg"); ?>
+						</label>
+						<input type="text" style="display:block; width:300px; float:right;" id="wpsg_rechnungen_email" name="wpsg_rechnungen_email" value="<?php echo wpsg_hspc($this->view['data']['email']); ?>" />
+						<div style="clear:both; width:100%; height:5px;"></div>
+										
+						<label style="height:25px; width:240px; float:left;">	
+							<input checked="checked"  onchange="if (this.checked) jQuery('#wpsg_rechnungen_faelligkeitsdatum').show(); else jQuery('#wpsg_rechnungen_faelligkeitsdatum').hide();" type="checkbox" value="1" name="wpsg_rechnungen_faelligkeit" />
+							&nbsp;<?php echo __("FÃ€lligkeit anzeigen.", "wpsg"); ?>
+						</label>
+						<input type="text" style="display:block; width:300px; float:right;" id="wpsg_rechnungen_faelligkeitsdatum" name="wpsg_rechnungen_faelligkeitsdatum" value="<?php echo date("d.m.Y", time() + ($this->get_option("wpsg_rechnungen_faelligkeit") * 86400)); ?>" />
+						<div style="clear:both; width:100%; height:5px;"></div>
+		
+						<label style="height:25px; width:220px; float:left;">									
+							<input checked="checked" onchange="if (this.checked) jQuery('#wpsg_rechnungen_status').show(); else jQuery('#wpsg_rechnungen_status').hide();" type="checkbox" value="1" name="wpsg_rechnungen_status" />
+							&nbsp;<?php echo __("Neuer Status:", "wpsg"); ?>										
+						</label>
+						<select style="width:300px; float:right;" id="wpsg_rechnungen_status_neu" name="wpsg_rechnungen_status_neu">
+							<?php foreach ($this->arStatus as $k => $v) { ?>
+							<option value="<?php echo $k; ?>" <?php echo (($k == 110)?'selected="selected"':''); ?>><?php echo $v; ?></option>
+							<?php } ?>
+						</select>
+						<div style="clear:both; width:100%; height:5px;"></div>				
+
+						<label style="height:25px; width:240px; float:left;">
+							<input <?php echo (($this->get_option("wpsg_rechnungen_url_std") === "1")?'checked="checked"':''); ?> type="checkbox" value="1" name="wpsg_rechnungen_url" />
+							&nbsp;<?php echo __("URL Benachrichtigung", "wpsg"); ?>
+						</label>
+						<div style="clear:both; width:100%; height:5px;"></div>
+									
+						<label style="height:25px; width:240px; float:left; padding-left:22px;">
+							<?php echo __("Rechnungsdatum", "wpsg"); ?>:											
+						</label>
+						<input style="display:block;float:right; width:300px;" type="text" name="wpsg_rechnungen_datum" value="<?php echo date("d.m.Y", time()); ?>" />
+						<div style="clear:both; width:100%; height:5px;"></div>
+																		
+						<label for="wpsg_rechnungen_fusstext" style="height:25px; width:220px; padding-left:22px; float:left">
+							<?php echo __("FuÃtext", "wpsg"); ?>
+						</label>
+				
+						<?php 
+											
+							$wpsg_rechnungen_footer = $this->get_option("wpsg_rechnungen_footer");
+ 							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = unserialize($this->get_option("wpsg_rechnungen_footer"));
+							if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = Array();
+
+						?>
+												
+						<?php if (sizeof($wpsg_rechnungen_footer) > 0) { ?>				
+						<select style="width:300px; float:right;" id="wpsg_rechnungen_select" onchange="jQuery('#wpsg_rechnungen_fusstext').val(this.value);">
+							<?php foreach ($wpsg_rechnungen_footer as $k => $v) { ?>
+							<option value="<?php echo wpsg_hspc($v[1]); ?>"><?php echo wpsg_hspc($v[0]); ?></option>
+							<?php } ?>
+						</select>
+						<?php } ?>
+
+						<div style="clear:both; width:100%; height:5px;"></div>															
+						<div style="padding-left:25px;"><input style="width:100%;" type="text" name="wpsg_rechnungen_fusstext" id="wpsg_rechnungen_fusstext" value="" /></div>								
+						<div style="clear:both; width:100%; height:15px;"></div>
+										
+						<script type="text/javascript">
+		
+							jQuery(document).ready(function() {
+								jQuery('#wpsg_rechnungen_fusstext').val(jQuery("#wpsg_rechnungen_select").val());
+							});
+											
 						</script>
-					</div>
-                    <div style="text-align:right; white-space:nowrap;">
-
-						<?php /*
-						<a target="_blank" href="<?php
-						
-							echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_rechnungen&noheader=1&action=ajax&edit_id='.$_REQUEST['edit_id'].'&r_id='.$r['id'].'&do=rebuildadmin', 'wpsg-mod_invoice-order_ajax-rebuildadmin-'.$_REQUEST['edit_id']);
-							
-						?>" style="color:red;"><?php echo __('Neu erstellen', 'wpsg'); ?></a>
- 						*/ ?>
-						
-                        <a target="_blank" onclick="if (!confirm('<?php echo __('Sind Sie sicher, dass Sie eine Kopie dieser Rechnung/Rechnungskorrektur erneut an den Kunden senden mÃ¶chten?', 'wpsg'); ?>')) return false;" href="<?php 
-                            
-                            if ($r['o_id'] == '0') {
-                                // Multirechnung
-                                $r_o_ids = array_map('intval', explode(',', $r['o_ids']));
-                                echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_rechnungen&noheader=1&action=ajax&edit_id='.$_REQUEST['edit_id'].'&r_id='.$r['id'].'&do=copy', 'wpsg-mod_invoice-order_ajax-copy-'.$_REQUEST['edit_id']);
-                            } else {
-                                // normale Rechnung
-                                echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_rechnungen&noheader=1&action=ajax&edit_id='.$_REQUEST['edit_id'].'&r_id='.$r['id'].'&do=copy', 'wpsg-mod_invoice-order_ajax-copy-'.$_REQUEST['edit_id']);
-                            }
-
-                        ?>"><?php echo ' &nbsp;'.__("Kopie senden", "wpsg"); ?></a>&nbsp; 
-                        
-                    </div>
-                    
-                <?php } ?>
-				
-				
-                
-            </div>
-              
-        <?php } ?>
-     
-    <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-    
+										
+						<input class="button" style="float:right;" onclick="window.setTimeout(function() { location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>'; }, 1000);" name="wpsg_rechnungen_write" type="submit" value="<?php echo __("Rechnung schreiben", "wpsg"); ?>" />
+						<input class="button" style="float:right; margin-right:10px;" name="wpsg_rechnungen_preview" type="submit" value="<?php echo __("Vorschau", "wpsg"); ?>" />
+										
+						<div style="clear:both; width:100%; height:5px;"></div>
+								 
+					</form>
+				</div>
+			</fieldset> 
+		
+		<?php } ?>
+				
+	</div>					
 </div>
-    
-<style>
-    
-    #wpsg_mod_rechnungen_order_view .grid { display:grid; width:100%; grid-template-columns:150px 1fr 250px 150px; row-gap:0.5rem; column-gap:1rem; align-items:center; }
-    
-	.e_invoice_app { position:relative; user-select:none;
-		& > .handler { border:1px solid black; padding:0.25rem 0.5rem; white-space:nowrap; text-overflow:ellipsis; overflow:hidden; width:100%; cursor:pointer; background-color:white; position:relative;
-			&:after { width:0; height:0; border-top:5px solid transparent; border-bottom:5px solid transparent; border-left:5px solid #2c699e; content:' '; position:absolute; right:5px; top:50%; transform:translateY(-50%); transition:all 0.4s; }
-		}
-		& > .layer { position:absolute; max-height:0; overflow:hidden; width:100%; transition:all 0.4s; z-index:1;
-			& > .inner { border:1px solid black; padding:0.25rem 0.5rem; margin-top:-1px; display:flex; flex-direction:column; gap:0.25rem; background-color:white;
-				& > a:not(:last-child) { border-bottom:1px solid black; }
-				& > a.default { font-weight:bold; }
-			}
-		}
-		&.open {
-			& > .layer { max-height:500px; }
-			& > .handler:after { transform:translateY(-50%) rotate(90deg); }
-		}
-	}
-	
-</style>
Index: ews/mods/mod_rechnungen/order_view_orderdata_after.phtml
===================================================================
--- /views/mods/mod_rechnungen/order_view_orderdata_after.phtml	(revision 8528)
+++ 	(revision )
@@ -1,428 +1,0 @@
-<?php
-
-    declare(strict_types=1);
-    
-    /**
-     * @author: Daniel Schmitzer (daschmi@daschmi.de)
-     * @date: 09.06.22
-     * @time: 07:44
-     */
-     
-    namespace wpsg;
-
-    /** @var \wpsg_customer $oCustomer */
-    $oCustomer = $this->view['oCustomer']??null;
-    
-    /** @var \wpsg_order $oOrder */
-    $oOrder = $this->view['oOrder']??null;
-	
-    $wpsg_rechnungen_footer = $this->get_option("wpsg_rechnungen_footer");
-                        
-    if (is_string($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = unserialize($this->get_option("wpsg_rechnungen_footer"));
-    if (!is_array($wpsg_rechnungen_footer)) $wpsg_rechnungen_footer = Array();
-
-    $default = $this->get_option('wpsg_rechnungen_foottext_standard');
-    
-    /** @var \wpsg\wpsg_invoice[] $arInvoice */
-    $arInvoice = $this->callMod('wpsg_mod_rechnungen', 'getInvoiceToOrder', [$oOrder->getId()]);
-
-    $bCanInvoice = false;
-    $bCanStorno = false;
-    
-    foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
-        
-        if ($this->callMod('wpsg_mod_rechnungen', 'getAmountToInvoice', [$oOrderProduct]) > 0) {
-            
-            $bCanInvoice = true; 
-            
-        }
-        
-        if ($this->callMod('wpsg_mod_rechnungen', 'getAmountToStorno', [$oOrderProduct]) > 0) {
-            
-            $bCanStorno = true;
-            
-        }
-        
-        if ($bCanInvoice && $bCanStorno) break;
-        
-    }
-    
-    $act = 0;
-    
-    if ($bCanInvoice) $act = 1;
-    else if ($bCanStorno) $act = 2;
-    
-?>
-
-
-<div id="wpsg_mod_invoice_tabs">
-    
-    <ul class="nav nav-tabs" role="tablist">
-        <?php if ($bCanInvoice) { ?>
-        <li role="presentation" class="tab <?php echo (($act === 1)?'akttab active':''); ?>" id="tab1"><a href="#tab1" role="tab" data-toggle="tab" class="bg_invoice"><?php echo __('Rechnung erstellen', 'wpsg'); ?></a></li>
-        <?php } ?>
-        <?php if ($bCanStorno) { ?>
-        <li role="presentation" class="tab <?php echo (($act === 2)?'akttab active':''); ?>" id="tab2"><a href="#tab2" role="tab" data-toggle="tab" class="bg_storno"><?php echo __('Gutschrift/Rechnungskorrektur erstellen', 'wpsg'); ?></a></li>
-        <?php } ?>
-    </ul>
- 
-	<div class="tab-content">
-		
-        <?php if ($bCanInvoice) { ?>
-            <div role="tabpanel" class="tabcontent bg_invoice" id="tabcontent1">
-                
-                <form method="post" id="invoice_form" target="_blank" action="<?php 
-                    
-                    echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_rechnungen&cmd=rechnung&noheader=1&edit_id='.$oOrder->getId(); 
-                    
-                ?>" class="grid">
-                    
-                    <?php \wp_nonce_field('wpsg-mod_invoice-order_ajax-rechnung-'.$this->view['data']['id']);
-                    
-                        $arInvoiceLabel = [];
-                        
-                        foreach ($arInvoice as $oInvoice) {
-                            
-                            if ($oInvoice->isInvoice() && $oInvoice->getMeta('include_shipping', false, '0') === '1') {
-                               
-                                $arInvoiceLabel[] = $oInvoice->getNr(true);    
-                                
-                            }
-                            
-                        }
-                    
-                    ?>
-                    
-                    <!-- Rechnung -->
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_sendmail" value="1" id="invoice_sendmail" checked="checked" />
-                    <label for="invoice_sendmail"><?php echo __('E-Mail an Kunden senden', 'wpsg'); ?></label>
-                    <input type="email" name="wpsg_rechnungen_email" value="<?php
-						
-						$mail = $oCustomer->getEMailEInvoice();
-						if ($mail === null) $mail = $oCustomer->getEMail();
-						
-						echo $mail;
-						
-					?>" />
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_faelligkeit" value="1" id="invoice_faelligkeit" checked="checked" />
-                    <label for="invoice_faelligkeit"><?php echo __('FÃ€lligkeit anzeigen', 'wpsg'); ?></label>
-                    <input type="date" name="wpsg_rechnungen_faelligkeitsdatum" value="<?php echo date('Y-m-d', strtotime('+'.intval($this->get_option("wpsg_rechnungen_faelligkeit")).' day')); ?>" />
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_status" value="1" id="invoice_state" checked="checked" />
-                    <label for="invoice_state"><?php echo __('Neuer Status', 'wpsg'); ?></label>
-                    <select name="wpsg_rechnungen_status_neu">
-                        <?php foreach ($this->arStatus as $status_key => $status_label) { ?>
-                            <option value="<?php echo $status_key; ?>" <?php echo ((intval($status_key) === 110)?'selected="selected"':''); ?>><?php echo $status_label; ?></option>
-                        <?php } ?>
-                    </select>
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_shippay" value="1" id="invoice_shippay" <?php 
-                      
-                        if (sizeof($arInvoiceLabel) <= 0) echo ' checked="checked" ';
-                        
-                    ?> />
-                    <label style="grid-column:2 / span 2;" for="invoice_shippay"><?php 
-                            
-                        echo __('Versand-/Zahlungskosten berechnen', 'wpsg'); 
-                                        
-                        if (sizeof($arInvoiceLabel) > 0) {
-                            
-                            echo wpsg_translate(__(' (Enthalten in #1#)', 'wpsg'), implode(', ', $arInvoiceLabel));
-                            
-                        }
-                        
-                    ?></label>
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_discount_voucher_coupon" value="1" id="wpsg_rechnungen_discount_voucher_coupon" checked="checked" />
-                    <label style="grid-column:2 / span 2;" for="wpsg_rechnungen_discount_voucher_coupon"><?php echo __('Rabatt, Gutschein, Wertgutschein berechnen wenn vorhanden', 'wpsg'); ?></label>
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_url" value="1" id="invoice_url" />
-                    <label  for="invoice_url" style="grid-column: 2 / span 2;"><?php echo __('URL Benachrichtigung', 'wpsg'); ?></label>
-                    
-                    <span></span>
-                    <label for="invoice_date"><?php echo __('Rechnungsdatum', 'wpsg') ;?></label>
-                    <input type="date" value="<?php echo date('Y-m-d'); ?>" name="wpsg_rechnungen_datum" id="invoice_date" />
-                    
-                    <span></span>
-                    <label for="invoice_foottext_select"><?php echo __('FuÃtext', 'wpsg'); ?></label>
-                    
-                    <?php if (sizeof($wpsg_rechnungen_footer) > 0) { ?>
-                    <select id="invoice_foottext_select">
-                        <?php foreach ($wpsg_rechnungen_footer as $k => $v) { ?>
-                        <option value="<?php echo wpsg_hspc($v[1]); ?>" <?php echo ((intval($default) === intval($k))?'selected="selected"':''); ?>><?php echo wpsg_hspc($v[0]); ?></option>
-                        <?php } ?>
-                    </select>
-                    <?php } else { ?>
-                    <span></span>
-                    <?php } ?>
-                    
-                    <span></span>
-                    <input type="text" name="wpsg_rechnungen_fusstext" id="wpsg_rechnungen_fusstext" value="" style="grid-column: 2 / span 2;" />
-                                    
-                    <span style="grid-column:1 / span 3;"></span>
-                    
-                    <span style="display:flex; justify-content:flex-end; gap:0.5rem; grid-column:1/span 3;">
-                        
-                        <input class="button" style="" id="invoice_wpsg_rechnungen_preview" name="wpsg_rechnungen_preview" type="submit" value="Vorschau">
-                        <input class="button" style="" id="invoice_wpsg_rechnungen_submit" onclick="" name="wpsg_rechnungen_write" type="submit" value="Rechnung schreiben">
-                        
-                    </span>
-                    
-                    <script>
-                        
-                        let el_invoice_foottext_select = document.getElementById('invoice_foottext_select');
-                        let el_invoice_form = document.getElementById('invoice_form');
-                        
-                        if (el_invoice_foottext_select) {
-                            
-                            el_invoice_foottext_select.addEventListener('change', (event) => {
-                            
-                                document.getElementById('wpsg_rechnungen_fusstext').value = event.target.value;
-                                
-                            });
-                            
-                            el_invoice_foottext_select.dispatchEvent(new Event('change'));
-                            
-                        };
-                        
-                        let el_invoice_wpsg_rechnungen_preview = document.getElementById('invoice_wpsg_rechnungen_preview');
-                        let el_invoice_wpsg_rechnungen_submit = document.getElementById('invoice_wpsg_rechnungen_submit');
-                        
-						let submit = false;
-						
-						function check_invoice_amount(event) {
-							
-							if (submit === true) return;
-							
-							submit = true;
-							
-							let ok = false;
-							
-							for (let el_checkbox of document.getElementsByClassName('wpsg_check_amount_invoice')) {
-								
-								if (el_checkbox.checked) {
-									 
-									if (parseInt(el_checkbox.nextElementSibling.value) > 0) {
-										
-										ok = true; break;
-										
-                                    }
-									
-                                }
-								
-                            }
-							
-							if (ok) {
-								
-								if (event.target.getAttribute("id") === 'invoice_wpsg_rechnungen_submit') {
-                                        
-                                    window.setTimeout(function() { location.href = '<?php
-
-                                        echo wpsg_admin_url('Order', 'view', ['edit_id' => $oOrder->getId()], [], true);
-                                    
-                                    ?>'; }, 1000);
-
-								}
-									
-							} else {
-								
-								submit = false;
-								
-								alert('<?php echo __('Bitte mindestens ein Produkt auswÃ€hlen!', 'wpsg'); ?>');
-								
-								event.stopPropagation();
-							    event.preventDefault();
-								
-                            }
-							
-                        }
-						
-						el_invoice_wpsg_rechnungen_preview.addEventListener('click', check_invoice_amount);
-						el_invoice_wpsg_rechnungen_submit.addEventListener('click', check_invoice_amount);
-						
-                    </script>
-                                    
-                </form>
-                
-            </div>
-        <?php } ?>
-        
-        <?php if ($bCanStorno) { ?>
-            <div role="tabpanel" class="tabcontent bg_storno" id="tabcontent2">
-                
-                <form method="post" id="storno_form" target="_blank" action="<?php 
-                    
-                    echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&noheader=1&action=ajax&mod=wpsg_mod_rechnungen&edit_id='.$oOrder->getId().'&do=storno'; 
-                    
-                ?>" class="grid">
-                    
-                    <?php \wp_nonce_field('wpsg-mod_invoice-order_ajax-storno-'.$this->view['data']['id']); 
-                    
-                        $arInvoiceLabel = [];
-                        
-                        foreach ($arInvoice as $oInvoice) {
-                            
-                            if ($oInvoice->isStorno() && $oInvoice->getMeta('include_shipping', false, '0') === '1') {
-                               
-                                $arInvoiceLabel[] = $oInvoice->getNr(true);    
-                                
-                            }
-                            
-                        }
-                    
-                    ?>
-                    
-                    <!-- Gutschrift -->
-                    
-                    <input type="checkbox" name="storno_send" id="storno_send" value="1" />
-                    <label for="storno_send"><?php echo __('E-Mail an Kunden senden', 'wpsg'); ?></label>
-                    <input type="email" name="storno_mail" value="<?php
-						 
-						$mail = $oCustomer->getEMailEInvoice();
-						if ($mail === null) $mail = $oCustomer->getEMail();
-						
-						echo $mail;
-						
-					?>" />
-                    
-                    <input type="checkbox" id="storno_shippay" name="storno_shippay" value="1" id="invoice_shippay" <?php 
-                      
-                        if (sizeof($arInvoiceLabel) <= 0) echo ' checked="checked" ';
-                        
-                    ?> />
-                    <label style="grid-column:2 / span 2;" for="storno_shippay"><?php 
-                        
-                        echo __('Versand-/Zahlungskosten stornieren', 'wpsg'); 
-                     
-                        if (sizeof($arInvoiceLabel) > 0) {
-                            
-                            echo wpsg_translate(__(' (Enthalten in #1#)', 'wpsg'), implode(', ', $arInvoiceLabel));
-                            
-                        }
-                        
-                    ?></label>
-                    
-                    <input type="checkbox" name="storno_state" value="1" id="storno_state" checked="checked" />
-                    <label for="storno_state"><?php echo __('Neuer Status', 'wpsg'); ?></label>
-                    <select name="storno_state_new">
-                        <?php foreach ($this->arStatus as $status_key => $status_label) { ?>
-                        <option value="<?php echo $status_key; ?>"><?php echo $status_label; ?></option>
-                        <?php } ?>
-                    </select>
-                    
-                    <input type="checkbox" name="wpsg_rechnungen_discount_voucher_coupon" value="1" id="wpsg_rechnungen_storno_discount_voucher_coupon" checked="checked" />
-                    <label style="grid-column:2 / span 2;" for="wpsg_rechnungen_storno_discount_voucher_coupon"><?php echo __('Rabatt, Gutschein, Wertgutschein berechnen wenn vorhanden', 'wpsg'); ?></label>
-                    
-                    <input type="checkbox" name="storno_fee_set" id="storno_fee_set" value="1" id="storno_fee_set" />
-                    <label for="storno_fee_set"><?php echo __('StornierungsgebÃŒhr in % oder EUR', 'wpsg'); ?></label>
-                    <input type="text" value="" name="storno_fee_value" />
-                    
-                    <span style="grid-column:1 / span 3;"></span>
-                    
-                    <span style="display:flex; justify-content:flex-end; gap:0.5rem; grid-column:1/span 3;">
-                        
-                        <input class="button" style="" id="invoice_wpsg_storno_preview" name="wpsg_storno_preview" type="submit" value="Vorschau">
-                        <input class="button" style="" id="invoice_wpsg_storno_submit" onclick="" name="wpsg_storno_write" type="submit" value="Rechnungskorrektur schreiben">
-                        
-                    </span>
-                    
-                    <script>
-                         
-                        let el_storno_form = document.getElementById('storno_form');
-                        
-                        let el_invoice_wpsg_storno_preview = document.getElementById('invoice_wpsg_storno_preview');
-                        let el_invoice_wpsg_storno_submit = document.getElementById('invoice_wpsg_storno_submit');
-                                   
-						function check_invoice_amount(event) {
-							
-							let ok = false;
-							
-							for (let el_checkbox of document.getElementsByClassName('wpsg_check_amount_storno')) {
-								
-								if (el_checkbox.checked) {
-									
-									if (parseInt(el_checkbox.nextElementSibling.value) > 0) {
-										
-										ok = true; break;
-										
-                                    }
-									
-                                }
-								
-                            }
-						 
-							if (ok) {
-                                
-								if (event.target.getAttribute("id") === 'invoice_wpsg_storno_submit') {
-                                        
-                                    window.setTimeout(function() { location.href = '<?php 
-                        
-                                        echo wpsg_admin_url('Order', 'view', ['edit_id' => $oOrder->getId()], [], true);
-                                    
-                                    ?>'; }, 1000);
-
-								}
-									
-							} else {
-								
-								alert('<?php echo __('Bitte mindestens ein Produkt auswÃ€hlen!', 'wpsg'); ?>');
-								
-								event.stopPropagation();
-							    event.preventDefault();
-								
-                            }
-							
-                        }
-						
-						el_invoice_wpsg_storno_preview.addEventListener('click', check_invoice_amount);
-						el_invoice_wpsg_storno_submit.addEventListener('click', check_invoice_amount);
-						
-                    </script>
-                    
-                </form>
-                
-            </div>
-        <?php } ?>
-        
-    </div>
-    
-</div>
-
-<style>
-    
-    #wpsg_mod_invoice_tabs .grid { width:100%; padding:1rem; display:grid; row-gap:0.5rem; column-gap:0.5rem; grid-template-columns:25px 1fr 300px; align-items:center; grid-auto-rows:30px; padding-bottom:0.5rem; }
-    #wpsg_mod_invoice_tabs .grid input[type="checkbox"] { margin-top:0; }
-    #wpsg_mod_invoice_tabs .grid label { font-weight:normal; margin-bottom:0; } 
-    
-    .nav-tabs > li.active > a.bg_invoice,
-    .nav-tabs > li.active > a.bg_invoice:focus,
-    label.bg_invoice,
-    .link_invoice.bg_invoice,
-    .tabcontent.bg_invoice { background-color:lightgreen; color:black; }
-    
-    .nav-tabs > li.active > a.bg_storno,
-    .nav-tabs > li.active > a.bg_storno:focus,
-    label.bg_storno,
-    .link_invoice.bg_storno,
-    .tabcontent.bg_storno { background-color:lightpink; color:black; }
-    
-    .link_invoice { transform:translateX(-5px); padding:2px 5px; font-siz:12px; text-decoration:underline; }
-    label[for="invoice_shippay"] .link_invoice,
-    label[for="storno_shippay"] .link_invoice { padding:0; }
-
-    .wpsg_mod_rechnungen_row { display:block; width:100%; }
-    .wpsg_mod_rechnungen_row > div { padding:5px; }
-    .wpsg_mod_rechnungen_row .invoice_wrap:not(:only-child) { margin-top:0.5rem; }
-    .wpsg_mod_rechnungen_row .invoice_wrap > a:first-child { padding-left:0; }
-    
-</style>
-
-<script>
-    
-    jQuery('#wpsg_mod_invoice_tabs').wpsg_tab( {
-        aktTab: <?php echo $act; ?>
-	} );
-  
-</script>
Index: ews/mods/mod_rechnungen/order_view_row.phtml
===================================================================
--- /views/mods/mod_rechnungen/order_view_row.phtml	(revision 8528)
+++ 	(revision )
@@ -1,87 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Produktauswahl innerhalb der Bestellansicht
-	 */
-
-    $storno_amount = $this->view['wpsg_mod_rechnungen']['storno_amount'];
-    $invoice_amount = $this->view['wpsg_mod_rechnungen']['invoice_amount'];
-  
-    /** @var wpsg_order_product $oOrderProduct */
-    $oOrderProduct = $this->view['wpsg_mod_rechnungen']['oOrderProduct'];
-    
-    $p = $this->view['wpsg_mod_rechnungen']['product'];
-    $product_index = $this->view['wpsg_mod_rechnungen']['product']['product_index'];
-
-	/** @var \wpsg\wpsg_invoice[] $arInvoice */
-	$arInvoice = $this->callMod('wpsg_mod_rechnungen', 'getInvoiceToOrderProduct', [$oOrderProduct]);
-    $arInvoiceInvoice = [];
-    $arInvoiceStorno = [];
-    
-    foreach ($arInvoice as $oInvoice) { 
-        
-        if ($oInvoice->isStorno()) $arInvoiceStorno[] = $oInvoice;
-        else if ($oInvoice->isInvoice()) $arInvoiceInvoice[] = $oInvoice;
-
-    }
-    
-?>
-<tr class="wpsg_<?php echo (($this->view['wpsg_mod_rechnungen']['i'] == 0)?'odd':'even'); ?>">	
-	<td colspan="<?php echo ((sizeof($this->view['arCalculation']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'5':'4'); ?>">
-                
-        <!-- Rechnungen -->
-        <label class="bg_invoice wpsg_mod_rechnungen_row" style="font-weight:normal;">   
-       
-            <?php if ($invoice_amount > 0) { ?>
-                <div style="display:flex; flex-direction:row; gap:0.5rem; font-weight:normal; align-items:center;">
-                    <span><?php echo __('Menge'); ?></span>
-                    
-                    <input form="invoice_form" type="hidden" name="invoice_products[<?php echo $p['order_product_id']; ?>][set]" value="0" class="" />
-                    <input checked="checked" form="invoice_form" type="checkbox" class="wpsg_mod_deliverynote_product wpsg_check_amount_invoice" name="invoice_products[<?php echo $p['order_product_id']; ?>][set]" value="1" style="margin:0;" />
-                    
-                    <input form="invoice_form" name="invoice_products[<?php echo $p['order_product_id']; ?>][amount]" type="number" max="<?php echo $invoice_amount; ?>" min="1" value="<?php echo min($invoice_amount, $p['amount']); ?>" style="padding:0; font-size:14px; line-height:22px; min-height:initial; height:22px; width:50px; text-indent:5px; border:1px solid black; margin:0;" />
-                    
-                    <span>&nbsp;<?php echo __('auf Rechnung', 'wpsg'); ?></span>
-                </div>
-            <?php } ?>
-   
-            <?php if (sizeof($arInvoiceInvoice) > 0) { ?>
-            <div class="invoice_wrap">
-                <span><?php echo __('Rechnungen', 'wpsg'); ?>:</span>
-                <?php foreach ($arInvoiceInvoice as $oInvoice) { ?>
-                    <?php echo $oInvoice->getNr(true, $oOrderProduct); ?>        
-                <?php } ?>
-            </div>    
-            <?php } ?>
-            
-        </label>
-                                        
-        <!-- Gutschriften -->        
-        <label class="bg_storno wpsg_mod_rechnungen_row" style="font-weight:normal;">   
-            
-            <?php if ($storno_amount > 0) { ?>
-                <div style="display:flex; flex-direction:row; gap:0.5rem; font-weight:normal; align-items:center;">
-                    <span><?php echo __('Menge'); ?></span>
-                    
-                    <input form="storno_form" type="hidden" name="storno_products[<?php echo $p['order_product_id']; ?>][set]" value="0" class="" />
-                    <input form="storno_form" type="checkbox" class="wpsg_mod_deliverynote_product wpsg_check_amount_storno" name="storno_products[<?php echo $p['order_product_id']; ?>][set]" value="1" style="margin:0;" />
-                    
-                    <input form="storno_form" oninput="event.target.previousElementSibling.checked = true;" onchange="event.target.previousElementSibling.checked = true;" name="storno_products[<?php echo $p['order_product_id']; ?>][amount]" type="number" max="<?php echo $storno_amount; ?>" min="1" value="<?php echo min($storno_amount, $p['amount']); ?>" style="padding:0; font-size:14px; line-height:22px; min-height:initial; height:22px; width:50px; text-indent:5px; border:1px solid black; margin:0;" />
-                    
-                    <span>&nbsp;<?php echo __('StÃŒck auf Gutschrift', 'wpsg'); ?></span>
-                </div>
-            <?php } ?>
-            
-            <?php if (sizeof($arInvoiceStorno) > 0) { ?>
-            <div class="invoice_wrap">
-                <span><?php echo __('Rechnungskorrekturen', 'wpsg'); ?>:</span>
-                <?php foreach ($arInvoiceStorno as $oInvoice) { ?>
-                    <?php echo $oInvoice->getNr(true, $oOrderProduct); ?>        
-                <?php } ?>
-            </div>    
-            <?php } ?>
-            
-        </label>
-            
-	</td>
-</tr>
Index: /views/mods/mod_rechnungen/rechnung_pdf.phtml
===================================================================
--- /views/mods/mod_rechnungen/rechnung_pdf.phtml	(revision 5261)
+++ /views/mods/mod_rechnungen/rechnung_pdf.phtml	(revision 5261)
@@ -0,0 +1,919 @@
+<?php
+ 
+	/**
+	 * Template fÃŒr die PDF Rechnung
+	 */
+
+	require_once WPSG_PATH_LIB.'fpdf/fpdf.php';
+	require_once WPSG_PATH_LIB.'fpdf/fpdi.php';
+	require_once WPSG_PATH_MOD.'mod_rechnungen/wpsg_fpdf.class.php';
+  
+	global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top;
+	 
+	// Positionierung der Absenderadresszeile
+	$absender_left				= 25;
+	$absender_top				= 50;
+	
+	// Positionierung der Zieladress
+	$adress_left 				= 25;	
+	$adress_top					= 55;
+	
+	// Positionierund des Rechnungskopfes
+	$rdata_left					= 25;
+	$rdata_top					= 90;
+	
+	// Positionierung der Produktdaten
+	$prod_left					= 25;
+	$prod_top					= 105;
+
+	// Anzahl an Produkten pro Seite
+	$prod_break					= $this->get_option('wpsg_rechnungen_pdfperpage');
+	
+	// Damit die Steuer bei der Kleinunternehmerregelung nicht angezeigt wird leer ich den Array sicherheitshalber
+	if ($this->get_option('wpsg_kleinunternehmer') == '1')
+	{
+		
+		unset($this->view['basket']['mwst']);
+		
+	}
+	
+	if (!function_exists('AddRechnungPage'))
+	{
+		
+		function AddRechnungPage($shop, $pdf)
+		{
+			
+			global $absender_left, $absender_top, $adress_left, $adress_top, $rdata_left, $rdata_top;
+			
+			$pdf->AddPage();
+			
+			if (file_exists($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_bp.pdf"))
+			{
+				
+				$pagecount = $pdf->setSourceFile($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_bp.pdf"); 
+				$tplidx = $pdf->importPage(1, '/MediaBox'); 
+				$pdf->useTemplate($tplidx, 0, 0, 210); 
+				
+			}
+			if (file_exists($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_bp.jpg"))
+			{
+				$pdf->image($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_bp.jpg", 0, 0, 210, 297, 'jpg');
+			}
+			
+			
+			if (file_exists($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_logo.jpg"))
+			{
+	
+				list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_logo.jpg");
+				
+				//wpsg_debug($width.":".$height);
+				
+				$wPix = (25.4 * $width) / 96;
+				$hPix = (25.4 * $height) / 96;  
+				
+				$pdf->image($shop->callMod('wpsg_mod_rechnungen', getFilePath, array(''))."wpsg_rechnungen_logo.jpg", 210 - $wPix, 0, $wPix, $hPix);
+				
+			}
+			
+			// Absenderadresszeile (Wird in der Konfiguration hinterlegt)
+			$pdf->SetFont('Arial', '', 6);
+			$pdf->Text($absender_left, $absender_top, $shop->replaceUniversalPlatzhalter(__($shop->get_option("wpsg_rechnungen_adresszeile"), 'wpsg'), $shop->view['data']['id']));	
+			
+			if ($shop->view['kunde']['kuerzel'] != "") $shop->view['kunde']['kuerzel'] = $shop->view['kunde']['kuerzel'].'-';
+			
+			// Adresse des Kunden
+			$pdf->SetFont('Arial', '', 12);			
+			$pdf->Text($adress_left, $adress_top, $shop->view['kunde']['firma']);
+			$pdf->Text($adress_left, $adress_top + 5, $shop->view['kunde']['vname'].' '.$shop->view['kunde']['name']);
+			$pdf->Text($adress_left, $adress_top + 10, $shop->view['kunde']['strasse'].' '.$shop->view['kunde']['hausnr']);
+			$pdf->Text($adress_left, $adress_top + 15, $shop->view['kunde']['plz'].' '.$shop->view['kunde']['ort']);
+			$pdf->Text($adress_left, $adress_top + 20, strtoupper($shop->view['oOrder']->getInvoiceCountryName()));			
+			
+			// Rechnungsdaten 
+			$pdf->SetFont('Arial', 'B', 16);
+			$pdf->Text($rdata_left, $rdata_top, $shop->view['title']);
+			$pdf->SetFont('Arial', 'B', 9);
+			$pdf->Text($rdata_left, $rdata_top + 6, $shop->view['rnr']);
+			$pdf->SetFont('Arial', '', 9);
+			
+			if (isset($shop->view['faelligkeitdatum']))
+			{
+	
+				$pdf->Text($rdata_left + 35, $rdata_top, __("FÃ€llig am", "wpsg"));
+				$pdf->Text($rdata_left + 35, $rdata_top + 6, $shop->view['faelligkeitdatum']);
+				
+			}
+					
+			if (isset($shop->view['payment']))
+			{
+							
+				$pdf->Text($rdata_left + 58, $rdata_top, __("Zahlungsbedingungen", "wpsg"));
+				$pdf->Text($rdata_left + 58, $rdata_top + 6, $shop->view['payment']);
+				
+			}
+			
+			$pdf->Text($rdata_left + 105, $rdata_top, __("Kunden-Nr", "wpsg"));
+			$pdf->Text($rdata_left + 105, $rdata_top + 6, (($shop->view['kunde']['knr'] != '')?$shop->view['kunde']['knr']:$shop->view['kunde']['id']));
+			
+			$pdf->Text($rdata_left + 135, $rdata_top, __("Best. Nr.", "wpsg"));
+			$pdf->Text($rdata_left + 135, $rdata_top + 6, ((trim($shop->view['data']['onr']) != '')?$shop->view['data']['onr']:$shop->view['data']['id']));
+			
+			$pdf->Text($rdata_left + 155, $rdata_top, __("Datum", "wpsg")); 
+			$pdf->Text($rdata_left + 155, $rdata_top + 6, $shop->view['rDatum']);
+					
+			if ($shop->view['oOrder']->isInnerEu())
+			{
+				 
+				$pdf->SetFont('Arial', '', 9);		
+				$pdf->Text($adress_left, $rdata_top + 11.5, __("Innergemeinschaftliche Lieferung.", "wpsg"));
+				
+			}
+			
+			// Benutzerdefinierte Felder
+			$arTexte = $shop->callMod('wpsg_mod_rechnungen', 'getRechnungstexte', array($shop->view['data']['id']));
+			
+			foreach ((array)$arTexte as $text)
+			{
+				
+				if (isset($text['aktiv']) && $text['aktiv'] == 1)
+				{
+					
+					$pdf->SetFont('Arial', 'B', ((intval($text['fontsize']) > 0)?intval($text['fontsize']):10));
+					$pdf->SetTextColor($text['color']);
+					$pdf->MultiCell($text['x'], $text['y'], 5, utf8_encode($text['text'])); 
+					$pdf->SetTextColor("#000000");
+					
+				}
+				
+			}
+			
+		}
+		
+	}
+	//wpsg_debug($this->view); die();
+	$pdf = new wpsg_fpdf();	 
+	$pdf->SetAutoPageBreak(true, 5);
+	AddRechnungPage($this, $pdf);
+				
+	$summe = 0;
+	
+	$bKopf = false; $pnr = 1; $offset = 0; $count = 0;
+	foreach ($this->view['basket']['produkte'] as $p)
+	{
+			 
+		if (!$bKopf)
+		{
+
+			$pdf->SetFont('Arial', 'B', 9);
+			$pdf->setXY($prod_left, $prod_top);
+			$pdf->Cell(10, 8, __("Nr.", "wpsg"), 1, 0, 'C');
+
+			$pdf->setXY($prod_left + 10, $prod_top);
+			$pdf->Cell( ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), 8, "Name", 1, 0, 'L');
+			
+			if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+			{
+			
+				$pdf->setXY($prod_left + 97, $prod_top);
+				$pdf->Cell(15, 8, __("MwSt.", "wpsg"), 1, 0, 'C');
+				
+			}
+			
+			$pdf->setXY($prod_left + 112, $prod_top);
+			$pdf->Cell(15, 8, __("Menge", "wpsg"), 1, 0, 'C');
+						
+			$pdf->setXY($prod_left + 127, $prod_top);
+			$pdf->Cell(25, 8, __("Einzelpreis", "wpsg"), 1, 0, 'R');
+			
+			$pdf->setXY($prod_left + 152, $prod_top);
+			$pdf->Cell(25, 8, __("Gesamtpreis", "wpsg"), 1, 0, 'R');
+			 												
+			$offset = 8;	
+			$bKopf = true;
+			
+		}
+		
+		$pdf->SetFont('Arial', '', 9);
+		$pdf->setXY($prod_left, $prod_top + $offset);
+		
+		if ($this->get_option('wpsg_mod_rechnungen_showanr') == '1')
+		{
+			
+			$pdf->Cell(10, 8, $p['anr'], 0, 0, 'C');
+			
+		}
+		else
+		{
+		
+			$pdf->Cell(10, 8, $pnr.".", 0, 0, 'C');
+			
+		}
+
+		$produkt_text = $this->getProductName($this->getProduktID($p['id']), true);
+		$produktBeschreibung = trim(strip_tags($p['beschreibung']));
+		
+		if ($this->isOtherLang())
+		{ 
+			
+			$trans_db = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `lang_parent` = '".wpsg_q($this->getProduktID($p['id']))."' AND `lang_locale` = '".wpsg_q(get_locale())."'");
+			
+			if (is_array($trans_db) && sizeof($trans_db) > 0)
+			{
+				
+				$produkt_text = $trans_db['name'];
+				$produktBeschreibung = trim(strip_tags($trans_db['beschreibung']));
+				 
+			}
+			
+		}
+		 
+		$height = 0; // HÃ¶he der Zeile fÃŒr den Rahmen
+		
+		$pdf->setXY($prod_left + 10, $prod_top + $offset);
+		
+		// Produktvariablen 
+		if ($this->hasMod('wpsg_mod_productvars') && $this->get_option("wpsg_mod_rechnungen_showpv") == "1")
+		{
+		 
+			$arPV = $this->callMod('wpsg_mod_productvars', 'getAllProductVarValues', array($this->view['data']['id'], $p['product_index']));
+					
+			if (wpsg_isSizedArray($arPV))
+			{
+				
+				foreach ($arPV as $pv) 
+				{
+				
+					$produkt_text .= "\r\n".$pv['name'].': '.$pv['value'];
+					$height += 5;
+					
+				}
+				
+			}
+			
+		}
+
+		$produkt_text_cell_width = 102;
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+			$produkt_text_cell_width = 87;	
+		}
+		
+		$produkt_text_width = $pdf->GetStringWidth($produkt_text);
+		//$produkt_text_cell_width = (($this->arMwSt == "-1")?87:102);
+		
+		$height += 5 * ceil($produkt_text_width / $produkt_text_cell_width) + 3;
+		
+		$height_y = $pdf->getY();
+		$height = 2 + $pdf->MultiCell($prod_left + 10, $prod_top + $offset + 1.5, 5, utf8_encode($produkt_text), 0, 'L', 0, $produkt_text_cell_width);
+		
+		//$height += 3 + 5 + $pdf->getY() - $height_y;
+		//$pdf->Cell((($this->arMwSt == "-1")?102:87), 8, $produkt_text, 0, 0, 'L');
+
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+		
+			$pdf->setXY($prod_left + 97, $prod_top + $offset);		
+			$pdf->Cell(15, 8, (($this->view['basket']['noMwSt'] == '1')?'0.00 %':wpsg_ff($p['mwst_value'], '%')), 0, 0, 'C');
+			
+		}
+		
+		$pdf->setXY($prod_left + 112, $prod_top + $offset);
+		$pdf->Cell(15, 8, $p['menge'], 0, 0, 'C');
+		
+		// Preis eines Produktes
+		if ($this->view['basket']['noMwSt'] == '1')
+		{
+			
+			// Innergemeinschaftliche Lieferung, hier Netto Preis
+			$preis = $p['preis_netto'];
+			
+		}
+		else
+		{
+			
+			if ($this->getFrontendTaxview() == WPSG_BRUTTO || $this->get_option('wpsg_kleinunternehmer') == '1')
+			{
+				$preis = $p['preis_brutto'];
+			}
+			else
+			{
+				$preis = $p['preis_netto'];			
+			}
+			
+		}
+		
+		$pdf->setXY($prod_left + 127, $prod_top + $offset);
+		$pdf->Cell(25, 8, wpsg_ff($preis, $this->get_option('wpsg_currency')), 0, 0, 'R');
+		
+		$pdf->setXY($prod_left + 152, $prod_top + $offset);
+		$pdf->Cell(25, 8, wpsg_ff($preis * $p['menge'], $this->get_option('wpsg_currency')), 0, 0, 'R');		
+
+		/**
+		 * Produktbeschreibung anzeigen Ja/Nein
+		 */
+		$pBeschreibungHeight = 0;
+		if ($this->get_option("wpsg_rechnungen_pbeschreibung") == "1" && trim(strip_tags($p['beschreibung'])) != '')
+		{
+			
+			$produktBeschreibung = nl2br($produktBeschreibung);			
+			preg_match_all('/\<br \/\>/', $produktBeschreibung, $treffer);
+			$produktBeschreibung = strip_tags($produktBeschreibung);
+			
+			$pBeschreibungWidth = $pdf->getStringWidth($produktBeschreibung); 
+			$pBeschreibungHeight = 5 * (ceil($pBeschreibungWidth / $produkt_text_cell_width) + @sizeof($treffer[0]));
+			
+			$pdf->SetFont('Arial', 'I', 9);
+			
+			$cellY = $pdf->getY();
+			$pdf->MultiCell($prod_left + 10, $prod_top + $height + $offset - 1, 5, utf8_encode($produktBeschreibung), 0, 'L', 0, $produkt_text_cell_width);			
+			$pBeschreibungHeight = $pdf->getY() - $cellY - $height + 1;
+			$pdf->SetFont('Arial', '', 9);
+			
+		} 
+					
+		$height += $pBeschreibungHeight;
+				
+		/**
+		 * Variante ? 
+		 */
+		if (preg_match('/vp_(.*)/', $p['productkey']))
+		{
+			
+			$variInfo = $this->callMod('wpsg_mod_varianten', 'getVariantenInfoArray', array($p['productkey']));
+
+			$height += $pdf->MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, utf8_encode(wpsg_translate(__('Variante: #1#', 'wpsg'), $variInfo['key'])), 0, 'L', 0, $produkt_text_cell_width);			
+			
+			//$height += 5;
+			
+		}
+		
+		if ($this->hasMod('wpsg_mod_deliverynote'))
+		{
+			
+			$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($this->view['data']['id']));
+			
+			if (sizeof($arDN_order) > 1)
+			{
+				
+				$deliveryTimeProduct = $this->callMod('wpsg_mod_deliverynote', 'getProductDeliveryTime', array($this->view['data']['id'], $p['product_index'])); 
+				
+				if ($deliveryTimeProduct !== false)
+				{
+				
+					$height += $pdf->MultiCell($prod_left + 10, $prod_top + $height + $offset - 0.5, 5, utf8_encode(wpsg_translate(__('Lieferdatum: #1#', 'wpsg'), date('d.m.Y', $deliveryTimeProduct))), 0, 'L', 0, $produkt_text_cell_width);
+					
+				}
+									
+			}
+			
+		}
+		
+		// Jetzt die Rahmen zeichnen
+		$pdf->Rect($prod_left, $prod_top + $offset, 10, $height);
+		
+		$pdf->Rect($prod_left + 10, $prod_top + $offset, ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), $height);
+		
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+		
+			$pdf->Rect($prod_left + 97, $prod_top + $offset, 15, $height);
+			
+		}
+		
+		$pdf->Rect($prod_left + 112, $prod_top + $offset, 15, $height);
+		$pdf->Rect($prod_left + 127, $prod_top + $offset, 25, $height);
+		$pdf->Rect($prod_left + 152, $prod_top + $offset, 25, $height);
+		
+		$offset += $height;
+		 		
+		$pnr ++;
+		$count ++;
+				
+		$summe += $p['price'] * $p['menge'];
+		
+		if ($pdf->getY() > 220 || ($count >= $prod_break && sizeof($this->view['basket']['produkte']) > ($pnr - 1)))		
+		{
+			
+			AddRechnungPage($this, $pdf);
+			$bKopf = false; $offset = 0; $count = 0;
+			
+		}
+		
+	} // produkte
+ 
+	// Gutschein
+	if (isset($this->view['basket']['gs']))
+	{
+		
+		$pdf->SetFont('Arial', '', 9);
+		$pdf->setXY($prod_left, $prod_top + $offset);
+		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
+
+		$pdf->setXY($prod_left + 10, $prod_top + $offset);
+		$pdf->Cell( ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), 8, wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $this->view['basket']['gs']['code']), 1, 0, 'L');
+		
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+		
+			$mwst = __('anteilig', 'wpsg');
+				
+			$pdf->setXY($prod_left + 97, $prod_top + $offset);
+			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
+			
+		}
+		
+		$pdf->setXY($prod_left + 112, $prod_top + $offset);
+		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
+					
+		/*
+		if ($this->view['basket']['gs']['calc'] == 'w')
+		{
+			
+			$gs_value_einzel = '-'.wpsg_ff($this->view['basket']['gs']['value'], $this->get_option('wpsg_currency'));
+			$gs_value_gesamt = '-'.wpsg_ff($this->view['basket']['gs']['value'], $this->get_option('wpsg_currency'));
+			
+		}
+		else if ($this->view['basket']['gs']['calc'] == 'p')
+		{
+			
+			$gs_value_einzel = '-'.wpsg_ff($this->view['basket']['gs']['value'], '%');
+			$gs_value_gesamt = '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency'));
+			
+		}
+		*/
+		
+		$gs_value_einzel = '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency'));
+		$gs_value_gesamt = '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency'));
+		
+		$pdf->setXY($prod_left + 127, $prod_top + $offset);
+		$pdf->Cell(25, 8, $gs_value_einzel, 1, 0, 'R');
+		
+		$pdf->setXY($prod_left + 152, $prod_top + $offset);
+		$pdf->Cell(25, 8, $gs_value_gesamt, 1, 0, 'R');
+		 												
+		$offset += 8; 
+		
+	} 
+	
+	// Versandkosten
+	if ($this->view['basket']['sum']['preis_shipping'] != '' && $this->view['basket']['sum']['preis_shipping'] != 0)
+	{
+			 
+		$pdf->SetFont('Arial', '', 9);
+		$pdf->setXY($prod_left, $prod_top + $offset);
+		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
+
+		$pdf->setXY($prod_left + 10, $prod_top + $offset);
+		$pdf->Cell( ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), 8, wpsg_translate(__('Versandkosten "#1#"', 'wpsg'), $this->view['oOrder']->getShippingTypName()), 1, 0, 'L');
+		
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+		
+			if ($this->arShipping[$this->view['data']['type_shipping']]['mwst_null'] == '1' && $this->view['basket']['noMwSt'] == '1')
+			{
+				
+				$mwst = 0;
+				
+			}
+			else
+			{
+	 
+				if (isset($this->view['basket']['shipping']['tax_rata']) && $this->view['basket']['shipping']['tax_rata'] === true)
+				{
+					
+					$mwst = __('anteilig', 'wpsg');
+											
+				}
+				else
+				{
+					
+					$mwst = wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value'], '%');
+					
+				}
+				
+				/*
+				if ($this->arShipping[$this->view['data']['type_shipping']]['mwst'] == '0')
+				{
+
+					$mwst = __('anteilig', 'wpsg');
+					
+				}
+				else
+				{
+				
+					$mwst = wpsg_ff($this->arShipping[$this->view['data']['type_shipping']]['mwst_value'], '%');
+					
+				}
+				*/
+				
+			}
+			
+			$pdf->setXY($prod_left + 97, $prod_top + $offset);
+			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
+ 	
+		}
+		
+		$pdf->setXY($prod_left + 112, $prod_top + $offset);
+		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
+					
+		$pdf->setXY($prod_left + 127, $prod_top + $offset);
+		$pdf->Cell(25, 8, wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+		
+		$pdf->setXY($prod_left + 152, $prod_top + $offset);
+		$pdf->Cell(25, 8, wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+		 												
+		$offset += 8;
+
+		// Zusammengesetzte Versandarten darstellen
+		/*
+		if (wpsg_isSizedArray($this->view['basket']['shipping']['methods'])) {
+		
+			foreach ($this->view['basket']['shipping']['methods'] as $shipping) {
+					
+				$pdf->SetFont('Arial', '', 9);
+				$pdf->setXY($prod_left, $prod_top + $offset);
+				$pdf->Cell(10, 8, '', 1, 0, 'C'); $pnr ++;
+					
+				$pdf->setXY($prod_left + 10, $prod_top + $offset);
+				$pdf->Cell( ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), 8, $this->getShippingName($shipping), 1, 0, 'L');
+					
+				if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+				{
+				
+					if ($this->view['basket']['shipping'][$shipping]['tax_rata'] == 1) { $mwst = __('Anteilig', 'wpsg'); }
+					else { $mwst = wpsg_ff($this->view['basket']['shipping'][$shipping]['mwst'], '%'); }
+					
+					$pdf->setXY($prod_left + 97, $prod_top + $offset);
+					$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
+					
+				}
+				
+				$pdf->setXY($prod_left + 112, $prod_top + $offset);
+				$pdf->Cell(15, 8, '1', 1, 0, 'C');
+					
+				$pdf->setXY($prod_left + 127, $prod_top + $offset);
+				$pdf->Cell(25, 8, wpsg_ff($this->view['basket']['shipping'][$shipping]['preis_shipping_brutto'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+				
+				$pdf->setXY($prod_left + 152, $prod_top + $offset);
+				$pdf->Cell(25, 8, wpsg_ff($this->view['basket']['shipping'][$shipping]['preis_shipping_brutto'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+					
+				$offset += 8;
+				
+			}
+		
+		}
+		*/
+			
+		
+	}
+	
+	// Zahlungskosten
+	if ($this->view['basket']['sum']['preis_payment'] != '' && $this->view['basket']['sum']['preis_payment'] != 0)
+	{
+		
+		$pdf->SetFont('Arial', '', 9);
+		$pdf->setXY($prod_left, $prod_top + $offset);
+		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
+
+		$pdf->setXY($prod_left + 10, $prod_top + $offset);
+		$pdf->Cell( ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), 8, $this->arPayment[$this->view['data']['type_payment']]['name'], 1, 0, 'L');
+		
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+		
+			if ($this->arPayment[$this->view['data']['type_payment']]['mwst_null'] == '1' && $this->view['basket']['noMwSt'] == '1')
+			{
+				$mwst = 0;
+			}
+			else
+			{ 
+				
+				if (isset($this->view['basket']['payment']['tax_rata']) && $this->view['basket']['payment']['tax_rata'] === true)
+				{
+						
+					$mwst = __('anteilig', 'wpsg');
+						
+				}
+				else
+				{
+						
+					$mwst = wpsg_ff($this->arPayment[$this->view['basket']['checkout']['payment']]['mwst_value'], '%');
+						
+				}
+				
+				/*
+				if ($this->arPayment[$this->view['data']['type_payment']]['mwst'] == '0')
+				{
+
+					$mwst = __('anteilig', 'wpsg');
+					
+				}
+				else
+				{
+				
+					$mwst = wpsg_ff($this->arPayment[$this->view['data']['type_payment']]['mwst_value'], '%');
+					
+				}
+				*/
+				
+			}
+			
+			$pdf->setXY($prod_left + 97, $prod_top + $offset);
+			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
+			
+		}
+		
+		$pdf->setXY($prod_left + 112, $prod_top + $offset);
+		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
+					
+		$pdf->setXY($prod_left + 127, $prod_top + $offset);
+		$pdf->Cell(25, 8, wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+		
+		$pdf->setXY($prod_left + 152, $prod_top + $offset);
+		$pdf->Cell(25, 8, wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+		 												
+		$offset += 8;
+		
+	}
+		 	 
+	// GebÃŒhr
+	if (wpsg_tf($this->view['storno_fee']) > 0)
+	{
+		
+		$pdf->SetFont('Arial', '', 9);
+		$pdf->setXY($prod_left, $prod_top + $offset);
+		$pdf->Cell(10, 8, $pnr.'.', 1, 0, 'C'); $pnr ++;
+
+		$label = __('BearbeitungsgebÃŒhr', 'wpsg');
+
+		if (strpos($this->view['storno_fee'], '%') !== false) $label .= ' ('.wpsg_ff($this->view['storno_fee'], '%').')';
+		
+		$pdf->setXY($prod_left + 10, $prod_top + $offset);
+		$pdf->Cell( ((sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')?87:102), 8, $label, 1, 0, 'L');
+		
+		if (sizeof($this->view['basket']['mwst']) >= 1 || $this->get_option('wpsg_showMwstAlways') == '1')
+		{
+		
+			if ($this->view['basket']['noMwSt'] == '1')
+			{
+				$mwst = 0;
+			}
+			else
+			{ 
+				
+				
+				$mwst = wpsg_ff($this->view['storno_fee_tax_value'], '%');
+				
+			}
+			
+			$pdf->setXY($prod_left + 97, $prod_top + $offset);
+			$pdf->Cell(15, 8, $mwst, 1, 0, 'C');
+			
+		}
+		
+		$pdf->setXY($prod_left + 112, $prod_top + $offset);
+		$pdf->Cell(15, 8, '1', 1, 0, 'C');		
+					
+		$pdf->setXY($prod_left + 127, $prod_top + $offset);
+		$pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+		
+		$pdf->setXY($prod_left + 152, $prod_top + $offset);
+		$pdf->Cell(25, 8, '-'.wpsg_ff($this->view['storno_fee_value'], $this->get_option('wpsg_currency')), 1, 0, 'R');
+		 												
+		$offset += 8;
+		
+	}
+	
+	$pdf->SetFont('Arial', '', 9);
+	
+	if ($this->view['kunde']['ustidnr'] != "")
+	{
+		$offset += 10;
+		$pdf->Text($prod_left, $prod_top + $offset, __("Ihre Umsatzsteuer-Identifikationsnummer:", "wpsg"));
+		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+		$pdf->Cell(37, 8, $this->view['kunde']['ustidnr'], 0, 0, 'R');
+	}
+	
+	$offset += 10;
+	if ($this->get_option('wpsg_kleinunternehmer'))
+	{
+
+		$pdf->Text($prod_left, $prod_top + $offset, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
+		$pdf->Text($prod_left + 100, $prod_top + $offset, __("Summe", "wpsg"));
+		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+		$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'] + $this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+		$offset += 5;
+		
+	}
+	else
+	{
+		
+		if ($this->view['basket']['noMwSt'] == '1')
+		{
+			
+			$pdf->Text($prod_left, $prod_top + $offset, __("Es ergibt sich folgender Gesamtbetrag", "wpsg").':');
+			$pdf->Text($prod_left + 100, $prod_top + $offset, __("BRUTTOBETRAG", "wpsg"));
+			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['sum']['preis_gesamt_netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+			$offset += 5;
+			
+			$pdf->Text($prod_left + 100, $prod_top + $offset, __("MwSt. GESAMT", "wpsg"));
+			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+			$pdf->Cell(37, 8, wpsg_ff(0, $this->get_option('wpsg_currency')), 0, 0, 'R');
+					
+		}
+		else  
+		{
+			
+			$pdf->Text($prod_left, $prod_top + $offset, __("Der Gesamtbetrag setzt sich wie folgt zusammen", "wpsg"));
+				 
+			$pdf->Text($prod_left + 100, $prod_top + $offset, __("NETTOBETRAG", "wpsg"));
+			$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+			$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['sum']['preis_gesamt_netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+							
+			if (sizeof($this->view['basket']['mwst']) >= 1)
+			{
+				
+				foreach ($this->view['basket']['mwst'] as $mw)
+				{
+					
+					$offset += 5;
+					$pdf->Text($prod_left + 100, $prod_top + $offset, __("MwSt. ", "wpsg").wpsg_ff($mw['value'], '%'));
+					$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+					$pdf->Cell(37, 8, wpsg_ff($mw['sum'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+					
+				}
+				
+			}
+		 	
+			if (sizeof($this->view['basket']['mwst']) > 1)
+			{
+				
+				$offset += 5;
+				$pdf->Text($prod_left + 100, $prod_top + $offset, __("MwSt. GESAMT", "wpsg"));
+				$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+				$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'] - $this->view['basket']['sum']['preis_gesamt_netto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+			
+			}
+	
+		} 
+		
+	}
+	
+	// Rabatt
+	if ($this->view['basket']['sum']['preis_rabatt'] > 0)
+	{
+		
+		$offset += 5;
+		
+		$pdf->Text($prod_left + 100, $prod_top + $offset, __("Rabatt", "wpsg"));
+		$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+		$pdf->Cell(37, 8, '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+		
+	}
+	 
+	$offset += 5;
+	$pdf->Text($prod_left + 100, $prod_top + $offset, __("SUMME", "wpsg"));
+	$pdf->setXY($prod_left + 140, $prod_top + $offset - 5);
+	$pdf->Cell(37, 8, wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), 0, 0, 'R');
+
+	if ($this->get_option('wpsg_kleinunternehmer') == '1')
+	{
+ 
+		$pdf->MultiCell($prod_left - 1, $prod_top + $offset + 5, 5, utf8_encode($this->get_option('wpsg_kleinunternehmer_text'))); 
+		$offset += 15;
+		
+	}
+	
+	if ($this->hasMod('wpsg_mod_deliverynote'))
+	{
+		
+		$arDN_order = $this->callMod('wpsg_mod_deliverynote', 'loadDeliveryNotesFromOrder', array($this->view['data']['id']));
+		$delivery_date = $this->callMod('wpsg_mod_deliverynote', 'getDeliveryTime', array($this->view['data']['id']));
+		
+		// Wenn es ein Gesamtlieferdatum gibt und nur einen Lieferschein, dann unter der Bestellung anzeigen
+		if ($delivery_date !== false && sizeof($arDN_order) == 1)
+		{
+			
+			$offset += 10; 
+			
+			$pdf->MultiCell($prod_left, $prod_top + $offset, 5, utf8_encode(
+				wpsg_translate(__('Lieferung: #1#', 'wpsg'), date('d.m.Y', $delivery_date))
+			));
+
+			$offset += 5;
+			
+		}
+		
+	}
+	
+	$offset += 5;
+	
+	if ($this->view['fussText'] != "")
+	{
+	
+		$pdf->MultiCell($prod_left - 1, $prod_top + $offset, 5, utf8_encode($this->view['fussText']));
+		$pdf->SetFont('Arial', 'B', 9);
+		$offset += 10;	
+		
+	}
+	
+	$shipping_adress = false;
+
+	if ($this->hasMod('wpsg_mod_shippingadress') && $this->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array('k_id' => $this->view['data']['k_id'], 'o_id' => $this->view['data']['id'])))
+	{
+ 
+		$pdf->setFont('Arial', 'B', 9);
+		$pdf->Text($prod_left, $prod_top + $offset, __("Lieferanschrift", "wpsg").":");
+		$offset += 5;
+		
+		$pdf->setFont('Arial', '', 9);		
+		
+		$shipping_adress = "";
+		if ($this->view['data']['shipping_firma'] != "")
+		{
+			$shipping_adress .= $this->view['data']['shipping_firma']."\r\n";
+		}
+		$shipping_adress .= $this->view['data']['shipping_vname'].' '.$this->view['data']['shipping_name']."\r\n";
+		$shipping_adress .= $this->view['data']['shipping_strasse']."\r\n";
+		//$shipping_adress .= $this->view['data']['shipping_land']['kuerzel'].'-';
+		
+		$shipping_adress .= $this->view['data']['shipping_plz'].' '.$this->view['data']['shipping_ort']."\r\n";
+		$shipping_adress .= $this->view['data']['shipping_land']['name'];
+		
+		
+		$start = $pdf->getY();
+		$pdf->MultiCell($prod_left - 1, $prod_top + $offset, 5, utf8_encode($shipping_adress), 0, 'L', 0, 100);
+		$offset += $pdf->getY() - $start;
+		
+		$shipping_adress = true;
+		
+	}
+		
+	
+	$offset += 5;
+	 
+	// Bestellvariablen
+	if ($this->hasMod('wpsg_mod_ordervars') && $this->get_option('wpsg_mod_rechnungen_showov') == '1')
+	{
+		
+		$bvars = @unserialize($this->view['data']['bvars']);		
+		if (!is_array($bvars)) $bvars = array();
+		
+		$strBVars = "";
+		foreach ($bvars as $bvars_id => $bvars_value)
+		{
+				
+			$bvars = $this->db->fetchRow("SELECT * FROM `".wpsg_q(WPSG_TBL_ORDERVARS)."` WHERE `id` = '".wpsg_q($bvars_id)."'");
+			
+			if ($bvars['typ'] == "1") // Auswahl
+			{
+				if ($bvars_value <= 0) $bvars_value = __("Keine Angabe", "wpsg");
+			}
+			else if ($bvars['typ'] == "2") // Texteingabe
+			{
+				if (trim($bvars_value) == "") $bvars_value = __("Keine Angabe", "wpsg");
+			}
+			else if ($bvars['typ'] == "3") // Checkbox
+			{
+				if ($bvars_value <= 0) $bvars_value = __("Keine Angabe", "wpsg");					
+			}
+			
+			$bvars_name = $this->callMod('wpsg_mod_ordervars', 'getNameById', array($bvars_id));			
+			$strBVars .= "\r\n".$bvars_name.": ".$bvars_value;	
+			
+		}
+		
+		$pdf->SetFont('Arial', 'B', 9);	
+		$pdf->Text($prod_left, $prod_top + $offset, __("Angaben wÃ€hrend der Bestellung", "wpsg").":");
+		$pdf->SetFont('Arial', '', 9);
+		$pdf->MultiCell($prod_left - 1, $prod_top + $offset, 5, utf8_encode($strBVars));
+		
+	}  
+	
+	if (!file_exists($this->callMod('wpsg_mod_rechnungen', 'getFilePath', array($this->view['data']['id']))))
+	{
+		
+		mkdir($this->callMod('wpsg_mod_rechnungen', 'getFilePath', array($this->view['data']['id'])), 0777, true);
+		
+	}
+	
+	$this->callMods('wpsg_mod_rechnungen_pdf', array(&$pdf, &$this->view['data']['id'], &$this->view['preview'], &$this->view['invoice']));
+	
+	$filename = $this->view['filename'].".pdf";
+	 
+	if ($this->view['preview'])
+	{
+		$pdf->Output($filename, 'I');
+	}
+	else
+	{
+		
+		$pdf->Output($this->callMod('wpsg_mod_rechnungen', 'getFilePath', array($this->view['data']['id'])).$filename, 'F');
+		
+		// Hier wird der Dateiname an FPD ÃŒbergeben. Er soll sich aus der Rechnungsnummer ergeben, auch wenn das Dokument ÃŒber die ID gespeichert ist.
+		if ($this->view['output'] === true) $pdf->Output($this->view['filename_out'], 'I');
+			
+	} 
+	 
+?>
Index: /views/mods/mod_rechnungen/rechnungsmail.phtml
===================================================================
--- /views/mods/mod_rechnungen/rechnungsmail.phtml	(revision 5261)
+++ /views/mods/mod_rechnungen/rechnungsmail.phtml	(revision 5261)
@@ -0,0 +1,16 @@
+<?php 
+
+	/**
+	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann
+	 */
+
+	//wpsg_debug($this->view);
+
+?><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,
+		
+<?php echo __("Sie erhalten hiermit die Rechnung in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.
+<?php $this->callMods('wpsg_mod_rechnungen_mail'); ?>
+ 
+<?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?>
+ 
+<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: /views/mods/mod_rechnungen/rechnungsmail_html.phtml
===================================================================
--- /views/mods/mod_rechnungen/rechnungsmail_html.phtml	(revision 5261)
+++ /views/mods/mod_rechnungen/rechnungsmail_html.phtml	(revision 5261)
@@ -0,0 +1,20 @@
+<?php 
+
+	/**
+	 * Template fÃŒr die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann (HTML)
+	 */
+
+	/* Wichtig, da die Module sonst kein HTML zurÃŒckgeben */
+	$this->htmlMail = true;
+
+	//wpsg_debug($this->view);
+
+?><p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
+		
+<p><?php echo __("Sie erhalten hiermit die Rechnung in HÃ¶he von", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?> <?php echo __("fÃŒr Ihre Bestellung mit der Bestellnummer", "wpsg"); ?> <?php echo ((trim($this->view['data']['onr']) != '')?$this->view['data']['onr']:$this->view['data']['o_id']); ?>.</p>
+
+<?php $this->callMods('wpsg_mod_rechnungen_mail'); ?>
+ 
+<p><?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?></p>
+ 
+<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: /views/mods/mod_rechnungen/settings_edit.phtml
===================================================================
--- /views/mods/mod_rechnungen/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_rechnungen/settings_edit.phtml	(revision 5261)
@@ -5,122 +5,119 @@
 	 */
 
-	use horstoeko\zugferd\ZugferdProfiles;
-
-    $ArrZugferdProfile = [
-        0 =>     __('Keine E-Rechnungsdaten erzeugen', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_MINIMUM => __('EN16931 Minimum', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_BASIC => __('EN16931 Basic', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_BASICWL => __('EN16931 Basic WL', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_EN16931 => __('EN16931 Comfort', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_EXTENDED => __('EN16931 Extended', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_XRECHNUNG => __('EN16931 XRechnung 1', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_XRECHNUNG_2 => __('EN16931 XRechnung 2', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_XRECHNUNG_2_1 => __('EN16931 XRechnung 2.1', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_XRECHNUNG_2_2 => __('EN16931 XRechnung 2.2', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_XRECHNUNG_2_3 => __('EN16931 XRechnung 2.3', 'wpsg'),
-        100 + ZugferdProfiles::PROFILE_XRECHNUNG_3 => __('EN16931 XRechnung 3', 'wpsg'),
-    ]
+?>
+<script type="text/javascript">
+
+	/**
+	 * Wird beim anlegen einer neuen FuÃzeile aufgerufen
+	 */ 
+	function wpsg_addFooter()
+	{
 	
-?>
-
-<div>
-	<ul class="nav nav-tabs" role="tablist">
-		<li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Vordefinierte Textfelder', 'wpsg'); ?></a></li>
-		<li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('FuÃzeile', 'wpsg'); ?></a></li>
-		<li role="presentation"><a href="#tab3" aria-controls="messages" role="tab" data-toggle="tab"><?php echo __('Sonstiges', 'wpsg'); ?></a></li>
-	</ul>
-	<div class="tab-content">
-		<div id="tab1" role="tabpanel" class="tab-pane active" >
-
+		jQuery('#foottext_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=add&noheader=1',
+			success: function(data) {
+				jQuery('#foottext_list').html(data);
+			}
+		} );
+
+		return false;
+	
+	} // function wpsg_addFooter()
+
+	/**
+	 * Wird beim entfernen einer FuÃzeile aufgerufen
+	 */
+	function wpsg_removeFooter(foot_id)
+	{
+
+		if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese FuÃzeile lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+		
+		jQuery('#foottext_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=removeFooter&noheader=1',
+			data: {
+				foot_id: foot_id
+			},
+			success: function(data) {
+				jQuery('#foottext_list').html(data);
+			}
+		} );
+
+		return false;
+		
+	} // function wpsg_removeFooter()
+
+</script>
+
+<br />
+<div class="wpsg_admin_box" id="wpsg_tab">	
+	<div class="head">
+		<div class="title">
+			<div class="tab" id="tab1"><?php echo __('Vordefinierte Textfelder', 'wpsg'); ?></div>
+			<div class="tab" id="tab2"><?php echo __('FuÃzeile', 'wpsg'); ?></div>			
+			<div class="tab" id="tab3"><?php echo __('Sonstiges', 'wpsg'); ?></div>
+			<div class="tabcontent tablink">
+				<a href="" title="<?php echo __('Neues Feld fÃŒr die FuÃzeile hinzufÃŒgen', 'wpsg'); ?>" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addFooter();"></a>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+	<div class="content" id="wpsg_mwst_list">
+		
+		<div id="tabcontent1" class="tabcontent">
+			
 			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_adresszeile', __('Adresszeile', 'wpsg'), $this->get_option('wpsg_rechnungen_adresszeile')); ?>
-			
-			<hr>
-
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			<div style="position:relative;">
-				<?php if ($this->view['bp'] === false) { ?>
+			<div class="wpsg_hinweis"><?php echo __('Diese Zeile wird klein oberhalb der Kundenadresse platziert', 'wpsg'); ?></div>
+			<br />
+			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Briefpapier (PDF/JPG)', 'wpsg'); ?>:</label><br />
+					<?php if ($this->view['bp'] !== false) { ?>
+					<label>
+						<input type="checkbox" name="wpsg_rechnungen_bp_del" value="1" />&nbsp;<?php echo __('LÃ¶schen', 'wpsg'); ?>
+					</label>
+					<?php } ?>
+				</div>
+				<div class="wpsg_form_right">
+					<?php if ($this->view['bp'] === false) { ?>
 					<p><?php echo __('Es wurde bisher kein Briefpapier hochgeladen', 'wpsg'); ?></p>
-				<?php } else { ?>
-					<a href="<?php 
-					
-						echo wpsg_admin_url('Admin', 'module', ['do' => 'orderAjax', 'modul' => 'wpsg_mod_rechnungen', 'module_action' => 'getBp'], ['noheader' => '1']);
-					
-					?>" target="_blank"><?php echo __('Derzeitiges Briefpapier', 'wpsg'); ?></a>
-				<?php } ?>
-				<a style="float:right; position:relative;" class="glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_bp" data-wpsg-tip="mod_rechnung_bp" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_bp"></a>
-				<input type="file" name="wpsg_rechnungen_bp">
-				<?php $strSuffix = ''; if ($this->view['bp'] !== false) { $strSuffix = '
-                    <label>
-						<input type="checkbox" name="wpsg_rechnungen_bp_del" value="1" />&nbsp;'.__('LÃ¶schen', 'wpsg').'
-					</label>';
-					echo __($strSuffix);
-				} ?>
-			</div>
-			<?php echo wpsg_drawForm_TextEnd(__('Briefpapier (PDF/JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_rechnungen_bp')); ?>
-				
-			<hr>	
-				
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			<div style="position:relative;">
-				<?php if ($this->view['logo'] === false) { ?>
+					<?php } else { ?>
+					<a href="<?php echo $this->view['bp']; ?>" target="_blank"><?php echo __('Derzeitiges Briefpapier', 'wpsg'); ?></a>
+					<?php } ?>	
+					<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_bp" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_bp"></a>				
+					<input type="file" name="wpsg_rechnungen_bp">
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Logo (JPG)', 'wpsg'); ?>:</label><br />
+					<?php if ($this->view['logo'] !== false) { ?>
+					<label>
+						<input type="checkbox" name="wpsg_rechnungen_logo_del" value="1" />&nbsp;<?php echo __('LÃ¶schen', 'wpsg'); ?>
+					</label>
+					<?php } ?>
+				</div>
+				<div class="wpsg_form_right">
+					<?php if ($this->view['logo'] === false) { ?>
 					<p><?php echo __('Es wurde bisher kein Logo hochgeladen', 'wpsg'); ?></p>
-				<?php } else { ?>
-					<a href="<?php
-						
-						echo wpsg_admin_url('Admin', 'module', ['do' => 'orderAjax', 'modul' => 'wpsg_mod_rechnungen', 'module_action' => 'getLogo'], ['noheader' => '1']);
-						
-					?>" target="_blank"><?php echo __('Derzeitiges Logo', 'wpsg'); ?></a>
-				<?php } ?>
-				<a style="float:right; position:relative;" class="glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_logo" data-wpsg-tip="mod_rechnung_logo" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_logo"></a>
-				<input type="file" name="wpsg_rechnungen_logo">
-
-				<?php $logo_pos = $this->get_option("wpsg_rechnungen_logo_position"); ?>
-				<?php $defaultAlign = !isset($logo_pos) || empty($logo_pos) ? "align-buttons-active" : ""; ?>
-
-				<?php $alignLeft = $logo_pos === 'left' ? "align-buttons-active" : ""; ?>
-				<?php $alignCenter = $logo_pos === 'center' ? "align-buttons-active" : ""; ?>
-				<?php $alignRight = $logo_pos === 'right' ? "align-buttons-active" : ""; ?>
-
-				<?php $logo_transparency = $this->get_option("wpsg_rechnungen_logo_transparency") ?: "100%"; ?>
-
-				<?php $strSuffix = ''; if ($this->view['logo'] !== false) { $strSuffix = '
-					<div class="row">
-						<div class="col-md-4">
-							<div class="align-buttons">
-								<input type="input" data-toggle="tooltip" class="logo-align-button logo-align-button-left '.$alignLeft.'" name="wpsg_rechnungen_logo_position_left" value="&#xf036" onclick="handleLogoAlignClick(jQuery(this))" onkeydown="return false;" onfocus="return false;" autocomplete="off" title="'.__("Logo linksbÃŒndig ausrichten").'">
-								<input type="input" data-toggle="tooltip" class="logo-align-button logo-align-button-center '.$alignCenter.'" name="wpsg_rechnungen_logo_position_center" value="&#xf037" onclick="handleLogoAlignClick(jQuery(this))" onkeydown="return false;" onfocus="return false;" autocomplete="off" title="'.__("Logo zentrieren").'">
-								<input type="input" data-toggle="tooltip" class="logo-align-button logo-align-button-right '.$alignRight.' '.$defaultAlign.'" name="wpsg_rechnungen_logo_position_right" value="&#xf038" onclick="handleLogoAlignClick(jQuery(this))" onkeydown="return false;" onfocus="return false;" autocomplete="off" title="'.__("Logo rechtsbÃŒndig ausrichten").'">
-							</div>
-						</div>
-						<div class="col-md-8 logo-transparency">
-							<label>
-								<input type="text" name="wpsg_rechnungen_logo_transparency" value="'.$logo_transparency.'" />&nbsp;'.__('Logodeckkraft', 'wpsg').'
-							</label>		
-						</div>
-						<div class="col-md-12">
-							<label>
-								<input type="checkbox" name="wpsg_rechnungen_logo_del" value="1" />&nbsp;'.__('LÃ¶schen', 'wpsg').'
-							</label>	
-						</div>
-					</div>';
-					echo __($strSuffix);
-				} ?>
-
-			<button class="button wpsg_rechnungen_preview" style="float:right; margin-right:10px;" name="wpsg_rechnungen_preview" type="button">
-				<?php echo __("Vorschau", "wpsg"); ?>
-			</button>
-
-			</div>
-			<?php echo wpsg_drawForm_TextEnd(__('Logo (JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_rechnungen_bp')); ?>
-
-
-			<!--
-			<div class="wpsg_hinweis"><?php echo __('Das Briefpapier wird hinter die gesamte Seite gelegt, das Logo wird standardmÃ€Ãig rechts oben auf jeder Seite platziert. (96 dpi)', 'wpsg'); ?></div>
-			<br />
--->			
-			<hr> 
-			
-			<table class="table table-body-striped wpsg_mod_deliverynote_fieldtable">
-				<thead>
+					<?php } else { ?>
+					<a href="<?php echo $this->view['logo']; ?>" target="_blank"><?php echo __('Derzeitiges Logo', 'wpsg'); ?></a>
+					<?php } ?>
+					<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_logo" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_logo"></a>				
+					<input type="file" name="wpsg_rechnungen_logo">
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			
+			<div class="wpsg_hinweis"><?php echo __('Das Briefpapier wird hinter die gesamte Seite gelegt, das Logo wird rechts oben auf jeder Seite platziert. (96 dpi)', 'wpsg'); ?></div>
+			<br />
+			
+			<table class="wpsg_mod_rechnungen_fieldtable">
 				<tr>
 					<th class="col_bezeichnung"><?php echo __('Bezeichnung', 'wpsg'); ?></th>
@@ -132,109 +129,62 @@
 					<th class="col_action"></th>
 				</tr>
-				</thead>
-				<tbody>
 				<?php foreach ($this->view['fields'] as $f => $field_name) { ?>
-					<tr>
-						<td><?php echo wpsg_getStr($field_name); ?></td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][text]" value="<?php echo wpsg_getStr($this->view['arTexte'][$f]['text']); ?>" />
-						</td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][x]" value="<?php echo wpsg_getStr($this->view['arTexte'][$f]['x']); ?>" />
-						</td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][y]" value="<?php echo wpsg_getStr($this->view['arTexte'][$f]['y']); ?>" />
-						</td>
-						<td>
-							<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][color]" value="<?php echo wpsg_getStr($this->view['arTexte'][$f]['color']); ?>" />
-						</td>
-						<td>
-							<select name="text[<?php echo $f; ?>][fontsize]" style="width:100%;">
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "8")?'selected="selected"':''); ?> value="8">8</option>
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "9")?'selected="selected"':''); ?> value="9">9</option>
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "10")?'selected="selected"':''); ?> value="10">10</option>
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "11")?'selected="selected"':''); ?> value="11">11</option>
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "12")?'selected="selected"':''); ?> value="12">12</option>
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "13")?'selected="selected"':''); ?> value="13">13</option>
-								<option <?php echo ((wpsg_getStr($this->view['arTexte'][$f]['fontsize']) == "14")?'selected="selected"':''); ?> value="14">14</option>
-
-							</select>
-						</td>
-						<td>
-							<label><input type="checkbox" value="1" name="text[<?php echo $f; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$f]['aktiv']))?'checked="checked"':''); ?> />&nbsp;<?php echo __("Aktiv", "wpsg"); ?></label>
-							<a style="float:right; position:relative;" class="glyphicon glyphicon-question-sign" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_fieldconfig" data-wpsg-tip="mod_rechnung_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_fieldconfig"></a>
-						</td>
-					</tr>
+				<tr>
+					<td><?php echo wpsg_hspc($field_name); ?></td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][text]" value="<?php echo wpsg_hspc($this->view['arTexte'][$f]['text']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][x]" value="<?php echo wpsg_hspc($this->view['arTexte'][$f]['x']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][y]" value="<?php echo wpsg_hspc($this->view['arTexte'][$f]['y']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $f; ?>][color]" value="<?php echo wpsg_hspc($this->view['arTexte'][$f]['color']); ?>" />
+					</td>
+					<td>
+						<select name="text[<?php echo $f; ?>][fontsize]" style="width:100%;">
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "8")?'selected="selected"':''); ?> value="8">8</option>				
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "9")?'selected="selected"':''); ?> value="9">9</option>
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "10")?'selected="selected"':''); ?> value="10">10</option>
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "11")?'selected="selected"':''); ?> value="11">11</option>
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "12")?'selected="selected"':''); ?> value="12">12</option>
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "13")?'selected="selected"':''); ?> value="13">13</option>
+							<option <?php echo (($this->view['arTexte'][$f]['fontsize'] == "14")?'selected="selected"':''); ?> value="14">14</option>
+						</select>
+					</td>
+					<td>			
+						<label><input type="checkbox" value="1" name="text[<?php echo $f; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$f]['aktiv']))?'checked="checked"':''); ?> />&nbsp;<?php echo __("Aktiv", "wpsg"); ?></label>
+						<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_rechnung_fieldconfig"></a>
+					</td>
+				</tr>
 				<?php } ?>
-				</tbody>
 			</table>
-
-			<br />
-
+						
+			<br />
+			
 			<input style="float:right;" class="button" onclick="if (!confirm('<?php echo __('Sind Sie sich sicher? Ihre bisherigen Einstellungen gehen verloren!', 'wpsg'); ?>')) return false; else location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;action=module&amp;modul=<?php echo $_REQUEST['modul']; ?>&amp;do=reset&amp;noheader=1';" type="button" value="<?php echo __('Standardeinstellungen laden', 'wpsg'); ?>" />
-
-			<div class="info">
-				<p style="line-height:normal;">
-					<?php echo __('Die Angaben fÃŒr X (Abstand von Links) und Y (Abstand von Oben) werden in mm eingetragen.', 'wpsg'); ?><br />
-					<?php echo __('Die Farbe wird im Hexadezimalformat angegeben (#FFFFFF fÃŒr weiÃ, #000000 fÃŒr schwarz).', 'wpsg'); ?>
-				</p>
-			</div>
-			<br />
-
+			
+			<div class="wpsg_hinweis">
+				<?php echo __('Die Angaben fÃŒr X (Abstand von Links) und Y (Abstand von Oben) werden in mm eingetragen.', 'wpsg'); ?><br />
+				<?php echo __('Die Farbe wird im Hexadezimalformat angegeben (#FFFFF fÃŒr weiÃ, #000000 fÃŒr schwarz).', 'wpsg'); ?> 
+			</div>
+			<br />
+			
 		</div>
-		<div id="tab2" role="tabpanel" class="tab-pane" >
-
+		<div id="tabcontent2" class="tabcontent">
+			
 			<div id="foottext_list"><?php echo $this->view['foottext_list']; ?></div>
 			<br />
-
-			<a title="<?php echo __('Neue FuÃzeile anlegen', 'wpsg'); ?>" href="" class="" onclick="return wpsg_addFooter();"><span class="glyphicon wpsg-glyphicon glyphicon-plus"></span><?php echo __('Neue FuÃzeile anlegen.', 'wpsg'); ?></a>
-
-			<br /><br />
-			<div class="info">
-				<p style="line-height:normal;">
-					<?php echo __('Hier kÃ¶nnen Sie Texte vordefinieren, die sie unter die Rechnung setzen kÃ¶nnen.', 'wpsg'); ?>
-				</p>
-			</div>
-
-		</div>
-		<div id="tab3" role="tabpanel" class="tab-pane" >
-
-			<?php echo wpsg_drawForm_Select('wpsg_mod_rechnungen_einvoice', __('E-Rechnung', 'wpsg'), $ArrZugferdProfile, $this->get_option('wpsg_mod_rechnungen_einvoice'), ['help' => 'wpsg_mod_rechnungen_einvoice']); ?>
-			
-			<p style="line-height:normal; margin-bottom:1rem; margin-top:1rem; display:none; font-style:italic;" id="wpsg_mod_rechnungen_einvoice_description"><?php echo __('Die Platzhalter kÃ¶nnen bei den Formatfeldern und dem Dateinamen verwendet werden. Der Platzhalter %nr% sollte dabei immer Verwendung finden.', 'wpsg'); ?></p>
-			<?php
-
-                array_walk($ArrZugferdProfile, function(&$v, $k) {
-
-                    $v = [ 'description' => ZugferdProfiles::PROFILEDEF[$k - 100]['description']??null ];
-
-                });
-
-             ?>
-			<script>
-				
-				const eInvoiceProfileDev = <?php echo json_encode($ArrZugferdProfile); ?>;
-				const el_wpsg_mod_rechnungen_einvoice_description = document.getElementById('wpsg_mod_rechnungen_einvoice_description');
-				
-				document.getElementById('wpsg_mod_rechnungen_einvoice').addEventListener('change', ev => {
-				
-					if (eInvoiceProfileDev[ev.target.value] !== null) {
-						
-						el_wpsg_mod_rechnungen_einvoice_description.innerText = eInvoiceProfileDev[ev.target.value].description;
-						el_wpsg_mod_rechnungen_einvoice_description.style.display = 'block';
-
-					} else {
-						
-						el_wpsg_mod_rechnungen_einvoice_description.style.display = 'hidden';
-
-                    }
-				
-				});
-				
-				document.getElementById('wpsg_mod_rechnungen_einvoice').dispatchEvent(new Event('change'));
-				
-			</script>
-			
-			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_url', __('URL Benachrichtigung', 'wpsg'), $this->get_option('wpsg_rechnungen_url'), array('help' => 'wpsg_rechnung_url')); ?>
+			
+			<div class="wpsg_hinweis">
+				<?php echo __('Hier kÃ¶nnen Sie Texte vordefinieren, die sie unter die Rechnung setzen kÃ¶nnen.', 'wpsg'); ?>
+			</div>
+			
+		</div>		
+		<div id="tabcontent3" class="tabcontent">
+		
+			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_url', __('URL Benachrichtigung', 'wpsg'), $this->get_option('wpsg_rechnungen_url'), array('help' => 'wpsg_rechnung_url')); ?>			
 			<?php echo wpsg_drawForm_Select('wpsg_mod_rechnungen_auto', __('Rechnungserstellung', 'wpsg'), array(
 				'0' => __('Manuell', 'wpsg'),
@@ -244,20 +194,10 @@
 			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_faelligkeit', __('FÃ€lligkeit in Tagen', 'wpsg'), $this->get_option('wpsg_rechnungen_faelligkeit'), array('help' => 'wpsg_rechnungen_faelligkeit')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_pdfperpage', __('Anzahl an Produkten pro Seite (PDF)', 'wpsg'), $this->get_option('wpsg_rechnungen_pdfperpage'), array('help' => 'wpsg_rechnungen_pdfperpage')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_rechnungen_pdetailname', __('Produktdetailname auf Rechnung anzeigen', 'wpsg'), $this->get_option('wpsg_rechnungen_pdetailname'), array('help' => 'wpsg_rechnungen_pdetailname')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_rechnungen_pbeschreibung', __('Produktbeschreibung auf Rechnung anzeigen', 'wpsg'), $this->get_option('wpsg_rechnungen_pbeschreibung'), array('help' => 'wpsg_rechnungen_pbeschreibung')); ?>
-
-			<?php if ($this->hasMod('wpsg_mod_produktattribute') == '1') {?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_rechnungen_produktattribute', __('Produktattribute auf der Rechnung anzeigen', 'wpsg'), $this->get_option('wpsg_rechnungen_produktattribute'), array('help' => 'wpsg_rechnungen_produktattribute')); ?>
-			<?php }?>
-			
-			<?php if ($this->hasMod('wpsg_mod_deliverynote') == '1') {?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_rechnungen_deliverynote', __('Lieferdatum auf der Rechnung anzeigen', 'wpsg'), $this->get_option('wpsg_rechnungen_deliverynote'), array('help' => 'wpsg_rechnungen_deliverynote')); ?>
-			<?php }?>
-
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_showgutschriftrechnung', __('Rechnungsnummer auf Rechnungskorrektur anzeigen', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_showgutschriftrechnung'), array('help' => 'wpsg_mod_rechnungen_showgutschriftrechnung')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_showpv', __('Produktvariablen auf Rechnung anzeigen', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_showpv'), array('help' => 'wpsg_mod_rechnungen_showpv')); ?>
 			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_showov', __('Bestellvariablen auf Rechnung anzeigen', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_showov'), array('help' => 'wpsg_mod_rechnungen_showov')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_hideCountry', __('Land auf Rechnung verbergen', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_hideCountry'), array('help' => 'wpsg_mod_rechnungen_hideCountry')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_customermail', __('Rechnung/PDF an BestellbestÃ€tigungsmail anhÃ€ngen', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_customermail'), ['help' => 'wpsg_mod_rechnungen_customermail']); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_showanr', __('Artikelnummer auf Rechnung als Nr. verwenden', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_showanr'), array('help' => 'wpsg_mod_rechnungen_showanr')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_rechnungen_hideCountry', __('Land auf Lieferschein verbergen', 'wpsg'), $this->get_option('wpsg_mod_rechnungen_hideCountry'), array('help' => 'wpsg_mod_rechnungen_hideCountry')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_start', __('Startnummer (Rechnungen)', 'wpsg'), $this->get_option('wpsg_rechnungen_start'), array('help' => 'wpsg_rechnungen_start')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_gutschrift_start', __('Startnummer (Rechnungskorrektur)', 'wpsg'), $this->get_option('wpsg_gutschrift_start'), array('help' => 'wpsg_gutschrift_start')); ?>
@@ -265,55 +205,31 @@
 			<?php echo wpsg_drawForm_Input('wpsg_rechnungen_format', __('Format (Rechnungen)', 'wpsg'), $this->get_option('wpsg_rechnungen_format'), array('help' => 'wpsg_rechnungen_format')); ?>
 			<?php echo wpsg_drawForm_Input('wpsg_gutschrift_format', __('Format (Rechnungskorrektur)', 'wpsg'), $this->get_option('wpsg_gutschrift_format'), array('help' => 'wpsg_gutschrift_format')); ?>
-
-			<?php echo wpsg_drawForm_Select('wpsg_mod_rechnungen_anr', __('Artikelnummer anzeigen', 'wpsg'), array(
-				'0' => __('Nicht anzeigen', 'wpsg'),
-				'1' => __('In Spalte "Nr." zeigen', 'wpsg'),
-				'2' => __('Als extra Zeile anzeigen', 'wpsg')
-			), $this->get_option('wpsg_mod_rechnungen_anr'), array('help' => 'wpsg_mod_rechnungen_anr')); ?>
-
-			<?php echo wpsg_drawForm_TextStart(); ?>
-			<div class="info">
-				<p style="line-height:normal;">
-					%nr% - <?php echo __('Fortlaufende Rechnungs- bzw. Rechnungskorrekturnummer', 'wpsg'); ?><br />
-					%Jahr% - <?php echo __('Das aktuelle Jahr (4 Stellig)', 'wpsg'); ?><br />
-					%Monat% - <?php echo __('Der aktuelle Monat (01 - 12)', 'wpsg'); ?><br />
-					%Tag% - <?php echo __('Der Tag des Monats (01 - 31)', 'wpsg'); ?><br />
-				</p>
-			</div>
-
-			<p style="line-height:normal;"><?php echo __('Die Platzhalter kÃ¶nnen bei den Formatfeldern und dem Dateinamen verwendet werden. Der Platzhalter %nr% sollte dabei immer Verwendung finden.', 'wpsg'); ?></p>
-
-			<?php echo wpsg_drawForm_TextEnd(__('MÃ¶gliche Platzhalter fÃŒr Rechnungen und Rechnungskorrektur', 'wpsg'), array('noP' => true)); ?>
-
+			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('MÃ¶gliche Platzhalter fÃŒr Rechnungen und Rechnungskorrektur', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p>
+						%nr% - <?php echo __('Fortlaufende Rechnungs- bzw. Rechnungskorrekturnummer', 'wpsg'); ?><br />
+						%Jahr% - <?php echo __('Das aktuelle Jahr (4 Stellig)', 'wpsg'); ?><br />
+						%Monat% - <?php echo __('Der aktuelle Monat (01 - 12)', 'wpsg'); ?><br />
+						%Tag% - <?php echo __('Der Tag des Monats (01 - 31)', 'wpsg'); ?><br />						
+					</p>
+					<div class="wpsg_hinweis"><?php echo __('Die Platzhalter kÃ¶nnen bei den Formatfeldern und dem Dateinamen verwendet werden. Der Platzhalter %nr% sollte dabei immer Verwendung finden.', 'wpsg'); ?></div>					
+				</div>
+			</div>
+			<div class="wpsg_clear"></div>
+		
 		</div>
+		
 	</div>
 </div>
-
-
-<script>
+ 
+
+<script type="text/javascript">/* <![CDATA[ */
 
 	jQuery(document).ready(function() {
-	    
-	    jQuery('#wpsg_mod_rechnungen_customermail').on('change', function() {
-	       
-	        if (jQuery(this).prop('checked') === true) {
-	            
-	            jQuery('#wpsg_mod_rechnungen_auto').val('1');
-	            
-			} 
-	        
-		});
-
-        jQuery('#wpsg_mod_rechnungen_auto').on('change', function() {
-            
-            if (jQuery(this).val() !== '1') {
-
-                jQuery('#wpsg_mod_rechnungen_customermail').prop('checked', false);
-                
-			}
-            
-		});
-
-		jQuery('#wpsg_tab').wpsg_tab( {
+		jQuery('#wpsg_tab').wpsg_tab( { 
 			'cookiename': 'wpsg_rechnungen_tab',
 			'tab2': function() {
@@ -321,108 +237,5 @@
 			}
 		} );
-
-		var  onloadActiveBtn = jQuery(".align-buttons-active")[0];
-		
-		if(onloadActiveBtn)
-		{
-			if(!onloadActiveBtn.value.includes("selected"))
-				onloadActiveBtn.value += " selected";
-		}
-
-		jQuery(".wpsg_rechnungen_preview").click(function(){ wpsg_rechnungen_preview(); });
-
 	} );
 
-	/**
-	 * Stellt sicher, dass immer nur ein Button der align-buttons die highlight Klasse hat
-	 */
-	function handleLogoAlignClick(pressedEl)
-	{
-
-		if(pressedEl.hasClass("align-buttons-active")) return;
-		else
-		{
-
-			pressedEl.addClass("align-buttons-active");
-			pressedEl[0].value = pressedEl[0].value + " selected";
-
-			jQuery.each(jQuery(".logo-align-button"), function(index, element) {
-				if(element.classList.contains("align-buttons-active") && element !== pressedEl[0]){
-
-					var values = element.value.split(" ");
-					element.value = values[0];
-
-					element.classList.remove("align-buttons-active");
-
-					return false;
-
-				}
-			});
-
-		}
-
-	} // function handleLogoAlignClick()
-
-	// Verhindern der Weiterleitung nach dem Klick auf einen Align Button
-	jQuery(".logo-align-button").click(function() { return false; });
-
-	/**
-	 * Wird beim Klicken auf den Vorschau Button ausgelÃ¶st
-	 */
-	function wpsg_rechnungen_preview()
-	{
-
-		var url = "<?php echo wpsg_admin_url('Admin', 'module', ['modul' => 'wpsg_mod_rechnungen', 'do' => 'orderAjax', 'wpsg_rechnungen_preview' => '1'], ['noheader' => '1'], true); ?>";
-		//echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=orderAjax&noheader=1&wpsg_rechnungen_preview=1";
-
-		window.open(url, '_blank');
-
-		return false;
-
-	} // function wpsg_rechnungen_preview()
-
-	/**
-	 * Wird beim anlegen einer neuen FuÃzeile aufgerufen
-	 */
-	function wpsg_addFooter()
-	{
-
-		jQuery('#foottext_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=add&noheader=1',
-			success: function(data) {
-				jQuery('#foottext_list').html(data);
-			}
-		} );
-
-		return false;
-
-	} // function wpsg_addFooter()
-
-	/**
-	 * Wird beim entfernen einer FuÃzeile aufgerufen
-	 */
-	function wpsg_removeFooter(foot_id)
-	{
-
-		if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese FuÃzeile lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
-		
-		jQuery('#foottext_list').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_rechnungen&do=removeFooter&noheader=1',
-			data: {
-				foot_id: foot_id
-			},
-			success: function(data) {
-				jQuery('#foottext_list').html(data);
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_removeFooter()
-
-
-</script>
+/* ]]> */</script>
Index: /views/mods/mod_relatedproducts/list.phtml
===================================================================
--- /views/mods/mod_relatedproducts/list.phtml	(revision 8528)
+++ /views/mods/mod_relatedproducts/list.phtml	(revision 5261)
@@ -10,38 +10,24 @@
 <p><?php echo __('Noch keine Produkte zugeordnet', 'wpsg'); ?></p>
 <?php } else { ?>
-	<div id="wpsg_mod_relatedproduct_list">
-		<?php foreach ($this->view['wpsg_mod_relatedproducts']['data'] as $p) { ?>
-			<div class="order_item">
-				<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-bar-expand" viewBox="0 0 16 16">
-					<path fill-rule="evenodd" d="M3.646 10.146a.5.5 0 0 1 .708 0L8 13.793l3.646-3.647a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 0-.708m0-4.292a.5.5 0 0 0 .708 0L8 2.207l3.646 3.647a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 0 0 0 .708M1 8a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 0 1h-13A.5.5 0 0 1 1 8"/>
-				</svg>
-				<span id="wpsg_rp_<?php echo $p['id']; ?>">
-					<?php echo wpsg_drawForm_Select('wpsg_mod_relatedproduct['.$p['id'].']', '<a href="'.wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$p['product_id'], 'wpsg-product-edit-'.$p['product_id']).'">'.$p['name'].'</a>', $this->view['wpsg_mod_relatedproducts']['arTemplates'], $p['template'], array('icon' => 'wpsg_icon_remove glyphicon glyphicon-trash')); ?>
-				</span>
-			</div>
+<?php foreach ($this->view['wpsg_mod_relatedproducts']['data'] as $p) { ?>
+	<span id="wpsg_rp_<?php echo $p['id']; ?>">
+		<?php if (!wpsg_isSizedString($this->get_option('wpsg_mod_relatedproducts_template')) || $this->get_option('wpsg_mod_relatedproducts_template') == '0') { ?>
+		<?php echo wpsg_drawForm_Select('wpsg_mod_relatedproduct['.$p['id'].']', $p['name'], $this->view['wpsg_mod_relatedproducts']['arTemplates'], $p['template'], array('remove' => __('Zuordnung lÃ¶schen', 'wpsg'), 'labellink' => WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$p['id'])); ?>
+		<?php } else { ?>
+		<a class="wpsg_icon wpsg_icon_right wpsg_icon_remove" href="#" title="<?php echo __('Zuordnung lÃ¶schen', 'wpsg'); ?>"></a>
+		<span style="line-height:25px;">
+			<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id=<?php echo $p['id']; ?>">
+				<?php echo wpsg_hspc($p['name']); ?>
+			</a>
+		</span>		
 		<?php } ?>
-	</div>
+	</span>
+	<div class="wpsg_clear"></div>
+<?php } ?>
 <?php } ?>
 
-<style>
-	
-	#wpsg_mod_relatedproduct_list { display:flex; flex-direction:column; gap:5px;
-		& > .order_item { display:block; position:relative; cursor:pointer !important;
-			& > svg { display:none; width:16px; height:16px; left:0; top:50%; transform:translateY(-50%); position:absolute; cursor:pointer !important; }
-			&:hover > svg { display:block; }
-			.form-group { margin-top:0; margin-bottom:0;
-				& > * { cursor:pointer;
-					a { display:inline; }
-				}
-				& > label { display:flex; justify-content:flex-end; }
-			}
-		}
-	}
-	
-</style>
+<script type="text/javascript">
 
-<script>
-
-	jQuery('#relatedproducts_list a.wpsg_icon_remove').on('click', function() {
+	jQuery('#relatedproducts_list a.wpsg_icon_remove').bind('click', function() {
 
 		var rel_id = jQuery(this).parents('span').attr('id').replace(/wpsg_rp_/, '');
@@ -63,12 +49,4 @@
 		
 	} );
-	
-	jQuery(document).ready(function() {
-	
-		jQuery("#wpsg_mod_relatedproduct_list").sortable({
-		
-		}).disableSelection();
-
-	});
 
 </script>
Index: ews/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,74 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Zuweisung von ZubehÃ¶rprodukten
-	 */
-
-?>
-<div id="wpsg_mod_relatedproducts_dialog" class="modal fade" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-            <div class="modal-header">
-        		<button type="button" class="close" data-dismiss="modal" aria-label="<?php echo __('Abbrechen', 'wpsg'); ?>"><span aria-hidden="true">&times;</span></button>
-        		<h4 class="modal-title"><?php echo __('Produktauswahl', 'wpsg'); ?></h4>
-      		</div>
-			<div class="modal-body">
-	 
-			</div>
-			<div class="modal-footer">
-	 
-				<button type="button" class="btn-sm btn btn-default" data-dismiss="modal"><?php echo __('Abbrechen', 'wpsg'); ?></button>
-				<button type="button" class="btn-sm btn btn-primary" onclick="return insertProdukt();"><?php echo __('EinfÃŒgen', 'wpsg'); ?></button>
-				<button type="button" class="btn-sm btn btn-primary" onclick="return insertProduktClose();"><?php echo __('EinfÃŒgen und schlieÃen', 'wpsg'); ?></button>
-				
-			</div>
-			
-		</div>
-	</div>      
-</div>
-
-<div id="wpsg_relatedproducts" class="panel panel-default" tabindex="-1">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('ZubehÃ¶rprodukte', 'wpsg'); ?>
-		</h3>
-	</div>
-	<div class="panel-body">		 
-		 <div id="relatedproducts_list"><?php echo $this->callMod('wpsg_mod_relatedproducts', 'drawList', array($this->view['data']['id'])); ?></div>
-
-		<script type="text/javascript">
-		
-			/**
-			 * Wird aufgerufen wenn ein Produkt zugeordnet werden soll
-			 */
-			function wpsg_relatedproducts_add() 
-			{
-				
-				jQuery('#wpsg_mod_relatedproducts_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		 		jQuery('#wpsg_mod_relatedproducts_dialog').modal( { } ).modal('show');
-				
-				jQuery.ajax( {
-					url: 'admin.php?page=wpsg-Produkt&action=select&noheader=1&wpsg_mode=wpsg_mod_relatedproducts&edit_id=<?php echo $this->view['data']['id']; ?>',
-					success: function(data) {
-					
-						jQuery('#wpsg_mod_relatedproducts_dialog .modal-body').html(data);
-						
-					}
-				} ); 
-		
-				return false;
-						
-			} // function wpsg_relatedproducts_add()
-		
-		</script>
-		
-		<br />
- 
-		<a title="<?php echo __('Neues Produkt zuordnen', 'wpsg'); ?>" href="" onclick="return wpsg_relatedproducts_add();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Produkt zuordnen', 'wpsg'); ?></a>
-			
-		<br /><br />
-	
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_relatedproducts"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der ZubehÃ¶rprodukte', 'wpsg'); ?></a>
-		
-	</div>
-</div>		
Index: /views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_relatedproducts/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,52 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Zuweisung von ZubehÃ¶rprodukten
+	 */
+
+?>
+<div id="wpsg_relatedproducts" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('ZubehÃ¶rprodukte', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		 <a title="<?php echo __('Neuens Produkt zuordnen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_relatedproducts_add();"></a>
+		 <div class="wpsg_clear"></div>
+		 <div id="relatedproducts_list"><?php echo $this->callMod('wpsg_mod_relatedproducts', 'drawList', array($this->view['data']['id'])); ?></div>
+	</div>
+</div>
+
+<script type="text/javascript">
+
+	/**
+	 * Wird aufgerufen wenn ein Produkt zugeordnet werden soll
+	 */
+	function wpsg_relatedproducts_add() 
+	{
+
+		jQuery('#wpsg_relatedproducts_produktauswahl').html('<img style="margin:15px;" src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery('#wpsg_relatedproducts_produktauswahl').dialog( {
+			'dialogClass': 'wp-dialog',           
+	        'modal': true,
+	        'width': 390,
+	        'height': 350,	       
+	        'title': '<?php echo __('Produktauswahl', 'wpsg'); ?>',
+	        'open': function() {
+
+	        	jQuery.ajax( {
+	    			url: 'admin.php?page=wpsg-Produkt&action=select&noheader=1&wpsg_mode=wpsg_mod_relatedproducts&edit_id=<?php echo $this->view['data']['id']; ?>',
+	    			success: function(data) {
+	    				jQuery('#wpsg_relatedproducts_produktauswahl').html(data);	
+	    			}
+	    		} );
+			        
+	        }
+		} );
+
+		return false;
+		 		
+	} // function wpsg_relatedproducts_add()
+
+</script>
Index: /views/mods/mod_relatedproducts/relatedproducts.phtml
===================================================================
--- /views/mods/mod_relatedproducts/relatedproducts.phtml	(revision 8528)
+++ /views/mods/mod_relatedproducts/relatedproducts.phtml	(revision 5261)
@@ -6,5 +6,5 @@
 
 ?>
-<h2 class="h2-related"><?php echo __('Ãhnliche Produkte', 'wpsg'); ?></h2>
+<h2><?php echo __('Ãhnliche Produkte', 'wpsg'); ?></h2>
 
 <div class="wpsg_relatedproducts">
Index: /views/mods/mod_relatedproducts/settings_edit.phtml
===================================================================
--- /views/mods/mod_relatedproducts/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_relatedproducts/settings_edit.phtml	(revision 5261)
@@ -12,11 +12,5 @@
 <div class="wpsg_mod_relatedproducts_showBasket_activ" style="display:none;">
 <?php echo wpsg_drawForm_Input('wpsg_mod_relatedproducts_showBasketLimit', __('Maximale Anzahl an angezeigten Produkten', 'wpsg'), $this->get_option('wpsg_mod_relatedproducts_showBasketLimit'), array('help' => 'wpsg_mod_relatedproducts_showBasketLimits')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_relatedproducts_showBasketTemplate', __('Template fÃŒr die ZubehÃ¶rprodukte im Warenkorb', 'wpsg'), $this->view['wpsg_mod_relatedproducts']['arTemplates'], $this->get_option('wpsg_mod_relatedproducts_showBasketTemplate'), array('help' => 'wpsg_mod_relatedproducts_showBasketTemplate')); ?>
-</div>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_relatedproducts_showAjaxDialog', __('ZubehÃ¶rprodukte im Warenkorb-Lightbox anpreisen', 'wpsg'), $this->get_option('wpsg_mod_relatedproducts_showAjaxDialog'), array('help' => 'wpsg_mod_relatedproducts_showAjaxDialog')); ?>
-<div class="wpsg_mod_relatedproducts_showAjaxDialog_activ" style="display:none;">
-<?php echo wpsg_drawForm_Input('wpsg_mod_relatedproducts_showAjaxDialogLimit', __('Maximale Anzahl an angezeigten Produkten', 'wpsg'), $this->get_option('wpsg_mod_relatedproducts_showAjaxDialogLimit'), array('help' => 'wpsg_mod_relatedproducts_showAjaxDialogLimits')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_relatedproducts_showAjaxDialogTemplate', __('Tempalte fÃŒr die ZubehÃ¶rprodukte in der Lightbox', 'wpsg'), $this->view['wpsg_mod_relatedproducts']['arTemplates'], $this->get_option('wpsg_mod_relatedproducts_showAjaxDialogTemplate'), array('help' => 'wpsg_mod_relatedproducts_showAjaxDialogTemplate')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_relatedproducts_showBasketTemplate', __('Tempalte fÃŒr die ZubehÃ¶rprodukte im Warenkorn', 'wpsg'), $this->view['wpsg_mod_relatedproducts']['arTemplates'], $this->get_option('wpsg_mod_relatedproducts_showBasketTemplate'), array('help' => 'wpsg_mod_relatedproducts_showBasketTemplate')); ?>
 </div>
 
@@ -31,11 +25,4 @@
 			
 		} ).change();
-
-		jQuery('#wpsg_mod_relatedproducts_showAjaxDialog').bind('change', function() {
-
-			if (jQuery(this).is(':checked')) jQuery('.wpsg_mod_relatedproducts_showAjaxDialog_activ').show();
-			else jQuery('.wpsg_mod_relatedproducts_showAjaxDialog_activ').hide();
-			
-		} ).change();
 		
 	} );
Index: /views/mods/mod_request/adminmail.phtml
===================================================================
--- /views/mods/mod_request/adminmail.phtml	(revision 8528)
+++ /views/mods/mod_request/adminmail.phtml	(revision 5261)
@@ -6,5 +6,4 @@
 
 	$this->htmlMail = false;
-	date_default_timezone_set('Europe/Berlin'); 
 	$time = time();
 
@@ -12,5 +11,5 @@
  
 <?php echo wpsg_translate(__('Das Anfrageformular auf der Homepage wurde am #1# um #2# Uhr', 'wpsg'), date('d.m.Y', $time), date('H:i', $time)); ?> 
-<?php echo __('mit folgenden Daten ausgefÃŒllt:', 'wpsg'); ?> 
+<?php echo __('mit folgenden Daten ausgefÃŒllt:', 'wspg'); ?> 
  
 <?php echo __('Produktdaten', 'wpsg'); ?>: 
@@ -19,5 +18,5 @@
 <?php echo __('Weitere Informationen', 'wpsg'); ?>:
 
-<?php echo wpsg_pad_right(__('REMOTE IP', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_anonymip($_SERVER['REMOTE_ADDR']), 46); ?>  
+<?php echo wpsg_pad_right(__('REMOTE IP', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left($_SERVER['REMOTE_ADDR'], 46); ?>  
 <?php echo wpsg_pad_right(__('UserAgent', 'wpsg').':', 30); ?> 
 <?php echo wpsg_getStr($_SERVER['HTTP_USER_AGENT']); ?> 
Index: /views/mods/mod_request/adminmail_html.phtml
===================================================================
--- /views/mods/mod_request/adminmail_html.phtml	(revision 8528)
+++ /views/mods/mod_request/adminmail_html.phtml	(revision 5261)
@@ -6,5 +6,4 @@
 
 	$this->htmlMail = true;
-	date_default_timezone_set('Europe/Berlin');
 	$time = time();
 
@@ -18,5 +17,5 @@
 <h2><?php echo __('Weitere Informationen', 'wpsg'); ?>:</h2>
 <p>
-	<strong><?php echo __('REMOTE IP', 'wpsg'); ?>:</strong>&nbsp;<?php echo wpsg_pad_left(wpsg_anonymip($_SERVER['REMOTE_ADDR']), 46); ?><br />
+	<strong><?php echo __('REMOTE IP', 'wpsg'); ?>:</strong>&nbsp;<?php echo wpsg_pad_left($_SERVER['REMOTE_ADDR'], 46); ?><br />
 	<strong><?php echo __('UserAgent', 'wpsg'); ?>:</strong>&nbsp;<?php echo wpsg_getStr($_SERVER['HTTP_USER_AGENT']); ?>
 </p> 
Index: /views/mods/mod_request/customermail.phtml
===================================================================
--- /views/mods/mod_request/customermail.phtml	(revision 8528)
+++ /views/mods/mod_request/customermail.phtml	(revision 5261)
@@ -7,10 +7,7 @@
 	$this->htmlMail = true;
 	$time = time();
-	
-	$arPflicht = $this->loadPflichtFeldDaten();
-	$arTitle = explode('|', $arPflicht['anrede_auswahl']);
 
 ?>
-<?php echo wpsg_translate(__('Hallo #1# #2# #3#', 'wpsg'), @$arTitle[$this->view['requestlist']['customer']['title']], wpsg_getStr($this->view['requestlist']['customer']['vname']), wpsg_getStr($this->view['requestlist']['customer']['name'])); ?>,
+<?php echo wpsg_translate(__('Hallo #1# #2#', 'wpsg'), wpsg_getStr($this->view['requestlist']['customer']['vname']), wpsg_getStr($this->view['requestlist']['customer']['name'])); ?>,
  
 <?php echo wpsg_translate(__('Vielen Dank fÃŒr Ihre Anfrage. Wir werden uns umgehend bei ihnen melden.', 'wpsg')); ?> 
Index: /views/mods/mod_request/requestmail.phtml
===================================================================
--- /views/mods/mod_request/requestmail.phtml	(revision 8528)
+++ /views/mods/mod_request/requestmail.phtml	(revision 5261)
@@ -27,5 +27,5 @@
 <?php echo wpsg_pad_left(wpsg_ff($request_product['price'] * $request_product['amount'], $this->get_option('wpsg_currency')), 15); ?> 
 <?php /* Variantenanzeige im Produkt BEGIN */ ?>
-<?php if ($this->hasMod('wpsg_mod_productvariant') && $this->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($request_product['product_key']))) { ?>
+<?php if ($this->hasMod('wpsg_mod_varianten') && $this->callMod('wpsg_mod_varianten', 'isVariantsProductKey', array($request_product['product_key']))) { ?>
 <?php echo wpsg_pad_right(' ', 5); ?>
 <?php echo __('Variante', 'wpsg'); ?>: <?php echo wpsg_hspc($request_product['variantenInfo']['key']); ?> 
@@ -100,5 +100,5 @@
 <?php echo wpsg_pad_right(__('Fax', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_getStr($this->view['requestlist']['customer']['fax']), 46); ?> 
 <?php echo wpsg_pad_right(__('Tel.', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_getStr($this->view['requestlist']['customer']['tel']), 46); ?> 
-<?php echo wpsg_pad_right(__('StraÃe', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_getStr($this->view['requestlist']['customer']['strasse']).rtrim(' '.$this->view['requestlist']['customer']['nr']), 46); ?>  
+<?php echo wpsg_pad_right(__('Strasse', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_getStr($this->view['requestlist']['customer']['strasse']), 46); ?>  
 <?php echo wpsg_pad_right(__('PLZ', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_getStr($this->view['requestlist']['customer']['plz']), 46); ?> 
 <?php echo wpsg_pad_right(__('Ort', 'wpsg').': ', 30); ?><?php echo wpsg_pad_left(wpsg_getStr($this->view['requestlist']['customer']['ort']), 46); ?> 
Index: /views/mods/mod_request/requestmail_html.phtml
===================================================================
--- /views/mods/mod_request/requestmail_html.phtml	(revision 8528)
+++ /views/mods/mod_request/requestmail_html.phtml	(revision 5261)
@@ -32,5 +32,5 @@
 		
 		<?php /* Variantenanzeige im Produkt BEGIN */ ?>
-		<?php if ($this->hasMod('wpsg_mod_productvariants') && $this->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($request_product['product_key']))) { ?>
+		<?php if ($this->hasMod('wpsg_mod_varianten') && $this->callMod('wpsg_mod_varianten', 'isVariantsProductKey', array($request_product['product_key']))) { ?>
 		<tr>
 			<td colspan="2"><?php echo __('Variante', 'wpsg'); ?>:</td>
@@ -154,6 +154,5 @@
 			'fax' => __('Fax', 'wpsg'),
 			'tel' => __('Tel.', 'wpsg'),
-			'strasse' => __('StraÃe', 'wpsg'),	
-			'nr' => __('Hausnummer', 'wpsg'),
+			'strasse' => __('Strasse', 'wpsg'),	
 			'plz' => __('PLZ', 'wpsg'),
 			'ort' => __('Ort', 'wpsg'),
Index: /views/mods/mod_request/requestpage.phtml
===================================================================
--- /views/mods/mod_request/requestpage.phtml	(revision 8528)
+++ /views/mods/mod_request/requestpage.phtml	(revision 5261)
@@ -19,7 +19,7 @@
 
 			jQuery("#form-step2").validationEngine('attach', {promptPosition : "bottomLeft", scroll: false});
-			
+				
 			jQuery('.wpsg_mod_kundenverwaltung_login').bind('click', function(){
-				jQuery("#form-step2").validationEngine('detach');
+				jQuery("#form-step2").validationEngine('detach');						
 			});
 
@@ -30,5 +30,5 @@
 		jQuery.validator.addMethod("cRequired", jQuery.validator.methods.required, "<?php echo __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'); ?>");
 		jQuery.validator.addClassRules('validate[required]', { cRequired: true } );
-		jQuery("#form-step2").validate( {
+		jQuery("#form-step2").validate( { 
 			ignore: '',
 			errorClass: 'wpsg_error',
@@ -36,15 +36,15 @@
 			showErrors: function(errorMap, errorList) {
 
-				this.defaultShowErrors();
+				this.defaultShowErrors();	
 
 			}
-		} );
-
-		jQuery('#wpsg_requestbutton').bind('click', function() {
+		} ); 
+
+		jQuery('#wpsg_requestbutton').bind('click', function() { 
 
 			var bReturn = jQuery('#form-step2').validate().form();
 			if (jQuery('#form-step2 input.wpsg_error').length > 0) jQuery('#form-step2 input.wpsg_error')[0].focus();
 			return bReturn;
-			
+			  
 		} );
 		
@@ -61,17 +61,5 @@
 		
 	} );
-
-	<?php /* Copy&Paste fÃŒr das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
-	window.onload = function() {
-		
-		var email2 = document.getElementById('email2');
-
-		email2.onpaste = function(e) {
-
-			e.preventDefault();
-
-		}
-	}
-	
+		
 /* ]]> */</script>
 <div class="wpsg_mod_request_requestpage">
@@ -96,5 +84,5 @@
 						<th class="wpsg_cell_mwst"><?php echo __("MwSt.", "wpsg"); ?></th>
 						<?php } ?>
-						<th class="wpsg_cell_sumprice"><?php echo __('Gesamtpreis', 'wpsg'); ?></th>
+						<th class="wpsg_cell_sumprice"><?php echo __('Gesamtpreis', 'wpsg'); ?></th>	
 					</tr>
 				</thead>
@@ -113,27 +101,13 @@
 						
 							<?php /* Produktbild BEGIN */ ?>
-							<?php if ($this->get_option('wpsg_mod_request_requestpageimage') == '1') {
+							<?php if ($this->hasMod('wpsg_mod_produktbilder') && $this->get_option('wpsg_mod_request_requestpageimage') == '1') { 
 						
-								if (wpsg_isSizedString($request_product['product_data']['varianten_image'])) $arBilder = array($request_product['product_data']['varianten_image']);
-								else {
-							
-									if (isset($request_product['product_data']['product_key'])) {
-										//$image = $this->imagehandler->getAttachmentID($this->view['product_data']['product_key']);
-										$image = $this->imagehandler->getAttachmentID($request_product['product_data']['product_key']);
-									} else {
-										$arImages = $this->imagehandler->getAttachmentIDs($request_product['product_data']['product_id']);
-										$image = $arImages[0];
-									}
-									
-								}
-								//if (wpsg_isSizedString($image)) echo wp_get_attachment_image($image, 'medium', false, array());
+								if (wpsg_isSizedString($request_product['product_data']['varianten_image'])) $arBilder = array($request_product['product_data']['varianten_image']);						
+								else $arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($request_product['product_id'])); 
 								
 							?>
-							<?php if (wpsg_isSizedString($image)) { ?>
+							<?php if (wpsg_isSizedArray($arBilder)) { ?>
 							<div class="wpsg_basket_productimage">
-								<?php //$href = wp_get_attachment_image_src($arBilder[0]['post_id'], Array(30, 30)); ?>
-								<?php //$imgtag = wp_get_attachment_image($arBilder[0]['post_id'], Array(30, 30)); ?>
-								<?php echo wp_get_attachment_image($image, array(50, 50), false, array()); ?>
-								<?php //echo wpsg_hspc((($request_product['product_data']['detailname'] != '')?$request_product['product_data']['detailname']:$request_product['product_data']['name'])); ?>
+								<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($request_product['product_id'], array_shift($arBilder), 30, 30, 'c')); ?>" alt="<?php echo wpsg_hspc((($request_product['product_data']['detailname'] != '')?$request_product['product_data']['detailname']:$request_product['product_data']['name'])); ?>" />
 							</div>
 							<?php } ?>
@@ -148,5 +122,5 @@
 					<tr class="wpsg_row_product2">
 						<td class="wpsg_cell_amount">
-							<input type="text" style="padding:0.3em;" name="wpsg[amount][<?php echo $request_product['product_index']; ?>]" value="<?php echo wpsg_hspc($request_product['amount']); ?>" size="3" />
+							<input type="text" name="wpsg[amount][<?php echo $request_product['product_index']; ?>]" value="<?php echo wpsg_hspc($request_product['amount']); ?>" size="3" />
 						</td>
 						<td class="wpsg_cell_price">
@@ -164,5 +138,5 @@
 					
 					<?php /* Variantenanzeige im Produkt BEGIN */ ?>
-					<?php if ($this->hasMod('wpsg_mod_productvariants') && $this->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', array($request_product['product_key']))) { ?>
+					<?php if ($this->hasMod('wpsg_mod_varianten') && $this->callMod('wpsg_mod_varianten', 'isVariantsProductKey', array($request_product['product_key']))) { ?>
 					<tr class="wpsg_row_product_varianten">
 						<td class="wpsg_cell_label"><?php echo __('Variante', 'wpsg'); ?>:</td>
@@ -177,5 +151,5 @@
 						<td class="wpsg_cell_label"><?php echo __('Gewicht', 'wpsg'); ?>:</td>
 						<td class="wpsg_cell_value" colspan="<?php echo (2 + $this->view['addColspan']); ?>"><?php echo wpsg_ff($request_product['product_data']['weight'], $this->get_option('wpsg_mod_weight_unit')); ?></td>
-					</tr>
+					</tr>										
 					<?php } ?>
 					<?php /* Gewichtsanzeige im Produkt ENDE */ ?>
@@ -195,17 +169,17 @@
 						
 							<?php if ($pv['typ'] === '1') { $possible_options = explode('|', $pv['auswahl']); /* Auswahl */ ?>
-							<select id="wpsg_request_pv_<?php echo $pv['id']; ?>_<?php echo $request_product['product_index']; ?>" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]" class="<?php echo ((in_array("pv_".$pv['id'], (array)$this->view['error']))?'wpsg_error':''); ?>">							
+							<select id="wpsg_request_pv_<?php echo $pv['id']; ?>_<?php echo $request_product['product_index']; ?>" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]">							
 								<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
 								<?php foreach ((array)$possible_options as $option) { ?>
 								<option value="<?php echo wpsg_hspc($option) ?>" <?php echo (($option == wpsg_hspc(wpsg_getStr($request_product['pv'][$pv['id']])))?'selected="selected"':''); ?>><?php echo wpsg_hspc($option); ?></option>
-								<?php } ?>
+								<?php } ?>							
 							</select>
 							<?php } else if ($pv['typ'] === '2') { /* Text */ ?>
-							<input id="wpsg_request_pv_<?php echo $pv['id']; ?>_<?php echo $request_product['product_index']; ?>" type="text" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]" value="<?php echo wpsg_hspc(wpsg_getStr($request_product['pv'][$pv['id']])); ?>" class="<?php echo ((in_array("pv_".$pv['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" />
+							<input id="wpsg_request_pv_<?php echo $pv['id']; ?>_<?php echo $request_product['product_index']; ?>" type="text" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]" value="<?php echo wpsg_hspc(wpsg_getStr($request_product['pv'][$pv['id']])); ?>" />
 							<?php } else if ($pv['typ'] === '3') { /* Checkbox */ ?>
 							<input type="hidden" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]" value="0" />
-							<input id="wpsg_request_pv_<?php echo $pv['id']; ?>_<?php echo $request_product['product_index']; ?>" type="checkbox" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]" value="1" <?php echo ((wpsg_isSizedInt($request_product['pv'][$pv['id']]))?'checked="checked"':''); ?> class="<?php echo ((in_array("pv_".$pv['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" />							
+							<input id="wpsg_request_pv_<?php echo $pv['id']; ?>_<?php echo $request_product['product_index']; ?>" type="checkbox" name="wpsg[request][pv][<?php echo $request_product['product_index']; ?>][<?php echo $pv['id']; ?>]" value="1" <?php echo ((wpsg_isSizedInt($request_product['pv'][$pv['id']]))?'checked="checked"':''); ?>/>							
 							<?php } ?>
-							
+												
 						</td>
 					</tr>
@@ -215,6 +189,6 @@
 					
 					<?php } ?>
-					
-				</tbody>
+															
+				</tbody>			
 				<tfoot>
 					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
@@ -249,14 +223,14 @@
 				</tfoot>
 			</table>
-			
+					
 			<input type="submit" name="submit_requestpage_refresh" id="wpsg_requestbutton" class="wpsg_mod_request_button_refresh" value="<?php echo __('Anfrageliste aktualisieren', 'wpsg'); ?>" />
 		
 			<?php /* Anfang Bestellvariablen */ ?>
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_request_ordervars')) && wpsg_isSizedArray($this->view['orderVars'])) { ?>
+			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_request_ordervars')) && wpsg_isSizedArray($this->view['orderVars'])) { ?>			
 			<h2><?php echo __('ZusÃ€tzliche Angaben', 'wpsg'); ?></h2>
 			<?php foreach ($this->view['orderVars'] as $ov_index => $ov) { ?>
-			<div class="wpsg_checkoutblock" id="wpsg_checkoutblock_<?php echo $ov['id']; ?>">
+			<div class="wpsg_checkoutblock" id="wpsg_checkoutblock_<?php echo $ov['id']; ?>">				
 				<?php if ($ov['typ'] === '1') { $possible_options = explode('|', $ov['auswahl']); /* Auswahl */ ?>
-				<label class="wpsg_checkout_typ_<?php echo $ov['typ']; ?> wpsg_checkout" for="wpsg_ov_<?php echo $ov['id']; ?>"><?php echo wpsg_hspc($ov['name']); ?><?php if (wpsg_isSizedInt($ov['pflicht'])) { ?>&nbsp;<span class="wpsg_required">*</span><?php } ?>:</label>
+				<label class="wpsg_checkout_typ_<?php echo $ov['typ']; ?> wpsg_checkout" for="wpsg_ov_<?php echo $ov['id']; ?>"><?php echo wpsg_hspc($ov['name']); ?><?php if (wpsg_isSizedInt($ov['pflicht'])) { ?>&nbsp;<span class="wpsg_required">*</span><?php } ?></label>:
 				<select name="wpsg[request][ov][<?php echo $ov['id']; ?>]" class="<?php echo ((wpsg_isSizedInt($ov['pflicht']))?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ov_".$ov['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_ov_<?php echo $ov['id']; ?>">
 					<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
@@ -272,14 +246,14 @@
 				<input type="checkbox" <?php echo ((wpsg_isSizedInt($this->view['requestlist']['ov'][$ov['id']]))?'checked="checked"':''); ?> class="<?php echo ((wpsg_isSizedInt($ov['pflicht']))?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ov_".$ov['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_ov_<?php echo $ov['id']; ?>" name="wpsg[request][ov][<?php echo $ov['id']; ?>]" value="1" />
 				<label class="wpsg_checkout_typ_<?php echo $ov['typ']; ?> wpsg_checkout" for="wpsg_ov_<?php echo $ov['id']; ?>"><?php echo wpsg_hspc($ov['name']); ?><?php if (wpsg_isSizedInt($ov['pflicht'])) { ?> <span class="wpsg_required">*</span><?php } ?></label> 
-				<?php } ?>
-			</div>
+				<?php } ?>		
+			</div>			
 			<?php } ?>
 			<?php } ?>
 			<?php /* Ende Bestellvariablen */ ?>
 		
-			<h2><?php echo __('Kontaktdaten', 'wpsg'); ?></h2>
-		 	
+			<h2><?php echo __('Kontaktdaten', 'wpsg'); ?></h2>			
+		 		
 			<div class="wpsg_checkoutblock" id="wpsg_firma">
-				<label for="wpsg_firma" class="wpsg_checkout"><?php echo __("Firma", "wpsg"); ?>
+				<label for="wpsg_firma"><?php echo __("Firma", "wpsg"); ?>
 				<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -292,12 +266,12 @@
 				<select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[request][customer][title]">
 					<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-					<?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
-					<option value="<?php echo $i; /*wpsg_hspc($t);*/ $i++; ?>" <?php echo (($this->view['requestlist']['customer']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
-				<?php } ?>
+					<?php foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+					<option value="<?php echo wpsg_hspc($t); ?>" <?php echo (($this->view['requestlist']['customer']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
+				<?php } ?>						
 				</select>
 			</div>
 			
 			<div class="wpsg_checkoutblock" id="wpsg_vorname">
-				<label for="vname" class="wpsg_checkout"><?php echo __("Vorname", "wpsg"); ?>
+				<label for="vname" class="wpsg_checkout"><?php echo __("Vorname", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -313,5 +287,5 @@
 			
 			<div class="wpsg_checkoutblock" id="wpsg_email">
-				<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse", "wpsg"); ?>
+				<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -321,5 +295,5 @@
 			<?php if (wpsg_isSizedInt($this->view['pflicht']['emailconfirm'])) { ?>
 			<div class="wpsg_checkoutblock" id="wpsg_email2">
-				<label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?>
+				<label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -329,10 +303,10 @@
 			
 			<div class="wpsg_checkoutblock" id="wpsg_geburtsdatum">
-				<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ)',"wpsg"); ?>
+				<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum',"wpsg"); ?>
 				<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
 				<input class="<?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[request][customer][geb]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['geb'])); ?>" />
 			</div>
-			
+					
 			<div class="wpsg_checkoutblock" id="wpsg_fax">
 				<label for="fax" class="wpsg_checkout"><?php echo __("Fax.", "wpsg"); ?>
@@ -350,33 +324,12 @@
 		
 			<div class="wpsg_checkoutblock" id="wpsg_strasse">
-				
-				<?php if ($this->view['pflicht']['wpsg_showNr'] === '1') { ?>
-
-					<div class="wpsg_checkoutblock" id="wpsg_streetnr">
-
-						<label for="strasse" class="street wpsg_checkout"><?php echo __("StraÃe", "wpsg"); ?>
-							<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:				
-							<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[request][customer][strasse]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['strasse'])); ?>" />
-						</label>
-						<label for="nr" class="nr wpsg_checkout"><?php echo __('Nr', 'wpsg'); ?>
-							<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-							<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[request][customer][nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['requestlist']['customer']['nr'])); ?>" />
-						</label>
-						
-					</div>
-					
-				<?php } else { ?>
-				
-					<label for="strasse" class="wpsg_checkout"><?php echo __("StraÃe Nr.", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-					</label>
-					<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[request][customer][strasse]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['strasse'])); ?>" />		
-				
-				<?php } ?>
-				
+				<label for="strasse" class="wpsg_checkout"><?php echo __("Strasse Nr.", "wpsg"); ?> 
+				<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+				</label>
+				<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[request][customer][strasse]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['strasse'])); ?>" />		
 			</div>
 		
 			<div class="wpsg_checkoutblock" id="wpsg_postleitzahl">
-				<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl", "wpsg"); ?>
+				<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -385,5 +338,5 @@
 			
 			<div class="wpsg_checkoutblock" id="wpsg_ort">
-				<label for="ort" class="wpsg_checkout"><?php echo __("Ort", "wpsg"); ?>
+				<label for="ort" class="wpsg_checkout"><?php echo __("Ort", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -392,7 +345,7 @@
 			
 			<div class="wpsg_checkoutblock" id="wpsg_land">
-				<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land", "wpsg"); ?>
+				<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
-				</label>
+				</label>					
 				<select name="wpsg[request][customer][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
 					<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
@@ -404,5 +357,5 @@
 			
 			<div class="wpsg_checkoutblock" id="wpsg_ustidnr">
-				<label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.", "wpsg"); ?>
+				<label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.", "wpsg"); ?> 
 				<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 				</label>
@@ -414,11 +367,10 @@
 			<?php foreach ((array)$this->view['pflicht']['custom'] as $c_id => $c) { if ($c['show'] != '2') { ?>
 			<div class="wpsg_checkoutblock">
-				<label class="wpsg_cv wpsg_checkout" for="wpsg_cv_<?php echo $c_id; ?>">
+				<label class="wpsg_cv wpsg_checkout" for="wpsg_cv_<?php echo $c_id; ?>">					
+					<?php if ($c['typ'] == '0') { // Textfeld ?>
 					<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
-				</label>
-				<?php if ($c['typ'] == '0') { // Textfeld ?>
-				<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[request][customer][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['custom'][$c_id])); ?>" />
-				<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
-					<?php if ($c['show'] == '0') { ?>
+					<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[request][customer][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['custom'][$c_id])); ?>" />
+					<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
+					<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
 					<select id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[request][customer][custom][<?php echo $c_id; ?>]">
 						<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
@@ -428,13 +380,14 @@
 					</select>
 					<?php } else if ($c['typ'] == '2') { // Checkbox ?>
-					<input type="hidden" name="wpsg[request][customer][custom][<?php echo $c_id; ?>]" value="0" />
+					<input type="hidden" name="wpsg[request][customer][custom][<?php echo $c_id; ?>]" value="0" /> 
 					<input id="wpsg_cv_<?php echo $c_id; ?>" class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[request][customer][custom][<?php echo $c_id; ?>]" value="1" <?php echo ((wpsg_getStr($this->view['requestlist']['customer']['custom'][$c_id]) == '1')?'checked="checked"':''); ?> />
-					<?php } ?>
-				<?php } ?>
+					<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>					
+					<?php } ?>
+				</label>
 			</div>
 			<?php } } ?>
 			<?php } ?>
 			<?php /* Automatische Einbindung der benutzerdefinierten Kundenfelder ENDE */ ?>
-			
+						
 			<h2><?php echo __('Kommentar', 'wpsg'); ?></h2>
 			
@@ -448,7 +401,7 @@
 		
 			<input type="submit" name="submit_requestpage" class="wpsg_mod_request_button_submit" value="<?php echo __('Anfrage starten', 'wpsg'); ?>" />
-			
+					
 			<br />
-			
+						 
 		</form>
 	
Index: /views/mods/mod_scaleprice/product_bottom.phtml
===================================================================
--- /views/mods/mod_scaleprice/product_bottom.phtml	(revision 8528)
+++ /views/mods/mod_scaleprice/product_bottom.phtml	(revision 5261)
@@ -8,48 +8,38 @@
 ?>
 <div class="wpsg_mod_scaleprice_producttemplate">
-	<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte Benutzer START */?>
-	<?php if ($this->canDisplayPrice()) { ?>			
-	
-		<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
-			<?php echo __('Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der Menge wie folgt:', 'wpsg'); ?><br />
-		<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
-			<?php echo __('Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des Gewichts wie folgt:', 'wpsg'); ?><br />
+	<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
+		<?php echo __('Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der Menge wie folgt:', 'wpsg'); ?><br />
+	<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
+		<?php echo __('Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des Gewichts wie folgt:', 'wpsg'); ?><br />
+	<?php } ?>
+	<ul>	
+		
+		<?php if ($this->view['wpsg_mod_scaleprice']['typ'] != wpsg_mod_scaleprice::TYP_QUANTITY || $this->view['wpsg_mod_scaleprice']['scale'][0]['scale'] != '1') { ?>
+		<li>
+			<?php echo __('Bis ', 'wpsg'); ?>
+			<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
+				<?php echo wpsg_ff($this->view['wpsg_mod_scaleprice']['scale'][0]['scale'], __('StÃŒck', 'wpsg')); ?>
+			<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
+				<?php echo wpsg_ff($this->view['wpsg_mod_scaleprice']['scale'][0]['scale'], $this->get_option('wpsg_mod_weight_unit')); ?>
+			<?php } ?>
+			<?php echo __(' kostet das Produkt ', 'wpsg'); ?>
+			<?php echo wpsg_ff($this->view['wpsg_mod_scaleprice']['base'], $this->get_option('wpsg_currency')); ?> <?php echo __('je StÃŒck', 'wpsg'); ?>
+			<?php $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', array($this->view['wpsg_mod_scaleprice']['base'], $this->view['data']['fmenge'], $this->view['data']['feinheit'])); ?>			
+		</li>
 		<?php } ?>
-		<ul>	
-			
-			<?php if ($this->view['wpsg_mod_scaleprice']['typ'] != wpsg_mod_scaleprice::TYP_QUANTITY || $this->view['wpsg_mod_scaleprice']['scale'][0]['scale'] != '1') { ?>
-			<li>
-				<?php echo __('Bis ', 'wpsg'); ?>
-				<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
-					<?php echo wpsg_ff($this->view['wpsg_mod_scaleprice']['scale'][0]['scale'], $this->get_option('wpsg_mod_scaleprice_unit'), false, false, 0); ?>
-				<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
-					<?php echo wpsg_ff($this->view['wpsg_mod_scaleprice']['scale'][0]['scale'], $this->get_option('wpsg_mod_weight_unit')); ?>
-				<?php } ?>
-				<?php echo __(' kostet das Produkt ', 'wpsg'); ?>
-				<?php echo wpsg_ff($this->view['wpsg_mod_scaleprice']['base'], $this->get_option('wpsg_currency')); ?> <?php // echo $this->get_option('wpsg_mod_scaleprice_unit'); ?>
-				<?php $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', array($this->view['wpsg_mod_scaleprice']['base'], $this->view['data']['fmenge'], $this->view['data']['id'])); ?>			
-			</li>
+		
+		<?php foreach ((array)$this->view['wpsg_mod_scaleprice']['scale'] as $scale) { ?>
+		<li>		
+			<?php echo __('Ab ', 'wpsg'); ?>
+			<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
+				<?php echo wpsg_ff($scale['scale'], __('StÃŒck', 'wpsg')); ?>
+			<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
+				<?php echo wpsg_ff($scale['scale'], $this->get_option('wpsg_mod_weight_unit')); ?>
 			<?php } ?>
-			
-			<?php foreach ((array)$this->view['wpsg_mod_scaleprice']['scale'] as $scale) { ?>
-			<li>		
-				<?php echo __('Ab ', 'wpsg'); ?>
-				<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
-					<?php echo wpsg_ff($scale['scale'], $this->get_option('wpsg_mod_scaleprice_unit'), false, false, 0); ?>
-				<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
-					<?php echo wpsg_ff($scale['scale'], $this->get_option('wpsg_mod_weight_unit')); ?>
-				<?php } ?>
-				<?php echo __(' kostet das Produkt ', 'wpsg'); ?>
-				<?php echo wpsg_ff($scale['value'], $this->get_option('wpsg_currency')); ?> <?php //echo $this->get_option('wpsg_mod_scaleprice_unit'); ?>
-				<?php $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', array($scale['value'], $this->view['data']['fmenge'] , $this->view['data']['id'])); ?>
-			</li>
-			<?php } ?>
-		</ul>
-	<?php }else{?>
-		<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
-			<?php echo __('Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand der Menge. FÃŒr weitere Informationen loggen Sie sich bitte ein.', 'wpsg'); ?><br />
-		<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
-			<?php echo __('Das Produkt hat einen gestaffelten Preis, dieser ergibt sich Anhand des Gewichts. FÃŒr weitere Informationen loggen Sie sich bitte ein.', 'wpsg'); ?><br />
+			<?php echo __(' kostet das Produkt ', 'wpsg'); ?>
+			<?php echo wpsg_ff($scale['value'], $this->get_option('wpsg_currency')); ?> <?php echo __('je StÃŒck', 'wpsg'); ?>
+			<?php $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', array($scale['value'], $this->view['data']['fmenge'] , $this->view['data']['feinheit'])); ?>
+		</li>
 		<?php } ?>
-	<?php } /* Abfrage Preisanzeige nur fÃŒr eingeloggte Benutzer ENDE */?>
+	</ul>
 </div>
Index: ews/mods/mod_scaleprice/product_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_scaleprice/product_edit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,206 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration der Staffelpreise in die Produktverwaltung
-	 */
-
-?>
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
- 
-		jQuery('#wpsg_mod_scaleprice_activ').bind('change', function() {
- 
-			if (jQuery(this).attr('checked') == 'checked') jQuery('#wpsg_mod_scaleprice_layer').show();
-			else jQuery('#wpsg_mod_scaleprice_layer').hide();
-			
-		} ).change();
-
-		jQuery('#wpsg_mod_scaleprice_typ').bind('change', function() { wpsg_mod_scaleprice_refresh(); } );
-		jQuery('#wpsg_mod_scaleprice_calc').bind('change', function() { wpsg_mod_scaleprice_saveAjax(); } );
-		
-		<?php /* echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file*/?>
-				
-	} );
-
-	function wpsg_mod_scaleprice_add()
-	{
-
-		var wpsg_scale = jQuery('#wpsg_mod_scaleprice_scale').val();
-		var wpsg_value = jQuery('#wpsg_mod_scaleprice_value').val();
-		 
-		jQuery('#wpsg_mod_scaleprice_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=add',
-			data: { 
-				'scale': wpsg_scale,
-				'value': wpsg_value
-			},
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_scaleprice_target').html(data);
-				wpsg_mod_scaleprice_clearErrorField();
-				 				
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_mod_scaleprice_add() 
-
-	function wpsg_mod_scaleprice_refresh()
-	{
- 
-		jQuery('#wpsg_mod_scaleprice_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=refresh',
-			data: {
-				typ: jQuery('#wpsg_mod_scaleprice_typ').val(),
-				calc: jQuery('#wpsg_mod_scaleprice_calc').val()
-			},
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_scaleprice_target').html(data);
-				wpsg_mod_scaleprice_clearErrorField();
-				
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_mod_scaleprice_refresh() 
-
-	function wpsg_mod_scaleprice_saveAjax()
-	{
- 
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=ajaxSave',
-			data: {
-				typ: jQuery('#wpsg_mod_scaleprice_typ').val(),
-				calc: jQuery('#wpsg_mod_scaleprice_calc').val()
-			},
-			success: function(data) {
-
-				wpsg_mod_scaleprice_clearErrorField();
-			
-			}			
-		} );
-		
-	} // function wpsg_mod_scaleprice_saveAjax()
-
-	function wpsg_mod_scaleprice_clearErrorField()
-	{
-
-		var wpsg_product_edit_change_new = Array();
-
-		for (var i = 0; i < wpsg_product_edit_change.length; i++)
-		{
-
-			if (!wpsg_product_edit_change[i].match(/^wpsg_mod_scaleprice/))
-			{
-
-				wpsg_product_edit_change_new.push(wpsg_product_edit_change[i]);
-				
-			}
-			
-		} 
-
-		wpsg_product_edit_change = wpsg_product_edit_change_new;
-				
-	}
-	
-	function wpsg_mod_scaleprice_change(ev)
-	{
- 
-		if (!wpsg_in_array(ev.target.id, wpsg_product_edit_change) && jQuery(ev.target).val() != "")
-		{
-
-			wpsg_product_edit_change.push(ev.target.id);
-			 
-		}
-		else if (jQuery(ev.target).val() == "" && wpsg_in_array(ev.target.id, wpsg_product_edit_change))
-		{
- 
-		    for (var i = 0; i < wpsg_product_edit_change.length; i++) 
-			{
-		    	
-		        if (wpsg_product_edit_change[i] == ev.target.id)
-		        {
-
-			    	wpsg_product_edit_change.splice(i, 1);
-			    	jQuery('#' + ev.target.id).removeClass('wpsg_change_error');
-			         
-		        } 
-		    	
-		    }
-			
-		}
-		
-	} // function wpsg_mod_scaleprice_change(ev)
-	
-	function wpsg_mod_scaleprice_remove(scale_id)
-	{
-
-		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie diese Staffel entfernen mÃ¶chten?', 'wpsg'); ?>')) return false;
- 
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=remove',
-			data: {
-				scale_id: scale_id
-			},
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_scaleprice_row_' + scale_id).remove();
-				
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_mod_scaleprice_remove(scale_id)
-         
-/* ]]> */</script>
-
-<div class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<span><?php echo __('Staffelpreise', 'wpsg'); ?></span>
-		</h3>
-	</div> 
-	<div class="panel-body">
-	
-		<?php if ($this->view['wpsg_mod_scaleprice']['product']['id'] <= 0) { ?>
-		<p><?php echo __('Staffelpreise kÃ¶nnen erst nach einmaligem Speichern des Produktes definiert werden.', 'wpsg'); ?>
-		<?php } else { ?>
-
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_scaleprice_activ', __('Staffelpreise aktiv', 'wpsg'), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_activ']); ?>
-		
-		<div id="wpsg_mod_scaleprice_layer">
-		 
-		 	<?php if (wpsg_isSizedArray($this->view['wpsg_mod_scaleprice']['arTyp']) && sizeof($this->view['wpsg_mod_scaleprice']['arTyp']) > 0) { ?>
-			<?php echo wpsg_drawForm_Select('wpsg_mod_scaleprice_typ', __('BezugsgrÃ¶Ãe', 'wpsg'), array(
-				wpsg_mod_scaleprice::TYP_QUANTITY => __('Menge', 'wpsg'),
-				wpsg_mod_scaleprice::TYP_WEIGHT => __('Gewicht', 'wpsg')
-			), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_typ']); ?>
-			<?php } else { ?>
-			<input type="hidden" name="wpsg_mod_scaleprice_typ" id="wpsg_mod_scaleprice_typ" value="0" />
-			<?php } ?>
-			
-			<?php echo wpsg_drawForm_Select('wpsg_mod_scaleprice_calc', __('Berechnung', 'wpsg'), array(
-				wpsg_mod_scaleprice::CALC_REPLACE => __('Ersetzung', 'wpsg'),
-				wpsg_mod_scaleprice::CALC_ADD => __('Addition', 'wpsg')
-			), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_calc']); ?>
-			 			
-			 			 									
-				<div id="wpsg_mod_scaleprice_target"><?php echo $this->view['wpsg_mod_scaleprice']['list']; ?></div>
-
-			
-		</div>
-		
-		<?php } ?>
-		<br /><br />
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_scaleprice"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Staffelpreise', 'wpsg'); ?></a>			 
-	</div>
-</div>
Index: ews/mods/mod_scaleprice/produkt_addedit_sidebar.phtml
===================================================================
--- /views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,207 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration der Staffelpreise in die Produktverwaltung
-	 */
-
-?>
-<script type="text/javascript">/* <![CDATA[ */
-
-	jQuery(document).ready(function() {
- 
-		jQuery('#wpsg_mod_scaleprice_activ').bind('change', function() {
- 
-			if (jQuery(this).attr('checked') == 'checked') jQuery('#wpsg_mod_scaleprice_layer').show();
-			else jQuery('#wpsg_mod_scaleprice_layer').hide();
-			
-		} ).change();
-
-		jQuery('#wpsg_mod_scaleprice_typ').bind('change', function() { wpsg_mod_scaleprice_refresh(); } );
-		jQuery('#wpsg_mod_scaleprice_calc').bind('change', function() { wpsg_mod_scaleprice_saveAjax(); } );
-		
-		<?php /* echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file*/?>
-				
-	} );
-
-	function wpsg_mod_scaleprice_add()
-	{
-
-		var wpsg_scale = jQuery('#wpsg_mod_scaleprice_scale').val();
-		var wpsg_value = jQuery('#wpsg_mod_scaleprice_value').val();
-		 
-		jQuery('#wpsg_mod_scaleprice_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=add',
-			data: { 
-				'scale': wpsg_scale,
-				'value': wpsg_value
-			},
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_scaleprice_target').html(data);
-				wpsg_mod_scaleprice_clearErrorField();
-				 				
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_mod_scaleprice_add() 
-
-	function wpsg_mod_scaleprice_refresh()
-	{
- 
-		jQuery('#wpsg_mod_scaleprice_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-		
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=refresh',
-			data: {
-				typ: jQuery('#wpsg_mod_scaleprice_typ').val(),
-				calc: jQuery('#wpsg_mod_scaleprice_calc').val()
-			},
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_scaleprice_target').html(data);
-				wpsg_mod_scaleprice_clearErrorField();
-				
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_mod_scaleprice_refresh() 
-
-	function wpsg_mod_scaleprice_saveAjax()
-	{
- 
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=ajaxSave',
-			data: {
-				typ: jQuery('#wpsg_mod_scaleprice_typ').val(),
-				calc: jQuery('#wpsg_mod_scaleprice_calc').val()
-			},
-			success: function(data) {
-
-				wpsg_mod_scaleprice_clearErrorField();
-			
-			}			
-		} );
-		
-	} // function wpsg_mod_scaleprice_saveAjax()
-
-	function wpsg_mod_scaleprice_clearErrorField()
-	{
-
-		var wpsg_product_edit_change_new = Array();
-
-		for (var i = 0; i < wpsg_product_edit_change.length; i++)
-		{
-
-			if (!wpsg_product_edit_change[i].match(/^wpsg_mod_scaleprice/))
-			{
-
-				wpsg_product_edit_change_new.push(wpsg_product_edit_change[i]);
-				
-			}
-			
-		} 
-
-		wpsg_product_edit_change = wpsg_product_edit_change_new;
-				
-	}
-	
-	function wpsg_mod_scaleprice_change(ev)
-	{
- 
-		if (!wpsg_in_array(ev.target.id, wpsg_product_edit_change) && jQuery(ev.target).val() != "")
-		{
-
-			wpsg_product_edit_change.push(ev.target.id);
-			 
-		}
-		else if (jQuery(ev.target).val() == "" && wpsg_in_array(ev.target.id, wpsg_product_edit_change))
-		{
- 
-		    for (var i = 0; i < wpsg_product_edit_change.length; i++) 
-			{
-		    	
-		        if (wpsg_product_edit_change[i] == ev.target.id)
-		        {
-
-			    	wpsg_product_edit_change.splice(i, 1);
-			    	jQuery('#' + ev.target.id).removeClass('wpsg_change_error');
-			         
-		        } 
-		    	
-		    }
-			
-		}
-		
-	} // function wpsg_mod_scaleprice_change(ev)
-	
-	function wpsg_mod_scaleprice_remove(scale_id)
-	{
-
-		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie diese Staffel entfernen mÃ¶chten?', 'wpsg'); ?>')) return false;
- 
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=remove',
-			data: {
-				scale_id: scale_id
-			},
-			success: function(data) {
-				
-				jQuery('#wpsg_mod_scaleprice_row_' + scale_id).remove();
-				
-			}
-		} );
-
-		return false;
-		
-	} // function wpsg_mod_scaleprice_remove(scale_id)
-         
-/* ]]> */</script>
-
-<div class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<span><?php echo __('Staffelpreise', 'wpsg'); ?></span>
-		</h3>
-	</div> 
-	
-		<div class="panel-body">
-	
-		<?php if ($this->view['wpsg_mod_scaleprice']['product']['id'] <= 0) { ?>
-		<p><?php echo __('Staffelpreise kÃ¶nnen erst nach einmaligem Speichern des Produktes definiert werden.', 'wpsg'); ?>
-		<?php } else { ?>
-
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_scaleprice_activ', __('Staffelpreise aktiv', 'wpsg'), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_activ']); ?>
-		
-		<div id="wpsg_mod_scaleprice_layer">
-		 
-		 	<?php if (wpsg_isSizedArray($this->view['wpsg_mod_scaleprice']['arTyp']) && sizeof($this->view['wpsg_mod_scaleprice']['arTyp']) > 0) { ?>
-			<?php echo wpsg_drawForm_Select('wpsg_mod_scaleprice_typ', __('BezugsgrÃ¶Ãe', 'wpsg'), array(
-				wpsg_mod_scaleprice::TYP_QUANTITY => __('Menge', 'wpsg'),
-				wpsg_mod_scaleprice::TYP_WEIGHT => __('Gewicht', 'wpsg')
-			), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_typ']); ?>
-			<?php } else { ?>
-			<input type="hidden" name="wpsg_mod_scaleprice_typ" id="wpsg_mod_scaleprice_typ" value="0" />
-			<?php } ?>
-			
-			<?php echo wpsg_drawForm_Select('wpsg_mod_scaleprice_calc', __('Berechnung', 'wpsg'), array(
-				wpsg_mod_scaleprice::CALC_REPLACE => __('Ersetzung', 'wpsg'),
-				wpsg_mod_scaleprice::CALC_ADD => __('Addition', 'wpsg')
-			), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_calc']); ?>
-			 									
-			<div id="wpsg_mod_scaleprice_target"><?php echo $this->view['wpsg_mod_scaleprice']['list']; ?></div>
-			
-		</div>
-		
-		<?php } ?>
-		<br /><br />
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_scaleprice"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Staffelpreise', 'wpsg'); ?></a>			 
-	</div>
-	
-	
-</div>
Index: /views/mods/mod_scaleprice/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_scaleprice/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_scaleprice/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,202 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration der Staffelpreise in die Produktverwaltung
+	 */
+
+?>
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+ 
+		jQuery('#wpsg_mod_scaleprice_activ').bind('change', function() {
+ 
+			if (jQuery(this).attr('checked') == 'checked') jQuery('#wpsg_mod_scaleprice_layer').show();
+			else jQuery('#wpsg_mod_scaleprice_layer').hide();
+			
+		} ).change();
+
+		jQuery('#wpsg_mod_scaleprice_typ').bind('change', function() { wpsg_mod_scaleprice_refresh(); } );
+		jQuery('#wpsg_mod_scaleprice_calc').bind('change', function() { wpsg_mod_scaleprice_saveAjax(); } );
+		
+		<?php /* echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_downloadprodukte&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file*/?>
+				
+	} );
+
+	function wpsg_mod_scaleprice_add()
+	{
+
+		var wpsg_scale = jQuery('#wpsg_mod_scaleprice_scale').val();
+		var wpsg_value = jQuery('#wpsg_mod_scaleprice_value').val();
+		 
+		jQuery('#wpsg_mod_scaleprice_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=add',
+			data: { 
+				'scale': wpsg_scale,
+				'value': wpsg_value
+			},
+			success: function(data) {
+				
+				jQuery('#wpsg_mod_scaleprice_target').html(data);
+				wpsg_mod_scaleprice_clearErrorField();
+				 				
+			}
+		} );
+
+		return false;
+		
+	} // function wpsg_mod_scaleprice_add() 
+
+	function wpsg_mod_scaleprice_refresh()
+	{
+ 
+		jQuery('#wpsg_mod_scaleprice_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=refresh',
+			data: {
+				typ: jQuery('#wpsg_mod_scaleprice_typ').val(),
+				calc: jQuery('#wpsg_mod_scaleprice_calc').val()
+			},
+			success: function(data) {
+				
+				jQuery('#wpsg_mod_scaleprice_target').html(data);
+				wpsg_mod_scaleprice_clearErrorField();
+				
+			}
+		} );
+
+		return false;
+		
+	} // function wpsg_mod_scaleprice_refresh() 
+
+	function wpsg_mod_scaleprice_saveAjax()
+	{
+ 
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=ajaxSave',
+			data: {
+				typ: jQuery('#wpsg_mod_scaleprice_typ').val(),
+				calc: jQuery('#wpsg_mod_scaleprice_calc').val()
+			},
+			success: function(data) {
+
+				wpsg_mod_scaleprice_clearErrorField();
+			
+			}			
+		} );
+		
+	} // function wpsg_mod_scaleprice_saveAjax()
+
+	function wpsg_mod_scaleprice_clearErrorField()
+	{
+
+		var wpsg_product_edit_change_new = Array();
+
+		for (var i = 0; i < wpsg_product_edit_change.length; i++)
+		{
+
+			if (!wpsg_product_edit_change[i].match(/^wpsg_mod_scaleprice/))
+			{
+
+				wpsg_product_edit_change_new.push(wpsg_product_edit_change[i]);
+				
+			}
+			
+		} 
+
+		wpsg_product_edit_change = wpsg_product_edit_change_new;
+				
+	}
+	
+	function wpsg_mod_scaleprice_change(ev)
+	{
+ 
+		if (!wpsg_in_array(ev.target.id, wpsg_product_edit_change) && jQuery(ev.target).val() != "")
+		{
+
+			wpsg_product_edit_change.push(ev.target.id);
+			 
+		}
+		else if (jQuery(ev.target).val() == "" && wpsg_in_array(ev.target.id, wpsg_product_edit_change))
+		{
+ 
+		    for (var i = 0; i < wpsg_product_edit_change.length; i++) 
+			{
+		    	
+		        if (wpsg_product_edit_change[i] == ev.target.id)
+		        {
+
+			    	wpsg_product_edit_change.splice(i, 1);
+			    	jQuery('#' + ev.target.id).removeClass('wpsg_change_error');
+			         
+		        } 
+		    	
+		    }
+			
+		}
+		
+	} // function wpsg_mod_scaleprice_change(ev)
+	
+	function wpsg_mod_scaleprice_remove(scale_id)
+	{
+
+		if (!confirm('<?php echo __('Sind Sie sich sicher, dass sie diese Staffel entfernen mÃ¶chten?', 'wpsg'); ?>')) return false;
+ 
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=remove',
+			data: {
+				scale_id: scale_id
+			},
+			success: function(data) {
+				
+				jQuery('#wpsg_mod_scaleprice_row_' + scale_id).remove();
+				
+			}
+		} );
+
+		return false;
+		
+	} // function wpsg_mod_scaleprice_remove(scale_id)
+         
+/* ]]> */</script>
+
+<div class="postbox" id="wpsg_scaleprice">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Staffelpreise', 'wpsg'); ?></span>
+	</h3> 
+	<div class="inside">
+	
+		<?php if ($this->view['wpsg_mod_scaleprice']['product']['id'] <= 0) { ?>
+		<p><?php echo __('Staffelpreise kÃ¶nnen erst nach einmaligem Speichern des Produktes definiert werden.', 'wpsg'); ?>
+		<?php } else { ?>
+
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_scaleprice_activ', __('Staffelpreise aktiv', 'wpsg'), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_activ']); ?>
+		
+		<div id="wpsg_mod_scaleprice_layer">
+		 
+		 	<?php if (wpsg_isSizedArray($this->view['wpsg_mod_scaleprice']['arTyp']) && sizeof($this->view['wpsg_mod_scaleprice']['arTyp']) > 0) { ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_scaleprice_typ', __('BezugsgrÃ¶Ãe', 'wpsg'), array(
+				wpsg_mod_scaleprice::TYP_QUANTITY => __('Menge', 'wpsg'),
+				wpsg_mod_scaleprice::TYP_WEIGHT => __('Gewicht', 'wpsg')
+			), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_typ']); ?>
+			<?php } else { ?>
+			<input type="hidden" name="wpsg_mod_scaleprice_typ" id="wpsg_mod_scaleprice_typ" value="0" />
+			<?php } ?>
+			
+			<?php echo wpsg_drawForm_Select('wpsg_mod_scaleprice_calc', __('Berechnung', 'wpsg'), array(
+				wpsg_mod_scaleprice::CALC_REPLACE => __('Ersetzung', 'wpsg'),
+				wpsg_mod_scaleprice::CALC_ADD => __('Addition', 'wpsg')
+			), $this->view['wpsg_mod_scaleprice']['product']['wpsg_mod_scaleprice_calc']); ?>
+			 									
+			<div id="wpsg_mod_scaleprice_target"><?php echo $this->view['wpsg_mod_scaleprice']['list']; ?></div>
+			
+		</div>
+		
+		<?php } ?>
+				 
+	</div>
+</div>
Index: /views/mods/mod_scaleprice/scaleList.phtml
===================================================================
--- /views/mods/mod_scaleprice/scaleList.phtml	(revision 8528)
+++ /views/mods/mod_scaleprice/scaleList.phtml	(revision 5261)
@@ -6,32 +6,25 @@
 
 ?>
-
-<div class="col-sm-6 control-label" style="font-size:12px; font-weight:bold;">
-<?php echo __('Preisgrenzen', 'wpsg'); ?>
-</div>
-	<?php foreach ((array)$this->view['wpsg_mod_scaleprice']['arScale'] as $k => $scale) { ?>
-	<div class="col-sm-6" style="float:right;">
-		<div class="wpsg_form_field wpsg_mod_scaleprice_row" id="wpsg_mod_scaleprice_row_<?php echo $scale['id']; ?>">
-			<div class="wpsg_form_left">
-				<div class="wpsg_mod_scaleprice_label_scale" style="width:30px; float:left; font-size:12px;"><?php echo __('ab', 'wpsg'); ?></div>
-				<div class="wpsg_editable" style="width:75px; float:left; text-align:right; padding-top:4px" id="wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_scale"><?php echo wpsg_ff($scale['scale']); ?></div>
-				<div class="wpsg_mod_scaleprice_label_value" style="float:left; margin:0 0 0 10px; font-size:12px;">
-					<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
-					<?php echo $this->get_option('wpsg_mod_weight_unit'); ?>
-					<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
-					<?php echo $this->get_option('wpsg_mod_scaleprice_unit'); ?>
-					<?php } ?>
-				</div>		
-			</div>
-			<div class="wpsg_form_right">
-				<div style="width:75px; float:left; padding-top:4px; text-align:right;" class="wpsg_editable" id="wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_value"><?php echo wpsg_ff($scale['value']); ?></div>
-				<p style="float:left; margin:0 0 0 10px; font-size:12px;" class="waehrung"><?php echo $this->get_option('wpsg_currency'); ?></p>
-				<a style="float:right; margin-top:4px;" class="wpsg_glyphicon_right glyphicon glyphicon-minus-sign" href="" onclick="return wpsg_mod_scaleprice_remove(<?php echo $scale['id']; ?>);" title=""></a>
-			</div>
-			<div class="wpsg_clear"></div>
-		</div>
+<?php foreach ((array)$this->view['wpsg_mod_scaleprice']['arScale'] as $k => $scale) { ?>
+<div class="wpsg_form_field wpsg_mod_scaleprice_row" id="wpsg_mod_scaleprice_row_<?php echo $scale['id']; ?>">
+	<div class="wpsg_form_left">
+		<div class="wpsg_mod_scaleprice_label_scale"><?php echo __('ab', 'wpsg'); ?></div>
+		<div class="wpsg_editable" id="wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_scale"><?php echo wpsg_ff($scale['scale']); ?></div>
+		<div class="wpsg_mod_scaleprice_label_value">
+			<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
+			<?php echo $this->get_option('wpsg_mod_weight_unit'); ?>
+			<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
+			<?php echo __('StÃŒck', 'wpsg'); ?>
+			<?php } ?>
+		</div>		
+	</div>
+	<div class="wpsg_form_right">
+		<div class="wpsg_editable" id="wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_value"><?php echo wpsg_ff($scale['value']); ?></div>
+		<p class="waehrung"><?php echo $this->get_option('wpsg_currency'); ?></p>
+		<a class="wpsg_icon wpsg_icon_right wpsg_icon_remove" href="" onclick="return wpsg_mod_scaleprice_remove(<?php echo $scale['id']; ?>);" title=""></a>
 	</div>
 	<div class="wpsg_clear"></div>
-	
+</div>
+
 <script type="text/javascript">
 /* <![CDATA[ */
@@ -39,5 +32,5 @@
 	jQuery(document).ready(function() {
 
-		jQuery('#wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_scale').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=inlineEdit', {
+		jQuery('#wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_scale').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=inlineEdit', {
 			submitdata: { 
 				field: 'scale',
@@ -50,5 +43,5 @@
 		});
 
-		jQuery('#wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_value').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=inlineEdit', {
+		jQuery('#wpsg_mod_scaleprice_<?php echo $scale['id']; ?>_value').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_scaleprice&edit_id=<?php echo $this->view['wpsg_mod_scaleprice']['product']['id']; ?>&noheader=1&cmd=inlineEdit', {
 			submitdata: { 
 				field: 'value',
@@ -71,27 +64,21 @@
 <?php } ?>
 
-<div class="wpsg_clear"></div>
-<div class="col-sm-6 control-label" style="font-size:12px; font-weight:bold; ">
-<?php echo __('Neue Preisgrenze', 'wpsg'); ?>
-</div>
-<div class="col-sm-6">
-	<div class="wpsg_form_field">
-		<div class="wpsg_form_left">									
-			<div class="wpsg_mod_scaleprice_label_scale" style="width:30px; float:left; font-size:12px;"><?php echo __('ab', 'wpsg'); ?></div>
-			<input type="text" class="wpsg_mod_scaleprice_scale" style="width:75px; float:left;" name="wpsg_mod_scaleprice_scale" value="" id="wpsg_mod_scaleprice_scale" />
-			<div class="wpsg_mod_scaleprice_label_value" style="float:left; margin:0 0 0 10px; font-size:12px;">
-				<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
-				<?php echo $this->get_option('wpsg_mod_weight_unit'); ?>
-				<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
-				<?php echo $this->get_option('wpsg_mod_scaleprice_unit'); ?>
-				<?php } ?>
-			</div>						
-		</div>
-		<div class="wpsg_form_right">						
-			<input type="text" class="wpsg_mod_scaleprice_value" style="width:75px; float:left;" name="wpsg_mod_scaleprice_value" value="" id="wpsg_mod_scaleprice_value">
-			<p class="waehrung" style="float:left; margin:0 0 0 10px; font-size:12px;"><?php echo $this->get_option('wpsg_currency'); ?></p>
-			<a style="float:right; margin-top:4px;" class="wpsg_glyphicon_right glyphicon glyphicon-plus-sign" href="" onclick="return wpsg_mod_scaleprice_add();" title=""></a>								 
-		</div>
-		<div class="wpsg_clear"></div>
-	</div>	
-</div>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">									
+		<div class="wpsg_mod_scaleprice_label_scale"><?php echo __('ab', 'wpsg'); ?></div>
+		<input type="text" class="wpsg_mod_scaleprice_scale" name="wpsg_mod_scaleprice_scale" value="" id="wpsg_mod_scaleprice_scale" />
+		<div class="wpsg_mod_scaleprice_label_value">
+			<?php if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_WEIGHT) { ?>
+			<?php echo $this->get_option('wpsg_mod_weight_unit'); ?>
+			<?php } else if ($this->view['wpsg_mod_scaleprice']['typ'] == wpsg_mod_scaleprice::TYP_QUANTITY) { ?>
+			<?php echo __('StÃŒck', 'wpsg'); ?>
+			<?php } ?>
+		</div>						
+	</div>
+	<div class="wpsg_form_right">						
+		<input type="text" class="wpsg_mod_scaleprice_value" name="wpsg_mod_scaleprice_value" value="" id="wpsg_mod_scaleprice_value">
+		<p class="waehrung"><?php echo $this->get_option('wpsg_currency'); ?></p>
+		<a class="wpsg_icon wpsg_icon_right wpsg_icon_add" href="" onclick="return wpsg_mod_scaleprice_add();" title=""></a>								 
+	</div>
+	<div class="wpsg_clear"></div>
+</div>	
Index: ews/mods/mod_scaleprice/settings_edit.phtml
===================================================================
--- /views/mods/mod_scaleprice/settings_edit.phtml	(revision 8528)
+++ 	(revision )
@@ -1,9 +1,0 @@
-<?php
-
-/**
- * Template fÃŒr die Einstellungen des Staffelpreismoduls
- * Sollte nicht verÃ€ndert werden
- */
-
-?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_scaleprice_unit', __('Staffeleinheit', 'wpsg'), $this->get_option('wpsg_mod_scaleprice_unit'), array('help' => 'wpsg_mod_scaleprice_unit')); ?>
Index: /views/mods/mod_securepay/order_done.phtml
===================================================================
--- /views/mods/mod_securepay/order_done.phtml	(revision 8528)
+++ /views/mods/mod_securepay/order_done.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Bestellabschlussseite mit SecurePay
+	 * Template fÃŒr die BestellabschluÃseite mit SecurePay
 	 */
 
Index: /views/mods/mod_shippingadress/checkout_inner_prebutton.phtml
===================================================================
--- /views/mods/mod_shippingadress/checkout_inner_prebutton.phtml	(revision 8528)
+++ /views/mods/mod_shippingadress/checkout_inner_prebutton.phtml	(revision 5261)
@@ -9,5 +9,5 @@
 		<div class="wpsg_checkoutblock">
 			<label for="act_checkout_shippingadress">
-				<input id="act_checkout_shippingadress" class="wpsg_checkout formfield_checkbox" type="checkbox" name="wpsg[checkout][diff_shippingadress]" value="" <?php echo ((wpsg_isSizedInt($_SESSION['wpsg']['checkout']['diff_shippingadress']))?'checked="checked"':'') ?> onclick="view_checkout_shippingadresss()" />
+				<input id="act_checkout_shippingadress" class="wpsg_checkout formfield_checkbox" type="checkbox" name="wpsg[checkout][diff_shippingadress]" value="" <?php echo ($_SESSION['wpsg']['checkout']['diff_shippingadress'] == 1)? 'checked="checked"':'' ?> onclick="view_checkout_shippingadresss()" />
 				<?php echo __('Gesonderte Lieferadresse abweichend von der Rechnungsadresse verwenden', 'wpsg') ?>
 			</label>			
@@ -18,97 +18,60 @@
 		<div class="checkout_shippingadress" style="display:none;"> 
 		
-			<?php if ($this->view['pflicht']['firma'] != '2') { ?>
 			<div class="wpsg_checkoutblock">
-				<label for="shipping_firma" class="wpsg_checkout"><?php echo __("Firma:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
+				<label for="firma" class="wpsg_checkout"><?php echo __("Firma:", "wpsg"); ?></label>
+				<input class="wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_name" name="wpsg[checkout][shipping_firma]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['shipping_firma']); ?>" />
+			</div>
+		
+			<div class="wpsg_checkoutblock">
+				<label for="title" class="wpsg_checkout"><?php echo __("Anrede:", "wpsg"); ?>
+					<span class="wpsg_required">*</span>
 				</label>
-				<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_name" name="wpsg[checkout][shipping_firma]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['basket']['checkout']['shipping_firma'])); ?>" />
-			</div>
-			<?php } ?>
-		
-			<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-			<div class="wpsg_checkoutblock">
-				<label for="shipping_title" class="wpsg_checkout"><?php echo __("Anrede:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-				</label>
-				<select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" type="select" id="shipping_title" name="wpsg[checkout][shipping_title]">
-				<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-				<?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
-				<option value="<?php echo $i; /*wpsg_hspc($t);*/ ?>" <?php echo ((($this->view['basket']['checkout']['shipping_title']??'') === strval($i))?'selected="selected"':''); ?>><?php echo $t; ?></option>
-				<?php $i++; } ?>
+				<select class="validate[required_shipping] wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" type="select" name="wpsg[checkout][shipping_title]" id="shipping_title" >
+				<?php foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+				<option value="<?php echo $t; ?>" <?php echo (($this->view['basket']['checkout']['shipping_title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
+				<?php } ?>
 				</select>
 			</div>
-			<?php } ?>
 			
-			<?php if ($this->view['pflicht']['vname'] != '2') { ?>
 			<div class="wpsg_checkoutblock">
-				<label for="shipping_vname" class="wpsg_checkout"><?php echo __("Vorname:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
+				<label for="vname" class="wpsg_checkout"><?php echo __("Vorname:", "wpsg"); ?>
+					<span class="wpsg_required">*</span>
 				</label>
-				<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_vname" name="wpsg[checkout][shipping_vname]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['basket']['checkout']['shipping_vname'])); ?>" />
+				<input class="validate[required_shipping] wpsg_checkout <?php echo ((in_array("shipping_vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_vname" name="wpsg[checkout][shipping_vname]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['shipping_vname']); ?>" />
 			</div>
-			<?php } ?>
 				
-			<?php if ($this->view['pflicht']['name'] != '2') { ?>
 			<div class="wpsg_checkoutblock">
-				<label for="shipping_name" class="wpsg_checkout"><?php echo __("Name:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+				<label for="name" class="wpsg_checkout"><?php echo __("Name:", "wpsg"); ?>
+					<span class="wpsg_required">*</span>
 				</label>
-				<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_name" name="wpsg[checkout][shipping_name]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['basket']['checkout']['shipping_name'])); ?>" />
+				<input class="validate[required_shipping] wpsg_checkout <?php echo ((in_array("shipping_name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_name" name="wpsg[checkout][shipping_name]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['shipping_name']); ?>" />
 			</div>
-			<?php } ?>
 				
-			<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
+			<div class="wpsg_checkoutblock">
+				<label for="strasse" class="wpsg_checkout"><?php echo __("Strasse, Nr.:", "wpsg"); ?>
+					<span class="wpsg_required">*</span>
+				</label>
+				<input class="validate[required_shipping] wpsg_checkout <?php echo ((in_array("shipping_strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_strasse" name="wpsg[checkout][shipping_strasse]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['shipping_strasse']); ?>" />		
+			</div>
+			
+			<div class="wpsg_checkoutblock">
+				<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl:", "wpsg"); ?> 
+					<span class="wpsg_required">*</span>
+				</label>
+				<input class="validate[required_shipping] wpsg_checkout <?php echo ((in_array("shipping_plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="number" id="shipping_plz" name="wpsg[checkout][shipping_plz]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['shipping_plz']); ?>" />
+			</div>
 				
-				<?php if ($this->view['pflicht']['wpsg_showNr'] === '1') { ?>
-
-					<div class="wpsg_checkoutblock" id="wpsg_streetnr">
-						<label for="shipping_strasse" class="street wpsg_checkout"><?php echo __('StraÃe:', 'wpsg'); ?>
-							<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-							<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_strasse" name="wpsg[checkout][shipping_strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['shipping_strasse'])); ?>" />
-						</label>
-						<label for="shipping_nr" class="nr wpsg_checkout"><?php echo __('Nr:', 'wpsg'); ?>
-							<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-							<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_nr" name="wpsg[checkout][shipping_nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['shipping_nr'])); ?>" />
-						</label>
-					</div>
+			<div class="wpsg_checkoutblock">
+				<label for="ort" class="wpshopgermany_checkout"><?php echo __("Ort:", "wpsg"); ?> 
+					<span class="wpsg_required">*</span>
+				</label>
+				<input class="validate[required_shipping] wpsg_checkout <?php echo ((in_array("shipping_ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_ort" name="wpsg[checkout][shipping_ort]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['shipping_ort']); ?>" />
+			</div>
 				
-				<?php } else { ?>
-
-					<div class="wpsg_checkoutblock">
-						<label for="shipping_strasse" class="wpsg_checkout"><?php echo __("StraÃe, Nr.:", "wpsg"); ?>
-							<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-						</label>
-						<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_strasse" name="wpsg[checkout][shipping_strasse]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['basket']['checkout']['shipping_strasse'])); ?>" />
-					</div>
-				
-				<?php } ?> 
-				
-			<?php } ?>
-						
-			<?php if ($this->view['pflicht']['plz'] != '2') { ?>
 			<div class="wpsg_checkoutblock">
-				<label for="shipping_plz" class="wpsg_checkout"><?php echo __("Postleitzahl:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-				</label>
-				<input class="<?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_plz" name="wpsg[checkout][shipping_plz]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['basket']['checkout']['shipping_plz'])); ?>" />
-			</div>
-			<?php } ?>
-				
-			<?php if ($this->view['pflicht']['ort'] != '2') { ?>
-			<div class="wpsg_checkoutblock">
-				<label for="shipping_ort" class="wpshopgermany_checkout"><?php echo __("Ort:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-				</label>
-				<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="shipping_ort" name="wpsg[checkout][shipping_ort]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['basket']['checkout']['shipping_ort'])); ?>" />
-			</div>
-			<?php } ?>
-				
-			<?php if ($this->view['pflicht']['land'] != '2') { ?>
-			<div class="wpsg_checkoutblock">
-				<label for="shipping_land" class="wpsg_checkout"><?php echo __("Land:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-				</label>				
-				<select name="wpsg[checkout][shipping_land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required_shipping]':''); ?> wpsg_checkout <?php echo ((in_array("shipping_land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="shipping_land">
+				<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land:", "wpsg"); ?>
+					<span class="wpsg_required">*</span>
+				</label>					
+				<select name="wpsg[checkout][shipping_land]" class="wpsg_checkout <?php echo ((in_array("shipping_land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="shipping_land">
 					<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
 					<?php foreach ($this->view['laender'] as $l) { ?>
@@ -117,5 +80,4 @@
 				</select>
 			</div>
-			<?php } ?>
 		 
 			<script type="text/javascript">/* <![CDATA[ */
@@ -156,8 +118,4 @@
 					
 					view_checkout_shippingadresss();
-
-					land = <?php if (wpsg_isSizedInt($this->view['basket']['checkout']['shipping_land'])) echo $this->view['basket']['checkout']['shipping_land'];
-					else echo $this->get_option('wpsg_defaultland'); ?>;
-					jQuery('#shipping_land').val(land);
 					
 				});
Index: /views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml
===================================================================
--- /views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml	(revision 8528)
+++ /views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml	(revision 5261)
@@ -4,107 +4,74 @@
 	 * Template fÃŒr die Integration der Versandadresse in die Bestellansicht
 	 */
-	
+	//wpsg_debug($this->view);
 ?>
 
-<script>
+<script type="text/javascript">/* <![CDATA[ */
 
-	function wpsg_saveShippingAdress() {
+	function wpsg_editShippingAdress()
+	{
 
-        jQuery('#wpsg_backend_loading').show();
+		jQuery('#wpsg_ShippingDialog').dialog( {                   
+	        'dialogClass': 'wp-dialog',           
+	        'modal': true,
+	        'width': 600,
+	        'title': '<?php echo __('Lieferanschrift Ã€ndern', 'wpsg'); ?>',
+	        'autoOpen': true, 
+	        'closeOnEscape': true,      
+	        'buttons': {
+	            "<?php echo __('Speichern', 'wpsg'); ?>": function() {
 
-        jQuery.ajax( {
-            url: '<?php 
-				
-				echo wpsg_admin_url('Order', 'ajax', ['mod' => 'wpsg_mod_shippingadress', 'edit_id' => $this->view['data']['id']], ['noheader' => '1'], true);
-				
-			?>',
-            data: {
-                form_data: jQuery('#shipping_dialog_content input, #shipping_dialog_content select').serialize()
-            },
-            success: function() {
-
-				location.reload();
-
-            }
-        } );
+	            	jQuery('#wpsg_backend_loading').show();
+					jQuery(this).dialog('close');
+	            	
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_shippingadress&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1',
+						data: {
+							form_data: jQuery('#wpsg_ShippingDialog input, #wpsg_ShippingDialog select').serialize()
+						},
+						success: function(data) {
+ 
+							location.href = location.href;
+							
+						}
+					} );
+	                
+	            }
+	        }
+	    } );
 
 		return false;
 		
-	} 
+	}
 
-</script>
+/* ]]> */</script>
 
-<div class="modal fade" tabindex="-1" role="dialog" id="wpsg_customer_shipping_edit">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title"><?php echo __('Lieferanschrift bearbeiten', 'wpsg'); ?></h4>
-            </div>
-            <div class="modal-body">
-
-                <div id="shipping_dialog_content">
-                    <?php echo wpsg_drawForm_Input('dialog_shipping_firma', __('Firma', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_firma']??''); ?>
-                    <?php echo wpsg_drawForm_Select('dialog_shipping_title', __('Anrede', 'wpsg'), $this->view['arTitles'], $this->view['wpsg_mod_shippingadress']['shipping_title']??'', array('noIndex' => true)); ?>
-                    <?php echo wpsg_drawForm_Input('dialog_shipping_vname', __('Vorname', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_vname']??''); ?>
-                    <?php echo wpsg_drawForm_Input('dialog_shipping_name', __('Name', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_name']??''); ?>
-                    <?php echo wpsg_drawForm_Input('dialog_shipping_strasse', __('StraÃe', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_strasse']??''); ?>
-						
-					<?php if (wpsg_getStr($this->view['pflicht']['wpsg_showNr']) === '1') { ?>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<?php echo __('Lieferadresse', 'wpsg'); ?>:
+		<a style="float:none; display:inline-block;" onclick="return wpsg_editShippingAdress();" class="wpsg_icon wpsg_icon_edit" href="#" title="<?php echo __('Rechnungsanschrift Ã€ndern', 'wpsg'); ?>"></a>
+	</div>
+	<div class="wpsg_form_right">
+		<p>		
+			<?php if (trim($this->view['wpsg_mod_shippingadress']['shipping_firma']) != '') { ?>			
+			<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_firma']); ?><br />
+			<?php } ?>	
+			<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_title']); ?> <?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_vname']); ?> <?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_name']); ?><br />
+			<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_strasse']); ?><br />
+			<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_plz']); ?> <?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_ort']); ?> <?php echo wpsg_hspc($this->view['shipping_country']['kuerzel']); ?><br />
+		</p>						
+	</div>
 	
-						<?php echo wpsg_drawForm_Input('dialog_shipping_nr', __('Hausnummer', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_nr']??''); ?>
-						
-					<?php } ?>
-						
-                    <?php echo wpsg_drawForm_Input('dialog_shipping_plz', __('Postleitzahl', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_plz']??''); ?>
-                    <?php echo wpsg_drawForm_Input('dialog_shipping_ort', __('Ort', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_ort']??''); ?>
-                    <?php echo wpsg_drawForm_Select('dialog_shipping_land', __('Land', 'wpsg'), $this->view['arCountry'], $this->view['wpsg_mod_shippingadress']['shipping_land']??''); ?>
-					
-					<br />
-					
-					<?php echo wpsg_drawForm_Checkbox('dialog_delete', __('Lieferadresse lÃ¶schen', 'wpsg'), false); ?>
-					
-                </div>
-
-            </div>
-            
-            <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('SchlieÃen', 'wpsg'); ?></button>
-                <button type="button" class="btn btn-primary" onclick="return wpsg_saveShippingAdress();"><?php echo __('Speichern', 'wpsg'); ?></button>
-            </div>
-        </div>
-    </div>
+	<div id="wpsg_ShippingDialog" class="wpsg_dialog" style="display:none;">
+		<?php echo wpsg_drawForm_Input('dialog_shipping_firma', __('Firma', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_firma']); ?>
+		<?php echo wpsg_drawForm_Select('dialog_shipping_title', __('Anschrift', 'wpsg'), $this->view['arTitles'], $this->view['wpsg_mod_shippingadress']['shipping_title'], array('noIndex' => true)); ?>
+		<?php echo wpsg_drawForm_Input('dialog_shipping_vname', __('Vorname', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_vname']); ?>
+		<?php echo wpsg_drawForm_Input('dialog_shipping_name', __('Name', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_name']); ?>
+		<?php echo wpsg_drawForm_Input('dialog_shipping_strasse', __('StraÃe', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_strasse']); ?>
+		<?php echo wpsg_drawForm_Input('dialog_shipping_plz', __('Postleitzahl', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_plz']); ?>
+		<?php echo wpsg_drawForm_Input('dialog_shipping_ort', __('Ort', 'wpsg'), $this->view['wpsg_mod_shippingadress']['shipping_ort']); ?>
+		<?php echo wpsg_drawForm_Select('dialog_shipping_land', __('Land', 'wpsg'), $this->view['arCountry'], $this->view['wpsg_mod_shippingadress']['shipping_land']); ?>
+	</div>
+	
 </div>
-
-<?php echo wpsg_drawForm_TextStart(); ?>
-
-	<?php if (wpsg_isSizedArray($this->view['wpsg_mod_shippingadress'])) { ?>
-	
-		<?php if (trim($this->view['wpsg_mod_shippingadress']['shipping_firma']) != '') { ?>
-		<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_firma']); ?><br />
-		<?php } ?>
-		<?php
-	
-			if (wpsg_isSizedString($this->view['wpsg_mod_shippingadress']['shipping_title']) && $this->view['wpsg_mod_shippingadress']['shipping_title'] != '-1')
-				echo $this->view['arTitles'][$this->view['wpsg_mod_shippingadress']['shipping_title']];
-	
-		?> <?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_vname']); ?> <?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_name']); ?><br />
-		<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_strasse'].rtrim(' '.wpsg_getStr($this->view['wpsg_mod_shippingadress']['shipping_nr']))); ?><br />
-		<?php $lk = $this->view['wpsg_mod_shippingadress']['oCountry']->getShorttext(); ?>
-		<?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_plz']); ?> <?php echo wpsg_hspc($this->view['wpsg_mod_shippingadress']['shipping_ort']); ?> <?php echo wpsg_hspc($lk); ?><br />
-		<a style="position: absolute; right:25px; top:10px; display:inline-block;" data-toggle="modal" data-target="#wpsg_customer_shipping_edit" href="#" title="<?php echo __('Lieferanschrift Ã€ndern', 'wpsg'); ?>">
-			<span class="glyphicon glyphicon-pencil"></span>
-		</a>
-
-	<?php } else { ?>
-			
-		<?php echo __('Keine abweichende Lieferadresse angegeben.', 'wpsg'); ?>
-		
-		<a style="position: absolute; right:25px; top:10px; display:inline-block;" data-toggle="modal" data-target="#wpsg_customer_shipping_edit" href="#" title="<?php echo __('Lieferanschrift Ã€ndern', 'wpsg'); ?>">
-			<span class="glyphicon glyphicon-pencil"></span>
-		</a>
-		
-	<?php } ?>
-
-<?php echo wpsg_drawForm_TextEnd(__('Lieferadresse', 'wpsg')); ?>
-
+<div class="wpsg_clear"></div>
Index: /views/mods/mod_shs/settings_edit.phtml
===================================================================
--- /views/mods/mod_shs/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_shs/settings_edit.phtml	(revision 5261)
@@ -37,17 +37,37 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_shs_mwstland'), array('help' => 'wpsg_mod_shs_mwstland')); ?>
 <br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_mobileversion', __('Mobile Version nutzen', 'wpsg'), $this->get_option('wpsg_mod_shs_mobileversion')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_creditcard_cardholder', __('Kartenhinhaber ist Pflichtfeld (Nur Kreditkarte)', 'wpsg'), $this->get_option('wpsg_mod_shs_creditcard_cardholder')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_creditcard_optionalcardholder', __('Karteninhaber ist Optional (Nur Kreditkarte)', 'wpsg'), $this->get_option('wpsg_mod_shs_creditcard_optionalcardholder')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_creditcard_sslifvisaenrolledu', __('Bei VISA ohne Autorisierung Zahlung erlauben (Nur Kreditkarte / VISA)', 'wpsg'), $this->get_option('wpsg_mod_shs_creditcard_sslifvisaenrolledu')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_directdebit_accountholder', __('Kontoinhaber ist Pflichtfeld (Nur Lastschrift)', 'wpsg'), $this->get_option('wpsg_mod_shs_directdebit_accountholder')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_directdebit_optionalaccountholder', __('Kontoinhaber ist Optional (Nur Lastschrift)', 'wpsg'), $this->get_option('wpsg_mod_shs_directdebit_optionalaccountholder')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_directdebit_checklist', __('Sperrlistenabfrage (Nur Lastschrift, muss freigeschaltet sein)', 'wpsg'), $this->get_option('wpsg_mod_shs_directdebit_checklist')); ?>
-
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label><?php echo __('Formularoptionen', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<label> 
+			<input <?php echo (($this->get_option('wpsg_mod_shs_mobileversion') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_mobileversion" name="wpsg_mod_shs_mobileversion" /><?php echo __('Mobile Version nutzen', 'wpsg'); ?>			
+		</label><br />
+		<label>
+			<input <?php echo (($this->get_option('wpsg_mod_shs_creditcard_cardholder') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_creditcard_cardholder" name="wpsg_mod_shs_creditcard_cardholder" /><?php echo __('Kartenhinhaber ist Pflichtfeld (Nur Kreditkarte)', 'wpsg'); ?>			
+		</label><br />
+		<label>
+			<input <?php echo (($this->get_option('wpsg_mod_shs_creditcard_optionalcardholder') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_creditcard_optionalcardholder" name="wpsg_mod_shs_creditcard_optionalcardholder" /><?php echo __('Kartenhinhaber ist Optional (Nur Kreditkarte)', 'wpsg'); ?>			
+		</label><br />
+		<label>
+			<input <?php echo (($this->get_option('wpsg_mod_shs_creditcard_sslifvisaenrolledu') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_creditcard_sslifvisaenrolledu" name="wpsg_mod_shs_creditcard_sslifvisaenrolledu" /><?php echo __('Bei VISA ohne Autorisierung zahlung erlauben (Nur Kreditkarte / VISA)', 'wpsg'); ?>			
+		</label><br />
+		<label>
+			<input <?php echo (($this->get_option('wpsg_mod_shs_directdebit_accountholder') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_directdebit_accountholder" name="wpsg_mod_shs_directdebit_accountholder" /><?php echo __('Kontoinhaber ist Pflichtfeld (Nur Lastschrift)', 'wpsg'); ?>			
+		</label><br />
+		<label>
+			<input <?php echo (($this->get_option('wpsg_mod_shs_directdebit_optionalaccountholder') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_directdebit_optionalaccountholder" name="wpsg_mod_shs_directdebit_optionalaccountholder" /><?php echo __('Kontoinhaber ist Optional (Nur Lastschrift)', 'wpsg'); ?>			
+		</label><br />
+		<label>
+			<input <?php echo (($this->get_option('wpsg_mod_shs_directdebit_checklist') == '1')?'checked="checked"':''); ?> style="margin-right:5px; margin-top:0px; float:none;" type="checkbox" class="checkbox" value="1" id="wpsg_mod_shs_directdebit_checklist" name="wpsg_mod_shs_directdebit_checklist" /><?php echo __('Sperrlistenabfrage (Nur Lastschrift, muss freigeschaltet sein)', 'wpsg'); ?>			
+		</label>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
 <br />
 <?php echo wpsg_drawForm_Select('wpsg_mod_shs_transactiontype', __('Autorisierung', 'wpsg'), array('preauthorization', 'authorization'), $this->get_option('wpsg_mod_shs_transactiontype'), array('help' => 'wpsg_mod_shs_transactiontype')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_shs_autostart'), array('help' => 'wpsg_mod_shs_autostart')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_autoend', __('Nach Abschluss direkt auf Fehler- bzw. Erfolgsseite leiten', 'wpsg'), $this->get_option('wpsg_mod_shs_autoend'), array('help' => 'wpsg_mod_shs_autoend')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_shs_autoend', __('Nach AbschluÃ direkt auf Fehler- bzw. Erfolgsseite leiten', 'wpsg'), $this->get_option('wpsg_mod_shs_autoend'), array('help' => 'wpsg_mod_shs_autoend')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_page_mod_shs_success', __('Erfolgsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_shs_success'), array('help' => 'wpsg_mod_shs_success')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_page_mod_shs_error', __('Fehlerseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_shs_error'), array('help' => 'wpsg_mod_shs_error')); ?>
Index: /views/mods/mod_skrill/order_done.phtml
===================================================================
--- /views/mods/mod_skrill/order_done.phtml	(revision 8528)
+++ /views/mods/mod_skrill/order_done.phtml	(revision 5261)
@@ -27,5 +27,5 @@
 	<input type="hidden" name="lastname" value="<?php echo wpsg_hspc($this->view['kunde']['name']); ?>" />
 	<input type="hidden" name="date_of_birth" value="<?php echo wpsg_hspc(date('dmY', strtotime($this->view['kunde']['geb']))); ?>" />
-	<input type="hidden" name="address" value="<?php echo wpsg_hspc(rtrim($this->view['kunde']['strasse'].' '.wpsg_getStr($this->view['kunde']['nr']))); ?>" />
+	<input type="hidden" name="address" value="<?php echo wpsg_hspc($this->view['kunde']['strasse']); ?>" />
 	<input type="hidden" name="phone_number" value="<?php echo wpsg_hspc($this->view['kunde']['tel']); ?>" />
 	<input type="hidden" name="postal_code" value="<?php echo wpsg_hspc($this->view['kunde']['plz']); ?>" />
@@ -42,5 +42,5 @@
 	<input type="hidden" name="detail1_text" value="<?php echo wpsg_hspc($this->view['order']['onr']); ?>" />
 		
-	<input type="image" src="<?php echo WPSG_URL_CONTENT; ?>plugins/<?php echo WPSG_FOLDERNAME; ?>/views/mods/mod_skrill/skrill-moneybookers-payby-border_de_150x106.png" alt="<?php echo __('Bezahlen mit Skrill', 'wpsg'); ?>" />
+	<input type="image" src="<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/views/mods/mod_skrill/skrill-moneybookers-payby-border_de_150x106.png" alt="<?php echo __('Bezahlen mit Skrill', 'wpsg'); ?>" />
 
 	<p>
@@ -54,5 +54,5 @@
 
 	jQuery(document).ready(function() {
-		jQuery('#wpsg_skrill_payform').trigger('submit');
+		jQuery('#wpsg_skrill_payform').submit();
 	} );
 
Index: /views/mods/mod_spconditions/conditionList.phtml
===================================================================
--- /views/mods/mod_spconditions/conditionList.phtml	(revision 8528)
+++ /views/mods/mod_spconditions/conditionList.phtml	(revision 5261)
@@ -11,9 +11,5 @@
 	
 		<?php echo wpsg_drawForm_Input('', __('Id', 'wpsg'), $v['id'], array('text' => true)); ?>
-		<?php $artemp = Array();
-		foreach ($this->arShipping as $key => $val)
-			$artemp[] = $val['name'];
-		?>
-		<?php echo wpsg_drawForm_Select('shipping_id', __('Versandart', 'wpsg'), wpsg_getArray($artemp), $v['shipping_id']); ?>
+		<?php echo wpsg_drawForm_Select('shipping_id', __('Versandart', 'wpsg'), $this->view['arShipping'], $v['shipping_id']); ?>
 		<hr />
 		
Index: /views/mods/mod_spconditions/settings_edit.phtml
===================================================================
--- /views/mods/mod_spconditions/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_spconditions/settings_edit.phtml	(revision 5261)
@@ -12,5 +12,5 @@
 			<div class="fulltab">
 				<?php echo __('Versand- und Zahlungsbedingungen', 'wpsg'); ?>
-				<a title="<?php echo __('Neue Versand- und Zahlungsbedingung anlegen', 'wpsg'); ?>" href="" class="wpsg_glyphicon_right glyphicon glyphicon-plus-sign" onclick="return wpsg_addSPCondition();"></a>
+				<a title="<?php echo __('Neue Versand- und Zahlungsbedingung anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addSPCondition();"></a>
 			</div>
 		</div>
Index: /views/mods/mod_statistics/admin_setcapabilities.phtml
===================================================================
--- /views/mods/mod_statistics/admin_setcapabilities.phtml	(revision 8528)
+++ /views/mods/mod_statistics/admin_setcapabilities.phtml	(revision 5261)
@@ -13,5 +13,5 @@
 	<td class="wpsg_col_cap">
 		<input type="hidden" name="wpsg_cap[<?php echo $role_key; ?>][wpsg_statistics]" value="0" />
-		<input type="checkbox" <?php echo ((isset($r['capabilities']['wpsg_statistics']))?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_statistics]" value="1" /> 
+		<input type="checkbox" <?php echo (($r['capabilities']['wpsg_statistics'] == "1")?'checked="checked"':''); ?> name="wpsg_cap[<?php echo $role_key; ?>][wpsg_statistics]" value="1" /> 
 	</td>
 	<?php } ?>
Index: /views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml
===================================================================
--- /views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml	(revision 5261)
@@ -18,24 +18,15 @@
 	
 <?php 
-	$barChartJS = Array();
-	$pieChartJS = Array();
-	$barChartJS['amount'] = '';
-	$barChartJS['payment'] = '';
-	$barChartJS['total'] = '';
 
-	$pieChartJS['amount'] = '';
-	$pieChartJS['sales'] = '';
-	$pieChartJS['percent'] = '';
-	
 	foreach ($this->view['chart']['data']['records'] as $data) 
 	{ 
 		$barChartJS['payment'] .= "'".wpsg_hspc($data['name'])."', "; 
 		$barChartJS['total'] .= wpsg_hspc($data['total']).", "; 
-		$pieChartJS['percent'] .= "['".wpsg_hspc($data['name'])."', ".wpsg_hspc($data['percent'])."], ";
+		$pieChartJS .= "['".wpsg_hspc($data['name'])."', ".wpsg_hspc($data['percent'])."], ";
 	} 
 	
 	$barChartJS['payment'] = substr($barChartJS['payment'], 0, -2); 
 	$barChartJS['total'] = substr($barChartJS['total'], 0, -2); 
-	$pieChartJS['percent'] = substr($pieChartJS['percent'], 0, -2);
+	$pieChartJS = substr($pieChartJS, 0, -2);
 
 ?>
@@ -65,5 +56,5 @@
 	                renderer: jQuery.jqplot.CategoryAxisRenderer,
 	                ticks: payment,
-	                label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['xaxis']['label'])); ?>'
+	                label:'<?php echo wpsg_hspc($this->view['chart']['info']['xaxis']['label']); ?>'
 	            },
 	            yaxis:{
@@ -78,5 +69,5 @@
 	    });
 
-	    var data = [<?php echo $pieChartJS['percent']; ?>];
+	    var data = [<?php echo $pieChartJS; ?>];
 		  
 	  	var chartsalestopaymentmethodPie = jQuery.jqplot ('chartsalestopaymentmethod-pie', [data],
Index: /views/mods/mod_statistics/charttopsellertosales/all.phtml
===================================================================
--- /views/mods/mod_statistics/charttopsellertosales/all.phtml	(revision 8528)
+++ /views/mods/mod_statistics/charttopsellertosales/all.phtml	(revision 5261)
@@ -21,13 +21,5 @@
 
 <?php 
-	$barChartJS = Array();
-	$pieChartJS = Array();
-	$barChartJS['amount'] = '';
-	$barChartJS['payment'] = '';
-	$barChartJS['total'] = '';
-	
-	$pieChartJS['amount'] = '';
-	$pieChartJS['sales'] = '';
-	
+
 	foreach ($this->view['chart']['data']['records'] as $data) 
 	{ 
@@ -92,5 +84,5 @@
                         textColor: '#666666'
 	                },
-	                label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['xaxis']['label'])); ?>',
+	                label:'<?php echo wpsg_hspc($this->view['chart']['info']['xaxis']['label']); ?>',
 	                labelOptions: {
                         fontFamily: 'Arial',
Index: /views/mods/mod_statistics/chartturnover/all.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnover/all.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnover/all.phtml	(revision 5261)
@@ -5,5 +5,4 @@
 	if (wpsg_isSizedArray($this->view['chart']['data'])) 
 	{
-		unset($this->view['chart']['data']['template']);
 		
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
@@ -44,5 +43,5 @@
 					$k++;
 				}
-
+			
 				if ($j == count($this->view['chart']['data'][$i]['records']) - 1) { 
 			  		$chartJS['area']['area'.$i] = '['.implode(',', $chartJS['area']['area'.$i]).']'; 
@@ -81,5 +80,5 @@
 		 var <?php echo $index; ?> = <?php echo $area; ?>;
 	  <?php } ?>
-
+		
 	  var chartannualturnoverLine = jQuery.jqplot('chartannualturnover-line', [<?php echo implode(',', array_keys($chartJS['area'])); ?>], {
 		  animate: true,
Index: /views/mods/mod_statistics/chartturnover/day.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnover/day.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnover/day.phtml	(revision 5261)
@@ -2,16 +2,10 @@
 
 <?php 
-	
+
 	if (wpsg_isSizedArray($this->view['chart']['data'])) 
 	{
-		$cnt = count($this->view['chart']['data']);
-		unset($this->view['chart']['data']['template']);
-		$cnt = count($this->view['chart']['data']);
 		
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
 		{
-			//if (!key_exists('label', $this->view['chart']['data'][$i])) continue;
-			//$lbl = $this->view['chart']['data'][$i]['label'];
-			//if ($lbl == null) continue;
 			
 			$chartJS['legend'][$i] = "{";
@@ -31,39 +25,34 @@
 			
 			$j = 0;
-
-			if (wpsg_isSizedArray($this->view['chart']['data'][$i]))
+			
+			foreach ((array)$this->view['chart']['data'][$i]['records'] as $index => $record)
 			{
-					
-				foreach ((array)$this->view['chart']['data'][$i]['records'] as $index => $record)
+				
+				//immer das Datum vom Rootelement nutzen
+				$k = 0 ;
+				
+				foreach ($this->view['chart']['data'][0]['records'] as $rindex => $rrecord)
 				{
-					
-					//immer das Datum vom Rootelement nutzen
-					$k = 0 ;
-					
-					foreach ($this->view['chart']['data'][0]['records'] as $rindex => $rrecord)
-					{
-						if ($j == $k)
-						{							
-							if (mktime($record['hour'], 0, 0, $record['month'], $record['day'], $record['year']) <= mktime(date_i18n('H'), 0, 0, date_i18n('m'), date_i18n('d'), date_i18n('Y')))
-							{
-								$chartJS['area']['area'.$i][] = "['".$rrecord['year'].'/'.$rrecord['month'].'/'.$rrecord['day']." ".$rrecord['hour'].":00:00', ".wpsg_hspc($record['total'])."]"; 
-							} 
-						}	
-						$k++;
-					}
-				
-					if ($j == count($this->view['chart']['data'][$i]['records']) - 1) { 
-				  		$chartJS['area']['area'.$i] = '['.implode(',', (array)$chartJS['area']['area'.$i]).']'; 
-				  	}
-				  	
-				  	$j++;
+					if ($j == $k)
+					{							
+						if (mktime($record['hour'], 0, 0, $record['month'], $record['day'], $record['year']) <= mktime(date_i18n('H'), 0, 0, date_i18n('m'), date_i18n('d'), date_i18n('Y')))
+						{
+							$chartJS['area']['area'.$i][] = "['".$rrecord['year'].'/'.$rrecord['month'].'/'.$rrecord['day']." ".$rrecord['hour'].":00:00', ".wpsg_hspc($record['total'])."]"; 
+						} 
+					}	
+					$k++;
 				}
 			
-			}
+				if ($j == count($this->view['chart']['data'][$i]['records']) - 1) { 
+			  		$chartJS['area']['area'.$i] = '['.implode(',', (array)$chartJS['area']['area'.$i]).']'; 
+			  	}
+			  	
+			  	$j++;
+			} 
 			
 		}
 
 	}
-	$j++;
+	
 ?>
 
@@ -109,5 +98,5 @@
 	        },
 	        yaxis:{
-                label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['yaxis']['label'])); ?>',
+                label:'<?php echo wpsg_hspc($this->view['chart']['info']['yaxis']['label']); ?>',
                 tickOptions: {
                 	formatter: wpsg_statistics_number_format
Index: /views/mods/mod_statistics/chartturnover/month.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnover/month.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnover/month.phtml	(revision 5261)
@@ -5,5 +5,4 @@
 	if (wpsg_isSizedArray($this->view['chart']['data'])) 
 	{
-		unset($this->view['chart']['data']['template']);
 		
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
@@ -19,5 +18,5 @@
 			$chartJS['legend'][$i] .= "	highlighter: {";
 			
-			$chartJS['legend'][$i] .= "		formatString: '<table><tr><td>%s ".wpsg_getStr($this->view['chart']['data'][$i]['year']).", %s ".$this->get_option('wpsg_currency')."</td></tr></table>'";
+			$chartJS['legend'][$i] .= "		formatString: '<table><tr><td>%s ".$this->view['chart']['data'][$i]['year'].", %s ".$this->get_option('wpsg_currency')."</td></tr></table>'";
 			
 			$chartJS['legend'][$i] .= "	}";
@@ -75,5 +74,5 @@
 		 var <?php echo $index; ?> = <?php echo $area; ?>;
 	  <?php } ?>
-
+		
 	  var chartannualturnoverLine = jQuery.jqplot('chartannualturnover-line', [<?php echo implode(',', array_keys($chartJS['area'])); ?>], {
 		  animate: true,
@@ -91,6 +90,5 @@
 	        xaxis:{
 	          	renderer:jQuery.jqplot.DateAxisRenderer,
-	          	label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['xaxis']['label'])); ?>',
-				label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['data'][0]['label'])); ?>',
+	          	label:'<?php echo wpsg_hspc($this->view['chart']['info']['xaxis']['label']); ?>',
 	          	tickOptions:{formatString:'%d'},
 	          	tickInterval: '1 day',
Index: /views/mods/mod_statistics/chartturnover/quarter.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnover/quarter.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnover/quarter.phtml	(revision 5261)
@@ -6,6 +6,5 @@
 	if (wpsg_isSizedArray($this->view['chart']['data'])) 
 	{
-		unset($this->view['chart']['data']['template']);
-		
+
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
 		{
@@ -20,5 +19,5 @@
 			$chartJS['legend'][$i] .= "	highlighter: {";
 			
-			$chartJS['legend'][$i] .= "		formatString: '<table><tr><td>KW %s ".wpsg_getStr($this->view['chart']['data'][$i]['year']).", %s ".$this->get_option('wpsg_currency')."</td></tr></table>'";
+			$chartJS['legend'][$i] .= "		formatString: '<table><tr><td>KW %s ".$this->view['chart']['data'][$i]['year'].", %s ".$this->get_option('wpsg_currency')."</td></tr></table>'";
 			
 			$chartJS['legend'][$i] .= "	}";
@@ -95,6 +94,5 @@
 	      axes:{
 	        xaxis:{
-	          	label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['xaxis']['label'])); ?>',
-	          	label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['data'][0]['label'])); ?>',
+	          	label:'<?php echo wpsg_hspc($this->view['chart']['info']['xaxis']['label']); ?>',
 	          	syncTicks: false,
 	          	tickOptions:{formatString:'KW %d'},
Index: /views/mods/mod_statistics/chartturnover/week.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnover/week.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnover/week.phtml	(revision 5261)
@@ -7,7 +7,4 @@
 
 		$series = ''; 
-		$cnt = count($this->view['chart']['data']);
-		unset($this->view['chart']['data']['template']);
-		$cnt = count($this->view['chart']['data']);
 		
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
@@ -23,5 +20,5 @@
 			$chartJS['legend'][$i] .= "	highlighter: {";
 			
-			$chartJS['legend'][$i] .= "		formatString: '<table><tr><td>%s ".wpsg_getStr($this->view['chart']['data'][$i]['year']).", %s ".$this->get_option('wpsg_currency')."</td></tr></table>'";
+			$chartJS['legend'][$i] .= "		formatString: '<table><tr><td>%s ".$this->view['chart']['data'][$i]['year'].", %s ".$this->get_option('wpsg_currency')."</td></tr></table>'";
 			
 			$chartJS['legend'][$i] .= "	}";
@@ -101,5 +98,5 @@
 	        },
 	        yaxis:{
-                label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['yaxis']['label'])); ?>',
+                label:'<?php echo wpsg_hspc($this->view['chart']['info']['yaxis']['label']); ?>',
                 tickOptions: {
                 	formatter: wpsg_statistics_number_format
Index: /views/mods/mod_statistics/chartturnover/year.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnover/year.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnover/year.phtml	(revision 5261)
@@ -5,5 +5,4 @@
 	if (wpsg_isSizedArray($this->view['chart']['data'])) 
 	{
-		unset($this->view['chart']['data']['template']);
 		
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
@@ -39,5 +38,5 @@
 						if (mktime(0, 0, 0, $record['month'], 1, $record['year']) <= mktime(0, 0, 0, date_i18n('m'), 1, date_i18n('Y')))
 						{
-							$chartJS['area']['area'.$i][] = "['".$j."', ".wpsg_hspc($record['total'])."]"; 
+							$chartJS['area']['area'.$i][] .= "['".$j."', ".wpsg_hspc($record['total'])."]"; 
 						} 					
 						$chartJS['ticks']['ticks'.$i][] = '['.$j.', \''.$record['tick'].'\']'; 
@@ -99,5 +98,5 @@
         	  rendererOptions:{tickRenderer:
         		  jQuery.jqplot.CanvasAxisTickRenderer}, 
-	          	label:'<?php echo wpsg_hspc(wpsg_getStr($this->view['chart']['info']['xaxis']['label'])); ?>',
+	          	label:'<?php echo wpsg_hspc($this->view['chart']['info']['xaxis']['label']); ?>',
 	          	syncTicks: false,
 	          	tickOptions:{formatString:'%d'},
Index: /views/mods/mod_statistics/chartturnoverperhour/all.phtml
===================================================================
--- /views/mods/mod_statistics/chartturnoverperhour/all.phtml	(revision 8528)
+++ /views/mods/mod_statistics/chartturnoverperhour/all.phtml	(revision 5261)
@@ -5,6 +5,5 @@
 	if (wpsg_isSizedArray($this->view['chart']['data'])) 
 	{
-		unset($this->view['chart']['data']['template']);
-		
+
 		for ($i = 0; $i < count($this->view['chart']['data']); $i++)
 		{
@@ -27,32 +26,27 @@
 			$j = 0;
 			
-			if (wpsg_isSizedArray($this->view['chart']['data'][$i]))
+			foreach ((array)$this->view['chart']['data'][$i]['records'] as $index => $record)
 			{
+				//immer das Datum vom Rootelement nutzen
+				$k = 0 ;
 				
-				foreach ((array)$this->view['chart']['data'][$i]['records'] as $index => $record)
+				foreach ($this->view['chart']['data'][0]['records'] as $rindex => $rrecord)
 				{
-					//immer das Datum vom Rootelement nutzen
-					$k = 0 ;
-					
-					foreach ($this->view['chart']['data'][0]['records'] as $rindex => $rrecord)
-					{
-						if ($j == $k)
-						{	
-							//if (mktime($record['hour'], 0, 0, $record['month'], $record['day'], $record['year']) <= mktime(date('H'), 0, 0, date('m'), date('d'), date('Y')))
-							//{
-								$chartJS['area']['area'.$i][] = "['".$rrecord['year'].'/'.$rrecord['month'].'/'.$rrecord['day']." ".$rrecord['hour'].":00:00', ".wpsg_hspc($record['total'])."]"; 
-							//} 
-						}	
-						$k++;
-					}
-				
-					if ($j == count($this->view['chart']['data'][$i]['records']) - 1) { 
-				  		$chartJS['area']['area'.$i] = '['.implode(',', (array)$chartJS['area']['area'.$i]).']'; 
-				  	}
-				  	
-				  	$j++;
+					if ($j == $k)
+					{	
+						//if (mktime($record['hour'], 0, 0, $record['month'], $record['day'], $record['year']) <= mktime(date('H'), 0, 0, date('m'), date('d'), date('Y')))
+						//{
+							$chartJS['area']['area'.$i][] = "['".$rrecord['year'].'/'.$rrecord['month'].'/'.$rrecord['day']." ".$rrecord['hour'].":00:00', ".wpsg_hspc($record['total'])."]"; 
+						//} 
+					}	
+					$k++;
 				}
 			
-			}
+				if ($j == count($this->view['chart']['data'][$i]['records']) - 1) { 
+			  		$chartJS['area']['area'.$i] = '['.implode(',', (array)$chartJS['area']['area'.$i]).']'; 
+			  	}
+			  	
+			  	$j++;
+			} 
 			
 		}
Index: /views/mods/mod_statistics/customermap/all.phtml
===================================================================
--- /views/mods/mod_statistics/customermap/all.phtml	(revision 8528)
+++ /views/mods/mod_statistics/customermap/all.phtml	(revision 5261)
@@ -2,7 +2,7 @@
 
 	/**
-	 * Template fï¿œr die Anzeige der Kundenkarte innerhalb des Statistikmoduls
+	 * Template für die Anzeige der Kundenkarte innerhalb des Statistikmoduls
 	 */
- 
+
 ?> 
 <script type="text/javascript">/* <![CDATA[ */
@@ -19,23 +19,12 @@
     	var map = new google.maps.Map(document.getElementById("wpsg_mod_statistics_map"), mapOptions);
     	var bounds = new google.maps.LatLngBounds();
-    	var markers = [];
-    	
-    	<?php $i = 1; foreach ($this->view['wpsg_mod_statistics']['marker'] as $m) { 
-            
-            if (floatval($m['lat']) === 0.0 || floatval($m['long']) === 0.0) continue;
-            
-            ?>
+     	
+    	<?php $i = 1; foreach ($this->view['wpsg_mod_statistics']['marker'] as $m) { ?>
     	var marker<?php echo $i; ?> = new google.maps.Marker({
-			position: new google.maps.LatLng(<?php echo $m['lat']; ?>, <?php echo $m['long']; ?>),
+			position: new google.maps.LatLng(<?php echo $m['long']; ?>, <?php echo $m['lat']; ?>),
 			map: map
     	} );    	
-    	markers.push(marker<?php echo $i; ?>);
-
     	google.maps.event.addListener(marker<?php echo $i; ?>, 'click', function() {
-			location.href = '<?php
-			
-				echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $m['customer']['id']], [], true);
-				
-			?>';
+			location.href = '<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&action=edit&edit_id='.$m['customer']['id']; ?>';
     	} );    	  
     	bounds.extend(marker<?php echo $i; ?>.getPosition());  	
@@ -44,8 +33,4 @@
     	map.fitBounds(bounds);
     	map.setZoom(15);
-
-        var markerCluster = new MarkerClusterer(map, markers,
-                {imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'});
-        	
     	
   	} // function wpsg_mod_statistics_initialize() 
@@ -57,5 +42,5 @@
 <div style="" id="wpsg_mod_customermap_layer">
 	<div class="postbox" id="wpsg_modcustomermap">
-		<div style="height:500px; width:500px;">
+		<div style="height:500px;">
 			<div style="width:100%; height:100%" id="wpsg_mod_statistics_map"></div>	
 		</div>
Index: ews/mods/mod_statistics/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_statistics/produkt_edit_sidebar.phtml	(revision 8528)
+++ 	(revision )
@@ -1,125 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Einstellungen der Statistik innerhalb der Produktverwaltung
-	 */
-
-?>
-<div id="wpsg_voucherproduct" class="panel panel-default">	
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Statistik', 'wpsg'); ?> 
-		</h3>
-	</div>
-	<div class="panel-body">
-		
-		<?php
-		if (isset($_SESSION['filter']['statistik']['st_von']))
-		{
-			$st_von = wpsg_fromDate($_SESSION['filter']['statistik']['st_von'], false);
-			$st_bis = wpsg_fromDate($_SESSION['filter']['statistik']['st_bis'], false);
-		}
-		else
-		{
-			$int = $this->get_option('wpsg_mod_statistics_productinterval');
-		
-			$st_von = Date('d.m.Y', strtotime('-'.$int.' days'));
-			$st_bis = Date('d.m.Y');
-		}
-		?>
-		
-		<label for="st_von">Von</label>
-		<input class="text" type="text" id="st_von" name="st_von" value="<?php $st_von ?>" />
-		<label for="st_bis">bis</label>
-		<input class="text" type="text" id="st_bis" name="st_bis" value="<?php $st_bis ?>" />
-		<input type="button" value="<?php echo __('Aktualisieren', 'wpsg'); ?>" class="button-primary" id="st_refresh" name="st_refresh" />
-		<input type="button" value="<?php echo __('CSV-Export', 'wpsg'); ?>" class="button-primary" id="st_export" name="st_export" />
-	
-	<br /><br />
-	
-		<div id="wpsg_statistic_div">
-			<?php 
-			if ($this->view['odata']['sum'] == 0) {
-				echo __('Keine Daten', 'wpsg');
-			} else {
-			?>
-		        
-		        <?php echo __('Verkaufte Produkte:', 'wpsg');  echo $this->view['odata']['sum'] ?><br /><br />
-		        <table id="wpsg_statistic_table" style="width:100%;">
-		        <thead>
-		        <tr>
-		        <td><?php echo __('Bestell-ID', 'wpsg');?> </td>
-		        <td><?php echo __('Name', 'wpsg');?> </td>
-		        <td><?php echo __('Vorname', 'wpsg');?> </td>
-		        <td><?php echo __('StÃŒck', 'wpsg');?> </td>
-		        <td><?php echo __('e-Mail', 'wpsg');?> </td>
-		        <td><?php echo __('Telefon', 'wpsg');?> </td>
-		        </tr>
-		        </thead>
-		        <tbody id="wpsg_statistic_tbody">
-		
-		        <?php 
-		        unset($this->view['odata']['sum']);
-		        foreach ($this->view['odata'] as $pa) { ?>          
-		        <tr>
-					<td> <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo __($pa['id'], 'wpsg');?>" target="_blank"><?php echo __($pa['onr'], 'wpsg');?></a></td>
-					<td> <a href="<?php
-					
-						echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $pa['kid']]);
-							
-					?>" target="_blank"><?php echo __($pa['name'], 'wpsg'); ?></a></td>
-		            <td> <?php echo __($pa['vname'], 'wpsg');?></td>
-		            <td> <?php echo __($pa['menge'], 'wpsg');?></td>
-		            <td> <?php echo __($pa['email'], 'wpsg');?></td>
-		            <td> <?php echo __($pa['tel'], 'wpsg');?></td>
-		        </tr>
-		        <?php } ?>
-		
-		        </tbody>
-		        </table>
-			<?php } ?>        
-
-		</div>
-	
-	</div>
-</div>
-
-<script type="text/javascript">
-	jQuery(document).ready(function(){
-
-		jQuery('#st_von').datepicker(jQuery.datepicker.regional['de']);
-		jQuery('#st_bis').datepicker(jQuery.datepicker.regional['de']);
-
-		jQuery('#st_von').val('<?php echo $_REQUEST['von']?>');
-		jQuery('#st_bis').val('<?php echo $_REQUEST['bis']?>');
-
-		jQuery('#st_refresh').bind('click', function(){
-
-			jQuery.ajax( { 
-				url: '<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_statistics', 'aktualisieren'); ?>',
-				data: {
-					'edit_id': <?php echo $_REQUEST['edit_id']?>,
-					'von': jQuery('#st_von').val(),
-					'bis': jQuery('#st_bis').val(),
-				},
-				success: function(data) {
-					jQuery('#wpsg_statistic_div').replaceWith(data);
-						
-				}
-			});
-						
-		});
-
-		jQuery('#st_export').bind('click', function(){
-
-			location.href = '<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_statistics', 'export', array(
-			'edit_id' => $_REQUEST['edit_id']
-		)); ?>&von=' + jQuery('#st_von').val() + '&bis=' + jQuery('#st_bis').val();
-		 
-		});
-
-
-		
-	});
-
-</script>
Index: /views/mods/mod_statistics/settings_edit.phtml
===================================================================
--- /views/mods/mod_statistics/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_statistics/settings_edit.phtml	(revision 5261)
@@ -1,16 +1,17 @@
 <br/>
 
-<div id="wpsg_tab">	
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Auswertung Bestellstatus', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Matomo', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab3" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Google', 'wpsg'); ?></a></li>
-        <!-- <li role="presentation"><a href="#tab4" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Social Media', 'wpsg'); ?></a></li> -->
-        <li role="presentation"><a href="#tab5" aria-controls="messages" role="tab" data-toggle="tab"><?php echo __('Sonstiges', 'wpsg'); ?></a></li>
-    </ul>
-
-	<div class="tab-content" >
+<div class="wpsg_admin_box" id="wpsg_tab">	
+	<div class="head">
+		<div class="title">
+			<div class="tab" id="tab1"><?php echo __('Auswertung Bestellstatus', 'wpsg'); ?></div>
+			<div class="tab" id="tab2"><?php echo __('Piwik', 'wpsg'); ?></div>		
+			<div class="tab" id="tab3"><?php echo __('Google', 'wpsg'); ?></div>		
+			<div class="tab" id="tab4"><?php echo __('Sonstiges', 'wpsg'); ?></div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+	<div class="content" id="wpsg_statistics_list">
 		
-		<div role="tabpanel" class="tab-pane active" id="tab1" >
+		<div id="tabcontent1" class="tabcontent">
 		
 		<br/>
@@ -29,201 +30,91 @@
 			}
 		?>
+			<div class="wpsg_clearer"></div>
+		</div>
 		
-		<?php /* Kartendarstelung START */ ?>
-				
-		<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_googlekey', __('Google API-Key', 'wpsg'), $this->get_option('wpsg_mod_statistics_googlekey'), array('help' => 'wpsg_mod_statistics_googlekey')); ?>
+		<div id="tabcontent2" class="tabcontent">
+			
+			<br/>
+			
+			<?php echo __('ErmÃ¶glicht die Integration des Trackintools "Piwik".', 'wpsg'); ?>
+			
+			<br/><br/>
 		
-		<a class="button-primary" id="button-google" target="popup" href="https://console.developers.google.com/flows/enableapi?apiid=maps_backend&keyType=CLIENT_SIDE&reusekey=true" onclick="window.open('', 'popup', 'width=500;height=200,resizable=yes,menubar=yes')">
-			<?php echo __('SchlÃŒssel ÃŒber Ihr Googlekonto anfordern', 'wpsg'); ?>
-		</a>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_url', __('URL zur Piwik Installation', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_url'), array('hint' => __('Ohne Protokoll, Beispiel: piwik.domain.de', 'wpsg'))); ?>
+			<br />
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_generel', __('Allgemeine Protokollierung', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_generel')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_SiteId', __('Piwik Seiten ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_SiteId'), array('help' => 'wpsg_mod_statistics_piwik_SiteId')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_ecommerce', __('KÃ€ufe (eCommerce) tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_ecommerce')); ?>
+			<br /><br />
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_basket', __('Warenkorb tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_basket')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_basket_target', __('Ziel ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_basket_target')); ?>
+			<br />
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_checkout', __('Checkout tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_checkout_target', __('Ziel ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout_target')); ?>
+			<br />
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_checkout2', __('Checkout2 tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout2')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_checkout2_target', __('Ziel ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout2_target')); ?>
+			<br />
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_overview', __('Overview tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_overview')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_overview_target', __('Ziel ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_overview_target')); ?>
+			<br />
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_done', __('Done tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_done')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_done_target', __('Ziel ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_done_target')); ?>
+			<div class="wpsg_clearer"></div>
+		</div>
 		
-		<?php /* Kartendarstellung ENDE */?>
+		<div id="tabcontent3" class="tabcontent">
+		<?php 	
+
+			echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_active', __('Google Analytics aktivieren', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_active'), array('help' => 'wpsg_mod_statistics_google_active'));
+			 
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_google_tracking_code', __('Tracking-Code', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_tracking_code'), array('help' => 'wpsg_mod_statistics_google_tracking_code'));
+			
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_google_domainname', __('Domainname', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_domainname'), array('help' => 'wpsg_mod_statistics_google_domainname'));
+			 
+			echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_anonymise_ip_address', __('IP Adresse anonymisieren', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_anonymise_ip_address'), array('help' => 'wpsg_mod_statistics_google_anonymise_ip_address'));
+			 
+			//echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_enable_first_touch_tracking', __('Enable First Touch Tracking', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_enable_first_touch_tracking'));
+			 
+			echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_track_page_load_time', __('Ladegeschwindigkeit der Website erfassen', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_track_page_load_time'), array('help' => 'wpsg_mod_statistics_google_track_page_load_time'));
+		?>	
+			<h3><?php echo __('Zieleinrichtung in Google Analytics', 'wpsg'); ?></h3>
+			
+			<?php echo __('Ziel', 'wpsg'); ?>&nbsp;:
+			<ul>
+				<li>
+		<?php 
+		
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_google_done', __('Bestellabschluss', 'wpsg'), trim(str_replace(get_site_url(), '', $this->getURL(wpsg_ShopController::URL_BASKET).'?wpsg_done')).'=', array('text' => true));
+		
+		?>	
+				</li>
+			</ul>
+			<?php echo __('Trichter (optional)', 'wpsg'); ?>:
+			<ul>
+			
+				<li><?php echo wpsg_drawForm_Input('wpsg_mod_statistics_google_basket', __('Warenkorb', 'wpsg'), trim(str_replace(get_site_url(), '', $this->getURL(wpsg_ShopController::URL_BASKET))), array('text' => true)); ?></li>
+				<li><?php echo wpsg_drawForm_Input('wpsg_mod_statistics_google_checkout', __('Adresse', 'wpsg'), trim(str_replace(get_site_url(), '', $this->getURL(wpsg_ShopController::URL_CHECKOUT))).'=', array('text' => true)); ?></li>
+				<li><?php echo wpsg_drawForm_Input('wpsg_mod_statistics_google_checkout2', __('Versand', 'wpsg'), trim(str_replace(get_site_url(), '', $this->getURL(wpsg_ShopController::URL_CHECKOUT2))).'=', array('text' => true)); ?></li>
+				<li><?php echo wpsg_drawForm_Input('wpsg_mod_statistics_google_overview', __('WarenkorbÃŒbersicht', 'wpsg'), trim(str_replace(get_site_url(), '', $this->getURL(wpsg_ShopController::URL_OVERVIEW))).'=', array('text' => true)); ?></li>
+		
+			</ul>
 		
 			<div class="wpsg_clearer"></div>
 		</div>
 		
-		<div role="tabpanel" class="tab-pane" id="tab2">
+		<div id="tabcontent4" class="tabcontent">
+		<?php 
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_line_chart_width', __('Liniendiagramm (Breite in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_line_chart_width'), array('help' => 'wpsg_mod_statistics_line_chart_width'));
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_line_chart_height', __('Liniendiagramm (Hoehe in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_line_chart_height'), array('help' => 'wpsg_mod_statistics_line_chart_height'));
 			
-			<br/>
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_pie_chart_width', __('Kuchendiagramm (Breite in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_pie_chart_width'), array('help' => 'wpsg_mod_statistics_pie_chart_width'));
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_pie_chart_height', __('Kuchendiagramm (HÃ¶he in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_pie_chart_height'), array('help' => 'wpsg_mod_statistics_pie_chart_height'));
 			
-			<?php echo __('ErmÃ¶glicht die Integration des Trackintools "Matomo".', 'wpsg'); ?>
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_bar_chart_width', __('Balkendiagramm (Breite in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_bar_chart_width'), array('help' => 'wpsg_mod_statistics_bar_chart_width'));
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_bar_chart_height', __('Balkendiagramm (HÃ¶he in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_bar_chart_height'), array('help' => 'wpsg_mod_statistics_bar_chart_height'));
 			
-			<br/><br/>
-		
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_trackingcode', __('Trackingcode einbinden', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_trackingcode'), array('help' => 'wpsg_mod_statistics_piwik_trackingcode')); ?>
-			<div id="wpsg_mod_statistik_tracking_layer" style="display:none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_url', __('URL zur Matomo Installation', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_url'), array('help' => 'wpsg_mod_statistics_piwik_url'), array('hint' => __('Ohne Protokoll, Beispiel: matomo.domain.de', 'wpsg'))); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_SiteId', __('Matomo Seiten ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_SiteId'), array('help' => 'wpsg_mod_statistics_piwik_SiteId')); ?>
-			</div>
-			<br />
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_generel', __('Allgemeine Protokollierung', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_generel'), array('help' => 'wpsg_mod_statistics_piwik_generel')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_ecommerce', __('KÃ€ufe (eCommerce) tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_ecommerce'), array('help' => 'wpsg_mod_statistics_piwik_ecommerce')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_productView', __('Produkte tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_productView'), array('help' => 'wpsg_mod_statistics_piwik_productView')); ?>
-			<?php if ($this->hasMod('wpsg_mod_produktartikel')) echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_categoryView', __('Produktkategorien tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_categoryView'), array('help' => 'wpsg_mod_statistics_piwik_categoryView')); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_basketdata', __('Warenkorbdaten tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_basketdata'), array('help' => 'wpsg_mod_statistics_piwik_basketdata')); ?>
-			
-			<br /><br />
-
-			<strong><?php echo __('Matomo Goals tracken:', 'wpsg'); ?></strong>
-			
-			<br />
-
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_basket', __('Warenkorb tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_basket'), array('help' => 'wpsg_mod_statistics_piwik_basketdata')); ?>
-			<div id="wpsg_mod_statistics_piwik_basket_layer" style="display: none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_basket_target', __('Matomo ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_basket_target')); ?>
-			</div>
-			<br />
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_checkout', __('Checkout tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout')); ?>
-			<div id="wpsg_mod_statistics_piwik_checkout_layer" style="display: none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_checkout_target', __('Matomo ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout_target')); ?>
-			</div>
-			<br />
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_checkout2', __('Checkout2 tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout2')); ?>
-			<div id="wpsg_mod_statistics_piwik_checkout2_layer" style="display: none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_checkout2_target', __('Matomo ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_checkout2_target')); ?>
-			</div>
-			<br />
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_overview', __('Overview tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_overview')); ?>
-			<div id="wpsg_mod_statistics_piwik_overview_layer" style="display: none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_overview_target', __('Matomo ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_overview_target')); ?>
-			</div>
-			<br />
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_piwik_done', __('Done tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_done')); ?>
-			<div id="wpsg_mod_statistics_piwik_done_layer" style="display: none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_piwik_done_target', __('Matomo ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_piwik_done_target')); ?>
-			</div>
-
-			<div class="wpsg_clearer"></div>
-		</div>
-
-		<script>
-
-			document.addEventListener("DOMContentLoaded", function() {
-
-				var trackingCheckbox = document.getElementById('wpsg_mod_statistics_piwik_trackingcode');
-				var trackingDiv = document.getElementById('wpsg_mod_statistik_tracking_layer');
-
-				var basketCheckbox = document.getElementById("wpsg_mod_statistics_piwik_basket");
-				var basketDiv = document.getElementById("wpsg_mod_statistics_piwik_basket_layer");
-
-				var checkoutCheckbox = document.getElementById("wpsg_mod_statistics_piwik_checkout");
-				var checkoutDiv = document.getElementById("wpsg_mod_statistics_piwik_checkout_layer");
-
-				var checkout2Checkbox = document.getElementById("wpsg_mod_statistics_piwik_checkout2");
-				var checkout2Div = document.getElementById("wpsg_mod_statistics_piwik_checkout2_layer");
-
-				var overviewCheckbox = document.getElementById("wpsg_mod_statistics_piwik_overview");
-				var overviewDiv = document.getElementById("wpsg_mod_statistics_piwik_overview_layer");
-
-				var doneCheckbox = document.getElementById("wpsg_mod_statistics_piwik_done");
-				var doneDiv = document.getElementById("wpsg_mod_statistics_piwik_done_layer");
-
-
-				function toggleDivVisibility(checkbox, div) 
-				{
-
-					if (checkbox.checked) div.style.display = "block";
-					else div.style.display = "none";
-
-				}
-
-				// Event Listener fÃŒr die Checkboxen
-				trackingCheckbox.addEventListener("change", function() {
-				toggleDivVisibility(trackingCheckbox, trackingDiv);
-				});
-
-				basketCheckbox.addEventListener("change", function() {
-				toggleDivVisibility(basketCheckbox, basketDiv);
-				});
-
-				checkoutCheckbox.addEventListener("change", function() {
-				toggleDivVisibility(checkoutCheckbox, checkoutDiv);
-				});
-
-				checkout2Checkbox.addEventListener("change", function() {
-				toggleDivVisibility(checkout2Checkbox, checkout2Div);
-				});
-
-				overviewCheckbox.addEventListener("change", function() {
-				toggleDivVisibility(overviewCheckbox, overviewDiv);
-				});
-
-				doneCheckbox.addEventListener("change", function() {
-				toggleDivVisibility(doneCheckbox, doneDiv);
-				});
-
-				// ÃberprÃŒfen und Initialisieren des Anfangszustands der Checkboxen
-				toggleDivVisibility(trackingCheckbox, trackingDiv);
-				toggleDivVisibility(basketCheckbox, basketDiv);
-				toggleDivVisibility(checkoutCheckbox, checkoutDiv);
-				toggleDivVisibility(checkout2Checkbox, checkout2Div);
-				toggleDivVisibility(overviewCheckbox, overviewDiv);
-				toggleDivVisibility(doneCheckbox, doneDiv);
-			});
-
-		</script>
-		
-		<div role="tabpanel" class="tab-pane" id="tab3">
-
-			<br/>
-			
-			<?php echo __('ErmÃ¶glicht die Integration von "Google Analytics 4".', 'wpsg'); ?>
-			
-			<br/><br/>
-
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_active', __('Trackingcode einbinden', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_active'), array('help' => 'wpsg_mod_statistics_google_active')); ?>
-			<div id="wpsg_mod_statistik_google_tracking_layer" style="display:none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_google_tracking_code', __('Google Tag ID', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_tracking_code'), array('help' => 'wpsg_mod_statistics_google_tracking_code')); ?>
-				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_tracking_debug_mode', __('Google Debug Mode', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_tracking_debug_mode'), array('help' => 'wpsg_mod_statistics_google_tracking_debug_mode')); ?>
-			</div>
-			<br />
-
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_statistics_google_ecommerce', __('KÃ€ufe (eCommerce) tracken', 'wpsg'), $this->get_option('wpsg_mod_statistics_google_ecommerce'), array('help' => 'wpsg_mod_statistics_google_ecommerce')); ?>
-
-			<div class="wpsg_clearer"></div>
-
-		</div>
-		
-		<script>
-
-			document.addEventListener("DOMContentLoaded", function() {
-
-				var GoogleTrackingCheckbox = document.getElementById('wpsg_mod_statistics_google_active');
-				var GoogleTrackingDiv = document.getElementById('wpsg_mod_statistik_google_tracking_layer');
-
-				function toggleGoogleDivVisibility(checkbox, div) 
-				{
-
-					if (checkbox.checked) div.style.display = "block";
-					else div.style.display = "none";
-
-				}
-
-				// Event Listener fÃŒr die Checkboxen
-				GoogleTrackingCheckbox.addEventListener("change", function() {
-				toggleGoogleDivVisibility(GoogleTrackingCheckbox, GoogleTrackingDiv);
-				});
-
-				// ÃberprÃŒfen und Initialisieren des Anfangszustands der Checkboxen
-				toggleGoogleDivVisibility(GoogleTrackingCheckbox, GoogleTrackingDiv);
-
-			});
-
-		</script>
-
-		<!-- <div role="tabpanel" id="tab4" class="tab-pane">
-			<?php // echo wpsg_drawForm_input('wpsg_mod_statistics_socialmedia_fb_px', __('Facebook Pixel', 'wpsg'), $this->get_option('wpsg_mod_statistics_socialmedia_fb_px'), array('help' => 'wpsg_mod_statistics_socialmedia_fb_px')); ?>
-			<div class="wpsg_clearer"></div>
-		</div> -->
-
-		<div role="tabpanel" class="tab-pane" id="tab5">
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_line_chart_width', __('Liniendiagramm (Breite in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_line_chart_width'), array('help' => 'wpsg_mod_statistics_line_chart_width')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_line_chart_height', __('Liniendiagramm (Hoehe in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_line_chart_height'), array('help' => 'wpsg_mod_statistics_line_chart_height')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_pie_chart_width', __('Kuchendiagramm (Breite in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_pie_chart_width'), array('help' => 'wpsg_mod_statistics_pie_chart_width')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_pie_chart_height', __('Kuchendiagramm (HÃ¶he in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_pie_chart_height'), array('help' => 'wpsg_mod_statistics_pie_chart_height')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_bar_chart_width', __('Balkendiagramm (Breite in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_bar_chart_width'), array('help' => 'wpsg_mod_statistics_bar_chart_width')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_bar_chart_height', __('Balkendiagramm (HÃ¶he in px)', 'wpsg'), $this->get_option('wpsg_mod_statistics_bar_chart_height'), array('help' => 'wpsg_mod_statistics_bar_chart_height')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_topproductcount', __('Anzeige Top-Produkte', 'wpsg'), $this->get_option('wpsg_mod_statistics_topproductcount'), array('help' => 'wpsg_mod_statistics_topproductcount')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_statistics_productinterval', __('Intervall-Zeitraum fÃŒr Produktstatistik', 'wpsg'), $this->get_option('wpsg_mod_statistics_productinterval'), array('help' => 'wpsg_mod_statistics_productinterval')); ?>
+			echo wpsg_drawForm_Input('wpsg_mod_statistics_topproductcount', __('Anzeige Top-Produkte', 'wpsg'), $this->get_option('wpsg_mod_statistics_topproductcount'), array('help' => 'wpsg_mod_statistics_topproductcount'));
+		?>
 			<div class="wpsg_clearer"></div>
 		</div>
Index: /views/mods/mod_statistics/simplefilter.phtml
===================================================================
--- /views/mods/mod_statistics/simplefilter.phtml	(revision 8528)
+++ /views/mods/mod_statistics/simplefilter.phtml	(revision 5261)
@@ -1,6 +1,2 @@
-<?php 
- 
-?>
-
 <script type="text/javascript">
 
@@ -36,48 +32,34 @@
 </script>
 
-<?php /* foreach ($this->view['charts'][$_REQUEST['id']]['type'] as $type => $data) { ?>
+<?php foreach ($this->view['charts'][$_REQUEST['id']]['type'] as $type => $data) { ?>
 <a class="<?php echo (($_REQUEST['type'] == $type)?'current':''); ?>" href="admin.php?page=wpsg-Statistics&amp;id=<?php echo $_REQUEST['id']; ?>&amp;type=<?php echo $type; ?>"><?php echo wpsg_hspc($data['name']); ?></a>
-<?php } */ ?>
+<?php } ?>
 
 <br />
 
 <form name="wpsg_statistics_form" id="wpsg_statistics_form" method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Statistics">
-
-	<div style="display:flex; flex-direction:row; justify-content:flex-start; align-items:center;">
-		
-		<label style="width:5em; height:2em; line-height:2em; padding:2px; display:block;" for="filter-standard"><?php echo __('Auswahl', 'wpsg'); ?></label>
-		
-		<div style="" id="filter-standard-wrapper">	
-			<select name="filter[standard]" id="filter-standard" size="1" onchange="<?php if ($_REQUEST['id'] == 0 || $_REQUEST['id'] == 1) { ?>checkForRelated(this);<?php } ?>">
-			<?php foreach ($this->view['standardFilter'] as $index => $filter) { ?>
-				<option value="<?php echo wpsg_hspc($index)?>" <?php if ($index == $this->view['filter']['standard']) { ?>selected="selected"<?php } ?>><?php echo wpsg_hspc(wpsg_getStr($filter['name'])); ?></option>
-			<?php } ?>
-			</select>
-		</div>
-		
-		<div style="" id="filter-related-wrapper">
-		
-		</div>
-		
-		<input style="margin-left:25px;" type="submit" class="button-secondary" value="<?php echo __('Anzeigen', 'wpsg'); ?>" />
-
+	
+	<label style="width:5em; height:2em; line-height:2em; padding:2px; display:block; float:left;" for="filter-standard"><?php echo __('Auswahl', 'wpsg'); ?></label>
+	
+	<div style="float:left;" id="filter-standard-wrapper">	
+		<select name="filter[standard]" id="filter-standard" size="1" onchange="<?php if ($_REQUEST['id'] == 0 || $_REQUEST['id'] == 1) { ?>checkForRelated(this);<?php } ?>">
+		<?php foreach ($this->view['standardFilter'] as $index => $filter) { ?>
+			<option value="<?php echo wpsg_hspc($index)?>" <?php if ($index == $this->view['filter']['standard']) { ?>selected="selected"<?php } ?>><?php echo wpsg_hspc($filter['name']); ?></option>
+		<?php } ?>
+		</select>
 	</div>
 	
-	<div class="customfilter" style="display:none; width:100%;">
-				
+	<div style="float:left;" id="filter-related-wrapper">
+	
+	</div>
+	
+	<input style="float:left; margin-left:25px;" type="submit" class="button-secondary" value="<?php echo __('Anzeigen', 'wpsg'); ?>" />
+	
+	<div class="wpsg_clear"></div><br/>
+	
+	<div class="customfilter" style="display:none;">
 		<?php echo wpsg_drawForm_Date('filter[day][0]',  __('von', 'wpsg'), $this->view['filter']['day'][0]['d'].'.'.$this->view['filter']['day'][0]['m'].'.'.$this->view['filter']['day'][0]['Y'], array('time' => false)); ?>
 		<?php echo wpsg_drawForm_Date('filter[day][1]',  __('bis', 'wpsg'), $this->view['filter']['day'][1]['d'].'.'.$this->view['filter']['day'][1]['m'].'.'.$this->view['filter']['day'][1]['Y'], array('time' => false)); ?>
-			
-		<?php /* if (isset($this->view['filter']['day'][0])) { ?>		
-		
-		<?php } */ ?>
-		
 	</div>
-	
-	<style>
-		
-		.timestamp-wrap { display:flex; flex-direction:row; justify-content:flex-start; align-items:center; }
-		
-	</style>
 	
 	<input type="hidden" id="wpsg_statistics_order" name="filter[order]" value="<?php echo wpsg_hspc($this->view['filter']['order']); ?>" />
@@ -97,20 +79,17 @@
 		jQuery('#filter-standard').bind('change', function(){
 
-			if (parseInt(jQuery(this).val()) === 11) {
-				
-				jQuery('.customfilter').css('display', 'block');
-				 
+			if (parseInt(jQuery(this).val()) == 11)
+			{
+				jQuery('.customfilter').css('display', 'block');	
 				jQuery('.customfilter .customfilter-input').each(function(index, value) { 
 					jQuery(this).removeAttr('disabled');
-				});
-				
-			} else {
-				
+				});		
+			}
+			else
+			{
 				jQuery('.customfilter').css('display', 'none');	
-				
 				jQuery('.customfilter .customfilter-input').each(function(index, value) { 
 					jQuery(this).attr('disabled', 'disabled');
-				});
-				
+				});	
 			}		
 			
Index: ews/mods/mod_statistics/statisticProduct.phtml
===================================================================
--- /views/mods/mod_statistics/statisticProduct.phtml	(revision 8528)
+++ 	(revision )
@@ -1,54 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Anzeige der Produktstatistik innerhalb der Produktverwaltung
-	 */
-
-?>
-
-	<div id="wpsg_statistic_div">
-	<?php 
-	if ($this->view['odata']['sum'] == 0) {
-		echo __('Keine Daten', 'wpsg');
-	} else {
-	?>
-        
-        <?php echo __('Verkaufte Produkte:', 'wpsg');  echo $this->view['odata']['sum'] ?><br /><br />
-        <table id="wpsg_statistic_table" style="width:100%;">
-        <thead>
-        <tr>
-        <td><?php echo __('Bestell-ID', 'wpsg');?> </td>
-        <td><?php echo __('Name', 'wpsg');?> </td>
-        <td><?php echo __('Vorname', 'wpsg');?> </td>
-        <td><?php echo __('StÃŒck', 'wpsg');?> </td>
-        <td><?php echo __('e-Mail', 'wpsg');?> </td>
-        <td><?php echo __('Telefon', 'wpsg');?> </td>
-        </tr>
-        </thead>
-        <tbody id="wpsg_statistic_tbody">
-
-        <?php 
-        unset($this->view['odata']['sum']);
-        foreach ($this->view['odata'] as $pa) { ?>          
-        <tr>
-			<td> <a href="<?php 
-					
-				echo wpsg_admin_url('Order', 'view', ['edit_id' => $pa['id']]);
-				
-			?>" target="_blank"><?php echo __($pa['onr'], 'wpsg');?></a></td>
-			<td> <a href="<?php
-					
-				echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $pa['kid']]);
-					
-			?>" target="_blank"><?php echo __($pa['name'], 'wpsg');?></a></td>
-            <td> <?php echo __($pa['vname'], 'wpsg');?></td>
-            <td> <?php echo __($pa['menge'], 'wpsg');?></td>
-            <td> <?php echo __($pa['email'], 'wpsg');?></td>
-            <td> <?php echo __($pa['tel'], 'wpsg');?></td>
-        </tr>
-        <?php } ?>
-
-        </tbody>
-        </table>
-	<?php } ?>        
-	</div>
Index: /views/mods/mod_statistics/statistics.phtml
===================================================================
--- /views/mods/mod_statistics/statistics.phtml	(revision 8528)
+++ /views/mods/mod_statistics/statistics.phtml	(revision 5261)
@@ -47,4 +47,6 @@
 		                    div.children('div.jqplot-image-container-content').empty();
 		                    div.children('div.jqplot-image-container-content').append(imgelem);
+
+		                    
 		                    
 		                    jQuery('div.jqplot-image-container' + btnId).dialog( { 
@@ -70,74 +72,57 @@
 
 	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Statistik', 'wpsg'); ?>				
+	</h2>
 	
-	<div class="wpsg_products" id="wpsg-bs">
+	<br/>
 	
-		<nav class="navbar navbar-default">
-			<div class="container-fluid">
-				<div class="navbar-header">
-					<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-				</div>
-				<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
-					<ul class="nav navbar-nav">
-						<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt"><?php echo __("Statistik", "wpsg"); ?></a></li>
-<!-- 
-						<li role="presentation" class="wpsg_showhide_filter <?php echo ((wpsg_getInt($this->view['hasFilter']) === true)?'active':''); ?>"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-				 		<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'add'))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=add"><span class="glyphicon glyphicon-plus"></span><?php echo __("HinzufÃŒgen", "wpsg"); ?></a></li>
--->				 		
-					</ul>
-				</div>
-			</div>
-		</nav>
-		 
-		<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-		<div class="wpsg_clear"></div>
-	
-		<div style="display:flex; flex-direction:row; justify-content:flex-start; align-items:flex-start;">
-			
-			<div class="wpsg_admin_submenu">
-				
-				<div class="list-group" id="wpsg_statistics_tabs">
-					<span class="list-group-head list-group-item"><?php echo __('Auswahl', 'wpsg'); ?></span>
-				
-				<?php foreach ($this->view['charts'] as $index => $chart) { ?>
+	<div class="wpsg_admin_submenu" style="margin-top:8px;">
 		
-					<a class="list-group-item <?php echo ((strtolower($index) == $_REQUEST['id'])?'active':''); ?>" href="admin.php?page=wpsg-Statistics&amp;id=<?php echo wpsg_hspc($index); ?>"><?php echo wpsg_hspc($chart['name']); ?></a>
-				
-				<?php } ?>
-				</div>
-		 
-			</div> 
-		
-			<div style="padding-left:15px;" class="stat_content">
-				
-				<?php 
-					
-					if (wpsg_isSizedString($this->view['chart']['data']['template']))
-					{
-						$templateFile = $this->view['chart']['data']['template'].'.phtml';		
-					}
-					else
-					{
-						$templateFile = str_replace('get', '', strtolower($this->view['standardFilter'][$this->view['filter']['standard']]['func']).'.phtml');
-					}
-						
-					$templatePath = WPSG_PATH_VIEW.'/mods/mod_statistics/'.strtolower($this->view['charts'][$_REQUEST['id']]['func']).'/'.$templateFile;
-					
-					if (is_file($templatePath)) 
-					{ 
-						$this->render($templatePath); 
-					} 
-					else 
-					{ 
-						
-						wpsg_debug($templatePath);
-						echo '<strong>'.__('UngÃŒltige Anfrage', 'wpsg').'</strong>';
-						 
-					} 
-				?>
-				
-			</div>
-			
+		<div class="head">
+			<div class="title"><?php echo __('Auswahl', 'wpsg'); ?></div>			
+			<div style="clear:both;"></div>
 		</div>
 		
+		<ul>
+		<?php foreach ($this->view['charts'] as $index => $chart) { ?>
+
+			<li class="<?php echo ((strtolower($index) == $_REQUEST['id'])?'current':''); ?>"><a href="admin.php?page=wpsg-Statistics&amp;id=<?php echo wpsg_hspc($index); ?>"><?php echo wpsg_hspc($chart['name']); ?></a></li>
+		
+		<?php } ?>
+		</ul>
+		<div style="clear:both; margin-bottom:10px; margin-left:0px; margin-right:8px;"></div>
+			
 	</div>
+	
+	<div style="padding-right:10px; margin-left:210px; float:none;" class="subsubsub">
+		
+		<?php 
+			
+			if (wpsg_isSizedString($this->view['chart']['data']['template']))
+			{
+				$templateFile = $this->view['chart']['data']['template'].'.phtml';		
+			}
+			else
+			{
+				$templateFile = str_replace('get', '', strtolower($this->view['standardFilter'][$this->view['filter']['standard']]['func']).'.phtml');
+			}
+				
+			$templatePath = WPSG_PATH_VIEW.'/mods/mod_statistics/'.strtolower($this->view['charts'][$_REQUEST['id']]['func']).'/'.$templateFile;
+			
+			if (is_file($templatePath)) 
+			{ 
+				$this->render($templatePath); 
+			} 
+			else 
+			{ 
+				
+				wpsg_debug($templatePath);
+				echo '<strong>'.__('UngÃŒltige Anfrage', 'wpsg').'</strong>';
+				 
+			} 
+		?>
+		
+	</div>
+	
+	<div style="clear:both; margin-bottom:10px; margin-left:0px; margin-right:8px;"></div>
Index: /views/mods/mod_statistics/totals.phtml
===================================================================
--- /views/mods/mod_statistics/totals.phtml	(revision 8528)
+++ /views/mods/mod_statistics/totals.phtml	(revision 5261)
@@ -3,18 +3,4 @@
 <div id="<?php echo $this->view['modul_name']; ?>_totals">
 
-	<style type="text/css" scoped>
-		
-		/* Statistikmodul */
-		.wpsg_mod_statistics_totals_row { width:100%; }
-		.wpsg_mod_statistics_totals_block { float:left; width:auto; text-align:center; font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif; }
-		.wpsg_mod_statistics_totals_block .number { font-size:18px; color:#21759B; display:block; padding-bottom:10px; padding-top:5px; }
-		.wpsg_mod_statistics_totals_block .label { font-size:16px; color:#8F8F8F; display:block; padding-bottom:5px; }
-		.wpsg_mod_statistics_totals_block .label a { color:#8F8F8F; border-bottom:1px solid #ECECEC; padding-left:10px; padding-right:15px; padding-bottom:5px; }
-		.subsubsub #table-data .th-right span { float:right; }
-		.subsubsub #table-data .td-right { text-align:right; }
-		.wpsg_clear { clear:both; }
-		
-	</style>
-	
 	<?php foreach((array)$this->view['rows'] as $rows) { ?>
 	<div class="<?php echo $this->view['modul_name']; ?>_totals_row">
Index: ews/mods/mod_stock/product_addedit_content.phtml
===================================================================
--- /views/mods/mod_stock/product_addedit_content.phtml	(revision 8528)
+++ 	(revision )
@@ -1,78 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr die Integration des Lagerbestandes in die Produktverwaltung
-     */
-
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-	
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Lagerbestand', 'wpsg')); ?>
-
-    <?php
-		// $this->view['oProduct']['loadedData']['id/product_key']
-		$key = $this->view['oProduct']->id;
-
-		if ($this->callMod('wpsg_mod_productvariants', 'isVariantsProduct', array($key)) == true) 
-		{
-			//echo wpsg_drawForm_Input('wpsg_mod_stock_stock', __('Lagerbestand', 'wpsg'), wpsg_getStr($this->view['data']['stock']), array('readonly' => true));
-		} else {
-			//echo wpsg_drawForm_Input('wpsg_mod_stock_stock', __('Lagerbestand', 'wpsg'), wpsg_getStr($this->view['data']['stock']), array());
-		}
-		echo wpsg_drawForm_Input('wpsg_mod_stock_stock', __('Lagerbestand', 'wpsg'), wpsg_getStr($this->view['data']['stock']), array());
-		
-    ?>
-    <?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_stock_count', __('Lagerbestand zÃ€hlen', 'wpsg'), wpsg_getStr($this->view['data']['stock_count'], '0')); ?>
-
-    <br />
-
-	<?php if ($this->hasMod('wpsg_mod_productvariants')) { ?>
-	
-		<?php echo wpsg_drawForm_Select('meta[wpsg_vp_product_stock_nocalc]', __('Produktbestand nach Kauf', 'wpsg'), [
-			'0' => wpsg_translate(
-				__('Voreinstellung (#1#)', 'wpsg'),
-				(($this->get_option('wpsg_vp_product_stock_nocalc') === '1')?'nicht berechnen':'berechnen')
-			),
-			'2' => __('berechnen'),
-			'1' => __('nicht berechnen')
-		], $oProduct->getMeta('wpsg_vp_product_stock_nocalc'), [
-			'hint' => __('Ist hier "berechnen" eingestellt, wird beim Ãndern des Bestandes einer Variante der Bestand im Produkt aus den Varianten ermittelt. (Lagerbestand im Produkt = Bestand(Variante 1) + Bestand(Variante 2) + ... )', 'wpsg')
-		]); ?>
-	
-		<?php echo wpsg_drawForm_Select('meta[wpsg_vp_product_stock_varinotchange]', __('Produktbestand in Varianten nicht verringern', 'wpsg'), [
-			'0' => wpsg_translate(
-				__('Voreinstellung (#1#)', 'wpsg'),
-				(($this->get_option('wpsg_vp_product_stock_varinotchange') === '1')?'nicht verringern':'verringern')
-			),
-			'2' => __('verringern'),
-			'1' => __('nicht verringern')
-		], $oProduct->getMeta('wpsg_vp_product_stock_varinotchange'), [
-			'hint' => __('Ist hier "nicht verringern" aktiviert, so wird der Bestand in der Variante beim Kauf nicht reduziert.', 'wpsg')
-		]); ?>
-	
-		<?php echo wpsg_drawForm_Select('meta[wpsg_vp_product_stock_display]', __('Produktbestand oder Variantenbestand anzeigen', 'wpsg'), [
-			'0' => wpsg_translate(
-				__('Voreinstellung (#1#)', 'wpsg'),
-				(($this->get_option('wpsg_vp_product_stock_display') === '1')?'Produktbestand':'Variantenbestand')
-			),
-			'2' => __('Variantenbestand'),
-			'1' => __('Produktbestand')
-		], $oProduct->getMeta('wpsg_vp_product_stock_display'), [
-			'hint' => __('Bestimmt ob der Variantenbestand (Produktbestand + Variantenbestand) oder nur der Produktbestand im Frontend angezeigt werden soll.', 'wpsg')
-		]); ?>
-	
-	<?php } ?>
-
-    <?php /* Mailbenachrichtigung beim Erreichen des Minimalbestandes des Produktes */ ?>
-    <?php if ($this->get_option('wpsg_mod_stock_minstockproduct') == '1') { ?>
-    <?php echo wpsg_drawForm_Input('wpsg_mod_minstockproduct', __('Mindestlagerbestand', 'wpsg'), wpsg_getStr($this->view['data']['minstockproduct_count'])); ?>
-    <?php echo wpsg_drawForm_Input('wpsg_mod_stock_minstockproduct_mail', __('Benachrichtigung an', 'wpsg'), wpsg_getStr($this->view['data']['minstockproduct_mail'])); ?>
-    <?php }?>
-
-    <br />
-
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_stock"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Lagerbestandmoduls', 'wpsg'); ?></a>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: /views/mods/mod_stock/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_stock/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_stock/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,33 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Lagerbestands Einstellungen innerhalb des Produkts
+	 */
+
+?>
+<div id="wpsg_stock" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Lagerbestand', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_mod_stock_stock"><?php echo __('Lagerbestand', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<input id="wpsg_mod_stock_stock" type="text" name="wpsg_mod_stock_stock" value="<?php echo $this->view['data']['stock']; ?>" />
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				<label for="wpsg_mod_stock_stock_count"><?php echo __('Lagerbestand zÃ€hlen', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<input id="wpsg_mod_stock_stock_count" type="checkbox" class="checkbox" name="wpsg_mod_stock_stock_count" value="1" <?php echo (($this->view['data']['stock_count'] == '1')?'checked="checked"':''); ?> />
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+</div>
Index: /views/mods/mod_stock/settings_edit.phtml
===================================================================
--- /views/mods/mod_stock/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_stock/settings_edit.phtml	(revision 5261)
@@ -6,27 +6,54 @@
 
 ?>
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_allow', __('Bestellungen bei negativen Bestand verhindern', 'wpsg'), $this->get_option('wpsg_mod_stock_allow'), array('help' => 'wpsg_mod_stock_allow')); ?>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_stock_template"><?php echo __('Template fÃŒr ausverkaufte Produkte', 'wpsg'); ?>:</label>									
+	</div>
+	<div class="wpsg_form_right">
+		<?php if (!is_array($this->view['arTemplates']) || sizeof($this->view['arTemplates']) <= 0) { ?>
+		<p class="wpsg_error"><?php echo __('Keine Templatedatein gefunden!', 'wpsg'); ?></p>
+		<?php } else { ?>
+		<input type="hidden" name="wpsg_mod_stock_template" value="<?php echo $this->get_option('wpsg_mod_stock_template'); ?>" />
+		<select name="wpsg_mod_stock_template" id="wpsg_mod_stock_template">
+			<option value="-1"><?php echo __('Wie Produkttemplate', 'wpsg'); ?></option>
+			<?php foreach ($this->view['arTemplates'] as $t) { ?>
+			<option <?php echo (($t == $this->get_option('wpsg_mod_stock_template'))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($t); ?>"><?php echo wpsg_hspc($t); ?></option>
+			<?php } ?>
+		</select>
+		<?php } ?>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_notemplateswitch', __('Template nicht wechseln', 'wpsg'), $this->get_option('wpsg_mod_stock_notemplateswitch'), array('help' => 'wpsg_mod_stock_notemplateswitch')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_allow', __('Bestellungen bei negtiven Bestand verhindern', 'wpsg'), $this->get_option('wpsg_mod_stock_allow'), array('help' => 'wpsg_mod_stock_allow')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_showBackendStock', __('Bestand in ProduktÃŒbersicht (Backend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_stock_showBackendStock'), array('help' => 'wpsg_mod_stock_showBackendStock')); ?>
-
-<br />
-
-<?php if ($this->hasMod('wpsg_mod_productindex')) { ?>
+<?php if ($this->hasMod('wpsg_mod_productindex')) {Â ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_showProductindex', __('Bestand in ProduktÃŒbersicht (Frontend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_stock_showProductindex'), array('help' => 'wpsg_mod_stock_showProductindex')); ?>
 <?php } ?>
-
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_showProduct', __('Bestand in Produkt (Frontend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_stock_showProduct'), array('help' => 'wpsg_mod_stock_showProduct')); ?>
 
-<br/>
 
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_minstockproduct',  __('Minimalbestand im Produkt hinterlegen', 'wpsg'), $this->get_option('wpsg_mod_stock_minstockproduct'), array('help' => 'wpsg_mod_stock_minstockproduct')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_hideSoldout',  __('Ausverkaufte Produkte nicht anzeigen', 'wpsg'), $this->get_option('wpsg_mod_stock_hideSoldout'), array('help' => 'wpsg_mod_stock_hideSoldout')); ?>
+<script type="text/javascript">/* <![CDATA[ */
 
-<?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
-	
-	<br />
-	
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_stock_updateProductSave', __('Bestand in Produktgruppen automatisch ermitteln.', 'wpsg'), $this->get_option('wpsg_mod_stock_updateProductSave'), ['help' => 'wpsg_mod_stock_updateProductSave']); ?>
+	jQuery(document).ready(function() {
 
-<?php } ?>
- 
+		jQuery('#wpsg_mod_stock_notemplateswitch').bind('change', function() {
+
+			if (jQuery(this).attr("checked"))
+			{
+
+				jQuery('#wpsg_mod_stock_template').attr('disabled', true);
+				
+			}
+			else
+			{
+
+				jQuery('#wpsg_mod_stock_template').attr('disabled', false);
+
+			}
+			
+		} ).change();
+		
+	} );
+
+/* ]]> */</script>
Index: ews/mods/mod_stock/stockmail.phtml
===================================================================
--- /views/mods/mod_stock/stockmail.phtml	(revision 8528)
+++ 	(revision )
@@ -1,39 +1,0 @@
-<?php
-	
-	/**
-	 * Dieses Template wird fÃŒr die HTML Mail beim Erreichen des Mindestlagerbestandes eines Produktes verwendet
-	 */
-	
-	$this->htmlMail = false;
-
-?><?php echo __('Hallo ', 'wpsg').$GLOBALS['stockemail_prodvariant']['admin_name'].','; ?>
-
-<?php
-	if(isset($GLOBALS['stockemail_prodvariant']) && wpsg_isSizedArray($GLOBALS['stockemail_prodvariant']))
-	{
-		
-		echo wpsg_translate(__('Eine Produktvariation hat das Erreichen des minimalen Lagerbestands am #1# um #2# Uhr gemeldet.', 'wpsg'), date('d.m.Y'), date('H:i'));
-		echo "\r\n";
-		echo "\r\n";
-		echo __("Produkt").': '.$GLOBALS['stockemail_prodvariant']['produkt']['id'].' '.$GLOBALS['stockemail_prodvariant']['produkt']['name'];
-		echo "\r\n";
-		echo __("Produktvariation").': '.$GLOBALS['stockemail_prodvariant']['variant']['id'].' '.$GLOBALS['stockemail_prodvariant']['variant']['name'];
-		echo "\r\n";
-		
-	}
-	else
-	{
-		
-		echo wpsg_translate(__('Ein Produkt hat das Erreichen des minimalen Lagerbestand am #1# um #2# Uhr gemeldet.', 'wpsg'), date('d.m.Y'), date('H:i'));
-		echo ('');
-		foreach ((array)$this->basket->arProdukte as $p)
-			$id = $p['id'];
-		echo ('');
-		echo __('Produkt').': '.$p['id'].'  '.$p['name'];
-		
-	}
-?>
-
-<?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg'); ?>
-
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: ews/mods/mod_stock/stockmail_html.phtml
===================================================================
--- /views/mods/mod_stock/stockmail_html.phtml	(revision 8528)
+++ 	(revision )
@@ -1,41 +1,0 @@
-<?php
-
-	/**
-	 * Dieses Template wird fÃŒr die HTML Mail beim Erreichen des Mindestlagerbestandes eines Produktes verwendet
-	 */
-
-	$this->htmlMail = true;
-
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
-?>
-
-<p><?php echo __('Hallo ', 'wpsg').$GLOBALS['stockemail_prodvariant']['admin_name'].','; ?></p>
-
-<?php
-	if(isset($GLOBALS['stockemail_prodvariant']) && wpsg_isSizedArray($GLOBALS['stockemail_prodvariant']))
-	{
-
-		echo wpsg_translate(__('Eine Produktvariation hat das Erreichen des minimalen Lagerbestands am #1# um #2# Uhr gemeldet.', 'wpsg'), date('d.m.Y'), date('H:i'));
-		echo '<br />';
-		echo __("Produkt").': '.$GLOBALS['stockemail_prodvariant']['produkt']['id'].' '.$GLOBALS['stockemail_prodvariant']['produkt']['name'].' ';
-		echo '<br />';
-		echo __("Produktvariation").': '.$GLOBALS['stockemail_prodvariant']['variant']['id'].' '.$GLOBALS['stockemail_prodvariant']['variant']['name'];
-
-	}
-	else
-	{
-
-		echo wpsg_translate(__('Ein Produkt hat das Erreichen des minimalen Lagerbestand am #1# um #2# Uhr gemeldet.', 'wpsg'), date('d.m.Y'), date('H:i'));
-		echo ('<br />');
-		foreach ((array)$this->basket->arProdukte as $p)
-			$id = $p['id'];
-			echo ('<br />');
-			echo __('Produkt').': '.$p['id'].'  '.$p['name'];
-
-	}
-?>
-
-<p><?php echo __('Mit freundlichen GrÃŒÃen', 'wpsg'); ?></p>
-
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: /views/mods/mod_su/order_done.phtml
===================================================================
--- /views/mods/mod_su/order_done.phtml	(revision 8528)
+++ /views/mods/mod_su/order_done.phtml	(revision 5261)
@@ -9,5 +9,5 @@
 <p>
 	<a title="<?php echo __('Mit SofortÃŒberweisung bezahlen', 'wpsg'); ?>" href="<?php echo $this->view['suLink']; ?>">
-		<img src="<?php echo $this->getRessourceURL('mods/mod_su/gfx/logo_100x25.png'); ?>" alt="<?php echo __('Mit SofortÃŒberweisung bezahlen', 'wpsg'); ?>" style="margin-right:7px;">
+		<img src="<?php echo WPSG_URL_CONTENT.'plugins/wpshopgermany/views/gfx/'; ?>banner_300x100.png" align="left" alt="<?php echo __('Mit SofortÃŒberweisung bezahlen', 'wpsg'); ?>" style="margin-right:7px;">
 	</a>
 </p>
Index: /views/mods/mod_su/settings_edit.phtml
===================================================================
--- /views/mods/mod_su/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_su/settings_edit.phtml	(revision 5261)
@@ -38,25 +38,31 @@
 </script>
 
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_bezeichnung', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_su_bezeichnung'), array('help' => 'wpsg_mod_su_bezeichnung')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_bezeichnung', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_su_bezeichnung')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_su_aktiv', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_su_aktiv')); ?>
-<?php echo wpsg_drawForm_Textarea('wpsg_mod_su_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_su_hint'), array('help' => 'wpsg_mod_su_hint')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_subject1', __('Betreff fÃŒr Ãberweisung (Zeile 1)', 'wpsg'), $this->get_option('wpsg_mod_su_subject1'), array('help' => 'wpsg_mod_su_subject1')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_subject2', __('Betreff fÃŒr Ãberweisung (Zeile 2)', 'wpsg'), $this->get_option('wpsg_mod_su_subject2'), array('help' => 'wpsg_mod_su_subject2')); ?>
+<?php echo wpsg_drawForm_Textarea('wpsg_mod_su_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_su_hint')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_subject1', __('Betreff fÃŒr Ãberweisung (Zeile 1)', 'wpsg'), $this->get_option('wpsg_mod_su_subject1')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_subject2', __('Betreff fÃŒr Ãberweisung (Zeile 2)', 'wpsg'), $this->get_option('wpsg_mod_su_subject2')); ?>
 <br />
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_su_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_mod_su_gebuehr')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_su_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_su_mwst'), array('help' => 'wpsg_mod_su_mwst')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_su_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_su_mwstland'), array('help' => 'wpsg_mod_su_mwstland')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_su_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_su_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_su_mwst')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_su_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_su_mwstland')); ?>
 
 <br />
-<?php echo wpsg_drawForm_Select('wpsg_mod_su_currency', __('Verwendete WÃ€hrung', 'wpsg'), array('EUR' => __('Euro', 'wpsg'), 'CHF' => __('Schweizer Franken', 'wpsg'), 'GBP' => __('Britische Pfund', 'wpsg')), $this->get_option('wpsg_mod_su_currency'), array('help' => 'wpsg_mod_su_currency')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_userid', __('Kunden-Nr fÃŒr SofortÃŒberweisung.de', 'wpsg'), $this->get_option('wpsg_mod_su_userid'), array('help' => 'wpsg_mod_su_userid')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_projectid', __('Projekt ID fÃŒr SofortÃŒberweisung.de', 'wpsg'), $this->get_option('wpsg_mod_su_projectid'), array('help' => 'wpsg_mod_su_projectid')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_projectpassword', __('Projekt Passwort', 'wpsg'), $this->get_option('wpsg_mod_su_projectpassword'), array('help' => 'wpsg_mod_su_projectpassword')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_noticepassword', __('Benachrichtigungs Passwort', 'wpsg'), $this->get_option('wpsg_mod_su_noticepassword'), array('help' => 'wpsg_mod_su_noticepassword')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_su_language', __('Sprache bei SofortÃŒberweisung.de', 'wpsg'), array('DE' => __('deutsch', 'wpsg'), 'EN' => __('englisch', 'wpsg'), 'FR' => __('franzÃ¶sisch', 'wpsg'), 'NL' => __('niederlÃ€ndisch', 'wpsg')), $this->get_option('wpsg_mod_su_language'), array('help' => 'wpsg_mod_su_language')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_su_hash', __('Verwendetes HASH Verfahren', 'wpsg'), array('md5' => 'MD5', 'sha1' => 'SHA1', 'sha256' => 'SHA256', 'sha512' => 'SHA512'), $this->get_option('wpsg_mod_su_hash'), array('help' => 'wpsg_mod_su_hash')); ?>
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_su_confirmurl', __('URL fÃŒr HTTP Benachrichtigung', 'wpsg'), $this->view['wpsg_mod_su_confirmurl'], array('help' => 'wpsg_mod_su_confirmurl', 'readonly' => true)); ?>
-
+<?php echo wpsg_drawForm_Select('wpsg_mod_su_currency', __('Verwendete WÃ€hrung', 'wpsg'), array('EUR' => __('Euro', 'wpsg'), 'CHF' => __('Schweizer Franken', 'wpsg'), 'GBP' => __('Britische Pfund', 'wpsg')), $this->get_option('wpsg_mod_su_currency')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_userid', __('Kunden-Nr fÃŒr SofortÃŒberweisung.de', 'wpsg'), $this->get_option('wpsg_mod_su_userid')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_projectid', __('Projekt ID fÃŒr SofortÃŒberweisung.de', 'wpsg'), $this->get_option('wpsg_mod_su_projectid')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_projectpassword', __('Projekt Passwort', 'wpsg'), $this->get_option('wpsg_mod_su_projectpassword')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_su_noticepassword', __('Benachrichtigungs Passwort', 'wpsg'), $this->get_option('wpsg_mod_su_noticepassword')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_su_language', __('Sprache bei SofortÃŒberweisung.de', 'wpsg'), array('DE' => __('deutsch', 'wpsg'), 'EN' => __('englisch', 'wpsg'), 'FR' => __('franzÃ¶sisch', 'wpsg'), 'NL' => __('niederlÃ€ndisch', 'wpsg')), $this->get_option('wpsg_mod_su_language')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_su_hash', __('Verwendetes HASH Verfahren', 'wpsg'), array('md5' => 'MD5', 'sha1' => 'SHA1', 'sha256' => 'SHA256', 'sha512' => 'SHA512'), $this->get_option('wpsg_mod_su_hash')); ?>
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_su_confirmurl"><?php echo __('URL fÃŒr HTTP Benachrichtigung', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<input id="wpsg_mod_su_confirmurl" type="text" class="text" name="" value="<?php echo wpsg_hspc($this->view['wpsg_mod_su_confirmurl']); ?>" />		
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_su_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_su_autostart')); ?>
 
Index: /views/mods/mod_test/settings_edit.phtml
===================================================================
--- /views/mods/mod_test/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_test/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,77 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Modulkonfiguration des Testmoduls
+	 */
+
+?>
+
+<br />
+
+<?php foreach ((array)$this->view['test'] as $test_index => $test) { ?>
+<div class="wpsg_admin_box" id="wpsg_mod_test_<?php echo $test_index; ?>" style="width:1000px;">
+	<div id="test_1" class="head" style="border-bottom: 0px none;">
+		<div class="title">
+			<div class="fulltab">
+				<?php echo ($test_index + 1); ?>. Test - <?php echo $test['label']; ?>
+				<?php if ($this->callMod('wpsg_mod_test', 'checkTest', array($test)) === true) { ?>
+				<img src="<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/views/css/../gfx/tick.png" alt="" style="float:right;" />
+				<?php } ?>
+			</div>
+		</div>
+		<div class="content wpsg_mod_test_table wpsg_admin_box_content" style="display: block;">
+			
+			<?php echo $test['config']; ?>
+			
+			<table>
+				<thead>
+					<tr>
+						<th>Name</th>
+						<th>Erwarteter Wert</th>
+						<th>Getesteter Wert</th>
+						<th></th>
+					</tr>
+				</thead>
+				<tbody>
+					<?php foreach ($test['tests'] as $key => $t) { ?>
+					<tr>
+						<td>
+							<?php if ($t[0] === false) { ?>
+							<?php echo $this->view['arKeyLabel'][$key]; ?>
+							<?php } else { ?>
+							<?php echo $t[0]; ?>
+							<?php } ?>
+						</td>
+						<td><?php echo $t[1]; ?></td>
+						<td><?php echo $this->callMod('wpsg_mod_test', 'getValue', array($key, $test['array'])); ?></td>
+						<td>
+							<?php if ($this->callMod('wpsg_mod_test', 'checkValue', array($key, $t[1], $test['array'])) === true) { ?>
+							<img src="<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/views/css/../gfx/tick.png" alt="" />
+							<?php } ?>						
+						</td>
+					</tr>
+					<?php } ?>
+				</tbody>
+			</table>
+			
+			<?php if (wpsg_isSizedArray($test['array'])) { ?>
+			<br /><a href="" onclick="jQuery(this).next().toggle(); return false;">Array anzeigen/verbergen</a>
+			<div style="display:none; border:1px solid #CCCCCC; background-color:#FFFFFF; margin-top:15px;">
+				<pre><?php print_r($test['array']); ?></pre>
+			</div>
+			<?php } ?>
+			
+		</div>
+	</div>
+</div><br />
+<?php } ?>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+
+		jQuery('.wpsg_admin_box').wpsg_adminbox();
+		
+	} );
+
+/* ]]> */</script>
Index: /views/mods/mod_test/showConfiguration.phtml
===================================================================
--- /views/mods/mod_test/showConfiguration.phtml	(revision 5261)
+++ /views/mods/mod_test/showConfiguration.phtml	(revision 5261)
@@ -0,0 +1,11 @@
+<?php
+
+	/**
+	 * Zeigt wichtige Einstellungen an, die fÃŒr den Test wichtig sind
+	 */
+
+?>
+<?php echo wpsg_drawForm_Input('', 'Preise im Backend', (($this->get_option('wpsg_preisangaben') == WPSG_NETTO)?'Netto':'Brutto'), array('text' => true)); ?>
+<?php echo wpsg_drawForm_Input('', 'Preise im Frontend', (($this->getFrontendTaxview() == WPSG_NETTO)?'Netto':'Brutto'), array('text' => true)); ?>
+<?php echo wpsg_drawForm_Input('', 'Kleinunternehmerregelung', (($this->get_option('wpsg_kleinunternehmer') == '1')?'An':'Aus'), array('text' => true)); ?>
+<br />
Index: ews/mods/mod_topseller/produkt_addedit_allgemein.phtml
===================================================================
--- /views/mods/mod_topseller/produkt_addedit_allgemein.phtml	(revision 8528)
+++ 	(revision )
@@ -1,35 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Konfiguration der Topseller innerhalb der Produktverwaltung
-	 */
-
-?>
-<div id="wpsg_topseller_layer" class="panel panel-default">
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<span><?php echo __('Topseller', 'wpsg'); ?></span>
-		</h3>
-	</div>
-	<div class="panel-body">
-	<?php if ($this->get_option('wpsg_mod_topseller_auto') == '1') { ?>
-		<?php echo wpsg_drawForm_Select('wpsg_mod_topseller[status]', __('TopSeller Status', 'wpsg'), array(
-		'0' => __('Einbeziehen', 'wpsg'),
-		'1' => __('AusschlieÃen', 'wpsg')
-		), $this->view['wpsg_mod_topseller']['status']); ?>
-	
-	<?php } else { ?>
-	
-		<?php echo wpsg_drawForm_Select('wpsg_mod_topseller[status]', __('TopSeller Status', 'wpsg'), array(
-		'0' => __('Nicht anzeigen', 'wpsg'),
-		'1' => __('Anzeigen', 'wpsg')
-		), $this->view['wpsg_mod_topseller']['status']); ?>		
-	<?php } ?>
-	
-	<br /><br />
-	
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_topseller"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Topsellermoduls', 'wpsg'); ?></a>	
-	
-	</div>
-</div>
-
Index: /views/mods/mod_topseller/produkt_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_topseller/produkt_edit_allgemein.phtml	(revision 5261)
+++ /views/mods/mod_topseller/produkt_edit_allgemein.phtml	(revision 5261)
@@ -0,0 +1,18 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Konfiguration der Topseller innerhalb der Produktverwaltung
+	 */
+
+?>
+<?php if ($this->get_option('wpsg_mod_topseller_auto') == '1') { ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_topseller[status]', __('TopSeller Status', 'wpsg'), array(
+	'0' => __('Einbeziehen', 'wpsg'),
+	'1' => __('AusschlieÃen', 'wpsg')
+), $this->view['wpsg_mod_topseller']['status']); ?>
+<?php } else { ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_topseller[status]', __('TopSeller Status', 'wpsg'), array(
+	'0' => __('Nicht anzeigen', 'wpsg'),
+	'1' => __('Anzeigen', 'wpsg')
+), $this->view['wpsg_mod_topseller']['status']); ?>		
+<?php } ?>
Index: /views/mods/mod_trustedshops/checkout_customer_inner.phtml
===================================================================
--- /views/mods/mod_trustedshops/checkout_customer_inner.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/checkout_customer_inner.phtml	(revision 5261)
@@ -8,5 +8,5 @@
 <div class="wpsg_checkoutblock">
 	<label for="wpsg_mod_trustedshops_set">
-		<input class="wpsg_checkout" type="checkbox" id="wpsg_mod_trustedshops_set" name="wpsg[checkout][wpsg_mod_trustedshops_set]" value="1" <?php echo ((wpsg_isSizedInt($this->view['basket']['checkout']['wpsg_mod_trustedshops_set']) || ($this->get_option('wpsg_mod_trustedshops_customerset_preset') == '1' && !isset($this->view['basket']['checkout']['wpsg_mod_trustedshops_set'])))?'checked="checked"':''); ?> /><?php echo __('Ich bin damit einverstanden, eine separate und unverbindliche Bewertungsaufforderung (<a href="https://www.trustedshops.com/" target="_blank">Trusted Shops</a>) per Mail zu erhalten.', 'wpsg'); ?>						
+		<input class="wpsg_checkout" type="checkbox" id="wpsg_mod_trustedshops_set" name="wpsg[checkout][wpsg_mod_trustedshops_set]" value="1" <?php echo (($this->view['basket']['checkout']['wpsg_mod_trustedshops_set'] == '1' || ($this->get_option('wpsg_mod_trustedshops_customerset_preset') == '1' && !isset($this->view['basket']['checkout']['wpsg_mod_trustedshops_set'])))?'checked="checked"':''); ?> /><?php echo __('Ich bin damit einverstanden, eine separate und unverbindliche Bewertungsaufforderung (<a href="https://www.trustedshops.com/" target="_blank">Trusted Shops</a>) per Mail zu erhalten.', 'wpsg'); ?>						
 	</label>
 </div>
Index: /views/mods/mod_trustedshops/mail.phtml
===================================================================
--- /views/mods/mod_trustedshops/mail.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/mail.phtml	(revision 5261)
@@ -5,8 +5,5 @@
 	 */
 
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-    
-    ?><?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['customer']['title']], $this->view['customer']['vname'], $this->view['customer']['name']); ?> 
+?><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['customer']['vname'], $this->view['customer']['name']); ?> 
  
 <?php echo __('wir hoffen Sie waren mit dem Bestellablauf zufrieden, um unseren Service und unsere Dienstleistung zu verbessern kÃ¶nnen Sie uns ÃŒber Trusted Shops bewerten. Dies kÃ¶nnen Sie kostenlos unter folgendem Link durchfÃŒhren: ', 'wpsg')?> 
Index: /views/mods/mod_trustedshops/order_done.phtml
===================================================================
--- /views/mods/mod_trustedshops/order_done.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/order_done.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Einbindung des Trusted Shops Bewertungs Links nach Bestellabschluss
+	 * Template fÃŒr die Einbindung des Trusted Shops Bewertungs Links nach BestellabschluÃ
 	 */
 
Index: /views/mods/mod_trustedshops/order_view_sidebar.phtml
===================================================================
--- /views/mods/mod_trustedshops/order_view_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/order_view_sidebar.phtml	(revision 5261)
@@ -5,13 +5,24 @@
 	 */
 
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Trusted Shps', 'wpsg')); ?>
-
-	<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_set', __('Einwilligung', 'wpsg'), (($this->view['data']['wpsg_mod_trustedshops_set'] == '1')?__('Ja', 'wpsg'):__('Nein', 'wpsg')), array('text' => true, 'help' => 'wpsg_mod_trustedshops_set')); ?>
-
-	<br />
-
-	<a onclick="if (!confirm('<?php echo __('Der Kunde erhÃ€lt eine Mail mit einem Link zur Bewertung der Bestellung. Sind Sie sich sicher?', 'wpsg'); ?>')) return false;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1&action=ajax&mod=wpsg_mod_trustedshops&edit_id=<?php echo $this->view['data']['id']; ?>&do=mail"><?php echo __('E-Mail mit Bewertungslink senden', 'wpsg'); ?></a>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+?> 
+<div class="postbox" id="wpsg_trustedshops">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Trusted Shops', 'wpsg'); ?></span>
+	</h3> 
+	<div class="inside">
+		
+		<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_set', __('Einwilligung', 'wpsg'), (($this->view['data']['wpsg_mod_trustedshops_set'] == '1')?__('Ja', 'wpsg'):__('Nein', 'wpsg')), array('text' => true, 'help' => 'wpsg_mod_trustedshops_set')); ?>
+		
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left">
+				
+			</div>
+			<div class="wpsg_form_right">
+				<a onclick="if (!confirm('<?php echo __('Der Kunde erhÃ€lt eine Mail mit einem Link zur Bewertung der Bestellung. Sind Sie sich sicher?', 'wpsg'); ?>')) return false;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1&action=ajax&mod=wpsg_mod_trustedshops&edit_id=<?php echo $this->view['data']['id']; ?>&do=mail"><?php echo __('E-Mail mit Bewertungslink senden', 'wpsg'); ?></a>										
+			</div>
+		</div>
+		<div class="wpsg_clear"></div>
+		
+	</div>
+</div>
Index: /views/mods/mod_trustedshops/settings_edit.phtml
===================================================================
--- /views/mods/mod_trustedshops/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/settings_edit.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Einstellungen des Trusted Shops Moduls
+	 * Tempalte fÃŒr die Einstellungen des Trusted Shops Moduls
 	 */
 	
@@ -17,47 +17,47 @@
 
 <div class="wpsg_mod_protectedshops">
-
 	<div class="wpsg_admin_box" id="wpsg_tab">	
-
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Trusted Shops Widget', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Bestellabschluss', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab3" aria-controls="messages" role="tab" data-toggle="tab"><?php echo __('Bewertungslinks', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab4" aria-controls="messages" role="tab" data-toggle="tab"><?php echo __('Review Collector', 'wpsg'); ?></a></li>
-    </ul>
-
-	<div class="tab-content">
-
-		<div id="tab1" role="tabpanel" class="tab-pane active" >
+		<div class="head">
+			<div class="title">
+				<div class="tab" id="tab1"><?php echo __('Trusted Shops Widget', 'wpsg'); ?></div>
+				<div class="tab" id="tab2"><?php echo __('Bestellabschluss', 'wpsg'); ?></div>
+				<div class="tab" id="tab3"><?php echo __('Bewertungslinks', 'wpsg'); ?></div>
+				<div class="tab" id="tab4"><?php echo __('Review Collector', 'wpsg'); ?></div>
+				<div class="wpsg_clear"></div>		
+			</div>
+		</div>
+		<div class="content">
+			
+			<div id="tabcontent1" class="tabcontent">
 	
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_trustedshops_siegelcache', __('Bewertungsbild zwischenspeichern (empfohlen)', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_siegelcache'), array('help' => 'wpsg_mod_trustedshops_siegelcache')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_siegeltitle', __('Titel des Bewertungsbildes', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_siegeltitle'), array('help' => 'wpsg_mod_trustedshops_siegeltitle')); ?>
-					
-			<?php if (wpsg_isSizedString($this->view['siegelURL'])) { ?>
-			<br />
-			<div class="wpsg_hinweis"><?php echo wpsg_translate(__('Das Trusted Shops Widget muss in einen <a href="#1#">Widgetbereich</a> eingefÃŒgt werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/widgets.php'); ?></div><br />
-			<?php echo __('Vorschau:', 'wpsg'); ?><br />
-			<img class="bewertung" alt="<?php echo wpsg_hspc($this->get_option('wpsg_mod_trustedshops_siegeltitle')); ?>" border="0" src="<?php echo $this->view['siegelURL']; ?>"/>
-			<?php } ?>
-					
-		</div>
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_trustedshops_siegelcache', __('Bewertungsbild zwischenspeichern (empfohlen)', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_siegelcache'), array('help' => 'wpsg_mod_trustedshops_siegelcache')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_siegeltitle', __('Titel des Bewertungsbildes', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_siegeltitle'), array('help' => 'wpsg_mod_trustedshops_siegeltitle')); ?>
+						
+				<?php if (wpsg_isSizedString($this->view['siegelURL'])) { ?>
+	 			<br />
+	 			<div class="wpsg_hinweis"><?php echo wpsg_translate(__('Das Trusted Shops Widget muss in einen <a href="#1#">Widgetbereich</a> eingefÃŒgt werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/widgets.php'); ?></div><br />
+	 			<?php echo __('Vorschau:', 'wpsg'); ?><br />
+				<img class="bewertung" alt="<?php echo wpsg_hspc($this->get_option('wpsg_mod_trustedshops_siegeltitle')); ?>" border="0" src="<?php echo $this->view['siegelURL']; ?>"/>
+				<?php } ?>
+						
+			</div>
 			
-		<div id="tab2" role="tabpanel" class="tab-pane" >
+			<div id="tabcontent2" class="tabcontent">
 						
-			<?php echo wpsg_drawForm_Select('wpsg_mod_trustedshops_orderdone', __('Link zur Bewertung', 'wpsg'), array(
-				'0' => __('Nicht anzeigen', 'wpsg'),
-				'1' => __('Immer anzeigen', 'wpsg'),
-				'2' => __('Nur anzeigen, wenn Kunde bewerten mÃ¶chte', 'wpsg')
-			), $this->get_option('wpsg_mod_trustedshops_orderdone'), array('help' => 'wpsg_mod_trustedshops_orderdone')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_orderdonetitle', __('Titel des Links', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_orderdonetitle'), array('help' => 'wpsg_mod_trustedshops_orderdonetitle')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_orderdonelogo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_orderdonelogo'), array('help' => 'wpsg_mod_trustedshops_orderdonelogo')); ?>
-								
-			<br />
+				<?php echo wpsg_drawForm_Select('wpsg_mod_trustedshops_orderdone', __('Link zur Bewertung', 'wpsg'), array(
+					'0' => __('Nicht anzeigen', 'wpsg'),
+					'1' => __('Immer anzeigen', 'wpsg'),
+					'2' => __('Nur anzeigen, wenn Kunde bewerten mÃ¶chte', 'wpsg')
+				), $this->get_option('wpsg_mod_trustedshops_orderdone'), array('help' => 'wpsg_mod_trustedshops_orderdone')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_orderdonetitle', __('Titel des Links', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_orderdonetitle'), array('help' => 'wpsg_mod_trustedshops_orderdonetitle')); ?>
+				<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_orderdonelogo', __('Alternative Logo URL', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_orderdonelogo'), array('help' => 'wpsg_mod_trustedshops_orderdonelogo')); ?>
+	 								
+				<br />
+				
+				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_trustedshops_warranty', __('Trusted Shops KÃ€uferschutz (Garantie)', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_warranty'), array('help' => 'wpsg_mod_trustedshops_warranty')); ?>
+	 								 
+			</div>
 			
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_trustedshops_warranty', __('Trusted Shops KÃ€uferschutz (Garantie)', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_warranty'), array('help' => 'wpsg_mod_trustedshops_warranty')); ?>
-									
-		</div>
-			
-		<div id="tab3" role="tabpanel" class="tab-pane" >
+			<div id="tabcontent3" class="tabcontent">
 			
 				<?php echo wpsg_drawForm_Select('wpsg_mod_trustedshops_customermail', __('Link zur Bewertung in Kundenmail nach Bestellabschluss', 'wpsg'), array(
@@ -71,4 +71,6 @@
 				
 				<?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>
+					
+					<br />
 					<?php echo wpsg_drawForm_Select('wpsg_mod_trustedshops_invoicemail', __('Link zur Bewertung in Rechnungsmail', 'wpsg'), array(
 						'0' => __('Nicht anzeigen', 'wpsg'),
@@ -77,60 +79,73 @@
 					), $this->get_option('wpsg_mod_trustedshops_invoicemail'), array('help' => 'wpsg_mod_trustedshops_invoicemail')); ?>
 					<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_invoicemailtitle', __('Text des Links', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_invoicemailtitle'), array('help' => 'wpsg_mod_trustedshops_invoicemailtitle')); ?>
+					
 				<?php } ?>
 						
-		</div>
-			
-		<div id="tab4" role="tabpanel" class="tab-pane" >
-
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_trustedshops_reminder', __('Erinnerung', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_reminder'), array('help' => 'wpsg_mod_trustedshops_reminder')); ?>
-			<div id="wpsg_mod_trustedshops_reminder_layer" style="display:none;">
-				<?php echo wpsg_drawForm_Input('wpsg_mod_trustedshops_reminderDays', __('Zeitspanne zum versenden der Erinnerunsmail in Tagen', 'wpsg'), $this->get_option('wpsg_mod_trustedshops_reminderDays'), array('help' => 'wpsg_mod_trustedshops_reminderDays')); ?>
-			</div>
-
-			<br />
-
-			<?php echo wpsg_drawForm_Link('wpsg_mod_trustedshops_link', __('AuslÃ¶ser bei Statuswechsel', 'wpsg'), 
-			__('Bearbeiten', 'wpsg'), array('help' => 'wpsg_mod_trustedshops_link', 'class' => 'wpsg_mod_trustedshops_state')); ?>
-
-			<div class="wpsg_mod_trustedshops_reminderstate_layer" style="display:none;">
-
-				<?php foreach ($this->arStatus as $state_id => $state_label) { ?>
-					<?php
-						$arr1 = $this->get_option('wpsg_mod_trustedshops_state');
-						$chk = ((in_array($state_id, (array)$this->get_option('wpsg_mod_trustedshops_state')))?1:0);
-						echo wpsg_drawForm_Checkbox('wpsg_mod_trustedshops_state[]', __($state_label, 'wpsg'),
-						$chk, array('help1' => 'wpsg_shippay_mwstland', 'value' => wpsg_hspc($state_id), 'labelright' => true));
-					?>
-				<?php } ?>
-
-				<br />
-
-			</div>
-							
-			<?php echo wpsg_drawForm_Input('', __('Letzter Export', 'wpsg'), $this->view['lastExport'], array('text' => true)); ?>
-			
-			<br />
-			
-			<div class="wpsg_form_field">
-				<div class="wpsg_form_left">&nbsp;</div>
-				<div class="wpsg_form_right wpsg_form_right_unit">
-					<?php $temp = $this->callMod('wpsg_mod_trustedshops', 'getExportData');
-					if (wpsg_isSizedArray($temp)) { ?>
-					<a target="_blank" onclick="location.href=location.href;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops&do=export&noheader=1" class="button"><?php echo __('CSV-Export-Datei erstellen', 'wpsg'); ?></a>
-					<?php } else { ?>
-					<p><?php echo __('Derzeit keine Daten zum Export verfÃŒgbar.', 'wpsg'); ?></p>
-					<?php } ?>
-				</div>
-				<div class="wpsg_clear"></div>
 			</div>
 			
-			<br />
+			<div id="tabcontent4" class="tabcontent">
 			
-			<a href="https://www.trustedshops.com/tsb2b/sa/ratings/batchRatingRequest.seam"><?php echo __('Trusted Shops Review Collector', 'wpsg'); ?></a>				
+				<div class="wpsg_form_field">
+					<div class="wpsg_form_left">
+						<label for="wpsg_mod_trustedshops_reminder"><?php echo __('Erinnerung', 'wpsg'); ?>:</label>
+					</div>
+					<div class="wpsg_form_right">
+					
+						<input type="hidden" name="wpsg_mod_trustedshops_reminder" value="0">
+						<input id="wpsg_mod_trustedshops_reminder" type="checkbox" class="checkbox" <?php echo ((wpsg_isSizedInt($this->get_option('wpsg_mod_trustedshops_reminder')))?'checked="checked"':''); ?> tabindex="14" name="wpsg_mod_trustedshops_reminder" value="1">
+			
+						<div id="wpsg_mod_trustedshops_reminder_layer" class="wpsg_form_trustedshops_reminderDays">
+							
+							<p><?php echo __('Nach', 'wpsg'); ?></p>
+							<input id="wpsg_mod_trustedshops_reminderDays" type="text" class="text" tabindex="15" name="wpsg_mod_trustedshops_reminderDays" value="<?php echo $this->get_option('wpsg_mod_trustedshops_reminderDays'); ?>">
+							<p><?php echo __('Tagen', 'wpsg'); ?></p>
+						
+						</div>
+					
+					</div>
+					<div class="wpsg_clear"></div>
+				</div>
+				
+				<div class="wpsg_form_field">
+					<div class="wpsg_form_left">
+						<label for="wpsg_mod_trustedshops_reminder"><?php echo __('BestellzustÃ€nde', 'wpsg'); ?>:</label>
+					</div>
+					<div class="wpsg_form_right">
+					
+						<?php foreach ($this->arStatus as $state_id => $state_label) { ?>
+						<label>
+							<input type="checkbox" class="checkbox" name="wpsg_mod_trustedshops_state[]" <?php echo ((in_array($state_id, (array)$this->get_option('wpsg_mod_trustedshops_state')))?'checked="checked"':''); ?> value="<?php echo $state_id; ?>" />
+							<?php echo $state_label; ?><br />
+						</label>
+						<?php } ?>
+											
+					</div>
+					<div class="wpsg_clear"></div>
+				</div>
+				 				
+				<?php echo wpsg_drawForm_Input('', __('Letzter Export', 'wpsg'), $this->view['lastExport'], array('text' => true)); ?>
+				
+				<br />
+				
+				<div class="wpsg_form_field">
+					<div class="wpsg_form_left">&nbsp;</div>
+					<div class="wpsg_form_right wpsg_form_right_unit">
+						<?php if (wpsg_isSizedArray($this->callMod('wpsg_mod_trustedshops', 'getExportData'))) { ?>
+						<a target="_blank" onclick="location.href=location.href;" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops&do=export&noheader=1" class="button"><?php echo __('CSV-Export-Datei erstellen', 'wpsg'); ?></a>
+						<?php } else { ?>
+						<p><?php echo __('Derzeit keine Daten zum Export verfÃŒgbar.', 'wpsg'); ?></p>
+						<?php } ?>
+					</div>
+					<div class="wpsg_clear"></div>
+				</div>
+				
+				<br />
+				
+				<a href="https://www.trustedshops.com/tsb2b/sa/ratings/batchRatingRequest.seam"><?php echo __('Trusted Shops Review Collector', 'wpsg'); ?></a>				
+				
+			</div>
 			
 		</div>
-
 	</div>
-
 </div>
 
@@ -138,4 +153,21 @@
 
 	jQuery(document).ready(function() {
+
+		jQuery('#wpsg_mod_trustedshops_reminder').bind('change', function() {
+
+			if (jQuery('#wpsg_mod_trustedshops_reminder').is(':checked'))
+			{
+
+				jQuery('#wpsg_mod_trustedshops_reminder_layer').show(250);
+				
+			}
+			else
+			{
+
+				jQuery('#wpsg_mod_trustedshops_reminder_layer').hide(250);
+				
+			}
+			
+		} ).change();
 		
 		jQuery('#wpsg_tab').wpsg_tab( { 
@@ -162,40 +194,6 @@
 			
 		} ).change();
-
-		jQuery('.wpsg_mod_trustedshops_state').bind('click', function() {
-
-			jQuery('.wpsg_mod_trustedshops_reminderstate_layer').toggle();
-
-			if (jQuery('.wpsg_mod_trustedshops_reminderstate_layer').is(':visible')) jQuery(this).html('<?php echo __('Ausblenden', 'wpsg'); ?>');
-			else jQuery(this).html('<?php echo __('Bearbeiten', 'wpsg'); ?>');
-
-			return false;
-
-		} );
 		
 	} );
 
-	document.addEventListener("DOMContentLoaded", function() {
-
-		var reminderCheckbox = document.getElementById('wpsg_mod_trustedshops_reminder');
-		var reminderDiv = document.getElementById('wpsg_mod_trustedshops_reminder_layer');
-		
-		function toggleDivVisibility(checkbox, div) 
-		{
-
-			if (checkbox.checked) div.style.display = "block";
-			else div.style.display = "none";
-
-		}
-
-		// Event Listener fÃŒr die Checkboxen
-		reminderCheckbox.addEventListener("change", function() {
-			toggleDivVisibility(reminderCheckbox, reminderDiv);
-		});
-
-		// ÃberprÃŒfen und Initialisieren des Anfangszustands der Checkboxen
-		toggleDivVisibility(reminderCheckbox, reminderDiv);
-
-	});
-
 /* ]]> */</script>
Index: /views/mods/mod_trustedshops/widget.phtml
===================================================================
--- /views/mods/mod_trustedshops/widget.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/widget.phtml	(revision 5261)
@@ -7,5 +7,5 @@
 ?>
 
-<?php if ($this->view['widget_settings']['wpsg_mod_trustedshops_siegel'] == '1') { ?>
+<?php if ($this->view['settings']['wpsg_mod_trustedshops_siegel'] == '1') { ?>
 <div class="wpsg_mod_trustedshops_siegel">
 	
@@ -13,5 +13,5 @@
 <?php } ?>
 
-<?php if ($this->view['widget_settings']['wpsg_mod_trustedshops_vote'] == '1') { ?>
+<?php if ($this->view['settings']['wpsg_mod_trustedshops_vote'] == '1') { ?>
 <div class="wpsg_mod_trustedshops_vote">
 	<a target="_blank" href="https://www.trustedshops.de/bewertung/info_<?php echo $this->get_option('wpsg_mod_trustedshops_shopid'); ?>.html" title="<?php echo wpsg_hspc($this->get_option('wpsg_mod_trustedshops_siegeltitle')); ?>">
@@ -21,5 +21,5 @@
 <?php } ?>
 
-<?php if ($this->view['widget_settings']['wpsg_mod_trustedshops_badge'] == '1') { ?>
+<?php if ($this->view['settings']['wpsg_mod_trustedshops_badge'] == '1') { ?>
 <script type="text/javascript">/* <![CDATA[ */
 	
Index: /views/mods/mod_trustedshops/widget_form.phtml
===================================================================
--- /views/mods/mod_trustedshops/widget_form.phtml	(revision 8528)
+++ /views/mods/mod_trustedshops/widget_form.phtml	(revision 5261)
@@ -9,12 +9,22 @@
 <label>
 	<input type="checkbox" value="1" <?php echo (($this->view['wpsg_mod_trustedshops_vote'] == '1')?'checked="checked"':''); ?> name="<?php echo $this->view['widget']->get_field_name('wpsg_mod_trustedshops_vote'); ?>" id="<?php echo $this->view['widget']->get_field_id('wpsg_mod_trustedshops_vote'); ?>" />&nbsp;<?php echo __('Bewertungen anzeigen', 'wpsg'); ?>
-	<a class="glyphicon glyphicon-question-sign" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_vote" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_vote"></a><br />	
+	<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_vote" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_vote"></a><br />	
 </label>
 <label>
 	<input type="checkbox" value="1" <?php echo (($this->view['wpsg_mod_trustedshops_badge'] == '1')?'checked="checked"':''); ?> name="<?php echo $this->view['widget']->get_field_name('wpsg_mod_trustedshops_badge'); ?>" id="<?php echo $this->view['widget']->get_field_id('wpsg_mod_trustedshops_badge'); ?>" />&nbsp;<?php echo __('Badge anzeigen', 'wpsg'); ?>
-	<a class="glyphicon glyphicon-question-sign" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_badge" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_vote"></a><br />
+	<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_badge" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_mod_trustedshops_vote"></a><br />
 </label>
    
 <br />
-    
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+
+		jQuery('.wpsg_form_help').tipTip();
+
+	} );
+
+/* ]]> */</script>
+   
 <?php echo wpsg_translate(__('Die weitere Konfiguration des Widgets erfolgt in den <a href="#1#">Moduleinstellungen.</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_trustedshops'); ?>
Index: /views/mods/mod_userpayment/list.phtml
===================================================================
--- /views/mods/mod_userpayment/list.phtml	(revision 8528)
+++ /views/mods/mod_userpayment/list.phtml	(revision 5261)
@@ -9,121 +9,157 @@
 <?php echo __('Bisher keine Zahlvarianten angelegt.', 'wpsg'); ?>
 <?php } else { ?>
+	<table class="zv_table">
+		<colgroup>
+	    	<col class="wpsg_label" />
+	    	<col class="wpsg_value" /> 
+	    	<col class="wpsg_delcol" />
+	  	</colgroup> 
+		<?php $i = 0; foreach ($this->view['wpsg_mod_userpayment']['data'] as $zv) { $i ++; ?>
+		<tr>
+			<td class="wpsg_label"><?php echo __('ID', 'wpsg'); ?>:</td>
+			<td class="wpsg_value"><?php echo $zv['id']; ?></td>
+			<td class="wpsg_delcol">
+				<a class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Zahlvariante lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeZV(<?php echo $zv['id']; ?>);"></a>
+				
+				<script type="text/javascript">
 
-<?php $i = 0; foreach ($this->view['wpsg_mod_userpayment']['data'] as $zv) { $i ++; ?>
+					jQuery(document).ready(function() {
+						
+						jQuery('#zv_<?php echo $zv['id']; ?>_name').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
+							submitdata: { 
+					    		field: 'name',
+					    		zv_id: '<?php echo $zv['id']; ?>'
+							}, 					
+							submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+							placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+							indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+					    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+						} );
 
-    <hr />
-	<div id="wpsg_mod_userpayment_row_<?php echo $zv['id']; ?>">
+						jQuery('#zv_<?php echo $zv['id']; ?>_hint').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
+							submitdata: { 
+					    		field: 'hint',
+					    		zv_id: '<?php echo $zv['id']; ?>'
+							}, 					
+							submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+							placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+							indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+					    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+						} );
 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <?php echo $zv['id']; ?><a data-id="<?php echo $zv['id']; ?>" onclick="return wpsg_removeZV(<?php echo $zv['id']; ?>); return false;" class="wpsg_oc_removeLink" href="#"><span class="wpsg_glyphicon_right glyphicon glyphicon-trash form-control-feedback"></span></a>
-        <?php echo wpsg_drawForm_TextEnd(__('ID', 'wpsg')); ?>
+						jQuery('#zv_<?php echo $zv['id']; ?>_rabgeb').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
+							submitdata: {
+								field: 'rabgeb',
+								zv_id: '<?php echo $zv['id']; ?>'
+							},
+							submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+							placeholder: '<?php echo __('Definieren ...', 'wpsg'); ?>',
+							indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+							tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+						} );
 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="zv_name_<?php echo $zv['id']; ?>"><?php echo wpsg_hspc($zv['name']); ?></span>
-        <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" data-wpsg-tip="wpsg_shippay_name"
-         rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Bezeichnung', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#zv_name_<?php echo $zv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'name',
-                    zv_id: '<?php echo $zv['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
+						jQuery('#zv_<?php echo $zv['id']; ?>_mwst').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', { 
+							submitdata: {
+								field: 'mwst_key',
+								zv_id: '<?php echo $zv['id']; ?>'
+							},
+							submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+							data: '<?php echo json_encode(wpsg_tax_groups()); ?>',
+							type: 'select',
+							placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+							indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+					    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+						});	
 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-		<input type="checkbox" value="1" <?php echo (($zv['aktiv'] == '1')?'checked="checked"':''); ?> id="zv_<?php echo $zv['id']; ?>_aktiv" />
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" data-wpsg-tip="wpsg_shippay_activ" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Aktiv', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-			jQuery('#zv_<?php echo $zv['id']; ?>_aktiv').bind('change', function() {
+						jQuery('#zv_<?php echo $zv['id']; ?>_aktiv').bind('change', function() {
 
-				var value = 0;
-				if (jQuery(this).prop("checked") === true) value = 1;
+							var value = 0;
+							if (jQuery(this).attr("checked") == "checked") value = 1;
 
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1',
-					data: {
-						field: 'aktiv',
-						zv_id: '<?php echo $zv['id']; ?>',
-						value: value
-					}	
-				} );
-			} );
-        /* ]]> */</script>
+							jQuery.ajax( {
+								url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1',
+								data: {
+									field: 'aktiv',
+									zv_id: '<?php echo $zv['id']; ?>',
+									value: value
+								}	
+							} );
+								 
+						} );
 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="zv_hint_<?php echo $zv['id']; ?>"><?php echo wpsg_hspc($zv['hint']); ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" data-wpsg-tip="wpsg_shippay_hint" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Hinweistext', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#zv_hint_<?php echo $zv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'hint',
-                    zv_id: '<?php echo $zv['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
+					} );
+				
+				</script>
+				
+			</td>
+		</tr>
+		<tr>
+			<td class="wpsg_label"><?php echo __('Bezeichnung', 'wpsg'); ?>:</td>
+			<td class="wpsg_value" id="zv_<?php echo $zv['id']; ?>_name"><?php echo wpsg_hspc($zv['name']); ?></td>	
+			<td class="wpsg_delcol">
+				<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name"></a>
+			</td>				
+		</tr>
+		<tr>
+			<td class="wpsg_label"><?php echo __('Aktiv', 'wpsg'); ?>:</td>
+			<td class="wpsg_value">
+				<input type="checkbox" value="1" <?php echo (($zv['aktiv'] == '1')?'checked="checked"':''); ?> id="zv_<?php echo $zv['id']; ?>_aktiv" />
+			</td>
+			<td class="wpsg_delcol">
+				<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ"></a>
+			</td>
+		</tr>
+		<tr>
+			<td class="wpsg_label"><?php echo __('Hinweistext', 'wpsg'); ?>:</td>
+			<td class="wpsg_value" id="zv_<?php echo $zv['id']; ?>_hint"><?php echo wpsg_hspc($zv['hint']); ?></td>
+			<td class="wpsg_delcol">
+				<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint"></a>
+			</td>
+		</tr>		
+		<tr>
+			<td class="wpsg_label"><?php echo __('GebÃŒhr/Rabatt', 'wpsg'); ?>:</td>
+			<td class="wpsg_value">
+				<div style="float:left; width:70%" id="zv_<?php echo $zv['id']; ?>_rabgeb" class="editable"><?php echo wpsg_hspc(wpsg_ff($zv['rabgeb'], true)); ?></div>
+				<div style="float:right;"><?php echo $this->get_option('wpsg_currency'); ?> / %</div>
+			</td>
+			<td class="wpsg_delcol">				
+				<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_gebuehr" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_gebuehr"></a>
+			</td>
+		</tr>		
+		<tr>
+			<td class="wpsg_label"><?php echo __('Steuersatz', 'wpsg'); ?>:</td>
+			<td id="zv_<?php echo $zv['id']; ?>_mwst" class="wpsg_value wpsg_editable"><?php 
+			
+				$tax_groups = wpsg_tax_groups();
+				echo wpsg_hspc($tax_groups[$zv['mwst_key']]); 
+			
+			?></td>
+			<td class="wpsg_delcol">
+				<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_gebuehr" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_gebuehr"></a>
+			</td>
+		</tr>
+		<tr>
+			<td class="wpsg_label"><?php echo __('Keine MwSt. wenn Land steuerfrei', 'wpsg'); ?>:</td>
+			<td class="wpsg_value">
+				<input onchange="wpsg_saveZVMwSt(this, <?php echo $zv['id']; ?>);" <?php echo (($zv['mwst_laender'] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" />
+			</td>
+			<td class="wpsg_delcol">
+				<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland"></a>
+			</td>
+		</tr>
+		<?php if ($i < sizeof($this->view['wpsg_mod_userpayment']['data'])) { ?>
+		<tr class="wpsg_spacer"><td colspan="3"><hr /></td></tr>
+		<?php } ?>				
+		<?php } ?>
+	</table>
+<?php } ?>
 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="zv_rabgeb_<?php echo $zv['id']; ?>"><?php echo wpsg_ff($zv['rabgeb']); ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" data-wpsg-tip="wpsg_shippay_gebuehr" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_gebuehr" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_gebuehr"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('GebÃŒhr/Rabatt', 'wpsg')); ?>
-        <script>
+<script type="text/javascript">/* <![CDATA[ */
 
-            jQuery('#zv_rabgeb_<?php echo $zv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'rabgeb',
-                    zv_id: '<?php echo $zv['id']; ?>'
-                }
-            });
-
-        </script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="zv_mwst_key_<?php echo $zv['id']; ?>"><?php
-        	$tax_groups = wpsg_tax_groups();
-        	echo wpsg_hspc(@$tax_groups[$zv['mwst_key']]);
-        ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" data-wpsg-tip="wpsg_shippay_mwst" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Steuersatz', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#zv_mwst_key_<?php echo $zv['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1', {
-                type: 'select',
-				data: <?php echo wpsg_prepare_for_inlineEdit(wpsg_tax_groups()); ?>,
-	                submitdata: {
-                    field: 'mwst_key',
-                    zv_id: '<?php echo $zv['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-		<input type="checkbox" value="1" <?php echo (($zv['mwst_laender'] == '1')?'checked="checked"':''); ?> id="zv_mwst_laender_<?php echo $zv['id']; ?>" />
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" data-wpsg-tip="wpsg_shippay_mwstland" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Keine MwSt. wenn Land steuerfrei', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-			jQuery('#zv_mwst_laender_<?php echo $zv['id']; ?>').bind('change', function() {
-
-				var value = 0;
-				if (jQuery(this).prop("checked") === true) value = 1;
-
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment&do=inlinedit&noheader=1',
-					data: {
-						field: 'mwst_laender',
-						zv_id: '<?php echo $zv['id']; ?>',
-						value: value
-					}	
-				} );
-			} );
-        /* ]]> */</script>
-
-	</div>
-
-	<?php if ($i == sizeof($this->view['wpsg_mod_userpayment']['data'])) { ?><hr /><?php } ?>
-	<?php } ?>
-	
-
-<?php } ?> 
+	jQuery(document).ready(function() {
+		 
+		jQuery('.wpsg_form_help').tipTip();
+		
+	} );
+		
+/* ]]> */</script>
Index: /views/mods/mod_userpayment/settings_edit.phtml
===================================================================
--- /views/mods/mod_userpayment/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_userpayment/settings_edit.phtml	(revision 5261)
@@ -70,4 +70,5 @@
 			<div class="fulltab">
 				<?php echo __('Zahlvarianten', 'wpsg'); ?>
+				<a title="<?php echo __('Neue Zahlvariante anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addZV();"></a>
 			</div>
 		</div>
@@ -80,5 +81,2 @@
 
 <p class="wpsg_hinweis"><?php echo __('Um eine Zahlvariante zu bearbeiten klicken Sie einfach auf den Namen oder den Rabattwert.', 'wpsg'); ?></p>
-
-<br />
-<a href="#" onclick="return wpsg_addZV();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>Neue Zahlvariante anlegen</a>
Index: /views/mods/mod_varianten/basket_row.phtml
===================================================================
--- /views/mods/mod_varianten/basket_row.phtml	(revision 5261)
+++ /views/mods/mod_varianten/basket_row.phtml	(revision 5261)
@@ -0,0 +1,23 @@
+ <?php
+
+	/**
+	 * Render ein Variantenprodukt im Warenkorb (basket.phtml)
+	 */
+
+?>
+<?php //wpsg_debug($this->view['variante']) ?> 
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">
+	<td><?php echo __('Variante', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'3':'2'); ?>">
+		<?php if (get_option('wpsg_vp_detailview') == 1) { ?>
+		<?php foreach ($this->view['variante'] as $vari => $value) { ?>
+		<?php if (is_numeric($vari)) { ?>
+		<?php echo $value['name'] ?>: <?php echo $value['value'] ?>; <?php echo __('Art. Nr.', 'wpsg').': '.$value['artnr'] ?>; <?php echo $value['preis'] ?> <?php echo $this->get_option('wpsg_currency') ?>
+		<br />
+		<?php } ?>
+		<?php } ?>							
+		<?php } else { ?>
+		<?php echo $this->view['variante']['key']; ?>
+		<?php } ?>
+	</td>
+</tr>
Index: /views/mods/mod_varianten/drawVarianten.phtml
===================================================================
--- /views/mods/mod_varianten/drawVarianten.phtml	(revision 5261)
+++ /views/mods/mod_varianten/drawVarianten.phtml	(revision 5261)
@@ -0,0 +1,535 @@
+<?php
+
+	/**
+	 * Template fÃŒr das Interface der Varianten im Produktbackend
+	 * Sollte nicht angepasst werden
+	 */
+
+?> 
+<?php if (isset($this->view['message'])) { ?>
+<?php if ($this->view['message'][0] == "1") { ?>
+<span style="color:red;"><?php echo $this->view['message'][1]; ?></span><br /><br />
+<?php } else { ?>
+<span style="color:green;"><?php echo $this->view['message'][1]; ?></span><br /><br />
+<?php } ?>
+<?php } ?>
+   
+<?php if (sizeof($this->view['vp_data']) <= 0) { ?>
+<p><?php echo __("Es wurden noch keine Varianten zu diesem Produkt angelegt.", "wpsg"); ?></p>
+<?php } else { ?>
+ 
+	<div class="var_order_wrap">
+	<?php $i = 0; foreach ($this->view['vp_data'] as $k => $var) { $i ++; ?>
+		<div id="variante_<?php echo $k; ?>" class="var_order">
+		
+			<div style="font-weight:bold; display:inline;">
+				<span class="sortable_handler"><?php echo $k.": "; ?></span>
+				<div class="wpsg_editable" id="varname_<?php echo $k; ?>" style="font-weight:bold;"><?php echo $this->callMod('wpsg_mod_varianten', 'getVariantenName', array($this->view['vp_data'], $k)); ?></div>				
+				<?php if ($var['typ'] == "checkbox") { ?>
+				(<?php echo __("Checkbox", "wpsg"); ?>)
+				<?php } else if ($var['typ'] == "select") { ?>
+				(<?php echo __("Selectbox", "wpsg"); ?>)
+				<?php } else if ($var['typ'] == "radio") { ?>
+				(<?php echo __("Radio Auswahl", "wpsg"); ?>)
+				<?php } else if ($var['typ'] == 'image') { ?>
+				(<?php echo __('Grafikauswahl', 'wpsg'); ?>)
+				<?php } ?>
+			</div>
+			
+			<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+				<a href="#" title="<?php echo __('Variante lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_vp_del(<?php echo $k; ?>);" style="float:right; margin-left:10px;"><img src="<?php echo $this->getRessourceURL('gfx/bin.png'); ?>" alt="<?php echo __("Variante lÃ¶schen", "wpsg"); ?>" /></a>
+				<?php if ($var['aktiv'] == "1") { ?>
+				<a href="#" title="<?php echo __('Variante deaktivieren', 'wpsg'); ?>" onclick="return wpsg_vp_deaktiv(<?php echo $k; ?>, 0);" style="float:right; margin-left:10px;"><img src="<?php echo $this->getRessourceURL('gfx/hide.png'); ?>" alt="<?php echo __('Variante deaktivieren', 'wpsg'); ?>" /></a>
+				<?php } else { ?>
+				<a href="#" title="<?php echo __('Variante aktivieren', 'wpsg'); ?>" onclick="return wpsg_vp_deaktiv(<?php echo $k; ?>, 1);" style="float:right; margin-left:10px;"><img src="<?php echo $this->getRessourceURL('gfx/show.png'); ?>" alt="<?php echo __('Variante aktivieren', 'wpsg'); ?>" /></a>
+				<?php } ?><br />
+			<?php } ?>
+			
+			<script type="text/javascript">
+
+				jQuery("#varname_<?php echo $k; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+					submitdata: {  
+			    		typ: "var_name",
+			    		var_id: <?php echo $k; ?>,
+			    		edit_id: <?php echo $this->view['data']['id']; ?>,
+					    <?php if (wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+					    wpsg_lang: "<?php echo $_REQUEST['wpsg_lang']; ?>",
+					    <?php } ?> 
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+			
+			</script>
+			
+			<?php if ($var['typ'] == "checkbox") { ?>
+			
+			<table style="width:100%;">
+				<tr>
+					<th style="width:34px;">&nbsp;</th>
+					<th class="col_variname"></th>
+				<!--<th class="col_variartnr"><?php echo __("Varianten Art. Nr.", "wpsg"); ?></th> -->
+					<th class="col_preis"><?php echo __("Preis", "wpsg"); ?></th> 
+					<?php if ($this->hasMod('wpsg_mod_weight')) { ?>	
+					<th class="col_weight" style="width:75px; text-align:left;"><?php echo __("Gewicht", "wpsg"); ?></th>
+					<?php } ?>					
+					<?php if ($this->hasMod('wpsg_mod_stock') && $var['typ'] != 'checkbox') { ?>
+					<th class="col_stock"><?php echo __("Bestand", "wpsg"); ?></th>
+					<?php } ?>
+					<th></th>	 						
+				</tr>
+				<tr style="line-height:25px;">
+					<td></td>
+					<td></td>
+				<!-- <td class="wpsg_editable col_variartnr" id="variartnr_<?php echo $k; ?>"><?php echo ($var['artnr'] != "")? $var['artnr']:''; ?></td> -->
+					<td class="wpsg_editable col_preis" id="varpreis_<?php echo $k; ?>"><?php echo (($var['preis'] != "")?wpsg_ff($var['preis'], $this->get_option('wpsg_currency')):wpsg_ff(0, $this->get_option('wpsg_currency'))); ?></td>
+					<?php if ($this->hasMod('wpsg_mod_weight')) { $ModCol ++; ?>
+					<td class="wpsg_editable col_weight" id="varweight_<?php echo $k; ?>"><?php echo (($var['weight'] != "")?$var['weight']:"0"); ?></td>
+					<?php } ?>
+					<?php if ($this->hasMod('wpsg_mod_stock') && $var['typ'] != 'checkbox') { $ModCol ++;  ?>
+					<td class="wpsg_editable col_stock" id="varstock_<?php echo $k; ?>">						
+					<?php echo (($var['stock'] != "")?intval($var['stock']):"0"); ?>
+					</td>
+					<?php } ?> 
+				</tr>
+				<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+				<tr class="wpsg_mod_varianten_productimage_row">
+					<td colspan="2">&nbsp;</td>
+					<td style="padding-bottom:10px;" colspan="<?php echo $ModCol + 3; ?>" id="wpsg_mod_varianten_productimage_<?php echo $k; ?>">
+					
+				   		<?php $j = 0; foreach ((array)$this->callMod('wpsg_mod_varianten', 'getVariImages', array($this->view['data']['id'], $k, -1)) as $file) { $j ++; $url_tn = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $file, 25, 25, 's')); ?>
+				   		<a class="<?php echo ((in_array($file, explode(",", $var['pic'])))?'mark':''); ?> pic" id="<?php echo $file; ?>" onclick="return wpsg_vp_vari_setPic(this, <?php echo $k; ?>, -1, '<?php echo $file; ?>', <?php echo $j; ?>);" href=""><img src="<?php echo $url_tn; ?>" alt="" /></a>
+				   		<?php } ?>					   		
+				   								 
+					</td>
+					<td>
+					
+						<?php if (wpsg_isSizedInt($j)) { ?>
+				   		<script type="text/javascript">/* <![CDATA[ */
+
+				   			jQuery(document).ready(function() {   
+
+						   		jQuery('#wpsg_mod_varianten_productimage_<?php echo $k; ?>').sortable( {
+									items: 'a',
+									helper : 'clone',  
+									update: function(event, ui) {
+
+										wpsg_vp_ajaxloading_show();
+										
+										var wpsg_reorder = jQuery(this).sortable('toArray');
+
+										jQuery.ajax( {			
+											url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_var_setImageOrder&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
+											async: false,
+											data: {				
+												'var_id': <?php echo $k; ?>,
+												'vari_id': -1,
+												'wpsg_reorder': wpsg_reorder
+											},
+											success: function(data) { 
+
+												if (data != '1') alert(data); 
+												wpsg_vp_ajaxloading_hide();
+
+											}
+										} );
+																					 
+									}			
+								} ).disableSelection();
+
+				   			} );
+				   		
+					   		/* ]]> */</script>
+				   		
+				   		<?php } ?>
+					
+					</td>
+				</tr>
+				<?php } ?>
+			</table>
+			 
+			<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+			<script type="text/javascript">
+
+				jQuery("#variartnr_<?php echo $k; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+					submitdata: {  
+			    		typ: "var_artnr",
+			    		edit_id: <?php echo $this->view['data']['id']; ?>,
+			    		var_id: <?php echo $k; ?>,
+	    				<?php if (wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+					    wpsg_lang: "<?php echo $_REQUEST['wpsg_lang']; ?>",
+					    <?php } ?> 
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+
+				jQuery("#varpreis_<?php echo $k; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+					submitdata: {									
+						typ: "var_preis",
+						edit_id: <?php echo $this->view['data']['id']; ?>,
+						var_id: <?php echo $k; ?>
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+
+				<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+
+				jQuery("#varweight_<?php echo $k; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+					submitdata: {									
+						typ: "var_weight",
+						edit_id: <?php echo $this->view['data']['id']; ?>,
+						var_id: <?php echo $k; ?>
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+				
+				<?php } ?>
+
+				<?php if ($this->hasMod('wpsg_mod_stock') && $var['typ'] != 'checkbox') { ?>
+
+				jQuery("#varstock_<?php echo $k; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+					submitdata: {
+						typ: "var_stock",	
+						edit_id: <?php echo $this->view['data']['id']; ?>,
+						var_id: <?php echo $k; ?>
+					},
+					submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+					placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+					indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+			    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+				});
+				
+				<?php } ?>
+			
+			</script>
+			<?php } ?>
+			
+			<?php } else { ?>
+			<table style="width:100%;" class="wpsg_mod_varianten_orderwrap wpsg_mod_varianten_orderwrap_<?php echo $var['typ']; ?>">
+				<tbody>
+					<?php if (sizeof((array)$var['vari']) > 0) { ?>
+					<tr>
+						<th style="width:15px;">&nbsp;</th>
+						<th style="width:15px;">&nbsp;</th>
+						<th class="col_variname"></th>
+						<th class="col_variartnr"><?php echo __("Varianten Art. Nr.", "wpsg"); ?></th>					
+						<th class="col_preis"><?php echo __("Preis", "wpsg"); ?></th>
+						<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+						<th class="col_fmenge"><?php echo __('FÃŒllmenge', 'wpsg'); ?></th>
+						<?php } ?>
+						<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+						<th style="width:75px; text-align:left;"><?php echo __("Gewicht", "wpsg"); ?></th>
+						<?php } ?>
+						<?php if ($this->hasMod('wpsg_mod_stock')) { ?>
+						<th class="col_stock"><?php echo __("Bestand", "wpsg"); ?></th>
+						<?php } ?>
+						<th></th>
+						<th></th>
+					</tr>
+					<?php } ?>
+					<?php foreach ((array)$var['vari'] as $kv => $vari) { $ModCol = 0; ?>
+					<tr style="line-height:25px;" id="<?php echo 'variorder_'.$k.'_'.$kv; ?>" class="wpsg_mod_varianten_order">
+						<td></td>
+						<td class="sortable_handler"><?php echo $kv.": "; ?></td>
+						<td class="wpsg_editable col_variname" id="variname_<?php echo $k; ?>_<?php echo $kv; ?>"><?php 
+							echo $this->callMod('wpsg_mod_varianten', 'getVariName', array($this->view['vp_data'], $k, $kv)); 
+						?></td>
+						<td class="wpsg_editable col_variartnr" id="variartnr_<?php echo $k; ?>_<?php echo $kv; ?>"><?php echo (wpsg_isSizedString($vari['artnr']))? $vari['artnr']:''; ?></td>
+						<td class="col_preis wpsg_editable" id="varipreis_<?php echo $k; ?>_<?php echo $kv; ?>"><?php echo (($vari['preis'] != "")?wpsg_ff($vari['preis'], $this->get_option('wpsg_currency')):wpsg_ff(0, $this->get_option('wpsg_currency'))); ?></td>
+						<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { $ModCol ++; ?>
+						<td class="col_fmenge wpsg_editable" id="varifmenge_<?php echo $k; ?>_<?php echo $kv; ?>"><?php echo (($vari['fmenge'] != "")?wpsg_ff($vari['fmenge'], $this->view['vp_arFeinheiten'][$this->view['vp_productdata']['feinheit']]):"0"); ?></td>
+						<?php } ?>
+						<?php if ($this->hasMod('wpsg_mod_weight')) { $ModCol ++; ?>
+						<td class="col_variweight wpsg_editable" id="variweight_<?php echo $k; ?>_<?php echo $kv; ?>"><?php echo ((wpsg_isSizedString($vari['weight']))?$vari['weight']:'0'); ?></td>					
+						<?php } ?>
+						<?php if ($this->hasMod('wpsg_mod_stock')) { $ModCol ++; ?>
+						<td class="col_stock wpsg_editable" id="varistock_<?php echo $k; ?>_<?php echo $kv; ?>"><?php echo (($vari['stock'] != "")?intval($vari['stock']):'0'); ?></td>
+						<?php } ?> 
+						<td>
+							
+							<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+								<a href="#" title="<?php echo __("Variation lÃ¶schen", "wpsg"); ?>" style="float:right; margin-left:10px;" onclick="return wpsg_vp_vari_del(<?php echo $k; ?>, <?php echo $kv; ?>);"><img src="<?php echo $this->getRessourceURL('gfx/bin.png'); ?>" alt="<?php echo __("Variation lÃ¶schen", "wpsg"); ?>" /></a>		
+								<?php if ($vari['aktiv'] == "1") { ?>						
+								<a href="#" title="<?php echo __("Variation deaktivieren", "wpsg"); ?>" style="float:right; margin-left:10px;" onclick="return wpsg_vp_vari_deaktiv(<?php echo $k; ?>, <?php echo $kv; ?>, 0);"><img src="<?php echo $this->getRessourceURL('gfx/hide.png'); ?>" alt="<?php echo __("Variation deaktivieren", "wpsg"); ?>" /></a>						
+								<?php } else { ?>
+								<a href="#" title="<?php echo __("Variation aktivieren", "wpsg"); ?>" style="float:right; margin-left:10px;" onclick="return wpsg_vp_vari_deaktiv(<?php echo $k; ?>, <?php echo $kv; ?>, 1);"><img src="<?php echo $this->getRessourceURL('gfx/show.png'); ?>" alt="<?php echo __("Variation aktivieren", "wpsg"); ?>" /></a>
+								<?php } ?>
+							<?php } ?>
+							
+							<script type="text/javascript">
+							
+								jQuery("#variname_<?php echo $k; ?>_<?php echo $kv; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+									submitdata: {  
+							    		typ: "vari_name",
+							    		edit_id: <?php echo $this->view['data']['id']; ?>,
+							    		var_id: <?php echo $k; ?>,
+					    				<?php if (wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+									    wpsg_lang: "<?php echo $_REQUEST['wpsg_lang']; ?>",
+									    <?php } ?>
+							    		vari_id: <?php echo $kv; ?>
+									},
+									submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+									placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+									indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+							    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+								});
+								
+								<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+								jQuery("#variartnr_<?php echo $k; ?>_<?php echo $kv; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+									submitdata: {  
+							    		typ: "vari_artnr",
+							    		edit_id: <?php echo $this->view['data']['id']; ?>,
+							    		var_id: <?php echo $k; ?>,
+					    				<?php if (wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+									    wpsg_lang: "<?php echo $_REQUEST['wpsg_lang']; ?>",
+									    <?php } ?>
+							    		vari_id: <?php echo $kv; ?>
+									},
+									submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+									placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+									indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+							    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+								});
+													
+								jQuery("#varipreis_<?php echo $k; ?>_<?php echo $kv; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+									submitdata: {									
+										typ: "vari_preis",
+										edit_id: <?php echo $this->view['data']['id']; ?>,
+										var_id: <?php echo $k; ?>,
+										vari_id: <?php echo $kv; ?>
+									},
+									submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+									placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+									indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+							    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+								});
+	
+								<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+								jQuery("#varifmenge_<?php echo $k; ?>_<?php echo $kv; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+									submitdata: {									
+										typ: "vari_fmenge",
+										edit_id: <?php echo $this->view['data']['id']; ?>,
+										var_id: <?php echo $k; ?>,
+										vari_id: <?php echo $kv; ?>
+									},
+									submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+									placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+									indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+							    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+								});
+								<?php } ?>
+								
+								<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+	
+								jQuery("#variweight_<?php echo $k; ?>_<?php echo $kv; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+									submitdata: {
+										typ: "vari_weight",
+										edit_id: <?php echo $this->view['data']['id']; ?>,
+										var_id: <?php echo $k; ?>,
+										vari_id: <?php echo $kv; ?>
+									},
+									indicator: "<?php echo __("Speicher...", "wpsg"); ?>",
+									tooltip: "<?php echo __("Zum Bearbeiten anklicken und mit Enter bestÃ€tigen ...", "wpsg"); ?>"
+								});
+								
+								<?php } ?>
+	
+								<?php if ($this->hasMod('wpsg_mod_stock')) { ?>
+	
+								jQuery("#varistock_<?php echo $k; ?>_<?php echo $kv; ?>").editable("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_inlineEdit&noheader=1", {
+									submitdata: {
+										typ: "vari_stock",
+										edit_id: <?php echo $this->view['data']['id']; ?>,
+										var_id: <?php echo $k; ?>,
+										vari_id: <?php echo $kv; ?>
+									},
+									submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+									placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+									indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+							    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+								});
+								
+								<?php } ?>
+								<?php } ?>
+							
+							</script>
+							
+						</td>
+					</tr>
+					<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+					<tr class="wpsg_mod_varianten_productimage_row">
+						<td colspan="2">&nbsp;</td>
+						<td style="padding-bottom:10px;" colspan="<?php echo $ModCol + 3; ?>" id="wpsg_mod_varianten_productimage_<?php echo $k; ?>_<?php echo $kv; ?>">
+						
+					   		<?php $j = 0; foreach ((array)$this->callMod('wpsg_mod_varianten', 'getVariImages', array($this->view['data']['id'], $k, $kv)) as $file) { $j ++; $url_tn = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $file, 25, 25, 's')); ?>
+					   		<a class="<?php echo ((in_array($file, explode(",", $vari['pic'])))?'mark':''); ?> pic" id="<?php echo $file; ?>" onclick="return wpsg_vp_vari_setPic(this, <?php echo $k; ?>, <?php echo $kv; ?>, '<?php echo $file; ?>', <?php echo $j; ?>);" href=""><img src="<?php echo $url_tn; ?>" alt="" /></a>
+					   		<?php } ?>					   		
+					   								 
+						</td>
+						<td>
+						
+							<?php if (wpsg_isSizedInt($j)) { ?>
+					   		<script type="text/javascript">/* <![CDATA[ */
+
+					   			jQuery(document).ready(function() {   
+					   				
+							   		jQuery('#wpsg_mod_varianten_productimage_<?php echo $k; ?>_<?php echo $kv; ?>').sortable( {
+										items: 'a',
+										helper : 'clone',  
+										update: function(event, ui) {
+
+											wpsg_vp_ajaxloading_show();
+											
+											var wpsg_reorder = jQuery(this).sortable('toArray');
+
+											jQuery.ajax( {			
+												url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_var_setImageOrder&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
+												async: false,
+												data: {				
+													'var_id': <?php echo $k; ?>,
+													'vari_id': <?php echo $kv; ?>,
+													'wpsg_reorder': wpsg_reorder
+												},
+												success: function(data) { 
+
+													if (data != '1') alert(data);
+													wpsg_vp_ajaxloading_hide(); 
+
+												}
+											} );
+																						 
+										}			
+									} ).disableSelection();
+
+					   			} );
+					   		
+						   		/* ]]> */</script>
+					   		
+					   		<?php } ?>
+						
+						</td>
+					</tr>
+					<?php } ?>
+					<?php } ?>
+					
+					<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+					<tr>
+						<td colspan="2"></td>
+						<td><?php echo __("Neue Variation", "wpsg"); ?>: <input type="text" onkeypress="return wpsg_vp_addVariation_input(event, <?php echo $k; ?>);" class="variation_neu" value="" /></td>
+						<td colspan="5"> 
+							<input type="button" onclick="return wpsg_vp_addVariation(<?php echo $k; ?>);" value="<?php echo __("Anlegen", "wpsg"); ?>" class="button" />
+						</td>
+					</tr>			
+					<?php } ?>
+				
+				</tbody>
+			</table>
+			<?php } ?>
+					
+		</div>
+		<hr />		
+	<?php } ?>
+
+	</div>
+	
+<?php } ?>
+
+<script type="text/javascript">/* <![CDATA[ */
+						
+	jQuery(document).ready(function() {                                           	
+
+		<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+		jQuery('.var_order_wrap').sortable( {
+			items: 'div.var_order',
+			helper: wpsg_Tablefix,
+			handler: '.sortable_handler',
+			update: function(event, ui) {
+
+				var wpsg_reorder = jQuery(this).sortable('serialize');
+				
+				wpsg_vp_ajaxloading_show();
+			 				
+				jQuery.ajax( {			
+					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_var_reorder&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
+					async: false,
+					data: {		
+						'wpsg_lang': '<?php echo @$_REQUEST['wpsg_lang']; ?>',		
+						'wpsg_reorder': wpsg_reorder
+					},
+					success: function(data) {
+						
+						jQuery("#wpsg_vp_drawVarianten").html(data);
+						wpsg_vp_ajaxloading_hide();
+						
+					}
+				} );
+				
+			}			
+		} );
+		 
+		jQuery('.wpsg_mod_varianten_orderwrap tbody').sortable( {
+			helper: wpsg_Tablefix,
+			items: 'tr.wpsg_mod_varianten_order',
+			handler: '.sortable_handler',
+			update: function(event, ui) {
+
+				var wpsg_reorder = jQuery(this).sortable('serialize');
+		 
+				wpsg_vp_ajaxloading_show();
+								
+				jQuery.ajax( {			
+					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vari_reorder&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
+					async: false,
+					data: {				
+						'wpsg_lang': '<?php echo @$_REQUEST['wpsg_lang']; ?>',
+						'wpsg_reorder': wpsg_reorder
+					},
+					success: function(data) {
+						
+						jQuery("#wpsg_vp_drawVarianten").html(data);
+						wpsg_vp_ajaxloading_hide();
+						
+					}
+				} );
+				
+			}
+		} );
+		
+		jQuery('.wpsg_mod_varianten_orderwrap tbody tr.wpsg_mod_varianten_order').disableSelection();
+		<?php } ?>
+
+	} );
+
+/* ]]> */</script>
+
+<br />
+
+<?php if (!wpsg_isSizedString($_REQUEST['wpsg_lang'])) { ?>
+<label for="wpsg_vp_vartyp">
+	<?php echo __("Neue Variante", "wpsg"); ?>
+</label>
+<input type="text" id="wpsg_vp_varneu" onkeypress="return wpsg_vp_add_input(event);" value="" />
+<select id="wpsg_vp_vartyp">
+	<option value="radio"><?php echo __("Auswahl durch Radio Buttons", "wpsg"); ?></option>
+	<option value="select"><?php echo __("Auswahl ÃŒber eine Selectbox", "wpsg"); ?></option>
+	<option value="checkbox"><?php echo __("Ãber eine Checkbox aktivierbar", "wpsg"); ?></option>		
+	<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+	<option value="image"><?php echo __("Grafikauswahl", "wpsg"); ?></option>
+	<?php } ?>
+</select>
+<input type="button" onclick="wpsg_vp_add();" value="<?php echo __("Anlegen", "wpsg"); ?>" class="button" />
+<br />
+<?php } ?>
+
+<div class="wpsg_mod_varianten_ajaxloading" style="display:none;"><img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="<?php echo __('Bitte warten', 'wpsg'); ?>" /></div>
Index: /views/mods/mod_varianten/mail_row.phtml
===================================================================
--- /views/mods/mod_varianten/mail_row.phtml	(revision 5261)
+++ /views/mods/mod_varianten/mail_row.phtml	(revision 5261)
@@ -0,0 +1,18 @@
+<?php
+	
+	/**
+	 * Mit diesem Template kann die Zeile eines Produktes im Mailtemplate erweitert werden
+	 */
+
+?>
+<?php //wpsg_debug($this->view['variante']) ?>
+<?php if (get_option('wpsg_vp_detailview') == 1) { ?>
+<?php echo wpsg_pad_left($p['menge'], 5); ?><?php echo wpsg_translate(__('Variante:', 'wpsg'), "")."\n" ?>
+<?php foreach ($this->view['variante'] as $vari => $value) { ?>
+<?php if (is_numeric($vari)) { ?>
+<?php echo wpsg_pad_left($p['menge'], 8); ?> <?php echo '- '.$value['name'] ?>: <?php echo $value['value'] ?>; <?php echo __('Art. Nr.', 'wpsg').': '.$value['artnr'] ?>; <?php echo $value['preis'] ?> <?php echo $this->get_option('wpsg_currency')."\n" ?>
+<?php } ?>
+<?php } ?>
+<?php } else { ?>
+<?php echo wpsg_pad_right(' ', 5); ?><?php echo __('Variante', 'wpsg'); ?>: <?php echo $this->view['variante']['key']; ?>
+<?php } ?> 
Index: /views/mods/mod_varianten/mail_row_html.phtml
===================================================================
--- /views/mods/mod_varianten/mail_row_html.phtml	(revision 5261)
+++ /views/mods/mod_varianten/mail_row_html.phtml	(revision 5261)
@@ -0,0 +1,22 @@
+<?php
+	
+	/**
+	 * Mit diesem Template kann die Zeile eines Produktes im Mailtemplate HTML erweitert werden
+	 */
+
+?>
+<tr class="productrow productrow2 <?php echo ((($this->view['i'] % 2) == 0)?'productrow_odd':'productrow_even'); ?>">
+	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_pos">&nbsp;</td>
+	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name"><?php echo __('Variante', 'wpsg'); ?>:</td>
+	<td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_variant_value" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
+		<?php if (get_option('wpsg_vp_detailview') == 1) { ?>
+			<?php foreach ($this->view['variante'] as $vari => $value) { ?>
+			<?php if (is_numeric($vari)) { ?>
+				<?php echo wpsg_pad_left($p['menge'], 8); ?> <?php echo '- '.$value['name'] ?>: <?php echo $value['value'] ?>; <?php echo __('Art. Nr.', 'wpsg').': '.$value['artnr'] ?>; <?php echo $value['preis'] ?> <?php echo $this->get_option('wpsg_currency'); ?><br />
+			<?php } ?>
+			<?php } ?>						
+		<?php } else { ?>
+			<?php echo $this->view['variante']['key']; ?>
+		<?php } ?>
+	</td> 
+</tr> 
Index: /views/mods/mod_varianten/order_view_row.phtml
===================================================================
--- /views/mods/mod_varianten/order_view_row.phtml	(revision 5261)
+++ /views/mods/mod_varianten/order_view_row.phtml	(revision 5261)
@@ -0,0 +1,22 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Zeile eines Variantenprodukts bei der Produktansicht in der Bestellverwaltung
+	 */
+
+?>
+<tr class="wpsg_<?php echo (($this->view['i'] == 0)?'odd':'even'); ?>">
+	<td style="padding:4px; line-height:100%; vertical-align:middle;"><?php echo __('Variante', 'wpsg'); ?>:</td>
+	<td style="padding:4px; line-height:100%; vertical-align:middle;" align="right" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>">
+		<?php if ($this->get_option('wpsg_vp_detailview') == 1) { ?>
+		<?php foreach ($this->view['variante'] as $vari => $value) { ?>
+		<?php if (is_numeric($vari)) { ?>
+		<?php echo $value['name'] ?>: <?php echo $value['value'] ?>; <?php echo __('Art. Nr.', 'wpsg').': '.$value['artnr'] ?>; <?php echo $value['preis'] ?> <?php echo $this->get_option('wpsg_currency') ?>
+		<br />
+		<?php } ?>
+		<?php } ?>							
+		<?php } else { ?>
+		<?php echo $this->view['variante']['key']; ?>
+		<?php } ?>
+	</td>
+</tr>
Index: /views/mods/mod_varianten/overview_row.phtml
===================================================================
--- /views/mods/mod_varianten/overview_row.phtml	(revision 5261)
+++ /views/mods/mod_varianten/overview_row.phtml	(revision 5261)
@@ -0,0 +1,22 @@
+<?php
+
+	/**
+	 * Wird nach den Produkten in der Bestellzusammenfassung (overview) bei Variantenprodukten verwendet
+	 */
+
+?>
+<tr class="wpsg_<?php echo (($this->view['i'] == 0)?'odd':'even'); ?>">
+	<td><?php echo __('Variante', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'2':'1'); ?>" class="wpsg_mod_varianten_value">
+		<?php if (get_option('wpsg_vp_detailview') == 1) { ?>
+		<?php foreach ($this->view['variante'] as $vari => $value) { ?>
+		<?php if (is_numeric($vari)) { ?>
+		<?php echo $value['name'] ?>: <?php echo $value['value'] ?>; <?php echo __('Art. Nr.', 'wpsg').': '.$value['artnr'] ?>; <?php echo $value['preis'] ?> <?php echo $this->get_option('wpsg_currency') ?>
+		<br />
+		<?php } ?>
+		<?php } ?>							
+		<?php } else { ?>
+		<?php echo $this->view['variante']['key']; ?>
+		<?php } ?>
+	</td>
+</tr>
Index: /views/mods/mod_varianten/produkt.phtml
===================================================================
--- /views/mods/mod_varianten/produkt.phtml	(revision 5261)
+++ /views/mods/mod_varianten/produkt.phtml	(revision 5261)
@@ -0,0 +1,148 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Varianten wird vom Produkttemplate z.B. standard.phtml geladen
+	 */
+ 
+?>
+ 
+<script type="text/javascript">/* <![CDATA[ */
+ 
+	wpsg_vp_vari[<?php echo $this->getProduktId($this->view['data']['id']); ?>] = new Array();
+	 
+/* ]]> */</script>
+
+<?php $vAktiv = false; if (is_array($this->view['data']['vp_data']) && sizeof($this->view['data']['vp_data']) > 0) { ?>
+	<?php foreach ($this->view['data']['vp_data'] as $k => $var) { if ($var['aktiv'] == "1") { $vAktiv = true; ?>
+		
+	<div class="wpsg_vp_field wpsg_vp_field_<?php echo $this->getProduktId($this->view['data']['id']); ?>">
+		
+		<script type="text/javascript">/* <![CDATA[ */
+
+			wpsg_vp_vari[<?php echo $this->getProduktId($this->view['data']['id']); ?>][<?php echo $k; ?>] = "<?php echo $var['typ']; ?>";			
+						
+			/* ]]> */</script>
+		
+		<?php if ($var['typ'] != 'radio') { ?>
+		<label class="wpsg_vp_field_label" for="wpsg_vpfield_<?php echo $this->getProduktId($this->view['data']['id']); ?>_<?php echo $k; ?>">
+			<?php echo $var['name']; ?>
+		</label>
+		<?php } else { ?>
+		<span class="wpsg_vp_field"><?php echo $var['name']; ?></span>
+		<?php } ?>
+		
+		<div class="wpsg_vp_field_typ_<?php echo $var['typ']; ?>">
+		
+			<?php if ($var['typ'] == "select") { ?>
+			<label>			 			
+				<select onchange="wpsg_vp_switch(<?php echo $this->getProduktId($this->view['data']['id']); ?>, <?php echo $this->view['product_index']; ?>);" name="wpsg_vp[<?php echo $k; ?>]" id="wpsg_vpfield_<?php echo $this->getProduktId($this->view['data']['id']); ?>_<?php echo $k; ?>">
+					<?php foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && (!$this->hasMod('wpsg_mod_stock') || $vari['stock'] > 0)) { ?>
+					<option value="<?php echo $kv; ?>" <?php echo (($this->view['wpsg_mod_varianten']['set'][$k] == $kv)?'selected="selected"':''); ?>>						
+						<?php echo $vari['name']; ?>
+						<?php if ($this->callMod('wpsg_mod_varianten', 'showVariPrice', array($vari['preis']))) { ?>
+						(<?php echo wpsg_ff($vari['preis'], $this->get_option('wpsg_currency')); ?>)
+						<?php } ?>
+					</option>
+					<?php } } ?>
+				</select> 
+				<?php if ($this->get_option("wpsg_vp_showpic") == "1" && $this->hasMod('wpsg_mod_produktbilder')) { ?>
+				<span class="wpsg_vp_field_image">				
+					<?php foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && isset($vari['showpic'])) { ?>
+					<span class="wpsg_vp_image wpsg_vp_image_<?php echo $kv; ?>" style="display:<?php echo (($this->view['wpsg_mod_varianten']['set'][$k] == $kv)?'block':'none'); ?>;">
+						
+						<?php 
+							
+						$img_src = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array(
+							$this->getProduktId($this->view['data']['id']), 
+							$vari['showpic'],
+							$this->get_option("wpsg_vp_showpic_width"),
+							$this->get_option("wpsg_vp_showpic_height"), 
+							's'
+						));
+							
+						?><img src="<?php echo $img_src; ?>" alt="" />
+												
+					</span>
+					<?php } } ?>
+				</span>
+				<?php } ?>		
+			</label>
+			<?php } ?>
+			
+			<?php if ($var['typ'] == 'image' && $this->hasMod('wpsg_mod_produktbilder')) { ?>
+			<div class="wpsg_mod_varianten_imageselect wpsg_mod_varianten_imageselect_<?php echo $k; ?>">
+			<input type="hidden" name="wpsg_vp[<?php echo $k; ?>]" value="<?php echo $this->view['wpsg_mod_varianten']['set'][$k]; ?>" />
+			<?php foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == '1' && (!$this->hasMod('wpsg_mod_stock') || $vari['stock'] > 0)) { ?>
+				<?php $img = $this->callMod('wpsg_mod_varianten', 'getImageSelectImage', array($this->getProduktId($this->view['data']['id']), $k, $kv, $this->view['data']['product_key'])); ?>								
+				<?php if (wpsg_isSizedString($img)) { ?>
+				<a data-wpsg-id="<?php echo $kv; ?>" class="image <?php echo (($this->view['wpsg_mod_varianten']['set'][$k] == $kv)?'akt':''); ?>" onclick="jQuery(this).parent().find('a').removeClass('akt'); jQuery(this).addClass('akt'); wpsg_vp_switch(<?php echo $this->getProduktId($this->view['data']['id']); ?>, <?php echo $this->view['product_index']; ?>); return false;" href="#">
+					<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->getProduktId($this->view['data']['id']), $img, $this->get_option('wpsg_vp_imageselect_width'), $this->get_option('wpsg_vp_imageselect_height'), $this->get_option('wpsg_vp_imageselect_mode'))); ?>" />
+				</a>
+				<?php } ?>
+			<?php } } ?>
+			</div>
+			<?php } ?>
+			
+			<?php if ($var['typ'] == "radio") { ?>
+			<?php $j = 0; foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && (!$this->hasMod('wpsg_mod_stock') || $vari['stock'] > 0)) { $j ++; ?>			
+			<label>
+				<input <?php echo (($this->view['wpsg_mod_varianten']['set'][$k] == $kv)?'checked="checked"':''); ?> id="wpsg_vpfield_<?php echo $this->getProduktId($this->view['data']['id']); ?>_<?php echo $k; ?>_<?php echo $j; ?>" onclick="wpsg_vp_switch(<?php echo $this->getProduktId($this->view['data']['id']); ?>, <?php echo $this->view['product_index']; ?>);" type="radio" name="wpsg_vp[<?php echo $k; ?>]" value="<?php echo $kv; ?>" />&nbsp;<?php echo $vari['name']; ?>
+				<?php if ($this->callMod('wpsg_mod_varianten', 'showVariPrice', array($vari['preis']))) { ?>
+				<span class="wpsg_vp_vari_preisinfo">(<?php echo wpsg_ff($vari['preis'], $this->get_option('wpsg_currency')); ?>)</span>
+				<?php } ?>
+				<?php if ($this->get_option("wpsg_vp_showpic") == "1" && isset($vari['showpic']) && $vari['showpic'] != false) { ?>
+				<span class="wpsg_vp_field_image">
+				
+					<?php 
+							
+					$img_src = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array(
+						$this->getProduktId($this->view['data']['id']), 
+						$vari['showpic'],
+						$this->get_option("wpsg_vp_showpic_width"),
+						$this->get_option("wpsg_vp_showpic_height"), 
+						's'
+					));
+						
+					?><img src="<?php echo $img_src; ?>" alt="" />
+					
+				</span>
+				<?php } ?>		
+			</label>
+			<?php } } ?>			
+			<?php } ?>
+			
+			<?php if ($var['typ'] == "checkbox" && $var['aktiv'] == 1) { ?>
+			<label>
+				<input onchange="wpsg_vp_switch(<?php echo $this->getProduktId($this->view['data']['id']); ?>, <?php echo $this->view['product_index']; ?>);" type="hidden" value="0" name="wpsg_vp[<?php echo $k; ?>]" />
+				<input <?php echo (($this->view['wpsg_mod_varianten']['set'][$k] == '1')?'checked="checked"':''); ?> onchange="wpsg_vp_switch(<?php echo $this->getProduktId($this->view['data']['id']); ?>, <?php echo $this->view['product_index']; ?>);" type="checkbox" value="1" name="wpsg_vp[<?php echo $k; ?>]" />
+				<?php if ($this->callMod('wpsg_mod_varianten', 'showVariPrice', array($var['preis']))) { ?>
+				<span class="wpsg_vp_vari_preisinfo">(<?php echo wpsg_ff($var['preis'], $this->get_option('wpsg_currency')); ?>)</span>
+				<?php } ?>
+				<?php if ($this->get_option("wpsg_vp_showpic") == "1" && $var['showpic'] != false) { ?>
+				<span class="wpsg_vp_field_image">
+					
+					<?php 
+						
+					$img_src = $this->callMod('wpsg_mod_produktbilder', 'makeTn', array(
+						$this->getProduktId($this->view['data']['id']), 
+						$var['showpic'],
+						$this->get_option("wpsg_vp_showpic_width"),
+						$this->get_option("wpsg_vp_showpic_height"), 
+						's'
+					));
+							
+					?><img src="<?php echo $img_src; ?>" alt="" />
+				</span>
+				<?php } ?>
+			</label>
+			<?php } ?>
+									
+		</div>
+		 	
+		<div style="clear:both;"></div>
+	
+	</div>
+	
+	<?php } } ?>
+	
+<?php } ?>
Index: /views/mods/mod_varianten/produkt_edit_content.phtml
===================================================================
--- /views/mods/mod_varianten/produkt_edit_content.phtml	(revision 5261)
+++ /views/mods/mod_varianten/produkt_edit_content.phtml	(revision 5261)
@@ -0,0 +1,297 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Varianten innerhalb der Produktverwaltung
+	 */
+
+?>
+<script type="text/javascript">
+
+	<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
+	function wpsg_vp_add()
+	{
+
+		if (jQuery('#wpsg_vp_varneu').val() == '') { alert('<?php echo __('Bitte einen Namen fÃŒr die neue Variante angeben!', 'wpsg'); ?>'); return; } 
+
+		var val_name = jQuery("#wpsg_vp_varneu").val();
+		var val_typ = jQuery("#wpsg_vp_vartyp").val();
+		
+		wpsg_vp_ajaxloading_show();
+		
+		jQuery.ajax( {			
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_add&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			async: false,
+			data: {				
+				name: val_name,
+				typ: val_typ
+			},
+			success: function(data) {
+				
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} );
+		
+	} // function wpsg_vp_add()
+
+	/**
+	 * Wird von dem Input Feld bei neuen Varianten aufgerufen (onkeypress) um 
+	 */
+	function wpsg_vp_add_input(ev)
+	{
+
+		if (ev && ev.which == 13)
+		{
+
+			wpsg_vp_add();
+			
+		} 
+		
+	} // function wpsg_vp_add_input(ev)
+
+	function wpsg_vp_addVariation_input(ev, k)
+	{
+
+		if (ev && ev.which == 13)
+		{
+
+			wpsg_vp_addVariation(k);
+			
+		} 
+		
+	} 
+
+	function wpsg_vp_refresh()
+	{
+
+		wpsg_vp_ajaxloading_show();
+
+		jQuery.ajax( {
+ 			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_refreh&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			success: function(data) { 
+
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide(); 
+
+			}
+		} ); 
+
+		return false;
+		
+	}
+	
+	function wpsg_vp_del(var_id)
+	{
+
+		if (!confirm("<?php echo __("Sind Sie sich sicher, dass Sie die Variante und alle Variationen lÃ¶schen mÃ¶chten?", "wpsg"); ?>")) return false;
+
+		wpsg_vp_ajaxloading_show();
+				
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_del&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			async: false,
+			data: {				
+				var_id: var_id
+			},
+			success: function(data) {
+				
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} ); 
+
+		return false;
+		
+	} // function wpsg_vp_del(var_id)
+
+	function wpsg_vp_deaktiv(var_id, status)
+	{
+
+		wpsg_vp_ajaxloading_show();
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_deaktiv&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			async: false,
+			data: {				
+				var_id: var_id,
+				status: status
+			},
+			success: function(data) {
+				
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} ); 
+
+		return false;
+		
+	} // function wpsg_vp_deaktiv(var_id, status)
+
+	function wpsg_vp_addVariation(var_id)
+	{
+
+		var vari_name = jQuery("#variante_" + var_id).find(".variation_neu").val();
+		var vari_preis = jQuery("#variante_" + var_id).find(".variation_preis").val();
+
+		wpsg_vp_ajaxloading_show();
+
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_addVariation&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			async: false,
+			data: {				
+				var_id: var_id,
+				vari_name: vari_name,
+				vari_preis: vari_preis
+			},
+			success: function(data) {
+				 
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} ); 
+
+		return false;
+		
+	}
+
+	function wpsg_vp_vari_del(var_id, vari_id)
+	{
+
+		if (!confirm("<?php echo __("Sind Sie sich sicher, dass Sie die Variation lÃ¶schen mÃ¶chten?", "wpsg"); ?>")) return false;
+		
+		wpsg_vp_ajaxloading_show();
+
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_del&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			async: false,
+			data: {				
+				var_id: var_id,
+				vari_id: vari_id
+			},
+			success: function(data) {
+				 
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} ); 
+
+		return false;
+		
+	}
+
+	function wpsg_vp_vari_deaktiv(var_id, vari_id, status)
+	{
+
+		wpsg_vp_ajaxloading_show();
+		
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_deaktiv&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>',
+			async: false,
+			data: {				
+				var_id: var_id,
+				vari_id: vari_id,
+				status: status
+			},
+			success: function(data) {
+				 
+				jQuery("#wpsg_vp_drawVarianten").html(data);
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} ); 
+
+		return false;
+		
+	}
+	<?php } ?>
+
+	function wpsg_vp_ajaxloading_show()
+	{
+
+		jQuery('.wpsg_mod_varianten_ajaxloading').show();
+		
+	}
+
+	function wpsg_vp_ajaxloading_hide()
+	{
+
+		jQuery('.wpsg_mod_varianten_ajaxloading').hide();
+		
+	} 
+	
+	function wpsg_vp_vari_setPic(htmlElement, var_id, vari_id, pic, pic_index)
+	{
+
+		<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
+
+		wpsg_vp_ajaxloading_show();
+		
+		jQuery.ajax( {
+			url: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_varianten&cmd=wpsg_vp_vari_setPic&noheader=1&edit_id=<?php echo $this->view['wpsg_mod_varianten']['data']['id']; ?>",
+			async: false,
+			data: {				
+				var_id: var_id,
+				vari_id: vari_id,
+				pic: pic
+			},
+			success: function(data) { 
+				
+				if (vari_id >= 0)
+				{
+					
+					if (jQuery(htmlElement).hasClass('mark'))
+					{
+						jQuery(htmlElement).removeClass('mark');
+					}
+					else
+					{
+						jQuery(htmlElement).addClass('mark');
+					}
+					
+				}
+				else
+				{
+					
+					if (jQuery(htmlElement).hasClass('mark'))
+					{
+						jQuery(htmlElement).removeClass('mark');
+					}
+					else
+					{
+						jQuery(htmlElement).addClass('mark');
+					}
+					
+				}
+
+				wpsg_vp_ajaxloading_hide();
+				
+			}
+		} ); 
+
+		<?php } ?>
+		
+		return false;
+		
+	}
+
+</script>
+  
+
+<div class="postbox" id="wpsg_varianten">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>			
+		<span><?php echo __('Varianten', 'wpsg'); ?></span>	
+	</h3>
+	<div class="inside" id="wpsg_vp_drawVarianten">
+		<?php if ($this->view['data']['id'] > 0) { ?>
+		<?php echo $this->callMod('wpsg_mod_varianten', 'drawVarianten', array(&$this->view['wpsg_mod_varianten']['data']['id'])); ?>
+		<?php } else { ?>
+		<p><?php echo __('Varianten kÃ¶nnen erst nach einmaligem Speichern des Produkts angelegt werden.', 'wpsg'); ?></p>
+		<?php } ?>
+	</div>
+</div>
Index: /views/mods/mod_varianten/settings_edit.phtml
===================================================================
--- /views/mods/mod_varianten/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_varianten/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,25 @@
+<?php
+
+	/**
+	 * Einstellungen des Variantenmoduls
+	 */
+
+?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_vp_showpic', __('Direkte Anzeige eines Variantenbildes', 'wpsg'), $this->get_option('wpsg_vp_showpic'), array('help' => 'wpsg_vp_showpic')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_vp_detailview', __('Erweiterte Variantenanzeige aktivieren', 'wpsg'), $this->get_option('wpsg_vp_detailview'), array('help' => 'wpsg_vp_detailview')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_vp_showpic_width', __('Breite des Vorschaubildes', 'wpsg'), $this->get_option('wpsg_vp_showpic_width'), array('help' => 'wpsg_vp_showpic_width')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_vp_showpic_height', __('HÃ¶he des Vorschaubildes', 'wpsg'), $this->get_option('wpsg_vp_showpic_height'), array('help' => 'wpsg_vp_showpic_height')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_vp_replaceanr', __('Produktartikelnummer ersetzen', 'wpsg'), $this->get_option('wpsg_vp_replaceanr'), array('hint' => __('Ersetzt die Produktartikelnummer durch die zusammengesetzte Artikelnummern der Varianten.', 'wpsg'), 'help' => 'wpsg_vp_replaceanr')); ?>
+
+<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+<br />
+<h3><?php echo __('Bild fÃŒr Varianten mit "Grafikauswahl"', 'wpsg'); ?></h3>
+<?php echo wpsg_drawForm_Input('wpsg_vp_imageselect_width', __('Breite des Vorschaubildes', 'wpsg'), $this->get_option('wpsg_vp_imageselect_width'), array('help' => 'wpsg_vp_imageselect_width')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_vp_imageselect_height', __('HÃ¶he des Vorschaubildes', 'wpsg'), $this->get_option('wpsg_vp_imageselect_height'), array('help' => 'wpsg_vp_imageselect_height')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_vp_imageselect_mode', __('Bild Modus', 'wpsg'), $this->callMod('wpsg_mod_produktbilder', 'getImageModes'), $this->get_option('wpsg_vp_imageselect_mode'), array('help' => 'wpsg_vp_imageselect_mode')); ?>
+<br />
+<?php } ?>
+
+<div class="wpsg_hinweis">
+	<?php echo __('Die direkte Anzeige, zeigt die Bilder direkt an. Es wird dabei fÃŒr jede Variation ein Bild angezeigt. Bei Selectboxen erfolgt die Anzeige ÃŒber den Wechsel der Selectbox. ', 'wpsg'); ?>
+</div>
Index: /views/mods/mod_varianten/varianten.js
===================================================================
--- /views/mods/mod_varianten/varianten.js	(revision 5261)
+++ /views/mods/mod_varianten/varianten.js	(revision 5261)
@@ -0,0 +1,58 @@
+
+	var wpsg_vp_vari = new Array();	
+		  
+	function wpsg_vp_switch(product_id, product_index)
+	{
+			 
+		var var_key = 'vp_' + product_id + "/";
+				
+		for (var i = 0; i < wpsg_vp_vari[product_id].length; i ++)
+		{
+			
+			var_key += i + "_";
+			
+			if (wpsg_vp_vari[product_id][i] == "select")
+			{				
+				var_key += jQuery('#wpsg_produktform_' + product_index + ' .wpsg_produkt_' + product_id + " #wpsg_vpfield_" + product_id + "_" + i).val();				
+			}
+			else if (wpsg_vp_vari[product_id][i] == "radio")
+			{
+				var_key += jQuery('#wpsg_produktform_' + product_index + ' .wpsg_produkt_' + product_id + ' input[name="wpsg_vp[' + i + ']"]:checked').val();
+			}
+			else if (wpsg_vp_vari[product_id][i] == "checkbox")
+			{
+				var_key += jQuery('#wpsg_produktform_' + product_index + ' .wpsg_produkt_' + product_id + ' input[name="wpsg_vp[' + i + ']"]:checked').length;
+			} 
+			else if (wpsg_vp_vari[product_id][i] == "image")
+			{
+				var_key += jQuery('#wpsg_produktform_' + product_index + ' .wpsg_produkt_' + product_id + ' .wpsg_mod_varianten_imageselect_' + i + ' .akt').attr("data-wpsg-id");
+			}
+			
+			if (i < (wpsg_vp_vari[product_id].length - 1)) var_key += ":";
+			
+		}
+		 
+		jQuery('#wpsg_produktform_' + product_index).append('<div class="wpsg_product_layer"><img src="' + wpsg_ajax.img_ajaxloading + '" alt="' + wpsg_ajax.label_pleasewait + '" /></div>');
+ 
+		jQuery.ajax( {
+			'url': wpsg_ajax.ajaxurl,
+			'method': 'get',
+			'data': {
+				'action': 'wpsg_varianten_switch',
+				'wpsg_post_id': jQuery('#wpsg_produktform_' + product_index + ' input[name="wpsg_post_id"]').val(),
+				'quantity': jQuery('#wpsg_menge_' + product_index).val(),
+				'template': jQuery('#wpsg_produktform_' + product_index + ' input[name="wpsg[template]"]').val(),
+				'referer': jQuery('#wpsg_produktform_' + product_index + ' input[name="myReferer"]').val(),
+				'form_data': jQuery('#wpsg_produktform_' + product_index).serialize(),
+				'product_key': var_key,
+				'product_index': product_index
+			},
+			'success': function(data) {
+		 
+				jQuery('#wpsg_produktform_' + product_index).replaceWith(data);
+				
+			}
+		} );
+		
+	} // function wpsg_vp_switch(produkt_id)
+	
Index: /views/mods/mod_versandarten/list.phtml
===================================================================
--- /views/mods/mod_versandarten/list.phtml	(revision 8528)
+++ /views/mods/mod_versandarten/list.phtml	(revision 5261)
@@ -4,197 +4,245 @@
 	 * Template fÃŒr die Liste der Versandarten 
 	 */
-	
-	$arVzNamen = [];
-	
+
 ?>
 <?php if (!is_array($this->view['data']) || sizeof($this->view['data']) <= 0) { ?>
 <?php echo __('Bisher keine Versandarten angelegt.', 'wpsg'); ?>
 <?php } else { ?>
-
-	<?php foreach ($this->view['arVZ'] as $k=>$vz) { $arVzNamen[$k] = $vz['name']; } ?>
-
+<table class="va_table">
+	 <colgroup>
+    	<col class="wpsg_label" />
+    	<col class="wpsg_value" /> 
+    	<col class="wpsg_delcol" />
+  	</colgroup>
 	<?php $i = 0; foreach ($this->view['data'] as $va) { $i ++; ?>
-
-    <hr />
-	<div id="wpsg_mod_versandarten_row_<?php echo $va['id']; ?>">
-
-	    <?php echo wpsg_drawForm_TextStart(); ?>
-    	<?php echo $va['id']; ?>
-		<a data-id="<?php echo $va['id']; ?>" class="wpsg_oc_removeLink" href="#" onclick="return wpsg_removeVA(<?php echo $va['id']; ?>);" title="<?php echo __('Versandart lÃ¶schen', 'wpsg'); ?>">
-		<span class="wpsg_glyphicon_right glyphicon glyphicon-trash"></span></a>
-    	<?php echo wpsg_drawForm_TextEnd(__('ID', 'wpsg')); ?>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="va_name_<?php echo $va['id']; ?>"><?php echo $va['name']; ?></span>
-        <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_name" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Bezeichnung', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#va_name_<?php echo $va['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'name',
-                    va_id: '<?php echo $va['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-		<input type="checkbox" value="1" <?php echo (($va['aktiv'] == '1')?'checked="checked"':''); ?> id="va_<?php echo $va['id']; ?>_aktiv" />
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_activ" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Aktiv', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-			jQuery('#va_<?php echo $va['id']; ?>_aktiv').bind('change', function() {
-
-				var value = 0;
-				if (jQuery(this).prop("checked") === true) value = 1;
-
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1',
-					data: {
-						field: 'aktiv',
-						va_id: '<?php echo $va['id']; ?>',
-						value: value
-					}	
+	<tr>
+		<td class="wpsg_label"><?php echo __('ID', 'wpsg'); ?>:</td>
+		<td class="wpsg_value"><?php echo $va['id']; ?></td>	
+		<td class="wpsg_delcol">
+			<a class="wpsg_icon wpsg_icon_remove" href="#" title="<?php echo __('Versandart lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeVA(<?php echo $va['id']; ?>);"></a>
+			<?php foreach ($this->view['arVZ'] as $k=>$vz) { $arVzNamen[$k] = $vz['name']; } ?>
+			<script type="text/javascript">
+
+				jQuery(document).ready(function() {
+
+					jQuery('#va_<?php echo $va['id']; ?>_name').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
+						submitdata: { 
+				    		field: 'name',
+				    		va_id: '<?php echo $va['id']; ?>'
+						}, 					
+						submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});
+
+					jQuery('#va_<?php echo $va['id']; ?>_kosten').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
+						submitdata: { 
+				    		field: 'kosten',
+				    		va_id: '<?php echo $va['id']; ?>'
+						}, 					
+						submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});
+
+					jQuery('#va_<?php echo $va['id']; ?>_hint').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
+						submitdata: { 
+				    		field: 'hint',
+				    		va_id: '<?php echo $va['id']; ?>'
+						}, 					
+						submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});
+ 					
+					jQuery('#va_<?php echo $va['id']; ?>_typ').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', { 
+						submitdata: {
+							field: 'typ',
+							va_id: '<?php echo $va['id']; ?>'
+						},
+						submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+						data   : '<?php echo json_encode($this->view['arTypen']); ?>',
+						type   : 'select',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});		
+
+					jQuery('#va_<?php echo $va['id']; ?>_vz').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
+						submitdata: {
+							field: 'vz',
+							va_id: '<?php echo $va['id']; ?>'
+						},
+						submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+						data   : '<?php echo json_encode($arVzNamen) ?>',
+						type   : 'select',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+				    	callback: function(data)
+				    	{
+							location.reload();
+				    	}
+
+					} );		
+
+					jQuery('#va_<?php echo $va['id']; ?>_mwst').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', { 
+						submitdata: {
+							field: 'mwst_key',
+							va_id: '<?php echo $va['id']; ?>'
+						},
+						submit: '<?php echo __('Speichern', 'wpsg'); ?>',
+						data: '<?php echo json_encode(wpsg_tax_groups()); ?>',
+						type: 'select',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
+					});	
+
+					jQuery('#va_<?php echo $va['id']; ?>_aktiv').bind('change', function() {
+
+						var value = 0;
+						 
+						if (jQuery(this).attr("checked") == "checked") value = 1;
+
+						jQuery.ajax( {
+							url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1',
+							data: {
+								field: 'aktiv',
+								va_id: '<?php echo $va['id']; ?>',
+								value: value
+							}	
+						} );
+						 
+					} );
+					
 				} );
-			} );
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="va_hint_<?php echo $va['id']; ?>"><?php echo wpsg_hspc($va['hint']); ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_hint" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Hinweistext', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#va_hint_<?php echo $va['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'hint',
-                    va_id: '<?php echo $va['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="va_typ_<?php echo $va['id']; ?>"><?php
-        echo wpsg_hspc($this->view['arTypen'][$va['typ']]);
-        ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_grundlage" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_grundlage" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_grundlage"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Grundlage', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#va_typ_<?php echo $va['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                type: 'select',
-				data: <?php echo wpsg_prepare_for_inlineEdit($this->view['arTypen']); ?>,
-	            submitdata: {
-                    field: 'typ',
-                    va_id: '<?php echo $va['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="va_vz_<?php echo $va['id']; ?>"><?php
+			
+			</script>
+			
+		</td>
+	</tr>
+	<tr>
+		<td class="wpsg_label"><?php echo __('Bezeichnung', 'wpsg'); ?>:</td>
+		<td class="wpsg_value wpsg_editable" id="va_<?php echo $va['id']; ?>_name"><?php echo wpsg_hspc($va['name']); ?></td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_name"></a>
+		</td>
+	</tr>
+	<tr>
+		<td class="wpsg_label"><label for="va_<?php echo $va['id']; ?>_aktiv"><?php echo __('Aktiv', 'wpsg'); ?>:</label></td>
+		<td class="wpsg_value">
+			<input type="checkbox" value="1" <?php echo (($va['aktiv'] === '1')?'checked="checked"':''); ?> id="va_<?php echo $va['id']; ?>_aktiv" />
+		</td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_activ"></a>
+		</td> 
+	</tr>
+	<tr>
+		<td class="wpsg_label"><?php echo __('Hinweistext', 'wpsg'); ?>:</td>
+		<td class="wpsg_value wpsg_editable" id="va_<?php echo $va['id']; ?>_hint" ><?php echo wpsg_hspc($va['hint']); ?></td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_hint"></a>
+		</td>
+	</tr>
+	<tr>
+		<td class="wpsg_label"><?php echo __('Grundlage', 'wpsg'); ?>:</td>
+		<td id="va_<?php echo $va['id']; ?>_typ" class="wpsg_value wpsg_editable"><?php echo wpsg_hspc($this->view['arTypen'][$va['typ']]); ?></td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_grundlage" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_grundlage"></a>
+		</td>
+	</tr>   
+	<tr>
+		<td class="wpsg_label"><?php echo __('Versandzone', 'wpsg'); ?>:</td>
+		<td id="va_<?php echo $va['id']; ?>_vz" class="wpsg_value wpsg_editable">
+			<?php if ($va['vz'] > 0) { ?>
+			<?php echo wpsg_hspc($this->view['arVZ'][$va['vz']]['name']); ?>
+			<?php } else { ?>
+			<?php echo __('Alle Versandzonen', 'wpsg'); ?>
+			<?php } ?>
+		</td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_versandzone" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_versandzone"></a>
+		</td>
+	</tr>
+	<tr>
+		<td class="wpsg_label"><?php echo __('KostenschlÃŒssel', 'wpsg'); ?>:</td>
+		<td class="wpsg_value wpsg_editable" id="va_<?php echo $va['id']; ?>_kosten"><?php echo wpsg_hspc($va['kosten']); ?></td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_kostenschluessel" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_kostenschluessel"></a>
+		</td>
+	</tr>
+	<?php if (wpsg_isSizedArray($this->view['arVZ'][$va['vz']]['arPLZ'])) { ?>
+	<?php $index = 1; foreach ((array)$this->view['arVZ'][$va['vz']]['arPLZ'] as $plz_key => $plz) { ?>
+	<tr>
+		<td class="wpsg_label"><?php echo __('KostenschlÃŒssel PLZ', 'wpsg'); ?> [ <?php echo $plz ?> ]:</td>
+		<td class="wpsg_value wpsg_editable" id="va_<?php echo $va['id'] ?>_plz_<?php echo $index ?>"><?php echo wpsg_hspc($va['kosten_plz'][$plz_key]); ?></td>
+		<td class="wpsg_delcol">			
+			<script type="text/javascript">
+
+				jQuery(document).ready(function() {
+	
+					jQuery('#va_<?php echo $va['id']; ?>_plz_<?php echo $index ?>').editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
+						submitdata: { 
+				    		field: 'kosten_plz',
+				    		va_id: '<?php echo $va['id']; ?>',
+				    		key: '<?php echo $index; ?>'
+						}, 					
+						submit  : '<?php echo __('Speichern', 'wpsg'); ?>',
+						placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+						indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
+				    	tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
+				    	callback: function(data)
+				    	{
+				    		//location.reload();
+				    	}
+					} );
+	
+				} );
 				
-				if ($va['vz'] > 0) { 
-					
-					echo wpsg_hspc($this->view['arVZ'][$va['vz']]['name']); 
-        		
-				} else { 
-        	
-					echo __('Alle Versandzonen', 'wpsg'); 
-        	
-				} 
-				
-        ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_versandzone" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_versandzone" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_versandzone"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Versandzone', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#va_vz_<?php echo $va['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                type: 'select',
-				data   : <?php echo wpsg_prepare_for_inlineEdit($arVzNamen) ?>,
-	            submitdata: {
-                    field: 'vz',
-                    va_id: '<?php echo $va['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="va_kosten_<?php echo $va['id']; ?>"><?php echo wpsg_hspc($va['kosten']); ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_kostenschluessel" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_kostenschluessel" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_kostenschluessel"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('KostenschlÃŒssel', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#va_kosten_<?php echo $va['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                submitdata: {
-                    field: 'kosten',
-                    va_id: '<?php echo $va['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-		<?php if (wpsg_isSizedArray($this->view['arVZ'][$va['vz']]['arPLZ'])) { ?>
-		<?php $index = 1; foreach ((array)$this->view['arVZ'][$va['vz']]['arPLZ'] as $plz_key => $plz) { ?>
-	
-        	<?php echo wpsg_drawForm_TextStart(); ?>
-        	<span id="va_plz_<?php echo $va['id'].'_'.$index; ?>"><?php echo wpsg_hspc(wpsg_getStr($va['kosten_plz'][$plz_key])); ?></span>
-        	<?php echo wpsg_drawForm_TextEnd(__('KostenschlÃŒssel PLZ', 'wpsg').' ['.$plz.']:'); ?> <?php /*echo $plz*/ ?>
-        	<script type="text/javascript">/* <![CDATA[ */
-            	jQuery('#va_plz_<?php echo $va['id'].'_'.$index; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                	submitdata: {
-                    	field: 'kosten_plz',
-                    	va_id: '<?php echo $va['id']; ?>',
-                    	key: '<?php echo $index; ?>'
-                	}
-            	});
-        	/* ]]> */</script>
-
-		<?php $index++; } ?>
-		<?php } ?>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <span id="va_mwst_key_<?php echo $va['id']; ?>"><?php
-        	$tax_groups = wpsg_tax_groups();
-        	echo wpsg_hspc($tax_groups[$va['mwst_key']]);
-        ?></span>
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_mwst" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Steuersatz', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-            jQuery('#va_mwst_key_<?php echo $va['id']; ?>').wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1', {
-                type: 'select',
-				data: <?php echo wpsg_prepare_for_inlineEdit(wpsg_tax_groups()); ?>,
-	                submitdata: {
-                    field: 'mwst_key',
-                    va_id: '<?php echo $va['id']; ?>'
-                }
-            });
-        /* ]]> */</script>
-
-        <?php echo wpsg_drawForm_TextStart(); ?>
-		<input type="checkbox" value="1" <?php echo (($va['mwst_laender'] == '1')?'checked="checked"':''); ?> id="va_mwst_laender_<?php echo $va['id']; ?>" />
-		<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="wpsg_shippay_mwstland" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland"></a>
-        <?php echo wpsg_drawForm_TextEnd(__('Keine MwSt. wenn Land steuerfrei', 'wpsg')); ?>
-        <script type="text/javascript">/* <![CDATA[ */
-			jQuery('#va_mwst_laender_<?php echo $va['id']; ?>').bind('change', function() {
-
-				var value = 0;
-				if (jQuery(this).attr("checked") == "checked") value = 1;
-
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten&do=inlinedit&noheader=1',
-					data: {
-						field: 'mwst_laender',
-						va_id: '<?php echo $va['id']; ?>',
-						value: value
-					}	
-				} );
-			} );
-        /* ]]> */</script>
+			</script>
+		</td>		
+	</tr>
+	<?php $index++; } ?>
+	<?php } ?>	
+	<tr>
+		<td class="wpsg_label"><?php echo __('Steuersatz', 'wpsg'); ?>:</td>				
+		<td id="va_<?php echo $va['id']; ?>_mwst" class="wpsg_value wpsg_editable"><?php 
 		
-		<?php /* Paketverfolgung */ ?>
-		<?php if ($this->hasMod('wpsg_mod_packagetracking') == '1') { ?>
-			<?php echo wpsg_drawForm_TextStart(); ?>
-				<?php $this->callMods('wpsg_mod_versandarten_listrow', [&$va]);  ?>
-       	 	<?php echo wpsg_drawForm_TextEnd(__('Paketverfolgung', 'wpsg')); ?>
-       	<?php } ?>
-        
-	</div>
-	<?php if ($i == sizeof($this->view['data'])) { ?><hr /><?php } ?>
-
-<?php } ?> 
-<?php } ?> 
+			$tax_groups = wpsg_tax_groups();
+			echo wpsg_hspc($tax_groups[$va['mwst_key']]);
+			
+		?></td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst"></a>
+		</td>
+	</tr> 
+	<tr>
+		<td class="wpsg_label"><?php echo __('Keine MwSt. wenn Land steuerfrei', 'wpsg'); ?>:</td>
+		<td class="wpsg_value">
+			<input onchange="wpsg_saveVAMwSt(this, <?php echo $va['id']; ?>);" <?php echo (($va['mwst_laender'] == '1')?'checked="checked"':''); ?> type="checkbox" value="1" />
+		</td>
+		<td class="wpsg_delcol">
+			<a class="wpsg_form_help" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwstland"></a>
+		</td>
+	</tr>
+	<?php $this->callMods('wpsg_mod_versandarten_listrow', array(&$va)); ?>
+	<?php if ($i < sizeof($this->view['data'])) { ?>
+	<tr class="wpsg_spacer"><td colspan="3"><hr /></td></tr>
+	<?php } ?>
+	<?php } ?>
+</table>
+<?php } ?>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	jQuery(document).ready(function() {
+		 
+		jQuery('.wpsg_form_help').tipTip();
+		
+	} );
+		
+/* ]]> */</script>
Index: /views/mods/mod_versandarten/settings_edit.phtml
===================================================================
--- /views/mods/mod_versandarten/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_versandarten/settings_edit.phtml	(revision 5261)
@@ -90,4 +90,5 @@
 			<div class="fulltab">
 				<?php echo __('Versandarten', 'wpsg'); ?>
+				<a title="<?php echo __('Neue Versandart anlegen', 'wpsg'); ?>" href="" class="wpsg_icon wpsg_icon_right wpsg_icon_add" onclick="return wpsg_addVA();"></a>
 			</div>
 		</div>
@@ -96,6 +97,4 @@
 		<?php echo $this->mod->va_list(); ?>
 	</div>
-
-	<a href="#" onclick="return wpsg_addVA();"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>Neue Versandart anlegen</a>
 			
 </div>
Index: /views/mods/mod_videodownload/cronmail.phtml
===================================================================
--- /views/mods/mod_videodownload/cronmail.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/cronmail.phtml	(revision 5261)
@@ -0,0 +1,18 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Mail, die bei erfolgreicher Individualisierung an den Admin gesendet wird
+	 */
+
+?>
+<?php echo __('Hallo Administrator,', 'wpsg'); ?> 
+ 
+<?php echo __('Es wurden Videos von folgenden Bestellungen individualisiert:', 'wpsg'); ?> 
+ 
+<?php foreach ($this->view['arOrder'] as $k => $o) { ?>
+<?php echo wpsg_translate(__('Bestellung ##1#: #2# Dateien', 'wpsg'), $o[1]['onr'], $o[0]); ?> 
+<?php if ($this->get_option('wpsg_mod_videodownload_autosend') != '1') { ?>
+<?php echo __('Links versenden: ', 'wpsg'); ?><?php echo get_site_url(); ?>?wpsg_action=wpsg_mod_videodownload_send&hash=<?php echo $o[2]; ?>&order=<?php echo $k; ?> 
+<?php } ?>
+ 
+<?php } ?>
Index: /views/mods/mod_videodownload/cronmail_html.phtml
===================================================================
--- /views/mods/mod_videodownload/cronmail_html.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/cronmail_html.phtml	(revision 5261)
@@ -0,0 +1,21 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Mail, die bei erfolgreicher Individualisierung an den Admin gesendet wird (HTML)
+	 */
+
+?>
+<p><?php echo __('Hallo Administrator,', 'wpsg'); ?></p> 
+ 
+<p><?php echo __('Es wurden Videos von folgenden Bestellungen individualisiert:', 'wpsg'); ?></p> 
+ 
+<ul>
+<?php foreach ($this->view['arOrder'] as $k => $o) { ?>
+	<li>
+		<?php echo wpsg_translate(__('Bestellung ##1#: #2# Dateien', 'wpsg'), $o[1]['onr'], $o[0]); ?>&nbsp; 
+		<?php if ($this->get_option('wpsg_mod_videodownload_autosend') != '1') { ?>
+		<a href="<?php echo get_site_url(); ?>?wpsg_action=wpsg_mod_videodownload_send&hash=<?php echo $o[2]; ?>&order=<?php echo $k; ?>"><?php echo __('Links versenden', 'wpsg'); ?></a> 
+		<?php } ?>
+	</li>
+<?php } ?>
+</ul>
Index: /views/mods/mod_videodownload/filelist.phtml
===================================================================
--- /views/mods/mod_videodownload/filelist.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/filelist.phtml	(revision 5261)
@@ -0,0 +1,20 @@
+<?php
+	
+	/**
+	 * Template fÃŒr die Liste der Dateien im Backend
+	 */
+
+?>
+<?php if (!wpsg_isSizedArray($this->view['files'])) { ?>
+<p><?php echo __('Bisher keine Videos hochgeladen.', 'wpsg'); ?></p>
+<?php } else { ?>
+	<?php foreach ($this->view['files'] as $v) { ?>
+	<div class="wpsg_mod_videodownload_file">
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&noheader=1&cmd=download_file&file=<?php echo rawurlencode($v); ?>&edit_id=<?php echo $_REQUEST['edit_id']; ?>" title="<?php echo wpsg_hspc($v); ?>"><?php echo wpsg_hspc(substr($v, 0, 25)); ?></a>
+		(<?php echo wpsg_formatSize($this->callMod('wpsg_mod_videodownload', 'getVideoPath', array($_REQUEST['edit_id'])).'/'.$v); ?>)
+		<div class="wpsg_mod_videodownload_admin_delete" title="<?php echo __('Video lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_videodownload_removeVideo('<?php echo rawurlencode($v); ?>');"></div>
+	</div> 
+	<div class="wpsg_clear"></div>
+	<?php } ?>
+	<br />
+<?php } ?>
Index: /views/mods/mod_videodownload/order_view_sidebar.phtml
===================================================================
--- /views/mods/mod_videodownload/order_view_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/order_view_sidebar.phtml	(revision 5261)
@@ -0,0 +1,110 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des Videodownload Moduls in die Bestellverwaltung
+	 * Sollte nicht verÃ€ndert werden
+	 */
+
+?>
+<script type="text/javascript">
+/* <![CDATA[ */
+ 
+	function wpsg_mod_videodownload_schedule(file)
+	{
+
+		jQuery('#wpsg_mod_videodownload_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( { 
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['order_id']; ?>&noheader=1&cmd=schedule_file&file=' + file,
+			success: function(data) {
+				jQuery('#wpsg_mod_videodownload_target').html(data);
+			}
+		} );
+		
+		return false;
+		
+	} // function wpsg_mod_videodownload_schedule(file)
+
+	function wpsg_mod_videodownload_reindiv()
+	{
+
+		jQuery('#wpsg_mod_videodownload_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( { 
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['order_id']; ?>&noheader=1&cmd=reindiv',
+			success: function(data) {
+
+				jQuery('#wpsg_mod_videodownload_target').html(data); 
+				
+			}
+		} );
+		
+		return false;
+		
+	} // function wpsg_mod_videodownload_reindiv()
+
+	function wpsg_mod_videodownload_reset()
+	{
+
+		jQuery('#wpsg_mod_videodownload_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( { 
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['order_id']; ?>&noheader=1&cmd=reset',
+			success: function(data) {
+
+				jQuery('#wpsg_mod_videodownload_target').html(data); 
+				
+			}
+		} );
+		
+		return false;
+		
+	} // function wpsg_mod_videodownload_reset()
+	
+	function wpsg_mod_videodownload_send()
+	{
+
+		jQuery('#wpsg_mod_videodownload_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( { 
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['order_id']; ?>&noheader=1&cmd=send_files',
+			success: function(data) {
+
+				jQuery('#wpsg_mod_videodownload_target').html(data);
+				wpsg_reloadOrderLog();
+				
+			}
+		} );
+		
+		return false;
+
+	} // function wpsg_mod_videodownload_send()		
+	
+	function wpsg_mod_videodownload_cangelschedule(file)
+	{
+
+		jQuery('#wpsg_mod_videodownload_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( { 
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['order_id']; ?>&noheader=1&cmd=cancelschedule_file&file=' + file,
+			success: function(data) {
+				jQuery('#wpsg_mod_videodownload_target').html(data);
+			}
+		} );
+		
+		return false;
+		
+	} // function wpsg_mod_videodownload_cangelschedule(file)
+	
+/* ]]> */
+</script>
+
+<div class="postbox" id="wpsg_videodownloadbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Videoprodukte', 'wpsg'); ?></span>
+	</h3> 
+	<div class="inside" id="wpsg_mod_videodownload_target">
+		<?php echo $this->callMod('wpsg_mod_videodownload', 'order_view_sidebar_renderList', array($this->view['order_id'])); ?>		 
+	</div>
+</div>
Index: /views/mods/mod_videodownload/order_view_sidebar_renderlist.phtml
===================================================================
--- /views/mods/mod_videodownload/order_view_sidebar_renderlist.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/order_view_sidebar_renderlist.phtml	(revision 5261)
@@ -0,0 +1,59 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Liste der Produkte innerhalb der Bestellansicht, wird per Ajax neu geladen
+	 */
+
+?>
+<?php if (wpsg_isSizedArray($this->view['messages'])) { ?>
+<?php foreach ($this->view['messages'] as $m) { ?>
+<div class="updated"><p><?php echo wpsg_hspc($m); ?></p></div>
+<?php } ?>
+<?php } ?>
+<?php if (wpsg_isSizedArray($this->view['errors'])) { ?>
+<?php foreach ($this->view['errors'] as $e) { ?>
+<div class="error"><p><?php echo wpsg_hspc($e); ?></p></div>
+<?php } ?>
+<?php } ?>
+<table class="wpsg_mod_videodownload_order_view_filelist">
+	<tr>
+		<th class="col_file"><?php echo __('Datei', 'wpsg'); ?></th>
+		<th class="col_status"><?php echo __('Status', 'wpsg'); ?></th>
+		<th class="col_counter">#</th>
+		<th class="col_action"></th>				
+	</tr>
+	<?php foreach ($this->view['arFiles'] as $f) { ?>
+	<tr class="<?php echo (($f[1] !== false && $f[1]['raid'] === true)?'row_raid':''); ?>">
+		<td class="col_file">
+			<?php if ($f[1] !== false && strtotime($f[1]['done']) > 0) { ?>
+			<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_videodownload&cmd=download_indivfile&edit_id=<?php echo $f[1]['o_id']; ?>&file=<?php echo rawurlencode($f[1]['out_file']); ?>&noheader=1">
+			<?php } ?>
+			<?php echo wpsg_hspc(substr($this->callMod('wpsg_mod_videodownload', 'getNewName', array($f[0], $_REQUEST['edit_id'])), 0, 25)); ?>
+			<?php if ($f[1] !== false && strtotime($f[1]['done']) > 0) { ?>
+			</a>
+			<?php } ?>
+		</td>
+		<td class="col_status">
+			<?php if ($f[1] === false) { ?>
+			<?php echo __('Noch nicht geplant.', 'wpsg'); ?>
+			<?php } else if (strtotime($f[1]['scheduled']) > 0 && strtotime($f[1]['done']) <= 0) { ?>
+			<?php echo wpsg_translate(__('Geplant am #1#', 'wpsg'), wpsg_fromDate($f[1]['scheduled'])); ?>
+			<?php } else if (strtotime($f[1]['done']) > 0) { ?>
+			<?php echo wpsg_translate(__('DurchgefÃŒhrt am #1#', 'wpsg'), wpsg_fromDate($f[1]['done'])); ?>			
+			<?php } ?>
+		</td>
+		<td class="col_counter"><?php echo (($f[1] !== false)?$f[1]['counter']:'0'); ?></td>
+		<td class="col_action">
+			<?php if ($f[1] === false) { ?>
+			<a href="#" onclick="return wpsg_mod_videodownload_schedule('<?php echo rawurldecode($f[0]); ?>');"><?php echo __('Planen', 'wpsg'); ?></a>
+			<?php } else if (strtotime($f[1]['scheduled']) > 0 && strtotime($f[1]['done']) <= 0) { ?>
+			<a href="#" onclick="return wpsg_mod_videodownload_cangelschedule('<?php echo rawurldecode($f[0]); ?>');"><?php echo __('Abbrechen', 'wpsg'); ?></a>
+			<?php } ?>
+		</td>
+	</tr>
+	<?php } ?>
+</table>
+<br />
+<input type="button" onclick="return wpsg_mod_videodownload_send();" value="<?php echo __('Fertige Downloads an Kunden senden', 'wpsg'); ?>" /><br />
+<input type="button" onclick="return wpsg_mod_videodownload_reindiv();" value="<?php echo __('Alle Dokumente neu planen', 'wpsg'); ?>" />
+<input type="button" onclick="return wpsg_mod_videodownload_reset();" value="<?php echo __('ZÃ€hler zurÃŒcksetzen', 'wpsg'); ?>" />
Index: /views/mods/mod_videodownload/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_videodownload/produkt_edit_sidebar.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/produkt_edit_sidebar.phtml	(revision 5261)
@@ -0,0 +1,96 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration des Uploadformulars im rechten Bereich
+	 * Sollte nicht verÃ€ndert werden
+	 */
+
+?>
+<script type="text/javascript">
+/* <![CDATA[ */
+
+    function wpsg_videodownload_removeVideo(file)
+	{
+
+    	if (!confirm('<?php echo __('Sind sie sich sicher, dass sie die Datei lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
+
+    	jQuery('#wpsg_mod_videodownload_files').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( {
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1&cmd=delete_file&file=' + file,
+			success: function(response) {
+
+				if (response == '1')
+				{
+					jQuery("#wpsg_mod_videodownload_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&cmd=videofiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+				}
+				else
+				{
+					
+					alert(response);
+					jQuery("#wpsg_mod_videodownload_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&cmd=videofiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+					
+				}
+				
+			}			
+		} );
+    	
+		return false;
+    	
+	} // function wpsg_videodownload_removeVideo($video)
+             
+	jQuery(document).ready(function() {	
+ 
+		new AjaxUpload(
+			"wpsg_mod_videodownload_upload", {
+				name: "videofiles",
+				action: "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&edit_id=<?php echo $this->view['data']['id'] ?>&noheader=1&cmd=upload_file",
+				onSubmit: function(file, extension) {
+	
+					jQuery('#wpsg_mod_videodownload_files').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+					
+				},
+				onComplete: function(file, response) {
+
+					if (response == '1')
+					{
+						jQuery("#wpsg_mod_videodownload_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&cmd=videofiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+					}
+					else
+					{
+						
+						alert(response);
+						jQuery("#wpsg_mod_videodownload_files").load("<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_videodownload&cmd=videofiles_list&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1");
+						
+					}
+				}										
+			}
+		);					   
+	}); 
+	
+/* ]]> */
+</script>
+
+<div id="wpsg_videodownload" class="postbox">
+	<h3 class="wpsg_handlediv">
+		<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+		<span><?php echo __('Videoprodukt', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<div id="wpsg_mod_videodownload_files"><?php echo $this->view['filesList']; ?></div>	
+		<input value="<?php echo __("Upload", "wpsg"); ?>" type="text" style="text-align:center;" size="10" id="wpsg_mod_videodownload_upload" />
+		<div class="wpsg_clear"></div><br />
+		<div class="wpsg_form_field">
+			<div class="wpsg_form_left" style="width:75px;">
+				<label for="feinheit"><?php echo __('FTP Pfad', 'wpsg'); ?>:</label>
+			</div>
+			<div class="wpsg_form_right">
+				<p>
+					<a href="#" onclick="alert('<?php echo addslashes($this->callMod('wpsg_mod_videodownload', 'getVideoPath', array($this->view['data']['id'], true))); ?>'); return false;"><?php echo __('Anzeigen', 'wpsg'); ?></a>
+				</p>
+			</div>
+			<div class="wpsg_clear"></div>
+		</div>		
+	</div>
+	<div class="clear"></div>
+</div>
Index: /views/mods/mod_videodownload/settings_edit.phtml
===================================================================
--- /views/mods/mod_videodownload/settings_edit.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/settings_edit.phtml	(revision 5261)
@@ -0,0 +1,188 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Einstellungsseite des Videodownloadproduktmoduls
+	 */
+
+?>
+<br />
+<div class="wpsg_admin_box" id="wpsg_tab">	
+	<div class="head">
+		<div class="title">
+			<div class="tab" id="tab1"><?php echo __('Einstellungen', 'wpsg'); ?></div>
+			<div class="tab" id="tab2"><?php echo __('Textfelder', 'wpsg'); ?></div>
+			<div class="tab tabright tabright-last" id="tab3"><?php echo __('Info', 'wpsg'); ?></div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+	<div class="content">
+		
+		<div id="tabcontent1" class="tabcontent">			
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_command', __('Programmaufruf', 'wpsg'), $this->get_option('wpsg_mod_videodownload_command'), array('help' => 'mod_videodownload_einstellungen_programmaufruf')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_infocommand', __('Programmaufruf (ffmpeg -i)', 'wpsg'), $this->get_option('wpsg_mod_videodownload_infocommand'), array('help' => 'mod_videodownload_einstellungen_programminfoaufruf')); ?>		
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_filename', __('Personalisierter Dateiname', 'wpsg'), $this->get_option('wpsg_mod_videodownload_filename'), array('help' => 'mod_videodownload_einstellungen_filename')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_videodownload_indiv_mode', __('Individualisierung planen', 'wpsg'), array(0 => __('Manuell', 'wpsg'), 1 => __('Nach Zahlung', 'wpsg'), 2 => __('Nach Bestellung', 'wpsg')), $this->get_option('wpsg_mod_videodownload_indiv_mode'), array('help' => 'mod_videodownload_einstellungen_individualisierungsmodus')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_videodownload_autosend', __('Videos nach Individualisierung sofort senden', 'wpsg'), $this->get_option('wpsg_mod_videodownload_autosend'), array('help' => 'mod_videodownload_einstellungen_autosend')); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_videodownload_accepted', __('GÃŒltigkeit von Links', 'wpsg'), array(0 => __('Unbegrenzt', 'wpsg'), 1 => __('Nach Downloads', 'wpsg'), 2 => __('Nach Tagen', 'wpsg')), $this->get_option('wpsg_mod_videodownload_accepted'), array('help' => 'mod_videodownload_einstellungen_accepted')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_days', __('GÃŒltigkeit in Tagen', 'wpsg'), $this->get_option('wpsg_mod_videodownload_days')); ?> 
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_downloads', __('Anzahl an mÃ¶glichen Downloads', 'wpsg'), $this->get_option('wpsg_mod_videodownload_downloads')); ?>
+			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_videodownload_cleanraiddownloads', __('Abgelaufene Downloads bereinigen', 'wpsg'), $this->get_option('wpsg_mod_videodownload_cleanraiddownloads')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_cleanolddownloads', __('Downloads nach X Tagen lÃ¶schen', 'wpsg'), $this->get_option('wpsg_mod_videodownload_cleanolddownloads')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_videopath', __('Pfad fÃŒr die Videos der Produkte', 'wpsg'), $this->get_option('wpsg_mod_videodownload_videopath'), array('hint' => __('Standard: uploads/wpsg_videoprodukte/', 'wpsg'))); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_videoindivpath', __('Pfad fÃŒr die Individualisierten Videos', 'wpsg'), $this->get_option('wpsg_mod_videodownload_videoindivpath'), array('hint' => __('Standard: uploads/wpsg_videoprodukte_order/', 'wpsg'))); ?>
+			<?php echo wpsg_drawForm_Select('wpsg_mod_videodownload_format', __('Auslieferungsformat', 'wpsg'), array(0 => __('Direkt', 'wpsg'), 1 => __('Gezippt (intern)', 'wpsg'), 2 => __('Gezippt (extern)', 'wpsg')), $this->get_option('wpsg_mod_videodownload_format')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_mod_videodownload_fontpath', __('Pfad fÃŒr die weitere Schriftarten', 'wpsg'), $this->get_option('wpsg_mod_videodownload_fontpath'), array('hint' => __('Standard: user_views/mods/mod_videodownload/fonts/', 'wpsg'))); ?>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Mail fÃŒr Individualisierungsbericht', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#videodownloadcronmail'); ?></p>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>			
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Mail fÃŒr Downloads an Kunden', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#videodownloadfiles'); ?></p>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Letzte AusfÃŒhrung des Crons', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo (($this->get_option('wpsg_lastCron') > 0)?wpsg_formatTimestamp($this->get_option('wpsg_lastCron')):__('Noch nicht ausgefÃŒhrt', 'wpsg')); ?></p>
+					<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_videodownload_einstellungen_cron" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_videodownload_einstellungen_cron"></a>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+		</div>
+		
+		<div id="tabcontent2" class="tabcontent">
+		
+			<table class="wpsg_mod_videodownload_fieldtable">
+				<tr>
+					<th class="col_bezeichnung"></th>
+					<th class="col_font"><?php echo __('Schriftart', 'wpsg'); ?></th>
+					<th class="col_x"><?php echo __('X', 'wpsg'); ?></th>
+					<th class="col_y"><?php echo __('Y', 'wpsg'); ?></th>
+					<th class="col_align"><?php echo __('Zentriert', 'wpsg'); ?></th>
+					<th class="col_color"><?php echo __('Farbe', 'wpsg'); ?></th>
+					<th class="col_alpha"><?php echo __('Opaque', 'wpsg'); ?></th>
+					<th class="col_angle"><?php echo __('Winkel', 'wpsg'); ?></th>
+					<th class="col_groesse"><?php echo __('GrÃ¶Ãe', 'wpsg'); ?></th>
+					<th class="col_action"></th>
+				</tr>
+				<?php for ($i = 0; $i < 5; $i ++) { ?>				
+				<tr>
+					<td><?php echo '#'.($i + 1); ?></td>
+					<td class="col_font">
+						<?php if (!wpsg_isSizedArray($this->view['arFonts'])) { ?>
+						<span class="wpsg_error"><?php echo __('Keine Fonts!', 'wpsg'); ?></span>
+						<?php } else { ?>
+						<select name="text[<?php echo $i; ?>][font]">
+							<?php foreach ($this->view['arFonts'] as $font) { ?>
+							<option value="<?php echo rawurlencode($font); ?>" <?php echo ((rawurlencode($font) === $this->view['arTexte'][$i]['font'])?'selected="selected"':''); ?>><?php echo wpsg_hspc($font); ?></option>
+							<?php } ?>
+						</select>
+						<?php } ?>
+					</td>					
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][x]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['x']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][y]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['y']); ?>" />
+					</td>
+					<td class="col_align">
+						<input type="hidden" name="text[<?php echo $i; ?>][align]" value="0" />
+						<input type="checkbox" name="text[<?php echo $i; ?>][align]" value="1" <?php echo (($this->view['arTexte'][$i]['align'] == '1')?'checked="checked"':''); ?> />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][color]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['color']); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][alpha]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['alpha']); ?>" />
+					</td>					
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][angle]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['angle']); ?>" />
+					</td>
+					<td>
+						<select name="text[<?php echo $i; ?>][fontsize]" style="width:100%;">
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "8")?'selected="selected"':''); ?> value="8">8</option>				
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "9")?'selected="selected"':''); ?> value="9">9</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "10")?'selected="selected"':''); ?> value="10">10</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "11")?'selected="selected"':''); ?> value="11">11</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "12")?'selected="selected"':''); ?> value="12">12</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "13")?'selected="selected"':''); ?> value="13">13</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "14")?'selected="selected"':''); ?> value="14">14</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "16")?'selected="selected"':''); ?> value="16">16</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "18")?'selected="selected"':''); ?> value="18">18</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "20")?'selected="selected"':''); ?> value="20">20</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "22")?'selected="selected"':''); ?> value="22">22</option>
+							<option <?php echo (($this->view['arTexte'][$i]['fontsize'] == "24")?'selected="selected"':''); ?> value="24">24</option>
+						</select>
+					</td>
+					<td>			
+						<label><input type="checkbox" value="1" name="text[<?php echo $i; ?>][aktiv]" <?php echo (($this->view['arTexte'][$i]['aktiv'] == 1)?'checked="checked"':''); ?> />&nbsp;<?php echo __("Aktiv", "wpsg"); ?></label>
+						<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_videodownload_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_videodownload_fieldconfig"></a>
+					</td>
+				</tr>
+				<tr>
+					<td></td>
+					<td class="col_freitext_label"><?php echo __('Freitext', 'wpsg'); ?>:</td>
+					<td colspan="8" class="col_freitext">
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][text]" value="<?php echo wpsg_hspc($this->view['arTexte'][$i]['text']); ?>" />
+					</td>
+				</tr>
+				<?php } ?>
+			</table>
+			
+		</div>
+		
+		<div id="tabcontent3" class="tabcontent">
+		
+			<p><?php echo __('Mit dem Videodownload Modul ist es mÃ¶glich Videos zu verkaufen die pro Bestellung individuell angepasst werden.', 'wpsg'); ?>
+		
+		</div>
+		
+	</div>
+</div>
+
+<script type="text/javascript">
+
+	function wpsg_mod_videodownload_switchAccepted()
+	{
+
+		if (jQuery('#wpsg_mod_videodownload_accepted').val() == '1')
+			jQuery('#wpsg_mod_videodownload_downloads').parent().parent().show();
+		else
+			jQuery('#wpsg_mod_videodownload_downloads').parent().parent().hide();
+		
+		if (jQuery('#wpsg_mod_videodownload_accepted').val() == '2')
+			jQuery('#wpsg_mod_videodownload_days').parent().parent().show();
+		else
+			jQuery('#wpsg_mod_videodownload_days').parent().parent().hide();
+		
+	} // function wpsg_mod_videodownload_switchAccepted()
+
+	jQuery(document).ready(function() {
+
+		jQuery('.wpsg_form_help').tipTip();
+
+		jQuery('#wpsg_mod_videodownload_accepted').bind('change', function() { wpsg_mod_videodownload_switchAccepted(); } );
+
+		wpsg_mod_videodownload_switchAccepted();
+		
+		jQuery('#wpsg_tab').wpsg_tab( { 
+			'cookiename': 'wpsg_videodownload_tab',
+			'tab2': function() {
+				jQuery('.tablink').show();
+			}
+		} );
+	} );
+
+</script>
Index: /views/mods/mod_videodownload/videodownloadmail.phtml
===================================================================
--- /views/mods/mod_videodownload/videodownloadmail.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/videodownloadmail.phtml	(revision 5261)
@@ -0,0 +1,18 @@
+<?php
+
+	/**
+	 * Mail, die die Videodownloads an den Kunden sendet
+	 */
+
+?>
+<?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?> 
+ 
+<?php echo __('hiermit erhalt Sie die Downloadlinks fÃŒr Ihre gekauften Videos:', 'wpsg'); ?> 
+ 
+<?php foreach ($this->view['arVideos'] as $v) { ?>
+<?php echo $v['out_file']; ?>: <?php echo site_url(); ?>?wpsg_action=wpsg_mod_videodownload_download&hash=<?php echo $v['hash']; ?>&indi=<?php echo $v['id']; ?>  
+<?php } ?>
+ 
+<?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?>
+ 
+<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
Index: /views/mods/mod_videodownload/videodownloadmail_html.phtml
===================================================================
--- /views/mods/mod_videodownload/videodownloadmail_html.phtml	(revision 5261)
+++ /views/mods/mod_videodownload/videodownloadmail_html.phtml	(revision 5261)
@@ -0,0 +1,20 @@
+<?php
+
+	/**
+	 * Mail, die die Videodownloads an den Kunden sendet (HTML)
+	 */
+
+?>
+<p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?></p> 
+ 
+<p><?php echo __('hiermit erhalt Sie die Downloadlinks fÃŒr Ihre gekauften Videos:', 'wpsg'); ?></p> 
+
+<ul>
+	<?php foreach ($this->view['arVideos'] as $v) { ?>
+	<li><?php echo $v['out_file']; ?>:&nbsp;<a href="<?php echo site_url(); ?>?wpsg_action=wpsg_mod_videodownload_download&hash=<?php echo $v['hash']; ?>&indi=<?php echo $v['id']; ?>"><?php echo __('Download', 'wpsg'); ?></a></li>  
+	<?php } ?>
+</ul>
+ 
+<p><?php echo __("Mit freundlichen GrÃŒÃen", "wpsg"); ?></p>
+
+<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
Index: /views/mods/mod_voucherproduct/gutschein_mail.phtml
===================================================================
--- /views/mods/mod_voucherproduct/gutschein_mail.phtml	(revision 8528)
+++ /views/mods/mod_voucherproduct/gutschein_mail.phtml	(revision 5261)
@@ -5,14 +5,8 @@
 	 */
 
-    $arPflicht = $this->loadPflichtFeldDaten();
-    $arTitle = explode('|', $arPflicht['anrede_auswahl']);
-
-//wpsg_debug($this->view);
-
 ?>
-
-<?php echo wpsg_translate(__('Hallo #1# #2# #3#,', 'wpsg'), @$arTitle[$this->view['customer']['title']], $this->view['customer']['vname'], $this->view['customer']['name']); ?> 
+<?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['customer']['vname'], $this->view['customer']['name']); ?> 
  
-<?php echo __('hiermit erhalten Sie Ihren gekauften Gutschein.', 'wpsg'); ?> 
+<?php echo __('hiermit erhalt Sie ihre gekauften Gutscheine.', 'wpsg'); ?> 
  
 <?php foreach ($this->view['arGS'] as $gs) { ?>
Index: /views/mods/mod_voucherproduct/gutschein_mail_html.phtml
===================================================================
--- /views/mods/mod_voucherproduct/gutschein_mail_html.phtml	(revision 8528)
+++ /views/mods/mod_voucherproduct/gutschein_mail_html.phtml	(revision 5261)
@@ -5,10 +5,8 @@
 	 */
 
-	include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
-
 ?>
 <p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['customer']['vname'], $this->view['customer']['name']); ?></p> 
  
-<p><?php echo __('hiermit erhalten Sie Ihren gekauften Gutschein.', 'wpsg'); ?></p> 
+<p><?php echo __('hiermit erhalt Sie ihre gekauften Gutscheine.', 'wpsg'); ?></p> 
  
 <ul>
Index: /views/mods/mod_voucherproduct/order_view_sidebar_content.phtml
===================================================================
--- /views/mods/mod_voucherproduct/order_view_sidebar_content.phtml	(revision 8528)
+++ /views/mods/mod_voucherproduct/order_view_sidebar_content.phtml	(revision 5261)
@@ -6,4 +6,5 @@
 
 ?>
+<?php echo $this->writeBackendMessage(); ?>
 
 <?php if (wpsg_isSizedArray($this->view['wpsg_mod_voucherproduct']['data'])) { ?>
@@ -13,13 +14,11 @@
 		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Voucher&amp;wpsg_search=<?php echo $d['code']; ?>"><?php echo wpsg_hspc($d['code']); ?></a>
 		<?php if ($this->callMod('wpsg_mod_voucherproduct', 'hasFile', array($this->view['wpsg_mod_voucherproduct']['order_id'], $d['id']))) { ?>
-		&nbsp;/&nbsp;<a target="_blank" href="<?php echo $this->callMod('wpsg_mod_voucherproduct', 'getBackendDownloadURL', array($this->view['wpsg_mod_voucherproduct']['order_id'], $d['id'])); ?>">
-			<?php echo __('Download', 'wpsg'); ?>
-		</a>
-		<?php } ?>	
+		&nbsp;/&nbsp;<a target="_blank" href="<?php echo $this->callMod('wpsg_mod_voucherproduct', 'getBackendDownloadURL', array($this->view['wpsg_mod_voucherproduct']['order_id'], $d['id'])); ?>"><?php echo __('Download', 'wpsg'); ?></a>
+		<?php } ?>		
 		<?php if ($d['calc_typ'] == 'w') { ?>
 		&nbsp;(<?php echo wpsg_ff($d['value'], $this->get_option('wpsg_currency'))?>)
 		<?php } else if ($d['calc_typ'] == 'p') { ?>
 		&nbsp;(<?php echo wpsg_ff($d['value'], '%')?>)
-		<?php } ?>	 	
+		<?php } ?>		
 	</div>
 	<div class="wpsg_mod_voucherproduct_status"><?php echo wpsg_hspc($d['status']); ?></div>
Index: ews/mods/mod_voucherproduct/product_bottom.phtml
===================================================================
--- /views/mods/mod_voucherproduct/product_bottom.phtml	(revision 8528)
+++ 	(revision )
@@ -1,33 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * User: Daschmi (https://daschmi.de)
-	 * Date: 25.10.2019
-	 * Time: 09:35
-	 */ 
-    
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-	
-    $min = wpsg_tf($oProduct->__get('wpsg_mod_voucherproduct_flexprice_min'));
-    $max = wpsg_tf($oProduct->__get('wpsg_mod_voucherproduct_flexprice_max'));
-    
-    if ($min > 0 && $max > 0) $strInterval = __('#1# bis #2# #3#', 'wpsg');
-    else if ($min > 0) $strInterval = __('ab #1# #3#', 'wpsg');
-	else if ($max > 0) $strInterval = __('bis #2# #3#', 'wpsg');
-	else $strInterval = "";
-    
-	$strInterval = wpsg_translate($strInterval, wpsg_ff($min), wpsg_ff($max), $this->get_option('wpsg_currency'));
-	
-?>
-
-<div class="wpsg_product_buttonarea">
-	<label>
-		<strong><?php echo wpsg_translate(__('Gutscheinwert (#1#)', 'wpsg'), $strInterval); ?></strong><br />
-		<input class="wpsg_menge" type="text" name="wpsg_mod_voucherproduct_value" />	
-	</label>
-</div>
-
-<div class="wpsg_clear"></div><br />
Index: /views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml
===================================================================
--- /views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml	(revision 8528)
+++ /views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml	(revision 5261)
@@ -6,69 +6,13 @@
 
 ?>
-<div id="wpsg_voucherproduct" class="panel panel-default">	
-	<div class="panel-heading clearfix">
-		<h3 class="panel-title">
-			<?php echo __('Gutscheinprodukt', 'wpsg'); ?> 
-		</h3>
-	</div>
-	<div class="panel-body">
-		
-		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_voucherproduct_gs', __('Gutschein generieren', 'wpsg'), $this->view['data']['wpsg_mod_voucherproduct_gs']); ?>
-		
-		<div class="wpsg_mod_voucherproduct_gs wpsg_mod_voucherproduct_gs_1" style="display:none;">
-
-			<br />
-			
-			<?php echo wpsg_drawForm_Input('wpsg_mod_voucherproduct_gslaenge', __('LÃ€nge des Gutscheincodes', 'wpsg'), (($this->view['data']['wpsg_mod_voucherproduct_gslaenge'] > 0)?$this->view['data']['wpsg_mod_voucherproduct_gslaenge']:10)); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_mod_voucherproduct_available', __('GÃŒltigkeit (Tage)', 'wpsg'), $this->view['data']['wpsg_mod_voucherproduct_available']); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_voucherproduct_coupon', __('Gutschein als Wertgutschein generieren', 'wpsg'), $this->view['data']['wpsg_mod_voucherproduct_coupon']); ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_mod_voucherproduct_flexprice', __('Flexibler Preis', 'wpsg'), $this->view['data']['wpsg_mod_voucherproduct_flexprice']); ?>
-						
-			<div class="wpsg_mod_voucherproduct_flexprice_layer wpsg_mod_voucherproduct_flexprice_layer_1" style="display:none;">
-				
-				<?php echo wpsg_drawForm_Input('wpsg_mod_voucherproduct_flexprice_min', __('Minimaler Preis', 'wpsg'), ((wpsg_tf($this->view['data']['wpsg_mod_voucherproduct_flexprice_min']) > 0)?wpsg_ff($this->view['data']['wpsg_mod_voucherproduct_flexprice_min']):'')); ?>
-				<?php echo wpsg_drawForm_Input('wpsg_mod_voucherproduct_flexprice_max', __('Maximaler Preis', 'wpsg'), ((wpsg_tf($this->view['data']['wpsg_mod_voucherproduct_flexprice_max']) > 0)?wpsg_ff($this->view['data']['wpsg_mod_voucherproduct_flexprice_max']):'')); ?>
-				
-			</div>
-			
-			<script>
-				
-				jQuery('#wpsg_mod_voucherproduct_flexprice').on('change', function() {
-					
-					jQuery('.wpsg_mod_voucherproduct_flexprice_layer').hide();
-					jQuery('.wpsg_mod_voucherproduct_flexprice_layer_' + ((jQuery(this).prop('checked') === true)?'1':'0')).show();
-					
-				}).change();
-				
-			</script>
-			
-		</div>
-		
-		<script>
-			
-			jQuery(document).ready(function() {
-				
-				jQuery('#wpsg_mod_voucherproduct_gs').on('change', function() {
-					
-					if (jQuery(this).prop('checked')) {
-						
-						jQuery('.wpsg_mod_voucherproduct_gs_1').show();
-						
-					} else {
-
-						jQuery('.wpsg_mod_voucherproduct_gs_1').hide();
-						
-					}
-					
-				}).trigger('change');
-				
-			});
-			
-		</script>
-			
-		<br /><br />
-	
-		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_voucherproduct"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Gutscheinproduktes', 'wpsg'); ?></a>
-		
+<div id="wpsg_voucherproduct" class="postbox">	
+	<h3 class="wpsg_handlediv">
+		<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></span>
+		<span><?php echo __('Gutscheinprodukt', 'wpsg'); ?> </span>
+	</h3>
+	<div class="inside">
+		<?php echo wpsg_drawForm_Checkbox('wpsg_mod_voucherproduct_gs', __('Gutschein generieren', 'wpsg'), $this->view['data']['wpsg_mod_voucherproduct_gs']); ?>		
+		<?php echo wpsg_drawForm_Input('wpsg_mod_voucherproduct_gslaenge', __('LÃ€nge des Gutscheincodes', 'wpsg'), (($this->view['data']['wpsg_mod_voucherproduct_gslaenge'] > 0)?$this->view['data']['wpsg_mod_voucherproduct_gslaenge']:10)); ?>
+		<?php echo wpsg_drawForm_Input('wpsg_mod_voucherproduct_available', __('GÃŒltigkeit (Tage)', 'wpsg'), $this->view['data']['wpsg_mod_voucherproduct_available']); ?>
 	</div>
 </div>
Index: /views/mods/mod_voucherproduct/settings_edit.phtml
===================================================================
--- /views/mods/mod_voucherproduct/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_voucherproduct/settings_edit.phtml	(revision 5261)
@@ -9,68 +9,67 @@
 <p class="wpsg_error"><?php echo __('Bitte aktivieren Sie das Gutscheinmodul, damit dieses Modul korrekt funktioniert!', 'wpsg'); ?></p>
 <?php } ?>
-
-<div class="wpsg_admin_box" id="wpsg_tab">
-    <ul class="nav nav-tabs" role="tablist">
-        <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Einstellungen', 'wpsg'); ?></a></li>
-        <li role="presentation"><a href="#tab2" aria-controls="profile" role="tab" data-toggle="tab"><?php echo __('Textfelder', 'wpsg'); ?></a></li>
-    </ul>
-	
-	<div class="tab-content">
+<div class="wpsg_admin_box" id="wpsg_tab">	
+	<div class="head">
+		<div class="title">
+			<div class="tab" id="tab1"><?php echo __('Einstellungen', 'wpsg'); ?></div>
+			<div class="tab" id="tab2"><?php echo __('Textfelder', 'wpsg'); ?></div>
+			<div class="wpsg_clear"></div>
+		</div>
+	</div>
+	<div class="content">
 		
-		<div role="tabpanel" class="tab-pane active" id="tab1" >	
-
-            <?php echo wpsg_drawForm_TextStart(); ?>
-            	<div style="position:relative;">
-                <?php if ($this->view['bp'] === false) { ?>
-                <p><?php echo __('Es wurde bisher kein Briefpapier hochgeladen', 'wpsg'); ?></p>
-                <?php } else { ?>
-                <a href="<?php echo $this->view['bp']; ?>" target="_blank"><?php echo __('Derzeitiges Briefpapier', 'wpsg'); ?></a>
-                <?php } ?>
-                <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="mod_voucherproduct_paper" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_paper" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_paper"></a>
-                <input type="file" name="wpsg_mod_voucherproduct_bp">
-                <?php $strSuffix = ''; if ($this->view['bp'] !== false) { $strSuffix = '
-                    <label>
-						<input type="checkbox" name="wpsg_mod_voucherproduct_bp_del" value="1" />&nbsp;'.__('LÃ¶schen', 'wpsg').'
-					</label>';
-					echo __($strSuffix);
-                } ?>
-                </div>
-            <?php echo wpsg_drawForm_TextEnd(__('Briefpapier (PDF/JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_mod_voucherproduct_bp')); ?>
-
-			<?php echo wpsg_drawForm_Input('wpsg_voucherproduct_width', __('Breite des PDFs in mm', 'wpsg'), $this->get_option('wpsg_voucherproduct_width'), array ('rAlign' => true, 'help' => 'wpsg_voucherproduct_width')); ?>
-			<?php echo wpsg_drawForm_Input('wpsg_voucherproduct_height', __('HÃ¶he des PDFs in mm', 'wpsg'), $this->get_option('wpsg_voucherproduct_height'), array ('rAlign' => true, 'help' => 'wpsg_voucherproduct_height')); ?>
-
-            <?php echo wpsg_drawForm_TextStart(); ?>
-				<?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#gutscheinproductmail'); ?>
-				<a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign" data-wpsg-tip="mod_voucherproduct_mail" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_mail" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_mail"></a>
-				
-	        <?php echo wpsg_drawForm_TextEnd(__('Gutscheinmail an Kunden', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_mod_voucherproduct_bp')); ?>
-
+		<div id="tabcontent1" class="tabcontent">	
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Briefpapier (PDF/JPG)', 'wpsg'); ?>:</label><br />
+					<?php if (isset($this->view['bp']) && $this->view['bp'] !== false) { ?>
+					<label>
+						<input type="checkbox" name="wpsg_mod_voucherproduct_bp_del" value="1" />&nbsp;<?php echo __('LÃ¶schen', 'wpsg'); ?>
+					</label>
+					<?php } ?>
+				</div>
+				<div class="wpsg_form_right">
+					<?php if (!isset($this->view['bp']) || $this->view['bp'] === false) { ?>
+					<p><?php echo __('Es wurde bisher kein Briefpapier hochgeladen', 'wpsg'); ?></p>
+					<?php } else { ?>
+					<a href="<?php echo $this->view['bp']; ?>" target="_blank"><?php echo __('Derzeitiges Briefpapier', 'wpsg'); ?></a>
+					<?php } ?>				
+					<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_paper" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_paper"></a>
+					<input type="file" name="wpsg_mod_voucherproduct_bp">
+				</div>
+				<div class="wpsg_clear"></div>				
+			</div>
+			<?php echo wpsg_drawForm_Input('wpsg_voucherproduct_width', __('Breite des PDFs in mm', 'wpsg'), $this->get_option('wpsg_voucherproduct_width'), array ('help' => 'wpsg_voucherproduct_width')); ?>
+			<?php echo wpsg_drawForm_Input('wpsg_voucherproduct_height', __('HÃ¶he des PDFs in mm', 'wpsg'), $this->get_option('wpsg_voucherproduct_height'), array ('help' => 'wpsg_voucherproduct_height')); ?>
+			<div class="wpsg_form_field">
+				<div class="wpsg_form_left">
+					<label><?php echo __('Gutscheinmail an Kunden', 'wpsg'); ?>:</label>
+				</div>
+				<div class="wpsg_form_right">
+					<p><?php echo wpsg_translate(__('Kann <a href="#1#">hier</a> konfiguriert werden.', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=emailconf#gutscheinproductmail'); ?>
+					<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_mail" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_mail"></a></p>
+				</div>
+				<div class="wpsg_clear"></div>
+			</div>
+		
 		</div>
 		
-		<div role="tabpanel" class="tab-pane" id="tab2" >
-			<table class="table table-body-striped wpsg_mod_voucher_fieldtable">
-				<thead>
+		<div id="tabcontent2" class="tabcontent">
+			<table class="wpsg_mod_downloadplus_fieldtable">
 				<tr>
-					<th class="col_bezeichnung"></th>		
-					<th class="col_freitext_label"><?php echo __('Freitext', 'wpsg'); ?></th>			
+					<th class="col_bezeichnung"></th>					
 					<th class="col_x"><?php echo __('X', 'wpsg'); ?></th>
 					<th class="col_y"><?php echo __('Y', 'wpsg'); ?></th>
+					<th class="col_align"><?php echo __('Zentriert', 'wpsg'); ?></th>
+					<th class="col_bg"><?php echo __('Hintergrund', 'wpsg'); ?></th>
 					<th class="col_color"><?php echo __('Farbe', 'wpsg'); ?></th>
+					<th class="col_alpha"><?php echo __('Opaque', 'wpsg'); ?></th>
+					<th class="col_angle"><?php echo __('Winkel', 'wpsg'); ?></th>
 					<th class="col_groesse"><?php echo __('GrÃ¶Ãe', 'wpsg'); ?></th>
-					<th class="col_align"><?php echo __('Zentriert', 'wpsg'); ?></th>
-					<th class="col_bg"><?php echo __('Hintergrund', 'wpsg'); ?></th>					
-					<th class="col_alpha"><?php echo __('Deckkraft', 'wpsg'); ?></th>
-					<th class="col_angle"><?php echo __('Winkel', 'wpsg'); ?></th>
-					<th class="col_action"><?php echo __('Aktiv', 'wpsg'); ?></th>
+					<th class="col_action"></th>
 				</tr>
-				</thead>
-				<tbody>
 				<?php for ($i = 0; $i < 10; $i ++) { ?>
 				<tr>
-					<td><?php echo '#'.($i + 1); ?></td>			
-					<td>
-						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][text]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['text'])); ?>" />
-					</td>		
+					<td><?php echo '#'.($i + 1); ?></td>					
 					<td>
 						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][x]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['x'])); ?>" />
@@ -79,6 +78,20 @@
 						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][y]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['y'])); ?>" />
 					</td>
+					<td class="col_align">
+						<input type="hidden" name="text[<?php echo $i; ?>][align]" value="0" />
+						<input type="checkbox" name="text[<?php echo $i; ?>][align]" value="1" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$i]['align']))?'checked="checked"':''); ?> />
+					</td>
+					<td class="col_bg">
+						<input type="hidden" name="text[<?php echo $i; ?>][bg]" value="0" />
+						<input type="checkbox" name="text[<?php echo $i; ?>][bg]" value="1" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$i]['bg']))?'checked="checked"':''); ?> />
+					</td>
 					<td>
 						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][color]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['color'])); ?>" />
+					</td>
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][alpha]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['alpha'])); ?>" />
+					</td>					
+					<td>
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][angle]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['angle'])); ?>" />
 					</td>
 					<td>
@@ -107,27 +120,17 @@
 						</select>
 					</td>
-					<td class="col_align">
-						<input type="hidden" name="text[<?php echo $i; ?>][align]" value="0" />
-						<input type="checkbox" name="text[<?php echo $i; ?>][align]" value="1" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$i]['align']))?'checked="checked"':''); ?> />
+					<td>			
+						<label><input type="checkbox" value="1" name="text[<?php echo $i; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$i]['aktiv']))?'checked="checked"':''); ?> />&nbsp;<?php echo __("Aktiv", "wpsg"); ?></label>
+						<a style="float:right; position:relative;" class="wpsg_form_help" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_pdfdownload_fieldconfig"></a>
 					</td>
-					<td class="col_bg">
-						<input type="hidden" name="text[<?php echo $i; ?>][bg]" value="0" />
-						<input type="checkbox" name="text[<?php echo $i; ?>][bg]" value="1" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$i]['bg']))?'checked="checked"':''); ?> />
-					</td>
-
-					<td>
-						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][alpha]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['alpha'])); ?>" />
-					</td>					
-					<td>
-						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][angle]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['angle'])); ?>" />
-					</td>
-					
-					<td>			
-						<input type="checkbox" value="1" name="text[<?php echo $i; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['arTexte'][$i]['aktiv']))?'checked="checked"':''); ?> />
-						<a style="float:right; position:relative;" class="glyphicon glyphicon-question-sign" data-wpsg-tip="mod_voucherproduct_fieldconfig" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_fieldconfig" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_voucherproduct_fieldconfig"></a>
+				</tr>
+				<tr>
+					<td></td>
+					<td class="col_freitext_label"><?php echo __('Freitext', 'wpsg'); ?>:</td>
+					<td colspan="8" class="col_freitext">
+						<input type="text" style="width:100%;" name="text[<?php echo $i; ?>][text]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['arTexte'][$i]['text'])); ?>" />
 					</td>
 				</tr>
 				<?php } ?>
-				</tbody>
 			</table>
 			
Index: /views/mods/mod_voucherproduct/voucher_pdf.phtml
===================================================================
--- /views/mods/mod_voucherproduct/voucher_pdf.phtml	(revision 8528)
+++ /views/mods/mod_voucherproduct/voucher_pdf.phtml	(revision 5261)
@@ -4,7 +4,7 @@
 	 * Template fÃŒr den PDF Gutschein
 	 */
-	
-	require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
-	require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
+
+	require_once WPSG_PATH_LIB.'fpdf/fpdf.php';
+	require_once WPSG_PATH_LIB.'fpdf/fpdi.php';
 	require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
 
@@ -33,5 +33,6 @@
 			if ($t['alpha'] > 0) $pdf->setAlpha($t['alpha']);
 			
-			$pdf->wpsg_SetTextColor($t['color']);
+			list($r, $g, $b) = wpsg_getColor($t["color"]);
+			$pdf->SetTextColor($r, $g, $b);
 			 
 			$pdf->SetFont('Arial', '', $t['fontsize']);																	    
@@ -73,5 +74,5 @@
 			
 			$pdf->SetFont('Arial', '', $t['fontsize']);
-			$pdf->wpsg_SetTextColor($t["color"]);
+			$pdf->SetTextColor($t["color"]);
 																			    
 	    	$pdf->RotatedText(
@@ -87,17 +88,16 @@
 		
 	}
-
-    ob_end_clean();
 	
-	if ($this->view['preview'] !== true) {
+	if ($this->view['preview'] !== true)
+	{
 		
 		$pdf->Output($this->view['filename'], 'F');
 	
-	} else {
+	}
+	else 
+	{
 		
 		$pdf->Output($this->view['filename'], 'I');
-        
-		exit;
-        
+		die();
 	}
 		
Index: /views/mods/mod_weight/basket_row.phtml
===================================================================
--- /views/mods/mod_weight/basket_row.phtml	(revision 8528)
+++ /views/mods/mod_weight/basket_row.phtml	(revision 5261)
@@ -6,9 +6,8 @@
 	//wpsg_debug($this->view);
 ?>
-<div class="product_info">
-	<div class="title">
-		<span class="fa  fa-balance-scale"></span>
-		<?php echo __("Gewicht", "wpsg"); ?>:
-		<strong><?php echo wpsg_ff($this->view['weight'], $this->get_option('wpsg_mod_weight_unit')); ?></strong>
-	</div> 
-</div>
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">	
+	<td colspan="1"><?php echo __('Gewicht', 'wpsg'); ?>:</td>
+	<td class="wpsg_cell_weight_value" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'3':'2'); ?>">
+		<?php echo wpsg_ff($this->view['weight'], $this->get_option('wpsg_mod_weight_unit')); ?>	
+	</td>
+</tr>
Index: /views/mods/mod_weight/basket_row_end.phtml
===================================================================
--- /views/mods/mod_weight/basket_row_end.phtml	(revision 8528)
+++ /views/mods/mod_weight/basket_row_end.phtml	(revision 5261)
@@ -6,13 +6,10 @@
 
 ?>
-<div class="basket_sum_row">
-	<div class="title">
+<tr class="wpsg_row_weight wpsg_row_small">
+	<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_weight_label">
 		<?php echo __('Gesamtgewicht', 'wpsg'); ?>:
-	</div>
-	<div class="value">
+	</td>
+	<td class="wpsg_cell_weight_value">
 		<?php echo wpsg_ff($this->view['wpsg_mod_weight']['weight'], $this->get_option('wpsg_mod_weight_unit')); ?>
-	</div>
-    <div class="value">
-        <?php echo __('&nbsp;'); ?>
-    </div>
-</div>
+	</td>
+</tr>
Index: /views/mods/mod_weight/overview_row.phtml
===================================================================
--- /views/mods/mod_weight/overview_row.phtml	(revision 8528)
+++ /views/mods/mod_weight/overview_row.phtml	(revision 5261)
@@ -6,10 +6,8 @@
 
 ?>
-<div class="product_info">
-	<div 
-		<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-		<span class="fa  fa-balance-scale"></span>
-		<?php echo __("Gewicht", "wpsg"); ?>:
-		<strong><?php echo wpsg_ff($this->view['weight'], $this->get_option('wpsg_mod_weight_unit')); ?></strong>
-	</div> 
-</div>
+<tr class="wpsg_<?php echo (($this->view['i'] % 2 == 0)?'odd':'even'); ?>">
+	<td ><?php echo __('Gewicht', 'wpsg'); ?>:</td>
+	<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'2':'1'); ?>" class="wpsg_cell_weight_value">
+		<?php echo wpsg_ff($this->view['weight'], $this->get_option('wpsg_mod_weight_unit')); ?>
+	</td>
+</tr>
Index: /views/mods/mod_weight/overview_row_end.phtml
===================================================================
--- /views/mods/mod_weight/overview_row_end.phtml	(revision 8528)
+++ /views/mods/mod_weight/overview_row_end.phtml	(revision 5261)
@@ -6,13 +6,10 @@
 
 ?>
-<div class="overview_sum_row">
-	<div class="title">
+<tr class="wpsg_row_weight wpsg_row_small">
+	<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_weight_label">
 		<?php echo __('Gesamtgewicht', 'wpsg'); ?>:
-	</div>
-	<div class="value">
+	</td>
+	<td class="wpsg_cell_weight_value">
 		<?php echo wpsg_ff($this->view['wpsg_mod_weight']['weight'], $this->get_option('wpsg_mod_weight_unit')); ?>
-	</div>
-    <div class="value">
-        <?php echo __('&nbsp;'); ?>
-    </div>
-</div>
+	</td>
+</tr>
Index: ews/mods/mod_weight/product_addedit_content.phtml
===================================================================
--- /views/mods/mod_weight/product_addedit_content.phtml	(revision 8528)
+++ 	(revision )
@@ -1,17 +1,0 @@
-<?php
- 
-	/**
-	 * Template fÃŒr die Integration des Produktgewichts in die Produktverwaltung
-	 */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktgewicht', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_Input('wpsg_mod_weight[weight]', __('Produktgewicht', 'wpsg'), wpsg_ff($this->view['wpsg_mod_weight']['weight']), array('unit' => $this->get_option('wpsg_mod_weight_unit'))); ?>
-
-    <br />
-
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_weight"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration des Gewichtsmoduls', 'wpsg'); ?></a>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: /views/mods/mod_weight/settings_edit.phtml
===================================================================
--- /views/mods/mod_weight/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_weight/settings_edit.phtml	(revision 5261)
@@ -7,21 +7,14 @@
 ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_weight_unit', __('Gewichtseinheit', 'wpsg'), $this->get_option('wpsg_mod_weight_unit'), array('help' => 'wpsg_mod_weight_unit')); ?>
-<br />
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showProduct', __('Im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showProduct'), array('help' => 'wpsg_mod_weight_showProduct')); ?>
-<br />
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showBasket', __('Gesamtgewicht im Warenkorbs anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showBasket'), array('help' => 'wpsg_mod_weight_showBasket')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showAjaxDialog', __('In der Warenkorb-Lightbox anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showAjaxDialog'), array('help' => 'wpsg_mod_weight_showAjaxDialog')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showBasket', __('Im Warenkorb anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showBasket'), array('help' => 'wpsg_mod_weight_showBasket')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showBasketProduct', __('Im Warenkorb im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showBasketProduct'), array('help' => 'wpsg_mod_weight_showBasketProduct')); ?>
-<br />
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showOverview', __('Gesamtgewicht in Zusammenfassung anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showOverview'), array('help' => 'wpsg_mod_weight_showOverview')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showOverview', __('In Zusammenfassung anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showOverview'), array('help' => 'wpsg_mod_weight_showOverview')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showOverviewProduct', __('In Zusammenfassung im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showOverviewProduct'), array('help' => 'wpsg_mod_weight_showOverviewProduct')); ?>
-<br />
-<?php if ($this->hasMod('wpsg_mod_productindex')) { ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showProductindex', __('Auf ProduktÃŒbersichtsseiten (Frontend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showProductindex'), array('help' => 'wpsg_mod_weight_showProductindex')); ?>
+<?php if ($this->hasMod('wpsg_mod_productindex')) {Â ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showProductindex', __('Auf ProduktÃŒbersichtsseiten anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showProductindex'), array('help' => 'wpsg_mod_weight_showProductindex')); ?>
 <?php } ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showProductindexBackend', __('In ProduktÃŒbersicht (Backend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showProductindexBackend'), array('help' => 'wpsg_mod_weight_showProductindexBackend')); ?>
-<br />
 <?php if ($this->hasMod('wpsg_mod_request')) { ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showRequestPage', __('Gesamtgewicht der vollstÃ€ndigen Anfrage auf Anfrageseite anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showRequestPage'), array('help' => 'wpsg_mod_weight_showRequestPage')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showRequestPage', __('Auf Anfrageseite anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showRequestPage'), array('help' => 'wpsg_mod_weight_showRequestPage')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_weight_showRequestPageProduct', __('Auf Anfrageseite im Produkt anzeigen', 'wpsg'), $this->get_option('wpsg_mod_weight_showRequestPageProduct'), array('help' => 'wpsg_mod_weight_showRequestPageProduct')); ?>
 <?php } ?>
Index: /views/mods/mod_willcollect/settings_edit.phtml
===================================================================
--- /views/mods/mod_willcollect/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_willcollect/settings_edit.phtml	(revision 5261)
@@ -10,5 +10,4 @@
 <?php echo wpsg_drawForm_Textarea('wpsg_mod_willcollect_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_willcollect_hint'), array('help' => 'wpsg_mod_willcollect_hint')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_willcollect_paymentneed', __('Selbstabholung erfordert Barzahlung', 'wpsg'), $this->get_option('wpsg_mod_willcollect_paymentneed'), array('help' => 'wpsg_mod_willcollect_paymentneed')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_willcollect_dontMerge', __('Selbstabholung nicht kombinieren', 'wpsg'), $this->get_option('wpsg_mod_willcollect_dontMerge'), array('help' => 'wpsg_mod_willcollect_dontMerge')); ?>
 <br />
 <?php echo wpsg_drawForm_Input('wpsg_mod_willcollect_adress', __('Anschrift', 'wpsg'), $this->get_option('wpsg_mod_willcollect_adress'), array('help' => 'wpsg_mod_willcollect_adress')); ?>
Index: /views/mods/mod_wirecard/order_done.phtml
===================================================================
--- /views/mods/mod_wirecard/order_done.phtml	(revision 8528)
+++ /views/mods/mod_wirecard/order_done.phtml	(revision 5261)
@@ -2,5 +2,5 @@
 
 	/**
-	 * Template fÃŒr die Integration von wirecard in die Bestellabschlussseite
+	 * Template fÃŒr die Integration von wirecard in die BestellabschluÃseite
 	 */
 
Index: /views/mods/mod_wirecard/settings_edit.phtml
===================================================================
--- /views/mods/mod_wirecard/settings_edit.phtml	(revision 8528)
+++ /views/mods/mod_wirecard/settings_edit.phtml	(revision 5261)
@@ -7,5 +7,5 @@
 ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_wirecard_name', __('Bezeichnung', 'wpsg'), $this->get_option('wpsg_mod_wirecard_name'), array('help' => 'wpsg_shippay_name')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_wirecard_activ', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_wirecard_activ'), array('rAlign' => true, 'help' => 'wpsg_shippay_activ')); ?>
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_wirecard_activ', __('Aktiv', 'wpsg'), $this->get_option('wpsg_mod_wirecard_activ'), array('help' => 'wpsg_shippay_activ')); ?>
 <?php echo wpsg_drawForm_Textarea('wpsg_mod_wirecard_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_wirecard_hint'), array('help' => 'wpsg_shippay_hint')); ?>
 <?php echo wpsg_drawForm_Input('wpsg_mod_wirecard_logo', __('Logo URL', 'wpsg'), $this->get_option('wpsg_mod_wirecard_logo'), array('help' => 'wpsg_mod_wirecard_logo', 'hint' => __('AuflÃ¶sung: 95x65 Pixel (GIF/JPG/PNG)', 'wpsg'))); ?>
@@ -16,6 +16,19 @@
 <br />
 <?php echo wpsg_drawForm_Input('wpsg_mod_wirecard_gebuehr', __('GebÃŒhr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_wirecard_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_wirecard_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_wirecard_mwst'), array('help' => 'wpsg_shippay_mwst')); ?>
-
+<div class="wpsg_form_field">
+	<div class="wpsg_form_left">
+		<label for="wpsg_mod_wirecard_mwst"><?php echo __('Steuersatz', 'wpsg'); ?>:</label>
+	</div>
+	<div class="wpsg_form_right">
+		<select id="wpsg_mod_wirecard_mwst" name="wpsg_mod_wirecard_mwst">
+			<option value="0"><?php echo __('anteilig', 'wpsg'); ?></option>
+			<?php foreach ($this->view['mwst'] as $mwst) { ?>
+			<option value="<?php echo $mwst['id']; ?>" <?php echo (($mwst['id'] == $this->get_option('wpsg_mod_wirecard_mwst'))?'selected="selected"':''); ?>><?php echo wpsg_ff($mwst['value']).'%'; ?></option>
+			<?php } ?>
+		</select>
+		<a href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=wpsg_shippay_mwst" class="wpsg_form_help"></a>
+	</div>
+	<div class="wpsg_clear"></div>
+</div>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_wirecard_mwstland', __('Keine MwSt. wenn Land steuerfrei', 'wpsg'), $this->get_option('wpsg_mod_wirecard_mwstland'), array('help' => 'wpsg_shippay_mwstland')); ?>
 <?php echo wpsg_drawForm_Select('wpsg_mod_wirecard_currency', __('WÃ€hrung', 'wpsg'), array(
@@ -29,35 +42,16 @@
 <div class="wpsg_form_field">
 	<div class="wpsg_form_left">
-		
+		<label for="wpsg_mod_wirecard_paymenttype"><?php echo __('VerfÃŒgbare Zahlungsarten', 'wpsg'); ?>:</label>	
 	</div>
-	<div class="wpsg_form_right1"> 
-        <?php echo wpsg_drawForm_TextStart(); ?>
-        <?php echo wpsg_drawForm_TextEnd(__('VerfÃŒgbare Zahlungsarten', 'wpsg'), array('noP' => true)); ?>
+	<div class="wpsg_form_right"> 
 		<ul class="wpsg_mod_wirecard_paymenttypeselect">
 			<?php foreach ($this->view['paymentTypes'] as $pt_key => $pt) { ?>
 		 	<li>
-	 		<input type="hidden" name="wpsg_mod_wirecard_paymentorder[]" value="<?php echo wpsg_hspc($pt_key); ?>" />
-			<?php 
-			$arr1 = $this->get_option('wpsg_mod_wirecard_paymenttype');
-			$arr2 = (array)explode(',', $this->get_option('wpsg_mod_wirecard_paymenttype'));
-			$chk = ((in_array($pt_key, (array)explode(',', $this->get_option('wpsg_mod_wirecard_paymenttype'))))?'checked="checked"':'');
-			$chk = ((in_array($pt_key, (array)explode(',', $this->get_option('wpsg_mod_wirecard_paymenttype'))))?1:0);
-			// function wpsg_drawForm_Checkbox($field_name, $field_label, $field_checked, $conf = array())
-			echo wpsg_drawForm_Checkbox('wpsg_mod_wirecard_paymenttype[]', __($pt, 'wpsg'),
-					$chk, array('help1' => 'wpsg_shippay_mwstland',
-							    'value' => wpsg_hspc($pt_key),
-							    'noHidden' => true,
-								'fullWidth1' => true
-			));
-			?>
-		
+		 		<input type="hidden" name="wpsg_mod_wirecard_paymentorder[]" value="<?php echo wpsg_hspc($pt_key); ?>" />
+		 		<input type="checkbox" value="<?php echo wpsg_hspc($pt_key); ?>" <?php echo ((in_array($pt_key, (array)explode(',', $this->get_option('wpsg_mod_wirecard_paymenttype'))))?'checked="checked"':''); ?> name="wpsg_mod_wirecard_paymenttype[]" />&nbsp;<?php echo wpsg_hspc($pt); ?>
 		 	</li>
 			<?php } ?>
 		</ul> 
-		<?php echo wpsg_drawForm_TextStart(); ?>
 		<p class="wpsg_hinweis"><?php echo __('Reihenfolge kann mittels Drag&Drop verÃ€ndert werden.', 'wpsg'); ?></p>
-        <?php echo wpsg_drawForm_TextEnd('', array('noP' => true)); ?>
-		<br />
-		
 	</div>
 	<div class="wpsg_clear"></div>
@@ -73,15 +67,15 @@
 	'en' => __('Englisch', 'wpsg'),
 	'fr' => __('FranzÃ¶sisch', 'wpsg')	
-), $this->get_option('wpsg_mod_wirecard_language'), array('help' => 'wpsg_mod_wirecard_language')); ?>
+), $this->get_option('wpsg_mod_wirecard_language')); ?>
 
 <?php echo wpsg_drawForm_Input('wpsg_mod_wirecard_subject', __('Bestellbeschreibung', 'wpsg'), $this->get_option('wpsg_mod_wirecard_subject'), array('help' => 'wpsg_mod_wirecard_subject')); ?>
 
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_success', __('Erfolgsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_success'), array('help' => 'wpsg_mod_wirecard_success')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_cancel', __('Seite bei Abbruch', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_cancel'), array('help' => 'wpsg_mod_wirecard_cancel')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_error', __('Fehlerseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_error'), array('help' => 'wpsg_mod_wirecard_error')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_pending', __('Seite bei keinem Ergebnis', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_pending'), array('help' => 'wpsg_mod_wirecard_pending')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_wirecard_mode', __('Integrationsmodus', 'wpsg'), array('0' => __('IFrame', 'wpsg'), '1' => __('Popup', 'wpsg'), '2' => __('Weiterleitung', 'wpsg')), $this->get_option('wpsg_mod_wirecard_mode'), array('help' => 'wpsg_mod_wirecard_mode', 'help' => 'wpsg_mod_wirecard_mode')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_success', __('Erfolgsseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_success')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_cancel', __('Seite bei Abbruch', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_cancel')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_error', __('Fehlerseite', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_error')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_page_mod_wirecard_pending', __('Seite bei keinem Ergebnis', 'wpsg'), $this->view['pages'], $this->get_option('wpsg_page_mod_wirecard_pending')); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_wirecard_mode', __('Integrationsmodus', 'wpsg'), array('0' => __('IFrame', 'wpsg'), '1' => __('Popup', 'wpsg'), '2' => __('Weiterleitung', 'wpsg')), $this->get_option('wpsg_mod_wirecard_mode'), array('help' => 'wpsg_mod_wirecard_mode')); ?>
 <div id="wpsg_mod_wirecard_mode_2" style="display:none;">
-	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_wirecard_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_wirecard_autostart'), array('help' => 'wpsg_shippay_paystart', 'help' => 'wpsg_shippay_paystart')); ?>
+	<?php echo wpsg_drawForm_Checkbox('wpsg_mod_wirecard_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_wirecard_autostart'), array('help' => 'wpsg_shippay_paystart')); ?>
 </div>
 <br />
Index: ews/order/add.phtml
===================================================================
--- /views/order/add.phtml	(revision 8528)
+++ 	(revision )
@@ -1,9 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr das Anlegen einer Bestellung
-     */
-    
-    
-     
-     
Index: /views/order/index.phtml
===================================================================
--- /views/order/index.phtml	(revision 8528)
+++ /views/order/index.phtml	(revision 5261)
@@ -4,730 +4,561 @@
 	 * Template fÃŒr die Ãbersicht der Bestellungen
 	 */
-
-	$arPaymentKeySelect = [
-	    '' => __('Alle Zahlungsarten', 'wpsg')
-    ];
-	
-	foreach ($this->getPaymentArray() as $payment_key => $payment) {
-	    
-	    $arPaymentKeySelect[$payment_key] = $payment['name'];
-	    
-    }
+	//wpsg_debug($this->view);
+?>
+<div class="wrap wpsg_order_index">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Bestellverwaltung', 'wpsg'); ?>
+	</h2>
+
+	<script type="text/javascript">/* <![CDATA[ */
+
+		var wpsg_order = '<?php echo $this->view['filter']['order']; ?>';
+		var wpsg_ascdesc = '<?php echo $this->view['filter']['ascdesc']; ?>';
     
-?>
- 
-<div class="wpsg_order" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-                
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-                <a class="glyphicon glyphicon-menu-hamburger wpsg-bs-toggle-nav visible-xs-block" data-toggle="collapse" data-target="#wpsg-bs-headermenu" href="#"></a>
-                
+		function goPage(page)
+		{
+
+			if (page <= 0 || page == <?php echo $this->view['seite']; ?> || page > <?php echo $this->view['pages']; ?>) return;			
+			
+			jQuery('#seite').val(page);
+			jQuery('#filter_form').submit();
+
+			return false;
+			
+		} // function goPage(page)
+
+		function wpsg_setOrder(order)
+		{
+
+			if (order == wpsg_order)
+			{
+
+				// Nur Richtung Ã€ndern
+				if (wpsg_ascdesc == 'asc') jQuery('#wpsg_ascdesc').val('desc');
+				else jQuery('#wpsg_ascdesc').val('asc');
+				
+			}
+			else
+			{
+
+				jQuery('#wpsg_order').val(order);
+				jQuery('#wpsg_ascdesc').val('asc');
+				
+			}
+
+			jQuery('#seite').val(1);
+			jQuery('#filter_form').submit();
+			
+			return false;
+			
+		} // function wpsg_setOrder(order)
+
+		function goStatus(status_id)
+		{
+
+			jQuery.cookie("wpsg_order_status", status_id);
+
+			jQuery('#filter_status option').attr("selected", false);
+			jQuery('#filter_status option[value="' + status_id + '"]').attr("selected", true);
+			jQuery('#seite').val(1);
+
+			jQuery('#filter_form').submit();
+			
+			return false;
+			
+		} // function goStatus(status_id)
+
+		/**
+		 * Markiert/Demarkiert alle Rechnungen
+		 */
+		function wpsg_checkOrderCol(oElement)
+		{
+
+			if (jQuery(oElement).attr("checked") == "checked") 
+			{
+
+				jQuery('#wpsg_order_index_submit input').attr("checked", true);
+				
+			}
+			else
+			{
+
+				jQuery('#wpsg_order_index_submit input').attr("checked", false);
+				
+			}				
+			
+		} // function wpsg_checkOrderCol()			
+
+		jQuery(document).ready(function() {
+			
+			jQuery('.wpsg_handlediv').bind('click', function() {
+				jQuery(this).next().toggle();
+
+				var arClose = new Array();
+				jQuery('.wpsg_order_index .postbox .inside:hidden').each(function() {
+					arClose.push(jQuery(this).parent().attr("id"));
+				} );
+
+				jQuery.cookie('wpsg_order_index_closed', arClose.join(','));
+				
+			} );
+
+			if (jQuery.cookie('wpsg_order_index_closed') != null)
+			{
+
+				var arClose = jQuery.cookie('wpsg_order_index_closed').split(',');
+
+				for (index in arClose)
+				{
+					
+					if (arClose[index] != '') jQuery('#' + arClose[index] + ' .inside').hide();
+								
+				}
+				
+			}
+			
+		} );
+		
+	/* ]]> */</script>
+
+	<?php echo $this->writeBackendMessage(); ?>
+	
+	<form method="get" id="filter_form">
+	
+		<input type="hidden" name="" id="wpsg_order_index_noheader_filter" value="1" />	
+		<input type="hidden" name="page" value="wpsg-Order" /> 
+		
+		<?php if (isset($this->view['filter']['k_id']) && $this->view['filter']['k_id'] > 0) { ?>
+		<input type="hidden" name="filter[k_id]" id="filter_k_id" value="<?php echo $this->view['filter']['k_id']; ?>" />
+		<?php } ?>
+	
+		<?php if (isset($this->view['filter']['k_id']) && $this->view['filter']['k_id'] > 0) { ?>
+			<ul class="subsubsub wpsg_order_index_status">
+				<li><span class="text"><?php echo wpsg_translate(__('Bestellungen von Kunden #1#', 'wpsg'), $this->view['kunde']['vname'].' '.$this->view['kunde']['name']); ?></span></li>
+				<li><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order"><?php echo __('Alle anzeigen', 'wpsg'); ?></a></li>
+			</ul>
+			<div class="wpsg_clear"></div>
+		<?php } ?>
+			<ul class="subsubsub wpsg_order_index_status">
+				<?php $i = 0; foreach ($this->view['arStatus'] as $status_id => $count) { ?>
+				<?php if ($count > 0) { ?>
+				<li>
+					<?php if (in_array($status_id, explode(',', $this->view['filter']['status']))) { ?>
+					<span class="akt"><?php echo $this->arStatus[$status_id]; ?></span> <span class="count">(<?php echo $count; ?>) | </span>
+					<?php } else { ?>
+					<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goStatus(<?php echo $status_id; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order"><?php echo $this->arStatus[$status_id]; ?> <span class="count">(<?php echo $count; ?>)</span></a> |
+					<?php } ?>
+				</li>
+				<?php $i ++; } ?>
+				<?php } ?>
+				<li>
+					<?php if ($this->view['filter']['status'] == -1) { ?>
+					<span class="akt"><?php echo __('Alle', 'wpsg'); ?></span> <span class="count">(<?php echo $this->view['count']; ?>)</span>
+					<?php } else { ?>
+					<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goStatus(-1);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order"><?php echo __('Alle', 'wpsg'); ?> <span class="count">(<?php echo $this->view['countAll']; ?>)</span></a>
+					<?php } ?>
+				</li>
+			</ul>
+			
+		<p class="search-box wpsg-search-box">
+			<label for="post-search-input" class="screen-reader-text"><?php echo __('Bestellungen suchen', 'wpsg'); ?>:</label>
+			<input type="text" onchange="jQuery('#filtersearch').val(jQuery(this).val());" value="<?php echo wpsg_hspc($this->view['filter']['search']); ?>" name="filter[search]" id="post-search-input" />
+			<input type="submit" onclick="jQuery('#wpsg_mod_export_noheader').attr('name', '');" value="<?php echo __('Bestellung suchen', 'wpsg'); ?>" class="button" id="search-submit" name="search-submit" />
+		</p>
+		
+		<br class="clear" />
+			
+		<div class="tablenav top">
+		
+			<div class="alignleft actions">
+									
+				<label>
+					<input type="checkbox" <?php echo (($_COOKIE['wpsg_order_index_filter'] == '1')?'checked="checked"':''); ?> name="wpsg_order_index_filter" id="wpsg_order_index_filter" />&nbsp;<?php echo __('Filter', 'wpsg'); ?>
+				</label>
+											
+				<?php $this->callMods('produkt_index_head'); ?>						
+																			
+			</div>			
+			<?php //wpsg_debug($this->view) ?>
+			<div class="tablenav-pages tablenav-pages-wrap"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(1);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=1&amp;s=<?php echo $_REQUEST['s']; ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(<?php echo $this->view['seite'] - 1; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=<?php echo $this->view['seite'] - 1; ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input onfocus="jQuery('#wpsg_mod_export_noheader').attr('name', '');" type="text" size="1" value="<?php echo $this->view['seite']; ?>" id="seite" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(<?php echo $this->view['seite'] + 1; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=<?php echo $this->view['seite'] + 1; ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(<?php echo $this->view['pages']; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=<?php echo $this->view['pages']; ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
+				</div>
+				
+				<script type="text/javascript">
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				</script>
+				 
 			</div>
-			<div class="collapse navbar-collapse" id="wpsg-bs-headermenu">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order" onclick="return false;"><?php echo __("BestellÃŒbersicht", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_showhide_filter wpsg-order-tab-a <?php echo (($this->view['hasFilter'] === true)?'active':''); ?>" id="wpsg-order-tab-0"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-                    <?php foreach ($this->view['tabs']['left'] as $k => $tab) { ?>
-                    <li role="presentation" class="wpsg-order-tab-a wpsg-order-tab-mods" id="wpsg-order-tab-<?php echo $k; ?>"><a href="#" onclick="return false;"><span class="<?php echo $tab['tab_icon']; ?>"></span><?php echo $tab['tab_title']; ?></a></li>
-                    <?php } ?>
-                    <li role="presentation" class="wpsg-order-tab-a wpsg-order-tab-mods" id="wpsg-order-tab-add"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-plus"></span><?php echo __("Neue Bestellung", "wpsg"); ?></a></li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-                    <?php foreach ($this->view['tabs']['right'] as $k => $tab) { ?>
-                    <li role="presentation" class="wpsg-order-tab-mods" id="wpsg-order-tab-<?php echo $k; ?>"><a href="#" onclick="return false;"><span class="<?php echo $tab['tab_icon']; ?>"></span><?php echo $tab['tab_title']; ?></a></li>
-                    <?php } ?>
-				</ul>
-			</div>
-		</div>
-
-		<div class="wpsg-filter wpsg-order-tab wpsg-order-tab-0 container-fluid form-horizontal" style="display:<?php echo (($this->view['hasFilter'] === true)?'block':'none'); ?>;">
-			<div class="row">
-				<div class="col-lg-5">
-					<form method="post" id="filter_form" >
-
-						<?php echo wp_nonce_field('wpsg-order-search'); ?>
-						
-						<input id="wpsg_seite" type="hidden" name="seite" value="<?php echo @$this->view['arFilter']['page']; ?>" class="current-page" />
-						<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-						<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" />
-
-						<input type="hidden" name="filter[voucher_id]" value="<?php echo intval($this->view['arFilter']['voucher_id']??0); ?>" />
-						
-						<?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
-                        <?php echo wpsg_drawForm_Input('filter[k_id]', __('Kunde (ID)', 'wpsg'), wpsg_getStr($this->view['arFilter']['k_id'])); ?>
-                        <?php echo wpsg_drawForm_Select('filter[payment_key]', __('Zahlungsart', 'wpsg'), $arPaymentKeySelect, wpsg_getStr($this->view['arFilter']['payment_key'])); ?>
-						<?php echo wpsg_drawForm_Select('filter[status]', __('Bestellstatus', 'wpsg'), wpsg_array_merge(array('-1' => __('Alle', 'wpsg')), $this->arStatus), @$this->view['arFilter']['status']); ?>
-						
-						<?php /* if ($this->hasMod('wpsg_mod_produktartikel')) { Vorbereitet aber Joins in wpsg_order nach den wp Ktegorien noch nicht umgesetzt! ?>
+		
+		</div> 
+		 
+		<div class="metabox-holder" id="wpsg_order_index_filter_layer" style="<?php echo (($_COOKIE['wpsg_order_index_filter'] == '1')?'display:block;':'display:none;'); ?>">
+			<div id="wpsg_orderindexfilter" class="postbox">		
+				<h3 class="wpsg_handlediv">
+					<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br></span>
+					<span><?php echo __('Bestellfilter', 'wpsg'); ?></span>
+				</h3>
+				<div class="inside">
+					
+					<?php 
+					
+						// Array der ZustÃ€nde aufbereiten
+						$arStatus = array('-1' => __('Alle', 'wpsg'));
+						foreach ($this->view['arStatus'] as $status_id => $v) { $arStatus[$status_id] = $this->arStatus[$status_id]; }
+					
+					?>
+					
+					<?php echo wpsg_drawForm_Input('filter[search]', __('Suchtext', 'wpsg'), $this->view['filter']['search']); ?>
+					<?php echo wpsg_drawForm_Select('filter[status]', __('Status', 'wpsg'), $arStatus, $this->view['filter']['status'], array('id' => 'filter_status')); ?>
+					<div class="wpsg_form_field">
+						<div class="wpsg_form_left">
+							<label for=""><?php echo __('Bestelldatum (Monat/Jahr)', 'wpsg'); ?>:</label>
+						</div>
+						<div class="wpsg_form_right">
+							<select name="filter[month_von]" id="month_von" style="float:left; width:45%; margin-right:5%;">
+								<option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
+								<?php for ($i = 1; $i <= 12; $i ++) { ?>
+								<option <?php echo (($this->view['filter']['month_von'] == $i)?'selected="selected"':''); ?> value="<?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>"><?php echo utf8_encode(strftime("%B", mktime(0, 0, 0, $i, 1, 2000))); ?></option>
+								<?php } ?>
+							</select>
+							<select name="filter[year_von]" id="year_von" style="float:left; width:45%;">
+								<option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
+								<?php foreach ($this->view['years'] as $y) { ?>
+								<option <?php echo (($this->view['filter']['year_von'] == $y)?'selected="selected"':''); ?> value="<?php echo $y; ?>"><?php echo $y; ?></option>
+								<?php } ?>
+							</select>
+						</div>
+						<div class="wpsg_clear"></div>
+					</div>			
+					<?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>
+					<div class="wpsg_form_field">
+						<div class="wpsg_form_left">
+							<label for=""><?php echo __('Rechnungsdatum (Monat/Jahr)', 'wpsg'); ?>:</label>
+						</div>
+						<div class="wpsg_form_right">
+							<select name="filter[invoice_month_von]" id="invoice_month_von" style="float:left; width:45%; margin-right:5%;">
+								<option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
+								<?php for ($i = 1; $i <= 12; $i ++) { ?>
+								<option <?php echo (($this->view['filter']['invoice_month_von'] == $i)?'selected="selected"':''); ?> value="<?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>"><?php echo strftime("%B", mktime(0, 0, 0, $i, 1, 2000)); ?></option>
+								<?php } ?>
+							</select>
+							<select name="filter[invoice_year_von]" id="invoice_year_von" style="float:left; width:45%;">
+								<option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
+								<?php foreach ($this->view['invoice_years'] as $y) { ?>
+								<option <?php echo (($this->view['filter']['invoice_year_von'] == $y)?'selected="selected"':''); ?> value="<?php echo $y; ?>"><?php echo $y; ?></option>
+								<?php } ?>
+							</select>						
+						</div>
+					</div>		
+					<?php } ?>
+					
+					<div class="clear"></div>
 							
-							<?php $arCatSelect = []; $arCat = $this->callMod('wpsg_mod_produktartikel', 'getProductcategorySelect'); foreach ($arCat as $cat) $arCatSelect[$cat['term_id']] = $cat['label']; ?>
-							<?php  echo wpsg_drawForm_Select('filter[cat_term_id]', __('Bestellungen mit Produkten aus Kategorie'), ['0' => __('Alle', 'wpsg')] + $arCatSelect, wpsg_getStr($this->view['arFilter']['cat_term_id'])); ?>
-						
-						<?php } */ ?>
-						
-						<?php if ($this->hasMod('wpsg_mod_productgroups') && $this->get_option('wpsg_mod_productgroups_order_filter') === '1') { ?>
-						
-							<?php $arProductgroups = $this->callMod('wpsg_mod_productgroups', 'getAllProductGroups'); ?>
-							<?php  echo wpsg_drawForm_Select('filter[productgroup_id]', __('Bestellungen mit Produkten aus Produktgruppe'), ['0' => __('Alle', 'wpsg')] + $arProductgroups, wpsg_getStr($this->view['arFilter']['productgroup_id'])); ?>
-							
-						<?php } ?>
-						
-                        <?php echo wpsg_drawForm_TextStart(); ?>
-                        <div class="row">
-                            <div class="col-lg-6">
-                                <select name="filter[cdate_m]" class="form-control input-sm">
-                                    <option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-                                    <?php for ($i = 1; $i <= 12; $i ++) { ?>
-                                    <option <?php echo ((wpsg_getStr($this->view['arFilter']['cdate_m']) == $i)?'selected="selected"':''); ?> value="<?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>"><?php echo __(date('F', mktime(0, 0, 0, $i, 1, 2000))); ?></option>
-                                    <?php } ?>
-                                </select>
-                            </div>
-                            <div class="col-lg-6">
-                                <select name="filter[cdate_y]" class="form-control input-sm">
-                                    <option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-                                    <?php foreach ($this->view['cdate_years'] as $y) { ?>
-                                    <option <?php echo ((wpsg_getStr($this->view['arFilter']['cdate_y']) == $y)?'selected="selected"':''); ?> value="<?php echo $y; ?>"><?php echo $y; ?></option>
-                                    <?php } ?>
-                                </select>
-                            </div>
-                        </div>
-                        <?php echo wpsg_drawForm_TextEnd(__('Bestelldatum (Monat/Jahr)', 'wpsg'), array('noP' => true)); ?>
-
-						<?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>
-							<?php echo wpsg_drawForm_TextStart(); ?>
-							<div class="row">
-								<div class="col-lg-6">
-									<select name="filter[invoicedate_m]" class="form-control input-sm">
-										<option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-										<?php for ($i = 1; $i <= 12; $i ++) { ?>
-										<option <?php echo ((wpsg_getStr($this->view['arFilter']['invoicedate_m']) == $i)?'selected="selected"':''); ?> value="<?php echo str_pad($i, 2, '0', STR_PAD_LEFT); ?>"><?php echo strftime("%B", mktime(0, 0, 0, $i, 1, 2000)); ?></option>
-										<?php } ?>
-									</select>
-								</div>
-								<div class="col-lg-6">
-									<select name="filter[invoicedate_y]" class="form-control input-sm">
-										<option value="-1"><?php echo __("Alle", "wpsg"); ?></option>
-										<?php foreach ($this->view['invoicedate_years'] as $y) { ?>
-										<option <?php echo ((wpsg_getStr($this->view['arFilter']['invoicedate_y']) == $y)?'selected="selected"':''); ?> value="<?php echo $y; ?>"><?php echo $y; ?></option>
-										<?php } ?>
-									</select>
-								</div>
-							</div>
-							<?php echo wpsg_drawForm_TextEnd(__('Rechnungsdatum (Monat/Jahr)', 'wpsg'), array('noP' => true)); ?>
-						<?php } ?>
-
-    					<br />
-                        
-                        <?php echo wpsg_drawForm_SubmitButton(__('Bestellungen suchen')); ?>
-
-					</form>
+					<br />			
+					<input onclick="jQuery('#wpsg_mod_export_noheader').attr('name', '');" class="button" name="search-submit" type="submit" value="<?php echo __("Auswahl einschrÃ€nken", "wpsg"); ?>" />
+					
 				</div>
 			</div>
 		</div>
-	
-        <?php foreach ($this->view['tabs'] as $tab_positions) { ?>
-        <?php foreach ($tab_positions as $k => $tab) { ?>
-        <div class="wpsg-order-tab-mods-content wpsg-filter-tab wpsg-order-tab-<?php echo $k ?>" style="display:none;"><?php echo $tab['tab_content']; ?></div>
-        <?php } ?>
-        <?php } ?>
-        
-        <div class="wpsg-order-tab-add-content wpsg-order-tab-add" style="display:none;">
-
-            <div class="container-fluid form-horizontal">
-                <div class="row">
-                    <div class="col-lg-4">
-                        
-                        <form method="POST" id="add_form" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&subaction=add&noheader=1">
-	
-							<?php echo wp_nonce_field('wpsg-order-add'); ?>
-							                            
-                            <br />
-                            
-                            <?php echo wpsg_drawForm_Input('search_customer',__('Kunde (E-Mail oder Kundennummer)', 'wpsg'), wpsg_getStr($_REQUEST['search_customer'])); ?>
-                            
-                            <br />
+		
+		<script type="text/javascript">/* <![CDATA[ */
+
+			jQuery(document).ready(function() {
+
+				jQuery('#wpsg_order_index_filter').bind('change', function() {
+
+					if (jQuery(this).attr("checked")) 
+					{
+
+						jQuery('#wpsg_order_index_filter_layer').show();
+						jQuery.cookie('wpsg_order_index_filter', '1');
+						
+					}
+					else
+					{
+
+						jQuery('#wpsg_order_index_filter_layer').hide();
+						jQuery.cookie('wpsg_order_index_filter', '0');
+						
+					}
+					
+				} );
+				
+			} );			
+		
+		/* ]]> */</script>
+		
+		<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo $this->view['filter']['order']; ?>" />
+		<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo $this->view['filter']['ascdesc']; ?>" />
+				
+		<input style="display:none;" type="submit" name="suchen" value="" />
+		
+	</form>
+	
+	<?php $this->callMods('produkt_index_aftersearch'); ?>
+			
+	<?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
+	<form method="get" id="wpsg_order_index_submit">
+	
+		<input type="hidden" name="" id="wpsg_order_index_noheader" value="1" />
+		<input type="hidden" name="page" value="wpsg-Order" /> 
+	
+		<table class="widefat post fixed">
+			<thead>
+				<tr>
+					<th class="manage-column column-cb check-column" scope="col"><input type="checkbox" value="1" id="wpsg_check_all_order" onclick="wpsg_checkOrderCol(this);" name="" /></th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'nr')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">					
+						<a href="#" onclick="return wpsg_setOrder('nr');">
+							<span><?php echo __("Nr.", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>					
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'customer')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('customer');">
+							<span><?php echo __("Kunde", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'payment')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('payment');">
+							<span><?php echo __("Bezahlmethode", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'shipping')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('shipping');">
+							<span><?php echo __("Versandart", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>				
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'produkte')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('produkte');">
+							<span><?php echo __("Produkte", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'amount')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('amount');">
+							<span><?php echo __("Bestellwert", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<?php if ($this->hasMod('wpsg_mod_abo')) { ?>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'abo')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('abo');">
+							<span><?php echo __("Abo Ende", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<?php } ?>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'status')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('status');">
+							<span><?php echo __("Status", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<?php $i = 1; foreach ($this->view['data'] as $o) { ?>
+				<tr>
+					<td class="">
+						<input type="checkbox" value="1" name="wpsg_multido[<?php echo $o['id']; ?>]" />
+					</td>
+					<td class="post-title column-title">
+						<?php if (wpsg_isSizedString($o['language']) && $o['language'] != $this->getCurrentLanguage()) { $arLang = $this->getStoreLanguages(); $lang = $arLang[$o['language']]; ?>
+							<img src="<?php echo $this->getFlagURL().$lang['flag']; ?>" alt="<?php echo wpsg_translate(__('Bestellung wurde in der Sprache #1# durchgefÃŒhrt.', 'wpsg'), $lang['name']); ?>" title="<?php echo wpsg_translate(__('Bestellung wurde in der Sprache #1# durchgefÃŒhrt.', 'wpsg'), $lang['name']); ?>" />
+						<?php } ?>						
+						<?php echo (($o['onr'] == "")?$o['id']:$o['onr']); ?> <span class="wpsg_order_datum"><?php echo wpsg_hspc(date('d.m.Y H:i:s', strtotime($o['cdate']))); ?></span><br />
+						<?php if (trim($o['order_comment']) != '') { ?>
+						<a title="<?php echo wpsg_translate(__('Kommentar (Kunde): #1#', 'wpsg'), wpsg_hspc($o['order_comment'])); ?>" onclick="return false" href="">
+							<img alt="" src="<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/views/gfx/comment.png" />
+						</a>
+						<?php } ?>
+						<?php if (trim($o['admincomment']) != "") { ?>
+						<a title="<?php echo __("Kommentar (Admin): ", "wpsg").htmlspecialchars($o['admincomment']); ?>" onclick="return false;" href="">
+							<img alt="" src="<?php echo WPSG_URL_CONTENT; ?>plugins/wpshopgermany/views/gfx/comment_admin.png" />
+						</a>
+						<?php } ?>
+						<div class="row-actions">
+							<span class="view"><a title="<?php echo __("Diese Bestellung ansehen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;action=view&amp;edit_id=<?php echo $o['id']; ?>"><?php echo __("Ansehen", "wpsg"); ?></a></span>
+							|
+							<span class="storno"><a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese Bestellung stornieren mÃ¶chten?', 'wpsg'); ?>');" title="<?php echo __("Diese Bestellung stornieren", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;action=storno&amp;noheader=1&amp;edit_id=<?php echo $o['id']; ?>"><?php echo __("Stornieren", "wpsg"); ?></a></span>
+							|
+							<span class="delete"><a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese Bestellung lÃ¶schen mÃ¶chten?', 'wpsg'); ?>');" title="<?php echo __('Diese Bestellung lÃ¶schen', 'wpsg'); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;action=delete&amp;noheader=1&amp;edit_id=<?php echo $o['id']; ?>"><?php echo __('LÃ¶schen', 'wpsg'); ?></a></span>														
+						</div>
+					</td>
+					<td>
+						<?php if (trim($o['firma']) != '') { ?>
+						<?php echo wpsg_hspc($o['firma']); ?><br />
+						<?php } ?>
+						<?php echo ((trim($o['title']) != '' && $o['title'] != '-1')?$o['title'].' ':'').wpsg_hspc($o['vname'].' '.$o['name']); ?><br />
+						<span class="wpsg_order_adress">
+							<?php echo wpsg_hspc($o['strasse']); ?><br />
+							<?php echo wpsg_hspc($o['plz'].' '.$o['ort'].' '.$o['land_krzl']); ?>
+						</span>
+					</td>
+					<td>
+					
+						<?php /* Bei Crefopay wird die Darstellung der Zahlungsart ÃŒber das Modul geregelt */ ?>
+						<?php if ($o['type_payment'] == 4000 && $this->hasMod('wpsg_mod_crefopay')) { ?>
+							<?php echo wpsg_hspc($this->callMod('wpsg_mod_crefopay', 'getOrderPaymentName', array($o['id']))); ?>
+						<?php } else { ?>
+							<?php echo wpsg_hspc(__($this->arPayment[$o['type_payment']]['name']), 'wpsg'); ?>
+						<?php } ?>
+						
+						<?php if ($o['basket']['sum']['preis_payment'] > 0) { ?>
+						<br /><?php echo wpsg_ff($o['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')); ?>					
+						<?php } ?>
+					</td>
+					<td>
+						<?php echo wpsg_hspc($o['oOrder']->getShippingTypName()); ?>
+						<?php if ($o['basket']['sum']['preis_shipping'] > 0) { ?>
+						<br /><?php echo wpsg_ff($o['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')); ?>					
+						<?php } ?>
+					</td>
+					<td>
+						<?php foreach ((array)$o['basket']['produkte'] as $p) { ?>
+						<?php echo wpsg_translate(__('#1# x <a href="#2#">#3#</a> fÃŒr je #4#', 'wpsg'), $p['menge'], WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$this->getProduktID($p['id']), $p['name'], wpsg_ff($p['preis'], $this->get_option('wpsg_currency'))); ?><br />
+						<?php } ?>
+					</td>
+					<td>
+						<?php echo wpsg_ff($o['basket']['sum']['preis_gesamt'], $this->get_option('wpsg_currency')); ?>
+					</td>
+					<?php if ($this->hasMod('wpsg_mod_abo')) { ?>
+					<td>
+						<?php if ($this->callMod('wpsg_mod_abo', 'isAboOrder', array($o['id'])) === 1) { ?>
+							<?php echo $this->callMod('wpsg_mod_abo', 'getOrderAboExpiration', array($o['id'])) ?>
+						<?php } else if ($this->callMod('wpsg_mod_abo', 'isAboOrder', array($o['id'])) === 2) { ?>
+							<?php 
 							
-                            <?php $arShippingSelect = []; foreach ($this->arShipping as $shipping_id => $shipping) if (!isset($shipping['active']) || $shipping['active'] === '1') $arShippingSelect[$shipping_id] = $shipping['name'].' ('.wpsg_ff(@$shipping['price']).')'; ?>
-                            <?php echo wpsg_drawForm_Select('add_shipping', __('Versandart', 'wpsg'), $arShippingSelect, wpsg_getStr($_REQUEST['add_shipping'])); ?>
-
-                            <?php $arPaymentSelect = []; foreach ($this->arPayment as $payment_id => $payment) if (!isset($payment['active']) || $payment['active'] === '1')  $arPaymentSelect[$payment_id] = $payment['name'].' ('.wpsg_ff(wpsg_getStr($payment['price'])).')'; ?>
-                            <?php echo wpsg_drawForm_Select('add_payment', __('Zahlungsart', 'wpsg'), $arPaymentSelect, wpsg_getStr($_REQUEST['add_payment'])); ?>
-                            
-                            <br /><?php echo wpsg_drawForm_SubmitButton(__('Bestellung anlegen')); ?><br />
-                            
-                            <script>
-                                
-                                jQuery(document).ready(function() {
-                                
-                                    jQuery('#search_customer').autocomplete( {
-                                        source: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&subaction=autocomplete&noheader=1',
-                                        minLength: 2,
-                                        select: function(event, ui) {
-                                            
-                                            jQuery('#search_customer').val(ui.item.id);
-                                            
-                                            return false;
-                                            
-                                        }
-                                    } );
-                                
-                                    jQuery('#add_form').on('submit', function() {
-                                        
-                                        if (jQuery.trim(jQuery('#search_customer').val()) === '') {                                            
-                                            
-                                            alert('<?php echo __('Bitte einen Kunden angeben.', 'wpsg'); ?>');
-                                            
-                                            return false;
-                                            
-                                        }
-                                        
-                                    } );
-                                    
-                                } );
-                                
-                            </script>
-                            
-                        </form>
-                        
-                    </div>
-                </div>
-            </div>
-            
-        </div>
-    
-    </nav>
-    
-    <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-	
-	<?php if ($this->hasMod('wpsg_mod_productgroups') && $this->get_option('wpsg_mod_productgroups_order_filter') === '1') { $arPG = $this->callMod('wpsg_mod_productgroups', 'getAllProductGroups', [true]); ?>
-
-		<?php if (wpsg_isSizedArray($arPG)) { ?>
-		<div class="container-fluid">
-			<div class="row">
-				<div class="pagination_wrap wpsg_status_link_wrap">
-		
-					<ul class="pagination">
-						<?php foreach ($arPG as $pg_id => $pg_name) { ?>
-							<li class="<?php echo ((wpsg_getStr($this->view['arFilter']['productgroup_id']) == $pg_id)?'active':''); ?>"><a href="#" onclick="return wpsg_setFilterProductgroup('<?php echo $pg_id; ?>');"><?php echo $pg_name; ?></a></li>
-						<?php } ?>
-					</ul>
-		
+								$origin_order_id = $this->callMod('wpsg_mod_abo', 'getOriginOrder', array($o['id']));
+								$origin_order_data = $this->cache->loadOrder($origin_order_id);
+							
+							?>
+							<?php echo $this->callMod('wpsg_mod_abo', 'getOrderAboExpiration', array(
+								$origin_order_data['id']
+							)) ?><br />
+							<?php echo wpsg_translate(__('VerlÃ€ngerung zu Bestellung <a href="#1#">#2#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$origin_order_id, $origin_order_data['onr']); ?>
+						<?php } ?>
+					</td>
+					<?php } ?>
+					<td>
+						<?php echo wpsg_hspc($this->arStatus[$o['status']]); ?>
+					</td>
+				</tr>
+				<?php $i++; } ?>
+			</tbody> 	
+			<tfoot>
+				<tr>
+					<th class="manage-column column-cb check-column" scope="col"><input type="checkbox" value="1" id="wpsg_check_all_order_2" onclick="wpsg_checkOrderCol(this);" name="" /></th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'nr')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">					
+						<a href="#" onclick="return wpsg_setOrder('nr');">
+							<span><?php echo __("Nr.", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>					
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'customer')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('customer');">
+							<span><?php echo __("Kunde", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'payment')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('payment');">
+							<span><?php echo __("Bezahlmethode", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'shipping')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('shipping');">
+							<span><?php echo __("Versandart", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>				
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'produkte')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('produkte');">
+							<span><?php echo __("Produkte", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'amount')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('amount');">
+							<span><?php echo __("Bestellwert", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<?php if ($this->hasMod('wpsg_mod_abo')) { ?>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'abo')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('abo');">
+							<span><?php echo __("Abo Ende", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a>
+					</th>
+					<?php } ?>
+					<th class="manage-column column-title <?php echo (($this->view['filter']['order'] == 'status')?'sorted':'sortable'); ?> <?php echo (($this->view['filter']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+						<a href="#" onclick="return wpsg_setOrder('status');">
+							<span><?php echo __("Status", 'wpsg'); ?></span>
+							<span class="sorting-indicator"></span>
+						</a> 
+					</th>
+				</tr>
+			</tfoot>	
+		</table>
+		
+		<div class="tablenav bottom">
+			<div class="alignleft actions">
+				<select name="wpsg_action" id="wpsg_action">
+					<option value="-1"><?php echo __('Aktion wÃ€hlen', 'wpsg'); ?></option>
+					<?php foreach ($this->arStatus as $k => $status) { ?>
+					<option value="<?php echo $k; ?>"><?php echo wpsg_translate(__('Status auf "#1#" setzen.', 'wpsg'), $status); ?></option>
+					<?php } ?>
+					<option value="multiDelete"><?php echo __('Bestellungen lÃ¶schen', 'wpsg'); ?></option>
+					<?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>					
+					<option value="writeRechnung"><?php echo __('Rechnung schreiben', 'wpsg'); ?></option>
+					<option value="showRechnung"><?php echo __('Rechnung ansehen', 'wpsg'); ?></option>
+					<?php } ?>
+				</select>
+				<input onclick="if (jQuery('#wpsg_action').val() == 'multiDelete') { if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false; } jQuery('#wpsg_order_index_noheader').attr('name', 'noheader');" type="submit" value="<?php echo __('AusfÃŒhren', 'wpsg'); ?>" class="button-secondary action" id="doaction" name="wpsg_order_doaction" />
+			</div> 
+			
+			<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(1);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=1&amp;s=<?php echo $_REQUEST['s']; ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(<?php echo $this->view['seite'] - 1; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=<?php echo $this->view['seite'] - 1; ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input onfocus="jQuery('#wpsg_mod_export_noheader').attr('name', '');" type="text" size="1" value="<?php echo $this->view['seite']; ?>" id="seite" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(<?php echo $this->view['seite'] + 1; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=<?php echo $this->view['seite'] + 1; ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a onclick="jQuery('#wpsg_mod_export_noheader').attr('name', ''); return goPage(<?php echo $this->view['pages']; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;seite=<?php echo $this->view['pages']; ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
 				</div>
-			</div>
+				
+				<script type="text/javascript">
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				</script>
+				
+				<br class="clear">
+			</div>			
 		</div>
-		<?php } ?>
-		
+		
+		<?php $this->callMod('wpsg_mod_export', 'produkt_index_foot'); ?>
+		
+	</form>
+	<?php } else { ?>
+	<br /><br />
+	<p><?php echo __('Keine Bestellungen in der Datenbank.', 'wpsg'); ?></p>
 	<?php } ?>
 	
-	<div class="pagination_wrap wpsg_status_link_wrap">
-
-		<ul class="pagination">
-			<?php foreach ($this->view['arStatus'] as $status_key => $status_info) { ?>
-			<li class="<?php echo ((wpsg_getStr($this->view['arFilter']['status']) == $status_key)?'active':''); ?>"><a href="#" onclick="return wpsg_setFilterStatus('<?php echo $status_key; ?>');"><?php echo wpsg_translate(__('#1# <span>(#2#)<span>', 'wpsg'), $status_info['label'], $status_info['count']); ?></a></li>
-			<?php } ?>
-		</ul>
-
-	</div>
-
-	<?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-
-	<div class="wpsg_clear"></div>
-
-	<div class="content">
-		<form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1" enctype="multipart/form-data" id="order_form">
-
-		<?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-
-            <table class="table table-bordered table-hover table-striped wpsg-table-order">
-                <thead>
-                    <tr>
-                        <th class="col_checkbox"><input type="checkbox" onclick="return wpsg_order_checkAll();" /></th>
-                        <th class="col_nr wpsg_order" data-order="cdate"><?php echo __('Nr', 'wpsg'); ?></th>
-                        <th class="col_customer wpsg_order" data-order="customer"><?php echo __('Kunde', 'wpsg'); ?></th>
-                        <th class="col_payment wpsg_order" data-order="payment"><?php echo __('Bezahlmethode', 'wpsg'); ?></th>
-                        <th class="col_shipping wpsg_order" data-order="shipping"><?php echo __('Versandart', 'wpsg'); ?></th>
-                        <th class="col_products wpsg_order" data-order="products"><?php echo __('Produkte', 'wpsg'); ?></th>
-                        <?php if ($this->get_option('wpsg_showvalueofgoods')) { ?><th class="col_productsum wpsg_order" data-order="productsum"><?php echo __('Warenwert', 'wpsg'); ?></th><?php } ?>
-                        <th class="col_sum wpsg_order" data-order="amount"><?php echo __('Bestellwert', 'wpsg'); ?></th>
-                        <th class="col_state wpsg_order" data-order="state"><?php echo __('Status', 'wpsg'); ?></th>
-                    </tr>
-                </thead>
-                <tbody>
-                    <?php foreach ($this->view['arData'] as $oOrder) { ?>
-                    <tr>
-                        <td class="col_checkbox">
-
-                            <input class="col_set_checkbox" data-order_id="<?php echo $oOrder->id; ?>" name="wpsg_multido[<?php echo $oOrder->id; ?>]" type="checkbox" />
-
-                        </td>
-                        <td class="col_nr">
-
-                            <?php echo $oOrder->getNr(); ?> <span class="wpsg_grey"><?php echo wpsg_formatTimestamp(strtotime($oOrder->cdate), false); ?></span><br />
-
-                            <div class="actions">
-                                <span class="view"><a title="<?php echo __("Diese Bestellung ansehen", "wpsg"); ?>" href="<?php
-		
-									echo wpsg_admin_url('Order', 'view', ['edit_id' => $oOrder->getId()]);
-	
-								?>"><?php echo __("Ansehen", "wpsg"); ?></a></span>
-                                |
-                                <span class="storno"><a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese Bestellung stornieren mÃ¶chten?', 'wpsg'); ?>');" title="<?php echo __("Diese Bestellung stornieren", "wpsg"); ?>" href="<?php 
-										
-									echo wpsg_admin_url('Order', 'storno', ['edit_id' => $oOrder->getId()], ['noheader' => '1']); 
-										
-								?>"><?php echo __("Stornieren", "wpsg"); ?></a></span>
-                                |
-                                <span class="delete"><a onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese Bestellung lÃ¶schen mÃ¶chten?', 'wpsg'); ?>');" title="<?php echo __('Diese Bestellung lÃ¶schen', 'wpsg'); ?>" href="<?php
-									
-									echo wpsg_admin_url('Order', 'delete', ['edit_id' => $oOrder->getId()], ['noheader' => '1']);
-									
-								?>"><?php echo __('LÃ¶schen', 'wpsg'); ?></a></span>
-                            </div>
-
-                            <?php if (trim($oOrder->admincomment) != "") { ?>
-                            <a title="<?php echo __("Kommentar (Admin): ", "wpsg").htmlspecialchars($oOrder->admincomment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign admincomment" href="#"></a>
-                            <?php } ?>
-
-                            <?php if (trim($oOrder->comment) != "") { ?>
-                            <a title="<?php echo __("Kommentar (Kunde): ", "wpsg").htmlspecialchars($oOrder->comment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign customercomment" href="#"></a>
-                            <?php } ?>
-
-                            <?php if ($oOrder->hasShippingAdress()) { ?>
-                            <a title="<?php echo __("Lieferadresse beachten", "wpsg"); ?>" onclick="return false;" class="glyphicon glyphicon-map-marker shippingadress" href="#"></a>
-                            <?php } ?>
-
-                            <?php if ($this->hasMod('wpsg_mod_abo')) { ?>
-
-                                <?php if ($this->callMod('wpsg_mod_abo', 'isAboOrder', array($oOrder->id)) === 1) { ?>
-                                    <?php echo __('Abo Bestellung', 'wpsg'); ?>
-                                <?php } else if ($this->callMod('wpsg_mod_abo', 'isAboOrder', array($oOrder->id)) === 2) { ?>
-                                    
-                                    <?php
-
-                                        $origin_order_id = $this->callMod('wpsg_mod_abo', 'getOriginOrder', array($oOrder->id));
-                                        $origin_order_data = $this->cache->loadOrder($origin_order_id);
-
-                                        //wpsg_debug($oOrder->id.":".$origin_order_id);
-                                        
-                                    ?>
-                                    <?php echo wpsg_translate(__('VerlÃ€ngerung zu Bestellung <a href="#1#">#2#</a>', 'wpsg'), WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=view&edit_id='.$origin_order_id, $origin_order_data['onr']); ?>
-                                    
-                                <?php } ?>
-                            
-                            <?php } ?>                            
-
-                        </td>
-                        <td class="col_customer">
-                            <?php $firma = $oOrder->getInvoiceCompany(); if (wpsg_isSizedString($firma)) { ?>
-                            <?php echo $firma; ?><br />
-                            <?php } ?>
-                            <?php echo $oOrder->getInvoiceTitle(); ?> <?php echo $oOrder->getInvoiceFirstname(); ?> <?php echo $oOrder->getInvoiceName(); ?>
-                            <br />
-                            <span class="wpsg_grey"><?php echo $oOrder->getInvoiceStreet(); ?><br />
-                            <?php echo ltrim($oOrder->getInvoiceZip().' '.$oOrder->getInvoiceCity()); ?> <?php echo $oOrder->getInvoiceCountryKuerzel(); ?>
-                            </span>
-                        </td>
-                        <td class="col_payment">
-
-                            <?php /* Bei Crefopay wird die Darstellung der Zahlungsart ÃŒber das Modul geregelt */ ?>
-                            <?php if ($oOrder->getPaymentID() == 4000 && $this->hasMod('wpsg_mod_crefopay')) { ?>
-                                <?php echo wpsg_hspc($this->callMod('wpsg_mod_crefopay', 'getOrderPaymentName', array($oOrder->id))); ?>
-                            <?php } else { ?>
-                                <?php echo $oOrder->getPaymentLabel(); ?>
-                            <?php } ?>
-
-                            <?php if ($oOrder->getPaymentAmount() > 0) { ?>
-                            &nbsp;-&nbsp;<?php echo wpsg_ff($oOrder->getPaymentAmount(), $this->get_option('wpsg_currency')); ?>
-                            <?php } ?>
-
-                        </td>
-                        <td class="col_shipping">
-
-                            <?php echo $oOrder->getShippingLabel(); ?>
-
-                            <?php if ($oOrder->getShippingAmount() > 0) { ?>
-                            &nbsp;-&nbsp;<?php echo wpsg_ff($oOrder->getShippingAmount(), $this->get_option('wpsg_currency')); ?>
-                            <?php } ?>
-
-                            <?php if ($oOrder->hasShippingAdress()) { ?>
-                                <br />
-                                <?php echo $oOrder->getShippingTitle(); ?> <?php echo $oOrder->getShippingFirstName(); ?> <?php echo $oOrder->getShippingName(); ?><br />
-                                <span class="wpsg_grey">
-                                    <?php echo $oOrder->getShippingStreet(); ?>
-                                    <?php echo $oOrder->getShippingZip(); ?> <?php echo $oOrder->getShippingCity(); ?> <?php echo $oOrder->getShippingCountryKuerzel(); ?><br />
-                            </span>
-                            <?php } ?>
-
-                        </td>
-                        <td class="col_products">
-
-                            <?php $oOrderProducts = $oOrder->getOrderProducts(); ?>
-                            
-                            <?php foreach ($oOrderProducts as $oOrderProduct) { 
-                            	
-                            		$product_id = $oOrderProduct->getProductId();
-                                	$oAbo = null;
-                            		
-                            		if ($this->hasMod('wpsg_mod_abo')) {
-                            			
-                            			try { $oAbo = wpsg_abo::getFromOrderAndOrderProduct($oOrder->getId(), $oOrderProduct->getId()); } catch (\Exception $e) {  }
-                            			
-                                    }
-								
-								?>
-
-                                <?php
-
-                                    echo wpsg_translate(__('#1# x <a href="#2#">#3#</a> fÃŒr je #4#', 'wpsg'),
-                                        $oOrderProduct->getCount(),
-                                        wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$oOrderProduct->getProductId(), 'wpsg-product-edit-'.wpsg_getInt($product_id)),
-                                        $oOrderProduct->getProductName(),
-                                        wpsg_ff($oOrderProduct->getOneAmount(), $this->get_option('wpsg_currency'))
-                                    );
-
-                                ?><br />
-                                
-                                <?php if ($oAbo !== null) { ?>
- 
-									<?php
-									 
-										$state = $oAbo->getState();
-									
-										echo __('Abo Laufzeit:', 'wpsg'); 
-									
-									?>
-
-									<?php if ($state === wpsg_abo::STATE_INEXTENSION) { ?><span style="color:orange;"><?php echo $oAbo->getStateLabel(); ?></span>
-									<?php } else if ($state === wpsg_abo::STATE_RUNNING) { ?><span style="color:green;"><?php echo $oAbo->getStateLabel(); ?></span>
-									<?php } else if ($state === wpsg_abo::STATE_EXTEND) { ?><span style="color:red;"><?php echo $oAbo->getStateLabel(); ?></span><?php } ?>
-									 
-									<br />  
-                                    
-                                <?php } ?>
-                            
-                            <?php } ?>
-
-                        </td>
-                        <?php if ($this->get_option('wpsg_showvalueofgoods')) { ?>
-                            <td class="col_productsum">
-
-                                <?php $oOrderProducts = $oOrder->getOrderProducts(); ?>
-                                <?php foreach ($oOrderProducts as $oOrderProduct) { ?>
-                                    <?php $product_sum += $oOrderProduct->getPriceSum($this->getBackendTaxview()); ?>
-                                <?php } ?>
-                                <?php echo wpsg_ff($product_sum, $this->get_option('wpsg_currency')); ?>
-                                <?php $product_sum = 0; ?>
-
-                            </td>
-                        <?php } ?>
-                        <td class="col_sum">
-                            <?php echo wpsg_ff($oOrder->getAmount(), $this->get_option('wpsg_currency')); ?>
-                        </td>
-                        <td class="col_state">
-                            <?php echo $oOrder->getStateLabel(); ?>
-                        </td>
-                    </tr>
-                    <?php } ?>
-                </tbody>
-            </table>
-
-            <div class="alignleft actions">
-                <select name="wpsg_action" id="wpsg_action">
-                    <option value="-1"><?php echo __('Aktion wÃ€hlen', 'wpsg'); ?></option>
-                    <?php foreach ($this->arStatus as $k => $status) { ?>
-                    <option value="<?php echo $k; ?>"><?php echo wpsg_translate(__('Status auf "#1#" setzen.', 'wpsg'), $status); ?></option>
-                    <?php } ?>
-                    <option value="multiDelete"><?php echo __('Bestellungen lÃ¶schen', 'wpsg'); ?></option>
-                    <?php if ($this->hasMod('wpsg_mod_rechnungen')) { ?>
-                    <option value="writeRechnung"><?php echo __('Rechnung schreiben', 'wpsg'); ?></option>
-                    <?php if ($this->view['arFilter']['k_id'] != '') { ?>
-                    <option value="writeMultiRechnung"><?php echo __('Sammelrechnung schreiben', 'wpsg'); ?></option>
-                    <?php } ?>
-                    <option value="showRechnung"><?php echo __('Rechnung ansehen', 'wpsg'); ?></option>
-                    <?php } ?>
-                    <?php if ($this->hasMod('wpsg_mod_kundenkontakt')) { ?>
-                    <option value="customercontact"><?php echo __('Kunden informieren', 'wpsg') ;?></option>
-                    <?php } ?>
-                </select>
-
-                <input onclick="if (jQuery('#wpsg_action').val() == 'multiDelete') { if (!confirm('<?php echo __('Sind Sie sich sicher?', 'wpsg'); ?>')) return false; }" type="submit" value="<?php echo __('AusfÃŒhren', 'wpsg'); ?>" class="button-secondary action" id="doaction" name="wpsg_order_doaction" />
-
-                <div id="customer_inform" style="display:none;">
-                    <label class="mr-4 font-normal">
-                        <input class="mt-0 mr-2" type="checkbox" name="inform" value="1" />&nbsp;<?php echo __('Kunden informieren', 'wpsg'); ?>
-                    </label>
-                </div>
-                
-                <script>
-                    
-                    let el_customer_inform = document.getElementById('customer_inform');
-                    
-                    document.getElementById('wpsg_action').addEventListener('change', (event) => {
-                    	 
-                    	if (parseInt(event.target.value) >= 0) {
-                    		
-                    		el_customer_inform.style.display = 'inline-block';
-                    		
-                        } else {
-                    		
-                    		el_customer_inform.style.display = 'none';
-                    		
-                        }
-                    	
-						let el_doaction = document.getElementById('doaction');
-						
-						if (event.target.value === 'writeMultiRechnung') {
-							
-							el_doaction.style.display = 'none';
-							
-                        } else {
-							
-							el_doaction.style.display = 'inline-block';
-							
-                        }
-						
-                    });
-
-                    let buttonClicked = false;
-                    document.getElementById('doaction').addEventListener('click', (event) => {
-
-                        if (buttonClicked) {
-
-                            event.preventDefault();
-                            return false;
-
-                        }
-
-                        // Button deaktivieren und ausgrauen
-                        document.getElementById('doaction').style.opacity = '0.5';
-                        document.getElementById('doaction').style.pointerEvents = 'none';
-
-                        // Button nach 4 Sekunden wieder aktivieren
-                        setTimeout(() => {
-
-                            document.getElementById('doaction').style.opacity = '1';
-                            document.getElementById('doaction').style.pointerEvents = 'auto';
-                            buttonClicked = false;
-
-                        }, 4000);
-
-                        buttonClicked = true;
-                        return true;
-
-                    });
-
-                </script>
-
-                <div class="multiRechnung_tab" id="multiRechnung_inform" style="padding: 15px 0 15px 0; display:none;">
-
-                    <div style="width: 100%; padding: 1rem; display: grid; row-gap: 0.5rem; column-gap: 0.5rem; grid-template-columns: 25px 1fr 150px; align-items: center; grid-auto-rows: 30px; padding-bottom: 0.5rem;" >
-                        
-                        <?php $oCustomer = wpsg_customer::getInstance(intval($this->view['arFilter']['k_id'])); ?>
-
-                        <input type="checkbox" name="wpsg_Multirechnung_sendmail" value="1" id="invoice_sendmail" />
-                        <label for="invoice_sendmail"><?php echo __('E-Mail an Kunden senden', 'wpsg'); ?></label>
-                        <input type="email" name="wpsg_Multirechnung_email" value="<?php echo $oCustomer->getEMailEInvoice();  ?>" />
-                    
-                        <input type="checkbox" name="wpsg_Multirechnung_faelligkeit" value="1" id="invoice_faelligkeit" />
-                        <label for="invoice_faelligkeit"><?php echo __('FÃ€lligkeit anzeigen', 'wpsg'); ?></label>
-                        <input type="date" name="wpsg_Multirechnung_faelligkeitsdatum" value="<?php echo date('Y-m-d', strtotime('+'.intval($this->get_option("wpsg_rechnungen_faelligkeit")).' day')); ?>" />
-
-                        <input type="checkbox" name="wpsg_Multirechnung_url" value="1" id="invoice_url" />
-                        <label for="invoice_url"><?php echo __('URL Benachrichtigung', 'wpsg'); ?></label>
-                        <span></span>
-
-                        <span></span>
-                        <label for="invoice_date"><?php echo __('Rechnungsdatum', 'wpsg') ;?></label>
-                        <input type="date" value="<?php echo date('Y-m-d'); ?>" name="wpsg_Multirechnung_datum" id="invoice_date" />
-
-                        <span style="display:flex; justify-content:flex-start; gap:0.5rem; grid-column:1/span 3;">
-                            <input type="hidden" name="preview" id="wpsg_mod_rechnungen_preview" />
-                            <input type="submit" name="wpsg_order_doaction" value="<?php echo _('Vorschau'); ?>" id="wpsg_mod_rechnungen_button_preview" />                    
-                            <input type="submit" name="wpsg_order_doaction" value="<?php echo _('Erstellen'); ?>" id="wpsg_mod_rechnungen_button_submit"  />
-                        </span>
-
-                    </div>
-                    
-                    <script>
-                        
-                        let el_order_form = document.getElementById('order_form'); 
-                    
-                        document.getElementById('wpsg_mod_rechnungen_button_preview').addEventListener('click', () => {
-							
-							el_order_form.setAttribute('target', '_blank');
-							document.getElementById('wpsg_mod_rechnungen_preview').value = '1'; 
-						
-						} );
-						
-                        document.getElementById('wpsg_mod_rechnungen_button_submit').addEventListener('click', () => { 
-						
-							el_order_form.setAttribute('target', '');
-							document.getElementById('wpsg_mod_rechnungen_preview').value = '0'; 
-						
-						} );
-                            
-                    </script>
-                    
-                </div>
-
-                <script>
-                    
-                    let el_multiRechnung_inform = document.getElementById('multiRechnung_inform');
-                    
-                    document.getElementById('wpsg_action').addEventListener('change', (event) => {
-                    	
-                        if (event.target.value === 'writeMultiRechnung') {
-                            
-                            el_multiRechnung_inform.style.display = 'block';
-                            
-                        } else {
-                    		
-                    		el_multiRechnung_inform.style.display = 'none';
-                    		
-                        }
-                    	
-                    });
-
-                    // let buttonClicked = false;
-
-                    // document.getElementById('wpsg_mod_rechnungen_button_submit').addEventListener('click', (event) => {
-
-                    //     if (buttonClicked) {
-
-                    //         event.preventDefault();
-                    //         return false;
-
-                    //     }
-
-                    //     // Button deaktivieren und ausgrauen
-                    //     document.getElementById('wpsg_mod_rechnungen_button_submit').style.opacity = '0.5';
-                    //     document.getElementById('wpsg_mod_rechnungen_button_submit').style.pointerEvents = 'none';
-
-                    //     // Button nach 4 Sekunden wieder aktivieren
-                    //     setTimeout(() => {
-
-                    //         document.getElementById('wpsg_mod_rechnungen_button_submit').style.opacity = '1';
-                    //         document.getElementById('wpsg_mod_rechnungen_button_submit').style.pointerEvents = 'auto';
-                    //         buttonClicked = false;
-
-                    //     }, 4000);
-
-                    //     buttonClicked = true;
-                    //     return true;
-
-                    // });
-                     
-                </script>
-                
-            </div>
-
-            <div style="margin-right:-15px;">
-                <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-            </div>
-
-            <div class="wpsg_clear"></div>
-
-            <?php $this->callMod('wpsg_mod_export', 'produkt_index_foot'); ?>
-
-		<?php } else { ?>
-
-            <?php echo wpsg_drawForm_AdminboxStart(); ?>
-    		<?php echo __('Keine Bestellungen in der Datenbank.', 'wpsg'); ?>
-            <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-		<?php } ?>
-		<input id="noheader1" type="hidden" name="noheader1" value="1" />
-		</form>
-	</div>
-    
-    <?php if ($this->hasMod('wpsg_mod_kundenkontakt')) { $this->callMod('wpsg_mod_kundenkontakt', 'order_index_bottom'); } ?>
-
-<script>
-
-    <?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo @$this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower(@$this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-
-    function wpsg_order_checkAll()
-    {
-
-        jQuery('.col_set_checkbox').each(function() { jQuery(this).prop('checked', !jQuery(this).prop('checked')); } );
-
-    }
-	
-	<?php if ($this->hasMod('wpsg_mod_productgroups') && $this->get_option('wpsg_mod_productgroups_order_filter') === '1') { ?>
-    function wpsg_setFilterProductgroup(pgroup_id) {
-
-		jQuery('#filterproductgroup_id').val(pgroup_id);
-
-		jQuery('#seite').val(1);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-    	
-	}
-	<?php } ?>
-    
-	function wpsg_setFilterStatus(state)
-	{
-
-		jQuery('#filterstatus').val(state);
-
-		jQuery('#seite').val(1);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	}
-
-	function goPage(page)
-	{
-
-		//if (page <= 0 || page == <?php echo $this->view['arFilter']['page']; ?> || page > <?php echo wpsg_getStr($this->view['pages'], '0'); ?>) return;
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-    jQuery(document).ready(function() {
-
-        jQuery('.wpsg-order-tab-mods').bind('click', function() {
-
-            if (jQuery(this).hasClass('active'))
-            {
-
-                jQuery(this).removeClass('active');
-                jQuery('.' + jQuery(this).attr("id")).slideUp(250); 
-                
-            }
-            else
-            {
-                
-                jQuery(this).addClass('active');
-                jQuery('.' + jQuery(this).attr("id")).slideDown(250);
-
-                if (jQuery(this).attr("id") === 'wpsg-order-tab-add') jQuery('#search_customer').focus(); 
-                    
-            }
-
-            return false;
-
-        } );
-
-    } );
-	
-	<?php if ($this->hasMod('wpsg_mod_kundenkontakt')) { ?>
-	document.getElementById('wpsg_action').addEventListener('click', (event) => {
-		
-		console.log('OK');
-		
-    });
-	<?php } ?>
-
-</script>
+</div>
Index: /views/order/orderlog.phtml
===================================================================
--- /views/order/orderlog.phtml	(revision 5261)
+++ /views/order/orderlog.phtml	(revision 5261)
@@ -0,0 +1,32 @@
+<?php
+
+	/**
+	 * Template fÃŒr das Bestell Log
+	 */
+
+?>
+<?php if (is_array($this->view['log']) && sizeof($this->view['log']) > 0) { ?>
+<table class="wpsg_orderlog">
+	<tr>
+		<th class="col_date"><?php echo __('Datum', 'wpsg'); ?></th>
+		<th class="col_title"><?php echo __('Titel', 'wpsg'); ?></th>
+		<th class="col_aktion"></th>
+	</tr>		
+	<?php foreach ($this->view['log'] as $l) { ?>
+	<tr>
+		<td class="col_date"><?php echo date('d.m.Y H:i:s', strtotime($l['cdate'])); ?></td>
+		<td class="col_title"><?php echo $l['title']; ?></td>
+		<td class="col_aktion">
+			<a href="#" onclick="jQuery('#wpsg_mailtext_<?php echo $l['id']; ?>').toggle(); return false"><?php echo __('Anzeigen/Verbergen', 'wpsg'); ?></a>
+		</td>
+	</tr>
+	<tr id="wpsg_mailtext_<?php echo $l['id']; ?>" style="display:none;">							
+		<td colspan="3" class="col_mailtext">
+			<textarea readonly="readonly"><?php echo wpsg_xss($l['mailtext']); ?></textarea>
+		</td>
+	</tr>
+	<?php } ?>							
+</table>
+<?php } else { ?>
+<?php echo __('Noch keine EintrÃ€ge', 'wpsg'); ?>
+<?php } ?>
Index: ews/order/product_table.phtml
===================================================================
--- /views/order/product_table.phtml	(revision 8528)
+++ 	(revision )
@@ -1,412 +1,0 @@
-<?php
- 
-    /**
-     * Template fÃŒr die Produkttabelle im Backend der Bestellverwaltung
-     */
-	    
-    $arCalculation = $this->view['oCalculation']->getCalculationArray(true);
-	$arTax = $this->view['oCalculation']->getTaxLabelArray();
-	$arTaxShort = $this->view['oCalculation']->getTaxLabelArray(true);
-	     
-    $this->view['colspan'] = 3;
-    if ($this->get_option('wpsg_showMwstAlways') == '1' || sizeof($arCalculation['tax']) > 1) $this->view['colspan'] ++;
-    
-    $this->view['arCalculation'] = $arCalculation;
-            
-    if ($this->getBackendTaxView() === WPSG_NETTO) $display = 'netto';
-    else $display = 'brutto';
- 
-?>
-
-<style>
-
-	.wpsg_row_small td { font-size:0.8em; }
-	#wpsg-bs .wpsg_row_small  .wpsg-glyphlink-td > span { margin-top:0px; }
-	/*.wpsg_productrow_add td { border-top:0px !important; }*/
-
-</style>
-
-<?php echo wpsg_drawForm_Select('tax_mode', __('Besteuerung'), [
-		\wpsg\wpsg_calculation::TAXMODE_SMALLBUSINESS => __('Kleinunternehmerregelung'),
-		\wpsg\wpsg_calculation::TAXMODE_B2C => __('Endkundenbesteuerung'),
-		\wpsg\wpsg_calculation::TAXMODE_B2B => __('Firmenkundenbesteuerung (USTIdNr)')
-	], $this->view['oCalculation']->getTaxMode(), ['onchange' => 'WPSG_BE.updateCalculation();', 'help' => 'tax_mode']); ?>
-
-<br />
-
-<table class="wpsg_produkte table">
-	<thead>
-		<tr class="wpsg_kopf">
-			<th class="wpsg_cell_name"><?php echo __('Produktname', 'wpsg'); ?></th>
-			<th class="wpsg_cell_preis"><?php echo __('Einzelpreis', 'wpsg'); ?></th>
-			<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-				<th class="wpsg_cell_mwst"><?php echo __("MwSt.", "wpsg"); ?></th>
-			<?php } ?>
-			<th class="wpsg_cell_menge"><?php echo __("Anzahl", "wpsg"); ?></th>
-			<th class="wpsg_cell_gesamtpreis"><?php echo __("Gesamtpreis", "wpsg"); ?></th>
-		</tr>
-	</thead>
-	<tbody>
-
-		<tr><td colspan="<?php echo $this->view['colspan'] + 1; ?>" style="line-height:2px; height:2px; background-color:#999999; padding:0px;"></td></tr>
-		<?php $i = 0; foreach ($arCalculation['product'] as $p) { $i ++; $product_price = $p[$display.'_single'];
-			
-			$oProduct = wpsg_product::getInstance(intval($p['product_id']));
-			if (($p['product_key']??'') !== '') $oProduct->setProductKey($p['product_key']);
-			
-			?>
-			<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
-				<td colspan="<?php echo $this->view['colspan'] + 1; ?>">
-					
-					<?php if (wpsg_isTrue($p['eu'])) { ?>
-						<img src="<?php echo WPSG_URL; ?>views/gfx/eu.png" alt="<?php echo __('Produkt unterliegt der EU-Leistungsortregel', 'wpsg'); ?>" title="<?php echo __('Produkt unterliegt der EU-Leistungsortregel', 'wpsg'); ?>" height="14" />
-					<?php } ?>
-					
-					<a href="<?php 
-						
-						echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$p['product_id'], 'wpsg-product-edit-'.wpsg_getInt($p['product_id']));						
-						                
-					?>" title="<?php echo __('Zum Produkt', 'wpsg'); ?>">
-						<?php echo wpsg_hspc($oProduct->getProductName(false)); ?>
-					</a>
-					<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Produkt bearbeiten', 'wpsg'); ?>" onclick="return WPSG_BE_Product.editProduct(<?php echo $p['order_product_id']; ?>);"><span class="glyphicon glyphicon-pencil"></span></a>
-					<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Produkt lÃ¶schen', 'wpsg'); ?>" onclick="return WPSG_BE_Product.removeProduct(<?php echo $p['order_product_id']; ?>);"><span class="glyphicon glyphicon-trash"></span></a>
-				</td>
-			</tr>
-            <?php $this->callMods('order_view_row_before', array(&$p, $i)); ?>
-			<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?> wpsg_productrow_add">
-				<td class="wpsg_cell_name"></td>
-				<td class="wpsg_cell_preis"><?php echo wpsg_ff($product_price); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
-				<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>					
-					<td class="wpsg_cell_mwst"><?php 
-							
-						echo (($p['brutto'] === $p['netto'])?wpsg_ff(0, '%'):$arTaxShort[$p['tax_key']]);
-							
-					?></td>					
-				<?php } ?>
-				<td class="wpsg_cell_menge"><?php echo wpsg_hspc($p['amount']); ?></td>
-				<td class="wpsg_cell_gesamtpreis"><?php echo wpsg_ff($p['amount'] * $product_price); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
-			</tr>
-			<?php $this->callMods('order_view_row', array(&$p, $i)); ?>
-			<tr><td colspan="<?php echo $this->view['colspan'] + 1; ?>" style="line-height:2px; height:2px; background-color:#999999; padding:0px;"></td></tr>
-		<?php } ?>
-		
-		<?php // Gutscheine  ?>
-		<?php if (wpsg_isSizedArray($arCalculation['voucher'])) { ?>
-			
-			<?php foreach ($arCalculation['voucher'] as $v) { ?>
-
-				<tr class="wpsg_row_discount wpsg_row_small">
-					<td colspan="" class="wpsg_cell_mwst_label">
-
-						<div>
-							<?php echo __('Gutschein', 'wpsg'); ?>
-							
-							<?php if ($this->getBackendTaxView() === WPSG_BRUTTO) { ?>
-								<?php echo __('(inkl. MwSt.)', 'wpsg'); ?>
-							<?php } else { ?>
-								<?php echo __('(zzgl. MwSt.)', 'wpsg'); ?>
-							<?php } ?>
-
-							<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Gutschein bearbeiten', 'wpsg'); ?>" onclick="return WPSG_BE_Voucher.editVoucher(<?php echo $v['order_voucher_id']; ?>);"><span class="glyphicon glyphicon-pencil"></span></a>
-							<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Gutschein lÃ¶schen', 'wpsg'); ?>" onclick="return WPSG_BE_Voucher.removeVoucher(<?php echo $v['order_voucher_id']; ?>);"><span class="glyphicon glyphicon-trash"></span></a>
-						</div>
-						<div>
-							Code: <?php echo $v['code']; ?>
-						</div>
-
-					</td>
-					<td class="wpsg_cell_preis">
-						
-						<?php if (strpos($v['set'], '%') === false) { ?>
-							<?php echo wpsg_ff($v[$display], $this->get_option('wpsg_currency')); ?>
-						<?php } else { ?>
-							<?php echo wpsg_ff($v['set'], '%'); ?>
-						<?php } ?>
-						
-					</td>
-					<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-						<td class="wpsg_cell_mwst"><?php echo $arTaxShort[$v['tax_key']]; ?></td>
-					<?php } ?>
-					<td>1</td>
-					<td class="wpsg_cell_mwst_value wpsg_cell_gesamtpreis"><?php 
-							
-						echo wpsg_ff($v['set']); ?> <?php echo $this->get_option('wpsg_currency');
-						
-						if (strpos($v['set'], '%') !== false) { 
-
-							echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($v['set']), '%').')</span>';
-
-						} 
-							
-					?></td>
-				</tr>
-			
-			<?php } ?>
-			<tr><td colspan="<?php echo $this->view['colspan'] + 1; ?>" style="line-height:2px; height:2px; background-color:#999999; padding:0px;"></td></tr>
-		
-		<?php } ?>
-
-		<tr class="wpsg_row_summe">
-			<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
-				
-				<?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
-					
-					<?php echo wpsg_translate(__('Summe (zzgl. #1#)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'" target="_blank">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-				
-				<?php } else { ?>
-					
-					<?php if ($this->get_option('wpsg_preisangaben') == WPSG_NETTO) { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#, zzgl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'" target="_blank">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-					<?php } else { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#, inkl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'" target="_blank">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-					<?php } ?>
-				
-				<?php } ?>
-
-			</td>
-			<td class="wpsg_cell_summe_value wpsg_cell_gesamtpreis">
-				
-				<?php echo wpsg_ff($arCalculation['sum']['productsum_'.$display]); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-
-			</td>
-		</tr>
-		
-		<?php // Versandkosten  ?>
-		<?php $price_shipping = $arCalculation['sum']['shipping_'.$display]; ?>
-		<?php if ($price_shipping != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?>
-			<tr class="wpsg_row_shipping">
-				<td class="wpsg_cell_shipping_label" colspan="2">
-					<?php echo __('Versandkosten', 'wpsg'); ?>
-					<?php echo __('  ('.$this->arShipping[$arCalculation['shipping'][0]['shipping_key']]['name'].')', 'wpsg'); ?>
-					<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Versandart Ã€ndern', 'wpsg'); ?>"  onclick="return WPSG_BE_Pay_Ship.changeShippingPayment();"><span class="glyphicon glyphicon-pencil"></span></a>
-				</td>
-				<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-
-				<td><?php echo (($arCalculation['shipping'][0]['brutto'] === $arCalculation['shipping'][0]['netto'])?wpsg_ff(0, '%'):$arTaxShort[$arCalculation['shipping'][0]['tax_key']]); ?></td> 
-				
-				<?php } ?>
-				<td class="wpsg_cell_shipping_value wpsg_cell_gesamtpreis" colspan="2">
-					<span id="wpsg_cell_shipping_value"><?php echo wpsg_ff($price_shipping); ?> </span>
-					<?php echo $this->get_option('wpsg_currency'); ?>
-					
-					<?php if (strpos($arCalculation['shipping'][0]['set'], '%') !== false) { 
-
-						echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($arCalculation['shipping'][0]['set']), '%').')</span>';
-
-					} ?>
-					
-				</td>
-			</tr>
-		<?php } ?>
-		
-		<?php // Zahlungskosten  ?>
-		<?php $price_payment = $arCalculation['sum']['payment_'.$display]; ?>
-		<?php if ($price_payment != 0 || $this->get_option('wpsg_hideemptypayment') != '1') { ?>
-			<tr class="wpsg_row_payment">
-				<td colspan="2" class="wpsg_cell_payment_label">
-					<?php echo __('Zahlungsart', 'wpsg'); ?>
-					<?php echo __('  ('.$this->arPayment[$arCalculation['payment'][0]['payment_key']]['name'].')', 'wpsg'); ?>
-					<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Zahlungsart Ã€ndern', 'wpsg'); ?>" onclick="return WPSG_BE_Pay_Ship.changeShippingPayment();"><span class="glyphicon glyphicon-pencil"></span></a>
-				</td>
-				<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-
-					<td><?php echo (($arCalculation['payment'][0]['brutto'] === $arCalculation['payment'][0]['netto'])?wpsg_ff(0, '%'):$arTaxShort[$arCalculation['payment'][0]['tax_key']]); ?></td> 
-
-				<?php } ?>
-				<td class="wpsg_cell_payment_value wpsg_cell_gesamtpreis" colspan="2">
-					<span id="wpsg_cell_payment_value"><?php echo wpsg_ff($price_payment); ?> </span>
-					<?php echo $this->get_option('wpsg_currency'); ?>
-					
-					<?php if (strpos($arCalculation['payment'][0]['set'], '%') !== false) {
-						
-						echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($arCalculation['payment'][0]['set']), '%').')</span>';
-						
-					} ?>
-					
-				</td>
-			</tr>
-		<?php } ?>
-		
-		<?php // Rabatte  ?>
-		<?php if (wpsg_isSizedArray($arCalculation['discount'])) { ?>			
-			<?php foreach ($arCalculation['discount'] as $d) { ?>
-				<tr class="wpsg_row_discount wpsg_row_small">
-					<td colspan="" class="wpsg_cell_mwst_label">
-						
-						<?php echo __('Rabatt', 'wpsg'); ?>
-						
-						<?php if ($this->getBackendTaxView() === WPSG_BRUTTO) { ?>
-							<?php echo __('(inkl. MwSt.)', 'wpsg'); ?>
-						<?php } else { ?>
-							<?php echo __('(zzgl. MwSt.)', 'wpsg'); ?>
-						<?php } ?>
-
-						<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Rabatt bearbeiten', 'wpsg'); ?>" onclick="return WPSG_BE_Discount.editDiscount();"><span class="glyphicon glyphicon-pencil"></span></a>
-						<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Rabatt lÃ¶schen', 'wpsg'); ?>" onclick="return WPSG_BE_Discount.removeDiscount();"><span class="glyphicon glyphicon-trash"></span></a>
-
-					</td>
-					<td class="wpsg_cell_preis">
-						
-						<?php if (strpos($d['set'], '%') === false) { ?>
-							<?php echo wpsg_ff($arCalculation['sum']['discount_'.$display], $this->get_option('wpsg_currency')); ?>
-						<?php } else { ?>
-							<?php echo wpsg_ff($d['set'], '%'); ?>
-						<?php } ?>
-						
-					</td>
-					<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-						<td class="wpsg_cell_mwst"><?php echo $arTaxShort[$d['tax_key']]; ?></td>
-					<?php } ?>
-					<td></td>
-					<td class="wpsg_cell_mwst_value wpsg_cell_gesamtpreis">
-						<?php echo wpsg_ff($arCalculation['sum']['discount_'.$display]); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-					</td>
-				</tr>
-			<?php } ?>
-		<?php } ?>
-		
-		<?php if ($this->getBackendTaxView() === WPSG_NETTO) { ?>
-			
-			<tr class="wpsg_row_gesamt">
-				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
-					<?php echo __('Summe', 'wpsg'); ?>
-					<?php echo __('(zzgl. MwSt.)', 'wpsg'); ?>
-				</td>
-				<td class="wpsg_cell_gesamt_value wpsg_cell_gesamtpreis">
-					<?php echo wpsg_ff($arCalculation['sum'][$display]); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-				</td>
-			</tr>
-			<?php foreach ($arCalculation['tax'] as $tax) { if ($tax['sum'] > 0 && $tax['key'] != '0') { ?>
-				<tr class="wpsg_row_mwst wpsg_row_small">
-					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_mwst_label">
-						<?php echo wpsg_translate(__('zuzÃŒglich MwSt. (#1#)', 'wpsg'), $arTax[$tax['key']]); ?>
-					</td>
-					<td class="wpsg_cell_mwst_value wpsg_cell_gesamtpreis">
-						<?php echo wpsg_ff($tax['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-					</td>
-				</tr>
-			<?php } } ?>
-			<tr class="wpsg_row_gesamt">
-				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
-					<strong><?php echo __('Gesamtsumme', 'wpsg'); ?></strong>
-					<?php echo __('(inkl. MwSt.)', 'wpsg'); ?>
-				</td>
-				<td class="wpsg_cell_gesamt_value wpsg_cell_gesamtpreis">
-					<strong><?php echo wpsg_ff($arCalculation['sum']['brutto']); ?> <?php echo $this->get_option('wpsg_currency'); ?></strong>
-				</td>
-			</tr>
-			
-		<?php } else { ?>
-
-			<tr class="wpsg_row_gesamt">
-				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
-					<strong><?php echo __('Gesamtsumme', 'wpsg'); ?></strong>
-					<?php if ($this->getBackendTaxView() === WPSG_BRUTTO) { ?>
-						<?php echo __('(inkl. MwSt.)', 'wpsg'); ?>
-					<?php } else { ?>
-						<?php echo __('(zzgl. MwSt.)', 'wpsg'); ?>
-					<?php } ?>
-				</td>
-				<td class="wpsg_cell_gesamt_value wpsg_cell_gesamtpreis">
-					<strong><?php echo wpsg_ff($arCalculation['sum']['brutto']); ?> <?php echo $this->get_option('wpsg_currency'); ?></strong>
-				</td>
-			</tr>			
-            
-            <?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
-                 <tr class="wpsg_row_mwst wpsg_row_small">
-                    <td class="wpsg_cell_mwst_value wpsg_cell_gesamtpreis" colspan="<?php echo $this->view['colspan'] + 1; ?>">
-                        <?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?>
-                    </td>
-                 </tr>
-            <?php } else { ?>
-            
-                <?php foreach ($arCalculation['tax'] as $tax) { if ($tax['sum'] > 0 && $tax['key'] != '0') { ?>
-                    <tr class="wpsg_row_mwst wpsg_row_small">
-                        <td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_mwst_label">
-                            <?php echo wpsg_translate(__('darin enthaltene MwSt. (#1#)', 'wpsg'), $arTax[$tax['key']]); ?>                           
-                        </td>
-                        <td class="wpsg_cell_mwst_value wpsg_cell_gesamtpreis">
-                            <?php echo wpsg_ff($tax['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-                        </td>
-                    </tr>
-                <?php } } ?>
-                
-            <?php } ?>
-			
-		<?php } ?>
-		
-		<?php // Wertgutscheine  ?>
-		<?php if (wpsg_isSizedArray($arCalculation['coupon'])) { ?>
-			
-			<?php foreach ($arCalculation['coupon'] as $c) { ?>
-
-				<tr class="wpsg_row_discount wpsg_row_small">
-					<td colspan="" class="wpsg_cell_mwst_label">
-
-						<div>
-							<?php echo __('Wertgutschein', 'wpsg'); ?>
-							
-							<?php if ($this->getBackendTaxView() === WPSG_BRUTTO) { ?>
-								<?php echo __('(inkl. MwSt.)', 'wpsg'); ?>
-							<?php } else { ?>
-								<?php echo __('(zzgl. MwSt.)', 'wpsg'); ?>
-							<?php } ?>
-
-							<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Wertgtschein bearbeiten', 'wpsg'); ?>" onclick="return WPSG_BE_Voucher.editVoucher(<?php echo $c['order_voucher_id']; ?>);"><span class="glyphicon glyphicon-pencil"></span></a>
-							<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Wertgutschein lÃ¶schen', 'wpsg'); ?>" onclick="return WPSG_BE_Voucher.removeVoucher(<?php echo $c['order_voucher_id']; ?>);"><span class="glyphicon glyphicon-trash"></span></a>
-						</div>
-						<div>
-							Code: <?php echo $c['code']; ?>
-						</div>
-
-					</td>
-					<td class="wpsg_cell_preis">
-						
-						<?php if (strpos($c['set'], '%') === false) { ?>
-							<?php echo wpsg_ff($c[$display], $this->get_option('wpsg_currency')); ?>
-						<?php } else { ?>
-							<?php echo wpsg_ff($c['set'], '%'); ?>
-						<?php } ?>
-
-					</td>
-					<?php if (sizeof($arCalculation['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-						<td class="wpsg_cell_mwst"><?php echo $arTaxShort[$c['tax_key']]; ?></td>
-					<?php } ?>
-					<td>1</td>
-					<td class="wpsg_cell_mwst_value wpsg_cell_gesamtpreis"><?php
-							
-							echo wpsg_ff($c[$display]); ?> <?php echo $this->get_option('wpsg_currency');
-							
-							if (strpos($c['set'], '%') !== false) {
-								
-								echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($c['set']), '%').')</span>';
-								
-							}
-						
-						?></td>
-				</tr>
-			
-			<?php } ?>
-
-			<tr class="wpsg_row_gesamt">
-				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
-					<strong><?php echo __('Zu zahlen', 'wpsg'); ?></strong>
-					<?php if ($this->getBackendTaxView() === WPSG_BRUTTO) { ?>
-						<?php echo __('(inkl. MwSt.)', 'wpsg'); ?>
-					<?php } else { ?>
-						<?php echo __('(zzgl. MwSt.)', 'wpsg'); ?>
-					<?php } ?>
-				</td>
-				<td class="wpsg_cell_gesamt_value wpsg_cell_gesamtpreis">
-					<strong><?php echo wpsg_ff($arCalculation['sum']['topay_brutto']); ?> <?php echo $this->get_option('wpsg_currency'); ?></strong>
-				</td>
-			</tr>
-		
-		<?php } ?>	
-	
-	</tbody>
-</table>
-
-<?php // wpsg_debug($arCalculation);  ?>
-	
Index: /views/order/view.phtml
===================================================================
--- /views/order/view.phtml	(revision 8528)
+++ /views/order/view.phtml	(revision 5261)
@@ -6,181 +6,576 @@
 
 ?>
-<div class="wpsg_order_view" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order"><?php echo __("BestellÃŒbersicht", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_showhide_filter active"><a onclick="return false;"><?php echo __("Bestellansicht (Detail)", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_top_extend" id="wpsg_be_orderdata">
-
-						<?php echo $this->view['oOrder']->getInvoiceFirstName().' '.$this->view['oOrder']->getInvoiceName().' / '.wpsg_ff($this->view['oOrder']->getAmount($this->getBackendTaxview()), $this->get_option('wpsg_currency')); ?>
-
-						<?php if (trim($this->view['oOrder']->admincomment) != "") { ?>
-							<a title="<?php echo __("Kommentar (Admin): ", "wpsg").htmlspecialchars($this->view['oOrder']->admincomment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign commenticon admincomment" href="#"></a>
+<script type="text/javascript">/* <![CDATA[ */
+
+	function wpsg_editInvoiceAdress()
+	{
+
+		jQuery('#wpsg_InvoiceDialog').dialog( {                   
+	        'dialogClass': 'wp-dialog',           
+	        'modal': true,
+	        'width': 600,
+	        'title': '<?php echo __('Anschrift Ã€ndern (Kundendaten)', 'wpsg'); ?>',
+	        'autoOpen': true, 
+	        'closeOnEscape': true,      
+	        'buttons': {
+	            "<?php echo __('Speichern', 'wpsg'); ?>": function() {
+
+					jQuery('#wpsg_backend_loading').show();
+					jQuery(this).dialog('close');
+	            							            	
+					jQuery.ajax( {
+						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=saveInvoiceAdress&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1',
+						data: {
+							form_data: jQuery('#wpsg_InvoiceDialog input, #wpsg_InvoiceDialog select').serialize()
+						},
+						success: function(data) {
+							
+							location.href = location.href;
+							
+						}
+					} );
+	                
+	            }
+	        }
+	    } );
+
+		return false;
+		
+	}
+ 
+ 	function wpsg_reloadOrderLog()
+	{
+
+		jQuery('#wpsg_orderlog_content').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
+    	
+		jQuery.ajax( { 
+			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=orderLog&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1',
+			success: function(data) {
+				jQuery('#wpsg_orderlog_content').html(data);
+			}
+		} );
+		
+		return false;
+	
+	} // function wpsg_reloadOrderLog()
+
+	jQuery(document).ready(function() {
+
+		jQuery('body').append('<div id="wpsg_backend_loading" style="display:none;"><div class="wpsg_inner"><?php echo __('Bestellung wird aktualisiert.', 'wpsg'); ?><br /><br /><img src="<?php echo $this->getRessourceURL('gfx/ajax-loader.gif'); ?>" alt="" /></div></div>');
+		 
+		jQuery("#normal-sortables, #side-sortables").sortable({
+			connectWith: ".meta-box-sortables",
+			placeholder: 'wpsg_placeholder',
+			dropOnEmpty: true,
+			cursor: 'move',
+			grid: [50, 20], 
+			items: ".postbox",
+			handle: '.wpsg_handlediv',
+			forceHelperSize: true,
+			forcePlaceholderSize: true,
+			opacity: 0.8,
+			stop: function(e,ui) {
+
+				var ser = jQuery("#normal-sortables").sortable("serialize");					
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+
+				jQuery.cookie('wpsg_order_view_normal', ser);
+
+				var ser = jQuery("#side-sortables").sortable("serialize");	 		
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+
+				jQuery.cookie('wpsg_order_view_side', ser);
+				
+			},
+			receive: function(e, ui) {
+			}
+		});  
+		
+		if (jQuery.cookie('wpsg_order_view_normal') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_order_view_normal').split(',').reverse();
+
+			for (index in divs)
+			{
+
+				jQuery('#normal-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+		
+		if (jQuery.cookie('wpsg_order_view_side') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_order_view_side').split(',').reverse();
+ 
+			for (index in divs)
+			{
+
+				jQuery('#side-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+		
+		jQuery('.wpsg_handlediv').bind('click', function() { 
+			jQuery(this).next().toggle();
+
+			var arClose = new Array();
+			jQuery('.wpsg_order_view .postbox .inside:hidden').each(function() {
+				arClose.push(jQuery(this).parent().attr("id"));
+			} );
+
+			jQuery.cookie('wpsg_order_closed', arClose.join(','));
+			
+		} );
+
+		if (jQuery.cookie('wpsg_order_closed') != null)
+		{
+
+			var arClose = jQuery.cookie('wpsg_order_closed').split(',');
+
+			for (index in arClose)
+			{
+
+				if (arClose[index].length > 0) jQuery('#' + arClose[index] + ' .inside').hide();
+							
+			}
+			
+		}
+
+	    jQuery('.wpsg_form_help').tipTip();
+ 		
+	} );
+	 
+/* ]]> */</script>
+
+<div class="wrap columns-2 wpsg_order_view">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	<h2>
+		<?php echo wpsg_translate(__('Bestellung #1#', 'wpsg'), $this->view['data']['onr']); ?>
+	</h2>
+	<br />
+	<?php echo $this->writeBackendMessage(); ?>
+	
+	<div id="postbox" class="metabox-holder has-right-sidebar">
+
+		<div id="side-info-column" class="inner-sidebar" style="width:386px;">			
+			<div id="side-sortables" class="meta-box-sortables meta-box-sortables ui-sortable" style="width:380px;">
+						
+				<div id="wpsg_ranschrift" class="postbox">
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Kundendaten', 'wpsg'); ?></span>
+					</h3>
+					<div class="inside">
+					
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Kundennummer', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>					
+									<?php echo wpsg_hspc($this->view['data']['knr']); ?>
+									<?php if ($this->hasMod('wpsg_mod_kundenverwaltung')) { ?>
+									[&nbsp;<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Customer&action=edit&edit_id=<?php echo $this->view['data']['k_id']; ?>"><?php echo __('Zum Kunden', 'wpsg'); ?></a>&nbsp;]</a>
+									<?php } ?>
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+										
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Anschrift', 'wpsg'); ?>:
+								<a style="float:none; display:inline-block;" onclick="return wpsg_editInvoiceAdress();" class="wpsg_icon wpsg_icon_edit" href="#" title="<?php echo __('Rechnungsanschrift Ã€ndern', 'wpsg'); ?>"></a>
+							</div>
+							<div class="wpsg_form_right">
+								<p>		
+									<?php if (trim($this->view['data']['firma']) != '') { ?>			
+									<?php echo wpsg_hspc($this->view['data']['firma']); ?><br />
+									<?php } ?>	
+									<?php echo (($this->view['data']['title'] != '' && $this->view['data']['title'] != '-1')?wpsg_hspc($this->view['data']['title']).' ':''); ?><?php echo wpsg_hspc($this->view['data']['vname']); ?> <?php echo wpsg_hspc($this->view['data']['name']); ?><br />
+									<?php echo wpsg_hspc($this->view['data']['strasse']); ?><br />
+									<?php echo wpsg_hspc($this->view['data']['plz']); ?> <?php echo wpsg_hspc($this->view['data']['ort']); ?> <?php echo wpsg_hspc($this->view['country']['kuerzel']); ?><br />
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						
+						<div id="wpsg_InvoiceDialog" class="wpsg_dialog" style="display:none;">
+							<?php echo wpsg_drawForm_Input('dialog_firma', __('Firma', 'wpsg'), $this->view['data']['firma']); ?>
+							<?php echo wpsg_drawForm_Select('dialog_title', __('Anschrift', 'wpsg'), $this->view['arTitles'], $this->view['data']['title'], array('noIndex' => true)); ?>
+							<?php echo wpsg_drawForm_Input('dialog_vname', __('Vorname', 'wpsg'), $this->view['data']['vname']); ?>
+							<?php echo wpsg_drawForm_Input('dialog_name', __('Name', 'wpsg'), $this->view['data']['name']); ?>
+							<?php echo wpsg_drawForm_Input('dialog_strasse', __('StraÃe', 'wpsg'), $this->view['data']['strasse']); ?>
+							<?php echo wpsg_drawForm_Input('dialog_plz', __('Postleitzahl', 'wpsg'), $this->view['data']['plz']); ?>
+							<?php echo wpsg_drawForm_Input('dialog_ort', __('Ort', 'wpsg'), $this->view['data']['ort']); ?>
+							<?php echo wpsg_drawForm_Select('dialog_land', __('Land', 'wpsg'), $this->view['arCountry'], $this->view['data']['land']); ?>
+							<br />
+							<?php echo wpsg_drawForm_Checkbox('dialog_shipping', __('Auch Lieferanschrift anpassen', 'wpsg'), false); ?>
+						</div>
+						
+						<?php if (strtotime($this->view['data']['geb']) > 0) { ?>
+						<?php echo wpsg_drawForm_Input('', __('Geburtsdatum', 'wpsg'), wpsg_fromDate($this->view['data']['geb']), array('text' => true)); ?>
 						<?php } ?>
-
-						<?php if (trim($this->view['oOrder']->comment) != "") { ?>
-							<a title="<?php echo __("Kommentar (Kunde): ", "wpsg").htmlspecialchars($this->view['oOrder']->comment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign commenticon customercomment" href="#"></a>
+						
+						<?php if (strlen($this->view['data']['fax']) > 0) { ?>
+						<?php echo wpsg_drawForm_Input('', __('Fax', 'wpsg'), $this->view['data']['fax'], array('text' => true)); ?>
 						<?php } ?>
-
-					</li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-
-				</ul>
+						
+						<?php if (strlen($this->view['data']['tel']) > 0) { ?>
+						<?php echo wpsg_drawForm_Input('', __('Telefon', 'wpsg'), $this->view['data']['tel'], array('text' => true)); ?>
+						<?php } ?>
+						
+						<?php if (strlen($this->view['data']['ustidnr']) > 0) { ?>
+						<?php echo wpsg_drawForm_Input('', __('UStIdNr.', 'wpsg'), $this->view['data']['ustidnr'], array('text' => true)); ?>
+						<?php } ?>
+						
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('E-Mail', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>					
+									<a href="mailto:<?php echo $this->view['data']['email']; ?>"><?php echo $this->view['data']['email']; ?></a>
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						
+						<?php $this->callMods('wpsg_order_view_customerdata', array(&$this->view['data']['id'])); ?>		
+						
+					</div>
+				</div>
+								
+				<div id="wpsg_shippayment" class="postbox">
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Versand- und Zahlungsart', 'wpsg'); ?></span>
+					</h3>
+					<div class="inside">
+					
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Versandart', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>					
+									<?php echo wpsg_hspc($this->view['oOrder']->getShippingTypName()); ?>
+									<?php if (isset($this->view['basket']['sum']['preis_shipping']) && $this->view['basket']['sum']['preis_shipping'] > 0) { ?>
+									(<?php echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')); ?>)
+									<?php } ?>
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+					
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Zahlungsart', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>					
+																	
+									<?php echo __($this->view['arPayment'][$this->view['data']['type_payment']]['name'], 'wpsg'); ?>
+									<?php if (isset($this->view['basket']['sum']['preis_payment']) && $this->view['basket']['sum']['preis_payment'] > 0) { ?>
+									(<?php echo wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')); ?>)
+									<?php } ?>
+									
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						<?php $this->callMods('order_view_afterpayment', array(&$this->view['data']['id'])); ?>
+					
+					</div>
+				</div>
+				
+				<?php if (trim($this->view['data']['order_comment']) != '') { ?>
+				<div id="wpsg_comment" class="postbox">
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Bestellkommentar (Kunde)', 'wpsg'); ?></span>
+					</h3>
+					<div class="inside">
+						<?php echo wpsg_hspc($this->view['data']['order_comment']); ?>
+					</div>
+				</div>
+				<?php } ?>
+				
+				<div id="wpsg_admincomment" class="postbox">
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Bestellkommentar (Admin)', 'wpsg'); ?></span>
+					</h3> 
+					<div class="inside">
+						<form action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&noheader=1&action=setAdminComment&edit_id=<?php echo $this->view['data']['id']; ?>" method="post">
+							<textarea class="wpsg_order_admincomment" name="wpsg_order_admincomment"><?php echo wpsg_hspc($this->view['data']['admincomment']); ?></textarea>
+							<input class="button wpsg_order_admincomment_submit" type="submit" value="<?php echo __('Senden', 'wpsg'); ?>" name="admincomment_submit" />
+						</form>
+					</div>
+				</div>
+				
+				<?php $this->callMods('order_view_sidebar', array(&$this->view['data']['id'])); ?>
+				
 			</div>
 		</div>
-
-    </nav>
+		
+		<div id="post-body">	
+			<div id="normal-sortables" class="meta-box-sortables" style="margin-right:400px;">	
+				<div class="postbox" id="wpsg_generally">		
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Allgemein', 'wpsg'); ?></span>
+					</h3>
+					<div class="inside wpsg_order_top">
+						
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Bestellnummer', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>					
+									<?php echo wpsg_hspc($this->view['data']['onr']); ?> [<?php echo wpsg_hspc($this->arStatus[$this->view['data']['status']]); ?>]
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						
+						<?php if (wpsg_isSizedString($this->view['data']['language']) && $this->view['data']['language'] != $this->getCurrentLanguage()) { $arLang = $this->getStoreLanguages(); $lang = $arLang[$this->view['data']['language']]; ?>
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Sprache', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>
+									<img src="<?php echo $this->getFlagURL().$lang['flag']; ?>" alt="<?php echo wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $lang['name']); ?>" />
+									<?php echo $lang['name']; ?>
+								</p>
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						<?php } ?>
+						
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('Bestelleingang', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">
+								<p>					
+									<?php echo date('d.m.Y H:i:s', strtotime($this->view['data']['cdate'])); ?>
+								</p>						
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						
+						<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;action=switchStatus&amp;edit_id=<?php echo $this->view['data']['id']; ?>&amp;noheader=1" enctype="multipart/form-data">
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<?php echo __('StatusÃ€nderung', 'wpsg'); ?>:
+							</div>
+							<div class="wpsg_form_right">								
+									<select id="wpsg_order_view_status" name="status" style="float:left;">
+										<?php foreach ($this->arStatus as $k => $v) { ?>
+										<option value="<?php echo wpsg_hspc($k); ?>" <?php echo (($k == $this->view['data']['status'])?'selected="selected"':''); ?>><?php echo wpsg_hspc($v); ?></option>
+										<?php } ?>					
+									</select>
+									&nbsp;<input style="width:auto;" type="submit" class="button wpsg_button" id="wpsg_order_view_status_submit" name="wpsg_statusaenderung" value="<?php echo __('Status Ã€ndern', 'wpsg'); ?>" />
+									<div class="wpsg_clear"></div>
+									<label style="line-height:250%;">
+										<input style="width:auto;" type="checkbox" value="1" name="sendMail" /> <?php echo __('Kunde informieren', 'wpsg'); ?>
+									</label>
+							</div>
+						</div>
+						<div class="wpsg_clear"></div> 
+						<?php $this->callMods('order_view_switchStatus', array(&$this->view['data']['id'])); ?>						
+						</form>
+						
+						<?php if (wpsg_isSizedInt($this->get_option('wpsg_debugModus'))) { ?>
+						<div class="wpsg_form_field">
+							<div class="wpsg_form_left">
+								<span class="wpsg_developer"><?php echo __('Entwickler Optionen', 'wpsg'); ?>:</span>
+							</div>
+							<div class="wpsg_form_right">
+								<span class="wpsg_developer">
+									<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_customermail&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Kundenmail simulieren (An Shop Betreiber)', 'wpsg'); ?></a><br />
+									<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_adminmail&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Adminmail simulieren', 'wpsg'); ?></a><br />
+									<a href="<?php echo $this->getDoneURL($this->view['data']['id']); ?>"><?php echo __('BestellabschluÃseite', 'wpsg'); ?></a><br />
+									<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_urlbuy&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('URL Benachrichtigung (Kauf) auslÃ¶sen', 'wpsg'); ?></a><br />
+									<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_urlpay&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('URL Benachrichtigung (Bezahlung) auslÃ¶sen', 'wpsg'); ?></a><br />
+									<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>&debugBasket=1"><?php echo __('Warenkorbdaten anzeigen', 'wpsg'); ?></a><br />
+									<?php if (wpsg_isSizedInt($_REQUEST['debugBasket'])) { ?>
+									<?php wpsg_debug($this->view['basket']); ?>
+									<?php } ?>
+								</span>
+							</div>
+						</div>
+						<div class="wpsg_clear"></div>
+						<?php } ?>
+						
+					</div>					
+				</div>
+								
+				<div class="postbox" id="wpsg_orderdata">		
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Bestelldaten', 'wpsg'); ?></span>
+					</h3>
+					<div class="inside">						
+						<table class="wpsg_produkte">
+							<tr class="wpsg_kopf">
+								<th class="wpsg_cell_name"><?php echo __('Produktname', 'wpsg'); ?></th>
+								<th class="wpsg_cell_preis"><?php echo __('Einzelpreis', 'wpsg'); ?></th>
+								<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+								<th class="wpsg_cell_mwst"><?php echo __("MwSt.", "wpsg"); ?></th>
+								<?php } ?>
+								<th class="wpsg_cell_menge"><?php echo __("Anzahl", "wpsg"); ?></th>
+								<th class="wpsg_cell_gesamtpreis"><?php echo __("Gesamtpreis", "wpsg"); ?></th>
+							</tr>
+							<?php $i = 0; foreach ($this->view['basket']['produkte'] as $produkt_key => $p) { $i ++; ?>
+							<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+								<td class="wpsg_cell_name">
+									<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id=<?php echo $this->getProduktID($p['id']); ?>" title="<?php echo __('Zum Produkt', 'wpsg'); ?>">
+										<?php echo wpsg_hspc($this->getProductName($this->getProduktID($p['id']))); ?>
+									</a>
+								</td>
+								<td class="wpsg_cell_preis"><?php echo wpsg_ff($p['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
+								<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+								<td class="wpsg_cell_mwst"><?php echo wpsg_ff($p['mwst_value']); ?> %</td>				
+								<?php } ?>
+								<td class="wpsg_cell_menge"><?php echo wpsg_hspc($p['menge']); ?></td>
+								<td class="wpsg_cell_gesamtpreis"><?php echo wpsg_ff($p['menge'] * $p['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
+							</tr>
+							<?php if (wpsg_isSizedArray($p['order_allowedshipping'])) { ?>
+							<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+								<td class="wpsg_cell_name">
+									<?php echo __('MÃ¶gliche Versandarten', 'wpsg'); ?>: 
+								</td>
+								<td class="wpsg_cell_gesamtpreis" colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?4:3); ?>">
+									<?php $j = 0; foreach ($p['order_allowedshipping'] as $shipping) { $j ++; ?>
+									<?php echo $this->getShippingName($shipping); ?><?php if ($j < sizeof($p['order_allowedshipping'])) { ?>, <?php } ?>
+									<?php } ?> 
+								</td>								
+							</tr>
+							<?php } ?>
+							<?php $this->callMods('order_view_row', array(&$p, $i)); ?>							
+							<?php } ?>
+							<?php if (isset($this->view['basket']['gs'])) { ?>
+							<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?> wpsg_gutschein">
+								<td class="wpsg_cell_name"><?php echo __('Gutschein', 'wpsg'); ?> <?php echo ($this->view['basket']['gs']['code'] != '')? '('.$this->view['basket']['gs']['code'].')':'' ?></td>
+								<td class="wpsg_cell_preis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?></td>
+								<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+								<td class="wpsg_cell_mwst"><?php echo __('anteilig', 'wpsg'); ?></td>
+								<?php } ?>
+								<td class="wpsg_cell_menge">1</td>
+								<td class="wpsg_cell_gesamtpreis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?></td>
+							</tr>
+							<?php } ?>
+							<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && $this->view['basket']['sum']['preis_rabatt'] > 0) { ?>
+							<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?> wpsg_row_rabatt">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_rabatt_label">
+									<?php echo __('AbzÃŒglich Rabatt', 'wpsg'); ?>
+								</td>
+								<td class="wpsg_cell_rabatt_value">
+									<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
+								</td>
+							</tr>
+							<?php } ?>							
+							<tr class="wpsg_row_summe">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
+									<?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
+										<?php echo wpsg_translate(__('Summe (zzgl. #1#)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'" target="_blank">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+									<?php } else { ?>
+										<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
+										<?php echo wpsg_translate(__('Summe (zzgl. #1#, zzgl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'" target="_blank">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+										<?php } else { ?>
+										<?php echo wpsg_translate(__('Summe (zzgl. #1#, inkl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'" target="_blank">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+										<?php } ?>
+									<?php } ?>
+								</td>
+								<td class="wpsg_cell_summe_value">
+									<?php echo wpsg_ff($this->view['basket']['sum']['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+								</td>
+							</tr>	
+							<?php if ($this->view['basket']['sum']['preis_shipping'] != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?>
+							<tr class="wpsg_row_shipping">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_shipping_label">
+									<a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>" target="_blank"><?php echo __('Versandkosten', 'wpsg'); ?></a>			
+								</td>
+								<td class="wpsg_cell_shipping_value">
+									<?php echo wpsg_ff($this->view['basket']['sum']['preis_shipping']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+								</td>
+							</tr>
+							<?php } ?>
+							<?php if ($this->view['basket']['sum']['preis_payment'] != 0 || $this->get_option('wpsg_hideemptypayment') != '1') { ?>
+							<tr class="wpsg_row_payment">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_payment_label">
+									<?php echo __('Zahlungsart', 'wpsg'); ?>
+								</td>
+								<td class="wpsg_cell_payment_value">
+									<?php echo wpsg_ff($this->view['basket']['sum']['preis_payment']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+								</td>
+							</tr>
+							<?php } ?>
+							<?php if ($this->get_option('wpsg_preisangaben') == '1' && $this->get_option('wpsg_kleinunternehmer') != '1') { ?>
+							<?php foreach ($this->view['basket']['mwst'] as $mwst_id => $mwst) { ?>
+							<tr class="wpsg_row_mwst">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_mwst_label">
+									<?php echo wpsg_translate(__('zuzÃŒglich MwSt. (#1#)', 'wpsg'), $mwst['name']); ?>
+								</td>
+								<td class="wpsg_cell_mwst_value">
+									<?php echo wpsg_ff($mwst['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+								</td>
+							</tr>
+							<?php } ?>
+							<?php } ?>
+							<tr class="wpsg_row_gesamt">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_gesamt_label">
+									<?php echo __('Gesamtpreis', 'wpsg'); ?>
+								</td>
+								<td class="wpsg_cell_gesamt_value">
+									<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+								</td>
+							</tr>		
+							<?php if ($this->get_option('wpsg_kleinunternehmer') == '1' || $this->get_option('wpsg_preisangaben') != '1') { ?>
+							<?php foreach ($this->view['basket']['mwst'] as $mwst_id => $mwst) { ?>
+							<tr class="wpsg_row_mwst">
+								<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_mwst_label">
+									<?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
+										<?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?>
+									<?php } else { ?>
+										<?php echo wpsg_translate(__('darin enthaltene MwSt. (#1#)', 'wpsg'), $mwst['name']); ?>
+									<?php } ?>
+								</td>
+								<td class="wpsg_cell_mwst_value">
+									<?php echo wpsg_ff($mwst['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+								</td>
+							</tr>
+							<?php } ?>
+							<?php } ?>
+						</table>
+						
+					</div>
+				</div>
+				
+				<?php $this->callMods('order_view_content', array($this->view['data']['id'])); ?>
+				
+				<div class="postbox" id="wpsg_orderlog">		
+					<h3 class="wpsg_handlediv">
+						<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+						<span><?php echo __('Bestellprotokoll', 'wpsg'); ?></span>
+					</h3>
+					<div class="inside" id="wpsg_orderlog_content">
+						<?php echo $this->view['orderLog']; ?>
+					</div>
+				</div>
+				
+			</div>
+						
+		</div>
+		
+	</div>
 	
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-
-    <div class="wpsg_admin_submenu">
-
-        <div class="list-group" id="wpsg_order_view_tabs">
-            <span class="list-group-head list-group-item"><?php echo wpsg_translate(__('Bestellung ID:#1#', 'wpsg'), $this->view['data']['id']); ?></span>
-
-            <?php $i = 0; foreach ($this->view['arSubAction'] as $k => $v) { $i ++; ?>
-
-            	<a class="list-group-item <?php echo ((wpsg_getStr($_COOKIE['wpsg_order_view_tab'], 'general') == $k)?'active':''); ?>" wpsg-data-target="<?php echo $k; ?>" href="#"><?php echo $v['title']; ?></a>
-            
-            <?php } ?>
-			
-        </div>
-
-		<div class="tag_actions orderdata_action">
-        
-			<a href="" id="LinkProduktNeu" onclick="return WPSG_BE_Product.addProduct();"><span class="glyphicon glyphicon-plus"></span>
-			
-				<?php echo __("Neues Produkt", "wpsg"); ?>
-				
-			</a><div class="wpsg_clear"></div>
-			
-			<a href="" id="LinkPaymantNeu" onclick="return WPSG_BE_Pay_Ship.changeShippingPayment();"><span class="glyphicon glyphicon-credit-card"></span>
-			
-				<?php echo __("Versand- und Zahlungsart bearbeiten", "wpsg"); ?>
-				
-			</a><div class="wpsg_clear"></div>
-		 
-			<?php if ($this->hasMod('wpsg_mod_gutschein')) { ?>        	
-											
-				<a href="" id="LinkGutscheinNeu" onclick="return WPSG_BE_Voucher.editVoucher(-1);"><span class="glyphicon glyphicon-plus"></span>
-				
-					<?php echo __("Gutschein bearbeiten", "wpsg"); ?>
-					
-				</a><div class="wpsg_clear"></div>
-				
-			<?php } ?>
-	
-			<div class="wpsg_clear"></div>
-			
-			<?php if ($this->hasMod('wpsg_mod_discount')) { ?>
-				<a href="" id="LinkRabattNeu" onclick="return WPSG_BE_Discount.editDiscount(<?php echo $_REQUEST['edit_id']; ?>);"><span class="glyphicon glyphicon-euro"></span>
-				
-					<?php echo __("Rabatt bearbeiten", "wpsg"); ?>
-					
-				</a><div class="wpsg_clear"></div>
-				
-			<?php } ?>
-						
-        	<a href="" id="LinkSendMail" onclick="return WPSG_BE_Mail.sendCustomerMail(<?php echo $_REQUEST['edit_id']; ?>);"><span class="glyphicon glyphicon-envelope"></span>
-        	
-	 			<?php echo __("BestellbestÃ€tigung (Kunde) versenden", "wpsg"); ?>
-	 			
-	 		</a><br />
-            
-            <a href="" id="LinkSendMail" onclick="return WPSG_BE_Mail.sendAdminMail(<?php echo $_REQUEST['edit_id']; ?>);"><span class="glyphicon glyphicon-envelope"></span>
-        	
-	 			<?php echo __("BestellbestÃ€tigung (Admin) versenden", "wpsg"); ?>
-	 			
-	 		</a><br />
-
-		</div>
-
-		<div id='wpsg_kv_list'>
-		</div>
-		
-    </div>
-
-    <div class="wpsg_admin_content form-horizontal">
-
-		<?php if ($this->view['oCalculation']->restored) { ?>
-
-			<div id="restored_notice">
-				<strong>Die Berechnung dieser Bestellung wurde rekonstruiert, da zum Bestellzeitpunkt nicht alle Shop Einstellungen erfasst wurden. Bitte ÃŒberprÃŒfen sie die Berechnung und vergleichen diese ggf. mit dem Bestellprotokoll. </strong>
-			</div>
-			
-		<?php } ?>
-		
-        <?php $i = 0; foreach ($this->view['arSubAction'] as $k => $v) { $i ++; ?>
-        <div id="tab<?php echo $k; ?>" style="display:<?php echo ((wpsg_getStr($_COOKIE['wpsg_order_view_tab'], 'general') == $k)?'block':'none'); ?>;" class="wpsg_order_view_tab_content">
-
-            <?php echo $v['content']; ?>
-
-        </div>
-        <?php } ?>
-
-    </div>
-
 </div>
-
-<script type="text/javascript">
-	
-	/**
-	 * Sendet eine eMail
-	 */
-	function wpsg_sendMail(oid)
-	{
-		
-		jQuery('#wpsg_produkte_table').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=sendMail&do=send&edit_id=' + oid + '&noheader=1',
-			success: function(data) {
-				jQuery('#wpsg_produkte_table').replaceWith(data);
-				location.href = location.href;
-			}
-		} );
-
-		return false;
-
-	} // function wpsg_sendMail()
-
-    jQuery(document).ready(function() {
-
-        jQuery('#wpsg_order_view_tabs a.list-group-item').bind('click', function() {
-
-            jQuery('#wpsg_order_view_tabs a').removeClass('active');
-            jQuery('.wpsg_order_view_tab_content').hide();
-
-			jQuery('.tag_actions').hide(); //ordertab_action
-			jQuery('.' + jQuery(this).attr('wpsg-data-target') + '_action').show();
-			
-			jQuery(this).addClass('active');
-            jQuery('#tab' + jQuery(this).attr('wpsg-data-target')).show();
-
-            jQuery.cookie('wpsg_order_view_tab', jQuery(this).attr('wpsg-data-target'));
-            jQuery(this).blur();
-
-        } );
-
-        var co = jQuery.cookie('wpsg_order_view_tab');
-        
-        if (co === undefined) {
-        	
-			jQuery("[wpsg-data-target='general']").trigger("click");
-			
-        } else {
-        	
-        	jQuery("[wpsg-data-target='" + co + "']").trigger("click");
-        	
-        }
-		
-    } );
-
-</script>
Index: ews/order/view_alternativeDesign.phtml
===================================================================
--- /views/order/view_alternativeDesign.phtml	(revision 8528)
+++ 	(revision )
@@ -1,489 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die alternative Ansicht einer Bestellung im Backend
-	 */
-
-?>
-
-<style>.orderdetail-alternative-left:active, .orderdetail-alternative-right:active { cursor: move; }</style>
-
-<div class="wpsg_order_view wpsg_order_view_alternativedesign" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-			</div>
-			<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order"><?php echo __("BestellÃŒbersicht", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_showhide_filter active"><a onclick="return false;"><?php echo __("Bestellansicht (Detail)", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_top_extend" id="wpsg_be_orderdata">
-
-						<?php echo $this->view['oOrder']->getInvoiceFirstName().' '.$this->view['oOrder']->getInvoiceName().' / '.wpsg_ff($this->view['oOrder']->getAmount($this->getBackendTaxview()), $this->get_option('wpsg_currency')); ?>
-
-						<?php if (trim($this->view['oOrder']->admincomment) != "") { ?>
-							<a title="<?php echo __("Kommentar (Admin): ", "wpsg").htmlspecialchars($this->view['oOrder']->admincomment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign commenticon admincomment" href="#"></a>
-						<?php } ?>
-
-						<?php if (trim($this->view['oOrder']->comment) != "") { ?>
-							<a title="<?php echo __("Kommentar (Kunde): ", "wpsg").htmlspecialchars($this->view['oOrder']->comment); ?>" onclick="return false;" class="glyphicon glyphicon-question-sign commenticon customercomment" href="#"></a>
-						<?php } ?>
-
-					</li>
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-					<li>
-						<a style="padding-top:11px;padding-bottom:11px;">
-							<button role="button" class="button btn-reset-itemorder">Anordnung der Kacheln zurÃŒcksetzen</button>
-						</a>
-					</li>
-				</ul>
-			</div>
-		</div>
-	</nav>
-
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-
-
-	<div class="orderdetail-alternative">
-		<div class="col-md-8 orderdetail-alternative-left connectedSortable">
-			<div id="item-general" class="orderdetail-item orderdetail-item-left orderdetail-item-_general">
-				<div id="item-general" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['general']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-orderdata" class="orderdetail-item orderdetail-item-left orderdetail-item-_orderdata">
-				<div id="item-orderdata" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['orderdata']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-ordervariables" class="orderdetail-item orderdetail-item-left orderdetail-item-_ordervariables">
-				<div id="item-ordervariables" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['950']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-customercontact" class="orderdetail-item orderdetail-item-left orderdetail-item-_customercontact">
-				<div id="item-customercontact" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['1000']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-bills" class="orderdetail-item orderdetail-item-left orderdetail-_item-bills">
-				<div id="item-bills" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['1400']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-deliverynotes" class="orderdetail-item orderdetail-item-left orderdetail-item-_deliverynotes">
-				<div id="item-deliverynotes" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['2000']['content']; ?>
-
-				</div>
-			</div>
-		</div> <!-- .orderdetail-alternative-left -->
-
-
-
-		<div class="col-md-4 orderdetail-alternative-right connectedSortable">
-			<div id="item-customerdata" class="orderdetail-item orderdetail-item-right orderdetail-item-_customerdata">
-				<div id="item-customerdata" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['customerdata']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-shippay" class="orderdetail-item orderdetail-item-right orderdetail-item-_shippay">
-				<div id="item-shippay" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['shippay']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-confirmation" class="orderdetail-item orderdetail-item-right orderdetail-item-_confirmation">
-				<div id="item-confirmation" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['70']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-trustedshops" class="orderdetail-item orderdetail-item-right orderdetail-item-_trustedshops">
-				<div id="item-trustedshops" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['5000']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-orderlog" class="orderdetail-item orderdetail-item-right orderdetail-item-_orderlog">
-				<div id="item-orderlog" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['orderlog']['content']; ?>
-
-				</div>
-			</div>
-			<div id="item-dev" class="orderdetail-item orderdetail-item-right orderdetail-item-_dev">
-				<div id="item-dev" class="orderdetail-item-inner">
-
-					<?php echo $this->view['arSubAction']['dev']['content']; ?>
-
-				</div>
-			</div>
-		</div> <!-- .orderdetail-alternative-right -->
-	</div>
-
-
-</div>
-
-
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	/**
-	 * Ersetzt jedes Vorkommen eines Charaktersets in einem String
-	 */
-	String.prototype.replaceAll = function(search, replacement)
-	{
-
-		let target = this;
-		return target.split(search).join(replacement);
-
-	}; // String.prototype.replaceAll()
-
-	/**
-	 * Sendet eine eMail
-	 */
-	function wpsg_sendMail(oid)
-	{
-		jQuery('#wpsg_produkte_table').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=sendMail&do=send&edit_id=' + oid + '&noheader=1',
-			success: function(data) {
-				jQuery('#wpsg_produkte_table').replaceWith(data);
-				location.href = location.href;
-			}
-		} );
-
-		return false;
-
-	} // function wpsg_sendMail()
-
-	/**
-	 * FÃŒgt einen neuen Rabatt hinzu (nur wenn keiner da ist)
-	 */
-	function wpsg_addDiscount(oid)
-	{
-		jQuery('#wpsg_produkte_table').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&subaction=discountData&do=add&edit_id=' + oid + '&noheader=1',
-			success: function(data) {
-				jQuery('#wpsg_produkte_table').replaceWith(data);
-				jQuery('#LinkRabattNeu').hide();
-			}
-		} );
-
-		return false;
-
-	} // function wpsg_addDiscount()
-
-
-	/**
-	 * FÃŒgt einen neuen Gutschein hinzu (nur wenn keiner da ist)
-	 */
-	function wpsg_addVoucher(oid)
-	{
-		jQuery('#wpsg_produkte_table').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&subaction=voucherData&do=add&edit_id=' + oid + '&noheader=1',
-			success: function(data) {
-				jQuery('#wpsg_produkte_table').replaceWith(data);
-				jQuery('#LinkGutscheinNeu').hide();
-				//jQuery('#wpsg_kv_list').html(data);
-				//location.href = location.href;
-				//jQuery('#wpsg_kv_list').html('');
-			}
-		} );
-
-		return false;
-
-	} // function wpsg_addVoucher()
-
-	/*
-	 * Wendet die gespeicherte Reihenfolge auf die verschiebbaren Elemente an
-	 */
-	function applySavedItemOrder()
-	{
-
-		let leftElements = jQuery(".orderdetail-item-left");
-		let rightElements = jQuery(".orderdetail-item-right");
-
-		let leftOrder = '<?php echo json_encode($this->get_option('wpsg_backendui_orderdetail_itemorder_left')); ?>' || false;
-		let rightOrder = '<?php echo json_encode($this->get_option('wpsg_backendui_orderdetail_itemorder_right')); ?>' || false;
-
-		if(leftOrder === "false" || leftOrder.includes('"",')) leftOrder = false;
-		if(rightOrder === "false" || rightOrder.includes('"",')) rightOrder = false;
-
-		if(leftOrder)
-		{
-
-			let elementIDs = [];
-			leftElements.each(function(key, item) {
-				elementIDs.push(item.id);
-			});
-
-			let cleanLeftOrder = leftOrder.replace("[", "").replace("]", "").replaceAll('"', "").split(",");
-			writeOrderItems(cleanLeftOrder, "left");
-
-		}
-
-		if(rightOrder)
-		{
-
-			let elementIDs = [];
-			rightElements.each(function(key, item) {
-				elementIDs.push(item.id);
-			});
-
-			let cleanRightOrder = rightOrder.replace("[", "").replace("]", "").replaceAll('"', "").split(",");
-			writeOrderItems(cleanRightOrder, "right");
-
-		}
-
-	} // function applySavedItemOrder()
-
-	/*
-	 * Schreibt Elemente der angegebenen IDs ins DOM
-	 */
-	function writeOrderItems(orderIDs, orderPos)
-	{
-
-		let writeElement = "";
-
-		let elements = [];
-		orderIDs.forEach(function(id) {
-			elements.push(jQuery(`#${id}`)[0]);
-		});
-
-		switch(orderPos) {
-
-			case 'left':
-				writeElement = jQuery(".orderdetail-alternative-left");
-				break;
-
-			case 'right':
-				writeElement = jQuery(".orderdetail-alternative-right");
-				break;
-
-		}
-
-		if(writeElement.length > 0 || writeElement !== "")
-		{
-
-			writeElement[0].innerHTML = "";
-			elements.forEach(function (element) {
-				try{
-					writeElement[0].innerHTML += element.innerHTML;
-				}
-				catch(err){
-					return false;
-				}
-			});
-
-		}
-
-	} // function writeOrderItems()
-
-	/*
-	 * Weist den zuvor eingeklappten Elementen eine Klase zu und klappt sie schlieÃlich auch ein
-	 */
-	function applyFoldedStatus()
-	{
-
-		let foldedPanels = '<?php echo json_encode($this->get_option('wpsg_backendui_orderdetail_foldedpanels')); ?>' || false;
-		if(foldedPanels === "false" || foldedPanels.includes('"",')) foldedPanels = false;
-
-		if(foldedPanels)
-		{
-
-			let foldedPanelsArr = foldedPanels.replace("[", "").replace("]", "").replaceAll('"', "").split(",");
-
-			for(var i = 0; i < foldedPanelsArr.length; i++) {
-				let mainParent = jQuery(`#${foldedPanelsArr[i].split("_")[0]}`);
-				mainParent.find(".panel-body").slideUp('fast');
-			}
-
-		}
-
-	} // fucntion applyFoldedStatus()
-
-	/*
-	 *  Speichert die angegebene Reihenfolge der verschiebbaren Elemente
-	 */
-	function saveItemOrder(order, orderPosition)
-	{
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&subaction=itemOrderData&do=save&noheader=1',
-			data: {
-				'order': order,
-				'orderPosition': orderPosition
-			}
-		} );
-
-	} // function saveItemOrder(order, orderPosition)
-
-	/*
-	 *  Speichert die angegebene Reihenfolge der verschiebbaren Elemente
-	 */
-	function saveFoldedItems(items)
-	{
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&subaction=foldedItemsData&do=save&noheader=1',
-			data: {
-				'folded_items': items
-			}
-		} );
-
-	} // function saveItemOrder(order, orderPosition)
-
-	// Weist dem gegebenen JS Element eine einzigartige Klasse zu
-	// und gibt das jeweilige Element als jQuery Object zurÃŒck
-	let counter = 0;
-	function jsElTojQueryObj(jsEl, specificClass) {
-
-		let id = jsEl.id ? `#${jsEl.id}` : "";
-		let classes = "";
-
-		if(typeof jsEl !== "object" || jsEl.length <= 1 && jsEl[0] === "#document")
-			return;
-
-		jsEl.classList.add(`${specificClass}-${counter++}`);
-
-		if(jsEl.classList && jsEl.classList.length > 0) {
-
-			jsEl.classList.forEach(function(className) {
-				if(!classes.includes(`.${className}`)) classes += `.${className}`;
-			});
-
-		}
-
-		return $(`${jsEl.tagName.toLowerCase()}${id}${classes}`);
-
-	} // function jsElTojQueryObj(jsEl, specificClass)
-
-
-	jQuery(document).ready(function() {
-
-		applySavedItemOrder();
-		applyFoldedStatus();
-		wpsg_view_orderdata_hide();
-
-		jQuery('#wpsg_order_view_tabs a.list-group-item').bind('click', function() {
-
-			jQuery('#wpsg_order_view_tabs a').removeClass('active');
-			jQuery('.wpsg_order_view_tab_content').hide();
-
-			tab = jQuery(this).attr('wpsg-data-target');
-			if (tab == 'orderdata') {
-				wpsg_view_orderdata_show();
-			} else {
-				wpsg_view_orderdata_hide();
-			}
-			jQuery(this).addClass('active');
-			jQuery('#tab' + jQuery(this).attr('wpsg-data-target')).show();
-
-			jQuery.cookie('wpsg_order_view_tab', jQuery(this).attr('wpsg-data-target'));
-			jQuery(this).blur();
-
-		} );
-
-
-		co = jQuery.cookie('wpsg_order_view_tab');
-		if (co === undefined) {
-			jQuery("[wpsg-data-target='general']").trigger("click");
-		} else {
-			jQuery("[wpsg-data-target='" + co + "']").trigger("click");
-		}
-
-		// Anordnung der Kacheln zurÃŒcksetzen
-		jQuery(".btn-reset-itemorder").click(function() {
-			const leftorder = ["item-general", "item-orderdata", "item-ordervariables", "item-customercontact", "item-bills", "item-deliverynotes"];
-			const rightorder = ["item-customerdata", "item-shippay", "item-confirmation", "item-trustedshops", "item-orderlog", "item-dev"];
-
-			saveItemOrder(leftorder, "left");
-			saveItemOrder(rightorder, "right");
-
-			setTimeout(function(){
-				applySavedItemOrder();
-			}, 1000);
-		});
-
-		// Drag & Drop
-		jQuery(".orderdetail-alternative-left, .orderdetail-alternative-right").sortable({
-			connectWith: ".connectedSortable"
-		}).disableSelection();
-
-		jQuery(".orderdetail-alternative-left").on('sortupdate', function()
-		{
-			var action = jQuery(".orderdetail-alternative-left").sortable("toArray");
-			saveItemOrder(action, "left");
-		});
-		jQuery(".orderdetail-alternative-right").on('sortupdate', function()
-		{
-			var action = jQuery(".orderdetail-alternative-right").sortable("toArray");
-			saveItemOrder(action, "right");
-		});
-
-		let foldedElements = '<?php echo json_encode($this->get_option('wpsg_backendui_orderdetail_foldedpanels')); ?>' || [];
-		if(foldedElements === "false" || foldedElements.includes('"",')) foldedElements = [];
-		if(foldedElements && foldedElements.length > 0) foldedElements = foldedElements.replace("[", "").replace("]", "").replaceAll('"', "").split(",");
-
-		// Panels einklappen
-		jQuery(".panel-heading").click(function(){
-
-			let jQueryPanelBody = jsElTojQueryObj(this.parentElement.lastElementChild, "orderdetail-panel-body");
-			let item_payload = jQueryPanelBody.parents().eq(1)[0].id + "_" + jQueryPanelBody[0].classList[0];
-
-			if(jQueryPanelBody.is(":hidden"))
-			{
-
-				let targetIndex = 0;
-
-				for(var i = 0; i < foldedElements.length; i++) {
-					if(foldedElements[i].includes(item_payload))
-						targetIndex = i;
-				}
-
-				foldedElements.splice(targetIndex, 1);
-				jQueryPanelBody.slideToggle('fast');
-
-			}
-			else
-			{
-
-				foldedElements.push(item_payload);
-				jQueryPanelBody.slideToggle('fast');
-
-			}
-
-			saveFoldedItems(foldedElements);
-
-		});
-
-
-	} );
-
-	/* ]]> */</script>
Index: ews/order/view_customerdata.phtml
===================================================================
--- /views/order/view_customerdata.phtml	(revision 8528)
+++ 	(revision )
@@ -1,235 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 07.08.2016
-     * Time: 10:40
-     */
-
-    /** @var wpsg_customer $Customer */
-    $Customer = $this->view['oCustomer'];
-
-?>
-
-<div class="modal fade" tabindex="-1" role="dialog" id="wpsg_customer_edit">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title"><?php echo __('Kundendaten bearbeiten', 'wpsg'); ?></h4>
-            </div>
-            <div class="modal-body">
-				<?php if ($this->view['pflicht']['firma'] != '2') { ?>	
-                	<?php echo wpsg_drawForm_Input('dialog_firma', __('Firma', 'wpsg'), $this->view['data']['firma']); ?>
-                <?php } ?>
-                <?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Input('dialog_ustidnr', __('UStIdNr', 'wpsg'), $this->view['data']['ustidnr']); ?>
-               	<?php } ?>
-                <br />
-                <?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Select('dialog_title', __('Anrede', 'wpsg'), $this->view['arTitles'], $this->view['data']['title'], array('noIndex' => true)); ?>
-                 <?php } ?>
-                <?php if ($this->view['pflicht']['vname'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Input('dialog_vname', __('Vorname', 'wpsg'), $this->view['data']['vname']); ?>
-                <?php } ?>
-                <?php if ($this->view['pflicht']['name'] != '2') { ?> 
-                	<?php echo wpsg_drawForm_Input('dialog_name', __('Name', 'wpsg'), $this->view['data']['name']); ?>
-                <?php } ?>
-                <br />
-                <?php if ($this->view['pflicht']['geb'] != '2') { ?>
- 					<?php echo wpsg_drawForm_Input('dialog_geb', __('Geburtsdatum', 'wpsg'), $this->view['data']['geb']); ?>
-                <?php } ?>
-                <br />
-                <?php if ($this->view['pflicht']['tel'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Input('dialog_tel', __('Telefon', 'wpsg'), $this->view['data']['tel']); ?>
-                <?php } ?>
-                <?php if ($this->view['pflicht']['fax'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Input('dialog_fax', __('Fax', 'wpsg'), $this->view['data']['fax']); ?>
-                <?php } ?>
-                <?php if ($this->view['pflicht']['email'] != '2') { ?>
-	                <?php if ($this->hasMod('wpsg_mod_kundenverwaltung')) { ?>
-		            	<?php echo wpsg_drawForm_Text(__('E-Mail', 'wpsg'),'<a href="'.
-							
-							wpsg_admin_url('Customer', 'edit', ['edit_id' => $this->view['data']['k_id']]).
-		            	
-		            	'">'.$this->view['data']['email'].'</a>'); ?>
-					<?php } ?>
-				<?php } ?>
-
-				<?php echo wpsg_drawForm_Input('email_einvoice', __('E-Mail fÃŒr eRechnung', 'wpsg'), $this->view['data']['email_einvoice']); ?>
-
-                <?php echo wpsg_drawForm_Input('leitweg_id', __('Leitweg-ID fÃŒr eRechnung', 'wpsg'), $this->view['data']['leitweg_id']); ?>
-
-                <br />
-                <?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-                	
-					<?php echo wpsg_drawForm_Input('dialog_strasse', __('StraÃe', 'wpsg'), $this->view['data']['strasse']); ?>
-	
-					<?php if (wpsg_getStr($this->view['pflicht']['wpsg_showNr']) === '1') { ?>
-		
-						<?php echo wpsg_drawForm_Input('dialog_nr', __('Hausnummer', 'wpsg'), $this->view['data']['nr']); ?>
-						
-					<?php } ?>
-					
-                <?php } ?>
-                <?php if ($this->view['pflicht']['plz'] != '2') { ?>     
-                	<?php echo wpsg_drawForm_Input('dialog_plz', __('Postleitzahl', 'wpsg'), $this->view['data']['plz']); ?>
-                <?php } ?>	
-                <?php if ($this->view['pflicht']['ort'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Input('dialog_ort', __('Ort', 'wpsg'), $this->view['data']['ort']); ?>
-                <?php } ?>
-                <?php if ($this->view['pflicht']['land'] != '2') { ?>
-                	<?php echo wpsg_drawForm_Select('dialog_land', __('Land', 'wpsg'), $this->view['arCountry'], $this->view['data']['land']); ?>	
-				<?php } ?>
-                <br />
-
-                <?php echo wpsg_drawForm_Checkbox('dialog_customer', __('Auch Kundendaten anpassen', 'wpsg'), false, array('help' => 'dialog_customer')); ?>
-                <?php echo wpsg_drawForm_Checkbox('dialog_all', __('Alle Bestellungen des Kunden Ã€ndern', 'wpsg'), false, array('help' => 'dialog_all')); ?>
-                
-                <?php if ($this->hasMod('wpsg_mod_shippingadress')) {?>
-                <?php echo wpsg_drawForm_Checkbox('dialog_shipping', __('Auch Lieferanschrift anpassen', 'wpsg'), false, array('help' => 'dialog_shipping')); ?>
-                <?php } ?>
-				<input type="hidden" id="dialog_change_land" name="dialog_change_land" />
-				
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('SchlieÃen', 'wpsg'); ?></button>
-                <button type="button" class="btn btn-primary" onclick="return wpsg_saveInvoiceAdress();"><?php echo __('Speichern', 'wpsg'); ?></button>
-            </div>
-        </div>
-    </div>
-</div>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Kundendaten', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_TextStart(); ?>
-    <?php echo $this->view['oOrder']->getCustomer()->getNr(); ?>
-    <?php if ($this->hasMod('wpsg_mod_kundenverwaltung')) { ?>
-	[&nbsp; <a href="<?php 
-			
-		echo wpsg_admin_url('Customer', 'edit', ['edit_id' => $this->view['data']['k_id']]);
-		//echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Customer&action=edit&edit_id='.$this->view['data']['k_id']; 
-		
-	?>"><?php echo __('Zum Kunden', 'wpsg'); ?></a>&nbsp;]
-	<?php } ?>
-    <?php echo wpsg_drawForm_TextEnd(__('Kundennummer', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_TextStart(); ?>
-	<?php if ($this->view['pflicht']['firma'] != '2') { ?>
-    	<?php if (trim($this->view['data']['firma']) != '') { ?>
-    		<?php echo wpsg_hspc($this->view['data']['firma']); ?><br />
-    	<?php } ?>
-    <?php } ?>                    
- 	<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-    	<?php echo (($this->view['data']['title'] != '' && $this->view['data']['title'] != '-1')?wpsg_hspc($this->view['arTitles'][$this->view['data']['title']]).' ':''); ?>
-    <?php } ?>                    
-    <?php if ($this->view['pflicht']['vname'] != '2') { ?>
-    	<?php echo wpsg_hspc($this->view['data']['vname']); ?>
-    <?php } ?>                    
-    <?php if ($this->view['pflicht']['name'] != '2') { ?>
-    	<?php echo wpsg_hspc($this->view['data']['name']); ?><br />
-    <?php } ?>                    
-    <?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-	
-		<?php echo wpsg_hspc($this->view['data']['strasse']); ?> <?php echo wpsg_hspc(wpsg_getStr($this->view['data']['nr'])); ?><br />
-		 
-    <?php } ?>                    
-   	<?php if ($this->view['pflicht']['plz'] != '2') { ?>
-    	<?php echo wpsg_hspc($this->view['data']['plz']); ?>
-    <?php } ?>                    
-   	<?php if ($this->view['pflicht']['ort'] != '2') { ?>
-    	<?php echo wpsg_hspc($this->view['data']['ort']); ?> 
-    <?php } ?>                    
-    <?php if ($this->view['pflicht']['land'] != '2') { ?>
-    	<?php echo wpsg_hspc($this->view['country']['kuerzel']); ?><br />
-	<?php } ?>
-    <a style="position: absolute; right:25px; top:10px; display:inline-block;" data-toggle="modal" data-target="#wpsg_customer_edit" href="#" title="<?php echo __('Anschrift Ã€ndern', 'wpsg'); ?>">
-        <span class="glyphicon glyphicon-pencil"></span>
-    </a>
-
-    <?php echo wpsg_drawForm_TextEnd(__('Anschrift', 'wpsg')); ?>
-	   
-    <?php if ($this->view['pflicht']['geb'] != '2') { ?>
-    	<?php if (strtotime($this->view['data']['geb']) > 0) { ?>
-    		<?php echo wpsg_drawForm_Text(__('Geburtsdatum', 'wpsg'), wpsg_fromDate($this->view['data']['geb']), array('text' => true)); ?>
-    	<?php } ?>
-	<?php } ?>                    
-    <?php if ($this->view['pflicht']['fax'] != '2') { ?>
-	    <?php if (strlen($this->view['data']['fax']) > 0) { ?>
-	    	<?php echo wpsg_drawForm_Text(__('Fax', 'wpsg'), $this->view['data']['fax'], array('text' => true)); ?>
-	    <?php } ?>
-	<?php } ?>                    
-    <?php if ($this->view['pflicht']['tel'] != '2') { ?>
-	    <?php if (strlen($this->view['data']['tel']) > 0) { ?>
-	    	<?php echo wpsg_drawForm_Text(__('Telefon', 'wpsg'), $this->view['data']['tel'], array('text' => true)); ?>
-	    <?php } ?>
-	<?php } ?>                    
-    
-	    
-	<?php echo wpsg_drawForm_Text(__('UStIdNr.', 'wpsg'), $this->view['data']['ustidnr'], array('text' => true)); ?>
-	<br />
-	                    
-    <?php $this->callMods('wpsg_order_view_customerdata', array(&$this->view['data']['id'])); ?>
-
-    <?php echo wpsg_drawForm_TextStart(); ?>
-     <?php if ($this->view['pflicht']['email'] != '2') { ?>
-    	<a href="mailto:<?php echo $this->view['data']['email']; ?>"><?php echo $this->view['data']['email']; ?></a>
-    <?php } ?>
-    <?php echo wpsg_drawForm_TextEnd(__('E-Mail', 'wpsg')); ?>
-	
-	<?php $email_einvoice = $Customer->getEMailEInvoice(); if ($email_einvoice !== null) { ?>
-		<?php echo wpsg_drawForm_TextStart(); ?>
-			<a href="mailto:<?php echo htmlspecialchars($email_einvoice); ?>"><?php echo htmlspecialchars($email_einvoice); ?></a>
-		<?php echo wpsg_drawForm_TextEnd(__('E-Mail fÃŒr eRechnungen', 'wpsg')); ?>
-	<?php } ?>
-
-    <script>
-
-        function wpsg_saveInvoiceAdress()
-        {
-
-            jQuery('#wpsg_backend_loading').show();
-            
-            jQuery.ajax( {
-                url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=saveInvoiceAdress&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1',
-                data: {
-                    form_data: jQuery('#wpsg_customer_edit input, #wpsg_customer_edit select').serialize()
-                },
-                success: function(data) {
-
-                    //location.href = location.href;
-                    location.reload();
-
-                }
-            } );
-
-            return false;
-
-        }
-
-        jQuery(document).ready(function() {
-
-            jQuery('#dialog_land').bind('change', function() {
-
-				jQuery('#dialog_change_land').val('1');
-				
-            } );
-        	
-        } );
-            
-
-    </script>
-
-    <?php $arCV = $Customer->getCustomerVariables(); ?>
-    <?php if (wpsg_isSizedArray($arCV)) { ?>
-
-        <br />
-        <?php foreach ($Customer->getCustomerVariables() as $cv) { ?>
-
-            <?php echo wpsg_drawForm_Text($cv['label'], $cv['value']); ?>
-
-        <?php } ?>
-
-    <?php } ?>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: ews/order/view_dev.phtml
===================================================================
--- /views/order/view_dev.phtml	(revision 8528)
+++ 	(revision )
@@ -1,65 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 07.08.2016
-     * Time: 10:51
-     */
-
-    /** @var \wpsg_order $oOrder */
-    $oOrder = wpsg_order::getInstance(intval($this->view['data']['id']));
-    
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Entwickleroptionen', 'wpsg')); ?>
-
-    <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_customermail&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Kundenmail simulieren (An Shop Betreiber)', 'wpsg'); ?></a><br />
-    <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_adminmail&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('Adminmail simulieren', 'wpsg'); ?></a><br />
-    <a href="<?php echo $this->getDoneURL($this->view['data']['id']); ?>"><?php echo __('Bestellabschlussseite', 'wpsg'); ?></a><br />
-    <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_urlbuy&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('URL Benachrichtigung (Kauf) auslÃ¶sen', 'wpsg'); ?></a><br />
-    <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=debug_urlpay&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>"><?php echo __('URL Benachrichtigung (Bezahlung) auslÃ¶sen', 'wpsg'); ?></a><br />
-
-    <br />
-
-    <div class="panel panel-default">
-        <div class="panel-heading" data-toggle="collapse" href="#collapse_basket" style="cursor:pointer;">
-            <h4 class="panel-title"><?php echo __('Warenkorbdaten', 'wpsg'); ?></h4>
-        </div>
-        <div id="collapse_basket" class="panel-collapse collapse">
-            <div class="panel-body">
-                <pre><?php wpsg_debug($this->view['basket']); ?></pre>
-            </div>
-        </div>
-    </div>
-
-    <div class="panel panel-default">
-        <div class="panel-heading" data-toggle="collapse" href="#collapse_calculation" style="cursor:pointer;">
-            <h4 class="panel-title"><?php echo __('Kalkulation (live from Db)', 'wpsg'); ?></h4>
-        </div>
-        <div id="collapse_calculation" class="panel-collapse collapse">
-            <div class="panel-body">
-                <pre><?php
-                
-                    $oCalculaiton = \wpsg\wpsg_calculation::getOrderCalculation($_REQUEST['edit_id'], true);
-                    $arCalculation = $oCalculaiton->getCalculationArray(true);
-                        
-                    wpsg_debug($arCalculation); 
-                    
-                ?></pre>
-            </div>
-        </div>
-    </div>
- 
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Technische Einstellungen', 'wÃŒsg')); ?>
-<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=save&edit_id=<?php echo $this->view['oOrder']->id; ?>&noheader=1" enctype="multipart/form-data">
-
-    <?php echo wpsg_drawForm_Checkbox('ext_payed', __('Externe ZahlungseingÃ€nge ignorieren', 'wpsg'), wpsg_getStr($this->view['data']['ext_payed'])); ?>
-
-    <?php echo wpsg_drawForm_TextStart(); ?>
-    <input type="submit" class="button button-primary" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" />
-    <?php echo wpsg_drawForm_TextEnd(); ?>
-
-</form>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: ews/order/view_general.phtml
===================================================================
--- /views/order/view_general.phtml	(revision 8528)
+++ 	(revision )
@@ -1,94 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 06.08.2016
-     * Time: 11:22
-     */
-
-?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Allgemein', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_Text(__('Bestellnummer', 'wpsg'), $this->view['oOrder']->getNr().' ['.$this->view['oOrder']->getStateLabel().']'); ?>
-    <?php echo wpsg_drawForm_Text(__('Bestelldatum', 'wpsg'), wpsg_formatTimestamp($this->view['oOrder']->cdate)); ?>
-    <?php echo wpsg_drawForm_Text(__('Bestellwert', 'wpsg'), wpsg_ff($this->view['oOrder']->getAmount(), $this->get_option('wpsg_currency')), 'wpsg_be_orderamount'); ?>
-    <?php echo wpsg_drawForm_Text(__('Bestellkommentar (Admin)', 'wpsg'), $this->view['data']['admincomment'], 'wpsg_order_admincomment', array('inlineEdit' => true, 'inlineEdit_type' => 'textarea', 'inlineEdit_url' => WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&noheader=1&action=setAdminComment&edit_id='.$this->view['data']['id'])); ?>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php $comment = $this->view['oOrder']->comment; if (wpsg_isSizedString($comment)) { ?>
-
-	<?php echo wpsg_drawForm_AdminboxStart(__('Bestellkommentar (Kunde)', 'wpsg')); ?>
-
-	<p>
-		<?php echo $comment; ?>
-	</p>
-
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php } ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('StatusÃ€nderung', 'wpsg')); ?>
-<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&amp;action=switchStatus&amp;edit_id=<?php echo $this->view['oOrder']->id; ?>&amp;noheader=1" enctype="multipart/form-data">
-
-    <?php echo wpsg_drawForm_Select('status', __('Neuer Status', 'wpsg'), $this->arStatus, $this->view['data']['status']); ?>
-    <?php echo wpsg_drawForm_Checkbox('sendMail', __('Kunden informieren', 'wpsg'), 0); ?>
-
-    <?php if ($this->hasMod('wpsg_mod_rechnungen')) {
-
-        $arInvoice = \wpsg\wpsg_invoice::findByOrderId($this->view['oOrder']->id);
-
-        if (sizeof($arInvoice) > 0) { ?>
-            <script>
-
-                jQuery('#sendMail').on('click', function() {
-
-                    if (jQuery(this).prop('checked')) {
-
-                        jQuery('#layer_attachInvoice').show();
-
-                    } else {
-
-                        jQuery('#layer_attachInvoice').hide();
-
-                    }
-
-                }).click();
-
-            </script>
-            <div id="layer_attachInvoice">
-                <?php echo wpsg_drawForm_Checkbox('attachInvoice', __('Rechnung anhÃ€ngen', 'wpsg'), 0); ?>
-            </div>
-        <?php } ?>
-    <?php } ?>
-
-    <br />
-	<?php $this->callMods('order_view_switchStatus', array(&$this->view['data']['id'])); ?>						
-	
-    <?php echo wpsg_drawForm_TextStart(); ?>
-    <input type="submit" class="button" value="<?php echo __('Status Ã€ndern', 'wpsg'); ?>" />
-    <?php echo wpsg_drawForm_TextEnd(); ?>
-
-</form>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php if ($this->hasMod('wpsg_mod_orderupload')) { ?>
-	<?php echo wpsg_drawForm_AdminboxStart(__('Bestelluploads', 'wpsg')); ?>
-	
-		<div class="inside">
-			 <?php if (!wpsg_isSizedArray($this->view['arFiles'])) { ?>
-			 <p class="wpsg_checkout_orderupload_backend">
-			 	<?php echo __('Keine Dateien hochgeladen.', 'wpsg'); ?>
-			 </p>
-			 <?php } else { ?>
-			 <?php foreach ($this->view['arFiles'] as $f) { ?>
-			 <p class="wpsg_checkout_orderupload_backend">
-			 	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1&action=ajax&mod=wpsg_mod_orderupload&wpsg_mod_orderupload_download=<?php echo rawurlencode($f); ?>"><?php echo $f; ?></a><br /> 
-			 	<span class="wpsg_checkout_orderupload_backend_weight">(<?php echo wpsg_formatSize($this->callMod('wpsg_mod_orderupload', 'getSavePath', array($this->view['data']['id'])).$f); ?>)</span>
-			 </p>
-			 <?php } ?>
-			 <?php } ?>
-		</div>
-	
-	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-<?php } ?>
Index: ews/order/view_orderdata.phtml
===================================================================
--- /views/order/view_orderdata.phtml	(revision 8528)
+++ 	(revision )
@@ -1,440 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (daschmi@dsachmi.de)
-     * Date: 06.08.2016
-     * Time: 13:45
-     */
-         
-?>
-<div id="wpsg_produkte_table">
-    
-    <?php
-
-        // $oCalculation = new \wpsg\wpsg_calculation();
-        // $oCalculation->fromDB(525);        
-        // $oCalculation->addProduct($_REQUEST['add_price'], $this->shop->getBackendTaxview(), $oProduct->mwst_key, $_REQUEST['add_amount'], $product_key, $product_index, $order_product_id, $eu);        
-        // wpsg_debug($oCalculation->getCalculationArray()['product']);        
-        // die();
-        
-    ?>
-    
-	<?php echo wpsg_drawForm_AdminboxStart(__('Bestelldaten', 'wpsg')); ?>
-    
-	<div id="wpsg_product_table_wrap">
-        <?php $this->render(WPSG_PATH_VIEW.'order/product_table.phtml'); ?>
-    </div>
-
-	<script type="text/javascript">
-	
-		var WPSG_BE = {
-			
-			updateCalculation: function() {
-
-				var tax_mode = jQuery('#tax_mode').val();
-				
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=updateCalculation&noheader=1&edit_id=<?php echo $_REQUEST['edit_id']; ?>',
-					data: {
-						tax_mode: tax_mode
-					},
-					success: function(data) {
-
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-
-					}
-				} );
-
-				return false;
-				
-			}
-			
-		};
-		
-		var WPSG_BE_Pay_Ship = {
-				 
-			changeShippingPayment: function (id, oid) {
-	
-				jQuery('#wpsg_shipping_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				jQuery('#wpsg_shipping_dialog').modal( { } ).modal('show');
-								
-				jQuery.ajax( {
-					url: '<?php 
-						
-						echo wpsg_admin_url('Order', 'view', ['subaction' => 'editPayShipping', 'edit_id' => $_REQUEST['edit_id']], ['noheader' => '1'], true);
-					
-					?>',
-					success: function(data) {
-	
-						jQuery('#wpsg_shipping_dialog .modal-body').html(data);
-	
-					}
-				} );
-	
-				return false;
-				 
-			}, // function changeShipping(id, oid)
-	
-			/**
-			 * Ãndern der Versanddaten im Backend
-			 */
-			updateShippingPayment: function() {
-				
-				var data = {
-					submit: '1',
-					shipping_key: jQuery('#edit_shipping_type').val(),
-					shipping_price: jQuery('#edit_shipping_price').val(),
-					payment_key: jQuery('#edit_payment_type').val(),
-					payment_price: jQuery('#edit_payment_price').val()
-				};
-				
-				jQuery('#wpsg_shipping_dialog').modal('hide');
-				
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=updateOrder&subaction=editPayShipping&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1',
-					data: data,
-					success: function(data) {
-						
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-						
-					}
-				} );
-				
-				return false; 
-	
-			} // function dialogShippingOK()
-	  
-		}	 
-	
-		var WPSG_BE_Product = {
-	
-			addProduct: function() {
-		
-				jQuery('#wpsg_product_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				jQuery('#wpsg_product_dialog').modal( { } ).modal('show');
-				jQuery('#wpsg_product_dialog .btn-primary').prop('disabled', true);
-				
-				jQuery.ajax( {
-					url: '<?php 
-						
-						echo wpsg_admin_url('Order', 'view', ['subaction' => 'addProduct', 'edit_id' => $_REQUEST['edit_id']], ['noheader' => '1'], true); 
-						
-					?>',
-					success: function(data) {
-		
-						jQuery('#wpsg_product_dialog .modal-body').html(data);
-		
-					}
-				} );
-		
-				return false;
-				
-			},
-
-			removeProduct: function(order_product_id) {
-	
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				
-				jQuery.ajax( {
-					url: '<?php 
-						
-						echo wpsg_admin_url('Order', 'view', ['subaction' => 'removeProduct', 'edit_id' => $_REQUEST['edit_id']], ['noheader' => '1'], true);
-						
-					?>',
-					data: { 
-						order_product_id: order_product_id
-					},
-					success: function(data) {
-	
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-	
-					}
-				} );
-				
-				return false;
-				
-			},
-			
-			editProduct: function(order_product_id) {
-	
-				jQuery('#wpsg_product_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				jQuery('#wpsg_product_dialog').modal( { } ).modal('show');
-				jQuery('#wpsg_product_dialog .btn-primary').prop('disabled', true);
-	
-				jQuery.ajax( {
-					url: '<?php
-					
-						echo wpsg_admin_url('Order', 'view', ['subaction' => 'addProduct', 'edit_id' => $_REQUEST['edit_id']], ['noheader' => '1'], true);
-					
-					?>',
-					data: {
-						order_product_id: order_product_id  
-					},
-					success: function(data) {
-	
-						jQuery('#wpsg_product_dialog .modal-body').html(data);
-	
-					}
-				} );
-	
-				return false;
-				
-			},
-	
-			saveProduct: function() {
-	 
-				jQuery('#wpsg_product_dialog').modal('hide');
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-	
-				jQuery.ajax( {
-					url: '<?php 
-					
-						echo wpsg_admin_url('Order', 'view', ['edit_id' => $_REQUEST['edit_id'], 'do' => 'submit', 'subaction' => 'addProduct'], ['noheader' => '1'], true);
-						
-					?>',
-					data: jQuery('#wpsg_product_add_form').serialize(),
-					success: function(data) {
-	
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-	
-					}
-				} );
-	
-				return false;
-	
-			}
-		
-		};
-	
-		var WPSG_BE_Voucher = {
-			
-			editVoucher: function(order_voucher_id) {
-	
-				jQuery('#wpsg_voucher_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				jQuery('#wpsg_voucher_dialog').modal( { } ).modal('show');
-	
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=editVoucher&edit_id=<?php echo $_REQUEST['edit_id']; ?>&order_voucher_id=' + order_voucher_id + '&noheader=1',
-					success: function(data) {
-	
-						jQuery('#wpsg_voucher_dialog .modal-body').html(data);
-	
-					}
-				} );
-	
-				return false;
-				
-			},
-			
-			removeVoucher: function(order_voucher_id) {
-	
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-	
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=editVoucher&do=remove&edit_id=<?php echo $_REQUEST['edit_id']; ?>&order_voucher_id=' + order_voucher_id + '&noheader=1',
-					success: function(data) {
-	
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-	
-					}
-				} );
-	
-				return false;
-				
-			},
-			
-			saveVoucher: function() {
-	
-				jQuery('#wpsg_voucher_dialog').modal('hide');
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-	
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=editVoucher&do=submit&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1',
-					data: jQuery('#wpsg_be_voucher_form').serialize(),
-					success: function(data) {
-	
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-	
-					}
-				} );
-	
-				return false;
-				
-			}
-			
-		}
-		
-		var WPSG_BE_Discount = {
-		
-			editDiscount: function() {
-	
-				jQuery('#wpsg_discount_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-				jQuery('#wpsg_discount_dialog').modal( { } ).modal('show'); 
-	
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=editDiscount&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1',                 
-					success: function(data) {
-	
-						jQuery('#wpsg_discount_dialog .modal-body').html(data);
-	
-					}
-				} );
-	
-				return false;
-			
-			},
-		 
-			removeDiscount: function() {
-	
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-	
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=editDiscount&do=remove&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1',
-					success: function(data) {
-	
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-	
-					}
-				} );
-				
-				return false;
-				
-			},
-		
-			saveDiscount: function() {
-	
-				jQuery('#wpsg_discount_dialog').modal('hide');
-				jQuery('#wpsg_product_table_wrap').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-	
-				jQuery.ajax( {
-					url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=view&subaction=editDiscount&do=submit&edit_id=<?php echo $_REQUEST['edit_id']; ?>&noheader=1',
-					data: jQuery('#wpsg_be_discount_form').serialize(),
-					success: function(data) {
-	
-						jQuery('#wpsg_product_table_wrap').html(data.product_table);
-	
-					}
-				} );
-	
-				return false;
-			
-			}
-		
-		}
-
-		var WPSG_BE_Mail = {
-			
-			sendAdminMail: function(order_id) {
-
-				jQuery.ajax( {
-					url: '<?php 
-						
-						echo wpsg_admin_url('Order', 'view', ['subaction' => 'sendAdminMail', 'do' => 'customer', 'edit_id' => $_REQUEST['edit_id']], ['noheader' => '1'], true);				
-						
-					?>',
-					data: jQuery('#wpsg_be_discount_form').serialize(),
-					success: function(data) { alert(data); }
-				} );
-
-				return false;
-				
-			},
-			
-			sendCustomerMail: function(order_id) {
-
-				jQuery.ajax( {
-					url: '<?php 
-						
-						echo wpsg_admin_url('Order', 'view', ['subaction' => 'sendMail', 'do' => 'customer', 'edit_id' => $_REQUEST['edit_id']], ['noheader' => '1'], true);				
-						
-					?>',
-					data: jQuery('#wpsg_be_discount_form').serialize(),
-					success: function(data) { alert(data); }
-				} );
-
-				return false;
-				
-			}
-			
-		}
-		
-	</script>
-	
-    <?php $this->callMods('order_view_orderdata_after', [intval($_REQUEST['edit_id'])]); ?>
-    
-	<?php wpsg_drawForm_AdminboxEnd(); ?>
-
-</div>
-
-<!-- Modaldialog fÃŒr Gutscheine -->
-<div class="modal fade" id="wpsg_voucher_dialog" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-				<h4 class="modal-title" id="myModalLabel"><?php echo __('Gutschein hinzufÃŒgen/bearbeiten', 'wpsg'); ?></h4>
-			</div>
-			<div class="modal-body"></div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-default" data-dismiss="modal">Abbrechen</button>
-				<button type="button" class="btn btn-primary" data-dismiss="modal" onclick="return WPSG_BE_Voucher.saveVoucher();">OK</button>
-			</div>
-		</div>
-	</div>
-</div>
-
-<!-- Modaldialog fÃŒr Rabatt -->
-<div class="modal fade" id="wpsg_discount_dialog" tabindex="-1" role="dialog">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title" id="myModalLabel"><?php echo __('Rabatt hinzufÃŒgen/bearbeiten', 'wpsg'); ?></h4>
-            </div>
-            <div class="modal-body"></div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal">Abbrechen</button>
-                <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="return WPSG_BE_Discount.saveDiscount();">OK</button>
-            </div>
-        </div>
-    </div>
-</div>
-
-<!-- Modaldialog fÃŒr Produkte -->
-<div class="modal fade" id="wpsg_product_dialog" tabindex="-1" role="dialog">
-  <div class="modal-dialog" role="document">
-    <div class="modal-content">
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-        <h4 class="modal-title" id="myModalLabel"><?php echo __('Produkt hinzufÃŒgen/bearbeiten', 'wpsg'); ?></h4>
-      </div>
-      <div class="modal-body"></div>
-      <div class="modal-footer">
-        <button type="button" class="btn btn-default" data-dismiss="modal">Abbrechen</button>
-        <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="return WPSG_BE_Product.saveProduct();">OK</button>
-      </div>
-    </div>
-  </div>
-</div>
-
-<!-- Modaldialog fÃŒr Versandart / Zahlungsart -->
-<div class="modal fade" id="wpsg_shipping_dialog" tabindex="-1" role="dialog">
-  <div class="modal-dialog" role="document">
-    <div class="modal-content">
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-        <h4 class="modal-title" id="myModalLabel"><?php echo __('Versandart', 'wpsg'); ?></h4>
-      </div>
-      <div class="modal-body"></div>
-      <div class="modal-footer">
-        <button type="button" class="btn btn-default" data-dismiss="modal">Abbrechen</button>
-        <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="return WPSG_BE_Pay_Ship.updateShippingPayment();">OK</button>
-      </div>
-    </div>
-  </div>
-</div>
-
Index: ews/order/view_orderlog.phtml
===================================================================
--- /views/order/view_orderlog.phtml	(revision 8528)
+++ 	(revision )
@@ -1,40 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 06.08.2016
-     * Time: 11:24
-     */ 
- 
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Bestellprotokoll', 'wpsg')); ?>
-<div class="panel-group">
-    <?php foreach ($this->view['oOrder']->getLog() as $k => $ol) { ?>
-    <div class="panel panel-default">
-        <div class="panel-heading" data-toggle="collapse" href="#collapse<?php echo $k; ?>" style="cursor:pointer;">
-            <h4 class="panel-title" style="float:right;"><?php echo wpsg_formatTimestamp($ol['cdate']); ?></h4>
-            <h4 class="panel-title"><?php 
-				
-				if (preg_match('/OrderID:\040(\d+)?/', $ol['mailtext'], $m)) {
-					
-					$oAboExtendOrder = wpsg_order::getInstance(intval($m[1]));
-					
-					$title = '<a href="'.wpsg_admin_url('Order', 'view', ['edit_id' => $oAboExtendOrder->getId()]).'">Bestellung '.$oAboExtendOrder->getNr().'&nbsp;/&nbsp;'.$oAboExtendOrder->getStateLabel().'</a>';
-					
-                } else $title = $ol['title'];
-				
-				echo $title;
-					
-			?></h4>
-        </div>
-        <div id="collapse<?php echo $k; ?>" class="panel-collapse collapse">
-            <div class="panel-body">
-                <pre><?php echo $ol['mailtext']; ?></pre>
-            </div>
-        </div>
-    </div>
-    <?php } ?>
-</div>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
Index: ews/order/view_shippay.phtml
===================================================================
--- /views/order/view_shippay.phtml	(revision 8528)
+++ 	(revision )
@@ -1,46 +1,0 @@
-<?php
-
-    /**
-     * User: Daschmi (https://daschmi.de)
-     * Date: 07.08.2016
-     * Time: 10:52
-     */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Versand- und Zahlungsart', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_TextStart(); ?>
-        <?php echo wpsg_hspc($this->view['oOrder']->getShippingLabel()); ?>
-        <?php $shippingCost = $this->view['oOrder']->getShippingAmount($this->getBackendTaxview()); ?>
-        <?php if ($shippingCost > 0) { ?>
-        (<?php echo wpsg_ff($shippingCost, $this->get_option('wpsg_currency')); ?>)
-        <?php } ?>
-    <?php echo wpsg_drawForm_TextEnd(__('Versandart', 'wpsg')); ?>
-
-    <?php echo wpsg_drawForm_TextStart(); ?>
-        <?php echo wpsg_hspc($this->view['oOrder']->getPaymentLabel()); ?>
-        <?php $paymentCost = $this->view['oOrder']->getPaymentAmount($this->getBackendTaxview()); ?>
-        <?php if ($paymentCost > 0) { ?>
-        (<?php echo wpsg_ff($paymentCost, $this->get_option('wpsg_currency')); ?>)
-        <?php } ?>
-    <?php echo wpsg_drawForm_TextEnd(__('Zahlungsart', 'wpsg')); ?>
-
-    <?php $this->callMods('order_view_afterpayment', array(&$this->view['data']['id'])); ?>
-    
-    <?php /* Retourenlabel DHL  ?>
-    <?php echo wpsg_drawForm_TextStart();?>
-		<a href="https://amsel.dpwn.net/abholportal/gw/lp/portal/[portalname]/customer/RpOrder.action?onInit=&delivery=RetourenLager01&SHIPMENT_REFERENCE=<?php echo $this->view['data']['onr']; ?>
-		   &ADDR_SEND_STREET_ADD=<?php echo $this->view['data']['onr']; ?>
-		   &ADDR_SEND_FIRST_NAME=<?php echo rawurlencode(utf8_decode($this->view['oOrder']->getInvoiceFirstname())); ?>
-		   &ADDR_SEND_LAST_NAME=<?php echo rawurlencode(utf8_decode($this->view['oOrder']->getInvoiceName())); ?>
-		   &ADDR_SEND_NAME_ADD=<?php echo rawurlencode(utf8_decode($company)); ?>
-		   &ADDR_SEND_EMAIL=<?php echo $this->view['data']['email']; ?>
-		   &ADDR_SEND_STREET=<?php echo rawurlencode(utf8_decode($this->view['oOrder']->getInvoiceStreet())); ?>
-		   &ADDR_SEND_ZIP=<?php echo $this->view['oOrder']->getInvoiceZip(); ?>
-		   &ADDR_SEND_CITY=<?php echo rawurlencode(utf8_decode($this->view['oOrder']->getInvoiceCity())); ?>
-		   " target="_blank"><?php echo __('Retourenlabel anfordern', 'wpsg'); ?></a>
-    	
-    <?php echo wpsg_drawForm_TextEnd(__('Retourenlabel', 'wpsg')); ?> */?>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: /views/produkt/addedit.phtml
===================================================================
--- /views/produkt/addedit.phtml	(revision 8528)
+++ /views/produkt/addedit.phtml	(revision 5261)
@@ -7,117 +7,518 @@
 
 ?>
-
-<div class="wpsg_products" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
+<script type="text/javascript">/* <![CDATA[ */
+
+	wpsg_product_edit_change = new Array();
+	                                            
+	jQuery(document).ready( function() {
+		
+	    jQuery('.wpsg_form_help').tipTip();
+
+	    jQuery("#normal-sortables, #side-sortables").sortable({
+			connectWith: ".meta-box-sortables",
+			placeholder: 'wpsg_placeholder',
+			dropOnEmpty: true, 
+			cursor: 'move',
+			grid: [50, 20],
+			handle: '.wpsg_handlediv',
+			forceHelperSize: true,
+			forcePlaceholderSize: true,
+			opacity: 0.8,
+			stop: function(e,ui) {
+
+				var ser = jQuery("#normal-sortables").sortable("serialize");				
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+
+				jQuery.cookie('wpsg_product_view_normal', ser);
+
+				var ser = jQuery("#side-sortables").sortable("serialize");								
+				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
+				
+				jQuery.cookie('wpsg_product_view_side', ser);
+				
+			},
+			receive: function(e, ui) {
+			}
+		}); 
+
+	    if (jQuery.cookie('wpsg_product_view_normal') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_product_view_normal').split(',').reverse();
+
+			for (index in divs)
+			{
+
+				jQuery('#normal-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+
+		if (jQuery.cookie('wpsg_product_view_side') != null)
+		{
+
+			var divs = jQuery.cookie('wpsg_product_view_side').split(',').reverse();
+
+			for (index in divs)
+			{
+
+				jQuery('#side-sortables').prepend(jQuery('#wpsg_' + divs[index]));
+				
+			}
+			
+		}
+
+		var click_x = false;
+		var click_y = false;
+		
+		jQuery('.wpsg_handlediv').bind('click', function(ev) {
+
+			if (Math.abs(click_x - ev.pageX) <= 5 && Math.abs(click_y - ev.pageY) <= 5)
+			{
+
+				jQuery(this).next().toggle();
+
+				var arClose = new Array();
+				jQuery('.wpsg_product_view .postbox .inside:hidden').each(function() {
+					arClose.push(jQuery(this).parent().attr("id"));
+				} );
+
+				jQuery.cookie('wpsg_product_closed', arClose.join(','));
+					
+			}
+			
+		} );
+		
+		jQuery('.wpsg_handlediv').bind('mousedown', function(ev) {
+
+			click_x = ev.pageX;
+			click_y = ev.pageY;	
+						
+		} );
+
+		if (jQuery.cookie('wpsg_product_closed') != null && jQuery.cookie('wpsg_product_closed') != '')
+		{
+
+			var arClose = jQuery.cookie('wpsg_product_closed').split(',');
+
+			for (index in arClose)
+			{
+
+				jQuery('#' + arClose[index] + ' .inside').hide();
+							
+			}
+			
+		}
+
+		jQuery('#submit, #submit_index').bind('click', function() {
+
+			if (wpsg_product_edit_change.length > 0)
+			{
+
+				jQuery('.wpsg_change_error').removeClass('wpsg_change_error');
+				
+			    for (var i = 0; i < wpsg_product_edit_change.length; i++) {
+			    	 
+			        jQuery('#' + wpsg_product_edit_change[i]).addClass('wpsg_change_error');
+			        
+			    }
+
+			    alert('<?php echo __('Bitte ÃŒberprÃŒfen Sie die rot markierten Felder. Ãnderungen in diesen Feldern gehen beim Speichern verloren.', 'wpsg'); ?>');
+
+			    return false;
+				
+			}
+			else
+			{
+
+				return true;
+				
+			}
+			
+		} );
+		
+		// Flaggen fÃŒr die aktuelle Sprache davorbauen
+		<?php if ($this->isMultiLingual() && isset($_REQUEST['wpsg_lang'])) { $arLang = $this->getStoreLanguages(); $lang = $arLang[$_REQUEST['wpsg_lang']]; ?>
+		jQuery('.wpsg_handlediv').prepend('<img src="<?php echo $this->getFlagURL().$lang['flag']; ?>" alt="<?php echo $lang['name']; ?>" />&nbsp;');
+		<?php } ?>
+	    
+	} );
+             
+/* ]]> */</script> 
+
+<div class="wrap columns-2 wpsg_produkt_addedit wpsg_product_view" id="wpsg_product_view">
+	
+	<div id="wpsg_relatedproducts_produktauswahl"></div>
+
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
+	<h2>
+		<?php if ($_REQUEST['edit_id'] > 0) { ?>
+		<?php echo __('Produkt bearbeiten', 'wpsg'); ?>
+		<?php if (isset($_REQUEST['wpsg_lang'])) { ?>
+		&nbsp;[<?php $arLang = $this->getStoreLanguages(); echo $arLang[$_REQUEST['wpsg_lang']]['name']; ?> <img src="<?php echo $this->getFlagURL().$arLang[$_REQUEST['wpsg_lang']]['flag']; ?>" alt="" />]
+		<?php } ?>
+		<?php } else { ?>
+		<?php echo __('Neues Produkt', 'wpsg'); ?>
+		<?php } ?>		
+	</h2>
+	<br />
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	
+ 	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=save&amp;noheader=1" enctype="multipart/form-data">
+
+		<div id="postbox" class="metabox-holder has-right-sidebar">
+
+			<div id="side-info-column" class="inner-sidebar" style="width:386px;">
+				<div id="side-sortables" class="meta-box-sortables ui-sortable" style="width:380px;">
+							
+					<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
+					<div id="wpsg_preis" class="postbox">						
+						<h3 class="wpsg_handlediv">
+							<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+							<span><?php echo __('Preis / Steuer', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<?php echo wpsg_drawForm_Select('mwst_key', __('Steuergruppe', 'wpsg'), wpsg_tax_groups(true), $this->view['data']['mwst_key']); ?>
+							<?php if ($this->get_option('wpsg_preisangaben') == WPSG_NETTO) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="preis">
+										<?php echo __('Preis (NETTO)', 'wpsg'); ?>:										
+									</label>
+								</div>
+								<div class="wpsg_form_right">
+									<p class="waehrung"><?php echo $this->get_option('wpsg_currency'); ?></p>									
+									<input id="preis" type="text" value="<?php echo wpsg_hspc(wpsg_ff($this->view['data']['preis'])); ?>" name="preis" class="wpsg_preis" />																		
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<?php } ?>
+							<?php if ($this->get_option('wpsg_preisangaben') == WPSG_BRUTTO) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">									
+									<?php echo __('Preis (BRUTTO)', 'wpsg'); ?>:
+								</div>
+								<div class="wpsg_form_right">
+									<p class="waehrung"><?php echo $this->get_option('wpsg_currency'); ?></p>
+									<input id="preis" type="text" value="<?php echo wpsg_hspc(wpsg_ff($this->view['data']['preis'])); ?>" name="preis" class="wpsg_preis" />
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<?php } ?>
+							<?php echo wpsg_drawForm_Input('', __('Steueranteil', 'wpsg'), wpsg_ff($this->view['data']['tax_sum_value'], $this->get_option('wpsg_currency')).' / '.$this->getDefaultCountry()->kuerzel, array('text' => true)); ?>
+							<?php echo wpsg_drawForm_Checkbox('euleistungsortregel', __('Produkt unterliegt den EU-Leistungsortregeln', 'wpsg'), $this->view['data']['euleistungsortregel'], array('fullrow' => true, 'help' => 'EU-Leistungsortregel')); ?>
+							<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&amp;subaction=laender">LÃ€nderverwaltung</a>							
+						</div>
+					</div>
+					<div id="wpsg_paymentmethods" class="postbox">						
+						<h3 class="wpsg_handlediv">
+							<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+							<span><?php echo __('Erlaubte Zahlungsarten', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside wpsg_form_field_max">	
+							<select id="wpsg_paymentmethods_select" name="wpsg_paymentmethods_select">
+								<option value="0"><?php echo __('Alle', 'wpsg'); ?></option>
+								<option value="1" <?php echo ((wpsg_isSizedArray($this->view['allowedPayment']))?'selected="selected"':''); ?>><?php echo __('Auswahl', 'wpsg'); ?></option>
+							</select>
+							<div class="wpsg_paymentmethods_select">
+								<?php foreach ($this->arPayment as $p) { if (!isset($p['deleted']) || $p['deleted'] != '1') { ?>
+									<?php echo wpsg_drawForm_Checkbox('wpsg_paymentmethods[]', $p['name'], in_array($p['id'], (array)$this->view['allowedPayment']), array('id' => 'wpsg_paymentmethods_'.$p['id'], 'value' => $p['id'])); ?>
+								<?php } } ?>
+							</div>
+							
+							<script type="text/javascript">/* <![CDATA[ */
+
+								jQuery('#wpsg_paymentmethods_select').bind('change', function() {
+
+									if (jQuery(this).val() == '1')
+									{
+
+										jQuery('.wpsg_paymentmethods_select').show();
+										
+									}
+									else
+									{
+
+										jQuery('.wpsg_paymentmethods_select').hide();
+										
+									}
+									
+								} ).change();
+							
+							/* ]]> */</script>
+						</div>
+					</div>
+					<div id="wpsg_shippingmethods" class="postbox">
+						<h3 class="wpsg_handlediv">
+							<div class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br /></div>
+							<span><?php echo __('Erlaubte Versandarten', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside wpsg_form_field_max">
+							<select id="wpsg_shippingmethods_select" name="wpsg_shippingmethods_select">
+								<option value="0"><?php echo __('Alle', 'wpsg'); ?></option>
+								<option value="1" <?php echo ((wpsg_isSizedArray($this->view['allowedShipping']))?'selected="selected"':''); ?>><?php echo __('Auswahl', 'wpsg'); ?></option>								
+							</select>
+							<div class="wpsg_shippingmethods_select">
+								<?php foreach ($this->arShipping as $s) { if (!isset($s['deleted']) || $s['deleted'] != '1') { ?>
+									<?php echo wpsg_drawForm_Checkbox('wpsg_shippingmethods[]', $s['name'], in_array($s['id'], (array)$this->view['allowedShipping']), array('id' => 'wpsg_paymentmethods_'.$s['id'], 'value' => $s['id'])); ?>
+								<?php } } ?>
+							</div>
+						</div>
+						
+						<script type="text/javascript">/* <![CDATA[ */
+
+							jQuery('#wpsg_shippingmethods_select').bind('change', function() {
+
+								if (jQuery(this).val() == '1')
+								{
+
+									jQuery('.wpsg_shippingmethods_select').show();
+									
+								}
+								else
+								{
+
+									jQuery('.wpsg_shippingmethods_select').hide();
+									
+								}
+								
+							} ).change();
+						
+						/* ]]> */</script>
+					</div>
+					<?php } ?>
+										
+					<?php $this->callMods('produkt_edit_sidebar', array(&$this->view['data'])); ?>
+					 
+				</div>
 			</div>
-			<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="active"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt"><?php echo __("ProduktÃŒbersicht", "wpsg"); ?></a></li>
-					<li role="presentation" class="wpsg_showhide_filter active"><a href="#" onclick="return false;"><?php echo __("Produkte anlegen/bearbeiten", "wpsg"); ?></a></li>
-					<?php if (wpsg_isSizedInt($this->view['data']['id'])) { ?>
-					<li role="presentation" class="wpsg_top_extend">
-						<?php echo $this->view['oProduct']->getProductName(); ?>
-					</li>
-					<?php } ?>
-				</ul>
+		
+			<div id="post-body">
+				
+				<div id="titlediv" style="margin-right:400px;">
+					<div id="titlewrap">					
+						<input type="text" placeholder="<?php echo __('Produktname', 'wpsg'); ?>" id="title" value="<?php echo wpsg_hspc($this->view['data']['name']); ?>" tabindex="1" size="30" name="name">
+					</div>
+				</div>
+				
+				<br />
+								
+				<div id="normal-sortables" class="meta-box-sortables" style="margin-right:400px;">
+						
+					<div id="wpsg_generally" class="postbox">		
+						<h3 class="wpsg_handlediv">
+							<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+							<span><?php echo __('Allgemein', 'wpsg'); ?></span>
+						</h3>
+						<div class="inside">
+							<?php if ($this->isMultiLingual()) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_anr"><?php echo __("Ãbersetzungen", "wpsg"); ?>:</label>
+								</div>								
+								<div class="wpsg_form_right wpsg_form_language">																											
+									<?php foreach ($this->getStoreLanguages() as $a) { ?>
+										<?php if ((isset($_REQUEST['wpsg_lang']) && $_REQUEST['wpsg_lang'] != $a['locale']) || (!isset($_REQUEST['wpsg_lang']) && $a['lang'] != $GLOBALS['q_config']['default_language'])) { ?>
+										<?php if (isset($_REQUEST['wpsg_lang']) && $a['lang'] == $GLOBALS['q_config']['default_language']) { ?>
+										<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id=<?php echo $_REQUEST['edit_id']; ?>" title="<?php echo wpsg_translate(__('Zu Sprache #1# wechseln.', 'wpsg'), $a['name']); ?>">
+										<?php } else { ?>
+										<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id=<?php echo $_REQUEST['edit_id']; ?>&wpsg_lang=<?php echo $a['locale']; ?>" title="<?php echo wpsg_translate(__('Zu Sprache #1# wechseln.', 'wpsg'), $a['name']); ?>">
+										<?php } ?>
+											<img src="<?php echo $this->getFlagURL().$a['flag']; ?>" alt="<?php echo wpsg_translate(__('Zu Sprache #1# wechseln.', 'wpsg'), $a['name']); ?>" />
+										</a>
+										<?php } ?>
+									<?php } ?>
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<?php } ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_anr"><?php echo __("Produktname (Detail)", "wpsg"); ?>:</label>
+								</div>
+								<div class="wpsg_form_right">
+									<input id="detailname" type="text" value="<?php echo wpsg_hspc($this->view['data']['detailname']); ?>" name="detailname" />
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<?php if (wpsg_isSizedInt($this->view['data']['id']) && !isset($_REQUEST['wpsg_lang'])) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_id"><?php echo __('Produkt ID', 'wpsg'); ?>:</label>
+								</div>
+								<div class="wpsg_form_right">
+									<input type="text" name="produkt_id" value="<?php echo wpsg_hspc($this->view['data']['id']); ?>" readonly="readonly" />
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<?php } ?>
+							<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_anr"><?php echo __("Artikelnummer", "wpsg"); ?>:</label>
+								</div>
+								<div class="wpsg_form_right">
+									<input id="produkt_anr" type="text" value="<?php echo wpsg_hspc($this->view['data']['anr']); ?>" name="anr" />
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_ptemplate"><?php echo __('Produkttemplate', 'wpsg'); ?>:</label>									
+								</div>
+								<div class="wpsg_form_right">
+									<?php if (!is_array($this->view['templates']) || sizeof($this->view['templates']) <= 0) { ?>
+									<p class="wpsg_error"><?php echo __('Keine Templatedatein gefunden!', 'wpsg'); ?></p>
+									<?php } else { ?>
+									<select name="ptemplate_file" id="produkt_ptemplate">
+										<?php foreach ($this->view['templates'] as $t) { ?>
+										<option <?php echo (($t == $this->view['data']['ptemplate_file'] || (!isset($this->view['data']['ptemplate_file']) && $t == 'standard.phtml'))?'selected="selected"':''); ?> value="<?php echo wpsg_hspc($t); ?>"><?php echo wpsg_hspc($t); ?></option>
+										<?php } ?>
+									</select>
+									<?php } ?>
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_ptemplate"><?php echo __('URL Benachrichtigung', 'wpsg'); ?>:</label>									
+								</div>
+								<div class="wpsg_form_right">
+									<input style="width:95%;" type="text" name="posturl" class="wpsg_posturl" value="<?php echo wpsg_hspc($this->view['data']['posturl']); ?>" />
+									<div class="wpsg_clear"></div>
+									<label><input type="checkbox" <?php echo (($this->view['data']['posturl_verkauf'] == '1')?'checked="checked"':''); ?> value="1" name="posturl_verkauf" style="width:auto; float:none;" />&nbsp;<?php echo __('beim Verkauf', 'wpsg'); ?></label>
+									&nbsp;&nbsp;
+									<label><input type="checkbox" <?php echo (($this->view['data']['posturl_bezahlung'] == '1')?'checked="checked"':''); ?> value="1" name="posturl_bezahlung" style="width:auto; float:none;" />&nbsp;<?php echo __('bei Bezahlung', 'wpsg'); ?></label>
+									<a rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=URLBenachrichtigung" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=URLBenachrichtigung" class="wpsg_form_help"></a>									 						 
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>	
+							<?php } ?>
+							
+							<?php if (!$this->hasMod('wpsg_mod_produktartikel') && !isset($_REQUEST['wpsg_lang'])) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="partikel"><?php echo __('Zugeordneter Wordpress Artikel', 'wpsg'); ?>:</label>
+								</div>								
+								<div class="wpsg_form_right">
+									<select id="partikel" name="partikel">
+										<option value=""><?php echo __("Bitte auswÃ€hlen", "wpsg"); ?></option>									
+										<?php $arArtikel = get_posts('numberposts=-1'); if (is_array($arArtikel) && sizeof($arArtikel) > 0) { ?>
+										<optgroup label="<?php echo __('Artikel', 'wpsg'); ?>">
+											<?php foreach ($arArtikel as $a) { ?>
+											<option <?php echo (($a->ID == $this->view['data']['partikel'])?'selected="selected"':''); ?> value="<?php echo $a->ID; ?>"><?php echo $a->post_title; ?></option>
+											<?php } ?>
+										</optgroup>
+										<?php } ?>
+										<?php $arPages = get_pages(); if (is_array($arPages) && sizeof($arPages) > 0) { ?>
+										<optgroup label="<?php echo __('Seiten', 'wpsg'); ?>">
+											<?php foreach ($arPages as $p) { ?>
+											<option <?php echo (($p->ID == $this->view['data']['partikel'])?'selected="selected"':''); ?> value="<?php echo $p->ID; ?>"><?php echo $p->post_title; ?></option>
+											<?php } ?>
+										</optgroup>
+										<?php } ?>
+									</select>
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>
+							<?php } ?>
+							
+							<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
+							<?php echo wpsg_drawForm_Select('basket_multiple', __('Verhalten im Warenkorb', 'wpsg'), array(
+								'0' => __('Nur einmal mit beliebiger Menge (Standard)', 'wpsg'),
+								'4' => __('Nur einmal mit Menge 1', 'wpsg'),
+								'1' => __('Mehrfach mit beliebiger Menge', 'wpsg'),
+								'2' => __('Mehrfach mit Menge 1', 'wpsg')
+							), $this->view['data']['basket_multiple'], array('help' => 'basket_multiple')); ?>							
+							<?php } ?>
+							 
+							<?php if ($this->view['data']['id'] > 0) { ?>
+							<div class="wpsg_form_field">
+								<div class="wpsg_form_left">
+									<label for="produkt_ptemplate"><?php echo __('URL', 'wpsg'); ?>:</label>									
+								</div>
+								<div class="wpsg_form_right">	
+									<p>									
+										<a href="<?php echo $this->getProduktLink(array('id' => ((wpsg_isSizedInt($this->view['data']['lang_parent']))?$this->view['data']['lang_parent']:$this->view['data']['id']))); ?>"><?php echo $this->getProduktLink(array('id' => ((wpsg_isSizedInt($this->view['data']['lang_parent']))?$this->view['data']['lang_parent']:$this->view['data']['id']))); ?></a>
+									</p>
+								</div>
+								<div class="wpsg_clear"></div>
+							</div>	
+							<?php } ?>
+							
+							<?php $this->callMods('produkt_edit_allgemein', array(&$this->view['data'])); ?>
+							
+						</div>
+					</div>
+				
+					<div id="wpsg_description" class="postbox">		
+						<h3 class="wpsg_handlediv">
+							<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
+							<span><?php echo __('Beschreibung', 'wpsg'); ?></span>
+						</h3>	
+						<div class="inside">
+						 
+							<?php 
+							
+							function wpsg_ShowTinyMCE() { 
+								
+								 
+								
+								wp_print_scripts('editor');
+								if (function_exists('add_thickbox')) add_thickbox();
+								wp_print_scripts('media-upload');
+								if (function_exists('wp_tiny_mce')) wp_tiny_mce();
+								wp_admin_css();
+								
+								do_action("admin_print_styles-post-php");
+								do_action('admin_print_styles');
+								
+							}
+							
+							function wpsg_formatTinyMCE($in)
+							{
+								
+								if (isset($in['theme_advanced_buttons1'])) $in['theme_advanced_buttons1'] = str_replace(",wpsg", "", $in['theme_advanced_buttons1']);
+								
+								return $in;
+								
+							}
+							
+							// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
+							remove_filter('the_editor', 'qtrans_modifyRichEditor');
+							
+							add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
+							add_filter('admin_head','wpsg_ShowTinyMCE');
+							wp_editor($this->view['data']['beschreibung'], 'beschreibung');
+							
+							?>
+										
+						</div>
+					</div>
+			
+					<?php $this->callMods('produkt_edit_content', array(&$this->view['data'])); ?>
+				
+				</div>
+						
+				<?php if ($_REQUEST['edit_id'] > 0) { ?>
+				<input type="hidden" name="edit_id" value="<?php echo $_REQUEST['edit_id']; ?>" />
+				<?php } ?>
+				
+				<?php if (isset($_REQUEST['wpsg_lang'])) { ?>
+				<input type="hidden" name="wpsg_lang" value="<?php echo $_REQUEST['wpsg_lang']; ?>" />
+				<?php } ?>
+			
+				<p class="submit">
+					<input type="submit" value="<?php echo __('Produkt speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
+					<input type="submit" value="<?php echo __('Produkt speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
+				</p>
+				
 			</div>
+	
 		</div>
-	</nav>
-	
-	<div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-				
-	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=save&noheader=1" enctype="multipart/form-data">
-	
-		<?php echo wp_nonce_field('wpsg-product-save-'.wpsg_getInt($_REQUEST['edit_id'])); ?>
-		
-		<div class="wpsg_admin_submenu">
-		 
-			<div class="list-group" id="wpsg_product_tabs">		
-			
-				<?php if (wpsg_isSizedInt($this->view['data']['id'])) { ?>
-				<span class="list-group-head list-group-item"><?php echo wpsg_translate(
-                    __('Produkt ID:#1#', 'wpsg').'<span style="float:right;"><a href="#2#" title="Produkt im Frontend ansehen" target="_blank"><span class="glyphicon glyphicon-new-window"></span></a></span>',
-					$this->view['data']['id'],
-					$this->view['oProduct']->getProductURL(((isset($_REQUEST['wpsg_lang']))?$_REQUEST['wpsg_lang']:false))
-				); ?></span>
-				<?php } else { ?>
-				<span class="list-group-head list-group-item"><?php echo __('Neues Produkt', 'wpsg'); ?></span>
-				<?php } ?>
-				
-				<?php $i = 0; foreach ($this->view['arSubAction'] as $k => $v) { $i ++; ?>		 
-				<a class="list-group-item <?php echo ((wpsg_getStr($_COOKIE['wpsg_product_addedit_tab'], 'general') === $k)?'active':''); ?>" wpsg-data-target="<?php echo $k; ?>" href="#"><?php echo $v['title']; ?></a>		
-				<?php } ?>								
-			</div>
-									
-			<?php if (wpsg_isSizedString($_REQUEST['action'], 'add')) { ?>
-				<div class="info"><?php echo __('Nach dem erstmaligen Speichern kÃ¶nnen weitere Einstellungen (Preisangaben, Produktbilder, ...) vorgenommen werden.', 'wpsg'); ?></div>
-				<br />
-			<?php } ?>
-			
-			<br />
-			
-			<?php if (wpsg_isSizedString($_REQUEST['edit_id'])) { ?>
-			<input type="hidden" name="edit_id" value="<?php echo $_REQUEST['edit_id']; ?>" />
-			<?php } ?>
-			
-			<?php if (isset($_REQUEST['wpsg_lang'])) { ?>
-			<input type="hidden" name="wpsg_lang" value="<?php echo $_REQUEST['wpsg_lang']; ?>" />
-			<?php } ?>
-			
-			<input type="submit" value="<?php echo __('Speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />			
-			<input type="submit" value="<?php echo __('Speichern / zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
-						
-		</div>
-		
-		<div class="wpsg_admin_content form-horizontal">
-
-			<?php $i = 0; foreach ($this->view['arSubAction'] as $k => $v) { $i ++; ?>
-			<div id="<?php echo $k; ?>" style="display:<?php echo ((wpsg_getStr($_COOKIE['wpsg_product_addedit_tab'], 'general') === $k)?'block':'none'); ?>;" class="wpsg_product_tab_content">
-				
-				<?php echo $v['content']; ?>
-				
-			</div>		
-			<?php } ?>
-		
-		</div>
-		
+	
 	</form>
-			 
-	<script type="text/javascript">/* <![CDATA[ */
-
-		jQuery(document).ready(function() {
-			    
-			jQuery('#wpsg_product_tabs a.list-group-item').bind('click', function() {
-	        
-				jQuery('#wpsg_product_tabs a').removeClass('active');
-				jQuery('.wpsg_product_tab_content').hide();
-				
-				jQuery(this).addClass('active');
-				jQuery('#' + jQuery(this).attr('wpsg-data-target')).show();
-                
-				jQuery.cookie('wpsg_product_addedit_tab', jQuery(this).attr('wpsg-data-target'));
-				jQuery(this).blur();				
-				
-			} );
-            
-			//Anzahl aktive ermitteln
-			//alert( jQuery('#wpsg_product_tabs a.list-group-item.active').length );
-			
-			//Erstes anklicken
-			//jQuery('#wpsg_product_tabs a.list-group-item').first().click();
-            
-		    if (jQuery('#wpsg_product_tabs a.list-group-item.active').length < 1) { 
-		    	
-				jQuery('#wpsg_product_tabs a.list-group-item').first().click();
-
-			}
-
-		} );		
-    
-	/* ]]> */</script> 
-			 
-</div>
+	
+</div> 
Index: ews/produkt/addedit_alternativeDesign.phtml
===================================================================
--- /views/produkt/addedit_alternativeDesign.phtml	(revision 8528)
+++ 	(revision )
@@ -1,364 +1,0 @@
-<?php
-
-	/**
-	 * Alternativtemplate zur Ausgabe der Produktverwaltung
-	 */
-
-?>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	wpsg_product_edit_change = new Array();
-
-	jQuery(document).ready( function() {
-
-		//jQuery('.wpsg_form_help').tipTip();
-
-		jQuery("#normal-sortables, #side-sortables").sortable({
-			connectWith: ".meta-box-sortables",
-			placeholder: 'wpsg_placeholder',
-			dropOnEmpty: true,
-			cursor: 'move',
-			grid: [50, 20],
-			handle: '.wpsg_handlediv',
-			forceHelperSize: true,
-			forcePlaceholderSize: true,
-			opacity: 0.8,
-			stop: function(e,ui) {
-
-				var ser = jQuery("#normal-sortables").sortable("serialize");
-				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
-
-				jQuery.cookie('wpsg_product_view_normal', ser);
-
-				var ser = jQuery("#side-sortables").sortable("serialize");
-				ser = ser.replace(/\&wpsg\[\]\=/g, ',').replace(/wpsg\[\]\=/g, '');
-
-				jQuery.cookie('wpsg_product_view_side', ser);
-
-			},
-			receive: function(e, ui) {
-			}
-		});
-
-		if (jQuery.cookie('wpsg_product_view_normal') != null)
-		{
-
-			var divs = jQuery.cookie('wpsg_product_view_normal').split(',').reverse();
-
-			for (index in divs)
-			{
-
-				jQuery('#normal-sortables').prepend(jQuery('#wpsg_' + divs[index]));
-
-			}
-
-		}
-
-		if (jQuery.cookie('wpsg_product_view_side') != null)
-		{
-
-			var divs = jQuery.cookie('wpsg_product_view_side').split(',').reverse();
-
-			for (index in divs)
-			{
-
-				jQuery('#side-sortables').prepend(jQuery('#wpsg_' + divs[index]));
-
-			}
-
-		}
-
-		var click_x = false;
-		var click_y = false;
-
-		jQuery('.wpsg_handlediv').bind('click', function(ev) {
-
-			console.log(ev);
-
-			if (Math.abs(click_x - ev.pageX) <= 5 && Math.abs(click_y - ev.pageY) <= 5)
-			{
-
-				jQuery(this).next().toggle();
-
-				var arClose = new Array();
-				jQuery('.wpsg_product_view .postbox .inside:hidden').each(function() {
-					arClose.push(jQuery(this).parent().attr("id"));
-				} );
-
-				jQuery.cookie('wpsg_product_closed', arClose.join(','));
-
-			}
-
-		} );
-
-		jQuery('.wpsg_handlediv').bind('mousedown', function(ev) {
-
-			click_x = ev.pageX;
-			click_y = ev.pageY;
-
-		} );
-
-		if (jQuery.cookie('wpsg_product_closed') != null && jQuery.cookie('wpsg_product_closed') != '')
-		{
-
-			var arClose = jQuery.cookie('wpsg_product_closed').split(',');
-
-			for (index in arClose)
-			{
-
-				jQuery('#' + arClose[index] + ' .inside').hide();
-
-			}
-
-		}
-
-		jQuery('#submit, #submit_index').bind('click', function() {
-
-			if (wpsg_product_edit_change.length > 0)
-			{
-
-				jQuery('.wpsg_change_error').removeClass('wpsg_change_error');
-
-				for (var i = 0; i < wpsg_product_edit_change.length; i++) {
-
-					jQuery('#' + wpsg_product_edit_change[i]).addClass('wpsg_change_error');
-
-				}
-
-				alert('<?php echo __('Bitte ÃŒberprÃŒfen Sie die rot markierten Felder. Ãnderungen in diesen Feldern gehen beim Speichern verloren.', 'wpsg'); ?>');
-
-				return false;
-
-			}
-			else
-			{
-
-				return true;
-
-			}
-
-		} );
-
-		// Flaggen fÃŒr die aktuelle Sprache davorbauen
-		<?php if ($this->isMultiLingual() && isset($_REQUEST['wpsg_lang'])) { $arLang = $this->getStoreLanguages(); $lang = $arLang[$_REQUEST['wpsg_lang']]; ?>
-		jQuery('.wpsg_handlediv').prepend('<img src="<?php echo $this->getFlagURL().$lang['flag']; ?>" alt="<?php echo $lang['name']; ?>" />&nbsp;');
-		<?php } ?>
-
-		$(".addedit_templateV3 .general-panel-ordercondition .col-sm-6").removeClass("col-sm-6 col-sm-offset-6");
-
-		// Position der Section "EU-Leistungsortregeln" korrigieren
-		let leistungsortregelnCheckbox = $("input#euleistungsortregel");
-		let leistungsortregelenContainer = leistungsortregelnCheckbox.parents().eq(3);
-		let laenderverwaltungsLink = leistungsortregelnCheckbox.parents().eq(4).next();
-		let leistungsortregelnPanel = leistungsortregelenContainer.closest('.panel');
-
-		leistungsortregelenContainer.addClass("col-sm-12 col-sm-offset-12 v3Design_leistungsortregelCheckbox");
-
-		leistungsortregelenContainer.css({
-			"padding-left": "15px",
-			"margin-left": "0"
-		});
-
-		laenderverwaltungsLink.css({
-			"padding-left": "15px"
-		});
-
-		// Wenn form-control Element das letzte seiner Art im jeweiligen Elementeblock ist, Klasse hinzufÃŒgen
-		let counter = 0;
-		let formControlElements = $(".addedit_templateV3 .form-group");
-
-		$.each(formControlElements, function(key, val) {
-
-			let jQueryObj = jsElTojQueryObj(val, 'form-group');
-
-
-			if(!jQueryObj.next().hasClass("form-group")) {
-				jQueryObj.addClass("last-form-group");
-			}
-
-		});
-
-		// handlediv Klasse allen panel-heading hinzufÃŒgen
-		let panelHeadings = $(".panel-heading");
-
-		$.each(panelHeadings, function(key, val) {
-
-			let jQueryObj = jsElTojQueryObj(val, 'panel-heading');
-
-			val.classList.add("handlediv");
-			jQueryObj.wrap("<div class='wpsg_handlediv'></div>");
-
-		});
-
-		// Weist dem gegebenen JS Element eine einzigartige Klasse zu
-		// und gibt das jeweilige Element als jQuery Object zurÃŒck
-		function jsElTojQueryObj(jsEl, specificClass) {
-
-			let id = jsEl.id ? `#${jsEl.id}` : "";
-			let classes = "";
-
-			if(typeof jsEl !== "object" || jsEl.length <= 1 && jsEl[0] === "#document")
-				return;
-
-			jsEl.classList.add(`${specificClass}-${counter++}`);
-
-			if(jsEl.classList && jsEl.classList.length > 0) {
-
-				jsEl.classList.forEach(function(className) {
-					if(!classes.includes(`.${className}`)) classes += `.${className}`;
-				});
-
-			}
-
-			return $(`${jsEl.tagName.toLowerCase()}${id}${classes}`);
-
-		} // function jsElTojQueryObj(jsEl, specificClass)
-
-	} );
-
-	/* ]]> */</script>
-
-<div class="wrap columns-2 wpsg_produkt_addedit addedit_templateV3 wpsg_product_view" id="wpsg_product_view">
-
-	<div id="wpsg_relatedproducts_produktauswahl"></div>
-
-	<div class="icon32 icon32-posts-post" id="icon-edit"><br /></div>
-	<h2>
-		<?php if ($_REQUEST['edit_id'] > 0) { ?>
-			<?php echo __('Produkt bearbeiten', 'wpsg'); ?>
-			<?php if (isset($_REQUEST['wpsg_lang'])) { ?>
-				&nbsp;[<?php $arLang = $this->getStoreLanguages(); echo $arLang[$_REQUEST['wpsg_lang']]['name']; ?> <img src="<?php echo $this->getFlagURL().$arLang[$_REQUEST['wpsg_lang']]['flag']; ?>" alt="" />]
-			<?php } ?>
-		<?php } else { ?>
-			<?php echo __('Neues Produkt', 'wpsg'); ?>
-		<?php } ?>
-	</h2>
-	<br />
-
-	<?php echo $this->writeBackendMessage(); ?>
-
-	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=save&amp;noheader=1" enctype="multipart/form-data">
-		
-		<?php echo wp_nonce_field('wpsg-product-save-'.wpsg_getInt($_REQUEST['edit_id'])); ?>
-		
-		<div id="postbox" class="metabox-holder has-right-sidebar">
-
-			<div id="side-info-column" class="inner-sidebar" style="width:386px;">
-				<div id="side-sortables" class="meta-box-sortables ui-sortable" style="width:380px;">
-
-					<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
-						<div id="wpsg_preis" class="">
-							<div class="inside panel-price">
-
-								<?php echo $this->view['arSubAction']['price']['content']; ?>
-
-							</div>
-						</div>
-						<div id="wpsg_paymentmethods" class="">
-							<div class="inside panel-payship">
-
-								<?php echo $this->view['arSubAction']['payship']['content']; ?>
-
-							</div>
-						</div>
-					<?php } ?>
-
-					<?php $this->callMods('produkt_edit_sidebar_contentt', array(&$this->view['data'])); ?>
-
-				</div>
-			</div>
-
-			<div id="post-body">
-
-				<div id="titlediv" style="margin-right:400px;">
-					<div id="titlewrap">
-						<input type="text" placeholder="<?php echo __('Produktname', 'wpsg'); ?>" id="title" value="<?php echo wpsg_hspc($this->view['data']['name']); ?>" tabindex="1" size="30" name="name">
-					</div>
-				</div>
-
-				<br />
-
-				<div id="normal-sortables" class="meta-box-sortables" style="margin-right:400px;">
-
-					<div id="wpsg_generally" class="">
-						<div class="inside panel-general">
-
-							<?php echo $this->view['arSubAction']['general']['content']; ?>
-
-						</div>
-					</div>
-
-					<div id="wpsg_description" class="postbox">
-						<h3 class="wpsg_handlediv texte-title">
-							<span title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>" class="handlediv"><br /></span>
-							<span><?php echo __('Beschreibung', 'wpsg'); ?></span>
-						</h3>
-						<div class="inside panel-texte">
-
-							<?php echo $this->view['arSubAction']['texte']['content']; ?>
-
-						</div>
-					</div>
-
-					<div id="wpsg_images" class="">
-						<div class="inside panel-images">
-
-							<?php echo $this->view['arSubAction']['images']['content']; ?>
-
-						</div>
-					</div>
-
-					<div id="wpsg_stock">
-						<div class="inside panel-stock">
-
-							<?php echo $this->view['arSubAction']['stock']['content']; ?>
-
-						</div>
-					</div>
-
-					<div id="wpsg_mods" class="mod-area">
-						<h1>Aktivierte Mods</h1>
-						<?php
-
-							foreach($this->view['arSubAction'] as $index => $subArr)
-							{
-								if(strpos($index, 'wpsg_mod') !== false)
-								{
-
-									$modtitle = $this->view['arSubAction'][$index]['title'];
-
-									echo "<div class='inside mod-$modtitle'>";
-									echo $this->view['arSubAction'][$index]['content'];
-									echo '</div>';
-
-								}
-							}
-
-						?>
-					</div>
-
-					<?php $this->callMods('produkt_edit_content', array(&$this->view['data'])); ?>
-
-				</div>
-
-				<?php if ($_REQUEST['edit_id'] > 0) { ?>
-					<input type="hidden" name="edit_id" value="<?php echo $_REQUEST['edit_id']; ?>" />
-				<?php } ?>
-
-				<?php if (isset($_REQUEST['wpsg_lang'])) { ?>
-					<input type="hidden" name="wpsg_lang" value="<?php echo $_REQUEST['wpsg_lang']; ?>" />
-				<?php } ?>
-
-				<p class="submit">
-					<input type="submit" value="<?php echo __('Produkt speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" />
-					<input type="submit" value="<?php echo __('Produkt speichern und zur Ãbersicht', 'wpsg'); ?>" class="button-primary" id="submit_index" name="submit_index" />
-				</p>
-
-			</div>
-
-		</div>
-
-	</form>
-
-</div>
Index: ews/produkt/addedit_general.phtml
===================================================================
--- /views/produkt/addedit_general.phtml	(revision 8528)
+++ 	(revision )
@@ -1,114 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr den Reiter "Allgemein" der Produktverwaltung
-	 */
-
-?>
-
-<div class="general-panel-block">
-	<div class="general-panel-general">
-		<?php echo wpsg_drawForm_AdminboxStart(__('Allgemein', 'wpsg')); ?>
-
-		<?php echo wpsg_drawForm_Input('name', __('Produktname', 'wpsg'), wpsg_getStr($this->view['data']['name']), array('placeholder' => __('Bitte hier den Produktnamen eingeben', 'wpsg'))); ?>
-
-		<?php echo wpsg_drawForm_Select('disabled', __('Produktstatus', 'wpsg'), array('0' => __('verÃ¶ffentlicht', 'wpsg'), '1' => __('Entwurf', 'wpsg')), wpsg_getStr($this->view['data']['disabled'])); ?>
-
-		<?php if ($this->isMultiLingual()) { ?>
-        
-		<?php echo wpsg_drawForm_TextStart(); ?>
-		<?php foreach ($this->getStoreLanguages() as $a) { ?>
-		<?php if ((isset($_REQUEST['wpsg_lang']) && $_REQUEST['wpsg_lang'] != $a['lang']) || (!isset($_REQUEST['wpsg_lang']) && $a['lang'] != $this->getDefaultLanguageCode())) { ?>
-		<?php if (isset($_REQUEST['wpsg_lang']) && $a['lang'] == $this->getDefaultLanguageCode()) { ?>
-		<a href="<?php
-
-                echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.intval($_REQUEST['edit_id']), 'wpsg-product-edit-'.intval($_REQUEST['edit_id']));
-
-            ?>" title="<?php echo wpsg_translate(__('Zu Sprache #1# wechseln.', 'wpsg'), $a['name']); ?>">
-			<?php } else { ?>
-			<a href="<?php
-
-                echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$_REQUEST['edit_id'].'&wpsg_lang='.$a['lang'], 'wpsg-product-edit-'.$_REQUEST['edit_id']);
-
-			?>" title="<?php echo wpsg_translate(__('Zu Sprache #1# wechseln.', 'wpsg'), $a['name']); ?>">
-				<?php } ?>
-				<img src="<?php echo $this->getFlagURL().$a['flag']; ?>" alt="<?php echo wpsg_translate(__('Zu Sprache #1# wechseln.', 'wpsg'), $a['name']); ?>" />
-			</a>
-			<?php } ?>
-			<?php } ?>
-			<?php echo wpsg_drawForm_TextEnd(__('Ãbersetzungen', 'wpsg')); ?>
-			<?php } ?>
-			<?php echo wpsg_drawForm_Input('detailname', __('Produktname (Detail)', 'wpsg'), wpsg_getStr($this->view['data']['detailname']), [
-				'help' => 'product_detailname', 'hint' => __('Wird im Frontend anstelle des Produktnamens verwendet', 'wpsg')
-			]); ?>
-			<?php echo wpsg_drawForm_Input('shortdesc', __('Produktbeschreibung (Kurz)', 'wpsg'), wpsg_getStr($this->view['data']['shortdesc'])); ?>
-			<?php if (wpsg_isSizedInt($this->view['data']['id']) && !isset($_REQUEST['wpsg_lang'])) { ?>
-				<?php echo wpsg_drawForm_Input(false, __('Produkt ID', 'wpsg'), wpsg_getStr($this->view['data']['id']), array('readonly' => true)); ?>
-			<?php } ?>
-			<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
-				<?php echo wpsg_drawForm_Input('anr', __('Artikelnummer', 'wpsg'), wpsg_getStr($this->view['data']['anr'])); ?>
-				<?php if (!is_array($this->view['templates']) || sizeof($this->view['templates']) <= 0) { ?>
-					<?php echo wpsg_drawForm_Text(__('Produkttemplate', 'wpsg'), __('Keine Templatesdateien gefunden!', 'wpsg'), array('class_content_wrap' => 'wpsg_error')); ?>
-				<?php } else { ?>
-					<?php /* $this->view['templates'][-1] = __('Bitte auswÃ€hlen', 'wpsg'); ksort($this->view['templates']); */ ?>
-					<?php echo wpsg_drawForm_Select('ptemplate_file', __('Produkttemplate', 'wpsg'), $this->view['templates'], wpsg_getStr($this->view['data']['ptemplate_file']), array('noKeys' => true)); ?>
-				<?php } ?>
-			<?php } ?>
-			<?php if (!$this->hasMod('wpsg_mod_produktartikel')) { ?>
-				<?php echo wpsg_drawForm_Select('partikel', __('Zugeordneter Wordpress Artikel', 'wpsg'), $this->view['partikel_select'], wpsg_getStr($this->view['data']['partikel']), array('optgroup' => true)); ?>
-			<?php } ?>
-			<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
-				<?php echo wpsg_drawForm_Select('basket_multiple', __('Verhalten im Warenkorb', 'wpsg'), array(
-					'0' => __('Nur einmal mit beliebiger Menge (Standard)', 'wpsg'),
-					'4' => __('Nur einmal mit Menge 1', 'wpsg'),
-					'1' => __('Mehrfach mit beliebiger Menge', 'wpsg'),
-					'2' => __('Mehrfach mit Menge 1', 'wpsg')
-				), wpsg_getStr($this->view['data']['basket_multiple']), array('help' => 'basket_multiple')); ?>
-			<?php } ?>
-
-			<br />
-
-			<?php if (wpsg_isSizedInt($this->view['data']['id'])) { ?>
-				<?php echo wpsg_drawForm_TextStart(); $url = $this->getProduktLink(array('id' => ((wpsg_isSizedInt($this->view['data']['id']))?$this->view['data']['id']:$this->view['data']['id']))); ?>
-				<a href="<?php echo $url; ?>"><?php echo wpsg_hspc($url); ?></a>
-				<?php echo wpsg_drawForm_TextEnd(__('URL', 'wpsg')); ?>
-			<?php } ?>
-
-			<?php /* Shortcode */ ?>
-			<?php if (wpsg_isSizedInt($this->view['data']['id'])) { ?>
-				<?php echo wpsg_drawForm_Input(false, __('Shortcode', 'wpsg'), '[wpshopgermany product="'.$this->view['data']['id'].'"]', array('readonly' => true)); ?>
-			<?php } ?>
-
-			<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
-				<?php $arSelect = array('0' => __('Nicht anzeigen', 'wpsg'), '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5'); ?>
-				<?php if (defined('STO_PATH')) $arSelect['-1'] = __('Aus Kommentarbewertung', 'wpsg'); ?>
-				<?php echo wpsg_drawForm_Select('rating', __('Bewertungspunkte', 'wpsg'), $arSelect, wpsg_getInt($this->view['data']['rating'])); ?>
-			<?php } ?>
-
-			<?php $this->callMods('produkt_edit_allgemein', array(&$this->view['data'])); ?>
-
-			<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-	</div>
-
-	<div class="general-panel-subblock">
-		<div class="general-panel-ordercondition">
-			<?php if ($this->hasMod('wpsg_mod_ordercondition')) { ?>
-
-				<?php $this->callMod('wpsg_mod_ordercondition', 'produkt_edit_sidebar', array(&$this->view['data'])); ?>
-
-			<?php } ?>
-		</div>
-
-		<div class="general-panel-urlnotification">
-			<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
-			<?php echo wpsg_drawForm_AdminboxStart(__('URL Benachrichtigung', 'wpsg')); ?>
-				<?php echo wpsg_drawForm_Input('posturl', __('URL', 'wpsg'), wpsg_getStr($this->view['data']['posturl']), array('help' => 'URLBenachrichtigung')); ?>
-				<?php echo wpsg_drawForm_Checkbox('posturl_verkauf', __('Beim Verkauf', 'wpsg'), wpsg_getStr($this->view['data']['posturl_verkauf'])); ?>
-				<?php echo wpsg_drawForm_Checkbox('posturl_bezahlung', __('Bei Bezahlung', 'wpsg'), wpsg_getStr($this->view['data']['posturl_bezahlung'])); ?>
-			<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-			<?php } ?>
-		</div>
-	</div>
-
-</div>
-
Index: ews/produkt/addedit_payship.phtml
===================================================================
--- /views/produkt/addedit_payship.phtml	(revision 8528)
+++ 	(revision )
@@ -1,65 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr den Reiter "Versand-/ Zahlungsarten"
-	 */
-	
-?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Erlaubte Zahlungsarten', 'wpsg')); ?>
-	<?php echo wpsg_drawForm_Select('wpsg_paymentmethods_select', '', array('0' => __('Alle', 'wpsg'), '1' => __('Auswahl', 'wpsg')), ((wpsg_isSizedArray($this->view['allowedPayment']))?'1':'0')); ?>		
-	<div class="wpsg_paymentmethods_select">
-		<?php foreach ($this->arPayment as $p) { if (!isset($p['deleted']) || $p['deleted'] != '1') {
-
-		        if ($p['id'] === '0') $p['value'] = 'free';
-		        else $p['value'] = $p['id'];
-
-		    ?>
-			<?php echo wpsg_drawForm_Checkbox('wpsg_paymentmethods[]', $p['name'], in_array(strval($p['id']), (array)$this->view['allowedPayment']), array('id' => 'wpsg_paymentmethods_'.$p['id'], 'value' => (string)$p['value'])); ?>
-		<?php } } ?>
-	</div>
-	
-	<?php if ($this->hasMod('wpsg_mod_userpayment')) { ?>
-	<br />
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_userpayment"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Weitere Zahlvarianten definieren', 'wpsg'); ?></a>
-	<?php } ?>
-	
-	<script>
-
-		jQuery('#wpsg_paymentmethods_select').on('change', function() {
-
-			if (jQuery(this).val() == '1') jQuery('.wpsg_paymentmethods_select').show();
-			else jQuery('.wpsg_paymentmethods_select').hide();
-			
-		} ).trigger('change');
-
-
-	
-	</script>
-	
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Erlaubte Versandarten', 'wpsg')); ?>
-	<?php echo wpsg_drawForm_Select('wpsg_shippingmethods_select', '', array('0' => __('Alle', 'wpsg'), '1' => __('Auswahl', 'wpsg')), ((wpsg_isSizedArray($this->view['allowedShipping']))?'1':'0')); ?>
-	<div class="wpsg_shippingmethods_select">
-		<?php foreach ($this->arShipping as $s) { if (!isset($s['deleted']) || $s['deleted'] != '1') { ?> 
-			<?php echo wpsg_drawForm_Checkbox('wpsg_shippingmethods[]', $s['name'], in_array(strval($s['id']), (array)$this->view['allowedShipping']), array('id' => 'wpsg_shippingmethods_'.$s['id'], 'value' => $s['id'])); ?>
-		<?php } } ?>
-	</div>
-	
-	<?php if ($this->hasMod('wpsg_mod_versandarten')) { ?>
-	<br />
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_versandarten"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Weitere Versandarten definieren', 'wpsg'); ?></a>
-	<?php } ?>
-							
-	<script>
-	
-		jQuery('#wpsg_shippingmethods_select').on('change', function() {
-	
-			if (jQuery(this).val() == '1') jQuery('.wpsg_shippingmethods_select').show();
-			else jQuery('.wpsg_shippingmethods_select').hide();
-									
-		} ).trigger('change');
-							
-	</script>
-	
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: ews/produkt/addedit_price.phtml
===================================================================
--- /views/produkt/addedit_price.phtml	(revision 8528)
+++ 	(revision )
@@ -1,16 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration der Preiseinstellungen in die Produktverwaltung
-	 */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Preis / Steuer', 'wpsg')); ?>
-	<?php echo wpsg_drawForm_Select('mwst_key', __('Steuergruppe', 'wpsg'), wpsg_tax_groups(true), @$this->view['data']['mwst_key']); ?>								
-	<?php echo wpsg_drawForm_Input('preis', wpsg_translate(__('Preis (#1#)', 'wpsg'), (($this->getBackendTaxview() === WPSG_NETTO)?'NETTO':'BRUTTO')), wpsg_ff($this->view['data']['preis'])); ?>
-	<?php echo wpsg_drawForm_Input('oldprice', wpsg_translate(__('Alter Preis (#1#)', 'wpsg'), (($this->getBackendTaxview() === WPSG_NETTO)?'NETTO':'BRUTTO')), wpsg_ff($this->view['data']['oldprice'])); ?>
-	<?php echo wpsg_drawForm_Text(__('Steueranteil', 'wpsg'), wpsg_ff(@$this->view['data']['tax_sum_value'], $this->get_option('wpsg_currency')).' / '.$this->getDefaultCountry()->kuerzel, array('text' => true)); ?>
-	<?php echo wpsg_drawForm_Checkbox('euleistungsortregel', __('Produkt unterliegt den EU-Leistungsortregeln', 'wpsg'), @$this->view['data']['euleistungsortregel'], array('fullrow' => true, 'help' => 'EU-Leistungsortregel')); ?>
-	<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&subaction=laender"><span class="glyphicon glyphicon-globe wpsg-glyphicon"></span><?php echo __('LÃ€nderverwaltung', 'wpsg'); ?></a>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: ews/produkt/addedit_productcodes.phtml
===================================================================
--- /views/produkt/addedit_productcodes.phtml	(revision 8528)
+++ 	(revision )
@@ -1,150 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * Template fÃŒr die Anzeige der Produktcodes
-	 * @author: Daniel Schmitzer (daschmi@daschmi.de)
-	 * @date: 24.04.23
-	 * @time: 13:16
-	 */
-		
-	namespace wpsg;
-
-?>
-
-<div class="general-panel-block">
-	<div class="general-panel-general">
-		<?php echo wpsg_drawForm_AdminboxStart(__('Productcodes', 'wpsg')); ?>
-	
-			<?php if (intval($this->view['data']['id']) > 0) {
-				
-				/** @var \wpsg_product $oProduct */
-				$oProduct = \wpsg_product::getInstance(intval($this->view['data']['id']));
-				
-				$arData = [];
-				
-				foreach (\wpsg_product::getProductCodeConfig() as $code_key => $code_data) {
-					
-					$product_code = $oProduct->getMeta($code_key, false, '');
-					
-					$arData[$code_key] = [
-						'label' => $code_data['label'],
-						'code_key' => $code_key,
-						'code' => trim($product_code),
-						'set' => trim($product_code) !== ''
-					];
-					
-				}
-				
-			?>
-				
-				<div id="wpsg_mod_productcodes_app">
-					
-					<template v-if="codeKeyNotSet.length > 0">
-						<div class="form-group form-group-sm has-feedback">
-							<label class="col-sm-6 control-label" for="metaean">Code hinzufÃŒgen</label>
-							<div class="col-sm-6">
-								<div class="wpsg_field_wrap">
-									<select class="form-control input-sm" v-model="add_code_key">
-										<option v-for="(code_key, i) of codeKeyNotSet" :value="code_key">{{data[code_key].label}}</option>
-									</select>
-									<a @click.stop.prevent="add()" href="#" class="glyphicon glyphicon glyphicon-plus form-control-feedback" aria-hidden="true" style="pointer-events: auto;"></a>
-								</div>
-							</div>
-							<div class="clearfix wpsg_clear"></div>
-						</div>
-						<hr />
-					</template>
-					
-					<div class="code_wrap">
-						<template v-for="(code, i) of data">
-							<div class="form-group form-group-sm has-feedback" v-if="code.set === true">
-								<label class="col-sm-6 control-label" for="metaean">{{code.label}}</label>
-								<div class="col-sm-6">
-									<div class="wpsg_field_wrap">
-										<input type="text" class="form-control input-sm" :value="code.code" :name="'meta[' + code.code_key + ']'" />
-										<a @click.stop.prevent="remove(code.code_key)" href="#" class="glyphicon glyphicon glyphicon-trash form-control-feedback" aria-hidden="true" style="pointer-events: auto;"></a>
-									</div>
-								</div>
-								<div class="clearfix wpsg_clear"></div>
-							</div>
-							<input v-else type="hidden" value="" :name="'meta[' + code.code_key + ']'" />
-						</template>
-					</div>
-					
-				</div>
-				
-				<script type="module">
-					
-					import { ref, createApp, onMounted, computed } from '<?php echo plugin_dir_url(__FILE__); ?>/../../js/vue.esm-browser.js';
-
-					document.addEventListener('DOMContentLoaded', function() {
- 
-						const app = createApp({
-							setup() {
-
-								const data = ref(<?php echo json_encode($arData); ?>);
-								const add_code_key = ref(undefined);
-
-								const codeKeyNotSet = computed(() => {
-
-									let r = [];
-									
-									for (let c of Object.values(data.value)) {
-
-										if (c.set !== true) r.push(c.code_key);
-										
-									}
-									
-									return r;
-
-								});
-								
-								const add = () => {
-
-									if (add_code_key.value !== undefined && codeKeyNotSet.value.includes(add_code_key.value)) {
-
-										data.value[add_code_key.value].set = true;
-
-									}
-									
-								};
-								const remove = (code_key) => {
-
-									data.value[code_key].set = false;
-									
-								};
-
-								return {
-									data, add_code_key,
-									codeKeyNotSet,
-									add, remove
-								};
-
-							}
-						}).mount('#wpsg_mod_productcodes_app');
-
-					});
-					
-				</script>
-		  
-				<br />
-					
-				<p class="wpsg_hinweis">
-					<?php if (\wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) { ?>
-					Ist das Produkt ein Variantenprodukt, kÃ¶nnen die Codes unter Produktvarianten fÃŒr einzelne Variationen ÃŒberschrieben werden.<br />
-					<?php } ?>
-					Ãnderungen mÃŒssen mit speichern bestÃ€tigt werden.
-				</p>
-				
-			<?php } else { ?>
-			
-				<p><?php echo __('Bitte Produkt erst speichern.', 'wpsg'); ?></p>
-			
-			<?php } ?>
-			
-			
-		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-	</div>
-</div>
Index: ews/produkt/addedit_rating.phtml
===================================================================
--- /views/produkt/addedit_rating.phtml	(revision 8528)
+++ 	(revision )
@@ -1,104 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Integration der Produktbewertung in die Produktverwaltung
-	 */
-
-?>
-
-<div id="wpsg_be_rating">
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktbewertung', 'wpsg')); ?>
-
-
-	<div class="row">
-		<div class="col-sm-12">
-
-		<?php if (wpsg_isSizedArray($this->view['arCom'])) { ?>
-
-			<div class="row">
-				<div class="wpsg_comment_form col-sm-12">
-			
-
-				    <?php foreach ($this->view['arCom'] as $com) { ?>
-				     
-				     	<div class="row" id ="wpsg_rating_<?php echo __($com['comment_ID'], 'wpsg'); ?>">
-				     	
-					        <div class="comment col-sm-11">
-					            
-					            <div class="wpsg_bewertung_comment_name">
-					           	 	
-					           	 	<?php echo __($com['comment_author'], 'wpsg'); ?>
-					            
-					            </div>
-					            <div class="wpsg_star_wrap" style="display:inline-block;">
-						            <?php
-						            $cnt = $com['meta_value'];
-						            for ($i = 0; $i < $cnt; $i++)
-						            	echo '<i class="fa fa-star"></i>';
-						            ?>
-					            </div>
-					            <br />
-
-								<?php //setlocale(LC_TIME, "de_DE.UTF-8"); ?>					            
-					            <?php //date_default_timezone_set('Europe/Berlin'); ?>					            
-					            <div class="wpsg_bewertung_comment_date">
-					            
-					            	<?php echo '<div>'.date_i18n('d.F Y', strtotime($com['comment_date'])); ?>
-									<?php /* echo strftime('%d.%B %Y', strtotime($oWP_Comment->comment_date)); */ ?>
-					            
-					          	</div>	
-					          
-					          	<div class="wpsg_bewertung_comment_text">
-					          		
-						            <?php echo '</div><br />'; ?>
-						            <?php echo __($com['comment_content'], 'sto'); ?>
-						            <?php echo '<br />'; ?>
-					          	
-					          	</div>
-					        </div>
-							<div class="wpsg_comment_form col-sm-1">
-								<a href="#" class="wpsg-glyphlink-td" title="<?php echo __('Bewertung lÃ¶schen', 'wpsg'); ?>" onclick="return wpsg_removeRating(<?php echo $com['comment_ID']; ?>);"><span class="glyphicon glyphicon-trash"></span></a>
-								  
-							</div>
-					        
-				     	</div> 
-				        
-				    <?php } ?>
-
-				</div>
-			</div>
-
-		<?php } else { ?>
-			<?php echo __('Keine Bewertungen vorhanden'); ?>
-		<?php } ?>
-		</div>
-	</div>
-
-	
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-</div>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-/**
- * Wird aufgerufen wenn eine Bewertung gelÃ¶scht werden soll
- */
-function wpsg_removeRating(c_id)
-{
-
-	if (!confirm('<?php echo __('Sind Sie sich sicher, dass Sie diese Bewertung lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
-
-	//jQuery('#wpsg_be_rating').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-	jQuery('#wpsg_rating_'+c_id).html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-	jQuery.ajax( {
-		url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&cmd=ratingDel&noheader=1&c_id=' + c_id,
-		success: function(data) {
-			//jQuery('#wpsg_be_rating').replaceWith(data);
-			jQuery('#wpsg_rating_'+c_id).hide();
-		}
-	} );
-
-	return false;
-}
-/* ]]> */</script>
Index: ews/produkt/addedit_texte.phtml
===================================================================
--- /views/produkt/addedit_texte.phtml	(revision 8528)
+++ 	(revision )
@@ -1,108 +1,0 @@
-<?php
-
-	/**
-	 * Template fÃŒr die Texte innerhalb der Produktverwaltung
-	 */
-
-?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Kurztext', 'wpsg')); ?>
-<?php 
-								
-	function wpsg_ShowTinyMCE() 
-	{ 
-		  
-		wp_print_scripts('editor');
-		wp_print_scripts('media-upload');
-		if (function_exists('wp_tiny_mce')) wp_tiny_mce();
-		wp_admin_css();
-		
-		do_action("admin_print_styles-post-php");
-		do_action('admin_print_styles');
-		
-	}
-	
-	function wpsg_formatTinyMCE($in)
-	{
-		
-		if (isset($in['theme_advanced_buttons1'])) $in['theme_advanced_buttons1'] = str_replace(",wpsg", "", $in['theme_advanced_buttons1']);
-		
-		return $in;
-		
-	}
-	
-	// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
-	//remove_filter('the_editor', 'qtrans_modifyRichEditor');
-	 
-	add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
-	add_filter('admin_head', 'wpsg_ShowTinyMCE');
-	wp_editor(@$this->view['data']['beschreibung'], 'beschreibung');
-	
-?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php $this->callMods('product_addedit_before_longtext'); ?>
-<?php echo wpsg_drawForm_AdminboxStart(__('Langtext', 'wpsg')); ?>
-<?php 
-						 	
-	// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
-	//remove_filter('the_editor', 'qtrans_modifyRichEditor');
-	
-	add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
-	add_filter('admin_head', 'wpsg_ShowTinyMCE');
-	wp_editor(@$this->view['data']['longdescription'], 'longdescription');
-	
-?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Langtext (Zusatz)', 'wpsg')); ?>
-<?php 
-						 	
-	// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
-	//remove_filter('the_editor', 'qtrans_modifyRichEditor');
-	
-	add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
-	add_filter('admin_head', 'wpsg_ShowTinyMCE');
-	wp_editor(@$this->view['data']['longdescription_addon'], 'longdescription_addon');
-	
-?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktfeatures', 'wpsg')); ?>
-<?php 
-						 	
-	// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
-	//remove_filter('the_editor', 'qtrans_modifyRichEditor');
-	
-	add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
-	add_filter('admin_head', 'wpsg_ShowTinyMCE');
-	wp_editor(@$this->view['data']['productfeatures'], 'productfeatures');
-	
-?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('ZusÃ€tzliche Informationen', 'wpsg')); ?>
-<?php 
-						 	
-	// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
-	//remove_filter('the_editor', 'qtrans_modifyRichEditor');
-	
-	add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
-	add_filter('admin_head', 'wpsg_ShowTinyMCE');
-	wp_editor(@$this->view['data']['moreinfos'], 'moreinfos');
-	
-?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Lieferumfang', 'wpsg')); ?>
-<?php 
-						 	
-	// Damit die qTranslate Interne Editor Ãbersetzung nicht aufgerufen wird
-	//remove_filter('the_editor', 'qtrans_modifyRichEditor');
-	
-	add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
-	add_filter('admin_head', 'wpsg_ShowTinyMCE');
-	wp_editor(@$this->view['data']['moreinfos2'], 'moreinfos2');
-	
-?>
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
Index: ews/produkt/images.phtml
===================================================================
--- /views/produkt/images.phtml	(revision 8528)
+++ 	(revision )
@@ -1,235 +1,0 @@
-<?php
-
-    /**
-     * Template fÃŒr den Reiter "Produktbilder" in der Produktverwaltung
-     */
-
-?>
-
-<!-- Modal fÃŒr LÃ¶schabfrage -->
-<div class="modal fade" tabindex="-1" role="dialog" id="wpsg_produktbilder_remove">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title"><?php echo __('Produktbild lÃ¶schen', 'wpsg'); ?></h4>
-            </div>
-            <div class="modal-body">
-
-                <?php echo wpsg_drawForm_Checkbox('dialog_produktbilder_delmt', __('Auch in der Mediathek lÃ¶schen', 'wpsg'), false, array()); ?>
-                
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal"><?php echo __('Abbrechen', 'wpsg'); ?></button>
-                <button type="button" class="btn btn-primary" onclick="return wpsg_remove_bild_MT_OK();"><?php echo __('LÃ¶schen', 'wpsg'); ?></button>
-            </div>
-        </div>
-    </div>
-</div>
-
-
-<div class="panel panel-default">
-	<div class="panel-heading clearfix">
-    	<h3 class="panel-title"><?php echo __('Produktbilder', 'wpsg'); ?></h3>
-	</div>
-	<div class="panel-body">
-		
-		<?php if ($this->view['data']['id'] > 0) { ?>
-		
-			<!--  Mediathek -->
-
-			<div class="ui-sortable" id="produktbilder_target_MT"><?php echo $this->view['strProductList']; ?></div>
-
-			<div class="wpsg_clear"></div>
-			<div><?php echo __("Bitte klicken Sie auf Mediathek um ein Bild hochzuladen. Um ein Bild zu lÃ¶schen klicken Sie einfach auf das Bild.", "wpsg"); ?></div>
-			<div><?php echo __("Die Reihenfolge kann mittels Drag&Drop verÃ€ndert werden.", "wpsg"); ?></div>
-			<div class="wpsg_clear"></div><br />
-		
-			<input value="Mediathek" class="button" type="button" style="text-align:center;" size="10" id="btnAddImgLink" />
-
-			<script type="text/javascript">/* <![CDATA[ */
-								
-				var post_id;
-				
-				/**
-				 * Wird beim lÃ¶schen eines Bilds (anklicken) aufgerufen
-				 */
-				function wpsg_remove_bild_MT(pid) {
-
-					post_id = pid;
-					//jQuery('#wpsg_produktbilder_remove').show();
-					jQuery('#wpsg_produktbilder_remove').modal( { } );
-					//jQuery('#wpsg_produktbilder_remove').modal('hide');
-					
-				}
-				
-				function wpsg_remove_bild_MT_OK() {
-
-					delmt = jQuery('#dialog_produktbilder_delmt').is(':checked');
-					del = jQuery('#dialog_produktbilder_del').is(':checked');
-					
-					jQuery('#wpsg_produktbilder_remove').modal('hide');
-
-					jQuery('#produktbilder_target_MT').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-					jQuery.ajax( {
-						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&cmd=removeImage&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
-						async: true,
-						data: {
-							del: del,
-							delmt: delmt,
-							pid: post_id
-						},
-						success: function(data) {
-							
-							jQuery('#produktbilder_target_MT').html(data);
-
-							//if (typeof wpsg_vp_refresh == "function") wpsg_vp_refresh();
-							
-						}
-					} );
-
-					return false;
-					
-				}
-
-				/**
-				 * Wird beim lÃ¶schen eines Bilds (anklicken) aufgerufen
-				 */
-				function wpsg_remove_bild(strBild)
-				{
-
-					if (!confirm('<?php echo __('Sind Sie sicher, das Sie dieses Bild lÃ¶schen mÃ¶chten?', 'wpsg'); ?>')) return false;
-
-					jQuery('#produktbilder_target').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-					
-					jQuery.ajax( {
-						url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_produktbilder&cmd=remove&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
-						async: true,
-						data: {
-							file: strBild
-						},
-						success: function(data) {
-							
-							jQuery('#produktbilder_target').html(data);
-
-							if (typeof wpsg_vp_refresh == "function") wpsg_vp_refresh();
-							
-						}
-					} );
-
-					return false;
-					
-				}
-                
-				jQuery(document).ready(function() {
-
-                    jQuery('#produktbilder_target_MT').sortable( {
-                        items: 'a',
-                        helper : 'clone',
-                        update: function(event, ui) {
-     
-                            var wpsg_reorder = jQuery(this).sortable('toArray');
-    
-                            jQuery.ajax( {
-                                url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&cmd=setImageOrder&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
-                                async: false,
-                                data: {
-                                    'p_id': <?php echo '1'; ?>,
-                                    'wpsg_reorder': wpsg_reorder
-                                },
-                                success: function(data) {
-    
-                                    data = data.replace(/\n|\r/g, '');
-                                    if (data != '1') alert(data);
-                                    //wpsg_vp_ajaxloading_hide(); 
-    
-                                }
-                            } );
-                                                                         
-                        }			
-                    } ).disableSelection();
-                    
-					// Set all variables to be used in scope
-					var wpframe,
-					    metaBox = jQuery('#meta-box-id.postbox'), // Your meta box id here
-					    addImgLink = metaBox.find('.upload-custom-img'),
-					    delImgLink = metaBox.find( '.delete-custom-img'),
-					    imgContainer = metaBox.find( '.custom-img-container'),
-					    imgIdInput = metaBox.find( '.custom-img-id' );
-					  
-					// ADD IMAGE LINK
-					jQuery("#btnAddImgLink").click(function (event) {
-						  
-					    event.preventDefault();
-					    
-					    // If the media frame already exists, reopen it.
-					    if ( wpframe ) {
-					      	wpframe.open();
-					      	return;
-					    }
-					    
-					    // Create a new media frame
-					    wpframe = wp.media.frames.file_frame = wp.media({
-					        title: "<?php echo __('AuswÃ€hlen oder Hochladen von Medien', 'wpsg'); ?>",
-					        button: { text: "<?php echo __('Medien benutzen', 'wpsg'); ?>" },
-					        multiple: true  // Set to true to allow multiple files to be selected
-					    });
-
-					    // When an image is selected in the media frame...
-					    wpframe.on( 'select', function() {
-
-				            var attachments = wpframe.state().get('selection').map( 
-				                function( attachment ) {
-
-				                    attachment.toJSON();
-				                    return attachment;
-				            });
-
-				            //loop through the array and do things with each attachment
-				            var i, attachment;
-				            
-				            var arPostID = [];
-				            
-				            for (i = 0; i < attachments.length; ++i) {
-
-				            	attachment = attachments[i];
-							    imgContainer.append( '<img src="'+attachment.url+'" alt="" style="max-width:100%;"/>' );
-
-				            	attachment = attachment.toJSON();
-				            	
-				            	arPostID.push(attachment.id);
-				            	
-				            }
-
-                            jQuery.ajax( {
-                                url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&cmd=upload&noheader=1&edit_id=<?php echo $this->view['data']['id']; ?>',
-                                async: true,
-                                data: {
-                                    post_id: arPostID
-                                },
-                                success: function(data) {
-
-                                    jQuery('#produktbilder_target_MT').html(data);
-
-                                }
-                            } );
-
-					    });		
-
-					    // Finally, open the modal on click
-					    wpframe.open();
-                        
-					});	// jQuery("#btnAddImgLink").click(function (event))
-					  
-				}); // jQuery(document).ready(function())
-							
-			/* ]]> */</script>
-			
-		<?php } else { ?>
-		<p><?php echo __('Das Hochladen von Produktbildern ist erst nach erstmaligem speichern mÃ¶glich.', 'wpsg'); ?></p>
-		<?php } ?>
-	
-		<div class="wpsg_clear"></div>
-	</div>
-</div>
Index: ews/produkt/images_list.phtml
===================================================================
--- /views/produkt/images_list.phtml	(revision 8528)
+++ 	(revision )
@@ -1,36 +1,0 @@
-<?php
-	
-	/**
-	 * Template fÃŒr die Liste der Bilder eines Produkts
-	 */
-
-?>
-
-<?php if (wpsg_isSizedArray($this->view['productImages'])) { ?>
-
-	<?php foreach ($this->view['productImages'] as $attachment_id) { ?>
-	
-		<div id="produktbild_div_<?php echo $attachment_id; ?>" class="wpsg_mod_produktbilder_admin_bild">
-
-			<a id="produktbild_<?php echo $attachment_id; ?>" onclick="return wpsg_remove_bild_MT('<?php echo $attachment_id; ?>');" href="#" title="<?php echo __('Dieses Bild lÃ¶schen.', 'wpsg'); ?>">
-
-				<div class="box_img_wrap wpsg_be_imagelist_image">
-												
-					<?php echo wp_get_attachment_image($attachment_id, 'medium'); ?>
-						
-				</div>
-				  
-				<span><span class="glyphicon glyphicon-trash"></span></span>
-			</a>
-			
-		</div>
-	
-	<?php } ?>
-    
-	<div class="wpsg_clear"></div>
-
-<?php } else { ?>
-    
-    <p><?php echo __('Bisher keine Produktbilder hochgeladen.', 'wpsg'); ?></p>
-    
-<?php } ?>
Index: /views/produkt/import.phtml
===================================================================
--- /views/produkt/import.phtml	(revision 8528)
+++ /views/produkt/import.phtml	(revision 5261)
@@ -6,76 +6,25 @@
 
 ?>
-<div class="wpsg_productgroups" id="wpsg-bs">
-
-    <nav class="navbar navbar-default">
-
-			<div class="container-fluid">
-				<div class="navbar-header">
-					<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-				</div>
-				<div class="collapse navbar-collapse" id="bs-customer-navbar-collapse-1">
-					<ul class="nav navbar-nav">
-						<li role="presentation" class="wpsg-customer-tab-a active"><a href="#" onclick="return false;"><?php echo __("Produktverwaltung - Produktdatenimport", "wpsg"); ?></a></li>
-	          		</ul>
-					<ul class="nav navbar-nav navbar-right">
-						<li role="presentation" class="wpsg-customer-tab-a wpsg_showhide_filter" id="wpsg-customer-tab-0"><a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=index" class="add-new-h2"><span class="glyphicon glyphicon-search"></span><?php echo __("ZurÃŒck zur Produktverwaltung", "wpsg"); ?></a></li>
-					</ul>
-				</div>
-			</div>
-
-    </nav>
-
-    <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-
-    <div class="content">
-
-        <?php echo wpsg_drawForm_AdminboxStart('Produktimport'); ?>
-
-        <form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=import&noheader=1" id="import_form" enctype="multipart/form-data">
-
-            <?php echo wp_nonce_field('wpsg-product-import-do'); ?>
-
-            <div class="wpsg_hinweis"><?php echo __('Laden Sie ein vorher exportiertes CSV File hoch, die Produktdaten werden dann aus dieser Datei importiert.', 'wpsg'); ?></div>
-            <br />
-
-            <input type="file" id="wpsg_importfile" name="wpsg_importfile" />
-
-            <br /><br />
-            <input type="submit" class="button-primary" value="<?php echo __('Import der Produktedaten starten', 'wpsg'); ?>" name="wpsg_import" />
-
-        </form>
-
-        <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-        <script>
-
-            jQuery('#import_form').on('submit', function(evt) {
-
-                var file = jQuery('#wpsg_importfile')[0].files[0];
-
-                if (file && file.size < <?php echo wpsg_get_file_upload_max_size(); ?>){
-
-                    return true;
-
-                } else if (file) {
-
-                    alert("<?php echo wpsg_translate(__('DateigrÃ¶Ãe ÃŒbersteigt Upload Limit von #1#.', 'wpsg'), wpsg_formatSize(wpsg_get_file_upload_max_size())); ?>");
-
-                    evt.preventDefault();
-                    return false;
-
-                } else {
-
-                    alert("<?php echo wpsg_translate(__('Es wurde keine Datei ausgewÃ€hlt.', 'wpsg')); ?>");
-
-                    evt.preventDefault();
-                    return false;
-
-                }
-
-            } );
-
-        </script>
-
-	</div>
+<div class="wrap">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Produktverwaltung - Produktimport', 'wpsg'); ?>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=index" class="add-new-h2"><?php echo __("ZurÃŒck zur Produktverwaltung", "wpsg"); ?></a>
+	</h2>
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	<br />
+	
+	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=import&noheader=1" id="import_form" enctype="multipart/form-data">
+	
+		<div class="wpsg_hinweis"><?php echo __('Laden Sie ein vorher exportiertes CSV File hoch, die Produktdaten werden dann aus dieser Datei importiert.', 'wpsg'); ?></div>
+		<br />
+	
+		<input type="file" name="wpsg_importfile" />
+		
+		<br /><br />
+		<input type="submit" class="button-primary" value="<?php echo __('Import starten', 'wpsg'); ?>" name="wpsg_import" />
+		
+	</form>
+	
 </div>
Index: /views/produkt/index.phtml
===================================================================
--- /views/produkt/index.phtml	(revision 8528)
+++ /views/produkt/index.phtml	(revision 5261)
@@ -5,529 +5,349 @@
 	 */
 
-    $arTermExclude = [];
-    $wpsg_mod_produktartikel_cat_first_level = false;
-    
-    if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat')) {
-              
-        if ($this->get_option('wpsg_mod_produktartikel_cat_first_level') === '1') $wpsg_mod_produktartikel_cat_first_level = true;
-        
-        foreach (explode(',', $this->get_option('wpsg_mod_produktartikel_cat_ignore')) as $exclude_term_id) {
-            
-            if (wpsg_isSizedString($exclude_term_id)) $arTermExclude[] = trim($exclude_term_id);
-            
-        }
-        
-    }  
-    
 ?>
 
-<div class="wpsg_products" id="wpsg-bs">
-
-	<nav class="navbar navbar-default">
-		<div class="container-fluid">
-			<div class="navbar-header">
-                
-				<a class="navbar-brand" href="#"><?php echo __('wpShopGermany', 'wpsg'); ?></a>
-                <a class="glyphicon glyphicon-menu-hamburger wpsg-bs-toggle-nav visible-xs-block" data-toggle="collapse" data-target="#wpsg-bs-headermenu" href="#"></a>
-                
+<script type="text/javascript">
+
+	var wpsg_order = '<?php echo $this->view['search']['order']; ?>';
+	var wpsg_ascdesc = '<?php echo $this->view['search']['ascdesc']; ?>';
+
+	function goPage(page)
+	{
+
+		if (page <= 0 || page == <?php echo $this->view['seite']; ?> || page > <?php echo $this->view['pages']; ?>) return;			
+		
+		jQuery('#wpsg_seite').val(page);
+		jQuery('#filter_form').submit();
+
+		return false;
+		
+	} // function goPage(page)
+
+	function wpsg_setOrder(order)
+	{
+
+		if (order == wpsg_order)
+		{
+
+			// Nur Richtung Ã€ndern
+			if (wpsg_ascdesc == 'asc') jQuery('#wpsg_ascdesc').val('desc');
+			else jQuery('#wpsg_ascdesc').val('asc');
+			
+		}
+		else
+		{
+
+			jQuery('#wpsg_order').val(order);
+			jQuery('#wpsg_ascdesc').val('asc');
+			
+		}
+
+		jQuery('#seite').val(1);
+		jQuery('#filter_form').submit();
+		
+		return false;
+		
+	} // function wpsg_setOrder(order)
+	
+</script>
+
+<div class="wrap wpsg_produktindex">
+	<div class="icon32 icon32-posts-post" id="icon-edit"><br></div>
+	<h2>
+		<?php echo __('Produktverwaltung', 'wpsg'); ?>
+		<a href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=add'); ?>" class="add-new-h2"><?php echo __("HinzufÃŒgen", "wpsg"); ?></a>	
+		<?php if (wpsg_isSizedArray($this->view['data'])) { ?>				
+		<a href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=export&noheader=1'); ?>" class="add-new-h2"><?php echo __('Exportieren', 'wpsg'); ?></a>
+		<?php } ?>
+		<a href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=import'); ?>" class="add-new-h2"><?php echo __('Importieren', 'wpsg'); ?></a>
+	</h2>
+
+	<?php echo $this->writeBackendMessage(); ?> 
+			 
+	<form method="POST" id="filter_form">
+				
+		<?php $this->callMod('wpsg_mod_productgroups', 'produkt_index_filter'); ?>
+				
+		<p class="search-box wpsg-search-box">
+			<label for="post-search-input" class="screen-reader-text"><?php echo __('Produkte suchen', 'wpsg'); ?>:</label>
+			<input type="text" value="<?php echo @wpsg_hspc($_REQUEST['s']); ?>" name="s" id="post-search-input">
+			<input type="submit" value="<?php echo __('Produkte suchen', 'wpsg'); ?>" class="button" id="search-submit" name="">
+			<?php /*<input type="button" value="&nbsp;" class="button" id="wpsg_product_search_button" /> */ ?>
+		</p>
+		
+		<?php if (sizeof($this->view['data'] > 0)) { ?>
+		<div class="tablenav top wpsg_tablenav">
+		
+			<div class="tablenav-pages tablenav-pages-wrap"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+				<div class="tablenav-pages">	
+					<span class="pagination-links">
+						<a onclick="return goPage(1);" href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&seite=1&s='.$_REQUEST['s']); ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+						<a onclick="return goPage(<?php echo $this->view['seite'] - 1; ?>);" href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&seite='.($this->view['seite'] - 1)); ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+						<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['seite']; ?>" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" id="wpsg_seite" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+						<a onclick="return goPage(<?php echo $this->view['seite'] + 1; ?>);" href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&seite='.($this->view['seite'] + 1)); ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+						<a onclick="return goPage(<?php echo $this->view['pages']; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;seite=<?php echo $this->view['pages']; ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+					</span>
+				</div>
+				
+				<script type="text/javascript">
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+				
+				</script>
+				
+				<br class="clear">
 			</div>
-			<div class="collapse navbar-collapse" id="wpsg-bs-headermenu">
-				<ul class="nav navbar-nav">
-					<li role="presentation" class="<?php echo ((!isset($_REQUEST['action']))?'active':''); ?>"><a href="<?php echo WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt'; ?>"><?php echo wpsg_translate(__("ProduktÃŒbersicht (#1# Produkte)", "wpsg"), $this->view['countAll']); ?></a></li>
-					<li role="presentation" class="wpsg_showhide_filter <?php echo (($this->view['submit'] === true)?'active':''); ?>"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-search"></span><?php echo __("Suche", "wpsg"); ?></a></li>
-			 		<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'add'))?'active':''); ?>"><a href="<?php
-							
-						echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=add', 'wpsg-product-add');
-							
-					?>"><span class="glyphicon glyphicon-plus"></span><?php echo __("HinzufÃŒgen", "wpsg"); ?></a></li>                    
-                    <?php /* Integration Exportprofile */ ?>
-                    <?php if ($this->hasMod('wpsg_mod_export')) { $arProfile = $this->callMod('wpsg_mod_export', 'getProfile', array(wpsg_mod_export::TYPE_PRODUCT)); ?>
-                    <?php if (wpsg_isSizedArray($arProfile)) { ?>
-                    <li role="presentation" class="wpsg_showhide_export"><a href="#" onclick="return false;"><span class="glyphicon glyphicon-export"></span><?php echo __('Produktexport (Exportprofile)', 'wpsg'); ?></a></li>
-                    <?php } ?>
-                    <?php } ?>
-                    
-				</ul>
-				<ul class="nav navbar-nav navbar-right">
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'import'))?'active':''); ?>"><a href="<?php 
-							 
-						echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=import', 'wpsg-product-import');
-							
-					?>"><span class="glyphicon glyphicon-import"></span><?php echo __("Daten-Import", "wpsg"); ?></a></li>
-					<?php if (wpsg_isSizedArray($this->view['arData'])) { ?>
-					<li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'export'))?'active':''); ?>"><a href="<?php 
-							
-						echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=export&noheader=1', 'wpsg-product-export'); 
-							
-					?>"><span class="glyphicon glyphicon-export"></span><?php echo __("Daten-Export", "wpsg"); ?></a></li>
-                    <li role="presentation" class="<?php echo ((wpsg_isSizedString($_REQUEST['action'], 'export'))?'active':''); ?>"><a href="<?php 
-							
-						echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=exportMedia&noheader=1', 'wpsg-product-exportMedia');
-						
-					?>"><span class="glyphicon glyphicon-export"></span><?php echo __("Daten-Export mit Medien", "wpsg"); ?></a></li>
-                    <?php } ?>
-			 	</ul>
-			</div>
+		
 		</div>
-                        
-		<div class="wpsg-filter container-fluid form-horizontal" style="display:<?php echo (($this->view['submit'] === true)?'block':'none'); ?>;">
-			<div class="row">
-				<div class="col-lg-4">
-					<form method="post" id="filter_form">
-						
-						<?php echo wp_nonce_field('wpsg-product-search'); ?>
-
-						<input id="wpsg_seite" type="hidden" name="seite" value="<?php echo @$this->view['arFilter']['page']; ?>" class="current-page" />
-						<input id="wpsg_order" type="hidden" name="filter[order]" value="<?php echo @$this->view['arFilter']['order']; ?>" />
-						<input id="wpsg_ascdesc" type="hidden" name="filter[ascdesc]" value="<?php echo @$this->view['arFilter']['ascdesc']; ?>" /> 
-                        
-						<?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
-
-                        <?php 
-                            
-                            $filterAll = $this->view['arFilter'];
-                        	$filterAll['debug'] = false;
-                            
-                            unset($filterAll['productgroup_ids']);
-                        	unset($filterAll['productcategory_ids']);
-                            
-                            $filterNone = $this->view['arFilter'];
-                            $filterNone['isNoCat'] = true;
-                            $filterNone['loadCat'] = false;
-                            unset($filterNone['productcategory_ids']);
-                            
-                        ?>
-
-                        <?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
-                        <?php echo wpsg_drawForm_Select('filter[productgroup_ids]', __('Produktgruppe', 'wpsg'), wpsg_array_merge(array('-1' => wpsg_translate(__('Alle Produktgruppen (#1#)', 'wpsg'), wpsg_product::count($filterAll))), wpsg_productgroup::getProductgroupSelect($this->view['arFilter'])), @$this->view['arFilter']['productgroup_ids']); ?>
-                        <?php } ?>
-
-                        <?php if ($this->hasMod('wpsg_mod_produktartikel')) { ?>
-                        <?php
-                            
-                        $temp = $this->callMod('wpsg_mod_produktartikel', 'getProductcategorySelect', array($this->view['arFilter']));
-                        $arr = array();
-                        foreach ($temp as $vv) $arr[$vv['term_taxonomy_id']] = $vv['label'];
-                        
-                        echo wpsg_drawForm_Select('filter[productcategory_ids]', __('Produktkategorie', 'wpsg'),
-                        		wpsg_array_merge(array(
-                                    '-1' => wpsg_translate(__('Alle Produktkategorien (#1#)', 'wpsg'), wpsg_product::count($filterAll)),
-                                    '-2' => wpsg_translate(__('Unzugeordnet (#1#)', 'wpsg'), wpsg_product::count($filterNone))
-                                ),
-                        		$arr), @$this->view['arFilter']['productcategory_ids']); ?>
-                        <?php } ?>
-
-                        <?php if (wpsg_istrue($this->view['submit'])) { ?>
-                        <input type="hidden" name="submit-button" value="1" />
-                        <?php } ?>
-
-						<?php echo wpsg_drawForm_SubmitButton(__('Produkte suchen')); ?><br />
-
-					</form>
+		<?php } ?>
+				
+		<input id="wpsg_order" type="hidden" name="search[order]" value="<?php echo $this->view['search']['order']; ?>" />
+		<input id="wpsg_ascdesc" type="hidden" name="search[ascdesc]" value="<?php echo $this->view['search']['ascdesc']; ?>" />
+		
+		<input style="display:none;" type="submit" name="suchen" value="" />
+
+		<?php /*		
+		<div class="wpsg_clear"></div>
+		<div class="metabox-holder" id="wpsg_product_index_filter_layer" style="<?php echo (($_COOKIE['wpsg_order_index_filter'] == '1')?'display:block;':'display:none;'); ?>">
+			<div id="wpsg_orderindexfilter" class="postbox">		
+				<h3 class="wpsg_handlediv">
+					<span class="handlediv" title="<?php echo __('Zum Ein/Ausklappen hier klicken', 'wpsg'); ?>"><br></span>
+					<span><?php echo __('Bestellfilter', 'wpsg'); ?></span>
+				</h3>
+				<div class="inside">
 				</div>
 			</div>
+		</div> */ ?>
+		
+	</form>
+	
+	<?php if (is_array($this->view['data']) && sizeof($this->view['data']) > 0) { ?>
+	<table class="widefat post fixed">
+		<thead>
+			<tr>
+				<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+				<th class="manage-column column-title wpsg_pic_col"></th>
+				<?php } ?>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'name')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('name');">
+						<span><?php echo __("Name", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'anr')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('anr');">
+						<span><?php echo __("Artikelnummer", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a> 
+				</th>	
+				<?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'pgruppe')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('pgruppe');">
+						<span><?php echo __("Produktgruppe", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a> 
+				</th>
+				<?php } ?>
+				<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showBackendStock') == '1') { ?>
+				<th class="manage-column column-title wpsg_stock_col <?php echo (($this->view['search']['order'] == 'stock')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('stock');">
+						<span><?php echo __('Lagerbestand', 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<?php } ?>
+				<th class="manage-column column-title wpsg_mwst_col <?php echo (($this->view['search']['order'] == 'mwst')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">				
+					<a href="#" onclick="return wpsg_setOrder('mwst');">
+						<span><?php echo __("MwSt.", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'price')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('price');">
+						<span><?php echo __("Preis", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a> 
+				</th>							
+			</tr>
+		</thead>
+		<tbody>
+			<?php foreach ($this->view['data'] as $d) { ?>
+			<tr>
+				<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+				<td class="post-title wpsg_pic_col">
+					<?php 
+					
+						$arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($d['id'])); 
+					
+						if (wpsg_isSizedArray($arBilder))
+						{
+							
+							echo '<a href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=edit&amp;edit_id='.$d['id'].'" title="'.wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $l['name']).'">';
+							echo '<img src="'.$this->callMod('wpsg_mod_produktbilder', 'makeTn', array($d['id'], $arBilder[0], 40, 40, 'c')).'" alt="" />';
+							echo '</a>';
+							
+						}
+						
+					?>
+				</td>
+				<?php } ?>
+				<td class="post-title column-title">
+					<strong><a title="<?php echo __("Dieses Produkt bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=edit&amp;edit_id=<?php echo $d['id']; ?>" class="row-title"><?php echo (($d['name'] == "")?__("---- ", "wpsg"):$d['name']); ?></a></strong>
+					<div class="row-actions">
+						<span class="edit"><a title="<?php echo __("Dieses Produkt bearbeiten", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=edit&amp;edit_id=<?php echo $d['id']; ?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
+						<?php if ($this->isMultiLingual()) { ?> 
+						<?php foreach ($this->getStoreLanguages() as $l) { ?>
+							<?php if ($l['locale'] != $this->getDefaultLanguageLocale()) { ?>							
+							<a href="<?php echo $this->url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&amp;action=edit&amp;edit_id='.$d['id'].'&amp;wpsg_lang='.$l['locale']); ?>" title="<?php echo wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $l['name']); ?>">
+								<img src="<?php echo $this->getFlagURL().$l['flag']; ?>" alt="<?php echo wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $l['name']); ?>" />
+							</a>
+							<?php } ?>
+						<?php } ?>
+						<?php } ?>
+						|
+						<span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie das Produkt lÃ¶schen wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Dieses Produkt lÃ¶schen", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=del&amp;edit_id=<?php echo $d['id']; ?>&amp;noheader=1"><?php echo __("LÃ¶schen", "wpsg"); ?></a></span>
+						|
+						<span class="copy"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie das Produkt kopieren wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Dieses Produkt kopieren", "wpsg"); ?>" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=copy&amp;edit_id=<?php echo $d['id']; ?>&amp;noheader=1"><?php echo __("Kopieren", "wpsg"); ?></a></span>
+						| 
+						<span class="view"><a target="_blank" title="<?php echo __("Dieses Produkt im Frontend ansehen", "wpsg"); ?>" href="<?php echo $this->getProduktLink(array('id' => $d['id'])); ?>"><?php echo __("Ansehen", "wpsg"); ?></a></span>
+						<?php $this->callMods('produkt_index_editmenu', array(&$d)); ?>
+					</div>
+				</td>
+				<td><?php echo wpsg_hspc($d['anr']); ?></td>
+				<?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
+				<td>
+					<?php if ($d['pgruppe'] <= 0) { ?>
+					<?php echo __('Nicht zugewiesen', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php echo $d['pgruppe_name']; ?>
+					<?php } ?>
+				</td>
+				<?php } ?>
+				<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showBackendStock') == '1') { ?>
+				<td>
+					<div style="line-height:inherit; margin-bottom:0.2em;"><?php echo $d['stock']; ?></div>
+					<?php if ($this->hasMod('wpsg_mod_varianten') && wpsg_isSizedArray($this->callMod('wpsg_mod_varianten', 'loadVarianten', array($d['id'])))) { ?>					
+					<div style="line-height:inherit; padding:2px 0px 0px;">
+						<a class="clueTip" href="#" rel="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_stock&edit_id=<?php echo $d['id']; ?>&noheader=1&wpsg_cmd=getVariInfo"><?php echo __('Variantenbestand', 'wpsg'); ?></a>
+					</div>					
+					<?php } ?>
+				</td>
+				<?php } ?>
+				<td class="wpsg_mwst_col">
+					<?php echo strtoupper($d['mwst_key']).' ('.wpsg_ff($d['mwst_value'], '%').' '.$this->getDefaultCountry()->kuerzel.')'; ?>					
+				</td>
+				<td>
+					<?php /* if ($this->get_option('wpsg_preisangaben') == WPSG_NETTO) { ?>
+					<?php echo wpsg_ff($d['preis_netto'], $this->get_option('wpsg_currency')); ?>
+					<?php } else { */?>
+					<?php echo wpsg_ff($d['preis'], $this->get_option('wpsg_currency')); ?>
+					<?php /* } */ ?>
+				</td>				
+			</tr>
+			<?php } ?>
+		</tbody>
+		<tfoot>
+			<tr>
+				<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>
+				<th class="manage-column column-title wpsg_pic_col"></th>
+				<?php } ?>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'name')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('name');">
+						<span><?php echo __("Name", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'anr')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('anr');">
+						<span><?php echo __("Artikelnummer", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a> 
+				</th>
+				<?php if ($this->hasMod('wpsg_mod_productgroups')) { ?>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'pgruppe')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('pgruppe');">
+						<span><?php echo __("Produktgruppe", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a> 
+				</th>
+				<?php } ?>
+				<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showBackendStock') == '1') { ?>
+				<th class="manage-column column-title wpsg_stock_col <?php echo (($this->view['search']['order'] == 'stock')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('stock');">
+						<span><?php echo __('Lagerbestand', 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<?php } ?>
+				<th class="manage-column column-title wpsg_mwst_col <?php echo (($this->view['search']['order'] == 'mwst')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">				
+					<a href="#" onclick="return wpsg_setOrder('mwst');">
+						<span><?php echo __("MwSt.", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a>
+				</th>
+				<th class="manage-column column-title <?php echo (($this->view['search']['order'] == 'price')?'sorted':'sortable'); ?> <?php echo (($this->view['search']['ascdesc'] == 'asc')?'asc':'desc'); ?>" scope="col">
+					<a href="#" onclick="return wpsg_setOrder('price');">
+						<span><?php echo __("Preis", 'wpsg'); ?></span>
+						<span class="sorting-indicator"></span>
+					</a> 
+				</th>				
+			</tr>
+		</tfoot>		
+	</table>
+	 
+	<div class="tablenav top wpsg_tablenav">
+	
+		<div class="tablenav-pages"><span class="displaying-num"><?php echo wpsg_translate(__('#1# Elemente', 'wpsg'), $this->view['count']); ?></span>
+			<div class="tablenav-pages">	
+				<span class="pagination-links">
+					<a onclick="return goPage(1);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;seite=1&amp;s=<?php echo $_REQUEST['s']; ?>" title="<?php echo __('Zur ersten Seite gehen', 'wpsg'); ?>" class="first-page <?php echo (($this->view['seite'] == '1')?'disabled':''); ?>">Â«</a>
+					<a onclick="return goPage(<?php echo $this->view['seite'] - 1; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;seite=<?php echo $this->view['seite'] - 1; ?>" title="<?php echo __('Zur vorherigen Seite gehen', 'wpsg'); ?>" class="prev-page <?php echo (($this->view['seite'] <= 1)?'disabled':''); ?>">â¹</a>
+					<span class="paging-input"><input type="text" size="1" value="<?php echo $this->view['seite']; ?>" id="wpsg_seite_bottom" name="seite" title="<?php echo __('Aktuelle Seite', 'wpsg'); ?>" class="current-page"> <?php echo __('von', 'wpsg'); ?> <span class="total-pages"><?php echo $this->view['pages']; ?></span></span>
+					<a onclick="return goPage(<?php echo $this->view['seite'] + 1; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;seite=<?php echo $this->view['seite'] + 1; ?>" title="<?php echo __('Zur nÃ€chsten Seite gehen', 'wpsg'); ?>" class="next-page <?php echo (($this->view['seite'] >= $this->view['pages'])?'disabled':''); ?>">âº</a>
+					<a onclick="return goPage(<?php echo $this->view['pages']; ?>);" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;seite=<?php echo $this->view['pages']; ?>" title="<?php echo __('Zur letzten Seite gehen', 'wpsg'); ?>" class="last-page <?php echo (($this->view['seite'] == $this->view['pages'])?'disabled':''); ?>">Â»</a>
+				</span>
+			</div>
+			 
+			<script type="text/javascript">/* <![CDATA[ */
+
+				jQuery(document).ready(function() {
+            
+					jQuery('.clueTip').cluetip( { 
+						width: '400px',
+						height: '400px', 
+						activation: 'click',
+						sticky: true,
+						/*mouseOutClose: 'both',*/
+						closePosition: 'title', 
+						arrows: true
+					} );
+
+					jQuery('.tablenav-pages .disabled').bind('click', function() { return false; } );
+					jQuery('#wpsg_seite_bottom').bind('keydown', function(event) { 
+
+						var keycode = (event.keyCode ? event.keyCode : event.which);
+
+						if (keycode == '13')
+						{
+
+							jQuery('#wpsg_seite').val(jQuery(this).val());
+							jQuery('#filter_form').submit();
+
+						}
+						 
+					} );
+
+				} );
+			
+			/* ]]> */</script>
+			
+			<br class="clear">
 		</div>
-        
-        <?php echo $this->callMod('wpsg_mod_export', 'product_index_tab'); ?>
-        
-	</nav>
-    
-    <div class="wpsg_msg_wrap"><hr class="wp-header-end wpsg-wp-header-end"/></div>
-    
-    <div class="flex flex-100">
-            
-        <?php if ($this->hasMod('wpsg_mod_productgroups')) { $arProductgroupSelect = wpsg_productgroup::getProductgroupSelect($this->view['arFilter']); ?>
-            <?php if (wpsg_isSizedArray($arProductgroupSelect)) { ?>
-                <div class="pagination_wrap wpsg_productgroup_link_wrap">
-    
-                    <?php $filterAll = $this->view['arFilter'];
-                        unset($filterAll['productgroup_ids']);
-                        unset($filterAll['productcategory_ids']);
-                    ?>
-    
-                    <ul class="pagination">
-                        <li class="<?php echo ((wpsg_getStr($this->view['arFilter']['productgroup_ids']) == '-1' || !isset($this->view['arFilter']['productgroup_ids']))?'active':''); ?>"><a href="#" onclick="jQuery('#filterproductgroup_ids').val('-1'); jQuery('#filter_form').trigger('submit'); return false;"><?php echo wpsg_translate(__('Alle (#1#)', 'wpsg'), wpsg_product::count($filterAll)); ?></a></li>
-                        <?php foreach ($arProductgroupSelect as $pg_id => $pg_name) { ?>
-                        <li class="<?php echo ((wpsg_getStr($this->view['arFilter']['productgroup_ids']) == $pg_id)?'active':''); ?>"><a href="#" onclick="jQuery('#filterproductgroup_ids').val('<?php echo $pg_id; ?>'); jQuery('#wpsg_seite').val('1'); jQuery('#filter_form').trigger('submit'); return false;"><?php echo $pg_name; ?></a></li>
-                        <?php } ?>
-                    </ul>
-    
-                </div>
-                <div class="wpsg_clear"></div>
-            <?php } ?>
-        <?php } ?>
-    
-        <?php if ($this->hasMod('wpsg_mod_produktartikel')) { $arProductcategorySelect = $this->callMod('wpsg_mod_produktartikel', 'getProductcategorySelect', array($this->view['arFilter'])); ?>
-            <?php if (wpsg_isSizedArray($arProductcategorySelect)) { ?>
-                <div class="pagination_wrap wpsg_productgroup_link_wrap">
-    
-                    <?php $filterAll = $this->view['arFilter'];
-                        unset($filterAll['productgroup_ids']);
-                        unset($filterAll['productcategory_ids']);
-                    ?>
-    
-                    <ul class="pagination">
-                        <li class="<?php echo ((wpsg_getStr($this->view['arFilter']['productcategory_ids']) == '-1' || !isset($this->view['arFilter']['productcategory_ids']))?'active':''); ?>"><a href="#" onclick="jQuery('#filterproductcategory_ids').val('-1'); jQuery('#filter_form').trigger('submit'); return false;"><?php echo wpsg_translate(__('Alle (#1#)', 'wpsg'), wpsg_product::count($filterAll)); ?></a></li>
-                        <?php foreach ($arProductcategorySelect as $pk_id => $pk) { ?>
-                        <li class="<?php echo ((wpsg_getInt($this->view['arFilter']['productcategory_ids'], -2) == $pk['term_taxonomy_id'])?'active':''); ?>"><a href="#" onclick="jQuery('#filterproductcategory_ids').val('<?php echo $pk['term_taxonomy_id']; ?>'); jQuery('#wpsg_seite').val('1'); jQuery('#filter_form').trigger('submit'); return false;"><?php echo $pk['label']; ?></a></li>
-                        <?php } ?>
-                    </ul>
-    
-                </div>
-            <?php } ?>
-        <?php } ?>
-    
-        <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-        
-    </div>
-
-	<div class="content">
-		<?php if (is_array($this->view['arData']) && sizeof($this->view['arData']) > 0) { ?>
-            <table class="table table-bordered table-hover table-striped wpsg-table-order">
-                <thead>
-                    <tr>
-                        <th class="manage-column column-title wpsg_pic_col"></th>
-                        <th class="wpsg_order" data-order="name"><?php echo __("Name", 'wpsg'); ?></th>
-						<?php if ($this->hasMod('wpsg_mod_produktartikel')) { ?>
-						<th class="wpsg_order" data-order="pos"><?php echo __('Pos.', 'wpsg'); ?></th>
-						<?php } ?>
-                        <th class="wpsg_order" data-order="anr"><?php echo __("Artikelnummer", 'wpsg'); ?></th>
-    					                
-                        <?php /* if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_positionnumber') == '1') { ?>
-							<th class="wpsg_order" data-order="pos-nr"><?php echo __("Positionsnummer", "wpsg"); ?></th>
-						<?php } */ ?>
-	
-                        <?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat') === '1') { ?>
-                        <th class="wpsg_order" data-order="cat"><?php echo __('Kategorie', 'wpsg'); ?></th>
-                        <?php } ?>
-                        
-						<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_productindex') == '1') { ?>
-						<th class="wpsg_order" data-order="deliverytime"><?php echo __("Lieferzeit", 'wpsg'); ?></th>
-						<?php } ?>
-							
-						<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProductindexBackend') == '1') { ?>
-						<th class="wpsg_order" data-order="weight"><?php echo __("Gewicht", 'wpsg'); ?></th>                        
-						<?php } ?>
-	
-						<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindexBackend_fmenge') == '1') { ?>
-                        <th class="wpsg_order" data-order="fuellmenge"><?php echo __("FÃŒllmenge", 'wpsg'); ?></th>
-						<?php } ?>
-	
-						<?php if ($this->hasMod('wpsg_mod_productgroups') && $this->get_option('wpsg_mod_productgroups_productindex') == '1') { ?>
-                        <th class="wpsg_order" data-order="pgruppe"><?php echo __("Produktgruppe", 'wpsg'); ?></th>
-						<?php } ?>
-	
-						<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showBackendStock') == '1') { ?>
-						<th class="wpsg_order" data-order="stock"><?php echo __("Lagerbestand", 'wpsg'); ?></th>
-						<?php } ?>
-						
-                        <th class="wpsg_order" data-order="mwst"><?php echo __("MwSt.", 'wpsg'); ?></th>
-
-                        <th class="wpsg_order" data-order="price"><?php echo __("Preis", 'wpsg'); ?></th>
-                    </tr>
-                </thead>
-                <tbody>
-                    <?php foreach ($this->view['arData'] as $oProduct) { $d = $oProduct->data; ?>
-                    <tr>
-                        <td class="post-title wpsg_pic_col">
-                            
-                            <?php $attachment_id = $this->imagehandler->getAttachmentID($oProduct->getProductKey()); ?>
-                             
-                            <a href="<?php
-
-                                echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$d['id'], 'wpsg-product-edit-'.$d['id']);
-							
-							?>" title="<?php echo wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $d['name']) ?>">
-                                <div class="box_img_wrap wpsg_be_productindex_image">
-                                    <?php echo wp_get_attachment_image($attachment_id, 'medium'); ?>
-                                </div>
-                            </a>
-                            
-                        </td>
-                        <td class="post-title column-title">
-                            <strong>
-                                <?php if ($this->isMultiLingual()) { ?>
-                                <?php foreach ($this->getStoreLanguages() as $l) { ?>
-                                    <?php if ($l['locale'] != $this->getDefaultLanguageLocale()) { ?>
-                                    <a href="<?php
-	
-										echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$d['id'].'&wpsg_lang='.$l['lang'], 'wpsg-product-edit-'.$d['id']);
-										
-									?>" title="<?php echo wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $l['name']); ?>">
-                                        <img src="<?php echo $this->getFlagURL().$l['flag']; ?>" alt="<?php echo wpsg_translate(__('Produkt fÃŒr Sprache #1# bearbeiten.', 'wpsg'), $l['name']); ?>" />
-                                    </a>
-                                    <?php } ?>
-                                <?php } ?>
-                                <?php } ?>
-                                <a title="<?php echo __("Dieses Produkt bearbeiten", "wpsg"); ?>" href="<?php 
-									
-									echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$d['id'], 'wpsg-product-edit-'.$d['id']);									
-									
-								?>" class="row-title"><?php echo (($d['name'] == "")?__("---- ", "wpsg"):$d['name']); ?></a>
-                            </strong>
-                            <div class="row-actions">
-                                <span class="edit"><a title="<?php echo __("Dieses Produkt bearbeiten", "wpsg"); ?>" href="<?php
-		
-									echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$d['id'], 'wpsg-product-edit-'.$d['id']);
-	
-								?>"><?php echo __("Bearbeiten", "wpsg"); ?></a></span>
-                                |
-                                <span class="del"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie das Produkt lÃ¶schen wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Dieses Produkt lÃ¶schen", "wpsg"); ?>" href="<?php
-										
-									echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=del&edit_id='.$d['id'].'&noheader=1', 'wpsg-product-del-'.$d['id']);
-
-								?>"><?php echo __("LÃ¶schen", "wpsg"); ?></a></span>
-                                |
-                                <span class="copy"><a onclick="if (!confirm('<?php echo __("Sind Sie sicher, dass Sie das Produkt kopieren wollen?", "wpsg"); ?>')) return false;" title="<?php echo __("Dieses Produkt kopieren", "wpsg"); ?>" href="<?php
-		
-									echo wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=copy&edit_id='.$d['id'].'&noheader=1', 'wpsg-product-copy-'.$d['id']);
-										
-								?>"><?php echo __("Kopieren", "wpsg"); ?></a></span>
-                                |
-                                <span class="view"><a target="_blank" title="<?php echo __("Dieses Produkt im Frontend ansehen", "wpsg"); ?>" href="<?php echo $this->getProduktLink(array('id' => $d['id'])); ?>"><?php echo __("Ansehen", "wpsg"); ?></a></span>
-                                <?php $this->callMods('produkt_index_editmenu', array(&$d)); ?>
-                            </div>
-                        </td>
-						<?php if ($this->hasMod('wpsg_mod_produktartikel')) { ?>
-						<td class="wpsg_pos" data-order="pos">
-                             
-                            <span data-product_id="<?php echo $oProduct->getId(); ?>" class="wpsg_ie_pos wpsg_ie_pos_<?php echo $oProduct->getId(); ?>"><?php echo $oProduct->getMenuOrder(); ?></span>
-                            
-						</td>
-						<?php } ?>
-						<td><?php echo $oProduct->getNr(); ?></td>
-                        <?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat')) { ?>
-                        <td>
-                            <?php
-                            
-                                $post_id = $this->callMod('wpsg_mod_produktartikel', 'getPostIdFromProductId', [$d['id']]);
-                                $post_terms = \get_the_terms($post_id, $this->get_option('wpsg_mod_produktartikel_pathkey_cat'));                   
-                                
-                                $arTermDisplay = [];
-
-                                if (is_array($post_terms)) {
-                                
-                                    foreach ($post_terms as $term) {
-                                        
-                                        if (!in_array($term->slug, $arTermExclude)) {
-                                            
-                                            if ($wpsg_mod_produktartikel_cat_first_level && $term->parent !== 0) continue;
-                                            
-                                            $arTermDisplay[] = $term->name;
-                                            
-                                        }
-                                        
-                                    }
-
-                                }
-                                
-                                asort($arTermDisplay);
-                                
-                                echo implode(', ', $arTermDisplay);
-                                
-                            ?>
-                        </td>
-                        <?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_productindex') == '1') { ?>
-                        <td>
-                        	<?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', array($oProduct->getProductKey()))) { ?>
-						
-								<div class="wpsg_product_only_store">
-									<?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayStoreText', array($oProduct->getProductKey()))); ?>
-								</div>									
-								<?php $stl = 0; $stl = $this->callMod('wpsg_mod_deliverytime', 'displayStoreLink', array($oProduct->getProductKey())) ?>
-								<?php if (wpsg_isSizedInt($stl)) { ?>
-									&nbsp;<a href="<?php echo get_permalink($stl); ?>"><?php echo __('So erreichen Sie uns.'); ?></a>
-								<?php } ?>
-								
-							<?php } else { ?>
-																										
-							<?php $strDelayNote = $this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', array($oProduct->getProductKey())); ?>
-							<?php if (wpsg_isSizedString($strDelayNote)) { ?>
-								<div class="wpsg_mod_deliverytime_offline">
-								    <div class="wpsg_mod_deliverytime_delay"><?php echo wpsg_hspc($strDelayNote); ?></div>
-								</div>										
-							<?php } else { ?>			
-                            	<?php if ($d['wpsg_mod_deliverytime_deliverytime'] == '' ) { ?>
-	                            	<?php echo $this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', array($oProduct->getProductKey())); ?>
-                           		<?php } else { ?>
-                            		<?php echo $this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', array($oProduct->getProductKey())); ?>										
-                            	<?php } ?>
-                            <?php } ?>
-                        	<?php } ?>
-                        </td>
-                        <?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProductindexBackend') == '1') { ?>
-                        <td>
-                             <?php if (($oProduct->weight) > '0') { ?>
-    							<?php echo wpsg_translate(__('#1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$oProduct->id.'">'.wpsg_ff($oProduct->weight).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
-    						<?php } else { ?>
-    							<label><?php wpsg_translate(__('', 'wpsg'))?></label>
-    						<?php } ?>
-                        </td>
-                        <?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showProductindexBackend_fmenge') == '1') { ?>
-                        <td>
-                        	<?php if (($oProduct->fmenge) > '0') { ?>										
-								<?php echo wpsg_translate(__('#1#', 'wpsg'), '<span class="wpsg_fmenge">'.wpsg_ff($oProduct->fmenge, '', true).'</span> '.$this->callMod('wpsg_mod_fuellmenge', 'getUnit', [$oProduct->feinheit])); ?>										
-							<?php } else { ?>					
-								<label><?php echo wpsg_translate(__('', 'wpsg')); ?></label>						
-							<?php } ?>	 
-                        </td>
-                        <?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_productgroups') && $this->get_option('wpsg_mod_productgroups_productindex') == '1') { ?>
-                        <td>
-                            <?php if ($d['pgruppe'] <= 0) { ?>
-                            <?php echo __('Nicht zugewiesen', 'wpsg'); ?>
-                            <?php } else { ?>
-                            <?php echo $oProduct->getProductgroupName(); ?>
-                            <?php } ?>
-                        </td>
-                        <?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showBackendStock') == '1') { ?>
-                        <td>
-                            <div style="line-height:inherit; margin-bottom:0.2em;">
-                            	<?php if ($d['stock'] == '0' ) {?>
-	                            	<div class="wpsg_productview_backend-sold-out"><?php echo __('Ausverkauft', 'wpsg');?></div>
-                           		<?php } else {  ?>
-                           			<div class="wpsg_productview_backend-available"><?php echo __('VorrÃ€tig', 'wpsg');?></div>
-                           			<?php 
-                           			if ($this->get_option('wpsg_mod_stock_minstockproduct') == 1) {
-                           				$cnts = '('.$d['stock'].'/'.$d['minstockproduct_count'].')';
-                           			} else {
-                           				$cnts = '('.$d['stock'].')';
-                           			}
-									if ($d['stock'] <= wpsg_getInt($d['minstockproduct_count'])) {
-										echo '<div style="color:red;">'.$cnts.'</div>';
-									} else {
-										echo '<div>'.$cnts.'</div>';
-									}
-                           			?>
-                           		<?php }?>
-                            </div>
-                            <?php if ($this->hasMod('wpsg_mod_productvariants')) $arVarianten = $this->callMod('wpsg_mod_productvariants', 'getVariants', array($d['id'], true, true, true)); if (wpsg_isSizedArray($arVarianten)) { ?>
-                            <div style="line-height:inherit; padding:2px 0px 0px;">
-                                <a class="clueTip" rel="#" href="#" onclick="return wpsg_mod_productvariations_show(<?php echo $d['id']; ?>)" ><?php echo __('Variantenbestand', 'wpsg'); ?></a>
-                            </div>
-                            <?php } ?>
-                        </td>
-                        <?php } ?>
-                        <td class="wpsg_mwst_col">
-                            <?php if (wpsg_isSizedInt($d['euleistungsortregel'])) { ?>
-                                <img src="<?php echo WPSG_URL; ?>views/gfx/eu.png" alt="<?php echo __('Produkt unterliegt der EU-Leistungsortregel', 'wpsg'); ?>" />
-                            <?php } ?>
-                            <?php echo strtoupper($d['mwst_key']).' ('.wpsg_ff($oProduct->getDefaultTaxValue(), '%').' '.$this->getDefaultCountry()->kuerzel.')'; ?>
-                        </td>
-                        <td>
-                            <?php echo wpsg_ff($d['preis'], $this->get_option('wpsg_currency')); ?>
-                        </td>
-                    </tr>
-                    <?php } ?>
-                </tbody>
-            </table>
-
-            <div style="margin-right:-15px;">
-                <?php $this->render(WPSG_PATH_VIEW.'/admin/pager.phtml'); ?>
-            </div>
-
-            <script>
-                
-                for (let el of document.getElementsByClassName('wpsg_ie_pos')) {
-                    
-                    jQuery(el).wpsg_editable('<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&wpsg_action=inline_edit&noheader=1', { 
-                        submitdata: {
-                            field: 'pos',
-                            product_id: parseInt(el.getAttribute('data-product_id'))
-                        },
-                        submit: '<?php echo __('Speichern', 'wpsg'); ?>',
-                        placeholder: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>',
-                        indicator: '<?php echo __('Speicher ...', 'wpsg'); ?>',
-                        tooltip: '<?php echo __('Zum Bearbeiten anklicken ...', 'wpsg'); ?>'
-                    });
-
-                }
-                
-            </script>
-            
-            <div class="clearer"></div>
-
-		<?php } else { ?>
-
-            <?php echo wpsg_drawForm_AdminboxStart(); ?>
-    		<?php echo __('Keine Produkte in der Datenbank.', 'wpsg'); ?>
-            <?php echo wpsg_drawForm_AdminboxEnd(); ?>
-
-		<?php } ?>
-
-	</div>
-
+	
+	</div> 
+	
+	<?php } else { ?>
+	<p><?php echo __('Keine Produkte in der Datenbank.', 'wpsg'); ?></p>
+	<?php } ?>
+	
 </div>
-
-<?php if ($this->hasMod('wpsg_mod_productvariants') && $this->hasMod('wpsg_mod_stock')) { ?>
-<div id="wpsg_mod_productvariations_dialog" class="modal fade" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-				<h4 class="modal-title"><?php echo __('Produktvariationen Lagerbestand anzeigen', 'wpsg'); ?></h4>
-			</div>
-			<div class="modal-body">
-
-			</div>
-			<div class="modal-footer">
-
-				<button type="button" class="btn-sm wpsg_mod_productvariants_variants_close wpsg_mod_productvariants_variants_vari btn btn-default" style="display:none;" onclick="return wpsg_mod_productvariants_back();"><span class="glyphicon glyphicon-remove"></span>&nbsp;<?php echo __('SchlieÃen', 'wpsg'); ?></button>
-
-			</div>
-		</div>
-	</div>
-</div>
-<?php } ?>
-
-<script type="text/javascript">/* <![CDATA[ */
-
-	<?php if (wpsg_isSizedString($this->view['arFilter']['order']) && wpsg_isSizedString($this->view['arFilter']['ascdesc'])) { ?>
-    jQuery('th[data-order="<?php echo @$this->view['arFilter']['order']; ?>"]').addClass('wpsg_order_<?php echo strtolower(@$this->view['arFilter']['ascdesc']); ?>');
-    <?php } ?>
-
-	function wpsg_mod_productvariations_show(product_id)
-	{
-
-		jQuery('#wpsg_mod_productvariations_dialog button').prop('disabled', true);
-		jQuery('#wpsg_mod_productvariations_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
-
-		//	wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvariants&noheader=1',
-		jQuery('#wpsg_mod_productvariations_dialog').modal();
-
-		jQuery.ajax( {
-			url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_stock&edit_id=<?php echo $d['id']; ?>&noheader=1&wpsg_cmd=getVariInfo',
-			data: {
-				'subaction': 'admin_show',
-				'product_id': product_id
-			},
-			success: function(data) {
-
-				jQuery('.wpsg_mod_productvariants_variants').show();
-				jQuery('.wpsg_mod_productvariants_variants_vari').hide();
-
-				jQuery('#wpsg_mod_productvariations_dialog .modal-body').html(data);
-				jQuery('#wpsg_mod_productvariations_dialog button').prop('disabled', false);
-
-			}
-    	} );
-
-		return false;
-
-	} // function wpsg_mod_productvariations_show()
-
-	function goPage(page)
-	{
-
-		jQuery('#wpsg_seite').val(page);
-		jQuery('#filter_form').trigger('submit');
-
-		return false;
-
-	} // function goPage(page)
-
-/* ]]> */</script>
Index: /views/produkt/mapimport.phtml
===================================================================
--- /views/produkt/mapimport.phtml	(revision 8528)
+++ /views/produkt/mapimport.phtml	(revision 5261)
@@ -12,4 +12,7 @@
 		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=index" class="button add-new-h2"><?php echo __("ZurÃŒck zur Produktverwaltung", "wpsg"); ?></a>
 	</h2>
+	
+	<?php echo $this->writeBackendMessage(); ?>
+	<br />
 	
 	<form method="POST" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&amp;action=import&amp" id="import_form" enctype="multipart/form-data">
Index: /views/produkt/select.phtml
===================================================================
--- /views/produkt/select.phtml	(revision 8528)
+++ /views/produkt/select.phtml	(revision 5261)
@@ -14,10 +14,4 @@
 	 	<?php } ?>
 	 
-		<script language="javascript" type="text/javascript" src="<?php echo get_option('siteurl'); ?>/wp-admin/load-scripts.php?c=1&load[]=jquery-core"></script>
-		<script language="javascript" type="text/javascript" src="<?php echo get_option('siteurl'); ?>/<?php echo WPSG_CONTENTDIR_WP; ?>/plugins/".WPSG_FOLDERNAME."/views/js/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
-		
-		<link rel='stylesheet' id='wpsg-bscss-css'  href='<?php echo get_option('siteurl'); ?>/<?php echo WPSG_CONTENTDIR_WP; ?>/plugins/'.WPSG_FOLDERNAME.'/views/js/bootstrap-3.4.1-dist/css/bootstrap.css?ver=4.7.5' type='text/css' media='all' />
-		<link rel='stylesheet' id='wpsg-bs-theme-css-css'  href='<?php echo get_option('siteurl'); ?>/<?php echo WPSG_CONTENTDIR_WP; ?>/plugins/'.WPSG_FOLDERNAME.'/views/js/bootstrap-3.4.1-dist/css/bootstrap-theme.css?ver=4.7.5' type='text/css' media='all' />
-		
 		<link rel="stylesheet" href="<?php echo $this->getRessourceURL('css/admin.css'); ?>" type="text/css" media="all" />
 				
@@ -59,11 +53,4 @@
 				}
 				
-				if (document.getElementById("title") != null && document.getElementById("title").value != "1")
-				{
-					
-					text += " hide_title=\"1\" ";
-					
-				}
-				
 				text += "]";
 									
@@ -85,5 +72,5 @@
 									
 					tinyMCEPopup.close();
-													
+																			
 				}
 				<?php } ?>
@@ -132,7 +119,6 @@
 
 				insertProdukt();
-				
-				//jQuery('#wpsg_mod_relatedproducts_dialog').modal( { } ).modal('hide');
-				jQuery("#wpsg_mod_relatedproducts_dialog .close").click()
+				jQuery('#wpsg_relatedproducts_produktauswahl').html('').dialog('destroy');
+
 				return false;
 				
@@ -140,64 +126,35 @@
 			<?php } ?>
 			
-		</script>
-
-		<style>
-
-			<?php if ($_REQUEST['wpsg_mode'] != 'wpsg_mod_relatedproducts') { ?>
-
-				* { font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; }
-			    #wpsg-bs { min-width:100px; }
-				body { padding:0px 15px 0px 15px ; }
-				label { mragin-bottom:5px; }
-				select { width:100%; margin-bottom:15px; }
-				input[type="button"] { float:right; margin-top:30px; }
-
-			<?php } else { ?>
-
-				body { margin:0px; padding:0px; min-width:0%; }
-				input[type="button"] { float:right; margin-right:15px; margin-top:15px; }
-
-			<?php } ?>
-
-		</style>
-
+		</script> 
 	</head>
 	
-	<body id="wpsg-bs">
-  	
-		<div class="container-fluid">
-			<div class="row">
- 
-				<?php if (sizeof($this->view['arProdukte']) <= 0) { ?>
-					<p><?php echo __('Keine Produkte in der Datenbank.', 'wpsg'); ?></p>
-				<?php } else { ?>			
-					<?php asort($this->view['arProdukte']); ?>
-					<?php echo wpsg_drawForm_Select('produkt', __('Produkt', 'wpsg'), $this->view['arProdukte'], false); ?>
-					
-					<div class="col-xs-6">
-						<div class="row"><?php echo wpsg_drawForm_Select('template', __('Template', 'wpsg'), $this->view['arTemplates'], false); ?></div>
-					</div>
-					<div class="col-xs-6">
-						<div class="row"><?php echo wpsg_drawForm_Select('title', __('Titel anzeigen', 'wpsg'), array('1' => __('Ja', 'wpsg'), '0' => __('Nein', 'wpsg')), '1'); ?></div>
-					</div>
-					
-					<?php if ($_REQUEST['wpsg_mode'] != 'wpsg_mod_relatedproducts') { ?>				
-					<input class="btn btn-primary" type="button" value="<?php echo __('EinfÃŒgen', 'wpsg'); ?>" onclick="return insertProdukt();" />
-					<?php } ?>
-					
-					<div class="wpsg_clear"></div><br />
-									
-					<?php if ($this->hasMod('wpsg_mod_productgroups') && $_REQUEST['wpsg_mode'] != 'wpsg_mod_relatedproducts') { ?>		
-					<?php echo wpsg_drawForm_Select('produktgroup', __('Produktgruppe', 'wpsg'), $this->view['arProduktgroups'], false); ?>
-					<?php echo wpsg_drawForm_Select('produktgroup_order', __('Sortierung', 'wpsg'), $this->view['arProductgroupsOrder'], false); ?>
-					<?php echo wpsg_drawForm_Select('produktgroup_direction', __('Richtung', 'wpsg'), $this->view['arProductgroupsDirection'], false); ?> 
-					<input class="btn btn-primary" type="button" value="<?php echo __('EinfÃŒgen', 'wpsg'); ?>" onclick="return insertProductgroup();" />
-					<?php } ?>
-											
+	<body style="margin:0px; padding:0px;">
+
+		<div class="wpsg_productselect">
+			<?php if (sizeof($this->view['arProdukte']) <= 0) { ?>
+				<p><?php echo __('Keine Produkte in der Datenbank.', 'wpsg'); ?></p>
+			<?php } else { ?>			
+				
+				<?php echo wpsg_drawForm_Select('produkt', __('Produkt', 'wpsg'), $this->view['arProdukte'], false); ?>
+				<?php echo wpsg_drawForm_Select('template', __('Template', 'wpsg'), $this->view['arTemplates'], false); ?>
+				
+				<?php if ($_REQUEST['wpsg_mode'] == 'wpsg_mod_relatedproducts') { ?>
+				<input class="button" type="button" style="float:right; padding:2px 10px 2px 10px;" value="<?php echo __('EinfÃŒgen und schlieÃen', 'wpsg'); ?>" onclick="return insertProduktClose();" />
+				<input class="button" type="button" style="float:right; padding:2px 10px 2px 10px; margin-right:5px;" value="<?php echo __('EinfÃŒgen', 'wpsg'); ?>" onclick="return insertProdukt();" />
+				<?php } else { ?>
+				<input type="button" style="float:right; padding:2px;" value="<?php echo __('EinfÃŒgen', 'wpsg'); ?>" onclick="return insertProdukt();" />
 				<?php } ?>
-			
-			</div>
+				
+				<div class="wpsg_clear"></div><br />
+						 		
+				<?php if ($this->hasMod('wpsg_mod_productgroups') && $_REQUEST['wpsg_mode'] != 'wpsg_mod_relatedproducts') { ?>		
+				<?php echo wpsg_drawForm_Select('produktgroup', __('Produktgruppe', 'wpsg'), $this->view['arProduktgroups'], false); ?>
+				<?php echo wpsg_drawForm_Select('produktgroup_order', __('Sortierung', 'wpsg'), $this->view['arProductgroupsOrder'], false); ?>
+				<?php echo wpsg_drawForm_Select('produktgroup_direction', __('Richtung', 'wpsg'), $this->view['arProductgroupsDirection'], false); ?> 
+				<input type="button" style="float:right; padding:2px;" value="<?php echo __('EinfÃŒgen', 'wpsg'); ?>" onclick="return insertProductgroup();" />
+				<?php } ?>
+						 				
+			<?php } ?>
 		</div>
-			
 	</body>
 </html>
Index: /views/produkttemplates/ausverkauft.phtml
===================================================================
--- /views/produkttemplates/ausverkauft.phtml	(revision 5261)
+++ /views/produkttemplates/ausverkauft.phtml	(revision 5261)
@@ -0,0 +1,130 @@
+<?php
+
+	/*
+	 * Template fÃŒr das Produkt im Frontend
+	 */
+
+	//Ausgabe der verfÃŒgbaren Variablen
+	//wpsg_debug($_SESSION);
+	//wpsg_debug($this->view['data']['stock']);
+
+	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
+	//$this->noReleatedProducts = true; 
+
+?>
+<div class="wpsg_produkt_wrapper">
+	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
+	
+		<?php /* Block fÃŒr die Produktbilder START */ ?>
+		<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+		<div class="wpsg_produkt_produktbilder">
+			<?php if (sizeof($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])))) { ?>
+			<?php $i = 0; foreach ($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])) as $b) { $i ++; ?>
+			<?php if ($i == 1 && !wpsg_isSizedString($this->view['data']['varianten_image']) || $b == $this->view['data']['varianten_image']) { ?>
+			<div class="wpsg_produkt_preview wpsg_pb_pic">	
+				<a class="wpsg_imagelink thickbox" rel="<?php echo $this->view['product_index']; ?>-<?php echo $this->view['data']['id']; ?>" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, 800, 600, $this->get_option('wpsg_mod_produktbilder_mode'))); ?>">
+					<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="<?php echo wpsg_hspc($this->view['data']['name']); ?>" />
+				</a>
+			</div>
+			<?php } else { ?>
+			<div class="wpsg_pb_pic" style="display:none;">
+				<a class="wpsg_imagelink thickbox" rel="<?php echo $this->view['product_index']; ?>-<?php echo $this->view['data']['id']; ?>" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, 800, 600, $this->get_option('wpsg_mod_produktbilder_mode'))); ?>">
+					<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="<?php echo wpsg_hspc($this->view['data']['name']); ?>" />
+				</a>
+			</div>
+			<?php } ?>
+			<?php } ?>
+			<?php } ?>
+			<div class="wpsg_clear"></div>
+		</div>
+		<?php } ?>
+		<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+	
+		<div class="wpsg_product_afterimage">
+	
+			<h2 itemprop="name" class="wpsg_producttitle"><?php echo wpsg_hspc($this->view['data']['name']); ?></h2>
+		
+			<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
+			<div class="wpsg_artikelnummer"> 
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			<?php } ?>
+		
+			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
+				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+				<span itemprop="price" class="preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>"><?php echo wpsg_ff($this->view['data']['preis']); ?></span> <?php echo $this->get_option('wpsg_currency'); ?><?php if (wpsg_isSizedString($this->view['data']['price_info'])) { echo '<div class="wpsg_priceinfo">'.wpsg_hspc($this->view['data']['price_info']).'</div>'; } ?>
+			</div>		
+			
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
+				<div class="wpsg_produkt_preishinweis">
+					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+				</div>
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					wpsg_ff($this->view['data']['fmenge'], $this->view['data']['feinheit'], true),
+					wpsg_ff($this->view['data']['fmenge_preis'], $this->get_option('wpsg_currency')),
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten">
+			<?php echo $this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['id'])); ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>
+										
+			<div class="wpsg_produkt_soldout">	
+			<?php echo __('Produkt ausverkauft', 'wpsg'); ?>				
+			</div>
+			
+			<div class="wpsg_clear"></div>
+					 	
+			<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+			<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+			<?php /* Facebook und Co Integration ENDE */ ?>
+			
+		</div> 
+		
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
+		</div>
+				
+	</div>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+</div> 
Index: /views/produkttemplates/bildertest.phtml
===================================================================
--- /views/produkttemplates/bildertest.phtml	(revision 5261)
+++ /views/produkttemplates/bildertest.phtml	(revision 5261)
@@ -0,0 +1,42 @@
+<?php
+ 
+	$arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])); 
+
+?>
+
+<div style="padding:15px; background-color:#999999;">
+	
+	<?php echo __('100x100', 'wpsg'); ?><br />
+	<div style="width:100px; height:100px; display:block; background-color:red;"></div>
+	
+	<?php foreach ($arBilder as $bild) { ?>
+	
+		<h2><?php echo $bild; ?>:</h2>
+	
+		<?php echo __('CROP (c)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'c')); ?>" /><br />
+		
+		<?php echo __('CROP CENTER (cz)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'cz')); ?>" /><br />
+		
+		<?php echo __('STRETCH (z)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'z')); ?>" /><br />
+		
+		<?php echo __('NIX (n)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'n')); ?>" /><br />
+		
+		<?php echo __('SCALE und FreiflÃ€che (sz)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'sz')); ?>" /><br />
+		
+		<?php echo __('SCALE WIDTH (sw)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'sw')); ?>" /><br />
+		
+		<?php echo __('SCALE HEIGHT (sh)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 'sh')); ?>" /><br />
+		
+		<?php echo __('SCALE INTO (s)', 'wpsg'); ?><br />
+		<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $bild, 100, 100, 's')); ?>" /><br />
+		
+	<?php } ?>
+		
+</div> 
Index: /views/produkttemplates/produktseite.phtml
===================================================================
--- /views/produkttemplates/produktseite.phtml	(revision 5261)
+++ /views/produkttemplates/produktseite.phtml	(revision 5261)
@@ -0,0 +1,135 @@
+<?php
+
+	/*
+	 * Template fÃŒr das Produkt im Frontend
+	 */
+
+	//Ausgabe der verfÃŒgbaren Variablen
+	//wpsg_debug($this->view['data']);
+
+	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
+	//$this->noReleatedProducts = true; 
+
+?>
+<div class="wpsg_produkt_wrapper">
+	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
+				
+		<div class="wpsg_product_afterimage">
+	
+			<h2 itemprop="name" class="wpsg_producttitle"><?php echo wpsg_hspc($this->view['data']['name']); ?></h2>
+	
+			<?php /* Block fÃŒr die Produktbilder START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+			<div class="wpsg_produkt_produktbilder">
+				<?php if (sizeof($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])))) { ?>
+				<?php $i = 0; foreach ($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])) as $b) { $i ++; ?>
+				<?php if ($i == 1) { ?>
+				<div class="wpsg_produkt_preview wpsg_pb_pic">		
+					<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $i, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'), 'pimage')); ?>
+					<?php /*<img itemprop="image" id="wpsg_mainimage_<?php echo $this->getTemplateIndex(); ?>" src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="" />*/?>				
+				</div>
+				<?php } else { ?>
+				<div class="wpsg_pb_pic" style="display:none;">
+					<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $i, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'), 'pimage')); ?>
+				</div>
+				<?php } ?>
+				<?php } ?>
+				<?php } ?>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php } ?>
+			<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+			
+			<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
+			<div class="wpsg_artikelnummer"> 
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			<?php } ?>
+		
+			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
+				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+				<span itemprop="price" class="preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>"><?php echo wpsg_ff($this->view['data']['preis']); ?></span> <?php echo $this->get_option('wpsg_currency'); ?><?php if (wpsg_isSizedString($this->view['data']['price_info'])) { echo '<div class="wpsg_priceinfo">'.wpsg_hspc($this->view['data']['price_info']).'</div>'; } ?>
+			</div>		
+			
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
+				<div class="wpsg_produkt_preishinweis">
+					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+				</div>
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					'<span id="fmenge_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['fmenge'], '', true).'</span> '.$this->view['data']['feinheit'],
+					'<span id="fmenge_gpreis_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['fmenge_preis']).'</span> '. $this->get_option('wpsg_currency'),
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+								
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+						
+			<?php /* Lieferzeit Anzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
+				
+				<div class="wpsg_mod_deliverytime">
+					<?php echo wpsg_translate(__('Lieferzeit: #1#', 'wpsg'), $this->callMod('wpsg_mod_deliverytime', 'getProductDeliveryTime', array($this->view['data']['id']))); ?>					
+				</div>
+				
+			<?php } ?>
+			<?php /* Lieferzeit Anzeige ENDE */ ?> 
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten">
+			<?php echo $this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['id'])); ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>
+								
+			<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>?wpsg_action=showProdukt&produkt_id=<?php echo $this->view['data']['id']; ?>'; return false;" type="button" value="<?php echo __('Zur Produktseite', 'wpsg'); ?>" />
+			
+			<div class="wpsg_clear"></div>
+					 	
+			<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+			<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+			<?php /* Facebook und Co Integration ENDE */ ?>
+			
+		</div> 
+		
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
+		</div>
+				
+	</div>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+</div> 
Index: /views/produkttemplates/standard.phtml
===================================================================
--- /views/produkttemplates/standard.phtml	(revision 8528)
+++ /views/produkttemplates/standard.phtml	(revision 5261)
@@ -6,460 +6,220 @@
 
 	//Ausgabe der verfÃŒgbaren Variablen
-	// wpsg_debug($this->view['data']);
+	//wpsg_debug($this->view['data']);
 
 	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
-	//$this->noReleatedProducts = true;
-
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-	if (($this->view['data']['product_key']??'') !== '') $oProduct->setProductKey($this->view['data']['product_key']);
-	
+	//$this->noReleatedProducts = true; 
+
+	//wpsg_debug($_SESSION);
+ 
 ?>
-
 <div class="wpsg_produkt_wrapper">
 
 	<input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" />
-	<input type="hidden" name="titleDisplayed" value="<?php echo $this->titleDisplayed; ?>" />
- 
-	<div class="wpsg_produkt wpsg_product_name">
-
-		<?php if (!$this->titleDisplayed) { ?>
-			<h1 class="wpsg_producttitle"><?php echo $oProduct->getProductName(); ?></h1>
-			<h2 class="wpsg_productdetailtitle"><?php echo $this->view['data']['detailname']; ?></h2>
-		<?php }  ?>
-
-		<?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
-
-	</div>
- 
+
 	<?php $this->callMods('product_top', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
 
 	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
-
-		<meta itemprop="name" content="<?php echo wpsg_hspc($oProduct->getProductName()); ?>" />
-		<meta itemprop="detailname" content="<?php echo wpsg_hspc($this->view['data']['detailname']); ?>" />
+				
+		<div class="wpsg_product_afterimage">
+	
+			<h2 itemprop="name" class="wpsg_producttitle"><?php echo $this->getProductName($this->view['data']['id']); ?></h2>
+	
+			<?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+			<?php /* Block fÃŒr die Produktbilder START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+			<div class="wpsg_produkt_produktbilder">
+				<?php if (sizeof($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])))) { ?>
+				<?php $i = 0; foreach ($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])) as $b) { $i ++; ?>
+				<?php if ($i == 1 && !wpsg_isSizedString($this->view['data']['varianten_image']) || $b == $this->view['data']['varianten_image']) { ?>
+				<div class="wpsg_produkt_preview wpsg_pb_pic">	
+					<a class="wpsg_imagelink thickbox" rel="<?php echo $this->view['product_index']; ?>-<?php echo $this->view['data']['id']; ?>" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, 800, 600, $this->get_option('wpsg_mod_produktbilder_mode'))); ?>">
+						<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="<?php echo wpsg_hspc($this->view['data']['name']); ?>" />
+					</a>
+				</div>
+				<?php } else { ?>
+				<div class="wpsg_pb_pic" style="display:none;">
+					<a class="wpsg_imagelink thickbox" rel="<?php echo $this->view['product_index']; ?>-<?php echo $this->view['data']['id']; ?>" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, 800, 600, $this->get_option('wpsg_mod_produktbilder_mode'))); ?>">
+						<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="<?php echo wpsg_hspc($this->view['data']['name']); ?>" />
+					</a>
+				</div>
+				<?php } ?>
+				<?php } ?>
+				<?php } ?>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php } ?>
+			<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+			
+			<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
+			<div class="wpsg_artikelnummer"> 
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			<?php } ?>
 		
-		<?php foreach ($oProduct->getAllProductCodes() as $product_code) { ?>
-			<?php if ($product_code['itemprop'] !== null) { ?>
-			<meta itemprop="<?php echo $product_code['itemprop']; ?>" content="<?php echo $product_code['code']; ?>" />
-			<?php } ?>
-		<?php } ?>
-		
-		<?php /* Block fÃŒr die Produktbilder START */ ?>
-		<?php 
-		
-			/* Das ist das primÃ€re Anzeigebild des Produktes (AttachmentID) */
-			$arAttachmentID = $this->imagehandler->getAttachmentID($this->view['data']['product_key']);
-
-			/* Array mit allen AttachmentIDs der Produktbilder */
-			$arAttachmentIDsAll = $this->imagehandler->getAttachmentIDs($this->view['data']['product_id']);
- 
-		?>
-
-		<?php if (wpsg_isSizedArray($arAttachmentIDsAll)) { ?>
-		<div class="wpsg_productimages">
-
-			<div class="wpsg_produkt_produktbilder">
-
-				<?php if (sizeof($arAttachmentIDsAll) > 0) { for ($i = 0; $i < sizeof($arAttachmentIDsAll); $i ++) { ?>
-
-					<?php /* URL fÃŒr die Lightbox */ ?>
-					<?php $att = wp_get_attachment_image_src($arAttachmentIDsAll[$i], array(800, 600), false); ?>
-
-                    <meta itemprop="image" content="<?php echo $att[0]; ?>" />
-
-					<a <?php if ($arAttachmentIDsAll[$i] != $arAttachmentID) echo 'style="display:none;"'; ?> rel="gallery-wpsg-<?php echo $this->getTemplateIndex(); ?>" title="<?php echo $oProduct->getProductName(); ?>" href="<?php echo $att[0]; ?>" data-fslightbox="<?php echo $this->getTemplateIndex(); ?>">
-
-						<?php echo wp_get_attachment_image($arAttachmentIDsAll[$i], array(300, 300), false, array()); ?>
-						
-					</a>
-					
-				<?php } } ?>
-
-			</div>
-
-		</div>
-		<?php } ?>
-		<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
-
-		<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
-		<div class="wpsg_artikelnummer">
-			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
-		</div>
-		<?php } ?>
-		
-		<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
-		<?php if (sizeof($arProductCodes) > 0) { ?>
-			<div class="product_code_wrap">
-			<?php foreach ($arProductCodes as $product_code) { ?>
-				<?php if ($product_code !== null) { ?>
-					
-					<div class="product_code <?php echo $product_code['code_key']; ?>">
-						<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
-					</div>
-					
-				<?php } ?>
-			<?php } ?>
-			</div>
-		<?php } ?>
-
-		<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt START*/ ?>
-		<?php if ($this->view['oProduct']->canDisplayPrice()) { ?>
-
 			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
-
-                <meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
-                <meta itemprop="price" content="<?php echo $this->view['oProduct']->getPrice($this->view['data']['product_key']); ?>" />
-
-				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
-
-				<?php $oldPrice = $this->view['oProduct']->getOldPrice();  ?>
-				
-				<?php if ($oldPrice !== false && $oldPrice != $this->view['oProduct']->getPrice($this->view['data']['product_key'])) { ?>
-					<span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-					<span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
-				<?php } else { ?>
-					<span class="wpsg_mod_productview_price"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-				<?php } ?>
-
-			</div>
-
-			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
-
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>				
+				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+				<span itemprop="price" class="wpsg_preis preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>">
+					<?php echo wpsg_ff($this->view['data']['preis'], $this->get_option('wpsg_currency')); ?>
+				</span> <?php if (wpsg_isSizedString($this->view['data']['price_info'])) { echo '<div class="wpsg_priceinfo">'.wpsg_hspc($this->view['data']['price_info']).'</div>'; } ?>
+				
+				<?php if ($this->hasMod('wpsg_mod_discount') && $this->view['data']['preis_prediscount'] > 0 && wpsg_isSizedInt($this->get_option('wpsg_mod_discount_show'))) { ?>				
+				<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis new_price">
+            		<?php echo __('Originalpreis', 'wpsg'); ?>: <span class="wpsg_preis_prediscount"><?php echo wpsg_ff($this->view['data']['preis_prediscount'], $this->get_option('wpsg_currency')); ?></span>		
+				</div>
+				<?php } ?>		
+			</div>
+						
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
 				<div class="wpsg_produkt_preishinweis">
 					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
 				</div>
-
-			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
-
-				<div class="wpsg_produkt_preishinweis">
-
-					<?php $fs = explode(',', $this->view['data']['allowedshipping']); ?>
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
 					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
-						<?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (array_search('500', $fs) || array_search('', $fs))) { /* Versandkostenfrei aktiv */?>
-							
-							<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
-								<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und <a href="#3#">ab #2# â¬ versandkostenfrei</a>)', 'wpsg'), 
-									wpsg_ff($this->view['data']['mwst_value']), 
-									wpsg_ff($this->get_option('wpsg_mod_freeshipping_minvalue')),
-									$this->getUrl(wpsg_ShopController::URL_VERSANDKOSTEN)
-								); ?>
-							<?php } else { ?>
-								<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und versandkostenfrei)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value'])); ?>
-							<?php } ?>
-							
-						<?php } else { ?>
-							<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-						<?php }?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
 					<?php } else { /* Frontend = BRUTTO Preise */ ?>
-						<?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (array_search('500', $fs) || array_search('', $fs))) { /* Versandkostenfrei aktiv */ ?>
-							
-							<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
-								<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und <a href="#3#">ab #2# â¬ versandkostenfrei</a>)', 'wpsg'),
-									wpsg_ff($this->view['data']['mwst_value']),
-									wpsg_ff($this->get_option('wpsg_mod_freeshipping_minvalue')),
-									$this->getUrl(wpsg_ShopController::URL_VERSANDKOSTEN)
-								); ?>
-							<?php } else { ?>
-								<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und versandkostenfrei)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value'])); ?>
-							<?php } ?> 
-							
-						<?php } else { ?>
-							<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-						<?php }?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
 					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			 			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					'<span class="wpsg_fmenge">'.wpsg_ff($this->view['data']['fmenge'], '', true).'</span> '.$this->view['data']['feinheit'],
+					'<span class="fmenge_preis">'.wpsg_ff($this->view['data']['fmenge_preis'], $this->get_option('wpsg_currency')).'</span> ',
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+								
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+						
+			<?php /* Lagerbestand START*/?>
+			<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProduct') == '1') { ?>
+							<div class="wpsg_mod_produktindex_stock">
+								<?php echo wpsg_translate(__('Lagerbestand: #1#','wpsg'), $this->view['data']['stock']);  ?>	
+							</div>
+						<?php } ?>
+			<?php /* Lagerbestand ENDE*/?>
+						
+			<?php /* Lieferzeit Anzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
+				
+				<div class="wpsg_mod_deliverytime">
+					<?php echo wpsg_translate(__('Lieferzeit: #1#', 'wpsg'), $this->callMod('wpsg_mod_deliverytime', 'getProductDeliveryTime', array($this->view['data']['id']))); ?>					
+				</div>
+				
+			<?php } ?>
+			<?php /* Lieferzeit Anzeige ENDE */ ?> 
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten">
+			<?php echo $this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['product_key'])); ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>
 					
-				</div>
-
-			<?php } ?>
-			
-		<?php } else {?>
-
-			<?php echo wpsg_translate(__('Die Produktpreise werden nur eingeloggten Benutzern angezeigt. Loggen Sie sich <a href="'.$this->getURL(wpsg_ShopController::URL_PROFIL).'">hier</a> bitte ein, um zu bestellen.')); ?>
-
-		<?php }?>
-		<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt ENDE */ ?>
+			<?php if ($this->callMods('productForSale', array($this->view['data']['product_key'])) || ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id'])))) { ?>
+			<div class="wpsg_produkt_add_basket_wrapper">	
+				
+				<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?>:</label>
+				
+				<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" 
+					<?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?>	
+				/>	
+							
+				<?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
+				<script type="text/javascript">
+	
+					jQuery(document).ready(function() { 
+						
+						jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').bind('click', function() {
+							
+							jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').prop('disabled', true);
+				 			 
+							jQuery.ajax( {
+								url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
+								data:
+								{
+									wpsg_form_data: jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
+									'wpsg[ajax]': '1',
+									'wpsg[submit]': '1'					
+								}, 
+								success: function(data) 
+								{
+									  
+									<?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
+									tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=500');
+									<?php } else { ?>
+
+									jQuery('#wpsg_basket_ajax_message_wrap').remove();
+									jQuery('body').append('<div id="wpsg_basket_ajax_message_wrap">' + data + '</div>');
+									
+									<?php } ?>
+
+									jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').prop('disabled', false);
+									
+								}
+							} );	
+							
+							return false;
+							
+						} );
+	
+					} );
+				 
+				</script>
+				<?php } ?>
+				
+			</div>
+			<?php } ?>
+			  
+			<?php if ($this->callMods('productForSale', array($this->view['data']['product_key']))) { ?>
+			<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+			<?php } ?>		
+			
+			
+			<?php if ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id']))) { ?> 
+			<input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
+			<?php } ?>
+			
+			<div class="wpsg_clear"></div>
+					 	
+			<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+			<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+			<?php /* Facebook und Co Integration ENDE */ ?>
+			
+		</div> 
 		
-		<div itemprop="description" class="wpsg_produkt_shortdescription">
-		
-			<span><?php echo $this->view['data']['shortdesc']; ?></span>
-			
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
 		</div>
-
-		<div class="wpsg_clear"></div>
- 		
-		<?php /* Lagerbestand START*/ ?>
-		<?php
-			
-			if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProduct') == '1') {
-			
-			$stock_source_display = '0'; // Variantenbestand
-			
-			if ($oProduct->getMeta('wpsg_vp_product_stock_display', false, '0') === '0') {
-				
-				// Einstellung
-				if ($this->get_option('wpsg_vp_product_stock_display') === '1') $stock_source_display = '1';
-				
-			} else if ($oProduct->getMeta('wpsg_vp_product_stock_display') === '1') {
-				
-				$stock_source_display = '1'; // Produktbestand
-				
-			}
-			
-			$stock_display = $this->view['data']['stock'];
-			
-			if ($stock_source_display === '1') $stock_display = $oProduct->__get('stock');
-			
-		?>
-		
-		<div class="wpsg_mod_produktindex_stock">
-		
-			<?php if ($stock_display > 0) {?>
-				
-                <label><?php echo __('Lagerbestand', 'wpsg'); ?></label>
-                <?php echo wpsg_translate(__('#1# Artikel auf Lager','wpsg'), $stock_display);  ?>
-			
-			<?php } else { ?>
-			 
-			 	<label><?php echo wpsg_translate(__('Ausverkauft', 'wpsg')); ?></label>
-			
-			<?php } ?>	
-		
-		</div>
-		<?php } ?>
-		<?php /* Lagerbestand ENDE*/ ?>
-
-		<?php /* FÃŒllmengenanzeige START */ ?>
-        <?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
-		<?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$oProduct->getPrice($this->view['data']['product_key']), $this->view['data']['fmenge'], $oProduct->getId()]); ?>
-        <?php } ?>
-		<?php /* FÃŒllmengenanzeige ENDE */ ?>
-
-		<?php /* Gewichtsanzeige START */ ?>
-		<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
-		<div class="wpsg_mod_weight_produkt">
-			
-			<?php if (($this->view['data']['weight']) > '0') { ?>
-				<span class="label label_weight"><?php echo wpsg_translate(__('Gewicht:', 'wpsg')); ?></span>
-				<?php echo wpsg_translate(__('#1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
-			<?php } else { ?>
-				<label><?php wpsg_translate(__('', 'wpsg'))?></label>
-			<?php } ?>
-		</div>
-		<?php } ?>
-		<?php /* Gewichtsanzeige ENDE */ ?>
-
-		<?php /* Lieferzeit Anzeige START */ ?>
-		<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
-
-			<?php /* Produkt nur im Store, nicht im Onlineshop vorhanden */ ?>
-			<?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', array($this->view['data']['product_key']))) { ?>
-	
-				<div class="wpsg_product_only_store"><?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayStoreText', array($this->view['data']['product_key']))); ?></div>
-	
-				<?php $stl = 0; $stl = $this->callMod('wpsg_mod_deliverytime', 'displayStoreLink', array($this->view['data']['product_key'])) ?>
-				<?php if (wpsg_isSizedInt($stl)) { ?>
-					
-					&nbsp;<a href="<?php echo get_permalink($stl); ?>"><?php echo __('So erreichen Sie uns.'); ?></a>
-					
-				<?php } ?>
-	
-			<?php } else { ?>				
-	
-				<?php $strDelayNote = $this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', array($this->view['data']['product_key'])); ?>
-				<?php if (wpsg_isSizedString($strDelayNote)) { ?>
-						
-					<div class="wpsg_mod_deliverytime_offline">
-					
-						<div class="wpsg_mod_deliverytime_delay"><?php echo wpsg_hspc($strDelayNote); ?></div>
-					
-					</div>
-						
-				<?php } else { ?>
-				
-				<div class="wpsg_mod_deliverytime">
-					<span class="label label_deliverytime"><?php echo wpsg_translate(__('Lieferzeit:', 'wpsg')); ?></span>
-					<?php echo $this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', array($this->view['data']['product_key'])); ?>
-				</div>	
-						
-				<?php } ?>
-	
-			<?php } ?>
-			
-		<?php } ?>
-		<?php /* Lieferzeit Anzeige ENDE */ ?>
-
-		<?php /* Produktkurzbeschreibung START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
-			<div class="wpsg_product_information_short">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_shortdescription">
-						<span><?php echo $this->view['data']['beschreibung']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* Produktkurzbeschreibung ENDE */ ?>
-
-		<?php /* Varianten START */ ?>
-		<div class="wpsg_produkt_varianten">
-			<?php echo $this->callMod('wpsg_mod_productvariants', 'renderTemplate', array($this->view['data']['product_key'])); ?>
-		</div>
-		<?php /* Varianten ENDE */ ?>
-		
-		<?php $this->callMods('product_bottom', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
- 
-		<div class="wpsg_product_buttonarea">			
-			<div class="wpsg_product_buttons_add_basket">
-				<?php if ($this->view['oProduct']->canOrder()) { ?>
-				<div class="wpsg_produkt_add_basket_wrapper">
-
-					<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
-
-					<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
-					
-					<?php /* Urlaubsmodus aktiv */ ?>
-					<?php if ($this->hasMod('wpsg_mod_deliverytime') && ($this->get_option('wpsg_mod_deliverytime_holiday') == '1')) { ?>
-						
-						<?php if ($this->callMod('wpsg_mod_deliverytime', 'holiday', array($this->view['data']['product_key']))) { ?>
-						
-							<div class="wpsg_product_deliverytime_holiday" style="height:50px; padding:10px; width:50%; float:right; border:1px solid #ff0000;">
-																													
-								<?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayHolidaytext', array($this->view['data']['product_key']))); ?>
-								
-							</div>					
-					
-						<?php } ?>
-							
-					<?php } else {?>
-					
-						<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
-					
-					<?php } ?>
-
-					<?php echo do_action('wpsg_producttemplate_afterButton'); ?>
-
-					<?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
-					<script type="text/javascript">
-
-						jQuery(document).ready(function() {
-
-							jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').on('click', function() {
-
-								wpsg_blockProductTemplate(<?php echo $this->getTemplateIndex(); ?>);
-
-								jQuery.ajax( {
-									url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
-									data: {
-										'wpsg_form_data': jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
-										'wpsg[ajax]': '1',
-										'wpsg[submit]': '1'
-									},
-									success: function(data) {
-
-                                        wpsg_refreshBasketWidget();
-										
-										<?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
-										
-											tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=500');
-											
-										<?php } else { ?>
-
-											jQuery('body').append(data);
-
-										<?php } ?>
-
-										wpsg_unblockProductTemplate(<?php echo $this->getTemplateIndex(); ?>);
-
-									}
-								} );
-
-								return false;
-
-							} );
-
-						} );
-
-					</script>
-					<?php } ?>
-
-				</div>
-				<?php } ?>
-			</div>
-		</div>
-
-		<div class="wpsg_clear"></div>
-
-		<?php if ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id']))) { ?>
-			<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
-			<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
-		
-			<input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
-		<?php } ?>
-
-		<?php /* Produktlangbeschreibung START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['longdescription'])) > 0) { ?>
-			<div class="wpsg_product_information_large">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_longdescription">
-						<span><?php echo $this->view['data']['longdescription']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* Produktlangbeschreibung ENDE */ ?>
-		
-		<?php /* zusÃ€tzliche Informationen START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['moreinfos'])) > 0) { ?>
-			<div class="wpsg_product_information_large">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_moreinfos">
-						<span><?php echo $this->view['data']['moreinfos']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* zusÃ€tzliche Informationen ENDE */ ?>
-		
-		<?php /* zusÃ€tzliche Lieferumfang START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['moreinfos2'])) > 0) { ?>
-			<div class="wpsg_product_information_large">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_moreinfos2">
-						<span><?php echo $this->view['data']['moreinfos2']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* zusÃ€tzliche Lieferumfang ENDE */ ?>
-
-		<div class="wpsg_clear"></div>
-
-		<?php /* Social Media Integration */ ?>
-		<div class="wpsg_product_social_media">
-			<?php if (is_plugin_active('plugin-directory/shariff.php')) {?>
-				<?php echo do_shortcode('[shariff]')?>
-			<?php } ?>
-		</div>
-
+				
 	</div>
-	
-	<?php $this->callMods('product_bottom_end', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
-
-</div>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+</div> 
Index: /views/produkttemplates/standard2.phtml
===================================================================
--- /views/produkttemplates/standard2.phtml	(revision 8528)
+++ /views/produkttemplates/standard2.phtml	(revision 5261)
@@ -1,470 +1,211 @@
 <?php
 
-/*
- * Template fÃŒr das Produkt im Frontend
- */
-
-//Ausgabe der verfÃŒgbaren Variablen
-//wpsg_debug($this->view['data']);
-
-// Damit keine ZubehÃ¶rprodukte ausgegeben werden
-//$this->noReleatedProducts = true;
-
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-
-	$var_info = [];
-	
-	if ($this->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$oProduct->getProductKey()])) {
-		
-		$var_info = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', [$oProduct->getProductKey()]);
-	 
+	/*
+	 * Template fÃŒr das Produkt im Frontend
+	 */
+
+	//Ausgabe der verfÃŒgbaren Variablen
+	//wpsg_debug($_SESSION);
+	//wpsg_debug($this->view['data']['stock']);
+
+	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
+	//$this->noReleatedProducts = true;
+	
+?>
+<style type="text/css">
+
+	.wpsg_theme1 { background-color:#EFEFEF; border:0px; }
+	.wpsg_theme1_mainimage a { text-decoration:none; padding:5px; display:table-cell; vertical-align:middle; text-align:center; width:184px; height:184px; background-color:#FFFFFF; }
+	.wpsg_theme1_mainimage a img { vertical-align:middle; }
+	.wpsg_theme1_previewslider a { text-decoration:none; padding:5px; display:table-cell; vertical-align:middle; text-align:center; width:50; height:50px; background-color:#FFFFFF; }
+	.wpsg_theme1_previewslider a img { vertical-align:middle; }
+	.wpsg_theme1_previewwrap { float:left; margin-right:7px; margin-top:7px; } 
+	.wpsg_theme1_produkt_produktbilder { float:left; width:220px; }
+	.wpsg_theme1_produkt_right { width:335px; float:left; }
+	
+</style>
+
+<script type="text/javascript">
+
+	if (typeof wpsg_theme1_switch !== 'function')
+	{
+
+		function wpsg_theme1_switch(htmlEle)
+		{
+ 
+			jQuery(htmlEle).parent().parent().parent().find('.wpsg_theme1_image').hide();
+			jQuery(htmlEle).parent().parent().parent().find('.' + jQuery(htmlEle).attr("class")).show();
+			
+			return false;
+			
+		} // function wpsg_theme1_switch(ele)
+		
 	}
-	
-?>
-
-<div class="wpsg_produkt_wrapper wpsg_produkt_wrapper2">
-
-	<input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" />
-	<input type="hidden" name="titleDisplayed" value="<?php echo $this->titleDisplayed; ?>" />
-
-	<div class="wpsg_produkt wpsg_product_name">
-
-		<?php if (!$this->titleDisplayed) { ?>
-			<h1 class="wpsg_producttitle"><?php echo $this->getProductName($this->view['data']['id']); ?></h1>
-			<?php if ($this->getProductName($this->view['data']['id']) !== $this->view['data']['detailname']) { ?>
-				<h2 class="wpsg_productdetailtitle"><?php echo $this->view['data']['detailname']; ?></h2>
-			<?php } ?>
-		<?php } ?>
-
-		<?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
-
-	</div>
-
-	<?php $this->callMods('product_top', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
-
+
+</script>
+
+<div class="wpsg_produkt_wrapper wpsg_theme1">
 	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
-
-		<meta itemprop="url" content="<?php echo $oProduct->getProductURL().'?test'; ?>" />
-		<meta itemprop="name" content="<?php echo wpsg_hspc($this->getProductName($this->view['data']['id'])); ?>" />
-		<meta itemprop="detailname" content="<?php echo wpsg_hspc($this->getProductName($this->view['data']['id']).' / '.rtrim(($var_info['key']??''), ' /')); ?>" />
-		<meta itemprop="sku" content="<?php echo wpsg_hspc($oProduct->getEAN()); ?>" />
-		
+	
 		<?php /* Block fÃŒr die Produktbilder START */ ?>
-		<?php 
-		
-			/* Das ist das primÃ€re Anzeigebild des Produktes (AttachmentID) */
-			$arAttachmentID = $this->imagehandler->getAttachmentID($this->view['data']['product_key']);
-		
-			/* Array mit allen AttachmentIDs der Produktbilder */
-			$arAttachmentIDsAll = $this->imagehandler->getAttachmentIDs($this->view['data']['product_id']);
-		
-		?>
-
-		<?php if (wpsg_isSizedArray($arAttachmentIDsAll)) { ?>
-		<div class="wpsg_productimages">
-
-			<div class="wpsg_produkt_produktbilder">
-
-				<?php if (sizeof($arAttachmentIDsAll) > 0) { for ($i = 0; $i < sizeof($arAttachmentIDsAll); $i ++) { ?>
-					
-					<?php $att = wp_get_attachment_image_src($arAttachmentIDsAll[$i], array(800, 600), false); ?>
-					
-					<a data-index="<?php echo $i; ?>" <?php if ($arAttachmentIDsAll[$i] != $arAttachmentID) echo 'style="display:none;"'; ?> data-fslightbox="<?php echo $this->getTemplateIndex(); ?>" title="<?php echo $this->getProductName($this->view['data']['id']); ?>" href="<?php echo $att[0]; ?>" class="bigimg">
-
-						<?php echo wp_get_attachment_image($arAttachmentIDsAll[$i], array(300, 300), false, array()); ?>
-						
+		<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+		<div class="wpsg_theme1_produkt_produktbilder">
+			<?php 
+			
+				$arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id']));
+				 
+			?>
+			<?php if (sizeof($arBilder) > 0) { ?>
+			<div class="wpsg_theme1_mainimage">
+				<a class="thickbox wpsg_theme1_image_0 wpsg_theme1_image" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'getPicPath', array($this->view['data']['id'], true)); ?>/<?php echo $arBilder[0]; ?>" rel="gallery-<?php echo $this->view['data']['id'] ?>">
+					<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $arBilder[0], 184, 184, 's')); ?>" />
+				</a>
+				<?php for ($i = 1; $i < sizeof($arBilder); $i ++) { ?>
+				<a class="thickbox wpsg_theme1_image_<?php echo $i; ?> wpsg_theme1_image" style="display:none;" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'getPicPath', array($this->view['data']['id'], true)); ?>/<?php echo $arBilder[$i]; ?>" rel="gallery-<?php echo $this->view['data']['id'] ?>">
+					<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $arBilder[$i], 184, 184, 's')); ?>" />
+				</a>
+				<?php } ?>
+			</div>
+			
+			<div class="wpsg_theme1_previewslider">
+			<?php if (sizeof($arBilder) > 1) {Â ?>
+				<?php for ($i = 0; $i < sizeof($arBilder); $i ++) { ?>
+				<div class="wpsg_theme1_previewwrap">
+					<a href="#" onclick="return wpsg_theme1_switch(this);" class="wpsg_theme1_image_<?php echo $i; ?>">
+						<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $arBilder[$i], 50, 50, 'sz')); ?>" />
 					</a>
-					
-				<?php } } ?>
-
-			</div>
-
+				</div>
+				<?php } ?>
+			<?php } ?>
+			</div>
+			
+			<?php } ?>	
+			 
 		</div>
 		<?php } ?>
 		<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
-
-		<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
-		<div class="wpsg_artikelnummer">
-			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
-		</div>
-		<?php } ?>
-		
-		<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
-		<?php if (sizeof($arProductCodes) > 0) { ?>
-			<div class="product_code_wrap">
-			<?php foreach ($arProductCodes as $product_code) { ?>
-				<?php if ($product_code !== null) { ?>
-					
-					<div class="product_code <?php echo $product_code['code_key']; ?>">
-						<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
-					</div>
-					
-				<?php } ?>
-			<?php } ?>
-			</div>
-		<?php } ?>
-
-		<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt START*/ ?>
-		<?php if ($this->view['oProduct']->canDisplayPrice()) { ?>
-
+	
+		<div class="wpsg_theme1_produkt_right">
+		
+			<h1 class="wpsg_producttitle" itemprop="name"><?php echo wpsg_hspc($this->view['data']['name']); ?></h1>
+		
+			<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
+			<div class="wpsg_artikelnummer">
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			<?php } ?>
+		
 			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
-
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
 				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
-
-				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
-
-				<?php $oldPrice = $this->view['oProduct']->getOldPrice();  ?>
-				
-				<?php if ($oldPrice !== false && $oldPrice != $this->view['oProduct']->getPrice($this->view['data']['product_key'])) { ?>
-					<span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-					<span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
-				<?php } else { ?>
-					<span class="wpsg_mod_productview_price"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-				<?php } ?>
-
-			</div>
-
-			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
-
+				<span itemprop="price" class="preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>"><?php echo wpsg_ff($this->view['data']['preis']); ?></span> <?php echo $this->get_option('wpsg_currency'); ?>
+			</div>		
+			
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
 				<div class="wpsg_produkt_preishinweis">
 					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
 				</div>
-
-			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
-
-				<div class="wpsg_produkt_preishinweis">
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
 					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
-						<?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					wpsg_ff($this->view['data']['fmenge'], $this->view['data']['feinheit'], true),
+					wpsg_ff($this->view['data']['fmenge_preis'], $this->get_option('wpsg_currency')),
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten">
+			<?php echo $this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['id'])); ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>
+			
+			<div class="wpsg_produkt_add_basket_wrapper">	
+				
+				<label for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?>:</label>
+				
+				<input type="text" value="1" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" />	
+				<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+			
+				<?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
+				<script type="text/javascript">
+			
+					jQuery(document).ready(function() {
+									
+						jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').bind('click', function() {
+				 			
+							jQuery.ajax( {
+								url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
+								data:
+								{
+									wpsg_form_data: jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
+									'wpsg[ajax]': '1',
+									'wpsg[submit]': '1'					
+								},
+								success: function(data) 
+								{
+									tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>');
+								}
+							} );	
 							
-							<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
-								<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und <a href="#3#">ab #2# â¬ versandkostenfrei</a>)', 'wpsg'), 
-									wpsg_ff($this->view['data']['mwst_value']), 
-									wpsg_ff($this->get_option('wpsg_mod_freeshipping_minvalue')),
-									$this->getUrl(wpsg_ShopController::URL_VERSANDKOSTEN)
-								); ?>
-							<?php } else { ?>
-								<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und versandkostenfrei)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value'])); ?>
-							<?php } ?>
+							return false;
 							
-						<?php } else { ?>
-							<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-						<?php }?>
-					<?php } else { /* Frontend = BRUTTO Preise */ ?>
-						<?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */ ?>
-							
-							<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
-								<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und <a href="#3#">ab #2# â¬ versandkostenfrei</a>)', 'wpsg'),
-									wpsg_ff($this->view['data']['mwst_value']),
-									wpsg_ff($this->get_option('wpsg_mod_freeshipping_minvalue')),
-									$this->getUrl(wpsg_ShopController::URL_VERSANDKOSTEN)
-								); ?>
-							<?php } else { ?>
-								<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und versandkostenfrei)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value'])); ?>
-							<?php } ?> 
-							
-						<?php } else { ?>
-							<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-						<?php }?>
-					<?php } ?>
-				</div>
-
-			<?php } ?>
-			
-		<?php } else {?>
-
-			<?php echo wpsg_translate(__('Die Produktpreise werden nur eingeloggten Benutzern angezeigt. Loggen Sie sich <a href="'.$this->getURL(wpsg_ShopController::URL_PROFIL).'">hier</a> bitte ein, um zu bestellen.')); ?>
-
-		<?php }?>
-		<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt ENDE */ ?>
-
+						} );
+
+					} );
+				 
+				</script>
+				<?php } ?>
+				
+			</div>
+			
+		</div>
+		
 		<div class="wpsg_clear"></div>
-
-		<div itemprop="description" class="wpsg_produkt_shortdescription">
-		
-			<span><?php echo $this->view['data']['shortdesc']; ?></span>
-			
+		 	
+		<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+		<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+		<?php /* Facebook und Co Integration ENDE */ ?>
+		
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
 		</div>
-
-		<div class="wpsg_clear"></div>
-
-		<div class="wpsg_gallery_wrap">
-					 
-			<?php /* Kleine Bilder vorschau unten */ ?>				
-			<ul>
-				<?php $i = 0; foreach ($arAttachmentIDsAll as $attachment_id) { ?>						
-				<li>
-					<div data-target="<?php echo $i; ?>" class="bigimgswitch">									
-						<?php echo wp_get_attachment_image($attachment_id, 'wpsg-basket-image', false, array()); ?>							
-					</div>
-				</li>
-				<?php $i ++; } ?>
-			</ul>
-
-		</div>
-
-		<?php /* Lagerbestand START*/?>
-		<?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProduct') == '1') { ?>
-		
-		<div class="wpsg_mod_produktindex_stock">
-		
-			<?php if (($this->view['data']['stock']) > '0') {?>		
-				
-                <label><?php echo __('Lagerbestand', 'wpsg'); ?></label>
-                <?php echo wpsg_translate(__('#1# Artikel auf Lager','wpsg'), $this->view['data']['stock']);  ?>
-			
-			<?php } else { ?>
-			 
-			 	<label><?php echo wpsg_translate(__('', 'wpsg')); ?></label>
-			
-			<?php } ?>	
-		
-		</div>
-		<?php } ?>
-		<?php /* Lagerbestand ENDE*/?>
-		
-		<?php /* FÃŒllmengenanzeige START */ ?>
-		<?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$oProduct->getPrice($this->view['data']['product_key']), $this->view['data']['fmenge'], $oProduct->getId()]); ?>
-		<?php /* FÃŒllmengenanzeige ENDE */ ?>
-
-		<?php /* Gewichtsanzeige START */ ?>
-		<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
-		<div class="wpsg_mod_weight_produkt">
-			
-			<?php if (($this->view['data']['weight']) > '0') { ?>
-				<span class="label label_weight"><?php echo wpsg_translate(__('Gewicht:', 'wpsg')); ?></span>
-				<?php echo wpsg_translate(__('#1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
-			<?php } else { ?>
-				<label><?php wpsg_translate(__('', 'wpsg'))?></label>
-			<?php } ?>
-		</div>
-		<?php } ?>
-		<?php /* Gewichtsanzeige ENDE */ ?>
-
-		<?php /* Lieferzeit Anzeige START */ ?>
-		<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
-
-			<?php /* Produkt nur im Store, nicht im Onlineshop vorhanden */ ?>
-			<?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', array($this->view['data']['product_key']))) { ?>
-	
-				<div class="wpsg_product_only_store"><?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayStoreText', array($this->view['data']['product_key']))); ?></div>
-	
-				<?php $stl = 0; $stl = $this->callMod('wpsg_mod_deliverytime', 'displayStoreLink', array($this->view['data']['product_key'])) ?>
-				<?php if (wpsg_isSizedInt($stl)) { ?>
-					
-					&nbsp;<a href="<?php echo get_permalink($stl); ?>"><?php echo __('So erreichen Sie uns.'); ?></a>
-					
-				<?php } ?>
-	
-			<?php } else { ?>				
-	
-				<?php $strDelayNote = $this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', array($this->view['data']['product_key'])); ?>
-				<?php if (wpsg_isSizedString($strDelayNote)) { ?>
-						
-					<div class="wpsg_mod_deliverytime_offline">
-					
-						<div class="wpsg_mod_deliverytime_delay"><?php echo wpsg_hspc($strDelayNote); ?></div>
-					
-					</div>
-						
-				<?php } else { ?>
-				
-				<div class="wpsg_mod_deliverytime">
-					<span class="label label_deliverytime"><?php echo wpsg_translate(__('Lieferzeit:', 'wpsg')); ?></span>
-					<?php echo $this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', array($this->view['data']['product_key'])); ?>
-				</div>	
-						
-				<?php } ?>
-	
-			<?php } ?>
-			
-		<?php } ?>
-		<?php /* Lieferzeit Anzeige ENDE */ ?>
-
-		<?php /* Produktkurzbeschreibung START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
-			<div class="wpsg_product_information_short">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_shortdescription">
-						<span><?php echo $this->view['data']['beschreibung']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* Produktkurzbeschreibung ENDE */ ?>
-
-		<?php /* Varianten START */ ?>
-		<div class="wpsg_produkt_varianten">
-			<?php echo $this->callMod('wpsg_mod_productvariants', 'renderTemplate', array($this->view['data']['product_key'])); ?>
-		</div>
-		<?php /* Varianten ENDE */ ?>
-		
-		<?php $this->callMods('product_bottom', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
-		
-		
-		<div class="wpsg_product_buttonarea">
-			<div class="wpsg_product_buttons_add_basket">
-				<?php if ($this->view['oProduct']->canOrder()) { ?>
-				<div class="wpsg_produkt_add_basket_wrapper">
-
-					<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
-
-					<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
-							
-					<?php /* Urlaubsmodus aktiv */ ?>
-					<?php if ($this->hasMod('wpsg_mod_deliverytime') && ($this->get_option('wpsg_mod_deliverytime_holiday') == '1')) { ?>
-						
-						<?php if ($this->callMod('wpsg_mod_deliverytime', 'holiday', array($this->view['data']['product_key']))) { ?>
-						
-							<div class="wpsg_product_deliverytime_holiday" style="height:50px; padding:10px; width:50%; float:right; border:1px solid #ff0000;">
-																													
-								<?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayHolidaytext', array($this->view['data']['product_key']))); ?>
-								
-							</div>					
-					
-						<?php } ?>
-							
-					<?php } else {?>
-					
-						<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
-					
-					<?php } ?>
-					
-					<?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
-					<script type="text/javascript">
-
-						jQuery(document).ready(function() {
-
-							jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').bind('click', function() {
-
-								wpsg_blockProductTemplate(<?php echo $this->getTemplateIndex(); ?>);
-
-								jQuery.ajax( {
-									url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
-									data:
-									{
-										'wpsg_form_data': jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
-										'wpsg[ajax]': '1',
-										'wpsg[submit]': '1'
-									},
-									success: function(data)
-									{
-
-                                        wpsg_refreshBasketWidget();
-
-										<?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
-										tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=500');
-										<?php } else { ?>
-
-										wpsg_unblockProductTemplate(<?php echo $this->getTemplateIndex(); ?>);
-										jQuery('body').append(data);
-
-										<?php } ?>
-
-									}
-								} );
-
-								return false;
-
-							} );
-
-						} );
-
-					</script>
-					<?php } ?>
-
-				</div>
-				<?php } ?>
-			</div>
-		</div>
-
-		<div class="wpsg_clear"></div>
-
-		<?php if ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id']))) { ?>
-			<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
-			<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
-		
-			<input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
-		<?php } ?>
-
-		<?php /* Produktlangbeschreibung START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['longdescription'])) > 0) { ?>
-			<div class="wpsg_product_information_large">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_longdescription">
-						<span><?php echo $this->view['data']['longdescription']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* Produktlangbeschreibung ENDE */ ?>
-		
-		<?php /* zusÃ€tzliche Informationen START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['moreinfos'])) > 0) { ?>
-			<div class="wpsg_product_information_large">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_moreinfos">
-						<span><?php echo $this->view['data']['moreinfos']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* zusÃ€tzliche Informationen ENDE */ ?>
-		
-		<?php /* zusÃ€tzliche Lieferumfang START */ ?>
-		<div class="wpsg_product_informationarea">
-
-			<?php if (strlen(trim($this->view['data']['moreinfos2'])) > 0) { ?>
-			<div class="wpsg_product_information_large">
-				<div class="wpsg_produkt_additional_information">
-					<div itemprop="description" class="wpsg_produkt_moreinfos2">
-						<span><?php echo $this->view['data']['moreinfos2']; ?></span>
-					</div>
-				</div>
-			</div>
-			<?php } ?>
-
-		</div>
-		<?php /* zusÃ€tzliche Lieferumfang ENDE */ ?>
-
-		<div class="wpsg_clear"></div>
-
-		<?php /* Social Media Integration */ ?>
-		<div class="wpsg_product_social_media">
-			<?php if (is_plugin_active('plugin-directory/shariff.php')) {?>
-				<?php echo do_shortcode('[shariff]')?>
-			<?php } ?>
-		</div>
-
+				
 	</div>
-	
-	<script>
-		
-		jQuery('.wpsg_produkt_wrapper2 .wpsg_gallery_wrap .bigimgswitch').on('click', function() {
-			
-			var jqThis = jQuery(this);
-
-			jqThis.closest('.wpsg_produkt_wrapper2').find('.bigimg').hide();
-			jqThis.closest('.wpsg_produkt_wrapper2').find('.bigimg[data-index="' + jqThis.data("target") + '"]').show();
-			 
-			return false;
-			
-		});
-		
-	</script>
-
-	<?php $this->callMods('product_bottom_end', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
 	
 </div>
+
Index: ews/produkttemplates/standard3.phtml
===================================================================
--- /views/produkttemplates/standard3.phtml	(revision 8528)
+++ 	(revision )
@@ -1,536 +1,0 @@
-<?php
-
-	/*
-	 * Template fÃŒr das Produkt im Frontend Layout 3
-	 */
-
-	/** @var wpsg_product $oProduct */
-	$oProduct = $this->view['oProduct'];
-
-    $arAttachmentIDsAll = $this->imagehandler->getAttachmentIDs($this->view['data']['product_id']);
-	$arAttachmentID = $this->imagehandler->getAttachmentID($this->view['data']['product_key']);
-	$arAttachmentIndex = 0;
-	
-	foreach ($arAttachmentIDsAll as $k => $v) if (intval($v) === intval($arAttachmentID)) $arAttachmentIndex = $k;
-	
-?>
-
-<div class="wpsg_produkt_wrapper layout3">
-
-    <input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" />
-	<input type="hidden" name="titleDisplayed" value="<?php echo $this->titleDisplayed; ?>" />
-	<input type="hidden" name="wpsg[template]" value="standard3.phtml" />
-
-    <div class="col_wrap">
-        <div class="col image">
-            <div class="thumbnails">
-
-                <?php foreach ($arAttachmentIDsAll as $k => $image_id) { ?>
-
-                    <?php echo \wp_get_attachment_image($image_id, 'small', false, [
-                        'data-index' => $k
-                    ]); ?>
-
-                <?php } ?>
-
-            </div>
-            <div class="view">
-                <?php foreach ($arAttachmentIDsAll as $k => $image_id) { ?>
-                    <a class="" id="<?php echo $this->getTemplateIndex(); ?>_<?php echo $k; ?>" data-fslightbox="<?php echo $this->getTemplateIndex(); ?>" href="<?php echo \wp_get_attachment_image_src($image_id, 'full')[0]; ?>"></a>
-                <?php } ?>
-                <div class="wpsg_product_slider">
-
-                    <?php foreach ($arAttachmentIDsAll as $k => $image_id) { ?>
-
-                        <div>
-                            <div class="ds_image_zoom" data-image-index="<?php echo $k; ?>"
-                                onclick="document.getElementById('<?php echo $this->getTemplateIndex(); ?>_<?php echo $k; ?>').click();"
-                            >
-                                <?php echo \wp_get_attachment_image($image_id, 'full', false, [
-                                    'data-index' => $k,
-                                    'data-src' => \wp_get_attachment_image_src($image_id, 'full')[0]
-                                ]); ?>
-                            </div>
-                        </div>
-
-                    <?php } ?>
-
-                </div>
-            </div>
-        </div>
-        <div>
-
-            <?php if (!$this->titleDisplayed) { ?>
-                <h1 itemprop="name" class="wpsg_producttitle"><?php echo $this->getProductName($this->view['data']['id']); ?></h1>
-                <h2 itemprop="detailname" class="wpsg_productdetailtitle"><?php echo $this->view['data']['detailname']; ?></h2>
-            <?php } ?>
-
-            <?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
-
-            <?php $this->callMods('product_top', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
-
-            <div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
-
-                <?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
-                    <div class="wpsg_artikelnummer">
-                        <?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
-					</div>
-				<?php } ?>
-				
-				<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
-				<?php if (sizeof($arProductCodes) > 0) { ?>
-					<div class="product_code_wrap">
-					<?php foreach ($arProductCodes as $product_code) { ?>
-						<?php if ($product_code !== null) { ?>
-							
-							<div class="product_code <?php echo $product_code['code_key']; ?>">
-								<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
-							</div>
-							
-						<?php } ?>
-					<?php } ?>
-					</div>
-				<?php } ?>
-
-                <?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt START*/ ?>
-                <?php if ($this->view['oProduct']->canDisplayPrice()) { ?>
-
-                    <div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
-
-                        <meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
-
-                        <?php echo __('StÃŒckpreis:', 'wpsg'); ?>
-
-                        <?php $oldPrice = $this->view['oProduct']->getOldPrice();  ?>
-
-                        <?php if ($oldPrice !== false && $oldPrice != $this->view['oProduct']->getPrice($this->view['data']['product_key'])) { ?>
-                            <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-                            <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
-                        <?php } else { ?>
-                            <span class="wpsg_mod_productview_price"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
-                        <?php } ?>
-
-                    </div>
-
-                    <?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
-
-                        <div class="wpsg_produkt_preishinweis">
-                            <?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
-                        </div>
-
-                    <?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
-
-                        <div class="wpsg_produkt_preishinweis">
-                            <?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
-                                <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */?>
-
-                                    <?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
-                                        <?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und <a href="#3#">ab #2# â¬ versandkostenfrei</a>)', 'wpsg'),
-                                            wpsg_ff($this->view['data']['mwst_value']),
-                                            wpsg_ff($this->get_option('wpsg_mod_freeshipping_minvalue')),
-                                            $this->getUrl(wpsg_ShopController::URL_VERSANDKOSTEN)
-                                        ); ?>
-                                    <?php } else { ?>
-                                        <?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und versandkostenfrei)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value'])); ?>
-                                    <?php } ?>
-
-                                <?php } else { ?>
-                                    <?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-                                <?php }?>
-                            <?php } else { /* Frontend = BRUTTO Preise */ ?>
-                                <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */ ?>
-
-                                    <?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
-                                        <?php echo wpsg_translate(__('(inkl. #1#% MwSt. und <a href="#3#">ab #2# â¬ versandkostenfrei</a>)', 'wpsg'),
-                                            wpsg_ff($this->view['data']['mwst_value']),
-                                            wpsg_ff($this->get_option('wpsg_mod_freeshipping_minvalue')),
-                                            $this->getUrl(wpsg_ShopController::URL_VERSANDKOSTEN)
-                                        ); ?>
-                                    <?php } else { ?>
-                                        <?php echo wpsg_translate(__('(inkl. #1#% MwSt. und versandkostenfrei)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value'])); ?>
-                                    <?php } ?>
-
-                                <?php } else { ?>
-                                    <?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
-                                <?php }?>
-                            <?php } ?>
-                        </div>
-
-                    <?php } ?>
-
-                <?php } else {?>
-
-                    <?php echo wpsg_translate(__('Die Produktpreise werden nur eingeloggten Benutzern angezeigt. Loggen Sie sich <a href="'.$this->getURL(wpsg_ShopController::URL_PROFIL).'">hier</a> bitte ein, um zu bestellen.')); ?>
-
-                <?php }?>
-                <?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt ENDE */ ?>
-
-                <div class="wpsg_clear"></div>
-
-                <div itemprop="description" class="wpsg_produkt_shortdescription">
-
-                    <span><?php echo $this->view['data']['shortdesc']; ?></span>
-
-                </div>
-
-                <?php /* Lagerbestand START*/?>
-                <?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProduct') == '1') { ?>
-
-                <div class="wpsg_mod_produktindex_stock">
-
-                    <?php if (($this->view['data']['stock']) > '0') {?>
-
-                        <label><?php echo __('Lagerbestand', 'wpsg'); ?></label>
-                        <?php echo wpsg_translate(__('#1# Artikel auf Lager','wpsg'), $this->view['data']['stock']);  ?>
-
-                    <?php } else { ?>
-
-                        <label><?php echo wpsg_translate(__('', 'wpsg')); ?></label>
-
-                    <?php } ?>
-
-                </div>
-                <?php } ?>
-                <?php /* Lagerbestand ENDE*/?>
-
-                <?php /* FÃŒllmengenanzeige START */ ?>
-                <?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$oProduct->getPrice($this->view['data']['product_key']), $this->view['data']['fmenge']??0, $oProduct->getId()]); ?>
-                <?php /* FÃŒllmengenanzeige ENDE */ ?>
-
-                <?php /* Gewichtsanzeige START */ ?>
-                <?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
-                <div class="wpsg_mod_weight_produkt">
-
-                    <?php if (($this->view['data']['weight']) > '0') { ?>
-                        <span class="label label_weight"><?php echo wpsg_translate(__('Gewicht:', 'wpsg')); ?></span>
-                        <?php echo wpsg_translate(__('#1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
-                    <?php } else { ?>
-                        <label><?php wpsg_translate(__('', 'wpsg'))?></label>
-                    <?php } ?>
-                </div>
-                <?php } ?>
-                <?php /* Gewichtsanzeige ENDE */ ?>
-
-                <?php /* Lieferzeit Anzeige START */ ?>
-                <?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
-
-                    <?php /* Produkt nur im Store, nicht im Onlineshop vorhanden */ ?>
-                    <?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', array($this->view['data']['product_key']))) { ?>
-
-                        <div class="wpsg_product_only_store"><?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayStoreText', array($this->view['data']['product_key']))); ?></div>
-
-                        <?php $stl = 0; $stl = $this->callMod('wpsg_mod_deliverytime', 'displayStoreLink', array($this->view['data']['product_key'])) ?>
-                        <?php if (wpsg_isSizedInt($stl)) { ?>
-
-                            &nbsp;<a href="<?php echo get_permalink($stl); ?>"><?php echo __('So erreichen Sie uns.'); ?></a>
-
-                        <?php } ?>
-
-                    <?php } else { ?>
-
-                        <?php $strDelayNote = $this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', array($this->view['data']['product_key'])); ?>
-                        <?php if (wpsg_isSizedString($strDelayNote)) { ?>
-
-                            <div class="wpsg_mod_deliverytime_offline">
-
-                                <div class="wpsg_mod_deliverytime_delay"><?php echo wpsg_hspc($strDelayNote); ?></div>
-
-                            </div>
-
-                        <?php } else { ?>
-
-                        <div class="wpsg_mod_deliverytime">
-                            <span class="label label_deliverytime"><?php echo wpsg_translate(__('Lieferzeit:', 'wpsg')); ?></span>
-                            <?php echo $this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', array($this->view['data']['product_key'])); ?>
-                        </div>
-
-                        <?php } ?>
-
-                    <?php } ?>
-
-                <?php } ?>
-                <?php /* Lieferzeit Anzeige ENDE */ ?>
-
-                <?php /* Produktkurzbeschreibung START */ ?>
-                <div class="wpsg_product_informationarea">
-
-                    <?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
-                    <div class="wpsg_product_information_short">
-                        <div class="wpsg_produkt_additional_information">
-                            <div itemprop="description" class="wpsg_produkt_shortdescription">
-                                <span><?php echo $this->view['data']['beschreibung']; ?></span>
-                            </div>
-                        </div>
-                    </div>
-                    <?php } ?>
-
-                </div>
-                <?php /* Produktkurzbeschreibung ENDE */ ?>
-
-                <?php /* Varianten START */ ?>
-                <div class="wpsg_produkt_varianten">
-                    <?php echo $this->callMod('wpsg_mod_productvariants', 'renderTemplate', array($this->view['data']['product_key'])); ?>
-                </div>
-                <?php /* Varianten ENDE */ ?>
-
-                <?php $this->callMods('product_bottom', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
-
-
-                <div class="wpsg_product_buttonarea">
-                    <div class="wpsg_product_buttons_add_basket">
-                        <?php if ($this->view['oProduct']->canOrder()) { ?>
-                        <div class="wpsg_produkt_add_basket_wrapper">
-
-                            <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
-
-                            <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
-
-                            <?php /* Urlaubsmodus aktiv */ ?>
-                            <?php if ($this->hasMod('wpsg_mod_deliverytime') && ($this->get_option('wpsg_mod_deliverytime_holiday') == '1')) { ?>
-
-                                <?php if ($this->callMod('wpsg_mod_deliverytime', 'holiday', array($this->view['data']['product_key']))) { ?>
-
-                                    <div class="wpsg_product_deliverytime_holiday" style="height:50px; padding:10px; width:50%; float:right; border:1px solid #ff0000;">
-
-                                        <?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayHolidaytext', array($this->view['data']['product_key']))); ?>
-
-                                    </div>
-
-                                <?php } ?>
-
-                            <?php } else {?>
-
-                                <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
-
-                            <?php } ?>
-
-                            <?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
-                            <script type="text/javascript">
-
-                                jQuery(document).ready(function() {
-
-                                    jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').bind('click', function() {
-
-                                        wpsg_blockProductTemplate(<?php echo $this->getTemplateIndex(); ?>);
-
-                                        jQuery.ajax( {
-                                            url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
-                                            data:
-                                            {
-                                                'wpsg_form_data': jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
-                                                'wpsg[ajax]': '1',
-                                                'wpsg[submit]': '1'
-                                            },
-                                            success: function(data)
-                                            {
-
-                                                wpsg_refreshBasketWidget();
-
-                                                <?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
-                                                tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=500');
-                                                <?php } else { ?>
-
-                                                wpsg_unblockProductTemplate(<?php echo $this->getTemplateIndex(); ?>);
-                                                jQuery('body').append(data);
-
-                                                <?php } ?>
-
-                                            }
-                                        } );
-
-                                        return false;
-
-                                    } );
-
-                                } );
-
-                            </script>
-                            <?php } ?>
-
-                        </div>
-                        <?php } ?>
-                    </div>
-                </div>
-
-                <div class="wpsg_clear"></div>
-
-                <?php if ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id']))) { ?>
-                    <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
-                    <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
-
-                    <input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
-                <?php } ?>
-
-                <?php /* Produktlangbeschreibung START */ ?>
-                <div class="wpsg_product_informationarea">
-
-                    <?php if (strlen(trim($this->view['data']['longdescription'])) > 0) { ?>
-                    <div class="wpsg_product_information_large">
-                        <div class="wpsg_produkt_additional_information">
-                            <div itemprop="description" class="wpsg_produkt_longdescription">
-                                <span><?php echo $this->view['data']['longdescription']; ?></span>
-                            </div>
-                        </div>
-                    </div>
-                    <?php } ?>
-
-                </div>
-                <?php /* Produktlangbeschreibung ENDE */ ?>
-
-                <?php /* zusÃ€tzliche Informationen START */ ?>
-                <div class="wpsg_product_informationarea">
-
-                    <?php if (strlen(trim($this->view['data']['moreinfos'])) > 0) { ?>
-                    <div class="wpsg_product_information_large">
-                        <div class="wpsg_produkt_additional_information">
-                            <div itemprop="description" class="wpsg_produkt_moreinfos">
-                                <span><?php echo $this->view['data']['moreinfos']; ?></span>
-                            </div>
-                        </div>
-                    </div>
-                    <?php } ?>
-
-                </div>
-                <?php /* zusÃ€tzliche Informationen ENDE */ ?>
-
-                <?php /* zusÃ€tzliche Lieferumfang START */ ?>
-                <div class="wpsg_product_informationarea">
-
-                    <?php if (strlen(trim($this->view['data']['moreinfos2'])) > 0) { ?>
-                    <div class="wpsg_product_information_large">
-                        <div class="wpsg_produkt_additional_information">
-                            <div itemprop="description" class="wpsg_produkt_moreinfos2">
-                                <span><?php echo $this->view['data']['moreinfos2']; ?></span>
-                            </div>
-                        </div>
-                    </div>
-                    <?php } ?>
-
-                </div>
-                <?php /* zusÃ€tzliche Lieferumfang ENDE */ ?>
-
-                <div class="wpsg_clear"></div>
-
-                <?php /* Social Media Integration */ ?>
-                <div class="wpsg_product_social_media">
-                    <?php if (is_plugin_active('plugin-directory/shariff.php')) {?>
-                        <?php echo do_shortcode('[shariff]')?>
-                    <?php } ?>
-                </div>
-
-            </div>
-
-        </div>
-    </div>
-
-    <?php if ($this->getTemplateIndex() === 1) { ?>
-
-        <link rel="stylesheet" href="<?php echo $this->getRessourceURL('css/tiny-slider.-2.9.4.min.css'); ?>">
-
-        <style>
-
-            .wpsg_produkt_wrapper.layout3 .col_wrap { display:flex; width:100%; justify-content:stretch; gap:1rem; flex-wrap:wrap; }
-            .wpsg_produkt_wrapper.layout3 .col_wrap > * { flex-grow:1; flex-shrink:0; width:100%; }
-            .wpsg_produkt_wrapper.layout3 .col_wrap > .col.image { display:flex; justify-content:stretch; gap:0.5rem; }
-            .wpsg_produkt_wrapper.layout3 .col_wrap > .col.image .thumbnails { width:20%; flex-shrink:0; }
-            .wpsg_produkt_wrapper.layout3 .col_wrap > .col.image .thumbnails img { aspect-ratio: 1 / 1; object-fit:cover; object-position:50% 50%; }
-            .wpsg_produkt_wrapper img { max-width:100%; height:auto; }
-
-            .ds_image_zoom.attached { position:relative; overflow:hidden; cursor:-webkit-zoom-in; cursor:zoom-in; }
-            .ds_image_zoom.attached img { all:initial; position:absolute; left:0; top:0; /* transition:width 0.3s, height 0.3s, left 0.3s, top 0.3s; */ }
-
-            @media screen and (min-width:993px) {
-
-                .wpsg_produkt_wrapper.layout3 .col_wrap { flex-wrap:nowrap; }
-                .wpsg_produkt_wrapper.layout3 .col_wrap > * { width:0; }
-
-            }
-
-        </style>
-
-    <?php } ?>
-
-    <?php if ($this->getTemplateIndex() === 1 && ($_REQUEST['action']??'') !== 'wpsg_productvariants_switch') { ?>
-
-        <script src="<?php echo $this->getRessourceURL('js/tiny-slider-2.9.2.min.js'); ?>"></script>
-        <script src="<?php echo $this->getRessourceURL('js/dsimagezoom.min.js'); ?>"></script>
-
-    <?php } ?>
-
-    <script>
-
-        if (!wpsg_standard3_slider) { var wpsg_standard3_slider = {}; }
-
-        if (!wpsg_standard3_load) {
-
-            function wpsg_standard3_load(templateIndex, imageIndex) {
-
-                if (wpsg_standard3_slider[templateIndex]) {
-
-                    wpsg_standard3_slider[templateIndex] = wpsg_standard3_slider[templateIndex].rebuild();
-
-                } else {
-
-                    wpsg_standard3_slider[templateIndex] = tns({
-                        container: '#wpsg_produktform_' + templateIndex + ' .wpsg_product_slider',
-                        items: 1,
-                        slideBy: 1,
-                        controls: false,
-                        autoplayButton: false,
-                        nav: false,
-                        arrowKeys: false,
-                        autoplayButtonOutput: false,
-                        autoplay: false,
-                        autoHeight: true,
-                        onInit: () => {
-
-                        }
-                    });
-
-                }
-
-                wpsg_standard3_slider[templateIndex].events.on('transitionEnd', (event) => {
-
-                    DsImageZoom.init(document.querySelectorAll('#wpsg_produktform_' + templateIndex + ' .tns-slide-active .ds_image_zoom'));
-
-                });
-
-                wpsg_standard3_slider[templateIndex].events.on('transitionStart', (event) => {
-
-                    DsImageZoom.destroy(document.querySelectorAll('#wpsg_produktform_' + templateIndex + ' .tns-item .ds_image_zoom'));
-
-                });
-
-                for (const el_tn of document.querySelectorAll('#wpsg_produktform_' + templateIndex + ' .wpsg_produkt_wrapper.layout3 .thumbnails img')) {
-
-                    el_tn.addEventListener('click', (event) => {
-
-                        wpsg_standard3_slider[templateIndex].goTo(el_tn.getAttribute('data-index'));
-
-                    });
-
-                }
-
-                wpsg_standard3_slider[templateIndex].goTo(imageIndex);
-
-            };
-
-        };
-
-        window.addEventListener('load', () => { wpsg_standard3_load(<?php echo $this->getTemplateIndex(); ?>, <?php echo $arAttachmentIndex; ?>); });
-
-        <?php if (($_REQUEST['action']??'') === 'wpsg_productvariants_switch') { ?>
-
-            window.setTimeout(() => {
-
-                wpsg_standard3_load(<?php echo $this->getTemplateIndex(); ?>, <?php echo $arAttachmentIndex; ?>);
-
-            }, 100);
-
-        <?php } ?>
-
-    </script>
-
-	<?php $this->callMods('product_bottom_end', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
-	
-</div>
Index: /views/produkttemplates/standard_1544.phtml
===================================================================
--- /views/produkttemplates/standard_1544.phtml	(revision 5261)
+++ /views/produkttemplates/standard_1544.phtml	(revision 5261)
@@ -0,0 +1,435 @@
+<?php
+
+	/*
+	 * Template fÃŒr das Produkt im Frontend
+	 */
+
+	//Ausgabe der verfÃŒgbaren Variablen
+	//wpsg_debug($_SESSION);
+	//wpsg_debug($this->view['data']['stock']);
+
+	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
+	//$this->noReleatedProducts = true; 
+
+?>
+<div class="wpsg_produkt_wrapper">
+	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
+				
+		<div class="wpsg_product_afterimage">
+	
+			<h2 itemprop="name" class="wpsg_producttitle"><?php echo wpsg_hspc($this->view['data']['name']); ?></h2>
+	
+			<?php /* Block fÃŒr die Produktbilder START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+			<div class="wpsg_produkt_produktbilder">
+				<?php if (sizeof($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])))) { ?>
+				<?php $i = 0; foreach ($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])) as $b) { $i ++; ?>
+				<?php if ($i == 1) { ?>
+				<div class="wpsg_produkt_preview wpsg_pb_pic">		
+					<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $i, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'), 'pimage')); ?>
+					<?php /*<img itemprop="image" id="wpsg_mainimage_<?php echo $this->getTemplateIndex(); ?>" src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="" />*/?>				
+				</div>
+				<?php } else { ?>
+				<div class="wpsg_pb_pic" style="display:none;">
+					<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $i, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'), 'pimage')); ?>
+				</div>
+				<?php } ?>
+				<?php } ?>
+				<?php } ?>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php } ?>
+			<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+			
+			<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
+			<div class="wpsg_artikelnummer"> 
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			<?php } ?>
+		
+			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
+				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+				<span itemprop="price" class="preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>"><?php echo wpsg_ff($this->view['data']['preis']); ?></span> <?php echo $this->get_option('wpsg_currency'); ?><?php if (wpsg_isSizedString($this->view['data']['price_info'])) { echo '<div class="wpsg_priceinfo">'.wpsg_hspc($this->view['data']['price_info']).'</div>'; } ?>
+			</div>		
+			
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
+				<div class="wpsg_produkt_preishinweis">
+					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+				</div>
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					'<span id="fmenge_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['fmenge'], '', true).'</span> '.$this->view['data']['feinheit'],
+					'<span id="fmenge_gpreis_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['fmenge_preis']).'</span> '. $this->get_option('wpsg_currency'),
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+								
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+						
+			<?php /* Lieferzeit Anzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
+				
+				<div class="wpsg_mod_deliverytime">
+					<?php echo wpsg_translate(__('Lieferzeit: #1#', 'wpsg'), $this->callMod('wpsg_mod_deliverytime', 'getProductDeliveryTime', array($this->view['data']['id']))); ?>					
+				</div>
+				
+			<?php } ?>
+			<?php /* Lieferzeit Anzeige ENDE */ ?> 
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten"><?php 
+			 
+				// Damit sind werden die zusÃ€tzlichen Varianten ins View geladen, die Ausgabe erfolgt aber direkt hier im Template
+				$this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['id']));
+
+				$arVarianten = @unserialize($this->view['data']['mod_varianten']);
+				
+			?>
+			<script type="text/javascript">/* <![CDATA[ */
+
+				<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+				var wpsg_mod_fuellmenge_reference = <?php echo ((wpsg_isSizedInt($this->get_option('wpsg_mod_fuellmenge_bezug')))?$this->get_option('wpsg_mod_fuellmenge_bezug'):'0'); ?>;
+				<?php } ?>
+			
+				<?php if (wpsg_isSizedArray($arVarianten)) { ?>
+			
+				var arVarianten<?php echo $this->view['data']['id']; ?> = jQuery.parseJSON('<?php echo json_encode($arVarianten); ?>');
+				
+				jQuery(document).ready(function() {
+						
+					jQuery('.wpsg_vp_field_<?php echo $this->view['data']['id']; ?> select').bind('change', function() {
+						
+						var var_id = jQuery(this).attr("name").replace(/wpsg_vp\[/, '').replace(/\]/, '');
+									
+						jQuery('.wpsg_produkt_<?php echo $this->view['data']['id']; ?> .wpsg_anr').text(arVarianten<?php echo $this->view['data']['id']; ?>[var_id]['vari'][jQuery(this).val()]['artnr']);
+						
+					} );
+			
+					jQuery('.wpsg_vp_field_<?php echo $this->view['data']['id']; ?> input[type="radio"]').bind('click', function() {
+						
+						var var_id = jQuery(this).attr("name").replace(/wpsg_vp\[/, '').replace(/\]/, '');
+									
+						jQuery('.wpsg_produkt_<?php echo $this->view['data']['id']; ?> .wpsg_anr').text(arVarianten<?php echo $this->view['data']['id']; ?>[var_id]['vari'][jQuery(this).val()]['artnr']);
+						
+					} );
+			
+					//jQuery('.wpsg_vp_field_<?php echo $this->view['data']['id']; ?> input[type="radio"]:checked').click();
+					
+				} ); 
+				
+				<?php } ?>
+			
+				wpsg_vp[<?php echo $this->view['data']['id']; ?>] = new Array();
+				wpsg_vp_gp[<?php echo $this->view['data']['id']; ?>] = <?php echo $this->view['data']['preis']; ?>;	
+				wpsg_vp_vari[<?php echo $this->view['data']['id']; ?>] = new Array();
+				
+				<?php if (isset($this->view['data']['preis_original'])) { /* Rabattierter Originalpreis */ ?>
+				wpsg_vp_original[<?php echo $this->view['data']['id']; ?>] = new Array();
+				wpsg_vp_gp_original[<?php echo $this->view['data']['id']; ?>] = <?php echo $this->view['data']['preis_original']; ?>;
+				<?php } ?>
+			
+				<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+				wpsg_wg[<?php echo $this->view['data']['id']; ?>] = new Array();
+				wpsg_vp_gw[<?php echo $this->view['data']['id']; ?>] = <?php echo (($this->view['data']['weight'] != "")?$this->view['data']['weight']:'0'); ?>;
+				<?php } ?>
+			
+				<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+				wpsg_fmenge[<?php echo $this->view['data']['id']; ?>] = new Array();
+				wpsg_vp_fmenge[<?php echo $this->view['data']['id']; ?>] = <?php echo (($this->view['data']['fmenge'] != "")?wpsg_tf($this->view['data']['fmenge']):'0'); ?>;
+				<?php } ?>
+				 
+			/* ]]> */</script>
+			
+			<?php $vAktiv = false; if (is_array($this->view['data']['vp_data']) && sizeof($this->view['data']['vp_data']) > 0) { ?>
+				<?php foreach ($this->view['data']['vp_data'] as $k => $var) { if ($var['aktiv'] == "1") { $vAktiv = true; ?>
+				
+				<div class="wpsg_vp_field wpsg_vp_field_<?php echo $this->view['data']['id']; ?>">
+					
+					<script type="text/javascript">
+			
+						wpsg_vp_vari[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = "<?php echo $var['typ']; ?>";			
+						wpsg_vp[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = new Array();
+			
+						<?php if (isset($this->view['data']['preis_original'])) { ?>
+						wpsg_vp_original[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = new Array();
+						<?php } ?>
+						
+						<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+						wpsg_wg[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = new Array();
+						<?php } ?>
+			
+						<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+						wpsg_fmenge[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = new Array();
+						<?php } ?>
+						
+					</script>
+					
+					<?php if ($var['typ'] != 'radio') { ?>
+					<label class="wpsg_vp_field_label" for="wpsg_vpfield_<?php echo $this->view['data']['id']; ?>_<?php echo $k; ?>">
+						<?php echo $var['name']; ?>
+					</label>
+					<?php } else { ?>
+					<!-- <span class="wpsg_vp_field"><?php echo $var['name']; ?>:</span>-->
+					<?php } ?>
+					
+					<div class="wpsg_vp_field_typ_<?php echo $var['typ']; ?>">
+					
+						<?php if ($var['typ'] == "select") { ?>
+						<label>
+						
+							<script type="text/javascript">
+								<?php foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1") { ?>
+									wpsg_vp[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['preis'] != "")?$vari['preis']:'0'); ?>;
+				
+									<?php if (isset($vari['preis_original'])) { ?>							
+									wpsg_vp_original[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['preis_original'] != "")?$vari['preis_original']:'0'); ?>;
+									<?php } ?>
+									
+									<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+									wpsg_wg[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['weight'] != "")?$vari['weight']:'0'); ?>;
+									<?php } ?>
+			
+									<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+									wpsg_fmenge[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['fmenge'] != "")?wpsg_tf($vari['fmenge']):'0'); ?>;
+									<?php } ?>					
+								<?php } } ?>
+							</script>
+						
+							<select onchange="wpsg_vp_switch(<?php echo $this->view['data']['id']; ?>); wpsg_showpic_switch(this);" name="wpsg_vp[<?php echo $k; ?>]" id="wpsg_vpfield_<?php echo $this->view['data']['id']?>_<?php echo $k; ?>">
+								<?php foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && (!$this->hasMod('wpsg_mod_stock') || $vari['stock'] > 0)) { ?>
+								<option value="<?php echo $kv; ?>">						
+									<?php echo $vari['name']; ?>
+									<?php if ($this->callMod('wpsg_mod_varianten', 'showVariPrice', array($vari['preis']))) { ?>
+									(<?php echo wpsg_ff($vari['preis'], $this->get_option('wpsg_currency')); ?>)
+									<?php } ?>
+								</option>
+								<?php } } ?>
+							</select> 
+							<?php if ($this->get_option("wpsg_vp_showpic") == "1") { ?>
+							<span class="wpsg_vp_field_image">
+								<?php $first = true; foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && isset($vari['showpic'])) { ?>
+								<span class="wpsg_vp_image wpsg_vp_image_<?php echo $kv; ?>" style="display:<?php echo (($first)?'block':'none'); ?>;">
+									<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $vari['showpic'], $this->get_option("wpsg_vp_showpic_width"), $this->get_option("wpsg_vp_showpic_height"), 's')); ?>
+								</span>
+								<?php $first = false; } } ?>
+							</span>
+							<?php } ?>		
+						</label>
+						<?php } ?>
+						
+						<?php if ($var['typ'] == "radio") { ?>
+						<?php $j = 0; foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && (!$this->hasMod('wpsg_mod_stock') || $vari['stock'] > 0)) { $j ++; ?>
+						<script type="text/javascript">
+			
+							wpsg_vp[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['preis'] != "")?$vari['preis']:'0'); ?>;
+			
+							<?php if (isset($vari['preis_original'])) { ?>
+							wpsg_vp_original[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['preis_original'] != "")?$vari['preis_original']:'0'); ?>;
+							<?php } ?>
+							
+							<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+							wpsg_wg[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['weight'] != "")?$vari['weight']:'0'); ?>;
+							<?php } ?>
+			
+							<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+							wpsg_fmenge[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['fmenge'] != "")?wpsg_tf($vari['fmenge']):'0'); ?>;
+							<?php } ?>
+							
+						</script>
+						<?php } } ?>
+						<?php $arVariGroup = array(); $j = 0; foreach ($var['vari'] as $kv => $vari) { if ($vari['aktiv'] == "1" && (!$this->hasMod('wpsg_mod_stock') || $vari['stock'] > 0)) { $j ++; ?>
+						<?php 
+							
+							// Gruppieren
+							$variCode = wpsg_trim(explode('|', $vari['name']));
+							
+							if (sizeof($variCode) == 2)
+							{
+								
+								$arVariGroup[$variCode[0]][] = array('kv' => $kv, 'j' => $j, 'name' => $variCode[1], 'vari' => $vari);
+								
+							}
+							else
+							{
+								
+								$arVariGroup[0][] = array('kv' => $kv, 'j' => $j, 'name' => $variCode[0], 'vari' => $vari);
+								
+							}
+							
+						?>
+						<?php } } ?>	
+								
+						<?php foreach ($arVariGroup as $vg_name => $vg) { ?>
+						<div class="vari_group" style="clear:both;">
+							<?php if (wpsg_isSizedString($vg_name)) { ?>		
+							<div class="vari_groupname"><?php echo __($vg_name, 'wpsg'); ?></div>
+							<?php } else { ?>
+							<br />
+							<?php } ?>
+							<div class="vari_group_select">								
+								<?php foreach ($vg as $group_vari) { $vari = $group_vari['vari']; ?>
+								<label>
+									<input id="wpsg_vpfield_<?php echo $this->view['data']['id']; ?>_<?php echo $k; ?>_<?php echo $group_vari['j']; ?>" <?php echo (($group_vari['j'] == 1)?'checked="checked"':''); ?> onclick="wpsg_vp_switch(<?php echo $this->view['data']['id']; ?>);" type="radio" name="wpsg_vp[<?php echo $k; ?>]" value="<?php echo $group_vari['kv']; ?>" />&nbsp;<?php echo $group_vari['name']; ?>
+									<?php if ($this->callMod('wpsg_mod_varianten', 'showVariPrice', array($vari['preis']))) { ?>
+									<span class="wpsg_vp_vari_preisinfo">(<?php echo wpsg_ff($vari['preis'], $this->get_option('wpsg_currency')); ?>)</span>
+									<?php } ?>
+									<?php if ($this->get_option("wpsg_vp_showpic") == "1" && $vari['showpic'] != false) { ?>
+									<span class="wpsg_vp_field_image">
+										<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $vari['showpic'], $this->get_option("wpsg_vp_showpic_width"), $this->get_option("wpsg_vp_showpic_height"), 's')); ?>
+									</span>
+									<?php } ?>		
+								</label>
+								<?php } ?>
+							</div>
+						</div>
+						<?php } ?>
+								
+						<?php } ?>
+						
+						<?php if ($var['typ'] == "checkbox" && $var['aktiv'] == 1 && (!$this->hasMod('wpsg_mod_stock') || $var['stock'] > 0)) { ?>
+						<script type="text/javascript">
+						
+							wpsg_vp[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = <?php echo (($var['preis'] != "")?$var['preis']:'0'); ?>;
+			
+							<?php if (isset($vari['preis_original'])) { ?>
+							wpsg_vp_original[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>][<?php echo $kv; ?>] = <?php echo (($vari['preis_original'] != "")?$vari['preis_original']:'0'); ?>;
+							<?php } ?>
+							
+							<?php if ($this->hasMod('wpsg_mod_weight')) { ?>
+							wpsg_wg[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = <?php echo (($var['weight'] != "")?$var['weight']:'0'); ?>;
+							<?php } ?>
+			
+							<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+							wpsg_fmenge[<?php echo $this->view['data']['id']; ?>][<?php echo $k; ?>] = <?php echo (($var['fmenge'] != "")?wpsg_tf($var['fmenge']):'0'); ?>;
+							<?php } ?>
+							
+						</script>
+						<label>
+							<input onchange="wpsg_vp_switch(<?php echo $this->view['data']['id']; ?>);" type="hidden" value="0" name="wpsg_vp[<?php echo $k; ?>]" />
+							<input onchange="wpsg_vp_switch(<?php echo $this->view['data']['id']; ?>);" type="checkbox" value="1" name="wpsg_vp[<?php echo $k; ?>]" />
+							<?php if ($this->callMod('wpsg_mod_varianten', 'showVariPrice', array($var['preis']))) { ?>
+							<span class="wpsg_vp_vari_preisinfo">(<?php echo wpsg_ff($var['preis'], $this->get_option('wpsg_currency')); ?>)</span>
+							<?php } ?>
+							<?php if ($this->get_option("wpsg_vp_showpic") == "1" && $var['showpic'] != false) { ?>
+							<span class="wpsg_vp_field_image">
+								<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $var['showpic'], $this->get_option("wpsg_vp_showpic_width"), $this->get_option("wpsg_vp_showpic_height"), 's')); ?>
+							</span>
+							<?php } ?>
+						</label>
+						<?php } ?>
+												
+					</div>
+					 	
+					<div style="clear:both;"></div>
+				
+				</div>
+				
+				<?php } } ?>
+				
+				<script type="text/javascript">
+			
+					jQuery(document).ready(function() {
+			
+						<?php if ($vAktiv) { ?>
+						wpsg_vp_switch(<?php echo $this->view['data']['id']; ?>);
+						<?php } ?>
+						//jQuery('.wpsg_vp_field select').change();
+			
+					} );
+				
+				</script>
+				
+			<?php } ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>
+					
+			<div class="wpsg_produkt_add_basket_wrapper">	
+				
+				<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?>:</label>
+				
+				<input type="text" value="1" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" />	
+							
+				<?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
+				<script type="text/javascript">
+	
+					jQuery(document).ready(function() { 
+						
+						jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').bind('click', function() {
+				 			 
+							jQuery.ajax( {
+								url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
+								data:
+								{
+									wpsg_form_data: jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
+									'wpsg[ajax]': '1',
+									'wpsg[submit]': '1'					
+								},
+								success: function(data) 
+								{
+									tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=500');
+								}
+							} );	
+							
+							return false;
+							
+						} );
+	
+					} );
+				 
+				</script>
+				<?php } ?>
+				
+			</div>
+					
+			<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+			
+			<div class="wpsg_clear"></div>
+					 	
+			<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+			<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+			<?php /* Facebook und Co Integration ENDE */ ?>
+			
+		</div> 
+		
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
+		</div>
+				
+	</div>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+</div> 
Index: /views/produkttemplates/standard_ajax.phtml
===================================================================
--- /views/produkttemplates/standard_ajax.phtml	(revision 5261)
+++ /views/produkttemplates/standard_ajax.phtml	(revision 5261)
@@ -0,0 +1,196 @@
+<?php
+
+	/*
+	 * Template fÃŒr das Produkt im Frontend
+	 */
+
+	//Ausgabe der verfÃŒgbaren Variablen
+	//wpsg_debug($this->view['data']);
+
+	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
+	//$this->noReleatedProducts = true; 
+
+	//wpsg_debug($_SESSION);
+
+?>
+<div class="wpsg_produkt_wrapper">
+	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
+				
+		<div class="wpsg_product_afterimage">
+	
+			<h2 itemprop="name" class="wpsg_producttitle"><?php echo $this->getProductName($this->view['data']['id']); ?></h2>
+	
+			<?php /* Block fÃŒr die Produktbilder START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+			<div class="wpsg_produkt_produktbilder">
+				<?php if (sizeof($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])))) { ?>
+				<?php $i = 0; foreach ($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])) as $b) { $i ++; ?>
+				<?php if ($i == 1 && !wpsg_isSizedString($this->view['data']['varianten_image']) || $b == $this->view['data']['varianten_image']) { ?>
+				<div class="wpsg_produkt_preview wpsg_pb_pic">	
+					<a class="wpsg_imagelink thickbox" rel="<?php echo $this->view['product_index']; ?>-<?php echo $this->view['data']['id']; ?>" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, 800, 600, $this->get_option('wpsg_mod_produktbilder_mode'))); ?>">
+						<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="<?php echo wpsg_hspc($this->view['data']['name']); ?>" />
+					</a>
+				</div>
+				<?php } else { ?>
+				<div class="wpsg_pb_pic" style="display:none;">
+					<a class="wpsg_imagelink thickbox" rel="<?php echo $this->view['product_index']; ?>-<?php echo $this->view['data']['id']; ?>" href="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, 800, 600, $this->get_option('wpsg_mod_produktbilder_mode'))); ?>">
+						<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="<?php echo wpsg_hspc($this->view['data']['name']); ?>" />
+					</a>
+				</div>
+				<?php } ?>
+				<?php } ?>
+				<?php } ?>
+				<div class="wpsg_clear"></div>
+			</div>
+			<?php } ?>
+			<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+			
+			<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
+			<div class="wpsg_artikelnummer"> 
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			<?php } ?>
+		
+			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>				
+				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+				<span itemprop="price" class="wpsg_preis preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>">
+					<?php echo wpsg_ff($this->view['data']['preis'], $this->get_option('wpsg_currency')); ?>
+				</span> <?php if (wpsg_isSizedString($this->view['data']['price_info'])) { echo '<div class="wpsg_priceinfo">'.wpsg_hspc($this->view['data']['price_info']).'</div>'; } ?>
+				<?php if ($this->hasMod('wpsg_mod_discount') && $this->view['data']['preis_prediscount'] > 0 && wpsg_isSizedInt($this->get_option('wpsg_mod_discount_show'))) { ?>
+				
+			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis new_price">
+            	<?php echo __('Unser Preis: ', 'wpsg'); ?>
+            	<?php } else { } ?>
+				<br /><?php echo __('bisher', 'wpsg'); ?>: <span class="wpsg_preis_prediscount"><?php echo wpsg_ff($this->view['data']['preis_prediscount'], $this->get_option('wpsg_currency')); ?></span>		
+			</div>		
+						
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
+				<div class="wpsg_produkt_preishinweis">
+					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+				</div>
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			 			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					'<span class="wpsg_fmenge">'.wpsg_ff($this->view['data']['fmenge'], '', true).'</span> '.$this->view['data']['feinheit'],
+					'<span class="fmenge_preis">'.wpsg_ff($this->view['data']['fmenge_preis'], $this->get_option('wpsg_currency')).'</span> ',
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+								
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+						
+			<?php /* Lieferzeit Anzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?>
+				
+				<div class="wpsg_mod_deliverytime">
+					<?php echo wpsg_translate(__('Lieferzeit: #1#', 'wpsg'), $this->callMod('wpsg_mod_deliverytime', 'getProductDeliveryTime', array($this->view['data']['id']))); ?>					
+				</div>
+				
+			<?php } ?>
+			<?php /* Lieferzeit Anzeige ENDE */ ?> 
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten">
+			<?php echo $this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['product_key'])); ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>
+					
+			<div class="wpsg_produkt_add_basket_wrapper">	
+				
+				<label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?>:</label>
+				
+				<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" 
+					<?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?>	
+				/>	
+							
+				<?php $ti = $this->getTemplateIndex(); ?>
+<script type="text/javascript">/* <![CDATA[ */
+
+  jQuery(document).ready(function() {
+	
+    jQuery('.wpsg_add_basket_<?php echo $ti; ?>').bind('click', function() {
+				 			 
+      jQuery.ajax( {
+        url: '<?php echo admin_url('admin-ajax.php'); ?>',
+        async: false,
+        data: {
+          form_data: jQuery('#wpsg_produktform_<?php echo $ti; ?>').serialize(),
+          action: 'ds_productadd'			
+        },
+        success: function(data) 
+        {
+	          
+		    jQuery('#wpsg-widget').replaceWith(data);
+
+          alert('<?php echo __('Produkt wurde erfolgreich hinzugefÃŒgt.', 'wpsg'); ?>');
+
+        }
+      } );	
+					
+      return false;
+						
+    } );
+		
+  } );
+
+/* ]]> */</script>
+				
+			</div>
+					
+			<?php if (!$this->hasMod('wpsg_mod_request') || $this->callMod('wpsg_mod_request', 'productForSale', array($this->view['data']['id']))) { ?>
+			<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+			<?php } ?>
+			
+			<?php if ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id']))) { ?> 
+			<input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
+			<?php } ?>
+			
+			<div class="wpsg_clear"></div>
+					 	
+			<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+			<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+			<?php /* Facebook und Co Integration ENDE */ ?>
+			
+		</div> 
+		
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
+		</div>
+				
+	</div>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+</div> 
Index: /views/produkttemplates/standard_login.phtml
===================================================================
--- /views/produkttemplates/standard_login.phtml	(revision 5261)
+++ /views/produkttemplates/standard_login.phtml	(revision 5261)
@@ -0,0 +1,177 @@
+<?php
+
+	/*
+	 * Template fÃŒr das Produkt im Frontend
+	 * zeigt Preise, Menge und Warenkorb Button nur bei Login des Kunden
+	 */
+
+	//Ausgabe der verfÃŒgbaren Variablen
+	//wpsg_debug($_SESSION);
+	//wpsg_debug($this->view['data']['stock']);
+
+	// Damit keine ZubehÃ¶rprodukte ausgegeben werden
+	//$this->noReleatedProducts = true; 
+
+?>
+<div class="wpsg_produkt_wrapper">
+	<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
+	
+		<?php /* Block fÃŒr die Produktbilder START */ ?>
+		<?php if ($this->hasMod('wpsg_mod_produktbilder')) { ?>	
+		<div class="wpsg_produkt_produktbilder">
+			<?php if (sizeof($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])))) { ?>
+			<?php $i = 0; foreach ($this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->view['data']['id'])) as $b) { $i ++; ?>
+			<?php if ($i == 1) { ?>
+			<div class="wpsg_produkt_preview wpsg_pb_pic">		
+				<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $i, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'), 'pimage')); ?>
+				<?php /*<img itemprop="image" id="wpsg_mainimage_<?php echo $this->getTemplateIndex(); ?>" src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->view['data']['id'], $b, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'))); ?>" alt="" />*/?>				
+			</div>
+			<?php } else { ?>
+			<div class="wpsg_pb_pic" style="display:none;">
+				<?php echo $this->callMod('wpsg_mod_produktbilder', 'genBild', array($this->view['data']['id'], $i, $this->get_option('wpsg_mod_produktbilder_width'), $this->get_option('wpsg_mod_produktbilder_height'), $this->get_option('wpsg_mod_produktbilder_mode'), 'pimage')); ?>
+			</div>
+			<?php } ?>
+			<?php } ?>
+			<?php } ?>
+			<div class="wpsg_clear"></div>
+		</div>
+		<?php } ?>
+		<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+	
+		<div class="wpsg_produkt_right">
+		
+			<h1 itemprop="name" class="wpsg_producttitle"><?php echo wpsg_hspc($this->view['data']['name']); ?></h1>
+		
+			<div class="wpsg_artikelnummer">
+				<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span>
+			</div>
+			
+		<!-- Beginn Login abfrage -->
+			<?php if ($this->callMod('wpsg_mod_kundenverwaltung', 'getUserStatus', array($this->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn'))) == true) { ?>
+		<!-- Beginn Login abfrage -->
+			
+			<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
+				<?php echo __('StÃŒckpreis:', 'wpsg'); ?>
+				<meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+				<span itemprop="price" class="preis_<?php echo $this->view['data']['id']; ?>" id="preis_<?php echo $this->view['data']['id']; ?>"><?php echo wpsg_ff($this->view['data']['preis']); ?></span> <?php echo $this->get_option('wpsg_currency'); ?>
+			</div>	
+			
+			<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>		
+			
+				<div class="wpsg_produkt_preishinweis">
+					<?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+				</div>
+			
+			<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>	
+	
+				<div class="wpsg_produkt_preishinweis">		
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
+					<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } else { /* Frontend = BRUTTO Preise */ ?>
+					<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
+					<?php } ?>
+				</div>
+				
+			<?php } ?>
+			
+		<!-- Ende Login abfrage -->
+			<?php } ?>
+		<!-- Ende Login abfrage -->	
+			
+			<?php /* FÃŒllmengenanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?>
+			
+				<div class="wpsg_produkt_fuellmenge">
+				<?php echo wpsg_translate(__('FÃŒllmenge: #1# (#2# / #3#)', 'wpsg'), 
+					wpsg_ff($this->view['data']['fmenge'], $this->view['data']['feinheit'], true),
+					wpsg_ff($this->view['data']['fmenge_preis'], $this->get_option('wpsg_currency')),
+					wpsg_ff($this->get_option('wpsg_mod_fuellmenge_bezug'), $this->view['data']['feinheit'])
+				); ?>
+				</div>
+			<?php } ?>		
+			<?php /* FÃŒllmengenanzeige ENDE */ ?>
+			
+			<?php /* Gewichtsanzeige START */ ?>
+			<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?>
+			<div class="wpsg_mod_weight_produkt">
+				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?>
+			</div>
+			<?php } ?>
+			<?php /* Gewichtsanzeige ENDE */ ?>
+			
+			<?php /* Varianten START */ ?>
+			<div class="wpsg_produkt_varianten">
+			<?php echo $this->callMod('wpsg_mod_varianten', 'renderTemplate', array($this->view['data']['id'])); ?>
+			</div>
+			<?php /* Varianten ENDE */ ?>			
+			
+		<!-- Beginn Login abfrage -->
+			<?php if ($this->callMod('wpsg_mod_kundenverwaltung', 'getUserStatus', array($this->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn'))) == true) { ?>
+		<!-- Beginn Login abfrage -->
+			
+			<div class="wpsg_produkt_add_basket_wrapper">	
+				
+				<label for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?>:</label>
+				
+				<input type="text" value="1" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" />	
+				<input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+			
+				<?php if ($this->get_option('wpsg_afterinsert') == '2') { ?>
+				<script type="text/javascript">
+
+					jQuery(document).ready(function() {
+
+						jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').bind('click', function() {
+				 			
+							jQuery.ajax( {
+								url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>',
+								data:
+								{
+									wpsg_form_data: jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(),
+									'wpsg[ajax]': '1',
+									'wpsg[submit]': '1'					
+								},
+								success: function(data) 
+								{
+									tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=450');
+								}
+							} );	
+							
+							return false;
+							
+						} );
+
+					} );
+				 
+				</script>
+				<?php } ?>
+				
+			</div>
+			
+		<!-- Ende Login abfrage -->
+			<?php } ?>
+		<!-- Ende Login abfrage -->	
+			
+		</div>
+		
+		<div class="wpsg_clear"></div>
+		 	
+		<?php /* Facebook und Co Integration aus dem Produktartikel Modul */ ?>
+		<?php echo $this->callMod('wpsg_mod_produktartikel', 'socialIntegration', array($this->view['data']['id'])); ?>
+		<?php /* Facebook und Co Integration ENDE */ ?>
+		
+	</div>
+	
+	<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+	<div class="wpsg_produkt_additional_information">
+	
+		<div itemprop="description" class="wpsg_produkt_beschreibung">
+			<?php echo $this->view['data']['beschreibung']; ?>
+		</div>
+				
+	</div>
+	<?php } ?>
+	
+	<?php $this->callMods('product_bottom', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+</div> 
Index: /views/warenkorb/ajaxDialog.phtml
===================================================================
--- /views/warenkorb/ajaxDialog.phtml	(revision 8528)
+++ /views/warenkorb/ajaxDialog.phtml	(revision 5261)
@@ -5,107 +5,58 @@
 	 */
 	 
+	// $this->view['error'] // Steht auf true wenn ein Fehler produziert und angezeigt werden soll
 	// $this->view['product_key'] // Der ProduktSchlÃŒssel des hinzugefÃŒgten Produktes
 	// $this->view['amount_add'] // So oft wurde das Produkt hinzugefÃŒgt
 	// $this->view['amount_basket'] // So oft befindet sich das hinzugefÃŒgte Produkt im Warenkorb
 	// $this->view['product_data'] // Array mit Produktdaten
-	// $this->view['product_index'] // Index des Produktes im Warenkorb	 	
 	
-	if (isset($_REQUEST['wpsg']['product_key'])) {
-		//$image = $this->imagehandler->getAttachmentID($this->view['product_data']['product_key']);
-		$image = $this->imagehandler->getAttachmentID($_REQUEST['wpsg']['product_key']);
-	} else {
-		$arImages = $this->imagehandler->getAttachmentIDs($this->view['product_data']['product_id']);
-		$image = $arImages[0];
+?><div id="wpsg_basket_ajax_message">
+ 	
+ 	<div class="wpsg_basket_ajax_message_content">
+ 		
+ 		<?php if ($this->view['error'] === true) { echo $this->writeFrontendMessage(); } else { ?>
+ 		 
+ 		 	<span class="wpsg_basket_ajax_message_content_success">
+ 			<?php echo wpsg_translate(
+ 				__('Es wurde #1#x "#2#" in den Warenkorb gelegt.', 'wpsg'),
+ 				$this->view['amount_add'],
+ 				$this->getProductName($this->view['product_data']['id'], true)); ?>
+ 			</span>
+ 				
+ 		<?php } ?> 
+ 		
+ 		<div class="wpsg_button_wrap">
+ 			<button class="wpsg_button wpsg_button_continue_shopping" onclick="return wpsg_basket_ajax_message_close();"><?php echo __('Weiter Einkaufen', 'wpsg'); ?></button>
+ 			<a href="<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET); ?>"><button class="wpsg_button wpsg_button_basket"><?php echo __('Zum Warenkorb', 'wpsg'); ?></button></a>
+ 			<div class="wpsg_clear"></div>
+ 		</div>
+ 		
+ 		<?php $this->clearFrontendMessage(); ?>
+ 		
+ 	</div>
+
+</div><div id="wpsg_basket_ajax_layer"></div>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+	function wpsg_basket_ajax_message_close()
+	{
+
+		jQuery('#wpsg_basket_ajax_message').remove();
+		jQuery('#wpsg_basket_ajax_layer').remove();
+
+		return false;
+		
 	}
-	
-	$this->basket->initFromSession(true);
-	$arBasket = $this->basket->toArray();
-	
-?> 	 
+                                    
+	jQuery(document).ready(function() { 
 
-<div class="product_add_layer">
-	<?php if (wpsg_isSizedString($image)) { ?>
-	<div class="wpsg_productimages">	
-		<?php echo wp_get_attachment_image($image, 'medium', false, array()); ?>
-	</div>
-	<?php } ?>
-	
-	<div class="wpsg_basket_ajax_message_content_right">
-		
-		<?php /* Preisanzeige Start */ ?>
-		<div class=wpsg_ajaxdialog_form>
-			<?php echo wpsg_translate(
-				__('Der Preis fÃŒr das Produkt betrÃ€gt #1#.', 'wpsg'),
-				wpsg_ff($this->view['product_data']['preis'], $this->get_option('wpsg_currency'))
-			); ?>
-			<br />
-			<?php echo wpsg_translate(
-				__('Im Warenkorb befinden sich jetzt #1# Produkt(e).', 'wpsg'),
-				$arBasket['menge']
-			); ?>
-			<br />
-			<?php echo wpsg_translate(
-				__('Der Gesamtpreis (inkl. Versand) betrÃ€gt jetzt #1#.', 'wpsg'),
-				wpsg_ff($arBasket['sum']['preis_gesamt'], $this->get_option('wpsg_currency'))
-			); ?>
+		jQuery('#wpsg_basket_ajax_layer').bind('click', function() {
+
+			wpsg_basket_ajax_message_close();
 			
-		</div>
-		<div class="wpsg_clear"></div>
-		<?php /* Preisanzeige ENDE */ ?>
-	
-		<?php /* FÃŒllmengenanzeige START */ ?>
-		<?php if ($this->hasMod('wpsg_mod_fuellmenge') && $this->get_option('wpsg_mod_fuellmenge_showAjaxDialog') === '1') { ?>
-			<div class="wpsg_ajaxdialog_form">
-			<?php echo wpsg_translate(__('FÃŒllmenge: #1# #2#', 'wpsg'),'<span class="wpsg_fmenge">'.wpsg_ff($this->view['product_data']['fmenge']).'</span>', $this->view['product_data']['feinheit']); ?> 
-			</div>	
-		<?php } ?>	
-		<div class="wpsg_clear"></div>	
-		<?php /* FÃŒllmengenanzeige ENDE */ ?>
-		
-		<?php /* Gewichtsanzeige Start */ ?>
-		<?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showAjaxDialog') === '1') { ?>
-			<div class="wpsg_ajaxdialog_form">
-				<?php echo wpsg_translate(__('Gewicht: #1# #2#', 'wpsg'), '<span class="wpsg_weight"">'.wpsg_ff($this->view['product_data']['weight']).'</span>', $this->view['product_data']['weight_unit']); ?>
-			</div>
-		<?php } ?>
-		<div class="wpsg_clear"></div>
-		<?php /* Gewichtsanzeige ENDE */ ?>
-		
-	</div>
-	
-	<div class="wpsg_clear"></div>
-	
-	<?php /* ZubehÃ¶rprodukte START */?>
-	<?php if ($this->hasMod('wpsg_mod_relatedproducts') && $this->get_option('wpsg_mod_relatedproducts_showAjaxDialog') === '1') { ?>
-		<?php $arRelatedProducts = $this->callMod('wpsg_mod_relatedproducts', 'getRelatedProducts', array($this->getProduktID($this->view['product_key']))); ?>
-		<?php if (wpsg_isSizedArray($arRelatedProducts)) { ?> 			 
-			<div class="wpsg_ajaxdialog_relatedproducts">
-				<h3><?php echo __('Das kÃ¶nnte Ihnen auch gefallen:', 'wpsg'); ?></h3>
-	
-				<div class="wpsg_clear"></div>
-				
-				<?php foreach ($arRelatedProducts as $rp_data) { $product_data = $this->loadProduktArray($rp_data['product_id']); ?>
-				
-				<div class="wpsg_ajaxdialog_productrow">
-					<h4><?php echo $this->getProductName($rp_data['product_id']); ?></h4>
-					<a href="<?php echo $this->getProduktLink($rp_data['product_id']); ?>">
-					<?php
-					$arImages = $this->imagehandler->getAttachmentIDs($rp_data['product_id']);
-					$image = $arImages[0];
-					?>
-					<?php if (wpsg_isSizedString($image)) { ?> 
-						<?php if (wpsg_isSizedString($image)) { ?> 
-							<?php echo wp_get_attachment_image($image, 'medium', false, array()); ?>
-						<?php } ?>
-					<?php } ?>
-					</a>
-				</div>
-				
-				<?php } ?>
-			</div>
-		<?php }?>	
-	<?php } ?>	
-	<?php /* ZubehÃ¶rprodukte ENDE*/?>
-	
-	<div class="wpsg_clear"></div>
-</div>
+		} );
+		 
+	} );
+    
+/* ]]> */</script>
Index: /views/warenkorb/basket.phtml
===================================================================
--- /views/warenkorb/basket.phtml	(revision 8528)
+++ /views/warenkorb/basket.phtml	(revision 5261)
@@ -4,437 +4,292 @@
 	 * Template fÃŒr den Warenkorb
 	 */
-
+ 
 	//wpsg_debug($this->view['basket']);
-	//wpsg_debug($this->view['basket']['arCalculation']);
-	
-    //wpsg_debug($_SESSION['wpsg']);
+	//wpsg_debug($_SESSION);
 	//wpsg_debug($this->arShipping);
-
-	//wpsg_debug(__('Deutschland', 'wpsg'));
- 
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-	     
-?>
+	
+?>	
 <div class="wpsg wpsg_basket <?php echo ((isset($_REQUEST['wpsg_basket_ajax']))?'wpsg_basket_ajax':''); ?>">
-
-	<?php if ($this->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1)) { ?>
-	<?php } else {?>
+	
 	<?php echo $this->writeFrontendMessage(); ?>
-	<?php } ?>
-
+	
 	<?php $this->callMods('basket_top'); ?>
-
+	
 	<?php if (sizeof($this->view['basket']['produkte']) > 0) { ?>
 
-	<?php if ($this->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1)) { ?>
-	<?php } else {?>
-		<?php $GLOBALS['step'] = 1; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
-	<?php } ?>
-
-	<?php if (!isset($this->view['noFormTag'])) { ?>
-	<form id="wpsg_basket_form" name="wpsg_basket_form"  method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT); ?>" enctype="multipart/form-data">
-	<?php } ?>
-
-		<h2><?php echo __('Ihr Warenkorb', 'wpsg'); ?></h2>
-
+	<?php $GLOBALS['step'] = 1; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
+		
+	<form id="wpsg_basket_form" name="wpsg_basket_form"  method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT); ?>">
+	
+		<h2><?php echo __('Bestellte Produkte', 'wpsg'); ?></h2>
+		
 		<div class="wpsg_spacer"></div>
-
-		<div class="basket_product_wrap">
-
-			<?php $i = 0; foreach ($this->view['basket']['produkte'] as $k => $product_data) { $i ++; ?>
-
-			<div class="basket_product_row">
-
-				<?php $this->view['$bPicture'] = false;
-
-				?>
-				<?php if ($this->get_option('wpsg_imagehandler_basketimage') == '1') {
-
-				?>
-				<div class="productimage">
-
-					<?php
-					if (isset($product_data['product_key'])) {
-						$arAttachmentIDs = $this->imagehandler->getAttachmentIDs($product_data['product_key']);
-						$attachmentID = $this->imagehandler->getAttachmentID($product_data['product_key']);
-						
-                        echo wp_get_attachment_image($attachmentID, 'medium');
-						
-					}
-					if ($attachmentID > 0) $this->view['$bPicture'] = true;
-					//echo "<img src=".$url." alt='' />";
+		
+		<table>
+			<tr class="wpsg_kopf">
+				<th class="wpsg_cell_number">&nbsp;</th>
+				<th class="wpsg_cell_menge"><?php echo __("Anzahl", "wpsg"); ?></th> 
+				<th class="wpsg_cell_preis"><?php echo __("Einzelpreis", "wpsg"); ?></th>
+				<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+				<th class="wpsg_cell_mwst"><?php echo __("MwSt.", "wpsg"); ?></th>
+				<?php } ?>				
+				<th class="wpsg_cell_gesamtpreis"><?php echo __("Gesamtpreis", "wpsg"); ?></th>
+			</tr>
+			<?php $i = 0; foreach ($this->view['basket']['produkte'] as $k => $p) { $i ++; ?>		
+			<?php $strBasketRow = ''; ob_start(); $this->callMods('basket_row', array(&$p, $i)); $strBasketRow = ob_get_contents(); ob_end_clean(); ?>	
+			<tr class="productrow_1 wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+				<td class="wpsg_cell_number" rowspan="<?php echo 2 + substr_count($strBasketRow, '<tr'); ?>">
+				
+					<a class="wpsg_basket_removelink" href="<?php echo $this->getRemoveLinkURL($p['product_index']); ?>" title="<?php echo __('Produkt aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass sie das Produkt aus dem Warenkorb entfernen mÃ¶chten?', 'wpsg'); ?>');">
+						<img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" />
+					</a>			
+					
+				</td>
+				<td class="wpsg_cell_menge">
+					<input class="wpsg_form_submit_return" type="text" name="wpsg[menge][<?php echo $p['product_index']; ?>]" <?php echo ((wpsg_isTrue($p['oneOnly']) || wpsg_isSizedInt($p['basket_multiple'], 4))?'readonly="readonly"':''); ?> value="<?php echo wpsg_hspc($p['menge']); ?>" size="3" />
+				</td>
+				<td class="wpsg_cell_preis"><?php echo wpsg_ff($p['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
+				<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+				<td class="wpsg_cell_mwst"><?php echo wpsg_ff($p['mwst_value']); ?> %</td>
+				<?php } ?>
+				<td class="wpsg_cell_gesamtpreis"><?php echo wpsg_ff($p['menge'] * $p['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
+			</tr>
+			<tr class="productrow_2 wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+				<td colspan="<?php echo ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?'4':'3'); ?>" class="wpsg_cell_name"> 
+					<?php if ($this->get_option('wpsg_mod_produktbilder_basketimage') == '1' && $this->hasMod('wpsg_mod_produktbilder')) { 
+						
+						if (wpsg_isSizedString($p['varianten_image'])) $arBilder = array($p['varianten_image']);						
+						else $arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->getProduktID($p['id']))); 
+						
 					?>
-				</div>
-				<?php } ?>
-
-				<div class="product_content">
-
-					<div class="product_name">
-						<?php if ($this->getProduktLink($product_data)) { ?>
-						<a href="<?php echo $this->getProduktLink($product_data); ?>"><?php echo wpsg_hspc((($product_data['detailname'] != '')?$product_data['detailname']:$product_data['name'])); ?></a>
-						<?php } else { ?>
-						<?php echo wpsg_hspc((($product_data['detailname'] != '')?$product_data['detailname']:$product_data['name'])); ?>
+					<div class="wpsg_basket_productimage">
+						<?php if (wpsg_isSizedString($arBilder[0])) { ?>
+						<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->getProduktID($p['id']), $arBilder[0], 30, 30, 'c')); ?>" alt="<?php echo wpsg_hspc((($p['detailname'] != '')?$p['detailname']:$p['name'])); ?>" />
 						<?php } ?>
-
-						<?php if (wpsg_isSizedString($product_data['shortdesc'])) { ?>
-						<div class="product_shortdesc"><?php echo $product_data['shortdesc']; ?></div>
-						<?php } ?>
-
 					</div>
-
-					<div class="product_action">
-						<div class="title">
-							<?php echo __("Anzahl", "wpsg"); ?>
-						</div>
-						<div class="amount">
-
-							<input class="wpsg_form_submit_return" type="text" name="wpsg[menge][<?php echo $product_data['product_index']; ?>]" <?php echo ((wpsg_isTrue($product_data['oneOnly']) || wpsg_isSizedInt($product_data['basket_multiple'], 4))?'readonly="readonly"':''); ?> value="<?php echo wpsg_hspc($product_data['menge']); ?>" size="3" />
-
-							<a class="wpsg_basket_removelink" href="<?php echo $this->getRemoveLinkURL($product_data['product_index']); ?>" title="<?php echo __('Produkt aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie das Produkt aus dem Warenkorb entfernen mÃ¶chten?', 'wpsg'); ?>');">
-								<img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" />
-							</a>
-							
-						</div>
-					</div>
-
-                    <?php $this->callMods('basket_row_before', array(&$product_data, $i)); ?>
-
-					<div class="product_action">
-						<div class="title">
-							<?php echo __("Einzelpreis", "wpsg"); ?>
-						</div>
-						<div class="price">
-							<?php echo wpsg_ff($product_data['preis'], $this->get_option('wpsg_currency')); ?>
-						</div>
-					</div>
-					<div class="product_action">
-						<div class="title">
-							<?php echo __("Gesamtpreis", "wpsg"); ?>
-						</div>
-						<div class="price_total">
-							<?php echo wpsg_ff($product_data['menge'] * $product_data['preis'], $this->get_option('wpsg_currency')); ?>
-						</div>
-					</div>
-
-					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-					<div class="product_info">
-						
-						<?php echo __("MwSt.", "wpsg"); ?>
-						
-						<div class="valuer">
-							<?php echo wpsg_ff($product_data['mwst_value'], ' %'); ?>
-						</div>
-						<div class="dummyr">
-							<?php echo __('&nbsp;'); ?>
-						</div>
-
-					</div>
-					<?php } ?>
-
-					<?php $strBasketRow = ''; ob_start(); $this->callMods('basket_row', array(&$product_data, $i)); $strBasketRow = ob_get_contents(); ob_end_clean(); ?>
-					<?php echo $strBasketRow; ?>
-
-				</div>
-
-			</div>
-
-			<?php }   // foreach products ?>
-
-		</div>
-
-		<div class="basket_sum_wrap">
-
-			<?php $this->callMods('basket_row_afterproducts', []); ?>
-
-			<?php $bLine = false; ?>
-			
-			<?php if (wpsg_isSizedArray($this->view['basket']['arCalculation']['voucher'])) { $bLine = true; ?>
-				
-				<?php foreach ($this->view['basket']['arCalculation']['voucher'] as $gs) { ?>
-				
-					<div class="basket_sum_row basket_sum_voucher">
-						<div class="title">
-                            <a class="wpsg_basket_removelink" href="<?php echo str_replace('&', '&amp;', $this->getRemoveLinkURL('voucher_'.$gs['id'])); ?>" title="<?php echo __('Gutschein aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass sie den Gutschein aus dem Warenkorb entfernen mÃ¶chten?', 'wpsg'); ?>');"><img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" /></a>
-							<?php echo __('Gutschein', 'wpsg'); ?> <?php
-
-                                $arInfo = [];
-
-                                if (wpsg_isSizedString($gs['code'])) $arInfo[] = $gs['code'];
-                                if (wpsg_isTrue($gs['partial'])) $arInfo[] = __('teilweise angerechnet', 'wpsg');
-
-                                if (wpsg_isSizedArray($arInfo)) echo '('.implode(' / ', $arInfo).')';
-
-                            ?>
-						</div>
-						<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-							<div class="colgsr"><?php echo __('anteilig', 'wpsg'); ?></div>
-						<?php } ?>
-						<div class="value"><?php
-								
-							echo wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency'));
-							
-							if (strpos($gs['set'], '%') !== false) {
-								
-								echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($gs['set']), '%').')</span>';
-								
-							}
-						 
-						?></div>
-						
-					</div>				
-					
-				<?php } ?>
-				
-			<?php } ?>
-
-			<div class="basket_sum_row">
-				<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && wpsg_tf($this->view['basket']['sum']['preis_rabatt']) > 0) { ?>
-					<div class="title">
-						<?php echo __("Rabatt", "wpsg"); $bLine = true; ?>:
-					</div>
-					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-						<div class="value">
-							<?php echo __('anteilig', 'wpsg'); ?>
-						</div>
-					<?php } ?>
-						<div class="value">
-							<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
-						</div>
-				<?php } ?>
-			</div>
-
-			<?php if ($bLine == true) { ?>
-				<div class="wpsg_spacer"></div>
-			<?php } ?>
-
-			<div class="basket_sum_row">
-				<div class="title2">
+					<?php } ?>
+					<?php if ($this->getProduktLink($p)) { ?>
+					<a href="<?php echo $this->getProduktLink($p); ?>"><?php echo wpsg_hspc((($p['detailname'] != '')?$p['detailname']:$p['name'])); ?></a>
+					<?php } else { ?>
+					<?php echo wpsg_hspc((($p['detailname'] != '')?$p['detailname']:$p['name'])); ?>
+					<?php } ?>
+				</td>
+			</tr>			
+			<?php echo $strBasketRow; ?>			
+			<?php } ?>
+			<?php $this->callMods('basket_row_afterproducts', array(&$p, $i)); ?>			
+			<?php if (isset($this->view['basket']['gs'])) { ?> 
+			<tr class="wpsg_row_gutschein">
+				<td class="wpsg_cell_number" rowspan="2">
+					<a href="<?php echo str_replace('&', '&amp;', $this->getRemoveLinkURL('gs')); ?>" title="<?php echo __('Gutschein aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass sie den Gutschein aus dem Warenkorb entfernen mÃ¶chten?', 'wpsg'); ?>');">
+						<img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('LÃ¶schen', 'wpsg'); ?>" />					
+					</a>
+				</td>
+				<td class="wpsg_cell_menge">1</td>				
+				<td class="wpsg_cell_preis">
+					<?php if ($this->view['basket']['gs']['calc'] == 'p') { ?>
+					<?php echo '-'.wpsg_ff($this->view['basket']['gs']['value'], '%'); ?>
+					<?php } else { ?>
+					<?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?>
+					<?php } ?>
+				</td>
+				<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+				<td class="wpsg_cell_mwst"><?php echo __('anteilig', 'wpsg'); ?></td>
+				<?php } ?> 
+				<td class="wpsg_cell_gesamtpreis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?></td>
+			</tr>
+			<tr class="productrow_2">
+				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_name">
+					<?php echo __('Gutschein', 'wpsg'); ?> <?php echo ($this->view['basket']['gs']['code'] != '')? '('.$this->view['basket']['gs']['code'].')':'' ?>
+				</td>
+			</tr>
+			<?php } ?>
+			<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && wpsg_tf($this->view['basket']['sum']['preis_rabatt']) > 0) { ?>
+			<tr class="wpsg_row_discount"> 
+				<td class="wpsg_cell_menge"></td>
+				<td class="wpsg_cell_name">
+					<?php echo __('Rabatt', 'wpsg'); ?>
+				</td>
+				<td class="wpsg_cell_preis">
+					<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
+				</td>
+				<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+				<td class="wpsg_cell_mwst"><?php echo __('anteilig', 'wpsg'); ?></td>
+				<?php } ?> 
+				<td class="wpsg_cell_gesamtpreis">
+					<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
+				</td>
+			</tr>			
+			<?php } ?>
+			<tr class="wpsg_row_summe">
+				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
 					<?php if ($this->get_option("wpsg_kleinunternehmer") == "1") { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
-					<?php } else { ?>
-						<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#, zzgl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
-						<?php } else { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#, inkl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
-						<?php } ?>
-					<?php } ?>
-				</div>
-				<div class="value">
+					<?php echo wpsg_translate(__('Summe (zzgl. #1#)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
+					<?php } else { ?>
+					<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
+					<?php echo wpsg_translate(__('Summe (zzgl. #1#, zzgl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:					
+					<?php } else { ?>
+					<?php echo wpsg_translate(__('Summe (zzgl. #1#, inkl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
+					<?php } ?>
+					<?php } ?>					
+				</td>
+				<td class="wpsg_cell_summe_value">
 					<?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?>
-				</div>
-			</div>
-
-			<div class="basket_sum_row">
-				<div class="title">
+				</td>
+			</tr>			
+			<tr class="wpsg_basket_shipping">
+				<td colspan="3" class="wpsg_cell_shipping_label">
 					<?php echo wpsg_translate(__('<a href="#1#">Versandkosten</a>:', 'wpsg'),
 						$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN)
 					); ?>
-					<br />
-					<?php if (sizeof($this->arShipping) > 1) { ?>
+					<?php if (sizeof($this->arShipping) > 1) { ?>		 							
 					<select name="set_shipping" class="wpsg_form_submit set_shipping">
 						<option><?php echo __('Bitte wÃ€hlen', 'wpsg')?></option>
-						<?php foreach ($this->arShipping as $s_id => $s) { ?>
+						<?php foreach ($this->arShipping as $s_id => $s) { ?>						
 						<option <?php echo (($s['id'] == $this->view['basket']['checkout']['shipping'])?'selected="selected"':''); ?> value="<?php echo $s_id; ?>"><?php echo wpsg_hspc(__($s['name'], 'wpsg')); ?></option>
 						<?php } ?>
 					</select>
-					<?php } else if (!wpsg_isSizedArray($this->arShipping)) { ?>
-					<span><?php echo __('Keine Versandart mÃ¶glich / Bitte manuell anfragen', 'wpsg'); ?></span>
 					<?php } else { ?>
 					<span><?php echo $this->arShipping[$this->view['basket']['checkout']['shipping']]['name']; ?></span>
 					<?php } ?>
 					<?php if ($this->get_option('wpsg_hideBasketCountrySelect') != '1') { ?>
-					<select name="set_land" id="set_land" class="wpsg_form_submit set_land">
+					<select name="set_land" class="wpsg_form_submit set_land">
 						<?php foreach ($this->view['arLander'] as $l_id => $l) { ?>
-						<option <?php echo (($l_id == $this->getFrontendShippingCountry(true))?'selected="selected"':''); ?> value="<?php echo $l_id; ?>"><?php echo wpsg_hspc(__($l, 'wpsg')); ?></option>
+						<option <?php echo (($l_id == $this->getFrontendCountry(true))?'selected="selected"':''); ?> value="<?php echo $l_id; ?>"><?php echo wpsg_hspc(__($l, 'wpsg')); ?></option>
+						<?php } ?>
+					</select>	
+					<?php } else { ?>
+					<input type="hidden" name="set_land" value="<?php echo $this->view['basket']['checkout']['shipping_land']; ?>" />
+					<?php } ?>
+				</td>
+				<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+				<td class="wpsg_cell_mwst"><?php  
+			 
+					if (isset($this->view['basket']['shipping']['tax_rata']) && $this->view['basket']['shipping']['tax_rata'] === true)
+					{
+					
+						echo __('anteilig', 'wpsg');
+											
+					}
+					else if (array_key_exists($this->view['basket']['checkout']['shipping'], $this->arShipping))
+					{
+					
+						echo wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value'], '%');
+					
+					}
+				 
+				?></td>
+				<?php /*?><td class="wpsg_cell_mwst"><?php echo (($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value'] > 0)?wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value'], '%'):__('anteilig', 'wpsg')); ?></td> */?>							
+				<?php } ?>
+				<td class="wpsg_cell_shipping_value">
+					<?php echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')); ?> 
+				</td>
+			</tr>
+			
+			<?php /* Zeile fÃŒr Zahlungsart BEGIN */ ?>
+			<?php if (!$this->hasMod('wpsg_mod_crefopay')) { ?>
+			<tr class="wpsg_basket_payment">
+				<td colspan="3" class="wpsg_cell_payment_label">
+					<?php echo __('Zahlungsart:', 'wpsg'); ?>
+					<?php if (sizeof($this->arPayment) > 1) { ?>
+					<select name="set_payment" class="wpsg_form_submit set_payment">						
+						<option><?php echo __('Bitte wÃ€hlen', 'wpsg')?></option>						
+						<?php foreach ($this->arPayment as $p_id => $p) { ?>
+						<option <?php echo (($p['id'] == $this->view['basket']['checkout']['payment'])?'selected="selected"':''); ?> value="<?php echo $p_id; ?>"><?php echo wpsg_hspc($p['name']); ?></option>
 						<?php } ?>
 					</select>
 					<?php } else { ?>
-					<input type="hidden" name="set_land" value="<?php echo $this->view['basket']['checkout']['shipping_land']; ?>" />
-					<?php } ?>
-				</div>
-				<div class="value">
-					<?php if ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') && isset($this->view['basket']['arCalculation']['shipping'][0]['tax_key'])) { 
-						
-						$shipping_tax_key = $this->view['basket']['arCalculation']['shipping'][0]['tax_key'];
- 						
-						if ($shipping_tax_key === '0') {
-							
-							echo __('anteilig', 'wpsg');
-							
-						} else {
-							
-							echo wpsg_ff($this->view['basket']['arCalculation']['tax'][$shipping_tax_key]['tax_value'], '%');
-							
-						}
-						 						
-				 	} ?>
-				</div>
-				<div class="value">
-					<?php 
-						
-						if (isset($this->view['basket']['arCalculation']['shipping'][0]['tax_key'])) {
-						
-							echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency'));
-							
-							if (strpos($this->view['basket']['arCalculation']['shipping'][0]['set'], '%') !== false) {
-								
-								echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($this->view['basket']['arCalculation']['shipping'][0]['set']), '%').')</span>';
-								
-							}
-							
-						}
-						
-					?>
-				</div>
-			</div>
-
-			<?php /* Zeile fÃŒr Zahlungsart BEGIN */ ?>
-			<?php if (!$this->hasMod('wpsg_mod_crefopay')) { ?>
-				<div class="basket_sum_row">
-					<div class="title">
-						<?php echo __('Zahlungsart:', 'wpsg').'&nbsp;&nbsp;&nbsp;&nbsp;'; ?>
-						<?php if (sizeof($this->arPayment) > 1) { ?>
-						<select name="set_payment" class="wpsg_form_submit set_payment">
-							<option><?php echo __('Bitte wÃ€hlen', 'wpsg')?></option>
-							<?php foreach ($this->arPayment as $p_id => $p) { ?>
-							<option <?php echo (($p['id'] == $this->view['basket']['checkout']['payment'])?'selected="selected"':''); ?> value="<?php echo $p_id; ?>"><?php echo wpsg_hspc($p['name']); ?></option>
-							<?php } ?>
-						</select>
-						<?php } else if (!wpsg_isSizedArray($this->arPayment) || !array_key_exists($this->view['basket']['checkout']['payment'], $this->arPayment)) { ?>
-						<span><?php echo __('Keine Zahlungsart mÃ¶glich / Bitte manuell anfragen', 'wpsg'); ?></span>
-						<?php } else { ?>
-						<span><?php echo $this->arPayment[$this->view['basket']['checkout']['payment']]['name']; ?></span>
-						<?php } ?>
-					</div>
-					<div class="value">
-						<?php if ((sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') && isset($this->view['basket']['arCalculation']['payment'][0]['tax_key'])) {
-							
-							$payment_tax_key = $this->view['basket']['arCalculation']['payment'][0]['tax_key'];
-							
-							if ($payment_tax_key === '0') {
-								
-								echo __('anteilig', 'wpsg');
-								
-							} else {
-								
-								echo wpsg_ff($this->view['basket']['arCalculation']['tax'][$payment_tax_key]['tax_value'], '%');
-								
-							}
-							 
-						} ?>
-					</div>
-					<div class="value">
-						<?php 
-							
-							if (isset($this->view['basket']['arCalculation']['payment'][0]['tax_key'])) {
-							
-								echo wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')); 
-							
-								if (strpos($this->view['basket']['arCalculation']['payment'][0]['set'], '%') !== false) {
-									
-									echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($this->view['basket']['arCalculation']['payment'][0]['set']), '%').')</span>';
-									
-								}
-								
-							}
-							
-						?>
-					</div>
-				</div>
+					<span><?php echo $this->arPayment[$this->view['basket']['checkout']['payment']]['name']; ?></span>
+					<?php } ?>
+				</td>
+				<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+				<td class="wpsg_cell_mwst"><?php  
+				 
+					if (isset($this->view['basket']['payment']['tax_rata']) && $this->view['basket']['payment']['tax_rata'] === true)
+					{
+						
+						echo __('anteilig', 'wpsg');
+						
+					}
+					else if (array_key_exists(wpsg_getStr($this->view['basket']['checkout']['payment']), $this->arPayment))
+					{
+						
+						echo wpsg_ff($this->arPayment[$this->view['basket']['checkout']['payment']]['mwst_value'], '%');
+						
+					}					
+					
+				?></td>				
+				<?php } ?>
+				<td class="wpsg_cell_payment_value">
+					<?php echo wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')); ?>
+				</td>
+			</tr>
 			<?php } ?>
 			<?php /* Zeile fÃŒr Zahlungsart ENDE */ ?>
-
+			
 			<?php if (get_option("wpsg_kleinunternehmer") == "1") { ?>
-				<div class="basket_sum_row">
-					<div class="title2">
-						<?php echo get_option('wpsg_kleinunternehmer_text'); ?>
-					</div>
-					<div class="value">
-						<?php echo __('&nbsp;'); ?>
-					</div>
-				</div>
-
-				<div class="basket_sum_row">
-					<div class="title2">
-						<?php echo __('Gesamtpreis', 'wpsg'); ?>:
-					</div>
-					<div class="sum">
+			<tr class="wpsg_basket_kleinunternehmer">			
+				<td colspan="<?php echo $this->view['colspan'] + 1; ?>"><?php echo get_option('wpsg_kleinunternehmer_text'); ?></td>
+			</tr>
+			<tr class="wpsg_basket_gesamt">
+				<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
+					<?php echo __('Gesamtpreis', 'wpsg'); ?>:
+				</td>	
+				<td class="wpsg_cell_gesamtsumme_value">
+					<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
+				</td>
+			</tr>
+			<?php } else { ?>				
+				<tr class="wpsg_basket_gesamt_netto wpsg_row_small">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
+						<?php echo __('Gesamtpreis (Netto)', 'wpsg'); ?>:
+					</td>
+					<td class="wpsg_cell_gesamtsumme_value">
+						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_netto'], $this->get_option('wpsg_currency')); ?>
+					</td>
+				</tr>
+				<?php foreach ($this->view['basket']['mwst'] as $mwst) { ?> 
+				<tr class="wpsg_row_mwst">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_mwst_label">				
+						<?php echo wpsg_translate(__('zuzÃŒglich MwSt. (#1#)', 'wpsg'), __($mwst['name'], 'wpsg')); ?>:										
+					</td>
+					<td class="wpsg_cell_mwst_value">
+						<?php echo wpsg_ff($mwst['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+					</td>
+				</tr>					 				
+				<?php } ?>
+				<tr class="wpsg_basket_gesamt wpsg_row_small">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
+						<?php echo __('Gesamtpreis (Brutto)', 'wpsg'); ?>:
+					</td>
+					<td class="wpsg_cell_gesamtsumme_value">
 						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
-					</div>
-				</div>
-			<?php } else { ?>
-
-				<div class="basket_sum_row">
-					<div class="title2">
-						<?php echo __('Gesamtpreis (Netto)', 'wpsg'); ?>:
-					</div>
-					<div class="sum">
-						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_netto'], $this->get_option('wpsg_currency')); ?>
-					</div>
-				</div>
-
-				<?php foreach ($this->view['basket']['mwst'] as $mwst) { ?>
-					<div class="basket_sum_row">
-						<div class="title2">
-							<?php echo wpsg_translate(__('zuzÃŒglich MwSt. (#1#)', 'wpsg'), __($mwst['name'], 'wpsg')); ?>:
-						</div>
-						<div class="value">
-							<?php echo wpsg_ff($mwst['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-						</div>
-					</div>
-				<?php } ?>
-				<div class="wpsg_spacer"></div>
-				<div class="basket_sum_row">
-					<div class="title2">
-						<?php echo __('Gesamtpreis (Brutto)', 'wpsg'); ?>:
-					</div>
-					<div class="sum">
-						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
-					</div>
-				</div>
-				<div class="wpsg_spacer"></div>
-			<?php } ?>
-			
-			<?php $this->callMod('wpsg_mod_gutschein', 'basket_row_end_coupon'); ?>
-			
+					</td>
+				</tr> 					
+			<?php } ?>
 			<?php $this->callMods('basket_row_end', array(&$this->view)); ?>
-
-			<br />
-			<div class="wpsg_spacer"></div>
- 
-			<?php $this->callMods('basket_inner_prebutton', array(&$this->view)); ?>
-
-		</div>
-
+		</table>
+			   
+		<?php $this->callMods('basket_inner_prebutton', array(&$this->view)); ?>
+				
+		<br /> 
+		
 		<input type="hidden" name="wpsg_basket_submit" value="1" />
-
+		
 		<input type="submit" class="wpsg_button wpsg_refreshbutton" value="<?php echo __('aktualisieren', 'wpsg'); ?>" name="wpsg_basket_refresh" />
-		<?php if ($this->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1)) { ?>
-		<?php } else { ?>
-			<input type="submit" class="wpsg_button wpsg_checkoutbutton" id="wpsg_basket_submit" value="<?php echo __('zur Kasse', 'wpsg'); ?>" name="wpsg_checkout" />
-
-			<br /><br />
-			
-			<?php /* Weiter-shoppen-Seite (auskommentierte Zeile: Ziel ist die Blogstartseite) */ ?>
-			<?php echo wpsg_translate(__('<a href="#1#" class="do_shopping_link">weiter shoppen</a>', 'wpsg'), $this->getURL(wpsg_ShopController::URL_BASKET_MORE)); ?>
-			<?php /* <a href="<?php echo WPSG_URL_WP;?>" class="wpsg_basket_weiter_shoppen2"><?php echo __('weiter shoppen', 'wpsg'); ?></a> */?> 
-			
-		<?php } ?>
+		<input type="submit" class="wpsg_button wpsg_checkoutbutton" value="<?php echo __('zur Kasse', 'wpsg'); ?>" name="wpsg_checkout" />
+				
 		<div class="wpsg_clear"></div>
-
+			
 		<?php $this->ClearSessionErrors(); ?>
-
-	<?php if (!isset($this->view['noFormTag'])) { ?>
-		</form>
-	<?php } ?>
-
-	<br />
+			
+	</form>
+	
 	<?php $this->callMods('basket_after', array(&$this->view)); ?>
- 
+	 	
 	<?php } else { ?>
 	<p><?php echo __('Keine Produkte im Warenkorb.', 'wpsg'); ?></p>
 	<?php } ?>
-
+	
 </div>
 
@@ -451,37 +306,26 @@
 
 				jQuery('.wpsg_refreshbutton').click(); return false;
-
+				
 			}
-
+			  
 		} );
-
+		
 		jQuery('.wpsg_form_submit').bind('change', function() {
-
+		  
 			jQuery('.wpsg_refreshbutton').click();
-
+		
 		} );
 
-		jQuery('#set_land').bind('change', function() {
-
-			land = jQuery('#set_land').val();
-			jQuery('#wpsg_land').val(land);
-
+	} );
+
+	<?php if (isset($_REQUEST['wpsg_basket_ajax'])) { ?> 
+
+		jQuery(document).ready(function() {
+			
+			jQuery('.wpshopgermany_widget').load('<?php echo $this->getURL(wpsg_ShopController::URL_WIDGET_AJAX); ?>');		
+			
 		} );
 
-		// Land der Rechnungsadresse setzen
-		land = jQuery('#set_land').val();
-		jQuery('#wpsg_land').val(land);
-
-	} );
-
-	<?php if (isset($_REQUEST['wpsg_basket_ajax'])) { ?>
-
-		jQuery(document).ready(function() {
-
-			jQuery('.wpshopgermany_widget').load('<?php echo $this->getURL(wpsg_ShopController::URL_WIDGET_AJAX); ?>');
-
-		} );
-
 	<?php } ?>
-
+	
 /* ]]> */</script>
Index: /views/warenkorb/checkout.phtml
===================================================================
--- /views/warenkorb/checkout.phtml	(revision 8528)
+++ /views/warenkorb/checkout.phtml	(revision 5261)
@@ -5,12 +5,12 @@
 	 * Kundendaten etc.
 	 */
- 
+	
 	//wpsg_debug($this->view);
 
-?>	
+?>
 <script type="text/javascript">/* <![CDATA[ */
-	
+
 	jQuery(document).ready(function() {
-		
+
 		<?php if ($this->get_option('wpsg_form_validation') == '1') { ?>
 		
@@ -51,25 +51,9 @@
 		<?php } ?>
 
-		jQuery('.wpsg_checkout input').bind('keyup keypress', function(e) {
-
-			var jqThis = jQuery(this);
-			
-			// Enter lass ich direkt durch
-			if (jqThis.attr("type") === 'submit') return true;
-			
-			var keyCode = e.keyCode || e.which;
-			
-			if (keyCode == 13) {
- 		    	
-				if (jqThis.parents('.wpsg_loginform').length > 0) {
-
-					jQuery('input[name="wpsg_mod_kundenverwaltung_login"]').click();
-					
-				} else {
-		        
-					jQuery('#wpsg_checkout2button').click();
-					
-				}
-				
+		jQuery('.wpsg_checkout input').bind('keyup', function(e) {
+
+			if(e.keyCode == 13)
+		    {
+		        jQuery('#wpsg_checkout2button').click();
 		    }
 		    
@@ -77,16 +61,4 @@
 		
 	} );
-
-	<?php /* Copy&Paste fÃŒr das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
-	window.onload = function() {
-		
-		var email2 = document.getElementById('email2');
-
-		email2.onpaste = function(e) {
-
-			e.preventDefault();
-
-		}
-	}
 		
 /* ]]> */</script>
@@ -100,215 +72,108 @@
 	<form id="form-step2" method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>" enctype="multipart/form-data">
 
-		<?php /* Einbindung des Logins im Checkout */ ?>	
-		<div class="wpsg_loginform">
-			<?php $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?>
-		</div>
+		<?php /* Einbindung des Logins im Checokut */ ?>	
+		<?php $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?>
 	
 		<div class="wpsg_box" id="wpsg_box_kundendaten">
 			
-			<?php /*Wenn Kunden eingeloggt, oder wenn Kunde nicht eingeloggt */ ?>
-			<?php if ($this->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn')) { ?>
-				<h2><?php echo __('Bitte ÃŒberprÃŒfen Sie Ihre Kundendaten','wpsg');?></h2>
-			<?php } else { ?>		
-				<h2><?php echo __('Bitte geben Sie Ihre Kundendaten ein', 'wpsg'); ?></h2>
-			<?php } ?>
-					
+			<h2><?php echo __('Kundendaten', 'wpsg'); ?></h2>
+			
 			<div class="wpsg_spacer"></div>
 		
 			<div class="wpsg_inner">
 		
-				<?php if ($this->view['pflicht']['firma'] != '2') { ?>
 				<div class="wpsg_checkoutblock" id="wpsg_firma">
-					<label for="wpsg_firma"><?php echo __("Firma:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[checkout][firma]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['firma'])); ?>" />
-				</div>
-				<?php } ?>
-			
-				<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
+					<label for="wpsg_firma"><?php echo __("Firma", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[checkout][firma]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['firma']); ?>" />
+				</div>
+			
 				<div class="wpsg_checkoutblock" id="wpsg_anrede">
-					<label for="wpsg_title"><?php echo __('Anrede:', 'wpsg'); ?>
-					<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?></label>
+					<label for="wpsg_title"><?php echo __('Anrede', 'wpsg'); ?>
+					<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:</label>
 					<select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[checkout][title]">
 						<option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-						<?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
-						<option value="<?php echo $i; /*wpsg_hspc($t);*/ ?>" <?php echo (($this->view['basket']['checkout']['title'] == $i)?'selected="selected"':''); ?>><?php echo $t; $i++; ?></option>
+						<?php foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+						<option value="<?php echo wpsg_hspc($t); ?>" <?php echo (($this->view['basket']['checkout']['title'] == $t)?'selected="selected"':''); ?>><?php echo $t; ?></option>
 					<?php } ?>						
 					</select>
 				</div>
-				<?php } ?>
-			
-				<?php if ($this->view['pflicht']['vname'] != '2') { ?>
+			
 				<div class="wpsg_checkoutblock" id="wpsg_vorname">
-					<label for="vname" class="wpsg_checkout"><?php echo __("Vorname:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input
-						class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>"
-						type="text"
-						id="vname"
-						autocomplete="vname"
-						name="wpsg[checkout][vname]"
-						value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['vname'])); ?>"
-					/>
-				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['name'] != '2') { ?>
+					<label for="vname" class="wpsg_checkout"><?php echo __("Vorname", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="vname" name="wpsg[checkout][vname]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['vname']); ?>" />		
+				</div>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_name">
-					<label for="name" class="wpsg_checkout"><?php echo __("Name:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input
-						class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>"
-						type="text"
-						id="name"
-						autocomplete="name"
-						name="wpsg[checkout][name]"
-						value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['name'])); ?>"
-					/>
-				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['email'] != '2') { ?>
+					<label for="name" class="wpsg_checkout"><?php echo __("Name", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="name" name="wpsg[checkout][name]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['name']); ?>" />
+				</div>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_email">
-					<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input 
-                        class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                        type="email" 
-                        id="email" 
-                        name="wpsg[checkout][email]" 
-                        value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['email'])); ?>"
-                        autocomplete="off"
-                    />
-				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['email'] != '2') { ?>
+					<label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email" name="wpsg[checkout][email]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email']); ?>" />
+				</div>
+				
 				<?php if (isset($this->view['pflicht']['emailconfirm']) && $this->view['pflicht']['emailconfirm'] == '1') { ?>
 				<div class="wpsg_checkoutblock" id="wpsg_email2">
-					<label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung:)", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input 
-                        class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" 
-                        type="email" 
-                        id="email2" 
-                        name="wpsg[checkout][email2]" 
-                        value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['email2'])); ?>" 
-                        autocomplete="off"
-                    />
+					<label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email2" name="wpsg[checkout][email2]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email2']); ?>" />
 				</div>
 				<?php } ?>
-				<?php } ?>
-				
-				<?php if (intval($this->view['pflicht']['eInvoice']??0) === 1) { ?>
-				<div class="wpsg_checkoutblock" id="wpsg_email_einvoice">
-					<label for="wpsg_email_einvoice_input" class="wpsg_checkout"><?php echo __("E-Mail (fÃŒr eRechnung, optional)", "wpsg"); ?></label>
-					<input
-						class="wpsg_input_text wpsg_checkout <?php echo ((in_array("email_einvoice", (array)$this->view['error']))?'wpsg_error':''); ?>"
-						type="email"
-						id="wpsg_email_einvoice_input"
-						name="wpsg[checkout][email_einvoice]"
-						value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email_einvoice']??''); ?>"
-						autocomplete="off"
-					/>
-				</div>
-				<?php } ?>
-
-				<?php if (intval($this->view['pflicht']['leitweg']??0) === 1) { ?>
-                    <div class="wpsg_checkoutblock" id="wpsg_leitweg_id">
-                        <label for="wpsg_leitweg_id_input" class="wpsg_checkout"><?php echo __("Leitweg-ID (fÃŒr eRechnung, optional)", "wpsg"); ?></label>
-                        <input
-                                class="wpsg_input_text wpsg_checkout <?php echo ((in_array("leitweg_id", (array)$this->view['error']))?'wpsg_error':''); ?>"
-                                type="text"
-                                id="wpsg_email_leitweg_id_input"
-                                name="wpsg[checkout][leitweg_id]"
-                                value="<?php echo htmlspecialchars($this->view['basket']['checkout']['leitweg_id']??''); ?>"
-                                autocomplete="off"
-                        />
-                    </div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['geb'] != '2') { ?>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_geburtsdatum">
-					<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ):',"wpsg"); ?>
-					<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[checkout][geb]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['geb'])); ?>" />
-				</div>
-				<?php } ?>
+					<label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ)',"wpsg"); ?>
+					<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[checkout][geb]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['geb']); ?>" />
+				</div>
 						
-				<?php if ($this->view['pflicht']['fax'] != '2') { ?>
 				<div class="wpsg_checkoutblock" id="wpsg_fax">
-					<label for="fax" class="wpsg_checkout"><?php echo __("Fax.:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['fax'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="fax" name="wpsg[checkout][fax]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['fax'])); ?>" />
-				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['tel'] != '2') { ?>
+					<label for="fax" class="wpsg_checkout"><?php echo __("Fax.", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['fax'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="fax" name="wpsg[checkout][fax]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['fax']); ?>" />
+				</div>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_telefon">
-					<label for="tel" class="wpsg_checkout"><?php echo __("Tel.:", "wpsg"); ?>
-					<?php if ($this->view['pflicht']['tel'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="tel" name="wpsg[checkout][tel]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['tel'])); ?>" />
-				</div>
-				<?php } ?>
-			
-				<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-									
-					<?php if (wpsg_isSizedInt($this->view['pflicht']['wpsg_showNr'])) { ?>
-					
-						<div class="wpsg_checkoutblock" id="wpsg_streetnr">
-							<label for="strasse" class="street wpsg_checkout"><?php echo __('StraÃe:', 'wpsg'); ?>
-								<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-								<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['strasse'])); ?>" />
-							</label>
-							<label for="nr" class="nr wpsg_checkout"><?php echo __('Nr:', 'wpsg'); ?>
-								<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-								<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[checkout][nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>" />							
-							</label>
-						</div>
-						
-					<?php } else { ?>
-
-						<div class="wpsg_checkoutblock" id="wpsg_strasse">
-							<label for="strasse" class="wpsg_checkout"><?php echo __("StraÃe, Nr.:", "wpsg"); ?>
-								<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-							</label>
-							<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['strasse'])); ?>" />
-						</div>
-						
-					<?php } ?>
-					
-				<?php } ?>
-			
-				<?php if ($this->view['pflicht']['plz'] != '2') { ?>
+					<label for="tel" class="wpsg_checkout"><?php echo __("Tel.", "wpsg"); ?>
+					<?php if ($this->view['pflicht']['tel'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="tel" id="tel" name="wpsg[checkout][tel]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['tel']); ?>" />
+				</div>
+			
+				<div class="wpsg_checkoutblock" id="wpsg_strasse">
+					<label for="strasse" class="wpsg_checkout"><?php echo __("Strasse Nr.", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['strasse']); ?>" />		
+				</div>
+			
 				<div class="wpsg_checkoutblock" id="wpsg_postleitzahl">
-					<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[checkout][plz]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['plz'])); ?>" />
-				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['ort'] != '2') { ?>
+					<label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[checkout][plz]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['plz']); ?>" />
+				</div>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_ort">
-					<label for="ort" class="wpsg_checkout"><?php echo __("Ort:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[checkout][ort]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['ort'])); ?>" />
-				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['land'] != '2') { ?>
+					<label for="ort" class="wpsg_checkout"><?php echo __("Ort", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[checkout][ort]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['ort']); ?>" />
+				</div>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_land">
-					<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
+					<label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
 					</label>					
 					<select name="wpsg[checkout][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
@@ -319,14 +184,11 @@
 					</select>
 				</div>
-				<?php } ?>
-				
-				<?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
+				
 				<div class="wpsg_checkoutblock" id="wpsg_ustidnr">
-					<label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.:", "wpsg"); ?> 
-					<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
-					</label>
-					<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[checkout][ustidnr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['ustidnr'])); ?>" />
-				</div>
-				<?php } ?>
+					<label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.", "wpsg"); ?> 
+					<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
+					</label>
+					<input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[checkout][ustidnr]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['ustidnr']); ?>" />
+				</div>
 				
 				<?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
@@ -336,18 +198,18 @@
 					<label class="wpsg_cv wpsg_checkout" for="wpsg_cv_<?php echo $c_id; ?>">
 						<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
-                    </label>
-                    <?php if ($c['typ'] == '0') { // Textfeld ?>
-                    <input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" type="text" value="<?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc($this->view['basket']['checkout']['custom'][$c_id]); ?>" />
-                    <?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
-                    <select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]">
-                        <option value="-1"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
-                        <?php foreach ((array)$arAuswahl as $a) { ?>
-                        <option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == @$this->view['basket']['checkout']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
-                        <?php } ?>
-                    </select>
-                    <?php } else if ($c['typ'] == '2') { // Checkbox ?>
-                    <input type="hidden" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="0" />
-                    <input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="1" <?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc(($this->view['basket']['checkout']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
-                    <?php } ?>
+						<?php if ($c['typ'] == '0') { // Textfeld ?>
+						<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" type="text" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['custom'][$c_id]); ?>" />
+						<?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
+						<select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]">
+							<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
+							<?php foreach ((array)$arAuswahl as $a) { ?>
+							<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['basket']['checkout']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
+							<?php } ?>
+						</select>
+						<?php } else if ($c['typ'] == '2') { // Checkbox ?>
+						<input type="hidden" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="0" />
+						<input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="1" <?php echo wpsg_hspc(($this->view['basket']['checkout']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
+						<?php } ?>
+					</label>
 				</div>
 				<?php } } ?>
@@ -356,21 +218,5 @@
 				<div class="wpsg_clear"></div>
 				
-				<?php /* $this->callMods('checkout_customer_inner'); START */ ?>
-				
-				<?php /* Passwortabfrage fÃŒr Neuregistrierung */ ?> 
-    			<?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); ?>
-       
-				<?php /*echo $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); */ ?>
-				
-				<?php /* Abfrage Satollo-Newsletter */ ?>
-				<?php echo $this->callMod('wpsg_mod_nlsatolo', 'checkout_customer_inner'); ?>
-				
-				<?php /* EinverstÃ€ndnisabfrage Trusted Shops */ ?>
-				<?php echo $this->callMod('wpsg_mod_trustedshops', 'checkout_customer_inner'); ?>
-				
-				<?php /* Newsletter Integration */ ?>
-				<?php echo $this->callMod('wpsg_mod_newsletter', 'checkout_customer_inner'); ?>
-				
-				<?php /* $this->callMods('checkout_customer_inner'); ENDE */ ?>
+				<?php $this->callMods('checkout_customer_inner'); ?>
 				
 			</div>
@@ -389,5 +235,5 @@
 			
 			<div class="wpsg_inner wpsg_commentblock">
-				<textarea name="wpsg[checkout][comment]" id="wpsg_checkout_comment"><?php echo wpsg_getStr($this->view['basket']['checkout']['comment']); ?></textarea>				 
+				<textarea name="wpsg[checkout][comment]" id="wpsg_checkout_comment"><?php echo wpsg_hspc($this->view['basket']['checkout']['comment']); ?></textarea>				 
 			</div>
 		</div>
@@ -419,20 +265,4 @@
 		} );
 
-			
-		<?php if ($this->hasMod('wpsg_mod_addressvalidation')) { ?>
-			validateAddressBind( { 
-            	Strasse: '#strasse',
-            	Nr: '#nr',
-            	Ort: '#ort',
-            	PLZ: '#plz',
-            	Land: '#wpsg_land',
-            	Key: '<?php echo $this->get_option('wpsg_mod_addressvalidation_apikey');?>',
-            	StorageKey: 'KundenAddress',
-            	MsgTeil1: 'Kundenadresse'
-			} );
-		<?php } ?>
-			
-		//} );
-
 	/* ]]> */</script>
 	
Index: /views/warenkorb/checkout2.phtml
===================================================================
--- /views/warenkorb/checkout2.phtml	(revision 8528)
+++ /views/warenkorb/checkout2.phtml	(revision 5261)
@@ -7,5 +7,5 @@
 	//wpsg_debug($this->view['basket']['checkout']);
 	//die();
-
+	
 ?>
 <div class="wpsg wpsg_checkout2">
@@ -34,8 +34,8 @@
 					<div class="wpsg_payship_name"><?php echo __($s['name'], 'wpsg'); ?></div>				
 					<?php } ?> 
-					<?php if ((isset($s['hint']) && trim($s['hint']) != '') || wpsg_getFloat($s['price']) > 0) { ?>
+ 					<?php if ((isset($s['hint']) && trim($s['hint']) != '') || $s['price'] > 0) { ?>					
 					<div id="shipping_<?php echo $s['id']; ?>_hint" class="shippay_hint">
 						<?php if ($s['price'] > 0) { ?>
-						<?php echo __('GebÃŒhr', 'wpsg'); ?>: <?php echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')); ?><br />
+						<?php echo __('GebÃŒhr', 'wpsg'); ?>: <?php echo wpsg_ff($s['price'], $this->get_option('wpsg_currency')); ?><br />
 						<?php } ?>
 						<?php echo $this->replaceUniversalPlatzhalter(__($s['hint'], 'wpsg')); ?>
@@ -50,7 +50,5 @@
 		
 		</div>
-
-        <br /><br />
-						 
+						
 		<?php if ($this->callMods('checkout_handlePayment') === true) { ?>
 				
@@ -72,5 +70,5 @@
 					<?php } ?>
 					 
- 					<?php if ((isset($p['hint']) && trim($p['hint']) != '') || wpsg_getFloat($p['price']) > 0) { ?>
+ 					<?php if ((isset($p['hint']) && trim($p['hint']) != '') || $p['price'] > 0) { ?>					
 					<div id="payment_<?php echo $p['id']; ?>_hint" class="shippay_hint">
 						<?php if ($p['price'] > 0) { ?>
@@ -98,6 +96,6 @@
 		<?php $this->callMods('checkout2_inner_prebutton', array(&$this->view)); ?>
 		
+		<input type="submit" class="wpsg_button wpsg_checkoutbutton" value="<?php echo __('zurÃŒck', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
 		<input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_overviewbutton" value="<?php echo __('weiter', 'wpsg'); ?>" name="wpsg_checkout2" />
-		<input type="submit" class="wpsg_button wpsg_checkoutbutton" value="<?php echo __('zurÃŒck', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
 	
 		<div class="wpsg_clear"></div>
@@ -105,9 +103,5 @@
 	</form>
 	
-	<div style="position:fixed; left:0; top:0; width:100vw; height:100vh; background-color:rgba(255, 255, 255, 0.5); display:none;" id="pppl_loading_blocker"></div>
-	
 	<script type="text/javascript">/* <![CDATA[ */
-
-		const el_pppl_loading_blocker = document.getElementById('pppl_loading_blocker');
 
 		function wpsg_setShipPay(jqElement)
@@ -120,19 +114,13 @@
 
 			return true;
-
+			
 		}
-
+    
 		jQuery(document).ready(function() {
 
 			jQuery('.shippay_wrap .shippay_item_wrap').bind('click', function() {
 
-                if (jQuery(event.target).is('input, textarea, select')) {
-                    return;
-                }
-
-				el_pppl_loading_blocker.style.display = 'block';
-
-				wpsg_setShipPay(jQuery(this));
-
+				wpsg_setShipPay(jQuery(this)); 
+				
 				jQuery.ajax( {
 					'url': wpsg_ajax.ajaxurl,
@@ -140,14 +128,10 @@
 					'data': {
 						'wpsg[action]': 'updateCheckout',
-						'wpsg_form_data': jQuery('#wpsg_checkout_form').serialize()
+						'wpsg_form_data': jQuery('#wpsg_checkout_form').serialize()						
 					},
 					'async': true,
-					'success': function(data) {
-
-						location.reload();
-
-					}
+					'success': function(data) { }
 				} );
-
+				 
 			} );
 
@@ -155,9 +139,9 @@
 
 				if (jQuery(this).find('input[type="radio"]').prop('checked')) wpsg_setShipPay(jQuery(this));
-
+				
 			} );
-
+			 		 	
 		} );
-
+			
 	/* ]]> */</script>
 
Index: /views/warenkorb/customerquestion.phtml
===================================================================
--- /views/warenkorb/customerquestion.phtml	(revision 8528)
+++ /views/warenkorb/customerquestion.phtml	(revision 5261)
@@ -49,3 +49,43 @@
 <script type="text/javascript">/* <![CDATA[ */
 
+	jQuery(window).resize(function() {
+
+		// Hintergrund vom Body ÃŒbernehmen
+		jQuery('#wpsg_calc_layer .content').css( { 'background-color': jQuery('body').css('background-color') } );
+		 
+		if (jQuery(window).width() < 600)
+		{
+
+			var layer_width = jQuery(window).width() - 50;
+									
+			jQuery('#wpsg_calc_layer .content').css( {
+				'width': layer_width + 'px',
+				'margin-left': (-1 * (layer_width / 2)) + 'px'
+			} );
+
+		}
+
+		var layer_height = jQuery('#wpsg_calc_layer .content').height();
+		
+		if (jQuery(window).height() < layer_height)
+		{
+
+			jQuery('#wpsg_calc_layer .content').css( {
+				'margin-top': '25px;',
+				'top': '0px'				
+			} );
+			
+		}
+		else
+		{
+
+			jQuery('#wpsg_calc_layer .content').css( {
+				'margin-top': (-1 * (layer_height / 2)) + 'px',
+				'top': '50%'
+			} );
+
+		}
+		
+	} ).resize();
+
 /* ]]> */</script>
Index: /views/warenkorb/done.phtml
===================================================================
--- /views/warenkorb/done.phtml	(revision 8528)
+++ /views/warenkorb/done.phtml	(revision 5261)
@@ -1,8 +1,8 @@
-<?php
+<?php 
 
-/**
+	/**
 	 * Template, welches nach erfolgreicher Bestellung angezeigt wird
 	 */
- 
+
 	/*
 	BestellID: <?php echo $this->view['o_id']; ?>
@@ -21,5 +21,5 @@
 	Vorname des Kunden: <?php echo $this->view['basket']['checkout']['vname']; ?>
 	E-Mail des Kunden: <?php echo $this->view['basket']['checkout']['email']; ?>
-	StraÃe des Kunden: <?php echo $this->view['basket']['checkout']['strasse']; ?>
+	Strasse des Kunden: <?php echo $this->view['basket']['checkout']['strasse']; ?>
 	Ort des Kunden: <?php echo $this->view['basket']['checkout']['ort']; ?>
 	PLZ des Kunden: <?php echo $this->view['basket']['checkout']['plz']; ?>
@@ -33,10 +33,6 @@
 	Zahlungsart: <?php echo $this->arShipping[$this->view['basket']['checkout']['payment']]['name']; ?>
 	Versandart: <?php echo $this->arShipping[$this->view['basket']['checkout']['shipping']]['name']; ?>
-    Berechnungs-Array: <?php var_dump(wpsg_calculation::getOrderCalculation($this->view['o_id'])->getCalculationArray()['sum']); ?>
 	*/
-
-namespace wpsg;
-use wpsg_order;
-
+	
 ?>
 <div class="wpsg wpsg_done">
@@ -46,5 +42,5 @@
 	<p><?php echo __('Vielen Dank fÃŒr Ihre Bestellung!', 'wpsg'); ?></p>
 	<p><?php $this->callMods('order_done', array(&$this->view['o_id'], &$this->view)); ?></p>
-	
+		
 	<br />
 	<div class="wpsg_clear"></div>
Index: /views/warenkorb/index.phtml
===================================================================
--- /views/warenkorb/index.phtml	(revision 8528)
+++ /views/warenkorb/index.phtml	(revision 5261)
@@ -11,79 +11,76 @@
  
 	<?php if ($this->view['countArtikel'] > 0) { ?> 
-		<?php echo $this->view['countArtikel']; ?> <?php echo __("Artikel fÃŒr", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?> <?php echo __("im Warenkorb", "wpsg"); ?>
-		<br /><br />
-		<form method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>">
+	<?php echo $this->view['countArtikel']; ?> <?php echo __("Artikel fÃŒr", "wpsg"); ?> <?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?> <?php echo __("im Warenkorb", "wpsg"); ?>
+	<br /><br />
+	<form method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>">
+	
+		<input type="hidden" name="subaction" value="index" />
+	
+		<table>		
+			<?php foreach ($this->view['basket']['produkte'] as $p) { ?>
+			<tr> 
+				<td class="wpsg_cell_name"><a href="<?php echo $this->getProduktLink($p); ?>">
+					<?php 
+					
+						echo $p['menge'].' x '.((strlen($p['name']) > 13)?mb_substr($p['name'], 0, 30).'..':$p['name']);
+						
+					?></a>
+				</td>
+				<td class="wpsg_cell_amount">
+					<?php
+					 
+						echo wpsg_ff(($p['preis'] * $p['menge']), $this->get_option('wpsg_currency'));
+						 
+					?>
+				</td>
+			</tr>
+			<?php } ?>
+			<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && wpsg_tf($this->view['basket']['sum']['preis_rabatt']) > 0) { ?>
+			<tr>
+				<td class="wpsg_cell_name">
+					<?php echo __('Rabatt', 'wpsg'); ?>	
+				</td>
+				<td class="wpsg_cell_amount">
+					<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
+				</td>
+			</tr>
+			<?php } ?>
+			<?php if (isset($this->view['basket']['gs'])) { // Gutschein vorhanden ?>
+			<tr>
+				<td class="wpsg_cell_name">
+					<?php echo __('Gutschein', 'wpsg'); ?>
+					<?php if ($this->view['basket']['gs']['calc'] == 'p') { ?>
+					(<?php echo $this->view['basket']['gs']['value']; ?>%)
+					<?php } ?>
+				</td>
+				<td class="wpsg_cell_amount">
+					<?php 
+						
+						echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency'));
+						
+					?>
+				</td>
+			</tr>
+			<?php } ?>
+			<tr class="wpsg_row_summary">
+				<td class="wpsg_cell_name"><?php echo __("Gesamt", "wpsg"); ?>:</td>
+				<td class="wpsg_cell_amount"><?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?></td>
+			</tr>
+		</table>
+	</form>
+	<br />
 		
-			<input type="hidden" name="subaction" value="index" />
-		
-			<table>		
-				<?php foreach ($this->view['basket']['produkte'] as $p) { ?>
-				<tr> 
-					<td class="wpsg_cell_name"><a href="<?php echo $this->getProduktLink($p); ?>">
-						<?php 
-						
-							echo $p['menge'].' x '.((strlen($p['name']) > 13)?mb_substr($p['name'], 0, 30).'..':$p['name']);
-							
-						?></a>
-					</td>
-					<td class="wpsg_cell_amount">
-						<?php
-						 
-							echo wpsg_ff(($p['preis'] * $p['menge']), $this->get_option('wpsg_currency'));
-							 
-						?>
-					</td>
-				</tr>
-				<?php } ?>
-				<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && wpsg_tf($this->view['basket']['sum']['preis_rabatt']) > 0) { ?>
-				<tr>
-					<td class="wpsg_cell_name">
-						<?php echo __('Rabatt', 'wpsg'); ?>	
-					</td>
-					<td class="wpsg_cell_amount">
-						<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
-					</td>
-				</tr>
-				<?php } ?>
-				<?php if (isset($this->view['basket']['gs'])) { // Gutschein vorhanden ?>
-				<tr>
-					<td class="wpsg_cell_name">
-						<?php echo __('Gutschein', 'wpsg'); ?>
-						<?php if ($this->view['basket']['gs']['calc'] == 'p') { ?>
-						(<?php echo $this->view['basket']['gs']['value']; ?>%)
-						<?php } ?>
-					</td>
-					<td class="wpsg_cell_amount">
-						<?php 
-							
-							echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency'));
-							
-						?>
-					</td>
-				</tr>
-				<?php } ?>
-				<tr class="wpsg_row_summary">
-					<td class="wpsg_cell_name"><?php echo __("Gesamt", "wpsg"); ?>:</td>
-					<td class="wpsg_cell_amount"><?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?></td>
-				</tr>
-			</table>
-		</form> 
-			
-		<span class="wpsg_tax_note">
-			<?php if (trim($this->view['wpsg_versandhinweis']) != '') { ?>
-				<i><?php echo $this->view['wpsg_versandhinweis']; ?></i><br />
-			<?php } else if ($this->get_option("wpsg_kleinunternehmer") == "1" || $this->getFrontendTaxview() == WPSG_NETTO) { ?>
-				<i><?php echo __("Alle Preise zzgl. ", "wpsg"); ?><a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>"><?php echo __("Versandkosten", "wpsg"); ?></a>.</i>
-			<?php } else { ?>
-				<i><?php echo __("Alle Preise inklusive MwSt. und zzgl.", "wpsg"); ?> <a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>"><?php echo __("Versandkosten", "wpsg"); ?></a></i><br />
-			<?php } ?>
-		</span>
-
-        <?php if (get_the_ID() !== intval($this->get_option('wpsg_page_basket')) || (($_REQUEST['wpsg']['action']??'') === 'widget')) { ?>
-		<input type="button" class="button wpsg_button wpshopgermany_linktokasse" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController:: URL_BASKET); ?>';" value="<?php echo __("Zum Warenkorb", "wpsg"); ?>" />
-        <?php } ?>
-
+	<?php if (trim($this->view['wpsg_versandhinweis']) != '') { ?>
+	<i><?php echo $this->view['wpsg_versandhinweis']; ?></i><br />
+	<?php } else if ($this->get_option("wpsg_kleinunternehmer") == "1" || $this->getFrontendTaxview() == WPSG_NETTO) { ?>
+	<i><?php echo __("Alle Preise zzgl. ", "wpsg"); ?><a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>"><?php echo __("Versandkosten", "wpsg"); ?></a>.</i>
 	<?php } else { ?>
-		<?php echo __("Keine Artikel im Warenkorb", "wpsg"); ?><br />
+	<i><?php echo __("Alle Preise inklusive MwSt. und zzgl.", "wpsg"); ?> <a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>"><?php echo __("Versandkosten", "wpsg"); ?></a></i><br />
+	<?php } ?>
+	<?php if ($this->get_option('wpsg_page_basket') != get_the_ID() || isset($_REQUEST['produkt_id'])) { ?>
+	<input type="button" class="wpsg_button wpshopgermany_linktokasse" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController:: URL_BASKET); ?>';" value="<?php echo __("Zum Warenkorb", "wpsg"); ?>" />
+	<?php } ?>
+	<?php } else { ?>
+	<?php echo __("Keine Artikel im Warenkorb", "wpsg"); ?><br />
 	<?php } ?>
 	
@@ -98,27 +95,22 @@
 	
 	<ul>
-		<?php if ($this->hasMod('wpsg_mod_request') == '1') { ?>
-			<?php if ($this->view['widget_settings']['wpsg_requestpage'] == 1) { ?>
-				<li class="page_item"><a href="<?php echo $this->f(wpsg_ShopController::URL_REQUEST); ?>"><?php echo get_the_title($this->get_option('wpsg_page_request')); ?></a></li>
-			<?php } ?>
+		<?php if ($this->view['wpsg_widgetsettings']['wpsg_agbpage'] == 1) { ?>
+		<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_AGB); ?>"><?php echo get_the_title($this->get_option('wpsg_page_agb')); ?></a></li>
 		<?php } ?>
-		<?php if ($this->view['widget_settings']['wpsg_agbpage'] == 1) { ?>
-			<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_AGB); ?>"><?php echo get_the_title($this->get_option('wpsg_page_agb')); ?></a></li>
+		<?php if ($this->view['wpsg_widgetsettings']['wpsg_wrpage'] == 1) { ?>
+		<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_WIDERRUF); ?>"><?php echo get_the_title($this->get_option('wpsg_page_widerrufsbelehrung')); ?></a></li>
 		<?php } ?>
-		<?php if ($this->view['widget_settings']['wpsg_wrpage'] == 1) { ?>
-			<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_WIDERRUF); ?>"><?php echo get_the_title($this->get_option('wpsg_page_widerrufsbelehrung')); ?></a></li>
-		<?php } ?>
-		<?php if ($this->view['widget_settings']['wpsg_dspage'] == 1) { ?>
-			<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_DATENSCHUTZ); ?>"><?php echo get_the_title($this->get_option('wpsg_page_datenschutz')); ?></a></li>
+		<?php if ($this->view['wpsg_widgetsettings']['wpsg_dspage'] == 1) { ?>
+		<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_DATENSCHUTZ); ?>"><?php echo get_the_title($this->get_option('wpsg_page_datenschutz')); ?></a></li>
 		<?php } ?>
 		
-		<?php if ($this->view['widget_settings']['wpsg_vkpage'] == 1) { ?>
-			<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>"><?php echo get_the_title($this->get_option('wpsg_page_versand')); ?></a></li>
+		<?php if ($this->view['wpsg_widgetsettings']['wpsg_vkpage'] == 1) { ?>
+		<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN); ?>"><?php echo get_the_title($this->get_option('wpsg_page_versand')); ?></a></li>
 		<?php } ?>
-		<?php if ($this->view['widget_settings']['wpsg_odrpage'] == 1) { ?>
-			<li class="page_item"><a href="http://ec.europa.eu/consumers/odr/"><?php echo __('Online Streitbeilegung', 'wpsg'); ?></a></li>
+		<?php if ($this->view['wpsg_widgetsettings']['wpsg_odrpage'] == 1) { ?>
+		<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_ONLINE_DISPUTE_RESOLUTION); ?>"><?php echo __('Online Streitbeilegung', 'wpsg'); ?></a></li>
 		<?php } ?>
-		<?php if ($this->view['widget_settings']['wpsg_imppage'] == 1) { ?>
-			<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_IMPRESSUM); ?>"><?php echo get_the_title($this->get_option('wpsg_page_impressum')); ?></a></li>
+		<?php if ($this->view['wpsg_widgetsettings']['wpsg_imppage'] == 1) { ?>
+		<li class="page_item"><a href="<?php echo $this->getURL(wpsg_ShopController::URL_IMPRESSUM); ?>"><?php echo get_the_title($this->get_option('wpsg_page_impressum')); ?></a></li>
 		<?php } ?>
 	</ul>
Index: ews/warenkorb/kundendaten_renderfield.phtml
===================================================================
--- /views/warenkorb/kundendaten_renderfield.phtml	(revision 8528)
+++ 	(revision )
@@ -1,25 +1,0 @@
-<?php
-
-	/**
-	 * Zeichnet eine einzelne Kundenvariable innerhalb des checkout.phtml	  
-	 */
-
-?>
-<div class="wpsg_checkoutblock">
-	<label class="wpsg_cv" for="wpsg_cv_<?php echo $this->view['field']['id']; ?>">
-		<?php echo wpsg_hspc(__($this->view['field']['name'], 'wpsg')); ?><?php if ($this->view['field']['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
-		<?php if ($this->view['field']['typ'] == '0') { // Textfeld ?>
-		<input class="<?php echo (($this->view['field']['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$this->view['field']['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]" type="text" value="<?php echo $this->view['basket']['checkout']['custom'][$this->view['field']['id']]; ?>" />
-		<?php } else if ($this->view['field']['typ'] == '1') { $arAuswahl = explode("|", $this->view['field']['auswahl']); // Auswahlfeld ?>
-		<select class="<?php echo (($this->view['field']['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$this->view['field']['id'], (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]">
-			<option value="-1"><?php echo __('Bitte AuswÃ€hlen', 'wpsg'); ?></option>
-			<?php foreach ((array)$arAuswahl as $a) { ?>
-			<option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == $this->view['basket']['checkout']['custom'][$this->view['field']['id']])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
-			<?php } ?>
-		</select>
-		<?php } else if ($this->view['field']['typ'] == '2') { // Checkbox ?>
-		<input type="hidden" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]" value="0" />
-		<input class="<?php echo (($this->view['field']['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $this->view['field']['id']; ?>]" value="1" <?php echo (($this->view['basket']['checkout']['custom'][$this->view['field']['id']] == '1')?'checked="checked"':''); ?> />
-		<?php } ?>
-	</label>
-</div>
Index: ews/warenkorb/messageDialog.phtml
===================================================================
--- /views/warenkorb/messageDialog.phtml	(revision 8528)
+++ 	(revision )
@@ -1,33 +1,0 @@
-<?php
-
-	/**
-	 * Template wird verwendet wenn Meldungen vom Shop nicht ausgegeben werden konnte.
-	 * Beispielsweise wenn Produktvariable auf einem Produkttemplate abgefragt und Pflichtfeld ist 
-	 */
-
-?>
-
-<div id="wpsg_ajax_layer">
-	 
-	<div class="wpsg_ajax_message_content">
-		<?php echo $this->writeFrontendMessage(); $this->clearFrontendMessage(); ?>	
-		<?php echo wpsg_getStr($this->view['content']); ?>
-		<br />
-		<a id="wpsg_basket_messageDialog_closeButton" class="fa fa-times"></a>			
-	</div> 
-					
-	<script type="text/javascript">/* <![CDATA[ */
-	
-		jQuery(document).ready(function() {
-	
-			jQuery('#wpsg_basket_messageDialog_closeButton, #wpsg_ajax_layer').bind('click', function() {
-				 
-				jQuery('#wpsg_ajax_layer').remove();
-				
-			} );
-			
-		} );
-												
-	/* ]]> */</script>
-	
-</div>
Index: /views/warenkorb/overview.phtml
===================================================================
--- /views/warenkorb/overview.phtml	(revision 8528)
+++ /views/warenkorb/overview.phtml	(revision 5261)
@@ -3,10 +3,9 @@
 	/**
 	 * Template fÃŒr die Zusammenfassung der Bestellung
-	 * Anzeige vor dem Abschluss einer Bestellung
+	 * Anzeige vor dem AbschluÃ einer Bestellung
 	 */
 
-	if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
-	else $display_brutto_netto = 'netto';
-
+	//wpsg_debug($this->view['basket']);
+ 
 ?>
 <div class="wpsg wpsg_overview">
@@ -14,29 +13,26 @@
 	<?php echo $this->writeFrontendMessage(); ?>
 
-	<?php if ($this->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1)) { ?>
-	<?php } else {?>
-		<?php $GLOBALS['step'] = 4; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
-	<?php } ?>
-
-	<form method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>" id="wpsg_form">
+	<?php $GLOBALS['step'] = 4; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
+
+	<form method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>">
 
 		<h2><?php echo __('Zusammenfassung', 'wpsg'); ?></h2>
-
+		
 		<div class="wpsg_spacer"></div>
-
+		
 		<?php if (!$this->hasMod('wpsg_mod_ordercondition')) { ?>
 		<div class="wpsg_agb">
 			<label>
-				<input type="checkbox" value="1" name="wpsg[agb]" required />
-				<?php echo wpsg_translate(__('Ich habe die #1# des Anbieters gelesen und erklÃ€re mit dem Absenden der Bestellung mein EinverstÃ€ndnis. Die #2# habe ich zur Kenntnis genommen.', 'wpsg'),
-					'<a target="_blank" href="'.$this->getURL(wpsg_ShopController::URL_AGB).'">'.__('AGB', 'wpsg').'</a>',
-					'<a target="_blank" href="'.$this->getURL(wpsg_ShopController::URL_WIDERRUF).'">'.__('Widerrufsbelehrung', 'wpsg').'</a>');
+				<input type="checkbox" value="1" name="wpsg[agb]" />
+				<?php echo wpsg_translate(__('Ich habe die #1# des Anbieters gelesen und erklÃ€re mit dem Absenden der Bestellung mein EinverstÃ€ndnis. Die #2# habe ich zur Kenntnis genommen.', 'wpsg'), 
+					'<a target="_blank" href="'.$this->getURL(wpsg_ShopController::URL_AGB).'">'.__('AGB', 'wpsg').'</a>', 
+					'<a target="_blank" href="'.$this->getURL(wpsg_ShopController::URL_WIDERRUF).'">'.__('Widerrufsbelehrung', 'wpsg').'</a>'); 
 				?>
 			</label>
-		</div>
+		</div> 
 		<?php } ?>
-
+		
 		<?php $this->callMods('overview_top', array(&$this->view['basket'])); ?>
-
+				
 		<div class="shippayment">
 			<div class="subtitle"><?php echo __('Zahlung/Versand', 'wpsg'); ?>&nbsp;
@@ -46,451 +42,243 @@
 			<div class="shipping"><?php echo wpsg_hspc($this->arShipping[$this->view['basket']['checkout']['shipping']]['name']); ?></div>
 		</div>
-
-		<?php
-			$arAnrede = explode('|', $this->get_option('wpsg_admin_pflicht')['anrede_auswahl']);
-		?>
-
-		<?php if (wpsg_getStr($this->view['basket']['checkout']['diff_shippingadress']) == '1') { ?>
+		
+		<?php if ($this->view['basket']['checkout']['diff_shippingadress'] == '1') { ?>
 		<div class="anschrift">
 			<div class="subtitle"><?php echo __('Rechnungsanschrift', 'wpsg'); ?>&nbsp;
 				<span class="sublink"><?php echo wpsg_translate(__('[<a href="#1#">Ãndern</a>]', 'wpsg'), $this->getURL(wpsg_ShopController::URL_CHECKOUT)); ?></span>
 			</div>
-			<?php if ($this->view['pflicht']['firma'] != '2') { ?>
-				<?php if (trim($this->view['basket']['checkout']['firma']) != '') { ?>
-					<?php echo wpsg_hspc($this->view['basket']['checkout']['firma']); ?><br />
-				<?php } ?>
+			<?php if (trim($this->view['basket']['checkout']['firma']) != '') { ?>			
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['firma']); ?><br />
 			<?php } ?>
-			<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-				<?php echo wpsg_hspc(($this->view['basket']['checkout']['title'] != '' && $this->view['basket']['checkout']['title'] != '-1')?$arAnrede[$this->view['basket']['checkout']['title']]:''); ?> 		
-			<?php } ?>
-			<?php if ($this->view['pflicht']['vname'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['vname']); ?> 
-			<?php } ?>
-			<?php if ($this->view['pflicht']['name'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['name']); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['strasse'].rtrim(' '.wpsg_getStr($this->view['basket']['checkout']['nr']))); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['plz'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['plz']); ?> 
-			<?php } ?>
-			<?php if ($this->view['pflicht']['ort'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['ort']); ?><br />
-			<?php }?>
-			<?php if ($this->view['pflicht']['land'] != '2') { ?>
-				<?php if (wpsg_isSizedArray($this->view['basket']['land'])) { ?>
-					<?php echo wpsg_hspc($this->view['basket']['land']['name']); ?>
-				<?php } ?>
-			<?php } ?>
-		</div>
+			<?php echo wpsg_hspc(($this->view['basket']['checkout']['title'] != '' && $this->view['basket']['checkout']['title'] != '-1')?$this->view['basket']['checkout']['title']:''); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['vname']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['name']); ?><br />
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['strasse']); ?><br />
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['plz']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['ort']); ?><br />
+			<?php if (wpsg_isSizedArray($this->view['basket']['land'])) { ?>
+			<?php echo wpsg_hspc($this->view['basket']['land']['name']); ?>
+			<?php } ?>					
+		</div>		
 		<div class="wpsg_clear"></div><br />
-
+					
 		<div class="anschrift">
 			<div class="subtitle"><?php echo __('Lieferanschrift', 'wpsg'); ?>&nbsp;
 				<span class="sublink"><?php echo wpsg_translate(__('[<a href="#1#">Ãndern</a>]', 'wpsg'), $this->getURL(wpsg_ShopController::URL_CHECKOUT)); ?></span>
 			</div>
-			<?php if ($this->view['pflicht']['firma'] != '2') { ?>
-				<?php if (trim($this->view['basket']['checkout']['shipping_firma']) != '') { ?>
-					<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_firma']); ?><br />
-				<?php } ?>
+			<?php if (trim($this->view['basket']['checkout']['shipping_firma']) != '') { ?>			
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_firma']); ?><br />
 			<?php } ?>
-			<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-				<?php echo (($this->view['basket']['checkout']['shipping_title'] != '' && $this->view['basket']['checkout']['shipping_title'] != '-1')?$arAnrede[$this->view['basket']['checkout']['shipping_title']]:''); ?> 
-			<?php } ?>
-			<?php if ($this->view['pflicht']['vname'] != '2') { ?>	
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_vname']); ?> 
-			<?php } ?>
-			<?php if ($this->view['pflicht']['name'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_name']); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_strasse'].rtrim(' '.($this->view['basket']['checkout']['shipping_nr']))); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['plz'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_plz']); ?> 
-			<?php } ?>
-			<?php if ($this->view['pflicht']['ort'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_ort']); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['land'] != '2') { ?>
-				<?php if (wpsg_isSizedArray($this->view['basket']['shipping_land'])) { ?>
-					<?php echo wpsg_hspc($this->view['basket']['shipping_land']['name']); ?>
-				<?php } ?>
-			<?php } ?>
-		</div>
+			<?php echo (($this->view['basket']['checkout']['shipping_title'] != '' && $this->view['basket']['checkout']['shipping_title'] != '-1')?$this->view['basket']['checkout']['shipping_title']:''); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_vname']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_name']); ?><br />
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_strasse']); ?><br />
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_plz']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['shipping_ort']); ?><br />
+			<?php if (wpsg_isSizedArray($this->view['basket']['shipping_land'])) { ?>
+			<?php echo wpsg_hspc($this->view['basket']['shipping_land']['name']); ?>
+			<?php } ?>		
+		</div>		
 		<div class="wpsg_clear"></div><br />
-
+		
 		<?php } else { ?>
-
+					
 		<div class="anschrift">
 			<div class="subtitle"><?php echo __('Liefer- und Rechnungsanschrift', 'wpsg'); ?>&nbsp;
-				<?php if ($this->hasMod('wpsg_mod_onepagecheckout') && ($this->get_option('wpsg_mod_onepagecheckout_basket') == 1)) { ?>
 				<span class="sublink"><?php echo wpsg_translate(__('[<a href="#1#">Ãndern</a>]', 'wpsg'), $this->getURL(wpsg_ShopController::URL_CHECKOUT)); ?></span>
-				<?php } else { ?>
-				<span class="sublink"><?php echo wpsg_translate(__('[<a href="#1#">Ãndern</a>]', 'wpsg'), $this->getURL(wpsg_ShopController::URL_CHECKOUT)); ?></span>
-				<?php } ?>
-			</div>
-			<?php if ($this->view['pflicht']['firma'] != '2') { ?>
-				<?php if (trim($this->view['basket']['checkout']['firma']) != '') { ?>
-					<?php echo wpsg_hspc($this->view['basket']['checkout']['firma']); ?><br />
-				<?php } ?>
+			</div>
+			<?php if (trim($this->view['basket']['checkout']['firma']) != '') { ?>			
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['firma']); ?><br />
 			<?php } ?>
-			<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
-				<?php echo wpsg_hspc(($this->view['basket']['checkout']['title'] != '' && $this->view['basket']['checkout']['title'] != '-1')?$arAnrede[$this->view['basket']['checkout']['title']]:''); ?>
-			<?php } ?> 
-			<?php if ($this->view['pflicht']['vname'] != '2') { ?>
-				<?php echo $this->view['basket']['checkout']['vname']; ?>
-			<?php } ?>
-			<?php if ($this->view['pflicht']['name'] != '2') { ?>
-				<?php echo $this->view['basket']['checkout']['name']; ?><br />
-			<?php } ?>	
-			<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['strasse'].rtrim(' '.wpsg_getStr($this->view['basket']['checkout']['nr']))); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['plz'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['plz']); ?>
-			<?php } ?>
-			<?php if ($this->view['pflicht']['ort'] != '2') { ?>
-				<?php echo wpsg_hspc($this->view['basket']['checkout']['ort']); ?><br />
-			<?php } ?>
-			<?php if ($this->view['pflicht']['land'] != '2') { ?>
-				<?php if (wpsg_isSizedArray($this->view['basket']['land'])) { ?>
-					<?php echo wpsg_hspc($this->view['basket']['land']['name']); ?>
-				<?php } ?>
-			<?php } ?>
-		</div>
+			<?php echo wpsg_hspc(($this->view['basket']['checkout']['title'] != '' && $this->view['basket']['checkout']['title'] != '-1')?$this->view['basket']['checkout']['title']:''); ?> <?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?><br />
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['strasse']); ?><br />
+			<?php echo wpsg_hspc($this->view['basket']['checkout']['plz']); ?> <?php echo wpsg_hspc($this->view['basket']['checkout']['ort']); ?><br />
+			<?php if (wpsg_isSizedArray($this->view['basket']['land'])) { ?>
+			<?php echo wpsg_hspc($this->view['basket']['land']['name']); ?>
+			<?php } ?>							
+		</div>		
 		<div class="wpsg_clear"></div><br />
 		<?php } ?>
-
+		
 		<?php if (wpsg_isSizedString($this->view['basket']['checkout']['ustidnr'])) { ?>
 		<?php echo __('UStIdNr.', 'wpsg'); ?>: <?php echo wpsg_hspc($this->view['basket']['checkout']['ustidnr']); ?><br /><br />
 		<?php } ?>
-		
-		<?php if (trim($this->view['basket']['checkout']['email_einvoice']??'') !== '') { ?>
-		<div class="einvoice_input">
-			<span><?php echo __('E-Mail fÃŒr eRechnung:', 'wpsg'); ?></span>
-			<span><?php echo $this->view['basket']['checkout']['email_einvoice']; ?></span>
-		</div>
-		<?php } ?>
-
+	
 		<div class="subtitle">
 			<?php echo __('Bestellte Produkte', 'wpsg'); ?>&nbsp;
 			<span class="sublink"><?php echo wpsg_translate(__('[<a href="#1#">Ãndern</a>]', 'wpsg'), $this->getURL(wpsg_ShopController::URL_BASKET)); ?></span>
 		</div>
-
+		
 		<div class="wpsg_table_wrap">
-
-			<?php $i = 0; foreach ($this->view['basket']['produkte'] as $k => $product_data) { $i ++; ?>
-
-			<div class="overview_product_row">
-
-				<?php $this->view['$bPicture'] = false; ?>
-
-				<?php if ($this->get_option('wpsg_imagehandler_basketimage') == '1') {
-
-				?>
-				<div class="productimage">
-
-					<?php
-
-					if (isset($product_data['product_key'])) {
-						$arAttachmentIDs = $this->imagehandler->getAttachmentIDs($product_data['product_key']);
-						$attachmentID = $this->imagehandler->getAttachmentID($product_data['product_key']);
-						
-						echo wp_get_attachment_image($attachmentID, 'medium');
-						
-					}
-					if ($attachmentID > 0) $this->view['$bPicture'] = true;
-					
-					?>
-
-				</div>
-				<?php } ?>
-
-				<div class="product_content">
-
-					<div class="product_name">
-						<?php if ($this->getProduktLink($product_data)) { ?>
-						<a href="<?php echo $this->getProduktLink($product_data); ?>"><?php echo wpsg_hspc((($product_data['detailname'] != '')?$product_data['detailname']:$product_data['name'])); ?></a>
+			<table class="wpsg_produkte">
+				<tr class="wpsg_kopf">
+					<th class="wpsg_cell_menge"><?php echo __("Anzahl", "wpsg"); ?></th>					
+					<th class="wpsg_cell_preis"><?php echo __('Einzelpreis', 'wpsg'); ?></th>
+					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+					<th class="wpsg_cell_mwst"><?php echo __("MwSt.", "wpsg"); ?></th>
+					<?php } ?>
+					<th class="wpsg_cell_gesamtpreis"><?php echo __("Gesamtpreis", "wpsg"); ?></th>
+				</tr>
+				<?php $i = 0; foreach ($this->view['basket']['produkte'] as $produkt_key => $p) { $i ++; ?>
+				<?php $strOverviewRow = ''; ob_start(); $this->callMods('overview_row', array(&$p, $i)); $strOverviewRow = ob_get_contents(); ob_end_clean(); ?>
+				<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+					<td class="wpsg_cell_menge" rowspan="<?php echo 2 + substr_count($strOverviewRow, '<tr'); ?>">
+						<?php echo wpsg_hspc($p['menge']); ?>			
+					</td>					
+					<td class="wpsg_cell_preis"><?php echo wpsg_ff($p['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
+					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+					<td class="wpsg_cell_mwst"><?php echo wpsg_ff($p['mwst_value']); ?> %</td>				
+					<?php } ?>
+					<td class="wpsg_cell_gesamtpreis"><?php echo wpsg_ff($p['menge'] * $p['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?></td>
+				</tr>
+				<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_name">
+						<?php if ($this->get_option('wpsg_mod_produktbilder_overviewimage') == '1' && $this->hasMod('wpsg_mod_produktbilder')) { 
+							
+							if (wpsg_isSizedString($p['varianten_image'])) $arBilder = array($p['varianten_image']);						
+							else $arBilder = $this->callMod('wpsg_mod_produktbilder', 'getProduktBilder', array($this->getProduktID($p['id'])));  
+							
+						?>
+						<div class="wpsg_overview_productimage">
+							<img src="<?php echo $this->callMod('wpsg_mod_produktbilder', 'makeTn', array($this->getProduktID($p['id']), $arBilder[0], 30, 30, 'c')); ?>" alt="<?php echo wpsg_hspc((($p['detailname'] != '')?$p['detailname']:$p['name'])); ?>" />
+						</div>
+						<?php } ?>
+						<?php if ($this->getProduktLink($p)) { ?>
+						<a href="<?php echo $this->getProduktLink($p); ?>"><?php echo wpsg_hspc((($p['detailname'] != '')?$p['detailname']:$p['name'])); ?></a>
 						<?php } else { ?>
-						<?php echo wpsg_hspc((($product_data['detailname'] != '')?$product_data['detailname']:$product_data['name'])); ?>
+						<?php echo wpsg_hspc((($p['detailname'] != '')?$p['detailname']:$p['name'])); ?>
+						<?php } ?>	
+					</td>
+				</tr>
+				<?php echo $strOverviewRow; ?>
+				<?php } ?>
+				<?php  if (isset($this->view['basket']['gs'])) { ?>
+				<tr class="wpsg_row_gutschein"> 
+					<td class="wpsg_cell_menge" rowspan="2">1</td>					
+					<td class="wpsg_cell_preis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?></td>
+					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+					<td class="wpsg_cell_mwst"><?php echo __('anteilig', 'wpsg'); ?></td>
+					<?php } ?>
+					<td class="wpsg_cell_gesamtpreis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['gs'], $this->get_option('wpsg_currency')); ?></td>
+				</tr>
+				<tr class="wpsg_row_gutschein">				
+					<td class="wpsg_cell_name" colspan="<?php echo $this->view['colspan']; ?>"><?php echo __('Gutschein', 'wpsg'); ?> <?php echo ($this->view['basket']['gs']['code'] != '')? '('.$this->view['basket']['gs']['code'].')':'' ?></td>
+				</tr>
+				<?php } ?>
+				<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && wpsg_tf($this->view['basket']['sum']['preis_rabatt']) > 0) { ?>
+				<tr class="wpsg_row_discount">
+					<td class="wpsg_cell_menge" rowspan="2"></td>					
+					<td class="wpsg_cell_preis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?></td>					
+					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+					<td class="wpsg_cell_mwst"><?php echo __('anteilig', 'wpsg'); ?></td>
+					<?php } ?>
+					<td class="wpsg_cell_gesamtpreis"><?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?></td>
+				</tr>
+				<tr class="wpsg_row_discount">
+					<td class="wpsg_cell_name" colspan="<?php echo $this->view['colspan']; ?>"><?php echo __('Rabatt', 'wpsg'); ?></td>
+				</tr>
+				<?php } ?>
+				<tr class="wpsg_row_summe">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
+						<?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
+							<?php echo wpsg_translate(__('Summe (zzgl. #1#)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
+						<?php } else { ?>					
+							<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
+							<?php echo wpsg_translate(__('Summe (zzgl. #1#, zzgl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
+							<?php } else { ?>
+							<?php echo wpsg_translate(__('Summe (zzgl. #1#, inkl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
+							<?php } ?>
 						<?php } ?>
-
-						<?php if (wpsg_isSizedString($product_data['shortdesc'])) { ?>
-						<div class="product_shortdesc"><?php echo $product_data['shortdesc']; ?></div>
-						<?php } ?>
-
-					</div>
-
-					<div class="product_action">
-						<div class="title">
-							<?php echo __("Anzahl", "wpsg"); ?>
-						</div>
-						<div class="amount">
-							<?php echo wpsg_hspc($product_data['menge']); ?>
-						</div>
-					</div>
-
-                    <?php $this->callMods('overview_row_before', array(&$product_data, $i)); ?>
-
-					<div class="product_action">
-						<div class="title">
-							<?php echo __("Einzelpreis", "wpsg"); ?>
-						</div>
-						<div class="price">
-							<?php echo wpsg_ff($product_data['preis'], $this->get_option('wpsg_currency')); ?>
-						</div>
-					</div>
-					<div class="product_action">
-						<div class="title">
-							<?php echo __("Gesamtpreis", "wpsg"); ?>
-						</div>
-						<div class="price_total">
-							<?php echo wpsg_ff($product_data['menge'] * $product_data['preis'], $this->get_option('wpsg_currency')); ?>
-						</div>
-					</div>
-
-					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-					<div class="product_info">
-						<div
-						<?php if ($this->view['$bPicture'] == true) { ?>class="titlep"><?php } else { ?>class="title"><?php } ?>
-							<?php echo __("MwSt.", "wpsg"); ?>
-						</div>
-						<div class="valuer">
-							<?php echo wpsg_ff($product_data['mwst_value'], ' %'); ?>
-						</div>
-						<div class="dummyr">
-							<?php echo __('&nbsp;'); ?>
-						</div>
-
-					</div>
-					<?php } ?>
-
-					<?php $strOverviewRow= ''; ob_start(); $this->callMods('overview_row', array(&$product_data, $i)); $strOverviewRow= ob_get_contents(); ob_end_clean(); ?>
-					<?php echo $strOverviewRow; ?>
-
-				</div>
-
-			</div>
-			<?php }   // foreach products ?>
-
-		<div class="overview_sum_wrap">
-
-			<?php $bLine = false; ?>
-			<?php if (wpsg_isSizedArray($this->view['basket']['arCalculation']['voucher'])) { $bLine = true; ?>
-			
-				<?php foreach ($this->view['basket']['arCalculation']['voucher'] as $gs) { ?>
-
-					<div class="overview_sum_row">
-						<div class="title">
-							<?php echo __('Gutschein', 'wpsg'); ?> <?php echo ($gs['code'] != '')? '('.$gs['code'].')':'' ?>
-						</div>
-						<div class="value"><?php
-								
-							echo wpsg_ff($gs[$display_brutto_netto], $this->get_option('wpsg_currency'));
-							
-							if (strpos($gs['set'], '%') !== false) {
-								
-								echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($gs['set']), '%').')</span>';
-								
-							}
-							
-						?></div>
-					</div>
-					
-				<?php } ?>
-			
-			<?php } ?>
-			 
-			<div class="overview_sum_row">
-				<?php if (isset($this->view['basket']['sum']['preis_rabatt']) && wpsg_tf($this->view['basket']['sum']['preis_rabatt']) > 0) { ?>
-					<div class="title">
-						<?php echo __("Rabatt", "wpsg"); $bLine = true; ?>:
-					</div>
-					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-						<div class="value">
-							<?php echo __('anteilig', 'wpsg'); ?>
-						</div>
-					<?php } ?>
-						<div class="value">
-							<?php echo '-'.wpsg_ff($this->view['basket']['sum']['preis_rabatt'], $this->get_option('wpsg_currency')); ?>
-						</div>
-				<?php } ?>
-			</div>
-
-			<?php if ($bLine == true) { ?>
-				<div class="wpsg_spacer"></div>
-			<?php } ?>
-
-			<div class="overview_sum_row">
-				<div class="title2">
-					<?php if ($this->get_option("wpsg_kleinunternehmer") == "1") { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
-					<?php } else { ?>
-						<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#, zzgl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
-						<?php } else { ?>
-						<?php echo wpsg_translate(__('Summe (zzgl. #1#, inkl. MwSt.)', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>:
-						<?php } ?>
-					<?php } ?>
-				</div>
-				<div class="value">
-					<?php echo wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')); ?>
-				</div>
-			</div>
-
-			<?php if ($this->view['basket']['sum']['preis_shipping'] != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?>
-			<div class="overview_sum_row">
-				<div class="title">
+					</td>
+					<td class="wpsg_cell_summe_value">
+						<?php echo wpsg_ff($this->view['basket']['sum']['preis']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+					</td>
+				</tr>	
+				<?php if ($this->view['basket']['sum']['preis_shipping'] != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?>
+				<tr class="wpsg_row_shipping">
+					<td colspan="2" class="wpsg_cell_shipping_label">
 						<?php echo wpsg_translate(__('<a href="#1#">Versandkosten</a> (#2#)', 'wpsg'),
 							$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN),
 							$this->arShipping[$this->view['basket']['checkout']['shipping']]['name']
-						); ?>:
-
-				</div>
-				<div class="value">
-					
-					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') {
-						
-						$shipping_tax_key = $this->view['basket']['arCalculation']['shipping'][0]['tax_key'];
-						
-						if ($shipping_tax_key === '0') {
-							
-							echo __('anteilig', 'wpsg');
-							
-						} else {
-							
-							echo wpsg_ff($this->view['basket']['arCalculation']['tax'][$shipping_tax_key]['tax_value'], '%');
-							
-						}
-						
-					} ?>
-					
-				</div>
-				<div class="value">
-					<?php 
-						
-						echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency'));
-						
-						if (strpos(($this->view['basket']['arCalculation']['shipping'][0]['set']??''), '%') !== false) {
-							
-							echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($this->view['basket']['arCalculation']['shipping'][0]['set']), '%').')</span>';
-							
-						}
-						
-					?>
-				</div>
-			</div>
-			<?php } ?>
-
-			<?php /* Zeile fÃŒr Zahlungsart BEGIN */ ?>
-			<?php if (!$this->hasMod('wpsg_mod_crefopay') && ($this->get_option('wpsg_hideemptypayment') !== '1' || $this->view['basket']['sum']['preis_payment'] > 0)) { ?>
-				<div class="overview_sum_row">
-					<div class="title">
+						); ?>:								
+					</td>
+					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>										
+					<td class="wpsg_cell_mwst">
+					<?php if (isset($this->view['basket']['shipping']['tax_rata']) && $this->view['basket']['shipping']['tax_rata'] === true) { ?>
+					<?php echo __('anteilig', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php echo wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value'], '%'); ?>
+					<?php } ?>
+					</td>					
+					<?php } ?>
+					<td class="wpsg_cell_shipping_value">
+						<?php echo wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')); ?>
+					</td>
+				</tr>
+				<?php } ?>
+				<?php if ($this->view['basket']['sum']['preis_payment'] != 0 || $this->get_option('wpsg_hideemptypayment') != '1') { ?>
+				<tr class="wpsg_row_payment">
+					<td colspan="2" class="wpsg_cell_payment_label">
 						<?php echo wpsg_translate(__('Zahlungsart (#1#)', 'wpsg'), $this->arPayment[$this->view['basket']['checkout']['payment']]['name']); ?>:
-					</div>
-					<div class="value">
-						
-						<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') {
-							
-							$payment_tax_key = $this->view['basket']['arCalculation']['payment'][0]['tax_key'];
-							
-							if ($payment_tax_key === '0') {
-								
-								echo __('anteilig', 'wpsg');
-								
-							} else {
-								
-								echo wpsg_ff($this->view['basket']['arCalculation']['tax'][$payment_tax_key]['tax_value'], '%');
-								
-							}
-							
-						} ?> 
-						
-					</div>
-					<div class="value">
-						<?php 
-							
-							echo wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency'));
-							
-							if (strpos(wpsg_getStr($this->view['basket']['arCalculation']['payment'][0]['set']), '%') !== false) {
-								
-								echo '<span class="procent_payship">('.wpsg_ff(wpsg_tf($this->view['basket']['arCalculation']['payment'][0]['set']), '%').')</span>';
-								
-							}
-							
-						?>
-					</div>
-				</div>
-			<?php } ?>
-			<?php /* Zeile fÃŒr Zahlungsart ENDE */ ?>
-
-			<?php if (get_option("wpsg_kleinunternehmer") == "1") { ?>
-				<div class="overview_sum_row">
-					<div class="title2">
-						<?php echo get_option('wpsg_kleinunternehmer_text'); ?>
-					</div>
-					<div class="value">
-						<?php echo __('&nbsp;'); ?>
-					</div>
-				</div>
-
-				<div class="overview_sum_row">
-					<div class="title2">
+					</td>
+					<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
+					<td class="wpsg_cell_mwst">
+					<?php if (isset($this->view['basket']['payment']['tax_rata']) && $this->view['basket']['payment']['tax_rata'] === true) { ?>
+					<?php echo __('anteilig', 'wpsg'); ?>
+					<?php } else { ?>
+					<?php echo wpsg_ff($this->arPayment[$this->view['basket']['checkout']['payment']]['mwst_value'], '%'); ?>
+					<?php } ?>
+					</td>
+					<?php } ?>
+					<td class="wpsg_cell_payment_value">
+						<?php echo wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')); ?>
+					</td>
+				</tr>
+				<?php } ?>		
+				
+				<?php if ($this->get_option("wpsg_kleinunternehmer") == "1") { ?>
+				<tr class="wpsg_basket_kleinunternehmer">	
+					<td colspan="<?php echo $this->view['colspan'] + 1; ?>"><?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?></td>
+				</tr>		
+				<tr class="wpsg_row_gesamt">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_gesamt_label">
 						<?php echo __('Gesamtpreis', 'wpsg'); ?>:
-					</div>
-					<div class="sum">
+					</td>
+					<td class="wpsg_cell_gesamt_value">
+						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+					</td>
+				</tr>					
+				<?php } else { ?>		
+				<tr class="wpsg_row_gesamt">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_gesamt_label">
+						<?php echo __('Gesamtpreis (Netto)', 'wpsg'); ?>:
+					</td>
+					<td class="wpsg_cell_gesamt_value">
+						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_netto']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+					</td>
+				</tr>	
+				<?php foreach ($this->view['basket']['mwst'] as $mwst_id => $mwst) { ?>
+				<tr class="wpsg_row_mwst">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_mwst_label">
+						<?php echo wpsg_translate(__('zuzÃŒglich MwSt. (#1#)', 'wpsg'), $mwst['name']); ?>
+					</td>
+					<td class="wpsg_cell_mwst_value">
+						<?php echo wpsg_ff($mwst['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
+					</td>
+				</tr>
+				<?php } ?>	
+				<tr class="wpsg_row_gesamt_brutto wpsg_row_small">
+					<td colspan="<?php echo $this->view['colspan']; ?>" class="wpsg_cell_summe_label">
+						<?php echo __('Gesamtpreis (Brutto)', 'wpsg'); ?>:
+					</td>
+					<td class="wpsg_cell_gesamt_value">
 						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
-					</div>
-				</div>
-			<?php } else { ?>
-
-				<div class="overview_sum_row">
-					<div class="title2">
-						<?php echo __('Gesamtpreis (Netto)', 'wpsg'); ?>:
-					</div>
-					<div class="sum">
-						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_netto'], $this->get_option('wpsg_currency')); ?>
-					</div>
-				</div>
-
-				<?php foreach ($this->view['basket']['mwst'] as $mwst) { ?>
-					<div class="overview_sum_row">
-						<div class="title2">
-							<?php echo wpsg_translate(__('zuzÃŒglich MwSt. (#1#)', 'wpsg'), __($mwst['name'], 'wpsg')); ?>:
-						</div>
-						<div class="value">
-							<?php echo wpsg_ff($mwst['sum']); ?> <?php echo $this->get_option('wpsg_currency'); ?>
-						</div>
-					</div>
-				<?php } ?>
-				<div class="wpsg_spacer"></div>
-				<div class="overview_sum_row">
-					<div class="title2">
-						<?php echo __('Gesamtpreis (Brutto)', 'wpsg'); ?>:
-					</div>
-					<div class="sum">
-						<?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
-					</div>
-				</div>
-				<div class="wpsg_spacer"></div>
-			<?php } ?>
-
-			<?php echo $this->callMod('wpsg_mod_gutschein', 'overview_row_end_coupon'); ?>
+					</td>
+				</tr>
+				<?php } ?>
+				
+				<?php $this->callMods('overview_row_end', array(&$this->view)); ?>
 			
-			<?php $this->callMods('overview_row_end', array(&$this->view)); ?>
+			</table>
 			
-			<div class="wpsg_spacer"></div>
-
-			<br />
-
-		</div>
-
 			<div class="wpsg_versandhinweis"><?php echo __('Sofern die Lieferung in das Nicht-EU-Ausland erfolgt, kÃ¶nnen weitere ZÃ¶lle, Steuern oder GebÃŒhren vom Kunden zu zahlen sein, jedoch nicht an den Anbieter, sondern an die dort zustÃ€ndigen Zoll- bzw. SteuerbehÃ¶rden. Dem Kunden wird empfohlen, die Einzelheiten vor der Bestellung bei den Zoll- bzw. SteuerbehÃ¶rden zu erfragen.', 'wpsg'); ?></div>
 		</div>
-
+		
 		<br />
-
+		
 		<?php if ($this->view['basket']['checkout']['comment'] != '') { ?>
 			<div class="subtitle">
@@ -501,21 +289,19 @@
 				<?php echo $this->view['basket']['checkout']['comment'] ?>
 			</div>
-		<?php }?>
-
-
+		<?php }?>				
+		
+				
 		<?php $this->callMods('overview_inner_prebutton', array(&$this->view)); ?>
-
-		<div class="wpsg_spacer"></div>
+				
 		<div class="wpsg_clear"></div>
-
-		<input type="submit" class="wpsg_checkoutbutton" value="<?php echo __('zurÃŒck', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
-
-        <?php if ($this->callMods('handle_order')) { ?>
-		<input type="submit" class="wpsg_orderbutton" value="<?php echo __('zahlungspflichtig bestellen', 'wpsg'); ?>" name="wpsg_order" />
-        <?php } ?>
-
+				
+		<br />
+				
+		<input type="submit" class="wpsg_button wpsg_checkoutbutton" value="<?php echo __('zurÃŒck', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
+		<input type="submit" class="wpsg_button wpsg_orderbutton" value="<?php echo __('zahlungspflichtig bestellen', 'wpsg'); ?>" name="wpsg_order" />
+		
 		<div class="wpsg_clear"></div>
-
-	</form>
+		
+	</form>		
 
 </div>
Index: /views/warenkorb/progress.phtml
===================================================================
--- /views/warenkorb/progress.phtml	(revision 8528)
+++ /views/warenkorb/progress.phtml	(revision 5261)
@@ -1,55 +1,60 @@
-<?php 
 
-	/**
-	 * Fortschrittsbalken
-	 */
-
-?>
-
-<div class="wpsg_progress <?php echo (($this->get_option('wpsg_mod_onepagecheckout') == '')?'':'only3steps'); ?>">
-      
-	<a href="<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET); ?>">      
+<div class="wpsg_progress">
+		
+	<a href="<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET); ?>">		
 		<span class="step step1 <?php echo (($GLOBALS['step'] === 1)?'current':'done'); ?>" title="<?php echo __('Hier gelangen Sie zum Warenkorb', 'wpsg'); ?>"><span class="dot"></span><span class="text"><?php echo __('Warenkorb', 'wpsg'); ?></span></span>
 	</a>
-        
-	<?php if ($this->get_option('wpsg_mod_onepagecheckout') == '') { ?>
-           
-	<?php if ($GLOBALS['step'] > 1) { ?><a href="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT); ?>"><?php } ?>
+	
+	<?php if ($GLOBALS['step'] > 1) { ?>
+	<a href=""><?php } ?>
 	<span class="step step2 <?php echo (($GLOBALS['step'] ===2)?'current':''); ?> <?php echo (($GLOBALS['step'] > 2)?'done':''); ?>" title="<?php echo __('Hier gelangen Sie zum Formular der Kundendaten', 'wpsg'); ?>">
 		<span class="dot"></span><span class="text"><?php echo __('Kundendaten', 'wpsg'); ?></span>
-	</span>            
-	<?php if ($GLOBALS['step'] > 1) { ?></a><?php } ?>
+	</span>
+	<?php if ($GLOBALS['step'] > 1) { ?>
+	</a><?php } ?>
 	
-	<?php if ($GLOBALS['step'] > 2) { ?><a href="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT2); ?>"><?php } ?>
+	<?php if ($GLOBALS['step'] > 2) { ?>
+	<a href=""><?php } ?>
 	<span class="step step3 <?php echo (($GLOBALS['step'] === 3)?'current':''); ?> <?php echo (($GLOBALS['step'] > 3)?'done':''); ?>" title="<?php echo __('Hier gelangen Sie zur Auswahl der Bezahlmethode und der Versandart', 'wpsg'); ?>">
-		<span class="dot"></span><span class="text"><?php echo __('Versand/Zahlung', 'wpsg'); ?></span>
-	</span>            
-	<?php if ($GLOBALS['step'] > 2) { ?></a><?php } ?>
-            
-	<?php if ($GLOBALS['step'] > 3) { ?><a href="<?php echo $this->getURL(wpsg_ShopController::URL_OVERVIEW); ?>"><?php } ?>
+		<span class="dot"></span><span class="text"><?php echo __('Zahlung / Versand', 'wpsg'); ?></span>
+	</span>
+	<?php if ($GLOBALS['step'] > 2) { ?>
+	</a><?php } ?>
+	
+	<?php if ($GLOBALS['step'] > 3) { ?>
+	<a href=""><?php } ?>
 	<span class="step step4 <?php echo (($GLOBALS['step'] === 4)?'current':''); ?> <?php echo (($GLOBALS['step'] > 4)?'done':''); ?>" title="<?php echo __('Hier gelangen Sie zum BestellÃŒbersicht', 'wpsg'); ?>">
-		<span class="dot"></span><span class="text"><?php echo __('Abschluss', 'wpsg'); ?></span>
+		<span class="dot"></span><span class="text"><?php echo __('AbschluÃ', 'wpsg'); ?></span>
 	</span>
-	<?php if ($GLOBALS['step'] > 3) { ?></a><?php } ?>
-   
-	<?php } else { ?>
-        	
-		<?php /* Onepagecheckout */ ?>
-		<?php if ($GLOBALS['step'] > 1) { ?><a href="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT); ?>"><?php } ?>
-		<span class="step step2 <?php echo (($GLOBALS['step'] ===2)?'current':''); ?> <?php echo (($GLOBALS['step'] > 2)?'done':''); ?>" title="<?php echo __('Hier gelangen Sie zum Formular der Kundendaten, Bezahlmethode und der Versandart', 'wpsg'); ?>">
-			<span class="dot"></span><span class="text"><?php echo __('Kundendaten / Zahlung  / Versand', 'wpsg'); ?></span>
-		</span>
-		<?php if ($GLOBALS['step'] > 1) { ?></a><?php } ?>
-	
-		<?php if ($GLOBALS['step'] > 2) { ?><a href=""><?php } ?>
-		<span class="step step3 <?php echo (($GLOBALS['step'] === 3)?'current':''); ?> <?php echo (($GLOBALS['step'] > 3)?'done':''); ?>" title="<?php echo __('Hier gelangen Sie zum BestellÃŒbersicht', 'wpsg'); ?>">
-			<span class="dot"></span><span class="text"><?php echo __('Abschluss', 'wpsg'); ?></span>
-		</span>
-		<?php if ($GLOBALS['step'] > 2) { ?></a><?php } ?>
-   
-	<?php } ?>
+	<?php if ($GLOBALS['step'] > 3) { ?>
+	</a><?php } ?>
 
 </div>
 
 <div class="wpsg_clear"></div>
+
+<?php /* ?>
+<div class="steps">
 	
+	<a class="step1 <?php echo (($GLOBALS['step'] === 1)?'current':''); ?>" href="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>" title="<?php echo __('Hier gelangen Sie zum Warenkorb', 'wpsg'); ?>"><span><?php echo __('Warenkorb', 'wpsg'); ?></span></a>
+	
+	<?php if ($GLOBALS['step'] > 1) { ?>
+	<a class="step2 <?php echo (($GLOBALS['step'] === 2)?'current':''); ?>" href="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT); ?>" title="<?php echo __('Hier gelangen Sie zum Formular der Kundendaten', 'wpsg'); ?>"><span><?php echo __('Kundendaten', 'wpsg'); ?></span></a>
+	<?php } else { ?>
+	<p class="step2"><span><?php echo __('Kundendaten','wpsg')?></span></p>		
+	<?php } ?>
+	
+	<?php if ($GLOBALS['step'] > 2) { ?>
+	<a class="step3 <?php echo (($GLOBALS['step'] === 3)?'current':''); ?>" href="<?php echo $this->getURL(wpsg_ShopController::URL_CHECKOUT2); ?>" title="<?php echo __('Hier gelangen Sie zur Auswahl der Bezahlmethode und der Versandart', 'wpsg'); ?>"><span><?php echo __('Bezahlung', 'wpsg'); ?></span></a>
+	<?php } else { ?>	
+	<p class="step3"><span><?php echo __('Bezahlung','wpsg')?></span></p>		
+	<?php } ?>
+	
+	<?php if ($GLOBALS['step'] > 3) { ?>
+	<a class="step4 <?php echo (($GLOBALS['step'] === 4)?'current':''); ?>" href="<?php echo $this->getURL(wpsg_ShopController::URL_OVERVIEW); ?>" title="<?php echo __('Hier gelangen Sie zum BestellÃŒbersicht', 'wpsg'); ?>"><span><?php echo __('Abschluss', 'wpsg'); ?></span></a>
+	<?php } else { ?>
+	<p class="step4"><span><?php echo __('Abschluss','wpsg')?></span></p>
+	<?php } ?>
+
+</div> */ ?>
+	
Index: /wpshopgermany.php
===================================================================
--- /wpshopgermany.php	(revision 8528)
+++ /wpshopgermany.php	(revision 5261)
@@ -11,21 +11,23 @@
 	Author URI: http://maennchen1.de/
 	*/
-
-    define('WPSG_VERSION', '9.9.9');
+ 
+	define('WPSG_VERSION', '9.9.9');
 
 	global $wpdb;
- 
-	if (defined('MULTISITE') && MULTISITE === true && get_site_option('wpsg_multiblog_standalone', true) != '1') {
+	
+	if (defined('MULTISITE') && MULTISITE === true && get_site_option('wpsg_multiblog_standalone', true) != '1') 
+	{
 		
 		$prefix = $wpdb->base_prefix;
 		
-	} else {
+	}
+	else 
+	{
 		
 		$prefix = $wpdb->prefix;
 		
 	}
-
+	
 	// Tabellen
-	define('WPSG_TBL_ADRESS', $prefix.'wpsg_adress');
 	define('WPSG_TBL_META', $prefix.'wpsg_meta');
 	define('WPSG_TBL_PRODUCTS', $prefix.'wpsg_products');
@@ -33,5 +35,4 @@
 	define('WPSG_TBL_MWST', $prefix.'wpsg_mwst'); // Deprecated ab 3.5 nur noch fÃŒr Migrationszwecke! 
 	define('WPSG_TBL_ORDER', $prefix.'wpsg_order');
-	define('WPSG_TBL_ORDER_VOUCHER', $prefix.'wpsg_order_voucher');
 	define('WPSG_TBL_ORDERPRODUCT', $prefix.'wpsg_order_products');
 	define('WPSG_TBL_KU', $prefix.'wpsg_kunden');
@@ -44,10 +45,7 @@
 	define('WPSG_TBL_VA', $prefix.'wpsg_versandarten');
 	define('WPSG_TBL_RECHNUNGEN', $prefix.'wpsg_rechnungen');
-	define('WPSG_TBL_ORDER_INVOICE', $prefix.'wpsg_order_invoice');
-	define('WPSG_TBL_INVOICE_ITEM', $prefix.'wpsg_invoice_item');
 	define('WPSG_TBL_GUTSCHEIN', $prefix.'wpsg_gutscheine');
  	define('WPSG_TBL_PRODUCTS_REL', $prefix.'wpsg_products_related');
-	define('WPSG_TBL_EXPORTPROFILE', $prefix.'wpsg_exportprofile');
-	define('WPSG_TBL_EXPORTPROFILE_FIELDS', $prefix.'wpsg_exportprofile_fields');
+ 	define('WPSG_TBL_EXPORTPROFILE', $prefix.'wpsg_exportprofile');
  	define('WPSG_TBL_PRODUCTS_VARS', $prefix.'wpsg_productvars');
  	define('WPSG_TBL_PRODUCTS_STICKY', $prefix.'wpsg_products_sticky');
@@ -55,6 +53,4 @@
  	define('WPSG_TBL_VIDEOINDIV', $prefix.'wpsg_videoindividualization');
 	define('WPSG_TBL_PDFINDIV', $prefix.'wpsg_pdfindividualization');
-	define('WPSG_TBL_DP_TEMPLATES', $prefix.'wpsg_dp_templates');
-	define('WPSG_TBL_DP_TEMPLATES_FIELD', $prefix.'wpsg_dp_templates_field');
 	define('WPSG_TBL_ORDERVARS', $prefix.'wpsg_ordervars');
  	define('WPSG_TBL_ORDERCOND', $prefix.'wpsg_orderconditions');
@@ -64,53 +60,13 @@
  	define('WPSG_TBL_SCALEPRICE', $prefix.'wpsg_scaleprice');
  	define('WPSG_TBL_DELIVERYNOTE', $prefix.'wpsg_deliverynote');
- 	 		
-	// WPML Tabellen
-	define('WPSG_TBL_WPML_ICL_STRINGS', $prefix.'icl_strings');
-	define('WPSG_TBL_WPML_ICL_STRING_PAGES', $prefix.'icl_string_pages');
-	define('WPSG_TBL_WPML_ICL_STRING_POSITIONS', $prefix.'icl_string_positions');
-	define('WPSG_TBL_WPML_ICL_STRING_TRANSLATIONS', $prefix.'icl_string_translations');
-
+		
 	// Slug
- 	define('WPSG_FOLDERNAME', basename(dirname(__FILE__)));
- 	define('WPSG_SLUG', WPSG_FOLDERNAME.'/wpshopgermany.php');
-	
- 	// EingabeÃŒberprÃŒfung
- 	define('WPSG_SANITIZE_INT', 0);
-	define('WPSG_SANITIZE_VALUES', 1);
-	define('WPSG_SANITIZE_CHECKBOX', 2); 
-	define('WPSG_SANITIZE_TEXTFIELD', 3);
-	define('WPSG_SANITIZE_APIKEY', 4);
-	define('WPSG_SANITIZE_FLOAT', 5);
-	define('WPSG_SANITIZE_TAXKEY', 6);
-	define('WPSG_SANITIZE_PATH', 7);
-	define('WPSG_SANITIZE_URL', 8);
-	define('WPSG_SANITIZE_TEXTAREA', 9);
-	define('WPSG_SANITIZE_EMAIL', 10);
-	define('WPSG_SANITIZE_HEXCOLOR', 11);
-	define('WPSG_SANITIZE_PAGEID', 12);
-	define('WPSG_SANITIZE_DATETIME', 13);
-	define('WPSG_SANITIZE_ARRAY_INT', 14);
-	define('WPSG_SANITIZE_HTML', 15);
- 	define('WPSG_SANITIZE_COSTKEY', 16);
-	define('WPSG_SANITIZE_NONE', 17);
- 	define('WPSG_SANITIZE_EMAILNAME', 18);
-	define('WPSG_SANITIZE_DATE', 19);
-	define('WPSG_SANITIZE_USTIDNR', 20);
-	define('WPSG_SANITIZE_ZIP', 21);
-	define('WPSG_SANITIZE_DOMAIN', 22);
-	define('WPSG_SANITIZE_ARRAY_LANG', 23);
-	define('WPSG_SANITIZE_ARRAY_FILENAME', 24);
-	define('WPSG_SANITIZE_ARRAY_TEXTFIELD', 25);
-	define('WPSG_SANITIZE_PAYMENT_KEY', 26);
-	define('WPSG_SANITIZE_SHIPPING_KEY', 27);
-	define('WPSG_SANITIZE_URL_LOCAL', 28);
-	define('WPSG_SANITIZE_PRODUCTKEY', 29);
-	define('WPSG_SANITIZE_DATE_EN', 30);
- 	
+	define('WPSG_SLUG', 'wpshopgermany/wpshopgermany.php');
+	
 	// Ist in Multiblog manchma nicht definiert :? Sonst ist hier das Verzeichnis drin
 	if (!defined('SITECOOKIEPATH')) define('SITECOOKIEPATH', '/');
 	
 	$wp_upload_dir = wp_upload_dir();
- 
+	
 	// Pfade
 	define('WPSG_PATH', dirname(__FILE__).'/');
@@ -121,6 +77,4 @@
 	define('WPSG_PATH_VIEW', dirname(__FILE__).'/views/');
 	define('WPSG_PATH_TEMPLATEVIEW', get_template_directory().'/wpsg_views/');
-	define('WPSG_PATH_TEMPLATEVIEW_CHILD', get_stylesheet_directory().'/wpsg_views/');
-
 	define('WPSG_PATH_USERVIEW', WPSG_PATH_UPLOADS.'user_views/');
 	define('WPSG_PATH_USERVIEW_OLD', WPSG_PATH.'user_views/');
@@ -131,8 +85,6 @@
 	define('WPSG_PATH_PRODUKTTEMPLATES_UV', WPSG_PATH_USERVIEW.'produkttemplates/');
 	define('WPSG_PATH_PRODUKTTEMPLATES_UV_OLD', WPSG_PATH_USERVIEW_OLD.'produkttemplates/');
-	define('WPSG_PATH_PRODUKTTEMPLATES_THEME', WPSG_PATH_TEMPLATEVIEW.'produkttemplates/');
-	define('WPSG_PATH_PRODUKTTEMPLATES_THEME_CHILD', WPSG_PATH_TEMPLATEVIEW_CHILD.'produkttemplates/');
-
-	define('WPSG_URL', plugins_url().'/'.WPSG_FOLDERNAME.'/');
+	define('WPSG_PATH_PRODUKTTEMPLATES_TV', WPSG_PATH_TEMPLATEVIEW.'produkttemplates/');
+	define('WPSG_URL', plugins_url().'/wpshopgermany/');	
 	define('WPSG_URL_WP', site_url().'/');
 	define('WPSG_URL_CONTENT', content_url().'/');
@@ -140,27 +92,17 @@
 	define('WPSG_URL_USERVIEW', $wp_upload_dir['baseurl'].'/wpsg/user_views/');
 	define('WPSG_PLUGIN_URL', plugins_url().'/');
-	define('WPSG_PATH_TRANSLATION', dirname(__FILE__).'/lib/translation.phtml');
-
-	# "WordPress allows users to change the name of wp-content" --> "wp-content" oder mÃ¶gliche, andere Formen
-	define('WPSG_CONTENTDIR_WP', substr(content_url(), -(strlen(content_url()) - strrpos(content_url(), "/")) + 1));
-
+	define('WPSG_PATH_TRANSLATION', dirname(__FILE__).'/lib/translation.phtml');	
+	          
 	// Konstanten
 	define('WPSG_BRUTTO', '0');
 	define('WPSG_NETTO', '1');
 	
-	// Wird fÃŒr die Sharif ÃberprÃŒfung im Produkttemplate eingebunden
-	if (!function_exists('is_plugin_active')) require_once(ABSPATH.'/wp-admin/includes/plugin.php');
-
 	require_once(dirname(__FILE__).'/lib/functions.inc.php');
 	require_once(dirname(__FILE__).'/lib/filter_functions.inc.php');
 	require_once(dirname(__FILE__).'/lib/helper_functions.inc.php');
 	require_once(dirname(__FILE__).'/lib/wpsg_db.class.php');
-	require_once(dirname(__FILE__).'/lib/wpsg_imagehandler.class.php');
 	require_once(dirname(__FILE__).'/lib/wpsg_cache.class.php');
-	require_once(dirname(__FILE__).'/lib/wpsg_basket.class.php');    
+	require_once(dirname(__FILE__).'/lib/wpsg_basket.class.php');
 	require_once(dirname(__FILE__).'/lib/wpsg_header.class.php');
-	require_once(dirname(__FILE__).'/lib/wpsg_remoteconnection.class.php');
-	require_once(dirname(__FILE__).'/lib/wpsg_exceptionhandler.class.php');
-	require_once(dirname(__FILE__).'/model/wpsg_exception.class.php');
 	require_once(dirname(__FILE__).'/model/wpsg_model.class.php');
 	require_once(dirname(__FILE__).'/model/wpsg_product.class.php');
@@ -171,7 +113,4 @@
 	require_once(dirname(__FILE__).'/model/wpsg_news.class.php');
 	require_once(dirname(__FILE__).'/mods/wpsg_mod_basic.class.php');
-    require_once(dirname(__FILE__).'/lib/wpsg_calculation.class.php');
-    require_once(dirname(__FILE__).'/services/service.class.php');
-    require_once(dirname(__FILE__).'/services/reminder.class.php');
 	require_once(dirname(__FILE__).'/controller/wpsg_SystemController.class.php');
 	require_once(dirname(__FILE__).'/controller/wpsg_ShopController.class.php');
@@ -180,54 +119,30 @@
 	require_once(dirname(__FILE__).'/controller/wpsg_BasketController.class.php');
 	require_once(dirname(__FILE__).'/controller/wpsg_OrderController.class.php');
-
-	//Mediathek Neues Bild macht Probleme TODO: KlÃ€ren ob das noch nÃ¶tig ist
-	if (basename($_SERVER['SCRIPT_FILENAME']) !== 'upload.php' && ($_REQUEST['action']??'') !== 'upload-attachment') $_GET['wpsg_quotecheck'] = '\"CHECK';
+		
+	$_GET['wpsg_quotecheck'] = '\"CHECK';
 	
 	/** @var wpsg_db */
 	$GLOBALS['wpsg_db'] = new wpsg_db();
 
-	/** @var wpsg_imagehandler */
-	$GLOBALS['wpsg_ih'] = new wpsg_imagehandler();
- 
 	/** @var wpsg_ShopController */
-	$shop = new wpsg_ShopController();	
-
-	// Nicht behandelte Exceptions werden hier verarbeitet
-	set_exception_handler(array('\\wpsg\\exceptionhandler', 'exception'));
-
-	spl_autoload_register(function($class) {
-
-	    $arClass = explode('\\', $class);
-
-	    if ($arClass[0] === 'wpsg') {
-
-	        require_once __DIR__.DIRECTORY_SEPARATOR.'classes/'.implode('/', array_slice($arClass, 1)).'.class.php';
-
-        }
-
-    });
-
-    if ($shop->isMultiBlog() && !is_admin() && $shop->get_option('wpsg_multiblog_sessionPath', true) == '1') {
-
-        global $current_blog;
-
-        session_set_cookie_params(0, $current_blog->path);
-
-    }
-	
-	if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
-	 
-		session_set_cookie_params([
-			'secure' => true
-		]);
-		
-	}
+	$GLOBALS['wpsg_sc'] = new wpsg_ShopController();
+			
+	if ($GLOBALS['wpsg_sc']->isMultiBlog() && !is_admin() && $GLOBALS['wpsg_sc']->get_option('wpsg_multiblog_sessionPath', true) == '1')
+	{
+		
+		global $current_blog; 
+		 
+		session_set_cookie_params(0, $current_blog->path);
+				
+	}
+	
+	if (!session_id()) { session_start(); }
 
 	// UPLOADS Dir fÃŒr MultiblogunterstÃŒtzung
 	global $current_blog;
-
-	if ($shop->isMultiBlog()) {
-	
-		$path = $shop->get_option('wpsg_path_upload_multiblog', true);
+	if ($GLOBALS['wpsg_sc']->isMultiBlog())
+	{
+	
+		$path = $GLOBALS['wpsg_sc']->get_option('wpsg_path_upload_multiblog', true);
 		$path = preg_replace('/%blog_id%/', $current_blog->blog_id, $path);
 	
@@ -235,71 +150,68 @@
 	
 	}
-
-	//Wird jetzt im init Hook aufgerufen
-	//$shop->initShop($prefix);
-    $shop->prefix = $prefix;
-
+	
+	$GLOBALS['wpsg_sc']->initShop($prefix);
+	 
 	// Standardrollen fÃŒr die Rechteverteilung 
 	$role_object = get_role('administrator');
-    
-    if (is_object($role_object)) {
-    
-        $role_object->add_cap('wpsg_menu');
-        $role_object->add_cap('wpsg_conf');
-        $role_object->add_cap('wpsg_order');
-        $role_object->add_cap('wpsg_produkt');
-        $role_object->add_cap('wpsg_lizence');
-    }
-
-    register_activation_hook(__FILE__, 'wpsg_install');
+	$role_object->add_cap('wpsg_menu');
+	$role_object->add_cap('wpsg_conf');
+	$role_object->add_cap('wpsg_order');
+	$role_object->add_cap('wpsg_produkt');
+	$role_object->add_cap('wpsg_lizence');
+		  
+	register_activation_hook(__FILE__, 'wpsg_install');
 	register_deactivation_hook(__FILE__, 'wpsg_uninstall');
-
+	
 	add_action('admin_menu', 'wpsg_add_pages');	
 	add_action('phpmailer_init', 'wpsg_phpmailer_init');
 	add_action('shutdown', 'wpsg_shutdown');
-	add_action('wp_loaded', array($shop, 'wp_load'));
-    add_action('admin_bar_menu', 'wpsg_admin_bar_menu', 2000);
-    add_action('enqueue_block_editor_assets', ['\wpsg\Action', 'enqueue_block_editor_assets']);
-    add_action('wpsg_hourly_hook', ['\wpsg\Action', 'wpsg_hourly_hook']);
-
+	add_action('wp_loaded', array($GLOBALS['wpsg_sc'], 'wp_load'));
+	
 	add_filter('upgrader_pre_install', 'wpsg_pre_install', 10, 2);
-	add_filter('upgrader_post_install', 'wpsg_post_install', 10, 3);
-
-	if (is_admin()) {
-
-		add_filter('plugins_api', 'wpsg_info', 10, 3);
-		add_filter('site_transient_update_plugins', 'wpsg_update');
-		
-		add_action('admin_enqueue_scripts', array($shop, 'wp_enqueue'));
+	add_filter('upgrader_post_install', 'wpsg_post_install', 10, 2);
+	
+	if (is_admin())
+	{
+				
+		if ($GLOBALS['wpsg_sc']->hasMod('wpsg_mod_core')) 
+		{
+		
+			add_filter('plugins_api', 'wpsg_info', 10, 3);
+			add_filter('site_transient_update_plugins', 'wpsg_update');
+			
+		}
+		
+		add_action('admin_enqueue_scripts', array($GLOBALS['wpsg_sc'], 'wp_enqueue'));
 		add_action('admin_init', 'wpsg_admin_init');
 		add_action('admin_footer', 'wpsg_admin_footer');
-        add_action('in_plugin_update_message-wpshopgermany/wpshopgermany.php', 'wpsg_updateNotification', 10, 2);
-        add_action('admin_notices', 'wpsg_admin_notices');
-
-	} else {
-
-		add_shortcode('wpshopgermany', array($shop, 'shortcode'));
-		add_shortcode('wpshopgermany_link', array($shop, 'shortcode_basket'));
-		
-		add_filter('the_title', array($shop, 'the_title'), 10, 2);
-		add_filter('the_content', array($shop, 'content_filter'));	
-		add_filter('the_excerpt', array($shop, 'the_excerpt'));	 
-		add_filter('pre_get_posts', array($shop, 'pre_get_posts'));
-
-		add_action('wp_enqueue_scripts', array($shop, 'wp_enqueue'));
-		add_action('wp_head', array($shop, 'wp_head'));
-		add_action('wp_footer', array($shop, 'wp_foot'));
-		add_action('template_redirect', array($shop, 'template_redirect'));
-					
-		if ($shop->get_option('wpsg_removeWpTrimExcerpt') == '1') remove_filter('get_the_excerpt', 'wp_trim_excerpt');
-    	if ($shop->get_option('wpsg_removeWpAutoOp') == '1') remove_filter('the_content', 'wpautop');
-
-	}
-
-    if (!wp_next_scheduled('wpsg_daily_hook')) wp_schedule_event(time(), 'daily', 'wpsg_daily_hook');
-
-	add_action('init', [$shop, 'init'], 10, 1);
-	add_action('widgets_init', array($shop, 'widgets_init'));
-    add_action('wpsg_daily_hook', [$shop, 'wpsg_daily_hook']);
-
-    add_action('send_headers', [$shop, 'send_headers'], 0);
+				
+	} 
+	else
+	{
+		
+		add_shortcode('wpshopgermany', array($GLOBALS['wpsg_sc'], 'shortcode'));
+		
+		add_filter('the_title', array($GLOBALS['wpsg_sc'], 'the_filter'), 10, 2);
+		add_filter('the_content', array($GLOBALS['wpsg_sc'], 'content_filter'));	
+		add_filter('the_excerpt', array($GLOBALS['wpsg_sc'], 'the_excerpt'));	 
+		add_filter('pre_get_posts', array($GLOBALS['wpsg_sc'], 'pre_get_posts'));
+				
+		add_action('wp_enqueue_scripts', array($GLOBALS['wpsg_sc'], 'wp_enqueue'));
+		add_action('wp_head', array($GLOBALS['wpsg_sc'], 'wp_head'));
+		add_action('wp_footer', array($GLOBALS['wpsg_sc'], 'wp_foot'));
+		add_action('template_redirect', array($GLOBALS['wpsg_sc'], 'template_redirect'));
+		
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_debugModus') == '1') add_action('admin_bar_menu', 'wpsg_admin_bar_menu', 2000);
+								
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_removeWpTrimExcerpt') == '1') remove_filter('get_the_excerpt', 'wp_trim_excerpt');
+		if ($GLOBALS['wpsg_sc']->get_option('wpsg_removeWpAutoOp') == '1') remove_filter('the_content', 'wpautop');
+		
+	}
+
+	add_action('widgets_init', array($GLOBALS['wpsg_sc'], 'widget_init'));
+	//add_action('widgets_init', create_function('', 'return register_widget("wpsg_basket_widget");'));
+	
+	$GLOBALS['wpsg_sc']->callMods('load', array());
+	
+?>
